hotstaq 0.8.112 → 0.8.113
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/src/HotDBConnectionInterface.d.ts +22 -0
- package/build/src/HotDBConnectionInterface.d.ts.map +1 -1
- package/build/src/HotStaq.js +1 -1
- package/build/src/schemas/HotDBInflux.d.ts.map +1 -1
- package/build/src/schemas/HotDBInflux.js +2 -0
- package/build/src/schemas/HotDBInflux.js.map +1 -1
- package/build/src/schemas/HotDBMySQL.d.ts.map +1 -1
- package/build/src/schemas/HotDBMySQL.js +16 -2
- package/build/src/schemas/HotDBMySQL.js.map +1 -1
- package/build/src/schemas/HotDBPostgres.d.ts.map +1 -1
- package/build/src/schemas/HotDBPostgres.js +16 -2
- package/build/src/schemas/HotDBPostgres.js.map +1 -1
- package/build-web/HotStaq.js +2 -2
- package/build-web/HotStaq.min.js +1 -1
- package/package.json +1 -1
- package/src/HotDBConnectionInterface.ts +23 -1
- package/src/HotStaq.ts +1 -1
- package/src/schemas/HotDBInflux.ts +3 -0
- package/src/schemas/HotDBMySQL.ts +21 -1
- package/src/schemas/HotDBPostgres.ts +21 -1
package/build-web/HotStaq.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var HotStaqWeb;(()=>{var __webpack_modules__={7833:(t,e,n)=>{e.formatArgs=function(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+t.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;e.splice(1,0,n,"color: inherit");let r=0,o=0;e[0].replace(/%[a-zA-Z%]/g,(t=>{"%%"!==t&&(r++,"%c"===t&&(o=r))})),e.splice(o,0,n)},e.save=function(t){try{t?e.storage.setItem("debug",t):e.storage.removeItem("debug")}catch(t){}},e.load=function(){let t;try{t=e.storage.getItem("debug")}catch(t){}return!t&&"undefined"!=typeof process&&"env"in process&&(t=process.env.DEBUG),t},e.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},e.storage=function(){try{return localStorage}catch(t){}}(),e.destroy=(()=>{let t=!1;return()=>{t||(t=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),e.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],e.log=console.debug||console.log||(()=>{}),t.exports=n(736)(e);const{formatters:r}=t.exports;r.j=function(t){try{return JSON.stringify(t)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}}},736:(t,e,n)=>{t.exports=function(t){function e(t){let n,o,s,i=null;function a(...t){if(!a.enabled)return;const r=a,o=Number(new Date),s=o-(n||o);r.diff=s,r.prev=n,r.curr=o,n=o,t[0]=e.coerce(t[0]),"string"!=typeof t[0]&&t.unshift("%O");let i=0;t[0]=t[0].replace(/%([a-zA-Z%])/g,((n,o)=>{if("%%"===n)return"%";i++;const s=e.formatters[o];if("function"==typeof s){const e=t[i];n=s.call(r,e),t.splice(i,1),i--}return n})),e.formatArgs.call(r,t),(r.log||e.log).apply(r,t)}return a.namespace=t,a.useColors=e.useColors(),a.color=e.selectColor(t),a.extend=r,a.destroy=e.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==i?i:(o!==e.namespaces&&(o=e.namespaces,s=e.enabled(t)),s),set:t=>{i=t}}),"function"==typeof e.init&&e.init(a),a}function r(t,n){const r=e(this.namespace+(void 0===n?":":n)+t);return r.log=this.log,r}function o(t){return t.toString().substring(2,t.toString().length-2).replace(/\.\*\?$/,"*")}return e.debug=e,e.default=e,e.coerce=function(t){return t instanceof Error?t.stack||t.message:t},e.disable=function(){const t=[...e.names.map(o),...e.skips.map(o).map((t=>"-"+t))].join(",");return e.enable(""),t},e.enable=function(t){let n;e.save(t),e.namespaces=t,e.names=[],e.skips=[];const r=("string"==typeof t?t:"").split(/[\s,]+/),o=r.length;for(n=0;n<o;n++)r[n]&&("-"===(t=r[n].replace(/\*/g,".*?"))[0]?e.skips.push(new RegExp("^"+t.slice(1)+"$")):e.names.push(new RegExp("^"+t+"$")))},e.enabled=function(t){if("*"===t[t.length-1])return!0;let n,r;for(n=0,r=e.skips.length;n<r;n++)if(e.skips[n].test(t))return!1;for(n=0,r=e.names.length;n<r;n++)if(e.names[n].test(t))return!0;return!1},e.humanize=n(6585),e.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(t).forEach((n=>{e[n]=t[n]})),e.names=[],e.skips=[],e.formatters={},e.selectColor=function(t){let n=0;for(let e=0;e<t.length;e++)n=(n<<5)-n+t.charCodeAt(e),n|=0;return e.colors[Math.abs(n)%e.colors.length]},e.enable(e.load()),e}},2733:function(t){t.exports=function(){"use strict";function t(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}return function e(n,r){function o(e,o,s){if("undefined"!=typeof document){"number"==typeof(s=t({},r,s)).expires&&(s.expires=new Date(Date.now()+864e5*s.expires)),s.expires&&(s.expires=s.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var i="";for(var a in s)s[a]&&(i+="; "+a,!0!==s[a]&&(i+="="+s[a].split(";")[0]));return document.cookie=e+"="+n.write(o,e)+i}}return Object.create({set:o,get:function(t){if("undefined"!=typeof document&&(!arguments.length||t)){for(var e=document.cookie?document.cookie.split("; "):[],r={},o=0;o<e.length;o++){var s=e[o].split("="),i=s.slice(1).join("=");try{var a=decodeURIComponent(s[0]);if(r[a]=n.read(i,a),t===a)break}catch(t){}}return t?r[t]:r}},remove:function(e,n){o(e,"",t({},n,{expires:-1}))},withAttributes:function(n){return e(this.converter,t({},this.attributes,n))},withConverter:function(n){return e(t({},this.converter,n),this.attributes)}},{attributes:{value:Object.freeze(r)},converter:{value:Object.freeze(n)}})}({read:function(t){return'"'===t[0]&&(t=t.slice(1,-1)),t.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(t){return encodeURIComponent(t).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"})}()},6585:t=>{var e=1e3,n=60*e,r=60*n,o=24*r,s=7*o;function i(t,e,n,r){var o=e>=1.5*n;return Math.round(t/n)+" "+r+(o?"s":"")}t.exports=function(t,a){a=a||{};var l,c,u=typeof t;if("string"===u&&t.length>0)return function(t){if(!((t=String(t)).length>100)){var i=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(i){var a=parseFloat(i[1]);switch((i[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*a;case"weeks":case"week":case"w":return a*s;case"days":case"day":case"d":return a*o;case"hours":case"hour":case"hrs":case"hr":case"h":return a*r;case"minutes":case"minute":case"mins":case"min":case"m":return a*n;case"seconds":case"second":case"secs":case"sec":case"s":return a*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return a;default:return}}}}(t);if("number"===u&&isFinite(t))return a.long?(l=t,(c=Math.abs(l))>=o?i(l,c,o,"day"):c>=r?i(l,c,r,"hour"):c>=n?i(l,c,n,"minute"):c>=e?i(l,c,e,"second"):l+" ms"):function(t){var s=Math.abs(t);return s>=o?Math.round(t/o)+"d":s>=r?Math.round(t/r)+"h":s>=n?Math.round(t/n)+"m":s>=e?Math.round(t/e)+"s":t+"ms"}(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))}},1814:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Hot=e.DeveloperMode=void 0;const s=n(8296),i=n(9343),a=n(1284),l=n(9844),c=o(n(2733)),u=o(n(2365)),h=o(n(8241));var p;!function(t){t[t.Production=0]="Production",t[t.Development=1]="Development"}(p=e.DeveloperMode||(e.DeveloperMode={}));class d{static getUrlParam(t,e){const n=new URLSearchParams(window.location.search).get(t);if(null==n)return null;if("string"==typeof e){switch(e){case"int":return parseInt(n);case"float":return parseFloat(n);case"email":if(!0===new RegExp("^\\S+@\\S+\\.\\S+$").test(n))return n;break;case"phone":if(!0===new RegExp("^\\+?([0-9 ]?){6,14}[0-9]$").test(n))return n;break;case"uuid":if(!0===new RegExp("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}").test(n))return n;break;default:if(e.indexOf("string")>-1){const t=parseInt(e.split("(")[1].split(")")[0]);if(n.length===t)return n}}throw new Error(`getUrlParam retreiving parameter "${t}" using validation type "${e}" failed.`)}return e(n)}static include(t,e=null){return r(this,void 0,void 0,(function*(){if(!0===i.HotStaq.isWeb&&"string"==typeof t){const e=t.toLowerCase();e.indexOf(".hott")>-1&&e.indexOf("nahfam")<0&&(t+="?hstqserve=nahfam")}d.echo(yield d.getFile(t,e))}))}static includeJS(t,e=null,o=null){return r(this,void 0,void 0,(function*(){const r=yield d.getFile(t);return!0===i.HotStaq.isWeb?null==o&&(o=window):null==o&&(o=n.g),new Function(r).apply(o,e)}))}static import(t,e=null,o=null){return r(this,void 0,void 0,(function*(){let r=d.CurrentPage.processor.getModule(t);if(null!=r)return r;const s=`./hotstaq_modules/${t}/index.js`,a=yield d.getFile(s,e);!0===i.HotStaq.isWeb?null==o&&(o=window):null==o&&(o=n.g);let l=new Function(a).apply(o);return null!=l.loadHTML&&(yield l.loadHTML()),d.CurrentPage.processor.addModule(t,l),l}))}static runFile(t,e=null){return r(this,void 0,void 0,(function*(){let n=d.CurrentPage.processor.getFile(t);n.page=this.CurrentPage;let r=yield n.process(e);d.echo(r)}))}static getFile(t,e=null){return r(this,void 0,void 0,(function*(){let n=null;"string"==typeof t?(n=new s.HotFile,n.name=t,!0===i.HotStaq.isWeb?n.url=t:n.localFile=t):n=t;let r=d.CurrentPage.processor.getFile(n.name,!1);return null!=r&&(n=r),yield n.load(),n.page=this.CurrentPage,yield n.process(e)}))}static apiCall(t,e=null,n=l.HotEventMethod.POST,o={},s=""){return r(this,void 0,void 0,(function*(){let r=null;if(null==d.CurrentPage)throw new Error("Current page is null!");if(null==d.CurrentPage.processor)throw new Error("Current page's processor is null!");if(null==d.CurrentPage.processor.api)throw new Error("Current page's processor api is null! Did you forget to set the API name or URL?");return null!=d.CurrentPage.processor.api&&(r=yield d.CurrentPage.processor.api.makeCall(t,e,n,o,s)),r}))}static getJSON(t,e=""){return r(this,void 0,void 0,(function*(){return d.jsonRequest(t,null,e,l.HotEventMethod.GET)}))}static jsonRequest(t,e=null,n="",o=l.HotEventMethod.POST){return r(this,void 0,void 0,(function*(){try{let r={method:o,headers:{Accept:"application/json","Content-Type":"application/json"}};o!==l.HotEventMethod.GET&&(r.body=JSON.stringify(e)),""!=n&&(r.headers.Authorization=`Bearer ${n}`);let s=yield(0,u.default)(t,r);if(!1===s.ok)throw new Error(`${s.status}: ${s.statusText}`);return yield s.json()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}static httpRequest(t,e,n=l.HotEventMethod.POST,o={},s=""){return r(this,void 0,void 0,(function*(){const i=Object.keys(o).length;let a=n.toLowerCase();n===l.HotEventMethod.FILE_UPLOAD&&(a="post");let c=!1;const p=new h.default;if(i>0){if("post"!==a)throw new Error("To upload files, you must set the httpMethod to POST.");for(let t in o){const e=o[t];null!=e&&(p.append(t,e),c=!0)}}if(!0===c){let n={method:"POST",headers:{HotStaqUpload:"true"},body:p};""!=s&&(n.headers={Authorization:`Bearer ${s}`});let r=yield(0,u.default)(t,n),o=yield r.json();return null==e.hotstaq&&(e.hotstaq={}),null==e.hotstaq.uploads&&(e.hotstaq.uploads={}),e.hotstaq.uploads.uploadId=o.hotstaq.uploads.uploadId,yield d.httpRequest(t,e,l.HotEventMethod.POST,{},s)}let f={method:a,headers:{Accept:"application/json","Content-Type":"application/json"}};return""!=s&&(f.headers.Authorization=`Bearer ${s}`),"get"!==a&&"head"!==a&&(f.body=JSON.stringify(e)),new Promise(((e,n)=>{(0,u.default)(t,f).then((n=>r(this,void 0,void 0,(function*(){n.json().then((t=>{e(t)})).catch((e=>{throw new Error(`${t}: ${e.message}`)}))})))).catch((e=>{throw new Error(`${t}: ${e.message}`)}))}))}))}static echo(t){d.Output+=t}static displayCSS(){for(let t=0;t<d.CSS.length;t++){let e=d.CSS[t],n=d.cssStr;n=n.replace(/\%CSS_FILE\%/g,e),d.echo(n)}}static displayJSFiles(){for(let t=0;t<d.JSFiles.length;t++){let e=d.JSFiles[t],n=d.jsFileStr;n=n.replace(/\%JS_FILE\%/g,e),d.echo(n)}}static displayJSScripts(){for(let t=0;t<d.JSScripts.length;t++){let e=d.JSScripts[t],n=d.jsScriptsStr;n=n.replace(/\%JS_CODE\%/g,e),d.echo(n)}}}e.Hot=d,d.CurrentPage=null,d.Arguments=null,d.DeveloperMode=p,d.HotTestElement=a.HotTestElement,d.Mode=p.Production,d.API=null,d.TesterAPI=null,d.Output="",d.Data={},d.Cookies=c.default,d.PublicKeys={},d.cssStr='<link rel = "stylesheet" href = "%CSS_FILE%" />',d.CSS=[],d.JSFiles=[],d.JSScripts=[],d.jsFileStr='<script type = "text/javascript" src = "%JS_FILE%"><\/script>',d.jsScriptsStr='<script type = "text/javascript">%JS_CODE%<\/script>'},6044:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotAPI=e.EventExecutionType=void 0;const o=n(3205),s=n(7605),i=n(9844),a=n(1814);var l;!function(t){t[t.HotRoute=0]="HotRoute",t[t.HotMethod=1]="HotMethod",t[t.HotAPI=2]="HotAPI"}(l=e.EventExecutionType||(e.EventExecutionType={})),e.HotAPI=class{constructor(t,e,n=null){if(null==e)throw new Error(`No server attached to api with baseUrl: ${t}`);this.connection=e,this.description="",this.bearerToken="",this.baseUrl=t,this.createFunctions=!0,this.executeEventsUsing=l.HotRoute,this.db=n,this.openAPI={},this.userAuth=null,this.routes={},this.onPreRegister=null,this.onPostRegister=null}setDBSchema(t){if(null==this.connection.api)throw new Error("No API has been set!");if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);this.connection.api.db.schema=t}getDB(){if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);return this.connection.api.db}getDBSchema(){if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);return this.connection.api.db.schema}addRoute(t,e=null,n=null){let r="";"string"==typeof t?(r=t,null==this.routes[r]&&(this.routes[r]=new s.HotRoute(this.connection,r)),"string"==typeof e?this.routes[r].addMethod(i.HotRouteMethod.create(this.routes[r],e,n)):this.routes[r].addMethod(e)):(r=t.route,this.routes[t.route]=t),this.routes[r].connection=this.connection,!0===this.createFunctions&&this.createAPIRouteMethods(r)}createAPIRouteMethods(t){let e=this[t];null==e&&(e={});for(let n=0;n<this.routes[t].methods.length;n++){this.routes[t];let r=this.routes[t].methods[n];e[r.name]=(t,e)=>{let n=r.type,o=[r.getRouteUrl(),t,n,e,this.bearerToken];return this.makeCall.apply(this,o)}}this[t]=e}registerRoute(t){return r(this,void 0,void 0,(function*(){this.connection instanceof o.HotServer&&(yield this.connection.registerRoute(t))}))}registerRoutes(){return r(this,void 0,void 0,(function*(){for(let t in this.routes){let e=this.routes[t];yield this.registerRoute(e)}}))}makeCall(t,e,n=i.HotEventMethod.POST,o={},s=""){return r(this,void 0,void 0,(function*(){let r=this.baseUrl;return n.toUpperCase(),"/"===r[r.length-1]&&(r=r.substr(0,r.length-1)),"/"!==t[0]&&(r+="/"),r+=t,a.Hot.httpRequest(r,e,n,o,s)}))}}},5472:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotAsset=void 0,e.HotAsset=class{constructor(t,e=""){this.type=t,this.name=e,this.path="",this.content=""}load(){}output(){if(null==this.path&&null==this.content)throw new Error(`HotAsset ${this.name} of type ${this.type} does not have a path or content set!`);let t="";if(null!=this.path&&""!==this.path&&("js"===this.type&&(t=`<script type = "text/javascript" src = "${this.path}"><\/script>`),"css"===this.type&&(t=`<link href = "${this.path}" rel = "stylesheet" />`),"html"===this.type||"component"===this.type)){if(""===this.name)throw new Error("Loading an HTML or component asset requires a name to be set!");this.path,t={name:this.name,url:this.path}}if(null!=this.content&&""!==this.content){if("js"===this.type)throw new Error("Loading JS assets using content is not supported yet!");if("css"===this.type)throw new Error("Loading CSS assets using content is not supported yet!");if("html"===this.type){if(""===this.name)throw new Error("Loading an HTML asset requires a name to be set!");let e=JSON.stringify(this.content),n=this.path,r="";e=e.replace(new RegExp("\\<script","gmi"),'<scr" + "ipt'),e=e.replace(new RegExp("\\<\\/script","gmi"),'</scr" + "ipt'),r=e,t={name:this.name,url:n,content:e}}}return t}}},3025:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotClient=void 0;const r=n(3205);e.HotClient=class{constructor(t){this.processor=t,this.api=null,this.testerAPI=null,this.type=r.HotServerType.HTTP,this.logger=t.logger}}},3299:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotComponent=void 0;const r=n(9343);e.HotComponent=class{constructor(t,e=null){t instanceof r.HotStaq||null==t?(this.processor=t,this.htmlElements=[],this.name="",this.tag="",this.api=null,this.elementOptions=void 0,this.observedAttributes=[],this.type="",this.value=null,this.inner=null,this.events={}):(this.processor=t.processor,this.htmlElements=t.htmlElements||[],this.name=t.name||"",this.tag=t.tag||this.name,this.api=t.api||null,this.elementOptions=t.elementOptions||void 0,this.observedAttributes=t.observedAttributes||[],this.type=t.type||"",this.value=t.value||null,this.inner=t.inner||null,this.events={}),null!=e&&(this.api=e)}onCreated(t){return t}}},9164:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0})},8296:function(t,e,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&r(e,t,n);return o(e,t),e},i=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))},a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotFile=void 0;const l=s(n(1603)),c=a(n(2365)),u=n(1814);class h{constructor(t={}){this.page=t.page||null,this.name=t.name||"",this.url=t.url||"",this.localFile=t.localFile||"",this.content=t.content||"",this.throwAllErrors=t.throwAllErrors||!1}setContent(t){this.content=t}getContent(){return this.content}static httpGet(t){return i(this,void 0,void 0,(function*(){try{let e=yield(0,c.default)(t);if(!1===e.ok)throw new Error(`${e.status}: ${e.statusText}`);return yield e.text()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}loadUrl(){return i(this,void 0,void 0,(function*(){return this.content=yield h.httpGet(this.url),this.content}))}loadLocalFile(){return i(this,void 0,void 0,(function*(){return new Promise(((t,e)=>{l.readFile(this.localFile,((e,n)=>{if(null!=e)throw e;let r=n.toString();this.content=r,t(this.content)}))}))}))}load(){return i(this,void 0,void 0,(function*(){let t="";return""!==this.url&&(t=yield this.loadUrl()),""!==this.localFile&&(t=yield this.loadLocalFile()),t}))}static processContent(t,e,n,r,o=2,s=2){let i=e.exec(t),a=0,l="";for(;null!=i;){let c=i.index-o,u=e.lastIndex+s,h=t.substr(a,c-a);a=u,l+=r(h),l+=n(i[0]),i=e.exec(t)}return l+=r(t.substr(a)),l}static processNestedContent(t,e,n,r,o,s,i=2,a=1){let l=t.indexOf(e),c=0,u=t.indexOf(r,l),h="";for(;l>-1;){let p=t.indexOf(n,l),d=0;if(""!==r){let e=t.lastIndexOf(r,p-a);for(;e>-1&&e!==u;)e=t.lastIndexOf(r,e-a),d++}if(d>0){let r=t.indexOf(n,p+a),o=r;for(;r>-1&&d>0&&!(o<0)&&!(t.lastIndexOf(e,o-a)>r);)r=o,o=t.indexOf(n,r+a),d--;p=r}h+=s(t.substr(c,l-c)),h+=o(t.substr(l+i,p-(l+i)),l,p),l=t.indexOf(e,p+a),u=t.indexOf(r,l),c=p+a}return h+=s(t.substr(c)),h}static parseFunction(t,e,n){let r=t.indexOf("<(");for(;r>-1;){const o=t.indexOf(")",r),s=t.indexOf("=>",o),i=t.indexOf("{",s);let a=o;if(-1!==r&&-1!==o&&-1!==s&&-1!==i){let l=["}>","}A>","}a>","}R>","}RA>","}Ra>"],c=-1,u=null;for(let e=0;e<l.length;e++){let n=l[e],r=t.indexOf(n,s);r>-1&&(-1==c||r<c)&&(c=r,u=n)}if(c>-1){const s=t.slice(r+2,o).trim().split(",").map((t=>t.trim())),l=t.slice(i+1,c).trim();e(s);let h=n(l,u);t=t.slice(0,r)+h+t.slice(c+u.length),a=c}}r=t.indexOf("<(",a)}return t}static parseContent(t,e,n=null){null==n&&(n={outputCommands:!0,allowStringify:!0});let r="JSON.stringify (",o=")";return!1===n.allowStringify&&(r="",o=""),h.processContent(t,new RegExp("(?=\\<\\*)([\\s\\S]*?)(?=\\*\\>)","g"),(t=>`${t=t.substr(2)}`),(t=>{if(""===t)return"";let s=h.processNestedContent(t,"!{","}","{",((t,e,n)=>`*&&%*%@#@!${t}*&!#%@!@*!`),(t=>t)),i=h.processNestedContent(s,"STR{","}","{",((t,s,i)=>{let a="";return a=!0===n.outputCommands?`*&&%*%@#@!echoOutput (JSON.stringify(${t}), ${e});*&!#%@!@*!`:`*&&%*%@#@!${r}${t}${o}, ${e});*&!#%@!@*!`,a}),(t=>t),4,1),a="",l=h.parseFunction(i,(t=>{a=JSON.stringify(t)}),((t,e)=>{const n=t.replace(/\`/g,"\\`");let r="Hot.CurrentPage.callFunction",o="false";"}A>"===e&&(r="await Hot.CurrentPage.callAsyncFunction",o="true"),"}a>"===e&&(r="Hot.CurrentPage.callAsyncFunction",o="true"),"}R>"===e&&(r="return Hot.CurrentPage.callFunction"),"}RA>"===e&&(r="return await Hot.CurrentPage.callAsyncFunction",o="true"),"}Ra>"===e&&(r="return Hot.CurrentPage.callAsyncFunction",o="true");let s=`*&&%*%@#@!{\nconst newFuncName = createFunction (null, ${a}, \`${n}\`, ${o});\nHot.echo (\`${r} (this, '\${newFuncName}', arguments);\`);\n}*&!#%@!@*!`;return s=s.replace(/\$\{/g,"${&&!*#!!"),s})),c=h.processNestedContent(l,"${","}","{",((t,r,o)=>{let s="",i=n.outputCommands;if(t.indexOf("&&!*#!!")>-1){const e=t.replace(/&&\!\*\#\!\!/g,"");return`\${(typeof (${e}) !== "undefined") ? ${e} : "\${${e}}"}`}var a;return!0===i?(s=`*&&%*%@#@!try { Hot.echo (${t}); }catch (ex){Hot.echo (\`\\\${${a=t,a.replace(/[`]/g,"\\`")}}\`);}*&!#%@!@*!`,!0===e&&(s=`*&&%*%@#@!Hot.echo (${t});*&!#%@!@*!`)):s=`*&&%*%@#@!${t}*&!#%@!@*!`,s}),(t=>t)),p="";u.Hot.Mode===u.DeveloperMode.Production&&(p=h.processNestedContent(c,"?(",")","(",((t,e,n)=>""),(t=>t))),u.Hot.Mode===u.DeveloperMode.Development&&(p=h.processNestedContent(c,"?(",")","(",((t,e,r)=>{let o="";try{JSON.parse(t),o=!0===n.allowStringify?JSON.stringify(t):`${t}`}catch(e){o=`${t}`}let s="";if(!0===n.outputCommands)s=`*&&%*%@#@!{\nconst testElm = createTestElement (${o});\nHot.echo (\`data-test-object-name = "\${testElm.name}" data-test-object-func = "\${testElm.func}" data-test-object-value = "\${testElm.value}"\`);\n}*&!#%@!@*!\n`;else{let t=t=>{let e=null;try{let n=t;if("string"==typeof t&&(n=JSON.parse(t)),"string"==typeof n&&(e=new u.Hot.HotTestElement(n)),n instanceof Array&&(e=new u.Hot.HotTestElement(n[0],n[1],n[2])),null!=n.name&&(e=new u.Hot.HotTestElement(n)),null!=u.Hot.CurrentPage.testElements[e.name])throw new Error(`Test element ${e.name} already exists!`)}catch(e){throw new Error(`Error processing test element ${t} in ${u.Hot.CurrentPage.name}. Error: ${e.message}`)}return e};const e=t(o);s=`*&&%*%@#@!data-test-object-name = "${e.name}" data-test-object-func = "${e.func}" data-test-object-value = "${e.value}"*&!#%@!@*!`}return s}),(t=>t)));let d=h.processNestedContent(p,"*&&%*%@#@!","*&!#%@!@*!","*&&%*%@#@!",((t,e,n)=>t),(t=>{let r="";r=!0===n.allowStringify?JSON.stringify(t):t;let o="";return o=!0===n.outputCommands?`echoOutput (${r}, ${e});\n`:r,o}),10,10);return d=d.replace(/\*\&\&\%\*\%\@\#\@\!/g,""),d=d.replace(/\*\&\!\#\%\@\!\@\*\!/g,""),d}),0)}process(t=null){return i(this,void 0,void 0,(function*(){let e=this.content;if(null!=t&&t instanceof Array)throw new Error(`In ${this.name}, the passed arguments received cannot be an array!`);let n=u.Hot.Arguments;u.Hot.Mode=this.page.processor.mode,u.Hot.Arguments=t,u.Hot.CurrentPage=this.page,u.Hot.PublicKeys=this.page.processor.publicKeys,u.Hot.API=this.page.getAPI(),u.Hot.TesterAPI=this.page.getTesterAPI();let r=h.parseContent(e,this.throwAllErrors),o=null;try{let e="\n\t\t\tvar Hot = arguments[0];\n\t\t\tvar PassedHotFile = arguments[1];\n\n\t\t\t";if("string"==typeof t)throw new Error("The passing arguments cannot be a string!");for(let n in t){let r="",o=t[n];r=`var ${n} = ${JSON.stringify(o)};\n`,e+=r}let n=this.name;""===n&&(n=this.localFile),""===n&&(n=this.url),e+='\n\t\t\t/**\n\t\t\t * Helper function to output content.\n\t\t\t */\n\t\t\tfunction echoOutput (content, throwErrors)\n\t\t\t{\n\t\t\t\tif (throwErrors == null)\n\t\t\t\t\tthrowErrors = true;\n\n\t\t\t\tif (throwErrors === true)\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tHot.echo ("");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Outputs a ${JS Content} value.\n\t\t\t */\n\t\t\tfunction outputStr (value, possibleValue)\n\t\t\t{\n\t\t\t\tlet result = `\\${${value}}`;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tif (possibleValue != null)\n\t\t\t\t\t\tresult = possibleValue;\n\t\t\t\t\telse\n\t\t\t\t\t\tresult = eval (value);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t}\n\n\t\t\t\treturn (result);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Create a function for later execution on this page.\n\t\t\t */\n\t\t\tfunction createFunction (name, args, funcBody, isAsync)\n\t\t\t{\n\t\t\t\treturn (Hot.CurrentPage.addFunction (name, args, funcBody, isAsync));\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Create a test element.\n\t\t\t */\n\t\t\tfunction createTestElement (foundStr)\n\t\t\t{\n\t\t\t\tlet testElm = null;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tlet obj = foundStr;\n\n\t\t\t\t\tif (typeof (foundStr) === "string")\n\t\t\t\t\t\tobj = JSON.parse (foundStr);\n\n\t\t\t\t\tif (typeof (obj) === "string")\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (obj instanceof Array)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj[0], obj[1], obj[2]);\n\n\t\t\t\t\tif (obj["name"] != null)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (Hot.CurrentPage.testElements[testElm.name] != null)\n\t\t\t\t\t\tthrow new Error (`Test element ${testElm.name} already exists!`);\n\n\t\t\t\t\tHot.CurrentPage.addTestElement (testElm);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tthrow new Error (\n\t\t\t`Error processing test element ${foundStr} in ${Hot.CurrentPage.name}. Error: ${ex.message}`\n\t\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (testElm);\n\t\t\t}\n\n\t\t\tasync function runContent (CurrentHotFile)\n\t\t\t{\n',e+=r,e+="\n\t\t\t}\n\n\t\t\treturn (runContent (PassedHotFile).then (() =>\n\t\t\t{\n\t\t\t\treturn ({\n\t\t\t\t\t\thot: Hot,\n\t\t\t\t\t\toutput: Hot.Output,\n\t\t\t\t\t\tdata: JSON.stringify (Hot.Data)\n\t\t\t\t\t});\n\t\t\t}));";let s=new Function(e);o=yield s.apply(this,[u.Hot,this])}catch(t){throw SyntaxError,t}u.Hot.Data=o.hot.Data;let s=o.output;return u.Hot.Output="",u.Hot.Arguments=n,s}))}}e.HotFile=h},3622:(t,e)=>{"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.HotLog=e.HotLogLevel=void 0,function(t){t[t.Info=0]="Info",t[t.Warning=1]="Warning",t[t.Error=2]="Error",t[t.Verbose=3]="Verbose",t[t.All=4]="All",t[t.None=5]="None"}(n=e.HotLogLevel||(e.HotLogLevel={})),e.HotLog=class{constructor(t=n.All){this.logLevel=t,this.showResponses=!1,this.showHTTPEvents=!1,this.showWebSocketEvents=!1}static parse(t){let e=n.All;return"info"===t&&(e=n.Info),"warning"===t&&(e=n.Warning),"error"===t&&(e=n.Error),"verbose"===t&&(e=n.Verbose),"all"===t&&(e=n.All),"none"===t&&(e=n.None),e}log(t,e){this.logLevel===n.Verbose&&(t===n.Error&&this.error(e),t===n.Warning&&this.warning(e),t!==n.Info&&t!==n.Verbose||this.info(e)),this.logLevel===n.All&&(t===n.Error&&this.error(e),t===n.Warning&&this.warning(e),t===n.Info&&this.info(e)),this.logLevel===n.Error&&t===n.Error&&this.error(e),this.logLevel===n.Warning&&t===n.Warning&&this.warning(e),this.logLevel===n.Info&&t===n.Info&&this.info(e)}verbose(t,e=null){this.logLevel===n.Verbose&&("string"==typeof t?console.info(t):console.info(t(e)))}info(t){this.logLevel!==n.All&&this.logLevel!==n.Verbose&&this.logLevel!==n.Info||console.info(t)}warning(t){this.logLevel!==n.All&&this.logLevel!==n.Verbose&&this.logLevel!==n.Warning||console.warn(t)}error(t){if(this.logLevel===n.All||this.logLevel===n.Verbose||this.logLevel===n.Error){let e="";"string"==typeof t?e=t:(null!=t.message&&(e=t.message),null!=t.stack&&(e=t.stack)),console.error(e)}}}},6370:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotModule=void 0;const o=n(1814),s=n(5472);e.HotModule=class{constructor(t){this.name=t,this.import=[],this.html=[],this.css=[],this.js=[],this.componentLibrary="",this.components=[]}outputCSS(t=!0){if(null==this.css)return;let e="";return this.outputAsset("css",this.css,(t=>{const n=t.output();e+=`${n}\n`})),!0===t&&o.Hot.echo(e),e}outputJS(t=!0){if(null==this.js)return;let e="";return this.outputAsset("js",this.js,(t=>{const n=t.output();e+=`${n}\n`})),!0===t&&o.Hot.echo(e),e}output(t,e=null){return r(this,void 0,void 0,(function*(){yield o.Hot.include(`${this.name}/${t}.hott`,e)}))}loadHTML(){return r(this,void 0,void 0,(function*(){if(null==this.html)return;let t={};this.outputAsset("html",this.html,(e=>{const n=e.output();if("string"==typeof n)throw new Error("HTML assets cannot be outputted using only a string!");t[n.name]=n})),yield o.Hot.CurrentPage.processor.loadHotFiles(t)}))}outputComponents(t=!0){if(null==this.components)return"";if(this.components.length<1)return"";let e='<script type = "text/javascript">',n="";null!=this.componentLibrary&&""!==this.componentLibrary&&(n=`${this.componentLibrary}.`);for(let t=0;t<this.components.length;t++)e+=`Hot.CurrentPage.processor.addComponent (${n}${this.components[t]});\n`;return e+="<\/script>",!0===t&&o.Hot.echo(e),e}outputAsset(t,e=[],n){for(let r=0;r<e.length;r++){let o=e[r],i=null;i=new s.HotAsset(t),"string"==typeof o?i.path=o:(null!=o.name&&(i.name=o.name),null!=o.path&&(i.path=o.path),null!=o.content&&(i.content=o.content)),n(i)}}}},5989:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotPage=void 0;const o=n(1814),s=n(9343);e.HotPage=class{constructor(t){t instanceof s.HotStaq?(this.processor=t,this.name="",this.testerName="HotTesterMochaSelenium",this.testerMap="",this.route="",this.components={},this.files=[],this.functions={},this.testElements={},this.testPaths={}):(this.processor=t.processor,this.name=t.name||"",this.testerName=t.testerName||"HotTesterMochaSelenium",this.testerMap=t.testerMap||"",this.route=t.route||"",this.components=t.components||{},this.files=t.files||[],this.functions=t.functions||{},this.testElements=t.testElements||{},this.testPaths=t.testPaths||{})}addFile(t){return r(this,void 0,void 0,(function*(){t.page=this,this.files.push(t)}))}getAPI(){return this.processor.api}getTesterAPI(){return this.processor.testerAPI}load(t){return r(this,void 0,void 0,(function*(){for(let t=0;t<this.files.length;t++){let e=this.files[t];yield e.load()}}))}process(t=null){return r(this,void 0,void 0,(function*(){let e="";for(let n=0;n<this.files.length;n++){let r=this.files[n];o.Hot.Output="",r.page=this,e+=(yield r.process(t))}return e}))}addFunction(t,e,n,r=!1){null==t&&(t="__func"+Object.keys(this.functions).length);let o="",s="";!0===r&&(s="async ");for(let t=0;t<e.length;t++){const n=e[t];let r=",";t==e.length-1&&(r=""),o+=`${n}${r}`}return this.functions[t]=new Function(`return (${s}(${o}) => { ${n} }).apply (this, arguments);`),t}callFunction(t,e,n){let r=this.functions[e];if(null==r)throw new Error(`Function ${e} does not exist!`);return r.apply(t,n)}callAsyncFunction(t,e,n){return r(this,void 0,void 0,(function*(){let r=this.functions[e];if(null==r)throw new Error(`Function ${e} does not exist!`);return r.apply(t,n)}))}addTestElement(t){if(null!=this.testElements[t.name])throw new Error(`Test element ${t.name} already exists!`);this.testElements[t.name]=t}getTestElement(t){if(null==this.testElements[t])throw new Error(`Test element ${t} doest not exist!`);return this.testElements[t]}createTestPath(t,e){if(null!=this.testPaths[t])throw new Error(`Test path ${t} already exists!`);this.testPaths[t]=e}}},7605:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRoute=void 0;const r=n(9844);class o{constructor(t,e,n=[]){this.onPreRegister=null,this.onRegister=null,this.onPostRegister=null,this.onAuthorizeUser=null,this.connection=t,this.logger=null,null!=this.connection&&null!=this.connection.processor&&(this.logger=this.connection.processor.logger),this.route=e,this.description="",this.openAPI=null,this.version="v1",this.prefix="",this.methods=n,this.errors={not_authorized:o.createError("Not authorized."),no_server_execute_function:o.createError("Missing server execute function.",500)}}static createError(t,e=400){return{error:t,errorCode:e}}addMethod(t,e=null,n=r.HotEventMethod.POST,o=null){return"string"==typeof t&&(t=r.HotRouteMethod.create(this,t,e,n,null,null,o)),t instanceof r.HotRouteMethod||(null==t.route&&(t.route=this),t=r.HotRouteMethod.create(t)),this.methods.push(t),t}getMethod(t){let e=null;for(let n=0;n<this.methods.length;n++){let r=this.methods[n];if(r.name===t){e=r;break}}return e}}e.HotRoute=o},9844:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRouteMethod=e.ServerRequest=e.PassType=e.HotEventMethod=void 0;const r=n(1814),o=n(7605),s=n(3205);var i,a;!function(t){t.GET="get",t.POST="post",t.FILE_UPLOAD="file_upload_then_post_json",t.WEBSOCKET_CLIENT_PUB_EVENT="websocket_client_pub_event",t.POST_AND_WEBSOCKET_CLIENT_PUB_EVENT="post_and_websocket_client_pub_event"}(i=e.HotEventMethod||(e.HotEventMethod={})),(a=e.PassType||(e.PassType={}))[a.ReturnToClient=0]="ReturnToClient",a[a.Update=1]="Update",a[a.Ignore=2]="Ignore",e.ServerRequest=class{constructor(t=null){null==t&&(t={}),this.req=t.req||null,this.res=t.res||null,this.bearerToken=t.bearerToken||"",this.wsSocket=t.wsSocket||null,this.authorizedValue=t.authorizedValue||null,this.jsonObj=t.jsonObj||null,this.queryObj=t.queryObj||null,this.files=t.files||null}};class l{constructor(){this.route=null,this.name="",this.description="",this.openAPI=null,this.tags=[],this.returns=null,this.parametersRefName="",this.parameters={},this.queryParameters={},this.type=i.POST,this.isRegistered=!1,this.executeSetup=!0,this.testCases={},this.onPreRegister=null,this.onRegister=null,this.onPostRegister=null,this.onServerAuthorize=null,this.onServerExecute=null,this.onClientExecute=null}static create(t,e="",n=null,a=i.POST,c=null,u=null,h=null){let p=new l,d=null;if(t instanceof o.HotRoute)d=t;else{if(d=t.route,null!=t.type&&(a=t.type),null!=t.name&&(e=t.name),null!=t.name&&(p.tags=t.tags),null!=t.description&&(p.description=t.description),null!=t.openAPI&&(p.openAPI=t.openAPI),null!=t.parametersRefName&&(p.parametersRefName=t.parametersRefName),null!=t.queryParameters&&(p.queryParameters=t.queryParameters),null!=t.returns&&("string"==typeof t.returns?p.returns={type:"string",required:!0,description:t.returns}:(t.returns,p.returns=t.returns)),null!=t.parameters)if(t.parameters instanceof Function)p.parameters=t.parameters;else for(let e in t.parameters){let n=t.parameters[e];"string"==typeof n?p.parameters[e]={type:"string",required:!1,description:n}:("function"==typeof n||null==n.type&&(n.type="string"),p.parameters[e]=n)}null!=t.onServerExecute&&(n=t.onServerExecute),null!=t.onServerAuthorize&&(c=t.onServerAuthorize),null!=t.onRegister&&(u=t.onRegister),null!=t.onPostRegister&&(p.onPostRegister=t.onPostRegister),null!=t.onServerExecute&&(p.onServerExecute=t.onServerExecute),null!=t.onClientExecute&&(p.onClientExecute=t.onClientExecute),null!=t.testCases&&(h=t.testCases)}if(""===e)throw new Error("All route methods must have a name!");if(p.route=d,p.name=e,p.type=a,p.isRegistered=!1,p.executeSetup=!1,p.onServerAuthorize=c,p.onRegister=u,p.testCases={},p.route.connection.processor.mode===r.DeveloperMode.Development&&null!=h)if(h instanceof Array)for(let t=0;t<h.length;t++){let e=h[t];if("string"==typeof e){const n=e,r=h[t+1];p.addTestCase(n,r),t++}else p.addTestCase(e)}else for(let t in h){let e=h[t];p.addTestCase(e)}return p.route.connection instanceof s.HotServer&&(p.onServerExecute=n),p}addTestCase(t,e=null){if("string"==typeof t){const n=t,r=e;return void(this.testCases[n]={name:n,func:r})}if("function"==typeof t){const e=Object.keys(this.testCases).length,n=`${this.route.route}/${this.name} test case ${e}`,r=t;return void(this.testCases[n]={name:n,func:r})}const n=t;this.testCases[n.name]=n}getRouteUrl(){if(null==this.route)throw new Error(`Route method ${this.name} does not have a parent route!`);let t="/";return""!==this.route.version&&(t+=`${this.route.version}/`),""!==this.route.prefix&&(t+=`${this.route.prefix}/`),""!==this.route.route&&(t+=`${this.route.route}/`),t+=this.name,t}}e.HotRouteMethod=l},3205:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotServer=e.HotServerType=void 0;const o=n(9343);var s;!function(t){t[t.HTTP=0]="HTTP",t[t.WebSockets=1]="WebSockets",t[t.Generate=2]="Generate",t[t.WebTesting=3]="WebTesting",t[t.APITesting=4]="APITesting"}(s=e.HotServerType||(e.HotServerType={})),e.HotServer=class{constructor(t){t instanceof o.HotStaq?(this.processor=t,this.serverType="Server",this.api=null,this.listenAddress="0.0.0.0",this.ports={http:5e3,https:443},this.ssl={cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=!0,this.type=s.HTTP,this.logger=t.logger,this.secrets={}):(this.processor=t.processor,this.serverType=t.serverType||"Server",this.api=t.api||null,this.listenAddress=t.listenAddress||"0.0.0.0",this.ports=t.ports||{http:5e3,https:443},this.ssl=t.ssl||{cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=null==t.redirectHTTPtoHTTPS||t.redirectHTTPtoHTTPS,this.type=t.type||s.HTTP,this.logger=t.logger,this.secrets=t.secrets||{})}setAPI(t){return r(this,void 0,void 0,(function*(){this.processor.api=t,this.api=t}))}}},5269:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0})},9343:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),__importStar=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&__createBinding(e,t,n);return __setModuleDefault(e,t),e},__awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))},__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotStaq=void 0;const ppath=__importStar(__webpack_require__(9247)),node_fetch_1=__importDefault(__webpack_require__(2365)),validate_npm_package_name_1=__importDefault(__webpack_require__(7963)),HotPage_1=__webpack_require__(5989),HotFile_1=__webpack_require__(8296),HotLog_1=__webpack_require__(3622),Hot_1=__webpack_require__(1814),HotAsset_1=__webpack_require__(5472),HotClient_1=__webpack_require__(3025),HotTesterAPI_1=__webpack_require__(6681),HotTestMap_1=__webpack_require__(6434),HotTestDestination_1=__webpack_require__(4744),HotStaqRegisterComponent_1=__webpack_require__(6019),HotStaqWebStart_1=__webpack_require__(6061);var HotTesterMocha=null,HotTesterMochaSelenium=null,HotTestSeleniumDriver=null;class HotStaq{constructor(t={}){this.logger=new HotLog_1.HotLog(HotLog_1.HotLogLevel.All),this.startDelay=0,this.api=t.api||null,this.testerAPI=t.testerAPI||null,this.mode=t.mode||Hot_1.DeveloperMode.Production,this.pages=t.pages||{},this.modules=t.modules||{},this.components=t.components||{},this.files=t.files||{},this.hotSite=t.hotSite||null,this.apiContent="\n\t\t\t{\n\t\t\t\tvar %api_name% = %api_exported_name%.%api_name%;\n\t\t\t\tvar newHotClient = new HotClient (processor);\n\t\t\t\tvar newapi = new %api_name% (%base_url%, newHotClient);\n\t\t\t\tnewHotClient.api = newapi;\n\t\t\t\tprocessor.api = newapi;\n\t\t\t}",this.testerApiContent="\n\t\t\tvar HotTesterAPI = HotStaqWeb.HotTesterAPI;\n\t\t\tvar newHotTesterClient = new HotClient (processor);\n\t\t\tvar newtesterapi = new HotTesterAPI (%base_tester_url%, newHotTesterClient);\n\t\t\tnewHotTesterClient.testerAPI = newtesterapi;\n\t\t\tprocessor.testerAPI = newtesterapi;",this.pageContent='<!DOCTYPE html>\n<html>\n\n<head>\n\t<title>%title%</title>\n\n\t<script type = "text/javascript" src = "%hotstaq_js_src%"><\/script>\n\t<script type = "text/javascript">\n\t\twindow.hotstaqStartingApp = true;\n\n\t\tfor (let key in HotStaqWeb)\n\t\t\twindow[key] = HotStaqWeb[key];\n\t<\/script>\n\n%apis_to_load%\n\n\t<script type = "text/javascript">\n\t\tasync function hotstaq_startApp ()\n\t\t{\n\t\t\tlet tempMode = 0;\n\n\t\t\tif (window["Hot"] != null)\n\t\t\t\ttempMode = Hot.Mode;\n\n\t\t\t%start_delay%\n\n\t\t\tvar processor = new HotStaq ();\n\t\t\tprocessor.logger.logLevel = %logging_level%;\n\n\t\t\tvar promises = [];\n\t\t\t%developer_mode%\n\n\t\t\t%api_code%\n\n\t\t\t%public_secrets%\n\t\t\t%tester_api%\n\t\t\t%load_files%\n\n\t\t\tprocessor.mode = tempMode;\n\n\t\t\tPromise.all (promises).then (function ()\n\t\t\t\t{\n\t\t\t\t\tHotStaq.displayUrl ({\n\t\t\t\t\t\t\turl: "%url%",\n\t\t\t\t\t\t\tname: "%title%",\n\t\t\t\t\t\t\tprocessor: processor,\n\t\t\t\t\t\t\targs: %args%,\n\t\t\t\t\t\t\ttesterName: %tester_name%,\n\t\t\t\t\t\t\ttesterMap: %tester_map%,\n\t\t\t\t\t\t\ttesterAPIBaseUrl: %tester_api_base_url%,\n\t\t\t\t\t\t\ttesterLaunchpadUrl: %tester_launchpad_url%\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\thotstaq_startApp ();\n\t<\/script>\n</head>\n\n<body>\n</body>\n\n</html>',this.publicKeys={},this.testers={}}static parseBoolean(t){return"true"===(t=t.toLowerCase())||"false"!==t&&("yes"===t||"no"!==t&&"yep"===t)}static convertInterfaceToRouteParameters(sourceCodePath,interfaceName,options={typeConversions:{Date:"string"},returnFirstUnionType:!0,unknownTypeDefaultsToType:"string"}){return __awaiter(this,void 0,void 0,(function*(){let parameters={};if(!0===HotStaq.isWeb)throw new Error("HotStaq.convertInterfaceToRouteParameters is not supported in the browser.");let HotIO=eval("require")("./HotIO").HotIO;const sourceCodeContent=yield HotIO.readTextFile(sourceCodePath);let parseInterface=eval("require")("./HotConvertInterfaceToRouteParameters").parseInterface;const output=parseInterface("./temp.ts",sourceCodeContent,interfaceName,options);if(null==output)throw new Error(`Interface ${interfaceName} not found in ${sourceCodePath}.`);for(let t=0;t<output.properties.length;t++){let e=output.properties[t],n="";e.comments.length>0&&(n=e.comments[0]),parameters[e.name]={type:e.type,required:!e.isOptional,description:n},!0===e.readOnly&&(parameters[e.name].readOnly=!0),!0===e.isArray&&(parameters[e.name].type="array",parameters[e.name].items={type:e.type})}return parameters}))}static getParam(t,e,n=!0,r=!0){let o=e[t];if(null==o&&!0===n&&!0===r)throw new Error(`Missing required parameter ${t}.`);if("string"==typeof o&&!0===n&&""===o&&!0===r)throw new Error(`Missing required parameter ${t}.`);return o}static getParamRange(t,e,n,r,o=!0,s=!0){const i=HotStaq.getParam(t,e,o,s);if(i<n)throw new Error(`Parameter ${t} must be greater than or equal to ${n}.`);if(i>r)throw new Error(`Parameter ${t} must be less than or equal to ${r}.`);return i}static getParamDefault(t,e,n){let r=e[t];return null==r||"string"==typeof r&&""===r?n:r}static checkIfEmpty(t){return!t}static getParamDefaultRange(t,e,n,r,o){const s=HotStaq.getParamDefault(t,e,n);if(s<r)throw new Error(`Parameter ${t} must be greater than or equal to ${r}.`);if(s>o)throw new Error(`Parameter ${t} must be less than or equal to ${o}.`);return s}static executeError(t){if(null!=HotStaq.errors[t]){let e=HotStaq.errors[t].redirectToUrl;if(null!=e&&""!==e)return void(window.location.href=e);let n=HotStaq.errors[t].func;null!=n&&n(t)}}static wait(t){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((e,n)=>{setTimeout((()=>{e()}),t)}))}))}addPage(t){this.pages[t.name]=t}getPage(t){return this.pages[t]}addModule(t,e){this.modules[t]=e}getModule(t){return this.modules[t]}addFile(t){let e=t.name;""===e&&(e=t.localFile),""===e&&(e=t.url),this.files[e]=t}getFile(t,e=!0){if(null==this.files[t]){let n=t.indexOf("?hstqserve="),r=t;if(n>-1&&(r=t.substring(0,n)),null!=this.files[r])return this.files[r];if(!0===e)throw new Error(`Unable to find file ${t}`);return null}return this.files[t]}static keepContext(t,e,n){return function(){var r=Array.prototype.slice.call(arguments);return null!=n&&r.push(n),null==e?t.apply(this,r):t.apply(e,r)}}addComponent(t,e=null,n=void 0){let r=this.api;null!=e&&(r=e);let o=new t(this,r);if(null!=this.components[o.tag])throw new Error(`Component ${o.tag} already exists!`);this.components[o.tag]={componentType:t,processor:this,api:r},HotStaqRegisterComponent_1.registerComponent.call(this,o.tag,n)}static fixHTML(t){const e=t.replace(/ \/>/g,">").replace(/(<(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr).*?>)/g,"$1</$2>"),n=(new DOMParser).parseFromString(`<xml>${e}</xml>`,"text/xml");let r="";if(n.documentElement.children.length>0){const e=n.documentElement.children[0].tagName.toLowerCase();"tr"===e&&(t=`<table>${t}</table>`,r="tbody"),"th"===e&&(t=`<table>${t}</table>`,r=e)}return{fixedStr:t,querySelector:r}}static addHtml(t,e){let n=null;if(n="string"==typeof t?document.querySelector(t):t,null==n)throw new Error(`Unable to find parent ${t}!`);let r=null;if("string"==typeof e){let t=HotStaq.fixHTML(e),r=(new DOMParser).parseFromString(t.fixedStr,"text/html"),o=null;o=""===t.querySelector?r.body.children:r.querySelector(t.querySelector).children;let s=[];for(let t=0;t<o.length;t++){let e=o[t];s.push(n.appendChild(e))}return s}return r=n.appendChild(e),r}static checkHotSiteName(t,e=!1){let n=(0,validate_npm_package_name_1.default)(t),r=!0;if(!1===n.validForNewPackages&&(r=!1),null!=n.errors&&n.errors.length>0&&(r=!1),!1===r&&!0===e)throw new Error(`HotSite ${t} has an invalid name! The name cannot be empty and must have a valid NPM module name.`);return r}static replaceKey(t,e,n){return t.replace(new RegExp(`\\$\\{${e}\\}`,"g"),n)}static getValueFromHotSiteObj(t,e){let n=null;if(null!=t){let r=t;for(let t=0;t<e.length;t++){let n=e[t];if(null==r[n]){r=null;break}r=r[n]}null!=r&&(n=r)}return n}processHotSite(tester=null){return __awaiter(this,void 0,void 0,(function*(){HotStaq.checkHotSiteName(this.hotSite.name,!0);let routes=this.hotSite.routes;if(null!=routes)for(let t in routes){let e=routes[t],n=new HotFile_1.HotFile(e),r=new HotPage_1.HotPage({processor:this,name:e.name||"",route:t,files:[n]});if(null!=tester&&this.mode===Hot_1.DeveloperMode.Development){let t=e.name,n=null;if(null!=e.map){if("string"==typeof e.map){if(null==tester.testMaps[e.map])throw new Error(`Test map ${e.map} does not exist!`);tester.testMaps[t]=tester.testMaps[e.map]}else{n=new HotTestMap_1.HotTestMap;let t=null;if(e.map instanceof Array){t=[];for(let n=0;n<e.map.length;n++){let r=e.map[n];t.push(new HotTestDestination_1.HotTestDestination(r))}}else{t={};for(let n in e.map){let r=e.map[n];t[n]=new HotTestDestination_1.HotTestDestination(r)}}n.destinations=t}tester.testMaps[t]=n}null!=e.destinationOrder&&(tester.testMaps[t].destinationOrder=e.destinationOrder)}this.addPage(r)}if(null!=this.hotSite.web)for(let t in this.hotSite.web){const e=this.hotSite.web[t];if(null!=e.map&&!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development){let n=t,r=new HotTestMap_1.HotTestMap;r.destinations=[];for(let t=0;t<e.map.length;t++){let n=e.map[t];r.destinations.push(new HotTestDestination_1.HotTestDestination(n))}null!=tester?tester.testMaps[n]=r:this.logger.warning("A tester was not created first! You must specify one in the CLI.")}}if(null!=this.hotSite.apis)for(let t in this.hotSite.apis){let e=this.hotSite.apis[t];if(null!=e.map&&!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development){let n=t,r=new HotTestMap_1.HotTestMap;r.destinations=[];for(let t=0;t<e.map.length;t++){let n=e.map[t];r.destinations.push(new HotTestDestination_1.HotTestDestination(n))}null!=tester?tester.testMaps[n]=r:this.logger.warning("A tester was not created first! You must specify one in the CLI.")}}if(!0===HotStaq.isWeb)for(let key in this.hotSite.components){let component=this.hotSite.components[key],componentUrl=component.url,res=yield(0,node_fetch_1.default)(componentUrl),ComponentClass=eval(res);this.addComponent(ComponentClass)}null==this.hotSite.routes&&(this.hotSite.routes={});let disableFileLoading=!1;null!=this.hotSite.disableFileLoading&&(disableFileLoading=this.hotSite.disableFileLoading),!1===disableFileLoading?yield this.loadHotFiles(this.hotSite.files,!1,!1):this.logger.verbose("Hotsite has file loading disabled..."),null!=tester&&this.addTester(tester),this.logger.verbose(`Processed HotSite ${this.hotSite.name}`)}))}loadHotSite(path){return __awaiter(this,void 0,void 0,(function*(){let jsonStr="";const ext=ppath.extname(path).toLowerCase();if(!0===HotStaq.isWeb){this.logger.verbose(`Downloading HotSite ${path}`);let t=yield(0,node_fetch_1.default)(path);this.logger.verbose(`Downloaded site ${path}`),jsonStr=t.text()}else{path=ppath.normalize(path),this.logger.verbose(`Accessing HotSite ${path}`);let HotIO=eval("require")("./HotIO").HotIO;if(!1===(yield HotIO.exists(path)))throw new Error(`HotSite ${path} does not exist!`);jsonStr=yield HotIO.readTextFile(path),this.logger.verbose(`Accessed site ${path}`)}if(".yaml"===ext||".yml"===ext){if(!0===HotStaq.isWeb)throw new Error("YAML support for HotSites is not available on the web yet!");let yaml=eval("require")("yaml");this.hotSite=yaml.parse(jsonStr)}else this.hotSite=JSON.parse(jsonStr);if(null==this.hotSite)throw new Error(`HotSite ${path} cannot be null!`);this.hotSite.hotsitePath=path}))}saveHotSite(path){return __awaiter(this,void 0,void 0,(function*(){if(!0===HotStaq.isWeb)throw new Error("Cannot save a HotSite on the web!");const ext=ppath.extname(path).toLowerCase();let hotsiteStr="";if(".yaml"===ext||".yml"===ext){let yaml=eval("require")("yaml");hotsiteStr=yaml.stringify(this.hotSite)}else hotsiteStr=JSON.stringify(this.hotSite,null,2);let HotIO=eval("require")("./HotIO").HotIO;yield HotIO.writeTextFile(path,hotsiteStr),this.logger.verbose(`Saved site ${path}`)}))}loadHotFiles(t,e=!1,n=!0){return __awaiter(this,void 0,void 0,(function*(){this.logger.verbose("Loading Hott files...");for(let r in t){let o=t[r],s=null;HotStaq.isWeb,s=new HotFile_1.HotFile({name:r}),null!=o.url&&(!0===HotStaq.isWeb?s.url=`${o.url}?hstqserve=nahfam`:s.url=o.url),!1===HotStaq.isWeb&&null!=o.localFile&&(s.localFile=o.localFile);let i=!0;null!=o.content&&(s.content=o.content,i=!1),!0===e&&(i=!0),!1===n&&""!==s.url&&(i=!1),!0===i&&(this.logger.verbose(`Loading Hott file: ${s.url}`),yield s.load(),this.logger.verbose(`Finished loading Hott file: ${s.url}`)),this.addFile(s)}this.logger.verbose("Finished loading Hott files...")}))}generateContent(t,e="",n="./",r="./js/HotStaq.min.js",o=!0,s=null){return __awaiter(this,void 0,void 0,(function*(){let i="",a="",l="";if(null!=this.hotSite){if(null!=this.hotSite.server.globalApi&&""!==this.hotSite.server.globalApi){const t=this.hotSite.apis[this.hotSite.server.globalApi];if(null==t)this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't exist!`);else{let e=!0;if(null==t.jsapi&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a apiName set. Will not send js content to client.`)),!0===e){i+=`\t<script type = "text/javascript" src = "${t.jsapi}"><\/script>\n`;let e='""';null!=t.url&&(e=`"${t.url}"`),null!=this.api&&(e=`"${this.api.baseUrl}"`);let n=this.apiContent;n=n.replace(/\%api\_name\%/g,t.apiName),n=n.replace(/\%api\_exported\_name\%/g,t.libraryName),n=n.replace(/\%base\_url\%/g,e),a+=n}}}if(null!=this.hotSite.apis){let e=this.hotSite.routes[t];if(null!=e&&null!=e.api){let t=this.hotSite.apis[e.api];if(null==t)throw new Error(`Unable to find API ${e.api}`);if(e.api!==this.hotSite.server.globalApi){let n=!0;if(null==t.jsapi&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a apiName set. Will not send js content to client.`)),!0===n){let e=t.jsapi;i+=`\t<script type = "text/javascript" src = "${e}"><\/script>\n`;let n='""';null!=t.url&&(n=`"${t.url}"`),null!=this.api&&(n=`"${this.api.baseUrl}"`);let r=this.apiContent;r=r.replace(/\%api\_name\%/g,t.apiName),r=r.replace(/\%api\_exported\_name\%/g,t.libraryName),r=r.replace(/\%base\_url\%/g,n),a+=r}}}}if(null!=this.hotSite.server&&null!=this.hotSite.server.jsSrcPath&&(r=this.hotSite.server.jsSrcPath),null!=this.hotSite.publicKeys)for(let t in this.hotSite.publicKeys){let e,n=this.hotSite.publicKeys[t];if("string"==typeof n)e=JSON.stringify(n);else if(!1===HotStaq.isWeb){if(null!=this.api){if(null==this.api.connection)throw new Error("Cannot pass secrets from the API if there's no connection!");let r=this.api.connection;null!=n.passSecretFromAPI&&(e=JSON.stringify(r.secrets[t]))}if(null!=n.env){const t=n.env;e=JSON.stringify(process.env[t])}}l+=`processor.publicKeys["${t}"] = ${e};\n`}}let c=this.pageContent;return c=yield(c=>__awaiter(this,void 0,void 0,(function*(){let u="",h="";this.mode===Hot_1.DeveloperMode.Development&&(u="tempMode = HotStaqWeb.DeveloperMode.Development;",null!=this.hotSite&&null!=this.hotSite.testing&&null!=this.hotSite.testing.web&&(h=this.testerApiContent,null==this.hotSite.testing.web.testerAPIUrl&&(this.hotSite.testing.web.testerAPIUrl="http://127.0.0.1:8182"),h=h.replace(/\%base\_tester\_url\%/g,`"${this.hotSite.testing.web.testerAPIUrl}"`)));let p="";if(Object.keys(this.files).length>0){p+="var files = {};\n\n";for(let t in this.files){let e=this.files[t],n=new HotAsset_1.HotAsset("html",t);""!==e.localFile&&(n.path=e.localFile),""!==e.url&&(n.path=e.url),""!==e.content&&(n.path="",n.content=e.content);let r=yield n.output();if("string"==typeof r)throw new Error("During initial load, HTML assets cannot be outputted using only a string!");let o="",s="";null!=r.url&&(o=`"url": "${r.url}", `),null!=r.content&&(s=`"content": ${r.content}`),p+=`\t\t\tfiles["${r.name}"] = { ${o}${s} };\n`}p+="\t\t\tpromises.push (processor.loadHotFiles (files));\n"}c=c.replace(/\%title\%/g,e),!0===o&&(c=c.replace(/\%args\%/g,"Hot.Arguments")),null!=s&&(c=c.replace(/\%args\%/g,JSON.stringify(s)));let d=t,f="",m="",g="HotTesterMochaSelenium";for(let t in this.testers){g=t;break}null!=this.hotSite&&(null!=this.hotSite.testing&&null!=this.hotSite.testing.web&&(null!=this.hotSite.testing.web.testerName&&(g=this.hotSite.testing.web.testerName),null!=this.hotSite.testing.web.testerAPIUrl&&(f=this.hotSite.testing.web.testerAPIUrl),null!=this.hotSite.testing.web.launchpadUrl&&(m=this.hotSite.testing.web.launchpadUrl)),null!=this.hotSite.routes&&null!=this.hotSite.routes[t])&&(d=this.hotSite.routes[t].name);let y="";return 0!==this.startDelay&&(y=`await HotStaq.wait (${this.startDelay});`),c=(c=(c=(c=(c=(c=(c=(c=(c=(c=(c=(c=(c=(c=c.replace(/\%start\_delay\%/g,y)).replace(/\%logging\_level\%/g,`HotLogLevel.${HotLog_1.HotLogLevel[this.logger.logLevel]}`)).replace(/\%hotstaq\_js\_src\%/g,r)).replace(/\%developer\_mode\%/g,u)).replace(/\%tester\_api\%/g,h)).replace(/\%apis\_to\_load\%/g,i)).replace(/\%load\_files\%/g,p)).replace(/\%api\_code\%/g,a)).replace(/\%public\_secrets\%/g,l)).replace(/\%url\%/g,n)).replace(/\%tester\_name\%/g,`"${g}"`)).replace(/\%tester\_map\%/g,`"${d}"`)).replace(/\%tester\_api\_base\_url\%/g,`"${f}"`)).replace(/\%tester\_launchpad\_url\%/g,`"${m}"`)})))(c),c}))}createExpressRoutes(t,e="./js/HotStaq.min.js"){return __awaiter(this,void 0,void 0,(function*(){for(let n in this.pages){let r=this.pages[n];const o=yield this.generateContent(r.route,r.name,r.files[0].url,e);t.get(r.route,((t,e)=>{this.logger.verbose("Sending custom Express content."),e.status(200).send(o)}))}}))}addTester(t){this.testers[t.name]=t}getWebTestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.web)throw new Error("The HotSite does not have a testing web object!");if(null==this.hotSite.testing.web.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.web.maps}getAPITestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.api)throw new Error("The HotSite does not have a testing api object!");if(null==this.hotSite.testing.api.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.api.maps}getRouteKeyFromName(t){let e="";if(null!=this.hotSite){if(null!=this.hotSite.routes)for(let n in this.hotSite.routes)if(this.hotSite.routes[n].name===t){e=n;break}if(null!=this.hotSite.web)for(let t in this.hotSite.web)if(null!=this.hotSite.web[t]){e=t;break}}return e}getRouteFromName(t){let e=null,n=this.getRouteKeyFromName(t);return""!==n&&(e=this.hotSite.routes[n]),e}executeTests(t,e){return __awaiter(this,void 0,void 0,(function*(){let n=this.testers[t];if(null==n)throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);return n.execute(e)}))}executeAllWebTests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getWebTestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}executeAllAPITests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getAPITestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);this.logger.verbose((()=>`Executing all API tests for tester ${t}. Maps: ${JSON.stringify(e)}`));for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}process(t,e=null){return __awaiter(this,void 0,void 0,(function*(){let n=this.getPage(t);return yield n.process(e)}))}static processLocalFile(t,e=t,n=null){return __awaiter(this,void 0,void 0,(function*(){let r=new HotStaq,o=new HotFile_1.HotFile({localFile:t});yield o.load();let s=new HotPage_1.HotPage({processor:r,name:e,files:[o]});return r.addPage(s),yield r.process(e,n)}))}static processUrl(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({url:t.url});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e],testerName:t.testerName,testerMap:t.testerMap});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static processContent(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({content:t.content});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e]});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static onReady(t){HotStaq.onReadyEvent=t}static useOutput(t){return __awaiter(this,void 0,void 0,(function*(){null!=HotStaq.onOutputReceived&&HotStaq.onOutputReceived(t);let e=(new DOMParser).parseFromString(t,"text/html");document.getElementsByTagName("html")[0].innerHTML=e.getElementsByTagName("html")[0].innerHTML;let n=document.getElementsByTagName("script");if(n.length>0){let t=[];for(let e=0;e<n.length;e++)t.push(n[e]);for(let e=0;e<t.length;e++){let n=document.createElement("script");t[e].parentNode.appendChild(n),t[e].parentNode.removeChild(t[e]),yield new Promise(((r,o)=>{n.onload=()=>{r()};let s=!1;null!=t[e].getAttribute("src")&&""!==t[e].getAttribute("src")&&(n.setAttribute("src",t[e].getAttribute("src")),s=!0),null!=t[e].getAttribute("type")&&""!==t[e].getAttribute("type")&&n.setAttribute("type",t[e].getAttribute("type")),n.innerHTML=t[e].innerHTML,!1===s&&r()}))}}!0===HotStaq.dispatchReadyEvents&&(document.dispatchEvent(new Event("DOMContentLoaded")),window.dispatchEvent(new Event("load"))),null!=HotStaq.onReadyEvent&&HotStaq.onReadyEvent(t)}))}static waitForTesters(){return __awaiter(this,void 0,void 0,(function*(){for(;!1===HotStaq.isReadyForTesting;)yield HotStaq.wait(10);null!=HotStaq.onReadyForTesting&&(yield HotStaq.onReadyForTesting())}))}static setupTesters(t,e){if(t.mode===Hot_1.DeveloperMode.Development&&null==t.testerAPI){null==e.testerAPIBaseUrl&&(e.testerAPIBaseUrl=""),""===e.testerAPIBaseUrl&&(e.testerAPIBaseUrl="http://127.0.0.1:8182");let n=new HotClient_1.HotClient(t),r=new HotTesterAPI_1.HotTesterAPI(e.testerAPIBaseUrl,n);r.connection.api=r,t.testerAPI=r}}static setupClientTesters(t){let e="";return t.mode===Hot_1.DeveloperMode.Development&&(e+='<script type = "text/javascript">\nfunction hotstaq_isDocumentReady ()\n{\nif (window["Hot"] != null)\n{\nif (Hot.Mode === HotStaqWeb.DeveloperMode.Development)\n{\nlet func = function ()\n\t{\n\t\tif (Hot.TesterAPI != null)\n\t\t{\n\t\t\twindow.addEventListener ("beforeunload",\n\t\t\t\t(event) =>\n\t\t\t\t{\n\t\t\t\t\tHotStaqWeb.HotStaq.isReadyForTesting = false;\n\n\t\t\t\t\tHot.TesterAPI.tester.pageUnloaded ({\n\t\t\t\t\t\t\ttesterName: Hot.CurrentPage.testerName\n\t\t\t\t\t\t}).then (function (resp)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (resp.error != null)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (resp.error !== "")\n\t\t\t\t\t\t\t\t\t\tthrow new Error (resp.error);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\tlet testPaths = {};\n\t\t\tlet testElements = JSON.stringify (Hot.CurrentPage.testElements);\n\t\t\tlet testMaps = JSON.stringify (Hot.CurrentPage.testMaps);\n\n\t\t\tfor (let key in Hot.CurrentPage.testPaths)\n\t\t\t{\n\t\t\t\tlet testPath = Hot.CurrentPage.testPaths[key];\n\n\t\t\t\ttestPaths[key] = testPath.toString ();\n\t\t\t}\n\n\t\t\tlet testPathsStr = JSON.stringify (testPaths);\n\n\t\t\tHot.TesterAPI.tester.pageLoaded ({\n\t\t\t\t\ttesterName: Hot.CurrentPage.testerName,\n\t\t\t\t\ttestElements: testElements,\n\t\t\t\t\ttestPaths: testPathsStr\n\t\t\t\t}).then (function (resp)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (resp.error != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (resp.error !== "")\n\t\t\t\t\t\t\t\tthrow new Error (resp.error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tHotStaqWeb.HotStaq.isReadyForTesting = true;\n\t\t\t\t\t});\n\t\t}\n\t};\n\nif ((document.readyState === "complete") || (document.readyState === "interactive"))\n\tfunc ();\nelse\n\tdocument.addEventListener ("DOMContentLoaded", func);\n}\n}\n}\n\nhotstaq_isDocumentReady ();\n<\/script>'),e}static onInitalLoad(t){"complete"===document.readyState||"interactive"===document.readyState?t():window.addEventListener("load",t,{once:!0})}static displayUrl(t,e=null,n=null,r=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((o,s)=>{HotStaq.onInitalLoad((()=>__awaiter(this,void 0,void 0,(function*(){let s={url:""};s.name=null==e?"string"==typeof t?t:t.name:e,""===s.name&&(s.name="string"==typeof t?t:t.name),"string"==typeof t?s.url=t:(s.url=t.url,null==n&&null!=t.processor&&(n=t.processor),null==r&&null!=t.args&&(r=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),HotStaq.setupTesters(n,s),s.processor=n,s.args=r,s.url.indexOf("hstqserve")<0&&(s.url+="?hstqserve=nahfam");let i=yield HotStaq.processUrl(s);i+=HotStaq.setupClientTesters(n),yield HotStaq.useOutput(i),o(n)}))))}))}))}static displayContent(t,e=null,n=null,r=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((o,s)=>{HotStaq.onInitalLoad((()=>__awaiter(this,void 0,void 0,(function*(){let s={content:""};s.name=null==e?"string"==typeof t?"":t.name:e,""===s.name&&(s.name="string"==typeof t?"":t.name),"string"==typeof t?s.content=t:(s.content=t.content,null==n&&null!=t.processor&&(n=t.processor),null==r&&null!=t.args&&(r=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),HotStaq.setupTesters(n,s),s.processor=n,s.args=r;let i=yield HotStaq.processContent(s);yield HotStaq.useOutput(i),o(n)}))))}))}))}}exports.HotStaq=HotStaq,HotStaq.version="0.8.112",HotStaq.isWeb=!1,HotStaq.isReadyForTesting=!1,HotStaq.onReadyForTesting=null,HotStaq.onOutputReceived=null,HotStaq.onReadyEvent=null,HotStaq.dispatchReadyEvents=!0,HotStaq.errors={},"undefined"!=typeof document&&window.addEventListener("load",HotStaqWebStart_1.hotStaqWebStart)},6019:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.registerComponent=void 0;const r=n(8296),o=n(3299),s=n(9343),i=n(1814);e.registerComponent=function(t,e=void 0){if(null==t||""===t)throw new Error("All components must have a tag!");if(void 0!==customElements.get(t))return;let n=this.components;customElements.define(t,class extends HTMLElement{constructor(){super();let e=n[t];if(this.component=new e.componentType(e.processor,e.api),this.hotComponent=this.component,this.component.htmlElements=[this],this.component.inner=this.innerHTML,null!=this.component.handleAttributes)this.component.handleAttributes(this.attributes);else for(let t=0;t<this.attributes.length;t++){const e=this.attributes[t],n=e.name.toLowerCase(),r=e.value;if("id"===n&&(this.component.name=r),"name"===n&&(this.component.name=r),"value"===n&&(this.component.value=r),n.indexOf("hot-")>-1){const t=n.substring(4);this.component[t]=r}}if(null!=this.component.onPreOutput&&!1===this.component.onPreOutput())return;let a=this.component.output();null!=this.component.onPostOutput&&(a=this.component.onPostOutput(a));let l=[];"string"==typeof a?l.push({html:a}):l=a instanceof Array?a:[a];for(let t=0;t<l.length;t++){let e=l[t],n=e.html,a="",c=this.component["place-here"];null!=e.addFunctionsTo&&(a=e.addFunctionsTo),null!=c&&(e.documentSelector=`hot-place-here[name="${c}"]`);let u=r.HotFile.parseContent(n,!0,{outputCommands:!1});null!=this.component.onParsed&&(u=this.component.onParsed(u));let h={fixedStr:"",querySelector:""};h=null!=this.component.onFixHTML?this.component.onFixHTML(u):s.HotStaq.fixHTML(u);let p=[];for(let t=this.children.length-1;t>-1;t--){let e=this.children[t];p.push(this.removeChild(e))}let d=null,f=null;if(d=null!=this.component.onParseDOM?this.component.onParseDOM(h.fixedStr):(new DOMParser).parseFromString(h.fixedStr,"text/html"),d.body.children.length<1)throw new Error(`No component output from ${this.component.name} with tag ${this.component.tag}`);if(d.body.children.length>1){let t=!0;for(let e=0;e<d.body.children.length;e++){let n=d.body.children[e];if(n instanceof HTMLElement&&"parsererror"===n.tagName.toLowerCase()){f=n,t=!1;break}}if(!0===t)throw new Error(`Only a single html element can come from component ${this.component.name}, multiple elements were detected.`)}f=""===h.querySelector?d.body.children[0]:d.querySelector(h.querySelector),this.replaceWith(f),null!=this.component.click&&f.addEventListener("click",this.component.click.bind(this.component));for(let t in this.component.events){let e=this.component.events[t];f.addEventListener(e.type,e.func,e.options)}let m=Object.getOwnPropertyNames(this.component.constructor.prototype);for(let t=0;t<m.length;t++){let e=m[t];if("constructor"!==e&&"function"==typeof this.component[e]){let t=!0;for(let n in o.HotComponent.prototype)if(e===n){t=!1;break}!0===t&&(f[e]=s.HotStaq.keepContext(this.component[e],this.component),""!==a)&&(document.querySelector(a)[e]=s.HotStaq.keepContext(this.component[e],this.component))}}null!=this.component.onPrePlace&&(f=this.component.onPrePlace(f));let g=this.component.onCreated(f);if(null!=this.component.onParentPlace&&(g.onParentPlace=this.component.onParentPlace),g.hotComponent=this.component,this.component.htmlElements.push(g),null!=e.closestSelector){let t=g;for(;t;){let n=t.querySelector(e.closestSelector);if(null!=n){t=n;break}t=t.parentElement}if(null==t)throw new Error(`Unable to find closest node with selector '${e.closestSelector}'`);g.parentElement.removeChild(g),t.appendChild(g),null!=g.onParentPlace&&g.hotComponent.onParentPlace(parentNode,g)}if(null!=e.documentSelector){let t=document.querySelector(e.documentSelector);if(null==t)throw new Error(`Unable to find document node with selector '${e.documentSelector}'`);g.parentElement.removeChild(g),t.appendChild(g),null!=g.onParentPlace&&g.hotComponent.onParentPlace(t,g)}let y=(t,e,n)=>{let r=0;for(;r<10&&null!=t&&!(t instanceof HTMLHtmlElement);){let o=t.querySelectorAll(`hot-place-here[name="${e}"]`);if(o.length>0){let t=o[0];null!=n.parentNode&&n.parentNode.removeChild(n),t.appendChild(n),null!=n.onParentPlace&&n.hotComponent.onParentPlace(t,n);break}if(o.length<1){let r=t.querySelectorAll(`[hot-place-here="${e}"]`);if(r.length>0){let t=r[0];null!=n.parentNode&&n.parentNode.removeChild(n),t.appendChild(n),null!=n.onParentPlace&&n.hotComponent.onParentPlace(t,n);break}}t=t.parentNode,r++}return t};if(null!=e.placeHereParent){let t=g.parentNode;if(t=y(t,e.placeHereParent,g),null==t)throw new Error(`Unable to find parent node with hot-place-here attribute '${e.placeHereParent}'`)}for(let t=0;t<p.length;t++){const n=p[t];let r=!1;if(void 0!==n.getAttribute){let t=n.getAttribute("hot-place-parent");if(null!=t&&""!==t){let o=g;if(o=y(o,t,n),null==o)throw new Error(`Unable to find parent node with hot-place-here attribute '${e.placeHereParent}'`);r=!0}}!1===r&&g.appendChild(n),null!=n.onParentPlace&&n.hotComponent.onParentPlace(g,n)}if(null!=this.component.onPostPlace){let t=this.component.onPostPlace(g.parentElement,g);null!=t&&(g=t)}if(void 0!==i.Hot&&null!=i.Hot.CurrentPage){let t="";null!=this.component.name&&(t=this.component.name),null!=t&&""!==t||(t=this.id),""!==t&&(i.Hot.CurrentPage.components[t]=this.component)}}}looseParseFromString(t,e){e=e.replace(/ \/>/g,">").replace(/(<(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr).*?>)/g,"$1</$2>");const n=t.parseFromString("<xml>"+e+"</xml>","text/xml"),r=t.parseFromString("","text/html");for(let t of Array.from(n.documentElement.children))r.body.appendChild(t);for(let t of Array.from(r.querySelectorAll("area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr")))t.outerHTML="<"+t.outerHTML.slice(1).split("<")[0];return r}get observedAttributes(){return this.component.observedAttributes}},e)}},6061:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.hotStaqWebStart=void 0;const Hot_1=__webpack_require__(1814),HotClient_1=__webpack_require__(3025),HotFile_1=__webpack_require__(8296),HotLog_1=__webpack_require__(3622),HotStaq_1=__webpack_require__(9343);function hotStaqWebStart(){if(void 0!==window.hotstaqStartingApp&&!0===window.hotstaqStartingApp)return;let hotstaqElms=document.getElementsByTagName("hotstaq");if(HotStaq_1.HotStaq.isWeb=!0,void 0!==HotStaqWeb)for(let t in HotStaqWeb)window[t]=HotStaqWeb[t];if(hotstaqElms.length>0){let hotstaqElm=hotstaqElms[0];setTimeout((function(){return __awaiter(this,void 0,void 0,(function*(){let getAttr=(t,e)=>{for(let n=0;n<e.length;n++){let r=e[n];if(null!=t.getAttribute(r))return t.getAttribute(r);if(null!=t.getAttribute(`data-${r}`))return t.getAttribute(`data-${r}`)}},loadPage=getAttr(hotstaqElm,["load-page","loadPage","src"])||"",loggingLevel=getAttr(hotstaqElm,["logging-level","loggingLevel"])||null,startDelay=getAttr(hotstaqElm,["start-delay","startDelay"])||null,router=getAttr(hotstaqElm,["router"])||"",name=getAttr(hotstaqElm,["name"])||"default",args=getAttr(hotstaqElm,["args"])||null,apiJSUrl=getAttr(hotstaqElm,["api-js-url","apiJSUrl"])||null,apiLibrary=getAttr(hotstaqElm,["api-library","apiLibrary"])||null,apiName=getAttr(hotstaqElm,["api-name","apiName"])||null,apiUrl=getAttr(hotstaqElm,["api-url","apiUrl"])||null,testerName=getAttr(hotstaqElm,["tester-name","testerName"])||"HotTesterMochaSelenium",testerMap=getAttr(hotstaqElm,["tester-map","testerMap"])||null,testerApiBaseUrl=getAttr(hotstaqElm,["tester-api-base-url","testerApiBaseUrl"])||null,testerLaunchpadUrl=getAttr(hotstaqElm,["tester-launchpad-url","testerLaunchpadUrl"])||null,dontReuseProcessor=!1,passRawUrl=!1,htmlSource=hotstaqElm.innerHTML||"",routerManager={},routerWildcards=[],search=new URLSearchParams(window.location.search);null!=startDelay&&(yield HotStaq_1.HotStaq.wait(parseInt(startDelay))),null!=getAttr(hotstaqElm,["src"])&&(loadPage=getAttr(hotstaqElm,["src"])),null!=getAttr(hotstaqElm,["passRawUrl"])&&(passRawUrl=!0),null!=getAttr(hotstaqElm,["dont-reuse-processor","dontReuseProcessor"])&&(dontReuseProcessor=!0);let hstqbaseredirect=search.get("hstqbaseredirect");null!=hstqbaseredirect&&(hstqbaseredirect=decodeURI(hstqbaseredirect),window.history.replaceState("","",hstqbaseredirect),loadPage=hstqbaseredirect);let hotstaqErrors=document.getElementsByTagName("hotstaq-error");for(let t=0;t<hotstaqErrors.length;t++){let e=hotstaqErrors[t],n=getAttr(e,["status"]),r=getAttr(e,["unsupported-browser-redirect"]);null!=r?HotStaq_1.HotStaq.errors.unsupportedBrowser={redirectToUrl:r}:HotStaq_1.HotStaq.errors[`${n}`]={redirectToUrl:r}}try{eval("async () => {}")}catch(t){HotStaq_1.HotStaq.executeError("unsupportedBrowser")}if(""!==router){let t=document.getElementsByTagName("hotstaq-router");for(let e=0;e<t.length;e++){let n=t[e],r=getAttr(n,["name"]),o=getAttr(n,["serve-local","serveLocally"]);if(r===router){for(let t=0;t<n.childNodes.length;t++){let e=n.childNodes[t];if(e instanceof HTMLElement&&"ROUTE"===e.tagName.toUpperCase()){let t=getAttr(e,["path"]),n=getAttr(e,["redirect"]),r=getAttr(e,["base-redirect","baseRedirect"]),o=getAttr(e,["base"]),s=getAttr(e,["src"]);t.indexOf("*")>-1&&routerWildcards.push(t),routerManager[t]={redirect:n||void 0,baseRedirect:r||void 0,base:o||void 0,src:s||void 0}}}let t=window.location.pathname,e=window.location.pathname;if(null!=o){const n=o.toLowerCase();if("true"===n||"yes"===n||"1"===n){const n=t.lastIndexOf("/");n>-1&&(t=t.substring(n),e=e.substring(n))}}if(routerWildcards.length>0)for(let e=0;e<routerWildcards.length;e++){let n=routerWildcards[e],r=n.replace("*","");if(t.indexOf(r)>-1){t=n;break}}if(null!=routerManager[t]){if(null!=routerManager[t].redirect)return void(window.location.href=routerManager[t].redirect);if(null!=routerManager[t].baseRedirect){const n=window.location.search;let r="";return""!==n&&"?"!==n&&(r=`&${n.substring(1)}`),void(window.location.href=`${routerManager[t].baseRedirect}?hstqbaseredirect=${encodeURI(e+n)}${r}`)}null!=routerManager[t].src&&(loadPage=routerManager[t].src)}break}}}args=null!=args?JSON.parse(args):Hot_1.Hot.Arguments;let hasHtmlSource=!1;if(""!==htmlSource){const t=htmlSource.replace(/\s/g,"");""!==t&&(hasHtmlSource=!0)}let tempMode=0;null!=window.Hot&&(tempMode=Hot_1.Hot.Mode);let processor=null;!1===dontReuseProcessor&&void 0!==Hot_1.Hot&&null!=Hot_1.Hot.CurrentPage&&null!=Hot_1.Hot.CurrentPage.processor&&(processor=Hot_1.Hot.CurrentPage.processor),null==processor&&(processor=new HotStaq_1.HotStaq),null!=loggingLevel&&(processor.logger.logLevel=HotLog_1.HotLog.parse(loggingLevel)),processor.mode=tempMode;let options={name,processor,args};if(""!==loadPage&&(!1===passRawUrl&&loadPage.indexOf("hstqserve")<0&&(loadPage+="?hstqserve=nahfam"),options.url=loadPage),null!=testerMap&&(options.testerMap=testerMap,options.testerName=testerName),null!=testerName&&(options.testerName=testerName),null!=testerApiBaseUrl&&(options.testerAPIBaseUrl=testerApiBaseUrl),null!=testerLaunchpadUrl&&(options.testerLaunchpadUrl=testerLaunchpadUrl),null!=apiName){let t=new HotClient_1.HotClient(processor);if(null==apiUrl||""===apiUrl)throw new Error("api-url was not set!");if(null==apiJSUrl||""===apiJSUrl)throw new Error("api-js-url was not set!");const e=yield HotFile_1.HotFile.httpGet(apiJSUrl);if(""===e)throw new Error("api-js-url content was empty!");let n=null;!0===HotStaq_1.HotStaq.isWeb?null==n&&(n=window):null==n&&(n=__webpack_require__.g),eval.apply(n,[e]);let r=window;if(null!=apiLibrary&&(r=window[apiLibrary],null==r))throw new Error(`Unable to find the API library ${apiLibrary}!`);let o=new r[apiName](apiUrl,t);o.connection.api=o,processor.api=o}if(!1===hasHtmlSource){if(""===loadPage)throw new Error("The hotstaq tag must have a src, HTML contents inside it, or a router set.");HotStaq_1.HotStaq.displayUrl(options)}else HotStaq_1.HotStaq.displayContent(options)}))}),50)}}exports.hotStaqWebStart=hotStaqWebStart},4744:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDestination=void 0;class n{constructor(t="",e=!0){"string"==typeof t?(this.destination=t,this.autoStart=e):t instanceof n?(this.destination=t.destination,this.autoStart=t.autoStart):(this.destination=t.path,this.autoStart=t.autoStart)}}e.HotTestDestination=n},896:function(t,e){"use strict";var n=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDriver=void 0,e.HotTestDriver=class{constructor(t,e=null){this.processor=t,this.page=e,this.commandDelay=20,this.pageTestDelay=700,this.persistentData={}}parseTestObject(t){let e="";t.indexOf("*")>-1&&(t=t.replace(/\*/,""),e="*");let n=`[data-test-object-name${e}='${t}']`;return t.length>0&&">"===t[0]&&(n=t=t.substring(1)),n}wait(t){return n(this,void 0,void 0,(function*(){return new Promise(((e,n)=>{setTimeout((()=>{e()}),t)}))}))}print(t){return n(this,void 0,void 0,(function*(){process.stdout.write(t)}))}println(t){return n(this,void 0,void 0,(function*(){yield this.print(`${t}\n`)}))}destroy(){return n(this,void 0,void 0,(function*(){}))}assert(t,e=""){return n(this,void 0,void 0,(function*(){if(!t)throw new Error(e)}))}}},1284:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestElement=e.HotTestElementOptions=void 0,e.HotTestElementOptions=class{constructor(t={}){this.mustBeVisible=t.mustBeVisible||!0,this.ignoreMissingElementError=t.ignoreMissingElementError||!1}},e.HotTestElement=class{constructor(t,e="",n=null){"string"==typeof t?(this.name=t,this.func=e,this.value=n):(this.name=t.name,this.func=t.func||e,this.value=t.value||n)}}},6434:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestMap=void 0;const r=n(4744);e.HotTestMap=class{constructor(t=[],e={},n=[]){if(t instanceof Array){this.destinations=[];for(let e=0;e<t.length;e++){let n=t[e];this.destinations.push(new r.HotTestDestination(n))}}else{this.destinations={};for(let e in t){let n=t[e];this.destinations[e]=new r.HotTestDestination(n)}}this.destinationOrder=n,this.pages=e}}},1153:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0})},9962:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0})},8969:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTester=void 0;const o=n(9343);class s{constructor(t,e,n,r,o={}){if(null==o)throw new Error("The testMaps parameter can be an empty object, but cannot be null! It is set to null.");this.processor=t,this.name=e,this.timeout=1e4,this.baseUrl=n,this.testMaps=o,this.driver=r,this.finishedLoading=!1,this.hasBeenSetup=!1,this.hasBeenDestroyed=!1,this.currentPage=null,this.numFailures=0}setup(t,e,n){return r(this,void 0,void 0,(function*(){}))}destroy(){return r(this,void 0,void 0,(function*(){}))}waitForData(){return r(this,void 0,void 0,(function*(){for(;!1===this.finishedLoading;)yield o.HotStaq.wait(10)}))}static interpretDestination(t,e){let n={mapName:t,url:"",api:"",paths:[]},r=e.destination.split(/\-\>/g),o=r[0];if(o.length<2)return null;if("/"===o[0]&&"/"===o[1])return null;let s=(t,e)=>{let n=t.indexOf(e),r="";return n>-1&&(r=t.substr(n+e.length),r=r.trim()),r};n.url=s(o,"url:"),n.api=s(o,"api:");for(let t=1;t<r.length;t++){let e=r[t],o={cmd:"",dest:"",path:""};e=e.trim(),o.dest=s(e,"dest:"),o.cmd=s(e,"cmd:"),o.path=s(e,"path:"),""==o.dest&&""==o.cmd&&""==o.path&&(o.path=e),n.paths.push(o)}return n}executeTestAPIPath(t,e,n,o=!1,s=!1){return r(this,void 0,void 0,(function*(){let r=!0;if(null==e)throw new Error(`Trying to access null method on destination map ${t.mapName}.`);!1===o&&null!=this.onTestAPIPathStart&&(r=yield this.onTestAPIPathStart(t,e,n,s));let i=null;if(!0===r){let t=e.testCases[n];if(null==t)throw new Error(`HotTester: Test case object ${n} does not exist!`);i=yield t.func(this.driver)}return!1===o&&null!=this.onTestAPIPathEnd&&(yield this.onTestAPIPathEnd(t,e,n,i,s)),i}))}executeTestAPIPaths(t){return r(this,void 0,void 0,(function*(){let e=[];if(null==this.testMaps[t.mapName])throw new Error(`HotTester: API Map ${t.mapName} does not exist!`);if(null==this.processor.api)throw new Error("HotTester: Associated processor does not have an API!");let n=this.processor.api.routes[t.api];if(null==n)throw new Error(`HotTester: API does not have route ${t.api}!`);for(let r=0;r<t.paths.length;r+=2){let o=t.paths[r].path,s=n.getMethod(o),i=t.paths[r+1].path;if(null==s)throw new Error(`Unable to find method related to path ${o} in map ${t.mapName}`);let a=yield this.executeTestAPIPath(t,s,i);e.push(a)}return e}))}executeTestPagePath(t,e,n=!1,s=!1){return r(this,void 0,void 0,(function*(){yield this.waitForData();let r=!0;if(null==this.testMaps[t.mapName])throw new Error(`HotTester: Web Map ${t.mapName} does not exist!`);let i=this.currentPage;if(null==i)throw new Error("HotTester: A current page was not set!");this.driver.page=i;let a=e.path,l=i.testPaths[a];!1===n&&null!=this.onTestPagePathStart&&(r=yield this.onTestPagePathStart(t,e,s));let c=null;if(!0===r){if(null==l)throw new Error(`HotTester: Test path ${a} does not have a function!`);c=yield l(this.driver)}return!1===n&&null!=this.onTestPagePathEnd&&(yield this.onTestPagePathEnd(t,l,c,s)),!0===r&&(yield o.HotStaq.wait(this.driver.pageTestDelay)),c}))}executeCommand(t,e,n){return r(this,void 0,void 0,(function*(){let s=(t,n,r)=>{let o=!1;e.cmd===n&&(o=!0);const s=e.cmd.indexOf("(");return s>-1&&e.cmd.substr(0,s)===n&&(o=!0),o},i=t=>{let e=[];const n=t.match(/\(([^)]+)\)/);return n?(e=n[1].split(",").map((t=>t.trim())),e):[]},a=null,l=[];if(!0===s(e.cmd,"url")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];if(null==this.driver.waitForTestElement)throw new Error(`HotTester: Driver ${this.driver.constructor.name} does not support waitForTestElement!`);yield this.driver.navigateToUrl(e)}))),!0===s(e.cmd,"waitForTestObject")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];if(null==this.driver.waitForTestElement)throw new Error(`HotTester: Driver ${this.driver.constructor.name} does not support waitForTestElement!`);yield this.driver.waitForTestElement(e)}))),!0===s(e.cmd,"waitForTesterAPIData")&&(a=t=>r(this,void 0,void 0,(function*(){this.finishedLoading=!1,yield this.waitForData()}))),!0===s(e.cmd,"wait")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=parseInt(t[0]);yield o.HotStaq.wait(e)}))),!0===s(e.cmd,"print")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.print(e)}))),!0===s(e.cmd,"println")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.println(e)}))),!0===s(e.cmd,"click")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];if(null==this.driver.waitForTestElement)throw new Error(`HotTester: Driver ${this.driver.constructor.name} does not support waitForTestElement!`);const n=yield this.driver.waitForTestElement(e);yield n.click()}))),!0===s(e.cmd,"sendKeys")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0],n=t[1];if(null==this.driver.waitForTestElement)throw new Error(`HotTester: Driver ${this.driver.constructor.name} does not support waitForTestElement!`);const r=yield this.driver.waitForTestElement(e);yield r.sendKeys(n)}))),!0===s(e.cmd,"clear")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];if(null==this.driver.waitForTestElement)throw new Error(`HotTester: Driver ${this.driver.constructor.name} does not support waitForTestElement!`);const n=yield this.driver.waitForTestElement(e);yield n.clear()}))),!0===s(e.cmd,"debugger")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){}))),null==a)throw new Error(`HotTester: Command ${e.cmd} does not exist!`);yield this.onCommand(t,e,n,l,a)}))}executeTestPagePaths(t,e=!1){return r(this,void 0,void 0,(function*(){let n=[],r=this.testMaps[t.mapName];if(null==r)throw new Error(`HotTester: Web Map ${t.mapName} does not exist!`);for(let o=0;o<t.paths.length;o++){let i=t.paths[o],a=null;if(""!==i.dest){if(r.destinations instanceof Array)throw new Error(`HotTester: When using type 'dest' in a destination string, all destinations in map ${t.mapName} must be named.`);let e=r.destinations[i.dest],n=s.interpretDestination(t.mapName,e);null!=n&&(a=yield this.executeTestPagePaths(n))}""!==i.cmd&&(yield this.executeCommand(t,i,i.cmd)),""!==i.path&&(a=yield this.executeTestPagePath(t,i,!1,e)),n.push(a)}return n}))}execute(t){return r(this,void 0,void 0,(function*(){let e=this.testMaps[t];if(null==e)throw new Error(`HotTester: Map ${t} does not exist!`);this.processor.logger.verbose(`HotTester: Executing map ${t}...`),this.processor.getRouteKeyFromName(t);let n=(e,n="")=>r(this,void 0,void 0,(function*(){if(!1!==e.autoStart)try{this.processor.logger.verbose((()=>`HotTester: Executing ${t} destination ${JSON.stringify(e)}...`));let r=s.interpretDestination(t,e),o=!1,i=!0,a=this.baseUrl;""!==r.url&&(o=!0,a+=r.url),null!=this.setup&&!1===this.hasBeenSetup&&(yield this.setup(o,a,n),this.hasBeenSetup=!0,this.hasBeenDestroyed=!1),null!=this.onTestStart&&(i=yield this.onTestStart(r,a,n)),!0===i&&(""!==r.url&&(yield this.executeTestPagePaths(r)),""!==r.api&&(yield this.executeTestAPIPaths(r))),null!=this.onTestEnd&&(yield this.onTestEnd(r)),null!=this.destroy&&!1===this.hasBeenDestroyed&&(yield this.destroy(),this.hasBeenDestroyed=!0,this.hasBeenSetup=!1)}catch(t){throw t}}));if(e.destinations instanceof Array)for(let t=0;t<e.destinations.length;t++){let r=e.destinations[t];yield n(r)}else if(e.destinationOrder.length>0){let t=[];for(let r=0;r<e.destinationOrder.length;r++){let o=e.destinationOrder[r],s=e.destinations[o];if(null==s)throw new Error(`HotTester: Destination ${o} does not exist!`);t.push(o),yield n(s,o)}for(let r in e.destinations){let o=!0;for(let e=0;e<t.length;e++)if(t[e]===r){o=!1;break}if(!0===o){let t=e.destinations[r];yield n(t,r)}}}else for(let t in e.destinations){let r=e.destinations[t];yield n(r,t)}}))}}e.HotTester=s},6681:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotTesterAPI=void 0;const HotAPI_1=__webpack_require__(6044),HotRoute_1=__webpack_require__(7605),HotRouteMethod_1=__webpack_require__(9844),HotStaq_1=__webpack_require__(9343);class HotTesterAPI extends HotAPI_1.HotAPI{constructor(t,e=null,n=null){super(t,e,n),this.executeEventsUsing=HotAPI_1.EventExecutionType.HotAPI;let r=new HotRoute_1.HotRoute(e,"tester");r.addMethod({name:"pageLoaded",onServerExecute:this.pageLoaded,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."},testerMap:{required:!0,type:"string",description:"The tester map executing the test."},pageName:{required:!0,type:"string",description:"The name of the page executing the test."},testElements:{required:!0,type:"array",description:"The test elements on the page."},testPaths:{required:!0,type:"array",description:"The test paths on the page."}},returns:"Returns true as an acknowledgement."}),r.addMethod({name:"pageUnloaded",onServerExecute:this.pageUnloaded,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."}},returns:"Returns true as an acknowledgement."}),r.addMethod({name:"executeTests",onServerExecute:this.executeTests,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."},testerMap:{required:!0,type:"object",description:"The tester map to execute."}},returns:"Returns true when tests are complete."}),r.addMethod({name:"heartbeat",type:HotRouteMethod_1.HotEventMethod.GET,onServerExecute:this.heartbeat,returns:"Returns true as an acknowledgement."}),this.addRoute(r)}pageLoaded(request){return __awaiter(this,void 0,void 0,(function*(){let testerObj={testerName:request.jsonObj.testerName,testElements:request.jsonObj.testElements,testPathsStrs:request.jsonObj.testPaths};for(let t in testerObj){let e=testerObj[t],n=!1;if(null==e&&(n=!0),""!=testerObj.testerName&&""!==testerObj.testElements&&""!==testerObj.testPathsStrs||(n=!0),!0===n)throw new Error(`TesterAPI: Object ${t} was not passed.`)}testerObj.testElements=JSON.parse(testerObj.testElements),testerObj.testPathsStrs=JSON.parse(testerObj.testPathsStrs);let testPaths={};for(let key in testerObj.testPathsStrs){let testPath=eval(testerObj.testPathsStrs[key]);testPaths[key]=testPath}let tester=this.connection.processor.testers[testerObj.testerName];if(null==tester)throw new Error(`TesterAPI: Tester ${testerObj.testerName} does not exist!`);let newPage={testElements:testerObj.testElements,testPaths};tester.finishedLoading=!0;let setAsCurrent=!0;return null!=tester.onFinishedLoading&&(setAsCurrent=yield tester.onFinishedLoading(newPage)),!0===setAsCurrent&&(tester.currentPage=newPage),!0}))}pageUnloaded(t){return __awaiter(this,void 0,void 0,(function*(){const e=HotStaq_1.HotStaq.getParam("testerName",t.jsonObj);let n=this.connection.processor.testers[e];if(null==n)throw new Error(`TesterAPI: Tester ${e} does not exist!`);return n.finishedLoading=!1,n.currentPage=null,null!=n.onFinishedUnloading&&(yield n.onFinishedUnloading()),!0}))}executeTests(t){return __awaiter(this,void 0,void 0,(function*(){let e=t.jsonObj.testerName,n=t.jsonObj.testerMap;if(null==e||null==n)throw new Error("TesterAPI: Not all required json objects were passed.");if(""===e||""===n)throw new Error("TesterAPI: Not all required json objects were passed.");let r=this.connection;return null!=r.executeTests&&(yield r.executeTests(e,n)),!0}))}heartbeat(t){return __awaiter(this,void 0,void 0,(function*(){return!0}))}}exports.HotTesterAPI=HotTesterAPI},3596:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotWebSocketClient=void 0;const o=n(8007),s=n(611);e.HotWebSocketClient=class{constructor(t,e=null){this.url=t,this.socket=e,this.persistentData={},this.authorizedValue=null,this.onConnectError=null,this.onError=null,this.onDisconnect=null}useSocket(t){this.socket=t}connect(t=null,e=null,n=void 0){return r(this,void 0,void 0,(function*(){let r=n;return null!=t&&(null==r&&(r={}),r=Object.assign(Object.assign({},r),{auth:t})),null!=e&&(null==r&&(r={}),r=Object.assign(Object.assign({},r),{query:e})),this.socket=(0,o.io)(this.url,r),new Promise(((t,e)=>{this.socket.on("connect",(()=>{null!=this.onConnect&&this.onConnect(),t()})),this.socket.on("connect_error",(t=>{null==this.onConnectError?e(t):this.onConnectError(t)})),this.socket.on("error",(t=>{null==this.onError?e(t):this.onError(t)})),this.socket.on("disconnect",(()=>{null!=this.onDisconnect&&this.onDisconnect()}))}))}))}on(t,e,n=null){this.socket.on(t,function(t,n){null!=n.uuid?null!=t?n.uuid===t&&e(n.data,n.uuid):e(n.data,n.uuid):e(n,t)}.bind(this,n))}onRaw(t,e){this.socket.on(t,e)}off(t){this.socket.off(t,null)}once(t,e,n=null){this.socket.once(t,function(t,n){null!=n.uuid?null!=t?n.uuid===t&&e(n.data,n.uuid):e(n.data,n.uuid):e(n,t)}.bind(this,n))}onceRaw(t,e){this.socket.once(t,e)}getId(){return this.socket.id}isConnected(){return null!=this.socket&&!1!==this.socket.connected}send(t,e,n=null){if(null==this.socket)throw new Error(`Client socket is null. Unable to send event ${t}`);if(!1===this.socket.connected)throw new Error(`Client socket is not connected. Unable to send event ${t}`);return null==n&&(n=(0,s.v4)()),this.socket.emit(t,{uuid:n,data:e}),n}sendOn(t,e,n,o=null){return r(this,void 0,void 0,(function*(){return yield new Promise(((r,i)=>{null==o&&(o=(0,s.v4)()),this.on(t,function(t,e){n(e,t),r(e)}.bind(this,o),o),this.send(t,e,o)}))}))}sendOnce(t,e,n=null){return r(this,void 0,void 0,(function*(){return yield new Promise(((r,o)=>{null==n&&(n=(0,s.v4)()),this.once(t,function(t,e){r(e)}.bind(this,n),n),this.send(t,e,n)}))}))}disconnect(t=!0){null!=this.socket&&!1!==this.socket.connected&&this.socket.disconnect()}}},611:(t,e,n)=>{"use strict";var r;n.r(e),n.d(e,{NIL:()=>A,parse:()=>g,stringify:()=>u,v1:()=>m,v3:()=>T,v4:()=>E,v5:()=>O,validate:()=>a,version:()=>q});var o=new Uint8Array(16);function s(){if(!r&&!(r="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return r(o)}const i=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,a=function(t){return"string"==typeof t&&i.test(t)};for(var l=[],c=0;c<256;++c)l.push((c+256).toString(16).substr(1));const u=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(l[t[e+0]]+l[t[e+1]]+l[t[e+2]]+l[t[e+3]]+"-"+l[t[e+4]]+l[t[e+5]]+"-"+l[t[e+6]]+l[t[e+7]]+"-"+l[t[e+8]]+l[t[e+9]]+"-"+l[t[e+10]]+l[t[e+11]]+l[t[e+12]]+l[t[e+13]]+l[t[e+14]]+l[t[e+15]]).toLowerCase();if(!a(n))throw TypeError("Stringified UUID is invalid");return n};var h,p,d=0,f=0;const m=function(t,e,n){var r=e&&n||0,o=e||new Array(16),i=(t=t||{}).node||h,a=void 0!==t.clockseq?t.clockseq:p;if(null==i||null==a){var l=t.random||(t.rng||s)();null==i&&(i=h=[1|l[0],l[1],l[2],l[3],l[4],l[5]]),null==a&&(a=p=16383&(l[6]<<8|l[7]))}var c=void 0!==t.msecs?t.msecs:Date.now(),m=void 0!==t.nsecs?t.nsecs:f+1,g=c-d+(m-f)/1e4;if(g<0&&void 0===t.clockseq&&(a=a+1&16383),(g<0||c>d)&&void 0===t.nsecs&&(m=0),m>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");d=c,f=m,p=a;var y=(1e4*(268435455&(c+=122192928e5))+m)%4294967296;o[r++]=y>>>24&255,o[r++]=y>>>16&255,o[r++]=y>>>8&255,o[r++]=255&y;var b=c/4294967296*1e4&268435455;o[r++]=b>>>8&255,o[r++]=255&b,o[r++]=b>>>24&15|16,o[r++]=b>>>16&255,o[r++]=a>>>8|128,o[r++]=255&a;for(var v=0;v<6;++v)o[r+v]=i[v];return e||u(o)},g=function(t){if(!a(t))throw TypeError("Invalid UUID");var e,n=new Uint8Array(16);return n[0]=(e=parseInt(t.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(t.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(t.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(t.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(t.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n};function y(t,e,n){function r(t,r,o,s){if("string"==typeof t&&(t=function(t){t=unescape(encodeURIComponent(t));for(var e=[],n=0;n<t.length;++n)e.push(t.charCodeAt(n));return e}(t)),"string"==typeof r&&(r=g(r)),16!==r.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var i=new Uint8Array(16+t.length);if(i.set(r),i.set(t,r.length),(i=n(i))[6]=15&i[6]|e,i[8]=63&i[8]|128,o){s=s||0;for(var a=0;a<16;++a)o[s+a]=i[a];return o}return u(i)}try{r.name=t}catch(t){}return r.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",r.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",r}function b(t){return 14+(t+64>>>9<<4)+1}function v(t,e){var n=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(n>>16)<<16|65535&n}function _(t,e,n,r,o,s){return v((i=v(v(e,t),v(r,s)))<<(a=o)|i>>>32-a,n);var i,a}function w(t,e,n,r,o,s,i){return _(e&n|~e&r,t,e,o,s,i)}function S(t,e,n,r,o,s,i){return _(e&r|n&~r,t,e,o,s,i)}function P(t,e,n,r,o,s,i){return _(e^n^r,t,e,o,s,i)}function H(t,e,n,r,o,s,i){return _(n^(e|~r),t,e,o,s,i)}const T=y("v3",48,(function(t){if("string"==typeof t){var e=unescape(encodeURIComponent(t));t=new Uint8Array(e.length);for(var n=0;n<e.length;++n)t[n]=e.charCodeAt(n)}return function(t){for(var e=[],n=32*t.length,r="0123456789abcdef",o=0;o<n;o+=8){var s=t[o>>5]>>>o%32&255,i=parseInt(r.charAt(s>>>4&15)+r.charAt(15&s),16);e.push(i)}return e}(function(t,e){t[e>>5]|=128<<e%32,t[b(e)-1]=e;for(var n=1732584193,r=-271733879,o=-1732584194,s=271733878,i=0;i<t.length;i+=16){var a=n,l=r,c=o,u=s;n=w(n,r,o,s,t[i],7,-680876936),s=w(s,n,r,o,t[i+1],12,-389564586),o=w(o,s,n,r,t[i+2],17,606105819),r=w(r,o,s,n,t[i+3],22,-1044525330),n=w(n,r,o,s,t[i+4],7,-176418897),s=w(s,n,r,o,t[i+5],12,1200080426),o=w(o,s,n,r,t[i+6],17,-1473231341),r=w(r,o,s,n,t[i+7],22,-45705983),n=w(n,r,o,s,t[i+8],7,1770035416),s=w(s,n,r,o,t[i+9],12,-1958414417),o=w(o,s,n,r,t[i+10],17,-42063),r=w(r,o,s,n,t[i+11],22,-1990404162),n=w(n,r,o,s,t[i+12],7,1804603682),s=w(s,n,r,o,t[i+13],12,-40341101),o=w(o,s,n,r,t[i+14],17,-1502002290),n=S(n,r=w(r,o,s,n,t[i+15],22,1236535329),o,s,t[i+1],5,-165796510),s=S(s,n,r,o,t[i+6],9,-1069501632),o=S(o,s,n,r,t[i+11],14,643717713),r=S(r,o,s,n,t[i],20,-373897302),n=S(n,r,o,s,t[i+5],5,-701558691),s=S(s,n,r,o,t[i+10],9,38016083),o=S(o,s,n,r,t[i+15],14,-660478335),r=S(r,o,s,n,t[i+4],20,-405537848),n=S(n,r,o,s,t[i+9],5,568446438),s=S(s,n,r,o,t[i+14],9,-1019803690),o=S(o,s,n,r,t[i+3],14,-187363961),r=S(r,o,s,n,t[i+8],20,1163531501),n=S(n,r,o,s,t[i+13],5,-1444681467),s=S(s,n,r,o,t[i+2],9,-51403784),o=S(o,s,n,r,t[i+7],14,1735328473),n=P(n,r=S(r,o,s,n,t[i+12],20,-1926607734),o,s,t[i+5],4,-378558),s=P(s,n,r,o,t[i+8],11,-2022574463),o=P(o,s,n,r,t[i+11],16,1839030562),r=P(r,o,s,n,t[i+14],23,-35309556),n=P(n,r,o,s,t[i+1],4,-1530992060),s=P(s,n,r,o,t[i+4],11,1272893353),o=P(o,s,n,r,t[i+7],16,-155497632),r=P(r,o,s,n,t[i+10],23,-1094730640),n=P(n,r,o,s,t[i+13],4,681279174),s=P(s,n,r,o,t[i],11,-358537222),o=P(o,s,n,r,t[i+3],16,-722521979),r=P(r,o,s,n,t[i+6],23,76029189),n=P(n,r,o,s,t[i+9],4,-640364487),s=P(s,n,r,o,t[i+12],11,-421815835),o=P(o,s,n,r,t[i+15],16,530742520),n=H(n,r=P(r,o,s,n,t[i+2],23,-995338651),o,s,t[i],6,-198630844),s=H(s,n,r,o,t[i+7],10,1126891415),o=H(o,s,n,r,t[i+14],15,-1416354905),r=H(r,o,s,n,t[i+5],21,-57434055),n=H(n,r,o,s,t[i+12],6,1700485571),s=H(s,n,r,o,t[i+3],10,-1894986606),o=H(o,s,n,r,t[i+10],15,-1051523),r=H(r,o,s,n,t[i+1],21,-2054922799),n=H(n,r,o,s,t[i+8],6,1873313359),s=H(s,n,r,o,t[i+15],10,-30611744),o=H(o,s,n,r,t[i+6],15,-1560198380),r=H(r,o,s,n,t[i+13],21,1309151649),n=H(n,r,o,s,t[i+4],6,-145523070),s=H(s,n,r,o,t[i+11],10,-1120210379),o=H(o,s,n,r,t[i+2],15,718787259),r=H(r,o,s,n,t[i+9],21,-343485551),n=v(n,a),r=v(r,l),o=v(o,c),s=v(s,u)}return[n,r,o,s]}(function(t){if(0===t.length)return[];for(var e=8*t.length,n=new Uint32Array(b(e)),r=0;r<e;r+=8)n[r>>5]|=(255&t[r/8])<<r%32;return n}(t),8*t.length))})),E=function(t,e,n){var r=(t=t||{}).random||(t.rng||s)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,e){n=n||0;for(var o=0;o<16;++o)e[n+o]=r[o];return e}return u(r)};function C(t,e,n,r){switch(t){case 0:return e&n^~e&r;case 1:case 3:return e^n^r;case 2:return e&n^e&r^n&r}}function k(t,e){return t<<e|t>>>32-e}const O=y("v5",80,(function(t){var e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof t){var r=unescape(encodeURIComponent(t));t=[];for(var o=0;o<r.length;++o)t.push(r.charCodeAt(o))}else Array.isArray(t)||(t=Array.prototype.slice.call(t));t.push(128);for(var s=t.length/4+2,i=Math.ceil(s/16),a=new Array(i),l=0;l<i;++l){for(var c=new Uint32Array(16),u=0;u<16;++u)c[u]=t[64*l+4*u]<<24|t[64*l+4*u+1]<<16|t[64*l+4*u+2]<<8|t[64*l+4*u+3];a[l]=c}a[i-1][14]=8*(t.length-1)/Math.pow(2,32),a[i-1][14]=Math.floor(a[i-1][14]),a[i-1][15]=8*(t.length-1)&4294967295;for(var h=0;h<i;++h){for(var p=new Uint32Array(80),d=0;d<16;++d)p[d]=a[h][d];for(var f=16;f<80;++f)p[f]=k(p[f-3]^p[f-8]^p[f-14]^p[f-16],1);for(var m=n[0],g=n[1],y=n[2],b=n[3],v=n[4],_=0;_<80;++_){var w=Math.floor(_/20),S=k(m,5)+C(w,g,y,b)+v+e[w]+p[_]>>>0;v=b,b=y,y=k(g,30)>>>0,g=m,m=S}n[0]=n[0]+m>>>0,n[1]=n[1]+g>>>0,n[2]=n[2]+y>>>0,n[3]=n[3]+b>>>0,n[4]=n[4]+v>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]})),A="00000000-0000-0000-0000-000000000000",q=function(t){if(!a(t))throw TypeError("Invalid UUID");return parseInt(t.substr(14,1),16)}},8241:t=>{"use strict";t.exports=FormData},2365:t=>{"use strict";t.exports=fetch},7963:t=>{"use strict";t.exports={}},1603:()=>{},9247:()=>{},4110:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.hasCORS=void 0;let n=!1;try{n="undefined"!=typeof XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}catch(t){}e.hasCORS=n},8661:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.decode=e.encode=void 0,e.encode=function(t){let e="";for(let n in t)t.hasOwnProperty(n)&&(e.length&&(e+="&"),e+=encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return e},e.decode=function(t){let e={},n=t.split("&");for(let t=0,r=n.length;t<r;t++){let r=n[t].split("=");e[decodeURIComponent(r[0])]=decodeURIComponent(r[1])}return e}},1015:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.parse=void 0;const n=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,r=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];e.parse=function(t){if(t.length>2e3)throw"URI too long";const e=t,o=t.indexOf("["),s=t.indexOf("]");-1!=o&&-1!=s&&(t=t.substring(0,o)+t.substring(o,s).replace(/:/g,";")+t.substring(s,t.length));let i=n.exec(t||""),a={},l=14;for(;l--;)a[r[l]]=i[l]||"";return-1!=o&&-1!=s&&(a.source=e,a.host=a.host.substring(1,a.host.length-1).replace(/;/g,":"),a.authority=a.authority.replace("[","").replace("]","").replace(/;/g,":"),a.ipv6uri=!0),a.pathNames=function(t,e){const n=e.replace(/\/{2,9}/g,"/").split("/");return"/"!=e.slice(0,1)&&0!==e.length||n.splice(0,1),"/"==e.slice(-1)&&n.splice(n.length-1,1),n}(0,a.path),a.queryKey=function(t,e){const n={};return e.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,(function(t,e,r){e&&(n[e]=r)})),n}(0,a.query),a}},732:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.yeast=e.decode=e.encode=void 0;const n="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".split(""),r={};let o,s=0,i=0;function a(t){let e="";do{e=n[t%64]+e,t=Math.floor(t/64)}while(t>0);return e}for(e.encode=a,e.decode=function(t){let e=0;for(i=0;i<t.length;i++)e=64*e+r[t.charAt(i)];return e},e.yeast=function(){const t=a(+new Date);return t!==o?(s=0,o=t):t+"."+a(s++)};i<64;i++)r[n[i]]=i},6235:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.globalThisShim=void 0,e.globalThisShim="undefined"!=typeof self?self:"undefined"!=typeof window?window:Function("return this")()},4956:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.nextTick=e.parse=e.installTimerFunctions=e.transports=e.TransportError=e.Transport=e.protocol=e.Socket=void 0;const r=n(8223);Object.defineProperty(e,"Socket",{enumerable:!0,get:function(){return r.Socket}}),e.protocol=r.Socket.protocol;var o=n(4689);Object.defineProperty(e,"Transport",{enumerable:!0,get:function(){return o.Transport}}),Object.defineProperty(e,"TransportError",{enumerable:!0,get:function(){return o.TransportError}});var s=n(9419);Object.defineProperty(e,"transports",{enumerable:!0,get:function(){return s.transports}});var i=n(5374);Object.defineProperty(e,"installTimerFunctions",{enumerable:!0,get:function(){return i.installTimerFunctions}});var a=n(1015);Object.defineProperty(e,"parse",{enumerable:!0,get:function(){return a.parse}});var l=n(4087);Object.defineProperty(e,"nextTick",{enumerable:!0,get:function(){return l.nextTick}})},8223:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Socket=void 0;const o=n(9419),s=n(5374),i=n(8661),a=n(1015),l=r(n(7833)),c=n(7285),u=n(6376),h=n(4087),p=(0,l.default)("engine.io-client:socket");class d extends c.Emitter{constructor(t,e={}){super(),this.binaryType=h.defaultBinaryType,this.writeBuffer=[],t&&"object"==typeof t&&(e=t,t=null),t?(t=(0,a.parse)(t),e.hostname=t.host,e.secure="https"===t.protocol||"wss"===t.protocol,e.port=t.port,t.query&&(e.query=t.query)):e.host&&(e.hostname=(0,a.parse)(e.host).host),(0,s.installTimerFunctions)(this,e),this.secure=null!=e.secure?e.secure:"undefined"!=typeof location&&"https:"===location.protocol,e.hostname&&!e.port&&(e.port=this.secure?"443":"80"),this.hostname=e.hostname||("undefined"!=typeof location?location.hostname:"localhost"),this.port=e.port||("undefined"!=typeof location&&location.port?location.port:this.secure?"443":"80"),this.transports=e.transports||["polling","websocket","webtransport"],this.writeBuffer=[],this.prevBufferLen=0,this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},e),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),"string"==typeof this.opts.query&&(this.opts.query=(0,i.decode)(this.opts.query)),this.id=null,this.upgrades=null,this.pingInterval=null,this.pingTimeout=null,this.pingTimeoutTimer=null,"function"==typeof addEventListener&&(this.opts.closeOnBeforeunload&&(this.beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this.beforeunloadEventListener,!1)),"localhost"!==this.hostname&&(this.offlineEventListener=()=>{this.onClose("transport close",{description:"network connection lost"})},addEventListener("offline",this.offlineEventListener,!1))),this.open()}createTransport(t){p('creating transport "%s"',t);const e=Object.assign({},this.opts.query);e.EIO=u.protocol,e.transport=t,this.id&&(e.sid=this.id);const n=Object.assign({},this.opts,{query:e,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[t]);return p("options: %j",n),new o.transports[t](n)}open(){let t;if(this.opts.rememberUpgrade&&d.priorWebsocketSuccess&&-1!==this.transports.indexOf("websocket"))t="websocket";else{if(0===this.transports.length)return void this.setTimeoutFn((()=>{this.emitReserved("error","No transports available")}),0);t=this.transports[0]}this.readyState="opening";try{t=this.createTransport(t)}catch(t){return p("error while creating transport: %s",t),this.transports.shift(),void this.open()}t.open(),this.setTransport(t)}setTransport(t){p("setting transport %s",t.name),this.transport&&(p("clearing existing transport %s",this.transport.name),this.transport.removeAllListeners()),this.transport=t,t.on("drain",this.onDrain.bind(this)).on("packet",this.onPacket.bind(this)).on("error",this.onError.bind(this)).on("close",(t=>this.onClose("transport close",t)))}probe(t){p('probing transport "%s"',t);let e=this.createTransport(t),n=!1;d.priorWebsocketSuccess=!1;const r=()=>{n||(p('probe transport "%s" opened',t),e.send([{type:"ping",data:"probe"}]),e.once("packet",(r=>{if(!n)if("pong"===r.type&&"probe"===r.data){if(p('probe transport "%s" pong',t),this.upgrading=!0,this.emitReserved("upgrading",e),!e)return;d.priorWebsocketSuccess="websocket"===e.name,p('pausing current transport "%s"',this.transport.name),this.transport.pause((()=>{n||"closed"!==this.readyState&&(p("changing transport and sending upgrade packet"),c(),this.setTransport(e),e.send([{type:"upgrade"}]),this.emitReserved("upgrade",e),e=null,this.upgrading=!1,this.flush())}))}else{p('probe transport "%s" failed',t);const n=new Error("probe error");n.transport=e.name,this.emitReserved("upgradeError",n)}})))};function o(){n||(n=!0,c(),e.close(),e=null)}const s=n=>{const r=new Error("probe error: "+n);r.transport=e.name,o(),p('probe transport "%s" failed because of error: %s',t,n),this.emitReserved("upgradeError",r)};function i(){s("transport closed")}function a(){s("socket closed")}function l(t){e&&t.name!==e.name&&(p('"%s" works - aborting "%s"',t.name,e.name),o())}const c=()=>{e.removeListener("open",r),e.removeListener("error",s),e.removeListener("close",i),this.off("close",a),this.off("upgrading",l)};e.once("open",r),e.once("error",s),e.once("close",i),this.once("close",a),this.once("upgrading",l),-1!==this.upgrades.indexOf("webtransport")&&"webtransport"!==t?this.setTimeoutFn((()=>{n||e.open()}),200):e.open()}onOpen(){if(p("socket open"),this.readyState="open",d.priorWebsocketSuccess="websocket"===this.transport.name,this.emitReserved("open"),this.flush(),"open"===this.readyState&&this.opts.upgrade){p("starting upgrade probes");let t=0;const e=this.upgrades.length;for(;t<e;t++)this.probe(this.upgrades[t])}}onPacket(t){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState)switch(p('socket receive: type "%s", data "%s"',t.type,t.data),this.emitReserved("packet",t),this.emitReserved("heartbeat"),this.resetPingTimeout(),t.type){case"open":this.onHandshake(JSON.parse(t.data));break;case"ping":this.sendPacket("pong"),this.emitReserved("ping"),this.emitReserved("pong");break;case"error":const e=new Error("server error");e.code=t.data,this.onError(e);break;case"message":this.emitReserved("data",t.data),this.emitReserved("message",t.data)}else p('packet received with socket readyState "%s"',this.readyState)}onHandshake(t){this.emitReserved("handshake",t),this.id=t.sid,this.transport.query.sid=t.sid,this.upgrades=this.filterUpgrades(t.upgrades),this.pingInterval=t.pingInterval,this.pingTimeout=t.pingTimeout,this.maxPayload=t.maxPayload,this.onOpen(),"closed"!==this.readyState&&this.resetPingTimeout()}resetPingTimeout(){this.clearTimeoutFn(this.pingTimeoutTimer),this.pingTimeoutTimer=this.setTimeoutFn((()=>{this.onClose("ping timeout")}),this.pingInterval+this.pingTimeout),this.opts.autoUnref&&this.pingTimeoutTimer.unref()}onDrain(){this.writeBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,0===this.writeBuffer.length?this.emitReserved("drain"):this.flush()}flush(){if("closed"!==this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){const t=this.getWritablePackets();p("flushing %d packets in socket",t.length),this.transport.send(t),this.prevBufferLen=t.length,this.emitReserved("flush")}}getWritablePackets(){if(!(this.maxPayload&&"polling"===this.transport.name&&this.writeBuffer.length>1))return this.writeBuffer;let t=1;for(let e=0;e<this.writeBuffer.length;e++){const n=this.writeBuffer[e].data;if(n&&(t+=(0,s.byteLength)(n)),e>0&&t>this.maxPayload)return p("only send %d out of %d packets",e,this.writeBuffer.length),this.writeBuffer.slice(0,e);t+=2}return p("payload size is %d (max: %d)",t,this.maxPayload),this.writeBuffer}write(t,e,n){return this.sendPacket("message",t,e,n),this}send(t,e,n){return this.sendPacket("message",t,e,n),this}sendPacket(t,e,n,r){if("function"==typeof e&&(r=e,e=void 0),"function"==typeof n&&(r=n,n=null),"closing"===this.readyState||"closed"===this.readyState)return;(n=n||{}).compress=!1!==n.compress;const o={type:t,data:e,options:n};this.emitReserved("packetCreate",o),this.writeBuffer.push(o),r&&this.once("flush",r),this.flush()}close(){const t=()=>{this.onClose("forced close"),p("socket closing - telling transport to close"),this.transport.close()},e=()=>{this.off("upgrade",e),this.off("upgradeError",e),t()},n=()=>{this.once("upgrade",e),this.once("upgradeError",e)};return"opening"!==this.readyState&&"open"!==this.readyState||(this.readyState="closing",this.writeBuffer.length?this.once("drain",(()=>{this.upgrading?n():t()})):this.upgrading?n():t()),this}onError(t){p("socket error %j",t),d.priorWebsocketSuccess=!1,this.emitReserved("error",t),this.onClose("transport error",t)}onClose(t,e){"opening"!==this.readyState&&"open"!==this.readyState&&"closing"!==this.readyState||(p('socket close with reason: "%s"',t),this.clearTimeoutFn(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),"function"==typeof removeEventListener&&(removeEventListener("beforeunload",this.beforeunloadEventListener,!1),removeEventListener("offline",this.offlineEventListener,!1)),this.readyState="closed",this.id=null,this.emitReserved("close",t,e),this.writeBuffer=[],this.prevBufferLen=0)}filterUpgrades(t){const e=[];let n=0;const r=t.length;for(;n<r;n++)~this.transports.indexOf(t[n])&&e.push(t[n]);return e}}e.Socket=d,d.protocol=u.protocol},4689:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Transport=e.TransportError=void 0;const o=n(6376),s=n(7285),i=n(5374),a=r(n(7833)),l=n(8661),c=(0,a.default)("engine.io-client:transport");class u extends Error{constructor(t,e,n){super(t),this.description=e,this.context=n,this.type="TransportError"}}e.TransportError=u;class h extends s.Emitter{constructor(t){super(),this.writable=!1,(0,i.installTimerFunctions)(this,t),this.opts=t,this.query=t.query,this.socket=t.socket}onError(t,e,n){return super.emitReserved("error",new u(t,e,n)),this}open(){return this.readyState="opening",this.doOpen(),this}close(){return"opening"!==this.readyState&&"open"!==this.readyState||(this.doClose(),this.onClose()),this}send(t){"open"===this.readyState?this.write(t):c("transport is not open, discarding packets")}onOpen(){this.readyState="open",this.writable=!0,super.emitReserved("open")}onData(t){const e=(0,o.decodePacket)(t,this.socket.binaryType);this.onPacket(e)}onPacket(t){super.emitReserved("packet",t)}onClose(t){this.readyState="closed",super.emitReserved("close",t)}pause(t){}createUri(t,e={}){return t+"://"+this._hostname()+this._port()+this.opts.path+this._query(e)}_hostname(){const t=this.opts.hostname;return-1===t.indexOf(":")?t:"["+t+"]"}_port(){return this.opts.port&&(this.opts.secure&&Number(443!==this.opts.port)||!this.opts.secure&&80!==Number(this.opts.port))?":"+this.opts.port:""}_query(t){const e=(0,l.encode)(t);return e.length?"?"+e:""}}e.Transport=h},9419:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.transports=void 0;const r=n(528),o=n(8716),s=n(4480);e.transports={websocket:o.WS,webtransport:s.WT,polling:r.Polling}},528:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Request=e.Polling=void 0;const o=n(4689),s=r(n(7833)),i=n(732),a=n(6376),l=n(3519),c=n(7285),u=n(5374),h=n(6235),p=(0,s.default)("engine.io-client:polling");function d(){}const f=null!=new l.XHR({xdomain:!1}).responseType;class m extends o.Transport{constructor(t){if(super(t),this.polling=!1,"undefined"!=typeof location){const e="https:"===location.protocol;let n=location.port;n||(n=e?"443":"80"),this.xd="undefined"!=typeof location&&t.hostname!==location.hostname||n!==t.port}const e=t&&t.forceBase64;this.supportsBinary=f&&!e,this.opts.withCredentials&&(this.cookieJar=(0,l.createCookieJar)())}get name(){return"polling"}doOpen(){this.poll()}pause(t){this.readyState="pausing";const e=()=>{p("paused"),this.readyState="paused",t()};if(this.polling||!this.writable){let t=0;this.polling&&(p("we are currently polling - waiting to pause"),t++,this.once("pollComplete",(function(){p("pre-pause polling complete"),--t||e()}))),this.writable||(p("we are currently writing - waiting to pause"),t++,this.once("drain",(function(){p("pre-pause writing complete"),--t||e()})))}else e()}poll(){p("polling"),this.polling=!0,this.doPoll(),this.emitReserved("poll")}onData(t){p("polling got data %s",t),(0,a.decodePayload)(t,this.socket.binaryType).forEach((t=>{if("opening"===this.readyState&&"open"===t.type&&this.onOpen(),"close"===t.type)return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(t)})),"closed"!==this.readyState&&(this.polling=!1,this.emitReserved("pollComplete"),"open"===this.readyState?this.poll():p('ignoring poll - transport state "%s"',this.readyState))}doClose(){const t=()=>{p("writing close packet"),this.write([{type:"close"}])};"open"===this.readyState?(p("transport open - closing"),t()):(p("transport not open - deferring close"),this.once("open",t))}write(t){this.writable=!1,(0,a.encodePayload)(t,(t=>{this.doWrite(t,(()=>{this.writable=!0,this.emitReserved("drain")}))}))}uri(){const t=this.opts.secure?"https":"http",e=this.query||{};return!1!==this.opts.timestampRequests&&(e[this.opts.timestampParam]=(0,i.yeast)()),this.supportsBinary||e.sid||(e.b64=1),this.createUri(t,e)}request(t={}){return Object.assign(t,{xd:this.xd,cookieJar:this.cookieJar},this.opts),new g(this.uri(),t)}doWrite(t,e){const n=this.request({method:"POST",data:t});n.on("success",e),n.on("error",((t,e)=>{this.onError("xhr post error",t,e)}))}doPoll(){p("xhr poll");const t=this.request();t.on("data",this.onData.bind(this)),t.on("error",((t,e)=>{this.onError("xhr poll error",t,e)})),this.pollXhr=t}}e.Polling=m;class g extends c.Emitter{constructor(t,e){super(),(0,u.installTimerFunctions)(this,e),this.opts=e,this.method=e.method||"GET",this.uri=t,this.data=void 0!==e.data?e.data:null,this.create()}create(){var t;const e=(0,u.pick)(this.opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");e.xdomain=!!this.opts.xd;const n=this.xhr=new l.XHR(e);try{p("xhr open %s: %s",this.method,this.uri),n.open(this.method,this.uri,!0);try{if(this.opts.extraHeaders){n.setDisableHeaderCheck&&n.setDisableHeaderCheck(!0);for(let t in this.opts.extraHeaders)this.opts.extraHeaders.hasOwnProperty(t)&&n.setRequestHeader(t,this.opts.extraHeaders[t])}}catch(t){}if("POST"===this.method)try{n.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(t){}try{n.setRequestHeader("Accept","*/*")}catch(t){}null===(t=this.opts.cookieJar)||void 0===t||t.addCookies(n),"withCredentials"in n&&(n.withCredentials=this.opts.withCredentials),this.opts.requestTimeout&&(n.timeout=this.opts.requestTimeout),n.onreadystatechange=()=>{var t;3===n.readyState&&(null===(t=this.opts.cookieJar)||void 0===t||t.parseCookies(n)),4===n.readyState&&(200===n.status||1223===n.status?this.onLoad():this.setTimeoutFn((()=>{this.onError("number"==typeof n.status?n.status:0)}),0))},p("xhr data %s",this.data),n.send(this.data)}catch(t){return void this.setTimeoutFn((()=>{this.onError(t)}),0)}"undefined"!=typeof document&&(this.index=g.requestsCount++,g.requests[this.index]=this)}onError(t){this.emitReserved("error",t,this.xhr),this.cleanup(!0)}cleanup(t){if(void 0!==this.xhr&&null!==this.xhr){if(this.xhr.onreadystatechange=d,t)try{this.xhr.abort()}catch(t){}"undefined"!=typeof document&&delete g.requests[this.index],this.xhr=null}}onLoad(){const t=this.xhr.responseText;null!==t&&(this.emitReserved("data",t),this.emitReserved("success"),this.cleanup())}abort(){this.cleanup()}}if(e.Request=g,g.requestsCount=0,g.requests={},"undefined"!=typeof document)if("function"==typeof attachEvent)attachEvent("onunload",y);else if("function"==typeof addEventListener){const t="onpagehide"in h.globalThisShim?"pagehide":"unload";addEventListener(t,y,!1)}function y(){for(let t in g.requests)g.requests.hasOwnProperty(t)&&g.requests[t].abort()}},4087:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.defaultBinaryType=e.usingBrowserWebSocket=e.WebSocket=e.nextTick=void 0;const r=n(6235);e.nextTick="function"==typeof Promise&&"function"==typeof Promise.resolve?t=>Promise.resolve().then(t):(t,e)=>e(t,0),e.WebSocket=r.globalThisShim.WebSocket||r.globalThisShim.MozWebSocket,e.usingBrowserWebSocket=!0,e.defaultBinaryType="arraybuffer"},8716:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.WS=void 0;const o=n(4689),s=n(732),i=n(5374),a=n(4087),l=r(n(7833)),c=n(6376),u=(0,l.default)("engine.io-client:websocket"),h="undefined"!=typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase();class p extends o.Transport{constructor(t){super(t),this.supportsBinary=!t.forceBase64}get name(){return"websocket"}doOpen(){if(!this.check())return;const t=this.uri(),e=this.opts.protocols,n=h?{}:(0,i.pick)(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(n.headers=this.opts.extraHeaders);try{this.ws=a.usingBrowserWebSocket&&!h?e?new a.WebSocket(t,e):new a.WebSocket(t):new a.WebSocket(t,e,n)}catch(t){return this.emitReserved("error",t)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=t=>this.onClose({description:"websocket connection closed",context:t}),this.ws.onmessage=t=>this.onData(t.data),this.ws.onerror=t=>this.onError("websocket error",t)}write(t){this.writable=!1;for(let e=0;e<t.length;e++){const n=t[e],r=e===t.length-1;(0,c.encodePacket)(n,this.supportsBinary,(t=>{const e={};!a.usingBrowserWebSocket&&(n.options&&(e.compress=n.options.compress),this.opts.perMessageDeflate)&&("string"==typeof t?Buffer.byteLength(t):t.length)<this.opts.perMessageDeflate.threshold&&(e.compress=!1);try{a.usingBrowserWebSocket?this.ws.send(t):this.ws.send(t,e)}catch(t){u("websocket closed before onclose event")}r&&(0,a.nextTick)((()=>{this.writable=!0,this.emitReserved("drain")}),this.setTimeoutFn)}))}}doClose(){void 0!==this.ws&&(this.ws.close(),this.ws=null)}uri(){const t=this.opts.secure?"wss":"ws",e=this.query||{};return this.opts.timestampRequests&&(e[this.opts.timestampParam]=(0,s.yeast)()),this.supportsBinary||(e.b64=1),this.createUri(t,e)}check(){return!!a.WebSocket}}e.WS=p},4480:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.WT=void 0;const o=n(4689),s=n(4087),i=n(6376),a=(0,r(n(7833)).default)("engine.io-client:webtransport");class l extends o.Transport{get name(){return"webtransport"}doOpen(){"function"==typeof WebTransport&&(this.transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name]),this.transport.closed.then((()=>{a("transport closed gracefully"),this.onClose()})).catch((t=>{a("transport closed due to %s",t),this.onError("webtransport error",t)})),this.transport.ready.then((()=>{this.transport.createBidirectionalStream().then((t=>{const e=(0,i.createPacketDecoderStream)(Number.MAX_SAFE_INTEGER,this.socket.binaryType),n=t.readable.pipeThrough(e).getReader(),r=(0,i.createPacketEncoderStream)();r.readable.pipeTo(t.writable),this.writer=r.writable.getWriter();const o=()=>{n.read().then((({done:t,value:e})=>{t?a("session is closed"):(a("received chunk: %o",e),this.onPacket(e),o())})).catch((t=>{a("an error occurred while reading: %s",t)}))};o();const s={type:"open"};this.query.sid&&(s.data=`{"sid":"${this.query.sid}"}`),this.writer.write(s).then((()=>this.onOpen()))}))})))}write(t){this.writable=!1;for(let e=0;e<t.length;e++){const n=t[e],r=e===t.length-1;this.writer.write(n).then((()=>{r&&(0,s.nextTick)((()=>{this.writable=!0,this.emitReserved("drain")}),this.setTimeoutFn)}))}}doClose(){var t;null===(t=this.transport)||void 0===t||t.close()}}e.WT=l},3519:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createCookieJar=e.XHR=void 0;const r=n(4110),o=n(6235);e.XHR=function(t){const e=t.xdomain;try{if("undefined"!=typeof XMLHttpRequest&&(!e||r.hasCORS))return new XMLHttpRequest}catch(t){}if(!e)try{return new(o.globalThisShim[["Active"].concat("Object").join("X")])("Microsoft.XMLHTTP")}catch(t){}},e.createCookieJar=function(){}},5374:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.byteLength=e.installTimerFunctions=e.pick=void 0;const r=n(6235);e.pick=function(t,...e){return e.reduce(((e,n)=>(t.hasOwnProperty(n)&&(e[n]=t[n]),e)),{})};const o=r.globalThisShim.setTimeout,s=r.globalThisShim.clearTimeout;e.installTimerFunctions=function(t,e){e.useNativeTimers?(t.setTimeoutFn=o.bind(r.globalThisShim),t.clearTimeoutFn=s.bind(r.globalThisShim)):(t.setTimeoutFn=r.globalThisShim.setTimeout.bind(r.globalThisShim),t.clearTimeoutFn=r.globalThisShim.clearTimeout.bind(r.globalThisShim))},e.byteLength=function(t){return"string"==typeof t?function(t){let e=0,n=0;for(let r=0,o=t.length;r<o;r++)e=t.charCodeAt(r),e<128?n+=1:e<2048?n+=2:e<55296||e>=57344?n+=3:(r++,n+=4);return n}(t):Math.ceil(1.33*(t.byteLength||t.size))}},2046:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ERROR_PACKET=e.PACKET_TYPES_REVERSE=e.PACKET_TYPES=void 0;const n=Object.create(null);e.PACKET_TYPES=n,n.open="0",n.close="1",n.ping="2",n.pong="3",n.message="4",n.upgrade="5",n.noop="6";const r=Object.create(null);e.PACKET_TYPES_REVERSE=r,Object.keys(n).forEach((t=>{r[n[t]]=t})),e.ERROR_PACKET={type:"error",data:"parser error"}},2745:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.decode=e.encode=void 0;const n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r="undefined"==typeof Uint8Array?[]:new Uint8Array(256);for(let t=0;t<64;t++)r[n.charCodeAt(t)]=t;e.encode=t=>{let e,r=new Uint8Array(t),o=r.length,s="";for(e=0;e<o;e+=3)s+=n[r[e]>>2],s+=n[(3&r[e])<<4|r[e+1]>>4],s+=n[(15&r[e+1])<<2|r[e+2]>>6],s+=n[63&r[e+2]];return o%3==2?s=s.substring(0,s.length-1)+"=":o%3==1&&(s=s.substring(0,s.length-2)+"=="),s},e.decode=t=>{let e,n,o,s,i,a=.75*t.length,l=t.length,c=0;"="===t[t.length-1]&&(a--,"="===t[t.length-2]&&a--);const u=new ArrayBuffer(a),h=new Uint8Array(u);for(e=0;e<l;e+=4)n=r[t.charCodeAt(e)],o=r[t.charCodeAt(e+1)],s=r[t.charCodeAt(e+2)],i=r[t.charCodeAt(e+3)],h[c++]=n<<2|o>>4,h[c++]=(15&o)<<4|s>>2,h[c++]=(3&s)<<6|63&i;return u}},2662:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.decodePacket=void 0;const r=n(2046),o=n(2745),s="function"==typeof ArrayBuffer;e.decodePacket=(t,e)=>{if("string"!=typeof t)return{type:"message",data:a(t,e)};const n=t.charAt(0);return"b"===n?{type:"message",data:i(t.substring(1),e)}:r.PACKET_TYPES_REVERSE[n]?t.length>1?{type:r.PACKET_TYPES_REVERSE[n],data:t.substring(1)}:{type:r.PACKET_TYPES_REVERSE[n]}:r.ERROR_PACKET};const i=(t,e)=>{if(s){const n=(0,o.decode)(t);return a(n,e)}return{base64:!0,data:t}},a=(t,e)=>"blob"===e?t instanceof Blob?t:new Blob([t]):t instanceof ArrayBuffer?t:t.buffer},2686:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.encodePacket=e.encodePacketToBinary=void 0;const r=n(2046),o="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===Object.prototype.toString.call(Blob),s="function"==typeof ArrayBuffer,i=t=>"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer instanceof ArrayBuffer,a=({type:t,data:e},n,a)=>o&&e instanceof Blob?n?a(e):l(e,a):s&&(e instanceof ArrayBuffer||i(e))?n?a(e):l(new Blob([e]),a):a(r.PACKET_TYPES[t]+(e||""));e.encodePacket=a;const l=(t,e)=>{const n=new FileReader;return n.onload=function(){const t=n.result.split(",")[1];e("b"+(t||""))},n.readAsDataURL(t)};function c(t){return t instanceof Uint8Array?t:t instanceof ArrayBuffer?new Uint8Array(t):new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}let u;e.encodePacketToBinary=function(t,e){return o&&t.data instanceof Blob?t.data.arrayBuffer().then(c).then(e):s&&(t.data instanceof ArrayBuffer||i(t.data))?e(c(t.data)):void a(t,!1,(t=>{u||(u=new TextEncoder),e(u.encode(t))}))}},6376:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.decodePayload=e.decodePacket=e.encodePayload=e.encodePacket=e.protocol=e.createPacketDecoderStream=e.createPacketEncoderStream=void 0;const r=n(2686);Object.defineProperty(e,"encodePacket",{enumerable:!0,get:function(){return r.encodePacket}});const o=n(2662);Object.defineProperty(e,"decodePacket",{enumerable:!0,get:function(){return o.decodePacket}});const s=n(2046),i=String.fromCharCode(30);let a;function l(t){return t.reduce(((t,e)=>t+e.length),0)}function c(t,e){if(t[0].length===e)return t.shift();const n=new Uint8Array(e);let r=0;for(let o=0;o<e;o++)n[o]=t[0][r++],r===t[0].length&&(t.shift(),r=0);return t.length&&r<t[0].length&&(t[0]=t[0].slice(r)),n}e.encodePayload=(t,e)=>{const n=t.length,o=new Array(n);let s=0;t.forEach(((t,a)=>{(0,r.encodePacket)(t,!1,(t=>{o[a]=t,++s===n&&e(o.join(i))}))}))},e.decodePayload=(t,e)=>{const n=t.split(i),r=[];for(let t=0;t<n.length;t++){const s=(0,o.decodePacket)(n[t],e);if(r.push(s),"error"===s.type)break}return r},e.createPacketEncoderStream=function(){return new TransformStream({transform(t,e){(0,r.encodePacketToBinary)(t,(n=>{const r=n.length;let o;if(r<126)o=new Uint8Array(1),new DataView(o.buffer).setUint8(0,r);else if(r<65536){o=new Uint8Array(3);const t=new DataView(o.buffer);t.setUint8(0,126),t.setUint16(1,r)}else{o=new Uint8Array(9);const t=new DataView(o.buffer);t.setUint8(0,127),t.setBigUint64(1,BigInt(r))}t.data&&"string"!=typeof t.data&&(o[0]|=128),e.enqueue(o),e.enqueue(n)}))}})},e.createPacketDecoderStream=function(t,e){a||(a=new TextDecoder);const n=[];let r=0,i=-1,u=!1;return new TransformStream({transform(h,p){for(n.push(h);;){if(0===r){if(l(n)<1)break;const t=c(n,1);u=!(128&~t[0]),i=127&t[0],r=i<126?3:126===i?1:2}else if(1===r){if(l(n)<2)break;const t=c(n,2);i=new DataView(t.buffer,t.byteOffset,t.length).getUint16(0),r=3}else if(2===r){if(l(n)<8)break;const t=c(n,8),e=new DataView(t.buffer,t.byteOffset,t.length),o=e.getUint32(0);if(o>Math.pow(2,21)-1){p.enqueue(s.ERROR_PACKET);break}i=o*Math.pow(2,32)+e.getUint32(4),r=3}else{if(l(n)<i)break;const t=c(n,i);p.enqueue((0,o.decodePacket)(u?t:a.decode(t),e)),r=0}if(0===i||i>t){p.enqueue(s.ERROR_PACKET);break}}}})},e.protocol=4},7743:(t,e)=>{"use strict";function n(t){t=t||{},this.ms=t.min||100,this.max=t.max||1e4,this.factor=t.factor||2,this.jitter=t.jitter>0&&t.jitter<=1?t.jitter:0,this.attempts=0}Object.defineProperty(e,"__esModule",{value:!0}),e.Backoff=void 0,e.Backoff=n,n.prototype.duration=function(){var t=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var e=Math.random(),n=Math.floor(e*this.jitter*t);t=1&Math.floor(10*e)?t+n:t-n}return 0|Math.min(t,this.max)},n.prototype.reset=function(){this.attempts=0},n.prototype.setMin=function(t){this.ms=t},n.prototype.setMax=function(t){this.max=t},n.prototype.setJitter=function(t){this.jitter=t}},8007:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.connect=e.io=e.Socket=e.Manager=e.protocol=void 0;const o=n(6894),s=n(3776);Object.defineProperty(e,"Manager",{enumerable:!0,get:function(){return s.Manager}});const i=n(6214);Object.defineProperty(e,"Socket",{enumerable:!0,get:function(){return i.Socket}});const a=r(n(7833)).default("socket.io-client"),l={};function c(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};const n=o.url(t,e.path||"/socket.io"),r=n.source,i=n.id,c=n.path,u=l[i]&&c in l[i].nsps;let h;return e.forceNew||e["force new connection"]||!1===e.multiplex||u?(a("ignoring socket cache for %s",r),h=new s.Manager(r,e)):(l[i]||(a("new io instance for %s",r),l[i]=new s.Manager(r,e)),h=l[i]),n.query&&!e.query&&(e.query=n.queryKey),h.socket(n.path,e)}e.io=c,e.connect=c,e.default=c,Object.assign(c,{Manager:s.Manager,Socket:i.Socket,io:c,connect:c});var u=n(4627);Object.defineProperty(e,"protocol",{enumerable:!0,get:function(){return u.protocol}}),t.exports=c},3776:function(t,e,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&r(e,t,n);return o(e,t),e},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Manager=void 0;const a=n(4956),l=n(6214),c=s(n(4627)),u=n(5942),h=n(7743),p=n(7285),d=i(n(7833)).default("socket.io-client:manager");class f extends p.Emitter{constructor(t,e){var n;super(),this.nsps={},this.subs=[],t&&"object"==typeof t&&(e=t,t=void 0),(e=e||{}).path=e.path||"/socket.io",this.opts=e,a.installTimerFunctions(this,e),this.reconnection(!1!==e.reconnection),this.reconnectionAttempts(e.reconnectionAttempts||1/0),this.reconnectionDelay(e.reconnectionDelay||1e3),this.reconnectionDelayMax(e.reconnectionDelayMax||5e3),this.randomizationFactor(null!==(n=e.randomizationFactor)&&void 0!==n?n:.5),this.backoff=new h.Backoff({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(null==e.timeout?2e4:e.timeout),this._readyState="closed",this.uri=t;const r=e.parser||c;this.encoder=new r.Encoder,this.decoder=new r.Decoder,this._autoConnect=!1!==e.autoConnect,this._autoConnect&&this.open()}reconnection(t){return arguments.length?(this._reconnection=!!t,this):this._reconnection}reconnectionAttempts(t){return void 0===t?this._reconnectionAttempts:(this._reconnectionAttempts=t,this)}reconnectionDelay(t){var e;return void 0===t?this._reconnectionDelay:(this._reconnectionDelay=t,null===(e=this.backoff)||void 0===e||e.setMin(t),this)}randomizationFactor(t){var e;return void 0===t?this._randomizationFactor:(this._randomizationFactor=t,null===(e=this.backoff)||void 0===e||e.setJitter(t),this)}reconnectionDelayMax(t){var e;return void 0===t?this._reconnectionDelayMax:(this._reconnectionDelayMax=t,null===(e=this.backoff)||void 0===e||e.setMax(t),this)}timeout(t){return arguments.length?(this._timeout=t,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()}open(t){if(d("readyState %s",this._readyState),~this._readyState.indexOf("open"))return this;d("opening %s",this.uri),this.engine=new a.Socket(this.uri,this.opts);const e=this.engine,n=this;this._readyState="opening",this.skipReconnect=!1;const r=u.on(e,"open",(function(){n.onopen(),t&&t()})),o=e=>{d("error"),this.cleanup(),this._readyState="closed",this.emitReserved("error",e),t?t(e):this.maybeReconnectOnOpen()},s=u.on(e,"error",o);if(!1!==this._timeout){const t=this._timeout;d("connect attempt will timeout after %d",t);const n=this.setTimeoutFn((()=>{d("connect attempt timed out after %d",t),r(),o(new Error("timeout")),e.close()}),t);this.opts.autoUnref&&n.unref(),this.subs.push((()=>{this.clearTimeoutFn(n)}))}return this.subs.push(r),this.subs.push(s),this}connect(t){return this.open(t)}onopen(){d("open"),this.cleanup(),this._readyState="open",this.emitReserved("open");const t=this.engine;this.subs.push(u.on(t,"ping",this.onping.bind(this)),u.on(t,"data",this.ondata.bind(this)),u.on(t,"error",this.onerror.bind(this)),u.on(t,"close",this.onclose.bind(this)),u.on(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(t){try{this.decoder.add(t)}catch(t){this.onclose("parse error",t)}}ondecoded(t){a.nextTick((()=>{this.emitReserved("packet",t)}),this.setTimeoutFn)}onerror(t){d("error",t),this.emitReserved("error",t)}socket(t,e){let n=this.nsps[t];return n?this._autoConnect&&!n.active&&n.connect():(n=new l.Socket(this,t,e),this.nsps[t]=n),n}_destroy(t){const e=Object.keys(this.nsps);for(const t of e)if(this.nsps[t].active)return void d("socket %s is still active, skipping close",t);this._close()}_packet(t){d("writing packet %j",t);const e=this.encoder.encode(t);for(let n=0;n<e.length;n++)this.engine.write(e[n],t.options)}cleanup(){d("cleanup"),this.subs.forEach((t=>t())),this.subs.length=0,this.decoder.destroy()}_close(){d("disconnect"),this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close"),this.engine&&this.engine.close()}disconnect(){return this._close()}onclose(t,e){d("closed due to %s",t),this.cleanup(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",t,e),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;const t=this;if(this.backoff.attempts>=this._reconnectionAttempts)d("reconnect failed"),this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{const e=this.backoff.duration();d("will wait %dms before reconnect attempt",e),this._reconnecting=!0;const n=this.setTimeoutFn((()=>{t.skipReconnect||(d("attempting reconnect"),this.emitReserved("reconnect_attempt",t.backoff.attempts),t.skipReconnect||t.open((e=>{e?(d("reconnect attempt error"),t._reconnecting=!1,t.reconnect(),this.emitReserved("reconnect_error",e)):(d("reconnect success"),t.onreconnect())})))}),e);this.opts.autoUnref&&n.unref(),this.subs.push((()=>{this.clearTimeoutFn(n)}))}}onreconnect(){const t=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",t)}}e.Manager=f},5942:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.on=void 0,e.on=function(t,e,n){return t.on(e,n),function(){t.off(e,n)}}},6214:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Socket=void 0;const o=n(4627),s=n(5942),i=n(7285),a=r(n(7833)).default("socket.io-client:socket"),l=Object.freeze({connect:1,connect_error:1,disconnect:1,disconnecting:1,newListener:1,removeListener:1});class c extends i.Emitter{constructor(t,e,n){super(),this.connected=!1,this.recovered=!1,this.receiveBuffer=[],this.sendBuffer=[],this._queue=[],this._queueSeq=0,this.ids=0,this.acks={},this.flags={},this.io=t,this.nsp=e,n&&n.auth&&(this.auth=n.auth),this._opts=Object.assign({},n),this.io._autoConnect&&this.open()}get disconnected(){return!this.connected}subEvents(){if(this.subs)return;const t=this.io;this.subs=[s.on(t,"open",this.onopen.bind(this)),s.on(t,"packet",this.onpacket.bind(this)),s.on(t,"error",this.onerror.bind(this)),s.on(t,"close",this.onclose.bind(this))]}get active(){return!!this.subs}connect(){return this.connected||(this.subEvents(),this.io._reconnecting||this.io.open(),"open"===this.io._readyState&&this.onopen()),this}open(){return this.connect()}send(...t){return t.unshift("message"),this.emit.apply(this,t),this}emit(t,...e){if(l.hasOwnProperty(t))throw new Error('"'+t.toString()+'" is a reserved event name');if(e.unshift(t),this._opts.retries&&!this.flags.fromQueue&&!this.flags.volatile)return this._addToQueue(e),this;const n={type:o.PacketType.EVENT,data:e,options:{}};if(n.options.compress=!1!==this.flags.compress,"function"==typeof e[e.length-1]){const t=this.ids++;a("emitting packet with ack id %d",t);const r=e.pop();this._registerAckCallback(t,r),n.id=t}const r=this.io.engine&&this.io.engine.transport&&this.io.engine.transport.writable;return!this.flags.volatile||r&&this.connected?this.connected?(this.notifyOutgoingListeners(n),this.packet(n)):this.sendBuffer.push(n):a("discard packet as the transport is not currently writable"),this.flags={},this}_registerAckCallback(t,e){var n;const r=null!==(n=this.flags.timeout)&&void 0!==n?n:this._opts.ackTimeout;if(void 0===r)return void(this.acks[t]=e);const o=this.io.setTimeoutFn((()=>{delete this.acks[t];for(let e=0;e<this.sendBuffer.length;e++)this.sendBuffer[e].id===t&&(a("removing packet with ack id %d from the buffer",t),this.sendBuffer.splice(e,1));a("event with ack id %d has timed out after %d ms",t,r),e.call(this,new Error("operation has timed out"))}),r),s=(...t)=>{this.io.clearTimeoutFn(o),e.apply(this,t)};s.withError=!0,this.acks[t]=s}emitWithAck(t,...e){return new Promise(((n,r)=>{const o=(t,e)=>t?r(t):n(e);o.withError=!0,e.push(o),this.emit(t,...e)}))}_addToQueue(t){let e;"function"==typeof t[t.length-1]&&(e=t.pop());const n={id:this._queueSeq++,tryCount:0,pending:!1,args:t,flags:Object.assign({fromQueue:!0},this.flags)};t.push(((t,...r)=>{if(n===this._queue[0])return null!==t?n.tryCount>this._opts.retries&&(a("packet [%d] is discarded after %d tries",n.id,n.tryCount),this._queue.shift(),e&&e(t)):(a("packet [%d] was successfully sent",n.id),this._queue.shift(),e&&e(null,...r)),n.pending=!1,this._drainQueue()})),this._queue.push(n),this._drainQueue()}_drainQueue(t=!1){if(a("draining queue"),!this.connected||0===this._queue.length)return;const e=this._queue[0];!e.pending||t?(e.pending=!0,e.tryCount++,a("sending packet [%d] (try n°%d)",e.id,e.tryCount),this.flags=e.flags,this.emit.apply(this,e.args)):a("packet [%d] has already been sent and is waiting for an ack",e.id)}packet(t){t.nsp=this.nsp,this.io._packet(t)}onopen(){a("transport is open - connecting"),"function"==typeof this.auth?this.auth((t=>{this._sendConnectPacket(t)})):this._sendConnectPacket(this.auth)}_sendConnectPacket(t){this.packet({type:o.PacketType.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},t):t})}onerror(t){this.connected||this.emitReserved("connect_error",t)}onclose(t,e){a("close (%s)",t),this.connected=!1,delete this.id,this.emitReserved("disconnect",t,e),this._clearAcks()}_clearAcks(){Object.keys(this.acks).forEach((t=>{if(!this.sendBuffer.some((e=>String(e.id)===t))){const e=this.acks[t];delete this.acks[t],e.withError&&e.call(this,new Error("socket has been disconnected"))}}))}onpacket(t){if(t.nsp===this.nsp)switch(t.type){case o.PacketType.CONNECT:t.data&&t.data.sid?this.onconnect(t.data.sid,t.data.pid):this.emitReserved("connect_error",new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case o.PacketType.EVENT:case o.PacketType.BINARY_EVENT:this.onevent(t);break;case o.PacketType.ACK:case o.PacketType.BINARY_ACK:this.onack(t);break;case o.PacketType.DISCONNECT:this.ondisconnect();break;case o.PacketType.CONNECT_ERROR:this.destroy();const e=new Error(t.data.message);e.data=t.data.data,this.emitReserved("connect_error",e)}}onevent(t){const e=t.data||[];a("emitting event %j",e),null!=t.id&&(a("attaching ack callback to event"),e.push(this.ack(t.id))),this.connected?this.emitEvent(e):this.receiveBuffer.push(Object.freeze(e))}emitEvent(t){if(this._anyListeners&&this._anyListeners.length){const e=this._anyListeners.slice();for(const n of e)n.apply(this,t)}super.emit.apply(this,t),this._pid&&t.length&&"string"==typeof t[t.length-1]&&(this._lastOffset=t[t.length-1])}ack(t){const e=this;let n=!1;return function(...r){n||(n=!0,a("sending ack %j",r),e.packet({type:o.PacketType.ACK,id:t,data:r}))}}onack(t){const e=this.acks[t.id];"function"==typeof e?(delete this.acks[t.id],a("calling ack %s with %j",t.id,t.data),e.withError&&t.data.unshift(null),e.apply(this,t.data)):a("bad ack %s",t.id)}onconnect(t,e){a("socket connected with id %s",t),this.id=t,this.recovered=e&&this._pid===e,this._pid=e,this.connected=!0,this.emitBuffered(),this.emitReserved("connect"),this._drainQueue(!0)}emitBuffered(){this.receiveBuffer.forEach((t=>this.emitEvent(t))),this.receiveBuffer=[],this.sendBuffer.forEach((t=>{this.notifyOutgoingListeners(t),this.packet(t)})),this.sendBuffer=[]}ondisconnect(){a("server disconnect (%s)",this.nsp),this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach((t=>t())),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&(a("performing disconnect (%s)",this.nsp),this.packet({type:o.PacketType.DISCONNECT})),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(t){return this.flags.compress=t,this}get volatile(){return this.flags.volatile=!0,this}timeout(t){return this.flags.timeout=t,this}onAny(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(t),this}prependAny(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(t),this}offAny(t){if(!this._anyListeners)return this;if(t){const e=this._anyListeners;for(let n=0;n<e.length;n++)if(t===e[n])return e.splice(n,1),this}else this._anyListeners=[];return this}listenersAny(){return this._anyListeners||[]}onAnyOutgoing(t){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.push(t),this}prependAnyOutgoing(t){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.unshift(t),this}offAnyOutgoing(t){if(!this._anyOutgoingListeners)return this;if(t){const e=this._anyOutgoingListeners;for(let n=0;n<e.length;n++)if(t===e[n])return e.splice(n,1),this}else this._anyOutgoingListeners=[];return this}listenersAnyOutgoing(){return this._anyOutgoingListeners||[]}notifyOutgoingListeners(t){if(this._anyOutgoingListeners&&this._anyOutgoingListeners.length){const e=this._anyOutgoingListeners.slice();for(const n of e)n.apply(this,t.data)}}}e.Socket=c},6894:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.url=void 0;const o=n(4956),s=r(n(7833)).default("socket.io-client:url");e.url=function(t,e="",n){let r=t;n=n||"undefined"!=typeof location&&location,null==t&&(t=n.protocol+"//"+n.host),"string"==typeof t&&("/"===t.charAt(0)&&(t="/"===t.charAt(1)?n.protocol+t:n.host+t),/^(https?|wss?):\/\//.test(t)||(s("protocol-less url %s",t),t=void 0!==n?n.protocol+"//"+t:"https://"+t),s("parse %s",t),r=o.parse(t)),r.port||(/^(http|ws)$/.test(r.protocol)?r.port="80":/^(http|ws)s$/.test(r.protocol)&&(r.port="443")),r.path=r.path||"/";const i=-1!==r.host.indexOf(":")?"["+r.host+"]":r.host;return r.id=r.protocol+"://"+i+":"+r.port+e,r.href=r.protocol+"://"+i+(n&&n.port===r.port?"":":"+r.port),r}},4926:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.reconstructPacket=e.deconstructPacket=void 0;const r=n(9133);function o(t,e){if(!t)return t;if((0,r.isBinary)(t)){const n={_placeholder:!0,num:e.length};return e.push(t),n}if(Array.isArray(t)){const n=new Array(t.length);for(let r=0;r<t.length;r++)n[r]=o(t[r],e);return n}if("object"==typeof t&&!(t instanceof Date)){const n={};for(const r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=o(t[r],e));return n}return t}function s(t,e){if(!t)return t;if(t&&!0===t._placeholder){if("number"==typeof t.num&&t.num>=0&&t.num<e.length)return e[t.num];throw new Error("illegal attachments")}if(Array.isArray(t))for(let n=0;n<t.length;n++)t[n]=s(t[n],e);else if("object"==typeof t)for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(t[n]=s(t[n],e));return t}e.deconstructPacket=function(t){const e=[],n=t.data,r=t;return r.data=o(n,e),r.attachments=e.length,{packet:r,buffers:e}},e.reconstructPacket=function(t,e){return t.data=s(t.data,e),delete t.attachments,t}},4627:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Decoder=e.Encoder=e.PacketType=e.protocol=void 0;const r=n(7285),o=n(4926),s=n(9133),i=(0,n(7833).default)("socket.io-parser"),a=["connect","connect_error","disconnect","disconnecting","newListener","removeListener"];var l;function c(t){return"[object Object]"===Object.prototype.toString.call(t)}e.protocol=5,function(t){t[t.CONNECT=0]="CONNECT",t[t.DISCONNECT=1]="DISCONNECT",t[t.EVENT=2]="EVENT",t[t.ACK=3]="ACK",t[t.CONNECT_ERROR=4]="CONNECT_ERROR",t[t.BINARY_EVENT=5]="BINARY_EVENT",t[t.BINARY_ACK=6]="BINARY_ACK"}(l=e.PacketType||(e.PacketType={})),e.Encoder=class{constructor(t){this.replacer=t}encode(t){return i("encoding packet %j",t),t.type!==l.EVENT&&t.type!==l.ACK||!(0,s.hasBinary)(t)?[this.encodeAsString(t)]:this.encodeAsBinary({type:t.type===l.EVENT?l.BINARY_EVENT:l.BINARY_ACK,nsp:t.nsp,data:t.data,id:t.id})}encodeAsString(t){let e=""+t.type;return t.type!==l.BINARY_EVENT&&t.type!==l.BINARY_ACK||(e+=t.attachments+"-"),t.nsp&&"/"!==t.nsp&&(e+=t.nsp+","),null!=t.id&&(e+=t.id),null!=t.data&&(e+=JSON.stringify(t.data,this.replacer)),i("encoded %j as %s",t,e),e}encodeAsBinary(t){const e=(0,o.deconstructPacket)(t),n=this.encodeAsString(e.packet),r=e.buffers;return r.unshift(n),r}};class u extends r.Emitter{constructor(t){super(),this.reviver=t}add(t){let e;if("string"==typeof t){if(this.reconstructor)throw new Error("got plaintext data when reconstructing a packet");e=this.decodeString(t);const n=e.type===l.BINARY_EVENT;n||e.type===l.BINARY_ACK?(e.type=n?l.EVENT:l.ACK,this.reconstructor=new h(e),0===e.attachments&&super.emitReserved("decoded",e)):super.emitReserved("decoded",e)}else{if(!(0,s.isBinary)(t)&&!t.base64)throw new Error("Unknown type: "+t);if(!this.reconstructor)throw new Error("got binary data when not reconstructing a packet");e=this.reconstructor.takeBinaryData(t),e&&(this.reconstructor=null,super.emitReserved("decoded",e))}}decodeString(t){let e=0;const n={type:Number(t.charAt(0))};if(void 0===l[n.type])throw new Error("unknown packet type "+n.type);if(n.type===l.BINARY_EVENT||n.type===l.BINARY_ACK){const r=e+1;for(;"-"!==t.charAt(++e)&&e!=t.length;);const o=t.substring(r,e);if(o!=Number(o)||"-"!==t.charAt(e))throw new Error("Illegal attachments");n.attachments=Number(o)}if("/"===t.charAt(e+1)){const r=e+1;for(;++e&&","!==t.charAt(e)&&e!==t.length;);n.nsp=t.substring(r,e)}else n.nsp="/";const r=t.charAt(e+1);if(""!==r&&Number(r)==r){const r=e+1;for(;++e;){const n=t.charAt(e);if(null==n||Number(n)!=n){--e;break}if(e===t.length)break}n.id=Number(t.substring(r,e+1))}if(t.charAt(++e)){const r=this.tryParse(t.substr(e));if(!u.isPayloadValid(n.type,r))throw new Error("invalid payload");n.data=r}return i("decoded %s as %j",t,n),n}tryParse(t){try{return JSON.parse(t,this.reviver)}catch(t){return!1}}static isPayloadValid(t,e){switch(t){case l.CONNECT:return c(e);case l.DISCONNECT:return void 0===e;case l.CONNECT_ERROR:return"string"==typeof e||c(e);case l.EVENT:case l.BINARY_EVENT:return Array.isArray(e)&&("number"==typeof e[0]||"string"==typeof e[0]&&-1===a.indexOf(e[0]));case l.ACK:case l.BINARY_ACK:return Array.isArray(e)}}destroy(){this.reconstructor&&(this.reconstructor.finishedReconstruction(),this.reconstructor=null)}}e.Decoder=u;class h{constructor(t){this.packet=t,this.buffers=[],this.reconPack=t}takeBinaryData(t){if(this.buffers.push(t),this.buffers.length===this.reconPack.attachments){const t=(0,o.reconstructPacket)(this.reconPack,this.buffers);return this.finishedReconstruction(),t}return null}finishedReconstruction(){this.reconPack=null,this.buffers=[]}}},9133:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.hasBinary=e.isBinary=void 0;const n="function"==typeof ArrayBuffer,r=Object.prototype.toString,o="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===r.call(Blob),s="function"==typeof File||"undefined"!=typeof File&&"[object FileConstructor]"===r.call(File);function i(t){return n&&(t instanceof ArrayBuffer||(t=>"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):t.buffer instanceof ArrayBuffer)(t))||o&&t instanceof Blob||s&&t instanceof File}e.isBinary=i,e.hasBinary=function t(e,n){if(!e||"object"!=typeof e)return!1;if(Array.isArray(e)){for(let n=0,r=e.length;n<r;n++)if(t(e[n]))return!0;return!1}if(i(e))return!0;if(e.toJSON&&"function"==typeof e.toJSON&&1===arguments.length)return t(e.toJSON(),!0);for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return!0;return!1}},7285:(t,e,n)=>{"use strict";function r(t){if(t)return function(t){for(var e in r.prototype)t[e]=r.prototype[e];return t}(t)}n.r(e),n.d(e,{Emitter:()=>r}),r.prototype.on=r.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},r.prototype.once=function(t,e){function n(){this.off(t,n),e.apply(this,arguments)}return n.fn=e,this.on(t,n),this},r.prototype.off=r.prototype.removeListener=r.prototype.removeAllListeners=r.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n,r=this._callbacks["$"+t];if(!r)return this;if(1==arguments.length)return delete this._callbacks["$"+t],this;for(var o=0;o<r.length;o++)if((n=r[o])===e||n.fn===e){r.splice(o,1);break}return 0===r.length&&delete this._callbacks["$"+t],this},r.prototype.emit=function(t){this._callbacks=this._callbacks||{};for(var e=new Array(arguments.length-1),n=this._callbacks["$"+t],r=1;r<arguments.length;r++)e[r-1]=arguments[r];if(n){r=0;for(var o=(n=n.slice(0)).length;r<o;++r)n[r].apply(this,e)}return this},r.prototype.emitReserved=r.prototype.emit,r.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks["$"+t]||[]},r.prototype.hasListeners=function(t){return!!this.listeners(t).length}}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var n=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t].call(n.exports,n,n.exports,__webpack_require__),n.exports}__webpack_require__.d=(t,e)=>{for(var n in e)__webpack_require__.o(e,n)&&!__webpack_require__.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),__webpack_require__.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),__webpack_require__.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var __webpack_exports__={};(()=>{"use strict";var t=__webpack_exports__;Object.defineProperty(t,"__esModule",{value:!0}),t.HotTestDriver=t.IHotTestElementOptions=t.HotTestElementOptions=t.IHotTestElement=t.HotTestElement=t.HotTestPage=t.HotTestDestination=t.HotTestPath=t.HotTestMap=t.HotTesterAPI=t.HotDestination=t.HotTestStop=t.HotTester=t.HotWebSocketClient=t.HotClient=t.HotServerType=t.HotServer=t.HotRouteMethodParameter=t.PassType=t.ServerRequest=t.HotEventMethod=t.HotRouteMethod=t.HotRoute=t.HotPage=t.HotLogLevel=t.HotLog=t.HotFile=t.APItoLoad=t.EventExecutionType=t.HotAPI=t.IHotComponent=t.HotComponentOutput=t.HotComponent=t.DeveloperMode=t.HotAsset=t.HotModule=t.Hot=t.HotSiteMapPath=t.HotSiteRoute=t.HotSite=t.IHotStaq=t.HotStartOptions=t.HotStaq=void 0;const e=__webpack_require__(9343);Object.defineProperty(t,"HotStaq",{enumerable:!0,get:function(){return e.HotStaq}}),Object.defineProperty(t,"HotStartOptions",{enumerable:!0,get:function(){return e.HotStartOptions}}),Object.defineProperty(t,"IHotStaq",{enumerable:!0,get:function(){return e.IHotStaq}});const n=__webpack_require__(5269);Object.defineProperty(t,"HotSite",{enumerable:!0,get:function(){return n.HotSite}}),Object.defineProperty(t,"HotSiteRoute",{enumerable:!0,get:function(){return n.HotSiteRoute}}),Object.defineProperty(t,"HotSiteMapPath",{enumerable:!0,get:function(){return n.HotSiteMapPath}});const r=__webpack_require__(1814);Object.defineProperty(t,"Hot",{enumerable:!0,get:function(){return r.Hot}}),Object.defineProperty(t,"DeveloperMode",{enumerable:!0,get:function(){return r.DeveloperMode}});const o=__webpack_require__(5472);Object.defineProperty(t,"HotAsset",{enumerable:!0,get:function(){return o.HotAsset}});const s=__webpack_require__(6370);Object.defineProperty(t,"HotModule",{enumerable:!0,get:function(){return s.HotModule}});const i=__webpack_require__(3299);Object.defineProperty(t,"HotComponent",{enumerable:!0,get:function(){return i.HotComponent}}),Object.defineProperty(t,"HotComponentOutput",{enumerable:!0,get:function(){return i.HotComponentOutput}}),Object.defineProperty(t,"IHotComponent",{enumerable:!0,get:function(){return i.IHotComponent}});const a=__webpack_require__(8296);Object.defineProperty(t,"HotFile",{enumerable:!0,get:function(){return a.HotFile}});const l=__webpack_require__(3622);Object.defineProperty(t,"HotLog",{enumerable:!0,get:function(){return l.HotLog}}),Object.defineProperty(t,"HotLogLevel",{enumerable:!0,get:function(){return l.HotLogLevel}});const c=__webpack_require__(5989);Object.defineProperty(t,"HotPage",{enumerable:!0,get:function(){return c.HotPage}});const u=__webpack_require__(6044);Object.defineProperty(t,"HotAPI",{enumerable:!0,get:function(){return u.HotAPI}}),Object.defineProperty(t,"EventExecutionType",{enumerable:!0,get:function(){return u.EventExecutionType}}),Object.defineProperty(t,"APItoLoad",{enumerable:!0,get:function(){return u.APItoLoad}});const h=__webpack_require__(7605);Object.defineProperty(t,"HotRoute",{enumerable:!0,get:function(){return h.HotRoute}});const p=__webpack_require__(9844);Object.defineProperty(t,"HotRouteMethod",{enumerable:!0,get:function(){return p.HotRouteMethod}}),Object.defineProperty(t,"HotEventMethod",{enumerable:!0,get:function(){return p.HotEventMethod}}),Object.defineProperty(t,"ServerRequest",{enumerable:!0,get:function(){return p.ServerRequest}}),Object.defineProperty(t,"PassType",{enumerable:!0,get:function(){return p.PassType}}),Object.defineProperty(t,"HotRouteMethodParameter",{enumerable:!0,get:function(){return p.HotRouteMethodParameter}});const d=__webpack_require__(3205);Object.defineProperty(t,"HotServer",{enumerable:!0,get:function(){return d.HotServer}}),Object.defineProperty(t,"HotServerType",{enumerable:!0,get:function(){return d.HotServerType}});const f=__webpack_require__(3025);Object.defineProperty(t,"HotClient",{enumerable:!0,get:function(){return f.HotClient}});const m=__webpack_require__(3596);Object.defineProperty(t,"HotWebSocketClient",{enumerable:!0,get:function(){return m.HotWebSocketClient}});const g=__webpack_require__(896);Object.defineProperty(t,"HotTestDriver",{enumerable:!0,get:function(){return g.HotTestDriver}});const y=__webpack_require__(1284);Object.defineProperty(t,"IHotTestElement",{enumerable:!0,get:function(){return y.IHotTestElement}}),Object.defineProperty(t,"HotTestElement",{enumerable:!0,get:function(){return y.HotTestElement}}),Object.defineProperty(t,"HotTestElementOptions",{enumerable:!0,get:function(){return y.HotTestElementOptions}}),Object.defineProperty(t,"IHotTestElementOptions",{enumerable:!0,get:function(){return y.IHotTestElementOptions}});const b=__webpack_require__(8969);Object.defineProperty(t,"HotTester",{enumerable:!0,get:function(){return b.HotTester}});const v=__webpack_require__(9962);Object.defineProperty(t,"HotTestStop",{enumerable:!0,get:function(){return v.HotTestStop}});const _=__webpack_require__(9164);Object.defineProperty(t,"HotDestination",{enumerable:!0,get:function(){return _.HotDestination}});const w=__webpack_require__(6681);Object.defineProperty(t,"HotTesterAPI",{enumerable:!0,get:function(){return w.HotTesterAPI}});const S=__webpack_require__(6434);Object.defineProperty(t,"HotTestMap",{enumerable:!0,get:function(){return S.HotTestMap}}),Object.defineProperty(t,"HotTestPath",{enumerable:!0,get:function(){return S.HotTestPath}});const P=__webpack_require__(4744);Object.defineProperty(t,"HotTestDestination",{enumerable:!0,get:function(){return P.HotTestDestination}});const H=__webpack_require__(1153);Object.defineProperty(t,"HotTestPage",{enumerable:!0,get:function(){return H.HotTestPage}}),e.HotStaq.isWeb=!0})(),HotStaqWeb=__webpack_exports__})();
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QS9CZixFQUFBZzZCLFdBQVcsSUFFcEIsRUFBQXYxQyxRQUFRQyxPQUFRLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9icm93c2VyLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2pzLWNvb2tpZS9kaXN0L2pzLmNvb2tpZS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90QVBJLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90QXNzZXQudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RDbGllbnQudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RDb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RGaWxlLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90TG9nLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90TW9kdWxlLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90UGFnZS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFJvdXRlLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Um91dGVNZXRob2QudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RTZXJ2ZXIudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RTdGFxLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90U3RhcVJlZ2lzdGVyQ29tcG9uZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90U3RhcVdlYlN0YXJ0LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdERlc3RpbmF0aW9uLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdERyaXZlci50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3RFbGVtZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdE1hcC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3Rlci50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3RlckFQSS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFdlYlNvY2tldENsaWVudC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9ybmcuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmFsaWRhdGUuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YxLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3BhcnNlLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YzNS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9tZDUuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjQuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc2hhMS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9uaWwuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViL2V4dGVybmFsIHZhciBcIkZvcm1EYXRhXCIiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi9leHRlcm5hbCB2YXIgXCJmZXRjaFwiIiwid2VicGFjazovL0hvdFN0YXFXZWIvZXh0ZXJuYWwgdmFyIFwie31cIiIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvY2pzL2NvbnRyaWIvaGFzLWNvcnMuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2Nqcy9jb250cmliL3BhcnNlcXMuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2Nqcy9jb250cmliL3BhcnNldXJpLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9janMvY29udHJpYi95ZWFzdC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvY2pzL2dsb2JhbFRoaXMuYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvY2pzL2luZGV4LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9janMvc29ja2V0LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9janMvdHJhbnNwb3J0LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9janMvdHJhbnNwb3J0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvY2pzL3RyYW5zcG9ydHMvcG9sbGluZy5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvY2pzL3RyYW5zcG9ydHMvd2Vic29ja2V0LWNvbnN0cnVjdG9yLmJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2Nqcy90cmFuc3BvcnRzL3dlYnNvY2tldC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvY2pzL3RyYW5zcG9ydHMvd2VidHJhbnNwb3J0LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9janMvdHJhbnNwb3J0cy94bWxodHRwcmVxdWVzdC5icm93c2VyLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9janMvdXRpbC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1wYXJzZXIvYnVpbGQvY2pzL2NvbW1vbnMuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2Nqcy9jb250cmliL2Jhc2U2NC1hcnJheWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1wYXJzZXIvYnVpbGQvY2pzL2RlY29kZVBhY2tldC5icm93c2VyLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLXBhcnNlci9idWlsZC9janMvZW5jb2RlUGFja2V0LmJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2Nqcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL3NvY2tldC5pby1jbGllbnQvYnVpbGQvY2pzL2NvbnRyaWIvYmFja28yLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9janMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2Nqcy9tYW5hZ2VyLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9janMvb24uanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2Nqcy9zb2NrZXQuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2Nqcy91cmwuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tcGFyc2VyL2J1aWxkL2Nqcy9iaW5hcnkuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tcGFyc2VyL2J1aWxkL2Nqcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL3NvY2tldC5pby1wYXJzZXIvYnVpbGQvY2pzL2lzLWJpbmFyeS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL0Bzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXIvaW5kZXgubWpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL0hvdFN0YXFXZWIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9hcGktd2ViLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGRlYnVnIGluc3RhbmNlIHRvIGJlIGNvbG9yZWRcblx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdH1cblx0Y3JlYXRlRGVidWcuc2VsZWN0Q29sb3IgPSBzZWxlY3RDb2xvcjtcblxuXHQvKipcblx0KiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblx0XHRsZXQgcHJldlRpbWU7XG5cdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRsZXQgbmFtZXNwYWNlc0NhY2hlO1xuXHRcdGxldCBlbmFibGVkQ2FjaGU7XG5cblx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHQvLyBEaXNhYmxlZD9cblx0XHRcdGlmICghZGVidWcuZW5hYmxlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNlbGYgPSBkZWJ1ZztcblxuXHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdGNvbnN0IGN1cnIgPSBOdW1iZXIobmV3IERhdGUoKSk7XG5cdFx0XHRjb25zdCBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG5cdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdHNlbGYucHJldiA9IHByZXZUaW1lO1xuXHRcdFx0c2VsZi5jdXJyID0gY3Vycjtcblx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0YXJnc1swXSA9IGNyZWF0ZURlYnVnLmNvZXJjZShhcmdzWzBdKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRhcmdzLnVuc2hpZnQoJyVPJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0YXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChtYXRjaCwgZm9ybWF0KSA9PiB7XG5cdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuICclJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZXIgPSBjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0XHRcdFx0bWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG5cdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRpbmRleC0tO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0Y3JlYXRlRGVidWcuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG5cdFx0XHRjb25zdCBsb2dGbiA9IHNlbGYubG9nIHx8IGNyZWF0ZURlYnVnLmxvZztcblx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRkZWJ1Zy5jb2xvciA9IGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cdFx0ZGVidWcuZXh0ZW5kID0gZXh0ZW5kO1xuXHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWJ1ZywgJ2VuYWJsZWQnLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoZW5hYmxlT3ZlcnJpZGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzcGFjZXNDYWNoZSAhPT0gY3JlYXRlRGVidWcubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0ZW5hYmxlZENhY2hlID0gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cdFx0Y3JlYXRlRGVidWcubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zbGljZSgxKSArICckJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLm1hcCh0b05hbWVzcGFjZSksXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdF0uam9pbignLCcpO1xuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZSgnJyk7XG5cdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0aWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRsZXQgaTtcblx0XHRsZXQgbGVuO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCogQ29udmVydCByZWdleHAgdG8gbmFtZXNwYWNlXG5cdCpcblx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gdG9OYW1lc3BhY2UocmVnZXhwKSB7XG5cdFx0cmV0dXJuIHJlZ2V4cC50b1N0cmluZygpXG5cdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHQucmVwbGFjZSgvXFwuXFwqXFw/JC8sICcqJyk7XG5cdH1cblxuXHQvKipcblx0KiBDb2VyY2UgYHZhbGAuXG5cdCpcblx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0KiBAcmV0dXJuIHtNaXhlZH1cblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxuXG5cdC8qKlxuXHQqIFhYWCBETyBOT1QgVVNFLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0dWIgZnVuY3Rpb24uXG5cdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHQqL1xuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHR9XG5cblx0Y3JlYXRlRGVidWcuZW5hYmxlKGNyZWF0ZURlYnVnLmxvYWQoKSk7XG5cblx0cmV0dXJuIGNyZWF0ZURlYnVnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHVwO1xuIiwiLyohIGpzLWNvb2tpZSB2My4wLjEgfCBNSVQgKi9cbjtcbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjdXJyZW50ID0gZ2xvYmFsLkNvb2tpZXM7XG4gICAgdmFyIGV4cG9ydHMgPSBnbG9iYWwuQ29va2llcyA9IGZhY3RvcnkoKTtcbiAgICBleHBvcnRzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7IGdsb2JhbC5Db29raWVzID0gY3VycmVudDsgcmV0dXJuIGV4cG9ydHM7IH07XG4gIH0oKSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG4gIGZ1bmN0aW9uIGFzc2lnbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuICB2YXIgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgICByZWFkOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oJVtcXGRBLUZdezJ9KSsvZ2ksIGRlY29kZVVSSUNvbXBvbmVudClcbiAgICB9LFxuICAgIHdyaXRlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoXG4gICAgICAgIC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcbiAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50XG4gICAgICApXG4gICAgfVxuICB9O1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG4gIGZ1bmN0aW9uIGluaXQgKGNvbnZlcnRlciwgZGVmYXVsdEF0dHJpYnV0ZXMpIHtcbiAgICBmdW5jdGlvbiBzZXQgKGtleSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkZWZhdWx0QXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcy5leHBpcmVzID09PSAnbnVtYmVyJykge1xuICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZTUpO1xuICAgICAgfVxuICAgICAgaWYgKGF0dHJpYnV0ZXMuZXhwaXJlcykge1xuICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSlcbiAgICAgICAgLnJlcGxhY2UoLyUoMlszNDZCXXw1RXw2MHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KVxuICAgICAgICAucmVwbGFjZSgvWygpXS9nLCBlc2NhcGUpO1xuXG4gICAgICB2YXIgc3RyaW5naWZpZWRBdHRyaWJ1dGVzID0gJyc7XG4gICAgICBmb3IgKHZhciBhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcblxuICAgICAgICBpZiAoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG4gICAgICAgIC8vIC4uLlxuICAgICAgICAvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG4gICAgICAgIC8vICAgICBjaGFyYWN0ZXI6XG4gICAgICAgIC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgdXAgdG8sXG4gICAgICAgIC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuICAgICAgICAvLyAuLi5cbiAgICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc9JyArIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uc3BsaXQoJzsnKVswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChkb2N1bWVudC5jb29raWUgPVxuICAgICAgICBrZXkgKyAnPScgKyBjb252ZXJ0ZXIud3JpdGUodmFsdWUsIGtleSkgKyBzdHJpbmdpZmllZEF0dHJpYnV0ZXMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0IChrZXkpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IChhcmd1bWVudHMubGVuZ3RoICYmICFrZXkpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBUbyBwcmV2ZW50IHRoZSBmb3IgbG9vcCBpbiB0aGUgZmlyc3QgcGxhY2UgYXNzaWduIGFuIGVtcHR5IGFycmF5XG4gICAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjb29raWVzIGF0IGFsbC5cbiAgICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG4gICAgICB2YXIgamFyID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgZm91bmRLZXkgPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pO1xuICAgICAgICAgIGphcltmb3VuZEtleV0gPSBjb252ZXJ0ZXIucmVhZCh2YWx1ZSwgZm91bmRLZXkpO1xuXG4gICAgICAgICAgaWYgKGtleSA9PT0gZm91bmRLZXkpIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5ID8gamFyW2tleV0gOiBqYXJcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgc2V0OiBzZXQsXG4gICAgICAgIGdldDogZ2V0LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIChrZXksIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBzZXQoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgIGFzc2lnbih7fSwgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgICBleHBpcmVzOiAtMVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB3aXRoQXR0cmlidXRlczogZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICByZXR1cm4gaW5pdCh0aGlzLmNvbnZlcnRlciwgYXNzaWduKHt9LCB0aGlzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpKVxuICAgICAgICB9LFxuICAgICAgICB3aXRoQ29udmVydGVyOiBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGluaXQoYXNzaWduKHt9LCB0aGlzLmNvbnZlcnRlciwgY29udmVydGVyKSwgdGhpcy5hdHRyaWJ1dGVzKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhdHRyaWJ1dGVzOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGRlZmF1bHRBdHRyaWJ1dGVzKSB9LFxuICAgICAgICBjb252ZXJ0ZXI6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoY29udmVydGVyKSB9XG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgdmFyIGFwaSA9IGluaXQoZGVmYXVsdENvbnZlcnRlciwgeyBwYXRoOiAnLycgfSk7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbiAgcmV0dXJuIGFwaTtcblxufSkpKTtcbiIsIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwiaW1wb3J0IHsgSG90RmlsZSB9IGZyb20gXCIuL0hvdEZpbGVcIjtcbmltcG9ydCB7IEhvdFBhZ2UgfSBmcm9tIFwiLi9Ib3RQYWdlXCI7XG5pbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RUZXN0RWxlbWVudCB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5pbXBvcnQgeyBIb3RFdmVudE1ldGhvZCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RNb2R1bGUgfSBmcm9tIFwiLi9Ib3RNb2R1bGVcIjtcblxuaW1wb3J0IENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5pbXBvcnQgRm9ybURhdGEgZnJvbSBcImZvcm0tZGF0YVwiO1xuXG4vKipcbiAqIFRoZSBhdmFpbGFibGUgZGV2ZWxvcGVyIG1vZGVzLlxuICovXG5leHBvcnQgZW51bSBEZXZlbG9wZXJNb2RlXG57XG5cdC8qKlxuXHQgKiBUaGUgZGVmYXVsdCBkZXZlbG9wZXIgbW9kZS4gTm8gdGVzdHMgd2lsbCBiZSBleGVjdXRlZCBhbmQgXG5cdCAqIGFueSB0ZXN0IHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqL1xuXHRQcm9kdWN0aW9uLFxuXHQvKipcblx0ICogRm9yIHVzZSBkdXJpbmcgZGV2ZWxvcG1lbnQvZGVidWdnaW5nLiBBbGwgdGVzdCBkYXRhIHdpbGwgXG5cdCAqIGJlIGNvbGxlY3RlZCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0RGV2ZWxvcG1lbnRcbn1cblxuLyoqXG4gKiBBIENTUyBvYmplY3QgdG8gZW1iZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTT2JqZWN0XG57XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBDU1MgZmlsZSB0byBlbWJlZC5cblx0ICovXG5cdHVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGludGVncml0eSBoYXNoIHRvIGdlbmVyYXRlIGR1cmluZyBpbml0aWFsIGNvbXBpbGF0aW9uLlxuXHQgKi9cblx0aW50ZWdyaXR5SGFzaDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBhcGkgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFxue1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnRseSBnZW5lcmF0ZWQgcGFnZSBiZWluZyBkaXNwbGF5ZWQuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIEN1cnJlbnRQYWdlOiBIb3RQYWdlID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBhcmd1bWVudHMgcGFzc2VkLlxuXHQgKi9cblx0c3RhdGljIEFyZ3VtZW50czogYW55ID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBtb2RlIGluIHdoaWNoIHRoaXMgYXBwbGljYXRpb24gaXMgcnVubmluZy4gSWYgaXQncyBzZXQgdG8gZGV2ZWxvcG1lbnQgbW9kZSwgYWxsIHRlc3Rpbmdcblx0ICogcmVsYXRlZCBkYXRhIHdpbGwgYmUgY29sbGVjdGVkLCBwYXJzZWQsIGFuZCBleGVjdXRlZCBpZiBuZWNlc3NhcnkuXG5cdCAqL1xuXHRzdGF0aWMgRGV2ZWxvcGVyTW9kZSA9IERldmVsb3Blck1vZGU7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIEhvdFRlc3RFbGVtZW50ID0gSG90VGVzdEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIE1vZGU6IERldmVsb3Blck1vZGUgPSBEZXZlbG9wZXJNb2RlLlByb2R1Y3Rpb247XG5cdC8qKlxuXHQgKlRoZSBjdXJyZW50IEFQSSB1c2VkIG9uIHRoaXMgcGFnZS4gVGhpcyBpcyBjbGVhcmVkIGJldHdlZW4gZXZlcnkgZmlsZSBwcm9jZXNzZWQuXG5cdCAqL1xuXHRzdGF0aWMgQVBJOiBIb3RBUEkgPSBudWxsO1xuXHQvKipcblx0ICogVGhlIEFQSSBiZWluZyB1c2VkIGJ5IHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRzdGF0aWMgVGVzdGVyQVBJOiBIb3RBUEkgPSBudWxsO1xuXHQvKipcblx0ICogQ29udGFpbnMgdGhlIGJ1ZmZlciB0byBvdXRwdXQuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIE91dHB1dDogc3RyaW5nID0gXCJcIjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhIHRvIHNoYXJlIGFjcm9zcyBhbGwgdGhlIGRpZmZlcmVudCBmaWxlcyBhbmQgcGFnZXMuIFRoaXMgZGF0YSB3aWxsIGJlIHB1YmxpYy5cblx0ICovXG5cdHN0YXRpYyBEYXRhOiBhbnkgPSB7fTtcblx0LyoqXG5cdCAqIFRoZSBjb29raWVzIHRvIHVzZSBiZXR3ZWVuIHBhZ2VzLlxuXHQgKi9cblx0c3RhdGljIENvb2tpZXM6IENvb2tpZXMuQ29va2llc1N0YXRpYyA9IENvb2tpZXM7XG5cdC8qKlxuXHQgKiBBbnkgcHVibGljIGtleXMgdGhhdCBuZWVkIHRvIGJlIHNob3duLiBUaGVzZSBjYW4gYmUgcGFzc2VkIGZyb20gSG90U2l0ZS5qc29uLlxuXHQgKi9cblx0c3RhdGljIFB1YmxpY0tleXM6IGFueSA9IHt9O1xuXHQvKipcblx0ICogVGhlIENTUyBzdHJpbmcgdG8gdXNlIHdoZW4gZWNob2luZyBvdXQgdGhlIENTUyBmaWxlcy5cblx0ICovXG5cdHN0YXRpYyBjc3NTdHI6IHN0cmluZyA9IGA8bGluayByZWwgPSBcInN0eWxlc2hlZXRcIiBocmVmID0gXCIlQ1NTX0ZJTEUlXCIgLz5gO1xuXHQvKipcblx0ICogVGhlIENTUyBmaWxlcyB0byB1c2UgaW4gdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqIFxuXHQgKiBAdG9kbyBNYWtlIHRoaXMgYSBcInN0cmluZyB8IENTU09iamVjdFwiIGRhdGEgdHlwZSBzbyBpdCBjYW4gYWxzbyBpbmNsdWRlIFxuXHQgKiB0aGUgaW50ZWdyaXR5IGhhc2hlcyBhcyB3ZWxsLlxuXHQgKi9cblx0c3RhdGljIENTUzogc3RyaW5nW10gPSBbXTtcblx0LyoqXG5cdCAqIFRoZSBKYXZhU2NyaXB0IGZpbGVzIHRvIHVzZSBpbiB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICogXG5cdCAqIEB0b2RvIE1ha2UgdGhpcyBhIFwic3RyaW5nIHwgSlNGaWxlT2JqZWN0XCIgZGF0YSB0eXBlIHNvIGl0IGNhbiBhbHNvIGluY2x1ZGUgXG5cdCAqIHRoZSBpbnRlZ3JpdHkgaGFzaGVzIGFzIHdlbGwuXG5cdCAqL1xuXHRzdGF0aWMgSlNGaWxlczogYW55W10gPSBbXTtcblx0LyoqXG5cdCAqIFRoZSBKYXZhU2NyaXB0IGlubGluZSBjb2RlIHRvIHVzZSBpbiB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICovXG5cdHN0YXRpYyBKU1NjcmlwdHM6IGFueVtdID0gW107XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBzdHJpbmcgdG8gdXNlIHdoZW4gZWNob2luZyBvdXQgdGhlIFNjcmlwdHMgZmlsZXMuXG5cdCAqL1xuXHRzdGF0aWMganNGaWxlU3RyOiBzdHJpbmcgPSBgPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiVKU19GSUxFJVwiPjwvc2NyaXB0PmA7XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBzdHJpbmcgdG8gdXNlIHdoZW4gZWNob2luZyBvdXQgdGhlIFNjcmlwdHMgZmlsZXMuXG5cdCAqL1xuXHRzdGF0aWMganNTY3JpcHRzU3RyOiBzdHJpbmcgPSBgPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj4lSlNfQ09ERSU8L3NjcmlwdD5gO1xuXG5cdC8qKlxuXHQgKiBHZXQgYSB2YWxpZGF0ZWQgVVJMIHBhcmFtZXRlci5cblx0ICogXG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYHRzXG5cdCAqIDwqXG5cdCAqIFx0Y29uc3QgaWQgPSBIb3QuZ2V0VXJsUGFyYW0gKCdpZCcsICdpbnQnKTtcblx0ICogKj5cblx0ICogXG5cdCAqIDxkaXY+VGhlIGlkIGlzOiAke2lkfTwvZGl2PlxuXHQgKiBgYGBcblx0ICogXG5cdCAqIEBwYXJhbSB2YWxpZGF0aW9uIFRoaXMgcGFyYW1ldGVyIGlzIGZvciB2YWxpZGF0aW5nIGFuZCBzYW5pdGl6aW5nIGEgVVJMIHBhcmFtZXRlci5cblx0ICogSWYgaXQncyBhIHN0cmluZywgdGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZTpcblx0ICogKiBpbnRcblx0ICogICAqIFRoaXMgd2lsbCBvbmx5IGFsbG93IGludGVnZXJzLiBwYXJzZUludCB3aWxsIGJlIGNhbGxlZCBhbmQgd2lsbCByZXR1cm4gYW4gaW50ZWdlci5cblx0ICogKiBmbG9hdFxuXHQgKiAgICogVGhpcyB3aWxsIG9ubHkgYWxsb3cgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gcGFyc2VGbG9hdCB3aWxsIGJlIGNhbGxlZCBhbmQgd2lsbCByZXR1cm4gYSBmbG9hdC5cblx0ICogKiBlbWFpbFxuXHQgKiAgICogV2lsbCB2ZXJpZnkgdGhhdCB0aGUgc3RyaW5nIGlzIGluIHRoZSBmb3JtIG9mIGFuIGVtYWlsIGFkZHJlc3MuXG5cdCAqICogcGhvbmVcblx0ICogICAqIFdpbGwgdmVyaWZ5IHRoYXQgdGhlIHN0cmluZyBpcyBpbiB0aGUgZm9ybSBvZiBhbiBlbWFpbCBhZGRyZXNzLlxuXHQgKiAqIHV1aWRcblx0ICogICAqIFRoaXMgd2lsbCB2ZXJpZnkgdGhhdCB0aGUgc3RyaW5nIGlzIGluIHRoZSBmb3JtIG9mIGEgVVVJRC4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhlIFVVSUQgaXMgdmFsaWQuXG5cdCAqICogc3RyaW5nKG51bWJlcl9vZl9jaGFycylcblx0ICogICAqIFRoaXMgd2lsbCBvbmx5IGFsbG93IGEgc3RyaW5nIG9mIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuXG5cdCAqIFxuXHQgKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHRoaXMgd2lsbCBjYWxsIHRoZSBzdXBwbGllZCBmdW5jdGlvbiB0byB2YWxpZGF0ZS4gVmFsaWRhdGlvbiBjaGVja3MgbXVzdCBoYXBwZW4gXG5cdCAqIGluIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIHRoZSBzYW5pdGl6ZWQgdmFsdWUuIEl0IGlzIHNpbXBseSBhIHBhc3N0aHJvdWdoLCBiZSB3aXNlIHdpdGggdGhpcy4gVGhyb3cgXG5cdCAqIGFuIGVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgdmFsaWQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBVUkwgcGFyYW1ldGVyLCBvbmx5IGlmIGl0IHBhc3NlcyB2YWxpZGF0aW9uLiBJZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBmb3VuZCxcblx0ICogbnVsbCB3aWxsIGJlIHJldHVybmVkLlxuXHQgKi9cblx0c3RhdGljIGdldFVybFBhcmFtIChwYXJhbTogc3RyaW5nLCB2YWxpZGF0aW9uOiBzdHJpbmcgfCAoKHBhcmFtOiBhbnkpID0+IGFueSkpOiBhbnlcblx0e1xuXHRcdGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXHRcdGNvbnN0IHZhbHVlID0gdXJsUGFyYW1zLmdldCAocGFyYW0pO1xuXG5cdFx0aWYgKHZhbHVlID09IG51bGwpXG5cdFx0XHRyZXR1cm4gKG51bGwpO1xuXG5cdFx0aWYgKHR5cGVvZiAodmFsaWRhdGlvbikgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0c3dpdGNoICh2YWxpZGF0aW9uKVxuXHRcdFx0e1xuXHRcdFx0XHRjYXNlIFwiaW50XCI6XG5cdFx0XHRcdFx0cmV0dXJuIChwYXJzZUludCAodmFsdWUpKTtcblx0XHRcdFx0Y2FzZSBcImZsb2F0XCI6XG5cdFx0XHRcdFx0cmV0dXJuIChwYXJzZUZsb2F0ICh2YWx1ZSkpO1xuXHRcdFx0XHRjYXNlIFwiZW1haWxcIjpcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IGVtYWlsUmVnZXggPSBuZXcgUmVnRXhwIChcIl5cXFxcUytAXFxcXFMrXFxcXC5cXFxcUyskXCIpO1xuXG5cdFx0XHRcdFx0aWYgKGVtYWlsUmVnZXgudGVzdCAodmFsdWUpID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0cmV0dXJuICh2YWx1ZSk7XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXNlIFwicGhvbmVcIjpcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IHBob25lUmVnZXggPSBuZXcgUmVnRXhwIChcIl5cXFxcKz8oWzAtOSBdPyl7NiwxNH1bMC05XSRcIik7XG5cblx0XHRcdFx0XHRpZiAocGhvbmVSZWdleC50ZXN0ICh2YWx1ZSkgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRyZXR1cm4gKHZhbHVlKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhc2UgXCJ1dWlkXCI6XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCB1dWlkUmVnZXggPSBuZXcgUmVnRXhwIChcIlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfVwiKTtcblxuXHRcdFx0XHRcdGlmICh1dWlkUmVnZXgudGVzdCAodmFsdWUpID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0cmV0dXJuICh2YWx1ZSk7XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGlmICh2YWxpZGF0aW9uLmluZGV4T2YgKFwic3RyaW5nXCIpID4gLTEpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgbnVtQ2hhcnMgPSBwYXJzZUludCAodmFsaWRhdGlvbi5zcGxpdCAoXCIoXCIpWzFdLnNwbGl0IChcIilcIilbMF0pO1xuXG5cdFx0XHRcdFx0XHRpZiAodmFsdWUubGVuZ3RoID09PSBudW1DaGFycylcblx0XHRcdFx0XHRcdFx0cmV0dXJuICh2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBnZXRVcmxQYXJhbSByZXRyZWl2aW5nIHBhcmFtZXRlciBcIiR7cGFyYW19XCIgdXNpbmcgdmFsaWRhdGlvbiB0eXBlIFwiJHt2YWxpZGF0aW9ufVwiIGZhaWxlZC5gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbGlkYXRpb24gKHZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYSBmaWxlIGFuZCBlY2hvIG91dCBpdCdzIGNvbnRlbnRzLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGluY2x1ZGUgKGZpbGU6IEhvdEZpbGUgfCBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGlmICh0eXBlb2YgKGZpbGUpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBsb3dlckZpbGU6IHN0cmluZyA9IGZpbGUudG9Mb3dlckNhc2UgKCk7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGZpbGUgdG8gYmUgaW5jbHVkZWQgZG9lcyBub3QgaGF2ZSBhIG5haGZhbSwgYWRkIGl0LiBUaGlzIFxuXHRcdFx0XHQvLyB3aWxsIGVuc3VyZSB0aGUgc2VydmVyIHNlbmRzIG9ubHkgdGhlIGZpbGUgY29udGVudC5cblx0XHRcdFx0aWYgKGxvd2VyRmlsZS5pbmRleE9mIChcIi5ob3R0XCIpID4gLTEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAobG93ZXJGaWxlLmluZGV4T2YgKFwibmFoZmFtXCIpIDwgMClcblx0XHRcdFx0XHRcdGZpbGUgKz0gXCI/aHN0cXNlcnZlPW5haGZhbVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0SG90LmVjaG8gKGF3YWl0IEhvdC5nZXRGaWxlIChmaWxlLCBhcmdzKSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5jbHVkZSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGZvciB1c2Ugd2hlbiBydW5uaW5nIHRoZSBwcmVwcm9jZXNzb3IuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgaW5jbHVkZUpTIChmaWxlOiBIb3RGaWxlIHwgc3RyaW5nLCBhcmdzOiBhbnlbXSA9IG51bGwsIHBhcmVudE9iamVjdDogYW55ID0gbnVsbCk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0Y29uc3Qgb3V0cHV0OiBzdHJpbmcgPSBhd2FpdCBIb3QuZ2V0RmlsZSAoZmlsZSk7XG5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRpZiAocGFyZW50T2JqZWN0ID09IG51bGwpXG5cdFx0XHRcdHBhcmVudE9iamVjdCA9IHdpbmRvdztcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdGlmIChwYXJlbnRPYmplY3QgPT0gbnVsbClcblx0XHRcdFx0cGFyZW50T2JqZWN0ID0gZ2xvYmFsO1xuXHRcdH1cblxuXHRcdGxldCBmdW5jID0gbmV3IEZ1bmN0aW9uIChvdXRwdXQpO1xuXG5cdFx0cmV0dXJuIChmdW5jLmFwcGx5IChwYXJlbnRPYmplY3QsIGFyZ3MpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSBhIGZpbGUgYW5kIGVjaG8gb3V0IGl0J3MgY29udGVudHMuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgaW1wb3J0IChtb2R1bGVOYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCwgcGFyZW50T2JqZWN0OiBhbnkgPSBudWxsKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgZm91bmRNb2R1bGU6IEhvdE1vZHVsZSA9IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuZ2V0TW9kdWxlIChtb2R1bGVOYW1lKTtcblxuXHRcdGlmIChmb3VuZE1vZHVsZSAhPSBudWxsKVxuXHRcdFx0cmV0dXJuIChmb3VuZE1vZHVsZSk7XG5cblx0XHRjb25zdCBmaWxlOiBzdHJpbmcgPSBgLi9ob3RzdGFxX21vZHVsZXMvJHttb2R1bGVOYW1lfS9pbmRleC5qc2A7XG5cdFx0Y29uc3Qgb3V0cHV0OiBzdHJpbmcgPSBhd2FpdCBIb3QuZ2V0RmlsZSAoZmlsZSwgYXJncyk7XG5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRpZiAocGFyZW50T2JqZWN0ID09IG51bGwpXG5cdFx0XHRcdHBhcmVudE9iamVjdCA9IHdpbmRvdztcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdGlmIChwYXJlbnRPYmplY3QgPT0gbnVsbClcblx0XHRcdFx0cGFyZW50T2JqZWN0ID0gZ2xvYmFsO1xuXHRcdH1cblxuXHRcdGxldCBuZXdNb2R1bGUgPSBuZXcgRnVuY3Rpb24gKG91dHB1dCkuYXBwbHkgKHBhcmVudE9iamVjdCk7XG5cblx0XHRpZiAobmV3TW9kdWxlLmxvYWRIVE1MICE9IG51bGwpXG5cdFx0XHRhd2FpdCBuZXdNb2R1bGUubG9hZEhUTUwgKCk7XG5cblx0XHRIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmFkZE1vZHVsZSAobW9kdWxlTmFtZSwgbmV3TW9kdWxlKTtcblxuXHRcdHJldHVybiAobmV3TW9kdWxlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSdW4gYW4gYWxyZWFkeSBsb2FkZWQgZmlsZSBhbmQgZWNobyBvdXQgaXQncyBjb250ZW50cy5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBydW5GaWxlIChmaWxlTmFtZTogc3RyaW5nLCBhcmdzOiBhbnlbXSA9IG51bGwpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuZ2V0RmlsZSAoZmlsZU5hbWUpO1xuXHRcdC8vLyBAZml4bWUgRG9lcyB0aGUgZmlsZSBuZWVkIHRvIGJlIGRlZXAgY2xvbmVkIGZpcnN0P1xuXHRcdC8vbGV0IGNsb25lZEZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAoT2JqZWN0LmFzc2lnbiAoe30sIGZpbGUpKTtcblx0XHRsZXQgdGVtcEZpbGU6IEhvdEZpbGUgPSBmaWxlO1xuXG5cdFx0dGVtcEZpbGUucGFnZSA9IHRoaXMuQ3VycmVudFBhZ2U7XG5cdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGF3YWl0IHRlbXBGaWxlLnByb2Nlc3MgKGFyZ3MpO1xuXG5cdFx0SG90LmVjaG8gKGNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgY29udGVudCBvZiBhIGZpbGUuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZ2V0RmlsZSAocGF0aDogSG90RmlsZSB8IHN0cmluZywgYXJnczogYW55W10gPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgdGVtcEZpbGU6IEhvdEZpbGUgPSBudWxsO1xuXG5cdFx0aWYgKHR5cGVvZiAocGF0aCkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0dGVtcEZpbGUgPSBuZXcgSG90RmlsZSAoKTtcblx0XHRcdHRlbXBGaWxlLm5hbWUgPSBwYXRoO1xuXG5cdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHRcdFx0dGVtcEZpbGUudXJsID0gcGF0aDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGVtcEZpbGUubG9jYWxGaWxlID0gcGF0aDtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGVtcEZpbGUgPSBwYXRoO1xuXG5cdFx0bGV0IGNoZWNrRmlsZTogSG90RmlsZSA9IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuZ2V0RmlsZSAodGVtcEZpbGUubmFtZSwgZmFsc2UpO1xuXG5cdFx0aWYgKGNoZWNrRmlsZSAhPSBudWxsKVxuXHRcdFx0dGVtcEZpbGUgPSBjaGVja0ZpbGU7XG5cblx0XHRhd2FpdCB0ZW1wRmlsZS5sb2FkICgpO1xuXG5cdFx0dGVtcEZpbGUucGFnZSA9IHRoaXMuQ3VycmVudFBhZ2U7XG5cdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGF3YWl0IHRlbXBGaWxlLnByb2Nlc3MgKGFyZ3MpO1xuXG5cdFx0cmV0dXJuIChjb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlIGFuIGFwaSBjYWxsLiBUaGlzIG11c3QgaW5jbHVkZSB0aGUgcm91dGUgdmVyc2lvbi5cblx0ICogXG5cdCAqIFNpbXBsZSBhcGlDYWxsOlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBgYGB0c1xuXHQgKiBhd2FpdCBIb3QuYXBpQ2FsbCAoJy92MS9oZWxsb193b3JsZC9lY2hvJywgeyBtZXNzYWdlOiBcIkhlbGxvIVwiIH0pO1xuXHQgKiBgYGBcblx0ICogXG5cdCAqIE1ha2UgYW4gQVBJIGNhbGwgYW5kIHVwbG9hZCBhIGZpbGU6XG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYHRzXG5cdCAqIGxldCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkIChcImZpbGVJbnB1dFwiKTtcblx0ICogbGV0IGZpbGUgPSBpbnB1dC5maWxlc1swXTtcblx0ICogXG5cdCAqIGF3YWl0IEhvdC5hcGlDYWxsICgnL3YxL2hlbGxvX3dvcmxkL2VjaG8nLFxuXHQgKiBcdFx0eyBtZXNzYWdlOiBcIkhlbGxvIVwiIH0sIEhvdEV2ZW50TWV0aG9kLlBPU1QsXG5cdCAqIFx0XHR7XG5cdCAqIFx0XHRcdFwiaW5kZXhGaWxlS2V5XCI6IGZpbGVcblx0ICogXHRcdH0pO1xuXHQgKiBgYGBcblx0ICovXG5cdHN0YXRpYyBhc3luYyBhcGlDYWxsIChyb3V0ZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsLCBcblx0XHRodHRwTWV0aG9kOiBIb3RFdmVudE1ldGhvZCA9IEhvdEV2ZW50TWV0aG9kLlBPU1QsIFxuXHRcdGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9LCBiZWFyZXJUb2tlbjogc3RyaW5nID0gXCJcIik6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJlc3VsdDogYW55ID0gbnVsbDtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJDdXJyZW50IHBhZ2UgaXMgbnVsbCFcIik7XG5cblx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSdzIHByb2Nlc3NvciBpcyBudWxsIVwiKTtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmFwaSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSdzIHByb2Nlc3NvciBhcGkgaXMgbnVsbCEgRGlkIHlvdSBmb3JnZXQgdG8gc2V0IHRoZSBBUEkgbmFtZSBvciBVUkw/XCIpO1xuXG5cdFx0aWYgKEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuYXBpICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0cmVzdWx0ID0gYXdhaXQgSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5hcGkubWFrZUNhbGwgKHJvdXRlLCBcblx0XHRcdFx0XHRcdFx0ZGF0YSwgaHR0cE1ldGhvZCwgZmlsZXMsIGJlYXJlclRva2VuKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgSFRUUCBKU09OIGZpbGUgb3IgcmVxdWVzdCB1c2luZyBIVFRQIEdFVC5cblx0ICogXG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYHRzXG5cdCAqIGF3YWl0IEhvdC5nZXRKU09OIChgaHR0cDovL2V4YW1wbGUuY29tL2V4YW1wbGUuanNvbmApO1xuXHQgKiBgYGBcblx0ICogXG5cdCAqIEBwYXJhbSB1cmwgVGhlIGZ1bGwgdXJsIHRvIG1ha2UgdGhlIEhUVFAgY2FsbC5cblx0ICogXG5cdCAqIEByZXR1cm5zIFRoZSBwYXJzZWQgSlNPTiBvYmplY3QuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZ2V0SlNPTiAodXJsOiBzdHJpbmcsIGJlYXJlclRva2VuOiBzdHJpbmcgPSBcIlwiKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRyZXR1cm4gKEhvdC5qc29uUmVxdWVzdCAodXJsLCBudWxsLCBiZWFyZXJUb2tlbiwgSG90RXZlbnRNZXRob2QuR0VUKSk7XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIEhUVFAgSlNPTiByZXF1ZXN0LlxuXHQgKiBcblx0ICogQGV4YW1wbGVcblx0ICogYGBgdHNcblx0ICogYXdhaXQgSG90Lmpzb25SZXF1ZXN0ICgnL3YxL2hlbGxvX3dvcmxkL2VjaG8nLCB7IG1lc3NhZ2U6IFwiSGVsbG8hXCIgfSk7XG5cdCAqIGBgYFxuXHQgKiBcblx0ICogQHBhcmFtIHVybCBUaGUgZnVsbCB1cmwgdG8gbWFrZSB0aGUgSFRUUCBjYWxsLlxuXHQgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBKU09OLnN0cmluZ2lmeSBhbmQgc2VuZC5cblx0ICogQHBhcmFtIGh0dHBNZXRob2QgVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSB0byBzZW5kIHRoZSBkYXRhLlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIHBhcnNlZCBKU09OIG9iamVjdC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBqc29uUmVxdWVzdCAodXJsOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwsIGJlYXJlclRva2VuOiBzdHJpbmcgPSBcIlwiLCBcblx0XHRodHRwTWV0aG9kOiBIb3RFdmVudE1ldGhvZCA9IEhvdEV2ZW50TWV0aG9kLlBPU1QpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdHRyeVxuXHRcdHtcblx0XHRcdGxldCBmZXRjaE9iajogYW55ID0ge1xuXHRcdFx0XHRcIm1ldGhvZFwiOiBodHRwTWV0aG9kLFxuXHRcdFx0XHRcImhlYWRlcnNcIjoge1xuXHRcdFx0XHRcdFx0XCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGh0dHBNZXRob2QgIT09IEhvdEV2ZW50TWV0aG9kLkdFVClcblx0XHRcdFx0ZmV0Y2hPYmpbXCJib2R5XCJdID0gSlNPTi5zdHJpbmdpZnkgKGRhdGEpO1xuXG5cdFx0XHRpZiAoYmVhcmVyVG9rZW4gIT0gXCJcIilcblx0XHRcdFx0ZmV0Y2hPYmouaGVhZGVyc1tcIkF1dGhvcml6YXRpb25cIl0gPSBgQmVhcmVyICR7YmVhcmVyVG9rZW59YDtcblxuXHRcdFx0bGV0IHJlcyA9IGF3YWl0IGZldGNoICh1cmwsIGZldGNoT2JqKTtcblxuXHRcdFx0aWYgKHJlcy5vayA9PT0gZmFsc2UpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYCR7cmVzLnN0YXR1c306ICR7cmVzLnN0YXR1c1RleHR9YCk7XG5cblx0XHRcdGxldCByZXN1bHQ6IGFueSA9IGF3YWl0IHJlcy5qc29uICgpO1xuXG5cdFx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdFx0fVxuXHRcdGNhdGNoIChleClcblx0XHR7XG5cdFx0XHRyZXR1cm4gKEpTT04uc3RyaW5naWZ5ICh7IFwiZXJyb3JcIjogYCR7ZXgubWVzc2FnZX0gLSBDb3VsZCBub3QgZmV0Y2ggJHt1cmx9YCB9KSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2UgYSBIVFRQIHJlcXVlc3QuIFRoaXMgaXMgYmFzaWNhbGx5IGp1c3QgYSB3cmFwcGVyIGZvciBmZXRjaCB0aGF0IGNhbiBhbHNvIHVwbG9hZCBmaWxlcy5cblx0ICogXG5cdCAqIEBleGFtcGxlXG5cdCAqIEhUVFAgSlNPTiBQT1NUXG5cdCAqIGBgYHRzXG5cdCAqIGF3YWl0IEhvdC5odHRwUmVxdWVzdCAoJ2h0dHA6Ly9vdGhlci1ob3RzdGFxLWFwaS5jb20vdjEvaGVsbG9fd29ybGQvZWNobycsIHsgbWVzc2FnZTogXCJIZWxsbyFcIiB9KTtcblx0ICogYGBgXG5cdCAqIFxuXHQgKiBAZXhhbXBsZVxuXHQgKiBVcGxvYWQgZmlsZSB1c2luZyBIVFRQIFBPU1Rcblx0ICogYGBgdHNcblx0ICogbGV0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKFwiZmlsZUlucHV0XCIpO1xuXHQgKiBsZXQgZmlsZSA9IGlucHV0LmZpbGVzWzBdO1xuXHQgKiBcblx0ICogYXdhaXQgSG90Lmh0dHBSZXF1ZXN0ICgnaHR0cDovL290aGVyLWhvdHN0YXEtYXBpLmNvbS92MS9oZWxsb193b3JsZC9lY2hvJywgXG5cdCAqIFx0XHR7IG1lc3NhZ2U6IFwiSGVsbG8hXCIgfSwgSG90RXZlbnRNZXRob2QuUE9TVCwgXG5cdCAqIFx0XHR7XG5cdCAqIFx0XHRcdFwiaW5kZXhGaWxlS2V5XCI6IGZpbGVcblx0ICogXHRcdH0pO1xuXHQgKiBgYGBcblx0ICovXG5cdHN0YXRpYyBhc3luYyBodHRwUmVxdWVzdCAodXJsOiBzdHJpbmcsIGRhdGE6IGFueSwgaHR0cE1ldGhvZDogSG90RXZlbnRNZXRob2QgPSBIb3RFdmVudE1ldGhvZC5QT1NULCBcblx0XHRmaWxlczogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gPSB7fSwgYmVhcmVyVG9rZW46IHN0cmluZyA9IFwiXCIpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGNvbnN0IG51bUZpbGVzOiBudW1iZXIgPSBPYmplY3Qua2V5cyAoZmlsZXMpLmxlbmd0aDtcblx0XHRsZXQgaHR0cE1ldGhvZExvd2VyOiBzdHJpbmcgPSBodHRwTWV0aG9kLnRvTG93ZXJDYXNlICgpO1xuXG5cdFx0aWYgKGh0dHBNZXRob2QgPT09IEhvdEV2ZW50TWV0aG9kLkZJTEVfVVBMT0FEKVxuXHRcdFx0aHR0cE1ldGhvZExvd2VyID0gXCJwb3N0XCI7XG5cblx0XHRsZXQgdXBsb2FkRmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuXHRcdGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTtcblxuXHRcdGlmIChudW1GaWxlcyA+IDApXG5cdFx0e1xuXHRcdFx0aWYgKGh0dHBNZXRob2RMb3dlciAhPT0gXCJwb3N0XCIpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRvIHVwbG9hZCBmaWxlcywgeW91IG11c3Qgc2V0IHRoZSBodHRwTWV0aG9kIHRvIFBPU1QuYCk7XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBmaWxlcylcblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgZmlsZSA9IGZpbGVzW2tleV07XG5cblx0XHRcdFx0aWYgKGZpbGUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZvcm1EYXRhLmFwcGVuZCAoa2V5LCBmaWxlKTtcblx0XHRcdFx0XHR1cGxvYWRGaWxlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh1cGxvYWRGaWxlID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGxldCByZXF1ZXN0SW5pdDogUmVxdWVzdEluaXQgPSB7XG5cdFx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFx0XHRcIkhvdFN0YXFVcGxvYWRcIjogXCJ0cnVlXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRib2R5OiBmb3JtRGF0YVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRpZiAoYmVhcmVyVG9rZW4gIT0gXCJcIilcblx0XHRcdHtcblx0XHRcdFx0cmVxdWVzdEluaXQuaGVhZGVycyA9IHtcblx0XHRcdFx0XHRcIkF1dGhvcml6YXRpb25cIjogYEJlYXJlciAke2JlYXJlclRva2VufWBcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0bGV0IHJlcyA9IGF3YWl0IGZldGNoICh1cmwsIHJlcXVlc3RJbml0KTtcblx0XHRcdGxldCBqc29uUmVzOiBhbnkgPSBhd2FpdCByZXMuanNvbiAoKTtcblxuXHRcdFx0aWYgKGRhdGFbXCJob3RzdGFxXCJdID09IG51bGwpXG5cdFx0XHRcdGRhdGFbXCJob3RzdGFxXCJdID0ge307XG5cblx0XHRcdGlmIChkYXRhW1wiaG90c3RhcVwiXVtcInVwbG9hZHNcIl0gPT0gbnVsbClcblx0XHRcdFx0ZGF0YVtcImhvdHN0YXFcIl1bXCJ1cGxvYWRzXCJdID0ge307XG5cblx0XHRcdGRhdGFbXCJob3RzdGFxXCJdW1widXBsb2Fkc1wiXVtcInVwbG9hZElkXCJdID0gXG5cdFx0XHRcdFx0anNvblJlc1tcImhvdHN0YXFcIl1bXCJ1cGxvYWRzXCJdW1widXBsb2FkSWRcIl07XG5cblx0XHRcdC8vIEFmdGVyIHRoZSB1cGxvYWQsIG1ha2UgdGhlIGFjdHVhbCBKU09OIGNhbGwuIERvIG5vdCBwYXNzIGZpbGVzIGFnYWluLlxuXHRcdFx0Y29uc3QgcmVzdWx0OiBhbnkgPSBhd2FpdCBIb3QuaHR0cFJlcXVlc3QgKHVybCwgZGF0YSwgSG90RXZlbnRNZXRob2QuUE9TVCwge30sIGJlYXJlclRva2VuKTtcblxuXHRcdFx0cmV0dXJuIChyZXN1bHQpO1xuXHRcdH1cblxuXHRcdGxldCBmZXRjaE9iajogYW55ID0ge1xuXHRcdFx0XHRtZXRob2Q6IGh0dHBNZXRob2RMb3dlcixcblx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdFx0XCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoYmVhcmVyVG9rZW4gIT0gXCJcIilcblx0XHRcdGZldGNoT2JqLmhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdID0gYEJlYXJlciAke2JlYXJlclRva2VufWA7XG5cblx0XHRpZiAoKGh0dHBNZXRob2RMb3dlciAhPT0gXCJnZXRcIikgJiYgXG5cdFx0XHQoaHR0cE1ldGhvZExvd2VyICE9PSBcImhlYWRcIikpXG5cdFx0e1xuXHRcdFx0ZmV0Y2hPYmpbXCJib2R5XCJdID0gSlNPTi5zdHJpbmdpZnkgKGRhdGEpO1xuXHRcdH1cblxuXHRcdGxldCBwcm9taXNlID0gbmV3IFByb21pc2UgKChyZXNvbHZlLCByZWplY3QpID0+IFxuXHRcdFx0e1xuXHRcdFx0XHRmZXRjaCAodXJsLCBmZXRjaE9iaikudGhlbiAoYXN5bmMgKHJlcykgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXMuanNvbiAoKS50aGVuICgoanNvbk9iajogYW55KSA9PlxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSAoanNvbk9iaik7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaCAoKHJlYXNvbjogYW55KSA9PlxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgJHt1cmx9OiAke3JlYXNvbi5tZXNzYWdlfWApO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCAoKHJlYXNvbjogYW55KSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYCR7dXJsfTogJHtyZWFzb24ubWVzc2FnZX1gKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIChwcm9taXNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFY2hvIG91dCBzb21lIG91dHB1dC5cblx0ICovXG5cdHN0YXRpYyBlY2hvIChtZXNzYWdlOiBzdHJpbmcpOiB2b2lkXG5cdHtcblx0XHRIb3QuT3V0cHV0ICs9IG1lc3NhZ2U7XG5cdH1cblxuXHQvKipcblx0ICogRWNobyBvdXQgdGhlIENTUyBmb3IgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgZGlzcGxheUNTUyAoKTogdm9pZFxuXHR7XG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBIb3QuQ1NTLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBjc3NGaWxlOiBzdHJpbmcgPSBIb3QuQ1NTW2lJZHhdO1xuXHRcdFx0bGV0IGNzc091dDogc3RyaW5nID0gSG90LmNzc1N0cjtcblxuXHRcdFx0Y3NzT3V0ID0gY3NzT3V0LnJlcGxhY2UgKC9cXCVDU1NfRklMRVxcJS9nLCBjc3NGaWxlKTtcblxuXHRcdFx0SG90LmVjaG8gKGNzc091dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEVjaG8gb3V0IHRoZSBKUyBmaWxlcyBmb3IgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgZGlzcGxheUpTRmlsZXMgKCk6IHZvaWRcblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgSG90LkpTRmlsZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGpzRmlsZTogc3RyaW5nID0gSG90LkpTRmlsZXNbaUlkeF07XG5cdFx0XHRsZXQganNGaWxlT3V0OiBzdHJpbmcgPSBIb3QuanNGaWxlU3RyO1xuXG5cdFx0XHRqc0ZpbGVPdXQgPSBqc0ZpbGVPdXQucmVwbGFjZSAoL1xcJUpTX0ZJTEVcXCUvZywganNGaWxlKTtcblxuXHRcdFx0SG90LmVjaG8gKGpzRmlsZU91dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEVjaG8gb3V0IHRoZSBKUyBzY3JpcHRzIGZvciB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICovXG5cdHN0YXRpYyBkaXNwbGF5SlNTY3JpcHRzICgpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IEhvdC5KU1NjcmlwdHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGpzU2NyaXB0OiBzdHJpbmcgPSBIb3QuSlNTY3JpcHRzW2lJZHhdO1xuXHRcdFx0bGV0IGpzU2NyaXB0T3V0OiBzdHJpbmcgPSBIb3QuanNTY3JpcHRzU3RyO1xuXG5cdFx0XHRqc1NjcmlwdE91dCA9IGpzU2NyaXB0T3V0LnJlcGxhY2UgKC9cXCVKU19DT0RFXFwlL2csIGpzU2NyaXB0KTtcblxuXHRcdFx0SG90LmVjaG8gKGpzU2NyaXB0T3V0KTtcblx0XHR9XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90RXZlbnRNZXRob2QsIEhvdFJvdXRlTWV0aG9kLCBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24gfSBmcm9tIFwiLi9Ib3RSb3V0ZU1ldGhvZFwiO1xuaW1wb3J0IHsgSG90REIgfSBmcm9tIFwiLi9Ib3REQlwiO1xuXG5pbXBvcnQgeyBIb3REQlNjaGVtYSB9IGZyb20gXCIuL3NjaGVtYXMvSG90REJTY2hlbWFcIjtcbmltcG9ydCB7IEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuXG4vKipcbiAqIFRoZSBBUEkgdG8gbG9hZC5cbiAqL1xuZXhwb3J0IHR5cGUgQVBJdG9Mb2FkID0ge1xuXHQvKipcblx0ICogVGhlIGltcG9ydGVkIGNsYXNzIHRvIGxvYWQuXG5cdCAqL1xuXHRpbXBvcnRlZEFQSUNsYXNzOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgZXhwb3J0ZWQgY2xhc3MgbmFtZSB0byBpbXBvcnQgYW5kIGluc3RhbnRpYXRlLlxuXHQgKi9cblx0ZXhwb3J0ZWRDbGFzc05hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXRoIHRvIHRoZSBIb3RBUEkgY2xhc3MgdG8gbG9hZC5cblx0ICovXG5cdHBhdGg6IHN0cmluZztcbiB9O1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIG9iamVjdCB0byB1c2UgZHVyaW5nIGV2ZW50IGV4ZWN1dGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIEV2ZW50RXhlY3V0aW9uVHlwZVxue1xuXHRIb3RSb3V0ZSxcblx0SG90TWV0aG9kLFxuXHRIb3RBUElcbn1cblxuLyoqXG4gKiBUaGUgQVBJIHRvIHVzZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEhvdEFQSVxue1xuXHQvKipcblx0ICogVGhlIHNlcnZlciBjb25uZWN0aW9uLlxuXHQgKi9cblx0Y29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50O1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBBUEkuXG5cdCAqL1xuXHRkZXNjcmlwdGlvbjogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIHRvIHByb3ZpZGUgdG8gdGhlIEFQSS5cblx0ICovXG5cdGJlYXJlclRva2VuOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYmFzZSB1cmwgZm9yIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRiYXNlVXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBJZiBzZXQsIHRoaXMgd2lsbCBjcmVhdGUgdGhlIHJvdXRlIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGZvciBcblx0ICogZWFzeSBjbGllbnQvc2VydmVyIGNhbGxpbmcuXG5cdCAqL1xuXHRjcmVhdGVGdW5jdGlvbnM6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cblx0ICovXG5cdGV4ZWN1dGVFdmVudHNVc2luZzogRXZlbnRFeGVjdXRpb25UeXBlO1xuXHQvKipcblx0ICogVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRkYjogSG90REI7XG5cdC8qKlxuXHQgKiBBZGRpdGlvbmFsIE9wZW5BUEkgZG9jdW1lbnRhdGlvbiB0byBiZSBhZGRlZC4gQW55dGhpbmcgYWRkZWQgaGVyZSBcblx0ICogd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgT3BlbkFQSSBkb2N1bWVudGF0aW9uIGFzIGEgSlNPTiBvYmplY3QuXG5cdCAqL1xuXHRvcGVuQVBJOiB7XG5cdFx0aW5mbz86IGFueTtcblx0XHRzZWN1cml0eT86IGFueTtcblx0XHR0YWdzPzogYW55O1xuXHRcdGNvbXBvbmVudHM/OiBhbnk7XG5cdFx0LyoqXG5cdFx0ICogQW55IGV4dHJhIGluZm9ybWF0aW9uIHRvIGFkZCB0byB0aGUgT3BlbkFQSSBkb2N1bWVudGF0aW9uLlxuXHRcdCAqL1xuXHRcdGV4dHJhPzogYW55O1xuXHR9O1xuXHQvKipcblx0ICogVGhlIGZ1bmN0aW9uIHVzZWQgZm9yIHVzZXIgYXV0aGVudGljYXRpb24uXG5cdCAqL1xuXHR1c2VyQXV0aDogU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRyb3V0ZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFJvdXRlIH07XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRoZSBBUEkgaXMgYWJvdXQgdG8gc3RhcnQgcmVnaXN0ZXJpbmcgcm91dGVzLiBJZiBcblx0ICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgc2VydmVyIHdpbGwgbm90IHN0YXJ0LlxuXHQgKi9cblx0b25QcmVSZWdpc3RlcjogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhlIEFQSSBoYXMgZmluaXNoZWQgcmVnaXN0ZXJpbmcgcm91dGVzLiBJZiBcblx0ICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgc2VydmVyIHdpbGwgbm90IHN0YXJ0LlxuXHQgKi9cblx0b25Qb3N0UmVnaXN0ZXI6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cblx0Y29uc3RydWN0b3IgKGJhc2VVcmw6IHN0cmluZywgY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50LCBkYjogSG90REIgPSBudWxsKVxuXHR7XG5cdFx0aWYgKGNvbm5lY3Rpb24gPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIHNlcnZlciBhdHRhY2hlZCB0byBhcGkgd2l0aCBiYXNlVXJsOiAke2Jhc2VVcmx9YCk7XG5cblx0XHR0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24gPSBcIlwiO1xuXHRcdHRoaXMuYmVhcmVyVG9rZW4gPSBcIlwiO1xuXHRcdHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG5cdFx0dGhpcy5jcmVhdGVGdW5jdGlvbnMgPSB0cnVlO1xuXHRcdHRoaXMuZXhlY3V0ZUV2ZW50c1VzaW5nID0gRXZlbnRFeGVjdXRpb25UeXBlLkhvdFJvdXRlO1xuXHRcdHRoaXMuZGIgPSBkYjtcblx0XHR0aGlzLm9wZW5BUEkgPSB7fTtcblx0XHR0aGlzLnVzZXJBdXRoID0gbnVsbDtcblx0XHR0aGlzLnJvdXRlcyA9IHt9O1xuXHRcdHRoaXMub25QcmVSZWdpc3RlciA9IG51bGw7XG5cdFx0dGhpcy5vblBvc3RSZWdpc3RlciA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSBkYXRhYmFzZSBzY2hlbWEgZm9yIHVzZS5cblx0ICovXG5cdHNldERCU2NoZW1hIChzY2hlbWE6IEhvdERCU2NoZW1hKTogdm9pZFxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5hcGkgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIEFQSSBoYXMgYmVlbiBzZXQhYCk7XG5cblx0XHRpZiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYiA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTm8gZGF0YWJhc2UgaGFzIGJlZW4gc2V0IGZvciBBUEkgYmFzZSB1cmwgJHt0aGlzLmNvbm5lY3Rpb24uYXBpLmJhc2VVcmx9YCk7XG5cblx0XHR0aGlzLmNvbm5lY3Rpb24uYXBpLmRiLnNjaGVtYSA9IHNjaGVtYTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGRhdGFiYXNlIGJlaW5nIHVzZWQuXG5cdCAqL1xuXHRnZXREQiAoKTogSG90REJcblx0e1xuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBkYXRhYmFzZSBoYXMgYmVlbiBzZXQgZm9yIEFQSSBiYXNlIHVybCAke3RoaXMuY29ubmVjdGlvbi5hcGkuYmFzZVVybH1gKTtcblxuXHRcdHJldHVybiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYik7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBkYXRhYmFzZSBzY2hlbWEgYmVpbmcgdXNlZC5cblx0ICovXG5cdGdldERCU2NoZW1hICgpOiBIb3REQlNjaGVtYVxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5hcGkuZGIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIGRhdGFiYXNlIGhhcyBiZWVuIHNldCBmb3IgQVBJIGJhc2UgdXJsICR7dGhpcy5jb25uZWN0aW9uLmFwaS5iYXNlVXJsfWApO1xuXG5cdFx0cmV0dXJuICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiLnNjaGVtYSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgcm91dGUuIElmIHRoaXMuY3JlYXRlRnVuY3Rpb25zIGlzIHNldCB0byB0cnVlICh3aGljaCBpcyBkZWZhdWx0KSwgdGhpcyB3aWxsIHRha2UgdGhlIGluY29taW5nIFxuXHQgKiByb3V0ZSBhbmQgY3JlYXRlIGFuIG9iamVjdCBpbiB0aGlzIEhvdEFQSSBvYmplY3QgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIHJvdXRlLiBJZiB0aGVyZSdzIFxuXHQgKiBhbnkgSG90Um91dGVNZXRob2RzIGluc2lkZSBvZiB0aGUgaW5jb21pbmcgSG90Um91dGUsIGl0IHdpbGwgY3JlYXRlIHRoZSBtZXRob2RzIFxuXHQgKiBhbmQgYXR0YWNoIHRoZW0gdG8gdGhlIG5ld2x5IGNyZWF0ZWQgSG90Um91dGUgb2JqZWN0LlxuXHQgKiBcblx0ICogQGV4YW1wbGVcblx0ICogYGBgdHNcblx0ICogaW1wb3J0IHsgSG90QVBJLCBIb3RSb3V0ZSB9IGZyb20gXCJob3RzdGFxXCI7XG5cdCAqIFxuXHQgKiBjbGFzcyBBcHBBUEkgZXh0ZW5kcyBIb3RBUElcblx0ICoge1xuXHQgKiBcdFx0Y29uc3RydWN0b3IgKGJhc2VVcmw6IHN0cmluZywgY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50ID0gbnVsbCwgZGI6IGFueSA9IG51bGwpXG5cdCAqIFx0XHR7XG5cdCAqIFx0XHRcdHN1cGVyKGJhc2VVcmwsIGNvbm5lY3Rpb24sIGRiKTtcblx0ICogXG5cdCAqIFx0XHRcdC8vIENyZWF0ZXMgdGhlIHJvdXRlIGh0dHA6Ly8xMjcuMC4wLjE6ODA4MC92MS9oZWxsb193b3JsZC9cblx0ICogXHRcdFx0dGhpcy5hZGRSb3V0ZSAobmV3IEV4YW1wbGVSb3V0ZSAodGhpcykpO1xuXHQgKiBcdFx0fVxuXHQgKiB9XG5cdCAqIFxuXHQgKiBjbGFzcyBFeGFtcGxlUm91dGUgZXh0ZW5kcyBIb3RSb3V0ZVxuXHQgKiB7XG5cdCAqIFx0XHRjb25zdHJ1Y3RvciAoYXBpOiBBcHBBUEkpXG5cdCAqIFx0XHR7XG5cdCAqIFx0XHRcdHN1cGVyIChhcGkuY29ubmVjdGlvbiwgXCJoZWxsb193b3JsZFwiKTtcblx0ICogXG5cdCAqIFx0XHRcdC8vIENyZWF0ZXMgdGhlIEhUVFAgR0VUIGVuZHBvaW50OiBodHRwOi8vMTI3LjAuMC4xOjgwODAvdjEvaGVsbG9fd29ybGQvaGlcblx0ICogXHRcdFx0Ly8gV2hlbiB0aGlzIGVuZHBvaW50IGlzIGFjY2Vzc2VkLCB0aGUgSlNPTiByZXNwb25zZSB3aWxsIHJldHVybiBcImhlbGxvXCJcblx0ICogXHRcdFx0dGhpcy5hZGRNZXRob2QgKFwiaGlcIiwgYXN5bmMgKCkgPT5cblx0ICogXHRcdFx0e1xuXHQgKiBcdFx0XHRcdHJldHVybiAoXCJoZWxsb1wiKTtcblx0ICogXHRcdFx0fSk7XG5cdCAqIFx0XHR9XG5cdCAqIH1cblx0ICogYGBgXG5cdCAqIFxuXHQgKiBJbiB0aGUgY2xpZW50IGJyb3dzZXIsIHRoaXMgd291bGQgYmUgdXNlZCBsaWtlIHNvOlxuXHQgKiBgYGBcblx0ICogYXdhaXQgSG90LkFQSS5oZWxsb193b3JsZC5oaSAoKTtcblx0ICogYGBgXG5cdCAqIFxuXHQgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRvIGFkZC4gQ2FuIGJlIGVpdGhlciBhIGZ1bGwgSG90Um91dGUgb2JqZWN0LCBvciBqdXN0IFxuXHQgKiB0aGUgcm91dGUncyBuYW1lLiBJZiBhIEhvdFJvdXRlIG9iamVjdCBpcyBzdXBwbGllZCwgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtZXRlcnMgXG5cdCAqIHdpbGwgYmUgaWdub3JlZC5cblx0ICogQHBhcmFtIHJvdXRlTWV0aG9kIFRoZSByb3V0ZSdzIG1ldGhvZCB0byBhZGQuIElmIHRoZSByb3V0ZSBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcsIFxuXHQgKiBpdCB3aWxsIGJlIGludGVycHJldGVkIGFzIHRoZSByb3V0ZSdzIG5hbWUsIGFuZCB0aGlzIHdpbGwgYmUgdGhlIG1ldGhvZCBhZGRlZCB0byBcblx0ICogdGhlIG5ldyByb3V0ZS5cblx0ICogQHBhcmFtIGV4ZWN1dGVGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHJvdXRlTWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgQVBJLlxuXHQgKi9cblx0YWRkUm91dGUgKFxuXHRcdHJvdXRlOiBIb3RSb3V0ZSB8IHN0cmluZyxcblx0XHRyb3V0ZU1ldGhvZDogSG90Um91dGVNZXRob2QgfCBzdHJpbmcgPSBudWxsLFxuXHRcdGV4ZWN1dGVGdW5jdGlvbjogKHJlcTogYW55LCByZXM6IGFueSwgYXV0aG9yaXplZFZhbHVlOiBhbnksIGpzb25PYmo6IGFueSwgcXVlcnlPYmo6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gbnVsbFxuXHRcdCk6IHZvaWRcblx0e1xuXHRcdGxldCByb3V0ZU5hbWU6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAodHlwZW9mIChyb3V0ZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0cm91dGVOYW1lID0gcm91dGU7XG5cblx0XHRcdGlmICh0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdID09IG51bGwpXG5cdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0gPSBuZXcgSG90Um91dGUgKHRoaXMuY29ubmVjdGlvbiwgcm91dGVOYW1lKTtcblxuXHRcdFx0aWYgKHR5cGVvZiAocm91dGVNZXRob2QpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLmFkZE1ldGhvZCAoSG90Um91dGVNZXRob2QuY3JlYXRlIChcblx0XHRcdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLCByb3V0ZU1ldGhvZCwgZXhlY3V0ZUZ1bmN0aW9uKSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0uYWRkTWV0aG9kIChyb3V0ZU1ldGhvZCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRyb3V0ZU5hbWUgPSByb3V0ZS5yb3V0ZTtcblx0XHRcdHRoaXMucm91dGVzW3JvdXRlLnJvdXRlXSA9IHJvdXRlO1xuXHRcdH1cblxuXHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0uY29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbjtcblxuXHRcdC8vIENyZWF0ZSB0aGUgcm91dGUgZnVuY3Rpb25zIGZvciB0aGUgc2VydmVyL2NsaWVudC4gVGhpcyBtdXN0IGFsc28gYmUgZG9uZSBhZnRlciB0aGUgcm91dGUncyBvblByZVJlZ2lzdGVyIGhhcyBiZWVuIGNhbGxlZC5cblx0XHRpZiAodGhpcy5jcmVhdGVGdW5jdGlvbnMgPT09IHRydWUpXG5cdFx0XHR0aGlzLmNyZWF0ZUFQSVJvdXRlTWV0aG9kcyAocm91dGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIEFQSSByb3V0ZSBtZXRob2RzIGZvciB1c2UgaW4gYXBpLm15X3JvdXRlLm15X21ldGhvZCAoKS5cblx0ICovXG5cdGNyZWF0ZUFQSVJvdXRlTWV0aG9kcyAocm91dGVOYW1lOiBzdHJpbmcpOiB2b2lkXG5cdHtcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0bGV0IG5ld1JvdXRlOiB7IFtuYW1lOiBzdHJpbmddOiBGdW5jdGlvbiB9ID0gdGhpc1tyb3V0ZU5hbWVdO1xuXG5cdFx0aWYgKG5ld1JvdXRlID09IG51bGwpXG5cdFx0XHRuZXdSb3V0ZSA9IHt9O1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLm1ldGhvZHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGN1cnJlbnRSb3V0ZTogSG90Um91dGUgPSB0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdO1xuXHRcdFx0bGV0IG5ld1JvdXRlTWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IHRoaXMucm91dGVzW3JvdXRlTmFtZV0ubWV0aG9kc1tpSWR4XTtcblxuXHRcdFx0Lypcblx0XHRcdC8vLyBAZml4bWUgSXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyBBIEhUVFAgY2FsbCBpcyBtdWNoIG1vcmUgcHJlZmVyYWJsZSwgXG5cdFx0XHQvLy8gZXNwZWNpYWxseSBmb3IgYWNjcnVhdGUgdGVzdGluZy5cblx0XHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIb3RTZXJ2ZXIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChuZXdSb3V0ZU1ldGhvZC5vblNlcnZlckV4ZWN1dGUgIT0gbnVsbClcblx0XHRcdFx0XHRuZXdSb3V0ZVtuZXdSb3V0ZU1ldGhvZC5uYW1lXSA9IG5ld1JvdXRlTWV0aG9kLm9uU2VydmVyRXhlY3V0ZTtcblx0XHRcdH1cblx0XHRcdGVsc2UqL1xuXHRcdFx0e1xuXHRcdFx0XHQvKlxuXHRcdFx0XHQvLy8gQGZpeG1lIElzIG9uQ2xpZW50RXhlY3V0ZSBuZWNlc3Nhcnk/IEknbSB0aGlua2luZyB0aGUgZGV2IGNhbiBqdXN0IHNpbXBseSBjcmVhdGUgXG5cdFx0XHRcdC8vLyB0aGVpciBvd24gZnVuY3Rpb24gdG8gY2FsbC5cblx0XHRcdFx0aWYgKG5ld1JvdXRlTWV0aG9kLm9uQ2xpZW50RXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdG5ld1JvdXRlW25ld1JvdXRlTWV0aG9kLm5hbWVdID0gbmV3Um91dGVNZXRob2Qub25DbGllbnRFeGVjdXRlO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHsqL1xuXHRcdFx0XHRcdG5ld1JvdXRlW25ld1JvdXRlTWV0aG9kLm5hbWVdID0gKGRhdGE6IGFueSwgZmlsZXM6IGFueSk6IGFueSA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgaHR0cE1ldGhvZDogc3RyaW5nID0gbmV3Um91dGVNZXRob2QudHlwZTtcblx0XHRcdFx0XHRcdFx0Ly8gQ29uc3RydWN0IHRoZSB1cmwgaGVyZS4gQmFzZSArIHJvdXRlICsgcm91dGUgbWV0aG9kXG5cdFx0XHRcdFx0XHRcdGxldCByb3V0ZVN0cjogc3RyaW5nID0gbmV3Um91dGVNZXRob2QuZ2V0Um91dGVVcmwgKCk7XG5cdFx0XHRcdFx0XHRcdGxldCBhcmdzOiBhbnlbXSA9IFtyb3V0ZVN0ciwgZGF0YSwgaHR0cE1ldGhvZCwgZmlsZXMsIHRoaXMuYmVhcmVyVG9rZW5dO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAodGhpcy5tYWtlQ2FsbC5hcHBseSAodGhpcywgYXJncykpO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0Ly99XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHRoaXNbcm91dGVOYW1lXSA9IG5ld1JvdXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGEgcm91dGUgd2l0aCB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgcmVnaXN0ZXJSb3V0ZSAocm91dGU6IEhvdFJvdXRlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbiBpbnN0YW5jZW9mIEhvdFNlcnZlcilcblx0XHRcdGF3YWl0IHRoaXMuY29ubmVjdGlvbi5yZWdpc3RlclJvdXRlIChyb3V0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXIgYWxsIHJvdXRlcyB3aXRoIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRhc3luYyByZWdpc3RlclJvdXRlcyAoKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Zm9yIChsZXQga2V5IGluIHRoaXMucm91dGVzKVxuXHRcdHtcblx0XHRcdGxldCByb3V0ZTogSG90Um91dGUgPSB0aGlzLnJvdXRlc1trZXldO1xuXG5cdFx0XHRhd2FpdCB0aGlzLnJlZ2lzdGVyUm91dGUgKHJvdXRlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIGNhbGwgdG8gdGhlIEFQSS5cblx0ICovXG5cdGFzeW5jIG1ha2VDYWxsIChyb3V0ZTogc3RyaW5nLCBkYXRhOiBhbnksIGh0dHBNZXRob2Q6IEhvdEV2ZW50TWV0aG9kID0gSG90RXZlbnRNZXRob2QuUE9TVCwgXG5cdFx0ZmlsZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge30sIGJlYXJlclRva2VuOiBzdHJpbmcgPSBcIlwiKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJhc2VVcmw7XG5cblx0XHRjb25zdCBodHRwTWV0aG9kU3RyOiBzdHJpbmcgPSBodHRwTWV0aG9kLnRvVXBwZXJDYXNlICgpO1xuXG5cdFx0aWYgKHVybFsodXJsLmxlbmd0aCAtIDEpXSA9PT0gXCIvXCIpXG5cdFx0XHR1cmwgPSB1cmwuc3Vic3RyICgwLCAodXJsLmxlbmd0aCAtIDEpKTtcblxuXHRcdGlmIChyb3V0ZVswXSAhPT0gXCIvXCIpXG5cdFx0XHR1cmwgKz0gXCIvXCI7XG5cblx0XHR1cmwgKz0gcm91dGU7XG5cblx0XHRyZXR1cm4gKEhvdC5odHRwUmVxdWVzdCAodXJsLCBkYXRhLCBodHRwTWV0aG9kLCBmaWxlcywgYmVhcmVyVG9rZW4pKTtcblx0fVxufVxuIiwiLyoqXG4gKiBBbiBhc3NldCB0byBsb2FkLlxuICovXG5leHBvcnQgY2xhc3MgSG90QXNzZXRcbntcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIGFzc2V0LiBDYW4gYmU6XG5cdCAqICoganNcblx0ICogKiBjc3Ncblx0ICogKiBodG1sXG5cdCAqICogY29tcG9uZW50XG5cdCAqL1xuXHR0eXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgYXNzZXQgdG8gbG9hZC5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byB0aGUgYXNzZXRzIHRvIGxvYWQuXG5cdCAqL1xuXHRwYXRoPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHByZWxvYWRlZCBjb250ZW50IHRvIGxvYWQuIFJlcXVpcmVzIG5hbWUgdG8gYmUgc2V0LlxuXHQgKi9cblx0Y29udGVudD86IHN0cmluZztcblxuXHRjb25zdHJ1Y3RvciAodHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSBcIlwiKVxuXHR7XG5cdFx0dGhpcy50eXBlID0gdHlwZTtcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMucGF0aCA9IFwiXCI7XG5cdFx0dGhpcy5jb250ZW50ID0gXCJcIjtcblx0fVxuXG5cdGxvYWQgKCk6IHZvaWRcblx0e1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgdGhlIGFzc2V0LlxuXHQgKi9cblx0b3V0cHV0ICgpOiBzdHJpbmcgfCB7IG5hbWU6IHN0cmluZzsgdXJsPzogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nOyB9XG5cdHtcblx0XHRpZiAoKHRoaXMucGF0aCA9PSBudWxsKSAmJiAodGhpcy5jb250ZW50ID09IG51bGwpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90QXNzZXQgJHt0aGlzLm5hbWV9IG9mIHR5cGUgJHt0aGlzLnR5cGV9IGRvZXMgbm90IGhhdmUgYSBwYXRoIG9yIGNvbnRlbnQgc2V0IWApO1xuXG5cdFx0bGV0IG91dHB1dDogc3RyaW5nIHwgeyBuYW1lOiBzdHJpbmc7IHVybD86IHN0cmluZzsgY29udGVudD86IHN0cmluZzsgfSA9IFwiXCI7XG5cblx0XHRpZiAodGhpcy5wYXRoICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMucGF0aCAhPT0gXCJcIilcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRoaXMudHlwZSA9PT0gXCJqc1wiKVxuXHRcdFx0XHRcdG91dHB1dCA9IGA8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiIHNyYyA9IFwiJHt0aGlzLnBhdGh9XCI+PC9zY3JpcHQ+YDtcblxuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcImNzc1wiKVxuXHRcdFx0XHRcdG91dHB1dCA9IGA8bGluayBocmVmID0gXCIke3RoaXMucGF0aH1cIiByZWwgPSBcInN0eWxlc2hlZXRcIiAvPmA7XG5cblx0XHRcdFx0aWYgKCh0aGlzLnR5cGUgPT09IFwiaHRtbFwiKSB8fCBcblx0XHRcdFx0XHQodGhpcy50eXBlID09PSBcImNvbXBvbmVudFwiKSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLm5hbWUgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBMb2FkaW5nIGFuIEhUTUwgb3IgY29tcG9uZW50IGFzc2V0IHJlcXVpcmVzIGEgbmFtZSB0byBiZSBzZXQhYCk7XG5cblx0XHRcdFx0XHRsZXQgZmlsZVVybDogc3RyaW5nID0gYFwiJHt0aGlzLnBhdGh9XCJgO1xuXHRcdFx0XHRcdG91dHB1dCA9IHsgbmFtZTogdGhpcy5uYW1lLCB1cmw6IHRoaXMucGF0aCB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY29udGVudCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLmNvbnRlbnQgIT09IFwiXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLnR5cGUgPT09IFwianNcIilcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBMb2FkaW5nIEpTIGFzc2V0cyB1c2luZyBjb250ZW50IGlzIG5vdCBzdXBwb3J0ZWQgeWV0IWApO1xuXG5cdFx0XHRcdGlmICh0aGlzLnR5cGUgPT09IFwiY3NzXCIpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTG9hZGluZyBDU1MgYXNzZXRzIHVzaW5nIGNvbnRlbnQgaXMgbm90IHN1cHBvcnRlZCB5ZXQhYCk7XG5cblx0XHRcdFx0aWYgKHRoaXMudHlwZSA9PT0gXCJodG1sXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5uYW1lID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTG9hZGluZyBhbiBIVE1MIGFzc2V0IHJlcXVpcmVzIGEgbmFtZSB0byBiZSBzZXQhYCk7XG5cblx0XHRcdFx0XHRsZXQgZXNjYXBlZENvbnRlbnQ6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5ICh0aGlzLmNvbnRlbnQpO1xuXHRcdFx0XHRcdGxldCBmaWxlVXJsOiBzdHJpbmcgPSB0aGlzLnBhdGg7XG5cdFx0XHRcdFx0bGV0IGZpbGVDb250ZW50OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0Ly8gRmluZCBhbnkgc2NyaXB0IHRhZ3MgYW5kIGludGVycnVwdCB0aGVtIHNvIHRoZSBIVE1MIHBhcnNlcnMgXG5cdFx0XHRcdFx0Ly8gZG9uJ3QgZ2V0IGNvbmZ1c2VkLlxuXHRcdFx0XHRcdGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSAobmV3IFJlZ0V4cCAoXCJcXFxcPHNjcmlwdFwiLCBcImdtaVwiKSwgXCI8c2NyXFxcIiArIFxcXCJpcHRcIik7XG5cdFx0XHRcdFx0ZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC5yZXBsYWNlIChuZXcgUmVnRXhwIChcIlxcXFw8XFxcXC9zY3JpcHRcIiwgXCJnbWlcIiksIFwiPC9zY3JcXFwiICsgXFxcImlwdFwiKTtcblxuXHRcdFx0XHRcdGZpbGVDb250ZW50ID0gZXNjYXBlZENvbnRlbnQ7XG5cblx0XHRcdFx0XHRvdXRwdXQgPSB7IG5hbWU6IHRoaXMubmFtZSwgdXJsOiBmaWxlVXJsLCBjb250ZW50OiBlc2NhcGVkQ29udGVudCB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90U2VydmVyVHlwZSB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgSG90TG9nIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5cbi8qKlxuICogQSBjbGllbnQgY29ubmVjdGVkIHRvIGEgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgSG90Q2xpZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBBUEkgdG8gdXNlLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIEFQSSB0byB1c2UuXG5cdCAqL1xuXHR0ZXN0ZXJBUEk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIHNlcnZlci5cblx0ICovXG5cdHR5cGU6IEhvdFNlcnZlclR5cGU7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cblx0Y29uc3RydWN0b3IgKHByb2Nlc3NvcjogSG90U3RhcSlcblx0e1xuXHRcdHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuXHRcdHRoaXMuYXBpID0gbnVsbDtcblx0XHR0aGlzLnRlc3RlckFQSSA9IG51bGw7XG5cdFx0dGhpcy50eXBlID0gSG90U2VydmVyVHlwZS5IVFRQO1xuXHRcdHRoaXMubG9nZ2VyID0gcHJvY2Vzc29yLmxvZ2dlcjtcblx0fVxufSIsImltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcblxuZXhwb3J0IGludGVyZmFjZSBIb3RDb21wb25lbnRPdXRwdXRcbntcblx0LyoqXG5cdCAqIFRoZSBIVE1MIHRvIG91dHB1dC5cblx0ICovXG5cdGh0bWw6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBxdWVyeSBzZWxlY3RvciB0byBhZGQgdGhpcyBjb21wb25lbnQncyBmdW5jdGlvbnMgdG8uXG5cdCAqIFxuXHQgKiBAZXhhbXBsZSAjb2JqZWN0SWRcblx0ICovXG5cdGFkZEZ1bmN0aW9uc1RvPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBsYWNlIGhlcmUgcGFyZW50IG5hbWUgdG8gYXR0YWNoIHRoaXMgaHRtbCB0by5cblx0ICogXG5cdCAqIEBleGFtcGxlIHRvcFxuXHQgKi9cblx0cGxhY2VIZXJlUGFyZW50Pzogc3RyaW5nO1xuXHQvKipcblx0ICogQXBwZW5kIHRoZSBvdXRwdXQgdG8gYW4gZXhpc3RpbmcgZWxlbWVudCB1c2luZyBhIENTUyBzZWxlY3RvciB0aGF0IGlzIFxuXHQgKiB0aGUgY2xvc2VzdC5cblx0ICogXG5cdCAqIEBleGFtcGxlIGRpdiAudGVzdENsYXNzXG5cdCAqL1xuXHRjbG9zZXN0U2VsZWN0b3I/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBBcHBlbmQgdGhlIG91dHB1dCB0byBhbiBleGlzdGluZyBlbGVtZW50IHNvbWV3aGVyZSBvbiB0aGUgZG9jdW1lbnQuXG5cdCAqIFxuXHQgKiBAZXhhbXBsZSBkaXYgLnRlc3RDbGFzc1xuXHQgKi9cblx0ZG9jdW1lbnRTZWxlY3Rvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGNvbXBvbmVudCB0byBwcmVwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RDb21wb25lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgSFRNTEVsZW1lbnRzLlxuXHQgKi9cblx0aHRtbEVsZW1lbnRzPzogSFRNTEVsZW1lbnRbXTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlLlxuXHQgKi9cblx0bmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0YWcuXG5cdCAqL1xuXHR0YWc/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29ubmVjdGVkIEFQSS5cblx0ICovXG5cdGFwaT86IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSBvcHRpb25zIHRvIGluY2x1ZGUgd2l0aCByZWdpc3RlcmluZyB0aGlzIGNvbXBvbmVudC5cblx0ICovXG5cdGVsZW1lbnRPcHRpb25zPzogRWxlbWVudERlZmluaXRpb25PcHRpb25zO1xuXHQvKipcblx0ICogQW55IGV4dHJhIGF0dHJpYnV0ZXMgdG8gcmVnaXN0ZXIuXG5cdCAqL1xuXHRvYnNlcnZlZEF0dHJpYnV0ZXM/OiBzdHJpbmdbXTtcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIGNvbXBvbmVudC5cblx0ICovXG5cdHR5cGU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdHZhbHVlPzogYW55O1xuXHQvKipcblx0ICogVGhlIGlubmVyIEhUTUwgb3IgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdGlubmVyOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgZXZlbnRzIHRvIHRyaWdnZXIuXG5cdCAqL1xuXHRldmVudHM/OiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXToge1xuXHRcdFx0XHR0eXBlOiBzdHJpbmc7XG5cdFx0XHRcdGZ1bmM6IEZ1bmN0aW9uO1xuXHRcdFx0XHRvcHRpb25zPzogYW55O1xuXHRcdFx0fVxuXHRcdH07XG5cdC8qKlxuXHQgKiBFeGVjdXRlIHByaW9yIHRvIG91dHB1dC5cblx0ICogXG5cdCAqIEByZXR1cm5zIElmIHNldCB0byBmYWxzZSwgdGhlIGNvbXBvbmVudCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25QcmVPdXRwdXQ/OiAoKSA9PiBib29sZWFuO1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciBnZXR0aW5nIHRoZSBvdXRwdXQsIGJ1dCBiZWZvcmUgdGhlIERPTSBwYXJzaW5nLlxuXHQgKiBcblx0ICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbXBvbmVudCB0byByZWdpc3Rlci4gQ2FuIGJlIG1hbmlwdWxhdGVkIG9uZSBsYXN0IHRpbWUgcHJpb3IgdG8gXG5cdCAqIGJlaW5nIHBhcnNlZCBpbnRvIGEgRE9NIGVsZW1lbnQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgZmluYWwgb3V0cHV0IHRvIGJlIHBhcnNlZCBhcyBhIERPTSBlbGVtZW50LlxuXHQgKi9cblx0b25Qb3N0T3V0cHV0PzogKG91dHB1dDogKHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdKSkgPT4gKHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdKTtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgd2hlbiBpdHMgdGltZSB0byBmaXggdGhlIEhUTUwgcHJpb3IgdG8gRE9NIHBhcnNpbmcuIFRoaXMgd2lsbCBza2lwIHRoZSBIb3RTdGFxIGRlZmF1bHQgZml4aW5nLlxuXHQgKi9cblx0b25GaXhIVE1MPzogKG91dHB1dDogc3RyaW5nKSA9PiB7IGZpeGVkU3RyOiBzdHJpbmcsIHF1ZXJ5U2VsZWN0b3I6IHN0cmluZzsgfTtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYSBjdXN0b20gRE9NIHBhcnNlci5cblx0ICovXG5cdG9uUGFyc2VET00/OiAob3V0cHV0OiBzdHJpbmcpID0+IERvY3VtZW50O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciB0aGUgb3V0cHV0IGhhcyBiZWVuIHBhcnNlZCBhbmQgaXMgcmVhZHkgdG8gYmUgcGxhY2VkIGludG8gdGhlIERPTS5cblx0ICovXG5cdG9uUGFyc2VkPzogKG91dHB1dDogc3RyaW5nKSA9PiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIHByaW9yIHRvIHBsYWNpbmcgdGhlIG5ldyBET00gZWxlbWVudC5cblx0ICovXG5cdG9uUHJlUGxhY2U/OiAoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBIVE1MRWxlbWVudDtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgcGxhY2luZyB0aGUgbmV3IERPTSBlbGVtZW50LiBDYW4gYmUgbWFuaXB1bGF0ZWQgb25lIGZpbmFsIHRpbWUgcHJpb3IgdG8gYmVpbmcgcmVuZGVyZWQuXG5cdCAqL1xuXHRvblBvc3RQbGFjZT86IChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gSFRNTEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIHBsYWNpbmcgdGhlIERPTSBlbGVtZW50IG9udG8gdGhlIG5ld2x5IGNyZWF0ZWQgcGFyZW50LlxuXHQgKi9cblx0b25QYXJlbnRQbGFjZT86IChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBBIGNvbXBvbmVudCB0byBwcmVwcm9jZXNzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSG90Q29tcG9uZW50IGltcGxlbWVudHMgSUhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBIVE1MRWxlbWVudHMuXG5cdCAqL1xuXHRodG1sRWxlbWVudHM6IEhUTUxFbGVtZW50W107XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRhZy5cblx0ICovXG5cdHRhZzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbm5lY3RlZCBBUEkuXG5cdCAqL1xuXHRhcGk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSBvcHRpb25zIHRvIGluY2x1ZGUgd2l0aCByZWdpc3RlcmluZyB0aGlzIGNvbXBvbmVudC5cblx0ICovXG5cdGVsZW1lbnRPcHRpb25zOiBFbGVtZW50RGVmaW5pdGlvbk9wdGlvbnM7XG5cdC8qKlxuXHQgKiBBbnkgZXh0cmEgYXR0cmlidXRlcyB0byByZWdpc3Rlci5cblx0ICovXG5cdG9ic2VydmVkQXR0cmlidXRlczogc3RyaW5nW107XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBjb21wb25lbnQuXG5cdCAqL1xuXHR0eXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdHZhbHVlOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgaW5uZXIgSFRNTCBvciB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0aW5uZXI6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBldmVudHMgdG8gdHJpZ2dlci5cblx0ICovXG5cdGV2ZW50czoge1xuXHRcdFtuYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdHR5cGU6IHN0cmluZztcblx0XHRcdFx0ZnVuYzogRnVuY3Rpb247XG5cdFx0XHRcdG9wdGlvbnM6IGFueTtcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogRXhlY3V0ZSBwcmlvciB0byBvdXRwdXQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBJZiBzZXQgdG8gZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlT3V0cHV0PyAoKTogYm9vbGVhbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgZ2V0dGluZyB0aGUgb3V0cHV0LCBidXQgYmVmb3JlIHRoZSBET00gcGFyc2luZy5cblx0ICogXG5cdCAqIEBwYXJhbSBvdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb21wb25lbnQgdG8gcmVnaXN0ZXIuIENhbiBiZSBtYW5pcHVsYXRlZCBvbmUgbGFzdCB0aW1lIHByaW9yIHRvIFxuXHQgKiBiZWluZyBwYXJzZWQgaW50byBhIERPTSBlbGVtZW50LlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIGZpbmFsIG91dHB1dCB0byBiZSBwYXJzZWQgYXMgYSBET00gZWxlbWVudC5cblx0ICovXG5cdG9uUG9zdE91dHB1dD8gKG91dHB1dDogKHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdKSk6IChzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXSk7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIHdoZW4gaXRzIHRpbWUgdG8gZml4IHRoZSBIVE1MIHByaW9yIHRvIERPTSBwYXJzaW5nLiBUaGlzIHdpbGwgc2tpcCB0aGUgSG90U3RhcSBkZWZhdWx0IGZpeGluZy5cblx0ICovXG5cdG9uRml4SFRNTD8gKG91dHB1dDogc3RyaW5nKTogeyBmaXhlZFN0cjogc3RyaW5nLCBxdWVyeVNlbGVjdG9yOiBzdHJpbmc7IH07XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGEgY3VzdG9tIERPTSBwYXJzZXIuXG5cdCAqL1xuXHRvblBhcnNlRE9NPyAob3V0cHV0OiBzdHJpbmcpOiBEb2N1bWVudDtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgdGhlIG91dHB1dCBoYXMgYmVlbiBwYXJzZWQgYW5kIGlzIHJlYWR5IHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBET00uXG5cdCAqL1xuXHRvblBhcnNlZD8gKG91dHB1dDogc3RyaW5nKTogc3RyaW5nO1xuXHQvKipcblx0ICogRXhlY3V0ZSBwcmlvciB0byBwbGFjaW5nIHRoZSBuZXcgRE9NIGVsZW1lbnQuXG5cdCAqL1xuXHRvblByZVBsYWNlPyAoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIHBsYWNpbmcgdGhlIG5ldyBET00gZWxlbWVudC4gQ2FuIGJlIG1hbmlwdWxhdGVkIG9uZSBmaW5hbCB0aW1lIHByaW9yIHRvIGJlaW5nIHJlbmRlcmVkLlxuXHQgKi9cblx0b25Qb3N0UGxhY2U/IChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciBwbGFjaW5nIHRoZSBET00gZWxlbWVudCBvbnRvIHRoZSBuZXdseSBjcmVhdGVkIHBhcmVudC5cblx0ICovXG5cdG9uUGFyZW50UGxhY2U/IChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQ7XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IElIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSA9IG51bGwpXG5cdHtcblx0XHRpZiAoKGNvcHkgaW5zdGFuY2VvZiBIb3RTdGFxKSB8fCAoY29weSA9PSBudWxsKSlcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHR0aGlzLnByb2Nlc3NvciA9IGNvcHk7XG5cdFx0XHR0aGlzLmh0bWxFbGVtZW50cyA9IFtdO1xuXHRcdFx0dGhpcy5uYW1lID0gXCJcIjtcblx0XHRcdHRoaXMudGFnID0gXCJcIjtcblx0XHRcdHRoaXMuYXBpID0gbnVsbDtcblx0XHRcdHRoaXMuZWxlbWVudE9wdGlvbnMgPSB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLm9ic2VydmVkQXR0cmlidXRlcyA9IFtdO1xuXHRcdFx0dGhpcy50eXBlID0gXCJcIjtcblx0XHRcdHRoaXMudmFsdWUgPSBudWxsO1xuXHRcdFx0dGhpcy5pbm5lciA9IG51bGw7XG5cdFx0XHR0aGlzLmV2ZW50cyA9IHt9O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5LnByb2Nlc3Nvcjtcblx0XHRcdHRoaXMuaHRtbEVsZW1lbnRzID0gY29weS5odG1sRWxlbWVudHMgfHwgW107XG5cdFx0XHR0aGlzLm5hbWUgPSBjb3B5Lm5hbWUgfHwgXCJcIjtcblx0XHRcdHRoaXMudGFnID0gY29weS50YWcgfHwgdGhpcy5uYW1lO1xuXHRcdFx0dGhpcy5hcGkgPSBjb3B5LmFwaSB8fCBudWxsO1xuXHRcdFx0dGhpcy5lbGVtZW50T3B0aW9ucyA9IGNvcHkuZWxlbWVudE9wdGlvbnMgfHwgdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5vYnNlcnZlZEF0dHJpYnV0ZXMgPSBjb3B5Lm9ic2VydmVkQXR0cmlidXRlcyB8fCBbXTtcblx0XHRcdHRoaXMudHlwZSA9IGNvcHkudHlwZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy52YWx1ZSA9IGNvcHkudmFsdWUgfHwgbnVsbDtcblx0XHRcdHRoaXMuaW5uZXIgPSBjb3B5LmlubmVyIHx8IG51bGw7XG5cdFx0XHR0aGlzLmV2ZW50cyA9IHt9O1xuXHRcdH1cblxuXHRcdGlmIChhcGkgIT0gbnVsbClcblx0XHRcdHRoaXMuYXBpID0gYXBpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50IHRoYXQncyBjYWxsZWQgd2hlbiB0aGlzIGNvbXBvbmVudCdzIERPTSBlbGVtZW50IGhhcyBiZWVuIGNyZWF0ZWQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgRE9NIGVsZW1lbnQuXG5cdCAqL1xuXHRvbkNyZWF0ZWQgKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYW55XG5cdHtcblx0XHRyZXR1cm4gKGVsZW1lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZSB0aGUgYXR0cmlidXRlcyBtYW51YWxseS5cblx0ICovXG5cdGhhbmRsZUF0dHJpYnV0ZXM/IChhdHRyaWJ1dGVzOiBOYW1lZE5vZGVNYXApOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBIYW5kbGUgYSBjbGljayBldmVudC5cblx0ICovXG5cdGNsaWNrPyAoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogT3V0cHV0IHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHRhYnN0cmFjdCBvdXRwdXQgKCk6IHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdO1xufSIsImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuXG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcblxuaW1wb3J0IHsgRGV2ZWxvcGVyTW9kZSwgSG90IH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RQYWdlIH0gZnJvbSBcIi4vSG90UGFnZVwiO1xuXG4vKipcbiAqIEEgZmlsZSB0byBwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RGaWxlXG57XG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHBhZ2UuXG5cdCAqL1xuXHRwYWdlPzogSG90UGFnZTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlLlxuXHQgKi9cblx0bmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB1cmwgdG8gdGhlIGZpbGUgdG8gZ2V0LlxuXHQgKi9cblx0dXJsPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhdGggdG8gdGhlIGxvY2FsIGZpbGUgdG8gZ2V0LlxuXHQgKi9cblx0bG9jYWxGaWxlPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gcHJvY2Vzcy5cblx0ICovXG5cdGNvbnRlbnQ/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBGb3JjZSBhbGwgZXJyb3JzIHRvIGJlIHRocm93bi5cblx0ICovXG5cdHRocm93QWxsRXJyb3JzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJzZXIgb3B0aW9ucyBmb3Igd2hlbiBwcm9jZXNzaW5nIGEgc3RyaW5nIG9yIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VyT3B0aW9uc1xue1xuXHQvKipcblx0ICogT3V0cHV0IHRoZSBjb21tYW5kcyBnZW5lcmF0ZWQgZnJvbSBwcm9jZXNzaW5nLiBEZWZhdWx0OiB0cnVlXG5cdCAqL1xuXHRvdXRwdXRDb21tYW5kcz86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBBbGxvdyBKU09OLnN0cmluZ2lmeSB0byBiZSB1c2VkIGR1cmluZyBwcm9jZXNzaW5nLiBEZWZhdWx0OiB0cnVlXG5cdCAqL1xuXHRhbGxvd1N0cmluZ2lmeT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBmaWxlIHRvIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RGaWxlIGltcGxlbWVudHMgSUhvdEZpbGVcbntcblx0LyoqXG5cdCAqIFRoZSBwYXJlbnQgcGFnZS5cblx0ICovXG5cdHBhZ2U6IEhvdFBhZ2U7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB1cmwgdG8gdGhlIGZpbGUgdG8gZ2V0LlxuXHQgKi9cblx0dXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byB0aGUgbG9jYWwgZmlsZSB0byBnZXQuXG5cdCAqL1xuXHRsb2NhbEZpbGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIHByb2Nlc3MuXG5cdCAqL1xuXHRjb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBGb3JjZSBhbGwgZXJyb3JzIHRvIGJlIHRocm93bi5cblx0ICovXG5cdHRocm93QWxsRXJyb3JzOiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90RmlsZSA9IHt9KVxuXHR7XG5cdFx0dGhpcy5wYWdlID0gY29weS5wYWdlIHx8IG51bGw7XG5cdFx0dGhpcy5uYW1lID0gY29weS5uYW1lIHx8IFwiXCI7XG5cdFx0dGhpcy51cmwgPSBjb3B5LnVybCB8fCBcIlwiO1xuXHRcdHRoaXMubG9jYWxGaWxlID0gY29weS5sb2NhbEZpbGUgfHwgXCJcIjtcblx0XHR0aGlzLmNvbnRlbnQgPSBjb3B5LmNvbnRlbnQgfHwgXCJcIjtcblx0XHR0aGlzLnRocm93QWxsRXJyb3JzID0gY29weS50aHJvd0FsbEVycm9ycyB8fCBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlLlxuXHQgKi9cblx0c2V0Q29udGVudCAoY29udGVudDogc3RyaW5nKTogdm9pZFxuXHR7XG5cdFx0dGhpcy5jb250ZW50ID0gY29udGVudDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlLlxuXHQgKi9cblx0Z2V0Q29udGVudCAoKTogc3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMuY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIEhUVFAgZ2V0IHJlcXVlc3QuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgaHR0cEdldCAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdHRyeVxuXHRcdHtcblx0XHRcdGxldCByZXMgPSBhd2FpdCBmZXRjaCAodXJsKTtcblxuXHRcdFx0aWYgKHJlcy5vayA9PT0gZmFsc2UpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYCR7cmVzLnN0YXR1c306ICR7cmVzLnN0YXR1c1RleHR9YCk7XG5cblx0XHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBhd2FpdCByZXMudGV4dCAoKTtcblxuXHRcdFx0cmV0dXJuIChjb250ZW50KTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdHJldHVybiAoSlNPTi5zdHJpbmdpZnkgKHsgXCJlcnJvclwiOiBgJHtleC5tZXNzYWdlfSAtIENvdWxkIG5vdCBmZXRjaCAke3VybH1gIH0pKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBjb250ZW50IGZyb20gYSB1cmwuXG5cdCAqL1xuXHRhc3luYyBsb2FkVXJsICgpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdHRoaXMuY29udGVudCA9IGF3YWl0IEhvdEZpbGUuaHR0cEdldCAodGhpcy51cmwpO1xuXG5cdFx0cmV0dXJuICh0aGlzLmNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgY29udGVudCBmcm9tIGEgbG9jYWwgZmlsZS5cblx0ICovXG5cdGFzeW5jIGxvYWRMb2NhbEZpbGUgKCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHByb21pc2U6IFByb21pc2U8c3RyaW5nPiA9IG5ldyBQcm9taXNlIChcblx0XHRcdChyZXNvbHZlOiBhbnksIHJlamVjdDogYW55KTogdm9pZCA9PlxuXHRcdFx0e1xuXHRcdFx0XHRmcy5yZWFkRmlsZSAodGhpcy5sb2NhbEZpbGUsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbiwgZGF0YTogQnVmZmVyKTogdm9pZCA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChlcnIgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGhyb3cgZXJyO1xuXG5cdFx0XHRcdFx0XHRsZXQgY29udGVudDogc3RyaW5nID0gZGF0YS50b1N0cmluZyAoKTtcblx0XHRcdFx0XHRcdHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG5cblx0XHRcdFx0XHRcdHJlc29sdmUgKHRoaXMuY29udGVudCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiAocHJvbWlzZSk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUuXG5cdCAqL1xuXHRhc3luYyBsb2FkICgpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHRoaXMudXJsICE9PSBcIlwiKVxuXHRcdFx0Y29udGVudCA9IGF3YWl0IHRoaXMubG9hZFVybCAoKTtcblxuXHRcdGlmICh0aGlzLmxvY2FsRmlsZSAhPT0gXCJcIilcblx0XHRcdGNvbnRlbnQgPSBhd2FpdCB0aGlzLmxvYWRMb2NhbEZpbGUgKCk7XG5cblx0XHRyZXR1cm4gKGNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3Mgc3RyaW5nIGNvbnRlbnQuIFRoaXMgd2lsbCB0YWtlIGluIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBcblx0ICogcGFyc2UgdGhlIGNvbnRlbnQgYmFzZWQgb24gdGhlIHJlZ2V4LiBXaGVuIHRoZSByZWdleCBjb250ZW50IGlzIGZvdW5kIFxuXHQgKiBjb250ZW50UHJvY2Vzc29yIHdpbGwgYmUgZXhlY3V0ZWQgd2l0aCB0aGUgcmVnZXggY29udGVudCBmb3VuZC4gV2hlbiBcblx0ICogdGhlIHJlZ2V4IGNvbnRlbnQgaXMgbm90IGZvdW5kLCBvZmZDb250ZW50UHJvY2Vzc29yIHdpbGwgYmUgY2FsbGVkIHdpdGggXG5cdCAqIHRoZSBjb250ZW50IG91dHNpZGUgb2YgdGhlIHJlZ2V4LlxuXHQgKiBcblx0ICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gcGFyc2UuXG5cdCAqIEBwYXJhbSBjb250ZW50UmVnZXggVGhlIHJlZ2V4IHRvIHVzZSB0byBwYXJzZSB0aGUgY29udGVudC5cblx0ICogQHBhcmFtIGNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgaW5zaWRlIHRoZSByZWdleC5cblx0ICogQHBhcmFtIG9mZkNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgb3V0c2lkZSBvZiB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tQmVnaW5uaW5nIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgXG5cdCAqIGJlZ2lubmluZyBvZiB0aGUgZm91bmQgY29udGVudC5cblx0ICogQHBhcmFtIG51bVJlbW92ZUZyb21FbmQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIHRoZSBlbmQgb2YgXG5cdCAqIHRoZSBmb3VuZCBjb250ZW50LlxuXHQgKi9cblx0c3RhdGljIHByb2Nlc3NDb250ZW50IChjb250ZW50OiBzdHJpbmcsIGNvbnRlbnRSZWdleDogUmVnRXhwLFxuXHRcdGNvbnRlbnRQcm9jZXNzb3I6IChyZWdleEZvdW5kOiBzdHJpbmcpID0+IHN0cmluZyxcblx0XHRvZmZDb250ZW50UHJvY2Vzc29yOiAob2ZmQ29udGVudDogc3RyaW5nKSA9PiBzdHJpbmcsXG5cdFx0bnVtUmVtb3ZlRnJvbUJlZ2lubmluZzogbnVtYmVyID0gMixcblx0XHRudW1SZW1vdmVGcm9tRW5kOiBudW1iZXIgPSAyKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgcmVzdWx0OiBSZWdFeHBFeGVjQXJyYXkgPSBjb250ZW50UmVnZXguZXhlYyAoY29udGVudCk7XG5cdFx0bGV0IHByZXZpb3VzSW5kZXg6IG51bWJlciA9IDA7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdHdoaWxlIChyZXN1bHQgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgc3RhcnQ6IG51bWJlciA9IHJlc3VsdC5pbmRleCAtIG51bVJlbW92ZUZyb21CZWdpbm5pbmc7XG5cdFx0XHRsZXQgZW5kOiBudW1iZXIgPSBjb250ZW50UmVnZXgubGFzdEluZGV4ICsgbnVtUmVtb3ZlRnJvbUVuZDtcblxuXHRcdFx0Ly8gR2V0IHRoZSBwcmV2aW91cyBzZWN0aW9uLlxuXHRcdFx0bGV0IHByZXZDb250ZW50OiBzdHJpbmcgPSBjb250ZW50LnN1YnN0ciAocHJldmlvdXNJbmRleCwgKHN0YXJ0IC0gcHJldmlvdXNJbmRleCkpO1xuXHRcdFx0cHJldmlvdXNJbmRleCA9IGVuZDtcblxuXHRcdFx0b3V0cHV0ICs9IG9mZkNvbnRlbnRQcm9jZXNzb3IgKHByZXZDb250ZW50KTtcblxuXHRcdFx0Ly8gUHJvY2VzcyB0aGUgY29udGVudCBmb3VuZCBmcm9tIHRoZSByZWdleFxuXHRcdFx0bGV0IGNvbnRlbnRGb3VuZDogc3RyaW5nID0gcmVzdWx0WzBdO1xuXHRcdFx0b3V0cHV0ICs9IGNvbnRlbnRQcm9jZXNzb3IgKGNvbnRlbnRGb3VuZCk7XG5cblx0XHRcdC8vIE1vdmUgb24gdG8gdGhlIG5leHQgc2VjdGlvbiB0byBwYXJzZS5cblx0XHRcdHJlc3VsdCA9IGNvbnRlbnRSZWdleC5leGVjIChjb250ZW50KTtcblx0XHR9XG5cblx0XHQvLyBBcHBlbmQgd2hhdGV2ZXIgZWxzZSBpcyBhZnRlciB0aGUgbGFzdCBwYXJzZWQgc2VjdGlvbi5cblx0XHRsZXQgbGFzdENvbnRlbnQ6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChwcmV2aW91c0luZGV4KTtcblxuXHRcdG91dHB1dCArPSBvZmZDb250ZW50UHJvY2Vzc29yIChsYXN0Q29udGVudCk7XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhbnkgY29udGVudCB0aGF0IGNvdWxkIGhhdmUgbmVzdGVkIHZhbHVlcy4gVGhpcyB3aWxsIFxuXHQgKiB0YWtlIGluIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBcblx0ICogcGFyc2UgdGhlIGNvbnRlbnQgYmFzZWQgb24gdGhlIHJlZ2V4LiBXaGVuIHRoZSByZWdleCBjb250ZW50IGlzIGZvdW5kIFxuXHQgKiBjb250ZW50UHJvY2Vzc29yIHdpbGwgYmUgZXhlY3V0ZWQgd2l0aCB0aGUgcmVnZXggY29udGVudCBmb3VuZC4gV2hlbiBcblx0ICogdGhlIHJlZ2V4IGNvbnRlbnQgaXMgbm90IGZvdW5kLCBvZmZDb250ZW50UHJvY2Vzc29yIHdpbGwgYmUgY2FsbGVkIHdpdGggXG5cdCAqIHRoZSBjb250ZW50IG91dHNpZGUgb2YgdGhlIHJlZ2V4LlxuXHQgKiBcblx0ICogQGZpeG1lIE5lZWRzIHRvIGJlIGFibGUgdG8gaWdub3JlIGFueSBjaGFyYWN0ZXJzIGZvdW5kIGluc2lkZSBjb21tZW50cyBcblx0ICogb3IgYSBzdHJpbmcuIEZvciBleGFtcGxlLCBpZiB0aGUgZm9sbG93aW5nIGlzIHVzZWQgYGBgJHtcIlRlc3QgfVwifWBgYCBJdCBcblx0ICogd2lsbCBlcnJvciBvdXQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCB0byBwYXJzZS5cblx0ICogQHBhcmFtIHN0YXJ0Q2hhcnMgVGhlIHN0YXJ0aW5nIGNoYXJhY3RlcnMgdG8gc2VhcmNoIGZvci5cblx0ICogQHBhcmFtIGVuZENoYXJzIFRoZSBlbmRpbmcgY2hhcmFjdGVycyB0byBzZWFyY2ggZm9yLlxuXHQgKiBAcGFyYW0gdHJpZ2dlckNoYXIgVGhlIGZvdW5kIGNoYXJhY3RlciB3aGVyZSBwYXJzaW5nIHdpbGwgc3RhcnQgZnJvbS5cblx0ICogQHBhcmFtIGNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgaW5zaWRlIHRoZSByZWdleC5cblx0ICogQHBhcmFtIG9mZkNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgb3V0c2lkZSBvZiB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tQmVnaW5uaW5nIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgXG5cdCAqIGJlZ2lubmluZyBvZiB0aGUgZm91bmQgY29udGVudC5cblx0ICogQHBhcmFtIG51bVJlbW92ZUZyb21FbmQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIHRoZSBlbmQgb2YgXG5cdCAqIHRoZSBmb3VuZCBjb250ZW50LlxuXHQgKi9cblx0c3RhdGljIHByb2Nlc3NOZXN0ZWRDb250ZW50IChjb250ZW50OiBzdHJpbmcsIHN0YXJ0Q2hhcnM6IHN0cmluZywgZW5kQ2hhcnM6IHN0cmluZywgXG5cdFx0dHJpZ2dlckNoYXI6IHN0cmluZywgY29udGVudFByb2Nlc3NvcjogKHJlZ2V4Rm91bmQ6IHN0cmluZywgc3RhcnRQb3M6IG51bWJlciwgZW5kUG9zOiBudW1iZXIpID0+IHN0cmluZyxcblx0XHRvZmZDb250ZW50UHJvY2Vzc29yOiAob2ZmQ29udGVudDogc3RyaW5nKSA9PiBzdHJpbmcsXG5cdFx0bnVtUmVtb3ZlRnJvbUJlZ2lubmluZzogbnVtYmVyID0gMixcblx0XHRudW1SZW1vdmVGcm9tRW5kOiBudW1iZXIgPSAxKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgcG9zOiBudW1iZXIgPSBjb250ZW50LmluZGV4T2YgKHN0YXJ0Q2hhcnMpO1xuXHRcdGxldCBwcmV2aW91c0luZGV4OiBudW1iZXIgPSAwO1xuXHRcdGxldCBzdGFydFRyaWdnZXJQb3M6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAodHJpZ2dlckNoYXIsIHBvcyk7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdHdoaWxlIChwb3MgPiAtMSlcblx0XHR7XG5cdFx0XHRsZXQgZW5kOiBudW1iZXIgPSBjb250ZW50LmluZGV4T2YgKGVuZENoYXJzLCBwb3MpO1xuXHRcdFx0bGV0IG5lc3RlZENvdW50ZXI6IG51bWJlciA9IDA7XG5cblx0XHRcdGlmICh0cmlnZ2VyQ2hhciAhPT0gXCJcIilcblx0XHRcdHtcblx0XHRcdFx0Ly8gUmV2ZXJzZSBzZWFyY2ggdGhlIHRyaWdnZXIgY2hhcmFjdGVycyBhbmQgY291bnQgdGhlIG51bWJlciBvZiBcblx0XHRcdFx0Ly8gb2NjdXJyZW5jZXMuXG5cdFx0XHRcdGxldCBycG9zOiBudW1iZXIgPSBjb250ZW50Lmxhc3RJbmRleE9mICh0cmlnZ2VyQ2hhciwgZW5kIC0gbnVtUmVtb3ZlRnJvbUVuZCk7XG5cblx0XHRcdFx0d2hpbGUgKHJwb3MgPiAtMSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChycG9zID09PSBzdGFydFRyaWdnZXJQb3MpXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdHJwb3MgPSBjb250ZW50Lmxhc3RJbmRleE9mICh0cmlnZ2VyQ2hhciwgcnBvcyAtIG51bVJlbW92ZUZyb21FbmQpO1xuXHRcdFx0XHRcdG5lc3RlZENvdW50ZXIrKztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGVyZSdzIG5lc3RlZCB0cmlnZ2VyIGNoYXJhY3RlcnMsIGdldCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFxuXHRcdFx0Ly8gdGhlIGVuZCBjaGFyYWN0ZXIuXG5cdFx0XHRpZiAobmVzdGVkQ291bnRlciA+IDApXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBlcG9zOiBudW1iZXIgPSBjb250ZW50LmluZGV4T2YgKGVuZENoYXJzLCBlbmQgKyBudW1SZW1vdmVGcm9tRW5kKTtcblx0XHRcdFx0bGV0IHRlbXBlcG9zOiBudW1iZXIgPSBlcG9zO1xuXG5cdFx0XHRcdHdoaWxlICgoZXBvcyA+IC0xKSAmJiAobmVzdGVkQ291bnRlciA+IDApKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRlbXBlcG9zIDwgMClcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Ly8gTWFrZSBzdXJlIHdlIGFyZW4ndCBkaXNjb3ZlcmluZyBlbmRDaGFycyB0aGF0IHdlIHNob3VsZG4ndCBiZS5cblx0XHRcdFx0XHRsZXQgcG9zT3V0c2lkZU9mQ29udGVudDogbnVtYmVyID0gY29udGVudC5sYXN0SW5kZXhPZiAoc3RhcnRDaGFycywgdGVtcGVwb3MgLSBudW1SZW1vdmVGcm9tRW5kKTtcblxuXHRcdFx0XHRcdGlmIChwb3NPdXRzaWRlT2ZDb250ZW50ID4gZXBvcylcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZXBvcyA9IHRlbXBlcG9zO1xuXG5cdFx0XHRcdFx0dGVtcGVwb3MgPSBjb250ZW50LmluZGV4T2YgKGVuZENoYXJzLCBlcG9zICsgbnVtUmVtb3ZlRnJvbUVuZCk7XG5cdFx0XHRcdFx0bmVzdGVkQ291bnRlci0tO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZW5kID0gZXBvcztcblx0XHRcdH1cblxuXHRcdFx0bGV0IG9mZkNvbnRlbnRTdHI6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChwcmV2aW91c0luZGV4LCAocG9zIC0gcHJldmlvdXNJbmRleCkpO1xuXHRcdFx0b3V0cHV0ICs9IG9mZkNvbnRlbnRQcm9jZXNzb3IgKG9mZkNvbnRlbnRTdHIpO1xuXG5cdFx0XHRsZXQgZm91bmRDb250ZW50OiBzdHJpbmcgPSBjb250ZW50LnN1YnN0ciAoXG5cdFx0XHRcdHBvcyArIG51bVJlbW92ZUZyb21CZWdpbm5pbmcsIChlbmQgLSAocG9zICsgbnVtUmVtb3ZlRnJvbUJlZ2lubmluZykpKTtcblx0XHRcdG91dHB1dCArPSBjb250ZW50UHJvY2Vzc29yIChmb3VuZENvbnRlbnQsIHBvcywgZW5kKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSBuZXh0IGNvbnRlbnRcblx0XHRcdHBvcyA9IGNvbnRlbnQuaW5kZXhPZiAoc3RhcnRDaGFycywgZW5kICsgbnVtUmVtb3ZlRnJvbUVuZCk7XG5cdFx0XHRzdGFydFRyaWdnZXJQb3MgPSBjb250ZW50LmluZGV4T2YgKHRyaWdnZXJDaGFyLCBwb3MpO1xuXHRcdFx0cHJldmlvdXNJbmRleCA9IGVuZCArIG51bVJlbW92ZUZyb21FbmQ7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwZW5kIHdoYXRldmVyIGVsc2UgaXMgYWZ0ZXIgdGhlIGxhc3QgcGFyc2VkIHNlY3Rpb24uXG5cdFx0bGV0IGxhc3RDb250ZW50OiBzdHJpbmcgPSBjb250ZW50LnN1YnN0ciAocHJldmlvdXNJbmRleCk7XG5cblx0XHRvdXRwdXQgKz0gb2ZmQ29udGVudFByb2Nlc3NvciAobGFzdENvbnRlbnQpO1xuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlIGEgZnVuY3Rpb24gZnJvbSBhIHN0cmluZy4gRXg6IDwoYSwgYiwgYyk9PntyZXR1cm4gKGEgKyBiICsgYyk7fT5cblx0ICovXG5cdHN0YXRpYyBwYXJzZUZ1bmN0aW9uIChzdHI6IHN0cmluZywgY2FsbGJhY2tBOiAoZnVuY0FyZ3M6IHN0cmluZ1tdKSA9PiB2b2lkLCBcblx0XHRjYWxsYmFja0I6IChmdW5jQm9keTogc3RyaW5nLCBlbmRUeXBlOiBzdHJpbmcpID0+IHN0cmluZyk6IHN0cmluZ1xuXHR7XG5cdFx0bGV0IHN0YXJ0SW5kZXggPSBzdHIuaW5kZXhPZihcIjwoXCIpO1xuXG5cdFx0d2hpbGUgKHN0YXJ0SW5kZXggPiAtMSlcblx0XHR7XG5cdFx0XHRjb25zdCBlbmRJbmRleCA9IHN0ci5pbmRleE9mKFwiKVwiLCBzdGFydEluZGV4KTtcblx0XHRcdGNvbnN0IGFycm93SW5kZXggPSBzdHIuaW5kZXhPZihcIj0+XCIsIGVuZEluZGV4KTtcblx0XHRcdGNvbnN0IGJyYWNlSW5kZXggPSBzdHIuaW5kZXhPZihcIntcIiwgYXJyb3dJbmRleCk7XG5cdFx0XHRsZXQgbmV4dFBvczogbnVtYmVyID0gZW5kSW5kZXg7XG5cblx0XHRcdGlmICgoc3RhcnRJbmRleCAhPT0gLTEpICYmIFxuXHRcdFx0XHQoZW5kSW5kZXggIT09IC0xKSAmJiAoYXJyb3dJbmRleCAhPT0gLTEpICYmIFxuXHRcdFx0XHQoYnJhY2VJbmRleCAhPT0gLTEpKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcG9zc2libGVFbmRzOiBzdHJpbmdbXSA9IFtcIn0+XCIsIFwifUE+XCIsIFwifWE+XCIsIFwifVI+XCIsIFwifVJBPlwiLCBcIn1SYT5cIl07XG5cdFx0XHRcdGxldCBlbmRQb3MgPSAtMTtcblx0XHRcdFx0bGV0IGZvdW5kRW5kOiBzdHJpbmcgPSBudWxsO1xuXG5cdFx0XHRcdC8vIEZpbmQgdGhlIG5lYXJlc3QgZW5kIHRhZ1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHBvc3NpYmxlRW5kcy5sZW5ndGg7IGkrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBwb3NzaWJsZUVuZDogc3RyaW5nID0gcG9zc2libGVFbmRzW2ldO1xuXHRcdFx0XHRcdGxldCBwb3NzaWJsZUVuZFBvcyA9IHN0ci5pbmRleE9mKHBvc3NpYmxlRW5kLCBhcnJvd0luZGV4KTtcblxuXHRcdFx0XHRcdGlmIChwb3NzaWJsZUVuZFBvcyA+IC0xICYmIChlbmRQb3MgPT0gLTEgfHwgcG9zc2libGVFbmRQb3MgPCBlbmRQb3MpKSB7XG5cdFx0XHRcdFx0XHRlbmRQb3MgPSBwb3NzaWJsZUVuZFBvcztcblx0XHRcdFx0XHRcdGZvdW5kRW5kID0gcG9zc2libGVFbmQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGVuZFBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uc3QgYSA9IHN0ci5zbGljZShzdGFydEluZGV4ICsgMiwgZW5kSW5kZXgpLnRyaW0oKS5zcGxpdChcIixcIikubWFwKGFyZyA9PiBhcmcudHJpbSgpKTtcblx0XHRcdFx0XHRjb25zdCBiID0gc3RyLnNsaWNlKGJyYWNlSW5kZXggKyAxLCBlbmRQb3MpLnRyaW0oKTtcblx0XHRcdFx0XHRjYWxsYmFja0EoYSk7XG5cdFx0XHRcdFx0bGV0IG91dCA9IGNhbGxiYWNrQihiLCBmb3VuZEVuZCk7XG5cblx0XHRcdFx0XHRzdHIgPSBzdHIuc2xpY2UoMCwgc3RhcnRJbmRleCkgKyBvdXQgKyBzdHIuc2xpY2UoZW5kUG9zICsgZm91bmRFbmQubGVuZ3RoKTtcblxuXHRcdFx0XHRcdG5leHRQb3MgPSBlbmRQb3M7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0c3RhcnRJbmRleCA9IHN0ci5pbmRleE9mKFwiPChcIiwgbmV4dFBvcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChzdHIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlIGFsbCB0aGUgY29udGVudCBpbnRvIGEgc2luZ2xlIEphdmFTY3JpcHQgZmlsZSB0byBiZSBleGVjdXRlZC4gYXN5bmMvYXdhaXQgaXMgdXNlZCBcblx0ICogaW4gdGhlIHByb2Nlc3NlZCBKYXZhU2NyaXB0IGZpbGUsIHdoaWNoIG1lYW5zIHRoZSAuaG90dCBmaWxlcyBwYXJzZWQgbWF5IHVzZSBhc3luYy9hd2FpdCBcblx0ICogd2l0aGluIHRoZSBjb2RlLlxuXHQgKiBcblx0ICogV2lsbCBwYXJzZSB0aGUgZm9sbG93aW5nIGluIG9yZGVyOlxuXHQgKiAqIDwqIEphdmFTY3JpcHQgY29udGVudCB0byBleGVjdXRlIGFuZCBvdXRwdXQuIFdpbGwgb3V0cHV0IHVzaW5nIEhvdC5lY2hvLiAqPlxuXHQgKiAqICF7IEV4ZWN1dGUgT05MWSBKYXZhU2NyaXB0LiBUaGlzIHdpbGwgTk9UIG91dHB1dCBhbnl0aGluZyBhdXRvbWF0aWNhbGx5LiBJZiB5b3Ugd2FudCBpdCB0byBvdXRwdXQsIHVzZSBIb3QuZWNobyBoZXJlLiB9XG5cdCAqICogU1RSeyBFeGVjdXRlIHNvbWUgSlMsIGFuZCBvdXRwdXQgYSBzdHJpbmcgdXNpbmcgSlNPTi5zdHJpbmdpZnkuIH1cblx0ICogKiAkeyBFeGVjdXRlIHNvbWUgSlMsIGFuZCBvdXRwdXQgdGhlIHJlc3VsdC4gfVxuXHQgKiAqIDwoYXJndW1lbnRzKT0+eyBTb21lIEpTIHRvIGV4ZWN1dGUgYXQgYSBsYXRlciB0aW1lLiB9PlxuXHQgKiBcdCogVGhpcyBlbnRpcmUgYmxvY2sgd2lsbCBiZSBwYXJzZWQgYXMgYSBmdW5jdGlvbiwgYW5kIHdpbGwgaW1tZWRpYXRlbHkgb3V0cHV0IFwiSG90LkN1cnJlbnRQYWdlLmNhbGxGdW5jdGlvblwiIGluIGl0cyBwbGFjZS5cblx0ICogKiA/KCBFeGVjdXRlIHNvbWUgSlMsIG11c3QgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIEhUTUwgRE9NIG9iamVjdCBpdCdzIHVzZWQgb24uIClcblx0ICogXG5cdCAqIEBwYXJhbSB0aGlzQ29udGVudCBUaGUgY29udGVudCB0byBwYXJzZS5cblx0ICogQHBhcmFtIHRocm93QWxsRXJyb3JzIElmIHNldCB0byB0cnVlLCBhbnkgZXJyb3IgdGhhdCBvY2N1cnMgd2lsbCBiZSB0aHJvd24gYXMgYW4gZXhjZXB0aW9uLlxuXHQgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBwYXJzaW5nIHRoZSBjb250ZW50LlxuXHQgKi9cblx0c3RhdGljIHBhcnNlQ29udGVudCAodGhpc0NvbnRlbnQ6IHN0cmluZywgdGhyb3dBbGxFcnJvcnM6IGJvb2xlYW4sIHBhcnNlck9wdGlvbnM6IFBhcnNlck9wdGlvbnMgPSBudWxsKTogc3RyaW5nXG5cdHtcblx0XHRpZiAocGFyc2VyT3B0aW9ucyA9PSBudWxsKVxuXHRcdHtcblx0XHRcdHBhcnNlck9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0b3V0cHV0Q29tbWFuZHM6IHRydWUsXG5cdFx0XHRcdFx0YWxsb3dTdHJpbmdpZnk6IHRydWVcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRsZXQgU1RSSU5HSUZZX1NUQVJUOiBzdHJpbmcgPSBcIkpTT04uc3RyaW5naWZ5IChcIjtcblx0XHRsZXQgU1RSSU5HSUZZX0VORDogc3RyaW5nID0gXCIpXCI7XG5cblx0XHRpZiAocGFyc2VyT3B0aW9ucy5hbGxvd1N0cmluZ2lmeSA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0U1RSSU5HSUZZX1NUQVJUID0gXCJcIjtcblx0XHRcdFNUUklOR0lGWV9FTkQgPSBcIlwiO1xuXHRcdH1cblxuXHRcdC8vIEFzc2VtYmxlIHRoZSBKUyB0byBldmFsdWF0ZS4gVGhpcyB3aWxsIHRha2UgYWxsIGNvbnRlbnQgb3V0c2lkZSBvZiBcblx0XHQvLyA8KiBhbmQgKj4gYW5kIHdyYXAgYSBIb3QuZWNobyBhcm91bmQgaXQuIEFueSBKUyBmb3VuZCBpbnNpZGUgb2YgdGhlIFxuXHRcdC8vIDwqIGFuZCAqPiB3aWxsIGJlIGV4ZWN1dGVkIGFzIGlzLlxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc0NvbnRlbnQgKHRoaXNDb250ZW50LCBcblx0XHRcdG5ldyBSZWdFeHAgKFwiKD89XFxcXDxcXFxcKikoW1xcXFxzXFxcXFNdKj8pKD89XFxcXCpcXFxcPilcIiwgXCJnXCIpLCBcblx0XHRcdChyZWdleEZvdW5kOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdHtcblx0XHRcdFx0Ly8gQSBsaXR0bGUgaGFjaywgc2luY2UgSSBzdWNrIGF0IFJlZ2V4IDooXG5cdFx0XHRcdHJlZ2V4Rm91bmQgPSByZWdleEZvdW5kLnN1YnN0ciAoMik7XG5cblx0XHRcdFx0cmV0dXJuIChgJHtyZWdleEZvdW5kfWApO1xuXHRcdFx0fSwgXG5cdFx0XHQob2ZmQ29udGVudDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHR7XG5cdFx0XHRcdGlmIChvZmZDb250ZW50ID09PSBcIlwiKVxuXHRcdFx0XHRcdHJldHVybiAoXCJcIik7XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQ6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdG9mZkNvbnRlbnQsIFwiIXtcIiwgXCJ9XCIsIFwie1wiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZywgc3RhcnRQb3M6IG51bWJlciwgZW5kUG9zOiBudW1iZXIpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb3V0OiBzdHJpbmcgPSBgKiYmJSolQCNAISR7cmVnZXhGb3VuZDJ9KiYhIyVAIUAqIWA7XG5cblx0XHRcdFx0XHRcdHJldHVybiAob3V0KTtcblx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHQob2ZmQ29udGVudDM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJldHVybiAob2ZmQ29udGVudDMpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDI6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdHRlbXBPdXRwdXQsIFwiU1RSe1wiLCBcIn1cIiwgXCJ7XCIsIFxuXHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nLCBzdGFydFBvczogbnVtYmVyLCBlbmRQb3M6IG51bWJlcik6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLm91dHB1dENvbW1hbmRzID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIWVjaG9PdXRwdXQgKEpTT04uc3RyaW5naWZ5KCR7cmVnZXhGb3VuZDJ9KSwgJHt0aHJvd0FsbEVycm9yc30pOyomISMlQCFAKiFgO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAISR7U1RSSU5HSUZZX1NUQVJUfSR7cmVnZXhGb3VuZDJ9JHtTVFJJTkdJRllfRU5EfSwgJHt0aHJvd0FsbEVycm9yc30pOyomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHR9LCA0LCAxKTtcblxuXHRcdFx0XHRsZXQgZnVuY0FyZ3NTdHI6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQzID0gXG5cdFx0XHRcdFx0SG90RmlsZS5wYXJzZUZ1bmN0aW9uICh0ZW1wT3V0cHV0MiwgKGZ1bmNBcmdzOiBzdHJpbmdbXSkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRmdW5jQXJnc1N0ciA9IEpTT04uc3RyaW5naWZ5IChmdW5jQXJncyk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KGZ1bmNCb2R5OiBzdHJpbmcsIGVuZFR5cGU6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vY29uc3QgZXNjYXBlZEJvZHk6IHN0cmluZyA9IGZ1bmNCb2R5LnJlcGxhY2UoL1tcXFxcJ1wiXFxuXFxyXFx0XS9nLCAnXFxcXCQmJyk7XG5cdFx0XHRcdFx0XHRjb25zdCBlc2NhcGVkQm9keTogc3RyaW5nID0gZnVuY0JvZHkucmVwbGFjZSAoL1xcYC9nLCBcIlxcXFxgXCIpO1xuXHRcdFx0XHRcdFx0bGV0IGZ1bmN0aW9uQ2FsbDogc3RyaW5nID0gXCJIb3QuQ3VycmVudFBhZ2UuY2FsbEZ1bmN0aW9uXCI7XG5cdFx0XHRcdFx0XHRsZXQgaXNBc3luYzogc3RyaW5nID0gXCJmYWxzZVwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoZW5kVHlwZSA9PT0gXCJ9QT5cIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25DYWxsID0gXCJhd2FpdCBIb3QuQ3VycmVudFBhZ2UuY2FsbEFzeW5jRnVuY3Rpb25cIjtcblx0XHRcdFx0XHRcdFx0aXNBc3luYyA9IFwidHJ1ZVwiO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoZW5kVHlwZSA9PT0gXCJ9YT5cIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25DYWxsID0gXCJIb3QuQ3VycmVudFBhZ2UuY2FsbEFzeW5jRnVuY3Rpb25cIjtcblx0XHRcdFx0XHRcdFx0aXNBc3luYyA9IFwidHJ1ZVwiO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoZW5kVHlwZSA9PT0gXCJ9Uj5cIilcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25DYWxsID0gXCJyZXR1cm4gSG90LkN1cnJlbnRQYWdlLmNhbGxGdW5jdGlvblwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoZW5kVHlwZSA9PT0gXCJ9UkE+XCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGZ1bmN0aW9uQ2FsbCA9IFwicmV0dXJuIGF3YWl0IEhvdC5DdXJyZW50UGFnZS5jYWxsQXN5bmNGdW5jdGlvblwiO1xuXHRcdFx0XHRcdFx0XHRpc0FzeW5jID0gXCJ0cnVlXCI7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChlbmRUeXBlID09PSBcIn1SYT5cIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25DYWxsID0gXCJyZXR1cm4gSG90LkN1cnJlbnRQYWdlLmNhbGxBc3luY0Z1bmN0aW9uXCI7XG5cdFx0XHRcdFx0XHRcdGlzQXN5bmMgPSBcInRydWVcIjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bGV0IG5ld1ZhbHVlID0gYComJiUqJUAjQCF7XG5jb25zdCBuZXdGdW5jTmFtZSA9IGNyZWF0ZUZ1bmN0aW9uIChudWxsLCAke2Z1bmNBcmdzU3RyfSwgXFxgJHtlc2NhcGVkQm9keX1cXGAsICR7aXNBc3luY30pO1xuSG90LmVjaG8gKFxcYCR7ZnVuY3Rpb25DYWxsfSAodGhpcywgJ1xcJHtuZXdGdW5jTmFtZX0nLCBhcmd1bWVudHMpO1xcYCk7XG59KiYhIyVAIUAqIWA7XG5cdFx0XHRcdFx0XHQvLyBSZXBsYWNlIGFueSAkeyB3aXRoICR7JiYhKiMhIVxuXHRcdFx0XHRcdFx0bmV3VmFsdWUgPSBuZXdWYWx1ZS5yZXBsYWNlICgvXFwkXFx7L2csIFwiJHsmJiEqIyEhXCIpO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG5ld1ZhbHVlKTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDQ6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdHRlbXBPdXRwdXQzLCBcIiR7XCIsIFwifVwiLCBcIntcIiwgXG5cdFx0XHRcdFx0KHJlZ2V4Rm91bmQyOiBzdHJpbmcsIHN0YXJ0UG9zOiBudW1iZXIsIGVuZFBvczogbnVtYmVyKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0XHRcdGxldCBvdXRwdXRDbWRzOiBib29sZWFuID0gcGFyc2VyT3B0aW9ucy5vdXRwdXRDb21tYW5kcztcblxuXHRcdFx0XHRcdFx0aWYgKHJlZ2V4Rm91bmQyLmluZGV4T2YgKFwiJiYhKiMhIVwiKSA+IC0xKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0ZW1wU3RyOiBzdHJpbmcgPSByZWdleEZvdW5kMi5yZXBsYWNlICgvJiZcXCFcXCpcXCNcXCFcXCEvZywgXCJcIik7XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIChgXFwkeyh0eXBlb2YgKCR7dGVtcFN0cn0pICE9PSBcInVuZGVmaW5lZFwiKSA/ICR7dGVtcFN0cn0gOiBcIlxcJHske3RlbXBTdHJ9fVwifWApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob3V0cHV0Q21kcyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGVzY2FwZU91dHB1dCA9IChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKGNvbnRlbnQucmVwbGFjZSgvW2BdL2csICdcXFxcYCcpKTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0AhdHJ5IHsgSG90LmVjaG8gKCR7cmVnZXhGb3VuZDJ9KTsgfWNhdGNoIChleCl7SG90LmVjaG8gKFxcYFxcXFxcXCR7JHtlc2NhcGVPdXRwdXQgKHJlZ2V4Rm91bmQyKX19XFxgKTt9KiYhIyVAIUAqIWA7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRocm93QWxsRXJyb3JzID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0AhSG90LmVjaG8gKCR7cmVnZXhGb3VuZDJ9KTsqJiEjJUAhQCohYDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0b3V0ID0gYComJiUqJUAjQCEke3JlZ2V4Rm91bmQyfSomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdC8qbGV0IGVzY2FwZWRDb250ZW50OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAob2ZmQ29udGVudDMpO1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gYGVjaG9PdXRwdXQgKCR7ZXNjYXBlZENvbnRlbnR9LCAke3Rocm93QWxsRXJyb3JzfSk7XFxuYDtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpOyovXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQ1OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdC8vIEFueSA/KCkgd2lsbCBiZSBpZ25vcmVkIGluIHByb2R1Y3Rpb24gbW9kZS5cblx0XHRcdFx0aWYgKEhvdC5Nb2RlID09PSBEZXZlbG9wZXJNb2RlLlByb2R1Y3Rpb24pXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZW1wT3V0cHV0NSA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdFx0dGVtcE91dHB1dDQsIFwiPyhcIiwgXCIpXCIsIFwiKFwiLCBcblx0XHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nLCBzdGFydFBvczogbnVtYmVyLCBlbmRQb3M6IG51bWJlcik6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKFwiXCIpO1xuXHRcdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XHQob2ZmQ29udGVudDM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdFx0LypsZXQgb3V0OiBzdHJpbmcgPSBgZWNob091dHB1dCAoJHtvZmZDb250ZW50M30sICR7dGhyb3dBbGxFcnJvcnN9KTtcXG5gO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAob3V0KTsqL1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoSG90Lk1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZW1wT3V0cHV0NSA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdFx0dGVtcE91dHB1dDQsIFwiPyhcIiwgXCIpXCIsIFwiKFwiLCBcblx0XHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nLCBzdGFydFBvczogbnVtYmVyLCBlbmRQb3M6IG51bWJlcik6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgZm91bmRTdHI6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLyBDaGVjayB0byBzZWUgaWYgaXQgYmUgcGFyc2VkLiBJZiBzbywgc3RyaW5naWZ5IGl0LlxuXHRcdFx0XHRcdFx0XHRcdEpTT04ucGFyc2UgKHJlZ2V4Rm91bmQyKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLmFsbG93U3RyaW5naWZ5ID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRcdFx0Zm91bmRTdHIgPSBKU09OLnN0cmluZ2lmeSAocmVnZXhGb3VuZDIpO1xuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdGZvdW5kU3RyID0gYCR7cmVnZXhGb3VuZDJ9YDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjYXRjaCAoZXgpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLyBJZiB2YWxpZCBKU09OIGlzIG5vdCByZWNlaXZlZCwgZG9uJ3Qgd29ycnkgYWJvdXQgaXQsIHBhc3MgaXQgXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYWxvbmcgdG8gdGhlIGZ1bmN0aW9uIGJlbG93IGZvciBpdCB0byBiZSBwYXJzZWQgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIHRoZXJlIGluc3RlYWQuXG5cdFx0XHRcdFx0XHRcdFx0Zm91bmRTdHIgPSBgJHtyZWdleEZvdW5kMn1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8vIEBmaXhtZSBNYWtlIHRoaXMgYSBjYWxsYWJsZSBmdW5jdGlvbiBhbmQgcGFzcyBmb3VuZFN0ciwgZXRjLlxuXHRcdFx0XHRcdFx0XHRsZXQgb3V0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLm91dHB1dENvbW1hbmRzID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0b3V0ID0gYComJiUqJUAjQCF7XG5jb25zdCB0ZXN0RWxtID0gY3JlYXRlVGVzdEVsZW1lbnQgKCR7Zm91bmRTdHJ9KTtcbkhvdC5lY2hvIChcXGBkYXRhLXRlc3Qtb2JqZWN0LW5hbWUgPSBcIlxcJHt0ZXN0RWxtLm5hbWV9XCIgZGF0YS10ZXN0LW9iamVjdC1mdW5jID0gXCJcXCR7dGVzdEVsbS5mdW5jfVwiIGRhdGEtdGVzdC1vYmplY3QtdmFsdWUgPSBcIlxcJHt0ZXN0RWxtLnZhbHVlfVwiXFxgKTtcbn0qJiEjJUAhQCohXFxuYDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgY3JlYXRlVGVzdEVsZW1lbnQgPSAoZm91bmRTdHIyOiBhbnkpID0+XG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHRlc3RFbG0gPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IG9iaiA9IGZvdW5kU3RyMjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChmb3VuZFN0cjIpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9iaiA9IEpTT04ucGFyc2UgKGZvdW5kU3RyMik7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAob2JqKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9ialswXSwgb2JqWzFdLCBvYmpbMl0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvYmpbXCJuYW1lXCJdICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9iaik7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZS50ZXN0RWxlbWVudHNbdGVzdEVsbS5uYW1lXSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgZWxlbWVudCAke3Rlc3RFbG0ubmFtZX0gYWxyZWFkeSBleGlzdHMhYCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRjYXRjaCAoZXgpXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoXG5cdFx0XHRcdFx0XHRcdFx0YEVycm9yIHByb2Nlc3NpbmcgdGVzdCBlbGVtZW50ICR7Zm91bmRTdHIyfSBpbiAke0hvdC5DdXJyZW50UGFnZS5uYW1lfS4gRXJyb3I6ICR7ZXgubWVzc2FnZX1gXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuICh0ZXN0RWxtKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCB0ZXN0RWxtID0gY3JlYXRlVGVzdEVsZW1lbnQgKGZvdW5kU3RyKTtcblx0XHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIWRhdGEtdGVzdC1vYmplY3QtbmFtZSA9IFwiJHt0ZXN0RWxtLm5hbWV9XCIgZGF0YS10ZXN0LW9iamVjdC1mdW5jID0gXCIke3Rlc3RFbG0uZnVuY31cIiBkYXRhLXRlc3Qtb2JqZWN0LXZhbHVlID0gXCIke3Rlc3RFbG0udmFsdWV9XCIqJiEjJUAhQCohYDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAob3V0KTtcblx0XHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIChvZmZDb250ZW50Myk7XG5cdFx0XHRcdFx0XHRcdC8qbGV0IG91dDogc3RyaW5nID0gYGVjaG9PdXRwdXQgKCR7b2ZmQ29udGVudDN9LCAke3Rocm93QWxsRXJyb3JzfSk7XFxuYDtcblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7Ki9cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQ2OiBzdHJpbmcgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHR0ZW1wT3V0cHV0NSwgXCIqJiYlKiVAI0AhXCIsIFwiKiYhIyVAIUAqIVwiLCBcIiomJiUqJUAjQCFcIiwgXG5cdFx0XHRcdFx0KHJlZ2V4Rm91bmQ6IHN0cmluZywgc3RhcnRQb3M6IG51bWJlciwgZW5kUG9zOiBudW1iZXIpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKHJlZ2V4Rm91bmQpO1xuXHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdChvZmZDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgZXNjYXBlZENvbnRlbnQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLmFsbG93U3RyaW5naWZ5ID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRlc2NhcGVkQ29udGVudCA9IEpTT04uc3RyaW5naWZ5IChvZmZDb250ZW50KTtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0ZXNjYXBlZENvbnRlbnQgPSBvZmZDb250ZW50O1xuXG5cdFx0XHRcdFx0XHRsZXQgb3V0OiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRpZiAocGFyc2VyT3B0aW9ucy5vdXRwdXRDb21tYW5kcyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0b3V0ID0gYGVjaG9PdXRwdXQgKCR7ZXNjYXBlZENvbnRlbnR9LCAke3Rocm93QWxsRXJyb3JzfSk7XFxuYDtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0b3V0ID0gZXNjYXBlZENvbnRlbnQ7XG5cblx0XHRcdFx0XHRcdHJldHVybiAob3V0KTtcblx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHRcIiomJiUqJUAjQCFcIi5sZW5ndGgsIFwiKiYhIyVAIUAqIVwiLmxlbmd0aCk7XG5cblx0XHRcdFx0Ly8vIEBmaXhtZSBUZW1wb3JhcnkgaGFjay4gVGhlc2UgZGVsaW1pdGVycyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRlbXBPdXRwdXQgd2hlbiBcblx0XHRcdFx0Ly8vIGV4ZWN1dGluZyBwcm9jZXNzTmVzdGVkQ29udGVudC5cblx0XHRcdFx0dGVtcE91dHB1dDYgPSB0ZW1wT3V0cHV0Ni5yZXBsYWNlICgvXFwqXFwmXFwmXFwlXFwqXFwlXFxAXFwjXFxAXFwhL2csIFwiXCIpO1xuXHRcdFx0XHR0ZW1wT3V0cHV0NiA9IHRlbXBPdXRwdXQ2LnJlcGxhY2UgKC9cXCpcXCZcXCFcXCNcXCVcXEBcXCFcXEBcXCpcXCEvZywgXCJcIik7XG5cblx0XHRcdFx0cmV0dXJuICh0ZW1wT3V0cHV0Nik7XG5cdFx0XHR9LCAwKTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIHRoZSBjb250ZW50IGluIHRoaXMgZmlsZS4gVGhpcyB0cmVhdHMgZWFjaCBmaWxlIGFzIG9uZSBsYXJnZSBKYXZhU2NyaXB0XG5cdCAqIGZpbGUuIEFueSB0ZXh0IG91dHNpZGUgb2YgdGhlIDwqICo+IGFyZWFzIHdpbGwgYmUgdHJlYXRlZCBhczpcblx0ICogXG5cdCAqIFx0XHRIb3QuZWNobyAoXCJ0ZXh0XCIpO1xuXHQgKiBcblx0ICogQGZpeG1lIFRoZSByZWdleCdzIGluIHRoZSBvZmZDb250ZW50IGZ1bmN0aW9ucyBuZWVkIHRvIGJlIGZpeGVkLiBUaGVyZSdzIHNldmVyYWwgXG5cdCAqIHRlc3QgY2FzZXMgd2hlcmUgdGhleSB3aWxsIGZhaWwuXG5cdCAqL1xuXHRhc3luYyBwcm9jZXNzIChhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgdGhpc0NvbnRlbnQ6IHN0cmluZyA9IHRoaXMuY29udGVudDtcblxuXHRcdGlmIChhcmdzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKGFyZ3MgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSW4gJHt0aGlzLm5hbWV9LCB0aGUgcGFzc2VkIGFyZ3VtZW50cyByZWNlaXZlZCBjYW5ub3QgYmUgYW4gYXJyYXkhYCk7XG5cdFx0fVxuXG5cdFx0bGV0IHRlbXBBcmdzID0gSG90LkFyZ3VtZW50cztcblxuXHRcdEhvdC5Nb2RlID0gdGhpcy5wYWdlLnByb2Nlc3Nvci5tb2RlO1xuXHRcdEhvdC5Bcmd1bWVudHMgPSBhcmdzO1xuXHRcdEhvdC5DdXJyZW50UGFnZSA9IHRoaXMucGFnZTtcblx0XHRIb3QuUHVibGljS2V5cyA9IHRoaXMucGFnZS5wcm9jZXNzb3IucHVibGljS2V5cztcblx0XHRIb3QuQVBJID0gdGhpcy5wYWdlLmdldEFQSSAoKTtcblx0XHRIb3QuVGVzdGVyQVBJID0gdGhpcy5wYWdlLmdldFRlc3RlckFQSSAoKTtcblxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IEhvdEZpbGUucGFyc2VDb250ZW50ICh0aGlzQ29udGVudCwgdGhpcy50aHJvd0FsbEVycm9ycyk7XG5cblx0XHQvLyBFeGVjdXRlIHRoZSBhc3NlbWJsZWQgSlMgZmlsZS5cblx0XHRsZXQgcmV0dXJuZWRPdXRwdXQ6IGFueSA9IG51bGw7XG5cblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgZXhlY3V0aW9uQ29udGVudDogc3RyaW5nID0gYFxuXHRcdFx0dmFyIEhvdCA9IGFyZ3VtZW50c1swXTtcblx0XHRcdHZhciBQYXNzZWRIb3RGaWxlID0gYXJndW1lbnRzWzFdO1xuXG5cdFx0XHRgO1xuXG5cdFx0XHQvLyBPdXRwdXQgdGhlIGFyZ3VtZW50cyBzbyBpdCdzIHVzYWJsZSBpbiB0aGUgZW50aXJlIGRvY3VtZW50LlxuXHRcdFx0aWYgKHR5cGVvZiAoYXJncykgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRoZSBwYXNzaW5nIGFyZ3VtZW50cyBjYW5ub3QgYmUgYSBzdHJpbmchYCk7XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBhcmdzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgbmV3VmFyOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRsZXQgbmV3VmFyVmFsdWU6IGFueSA9IGFyZ3Nba2V5XTtcblx0XHRcdFx0bGV0IG5ld1ZhclZhbHVlU3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAobmV3VmFyVmFsdWUpO1xuXG5cdFx0XHRcdG5ld1ZhciA9IGB2YXIgJHtrZXl9ID0gJHtuZXdWYXJWYWx1ZVN0cn07XFxuYDtcblxuXHRcdFx0XHRleGVjdXRpb25Db250ZW50ICs9IG5ld1Zhcjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGNvbnRlbnROYW1lOiBzdHJpbmcgPSB0aGlzLm5hbWU7XG5cblx0XHRcdGlmIChjb250ZW50TmFtZSA9PT0gXCJcIilcblx0XHRcdFx0Y29udGVudE5hbWUgPSB0aGlzLmxvY2FsRmlsZTtcblxuXHRcdFx0aWYgKGNvbnRlbnROYW1lID09PSBcIlwiKVxuXHRcdFx0XHRjb250ZW50TmFtZSA9IHRoaXMudXJsO1xuXG5cdFx0XHRleGVjdXRpb25Db250ZW50ICs9IGBcblx0XHRcdC8qKlxuXHRcdFx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIG91dHB1dCBjb250ZW50LlxuXHRcdFx0ICovXG5cdFx0XHRmdW5jdGlvbiBlY2hvT3V0cHV0IChjb250ZW50LCB0aHJvd0Vycm9ycylcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRocm93RXJyb3JzID09IG51bGwpXG5cdFx0XHRcdFx0dGhyb3dFcnJvcnMgPSB0cnVlO1xuXG5cdFx0XHRcdGlmICh0aHJvd0Vycm9ycyA9PT0gdHJ1ZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdEhvdC5lY2hvIChjb250ZW50KTtcblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90LmVjaG8gKGNvbnRlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdEhvdC5lY2hvIChcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvKipcblx0XHRcdCAqIE91dHB1dHMgYSBcXCR7SlMgQ29udGVudH0gdmFsdWUuXG5cdFx0XHQgKi9cblx0XHRcdGZ1bmN0aW9uIG91dHB1dFN0ciAodmFsdWUsIHBvc3NpYmxlVmFsdWUpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCByZXN1bHQgPSBcXGBcXFxcXFwke1xcJHt2YWx1ZX19XFxgO1xuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHBvc3NpYmxlVmFsdWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHBvc3NpYmxlVmFsdWU7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmVzdWx0ID0gZXZhbCAodmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0e1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIChyZXN1bHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcblx0XHRcdCAqIENyZWF0ZSBhIGZ1bmN0aW9uIGZvciBsYXRlciBleGVjdXRpb24gb24gdGhpcyBwYWdlLlxuXHRcdFx0ICovXG5cdFx0XHRmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbiAobmFtZSwgYXJncywgZnVuY0JvZHksIGlzQXN5bmMpXG5cdFx0XHR7XG5cdFx0XHRcdHJldHVybiAoSG90LkN1cnJlbnRQYWdlLmFkZEZ1bmN0aW9uIChuYW1lLCBhcmdzLCBmdW5jQm9keSwgaXNBc3luYykpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcblx0XHRcdCAqIENyZWF0ZSBhIHRlc3QgZWxlbWVudC5cblx0XHRcdCAqL1xuXHRcdFx0ZnVuY3Rpb24gY3JlYXRlVGVzdEVsZW1lbnQgKGZvdW5kU3RyKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdGVzdEVsbSA9IG51bGw7XG5cblx0XHRcdFx0dHJ5XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgb2JqID0gZm91bmRTdHI7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChmb3VuZFN0cikgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRvYmogPSBKU09OLnBhcnNlIChmb3VuZFN0cik7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChvYmopID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9iaik7XG5cblx0XHRcdFx0XHRpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqWzBdLCBvYmpbMV0sIG9ialsyXSk7XG5cblx0XHRcdFx0XHRpZiAob2JqW1wibmFtZVwiXSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9iaik7XG5cblx0XHRcdFx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnRlc3RFbGVtZW50c1t0ZXN0RWxtLm5hbWVdICE9IG51bGwpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFxcYFRlc3QgZWxlbWVudCBcXCR7dGVzdEVsbS5uYW1lfSBhbHJlYWR5IGV4aXN0cyFcXGApO1xuXG5cdFx0XHRcdFx0SG90LkN1cnJlbnRQYWdlLmFkZFRlc3RFbGVtZW50ICh0ZXN0RWxtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXRjaCAoZXgpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFxuXHRcdFx0XFxgRXJyb3IgcHJvY2Vzc2luZyB0ZXN0IGVsZW1lbnQgXFwke2ZvdW5kU3RyfSBpbiBcXCR7SG90LkN1cnJlbnRQYWdlLm5hbWV9LiBFcnJvcjogXFwke2V4Lm1lc3NhZ2V9XFxgXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuICh0ZXN0RWxtKTtcblx0XHRcdH1cblxuXHRcdFx0YXN5bmMgZnVuY3Rpb24gcnVuQ29udGVudCAoQ3VycmVudEhvdEZpbGUpXG5cdFx0XHR7XFxuYDtcblx0XHRcdGV4ZWN1dGlvbkNvbnRlbnQgKz0gb3V0cHV0O1xuXHRcdFx0ZXhlY3V0aW9uQ29udGVudCArPSBgXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAocnVuQ29udGVudCAoUGFzc2VkSG90RmlsZSkudGhlbiAoKCkgPT5cblx0XHRcdHtcblx0XHRcdFx0cmV0dXJuICh7XG5cdFx0XHRcdFx0XHRob3Q6IEhvdCxcblx0XHRcdFx0XHRcdG91dHB1dDogSG90Lk91dHB1dCxcblx0XHRcdFx0XHRcdGRhdGE6IEpTT04uc3RyaW5naWZ5IChIb3QuRGF0YSlcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pKTtgO1xuXG5cdFx0XHQvLy8gQGZpeG1lIFByaW9yIHRvIGV4ZWN1dGlvbiBjb21waWxlIGFueSBUeXBlU2NyaXB0IGFuZCBtYWtlIGl0IEVTNSBjb21wYXRpYmxlLlxuXHRcdFx0bGV0IGZ1bmM6IEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uIChleGVjdXRpb25Db250ZW50KTtcblx0XHRcdHJldHVybmVkT3V0cHV0ID0gYXdhaXQgZnVuYy5hcHBseSAodGhpcywgW0hvdCwgdGhpc10pO1xuXHRcdH1cblx0XHRjYXRjaCAoZXgpXG5cdFx0e1xuXHRcdFx0aWYgKGV4IGluc3RhbmNlb2YgU3ludGF4RXJyb3IpXG5cdFx0XHR7XG5cdFx0XHRcdC8vLyBAZml4bWUgUHV0IHdoYXQncyBpbiB0aGUgY29udGVudCB2YXJpYWJsZSBpbnRvIGEgcHJldiBjb250ZW50IHZhcmlhYmxlP1xuXHRcdFx0XHQvLy8gVGhlbiBvbmNlIHRoZXJlJ3Mgbm8gbG9uZ2VyIGFueSBzeW50YXggZXJyb3JzIGJlaW5nIHRocm93biwgZXhlY3V0ZSB0aGUgXG5cdFx0XHRcdC8vLyBjb2RlPyBUaGlzIHdvdWxkIGFsc28gcmVxdWlyZSBzYXZpbmcgYW55IEhUTUwgb3V0c2lkZSBvZiB0aGUgKj4gYW5kIDwqIFxuXHRcdFx0XHQvLy8gdGhlbiBlY2hvaW5nIGl0IG91dC4gVGhlIHRocm93IGJlbG93IHdvdWxkIGhhdmUgdG8gYmUgcmVtb3ZlZCBhcyB3ZWxsLlxuXHRcdFx0XHR0aHJvdyBleDtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhyb3cgZXg7XG5cdFx0fVxuXG5cdFx0SG90LkRhdGEgPSByZXR1cm5lZE91dHB1dC5ob3QuRGF0YTtcblx0XHRsZXQgZmluYWxPdXRwdXQ6IHN0cmluZyA9IHJldHVybmVkT3V0cHV0Lm91dHB1dDtcblx0XHRIb3QuT3V0cHV0ID0gXCJcIjtcblx0XHRIb3QuQXJndW1lbnRzID0gdGVtcEFyZ3M7XG5cblx0XHRyZXR1cm4gKGZpbmFsT3V0cHV0KTtcblx0fVxufSIsIi8qKlxuICogVGhlIGxvZ2dpbmcgbGV2ZWwuXG4gKi9cbmV4cG9ydCBlbnVtIEhvdExvZ0xldmVsXG57XG5cdC8qKlxuXHQgKiBQcmludHMgb25seSBpbmZvIG1lc3NhZ2VzLlxuXHQgKi9cblx0SW5mbyxcblx0LyoqXG5cdCAqIFByaW50cyBvbmx5IHdhcm5pbmcgbWVzc2FnZXMuXG5cdCAqL1xuXHRXYXJuaW5nLFxuXHQvKipcblx0ICogUHJpbnRzIG9ubHkgZXJyb3IgbWVzc2FnZXMuXG5cdCAqL1xuXHRFcnJvcixcblx0LyoqXG5cdCAqIFByaW50cyBhbGwgbWVzc2FnZXMuXG5cdCAqL1xuXHRWZXJib3NlLFxuXHQvKipcblx0ICogUHJpbnRzIGFsbCBtZXNzYWdlcywgZXhjZXB0IHZlcmJvc2UuXG5cdCAqL1xuXHRBbGwsXG5cdC8qKlxuXHQgKiBEb2Vzbid0IHByaW50IGFueSBtZXNzYWdlLlxuXHQgKi9cblx0Tm9uZVxufVxuXG4vKipcbiAqIFRoZSBsb2dnZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RMb2dcbntcblx0LyoqXG5cdCAqIFRoZSBsb2dnaW5nIGxldmVsLlxuXHQgKi9cblx0bG9nTGV2ZWw6IEhvdExvZ0xldmVsO1xuXHQvKipcblx0ICogU2hvdyB0aGUgcmVzcG9uc2VzIHRvIGVhY2ggcmVxdWVzdC5cblx0ICovXG5cdHNob3dSZXNwb25zZXM6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBTaG93IHRoZSBIVFRQIGV2ZW50cy5cblx0ICovXG5cdHNob3dIVFRQRXZlbnRzOiBib29sZWFuO1xuXHQvKipcblx0ICogU2hvdyB0aGUgV2ViU29ja2V0IGV2ZW50cy5cblx0ICovXG5cdHNob3dXZWJTb2NrZXRFdmVudHM6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKGxvZ0xldmVsOiBIb3RMb2dMZXZlbCA9IEhvdExvZ0xldmVsLkFsbClcblx0e1xuXHRcdHRoaXMubG9nTGV2ZWwgPSBsb2dMZXZlbDtcblx0XHR0aGlzLnNob3dSZXNwb25zZXMgPSBmYWxzZTtcblx0XHR0aGlzLnNob3dIVFRQRXZlbnRzID0gZmFsc2U7XG5cdFx0dGhpcy5zaG93V2ViU29ja2V0RXZlbnRzID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2UgdGhlIGxvZ2dpbmcgbGV2ZWwuXG5cdCAqL1xuXHRzdGF0aWMgcGFyc2UgKGxvZ0xldmVsOiBzdHJpbmcpOiBIb3RMb2dMZXZlbFxuXHR7XG5cdFx0bGV0IGxldmVsOiBIb3RMb2dMZXZlbCA9IEhvdExvZ0xldmVsLkFsbDtcblxuXHRcdGlmIChsb2dMZXZlbCA9PT0gXCJpbmZvXCIpXG5cdFx0XHRsZXZlbCA9IEhvdExvZ0xldmVsLkluZm87XG5cblx0XHRpZiAobG9nTGV2ZWwgPT09IFwid2FybmluZ1wiKVxuXHRcdFx0bGV2ZWwgPSBIb3RMb2dMZXZlbC5XYXJuaW5nO1xuXG5cdFx0aWYgKGxvZ0xldmVsID09PSBcImVycm9yXCIpXG5cdFx0XHRsZXZlbCA9IEhvdExvZ0xldmVsLkVycm9yO1xuXG5cdFx0aWYgKGxvZ0xldmVsID09PSBcInZlcmJvc2VcIilcblx0XHRcdGxldmVsID0gSG90TG9nTGV2ZWwuVmVyYm9zZTtcblxuXHRcdGlmIChsb2dMZXZlbCA9PT0gXCJhbGxcIilcblx0XHRcdGxldmVsID0gSG90TG9nTGV2ZWwuQWxsO1xuXG5cdFx0aWYgKGxvZ0xldmVsID09PSBcIm5vbmVcIilcblx0XHRcdGxldmVsID0gSG90TG9nTGV2ZWwuTm9uZTtcblxuXHRcdHJldHVybiAobGV2ZWwpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIG1lc3NhZ2UuXG5cdCAqL1xuXHRsb2cgKGxldmVsOiBIb3RMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpXG5cdFx0e1xuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcilcblx0XHRcdFx0dGhpcy5lcnJvciAobWVzc2FnZSk7XG5cblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHRcdFx0dGhpcy53YXJuaW5nIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbykgfHwgXG5cdFx0XHRcdChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkpXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbClcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdFx0XHR0aGlzLmVycm9yIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKVxuXHRcdFx0XHR0aGlzLndhcm5pbmcgKG1lc3NhZ2UpO1xuXG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pXG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuRXJyb3IpXG5cdFx0XHRcdHRoaXMuZXJyb3IgKG1lc3NhZ2UpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHRcdFx0dGhpcy53YXJuaW5nIChtZXNzYWdlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbylcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pXG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIHZlcmJvc2UgbWVzc2FnZS5cblx0ICovXG5cdHZlcmJvc2UgKG1lc3NhZ2U6IHN0cmluZyB8IEZ1bmN0aW9uLCBkYXRhOiBhbnkgPSBudWxsKVxuXHR7XG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHR5cGVvZiAobWVzc2FnZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSAoZGF0YSkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2cgYSBtZXNzYWdlLlxuXHQgKi9cblx0aW5mbyAobWVzc2FnZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5BbGwpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pKVxuXHRcdHtcblx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIHdhcm5pbmcuXG5cdCAqL1xuXHR3YXJuaW5nIChtZXNzYWdlOiBzdHJpbmcpXG5cdHtcblx0XHRpZiAoKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbCkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZykpXG5cdFx0e1xuXHRcdFx0Y29uc29sZS53YXJuIChtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9nIGFuIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRlcnJvciAobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpXG5cdHtcblx0XHRpZiAoKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbCkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuRXJyb3IpKVxuXHRcdHtcblx0XHRcdGxldCBtc2c6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdGlmICh0eXBlb2YgKG1lc3NhZ2UpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRtc2cgPSBtZXNzYWdlO1xuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAobWVzc2FnZS5tZXNzYWdlICE9IG51bGwpXG5cdFx0XHRcdFx0bXNnID0gbWVzc2FnZS5tZXNzYWdlO1xuXG5cdFx0XHRcdGlmIChtZXNzYWdlLnN0YWNrICE9IG51bGwpXG5cdFx0XHRcdFx0bXNnID0gbWVzc2FnZS5zdGFjaztcblx0XHRcdH1cblxuXHRcdFx0Y29uc29sZS5lcnJvciAobXNnKTtcblx0XHR9XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3QgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90QXNzZXQgfSBmcm9tIFwiLi9Ib3RBc3NldFwiO1xuaW1wb3J0IHsgSG90Q29tcG9uZW50LCBJSG90Q29tcG9uZW50IH0gZnJvbSBcIi4vSG90Q29tcG9uZW50XCI7XG5pbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuXG4vKipcbiAqIExvYWQgYSBtb2R1bGUgdGhhdCBjb250YWlucyB0aGUgYXNzZXRzIHRvIGxvYWQgZm9yIHRoZSBmcm9udGVuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdE1vZHVsZVxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBsaXN0IG9mIE5QTSBtb2R1bGVzIHRvIGltcG9ydC5cblx0ICovXG5cdGltcG9ydD86IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIEhUTUwgZmlsZXMgdG8gbG9hZC5cblx0ICovXG5cdGh0bWw/OiAoc3RyaW5nIHwgSG90QXNzZXQpW107XG5cdC8qKlxuXHQgKiBUaGUgQ1NTIGZpbGVzIHRvIGxvYWQuXG5cdCAqL1xuXHRjc3M/OiAoc3RyaW5nIHwgSG90QXNzZXQpW107XG5cdC8qKlxuXHQgKiBUaGUgSlMgZmlsZXMgdG8gbG9hZC5cblx0ICovXG5cdGpzPzogKHN0cmluZyB8IEhvdEFzc2V0KVtdO1xuXHQvKipcblx0ICogVGhlIGV4cG9ydGVkIGNvbXBvbmVudCBsaWJyYXJ5IHRoYXQgY29udGFpbnMgYWxsIHRoZSBjb21wb25lbnRzIHRvIGxvYWQuXG5cdCAqL1xuXHRjb21wb25lbnRMaWJyYXJ5Pzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbXBvbmVudHMgdG8gbG9hZC5cblx0ICovXG5cdGNvbXBvbmVudHM/OiAobmV3IChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpW107XG5cblx0Y29uc3RydWN0b3IgKG5hbWU6IHN0cmluZylcblx0e1xuXHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdFx0dGhpcy5pbXBvcnQgPSBbXTtcblx0XHR0aGlzLmh0bWwgPSBbXTtcblx0XHR0aGlzLmNzcyA9IFtdO1xuXHRcdHRoaXMuanMgPSBbXTtcblx0XHR0aGlzLmNvbXBvbmVudExpYnJhcnkgPSBcIlwiO1xuXHRcdHRoaXMuY29tcG9uZW50cyA9IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIE91dHB1dCBDU1MuXG5cdCAqL1xuXHRvdXRwdXRDU1MgKGVjaG9PdXQ6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nXG5cdHtcblx0XHRpZiAodGhpcy5jc3MgPT0gbnVsbClcblx0XHRcdHJldHVybjtcblxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHR0aGlzLm91dHB1dEFzc2V0IChcImNzc1wiLCB0aGlzLmNzcywgKGFzc2V0OiBIb3RBc3NldCkgPT5cblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgY29udGVudDogc3RyaW5nIHwgYW55ID0gYXNzZXQub3V0cHV0ICgpO1xuXHRcdFx0XHRvdXRwdXQgKz0gYCR7Y29udGVudH1cXG5gO1xuXHRcdFx0fSk7XG5cblx0XHRpZiAoZWNob091dCA9PT0gdHJ1ZSlcblx0XHRcdEhvdC5lY2hvIChvdXRwdXQpO1xuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE91dHB1dCBKUy5cblx0ICovXG5cdG91dHB1dEpTIChlY2hvT3V0OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZ1xuXHR7XG5cdFx0aWYgKHRoaXMuanMgPT0gbnVsbClcblx0XHRcdHJldHVybjtcblxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHR0aGlzLm91dHB1dEFzc2V0IChcImpzXCIsIHRoaXMuanMsIChhc3NldDogSG90QXNzZXQpID0+XG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGNvbnRlbnQ6IHN0cmluZyB8IGFueSA9IGFzc2V0Lm91dHB1dCAoKTtcblx0XHRcdFx0b3V0cHV0ICs9IGAke2NvbnRlbnR9XFxuYDtcblx0XHRcdH0pO1xuXG5cdFx0aWYgKGVjaG9PdXQgPT09IHRydWUpXG5cdFx0XHRIb3QuZWNobyAob3V0cHV0KTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPdXRwdXQgYSBsb2FkZWQgSFRNTCBhc3NldC5cblx0ICovXG5cdGFzeW5jIG91dHB1dCAoYXNzZXROYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGF3YWl0IEhvdC5pbmNsdWRlIChgJHt0aGlzLm5hbWV9LyR7YXNzZXROYW1lfS5ob3R0YCwgYXJncyk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBIVE1MIGFzc2V0cy5cblx0ICovXG5cdGFzeW5jIGxvYWRIVE1MICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRpZiAodGhpcy5odG1sID09IG51bGwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRsZXQgZmlsZXM6IGFueSA9IHt9O1xuXG5cdFx0dGhpcy5vdXRwdXRBc3NldCAoXCJodG1sXCIsIHRoaXMuaHRtbCwgKGFzc2V0OiBIb3RBc3NldCkgPT5cblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgZmlsZSA9IGFzc2V0Lm91dHB1dCAoKTtcblxuXHRcdFx0XHRpZiAodHlwZW9mIChmaWxlKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIVE1MIGFzc2V0cyBjYW5ub3QgYmUgb3V0cHV0dGVkIHVzaW5nIG9ubHkgYSBzdHJpbmchYCk7XG5cblx0XHRcdFx0ZmlsZXNbZmlsZS5uYW1lXSA9IGZpbGU7XG5cdFx0XHR9KTtcblxuXHRcdGF3YWl0IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IubG9hZEhvdEZpbGVzIChmaWxlcyk7XG5cdH1cblxuXHQvKipcblx0ICogT3V0cHV0IGNvbXBvbmVudHMgYXNzZXRzLlxuXHQgKi9cblx0b3V0cHV0Q29tcG9uZW50cyAoZWNob091dDogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmdcblx0e1xuXHRcdGlmICh0aGlzLmNvbXBvbmVudHMgPT0gbnVsbClcblx0XHRcdHJldHVybiAoXCJcIik7XG5cblx0XHRpZiAodGhpcy5jb21wb25lbnRzLmxlbmd0aCA8IDEpXG5cdFx0XHRyZXR1cm4gKFwiXCIpO1xuXG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gYDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+YDtcblx0XHRsZXQgY29tcG9uZW50TGlicmFyeTogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLmNvbXBvbmVudExpYnJhcnkgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jb21wb25lbnRMaWJyYXJ5ICE9PSBcIlwiKVxuXHRcdFx0XHRjb21wb25lbnRMaWJyYXJ5ID0gYCR7dGhpcy5jb21wb25lbnRMaWJyYXJ5fS5gO1xuXHRcdH1cblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5jb21wb25lbnRzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbaUlkeF07XG5cblx0XHRcdG91dHB1dCArPSBgSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5hZGRDb21wb25lbnQgKCR7Y29tcG9uZW50TGlicmFyeX0ke2NvbXBvbmVudH0pO1xcbmA7XG5cdFx0fVxuXG5cdFx0b3V0cHV0ICs9IGA8L3NjcmlwdD5gO1xuXG5cdFx0aWYgKGVjaG9PdXQgPT09IHRydWUpXG5cdFx0XHRIb3QuZWNobyAob3V0cHV0KTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPdXRwdXQgYW4gYXNzZXQgdG8gSFRNTC5cblx0ICovXG5cdHByb3RlY3RlZCBvdXRwdXRBc3NldCAoYXNzZXRUeXBlOiBzdHJpbmcsIGFzc2V0czogKHN0cmluZyB8IEhvdEFzc2V0KVtdID0gW10sIFxuXHRcdGNhbGxiYWNrOiAoYXNzZXQ6IEhvdEFzc2V0KSA9PiB2b2lkKTogdm9pZFxuXHR7XG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBhc3NldHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGFzc2V0OiBzdHJpbmcgfCBIb3RBc3NldCA9IGFzc2V0c1tpSWR4XTtcblx0XHRcdGxldCBsb2FkQXNzZXQ6IEhvdEFzc2V0ID0gbnVsbDtcblx0XHRcdGxvYWRBc3NldCA9IG5ldyBIb3RBc3NldCAoYXNzZXRUeXBlKTtcblxuXHRcdFx0aWYgKHR5cGVvZiAoYXNzZXQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRsb2FkQXNzZXQucGF0aCA9IGFzc2V0O1xuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoYXNzZXQubmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdGxvYWRBc3NldC5uYW1lID0gYXNzZXQubmFtZTtcblxuXHRcdFx0XHRpZiAoYXNzZXQucGF0aCAhPSBudWxsKVxuXHRcdFx0XHRcdGxvYWRBc3NldC5wYXRoID0gYXNzZXQucGF0aDtcblxuXHRcdFx0XHRpZiAoYXNzZXQuY29udGVudCAhPSBudWxsKVxuXHRcdFx0XHRcdGxvYWRBc3NldC5jb250ZW50ID0gYXNzZXQuY29udGVudDtcblx0XHRcdH1cblxuXHRcdFx0Y2FsbGJhY2sgKGxvYWRBc3NldCk7XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgSG90IH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90VGVzdEVsZW1lbnQgfSBmcm9tIFwiLi9Ib3RUZXN0RWxlbWVudFwiO1xuaW1wb3J0IHsgSG90VGVzdE1hcCwgSG90VGVzdFBhdGggfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5pbXBvcnQgeyBIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcblxuLyoqXG4gKiBBIHBhZ2UgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90UGFnZVxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcm91dGUgdXNlZCB0byBnZXQgdG8gdGhpcyBwYWdlLlxuXHQgKi9cblx0cm91dGU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyBhZGRlZCB0byB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRjb21wb25lbnRzPzogeyBbbmFtZTogc3RyaW5nXTogSG90Q29tcG9uZW50IH07XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS4gRmlsZSBvcmRlcmluZyBtYXR0ZXJzIGhlcmUuXG5cdCAqIEV2ZXJ5IGZpbGUgaXMgcHJvY2Vzc2VkIGluY3JlbWVudGFsbHkuXG5cdCAqL1xuXHRmaWxlcz86IEhvdEZpbGVbXTtcblx0LyoqXG5cdCAqIFRoZSBmdW5jdGlvbnMgdG8gZXhlY3V0ZSBsYXRlci5cblx0ICovXG5cdGZ1bmN0aW9ucz86IHsgW25hbWU6IHN0cmluZ106IEZ1bmN0aW9uOyB9O1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG1hcC5cblx0ICovXG5cdHRlc3Rlck1hcD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBlbGVtZW50cyB0byB0ZXN0IG9uIHRoaXMgcGFnZS5cblx0ICovXG5cdHRlc3RFbGVtZW50cz86IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RFbGVtZW50OyB9O1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGF0aHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0UGF0aHM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcbn1cblxuLyoqXG4gKiBBIHBhZ2UgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFBhZ2UgaW1wbGVtZW50cyBJSG90UGFnZVxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZSB1c2VkIHRvIGdldCB0byB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRyb3V0ZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbXBvbmVudHMgYWRkZWQgdG8gdGhpcyBwYWdlLlxuXHQgKi9cblx0Y29tcG9uZW50czogeyBbbmFtZTogc3RyaW5nXTogSG90Q29tcG9uZW50IH07XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS4gRmlsZSBvcmRlcmluZyBtYXR0ZXJzIGhlcmUuXG5cdCAqIEV2ZXJ5IGZpbGUgaXMgcHJvY2Vzc2VkIGluY3JlbWVudGFsbHkuXG5cdCAqL1xuXHRmaWxlczogSG90RmlsZVtdO1xuXHQvKipcblx0ICogVGhlIGZ1bmN0aW9ucyB0byBleGVjdXRlIGxhdGVyLlxuXHQgKi9cblx0ZnVuY3Rpb25zOiB7IFtuYW1lOiBzdHJpbmddOiBGdW5jdGlvbjsgfTtcblx0LyoqXG5cdCAqIFRoZSBhc3NvY2lhdGVkIHRlc3RlciBuYW1lLlxuXHQgKi9cblx0dGVzdGVyTmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG1hcC5cblx0ICovXG5cdHRlc3Rlck1hcDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGVsZW1lbnRzIHRvIHRlc3Qgb24gdGhpcyBwYWdlLlxuXHQgKi9cblx0dGVzdEVsZW1lbnRzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0RWxlbWVudDsgfTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0IHBhdGhzIHRvIHRlc3Qgb24gdGhpcyBwYWdlLlxuXHQgKi9cblx0dGVzdFBhdGhzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdFBhZ2UgfCBIb3RTdGFxKVxuXHR7XG5cdFx0aWYgKGNvcHkgaW5zdGFuY2VvZiBIb3RTdGFxKVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gY29weTtcblx0XHRcdHRoaXMubmFtZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnRlc3Rlck5hbWUgPSBcIkhvdFRlc3Rlck1vY2hhU2VsZW5pdW1cIjtcblx0XHRcdHRoaXMudGVzdGVyTWFwID0gXCJcIjtcblx0XHRcdHRoaXMucm91dGUgPSBcIlwiO1xuXHRcdFx0dGhpcy5jb21wb25lbnRzID0ge307XG5cdFx0XHR0aGlzLmZpbGVzID0gW107XG5cdFx0XHR0aGlzLmZ1bmN0aW9ucyA9IHt9O1xuXHRcdFx0dGhpcy50ZXN0RWxlbWVudHMgPSB7fTtcblx0XHRcdHRoaXMudGVzdFBhdGhzID0ge307XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLnByb2Nlc3NvciA9IGNvcHkucHJvY2Vzc29yO1xuXHRcdFx0dGhpcy5uYW1lID0gY29weS5uYW1lIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnRlc3Rlck5hbWUgPSBjb3B5LnRlc3Rlck5hbWUgfHwgXCJIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtXCI7XG5cdFx0XHR0aGlzLnRlc3Rlck1hcCA9IGNvcHkudGVzdGVyTWFwIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnJvdXRlID0gY29weS5yb3V0ZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy5jb21wb25lbnRzID0gY29weS5jb21wb25lbnRzIHx8IHt9O1xuXHRcdFx0dGhpcy5maWxlcyA9IGNvcHkuZmlsZXMgfHwgW107XG5cdFx0XHR0aGlzLmZ1bmN0aW9ucyA9IGNvcHkuZnVuY3Rpb25zIHx8IHt9O1xuXHRcdFx0dGhpcy50ZXN0RWxlbWVudHMgPSBjb3B5LnRlc3RFbGVtZW50cyB8fCB7fTtcblx0XHRcdHRoaXMudGVzdFBhdGhzID0gY29weS50ZXN0UGF0aHMgfHwge307XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGZpbGUgdG8gcHJvY2Vzcy4gSXQncyByZWNvbW1lbmQgdG8gbG9hZCB0aGUgZmlsZSBwcmlvciB0byBcblx0ICogYWRkaW5nIGl0IHRvIGEgcGFnZSBpZiBpdCdzIGFib3V0IHRvIGJlIHVzZWQuXG5cdCAqL1xuXHRhc3luYyBhZGRGaWxlIChmaWxlOiBIb3RGaWxlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0ZmlsZS5wYWdlID0gdGhpcztcblxuXHRcdHRoaXMuZmlsZXMucHVzaCAoZmlsZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBBUEkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS5cblx0ICovXG5cdGdldEFQSSAoKTogSG90QVBJXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucHJvY2Vzc29yLmFwaSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSB0ZXN0ZXIgQVBJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRnZXRUZXN0ZXJBUEkgKCk6IEhvdEFQSVxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLnByb2Nlc3Nvci50ZXN0ZXJBUEkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbGwgZmlsZXMgaW4gdGhlIHBhZ2UuIENvdWxkIGRlY3JlYXNlIHBhZ2UgbG9hZGluZyBwZXJmb3JtYW5jZS5cblx0ICogSXQncyByZWNvbW1lbmQgdG8gbG9hZCB0aGUgZmlsZSBwcmlvciB0byBhZGRpbmcgaXQgdG8gYSBwYWdlLlxuXHQgKi9cblx0YXN5bmMgbG9hZCAoZmlsZTogSG90RmlsZSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWxlcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IHRoaXMuZmlsZXNbaUlkeF07XG5cblx0XHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHBhZ2UgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAoYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWxlcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IHRoaXMuZmlsZXNbaUlkeF07XG5cblx0XHRcdEhvdC5PdXRwdXQgPSBcIlwiO1xuXHRcdFx0ZmlsZS5wYWdlID0gdGhpcztcblxuXHRcdFx0b3V0cHV0ICs9IGF3YWl0IGZpbGUucHJvY2VzcyAoYXJncyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgbGF0ZXIuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgbmV3IGZ1bmN0aW9uJ3MgbmFtZS5cblx0ICovXG5cdGFkZEZ1bmN0aW9uIChuYW1lOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBmdW5jQm9keTogc3RyaW5nLCBpc0FzeW5jOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmdcblx0e1xuXHRcdGlmIChuYW1lID09IG51bGwpXG5cdFx0XHRuYW1lID0gXCJfX2Z1bmNcIiArIE9iamVjdC5rZXlzICh0aGlzLmZ1bmN0aW9ucykubGVuZ3RoO1xuXG5cdFx0bGV0IGFyZ3NTdHI6IHN0cmluZyA9IFwiXCI7XG5cdFx0bGV0IGFzeW5jU3RyOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKGlzQXN5bmMgPT09IHRydWUpXG5cdFx0XHRhc3luY1N0ciA9IFwiYXN5bmMgXCI7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGFyZ3MubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0Y29uc3QgYXJnOiBzdHJpbmcgPSBhcmdzW2lJZHhdO1xuXHRcdFx0bGV0IGNvbW1hOiBzdHJpbmcgPSBcIixcIjtcblxuXHRcdFx0aWYgKGlJZHggPT0gYXJncy5sZW5ndGggLSAxKVxuXHRcdFx0XHRjb21tYSA9IFwiXCI7XG5cblx0XHRcdGFyZ3NTdHIgKz0gYCR7YXJnfSR7Y29tbWF9YDtcblx0XHR9XG5cblx0XHR0aGlzLmZ1bmN0aW9uc1tuYW1lXSA9IG5ldyBGdW5jdGlvbiAoYHJldHVybiAoJHthc3luY1N0cn0oJHthcmdzU3RyfSkgPT4geyAke2Z1bmNCb2R5fSB9KS5hcHBseSAodGhpcywgYXJndW1lbnRzKTtgKTtcblxuXHRcdHJldHVybiAobmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbHMgYSBmdW5jdGlvbiB0aGF0J3MgYmVlbiBzdG9yZWQgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cblx0ICovXG5cdGNhbGxGdW5jdGlvbiAodGhpc09iajogYW55LCBuYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogYW55XG5cdHtcblx0XHRsZXQgZnVuYzogRnVuY3Rpb24gPSB0aGlzLmZ1bmN0aW9uc1tuYW1lXTtcblxuXHRcdGlmIChmdW5jID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBGdW5jdGlvbiAke25hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0cmV0dXJuIChmdW5jLmFwcGx5ICh0aGlzT2JqLCBhcmdzKSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbHMgYW4gYXN5bmMgZnVuY3Rpb24gdGhhdCdzIGJlZW4gc3RvcmVkIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRhc3luYyBjYWxsQXN5bmNGdW5jdGlvbiAodGhpc09iajogYW55LCBuYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgZnVuYzogRnVuY3Rpb24gPSB0aGlzLmZ1bmN0aW9uc1tuYW1lXTtcblxuXHRcdGlmIChmdW5jID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBGdW5jdGlvbiAke25hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0cmV0dXJuIChmdW5jLmFwcGx5ICh0aGlzT2JqLCBhcmdzKSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgdGVzdCBlbGVtZW50LlxuXHQgKi9cblx0YWRkVGVzdEVsZW1lbnQgKGVsbTogSG90VGVzdEVsZW1lbnQpOiB2b2lkXG5cdHtcblx0XHRpZiAodGhpcy50ZXN0RWxlbWVudHNbZWxtLm5hbWVdICE9IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IGVsZW1lbnQgJHtlbG0ubmFtZX0gYWxyZWFkeSBleGlzdHMhYCk7XG5cblx0XHR0aGlzLnRlc3RFbGVtZW50c1tlbG0ubmFtZV0gPSBlbG07XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdGVzdCBlbGVtZW50LlxuXHQgKi9cblx0Z2V0VGVzdEVsZW1lbnQgKG5hbWU6IHN0cmluZyk6IEhvdFRlc3RFbGVtZW50XG5cdHtcblx0XHRpZiAodGhpcy50ZXN0RWxlbWVudHNbbmFtZV0gPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgZWxlbWVudCAke25hbWV9IGRvZXN0IG5vdCBleGlzdCFgKTtcblxuXHRcdHJldHVybiAodGhpcy50ZXN0RWxlbWVudHNbbmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHRlc3QgcGF0aC5cblx0ICovXG5cdGNyZWF0ZVRlc3RQYXRoIChwYXRoTmFtZTogc3RyaW5nLCBkcml2ZXJGdW5jOiBIb3RUZXN0UGF0aCk6IHZvaWRcblx0e1xuXHRcdGlmICh0aGlzLnRlc3RQYXRoc1twYXRoTmFtZV0gIT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgcGF0aCAke3BhdGhOYW1lfSBhbHJlYWR5IGV4aXN0cyFgKTtcblxuXHRcdHRoaXMudGVzdFBhdGhzW3BhdGhOYW1lXSA9IGRyaXZlckZ1bmM7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBIb3RFdmVudE1ldGhvZCwgSUhvdFJvdXRlTWV0aG9kLCBcblx0U2VydmVyRXhlY3V0aW9uRnVuY3Rpb24sIFRlc3RDYXNlRnVuY3Rpb24sIFRlc3RDYXNlT2JqZWN0LCBTZXJ2ZXJSZXF1ZXN0IH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90TG9nIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5cbi8qKlxuICogVGhlIHJvdXRlIHRvIHVzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFJvdXRlXG57XG5cdC8qKlxuXHQgKiBUaGUgc2VydmVyIHRoYXQgbWFpbnRhaW5zIHRoZSBjb25uZWN0aW9ucy5cblx0ICovXG5cdGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudDtcblx0LyoqXG5cdCAqIFRoZSBhc3NvY2lhdGVkIGxvZ2dlci5cblx0ICovXG5cdGxvZ2dlcjogSG90TG9nO1xuXHQvKipcblx0ICogVGhlIHJvdXRlLlxuXHQgKi9cblx0cm91dGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuXG5cdCAqL1xuXHRkZXNjcmlwdGlvbjogc3RyaW5nO1xuXHQvKipcblx0ICogQWRkaXRpb25hbCBPcGVuQVBJIGluZm9ybWF0aW9uLiBBbnl0aGluZyBhZGRlZCBoZXJlIHdpbGwgYmUgYXV0b21lcmdlZCBpbi5cblx0ICovXG5cdG9wZW5BUEk6IGFueTtcblx0LyoqXG5cdCAqIFRoZSB2ZXJzaW9uLlxuXHQgKi9cblx0dmVyc2lvbjogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHByZWZpeCB0byBhZGQgdG8gdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJvdXRlIG1ldGhvZC5cblx0ICovXG5cdHByZWZpeDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNhbGxzIHRoYXQgY2FuIGJlIG1hZGUuXG5cdCAqL1xuXHRtZXRob2RzOiBIb3RSb3V0ZU1ldGhvZFtdO1xuXHQvKipcblx0ICogVGhlIGVycm9ycyBhbmQgdGhlaXIgSlNPTiB0aGF0IGNhbiBiZSB0aHJvd24uIENhbiBiZTpcblx0ICogKiBub3RfYXV0aG9yaXplZFxuXHQgKiAqIG5vX3NlcnZlcl9leGVjdXRlX2Z1bmN0aW9uXG5cdCAqL1xuXHRlcnJvcnM6IHsgW2Vycm9yOiBzdHJpbmddOiBhbnkgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50LCByb3V0ZTogc3RyaW5nLCBtZXRob2RzOiBIb3RSb3V0ZU1ldGhvZFtdID0gW10pXG5cdHtcblx0XHR0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXHRcdHRoaXMubG9nZ2VyID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uLnByb2Nlc3NvciAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLmxvZ2dlciA9IHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IubG9nZ2VyO1xuXHRcdH1cblxuXHRcdHRoaXMucm91dGUgPSByb3V0ZTtcblx0XHR0aGlzLmRlc2NyaXB0aW9uID0gXCJcIjtcblx0XHR0aGlzLm9wZW5BUEkgPSBudWxsO1xuXHRcdHRoaXMudmVyc2lvbiA9IFwidjFcIjtcblx0XHR0aGlzLnByZWZpeCA9IFwiXCI7XG5cdFx0dGhpcy5tZXRob2RzID0gbWV0aG9kcztcblx0XHR0aGlzLmVycm9ycyA9IHtcblx0XHRcdFx0XCJub3RfYXV0aG9yaXplZFwiOiBIb3RSb3V0ZS5jcmVhdGVFcnJvciAoXCJOb3QgYXV0aG9yaXplZC5cIiksXG5cdFx0XHRcdFwibm9fc2VydmVyX2V4ZWN1dGVfZnVuY3Rpb25cIjogSG90Um91dGUuY3JlYXRlRXJyb3IgKFwiTWlzc2luZyBzZXJ2ZXIgZXhlY3V0ZSBmdW5jdGlvbi5cIiwgNTAwKSxcblx0XHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIGFuIGVycm9yIEpTT04gb2JqZWN0LlxuXHQgKi9cblx0c3RhdGljIGNyZWF0ZUVycm9yIChtZXNzYWdlOiBzdHJpbmcsIGVycm9yQ29kZTogbnVtYmVyID0gNDAwKTogYW55XG5cdHtcblx0XHRyZXR1cm4gKHsgZXJyb3I6IG1lc3NhZ2UsIGVycm9yQ29kZTogZXJyb3JDb2RlIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbiBBUEkgbWV0aG9kIHRvIHRoaXMgcm91dGUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbWV0aG9kIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gYWRkLiBJZiBhIEhvdFJvdXRlTWV0aG9kIGlzIHN1cHBsaWVkLCB0aGUgXG5cdCAqIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBzdXBwbGllZCB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqL1xuXHRhZGRNZXRob2QgKFxuXHRcdG1ldGhvZDogSG90Um91dGVNZXRob2QgfCBJSG90Um91dGVNZXRob2QgfCBzdHJpbmcsXG5cdFx0ZXhlY3V0ZUZ1bmN0aW9uOiBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiA9IG51bGwsXG5cdFx0dHlwZTogSG90RXZlbnRNZXRob2QgPSBIb3RFdmVudE1ldGhvZC5QT1NULFxuXHRcdHRlc3RDYXNlczogKHN0cmluZyB8IFRlc3RDYXNlRnVuY3Rpb24pW10gfCBUZXN0Q2FzZUZ1bmN0aW9uW10gfCBUZXN0Q2FzZU9iamVjdFtdID0gbnVsbFxuXHRcdCk6IEhvdFJvdXRlTWV0aG9kIHwgSUhvdFJvdXRlTWV0aG9kXG5cdHtcblx0XHRpZiAodHlwZW9mIChtZXRob2QpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0bWV0aG9kID0gSG90Um91dGVNZXRob2QuY3JlYXRlICh0aGlzLCBtZXRob2QsIGV4ZWN1dGVGdW5jdGlvbiwgdHlwZSwgbnVsbCwgbnVsbCwgdGVzdENhc2VzKTtcblxuXHRcdGlmIChtZXRob2QgaW5zdGFuY2VvZiBIb3RSb3V0ZU1ldGhvZClcblx0XHRcdHRoaXMubWV0aG9kcy5wdXNoIChtZXRob2QpO1xuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAobWV0aG9kLnJvdXRlID09IG51bGwpXG5cdFx0XHRcdG1ldGhvZC5yb3V0ZSA9IHRoaXM7XG5cblx0XHRcdG1ldGhvZCA9IEhvdFJvdXRlTWV0aG9kLmNyZWF0ZSAobWV0aG9kKTtcblx0XHRcdHRoaXMubWV0aG9kcy5wdXNoICgoPEhvdFJvdXRlTWV0aG9kPm1ldGhvZCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiAobWV0aG9kKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSBtZXRob2QgYnkgaXQncyBuYW1lLlxuXHQgKi9cblx0Z2V0TWV0aG9kIChuYW1lOiBzdHJpbmcpOiBIb3RSb3V0ZU1ldGhvZFxuXHR7XG5cdFx0bGV0IGZvdW5kTWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IG51bGw7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMubWV0aG9kcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IHRoaXMubWV0aG9kc1tpSWR4XTtcblxuXHRcdFx0aWYgKG1ldGhvZC5uYW1lID09PSBuYW1lKVxuXHRcdFx0e1xuXHRcdFx0XHRmb3VuZE1ldGhvZCA9IG1ldGhvZDtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKGZvdW5kTWV0aG9kKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBiZWZvcmUgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4gPSBudWxsO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBmaXJzdCByZWdpc3RlcmluZyB0aGlzIHJvdXRlIHdpdGggRXhwcmVzcy4gSWYgXG5cdCAqIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvdXRlIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+ID0gbnVsbDtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGFmdGVyIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblBvc3RSZWdpc3RlcjogKCkgPT4gUHJvbWlzZTx2b2lkPiA9IG51bGw7XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gYXV0aG9yaXppbmcgYSBjYWxsZWQgbWV0aG9kLlxuXHQgKiBUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBoZXJlIHdpbGwgYmUgcGFzc2VkIHRvIG9uRXhlY3V0ZSBpbiB0aGUgXG5cdCAqIGNhbGxlZCBIb3RSb3V0ZU1ldGhvZC4gVW5kZWZpbmVkIHJldHVybmluZyBmcm9tIGhlcmUgd2lsbCBtZWFuIFxuXHQgKiB0aGUgYXV0aG9yaXphdGlvbiBmYWlsZWQuXG5cdCAqL1xuXHRvbkF1dGhvcml6ZVVzZXI6IChyZXE6IFNlcnZlclJlcXVlc3QpID0+IFByb21pc2U8YW55PiA9IG51bGw7XG59IiwiaW1wb3J0IHsgRGV2ZWxvcGVyTW9kZSB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFNlcnZlciwgSG90U2VydmVyVHlwZSB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuXG5pbXBvcnQgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHsgSG90V2ViU29ja2V0U2VydmVyQ2xpZW50IH0gZnJvbSBcIi4vSG90V2ViU29ja2V0U2VydmVyQ2xpZW50XCI7XG5cbi8qKlxuICogVGhlIGF2YWlsYWJsZSBldmVudCBtZXRob2RzLlxuICovXG5leHBvcnQgZW51bSBIb3RFdmVudE1ldGhvZFxue1xuXHQvKipcblx0ICogQSBIVFRQIEdFVCByZXF1ZXN0LlxuXHQgKi9cblx0R0VUID0gXCJnZXRcIixcblx0LyoqXG5cdCAqIEEgSFRUUCBQT1NUIHJlcXVlc3QuXG5cdCAqL1xuXHRQT1NUID0gXCJwb3N0XCIsXG5cdC8qKlxuXHQgKiBUaGlzIHdpbGwgdXBsb2FkIGEgZmlsZSwgdGhlbiBwb3N0IHRoZSBqc29uIHJlcXVlc3QgYWZ0ZXJ3YXJkcy5cblx0ICovXG5cdEZJTEVfVVBMT0FEID0gXCJmaWxlX3VwbG9hZF90aGVuX3Bvc3RfanNvblwiLFxuXHQvKipcblx0ICogQSB3ZWJzb2NrZXQgZXZlbnQuXG5cdCAqL1xuXHRXRUJTT0NLRVRfQ0xJRU5UX1BVQl9FVkVOVCA9IFwid2Vic29ja2V0X2NsaWVudF9wdWJfZXZlbnRcIixcblx0LyoqXG5cdCAqIEhhbmRsZXMgYm90aCBhIEhUVFAgUE9TVCB3ZWJzb2NrZXQgZXZlbnQgcmVxdWVzdHMuXG5cdCAqL1xuXHRQT1NUX0FORF9XRUJTT0NLRVRfQ0xJRU5UX1BVQl9FVkVOVCA9IFwicG9zdF9hbmRfd2Vic29ja2V0X2NsaWVudF9wdWJfZXZlbnRcIlxufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHRoYXQgY2FtZSBmcm9tIGEgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTZXJ2ZXJSZXF1ZXN0XG57XG5cdC8qKlxuXHQgKiBUaGUgZXhwcmVzcyByZXF1ZXN0IHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gV2lsbCBiZSBzZXQgdG8gbnVsbCBpZiB1c2luZyB3b3JrZXIgXG5cdCAqIHRocmVhZHMgb3IgaWYgdGhpcyByZXF1ZXN0IHdhcyByZWNlaXZlZCBmcm9tIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRyZXE/OiBleHByZXNzLlJlcXVlc3Q7XG5cdC8qKlxuXHQgKiBUaGUgZXhwcmVzcyByZXNwb25zZSB0byBzZW5kIHRvIHRoZSBjbGllbnQuIFdpbGwgYmUgc2V0IHRvIG51bGwgaWYgdXNpbmcgd29ya2VyIFxuXHQgKiB0aHJlYWRzIG9yIGlmIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgZnJvbSBhIHdlYnNvY2tldCBjb25uZWN0aW9uLlxuXHQgKi9cblx0cmVzPzogZXhwcmVzcy5SZXNwb25zZTtcblx0LyoqXG5cdCAqIFRoZSBiZWFyZXIgdG9rZW4gYmVpbmcgcHJlc2VudGVkIGZyb20gdGhlIGNsaWVudCByZXF1ZXN0aW5nIGFjY2Vzcy5cblx0ICovXG5cdGJlYXJlclRva2VuPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNsaWVudCB3ZWJzb2NrZXQgdGhhdCB3YXMgdXNlZCB0byBzZW5kIHRoZSBtZXNzYWdlLiBXaWxsIGJlIHNldCB0byBudWxsIGlmIHVzaW5nIHdvcmtlciBcblx0ICogdGhyZWFkcyBvciBpZiB0aGlzIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIGZyb20gYSBIVFRQIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHR3c1NvY2tldD86IEhvdFdlYlNvY2tldFNlcnZlckNsaWVudDtcblx0LyoqXG5cdCAqIFRoZSByZXNwb25zZSByZWNlaXZlZCBmcm9tIHN1Y2Vzc2Z1bGx5IGF1dGhvcml6aW5nIGEgY2xpZW50LiBDYW4gYmUgYSBKV1QgdG9rZW4sIGFwaSBrZXksIGV0Yy5cblx0ICogV2lsbCBiZSBudWxsIGlmIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgZnJvbSBhIHdlYnNvY2tldCBjb25uZWN0aW9uLlxuXHQgKiBETyBOT1QgU1RPUkUgU0VOU0lUSVZFIElORk9STUFUSU9OIEhFUkUgU1VDSCBBUyBQQVNTV09SRFMuXG5cdCAqL1xuXHRhdXRob3JpemVkVmFsdWU/OiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgSlNPTiByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQuXG5cdCAqL1xuXHRqc29uT2JqPzogYW55O1xuXHQvKipcblx0ICogQW55IHF1ZXJ5IHZhcmlhYmxlcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQuIFdpbGwgYmUgbnVsbCBpZiB0aGlzIHJlcXVlc3Qgd2FzIFxuXHQgKiByZWNlaXZlZCBmcm9tIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRxdWVyeU9iaj86IGFueTtcblx0LyoqXG5cdCAqIEFueSBmaWxlcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQuIFdpbGwgYmUgbnVsbCBpZiBubyBmaWxlcyB3ZXJlIHNlbnQuXG5cdCAqIE9uY2UgYSBmaWxlIGlzIHVwbG9hZGVkLCB5b3UgY2FuIGFjY2VzcyBpdCBhdCB0aGUgdGVtcG9yYXJ5IHBhdGggZm91bmQgaW46IFxuXHQgKiBmaWxlc1t1cGxvYWRJZF0ucGF0aFxuXHQgKi9cblx0ZmlsZXM/OiB7XG5cdFx0W2tleTogc3RyaW5nXToge1xuXHRcdFx0bmFtZTogc3RyaW5nO1xuXHRcdFx0c2l6ZTogbnVtYmVyO1xuXHRcdFx0cGF0aDogc3RyaW5nO1xuXHRcdH1cblx0fTtcbn1cblxuLyoqXG4gKiBIb3cgZGF0YSBzaG91bGQgYmUgcGFzc2VkIHRocm91Z2ggdGhlIHNlcnZlciBleGVjdXRlIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBlbnVtIFBhc3NUeXBlXG57XG5cdC8qKlxuXHQgKiBBbnkgZGF0YSBzZXQgaW4ganNvbk9iaiB3aWxsIGltbWVkaWF0ZWx5IGJlIHBhc3NlZCB0byB0aGUgY2xpZW50IHdoZW4gXG5cdCAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucy5cblx0ICovXG5cdFJldHVyblRvQ2xpZW50LFxuXHQvKipcblx0ICogQW55IGRhdGEgYmVpbmcgc2V0IGluIGpzb25PYmogd2lsbCBiZSBwYXNzZWQgdG8gdGhlIG5leHQgc3RlcCBhZnRlciBcblx0ICogdGhpcyBmdW5jdGlvbiByZXR1cm5zLlxuXHQgKi9cblx0VXBkYXRlLFxuXHQvKipcblx0ICogSWdub3JlIGFueSBkYXRhIHNldCBpbiBqc29uT2JqLlxuXHQgKi9cblx0SWdub3JlXG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3QgdGhhdCBjYW1lIGZyb20gYSBjbGllbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJSZXF1ZXN0IGltcGxlbWVudHMgSVNlcnZlclJlcXVlc3Rcbntcblx0LyoqXG5cdCAqIFRoZSBleHByZXNzIHJlcXVlc3QgcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50LiBXaWxsIGJlIHNldCB0byBudWxsIGlmIHVzaW5nIHdvcmtlciBcblx0ICogdGhyZWFkcyBvciBpZiB0aGlzIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIGZyb20gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbi5cblx0ICovXG5cdHJlcTogZXhwcmVzcy5SZXF1ZXN0O1xuXHQvKipcblx0ICogVGhlIGV4cHJlc3MgcmVzcG9uc2UgdG8gc2VuZCB0byB0aGUgY2xpZW50LiBXaWxsIGJlIHNldCB0byBudWxsIGlmIHVzaW5nIHdvcmtlciBcblx0ICogdGhyZWFkcyBvciBpZiB0aGlzIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIGZyb20gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbi5cblx0ICovXG5cdHJlczogZXhwcmVzcy5SZXNwb25zZTtcblx0LyoqXG5cdCAqIFRoZSBiZWFyZXIgdG9rZW4gYmVpbmcgcHJlc2VudGVkIGZyb20gdGhlIGNsaWVudCByZXF1ZXN0aW5nIGFjY2Vzcy5cblx0ICovXG5cdGJlYXJlclRva2VuOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY2xpZW50IHdlYnNvY2tldCB0aGF0IHdhcyB1c2VkIHRvIHNlbmQgdGhlIG1lc3NhZ2UuIFdpbGwgYmUgc2V0IHRvIG51bGwgaWYgdXNpbmcgd29ya2VyIFxuXHQgKiB0aHJlYWRzIG9yIGlmIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgZnJvbSBhIEhUVFAgY29ubmVjdGlvbi5cblx0ICovXG5cdHdzU29ja2V0OiBIb3RXZWJTb2NrZXRTZXJ2ZXJDbGllbnQ7XG5cdC8qKlxuXHQgKiBUaGUgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBzdWNlc3NmdWxseSBhdXRob3JpemluZyBhIGNsaWVudC4gQ2FuIGJlIGEgSldUIHRva2VuLCBhcGkga2V5LCBldGMuXG5cdCAqIFdpbGwgYmUgbnVsbCBpZiB0aGlzIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIGZyb20gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbi5cblx0ICogRE8gTk9UIFNUT1JFIFNFTlNJVElWRSBJTkZPUk1BVElPTiBIRVJFIFNVQ0ggQVMgUEFTU1dPUkRTLlxuXHQgKi9cblx0YXV0aG9yaXplZFZhbHVlOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgSlNPTiBvYmplY3QgcmVjZWl2ZWQgZnJvbSBlaXRoZXIgb25TZXJ2ZXJQcmVFeGVjdXRlIG9yIG9uU2VydmVyRXhlY3V0ZS4gSWYgXG5cdCAqIHJldHVyblRvQ2xpZW50IGlzIHNldCB0byB0cnVlLCBvblNlcnZlckV4ZWN1dGUgd2lsbCBub3QgYmUgY2FsbGVkIGFuZCB0aGUgZGF0YSBcblx0ICogcmV0dXJuZWQgZnJvbSBvblNlcnZlclByZUV4ZWN1dGUgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgaW5zdGVhZC4gSWYgcmV0dXJuVG9DbGllbnQgXG5cdCAqIGlzIHNldCB0byBlaXRoZXIgZmFsc2Ugb3IgdW5kZWZpbmVkLCBvblNlcnZlckV4ZWN1dGUgd2lsbCBiZSBjYWxsZWQgYW5kIHRoZSBkYXRhIFxuXHQgKiB3aWxsIGJlIHBhc3NlZCB0byBvblNlcnZlckV4ZWN1dGUgaW4gcGFzc09iamVjdC5qc29uT2JqLlxuXHQgKi9cblx0cGFzc09iamVjdDogeyBwYXNzVHlwZTogUGFzc1R5cGU7IGpzb25PYmo6IGFueTsgfTtcblx0LyoqXG5cdCAqIFRoZSBKU09OIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC5cblx0ICovXG5cdGpzb25PYmo6IGFueTtcblx0LyoqXG5cdCAqIEFueSBxdWVyeSB2YXJpYWJsZXMgcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50LiBUaGUgb2JqZWN0IHdpbGwgYmUgaW4ga2V5L3ZhbHVlIHBhaXIuXG5cdCAqIFxuXHQgKiAqKkhUVFAgRXhhbXBsZSoqXG5cdCAqIFxuXHQgKiBJbiB0aGUgd2ViIGJyb3dzZXIsIHRoZSBjbGllbnQgc2VuZHMgdGhlIGZvbGxvd2luZyBxdWVyeTpcblx0ICogYGBganNcblx0ICogZmV0Y2ggKFwiaHR0cDovL2xvY2FsaG9zdDozMDAwP25hbWU9Sm9obiZhZ2U9MzBcIik7XG5cdCAqIGBgYFxuXHQgKiBcblx0ICogSW4gdGhlIHNlcnZlciwgdGhlIHF1ZXJ5IHdpbGwgYmUgcmVjZWl2ZWQgYXM6XG5cdCAqIGBgYGpzb25cblx0ICoge1xuXHQgKiBcdFx0XCJuYW1lXCI6IFwiSm9oblwiLFxuXHQgKiBcdFx0XCJhZ2VcIjogMzBcblx0ICogfVxuXHQgKiBgYGBcblx0ICogXG5cdCAqICoqV2ViU29ja2V0IEV4YW1wbGUqKlxuXHQgKiBcblx0ICogSW4gdGhlIHdlYiBicm93c2VyLCB0aGUgY2xpZW50IGluaXRpYXRlcyBhIHNvY2tldC5pbyBjb25uZWN0aW9uIGFuZCBcblx0ICogc2VuZHMgdGhlIGZvbGxvd2luZyBxdWVyeTpcblx0ICogYGBganNcblx0ICogbGV0IGNsaWVudCA9IGlvIChcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCB7XG5cdCAqIFx0XHRcdHF1ZXJ5OiB7XG5cdCAqIFx0XHRcdFx0bmFtZTogXCJKb2huXCIsXG5cdCAqIFx0XHRcdFx0YWdlOiAzMFxuXHQgKiBcdFx0XHR9XG5cdCAqIFx0XHR9KTtcblx0ICogYGBgXG5cdCAqIFxuXHQgKiBJbiB0aGUgc2VydmVyLCB0aGUgcXVlcnkgd2lsbCBiZSByZWNlaXZlZCBhczpcblx0ICogYGBganNvblxuXHQgKiB7XG5cdCAqIFx0XHRcIm5hbWVcIjogXCJKb2huXCIsXG5cdCAqIFx0XHRcImFnZVwiOiAzMFxuXHQgKiB9XG5cdCAqIGBgYFxuXHQgKi9cblx0cXVlcnlPYmo6IGFueTtcblx0LyoqXG5cdCAqIEFueSBmaWxlcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQuIFdpbGwgYmUgbnVsbCBpZiBubyBmaWxlcyB3ZXJlIHNlbnQuXG5cdCAqIE9uY2UgYSBmaWxlIGlzIHVwbG9hZGVkLCB5b3UgY2FuIGFjY2VzcyBpdCBhdCB0aGUgdGVtcG9yYXJ5IHBhdGggZm91bmQgaW46IFxuXHQgKiBmaWxlc1t1cGxvYWRJZF0ucGF0aFxuXHQgKi9cblx0ZmlsZXM6IHtcblx0XHRba2V5OiBzdHJpbmddOiB7XG5cdFx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0XHRzaXplOiBudW1iZXI7XG5cdFx0XHRwYXRoOiBzdHJpbmc7XG5cdFx0fVxuXHR9O1xuXG5cdGNvbnN0cnVjdG9yIChvYmo6IElTZXJ2ZXJSZXF1ZXN0ID0gbnVsbClcblx0e1xuXHRcdGlmIChvYmogPT0gbnVsbClcblx0XHRcdG9iaiA9IHt9O1xuXG5cdFx0dGhpcy5yZXEgPSBvYmoucmVxIHx8IG51bGw7XG5cdFx0dGhpcy5yZXMgPSBvYmoucmVzIHx8IG51bGw7XG5cdFx0dGhpcy5iZWFyZXJUb2tlbiA9IG9iai5iZWFyZXJUb2tlbiB8fCBcIlwiO1xuXHRcdHRoaXMud3NTb2NrZXQgPSBvYmoud3NTb2NrZXQgfHwgbnVsbDtcblx0XHR0aGlzLmF1dGhvcml6ZWRWYWx1ZSA9IG9iai5hdXRob3JpemVkVmFsdWUgfHwgbnVsbDtcblx0XHR0aGlzLmpzb25PYmogPSBvYmouanNvbk9iaiB8fCBudWxsO1xuXHRcdHRoaXMucXVlcnlPYmogPSBvYmoucXVlcnlPYmogfHwgbnVsbDtcblx0XHR0aGlzLmZpbGVzID0gb2JqLmZpbGVzIHx8IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgc2VydmVyIHdoZW4gZmlyc3QgcmVnaXN0ZXJpbmcgd2l0aCBFeHByZXNzLlxuICogSWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGlzIHJvdXRlIG1ldGhvZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgdHlwZSBTZXJ2ZXJSZWdpc3RyYXRpb25GdW5jdGlvbiA9ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uID0gKHJlcXVlc3Q6IFNlcnZlclJlcXVlc3QpID0+IFByb21pc2U8YW55Pjtcbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgdGhlIGNsaWVudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2xpZW50RXhlY3V0aW9uRnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8YW55Pjtcbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgdGhlIHNlcnZlciBmb3IgYXV0aG9yaXphdGlvbi4gQW55IHZhbHVlIFxuICogcmV0dXJuZWQgZnJvbSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbi5cbiAqIElmIGFuIHVuZGVmaW5lZCB2YWx1ZSBpcyByZXR1cm5lZCwgdGhpcyBpbmRpY2F0ZXMgdGhlIHNlcnZlciB3YXMgbm90IGFibGUgXG4gKiB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIsIHNvIHRoZSBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiB3aWxsIG5vdCBiZSBcbiAqIGV4ZWN1dGVkLlxuICovXG5leHBvcnQgdHlwZSBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24gPSAocmVxdWVzdDogU2VydmVyUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuLyoqXG4gKiBUaGUgdGVzdCBjYXNlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKi9cbmV4cG9ydCB0eXBlIFRlc3RDYXNlRnVuY3Rpb24gPSAoKGRyaXZlcjogSG90VGVzdERyaXZlcikgPT4gUHJvbWlzZTxhbnk+KSB8ICgoZHJpdmVyOiBIb3RUZXN0RHJpdmVyKSA9PiBhbnkpO1xuLyoqXG4gKiBUaGUgdGVzdCBjYXNlIG9iamVjdCB0byBwYXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RDYXNlT2JqZWN0XG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG5cdCAqL1xuXHRmdW5jOiBUZXN0Q2FzZUZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEEgbWV0aG9kIHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlclxue1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgcGFyYW1ldGVyLiBEZWZhdWx0OiBzdHJpbmdcblx0ICogQ2FuIGJlOlxuXHQgKiAqIHN0cmluZ1xuXHQgKiAqIGludGVnZXJcblx0ICogKiBudW1iZXJcblx0ICogKiBib29sZWFuXG5cdCAqICogYXJyYXlcblx0ICogKiBvYmplY3Rcblx0ICovXG5cdHR5cGU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgaXRlbSB0eXBlIGluIHRoZSBhcnJheS5cblx0ICogXG5cdCAqIEB0b2RvIFRoaXMgY2Fubm90IGdlbmVyYXRlIG9iamVjdHMgb3IgbmVzdGVkIG9iamVjdHMgeWV0IDovXG5cdCAqL1xuXHRpdGVtcz86IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXIuIERlZmF1bHQ6IFwiXCJcblx0ICovXG5cdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHQvKipcblx0ICogQWRkaXRpb25hbCBPcGVuQVBJIGluZm9ybWF0aW9uLiBBbnl0aGluZyBhZGRlZCBoZXJlIHdpbGwgYmUgYXV0b21lcmdlZCBpbi5cblx0ICovXG5cdG9wZW5BUEk/OiBhbnk7XG5cdC8qKlxuXHQgKiBJcyB0aGlzIHBhcmFtZXRlciByZXF1aXJlZD8gRGVmYXVsdDogZmFsc2Vcblx0ICovXG5cdHJlcXVpcmVkPzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIElzIHRoaXMgcGFyYW1ldGVyIHJlYWQgb25seT8gRGVmYXVsdDogZmFsc2Vcblx0ICovXG5cdHJlYWRPbmx5PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSBwYXJhbWV0ZXJzIGluIHRoZSBvYmplY3QuIElmIHVzaW5nIHRoZSBmdW5jdGlvbiwgdGhlIGZ1bmN0aW9uIFxuXHQgKiB3aWxsIG9ubHkgZXhlY3V0ZSBpZiB0aGUgYXBwbGljYXRpb24ncyBjb25uZWN0aW9uIHR5cGUgaXMgc2V0IHRvIGdlbmVyYXRpb24uXG5cdCAqL1xuXHRwYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogKHN0cmluZyB8IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyIHwgKCgpID0+IFByb21pc2U8SG90Um91dGVNZXRob2RQYXJhbWV0ZXI+KSk7IH07XG59XG5cbi8qKlxuICogQW4gQVBJIG1ldGhvZCB0byBtYWtlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RSb3V0ZU1ldGhvZFxue1xuXHQvKipcblx0ICogVGhlIHBhcmVudCByb3V0ZS5cblx0ICovXG5cdHJvdXRlPzogSG90Um91dGU7XG5cdC8qKlxuXHQgKiBUaGUgYXBpIGNhbGwgbmFtZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHQvKipcblx0ICogQWRkaXRpb25hbCBPcGVuQVBJIGluZm9ybWF0aW9uLiBBbnl0aGluZyBhZGRlZCBoZXJlIHdpbGwgYmUgYXV0b21lcmdlZCBpbi5cblx0ICovXG5cdG9wZW5BUEk/OiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgdGFncyBmb3IgdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHR0YWdzPzogc3RyaW5nW107XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2Ygd2hhdCByZXR1cm5zIGZyb20gdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHRyZXR1cm5zPzogc3RyaW5nIHwgSG90Um91dGVNZXRob2RQYXJhbWV0ZXIgfCAoKCkgPT4gUHJvbWlzZTxIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcj4pO1xuXHQvKipcblx0ICogVGhlIHJlZmVyZW5jZSBuYW1lIGZvciB0aGUgcGFyYW1ldGVycyB3aGVuIGdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbi5cblx0ICogVGhpcyBpcyBzbyB0aGUgZ2VuZXJhdGVkIGNvbXBvbmVudHMgYWxsIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzLlxuXHQgKi9cblx0cGFyYW1ldGVyc1JlZk5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGFyYW1ldGVycyBpbiB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdHBhcmFtZXRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlciB8ICgoKSA9PiBQcm9taXNlPEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyPik7IH07XG5cdC8qKlxuXHQgKiBUaGUgcXVlcnkgcGFyYW1ldGVycyB1c2VkIGluIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0cXVlcnlQYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogSG90Um91dGVNZXRob2RQYXJhbWV0ZXIgfCAoKCkgPT4gUHJvbWlzZTxIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcj4pOyB9O1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHR0eXBlPzogSG90RXZlbnRNZXRob2Q7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBjYXNlIG9iamVjdHMgdG8gZXhlY3V0ZSBkdXJpbmcgdGVzdHMuXG5cdCAqL1xuXHR0ZXN0Q2FzZXM/OiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXTogVGVzdENhc2VPYmplY3Q7XG5cdFx0fSB8IChzdHJpbmcgfCBUZXN0Q2FzZUZ1bmN0aW9uKVtdIHwgVGVzdENhc2VGdW5jdGlvbltdIHwgVGVzdENhc2VPYmplY3RbXTtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGJlZm9yZSBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25QcmVSZWdpc3Rlcj86ICgpID0+IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGZpcnN0IHJlZ2lzdGVyaW5nIHRoaXMgbWV0aG9kIHdpdGggRXhwcmVzcy4gSWYgXG5cdCAqIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIG1ldGhvZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25SZWdpc3Rlcj86IFNlcnZlclJlZ2lzdHJhdGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgYWZ0ZXIgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUG9zdFJlZ2lzdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBhdXRob3JpemluZyBhIGNhbGxlZCBtZXRob2QuIElmIHRoaXMgbWV0aG9kIFxuXHQgKiBpcyBzZXQsIHRoaXMgd2lsbCBub3QgY2FsbCBvbkF1dGhvcml6ZSBmb3IgdGhlIHBhcmVudCBIb3RSb3V0ZS5cblx0ICogVGhlIHZhbHVlIHJldHVybmVkIGZyb20gaGVyZSB3aWxsIGJlIHBhc3NlZCB0byBvbkV4ZWN1dGUuIFxuXHQgKiBVbmRlZmluZWQgcmV0dXJuaW5nIGZyb20gaGVyZSB3aWxsIG1lYW4gdGhlIGF1dGhvcml6YXRpb24gZmFpbGVkLlxuXHQgKiBJZiBhbnkgZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20gdGhpcyBmdW5jdGlvbiwgdGhleSB3aWxsIGJlIHNlbnQgXG5cdCAqIHRvIHRoZSBzZXJ2ZXIgYXMgYW4geyBlcnJvcjogc3RyaW5nOyB9IG9iamVjdCB3aXRoIHRoZSBleGNlcHRpb24gXG5cdCAqIG1lc3NhZ2UgYXMgdGhlIGVycm9yLlxuXHQgKiBcblx0ICogQ3VycmVudGx5IHRoaXMgaGFzIG5vIGVmZmVjdCB3aGVuIHVzaW5nIHdlYnNvY2tldHMuXG5cdCAqL1xuXHRvblNlcnZlckF1dGhvcml6ZT86IFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBleGVjdXRpbmcgYSBjYWxsZWQgbWV0aG9kIGZyb20gdGhlIHNlcnZlciBzaWRlLiBcblx0ICogVGhpcyB3aWxsIHN0cmluZ2lmeSBhbnkgSlNPTiBvYmplY3QgYW5kIHNlbmQgaXQgYXMgYSBKU09OIHJlc3BvbnNlLiBcblx0ICogSWYgdW5kZWZpbmVkIGlzIHJldHVybmVkIG5vIHJlc3BvbnNlIHdpbGwgYmUgc2VudCB0byB0aGUgc2VydmVyLiBcblx0ICogU28gdGhlIGRldmVsb3BlciB3b3VsZCBoYXZlIHRvIHNlbmQgYSByZXNwb25zZSB1c2luZyBcInJlc1wiLlxuXHQgKiBJZiBhbnkgZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20gdGhpcyBmdW5jdGlvbiwgdGhleSB3aWxsIGJlIHNlbnQgXG5cdCAqIHRvIHRoZSBzZXJ2ZXIgYXMgYW4geyBlcnJvcjogc3RyaW5nOyB9IG9iamVjdCB3aXRoIHRoZSBleGNlcHRpb24gXG5cdCAqIG1lc3NhZ2UgYXMgdGhlIGVycm9yLlxuXHQgKi9cblx0b25TZXJ2ZXJFeGVjdXRlPzogU2VydmVyRXhlY3V0aW9uRnVuY3Rpb247XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGV4ZWN1dGluZyBhIGNhbGxlZCBtZXRob2QgZnJvbSB0aGUgY2xpZW50IHNpZGUuXG5cdCAqIEBmaXhtZSBJcyB0aGlzIG5lY2Vzc2FyeT9cblx0ICovXG5cdG9uQ2xpZW50RXhlY3V0ZT86IENsaWVudEV4ZWN1dGlvbkZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEFuIEFQSSBtZXRob2QgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFJvdXRlTWV0aG9kIGltcGxlbWVudHMgSUhvdFJvdXRlTWV0aG9kXG57XG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHJvdXRlLlxuXHQgKi9cblx0cm91dGU6IEhvdFJvdXRlO1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHRkZXNjcmlwdGlvbjogc3RyaW5nO1xuXHQvKipcblx0ICogQWRkaXRpb25hbCBPcGVuQVBJIGluZm9ybWF0aW9uLiBBbnl0aGluZyBhZGRlZCBoZXJlIHdpbGwgYmUgYXV0b21lcmdlZCBpbi5cblx0ICovXG5cdG9wZW5BUEk6IGFueTtcblx0LyoqXG5cdCAqIFRoZSB0YWdzIGZvciB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdHRhZ3M6IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHdoYXQgcmV0dXJucyBmcm9tIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0cmV0dXJuczogSG90Um91dGVNZXRob2RQYXJhbWV0ZXIgfCAoKCkgPT4gUHJvbWlzZTxIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcj4pO1xuXHQvKipcblx0ICogVGhlIHJlZmVyZW5jZSBuYW1lIGZvciB0aGUgcGFyYW1ldGVycyB3aGVuIGdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbi5cblx0ICogVGhpcyBpcyBzbyB0aGUgZ2VuZXJhdGVkIGNvbXBvbmVudHMgYWxsIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzLlxuXHQgKi9cblx0cGFyYW1ldGVyc1JlZk5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXJhbWV0ZXJzIGluIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0cGFyYW1ldGVyczogeyBbbmFtZTogc3RyaW5nXTogSG90Um91dGVNZXRob2RQYXJhbWV0ZXIgfCAoKCkgPT4gUHJvbWlzZTxIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcj4pOyB9O1xuXHQvKipcblx0ICogVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdXNlZCBpbiB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdHF1ZXJ5UGFyYW1ldGVyczogeyBbbmFtZTogc3RyaW5nXTogSG90Um91dGVNZXRob2RQYXJhbWV0ZXIgfCAoKCkgPT4gUHJvbWlzZTxIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcj4pOyB9O1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHR0eXBlOiBIb3RFdmVudE1ldGhvZDtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIG1ldGhvZCBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2VydmVyPyBUaGlzIFxuXHQgKiBwcmV2ZW50cyB0aGUgbWV0aG9kIGZyb20gYmVpbmcgcmVyZWdpc3RlcmVkLlxuXHQgKi9cblx0aXNSZWdpc3RlcmVkOiBib29sZWFuO1xuXHQvKipcblx0ICogSGFzIHRoaXMgbWV0aG9kIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZXJ2ZXI/IFRoaXMgXG5cdCAqIHByZXZlbnRzIHRoZSBtZXRob2QgZnJvbSBiZWluZyByZXJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRleGVjdXRlU2V0dXA6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBjYXNlIG9iamVjdHMgdG8gZXhlY3V0ZSBkdXJpbmcgdGVzdHMuXG5cdCAqL1xuXHR0ZXN0Q2FzZXM6IHtcblx0XHRcdFtuYW1lOiBzdHJpbmddOiBUZXN0Q2FzZU9iamVjdDtcblx0XHR9O1xuXHQvKipcblx0ICogRXhlY3V0ZXMgYmVmb3JlIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblByZVJlZ2lzdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZmlyc3QgcmVnaXN0ZXJpbmcgdGhpcyBtZXRob2Qgd2l0aCBFeHByZXNzLiBJZiBcblx0ICogdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgbWV0aG9kIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblJlZ2lzdGVyPzogU2VydmVyUmVnaXN0cmF0aW9uRnVuY3Rpb247XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhZnRlciBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25Qb3N0UmVnaXN0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGF1dGhvcml6aW5nIGEgY2FsbGVkIG1ldGhvZC4gSWYgdGhpcyBtZXRob2QgXG5cdCAqIGlzIHNldCwgdGhpcyB3aWxsIG5vdCBjYWxsIG9uQXV0aG9yaXplIGZvciB0aGUgcGFyZW50IEhvdFJvdXRlLlxuXHQgKiBUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBoZXJlIHdpbGwgYmUgcGFzc2VkIHRvIG9uU2VydmVyRXhlY3V0ZS4gXG5cdCAqIFVuZGVmaW5lZCByZXR1cm5pbmcgZnJvbSBoZXJlIHdpbGwgbWVhbiB0aGUgYXV0aG9yaXphdGlvbiBmYWlsZWQuXG5cdCAqIElmIGFueSBleGNlcHRpb25zIGFyZSB0aHJvd24gZnJvbSB0aGlzIGZ1bmN0aW9uLCB0aGV5IHdpbGwgYmUgc2VudCBcblx0ICogdG8gdGhlIGNsaWVudCBhcyBhbiB7IGVycm9yOiBzdHJpbmc7IH0gb2JqZWN0IHdpdGggdGhlIGV4Y2VwdGlvbiBcblx0ICogbWVzc2FnZSBhcyB0aGUgZXJyb3IuXG5cdCAqL1xuXHRvblNlcnZlckF1dGhvcml6ZT86IFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgYmVmb3JlIGV4ZWN1dGluZyBvblNlcnZlckV4ZWN1dGUuIEFueXRoaW5nIHRoYXQgcmV0dXJucyBcblx0ICogZnJvbSB0aGlzIHdpbGwgYmUgcGFzc2VkIG9udG8gb25TZXJ2ZXJFeGVjdXRlIHZpYSByZXF1ZXN0LnByZXZpb3VzSnNvbk9iai5cblx0ICogQW55IGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCBpbiBcblx0ICogdGhlIGZvcm0gb2YgYW4gZXJyb3IgbWVzc2FnZSBvYmplY3QuXG5cdCAqL1xuXHRvblNlcnZlclByZUV4ZWN1dGU/OiBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZXhlY3V0aW5nIGEgY2FsbGVkIG1ldGhvZCBmcm9tIHRoZSBzZXJ2ZXIgc2lkZS4gXG5cdCAqIFRoaXMgd2lsbCBzdHJpbmdpZnkgYW55IEpTT04gb2JqZWN0IGFuZCBzZW5kIGl0IGFzIGEgSlNPTiByZXNwb25zZS4gXG5cdCAqIElmIHVuZGVmaW5lZCBpcyByZXR1cm5lZCBubyByZXNwb25zZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gXG5cdCAqIFNvIHRoZSBkZXZlbG9wZXIgd291bGQgaGF2ZSB0byBzZW5kIGEgcmVzcG9uc2UgdXNpbmcgXCJyZXNcIi5cblx0ICogSWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZXkgd2lsbCBiZSBzZW50IFxuXHQgKiB0byB0aGUgc2VydmVyIGFzIGFuIHsgZXJyb3I6IHN0cmluZzsgfSBvYmplY3Qgd2l0aCB0aGUgZXhjZXB0aW9uIFxuXHQgKiBtZXNzYWdlIGFzIHRoZSBlcnJvci5cblx0ICovXG5cdG9uU2VydmVyRXhlY3V0ZT86IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgYWZ0ZXIgZXhlY3V0aW5nIG9uU2VydmVyRXhlY3V0ZS4gSWYgdGhpcyByZXR1cm5zIGFueXRoaW5nIFxuXHQgKiBvdGhlciB0aGFuIHVuZGVmaW5lZCwgdGhlIHJlc3BvbnNlIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50LlxuXHQgKi9cblx0b25TZXJ2ZXJQb3N0RXhlY3V0ZT86IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBleGVjdXRpbmcgYSBjYWxsZWQgbWV0aG9kIGZyb20gdGhlIGNsaWVudCBzaWRlLlxuXHQgKiBAZml4bWUgSXMgdGhpcyBuZWNlc3Nhcnk/XG5cdCAqL1xuXHRvbkNsaWVudEV4ZWN1dGU/OiBDbGllbnRFeGVjdXRpb25GdW5jdGlvbjtcblxuXHRwcml2YXRlIGNvbnN0cnVjdG9yICgpXG5cdHtcblx0XHR0aGlzLnJvdXRlID0gbnVsbDtcblx0XHR0aGlzLm5hbWUgPSBcIlwiO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24gPSBcIlwiO1xuXHRcdHRoaXMub3BlbkFQSSA9IG51bGw7XG5cdFx0dGhpcy50YWdzID0gW107XG5cdFx0dGhpcy5yZXR1cm5zID0gbnVsbDtcblx0XHR0aGlzLnBhcmFtZXRlcnNSZWZOYW1lID0gXCJcIjtcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7fTtcblx0XHR0aGlzLnF1ZXJ5UGFyYW1ldGVycyA9IHt9O1xuXHRcdHRoaXMudHlwZSA9IEhvdEV2ZW50TWV0aG9kLlBPU1Q7XG5cdFx0dGhpcy5pc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblx0XHR0aGlzLmV4ZWN1dGVTZXR1cCA9IHRydWU7XG5cdFx0dGhpcy50ZXN0Q2FzZXMgPSB7fTtcblx0XHR0aGlzLm9uUHJlUmVnaXN0ZXIgPSBudWxsO1xuXHRcdHRoaXMub25SZWdpc3RlciA9IG51bGw7XG5cdFx0dGhpcy5vblBvc3RSZWdpc3RlciA9IG51bGw7XG5cblx0XHR0aGlzLm9uU2VydmVyQXV0aG9yaXplID0gbnVsbDtcblx0XHR0aGlzLm9uU2VydmVyRXhlY3V0ZSA9IG51bGw7XG5cdFx0dGhpcy5vbkNsaWVudEV4ZWN1dGUgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIG5ldyByb3V0ZSBtZXRob2QuXG5cdCAqL1xuXHRzdGF0aWMgY3JlYXRlIChyb3V0ZTogSG90Um91dGUgfCBJSG90Um91dGVNZXRob2QsIG5hbWU6IHN0cmluZyA9IFwiXCIsIFxuXHRcdFx0b25FeGVjdXRlOiBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiB8IENsaWVudEV4ZWN1dGlvbkZ1bmN0aW9uID0gbnVsbCwgXG5cdFx0XHR0eXBlOiBIb3RFdmVudE1ldGhvZCA9IEhvdEV2ZW50TWV0aG9kLlBPU1QsIG9uU2VydmVyQXV0aG9yaXplOiBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24gPSBudWxsLCBcblx0XHRcdG9uUmVnaXN0ZXI6IFNlcnZlclJlZ2lzdHJhdGlvbkZ1bmN0aW9uID0gbnVsbCwgXG5cdFx0XHR0ZXN0Q2FzZXM6IHsgW25hbWU6IHN0cmluZ106IFRlc3RDYXNlT2JqZWN0OyB9IHwgKHN0cmluZyB8IFRlc3RDYXNlRnVuY3Rpb24pW10gfCBUZXN0Q2FzZUZ1bmN0aW9uW10gfCBUZXN0Q2FzZU9iamVjdFtdID0gbnVsbFxuXHRcdCk6IEhvdFJvdXRlTWV0aG9kXG5cdHtcblx0XHRsZXQgbmV3TWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IG5ldyBIb3RSb3V0ZU1ldGhvZCAoKTtcblx0XHRsZXQgbmV3Um91dGU6IEhvdFJvdXRlID0gbnVsbDtcblxuXHRcdGlmIChyb3V0ZSBpbnN0YW5jZW9mIEhvdFJvdXRlKVxuXHRcdFx0bmV3Um91dGUgPSByb3V0ZTtcblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0bmV3Um91dGUgPSByb3V0ZS5yb3V0ZTtcblxuXHRcdFx0aWYgKHJvdXRlLnR5cGUgIT0gbnVsbClcblx0XHRcdFx0dHlwZSA9IHJvdXRlLnR5cGU7XG5cblx0XHRcdGlmIChyb3V0ZS5uYW1lICE9IG51bGwpXG5cdFx0XHRcdG5hbWUgPSByb3V0ZS5uYW1lO1xuXG5cdFx0XHRpZiAocm91dGUubmFtZSAhPSBudWxsKVxuXHRcdFx0XHRuZXdNZXRob2QudGFncyA9IHJvdXRlLnRhZ3M7XG5cblx0XHRcdGlmIChyb3V0ZS5kZXNjcmlwdGlvbiAhPSBudWxsKVxuXHRcdFx0XHRuZXdNZXRob2QuZGVzY3JpcHRpb24gPSByb3V0ZS5kZXNjcmlwdGlvbjtcblxuXHRcdFx0aWYgKHJvdXRlLm9wZW5BUEkgIT0gbnVsbClcblx0XHRcdFx0bmV3TWV0aG9kLm9wZW5BUEkgPSByb3V0ZS5vcGVuQVBJO1xuXG5cdFx0XHRpZiAocm91dGUucGFyYW1ldGVyc1JlZk5hbWUgIT0gbnVsbClcblx0XHRcdFx0bmV3TWV0aG9kLnBhcmFtZXRlcnNSZWZOYW1lID0gcm91dGUucGFyYW1ldGVyc1JlZk5hbWU7XG5cblx0XHRcdGlmIChyb3V0ZS5xdWVyeVBhcmFtZXRlcnMgIT0gbnVsbClcblx0XHRcdFx0bmV3TWV0aG9kLnF1ZXJ5UGFyYW1ldGVycyA9IHJvdXRlLnF1ZXJ5UGFyYW1ldGVycztcblxuXHRcdFx0aWYgKHJvdXRlLnJldHVybnMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKHR5cGVvZiAocm91dGUucmV0dXJucykgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuZXdNZXRob2QucmV0dXJucyA9IHtcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiByb3V0ZS5yZXR1cm5zXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiAocm91dGUucmV0dXJucykgPT09IFwiZnVuY3Rpb25cIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vLyBAZml4bWUgQ2FuJ3QgcnVuIGF3YWl0IGhlcmUgZm9yIG1hbnkgcmVhc29ucy4gYXdhaXQgaXMgcmVxdWlyZWQgXG5cdFx0XHRcdFx0Ly8vIHRvIGV4ZWN1dGUgSG90U3RhcS5jb252ZXJ0SW50ZXJmYWNlVG9Sb3V0ZVBhcmFtZXRlcnMuIEZpeCBsYXRlci4uLlxuXHRcdFx0XHRcdG5ld01ldGhvZC5yZXR1cm5zID0gcm91dGUucmV0dXJucztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0bmV3TWV0aG9kLnJldHVybnMgPSByb3V0ZS5yZXR1cm5zO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm91dGUucGFyYW1ldGVycyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAocm91dGUucGFyYW1ldGVycyBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdG5ld01ldGhvZC5wYXJhbWV0ZXJzID0gcm91dGUucGFyYW1ldGVycztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gcm91dGUucGFyYW1ldGVycylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgcGFyYW0gPSByb3V0ZS5wYXJhbWV0ZXJzW2tleV07XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHBhcmFtKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmV3TWV0aG9kLnBhcmFtZXRlcnNba2V5XSA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogcGFyYW1cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSBpZiAodHlwZW9mIChwYXJhbSkgPT09IFwiZnVuY3Rpb25cIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Ly8vIEBmaXhtZSBDYW4ndCBydW4gYXdhaXQgaGVyZSBmb3IgbWFueSByZWFzb25zLiBhd2FpdCBpcyByZXF1aXJlZCBcblx0XHRcdFx0XHRcdFx0Ly8vIHRvIGV4ZWN1dGUgSG90U3RhcS5jb252ZXJ0SW50ZXJmYWNlVG9Sb3V0ZVBhcmFtZXRlcnMuIEZpeCBsYXRlci4uLlxuXG5cdFx0XHRcdFx0XHRcdG5ld01ldGhvZC5wYXJhbWV0ZXJzW2tleV0gPSBwYXJhbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtLnR5cGUgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRwYXJhbS50eXBlID0gXCJzdHJpbmdcIjtcblxuXHRcdFx0XHRcdFx0XHRuZXdNZXRob2QucGFyYW1ldGVyc1trZXldID0gcGFyYW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyb3V0ZS5vblNlcnZlckV4ZWN1dGUgIT0gbnVsbClcblx0XHRcdFx0b25FeGVjdXRlID0gcm91dGUub25TZXJ2ZXJFeGVjdXRlO1xuXG5cdFx0XHRpZiAocm91dGUub25TZXJ2ZXJBdXRob3JpemUgIT0gbnVsbClcblx0XHRcdFx0b25TZXJ2ZXJBdXRob3JpemUgPSByb3V0ZS5vblNlcnZlckF1dGhvcml6ZTtcblxuXHRcdFx0aWYgKHJvdXRlLm9uUmVnaXN0ZXIgIT0gbnVsbClcblx0XHRcdFx0b25SZWdpc3RlciA9IHJvdXRlLm9uUmVnaXN0ZXI7XG5cblx0XHRcdGlmIChyb3V0ZS5vblBvc3RSZWdpc3RlciAhPSBudWxsKVxuXHRcdFx0XHRuZXdNZXRob2Qub25Qb3N0UmVnaXN0ZXIgPSByb3V0ZS5vblBvc3RSZWdpc3RlcjtcblxuXHRcdFx0aWYgKHJvdXRlLm9uU2VydmVyRXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRuZXdNZXRob2Qub25TZXJ2ZXJFeGVjdXRlID0gcm91dGUub25TZXJ2ZXJFeGVjdXRlO1xuXG5cdFx0XHRpZiAocm91dGUub25DbGllbnRFeGVjdXRlICE9IG51bGwpXG5cdFx0XHRcdG5ld01ldGhvZC5vbkNsaWVudEV4ZWN1dGUgPSByb3V0ZS5vbkNsaWVudEV4ZWN1dGU7XG5cblx0XHRcdGlmIChyb3V0ZS50ZXN0Q2FzZXMgIT0gbnVsbClcblx0XHRcdFx0dGVzdENhc2VzID0gcm91dGUudGVzdENhc2VzO1xuXHRcdH1cblxuXHRcdGlmIChuYW1lID09PSBcIlwiKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQWxsIHJvdXRlIG1ldGhvZHMgbXVzdCBoYXZlIGEgbmFtZSFgKTtcblxuXHRcdG5ld01ldGhvZC5yb3V0ZSA9IG5ld1JvdXRlO1xuXHRcdG5ld01ldGhvZC5uYW1lID0gbmFtZTtcblx0XHRuZXdNZXRob2QudHlwZSA9IHR5cGU7XG5cdFx0bmV3TWV0aG9kLmlzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXHRcdG5ld01ldGhvZC5leGVjdXRlU2V0dXAgPSBmYWxzZTtcblx0XHRuZXdNZXRob2Qub25TZXJ2ZXJBdXRob3JpemUgPSBvblNlcnZlckF1dGhvcml6ZTtcblx0XHRuZXdNZXRob2Qub25SZWdpc3RlciA9IG9uUmVnaXN0ZXI7XG5cdFx0bmV3TWV0aG9kLnRlc3RDYXNlcyA9IHt9O1xuXG5cdFx0aWYgKG5ld01ldGhvZC5yb3V0ZS5jb25uZWN0aW9uLnByb2Nlc3Nvci5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdHtcblx0XHRcdGlmICh0ZXN0Q2FzZXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRlc3RDYXNlcyBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0ZXN0Q2FzZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG9iaiA9IHRlc3RDYXNlc1tpSWR4XTtcblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAob2JqKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdGVzdENhc2VOYW1lOiBzdHJpbmcgPSBvYmo7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb24gPSAoPFRlc3RDYXNlRnVuY3Rpb24+dGVzdENhc2VzW2lJZHggKyAxXSk7XG5cblx0XHRcdFx0XHRcdFx0bmV3TWV0aG9kLmFkZFRlc3RDYXNlICh0ZXN0Q2FzZU5hbWUsIGZ1bmMpO1xuXHRcdFx0XHRcdFx0XHRpSWR4Kys7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG5ld01ldGhvZC5hZGRUZXN0Q2FzZSAob2JqKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Zm9yIChsZXQga2V5IGluIHRlc3RDYXNlcylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb2JqID0gdGVzdENhc2VzW2tleV07XG5cblx0XHRcdFx0XHRcdG5ld01ldGhvZC5hZGRUZXN0Q2FzZSAob2JqKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobmV3TWV0aG9kLnJvdXRlLmNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIb3RTZXJ2ZXIpXG5cdFx0XHRuZXdNZXRob2Qub25TZXJ2ZXJFeGVjdXRlID0gb25FeGVjdXRlO1xuXHRcdC8vZWxzZVxuXHRcdFx0Ly9uZXdNZXRob2Qub25DbGllbnRFeGVjdXRlID0gb25FeGVjdXRlO1xuXG5cdFx0cmV0dXJuIChuZXdNZXRob2QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyB0ZXN0IGNhc2UuXG5cdCAqL1xuXHRhZGRUZXN0Q2FzZSAobmV3VGVzdENhc2U6IFRlc3RDYXNlT2JqZWN0IHwgc3RyaW5nIHwgVGVzdENhc2VGdW5jdGlvbiwgXG5cdFx0XHR0ZXN0Q2FzZUZ1bmN0aW9uOiBUZXN0Q2FzZUZ1bmN0aW9uID0gbnVsbCk6IHZvaWRcblx0e1xuXHRcdGlmICh0eXBlb2YgKG5ld1Rlc3RDYXNlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRjb25zdCBuYW1lOiBzdHJpbmcgPSBuZXdUZXN0Q2FzZTtcblx0XHRcdGNvbnN0IGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb24gPSB0ZXN0Q2FzZUZ1bmN0aW9uO1xuXG5cdFx0XHR0aGlzLnRlc3RDYXNlc1tuYW1lXSA9IHtcblx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdGZ1bmM6IGZ1bmNcblx0XHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgKG5ld1Rlc3RDYXNlKSA9PT0gXCJmdW5jdGlvblwiKVxuXHRcdHtcblx0XHRcdGNvbnN0IHRlc3RDYXNlSWQ6IG51bWJlciA9IE9iamVjdC5rZXlzICh0aGlzLnRlc3RDYXNlcykubGVuZ3RoO1xuXHRcdFx0Y29uc3QgbmFtZTogc3RyaW5nID0gYCR7dGhpcy5yb3V0ZS5yb3V0ZX0vJHt0aGlzLm5hbWV9IHRlc3QgY2FzZSAke3Rlc3RDYXNlSWR9YDtcblx0XHRcdGNvbnN0IGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb24gPSAoPFRlc3RDYXNlRnVuY3Rpb24+bmV3VGVzdENhc2UpO1xuXG5cdFx0XHR0aGlzLnRlc3RDYXNlc1tuYW1lXSA9IHtcblx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdGZ1bmM6IGZ1bmNcblx0XHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRlc3RDYXNlOiBUZXN0Q2FzZU9iamVjdCA9ICg8VGVzdENhc2VPYmplY3Q+bmV3VGVzdENhc2UpO1xuXHRcdHRoaXMudGVzdENhc2VzW3Rlc3RDYXNlLm5hbWVdID0gdGVzdENhc2U7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSByZWxhdGl2ZSB1cmwgZnJvbSB0aGlzIG1ldGhvZCBhbmQgaXRzIHJvdXRlLlxuXHQgKi9cblx0Z2V0Um91dGVVcmwgKCk6IHN0cmluZ1xuXHR7XG5cdFx0aWYgKHRoaXMucm91dGUgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFJvdXRlIG1ldGhvZCAke3RoaXMubmFtZX0gZG9lcyBub3QgaGF2ZSBhIHBhcmVudCByb3V0ZSFgKTtcblxuXHRcdGxldCBtZXRob2ROYW1lOiBzdHJpbmcgPSBcIi9cIjtcblxuXHRcdGlmICh0aGlzLnJvdXRlLnZlcnNpb24gIT09IFwiXCIpXG5cdFx0XHRtZXRob2ROYW1lICs9IGAke3RoaXMucm91dGUudmVyc2lvbn0vYDtcblxuXHRcdGlmICh0aGlzLnJvdXRlLnByZWZpeCAhPT0gXCJcIilcblx0XHRcdG1ldGhvZE5hbWUgKz0gYCR7dGhpcy5yb3V0ZS5wcmVmaXh9L2A7XG5cblx0XHRpZiAodGhpcy5yb3V0ZS5yb3V0ZSAhPT0gXCJcIilcblx0XHRcdG1ldGhvZE5hbWUgKz0gYCR7dGhpcy5yb3V0ZS5yb3V0ZX0vYDtcblxuXHRcdG1ldGhvZE5hbWUgKz0gdGhpcy5uYW1lO1xuXG5cdFx0cmV0dXJuIChtZXRob2ROYW1lKTtcblx0fVxufSIsImltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RMb2cgfSBmcm9tIFwiLi9Ib3RMb2dcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHNlcnZlci5cbiAqL1xuZXhwb3J0IGVudW0gSG90U2VydmVyVHlwZVxue1xuXHRIVFRQLFxuXHRXZWJTb2NrZXRzLFxuXHRHZW5lcmF0ZSxcblx0V2ViVGVzdGluZyxcblx0QVBJVGVzdGluZ1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFNlcnZlclxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgc2VydmVyIHR5cGUuXG5cdCAqL1xuXHRzZXJ2ZXJUeXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHRvIHVzZS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG5ldHdvcmsgYWRkcmVzcyB0byBsaXN0ZW4gb24uXG5cdCAqIEBkZWZhdWx0IDAuMC4wLjBcblx0ICovXG5cdGxpc3RlbkFkZHJlc3M6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwb3J0cyB0byB1c2UuXG5cdCAqL1xuXHRwb3J0czoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgSFRUUCBwb3J0IHRvIHVzZS5cblx0XHRcdCAqIEBkZWZhdWx0IDUwMDBcblx0XHRcdCAqL1xuXHRcdFx0aHR0cDogbnVtYmVyO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgSFRUUFMgcG9ydCB0byB1c2UuXG5cdFx0XHQgKiBAZGVmYXVsdCA0NDNcblx0XHRcdCAqL1xuXHRcdFx0aHR0cHM6IG51bWJlcjtcblx0XHR9O1xuXHQvKipcblx0ICogU1NMIHNldHRpbmdzLlxuXHQgKi9cblx0c3NsOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjZXJ0OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUga2V5IHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0a2V5OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgQ0EgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjYTogc3RyaW5nO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBSZWRpcmVjdCBIVFRQIHRyYWZmaWMgdG8gSFRUUFMuXG5cdCAqL1xuXHRyZWRpcmVjdEhUVFB0b0hUVFBTOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuXHQgKi9cblx0dHlwZTogSG90U2VydmVyVHlwZTtcblx0LyoqXG5cdCAqIFRoZSBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIEFueSBzZWNyZXRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci5cblx0ICovXG5cdHNlY3JldHM6IGFueTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgSG90U2VydmVyIGltcGxlbWVudHMgSUhvdFNlcnZlclxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgc2VydmVyIHR5cGUuXG5cdCAqL1xuXHRzZXJ2ZXJUeXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHRvIHVzZS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG5ldHdvcmsgYWRkcmVzcyB0byBsaXN0ZW4gb24uXG5cdCAqIEBkZWZhdWx0IDAuMC4wLjBcblx0ICovXG5cdGxpc3RlbkFkZHJlc3M6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwb3J0cyB0byB1c2UuXG5cdCAqL1xuXHRwb3J0czoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgSFRUUCBwb3J0IHRvIHVzZS5cblx0XHRcdCAqIEBkZWZhdWx0IDUwMDBcblx0XHRcdCAqL1xuXHRcdFx0aHR0cDogbnVtYmVyO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgSFRUUFMgcG9ydCB0byB1c2UuXG5cdFx0XHQgKiBAZGVmYXVsdCA0NDNcblx0XHRcdCAqL1xuXHRcdFx0aHR0cHM6IG51bWJlcjtcblx0XHR9O1xuXHQvKipcblx0ICogU1NMIHNldHRpbmdzLlxuXHQgKi9cblx0c3NsOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjZXJ0OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUga2V5IHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0a2V5OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgQ0EgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjYTogc3RyaW5nO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBSZWRpcmVjdCBIVFRQIHRyYWZmaWMgdG8gSFRUUFMuXG5cdCAqL1xuXHRyZWRpcmVjdEhUVFB0b0hUVFBTOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuXHQgKi9cblx0dHlwZTogSG90U2VydmVyVHlwZTtcblx0LyoqXG5cdCAqIFRoZSBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIEFueSBzZWNyZXRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci5cblx0ICovXG5cdHNlY3JldHM6IGFueTtcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxIHwgSG90U2VydmVyKVxuXHR7XG5cdFx0aWYgKHByb2Nlc3NvciBpbnN0YW5jZW9mIEhvdFN0YXEpXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0XHR0aGlzLnNlcnZlclR5cGUgPSBcIlNlcnZlclwiO1xuXHRcdFx0dGhpcy5hcGkgPSBudWxsO1xuXHRcdFx0dGhpcy5saXN0ZW5BZGRyZXNzID0gXCIwLjAuMC4wXCI7XG5cdFx0XHR0aGlzLnBvcnRzID0ge1xuXHRcdFx0XHRcdGh0dHA6IDUwMDAsXG5cdFx0XHRcdFx0aHR0cHM6IDQ0M1xuXHRcdFx0XHR9O1xuXHRcdFx0dGhpcy5zc2wgPSB7XG5cdFx0XHRcdFx0Y2VydDogXCJcIixcblx0XHRcdFx0XHRrZXk6IFwiXCIsXG5cdFx0XHRcdFx0Y2E6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdHRoaXMucmVkaXJlY3RIVFRQdG9IVFRQUyA9IHRydWU7XG5cdFx0XHR0aGlzLnR5cGUgPSBIb3RTZXJ2ZXJUeXBlLkhUVFA7XG5cdFx0XHR0aGlzLmxvZ2dlciA9IHByb2Nlc3Nvci5sb2dnZXI7XG5cdFx0XHR0aGlzLnNlY3JldHMgPSB7fTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yLnByb2Nlc3Nvcjtcblx0XHRcdHRoaXMuc2VydmVyVHlwZSA9IHByb2Nlc3Nvci5zZXJ2ZXJUeXBlIHx8IFwiU2VydmVyXCI7XG5cdFx0XHR0aGlzLmFwaSA9IHByb2Nlc3Nvci5hcGkgfHwgbnVsbDtcblx0XHRcdHRoaXMubGlzdGVuQWRkcmVzcyA9IHByb2Nlc3Nvci5saXN0ZW5BZGRyZXNzIHx8IFwiMC4wLjAuMFwiO1xuXHRcdFx0dGhpcy5wb3J0cyA9IHByb2Nlc3Nvci5wb3J0cyB8fCB7XG5cdFx0XHRcdFx0aHR0cDogNTAwMCxcblx0XHRcdFx0XHRodHRwczogNDQzXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnNzbCA9IHByb2Nlc3Nvci5zc2wgfHwge1xuXHRcdFx0XHRcdGNlcnQ6IFwiXCIsXG5cdFx0XHRcdFx0a2V5OiBcIlwiLFxuXHRcdFx0XHRcdGNhOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnJlZGlyZWN0SFRUUHRvSFRUUFMgPSBwcm9jZXNzb3IucmVkaXJlY3RIVFRQdG9IVFRQUyAhPSBudWxsID8gcHJvY2Vzc29yLnJlZGlyZWN0SFRUUHRvSFRUUFMgOiB0cnVlO1xuXHRcdFx0dGhpcy50eXBlID0gcHJvY2Vzc29yLnR5cGUgfHwgSG90U2VydmVyVHlwZS5IVFRQO1xuXHRcdFx0dGhpcy5sb2dnZXIgPSBwcm9jZXNzb3IubG9nZ2VyO1xuXHRcdFx0dGhpcy5zZWNyZXRzID0gcHJvY2Vzc29yLnNlY3JldHMgfHwge307XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBhbiBBUEkgdG8gdGhpcyBzZXJ2ZXIuIFRoaXMgd2lsbCBhbHNvIHNldCB0aGUgYXNzb2NpYXRlZCBcblx0ICogcHJvY2Vzc29yIHRvIHRoaXMgQVBJIGFzIHdlbGwuXG5cdCAqL1xuXHRhc3luYyBzZXRBUEkgKGFwaTogSG90QVBJKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0dGhpcy5wcm9jZXNzb3IuYXBpID0gYXBpO1xuXHRcdHRoaXMuYXBpID0gYXBpO1xuXG5cdFx0Ly9pZiAocmVnaXN0ZXJSb3V0ZXMgPT09IHRydWUpXG5cdFx0XHQvL2F3YWl0IHRoaXMuYXBpLnJlZ2lzdGVyUm91dGVzICgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGEgcm91dGUgd2l0aCB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgcmVnaXN0ZXJSb3V0ZT8gKHJvdXRlOiBIb3RSb3V0ZSk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIFN0YXJ0IGxpc3RlbmluZyBmb3IgcmVxdWVzdHMuXG5cdCAqL1xuXHRhc3luYyBsaXN0ZW4/ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBTaHV0ZG93biB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgc2h1dGRvd24/ICgpOiBQcm9taXNlPHZvaWQ+O1xufSIsImltcG9ydCAqIGFzIHBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBmZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xuaW1wb3J0IHZhbGlkYXRlTW9kdWxlTmFtZSBmcm9tIFwidmFsaWRhdGUtbnBtLXBhY2thZ2UtbmFtZVwiO1xuXG5pbXBvcnQgeyBIb3RQYWdlIH0gZnJvbSBcIi4vSG90UGFnZVwiO1xuaW1wb3J0IHsgSG90RmlsZSB9IGZyb20gXCIuL0hvdEZpbGVcIjtcblxuaW1wb3J0IHsgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQsIElIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdExvZywgSG90TG9nTGV2ZWwgfSBmcm9tIFwiLi9Ib3RMb2dcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBEZXZlbG9wZXJNb2RlIH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RBc3NldCB9IGZyb20gXCIuL0hvdEFzc2V0XCI7XG5pbXBvcnQgeyBIb3RNb2R1bGUgfSBmcm9tIFwiLi9Ib3RNb2R1bGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuXG5pbXBvcnQgeyBIb3RUZXN0ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3RlckFQSSB9IGZyb20gXCIuL0hvdFRlc3RlckFQSVwiO1xuaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3RNYXAgfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5pbXBvcnQgeyBIb3RUZXN0RGVzdGluYXRpb259IGZyb20gXCIuL0hvdFRlc3REZXN0aW5hdGlvblwiO1xuXG5pbXBvcnQgeyBIb3RTaXRlLCBIb3RTaXRlUm91dGUgfSBmcm9tIFwiLi9Ib3RTaXRlXCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyQ29tcG9uZW50IH0gZnJvbSBcIi4vSG90U3RhcVJlZ2lzdGVyQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBob3RTdGFxV2ViU3RhcnQgfSBmcm9tIFwiLi9Ib3RTdGFxV2ViU3RhcnRcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcblxudmFyIEhvdFRlc3Rlck1vY2hhOiBhbnkgPSBudWxsO1xudmFyIEhvdFRlc3Rlck1vY2hhU2VsZW5pdW06IGFueSA9IG51bGw7XG52YXIgSG90VGVzdFNlbGVuaXVtRHJpdmVyOiBhbnkgPSBudWxsO1xuXG4vKipcbiAqIFRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIHN0YXJ0aW5nIGEgcGFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3RTdGFydE9wdGlvbnNcbntcblx0LyoqXG5cdCAqIFRoZSBIb3R0IHNpdGUgdG8gbG9hZC5cblx0ICovXG5cdHVybD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb250ZW50IHRvIGRpc3BsYXkuXG5cdCAqL1xuXHRjb250ZW50Pzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHBhZ2UgdG8gbG9hZC5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZSB0byBsb2FkIHRoZSBwYWdlLlxuXHQgKi9cblx0cHJvY2Vzc29yPzogSG90U3RhcTtcblx0LyoqXG5cdCAqIEFueSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbmV3IHBhZ2UuXG5cdCAqL1xuXHRhcmdzPzogYW55O1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3RlciB0byB1c2UuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3RlciBtYXAgdG8gdXNlLlxuXHQgKi9cblx0dGVzdGVyTWFwPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGJhc2UgdXJsIGZvciB0aGUgdGVzdGVyIGFwaS5cblx0ICovXG5cdHRlc3RlckFQSUJhc2VVcmw/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBodG1sIHRoYXQgbG9hZHMgdGhlIGhvdHQgZmlsZSB0aGF0J3MgXG5cdCAqIHBvaW50ZWQgYXQgdGhlIHVybCBhYm92ZS5cblx0ICovXG5cdHRlc3RlckxhdW5jaHBhZFVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlU2NyaXB0IGNvbnZlcnNpb24gb3B0aW9ucyBmb3IgY29udmVydGluZyBpbnRlcmZhY2VzIGludG8gdXNhYmxlIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVR5cGVTY3JpcHRDb252ZXJzaW9uT3B0aW9uc1xue1xuXHQvKipcblx0ICogVGhlIHR5cGUgY29udmVyc2lvbnMgdG8gdXNlIHdoZW4gY29udmVydGluZyBUeXBlU2NyaXB0IHR5cGVzIGludG8gXG5cdCAqIHBhcmFtZXRlciB0eXBlcy5cblx0ICovXG5cdHR5cGVDb252ZXJzaW9ucz86IHsgW3R5cGVOYW1lOiBzdHJpbmddOiBzdHJpbmc7IH07XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpcnN0IHVuaW9uIHR5cGUgd2lsbCBiZSByZXR1cm5lZC4gSWYgc2V0IHRvIGZhbHNlLFxuXHQgKiB0aGUgZW50aXJlIHVuaW9uIHdpbGwgYmUgcmV0dXJuZWQuXG5cdCAqL1xuXHRyZXR1cm5GaXJzdFVuaW9uVHlwZT86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZGVmYXVsdCB0eXBlIHRvIHVzZSB3aGVuIHRoZSBhdmFpbGFibGUgT3BlbkFQSSB0eXBlIGlzIHVua25vd24gb3IgXG5cdCAqIGlzIG5vdCBhIHJhdyBkYXRhIHR5cGUuXG5cdCAqL1xuXHR1bmtub3duVHlwZURlZmF1bHRzVG9UeXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZmFjZVByb3BlcnR5XG57XG5cdG5hbWU6IHN0cmluZztcblx0dHlwZTogc3RyaW5nO1xuXHRpc09wdGlvbmFsOiBib29sZWFuO1xuXHRyZWFkT25seTogYm9vbGVhbjtcblx0aXNBcnJheTogYm9vbGVhbjtcblx0Y29tbWVudHM6IHN0cmluZ1tdO1xuXHRjaGlsZDogUGFyc2VkSW50ZXJmYWNlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRJbnRlcmZhY2Vcbntcblx0bmFtZTogc3RyaW5nO1xuXHRjb21tZW50czogc3RyaW5nW107XG5cdHByb3BlcnRpZXM6IEludGVyZmFjZVByb3BlcnR5W107XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgdGhhdCBoYW5kbGVzIGFsbCBIVE1MIHByZXByb2Nlc3NpbmcsIHRoZW4gb3V0cHV0cyB0aGUgXG4gKiByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RTdGFxXG57XG5cdC8qKlxuXHQgKiBUaGUgYXBpIHRoYXQncyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGguXG5cdCAqL1xuXHRhcGk/OiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIGFwaSB0aGF0J3MgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoLlxuXHQgKi9cblx0dGVzdGVyQVBJPzogSG90QVBJO1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoYXQgdHlwZSBvZiBleGVjdXRpb24gdGhpcyBpcy5cblx0ICovXG5cdG1vZGU/OiBEZXZlbG9wZXJNb2RlO1xuXHQvKipcblx0ICogVGhlIHBhZ2VzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKi9cblx0cGFnZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RQYWdlIH07XG5cdC8qKlxuXHQgKiBUaGUgaW1wb3J0ZWQgbW9kdWxlcy5cblx0ICovXG5cdG1vZHVsZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RNb2R1bGUgfTtcblx0LyoqXG5cdCAqIFRoZSBjb21wb25lbnRzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKiBcblx0ICogQGZpeG1lIFJlbmFtZSB0aGlzIHRvIGNvbXBvbmVudFRhZ3MuXG5cdCAqL1xuXHRjb21wb25lbnRzPzoge1xuXHRcdFt0YWdOYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdGNvbXBvbmVudFR5cGU6IChuZXcgIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpLCBcblx0XHRcdFx0cHJvY2Vzc29yOiBIb3RTdGFxLCBcblx0XHRcdFx0YXBpOiBIb3RBUElcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogVGhlIGZpbGVzIHRoYXQgY2FuIGJlIHN0b3JlZCBmb3IgbGF0ZXIgdXNlLlxuXHQgKi9cblx0ZmlsZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RGaWxlIH07XG5cdC8qKlxuXHQgKiBUaGUgbG9hZGVkIGhvdHNpdGUuXG5cdCAqL1xuXHRob3RTaXRlPzogSG90U2l0ZTtcbn1cblxuLyoqXG4gKiBUaGUgbWFpbiBjbGFzcyB0aGF0IGhhbmRsZXMgYWxsIEhUTUwgcHJlcHJvY2Vzc2luZywgdGhlbiBvdXRwdXRzIHRoZSBcbiAqIHJlc3VsdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RTdGFxIGltcGxlbWVudHMgSUhvdFN0YXFcbntcblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgSG90U3RhcS5cblx0ICovXG5cdHN0YXRpYyB2ZXJzaW9uOiBzdHJpbmcgPSBcIjAuOC4xMTJcIjtcblx0LyoqXG5cdCAqIEluZGljYXRlcyBpZiB0aGlzIGlzIGEgd2ViIGJ1aWxkLlxuXHQgKi9cblx0c3RhdGljIGlzV2ViOiBib29sZWFuID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgaWYgdGhpcyBpcyByZWFkeSBmb3IgdGVzdGluZy5cblx0ICovXG5cdHN0YXRpYyBpc1JlYWR5Rm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhpcyBldmVudCB3aGVuIHRoaXMgcGFnZSBpcyByZWFkeSBmb3IgdGVzdGluZy5cblx0ICovXG5cdHN0YXRpYyBvblJlYWR5Rm9yVGVzdGluZzogKCkgPT4gUHJvbWlzZTx2b2lkPiA9IG51bGw7XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGlzIGV2ZW50IHdoZW4gdGhpcyBwYWdlIGhhcyByZWNlaXZlZCBvdXRwdXQgZm9yIHByb2Nlc3NpbmcuXG5cdCAqIFxuXHQgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgdGhhdCBpcyBhYm91dCB0byBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjdXJyZW50IHBhZ2UuXG5cdCAqL1xuXHRzdGF0aWMgb25PdXRwdXRSZWNlaXZlZDogKG91dHB1dDogc3RyaW5nKSA9PiB2b2lkID0gbnVsbDtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoaXMgZXZlbnQgd2hlbiB0aGlzIHBhZ2UgaXMgcmVhZHkgZm9yIHRlc3RpbmcuXG5cdCAqIFxuXHQgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgdGhhdCB3YXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY3VycmVudCBwYWdlLlxuXHQgKi9cblx0cHJvdGVjdGVkIHN0YXRpYyBvblJlYWR5RXZlbnQ6IChvdXRwdXQ6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gZmFsc2UsIHRoZSBwYWdlIHdpbGwgbm90IGVtaXQgRE9NQ29udGVudExvYWRlZCBvciB3aW5kb3cubG9hZC5cblx0ICovXG5cdHN0YXRpYyBkaXNwYXRjaFJlYWR5RXZlbnRzOiBib29sZWFuID0gdHJ1ZTtcblx0LyoqXG5cdCAqIEVycm9ycyB0byBleGVjdXRlIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcuXG5cdCAqL1xuXHRzdGF0aWMgZXJyb3JzOiB7IFtuYW1lOiBzdHJpbmddOiB7IHJlZGlyZWN0VG9Vcmw/OiBzdHJpbmc7IGZ1bmM/OiAoZXJyVHlwZTogc3RyaW5nKSA9PiB2b2lkOyB9OyB9ID0ge307XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hhdCB0eXBlIG9mIGV4ZWN1dGlvbiB0aGlzIGlzLlxuXHQgKi9cblx0bW9kZTogRGV2ZWxvcGVyTW9kZTtcblx0LyoqXG5cdCAqIFRoZSBhcGkgdGhhdCdzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aC5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBhcGkgdGhhdCdzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aC5cblx0ICovXG5cdHRlc3RlckFQSTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHBhZ2VzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKi9cblx0cGFnZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFBhZ2UgfTtcblx0LyoqXG5cdCAqIFRoZSBpbXBvcnRlZCBtb2R1bGVzLlxuXHQgKi9cblx0bW9kdWxlczogeyBbbmFtZTogc3RyaW5nXTogSG90TW9kdWxlIH07XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBjb25zdHJ1Y3RlZC5cblx0ICogXG5cdCAqIEBmaXhtZSBSZW5hbWUgdGhpcyB0byBjb21wb25lbnRUYWdzLlxuXHQgKi9cblx0Y29tcG9uZW50czoge1xuXHRcdFt0YWdOYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdGNvbXBvbmVudFR5cGU6IChuZXcgIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpLCBcblx0XHRcdFx0cHJvY2Vzc29yOiBIb3RTdGFxLCBcblx0XHRcdFx0YXBpOiBIb3RBUElcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogVGhlIGZpbGVzIHRoYXQgY2FuIGJlIHN0b3JlZCBmb3IgbGF0ZXIgdXNlLlxuXHQgKi9cblx0ZmlsZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdEZpbGUgfTtcblx0LyoqXG5cdCAqIFRoZSBsb2FkZWQgaG90c2l0ZS5cblx0ICovXG5cdGhvdFNpdGU6IEhvdFNpdGU7XG5cdC8qKlxuXHQgKiBUaGUgYXBpIGNvbnRlbnQgdG8gdXNlIHdoZW4gYWJvdXQgdG8gbG9hZCBIb3RTdGFxLlxuXHQgKi9cblx0YXBpQ29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBhcGkgY29udGVudCB0byB1c2Ugd2hlbiBhYm91dCB0byBsb2FkIEhvdFN0YXEuXG5cdCAqL1xuXHR0ZXN0ZXJBcGlDb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGFnZSBjb250ZW50IHRvIHVzZSB3aGVuIGFib3V0IHRvIGxvYWQgSG90U3RhcS5cblx0ICovXG5cdHBhZ2VDb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cdC8qKlxuXHQgKiBBZGQgYSBzdGFydCBkZWxheSBiZWZvcmUgc3RhcnRpbmcuIFRoaXMgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBtb3N0bHkuXG5cdCAqL1xuXHRzdGFydERlbGF5OiBudW1iZXI7XG5cdC8qKlxuXHQgKiBUaGUgcHVibGljIGtleXMgdG8gYmUgZXhwb3NlZC5cblx0ICovXG5cdHB1YmxpY0tleXM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXJzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqL1xuXHR0ZXN0ZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0ZXIgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdFN0YXEgPSB7fSlcblx0e1xuXHRcdHRoaXMubG9nZ2VyID0gbmV3IEhvdExvZyAoSG90TG9nTGV2ZWwuQWxsKTtcblx0XHR0aGlzLnN0YXJ0RGVsYXkgPSAwO1xuXHRcdHRoaXMuYXBpID0gY29weS5hcGkgfHwgbnVsbDtcblx0XHR0aGlzLnRlc3RlckFQSSA9IGNvcHkudGVzdGVyQVBJIHx8IG51bGw7XG5cdFx0dGhpcy5tb2RlID0gY29weS5tb2RlIHx8IERldmVsb3Blck1vZGUuUHJvZHVjdGlvbjtcblx0XHR0aGlzLnBhZ2VzID0gY29weS5wYWdlcyB8fCB7fTtcblx0XHR0aGlzLm1vZHVsZXMgPSBjb3B5Lm1vZHVsZXMgfHwge307XG5cdFx0dGhpcy5jb21wb25lbnRzID0gY29weS5jb21wb25lbnRzIHx8IHt9O1xuXHRcdHRoaXMuZmlsZXMgPSBjb3B5LmZpbGVzIHx8IHt9O1xuXHRcdHRoaXMuaG90U2l0ZSA9IGNvcHkuaG90U2l0ZSB8fCBudWxsO1xuXHRcdHRoaXMuYXBpQ29udGVudCA9IGBcblx0XHRcdHtcblx0XHRcdFx0dmFyICVhcGlfbmFtZSUgPSAlYXBpX2V4cG9ydGVkX25hbWUlLiVhcGlfbmFtZSU7XG5cdFx0XHRcdHZhciBuZXdIb3RDbGllbnQgPSBuZXcgSG90Q2xpZW50IChwcm9jZXNzb3IpO1xuXHRcdFx0XHR2YXIgbmV3YXBpID0gbmV3ICVhcGlfbmFtZSUgKCViYXNlX3VybCUsIG5ld0hvdENsaWVudCk7XG5cdFx0XHRcdG5ld0hvdENsaWVudC5hcGkgPSBuZXdhcGk7XG5cdFx0XHRcdHByb2Nlc3Nvci5hcGkgPSBuZXdhcGk7XG5cdFx0XHR9YDtcblx0XHR0aGlzLnRlc3RlckFwaUNvbnRlbnQgPSBgXG5cdFx0XHR2YXIgSG90VGVzdGVyQVBJID0gSG90U3RhcVdlYi5Ib3RUZXN0ZXJBUEk7XG5cdFx0XHR2YXIgbmV3SG90VGVzdGVyQ2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdHZhciBuZXd0ZXN0ZXJhcGkgPSBuZXcgSG90VGVzdGVyQVBJICglYmFzZV90ZXN0ZXJfdXJsJSwgbmV3SG90VGVzdGVyQ2xpZW50KTtcblx0XHRcdG5ld0hvdFRlc3RlckNsaWVudC50ZXN0ZXJBUEkgPSBuZXd0ZXN0ZXJhcGk7XG5cdFx0XHRwcm9jZXNzb3IudGVzdGVyQVBJID0gbmV3dGVzdGVyYXBpO2A7XG5cdFx0dGhpcy5wYWdlQ29udGVudCA9IFxuYDwhRE9DVFlQRSBodG1sPlxuPGh0bWw+XG5cbjxoZWFkPlxuXHQ8dGl0bGU+JXRpdGxlJTwvdGl0bGU+XG5cblx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiVob3RzdGFxX2pzX3NyYyVcIj48L3NjcmlwdD5cblx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj5cblx0XHR3aW5kb3cuaG90c3RhcVN0YXJ0aW5nQXBwID0gdHJ1ZTtcblxuXHRcdGZvciAobGV0IGtleSBpbiBIb3RTdGFxV2ViKVxuXHRcdFx0d2luZG93W2tleV0gPSBIb3RTdGFxV2ViW2tleV07XG5cdDwvc2NyaXB0PlxuXG4lYXBpc190b19sb2FkJVxuXG5cdDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+XG5cdFx0YXN5bmMgZnVuY3Rpb24gaG90c3RhcV9zdGFydEFwcCAoKVxuXHRcdHtcblx0XHRcdGxldCB0ZW1wTW9kZSA9IDA7XG5cblx0XHRcdGlmICh3aW5kb3dbXCJIb3RcIl0gIT0gbnVsbClcblx0XHRcdFx0dGVtcE1vZGUgPSBIb3QuTW9kZTtcblxuXHRcdFx0JXN0YXJ0X2RlbGF5JVxuXG5cdFx0XHR2YXIgcHJvY2Vzc29yID0gbmV3IEhvdFN0YXEgKCk7XG5cdFx0XHRwcm9jZXNzb3IubG9nZ2VyLmxvZ0xldmVsID0gJWxvZ2dpbmdfbGV2ZWwlO1xuXG5cdFx0XHR2YXIgcHJvbWlzZXMgPSBbXTtcblx0XHRcdCVkZXZlbG9wZXJfbW9kZSVcblxuXHRcdFx0JWFwaV9jb2RlJVxuXG5cdFx0XHQlcHVibGljX3NlY3JldHMlXG5cdFx0XHQldGVzdGVyX2FwaSVcblx0XHRcdCVsb2FkX2ZpbGVzJVxuXG5cdFx0XHRwcm9jZXNzb3IubW9kZSA9IHRlbXBNb2RlO1xuXG5cdFx0XHRQcm9taXNlLmFsbCAocHJvbWlzZXMpLnRoZW4gKGZ1bmN0aW9uICgpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRIb3RTdGFxLmRpc3BsYXlVcmwgKHtcblx0XHRcdFx0XHRcdFx0dXJsOiBcIiV1cmwlXCIsXG5cdFx0XHRcdFx0XHRcdG5hbWU6IFwiJXRpdGxlJVwiLFxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHByb2Nlc3Nvcixcblx0XHRcdFx0XHRcdFx0YXJnczogJWFyZ3MlLFxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJOYW1lOiAldGVzdGVyX25hbWUlLFxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJNYXA6ICV0ZXN0ZXJfbWFwJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyQVBJQmFzZVVybDogJXRlc3Rlcl9hcGlfYmFzZV91cmwlLFxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJMYXVuY2hwYWRVcmw6ICV0ZXN0ZXJfbGF1bmNocGFkX3VybCVcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHRob3RzdGFxX3N0YXJ0QXBwICgpO1xuXHQ8L3NjcmlwdD5cbjwvaGVhZD5cblxuPGJvZHk+XG48L2JvZHk+XG5cbjwvaHRtbD5gO1xuXHRcdHRoaXMucHVibGljS2V5cyA9IHt9O1xuXHRcdHRoaXMudGVzdGVycyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlIGEgYm9vbGVhbiB2YWx1ZS5cblx0ICovXG5cdHN0YXRpYyBwYXJzZUJvb2xlYW4gKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuXG5cdHtcblx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlICgpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcInRydWVcIilcblx0XHRcdHJldHVybiAodHJ1ZSk7XG5cblx0XHRpZiAodmFsdWUgPT09IFwiZmFsc2VcIilcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcInllc1wiKVxuXHRcdFx0cmV0dXJuICh0cnVlKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJub1wiKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0XHRpZiAodmFsdWUgPT09IFwieWVwXCIpXG5cdFx0XHRyZXR1cm4gKHRydWUpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcIm5haFwiKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IGEgVHlwZVNjcmlwdCBpbnRlcmZhY2UgdG8gYSByb3V0ZSBwYXJhbWV0ZXIuXG5cdCAqIFRoaXMgaXMgZXhwZXJpbWVudGFsLCBidXQgc3RpbGwgd29ya3MgZGVjZW50bHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgY29udmVydEludGVyZmFjZVRvUm91dGVQYXJhbWV0ZXJzIChzb3VyY2VDb2RlUGF0aDogc3RyaW5nLCBpbnRlcmZhY2VOYW1lOiBzdHJpbmcsIFxuXHRcdFx0b3B0aW9uczogSVR5cGVTY3JpcHRDb252ZXJzaW9uT3B0aW9ucyA9IFxuXHRcdFx0XHR7IHR5cGVDb252ZXJzaW9uczogeyBcIkRhdGVcIjogXCJzdHJpbmdcIiB9LCByZXR1cm5GaXJzdFVuaW9uVHlwZTogdHJ1ZSwgdW5rbm93blR5cGVEZWZhdWx0c1RvVHlwZTogXCJzdHJpbmdcIiB9XG5cdFx0KTogUHJvbWlzZTxIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcj5cblx0e1xuXHRcdGxldCBwYXJhbWV0ZXJzOiB7IFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyOyB9ID0ge307XG5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFN0YXEuY29udmVydEludGVyZmFjZVRvUm91dGVQYXJhbWV0ZXJzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIuYCk7XG5cblx0XHRsZXQgSG90SU8gPSBldmFsIChcInJlcXVpcmVcIikoXCIuL0hvdElPXCIpLkhvdElPOyAvLyBIYWNrIHRvIGdldCBhcm91bmQgV2VicGFjay5cblx0XHRjb25zdCBzb3VyY2VDb2RlQ29udGVudDogc3RyaW5nID0gYXdhaXQgSG90SU8ucmVhZFRleHRGaWxlIChzb3VyY2VDb2RlUGF0aCk7XG5cblx0XHRsZXQgcGFyc2VJbnRlcmZhY2UgPSBldmFsIChcInJlcXVpcmVcIikoXCIuL0hvdENvbnZlcnRJbnRlcmZhY2VUb1JvdXRlUGFyYW1ldGVyc1wiKS5wYXJzZUludGVyZmFjZTtcblx0XHRjb25zdCBvdXRwdXQ6IFBhcnNlZEludGVyZmFjZSA9IHBhcnNlSW50ZXJmYWNlIChcIi4vdGVtcC50c1wiLCBzb3VyY2VDb2RlQ29udGVudCwgaW50ZXJmYWNlTmFtZSwgb3B0aW9ucyk7XG5cblx0XHRpZiAob3V0cHV0ID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBJbnRlcmZhY2UgJHtpbnRlcmZhY2VOYW1lfSBub3QgZm91bmQgaW4gJHtzb3VyY2VDb2RlUGF0aH0uYCk7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dC5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCBwcm9wOiBJbnRlcmZhY2VQcm9wZXJ0eSA9IG91dHB1dC5wcm9wZXJ0aWVzW2ldO1xuXHRcdFx0bGV0IGRlc2NyaXB0aW9uOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRpZiAocHJvcC5jb21tZW50cy5sZW5ndGggPiAwKVxuXHRcdFx0XHRkZXNjcmlwdGlvbiA9IHByb3AuY29tbWVudHNbMF07XG5cblx0XHRcdHBhcmFtZXRlcnNbcHJvcC5uYW1lXSA9IHtcblx0XHRcdFx0XHRcInR5cGVcIjogcHJvcC50eXBlLFxuXHRcdFx0XHRcdFwicmVxdWlyZWRcIjogIXByb3AuaXNPcHRpb25hbCxcblx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IGRlc2NyaXB0aW9uXG5cdFx0XHRcdH07XG5cblx0XHRcdGlmIChwcm9wLnJlYWRPbmx5ID09PSB0cnVlKVxuXHRcdFx0XHRwYXJhbWV0ZXJzW3Byb3AubmFtZV0ucmVhZE9ubHkgPSB0cnVlO1xuXG5cdFx0XHRpZiAocHJvcC5pc0FycmF5ID09PSB0cnVlKVxuXHRcdFx0e1xuXHRcdFx0XHRwYXJhbWV0ZXJzW3Byb3AubmFtZV0udHlwZSA9IFwiYXJyYXlcIjtcblx0XHRcdFx0cGFyYW1ldGVyc1twcm9wLm5hbWVdLml0ZW1zID0ge1xuXHRcdFx0XHRcdFx0XCJ0eXBlXCI6IHByb3AudHlwZVxuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChwYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIHJlcXVpcmVkIHBhcmFtZXRlciBleGlzdHMgaW5zaWRlIGFuIG9iamVjdC4gSWYgaXQgZXhpc3RzLCByZXR1cm4gdGhlIHZhbHVlLlxuXHQgKi9cblx0c3RhdGljIGdldFBhcmFtIChuYW1lOiBzdHJpbmcsIG9ialdpdGhQYXJhbTogYW55LCByZXF1aXJlZDogYm9vbGVhbiA9IHRydWUsIHRocm93RXhjZXB0aW9uOiBib29sZWFuID0gdHJ1ZSk6IGFueVxuXHR7XG5cdFx0bGV0IHZhbHVlOiBhbnkgPSBvYmpXaXRoUGFyYW1bbmFtZV07XG5cblx0XHRpZiAodmFsdWUgPT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAocmVxdWlyZWQgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aHJvd0V4Y2VwdGlvbiA9PT0gdHJ1ZSlcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAke25hbWV9LmApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRpZiAocmVxdWlyZWQgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gXCJcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aHJvd0V4Y2VwdGlvbiA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICR7bmFtZX0uYCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIHJlcXVpcmVkIHBhcmFtZXRlciBleGlzdHMgaW5zaWRlIGFuIG9iamVjdC4gSWYgaXQgZXhpc3RzLCByZXR1cm4gdGhlIHZhbHVlLCBlbnN1cmUgdGhlIFxuXHQgKiBudW1iZXIgcmV0dXJuZWQgaXMgd2l0aGluIGEgY2VydGFpbiByYW5nZS5cblx0ICogXG5cdCAqIFRoZSB2YWx1ZSByZXRyaWV2ZWQgbXVzdCBiZSBhIG51bWJlci5cblx0ICovXG5cdHN0YXRpYyBnZXRQYXJhbVJhbmdlIChuYW1lOiBzdHJpbmcsIG9ialdpdGhQYXJhbTogYW55LCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIHJlcXVpcmVkOiBib29sZWFuID0gdHJ1ZSwgdGhyb3dFeGNlcHRpb246IGJvb2xlYW4gPSB0cnVlKTogYW55XG5cdHtcblx0XHRjb25zdCB2YWx1ZSA9IEhvdFN0YXEuZ2V0UGFyYW0gKG5hbWUsIG9ialdpdGhQYXJhbSwgcmVxdWlyZWQsIHRocm93RXhjZXB0aW9uKTtcblxuXHRcdGlmICh2YWx1ZSA8IG1pbilcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFBhcmFtZXRlciAke25hbWV9IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bWlufS5gKTtcblxuXHRcdGlmICh2YWx1ZSA+IG1heClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFBhcmFtZXRlciAke25hbWV9IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bWF4fS5gKTtcblxuXHRcdHJldHVybiAodmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGEgcmVxdWlyZWQgcGFyYW1ldGVyIGV4aXN0cyBpbnNpZGUgYW4gb2JqZWN0LiBJZiBpdCBleGlzdHMsIHJldHVybiB0aGUgdmFsdWUuXG5cdCAqIElmIGl0IGRvZXMgbm90IGV4aXN0LCByZXR1cm4gYSBkZWZhdWx0IHZhbHVlIGluc3RlYWQuXG5cdCAqL1xuXHRzdGF0aWMgZ2V0UGFyYW1EZWZhdWx0IChuYW1lOiBzdHJpbmcsIG9ialdpdGhQYXJhbTogYW55LCBkZWZhdWx0VmFsdWU6IGFueSk6IGFueVxuXHR7XG5cdFx0bGV0IHZhbHVlOiBhbnkgPSBvYmpXaXRoUGFyYW1bbmFtZV07XG5cblx0XHRpZiAodmFsdWUgPT0gbnVsbClcblx0XHRcdHJldHVybiAoZGVmYXVsdFZhbHVlKTtcblxuXHRcdGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRpZiAodmFsdWUgPT09IFwiXCIpXG5cdFx0XHRcdHJldHVybiAoZGVmYXVsdFZhbHVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIHZhbHVlIGlzIG51bGwgb3IgZW1wdHkuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZywgbnVsbCwgdW5kZWZpbmVkLCAwLCBldGMuXG5cdCAqL1xuXHRzdGF0aWMgY2hlY2tJZkVtcHR5ICh2YWx1ZTogYW55KTogYm9vbGVhblxuXHR7XG5cdFx0aWYgKCF2YWx1ZSlcblx0XHRcdHJldHVybiAodHJ1ZSk7XG5cblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIHJlcXVpcmVkIHBhcmFtZXRlciBleGlzdHMgaW5zaWRlIGFuIG9iamVjdC4gSWYgaXQgZXhpc3RzLCByZXR1cm4gdGhlIHZhbHVlLCBlbnN1cmUgdGhlIFxuXHQgKiBudW1iZXIgcmV0dXJuZWQgaXMgd2l0aGluIGEgY2VydGFpbiByYW5nZS4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIHJldHVybiBhIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC5cblx0ICogXG5cdCAqIFRoZSB2YWx1ZSByZXRyaWV2ZWQgbXVzdCBiZSBhIG51bWJlci5cblx0ICovXG5cdHN0YXRpYyBnZXRQYXJhbURlZmF1bHRSYW5nZSAobmFtZTogc3RyaW5nLCBvYmpXaXRoUGFyYW06IGFueSwgZGVmYXVsdFZhbHVlOiBhbnksIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IGFueVxuXHR7XG5cdFx0Y29uc3QgdmFsdWUgPSBIb3RTdGFxLmdldFBhcmFtRGVmYXVsdCAobmFtZSwgb2JqV2l0aFBhcmFtLCBkZWZhdWx0VmFsdWUpO1xuXG5cdFx0aWYgKHZhbHVlIDwgbWluKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgUGFyYW1ldGVyICR7bmFtZX0gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHttaW59LmApO1xuXG5cdFx0aWYgKHZhbHVlID4gbWF4KVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgUGFyYW1ldGVyICR7bmFtZX0gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHttYXh9LmApO1xuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbiBlcnJvci4gVGhpcyBjYW5ub3QgYmUgYW4gYXN5bmMgZnVuY3Rpb24gZHVlIHRvIHRoZSBuYXR1cmUgb2YgaG93IHRoaXMgd29ya3MuXG5cdCAqL1xuXHRzdGF0aWMgZXhlY3V0ZUVycm9yIChlcnJUeXBlOiBzdHJpbmcpXG5cdHtcblx0XHRpZiAoSG90U3RhcS5lcnJvcnNbZXJyVHlwZV0gIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgdXJsOiBzdHJpbmcgPSBIb3RTdGFxLmVycm9yc1tlcnJUeXBlXS5yZWRpcmVjdFRvVXJsO1xuXG5cdFx0XHRpZiAodXJsICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh1cmwgIT09IFwiXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRsZXQgZnVuYyA9IEhvdFN0YXEuZXJyb3JzW2VyclR5cGVdLmZ1bmM7XG5cblx0XHRcdGlmIChmdW5jICE9IG51bGwpXG5cdFx0XHRcdGZ1bmMgKGVyclR5cGUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBXYWl0IGZvciBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgd2FpdCAobnVtTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRyZXR1cm4gKG5ldyBQcm9taXNlICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRzZXRUaW1lb3V0ICgoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJlc29sdmUgKCk7XG5cdFx0XHRcdFx0fSwgbnVtTWlsbGlzZWNvbmRzKTtcblx0XHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBwYWdlLlxuXHQgKi9cblx0YWRkUGFnZSAocGFnZTogSG90UGFnZSk6IHZvaWRcblx0e1xuXHRcdHRoaXMucGFnZXNbcGFnZS5uYW1lXSA9IHBhZ2U7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgcGFnZSB0byBwcm9jZXNzLlxuXHQgKi9cblx0Z2V0UGFnZSAocGFnZU5hbWU6IHN0cmluZyk6IEhvdFBhZ2Vcblx0e1xuXHRcdHJldHVybiAodGhpcy5wYWdlc1twYWdlTmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbiBpbXBvcnRlZCBtb2R1bGUuXG5cdCAqL1xuXHRhZGRNb2R1bGUgKG5hbWU6IHN0cmluZywgbW9kdWxlOiBIb3RNb2R1bGUpOiB2b2lkXG5cdHtcblx0XHR0aGlzLm1vZHVsZXNbbmFtZV0gPSBtb2R1bGU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFuIGltcG9ydGVkIG1vZHVsZS5cblx0ICovXG5cdGdldE1vZHVsZSAobmFtZTogc3RyaW5nKTogSG90TW9kdWxlXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMubW9kdWxlc1tuYW1lXSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgZmlsZS5cblx0ICovXG5cdGFkZEZpbGUgKGZpbGU6IEhvdEZpbGUpOiB2b2lkXG5cdHtcblx0XHRsZXQgbmFtZTogc3RyaW5nID0gZmlsZS5uYW1lO1xuXG5cdFx0aWYgKG5hbWUgPT09IFwiXCIpXG5cdFx0XHRuYW1lID0gZmlsZS5sb2NhbEZpbGU7XG5cblx0XHRpZiAobmFtZSA9PT0gXCJcIilcblx0XHRcdG5hbWUgPSBmaWxlLnVybDtcblxuXHRcdHRoaXMuZmlsZXNbbmFtZV0gPSBmaWxlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIGZpbGUuXG5cdCAqL1xuXHRnZXRGaWxlIChuYW1lOiBzdHJpbmcsIHRocm93RXg6IGJvb2xlYW4gPSB0cnVlKTogSG90RmlsZVxuXHR7XG5cdFx0aWYgKHRoaXMuZmlsZXNbbmFtZV0gPT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgcG9zOiBudW1iZXIgPSBuYW1lLmluZGV4T2YgKFwiP2hzdHFzZXJ2ZT1cIik7XG5cdFx0XHRsZXQgdGVtcE5hbWU6IHN0cmluZyA9IG5hbWU7XG5cblx0XHRcdGlmIChwb3MgPiAtMSlcblx0XHRcdFx0dGVtcE5hbWUgPSBuYW1lLnN1YnN0cmluZyAoMCwgcG9zKTtcblxuXHRcdFx0aWYgKHRoaXMuZmlsZXNbdGVtcE5hbWVdICE9IG51bGwpXG5cdFx0XHRcdHJldHVybiAodGhpcy5maWxlc1t0ZW1wTmFtZV0pO1xuXG5cdFx0XHRpZiAodGhyb3dFeCA9PT0gdHJ1ZSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgZmlsZSAke25hbWV9YCk7XG5cblx0XHRcdHJldHVybiAobnVsbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh0aGlzLmZpbGVzW25hbWVdKTtcblx0fVxuXG5cdC8qKiBcblx0ICogS2VlcCB0aGUgY29udGV4dCB0aGUgb2JqZWN0IGlzIGN1cnJlbnRseSBpbi5cblx0ICogXG5cdCAqIEBwYXJhbSBmdW5jIFRoZSBkb2N1bWVudCBlbGVtZW50J3MgaWQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBvYmplY3QgdG8gcmVtYWluIGluIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBbdmFsPXVuZGVmaW5lZF0gQW4gYWRkaXRpb25hbCB2YWx1ZSB0byBwYXNzIHRvIHRoZSBjb250ZXh0LlxuXHQgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCByZXN1bHQgZnJvbSB0aGUgZnVuY3Rpb24gZnVuYy5cblx0ICovXG5cdHN0YXRpYyBrZWVwQ29udGV4dChmdW5jOiBGdW5jdGlvbiwgY29udGV4dDogYW55LCB2YWw/OiBhbnkpOiBhbnlcblx0e1xuXHRcdHZhciBvYmpSZXR1cm4gPSBmdW5jdGlvbigpXG5cdFx0XHR7XG5cdFx0XHRcdHZhciBhcnlBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuXHRcdFx0XHRpZiAodmFsICE9IHVuZGVmaW5lZClcblx0XHRcdFx0XHRhcnlBcmdzLnB1c2godmFsKTtcblxuXHRcdFx0XHRpZiAoY29udGV4dCA9PSBudWxsKVxuXHRcdFx0XHRcdHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyeUFyZ3MpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJ5QXJncyk7XG5cdFx0XHR9O1xuXG5cdFx0cmV0dXJuIG9ialJldHVybjtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW5kIHJlZ2lzdGVyIGEgY29tcG9uZW50LlxuXHQgKi9cblx0YWRkQ29tcG9uZW50IChDb21wb25lbnRUeXBlOiAobmV3IChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpLCBhcGk6IEhvdEFQSSA9IG51bGwsIFxuXHRcdGVsZW1lbnRPcHRpb25zOiBFbGVtZW50RGVmaW5pdGlvbk9wdGlvbnMgPSB1bmRlZmluZWQpOiB2b2lkXG5cdHtcblx0XHRsZXQgdGVtcEFwaSA9IHRoaXMuYXBpXG5cblx0XHRpZiAoYXBpICE9IG51bGwpXG5cdFx0XHR0ZW1wQXBpID0gYXBpO1xuXG5cdFx0bGV0IHRlbXBDb21wb25lbnRPYmogPSBuZXcgQ29tcG9uZW50VHlwZSAodGhpcywgdGVtcEFwaSk7XG5cblx0XHRpZiAodGhpcy5jb21wb25lbnRzW3RlbXBDb21wb25lbnRPYmoudGFnXSAhPSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQ29tcG9uZW50ICR7dGVtcENvbXBvbmVudE9iai50YWd9IGFscmVhZHkgZXhpc3RzIWApO1xuXG5cdFx0dGhpcy5jb21wb25lbnRzW3RlbXBDb21wb25lbnRPYmoudGFnXSA9IHsgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZSwgcHJvY2Vzc29yOiB0aGlzLCBhcGk6IHRlbXBBcGkgfTtcblx0XHRyZWdpc3RlckNvbXBvbmVudC5jYWxsICh0aGlzLCB0ZW1wQ29tcG9uZW50T2JqLnRhZywgZWxlbWVudE9wdGlvbnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvcnJlY3QgYW55IEhUTUwgcHJpb3IgdG8gRE9NIHBhcnNpbmcuIFRoaXMgb25seSBhY2NvdW50cyBmb3IgPHRyPiBjdXJyZW50bHkuXG5cdCAqL1xuXHRzdGF0aWMgZml4SFRNTCAoc3RyOiBzdHJpbmcpOiB7IGZpeGVkU3RyOiBzdHJpbmcsIHF1ZXJ5U2VsZWN0b3I6IHN0cmluZzsgfVxuXHR7XG5cdFx0Ly8gVGFrZSBpbnRvIGFjY291bnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBYTUwgYW5kIEhUTUwuXG5cdFx0Y29uc3QgdGVtcFN0cjogc3RyaW5nID0gc3RyLnJlcGxhY2UoLyBcXC8+L2csICc+JykucmVwbGFjZShcblx0XHRcdC8oPChhcmVhfGJhc2V8YnJ8Y29sfGNvbW1hbmR8ZW1iZWR8aHJ8aW1nfGlucHV0fGtleWdlbnxsaW5rfG1ldGF8cGFyYW18c291cmNlfHRyYWNrfHdicikuKj8+KS9nLCAnJDE8LyQyPicpO1xuXHRcdGNvbnN0IHBhcnNlZFhNTCA9IG5ldyBET01QYXJzZXIgKCkucGFyc2VGcm9tU3RyaW5nIChgPHhtbD4ke3RlbXBTdHJ9PC94bWw+YCwgXCJ0ZXh0L3htbFwiKTtcblx0XHRsZXQgcXVlcnlTZWxlY3Rvcjogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmIChwYXJzZWRYTUwuZG9jdW1lbnRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0Y29uc3QgdGFnTmFtZTogc3RyaW5nID0gcGFyc2VkWE1MLmRvY3VtZW50RWxlbWVudC5jaGlsZHJlblswXS50YWdOYW1lLnRvTG93ZXJDYXNlICgpO1xuXG5cdFx0XHRpZiAodGFnTmFtZSA9PT0gXCJ0clwiKVxuXHRcdFx0e1xuXHRcdFx0XHRzdHIgPSBgPHRhYmxlPiR7c3RyfTwvdGFibGU+YDtcblx0XHRcdFx0cXVlcnlTZWxlY3RvciA9IFwidGJvZHlcIjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRhZ05hbWUgPT09IFwidGhcIilcblx0XHRcdHtcblx0XHRcdFx0c3RyID0gYDx0YWJsZT4ke3N0cn08L3RhYmxlPmA7XG5cdFx0XHRcdHF1ZXJ5U2VsZWN0b3IgPSB0YWdOYW1lO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAoeyBmaXhlZFN0cjogc3RyLCBxdWVyeVNlbGVjdG9yOiBxdWVyeVNlbGVjdG9yIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyBIVE1MIGVsZW1lbnQocykgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQuXG5cdCAqL1xuXHRzdGF0aWMgYWRkSHRtbCAocGFyZW50OiBzdHJpbmcgfCBIVE1MRWxlbWVudCwgaHRtbDogc3RyaW5nIHwgSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IEhUTUxFbGVtZW50W11cblx0e1xuXHRcdGxldCBmb3VuZFBhcmVudDogSFRNTEVsZW1lbnQgPSBudWxsO1xuXG5cdFx0aWYgKHR5cGVvZiAocGFyZW50KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdGZvdW5kUGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciAocGFyZW50KTtcblx0XHRlbHNlXG5cdFx0XHRmb3VuZFBhcmVudCA9IHBhcmVudDtcblxuXHRcdGlmIChmb3VuZFBhcmVudCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgcGFyZW50ICR7cGFyZW50fSFgKTtcblxuXHRcdGxldCByZXN1bHQ6IEhUTUxFbGVtZW50ID0gbnVsbDtcblxuXHRcdGlmICh0eXBlb2YgKGh0bWwpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdGxldCBodG1sSGFuZGxlciA9IEhvdFN0YXEuZml4SFRNTCAoaHRtbCk7XG5cdFx0XHRsZXQgbmV3RE9NOiBEb2N1bWVudCA9IG5ldyBET01QYXJzZXIgKCkucGFyc2VGcm9tU3RyaW5nIChodG1sSGFuZGxlci5maXhlZFN0ciwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0XHRsZXQgY2hpbGRyZW46IGFueSA9IG51bGw7XG5cblx0XHRcdGlmIChodG1sSGFuZGxlci5xdWVyeVNlbGVjdG9yID09PSBcIlwiKVxuXHRcdFx0XHRjaGlsZHJlbiA9IG5ld0RPTS5ib2R5LmNoaWxkcmVuO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRjaGlsZHJlbiA9IG5ld0RPTS5xdWVyeVNlbGVjdG9yIChodG1sSGFuZGxlci5xdWVyeVNlbGVjdG9yKS5jaGlsZHJlbjtcblxuXHRcdFx0bGV0IHJlc3VsdHM6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGNoaWxkOiBIVE1MRWxlbWVudCA9ICg8SFRNTEVsZW1lbnQ+Y2hpbGRyZW5baUlkeF0pO1xuXG5cdFx0XHRcdHJlc3VsdHMucHVzaCAoZm91bmRQYXJlbnQuYXBwZW5kQ2hpbGQgKGNoaWxkKSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAocmVzdWx0cyk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHJlc3VsdCA9IGZvdW5kUGFyZW50LmFwcGVuZENoaWxkIChodG1sKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIEhvdFNpdGUncyBuYW1lIGlzIHZhbGlkLlxuXHQgKi9cblx0c3RhdGljIGNoZWNrSG90U2l0ZU5hbWUgKGhvdHNpdGVOYW1lOiBzdHJpbmcsIHRocm93RXhjZXB0aW9uOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuXG5cdHtcblx0XHRsZXQgcmVzdWx0cyA9IHZhbGlkYXRlTW9kdWxlTmFtZSAoaG90c2l0ZU5hbWUpO1xuXHRcdGxldCBpc1ZhbGlkOiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdGlmIChyZXN1bHRzLnZhbGlkRm9yTmV3UGFja2FnZXMgPT09IGZhbHNlKVxuXHRcdFx0aXNWYWxpZCA9IGZhbHNlO1xuXG5cdFx0aWYgKHJlc3VsdHMuZXJyb3JzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHJlc3VsdHMuZXJyb3JzLmxlbmd0aCA+IDApXG5cdFx0XHRcdGlzVmFsaWQgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoaXNWYWxpZCA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRocm93RXhjZXB0aW9uID09PSB0cnVlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RTaXRlICR7aG90c2l0ZU5hbWV9IGhhcyBhbiBpbnZhbGlkIG5hbWUhIFRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eSBhbmQgbXVzdCBoYXZlIGEgdmFsaWQgTlBNIG1vZHVsZSBuYW1lLmApO1xuXHRcdH1cblxuXHRcdHJldHVybiAoaXNWYWxpZCk7XG5cdH1cblxuXHQvKipcblx0ICogSW4gdGhlIHN1cHBsaWVkIGNvbnRlbnQsIHJlcGxhY2UgYSBrZXkgaW4gYSAke0tFWX0gd2l0aCBhIHZhbHVlLlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIGNvbnRlbnQgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZXMuXG5cdCAqL1xuXHRzdGF0aWMgcmVwbGFjZUtleSAoY29udGVudDogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZ1xuXHR7XG5cdFx0Y29uc3QgZmluYWxTdHI6IHN0cmluZyA9IGNvbnRlbnQucmVwbGFjZSAobmV3IFJlZ0V4cCAoYFxcXFwkXFxcXHske2tleX1cXFxcfWAsIFwiZ1wiKSwgdmFsdWUpO1xuXG5cdFx0cmV0dXJuIChmaW5hbFN0cik7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdmFsdWUgZnJvbSBhIEhvdFNpdGUgb2JqZWN0LlxuXHQgKiBcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgdmFsdWUgZnJvbSB0aGUgaG90c2l0ZSBvYmplY3QuIFJldHVybnMgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0c3RhdGljIGdldFZhbHVlRnJvbUhvdFNpdGVPYmogKGhvdHNpdGU6IEhvdFNpdGUsIHBhcmFtczogc3RyaW5nW10pOiBhbnlcblx0e1xuXHRcdGxldCB2YWx1ZTogYW55ID0gbnVsbDtcblxuXHRcdGlmIChob3RzaXRlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHByZXZWYWx1ZTogYW55ID0gaG90c2l0ZTtcblxuXHRcdFx0Ly8gR28gdGhyb3VnaCBlYWNoIG9iamVjdCBpbiB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIGFuZCBcblx0XHRcdC8vIGdldCB0aGUgdmFsdWUgb2YgdGhlIGZpbmFsIHBhcmFtZXRlci5cblx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgcGFyYW1zLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcGFyYW06IHN0cmluZyA9IHBhcmFtc1tpSWR4XTtcblxuXHRcdFx0XHRpZiAocHJldlZhbHVlW3BhcmFtXSA9PSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cHJldlZhbHVlID0gbnVsbDtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cHJldlZhbHVlID0gcHJldlZhbHVlW3BhcmFtXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByZXZWYWx1ZSAhPSBudWxsKVxuXHRcdFx0XHR2YWx1ZSA9IHByZXZWYWx1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGEgSG90U2l0ZS5cblx0ICovXG5cdGFzeW5jIHByb2Nlc3NIb3RTaXRlICh0ZXN0ZXI6IEhvdFRlc3RlciA9IG51bGwpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRIb3RTdGFxLmNoZWNrSG90U2l0ZU5hbWUgKHRoaXMuaG90U2l0ZS5uYW1lLCB0cnVlKTtcblxuXHRcdGxldCByb3V0ZXMgPSB0aGlzLmhvdFNpdGUucm91dGVzO1xuXG5cdFx0aWYgKHJvdXRlcyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGtleSBpbiByb3V0ZXMpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCByb3V0ZTogSG90U2l0ZVJvdXRlID0gcm91dGVzW2tleV07XG5cdFx0XHRcdGxldCBmaWxlOiBIb3RGaWxlID0gbmV3IEhvdEZpbGUgKHJvdXRlKTtcblx0XHRcdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSBuZXcgSG90UGFnZSAoe1xuXHRcdFx0XHRcdFx0cHJvY2Vzc29yOiB0aGlzLFxuXHRcdFx0XHRcdFx0bmFtZTogcm91dGUubmFtZSB8fCBcIlwiLFxuXHRcdFx0XHRcdFx0cm91dGU6IGtleSxcblx0XHRcdFx0XHRcdGZpbGVzOiBbZmlsZV1cblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAodGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSByb3V0ZS5uYW1lO1xuXHRcdFx0XHRcdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRpZiAocm91dGUubWFwICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHJvdXRlLm1hcCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGVzdGVyLnRlc3RNYXBzW3JvdXRlLm1hcF0gPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgbWFwICR7cm91dGUubWFwfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXSA9IHRlc3Rlci50ZXN0TWFwc1tyb3V0ZS5tYXBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHRlc3RNYXAgPSBuZXcgSG90VGVzdE1hcCAoKTtcblx0XHRcdFx0XHRcdFx0XHRsZXQgZGVzdGluYXRpb25zOiBIb3RUZXN0RGVzdGluYXRpb25bXSB8IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3REZXN0aW5hdGlvbiB9ID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZS5tYXAgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnMgPSBbXTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCByb3V0ZS5tYXAubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBkZXN0ID0gcm91dGUubWFwW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9ucy5wdXNoIChuZXcgSG90VGVzdERlc3RpbmF0aW9uIChkZXN0KSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnMgPSB7fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQga2V5MiBpbiByb3V0ZS5tYXApXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBkZXN0ID0gcm91dGUubWFwW2tleTJdO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9uc1trZXkyXSA9IG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKGRlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdHRlc3RNYXAuZGVzdGluYXRpb25zID0gZGVzdGluYXRpb25zO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dGVzdGVyLnRlc3RNYXBzW21hcE5hbWVdID0gdGVzdE1hcDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHJvdXRlLmRlc3RpbmF0aW9uT3JkZXIgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGVzdGVyLnRlc3RNYXBzW21hcE5hbWVdLmRlc3RpbmF0aW9uT3JkZXIgPSByb3V0ZS5kZXN0aW5hdGlvbk9yZGVyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYWRkUGFnZSAocGFnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS53ZWIgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5ob3RTaXRlLndlYilcblx0XHRcdHtcblx0XHRcdFx0Y29uc3Qgd2ViID0gdGhpcy5ob3RTaXRlLndlYltrZXldO1xuXG5cdFx0XHRcdGlmICh3ZWIubWFwID09IG51bGwpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IGZhbHNlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgbWFwTmFtZTogc3RyaW5nID0ga2V5O1xuXHRcdFx0XHRcdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSBuZXcgSG90VGVzdE1hcCAoKTtcblxuXHRcdFx0XHRcdFx0dGVzdE1hcC5kZXN0aW5hdGlvbnMgPSBbXTtcblxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB3ZWIubWFwLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgbWFwOiBzdHJpbmcgPSB3ZWIubWFwW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRcdHRlc3RNYXAuZGVzdGluYXRpb25zLnB1c2ggKG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKG1hcCkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXSA9IHRlc3RNYXA7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKFwiQSB0ZXN0ZXIgd2FzIG5vdCBjcmVhdGVkIGZpcnN0ISBZb3UgbXVzdCBzcGVjaWZ5IG9uZSBpbiB0aGUgQ0xJLlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLmFwaXMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5ob3RTaXRlLmFwaXMpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBhcGkgPSB0aGlzLmhvdFNpdGUuYXBpc1trZXldO1xuXG5cdFx0XHRcdGlmIChhcGkubWFwID09IG51bGwpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IGZhbHNlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgbWFwTmFtZTogc3RyaW5nID0ga2V5O1xuXHRcdFx0XHRcdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSBuZXcgSG90VGVzdE1hcCAoKTtcblxuXHRcdFx0XHRcdFx0dGVzdE1hcC5kZXN0aW5hdGlvbnMgPSBbXTtcblxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBhcGkubWFwLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgbWFwOiBzdHJpbmcgPSBhcGkubWFwW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRcdHRlc3RNYXAuZGVzdGluYXRpb25zLnB1c2ggKG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKG1hcCkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXSA9IHRlc3RNYXA7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKFwiQSB0ZXN0ZXIgd2FzIG5vdCBjcmVhdGVkIGZpcnN0ISBZb3UgbXVzdCBzcGVjaWZ5IG9uZSBpbiB0aGUgQ0xJLlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLy8gQGZpeG1lIEFsbG93IHRoaXMgdG8gd29yayBmb3Igc2VydmVyLXNpZGUgYXMgd2VsbC4uLlxuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUuY29tcG9uZW50cylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGNvbXBvbmVudCA9IHRoaXMuaG90U2l0ZS5jb21wb25lbnRzW2tleV07XG5cdFx0XHRcdGxldCBjb21wb25lbnRVcmw6IHN0cmluZyA9IGNvbXBvbmVudC51cmw7XG5cblx0XHRcdFx0Ly8vIEBmaXhtZSBDcmVhdGUgdW5pdCB0ZXN0IGZvciBmZXRjaGluZywgbG9hZGluZywgYW5kIHJlZ2lzdGVyaW5nLlxuXHRcdFx0XHRsZXQgcmVzOiBhbnkgPSBhd2FpdCBmZXRjaCAoY29tcG9uZW50VXJsKTtcblx0XHRcdFx0bGV0IENvbXBvbmVudENsYXNzID0gZXZhbCAocmVzKTtcblxuXHRcdFx0XHR0aGlzLmFkZENvbXBvbmVudCAoQ29tcG9uZW50Q2xhc3MpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmhvdFNpdGUucm91dGVzID09IG51bGwpXG5cdFx0XHR0aGlzLmhvdFNpdGUucm91dGVzID0ge307XG5cblx0XHRsZXQgZGlzYWJsZUZpbGVMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLmRpc2FibGVGaWxlTG9hZGluZyAhPSBudWxsKVxuXHRcdFx0ZGlzYWJsZUZpbGVMb2FkaW5nID0gdGhpcy5ob3RTaXRlLmRpc2FibGVGaWxlTG9hZGluZztcblxuXHRcdGlmIChkaXNhYmxlRmlsZUxvYWRpbmcgPT09IGZhbHNlKVxuXHRcdFx0YXdhaXQgdGhpcy5sb2FkSG90RmlsZXMgKHRoaXMuaG90U2l0ZS5maWxlcywgZmFsc2UsIGZhbHNlKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgSG90c2l0ZSBoYXMgZmlsZSBsb2FkaW5nIGRpc2FibGVkLi4uYCk7XG5cblx0XHRpZiAodGVzdGVyICE9IG51bGwpXG5cdFx0XHR0aGlzLmFkZFRlc3RlciAodGVzdGVyKTtcblxuXHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBQcm9jZXNzZWQgSG90U2l0ZSAke3RoaXMuaG90U2l0ZS5uYW1lfWApO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgZnJvbSBhIEhvdFNpdGUuanNvbiBmaWxlLiBCZSBzdXJlIHRvIGxvYWQgYW5kIGF0dGFjaCBhbnkgdGVzdGVycyBiZWZvcmUgXG5cdCAqIGxvYWRpbmcgYSBIb3RTaXRlLlxuXHQgKi9cblx0YXN5bmMgbG9hZEhvdFNpdGUgKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBqc29uU3RyOiBzdHJpbmcgPSBcIlwiO1xuXHRcdGNvbnN0IGV4dDogc3RyaW5nID0gcHBhdGguZXh0bmFtZSAocGF0aCkudG9Mb3dlckNhc2UgKCk7XG5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgRG93bmxvYWRpbmcgSG90U2l0ZSAke3BhdGh9YCk7XG5cblx0XHRcdGxldCByZXM6IGFueSA9IGF3YWl0IGZldGNoIChwYXRoKTtcblxuXHRcdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYERvd25sb2FkZWQgc2l0ZSAke3BhdGh9YCk7XG5cblx0XHRcdGpzb25TdHIgPSByZXMudGV4dCAoKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHBhdGggPSBwcGF0aC5ub3JtYWxpemUgKHBhdGgpO1xuXG5cdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgQWNjZXNzaW5nIEhvdFNpdGUgJHtwYXRofWApO1xuXG5cdFx0XHRsZXQgSG90SU8gPSBldmFsIChcInJlcXVpcmVcIikoXCIuL0hvdElPXCIpLkhvdElPOyAvLyBIYWNrIHRvIGdldCBhcm91bmQgV2VicGFjay5cblxuXHRcdFx0aWYgKGF3YWl0IEhvdElPLmV4aXN0cyAocGF0aCkgPT09IGZhbHNlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RTaXRlICR7cGF0aH0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdGpzb25TdHIgPSBhd2FpdCBIb3RJTy5yZWFkVGV4dEZpbGUgKHBhdGgpO1xuXHRcdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYEFjY2Vzc2VkIHNpdGUgJHtwYXRofWApO1xuXHRcdH1cblxuXHRcdGlmICgoZXh0ID09PSBcIi55YW1sXCIpIHx8IChleHQgPT09IFwiLnltbFwiKSlcblx0XHR7XG5cdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgWUFNTCBzdXBwb3J0IGZvciBIb3RTaXRlcyBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSB3ZWIgeWV0IWApO1xuXG5cdFx0XHRsZXQgeWFtbCA9IGV2YWwgKFwicmVxdWlyZVwiKShcInlhbWxcIik7IC8vIEhhY2sgdG8gZ2V0IGFyb3VuZCBXZWJwYWNrLlxuXHRcdFx0dGhpcy5ob3RTaXRlID0geWFtbC5wYXJzZSAoanNvblN0cik7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuaG90U2l0ZSA9IEpTT04ucGFyc2UgKGpzb25TdHIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90U2l0ZSAke3BhdGh9IGNhbm5vdCBiZSBudWxsIWApO1xuXG5cdFx0dGhpcy5ob3RTaXRlLmhvdHNpdGVQYXRoID0gcGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlIHRoZSBjdXJyZW50IEhvdFNpdGUgdG8gYSBmaWxlLlxuXHQgKi9cblx0YXN5bmMgc2F2ZUhvdFNpdGUgKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQ2Fubm90IHNhdmUgYSBIb3RTaXRlIG9uIHRoZSB3ZWIhYCk7XG5cblx0XHRjb25zdCBleHQ6IHN0cmluZyA9IHBwYXRoLmV4dG5hbWUgKHBhdGgpLnRvTG93ZXJDYXNlICgpO1xuXHRcdGxldCBob3RzaXRlU3RyOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKChleHQgPT09IFwiLnlhbWxcIikgfHwgKGV4dCA9PT0gXCIueW1sXCIpKVxuXHRcdHtcblx0XHRcdGxldCB5YW1sID0gZXZhbCAoXCJyZXF1aXJlXCIpKFwieWFtbFwiKTsgLy8gSGFjayB0byBnZXQgYXJvdW5kIFdlYnBhY2suXG5cdFx0XHRob3RzaXRlU3RyID0geWFtbC5zdHJpbmdpZnkgKHRoaXMuaG90U2l0ZSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdGhvdHNpdGVTdHIgPSBKU09OLnN0cmluZ2lmeSAodGhpcy5ob3RTaXRlLCBudWxsLCAyKTtcblxuXHRcdGxldCBIb3RJTyA9IGV2YWwgKFwicmVxdWlyZVwiKShcIi4vSG90SU9cIikuSG90SU87IC8vIEhhY2sgdG8gZ2V0IGFyb3VuZCBXZWJwYWNrLlxuXHRcdGF3YWl0IEhvdElPLndyaXRlVGV4dEZpbGUgKHBhdGgsIGhvdHNpdGVTdHIpO1xuXHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBTYXZlZCBzaXRlICR7cGF0aH1gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIGFuIGFycmF5IG9mIGZpbGVzLiBJZiBhIGZpbGUgYWxyZWFkeSBoYXMgY29udGVudCwgaXQgd2lsbCBub3QgYmUgcmVsb2FkZWQgXG5cdCAqIHVubGVzcyBmb3JjZUNvbnRlbnRMb2FkaW5nIGlzIHNldCB0byB0cnVlLlxuXHQgKi9cblx0YXN5bmMgbG9hZEhvdEZpbGVzIChmaWxlczogeyBbbmFtZTogc3RyaW5nXTogeyB1cmw/OiBzdHJpbmc7IGxvY2FsRmlsZT86IHN0cmluZzsgY29udGVudD86IHN0cmluZzsgfSB9LCBcblx0XHRcdGZvcmNlQ29udGVudExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZSwgbG9hZFVybENvbnRlbnQ6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYExvYWRpbmcgSG90dCBmaWxlcy4uLmApO1xuXG5cdFx0Zm9yIChsZXQga2V5IGluIGZpbGVzKVxuXHRcdHtcblx0XHRcdGxldCBmaWxlID0gZmlsZXNba2V5XTtcblx0XHRcdGxldCBuZXdGaWxlOiBIb3RGaWxlID0gbnVsbDtcblxuXHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdG5ld0ZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XHRcdFx0XCJuYW1lXCI6IGtleVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRuZXdGaWxlID0gbmV3IEhvdEZpbGUgKHtcblx0XHRcdFx0XHRcdFwibmFtZVwiOiBrZXlcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGZpbGUudXJsICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdFx0XHRcdG5ld0ZpbGUudXJsID0gYCR7ZmlsZS51cmx9P2hzdHFzZXJ2ZT1uYWhmYW1gO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0bmV3RmlsZS51cmwgPSBmaWxlLnVybDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IGZhbHNlKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoZmlsZS5sb2NhbEZpbGUgIT0gbnVsbClcblx0XHRcdFx0XHRuZXdGaWxlLmxvY2FsRmlsZSA9IGZpbGUubG9jYWxGaWxlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgbG9hZENvbnRlbnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdFx0XHRpZiAoZmlsZS5jb250ZW50ICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdG5ld0ZpbGUuY29udGVudCA9IGZpbGUuY29udGVudDtcblx0XHRcdFx0bG9hZENvbnRlbnQgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGZvcmNlQ29udGVudExvYWRpbmcgPT09IHRydWUpXG5cdFx0XHRcdGxvYWRDb250ZW50ID0gdHJ1ZTtcblxuXHRcdFx0aWYgKGxvYWRVcmxDb250ZW50ID09PSBmYWxzZSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKG5ld0ZpbGUudXJsICE9PSBcIlwiKVxuXHRcdFx0XHRcdGxvYWRDb250ZW50ID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsb2FkQ29udGVudCA9PT0gdHJ1ZSlcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYExvYWRpbmcgSG90dCBmaWxlOiAke25ld0ZpbGUudXJsfWApO1xuXHRcdFx0XHRhd2FpdCBuZXdGaWxlLmxvYWQgKCk7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBGaW5pc2hlZCBsb2FkaW5nIEhvdHQgZmlsZTogJHtuZXdGaWxlLnVybH1gKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5hZGRGaWxlIChuZXdGaWxlKTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgRmluaXNoZWQgbG9hZGluZyBIb3R0IGZpbGVzLi4uYCk7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGUgdGhlIGNvbnRlbnQgdG8gc2VuZCB0byBhIGNsaWVudC5cblx0ICovXG5cdGFzeW5jIGdlbmVyYXRlQ29udGVudCAocm91dGVLZXk6IHN0cmluZywgbmFtZTogc3RyaW5nID0gXCJcIiwgdXJsOiBzdHJpbmcgPSBcIi4vXCIsXG5cdFx0XHRqc1NyY1BhdGg6IHN0cmluZyA9IFwiLi9qcy9Ib3RTdGFxLm1pbi5qc1wiLCBwYXNzQXJnczogYm9vbGVhbiA9IHRydWUsIFxuXHRcdFx0YXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IGFwaVNjcmlwdHM6IHN0cmluZyA9IFwiXCI7XG5cdFx0bGV0IGFwaUNvZGU6IHN0cmluZyA9IFwiXCI7XG5cdFx0bGV0IHB1YmxpY0tleXM6IHN0cmluZyA9IFwiXCI7XG5cblx0XHQvLy8gQHRvZG8gT3B0aW1pemUgdGhpcyBmdW5jdGlvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLlxuXG5cdFx0Ly8gTG9hZCB0aGUgQVBJIHN0cmluZy5cblx0XHRpZiAodGhpcy5ob3RTaXRlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaSAhPT0gXCJcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IGdsb2JhbEFwaSA9IHRoaXMuaG90U2l0ZS5hcGlzW3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpXTtcblxuXHRcdFx0XHRcdGlmIChnbG9iYWxBcGkgPT0gbnVsbClcblx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7dGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGl9IGRvZXNuJ3QgZXhpc3QhYCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBzZW5kSlNDb250ZW50OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0aWYgKGdsb2JhbEFwaS5qc2FwaSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7dGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGl9IGRvZXNuJ3QgaGF2ZSBhIGpzYXBpIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGdsb2JhbEFwaS5saWJyYXJ5TmFtZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7dGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGl9IGRvZXNuJ3QgaGF2ZSBhIGxpYnJhcnlOYW1lIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGdsb2JhbEFwaS5hcGlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHt0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaX0gZG9lc24ndCBoYXZlIGEgYXBpTmFtZSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChzZW5kSlNDb250ZW50ID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRhcGlTY3JpcHRzICs9IGBcXHQ8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiIHNyYyA9IFwiJHtnbG9iYWxBcGkuanNhcGl9XCI+PC9zY3JpcHQ+XFxuYDtcblxuXHRcdFx0XHRcdFx0XHRsZXQgYmFzZVVybDogc3RyaW5nID0gXCJcXFwiXFxcIlwiO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChnbG9iYWxBcGkudXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0YmFzZVVybCA9IGBcXFwiJHtnbG9iYWxBcGkudXJsfVxcXCJgO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmFwaSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGJhc2VVcmwgPSBgXFxcIiR7dGhpcy5hcGkuYmFzZVVybH1cXFwiYDtcblxuXHRcdFx0XHRcdFx0XHRsZXQgdGVtcEFQSUNvbnRlbnQ6IHN0cmluZyA9IHRoaXMuYXBpQ29udGVudDtcblx0XHRcdFx0XHRcdFx0dGVtcEFQSUNvbnRlbnQgPSB0ZW1wQVBJQ29udGVudC5yZXBsYWNlICgvXFwlYXBpXFxfbmFtZVxcJS9nLCBnbG9iYWxBcGkuYXBpTmFtZSk7XG5cdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX2V4cG9ydGVkXFxfbmFtZVxcJS9nLCBnbG9iYWxBcGkubGlicmFyeU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCViYXNlXFxfdXJsXFwlL2csIGJhc2VVcmwpO1xuXG5cdFx0XHRcdFx0XHRcdGFwaUNvZGUgKz0gdGVtcEFQSUNvbnRlbnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmhvdFNpdGUuYXBpcyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcm91dGUgPSB0aGlzLmhvdFNpdGUucm91dGVzW3JvdXRlS2V5XTtcblxuXHRcdFx0XHRpZiAocm91dGUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChyb3V0ZS5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgYXBpID0gdGhpcy5ob3RTaXRlLmFwaXNbcm91dGUuYXBpXTtcblxuXHRcdFx0XHRcdFx0aWYgKGFwaSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZmluZCBBUEkgJHtyb3V0ZS5hcGl9YCk7XG5cblx0XHRcdFx0XHRcdGlmIChyb3V0ZS5hcGkgIT09IHRoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgc2VuZEpTQ29udGVudDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGFwaS5qc2FwaSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7cm91dGUuYXBpfSBkb2Vzbid0IGhhdmUgYSBqc2FwaSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoYXBpLmxpYnJhcnlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHtyb3V0ZS5hcGl9IGRvZXNuJ3QgaGF2ZSBhIGxpYnJhcnlOYW1lIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhcGkuYXBpTmFtZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7cm91dGUuYXBpfSBkb2Vzbid0IGhhdmUgYSBhcGlOYW1lIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChzZW5kSlNDb250ZW50ID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGpzYXBpcGF0aCA9IGFwaS5qc2FwaTtcblx0XHRcdFx0XHRcdFx0XHRhcGlTY3JpcHRzICs9IGBcXHQ8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiIHNyYyA9IFwiJHtqc2FwaXBhdGh9XCI+PC9zY3JpcHQ+XFxuYDtcblxuXHRcdFx0XHRcdFx0XHRcdGxldCBiYXNlVXJsOiBzdHJpbmcgPSBcIlxcXCJcXFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYXBpLnVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0YmFzZVVybCA9IGBcXFwiJHthcGkudXJsfVxcXCJgO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRiYXNlVXJsID0gYFxcXCIke3RoaXMuYXBpLmJhc2VVcmx9XFxcImA7XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgdGVtcEFQSUNvbnRlbnQ6IHN0cmluZyA9IHRoaXMuYXBpQ29udGVudDtcblx0XHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9uYW1lXFwlL2csIGFwaS5hcGlOYW1lKTtcblx0XHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9leHBvcnRlZFxcX25hbWVcXCUvZywgYXBpLmxpYnJhcnlOYW1lKTtcblx0XHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCViYXNlXFxfdXJsXFwlL2csIGJhc2VVcmwpO1xuXG5cdFx0XHRcdFx0XHRcdFx0YXBpQ29kZSArPSB0ZW1wQVBJQ29udGVudDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlciAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlci5qc1NyY1BhdGggIT0gbnVsbClcblx0XHRcdFx0XHRqc1NyY1BhdGggPSB0aGlzLmhvdFNpdGUuc2VydmVyLmpzU3JjUGF0aDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5wdWJsaWNLZXlzICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUucHVibGljS2V5cylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBzZWNyZXQgPSB0aGlzLmhvdFNpdGUucHVibGljS2V5c1trZXldO1xuXHRcdFx0XHRcdGxldCB2YWx1ZTogc3RyaW5nID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAoc2VjcmV0KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHZhbHVlID0gSlNPTi5zdHJpbmdpZnkgKHNlY3JldCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkuY29ubmVjdGlvbiA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQ2Fubm90IHBhc3Mgc2VjcmV0cyBmcm9tIHRoZSBBUEkgaWYgdGhlcmUncyBubyBjb25uZWN0aW9uIWApO1xuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNlcnZlckNvbm46IEhvdFNlcnZlciA9ICg8SG90U2VydmVyPnRoaXMuYXBpLmNvbm5lY3Rpb24pO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNlY3JldC5wYXNzU2VjcmV0RnJvbUFQSSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAoc2VydmVyQ29ubi5zZWNyZXRzW2tleV0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKHNlY3JldC5lbnYgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vLyBAZml4bWUgQHNlY3Z1bCBJcyB0aGlzIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eT8gTmVlZCB0byB2ZXJpZnkgdGhhdCBcblx0XHRcdFx0XHRcdFx0XHQvLy8gb25seSB0aGUgc2VydmVyIGhhcyBhY2Nlc3MgdG8gdGhpcy4gQXQgdGhpcyBwb2ludCwgSSB0aGluayBvbmx5IHRoZSBcblx0XHRcdFx0XHRcdFx0XHQvLy8gc2VydmVyIGhhcyBhY2Nlc3MuXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZW52S2V5OiBzdHJpbmcgPSBzZWNyZXQuZW52O1xuXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAocHJvY2Vzcy5lbnZbZW52S2V5XSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRwdWJsaWNLZXlzICs9IGBwcm9jZXNzb3IucHVibGljS2V5c1tcIiR7a2V5fVwiXSA9ICR7dmFsdWV9O1xcbmA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgY29udGVudDogc3RyaW5nID0gdGhpcy5wYWdlQ29udGVudDtcblx0XHRsZXQgZml4Q29udGVudCA9IGFzeW5jICh0ZW1wQ29udGVudDogc3RyaW5nKSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgZGV2ZWxvcGVyTW9kZVN0cjogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IHRlc3RlckFQSVN0cjogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZGV2ZWxvcGVyTW9kZVN0ciA9IGB0ZW1wTW9kZSA9IEhvdFN0YXFXZWIuRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudDtgO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJBUElTdHIgPSB0aGlzLnRlc3RlckFwaUNvbnRlbnQ7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybCA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybCA9IFwiaHR0cDovLzEyNy4wLjAuMTo4MTgyXCI7XG5cblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJBUElTdHIgPSB0ZXN0ZXJBUElTdHIucmVwbGFjZSAoL1xcJWJhc2VcXF90ZXN0ZXJcXF91cmxcXCUvZywgYFxcXCIke3RoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJBUElVcmx9XFxcImApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGxvYWRGaWxlczogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRpZiAoT2JqZWN0LmtleXMgKHRoaXMuZmlsZXMpLmxlbmd0aCA+IDApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsb2FkRmlsZXMgKz0gYHZhciBmaWxlcyA9IHt9O1xcblxcbmA7XG5cblx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5maWxlcylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgZmlsZSA9IHRoaXMuZmlsZXNba2V5XTtcblx0XHRcdFx0XHRcdGxldCBhc3NldDogSG90QXNzZXQgPSBuZXcgSG90QXNzZXQgKFwiaHRtbFwiLCBrZXkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoZmlsZS5sb2NhbEZpbGUgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdGFzc2V0LnBhdGggPSBmaWxlLmxvY2FsRmlsZTtcblxuXHRcdFx0XHRcdFx0aWYgKGZpbGUudXJsICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHRhc3NldC5wYXRoID0gZmlsZS51cmw7XG5cblx0XHRcdFx0XHRcdGlmIChmaWxlLmNvbnRlbnQgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGFzc2V0LnBhdGggPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRhc3NldC5jb250ZW50ID0gZmlsZS5jb250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgb3V0cHV0ID0gYXdhaXQgYXNzZXQub3V0cHV0ICgpO1xuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIChvdXRwdXQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBEdXJpbmcgaW5pdGlhbCBsb2FkLCBIVE1MIGFzc2V0cyBjYW5ub3QgYmUgb3V0cHV0dGVkIHVzaW5nIG9ubHkgYSBzdHJpbmchYCk7XG5cblx0XHRcdFx0XHRcdGxldCBmaWxlVXJsOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRcdFx0bGV0IGZpbGVDb250ZW50OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0XHRpZiAob3V0cHV0LnVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRmaWxlVXJsID0gYFwidXJsXCI6IFwiJHtvdXRwdXQudXJsfVwiLCBgO1xuXG5cdFx0XHRcdFx0XHRpZiAob3V0cHV0LmNvbnRlbnQgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0ZmlsZUNvbnRlbnQgPSBgXCJjb250ZW50XCI6ICR7b3V0cHV0LmNvbnRlbnR9YDsgLy8gTWF5IGhhdmUgdG8gZXNjYXBlIHRoZSBjb250ZW50P1xuXG5cdFx0XHRcdFx0XHRsb2FkRmlsZXMgKz0gYFxcdFxcdFxcdGZpbGVzW1wiJHtvdXRwdXQubmFtZX1cIl0gPSB7ICR7ZmlsZVVybH0ke2ZpbGVDb250ZW50fSB9O1xcbmA7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bG9hZEZpbGVzICs9IGBcXHRcXHRcXHRwcm9taXNlcy5wdXNoIChwcm9jZXNzb3IubG9hZEhvdEZpbGVzIChmaWxlcykpO1xcbmA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0aXRsZVxcJS9nLCBuYW1lKTtcblxuXHRcdFx0XHRpZiAocGFzc0FyZ3MgPT09IHRydWUpXG5cdFx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXJnc1xcJS9nLCBcIkhvdC5Bcmd1bWVudHNcIik7XG5cblx0XHRcdFx0aWYgKGFyZ3MgIT0gbnVsbClcblx0XHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVhcmdzXFwlL2csIEpTT04uc3RyaW5naWZ5IChhcmdzKSk7XG5cblx0XHRcdFx0bGV0IHRlc3Rlck1hcDogc3RyaW5nID0gcm91dGVLZXk7XG5cdFx0XHRcdGxldCB0ZXN0ZXJVcmw6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRcdGxldCB0ZXN0ZXJMYXVuY2hwYWRVcmw6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRcdGxldCB0ZXN0ZXJOYW1lOiBzdHJpbmcgPSBcIkhvdFRlc3Rlck1vY2hhU2VsZW5pdW1cIjtcblxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy50ZXN0ZXJzKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGVzdGVyTmFtZSA9IGtleTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJOYW1lICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZSA9IHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyVXJsID0gdGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybDtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLmxhdW5jaHBhZFVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHRlc3RlckxhdW5jaHBhZFVybCA9IHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi5sYXVuY2hwYWRVcmw7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5yb3V0ZXMgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnJvdXRlc1tyb3V0ZUtleV0gIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IHJvdXRlID0gdGhpcy5ob3RTaXRlLnJvdXRlc1tyb3V0ZUtleV07XG5cdFx0XHRcdFx0XHRcdHRlc3Rlck1hcCA9IHJvdXRlLm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHN0YXJ0RGVsYXlTdHI6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0aWYgKHRoaXMuc3RhcnREZWxheSAhPT0gMClcblx0XHRcdFx0XHRzdGFydERlbGF5U3RyID0gYGF3YWl0IEhvdFN0YXEud2FpdCAoJHt0aGlzLnN0YXJ0RGVsYXl9KTtgO1xuXG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXN0YXJ0XFxfZGVsYXlcXCUvZywgc3RhcnREZWxheVN0cik7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWxvZ2dpbmdcXF9sZXZlbFxcJS9nLCBgSG90TG9nTGV2ZWwuJHtIb3RMb2dMZXZlbFt0aGlzLmxvZ2dlci5sb2dMZXZlbF19YCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWhvdHN0YXFcXF9qc1xcX3NyY1xcJS9nLCBqc1NyY1BhdGgpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVkZXZlbG9wZXJcXF9tb2RlXFwlL2csIGRldmVsb3Blck1vZGVTdHIpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9hcGlcXCUvZywgdGVzdGVyQVBJU3RyKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXBpc1xcX3RvXFxfbG9hZFxcJS9nLCBhcGlTY3JpcHRzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlbG9hZFxcX2ZpbGVzXFwlL2csIGxvYWRGaWxlcyk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX2NvZGVcXCUvZywgYXBpQ29kZSk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXB1YmxpY1xcX3NlY3JldHNcXCUvZywgcHVibGljS2V5cyk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXVybFxcJS9nLCB1cmwpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9uYW1lXFwlL2csIGBcIiR7dGVzdGVyTmFtZX1cImApO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9tYXBcXCUvZywgYFwiJHt0ZXN0ZXJNYXB9XCJgKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwldGVzdGVyXFxfYXBpXFxfYmFzZVxcX3VybFxcJS9nLCBgXCIke3Rlc3RlclVybH1cImApO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9sYXVuY2hwYWRcXF91cmxcXCUvZywgYFwiJHt0ZXN0ZXJMYXVuY2hwYWRVcmx9XCJgKTtcblxuXHRcdFx0XHRyZXR1cm4gKHRlbXBDb250ZW50KTtcblx0XHRcdH07XG5cdFx0Y29udGVudCA9IGF3YWl0IGZpeENvbnRlbnQgKGNvbnRlbnQpO1xuXG5cdFx0cmV0dXJuIChjb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIEV4cHJlc3Mgcm91dGVzIGZyb20gdGhlIGdpdmVuIHBhZ2VzLiBCZSBzdXJlIHRvIGxvYWQgdGhlIFxuXHQgKiBwYWdlcyBmaXJzdCBiZWZvcmUgZG9pbmcgdGhpcy4gVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgdXNlZCBmb3IgXG5cdCAqIGN1c3RvbWl6ZWQgRXhwcmVzcyBhcHBsaWNhdGlvbnMuIElmIHlvdSB3aXNoIHRvIHVzZSB0aGUgbG9hZGVkIHJvdXRlcyBcblx0ICogZnJvbSB0aGlzIEhvdFN0YXEgb2JqZWN0IHdpdGggSG90SFRUUFNlcnZlciwgYmUgc3VyZSB0byB1c2UgXG5cdCAqIHRoZSBsb2FkSG90U2l0ZSBtZXRob2QgaW4gSG90SFRUUFNlcnZlci5cblx0ICovXG5cdGFzeW5jIGNyZWF0ZUV4cHJlc3NSb3V0ZXMgKGV4cHJlc3NBcHA6IGFueSwganNTcmNQYXRoOiBzdHJpbmcgPSBcIi4vanMvSG90U3RhcS5taW4uanNcIik6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGZvciAobGV0IGtleSBpbiB0aGlzLnBhZ2VzKVxuXHRcdHtcblx0XHRcdGxldCBwYWdlOiBIb3RQYWdlID0gdGhpcy5wYWdlc1trZXldO1xuXHRcdFx0Y29uc3QgY29udGVudDogc3RyaW5nID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUNvbnRlbnQgKHBhZ2Uucm91dGUsIHBhZ2UubmFtZSwgcGFnZS5maWxlc1swXS51cmwsIGpzU3JjUGF0aCk7XG5cblx0XHRcdGV4cHJlc3NBcHAuZ2V0IChwYWdlLnJvdXRlLCAocmVxOiBhbnksIHJlczogYW55KSA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYFNlbmRpbmcgY3VzdG9tIEV4cHJlc3MgY29udGVudC5gKTtcblx0XHRcdFx0XHRyZXMuc3RhdHVzICgyMDApLnNlbmQgKGNvbnRlbnQpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgdGVzdGVyIGZvciB1c2UgbGF0ZXIuXG5cdCAqL1xuXHRhZGRUZXN0ZXIgKHRlc3RlcjogSG90VGVzdGVyKTogdm9pZFxuXHR7XG5cdFx0dGhpcy50ZXN0ZXJzW3Rlc3Rlci5uYW1lXSA9IHRlc3Rlcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGxpc3Qgb2YgbWFwcyBmb3IgdGVzdGluZyBmcm9tIHRoZSBIb3RTaXRlLlxuXHQgKi9cblx0Z2V0V2ViVGVzdGluZ01hcHMgKCk6IHN0cmluZ1tdXG5cdHtcblx0XHRpZiAodGhpcy5ob3RTaXRlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiTm8gSG90U2l0ZSB3YXMgbG9hZGVkIVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIGRvZXMgbm90IGhhdmUgYSB0ZXN0aW5nIG9iamVjdCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgZG9lcyBub3QgaGF2ZSBhIHRlc3Rpbmcgd2ViIG9iamVjdCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLm1hcHMgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSB0ZXN0aW5nIG9iamVjdCBkb2VzIG5vdCBoYXZlIGFueSBtYXBzIVwiKTtcblxuXHRcdHJldHVybiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLm1hcHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgbGlzdCBvZiBtYXBzIGZvciB0ZXN0aW5nIGZyb20gdGhlIEhvdFNpdGUuXG5cdCAqL1xuXHRnZXRBUElUZXN0aW5nTWFwcyAoKTogc3RyaW5nW11cblx0e1xuXHRcdGlmICh0aGlzLmhvdFNpdGUgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJObyBIb3RTaXRlIHdhcyBsb2FkZWQhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgZG9lcyBub3QgaGF2ZSBhIHRlc3Rpbmcgb2JqZWN0IVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy5hcGkgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSBkb2VzIG5vdCBoYXZlIGEgdGVzdGluZyBhcGkgb2JqZWN0IVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy5hcGkubWFwcyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIHRlc3Rpbmcgb2JqZWN0IGRvZXMgbm90IGhhdmUgYW55IG1hcHMhXCIpO1xuXG5cdFx0cmV0dXJuICh0aGlzLmhvdFNpdGUudGVzdGluZy5hcGkubWFwcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgcm91dGUncyBrZXkgZnJvbSBhIHJvdXRlJ3MgbmFtZS5cblx0ICovXG5cdGdldFJvdXRlS2V5RnJvbU5hbWUgKG5hbWU6IHN0cmluZyk6IHN0cmluZ1xuXHR7XG5cdFx0bGV0IGZvdW5kS2V5OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLmhvdFNpdGUucm91dGVzICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUucm91dGVzKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHJvdXRlOiBIb3RTaXRlUm91dGUgPSB0aGlzLmhvdFNpdGUucm91dGVzW2tleV07XG5cblx0XHRcdFx0XHRpZiAocm91dGUubmFtZSA9PT0gbmFtZSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRmb3VuZEtleSA9IGtleTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmhvdFNpdGUud2ViICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUud2ViKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHdlYiA9IHRoaXMuaG90U2l0ZS53ZWJba2V5XTtcblxuXHRcdFx0XHRcdGlmICh3ZWIgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRmb3VuZEtleSA9IGtleTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChmb3VuZEtleSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgcm91dGUgZnJvbSBhIHJvdXRlJ3MgbmFtZS5cblx0ICovXG5cdGdldFJvdXRlRnJvbU5hbWUgKG5hbWU6IHN0cmluZyk6IEhvdFNpdGVSb3V0ZVxuXHR7XG5cdFx0bGV0IGZvdW5kUm91dGU6IEhvdFNpdGVSb3V0ZSA9IG51bGw7XG5cdFx0bGV0IGZvdW5kS2V5OiBzdHJpbmcgPSB0aGlzLmdldFJvdXRlS2V5RnJvbU5hbWUgKG5hbWUpO1xuXG5cdFx0aWYgKGZvdW5kS2V5ICE9PSBcIlwiKVxuXHRcdFx0Zm91bmRSb3V0ZSA9IHRoaXMuaG90U2l0ZS5yb3V0ZXNbZm91bmRLZXldO1xuXG5cdFx0cmV0dXJuIChmb3VuZFJvdXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIHRlc3RzLlxuXHQgKiBcblx0ICogQHBhcmFtIHRlc3Rlck5hbWUgVGhlIHRlc3RlciB0byB1c2UgdG8gZXhlY3V0ZSB0ZXN0cy5cblx0ICogQHBhcmFtIG1hcE5hbWUgVGhlIG1hcCBvciBtYXBzIHRvIHVzZSB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRlc3RzLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RzICh0ZXN0ZXJOYW1lOiBzdHJpbmcsIG1hcE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCB0ZXN0ZXI6IEhvdFRlc3RlciA9IHRoaXMudGVzdGVyc1t0ZXN0ZXJOYW1lXTtcblxuXHRcdGlmICh0ZXN0ZXIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBleGVjdXRlIHRlc3RzLiBUZXN0ZXIgJHt0ZXN0ZXJOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdHJldHVybiAodGVzdGVyLmV4ZWN1dGUgKG1hcE5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFsbCB3ZWIgdGVzdHMgZnJvbSB0aGUgSG90U2l0ZSB0ZXN0aW5nIHdlYiBvYmplY3QuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGVzdGVyTmFtZSBUaGUgdGVzdGVyIHRvIHVzZSB0byBleGVjdXRlIHRlc3RzLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZUFsbFdlYlRlc3RzICh0ZXN0ZXJOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgbWFwczogc3RyaW5nW10gPSB0aGlzLmdldFdlYlRlc3RpbmdNYXBzICgpO1xuXHRcdGxldCB0ZXN0ZXI6IEhvdFRlc3RlciA9IHRoaXMudGVzdGVyc1t0ZXN0ZXJOYW1lXTtcblxuXHRcdGlmICh0ZXN0ZXIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBleGVjdXRlIHRlc3RzLiBUZXN0ZXIgJHt0ZXN0ZXJOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgbWFwcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgbWFwTmFtZTogc3RyaW5nID0gbWFwc1tpSWR4XTtcblxuXHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdHMgKHRlc3Rlck5hbWUsIG1hcE5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFsbCBhcGkgdGVzdHMgZnJvbSB0aGUgSG90U2l0ZSB0ZXN0aW5nIGFwaSBvYmplY3QuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGVzdGVyTmFtZSBUaGUgdGVzdGVyIHRvIHVzZSB0byBleGVjdXRlIHRlc3RzLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZUFsbEFQSVRlc3RzICh0ZXN0ZXJOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgbWFwczogc3RyaW5nW10gPSB0aGlzLmdldEFQSVRlc3RpbmdNYXBzICgpO1xuXHRcdGxldCB0ZXN0ZXI6IEhvdFRlc3RlciA9IHRoaXMudGVzdGVyc1t0ZXN0ZXJOYW1lXTtcblxuXHRcdGlmICh0ZXN0ZXIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBleGVjdXRlIHRlc3RzLiBUZXN0ZXIgJHt0ZXN0ZXJOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKCgpID0+IGBFeGVjdXRpbmcgYWxsIEFQSSB0ZXN0cyBmb3IgdGVzdGVyICR7dGVzdGVyTmFtZX0uIE1hcHM6ICR7SlNPTi5zdHJpbmdpZnkgKG1hcHMpfWApO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXBzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSBtYXBzW2lJZHhdO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZSwgbWFwTmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYSBwYWdlIGFuZCBnZXQgdGhlIHJlc3VsdC5cblx0ICovXG5cdGFzeW5jIHByb2Nlc3MgKHBhZ2VOYW1lOiBzdHJpbmcsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gdGhpcy5nZXRQYWdlIChwYWdlTmFtZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgcGFnZS5wcm9jZXNzIChhcmdzKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGEgbG9jYWwgZmlsZSBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc0xvY2FsRmlsZSAobG9jYWxGaWxlcGF0aDogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSBsb2NhbEZpbGVwYXRoLCBhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgcHJvY2Vzc29yOiBIb3RTdGFxID0gbmV3IEhvdFN0YXEgKCk7XG5cdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XCJsb2NhbEZpbGVcIjogbG9jYWxGaWxlcGF0aFxuXHRcdH0pO1xuXHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHRsZXQgcGFnZTogSG90UGFnZSA9IG5ldyBIb3RQYWdlICh7XG5cdFx0XHRcdFwicHJvY2Vzc29yXCI6IHByb2Nlc3Nvcixcblx0XHRcdFx0XCJuYW1lXCI6IG5hbWUsXG5cdFx0XHRcdFwiZmlsZXNcIjogW2ZpbGVdXG5cdFx0XHR9KTtcblx0XHRwcm9jZXNzb3IuYWRkUGFnZSAocGFnZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgcHJvY2Vzc29yLnByb2Nlc3MgKG5hbWUsIGFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYSB1cmwgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHByb2Nlc3NVcmwgKG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XCJ1cmxcIjogb3B0aW9ucy51cmxcblx0XHR9KTtcblxuXHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHRsZXQgcGFnZTogSG90UGFnZSA9IG5ldyBIb3RQYWdlICh7XG5cdFx0XHRcdFwicHJvY2Vzc29yXCI6IG9wdGlvbnMucHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogb3B0aW9ucy5uYW1lLFxuXHRcdFx0XHRcImZpbGVzXCI6IFtmaWxlXSxcblx0XHRcdFx0XCJ0ZXN0ZXJOYW1lXCI6IG9wdGlvbnMudGVzdGVyTmFtZSxcblx0XHRcdFx0XCJ0ZXN0ZXJNYXBcIjogb3B0aW9ucy50ZXN0ZXJNYXBcblx0XHRcdH0pO1xuXHRcdG9wdGlvbnMucHJvY2Vzc29yLmFkZFBhZ2UgKHBhZ2UpO1xuXHRcdGxldCByZXN1bHQ6IHN0cmluZyA9IGF3YWl0IG9wdGlvbnMucHJvY2Vzc29yLnByb2Nlc3MgKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5hcmdzKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGNvbnRlbnQgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHByb2Nlc3NDb250ZW50IChvcHRpb25zOiBIb3RTdGFydE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBmaWxlOiBIb3RGaWxlID0gbmV3IEhvdEZpbGUgKHtcblx0XHRcdFwiY29udGVudFwiOiBvcHRpb25zLmNvbnRlbnRcblx0XHR9KTtcblx0XHRhd2FpdCBmaWxlLmxvYWQgKCk7XG5cdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSBuZXcgSG90UGFnZSAoe1xuXHRcdFx0XHRcInByb2Nlc3NvclwiOiBvcHRpb25zLnByb2Nlc3Nvcixcblx0XHRcdFx0XCJuYW1lXCI6IG9wdGlvbnMubmFtZSxcblx0XHRcdFx0XCJmaWxlc1wiOiBbZmlsZV1cblx0XHRcdH0pO1xuXHRcdG9wdGlvbnMucHJvY2Vzc29yLmFkZFBhZ2UgKHBhZ2UpO1xuXHRcdGxldCByZXN1bHQ6IHN0cmluZyA9IGF3YWl0IG9wdGlvbnMucHJvY2Vzc29yLnByb2Nlc3MgKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5hcmdzKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaGVuIHRoZSB3aW5kb3cgaGFzIGZpbmlzaGVkIGxvYWRpbmcsIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uLlxuXHQgKiBUaGlzIGlzIG1lYW50IGZvciB3ZWIgYnJvd3NlciB1c2Ugb25seS5cblx0ICovXG5cdHN0YXRpYyBvblJlYWR5IChyZWFkeUZ1bmM6IChvdXRwdXQ6IHN0cmluZykgPT4gdm9pZCk6IHZvaWRcblx0e1xuXHRcdEhvdFN0YXEub25SZWFkeUV2ZW50ID0gcmVhZHlGdW5jO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2UgdGhlIGN1cnJlbnQgSFRNTCBwYWdlIHdpdGggdGhlIG91dHB1dC5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgdXNlT3V0cHV0IChvdXRwdXQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmIChIb3RTdGFxLm9uT3V0cHV0UmVjZWl2ZWQgIT0gbnVsbClcblx0XHRcdEhvdFN0YXEub25PdXRwdXRSZWNlaXZlZCAob3V0cHV0KTtcblxuXHRcdGxldCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyICgpO1xuXHRcdGxldCBjaGlsZCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcgKG91dHB1dCwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0bGV0IGh0bWxPYmo6IEhUTUxIdG1sRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF07XG5cblx0XHRodG1sT2JqLmlubmVySFRNTCA9IGNoaWxkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF0uaW5uZXJIVE1MO1xuXG5cdFx0Ly8gVGhhbmtzIHRvIG5ld2Z1cm5pdHVyZXkgYXQ6IFxuXHRcdC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIyOTQ1ODg0L2RvbXBhcnNlci1hcHBlbmRpbmctc2NyaXB0LXRhZ3MtdG8taGVhZC1ib2R5LWJ1dC1ub3QtZXhlY3V0aW5nXG5cdFx0bGV0IHRtcFNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7XG5cdFx0aWYgKHRtcFNjcmlwdHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly8gcHVzaCBhbGwgb2YgdGhlIGRvY3VtZW50J3Mgc2NyaXB0IHRhZ3MgaW50byBhbiBhcnJheVxuXHRcdFx0Ly8gKHRvIHByZXZlbnQgZG9tIG1hbmlwdWxhdGlvbiB3aGlsZSBpdGVyYXRpbmcgb3ZlciBkb20gbm9kZXMpXG5cdFx0XHRsZXQgc2NyaXB0czogSFRNTFNjcmlwdEVsZW1lbnRbXSA9IFtdO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0bXBTY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHNjcmlwdHMucHVzaCh0bXBTY3JpcHRzW2ldKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCBzY3JpcHQgdGFncyBhbmQgY3JlYXRlIGR1cGxpY2F0ZSB0YWdzIGZvciBlYWNoXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0bGV0IHM6IEhUTUxTY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG5cblx0XHRcdFx0Ly8gYWRkIHRoZSBuZXcgbm9kZSB0byB0aGUgcGFnZVxuXHRcdFx0XHRzY3JpcHRzW2ldLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQocyk7XG5cblx0XHRcdFx0Ly8gcmVtb3ZlIHRoZSBvcmlnaW5hbCAobm9uLWV4ZWN1dGluZykgbm9kZSBmcm9tIHRoZSBwYWdlXG5cdFx0XHRcdHNjcmlwdHNbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRzW2ldKTtcblxuXHRcdFx0XHRhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPiAoKHJlc29sdmUyLCByZWplY3QyKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHMub25sb2FkID0gKCkgPT5cblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUyICgpO1xuXHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRsZXQgaGFzU3JjOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRcdFx0XHRcdGlmIChzY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSAoXCJzcmNcIikgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInNyY1wiKSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHMuc2V0QXR0cmlidXRlIChcInNyY1wiLCBzY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSAoXCJzcmNcIikpO1xuXHRcdFx0XHRcdFx0XHRcdGhhc1NyYyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInR5cGVcIikgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInR5cGVcIikgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0cy5zZXRBdHRyaWJ1dGUgKFwidHlwZVwiLCBzY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSAoXCJ0eXBlXCIpKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cy5pbm5lckhUTUwgPSBzY3JpcHRzW2ldLmlubmVySFRNTDtcblxuXHRcdFx0XHRcdFx0aWYgKGhhc1NyYyA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUyICgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChIb3RTdGFxLmRpc3BhdGNoUmVhZHlFdmVudHMgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCAobmV3IEV2ZW50IChcIkRPTUNvbnRlbnRMb2FkZWRcIikpO1xuXHRcdFx0d2luZG93LmRpc3BhdGNoRXZlbnQgKG5ldyBFdmVudChcImxvYWRcIikpO1xuXHRcdH1cblxuXHRcdGlmIChIb3RTdGFxLm9uUmVhZHlFdmVudCAhPSBudWxsKVxuXHRcdFx0SG90U3RhcS5vblJlYWR5RXZlbnQgKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgdGVzdGVycyB0byBsb2FkLlxuXHQgKiBcblx0ICogQGZpeG1lIFRoaXMgZG9lcyBub3Qgd2FpdCBmb3IgQUxMIHRlc3RlcnMgdG8gZmluaXNoIGxvYWRpbmcuIE9ubHkgXG5cdCAqIHRoZSBmaXJzdCBvbmUuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgd2FpdEZvclRlc3RlcnMgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHdoaWxlIChIb3RTdGFxLmlzUmVhZHlGb3JUZXN0aW5nID09PSBmYWxzZSlcblx0XHRcdGF3YWl0IEhvdFN0YXEud2FpdCAoMTApO1xuXG5cdFx0aWYgKEhvdFN0YXEub25SZWFkeUZvclRlc3RpbmcgIT0gbnVsbClcblx0XHRcdGF3YWl0IEhvdFN0YXEub25SZWFkeUZvclRlc3RpbmcgKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0dXAgdGhlIHRlc3RlcnMgYXBpLCBpZiBhbnkuXG5cdCAqL1xuXHRzdGF0aWMgc2V0dXBUZXN0ZXJzIChwcm9jZXNzb3I6IEhvdFN0YXEsIG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucylcblx0e1xuXHRcdGlmIChwcm9jZXNzb3IubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHR7XG5cdFx0XHRpZiAocHJvY2Vzc29yLnRlc3RlckFQSSA9PSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAob3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID09IG51bGwpXG5cdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gXCJcIjtcblxuXHRcdFx0XHRpZiAob3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID09PSBcIlwiKVxuXHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IFwiaHR0cDovLzEyNy4wLjAuMTo4MTgyXCI7XG5cblx0XHRcdFx0bGV0IGNsaWVudDogSG90Q2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdFx0bGV0IHRlc3RlckFQSTogSG90VGVzdGVyQVBJID0gbmV3IEhvdFRlc3RlckFQSSAob3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsLCBjbGllbnQpO1xuXHRcdFx0XHR0ZXN0ZXJBUEkuY29ubmVjdGlvbi5hcGkgPSB0ZXN0ZXJBUEk7XG5cdFx0XHRcdHByb2Nlc3Nvci50ZXN0ZXJBUEkgPSB0ZXN0ZXJBUEk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHVwIHRoZSB0ZXN0ZXJzIGFwaSBvbiB0aGUgY2xpZW50LCBpZiBuZWVkZWQuXG5cdCAqL1xuXHRzdGF0aWMgc2V0dXBDbGllbnRUZXN0ZXJzIChwcm9jZXNzb3I6IEhvdFN0YXEpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAocHJvY2Vzc29yLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0e1xuXHRcdFx0b3V0cHV0ICs9IFxuYDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+XG5mdW5jdGlvbiBob3RzdGFxX2lzRG9jdW1lbnRSZWFkeSAoKVxue1xuaWYgKHdpbmRvd1tcIkhvdFwiXSAhPSBudWxsKVxue1xuaWYgKEhvdC5Nb2RlID09PSBIb3RTdGFxV2ViLkRldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG57XG5sZXQgZnVuYyA9IGZ1bmN0aW9uICgpXG5cdHtcblx0XHRpZiAoSG90LlRlc3RlckFQSSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIChcImJlZm9yZXVubG9hZFwiLFxuXHRcdFx0XHQoZXZlbnQpID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRIb3RTdGFxV2ViLkhvdFN0YXEuaXNSZWFkeUZvclRlc3RpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRcdEhvdC5UZXN0ZXJBUEkudGVzdGVyLnBhZ2VVbmxvYWRlZCAoe1xuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJOYW1lOiBIb3QuQ3VycmVudFBhZ2UudGVzdGVyTmFtZVxuXHRcdFx0XHRcdFx0fSkudGhlbiAoZnVuY3Rpb24gKHJlc3ApXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAocmVzcC5lcnJvciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChyZXNwLmVycm9yICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKHJlc3AuZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgdGVzdFBhdGhzID0ge307XG5cdFx0XHRsZXQgdGVzdEVsZW1lbnRzID0gSlNPTi5zdHJpbmdpZnkgKEhvdC5DdXJyZW50UGFnZS50ZXN0RWxlbWVudHMpO1xuXHRcdFx0bGV0IHRlc3RNYXBzID0gSlNPTi5zdHJpbmdpZnkgKEhvdC5DdXJyZW50UGFnZS50ZXN0TWFwcyk7XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBIb3QuQ3VycmVudFBhZ2UudGVzdFBhdGhzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdGVzdFBhdGggPSBIb3QuQ3VycmVudFBhZ2UudGVzdFBhdGhzW2tleV07XG5cblx0XHRcdFx0dGVzdFBhdGhzW2tleV0gPSB0ZXN0UGF0aC50b1N0cmluZyAoKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IHRlc3RQYXRoc1N0ciA9IEpTT04uc3RyaW5naWZ5ICh0ZXN0UGF0aHMpO1xuXG5cdFx0XHRIb3QuVGVzdGVyQVBJLnRlc3Rlci5wYWdlTG9hZGVkICh7XG5cdFx0XHRcdFx0dGVzdGVyTmFtZTogSG90LkN1cnJlbnRQYWdlLnRlc3Rlck5hbWUsXG5cdFx0XHRcdFx0dGVzdEVsZW1lbnRzOiB0ZXN0RWxlbWVudHMsXG5cdFx0XHRcdFx0dGVzdFBhdGhzOiB0ZXN0UGF0aHNTdHJcblx0XHRcdFx0fSkudGhlbiAoZnVuY3Rpb24gKHJlc3ApXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHJlc3AuZXJyb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHJlc3AuZXJyb3IgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChyZXNwLmVycm9yKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0SG90U3RhcVdlYi5Ib3RTdGFxLmlzUmVhZHlGb3JUZXN0aW5nID0gdHJ1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cbmlmICgoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiKSB8fCAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJpbnRlcmFjdGl2ZVwiKSlcblx0ZnVuYyAoKTtcbmVsc2Vcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciAoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmMpO1xufVxufVxufVxuXG5ob3RzdGFxX2lzRG9jdW1lbnRSZWFkeSAoKTtcbjwvc2NyaXB0PmA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gdGhlIHdpbmRvdyBoYXMgZmluaXNoZWQgbG9hZGluZywgZXhlY3V0ZSB0aGUgZnVuY3Rpb24uIFRoaXMgXG5cdCAqIGlzIG1lYW50IHRvIHN0YXJ0IGV4ZWN1dGluZyBIb3RTdGFxLlxuXHQgKi9cblx0c3RhdGljIG9uSW5pdGFsTG9hZCAocmVhZHlGdW5jOiAoKSA9PiB2b2lkKTogdm9pZFxuXHR7XG5cdFx0aWYgKChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIpIHx8IChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImludGVyYWN0aXZlXCIpKVxuXHRcdFx0cmVhZHlGdW5jICgpO1xuXHRcdGVsc2Vcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIChcImxvYWRcIiwgcmVhZHlGdW5jLCB7IFwib25jZVwiOiB0cnVlIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW5kIHJlcGxhY2UgdGhlIGN1cnJlbnQgSFRNTCBwYWdlIHdpdGggdGhlIGhvdHQgc2NyaXB0IGZyb20gdGhlIGdpdmVuIHVybC5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZGlzcGxheVVybCAodXJsOiBzdHJpbmcgfCBIb3RTdGFydE9wdGlvbnMsIG5hbWU6IHN0cmluZyA9IG51bGwsIFxuXHRcdHByb2Nlc3NvcjogSG90U3RhcSA9IG51bGwsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPEhvdFN0YXE+XG5cdHtcblx0XHRyZXR1cm4gKG5ldyBQcm9taXNlPEhvdFN0YXE+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRIb3RTdGFxLm9uSW5pdGFsTG9hZCAoYXN5bmMgKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb3B0aW9uczogSG90U3RhcnRPcHRpb25zID0ge1xuXHRcdFx0XHRcdFx0XHRcdFwidXJsXCI6IFwiXCJcblx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0aWYgKG5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmw7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmwubmFtZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gbmFtZTtcblxuXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMubmFtZSA9PT0gXCJcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmw7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmwubmFtZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy51cmwgPSB1cmw7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMudXJsID0gdXJsLnVybDtcblxuXHRcdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodXJsLnByb2Nlc3NvciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yID0gdXJsLnByb2Nlc3Nvcjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhcmdzID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodXJsLmFyZ3MgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSB1cmwuYXJncztcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICh1cmwudGVzdGVyTWFwICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJNYXAgPSB1cmwudGVzdGVyTWFwO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh1cmwudGVzdGVyTmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyTmFtZSA9IHVybC50ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh1cmwudGVzdGVyQVBJQmFzZVVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IHVybC50ZXN0ZXJBUElCYXNlVXJsO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvciA9IG5ldyBIb3RTdGFxICgpO1xuXG5cdFx0XHRcdFx0XHRIb3RTdGFxLnNldHVwVGVzdGVycyAocHJvY2Vzc29yLCBvcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0b3B0aW9ucy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0XHRcdFx0XHRvcHRpb25zLmFyZ3MgPSBhcmdzO1xuXG5cdFx0XHRcdFx0XHRpZiAob3B0aW9ucy51cmwuaW5kZXhPZiAoXCJoc3Rxc2VydmVcIikgPCAwKVxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLnVybCArPSBcIj9oc3Rxc2VydmU9bmFoZmFtXCI7XG5cblx0XHRcdFx0XHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IGF3YWl0IEhvdFN0YXEucHJvY2Vzc1VybCAob3B0aW9ucyk7XG5cblx0XHRcdFx0XHRcdG91dHB1dCArPSBIb3RTdGFxLnNldHVwQ2xpZW50VGVzdGVycyAocHJvY2Vzc29yKTtcblxuXHRcdFx0XHRcdFx0YXdhaXQgSG90U3RhcS51c2VPdXRwdXQgKG91dHB1dCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlIChwcm9jZXNzb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW5kIHJlcGxhY2UgdGhlIGN1cnJlbnQgSFRNTCBwYWdlIHdpdGggdGhlIGhvdHQgc2NyaXB0LlxuXHQgKiBUaGlzIGlzIG1lYW50IGZvciB3ZWIgYnJvd3NlciB1c2Ugb25seS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBkaXNwbGF5Q29udGVudCAoY29udGVudDogc3RyaW5nIHwgSG90U3RhcnRPcHRpb25zLCBuYW1lOiBzdHJpbmcgPSBudWxsLCBcblx0XHRcdHByb2Nlc3NvcjogSG90U3RhcSA9IG51bGwsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPEhvdFN0YXE+XG5cdHtcblx0XHRyZXR1cm4gKG5ldyBQcm9taXNlPEhvdFN0YXE+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRIb3RTdGFxLm9uSW5pdGFsTG9hZCAoYXN5bmMgKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb3B0aW9uczogSG90U3RhcnRPcHRpb25zID0ge1xuXHRcdFx0XHRcdFx0XHRcdFwiY29udGVudFwiOiBcIlwiXG5cdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdGlmIChuYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGNvbnRlbnQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSBjb250ZW50Lm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IG5hbWU7XG5cblx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm5hbWUgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGNvbnRlbnQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IFwiXCI7IC8vLyBAZml4bWUgSXMgdGhpcyBvayB0byBkbz9cblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IGNvbnRlbnQubmFtZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAoY29udGVudCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQ7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQuY29udGVudDtcblxuXHRcdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29udGVudC5wcm9jZXNzb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvciA9IGNvbnRlbnQucHJvY2Vzc29yO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGFyZ3MgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjb250ZW50LmFyZ3MgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBjb250ZW50LmFyZ3M7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoY29udGVudC50ZXN0ZXJNYXAgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck1hcCA9IGNvbnRlbnQudGVzdGVyTWFwO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChjb250ZW50LnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck5hbWUgPSBjb250ZW50LnRlc3Rlck5hbWU7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGNvbnRlbnQudGVzdGVyQVBJQmFzZVVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IGNvbnRlbnQudGVzdGVyQVBJQmFzZVVybDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSBuZXcgSG90U3RhcSAoKTtcblxuXHRcdFx0XHRcdFx0SG90U3RhcS5zZXR1cFRlc3RlcnMgKHByb2Nlc3Nvciwgb3B0aW9ucyk7XG5cblx0XHRcdFx0XHRcdG9wdGlvbnMucHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuXHRcdFx0XHRcdFx0b3B0aW9ucy5hcmdzID0gYXJncztcblxuXHRcdFx0XHRcdFx0bGV0IG91dHB1dDogc3RyaW5nID0gYXdhaXQgSG90U3RhcS5wcm9jZXNzQ29udGVudCAob3B0aW9ucyk7XG5cblx0XHRcdFx0XHRcdGF3YWl0IEhvdFN0YXEudXNlT3V0cHV0IChvdXRwdXQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSAocHJvY2Vzc29yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pKTtcblx0fVxufVxuXG5pZiAodHlwZW9mIChkb2N1bWVudCkgIT09IFwidW5kZWZpbmVkXCIpXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIChcImxvYWRcIiwgaG90U3RhcVdlYlN0YXJ0KTtcbiIsImltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5pbXBvcnQgeyBIb3RDb21wb25lbnQsIEhvdENvbXBvbmVudE91dHB1dCB9IGZyb20gXCIuL0hvdENvbXBvbmVudFwiO1xuaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgY29tcG9uZW50IGZvciB1c2UgYXMgYSBIVE1MIHRhZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ29tcG9uZW50ICh0YWc6IHN0cmluZywgZWxlbWVudE9wdGlvbnM6IEVsZW1lbnREZWZpbml0aW9uT3B0aW9ucyA9IHVuZGVmaW5lZCk6IHZvaWRcbntcblx0aWYgKCh0YWcgPT0gbnVsbCkgfHwgKHRhZyA9PT0gXCJcIikpXG5cdFx0dGhyb3cgbmV3IEVycm9yIChgQWxsIGNvbXBvbmVudHMgbXVzdCBoYXZlIGEgdGFnIWApO1xuXG5cdGlmIChjdXN0b21FbGVtZW50cy5nZXQgKHRhZykgIT09IHVuZGVmaW5lZClcblx0e1xuXHRcdC8vLyBAZml4bWUgVGhpcyBlbGVtZW50IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gU2hvdWxkIHRoaXMgdGhyb3cgYW4gZXJyb3Igb3Igd2FybmluZz8gSSBkb24ndCB0aGluayBpdCBzaG91bGQuLi5cblxuXHRcdHJldHVybjtcblx0fVxuXG5cdGxldCBwcm9jZXNzb3JDb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzO1xuXG5cdGN1c3RvbUVsZW1lbnRzLmRlZmluZSAodGFnLCBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50XG5cdFx0e1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgY29ubmVjdGVkIEhvdENvbXBvbmVudC5cblx0XHRcdCAqL1xuXHRcdFx0Y29tcG9uZW50OiBIb3RDb21wb25lbnQ7XG5cdFx0XG5cdFx0XHRjb25zdHJ1Y3RvciAoKVxuXHRcdFx0e1xuXHRcdFx0XHRzdXBlciAoKTtcblxuXHRcdFx0XHRsZXQgY29tcG9uZW50SW5mbyA9IHByb2Nlc3NvckNvbXBvbmVudHNbdGFnXTtcblx0XHRcdFx0dGhpcy5jb21wb25lbnQgPSBuZXcgY29tcG9uZW50SW5mby5jb21wb25lbnRUeXBlIChjb21wb25lbnRJbmZvLnByb2Nlc3NvciwgY29tcG9uZW50SW5mby5hcGkpO1xuXG5cdFx0XHRcdGxldCBjb21wSHRtbEVsZW1lbnQgPSB0aGlzO1xuXHRcdFxuXHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdGNvbXBIdG1sRWxlbWVudC5ob3RDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudDtcblx0XHRcblx0XHRcdFx0dGhpcy5jb21wb25lbnQuaHRtbEVsZW1lbnRzID0gW2NvbXBIdG1sRWxlbWVudF07XG5cdFx0XHRcdHRoaXMuY29tcG9uZW50LmlubmVyID0gdGhpcy5pbm5lckhUTUw7XG5cdFx0XG5cdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5oYW5kbGVBdHRyaWJ1dGVzICE9IG51bGwpXG5cdFx0XHRcdFx0dGhpcy5jb21wb25lbnQuaGFuZGxlQXR0cmlidXRlcyAodGhpcy5hdHRyaWJ1dGVzKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgYXR0cjogQXR0ciA9IHRoaXMuYXR0cmlidXRlc1tpSWR4XTtcblx0XHRcdFx0XHRcdGNvbnN0IGF0dHJOYW1lOiBzdHJpbmcgPSBhdHRyLm5hbWUudG9Mb3dlckNhc2UgKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBhdHRyVmFsdWU6IHN0cmluZyA9IGF0dHIudmFsdWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAoYXR0ck5hbWUgPT09IFwiaWRcIilcblx0XHRcdFx0XHRcdFx0dGhpcy5jb21wb25lbnQubmFtZSA9IGF0dHJWYWx1ZTtcblx0XHRcblx0XHRcdFx0XHRcdGlmIChhdHRyTmFtZSA9PT0gXCJuYW1lXCIpXG5cdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9uZW50Lm5hbWUgPSBhdHRyVmFsdWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAoYXR0ck5hbWUgPT09IFwidmFsdWVcIilcblx0XHRcdFx0XHRcdFx0dGhpcy5jb21wb25lbnQudmFsdWUgPSBhdHRyVmFsdWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAoYXR0ck5hbWUuaW5kZXhPZiAoXCJob3QtXCIpID4gLTEpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGF0dHJUZW1wTmFtZTogc3RyaW5nID0gYXR0ck5hbWUuc3Vic3RyaW5nICg0KTtcblx0XHRcblx0XHRcdFx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0dGhpcy5jb21wb25lbnRbYXR0clRlbXBOYW1lXSA9IGF0dHJWYWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUHJlT3V0cHV0ICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQub25QcmVPdXRwdXQgKCkgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IG91dHB1dHMgPSB0aGlzLmNvbXBvbmVudC5vdXRwdXQgKCk7XG5cdFx0XG5cdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBvc3RPdXRwdXQgIT0gbnVsbClcblx0XHRcdFx0XHRvdXRwdXRzID0gdGhpcy5jb21wb25lbnQub25Qb3N0T3V0cHV0IChvdXRwdXRzKTtcblx0XHRcblx0XHRcdFx0bGV0IGNvbXBvbmVudE91dHB1dHM6IEhvdENvbXBvbmVudE91dHB1dFtdID0gW107XG5cdFx0XG5cdFx0XHRcdGlmICh0eXBlb2YgKG91dHB1dHMpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdGNvbXBvbmVudE91dHB1dHMucHVzaCAoeyBodG1sOiBvdXRwdXRzIH0pO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAob3V0cHV0cyBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdFx0Y29tcG9uZW50T3V0cHV0cyA9IG91dHB1dHM7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0Y29tcG9uZW50T3V0cHV0cyA9IFtvdXRwdXRzXTtcblx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRmb3IgKGxldCBpS2R4ID0gMDsgaUtkeCA8IGNvbXBvbmVudE91dHB1dHMubGVuZ3RoOyBpS2R4KyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgb3V0cHV0ID0gY29tcG9uZW50T3V0cHV0c1tpS2R4XTtcblx0XHRcdFx0XHRsZXQgaHRtbFN0cjogc3RyaW5nID0gb3V0cHV0Lmh0bWw7XG5cdFx0XHRcdFx0bGV0IGFkZEZ1bmN0aW9uc1RvOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRsZXQgcGxhY2VIZXJlOiBzdHJpbmcgPSB0aGlzLmNvbXBvbmVudFtcInBsYWNlLWhlcmVcIl07XG5cdFx0XG5cdFx0XHRcdFx0aWYgKG91dHB1dC5hZGRGdW5jdGlvbnNUbyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0YWRkRnVuY3Rpb25zVG8gPSBvdXRwdXQuYWRkRnVuY3Rpb25zVG87XG5cblx0XHRcdFx0XHRpZiAocGxhY2VIZXJlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRvdXRwdXQuZG9jdW1lbnRTZWxlY3RvciA9IGBob3QtcGxhY2UtaGVyZVtuYW1lPVwiJHtwbGFjZUhlcmV9XCJdYDtcblx0XHRcblx0XHRcdFx0XHRsZXQgc3RyOiBzdHJpbmcgPSBIb3RGaWxlLnBhcnNlQ29udGVudCAoaHRtbFN0ciwgdHJ1ZSwgeyBcIm91dHB1dENvbW1hbmRzXCI6IGZhbHNlIH0pO1xuXHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBhcnNlZCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0c3RyID0gdGhpcy5jb21wb25lbnQub25QYXJzZWQgKHN0cik7XG5cdFx0XG5cdFx0XHRcdFx0bGV0IGh0bWxIYW5kbGVyOiB7IGZpeGVkU3RyOiBzdHJpbmcsIHF1ZXJ5U2VsZWN0b3I6IHN0cmluZzsgfSA9IHsgZml4ZWRTdHI6IFwiXCIsIHF1ZXJ5U2VsZWN0b3I6IFwiXCIgfTtcblx0XHRcblx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQub25GaXhIVE1MICE9IG51bGwpXG5cdFx0XHRcdFx0XHRodG1sSGFuZGxlciA9IHRoaXMuY29tcG9uZW50Lm9uRml4SFRNTCAoc3RyKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRodG1sSGFuZGxlciA9IEhvdFN0YXEuZml4SFRNTCAoc3RyKTtcblxuXHRcdFx0XHRcdGxldCBjaGlsZHJlblRvUmVhZGQ6IE5vZGVbXSA9IFtdO1xuXHRcdFxuXHRcdFx0XHRcdC8vIFNhdmUgdGhlIGNoaWxkcmVuIGZyb20gYmVpbmcgcmVwbGFjZWQuXG5cdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9ICh0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDEpOyBpSWR4ID4gLTE7IGlJZHgtLSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgY2hpbGQ6IE5vZGUgPSB0aGlzLmNoaWxkcmVuW2lJZHhdO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y2hpbGRyZW5Ub1JlYWRkLnB1c2ggKHRoaXMucmVtb3ZlQ2hpbGQgKGNoaWxkKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGxldCBuZXdET006IERvY3VtZW50ID0gbnVsbDtcblx0XHRcdFx0XHRsZXQgbmV3T2JqOiBIVE1MRWxlbWVudCA9IG51bGw7XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUGFyc2VET00gIT0gbnVsbClcblx0XHRcdFx0XHRcdG5ld0RPTSA9IHRoaXMuY29tcG9uZW50Lm9uUGFyc2VET00gKGh0bWxIYW5kbGVyLmZpeGVkU3RyKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdC8vbmV3RE9NID0gdGhpcy5sb29zZVBhcnNlRnJvbVN0cmluZyAobmV3IERPTVBhcnNlciAoKSwgc3RyKTtcblx0XHRcdFx0XHRcdG5ld0RPTSA9IG5ldyBET01QYXJzZXIgKCkucGFyc2VGcm9tU3RyaW5nIChodG1sSGFuZGxlci5maXhlZFN0ciwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG5ld0RPTS5ib2R5LmNoaWxkcmVuLmxlbmd0aCA8IDEpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBjb21wb25lbnQgb3V0cHV0IGZyb20gJHt0aGlzLmNvbXBvbmVudC5uYW1lfSB3aXRoIHRhZyAke3RoaXMuY29tcG9uZW50LnRhZ31gKTtcblxuXHRcdFx0XHRcdGlmIChuZXdET00uYm9keS5jaGlsZHJlbi5sZW5ndGggPiAxKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCB0aHJvd0VycjogYm9vbGVhbiA9IHRydWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG5ld0RPTS5ib2R5LmNoaWxkcmVuLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgY2hpbGQgPSBuZXdET00uYm9keS5jaGlsZHJlbltpSWR4XTtcblx0XHRcblx0XHRcdFx0XHRcdFx0aWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSAoKSA9PT0gXCJwYXJzZXJlcnJvclwiKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdG5ld09iaiA9IGNoaWxkO1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3dFcnIgPSBmYWxzZTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKHRocm93RXJyID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBPbmx5IGEgc2luZ2xlIGh0bWwgZWxlbWVudCBjYW4gY29tZSBmcm9tIGNvbXBvbmVudCAke3RoaXMuY29tcG9uZW50Lm5hbWV9LCBtdWx0aXBsZSBlbGVtZW50cyB3ZXJlIGRldGVjdGVkLmApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChodG1sSGFuZGxlci5xdWVyeVNlbGVjdG9yID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0bmV3T2JqID0gKDxIVE1MRWxlbWVudD5uZXdET00uYm9keS5jaGlsZHJlblswXSk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0bmV3T2JqID0gbmV3RE9NLnF1ZXJ5U2VsZWN0b3IgKGh0bWxIYW5kbGVyLnF1ZXJ5U2VsZWN0b3IpO1xuXHRcdFxuXHRcdFx0XHRcdHRoaXMucmVwbGFjZVdpdGggKG5ld09iaik7XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50LmNsaWNrICE9IG51bGwpXG5cdFx0XHRcdFx0XHRuZXdPYmouYWRkRXZlbnRMaXN0ZW5lciAoXCJjbGlja1wiLCB0aGlzLmNvbXBvbmVudC5jbGljay5iaW5kICh0aGlzLmNvbXBvbmVudCkpO1xuXHRcdFxuXHRcdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmNvbXBvbmVudC5ldmVudHMpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGV2ZW50ID0gdGhpcy5jb21wb25lbnQuZXZlbnRzW2tleV07XG5cdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRuZXdPYmouYWRkRXZlbnRMaXN0ZW5lciAoZXZlbnQudHlwZSwgZXZlbnQuZnVuYywgZXZlbnQub3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGxldCBvYmplY3RGdW5jdGlvbnM6IHN0cmluZ1tdID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgKHRoaXMuY29tcG9uZW50LmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG5cdFx0XG5cdFx0XHRcdFx0Ly8gQXNzb2NpYXRlIGFueSBmdW5jdGlvbnMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZWxlbWVudC5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG9iamVjdEZ1bmN0aW9ucy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb2JqRnVuYzogc3RyaW5nID0gb2JqZWN0RnVuY3Rpb25zW2lJZHhdO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKG9iakZ1bmMgPT09IFwiY29uc3RydWN0b3JcIilcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRsZXQgcHJvcCA9IHRoaXMuY29tcG9uZW50W29iakZ1bmNdO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAocHJvcCkgPT09IFwiZnVuY3Rpb25cIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGlzTmV3RnVuY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHQvLyBHbyB0aHJvdWdoIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGJhc2UgSG90Q29tcG9uZW50IGFuZCBzZWUgXG5cdFx0XHRcdFx0XHRcdC8vIGlmIHRoZXJlJ3MgYW55IG1hdGNoZXMuIElmIHRoZXJlJ3MgYSBtYXRjaCwgdGhhdCBtZWFucyBcblx0XHRcdFx0XHRcdFx0Ly8gd2UncmUgdHJ5aW5nIHRvIGFkZCBhbiBleGlzdGluZyBmdW5jdGlvbiwgYW5kIHdlIGRvbid0XG5cdFx0XHRcdFx0XHRcdC8vIHdhbm5hIGRvIHRoYXQuIFNraXAgaXQuXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGtleTIgaW4gSG90Q29tcG9uZW50LnByb3RvdHlwZSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvYmpGdW5jID09PSBrZXkyKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlzTmV3RnVuY3Rpb24gPSBmYWxzZTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChpc05ld0Z1bmN0aW9uID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdG5ld09ialtvYmpGdW5jXSA9IEhvdFN0YXEua2VlcENvbnRleHQgKHRoaXMuY29tcG9uZW50W29iakZ1bmNdLCB0aGlzLmNvbXBvbmVudCk7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYWRkRnVuY3Rpb25zVG8gIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHF1ZXJ5OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgKGFkZEZ1bmN0aW9uc1RvKTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdHF1ZXJ5W29iakZ1bmNdID0gSG90U3RhcS5rZWVwQ29udGV4dCAodGhpcy5jb21wb25lbnRbb2JqRnVuY10sIHRoaXMuY29tcG9uZW50KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUHJlUGxhY2UgIT0gbnVsbClcblx0XHRcdFx0XHRcdG5ld09iaiA9IHRoaXMuY29tcG9uZW50Lm9uUHJlUGxhY2UgKG5ld09iaik7XG5cdFx0XG5cdFx0XHRcdFx0bGV0IGNvbXBIdG1sRWxlbWVudDI6IEhUTUxFbGVtZW50ID0gdGhpcy5jb21wb25lbnQub25DcmVhdGVkIChuZXdPYmopO1xuXHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5vblBhcmVudFBsYWNlID0gdGhpcy5jb21wb25lbnQub25QYXJlbnRQbGFjZTtcblx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIuaG90Q29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQ7XG5cdFx0XHRcdFx0dGhpcy5jb21wb25lbnQuaHRtbEVsZW1lbnRzLnB1c2ggKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFxuXHRcdFx0XHRcdGlmIChvdXRwdXQuY2xvc2VzdFNlbGVjdG9yICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHBhcmVudEVsbTogSFRNTEVsZW1lbnQgPSBjb21wSHRtbEVsZW1lbnQyO1xuXG5cdFx0XHRcdFx0XHR3aGlsZSAocGFyZW50RWxtKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgZm91bmROb2RlOiBOb2RlID0gcGFyZW50RWxtLnF1ZXJ5U2VsZWN0b3IgKG91dHB1dC5jbG9zZXN0U2VsZWN0b3IpO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChmb3VuZE5vZGUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHBhcmVudEVsbSA9ICg8SFRNTEVsZW1lbnQ+Zm91bmROb2RlKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHBhcmVudEVsbSA9IHBhcmVudEVsbS5wYXJlbnRFbGVtZW50O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAocGFyZW50RWxtID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIGNsb3Nlc3Qgbm9kZSB3aXRoIHNlbGVjdG9yICcke291dHB1dC5jbG9zZXN0U2VsZWN0b3J9J2ApO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFx0XHRcdHBhcmVudEVsbS5hcHBlbmRDaGlsZCAoY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRpZiAoY29tcEh0bWxFbGVtZW50Mi5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5ob3RDb21wb25lbnQub25QYXJlbnRQbGFjZSAocGFyZW50Tm9kZSwgY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGlmIChvdXRwdXQuZG9jdW1lbnRTZWxlY3RvciAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlOiBOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciAob3V0cHV0LmRvY3VtZW50U2VsZWN0b3IpO1xuXG5cdFx0XHRcdFx0XHRpZiAocGFyZW50Tm9kZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZmluZCBkb2N1bWVudCBub2RlIHdpdGggc2VsZWN0b3IgJyR7b3V0cHV0LmRvY3VtZW50U2VsZWN0b3J9J2ApO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFx0XHRcdHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQgKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFxuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0aWYgKGNvbXBIdG1sRWxlbWVudDIub25QYXJlbnRQbGFjZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIuaG90Q29tcG9uZW50Lm9uUGFyZW50UGxhY2UgKHBhcmVudE5vZGUsIGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxldCBwbGFjZUVsbUluUGFyZW50ID0gKHBhcmVudE5vZGVUb0NoZWNrOiBQYXJlbnROb2RlLCBwbGFjZUhlcmVQYXJlbnQ6IHN0cmluZywgY2hpbGRUb1BsYWNlOiBOb2RlKTogUGFyZW50Tm9kZSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlQ2hlY2tDb3VudGVyOiBudW1iZXIgPSAwO1xuXHRcdFxuXHRcdFx0XHRcdFx0d2hpbGUgKHBhcmVudE5vZGVDaGVja0NvdW50ZXIgPCAxMCkgLy8vIEB0b2RvIE1ha2UgdGhpcyBjb250cm9sbGFibGUgd2l0aCBhIHZhcmlhYmxlIGZyb20gdGhlIGNvbXBvbmVudC5cblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE5vZGVUb0NoZWNrID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJlbnROb2RlVG9DaGVjayBpbnN0YW5jZW9mIEhUTUxIdG1sRWxlbWVudClcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGhvdC1wbGFjZS1oZXJlIGV4aXN0cywgcGxhY2UgdGhlIGNoaWxkcmVuIHRoZXJlLiBJZiBub3QsIHBsYWNlIGl0IHVuZGVyIHRoZSBcblx0XHRcdFx0XHRcdFx0Ly8gbmV3IGVsZW1lbnQuXG5cdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVBcnJheSA9IHBhcmVudE5vZGVUb0NoZWNrLnF1ZXJ5U2VsZWN0b3JBbGwgKGBob3QtcGxhY2UtaGVyZVtuYW1lPVwiJHtwbGFjZUhlcmVQYXJlbnR9XCJdYCk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChwbGFjZUhlcmVBcnJheS5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHBsYWNlSGVyZSA9IHBsYWNlSGVyZUFycmF5WzBdO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZFRvUGxhY2UucGFyZW50Tm9kZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2hpbGRUb1BsYWNlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQgKGNoaWxkVG9QbGFjZSk7XG5cblx0XHRcdFx0XHRcdFx0XHRwbGFjZUhlcmUuYXBwZW5kQ2hpbGQgKGNoaWxkVG9QbGFjZSk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZFRvUGxhY2Uub25QYXJlbnRQbGFjZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdGNoaWxkVG9QbGFjZS5ob3RDb21wb25lbnQub25QYXJlbnRQbGFjZSAocGxhY2VIZXJlLCBjaGlsZFRvUGxhY2UpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGxhY2VIZXJlQXJyYXkubGVuZ3RoIDwgMSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVBdHRyQXJyYXkgPSBwYXJlbnROb2RlVG9DaGVjay5xdWVyeVNlbGVjdG9yQWxsIChgW2hvdC1wbGFjZS1oZXJlPVwiJHtwbGFjZUhlcmVQYXJlbnR9XCJdYCk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBsYWNlSGVyZUF0dHJBcnJheS5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmUgPSBwbGFjZUhlcmVBdHRyQXJyYXlbMF07XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZFRvUGxhY2UucGFyZW50Tm9kZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjaGlsZFRvUGxhY2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCAoY2hpbGRUb1BsYWNlKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0cGxhY2VIZXJlLmFwcGVuZENoaWxkIChjaGlsZFRvUGxhY2UpO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNoaWxkVG9QbGFjZS5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2hpbGRUb1BsYWNlLmhvdENvbXBvbmVudC5vblBhcmVudFBsYWNlIChwbGFjZUhlcmUsIGNoaWxkVG9QbGFjZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHRcdFx0cGFyZW50Tm9kZVRvQ2hlY2sgPSBwYXJlbnROb2RlVG9DaGVjay5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHRwYXJlbnROb2RlQ2hlY2tDb3VudGVyKys7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiAocGFyZW50Tm9kZVRvQ2hlY2spO1xuXHRcdFx0XHRcdH07XG5cdFx0XG5cdFx0XHRcdFx0aWYgKG91dHB1dC5wbGFjZUhlcmVQYXJlbnQgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgcGFyZW50Tm9kZVRvQ2hlY2sgPSBjb21wSHRtbEVsZW1lbnQyLnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHRwYXJlbnROb2RlVG9DaGVjayA9IHBsYWNlRWxtSW5QYXJlbnQgKHBhcmVudE5vZGVUb0NoZWNrLCBvdXRwdXQucGxhY2VIZXJlUGFyZW50LCBjb21wSHRtbEVsZW1lbnQyKTtcblxuXHRcdFx0XHRcdFx0aWYgKHBhcmVudE5vZGVUb0NoZWNrID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIHBhcmVudCBub2RlIHdpdGggaG90LXBsYWNlLWhlcmUgYXR0cmlidXRlICcke291dHB1dC5wbGFjZUhlcmVQYXJlbnR9J2ApO1xuXHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHQvLyBBcHBlbmQgdGhlIGNoaWxkcmVuIHRvIHRoZSBuZXdseSBjcmVhdGVkIEhUTUwgZWxlbWVudC5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGNoaWxkcmVuVG9SZWFkZC5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZDogSFRNTEVsZW1lbnQgPSAoPEhUTUxFbGVtZW50PmNoaWxkcmVuVG9SZWFkZFtpSWR4XSk7XG5cdFx0XHRcdFx0XHRsZXQgcGxhY2VkQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBhdHRyaWJ1dGUgaG90LXBsYWNlLXBhcmVudCBpbiBjaGlsZC5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGNoaWxkLmdldEF0dHJpYnV0ZSkgIT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVQYXJlbnRBdHRyID0gY2hpbGQuZ2V0QXR0cmlidXRlIChcImhvdC1wbGFjZS1wYXJlbnRcIik7XG5cblx0XHRcdFx0XHRcdFx0aWYgKChwbGFjZUhlcmVQYXJlbnRBdHRyICE9IG51bGwpICYmIChwbGFjZUhlcmVQYXJlbnRBdHRyICE9PSBcIlwiKSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlVG9DaGVjazogUGFyZW50Tm9kZSA9IGNvbXBIdG1sRWxlbWVudDI7XG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50Tm9kZVRvQ2hlY2sgPSBwbGFjZUVsbUluUGFyZW50IChwYXJlbnROb2RlVG9DaGVjaywgcGxhY2VIZXJlUGFyZW50QXR0ciwgY2hpbGQpO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJlbnROb2RlVG9DaGVjayA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgcGFyZW50IG5vZGUgd2l0aCBob3QtcGxhY2UtaGVyZSBhdHRyaWJ1dGUgJyR7b3V0cHV0LnBsYWNlSGVyZVBhcmVudH0nYCk7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0cGxhY2VkQ2hpbGQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAocGxhY2VkQ2hpbGQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0XHRjb21wSHRtbEVsZW1lbnQyLmFwcGVuZENoaWxkIChjaGlsZCk7XG5cblx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdGlmIChjaGlsZC5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0Y2hpbGQuaG90Q29tcG9uZW50Lm9uUGFyZW50UGxhY2UgKGNvbXBIdG1sRWxlbWVudDIsIGNoaWxkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUG9zdFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHRlbXA6IEhUTUxFbGVtZW50ID0gdGhpcy5jb21wb25lbnQub25Qb3N0UGxhY2UgKGNvbXBIdG1sRWxlbWVudDIucGFyZW50RWxlbWVudCwgY29tcEh0bWxFbGVtZW50Mik7XG5cblx0XHRcdFx0XHRcdGlmICh0ZW1wICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIgPSB0ZW1wO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh0eXBlb2YgKEhvdCkgIT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgY29tcG9uZW50TmFtZTogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQubmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudE5hbWUgPSB0aGlzLmNvbXBvbmVudC5uYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmICgoY29tcG9uZW50TmFtZSA9PSBudWxsKSB8fCAoY29tcG9uZW50TmFtZSA9PT0gXCJcIikpXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50TmFtZSA9IHRoaXMuaWQ7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudE5hbWUgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0SG90LkN1cnJlbnRQYWdlLmNvbXBvbmVudHNbY29tcG9uZW50TmFtZV0gPSB0aGlzLmNvbXBvbmVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhpcyBoZWxwcyBwYXJzZSA8dHI+IGFuZCBvdGhlciB0YWdzIHRoYXQgZG8gbm90IGhhdmUgYSBwYXJlbnQuXG5cdFx0XHQgKiBcblx0XHRcdCAqIFRoYW5rcyBCcmFuZG9uIE1jQ29ubmVsbCFcblx0XHRcdCAqIFxuXHRcdFx0ICogRnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjczMTM0NzkvbWFrZS1wYXJzZWZyb21zdHJpbmctcGFyc2Utd2l0aG91dC12YWxpZGF0aW9uXG5cdFx0XHQgKiBcblx0XHRcdCAqIEB0b2RvIE1heSByZW1vdmUgdGhpcyBhcyBpdCBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgd2VsbCBpbiBhIGxvdCBvZiBlZGdlIGNhc2VzLlxuXHRcdFx0ICovXG5cdFx0XHRwcm90ZWN0ZWQgbG9vc2VQYXJzZUZyb21TdHJpbmcgKHBhcnNlcjogRE9NUGFyc2VyLCBzdHI6IHN0cmluZykge1xuXHRcdFx0XHRzdHIgPSBzdHIucmVwbGFjZSgvIFxcLz4vZywgJz4nKS5yZXBsYWNlKC8oPChhcmVhfGJhc2V8YnJ8Y29sfGNvbW1hbmR8ZW1iZWR8aHJ8aW1nfGlucHV0fGtleWdlbnxsaW5rfG1ldGF8cGFyYW18c291cmNlfHRyYWNrfHdicikuKj8+KS9nLCAnJDE8LyQyPicpO1xuXHRcdFx0XHRjb25zdCB4ZG9tID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZygnPHhtbD4nK3N0cisnPC94bWw+JywgJ3RleHQveG1sJyk7XG5cdFx0XHRcdGNvbnN0IGhkb20gPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKCcnLCAndGV4dC9odG1sJyk7XG5cdFx0XHRcdGZvciAobGV0IGVsZW0gb2YgQXJyYXkuZnJvbSh4ZG9tLmRvY3VtZW50RWxlbWVudC5jaGlsZHJlbikpIHtcblx0XHRcdFx0XHQvLy8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGhkb20uYm9keS5hcHBlbmRDaGlsZChlbGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGxldCBlbGVtIG9mIEFycmF5LmZyb20oaGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdhcmVhLGJhc2UsYnIsY29sLGNvbW1hbmQsZW1iZWQsaHIsaW1nLGlucHV0LGtleWdlbixsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicpKSkge1xuXHRcdFx0XHRcdC8vLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0ZWxlbS5vdXRlckhUTUwgPSAnPCcrZWxlbS5vdXRlckhUTUwuc2xpY2UoMSkuc3BsaXQoJzwnKVswXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaGRvbTtcblx0XHRcdH1cblxuXHRcdFx0Z2V0IG9ic2VydmVkQXR0cmlidXRlcygpOiBzdHJpbmdbXSAvLy8gQGZpeG1lIERvZXMgdGhpcyBSRUFMTFkgaGF2ZSB0byBiZSBzdGF0aWM/IEF3ZnVsIGlmIGl0IGRvZXMuLi5cblx0XHRcdHtcblx0XHRcdFx0cmV0dXJuICh0aGlzLmNvbXBvbmVudC5vYnNlcnZlZEF0dHJpYnV0ZXMpO1xuXHRcdFx0fVxuXHRcdH0sIGVsZW1lbnRPcHRpb25zKTtcbn0iLCJpbXBvcnQgeyBIb3QgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90RmlsZSB9IGZyb20gXCIuL0hvdEZpbGVcIjtcbmltcG9ydCB7IEhvdExvZyB9IGZyb20gXCIuL0hvdExvZ1wiO1xuaW1wb3J0IHsgSG90RXZlbnRNZXRob2QgfSBmcm9tIFwiLi9Ib3RSb3V0ZU1ldGhvZFwiO1xuaW1wb3J0IHsgSG90U3RhcSwgSG90U3RhcnRPcHRpb25zIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuXG4vKipcbiAqIElmIHJ1bm5pbmcgaW4gYSBicm93c2VyLCB0aGlzIHdpbGwgc3RhcnQgSG90U3RhcS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhvdFN0YXFXZWJTdGFydCAoKVxue1xuXHQvLyBAdHMtaWdub3JlXG5cdGlmICh0eXBlb2YgKHdpbmRvdy5ob3RzdGFxU3RhcnRpbmdBcHApICE9PSBcInVuZGVmaW5lZFwiKVxuXHR7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmICh3aW5kb3cuaG90c3RhcVN0YXJ0aW5nQXBwID09PSB0cnVlKVxuXHRcdFx0cmV0dXJuO1xuXHR9XG5cblx0bGV0IGhvdHN0YXFFbG1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwiaG90c3RhcVwiKTtcblxuXHQvLyBTZXQgdGhpcyB0byB0cnVlLCBqdXN0IGluIGNhc2UuLi5cblx0SG90U3RhcS5pc1dlYiA9IHRydWU7XG5cblx0Ly8gQHRzLWlnbm9yZVxuXHRpZiAodHlwZW9mIChIb3RTdGFxV2ViKSAhPT0gXCJ1bmRlZmluZWRcIilcblx0e1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRmb3IgKGxldCBrZXkgaW4gSG90U3RhcVdlYilcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHR3aW5kb3dba2V5XSA9IEhvdFN0YXFXZWJba2V5XTtcblx0XHR9XG5cdH1cblxuXHRpZiAoaG90c3RhcUVsbXMubGVuZ3RoID4gMClcblx0e1xuXHRcdGxldCBob3RzdGFxRWxtOiBIVE1MRWxlbWVudCA9ICg8SFRNTEVsZW1lbnQ+aG90c3RhcUVsbXNbMF0pO1xuXG5cdFx0c2V0VGltZW91dCAoYXN5bmMgZnVuY3Rpb24gKClcblx0XHRcdHtcblx0XHRcdFx0bGV0IGdldEF0dHIgPSAoZWxtOiBIVE1MRWxlbWVudCwgYXR0ck5hbWVzOiBzdHJpbmdbXSkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGF0dHJOYW1lcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGF0dHJOYW1lOiBzdHJpbmcgPSBhdHRyTmFtZXNbaUlkeF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKGVsbS5nZXRBdHRyaWJ1dGUgKGF0dHJOYW1lKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAoZWxtLmdldEF0dHJpYnV0ZSAoYXR0ck5hbWUpKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoZWxtLmdldEF0dHJpYnV0ZSAoYGRhdGEtJHthdHRyTmFtZX1gKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAoZWxtLmdldEF0dHJpYnV0ZSAoYGRhdGEtJHthdHRyTmFtZX1gKSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiAodW5kZWZpbmVkKTtcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdGxldCBsb2FkUGFnZTogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wibG9hZC1wYWdlXCIsIFwibG9hZFBhZ2VcIiwgXCJzcmNcIl0pIHx8IFwiXCI7XG5cdFx0XHRcdGxldCBsb2dnaW5nTGV2ZWw6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcImxvZ2dpbmctbGV2ZWxcIiwgXCJsb2dnaW5nTGV2ZWxcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCBzdGFydERlbGF5OiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJzdGFydC1kZWxheVwiLCBcInN0YXJ0RGVsYXlcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCByb3V0ZXI6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcInJvdXRlclwiXSkgfHwgXCJcIjtcblx0XHRcdFx0bGV0IG5hbWU6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcIm5hbWVcIl0pIHx8IFwiZGVmYXVsdFwiO1xuXHRcdFx0XHRsZXQgYXJnczogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wiYXJnc1wiXSkgfHwgbnVsbDtcblx0XHRcdFx0bGV0IGFwaUpTVXJsOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJhcGktanMtdXJsXCIsIFwiYXBpSlNVcmxcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCBhcGlMaWJyYXJ5OiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJhcGktbGlicmFyeVwiLCBcImFwaUxpYnJhcnlcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCBhcGlOYW1lOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJhcGktbmFtZVwiLCBcImFwaU5hbWVcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCBhcGlVcmw6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcImFwaS11cmxcIiwgXCJhcGlVcmxcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCB0ZXN0ZXJOYW1lOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJ0ZXN0ZXItbmFtZVwiLCBcInRlc3Rlck5hbWVcIl0pIHx8IFwiSG90VGVzdGVyTW9jaGFTZWxlbml1bVwiO1xuXHRcdFx0XHRsZXQgdGVzdGVyTWFwOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJ0ZXN0ZXItbWFwXCIsIFwidGVzdGVyTWFwXCJdKSB8fCBudWxsO1xuXHRcdFx0XHRsZXQgdGVzdGVyQXBpQmFzZVVybDogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1widGVzdGVyLWFwaS1iYXNlLXVybFwiLCBcInRlc3RlckFwaUJhc2VVcmxcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCB0ZXN0ZXJMYXVuY2hwYWRVcmw6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcInRlc3Rlci1sYXVuY2hwYWQtdXJsXCIsIFwidGVzdGVyTGF1bmNocGFkVXJsXCJdKSB8fCBudWxsO1xuXHRcdFx0XHRsZXQgZG9udFJldXNlUHJvY2Vzc29yOiBib29sZWFuID0gZmFsc2U7XG5cdFx0XHRcdGxldCBwYXNzUmF3VXJsOiBib29sZWFuID0gZmFsc2U7XG5cdFx0XHRcdGxldCBodG1sU291cmNlOiBzdHJpbmcgPSBob3RzdGFxRWxtLmlubmVySFRNTCB8fCBcIlwiO1xuXHRcdFx0XHRsZXQgcm91dGVyTWFuYWdlcjogeyBbcGF0aDogc3RyaW5nXTogeyByZWRpcmVjdDogc3RyaW5nOyBiYXNlUmVkaXJlY3Q6IHN0cmluZzsgYmFzZTogc3RyaW5nOyBzcmM6IHN0cmluZzsgfSB9ID0ge307XG5cdFx0XHRcdGxldCByb3V0ZXJXaWxkY2FyZHM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGxldCBzZWFyY2g6IFVSTFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXG5cdFx0XHRcdGlmIChzdGFydERlbGF5ICE9IG51bGwpXG5cdFx0XHRcdFx0YXdhaXQgSG90U3RhcS53YWl0IChwYXJzZUludCAoc3RhcnREZWxheSkpO1xuXG5cdFx0XHRcdGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJzcmNcIl0pICE9IG51bGwpXG5cdFx0XHRcdFx0bG9hZFBhZ2UgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJzcmNcIl0pO1xuXG5cdFx0XHRcdGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJwYXNzUmF3VXJsXCJdKSAhPSBudWxsKVxuXHRcdFx0XHRcdHBhc3NSYXdVcmwgPSB0cnVlO1xuXG5cdFx0XHRcdGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJkb250LXJldXNlLXByb2Nlc3NvclwiLCBcImRvbnRSZXVzZVByb2Nlc3NvclwiXSkgIT0gbnVsbClcblx0XHRcdFx0XHRkb250UmV1c2VQcm9jZXNzb3IgPSB0cnVlO1xuXG5cdFx0XHRcdGxldCBoc3RxYmFzZXJlZGlyZWN0OiBzdHJpbmcgPSBzZWFyY2guZ2V0IChcImhzdHFiYXNlcmVkaXJlY3RcIik7XG5cblx0XHRcdFx0aWYgKGhzdHFiYXNlcmVkaXJlY3QgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGhzdHFiYXNlcmVkaXJlY3QgPSBkZWNvZGVVUkkgKGhzdHFiYXNlcmVkaXJlY3QpO1xuXHRcdFx0XHRcdHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSAoXCJcIiwgXCJcIiwgaHN0cWJhc2VyZWRpcmVjdCk7XG5cdFx0XHRcdFx0bG9hZFBhZ2UgPSBoc3RxYmFzZXJlZGlyZWN0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhvdHN0YXFFcnJvcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJob3RzdGFxLWVycm9yXCIpO1xuXG5cdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgaG90c3RhcUVycm9ycy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRsZXQgaG90c3RhcUVycm9yRWxtOiBIVE1MRWxlbWVudCA9IGhvdHN0YXFFcnJvcnNbaUlkeF07XG5cdFx0XHRcdFx0bGV0IGVycm9yU3RhdHVzOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRXJyb3JFbG0sIFtcInN0YXR1c1wiXSk7XG5cdFx0XHRcdFx0bGV0IHVuc3VwcG9ydGVkQnJvd3Nlcjogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVycm9yRWxtLCBbXCJ1bnN1cHBvcnRlZC1icm93c2VyLXJlZGlyZWN0XCJdKTtcblxuXHRcdFx0XHRcdGlmICh1bnN1cHBvcnRlZEJyb3dzZXIgIT0gbnVsbClcblx0XHRcdFx0XHRcdEhvdFN0YXEuZXJyb3JzW1widW5zdXBwb3J0ZWRCcm93c2VyXCJdID0geyByZWRpcmVjdFRvVXJsOiB1bnN1cHBvcnRlZEJyb3dzZXIgfTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRIb3RTdGFxLmVycm9yc1tgJHtlcnJvclN0YXR1c31gXSA9IHsgcmVkaXJlY3RUb1VybDogdW5zdXBwb3J0ZWRCcm93c2VyIH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayBpZiBhc3luYy9hd2FpdCBpcyBhdmFpbGFibGUuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZXZhbCAoXCJhc3luYyAoKSA9PiB7fVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXRjaCAoZXgpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRIb3RTdGFxLmV4ZWN1dGVFcnJvciAoXCJ1bnN1cHBvcnRlZEJyb3dzZXJcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocm91dGVyICE9PSBcIlwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGhvdHN0YXFSb3V0ZXJFbG1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwiaG90c3RhcS1yb3V0ZXJcIik7XG5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGhvdHN0YXFSb3V0ZXJFbG1zLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdGxldCBob3RzdGFxUm91dGVyRWxtOiBIVE1MRWxlbWVudCA9IGhvdHN0YXFSb3V0ZXJFbG1zW2lJZHhdO1xuXHRcdFx0XHRcdFx0bGV0IHJvdXRlck5hbWU6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFSb3V0ZXJFbG0sIFtcIm5hbWVcIl0pO1xuXHRcdFx0XHRcdFx0bGV0IHNlcnZlTG9jYWxseTogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcVJvdXRlckVsbSwgW1wic2VydmUtbG9jYWxcIiwgXCJzZXJ2ZUxvY2FsbHlcIl0pO1xuXG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRpZiAocm91dGVyTmFtZSA9PT0gcm91dGVyKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLyBMb2FkIGFsbCByb3V0ZXMgZnJvbSB0aGUgcm91dGVyLlxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpSmR4ID0gMDsgaUpkeCA8IGhvdHN0YXFSb3V0ZXJFbG0uY2hpbGROb2Rlcy5sZW5ndGg7IGlKZHgrKylcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRsZXQgcm91dGVyRWxtOiBIVE1MRWxlbWVudCA9IGhvdHN0YXFSb3V0ZXJFbG0uY2hpbGROb2Rlc1tpSmR4XTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJFbG0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudClcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGVyRWxtLnRhZ05hbWUudG9VcHBlckNhc2UgKCkgPT09IFwiUk9VVEVcIilcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJvdXRlclBhdGg6IHN0cmluZyA9IGdldEF0dHIgKHJvdXRlckVsbSwgW1wicGF0aFwiXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCByZWRpcmVjdDogc3RyaW5nID0gZ2V0QXR0ciAocm91dGVyRWxtLCBbXCJyZWRpcmVjdFwiXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBiYXNlUmVkaXJlY3Q6IHN0cmluZyA9IGdldEF0dHIgKHJvdXRlckVsbSwgW1wiYmFzZS1yZWRpcmVjdFwiLCBcImJhc2VSZWRpcmVjdFwiXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBiYXNlOiBzdHJpbmcgPSBnZXRBdHRyIChyb3V0ZXJFbG0sIFtcImJhc2VcIl0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgcm91dGVyU3JjOiBzdHJpbmcgPSBnZXRBdHRyIChyb3V0ZXJFbG0sIFtcInNyY1wiXSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJvdXRlclBhdGguaW5kZXhPZiAoXCIqXCIpID4gLTEpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cm91dGVyV2lsZGNhcmRzLnB1c2ggKHJvdXRlclBhdGgpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJvdXRlck1hbmFnZXJbcm91dGVyUGF0aF0gPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZWRpcmVjdDogcmVkaXJlY3QgfHwgdW5kZWZpbmVkLCBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJhc2VSZWRpcmVjdDogYmFzZVJlZGlyZWN0IHx8IHVuZGVmaW5lZCwgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiYXNlOiBiYXNlIHx8IHVuZGVmaW5lZCwgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzcmM6IHJvdXRlclNyYyB8fCB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGxldCBjaGVja1BhdGg6IHN0cmluZyA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcblx0XHRcdFx0XHRcdFx0bGV0IGdvdG9QYXRoOiBzdHJpbmcgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHNlcnZlTG9jYWxseSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbG93ZXJTZXJ2ZUxvY2FsbHk6IHN0cmluZyA9IHNlcnZlTG9jYWxseS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICgobG93ZXJTZXJ2ZUxvY2FsbHkgPT09IFwidHJ1ZVwiKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGxvd2VyU2VydmVMb2NhbGx5ID09PSBcInllc1wiKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGxvd2VyU2VydmVMb2NhbGx5ID09PSBcIjFcIikpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgbGFzdFNsYXNoUG9zOiBudW1iZXIgPSBjaGVja1BhdGgubGFzdEluZGV4T2YgKFwiL1wiKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGxhc3RTbGFzaFBvcyA+IC0xKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjaGVja1BhdGggPSBjaGVja1BhdGguc3Vic3RyaW5nIChsYXN0U2xhc2hQb3MpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRnb3RvUGF0aCA9IGdvdG9QYXRoLnN1YnN0cmluZyAobGFzdFNsYXNoUG9zKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAocm91dGVyV2lsZGNhcmRzLmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLyBTZXJ2ZSBsb2NhbGx5IGRvZXNuJ3QgcmVhbGx5IHdvcmsgd2l0aCB3aWxkY2FyZHNcblx0XHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIFRoaXMgaXNuJ3QgYWN0dWFsbHkgd29ya2luZyBsaWtlIGEgd2lsZGNhcmQgc2hvdWxkLiBUaGlzIG5lZWRzIHRvIGJlIGltcHJvdmVkLlxuXHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGlKZHggPSAwOyBpSmR4IDwgcm91dGVyV2lsZGNhcmRzLmxlbmd0aDsgaUpkeCsrKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCByb3V0ZVdpbGRjYXJkOiBzdHJpbmcgPSByb3V0ZXJXaWxkY2FyZHNbaUpkeF07XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgdGVtcFJvdXRlV2lsZGNhcmQ6IHN0cmluZyA9IHJvdXRlV2lsZGNhcmQucmVwbGFjZSAoXCIqXCIsIFwiXCIpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoY2hlY2tQYXRoLmluZGV4T2YgKHRlbXBSb3V0ZVdpbGRjYXJkKSA+IC0xKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGlzIHNpbXBseSByZXR1cm5zIHRoZSBrZXkgaW4gdGhlIHJvdXRlck1hbmFnZXIgdG8gYWNjZXNzLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjaGVja1BhdGggPSByb3V0ZVdpbGRjYXJkO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIEZpbmQgdGhlIGNvcnJlY3Qgcm91dGUgYW5kIGxvYWQgaXQuXG5cdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0gIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0ucmVkaXJlY3QgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJvdXRlck1hbmFnZXJbY2hlY2tQYXRoXS5yZWRpcmVjdDtcblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0uYmFzZVJlZGlyZWN0ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2VhcmNoUGFyYW1zID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaDtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBtb2RpZmllZFNlYXJjaFBhcmFtcyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICgoc2VhcmNoUGFyYW1zICE9PSBcIlwiKSAmJiAoc2VhcmNoUGFyYW1zICE9PSBcIj9cIikpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1vZGlmaWVkU2VhcmNoUGFyYW1zID0gYCYke3NlYXJjaFBhcmFtcy5zdWJzdHJpbmcgKDEpfWA7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYCR7cm91dGVyTWFuYWdlcltjaGVja1BhdGhdLmJhc2VSZWRpcmVjdH0/aHN0cWJhc2VyZWRpcmVjdD0ke2VuY29kZVVSSSAoZ290b1BhdGggKyBzZWFyY2hQYXJhbXMpfSR7bW9kaWZpZWRTZWFyY2hQYXJhbXN9YDtcblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0uc3JjICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRsb2FkUGFnZSA9IHJvdXRlck1hbmFnZXJbY2hlY2tQYXRoXS5zcmM7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYXJncyAhPSBudWxsKVxuXHRcdFx0XHRcdGFyZ3MgPSBKU09OLnBhcnNlIChhcmdzKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGFyZ3MgPSBIb3QuQXJndW1lbnRzO1xuXG5cdFx0XHRcdGxldCBoYXNIdG1sU291cmNlOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRcdFx0aWYgKGh0bWxTb3VyY2UgIT09IFwiXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCBodG1sU291cmNlQ2hlY2s6IHN0cmluZyA9IGh0bWxTb3VyY2UucmVwbGFjZSAoL1xccy9nLCcnKTtcblxuXHRcdFx0XHRcdGlmIChodG1sU291cmNlQ2hlY2sgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRoYXNIdG1sU291cmNlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCB0ZW1wTW9kZSA9IDA7XG5cblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRpZiAod2luZG93W1wiSG90XCJdICE9IG51bGwpXG5cdFx0XHRcdFx0dGVtcE1vZGUgPSBIb3QuTW9kZTtcblx0XHRcblx0XHRcdFx0bGV0IHByb2Nlc3NvcjogSG90U3RhcSA9IG51bGw7XG5cblx0XHRcdFx0aWYgKGRvbnRSZXVzZVByb2Nlc3NvciA9PT0gZmFsc2UpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodHlwZW9mIChIb3QpICE9PSBcInVuZGVmaW5lZFwiKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChIb3QuQ3VycmVudFBhZ2UgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChwcm9jZXNzb3IgPT0gbnVsbClcblx0XHRcdFx0XHRwcm9jZXNzb3IgPSBuZXcgSG90U3RhcSAoKTtcblxuXHRcdFx0XHRpZiAobG9nZ2luZ0xldmVsICE9IG51bGwpXG5cdFx0XHRcdFx0cHJvY2Vzc29yLmxvZ2dlci5sb2dMZXZlbCA9IEhvdExvZy5wYXJzZSAobG9nZ2luZ0xldmVsKTtcblxuXHRcdFx0XHRwcm9jZXNzb3IubW9kZSA9IHRlbXBNb2RlO1xuXG5cdFx0XHRcdGxldCBvcHRpb25zOiBIb3RTdGFydE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdFx0cHJvY2Vzc29yOiBwcm9jZXNzb3IsXG5cdFx0XHRcdFx0XHRhcmdzOiBhcmdzXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRpZiAobG9hZFBhZ2UgIT09IFwiXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAocGFzc1Jhd1VybCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGxvYWRQYWdlLmluZGV4T2YgKFwiaHN0cXNlcnZlXCIpIDwgMClcblx0XHRcdFx0XHRcdFx0bG9hZFBhZ2UgKz0gXCI/aHN0cXNlcnZlPW5haGZhbVwiO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG9wdGlvbnMudXJsID0gbG9hZFBhZ2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGVzdGVyTWFwICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck1hcCA9IHRlc3Rlck1hcDtcblx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck5hbWUgPSB0ZXN0ZXJOYW1lO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck5hbWUgPSB0ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdGlmICh0ZXN0ZXJBcGlCYXNlVXJsICE9IG51bGwpXG5cdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gdGVzdGVyQXBpQmFzZVVybDtcblxuXHRcdFx0XHRpZiAodGVzdGVyTGF1bmNocGFkVXJsICE9IG51bGwpXG5cdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJMYXVuY2hwYWRVcmwgPSB0ZXN0ZXJMYXVuY2hwYWRVcmw7XG5cblx0XHRcdFx0aWYgKGFwaU5hbWUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBjbGllbnQgPSBuZXcgSG90Q2xpZW50IChwcm9jZXNzb3IpO1xuXG5cdFx0XHRcdFx0aWYgKChhcGlVcmwgPT0gbnVsbCkgfHwgKGFwaVVybCA9PT0gXCJcIikpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBhcGktdXJsIHdhcyBub3Qgc2V0IWApO1xuXG5cdFx0XHRcdFx0aWYgKChhcGlKU1VybCA9PSBudWxsKSB8fCAoYXBpSlNVcmwgPT09IFwiXCIpKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgYXBpLWpzLXVybCB3YXMgbm90IHNldCFgKTtcblxuXHRcdFx0XHRcdGNvbnN0IGFwaUpTVXJsQ29udGVudDogc3RyaW5nID0gYXdhaXQgSG90RmlsZS5odHRwR2V0IChhcGlKU1VybCk7XG5cblx0XHRcdFx0XHRpZiAoYXBpSlNVcmxDb250ZW50ID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgYXBpLWpzLXVybCBjb250ZW50IHdhcyBlbXB0eSFgKTtcblxuXHRcdFx0XHRcdGxldCBwYXJlbnRPYmplY3QgPSBudWxsO1xuXG5cdFx0XHRcdFx0Ly8vIEB0b2RvIFJlcXVpcmUgYSBoYXNoIHRvIGJlIHBhc3NlZCB0aGF0IG1hdGNoZXMgdGhlIGNvbnRlbnQgb2YgYXBpSlNVcmxDb250ZW50LlxuXHRcdFx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChwYXJlbnRPYmplY3QgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0cGFyZW50T2JqZWN0ID0gd2luZG93O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHBhcmVudE9iamVjdCA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRwYXJlbnRPYmplY3QgPSBnbG9iYWw7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZXZhbC5hcHBseSAocGFyZW50T2JqZWN0LCBbYXBpSlNVcmxDb250ZW50XSk7XG5cblx0XHRcdFx0XHRsZXQgcGFyZW50TGliOiBhbnkgPSB3aW5kb3c7XG5cblx0XHRcdFx0XHRpZiAoYXBpTGlicmFyeSAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdHBhcmVudExpYiA9IHdpbmRvd1thcGlMaWJyYXJ5XTtcblxuXHRcdFx0XHRcdFx0aWYgKHBhcmVudExpYiA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZmluZCB0aGUgQVBJIGxpYnJhcnkgJHthcGlMaWJyYXJ5fSFgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRsZXQgbmV3QVBJID0gbmV3IHBhcmVudExpYlthcGlOYW1lXSAoYXBpVXJsLCBjbGllbnQpO1xuXHRcdFx0XHRcdG5ld0FQSS5jb25uZWN0aW9uLmFwaSA9IG5ld0FQSTtcblx0XHRcdFx0XHRwcm9jZXNzb3IuYXBpID0gbmV3QVBJO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGhhc0h0bWxTb3VyY2UgPT09IGZhbHNlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKGxvYWRQYWdlID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGhlIGhvdHN0YXEgdGFnIG11c3QgaGF2ZSBhIHNyYywgSFRNTCBjb250ZW50cyBpbnNpZGUgaXQsIG9yIGEgcm91dGVyIHNldC5gKTtcblxuXHRcdFx0XHRcdEhvdFN0YXEuZGlzcGxheVVybCAob3B0aW9ucyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90U3RhcS5kaXNwbGF5Q29udGVudCAob3B0aW9ucyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIDUwKTtcblx0fVxufSIsImltcG9ydCB7IEhvdFNpdGVNYXBQYXRoIH0gZnJvbSBcIi4vSG90U2l0ZVwiO1xuXG4vKipcbiAqIFRoZSBkZXN0aW5hdGlvbiB0byB0YWtlIGluIGEgbWFwLlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdERlc3RpbmF0aW9uXG57XG5cdC8qKlxuXHQgKiBUaGUgZGVzdGluYXRpb24gdG8gdGFrZS5cblx0ICovXG5cdGRlc3RpbmF0aW9uOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgc3RhcnQgZXhlY3V0aW5nIGl0J3MgXG5cdCAqIHRlc3RzIHdoZW4gaXQncyB0aW1lLlxuXHQgKi9cblx0YXV0b1N0YXJ0OiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChkZXN0aW5hdGlvbjogc3RyaW5nIHwgSG90VGVzdERlc3RpbmF0aW9uIHwgSG90U2l0ZU1hcFBhdGggPSBcIlwiLCBhdXRvU3RhcnQ6IGJvb2xlYW4gPSB0cnVlKVxuXHR7XG5cdFx0aWYgKHR5cGVvZiAoZGVzdGluYXRpb24pID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcblx0XHRcdHRoaXMuYXV0b1N0YXJ0ID0gYXV0b1N0YXJ0O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0aWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgSG90VGVzdERlc3RpbmF0aW9uKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb24uZGVzdGluYXRpb247XG5cdFx0XHRcdHRoaXMuYXV0b1N0YXJ0ID0gZGVzdGluYXRpb24uYXV0b1N0YXJ0O1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb24ucGF0aDtcblx0XHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBkZXN0aW5hdGlvbi5hdXRvU3RhcnQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50LCBIb3RUZXN0RWxlbWVudE9wdGlvbnMgfSBmcm9tIFwiLi9Ib3RUZXN0RWxlbWVudFwiO1xuaW1wb3J0IHsgSG90VGVzdFBhZ2UgfSBmcm9tIFwiLi9Ib3RUZXN0UGFnZVwiO1xuXG4vKipcbiAqIFRoaXMgYWN0dWFsbHkgZXhlY3V0ZXMgdGhlIHRlc3RzLlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdERyaXZlclxue1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgcGFnZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50IHBhZ2UuXG5cdCAqL1xuXHRwYWdlOiBIb3RUZXN0UGFnZTtcblx0LyoqXG5cdCAqIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBlYWNoIGV4ZWN1dGVkIGNvbW1hbmQuXG5cdCAqIEBkZWZhdWx0IDIwXG5cdCAqL1xuXHRjb21tYW5kRGVsYXk6IG51bWJlcjtcblx0LyoqXG5cdCAqIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBlYWNoIGNvbXBsZXRlZCBwYWdlIHRlc3QuXG5cdCAqIEBkZWZhdWx0IDUwMFxuXHQgKi9cblx0cGFnZVRlc3REZWxheTogbnVtYmVyO1xuXHQvKipcblx0ICogQW55IGRhdGEgdGhhdCBuZWVkcyB0byBiZSBzYXZlZCBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgdGVzdGluZyBydW5zLlxuXHQgKi9cblx0cGVyc2lzdGVudERhdGE6IGFueTtcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxLCBwYWdlOiBIb3RUZXN0UGFnZSB8IG51bGwgPSBudWxsKVxuXHR7XG5cdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0dGhpcy5wYWdlID0gcGFnZTtcblx0XHR0aGlzLmNvbW1hbmREZWxheSA9IDIwO1xuXHRcdHRoaXMucGFnZVRlc3REZWxheSA9IDcwMDtcblx0XHR0aGlzLnBlcnNpc3RlbnREYXRhID0ge307XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdGVzdCBvYmplY3QgYnkgaXQncyBuYW1lLiBJZiBhICogaXMgdXNlZCwgaXQgd2lsbCBiZSB1c2VkIGFzIGEgXG5cdCAqIHdpbGRjYXJkIGZvciB0aGUgb2JqZWN0J3MgbmFtZS4gSWYgYSA+IGlzIHVzZWQsIHRoZW4gdGhlIG5hbWUgd2lsbCBcblx0ICogYmUgdHJlYXRlZCBhcyBhIENTUyBzZWxlY3Rvci5cblx0ICovXG5cdHBhcnNlVGVzdE9iamVjdCAobmFtZTogc3RyaW5nKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgcG9zOiBudW1iZXIgPSBuYW1lLmluZGV4T2YgKFwiKlwiKTtcblx0XHRsZXQgd2lsZGNhcmQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAocG9zID4gLTEpXG5cdFx0e1xuXHRcdFx0bmFtZSA9IG5hbWUucmVwbGFjZSAoL1xcKi8sIFwiXCIpO1xuXHRcdFx0d2lsZGNhcmQgPSBcIipcIjtcblx0XHR9XG5cblx0XHRsZXQgc2VsZWN0b3I6IHN0cmluZyA9IGBbZGF0YS10ZXN0LW9iamVjdC1uYW1lJHt3aWxkY2FyZH09JyR7bmFtZX0nXWA7XG5cblx0XHRpZiAobmFtZS5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGlmIChuYW1lWzBdID09PSBcIj5cIilcblx0XHRcdHtcblx0XHRcdFx0bmFtZSA9IG5hbWUuc3Vic3RyaW5nICgxKTtcblx0XHRcdFx0c2VsZWN0b3IgPSBuYW1lO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAoc2VsZWN0b3IpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXQgZm9yIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cblx0ICovXG5cdGFzeW5jIHdhaXQgKG51bU1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0cmV0dXJuIChuZXcgUHJvbWlzZSAoKHJlc29sdmUsIHJlamVjdCkgPT5cblx0XHRcdHtcblx0XHRcdFx0c2V0VGltZW91dCAoKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXNvbHZlICgpO1xuXHRcdFx0XHRcdH0sIG51bU1pbGxpc2Vjb25kcyk7XG5cdFx0XHR9KSk7XG5cdH1cblxuXHQvKipcblx0ICogUHJpbnQgYSBtZXNzYWdlLlxuXHQgKi9cblx0YXN5bmMgcHJpbnQgKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHByb2Nlc3Muc3Rkb3V0LndyaXRlIChtZXNzYWdlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcmludCBhIG1lc3NhZ2UgbGluZS5cblx0ICovXG5cdGFzeW5jIHByaW50bG4gKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGF3YWl0IHRoaXMucHJpbnQgKGAke21lc3NhZ2V9XFxuYCk7XG5cdH1cblxuXHQvKipcblx0ICogRGlzY29ubmVjdCB0aGlzIHNlcnZlciBvciBkZXN0cm95IGFueXRoaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEhvdFRlc3REcml2ZXIuXG5cdCAqL1xuXHRhc3luYyBkZXN0cm95ICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0fVxuXG5cdC8qKlxuXHQgKiBBbiBleHByZXNzaW9uIHRvIHRlc3QuXG5cdCAqL1xuXHRhc3luYyBhc3NlcnQgKHZhbHVlOiBhbnksIGVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIik6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0aWYgKCEgKHZhbHVlKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoZXJyb3JNZXNzYWdlKTtcblx0fVxufSIsIi8qKlxuICogSG90IHRlc3QgZWxlbWVudCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RUZXN0RWxlbWVudE9wdGlvbnNcbntcblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGF0IHRoZSB0ZXN0IGVsZW1lbnQgbXVzdCBiZSB2aXNpYmxlIGluIFxuXHQgKiBvcmRlciB0byBzZWxlY3QgaXQuXG5cdCAqL1xuXHRtdXN0QmVWaXNpYmxlPzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIElmIHRoZSB0ZXN0IGVsZW1lbnQgaXMgbWlzc2luZywgaWdub3JlIHRoZSBlcnJvci4gVGhpcyBcblx0ICogd2lsbCBjYXVzZSB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuIGltbWVkaWF0ZWx5IFxuXHQgKiB3aXRob3V0IGFueSBleGNlcHRpb25zIGJlaW5nIHRocm93bi5cblx0ICovXG5cdGlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3I/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhvdCB0ZXN0IGVsZW1lbnQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFRlc3RFbGVtZW50T3B0aW9ucyBpbXBsZW1lbnRzIElIb3RUZXN0RWxlbWVudE9wdGlvbnNcbntcblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGF0IHRoZSB0ZXN0IGVsZW1lbnQgbXVzdCBiZSB2aXNpYmxlIGluIFxuXHQgKiBvcmRlciB0byBzZWxlY3QgaXQuXG5cdCAqL1xuXHRtdXN0QmVWaXNpYmxlOiBib29sZWFuO1xuXHQvKipcblx0ICogSWYgdGhlIHRlc3QgZWxlbWVudCBpcyBtaXNzaW5nLCBpZ25vcmUgdGhlIGVycm9yLiBUaGlzIFxuXHQgKiB3aWxsIGNhdXNlIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gaW1tZWRpYXRlbHkgXG5cdCAqIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duLlxuXHQgKi9cblx0aWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvcjogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdFRlc3RFbGVtZW50T3B0aW9ucyA9IHt9KVxuXHR7XG5cdFx0dGhpcy5tdXN0QmVWaXNpYmxlID0gY29weS5tdXN0QmVWaXNpYmxlIHx8IHRydWU7XG5cdFx0dGhpcy5pZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yID0gY29weS5pZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yIHx8IGZhbHNlO1xuXHR9XG59XG5cbi8qKlxuICogQSB0ZXN0IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFRlc3RFbGVtZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudC5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIFxuXHQgKiB3aGlsZSBleGVjdXRpbmcgdGhlIHRlc3QuXG5cdCAqL1xuXHRmdW5jPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIHRvIHVzZS5cblx0ICovXG5cdHZhbHVlPzogYW55O1xufVxuXG4vKipcbiAqIEEgdGVzdCBlbGVtZW50LlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdEVsZW1lbnQgaW1wbGVtZW50cyBJSG90VGVzdEVsZW1lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgXG5cdCAqIHdoaWxlIGV4ZWN1dGluZyB0aGUgdGVzdC5cblx0ICovXG5cdGZ1bmM6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSB0byB1c2UuXG5cdCAqL1xuXHR2YWx1ZTogYW55O1xuXG5cdGNvbnN0cnVjdG9yIChuYW1lOiBzdHJpbmcgfCBJSG90VGVzdEVsZW1lbnQsIGZ1bmM6IHN0cmluZyA9IFwiXCIsIHZhbHVlOiBhbnkgPSBudWxsKVxuXHR7XG5cdFx0aWYgKHR5cGVvZiAobmFtZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHRcdHRoaXMuZnVuYyA9IGZ1bmM7XG5cdFx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLm5hbWUgPSBuYW1lLm5hbWU7XG5cdFx0XHR0aGlzLmZ1bmMgPSBuYW1lLmZ1bmMgfHwgZnVuYztcblx0XHRcdHRoaXMudmFsdWUgPSBuYW1lLnZhbHVlIHx8IHZhbHVlO1xuXHRcdH1cblx0fVxufSIsImltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0RHJpdmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0RGVzdGluYXRpb24gfSBmcm9tIFwiLi9Ib3RUZXN0RGVzdGluYXRpb25cIjtcbmltcG9ydCB7IEhvdFRlc3RQYWdlIH0gZnJvbSBcIi4vSG90VGVzdFBhZ2VcIjtcblxuLyoqXG4gKiBDcmVhdGUgYSB0ZXN0IHBhdGggZm9yIGxhdGVyIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgSG90VGVzdFBhdGggPSAoZHJpdmVyOiBIb3RUZXN0RHJpdmVyKSA9PiBQcm9taXNlPGFueT47XG5cbi8qKlxuICogTWFwcyB0aGUgcGF0aHMgdGhhdCBhcmUgdGFrZW4gdG8gY29tcGxldGUgYSB0ZXN0LlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdE1hcFxue1xuXHQvKipcblx0ICogVGhlIG9yZGVyIGluIHdoaWNoIHBhdGhzIGFyZSB0byBiZSB0YWtlbi4gRWFjaCBkZXN0aW5hdGlvbiBpcyBhIHN0cmluZyBcblx0ICogaW4gYSB0eXBlIC0+IHBhdGggb3JkZXIuIFRoZSB0eXBlIGNvdWxkIGJlIGVpdGhlciBhIHBhZ2Ugb3IgYXBpIHJvdXRlLiBcblx0ICogRm9yIGV4YW1wbGU6XG5cdCAqIGBgYFxuXHQgKiBbXG5cdCAqICAgICAgXCJwYWdlOnNpZ25pbl9wYWdlIC0+IHNpZ25pbl9wYXRoXCIsXG5cdCAqICAgICAgXCJwYWdlOmFjY291bnRfcGFnZSAtPiBjaGFuZ2VfdXNlcm5hbWVfcGF0aFwiLFxuXHQgKiAgICAgIFwicGFnZTphY2NvdW50X3BhZ2UgLT4gY2hhbmdlX3Bhc3N3b3JkX3BhdGhcIixcblx0ICogICAgICBcInBhZ2U6YWNjb3VudF9wYWdlIC0+IGNoYW5nZV9uYW1lX3BhdGggLT4gY2hhbmdlX2FkZHJlc3NfcGF0aFwiLFxuXHQgKiBcdFx0XCJwYWdlOmFjY291bnRfcGFnZSAtPiBzaWdub3V0X3BhdGhcIixcblx0ICogXHRcdFwiYXBpOmFjY291bnRfYXBpX3JvdXRlIC0+IHNpZ25vdXRfcm91dGVfbWV0aG9kIC0+IHNpZ25vdXRfdGVzdF9wYXRoXCJcblx0ICogXVxuXHQgKiBgYGBcblx0ICogXG5cdCAqIFRoZSBmaXJzdCBzdHJpbmcgdG8gdGhlIGxlZnQgb2YgdGhlIC0+IHdpbGwgYWx3YXlzIGJlIHRoZSB0eXBlLCBzdWNoIGFzIGEgXG5cdCAqIHBhZ2Ugb3IgYW4gYXBpIHJvdXRlLiBBbnkgc3RyaW5ncyB0byB0aGUgcmlnaHQgb2YgdGhlIC0+IHdpbGwgYmUgYSBwYXRoLCBldmVuIFxuXHQgKiB3aGVuIGNoYWluaW5nIGFkZHRpb25hbCAtPidzLlxuXHQgKi9cblx0ZGVzdGluYXRpb25zOiBIb3RUZXN0RGVzdGluYXRpb25bXSB8IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3REZXN0aW5hdGlvbjsgfTtcblx0LyoqXG5cdCAqIFRoZSBvcmRlciBpbiB3aGljaCBkZXN0aW5hdGlvbnMgYXJlIHN1cHBvc2VkIHRvIGV4ZWN1dGUuIFRoaXMgaXMgXG5cdCAqIGlnbm9yZWQgaWYgdGhlIGRlc3RpbmF0aW9ucyBhcmUgYW4gYXJyYXkuXG5cdCAqL1xuXHRkZXN0aW5hdGlvbk9yZGVyOiBzdHJpbmdbXTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0IHBhZ2VzIHRvIGV4ZWN1dGUuXG5cdCAqL1xuXHRwYWdlczoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IEhvdFRlc3RQYWdlXG5cdFx0fTtcblxuXHRjb25zdHJ1Y3RvciAoZGVzdGluYXRpb25zOiBzdHJpbmdbXSB8IEhvdFRlc3REZXN0aW5hdGlvbltdIHwgeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgSG90VGVzdERlc3RpbmF0aW9uOyB9ID0gW10sIFxuXHRcdHBhZ2VzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGFnZSB9ID0ge30sIGRlc3RpbmF0aW9uT3JkZXI6IHN0cmluZ1tdID0gW10pXG5cdHtcblx0XHQvLyBHbyB0aHJvdWdoIGFuZCBjb252ZXJ0IGFueSBzdHJpbmdzIGludG8gSG90VGVzdERlc3RpbmF0aW9ucy5cblx0XHRpZiAoZGVzdGluYXRpb25zIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMgPSBbXTtcblxuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBkZXN0aW5hdGlvbnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBkZXN0ID0gZGVzdGluYXRpb25zW2lJZHhdO1xuXG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb25zLnB1c2ggKG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKGRlc3QpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuZGVzdGluYXRpb25zID0ge307XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBkZXN0aW5hdGlvbnMpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBkZXN0ID0gZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0dGhpcy5kZXN0aW5hdGlvbnNba2V5XSA9IG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKGRlc3QpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuZGVzdGluYXRpb25PcmRlciA9IGRlc3RpbmF0aW9uT3JkZXI7XG5cdFx0dGhpcy5wYWdlcyA9IHBhZ2VzO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBUZXN0Q2FzZU9iamVjdCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90VGVzdE1hcCwgSG90VGVzdFBhdGggfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5pbXBvcnQgeyBIb3RUZXN0RGVzdGluYXRpb24gfSBmcm9tIFwiLi9Ib3RUZXN0RGVzdGluYXRpb25cIjtcbmltcG9ydCB7IEhvdFRlc3RQYWdlIH0gZnJvbSBcIi4vSG90VGVzdFBhZ2VcIjtcbmltcG9ydCB7IEhvdERlc3RpbmF0aW9uIH0gZnJvbSBcIi4vSG90RGVzdGluYXRpb25cIjtcbmltcG9ydCB7IEhvdFRlc3RTdG9wIH0gZnJvbSBcIi4vSG90VGVzdFN0b3BcIjtcbmltcG9ydCB7IEhvdFRlc3RTZWxlbml1bURyaXZlciB9IGZyb20gXCIuL0hvdFRlc3RTZWxlbml1bURyaXZlclwiO1xuXG4vKipcbiAqIEV4ZWN1dGVzIHRlc3RzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSG90VGVzdGVyXG57XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdGltZW91dCBmb3IgZWFjaCB0ZXN0LlxuXHQgKi9cblx0dGltZW91dDogbnVtYmVyO1xuXHQvKipcblx0ICogVGhlIGJhc2UgdXJsIHRoYXQgd2lsbCBjb25zdHJ1Y3QgZnV0dXJlIHVybHMuXG5cdCAqL1xuXHRiYXNlVXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBwcm9jZXNzb3IuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBtYXBzIHRvIHRlc3QuXG5cdCAqL1xuXHR0ZXN0TWFwczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdE1hcDsgfTtcblx0LyoqXG5cdCAqIFRoZSBkcml2ZXIgdG8gdXNlIHdoZW4gcnVubmluZyB0ZXN0cy5cblx0ICovXG5cdGRyaXZlcjogSG90VGVzdERyaXZlcjtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIHRlc3RlciBmaW5pc2hlZCBsb2FkaW5nP1xuXHQgKi9cblx0ZmluaXNoZWRMb2FkaW5nOiBib29sZWFuO1xuXHQvKipcblx0ICogSGFzIHRoaXMgdGVzdGVyIGZpbmlzaGVkIHNldHRpbmcgdXA/XG5cdCAqL1xuXHRoYXNCZWVuU2V0dXA6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyB0ZXN0ZXIgYmVlbiBkZXN0cm95ZWQ/XG5cdCAqL1xuXHRoYXNCZWVuRGVzdHJveWVkOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgcGFnZSBjdXJyZW50bHkgZXhlY3V0aW5nLlxuXHQgKi9cblx0Y3VycmVudFBhZ2U6IEhvdFRlc3RQYWdlO1xuXHQvKipcblx0ICogVGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IGhhdmUgZmFpbGVkLlxuXHQgKi9cblx0bnVtRmFpbHVyZXM6IG51bWJlcjtcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxLCBuYW1lOiBzdHJpbmcsIGJhc2VVcmw6IHN0cmluZywgXG5cdFx0ZHJpdmVyOiBIb3RUZXN0RHJpdmVyLCB0ZXN0TWFwczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdE1hcDsgfSA9IHt9KVxuXHR7XG5cdFx0aWYgKHRlc3RNYXBzID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUaGUgdGVzdE1hcHMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbXB0eSBvYmplY3QsIGJ1dCBjYW5ub3QgYmUgbnVsbCEgSXQgaXMgc2V0IHRvIG51bGwuYCk7XG5cblx0XHR0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3Nvcjtcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSAxMDAwMDtcblx0XHR0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuXHRcdHRoaXMudGVzdE1hcHMgPSB0ZXN0TWFwcztcblx0XHR0aGlzLmRyaXZlciA9IGRyaXZlcjtcblx0XHR0aGlzLmZpbmlzaGVkTG9hZGluZyA9IGZhbHNlO1xuXHRcdHRoaXMuaGFzQmVlblNldHVwID0gZmFsc2U7XG5cdFx0dGhpcy5oYXNCZWVuRGVzdHJveWVkID0gZmFsc2U7XG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IG51bGw7XG5cdFx0dGhpcy5udW1GYWlsdXJlcyA9IDA7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBzZXR0aW5nIHVwIHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRhc3luYyBzZXR1cCAoaXNXZWJSb3V0ZTogYm9vbGVhbiwgdXJsOiBzdHJpbmcsIGRlc3RpbmF0aW9uS2V5Pzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBkZXN0cm95aW5nIHVwIHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRhc3luYyBkZXN0cm95ICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRlc3RzIGFyZSBzdGFydGVkLiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgaXQgd2lsbCBcblx0ICogY29udGludWUgYW5kIGV4ZWN1dGUgYWxsIHRlc3QgcGF0aHMuIElmIHRoaXMgcmV0dXJucyBpdCB3aWxsIFxuXHQgKiBza2lwIGFsbCB0ZXN0IHBhdGhzIGFuZCBleGVjdXRlIG9uVGVzdEVuZCBpbnN0ZWFkLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0U3RhcnQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHVybDogc3RyaW5nLCBkZXN0aW5hdGlvbktleT86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIGFuIEFQSSB0ZXN0IHBhdGggaGFzIHN0YXJ0ZWQuIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgXG5cdCAqIHRoZSB0ZXN0UGF0aCB3aWxsIG5vdCBiZSBpbW1lZGlhdGVseSBleGVjdXRlZCBhZnRlcndhcmRzLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0QVBJUGF0aFN0YXJ0PyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kLCBcblx0XHR0ZXN0TmFtZTogc3RyaW5nLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhbiBBUEkgdGVzdCBwYXRoIGhhcyBlbmRlZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdEFQSVBhdGhFbmQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIG1ldGhvZDogSG90Um91dGVNZXRob2QsIFxuXHRcdHRlc3ROYW1lOiBzdHJpbmcsIHJlc3VsdDogYW55LCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBwYWdlIHRlc3RzIGFyZSBzdGFydGVkLiBJZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSB0ZXN0UGF0aCB3aWxsIG5vdCBiZSBcblx0ICogaW1tZWRpYXRlbHkgZXhlY3V0ZWQgYWZ0ZXJ3YXJkcy5cblx0ICovXG5cdGFzeW5jIG9uVGVzdFBhZ2VQYXRoU3RhcnQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIFxuXHRcdHN0b3A6IEhvdFRlc3RTdG9wLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhIHBhZ2UgdGVzdCBoYXMgZW5kZWQuXG5cdCAqL1xuXHRhc3luYyBvblRlc3RQYWdlUGF0aEVuZD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgdGVzdFBhdGg6IEhvdFRlc3RQYXRoLCBcblx0XHRyZXN1bHQ6IGFueSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gYSBjb21tYW5kIGlzIGV4ZWN1dGVkLlxuXHQgKi9cblx0YXN5bmMgb25Db21tYW5kPyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBzdG9wOiBIb3RUZXN0U3RvcCwgXG5cdFx0Y21kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjbWRGdW5jOiAoKGNtZEFyZ3M6IHN0cmluZ1tdKSA9PiBQcm9taXNlPHZvaWQ+KSk6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRlc3RzIGFyZSBmaW5pc2hlZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdEVuZD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbik6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhpcyB0ZXN0ZXIgaGFzIGJlZW4gZXhlY3V0ZWQgZnJvbSB0aGUgQVBJLlxuXHQgKi9cblx0YXN5bmMgb25FeGVjdXRlPyAoKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhpcyB0ZXN0ZXIgaGFzIGZpbmlzaGVkIGxvYWRpbmcgYWxsIGRhdGEgZnJvbSB0aGUgQVBJLlxuXHQgKiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlIG5ld1BhZ2Ugd2lsbCBiZSBhZGRlZCBhcyB0aGUgdGVzdGVyJ3MgY3VycmVudCBcblx0ICogcGFnZSB0aGF0IGlzIGV4ZWN1dGluZy4gSWYgaXQgcmV0dXJucyBmYWxzZSwgbmV3UGFnZSB3aWxsIG5vdCBiZSBzZXQgYXMgdGhlIFxuXHQgKiBjdXJyZW50IHBhZ2UuXG5cdCAqL1xuXHRhc3luYyBvbkZpbmlzaGVkTG9hZGluZz8gKG5ld1BhZ2U6IEhvdFRlc3RQYWdlKTogUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhpcyB0ZXN0ZXIgaGFzIGZpbmlzaGVkIHVubG9hZGluZy5cblx0ICovXG5cdGFzeW5jIG9uRmluaXNoZWRVbmxvYWRpbmc/ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBXYWl0cyBmb3IgdGhlIEFQSSB0byBmaW5pc2ggbG9hZGluZyBhbGwgZGF0YS5cblx0ICovXG5cdGFzeW5jIHdhaXRGb3JEYXRhICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR3aGlsZSAodGhpcy5maW5pc2hlZExvYWRpbmcgPT09IGZhbHNlKVxuXHRcdFx0YXdhaXQgSG90U3RhcS53YWl0ICgxMCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgZGVzdGluYXRpb24gSlNPTiBvYmplY3QgdG8gdXNlLlxuXHQgKi9cblx0c3RhdGljIGludGVycHJldERlc3RpbmF0aW9uIChtYXBOYW1lOiBzdHJpbmcsIHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24pOiBIb3REZXN0aW5hdGlvblxuXHR7XG5cdFx0bGV0IGRlc3RpbmF0aW9uOiBzdHJpbmcgPSB0ZXN0RGVzdC5kZXN0aW5hdGlvbjtcblx0XHRsZXQgbmV3RGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uID0ge1xuXHRcdFx0XHRtYXBOYW1lOiBtYXBOYW1lLFxuXHRcdFx0XHR1cmw6IFwiXCIsXG5cdFx0XHRcdGFwaTogXCJcIixcblx0XHRcdFx0cGF0aHM6IFtdXG5cdFx0XHR9O1xuXHRcdGxldCBzdHJzOiBzdHJpbmdbXSA9IGRlc3RpbmF0aW9uLnNwbGl0ICgvXFwtXFw+L2cpO1xuXHRcdGxldCB0eXBlOiBzdHJpbmcgPSBzdHJzWzBdO1xuXG5cdFx0aWYgKHR5cGUubGVuZ3RoIDwgMilcblx0XHRcdHJldHVybiAobnVsbCk7XG5cblx0XHRpZiAoKHR5cGVbMF0gPT09IFwiL1wiKSAmJiAodHlwZVsxXSA9PT0gXCIvXCIpKVxuXHRcdFx0cmV0dXJuIChudWxsKTtcblxuXHRcdGxldCBnZXRUeXBlOiAodHlwZVN0cjogc3RyaW5nLCB0eXBlRGVsaW1pdGVyOiBzdHJpbmcpID0+IHN0cmluZyA9IFxuXHRcdFx0KHR5cGVTdHI6IHN0cmluZywgdHlwZURlbGltaXRlcjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHR7XG5cdFx0XHRcdGxldCBwb3M6IG51bWJlciA9IHR5cGVTdHIuaW5kZXhPZiAodHlwZURlbGltaXRlcik7XG5cdFx0XHRcdGxldCB0eXBlVmFsdWU6IHN0cmluZyA9IFwiXCI7XG5cdFx0XG5cdFx0XHRcdGlmIChwb3MgPiAtMSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGVWYWx1ZSA9IHR5cGVTdHIuc3Vic3RyIChwb3MgKyB0eXBlRGVsaW1pdGVyLmxlbmd0aCk7XG5cdFx0XHRcdFx0dHlwZVZhbHVlID0gdHlwZVZhbHVlLnRyaW0gKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gKHR5cGVWYWx1ZSk7XG5cdFx0XHR9O1xuXG5cdFx0bmV3RGVzdGluYXRpb24udXJsID0gZ2V0VHlwZSAodHlwZSwgXCJ1cmw6XCIpO1xuXHRcdG5ld0Rlc3RpbmF0aW9uLmFwaSA9IGdldFR5cGUgKHR5cGUsIFwiYXBpOlwiKTtcblxuXHRcdGZvciAobGV0IGlJZHggPSAxOyBpSWR4IDwgc3Rycy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgbmV3UGF0aFN0cjogc3RyaW5nID0gc3Ryc1tpSWR4XTtcblx0XHRcdGxldCBuZXdQYXRoOiBIb3RUZXN0U3RvcCA9IHtcblx0XHRcdFx0XHRjbWQ6IFwiXCIsXG5cdFx0XHRcdFx0ZGVzdDogXCJcIixcblx0XHRcdFx0XHRwYXRoOiBcIlwiXG5cdFx0XHRcdH07XG5cblx0XHRcdG5ld1BhdGhTdHIgPSBuZXdQYXRoU3RyLnRyaW0gKCk7XG5cdFx0XHRuZXdQYXRoLmRlc3QgPSBnZXRUeXBlIChuZXdQYXRoU3RyLCBcImRlc3Q6XCIpO1xuXHRcdFx0bmV3UGF0aC5jbWQgPSBnZXRUeXBlIChuZXdQYXRoU3RyLCBcImNtZDpcIik7XG5cdFx0XHRuZXdQYXRoLnBhdGggPSBnZXRUeXBlIChuZXdQYXRoU3RyLCBcInBhdGg6XCIpO1xuXG5cdFx0XHRpZiAoKG5ld1BhdGguZGVzdCA9PSBcIlwiKSAmJiAobmV3UGF0aC5jbWQgPT0gXCJcIikgJiYgKG5ld1BhdGgucGF0aCA9PSBcIlwiKSlcblx0XHRcdFx0bmV3UGF0aC5wYXRoID0gbmV3UGF0aFN0cjtcblxuXHRcdFx0bmV3RGVzdGluYXRpb24ucGF0aHMucHVzaCAobmV3UGF0aCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChuZXdEZXN0aW5hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbiBBUEkncyB0ZXN0IHBhdGguXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdEFQSVBhdGggKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCwgXG5cdFx0dGVzdE5hbWU6IHN0cmluZywgc2tpcEV2ZW50Q2FsbHM6IGJvb2xlYW4gPSBmYWxzZSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJ1blRlc3RQYXRoOiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdGlmIChtZXRob2QgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRyeWluZyB0byBhY2Nlc3MgbnVsbCBtZXRob2Qgb24gZGVzdGluYXRpb24gbWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX0uYCk7XG5cblx0XHQvLyBBIGR1bWIgaGFjayB0byBwcmV2ZW50IGFueSByZWN1cnNpb24gdGhhdCBjb3VsZCBvY2N1ci5cblx0XHRpZiAoc2tpcEV2ZW50Q2FsbHMgPT09IGZhbHNlKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLm9uVGVzdEFQSVBhdGhTdGFydCAhPSBudWxsKVxuXHRcdFx0XHRydW5UZXN0UGF0aCA9IGF3YWl0IHRoaXMub25UZXN0QVBJUGF0aFN0YXJ0IChkZXN0aW5hdGlvbiwgbWV0aG9kLCB0ZXN0TmFtZSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cblx0XHRpZiAocnVuVGVzdFBhdGggPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0bGV0IHRlc3RDYXNlT2JqZWN0OiBUZXN0Q2FzZU9iamVjdCA9IG1ldGhvZC50ZXN0Q2FzZXNbdGVzdE5hbWVdO1xuXG5cdFx0XHRpZiAodGVzdENhc2VPYmplY3QgPT0gbnVsbClcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBUZXN0IGNhc2Ugb2JqZWN0ICR7dGVzdE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0XHRyZXN1bHQgPSBhd2FpdCB0ZXN0Q2FzZU9iamVjdC5mdW5jICh0aGlzLmRyaXZlcik7XG5cdFx0fVxuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RBUElQYXRoRW5kICE9IG51bGwpXG5cdFx0XHRcdGF3YWl0IHRoaXMub25UZXN0QVBJUGF0aEVuZCAoZGVzdGluYXRpb24sIG1ldGhvZCwgdGVzdE5hbWUsIHJlc3VsdCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFsbCB0ZXN0IHBhdGhzIGluIGFuIEFQSSByb3V0ZS5cblx0ICogXG5cdCAqIEBmaXhtZSBUaGlzIG5lZWRzIGEgYmV0dGVyIGltcGxlbWVudGF0aW9uLi4uXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdEFQSVBhdGhzIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24pOiBQcm9taXNlPGFueVtdPlxuXHR7XG5cdFx0bGV0IHJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSB0aGlzLnRlc3RNYXBzW2Rlc3RpbmF0aW9uLm1hcE5hbWVdO1xuXG5cdFx0aWYgKHRlc3RNYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQVBJIE1hcCAke2Rlc3RpbmF0aW9uLm1hcE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0aWYgKHRoaXMucHJvY2Vzc29yLmFwaSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBBc3NvY2lhdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBoYXZlIGFuIEFQSSFgKTtcblxuXHRcdGxldCByb3V0ZTogSG90Um91dGUgPSB0aGlzLnByb2Nlc3Nvci5hcGkucm91dGVzW2Rlc3RpbmF0aW9uLmFwaV07XG5cblx0XHRpZiAocm91dGUgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQVBJIGRvZXMgbm90IGhhdmUgcm91dGUgJHtkZXN0aW5hdGlvbi5hcGl9IWApO1xuXG5cdFx0Ly8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcGF0aCBpbiB0aGUgZGVzdGluYXRpb24gdW50aWwgY29tcGxldGUuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBkZXN0aW5hdGlvbi5wYXRocy5sZW5ndGg7IGlJZHggKz0gMilcblx0XHR7XG5cdFx0XHRsZXQgc3RvcDogSG90VGVzdFN0b3AgPSBkZXN0aW5hdGlvbi5wYXRoc1tpSWR4XTtcblx0XHRcdGxldCBwYXRoTmFtZTogc3RyaW5nID0gc3RvcC5wYXRoO1xuXHRcdFx0bGV0IG1ldGhvZDogSG90Um91dGVNZXRob2QgPSByb3V0ZS5nZXRNZXRob2QgKHBhdGhOYW1lKTtcblx0XHRcdGxldCBuZXh0U3RvcDogSG90VGVzdFN0b3AgPSBkZXN0aW5hdGlvbi5wYXRoc1tpSWR4ICsgMV07XG5cdFx0XHRsZXQgdGVzdE5hbWU6IHN0cmluZyA9IG5leHRTdG9wLnBhdGg7XG5cblx0XHRcdGlmIChtZXRob2QgPT0gbnVsbClcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgbWV0aG9kIHJlbGF0ZWQgdG8gcGF0aCAke3BhdGhOYW1lfSBpbiBtYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfWApO1xuXG5cdFx0XHRsZXQgcmVzdWx0OiBhbnkgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0QVBJUGF0aCAoZGVzdGluYXRpb24sIG1ldGhvZCwgdGVzdE5hbWUpO1xuXG5cdFx0XHRyZXN1bHRzLnB1c2ggKHJlc3VsdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChyZXN1bHRzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGEgdGVzdCBwYWdlIHBhdGguXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdFBhZ2VQYXRoIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHN0b3A6IEhvdFRlc3RTdG9wLCBcblx0XHRza2lwRXZlbnRDYWxsczogYm9vbGVhbiA9IGZhbHNlLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRhd2FpdCB0aGlzLndhaXRGb3JEYXRhICgpO1xuXG5cdFx0bGV0IHJ1blRlc3RQYXRoOiBib29sZWFuID0gdHJ1ZTtcblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV07XG5cblx0XHQvLy8gQGZpeG1lIEZvciBzb21lIHJlYXNvbiB0aGUgZXJyb3JzIGJlaW5nIHRocm93biBoZXJlIGFyZSBub3QgYmVpbmcgdGhyb3duLlxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFdlYiBNYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGxldCBwYWdlOiBIb3RUZXN0UGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG5cblx0XHRpZiAocGFnZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBBIGN1cnJlbnQgcGFnZSB3YXMgbm90IHNldCFgKTtcblxuXHRcdHRoaXMuZHJpdmVyLnBhZ2UgPSBwYWdlO1xuXG5cdFx0bGV0IHRlc3RQYXRoTmFtZTogc3RyaW5nID0gc3RvcC5wYXRoO1xuXHRcdGxldCB0ZXN0UGF0aDogSG90VGVzdFBhdGggPSBwYWdlLnRlc3RQYXRoc1t0ZXN0UGF0aE5hbWVdO1xuXG5cdFx0Ly8gQSBkdW1iIGhhY2sgdG8gcHJldmVudCBhbnkgcmVjdXJzaW9uIHRoYXQgY291bGQgb2NjdXIuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RQYWdlUGF0aFN0YXJ0ICE9IG51bGwpXG5cdFx0XHRcdHJ1blRlc3RQYXRoID0gYXdhaXQgdGhpcy5vblRlc3RQYWdlUGF0aFN0YXJ0IChkZXN0aW5hdGlvbiwgc3RvcCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cblx0XHRpZiAocnVuVGVzdFBhdGggPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0aWYgKHRlc3RQYXRoID09IG51bGwpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogVGVzdCBwYXRoICR7dGVzdFBhdGhOYW1lfSBkb2VzIG5vdCBoYXZlIGEgZnVuY3Rpb24hYCk7XG5cblx0XHRcdHJlc3VsdCA9IGF3YWl0IHRlc3RQYXRoICh0aGlzLmRyaXZlcik7XG5cdFx0fVxuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RQYWdlUGF0aEVuZCAhPSBudWxsKVxuXHRcdFx0XHRhd2FpdCB0aGlzLm9uVGVzdFBhZ2VQYXRoRW5kIChkZXN0aW5hdGlvbiwgdGVzdFBhdGgsIHJlc3VsdCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdGlmIChydW5UZXN0UGF0aCA9PT0gdHJ1ZSlcblx0XHRcdGF3YWl0IEhvdFN0YXEud2FpdCAodGhpcy5kcml2ZXIucGFnZVRlc3REZWxheSk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIGNvbW1hbmQuIEV4YW1wbGU6XG5cdCAqIHBhZ2U6RGFzaGJvYXJkIC0+IGNtZDpjbGljayhidXR0b24pXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQ29tbWFuZCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBzdG9wOiBIb3RUZXN0U3RvcCwgY21kOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHQvKipcblx0XHQgKiBDaGVjayBpZiB0aGUgaW5wdXQgY29tbWFuZCBtYXRjaGVzLlxuXHRcdCAqL1xuXHRcdGxldCBoYXNDbWQ6IChpbnB1dDogc3RyaW5nLCBjbWQ6IHN0cmluZywgaGFzQXJndW1lbnRzOiBib29sZWFuKSA9PiBib29sZWFuID0gXG5cdFx0XHQoaW5wdXQ6IHN0cmluZywgY21kOiBzdHJpbmcsIGhhc0FyZ3VtZW50czogYm9vbGVhbik6IGJvb2xlYW4gPT5cblx0XHRcdHtcblx0XHRcdFx0bGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdFx0XHRcdGlmIChzdG9wLmNtZCA9PT0gY21kKVxuXHRcdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cblx0XHRcdFx0Y29uc3QgcG9zOiBudW1iZXIgPSBzdG9wLmNtZC5pbmRleE9mIChcIihcIik7XG5cblx0XHRcdFx0Ly8gSWYgdGhlcmUncyBwYXJlbnRoZXNpcywgZ2V0IHRoZSBpbmNvbWluZyBjb21tYW5kLlxuXHRcdFx0XHRpZiAocG9zID4gLTEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgaW5wdXRDbWQ6IHN0cmluZyA9IHN0b3AuY21kLnN1YnN0ciAoMCwgcG9zKTtcblxuXHRcdFx0XHRcdGlmIChpbnB1dENtZCA9PT0gY21kKVxuXHRcdFx0XHRcdFx0cmVzdWx0ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAocmVzdWx0KTtcblx0XHRcdH07XG5cdFx0LyoqXG5cdFx0ICogR2V0IHRoZSBhcmd1bWVudHMgaW4gYSBjb21tYW5kLlxuXHRcdCAqL1xuXHRcdGxldCBnZXRDbWRBcmdzOiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nW10gPSBcblx0XHRcdChpbnB1dDogc3RyaW5nKTogc3RyaW5nW10gPT5cblx0XHRcdHtcblx0XHRcdFx0bGV0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goL1xcKChbXildKylcXCkvKTtcbiAgICBcblx0XHRcdFx0aWYgKCFtYXRjaClcblx0XHRcdFx0XHRyZXR1cm4gKFtdKTtcblxuXHRcdFx0XHRyZXN1bHRzID0gbWF0Y2hbMV0uc3BsaXQoJywnKS5tYXAoYXJnID0+IGFyZy50cmltKCkpO1xuXG5cdFx0XHRcdHJldHVybiAocmVzdWx0cyk7XG5cdFx0XHR9O1xuXG5cdFx0bGV0IGNtZEZ1bmM6ICgoY21kQXJnczogc3RyaW5nW10pID0+IFByb21pc2U8dm9pZD4pID0gbnVsbDtcblx0XHRsZXQgYXJnczogc3RyaW5nW10gPSBbXTtcblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcInVybFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0OiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGlmICh0aGlzLmRyaXZlcltcIndhaXRGb3JUZXN0RWxlbWVudFwiXSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEcml2ZXIgJHt0aGlzLmRyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IHdhaXRGb3JUZXN0RWxlbWVudCFgKTtcblxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci5uYXZpZ2F0ZVRvVXJsIChpbnB1dCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwid2FpdEZvclRlc3RPYmplY3RcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCB0ZXN0T2JqZWN0OiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGlmICh0aGlzLmRyaXZlcltcIndhaXRGb3JUZXN0RWxlbWVudFwiXSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEcml2ZXIgJHt0aGlzLmRyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IHdhaXRGb3JUZXN0RWxlbWVudCFgKTtcblxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci53YWl0Rm9yVGVzdEVsZW1lbnQgKHRlc3RPYmplY3QpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcIndhaXRGb3JUZXN0ZXJBUElEYXRhXCIsIGZhbHNlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5maW5pc2hlZExvYWRpbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLndhaXRGb3JEYXRhICgpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcIndhaXRcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBudW1NaWxsaXNlY29uZHM6IG51bWJlciA9IHBhcnNlSW50IChjbWRBcmdzWzBdKTtcblxuXHRcdFx0XHRcdGF3YWl0IEhvdFN0YXEud2FpdCAobnVtTWlsbGlzZWNvbmRzKTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJwcmludFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0OiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kcml2ZXIucHJpbnQgKGlucHV0KTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJwcmludGxuXCIsIHRydWUpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgaW5wdXQ6IHN0cmluZyA9IGNtZEFyZ3NbMF07XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci5wcmludGxuIChpbnB1dCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwiY2xpY2tcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBlbG1OYW1lOiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGlmICh0aGlzLmRyaXZlcltcIndhaXRGb3JUZXN0RWxlbWVudFwiXSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEcml2ZXIgJHt0aGlzLmRyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IHdhaXRGb3JUZXN0RWxlbWVudCFgKTtcblxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRjb25zdCBlbG0gPSBhd2FpdCB0aGlzLmRyaXZlci53YWl0Rm9yVGVzdEVsZW1lbnQgKGVsbU5hbWUpO1xuXHRcdFx0XHRcdGF3YWl0IGVsbS5jbGljayAoKTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJzZW5kS2V5c1wiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGVsbU5hbWU6IHN0cmluZyA9IGNtZEFyZ3NbMF07XG5cdFx0XHRcdFx0bGV0IGlucHV0OiBzdHJpbmcgPSBjbWRBcmdzWzFdO1xuXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGlmICh0aGlzLmRyaXZlcltcIndhaXRGb3JUZXN0RWxlbWVudFwiXSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEcml2ZXIgJHt0aGlzLmRyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IHdhaXRGb3JUZXN0RWxlbWVudCFgKTtcblxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRjb25zdCBlbG0gPSBhd2FpdCB0aGlzLmRyaXZlci53YWl0Rm9yVGVzdEVsZW1lbnQgKGVsbU5hbWUpO1xuXHRcdFx0XHRcdGF3YWl0IGVsbS5zZW5kS2V5cyAoaW5wdXQpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcImNsZWFyXCIsIHRydWUpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgZWxtTmFtZTogc3RyaW5nID0gY21kQXJnc1swXTtcblxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRpZiAodGhpcy5kcml2ZXJbXCJ3YWl0Rm9yVGVzdEVsZW1lbnRcIl0gPT0gbnVsbClcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogRHJpdmVyICR7dGhpcy5kcml2ZXIuY29uc3RydWN0b3IubmFtZX0gZG9lcyBub3Qgc3VwcG9ydCB3YWl0Rm9yVGVzdEVsZW1lbnQhYCk7XG5cblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0Y29uc3QgZWxtID0gYXdhaXQgdGhpcy5kcml2ZXIud2FpdEZvclRlc3RFbGVtZW50IChlbG1OYW1lKTtcblx0XHRcdFx0XHRhd2FpdCBlbG0uY2xlYXIgKCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwiZGVidWdnZXJcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIEtlZXAgdGhpcy4gVGhpcyBpcyBjb3JyZWN0LlxuXHRcdFx0XHRcdGRlYnVnZ2VyO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChjbWRGdW5jID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IENvbW1hbmQgJHtzdG9wLmNtZH0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRhd2FpdCB0aGlzLm9uQ29tbWFuZCAoZGVzdGluYXRpb24sIHN0b3AsIGNtZCwgYXJncywgY21kRnVuYyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbGwgdGVzdCBwYXRocyBpbiBhIHBhZ2UuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdFBhZ2VQYXRocyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxhbnlbXT5cblx0e1xuXHRcdGxldCByZXN1bHRzOiBhbnlbXSA9IFtdO1xuXHRcdGxldCB0ZXN0TWFwOiBIb3RUZXN0TWFwID0gdGhpcy50ZXN0TWFwc1tkZXN0aW5hdGlvbi5tYXBOYW1lXTtcblxuXHRcdC8vLyBAZml4bWUgRm9yIHNvbWUgcmVhc29uIHRoZSBlcnJvcnMgYmVpbmcgdGhyb3duIGhlcmUgYXJlIG5vdCBiZWluZyB0aHJvd24uXG5cdFx0aWYgKHRlc3RNYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogV2ViIE1hcCAke2Rlc3RpbmF0aW9uLm1hcE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0Ly8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcGF0aCBpbiB0aGUgZGVzdGluYXRpb24gdW50aWwgY29tcGxldGUuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBkZXN0aW5hdGlvbi5wYXRocy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgc3RvcDogSG90VGVzdFN0b3AgPSBkZXN0aW5hdGlvbi5wYXRoc1tpSWR4XTtcblx0XHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cblx0XHRcdGlmIChzdG9wLmRlc3QgIT09IFwiXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0ZXN0TWFwLmRlc3RpbmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogV2hlbiB1c2luZyB0eXBlICdkZXN0JyBpbiBhIGRlc3RpbmF0aW9uIHN0cmluZywgYWxsIGRlc3RpbmF0aW9ucyBpbiBtYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBtdXN0IGJlIG5hbWVkLmApO1xuXG5cdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gdGVzdE1hcC5kZXN0aW5hdGlvbnNbc3RvcC5kZXN0XTtcblx0XHRcdFx0bGV0IG5ld0Rlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiA9IEhvdFRlc3Rlci5pbnRlcnByZXREZXN0aW5hdGlvbiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9uLm1hcE5hbWUsIHRlc3REZXN0KTtcblxuXHRcdFx0XHRpZiAobmV3RGVzdGluYXRpb24gIT0gbnVsbClcblx0XHRcdFx0XHRyZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0UGFnZVBhdGhzIChuZXdEZXN0aW5hdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdG9wLmNtZCAhPT0gXCJcIilcblx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlQ29tbWFuZCAoZGVzdGluYXRpb24sIHN0b3AsIHN0b3AuY21kKTtcblxuXHRcdFx0aWYgKHN0b3AucGF0aCAhPT0gXCJcIilcblx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRoIChkZXN0aW5hdGlvbiwgc3RvcCwgZmFsc2UsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblxuXHRcdFx0cmVzdWx0cy5wdXNoIChyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0cyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0aGUgdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlIChtYXBOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgbWFwOiBIb3RUZXN0TWFwID0gdGhpcy50ZXN0TWFwc1ttYXBOYW1lXTtcblxuXHRcdGlmIChtYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogTWFwICR7bWFwTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHR0aGlzLnByb2Nlc3Nvci5sb2dnZXIudmVyYm9zZSAoYEhvdFRlc3RlcjogRXhlY3V0aW5nIG1hcCAke21hcE5hbWV9Li4uYCk7XG5cblx0XHQvLyBQcm9jZXNzIHJvdXRlcyB0ZXN0aW5nIGZpcnN0LlxuXHRcdGxldCByb3V0ZUtleTogc3RyaW5nID0gdGhpcy5wcm9jZXNzb3IuZ2V0Um91dGVLZXlGcm9tTmFtZSAobWFwTmFtZSk7XG5cblx0XHRsZXQgZXhlY3V0ZURlc3RpbmF0aW9uOiAodGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbiwgZGVzdGluYXRpb25LZXk/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4gPSBcblx0XHRcdGFzeW5jICh0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uLCBkZXN0aW5hdGlvbktleTogc3RyaW5nID0gXCJcIikgPT5cblx0XHRcdHtcblx0XHRcdFx0aWYgKHRlc3REZXN0LmF1dG9TdGFydCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5wcm9jZXNzb3IubG9nZ2VyLnZlcmJvc2UgKCgpID0+IGBIb3RUZXN0ZXI6IEV4ZWN1dGluZyAke21hcE5hbWV9IGRlc3RpbmF0aW9uICR7SlNPTi5zdHJpbmdpZnkgKHRlc3REZXN0KX0uLi5gKTtcblx0XHRcdFx0XHRsZXQgZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uID0gSG90VGVzdGVyLmludGVycHJldERlc3RpbmF0aW9uIChtYXBOYW1lLCB0ZXN0RGVzdCk7XG5cdFx0XHRcdFx0bGV0IGlzV2ViUm91dGU6IGJvb2xlYW4gPSBmYWxzZTtcblx0XHRcdFx0XHRsZXQgcnVuVGVzdFBhdGhzOiBib29sZWFuID0gdHJ1ZTtcblx0XHRcdFx0XHRsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJhc2VVcmw7XG5cblx0XHRcdFx0XHRpZiAoZGVzdGluYXRpb24udXJsICE9PSBcIlwiKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlzV2ViUm91dGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0dXJsICs9IGRlc3RpbmF0aW9uLnVybDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodGhpcy5zZXR1cCAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhc0JlZW5TZXR1cCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuc2V0dXAgKGlzV2ViUm91dGUsIHVybCwgZGVzdGluYXRpb25LZXkpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmhhc0JlZW5TZXR1cCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHRpZiAodGhpcy5vblRlc3RTdGFydCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0cnVuVGVzdFBhdGhzID0gYXdhaXQgdGhpcy5vblRlc3RTdGFydCAoZGVzdGluYXRpb24sIHVybCwgZGVzdGluYXRpb25LZXkpO1xuXHRcdFxuXHRcdFx0XHRcdGlmIChydW5UZXN0UGF0aHMgPT09IHRydWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGRlc3RpbmF0aW9uLnVybCAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRocyAoZGVzdGluYXRpb24pO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKGRlc3RpbmF0aW9uLmFwaSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdEFQSVBhdGhzIChkZXN0aW5hdGlvbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMub25UZXN0RW5kICE9IG51bGwpXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLm9uVGVzdEVuZCAoZGVzdGluYXRpb24pO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuZGVzdHJveSAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhc0JlZW5EZXN0cm95ZWQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmRlc3Ryb3kgKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlblNldHVwID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRocm93IGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIG1hcCBkZXN0aW5hdGlvbnMgYXJlIGluIGFuIGFycmF5LCBqdXN0IGV4ZWN1dGUgdGhvc2UgaW4gb3JkZXIuXG5cdFx0aWYgKG1hcC5kZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcC5kZXN0aW5hdGlvbnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1tpSWR4XTtcblxuXHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdC8vIElmIHRoZXJlJ3MgYSBkZXN0aW5hdGlvbiBvcmRlciwgdXNlIHRoYXQuXG5cdFx0XHRpZiAobWFwLmRlc3RpbmF0aW9uT3JkZXIubGVuZ3RoID4gMClcblx0XHRcdHtcblx0XHRcdFx0bGV0IGhhc0V4ZWN1dGVkS2V5czogc3RyaW5nW10gPSBbXTtcblxuXHRcdFx0XHQvLyBHbyB0aHJvdWdoIHRoZSBkZXN0aW5hdGlvbiBvcmRlciBhbmQgZXhlY3V0ZSBlYWNoIG9uZS5cblx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXAuZGVzdGluYXRpb25PcmRlci5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBvcmRlcktleTogc3RyaW5nID0gbWFwLmRlc3RpbmF0aW9uT3JkZXJbaUlkeF07XG5cdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW29yZGVyS2V5XTtcblxuXHRcdFx0XHRcdGlmICh0ZXN0RGVzdCA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEZXN0aW5hdGlvbiAke29yZGVyS2V5fSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdFx0XHRcdGhhc0V4ZWN1dGVkS2V5cy5wdXNoIChvcmRlcktleSk7XG5cdFx0XHRcdFx0YXdhaXQgZXhlY3V0ZURlc3RpbmF0aW9uICh0ZXN0RGVzdCwgb3JkZXJLZXkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgcmVzdCBvZiB0aGUgZGVzdGluYXRpb25zIHRoYXQgaGF2ZSBub3QgYmVlbiBleGVjdXRlZCB5ZXQuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiBtYXAuZGVzdGluYXRpb25zKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGV4ZWN1dGVEZXN0OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgaGFzRXhlY3V0ZWRLZXlzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBleGVjdXRlZEtleTogc3RyaW5nID0gaGFzRXhlY3V0ZWRLZXlzW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRpZiAoZXhlY3V0ZWRLZXkgPT09IGtleSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZXhlY3V0ZURlc3QgPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoZXhlY3V0ZURlc3QgPT09IHRydWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0XHRcdGF3YWl0IGV4ZWN1dGVEZXN0aW5hdGlvbiAodGVzdERlc3QsIGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIGRlc3RpbmF0aW9ucyBpbiBhbnkgb3JkZXIuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiBtYXAuZGVzdGluYXRpb25zKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0LCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgRXZlbnRFeGVjdXRpb25UeXBlLCBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90VGVzdGVyIH0gZnJvbSBcIi4vSG90VGVzdGVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwLCBIb3RUZXN0UGF0aCB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcbmltcG9ydCB7IEhvdEV2ZW50TWV0aG9kLCBTZXJ2ZXJSZXF1ZXN0IH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdFRlc3RQYWdlIH0gZnJvbSBcIi4vSG90VGVzdFBhZ2VcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5cbmV4cG9ydCBjbGFzcyBIb3RUZXN0ZXJBUEkgZXh0ZW5kcyBIb3RBUElcbntcblx0Y29uc3RydWN0b3IgKGJhc2VVcmw6IHN0cmluZywgY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50ID0gbnVsbCwgZGI6IGFueSA9IG51bGwpXG5cdHtcblx0XHRzdXBlcihiYXNlVXJsLCBjb25uZWN0aW9uLCBkYik7XG5cblx0XHR0aGlzLmV4ZWN1dGVFdmVudHNVc2luZyA9IEV2ZW50RXhlY3V0aW9uVHlwZS5Ib3RBUEk7XG5cblx0XHRsZXQgcm91dGU6IEhvdFJvdXRlID0gbmV3IEhvdFJvdXRlIChjb25uZWN0aW9uLCBcInRlc3RlclwiKTtcblx0XHRyb3V0ZS5hZGRNZXRob2QgKHtcblx0XHRcdFx0XCJuYW1lXCI6IFwicGFnZUxvYWRlZFwiLCBcblx0XHRcdFx0XCJvblNlcnZlckV4ZWN1dGVcIjogdGhpcy5wYWdlTG9hZGVkLFxuXHRcdFx0XHRcInBhcmFtZXRlcnNcIjoge1xuXHRcdFx0XHRcdFx0XCJ0ZXN0ZXJOYW1lXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJzdHJpbmdcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgZXhlY3V0aW5nIHRoZSB0ZXN0LlwiXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XCJ0ZXN0ZXJNYXBcIjoge1xuXHRcdFx0XHRcdFx0XHRcInJlcXVpcmVkXCI6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIHRlc3RlciBtYXAgZXhlY3V0aW5nIHRoZSB0ZXN0LlwiXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XCJwYWdlTmFtZVwiOiB7XG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogXCJUaGUgbmFtZSBvZiB0aGUgcGFnZSBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcInRlc3RFbGVtZW50c1wiOiB7XG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwiYXJyYXlcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSB0ZXN0IGVsZW1lbnRzIG9uIHRoZSBwYWdlLlwiXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XCJ0ZXN0UGF0aHNcIjoge1xuXHRcdFx0XHRcdFx0XHRcInJlcXVpcmVkXCI6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBcImFycmF5XCIsXG5cdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogXCJUaGUgdGVzdCBwYXRocyBvbiB0aGUgcGFnZS5cIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFwicmV0dXJuc1wiOiBcIlJldHVybnMgdHJ1ZSBhcyBhbiBhY2tub3dsZWRnZW1lbnQuXCJcblx0XHRcdH0pO1xuXHRcdHJvdXRlLmFkZE1ldGhvZCAoe1xuXHRcdFx0XHRcIm5hbWVcIjogXCJwYWdlVW5sb2FkZWRcIiwgXG5cdFx0XHRcdFwib25TZXJ2ZXJFeGVjdXRlXCI6IHRoaXMucGFnZVVubG9hZGVkLFxuXHRcdFx0XHRcInBhcmFtZXRlcnNcIjoge1xuXHRcdFx0XHRcdFx0XCJ0ZXN0ZXJOYW1lXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJzdHJpbmdcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgZXhlY3V0aW5nIHRoZSB0ZXN0LlwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XCJyZXR1cm5zXCI6IFwiUmV0dXJucyB0cnVlIGFzIGFuIGFja25vd2xlZGdlbWVudC5cIlxuXHRcdFx0fSk7XG5cdFx0cm91dGUuYWRkTWV0aG9kICh7XG5cdFx0XHRcdFwibmFtZVwiOiBcImV4ZWN1dGVUZXN0c1wiLFxuXHRcdFx0XHRcIm9uU2VydmVyRXhlY3V0ZVwiOiB0aGlzLmV4ZWN1dGVUZXN0cyxcblx0XHRcdFx0XCJwYXJhbWV0ZXJzXCI6IHtcblx0XHRcdFx0XHRcInRlc3Rlck5hbWVcIjoge1xuXHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIG5hbWUgb2YgdGhlIHRlc3RlciBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwidGVzdGVyTWFwXCI6IHtcblx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFwidHlwZVwiOiBcIm9iamVjdFwiLFxuXHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSB0ZXN0ZXIgbWFwIHRvIGV4ZWN1dGUuXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwicmV0dXJuc1wiOiBcIlJldHVybnMgdHJ1ZSB3aGVuIHRlc3RzIGFyZSBjb21wbGV0ZS5cIlxuXHRcdFx0fSk7XG5cdFx0cm91dGUuYWRkTWV0aG9kICh7XG5cdFx0XHRcdFwibmFtZVwiOiBcImhlYXJ0YmVhdFwiLFxuXHRcdFx0XHRcInR5cGVcIjogSG90RXZlbnRNZXRob2QuR0VULFxuXHRcdFx0XHRcIm9uU2VydmVyRXhlY3V0ZVwiOiB0aGlzLmhlYXJ0YmVhdCxcblx0XHRcdFx0XCJyZXR1cm5zXCI6IFwiUmV0dXJucyB0cnVlIGFzIGFuIGFja25vd2xlZGdlbWVudC5cIlxuXHRcdFx0fSk7XG5cdFx0dGhpcy5hZGRSb3V0ZSAocm91dGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHBhZ2UgaGFzIGZpbmlzaGVkIGxvYWRpbmcgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cblx0ICovXG5cdGFzeW5jIHBhZ2VMb2FkZWQgKHJlcXVlc3Q6IFNlcnZlclJlcXVlc3QpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCB0ZXN0ZXJPYmo6IHtcblx0XHRcdFx0dGVzdGVyTmFtZTogc3RyaW5nO1xuXHRcdFx0XHR0ZXN0RWxlbWVudHM6IGFueTtcblx0XHRcdFx0dGVzdFBhdGhzU3RyczogYW55O1xuXHRcdFx0fSA9IHtcblx0XHRcdFx0dGVzdGVyTmFtZTogcmVxdWVzdC5qc29uT2JqW1widGVzdGVyTmFtZVwiXSxcblx0XHRcdFx0dGVzdEVsZW1lbnRzOiByZXF1ZXN0Lmpzb25PYmpbXCJ0ZXN0RWxlbWVudHNcIl0sXG5cdFx0XHRcdHRlc3RQYXRoc1N0cnM6IHJlcXVlc3QuanNvbk9ialtcInRlc3RQYXRoc1wiXVxuXHRcdFx0fTtcblxuXHRcdGZvciAobGV0IGtleSBpbiB0ZXN0ZXJPYmopXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0bGV0IHRlc3RPYmo6IGFueSA9IHRlc3Rlck9ialtrZXldO1xuXHRcdFx0bGV0IHRocm93RXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0aWYgKHRlc3RPYmogPT0gbnVsbClcblx0XHRcdFx0dGhyb3dFcnJvciA9IHRydWU7XG5cblx0XHRcdGlmICgodGVzdGVyT2JqLnRlc3Rlck5hbWUgPT0gXCJcIikgfHwgXG5cdFx0XHRcdCh0ZXN0ZXJPYmoudGVzdEVsZW1lbnRzID09PSBcIlwiKSB8fCBcblx0XHRcdFx0KHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzID09PSBcIlwiKSlcblx0XHRcdHtcblx0XHRcdFx0dGhyb3dFcnJvciA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aHJvd0Vycm9yID09PSB0cnVlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IE9iamVjdCAke2tleX0gd2FzIG5vdCBwYXNzZWQuYCk7XG5cdFx0fVxuXG5cdFx0dGVzdGVyT2JqLnRlc3RFbGVtZW50cyA9IEpTT04ucGFyc2UgKHRlc3Rlck9iai50ZXN0RWxlbWVudHMpO1xuXHRcdHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzID0gSlNPTi5wYXJzZSAodGVzdGVyT2JqLnRlc3RQYXRoc1N0cnMpO1xuXG5cdFx0bGV0IHRlc3RQYXRoczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdFBhdGg7IH0gPSB7fTtcblxuXHRcdGZvciAobGV0IGtleSBpbiB0ZXN0ZXJPYmoudGVzdFBhdGhzU3Rycylcblx0XHR7XG5cdFx0XHRsZXQgdGVzdFBhdGg6IChkcml2ZXI6IEhvdFRlc3REcml2ZXIsIC4uLmFyZ3M6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gXG5cdFx0XHRcdGV2YWwgKHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzW2tleV0pO1xuXG5cdFx0XHR0ZXN0UGF0aHNba2V5XSA9IHRlc3RQYXRoO1xuXHRcdH1cblxuXHRcdGxldCB0ZXN0ZXI6IEhvdFRlc3RlciA9IHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IudGVzdGVyc1t0ZXN0ZXJPYmoudGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IFRlc3RlciAke3Rlc3Rlck9iai50ZXN0ZXJOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGxldCBuZXdQYWdlOiBIb3RUZXN0UGFnZSA9IHtcblx0XHRcdFx0XCJ0ZXN0RWxlbWVudHNcIjogdGVzdGVyT2JqLnRlc3RFbGVtZW50cyxcblx0XHRcdFx0XCJ0ZXN0UGF0aHNcIjogdGVzdFBhdGhzXG5cdFx0XHR9O1xuXG5cdFx0dGVzdGVyLmZpbmlzaGVkTG9hZGluZyA9IHRydWU7XG5cblx0XHRsZXQgc2V0QXNDdXJyZW50OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdGlmICh0ZXN0ZXIub25GaW5pc2hlZExvYWRpbmcgIT0gbnVsbClcblx0XHRcdHNldEFzQ3VycmVudCA9IGF3YWl0IHRlc3Rlci5vbkZpbmlzaGVkTG9hZGluZyAobmV3UGFnZSk7XG5cblx0XHRpZiAoc2V0QXNDdXJyZW50ID09PSB0cnVlKVxuXHRcdFx0dGVzdGVyLmN1cnJlbnRQYWdlID0gbmV3UGFnZTtcblxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgcGFnZSBoYXMgZmluaXNoZWQgdW5sb2FkaW5nIGluIGRldmVsb3BtZW50IG1vZGUuXG5cdCAqL1xuXHRhc3luYyBwYWdlVW5sb2FkZWQgKHJlcXVlc3Q6IFNlcnZlclJlcXVlc3QpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGNvbnN0IHRlc3Rlck5hbWU6IHN0cmluZyA9IEhvdFN0YXEuZ2V0UGFyYW0gKFwidGVzdGVyTmFtZVwiLCByZXF1ZXN0Lmpzb25PYmopO1xuXG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy5jb25uZWN0aW9uLnByb2Nlc3Nvci50ZXN0ZXJzW3Rlc3Rlck5hbWVdO1xuXG5cdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdGVyQVBJOiBUZXN0ZXIgJHt0ZXN0ZXJOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdHRlc3Rlci5maW5pc2hlZExvYWRpbmcgPSBmYWxzZTtcblx0XHR0ZXN0ZXIuY3VycmVudFBhZ2UgPSBudWxsO1xuXG5cdFx0aWYgKHRlc3Rlci5vbkZpbmlzaGVkVW5sb2FkaW5nICE9IG51bGwpXG5cdFx0XHRhd2FpdCB0ZXN0ZXIub25GaW5pc2hlZFVubG9hZGluZyAoKTtcblxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0aGUgdGVzdHMgZm9yIGEgcGFnZS5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0cyAocmVxOiBTZXJ2ZXJSZXF1ZXN0KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgdGVzdGVyTmFtZTogc3RyaW5nID0gcmVxLmpzb25PYmpbXCJ0ZXN0ZXJOYW1lXCJdO1xuXHRcdGxldCB0ZXN0ZXJNYXA6IHN0cmluZyA9IHJlcS5qc29uT2JqW1widGVzdGVyTWFwXCJdO1xuXG5cdFx0aWYgKCh0ZXN0ZXJOYW1lID09IG51bGwpIHx8ICh0ZXN0ZXJNYXAgPT0gbnVsbCkpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGVzdGVyQVBJOiBOb3QgYWxsIHJlcXVpcmVkIGpzb24gb2JqZWN0cyB3ZXJlIHBhc3NlZC5cIik7XG5cblx0XHRpZiAoKHRlc3Rlck5hbWUgPT09IFwiXCIpIHx8ICh0ZXN0ZXJNYXAgPT09IFwiXCIpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRlc3RlckFQSTogTm90IGFsbCByZXF1aXJlZCBqc29uIG9iamVjdHMgd2VyZSBwYXNzZWQuXCIpO1xuXG5cdFx0bGV0IHNlcnZlcjogSG90U2VydmVyID0gKDxIb3RTZXJ2ZXI+dGhpcy5jb25uZWN0aW9uKTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAoc2VydmVyLmV4ZWN1dGVUZXN0cyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGF3YWl0IHNlcnZlci5leGVjdXRlVGVzdHMgKHRlc3Rlck5hbWUsIHRlc3Rlck1hcCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNwb25kcyB3aXRoIHRydWUgdG8gaGVhcnRiZWF0IHJlcXVlc3RzLlxuXHQgKi9cblx0YXN5bmMgaGVhcnRiZWF0IChyZXE6IFNlcnZlclJlcXVlc3QpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdHJldHVybiAodHJ1ZSk7XG5cdH1cbn0iLCJpbXBvcnQgeyBNYW5hZ2VyT3B0aW9ucywgU29ja2V0LCBTb2NrZXRPcHRpb25zLCBpbyB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tIFwidXVpZFwiO1xuXG4vKipcbiAqIFRoZSBjbGllbnQtc2lkZSB3ZWJzb2NrZXQgY2xpZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgSG90V2ViU29ja2V0Q2xpZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSB3ZWJzb2NrZXQgc2VydmVyLlxuXHQgKi9cblx0dXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29ubmVjdGVkIHNvY2tldC5cblx0ICovXG5cdHNvY2tldDogU29ja2V0O1xuXHQvKipcblx0ICogQW55IGRhdGEgdGhhdCB0aGlzIGNsaWVudCBzb2NrZXQgc2hvdWxkIGNvbnRhaW4uXG5cdCAqL1xuXHRwZXJzaXN0ZW50RGF0YTogYW55O1xuXHQvKipcblx0ICogVGhlIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gYXV0aG9yaXppbmcgYSBjbGllbnQuIENhbiBiZSBhIEpXVCB0b2tlbiwgYXBpIGtleSwgZXRjLlxuXHQgKiBETyBOT1QgU1RPUkUgU0VOU0lUSVZFIElORk9STUFUSU9OIEhFUkUgU1VDSCBBUyBQQVNTV09SRFMuXG5cdCAqL1xuXHRhdXRob3JpemVkVmFsdWU6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGNsaWVudCBjb25uZWN0ZWQuXG5cdCAqL1xuXHRvbkNvbm5lY3Q6ICgpID0+IHZvaWQ7XG5cdC8qKlxuXHQgKiBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBjbGllbnQgaGFzIGFuIGVycm9yIHdoaWxlIGNvbm5lY3RpbmcuIFRoaXMgd2lsbCBcblx0ICogcHJldmVudCBhbiBleGNlcHRpb24gZnJvbSBiZWluZyB0aHJvd24uXG5cdCAqL1xuXHRvbkNvbm5lY3RFcnJvcjogKGVycjogYW55KSA9PiB2b2lkO1xuXHQvKipcblx0ICogVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgY2xpZW50IGhhcyBhbiBlcnJvci4gVGhpcyB3aWxsIFxuXHQgKiBwcmV2ZW50IGFuIGV4Y2VwdGlvbiBmcm9tIGJlaW5nIHRocm93bi5cblx0ICovXG5cdG9uRXJyb3I6IChlcnI6IGFueSkgPT4gdm9pZDtcblx0LyoqXG5cdCAqIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cy5cblx0ICovXG5cdG9uRGlzY29ubmVjdDogKCkgPT4gdm9pZDtcblxuXHRjb25zdHJ1Y3RvciAodXJsOiBzdHJpbmcsIHNvY2tldDogU29ja2V0ID0gbnVsbClcblx0e1xuXHRcdHRoaXMudXJsID0gdXJsO1xuXHRcdHRoaXMuc29ja2V0ID0gc29ja2V0O1xuXHRcdHRoaXMucGVyc2lzdGVudERhdGEgPSB7fTtcblx0XHR0aGlzLmF1dGhvcml6ZWRWYWx1ZSA9IG51bGw7XG5cdFx0dGhpcy5vbkNvbm5lY3RFcnJvciA9IG51bGw7XG5cdFx0dGhpcy5vbkVycm9yID0gbnVsbDtcblx0XHR0aGlzLm9uRGlzY29ubmVjdCA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogVXNlIGFuIGFscmVhZHkgY29ubmVjdGVkIHNvY2tldC5cblx0ICovXG5cdHVzZVNvY2tldCAoc29ja2V0OiBTb2NrZXQpOiB2b2lkXG5cdHtcblx0XHR0aGlzLnNvY2tldCA9IHNvY2tldDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25uZWN0IHRvIHRoZSB3ZWJzb2NrZXQgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgY29ubmVjdCAoYXV0aDogYW55ID0gbnVsbCwgcXVlcnk6IGFueSA9IG51bGwsIG9wdGlvbnM6IFBhcnRpYWw8TWFuYWdlck9wdGlvbnMgJiBTb2NrZXRPcHRpb25zPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBzb2NrZXRPYmo6IFBhcnRpYWw8TWFuYWdlck9wdGlvbnMgJiBTb2NrZXRPcHRpb25zPiB8IHVuZGVmaW5lZCA9IG9wdGlvbnM7XG5cblx0XHRpZiAoYXV0aCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmIChzb2NrZXRPYmogPT0gbnVsbClcblx0XHRcdFx0c29ja2V0T2JqID0ge307XG5cblx0XHRcdHNvY2tldE9iaiA9IHsgLi4uc29ja2V0T2JqLCBhdXRoOiBhdXRoIH07XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5ICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHNvY2tldE9iaiA9PSBudWxsKVxuXHRcdFx0XHRzb2NrZXRPYmogPSB7fTtcblxuXHRcdFx0c29ja2V0T2JqID0geyAuLi5zb2NrZXRPYmosIHF1ZXJ5OiBxdWVyeSB9O1xuXHRcdH1cblxuXHRcdHRoaXMuc29ja2V0ID0gaW8gKHRoaXMudXJsLCBzb2NrZXRPYmopO1xuXG5cdFx0cmV0dXJuIChuZXcgUHJvbWlzZTx2b2lkPiAoKHJlc29sdmUsIHJlamVjdCkgPT5cblx0XHRcdHtcblx0XHRcdFx0dGhpcy5zb2NrZXQub24gKFwiY29ubmVjdFwiLCAoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLm9uQ29ubmVjdCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aGlzLm9uQ29ubmVjdCAoKTtcblxuXHRcdFx0XHRcdFx0cmVzb2x2ZSAoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5zb2NrZXQub24gKFwiY29ubmVjdF9lcnJvclwiLCAoZXJyOiBhbnkpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMub25Db25uZWN0RXJyb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGhpcy5vbkNvbm5lY3RFcnJvciAoZXJyKTtcblxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJlamVjdCAoZXJyKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5zb2NrZXQub24gKFwiZXJyb3JcIiwgKGVycjogYW55KSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLm9uRXJyb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGhpcy5vbkVycm9yIChlcnIpO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmVqZWN0IChlcnIpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLnNvY2tldC5vbiAoXCJkaXNjb25uZWN0XCIsICgpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMub25EaXNjb25uZWN0ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRoaXMub25EaXNjb25uZWN0ICgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExpc3RlbiBmb3IgYSBjbGllbnQgZXZlbnQuXG5cdCAqL1xuXHRvbiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhOiBhbnksIHV1aWQ/OiBzdHJpbmcpID0+IHZvaWQsIHV1aWQ6IHN0cmluZyA9IG51bGwpOiB2b2lkXG5cdHtcblx0XHR0aGlzLnNvY2tldC5vbiAoZXZlbnQsIGZ1bmN0aW9uICh1dWlkMjogc3RyaW5nLCBkYXRhOiBhbnkpXG5cdFx0e1xuXHRcdFx0aWYgKGRhdGEudXVpZCAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodXVpZDIgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChkYXRhLnV1aWQgPT09IHV1aWQyKVxuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgKGRhdGEuZGF0YSwgZGF0YS51dWlkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0Y2FsbGJhY2sgKGRhdGEuZGF0YSwgZGF0YS51dWlkKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0Y2FsbGJhY2sgKGRhdGEsIHV1aWQyKTtcblx0XHR9LmJpbmQgKHRoaXMsIHV1aWQpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMaXN0ZW4gZm9yIGEgY2xpZW50IGV2ZW50IHdpdGhvdXQgYW55IGludGVydmVudGlvbi4gVGhlIGV2ZW50IHdpbGwgbm90IGhhdmUgYW55IFxuXHQgKiBpbnRlcmFjdGlvbiB3aXRoIHRoZSBldmVudCB1dWlkLlxuXHQgKi9cblx0b25SYXcgKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkKTogdm9pZFxuXHR7XG5cdFx0dGhpcy5zb2NrZXQub24gKGV2ZW50LCBjYWxsYmFjayk7XG5cdH1cblxuXHQvKipcblx0ICogU3RvcCBsaXN0ZW5pbmcgZm9yIGEgY2xpZW50IGV2ZW50LlxuXHQgKi9cblx0b2ZmIChldmVudDogc3RyaW5nKTogdm9pZFxuXHR7XG5cdFx0dGhpcy5zb2NrZXQub2ZmIChldmVudCwgbnVsbCk7XG5cdH1cblxuXHQvKipcblx0ICogTGlzdGVuIGZvciBhIGNsaWVudCBldmVudCBvbmNlLlxuXHQgKi9cblx0b25jZSAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhOiBhbnksIHV1aWQ/OiBzdHJpbmcpID0+IHZvaWQsIHV1aWQ6IHN0cmluZyA9IG51bGwpOiB2b2lkXG5cdHtcblx0XHR0aGlzLnNvY2tldC5vbmNlIChldmVudCwgZnVuY3Rpb24gKHV1aWQyOiBzdHJpbmcsIGRhdGE6IGFueSlcblx0XHR7XG5cdFx0XHRpZiAoZGF0YS51dWlkICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh1dWlkMiAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKGRhdGEudXVpZCA9PT0gdXVpZDIpXG5cdFx0XHRcdFx0XHRjYWxsYmFjayAoZGF0YS5kYXRhLCBkYXRhLnV1aWQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRjYWxsYmFjayAoZGF0YS5kYXRhLCBkYXRhLnV1aWQpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRjYWxsYmFjayAoZGF0YSwgdXVpZDIpO1xuXHRcdH0uYmluZCAodGhpcywgdXVpZCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExpc3RlbiBmb3IgYSBjbGllbnQgZXZlbnQgb25jZSB3aXRob3V0IGFueSBpbnRlcnZlbnRpb24uXG5cdCAqL1xuXHRvbmNlUmF3IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWRcblx0e1xuXHRcdHRoaXMuc29ja2V0Lm9uY2UgKGV2ZW50LCBjYWxsYmFjayk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBzb2NrZXQncyBpZC5cblx0ICovXG5cdGdldElkICgpOiBzdHJpbmdcblx0e1xuXHRcdHJldHVybiAodGhpcy5zb2NrZXQuaWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIElzIHRoZSBzb2NrZXQgY29ubmVjdGVkP1xuXHQgKi9cblx0aXNDb25uZWN0ZWQgKCk6IGJvb2xlYW5cblx0e1xuXHRcdGlmICh0aGlzLnNvY2tldCA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0XHRpZiAodGhpcy5zb2NrZXQuY29ubmVjdGVkID09PSBmYWxzZSlcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0cmV0dXJuICh0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZW5kIGFuIGV2ZW50IHRvIHRoZSBjbGllbnQuIFlvdSBjYW4gb3B0aW9uYWxseSByZWNlaXZlIGEgcmVzcG9uc2UgZnJvbSB0aGUgY2xpZW50LlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIHV1aWQgb2YgdGhlIGV2ZW50IHNlbnQuXG5cdCAqL1xuXHRzZW5kIChldmVudDogc3RyaW5nLCBkYXRhOiBhbnksIHV1aWQ6IHN0cmluZyA9IG51bGwpOiBzdHJpbmdcblx0e1xuXHRcdGlmICh0aGlzLnNvY2tldCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQ2xpZW50IHNvY2tldCBpcyBudWxsLiBVbmFibGUgdG8gc2VuZCBldmVudCAke2V2ZW50fWApO1xuXG5cdFx0aWYgKHRoaXMuc29ja2V0LmNvbm5lY3RlZCA9PT0gZmFsc2UpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBDbGllbnQgc29ja2V0IGlzIG5vdCBjb25uZWN0ZWQuIFVuYWJsZSB0byBzZW5kIGV2ZW50ICR7ZXZlbnR9YCk7XG5cblx0XHRpZiAodXVpZCA9PSBudWxsKVxuXHRcdFx0dXVpZCA9IHV1aWR2NCAoKTtcblxuXHRcdHRoaXMuc29ja2V0LmVtaXQgKGV2ZW50LCB7IHV1aWQ6IHV1aWQsIGRhdGE6IGRhdGEgfSk7XG5cblx0XHRyZXR1cm4gKHV1aWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNlbmQgYW4gZXZlbnQgdG8gdGhlIGNsaWVudCwgYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2UuIEV2ZXJ5IHRpbWUgXG5cdCAqIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSB0aGlzIGV2ZW50LCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQuXG5cdCAqL1xuXHRhc3luYyBzZW5kT24gKGV2ZW50OiBzdHJpbmcsIGRhdGE6IGFueSwgY2FsbGJhY2s6IChkYXRhOiBhbnksIHV1aWQ/OiBzdHJpbmcpID0+IHZvaWQsIHV1aWQ6IHN0cmluZyA9IG51bGwpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCByZXN1bHQgPSBhd2FpdCBuZXcgUHJvbWlzZTxhbnk+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodXVpZCA9PSBudWxsKVxuXHRcdFx0XHRcdHV1aWQgPSB1dWlkdjQgKCk7XG5cblx0XHRcdFx0dGhpcy5vbiAoZXZlbnQsIGZ1bmN0aW9uICh1dWlkMjogc3RyaW5nLCBkYXRhOiBhbnkpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgKGRhdGEsIHV1aWQyKTtcblx0XHRcdFx0XHRcdHJlc29sdmUgKGRhdGEpO1xuXHRcdFx0XHRcdH0uYmluZCAodGhpcywgdXVpZCksIHV1aWQpO1xuXHRcdFx0XHR0aGlzLnNlbmQgKGV2ZW50LCBkYXRhLCB1dWlkKTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNlbmQgYW4gZXZlbnQgdG8gdGhlIGNsaWVudCwgYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2Ugb25jZS5cblx0ICovXG5cdGFzeW5jIHNlbmRPbmNlIChldmVudDogc3RyaW5nLCBkYXRhOiBhbnksIHV1aWQ6IHN0cmluZyA9IG51bGwpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCByZXN1bHQgPSBhd2FpdCBuZXcgUHJvbWlzZTxhbnk+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodXVpZCA9PSBudWxsKVxuXHRcdFx0XHRcdHV1aWQgPSB1dWlkdjQgKCk7XG5cblx0XHRcdFx0dGhpcy5vbmNlIChldmVudCwgZnVuY3Rpb24gKHV1aWQyOiBzdHJpbmcsIGRhdGE6IGFueSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXNvbHZlIChkYXRhKTtcblx0XHRcdFx0XHR9LmJpbmQgKHRoaXMsIHV1aWQpLCB1dWlkKTtcblx0XHRcdFx0dGhpcy5zZW5kIChldmVudCwgZGF0YSwgdXVpZCk7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjb25uZWN0IHRoZSBjbGllbnQuXG5cdCAqL1xuXHRkaXNjb25uZWN0IChyZW1vdmVGcm9tU2VydmVyOiBib29sZWFuID0gdHJ1ZSk6IHZvaWRcblx0e1xuXHRcdGlmICh0aGlzLnNvY2tldCA9PSBudWxsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKHRoaXMuc29ja2V0LmNvbm5lY3RlZCA9PT0gZmFsc2UpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLnNvY2tldC5kaXNjb25uZWN0ICgpO1xuXHR9XG59IiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsImV4cG9ydCBkZWZhdWx0IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTsiLCJpbXBvcnQgUkVHRVggZnJvbSAnLi9yZWdleC5qcyc7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlKHV1aWQpIHtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyAmJiBSRUdFWC50ZXN0KHV1aWQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0ZTsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG4vKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cblxudmFyIGJ5dGVUb0hleCA9IFtdO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleC5wdXNoKChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyKSB7XG4gIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIC8vIE5vdGU6IEJlIGNhcmVmdWwgZWRpdGluZyB0aGlzIGNvZGUhICBJdCdzIGJlZW4gdHVuZWQgZm9yIHBlcmZvcm1hbmNlXG4gIC8vIGFuZCB3b3JrcyBpbiB3YXlzIHlvdSBtYXkgbm90IGV4cGVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZC9wdWxsLzQzNFxuICB2YXIgdXVpZCA9IChieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXSkudG9Mb3dlckNhc2UoKTsgLy8gQ29uc2lzdGVuY3kgY2hlY2sgZm9yIHZhbGlkIFVVSUQuICBJZiB0aGlzIHRocm93cywgaXQncyBsaWtlbHkgZHVlIHRvIG9uZVxuICAvLyBvZiB0aGUgZm9sbG93aW5nOlxuICAvLyAtIE9uZSBvciBtb3JlIGlucHV0IGFycmF5IHZhbHVlcyBkb24ndCBtYXAgdG8gYSBoZXggb2N0ZXQgKGxlYWRpbmcgdG9cbiAgLy8gXCJ1bmRlZmluZWRcIiBpbiB0aGUgdXVpZClcbiAgLy8gLSBJbnZhbGlkIGlucHV0IHZhbHVlcyBmb3IgdGhlIFJGQyBgdmVyc2lvbmAgb3IgYHZhcmlhbnRgIGZpZWxkc1xuXG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgcmV0dXJuIHV1aWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmluZ2lmeTsiLCJpbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnOyAvLyAqKmB2MSgpYCAtIEdlbmVyYXRlIHRpbWUtYmFzZWQgVVVJRCoqXG4vL1xuLy8gSW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL0xpb3NLL1VVSUQuanNcbi8vIGFuZCBodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvdXVpZC5odG1sXG5cbnZhciBfbm9kZUlkO1xuXG52YXIgX2Nsb2Nrc2VxOyAvLyBQcmV2aW91cyB1dWlkIGNyZWF0aW9uIHRpbWVcblxuXG52YXIgX2xhc3RNU2VjcyA9IDA7XG52YXIgX2xhc3ROU2VjcyA9IDA7IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQgZm9yIEFQSSBkZXRhaWxzXG5cbmZ1bmN0aW9uIHYxKG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gYnVmICYmIG9mZnNldCB8fCAwO1xuICB2YXIgYiA9IGJ1ZiB8fCBuZXcgQXJyYXkoMTYpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIG5vZGUgPSBvcHRpb25zLm5vZGUgfHwgX25vZGVJZDtcbiAgdmFyIGNsb2Nrc2VxID0gb3B0aW9ucy5jbG9ja3NlcSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jbG9ja3NlcSA6IF9jbG9ja3NlcTsgLy8gbm9kZSBhbmQgY2xvY2tzZXEgbmVlZCB0byBiZSBpbml0aWFsaXplZCB0byByYW5kb20gdmFsdWVzIGlmIHRoZXkncmUgbm90XG4gIC8vIHNwZWNpZmllZC4gIFdlIGRvIHRoaXMgbGF6aWx5IHRvIG1pbmltaXplIGlzc3VlcyByZWxhdGVkIHRvIGluc3VmZmljaWVudFxuICAvLyBzeXN0ZW0gZW50cm9weS4gIFNlZSAjMTg5XG5cbiAgaWYgKG5vZGUgPT0gbnVsbCB8fCBjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgdmFyIHNlZWRCeXRlcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7XG5cbiAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC41LCBjcmVhdGUgYW5kIDQ4LWJpdCBub2RlIGlkLCAoNDcgcmFuZG9tIGJpdHMgKyBtdWx0aWNhc3QgYml0ID0gMSlcbiAgICAgIG5vZGUgPSBfbm9kZUlkID0gW3NlZWRCeXRlc1swXSB8IDB4MDEsIHNlZWRCeXRlc1sxXSwgc2VlZEJ5dGVzWzJdLCBzZWVkQnl0ZXNbM10sIHNlZWRCeXRlc1s0XSwgc2VlZEJ5dGVzWzVdXTtcbiAgICB9XG5cbiAgICBpZiAoY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuMi4yLCByYW5kb21pemUgKDE0IGJpdCkgY2xvY2tzZXFcbiAgICAgIGNsb2Nrc2VxID0gX2Nsb2Nrc2VxID0gKHNlZWRCeXRlc1s2XSA8PCA4IHwgc2VlZEJ5dGVzWzddKSAmIDB4M2ZmZjtcbiAgICB9XG4gIH0gLy8gVVVJRCB0aW1lc3RhbXBzIGFyZSAxMDAgbmFuby1zZWNvbmQgdW5pdHMgc2luY2UgdGhlIEdyZWdvcmlhbiBlcG9jaCxcbiAgLy8gKDE1ODItMTAtMTUgMDA6MDApLiAgSlNOdW1iZXJzIGFyZW4ndCBwcmVjaXNlIGVub3VnaCBmb3IgdGhpcywgc29cbiAgLy8gdGltZSBpcyBoYW5kbGVkIGludGVybmFsbHkgYXMgJ21zZWNzJyAoaW50ZWdlciBtaWxsaXNlY29uZHMpIGFuZCAnbnNlY3MnXG4gIC8vICgxMDAtbmFub3NlY29uZHMgb2Zmc2V0IGZyb20gbXNlY3MpIHNpbmNlIHVuaXggZXBvY2gsIDE5NzAtMDEtMDEgMDA6MDAuXG5cblxuICB2YXIgbXNlY3MgPSBvcHRpb25zLm1zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1zZWNzIDogRGF0ZS5ub3coKTsgLy8gUGVyIDQuMi4xLjIsIHVzZSBjb3VudCBvZiB1dWlkJ3MgZ2VuZXJhdGVkIGR1cmluZyB0aGUgY3VycmVudCBjbG9ja1xuICAvLyBjeWNsZSB0byBzaW11bGF0ZSBoaWdoZXIgcmVzb2x1dGlvbiBjbG9ja1xuXG4gIHZhciBuc2VjcyA9IG9wdGlvbnMubnNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubnNlY3MgOiBfbGFzdE5TZWNzICsgMTsgLy8gVGltZSBzaW5jZSBsYXN0IHV1aWQgY3JlYXRpb24gKGluIG1zZWNzKVxuXG4gIHZhciBkdCA9IG1zZWNzIC0gX2xhc3RNU2VjcyArIChuc2VjcyAtIF9sYXN0TlNlY3MpIC8gMTAwMDA7IC8vIFBlciA0LjIuMS4yLCBCdW1wIGNsb2Nrc2VxIG9uIGNsb2NrIHJlZ3Jlc3Npb25cblxuICBpZiAoZHQgPCAwICYmIG9wdGlvbnMuY2xvY2tzZXEgPT09IHVuZGVmaW5lZCkge1xuICAgIGNsb2Nrc2VxID0gY2xvY2tzZXEgKyAxICYgMHgzZmZmO1xuICB9IC8vIFJlc2V0IG5zZWNzIGlmIGNsb2NrIHJlZ3Jlc3NlcyAobmV3IGNsb2Nrc2VxKSBvciB3ZSd2ZSBtb3ZlZCBvbnRvIGEgbmV3XG4gIC8vIHRpbWUgaW50ZXJ2YWxcblxuXG4gIGlmICgoZHQgPCAwIHx8IG1zZWNzID4gX2xhc3RNU2VjcykgJiYgb3B0aW9ucy5uc2VjcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbnNlY3MgPSAwO1xuICB9IC8vIFBlciA0LjIuMS4yIFRocm93IGVycm9yIGlmIHRvbyBtYW55IHV1aWRzIGFyZSByZXF1ZXN0ZWRcblxuXG4gIGlmIChuc2VjcyA+PSAxMDAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInV1aWQudjEoKTogQ2FuJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjXCIpO1xuICB9XG5cbiAgX2xhc3RNU2VjcyA9IG1zZWNzO1xuICBfbGFzdE5TZWNzID0gbnNlY3M7XG4gIF9jbG9ja3NlcSA9IGNsb2Nrc2VxOyAvLyBQZXIgNC4xLjQgLSBDb252ZXJ0IGZyb20gdW5peCBlcG9jaCB0byBHcmVnb3JpYW4gZXBvY2hcblxuICBtc2VjcyArPSAxMjIxOTI5MjgwMDAwMDsgLy8gYHRpbWVfbG93YFxuXG4gIHZhciB0bCA9ICgobXNlY3MgJiAweGZmZmZmZmYpICogMTAwMDAgKyBuc2VjcykgJSAweDEwMDAwMDAwMDtcbiAgYltpKytdID0gdGwgPj4+IDI0ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDE2ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bCAmIDB4ZmY7IC8vIGB0aW1lX21pZGBcblxuICB2YXIgdG1oID0gbXNlY3MgLyAweDEwMDAwMDAwMCAqIDEwMDAwICYgMHhmZmZmZmZmO1xuICBiW2krK10gPSB0bWggPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bWggJiAweGZmOyAvLyBgdGltZV9oaWdoX2FuZF92ZXJzaW9uYFxuXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMjQgJiAweGYgfCAweDEwOyAvLyBpbmNsdWRlIHZlcnNpb25cblxuICBiW2krK10gPSB0bWggPj4+IDE2ICYgMHhmZjsgLy8gYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgIChQZXIgNC4yLjIgLSBpbmNsdWRlIHZhcmlhbnQpXG5cbiAgYltpKytdID0gY2xvY2tzZXEgPj4+IDggfCAweDgwOyAvLyBgY2xvY2tfc2VxX2xvd2BcblxuICBiW2krK10gPSBjbG9ja3NlcSAmIDB4ZmY7IC8vIGBub2RlYFxuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgNjsgKytuKSB7XG4gICAgYltpICsgbl0gPSBub2RlW25dO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZiB8fCBzdHJpbmdpZnkoYik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHYxOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gcGFyc2UodXVpZCkge1xuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIFVVSUQnKTtcbiAgfVxuXG4gIHZhciB2O1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMTYpOyAvLyBQYXJzZSAjIyMjIyMjIy0uLi4uLS4uLi4tLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0O1xuICBhcnJbMV0gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsyXSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbM10gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tIyMjIy0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzRdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDksIDEzKSwgMTYpKSA+Pj4gODtcbiAgYXJyWzVdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tIyMjIy0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls2XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTgpLCAxNikpID4+PiA4O1xuICBhcnJbN10gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLSMjIyMtLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzhdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDE5LCAyMyksIDE2KSkgPj4+IDg7XG4gIGFycls5XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLS4uLi4tLi4uLi0jIyMjIyMjIyMjIyNcbiAgLy8gKFVzZSBcIi9cIiB0byBhdm9pZCAzMi1iaXQgdHJ1bmNhdGlvbiB3aGVuIGJpdC1zaGlmdGluZyBoaWdoLW9yZGVyIGJ5dGVzKVxuXG4gIGFyclsxMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMjQsIDM2KSwgMTYpKSAvIDB4MTAwMDAwMDAwMDAgJiAweGZmO1xuICBhcnJbMTFdID0gdiAvIDB4MTAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzEyXSA9IHYgPj4+IDI0ICYgMHhmZjtcbiAgYXJyWzEzXSA9IHYgPj4+IDE2ICYgMHhmZjtcbiAgYXJyWzE0XSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbMTVdID0gdiAmIDB4ZmY7XG4gIHJldHVybiBhcnI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhcnNlOyIsImltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuaW1wb3J0IHBhcnNlIGZyb20gJy4vcGFyc2UuanMnO1xuXG5mdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikge1xuICBzdHIgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgdmFyIGJ5dGVzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBieXRlcy5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpKTtcbiAgfVxuXG4gIHJldHVybiBieXRlcztcbn1cblxuZXhwb3J0IHZhciBETlMgPSAnNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCB2YXIgVVJMID0gJzZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgaGFzaGZ1bmMpIHtcbiAgZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKHZhbHVlLCBuYW1lc3BhY2UsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gc3RyaW5nVG9CeXRlcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lc3BhY2UgPSBwYXJzZShuYW1lc3BhY2UpO1xuICAgIH1cblxuICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoICE9PSAxNikge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdOYW1lc3BhY2UgbXVzdCBiZSBhcnJheS1saWtlICgxNiBpdGVyYWJsZSBpbnRlZ2VyIHZhbHVlcywgMC0yNTUpJyk7XG4gICAgfSAvLyBDb21wdXRlIGhhc2ggb2YgbmFtZXNwYWNlIGFuZCB2YWx1ZSwgUGVyIDQuM1xuICAgIC8vIEZ1dHVyZTogVXNlIHNwcmVhZCBzeW50YXggd2hlbiBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcywgZS5nLiBgYnl0ZXMgPVxuICAgIC8vIGhhc2hmdW5jKFsuLi5uYW1lc3BhY2UsIC4uLiB2YWx1ZV0pYFxuXG5cbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNiArIHZhbHVlLmxlbmd0aCk7XG4gICAgYnl0ZXMuc2V0KG5hbWVzcGFjZSk7XG4gICAgYnl0ZXMuc2V0KHZhbHVlLCBuYW1lc3BhY2UubGVuZ3RoKTtcbiAgICBieXRlcyA9IGhhc2hmdW5jKGJ5dGVzKTtcbiAgICBieXRlc1s2XSA9IGJ5dGVzWzZdICYgMHgwZiB8IHZlcnNpb247XG4gICAgYnl0ZXNbOF0gPSBieXRlc1s4XSAmIDB4M2YgfCAweDgwO1xuXG4gICAgaWYgKGJ1Zikge1xuICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlc1tpXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5KGJ5dGVzKTtcbiAgfSAvLyBGdW5jdGlvbiNuYW1lIGlzIG5vdCBzZXR0YWJsZSBvbiBzb21lIHBsYXRmb3JtcyAoIzI3MClcblxuXG4gIHRyeSB7XG4gICAgZ2VuZXJhdGVVVUlELm5hbWUgPSBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgfSBjYXRjaCAoZXJyKSB7fSAvLyBGb3IgQ29tbW9uSlMgZGVmYXVsdCBleHBvcnQgc3VwcG9ydFxuXG5cbiAgZ2VuZXJhdGVVVUlELkROUyA9IEROUztcbiAgZ2VuZXJhdGVVVUlELlVSTCA9IFVSTDtcbiAgcmV0dXJuIGdlbmVyYXRlVVVJRDtcbn0iLCIvKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEphdmFTY3JpcHQgTUQ1XG4gKlxuICogTW9kaWZpY2F0aW9uIG9mIEphdmFTY3JpcHQgTUQ1XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9KYXZhU2NyaXB0LU1ENVxuICpcbiAqIENvcHlyaWdodCAyMDExLCBTZWJhc3RpYW4gVHNjaGFuXG4gKiBodHRwczovL2JsdWVpbXAubmV0XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqXG4gKiBCYXNlZCBvblxuICogQSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZVxuICogRGlnZXN0IEFsZ29yaXRobSwgYXMgZGVmaW5lZCBpbiBSRkMgMTMyMS5cbiAqIFZlcnNpb24gMi4yIENvcHlyaWdodCAoQykgUGF1bCBKb2huc3RvbiAxOTk5IC0gMjAwOVxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlXG4gKiBTZWUgaHR0cDovL3BhamhvbWUub3JnLnVrL2NyeXB0L21kNSBmb3IgbW9yZSBpbmZvLlxuICovXG5mdW5jdGlvbiBtZDUoYnl0ZXMpIHtcbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KG1zZy5sZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzW2ldID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1kNVRvSGV4RW5jb2RlZEFycmF5KHdvcmRzVG9NZDUoYnl0ZXNUb1dvcmRzKGJ5dGVzKSwgYnl0ZXMubGVuZ3RoICogOCkpO1xufVxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcyB0byBhbiBhcnJheSBvZiBieXRlc1xuICovXG5cblxuZnVuY3Rpb24gbWQ1VG9IZXhFbmNvZGVkQXJyYXkoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgbGVuZ3RoMzIgPSBpbnB1dC5sZW5ndGggKiAzMjtcbiAgdmFyIGhleFRhYiA9ICcwMTIzNDU2Nzg5YWJjZGVmJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDMyOyBpICs9IDgpIHtcbiAgICB2YXIgeCA9IGlucHV0W2kgPj4gNV0gPj4+IGkgJSAzMiAmIDB4ZmY7XG4gICAgdmFyIGhleCA9IHBhcnNlSW50KGhleFRhYi5jaGFyQXQoeCA+Pj4gNCAmIDB4MGYpICsgaGV4VGFiLmNoYXJBdCh4ICYgMHgwZiksIDE2KTtcbiAgICBvdXRwdXQucHVzaChoZXgpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlIG91dHB1dCBsZW5ndGggd2l0aCBwYWRkaW5nIGFuZCBiaXQgbGVuZ3RoXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGg4KSB7XG4gIHJldHVybiAoaW5wdXRMZW5ndGg4ICsgNjQgPj4+IDkgPDwgNCkgKyAxNCArIDE7XG59XG4vKlxuICogQ2FsY3VsYXRlIHRoZSBNRDUgb2YgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcywgYW5kIGEgYml0IGxlbmd0aC5cbiAqL1xuXG5cbmZ1bmN0aW9uIHdvcmRzVG9NZDUoeCwgbGVuKSB7XG4gIC8qIGFwcGVuZCBwYWRkaW5nICovXG4gIHhbbGVuID4+IDVdIHw9IDB4ODAgPDwgbGVuICUgMzI7XG4gIHhbZ2V0T3V0cHV0TGVuZ3RoKGxlbikgLSAxXSA9IGxlbjtcbiAgdmFyIGEgPSAxNzMyNTg0MTkzO1xuICB2YXIgYiA9IC0yNzE3MzM4Nzk7XG4gIHZhciBjID0gLTE3MzI1ODQxOTQ7XG4gIHZhciBkID0gMjcxNzMzODc4O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICB2YXIgb2xkYSA9IGE7XG4gICAgdmFyIG9sZGIgPSBiO1xuICAgIHZhciBvbGRjID0gYztcbiAgICB2YXIgb2xkZCA9IGQ7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaV0sIDcsIC02ODA4NzY5MzYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxXSwgMTIsIC0zODk1NjQ1ODYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTcsIDYwNjEwNTgxOSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDNdLCAyMiwgLTEwNDQ1MjUzMzApO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNywgLTE3NjQxODg5Nyk7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDVdLCAxMiwgMTIwMDA4MDQyNik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNywgLTE0NzMyMzEzNDEpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyA3XSwgMjIsIC00NTcwNTk4Myk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA3LCAxNzcwMDM1NDE2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgOV0sIDEyLCAtMTk1ODQxNDQxNyk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTcsIC00MjA2Myk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDExXSwgMjIsIC0xOTkwNDA0MTYyKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA3LCAxODA0NjAzNjgyKTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMTNdLCAxMiwgLTQwMzQxMTAxKTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNywgLTE1MDIwMDIyOTApO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxNV0sIDIyLCAxMjM2NTM1MzI5KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMV0sIDUsIC0xNjU3OTY1MTApO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyA2XSwgOSwgLTEwNjk1MDE2MzIpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE0LCA2NDM3MTc3MTMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2ldLCAyMCwgLTM3Mzg5NzMwMik7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA1LCAtNzAxNTU4NjkxKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMTBdLCA5LCAzODAxNjA4Myk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTQsIC02NjA0NzgzMzUpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA0XSwgMjAsIC00MDU1Mzc4NDgpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNSwgNTY4NDQ2NDM4KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMTRdLCA5LCAtMTAxOTgwMzY5MCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNCwgLTE4NzM2Mzk2MSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDhdLCAyMCwgMTE2MzUzMTUwMSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNSwgLTE0NDQ2ODE0NjcpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAyXSwgOSwgLTUxNDAzNzg0KTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgN10sIDE0LCAxNzM1MzI4NDczKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgMTJdLCAyMCwgLTE5MjY2MDc3MzQpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNCwgLTM3ODU1OCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE2LCAxODM5MDMwNTYyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMV0sIDQsIC0xNTMwOTkyMDYwKTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgNF0sIDExLCAxMjcyODkzMzUzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgN10sIDE2LCAtMTU1NDk3NjMyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTBdLCAyMywgLTEwOTQ3MzA2NDApO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDQsIDY4MTI3OTE3NCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaV0sIDExLCAtMzU4NTM3MjIyKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgM10sIDE2LCAtNzIyNTIxOTc5KTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgNl0sIDIzLCA3NjAyOTE4OSk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDldLCA0LCAtNjQwMzY0NDg3KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgMTJdLCAxMSwgLTQyMTgxNTgzNSk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTYsIDUzMDc0MjUyMCk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDJdLCAyMywgLTk5NTMzODY1MSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaV0sIDYsIC0xOTg2MzA4NDQpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyA3XSwgMTAsIDExMjY4OTE0MTUpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE1LCAtMTQxNjM1NDkwNSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDVdLCAyMSwgLTU3NDM0MDU1KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA2LCAxNzAwNDg1NTcxKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgM10sIDEwLCAtMTg5NDk4NjYwNik7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTUsIC0xMDUxNTIzKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMV0sIDIxLCAtMjA1NDkyMjc5OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA2LCAxODczMzEzMzU5KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTVdLCAxMCwgLTMwNjExNzQ0KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE1LCAtMTU2MDE5ODM4MCk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDEzXSwgMjEsIDEzMDkxNTE2NDkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNiwgLTE0NTUyMzA3MCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDExXSwgMTAsIC0xMTIwMjEwMzc5KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE1LCA3MTg3ODcyNTkpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA5XSwgMjEsIC0zNDM0ODU1NTEpO1xuICAgIGEgPSBzYWZlQWRkKGEsIG9sZGEpO1xuICAgIGIgPSBzYWZlQWRkKGIsIG9sZGIpO1xuICAgIGMgPSBzYWZlQWRkKGMsIG9sZGMpO1xuICAgIGQgPSBzYWZlQWRkKGQsIG9sZGQpO1xuICB9XG5cbiAgcmV0dXJuIFthLCBiLCBjLCBkXTtcbn1cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IGJ5dGVzIHRvIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHNcbiAqIENoYXJhY3RlcnMgPjI1NSBoYXZlIHRoZWlyIGhpZ2gtYnl0ZSBzaWxlbnRseSBpZ25vcmVkLlxuICovXG5cblxuZnVuY3Rpb24gYnl0ZXNUb1dvcmRzKGlucHV0KSB7XG4gIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgbGVuZ3RoOCA9IGlucHV0Lmxlbmd0aCAqIDg7XG4gIHZhciBvdXRwdXQgPSBuZXcgVWludDMyQXJyYXkoZ2V0T3V0cHV0TGVuZ3RoKGxlbmd0aDgpKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDg7IGkgKz0gOCkge1xuICAgIG91dHB1dFtpID4+IDVdIHw9IChpbnB1dFtpIC8gOF0gJiAweGZmKSA8PCBpICUgMzI7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuLypcbiAqIEFkZCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zIGludGVybmFsbHlcbiAqIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG4gKi9cblxuXG5mdW5jdGlvbiBzYWZlQWRkKHgsIHkpIHtcbiAgdmFyIGxzdyA9ICh4ICYgMHhmZmZmKSArICh5ICYgMHhmZmZmKTtcbiAgdmFyIG1zdyA9ICh4ID4+IDE2KSArICh5ID4+IDE2KSArIChsc3cgPj4gMTYpO1xuICByZXR1cm4gbXN3IDw8IDE2IHwgbHN3ICYgMHhmZmZmO1xufVxuLypcbiAqIEJpdHdpc2Ugcm90YXRlIGEgMzItYml0IG51bWJlciB0byB0aGUgbGVmdC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGJpdFJvdGF0ZUxlZnQobnVtLCBjbnQpIHtcbiAgcmV0dXJuIG51bSA8PCBjbnQgfCBudW0gPj4+IDMyIC0gY250O1xufVxuLypcbiAqIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIGZvdXIgYmFzaWMgb3BlcmF0aW9ucyB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVjbW4ocSwgYSwgYiwgeCwgcywgdCkge1xuICByZXR1cm4gc2FmZUFkZChiaXRSb3RhdGVMZWZ0KHNhZmVBZGQoc2FmZUFkZChhLCBxKSwgc2FmZUFkZCh4LCB0KSksIHMpLCBiKTtcbn1cblxuZnVuY3Rpb24gbWQ1ZmYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBjIHwgfmIgJiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1Z2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBkIHwgYyAmIH5kLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1aGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihjIF4gKGIgfCB+ZCksIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtZDU7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgbWQ1IGZyb20gJy4vbWQ1LmpzJztcbnZhciB2MyA9IHYzNSgndjMnLCAweDMwLCBtZDUpO1xuZXhwb3J0IGRlZmF1bHQgdjM7IiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTsgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZ2lmeShybmRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjQ7IiwiLy8gQWRhcHRlZCBmcm9tIENocmlzIFZlbmVzcycgU0hBMSBjb2RlIGF0XG4vLyBodHRwOi8vd3d3Lm1vdmFibGUtdHlwZS5jby51ay9zY3JpcHRzL3NoYTEuaHRtbFxuZnVuY3Rpb24gZihzLCB4LCB5LCB6KSB7XG4gIHN3aXRjaCAocykge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiB4ICYgeSBeIH54ICYgejtcblxuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG5cbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geCAmIHkgXiB4ICYgeiBeIHkgJiB6O1xuXG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIHggXiB5IF4gejtcbiAgfVxufVxuXG5mdW5jdGlvbiBST1RMKHgsIG4pIHtcbiAgcmV0dXJuIHggPDwgbiB8IHggPj4+IDMyIC0gbjtcbn1cblxuZnVuY3Rpb24gc2hhMShieXRlcykge1xuICB2YXIgSyA9IFsweDVhODI3OTk5LCAweDZlZDllYmExLCAweDhmMWJiY2RjLCAweGNhNjJjMWQ2XTtcbiAgdmFyIEggPSBbMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMF07XG5cbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzLnB1c2gobXNnLmNoYXJDb2RlQXQoaSkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShieXRlcykpIHtcbiAgICAvLyBDb252ZXJ0IEFycmF5LWxpa2UgdG8gQXJyYXlcbiAgICBieXRlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGJ5dGVzKTtcbiAgfVxuXG4gIGJ5dGVzLnB1c2goMHg4MCk7XG4gIHZhciBsID0gYnl0ZXMubGVuZ3RoIC8gNCArIDI7XG4gIHZhciBOID0gTWF0aC5jZWlsKGwgLyAxNik7XG4gIHZhciBNID0gbmV3IEFycmF5KE4pO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBOOyArK19pKSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50MzJBcnJheSgxNik7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIGFycltqXSA9IGJ5dGVzW19pICogNjQgKyBqICogNF0gPDwgMjQgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAxXSA8PCAxNiB8IGJ5dGVzW19pICogNjQgKyBqICogNCArIDJdIDw8IDggfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAzXTtcbiAgICB9XG5cbiAgICBNW19pXSA9IGFycjtcbiAgfVxuXG4gIE1bTiAtIDFdWzE0XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggLyBNYXRoLnBvdygyLCAzMik7XG4gIE1bTiAtIDFdWzE0XSA9IE1hdGguZmxvb3IoTVtOIC0gMV1bMTRdKTtcbiAgTVtOIC0gMV1bMTVdID0gKGJ5dGVzLmxlbmd0aCAtIDEpICogOCAmIDB4ZmZmZmZmZmY7XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgTjsgKytfaTIpIHtcbiAgICB2YXIgVyA9IG5ldyBVaW50MzJBcnJheSg4MCk7XG5cbiAgICBmb3IgKHZhciB0ID0gMDsgdCA8IDE2OyArK3QpIHtcbiAgICAgIFdbdF0gPSBNW19pMl1bdF07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX3QgPSAxNjsgX3QgPCA4MDsgKytfdCkge1xuICAgICAgV1tfdF0gPSBST1RMKFdbX3QgLSAzXSBeIFdbX3QgLSA4XSBeIFdbX3QgLSAxNF0gXiBXW190IC0gMTZdLCAxKTtcbiAgICB9XG5cbiAgICB2YXIgYSA9IEhbMF07XG4gICAgdmFyIGIgPSBIWzFdO1xuICAgIHZhciBjID0gSFsyXTtcbiAgICB2YXIgZCA9IEhbM107XG4gICAgdmFyIGUgPSBIWzRdO1xuXG4gICAgZm9yICh2YXIgX3QyID0gMDsgX3QyIDwgODA7ICsrX3QyKSB7XG4gICAgICB2YXIgcyA9IE1hdGguZmxvb3IoX3QyIC8gMjApO1xuICAgICAgdmFyIFQgPSBST1RMKGEsIDUpICsgZihzLCBiLCBjLCBkKSArIGUgKyBLW3NdICsgV1tfdDJdID4+PiAwO1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIGMgPSBST1RMKGIsIDMwKSA+Pj4gMDtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IFQ7XG4gICAgfVxuXG4gICAgSFswXSA9IEhbMF0gKyBhID4+PiAwO1xuICAgIEhbMV0gPSBIWzFdICsgYiA+Pj4gMDtcbiAgICBIWzJdID0gSFsyXSArIGMgPj4+IDA7XG4gICAgSFszXSA9IEhbM10gKyBkID4+PiAwO1xuICAgIEhbNF0gPSBIWzRdICsgZSA+Pj4gMDtcbiAgfVxuXG4gIHJldHVybiBbSFswXSA+PiAyNCAmIDB4ZmYsIEhbMF0gPj4gMTYgJiAweGZmLCBIWzBdID4+IDggJiAweGZmLCBIWzBdICYgMHhmZiwgSFsxXSA+PiAyNCAmIDB4ZmYsIEhbMV0gPj4gMTYgJiAweGZmLCBIWzFdID4+IDggJiAweGZmLCBIWzFdICYgMHhmZiwgSFsyXSA+PiAyNCAmIDB4ZmYsIEhbMl0gPj4gMTYgJiAweGZmLCBIWzJdID4+IDggJiAweGZmLCBIWzJdICYgMHhmZiwgSFszXSA+PiAyNCAmIDB4ZmYsIEhbM10gPj4gMTYgJiAweGZmLCBIWzNdID4+IDggJiAweGZmLCBIWzNdICYgMHhmZiwgSFs0XSA+PiAyNCAmIDB4ZmYsIEhbNF0gPj4gMTYgJiAweGZmLCBIWzRdID4+IDggJiAweGZmLCBIWzRdICYgMHhmZl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNoYTE7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgc2hhMSBmcm9tICcuL3NoYTEuanMnO1xudmFyIHY1ID0gdjM1KCd2NScsIDB4NTAsIHNoYTEpO1xuZXhwb3J0IGRlZmF1bHQgdjU7IiwiZXhwb3J0IGRlZmF1bHQgJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7IiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG5mdW5jdGlvbiB2ZXJzaW9uKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICByZXR1cm4gcGFyc2VJbnQodXVpZC5zdWJzdHIoMTQsIDEpLCAxNik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZlcnNpb247IiwibW9kdWxlLmV4cG9ydHMgPSBGb3JtRGF0YTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZldGNoOyIsIm1vZHVsZS5leHBvcnRzID0ge307IiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmhhc0NPUlMgPSB2b2lkIDA7XG4vLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb25lbnQvaGFzLWNvcnNcbmxldCB2YWx1ZSA9IGZhbHNlO1xudHJ5IHtcbiAgICB2YWx1ZSA9IHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG59XG5jYXRjaCAoZXJyKSB7XG4gICAgLy8gaWYgWE1MSHR0cCBzdXBwb3J0IGlzIGRpc2FibGVkIGluIElFIHRoZW4gaXQgd2lsbCB0aHJvd1xuICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGNyZWF0ZVxufVxuZXhwb3J0cy5oYXNDT1JTID0gdmFsdWU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIGltcG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2dhbGtuL3F1ZXJ5c3RyaW5nXG4vKipcbiAqIENvbXBpbGVzIGEgcXVlcnlzdHJpbmdcbiAqIFJldHVybnMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMuZW5jb2RlID0gdm9pZCAwO1xuZnVuY3Rpb24gZW5jb2RlKG9iaikge1xuICAgIGxldCBzdHIgPSAnJztcbiAgICBmb3IgKGxldCBpIGluIG9iaikge1xuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICBpZiAoc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICBzdHIgKz0gJyYnO1xuICAgICAgICAgICAgc3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChpKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChvYmpbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5leHBvcnRzLmVuY29kZSA9IGVuY29kZTtcbi8qKlxuICogUGFyc2VzIGEgc2ltcGxlIHF1ZXJ5c3RyaW5nIGludG8gYW4gb2JqZWN0XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHFzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVjb2RlKHFzKSB7XG4gICAgbGV0IHFyeSA9IHt9O1xuICAgIGxldCBwYWlycyA9IHFzLnNwbGl0KCcmJyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwYWlycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IHBhaXIgPSBwYWlyc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICBxcnlbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChwYWlyWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIHFyeTtcbn1cbmV4cG9ydHMuZGVjb2RlID0gZGVjb2RlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlID0gdm9pZCAwO1xuLy8gaW1wb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZ2Fsa24vcGFyc2V1cmlcbi8qKlxuICogUGFyc2VzIGEgVVJJXG4gKlxuICogTm90ZTogd2UgY291bGQgYWxzbyBoYXZlIHVzZWQgdGhlIGJ1aWx0LWluIFVSTCBvYmplY3QsIGJ1dCBpdCBpc24ndCBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3Jtcy5cbiAqXG4gKiBTZWU6XG4gKiAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkxcbiAqIC0gaHR0cHM6Ly9jYW5pdXNlLmNvbS91cmxcbiAqIC0gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzM5ODYjYXBwZW5kaXgtQlxuICpcbiAqIEhpc3Rvcnkgb2YgdGhlIHBhcnNlKCkgbWV0aG9kOlxuICogLSBmaXJzdCBjb21taXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NrZXRpby9zb2NrZXQuaW8tY2xpZW50L2NvbW1pdC80ZWUxZDVkOTRiMzkwNmE5YzA1MmI0NTlmMWE4MThiMTVmMzhmOTFjXG4gKiAtIGV4cG9ydCBpbnRvIGl0cyBvd24gbW9kdWxlOiBodHRwczovL2dpdGh1Yi5jb20vc29ja2V0aW8vZW5naW5lLmlvLWNsaWVudC9jb21taXQvZGUyYzU2MWU0NTY0ZWZlYjc4ZjFiZGIxYmEzOWVmODFiMjgyMmNiM1xuICogLSByZWltcG9ydDogaHR0cHM6Ly9naXRodWIuY29tL3NvY2tldGlvL2VuZ2luZS5pby1jbGllbnQvY29tbWl0L2RmMzIyNzdjM2Y2ZDYyMmVlYzVlZDA5ZjQ5M2NhZTNmMzM5MWQyNDJcbiAqXG4gKiBAYXV0aG9yIFN0ZXZlbiBMZXZpdGhhbiA8c3RldmVubGV2aXRoYW4uY29tPiAoTUlUIGxpY2Vuc2UpXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuY29uc3QgcmUgPSAvXig/Oig/IVteOkBcXC8/I10rOlteOkBcXC9dKkApKGh0dHB8aHR0cHN8d3N8d3NzKTpcXC9cXC8pPygoPzooKFteOkBcXC8/I10qKSg/OjooW146QFxcLz8jXSopKT8pP0ApPygoPzpbYS1mMC05XXswLDR9Oil7Miw3fVthLWYwLTldezAsNH18W146XFwvPyNdKikoPzo6KFxcZCopKT8pKCgoXFwvKD86W14/I10oPyFbXj8jXFwvXSpcXC5bXj8jXFwvLl0rKD86Wz8jXXwkKSkpKlxcLz8pPyhbXj8jXFwvXSopKSg/OlxcPyhbXiNdKikpPyg/OiMoLiopKT8pLztcbmNvbnN0IHBhcnRzID0gW1xuICAgICdzb3VyY2UnLCAncHJvdG9jb2wnLCAnYXV0aG9yaXR5JywgJ3VzZXJJbmZvJywgJ3VzZXInLCAncGFzc3dvcmQnLCAnaG9zdCcsICdwb3J0JywgJ3JlbGF0aXZlJywgJ3BhdGgnLCAnZGlyZWN0b3J5JywgJ2ZpbGUnLCAncXVlcnknLCAnYW5jaG9yJ1xuXTtcbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIGlmIChzdHIubGVuZ3RoID4gMjAwMCkge1xuICAgICAgICB0aHJvdyBcIlVSSSB0b28gbG9uZ1wiO1xuICAgIH1cbiAgICBjb25zdCBzcmMgPSBzdHIsIGIgPSBzdHIuaW5kZXhPZignWycpLCBlID0gc3RyLmluZGV4T2YoJ10nKTtcbiAgICBpZiAoYiAhPSAtMSAmJiBlICE9IC0xKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgYikgKyBzdHIuc3Vic3RyaW5nKGIsIGUpLnJlcGxhY2UoLzovZywgJzsnKSArIHN0ci5zdWJzdHJpbmcoZSwgc3RyLmxlbmd0aCk7XG4gICAgfVxuICAgIGxldCBtID0gcmUuZXhlYyhzdHIgfHwgJycpLCB1cmkgPSB7fSwgaSA9IDE0O1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgdXJpW3BhcnRzW2ldXSA9IG1baV0gfHwgJyc7XG4gICAgfVxuICAgIGlmIChiICE9IC0xICYmIGUgIT0gLTEpIHtcbiAgICAgICAgdXJpLnNvdXJjZSA9IHNyYztcbiAgICAgICAgdXJpLmhvc3QgPSB1cmkuaG9zdC5zdWJzdHJpbmcoMSwgdXJpLmhvc3QubGVuZ3RoIC0gMSkucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuYXV0aG9yaXR5ID0gdXJpLmF1dGhvcml0eS5yZXBsYWNlKCdbJywgJycpLnJlcGxhY2UoJ10nLCAnJykucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuaXB2NnVyaSA9IHRydWU7XG4gICAgfVxuICAgIHVyaS5wYXRoTmFtZXMgPSBwYXRoTmFtZXModXJpLCB1cmlbJ3BhdGgnXSk7XG4gICAgdXJpLnF1ZXJ5S2V5ID0gcXVlcnlLZXkodXJpLCB1cmlbJ3F1ZXJ5J10pO1xuICAgIHJldHVybiB1cmk7XG59XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5mdW5jdGlvbiBwYXRoTmFtZXMob2JqLCBwYXRoKSB7XG4gICAgY29uc3QgcmVneCA9IC9cXC97Miw5fS9nLCBuYW1lcyA9IHBhdGgucmVwbGFjZShyZWd4LCBcIi9cIikuc3BsaXQoXCIvXCIpO1xuICAgIGlmIChwYXRoLnNsaWNlKDAsIDEpID09ICcvJyB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBuYW1lcy5zcGxpY2UoMCwgMSk7XG4gICAgfVxuICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PSAnLycpIHtcbiAgICAgICAgbmFtZXMuc3BsaWNlKG5hbWVzLmxlbmd0aCAtIDEsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXM7XG59XG5mdW5jdGlvbiBxdWVyeUtleSh1cmksIHF1ZXJ5KSB7XG4gICAgY29uc3QgZGF0YSA9IHt9O1xuICAgIHF1ZXJ5LnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLCBmdW5jdGlvbiAoJDAsICQxLCAkMikge1xuICAgICAgICBpZiAoJDEpIHtcbiAgICAgICAgICAgIGRhdGFbJDFdID0gJDI7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbn1cbiIsIi8vIGltcG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Vuc2hpZnRpby95ZWFzdFxuJ3VzZSBzdHJpY3QnO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy55ZWFzdCA9IGV4cG9ydHMuZGVjb2RlID0gZXhwb3J0cy5lbmNvZGUgPSB2b2lkIDA7XG5jb25zdCBhbHBoYWJldCA9ICcwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei1fJy5zcGxpdCgnJyksIGxlbmd0aCA9IDY0LCBtYXAgPSB7fTtcbmxldCBzZWVkID0gMCwgaSA9IDAsIHByZXY7XG4vKipcbiAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZCBudW1iZXIuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG51bSBUaGUgbnVtYmVyIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiBlbmNvZGUobnVtKSB7XG4gICAgbGV0IGVuY29kZWQgPSAnJztcbiAgICBkbyB7XG4gICAgICAgIGVuY29kZWQgPSBhbHBoYWJldFtudW0gJSBsZW5ndGhdICsgZW5jb2RlZDtcbiAgICAgICAgbnVtID0gTWF0aC5mbG9vcihudW0gLyBsZW5ndGgpO1xuICAgIH0gd2hpbGUgKG51bSA+IDApO1xuICAgIHJldHVybiBlbmNvZGVkO1xufVxuZXhwb3J0cy5lbmNvZGUgPSBlbmNvZGU7XG4vKipcbiAqIFJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiBkZWNvZGUoc3RyKSB7XG4gICAgbGV0IGRlY29kZWQgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGVjb2RlZCA9IGRlY29kZWQgKiBsZW5ndGggKyBtYXBbc3RyLmNoYXJBdChpKV07XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVkO1xufVxuZXhwb3J0cy5kZWNvZGUgPSBkZWNvZGU7XG4vKipcbiAqIFllYXN0OiBBIHRpbnkgZ3Jvd2luZyBpZCBnZW5lcmF0b3IuXG4gKlxuICogQHJldHVybnMge1N0cmluZ30gQSB1bmlxdWUgaWQuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiB5ZWFzdCgpIHtcbiAgICBjb25zdCBub3cgPSBlbmNvZGUoK25ldyBEYXRlKCkpO1xuICAgIGlmIChub3cgIT09IHByZXYpXG4gICAgICAgIHJldHVybiBzZWVkID0gMCwgcHJldiA9IG5vdztcbiAgICByZXR1cm4gbm93ICsgJy4nICsgZW5jb2RlKHNlZWQrKyk7XG59XG5leHBvcnRzLnllYXN0ID0geWVhc3Q7XG4vL1xuLy8gTWFwIGVhY2ggY2hhcmFjdGVyIHRvIGl0cyBpbmRleC5cbi8vXG5mb3IgKDsgaSA8IGxlbmd0aDsgaSsrKVxuICAgIG1hcFthbHBoYWJldFtpXV0gPSBpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdsb2JhbFRoaXNTaGltID0gdm9pZCAwO1xuZXhwb3J0cy5nbG9iYWxUaGlzU2hpbSA9ICgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xuICAgIH1cbn0pKCk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubmV4dFRpY2sgPSBleHBvcnRzLnBhcnNlID0gZXhwb3J0cy5pbnN0YWxsVGltZXJGdW5jdGlvbnMgPSBleHBvcnRzLnRyYW5zcG9ydHMgPSBleHBvcnRzLlRyYW5zcG9ydEVycm9yID0gZXhwb3J0cy5UcmFuc3BvcnQgPSBleHBvcnRzLnByb3RvY29sID0gZXhwb3J0cy5Tb2NrZXQgPSB2b2lkIDA7XG5jb25zdCBzb2NrZXRfanNfMSA9IHJlcXVpcmUoXCIuL3NvY2tldC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNvY2tldFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc29ja2V0X2pzXzEuU29ja2V0OyB9IH0pO1xuZXhwb3J0cy5wcm90b2NvbCA9IHNvY2tldF9qc18xLlNvY2tldC5wcm90b2NvbDtcbnZhciB0cmFuc3BvcnRfanNfMSA9IHJlcXVpcmUoXCIuL3RyYW5zcG9ydC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYW5zcG9ydFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJhbnNwb3J0X2pzXzEuVHJhbnNwb3J0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhbnNwb3J0RXJyb3JcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRyYW5zcG9ydF9qc18xLlRyYW5zcG9ydEVycm9yOyB9IH0pO1xudmFyIGluZGV4X2pzXzEgPSByZXF1aXJlKFwiLi90cmFuc3BvcnRzL2luZGV4LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidHJhbnNwb3J0c1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaW5kZXhfanNfMS50cmFuc3BvcnRzOyB9IH0pO1xudmFyIHV0aWxfanNfMSA9IHJlcXVpcmUoXCIuL3V0aWwuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpbnN0YWxsVGltZXJGdW5jdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWxfanNfMS5pbnN0YWxsVGltZXJGdW5jdGlvbnM7IH0gfSk7XG52YXIgcGFyc2V1cmlfanNfMSA9IHJlcXVpcmUoXCIuL2NvbnRyaWIvcGFyc2V1cmkuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJwYXJzZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGFyc2V1cmlfanNfMS5wYXJzZTsgfSB9KTtcbnZhciB3ZWJzb2NrZXRfY29uc3RydWN0b3JfanNfMSA9IHJlcXVpcmUoXCIuL3RyYW5zcG9ydHMvd2Vic29ja2V0LWNvbnN0cnVjdG9yLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibmV4dFRpY2tcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLm5leHRUaWNrOyB9IH0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNvY2tldCA9IHZvaWQgMDtcbmNvbnN0IGluZGV4X2pzXzEgPSByZXF1aXJlKFwiLi90cmFuc3BvcnRzL2luZGV4LmpzXCIpO1xuY29uc3QgdXRpbF9qc18xID0gcmVxdWlyZShcIi4vdXRpbC5qc1wiKTtcbmNvbnN0IHBhcnNlcXNfanNfMSA9IHJlcXVpcmUoXCIuL2NvbnRyaWIvcGFyc2Vxcy5qc1wiKTtcbmNvbnN0IHBhcnNldXJpX2pzXzEgPSByZXF1aXJlKFwiLi9jb250cmliL3BhcnNldXJpLmpzXCIpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpOyAvLyBkZWJ1ZygpXG5jb25zdCBjb21wb25lbnRfZW1pdHRlcl8xID0gcmVxdWlyZShcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIik7XG5jb25zdCBlbmdpbmVfaW9fcGFyc2VyXzEgPSByZXF1aXJlKFwiZW5naW5lLmlvLXBhcnNlclwiKTtcbmNvbnN0IHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xID0gcmVxdWlyZShcIi4vdHJhbnNwb3J0cy93ZWJzb2NrZXQtY29uc3RydWN0b3IuanNcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKFwiZW5naW5lLmlvLWNsaWVudDpzb2NrZXRcIik7IC8vIGRlYnVnKClcbmNsYXNzIFNvY2tldCBleHRlbmRzIGNvbXBvbmVudF9lbWl0dGVyXzEuRW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogU29ja2V0IGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSB1cmkgLSB1cmkgb3Igb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgb3B0cyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYmluYXJ5VHlwZSA9IHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLmRlZmF1bHRCaW5hcnlUeXBlO1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyID0gW107XG4gICAgICAgIGlmICh1cmkgJiYgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHVyaSkge1xuICAgICAgICAgICAgb3B0cyA9IHVyaTtcbiAgICAgICAgICAgIHVyaSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVyaSkge1xuICAgICAgICAgICAgdXJpID0gKDAsIHBhcnNldXJpX2pzXzEucGFyc2UpKHVyaSk7XG4gICAgICAgICAgICBvcHRzLmhvc3RuYW1lID0gdXJpLmhvc3Q7XG4gICAgICAgICAgICBvcHRzLnNlY3VyZSA9IHVyaS5wcm90b2NvbCA9PT0gXCJodHRwc1wiIHx8IHVyaS5wcm90b2NvbCA9PT0gXCJ3c3NcIjtcbiAgICAgICAgICAgIG9wdHMucG9ydCA9IHVyaS5wb3J0O1xuICAgICAgICAgICAgaWYgKHVyaS5xdWVyeSlcbiAgICAgICAgICAgICAgICBvcHRzLnF1ZXJ5ID0gdXJpLnF1ZXJ5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdHMuaG9zdCkge1xuICAgICAgICAgICAgb3B0cy5ob3N0bmFtZSA9ICgwLCBwYXJzZXVyaV9qc18xLnBhcnNlKShvcHRzLmhvc3QpLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgKDAsIHV0aWxfanNfMS5pbnN0YWxsVGltZXJGdW5jdGlvbnMpKHRoaXMsIG9wdHMpO1xuICAgICAgICB0aGlzLnNlY3VyZSA9XG4gICAgICAgICAgICBudWxsICE9IG9wdHMuc2VjdXJlXG4gICAgICAgICAgICAgICAgPyBvcHRzLnNlY3VyZVxuICAgICAgICAgICAgICAgIDogdHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiICYmIFwiaHR0cHM6XCIgPT09IGxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgICBpZiAob3B0cy5ob3N0bmFtZSAmJiAhb3B0cy5wb3J0KSB7XG4gICAgICAgICAgICAvLyBpZiBubyBwb3J0IGlzIHNwZWNpZmllZCBtYW51YWxseSwgdXNlIHRoZSBwcm90b2NvbCBkZWZhdWx0XG4gICAgICAgICAgICBvcHRzLnBvcnQgPSB0aGlzLnNlY3VyZSA/IFwiNDQzXCIgOiBcIjgwXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ob3N0bmFtZSA9XG4gICAgICAgICAgICBvcHRzLmhvc3RuYW1lIHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiA/IGxvY2F0aW9uLmhvc3RuYW1lIDogXCJsb2NhbGhvc3RcIik7XG4gICAgICAgIHRoaXMucG9ydCA9XG4gICAgICAgICAgICBvcHRzLnBvcnQgfHxcbiAgICAgICAgICAgICAgICAodHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiICYmIGxvY2F0aW9uLnBvcnRcbiAgICAgICAgICAgICAgICAgICAgPyBsb2NhdGlvbi5wb3J0XG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5zZWN1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCI0NDNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcIjgwXCIpO1xuICAgICAgICB0aGlzLnRyYW5zcG9ydHMgPSBvcHRzLnRyYW5zcG9ydHMgfHwgW1xuICAgICAgICAgICAgXCJwb2xsaW5nXCIsXG4gICAgICAgICAgICBcIndlYnNvY2tldFwiLFxuICAgICAgICAgICAgXCJ3ZWJ0cmFuc3BvcnRcIixcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy53cml0ZUJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLnByZXZCdWZmZXJMZW4gPSAwO1xuICAgICAgICB0aGlzLm9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIHBhdGg6IFwiL2VuZ2luZS5pb1wiLFxuICAgICAgICAgICAgYWdlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgICAgICAgIHVwZ3JhZGU6IHRydWUsXG4gICAgICAgICAgICB0aW1lc3RhbXBQYXJhbTogXCJ0XCIsXG4gICAgICAgICAgICByZW1lbWJlclVwZ3JhZGU6IGZhbHNlLFxuICAgICAgICAgICAgYWRkVHJhaWxpbmdTbGFzaDogdHJ1ZSxcbiAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgICAgICAgIHBlck1lc3NhZ2VEZWZsYXRlOiB7XG4gICAgICAgICAgICAgICAgdGhyZXNob2xkOiAxMDI0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYW5zcG9ydE9wdGlvbnM6IHt9LFxuICAgICAgICAgICAgY2xvc2VPbkJlZm9yZXVubG9hZDogZmFsc2UsXG4gICAgICAgIH0sIG9wdHMpO1xuICAgICAgICB0aGlzLm9wdHMucGF0aCA9XG4gICAgICAgICAgICB0aGlzLm9wdHMucGF0aC5yZXBsYWNlKC9cXC8kLywgXCJcIikgK1xuICAgICAgICAgICAgICAgICh0aGlzLm9wdHMuYWRkVHJhaWxpbmdTbGFzaCA/IFwiL1wiIDogXCJcIik7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLnF1ZXJ5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLm9wdHMucXVlcnkgPSAoMCwgcGFyc2Vxc19qc18xLmRlY29kZSkodGhpcy5vcHRzLnF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgb24gaGFuZHNoYWtlXG4gICAgICAgIHRoaXMuaWQgPSBudWxsO1xuICAgICAgICB0aGlzLnVwZ3JhZGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5waW5nSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICB0aGlzLnBpbmdUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgLy8gc2V0IG9uIGhlYXJ0YmVhdFxuICAgICAgICB0aGlzLnBpbmdUaW1lb3V0VGltZXIgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIGFkZEV2ZW50TGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5jbG9zZU9uQmVmb3JldW5sb2FkKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZWZveCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gd2hlbiB0aGUgXCJiZWZvcmV1bmxvYWRcIiBldmVudCBpcyBlbWl0dGVkIGJ1dCBub3QgQ2hyb21lLiBUaGlzIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgLy8gZW5zdXJlcyBldmVyeSBicm93c2VyIGJlaGF2ZXMgdGhlIHNhbWUgKG5vIFwiZGlzY29ubmVjdFwiIGV2ZW50IGF0IHRoZSBTb2NrZXQuSU8gbGV2ZWwgd2hlbiB0aGUgcGFnZSBpc1xuICAgICAgICAgICAgICAgIC8vIGNsb3NlZC9yZWxvYWRlZClcbiAgICAgICAgICAgICAgICB0aGlzLmJlZm9yZXVubG9hZEV2ZW50TGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lsZW50bHkgY2xvc2UgdGhlIHRyYW5zcG9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIHRoaXMuYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaG9zdG5hbWUgIT09IFwibG9jYWxob3N0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZmxpbmVFdmVudExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2xvc2UoXCJ0cmFuc3BvcnQgY2xvc2VcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwibmV0d29yayBjb25uZWN0aW9uIGxvc3RcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKFwib2ZmbGluZVwiLCB0aGlzLm9mZmxpbmVFdmVudExpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdHJhbnNwb3J0IG9mIHRoZSBnaXZlbiB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSB0cmFuc3BvcnQgbmFtZVxuICAgICAqIEByZXR1cm4ge1RyYW5zcG9ydH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNyZWF0ZVRyYW5zcG9ydChuYW1lKSB7XG4gICAgICAgIGRlYnVnKCdjcmVhdGluZyB0cmFuc3BvcnQgXCIlc1wiJywgbmFtZSk7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLnF1ZXJ5KTtcbiAgICAgICAgLy8gYXBwZW5kIGVuZ2luZS5pbyBwcm90b2NvbCBpZGVudGlmaWVyXG4gICAgICAgIHF1ZXJ5LkVJTyA9IGVuZ2luZV9pb19wYXJzZXJfMS5wcm90b2NvbDtcbiAgICAgICAgLy8gdHJhbnNwb3J0IG5hbWVcbiAgICAgICAgcXVlcnkudHJhbnNwb3J0ID0gbmFtZTtcbiAgICAgICAgLy8gc2Vzc2lvbiBpZCBpZiB3ZSBhbHJlYWR5IGhhdmUgb25lXG4gICAgICAgIGlmICh0aGlzLmlkKVxuICAgICAgICAgICAgcXVlcnkuc2lkID0gdGhpcy5pZDtcbiAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywge1xuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICBzb2NrZXQ6IHRoaXMsXG4gICAgICAgICAgICBob3N0bmFtZTogdGhpcy5ob3N0bmFtZSxcbiAgICAgICAgICAgIHNlY3VyZTogdGhpcy5zZWN1cmUsXG4gICAgICAgICAgICBwb3J0OiB0aGlzLnBvcnQsXG4gICAgICAgIH0sIHRoaXMub3B0cy50cmFuc3BvcnRPcHRpb25zW25hbWVdKTtcbiAgICAgICAgZGVidWcoXCJvcHRpb25zOiAlalwiLCBvcHRzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBpbmRleF9qc18xLnRyYW5zcG9ydHNbbmFtZV0ob3B0cyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRyYW5zcG9ydCB0byB1c2UgYW5kIHN0YXJ0cyBwcm9iZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb3BlbigpIHtcbiAgICAgICAgbGV0IHRyYW5zcG9ydDtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5yZW1lbWJlclVwZ3JhZGUgJiZcbiAgICAgICAgICAgIFNvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3MgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0cy5pbmRleE9mKFwid2Vic29ja2V0XCIpICE9PSAtMSkge1xuICAgICAgICAgICAgdHJhbnNwb3J0ID0gXCJ3ZWJzb2NrZXRcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgwID09PSB0aGlzLnRyYW5zcG9ydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBFbWl0IGVycm9yIG9uIG5leHQgdGljayBzbyBpdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICAgICAgICAgIHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIFwiTm8gdHJhbnNwb3J0cyBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRyYW5zcG9ydCA9IHRoaXMudHJhbnNwb3J0c1swXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5pbmdcIjtcbiAgICAgICAgLy8gUmV0cnkgd2l0aCB0aGUgbmV4dCB0cmFuc3BvcnQgaWYgdGhlIHRyYW5zcG9ydCBpcyBkaXNhYmxlZCAoanNvbnA6IGZhbHNlKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoXCJlcnJvciB3aGlsZSBjcmVhdGluZyB0cmFuc3BvcnQ6ICVzXCIsIGUpO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cmFuc3BvcnQub3BlbigpO1xuICAgICAgICB0aGlzLnNldFRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHRyYW5zcG9ydC4gRGlzYWJsZXMgdGhlIGV4aXN0aW5nIG9uZSAoaWYgYW55KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2V0VHJhbnNwb3J0KHRyYW5zcG9ydCkge1xuICAgICAgICBkZWJ1ZyhcInNldHRpbmcgdHJhbnNwb3J0ICVzXCIsIHRyYW5zcG9ydC5uYW1lKTtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0KSB7XG4gICAgICAgICAgICBkZWJ1ZyhcImNsZWFyaW5nIGV4aXN0aW5nIHRyYW5zcG9ydCAlc1wiLCB0aGlzLnRyYW5zcG9ydC5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCB1cCB0cmFuc3BvcnRcbiAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgICAgIC8vIHNldCB1cCB0cmFuc3BvcnQgbGlzdGVuZXJzXG4gICAgICAgIHRyYW5zcG9ydFxuICAgICAgICAgICAgLm9uKFwiZHJhaW5cIiwgdGhpcy5vbkRyYWluLmJpbmQodGhpcykpXG4gICAgICAgICAgICAub24oXCJwYWNrZXRcIiwgdGhpcy5vblBhY2tldC5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKFwiZXJyb3JcIiwgdGhpcy5vbkVycm9yLmJpbmQodGhpcykpXG4gICAgICAgICAgICAub24oXCJjbG9zZVwiLCAocmVhc29uKSA9PiB0aGlzLm9uQ2xvc2UoXCJ0cmFuc3BvcnQgY2xvc2VcIiwgcmVhc29uKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2JlcyBhIHRyYW5zcG9ydC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gdHJhbnNwb3J0IG5hbWVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByb2JlKG5hbWUpIHtcbiAgICAgICAgZGVidWcoJ3Byb2JpbmcgdHJhbnNwb3J0IFwiJXNcIicsIG5hbWUpO1xuICAgICAgICBsZXQgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQobmFtZSk7XG4gICAgICAgIGxldCBmYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgU29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBvblRyYW5zcG9ydE9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmFpbGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGRlYnVnKCdwcm9iZSB0cmFuc3BvcnQgXCIlc1wiIG9wZW5lZCcsIG5hbWUpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoW3sgdHlwZTogXCJwaW5nXCIsIGRhdGE6IFwicHJvYmVcIiB9XSk7XG4gICAgICAgICAgICB0cmFuc3BvcnQub25jZShcInBhY2tldFwiLCAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZhaWxlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChcInBvbmdcIiA9PT0gbXNnLnR5cGUgJiYgXCJwcm9iZVwiID09PSBtc2cuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZygncHJvYmUgdHJhbnNwb3J0IFwiJXNcIiBwb25nJywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBncmFkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJ1cGdyYWRpbmdcIiwgdHJhbnNwb3J0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc3BvcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIFNvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3MgPSBcIndlYnNvY2tldFwiID09PSB0cmFuc3BvcnQubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoJ3BhdXNpbmcgY3VycmVudCB0cmFuc3BvcnQgXCIlc1wiJywgdGhpcy50cmFuc3BvcnQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnBhdXNlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwiY2xvc2VkXCIgPT09IHRoaXMucmVhZHlTdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhcImNoYW5naW5nIHRyYW5zcG9ydCBhbmQgc2VuZGluZyB1cGdyYWRlIHBhY2tldFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VHJhbnNwb3J0KHRyYW5zcG9ydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuc2VuZChbeyB0eXBlOiBcInVwZ3JhZGVcIiB9XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInVwZ3JhZGVcIiwgdHJhbnNwb3J0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnKCdwcm9iZSB0cmFuc3BvcnQgXCIlc1wiIGZhaWxlZCcsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJwcm9iZSBlcnJvclwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBlcnIudHJhbnNwb3J0ID0gdHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwidXBncmFkZUVycm9yXCIsIGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIGZyZWV6ZVRyYW5zcG9ydCgpIHtcbiAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gQW55IGNhbGxiYWNrIGNhbGxlZCBieSB0cmFuc3BvcnQgc2hvdWxkIGJlIGlnbm9yZWQgc2luY2Ugbm93XG4gICAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICB0cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBhbnkgZXJyb3IgdGhhdCBoYXBwZW5zIHdoaWxlIHByb2JpbmdcbiAgICAgICAgY29uc3Qgb25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFwicHJvYmUgZXJyb3I6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVycm9yLnRyYW5zcG9ydCA9IHRyYW5zcG9ydC5uYW1lO1xuICAgICAgICAgICAgZnJlZXplVHJhbnNwb3J0KCk7XG4gICAgICAgICAgICBkZWJ1ZygncHJvYmUgdHJhbnNwb3J0IFwiJXNcIiBmYWlsZWQgYmVjYXVzZSBvZiBlcnJvcjogJXMnLCBuYW1lLCBlcnIpO1xuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJ1cGdyYWRlRXJyb3JcIiwgZXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICBmdW5jdGlvbiBvblRyYW5zcG9ydENsb3NlKCkge1xuICAgICAgICAgICAgb25lcnJvcihcInRyYW5zcG9ydCBjbG9zZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZCB3aGlsZSB3ZSdyZSBwcm9iaW5nXG4gICAgICAgIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgICAgICAgICBvbmVycm9yKFwic29ja2V0IGNsb3NlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBzb2NrZXQgaXMgdXBncmFkZWQgd2hpbGUgd2UncmUgcHJvYmluZ1xuICAgICAgICBmdW5jdGlvbiBvbnVwZ3JhZGUodG8pIHtcbiAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgJiYgdG8ubmFtZSAhPT0gdHJhbnNwb3J0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnXCIlc1wiIHdvcmtzIC0gYWJvcnRpbmcgXCIlc1wiJywgdG8ubmFtZSwgdHJhbnNwb3J0Lm5hbWUpO1xuICAgICAgICAgICAgICAgIGZyZWV6ZVRyYW5zcG9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIG9uIHRoZSB0cmFuc3BvcnQgYW5kIG9uIHNlbGZcbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcIm9wZW5cIiwgb25UcmFuc3BvcnRPcGVuKTtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIG9uZXJyb3IpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLm9mZihcImNsb3NlXCIsIG9uY2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5vZmYoXCJ1cGdyYWRpbmdcIiwgb251cGdyYWRlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJhbnNwb3J0Lm9uY2UoXCJvcGVuXCIsIG9uVHJhbnNwb3J0T3Blbik7XG4gICAgICAgIHRyYW5zcG9ydC5vbmNlKFwiZXJyb3JcIiwgb25lcnJvcik7XG4gICAgICAgIHRyYW5zcG9ydC5vbmNlKFwiY2xvc2VcIiwgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgICAgIHRoaXMub25jZShcImNsb3NlXCIsIG9uY2xvc2UpO1xuICAgICAgICB0aGlzLm9uY2UoXCJ1cGdyYWRpbmdcIiwgb251cGdyYWRlKTtcbiAgICAgICAgaWYgKHRoaXMudXBncmFkZXMuaW5kZXhPZihcIndlYnRyYW5zcG9ydFwiKSAhPT0gLTEgJiZcbiAgICAgICAgICAgIG5hbWUgIT09IFwid2VidHJhbnNwb3J0XCIpIHtcbiAgICAgICAgICAgIC8vIGZhdm9yIFdlYlRyYW5zcG9ydFxuICAgICAgICAgICAgdGhpcy5zZXRUaW1lb3V0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gY29ubmVjdGlvbiBpcyBkZWVtZWQgb3Blbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25PcGVuKCkge1xuICAgICAgICBkZWJ1ZyhcInNvY2tldCBvcGVuXCIpO1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgU29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IFwid2Vic29ja2V0XCIgPT09IHRoaXMudHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwib3BlblwiKTtcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICAvLyB3ZSBjaGVjayBmb3IgYHJlYWR5U3RhdGVgIGluIGNhc2UgYW4gYG9wZW5gXG4gICAgICAgIC8vIGxpc3RlbmVyIGFscmVhZHkgY2xvc2VkIHRoZSBzb2NrZXRcbiAgICAgICAgaWYgKFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUgJiYgdGhpcy5vcHRzLnVwZ3JhZGUpIHtcbiAgICAgICAgICAgIGRlYnVnKFwic3RhcnRpbmcgdXBncmFkZSBwcm9iZXNcIik7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBjb25zdCBsID0gdGhpcy51cGdyYWRlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvYmUodGhpcy51cGdyYWRlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBhIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25QYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8XG4gICAgICAgICAgICBcIm9wZW5cIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8XG4gICAgICAgICAgICBcImNsb3NpbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICBkZWJ1Zygnc29ja2V0IHJlY2VpdmU6IHR5cGUgXCIlc1wiLCBkYXRhIFwiJXNcIicsIHBhY2tldC50eXBlLCBwYWNrZXQuZGF0YSk7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgLy8gU29ja2V0IGlzIGxpdmUgLSBhbnkgcGFja2V0IGNvdW50c1xuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJoZWFydGJlYXRcIik7XG4gICAgICAgICAgICB0aGlzLnJlc2V0UGluZ1RpbWVvdXQoKTtcbiAgICAgICAgICAgIHN3aXRjaCAocGFja2V0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwib3BlblwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uSGFuZHNoYWtlKEpTT04ucGFyc2UocGFja2V0LmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInBpbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kUGFja2V0KFwicG9uZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwaW5nXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBvbmdcIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJzZXJ2ZXIgZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgZXJyLmNvZGUgPSBwYWNrZXQuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZGF0YVwiLCBwYWNrZXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwibWVzc2FnZVwiLCBwYWNrZXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVidWcoJ3BhY2tldCByZWNlaXZlZCB3aXRoIHNvY2tldCByZWFkeVN0YXRlIFwiJXNcIicsIHRoaXMucmVhZHlTdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gaGFuZHNoYWtlIGNvbXBsZXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIGhhbmRzaGFrZSBvYmpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uSGFuZHNoYWtlKGRhdGEpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJoYW5kc2hha2VcIiwgZGF0YSk7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLnNpZDtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQucXVlcnkuc2lkID0gZGF0YS5zaWQ7XG4gICAgICAgIHRoaXMudXBncmFkZXMgPSB0aGlzLmZpbHRlclVwZ3JhZGVzKGRhdGEudXBncmFkZXMpO1xuICAgICAgICB0aGlzLnBpbmdJbnRlcnZhbCA9IGRhdGEucGluZ0ludGVydmFsO1xuICAgICAgICB0aGlzLnBpbmdUaW1lb3V0ID0gZGF0YS5waW5nVGltZW91dDtcbiAgICAgICAgdGhpcy5tYXhQYXlsb2FkID0gZGF0YS5tYXhQYXlsb2FkO1xuICAgICAgICB0aGlzLm9uT3BlbigpO1xuICAgICAgICAvLyBJbiBjYXNlIG9wZW4gaGFuZGxlciBjbG9zZXMgc29ja2V0XG4gICAgICAgIGlmIChcImNsb3NlZFwiID09PSB0aGlzLnJlYWR5U3RhdGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucmVzZXRQaW5nVGltZW91dCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGFuZCByZXNldHMgcGluZyB0aW1lb3V0IHRpbWVyIGJhc2VkIG9uIHNlcnZlciBwaW5ncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVzZXRQaW5nVGltZW91dCgpIHtcbiAgICAgICAgdGhpcy5jbGVhclRpbWVvdXRGbih0aGlzLnBpbmdUaW1lb3V0VGltZXIpO1xuICAgICAgICB0aGlzLnBpbmdUaW1lb3V0VGltZXIgPSB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQ2xvc2UoXCJwaW5nIHRpbWVvdXRcIik7XG4gICAgICAgIH0sIHRoaXMucGluZ0ludGVydmFsICsgdGhpcy5waW5nVGltZW91dCk7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXV0b1VucmVmKSB7XG4gICAgICAgICAgICB0aGlzLnBpbmdUaW1lb3V0VGltZXIudW5yZWYoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgb24gYGRyYWluYCBldmVudFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbkRyYWluKCkge1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyLnNwbGljZSgwLCB0aGlzLnByZXZCdWZmZXJMZW4pO1xuICAgICAgICAvLyBzZXR0aW5nIHByZXZCdWZmZXJMZW4gPSAwIGlzIHZlcnkgaW1wb3J0YW50XG4gICAgICAgIC8vIGZvciBleGFtcGxlLCB3aGVuIHVwZ3JhZGluZywgdXBncmFkZSBwYWNrZXQgaXMgc2VudCBvdmVyLFxuICAgICAgICAvLyBhbmQgYSBub256ZXJvIHByZXZCdWZmZXJMZW4gY291bGQgY2F1c2UgcHJvYmxlbXMgb24gYGRyYWluYFxuICAgICAgICB0aGlzLnByZXZCdWZmZXJMZW4gPSAwO1xuICAgICAgICBpZiAoMCA9PT0gdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRmx1c2ggd3JpdGUgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZmx1c2goKSB7XG4gICAgICAgIGlmIChcImNsb3NlZFwiICE9PSB0aGlzLnJlYWR5U3RhdGUgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LndyaXRhYmxlICYmXG4gICAgICAgICAgICAhdGhpcy51cGdyYWRpbmcgJiZcbiAgICAgICAgICAgIHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBwYWNrZXRzID0gdGhpcy5nZXRXcml0YWJsZVBhY2tldHMoKTtcbiAgICAgICAgICAgIGRlYnVnKFwiZmx1c2hpbmcgJWQgcGFja2V0cyBpbiBzb2NrZXRcIiwgcGFja2V0cy5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQuc2VuZChwYWNrZXRzKTtcbiAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgY3VycmVudCBsZW5ndGggb2Ygd3JpdGVCdWZmZXJcbiAgICAgICAgICAgIC8vIHNwbGljZSB3cml0ZUJ1ZmZlciBhbmQgY2FsbGJhY2tCdWZmZXIgb24gYGRyYWluYFxuICAgICAgICAgICAgdGhpcy5wcmV2QnVmZmVyTGVuID0gcGFja2V0cy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImZsdXNoXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZSB0aGUgZW5jb2RlZCBzaXplIG9mIHRoZSB3cml0ZUJ1ZmZlciBpcyBiZWxvdyB0aGUgbWF4UGF5bG9hZCB2YWx1ZSBzZW50IGJ5IHRoZSBzZXJ2ZXIgKG9ubHkgZm9yIEhUVFBcbiAgICAgKiBsb25nLXBvbGxpbmcpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldFdyaXRhYmxlUGFja2V0cygpIHtcbiAgICAgICAgY29uc3Qgc2hvdWxkQ2hlY2tQYXlsb2FkU2l6ZSA9IHRoaXMubWF4UGF5bG9hZCAmJlxuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQubmFtZSA9PT0gXCJwb2xsaW5nXCIgJiZcbiAgICAgICAgICAgIHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoID4gMTtcbiAgICAgICAgaWYgKCFzaG91bGRDaGVja1BheWxvYWRTaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF5bG9hZFNpemUgPSAxOyAvLyBmaXJzdCBwYWNrZXQgdHlwZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLndyaXRlQnVmZmVyW2ldLmRhdGE7XG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIHBheWxvYWRTaXplICs9ICgwLCB1dGlsX2pzXzEuYnl0ZUxlbmd0aCkoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSA+IDAgJiYgcGF5bG9hZFNpemUgPiB0aGlzLm1heFBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhcIm9ubHkgc2VuZCAlZCBvdXQgb2YgJWQgcGFja2V0c1wiLCBpLCB0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCdWZmZXIuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXlsb2FkU2l6ZSArPSAyOyAvLyBzZXBhcmF0b3IgKyBwYWNrZXQgdHlwZVxuICAgICAgICB9XG4gICAgICAgIGRlYnVnKFwicGF5bG9hZCBzaXplIGlzICVkIChtYXg6ICVkKVwiLCBwYXlsb2FkU2l6ZSwgdGhpcy5tYXhQYXlsb2FkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCdWZmZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm4ge1NvY2tldH0gZm9yIGNoYWluaW5nLlxuICAgICAqL1xuICAgIHdyaXRlKG1zZywgb3B0aW9ucywgZm4pIHtcbiAgICAgICAgdGhpcy5zZW5kUGFja2V0KFwibWVzc2FnZVwiLCBtc2csIG9wdGlvbnMsIGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNlbmQobXNnLCBvcHRpb25zLCBmbikge1xuICAgICAgICB0aGlzLnNlbmRQYWNrZXQoXCJtZXNzYWdlXCIsIG1zZywgb3B0aW9ucywgZm4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBwYWNrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZTogcGFja2V0IHR5cGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGEuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNlbmRQYWNrZXQodHlwZSwgZGF0YSwgb3B0aW9ucywgZm4pIHtcbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGRhdGEpIHtcbiAgICAgICAgICAgIGZuID0gZGF0YTtcbiAgICAgICAgICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGZuID0gb3B0aW9ucztcbiAgICAgICAgICAgIG9wdGlvbnMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcImNsb3NpbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8IFwiY2xvc2VkXCIgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBvcHRpb25zLmNvbXByZXNzID0gZmFsc2UgIT09IG9wdGlvbnMuY29tcHJlc3M7XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwYWNrZXRDcmVhdGVcIiwgcGFja2V0KTtcbiAgICAgICAgdGhpcy53cml0ZUJ1ZmZlci5wdXNoKHBhY2tldCk7XG4gICAgICAgIGlmIChmbilcbiAgICAgICAgICAgIHRoaXMub25jZShcImZsdXNoXCIsIGZuKTtcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNsb3NlKFwiZm9yY2VkIGNsb3NlXCIpO1xuICAgICAgICAgICAgZGVidWcoXCJzb2NrZXQgY2xvc2luZyAtIHRlbGxpbmcgdHJhbnNwb3J0IHRvIGNsb3NlXCIpO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2xlYW51cEFuZENsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vZmYoXCJ1cGdyYWRlXCIsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLm9mZihcInVwZ3JhZGVFcnJvclwiLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgd2FpdEZvclVwZ3JhZGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyB3YWl0IGZvciB1cGdyYWRlIHRvIGZpbmlzaCBzaW5jZSB3ZSBjYW4ndCBzZW5kIHBhY2tldHMgd2hpbGUgcGF1c2luZyBhIHRyYW5zcG9ydFxuICAgICAgICAgICAgdGhpcy5vbmNlKFwidXBncmFkZVwiLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5vbmNlKFwidXBncmFkZUVycm9yXCIsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8IFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwiY2xvc2luZ1wiO1xuICAgICAgICAgICAgaWYgKHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwiZHJhaW5cIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51cGdyYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnVwZ3JhZGluZykge1xuICAgICAgICAgICAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgZXJyb3JcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25FcnJvcihlcnIpIHtcbiAgICAgICAgZGVidWcoXCJzb2NrZXQgZXJyb3IgJWpcIiwgZXJyKTtcbiAgICAgICAgU29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVycik7XG4gICAgICAgIHRoaXMub25DbG9zZShcInRyYW5zcG9ydCBlcnJvclwiLCBlcnIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgY2xvc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uQ2xvc2UocmVhc29uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBpZiAoXCJvcGVuaW5nXCIgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgICAgICAgXCJvcGVuXCIgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgICAgICAgXCJjbG9zaW5nXCIgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgZGVidWcoJ3NvY2tldCBjbG9zZSB3aXRoIHJlYXNvbjogXCIlc1wiJywgcmVhc29uKTtcbiAgICAgICAgICAgIC8vIGNsZWFyIHRpbWVyc1xuICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVvdXRGbih0aGlzLnBpbmdUaW1lb3V0VGltZXIpO1xuICAgICAgICAgICAgLy8gc3RvcCBldmVudCBmcm9tIGZpcmluZyBhZ2FpbiBmb3IgdHJhbnNwb3J0XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJjbG9zZVwiKTtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0cmFuc3BvcnQgd29uJ3Qgc3RheSBvcGVuXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5jbG9zZSgpO1xuICAgICAgICAgICAgLy8gaWdub3JlIGZ1cnRoZXIgdHJhbnNwb3J0IGNvbW11bmljYXRpb25cbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZW1vdmVFdmVudExpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIHRoaXMuYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIHRoaXMub2ZmbGluZUV2ZW50TGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNldCByZWFkeSBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJjbG9zZWRcIjtcbiAgICAgICAgICAgIC8vIGNsZWFyIHNlc3Npb24gaWRcbiAgICAgICAgICAgIHRoaXMuaWQgPSBudWxsO1xuICAgICAgICAgICAgLy8gZW1pdCBjbG9zZSBldmVudFxuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjbG9zZVwiLCByZWFzb24sIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIC8vIGNsZWFuIGJ1ZmZlcnMgYWZ0ZXIsIHNvIHVzZXJzIGNhbiBzdGlsbFxuICAgICAgICAgICAgLy8gZ3JhYiB0aGUgYnVmZmVycyBvbiBgY2xvc2VgIGV2ZW50XG4gICAgICAgICAgICB0aGlzLndyaXRlQnVmZmVyID0gW107XG4gICAgICAgICAgICB0aGlzLnByZXZCdWZmZXJMZW4gPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdXBncmFkZXMsIHJldHVybmluZyBvbmx5IHRob3NlIG1hdGNoaW5nIGNsaWVudCB0cmFuc3BvcnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gdXBncmFkZXMgLSBzZXJ2ZXIgdXBncmFkZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZpbHRlclVwZ3JhZGVzKHVwZ3JhZGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkVXBncmFkZXMgPSBbXTtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBjb25zdCBqID0gdXBncmFkZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgaWYgKH50aGlzLnRyYW5zcG9ydHMuaW5kZXhPZih1cGdyYWRlc1tpXSkpXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRVcGdyYWRlcy5wdXNoKHVwZ3JhZGVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWRVcGdyYWRlcztcbiAgICB9XG59XG5leHBvcnRzLlNvY2tldCA9IFNvY2tldDtcblNvY2tldC5wcm90b2NvbCA9IGVuZ2luZV9pb19wYXJzZXJfMS5wcm90b2NvbDtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UcmFuc3BvcnQgPSBleHBvcnRzLlRyYW5zcG9ydEVycm9yID0gdm9pZCAwO1xuY29uc3QgZW5naW5lX2lvX3BhcnNlcl8xID0gcmVxdWlyZShcImVuZ2luZS5pby1wYXJzZXJcIik7XG5jb25zdCBjb21wb25lbnRfZW1pdHRlcl8xID0gcmVxdWlyZShcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIik7XG5jb25zdCB1dGlsX2pzXzEgPSByZXF1aXJlKFwiLi91dGlsLmpzXCIpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpOyAvLyBkZWJ1ZygpXG5jb25zdCBwYXJzZXFzX2pzXzEgPSByZXF1aXJlKFwiLi9jb250cmliL3BhcnNlcXMuanNcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKFwiZW5naW5lLmlvLWNsaWVudDp0cmFuc3BvcnRcIik7IC8vIGRlYnVnKClcbmNsYXNzIFRyYW5zcG9ydEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHJlYXNvbiwgZGVzY3JpcHRpb24sIGNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIocmVhc29uKTtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLnR5cGUgPSBcIlRyYW5zcG9ydEVycm9yXCI7XG4gICAgfVxufVxuZXhwb3J0cy5UcmFuc3BvcnRFcnJvciA9IFRyYW5zcG9ydEVycm9yO1xuY2xhc3MgVHJhbnNwb3J0IGV4dGVuZHMgY29tcG9uZW50X2VtaXR0ZXJfMS5FbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBUcmFuc3BvcnQgYWJzdHJhY3QgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgICgwLCB1dGlsX2pzXzEuaW5zdGFsbFRpbWVyRnVuY3Rpb25zKSh0aGlzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5xdWVyeSA9IG9wdHMucXVlcnk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gb3B0cy5zb2NrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHJlYXNvblxuICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvblxuICAgICAqIEBwYXJhbSBjb250ZXh0IC0gdGhlIGVycm9yIGNvbnRleHRcbiAgICAgKiBAcmV0dXJuIHtUcmFuc3BvcnR9IGZvciBjaGFpbmluZ1xuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvbkVycm9yKHJlYXNvbiwgZGVzY3JpcHRpb24sIGNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZXJyb3JcIiwgbmV3IFRyYW5zcG9ydEVycm9yKHJlYXNvbiwgZGVzY3JpcHRpb24sIGNvbnRleHQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQuXG4gICAgICovXG4gICAgb3BlbigpIHtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJvcGVuaW5nXCI7XG4gICAgICAgIHRoaXMuZG9PcGVuKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydC5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gXCJvcGVuaW5nXCIgfHwgdGhpcy5yZWFkeVN0YXRlID09PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgdGhpcy5kb0Nsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLm9uQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgbXVsdGlwbGUgcGFja2V0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2tldHNcbiAgICAgKi9cbiAgICBzZW5kKHBhY2tldHMpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gXCJvcGVuXCIpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGUocGFja2V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGlzIG1pZ2h0IGhhcHBlbiBpZiB0aGUgdHJhbnNwb3J0IHdhcyBzaWxlbnRseSBjbG9zZWQgaW4gdGhlIGJlZm9yZXVubG9hZCBldmVudCBoYW5kbGVyXG4gICAgICAgICAgICBkZWJ1ZyhcInRyYW5zcG9ydCBpcyBub3Qgb3BlbiwgZGlzY2FyZGluZyBwYWNrZXRzXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIG9wZW5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvbk9wZW4oKSB7XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwib3BlblwiO1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwib3BlblwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdpdGggZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG9uRGF0YShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHBhY2tldCA9ICgwLCBlbmdpbmVfaW9fcGFyc2VyXzEuZGVjb2RlUGFja2V0KShkYXRhLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlKTtcbiAgICAgICAgdGhpcy5vblBhY2tldChwYWNrZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2l0aCBhIGRlY29kZWQgcGFja2V0LlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG9uUGFja2V0KHBhY2tldCkge1xuICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJwYWNrZXRcIiwgcGFja2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gY2xvc2UuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgb25DbG9zZShkZXRhaWxzKSB7XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwiY2xvc2VkXCI7XG4gICAgICAgIHN1cGVyLmVtaXRSZXNlcnZlZChcImNsb3NlXCIsIGRldGFpbHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgdGhlIHRyYW5zcG9ydCwgaW4gb3JkZXIgbm90IHRvIGxvc2UgcGFja2V0cyBkdXJpbmcgYW4gdXBncmFkZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvblBhdXNlXG4gICAgICovXG4gICAgcGF1c2Uob25QYXVzZSkgeyB9XG4gICAgY3JlYXRlVXJpKHNjaGVtYSwgcXVlcnkgPSB7fSkge1xuICAgICAgICByZXR1cm4gKHNjaGVtYSArXG4gICAgICAgICAgICBcIjovL1wiICtcbiAgICAgICAgICAgIHRoaXMuX2hvc3RuYW1lKCkgK1xuICAgICAgICAgICAgdGhpcy5fcG9ydCgpICtcbiAgICAgICAgICAgIHRoaXMub3B0cy5wYXRoICtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXJ5KHF1ZXJ5KSk7XG4gICAgfVxuICAgIF9ob3N0bmFtZSgpIHtcbiAgICAgICAgY29uc3QgaG9zdG5hbWUgPSB0aGlzLm9wdHMuaG9zdG5hbWU7XG4gICAgICAgIHJldHVybiBob3N0bmFtZS5pbmRleE9mKFwiOlwiKSA9PT0gLTEgPyBob3N0bmFtZSA6IFwiW1wiICsgaG9zdG5hbWUgKyBcIl1cIjtcbiAgICB9XG4gICAgX3BvcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucG9ydCAmJlxuICAgICAgICAgICAgKCh0aGlzLm9wdHMuc2VjdXJlICYmIE51bWJlcih0aGlzLm9wdHMucG9ydCAhPT0gNDQzKSkgfHxcbiAgICAgICAgICAgICAgICAoIXRoaXMub3B0cy5zZWN1cmUgJiYgTnVtYmVyKHRoaXMub3B0cy5wb3J0KSAhPT0gODApKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiOlwiICsgdGhpcy5vcHRzLnBvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfcXVlcnkocXVlcnkpIHtcbiAgICAgICAgY29uc3QgZW5jb2RlZFF1ZXJ5ID0gKDAsIHBhcnNlcXNfanNfMS5lbmNvZGUpKHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIGVuY29kZWRRdWVyeS5sZW5ndGggPyBcIj9cIiArIGVuY29kZWRRdWVyeSA6IFwiXCI7XG4gICAgfVxufVxuZXhwb3J0cy5UcmFuc3BvcnQgPSBUcmFuc3BvcnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudHJhbnNwb3J0cyA9IHZvaWQgMDtcbmNvbnN0IHBvbGxpbmdfanNfMSA9IHJlcXVpcmUoXCIuL3BvbGxpbmcuanNcIik7XG5jb25zdCB3ZWJzb2NrZXRfanNfMSA9IHJlcXVpcmUoXCIuL3dlYnNvY2tldC5qc1wiKTtcbmNvbnN0IHdlYnRyYW5zcG9ydF9qc18xID0gcmVxdWlyZShcIi4vd2VidHJhbnNwb3J0LmpzXCIpO1xuZXhwb3J0cy50cmFuc3BvcnRzID0ge1xuICAgIHdlYnNvY2tldDogd2Vic29ja2V0X2pzXzEuV1MsXG4gICAgd2VidHJhbnNwb3J0OiB3ZWJ0cmFuc3BvcnRfanNfMS5XVCxcbiAgICBwb2xsaW5nOiBwb2xsaW5nX2pzXzEuUG9sbGluZyxcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVxdWVzdCA9IGV4cG9ydHMuUG9sbGluZyA9IHZvaWQgMDtcbmNvbnN0IHRyYW5zcG9ydF9qc18xID0gcmVxdWlyZShcIi4uL3RyYW5zcG9ydC5qc1wiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTsgLy8gZGVidWcoKVxuY29uc3QgeWVhc3RfanNfMSA9IHJlcXVpcmUoXCIuLi9jb250cmliL3llYXN0LmpzXCIpO1xuY29uc3QgZW5naW5lX2lvX3BhcnNlcl8xID0gcmVxdWlyZShcImVuZ2luZS5pby1wYXJzZXJcIik7XG5jb25zdCB4bWxodHRwcmVxdWVzdF9qc18xID0gcmVxdWlyZShcIi4veG1saHR0cHJlcXVlc3QuanNcIik7XG5jb25zdCBjb21wb25lbnRfZW1pdHRlcl8xID0gcmVxdWlyZShcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIik7XG5jb25zdCB1dGlsX2pzXzEgPSByZXF1aXJlKFwiLi4vdXRpbC5qc1wiKTtcbmNvbnN0IGdsb2JhbFRoaXNfanNfMSA9IHJlcXVpcmUoXCIuLi9nbG9iYWxUaGlzLmpzXCIpO1xuY29uc3QgZGVidWcgPSAoMCwgZGVidWdfMS5kZWZhdWx0KShcImVuZ2luZS5pby1jbGllbnQ6cG9sbGluZ1wiKTsgLy8gZGVidWcoKVxuZnVuY3Rpb24gZW1wdHkoKSB7IH1cbmNvbnN0IGhhc1hIUjIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHhociA9IG5ldyB4bWxodHRwcmVxdWVzdF9qc18xLlhIUih7XG4gICAgICAgIHhkb21haW46IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBudWxsICE9IHhoci5yZXNwb25zZVR5cGU7XG59KSgpO1xuY2xhc3MgUG9sbGluZyBleHRlbmRzIHRyYW5zcG9ydF9qc18xLlRyYW5zcG9ydCB7XG4gICAgLyoqXG4gICAgICogWEhSIFBvbGxpbmcgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqIEBwYWNrYWdlXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy5wb2xsaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzU1NMID0gXCJodHRwczpcIiA9PT0gbG9jYXRpb24ucHJvdG9jb2w7XG4gICAgICAgICAgICBsZXQgcG9ydCA9IGxvY2F0aW9uLnBvcnQ7XG4gICAgICAgICAgICAvLyBzb21lIHVzZXIgYWdlbnRzIGhhdmUgZW1wdHkgYGxvY2F0aW9uLnBvcnRgXG4gICAgICAgICAgICBpZiAoIXBvcnQpIHtcbiAgICAgICAgICAgICAgICBwb3J0ID0gaXNTU0wgPyBcIjQ0M1wiIDogXCI4MFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy54ZCA9XG4gICAgICAgICAgICAgICAgKHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICAgICBvcHRzLmhvc3RuYW1lICE9PSBsb2NhdGlvbi5ob3N0bmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgcG9ydCAhPT0gb3B0cy5wb3J0O1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBYSFIgc3VwcG9ydHMgYmluYXJ5XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBmb3JjZUJhc2U2NCA9IG9wdHMgJiYgb3B0cy5mb3JjZUJhc2U2NDtcbiAgICAgICAgdGhpcy5zdXBwb3J0c0JpbmFyeSA9IGhhc1hIUjIgJiYgIWZvcmNlQmFzZTY0O1xuICAgICAgICBpZiAodGhpcy5vcHRzLndpdGhDcmVkZW50aWFscykge1xuICAgICAgICAgICAgdGhpcy5jb29raWVKYXIgPSAoMCwgeG1saHR0cHJlcXVlc3RfanNfMS5jcmVhdGVDb29raWVKYXIpKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBcInBvbGxpbmdcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHNvY2tldCAodHJpZ2dlcnMgcG9sbGluZykuIFdlIHdyaXRlIGEgUElORyBtZXNzYWdlIHRvIGRldGVybWluZVxuICAgICAqIHdoZW4gdGhlIHRyYW5zcG9ydCBpcyBvcGVuLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGRvT3BlbigpIHtcbiAgICAgICAgdGhpcy5wb2xsKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhdXNlcyBwb2xsaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25QYXVzZSAtIGNhbGxiYWNrIHVwb24gYnVmZmVycyBhcmUgZmx1c2hlZCBhbmQgdHJhbnNwb3J0IGlzIHBhdXNlZFxuICAgICAqIEBwYWNrYWdlXG4gICAgICovXG4gICAgcGF1c2Uob25QYXVzZSkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcInBhdXNpbmdcIjtcbiAgICAgICAgY29uc3QgcGF1c2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBkZWJ1ZyhcInBhdXNlZFwiKTtcbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwicGF1c2VkXCI7XG4gICAgICAgICAgICBvblBhdXNlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnBvbGxpbmcgfHwgIXRoaXMud3JpdGFibGUpIHtcbiAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5wb2xsaW5nKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoXCJ3ZSBhcmUgY3VycmVudGx5IHBvbGxpbmcgLSB3YWl0aW5nIHRvIHBhdXNlXCIpO1xuICAgICAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwicG9sbENvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoXCJwcmUtcGF1c2UgcG9sbGluZyBjb21wbGV0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgLS10b3RhbCB8fCBwYXVzZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLndyaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoXCJ3ZSBhcmUgY3VycmVudGx5IHdyaXRpbmcgLSB3YWl0aW5nIHRvIHBhdXNlXCIpO1xuICAgICAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwiZHJhaW5cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhcInByZS1wYXVzZSB3cml0aW5nIGNvbXBsZXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAtLXRvdGFsIHx8IHBhdXNlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXVzZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBwb2xsaW5nIGN5Y2xlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwb2xsKCkge1xuICAgICAgICBkZWJ1ZyhcInBvbGxpbmdcIik7XG4gICAgICAgIHRoaXMucG9sbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZG9Qb2xsKCk7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicG9sbFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3ZlcmxvYWRzIG9uRGF0YSB0byBkZXRlY3QgcGF5bG9hZHMuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgb25EYXRhKGRhdGEpIHtcbiAgICAgICAgZGVidWcoXCJwb2xsaW5nIGdvdCBkYXRhICVzXCIsIGRhdGEpO1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIC8vIGlmIGl0cyB0aGUgZmlyc3QgbWVzc2FnZSB3ZSBjb25zaWRlciB0aGUgdHJhbnNwb3J0IG9wZW5cbiAgICAgICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlICYmIHBhY2tldC50eXBlID09PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgICAgIHRoaXMub25PcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiBpdHMgYSBjbG9zZSBwYWNrZXQsIHdlIGNsb3NlIHRoZSBvbmdvaW5nIHJlcXVlc3RzXG4gICAgICAgICAgICBpZiAoXCJjbG9zZVwiID09PSBwYWNrZXQudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25DbG9zZSh7IGRlc2NyaXB0aW9uOiBcInRyYW5zcG9ydCBjbG9zZWQgYnkgdGhlIHNlcnZlclwiIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBieXBhc3Mgb25EYXRhIGFuZCBoYW5kbGUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIHRoaXMub25QYWNrZXQocGFja2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gZGVjb2RlIHBheWxvYWRcbiAgICAgICAgKDAsIGVuZ2luZV9pb19wYXJzZXJfMS5kZWNvZGVQYXlsb2FkKShkYXRhLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlKS5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgICAgLy8gaWYgYW4gZXZlbnQgZGlkIG5vdCB0cmlnZ2VyIGNsb3NpbmdcbiAgICAgICAgaWYgKFwiY2xvc2VkXCIgIT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgLy8gaWYgd2UgZ290IGRhdGEgd2UncmUgbm90IHBvbGxpbmdcbiAgICAgICAgICAgIHRoaXMucG9sbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwb2xsQ29tcGxldGVcIik7XG4gICAgICAgICAgICBpZiAoXCJvcGVuXCIgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucG9sbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ2lnbm9yaW5nIHBvbGwgLSB0cmFuc3BvcnQgc3RhdGUgXCIlc1wiJywgdGhpcy5yZWFkeVN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgcG9sbGluZywgc2VuZCBhIGNsb3NlIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICBjb25zdCBjbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGRlYnVnKFwid3JpdGluZyBjbG9zZSBwYWNrZXRcIik7XG4gICAgICAgICAgICB0aGlzLndyaXRlKFt7IHR5cGU6IFwiY2xvc2VcIiB9XSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChcIm9wZW5cIiA9PT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICBkZWJ1ZyhcInRyYW5zcG9ydCBvcGVuIC0gY2xvc2luZ1wiKTtcbiAgICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIHRyeWluZyB0byBjbG9zZSB3aGlsZVxuICAgICAgICAgICAgLy8gaGFuZHNoYWtpbmcgaXMgaW4gcHJvZ3Jlc3MgKEdILTE2NClcbiAgICAgICAgICAgIGRlYnVnKFwidHJhbnNwb3J0IG5vdCBvcGVuIC0gZGVmZXJyaW5nIGNsb3NlXCIpO1xuICAgICAgICAgICAgdGhpcy5vbmNlKFwib3BlblwiLCBjbG9zZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgcGFja2V0cyBwYXlsb2FkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2V0cyAtIGRhdGEgcGFja2V0c1xuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICB3cml0ZShwYWNrZXRzKSB7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgICAgKDAsIGVuZ2luZV9pb19wYXJzZXJfMS5lbmNvZGVQYXlsb2FkKShwYWNrZXRzLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kb1dyaXRlKGRhdGEsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImRyYWluXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdXJpIGZvciBjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB1cmkoKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMub3B0cy5zZWN1cmUgPyBcImh0dHBzXCIgOiBcImh0dHBcIjtcbiAgICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJ5IHx8IHt9O1xuICAgICAgICAvLyBjYWNoZSBidXN0aW5nIGlzIGZvcmNlZFxuICAgICAgICBpZiAoZmFsc2UgIT09IHRoaXMub3B0cy50aW1lc3RhbXBSZXF1ZXN0cykge1xuICAgICAgICAgICAgcXVlcnlbdGhpcy5vcHRzLnRpbWVzdGFtcFBhcmFtXSA9ICgwLCB5ZWFzdF9qc18xLnllYXN0KSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zdXBwb3J0c0JpbmFyeSAmJiAhcXVlcnkuc2lkKSB7XG4gICAgICAgICAgICBxdWVyeS5iNjQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVVyaShzY2hlbWEsIHF1ZXJ5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZXF1ZXN0KG9wdHMgPSB7fSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKG9wdHMsIHsgeGQ6IHRoaXMueGQsIGNvb2tpZUphcjogdGhpcy5jb29raWVKYXIgfSwgdGhpcy5vcHRzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMudXJpKCksIG9wdHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgdG8gc2VuZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsZWQgdXBvbiBmbHVzaC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGRvV3JpdGUoZGF0YSwgZm4pIHtcbiAgICAgICAgY29uc3QgcmVxID0gdGhpcy5yZXF1ZXN0KHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9uKFwic3VjY2Vzc1wiLCBmbik7XG4gICAgICAgIHJlcS5vbihcImVycm9yXCIsICh4aHJTdGF0dXMsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvcihcInhociBwb3N0IGVycm9yXCIsIHhoclN0YXR1cywgY29udGV4dCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgYSBwb2xsIGN5Y2xlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkb1BvbGwoKSB7XG4gICAgICAgIGRlYnVnKFwieGhyIHBvbGxcIik7XG4gICAgICAgIGNvbnN0IHJlcSA9IHRoaXMucmVxdWVzdCgpO1xuICAgICAgICByZXEub24oXCJkYXRhXCIsIHRoaXMub25EYXRhLmJpbmQodGhpcykpO1xuICAgICAgICByZXEub24oXCJlcnJvclwiLCAoeGhyU3RhdHVzLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IoXCJ4aHIgcG9sbCBlcnJvclwiLCB4aHJTdGF0dXMsIGNvbnRleHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb2xsWGhyID0gcmVxO1xuICAgIH1cbn1cbmV4cG9ydHMuUG9sbGluZyA9IFBvbGxpbmc7XG5jbGFzcyBSZXF1ZXN0IGV4dGVuZHMgY29tcG9uZW50X2VtaXR0ZXJfMS5FbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGNvbnN0cnVjdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYWNrYWdlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJpLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgICgwLCB1dGlsX2pzXzEuaW5zdGFsbFRpbWVyRnVuY3Rpb25zKSh0aGlzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBvcHRzLm1ldGhvZCB8fCBcIkdFVFwiO1xuICAgICAgICB0aGlzLnVyaSA9IHVyaTtcbiAgICAgICAgdGhpcy5kYXRhID0gdW5kZWZpbmVkICE9PSBvcHRzLmRhdGEgPyBvcHRzLmRhdGEgOiBudWxsO1xuICAgICAgICB0aGlzLmNyZWF0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBYSFIgb2JqZWN0IGFuZCBzZW5kcyB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY3JlYXRlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG9wdHMgPSAoMCwgdXRpbF9qc18xLnBpY2spKHRoaXMub3B0cywgXCJhZ2VudFwiLCBcInBmeFwiLCBcImtleVwiLCBcInBhc3NwaHJhc2VcIiwgXCJjZXJ0XCIsIFwiY2FcIiwgXCJjaXBoZXJzXCIsIFwicmVqZWN0VW5hdXRob3JpemVkXCIsIFwiYXV0b1VucmVmXCIpO1xuICAgICAgICBvcHRzLnhkb21haW4gPSAhIXRoaXMub3B0cy54ZDtcbiAgICAgICAgY29uc3QgeGhyID0gKHRoaXMueGhyID0gbmV3IHhtbGh0dHByZXF1ZXN0X2pzXzEuWEhSKG9wdHMpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlYnVnKFwieGhyIG9wZW4gJXM6ICVzXCIsIHRoaXMubWV0aG9kLCB0aGlzLnVyaSk7XG4gICAgICAgICAgICB4aHIub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmksIHRydWUpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2V0RGlzYWJsZUhlYWRlckNoZWNrICYmIHhoci5zZXREaXNhYmxlSGVhZGVyQ2hlY2sodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5leHRyYUhlYWRlcnMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihpLCB0aGlzLm9wdHMuZXh0cmFIZWFkZXJzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgICAgIGlmIChcIlBPU1RcIiA9PT0gdGhpcy5tZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLCBcIiovKlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgICAgIChfYSA9IHRoaXMub3B0cy5jb29raWVKYXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hZGRDb29raWVzKHhocik7XG4gICAgICAgICAgICAvLyBpZTYgY2hlY2tcbiAgICAgICAgICAgIGlmIChcIndpdGhDcmVkZW50aWFsc1wiIGluIHhocikge1xuICAgICAgICAgICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLm9wdHMud2l0aENyZWRlbnRpYWxzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5yZXF1ZXN0VGltZW91dCkge1xuICAgICAgICAgICAgICAgIHhoci50aW1lb3V0ID0gdGhpcy5vcHRzLnJlcXVlc3RUaW1lb3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIChfYSA9IHRoaXMub3B0cy5jb29raWVKYXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXJzZUNvb2tpZXMoeGhyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKDQgIT09IHhoci5yZWFkeVN0YXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKDIwMCA9PT0geGhyLnN0YXR1cyB8fCAxMjIzID09PSB4aHIuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Mb2FkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGBlcnJvcmAgZXZlbnQgaGFuZGxlciB0aGF0J3MgdXNlci1zZXRcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3QgdGhyb3cgaW4gdGhlIHNhbWUgdGljayBhbmQgZ2V0cyBjYXVnaHQgaGVyZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IodHlwZW9mIHhoci5zdGF0dXMgPT09IFwibnVtYmVyXCIgPyB4aHIuc3RhdHVzIDogMCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkZWJ1ZyhcInhociBkYXRhICVzXCIsIHRoaXMuZGF0YSk7XG4gICAgICAgICAgICB4aHIuc2VuZCh0aGlzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBOZWVkIHRvIGRlZmVyIHNpbmNlIC5jcmVhdGUoKSBpcyBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgY29uc3RydWN0b3JcbiAgICAgICAgICAgIC8vIGFuZCB0aHVzIHRoZSAnZXJyb3InIGV2ZW50IGNhbiBvbmx5IGJlIG9ubHkgYm91bmQgKmFmdGVyKiB0aGlzIGV4Y2VwdGlvblxuICAgICAgICAgICAgLy8gb2NjdXJzLiAgVGhlcmVmb3JlLCBhbHNvLCB3ZSBjYW5ub3QgdGhyb3cgaGVyZSBhdCBhbGwuXG4gICAgICAgICAgICB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGUpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5pbmRleCA9IFJlcXVlc3QucmVxdWVzdHNDb3VudCsrO1xuICAgICAgICAgICAgUmVxdWVzdC5yZXF1ZXN0c1t0aGlzLmluZGV4XSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uRXJyb3IoZXJyKSB7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZXJyb3JcIiwgZXJyLCB0aGlzLnhocik7XG4gICAgICAgIHRoaXMuY2xlYW51cCh0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIGhvdXNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjbGVhbnVwKGZyb21FcnJvcikge1xuICAgICAgICBpZiAoXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIHRoaXMueGhyIHx8IG51bGwgPT09IHRoaXMueGhyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZW1wdHk7XG4gICAgICAgIGlmIChmcm9tRXJyb3IpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy54aHIuYWJvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBkZWxldGUgUmVxdWVzdC5yZXF1ZXN0c1t0aGlzLmluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnhociA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGxvYWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uTG9hZCgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMueGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgaWYgKGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZGF0YVwiLCBkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwic3VjY2Vzc1wiKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFib3J0cyB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYWNrYWdlXG4gICAgICovXG4gICAgYWJvcnQoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdCA9IFJlcXVlc3Q7XG5SZXF1ZXN0LnJlcXVlc3RzQ291bnQgPSAwO1xuUmVxdWVzdC5yZXF1ZXN0cyA9IHt9O1xuLyoqXG4gKiBBYm9ydHMgcGVuZGluZyByZXF1ZXN0cyB3aGVuIHVubG9hZGluZyB0aGUgd2luZG93LiBUaGlzIGlzIG5lZWRlZCB0byBwcmV2ZW50XG4gKiBtZW1vcnkgbGVha3MgKGUuZy4gd2hlbiB1c2luZyBJRSkgYW5kIHRvIGVuc3VyZSB0aGF0IG5vIHNwdXJpb3VzIGVycm9yIGlzXG4gKiBlbWl0dGVkLlxuICovXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgYXR0YWNoRXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGF0dGFjaEV2ZW50KFwib251bmxvYWRcIiwgdW5sb2FkSGFuZGxlcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBhZGRFdmVudExpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgdGVybWluYXRpb25FdmVudCA9IFwib25wYWdlaGlkZVwiIGluIGdsb2JhbFRoaXNfanNfMS5nbG9iYWxUaGlzU2hpbSA/IFwicGFnZWhpZGVcIiA6IFwidW5sb2FkXCI7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIodGVybWluYXRpb25FdmVudCwgdW5sb2FkSGFuZGxlciwgZmFsc2UpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVubG9hZEhhbmRsZXIoKSB7XG4gICAgZm9yIChsZXQgaSBpbiBSZXF1ZXN0LnJlcXVlc3RzKSB7XG4gICAgICAgIGlmIChSZXF1ZXN0LnJlcXVlc3RzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICBSZXF1ZXN0LnJlcXVlc3RzW2ldLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdEJpbmFyeVR5cGUgPSBleHBvcnRzLnVzaW5nQnJvd3NlcldlYlNvY2tldCA9IGV4cG9ydHMuV2ViU29ja2V0ID0gZXhwb3J0cy5uZXh0VGljayA9IHZvaWQgMDtcbmNvbnN0IGdsb2JhbFRoaXNfanNfMSA9IHJlcXVpcmUoXCIuLi9nbG9iYWxUaGlzLmpzXCIpO1xuZXhwb3J0cy5uZXh0VGljayA9ICgoKSA9PiB7XG4gICAgY29uc3QgaXNQcm9taXNlQXZhaWxhYmxlID0gdHlwZW9mIFByb21pc2UgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgUHJvbWlzZS5yZXNvbHZlID09PSBcImZ1bmN0aW9uXCI7XG4gICAgaWYgKGlzUHJvbWlzZUF2YWlsYWJsZSkge1xuICAgICAgICByZXR1cm4gKGNiKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGNiKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiAoY2IsIHNldFRpbWVvdXRGbikgPT4gc2V0VGltZW91dEZuKGNiLCAwKTtcbiAgICB9XG59KSgpO1xuZXhwb3J0cy5XZWJTb2NrZXQgPSBnbG9iYWxUaGlzX2pzXzEuZ2xvYmFsVGhpc1NoaW0uV2ViU29ja2V0IHx8IGdsb2JhbFRoaXNfanNfMS5nbG9iYWxUaGlzU2hpbS5Nb3pXZWJTb2NrZXQ7XG5leHBvcnRzLnVzaW5nQnJvd3NlcldlYlNvY2tldCA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHRCaW5hcnlUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldTID0gdm9pZCAwO1xuY29uc3QgdHJhbnNwb3J0X2pzXzEgPSByZXF1aXJlKFwiLi4vdHJhbnNwb3J0LmpzXCIpO1xuY29uc3QgeWVhc3RfanNfMSA9IHJlcXVpcmUoXCIuLi9jb250cmliL3llYXN0LmpzXCIpO1xuY29uc3QgdXRpbF9qc18xID0gcmVxdWlyZShcIi4uL3V0aWwuanNcIik7XG5jb25zdCB3ZWJzb2NrZXRfY29uc3RydWN0b3JfanNfMSA9IHJlcXVpcmUoXCIuL3dlYnNvY2tldC1jb25zdHJ1Y3Rvci5qc1wiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTsgLy8gZGVidWcoKVxuY29uc3QgZW5naW5lX2lvX3BhcnNlcl8xID0gcmVxdWlyZShcImVuZ2luZS5pby1wYXJzZXJcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKFwiZW5naW5lLmlvLWNsaWVudDp3ZWJzb2NrZXRcIik7IC8vIGRlYnVnKClcbi8vIGRldGVjdCBSZWFjdE5hdGl2ZSBlbnZpcm9ubWVudFxuY29uc3QgaXNSZWFjdE5hdGl2ZSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2YgbmF2aWdhdG9yLnByb2R1Y3QgPT09IFwic3RyaW5nXCIgJiZcbiAgICBuYXZpZ2F0b3IucHJvZHVjdC50b0xvd2VyQ2FzZSgpID09PSBcInJlYWN0bmF0aXZlXCI7XG5jbGFzcyBXUyBleHRlbmRzIHRyYW5zcG9ydF9qc18xLlRyYW5zcG9ydCB7XG4gICAgLyoqXG4gICAgICogV2ViU29ja2V0IHRyYW5zcG9ydCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gY29ubmVjdGlvbiBvcHRpb25zXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSAhb3B0cy5mb3JjZUJhc2U2NDtcbiAgICB9XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBcIndlYnNvY2tldFwiO1xuICAgIH1cbiAgICBkb09wZW4oKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGVjaygpKSB7XG4gICAgICAgICAgICAvLyBsZXQgcHJvYmUgdGltZW91dFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IHRoaXMudXJpKCk7XG4gICAgICAgIGNvbnN0IHByb3RvY29scyA9IHRoaXMub3B0cy5wcm90b2NvbHM7XG4gICAgICAgIC8vIFJlYWN0IE5hdGl2ZSBvbmx5IHN1cHBvcnRzIHRoZSAnaGVhZGVycycgb3B0aW9uLCBhbmQgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgYW55dGhpbmcgZWxzZSBpcyBwYXNzZWRcbiAgICAgICAgY29uc3Qgb3B0cyA9IGlzUmVhY3ROYXRpdmVcbiAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgIDogKDAsIHV0aWxfanNfMS5waWNrKSh0aGlzLm9wdHMsIFwiYWdlbnRcIiwgXCJwZXJNZXNzYWdlRGVmbGF0ZVwiLCBcInBmeFwiLCBcImtleVwiLCBcInBhc3NwaHJhc2VcIiwgXCJjZXJ0XCIsIFwiY2FcIiwgXCJjaXBoZXJzXCIsIFwicmVqZWN0VW5hdXRob3JpemVkXCIsIFwibG9jYWxBZGRyZXNzXCIsIFwicHJvdG9jb2xWZXJzaW9uXCIsIFwib3JpZ2luXCIsIFwibWF4UGF5bG9hZFwiLCBcImZhbWlseVwiLCBcImNoZWNrU2VydmVySWRlbnRpdHlcIik7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZXh0cmFIZWFkZXJzKSB7XG4gICAgICAgICAgICBvcHRzLmhlYWRlcnMgPSB0aGlzLm9wdHMuZXh0cmFIZWFkZXJzO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLndzID1cbiAgICAgICAgICAgICAgICB3ZWJzb2NrZXRfY29uc3RydWN0b3JfanNfMS51c2luZ0Jyb3dzZXJXZWJTb2NrZXQgJiYgIWlzUmVhY3ROYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBwcm90b2NvbHNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLldlYlNvY2tldCh1cmksIHByb3RvY29scylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLldlYlNvY2tldCh1cmkpXG4gICAgICAgICAgICAgICAgICAgIDogbmV3IHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLldlYlNvY2tldCh1cmksIHByb3RvY29scywgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdFJlc2VydmVkKFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndzLmJpbmFyeVR5cGUgPSB0aGlzLnNvY2tldC5iaW5hcnlUeXBlO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBzb2NrZXRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICAgIHRoaXMud3Mub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5hdXRvVW5yZWYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndzLl9zb2NrZXQudW5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25PcGVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud3Mub25jbG9zZSA9IChjbG9zZUV2ZW50KSA9PiB0aGlzLm9uQ2xvc2Uoe1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwid2Vic29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBjbG9zZUV2ZW50LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy53cy5vbm1lc3NhZ2UgPSAoZXYpID0+IHRoaXMub25EYXRhKGV2LmRhdGEpO1xuICAgICAgICB0aGlzLndzLm9uZXJyb3IgPSAoZSkgPT4gdGhpcy5vbkVycm9yKFwid2Vic29ja2V0IGVycm9yXCIsIGUpO1xuICAgIH1cbiAgICB3cml0ZShwYWNrZXRzKSB7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgICAgLy8gZW5jb2RlUGFja2V0IGVmZmljaWVudCBhcyBpdCB1c2VzIFdTIGZyYW1pbmdcbiAgICAgICAgLy8gbm8gbmVlZCBmb3IgZW5jb2RlUGF5bG9hZFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhY2tldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhY2tldCA9IHBhY2tldHNbaV07XG4gICAgICAgICAgICBjb25zdCBsYXN0UGFja2V0ID0gaSA9PT0gcGFja2V0cy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgKDAsIGVuZ2luZV9pb19wYXJzZXJfMS5lbmNvZGVQYWNrZXQpKHBhY2tldCwgdGhpcy5zdXBwb3J0c0JpbmFyeSwgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBhbHdheXMgY3JlYXRlIGEgbmV3IG9iamVjdCAoR0gtNDM3KVxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdHMgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoIXdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLnVzaW5nQnJvd3NlcldlYlNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFja2V0Lm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuY29tcHJlc3MgPSBwYWNrZXQub3B0aW9ucy5jb21wcmVzcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLnBlck1lc3NhZ2VEZWZsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW4gPSBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBkYXRhID8gQnVmZmVyLmJ5dGVMZW5ndGgoZGF0YSkgOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPCB0aGlzLm9wdHMucGVyTWVzc2FnZURlZmxhdGUudGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5jb21wcmVzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB0aGUgd2Vic29ja2V0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIGJ1dCB0aGUgYnJvd3NlciBkaWRuJ3RcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGEgY2hhbmNlIG9mIGluZm9ybWluZyB1cyBhYm91dCBpdCB5ZXQsIGluIHRoYXQgY2FzZSBzZW5kIHdpbGxcbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3ZWJzb2NrZXRfY29uc3RydWN0b3JfanNfMS51c2luZ0Jyb3dzZXJXZWJTb2NrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVFcnJvciBpcyB0aHJvd24gd2hlbiBwYXNzaW5nIHRoZSBzZWNvbmQgYXJndW1lbnQgb24gU2FmYXJpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndzLnNlbmQoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndzLnNlbmQoZGF0YSwgb3B0cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoXCJ3ZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSBvbmNsb3NlIGV2ZW50XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmYWtlIGRyYWluXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlZmVyIHRvIG5leHQgdGljayB0byBhbGxvdyBTb2NrZXQgdG8gY2xlYXIgd3JpdGVCdWZmZXJcbiAgICAgICAgICAgICAgICAgICAgKDAsIHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLm5leHRUaWNrKSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2V0VGltZW91dEZuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMud3MgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMud3MuY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMud3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB1cmkgZm9yIGNvbm5lY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHVyaSgpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5vcHRzLnNlY3VyZSA/IFwid3NzXCIgOiBcIndzXCI7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeSB8fCB7fTtcbiAgICAgICAgLy8gYXBwZW5kIHRpbWVzdGFtcCB0byBVUklcbiAgICAgICAgaWYgKHRoaXMub3B0cy50aW1lc3RhbXBSZXF1ZXN0cykge1xuICAgICAgICAgICAgcXVlcnlbdGhpcy5vcHRzLnRpbWVzdGFtcFBhcmFtXSA9ICgwLCB5ZWFzdF9qc18xLnllYXN0KSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbW11bmljYXRlIGJpbmFyeSBzdXBwb3J0IGNhcGFiaWxpdGllc1xuICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHNCaW5hcnkpIHtcbiAgICAgICAgICAgIHF1ZXJ5LmI2NCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVXJpKHNjaGVtYSwgcXVlcnkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZWF0dXJlIGRldGVjdGlvbiBmb3IgV2ViU29ja2V0LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBhdmFpbGFibGUuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjaGVjaygpIHtcbiAgICAgICAgcmV0dXJuICEhd2Vic29ja2V0X2NvbnN0cnVjdG9yX2pzXzEuV2ViU29ja2V0O1xuICAgIH1cbn1cbmV4cG9ydHMuV1MgPSBXUztcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5XVCA9IHZvaWQgMDtcbmNvbnN0IHRyYW5zcG9ydF9qc18xID0gcmVxdWlyZShcIi4uL3RyYW5zcG9ydC5qc1wiKTtcbmNvbnN0IHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xID0gcmVxdWlyZShcIi4vd2Vic29ja2V0LWNvbnN0cnVjdG9yLmpzXCIpO1xuY29uc3QgZW5naW5lX2lvX3BhcnNlcl8xID0gcmVxdWlyZShcImVuZ2luZS5pby1wYXJzZXJcIik7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7IC8vIGRlYnVnKClcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoXCJlbmdpbmUuaW8tY2xpZW50OndlYnRyYW5zcG9ydFwiKTsgLy8gZGVidWcoKVxuY2xhc3MgV1QgZXh0ZW5kcyB0cmFuc3BvcnRfanNfMS5UcmFuc3BvcnQge1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gXCJ3ZWJ0cmFuc3BvcnRcIjtcbiAgICB9XG4gICAgZG9PcGVuKCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0eXBlb2YgV2ViVHJhbnNwb3J0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMudHJhbnNwb3J0ID0gbmV3IFdlYlRyYW5zcG9ydCh0aGlzLmNyZWF0ZVVyaShcImh0dHBzXCIpLCB0aGlzLm9wdHMudHJhbnNwb3J0T3B0aW9uc1t0aGlzLm5hbWVdKTtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQuY2xvc2VkXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkZWJ1ZyhcInRyYW5zcG9ydCBjbG9zZWQgZ3JhY2VmdWxseVwiKTtcbiAgICAgICAgICAgIHRoaXMub25DbG9zZSgpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGRlYnVnKFwidHJhbnNwb3J0IGNsb3NlZCBkdWUgdG8gJXNcIiwgZXJyKTtcbiAgICAgICAgICAgIHRoaXMub25FcnJvcihcIndlYnRyYW5zcG9ydCBlcnJvclwiLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gbm90ZTogd2UgY291bGQgaGF2ZSB1c2VkIGFzeW5jL2F3YWl0LCBidXQgdGhhdCB3b3VsZCByZXF1aXJlIHNvbWUgYWRkaXRpb25hbCBwb2x5ZmlsbHNcbiAgICAgICAgdGhpcy50cmFuc3BvcnQucmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5jcmVhdGVCaWRpcmVjdGlvbmFsU3RyZWFtKCkudGhlbigoc3RyZWFtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVjb2RlclN0cmVhbSA9ICgwLCBlbmdpbmVfaW9fcGFyc2VyXzEuY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbSkoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIHRoaXMuc29ja2V0LmJpbmFyeVR5cGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5yZWFkYWJsZS5waXBlVGhyb3VnaChkZWNvZGVyU3RyZWFtKS5nZXRSZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVyU3RyZWFtID0gKDAsIGVuZ2luZV9pb19wYXJzZXJfMS5jcmVhdGVQYWNrZXRFbmNvZGVyU3RyZWFtKSgpO1xuICAgICAgICAgICAgICAgIGVuY29kZXJTdHJlYW0ucmVhZGFibGUucGlwZVRvKHN0cmVhbS53cml0YWJsZSk7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZXIgPSBlbmNvZGVyU3RyZWFtLndyaXRhYmxlLmdldFdyaXRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHsgZG9uZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhcInNlc3Npb24gaXMgY2xvc2VkXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKFwicmVjZWl2ZWQgY2h1bms6ICVvXCIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QYWNrZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKFwiYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZzogJXNcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZWFkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFja2V0ID0geyB0eXBlOiBcIm9wZW5cIiB9O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5LnNpZCkge1xuICAgICAgICAgICAgICAgICAgICBwYWNrZXQuZGF0YSA9IGB7XCJzaWRcIjpcIiR7dGhpcy5xdWVyeS5zaWR9XCJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZXIud3JpdGUocGFja2V0KS50aGVuKCgpID0+IHRoaXMub25PcGVuKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3cml0ZShwYWNrZXRzKSB7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWNrZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYWNrZXQgPSBwYWNrZXRzW2ldO1xuICAgICAgICAgICAgY29uc3QgbGFzdFBhY2tldCA9IGkgPT09IHBhY2tldHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVyLndyaXRlKHBhY2tldCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RQYWNrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLm5leHRUaWNrKSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2V0VGltZW91dEZuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMudHJhbnNwb3J0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xvc2UoKTtcbiAgICB9XG59XG5leHBvcnRzLldUID0gV1Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIGJyb3dzZXIgc2hpbSBmb3IgeG1saHR0cHJlcXVlc3QgbW9kdWxlXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUNvb2tpZUphciA9IGV4cG9ydHMuWEhSID0gdm9pZCAwO1xuY29uc3QgaGFzX2NvcnNfanNfMSA9IHJlcXVpcmUoXCIuLi9jb250cmliL2hhcy1jb3JzLmpzXCIpO1xuY29uc3QgZ2xvYmFsVGhpc19qc18xID0gcmVxdWlyZShcIi4uL2dsb2JhbFRoaXMuanNcIik7XG5mdW5jdGlvbiBYSFIob3B0cykge1xuICAgIGNvbnN0IHhkb21haW4gPSBvcHRzLnhkb21haW47XG4gICAgLy8gWE1MSHR0cFJlcXVlc3QgY2FuIGJlIGRpc2FibGVkIG9uIElFXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAmJiAoIXhkb21haW4gfHwgaGFzX2NvcnNfanNfMS5oYXNDT1JTKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7IH1cbiAgICBpZiAoIXhkb21haW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgZ2xvYmFsVGhpc19qc18xLmdsb2JhbFRoaXNTaGltW1tcIkFjdGl2ZVwiXS5jb25jYXQoXCJPYmplY3RcIikuam9pbihcIlhcIildKFwiTWljcm9zb2Z0LlhNTEhUVFBcIik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgIH1cbn1cbmV4cG9ydHMuWEhSID0gWEhSO1xuZnVuY3Rpb24gY3JlYXRlQ29va2llSmFyKCkgeyB9XG5leHBvcnRzLmNyZWF0ZUNvb2tpZUphciA9IGNyZWF0ZUNvb2tpZUphcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5ieXRlTGVuZ3RoID0gZXhwb3J0cy5pbnN0YWxsVGltZXJGdW5jdGlvbnMgPSBleHBvcnRzLnBpY2sgPSB2b2lkIDA7XG5jb25zdCBnbG9iYWxUaGlzX2pzXzEgPSByZXF1aXJlKFwiLi9nbG9iYWxUaGlzLmpzXCIpO1xuZnVuY3Rpb24gcGljayhvYmosIC4uLmF0dHIpIHtcbiAgICByZXR1cm4gYXR0ci5yZWR1Y2UoKGFjYywgaykgPT4ge1xuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICBhY2Nba10gPSBvYmpba107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5leHBvcnRzLnBpY2sgPSBwaWNrO1xuLy8gS2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgcmVhbCB0aW1lb3V0IGZ1bmN0aW9ucyBzbyB0aGV5IGNhbiBiZSB1c2VkIHdoZW4gb3ZlcnJpZGRlblxuY29uc3QgTkFUSVZFX1NFVF9USU1FT1VUID0gZ2xvYmFsVGhpc19qc18xLmdsb2JhbFRoaXNTaGltLnNldFRpbWVvdXQ7XG5jb25zdCBOQVRJVkVfQ0xFQVJfVElNRU9VVCA9IGdsb2JhbFRoaXNfanNfMS5nbG9iYWxUaGlzU2hpbS5jbGVhclRpbWVvdXQ7XG5mdW5jdGlvbiBpbnN0YWxsVGltZXJGdW5jdGlvbnMob2JqLCBvcHRzKSB7XG4gICAgaWYgKG9wdHMudXNlTmF0aXZlVGltZXJzKSB7XG4gICAgICAgIG9iai5zZXRUaW1lb3V0Rm4gPSBOQVRJVkVfU0VUX1RJTUVPVVQuYmluZChnbG9iYWxUaGlzX2pzXzEuZ2xvYmFsVGhpc1NoaW0pO1xuICAgICAgICBvYmouY2xlYXJUaW1lb3V0Rm4gPSBOQVRJVkVfQ0xFQVJfVElNRU9VVC5iaW5kKGdsb2JhbFRoaXNfanNfMS5nbG9iYWxUaGlzU2hpbSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvYmouc2V0VGltZW91dEZuID0gZ2xvYmFsVGhpc19qc18xLmdsb2JhbFRoaXNTaGltLnNldFRpbWVvdXQuYmluZChnbG9iYWxUaGlzX2pzXzEuZ2xvYmFsVGhpc1NoaW0pO1xuICAgICAgICBvYmouY2xlYXJUaW1lb3V0Rm4gPSBnbG9iYWxUaGlzX2pzXzEuZ2xvYmFsVGhpc1NoaW0uY2xlYXJUaW1lb3V0LmJpbmQoZ2xvYmFsVGhpc19qc18xLmdsb2JhbFRoaXNTaGltKTtcbiAgICB9XG59XG5leHBvcnRzLmluc3RhbGxUaW1lckZ1bmN0aW9ucyA9IGluc3RhbGxUaW1lckZ1bmN0aW9ucztcbi8vIGJhc2U2NCBlbmNvZGVkIGJ1ZmZlcnMgYXJlIGFib3V0IDMzJSBiaWdnZXIgKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NClcbmNvbnN0IEJBU0U2NF9PVkVSSEVBRCA9IDEuMzM7XG4vLyB3ZSBjb3VsZCBhbHNvIGhhdmUgdXNlZCBgbmV3IEJsb2IoW29ial0pLnNpemVgLCBidXQgaXQgaXNuJ3Qgc3VwcG9ydGVkIGluIElFOVxuZnVuY3Rpb24gYnl0ZUxlbmd0aChvYmopIHtcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gdXRmOExlbmd0aChvYmopO1xuICAgIH1cbiAgICAvLyBhcnJheWJ1ZmZlciBvciBibG9iXG4gICAgcmV0dXJuIE1hdGguY2VpbCgob2JqLmJ5dGVMZW5ndGggfHwgb2JqLnNpemUpICogQkFTRTY0X09WRVJIRUFEKTtcbn1cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7XG5mdW5jdGlvbiB1dGY4TGVuZ3RoKHN0cikge1xuICAgIGxldCBjID0gMCwgbGVuZ3RoID0gMDtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHN0ci5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgIGxlbmd0aCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgbGVuZ3RoICs9IDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4ZDgwMCB8fCBjID49IDB4ZTAwMCkge1xuICAgICAgICAgICAgbGVuZ3RoICs9IDM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBsZW5ndGggKz0gNDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGVuZ3RoO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkVSUk9SX1BBQ0tFVCA9IGV4cG9ydHMuUEFDS0VUX1RZUEVTX1JFVkVSU0UgPSBleHBvcnRzLlBBQ0tFVF9UWVBFUyA9IHZvaWQgMDtcbmNvbnN0IFBBQ0tFVF9UWVBFUyA9IE9iamVjdC5jcmVhdGUobnVsbCk7IC8vIG5vIE1hcCA9IG5vIHBvbHlmaWxsXG5leHBvcnRzLlBBQ0tFVF9UWVBFUyA9IFBBQ0tFVF9UWVBFUztcblBBQ0tFVF9UWVBFU1tcIm9wZW5cIl0gPSBcIjBcIjtcblBBQ0tFVF9UWVBFU1tcImNsb3NlXCJdID0gXCIxXCI7XG5QQUNLRVRfVFlQRVNbXCJwaW5nXCJdID0gXCIyXCI7XG5QQUNLRVRfVFlQRVNbXCJwb25nXCJdID0gXCIzXCI7XG5QQUNLRVRfVFlQRVNbXCJtZXNzYWdlXCJdID0gXCI0XCI7XG5QQUNLRVRfVFlQRVNbXCJ1cGdyYWRlXCJdID0gXCI1XCI7XG5QQUNLRVRfVFlQRVNbXCJub29wXCJdID0gXCI2XCI7XG5jb25zdCBQQUNLRVRfVFlQRVNfUkVWRVJTRSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnRzLlBBQ0tFVF9UWVBFU19SRVZFUlNFID0gUEFDS0VUX1RZUEVTX1JFVkVSU0U7XG5PYmplY3Qua2V5cyhQQUNLRVRfVFlQRVMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIFBBQ0tFVF9UWVBFU19SRVZFUlNFW1BBQ0tFVF9UWVBFU1trZXldXSA9IGtleTtcbn0pO1xuY29uc3QgRVJST1JfUEFDS0VUID0geyB0eXBlOiBcImVycm9yXCIsIGRhdGE6IFwicGFyc2VyIGVycm9yXCIgfTtcbmV4cG9ydHMuRVJST1JfUEFDS0VUID0gRVJST1JfUEFDS0VUO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMuZW5jb2RlID0gdm9pZCAwO1xuLy8gaW1wb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc29ja2V0aW8vYmFzZTY0LWFycmF5YnVmZmVyXG5jb25zdCBjaGFycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcbi8vIFVzZSBhIGxvb2t1cCB0YWJsZSB0byBmaW5kIHRoZSBpbmRleC5cbmNvbnN0IGxvb2t1cCA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IFtdIDogbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpO1xufVxuY29uc3QgZW5jb2RlID0gKGFycmF5YnVmZmVyKSA9PiB7XG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107XG4gICAgfVxuICAgIGlmIChsZW4gJSAzID09PSAyKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nO1xuICAgIH1cbiAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JztcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U2NDtcbn07XG5leHBvcnRzLmVuY29kZSA9IGVuY29kZTtcbmNvbnN0IGRlY29kZSA9IChiYXNlNjQpID0+IHtcbiAgICBsZXQgYnVmZmVyTGVuZ3RoID0gYmFzZTY0Lmxlbmd0aCAqIDAuNzUsIGxlbiA9IGJhc2U2NC5sZW5ndGgsIGksIHAgPSAwLCBlbmNvZGVkMSwgZW5jb2RlZDIsIGVuY29kZWQzLCBlbmNvZGVkNDtcbiAgICBpZiAoYmFzZTY0W2Jhc2U2NC5sZW5ndGggLSAxXSA9PT0gJz0nKSB7XG4gICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICBpZiAoYmFzZTY0W2Jhc2U2NC5sZW5ndGggLSAyXSA9PT0gJz0nKSB7XG4gICAgICAgICAgICBidWZmZXJMZW5ndGgtLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhcnJheWJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXJMZW5ndGgpLCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICAgICAgZW5jb2RlZDEgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSldO1xuICAgICAgICBlbmNvZGVkMiA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMSldO1xuICAgICAgICBlbmNvZGVkMyA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMildO1xuICAgICAgICBlbmNvZGVkNCA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMyldO1xuICAgICAgICBieXRlc1twKytdID0gKGVuY29kZWQxIDw8IDIpIHwgKGVuY29kZWQyID4+IDQpO1xuICAgICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMiAmIDE1KSA8PCA0KSB8IChlbmNvZGVkMyA+PiAyKTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9ICgoZW5jb2RlZDMgJiAzKSA8PCA2KSB8IChlbmNvZGVkNCAmIDYzKTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5YnVmZmVyO1xufTtcbmV4cG9ydHMuZGVjb2RlID0gZGVjb2RlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlY29kZVBhY2tldCA9IHZvaWQgMDtcbmNvbnN0IGNvbW1vbnNfanNfMSA9IHJlcXVpcmUoXCIuL2NvbW1vbnMuanNcIik7XG5jb25zdCBiYXNlNjRfYXJyYXlidWZmZXJfanNfMSA9IHJlcXVpcmUoXCIuL2NvbnRyaWIvYmFzZTY0LWFycmF5YnVmZmVyLmpzXCIpO1xuY29uc3Qgd2l0aE5hdGl2ZUFycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyID09PSBcImZ1bmN0aW9uXCI7XG5jb25zdCBkZWNvZGVQYWNrZXQgPSAoZW5jb2RlZFBhY2tldCwgYmluYXJ5VHlwZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgZW5jb2RlZFBhY2tldCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICBkYXRhOiBtYXBCaW5hcnkoZW5jb2RlZFBhY2tldCwgYmluYXJ5VHlwZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBlbmNvZGVkUGFja2V0LmNoYXJBdCgwKTtcbiAgICBpZiAodHlwZSA9PT0gXCJiXCIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgZGF0YTogZGVjb2RlQmFzZTY0UGFja2V0KGVuY29kZWRQYWNrZXQuc3Vic3RyaW5nKDEpLCBiaW5hcnlUeXBlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcGFja2V0VHlwZSA9IGNvbW1vbnNfanNfMS5QQUNLRVRfVFlQRVNfUkVWRVJTRVt0eXBlXTtcbiAgICBpZiAoIXBhY2tldFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbW1vbnNfanNfMS5FUlJPUl9QQUNLRVQ7XG4gICAgfVxuICAgIHJldHVybiBlbmNvZGVkUGFja2V0Lmxlbmd0aCA+IDFcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eXBlOiBjb21tb25zX2pzXzEuUEFDS0VUX1RZUEVTX1JFVkVSU0VbdHlwZV0sXG4gICAgICAgICAgICBkYXRhOiBlbmNvZGVkUGFja2V0LnN1YnN0cmluZygxKSxcbiAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHR5cGU6IGNvbW1vbnNfanNfMS5QQUNLRVRfVFlQRVNfUkVWRVJTRVt0eXBlXSxcbiAgICAgICAgfTtcbn07XG5leHBvcnRzLmRlY29kZVBhY2tldCA9IGRlY29kZVBhY2tldDtcbmNvbnN0IGRlY29kZUJhc2U2NFBhY2tldCA9IChkYXRhLCBiaW5hcnlUeXBlKSA9PiB7XG4gICAgaWYgKHdpdGhOYXRpdmVBcnJheUJ1ZmZlcikge1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gKDAsIGJhc2U2NF9hcnJheWJ1ZmZlcl9qc18xLmRlY29kZSkoZGF0YSk7XG4gICAgICAgIHJldHVybiBtYXBCaW5hcnkoZGVjb2RlZCwgYmluYXJ5VHlwZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4geyBiYXNlNjQ6IHRydWUsIGRhdGEgfTsgLy8gZmFsbGJhY2sgZm9yIG9sZCBicm93c2Vyc1xuICAgIH1cbn07XG5jb25zdCBtYXBCaW5hcnkgPSAoZGF0YSwgYmluYXJ5VHlwZSkgPT4ge1xuICAgIHN3aXRjaCAoYmluYXJ5VHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiOlxuICAgICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgICAgICAgICAgLy8gZnJvbSBXZWJTb2NrZXQgKyBiaW5hcnlUeXBlIFwiYmxvYlwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIEhUVFAgbG9uZy1wb2xsaW5nIG9yIFdlYlRyYW5zcG9ydFxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmxvYihbZGF0YV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYXJyYXlidWZmZXJcIjpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIEhUVFAgbG9uZy1wb2xsaW5nIChiYXNlNjQpIG9yIFdlYlNvY2tldCArIGJpbmFyeVR5cGUgXCJhcnJheWJ1ZmZlclwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIFdlYlRyYW5zcG9ydCAoVWludDhBcnJheSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgfVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5lbmNvZGVQYWNrZXQgPSBleHBvcnRzLmVuY29kZVBhY2tldFRvQmluYXJ5ID0gdm9pZCAwO1xuY29uc3QgY29tbW9uc19qc18xID0gcmVxdWlyZShcIi4vY29tbW9ucy5qc1wiKTtcbmNvbnN0IHdpdGhOYXRpdmVCbG9iID0gdHlwZW9mIEJsb2IgPT09IFwiZnVuY3Rpb25cIiB8fFxuICAgICh0eXBlb2YgQmxvYiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoQmxvYikgPT09IFwiW29iamVjdCBCbG9iQ29uc3RydWN0b3JdXCIpO1xuY29uc3Qgd2l0aE5hdGl2ZUFycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyID09PSBcImZ1bmN0aW9uXCI7XG4vLyBBcnJheUJ1ZmZlci5pc1ZpZXcgbWV0aG9kIGlzIG5vdCBkZWZpbmVkIGluIElFMTBcbmNvbnN0IGlzVmlldyA9IChvYmopID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gQXJyYXlCdWZmZXIuaXNWaWV3KG9iailcbiAgICAgICAgOiBvYmogJiYgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyO1xufTtcbmNvbnN0IGVuY29kZVBhY2tldCA9ICh7IHR5cGUsIGRhdGEgfSwgc3VwcG9ydHNCaW5hcnksIGNhbGxiYWNrKSA9PiB7XG4gICAgaWYgKHdpdGhOYXRpdmVCbG9iICYmIGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgIGlmIChzdXBwb3J0c0JpbmFyeSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZUJsb2JBc0Jhc2U2NChkYXRhLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAod2l0aE5hdGl2ZUFycmF5QnVmZmVyICYmXG4gICAgICAgIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgaXNWaWV3KGRhdGEpKSkge1xuICAgICAgICBpZiAoc3VwcG9ydHNCaW5hcnkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVCbG9iQXNCYXNlNjQobmV3IEJsb2IoW2RhdGFdKSwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHBsYWluIHN0cmluZ1xuICAgIHJldHVybiBjYWxsYmFjayhjb21tb25zX2pzXzEuUEFDS0VUX1RZUEVTW3R5cGVdICsgKGRhdGEgfHwgXCJcIikpO1xufTtcbmV4cG9ydHMuZW5jb2RlUGFja2V0ID0gZW5jb2RlUGFja2V0O1xuY29uc3QgZW5jb2RlQmxvYkFzQmFzZTY0ID0gKGRhdGEsIGNhbGxiYWNrKSA9PiB7XG4gICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgZmlsZVJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmaWxlUmVhZGVyLnJlc3VsdC5zcGxpdChcIixcIilbMV07XG4gICAgICAgIGNhbGxiYWNrKFwiYlwiICsgKGNvbnRlbnQgfHwgXCJcIikpO1xuICAgIH07XG4gICAgcmV0dXJuIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChkYXRhKTtcbn07XG5mdW5jdGlvbiB0b0FycmF5KGRhdGEpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKTtcbiAgICB9XG59XG5sZXQgVEVYVF9FTkNPREVSO1xuZnVuY3Rpb24gZW5jb2RlUGFja2V0VG9CaW5hcnkocGFja2V0LCBjYWxsYmFjaykge1xuICAgIGlmICh3aXRoTmF0aXZlQmxvYiAmJiBwYWNrZXQuZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgcmV0dXJuIHBhY2tldC5kYXRhLmFycmF5QnVmZmVyKCkudGhlbih0b0FycmF5KS50aGVuKGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2l0aE5hdGl2ZUFycmF5QnVmZmVyICYmXG4gICAgICAgIChwYWNrZXQuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IGlzVmlldyhwYWNrZXQuZGF0YSkpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh0b0FycmF5KHBhY2tldC5kYXRhKSk7XG4gICAgfVxuICAgIGVuY29kZVBhY2tldChwYWNrZXQsIGZhbHNlLCAoZW5jb2RlZCkgPT4ge1xuICAgICAgICBpZiAoIVRFWFRfRU5DT0RFUikge1xuICAgICAgICAgICAgVEVYVF9FTkNPREVSID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soVEVYVF9FTkNPREVSLmVuY29kZShlbmNvZGVkKSk7XG4gICAgfSk7XG59XG5leHBvcnRzLmVuY29kZVBhY2tldFRvQmluYXJ5ID0gZW5jb2RlUGFja2V0VG9CaW5hcnk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVjb2RlUGF5bG9hZCA9IGV4cG9ydHMuZGVjb2RlUGFja2V0ID0gZXhwb3J0cy5lbmNvZGVQYXlsb2FkID0gZXhwb3J0cy5lbmNvZGVQYWNrZXQgPSBleHBvcnRzLnByb3RvY29sID0gZXhwb3J0cy5jcmVhdGVQYWNrZXREZWNvZGVyU3RyZWFtID0gZXhwb3J0cy5jcmVhdGVQYWNrZXRFbmNvZGVyU3RyZWFtID0gdm9pZCAwO1xuY29uc3QgZW5jb2RlUGFja2V0X2pzXzEgPSByZXF1aXJlKFwiLi9lbmNvZGVQYWNrZXQuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJlbmNvZGVQYWNrZXRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVuY29kZVBhY2tldF9qc18xLmVuY29kZVBhY2tldDsgfSB9KTtcbmNvbnN0IGRlY29kZVBhY2tldF9qc18xID0gcmVxdWlyZShcIi4vZGVjb2RlUGFja2V0LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVjb2RlUGFja2V0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkZWNvZGVQYWNrZXRfanNfMS5kZWNvZGVQYWNrZXQ7IH0gfSk7XG5jb25zdCBjb21tb25zX2pzXzEgPSByZXF1aXJlKFwiLi9jb21tb25zLmpzXCIpO1xuY29uc3QgU0VQQVJBVE9SID0gU3RyaW5nLmZyb21DaGFyQ29kZSgzMCk7IC8vIHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZWxpbWl0ZXIjQVNDSUlfZGVsaW1pdGVkX3RleHRcbmNvbnN0IGVuY29kZVBheWxvYWQgPSAocGFja2V0cywgY2FsbGJhY2spID0+IHtcbiAgICAvLyBzb21lIHBhY2tldHMgbWF5IGJlIGFkZGVkIHRvIHRoZSBhcnJheSB3aGlsZSBlbmNvZGluZywgc28gdGhlIGluaXRpYWwgbGVuZ3RoIG11c3QgYmUgc2F2ZWRcbiAgICBjb25zdCBsZW5ndGggPSBwYWNrZXRzLmxlbmd0aDtcbiAgICBjb25zdCBlbmNvZGVkUGFja2V0cyA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgcGFja2V0cy5mb3JFYWNoKChwYWNrZXQsIGkpID0+IHtcbiAgICAgICAgLy8gZm9yY2UgYmFzZTY0IGVuY29kaW5nIGZvciBiaW5hcnkgcGFja2V0c1xuICAgICAgICAoMCwgZW5jb2RlUGFja2V0X2pzXzEuZW5jb2RlUGFja2V0KShwYWNrZXQsIGZhbHNlLCAoZW5jb2RlZFBhY2tldCkgPT4ge1xuICAgICAgICAgICAgZW5jb2RlZFBhY2tldHNbaV0gPSBlbmNvZGVkUGFja2V0O1xuICAgICAgICAgICAgaWYgKCsrY291bnQgPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVuY29kZWRQYWNrZXRzLmpvaW4oU0VQQVJBVE9SKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbmV4cG9ydHMuZW5jb2RlUGF5bG9hZCA9IGVuY29kZVBheWxvYWQ7XG5jb25zdCBkZWNvZGVQYXlsb2FkID0gKGVuY29kZWRQYXlsb2FkLCBiaW5hcnlUeXBlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RlZFBhY2tldHMgPSBlbmNvZGVkUGF5bG9hZC5zcGxpdChTRVBBUkFUT1IpO1xuICAgIGNvbnN0IHBhY2tldHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kZWRQYWNrZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWRQYWNrZXQgPSAoMCwgZGVjb2RlUGFja2V0X2pzXzEuZGVjb2RlUGFja2V0KShlbmNvZGVkUGFja2V0c1tpXSwgYmluYXJ5VHlwZSk7XG4gICAgICAgIHBhY2tldHMucHVzaChkZWNvZGVkUGFja2V0KTtcbiAgICAgICAgaWYgKGRlY29kZWRQYWNrZXQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFja2V0cztcbn07XG5leHBvcnRzLmRlY29kZVBheWxvYWQgPSBkZWNvZGVQYXlsb2FkO1xuZnVuY3Rpb24gY3JlYXRlUGFja2V0RW5jb2RlclN0cmVhbSgpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgICB0cmFuc2Zvcm0ocGFja2V0LCBjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAoMCwgZW5jb2RlUGFja2V0X2pzXzEuZW5jb2RlUGFja2V0VG9CaW5hcnkpKHBhY2tldCwgKGVuY29kZWRQYWNrZXQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkTGVuZ3RoID0gZW5jb2RlZFBhY2tldC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlcjtcbiAgICAgICAgICAgICAgICAvLyBpbnNwaXJlZCBieSB0aGUgV2ViU29ja2V0IGZvcm1hdDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYlNvY2tldHNfQVBJL1dyaXRpbmdfV2ViU29ja2V0X3NlcnZlcnMjZGVjb2RpbmdfcGF5bG9hZF9sZW5ndGhcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZExlbmd0aCA8IDEyNikge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgVWludDhBcnJheSgxKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGFWaWV3KGhlYWRlci5idWZmZXIpLnNldFVpbnQ4KDAsIHBheWxvYWRMZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoIDwgNjU1MzYpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDgoMCwgMTI2KTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MTYoMSwgcGF5bG9hZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgVWludDhBcnJheSg5KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhoZWFkZXIuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50OCgwLCAxMjcpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NCgxLCBCaWdJbnQocGF5bG9hZExlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmaXJzdCBiaXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgcGxhaW4gdGV4dCAoMCkgb3IgYmluYXJ5ICgxKVxuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuZGF0YSAmJiB0eXBlb2YgcGFja2V0LmRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzBdIHw9IDB4ODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShoZWFkZXIpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShlbmNvZGVkUGFja2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVQYWNrZXRFbmNvZGVyU3RyZWFtID0gY3JlYXRlUGFja2V0RW5jb2RlclN0cmVhbTtcbmxldCBURVhUX0RFQ09ERVI7XG5mdW5jdGlvbiB0b3RhbExlbmd0aChjaHVua3MpIHtcbiAgICByZXR1cm4gY2h1bmtzLnJlZHVjZSgoYWNjLCBjaHVuaykgPT4gYWNjICsgY2h1bmsubGVuZ3RoLCAwKTtcbn1cbmZ1bmN0aW9uIGNvbmNhdENodW5rcyhjaHVua3MsIHNpemUpIHtcbiAgICBpZiAoY2h1bmtzWzBdLmxlbmd0aCA9PT0gc2l6ZSkge1xuICAgICAgICByZXR1cm4gY2h1bmtzLnNoaWZ0KCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIGxldCBqID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBidWZmZXJbaV0gPSBjaHVua3NbMF1baisrXTtcbiAgICAgICAgaWYgKGogPT09IGNodW5rc1swXS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgaiA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNodW5rcy5sZW5ndGggJiYgaiA8IGNodW5rc1swXS5sZW5ndGgpIHtcbiAgICAgICAgY2h1bmtzWzBdID0gY2h1bmtzWzBdLnNsaWNlKGopO1xuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbShtYXhQYXlsb2FkLCBiaW5hcnlUeXBlKSB7XG4gICAgaWYgKCFURVhUX0RFQ09ERVIpIHtcbiAgICAgICAgVEVYVF9ERUNPREVSID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGxldCBzdGF0ZSA9IDAgLyogUkVBRF9IRUFERVIgKi87XG4gICAgbGV0IGV4cGVjdGVkTGVuZ3RoID0gLTE7XG4gICAgbGV0IGlzQmluYXJ5ID0gZmFsc2U7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMCAvKiBSRUFEX0hFQURFUiAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxMZW5ndGgoY2h1bmtzKSA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IGNvbmNhdENodW5rcyhjaHVua3MsIDEpO1xuICAgICAgICAgICAgICAgICAgICBpc0JpbmFyeSA9IChoZWFkZXJbMF0gJiAweDgwKSA9PT0gMHg4MDtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRMZW5ndGggPSBoZWFkZXJbMF0gJiAweDdmO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRMZW5ndGggPCAxMjYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMyAvKiBSRUFEX1BBWUxPQUQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwZWN0ZWRMZW5ndGggPT09IDEyNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAxIC8qIFJFQURfRVhURU5ERURfTEVOR1RIXzE2ICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyIC8qIFJFQURfRVhURU5ERURfTEVOR1RIXzY0ICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09PSAxIC8qIFJFQURfRVhURU5ERURfTEVOR1RIXzE2ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbExlbmd0aChjaHVua3MpIDwgMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyQXJyYXkgPSBjb25jYXRDaHVua3MoY2h1bmtzLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRMZW5ndGggPSBuZXcgRGF0YVZpZXcoaGVhZGVyQXJyYXkuYnVmZmVyLCBoZWFkZXJBcnJheS5ieXRlT2Zmc2V0LCBoZWFkZXJBcnJheS5sZW5ndGgpLmdldFVpbnQxNigwKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzIC8qIFJFQURfUEFZTE9BRCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09IDIgLyogUkVBRF9FWFRFTkRFRF9MRU5HVEhfNjQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsTGVuZ3RoKGNodW5rcykgPCA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJBcnJheSA9IGNvbmNhdENodW5rcyhjaHVua3MsIDgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGhlYWRlckFycmF5LmJ1ZmZlciwgaGVhZGVyQXJyYXkuYnl0ZU9mZnNldCwgaGVhZGVyQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHZpZXcuZ2V0VWludDMyKDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobiA+IE1hdGgucG93KDIsIDUzIC0gMzIpIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1heGltdW0gc2FmZSBpbnRlZ2VyIGluIEphdmFTY3JpcHQgaXMgMl41MyAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjb21tb25zX2pzXzEuRVJST1JfUEFDS0VUKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTGVuZ3RoID0gbiAqIE1hdGgucG93KDIsIDMyKSArIHZpZXcuZ2V0VWludDMyKDQpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDMgLyogUkVBRF9QQVlMT0FEICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsTGVuZ3RoKGNodW5rcykgPCBleHBlY3RlZExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGNvbmNhdENodW5rcyhjaHVua3MsIGV4cGVjdGVkTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKCgwLCBkZWNvZGVQYWNrZXRfanNfMS5kZWNvZGVQYWNrZXQpKGlzQmluYXJ5ID8gZGF0YSA6IFRFWFRfREVDT0RFUi5kZWNvZGUoZGF0YSksIGJpbmFyeVR5cGUpKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwIC8qIFJFQURfSEVBREVSICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRMZW5ndGggPT09IDAgfHwgZXhwZWN0ZWRMZW5ndGggPiBtYXhQYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjb21tb25zX2pzXzEuRVJST1JfUEFDS0VUKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVQYWNrZXREZWNvZGVyU3RyZWFtID0gY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbTtcbmV4cG9ydHMucHJvdG9jb2wgPSA0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKipcbiAqIEluaXRpYWxpemUgYmFja29mZiB0aW1lciB3aXRoIGBvcHRzYC5cbiAqXG4gKiAtIGBtaW5gIGluaXRpYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgWzEwMF1cbiAqIC0gYG1heGAgbWF4IHRpbWVvdXQgWzEwMDAwXVxuICogLSBgaml0dGVyYCBbMF1cbiAqIC0gYGZhY3RvcmAgWzJdXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqIEBhcGkgcHVibGljXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQmFja29mZiA9IHZvaWQgMDtcbmZ1bmN0aW9uIEJhY2tvZmYob3B0cykge1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIHRoaXMubXMgPSBvcHRzLm1pbiB8fCAxMDA7XG4gICAgdGhpcy5tYXggPSBvcHRzLm1heCB8fCAxMDAwMDtcbiAgICB0aGlzLmZhY3RvciA9IG9wdHMuZmFjdG9yIHx8IDI7XG4gICAgdGhpcy5qaXR0ZXIgPSBvcHRzLmppdHRlciA+IDAgJiYgb3B0cy5qaXR0ZXIgPD0gMSA/IG9wdHMuaml0dGVyIDogMDtcbiAgICB0aGlzLmF0dGVtcHRzID0gMDtcbn1cbmV4cG9ydHMuQmFja29mZiA9IEJhY2tvZmY7XG4vKipcbiAqIFJldHVybiB0aGUgYmFja29mZiBkdXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbXMgPSB0aGlzLm1zICogTWF0aC5wb3codGhpcy5mYWN0b3IsIHRoaXMuYXR0ZW1wdHMrKyk7XG4gICAgaWYgKHRoaXMuaml0dGVyKSB7XG4gICAgICAgIHZhciByYW5kID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgdmFyIGRldmlhdGlvbiA9IE1hdGguZmxvb3IocmFuZCAqIHRoaXMuaml0dGVyICogbXMpO1xuICAgICAgICBtcyA9IChNYXRoLmZsb29yKHJhbmQgKiAxMCkgJiAxKSA9PSAwID8gbXMgLSBkZXZpYXRpb24gOiBtcyArIGRldmlhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWluKG1zLCB0aGlzLm1heCkgfCAwO1xufTtcbi8qKlxuICogUmVzZXQgdGhlIG51bWJlciBvZiBhdHRlbXB0cy5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmF0dGVtcHRzID0gMDtcbn07XG4vKipcbiAqIFNldCB0aGUgbWluaW11bSBkdXJhdGlvblxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbkJhY2tvZmYucHJvdG90eXBlLnNldE1pbiA9IGZ1bmN0aW9uIChtaW4pIHtcbiAgICB0aGlzLm1zID0gbWluO1xufTtcbi8qKlxuICogU2V0IHRoZSBtYXhpbXVtIGR1cmF0aW9uXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuQmFja29mZi5wcm90b3R5cGUuc2V0TWF4ID0gZnVuY3Rpb24gKG1heCkge1xuICAgIHRoaXMubWF4ID0gbWF4O1xufTtcbi8qKlxuICogU2V0IHRoZSBqaXR0ZXJcbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5zZXRKaXR0ZXIgPSBmdW5jdGlvbiAoaml0dGVyKSB7XG4gICAgdGhpcy5qaXR0ZXIgPSBqaXR0ZXI7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLmNvbm5lY3QgPSBleHBvcnRzLmlvID0gZXhwb3J0cy5Tb2NrZXQgPSBleHBvcnRzLk1hbmFnZXIgPSBleHBvcnRzLnByb3RvY29sID0gdm9pZCAwO1xuY29uc3QgdXJsX2pzXzEgPSByZXF1aXJlKFwiLi91cmwuanNcIik7XG5jb25zdCBtYW5hZ2VyX2pzXzEgPSByZXF1aXJlKFwiLi9tYW5hZ2VyLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWFuYWdlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWFuYWdlcl9qc18xLk1hbmFnZXI7IH0gfSk7XG5jb25zdCBzb2NrZXRfanNfMSA9IHJlcXVpcmUoXCIuL3NvY2tldC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNvY2tldFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc29ja2V0X2pzXzEuU29ja2V0OyB9IH0pO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpOyAvLyBkZWJ1ZygpXG5jb25zdCBkZWJ1ZyA9IGRlYnVnXzEuZGVmYXVsdChcInNvY2tldC5pby1jbGllbnRcIik7IC8vIGRlYnVnKClcbi8qKlxuICogTWFuYWdlcnMgY2FjaGUuXG4gKi9cbmNvbnN0IGNhY2hlID0ge307XG5mdW5jdGlvbiBsb29rdXAodXJpLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiB1cmkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3B0cyA9IHVyaTtcbiAgICAgICAgdXJpID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBjb25zdCBwYXJzZWQgPSB1cmxfanNfMS51cmwodXJpLCBvcHRzLnBhdGggfHwgXCIvc29ja2V0LmlvXCIpO1xuICAgIGNvbnN0IHNvdXJjZSA9IHBhcnNlZC5zb3VyY2U7XG4gICAgY29uc3QgaWQgPSBwYXJzZWQuaWQ7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlZC5wYXRoO1xuICAgIGNvbnN0IHNhbWVOYW1lc3BhY2UgPSBjYWNoZVtpZF0gJiYgcGF0aCBpbiBjYWNoZVtpZF1bXCJuc3BzXCJdO1xuICAgIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSBvcHRzLmZvcmNlTmV3IHx8XG4gICAgICAgIG9wdHNbXCJmb3JjZSBuZXcgY29ubmVjdGlvblwiXSB8fFxuICAgICAgICBmYWxzZSA9PT0gb3B0cy5tdWx0aXBsZXggfHxcbiAgICAgICAgc2FtZU5hbWVzcGFjZTtcbiAgICBsZXQgaW87XG4gICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHtcbiAgICAgICAgZGVidWcoXCJpZ25vcmluZyBzb2NrZXQgY2FjaGUgZm9yICVzXCIsIHNvdXJjZSk7XG4gICAgICAgIGlvID0gbmV3IG1hbmFnZXJfanNfMS5NYW5hZ2VyKHNvdXJjZSwgb3B0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWNhY2hlW2lkXSkge1xuICAgICAgICAgICAgZGVidWcoXCJuZXcgaW8gaW5zdGFuY2UgZm9yICVzXCIsIHNvdXJjZSk7XG4gICAgICAgICAgICBjYWNoZVtpZF0gPSBuZXcgbWFuYWdlcl9qc18xLk1hbmFnZXIoc291cmNlLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpbyA9IGNhY2hlW2lkXTtcbiAgICB9XG4gICAgaWYgKHBhcnNlZC5xdWVyeSAmJiAhb3B0cy5xdWVyeSkge1xuICAgICAgICBvcHRzLnF1ZXJ5ID0gcGFyc2VkLnF1ZXJ5S2V5O1xuICAgIH1cbiAgICByZXR1cm4gaW8uc29ja2V0KHBhcnNlZC5wYXRoLCBvcHRzKTtcbn1cbmV4cG9ydHMuaW8gPSBsb29rdXA7XG5leHBvcnRzLmNvbm5lY3QgPSBsb29rdXA7XG5leHBvcnRzLmRlZmF1bHQgPSBsb29rdXA7XG4vLyBzbyB0aGF0IFwibG9va3VwXCIgY2FuIGJlIHVzZWQgYm90aCBhcyBhIGZ1bmN0aW9uIChlLmcuIGBpbyguLi4pYCkgYW5kIGFzIGFcbi8vIG5hbWVzcGFjZSAoZS5nLiBgaW8uY29ubmVjdCguLi4pYCksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5PYmplY3QuYXNzaWduKGxvb2t1cCwge1xuICAgIE1hbmFnZXI6IG1hbmFnZXJfanNfMS5NYW5hZ2VyLFxuICAgIFNvY2tldDogc29ja2V0X2pzXzEuU29ja2V0LFxuICAgIGlvOiBsb29rdXAsXG4gICAgY29ubmVjdDogbG9va3VwLFxufSk7XG4vKipcbiAqIFByb3RvY29sIHZlcnNpb24uXG4gKlxuICogQHB1YmxpY1xuICovXG52YXIgc29ja2V0X2lvX3BhcnNlcl8xID0gcmVxdWlyZShcInNvY2tldC5pby1wYXJzZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJwcm90b2NvbFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc29ja2V0X2lvX3BhcnNlcl8xLnByb3RvY29sOyB9IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvb2t1cDtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1hbmFnZXIgPSB2b2lkIDA7XG5jb25zdCBlbmdpbmVfaW9fY2xpZW50XzEgPSByZXF1aXJlKFwiZW5naW5lLmlvLWNsaWVudFwiKTtcbmNvbnN0IHNvY2tldF9qc18xID0gcmVxdWlyZShcIi4vc29ja2V0LmpzXCIpO1xuY29uc3QgcGFyc2VyID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJzb2NrZXQuaW8tcGFyc2VyXCIpKTtcbmNvbnN0IG9uX2pzXzEgPSByZXF1aXJlKFwiLi9vbi5qc1wiKTtcbmNvbnN0IGJhY2tvMl9qc18xID0gcmVxdWlyZShcIi4vY29udHJpYi9iYWNrbzIuanNcIik7XG5jb25zdCBjb21wb25lbnRfZW1pdHRlcl8xID0gcmVxdWlyZShcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIik7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7IC8vIGRlYnVnKClcbmNvbnN0IGRlYnVnID0gZGVidWdfMS5kZWZhdWx0KFwic29ja2V0LmlvLWNsaWVudDptYW5hZ2VyXCIpOyAvLyBkZWJ1ZygpXG5jbGFzcyBNYW5hZ2VyIGV4dGVuZHMgY29tcG9uZW50X2VtaXR0ZXJfMS5FbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih1cmksIG9wdHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5zcHMgPSB7fTtcbiAgICAgICAgdGhpcy5zdWJzID0gW107XG4gICAgICAgIGlmICh1cmkgJiYgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHVyaSkge1xuICAgICAgICAgICAgb3B0cyA9IHVyaTtcbiAgICAgICAgICAgIHVyaSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICAgICAgb3B0cy5wYXRoID0gb3B0cy5wYXRoIHx8IFwiL3NvY2tldC5pb1wiO1xuICAgICAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICAgICAgICBlbmdpbmVfaW9fY2xpZW50XzEuaW5zdGFsbFRpbWVyRnVuY3Rpb25zKHRoaXMsIG9wdHMpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbihvcHRzLnJlY29ubmVjdGlvbiAhPT0gZmFsc2UpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbkF0dGVtcHRzKG9wdHMucmVjb25uZWN0aW9uQXR0ZW1wdHMgfHwgSW5maW5pdHkpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbkRlbGF5KG9wdHMucmVjb25uZWN0aW9uRGVsYXkgfHwgMTAwMCk7XG4gICAgICAgIHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgob3B0cy5yZWNvbm5lY3Rpb25EZWxheU1heCB8fCA1MDAwKTtcbiAgICAgICAgdGhpcy5yYW5kb21pemF0aW9uRmFjdG9yKChfYSA9IG9wdHMucmFuZG9taXphdGlvbkZhY3RvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMC41KTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmID0gbmV3IGJhY2tvMl9qc18xLkJhY2tvZmYoe1xuICAgICAgICAgICAgbWluOiB0aGlzLnJlY29ubmVjdGlvbkRlbGF5KCksXG4gICAgICAgICAgICBtYXg6IHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgoKSxcbiAgICAgICAgICAgIGppdHRlcjogdGhpcy5yYW5kb21pemF0aW9uRmFjdG9yKCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRpbWVvdXQobnVsbCA9PSBvcHRzLnRpbWVvdXQgPyAyMDAwMCA6IG9wdHMudGltZW91dCk7XG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICB0aGlzLnVyaSA9IHVyaTtcbiAgICAgICAgY29uc3QgX3BhcnNlciA9IG9wdHMucGFyc2VyIHx8IHBhcnNlcjtcbiAgICAgICAgdGhpcy5lbmNvZGVyID0gbmV3IF9wYXJzZXIuRW5jb2RlcigpO1xuICAgICAgICB0aGlzLmRlY29kZXIgPSBuZXcgX3BhcnNlci5EZWNvZGVyKCk7XG4gICAgICAgIHRoaXMuX2F1dG9Db25uZWN0ID0gb3B0cy5hdXRvQ29ubmVjdCAhPT0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9hdXRvQ29ubmVjdClcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb24odikge1xuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb24gPSAhIXY7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb25BdHRlbXB0cyh2KSB7XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVjb25uZWN0aW9uQXR0ZW1wdHM7XG4gICAgICAgIHRoaXMuX3JlY29ubmVjdGlvbkF0dGVtcHRzID0gdjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlY29ubmVjdGlvbkRlbGF5KHYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkRlbGF5O1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheSA9IHY7XG4gICAgICAgIChfYSA9IHRoaXMuYmFja29mZikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNldE1pbih2KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJhbmRvbWl6YXRpb25GYWN0b3Iodikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmFuZG9taXphdGlvbkZhY3RvcjtcbiAgICAgICAgdGhpcy5fcmFuZG9taXphdGlvbkZhY3RvciA9IHY7XG4gICAgICAgIChfYSA9IHRoaXMuYmFja29mZikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNldEppdHRlcih2KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlY29ubmVjdGlvbkRlbGF5TWF4KHYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkRlbGF5TWF4O1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heCA9IHY7XG4gICAgICAgIChfYSA9IHRoaXMuYmFja29mZikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNldE1heCh2KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRpbWVvdXQodikge1xuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGltZW91dDtcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IHY7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdHJ5aW5nIHRvIHJlY29ubmVjdCBpZiByZWNvbm5lY3Rpb24gaXMgZW5hYmxlZCBhbmQgd2UgaGF2ZSBub3RcbiAgICAgKiBzdGFydGVkIHJlY29ubmVjdGluZyB5ZXRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbWF5YmVSZWNvbm5lY3RPbk9wZW4oKSB7XG4gICAgICAgIC8vIE9ubHkgdHJ5IHRvIHJlY29ubmVjdCBpZiBpdCdzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIGNvbm5lY3RpbmdcbiAgICAgICAgaWYgKCF0aGlzLl9yZWNvbm5lY3RpbmcgJiZcbiAgICAgICAgICAgIHRoaXMuX3JlY29ubmVjdGlvbiAmJlxuICAgICAgICAgICAgdGhpcy5iYWNrb2ZmLmF0dGVtcHRzID09PSAwKSB7XG4gICAgICAgICAgICAvLyBrZWVwcyByZWNvbm5lY3Rpb24gZnJvbSBmaXJpbmcgdHdpY2UgZm9yIHRoZSBzYW1lIHJlY29ubmVjdGlvbiBsb29wXG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdHJhbnNwb3J0IGBzb2NrZXRgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBvcHRpb25hbCwgY2FsbGJhY2tcbiAgICAgKiBAcmV0dXJuIHNlbGZcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgb3Blbihmbikge1xuICAgICAgICBkZWJ1ZyhcInJlYWR5U3RhdGUgJXNcIiwgdGhpcy5fcmVhZHlTdGF0ZSk7XG4gICAgICAgIGlmICh+dGhpcy5fcmVhZHlTdGF0ZS5pbmRleE9mKFwib3BlblwiKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBkZWJ1ZyhcIm9wZW5pbmcgJXNcIiwgdGhpcy51cmkpO1xuICAgICAgICB0aGlzLmVuZ2luZSA9IG5ldyBlbmdpbmVfaW9fY2xpZW50XzEuU29ja2V0KHRoaXMudXJpLCB0aGlzLm9wdHMpO1xuICAgICAgICBjb25zdCBzb2NrZXQgPSB0aGlzLmVuZ2luZTtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcIm9wZW5pbmdcIjtcbiAgICAgICAgdGhpcy5za2lwUmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgIC8vIGVtaXQgYG9wZW5gXG4gICAgICAgIGNvbnN0IG9wZW5TdWJEZXN0cm95ID0gb25fanNfMS5vbihzb2NrZXQsIFwib3BlblwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLm9ub3BlbigpO1xuICAgICAgICAgICAgZm4gJiYgZm4oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgICAgICBkZWJ1ZyhcImVycm9yXCIpO1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeVN0YXRlID0gXCJjbG9zZWRcIjtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgIGlmIChmbikge1xuICAgICAgICAgICAgICAgIGZuKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaWYgdGhlcmUgaXMgbm8gZm4gdG8gaGFuZGxlIHRoZSBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMubWF5YmVSZWNvbm5lY3RPbk9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gZW1pdCBgZXJyb3JgXG4gICAgICAgIGNvbnN0IGVycm9yU3ViID0gb25fanNfMS5vbihzb2NrZXQsIFwiZXJyb3JcIiwgb25FcnJvcik7XG4gICAgICAgIGlmIChmYWxzZSAhPT0gdGhpcy5fdGltZW91dCkge1xuICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHRoaXMuX3RpbWVvdXQ7XG4gICAgICAgICAgICBkZWJ1ZyhcImNvbm5lY3QgYXR0ZW1wdCB3aWxsIHRpbWVvdXQgYWZ0ZXIgJWRcIiwgdGltZW91dCk7XG4gICAgICAgICAgICAvLyBzZXQgdGltZXJcbiAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy5zZXRUaW1lb3V0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnKFwiY29ubmVjdCBhdHRlbXB0IHRpbWVkIG91dCBhZnRlciAlZFwiLCB0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICBvcGVuU3ViRGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIG9uRXJyb3IobmV3IEVycm9yKFwidGltZW91dFwiKSk7XG4gICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYXV0b1VucmVmKSB7XG4gICAgICAgICAgICAgICAgdGltZXIudW5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3Vicy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZW91dEZuKHRpbWVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3Vicy5wdXNoKG9wZW5TdWJEZXN0cm95KTtcbiAgICAgICAgdGhpcy5zdWJzLnB1c2goZXJyb3JTdWIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIG9wZW4oKVxuICAgICAqXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGNvbm5lY3QoZm4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3Blbihmbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHRyYW5zcG9ydCBvcGVuLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbm9wZW4oKSB7XG4gICAgICAgIGRlYnVnKFwib3BlblwiKTtcbiAgICAgICAgLy8gY2xlYXIgb2xkIHN1YnNcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIC8vIG1hcmsgYXMgb3BlblxuICAgICAgICB0aGlzLl9yZWFkeVN0YXRlID0gXCJvcGVuXCI7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwib3BlblwiKTtcbiAgICAgICAgLy8gYWRkIG5ldyBzdWJzXG4gICAgICAgIGNvbnN0IHNvY2tldCA9IHRoaXMuZW5naW5lO1xuICAgICAgICB0aGlzLnN1YnMucHVzaChvbl9qc18xLm9uKHNvY2tldCwgXCJwaW5nXCIsIHRoaXMub25waW5nLmJpbmQodGhpcykpLCBvbl9qc18xLm9uKHNvY2tldCwgXCJkYXRhXCIsIHRoaXMub25kYXRhLmJpbmQodGhpcykpLCBvbl9qc18xLm9uKHNvY2tldCwgXCJlcnJvclwiLCB0aGlzLm9uZXJyb3IuYmluZCh0aGlzKSksIG9uX2pzXzEub24oc29ja2V0LCBcImNsb3NlXCIsIHRoaXMub25jbG9zZS5iaW5kKHRoaXMpKSwgb25fanNfMS5vbih0aGlzLmRlY29kZXIsIFwiZGVjb2RlZFwiLCB0aGlzLm9uZGVjb2RlZC5iaW5kKHRoaXMpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGEgcGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25waW5nKCkge1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBpbmdcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aXRoIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uZGF0YShkYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmRlY29kZXIuYWRkKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLm9uY2xvc2UoXCJwYXJzZSBlcnJvclwiLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBwYXJzZXIgZnVsbHkgZGVjb2RlcyBhIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25kZWNvZGVkKHBhY2tldCkge1xuICAgICAgICAvLyB0aGUgbmV4dFRpY2sgY2FsbCBwcmV2ZW50cyBhbiBleGNlcHRpb24gaW4gYSB1c2VyLXByb3ZpZGVkIGV2ZW50IGxpc3RlbmVyIGZyb20gdHJpZ2dlcmluZyBhIGRpc2Nvbm5lY3Rpb24gZHVlIHRvIGEgXCJwYXJzZSBlcnJvclwiXG4gICAgICAgIGVuZ2luZV9pb19jbGllbnRfMS5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldFwiLCBwYWNrZXQpO1xuICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHNvY2tldCBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25lcnJvcihlcnIpIHtcbiAgICAgICAgZGVidWcoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVycik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc29ja2V0IGZvciB0aGUgZ2l2ZW4gYG5zcGAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTb2NrZXR9XG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHNvY2tldChuc3AsIG9wdHMpIHtcbiAgICAgICAgbGV0IHNvY2tldCA9IHRoaXMubnNwc1tuc3BdO1xuICAgICAgICBpZiAoIXNvY2tldCkge1xuICAgICAgICAgICAgc29ja2V0ID0gbmV3IHNvY2tldF9qc18xLlNvY2tldCh0aGlzLCBuc3AsIG9wdHMpO1xuICAgICAgICAgICAgdGhpcy5uc3BzW25zcF0gPSBzb2NrZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fYXV0b0Nvbm5lY3QgJiYgIXNvY2tldC5hY3RpdmUpIHtcbiAgICAgICAgICAgIHNvY2tldC5jb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvY2tldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gYSBzb2NrZXQgY2xvc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc29ja2V0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZGVzdHJveShzb2NrZXQpIHtcbiAgICAgICAgY29uc3QgbnNwcyA9IE9iamVjdC5rZXlzKHRoaXMubnNwcyk7XG4gICAgICAgIGZvciAoY29uc3QgbnNwIG9mIG5zcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvY2tldCA9IHRoaXMubnNwc1tuc3BdO1xuICAgICAgICAgICAgaWYgKHNvY2tldC5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhcInNvY2tldCAlcyBpcyBzdGlsbCBhY3RpdmUsIHNraXBwaW5nIGNsb3NlXCIsIG5zcCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9wYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGRlYnVnKFwid3JpdGluZyBwYWNrZXQgJWpcIiwgcGFja2V0KTtcbiAgICAgICAgY29uc3QgZW5jb2RlZFBhY2tldHMgPSB0aGlzLmVuY29kZXIuZW5jb2RlKHBhY2tldCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RlZFBhY2tldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZW5naW5lLndyaXRlKGVuY29kZWRQYWNrZXRzW2ldLCBwYWNrZXQub3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYW4gdXAgdHJhbnNwb3J0IHN1YnNjcmlwdGlvbnMgYW5kIHBhY2tldCBidWZmZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNsZWFudXAoKSB7XG4gICAgICAgIGRlYnVnKFwiY2xlYW51cFwiKTtcbiAgICAgICAgdGhpcy5zdWJzLmZvckVhY2goKHN1YkRlc3Ryb3kpID0+IHN1YkRlc3Ryb3koKSk7XG4gICAgICAgIHRoaXMuc3Vicy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLmRlY29kZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgY3VycmVudCBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jbG9zZSgpIHtcbiAgICAgICAgZGVidWcoXCJkaXNjb25uZWN0XCIpO1xuICAgICAgICB0aGlzLnNraXBSZWNvbm5lY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbmNsb3NlKFwiZm9yY2VkIGNsb3NlXCIpO1xuICAgICAgICBpZiAodGhpcy5lbmdpbmUpXG4gICAgICAgICAgICB0aGlzLmVuZ2luZS5jbG9zZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgY2xvc2UoKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZW5naW5lIGNsb3NlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmNsb3NlKHJlYXNvbiwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgZGVidWcoXCJjbG9zZWQgZHVlIHRvICVzXCIsIHJlYXNvbik7XG4gICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICB0aGlzLmJhY2tvZmYucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFwiY2xvc2VkXCI7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiY2xvc2VcIiwgcmVhc29uLCBkZXNjcmlwdGlvbik7XG4gICAgICAgIGlmICh0aGlzLl9yZWNvbm5lY3Rpb24gJiYgIXRoaXMuc2tpcFJlY29ubmVjdCkge1xuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IGEgcmVjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZWNvbm5lY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZWNvbm5lY3RpbmcgfHwgdGhpcy5za2lwUmVjb25uZWN0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5iYWNrb2ZmLmF0dGVtcHRzID49IHRoaXMuX3JlY29ubmVjdGlvbkF0dGVtcHRzKSB7XG4gICAgICAgICAgICBkZWJ1ZyhcInJlY29ubmVjdCBmYWlsZWRcIik7XG4gICAgICAgICAgICB0aGlzLmJhY2tvZmYucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicmVjb25uZWN0X2ZhaWxlZFwiKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29ubmVjdGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVsYXkgPSB0aGlzLmJhY2tvZmYuZHVyYXRpb24oKTtcbiAgICAgICAgICAgIGRlYnVnKFwid2lsbCB3YWl0ICVkbXMgYmVmb3JlIHJlY29ubmVjdCBhdHRlbXB0XCIsIGRlbGF5KTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29ubmVjdGluZyA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5za2lwUmVjb25uZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgZGVidWcoXCJhdHRlbXB0aW5nIHJlY29ubmVjdFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInJlY29ubmVjdF9hdHRlbXB0XCIsIHNlbGYuYmFja29mZi5hdHRlbXB0cyk7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gZm9yIHRoZSBjYXNlIHNvY2tldCBjbG9zZWQgaW4gYWJvdmUgZXZlbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuc2tpcFJlY29ubmVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHNlbGYub3BlbigoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKFwicmVjb25uZWN0IGF0dGVtcHQgZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInJlY29ubmVjdF9lcnJvclwiLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoXCJyZWNvbm5lY3Qgc3VjY2Vzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25yZWNvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5hdXRvVW5yZWYpIHtcbiAgICAgICAgICAgICAgICB0aW1lci51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdWJzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0Rm4odGltZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gc3VjY2Vzc2Z1bCByZWNvbm5lY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9ucmVjb25uZWN0KCkge1xuICAgICAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5iYWNrb2ZmLmF0dGVtcHRzO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicmVjb25uZWN0XCIsIGF0dGVtcHQpO1xuICAgIH1cbn1cbmV4cG9ydHMuTWFuYWdlciA9IE1hbmFnZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMub24gPSB2b2lkIDA7XG5mdW5jdGlvbiBvbihvYmosIGV2LCBmbikge1xuICAgIG9iai5vbihldiwgZm4pO1xuICAgIHJldHVybiBmdW5jdGlvbiBzdWJEZXN0cm95KCkge1xuICAgICAgICBvYmoub2ZmKGV2LCBmbik7XG4gICAgfTtcbn1cbmV4cG9ydHMub24gPSBvbjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Tb2NrZXQgPSB2b2lkIDA7XG5jb25zdCBzb2NrZXRfaW9fcGFyc2VyXzEgPSByZXF1aXJlKFwic29ja2V0LmlvLXBhcnNlclwiKTtcbmNvbnN0IG9uX2pzXzEgPSByZXF1aXJlKFwiLi9vbi5qc1wiKTtcbmNvbnN0IGNvbXBvbmVudF9lbWl0dGVyXzEgPSByZXF1aXJlKFwiQHNvY2tldC5pby9jb21wb25lbnQtZW1pdHRlclwiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTsgLy8gZGVidWcoKVxuY29uc3QgZGVidWcgPSBkZWJ1Z18xLmRlZmF1bHQoXCJzb2NrZXQuaW8tY2xpZW50OnNvY2tldFwiKTsgLy8gZGVidWcoKVxuLyoqXG4gKiBJbnRlcm5hbCBldmVudHMuXG4gKiBUaGVzZSBldmVudHMgY2FuJ3QgYmUgZW1pdHRlZCBieSB0aGUgdXNlci5cbiAqL1xuY29uc3QgUkVTRVJWRURfRVZFTlRTID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY29ubmVjdDogMSxcbiAgICBjb25uZWN0X2Vycm9yOiAxLFxuICAgIGRpc2Nvbm5lY3Q6IDEsXG4gICAgZGlzY29ubmVjdGluZzogMSxcbiAgICAvLyBFdmVudEVtaXR0ZXIgcmVzZXJ2ZWQgZXZlbnRzOiBodHRwczovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sI2V2ZW50c19ldmVudF9uZXdsaXN0ZW5lclxuICAgIG5ld0xpc3RlbmVyOiAxLFxuICAgIHJlbW92ZUxpc3RlbmVyOiAxLFxufSk7XG4vKipcbiAqIEEgU29ja2V0IGlzIHRoZSBmdW5kYW1lbnRhbCBjbGFzcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VydmVyLlxuICpcbiAqIEEgU29ja2V0IGJlbG9uZ3MgdG8gYSBjZXJ0YWluIE5hbWVzcGFjZSAoYnkgZGVmYXVsdCAvKSBhbmQgdXNlcyBhbiB1bmRlcmx5aW5nIHtAbGluayBNYW5hZ2VyfSB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAqXG4gKiBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAqICAgY29uc29sZS5sb2coXCJjb25uZWN0ZWRcIik7XG4gKiB9KTtcbiAqXG4gKiAvLyBzZW5kIGFuIGV2ZW50IHRvIHRoZSBzZXJ2ZXJcbiAqIHNvY2tldC5lbWl0KFwiZm9vXCIsIFwiYmFyXCIpO1xuICpcbiAqIHNvY2tldC5vbihcImZvb2JhclwiLCAoKSA9PiB7XG4gKiAgIC8vIGFuIGV2ZW50IHdhcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAqIH0pO1xuICpcbiAqIC8vIHVwb24gZGlzY29ubmVjdGlvblxuICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAocmVhc29uKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBkaXNjb25uZWN0ZWQgZHVlIHRvICR7cmVhc29ufWApO1xuICogfSk7XG4gKi9cbmNsYXNzIFNvY2tldCBleHRlbmRzIGNvbXBvbmVudF9lbWl0dGVyXzEuRW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogYFNvY2tldGAgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaW8sIG5zcCwgb3B0cykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogV2hldGhlciB0aGUgc29ja2V0IGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAgICAgICAgICpcbiAgICAgICAgICogc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc29sZS5sb2coc29ja2V0LmNvbm5lY3RlZCk7IC8vIHRydWVcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICAgKiAgIGNvbnNvbGUubG9nKHNvY2tldC5jb25uZWN0ZWQpOyAvLyBmYWxzZVxuICAgICAgICAgKiB9KTtcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBjb25uZWN0aW9uIHN0YXRlIHdhcyByZWNvdmVyZWQgYWZ0ZXIgYSB0ZW1wb3JhcnkgZGlzY29ubmVjdGlvbi4gSW4gdGhhdCBjYXNlLCBhbnkgbWlzc2VkIHBhY2tldHMgd2lsbFxuICAgICAgICAgKiBiZSB0cmFuc21pdHRlZCBieSB0aGUgc2VydmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWNvdmVyZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ1ZmZlciBmb3IgcGFja2V0cyByZWNlaXZlZCBiZWZvcmUgdGhlIENPTk5FQ1QgcGFja2V0XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlY2VpdmVCdWZmZXIgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ1ZmZlciBmb3IgcGFja2V0cyB0aGF0IHdpbGwgYmUgc2VudCBvbmNlIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBxdWV1ZSBvZiBwYWNrZXRzIHRvIGJlIHNlbnQgd2l0aCByZXRyeSBpbiBjYXNlIG9mIGZhaWx1cmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFBhY2tldHMgYXJlIHNlbnQgb25lIGJ5IG9uZSwgZWFjaCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIGFja25vd2xlZGdlbWVudCwgaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHRoZSBkZWxpdmVyeSBvcmRlci5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHNlcXVlbmNlIHRvIGdlbmVyYXRlIHRoZSBJRCBvZiB0aGUge0BsaW5rIFF1ZXVlZFBhY2tldH0uXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9xdWV1ZVNlcSA9IDA7XG4gICAgICAgIHRoaXMuaWRzID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbWFwIGNvbnRhaW5pbmcgYWNrbm93bGVkZ2VtZW50IGhhbmRsZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgYHdpdGhFcnJvcmAgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBoYW5kbGVycyB0aGF0IGFjY2VwdCBhbiBlcnJvciBhcyBmaXJzdCBhcmd1bWVudDpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgc29ja2V0LmVtaXQoXCJ0ZXN0XCIsIChlcnIsIHZhbHVlKSA9PiB7IC4uLiB9KWAgd2l0aCBgYWNrVGltZW91dGAgb3B0aW9uXG4gICAgICAgICAqIC0gYHNvY2tldC50aW1lb3V0KDUwMDApLmVtaXQoXCJ0ZXN0XCIsIChlcnIsIHZhbHVlKSA9PiB7IC4uLiB9KWBcbiAgICAgICAgICogLSBgY29uc3QgdmFsdWUgPSBhd2FpdCBzb2NrZXQuZW1pdFdpdGhBY2soXCJ0ZXN0XCIpYFxuICAgICAgICAgKlxuICAgICAgICAgKiBGcm9tIHRob3NlIHRoYXQgZG9uJ3Q6XG4gICAgICAgICAqXG4gICAgICAgICAqIC0gYHNvY2tldC5lbWl0KFwidGVzdFwiLCAodmFsdWUpID0+IHsgLi4uIH0pO2BcbiAgICAgICAgICpcbiAgICAgICAgICogSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBoYW5kbGVycyB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGVycm9yIHdoZW46XG4gICAgICAgICAqXG4gICAgICAgICAqIC0gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZFxuICAgICAgICAgKiAtIHRoZSBzb2NrZXQgZ2V0cyBkaXNjb25uZWN0ZWRcbiAgICAgICAgICpcbiAgICAgICAgICogSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgaGFuZGxlcnMgd2lsbCBiZSBzaW1wbHkgZGlzY2FyZGVkIHVwb24gZGlzY29ubmVjdGlvbiwgc2luY2UgdGhlIGNsaWVudCB3aWxsIG5ldmVyIHJlY2VpdmVcbiAgICAgICAgICogYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWNrcyA9IHt9O1xuICAgICAgICB0aGlzLmZsYWdzID0ge307XG4gICAgICAgIHRoaXMuaW8gPSBpbztcbiAgICAgICAgdGhpcy5uc3AgPSBuc3A7XG4gICAgICAgIGlmIChvcHRzICYmIG9wdHMuYXV0aCkge1xuICAgICAgICAgICAgdGhpcy5hdXRoID0gb3B0cy5hdXRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRzKTtcbiAgICAgICAgaWYgKHRoaXMuaW8uX2F1dG9Db25uZWN0KVxuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHNvY2tldCBpcyBjdXJyZW50bHkgZGlzY29ubmVjdGVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHNvY2tldCA9IGlvKCk7XG4gICAgICpcbiAgICAgKiBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHNvY2tldC5kaXNjb25uZWN0ZWQpOyAvLyBmYWxzZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhzb2NrZXQuZGlzY29ubmVjdGVkKTsgLy8gdHJ1ZVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGdldCBkaXNjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jb25uZWN0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZSB0byBvcGVuLCBjbG9zZSBhbmQgcGFja2V0IGV2ZW50c1xuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdWJFdmVudHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnN1YnMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGlvID0gdGhpcy5pbztcbiAgICAgICAgdGhpcy5zdWJzID0gW1xuICAgICAgICAgICAgb25fanNfMS5vbihpbywgXCJvcGVuXCIsIHRoaXMub25vcGVuLmJpbmQodGhpcykpLFxuICAgICAgICAgICAgb25fanNfMS5vbihpbywgXCJwYWNrZXRcIiwgdGhpcy5vbnBhY2tldC5iaW5kKHRoaXMpKSxcbiAgICAgICAgICAgIG9uX2pzXzEub24oaW8sIFwiZXJyb3JcIiwgdGhpcy5vbmVycm9yLmJpbmQodGhpcykpLFxuICAgICAgICAgICAgb25fanNfMS5vbihpbywgXCJjbG9zZVwiLCB0aGlzLm9uY2xvc2UuYmluZCh0aGlzKSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIFNvY2tldCB3aWxsIHRyeSB0byByZWNvbm5lY3Qgd2hlbiBpdHMgTWFuYWdlciBjb25uZWN0cyBvciByZWNvbm5lY3RzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coc29ja2V0LmFjdGl2ZSk7IC8vIHRydWVcbiAgICAgKlxuICAgICAqIHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKHJlYXNvbikgPT4ge1xuICAgICAqICAgaWYgKHJlYXNvbiA9PT0gXCJpbyBzZXJ2ZXIgZGlzY29ubmVjdFwiKSB7XG4gICAgICogICAgIC8vIHRoZSBkaXNjb25uZWN0aW9uIHdhcyBpbml0aWF0ZWQgYnkgdGhlIHNlcnZlciwgeW91IG5lZWQgdG8gbWFudWFsbHkgcmVjb25uZWN0XG4gICAgICogICAgIGNvbnNvbGUubG9nKHNvY2tldC5hY3RpdmUpOyAvLyBmYWxzZVxuICAgICAqICAgfVxuICAgICAqICAgLy8gZWxzZSB0aGUgc29ja2V0IHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gcmVjb25uZWN0XG4gICAgICogICBjb25zb2xlLmxvZyhzb2NrZXQuYWN0aXZlKTsgLy8gdHJ1ZVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGdldCBhY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc3VicztcbiAgICB9XG4gICAgLyoqXG4gICAgICogXCJPcGVuc1wiIHRoZSBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHNvY2tldCA9IGlvKHtcbiAgICAgKiAgIGF1dG9Db25uZWN0OiBmYWxzZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc29ja2V0LmNvbm5lY3QoKTtcbiAgICAgKi9cbiAgICBjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5zdWJFdmVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlvW1wiX3JlY29ubmVjdGluZ1wiXSlcbiAgICAgICAgICAgIHRoaXMuaW8ub3BlbigpOyAvLyBlbnN1cmUgb3BlblxuICAgICAgICBpZiAoXCJvcGVuXCIgPT09IHRoaXMuaW8uX3JlYWR5U3RhdGUpXG4gICAgICAgICAgICB0aGlzLm9ub3BlbigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHtAbGluayBjb25uZWN0KCl9LlxuICAgICAqL1xuICAgIG9wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBgbWVzc2FnZWAgZXZlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBtaW1pY3MgdGhlIFdlYlNvY2tldC5zZW5kKCkgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViU29ja2V0L3NlbmRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LnNlbmQoXCJoZWxsb1wiKTtcbiAgICAgKlxuICAgICAqIC8vIHRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAqIHNvY2tldC5lbWl0KFwibWVzc2FnZVwiLCBcImhlbGxvXCIpO1xuICAgICAqXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICovXG4gICAgc2VuZCguLi5hcmdzKSB7XG4gICAgICAgIGFyZ3MudW5zaGlmdChcIm1lc3NhZ2VcIik7XG4gICAgICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIGBlbWl0YC5cbiAgICAgKiBJZiB0aGUgZXZlbnQgaXMgaW4gYGV2ZW50c2AsIGl0J3MgZW1pdHRlZCBub3JtYWxseS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LmVtaXQoXCJoZWxsb1wiLCBcIndvcmxkXCIpO1xuICAgICAqXG4gICAgICogLy8gYWxsIHNlcmlhbGl6YWJsZSBkYXRhc3RydWN0dXJlcyBhcmUgc3VwcG9ydGVkIChubyBuZWVkIHRvIGNhbGwgSlNPTi5zdHJpbmdpZnkpXG4gICAgICogc29ja2V0LmVtaXQoXCJoZWxsb1wiLCAxLCBcIjJcIiwgeyAzOiBbXCI0XCJdLCA1OiBVaW50OEFycmF5LmZyb20oWzZdKSB9KTtcbiAgICAgKlxuICAgICAqIC8vIHdpdGggYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlclxuICAgICAqIHNvY2tldC5lbWl0KFwiaGVsbG9cIiwgXCJ3b3JsZFwiLCAodmFsKSA9PiB7XG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqL1xuICAgIGVtaXQoZXYsIC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKFJFU0VSVkVEX0VWRU5UUy5oYXNPd25Qcm9wZXJ0eShldikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgZXYudG9TdHJpbmcoKSArICdcIiBpcyBhIHJlc2VydmVkIGV2ZW50IG5hbWUnKTtcbiAgICAgICAgfVxuICAgICAgICBhcmdzLnVuc2hpZnQoZXYpO1xuICAgICAgICBpZiAodGhpcy5fb3B0cy5yZXRyaWVzICYmICF0aGlzLmZsYWdzLmZyb21RdWV1ZSAmJiAhdGhpcy5mbGFncy52b2xhdGlsZSkge1xuICAgICAgICAgICAgdGhpcy5fYWRkVG9RdWV1ZShhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IHtcbiAgICAgICAgICAgIHR5cGU6IHNvY2tldF9pb19wYXJzZXJfMS5QYWNrZXRUeXBlLkVWRU5ULFxuICAgICAgICAgICAgZGF0YTogYXJncyxcbiAgICAgICAgfTtcbiAgICAgICAgcGFja2V0Lm9wdGlvbnMgPSB7fTtcbiAgICAgICAgcGFja2V0Lm9wdGlvbnMuY29tcHJlc3MgPSB0aGlzLmZsYWdzLmNvbXByZXNzICE9PSBmYWxzZTtcbiAgICAgICAgLy8gZXZlbnQgYWNrIGNhbGxiYWNrXG4gICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5pZHMrKztcbiAgICAgICAgICAgIGRlYnVnKFwiZW1pdHRpbmcgcGFja2V0IHdpdGggYWNrIGlkICVkXCIsIGlkKTtcbiAgICAgICAgICAgIGNvbnN0IGFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlckFja0NhbGxiYWNrKGlkLCBhY2spO1xuICAgICAgICAgICAgcGFja2V0LmlkID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNUcmFuc3BvcnRXcml0YWJsZSA9IHRoaXMuaW8uZW5naW5lICYmXG4gICAgICAgICAgICB0aGlzLmlvLmVuZ2luZS50cmFuc3BvcnQgJiZcbiAgICAgICAgICAgIHRoaXMuaW8uZW5naW5lLnRyYW5zcG9ydC53cml0YWJsZTtcbiAgICAgICAgY29uc3QgZGlzY2FyZFBhY2tldCA9IHRoaXMuZmxhZ3Mudm9sYXRpbGUgJiYgKCFpc1RyYW5zcG9ydFdyaXRhYmxlIHx8ICF0aGlzLmNvbm5lY3RlZCk7XG4gICAgICAgIGlmIChkaXNjYXJkUGFja2V0KSB7XG4gICAgICAgICAgICBkZWJ1ZyhcImRpc2NhcmQgcGFja2V0IGFzIHRoZSB0cmFuc3BvcnQgaXMgbm90IGN1cnJlbnRseSB3cml0YWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlPdXRnb2luZ0xpc3RlbmVycyhwYWNrZXQpO1xuICAgICAgICAgICAgdGhpcy5wYWNrZXQocGFja2V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEJ1ZmZlci5wdXNoKHBhY2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mbGFncyA9IHt9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcmVnaXN0ZXJBY2tDYWxsYmFjayhpZCwgYWNrKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IChfYSA9IHRoaXMuZmxhZ3MudGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5fb3B0cy5hY2tUaW1lb3V0O1xuICAgICAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFja3NbaWRdID0gYWNrO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLmlvLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5hY2tzW2lkXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZW5kQnVmZmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VuZEJ1ZmZlcltpXS5pZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoXCJyZW1vdmluZyBwYWNrZXQgd2l0aCBhY2sgaWQgJWQgZnJvbSB0aGUgYnVmZmVyXCIsIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kQnVmZmVyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWJ1ZyhcImV2ZW50IHdpdGggYWNrIGlkICVkIGhhcyB0aW1lZCBvdXQgYWZ0ZXIgJWQgbXNcIiwgaWQsIHRpbWVvdXQpO1xuICAgICAgICAgICAgYWNrLmNhbGwodGhpcywgbmV3IEVycm9yKFwib3BlcmF0aW9uIGhhcyB0aW1lZCBvdXRcIikpO1xuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgY29uc3QgZm4gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5pby5jbGVhclRpbWVvdXRGbih0aW1lcik7XG4gICAgICAgICAgICBhY2suYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIGZuLndpdGhFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuYWNrc1tpZF0gPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgYW5kIHdhaXRzIGZvciBhbiBhY2tub3dsZWRnZW1lbnRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gd2l0aG91dCB0aW1lb3V0XG4gICAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzb2NrZXQuZW1pdFdpdGhBY2soXCJoZWxsb1wiLCBcIndvcmxkXCIpO1xuICAgICAqXG4gICAgICogLy8gd2l0aCBhIHNwZWNpZmljIHRpbWVvdXRcbiAgICAgKiB0cnkge1xuICAgICAqICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzb2NrZXQudGltZW91dCgxMDAwKS5lbWl0V2l0aEFjayhcImhlbGxvXCIsIFwid29ybGRcIik7XG4gICAgICogfSBjYXRjaCAoZXJyKSB7XG4gICAgICogICAvLyB0aGUgc2VydmVyIGRpZCBub3QgYWNrbm93bGVkZ2UgdGhlIGV2ZW50IGluIHRoZSBnaXZlbiBkZWxheVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEByZXR1cm4gYSBQcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgd2hlbiB0aGUgc2VydmVyIGFja25vd2xlZGdlcyB0aGUgZXZlbnRcbiAgICAgKi9cbiAgICBlbWl0V2l0aEFjayhldiwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm4gPSAoYXJnMSwgYXJnMikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmcxID8gcmVqZWN0KGFyZzEpIDogcmVzb2x2ZShhcmcyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmbi53aXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgYXJncy5wdXNoKGZuKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChldiwgLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgdGhlIHBhY2tldCB0byB0aGUgcXVldWUuXG4gICAgICogQHBhcmFtIGFyZ3NcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRUb1F1ZXVlKGFyZ3MpIHtcbiAgICAgICAgbGV0IGFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgYWNrID0gYXJncy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5fcXVldWVTZXErKyxcbiAgICAgICAgICAgIHRyeUNvdW50OiAwLFxuICAgICAgICAgICAgcGVuZGluZzogZmFsc2UsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgZmxhZ3M6IE9iamVjdC5hc3NpZ24oeyBmcm9tUXVldWU6IHRydWUgfSwgdGhpcy5mbGFncyksXG4gICAgICAgIH07XG4gICAgICAgIGFyZ3MucHVzaCgoZXJyLCAuLi5yZXNwb25zZUFyZ3MpID0+IHtcbiAgICAgICAgICAgIGlmIChwYWNrZXQgIT09IHRoaXMuX3F1ZXVlWzBdKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIHBhY2tldCBoYXMgYWxyZWFkeSBiZWVuIGFja25vd2xlZGdlZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhhc0Vycm9yID0gZXJyICE9PSBudWxsO1xuICAgICAgICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldC50cnlDb3VudCA+IHRoaXMuX29wdHMucmV0cmllcykge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhcInBhY2tldCBbJWRdIGlzIGRpc2NhcmRlZCBhZnRlciAlZCB0cmllc1wiLCBwYWNrZXQuaWQsIHBhY2tldC50cnlDb3VudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWcoXCJwYWNrZXQgWyVkXSB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnRcIiwgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgYWNrKG51bGwsIC4uLnJlc3BvbnNlQXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2V0LnBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcmFpblF1ZXVlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKHBhY2tldCk7XG4gICAgICAgIHRoaXMuX2RyYWluUXVldWUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgZmlyc3QgcGFja2V0IG9mIHRoZSBxdWV1ZSwgYW5kIHdhaXQgZm9yIGFuIGFja25vd2xlZGdlbWVudCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAgICogQHBhcmFtIGZvcmNlIC0gd2hldGhlciB0byByZXNlbmQgYSBwYWNrZXQgdGhhdCBoYXMgbm90IGJlZW4gYWNrbm93bGVkZ2VkIHlldFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZHJhaW5RdWV1ZShmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIGRlYnVnKFwiZHJhaW5pbmcgcXVldWVcIik7XG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0ZWQgfHwgdGhpcy5fcXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFja2V0ID0gdGhpcy5fcXVldWVbMF07XG4gICAgICAgIGlmIChwYWNrZXQucGVuZGluZyAmJiAhZm9yY2UpIHtcbiAgICAgICAgICAgIGRlYnVnKFwicGFja2V0IFslZF0gaGFzIGFscmVhZHkgYmVlbiBzZW50IGFuZCBpcyB3YWl0aW5nIGZvciBhbiBhY2tcIiwgcGFja2V0LmlkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYWNrZXQucGVuZGluZyA9IHRydWU7XG4gICAgICAgIHBhY2tldC50cnlDb3VudCsrO1xuICAgICAgICBkZWJ1ZyhcInNlbmRpbmcgcGFja2V0IFslZF0gKHRyeSBuwrAlZClcIiwgcGFja2V0LmlkLCBwYWNrZXQudHJ5Q291bnQpO1xuICAgICAgICB0aGlzLmZsYWdzID0gcGFja2V0LmZsYWdzO1xuICAgICAgICB0aGlzLmVtaXQuYXBwbHkodGhpcywgcGFja2V0LmFyZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHBhY2tldChwYWNrZXQpIHtcbiAgICAgICAgcGFja2V0Lm5zcCA9IHRoaXMubnNwO1xuICAgICAgICB0aGlzLmlvLl9wYWNrZXQocGFja2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZW5naW5lIGBvcGVuYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25vcGVuKCkge1xuICAgICAgICBkZWJ1ZyhcInRyYW5zcG9ydCBpcyBvcGVuIC0gY29ubmVjdGluZ1wiKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmF1dGggPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGgoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZW5kQ29ubmVjdFBhY2tldChkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2VuZENvbm5lY3RQYWNrZXQodGhpcy5hdXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIENPTk5FQ1QgcGFja2V0IHRvIGluaXRpYXRlIHRoZSBTb2NrZXQuSU8gc2Vzc2lvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfc2VuZENvbm5lY3RQYWNrZXQoZGF0YSkge1xuICAgICAgICB0aGlzLnBhY2tldCh7XG4gICAgICAgICAgICB0eXBlOiBzb2NrZXRfaW9fcGFyc2VyXzEuUGFja2V0VHlwZS5DT05ORUNULFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fcGlkXG4gICAgICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKHsgcGlkOiB0aGlzLl9waWQsIG9mZnNldDogdGhpcy5fbGFzdE9mZnNldCB9LCBkYXRhKVxuICAgICAgICAgICAgICAgIDogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGVuZ2luZSBvciBtYW5hZ2VyIGBlcnJvcmAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXJyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmVycm9yKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBlbmdpbmUgYGNsb3NlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFzb25cbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uY2xvc2UocmVhc29uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBkZWJ1ZyhcImNsb3NlICglcylcIiwgcmVhc29uKTtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuaWQ7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZGlzY29ubmVjdFwiLCByZWFzb24sIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgdGhpcy5fY2xlYXJBY2tzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgYWNrbm93bGVkZ2VtZW50IGhhbmRsZXJzIHVwb24gZGlzY29ubmVjdGlvbiwgc2luY2UgdGhlIGNsaWVudCB3aWxsIG5ldmVyIHJlY2VpdmUgYW4gYWNrbm93bGVkZ2VtZW50IGZyb21cbiAgICAgKiB0aGUgc2VydmVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2xlYXJBY2tzKCkge1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmFja3MpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0J1ZmZlcmVkID0gdGhpcy5zZW5kQnVmZmVyLnNvbWUoKHBhY2tldCkgPT4gU3RyaW5nKHBhY2tldC5pZCkgPT09IGlkKTtcbiAgICAgICAgICAgIGlmICghaXNCdWZmZXJlZCkge1xuICAgICAgICAgICAgICAgIC8vIG5vdGU6IGhhbmRsZXJzIHRoYXQgZG8gbm90IGFjY2VwdCBhbiBlcnJvciBhcyBmaXJzdCBhcmd1bWVudCBhcmUgaWdub3JlZCBoZXJlXG4gICAgICAgICAgICAgICAgY29uc3QgYWNrID0gdGhpcy5hY2tzW2lkXTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5hY2tzW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoYWNrLndpdGhFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBhY2suY2FsbCh0aGlzLCBuZXcgRXJyb3IoXCJzb2NrZXQgaGFzIGJlZW4gZGlzY29ubmVjdGVkXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2l0aCBzb2NrZXQgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25wYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGNvbnN0IHNhbWVOYW1lc3BhY2UgPSBwYWNrZXQubnNwID09PSB0aGlzLm5zcDtcbiAgICAgICAgaWYgKCFzYW1lTmFtZXNwYWNlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzd2l0Y2ggKHBhY2tldC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIHNvY2tldF9pb19wYXJzZXJfMS5QYWNrZXRUeXBlLkNPTk5FQ1Q6XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldC5kYXRhICYmIHBhY2tldC5kYXRhLnNpZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uY29ubmVjdChwYWNrZXQuZGF0YS5zaWQsIHBhY2tldC5kYXRhLnBpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNvbm5lY3RfZXJyb3JcIiwgbmV3IEVycm9yKFwiSXQgc2VlbXMgeW91IGFyZSB0cnlpbmcgdG8gcmVhY2ggYSBTb2NrZXQuSU8gc2VydmVyIGluIHYyLnggd2l0aCBhIHYzLnggY2xpZW50LCBidXQgdGhleSBhcmUgbm90IGNvbXBhdGlibGUgKG1vcmUgaW5mb3JtYXRpb24gaGVyZTogaHR0cHM6Ly9zb2NrZXQuaW8vZG9jcy92My9taWdyYXRpbmctZnJvbS0yLXgtdG8tMy0wLylcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugc29ja2V0X2lvX3BhcnNlcl8xLlBhY2tldFR5cGUuRVZFTlQ6XG4gICAgICAgICAgICBjYXNlIHNvY2tldF9pb19wYXJzZXJfMS5QYWNrZXRUeXBlLkJJTkFSWV9FVkVOVDpcbiAgICAgICAgICAgICAgICB0aGlzLm9uZXZlbnQocGFja2V0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugc29ja2V0X2lvX3BhcnNlcl8xLlBhY2tldFR5cGUuQUNLOlxuICAgICAgICAgICAgY2FzZSBzb2NrZXRfaW9fcGFyc2VyXzEuUGFja2V0VHlwZS5CSU5BUllfQUNLOlxuICAgICAgICAgICAgICAgIHRoaXMub25hY2socGFja2V0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugc29ja2V0X2lvX3BhcnNlcl8xLlBhY2tldFR5cGUuRElTQ09OTkVDVDpcbiAgICAgICAgICAgICAgICB0aGlzLm9uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBzb2NrZXRfaW9fcGFyc2VyXzEuUGFja2V0VHlwZS5DT05ORUNUX0VSUk9SOlxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihwYWNrZXQuZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgZXJyLmRhdGEgPSBwYWNrZXQuZGF0YS5kYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiY29ubmVjdF9lcnJvclwiLCBlcnIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGEgc2VydmVyIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25ldmVudChwYWNrZXQpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHBhY2tldC5kYXRhIHx8IFtdO1xuICAgICAgICBkZWJ1ZyhcImVtaXR0aW5nIGV2ZW50ICVqXCIsIGFyZ3MpO1xuICAgICAgICBpZiAobnVsbCAhPSBwYWNrZXQuaWQpIHtcbiAgICAgICAgICAgIGRlYnVnKFwiYXR0YWNoaW5nIGFjayBjYWxsYmFjayB0byBldmVudFwiKTtcbiAgICAgICAgICAgIGFyZ3MucHVzaCh0aGlzLmFjayhwYWNrZXQuaWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdEV2ZW50KGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlQnVmZmVyLnB1c2goT2JqZWN0LmZyZWV6ZShhcmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW1pdEV2ZW50KGFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FueUxpc3RlbmVycyAmJiB0aGlzLl9hbnlMaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9hbnlMaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZW1pdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgaWYgKHRoaXMuX3BpZCAmJiBhcmdzLmxlbmd0aCAmJiB0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0T2Zmc2V0ID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2R1Y2VzIGFuIGFjayBjYWxsYmFjayB0byBlbWl0IHdpdGggYW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFjayhpZCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgbGV0IHNlbnQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAvLyBwcmV2ZW50IGRvdWJsZSBjYWxsYmFja3NcbiAgICAgICAgICAgIGlmIChzZW50KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgZGVidWcoXCJzZW5kaW5nIGFjayAlalwiLCBhcmdzKTtcbiAgICAgICAgICAgIHNlbGYucGFja2V0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBzb2NrZXRfaW9fcGFyc2VyXzEuUGFja2V0VHlwZS5BQ0ssXG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGFyZ3MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gYSBzZXJ2ZXIgYWNrbm93bGVkZ2VtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25hY2socGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGFjayA9IHRoaXMuYWNrc1twYWNrZXQuaWRdO1xuICAgICAgICBpZiAodHlwZW9mIGFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkZWJ1ZyhcImJhZCBhY2sgJXNcIiwgcGFja2V0LmlkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5hY2tzW3BhY2tldC5pZF07XG4gICAgICAgIGRlYnVnKFwiY2FsbGluZyBhY2sgJXMgd2l0aCAlalwiLCBwYWNrZXQuaWQsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGSVhNRSBhY2sgaXMgaW5jb3JyZWN0bHkgaW5mZXJyZWQgYXMgJ25ldmVyJ1xuICAgICAgICBpZiAoYWNrLndpdGhFcnJvcikge1xuICAgICAgICAgICAgcGFja2V0LmRhdGEudW5zaGlmdChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGFjay5hcHBseSh0aGlzLCBwYWNrZXQuZGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHNlcnZlciBjb25uZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmNvbm5lY3QoaWQsIHBpZCkge1xuICAgICAgICBkZWJ1ZyhcInNvY2tldCBjb25uZWN0ZWQgd2l0aCBpZCAlc1wiLCBpZCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5yZWNvdmVyZWQgPSBwaWQgJiYgdGhpcy5fcGlkID09PSBwaWQ7XG4gICAgICAgIHRoaXMuX3BpZCA9IHBpZDsgLy8gZGVmaW5lZCBvbmx5IGlmIGNvbm5lY3Rpb24gc3RhdGUgcmVjb3ZlcnkgaXMgZW5hYmxlZFxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZW1pdEJ1ZmZlcmVkKCk7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiY29ubmVjdFwiKTtcbiAgICAgICAgdGhpcy5fZHJhaW5RdWV1ZSh0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdCBidWZmZXJlZCBldmVudHMgKHJlY2VpdmVkIGFuZCBlbWl0dGVkKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZW1pdEJ1ZmZlcmVkKCkge1xuICAgICAgICB0aGlzLnJlY2VpdmVCdWZmZXIuZm9yRWFjaCgoYXJncykgPT4gdGhpcy5lbWl0RXZlbnQoYXJncykpO1xuICAgICAgICB0aGlzLnJlY2VpdmVCdWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5zZW5kQnVmZmVyLmZvckVhY2goKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlPdXRnb2luZ0xpc3RlbmVycyhwYWNrZXQpO1xuICAgICAgICAgICAgdGhpcy5wYWNrZXQocGFja2V0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBzZXJ2ZXIgZGlzY29ubmVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25kaXNjb25uZWN0KCkge1xuICAgICAgICBkZWJ1ZyhcInNlcnZlciBkaXNjb25uZWN0ICglcylcIiwgdGhpcy5uc3ApO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5vbmNsb3NlKFwiaW8gc2VydmVyIGRpc2Nvbm5lY3RcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGZvcmNlZCBjbGllbnQvc2VydmVyIHNpZGUgZGlzY29ubmVjdGlvbnMsXG4gICAgICogdGhpcyBtZXRob2QgZW5zdXJlcyB0aGUgbWFuYWdlciBzdG9wcyB0cmFja2luZyB1cyBhbmRcbiAgICAgKiB0aGF0IHJlY29ubmVjdGlvbnMgZG9uJ3QgZ2V0IHRyaWdnZXJlZCBmb3IgdGhpcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vicykge1xuICAgICAgICAgICAgLy8gY2xlYW4gc3Vic2NyaXB0aW9ucyB0byBhdm9pZCByZWNvbm5lY3Rpb25zXG4gICAgICAgICAgICB0aGlzLnN1YnMuZm9yRWFjaCgoc3ViRGVzdHJveSkgPT4gc3ViRGVzdHJveSgpKTtcbiAgICAgICAgICAgIHRoaXMuc3VicyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlvW1wiX2Rlc3Ryb3lcIl0odGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIHRoZSBzb2NrZXQgbWFudWFsbHkuIEluIHRoYXQgY2FzZSwgdGhlIHNvY2tldCB3aWxsIG5vdCB0cnkgdG8gcmVjb25uZWN0LlxuICAgICAqXG4gICAgICogSWYgdGhpcyBpcyB0aGUgbGFzdCBhY3RpdmUgU29ja2V0IGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgTWFuYWdlcn0sIHRoZSBsb3ctbGV2ZWwgY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAgICAgKlxuICAgICAqIHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKHJlYXNvbikgPT4ge1xuICAgICAqICAgLy8gY29uc29sZS5sb2cocmVhc29uKTsgcHJpbnRzIFwiaW8gY2xpZW50IGRpc2Nvbm5lY3RcIlxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc29ja2V0LmRpc2Nvbm5lY3QoKTtcbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgZGVidWcoXCJwZXJmb3JtaW5nIGRpc2Nvbm5lY3QgKCVzKVwiLCB0aGlzLm5zcCk7XG4gICAgICAgICAgICB0aGlzLnBhY2tldCh7IHR5cGU6IHNvY2tldF9pb19wYXJzZXJfMS5QYWNrZXRUeXBlLkRJU0NPTk5FQ1QgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVtb3ZlIHNvY2tldCBmcm9tIHBvb2xcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgLy8gZmlyZSBldmVudHNcbiAgICAgICAgICAgIHRoaXMub25jbG9zZShcImlvIGNsaWVudCBkaXNjb25uZWN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3Ige0BsaW5rIGRpc2Nvbm5lY3QoKX0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHNlbGZcbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb21wcmVzcyBmbGFnLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQuY29tcHJlc3MoZmFsc2UpLmVtaXQoXCJoZWxsb1wiKTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb21wcmVzcyAtIGlmIGB0cnVlYCwgY29tcHJlc3NlcyB0aGUgc2VuZGluZyBkYXRhXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICovXG4gICAgY29tcHJlc3MoY29tcHJlc3MpIHtcbiAgICAgICAgdGhpcy5mbGFncy5jb21wcmVzcyA9IGNvbXByZXNzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIG1vZGlmaWVyIGZvciBhIHN1YnNlcXVlbnQgZXZlbnQgZW1pc3Npb24gdGhhdCB0aGUgZXZlbnQgbWVzc2FnZSB3aWxsIGJlIGRyb3BwZWQgd2hlbiB0aGlzIHNvY2tldCBpcyBub3RcbiAgICAgKiByZWFkeSB0byBzZW5kIG1lc3NhZ2VzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQudm9sYXRpbGUuZW1pdChcImhlbGxvXCIpOyAvLyB0aGUgc2VydmVyIG1heSBvciBtYXkgbm90IHJlY2VpdmUgaXRcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHNlbGZcbiAgICAgKi9cbiAgICBnZXQgdm9sYXRpbGUoKSB7XG4gICAgICAgIHRoaXMuZmxhZ3Mudm9sYXRpbGUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIG1vZGlmaWVyIGZvciBhIHN1YnNlcXVlbnQgZXZlbnQgZW1pc3Npb24gdGhhdCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCBhbiBlcnJvciB3aGVuIHRoZVxuICAgICAqIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHdpdGhvdXQgYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlcjpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LnRpbWVvdXQoNTAwMCkuZW1pdChcIm15LWV2ZW50XCIsIChlcnIpID0+IHtcbiAgICAgKiAgIGlmIChlcnIpIHtcbiAgICAgKiAgICAgLy8gdGhlIHNlcnZlciBkaWQgbm90IGFja25vd2xlZGdlIHRoZSBldmVudCBpbiB0aGUgZ2l2ZW4gZGVsYXlcbiAgICAgKiAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHNlbGZcbiAgICAgKi9cbiAgICB0aW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5mbGFncy50aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBhbnkgZXZlbnQgaXMgZW1pdHRlZC4gVGhlIGV2ZW50IG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVcbiAgICAgKiBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0Lm9uQW55KChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coYGdvdCAke2V2ZW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyXG4gICAgICovXG4gICAgb25BbnkobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fYW55TGlzdGVuZXJzID0gdGhpcy5fYW55TGlzdGVuZXJzIHx8IFtdO1xuICAgICAgICB0aGlzLl9hbnlMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gYW55IGV2ZW50IGlzIGVtaXR0ZWQuIFRoZSBldmVudCBuYW1lIGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlXG4gICAgICogY2FsbGJhY2suIFRoZSBsaXN0ZW5lciBpcyBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC5wcmVwZW5kQW55KChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coYGdvdCBldmVudCAke2V2ZW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyXG4gICAgICovXG4gICAgcHJlcGVuZEFueShsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9hbnlMaXN0ZW5lcnMgPSB0aGlzLl9hbnlMaXN0ZW5lcnMgfHwgW107XG4gICAgICAgIHRoaXMuX2FueUxpc3RlbmVycy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGFueSBldmVudCBpcyBlbWl0dGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBjYXRjaEFsbExpc3RlbmVyID0gKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgZ290IGV2ZW50ICR7ZXZlbnR9YCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogc29ja2V0Lm9uQW55KGNhdGNoQWxsTGlzdGVuZXIpO1xuICAgICAqXG4gICAgICogLy8gcmVtb3ZlIGEgc3BlY2lmaWMgbGlzdGVuZXJcbiAgICAgKiBzb2NrZXQub2ZmQW55KGNhdGNoQWxsTGlzdGVuZXIpO1xuICAgICAqXG4gICAgICogLy8gb3IgcmVtb3ZlIGFsbCBsaXN0ZW5lcnNcbiAgICAgKiBzb2NrZXQub2ZmQW55KCk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBvZmZBbnkobGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9hbnlMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fYW55TGlzdGVuZXJzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgPT09IGxpc3RlbmVyc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hbnlMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBsaXN0ZW5lcnMgdGhhdCBhcmUgbGlzdGVuaW5nIGZvciBhbnkgZXZlbnQgdGhhdCBpcyBzcGVjaWZpZWQuIFRoaXMgYXJyYXkgY2FuIGJlIG1hbmlwdWxhdGVkLFxuICAgICAqIGUuZy4gdG8gcmVtb3ZlIGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICBsaXN0ZW5lcnNBbnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbnlMaXN0ZW5lcnMgfHwgW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBhbnkgZXZlbnQgaXMgZW1pdHRlZC4gVGhlIGV2ZW50IG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVcbiAgICAgKiBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIE5vdGU6IGFja25vd2xlZGdlbWVudHMgc2VudCB0byB0aGUgc2VydmVyIGFyZSBub3QgaW5jbHVkZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC5vbkFueU91dGdvaW5nKChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coYHNlbnQgZXZlbnQgJHtldmVudH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaXN0ZW5lclxuICAgICAqL1xuICAgIG9uQW55T3V0Z29pbmcobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMgPSB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyB8fCBbXTtcbiAgICAgICAgdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gYW55IGV2ZW50IGlzIGVtaXR0ZWQuIFRoZSBldmVudCBuYW1lIGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlXG4gICAgICogY2FsbGJhY2suIFRoZSBsaXN0ZW5lciBpcyBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkuXG4gICAgICpcbiAgICAgKiBOb3RlOiBhY2tub3dsZWRnZW1lbnRzIHNlbnQgdG8gdGhlIHNlcnZlciBhcmUgbm90IGluY2x1ZGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQucHJlcGVuZEFueU91dGdvaW5nKChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coYHNlbnQgZXZlbnQgJHtldmVudH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHByZXBlbmRBbnlPdXRnb2luZyhsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyA9IHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzIHx8IFtdO1xuICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGFueSBldmVudCBpcyBlbWl0dGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBjYXRjaEFsbExpc3RlbmVyID0gKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgc2VudCBldmVudCAke2V2ZW50fWApO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHNvY2tldC5vbkFueU91dGdvaW5nKGNhdGNoQWxsTGlzdGVuZXIpO1xuICAgICAqXG4gICAgICogLy8gcmVtb3ZlIGEgc3BlY2lmaWMgbGlzdGVuZXJcbiAgICAgKiBzb2NrZXQub2ZmQW55T3V0Z29pbmcoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyBvciByZW1vdmUgYWxsIGxpc3RlbmVyc1xuICAgICAqIHNvY2tldC5vZmZBbnlPdXRnb2luZygpO1xuICAgICAqXG4gICAgICogQHBhcmFtIFtsaXN0ZW5lcl0gLSB0aGUgY2F0Y2gtYWxsIGxpc3RlbmVyIChvcHRpb25hbClcbiAgICAgKi9cbiAgICBvZmZBbnlPdXRnb2luZyhsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIXRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgPT09IGxpc3RlbmVyc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBsaXN0ZW5pbmcgZm9yIGFueSBldmVudCB0aGF0IGlzIHNwZWNpZmllZC4gVGhpcyBhcnJheSBjYW4gYmUgbWFuaXB1bGF0ZWQsXG4gICAgICogZS5nLiB0byByZW1vdmUgbGlzdGVuZXJzLlxuICAgICAqL1xuICAgIGxpc3RlbmVyc0FueU91dGdvaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMgfHwgW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vdGlmeSB0aGUgbGlzdGVuZXJzIGZvciBlYWNoIHBhY2tldCBzZW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFja2V0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG5vdGlmeU91dGdvaW5nTGlzdGVuZXJzKHBhY2tldCkge1xuICAgICAgICBpZiAodGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMgJiYgdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycy5zbGljZSgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBwYWNrZXQuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLlNvY2tldCA9IFNvY2tldDtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51cmwgPSB2b2lkIDA7XG5jb25zdCBlbmdpbmVfaW9fY2xpZW50XzEgPSByZXF1aXJlKFwiZW5naW5lLmlvLWNsaWVudFwiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTsgLy8gZGVidWcoKVxuY29uc3QgZGVidWcgPSBkZWJ1Z18xLmRlZmF1bHQoXCJzb2NrZXQuaW8tY2xpZW50OnVybFwiKTsgLy8gZGVidWcoKVxuLyoqXG4gKiBVUkwgcGFyc2VyLlxuICpcbiAqIEBwYXJhbSB1cmkgLSB1cmxcbiAqIEBwYXJhbSBwYXRoIC0gdGhlIHJlcXVlc3QgcGF0aCBvZiB0aGUgY29ubmVjdGlvblxuICogQHBhcmFtIGxvYyAtIEFuIG9iamVjdCBtZWFudCB0byBtaW1pYyB3aW5kb3cubG9jYXRpb24uXG4gKiAgICAgICAgRGVmYXVsdHMgdG8gd2luZG93LmxvY2F0aW9uLlxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiB1cmwodXJpLCBwYXRoID0gXCJcIiwgbG9jKSB7XG4gICAgbGV0IG9iaiA9IHVyaTtcbiAgICAvLyBkZWZhdWx0IHRvIHdpbmRvdy5sb2NhdGlvblxuICAgIGxvYyA9IGxvYyB8fCAodHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiICYmIGxvY2F0aW9uKTtcbiAgICBpZiAobnVsbCA9PSB1cmkpXG4gICAgICAgIHVyaSA9IGxvYy5wcm90b2NvbCArIFwiLy9cIiArIGxvYy5ob3N0O1xuICAgIC8vIHJlbGF0aXZlIHBhdGggc3VwcG9ydFxuICAgIGlmICh0eXBlb2YgdXJpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmIChcIi9cIiA9PT0gdXJpLmNoYXJBdCgwKSkge1xuICAgICAgICAgICAgaWYgKFwiL1wiID09PSB1cmkuY2hhckF0KDEpKSB7XG4gICAgICAgICAgICAgICAgdXJpID0gbG9jLnByb3RvY29sICsgdXJpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXJpID0gbG9jLmhvc3QgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEvXihodHRwcz98d3NzPyk6XFwvXFwvLy50ZXN0KHVyaSkpIHtcbiAgICAgICAgICAgIGRlYnVnKFwicHJvdG9jb2wtbGVzcyB1cmwgJXNcIiwgdXJpKTtcbiAgICAgICAgICAgIGlmIChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgbG9jKSB7XG4gICAgICAgICAgICAgICAgdXJpID0gbG9jLnByb3RvY29sICsgXCIvL1wiICsgdXJpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXJpID0gXCJodHRwczovL1wiICsgdXJpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHBhcnNlXG4gICAgICAgIGRlYnVnKFwicGFyc2UgJXNcIiwgdXJpKTtcbiAgICAgICAgb2JqID0gZW5naW5lX2lvX2NsaWVudF8xLnBhcnNlKHVyaSk7XG4gICAgfVxuICAgIC8vIG1ha2Ugc3VyZSB3ZSB0cmVhdCBgbG9jYWxob3N0OjgwYCBhbmQgYGxvY2FsaG9zdGAgZXF1YWxseVxuICAgIGlmICghb2JqLnBvcnQpIHtcbiAgICAgICAgaWYgKC9eKGh0dHB8d3MpJC8udGVzdChvYmoucHJvdG9jb2wpKSB7XG4gICAgICAgICAgICBvYmoucG9ydCA9IFwiODBcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgvXihodHRwfHdzKXMkLy50ZXN0KG9iai5wcm90b2NvbCkpIHtcbiAgICAgICAgICAgIG9iai5wb3J0ID0gXCI0NDNcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvYmoucGF0aCA9IG9iai5wYXRoIHx8IFwiL1wiO1xuICAgIGNvbnN0IGlwdjYgPSBvYmouaG9zdC5pbmRleE9mKFwiOlwiKSAhPT0gLTE7XG4gICAgY29uc3QgaG9zdCA9IGlwdjYgPyBcIltcIiArIG9iai5ob3N0ICsgXCJdXCIgOiBvYmouaG9zdDtcbiAgICAvLyBkZWZpbmUgdW5pcXVlIGlkXG4gICAgb2JqLmlkID0gb2JqLnByb3RvY29sICsgXCI6Ly9cIiArIGhvc3QgKyBcIjpcIiArIG9iai5wb3J0ICsgcGF0aDtcbiAgICAvLyBkZWZpbmUgaHJlZlxuICAgIG9iai5ocmVmID1cbiAgICAgICAgb2JqLnByb3RvY29sICtcbiAgICAgICAgICAgIFwiOi8vXCIgK1xuICAgICAgICAgICAgaG9zdCArXG4gICAgICAgICAgICAobG9jICYmIGxvYy5wb3J0ID09PSBvYmoucG9ydCA/IFwiXCIgOiBcIjpcIiArIG9iai5wb3J0KTtcbiAgICByZXR1cm4gb2JqO1xufVxuZXhwb3J0cy51cmwgPSB1cmw7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVjb25zdHJ1Y3RQYWNrZXQgPSBleHBvcnRzLmRlY29uc3RydWN0UGFja2V0ID0gdm9pZCAwO1xuY29uc3QgaXNfYmluYXJ5X2pzXzEgPSByZXF1aXJlKFwiLi9pcy1iaW5hcnkuanNcIik7XG4vKipcbiAqIFJlcGxhY2VzIGV2ZXJ5IEJ1ZmZlciB8IEFycmF5QnVmZmVyIHwgQmxvYiB8IEZpbGUgaW4gcGFja2V0IHdpdGggYSBudW1iZXJlZCBwbGFjZWhvbGRlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0IC0gc29ja2V0LmlvIGV2ZW50IHBhY2tldFxuICogQHJldHVybiB7T2JqZWN0fSB3aXRoIGRlY29uc3RydWN0ZWQgcGFja2V0IGFuZCBsaXN0IG9mIGJ1ZmZlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gZGVjb25zdHJ1Y3RQYWNrZXQocGFja2V0KSB7XG4gICAgY29uc3QgYnVmZmVycyA9IFtdO1xuICAgIGNvbnN0IHBhY2tldERhdGEgPSBwYWNrZXQuZGF0YTtcbiAgICBjb25zdCBwYWNrID0gcGFja2V0O1xuICAgIHBhY2suZGF0YSA9IF9kZWNvbnN0cnVjdFBhY2tldChwYWNrZXREYXRhLCBidWZmZXJzKTtcbiAgICBwYWNrLmF0dGFjaG1lbnRzID0gYnVmZmVycy5sZW5ndGg7IC8vIG51bWJlciBvZiBiaW5hcnkgJ2F0dGFjaG1lbnRzJ1xuICAgIHJldHVybiB7IHBhY2tldDogcGFjaywgYnVmZmVyczogYnVmZmVycyB9O1xufVxuZXhwb3J0cy5kZWNvbnN0cnVjdFBhY2tldCA9IGRlY29uc3RydWN0UGFja2V0O1xuZnVuY3Rpb24gX2RlY29uc3RydWN0UGFja2V0KGRhdGEsIGJ1ZmZlcnMpIHtcbiAgICBpZiAoIWRhdGEpXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIGlmICgoMCwgaXNfYmluYXJ5X2pzXzEuaXNCaW5hcnkpKGRhdGEpKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0geyBfcGxhY2Vob2xkZXI6IHRydWUsIG51bTogYnVmZmVycy5sZW5ndGggfTtcbiAgICAgICAgYnVmZmVycy5wdXNoKGRhdGEpO1xuICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IG5ldyBBcnJheShkYXRhLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbmV3RGF0YVtpXSA9IF9kZWNvbnN0cnVjdFBhY2tldChkYXRhW2ldLCBidWZmZXJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3RGF0YTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgIShkYXRhIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBuZXdEYXRhW2tleV0gPSBfZGVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtrZXldLCBidWZmZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3RGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG4vKipcbiAqIFJlY29uc3RydWN0cyBhIGJpbmFyeSBwYWNrZXQgZnJvbSBpdHMgcGxhY2Vob2xkZXIgcGFja2V0IGFuZCBidWZmZXJzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhY2tldCAtIGV2ZW50IHBhY2tldCB3aXRoIHBsYWNlaG9sZGVyc1xuICogQHBhcmFtIHtBcnJheX0gYnVmZmVycyAtIGJpbmFyeSBidWZmZXJzIHRvIHB1dCBpbiBwbGFjZWhvbGRlciBwb3NpdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gcmVjb25zdHJ1Y3RlZCBwYWNrZXRcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gcmVjb25zdHJ1Y3RQYWNrZXQocGFja2V0LCBidWZmZXJzKSB7XG4gICAgcGFja2V0LmRhdGEgPSBfcmVjb25zdHJ1Y3RQYWNrZXQocGFja2V0LmRhdGEsIGJ1ZmZlcnMpO1xuICAgIGRlbGV0ZSBwYWNrZXQuYXR0YWNobWVudHM7IC8vIG5vIGxvbmdlciB1c2VmdWxcbiAgICByZXR1cm4gcGFja2V0O1xufVxuZXhwb3J0cy5yZWNvbnN0cnVjdFBhY2tldCA9IHJlY29uc3RydWN0UGFja2V0O1xuZnVuY3Rpb24gX3JlY29uc3RydWN0UGFja2V0KGRhdGEsIGJ1ZmZlcnMpIHtcbiAgICBpZiAoIWRhdGEpXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIGlmIChkYXRhICYmIGRhdGEuX3BsYWNlaG9sZGVyID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGlzSW5kZXhWYWxpZCA9IHR5cGVvZiBkYXRhLm51bSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgZGF0YS5udW0gPj0gMCAmJlxuICAgICAgICAgICAgZGF0YS5udW0gPCBidWZmZXJzLmxlbmd0aDtcbiAgICAgICAgaWYgKGlzSW5kZXhWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcnNbZGF0YS5udW1dOyAvLyBhcHByb3ByaWF0ZSBidWZmZXIgKHNob3VsZCBiZSBuYXR1cmFsIG9yZGVyIGFueXdheSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgYXR0YWNobWVudHNcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBfcmVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtpXSwgYnVmZmVycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgZGF0YVtrZXldID0gX3JlY29uc3RydWN0UGFja2V0KGRhdGFba2V5XSwgYnVmZmVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRGVjb2RlciA9IGV4cG9ydHMuRW5jb2RlciA9IGV4cG9ydHMuUGFja2V0VHlwZSA9IGV4cG9ydHMucHJvdG9jb2wgPSB2b2lkIDA7XG5jb25zdCBjb21wb25lbnRfZW1pdHRlcl8xID0gcmVxdWlyZShcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIik7XG5jb25zdCBiaW5hcnlfanNfMSA9IHJlcXVpcmUoXCIuL2JpbmFyeS5qc1wiKTtcbmNvbnN0IGlzX2JpbmFyeV9qc18xID0gcmVxdWlyZShcIi4vaXMtYmluYXJ5LmpzXCIpO1xuY29uc3QgZGVidWdfMSA9IHJlcXVpcmUoXCJkZWJ1Z1wiKTsgLy8gZGVidWcoKVxuY29uc3QgZGVidWcgPSAoMCwgZGVidWdfMS5kZWZhdWx0KShcInNvY2tldC5pby1wYXJzZXJcIik7IC8vIGRlYnVnKClcbi8qKlxuICogVGhlc2Ugc3RyaW5ncyBtdXN0IG5vdCBiZSB1c2VkIGFzIGV2ZW50IG5hbWVzLCBhcyB0aGV5IGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcuXG4gKi9cbmNvbnN0IFJFU0VSVkVEX0VWRU5UUyA9IFtcbiAgICBcImNvbm5lY3RcIixcbiAgICBcImNvbm5lY3RfZXJyb3JcIixcbiAgICBcImRpc2Nvbm5lY3RcIixcbiAgICBcImRpc2Nvbm5lY3RpbmdcIixcbiAgICBcIm5ld0xpc3RlbmVyXCIsXG4gICAgXCJyZW1vdmVMaXN0ZW5lclwiLCAvLyB1c2VkIGJ5IHRoZSBOb2RlLmpzIEV2ZW50RW1pdHRlclxuXTtcbi8qKlxuICogUHJvdG9jb2wgdmVyc2lvbi5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydHMucHJvdG9jb2wgPSA1O1xudmFyIFBhY2tldFR5cGU7XG4oZnVuY3Rpb24gKFBhY2tldFR5cGUpIHtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJDT05ORUNUXCJdID0gMF0gPSBcIkNPTk5FQ1RcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJESVNDT05ORUNUXCJdID0gMV0gPSBcIkRJU0NPTk5FQ1RcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJFVkVOVFwiXSA9IDJdID0gXCJFVkVOVFwiO1xuICAgIFBhY2tldFR5cGVbUGFja2V0VHlwZVtcIkFDS1wiXSA9IDNdID0gXCJBQ0tcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJDT05ORUNUX0VSUk9SXCJdID0gNF0gPSBcIkNPTk5FQ1RfRVJST1JcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJCSU5BUllfRVZFTlRcIl0gPSA1XSA9IFwiQklOQVJZX0VWRU5UXCI7XG4gICAgUGFja2V0VHlwZVtQYWNrZXRUeXBlW1wiQklOQVJZX0FDS1wiXSA9IDZdID0gXCJCSU5BUllfQUNLXCI7XG59KShQYWNrZXRUeXBlID0gZXhwb3J0cy5QYWNrZXRUeXBlIHx8IChleHBvcnRzLlBhY2tldFR5cGUgPSB7fSkpO1xuLyoqXG4gKiBBIHNvY2tldC5pbyBFbmNvZGVyIGluc3RhbmNlXG4gKi9cbmNsYXNzIEVuY29kZXIge1xuICAgIC8qKlxuICAgICAqIEVuY29kZXIgY29uc3RydWN0b3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlcGxhY2VyIC0gY3VzdG9tIHJlcGxhY2VyIHRvIHBhc3MgZG93biB0byBKU09OLnBhcnNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVwbGFjZXIpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgYSBwYWNrZXQgYXMgYSBzaW5nbGUgc3RyaW5nIGlmIG5vbi1iaW5hcnksIG9yIGFzIGFcbiAgICAgKiBidWZmZXIgc2VxdWVuY2UsIGRlcGVuZGluZyBvbiBwYWNrZXQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBwYWNrZXQgb2JqZWN0XG4gICAgICovXG4gICAgZW5jb2RlKG9iaikge1xuICAgICAgICBkZWJ1ZyhcImVuY29kaW5nIHBhY2tldCAlalwiLCBvYmopO1xuICAgICAgICBpZiAob2JqLnR5cGUgPT09IFBhY2tldFR5cGUuRVZFTlQgfHwgb2JqLnR5cGUgPT09IFBhY2tldFR5cGUuQUNLKSB7XG4gICAgICAgICAgICBpZiAoKDAsIGlzX2JpbmFyeV9qc18xLmhhc0JpbmFyeSkob2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZUFzQmluYXJ5KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogb2JqLnR5cGUgPT09IFBhY2tldFR5cGUuRVZFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gUGFja2V0VHlwZS5CSU5BUllfRVZFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogUGFja2V0VHlwZS5CSU5BUllfQUNLLFxuICAgICAgICAgICAgICAgICAgICBuc3A6IG9iai5uc3AsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG9iai5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBpZDogb2JqLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy5lbmNvZGVBc1N0cmluZyhvYmopXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIHBhY2tldCBhcyBzdHJpbmcuXG4gICAgICovXG4gICAgZW5jb2RlQXNTdHJpbmcob2JqKSB7XG4gICAgICAgIC8vIGZpcnN0IGlzIHR5cGVcbiAgICAgICAgbGV0IHN0ciA9IFwiXCIgKyBvYmoudHlwZTtcbiAgICAgICAgLy8gYXR0YWNobWVudHMgaWYgd2UgaGF2ZSB0aGVtXG4gICAgICAgIGlmIChvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfRVZFTlQgfHxcbiAgICAgICAgICAgIG9iai50eXBlID09PSBQYWNrZXRUeXBlLkJJTkFSWV9BQ0spIHtcbiAgICAgICAgICAgIHN0ciArPSBvYmouYXR0YWNobWVudHMgKyBcIi1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4gYC9gXG4gICAgICAgIC8vIHdlIGFwcGVuZCBpdCBmb2xsb3dlZCBieSBhIGNvbW1hIGAsYFxuICAgICAgICBpZiAob2JqLm5zcCAmJiBcIi9cIiAhPT0gb2JqLm5zcCkge1xuICAgICAgICAgICAgc3RyICs9IG9iai5uc3AgKyBcIixcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgaWRcbiAgICAgICAgaWYgKG51bGwgIT0gb2JqLmlkKSB7XG4gICAgICAgICAgICBzdHIgKz0gb2JqLmlkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGpzb24gZGF0YVxuICAgICAgICBpZiAobnVsbCAhPSBvYmouZGF0YSkge1xuICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KG9iai5kYXRhLCB0aGlzLnJlcGxhY2VyKTtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1ZyhcImVuY29kZWQgJWogYXMgJXNcIiwgb2JqLCBzdHIpO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgcGFja2V0IGFzICdidWZmZXIgc2VxdWVuY2UnIGJ5IHJlbW92aW5nIGJsb2JzLCBhbmRcbiAgICAgKiBkZWNvbnN0cnVjdGluZyBwYWNrZXQgaW50byBvYmplY3Qgd2l0aCBwbGFjZWhvbGRlcnMgYW5kXG4gICAgICogYSBsaXN0IG9mIGJ1ZmZlcnMuXG4gICAgICovXG4gICAgZW5jb2RlQXNCaW5hcnkob2JqKSB7XG4gICAgICAgIGNvbnN0IGRlY29uc3RydWN0aW9uID0gKDAsIGJpbmFyeV9qc18xLmRlY29uc3RydWN0UGFja2V0KShvYmopO1xuICAgICAgICBjb25zdCBwYWNrID0gdGhpcy5lbmNvZGVBc1N0cmluZyhkZWNvbnN0cnVjdGlvbi5wYWNrZXQpO1xuICAgICAgICBjb25zdCBidWZmZXJzID0gZGVjb25zdHJ1Y3Rpb24uYnVmZmVycztcbiAgICAgICAgYnVmZmVycy51bnNoaWZ0KHBhY2spOyAvLyBhZGQgcGFja2V0IGluZm8gdG8gYmVnaW5uaW5nIG9mIGRhdGEgbGlzdFxuICAgICAgICByZXR1cm4gYnVmZmVyczsgLy8gd3JpdGUgYWxsIHRoZSBidWZmZXJzXG4gICAgfVxufVxuZXhwb3J0cy5FbmNvZGVyID0gRW5jb2Rlcjtcbi8vIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NTExMjgxL2NoZWNrLWlmLWEtdmFsdWUtaXMtYW4tb2JqZWN0LWluLWphdmFzY3JpcHRcbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IFwiW29iamVjdCBPYmplY3RdXCI7XG59XG4vKipcbiAqIEEgc29ja2V0LmlvIERlY29kZXIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGRlY29kZXJcbiAqL1xuY2xhc3MgRGVjb2RlciBleHRlbmRzIGNvbXBvbmVudF9lbWl0dGVyXzEuRW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogRGVjb2RlciBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmV2aXZlciAtIGN1c3RvbSByZXZpdmVyIHRvIHBhc3MgZG93biB0byBKU09OLnN0cmluZ2lmeVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJldml2ZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZXZpdmVyID0gcmV2aXZlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVjb2RlcyBhbiBlbmNvZGVkIHBhY2tldCBzdHJpbmcgaW50byBwYWNrZXQgSlNPTi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvYmogLSBlbmNvZGVkIHBhY2tldFxuICAgICAqL1xuICAgIGFkZChvYmopIHtcbiAgICAgICAgbGV0IHBhY2tldDtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnb3QgcGxhaW50ZXh0IGRhdGEgd2hlbiByZWNvbnN0cnVjdGluZyBhIHBhY2tldFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhY2tldCA9IHRoaXMuZGVjb2RlU3RyaW5nKG9iaik7XG4gICAgICAgICAgICBjb25zdCBpc0JpbmFyeUV2ZW50ID0gcGFja2V0LnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0VWRU5UO1xuICAgICAgICAgICAgaWYgKGlzQmluYXJ5RXZlbnQgfHwgcGFja2V0LnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0FDSykge1xuICAgICAgICAgICAgICAgIHBhY2tldC50eXBlID0gaXNCaW5hcnlFdmVudCA/IFBhY2tldFR5cGUuRVZFTlQgOiBQYWNrZXRUeXBlLkFDSztcbiAgICAgICAgICAgICAgICAvLyBiaW5hcnkgcGFja2V0J3MganNvblxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25zdHJ1Y3RvciA9IG5ldyBCaW5hcnlSZWNvbnN0cnVjdG9yKHBhY2tldCk7XG4gICAgICAgICAgICAgICAgLy8gbm8gYXR0YWNobWVudHMsIGxhYmVsZWQgYmluYXJ5IGJ1dCBubyBiaW5hcnkgZGF0YSB0byBmb2xsb3dcbiAgICAgICAgICAgICAgICBpZiAocGFja2V0LmF0dGFjaG1lbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyLmVtaXRSZXNlcnZlZChcImRlY29kZWRcIiwgcGFja2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBub24tYmluYXJ5IGZ1bGwgcGFja2V0XG4gICAgICAgICAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZGVjb2RlZFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCgwLCBpc19iaW5hcnlfanNfMS5pc0JpbmFyeSkob2JqKSB8fCBvYmouYmFzZTY0KSB7XG4gICAgICAgICAgICAvLyByYXcgYmluYXJ5IGRhdGFcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ290IGJpbmFyeSBkYXRhIHdoZW4gbm90IHJlY29uc3RydWN0aW5nIGEgcGFja2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5yZWNvbnN0cnVjdG9yLnRha2VCaW5hcnlEYXRhKG9iaik7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlZCBmaW5hbCBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZGVjb2RlZFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdHlwZTogXCIgKyBvYmopO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBhIHBhY2tldCBTdHJpbmcgKEpTT04gZGF0YSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHBhY2tldFxuICAgICAqL1xuICAgIGRlY29kZVN0cmluZyhzdHIpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAvLyBsb29rIHVwIHR5cGVcbiAgICAgICAgY29uc3QgcCA9IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcihzdHIuY2hhckF0KDApKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFBhY2tldFR5cGVbcC50eXBlXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHBhY2tldCB0eXBlIFwiICsgcC50eXBlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rIHVwIGF0dGFjaG1lbnRzIGlmIHR5cGUgYmluYXJ5XG4gICAgICAgIGlmIChwLnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0VWRU5UIHx8XG4gICAgICAgICAgICBwLnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0FDSykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChzdHIuY2hhckF0KCsraSkgIT09IFwiLVwiICYmIGkgIT0gc3RyLmxlbmd0aCkgeyB9XG4gICAgICAgICAgICBjb25zdCBidWYgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKTtcbiAgICAgICAgICAgIGlmIChidWYgIT0gTnVtYmVyKGJ1ZikgfHwgc3RyLmNoYXJBdChpKSAhPT0gXCItXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIGF0dGFjaG1lbnRzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcC5hdHRhY2htZW50cyA9IE51bWJlcihidWYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGxvb2sgdXAgbmFtZXNwYWNlIChpZiBhbnkpXG4gICAgICAgIGlmIChcIi9cIiA9PT0gc3RyLmNoYXJBdChpICsgMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKFwiLFwiID09PSBjKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLm5zcCA9IHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcC5uc3AgPSBcIi9cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rIHVwIGlkXG4gICAgICAgIGNvbnN0IG5leHQgPSBzdHIuY2hhckF0KGkgKyAxKTtcbiAgICAgICAgaWYgKFwiXCIgIT09IG5leHQgJiYgTnVtYmVyKG5leHQpID09IG5leHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gYyB8fCBOdW1iZXIoYykgIT0gYykge1xuICAgICAgICAgICAgICAgICAgICAtLWk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLmlkID0gTnVtYmVyKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9vayB1cCBqc29uIGRhdGFcbiAgICAgICAgaWYgKHN0ci5jaGFyQXQoKytpKSkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudHJ5UGFyc2Uoc3RyLnN1YnN0cihpKSk7XG4gICAgICAgICAgICBpZiAoRGVjb2Rlci5pc1BheWxvYWRWYWxpZChwLnR5cGUsIHBheWxvYWQpKSB7XG4gICAgICAgICAgICAgICAgcC5kYXRhID0gcGF5bG9hZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgcGF5bG9hZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWJ1ZyhcImRlY29kZWQgJXMgYXMgJWpcIiwgc3RyLCBwKTtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIHRyeVBhcnNlKHN0cikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyLCB0aGlzLnJldml2ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGlzUGF5bG9hZFZhbGlkKHR5cGUsIHBheWxvYWQpIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQ09OTkVDVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNPYmplY3QocGF5bG9hZCk7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuRElTQ09OTkVDVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZCA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY2FzZSBQYWNrZXRUeXBlLkNPTk5FQ1RfRVJST1I6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiIHx8IGlzT2JqZWN0KHBheWxvYWQpO1xuICAgICAgICAgICAgY2FzZSBQYWNrZXRUeXBlLkVWRU5UOlxuICAgICAgICAgICAgY2FzZSBQYWNrZXRUeXBlLkJJTkFSWV9FVkVOVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkocGF5bG9hZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBwYXlsb2FkWzBdID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHBheWxvYWRbMF0gPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNFUlZFRF9FVkVOVFMuaW5kZXhPZihwYXlsb2FkWzBdKSA9PT0gLTEpKSk7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQUNLOlxuICAgICAgICAgICAgY2FzZSBQYWNrZXRUeXBlLkJJTkFSWV9BQ0s6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVhbGxvY2F0ZXMgYSBwYXJzZXIncyByZXNvdXJjZXNcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5yZWNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnJlY29uc3RydWN0b3IuZmluaXNoZWRSZWNvbnN0cnVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuRGVjb2RlciA9IERlY29kZXI7XG4vKipcbiAqIEEgbWFuYWdlciBvZiBhIGJpbmFyeSBldmVudCdzICdidWZmZXIgc2VxdWVuY2UnLiBTaG91bGRcbiAqIGJlIGNvbnN0cnVjdGVkIHdoZW5ldmVyIGEgcGFja2V0IG9mIHR5cGUgQklOQVJZX0VWRU5UIGlzXG4gKiBkZWNvZGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXRcbiAqIEByZXR1cm4ge0JpbmFyeVJlY29uc3RydWN0b3J9IGluaXRpYWxpemVkIHJlY29uc3RydWN0b3JcbiAqL1xuY2xhc3MgQmluYXJ5UmVjb25zdHJ1Y3RvciB7XG4gICAgY29uc3RydWN0b3IocGFja2V0KSB7XG4gICAgICAgIHRoaXMucGFja2V0ID0gcGFja2V0O1xuICAgICAgICB0aGlzLmJ1ZmZlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5yZWNvblBhY2sgPSBwYWNrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ldGhvZCB0byBiZSBjYWxsZWQgd2hlbiBiaW5hcnkgZGF0YSByZWNlaXZlZCBmcm9tIGNvbm5lY3Rpb25cbiAgICAgKiBhZnRlciBhIEJJTkFSWV9FVkVOVCBwYWNrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0J1ZmZlciB8IEFycmF5QnVmZmVyfSBiaW5EYXRhIC0gdGhlIHJhdyBiaW5hcnkgZGF0YSByZWNlaXZlZFxuICAgICAqIEByZXR1cm4ge251bGwgfCBPYmplY3R9IHJldHVybnMgbnVsbCBpZiBtb3JlIGJpbmFyeSBkYXRhIGlzIGV4cGVjdGVkIG9yXG4gICAgICogICBhIHJlY29uc3RydWN0ZWQgcGFja2V0IG9iamVjdCBpZiBhbGwgYnVmZmVycyBoYXZlIGJlZW4gcmVjZWl2ZWQuXG4gICAgICovXG4gICAgdGFrZUJpbmFyeURhdGEoYmluRGF0YSkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMucHVzaChiaW5EYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVycy5sZW5ndGggPT09IHRoaXMucmVjb25QYWNrLmF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgICAvLyBkb25lIHdpdGggYnVmZmVyIGxpc3RcbiAgICAgICAgICAgIGNvbnN0IHBhY2tldCA9ICgwLCBiaW5hcnlfanNfMS5yZWNvbnN0cnVjdFBhY2tldCkodGhpcy5yZWNvblBhY2ssIHRoaXMuYnVmZmVycyk7XG4gICAgICAgICAgICB0aGlzLmZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFucyB1cCBiaW5hcnkgcGFja2V0IHJlY29uc3RydWN0aW9uIHZhcmlhYmxlcy5cbiAgICAgKi9cbiAgICBmaW5pc2hlZFJlY29uc3RydWN0aW9uKCkge1xuICAgICAgICB0aGlzLnJlY29uUGFjayA9IG51bGw7XG4gICAgICAgIHRoaXMuYnVmZmVycyA9IFtdO1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5oYXNCaW5hcnkgPSBleHBvcnRzLmlzQmluYXJ5ID0gdm9pZCAwO1xuY29uc3Qgd2l0aE5hdGl2ZUFycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyID09PSBcImZ1bmN0aW9uXCI7XG5jb25zdCBpc1ZpZXcgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IEFycmF5QnVmZmVyLmlzVmlldyhvYmopXG4gICAgICAgIDogb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyO1xufTtcbmNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbmNvbnN0IHdpdGhOYXRpdmVCbG9iID0gdHlwZW9mIEJsb2IgPT09IFwiZnVuY3Rpb25cIiB8fFxuICAgICh0eXBlb2YgQmxvYiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0b1N0cmluZy5jYWxsKEJsb2IpID09PSBcIltvYmplY3QgQmxvYkNvbnN0cnVjdG9yXVwiKTtcbmNvbnN0IHdpdGhOYXRpdmVGaWxlID0gdHlwZW9mIEZpbGUgPT09IFwiZnVuY3Rpb25cIiB8fFxuICAgICh0eXBlb2YgRmlsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0b1N0cmluZy5jYWxsKEZpbGUpID09PSBcIltvYmplY3QgRmlsZUNvbnN0cnVjdG9yXVwiKTtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIG9iaiBpcyBhIEJ1ZmZlciwgYW4gQXJyYXlCdWZmZXIsIGEgQmxvYiBvciBhIEZpbGUuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNCaW5hcnkob2JqKSB7XG4gICAgcmV0dXJuICgod2l0aE5hdGl2ZUFycmF5QnVmZmVyICYmIChvYmogaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBpc1ZpZXcob2JqKSkpIHx8XG4gICAgICAgICh3aXRoTmF0aXZlQmxvYiAmJiBvYmogaW5zdGFuY2VvZiBCbG9iKSB8fFxuICAgICAgICAod2l0aE5hdGl2ZUZpbGUgJiYgb2JqIGluc3RhbmNlb2YgRmlsZSkpO1xufVxuZXhwb3J0cy5pc0JpbmFyeSA9IGlzQmluYXJ5O1xuZnVuY3Rpb24gaGFzQmluYXJ5KG9iaiwgdG9KU09OKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaGFzQmluYXJ5KG9ialtpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc0JpbmFyeShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAob2JqLnRvSlNPTiAmJlxuICAgICAgICB0eXBlb2Ygb2JqLnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGhhc0JpbmFyeShvYmoudG9KU09OKCksIHRydWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkgJiYgaGFzQmluYXJ5KG9ialtrZXldKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5oYXNCaW5hcnkgPSBoYXNCaW5hcnk7XG4iLCIvKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYEVtaXR0ZXJgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufVxuXG4vKipcbiAqIE1peGluIHRoZSBlbWl0dGVyIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWl4aW4ob2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBFbWl0dGVyLnByb3RvdHlwZSkge1xuICAgIG9ialtrZXldID0gRW1pdHRlci5wcm90b3R5cGVba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIExpc3RlbiBvbiB0aGUgZ2l2ZW4gYGV2ZW50YCB3aXRoIGBmbmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUub24gPVxuRW1pdHRlci5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcbiAgKHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdKVxuICAgIC5wdXNoKGZuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFkZHMgYW4gYGV2ZW50YCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBhIHNpbmdsZVxuICogdGltZSB0aGVuIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcbiAgZnVuY3Rpb24gb24oKSB7XG4gICAgdGhpcy5vZmYoZXZlbnQsIG9uKTtcbiAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgb24uZm4gPSBmbjtcbiAgdGhpcy5vbihldmVudCwgb24pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgYGV2ZW50YCBvciBhbGxcbiAqIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLm9mZiA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICAvLyBhbGxcbiAgaWYgKDAgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHRoaXMuX2NhbGxiYWNrcyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG4gIGlmICghY2FsbGJhY2tzKSByZXR1cm4gdGhpcztcblxuICAvLyByZW1vdmUgYWxsIGhhbmRsZXJzXG4gIGlmICgxID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHJlbW92ZSBzcGVjaWZpYyBoYW5kbGVyXG4gIHZhciBjYjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICBjYiA9IGNhbGxiYWNrc1tpXTtcbiAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xuICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSBldmVudCBzcGVjaWZpYyBhcnJheXMgZm9yIGV2ZW50IHR5cGVzIHRoYXQgbm9cbiAgLy8gb25lIGlzIHN1YnNjcmliZWQgZm9yIHRvIGF2b2lkIG1lbW9yeSBsZWFrLlxuICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtNaXhlZH0gLi4uXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSlcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgfVxuXG4gIGlmIChjYWxsYmFja3MpIHtcbiAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgY2FsbGJhY2tzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gYWxpYXMgdXNlZCBmb3IgcmVzZXJ2ZWQgZXZlbnRzIChwcm90ZWN0ZWQgbWV0aG9kKVxuRW1pdHRlci5wcm90b3R5cGUuZW1pdFJlc2VydmVkID0gRW1pdHRlci5wcm90b3R5cGUuZW1pdDtcblxuLyoqXG4gKiBSZXR1cm4gYXJyYXkgb2YgY2FsbGJhY2tzIGZvciBgZXZlbnRgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBlbWl0dGVyIGhhcyBgZXZlbnRgIGhhbmRsZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUuaGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xuICByZXR1cm4gISEgdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aDtcbn07XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IHsgSG90U3RhcSwgSG90U3RhcnRPcHRpb25zLCBJSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdFNpdGUsIEhvdFNpdGVSb3V0ZSwgSG90U2l0ZU1hcFBhdGggfSBmcm9tIFwiLi9Ib3RTaXRlXCI7XG5pbXBvcnQgeyBIb3QsIERldmVsb3Blck1vZGUgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdEFzc2V0IH0gZnJvbSBcIi4vSG90QXNzZXRcIjtcbmltcG9ydCB7IEhvdE1vZHVsZSB9IGZyb20gXCIuL0hvdE1vZHVsZVwiO1xuaW1wb3J0IHsgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQsIElIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5pbXBvcnQgeyBIb3RMb2csIEhvdExvZ0xldmVsIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5pbXBvcnQgeyBIb3RQYWdlIH0gZnJvbSBcIi4vSG90UGFnZVwiO1xuXG4vLyBTZXJ2ZXIgc3R1ZmZcbmltcG9ydCB7IEhvdEFQSSwgRXZlbnRFeGVjdXRpb25UeXBlLCBBUEl0b0xvYWQgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBIb3RFdmVudE1ldGhvZCwgU2VydmVyUmVxdWVzdCwgUGFzc1R5cGUsIEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdFNlcnZlciwgSG90U2VydmVyVHlwZSB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgSG90Q2xpZW50IH0gZnJvbSBcIi4vSG90Q2xpZW50XCI7XG5cbmltcG9ydCB7IEhvdFdlYlNvY2tldENsaWVudCB9IGZyb20gXCIuL0hvdFdlYlNvY2tldENsaWVudFwiO1xuXG4vLyBUZXN0aW5nIHN0dWZmXG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSUhvdFRlc3RFbGVtZW50LCBIb3RUZXN0RWxlbWVudCwgSG90VGVzdEVsZW1lbnRPcHRpb25zLCBJSG90VGVzdEVsZW1lbnRPcHRpb25zIH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcbmltcG9ydCB7IEhvdFRlc3RlciB9IGZyb20gXCIuL0hvdFRlc3RlclwiO1xuaW1wb3J0IHsgSG90VGVzdFN0b3AgfSBmcm9tIFwiLi9Ib3RUZXN0U3RvcFwiO1xuaW1wb3J0IHsgSG90RGVzdGluYXRpb24gfSBmcm9tIFwiLi9Ib3REZXN0aW5hdGlvblwiO1xuLy9pbXBvcnQgeyBIb3RUZXN0ZXJNb2NoYSB9IGZyb20gXCIuL0hvdFRlc3Rlck1vY2hhXCI7XG4vL2ltcG9ydCB7IEhvdFRlc3Rlck1vY2hhU2VsZW5pdW0gfSBmcm9tIFwiLi9Ib3RUZXN0ZXJNb2NoYVNlbGVuaXVtXCI7XG5pbXBvcnQgeyBIb3RUZXN0ZXJBUEkgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJBUElcIjtcbmltcG9ydCB7IEhvdFRlc3RNYXAsIEhvdFRlc3RQYXRoIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuaW1wb3J0IHsgSG90VGVzdERlc3RpbmF0aW9uIH0gZnJvbSBcIi4vSG90VGVzdERlc3RpbmF0aW9uXCI7XG5pbXBvcnQgeyBIb3RUZXN0UGFnZSB9IGZyb20gXCIuL0hvdFRlc3RQYWdlXCI7XG5cbkhvdFN0YXEuaXNXZWIgPSB0cnVlO1xuXG4vLyBDYW4ndCBleHBvcnQgaW50ZXJmYWNlcyBmcm9tIGhlcmUgOihcblxuZXhwb3J0IHtcbiAgICBIb3RTdGFxLCBIb3RTdGFydE9wdGlvbnMsIElIb3RTdGFxLCBcbiAgICBIb3RTaXRlLCBIb3RTaXRlUm91dGUsIEhvdFNpdGVNYXBQYXRoLCBcbiAgICBIb3QsXG4gICAgSG90TW9kdWxlLFxuICAgIEhvdEFzc2V0LFxuICAgIERldmVsb3Blck1vZGUsXG4gICAgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQsIElIb3RDb21wb25lbnQsIFxuICAgIEhvdEFQSSxcbiAgICBFdmVudEV4ZWN1dGlvblR5cGUsIEFQSXRvTG9hZCwgXG4gICAgSG90RmlsZSxcbiAgICBIb3RMb2csXG4gICAgSG90TG9nTGV2ZWwsXG4gICAgSG90UGFnZSxcbiAgICBIb3RSb3V0ZSxcbiAgICBIb3RSb3V0ZU1ldGhvZCxcbiAgICBIb3RFdmVudE1ldGhvZCxcbiAgICBTZXJ2ZXJSZXF1ZXN0LCBQYXNzVHlwZSwgSG90Um91dGVNZXRob2RQYXJhbWV0ZXIsIFxuICAgIEhvdFNlcnZlcixcbiAgICBIb3RTZXJ2ZXJUeXBlLFxuICAgIEhvdENsaWVudCxcbiAgICBIb3RXZWJTb2NrZXRDbGllbnQsXG4gICAgSG90VGVzdGVyLCBIb3RUZXN0U3RvcCwgSG90RGVzdGluYXRpb24sIFxuICAgIEhvdFRlc3RlckFQSSxcbiAgICBIb3RUZXN0TWFwLCBIb3RUZXN0UGF0aCwgXG4gICAgSG90VGVzdERlc3RpbmF0aW9uLCBIb3RUZXN0UGFnZSwgXG4gICAgSG90VGVzdEVsZW1lbnQsXG4gICAgSUhvdFRlc3RFbGVtZW50LCBIb3RUZXN0RWxlbWVudE9wdGlvbnMsIElIb3RUZXN0RWxlbWVudE9wdGlvbnMsIFxuICAgIEhvdFRlc3REcml2ZXJcbn07Il0sIm5hbWVzIjpbImV4cG9ydHMiLCJmb3JtYXRBcmdzIiwiYXJncyIsInRoaXMiLCJ1c2VDb2xvcnMiLCJuYW1lc3BhY2UiLCJtb2R1bGUiLCJodW1hbml6ZSIsImRpZmYiLCJjIiwiY29sb3IiLCJzcGxpY2UiLCJpbmRleCIsImxhc3RDIiwicmVwbGFjZSIsIm1hdGNoIiwic2F2ZSIsIm5hbWVzcGFjZXMiLCJzdG9yYWdlIiwic2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlcnJvciIsImxvYWQiLCJyIiwiZ2V0SXRlbSIsInByb2Nlc3MiLCJlbnYiLCJERUJVRyIsIndpbmRvdyIsInR5cGUiLCJfX253anMiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ0b0xvd2VyQ2FzZSIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iiwic3R5bGUiLCJXZWJraXRBcHBlYXJhbmNlIiwiY29uc29sZSIsImZpcmVidWciLCJleGNlcHRpb24iLCJ0YWJsZSIsInBhcnNlSW50IiwiUmVnRXhwIiwiJDEiLCJsb2NhbFN0b3JhZ2UiLCJsb2NhbHN0b3JhZ2UiLCJkZXN0cm95Iiwid2FybmVkIiwid2FybiIsImNvbG9ycyIsImxvZyIsImRlYnVnIiwiZm9ybWF0dGVycyIsImoiLCJ2IiwiSlNPTiIsInN0cmluZ2lmeSIsIm1lc3NhZ2UiLCJjcmVhdGVEZWJ1ZyIsInByZXZUaW1lIiwibmFtZXNwYWNlc0NhY2hlIiwiZW5hYmxlZENhY2hlIiwiZW5hYmxlT3ZlcnJpZGUiLCJlbmFibGVkIiwic2VsZiIsImN1cnIiLCJOdW1iZXIiLCJEYXRlIiwibXMiLCJwcmV2IiwiY29lcmNlIiwidW5zaGlmdCIsImZvcm1hdCIsImZvcm1hdHRlciIsInZhbCIsImNhbGwiLCJhcHBseSIsInNlbGVjdENvbG9yIiwiZXh0ZW5kIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwiZ2V0Iiwic2V0IiwiaW5pdCIsImRlbGltaXRlciIsIm5ld0RlYnVnIiwidG9OYW1lc3BhY2UiLCJyZWdleHAiLCJ0b1N0cmluZyIsInN1YnN0cmluZyIsImxlbmd0aCIsImRlZmF1bHQiLCJFcnJvciIsInN0YWNrIiwiZGlzYWJsZSIsIm5hbWVzIiwibWFwIiwic2tpcHMiLCJqb2luIiwiZW5hYmxlIiwiaSIsInNwbGl0IiwibGVuIiwicHVzaCIsInNsaWNlIiwibmFtZSIsInRlc3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImhhc2giLCJjaGFyQ29kZUF0IiwiTWF0aCIsImFicyIsImFzc2lnbiIsInRhcmdldCIsImFyZ3VtZW50cyIsInNvdXJjZSIsImNvbnZlcnRlciIsImRlZmF1bHRBdHRyaWJ1dGVzIiwidmFsdWUiLCJhdHRyaWJ1dGVzIiwiZXhwaXJlcyIsIm5vdyIsInRvVVRDU3RyaW5nIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwic3RyaW5naWZpZWRBdHRyaWJ1dGVzIiwiYXR0cmlidXRlTmFtZSIsImNvb2tpZSIsIndyaXRlIiwiY3JlYXRlIiwiY29va2llcyIsImphciIsInBhcnRzIiwiZm91bmRLZXkiLCJyZWFkIiwiZSIsInJlbW92ZSIsIndpdGhBdHRyaWJ1dGVzIiwid2l0aENvbnZlcnRlciIsImZyZWV6ZSIsInBhdGgiLCJmYWN0b3J5IiwicyIsIm0iLCJoIiwiZCIsInciLCJwbHVyYWwiLCJtc0FicyIsIm4iLCJpc1BsdXJhbCIsInJvdW5kIiwib3B0aW9ucyIsInN0ciIsIlN0cmluZyIsImV4ZWMiLCJwYXJzZUZsb2F0IiwicGFyc2UiLCJpc0Zpbml0ZSIsImxvbmciLCJmbXRTaG9ydCIsIkRldmVsb3Blck1vZGUiLCJIb3QiLCJnZXRVcmxQYXJhbSIsInBhcmFtIiwidmFsaWRhdGlvbiIsIlVSTFNlYXJjaFBhcmFtcyIsImxvY2F0aW9uIiwic2VhcmNoIiwiaW5kZXhPZiIsIm51bUNoYXJzIiwiaW5jbHVkZSIsImZpbGUiLCJIb3RTdGFxIiwiaXNXZWIiLCJsb3dlckZpbGUiLCJlY2hvIiwiZ2V0RmlsZSIsImluY2x1ZGVKUyIsInBhcmVudE9iamVjdCIsIm91dHB1dCIsImciLCJGdW5jdGlvbiIsImltcG9ydCIsIm1vZHVsZU5hbWUiLCJmb3VuZE1vZHVsZSIsIkN1cnJlbnRQYWdlIiwicHJvY2Vzc29yIiwiZ2V0TW9kdWxlIiwibmV3TW9kdWxlIiwibG9hZEhUTUwiLCJhZGRNb2R1bGUiLCJydW5GaWxlIiwiZmlsZU5hbWUiLCJ0ZW1wRmlsZSIsInBhZ2UiLCJjb250ZW50IiwiSG90RmlsZSIsInVybCIsImxvY2FsRmlsZSIsImNoZWNrRmlsZSIsImFwaUNhbGwiLCJyb3V0ZSIsImRhdGEiLCJodHRwTWV0aG9kIiwiSG90RXZlbnRNZXRob2QiLCJQT1NUIiwiZmlsZXMiLCJiZWFyZXJUb2tlbiIsInJlc3VsdCIsImFwaSIsIm1ha2VDYWxsIiwiZ2V0SlNPTiIsImpzb25SZXF1ZXN0IiwiR0VUIiwiZmV0Y2hPYmoiLCJoZWFkZXJzIiwicmVzIiwib2siLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwianNvbiIsImV4IiwiaHR0cFJlcXVlc3QiLCJudW1GaWxlcyIsImh0dHBNZXRob2RMb3dlciIsIkZJTEVfVVBMT0FEIiwidXBsb2FkRmlsZSIsImZvcm1EYXRhIiwiYXBwZW5kIiwicmVxdWVzdEluaXQiLCJtZXRob2QiLCJib2R5IiwianNvblJlcyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidGhlbiIsImpzb25PYmoiLCJjYXRjaCIsInJlYXNvbiIsIk91dHB1dCIsImRpc3BsYXlDU1MiLCJpSWR4IiwiQ1NTIiwiY3NzRmlsZSIsImNzc091dCIsImNzc1N0ciIsImRpc3BsYXlKU0ZpbGVzIiwiSlNGaWxlcyIsImpzRmlsZSIsImpzRmlsZU91dCIsImpzRmlsZVN0ciIsImRpc3BsYXlKU1NjcmlwdHMiLCJKU1NjcmlwdHMiLCJqc1NjcmlwdCIsImpzU2NyaXB0T3V0IiwianNTY3JpcHRzU3RyIiwiQXJndW1lbnRzIiwiSG90VGVzdEVsZW1lbnQiLCJNb2RlIiwiUHJvZHVjdGlvbiIsIkFQSSIsIlRlc3RlckFQSSIsIkRhdGEiLCJDb29raWVzIiwiUHVibGljS2V5cyIsIkV2ZW50RXhlY3V0aW9uVHlwZSIsImNvbnN0cnVjdG9yIiwiYmFzZVVybCIsImNvbm5lY3Rpb24iLCJkYiIsImRlc2NyaXB0aW9uIiwiY3JlYXRlRnVuY3Rpb25zIiwiZXhlY3V0ZUV2ZW50c1VzaW5nIiwiSG90Um91dGUiLCJvcGVuQVBJIiwidXNlckF1dGgiLCJyb3V0ZXMiLCJvblByZVJlZ2lzdGVyIiwib25Qb3N0UmVnaXN0ZXIiLCJzZXREQlNjaGVtYSIsInNjaGVtYSIsImdldERCIiwiZ2V0REJTY2hlbWEiLCJhZGRSb3V0ZSIsInJvdXRlTWV0aG9kIiwiZXhlY3V0ZUZ1bmN0aW9uIiwicm91dGVOYW1lIiwiYWRkTWV0aG9kIiwiSG90Um91dGVNZXRob2QiLCJjcmVhdGVBUElSb3V0ZU1ldGhvZHMiLCJuZXdSb3V0ZSIsIm1ldGhvZHMiLCJuZXdSb3V0ZU1ldGhvZCIsImdldFJvdXRlVXJsIiwicmVnaXN0ZXJSb3V0ZSIsIkhvdFNlcnZlciIsInJlZ2lzdGVyUm91dGVzIiwidG9VcHBlckNhc2UiLCJzdWJzdHIiLCJlc2NhcGVkQ29udGVudCIsImZpbGVVcmwiLCJmaWxlQ29udGVudCIsInRlc3RlckFQSSIsIkhvdFNlcnZlclR5cGUiLCJIVFRQIiwibG9nZ2VyIiwiY29weSIsImh0bWxFbGVtZW50cyIsInRhZyIsImVsZW1lbnRPcHRpb25zIiwidW5kZWZpbmVkIiwib2JzZXJ2ZWRBdHRyaWJ1dGVzIiwiaW5uZXIiLCJldmVudHMiLCJvbkNyZWF0ZWQiLCJlbGVtZW50IiwidGhyb3dBbGxFcnJvcnMiLCJzZXRDb250ZW50IiwiZ2V0Q29udGVudCIsImh0dHBHZXQiLCJ0ZXh0IiwibG9hZFVybCIsImxvYWRMb2NhbEZpbGUiLCJmcyIsInJlYWRGaWxlIiwiZXJyIiwicHJvY2Vzc0NvbnRlbnQiLCJjb250ZW50UmVnZXgiLCJjb250ZW50UHJvY2Vzc29yIiwib2ZmQ29udGVudFByb2Nlc3NvciIsIm51bVJlbW92ZUZyb21CZWdpbm5pbmciLCJudW1SZW1vdmVGcm9tRW5kIiwicHJldmlvdXNJbmRleCIsInN0YXJ0IiwiZW5kIiwibGFzdEluZGV4IiwicHJldkNvbnRlbnQiLCJwcm9jZXNzTmVzdGVkQ29udGVudCIsInN0YXJ0Q2hhcnMiLCJlbmRDaGFycyIsInRyaWdnZXJDaGFyIiwicG9zIiwic3RhcnRUcmlnZ2VyUG9zIiwibmVzdGVkQ291bnRlciIsInJwb3MiLCJsYXN0SW5kZXhPZiIsImVwb3MiLCJ0ZW1wZXBvcyIsInBhcnNlRnVuY3Rpb24iLCJjYWxsYmFja0EiLCJjYWxsYmFja0IiLCJzdGFydEluZGV4IiwiZW5kSW5kZXgiLCJhcnJvd0luZGV4IiwiYnJhY2VJbmRleCIsIm5leHRQb3MiLCJwb3NzaWJsZUVuZHMiLCJlbmRQb3MiLCJmb3VuZEVuZCIsInBvc3NpYmxlRW5kIiwicG9zc2libGVFbmRQb3MiLCJhIiwidHJpbSIsImFyZyIsImIiLCJvdXQiLCJwYXJzZUNvbnRlbnQiLCJ0aGlzQ29udGVudCIsInBhcnNlck9wdGlvbnMiLCJvdXRwdXRDb21tYW5kcyIsImFsbG93U3RyaW5naWZ5IiwiU1RSSU5HSUZZX1NUQVJUIiwiU1RSSU5HSUZZX0VORCIsInJlZ2V4Rm91bmQiLCJvZmZDb250ZW50IiwidGVtcE91dHB1dCIsInJlZ2V4Rm91bmQyIiwic3RhcnRQb3MiLCJvZmZDb250ZW50MyIsInRlbXBPdXRwdXQyIiwiZnVuY0FyZ3NTdHIiLCJ0ZW1wT3V0cHV0MyIsImZ1bmNBcmdzIiwiZnVuY0JvZHkiLCJlbmRUeXBlIiwiZXNjYXBlZEJvZHkiLCJmdW5jdGlvbkNhbGwiLCJpc0FzeW5jIiwibmV3VmFsdWUiLCJ0ZW1wT3V0cHV0NCIsIm91dHB1dENtZHMiLCJ0ZW1wU3RyIiwidGVtcE91dHB1dDUiLCJEZXZlbG9wbWVudCIsImZvdW5kU3RyIiwiY3JlYXRlVGVzdEVsZW1lbnQiLCJmb3VuZFN0cjIiLCJ0ZXN0RWxtIiwib2JqIiwiQXJyYXkiLCJ0ZXN0RWxlbWVudHMiLCJmdW5jIiwidGVtcE91dHB1dDYiLCJ0ZW1wQXJncyIsIm1vZGUiLCJwdWJsaWNLZXlzIiwiZ2V0QVBJIiwiZ2V0VGVzdGVyQVBJIiwicmV0dXJuZWRPdXRwdXQiLCJleGVjdXRpb25Db250ZW50IiwibmV3VmFyIiwibmV3VmFyVmFsdWUiLCJjb250ZW50TmFtZSIsIlN5bnRheEVycm9yIiwiaG90IiwiZmluYWxPdXRwdXQiLCJIb3RMb2dMZXZlbCIsImxvZ0xldmVsIiwiQWxsIiwic2hvd1Jlc3BvbnNlcyIsInNob3dIVFRQRXZlbnRzIiwic2hvd1dlYlNvY2tldEV2ZW50cyIsImxldmVsIiwiSW5mbyIsIldhcm5pbmciLCJWZXJib3NlIiwiTm9uZSIsIndhcm5pbmciLCJpbmZvIiwidmVyYm9zZSIsIm1zZyIsImh0bWwiLCJjc3MiLCJqcyIsImNvbXBvbmVudExpYnJhcnkiLCJjb21wb25lbnRzIiwib3V0cHV0Q1NTIiwiZWNob091dCIsIm91dHB1dEFzc2V0IiwiYXNzZXQiLCJvdXRwdXRKUyIsImFzc2V0TmFtZSIsImxvYWRIb3RGaWxlcyIsIm91dHB1dENvbXBvbmVudHMiLCJhc3NldFR5cGUiLCJhc3NldHMiLCJjYWxsYmFjayIsImxvYWRBc3NldCIsIkhvdEFzc2V0IiwidGVzdGVyTmFtZSIsInRlc3Rlck1hcCIsImZ1bmN0aW9ucyIsInRlc3RQYXRocyIsImFkZEZpbGUiLCJhZGRGdW5jdGlvbiIsImFyZ3NTdHIiLCJhc3luY1N0ciIsImNvbW1hIiwiY2FsbEZ1bmN0aW9uIiwidGhpc09iaiIsImNhbGxBc3luY0Z1bmN0aW9uIiwiYWRkVGVzdEVsZW1lbnQiLCJlbG0iLCJnZXRUZXN0RWxlbWVudCIsImNyZWF0ZVRlc3RQYXRoIiwicGF0aE5hbWUiLCJkcml2ZXJGdW5jIiwib25SZWdpc3RlciIsIm9uQXV0aG9yaXplVXNlciIsInZlcnNpb24iLCJwcmVmaXgiLCJlcnJvcnMiLCJjcmVhdGVFcnJvciIsImVycm9yQ29kZSIsInRlc3RDYXNlcyIsImdldE1ldGhvZCIsImZvdW5kTWV0aG9kIiwiUGFzc1R5cGUiLCJyZXEiLCJ3c1NvY2tldCIsImF1dGhvcml6ZWRWYWx1ZSIsInF1ZXJ5T2JqIiwidGFncyIsInJldHVybnMiLCJwYXJhbWV0ZXJzUmVmTmFtZSIsInBhcmFtZXRlcnMiLCJxdWVyeVBhcmFtZXRlcnMiLCJpc1JlZ2lzdGVyZWQiLCJleGVjdXRlU2V0dXAiLCJvblNlcnZlckF1dGhvcml6ZSIsIm9uU2VydmVyRXhlY3V0ZSIsIm9uQ2xpZW50RXhlY3V0ZSIsIm9uRXhlY3V0ZSIsIm5ld01ldGhvZCIsInRlc3RDYXNlTmFtZSIsImFkZFRlc3RDYXNlIiwibmV3VGVzdENhc2UiLCJ0ZXN0Q2FzZUZ1bmN0aW9uIiwidGVzdENhc2VJZCIsInRlc3RDYXNlIiwibWV0aG9kTmFtZSIsInNlcnZlclR5cGUiLCJsaXN0ZW5BZGRyZXNzIiwicG9ydHMiLCJodHRwIiwiaHR0cHMiLCJzc2wiLCJjZXJ0IiwiY2EiLCJyZWRpcmVjdEhUVFB0b0hUVFBTIiwic2VjcmV0cyIsInNldEFQSSIsIkhvdFRlc3Rlck1vY2hhIiwiSG90VGVzdGVyTW9jaGFTZWxlbml1bSIsIkhvdFRlc3RTZWxlbml1bURyaXZlciIsIkhvdExvZyIsInN0YXJ0RGVsYXkiLCJwYWdlcyIsIm1vZHVsZXMiLCJob3RTaXRlIiwiYXBpQ29udGVudCIsInRlc3RlckFwaUNvbnRlbnQiLCJwYWdlQ29udGVudCIsInRlc3RlcnMiLCJwYXJzZUJvb2xlYW4iLCJjb252ZXJ0SW50ZXJmYWNlVG9Sb3V0ZVBhcmFtZXRlcnMiLCJzb3VyY2VDb2RlUGF0aCIsImludGVyZmFjZU5hbWUiLCJ0eXBlQ29udmVyc2lvbnMiLCJyZXR1cm5GaXJzdFVuaW9uVHlwZSIsInVua25vd25UeXBlRGVmYXVsdHNUb1R5cGUiLCJIb3RJTyIsImV2YWwiLCJzb3VyY2VDb2RlQ29udGVudCIsInJlYWRUZXh0RmlsZSIsInBhcnNlSW50ZXJmYWNlIiwicHJvcGVydGllcyIsInByb3AiLCJjb21tZW50cyIsImlzT3B0aW9uYWwiLCJyZWFkT25seSIsImlzQXJyYXkiLCJpdGVtcyIsImdldFBhcmFtIiwib2JqV2l0aFBhcmFtIiwicmVxdWlyZWQiLCJ0aHJvd0V4Y2VwdGlvbiIsImdldFBhcmFtUmFuZ2UiLCJtaW4iLCJtYXgiLCJnZXRQYXJhbURlZmF1bHQiLCJkZWZhdWx0VmFsdWUiLCJjaGVja0lmRW1wdHkiLCJnZXRQYXJhbURlZmF1bHRSYW5nZSIsImV4ZWN1dGVFcnJvciIsImVyclR5cGUiLCJyZWRpcmVjdFRvVXJsIiwiaHJlZiIsIndhaXQiLCJudW1NaWxsaXNlY29uZHMiLCJzZXRUaW1lb3V0IiwiYWRkUGFnZSIsImdldFBhZ2UiLCJwYWdlTmFtZSIsInRocm93RXgiLCJ0ZW1wTmFtZSIsImtlZXBDb250ZXh0IiwiY29udGV4dCIsImFyeUFyZ3MiLCJwcm90b3R5cGUiLCJhZGRDb21wb25lbnQiLCJDb21wb25lbnRUeXBlIiwidGVtcEFwaSIsInRlbXBDb21wb25lbnRPYmoiLCJjb21wb25lbnRUeXBlIiwicmVnaXN0ZXJDb21wb25lbnQiLCJmaXhIVE1MIiwicGFyc2VkWE1MIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwicXVlcnlTZWxlY3RvciIsImNoaWxkcmVuIiwidGFnTmFtZSIsImZpeGVkU3RyIiwiYWRkSHRtbCIsInBhcmVudCIsImZvdW5kUGFyZW50IiwiaHRtbEhhbmRsZXIiLCJuZXdET00iLCJyZXN1bHRzIiwiY2hpbGQiLCJhcHBlbmRDaGlsZCIsImNoZWNrSG90U2l0ZU5hbWUiLCJob3RzaXRlTmFtZSIsImlzVmFsaWQiLCJ2YWxpZEZvck5ld1BhY2thZ2VzIiwicmVwbGFjZUtleSIsImdldFZhbHVlRnJvbUhvdFNpdGVPYmoiLCJob3RzaXRlIiwicGFyYW1zIiwicHJldlZhbHVlIiwicHJvY2Vzc0hvdFNpdGUiLCJ0ZXN0ZXIiLCJIb3RQYWdlIiwibWFwTmFtZSIsInRlc3RNYXAiLCJ0ZXN0TWFwcyIsIkhvdFRlc3RNYXAiLCJkZXN0aW5hdGlvbnMiLCJkZXN0IiwiSG90VGVzdERlc3RpbmF0aW9uIiwia2V5MiIsImRlc3RpbmF0aW9uT3JkZXIiLCJ3ZWIiLCJhcGlzIiwiY29tcG9uZW50IiwiY29tcG9uZW50VXJsIiwiQ29tcG9uZW50Q2xhc3MiLCJkaXNhYmxlRmlsZUxvYWRpbmciLCJhZGRUZXN0ZXIiLCJsb2FkSG90U2l0ZSIsImpzb25TdHIiLCJleHQiLCJwcGF0aCIsImV4dG5hbWUiLCJub3JtYWxpemUiLCJleGlzdHMiLCJ5YW1sIiwiaG90c2l0ZVBhdGgiLCJzYXZlSG90U2l0ZSIsImhvdHNpdGVTdHIiLCJ3cml0ZVRleHRGaWxlIiwiZm9yY2VDb250ZW50TG9hZGluZyIsImxvYWRVcmxDb250ZW50IiwibmV3RmlsZSIsImxvYWRDb250ZW50IiwiZ2VuZXJhdGVDb250ZW50Iiwicm91dGVLZXkiLCJqc1NyY1BhdGgiLCJwYXNzQXJncyIsImFwaVNjcmlwdHMiLCJhcGlDb2RlIiwic2VydmVyIiwiZ2xvYmFsQXBpIiwic2VuZEpTQ29udGVudCIsImpzYXBpIiwibGlicmFyeU5hbWUiLCJhcGlOYW1lIiwidGVtcEFQSUNvbnRlbnQiLCJqc2FwaXBhdGgiLCJzZWNyZXQiLCJzZXJ2ZXJDb25uIiwicGFzc1NlY3JldEZyb21BUEkiLCJlbnZLZXkiLCJ0ZW1wQ29udGVudCIsImRldmVsb3Blck1vZGVTdHIiLCJ0ZXN0ZXJBUElTdHIiLCJ0ZXN0aW5nIiwidGVzdGVyQVBJVXJsIiwibG9hZEZpbGVzIiwidGVzdGVyVXJsIiwidGVzdGVyTGF1bmNocGFkVXJsIiwibGF1bmNocGFkVXJsIiwic3RhcnREZWxheVN0ciIsImZpeENvbnRlbnQiLCJjcmVhdGVFeHByZXNzUm91dGVzIiwiZXhwcmVzc0FwcCIsInNlbmQiLCJnZXRXZWJUZXN0aW5nTWFwcyIsIm1hcHMiLCJnZXRBUElUZXN0aW5nTWFwcyIsImdldFJvdXRlS2V5RnJvbU5hbWUiLCJnZXRSb3V0ZUZyb21OYW1lIiwiZm91bmRSb3V0ZSIsImV4ZWN1dGVUZXN0cyIsImV4ZWN1dGUiLCJleGVjdXRlQWxsV2ViVGVzdHMiLCJleGVjdXRlQWxsQVBJVGVzdHMiLCJwcm9jZXNzTG9jYWxGaWxlIiwibG9jYWxGaWxlcGF0aCIsInByb2Nlc3NVcmwiLCJvblJlYWR5IiwicmVhZHlGdW5jIiwib25SZWFkeUV2ZW50IiwidXNlT3V0cHV0Iiwib25PdXRwdXRSZWNlaXZlZCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiaW5uZXJIVE1MIiwidG1wU2NyaXB0cyIsInNjcmlwdHMiLCJjcmVhdGVFbGVtZW50IiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwicmVzb2x2ZTIiLCJyZWplY3QyIiwib25sb2FkIiwiaGFzU3JjIiwiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiZGlzcGF0Y2hSZWFkeUV2ZW50cyIsImRpc3BhdGNoRXZlbnQiLCJFdmVudCIsIndhaXRGb3JUZXN0ZXJzIiwiaXNSZWFkeUZvclRlc3RpbmciLCJvblJlYWR5Rm9yVGVzdGluZyIsInNldHVwVGVzdGVycyIsInRlc3RlckFQSUJhc2VVcmwiLCJjbGllbnQiLCJIb3RDbGllbnQiLCJIb3RUZXN0ZXJBUEkiLCJzZXR1cENsaWVudFRlc3RlcnMiLCJvbkluaXRhbExvYWQiLCJyZWFkeVN0YXRlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRpc3BsYXlVcmwiLCJkaXNwbGF5Q29udGVudCIsImhvdFN0YXFXZWJTdGFydCIsImN1c3RvbUVsZW1lbnRzIiwicHJvY2Vzc29yQ29tcG9uZW50cyIsImRlZmluZSIsIkhUTUxFbGVtZW50Iiwic3VwZXIiLCJjb21wb25lbnRJbmZvIiwiaG90Q29tcG9uZW50IiwiaGFuZGxlQXR0cmlidXRlcyIsImF0dHIiLCJhdHRyTmFtZSIsImF0dHJWYWx1ZSIsImF0dHJUZW1wTmFtZSIsIm9uUHJlT3V0cHV0Iiwib3V0cHV0cyIsIm9uUG9zdE91dHB1dCIsImNvbXBvbmVudE91dHB1dHMiLCJpS2R4IiwiaHRtbFN0ciIsImFkZEZ1bmN0aW9uc1RvIiwicGxhY2VIZXJlIiwiZG9jdW1lbnRTZWxlY3RvciIsIm9uUGFyc2VkIiwib25GaXhIVE1MIiwiY2hpbGRyZW5Ub1JlYWRkIiwibmV3T2JqIiwib25QYXJzZURPTSIsInRocm93RXJyIiwicmVwbGFjZVdpdGgiLCJjbGljayIsImJpbmQiLCJldmVudCIsIm9iamVjdEZ1bmN0aW9ucyIsImdldE93blByb3BlcnR5TmFtZXMiLCJvYmpGdW5jIiwiaXNOZXdGdW5jdGlvbiIsIkhvdENvbXBvbmVudCIsIm9uUHJlUGxhY2UiLCJjb21wSHRtbEVsZW1lbnQyIiwib25QYXJlbnRQbGFjZSIsImNsb3Nlc3RTZWxlY3RvciIsInBhcmVudEVsbSIsImZvdW5kTm9kZSIsInBhcmVudEVsZW1lbnQiLCJwbGFjZUVsbUluUGFyZW50IiwicGFyZW50Tm9kZVRvQ2hlY2siLCJwbGFjZUhlcmVQYXJlbnQiLCJjaGlsZFRvUGxhY2UiLCJwYXJlbnROb2RlQ2hlY2tDb3VudGVyIiwiSFRNTEh0bWxFbGVtZW50IiwicGxhY2VIZXJlQXJyYXkiLCJxdWVyeVNlbGVjdG9yQWxsIiwicGxhY2VIZXJlQXR0ckFycmF5IiwicGxhY2VkQ2hpbGQiLCJwbGFjZUhlcmVQYXJlbnRBdHRyIiwib25Qb3N0UGxhY2UiLCJ0ZW1wIiwiY29tcG9uZW50TmFtZSIsImlkIiwibG9vc2VQYXJzZUZyb21TdHJpbmciLCJwYXJzZXIiLCJ4ZG9tIiwiaGRvbSIsImVsZW0iLCJmcm9tIiwib3V0ZXJIVE1MIiwiaG90c3RhcVN0YXJ0aW5nQXBwIiwiaG90c3RhcUVsbXMiLCJIb3RTdGFxV2ViIiwiaG90c3RhcUVsbSIsImdldEF0dHIiLCJhdHRyTmFtZXMiLCJsb2FkUGFnZSIsImxvZ2dpbmdMZXZlbCIsInJvdXRlciIsImFwaUpTVXJsIiwiYXBpTGlicmFyeSIsImFwaVVybCIsInRlc3RlckFwaUJhc2VVcmwiLCJkb250UmV1c2VQcm9jZXNzb3IiLCJwYXNzUmF3VXJsIiwiaHRtbFNvdXJjZSIsInJvdXRlck1hbmFnZXIiLCJyb3V0ZXJXaWxkY2FyZHMiLCJoc3RxYmFzZXJlZGlyZWN0IiwiZGVjb2RlVVJJIiwiaGlzdG9yeSIsInJlcGxhY2VTdGF0ZSIsImhvdHN0YXFFcnJvcnMiLCJob3RzdGFxRXJyb3JFbG0iLCJlcnJvclN0YXR1cyIsInVuc3VwcG9ydGVkQnJvd3NlciIsImhvdHN0YXFSb3V0ZXJFbG1zIiwiaG90c3RhcVJvdXRlckVsbSIsInJvdXRlck5hbWUiLCJzZXJ2ZUxvY2FsbHkiLCJpSmR4IiwiY2hpbGROb2RlcyIsInJvdXRlckVsbSIsInJvdXRlclBhdGgiLCJyZWRpcmVjdCIsImJhc2VSZWRpcmVjdCIsImJhc2UiLCJyb3V0ZXJTcmMiLCJzcmMiLCJjaGVja1BhdGgiLCJwYXRobmFtZSIsImdvdG9QYXRoIiwibG93ZXJTZXJ2ZUxvY2FsbHkiLCJsYXN0U2xhc2hQb3MiLCJyb3V0ZVdpbGRjYXJkIiwidGVtcFJvdXRlV2lsZGNhcmQiLCJzZWFyY2hQYXJhbXMiLCJtb2RpZmllZFNlYXJjaFBhcmFtcyIsImVuY29kZVVSSSIsImhhc0h0bWxTb3VyY2UiLCJodG1sU291cmNlQ2hlY2siLCJ0ZW1wTW9kZSIsImFwaUpTVXJsQ29udGVudCIsInBhcmVudExpYiIsIm5ld0FQSSIsImRlc3RpbmF0aW9uIiwiYXV0b1N0YXJ0IiwiY29tbWFuZERlbGF5IiwicGFnZVRlc3REZWxheSIsInBlcnNpc3RlbnREYXRhIiwicGFyc2VUZXN0T2JqZWN0Iiwid2lsZGNhcmQiLCJzZWxlY3RvciIsInByaW50Iiwic3Rkb3V0IiwicHJpbnRsbiIsImFzc2VydCIsImVycm9yTWVzc2FnZSIsIm11c3RCZVZpc2libGUiLCJpZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yIiwiSG90VGVzdGVyIiwiZHJpdmVyIiwidGltZW91dCIsImZpbmlzaGVkTG9hZGluZyIsImhhc0JlZW5TZXR1cCIsImhhc0JlZW5EZXN0cm95ZWQiLCJjdXJyZW50UGFnZSIsIm51bUZhaWx1cmVzIiwic2V0dXAiLCJpc1dlYlJvdXRlIiwiZGVzdGluYXRpb25LZXkiLCJ3YWl0Rm9yRGF0YSIsImludGVycHJldERlc3RpbmF0aW9uIiwidGVzdERlc3QiLCJuZXdEZXN0aW5hdGlvbiIsInBhdGhzIiwic3RycyIsImdldFR5cGUiLCJ0eXBlU3RyIiwidHlwZURlbGltaXRlciIsInR5cGVWYWx1ZSIsIm5ld1BhdGhTdHIiLCJuZXdQYXRoIiwiY21kIiwiZXhlY3V0ZVRlc3RBUElQYXRoIiwidGVzdE5hbWUiLCJza2lwRXZlbnRDYWxscyIsImNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlIiwicnVuVGVzdFBhdGgiLCJvblRlc3RBUElQYXRoU3RhcnQiLCJ0ZXN0Q2FzZU9iamVjdCIsIm9uVGVzdEFQSVBhdGhFbmQiLCJleGVjdXRlVGVzdEFQSVBhdGhzIiwiZXhlY3V0ZVRlc3RQYWdlUGF0aCIsInN0b3AiLCJ0ZXN0UGF0aE5hbWUiLCJ0ZXN0UGF0aCIsIm9uVGVzdFBhZ2VQYXRoU3RhcnQiLCJvblRlc3RQYWdlUGF0aEVuZCIsImV4ZWN1dGVDb21tYW5kIiwiaGFzQ21kIiwiaW5wdXQiLCJoYXNBcmd1bWVudHMiLCJnZXRDbWRBcmdzIiwiY21kRnVuYyIsImNtZEFyZ3MiLCJuYXZpZ2F0ZVRvVXJsIiwidGVzdE9iamVjdCIsIndhaXRGb3JUZXN0RWxlbWVudCIsImVsbU5hbWUiLCJzZW5kS2V5cyIsImNsZWFyIiwib25Db21tYW5kIiwiZXhlY3V0ZVRlc3RQYWdlUGF0aHMiLCJleGVjdXRlRGVzdGluYXRpb24iLCJydW5UZXN0UGF0aHMiLCJvblRlc3RTdGFydCIsIm9uVGVzdEVuZCIsImhhc0V4ZWN1dGVkS2V5cyIsIm9yZGVyS2V5IiwiZXhlY3V0ZURlc3QiLCJIb3RBUEkiLCJwYWdlTG9hZGVkIiwicGFnZVVubG9hZGVkIiwiaGVhcnRiZWF0IiwicmVxdWVzdCIsInRlc3Rlck9iaiIsInRlc3RQYXRoc1N0cnMiLCJ0ZXN0T2JqIiwidGhyb3dFcnJvciIsIm5ld1BhZ2UiLCJzZXRBc0N1cnJlbnQiLCJvbkZpbmlzaGVkTG9hZGluZyIsIm9uRmluaXNoZWRVbmxvYWRpbmciLCJzb2NrZXQiLCJvbkNvbm5lY3RFcnJvciIsIm9uRXJyb3IiLCJvbkRpc2Nvbm5lY3QiLCJ1c2VTb2NrZXQiLCJjb25uZWN0IiwiYXV0aCIsInF1ZXJ5Iiwic29ja2V0T2JqIiwiaW8iLCJvbiIsIm9uQ29ubmVjdCIsInV1aWQiLCJ1dWlkMiIsIm9uUmF3Iiwib2ZmIiwib25jZSIsIm9uY2VSYXciLCJnZXRJZCIsImlzQ29ubmVjdGVkIiwiY29ubmVjdGVkIiwiZW1pdCIsInNlbmRPbiIsInNlbmRPbmNlIiwiZGlzY29ubmVjdCIsInJlbW92ZUZyb21TZXJ2ZXIiLCJnZXRSYW5kb21WYWx1ZXMiLCJybmRzOCIsIlVpbnQ4QXJyYXkiLCJybmciLCJjcnlwdG8iLCJtc0NyeXB0byIsImJ5dGVUb0hleCIsImFyciIsIm9mZnNldCIsIlR5cGVFcnJvciIsIl9ub2RlSWQiLCJfY2xvY2tzZXEiLCJfbGFzdE1TZWNzIiwiX2xhc3ROU2VjcyIsImJ1ZiIsIm5vZGUiLCJjbG9ja3NlcSIsInNlZWRCeXRlcyIsInJhbmRvbSIsIm1zZWNzIiwibnNlY3MiLCJkdCIsInRsIiwidG1oIiwiaGFzaGZ1bmMiLCJnZW5lcmF0ZVVVSUQiLCJ1bmVzY2FwZSIsImJ5dGVzIiwic3RyaW5nVG9CeXRlcyIsIkROUyIsIlVSTCIsImdldE91dHB1dExlbmd0aCIsImlucHV0TGVuZ3RoOCIsInNhZmVBZGQiLCJ4IiwieSIsImxzdyIsIm1kNWNtbiIsInEiLCJ0IiwibnVtIiwiY250IiwibWQ1ZmYiLCJtZDVnZyIsIm1kNWhoIiwibWQ1aWkiLCJ2MzUiLCJsZW5ndGgzMiIsImhleFRhYiIsImhleCIsImNoYXJBdCIsIm1kNVRvSGV4RW5jb2RlZEFycmF5Iiwib2xkYSIsIm9sZGIiLCJvbGRjIiwib2xkZCIsIndvcmRzVG9NZDUiLCJsZW5ndGg4IiwiVWludDMyQXJyYXkiLCJieXRlc1RvV29yZHMiLCJybmRzIiwiZiIsInoiLCJST1RMIiwiSyIsIkgiLCJsIiwiTiIsImNlaWwiLCJNIiwiX2kiLCJwb3ciLCJmbG9vciIsIl9pMiIsIlciLCJfdCIsIl90MiIsIlQiLCJGb3JtRGF0YSIsImZldGNoIiwiaGFzQ09SUyIsIlhNTEh0dHBSZXF1ZXN0IiwiZGVjb2RlIiwiZW5jb2RlIiwiaGFzT3duUHJvcGVydHkiLCJxcyIsInFyeSIsInBhaXJzIiwicGFpciIsInJlIiwidXJpIiwiaG9zdCIsImF1dGhvcml0eSIsImlwdjZ1cmkiLCJwYXRoTmFtZXMiLCJxdWVyeUtleSIsIiQwIiwiJDIiLCJ5ZWFzdCIsImFscGhhYmV0Iiwic2VlZCIsImVuY29kZWQiLCJkZWNvZGVkIiwiZ2xvYmFsVGhpc1NoaW0iLCJuZXh0VGljayIsImluc3RhbGxUaW1lckZ1bmN0aW9ucyIsInRyYW5zcG9ydHMiLCJUcmFuc3BvcnRFcnJvciIsIlRyYW5zcG9ydCIsInByb3RvY29sIiwiU29ja2V0Iiwic29ja2V0X2pzXzEiLCJ0cmFuc3BvcnRfanNfMSIsImluZGV4X2pzXzEiLCJ1dGlsX2pzXzEiLCJwYXJzZXVyaV9qc18xIiwid2Vic29ja2V0X2NvbnN0cnVjdG9yX2pzXzEiLCJfX2ltcG9ydERlZmF1bHQiLCJtb2QiLCJfX2VzTW9kdWxlIiwicGFyc2Vxc19qc18xIiwiZGVidWdfMSIsImNvbXBvbmVudF9lbWl0dGVyXzEiLCJlbmdpbmVfaW9fcGFyc2VyXzEiLCJFbWl0dGVyIiwib3B0cyIsImJpbmFyeVR5cGUiLCJkZWZhdWx0QmluYXJ5VHlwZSIsIndyaXRlQnVmZmVyIiwiaG9zdG5hbWUiLCJzZWN1cmUiLCJwb3J0IiwicHJldkJ1ZmZlckxlbiIsImFnZW50Iiwid2l0aENyZWRlbnRpYWxzIiwidXBncmFkZSIsInRpbWVzdGFtcFBhcmFtIiwicmVtZW1iZXJVcGdyYWRlIiwiYWRkVHJhaWxpbmdTbGFzaCIsInJlamVjdFVuYXV0aG9yaXplZCIsInBlck1lc3NhZ2VEZWZsYXRlIiwidGhyZXNob2xkIiwidHJhbnNwb3J0T3B0aW9ucyIsImNsb3NlT25CZWZvcmV1bmxvYWQiLCJ1cGdyYWRlcyIsInBpbmdJbnRlcnZhbCIsInBpbmdUaW1lb3V0IiwicGluZ1RpbWVvdXRUaW1lciIsImJlZm9yZXVubG9hZEV2ZW50TGlzdGVuZXIiLCJ0cmFuc3BvcnQiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJjbG9zZSIsIm9mZmxpbmVFdmVudExpc3RlbmVyIiwib25DbG9zZSIsIm9wZW4iLCJjcmVhdGVUcmFuc3BvcnQiLCJFSU8iLCJzaWQiLCJwcmlvcldlYnNvY2tldFN1Y2Nlc3MiLCJzZXRUaW1lb3V0Rm4iLCJlbWl0UmVzZXJ2ZWQiLCJzaGlmdCIsInNldFRyYW5zcG9ydCIsIm9uRHJhaW4iLCJvblBhY2tldCIsInByb2JlIiwiZmFpbGVkIiwib25UcmFuc3BvcnRPcGVuIiwidXBncmFkaW5nIiwicGF1c2UiLCJjbGVhbnVwIiwiZmx1c2giLCJmcmVlemVUcmFuc3BvcnQiLCJvbmVycm9yIiwib25UcmFuc3BvcnRDbG9zZSIsIm9uY2xvc2UiLCJvbnVwZ3JhZGUiLCJ0byIsInJlbW92ZUxpc3RlbmVyIiwib25PcGVuIiwicGFja2V0IiwicmVzZXRQaW5nVGltZW91dCIsIm9uSGFuZHNoYWtlIiwic2VuZFBhY2tldCIsImNvZGUiLCJmaWx0ZXJVcGdyYWRlcyIsIm1heFBheWxvYWQiLCJjbGVhclRpbWVvdXRGbiIsImF1dG9VbnJlZiIsInVucmVmIiwid3JpdGFibGUiLCJwYWNrZXRzIiwiZ2V0V3JpdGFibGVQYWNrZXRzIiwicGF5bG9hZFNpemUiLCJieXRlTGVuZ3RoIiwiZm4iLCJjb21wcmVzcyIsImNsZWFudXBBbmRDbG9zZSIsIndhaXRGb3JVcGdyYWRlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImZpbHRlcmVkVXBncmFkZXMiLCJkb09wZW4iLCJkb0Nsb3NlIiwib25EYXRhIiwiZGVjb2RlUGFja2V0IiwiZGV0YWlscyIsIm9uUGF1c2UiLCJjcmVhdGVVcmkiLCJfaG9zdG5hbWUiLCJfcG9ydCIsIl9xdWVyeSIsImVuY29kZWRRdWVyeSIsInBvbGxpbmdfanNfMSIsIndlYnNvY2tldF9qc18xIiwid2VidHJhbnNwb3J0X2pzXzEiLCJ3ZWJzb2NrZXQiLCJXUyIsIndlYnRyYW5zcG9ydCIsIldUIiwicG9sbGluZyIsIlBvbGxpbmciLCJSZXF1ZXN0IiwieWVhc3RfanNfMSIsInhtbGh0dHByZXF1ZXN0X2pzXzEiLCJnbG9iYWxUaGlzX2pzXzEiLCJlbXB0eSIsImhhc1hIUjIiLCJYSFIiLCJ4ZG9tYWluIiwicmVzcG9uc2VUeXBlIiwiaXNTU0wiLCJ4ZCIsImZvcmNlQmFzZTY0Iiwic3VwcG9ydHNCaW5hcnkiLCJjb29raWVKYXIiLCJjcmVhdGVDb29raWVKYXIiLCJwb2xsIiwidG90YWwiLCJkb1BvbGwiLCJkZWNvZGVQYXlsb2FkIiwiZW5jb2RlUGF5bG9hZCIsImRvV3JpdGUiLCJ0aW1lc3RhbXBSZXF1ZXN0cyIsImI2NCIsInhoclN0YXR1cyIsInBvbGxYaHIiLCJfYSIsInBpY2siLCJ4aHIiLCJleHRyYUhlYWRlcnMiLCJzZXREaXNhYmxlSGVhZGVyQ2hlY2siLCJzZXRSZXF1ZXN0SGVhZGVyIiwiYWRkQ29va2llcyIsInJlcXVlc3RUaW1lb3V0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicGFyc2VDb29raWVzIiwib25Mb2FkIiwicmVxdWVzdHNDb3VudCIsInJlcXVlc3RzIiwiZnJvbUVycm9yIiwiYWJvcnQiLCJyZXNwb25zZVRleHQiLCJhdHRhY2hFdmVudCIsInVubG9hZEhhbmRsZXIiLCJ0ZXJtaW5hdGlvbkV2ZW50IiwidXNpbmdCcm93c2VyV2ViU29ja2V0IiwiV2ViU29ja2V0IiwiY2IiLCJNb3pXZWJTb2NrZXQiLCJpc1JlYWN0TmF0aXZlIiwicHJvZHVjdCIsImNoZWNrIiwicHJvdG9jb2xzIiwid3MiLCJhZGRFdmVudExpc3RlbmVycyIsIm9ub3BlbiIsIl9zb2NrZXQiLCJjbG9zZUV2ZW50Iiwib25tZXNzYWdlIiwiZXYiLCJsYXN0UGFja2V0IiwiZW5jb2RlUGFja2V0IiwiQnVmZmVyIiwiV2ViVHJhbnNwb3J0IiwiY2xvc2VkIiwicmVhZHkiLCJjcmVhdGVCaWRpcmVjdGlvbmFsU3RyZWFtIiwic3RyZWFtIiwiZGVjb2RlclN0cmVhbSIsImNyZWF0ZVBhY2tldERlY29kZXJTdHJlYW0iLCJNQVhfU0FGRV9JTlRFR0VSIiwicmVhZGVyIiwicmVhZGFibGUiLCJwaXBlVGhyb3VnaCIsImdldFJlYWRlciIsImVuY29kZXJTdHJlYW0iLCJjcmVhdGVQYWNrZXRFbmNvZGVyU3RyZWFtIiwicGlwZVRvIiwid3JpdGVyIiwiZ2V0V3JpdGVyIiwiZG9uZSIsImhhc19jb3JzX2pzXzEiLCJjb25jYXQiLCJyZWR1Y2UiLCJhY2MiLCJrIiwiTkFUSVZFX1NFVF9USU1FT1VUIiwiTkFUSVZFX0NMRUFSX1RJTUVPVVQiLCJjbGVhclRpbWVvdXQiLCJ1c2VOYXRpdmVUaW1lcnMiLCJ1dGY4TGVuZ3RoIiwic2l6ZSIsIkVSUk9SX1BBQ0tFVCIsIlBBQ0tFVF9UWVBFU19SRVZFUlNFIiwiUEFDS0VUX1RZUEVTIiwiY2hhcnMiLCJsb29rdXAiLCJhcnJheWJ1ZmZlciIsImJhc2U2NCIsImVuY29kZWQxIiwiZW5jb2RlZDIiLCJlbmNvZGVkMyIsImVuY29kZWQ0IiwiYnVmZmVyTGVuZ3RoIiwicCIsIkFycmF5QnVmZmVyIiwiY29tbW9uc19qc18xIiwiYmFzZTY0X2FycmF5YnVmZmVyX2pzXzEiLCJ3aXRoTmF0aXZlQXJyYXlCdWZmZXIiLCJlbmNvZGVkUGFja2V0IiwibWFwQmluYXJ5IiwiZGVjb2RlQmFzZTY0UGFja2V0IiwiQmxvYiIsImJ1ZmZlciIsImVuY29kZVBhY2tldFRvQmluYXJ5Iiwid2l0aE5hdGl2ZUJsb2IiLCJpc1ZpZXciLCJlbmNvZGVCbG9iQXNCYXNlNjQiLCJmaWxlUmVhZGVyIiwiRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJ0b0FycmF5IiwiYnl0ZU9mZnNldCIsIlRFWFRfRU5DT0RFUiIsImFycmF5QnVmZmVyIiwiVGV4dEVuY29kZXIiLCJlbmNvZGVQYWNrZXRfanNfMSIsImRlY29kZVBhY2tldF9qc18xIiwiU0VQQVJBVE9SIiwiZnJvbUNoYXJDb2RlIiwiVEVYVF9ERUNPREVSIiwidG90YWxMZW5ndGgiLCJjaHVua3MiLCJjaHVuayIsImNvbmNhdENodW5rcyIsImVuY29kZWRQYWNrZXRzIiwiY291bnQiLCJlbmNvZGVkUGF5bG9hZCIsImRlY29kZWRQYWNrZXQiLCJUcmFuc2Zvcm1TdHJlYW0iLCJ0cmFuc2Zvcm0iLCJjb250cm9sbGVyIiwicGF5bG9hZExlbmd0aCIsImhlYWRlciIsIkRhdGFWaWV3Iiwic2V0VWludDgiLCJ2aWV3Iiwic2V0VWludDE2Iiwic2V0QmlnVWludDY0IiwiQmlnSW50IiwiZW5xdWV1ZSIsIlRleHREZWNvZGVyIiwic3RhdGUiLCJleHBlY3RlZExlbmd0aCIsImlzQmluYXJ5IiwiaGVhZGVyQXJyYXkiLCJnZXRVaW50MTYiLCJnZXRVaW50MzIiLCJCYWNrb2ZmIiwiZmFjdG9yIiwiaml0dGVyIiwiYXR0ZW1wdHMiLCJkdXJhdGlvbiIsInJhbmQiLCJkZXZpYXRpb24iLCJyZXNldCIsInNldE1pbiIsInNldE1heCIsInNldEppdHRlciIsIk1hbmFnZXIiLCJ1cmxfanNfMSIsIm1hbmFnZXJfanNfMSIsImNhY2hlIiwicGFyc2VkIiwic2FtZU5hbWVzcGFjZSIsImZvcmNlTmV3IiwibXVsdGlwbGV4Iiwic29ja2V0X2lvX3BhcnNlcl8xIiwiX19jcmVhdGVCaW5kaW5nIiwibyIsImsyIiwiX19zZXRNb2R1bGVEZWZhdWx0IiwiX19pbXBvcnRTdGFyIiwiZW5naW5lX2lvX2NsaWVudF8xIiwib25fanNfMSIsImJhY2tvMl9qc18xIiwibnNwcyIsInN1YnMiLCJyZWNvbm5lY3Rpb24iLCJyZWNvbm5lY3Rpb25BdHRlbXB0cyIsIkluZmluaXR5IiwicmVjb25uZWN0aW9uRGVsYXkiLCJyZWNvbm5lY3Rpb25EZWxheU1heCIsInJhbmRvbWl6YXRpb25GYWN0b3IiLCJiYWNrb2ZmIiwiX3JlYWR5U3RhdGUiLCJfcGFyc2VyIiwiZW5jb2RlciIsIkVuY29kZXIiLCJkZWNvZGVyIiwiRGVjb2RlciIsIl9hdXRvQ29ubmVjdCIsImF1dG9Db25uZWN0IiwiX3JlY29ubmVjdGlvbiIsIl9yZWNvbm5lY3Rpb25BdHRlbXB0cyIsIl9yZWNvbm5lY3Rpb25EZWxheSIsIl9yYW5kb21pemF0aW9uRmFjdG9yIiwiX3JlY29ubmVjdGlvbkRlbGF5TWF4IiwiX3RpbWVvdXQiLCJtYXliZVJlY29ubmVjdE9uT3BlbiIsIl9yZWNvbm5lY3RpbmciLCJyZWNvbm5lY3QiLCJlbmdpbmUiLCJza2lwUmVjb25uZWN0Iiwib3BlblN1YkRlc3Ryb3kiLCJlcnJvclN1YiIsInRpbWVyIiwib25waW5nIiwib25kYXRhIiwib25kZWNvZGVkIiwiYWRkIiwibnNwIiwiYWN0aXZlIiwiX2Rlc3Ryb3kiLCJfY2xvc2UiLCJfcGFja2V0Iiwic3ViRGVzdHJveSIsImRlbGF5Iiwib25yZWNvbm5lY3QiLCJhdHRlbXB0IiwiUkVTRVJWRURfRVZFTlRTIiwiY29ubmVjdF9lcnJvciIsImRpc2Nvbm5lY3RpbmciLCJuZXdMaXN0ZW5lciIsInJlY292ZXJlZCIsInJlY2VpdmVCdWZmZXIiLCJzZW5kQnVmZmVyIiwiX3F1ZXVlIiwiX3F1ZXVlU2VxIiwiaWRzIiwiYWNrcyIsImZsYWdzIiwiX29wdHMiLCJkaXNjb25uZWN0ZWQiLCJzdWJFdmVudHMiLCJvbnBhY2tldCIsInJldHJpZXMiLCJmcm9tUXVldWUiLCJ2b2xhdGlsZSIsIl9hZGRUb1F1ZXVlIiwiUGFja2V0VHlwZSIsIkVWRU5UIiwiYWNrIiwicG9wIiwiX3JlZ2lzdGVyQWNrQ2FsbGJhY2siLCJpc1RyYW5zcG9ydFdyaXRhYmxlIiwibm90aWZ5T3V0Z29pbmdMaXN0ZW5lcnMiLCJhY2tUaW1lb3V0Iiwid2l0aEVycm9yIiwiZW1pdFdpdGhBY2siLCJhcmcxIiwiYXJnMiIsInRyeUNvdW50IiwicGVuZGluZyIsInJlc3BvbnNlQXJncyIsIl9kcmFpblF1ZXVlIiwiZm9yY2UiLCJfc2VuZENvbm5lY3RQYWNrZXQiLCJDT05ORUNUIiwiX3BpZCIsInBpZCIsIl9sYXN0T2Zmc2V0IiwiX2NsZWFyQWNrcyIsInNvbWUiLCJvbmNvbm5lY3QiLCJCSU5BUllfRVZFTlQiLCJvbmV2ZW50IiwiQUNLIiwiQklOQVJZX0FDSyIsIm9uYWNrIiwiRElTQ09OTkVDVCIsIm9uZGlzY29ubmVjdCIsIkNPTk5FQ1RfRVJST1IiLCJlbWl0RXZlbnQiLCJfYW55TGlzdGVuZXJzIiwibGlzdGVuZXJzIiwibGlzdGVuZXIiLCJzZW50IiwiZW1pdEJ1ZmZlcmVkIiwib25BbnkiLCJwcmVwZW5kQW55Iiwib2ZmQW55IiwibGlzdGVuZXJzQW55Iiwib25BbnlPdXRnb2luZyIsIl9hbnlPdXRnb2luZ0xpc3RlbmVycyIsInByZXBlbmRBbnlPdXRnb2luZyIsIm9mZkFueU91dGdvaW5nIiwibGlzdGVuZXJzQW55T3V0Z29pbmciLCJsb2MiLCJyZWNvbnN0cnVjdFBhY2tldCIsImRlY29uc3RydWN0UGFja2V0IiwiaXNfYmluYXJ5X2pzXzEiLCJfZGVjb25zdHJ1Y3RQYWNrZXQiLCJidWZmZXJzIiwicGxhY2Vob2xkZXIiLCJfcGxhY2Vob2xkZXIiLCJuZXdEYXRhIiwiX3JlY29uc3RydWN0UGFja2V0IiwicGFja2V0RGF0YSIsInBhY2siLCJhdHRhY2htZW50cyIsImJpbmFyeV9qc18xIiwiaXNPYmplY3QiLCJyZXBsYWNlciIsImhhc0JpbmFyeSIsImVuY29kZUFzU3RyaW5nIiwiZW5jb2RlQXNCaW5hcnkiLCJkZWNvbnN0cnVjdGlvbiIsInJldml2ZXIiLCJyZWNvbnN0cnVjdG9yIiwiZGVjb2RlU3RyaW5nIiwiaXNCaW5hcnlFdmVudCIsIkJpbmFyeVJlY29uc3RydWN0b3IiLCJ0YWtlQmluYXJ5RGF0YSIsIm5leHQiLCJwYXlsb2FkIiwidHJ5UGFyc2UiLCJpc1BheWxvYWRWYWxpZCIsImZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24iLCJyZWNvblBhY2siLCJiaW5EYXRhIiwid2l0aE5hdGl2ZUZpbGUiLCJGaWxlIiwidG9KU09OIiwibWl4aW4iLCJfY2FsbGJhY2tzIiwiY2FsbGJhY2tzIiwiaGFzTGlzdGVuZXJzIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsImRlZmluaXRpb24iLCJnbG9iYWxUaGlzIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJIb3RTdGFydE9wdGlvbnMiLCJJSG90U3RhcSIsIkhvdFNpdGUiLCJIb3RTaXRlUm91dGUiLCJIb3RTaXRlTWFwUGF0aCIsIkhvdE1vZHVsZSIsIkhvdENvbXBvbmVudE91dHB1dCIsIklIb3RDb21wb25lbnQiLCJBUEl0b0xvYWQiLCJTZXJ2ZXJSZXF1ZXN0IiwiSG90Um91dGVNZXRob2RQYXJhbWV0ZXIiLCJIb3RXZWJTb2NrZXRDbGllbnQiLCJIb3RUZXN0RHJpdmVyIiwiSUhvdFRlc3RFbGVtZW50IiwiSG90VGVzdEVsZW1lbnRPcHRpb25zIiwiSUhvdFRlc3RFbGVtZW50T3B0aW9ucyIsIkhvdFRlc3RTdG9wIiwiSG90RGVzdGluYXRpb24iLCJIb3RUZXN0UGF0aCIsIkhvdFRlc3RQYWdlIl0sInNvdXJjZVJvb3QiOiIifQ==
|
|
1
|
+
var HotStaqWeb;(()=>{var __webpack_modules__={7833:(t,e,n)=>{e.formatArgs=function(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+t.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;e.splice(1,0,n,"color: inherit");let r=0,o=0;e[0].replace(/%[a-zA-Z%]/g,(t=>{"%%"!==t&&(r++,"%c"===t&&(o=r))})),e.splice(o,0,n)},e.save=function(t){try{t?e.storage.setItem("debug",t):e.storage.removeItem("debug")}catch(t){}},e.load=function(){let t;try{t=e.storage.getItem("debug")}catch(t){}return!t&&"undefined"!=typeof process&&"env"in process&&(t=process.env.DEBUG),t},e.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},e.storage=function(){try{return localStorage}catch(t){}}(),e.destroy=(()=>{let t=!1;return()=>{t||(t=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),e.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],e.log=console.debug||console.log||(()=>{}),t.exports=n(736)(e);const{formatters:r}=t.exports;r.j=function(t){try{return JSON.stringify(t)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}}},736:(t,e,n)=>{t.exports=function(t){function e(t){let n,o,s,i=null;function a(...t){if(!a.enabled)return;const r=a,o=Number(new Date),s=o-(n||o);r.diff=s,r.prev=n,r.curr=o,n=o,t[0]=e.coerce(t[0]),"string"!=typeof t[0]&&t.unshift("%O");let i=0;t[0]=t[0].replace(/%([a-zA-Z%])/g,((n,o)=>{if("%%"===n)return"%";i++;const s=e.formatters[o];if("function"==typeof s){const e=t[i];n=s.call(r,e),t.splice(i,1),i--}return n})),e.formatArgs.call(r,t),(r.log||e.log).apply(r,t)}return a.namespace=t,a.useColors=e.useColors(),a.color=e.selectColor(t),a.extend=r,a.destroy=e.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==i?i:(o!==e.namespaces&&(o=e.namespaces,s=e.enabled(t)),s),set:t=>{i=t}}),"function"==typeof e.init&&e.init(a),a}function r(t,n){const r=e(this.namespace+(void 0===n?":":n)+t);return r.log=this.log,r}function o(t){return t.toString().substring(2,t.toString().length-2).replace(/\.\*\?$/,"*")}return e.debug=e,e.default=e,e.coerce=function(t){return t instanceof Error?t.stack||t.message:t},e.disable=function(){const t=[...e.names.map(o),...e.skips.map(o).map((t=>"-"+t))].join(",");return e.enable(""),t},e.enable=function(t){let n;e.save(t),e.namespaces=t,e.names=[],e.skips=[];const r=("string"==typeof t?t:"").split(/[\s,]+/),o=r.length;for(n=0;n<o;n++)r[n]&&("-"===(t=r[n].replace(/\*/g,".*?"))[0]?e.skips.push(new RegExp("^"+t.slice(1)+"$")):e.names.push(new RegExp("^"+t+"$")))},e.enabled=function(t){if("*"===t[t.length-1])return!0;let n,r;for(n=0,r=e.skips.length;n<r;n++)if(e.skips[n].test(t))return!1;for(n=0,r=e.names.length;n<r;n++)if(e.names[n].test(t))return!0;return!1},e.humanize=n(6585),e.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(t).forEach((n=>{e[n]=t[n]})),e.names=[],e.skips=[],e.formatters={},e.selectColor=function(t){let n=0;for(let e=0;e<t.length;e++)n=(n<<5)-n+t.charCodeAt(e),n|=0;return e.colors[Math.abs(n)%e.colors.length]},e.enable(e.load()),e}},2733:function(t){t.exports=function(){"use strict";function t(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}return function e(n,r){function o(e,o,s){if("undefined"!=typeof document){"number"==typeof(s=t({},r,s)).expires&&(s.expires=new Date(Date.now()+864e5*s.expires)),s.expires&&(s.expires=s.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var i="";for(var a in s)s[a]&&(i+="; "+a,!0!==s[a]&&(i+="="+s[a].split(";")[0]));return document.cookie=e+"="+n.write(o,e)+i}}return Object.create({set:o,get:function(t){if("undefined"!=typeof document&&(!arguments.length||t)){for(var e=document.cookie?document.cookie.split("; "):[],r={},o=0;o<e.length;o++){var s=e[o].split("="),i=s.slice(1).join("=");try{var a=decodeURIComponent(s[0]);if(r[a]=n.read(i,a),t===a)break}catch(t){}}return t?r[t]:r}},remove:function(e,n){o(e,"",t({},n,{expires:-1}))},withAttributes:function(n){return e(this.converter,t({},this.attributes,n))},withConverter:function(n){return e(t({},this.converter,n),this.attributes)}},{attributes:{value:Object.freeze(r)},converter:{value:Object.freeze(n)}})}({read:function(t){return'"'===t[0]&&(t=t.slice(1,-1)),t.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(t){return encodeURIComponent(t).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"})}()},6585:t=>{var e=1e3,n=60*e,r=60*n,o=24*r,s=7*o;function i(t,e,n,r){var o=e>=1.5*n;return Math.round(t/n)+" "+r+(o?"s":"")}t.exports=function(t,a){a=a||{};var l,c,u=typeof t;if("string"===u&&t.length>0)return function(t){if(!((t=String(t)).length>100)){var i=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(i){var a=parseFloat(i[1]);switch((i[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*a;case"weeks":case"week":case"w":return a*s;case"days":case"day":case"d":return a*o;case"hours":case"hour":case"hrs":case"hr":case"h":return a*r;case"minutes":case"minute":case"mins":case"min":case"m":return a*n;case"seconds":case"second":case"secs":case"sec":case"s":return a*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return a;default:return}}}}(t);if("number"===u&&isFinite(t))return a.long?(l=t,(c=Math.abs(l))>=o?i(l,c,o,"day"):c>=r?i(l,c,r,"hour"):c>=n?i(l,c,n,"minute"):c>=e?i(l,c,e,"second"):l+" ms"):function(t){var s=Math.abs(t);return s>=o?Math.round(t/o)+"d":s>=r?Math.round(t/r)+"h":s>=n?Math.round(t/n)+"m":s>=e?Math.round(t/e)+"s":t+"ms"}(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))}},1814:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Hot=e.DeveloperMode=void 0;const s=n(8296),i=n(9343),a=n(1284),l=n(9844),c=o(n(2733)),u=o(n(2365)),h=o(n(8241));var p;!function(t){t[t.Production=0]="Production",t[t.Development=1]="Development"}(p=e.DeveloperMode||(e.DeveloperMode={}));class d{static getUrlParam(t,e){const n=new URLSearchParams(window.location.search).get(t);if(null==n)return null;if("string"==typeof e){switch(e){case"int":return parseInt(n);case"float":return parseFloat(n);case"email":if(!0===new RegExp("^\\S+@\\S+\\.\\S+$").test(n))return n;break;case"phone":if(!0===new RegExp("^\\+?([0-9 ]?){6,14}[0-9]$").test(n))return n;break;case"uuid":if(!0===new RegExp("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}").test(n))return n;break;default:if(e.indexOf("string")>-1){const t=parseInt(e.split("(")[1].split(")")[0]);if(n.length===t)return n}}throw new Error(`getUrlParam retreiving parameter "${t}" using validation type "${e}" failed.`)}return e(n)}static include(t,e=null){return r(this,void 0,void 0,(function*(){if(!0===i.HotStaq.isWeb&&"string"==typeof t){const e=t.toLowerCase();e.indexOf(".hott")>-1&&e.indexOf("nahfam")<0&&(t+="?hstqserve=nahfam")}d.echo(yield d.getFile(t,e))}))}static includeJS(t,e=null,o=null){return r(this,void 0,void 0,(function*(){const r=yield d.getFile(t);return!0===i.HotStaq.isWeb?null==o&&(o=window):null==o&&(o=n.g),new Function(r).apply(o,e)}))}static import(t,e=null,o=null){return r(this,void 0,void 0,(function*(){let r=d.CurrentPage.processor.getModule(t);if(null!=r)return r;const s=`./hotstaq_modules/${t}/index.js`,a=yield d.getFile(s,e);!0===i.HotStaq.isWeb?null==o&&(o=window):null==o&&(o=n.g);let l=new Function(a).apply(o);return null!=l.loadHTML&&(yield l.loadHTML()),d.CurrentPage.processor.addModule(t,l),l}))}static runFile(t,e=null){return r(this,void 0,void 0,(function*(){let n=d.CurrentPage.processor.getFile(t);n.page=this.CurrentPage;let r=yield n.process(e);d.echo(r)}))}static getFile(t,e=null){return r(this,void 0,void 0,(function*(){let n=null;"string"==typeof t?(n=new s.HotFile,n.name=t,!0===i.HotStaq.isWeb?n.url=t:n.localFile=t):n=t;let r=d.CurrentPage.processor.getFile(n.name,!1);return null!=r&&(n=r),yield n.load(),n.page=this.CurrentPage,yield n.process(e)}))}static apiCall(t,e=null,n=l.HotEventMethod.POST,o={},s=""){return r(this,void 0,void 0,(function*(){let r=null;if(null==d.CurrentPage)throw new Error("Current page is null!");if(null==d.CurrentPage.processor)throw new Error("Current page's processor is null!");if(null==d.CurrentPage.processor.api)throw new Error("Current page's processor api is null! Did you forget to set the API name or URL?");return null!=d.CurrentPage.processor.api&&(r=yield d.CurrentPage.processor.api.makeCall(t,e,n,o,s)),r}))}static getJSON(t,e=""){return r(this,void 0,void 0,(function*(){return d.jsonRequest(t,null,e,l.HotEventMethod.GET)}))}static jsonRequest(t,e=null,n="",o=l.HotEventMethod.POST){return r(this,void 0,void 0,(function*(){try{let r={method:o,headers:{Accept:"application/json","Content-Type":"application/json"}};o!==l.HotEventMethod.GET&&(r.body=JSON.stringify(e)),""!=n&&(r.headers.Authorization=`Bearer ${n}`);let s=yield(0,u.default)(t,r);if(!1===s.ok)throw new Error(`${s.status}: ${s.statusText}`);return yield s.json()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}static httpRequest(t,e,n=l.HotEventMethod.POST,o={},s=""){return r(this,void 0,void 0,(function*(){const i=Object.keys(o).length;let a=n.toLowerCase();n===l.HotEventMethod.FILE_UPLOAD&&(a="post");let c=!1;const p=new h.default;if(i>0){if("post"!==a)throw new Error("To upload files, you must set the httpMethod to POST.");for(let t in o){const e=o[t];null!=e&&(p.append(t,e),c=!0)}}if(!0===c){let n={method:"POST",headers:{HotStaqUpload:"true"},body:p};""!=s&&(n.headers={Authorization:`Bearer ${s}`});let r=yield(0,u.default)(t,n),o=yield r.json();return null==e.hotstaq&&(e.hotstaq={}),null==e.hotstaq.uploads&&(e.hotstaq.uploads={}),e.hotstaq.uploads.uploadId=o.hotstaq.uploads.uploadId,yield d.httpRequest(t,e,l.HotEventMethod.POST,{},s)}let f={method:a,headers:{Accept:"application/json","Content-Type":"application/json"}};return""!=s&&(f.headers.Authorization=`Bearer ${s}`),"get"!==a&&"head"!==a&&(f.body=JSON.stringify(e)),new Promise(((e,n)=>{(0,u.default)(t,f).then((n=>r(this,void 0,void 0,(function*(){n.json().then((t=>{e(t)})).catch((e=>{throw new Error(`${t}: ${e.message}`)}))})))).catch((e=>{throw new Error(`${t}: ${e.message}`)}))}))}))}static echo(t){d.Output+=t}static displayCSS(){for(let t=0;t<d.CSS.length;t++){let e=d.CSS[t],n=d.cssStr;n=n.replace(/\%CSS_FILE\%/g,e),d.echo(n)}}static displayJSFiles(){for(let t=0;t<d.JSFiles.length;t++){let e=d.JSFiles[t],n=d.jsFileStr;n=n.replace(/\%JS_FILE\%/g,e),d.echo(n)}}static displayJSScripts(){for(let t=0;t<d.JSScripts.length;t++){let e=d.JSScripts[t],n=d.jsScriptsStr;n=n.replace(/\%JS_CODE\%/g,e),d.echo(n)}}}e.Hot=d,d.CurrentPage=null,d.Arguments=null,d.DeveloperMode=p,d.HotTestElement=a.HotTestElement,d.Mode=p.Production,d.API=null,d.TesterAPI=null,d.Output="",d.Data={},d.Cookies=c.default,d.PublicKeys={},d.cssStr='<link rel = "stylesheet" href = "%CSS_FILE%" />',d.CSS=[],d.JSFiles=[],d.JSScripts=[],d.jsFileStr='<script type = "text/javascript" src = "%JS_FILE%"><\/script>',d.jsScriptsStr='<script type = "text/javascript">%JS_CODE%<\/script>'},6044:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotAPI=e.EventExecutionType=void 0;const o=n(3205),s=n(7605),i=n(9844),a=n(1814);var l;!function(t){t[t.HotRoute=0]="HotRoute",t[t.HotMethod=1]="HotMethod",t[t.HotAPI=2]="HotAPI"}(l=e.EventExecutionType||(e.EventExecutionType={})),e.HotAPI=class{constructor(t,e,n=null){if(null==e)throw new Error(`No server attached to api with baseUrl: ${t}`);this.connection=e,this.description="",this.bearerToken="",this.baseUrl=t,this.createFunctions=!0,this.executeEventsUsing=l.HotRoute,this.db=n,this.openAPI={},this.userAuth=null,this.routes={},this.onPreRegister=null,this.onPostRegister=null}setDBSchema(t){if(null==this.connection.api)throw new Error("No API has been set!");if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);this.connection.api.db.schema=t}getDB(){if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);return this.connection.api.db}getDBSchema(){if(null==this.connection.api.db)throw new Error(`No database has been set for API base url ${this.connection.api.baseUrl}`);return this.connection.api.db.schema}addRoute(t,e=null,n=null){let r="";"string"==typeof t?(r=t,null==this.routes[r]&&(this.routes[r]=new s.HotRoute(this.connection,r)),"string"==typeof e?this.routes[r].addMethod(i.HotRouteMethod.create(this.routes[r],e,n)):this.routes[r].addMethod(e)):(r=t.route,this.routes[t.route]=t),this.routes[r].connection=this.connection,!0===this.createFunctions&&this.createAPIRouteMethods(r)}createAPIRouteMethods(t){let e=this[t];null==e&&(e={});for(let n=0;n<this.routes[t].methods.length;n++){this.routes[t];let r=this.routes[t].methods[n];e[r.name]=(t,e)=>{let n=r.type,o=[r.getRouteUrl(),t,n,e,this.bearerToken];return this.makeCall.apply(this,o)}}this[t]=e}registerRoute(t){return r(this,void 0,void 0,(function*(){this.connection instanceof o.HotServer&&(yield this.connection.registerRoute(t))}))}registerRoutes(){return r(this,void 0,void 0,(function*(){for(let t in this.routes){let e=this.routes[t];yield this.registerRoute(e)}}))}makeCall(t,e,n=i.HotEventMethod.POST,o={},s=""){return r(this,void 0,void 0,(function*(){let r=this.baseUrl;return n.toUpperCase(),"/"===r[r.length-1]&&(r=r.substr(0,r.length-1)),"/"!==t[0]&&(r+="/"),r+=t,a.Hot.httpRequest(r,e,n,o,s)}))}}},5472:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotAsset=void 0,e.HotAsset=class{constructor(t,e=""){this.type=t,this.name=e,this.path="",this.content=""}load(){}output(){if(null==this.path&&null==this.content)throw new Error(`HotAsset ${this.name} of type ${this.type} does not have a path or content set!`);let t="";if(null!=this.path&&""!==this.path&&("js"===this.type&&(t=`<script type = "text/javascript" src = "${this.path}"><\/script>`),"css"===this.type&&(t=`<link href = "${this.path}" rel = "stylesheet" />`),"html"===this.type||"component"===this.type)){if(""===this.name)throw new Error("Loading an HTML or component asset requires a name to be set!");this.path,t={name:this.name,url:this.path}}if(null!=this.content&&""!==this.content){if("js"===this.type)throw new Error("Loading JS assets using content is not supported yet!");if("css"===this.type)throw new Error("Loading CSS assets using content is not supported yet!");if("html"===this.type){if(""===this.name)throw new Error("Loading an HTML asset requires a name to be set!");let e=JSON.stringify(this.content),n=this.path,r="";e=e.replace(new RegExp("\\<script","gmi"),'<scr" + "ipt'),e=e.replace(new RegExp("\\<\\/script","gmi"),'</scr" + "ipt'),r=e,t={name:this.name,url:n,content:e}}}return t}}},3025:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotClient=void 0;const r=n(3205);e.HotClient=class{constructor(t){this.processor=t,this.api=null,this.testerAPI=null,this.type=r.HotServerType.HTTP,this.logger=t.logger}}},3299:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotComponent=void 0;const r=n(9343);e.HotComponent=class{constructor(t,e=null){t instanceof r.HotStaq||null==t?(this.processor=t,this.htmlElements=[],this.name="",this.tag="",this.api=null,this.elementOptions=void 0,this.observedAttributes=[],this.type="",this.value=null,this.inner=null,this.events={}):(this.processor=t.processor,this.htmlElements=t.htmlElements||[],this.name=t.name||"",this.tag=t.tag||this.name,this.api=t.api||null,this.elementOptions=t.elementOptions||void 0,this.observedAttributes=t.observedAttributes||[],this.type=t.type||"",this.value=t.value||null,this.inner=t.inner||null,this.events={}),null!=e&&(this.api=e)}onCreated(t){return t}}},9164:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0})},8296:function(t,e,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&r(e,t,n);return o(e,t),e},i=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))},a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotFile=void 0;const l=s(n(1603)),c=a(n(2365)),u=n(1814);class h{constructor(t={}){this.page=t.page||null,this.name=t.name||"",this.url=t.url||"",this.localFile=t.localFile||"",this.content=t.content||"",this.throwAllErrors=t.throwAllErrors||!1}setContent(t){this.content=t}getContent(){return this.content}static httpGet(t){return i(this,void 0,void 0,(function*(){try{let e=yield(0,c.default)(t);if(!1===e.ok)throw new Error(`${e.status}: ${e.statusText}`);return yield e.text()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}loadUrl(){return i(this,void 0,void 0,(function*(){return this.content=yield h.httpGet(this.url),this.content}))}loadLocalFile(){return i(this,void 0,void 0,(function*(){return new Promise(((t,e)=>{l.readFile(this.localFile,((e,n)=>{if(null!=e)throw e;let r=n.toString();this.content=r,t(this.content)}))}))}))}load(){return i(this,void 0,void 0,(function*(){let t="";return""!==this.url&&(t=yield this.loadUrl()),""!==this.localFile&&(t=yield this.loadLocalFile()),t}))}static processContent(t,e,n,r,o=2,s=2){let i=e.exec(t),a=0,l="";for(;null!=i;){let c=i.index-o,u=e.lastIndex+s,h=t.substr(a,c-a);a=u,l+=r(h),l+=n(i[0]),i=e.exec(t)}return l+=r(t.substr(a)),l}static processNestedContent(t,e,n,r,o,s,i=2,a=1){let l=t.indexOf(e),c=0,u=t.indexOf(r,l),h="";for(;l>-1;){let p=t.indexOf(n,l),d=0;if(""!==r){let e=t.lastIndexOf(r,p-a);for(;e>-1&&e!==u;)e=t.lastIndexOf(r,e-a),d++}if(d>0){let r=t.indexOf(n,p+a),o=r;for(;r>-1&&d>0&&!(o<0)&&!(t.lastIndexOf(e,o-a)>r);)r=o,o=t.indexOf(n,r+a),d--;p=r}h+=s(t.substr(c,l-c)),h+=o(t.substr(l+i,p-(l+i)),l,p),l=t.indexOf(e,p+a),u=t.indexOf(r,l),c=p+a}return h+=s(t.substr(c)),h}static parseFunction(t,e,n){let r=t.indexOf("<(");for(;r>-1;){const o=t.indexOf(")",r),s=t.indexOf("=>",o),i=t.indexOf("{",s);let a=o;if(-1!==r&&-1!==o&&-1!==s&&-1!==i){let l=["}>","}A>","}a>","}R>","}RA>","}Ra>"],c=-1,u=null;for(let e=0;e<l.length;e++){let n=l[e],r=t.indexOf(n,s);r>-1&&(-1==c||r<c)&&(c=r,u=n)}if(c>-1){const s=t.slice(r+2,o).trim().split(",").map((t=>t.trim())),l=t.slice(i+1,c).trim();e(s);let h=n(l,u);t=t.slice(0,r)+h+t.slice(c+u.length),a=c}}r=t.indexOf("<(",a)}return t}static parseContent(t,e,n=null){null==n&&(n={outputCommands:!0,allowStringify:!0});let r="JSON.stringify (",o=")";return!1===n.allowStringify&&(r="",o=""),h.processContent(t,new RegExp("(?=\\<\\*)([\\s\\S]*?)(?=\\*\\>)","g"),(t=>`${t=t.substr(2)}`),(t=>{if(""===t)return"";let s=h.processNestedContent(t,"!{","}","{",((t,e,n)=>`*&&%*%@#@!${t}*&!#%@!@*!`),(t=>t)),i=h.processNestedContent(s,"STR{","}","{",((t,s,i)=>{let a="";return a=!0===n.outputCommands?`*&&%*%@#@!echoOutput (JSON.stringify(${t}), ${e});*&!#%@!@*!`:`*&&%*%@#@!${r}${t}${o}, ${e});*&!#%@!@*!`,a}),(t=>t),4,1),a="",l=h.parseFunction(i,(t=>{a=JSON.stringify(t)}),((t,e)=>{const n=t.replace(/\`/g,"\\`");let r="Hot.CurrentPage.callFunction",o="false";"}A>"===e&&(r="await Hot.CurrentPage.callAsyncFunction",o="true"),"}a>"===e&&(r="Hot.CurrentPage.callAsyncFunction",o="true"),"}R>"===e&&(r="return Hot.CurrentPage.callFunction"),"}RA>"===e&&(r="return await Hot.CurrentPage.callAsyncFunction",o="true"),"}Ra>"===e&&(r="return Hot.CurrentPage.callAsyncFunction",o="true");let s=`*&&%*%@#@!{\nconst newFuncName = createFunction (null, ${a}, \`${n}\`, ${o});\nHot.echo (\`${r} (this, '\${newFuncName}', arguments);\`);\n}*&!#%@!@*!`;return s=s.replace(/\$\{/g,"${&&!*#!!"),s})),c=h.processNestedContent(l,"${","}","{",((t,r,o)=>{let s="",i=n.outputCommands;if(t.indexOf("&&!*#!!")>-1){const e=t.replace(/&&\!\*\#\!\!/g,"");return`\${(typeof (${e}) !== "undefined") ? ${e} : "\${${e}}"}`}var a;return!0===i?(s=`*&&%*%@#@!try { Hot.echo (${t}); }catch (ex){Hot.echo (\`\\\${${a=t,a.replace(/[`]/g,"\\`")}}\`);}*&!#%@!@*!`,!0===e&&(s=`*&&%*%@#@!Hot.echo (${t});*&!#%@!@*!`)):s=`*&&%*%@#@!${t}*&!#%@!@*!`,s}),(t=>t)),p="";u.Hot.Mode===u.DeveloperMode.Production&&(p=h.processNestedContent(c,"?(",")","(",((t,e,n)=>""),(t=>t))),u.Hot.Mode===u.DeveloperMode.Development&&(p=h.processNestedContent(c,"?(",")","(",((t,e,r)=>{let o="";try{JSON.parse(t),o=!0===n.allowStringify?JSON.stringify(t):`${t}`}catch(e){o=`${t}`}let s="";if(!0===n.outputCommands)s=`*&&%*%@#@!{\nconst testElm = createTestElement (${o});\nHot.echo (\`data-test-object-name = "\${testElm.name}" data-test-object-func = "\${testElm.func}" data-test-object-value = "\${testElm.value}"\`);\n}*&!#%@!@*!\n`;else{let t=t=>{let e=null;try{let n=t;if("string"==typeof t&&(n=JSON.parse(t)),"string"==typeof n&&(e=new u.Hot.HotTestElement(n)),n instanceof Array&&(e=new u.Hot.HotTestElement(n[0],n[1],n[2])),null!=n.name&&(e=new u.Hot.HotTestElement(n)),null!=u.Hot.CurrentPage.testElements[e.name])throw new Error(`Test element ${e.name} already exists!`)}catch(e){throw new Error(`Error processing test element ${t} in ${u.Hot.CurrentPage.name}. Error: ${e.message}`)}return e};const e=t(o);s=`*&&%*%@#@!data-test-object-name = "${e.name}" data-test-object-func = "${e.func}" data-test-object-value = "${e.value}"*&!#%@!@*!`}return s}),(t=>t)));let d=h.processNestedContent(p,"*&&%*%@#@!","*&!#%@!@*!","*&&%*%@#@!",((t,e,n)=>t),(t=>{let r="";r=!0===n.allowStringify?JSON.stringify(t):t;let o="";return o=!0===n.outputCommands?`echoOutput (${r}, ${e});\n`:r,o}),10,10);return d=d.replace(/\*\&\&\%\*\%\@\#\@\!/g,""),d=d.replace(/\*\&\!\#\%\@\!\@\*\!/g,""),d}),0)}process(t=null){return i(this,void 0,void 0,(function*(){let e=this.content;if(null!=t&&t instanceof Array)throw new Error(`In ${this.name}, the passed arguments received cannot be an array!`);let n=u.Hot.Arguments;u.Hot.Mode=this.page.processor.mode,u.Hot.Arguments=t,u.Hot.CurrentPage=this.page,u.Hot.PublicKeys=this.page.processor.publicKeys,u.Hot.API=this.page.getAPI(),u.Hot.TesterAPI=this.page.getTesterAPI();let r=h.parseContent(e,this.throwAllErrors),o=null;try{let e="\n\t\t\tvar Hot = arguments[0];\n\t\t\tvar PassedHotFile = arguments[1];\n\n\t\t\t";if("string"==typeof t)throw new Error("The passing arguments cannot be a string!");for(let n in t){let r="",o=t[n];r=`var ${n} = ${JSON.stringify(o)};\n`,e+=r}let n=this.name;""===n&&(n=this.localFile),""===n&&(n=this.url),e+='\n\t\t\t/**\n\t\t\t * Helper function to output content.\n\t\t\t */\n\t\t\tfunction echoOutput (content, throwErrors)\n\t\t\t{\n\t\t\t\tif (throwErrors == null)\n\t\t\t\t\tthrowErrors = true;\n\n\t\t\t\tif (throwErrors === true)\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tHot.echo ("");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Outputs a ${JS Content} value.\n\t\t\t */\n\t\t\tfunction outputStr (value, possibleValue)\n\t\t\t{\n\t\t\t\tlet result = `\\${${value}}`;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tif (possibleValue != null)\n\t\t\t\t\t\tresult = possibleValue;\n\t\t\t\t\telse\n\t\t\t\t\t\tresult = eval (value);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t}\n\n\t\t\t\treturn (result);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Create a function for later execution on this page.\n\t\t\t */\n\t\t\tfunction createFunction (name, args, funcBody, isAsync)\n\t\t\t{\n\t\t\t\treturn (Hot.CurrentPage.addFunction (name, args, funcBody, isAsync));\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Create a test element.\n\t\t\t */\n\t\t\tfunction createTestElement (foundStr)\n\t\t\t{\n\t\t\t\tlet testElm = null;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tlet obj = foundStr;\n\n\t\t\t\t\tif (typeof (foundStr) === "string")\n\t\t\t\t\t\tobj = JSON.parse (foundStr);\n\n\t\t\t\t\tif (typeof (obj) === "string")\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (obj instanceof Array)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj[0], obj[1], obj[2]);\n\n\t\t\t\t\tif (obj["name"] != null)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (Hot.CurrentPage.testElements[testElm.name] != null)\n\t\t\t\t\t\tthrow new Error (`Test element ${testElm.name} already exists!`);\n\n\t\t\t\t\tHot.CurrentPage.addTestElement (testElm);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tthrow new Error (\n\t\t\t`Error processing test element ${foundStr} in ${Hot.CurrentPage.name}. Error: ${ex.message}`\n\t\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (testElm);\n\t\t\t}\n\n\t\t\tasync function runContent (CurrentHotFile)\n\t\t\t{\n',e+=r,e+="\n\t\t\t}\n\n\t\t\treturn (runContent (PassedHotFile).then (() =>\n\t\t\t{\n\t\t\t\treturn ({\n\t\t\t\t\t\thot: Hot,\n\t\t\t\t\t\toutput: Hot.Output,\n\t\t\t\t\t\tdata: JSON.stringify (Hot.Data)\n\t\t\t\t\t});\n\t\t\t}));";let s=new Function(e);o=yield s.apply(this,[u.Hot,this])}catch(t){throw SyntaxError,t}u.Hot.Data=o.hot.Data;let s=o.output;return u.Hot.Output="",u.Hot.Arguments=n,s}))}}e.HotFile=h},3622:(t,e)=>{"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.HotLog=e.HotLogLevel=void 0,function(t){t[t.Info=0]="Info",t[t.Warning=1]="Warning",t[t.Error=2]="Error",t[t.Verbose=3]="Verbose",t[t.All=4]="All",t[t.None=5]="None"}(n=e.HotLogLevel||(e.HotLogLevel={})),e.HotLog=class{constructor(t=n.All){this.logLevel=t,this.showResponses=!1,this.showHTTPEvents=!1,this.showWebSocketEvents=!1}static parse(t){let e=n.All;return"info"===t&&(e=n.Info),"warning"===t&&(e=n.Warning),"error"===t&&(e=n.Error),"verbose"===t&&(e=n.Verbose),"all"===t&&(e=n.All),"none"===t&&(e=n.None),e}log(t,e){this.logLevel===n.Verbose&&(t===n.Error&&this.error(e),t===n.Warning&&this.warning(e),t!==n.Info&&t!==n.Verbose||this.info(e)),this.logLevel===n.All&&(t===n.Error&&this.error(e),t===n.Warning&&this.warning(e),t===n.Info&&this.info(e)),this.logLevel===n.Error&&t===n.Error&&this.error(e),this.logLevel===n.Warning&&t===n.Warning&&this.warning(e),this.logLevel===n.Info&&t===n.Info&&this.info(e)}verbose(t,e=null){this.logLevel===n.Verbose&&("string"==typeof t?console.info(t):console.info(t(e)))}info(t){this.logLevel!==n.All&&this.logLevel!==n.Verbose&&this.logLevel!==n.Info||console.info(t)}warning(t){this.logLevel!==n.All&&this.logLevel!==n.Verbose&&this.logLevel!==n.Warning||console.warn(t)}error(t){if(this.logLevel===n.All||this.logLevel===n.Verbose||this.logLevel===n.Error){let e="";"string"==typeof t?e=t:(null!=t.message&&(e=t.message),null!=t.stack&&(e=t.stack)),console.error(e)}}}},6370:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotModule=void 0;const o=n(1814),s=n(5472);e.HotModule=class{constructor(t){this.name=t,this.import=[],this.html=[],this.css=[],this.js=[],this.componentLibrary="",this.components=[]}outputCSS(t=!0){if(null==this.css)return;let e="";return this.outputAsset("css",this.css,(t=>{const n=t.output();e+=`${n}\n`})),!0===t&&o.Hot.echo(e),e}outputJS(t=!0){if(null==this.js)return;let e="";return this.outputAsset("js",this.js,(t=>{const n=t.output();e+=`${n}\n`})),!0===t&&o.Hot.echo(e),e}output(t,e=null){return r(this,void 0,void 0,(function*(){yield o.Hot.include(`${this.name}/${t}.hott`,e)}))}loadHTML(){return r(this,void 0,void 0,(function*(){if(null==this.html)return;let t={};this.outputAsset("html",this.html,(e=>{const n=e.output();if("string"==typeof n)throw new Error("HTML assets cannot be outputted using only a string!");t[n.name]=n})),yield o.Hot.CurrentPage.processor.loadHotFiles(t)}))}outputComponents(t=!0){if(null==this.components)return"";if(this.components.length<1)return"";let e='<script type = "text/javascript">',n="";null!=this.componentLibrary&&""!==this.componentLibrary&&(n=`${this.componentLibrary}.`);for(let t=0;t<this.components.length;t++)e+=`Hot.CurrentPage.processor.addComponent (${n}${this.components[t]});\n`;return e+="<\/script>",!0===t&&o.Hot.echo(e),e}outputAsset(t,e=[],n){for(let r=0;r<e.length;r++){let o=e[r],i=null;i=new s.HotAsset(t),"string"==typeof o?i.path=o:(null!=o.name&&(i.name=o.name),null!=o.path&&(i.path=o.path),null!=o.content&&(i.content=o.content)),n(i)}}}},5989:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotPage=void 0;const o=n(1814),s=n(9343);e.HotPage=class{constructor(t){t instanceof s.HotStaq?(this.processor=t,this.name="",this.testerName="HotTesterMochaSelenium",this.testerMap="",this.route="",this.components={},this.files=[],this.functions={},this.testElements={},this.testPaths={}):(this.processor=t.processor,this.name=t.name||"",this.testerName=t.testerName||"HotTesterMochaSelenium",this.testerMap=t.testerMap||"",this.route=t.route||"",this.components=t.components||{},this.files=t.files||[],this.functions=t.functions||{},this.testElements=t.testElements||{},this.testPaths=t.testPaths||{})}addFile(t){return r(this,void 0,void 0,(function*(){t.page=this,this.files.push(t)}))}getAPI(){return this.processor.api}getTesterAPI(){return this.processor.testerAPI}load(t){return r(this,void 0,void 0,(function*(){for(let t=0;t<this.files.length;t++){let e=this.files[t];yield e.load()}}))}process(t=null){return r(this,void 0,void 0,(function*(){let e="";for(let n=0;n<this.files.length;n++){let r=this.files[n];o.Hot.Output="",r.page=this,e+=(yield r.process(t))}return e}))}addFunction(t,e,n,r=!1){null==t&&(t="__func"+Object.keys(this.functions).length);let o="",s="";!0===r&&(s="async ");for(let t=0;t<e.length;t++){const n=e[t];let r=",";t==e.length-1&&(r=""),o+=`${n}${r}`}return this.functions[t]=new Function(`return (${s}(${o}) => { ${n} }).apply (this, arguments);`),t}callFunction(t,e,n){let r=this.functions[e];if(null==r)throw new Error(`Function ${e} does not exist!`);return r.apply(t,n)}callAsyncFunction(t,e,n){return r(this,void 0,void 0,(function*(){let r=this.functions[e];if(null==r)throw new Error(`Function ${e} does not exist!`);return r.apply(t,n)}))}addTestElement(t){if(null!=this.testElements[t.name])throw new Error(`Test element ${t.name} already exists!`);this.testElements[t.name]=t}getTestElement(t){if(null==this.testElements[t])throw new Error(`Test element ${t} doest not exist!`);return this.testElements[t]}createTestPath(t,e){if(null!=this.testPaths[t])throw new Error(`Test path ${t} already exists!`);this.testPaths[t]=e}}},7605:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRoute=void 0;const r=n(9844);class o{constructor(t,e,n=[]){this.onPreRegister=null,this.onRegister=null,this.onPostRegister=null,this.onAuthorizeUser=null,this.connection=t,this.logger=null,null!=this.connection&&null!=this.connection.processor&&(this.logger=this.connection.processor.logger),this.route=e,this.description="",this.openAPI=null,this.version="v1",this.prefix="",this.methods=n,this.errors={not_authorized:o.createError("Not authorized."),no_server_execute_function:o.createError("Missing server execute function.",500)}}static createError(t,e=400){return{error:t,errorCode:e}}addMethod(t,e=null,n=r.HotEventMethod.POST,o=null){return"string"==typeof t&&(t=r.HotRouteMethod.create(this,t,e,n,null,null,o)),t instanceof r.HotRouteMethod||(null==t.route&&(t.route=this),t=r.HotRouteMethod.create(t)),this.methods.push(t),t}getMethod(t){let e=null;for(let n=0;n<this.methods.length;n++){let r=this.methods[n];if(r.name===t){e=r;break}}return e}}e.HotRoute=o},9844:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRouteMethod=e.ServerRequest=e.PassType=e.HotEventMethod=void 0;const r=n(1814),o=n(7605),s=n(3205);var i,a;!function(t){t.GET="get",t.POST="post",t.FILE_UPLOAD="file_upload_then_post_json",t.WEBSOCKET_CLIENT_PUB_EVENT="websocket_client_pub_event",t.POST_AND_WEBSOCKET_CLIENT_PUB_EVENT="post_and_websocket_client_pub_event"}(i=e.HotEventMethod||(e.HotEventMethod={})),(a=e.PassType||(e.PassType={}))[a.ReturnToClient=0]="ReturnToClient",a[a.Update=1]="Update",a[a.Ignore=2]="Ignore",e.ServerRequest=class{constructor(t=null){null==t&&(t={}),this.req=t.req||null,this.res=t.res||null,this.bearerToken=t.bearerToken||"",this.wsSocket=t.wsSocket||null,this.authorizedValue=t.authorizedValue||null,this.jsonObj=t.jsonObj||null,this.queryObj=t.queryObj||null,this.files=t.files||null}};class l{constructor(){this.route=null,this.name="",this.description="",this.openAPI=null,this.tags=[],this.returns=null,this.parametersRefName="",this.parameters={},this.queryParameters={},this.type=i.POST,this.isRegistered=!1,this.executeSetup=!0,this.testCases={},this.onPreRegister=null,this.onRegister=null,this.onPostRegister=null,this.onServerAuthorize=null,this.onServerExecute=null,this.onClientExecute=null}static create(t,e="",n=null,a=i.POST,c=null,u=null,h=null){let p=new l,d=null;if(t instanceof o.HotRoute)d=t;else{if(d=t.route,null!=t.type&&(a=t.type),null!=t.name&&(e=t.name),null!=t.name&&(p.tags=t.tags),null!=t.description&&(p.description=t.description),null!=t.openAPI&&(p.openAPI=t.openAPI),null!=t.parametersRefName&&(p.parametersRefName=t.parametersRefName),null!=t.queryParameters&&(p.queryParameters=t.queryParameters),null!=t.returns&&("string"==typeof t.returns?p.returns={type:"string",required:!0,description:t.returns}:(t.returns,p.returns=t.returns)),null!=t.parameters)if(t.parameters instanceof Function)p.parameters=t.parameters;else for(let e in t.parameters){let n=t.parameters[e];"string"==typeof n?p.parameters[e]={type:"string",required:!1,description:n}:("function"==typeof n||null==n.type&&(n.type="string"),p.parameters[e]=n)}null!=t.onServerExecute&&(n=t.onServerExecute),null!=t.onServerAuthorize&&(c=t.onServerAuthorize),null!=t.onRegister&&(u=t.onRegister),null!=t.onPostRegister&&(p.onPostRegister=t.onPostRegister),null!=t.onServerExecute&&(p.onServerExecute=t.onServerExecute),null!=t.onClientExecute&&(p.onClientExecute=t.onClientExecute),null!=t.testCases&&(h=t.testCases)}if(""===e)throw new Error("All route methods must have a name!");if(p.route=d,p.name=e,p.type=a,p.isRegistered=!1,p.executeSetup=!1,p.onServerAuthorize=c,p.onRegister=u,p.testCases={},p.route.connection.processor.mode===r.DeveloperMode.Development&&null!=h)if(h instanceof Array)for(let t=0;t<h.length;t++){let e=h[t];if("string"==typeof e){const n=e,r=h[t+1];p.addTestCase(n,r),t++}else p.addTestCase(e)}else for(let t in h){let e=h[t];p.addTestCase(e)}return p.route.connection instanceof s.HotServer&&(p.onServerExecute=n),p}addTestCase(t,e=null){if("string"==typeof t){const n=t,r=e;return void(this.testCases[n]={name:n,func:r})}if("function"==typeof t){const e=Object.keys(this.testCases).length,n=`${this.route.route}/${this.name} test case ${e}`,r=t;return void(this.testCases[n]={name:n,func:r})}const n=t;this.testCases[n.name]=n}getRouteUrl(){if(null==this.route)throw new Error(`Route method ${this.name} does not have a parent route!`);let t="/";return""!==this.route.version&&(t+=`${this.route.version}/`),""!==this.route.prefix&&(t+=`${this.route.prefix}/`),""!==this.route.route&&(t+=`${this.route.route}/`),t+=this.name,t}}e.HotRouteMethod=l},3205:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotServer=e.HotServerType=void 0;const o=n(9343);var s;!function(t){t[t.HTTP=0]="HTTP",t[t.WebSockets=1]="WebSockets",t[t.Generate=2]="Generate",t[t.WebTesting=3]="WebTesting",t[t.APITesting=4]="APITesting"}(s=e.HotServerType||(e.HotServerType={})),e.HotServer=class{constructor(t){t instanceof o.HotStaq?(this.processor=t,this.serverType="Server",this.api=null,this.listenAddress="0.0.0.0",this.ports={http:5e3,https:443},this.ssl={cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=!0,this.type=s.HTTP,this.logger=t.logger,this.secrets={}):(this.processor=t.processor,this.serverType=t.serverType||"Server",this.api=t.api||null,this.listenAddress=t.listenAddress||"0.0.0.0",this.ports=t.ports||{http:5e3,https:443},this.ssl=t.ssl||{cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=null==t.redirectHTTPtoHTTPS||t.redirectHTTPtoHTTPS,this.type=t.type||s.HTTP,this.logger=t.logger,this.secrets=t.secrets||{})}setAPI(t){return r(this,void 0,void 0,(function*(){this.processor.api=t,this.api=t}))}}},5269:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0})},9343:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),__importStar=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&__createBinding(e,t,n);return __setModuleDefault(e,t),e},__awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))},__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotStaq=void 0;const ppath=__importStar(__webpack_require__(9247)),node_fetch_1=__importDefault(__webpack_require__(2365)),validate_npm_package_name_1=__importDefault(__webpack_require__(7963)),HotPage_1=__webpack_require__(5989),HotFile_1=__webpack_require__(8296),HotLog_1=__webpack_require__(3622),Hot_1=__webpack_require__(1814),HotAsset_1=__webpack_require__(5472),HotClient_1=__webpack_require__(3025),HotTesterAPI_1=__webpack_require__(6681),HotTestMap_1=__webpack_require__(6434),HotTestDestination_1=__webpack_require__(4744),HotStaqRegisterComponent_1=__webpack_require__(6019),HotStaqWebStart_1=__webpack_require__(6061);var HotTesterMocha=null,HotTesterMochaSelenium=null,HotTestSeleniumDriver=null;class HotStaq{constructor(t={}){this.logger=new HotLog_1.HotLog(HotLog_1.HotLogLevel.All),this.startDelay=0,this.api=t.api||null,this.testerAPI=t.testerAPI||null,this.mode=t.mode||Hot_1.DeveloperMode.Production,this.pages=t.pages||{},this.modules=t.modules||{},this.components=t.components||{},this.files=t.files||{},this.hotSite=t.hotSite||null,this.apiContent="\n\t\t\t{\n\t\t\t\tvar %api_name% = %api_exported_name%.%api_name%;\n\t\t\t\tvar newHotClient = new HotClient (processor);\n\t\t\t\tvar newapi = new %api_name% (%base_url%, newHotClient);\n\t\t\t\tnewHotClient.api = newapi;\n\t\t\t\tprocessor.api = newapi;\n\t\t\t}",this.testerApiContent="\n\t\t\tvar HotTesterAPI = HotStaqWeb.HotTesterAPI;\n\t\t\tvar newHotTesterClient = new HotClient (processor);\n\t\t\tvar newtesterapi = new HotTesterAPI (%base_tester_url%, newHotTesterClient);\n\t\t\tnewHotTesterClient.testerAPI = newtesterapi;\n\t\t\tprocessor.testerAPI = newtesterapi;",this.pageContent='<!DOCTYPE html>\n<html>\n\n<head>\n\t<title>%title%</title>\n\n\t<script type = "text/javascript" src = "%hotstaq_js_src%"><\/script>\n\t<script type = "text/javascript">\n\t\twindow.hotstaqStartingApp = true;\n\n\t\tfor (let key in HotStaqWeb)\n\t\t\twindow[key] = HotStaqWeb[key];\n\t<\/script>\n\n%apis_to_load%\n\n\t<script type = "text/javascript">\n\t\tasync function hotstaq_startApp ()\n\t\t{\n\t\t\tlet tempMode = 0;\n\n\t\t\tif (window["Hot"] != null)\n\t\t\t\ttempMode = Hot.Mode;\n\n\t\t\t%start_delay%\n\n\t\t\tvar processor = new HotStaq ();\n\t\t\tprocessor.logger.logLevel = %logging_level%;\n\n\t\t\tvar promises = [];\n\t\t\t%developer_mode%\n\n\t\t\t%api_code%\n\n\t\t\t%public_secrets%\n\t\t\t%tester_api%\n\t\t\t%load_files%\n\n\t\t\tprocessor.mode = tempMode;\n\n\t\t\tPromise.all (promises).then (function ()\n\t\t\t\t{\n\t\t\t\t\tHotStaq.displayUrl ({\n\t\t\t\t\t\t\turl: "%url%",\n\t\t\t\t\t\t\tname: "%title%",\n\t\t\t\t\t\t\tprocessor: processor,\n\t\t\t\t\t\t\targs: %args%,\n\t\t\t\t\t\t\ttesterName: %tester_name%,\n\t\t\t\t\t\t\ttesterMap: %tester_map%,\n\t\t\t\t\t\t\ttesterAPIBaseUrl: %tester_api_base_url%,\n\t\t\t\t\t\t\ttesterLaunchpadUrl: %tester_launchpad_url%\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\thotstaq_startApp ();\n\t<\/script>\n</head>\n\n<body>\n</body>\n\n</html>',this.publicKeys={},this.testers={}}static parseBoolean(t){return"true"===(t=t.toLowerCase())||"false"!==t&&("yes"===t||"no"!==t&&"yep"===t)}static convertInterfaceToRouteParameters(sourceCodePath,interfaceName,options={typeConversions:{Date:"string"},returnFirstUnionType:!0,unknownTypeDefaultsToType:"string"}){return __awaiter(this,void 0,void 0,(function*(){let parameters={};if(!0===HotStaq.isWeb)throw new Error("HotStaq.convertInterfaceToRouteParameters is not supported in the browser.");let HotIO=eval("require")("./HotIO").HotIO;const sourceCodeContent=yield HotIO.readTextFile(sourceCodePath);let parseInterface=eval("require")("./HotConvertInterfaceToRouteParameters").parseInterface;const output=parseInterface("./temp.ts",sourceCodeContent,interfaceName,options);if(null==output)throw new Error(`Interface ${interfaceName} not found in ${sourceCodePath}.`);for(let t=0;t<output.properties.length;t++){let e=output.properties[t],n="";e.comments.length>0&&(n=e.comments[0]),parameters[e.name]={type:e.type,required:!e.isOptional,description:n},!0===e.readOnly&&(parameters[e.name].readOnly=!0),!0===e.isArray&&(parameters[e.name].type="array",parameters[e.name].items={type:e.type})}return parameters}))}static getParam(t,e,n=!0,r=!0){let o=e[t];if(null==o&&!0===n&&!0===r)throw new Error(`Missing required parameter ${t}.`);if("string"==typeof o&&!0===n&&""===o&&!0===r)throw new Error(`Missing required parameter ${t}.`);return o}static getParamRange(t,e,n,r,o=!0,s=!0){const i=HotStaq.getParam(t,e,o,s);if(i<n)throw new Error(`Parameter ${t} must be greater than or equal to ${n}.`);if(i>r)throw new Error(`Parameter ${t} must be less than or equal to ${r}.`);return i}static getParamDefault(t,e,n){let r=e[t];return null==r||"string"==typeof r&&""===r?n:r}static checkIfEmpty(t){return!t}static getParamDefaultRange(t,e,n,r,o){const s=HotStaq.getParamDefault(t,e,n);if(s<r)throw new Error(`Parameter ${t} must be greater than or equal to ${r}.`);if(s>o)throw new Error(`Parameter ${t} must be less than or equal to ${o}.`);return s}static executeError(t){if(null!=HotStaq.errors[t]){let e=HotStaq.errors[t].redirectToUrl;if(null!=e&&""!==e)return void(window.location.href=e);let n=HotStaq.errors[t].func;null!=n&&n(t)}}static wait(t){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((e,n)=>{setTimeout((()=>{e()}),t)}))}))}addPage(t){this.pages[t.name]=t}getPage(t){return this.pages[t]}addModule(t,e){this.modules[t]=e}getModule(t){return this.modules[t]}addFile(t){let e=t.name;""===e&&(e=t.localFile),""===e&&(e=t.url),this.files[e]=t}getFile(t,e=!0){if(null==this.files[t]){let n=t.indexOf("?hstqserve="),r=t;if(n>-1&&(r=t.substring(0,n)),null!=this.files[r])return this.files[r];if(!0===e)throw new Error(`Unable to find file ${t}`);return null}return this.files[t]}static keepContext(t,e,n){return function(){var r=Array.prototype.slice.call(arguments);return null!=n&&r.push(n),null==e?t.apply(this,r):t.apply(e,r)}}addComponent(t,e=null,n=void 0){let r=this.api;null!=e&&(r=e);let o=new t(this,r);if(null!=this.components[o.tag])throw new Error(`Component ${o.tag} already exists!`);this.components[o.tag]={componentType:t,processor:this,api:r},HotStaqRegisterComponent_1.registerComponent.call(this,o.tag,n)}static fixHTML(t){const e=t.replace(/ \/>/g,">").replace(/(<(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr).*?>)/g,"$1</$2>"),n=(new DOMParser).parseFromString(`<xml>${e}</xml>`,"text/xml");let r="";if(n.documentElement.children.length>0){const e=n.documentElement.children[0].tagName.toLowerCase();"tr"===e&&(t=`<table>${t}</table>`,r="tbody"),"th"===e&&(t=`<table>${t}</table>`,r=e)}return{fixedStr:t,querySelector:r}}static addHtml(t,e){let n=null;if(n="string"==typeof t?document.querySelector(t):t,null==n)throw new Error(`Unable to find parent ${t}!`);let r=null;if("string"==typeof e){let t=HotStaq.fixHTML(e),r=(new DOMParser).parseFromString(t.fixedStr,"text/html"),o=null;o=""===t.querySelector?r.body.children:r.querySelector(t.querySelector).children;let s=[];for(let t=0;t<o.length;t++){let e=o[t];s.push(n.appendChild(e))}return s}return r=n.appendChild(e),r}static checkHotSiteName(t,e=!1){let n=(0,validate_npm_package_name_1.default)(t),r=!0;if(!1===n.validForNewPackages&&(r=!1),null!=n.errors&&n.errors.length>0&&(r=!1),!1===r&&!0===e)throw new Error(`HotSite ${t} has an invalid name! The name cannot be empty and must have a valid NPM module name.`);return r}static replaceKey(t,e,n){return t.replace(new RegExp(`\\$\\{${e}\\}`,"g"),n)}static getValueFromHotSiteObj(t,e){let n=null;if(null!=t){let r=t;for(let t=0;t<e.length;t++){let n=e[t];if(null==r[n]){r=null;break}r=r[n]}null!=r&&(n=r)}return n}processHotSite(tester=null){return __awaiter(this,void 0,void 0,(function*(){HotStaq.checkHotSiteName(this.hotSite.name,!0);let routes=this.hotSite.routes;if(null!=routes)for(let t in routes){let e=routes[t],n=new HotFile_1.HotFile(e),r=new HotPage_1.HotPage({processor:this,name:e.name||"",route:t,files:[n]});if(null!=tester&&this.mode===Hot_1.DeveloperMode.Development){let t=e.name,n=null;if(null!=e.map){if("string"==typeof e.map){if(null==tester.testMaps[e.map])throw new Error(`Test map ${e.map} does not exist!`);tester.testMaps[t]=tester.testMaps[e.map]}else{n=new HotTestMap_1.HotTestMap;let t=null;if(e.map instanceof Array){t=[];for(let n=0;n<e.map.length;n++){let r=e.map[n];t.push(new HotTestDestination_1.HotTestDestination(r))}}else{t={};for(let n in e.map){let r=e.map[n];t[n]=new HotTestDestination_1.HotTestDestination(r)}}n.destinations=t}tester.testMaps[t]=n}null!=e.destinationOrder&&(tester.testMaps[t].destinationOrder=e.destinationOrder)}this.addPage(r)}if(null!=this.hotSite.web)for(let t in this.hotSite.web){const e=this.hotSite.web[t];if(null!=e.map&&!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development){let n=t,r=new HotTestMap_1.HotTestMap;r.destinations=[];for(let t=0;t<e.map.length;t++){let n=e.map[t];r.destinations.push(new HotTestDestination_1.HotTestDestination(n))}null!=tester?tester.testMaps[n]=r:this.logger.warning("A tester was not created first! You must specify one in the CLI.")}}if(null!=this.hotSite.apis)for(let t in this.hotSite.apis){let e=this.hotSite.apis[t];if(null!=e.map&&!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development){let n=t,r=new HotTestMap_1.HotTestMap;r.destinations=[];for(let t=0;t<e.map.length;t++){let n=e.map[t];r.destinations.push(new HotTestDestination_1.HotTestDestination(n))}null!=tester?tester.testMaps[n]=r:this.logger.warning("A tester was not created first! You must specify one in the CLI.")}}if(!0===HotStaq.isWeb)for(let key in this.hotSite.components){let component=this.hotSite.components[key],componentUrl=component.url,res=yield(0,node_fetch_1.default)(componentUrl),ComponentClass=eval(res);this.addComponent(ComponentClass)}null==this.hotSite.routes&&(this.hotSite.routes={});let disableFileLoading=!1;null!=this.hotSite.disableFileLoading&&(disableFileLoading=this.hotSite.disableFileLoading),!1===disableFileLoading?yield this.loadHotFiles(this.hotSite.files,!1,!1):this.logger.verbose("Hotsite has file loading disabled..."),null!=tester&&this.addTester(tester),this.logger.verbose(`Processed HotSite ${this.hotSite.name}`)}))}loadHotSite(path){return __awaiter(this,void 0,void 0,(function*(){let jsonStr="";const ext=ppath.extname(path).toLowerCase();if(!0===HotStaq.isWeb){this.logger.verbose(`Downloading HotSite ${path}`);let t=yield(0,node_fetch_1.default)(path);this.logger.verbose(`Downloaded site ${path}`),jsonStr=t.text()}else{path=ppath.normalize(path),this.logger.verbose(`Accessing HotSite ${path}`);let HotIO=eval("require")("./HotIO").HotIO;if(!1===(yield HotIO.exists(path)))throw new Error(`HotSite ${path} does not exist!`);jsonStr=yield HotIO.readTextFile(path),this.logger.verbose(`Accessed site ${path}`)}if(".yaml"===ext||".yml"===ext){if(!0===HotStaq.isWeb)throw new Error("YAML support for HotSites is not available on the web yet!");let yaml=eval("require")("yaml");this.hotSite=yaml.parse(jsonStr)}else this.hotSite=JSON.parse(jsonStr);if(null==this.hotSite)throw new Error(`HotSite ${path} cannot be null!`);this.hotSite.hotsitePath=path}))}saveHotSite(path){return __awaiter(this,void 0,void 0,(function*(){if(!0===HotStaq.isWeb)throw new Error("Cannot save a HotSite on the web!");const ext=ppath.extname(path).toLowerCase();let hotsiteStr="";if(".yaml"===ext||".yml"===ext){let yaml=eval("require")("yaml");hotsiteStr=yaml.stringify(this.hotSite)}else hotsiteStr=JSON.stringify(this.hotSite,null,2);let HotIO=eval("require")("./HotIO").HotIO;yield HotIO.writeTextFile(path,hotsiteStr),this.logger.verbose(`Saved site ${path}`)}))}loadHotFiles(t,e=!1,n=!0){return __awaiter(this,void 0,void 0,(function*(){this.logger.verbose("Loading Hott files...");for(let r in t){let o=t[r],s=null;HotStaq.isWeb,s=new HotFile_1.HotFile({name:r}),null!=o.url&&(!0===HotStaq.isWeb?s.url=`${o.url}?hstqserve=nahfam`:s.url=o.url),!1===HotStaq.isWeb&&null!=o.localFile&&(s.localFile=o.localFile);let i=!0;null!=o.content&&(s.content=o.content,i=!1),!0===e&&(i=!0),!1===n&&""!==s.url&&(i=!1),!0===i&&(this.logger.verbose(`Loading Hott file: ${s.url}`),yield s.load(),this.logger.verbose(`Finished loading Hott file: ${s.url}`)),this.addFile(s)}this.logger.verbose("Finished loading Hott files...")}))}generateContent(t,e="",n="./",r="./js/HotStaq.min.js",o=!0,s=null){return __awaiter(this,void 0,void 0,(function*(){let i="",a="",l="";if(null!=this.hotSite){if(null!=this.hotSite.server.globalApi&&""!==this.hotSite.server.globalApi){const t=this.hotSite.apis[this.hotSite.server.globalApi];if(null==t)this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't exist!`);else{let e=!0;if(null==t.jsapi&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a apiName set. Will not send js content to client.`)),!0===e){i+=`\t<script type = "text/javascript" src = "${t.jsapi}"><\/script>\n`;let e='""';null!=t.url&&(e=`"${t.url}"`),null!=this.api&&(e=`"${this.api.baseUrl}"`);let n=this.apiContent;n=n.replace(/\%api\_name\%/g,t.apiName),n=n.replace(/\%api\_exported\_name\%/g,t.libraryName),n=n.replace(/\%base\_url\%/g,e),a+=n}}}if(null!=this.hotSite.apis){let e=this.hotSite.routes[t];if(null!=e&&null!=e.api){let t=this.hotSite.apis[e.api];if(null==t)throw new Error(`Unable to find API ${e.api}`);if(e.api!==this.hotSite.server.globalApi){let n=!0;if(null==t.jsapi&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a apiName set. Will not send js content to client.`)),!0===n){let e=t.jsapi;i+=`\t<script type = "text/javascript" src = "${e}"><\/script>\n`;let n='""';null!=t.url&&(n=`"${t.url}"`),null!=this.api&&(n=`"${this.api.baseUrl}"`);let r=this.apiContent;r=r.replace(/\%api\_name\%/g,t.apiName),r=r.replace(/\%api\_exported\_name\%/g,t.libraryName),r=r.replace(/\%base\_url\%/g,n),a+=r}}}}if(null!=this.hotSite.server&&null!=this.hotSite.server.jsSrcPath&&(r=this.hotSite.server.jsSrcPath),null!=this.hotSite.publicKeys)for(let t in this.hotSite.publicKeys){let e,n=this.hotSite.publicKeys[t];if("string"==typeof n)e=JSON.stringify(n);else if(!1===HotStaq.isWeb){if(null!=this.api){if(null==this.api.connection)throw new Error("Cannot pass secrets from the API if there's no connection!");let r=this.api.connection;null!=n.passSecretFromAPI&&(e=JSON.stringify(r.secrets[t]))}if(null!=n.env){const t=n.env;e=JSON.stringify(process.env[t])}}l+=`processor.publicKeys["${t}"] = ${e};\n`}}let c=this.pageContent;return c=yield(c=>__awaiter(this,void 0,void 0,(function*(){let u="",h="";this.mode===Hot_1.DeveloperMode.Development&&(u="tempMode = HotStaqWeb.DeveloperMode.Development;",null!=this.hotSite&&null!=this.hotSite.testing&&null!=this.hotSite.testing.web&&(h=this.testerApiContent,null==this.hotSite.testing.web.testerAPIUrl&&(this.hotSite.testing.web.testerAPIUrl="http://127.0.0.1:8182"),h=h.replace(/\%base\_tester\_url\%/g,`"${this.hotSite.testing.web.testerAPIUrl}"`)));let p="";if(Object.keys(this.files).length>0){p+="var files = {};\n\n";for(let t in this.files){let e=this.files[t],n=new HotAsset_1.HotAsset("html",t);""!==e.localFile&&(n.path=e.localFile),""!==e.url&&(n.path=e.url),""!==e.content&&(n.path="",n.content=e.content);let r=yield n.output();if("string"==typeof r)throw new Error("During initial load, HTML assets cannot be outputted using only a string!");let o="",s="";null!=r.url&&(o=`"url": "${r.url}", `),null!=r.content&&(s=`"content": ${r.content}`),p+=`\t\t\tfiles["${r.name}"] = { ${o}${s} };\n`}p+="\t\t\tpromises.push (processor.loadHotFiles (files));\n"}c=c.replace(/\%title\%/g,e),!0===o&&(c=c.replace(/\%args\%/g,"Hot.Arguments")),null!=s&&(c=c.replace(/\%args\%/g,JSON.stringify(s)));let d=t,f="",m="",g="HotTesterMochaSelenium";for(let t in this.testers){g=t;break}null!=this.hotSite&&(null!=this.hotSite.testing&&null!=this.hotSite.testing.web&&(null!=this.hotSite.testing.web.testerName&&(g=this.hotSite.testing.web.testerName),null!=this.hotSite.testing.web.testerAPIUrl&&(f=this.hotSite.testing.web.testerAPIUrl),null!=this.hotSite.testing.web.launchpadUrl&&(m=this.hotSite.testing.web.launchpadUrl)),null!=this.hotSite.routes&&null!=this.hotSite.routes[t])&&(d=this.hotSite.routes[t].name);let y="";return 0!==this.startDelay&&(y=`await HotStaq.wait (${this.startDelay});`),c=(c=(c=(c=(c=(c=(c=(c=(c=(c=(c=(c=(c=(c=c.replace(/\%start\_delay\%/g,y)).replace(/\%logging\_level\%/g,`HotLogLevel.${HotLog_1.HotLogLevel[this.logger.logLevel]}`)).replace(/\%hotstaq\_js\_src\%/g,r)).replace(/\%developer\_mode\%/g,u)).replace(/\%tester\_api\%/g,h)).replace(/\%apis\_to\_load\%/g,i)).replace(/\%load\_files\%/g,p)).replace(/\%api\_code\%/g,a)).replace(/\%public\_secrets\%/g,l)).replace(/\%url\%/g,n)).replace(/\%tester\_name\%/g,`"${g}"`)).replace(/\%tester\_map\%/g,`"${d}"`)).replace(/\%tester\_api\_base\_url\%/g,`"${f}"`)).replace(/\%tester\_launchpad\_url\%/g,`"${m}"`)})))(c),c}))}createExpressRoutes(t,e="./js/HotStaq.min.js"){return __awaiter(this,void 0,void 0,(function*(){for(let n in this.pages){let r=this.pages[n];const o=yield this.generateContent(r.route,r.name,r.files[0].url,e);t.get(r.route,((t,e)=>{this.logger.verbose("Sending custom Express content."),e.status(200).send(o)}))}}))}addTester(t){this.testers[t.name]=t}getWebTestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.web)throw new Error("The HotSite does not have a testing web object!");if(null==this.hotSite.testing.web.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.web.maps}getAPITestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.api)throw new Error("The HotSite does not have a testing api object!");if(null==this.hotSite.testing.api.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.api.maps}getRouteKeyFromName(t){let e="";if(null!=this.hotSite){if(null!=this.hotSite.routes)for(let n in this.hotSite.routes)if(this.hotSite.routes[n].name===t){e=n;break}if(null!=this.hotSite.web)for(let t in this.hotSite.web)if(null!=this.hotSite.web[t]){e=t;break}}return e}getRouteFromName(t){let e=null,n=this.getRouteKeyFromName(t);return""!==n&&(e=this.hotSite.routes[n]),e}executeTests(t,e){return __awaiter(this,void 0,void 0,(function*(){let n=this.testers[t];if(null==n)throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);return n.execute(e)}))}executeAllWebTests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getWebTestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}executeAllAPITests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getAPITestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);this.logger.verbose((()=>`Executing all API tests for tester ${t}. Maps: ${JSON.stringify(e)}`));for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}process(t,e=null){return __awaiter(this,void 0,void 0,(function*(){let n=this.getPage(t);return yield n.process(e)}))}static processLocalFile(t,e=t,n=null){return __awaiter(this,void 0,void 0,(function*(){let r=new HotStaq,o=new HotFile_1.HotFile({localFile:t});yield o.load();let s=new HotPage_1.HotPage({processor:r,name:e,files:[o]});return r.addPage(s),yield r.process(e,n)}))}static processUrl(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({url:t.url});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e],testerName:t.testerName,testerMap:t.testerMap});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static processContent(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({content:t.content});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e]});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static onReady(t){HotStaq.onReadyEvent=t}static useOutput(t){return __awaiter(this,void 0,void 0,(function*(){null!=HotStaq.onOutputReceived&&HotStaq.onOutputReceived(t);let e=(new DOMParser).parseFromString(t,"text/html");document.getElementsByTagName("html")[0].innerHTML=e.getElementsByTagName("html")[0].innerHTML;let n=document.getElementsByTagName("script");if(n.length>0){let t=[];for(let e=0;e<n.length;e++)t.push(n[e]);for(let e=0;e<t.length;e++){let n=document.createElement("script");t[e].parentNode.appendChild(n),t[e].parentNode.removeChild(t[e]),yield new Promise(((r,o)=>{n.onload=()=>{r()};let s=!1;null!=t[e].getAttribute("src")&&""!==t[e].getAttribute("src")&&(n.setAttribute("src",t[e].getAttribute("src")),s=!0),null!=t[e].getAttribute("type")&&""!==t[e].getAttribute("type")&&n.setAttribute("type",t[e].getAttribute("type")),n.innerHTML=t[e].innerHTML,!1===s&&r()}))}}!0===HotStaq.dispatchReadyEvents&&(document.dispatchEvent(new Event("DOMContentLoaded")),window.dispatchEvent(new Event("load"))),null!=HotStaq.onReadyEvent&&HotStaq.onReadyEvent(t)}))}static waitForTesters(){return __awaiter(this,void 0,void 0,(function*(){for(;!1===HotStaq.isReadyForTesting;)yield HotStaq.wait(10);null!=HotStaq.onReadyForTesting&&(yield HotStaq.onReadyForTesting())}))}static setupTesters(t,e){if(t.mode===Hot_1.DeveloperMode.Development&&null==t.testerAPI){null==e.testerAPIBaseUrl&&(e.testerAPIBaseUrl=""),""===e.testerAPIBaseUrl&&(e.testerAPIBaseUrl="http://127.0.0.1:8182");let n=new HotClient_1.HotClient(t),r=new HotTesterAPI_1.HotTesterAPI(e.testerAPIBaseUrl,n);r.connection.api=r,t.testerAPI=r}}static setupClientTesters(t){let e="";return t.mode===Hot_1.DeveloperMode.Development&&(e+='<script type = "text/javascript">\nfunction hotstaq_isDocumentReady ()\n{\nif (window["Hot"] != null)\n{\nif (Hot.Mode === HotStaqWeb.DeveloperMode.Development)\n{\nlet func = function ()\n\t{\n\t\tif (Hot.TesterAPI != null)\n\t\t{\n\t\t\twindow.addEventListener ("beforeunload",\n\t\t\t\t(event) =>\n\t\t\t\t{\n\t\t\t\t\tHotStaqWeb.HotStaq.isReadyForTesting = false;\n\n\t\t\t\t\tHot.TesterAPI.tester.pageUnloaded ({\n\t\t\t\t\t\t\ttesterName: Hot.CurrentPage.testerName\n\t\t\t\t\t\t}).then (function (resp)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (resp.error != null)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (resp.error !== "")\n\t\t\t\t\t\t\t\t\t\tthrow new Error (resp.error);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\tlet testPaths = {};\n\t\t\tlet testElements = JSON.stringify (Hot.CurrentPage.testElements);\n\t\t\tlet testMaps = JSON.stringify (Hot.CurrentPage.testMaps);\n\n\t\t\tfor (let key in Hot.CurrentPage.testPaths)\n\t\t\t{\n\t\t\t\tlet testPath = Hot.CurrentPage.testPaths[key];\n\n\t\t\t\ttestPaths[key] = testPath.toString ();\n\t\t\t}\n\n\t\t\tlet testPathsStr = JSON.stringify (testPaths);\n\n\t\t\tHot.TesterAPI.tester.pageLoaded ({\n\t\t\t\t\ttesterName: Hot.CurrentPage.testerName,\n\t\t\t\t\ttestElements: testElements,\n\t\t\t\t\ttestPaths: testPathsStr\n\t\t\t\t}).then (function (resp)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (resp.error != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (resp.error !== "")\n\t\t\t\t\t\t\t\tthrow new Error (resp.error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tHotStaqWeb.HotStaq.isReadyForTesting = true;\n\t\t\t\t\t});\n\t\t}\n\t};\n\nif ((document.readyState === "complete") || (document.readyState === "interactive"))\n\tfunc ();\nelse\n\tdocument.addEventListener ("DOMContentLoaded", func);\n}\n}\n}\n\nhotstaq_isDocumentReady ();\n<\/script>'),e}static onInitalLoad(t){"complete"===document.readyState||"interactive"===document.readyState?t():window.addEventListener("load",t,{once:!0})}static displayUrl(t,e=null,n=null,r=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((o,s)=>{HotStaq.onInitalLoad((()=>__awaiter(this,void 0,void 0,(function*(){let s={url:""};s.name=null==e?"string"==typeof t?t:t.name:e,""===s.name&&(s.name="string"==typeof t?t:t.name),"string"==typeof t?s.url=t:(s.url=t.url,null==n&&null!=t.processor&&(n=t.processor),null==r&&null!=t.args&&(r=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),HotStaq.setupTesters(n,s),s.processor=n,s.args=r,s.url.indexOf("hstqserve")<0&&(s.url+="?hstqserve=nahfam");let i=yield HotStaq.processUrl(s);i+=HotStaq.setupClientTesters(n),yield HotStaq.useOutput(i),o(n)}))))}))}))}static displayContent(t,e=null,n=null,r=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise(((o,s)=>{HotStaq.onInitalLoad((()=>__awaiter(this,void 0,void 0,(function*(){let s={content:""};s.name=null==e?"string"==typeof t?"":t.name:e,""===s.name&&(s.name="string"==typeof t?"":t.name),"string"==typeof t?s.content=t:(s.content=t.content,null==n&&null!=t.processor&&(n=t.processor),null==r&&null!=t.args&&(r=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),HotStaq.setupTesters(n,s),s.processor=n,s.args=r;let i=yield HotStaq.processContent(s);yield HotStaq.useOutput(i),o(n)}))))}))}))}}exports.HotStaq=HotStaq,HotStaq.version="0.8.113",HotStaq.isWeb=!1,HotStaq.isReadyForTesting=!1,HotStaq.onReadyForTesting=null,HotStaq.onOutputReceived=null,HotStaq.onReadyEvent=null,HotStaq.dispatchReadyEvents=!0,HotStaq.errors={},"undefined"!=typeof document&&window.addEventListener("load",HotStaqWebStart_1.hotStaqWebStart)},6019:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.registerComponent=void 0;const r=n(8296),o=n(3299),s=n(9343),i=n(1814);e.registerComponent=function(t,e=void 0){if(null==t||""===t)throw new Error("All components must have a tag!");if(void 0!==customElements.get(t))return;let n=this.components;customElements.define(t,class extends HTMLElement{constructor(){super();let e=n[t];if(this.component=new e.componentType(e.processor,e.api),this.hotComponent=this.component,this.component.htmlElements=[this],this.component.inner=this.innerHTML,null!=this.component.handleAttributes)this.component.handleAttributes(this.attributes);else for(let t=0;t<this.attributes.length;t++){const e=this.attributes[t],n=e.name.toLowerCase(),r=e.value;if("id"===n&&(this.component.name=r),"name"===n&&(this.component.name=r),"value"===n&&(this.component.value=r),n.indexOf("hot-")>-1){const t=n.substring(4);this.component[t]=r}}if(null!=this.component.onPreOutput&&!1===this.component.onPreOutput())return;let a=this.component.output();null!=this.component.onPostOutput&&(a=this.component.onPostOutput(a));let l=[];"string"==typeof a?l.push({html:a}):l=a instanceof Array?a:[a];for(let t=0;t<l.length;t++){let e=l[t],n=e.html,a="",c=this.component["place-here"];null!=e.addFunctionsTo&&(a=e.addFunctionsTo),null!=c&&(e.documentSelector=`hot-place-here[name="${c}"]`);let u=r.HotFile.parseContent(n,!0,{outputCommands:!1});null!=this.component.onParsed&&(u=this.component.onParsed(u));let h={fixedStr:"",querySelector:""};h=null!=this.component.onFixHTML?this.component.onFixHTML(u):s.HotStaq.fixHTML(u);let p=[];for(let t=this.children.length-1;t>-1;t--){let e=this.children[t];p.push(this.removeChild(e))}let d=null,f=null;if(d=null!=this.component.onParseDOM?this.component.onParseDOM(h.fixedStr):(new DOMParser).parseFromString(h.fixedStr,"text/html"),d.body.children.length<1)throw new Error(`No component output from ${this.component.name} with tag ${this.component.tag}`);if(d.body.children.length>1){let t=!0;for(let e=0;e<d.body.children.length;e++){let n=d.body.children[e];if(n instanceof HTMLElement&&"parsererror"===n.tagName.toLowerCase()){f=n,t=!1;break}}if(!0===t)throw new Error(`Only a single html element can come from component ${this.component.name}, multiple elements were detected.`)}f=""===h.querySelector?d.body.children[0]:d.querySelector(h.querySelector),this.replaceWith(f),null!=this.component.click&&f.addEventListener("click",this.component.click.bind(this.component));for(let t in this.component.events){let e=this.component.events[t];f.addEventListener(e.type,e.func,e.options)}let m=Object.getOwnPropertyNames(this.component.constructor.prototype);for(let t=0;t<m.length;t++){let e=m[t];if("constructor"!==e&&"function"==typeof this.component[e]){let t=!0;for(let n in o.HotComponent.prototype)if(e===n){t=!1;break}!0===t&&(f[e]=s.HotStaq.keepContext(this.component[e],this.component),""!==a)&&(document.querySelector(a)[e]=s.HotStaq.keepContext(this.component[e],this.component))}}null!=this.component.onPrePlace&&(f=this.component.onPrePlace(f));let g=this.component.onCreated(f);if(null!=this.component.onParentPlace&&(g.onParentPlace=this.component.onParentPlace),g.hotComponent=this.component,this.component.htmlElements.push(g),null!=e.closestSelector){let t=g;for(;t;){let n=t.querySelector(e.closestSelector);if(null!=n){t=n;break}t=t.parentElement}if(null==t)throw new Error(`Unable to find closest node with selector '${e.closestSelector}'`);g.parentElement.removeChild(g),t.appendChild(g),null!=g.onParentPlace&&g.hotComponent.onParentPlace(parentNode,g)}if(null!=e.documentSelector){let t=document.querySelector(e.documentSelector);if(null==t)throw new Error(`Unable to find document node with selector '${e.documentSelector}'`);g.parentElement.removeChild(g),t.appendChild(g),null!=g.onParentPlace&&g.hotComponent.onParentPlace(t,g)}let y=(t,e,n)=>{let r=0;for(;r<10&&null!=t&&!(t instanceof HTMLHtmlElement);){let o=t.querySelectorAll(`hot-place-here[name="${e}"]`);if(o.length>0){let t=o[0];null!=n.parentNode&&n.parentNode.removeChild(n),t.appendChild(n),null!=n.onParentPlace&&n.hotComponent.onParentPlace(t,n);break}if(o.length<1){let r=t.querySelectorAll(`[hot-place-here="${e}"]`);if(r.length>0){let t=r[0];null!=n.parentNode&&n.parentNode.removeChild(n),t.appendChild(n),null!=n.onParentPlace&&n.hotComponent.onParentPlace(t,n);break}}t=t.parentNode,r++}return t};if(null!=e.placeHereParent){let t=g.parentNode;if(t=y(t,e.placeHereParent,g),null==t)throw new Error(`Unable to find parent node with hot-place-here attribute '${e.placeHereParent}'`)}for(let t=0;t<p.length;t++){const n=p[t];let r=!1;if(void 0!==n.getAttribute){let t=n.getAttribute("hot-place-parent");if(null!=t&&""!==t){let o=g;if(o=y(o,t,n),null==o)throw new Error(`Unable to find parent node with hot-place-here attribute '${e.placeHereParent}'`);r=!0}}!1===r&&g.appendChild(n),null!=n.onParentPlace&&n.hotComponent.onParentPlace(g,n)}if(null!=this.component.onPostPlace){let t=this.component.onPostPlace(g.parentElement,g);null!=t&&(g=t)}if(void 0!==i.Hot&&null!=i.Hot.CurrentPage){let t="";null!=this.component.name&&(t=this.component.name),null!=t&&""!==t||(t=this.id),""!==t&&(i.Hot.CurrentPage.components[t]=this.component)}}}looseParseFromString(t,e){e=e.replace(/ \/>/g,">").replace(/(<(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr).*?>)/g,"$1</$2>");const n=t.parseFromString("<xml>"+e+"</xml>","text/xml"),r=t.parseFromString("","text/html");for(let t of Array.from(n.documentElement.children))r.body.appendChild(t);for(let t of Array.from(r.querySelectorAll("area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr")))t.outerHTML="<"+t.outerHTML.slice(1).split("<")[0];return r}get observedAttributes(){return this.component.observedAttributes}},e)}},6061:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.hotStaqWebStart=void 0;const Hot_1=__webpack_require__(1814),HotClient_1=__webpack_require__(3025),HotFile_1=__webpack_require__(8296),HotLog_1=__webpack_require__(3622),HotStaq_1=__webpack_require__(9343);function hotStaqWebStart(){if(void 0!==window.hotstaqStartingApp&&!0===window.hotstaqStartingApp)return;let hotstaqElms=document.getElementsByTagName("hotstaq");if(HotStaq_1.HotStaq.isWeb=!0,void 0!==HotStaqWeb)for(let t in HotStaqWeb)window[t]=HotStaqWeb[t];if(hotstaqElms.length>0){let hotstaqElm=hotstaqElms[0];setTimeout((function(){return __awaiter(this,void 0,void 0,(function*(){let getAttr=(t,e)=>{for(let n=0;n<e.length;n++){let r=e[n];if(null!=t.getAttribute(r))return t.getAttribute(r);if(null!=t.getAttribute(`data-${r}`))return t.getAttribute(`data-${r}`)}},loadPage=getAttr(hotstaqElm,["load-page","loadPage","src"])||"",loggingLevel=getAttr(hotstaqElm,["logging-level","loggingLevel"])||null,startDelay=getAttr(hotstaqElm,["start-delay","startDelay"])||null,router=getAttr(hotstaqElm,["router"])||"",name=getAttr(hotstaqElm,["name"])||"default",args=getAttr(hotstaqElm,["args"])||null,apiJSUrl=getAttr(hotstaqElm,["api-js-url","apiJSUrl"])||null,apiLibrary=getAttr(hotstaqElm,["api-library","apiLibrary"])||null,apiName=getAttr(hotstaqElm,["api-name","apiName"])||null,apiUrl=getAttr(hotstaqElm,["api-url","apiUrl"])||null,testerName=getAttr(hotstaqElm,["tester-name","testerName"])||"HotTesterMochaSelenium",testerMap=getAttr(hotstaqElm,["tester-map","testerMap"])||null,testerApiBaseUrl=getAttr(hotstaqElm,["tester-api-base-url","testerApiBaseUrl"])||null,testerLaunchpadUrl=getAttr(hotstaqElm,["tester-launchpad-url","testerLaunchpadUrl"])||null,dontReuseProcessor=!1,passRawUrl=!1,htmlSource=hotstaqElm.innerHTML||"",routerManager={},routerWildcards=[],search=new URLSearchParams(window.location.search);null!=startDelay&&(yield HotStaq_1.HotStaq.wait(parseInt(startDelay))),null!=getAttr(hotstaqElm,["src"])&&(loadPage=getAttr(hotstaqElm,["src"])),null!=getAttr(hotstaqElm,["passRawUrl"])&&(passRawUrl=!0),null!=getAttr(hotstaqElm,["dont-reuse-processor","dontReuseProcessor"])&&(dontReuseProcessor=!0);let hstqbaseredirect=search.get("hstqbaseredirect");null!=hstqbaseredirect&&(hstqbaseredirect=decodeURI(hstqbaseredirect),window.history.replaceState("","",hstqbaseredirect),loadPage=hstqbaseredirect);let hotstaqErrors=document.getElementsByTagName("hotstaq-error");for(let t=0;t<hotstaqErrors.length;t++){let e=hotstaqErrors[t],n=getAttr(e,["status"]),r=getAttr(e,["unsupported-browser-redirect"]);null!=r?HotStaq_1.HotStaq.errors.unsupportedBrowser={redirectToUrl:r}:HotStaq_1.HotStaq.errors[`${n}`]={redirectToUrl:r}}try{eval("async () => {}")}catch(t){HotStaq_1.HotStaq.executeError("unsupportedBrowser")}if(""!==router){let t=document.getElementsByTagName("hotstaq-router");for(let e=0;e<t.length;e++){let n=t[e],r=getAttr(n,["name"]),o=getAttr(n,["serve-local","serveLocally"]);if(r===router){for(let t=0;t<n.childNodes.length;t++){let e=n.childNodes[t];if(e instanceof HTMLElement&&"ROUTE"===e.tagName.toUpperCase()){let t=getAttr(e,["path"]),n=getAttr(e,["redirect"]),r=getAttr(e,["base-redirect","baseRedirect"]),o=getAttr(e,["base"]),s=getAttr(e,["src"]);t.indexOf("*")>-1&&routerWildcards.push(t),routerManager[t]={redirect:n||void 0,baseRedirect:r||void 0,base:o||void 0,src:s||void 0}}}let t=window.location.pathname,e=window.location.pathname;if(null!=o){const n=o.toLowerCase();if("true"===n||"yes"===n||"1"===n){const n=t.lastIndexOf("/");n>-1&&(t=t.substring(n),e=e.substring(n))}}if(routerWildcards.length>0)for(let e=0;e<routerWildcards.length;e++){let n=routerWildcards[e],r=n.replace("*","");if(t.indexOf(r)>-1){t=n;break}}if(null!=routerManager[t]){if(null!=routerManager[t].redirect)return void(window.location.href=routerManager[t].redirect);if(null!=routerManager[t].baseRedirect){const n=window.location.search;let r="";return""!==n&&"?"!==n&&(r=`&${n.substring(1)}`),void(window.location.href=`${routerManager[t].baseRedirect}?hstqbaseredirect=${encodeURI(e+n)}${r}`)}null!=routerManager[t].src&&(loadPage=routerManager[t].src)}break}}}args=null!=args?JSON.parse(args):Hot_1.Hot.Arguments;let hasHtmlSource=!1;if(""!==htmlSource){const t=htmlSource.replace(/\s/g,"");""!==t&&(hasHtmlSource=!0)}let tempMode=0;null!=window.Hot&&(tempMode=Hot_1.Hot.Mode);let processor=null;!1===dontReuseProcessor&&void 0!==Hot_1.Hot&&null!=Hot_1.Hot.CurrentPage&&null!=Hot_1.Hot.CurrentPage.processor&&(processor=Hot_1.Hot.CurrentPage.processor),null==processor&&(processor=new HotStaq_1.HotStaq),null!=loggingLevel&&(processor.logger.logLevel=HotLog_1.HotLog.parse(loggingLevel)),processor.mode=tempMode;let options={name,processor,args};if(""!==loadPage&&(!1===passRawUrl&&loadPage.indexOf("hstqserve")<0&&(loadPage+="?hstqserve=nahfam"),options.url=loadPage),null!=testerMap&&(options.testerMap=testerMap,options.testerName=testerName),null!=testerName&&(options.testerName=testerName),null!=testerApiBaseUrl&&(options.testerAPIBaseUrl=testerApiBaseUrl),null!=testerLaunchpadUrl&&(options.testerLaunchpadUrl=testerLaunchpadUrl),null!=apiName){let t=new HotClient_1.HotClient(processor);if(null==apiUrl||""===apiUrl)throw new Error("api-url was not set!");if(null==apiJSUrl||""===apiJSUrl)throw new Error("api-js-url was not set!");const e=yield HotFile_1.HotFile.httpGet(apiJSUrl);if(""===e)throw new Error("api-js-url content was empty!");let n=null;!0===HotStaq_1.HotStaq.isWeb?null==n&&(n=window):null==n&&(n=__webpack_require__.g),eval.apply(n,[e]);let r=window;if(null!=apiLibrary&&(r=window[apiLibrary],null==r))throw new Error(`Unable to find the API library ${apiLibrary}!`);let o=new r[apiName](apiUrl,t);o.connection.api=o,processor.api=o}if(!1===hasHtmlSource){if(""===loadPage)throw new Error("The hotstaq tag must have a src, HTML contents inside it, or a router set.");HotStaq_1.HotStaq.displayUrl(options)}else HotStaq_1.HotStaq.displayContent(options)}))}),50)}}exports.hotStaqWebStart=hotStaqWebStart},4744:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDestination=void 0;class n{constructor(t="",e=!0){"string"==typeof t?(this.destination=t,this.autoStart=e):t instanceof n?(this.destination=t.destination,this.autoStart=t.autoStart):(this.destination=t.path,this.autoStart=t.autoStart)}}e.HotTestDestination=n},896:function(t,e){"use strict";var n=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDriver=void 0,e.HotTestDriver=class{constructor(t,e=null){this.processor=t,this.page=e,this.commandDelay=20,this.pageTestDelay=700,this.persistentData={}}parseTestObject(t){let e="";t.indexOf("*")>-1&&(t=t.replace(/\*/,""),e="*");let n=`[data-test-object-name${e}='${t}']`;return t.length>0&&">"===t[0]&&(n=t=t.substring(1)),n}wait(t){return n(this,void 0,void 0,(function*(){return new Promise(((e,n)=>{setTimeout((()=>{e()}),t)}))}))}print(t){return n(this,void 0,void 0,(function*(){process.stdout.write(t)}))}println(t){return n(this,void 0,void 0,(function*(){yield this.print(`${t}\n`)}))}destroy(){return n(this,void 0,void 0,(function*(){}))}assert(t,e=""){return n(this,void 0,void 0,(function*(){if(!t)throw new Error(e)}))}}},1284:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestElement=e.HotTestElementOptions=void 0,e.HotTestElementOptions=class{constructor(t={}){this.mustBeVisible=t.mustBeVisible||!0,this.ignoreMissingElementError=t.ignoreMissingElementError||!1}},e.HotTestElement=class{constructor(t,e="",n=null){"string"==typeof t?(this.name=t,this.func=e,this.value=n):(this.name=t.name,this.func=t.func||e,this.value=t.value||n)}}},6434:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestMap=void 0;const r=n(4744);e.HotTestMap=class{constructor(t=[],e={},n=[]){if(t instanceof Array){this.destinations=[];for(let e=0;e<t.length;e++){let n=t[e];this.destinations.push(new r.HotTestDestination(n))}}else{this.destinations={};for(let e in t){let n=t[e];this.destinations[e]=new r.HotTestDestination(n)}}this.destinationOrder=n,this.pages=e}}},1153:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0})},9962:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0})},8969:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTester=void 0;const o=n(9343);class s{constructor(t,e,n,r,o={}){if(null==o)throw new Error("The testMaps parameter can be an empty object, but cannot be null! It is set to null.");this.processor=t,this.name=e,this.timeout=1e4,this.baseUrl=n,this.testMaps=o,this.driver=r,this.finishedLoading=!1,this.hasBeenSetup=!1,this.hasBeenDestroyed=!1,this.currentPage=null,this.numFailures=0}setup(t,e,n){return r(this,void 0,void 0,(function*(){}))}destroy(){return r(this,void 0,void 0,(function*(){}))}waitForData(){return r(this,void 0,void 0,(function*(){for(;!1===this.finishedLoading;)yield o.HotStaq.wait(10)}))}static interpretDestination(t,e){let n={mapName:t,url:"",api:"",paths:[]},r=e.destination.split(/\-\>/g),o=r[0];if(o.length<2)return null;if("/"===o[0]&&"/"===o[1])return null;let s=(t,e)=>{let n=t.indexOf(e),r="";return n>-1&&(r=t.substr(n+e.length),r=r.trim()),r};n.url=s(o,"url:"),n.api=s(o,"api:");for(let t=1;t<r.length;t++){let e=r[t],o={cmd:"",dest:"",path:""};e=e.trim(),o.dest=s(e,"dest:"),o.cmd=s(e,"cmd:"),o.path=s(e,"path:"),""==o.dest&&""==o.cmd&&""==o.path&&(o.path=e),n.paths.push(o)}return n}executeTestAPIPath(t,e,n,o=!1,s=!1){return r(this,void 0,void 0,(function*(){let r=!0;if(null==e)throw new Error(`Trying to access null method on destination map ${t.mapName}.`);!1===o&&null!=this.onTestAPIPathStart&&(r=yield this.onTestAPIPathStart(t,e,n,s));let i=null;if(!0===r){let t=e.testCases[n];if(null==t)throw new Error(`HotTester: Test case object ${n} does not exist!`);i=yield t.func(this.driver)}return!1===o&&null!=this.onTestAPIPathEnd&&(yield this.onTestAPIPathEnd(t,e,n,i,s)),i}))}executeTestAPIPaths(t){return r(this,void 0,void 0,(function*(){let e=[];if(null==this.testMaps[t.mapName])throw new Error(`HotTester: API Map ${t.mapName} does not exist!`);if(null==this.processor.api)throw new Error("HotTester: Associated processor does not have an API!");let n=this.processor.api.routes[t.api];if(null==n)throw new Error(`HotTester: API does not have route ${t.api}!`);for(let r=0;r<t.paths.length;r+=2){let o=t.paths[r].path,s=n.getMethod(o),i=t.paths[r+1].path;if(null==s)throw new Error(`Unable to find method related to path ${o} in map ${t.mapName}`);let a=yield this.executeTestAPIPath(t,s,i);e.push(a)}return e}))}executeTestPagePath(t,e,n=!1,s=!1){return r(this,void 0,void 0,(function*(){yield this.waitForData();let r=!0;if(null==this.testMaps[t.mapName])throw new Error(`HotTester: Web Map ${t.mapName} does not exist!`);let i=this.currentPage;if(null==i)throw new Error("HotTester: A current page was not set!");this.driver.page=i;let a=e.path,l=i.testPaths[a];!1===n&&null!=this.onTestPagePathStart&&(r=yield this.onTestPagePathStart(t,e,s));let c=null;if(!0===r){if(null==l)throw new Error(`HotTester: Test path ${a} does not have a function!`);c=yield l(this.driver)}return!1===n&&null!=this.onTestPagePathEnd&&(yield this.onTestPagePathEnd(t,l,c,s)),!0===r&&(yield o.HotStaq.wait(this.driver.pageTestDelay)),c}))}executeCommand(t,e,n){return r(this,void 0,void 0,(function*(){let s=(t,n,r)=>{let o=!1;e.cmd===n&&(o=!0);const s=e.cmd.indexOf("(");return s>-1&&e.cmd.substr(0,s)===n&&(o=!0),o},i=t=>{let e=[];const n=t.match(/\(([^)]+)\)/);return n?(e=n[1].split(",").map((t=>t.trim())),e):[]},a=null,l=[];if(!0===s(e.cmd,"url")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];if(null==this.driver.waitForTestElement)throw new Error(`HotTester: Driver ${this.driver.constructor.name} does not support waitForTestElement!`);yield this.driver.navigateToUrl(e)}))),!0===s(e.cmd,"waitForTestObject")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];if(null==this.driver.waitForTestElement)throw new Error(`HotTester: Driver ${this.driver.constructor.name} does not support waitForTestElement!`);yield this.driver.waitForTestElement(e)}))),!0===s(e.cmd,"waitForTesterAPIData")&&(a=t=>r(this,void 0,void 0,(function*(){this.finishedLoading=!1,yield this.waitForData()}))),!0===s(e.cmd,"wait")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=parseInt(t[0]);yield o.HotStaq.wait(e)}))),!0===s(e.cmd,"print")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.print(e)}))),!0===s(e.cmd,"println")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.println(e)}))),!0===s(e.cmd,"click")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];if(null==this.driver.waitForTestElement)throw new Error(`HotTester: Driver ${this.driver.constructor.name} does not support waitForTestElement!`);const n=yield this.driver.waitForTestElement(e);yield n.click()}))),!0===s(e.cmd,"sendKeys")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0],n=t[1];if(null==this.driver.waitForTestElement)throw new Error(`HotTester: Driver ${this.driver.constructor.name} does not support waitForTestElement!`);const r=yield this.driver.waitForTestElement(e);yield r.sendKeys(n)}))),!0===s(e.cmd,"clear")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){let e=t[0];if(null==this.driver.waitForTestElement)throw new Error(`HotTester: Driver ${this.driver.constructor.name} does not support waitForTestElement!`);const n=yield this.driver.waitForTestElement(e);yield n.clear()}))),!0===s(e.cmd,"debugger")&&(l=i(e.cmd),a=t=>r(this,void 0,void 0,(function*(){}))),null==a)throw new Error(`HotTester: Command ${e.cmd} does not exist!`);yield this.onCommand(t,e,n,l,a)}))}executeTestPagePaths(t,e=!1){return r(this,void 0,void 0,(function*(){let n=[],r=this.testMaps[t.mapName];if(null==r)throw new Error(`HotTester: Web Map ${t.mapName} does not exist!`);for(let o=0;o<t.paths.length;o++){let i=t.paths[o],a=null;if(""!==i.dest){if(r.destinations instanceof Array)throw new Error(`HotTester: When using type 'dest' in a destination string, all destinations in map ${t.mapName} must be named.`);let e=r.destinations[i.dest],n=s.interpretDestination(t.mapName,e);null!=n&&(a=yield this.executeTestPagePaths(n))}""!==i.cmd&&(yield this.executeCommand(t,i,i.cmd)),""!==i.path&&(a=yield this.executeTestPagePath(t,i,!1,e)),n.push(a)}return n}))}execute(t){return r(this,void 0,void 0,(function*(){let e=this.testMaps[t];if(null==e)throw new Error(`HotTester: Map ${t} does not exist!`);this.processor.logger.verbose(`HotTester: Executing map ${t}...`),this.processor.getRouteKeyFromName(t);let n=(e,n="")=>r(this,void 0,void 0,(function*(){if(!1!==e.autoStart)try{this.processor.logger.verbose((()=>`HotTester: Executing ${t} destination ${JSON.stringify(e)}...`));let r=s.interpretDestination(t,e),o=!1,i=!0,a=this.baseUrl;""!==r.url&&(o=!0,a+=r.url),null!=this.setup&&!1===this.hasBeenSetup&&(yield this.setup(o,a,n),this.hasBeenSetup=!0,this.hasBeenDestroyed=!1),null!=this.onTestStart&&(i=yield this.onTestStart(r,a,n)),!0===i&&(""!==r.url&&(yield this.executeTestPagePaths(r)),""!==r.api&&(yield this.executeTestAPIPaths(r))),null!=this.onTestEnd&&(yield this.onTestEnd(r)),null!=this.destroy&&!1===this.hasBeenDestroyed&&(yield this.destroy(),this.hasBeenDestroyed=!0,this.hasBeenSetup=!1)}catch(t){throw t}}));if(e.destinations instanceof Array)for(let t=0;t<e.destinations.length;t++){let r=e.destinations[t];yield n(r)}else if(e.destinationOrder.length>0){let t=[];for(let r=0;r<e.destinationOrder.length;r++){let o=e.destinationOrder[r],s=e.destinations[o];if(null==s)throw new Error(`HotTester: Destination ${o} does not exist!`);t.push(o),yield n(s,o)}for(let r in e.destinations){let o=!0;for(let e=0;e<t.length;e++)if(t[e]===r){o=!1;break}if(!0===o){let t=e.destinations[r];yield n(t,r)}}}else for(let t in e.destinations){let r=e.destinations[t];yield n(r,t)}}))}}e.HotTester=s},6681:function(__unused_webpack_module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotTesterAPI=void 0;const HotAPI_1=__webpack_require__(6044),HotRoute_1=__webpack_require__(7605),HotRouteMethod_1=__webpack_require__(9844),HotStaq_1=__webpack_require__(9343);class HotTesterAPI extends HotAPI_1.HotAPI{constructor(t,e=null,n=null){super(t,e,n),this.executeEventsUsing=HotAPI_1.EventExecutionType.HotAPI;let r=new HotRoute_1.HotRoute(e,"tester");r.addMethod({name:"pageLoaded",onServerExecute:this.pageLoaded,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."},testerMap:{required:!0,type:"string",description:"The tester map executing the test."},pageName:{required:!0,type:"string",description:"The name of the page executing the test."},testElements:{required:!0,type:"array",description:"The test elements on the page."},testPaths:{required:!0,type:"array",description:"The test paths on the page."}},returns:"Returns true as an acknowledgement."}),r.addMethod({name:"pageUnloaded",onServerExecute:this.pageUnloaded,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."}},returns:"Returns true as an acknowledgement."}),r.addMethod({name:"executeTests",onServerExecute:this.executeTests,parameters:{testerName:{required:!0,type:"string",description:"The name of the tester executing the test."},testerMap:{required:!0,type:"object",description:"The tester map to execute."}},returns:"Returns true when tests are complete."}),r.addMethod({name:"heartbeat",type:HotRouteMethod_1.HotEventMethod.GET,onServerExecute:this.heartbeat,returns:"Returns true as an acknowledgement."}),this.addRoute(r)}pageLoaded(request){return __awaiter(this,void 0,void 0,(function*(){let testerObj={testerName:request.jsonObj.testerName,testElements:request.jsonObj.testElements,testPathsStrs:request.jsonObj.testPaths};for(let t in testerObj){let e=testerObj[t],n=!1;if(null==e&&(n=!0),""!=testerObj.testerName&&""!==testerObj.testElements&&""!==testerObj.testPathsStrs||(n=!0),!0===n)throw new Error(`TesterAPI: Object ${t} was not passed.`)}testerObj.testElements=JSON.parse(testerObj.testElements),testerObj.testPathsStrs=JSON.parse(testerObj.testPathsStrs);let testPaths={};for(let key in testerObj.testPathsStrs){let testPath=eval(testerObj.testPathsStrs[key]);testPaths[key]=testPath}let tester=this.connection.processor.testers[testerObj.testerName];if(null==tester)throw new Error(`TesterAPI: Tester ${testerObj.testerName} does not exist!`);let newPage={testElements:testerObj.testElements,testPaths};tester.finishedLoading=!0;let setAsCurrent=!0;return null!=tester.onFinishedLoading&&(setAsCurrent=yield tester.onFinishedLoading(newPage)),!0===setAsCurrent&&(tester.currentPage=newPage),!0}))}pageUnloaded(t){return __awaiter(this,void 0,void 0,(function*(){const e=HotStaq_1.HotStaq.getParam("testerName",t.jsonObj);let n=this.connection.processor.testers[e];if(null==n)throw new Error(`TesterAPI: Tester ${e} does not exist!`);return n.finishedLoading=!1,n.currentPage=null,null!=n.onFinishedUnloading&&(yield n.onFinishedUnloading()),!0}))}executeTests(t){return __awaiter(this,void 0,void 0,(function*(){let e=t.jsonObj.testerName,n=t.jsonObj.testerMap;if(null==e||null==n)throw new Error("TesterAPI: Not all required json objects were passed.");if(""===e||""===n)throw new Error("TesterAPI: Not all required json objects were passed.");let r=this.connection;return null!=r.executeTests&&(yield r.executeTests(e,n)),!0}))}heartbeat(t){return __awaiter(this,void 0,void 0,(function*(){return!0}))}}exports.HotTesterAPI=HotTesterAPI},3596:function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotWebSocketClient=void 0;const o=n(8007),s=n(611);e.HotWebSocketClient=class{constructor(t,e=null){this.url=t,this.socket=e,this.persistentData={},this.authorizedValue=null,this.onConnectError=null,this.onError=null,this.onDisconnect=null}useSocket(t){this.socket=t}connect(t=null,e=null,n=void 0){return r(this,void 0,void 0,(function*(){let r=n;return null!=t&&(null==r&&(r={}),r=Object.assign(Object.assign({},r),{auth:t})),null!=e&&(null==r&&(r={}),r=Object.assign(Object.assign({},r),{query:e})),this.socket=(0,o.io)(this.url,r),new Promise(((t,e)=>{this.socket.on("connect",(()=>{null!=this.onConnect&&this.onConnect(),t()})),this.socket.on("connect_error",(t=>{null==this.onConnectError?e(t):this.onConnectError(t)})),this.socket.on("error",(t=>{null==this.onError?e(t):this.onError(t)})),this.socket.on("disconnect",(()=>{null!=this.onDisconnect&&this.onDisconnect()}))}))}))}on(t,e,n=null){this.socket.on(t,function(t,n){null!=n.uuid?null!=t?n.uuid===t&&e(n.data,n.uuid):e(n.data,n.uuid):e(n,t)}.bind(this,n))}onRaw(t,e){this.socket.on(t,e)}off(t){this.socket.off(t,null)}once(t,e,n=null){this.socket.once(t,function(t,n){null!=n.uuid?null!=t?n.uuid===t&&e(n.data,n.uuid):e(n.data,n.uuid):e(n,t)}.bind(this,n))}onceRaw(t,e){this.socket.once(t,e)}getId(){return this.socket.id}isConnected(){return null!=this.socket&&!1!==this.socket.connected}send(t,e,n=null){if(null==this.socket)throw new Error(`Client socket is null. Unable to send event ${t}`);if(!1===this.socket.connected)throw new Error(`Client socket is not connected. Unable to send event ${t}`);return null==n&&(n=(0,s.v4)()),this.socket.emit(t,{uuid:n,data:e}),n}sendOn(t,e,n,o=null){return r(this,void 0,void 0,(function*(){return yield new Promise(((r,i)=>{null==o&&(o=(0,s.v4)()),this.on(t,function(t,e){n(e,t),r(e)}.bind(this,o),o),this.send(t,e,o)}))}))}sendOnce(t,e,n=null){return r(this,void 0,void 0,(function*(){return yield new Promise(((r,o)=>{null==n&&(n=(0,s.v4)()),this.once(t,function(t,e){r(e)}.bind(this,n),n),this.send(t,e,n)}))}))}disconnect(t=!0){null!=this.socket&&!1!==this.socket.connected&&this.socket.disconnect()}}},611:(t,e,n)=>{"use strict";var r;n.r(e),n.d(e,{NIL:()=>A,parse:()=>g,stringify:()=>u,v1:()=>m,v3:()=>T,v4:()=>E,v5:()=>O,validate:()=>a,version:()=>q});var o=new Uint8Array(16);function s(){if(!r&&!(r="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return r(o)}const i=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,a=function(t){return"string"==typeof t&&i.test(t)};for(var l=[],c=0;c<256;++c)l.push((c+256).toString(16).substr(1));const u=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(l[t[e+0]]+l[t[e+1]]+l[t[e+2]]+l[t[e+3]]+"-"+l[t[e+4]]+l[t[e+5]]+"-"+l[t[e+6]]+l[t[e+7]]+"-"+l[t[e+8]]+l[t[e+9]]+"-"+l[t[e+10]]+l[t[e+11]]+l[t[e+12]]+l[t[e+13]]+l[t[e+14]]+l[t[e+15]]).toLowerCase();if(!a(n))throw TypeError("Stringified UUID is invalid");return n};var h,p,d=0,f=0;const m=function(t,e,n){var r=e&&n||0,o=e||new Array(16),i=(t=t||{}).node||h,a=void 0!==t.clockseq?t.clockseq:p;if(null==i||null==a){var l=t.random||(t.rng||s)();null==i&&(i=h=[1|l[0],l[1],l[2],l[3],l[4],l[5]]),null==a&&(a=p=16383&(l[6]<<8|l[7]))}var c=void 0!==t.msecs?t.msecs:Date.now(),m=void 0!==t.nsecs?t.nsecs:f+1,g=c-d+(m-f)/1e4;if(g<0&&void 0===t.clockseq&&(a=a+1&16383),(g<0||c>d)&&void 0===t.nsecs&&(m=0),m>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");d=c,f=m,p=a;var y=(1e4*(268435455&(c+=122192928e5))+m)%4294967296;o[r++]=y>>>24&255,o[r++]=y>>>16&255,o[r++]=y>>>8&255,o[r++]=255&y;var b=c/4294967296*1e4&268435455;o[r++]=b>>>8&255,o[r++]=255&b,o[r++]=b>>>24&15|16,o[r++]=b>>>16&255,o[r++]=a>>>8|128,o[r++]=255&a;for(var v=0;v<6;++v)o[r+v]=i[v];return e||u(o)},g=function(t){if(!a(t))throw TypeError("Invalid UUID");var e,n=new Uint8Array(16);return n[0]=(e=parseInt(t.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(t.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(t.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(t.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(t.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n};function y(t,e,n){function r(t,r,o,s){if("string"==typeof t&&(t=function(t){t=unescape(encodeURIComponent(t));for(var e=[],n=0;n<t.length;++n)e.push(t.charCodeAt(n));return e}(t)),"string"==typeof r&&(r=g(r)),16!==r.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var i=new Uint8Array(16+t.length);if(i.set(r),i.set(t,r.length),(i=n(i))[6]=15&i[6]|e,i[8]=63&i[8]|128,o){s=s||0;for(var a=0;a<16;++a)o[s+a]=i[a];return o}return u(i)}try{r.name=t}catch(t){}return r.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",r.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",r}function b(t){return 14+(t+64>>>9<<4)+1}function v(t,e){var n=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(n>>16)<<16|65535&n}function _(t,e,n,r,o,s){return v((i=v(v(e,t),v(r,s)))<<(a=o)|i>>>32-a,n);var i,a}function w(t,e,n,r,o,s,i){return _(e&n|~e&r,t,e,o,s,i)}function S(t,e,n,r,o,s,i){return _(e&r|n&~r,t,e,o,s,i)}function P(t,e,n,r,o,s,i){return _(e^n^r,t,e,o,s,i)}function H(t,e,n,r,o,s,i){return _(n^(e|~r),t,e,o,s,i)}const T=y("v3",48,(function(t){if("string"==typeof t){var e=unescape(encodeURIComponent(t));t=new Uint8Array(e.length);for(var n=0;n<e.length;++n)t[n]=e.charCodeAt(n)}return function(t){for(var e=[],n=32*t.length,r="0123456789abcdef",o=0;o<n;o+=8){var s=t[o>>5]>>>o%32&255,i=parseInt(r.charAt(s>>>4&15)+r.charAt(15&s),16);e.push(i)}return e}(function(t,e){t[e>>5]|=128<<e%32,t[b(e)-1]=e;for(var n=1732584193,r=-271733879,o=-1732584194,s=271733878,i=0;i<t.length;i+=16){var a=n,l=r,c=o,u=s;n=w(n,r,o,s,t[i],7,-680876936),s=w(s,n,r,o,t[i+1],12,-389564586),o=w(o,s,n,r,t[i+2],17,606105819),r=w(r,o,s,n,t[i+3],22,-1044525330),n=w(n,r,o,s,t[i+4],7,-176418897),s=w(s,n,r,o,t[i+5],12,1200080426),o=w(o,s,n,r,t[i+6],17,-1473231341),r=w(r,o,s,n,t[i+7],22,-45705983),n=w(n,r,o,s,t[i+8],7,1770035416),s=w(s,n,r,o,t[i+9],12,-1958414417),o=w(o,s,n,r,t[i+10],17,-42063),r=w(r,o,s,n,t[i+11],22,-1990404162),n=w(n,r,o,s,t[i+12],7,1804603682),s=w(s,n,r,o,t[i+13],12,-40341101),o=w(o,s,n,r,t[i+14],17,-1502002290),n=S(n,r=w(r,o,s,n,t[i+15],22,1236535329),o,s,t[i+1],5,-165796510),s=S(s,n,r,o,t[i+6],9,-1069501632),o=S(o,s,n,r,t[i+11],14,643717713),r=S(r,o,s,n,t[i],20,-373897302),n=S(n,r,o,s,t[i+5],5,-701558691),s=S(s,n,r,o,t[i+10],9,38016083),o=S(o,s,n,r,t[i+15],14,-660478335),r=S(r,o,s,n,t[i+4],20,-405537848),n=S(n,r,o,s,t[i+9],5,568446438),s=S(s,n,r,o,t[i+14],9,-1019803690),o=S(o,s,n,r,t[i+3],14,-187363961),r=S(r,o,s,n,t[i+8],20,1163531501),n=S(n,r,o,s,t[i+13],5,-1444681467),s=S(s,n,r,o,t[i+2],9,-51403784),o=S(o,s,n,r,t[i+7],14,1735328473),n=P(n,r=S(r,o,s,n,t[i+12],20,-1926607734),o,s,t[i+5],4,-378558),s=P(s,n,r,o,t[i+8],11,-2022574463),o=P(o,s,n,r,t[i+11],16,1839030562),r=P(r,o,s,n,t[i+14],23,-35309556),n=P(n,r,o,s,t[i+1],4,-1530992060),s=P(s,n,r,o,t[i+4],11,1272893353),o=P(o,s,n,r,t[i+7],16,-155497632),r=P(r,o,s,n,t[i+10],23,-1094730640),n=P(n,r,o,s,t[i+13],4,681279174),s=P(s,n,r,o,t[i],11,-358537222),o=P(o,s,n,r,t[i+3],16,-722521979),r=P(r,o,s,n,t[i+6],23,76029189),n=P(n,r,o,s,t[i+9],4,-640364487),s=P(s,n,r,o,t[i+12],11,-421815835),o=P(o,s,n,r,t[i+15],16,530742520),n=H(n,r=P(r,o,s,n,t[i+2],23,-995338651),o,s,t[i],6,-198630844),s=H(s,n,r,o,t[i+7],10,1126891415),o=H(o,s,n,r,t[i+14],15,-1416354905),r=H(r,o,s,n,t[i+5],21,-57434055),n=H(n,r,o,s,t[i+12],6,1700485571),s=H(s,n,r,o,t[i+3],10,-1894986606),o=H(o,s,n,r,t[i+10],15,-1051523),r=H(r,o,s,n,t[i+1],21,-2054922799),n=H(n,r,o,s,t[i+8],6,1873313359),s=H(s,n,r,o,t[i+15],10,-30611744),o=H(o,s,n,r,t[i+6],15,-1560198380),r=H(r,o,s,n,t[i+13],21,1309151649),n=H(n,r,o,s,t[i+4],6,-145523070),s=H(s,n,r,o,t[i+11],10,-1120210379),o=H(o,s,n,r,t[i+2],15,718787259),r=H(r,o,s,n,t[i+9],21,-343485551),n=v(n,a),r=v(r,l),o=v(o,c),s=v(s,u)}return[n,r,o,s]}(function(t){if(0===t.length)return[];for(var e=8*t.length,n=new Uint32Array(b(e)),r=0;r<e;r+=8)n[r>>5]|=(255&t[r/8])<<r%32;return n}(t),8*t.length))})),E=function(t,e,n){var r=(t=t||{}).random||(t.rng||s)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,e){n=n||0;for(var o=0;o<16;++o)e[n+o]=r[o];return e}return u(r)};function C(t,e,n,r){switch(t){case 0:return e&n^~e&r;case 1:case 3:return e^n^r;case 2:return e&n^e&r^n&r}}function k(t,e){return t<<e|t>>>32-e}const O=y("v5",80,(function(t){var e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof t){var r=unescape(encodeURIComponent(t));t=[];for(var o=0;o<r.length;++o)t.push(r.charCodeAt(o))}else Array.isArray(t)||(t=Array.prototype.slice.call(t));t.push(128);for(var s=t.length/4+2,i=Math.ceil(s/16),a=new Array(i),l=0;l<i;++l){for(var c=new Uint32Array(16),u=0;u<16;++u)c[u]=t[64*l+4*u]<<24|t[64*l+4*u+1]<<16|t[64*l+4*u+2]<<8|t[64*l+4*u+3];a[l]=c}a[i-1][14]=8*(t.length-1)/Math.pow(2,32),a[i-1][14]=Math.floor(a[i-1][14]),a[i-1][15]=8*(t.length-1)&4294967295;for(var h=0;h<i;++h){for(var p=new Uint32Array(80),d=0;d<16;++d)p[d]=a[h][d];for(var f=16;f<80;++f)p[f]=k(p[f-3]^p[f-8]^p[f-14]^p[f-16],1);for(var m=n[0],g=n[1],y=n[2],b=n[3],v=n[4],_=0;_<80;++_){var w=Math.floor(_/20),S=k(m,5)+C(w,g,y,b)+v+e[w]+p[_]>>>0;v=b,b=y,y=k(g,30)>>>0,g=m,m=S}n[0]=n[0]+m>>>0,n[1]=n[1]+g>>>0,n[2]=n[2]+y>>>0,n[3]=n[3]+b>>>0,n[4]=n[4]+v>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]})),A="00000000-0000-0000-0000-000000000000",q=function(t){if(!a(t))throw TypeError("Invalid UUID");return parseInt(t.substr(14,1),16)}},8241:t=>{"use strict";t.exports=FormData},2365:t=>{"use strict";t.exports=fetch},7963:t=>{"use strict";t.exports={}},1603:()=>{},9247:()=>{},4110:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.hasCORS=void 0;let n=!1;try{n="undefined"!=typeof XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}catch(t){}e.hasCORS=n},8661:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.decode=e.encode=void 0,e.encode=function(t){let e="";for(let n in t)t.hasOwnProperty(n)&&(e.length&&(e+="&"),e+=encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return e},e.decode=function(t){let e={},n=t.split("&");for(let t=0,r=n.length;t<r;t++){let r=n[t].split("=");e[decodeURIComponent(r[0])]=decodeURIComponent(r[1])}return e}},1015:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.parse=void 0;const n=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,r=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];e.parse=function(t){if(t.length>2e3)throw"URI too long";const e=t,o=t.indexOf("["),s=t.indexOf("]");-1!=o&&-1!=s&&(t=t.substring(0,o)+t.substring(o,s).replace(/:/g,";")+t.substring(s,t.length));let i=n.exec(t||""),a={},l=14;for(;l--;)a[r[l]]=i[l]||"";return-1!=o&&-1!=s&&(a.source=e,a.host=a.host.substring(1,a.host.length-1).replace(/;/g,":"),a.authority=a.authority.replace("[","").replace("]","").replace(/;/g,":"),a.ipv6uri=!0),a.pathNames=function(t,e){const n=e.replace(/\/{2,9}/g,"/").split("/");return"/"!=e.slice(0,1)&&0!==e.length||n.splice(0,1),"/"==e.slice(-1)&&n.splice(n.length-1,1),n}(0,a.path),a.queryKey=function(t,e){const n={};return e.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,(function(t,e,r){e&&(n[e]=r)})),n}(0,a.query),a}},732:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.yeast=e.decode=e.encode=void 0;const n="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".split(""),r={};let o,s=0,i=0;function a(t){let e="";do{e=n[t%64]+e,t=Math.floor(t/64)}while(t>0);return e}for(e.encode=a,e.decode=function(t){let e=0;for(i=0;i<t.length;i++)e=64*e+r[t.charAt(i)];return e},e.yeast=function(){const t=a(+new Date);return t!==o?(s=0,o=t):t+"."+a(s++)};i<64;i++)r[n[i]]=i},6235:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.globalThisShim=void 0,e.globalThisShim="undefined"!=typeof self?self:"undefined"!=typeof window?window:Function("return this")()},4956:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.nextTick=e.parse=e.installTimerFunctions=e.transports=e.TransportError=e.Transport=e.protocol=e.Socket=void 0;const r=n(8223);Object.defineProperty(e,"Socket",{enumerable:!0,get:function(){return r.Socket}}),e.protocol=r.Socket.protocol;var o=n(4689);Object.defineProperty(e,"Transport",{enumerable:!0,get:function(){return o.Transport}}),Object.defineProperty(e,"TransportError",{enumerable:!0,get:function(){return o.TransportError}});var s=n(9419);Object.defineProperty(e,"transports",{enumerable:!0,get:function(){return s.transports}});var i=n(5374);Object.defineProperty(e,"installTimerFunctions",{enumerable:!0,get:function(){return i.installTimerFunctions}});var a=n(1015);Object.defineProperty(e,"parse",{enumerable:!0,get:function(){return a.parse}});var l=n(4087);Object.defineProperty(e,"nextTick",{enumerable:!0,get:function(){return l.nextTick}})},8223:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Socket=void 0;const o=n(9419),s=n(5374),i=n(8661),a=n(1015),l=r(n(7833)),c=n(7285),u=n(6376),h=n(4087),p=(0,l.default)("engine.io-client:socket");class d extends c.Emitter{constructor(t,e={}){super(),this.binaryType=h.defaultBinaryType,this.writeBuffer=[],t&&"object"==typeof t&&(e=t,t=null),t?(t=(0,a.parse)(t),e.hostname=t.host,e.secure="https"===t.protocol||"wss"===t.protocol,e.port=t.port,t.query&&(e.query=t.query)):e.host&&(e.hostname=(0,a.parse)(e.host).host),(0,s.installTimerFunctions)(this,e),this.secure=null!=e.secure?e.secure:"undefined"!=typeof location&&"https:"===location.protocol,e.hostname&&!e.port&&(e.port=this.secure?"443":"80"),this.hostname=e.hostname||("undefined"!=typeof location?location.hostname:"localhost"),this.port=e.port||("undefined"!=typeof location&&location.port?location.port:this.secure?"443":"80"),this.transports=e.transports||["polling","websocket","webtransport"],this.writeBuffer=[],this.prevBufferLen=0,this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},e),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),"string"==typeof this.opts.query&&(this.opts.query=(0,i.decode)(this.opts.query)),this.id=null,this.upgrades=null,this.pingInterval=null,this.pingTimeout=null,this.pingTimeoutTimer=null,"function"==typeof addEventListener&&(this.opts.closeOnBeforeunload&&(this.beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this.beforeunloadEventListener,!1)),"localhost"!==this.hostname&&(this.offlineEventListener=()=>{this.onClose("transport close",{description:"network connection lost"})},addEventListener("offline",this.offlineEventListener,!1))),this.open()}createTransport(t){p('creating transport "%s"',t);const e=Object.assign({},this.opts.query);e.EIO=u.protocol,e.transport=t,this.id&&(e.sid=this.id);const n=Object.assign({},this.opts,{query:e,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[t]);return p("options: %j",n),new o.transports[t](n)}open(){let t;if(this.opts.rememberUpgrade&&d.priorWebsocketSuccess&&-1!==this.transports.indexOf("websocket"))t="websocket";else{if(0===this.transports.length)return void this.setTimeoutFn((()=>{this.emitReserved("error","No transports available")}),0);t=this.transports[0]}this.readyState="opening";try{t=this.createTransport(t)}catch(t){return p("error while creating transport: %s",t),this.transports.shift(),void this.open()}t.open(),this.setTransport(t)}setTransport(t){p("setting transport %s",t.name),this.transport&&(p("clearing existing transport %s",this.transport.name),this.transport.removeAllListeners()),this.transport=t,t.on("drain",this.onDrain.bind(this)).on("packet",this.onPacket.bind(this)).on("error",this.onError.bind(this)).on("close",(t=>this.onClose("transport close",t)))}probe(t){p('probing transport "%s"',t);let e=this.createTransport(t),n=!1;d.priorWebsocketSuccess=!1;const r=()=>{n||(p('probe transport "%s" opened',t),e.send([{type:"ping",data:"probe"}]),e.once("packet",(r=>{if(!n)if("pong"===r.type&&"probe"===r.data){if(p('probe transport "%s" pong',t),this.upgrading=!0,this.emitReserved("upgrading",e),!e)return;d.priorWebsocketSuccess="websocket"===e.name,p('pausing current transport "%s"',this.transport.name),this.transport.pause((()=>{n||"closed"!==this.readyState&&(p("changing transport and sending upgrade packet"),c(),this.setTransport(e),e.send([{type:"upgrade"}]),this.emitReserved("upgrade",e),e=null,this.upgrading=!1,this.flush())}))}else{p('probe transport "%s" failed',t);const n=new Error("probe error");n.transport=e.name,this.emitReserved("upgradeError",n)}})))};function o(){n||(n=!0,c(),e.close(),e=null)}const s=n=>{const r=new Error("probe error: "+n);r.transport=e.name,o(),p('probe transport "%s" failed because of error: %s',t,n),this.emitReserved("upgradeError",r)};function i(){s("transport closed")}function a(){s("socket closed")}function l(t){e&&t.name!==e.name&&(p('"%s" works - aborting "%s"',t.name,e.name),o())}const c=()=>{e.removeListener("open",r),e.removeListener("error",s),e.removeListener("close",i),this.off("close",a),this.off("upgrading",l)};e.once("open",r),e.once("error",s),e.once("close",i),this.once("close",a),this.once("upgrading",l),-1!==this.upgrades.indexOf("webtransport")&&"webtransport"!==t?this.setTimeoutFn((()=>{n||e.open()}),200):e.open()}onOpen(){if(p("socket open"),this.readyState="open",d.priorWebsocketSuccess="websocket"===this.transport.name,this.emitReserved("open"),this.flush(),"open"===this.readyState&&this.opts.upgrade){p("starting upgrade probes");let t=0;const e=this.upgrades.length;for(;t<e;t++)this.probe(this.upgrades[t])}}onPacket(t){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState)switch(p('socket receive: type "%s", data "%s"',t.type,t.data),this.emitReserved("packet",t),this.emitReserved("heartbeat"),this.resetPingTimeout(),t.type){case"open":this.onHandshake(JSON.parse(t.data));break;case"ping":this.sendPacket("pong"),this.emitReserved("ping"),this.emitReserved("pong");break;case"error":const e=new Error("server error");e.code=t.data,this.onError(e);break;case"message":this.emitReserved("data",t.data),this.emitReserved("message",t.data)}else p('packet received with socket readyState "%s"',this.readyState)}onHandshake(t){this.emitReserved("handshake",t),this.id=t.sid,this.transport.query.sid=t.sid,this.upgrades=this.filterUpgrades(t.upgrades),this.pingInterval=t.pingInterval,this.pingTimeout=t.pingTimeout,this.maxPayload=t.maxPayload,this.onOpen(),"closed"!==this.readyState&&this.resetPingTimeout()}resetPingTimeout(){this.clearTimeoutFn(this.pingTimeoutTimer),this.pingTimeoutTimer=this.setTimeoutFn((()=>{this.onClose("ping timeout")}),this.pingInterval+this.pingTimeout),this.opts.autoUnref&&this.pingTimeoutTimer.unref()}onDrain(){this.writeBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,0===this.writeBuffer.length?this.emitReserved("drain"):this.flush()}flush(){if("closed"!==this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){const t=this.getWritablePackets();p("flushing %d packets in socket",t.length),this.transport.send(t),this.prevBufferLen=t.length,this.emitReserved("flush")}}getWritablePackets(){if(!(this.maxPayload&&"polling"===this.transport.name&&this.writeBuffer.length>1))return this.writeBuffer;let t=1;for(let e=0;e<this.writeBuffer.length;e++){const n=this.writeBuffer[e].data;if(n&&(t+=(0,s.byteLength)(n)),e>0&&t>this.maxPayload)return p("only send %d out of %d packets",e,this.writeBuffer.length),this.writeBuffer.slice(0,e);t+=2}return p("payload size is %d (max: %d)",t,this.maxPayload),this.writeBuffer}write(t,e,n){return this.sendPacket("message",t,e,n),this}send(t,e,n){return this.sendPacket("message",t,e,n),this}sendPacket(t,e,n,r){if("function"==typeof e&&(r=e,e=void 0),"function"==typeof n&&(r=n,n=null),"closing"===this.readyState||"closed"===this.readyState)return;(n=n||{}).compress=!1!==n.compress;const o={type:t,data:e,options:n};this.emitReserved("packetCreate",o),this.writeBuffer.push(o),r&&this.once("flush",r),this.flush()}close(){const t=()=>{this.onClose("forced close"),p("socket closing - telling transport to close"),this.transport.close()},e=()=>{this.off("upgrade",e),this.off("upgradeError",e),t()},n=()=>{this.once("upgrade",e),this.once("upgradeError",e)};return"opening"!==this.readyState&&"open"!==this.readyState||(this.readyState="closing",this.writeBuffer.length?this.once("drain",(()=>{this.upgrading?n():t()})):this.upgrading?n():t()),this}onError(t){p("socket error %j",t),d.priorWebsocketSuccess=!1,this.emitReserved("error",t),this.onClose("transport error",t)}onClose(t,e){"opening"!==this.readyState&&"open"!==this.readyState&&"closing"!==this.readyState||(p('socket close with reason: "%s"',t),this.clearTimeoutFn(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),"function"==typeof removeEventListener&&(removeEventListener("beforeunload",this.beforeunloadEventListener,!1),removeEventListener("offline",this.offlineEventListener,!1)),this.readyState="closed",this.id=null,this.emitReserved("close",t,e),this.writeBuffer=[],this.prevBufferLen=0)}filterUpgrades(t){const e=[];let n=0;const r=t.length;for(;n<r;n++)~this.transports.indexOf(t[n])&&e.push(t[n]);return e}}e.Socket=d,d.protocol=u.protocol},4689:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Transport=e.TransportError=void 0;const o=n(6376),s=n(7285),i=n(5374),a=r(n(7833)),l=n(8661),c=(0,a.default)("engine.io-client:transport");class u extends Error{constructor(t,e,n){super(t),this.description=e,this.context=n,this.type="TransportError"}}e.TransportError=u;class h extends s.Emitter{constructor(t){super(),this.writable=!1,(0,i.installTimerFunctions)(this,t),this.opts=t,this.query=t.query,this.socket=t.socket}onError(t,e,n){return super.emitReserved("error",new u(t,e,n)),this}open(){return this.readyState="opening",this.doOpen(),this}close(){return"opening"!==this.readyState&&"open"!==this.readyState||(this.doClose(),this.onClose()),this}send(t){"open"===this.readyState?this.write(t):c("transport is not open, discarding packets")}onOpen(){this.readyState="open",this.writable=!0,super.emitReserved("open")}onData(t){const e=(0,o.decodePacket)(t,this.socket.binaryType);this.onPacket(e)}onPacket(t){super.emitReserved("packet",t)}onClose(t){this.readyState="closed",super.emitReserved("close",t)}pause(t){}createUri(t,e={}){return t+"://"+this._hostname()+this._port()+this.opts.path+this._query(e)}_hostname(){const t=this.opts.hostname;return-1===t.indexOf(":")?t:"["+t+"]"}_port(){return this.opts.port&&(this.opts.secure&&Number(443!==this.opts.port)||!this.opts.secure&&80!==Number(this.opts.port))?":"+this.opts.port:""}_query(t){const e=(0,l.encode)(t);return e.length?"?"+e:""}}e.Transport=h},9419:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.transports=void 0;const r=n(528),o=n(8716),s=n(4480);e.transports={websocket:o.WS,webtransport:s.WT,polling:r.Polling}},528:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Request=e.Polling=void 0;const o=n(4689),s=r(n(7833)),i=n(732),a=n(6376),l=n(3519),c=n(7285),u=n(5374),h=n(6235),p=(0,s.default)("engine.io-client:polling");function d(){}const f=null!=new l.XHR({xdomain:!1}).responseType;class m extends o.Transport{constructor(t){if(super(t),this.polling=!1,"undefined"!=typeof location){const e="https:"===location.protocol;let n=location.port;n||(n=e?"443":"80"),this.xd="undefined"!=typeof location&&t.hostname!==location.hostname||n!==t.port}const e=t&&t.forceBase64;this.supportsBinary=f&&!e,this.opts.withCredentials&&(this.cookieJar=(0,l.createCookieJar)())}get name(){return"polling"}doOpen(){this.poll()}pause(t){this.readyState="pausing";const e=()=>{p("paused"),this.readyState="paused",t()};if(this.polling||!this.writable){let t=0;this.polling&&(p("we are currently polling - waiting to pause"),t++,this.once("pollComplete",(function(){p("pre-pause polling complete"),--t||e()}))),this.writable||(p("we are currently writing - waiting to pause"),t++,this.once("drain",(function(){p("pre-pause writing complete"),--t||e()})))}else e()}poll(){p("polling"),this.polling=!0,this.doPoll(),this.emitReserved("poll")}onData(t){p("polling got data %s",t),(0,a.decodePayload)(t,this.socket.binaryType).forEach((t=>{if("opening"===this.readyState&&"open"===t.type&&this.onOpen(),"close"===t.type)return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(t)})),"closed"!==this.readyState&&(this.polling=!1,this.emitReserved("pollComplete"),"open"===this.readyState?this.poll():p('ignoring poll - transport state "%s"',this.readyState))}doClose(){const t=()=>{p("writing close packet"),this.write([{type:"close"}])};"open"===this.readyState?(p("transport open - closing"),t()):(p("transport not open - deferring close"),this.once("open",t))}write(t){this.writable=!1,(0,a.encodePayload)(t,(t=>{this.doWrite(t,(()=>{this.writable=!0,this.emitReserved("drain")}))}))}uri(){const t=this.opts.secure?"https":"http",e=this.query||{};return!1!==this.opts.timestampRequests&&(e[this.opts.timestampParam]=(0,i.yeast)()),this.supportsBinary||e.sid||(e.b64=1),this.createUri(t,e)}request(t={}){return Object.assign(t,{xd:this.xd,cookieJar:this.cookieJar},this.opts),new g(this.uri(),t)}doWrite(t,e){const n=this.request({method:"POST",data:t});n.on("success",e),n.on("error",((t,e)=>{this.onError("xhr post error",t,e)}))}doPoll(){p("xhr poll");const t=this.request();t.on("data",this.onData.bind(this)),t.on("error",((t,e)=>{this.onError("xhr poll error",t,e)})),this.pollXhr=t}}e.Polling=m;class g extends c.Emitter{constructor(t,e){super(),(0,u.installTimerFunctions)(this,e),this.opts=e,this.method=e.method||"GET",this.uri=t,this.data=void 0!==e.data?e.data:null,this.create()}create(){var t;const e=(0,u.pick)(this.opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");e.xdomain=!!this.opts.xd;const n=this.xhr=new l.XHR(e);try{p("xhr open %s: %s",this.method,this.uri),n.open(this.method,this.uri,!0);try{if(this.opts.extraHeaders){n.setDisableHeaderCheck&&n.setDisableHeaderCheck(!0);for(let t in this.opts.extraHeaders)this.opts.extraHeaders.hasOwnProperty(t)&&n.setRequestHeader(t,this.opts.extraHeaders[t])}}catch(t){}if("POST"===this.method)try{n.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(t){}try{n.setRequestHeader("Accept","*/*")}catch(t){}null===(t=this.opts.cookieJar)||void 0===t||t.addCookies(n),"withCredentials"in n&&(n.withCredentials=this.opts.withCredentials),this.opts.requestTimeout&&(n.timeout=this.opts.requestTimeout),n.onreadystatechange=()=>{var t;3===n.readyState&&(null===(t=this.opts.cookieJar)||void 0===t||t.parseCookies(n)),4===n.readyState&&(200===n.status||1223===n.status?this.onLoad():this.setTimeoutFn((()=>{this.onError("number"==typeof n.status?n.status:0)}),0))},p("xhr data %s",this.data),n.send(this.data)}catch(t){return void this.setTimeoutFn((()=>{this.onError(t)}),0)}"undefined"!=typeof document&&(this.index=g.requestsCount++,g.requests[this.index]=this)}onError(t){this.emitReserved("error",t,this.xhr),this.cleanup(!0)}cleanup(t){if(void 0!==this.xhr&&null!==this.xhr){if(this.xhr.onreadystatechange=d,t)try{this.xhr.abort()}catch(t){}"undefined"!=typeof document&&delete g.requests[this.index],this.xhr=null}}onLoad(){const t=this.xhr.responseText;null!==t&&(this.emitReserved("data",t),this.emitReserved("success"),this.cleanup())}abort(){this.cleanup()}}if(e.Request=g,g.requestsCount=0,g.requests={},"undefined"!=typeof document)if("function"==typeof attachEvent)attachEvent("onunload",y);else if("function"==typeof addEventListener){const t="onpagehide"in h.globalThisShim?"pagehide":"unload";addEventListener(t,y,!1)}function y(){for(let t in g.requests)g.requests.hasOwnProperty(t)&&g.requests[t].abort()}},4087:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.defaultBinaryType=e.usingBrowserWebSocket=e.WebSocket=e.nextTick=void 0;const r=n(6235);e.nextTick="function"==typeof Promise&&"function"==typeof Promise.resolve?t=>Promise.resolve().then(t):(t,e)=>e(t,0),e.WebSocket=r.globalThisShim.WebSocket||r.globalThisShim.MozWebSocket,e.usingBrowserWebSocket=!0,e.defaultBinaryType="arraybuffer"},8716:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.WS=void 0;const o=n(4689),s=n(732),i=n(5374),a=n(4087),l=r(n(7833)),c=n(6376),u=(0,l.default)("engine.io-client:websocket"),h="undefined"!=typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase();class p extends o.Transport{constructor(t){super(t),this.supportsBinary=!t.forceBase64}get name(){return"websocket"}doOpen(){if(!this.check())return;const t=this.uri(),e=this.opts.protocols,n=h?{}:(0,i.pick)(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(n.headers=this.opts.extraHeaders);try{this.ws=a.usingBrowserWebSocket&&!h?e?new a.WebSocket(t,e):new a.WebSocket(t):new a.WebSocket(t,e,n)}catch(t){return this.emitReserved("error",t)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=t=>this.onClose({description:"websocket connection closed",context:t}),this.ws.onmessage=t=>this.onData(t.data),this.ws.onerror=t=>this.onError("websocket error",t)}write(t){this.writable=!1;for(let e=0;e<t.length;e++){const n=t[e],r=e===t.length-1;(0,c.encodePacket)(n,this.supportsBinary,(t=>{const e={};!a.usingBrowserWebSocket&&(n.options&&(e.compress=n.options.compress),this.opts.perMessageDeflate)&&("string"==typeof t?Buffer.byteLength(t):t.length)<this.opts.perMessageDeflate.threshold&&(e.compress=!1);try{a.usingBrowserWebSocket?this.ws.send(t):this.ws.send(t,e)}catch(t){u("websocket closed before onclose event")}r&&(0,a.nextTick)((()=>{this.writable=!0,this.emitReserved("drain")}),this.setTimeoutFn)}))}}doClose(){void 0!==this.ws&&(this.ws.close(),this.ws=null)}uri(){const t=this.opts.secure?"wss":"ws",e=this.query||{};return this.opts.timestampRequests&&(e[this.opts.timestampParam]=(0,s.yeast)()),this.supportsBinary||(e.b64=1),this.createUri(t,e)}check(){return!!a.WebSocket}}e.WS=p},4480:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.WT=void 0;const o=n(4689),s=n(4087),i=n(6376),a=(0,r(n(7833)).default)("engine.io-client:webtransport");class l extends o.Transport{get name(){return"webtransport"}doOpen(){"function"==typeof WebTransport&&(this.transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name]),this.transport.closed.then((()=>{a("transport closed gracefully"),this.onClose()})).catch((t=>{a("transport closed due to %s",t),this.onError("webtransport error",t)})),this.transport.ready.then((()=>{this.transport.createBidirectionalStream().then((t=>{const e=(0,i.createPacketDecoderStream)(Number.MAX_SAFE_INTEGER,this.socket.binaryType),n=t.readable.pipeThrough(e).getReader(),r=(0,i.createPacketEncoderStream)();r.readable.pipeTo(t.writable),this.writer=r.writable.getWriter();const o=()=>{n.read().then((({done:t,value:e})=>{t?a("session is closed"):(a("received chunk: %o",e),this.onPacket(e),o())})).catch((t=>{a("an error occurred while reading: %s",t)}))};o();const s={type:"open"};this.query.sid&&(s.data=`{"sid":"${this.query.sid}"}`),this.writer.write(s).then((()=>this.onOpen()))}))})))}write(t){this.writable=!1;for(let e=0;e<t.length;e++){const n=t[e],r=e===t.length-1;this.writer.write(n).then((()=>{r&&(0,s.nextTick)((()=>{this.writable=!0,this.emitReserved("drain")}),this.setTimeoutFn)}))}}doClose(){var t;null===(t=this.transport)||void 0===t||t.close()}}e.WT=l},3519:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createCookieJar=e.XHR=void 0;const r=n(4110),o=n(6235);e.XHR=function(t){const e=t.xdomain;try{if("undefined"!=typeof XMLHttpRequest&&(!e||r.hasCORS))return new XMLHttpRequest}catch(t){}if(!e)try{return new(o.globalThisShim[["Active"].concat("Object").join("X")])("Microsoft.XMLHTTP")}catch(t){}},e.createCookieJar=function(){}},5374:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.byteLength=e.installTimerFunctions=e.pick=void 0;const r=n(6235);e.pick=function(t,...e){return e.reduce(((e,n)=>(t.hasOwnProperty(n)&&(e[n]=t[n]),e)),{})};const o=r.globalThisShim.setTimeout,s=r.globalThisShim.clearTimeout;e.installTimerFunctions=function(t,e){e.useNativeTimers?(t.setTimeoutFn=o.bind(r.globalThisShim),t.clearTimeoutFn=s.bind(r.globalThisShim)):(t.setTimeoutFn=r.globalThisShim.setTimeout.bind(r.globalThisShim),t.clearTimeoutFn=r.globalThisShim.clearTimeout.bind(r.globalThisShim))},e.byteLength=function(t){return"string"==typeof t?function(t){let e=0,n=0;for(let r=0,o=t.length;r<o;r++)e=t.charCodeAt(r),e<128?n+=1:e<2048?n+=2:e<55296||e>=57344?n+=3:(r++,n+=4);return n}(t):Math.ceil(1.33*(t.byteLength||t.size))}},2046:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ERROR_PACKET=e.PACKET_TYPES_REVERSE=e.PACKET_TYPES=void 0;const n=Object.create(null);e.PACKET_TYPES=n,n.open="0",n.close="1",n.ping="2",n.pong="3",n.message="4",n.upgrade="5",n.noop="6";const r=Object.create(null);e.PACKET_TYPES_REVERSE=r,Object.keys(n).forEach((t=>{r[n[t]]=t})),e.ERROR_PACKET={type:"error",data:"parser error"}},2745:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.decode=e.encode=void 0;const n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r="undefined"==typeof Uint8Array?[]:new Uint8Array(256);for(let t=0;t<64;t++)r[n.charCodeAt(t)]=t;e.encode=t=>{let e,r=new Uint8Array(t),o=r.length,s="";for(e=0;e<o;e+=3)s+=n[r[e]>>2],s+=n[(3&r[e])<<4|r[e+1]>>4],s+=n[(15&r[e+1])<<2|r[e+2]>>6],s+=n[63&r[e+2]];return o%3==2?s=s.substring(0,s.length-1)+"=":o%3==1&&(s=s.substring(0,s.length-2)+"=="),s},e.decode=t=>{let e,n,o,s,i,a=.75*t.length,l=t.length,c=0;"="===t[t.length-1]&&(a--,"="===t[t.length-2]&&a--);const u=new ArrayBuffer(a),h=new Uint8Array(u);for(e=0;e<l;e+=4)n=r[t.charCodeAt(e)],o=r[t.charCodeAt(e+1)],s=r[t.charCodeAt(e+2)],i=r[t.charCodeAt(e+3)],h[c++]=n<<2|o>>4,h[c++]=(15&o)<<4|s>>2,h[c++]=(3&s)<<6|63&i;return u}},2662:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.decodePacket=void 0;const r=n(2046),o=n(2745),s="function"==typeof ArrayBuffer;e.decodePacket=(t,e)=>{if("string"!=typeof t)return{type:"message",data:a(t,e)};const n=t.charAt(0);return"b"===n?{type:"message",data:i(t.substring(1),e)}:r.PACKET_TYPES_REVERSE[n]?t.length>1?{type:r.PACKET_TYPES_REVERSE[n],data:t.substring(1)}:{type:r.PACKET_TYPES_REVERSE[n]}:r.ERROR_PACKET};const i=(t,e)=>{if(s){const n=(0,o.decode)(t);return a(n,e)}return{base64:!0,data:t}},a=(t,e)=>"blob"===e?t instanceof Blob?t:new Blob([t]):t instanceof ArrayBuffer?t:t.buffer},2686:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.encodePacket=e.encodePacketToBinary=void 0;const r=n(2046),o="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===Object.prototype.toString.call(Blob),s="function"==typeof ArrayBuffer,i=t=>"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer instanceof ArrayBuffer,a=({type:t,data:e},n,a)=>o&&e instanceof Blob?n?a(e):l(e,a):s&&(e instanceof ArrayBuffer||i(e))?n?a(e):l(new Blob([e]),a):a(r.PACKET_TYPES[t]+(e||""));e.encodePacket=a;const l=(t,e)=>{const n=new FileReader;return n.onload=function(){const t=n.result.split(",")[1];e("b"+(t||""))},n.readAsDataURL(t)};function c(t){return t instanceof Uint8Array?t:t instanceof ArrayBuffer?new Uint8Array(t):new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}let u;e.encodePacketToBinary=function(t,e){return o&&t.data instanceof Blob?t.data.arrayBuffer().then(c).then(e):s&&(t.data instanceof ArrayBuffer||i(t.data))?e(c(t.data)):void a(t,!1,(t=>{u||(u=new TextEncoder),e(u.encode(t))}))}},6376:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.decodePayload=e.decodePacket=e.encodePayload=e.encodePacket=e.protocol=e.createPacketDecoderStream=e.createPacketEncoderStream=void 0;const r=n(2686);Object.defineProperty(e,"encodePacket",{enumerable:!0,get:function(){return r.encodePacket}});const o=n(2662);Object.defineProperty(e,"decodePacket",{enumerable:!0,get:function(){return o.decodePacket}});const s=n(2046),i=String.fromCharCode(30);let a;function l(t){return t.reduce(((t,e)=>t+e.length),0)}function c(t,e){if(t[0].length===e)return t.shift();const n=new Uint8Array(e);let r=0;for(let o=0;o<e;o++)n[o]=t[0][r++],r===t[0].length&&(t.shift(),r=0);return t.length&&r<t[0].length&&(t[0]=t[0].slice(r)),n}e.encodePayload=(t,e)=>{const n=t.length,o=new Array(n);let s=0;t.forEach(((t,a)=>{(0,r.encodePacket)(t,!1,(t=>{o[a]=t,++s===n&&e(o.join(i))}))}))},e.decodePayload=(t,e)=>{const n=t.split(i),r=[];for(let t=0;t<n.length;t++){const s=(0,o.decodePacket)(n[t],e);if(r.push(s),"error"===s.type)break}return r},e.createPacketEncoderStream=function(){return new TransformStream({transform(t,e){(0,r.encodePacketToBinary)(t,(n=>{const r=n.length;let o;if(r<126)o=new Uint8Array(1),new DataView(o.buffer).setUint8(0,r);else if(r<65536){o=new Uint8Array(3);const t=new DataView(o.buffer);t.setUint8(0,126),t.setUint16(1,r)}else{o=new Uint8Array(9);const t=new DataView(o.buffer);t.setUint8(0,127),t.setBigUint64(1,BigInt(r))}t.data&&"string"!=typeof t.data&&(o[0]|=128),e.enqueue(o),e.enqueue(n)}))}})},e.createPacketDecoderStream=function(t,e){a||(a=new TextDecoder);const n=[];let r=0,i=-1,u=!1;return new TransformStream({transform(h,p){for(n.push(h);;){if(0===r){if(l(n)<1)break;const t=c(n,1);u=!(128&~t[0]),i=127&t[0],r=i<126?3:126===i?1:2}else if(1===r){if(l(n)<2)break;const t=c(n,2);i=new DataView(t.buffer,t.byteOffset,t.length).getUint16(0),r=3}else if(2===r){if(l(n)<8)break;const t=c(n,8),e=new DataView(t.buffer,t.byteOffset,t.length),o=e.getUint32(0);if(o>Math.pow(2,21)-1){p.enqueue(s.ERROR_PACKET);break}i=o*Math.pow(2,32)+e.getUint32(4),r=3}else{if(l(n)<i)break;const t=c(n,i);p.enqueue((0,o.decodePacket)(u?t:a.decode(t),e)),r=0}if(0===i||i>t){p.enqueue(s.ERROR_PACKET);break}}}})},e.protocol=4},7743:(t,e)=>{"use strict";function n(t){t=t||{},this.ms=t.min||100,this.max=t.max||1e4,this.factor=t.factor||2,this.jitter=t.jitter>0&&t.jitter<=1?t.jitter:0,this.attempts=0}Object.defineProperty(e,"__esModule",{value:!0}),e.Backoff=void 0,e.Backoff=n,n.prototype.duration=function(){var t=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var e=Math.random(),n=Math.floor(e*this.jitter*t);t=1&Math.floor(10*e)?t+n:t-n}return 0|Math.min(t,this.max)},n.prototype.reset=function(){this.attempts=0},n.prototype.setMin=function(t){this.ms=t},n.prototype.setMax=function(t){this.max=t},n.prototype.setJitter=function(t){this.jitter=t}},8007:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.connect=e.io=e.Socket=e.Manager=e.protocol=void 0;const o=n(6894),s=n(3776);Object.defineProperty(e,"Manager",{enumerable:!0,get:function(){return s.Manager}});const i=n(6214);Object.defineProperty(e,"Socket",{enumerable:!0,get:function(){return i.Socket}});const a=r(n(7833)).default("socket.io-client"),l={};function c(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};const n=o.url(t,e.path||"/socket.io"),r=n.source,i=n.id,c=n.path,u=l[i]&&c in l[i].nsps;let h;return e.forceNew||e["force new connection"]||!1===e.multiplex||u?(a("ignoring socket cache for %s",r),h=new s.Manager(r,e)):(l[i]||(a("new io instance for %s",r),l[i]=new s.Manager(r,e)),h=l[i]),n.query&&!e.query&&(e.query=n.queryKey),h.socket(n.path,e)}e.io=c,e.connect=c,e.default=c,Object.assign(c,{Manager:s.Manager,Socket:i.Socket,io:c,connect:c});var u=n(4627);Object.defineProperty(e,"protocol",{enumerable:!0,get:function(){return u.protocol}}),t.exports=c},3776:function(t,e,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&r(e,t,n);return o(e,t),e},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Manager=void 0;const a=n(4956),l=n(6214),c=s(n(4627)),u=n(5942),h=n(7743),p=n(7285),d=i(n(7833)).default("socket.io-client:manager");class f extends p.Emitter{constructor(t,e){var n;super(),this.nsps={},this.subs=[],t&&"object"==typeof t&&(e=t,t=void 0),(e=e||{}).path=e.path||"/socket.io",this.opts=e,a.installTimerFunctions(this,e),this.reconnection(!1!==e.reconnection),this.reconnectionAttempts(e.reconnectionAttempts||1/0),this.reconnectionDelay(e.reconnectionDelay||1e3),this.reconnectionDelayMax(e.reconnectionDelayMax||5e3),this.randomizationFactor(null!==(n=e.randomizationFactor)&&void 0!==n?n:.5),this.backoff=new h.Backoff({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(null==e.timeout?2e4:e.timeout),this._readyState="closed",this.uri=t;const r=e.parser||c;this.encoder=new r.Encoder,this.decoder=new r.Decoder,this._autoConnect=!1!==e.autoConnect,this._autoConnect&&this.open()}reconnection(t){return arguments.length?(this._reconnection=!!t,this):this._reconnection}reconnectionAttempts(t){return void 0===t?this._reconnectionAttempts:(this._reconnectionAttempts=t,this)}reconnectionDelay(t){var e;return void 0===t?this._reconnectionDelay:(this._reconnectionDelay=t,null===(e=this.backoff)||void 0===e||e.setMin(t),this)}randomizationFactor(t){var e;return void 0===t?this._randomizationFactor:(this._randomizationFactor=t,null===(e=this.backoff)||void 0===e||e.setJitter(t),this)}reconnectionDelayMax(t){var e;return void 0===t?this._reconnectionDelayMax:(this._reconnectionDelayMax=t,null===(e=this.backoff)||void 0===e||e.setMax(t),this)}timeout(t){return arguments.length?(this._timeout=t,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()}open(t){if(d("readyState %s",this._readyState),~this._readyState.indexOf("open"))return this;d("opening %s",this.uri),this.engine=new a.Socket(this.uri,this.opts);const e=this.engine,n=this;this._readyState="opening",this.skipReconnect=!1;const r=u.on(e,"open",(function(){n.onopen(),t&&t()})),o=e=>{d("error"),this.cleanup(),this._readyState="closed",this.emitReserved("error",e),t?t(e):this.maybeReconnectOnOpen()},s=u.on(e,"error",o);if(!1!==this._timeout){const t=this._timeout;d("connect attempt will timeout after %d",t);const n=this.setTimeoutFn((()=>{d("connect attempt timed out after %d",t),r(),o(new Error("timeout")),e.close()}),t);this.opts.autoUnref&&n.unref(),this.subs.push((()=>{this.clearTimeoutFn(n)}))}return this.subs.push(r),this.subs.push(s),this}connect(t){return this.open(t)}onopen(){d("open"),this.cleanup(),this._readyState="open",this.emitReserved("open");const t=this.engine;this.subs.push(u.on(t,"ping",this.onping.bind(this)),u.on(t,"data",this.ondata.bind(this)),u.on(t,"error",this.onerror.bind(this)),u.on(t,"close",this.onclose.bind(this)),u.on(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(t){try{this.decoder.add(t)}catch(t){this.onclose("parse error",t)}}ondecoded(t){a.nextTick((()=>{this.emitReserved("packet",t)}),this.setTimeoutFn)}onerror(t){d("error",t),this.emitReserved("error",t)}socket(t,e){let n=this.nsps[t];return n?this._autoConnect&&!n.active&&n.connect():(n=new l.Socket(this,t,e),this.nsps[t]=n),n}_destroy(t){const e=Object.keys(this.nsps);for(const t of e)if(this.nsps[t].active)return void d("socket %s is still active, skipping close",t);this._close()}_packet(t){d("writing packet %j",t);const e=this.encoder.encode(t);for(let n=0;n<e.length;n++)this.engine.write(e[n],t.options)}cleanup(){d("cleanup"),this.subs.forEach((t=>t())),this.subs.length=0,this.decoder.destroy()}_close(){d("disconnect"),this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close"),this.engine&&this.engine.close()}disconnect(){return this._close()}onclose(t,e){d("closed due to %s",t),this.cleanup(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",t,e),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;const t=this;if(this.backoff.attempts>=this._reconnectionAttempts)d("reconnect failed"),this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{const e=this.backoff.duration();d("will wait %dms before reconnect attempt",e),this._reconnecting=!0;const n=this.setTimeoutFn((()=>{t.skipReconnect||(d("attempting reconnect"),this.emitReserved("reconnect_attempt",t.backoff.attempts),t.skipReconnect||t.open((e=>{e?(d("reconnect attempt error"),t._reconnecting=!1,t.reconnect(),this.emitReserved("reconnect_error",e)):(d("reconnect success"),t.onreconnect())})))}),e);this.opts.autoUnref&&n.unref(),this.subs.push((()=>{this.clearTimeoutFn(n)}))}}onreconnect(){const t=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",t)}}e.Manager=f},5942:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.on=void 0,e.on=function(t,e,n){return t.on(e,n),function(){t.off(e,n)}}},6214:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Socket=void 0;const o=n(4627),s=n(5942),i=n(7285),a=r(n(7833)).default("socket.io-client:socket"),l=Object.freeze({connect:1,connect_error:1,disconnect:1,disconnecting:1,newListener:1,removeListener:1});class c extends i.Emitter{constructor(t,e,n){super(),this.connected=!1,this.recovered=!1,this.receiveBuffer=[],this.sendBuffer=[],this._queue=[],this._queueSeq=0,this.ids=0,this.acks={},this.flags={},this.io=t,this.nsp=e,n&&n.auth&&(this.auth=n.auth),this._opts=Object.assign({},n),this.io._autoConnect&&this.open()}get disconnected(){return!this.connected}subEvents(){if(this.subs)return;const t=this.io;this.subs=[s.on(t,"open",this.onopen.bind(this)),s.on(t,"packet",this.onpacket.bind(this)),s.on(t,"error",this.onerror.bind(this)),s.on(t,"close",this.onclose.bind(this))]}get active(){return!!this.subs}connect(){return this.connected||(this.subEvents(),this.io._reconnecting||this.io.open(),"open"===this.io._readyState&&this.onopen()),this}open(){return this.connect()}send(...t){return t.unshift("message"),this.emit.apply(this,t),this}emit(t,...e){if(l.hasOwnProperty(t))throw new Error('"'+t.toString()+'" is a reserved event name');if(e.unshift(t),this._opts.retries&&!this.flags.fromQueue&&!this.flags.volatile)return this._addToQueue(e),this;const n={type:o.PacketType.EVENT,data:e,options:{}};if(n.options.compress=!1!==this.flags.compress,"function"==typeof e[e.length-1]){const t=this.ids++;a("emitting packet with ack id %d",t);const r=e.pop();this._registerAckCallback(t,r),n.id=t}const r=this.io.engine&&this.io.engine.transport&&this.io.engine.transport.writable;return!this.flags.volatile||r&&this.connected?this.connected?(this.notifyOutgoingListeners(n),this.packet(n)):this.sendBuffer.push(n):a("discard packet as the transport is not currently writable"),this.flags={},this}_registerAckCallback(t,e){var n;const r=null!==(n=this.flags.timeout)&&void 0!==n?n:this._opts.ackTimeout;if(void 0===r)return void(this.acks[t]=e);const o=this.io.setTimeoutFn((()=>{delete this.acks[t];for(let e=0;e<this.sendBuffer.length;e++)this.sendBuffer[e].id===t&&(a("removing packet with ack id %d from the buffer",t),this.sendBuffer.splice(e,1));a("event with ack id %d has timed out after %d ms",t,r),e.call(this,new Error("operation has timed out"))}),r),s=(...t)=>{this.io.clearTimeoutFn(o),e.apply(this,t)};s.withError=!0,this.acks[t]=s}emitWithAck(t,...e){return new Promise(((n,r)=>{const o=(t,e)=>t?r(t):n(e);o.withError=!0,e.push(o),this.emit(t,...e)}))}_addToQueue(t){let e;"function"==typeof t[t.length-1]&&(e=t.pop());const n={id:this._queueSeq++,tryCount:0,pending:!1,args:t,flags:Object.assign({fromQueue:!0},this.flags)};t.push(((t,...r)=>{if(n===this._queue[0])return null!==t?n.tryCount>this._opts.retries&&(a("packet [%d] is discarded after %d tries",n.id,n.tryCount),this._queue.shift(),e&&e(t)):(a("packet [%d] was successfully sent",n.id),this._queue.shift(),e&&e(null,...r)),n.pending=!1,this._drainQueue()})),this._queue.push(n),this._drainQueue()}_drainQueue(t=!1){if(a("draining queue"),!this.connected||0===this._queue.length)return;const e=this._queue[0];!e.pending||t?(e.pending=!0,e.tryCount++,a("sending packet [%d] (try n°%d)",e.id,e.tryCount),this.flags=e.flags,this.emit.apply(this,e.args)):a("packet [%d] has already been sent and is waiting for an ack",e.id)}packet(t){t.nsp=this.nsp,this.io._packet(t)}onopen(){a("transport is open - connecting"),"function"==typeof this.auth?this.auth((t=>{this._sendConnectPacket(t)})):this._sendConnectPacket(this.auth)}_sendConnectPacket(t){this.packet({type:o.PacketType.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},t):t})}onerror(t){this.connected||this.emitReserved("connect_error",t)}onclose(t,e){a("close (%s)",t),this.connected=!1,delete this.id,this.emitReserved("disconnect",t,e),this._clearAcks()}_clearAcks(){Object.keys(this.acks).forEach((t=>{if(!this.sendBuffer.some((e=>String(e.id)===t))){const e=this.acks[t];delete this.acks[t],e.withError&&e.call(this,new Error("socket has been disconnected"))}}))}onpacket(t){if(t.nsp===this.nsp)switch(t.type){case o.PacketType.CONNECT:t.data&&t.data.sid?this.onconnect(t.data.sid,t.data.pid):this.emitReserved("connect_error",new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case o.PacketType.EVENT:case o.PacketType.BINARY_EVENT:this.onevent(t);break;case o.PacketType.ACK:case o.PacketType.BINARY_ACK:this.onack(t);break;case o.PacketType.DISCONNECT:this.ondisconnect();break;case o.PacketType.CONNECT_ERROR:this.destroy();const e=new Error(t.data.message);e.data=t.data.data,this.emitReserved("connect_error",e)}}onevent(t){const e=t.data||[];a("emitting event %j",e),null!=t.id&&(a("attaching ack callback to event"),e.push(this.ack(t.id))),this.connected?this.emitEvent(e):this.receiveBuffer.push(Object.freeze(e))}emitEvent(t){if(this._anyListeners&&this._anyListeners.length){const e=this._anyListeners.slice();for(const n of e)n.apply(this,t)}super.emit.apply(this,t),this._pid&&t.length&&"string"==typeof t[t.length-1]&&(this._lastOffset=t[t.length-1])}ack(t){const e=this;let n=!1;return function(...r){n||(n=!0,a("sending ack %j",r),e.packet({type:o.PacketType.ACK,id:t,data:r}))}}onack(t){const e=this.acks[t.id];"function"==typeof e?(delete this.acks[t.id],a("calling ack %s with %j",t.id,t.data),e.withError&&t.data.unshift(null),e.apply(this,t.data)):a("bad ack %s",t.id)}onconnect(t,e){a("socket connected with id %s",t),this.id=t,this.recovered=e&&this._pid===e,this._pid=e,this.connected=!0,this.emitBuffered(),this.emitReserved("connect"),this._drainQueue(!0)}emitBuffered(){this.receiveBuffer.forEach((t=>this.emitEvent(t))),this.receiveBuffer=[],this.sendBuffer.forEach((t=>{this.notifyOutgoingListeners(t),this.packet(t)})),this.sendBuffer=[]}ondisconnect(){a("server disconnect (%s)",this.nsp),this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach((t=>t())),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&(a("performing disconnect (%s)",this.nsp),this.packet({type:o.PacketType.DISCONNECT})),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(t){return this.flags.compress=t,this}get volatile(){return this.flags.volatile=!0,this}timeout(t){return this.flags.timeout=t,this}onAny(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(t),this}prependAny(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(t),this}offAny(t){if(!this._anyListeners)return this;if(t){const e=this._anyListeners;for(let n=0;n<e.length;n++)if(t===e[n])return e.splice(n,1),this}else this._anyListeners=[];return this}listenersAny(){return this._anyListeners||[]}onAnyOutgoing(t){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.push(t),this}prependAnyOutgoing(t){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.unshift(t),this}offAnyOutgoing(t){if(!this._anyOutgoingListeners)return this;if(t){const e=this._anyOutgoingListeners;for(let n=0;n<e.length;n++)if(t===e[n])return e.splice(n,1),this}else this._anyOutgoingListeners=[];return this}listenersAnyOutgoing(){return this._anyOutgoingListeners||[]}notifyOutgoingListeners(t){if(this._anyOutgoingListeners&&this._anyOutgoingListeners.length){const e=this._anyOutgoingListeners.slice();for(const n of e)n.apply(this,t.data)}}}e.Socket=c},6894:function(t,e,n){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.url=void 0;const o=n(4956),s=r(n(7833)).default("socket.io-client:url");e.url=function(t,e="",n){let r=t;n=n||"undefined"!=typeof location&&location,null==t&&(t=n.protocol+"//"+n.host),"string"==typeof t&&("/"===t.charAt(0)&&(t="/"===t.charAt(1)?n.protocol+t:n.host+t),/^(https?|wss?):\/\//.test(t)||(s("protocol-less url %s",t),t=void 0!==n?n.protocol+"//"+t:"https://"+t),s("parse %s",t),r=o.parse(t)),r.port||(/^(http|ws)$/.test(r.protocol)?r.port="80":/^(http|ws)s$/.test(r.protocol)&&(r.port="443")),r.path=r.path||"/";const i=-1!==r.host.indexOf(":")?"["+r.host+"]":r.host;return r.id=r.protocol+"://"+i+":"+r.port+e,r.href=r.protocol+"://"+i+(n&&n.port===r.port?"":":"+r.port),r}},4926:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.reconstructPacket=e.deconstructPacket=void 0;const r=n(9133);function o(t,e){if(!t)return t;if((0,r.isBinary)(t)){const n={_placeholder:!0,num:e.length};return e.push(t),n}if(Array.isArray(t)){const n=new Array(t.length);for(let r=0;r<t.length;r++)n[r]=o(t[r],e);return n}if("object"==typeof t&&!(t instanceof Date)){const n={};for(const r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=o(t[r],e));return n}return t}function s(t,e){if(!t)return t;if(t&&!0===t._placeholder){if("number"==typeof t.num&&t.num>=0&&t.num<e.length)return e[t.num];throw new Error("illegal attachments")}if(Array.isArray(t))for(let n=0;n<t.length;n++)t[n]=s(t[n],e);else if("object"==typeof t)for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(t[n]=s(t[n],e));return t}e.deconstructPacket=function(t){const e=[],n=t.data,r=t;return r.data=o(n,e),r.attachments=e.length,{packet:r,buffers:e}},e.reconstructPacket=function(t,e){return t.data=s(t.data,e),delete t.attachments,t}},4627:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Decoder=e.Encoder=e.PacketType=e.protocol=void 0;const r=n(7285),o=n(4926),s=n(9133),i=(0,n(7833).default)("socket.io-parser"),a=["connect","connect_error","disconnect","disconnecting","newListener","removeListener"];var l;function c(t){return"[object Object]"===Object.prototype.toString.call(t)}e.protocol=5,function(t){t[t.CONNECT=0]="CONNECT",t[t.DISCONNECT=1]="DISCONNECT",t[t.EVENT=2]="EVENT",t[t.ACK=3]="ACK",t[t.CONNECT_ERROR=4]="CONNECT_ERROR",t[t.BINARY_EVENT=5]="BINARY_EVENT",t[t.BINARY_ACK=6]="BINARY_ACK"}(l=e.PacketType||(e.PacketType={})),e.Encoder=class{constructor(t){this.replacer=t}encode(t){return i("encoding packet %j",t),t.type!==l.EVENT&&t.type!==l.ACK||!(0,s.hasBinary)(t)?[this.encodeAsString(t)]:this.encodeAsBinary({type:t.type===l.EVENT?l.BINARY_EVENT:l.BINARY_ACK,nsp:t.nsp,data:t.data,id:t.id})}encodeAsString(t){let e=""+t.type;return t.type!==l.BINARY_EVENT&&t.type!==l.BINARY_ACK||(e+=t.attachments+"-"),t.nsp&&"/"!==t.nsp&&(e+=t.nsp+","),null!=t.id&&(e+=t.id),null!=t.data&&(e+=JSON.stringify(t.data,this.replacer)),i("encoded %j as %s",t,e),e}encodeAsBinary(t){const e=(0,o.deconstructPacket)(t),n=this.encodeAsString(e.packet),r=e.buffers;return r.unshift(n),r}};class u extends r.Emitter{constructor(t){super(),this.reviver=t}add(t){let e;if("string"==typeof t){if(this.reconstructor)throw new Error("got plaintext data when reconstructing a packet");e=this.decodeString(t);const n=e.type===l.BINARY_EVENT;n||e.type===l.BINARY_ACK?(e.type=n?l.EVENT:l.ACK,this.reconstructor=new h(e),0===e.attachments&&super.emitReserved("decoded",e)):super.emitReserved("decoded",e)}else{if(!(0,s.isBinary)(t)&&!t.base64)throw new Error("Unknown type: "+t);if(!this.reconstructor)throw new Error("got binary data when not reconstructing a packet");e=this.reconstructor.takeBinaryData(t),e&&(this.reconstructor=null,super.emitReserved("decoded",e))}}decodeString(t){let e=0;const n={type:Number(t.charAt(0))};if(void 0===l[n.type])throw new Error("unknown packet type "+n.type);if(n.type===l.BINARY_EVENT||n.type===l.BINARY_ACK){const r=e+1;for(;"-"!==t.charAt(++e)&&e!=t.length;);const o=t.substring(r,e);if(o!=Number(o)||"-"!==t.charAt(e))throw new Error("Illegal attachments");n.attachments=Number(o)}if("/"===t.charAt(e+1)){const r=e+1;for(;++e&&","!==t.charAt(e)&&e!==t.length;);n.nsp=t.substring(r,e)}else n.nsp="/";const r=t.charAt(e+1);if(""!==r&&Number(r)==r){const r=e+1;for(;++e;){const n=t.charAt(e);if(null==n||Number(n)!=n){--e;break}if(e===t.length)break}n.id=Number(t.substring(r,e+1))}if(t.charAt(++e)){const r=this.tryParse(t.substr(e));if(!u.isPayloadValid(n.type,r))throw new Error("invalid payload");n.data=r}return i("decoded %s as %j",t,n),n}tryParse(t){try{return JSON.parse(t,this.reviver)}catch(t){return!1}}static isPayloadValid(t,e){switch(t){case l.CONNECT:return c(e);case l.DISCONNECT:return void 0===e;case l.CONNECT_ERROR:return"string"==typeof e||c(e);case l.EVENT:case l.BINARY_EVENT:return Array.isArray(e)&&("number"==typeof e[0]||"string"==typeof e[0]&&-1===a.indexOf(e[0]));case l.ACK:case l.BINARY_ACK:return Array.isArray(e)}}destroy(){this.reconstructor&&(this.reconstructor.finishedReconstruction(),this.reconstructor=null)}}e.Decoder=u;class h{constructor(t){this.packet=t,this.buffers=[],this.reconPack=t}takeBinaryData(t){if(this.buffers.push(t),this.buffers.length===this.reconPack.attachments){const t=(0,o.reconstructPacket)(this.reconPack,this.buffers);return this.finishedReconstruction(),t}return null}finishedReconstruction(){this.reconPack=null,this.buffers=[]}}},9133:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.hasBinary=e.isBinary=void 0;const n="function"==typeof ArrayBuffer,r=Object.prototype.toString,o="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===r.call(Blob),s="function"==typeof File||"undefined"!=typeof File&&"[object FileConstructor]"===r.call(File);function i(t){return n&&(t instanceof ArrayBuffer||(t=>"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):t.buffer instanceof ArrayBuffer)(t))||o&&t instanceof Blob||s&&t instanceof File}e.isBinary=i,e.hasBinary=function t(e,n){if(!e||"object"!=typeof e)return!1;if(Array.isArray(e)){for(let n=0,r=e.length;n<r;n++)if(t(e[n]))return!0;return!1}if(i(e))return!0;if(e.toJSON&&"function"==typeof e.toJSON&&1===arguments.length)return t(e.toJSON(),!0);for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return!0;return!1}},7285:(t,e,n)=>{"use strict";function r(t){if(t)return function(t){for(var e in r.prototype)t[e]=r.prototype[e];return t}(t)}n.r(e),n.d(e,{Emitter:()=>r}),r.prototype.on=r.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},r.prototype.once=function(t,e){function n(){this.off(t,n),e.apply(this,arguments)}return n.fn=e,this.on(t,n),this},r.prototype.off=r.prototype.removeListener=r.prototype.removeAllListeners=r.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n,r=this._callbacks["$"+t];if(!r)return this;if(1==arguments.length)return delete this._callbacks["$"+t],this;for(var o=0;o<r.length;o++)if((n=r[o])===e||n.fn===e){r.splice(o,1);break}return 0===r.length&&delete this._callbacks["$"+t],this},r.prototype.emit=function(t){this._callbacks=this._callbacks||{};for(var e=new Array(arguments.length-1),n=this._callbacks["$"+t],r=1;r<arguments.length;r++)e[r-1]=arguments[r];if(n){r=0;for(var o=(n=n.slice(0)).length;r<o;++r)n[r].apply(this,e)}return this},r.prototype.emitReserved=r.prototype.emit,r.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks["$"+t]||[]},r.prototype.hasListeners=function(t){return!!this.listeners(t).length}}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var n=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t].call(n.exports,n,n.exports,__webpack_require__),n.exports}__webpack_require__.d=(t,e)=>{for(var n in e)__webpack_require__.o(e,n)&&!__webpack_require__.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),__webpack_require__.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),__webpack_require__.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var __webpack_exports__={};(()=>{"use strict";var t=__webpack_exports__;Object.defineProperty(t,"__esModule",{value:!0}),t.HotTestDriver=t.IHotTestElementOptions=t.HotTestElementOptions=t.IHotTestElement=t.HotTestElement=t.HotTestPage=t.HotTestDestination=t.HotTestPath=t.HotTestMap=t.HotTesterAPI=t.HotDestination=t.HotTestStop=t.HotTester=t.HotWebSocketClient=t.HotClient=t.HotServerType=t.HotServer=t.HotRouteMethodParameter=t.PassType=t.ServerRequest=t.HotEventMethod=t.HotRouteMethod=t.HotRoute=t.HotPage=t.HotLogLevel=t.HotLog=t.HotFile=t.APItoLoad=t.EventExecutionType=t.HotAPI=t.IHotComponent=t.HotComponentOutput=t.HotComponent=t.DeveloperMode=t.HotAsset=t.HotModule=t.Hot=t.HotSiteMapPath=t.HotSiteRoute=t.HotSite=t.IHotStaq=t.HotStartOptions=t.HotStaq=void 0;const e=__webpack_require__(9343);Object.defineProperty(t,"HotStaq",{enumerable:!0,get:function(){return e.HotStaq}}),Object.defineProperty(t,"HotStartOptions",{enumerable:!0,get:function(){return e.HotStartOptions}}),Object.defineProperty(t,"IHotStaq",{enumerable:!0,get:function(){return e.IHotStaq}});const n=__webpack_require__(5269);Object.defineProperty(t,"HotSite",{enumerable:!0,get:function(){return n.HotSite}}),Object.defineProperty(t,"HotSiteRoute",{enumerable:!0,get:function(){return n.HotSiteRoute}}),Object.defineProperty(t,"HotSiteMapPath",{enumerable:!0,get:function(){return n.HotSiteMapPath}});const r=__webpack_require__(1814);Object.defineProperty(t,"Hot",{enumerable:!0,get:function(){return r.Hot}}),Object.defineProperty(t,"DeveloperMode",{enumerable:!0,get:function(){return r.DeveloperMode}});const o=__webpack_require__(5472);Object.defineProperty(t,"HotAsset",{enumerable:!0,get:function(){return o.HotAsset}});const s=__webpack_require__(6370);Object.defineProperty(t,"HotModule",{enumerable:!0,get:function(){return s.HotModule}});const i=__webpack_require__(3299);Object.defineProperty(t,"HotComponent",{enumerable:!0,get:function(){return i.HotComponent}}),Object.defineProperty(t,"HotComponentOutput",{enumerable:!0,get:function(){return i.HotComponentOutput}}),Object.defineProperty(t,"IHotComponent",{enumerable:!0,get:function(){return i.IHotComponent}});const a=__webpack_require__(8296);Object.defineProperty(t,"HotFile",{enumerable:!0,get:function(){return a.HotFile}});const l=__webpack_require__(3622);Object.defineProperty(t,"HotLog",{enumerable:!0,get:function(){return l.HotLog}}),Object.defineProperty(t,"HotLogLevel",{enumerable:!0,get:function(){return l.HotLogLevel}});const c=__webpack_require__(5989);Object.defineProperty(t,"HotPage",{enumerable:!0,get:function(){return c.HotPage}});const u=__webpack_require__(6044);Object.defineProperty(t,"HotAPI",{enumerable:!0,get:function(){return u.HotAPI}}),Object.defineProperty(t,"EventExecutionType",{enumerable:!0,get:function(){return u.EventExecutionType}}),Object.defineProperty(t,"APItoLoad",{enumerable:!0,get:function(){return u.APItoLoad}});const h=__webpack_require__(7605);Object.defineProperty(t,"HotRoute",{enumerable:!0,get:function(){return h.HotRoute}});const p=__webpack_require__(9844);Object.defineProperty(t,"HotRouteMethod",{enumerable:!0,get:function(){return p.HotRouteMethod}}),Object.defineProperty(t,"HotEventMethod",{enumerable:!0,get:function(){return p.HotEventMethod}}),Object.defineProperty(t,"ServerRequest",{enumerable:!0,get:function(){return p.ServerRequest}}),Object.defineProperty(t,"PassType",{enumerable:!0,get:function(){return p.PassType}}),Object.defineProperty(t,"HotRouteMethodParameter",{enumerable:!0,get:function(){return p.HotRouteMethodParameter}});const d=__webpack_require__(3205);Object.defineProperty(t,"HotServer",{enumerable:!0,get:function(){return d.HotServer}}),Object.defineProperty(t,"HotServerType",{enumerable:!0,get:function(){return d.HotServerType}});const f=__webpack_require__(3025);Object.defineProperty(t,"HotClient",{enumerable:!0,get:function(){return f.HotClient}});const m=__webpack_require__(3596);Object.defineProperty(t,"HotWebSocketClient",{enumerable:!0,get:function(){return m.HotWebSocketClient}});const g=__webpack_require__(896);Object.defineProperty(t,"HotTestDriver",{enumerable:!0,get:function(){return g.HotTestDriver}});const y=__webpack_require__(1284);Object.defineProperty(t,"IHotTestElement",{enumerable:!0,get:function(){return y.IHotTestElement}}),Object.defineProperty(t,"HotTestElement",{enumerable:!0,get:function(){return y.HotTestElement}}),Object.defineProperty(t,"HotTestElementOptions",{enumerable:!0,get:function(){return y.HotTestElementOptions}}),Object.defineProperty(t,"IHotTestElementOptions",{enumerable:!0,get:function(){return y.IHotTestElementOptions}});const b=__webpack_require__(8969);Object.defineProperty(t,"HotTester",{enumerable:!0,get:function(){return b.HotTester}});const v=__webpack_require__(9962);Object.defineProperty(t,"HotTestStop",{enumerable:!0,get:function(){return v.HotTestStop}});const _=__webpack_require__(9164);Object.defineProperty(t,"HotDestination",{enumerable:!0,get:function(){return _.HotDestination}});const w=__webpack_require__(6681);Object.defineProperty(t,"HotTesterAPI",{enumerable:!0,get:function(){return w.HotTesterAPI}});const S=__webpack_require__(6434);Object.defineProperty(t,"HotTestMap",{enumerable:!0,get:function(){return S.HotTestMap}}),Object.defineProperty(t,"HotTestPath",{enumerable:!0,get:function(){return S.HotTestPath}});const P=__webpack_require__(4744);Object.defineProperty(t,"HotTestDestination",{enumerable:!0,get:function(){return P.HotTestDestination}});const H=__webpack_require__(1153);Object.defineProperty(t,"HotTestPage",{enumerable:!0,get:function(){return H.HotTestPage}}),e.HotStaq.isWeb=!0})(),HotStaqWeb=__webpack_exports__})();
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QS9CZixFQUFBZzZCLFdBQVcsSUFFcEIsRUFBQXYxQyxRQUFRQyxPQUFRLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9icm93c2VyLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2pzLWNvb2tpZS9kaXN0L2pzLmNvb2tpZS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90QVBJLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90QXNzZXQudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RDbGllbnQudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RDb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RGaWxlLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90TG9nLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90TW9kdWxlLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90UGFnZS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFJvdXRlLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Um91dGVNZXRob2QudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RTZXJ2ZXIudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RTdGFxLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90U3RhcVJlZ2lzdGVyQ29tcG9uZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90U3RhcVdlYlN0YXJ0LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdERlc3RpbmF0aW9uLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdERyaXZlci50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3RFbGVtZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdE1hcC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3Rlci50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3RlckFQSS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFdlYlNvY2tldENsaWVudC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9ybmcuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmFsaWRhdGUuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YxLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3BhcnNlLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YzNS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9tZDUuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjQuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc2hhMS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9uaWwuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViL2V4dGVybmFsIHZhciBcIkZvcm1EYXRhXCIiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi9leHRlcm5hbCB2YXIgXCJmZXRjaFwiIiwid2VicGFjazovL0hvdFN0YXFXZWIvZXh0ZXJuYWwgdmFyIFwie31cIiIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvY2pzL2NvbnRyaWIvaGFzLWNvcnMuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2Nqcy9jb250cmliL3BhcnNlcXMuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2Nqcy9jb250cmliL3BhcnNldXJpLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9janMvY29udHJpYi95ZWFzdC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvY2pzL2dsb2JhbFRoaXMuYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvY2pzL2luZGV4LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9janMvc29ja2V0LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9janMvdHJhbnNwb3J0LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9janMvdHJhbnNwb3J0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvY2pzL3RyYW5zcG9ydHMvcG9sbGluZy5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvY2pzL3RyYW5zcG9ydHMvd2Vic29ja2V0LWNvbnN0cnVjdG9yLmJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2Nqcy90cmFuc3BvcnRzL3dlYnNvY2tldC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvY2pzL3RyYW5zcG9ydHMvd2VidHJhbnNwb3J0LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9janMvdHJhbnNwb3J0cy94bWxodHRwcmVxdWVzdC5icm93c2VyLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9janMvdXRpbC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1wYXJzZXIvYnVpbGQvY2pzL2NvbW1vbnMuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2Nqcy9jb250cmliL2Jhc2U2NC1hcnJheWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2VuZ2luZS5pby1wYXJzZXIvYnVpbGQvY2pzL2RlY29kZVBhY2tldC5icm93c2VyLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvZW5naW5lLmlvLXBhcnNlci9idWlsZC9janMvZW5jb2RlUGFja2V0LmJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2Nqcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL3NvY2tldC5pby1jbGllbnQvYnVpbGQvY2pzL2NvbnRyaWIvYmFja28yLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9janMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2Nqcy9tYW5hZ2VyLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9janMvb24uanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2Nqcy9zb2NrZXQuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2Nqcy91cmwuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tcGFyc2VyL2J1aWxkL2Nqcy9iaW5hcnkuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9zb2NrZXQuaW8tcGFyc2VyL2J1aWxkL2Nqcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL3NvY2tldC5pby1wYXJzZXIvYnVpbGQvY2pzL2lzLWJpbmFyeS5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL0Bzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXIvaW5kZXgubWpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL0hvdFN0YXFXZWIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9hcGktd2ViLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGRlYnVnIGluc3RhbmNlIHRvIGJlIGNvbG9yZWRcblx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdH1cblx0Y3JlYXRlRGVidWcuc2VsZWN0Q29sb3IgPSBzZWxlY3RDb2xvcjtcblxuXHQvKipcblx0KiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblx0XHRsZXQgcHJldlRpbWU7XG5cdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRsZXQgbmFtZXNwYWNlc0NhY2hlO1xuXHRcdGxldCBlbmFibGVkQ2FjaGU7XG5cblx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHQvLyBEaXNhYmxlZD9cblx0XHRcdGlmICghZGVidWcuZW5hYmxlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNlbGYgPSBkZWJ1ZztcblxuXHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdGNvbnN0IGN1cnIgPSBOdW1iZXIobmV3IERhdGUoKSk7XG5cdFx0XHRjb25zdCBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG5cdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdHNlbGYucHJldiA9IHByZXZUaW1lO1xuXHRcdFx0c2VsZi5jdXJyID0gY3Vycjtcblx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0YXJnc1swXSA9IGNyZWF0ZURlYnVnLmNvZXJjZShhcmdzWzBdKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRhcmdzLnVuc2hpZnQoJyVPJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0YXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChtYXRjaCwgZm9ybWF0KSA9PiB7XG5cdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuICclJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZXIgPSBjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0XHRcdFx0bWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG5cdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRpbmRleC0tO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0Y3JlYXRlRGVidWcuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG5cdFx0XHRjb25zdCBsb2dGbiA9IHNlbGYubG9nIHx8IGNyZWF0ZURlYnVnLmxvZztcblx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRkZWJ1Zy5jb2xvciA9IGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cdFx0ZGVidWcuZXh0ZW5kID0gZXh0ZW5kO1xuXHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWJ1ZywgJ2VuYWJsZWQnLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoZW5hYmxlT3ZlcnJpZGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzcGFjZXNDYWNoZSAhPT0gY3JlYXRlRGVidWcubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0ZW5hYmxlZENhY2hlID0gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cdFx0Y3JlYXRlRGVidWcubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zbGljZSgxKSArICckJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLm1hcCh0b05hbWVzcGFjZSksXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdF0uam9pbignLCcpO1xuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZSgnJyk7XG5cdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0aWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRsZXQgaTtcblx0XHRsZXQgbGVuO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCogQ29udmVydCByZWdleHAgdG8gbmFtZXNwYWNlXG5cdCpcblx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gdG9OYW1lc3BhY2UocmVnZXhwKSB7XG5cdFx0cmV0dXJuIHJlZ2V4cC50b1N0cmluZygpXG5cdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHQucmVwbGFjZSgvXFwuXFwqXFw/JC8sICcqJyk7XG5cdH1cblxuXHQvKipcblx0KiBDb2VyY2UgYHZhbGAuXG5cdCpcblx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0KiBAcmV0dXJuIHtNaXhlZH1cblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxuXG5cdC8qKlxuXHQqIFhYWCBETyBOT1QgVVNFLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0dWIgZnVuY3Rpb24uXG5cdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHQqL1xuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHR9XG5cblx0Y3JlYXRlRGVidWcuZW5hYmxlKGNyZWF0ZURlYnVnLmxvYWQoKSk7XG5cblx0cmV0dXJuIGNyZWF0ZURlYnVnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHVwO1xuIiwiLyohIGpzLWNvb2tpZSB2My4wLjEgfCBNSVQgKi9cbjtcbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjdXJyZW50ID0gZ2xvYmFsLkNvb2tpZXM7XG4gICAgdmFyIGV4cG9ydHMgPSBnbG9iYWwuQ29va2llcyA9IGZhY3RvcnkoKTtcbiAgICBleHBvcnRzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7IGdsb2JhbC5Db29raWVzID0gY3VycmVudDsgcmV0dXJuIGV4cG9ydHM7IH07XG4gIH0oKSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG4gIGZ1bmN0aW9uIGFzc2lnbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuICB2YXIgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgICByZWFkOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oJVtcXGRBLUZdezJ9KSsvZ2ksIGRlY29kZVVSSUNvbXBvbmVudClcbiAgICB9LFxuICAgIHdyaXRlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoXG4gICAgICAgIC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcbiAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50XG4gICAgICApXG4gICAgfVxuICB9O1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXZhciAqL1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG4gIGZ1bmN0aW9uIGluaXQgKGNvbnZlcnRlciwgZGVmYXVsdEF0dHJpYnV0ZXMpIHtcbiAgICBmdW5jdGlvbiBzZXQgKGtleSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkZWZhdWx0QXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcy5leHBpcmVzID09PSAnbnVtYmVyJykge1xuICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZTUpO1xuICAgICAgfVxuICAgICAgaWYgKGF0dHJpYnV0ZXMuZXhwaXJlcykge1xuICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSlcbiAgICAgICAgLnJlcGxhY2UoLyUoMlszNDZCXXw1RXw2MHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KVxuICAgICAgICAucmVwbGFjZSgvWygpXS9nLCBlc2NhcGUpO1xuXG4gICAgICB2YXIgc3RyaW5naWZpZWRBdHRyaWJ1dGVzID0gJyc7XG4gICAgICBmb3IgKHZhciBhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcblxuICAgICAgICBpZiAoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG4gICAgICAgIC8vIC4uLlxuICAgICAgICAvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG4gICAgICAgIC8vICAgICBjaGFyYWN0ZXI6XG4gICAgICAgIC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgdXAgdG8sXG4gICAgICAgIC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuICAgICAgICAvLyAuLi5cbiAgICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc9JyArIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uc3BsaXQoJzsnKVswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChkb2N1bWVudC5jb29raWUgPVxuICAgICAgICBrZXkgKyAnPScgKyBjb252ZXJ0ZXIud3JpdGUodmFsdWUsIGtleSkgKyBzdHJpbmdpZmllZEF0dHJpYnV0ZXMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0IChrZXkpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IChhcmd1bWVudHMubGVuZ3RoICYmICFrZXkpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBUbyBwcmV2ZW50IHRoZSBmb3IgbG9vcCBpbiB0aGUgZmlyc3QgcGxhY2UgYXNzaWduIGFuIGVtcHR5IGFycmF5XG4gICAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjb29raWVzIGF0IGFsbC5cbiAgICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG4gICAgICB2YXIgamFyID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgZm91bmRLZXkgPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pO1xuICAgICAgICAgIGphcltmb3VuZEtleV0gPSBjb252ZXJ0ZXIucmVhZCh2YWx1ZSwgZm91bmRLZXkpO1xuXG4gICAgICAgICAgaWYgKGtleSA9PT0gZm91bmRLZXkpIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5ID8gamFyW2tleV0gOiBqYXJcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgc2V0OiBzZXQsXG4gICAgICAgIGdldDogZ2V0LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIChrZXksIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBzZXQoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgIGFzc2lnbih7fSwgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgICBleHBpcmVzOiAtMVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB3aXRoQXR0cmlidXRlczogZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICByZXR1cm4gaW5pdCh0aGlzLmNvbnZlcnRlciwgYXNzaWduKHt9LCB0aGlzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpKVxuICAgICAgICB9LFxuICAgICAgICB3aXRoQ29udmVydGVyOiBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGluaXQoYXNzaWduKHt9LCB0aGlzLmNvbnZlcnRlciwgY29udmVydGVyKSwgdGhpcy5hdHRyaWJ1dGVzKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhdHRyaWJ1dGVzOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGRlZmF1bHRBdHRyaWJ1dGVzKSB9LFxuICAgICAgICBjb252ZXJ0ZXI6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoY29udmVydGVyKSB9XG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgdmFyIGFwaSA9IGluaXQoZGVmYXVsdENvbnZlcnRlciwgeyBwYXRoOiAnLycgfSk7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbiAgcmV0dXJuIGFwaTtcblxufSkpKTtcbiIsIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwiaW1wb3J0IHsgSG90RmlsZSB9IGZyb20gXCIuL0hvdEZpbGVcIjtcbmltcG9ydCB7IEhvdFBhZ2UgfSBmcm9tIFwiLi9Ib3RQYWdlXCI7XG5pbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RUZXN0RWxlbWVudCB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5pbXBvcnQgeyBIb3RFdmVudE1ldGhvZCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RNb2R1bGUgfSBmcm9tIFwiLi9Ib3RNb2R1bGVcIjtcblxuaW1wb3J0IENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5pbXBvcnQgRm9ybURhdGEgZnJvbSBcImZvcm0tZGF0YVwiO1xuXG4vKipcbiAqIFRoZSBhdmFpbGFibGUgZGV2ZWxvcGVyIG1vZGVzLlxuICovXG5leHBvcnQgZW51bSBEZXZlbG9wZXJNb2RlXG57XG5cdC8qKlxuXHQgKiBUaGUgZGVmYXVsdCBkZXZlbG9wZXIgbW9kZS4gTm8gdGVzdHMgd2lsbCBiZSBleGVjdXRlZCBhbmQgXG5cdCAqIGFueSB0ZXN0IHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqL1xuXHRQcm9kdWN0aW9uLFxuXHQvKipcblx0ICogRm9yIHVzZSBkdXJpbmcgZGV2ZWxvcG1lbnQvZGVidWdnaW5nLiBBbGwgdGVzdCBkYXRhIHdpbGwgXG5cdCAqIGJlIGNvbGxlY3RlZCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0RGV2ZWxvcG1lbnRcbn1cblxuLyoqXG4gKiBBIENTUyBvYmplY3QgdG8gZW1iZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTT2JqZWN0XG57XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBDU1MgZmlsZSB0byBlbWJlZC5cblx0ICovXG5cdHVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGludGVncml0eSBoYXNoIHRvIGdlbmVyYXRlIGR1cmluZyBpbml0aWFsIGNvbXBpbGF0aW9uLlxuXHQgKi9cblx0aW50ZWdyaXR5SGFzaDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBhcGkgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFxue1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnRseSBnZW5lcmF0ZWQgcGFnZSBiZWluZyBkaXNwbGF5ZWQuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIEN1cnJlbnRQYWdlOiBIb3RQYWdlID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBhcmd1bWVudHMgcGFzc2VkLlxuXHQgKi9cblx0c3RhdGljIEFyZ3VtZW50czogYW55ID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBtb2RlIGluIHdoaWNoIHRoaXMgYXBwbGljYXRpb24gaXMgcnVubmluZy4gSWYgaXQncyBzZXQgdG8gZGV2ZWxvcG1lbnQgbW9kZSwgYWxsIHRlc3Rpbmdcblx0ICogcmVsYXRlZCBkYXRhIHdpbGwgYmUgY29sbGVjdGVkLCBwYXJzZWQsIGFuZCBleGVjdXRlZCBpZiBuZWNlc3NhcnkuXG5cdCAqL1xuXHRzdGF0aWMgRGV2ZWxvcGVyTW9kZSA9IERldmVsb3Blck1vZGU7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIEhvdFRlc3RFbGVtZW50ID0gSG90VGVzdEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIE1vZGU6IERldmVsb3Blck1vZGUgPSBEZXZlbG9wZXJNb2RlLlByb2R1Y3Rpb247XG5cdC8qKlxuXHQgKlRoZSBjdXJyZW50IEFQSSB1c2VkIG9uIHRoaXMgcGFnZS4gVGhpcyBpcyBjbGVhcmVkIGJldHdlZW4gZXZlcnkgZmlsZSBwcm9jZXNzZWQuXG5cdCAqL1xuXHRzdGF0aWMgQVBJOiBIb3RBUEkgPSBudWxsO1xuXHQvKipcblx0ICogVGhlIEFQSSBiZWluZyB1c2VkIGJ5IHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRzdGF0aWMgVGVzdGVyQVBJOiBIb3RBUEkgPSBudWxsO1xuXHQvKipcblx0ICogQ29udGFpbnMgdGhlIGJ1ZmZlciB0byBvdXRwdXQuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIE91dHB1dDogc3RyaW5nID0gXCJcIjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhIHRvIHNoYXJlIGFjcm9zcyBhbGwgdGhlIGRpZmZlcmVudCBmaWxlcyBhbmQgcGFnZXMuIFRoaXMgZGF0YSB3aWxsIGJlIHB1YmxpYy5cblx0ICovXG5cdHN0YXRpYyBEYXRhOiBhbnkgPSB7fTtcblx0LyoqXG5cdCAqIFRoZSBjb29raWVzIHRvIHVzZSBiZXR3ZWVuIHBhZ2VzLlxuXHQgKi9cblx0c3RhdGljIENvb2tpZXM6IENvb2tpZXMuQ29va2llc1N0YXRpYyA9IENvb2tpZXM7XG5cdC8qKlxuXHQgKiBBbnkgcHVibGljIGtleXMgdGhhdCBuZWVkIHRvIGJlIHNob3duLiBUaGVzZSBjYW4gYmUgcGFzc2VkIGZyb20gSG90U2l0ZS5qc29uLlxuXHQgKi9cblx0c3RhdGljIFB1YmxpY0tleXM6IGFueSA9IHt9O1xuXHQvKipcblx0ICogVGhlIENTUyBzdHJpbmcgdG8gdXNlIHdoZW4gZWNob2luZyBvdXQgdGhlIENTUyBmaWxlcy5cblx0ICovXG5cdHN0YXRpYyBjc3NTdHI6IHN0cmluZyA9IGA8bGluayByZWwgPSBcInN0eWxlc2hlZXRcIiBocmVmID0gXCIlQ1NTX0ZJTEUlXCIgLz5gO1xuXHQvKipcblx0ICogVGhlIENTUyBmaWxlcyB0byB1c2UgaW4gdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqIFxuXHQgKiBAdG9kbyBNYWtlIHRoaXMgYSBcInN0cmluZyB8IENTU09iamVjdFwiIGRhdGEgdHlwZSBzbyBpdCBjYW4gYWxzbyBpbmNsdWRlIFxuXHQgKiB0aGUgaW50ZWdyaXR5IGhhc2hlcyBhcyB3ZWxsLlxuXHQgKi9cblx0c3RhdGljIENTUzogc3RyaW5nW10gPSBbXTtcblx0LyoqXG5cdCAqIFRoZSBKYXZhU2NyaXB0IGZpbGVzIHRvIHVzZSBpbiB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICogXG5cdCAqIEB0b2RvIE1ha2UgdGhpcyBhIFwic3RyaW5nIHwgSlNGaWxlT2JqZWN0XCIgZGF0YSB0eXBlIHNvIGl0IGNhbiBhbHNvIGluY2x1ZGUgXG5cdCAqIHRoZSBpbnRlZ3JpdHkgaGFzaGVzIGFzIHdlbGwuXG5cdCAqL1xuXHRzdGF0aWMgSlNGaWxlczogYW55W10gPSBbXTtcblx0LyoqXG5cdCAqIFRoZSBKYXZhU2NyaXB0IGlubGluZSBjb2RlIHRvIHVzZSBpbiB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICovXG5cdHN0YXRpYyBKU1NjcmlwdHM6IGFueVtdID0gW107XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBzdHJpbmcgdG8gdXNlIHdoZW4gZWNob2luZyBvdXQgdGhlIFNjcmlwdHMgZmlsZXMuXG5cdCAqL1xuXHRzdGF0aWMganNGaWxlU3RyOiBzdHJpbmcgPSBgPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiVKU19GSUxFJVwiPjwvc2NyaXB0PmA7XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBzdHJpbmcgdG8gdXNlIHdoZW4gZWNob2luZyBvdXQgdGhlIFNjcmlwdHMgZmlsZXMuXG5cdCAqL1xuXHRzdGF0aWMganNTY3JpcHRzU3RyOiBzdHJpbmcgPSBgPHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj4lSlNfQ09ERSU8L3NjcmlwdD5gO1xuXG5cdC8qKlxuXHQgKiBHZXQgYSB2YWxpZGF0ZWQgVVJMIHBhcmFtZXRlci5cblx0ICogXG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYHRzXG5cdCAqIDwqXG5cdCAqIFx0Y29uc3QgaWQgPSBIb3QuZ2V0VXJsUGFyYW0gKCdpZCcsICdpbnQnKTtcblx0ICogKj5cblx0ICogXG5cdCAqIDxkaXY+VGhlIGlkIGlzOiAke2lkfTwvZGl2PlxuXHQgKiBgYGBcblx0ICogXG5cdCAqIEBwYXJhbSB2YWxpZGF0aW9uIFRoaXMgcGFyYW1ldGVyIGlzIGZvciB2YWxpZGF0aW5nIGFuZCBzYW5pdGl6aW5nIGEgVVJMIHBhcmFtZXRlci5cblx0ICogSWYgaXQncyBhIHN0cmluZywgdGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZTpcblx0ICogKiBpbnRcblx0ICogICAqIFRoaXMgd2lsbCBvbmx5IGFsbG93IGludGVnZXJzLiBwYXJzZUludCB3aWxsIGJlIGNhbGxlZCBhbmQgd2lsbCByZXR1cm4gYW4gaW50ZWdlci5cblx0ICogKiBmbG9hdFxuXHQgKiAgICogVGhpcyB3aWxsIG9ubHkgYWxsb3cgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gcGFyc2VGbG9hdCB3aWxsIGJlIGNhbGxlZCBhbmQgd2lsbCByZXR1cm4gYSBmbG9hdC5cblx0ICogKiBlbWFpbFxuXHQgKiAgICogV2lsbCB2ZXJpZnkgdGhhdCB0aGUgc3RyaW5nIGlzIGluIHRoZSBmb3JtIG9mIGFuIGVtYWlsIGFkZHJlc3MuXG5cdCAqICogcGhvbmVcblx0ICogICAqIFdpbGwgdmVyaWZ5IHRoYXQgdGhlIHN0cmluZyBpcyBpbiB0aGUgZm9ybSBvZiBhbiBlbWFpbCBhZGRyZXNzLlxuXHQgKiAqIHV1aWRcblx0ICogICAqIFRoaXMgd2lsbCB2ZXJpZnkgdGhhdCB0aGUgc3RyaW5nIGlzIGluIHRoZSBmb3JtIG9mIGEgVVVJRC4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhlIFVVSUQgaXMgdmFsaWQuXG5cdCAqICogc3RyaW5nKG51bWJlcl9vZl9jaGFycylcblx0ICogICAqIFRoaXMgd2lsbCBvbmx5IGFsbG93IGEgc3RyaW5nIG9mIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuXG5cdCAqIFxuXHQgKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHRoaXMgd2lsbCBjYWxsIHRoZSBzdXBwbGllZCBmdW5jdGlvbiB0byB2YWxpZGF0ZS4gVmFsaWRhdGlvbiBjaGVja3MgbXVzdCBoYXBwZW4gXG5cdCAqIGluIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIHRoZSBzYW5pdGl6ZWQgdmFsdWUuIEl0IGlzIHNpbXBseSBhIHBhc3N0aHJvdWdoLCBiZSB3aXNlIHdpdGggdGhpcy4gVGhyb3cgXG5cdCAqIGFuIGVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgdmFsaWQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBVUkwgcGFyYW1ldGVyLCBvbmx5IGlmIGl0IHBhc3NlcyB2YWxpZGF0aW9uLiBJZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBmb3VuZCxcblx0ICogbnVsbCB3aWxsIGJlIHJldHVybmVkLlxuXHQgKi9cblx0c3RhdGljIGdldFVybFBhcmFtIChwYXJhbTogc3RyaW5nLCB2YWxpZGF0aW9uOiBzdHJpbmcgfCAoKHBhcmFtOiBhbnkpID0+IGFueSkpOiBhbnlcblx0e1xuXHRcdGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXHRcdGNvbnN0IHZhbHVlID0gdXJsUGFyYW1zLmdldCAocGFyYW0pO1xuXG5cdFx0aWYgKHZhbHVlID09IG51bGwpXG5cdFx0XHRyZXR1cm4gKG51bGwpO1xuXG5cdFx0aWYgKHR5cGVvZiAodmFsaWRhdGlvbikgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0c3dpdGNoICh2YWxpZGF0aW9uKVxuXHRcdFx0e1xuXHRcdFx0XHRjYXNlIFwiaW50XCI6XG5cdFx0XHRcdFx0cmV0dXJuIChwYXJzZUludCAodmFsdWUpKTtcblx0XHRcdFx0Y2FzZSBcImZsb2F0XCI6XG5cdFx0XHRcdFx0cmV0dXJuIChwYXJzZUZsb2F0ICh2YWx1ZSkpO1xuXHRcdFx0XHRjYXNlIFwiZW1haWxcIjpcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IGVtYWlsUmVnZXggPSBuZXcgUmVnRXhwIChcIl5cXFxcUytAXFxcXFMrXFxcXC5cXFxcUyskXCIpO1xuXG5cdFx0XHRcdFx0aWYgKGVtYWlsUmVnZXgudGVzdCAodmFsdWUpID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0cmV0dXJuICh2YWx1ZSk7XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXNlIFwicGhvbmVcIjpcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IHBob25lUmVnZXggPSBuZXcgUmVnRXhwIChcIl5cXFxcKz8oWzAtOSBdPyl7NiwxNH1bMC05XSRcIik7XG5cblx0XHRcdFx0XHRpZiAocGhvbmVSZWdleC50ZXN0ICh2YWx1ZSkgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRyZXR1cm4gKHZhbHVlKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhc2UgXCJ1dWlkXCI6XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCB1dWlkUmVnZXggPSBuZXcgUmVnRXhwIChcIlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfVwiKTtcblxuXHRcdFx0XHRcdGlmICh1dWlkUmVnZXgudGVzdCAodmFsdWUpID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0cmV0dXJuICh2YWx1ZSk7XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGlmICh2YWxpZGF0aW9uLmluZGV4T2YgKFwic3RyaW5nXCIpID4gLTEpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgbnVtQ2hhcnMgPSBwYXJzZUludCAodmFsaWRhdGlvbi5zcGxpdCAoXCIoXCIpWzFdLnNwbGl0IChcIilcIilbMF0pO1xuXG5cdFx0XHRcdFx0XHRpZiAodmFsdWUubGVuZ3RoID09PSBudW1DaGFycylcblx0XHRcdFx0XHRcdFx0cmV0dXJuICh2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBnZXRVcmxQYXJhbSByZXRyZWl2aW5nIHBhcmFtZXRlciBcIiR7cGFyYW19XCIgdXNpbmcgdmFsaWRhdGlvbiB0eXBlIFwiJHt2YWxpZGF0aW9ufVwiIGZhaWxlZC5gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbGlkYXRpb24gKHZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYSBmaWxlIGFuZCBlY2hvIG91dCBpdCdzIGNvbnRlbnRzLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGluY2x1ZGUgKGZpbGU6IEhvdEZpbGUgfCBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGlmICh0eXBlb2YgKGZpbGUpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBsb3dlckZpbGU6IHN0cmluZyA9IGZpbGUudG9Mb3dlckNhc2UgKCk7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGZpbGUgdG8gYmUgaW5jbHVkZWQgZG9lcyBub3QgaGF2ZSBhIG5haGZhbSwgYWRkIGl0LiBUaGlzIFxuXHRcdFx0XHQvLyB3aWxsIGVuc3VyZSB0aGUgc2VydmVyIHNlbmRzIG9ubHkgdGhlIGZpbGUgY29udGVudC5cblx0XHRcdFx0aWYgKGxvd2VyRmlsZS5pbmRleE9mIChcIi5ob3R0XCIpID4gLTEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAobG93ZXJGaWxlLmluZGV4T2YgKFwibmFoZmFtXCIpIDwgMClcblx0XHRcdFx0XHRcdGZpbGUgKz0gXCI/aHN0cXNlcnZlPW5haGZhbVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0SG90LmVjaG8gKGF3YWl0IEhvdC5nZXRGaWxlIChmaWxlLCBhcmdzKSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5jbHVkZSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGZvciB1c2Ugd2hlbiBydW5uaW5nIHRoZSBwcmVwcm9jZXNzb3IuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgaW5jbHVkZUpTIChmaWxlOiBIb3RGaWxlIHwgc3RyaW5nLCBhcmdzOiBhbnlbXSA9IG51bGwsIHBhcmVudE9iamVjdDogYW55ID0gbnVsbCk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0Y29uc3Qgb3V0cHV0OiBzdHJpbmcgPSBhd2FpdCBIb3QuZ2V0RmlsZSAoZmlsZSk7XG5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRpZiAocGFyZW50T2JqZWN0ID09IG51bGwpXG5cdFx0XHRcdHBhcmVudE9iamVjdCA9IHdpbmRvdztcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdGlmIChwYXJlbnRPYmplY3QgPT0gbnVsbClcblx0XHRcdFx0cGFyZW50T2JqZWN0ID0gZ2xvYmFsO1xuXHRcdH1cblxuXHRcdGxldCBmdW5jID0gbmV3IEZ1bmN0aW9uIChvdXRwdXQpO1xuXG5cdFx0cmV0dXJuIChmdW5jLmFwcGx5IChwYXJlbnRPYmplY3QsIGFyZ3MpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSBhIGZpbGUgYW5kIGVjaG8gb3V0IGl0J3MgY29udGVudHMuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgaW1wb3J0IChtb2R1bGVOYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCwgcGFyZW50T2JqZWN0OiBhbnkgPSBudWxsKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgZm91bmRNb2R1bGU6IEhvdE1vZHVsZSA9IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuZ2V0TW9kdWxlIChtb2R1bGVOYW1lKTtcblxuXHRcdGlmIChmb3VuZE1vZHVsZSAhPSBudWxsKVxuXHRcdFx0cmV0dXJuIChmb3VuZE1vZHVsZSk7XG5cblx0XHRjb25zdCBmaWxlOiBzdHJpbmcgPSBgLi9ob3RzdGFxX21vZHVsZXMvJHttb2R1bGVOYW1lfS9pbmRleC5qc2A7XG5cdFx0Y29uc3Qgb3V0cHV0OiBzdHJpbmcgPSBhd2FpdCBIb3QuZ2V0RmlsZSAoZmlsZSwgYXJncyk7XG5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRpZiAocGFyZW50T2JqZWN0ID09IG51bGwpXG5cdFx0XHRcdHBhcmVudE9iamVjdCA9IHdpbmRvdztcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdGlmIChwYXJlbnRPYmplY3QgPT0gbnVsbClcblx0XHRcdFx0cGFyZW50T2JqZWN0ID0gZ2xvYmFsO1xuXHRcdH1cblxuXHRcdGxldCBuZXdNb2R1bGUgPSBuZXcgRnVuY3Rpb24gKG91dHB1dCkuYXBwbHkgKHBhcmVudE9iamVjdCk7XG5cblx0XHRpZiAobmV3TW9kdWxlLmxvYWRIVE1MICE9IG51bGwpXG5cdFx0XHRhd2FpdCBuZXdNb2R1bGUubG9hZEhUTUwgKCk7XG5cblx0XHRIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmFkZE1vZHVsZSAobW9kdWxlTmFtZSwgbmV3TW9kdWxlKTtcblxuXHRcdHJldHVybiAobmV3TW9kdWxlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSdW4gYW4gYWxyZWFkeSBsb2FkZWQgZmlsZSBhbmQgZWNobyBvdXQgaXQncyBjb250ZW50cy5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBydW5GaWxlIChmaWxlTmFtZTogc3RyaW5nLCBhcmdzOiBhbnlbXSA9IG51bGwpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuZ2V0RmlsZSAoZmlsZU5hbWUpO1xuXHRcdC8vLyBAZml4bWUgRG9lcyB0aGUgZmlsZSBuZWVkIHRvIGJlIGRlZXAgY2xvbmVkIGZpcnN0P1xuXHRcdC8vbGV0IGNsb25lZEZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAoT2JqZWN0LmFzc2lnbiAoe30sIGZpbGUpKTtcblx0XHRsZXQgdGVtcEZpbGU6IEhvdEZpbGUgPSBmaWxlO1xuXG5cdFx0dGVtcEZpbGUucGFnZSA9IHRoaXMuQ3VycmVudFBhZ2U7XG5cdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGF3YWl0IHRlbXBGaWxlLnByb2Nlc3MgKGFyZ3MpO1xuXG5cdFx0SG90LmVjaG8gKGNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgY29udGVudCBvZiBhIGZpbGUuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZ2V0RmlsZSAocGF0aDogSG90RmlsZSB8IHN0cmluZywgYXJnczogYW55W10gPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgdGVtcEZpbGU6IEhvdEZpbGUgPSBudWxsO1xuXG5cdFx0aWYgKHR5cGVvZiAocGF0aCkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0dGVtcEZpbGUgPSBuZXcgSG90RmlsZSAoKTtcblx0XHRcdHRlbXBGaWxlLm5hbWUgPSBwYXRoO1xuXG5cdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHRcdFx0dGVtcEZpbGUudXJsID0gcGF0aDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGVtcEZpbGUubG9jYWxGaWxlID0gcGF0aDtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGVtcEZpbGUgPSBwYXRoO1xuXG5cdFx0bGV0IGNoZWNrRmlsZTogSG90RmlsZSA9IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuZ2V0RmlsZSAodGVtcEZpbGUubmFtZSwgZmFsc2UpO1xuXG5cdFx0aWYgKGNoZWNrRmlsZSAhPSBudWxsKVxuXHRcdFx0dGVtcEZpbGUgPSBjaGVja0ZpbGU7XG5cblx0XHRhd2FpdCB0ZW1wRmlsZS5sb2FkICgpO1xuXG5cdFx0dGVtcEZpbGUucGFnZSA9IHRoaXMuQ3VycmVudFBhZ2U7XG5cdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGF3YWl0IHRlbXBGaWxlLnByb2Nlc3MgKGFyZ3MpO1xuXG5cdFx0cmV0dXJuIChjb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYWtlIGFuIGFwaSBjYWxsLiBUaGlzIG11c3QgaW5jbHVkZSB0aGUgcm91dGUgdmVyc2lvbi5cblx0ICogXG5cdCAqIFNpbXBsZSBhcGlDYWxsOlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBgYGB0c1xuXHQgKiBhd2FpdCBIb3QuYXBpQ2FsbCAoJy92MS9oZWxsb193b3JsZC9lY2hvJywgeyBtZXNzYWdlOiBcIkhlbGxvIVwiIH0pO1xuXHQgKiBgYGBcblx0ICogXG5cdCAqIE1ha2UgYW4gQVBJIGNhbGwgYW5kIHVwbG9hZCBhIGZpbGU6XG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYHRzXG5cdCAqIGxldCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkIChcImZpbGVJbnB1dFwiKTtcblx0ICogbGV0IGZpbGUgPSBpbnB1dC5maWxlc1swXTtcblx0ICogXG5cdCAqIGF3YWl0IEhvdC5hcGlDYWxsICgnL3YxL2hlbGxvX3dvcmxkL2VjaG8nLFxuXHQgKiBcdFx0eyBtZXNzYWdlOiBcIkhlbGxvIVwiIH0sIEhvdEV2ZW50TWV0aG9kLlBPU1QsXG5cdCAqIFx0XHR7XG5cdCAqIFx0XHRcdFwiaW5kZXhGaWxlS2V5XCI6IGZpbGVcblx0ICogXHRcdH0pO1xuXHQgKiBgYGBcblx0ICovXG5cdHN0YXRpYyBhc3luYyBhcGlDYWxsIChyb3V0ZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsLCBcblx0XHRodHRwTWV0aG9kOiBIb3RFdmVudE1ldGhvZCA9IEhvdEV2ZW50TWV0aG9kLlBPU1QsIFxuXHRcdGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9LCBiZWFyZXJUb2tlbjogc3RyaW5nID0gXCJcIik6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJlc3VsdDogYW55ID0gbnVsbDtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJDdXJyZW50IHBhZ2UgaXMgbnVsbCFcIik7XG5cblx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSdzIHByb2Nlc3NvciBpcyBudWxsIVwiKTtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmFwaSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSdzIHByb2Nlc3NvciBhcGkgaXMgbnVsbCEgRGlkIHlvdSBmb3JnZXQgdG8gc2V0IHRoZSBBUEkgbmFtZSBvciBVUkw/XCIpO1xuXG5cdFx0aWYgKEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuYXBpICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0cmVzdWx0ID0gYXdhaXQgSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5hcGkubWFrZUNhbGwgKHJvdXRlLCBcblx0XHRcdFx0XHRcdFx0ZGF0YSwgaHR0cE1ldGhvZCwgZmlsZXMsIGJlYXJlclRva2VuKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgSFRUUCBKU09OIGZpbGUgb3IgcmVxdWVzdCB1c2luZyBIVFRQIEdFVC5cblx0ICogXG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYHRzXG5cdCAqIGF3YWl0IEhvdC5nZXRKU09OIChgaHR0cDovL2V4YW1wbGUuY29tL2V4YW1wbGUuanNvbmApO1xuXHQgKiBgYGBcblx0ICogXG5cdCAqIEBwYXJhbSB1cmwgVGhlIGZ1bGwgdXJsIHRvIG1ha2UgdGhlIEhUVFAgY2FsbC5cblx0ICogXG5cdCAqIEByZXR1cm5zIFRoZSBwYXJzZWQgSlNPTiBvYmplY3QuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZ2V0SlNPTiAodXJsOiBzdHJpbmcsIGJlYXJlclRva2VuOiBzdHJpbmcgPSBcIlwiKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRyZXR1cm4gKEhvdC5qc29uUmVxdWVzdCAodXJsLCBudWxsLCBiZWFyZXJUb2tlbiwgSG90RXZlbnRNZXRob2QuR0VUKSk7XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIEhUVFAgSlNPTiByZXF1ZXN0LlxuXHQgKiBcblx0ICogQGV4YW1wbGVcblx0ICogYGBgdHNcblx0ICogYXdhaXQgSG90Lmpzb25SZXF1ZXN0ICgnL3YxL2hlbGxvX3dvcmxkL2VjaG8nLCB7IG1lc3NhZ2U6IFwiSGVsbG8hXCIgfSk7XG5cdCAqIGBgYFxuXHQgKiBcblx0ICogQHBhcmFtIHVybCBUaGUgZnVsbCB1cmwgdG8gbWFrZSB0aGUgSFRUUCBjYWxsLlxuXHQgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBKU09OLnN0cmluZ2lmeSBhbmQgc2VuZC5cblx0ICogQHBhcmFtIGh0dHBNZXRob2QgVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSB0byBzZW5kIHRoZSBkYXRhLlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIHBhcnNlZCBKU09OIG9iamVjdC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBqc29uUmVxdWVzdCAodXJsOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwsIGJlYXJlclRva2VuOiBzdHJpbmcgPSBcIlwiLCBcblx0XHRodHRwTWV0aG9kOiBIb3RFdmVudE1ldGhvZCA9IEhvdEV2ZW50TWV0aG9kLlBPU1QpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdHRyeVxuXHRcdHtcblx0XHRcdGxldCBmZXRjaE9iajogYW55ID0ge1xuXHRcdFx0XHRcIm1ldGhvZFwiOiBodHRwTWV0aG9kLFxuXHRcdFx0XHRcImhlYWRlcnNcIjoge1xuXHRcdFx0XHRcdFx0XCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGh0dHBNZXRob2QgIT09IEhvdEV2ZW50TWV0aG9kLkdFVClcblx0XHRcdFx0ZmV0Y2hPYmpbXCJib2R5XCJdID0gSlNPTi5zdHJpbmdpZnkgKGRhdGEpO1xuXG5cdFx0XHRpZiAoYmVhcmVyVG9rZW4gIT0gXCJcIilcblx0XHRcdFx0ZmV0Y2hPYmouaGVhZGVyc1tcIkF1dGhvcml6YXRpb25cIl0gPSBgQmVhcmVyICR7YmVhcmVyVG9rZW59YDtcblxuXHRcdFx0bGV0IHJlcyA9IGF3YWl0IGZldGNoICh1cmwsIGZldGNoT2JqKTtcblxuXHRcdFx0aWYgKHJlcy5vayA9PT0gZmFsc2UpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYCR7cmVzLnN0YXR1c306ICR7cmVzLnN0YXR1c1RleHR9YCk7XG5cblx0XHRcdGxldCByZXN1bHQ6IGFueSA9IGF3YWl0IHJlcy5qc29uICgpO1xuXG5cdFx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdFx0fVxuXHRcdGNhdGNoIChleClcblx0XHR7XG5cdFx0XHRyZXR1cm4gKEpTT04uc3RyaW5naWZ5ICh7IFwiZXJyb3JcIjogYCR7ZXgubWVzc2FnZX0gLSBDb3VsZCBub3QgZmV0Y2ggJHt1cmx9YCB9KSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2UgYSBIVFRQIHJlcXVlc3QuIFRoaXMgaXMgYmFzaWNhbGx5IGp1c3QgYSB3cmFwcGVyIGZvciBmZXRjaCB0aGF0IGNhbiBhbHNvIHVwbG9hZCBmaWxlcy5cblx0ICogXG5cdCAqIEBleGFtcGxlXG5cdCAqIEhUVFAgSlNPTiBQT1NUXG5cdCAqIGBgYHRzXG5cdCAqIGF3YWl0IEhvdC5odHRwUmVxdWVzdCAoJ2h0dHA6Ly9vdGhlci1ob3RzdGFxLWFwaS5jb20vdjEvaGVsbG9fd29ybGQvZWNobycsIHsgbWVzc2FnZTogXCJIZWxsbyFcIiB9KTtcblx0ICogYGBgXG5cdCAqIFxuXHQgKiBAZXhhbXBsZVxuXHQgKiBVcGxvYWQgZmlsZSB1c2luZyBIVFRQIFBPU1Rcblx0ICogYGBgdHNcblx0ICogbGV0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKFwiZmlsZUlucHV0XCIpO1xuXHQgKiBsZXQgZmlsZSA9IGlucHV0LmZpbGVzWzBdO1xuXHQgKiBcblx0ICogYXdhaXQgSG90Lmh0dHBSZXF1ZXN0ICgnaHR0cDovL290aGVyLWhvdHN0YXEtYXBpLmNvbS92MS9oZWxsb193b3JsZC9lY2hvJywgXG5cdCAqIFx0XHR7IG1lc3NhZ2U6IFwiSGVsbG8hXCIgfSwgSG90RXZlbnRNZXRob2QuUE9TVCwgXG5cdCAqIFx0XHR7XG5cdCAqIFx0XHRcdFwiaW5kZXhGaWxlS2V5XCI6IGZpbGVcblx0ICogXHRcdH0pO1xuXHQgKiBgYGBcblx0ICovXG5cdHN0YXRpYyBhc3luYyBodHRwUmVxdWVzdCAodXJsOiBzdHJpbmcsIGRhdGE6IGFueSwgaHR0cE1ldGhvZDogSG90RXZlbnRNZXRob2QgPSBIb3RFdmVudE1ldGhvZC5QT1NULCBcblx0XHRmaWxlczogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gPSB7fSwgYmVhcmVyVG9rZW46IHN0cmluZyA9IFwiXCIpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGNvbnN0IG51bUZpbGVzOiBudW1iZXIgPSBPYmplY3Qua2V5cyAoZmlsZXMpLmxlbmd0aDtcblx0XHRsZXQgaHR0cE1ldGhvZExvd2VyOiBzdHJpbmcgPSBodHRwTWV0aG9kLnRvTG93ZXJDYXNlICgpO1xuXG5cdFx0aWYgKGh0dHBNZXRob2QgPT09IEhvdEV2ZW50TWV0aG9kLkZJTEVfVVBMT0FEKVxuXHRcdFx0aHR0cE1ldGhvZExvd2VyID0gXCJwb3N0XCI7XG5cblx0XHRsZXQgdXBsb2FkRmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuXHRcdGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTtcblxuXHRcdGlmIChudW1GaWxlcyA+IDApXG5cdFx0e1xuXHRcdFx0aWYgKGh0dHBNZXRob2RMb3dlciAhPT0gXCJwb3N0XCIpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRvIHVwbG9hZCBmaWxlcywgeW91IG11c3Qgc2V0IHRoZSBodHRwTWV0aG9kIHRvIFBPU1QuYCk7XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBmaWxlcylcblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgZmlsZSA9IGZpbGVzW2tleV07XG5cblx0XHRcdFx0aWYgKGZpbGUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZvcm1EYXRhLmFwcGVuZCAoa2V5LCBmaWxlKTtcblx0XHRcdFx0XHR1cGxvYWRGaWxlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh1cGxvYWRGaWxlID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGxldCByZXF1ZXN0SW5pdDogUmVxdWVzdEluaXQgPSB7XG5cdFx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFx0XHRcIkhvdFN0YXFVcGxvYWRcIjogXCJ0cnVlXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRib2R5OiBmb3JtRGF0YVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRpZiAoYmVhcmVyVG9rZW4gIT0gXCJcIilcblx0XHRcdHtcblx0XHRcdFx0cmVxdWVzdEluaXQuaGVhZGVycyA9IHtcblx0XHRcdFx0XHRcIkF1dGhvcml6YXRpb25cIjogYEJlYXJlciAke2JlYXJlclRva2VufWBcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0bGV0IHJlcyA9IGF3YWl0IGZldGNoICh1cmwsIHJlcXVlc3RJbml0KTtcblx0XHRcdGxldCBqc29uUmVzOiBhbnkgPSBhd2FpdCByZXMuanNvbiAoKTtcblxuXHRcdFx0aWYgKGRhdGFbXCJob3RzdGFxXCJdID09IG51bGwpXG5cdFx0XHRcdGRhdGFbXCJob3RzdGFxXCJdID0ge307XG5cblx0XHRcdGlmIChkYXRhW1wiaG90c3RhcVwiXVtcInVwbG9hZHNcIl0gPT0gbnVsbClcblx0XHRcdFx0ZGF0YVtcImhvdHN0YXFcIl1bXCJ1cGxvYWRzXCJdID0ge307XG5cblx0XHRcdGRhdGFbXCJob3RzdGFxXCJdW1widXBsb2Fkc1wiXVtcInVwbG9hZElkXCJdID0gXG5cdFx0XHRcdFx0anNvblJlc1tcImhvdHN0YXFcIl1bXCJ1cGxvYWRzXCJdW1widXBsb2FkSWRcIl07XG5cblx0XHRcdC8vIEFmdGVyIHRoZSB1cGxvYWQsIG1ha2UgdGhlIGFjdHVhbCBKU09OIGNhbGwuIERvIG5vdCBwYXNzIGZpbGVzIGFnYWluLlxuXHRcdFx0Y29uc3QgcmVzdWx0OiBhbnkgPSBhd2FpdCBIb3QuaHR0cFJlcXVlc3QgKHVybCwgZGF0YSwgSG90RXZlbnRNZXRob2QuUE9TVCwge30sIGJlYXJlclRva2VuKTtcblxuXHRcdFx0cmV0dXJuIChyZXN1bHQpO1xuXHRcdH1cblxuXHRcdGxldCBmZXRjaE9iajogYW55ID0ge1xuXHRcdFx0XHRtZXRob2Q6IGh0dHBNZXRob2RMb3dlcixcblx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdFx0XCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoYmVhcmVyVG9rZW4gIT0gXCJcIilcblx0XHRcdGZldGNoT2JqLmhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdID0gYEJlYXJlciAke2JlYXJlclRva2VufWA7XG5cblx0XHRpZiAoKGh0dHBNZXRob2RMb3dlciAhPT0gXCJnZXRcIikgJiYgXG5cdFx0XHQoaHR0cE1ldGhvZExvd2VyICE9PSBcImhlYWRcIikpXG5cdFx0e1xuXHRcdFx0ZmV0Y2hPYmpbXCJib2R5XCJdID0gSlNPTi5zdHJpbmdpZnkgKGRhdGEpO1xuXHRcdH1cblxuXHRcdGxldCBwcm9taXNlID0gbmV3IFByb21pc2UgKChyZXNvbHZlLCByZWplY3QpID0+IFxuXHRcdFx0e1xuXHRcdFx0XHRmZXRjaCAodXJsLCBmZXRjaE9iaikudGhlbiAoYXN5bmMgKHJlcykgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXMuanNvbiAoKS50aGVuICgoanNvbk9iajogYW55KSA9PlxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSAoanNvbk9iaik7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaCAoKHJlYXNvbjogYW55KSA9PlxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgJHt1cmx9OiAke3JlYXNvbi5tZXNzYWdlfWApO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCAoKHJlYXNvbjogYW55KSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYCR7dXJsfTogJHtyZWFzb24ubWVzc2FnZX1gKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIChwcm9taXNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFY2hvIG91dCBzb21lIG91dHB1dC5cblx0ICovXG5cdHN0YXRpYyBlY2hvIChtZXNzYWdlOiBzdHJpbmcpOiB2b2lkXG5cdHtcblx0XHRIb3QuT3V0cHV0ICs9IG1lc3NhZ2U7XG5cdH1cblxuXHQvKipcblx0ICogRWNobyBvdXQgdGhlIENTUyBmb3IgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgZGlzcGxheUNTUyAoKTogdm9pZFxuXHR7XG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBIb3QuQ1NTLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBjc3NGaWxlOiBzdHJpbmcgPSBIb3QuQ1NTW2lJZHhdO1xuXHRcdFx0bGV0IGNzc091dDogc3RyaW5nID0gSG90LmNzc1N0cjtcblxuXHRcdFx0Y3NzT3V0ID0gY3NzT3V0LnJlcGxhY2UgKC9cXCVDU1NfRklMRVxcJS9nLCBjc3NGaWxlKTtcblxuXHRcdFx0SG90LmVjaG8gKGNzc091dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEVjaG8gb3V0IHRoZSBKUyBmaWxlcyBmb3IgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgZGlzcGxheUpTRmlsZXMgKCk6IHZvaWRcblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgSG90LkpTRmlsZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGpzRmlsZTogc3RyaW5nID0gSG90LkpTRmlsZXNbaUlkeF07XG5cdFx0XHRsZXQganNGaWxlT3V0OiBzdHJpbmcgPSBIb3QuanNGaWxlU3RyO1xuXG5cdFx0XHRqc0ZpbGVPdXQgPSBqc0ZpbGVPdXQucmVwbGFjZSAoL1xcJUpTX0ZJTEVcXCUvZywganNGaWxlKTtcblxuXHRcdFx0SG90LmVjaG8gKGpzRmlsZU91dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEVjaG8gb3V0IHRoZSBKUyBzY3JpcHRzIGZvciB0aGUgY3VycmVudCBwYWdlIGJlaW5nIGdlbmVyYXRlZC5cblx0ICovXG5cdHN0YXRpYyBkaXNwbGF5SlNTY3JpcHRzICgpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IEhvdC5KU1NjcmlwdHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGpzU2NyaXB0OiBzdHJpbmcgPSBIb3QuSlNTY3JpcHRzW2lJZHhdO1xuXHRcdFx0bGV0IGpzU2NyaXB0T3V0OiBzdHJpbmcgPSBIb3QuanNTY3JpcHRzU3RyO1xuXG5cdFx0XHRqc1NjcmlwdE91dCA9IGpzU2NyaXB0T3V0LnJlcGxhY2UgKC9cXCVKU19DT0RFXFwlL2csIGpzU2NyaXB0KTtcblxuXHRcdFx0SG90LmVjaG8gKGpzU2NyaXB0T3V0KTtcblx0XHR9XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90RXZlbnRNZXRob2QsIEhvdFJvdXRlTWV0aG9kLCBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24gfSBmcm9tIFwiLi9Ib3RSb3V0ZU1ldGhvZFwiO1xuaW1wb3J0IHsgSG90REIgfSBmcm9tIFwiLi9Ib3REQlwiO1xuXG5pbXBvcnQgeyBIb3REQlNjaGVtYSB9IGZyb20gXCIuL3NjaGVtYXMvSG90REJTY2hlbWFcIjtcbmltcG9ydCB7IEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuXG4vKipcbiAqIFRoZSBBUEkgdG8gbG9hZC5cbiAqL1xuZXhwb3J0IHR5cGUgQVBJdG9Mb2FkID0ge1xuXHQvKipcblx0ICogVGhlIGltcG9ydGVkIGNsYXNzIHRvIGxvYWQuXG5cdCAqL1xuXHRpbXBvcnRlZEFQSUNsYXNzOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgZXhwb3J0ZWQgY2xhc3MgbmFtZSB0byBpbXBvcnQgYW5kIGluc3RhbnRpYXRlLlxuXHQgKi9cblx0ZXhwb3J0ZWRDbGFzc05hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXRoIHRvIHRoZSBIb3RBUEkgY2xhc3MgdG8gbG9hZC5cblx0ICovXG5cdHBhdGg6IHN0cmluZztcbiB9O1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIG9iamVjdCB0byB1c2UgZHVyaW5nIGV2ZW50IGV4ZWN1dGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIEV2ZW50RXhlY3V0aW9uVHlwZVxue1xuXHRIb3RSb3V0ZSxcblx0SG90TWV0aG9kLFxuXHRIb3RBUElcbn1cblxuLyoqXG4gKiBUaGUgQVBJIHRvIHVzZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEhvdEFQSVxue1xuXHQvKipcblx0ICogVGhlIHNlcnZlciBjb25uZWN0aW9uLlxuXHQgKi9cblx0Y29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50O1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBBUEkuXG5cdCAqL1xuXHRkZXNjcmlwdGlvbjogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIHRvIHByb3ZpZGUgdG8gdGhlIEFQSS5cblx0ICovXG5cdGJlYXJlclRva2VuOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYmFzZSB1cmwgZm9yIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRiYXNlVXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBJZiBzZXQsIHRoaXMgd2lsbCBjcmVhdGUgdGhlIHJvdXRlIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGZvciBcblx0ICogZWFzeSBjbGllbnQvc2VydmVyIGNhbGxpbmcuXG5cdCAqL1xuXHRjcmVhdGVGdW5jdGlvbnM6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cblx0ICovXG5cdGV4ZWN1dGVFdmVudHNVc2luZzogRXZlbnRFeGVjdXRpb25UeXBlO1xuXHQvKipcblx0ICogVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRkYjogSG90REI7XG5cdC8qKlxuXHQgKiBBZGRpdGlvbmFsIE9wZW5BUEkgZG9jdW1lbnRhdGlvbiB0byBiZSBhZGRlZC4gQW55dGhpbmcgYWRkZWQgaGVyZSBcblx0ICogd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgT3BlbkFQSSBkb2N1bWVudGF0aW9uIGFzIGEgSlNPTiBvYmplY3QuXG5cdCAqL1xuXHRvcGVuQVBJOiB7XG5cdFx0aW5mbz86IGFueTtcblx0XHRzZWN1cml0eT86IGFueTtcblx0XHR0YWdzPzogYW55O1xuXHRcdGNvbXBvbmVudHM/OiBhbnk7XG5cdFx0LyoqXG5cdFx0ICogQW55IGV4dHJhIGluZm9ybWF0aW9uIHRvIGFkZCB0byB0aGUgT3BlbkFQSSBkb2N1bWVudGF0aW9uLlxuXHRcdCAqL1xuXHRcdGV4dHJhPzogYW55O1xuXHR9O1xuXHQvKipcblx0ICogVGhlIGZ1bmN0aW9uIHVzZWQgZm9yIHVzZXIgYXV0aGVudGljYXRpb24uXG5cdCAqL1xuXHR1c2VyQXV0aDogU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRyb3V0ZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFJvdXRlIH07XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRoZSBBUEkgaXMgYWJvdXQgdG8gc3RhcnQgcmVnaXN0ZXJpbmcgcm91dGVzLiBJZiBcblx0ICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgc2VydmVyIHdpbGwgbm90IHN0YXJ0LlxuXHQgKi9cblx0b25QcmVSZWdpc3RlcjogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhlIEFQSSBoYXMgZmluaXNoZWQgcmVnaXN0ZXJpbmcgcm91dGVzLiBJZiBcblx0ICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgc2VydmVyIHdpbGwgbm90IHN0YXJ0LlxuXHQgKi9cblx0b25Qb3N0UmVnaXN0ZXI6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cblx0Y29uc3RydWN0b3IgKGJhc2VVcmw6IHN0cmluZywgY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50LCBkYjogSG90REIgPSBudWxsKVxuXHR7XG5cdFx0aWYgKGNvbm5lY3Rpb24gPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIHNlcnZlciBhdHRhY2hlZCB0byBhcGkgd2l0aCBiYXNlVXJsOiAke2Jhc2VVcmx9YCk7XG5cblx0XHR0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24gPSBcIlwiO1xuXHRcdHRoaXMuYmVhcmVyVG9rZW4gPSBcIlwiO1xuXHRcdHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG5cdFx0dGhpcy5jcmVhdGVGdW5jdGlvbnMgPSB0cnVlO1xuXHRcdHRoaXMuZXhlY3V0ZUV2ZW50c1VzaW5nID0gRXZlbnRFeGVjdXRpb25UeXBlLkhvdFJvdXRlO1xuXHRcdHRoaXMuZGIgPSBkYjtcblx0XHR0aGlzLm9wZW5BUEkgPSB7fTtcblx0XHR0aGlzLnVzZXJBdXRoID0gbnVsbDtcblx0XHR0aGlzLnJvdXRlcyA9IHt9O1xuXHRcdHRoaXMub25QcmVSZWdpc3RlciA9IG51bGw7XG5cdFx0dGhpcy5vblBvc3RSZWdpc3RlciA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSBkYXRhYmFzZSBzY2hlbWEgZm9yIHVzZS5cblx0ICovXG5cdHNldERCU2NoZW1hIChzY2hlbWE6IEhvdERCU2NoZW1hKTogdm9pZFxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5hcGkgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIEFQSSBoYXMgYmVlbiBzZXQhYCk7XG5cblx0XHRpZiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYiA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTm8gZGF0YWJhc2UgaGFzIGJlZW4gc2V0IGZvciBBUEkgYmFzZSB1cmwgJHt0aGlzLmNvbm5lY3Rpb24uYXBpLmJhc2VVcmx9YCk7XG5cblx0XHR0aGlzLmNvbm5lY3Rpb24uYXBpLmRiLnNjaGVtYSA9IHNjaGVtYTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGRhdGFiYXNlIGJlaW5nIHVzZWQuXG5cdCAqL1xuXHRnZXREQiAoKTogSG90REJcblx0e1xuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBkYXRhYmFzZSBoYXMgYmVlbiBzZXQgZm9yIEFQSSBiYXNlIHVybCAke3RoaXMuY29ubmVjdGlvbi5hcGkuYmFzZVVybH1gKTtcblxuXHRcdHJldHVybiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYik7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBkYXRhYmFzZSBzY2hlbWEgYmVpbmcgdXNlZC5cblx0ICovXG5cdGdldERCU2NoZW1hICgpOiBIb3REQlNjaGVtYVxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5hcGkuZGIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIGRhdGFiYXNlIGhhcyBiZWVuIHNldCBmb3IgQVBJIGJhc2UgdXJsICR7dGhpcy5jb25uZWN0aW9uLmFwaS5iYXNlVXJsfWApO1xuXG5cdFx0cmV0dXJuICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiLnNjaGVtYSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgcm91dGUuIElmIHRoaXMuY3JlYXRlRnVuY3Rpb25zIGlzIHNldCB0byB0cnVlICh3aGljaCBpcyBkZWZhdWx0KSwgdGhpcyB3aWxsIHRha2UgdGhlIGluY29taW5nIFxuXHQgKiByb3V0ZSBhbmQgY3JlYXRlIGFuIG9iamVjdCBpbiB0aGlzIEhvdEFQSSBvYmplY3QgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIHJvdXRlLiBJZiB0aGVyZSdzIFxuXHQgKiBhbnkgSG90Um91dGVNZXRob2RzIGluc2lkZSBvZiB0aGUgaW5jb21pbmcgSG90Um91dGUsIGl0IHdpbGwgY3JlYXRlIHRoZSBtZXRob2RzIFxuXHQgKiBhbmQgYXR0YWNoIHRoZW0gdG8gdGhlIG5ld2x5IGNyZWF0ZWQgSG90Um91dGUgb2JqZWN0LlxuXHQgKiBcblx0ICogQGV4YW1wbGVcblx0ICogYGBgdHNcblx0ICogaW1wb3J0IHsgSG90QVBJLCBIb3RSb3V0ZSB9IGZyb20gXCJob3RzdGFxXCI7XG5cdCAqIFxuXHQgKiBjbGFzcyBBcHBBUEkgZXh0ZW5kcyBIb3RBUElcblx0ICoge1xuXHQgKiBcdFx0Y29uc3RydWN0b3IgKGJhc2VVcmw6IHN0cmluZywgY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50ID0gbnVsbCwgZGI6IGFueSA9IG51bGwpXG5cdCAqIFx0XHR7XG5cdCAqIFx0XHRcdHN1cGVyKGJhc2VVcmwsIGNvbm5lY3Rpb24sIGRiKTtcblx0ICogXG5cdCAqIFx0XHRcdC8vIENyZWF0ZXMgdGhlIHJvdXRlIGh0dHA6Ly8xMjcuMC4wLjE6ODA4MC92MS9oZWxsb193b3JsZC9cblx0ICogXHRcdFx0dGhpcy5hZGRSb3V0ZSAobmV3IEV4YW1wbGVSb3V0ZSAodGhpcykpO1xuXHQgKiBcdFx0fVxuXHQgKiB9XG5cdCAqIFxuXHQgKiBjbGFzcyBFeGFtcGxlUm91dGUgZXh0ZW5kcyBIb3RSb3V0ZVxuXHQgKiB7XG5cdCAqIFx0XHRjb25zdHJ1Y3RvciAoYXBpOiBBcHBBUEkpXG5cdCAqIFx0XHR7XG5cdCAqIFx0XHRcdHN1cGVyIChhcGkuY29ubmVjdGlvbiwgXCJoZWxsb193b3JsZFwiKTtcblx0ICogXG5cdCAqIFx0XHRcdC8vIENyZWF0ZXMgdGhlIEhUVFAgR0VUIGVuZHBvaW50OiBodHRwOi8vMTI3LjAuMC4xOjgwODAvdjEvaGVsbG9fd29ybGQvaGlcblx0ICogXHRcdFx0Ly8gV2hlbiB0aGlzIGVuZHBvaW50IGlzIGFjY2Vzc2VkLCB0aGUgSlNPTiByZXNwb25zZSB3aWxsIHJldHVybiBcImhlbGxvXCJcblx0ICogXHRcdFx0dGhpcy5hZGRNZXRob2QgKFwiaGlcIiwgYXN5bmMgKCkgPT5cblx0ICogXHRcdFx0e1xuXHQgKiBcdFx0XHRcdHJldHVybiAoXCJoZWxsb1wiKTtcblx0ICogXHRcdFx0fSk7XG5cdCAqIFx0XHR9XG5cdCAqIH1cblx0ICogYGBgXG5cdCAqIFxuXHQgKiBJbiB0aGUgY2xpZW50IGJyb3dzZXIsIHRoaXMgd291bGQgYmUgdXNlZCBsaWtlIHNvOlxuXHQgKiBgYGBcblx0ICogYXdhaXQgSG90LkFQSS5oZWxsb193b3JsZC5oaSAoKTtcblx0ICogYGBgXG5cdCAqIFxuXHQgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRvIGFkZC4gQ2FuIGJlIGVpdGhlciBhIGZ1bGwgSG90Um91dGUgb2JqZWN0LCBvciBqdXN0IFxuXHQgKiB0aGUgcm91dGUncyBuYW1lLiBJZiBhIEhvdFJvdXRlIG9iamVjdCBpcyBzdXBwbGllZCwgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtZXRlcnMgXG5cdCAqIHdpbGwgYmUgaWdub3JlZC5cblx0ICogQHBhcmFtIHJvdXRlTWV0aG9kIFRoZSByb3V0ZSdzIG1ldGhvZCB0byBhZGQuIElmIHRoZSByb3V0ZSBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcsIFxuXHQgKiBpdCB3aWxsIGJlIGludGVycHJldGVkIGFzIHRoZSByb3V0ZSdzIG5hbWUsIGFuZCB0aGlzIHdpbGwgYmUgdGhlIG1ldGhvZCBhZGRlZCB0byBcblx0ICogdGhlIG5ldyByb3V0ZS5cblx0ICogQHBhcmFtIGV4ZWN1dGVGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHJvdXRlTWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgQVBJLlxuXHQgKi9cblx0YWRkUm91dGUgKFxuXHRcdHJvdXRlOiBIb3RSb3V0ZSB8IHN0cmluZyxcblx0XHRyb3V0ZU1ldGhvZDogSG90Um91dGVNZXRob2QgfCBzdHJpbmcgPSBudWxsLFxuXHRcdGV4ZWN1dGVGdW5jdGlvbjogKHJlcTogYW55LCByZXM6IGFueSwgYXV0aG9yaXplZFZhbHVlOiBhbnksIGpzb25PYmo6IGFueSwgcXVlcnlPYmo6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gbnVsbFxuXHRcdCk6IHZvaWRcblx0e1xuXHRcdGxldCByb3V0ZU5hbWU6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAodHlwZW9mIChyb3V0ZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0cm91dGVOYW1lID0gcm91dGU7XG5cblx0XHRcdGlmICh0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdID09IG51bGwpXG5cdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0gPSBuZXcgSG90Um91dGUgKHRoaXMuY29ubmVjdGlvbiwgcm91dGVOYW1lKTtcblxuXHRcdFx0aWYgKHR5cGVvZiAocm91dGVNZXRob2QpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLmFkZE1ldGhvZCAoSG90Um91dGVNZXRob2QuY3JlYXRlIChcblx0XHRcdFx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLCByb3V0ZU1ldGhvZCwgZXhlY3V0ZUZ1bmN0aW9uKSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0uYWRkTWV0aG9kIChyb3V0ZU1ldGhvZCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRyb3V0ZU5hbWUgPSByb3V0ZS5yb3V0ZTtcblx0XHRcdHRoaXMucm91dGVzW3JvdXRlLnJvdXRlXSA9IHJvdXRlO1xuXHRcdH1cblxuXHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0uY29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbjtcblxuXHRcdC8vIENyZWF0ZSB0aGUgcm91dGUgZnVuY3Rpb25zIGZvciB0aGUgc2VydmVyL2NsaWVudC4gVGhpcyBtdXN0IGFsc28gYmUgZG9uZSBhZnRlciB0aGUgcm91dGUncyBvblByZVJlZ2lzdGVyIGhhcyBiZWVuIGNhbGxlZC5cblx0XHRpZiAodGhpcy5jcmVhdGVGdW5jdGlvbnMgPT09IHRydWUpXG5cdFx0XHR0aGlzLmNyZWF0ZUFQSVJvdXRlTWV0aG9kcyAocm91dGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIEFQSSByb3V0ZSBtZXRob2RzIGZvciB1c2UgaW4gYXBpLm15X3JvdXRlLm15X21ldGhvZCAoKS5cblx0ICovXG5cdGNyZWF0ZUFQSVJvdXRlTWV0aG9kcyAocm91dGVOYW1lOiBzdHJpbmcpOiB2b2lkXG5cdHtcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0bGV0IG5ld1JvdXRlOiB7IFtuYW1lOiBzdHJpbmddOiBGdW5jdGlvbiB9ID0gdGhpc1tyb3V0ZU5hbWVdO1xuXG5cdFx0aWYgKG5ld1JvdXRlID09IG51bGwpXG5cdFx0XHRuZXdSb3V0ZSA9IHt9O1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLm1ldGhvZHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGN1cnJlbnRSb3V0ZTogSG90Um91dGUgPSB0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdO1xuXHRcdFx0bGV0IG5ld1JvdXRlTWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IHRoaXMucm91dGVzW3JvdXRlTmFtZV0ubWV0aG9kc1tpSWR4XTtcblxuXHRcdFx0Lypcblx0XHRcdC8vLyBAZml4bWUgSXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyBBIEhUVFAgY2FsbCBpcyBtdWNoIG1vcmUgcHJlZmVyYWJsZSwgXG5cdFx0XHQvLy8gZXNwZWNpYWxseSBmb3IgYWNjcnVhdGUgdGVzdGluZy5cblx0XHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIb3RTZXJ2ZXIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChuZXdSb3V0ZU1ldGhvZC5vblNlcnZlckV4ZWN1dGUgIT0gbnVsbClcblx0XHRcdFx0XHRuZXdSb3V0ZVtuZXdSb3V0ZU1ldGhvZC5uYW1lXSA9IG5ld1JvdXRlTWV0aG9kLm9uU2VydmVyRXhlY3V0ZTtcblx0XHRcdH1cblx0XHRcdGVsc2UqL1xuXHRcdFx0e1xuXHRcdFx0XHQvKlxuXHRcdFx0XHQvLy8gQGZpeG1lIElzIG9uQ2xpZW50RXhlY3V0ZSBuZWNlc3Nhcnk/IEknbSB0aGlua2luZyB0aGUgZGV2IGNhbiBqdXN0IHNpbXBseSBjcmVhdGUgXG5cdFx0XHRcdC8vLyB0aGVpciBvd24gZnVuY3Rpb24gdG8gY2FsbC5cblx0XHRcdFx0aWYgKG5ld1JvdXRlTWV0aG9kLm9uQ2xpZW50RXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdG5ld1JvdXRlW25ld1JvdXRlTWV0aG9kLm5hbWVdID0gbmV3Um91dGVNZXRob2Qub25DbGllbnRFeGVjdXRlO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHsqL1xuXHRcdFx0XHRcdG5ld1JvdXRlW25ld1JvdXRlTWV0aG9kLm5hbWVdID0gKGRhdGE6IGFueSwgZmlsZXM6IGFueSk6IGFueSA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgaHR0cE1ldGhvZDogc3RyaW5nID0gbmV3Um91dGVNZXRob2QudHlwZTtcblx0XHRcdFx0XHRcdFx0Ly8gQ29uc3RydWN0IHRoZSB1cmwgaGVyZS4gQmFzZSArIHJvdXRlICsgcm91dGUgbWV0aG9kXG5cdFx0XHRcdFx0XHRcdGxldCByb3V0ZVN0cjogc3RyaW5nID0gbmV3Um91dGVNZXRob2QuZ2V0Um91dGVVcmwgKCk7XG5cdFx0XHRcdFx0XHRcdGxldCBhcmdzOiBhbnlbXSA9IFtyb3V0ZVN0ciwgZGF0YSwgaHR0cE1ldGhvZCwgZmlsZXMsIHRoaXMuYmVhcmVyVG9rZW5dO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAodGhpcy5tYWtlQ2FsbC5hcHBseSAodGhpcywgYXJncykpO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0Ly99XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHRoaXNbcm91dGVOYW1lXSA9IG5ld1JvdXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGEgcm91dGUgd2l0aCB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgcmVnaXN0ZXJSb3V0ZSAocm91dGU6IEhvdFJvdXRlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbiBpbnN0YW5jZW9mIEhvdFNlcnZlcilcblx0XHRcdGF3YWl0IHRoaXMuY29ubmVjdGlvbi5yZWdpc3RlclJvdXRlIChyb3V0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXIgYWxsIHJvdXRlcyB3aXRoIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRhc3luYyByZWdpc3RlclJvdXRlcyAoKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Zm9yIChsZXQga2V5IGluIHRoaXMucm91dGVzKVxuXHRcdHtcblx0XHRcdGxldCByb3V0ZTogSG90Um91dGUgPSB0aGlzLnJvdXRlc1trZXldO1xuXG5cdFx0XHRhd2FpdCB0aGlzLnJlZ2lzdGVyUm91dGUgKHJvdXRlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIGNhbGwgdG8gdGhlIEFQSS5cblx0ICovXG5cdGFzeW5jIG1ha2VDYWxsIChyb3V0ZTogc3RyaW5nLCBkYXRhOiBhbnksIGh0dHBNZXRob2Q6IEhvdEV2ZW50TWV0aG9kID0gSG90RXZlbnRNZXRob2QuUE9TVCwgXG5cdFx0ZmlsZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge30sIGJlYXJlclRva2VuOiBzdHJpbmcgPSBcIlwiKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJhc2VVcmw7XG5cblx0XHRjb25zdCBodHRwTWV0aG9kU3RyOiBzdHJpbmcgPSBodHRwTWV0aG9kLnRvVXBwZXJDYXNlICgpO1xuXG5cdFx0aWYgKHVybFsodXJsLmxlbmd0aCAtIDEpXSA9PT0gXCIvXCIpXG5cdFx0XHR1cmwgPSB1cmwuc3Vic3RyICgwLCAodXJsLmxlbmd0aCAtIDEpKTtcblxuXHRcdGlmIChyb3V0ZVswXSAhPT0gXCIvXCIpXG5cdFx0XHR1cmwgKz0gXCIvXCI7XG5cblx0XHR1cmwgKz0gcm91dGU7XG5cblx0XHRyZXR1cm4gKEhvdC5odHRwUmVxdWVzdCAodXJsLCBkYXRhLCBodHRwTWV0aG9kLCBmaWxlcywgYmVhcmVyVG9rZW4pKTtcblx0fVxufVxuIiwiLyoqXG4gKiBBbiBhc3NldCB0byBsb2FkLlxuICovXG5leHBvcnQgY2xhc3MgSG90QXNzZXRcbntcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIGFzc2V0LiBDYW4gYmU6XG5cdCAqICoganNcblx0ICogKiBjc3Ncblx0ICogKiBodG1sXG5cdCAqICogY29tcG9uZW50XG5cdCAqL1xuXHR0eXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgYXNzZXQgdG8gbG9hZC5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byB0aGUgYXNzZXRzIHRvIGxvYWQuXG5cdCAqL1xuXHRwYXRoPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHByZWxvYWRlZCBjb250ZW50IHRvIGxvYWQuIFJlcXVpcmVzIG5hbWUgdG8gYmUgc2V0LlxuXHQgKi9cblx0Y29udGVudD86IHN0cmluZztcblxuXHRjb25zdHJ1Y3RvciAodHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSBcIlwiKVxuXHR7XG5cdFx0dGhpcy50eXBlID0gdHlwZTtcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMucGF0aCA9IFwiXCI7XG5cdFx0dGhpcy5jb250ZW50ID0gXCJcIjtcblx0fVxuXG5cdGxvYWQgKCk6IHZvaWRcblx0e1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgdGhlIGFzc2V0LlxuXHQgKi9cblx0b3V0cHV0ICgpOiBzdHJpbmcgfCB7IG5hbWU6IHN0cmluZzsgdXJsPzogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nOyB9XG5cdHtcblx0XHRpZiAoKHRoaXMucGF0aCA9PSBudWxsKSAmJiAodGhpcy5jb250ZW50ID09IG51bGwpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90QXNzZXQgJHt0aGlzLm5hbWV9IG9mIHR5cGUgJHt0aGlzLnR5cGV9IGRvZXMgbm90IGhhdmUgYSBwYXRoIG9yIGNvbnRlbnQgc2V0IWApO1xuXG5cdFx0bGV0IG91dHB1dDogc3RyaW5nIHwgeyBuYW1lOiBzdHJpbmc7IHVybD86IHN0cmluZzsgY29udGVudD86IHN0cmluZzsgfSA9IFwiXCI7XG5cblx0XHRpZiAodGhpcy5wYXRoICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMucGF0aCAhPT0gXCJcIilcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRoaXMudHlwZSA9PT0gXCJqc1wiKVxuXHRcdFx0XHRcdG91dHB1dCA9IGA8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiIHNyYyA9IFwiJHt0aGlzLnBhdGh9XCI+PC9zY3JpcHQ+YDtcblxuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcImNzc1wiKVxuXHRcdFx0XHRcdG91dHB1dCA9IGA8bGluayBocmVmID0gXCIke3RoaXMucGF0aH1cIiByZWwgPSBcInN0eWxlc2hlZXRcIiAvPmA7XG5cblx0XHRcdFx0aWYgKCh0aGlzLnR5cGUgPT09IFwiaHRtbFwiKSB8fCBcblx0XHRcdFx0XHQodGhpcy50eXBlID09PSBcImNvbXBvbmVudFwiKSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLm5hbWUgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBMb2FkaW5nIGFuIEhUTUwgb3IgY29tcG9uZW50IGFzc2V0IHJlcXVpcmVzIGEgbmFtZSB0byBiZSBzZXQhYCk7XG5cblx0XHRcdFx0XHRsZXQgZmlsZVVybDogc3RyaW5nID0gYFwiJHt0aGlzLnBhdGh9XCJgO1xuXHRcdFx0XHRcdG91dHB1dCA9IHsgbmFtZTogdGhpcy5uYW1lLCB1cmw6IHRoaXMucGF0aCB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY29udGVudCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLmNvbnRlbnQgIT09IFwiXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLnR5cGUgPT09IFwianNcIilcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBMb2FkaW5nIEpTIGFzc2V0cyB1c2luZyBjb250ZW50IGlzIG5vdCBzdXBwb3J0ZWQgeWV0IWApO1xuXG5cdFx0XHRcdGlmICh0aGlzLnR5cGUgPT09IFwiY3NzXCIpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTG9hZGluZyBDU1MgYXNzZXRzIHVzaW5nIGNvbnRlbnQgaXMgbm90IHN1cHBvcnRlZCB5ZXQhYCk7XG5cblx0XHRcdFx0aWYgKHRoaXMudHlwZSA9PT0gXCJodG1sXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5uYW1lID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTG9hZGluZyBhbiBIVE1MIGFzc2V0IHJlcXVpcmVzIGEgbmFtZSB0byBiZSBzZXQhYCk7XG5cblx0XHRcdFx0XHRsZXQgZXNjYXBlZENvbnRlbnQ6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5ICh0aGlzLmNvbnRlbnQpO1xuXHRcdFx0XHRcdGxldCBmaWxlVXJsOiBzdHJpbmcgPSB0aGlzLnBhdGg7XG5cdFx0XHRcdFx0bGV0IGZpbGVDb250ZW50OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0Ly8gRmluZCBhbnkgc2NyaXB0IHRhZ3MgYW5kIGludGVycnVwdCB0aGVtIHNvIHRoZSBIVE1MIHBhcnNlcnMgXG5cdFx0XHRcdFx0Ly8gZG9uJ3QgZ2V0IGNvbmZ1c2VkLlxuXHRcdFx0XHRcdGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSAobmV3IFJlZ0V4cCAoXCJcXFxcPHNjcmlwdFwiLCBcImdtaVwiKSwgXCI8c2NyXFxcIiArIFxcXCJpcHRcIik7XG5cdFx0XHRcdFx0ZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC5yZXBsYWNlIChuZXcgUmVnRXhwIChcIlxcXFw8XFxcXC9zY3JpcHRcIiwgXCJnbWlcIiksIFwiPC9zY3JcXFwiICsgXFxcImlwdFwiKTtcblxuXHRcdFx0XHRcdGZpbGVDb250ZW50ID0gZXNjYXBlZENvbnRlbnQ7XG5cblx0XHRcdFx0XHRvdXRwdXQgPSB7IG5hbWU6IHRoaXMubmFtZSwgdXJsOiBmaWxlVXJsLCBjb250ZW50OiBlc2NhcGVkQ29udGVudCB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90U2VydmVyVHlwZSB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgSG90TG9nIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5cbi8qKlxuICogQSBjbGllbnQgY29ubmVjdGVkIHRvIGEgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgSG90Q2xpZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBBUEkgdG8gdXNlLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIEFQSSB0byB1c2UuXG5cdCAqL1xuXHR0ZXN0ZXJBUEk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIHNlcnZlci5cblx0ICovXG5cdHR5cGU6IEhvdFNlcnZlclR5cGU7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cblx0Y29uc3RydWN0b3IgKHByb2Nlc3NvcjogSG90U3RhcSlcblx0e1xuXHRcdHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuXHRcdHRoaXMuYXBpID0gbnVsbDtcblx0XHR0aGlzLnRlc3RlckFQSSA9IG51bGw7XG5cdFx0dGhpcy50eXBlID0gSG90U2VydmVyVHlwZS5IVFRQO1xuXHRcdHRoaXMubG9nZ2VyID0gcHJvY2Vzc29yLmxvZ2dlcjtcblx0fVxufSIsImltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcblxuZXhwb3J0IGludGVyZmFjZSBIb3RDb21wb25lbnRPdXRwdXRcbntcblx0LyoqXG5cdCAqIFRoZSBIVE1MIHRvIG91dHB1dC5cblx0ICovXG5cdGh0bWw6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBxdWVyeSBzZWxlY3RvciB0byBhZGQgdGhpcyBjb21wb25lbnQncyBmdW5jdGlvbnMgdG8uXG5cdCAqIFxuXHQgKiBAZXhhbXBsZSAjb2JqZWN0SWRcblx0ICovXG5cdGFkZEZ1bmN0aW9uc1RvPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBsYWNlIGhlcmUgcGFyZW50IG5hbWUgdG8gYXR0YWNoIHRoaXMgaHRtbCB0by5cblx0ICogXG5cdCAqIEBleGFtcGxlIHRvcFxuXHQgKi9cblx0cGxhY2VIZXJlUGFyZW50Pzogc3RyaW5nO1xuXHQvKipcblx0ICogQXBwZW5kIHRoZSBvdXRwdXQgdG8gYW4gZXhpc3RpbmcgZWxlbWVudCB1c2luZyBhIENTUyBzZWxlY3RvciB0aGF0IGlzIFxuXHQgKiB0aGUgY2xvc2VzdC5cblx0ICogXG5cdCAqIEBleGFtcGxlIGRpdiAudGVzdENsYXNzXG5cdCAqL1xuXHRjbG9zZXN0U2VsZWN0b3I/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBBcHBlbmQgdGhlIG91dHB1dCB0byBhbiBleGlzdGluZyBlbGVtZW50IHNvbWV3aGVyZSBvbiB0aGUgZG9jdW1lbnQuXG5cdCAqIFxuXHQgKiBAZXhhbXBsZSBkaXYgLnRlc3RDbGFzc1xuXHQgKi9cblx0ZG9jdW1lbnRTZWxlY3Rvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGNvbXBvbmVudCB0byBwcmVwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RDb21wb25lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgSFRNTEVsZW1lbnRzLlxuXHQgKi9cblx0aHRtbEVsZW1lbnRzPzogSFRNTEVsZW1lbnRbXTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlLlxuXHQgKi9cblx0bmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0YWcuXG5cdCAqL1xuXHR0YWc/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29ubmVjdGVkIEFQSS5cblx0ICovXG5cdGFwaT86IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSBvcHRpb25zIHRvIGluY2x1ZGUgd2l0aCByZWdpc3RlcmluZyB0aGlzIGNvbXBvbmVudC5cblx0ICovXG5cdGVsZW1lbnRPcHRpb25zPzogRWxlbWVudERlZmluaXRpb25PcHRpb25zO1xuXHQvKipcblx0ICogQW55IGV4dHJhIGF0dHJpYnV0ZXMgdG8gcmVnaXN0ZXIuXG5cdCAqL1xuXHRvYnNlcnZlZEF0dHJpYnV0ZXM/OiBzdHJpbmdbXTtcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIGNvbXBvbmVudC5cblx0ICovXG5cdHR5cGU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdHZhbHVlPzogYW55O1xuXHQvKipcblx0ICogVGhlIGlubmVyIEhUTUwgb3IgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdGlubmVyOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgZXZlbnRzIHRvIHRyaWdnZXIuXG5cdCAqL1xuXHRldmVudHM/OiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXToge1xuXHRcdFx0XHR0eXBlOiBzdHJpbmc7XG5cdFx0XHRcdGZ1bmM6IEZ1bmN0aW9uO1xuXHRcdFx0XHRvcHRpb25zPzogYW55O1xuXHRcdFx0fVxuXHRcdH07XG5cdC8qKlxuXHQgKiBFeGVjdXRlIHByaW9yIHRvIG91dHB1dC5cblx0ICogXG5cdCAqIEByZXR1cm5zIElmIHNldCB0byBmYWxzZSwgdGhlIGNvbXBvbmVudCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25QcmVPdXRwdXQ/OiAoKSA9PiBib29sZWFuO1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciBnZXR0aW5nIHRoZSBvdXRwdXQsIGJ1dCBiZWZvcmUgdGhlIERPTSBwYXJzaW5nLlxuXHQgKiBcblx0ICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbXBvbmVudCB0byByZWdpc3Rlci4gQ2FuIGJlIG1hbmlwdWxhdGVkIG9uZSBsYXN0IHRpbWUgcHJpb3IgdG8gXG5cdCAqIGJlaW5nIHBhcnNlZCBpbnRvIGEgRE9NIGVsZW1lbnQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgZmluYWwgb3V0cHV0IHRvIGJlIHBhcnNlZCBhcyBhIERPTSBlbGVtZW50LlxuXHQgKi9cblx0b25Qb3N0T3V0cHV0PzogKG91dHB1dDogKHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdKSkgPT4gKHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdKTtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgd2hlbiBpdHMgdGltZSB0byBmaXggdGhlIEhUTUwgcHJpb3IgdG8gRE9NIHBhcnNpbmcuIFRoaXMgd2lsbCBza2lwIHRoZSBIb3RTdGFxIGRlZmF1bHQgZml4aW5nLlxuXHQgKi9cblx0b25GaXhIVE1MPzogKG91dHB1dDogc3RyaW5nKSA9PiB7IGZpeGVkU3RyOiBzdHJpbmcsIHF1ZXJ5U2VsZWN0b3I6IHN0cmluZzsgfTtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYSBjdXN0b20gRE9NIHBhcnNlci5cblx0ICovXG5cdG9uUGFyc2VET00/OiAob3V0cHV0OiBzdHJpbmcpID0+IERvY3VtZW50O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciB0aGUgb3V0cHV0IGhhcyBiZWVuIHBhcnNlZCBhbmQgaXMgcmVhZHkgdG8gYmUgcGxhY2VkIGludG8gdGhlIERPTS5cblx0ICovXG5cdG9uUGFyc2VkPzogKG91dHB1dDogc3RyaW5nKSA9PiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIHByaW9yIHRvIHBsYWNpbmcgdGhlIG5ldyBET00gZWxlbWVudC5cblx0ICovXG5cdG9uUHJlUGxhY2U/OiAoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBIVE1MRWxlbWVudDtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgcGxhY2luZyB0aGUgbmV3IERPTSBlbGVtZW50LiBDYW4gYmUgbWFuaXB1bGF0ZWQgb25lIGZpbmFsIHRpbWUgcHJpb3IgdG8gYmVpbmcgcmVuZGVyZWQuXG5cdCAqL1xuXHRvblBvc3RQbGFjZT86IChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gSFRNTEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIHBsYWNpbmcgdGhlIERPTSBlbGVtZW50IG9udG8gdGhlIG5ld2x5IGNyZWF0ZWQgcGFyZW50LlxuXHQgKi9cblx0b25QYXJlbnRQbGFjZT86IChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBBIGNvbXBvbmVudCB0byBwcmVwcm9jZXNzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSG90Q29tcG9uZW50IGltcGxlbWVudHMgSUhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBIVE1MRWxlbWVudHMuXG5cdCAqL1xuXHRodG1sRWxlbWVudHM6IEhUTUxFbGVtZW50W107XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRhZy5cblx0ICovXG5cdHRhZzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbm5lY3RlZCBBUEkuXG5cdCAqL1xuXHRhcGk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSBvcHRpb25zIHRvIGluY2x1ZGUgd2l0aCByZWdpc3RlcmluZyB0aGlzIGNvbXBvbmVudC5cblx0ICovXG5cdGVsZW1lbnRPcHRpb25zOiBFbGVtZW50RGVmaW5pdGlvbk9wdGlvbnM7XG5cdC8qKlxuXHQgKiBBbnkgZXh0cmEgYXR0cmlidXRlcyB0byByZWdpc3Rlci5cblx0ICovXG5cdG9ic2VydmVkQXR0cmlidXRlczogc3RyaW5nW107XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBjb21wb25lbnQuXG5cdCAqL1xuXHR0eXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdHZhbHVlOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgaW5uZXIgSFRNTCBvciB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuXHQgKi9cblx0aW5uZXI6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBldmVudHMgdG8gdHJpZ2dlci5cblx0ICovXG5cdGV2ZW50czoge1xuXHRcdFtuYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdHR5cGU6IHN0cmluZztcblx0XHRcdFx0ZnVuYzogRnVuY3Rpb247XG5cdFx0XHRcdG9wdGlvbnM6IGFueTtcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogRXhlY3V0ZSBwcmlvciB0byBvdXRwdXQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBJZiBzZXQgdG8gZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlT3V0cHV0PyAoKTogYm9vbGVhbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgZ2V0dGluZyB0aGUgb3V0cHV0LCBidXQgYmVmb3JlIHRoZSBET00gcGFyc2luZy5cblx0ICogXG5cdCAqIEBwYXJhbSBvdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb21wb25lbnQgdG8gcmVnaXN0ZXIuIENhbiBiZSBtYW5pcHVsYXRlZCBvbmUgbGFzdCB0aW1lIHByaW9yIHRvIFxuXHQgKiBiZWluZyBwYXJzZWQgaW50byBhIERPTSBlbGVtZW50LlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIGZpbmFsIG91dHB1dCB0byBiZSBwYXJzZWQgYXMgYSBET00gZWxlbWVudC5cblx0ICovXG5cdG9uUG9zdE91dHB1dD8gKG91dHB1dDogKHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdKSk6IChzdHJpbmcgfCBIb3RDb21wb25lbnRPdXRwdXRbXSk7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIHdoZW4gaXRzIHRpbWUgdG8gZml4IHRoZSBIVE1MIHByaW9yIHRvIERPTSBwYXJzaW5nLiBUaGlzIHdpbGwgc2tpcCB0aGUgSG90U3RhcSBkZWZhdWx0IGZpeGluZy5cblx0ICovXG5cdG9uRml4SFRNTD8gKG91dHB1dDogc3RyaW5nKTogeyBmaXhlZFN0cjogc3RyaW5nLCBxdWVyeVNlbGVjdG9yOiBzdHJpbmc7IH07XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGEgY3VzdG9tIERPTSBwYXJzZXIuXG5cdCAqL1xuXHRvblBhcnNlRE9NPyAob3V0cHV0OiBzdHJpbmcpOiBEb2N1bWVudDtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWZ0ZXIgdGhlIG91dHB1dCBoYXMgYmVlbiBwYXJzZWQgYW5kIGlzIHJlYWR5IHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBET00uXG5cdCAqL1xuXHRvblBhcnNlZD8gKG91dHB1dDogc3RyaW5nKTogc3RyaW5nO1xuXHQvKipcblx0ICogRXhlY3V0ZSBwcmlvciB0byBwbGFjaW5nIHRoZSBuZXcgRE9NIGVsZW1lbnQuXG5cdCAqL1xuXHRvblByZVBsYWNlPyAoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFmdGVyIHBsYWNpbmcgdGhlIG5ldyBET00gZWxlbWVudC4gQ2FuIGJlIG1hbmlwdWxhdGVkIG9uZSBmaW5hbCB0aW1lIHByaW9yIHRvIGJlaW5nIHJlbmRlcmVkLlxuXHQgKi9cblx0b25Qb3N0UGxhY2U/IChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50O1xuXHQvKipcblx0ICogRXhlY3V0ZSBhZnRlciBwbGFjaW5nIHRoZSBET00gZWxlbWVudCBvbnRvIHRoZSBuZXdseSBjcmVhdGVkIHBhcmVudC5cblx0ICovXG5cdG9uUGFyZW50UGxhY2U/IChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQ7XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IElIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSA9IG51bGwpXG5cdHtcblx0XHRpZiAoKGNvcHkgaW5zdGFuY2VvZiBIb3RTdGFxKSB8fCAoY29weSA9PSBudWxsKSlcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHR0aGlzLnByb2Nlc3NvciA9IGNvcHk7XG5cdFx0XHR0aGlzLmh0bWxFbGVtZW50cyA9IFtdO1xuXHRcdFx0dGhpcy5uYW1lID0gXCJcIjtcblx0XHRcdHRoaXMudGFnID0gXCJcIjtcblx0XHRcdHRoaXMuYXBpID0gbnVsbDtcblx0XHRcdHRoaXMuZWxlbWVudE9wdGlvbnMgPSB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLm9ic2VydmVkQXR0cmlidXRlcyA9IFtdO1xuXHRcdFx0dGhpcy50eXBlID0gXCJcIjtcblx0XHRcdHRoaXMudmFsdWUgPSBudWxsO1xuXHRcdFx0dGhpcy5pbm5lciA9IG51bGw7XG5cdFx0XHR0aGlzLmV2ZW50cyA9IHt9O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5LnByb2Nlc3Nvcjtcblx0XHRcdHRoaXMuaHRtbEVsZW1lbnRzID0gY29weS5odG1sRWxlbWVudHMgfHwgW107XG5cdFx0XHR0aGlzLm5hbWUgPSBjb3B5Lm5hbWUgfHwgXCJcIjtcblx0XHRcdHRoaXMudGFnID0gY29weS50YWcgfHwgdGhpcy5uYW1lO1xuXHRcdFx0dGhpcy5hcGkgPSBjb3B5LmFwaSB8fCBudWxsO1xuXHRcdFx0dGhpcy5lbGVtZW50T3B0aW9ucyA9IGNvcHkuZWxlbWVudE9wdGlvbnMgfHwgdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5vYnNlcnZlZEF0dHJpYnV0ZXMgPSBjb3B5Lm9ic2VydmVkQXR0cmlidXRlcyB8fCBbXTtcblx0XHRcdHRoaXMudHlwZSA9IGNvcHkudHlwZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy52YWx1ZSA9IGNvcHkudmFsdWUgfHwgbnVsbDtcblx0XHRcdHRoaXMuaW5uZXIgPSBjb3B5LmlubmVyIHx8IG51bGw7XG5cdFx0XHR0aGlzLmV2ZW50cyA9IHt9O1xuXHRcdH1cblxuXHRcdGlmIChhcGkgIT0gbnVsbClcblx0XHRcdHRoaXMuYXBpID0gYXBpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50IHRoYXQncyBjYWxsZWQgd2hlbiB0aGlzIGNvbXBvbmVudCdzIERPTSBlbGVtZW50IGhhcyBiZWVuIGNyZWF0ZWQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgRE9NIGVsZW1lbnQuXG5cdCAqL1xuXHRvbkNyZWF0ZWQgKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYW55XG5cdHtcblx0XHRyZXR1cm4gKGVsZW1lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZSB0aGUgYXR0cmlidXRlcyBtYW51YWxseS5cblx0ICovXG5cdGhhbmRsZUF0dHJpYnV0ZXM/IChhdHRyaWJ1dGVzOiBOYW1lZE5vZGVNYXApOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBIYW5kbGUgYSBjbGljayBldmVudC5cblx0ICovXG5cdGNsaWNrPyAoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogT3V0cHV0IHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHRhYnN0cmFjdCBvdXRwdXQgKCk6IHN0cmluZyB8IEhvdENvbXBvbmVudE91dHB1dFtdO1xufSIsImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuXG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcblxuaW1wb3J0IHsgRGV2ZWxvcGVyTW9kZSwgSG90IH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RQYWdlIH0gZnJvbSBcIi4vSG90UGFnZVwiO1xuXG4vKipcbiAqIEEgZmlsZSB0byBwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RGaWxlXG57XG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHBhZ2UuXG5cdCAqL1xuXHRwYWdlPzogSG90UGFnZTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlLlxuXHQgKi9cblx0bmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB1cmwgdG8gdGhlIGZpbGUgdG8gZ2V0LlxuXHQgKi9cblx0dXJsPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhdGggdG8gdGhlIGxvY2FsIGZpbGUgdG8gZ2V0LlxuXHQgKi9cblx0bG9jYWxGaWxlPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gcHJvY2Vzcy5cblx0ICovXG5cdGNvbnRlbnQ/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBGb3JjZSBhbGwgZXJyb3JzIHRvIGJlIHRocm93bi5cblx0ICovXG5cdHRocm93QWxsRXJyb3JzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJzZXIgb3B0aW9ucyBmb3Igd2hlbiBwcm9jZXNzaW5nIGEgc3RyaW5nIG9yIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VyT3B0aW9uc1xue1xuXHQvKipcblx0ICogT3V0cHV0IHRoZSBjb21tYW5kcyBnZW5lcmF0ZWQgZnJvbSBwcm9jZXNzaW5nLiBEZWZhdWx0OiB0cnVlXG5cdCAqL1xuXHRvdXRwdXRDb21tYW5kcz86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBBbGxvdyBKU09OLnN0cmluZ2lmeSB0byBiZSB1c2VkIGR1cmluZyBwcm9jZXNzaW5nLiBEZWZhdWx0OiB0cnVlXG5cdCAqL1xuXHRhbGxvd1N0cmluZ2lmeT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBmaWxlIHRvIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RGaWxlIGltcGxlbWVudHMgSUhvdEZpbGVcbntcblx0LyoqXG5cdCAqIFRoZSBwYXJlbnQgcGFnZS5cblx0ICovXG5cdHBhZ2U6IEhvdFBhZ2U7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB1cmwgdG8gdGhlIGZpbGUgdG8gZ2V0LlxuXHQgKi9cblx0dXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byB0aGUgbG9jYWwgZmlsZSB0byBnZXQuXG5cdCAqL1xuXHRsb2NhbEZpbGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIHByb2Nlc3MuXG5cdCAqL1xuXHRjb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBGb3JjZSBhbGwgZXJyb3JzIHRvIGJlIHRocm93bi5cblx0ICovXG5cdHRocm93QWxsRXJyb3JzOiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBJSG90RmlsZSA9IHt9KVxuXHR7XG5cdFx0dGhpcy5wYWdlID0gY29weS5wYWdlIHx8IG51bGw7XG5cdFx0dGhpcy5uYW1lID0gY29weS5uYW1lIHx8IFwiXCI7XG5cdFx0dGhpcy51cmwgPSBjb3B5LnVybCB8fCBcIlwiO1xuXHRcdHRoaXMubG9jYWxGaWxlID0gY29weS5sb2NhbEZpbGUgfHwgXCJcIjtcblx0XHR0aGlzLmNvbnRlbnQgPSBjb3B5LmNvbnRlbnQgfHwgXCJcIjtcblx0XHR0aGlzLnRocm93QWxsRXJyb3JzID0gY29weS50aHJvd0FsbEVycm9ycyB8fCBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlLlxuXHQgKi9cblx0c2V0Q29udGVudCAoY29udGVudDogc3RyaW5nKTogdm9pZFxuXHR7XG5cdFx0dGhpcy5jb250ZW50ID0gY29udGVudDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlLlxuXHQgKi9cblx0Z2V0Q29udGVudCAoKTogc3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMuY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIEhUVFAgZ2V0IHJlcXVlc3QuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgaHR0cEdldCAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdHRyeVxuXHRcdHtcblx0XHRcdGxldCByZXMgPSBhd2FpdCBmZXRjaCAodXJsKTtcblxuXHRcdFx0aWYgKHJlcy5vayA9PT0gZmFsc2UpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYCR7cmVzLnN0YXR1c306ICR7cmVzLnN0YXR1c1RleHR9YCk7XG5cblx0XHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBhd2FpdCByZXMudGV4dCAoKTtcblxuXHRcdFx0cmV0dXJuIChjb250ZW50KTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdHJldHVybiAoSlNPTi5zdHJpbmdpZnkgKHsgXCJlcnJvclwiOiBgJHtleC5tZXNzYWdlfSAtIENvdWxkIG5vdCBmZXRjaCAke3VybH1gIH0pKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBjb250ZW50IGZyb20gYSB1cmwuXG5cdCAqL1xuXHRhc3luYyBsb2FkVXJsICgpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdHRoaXMuY29udGVudCA9IGF3YWl0IEhvdEZpbGUuaHR0cEdldCAodGhpcy51cmwpO1xuXG5cdFx0cmV0dXJuICh0aGlzLmNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgY29udGVudCBmcm9tIGEgbG9jYWwgZmlsZS5cblx0ICovXG5cdGFzeW5jIGxvYWRMb2NhbEZpbGUgKCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHByb21pc2U6IFByb21pc2U8c3RyaW5nPiA9IG5ldyBQcm9taXNlIChcblx0XHRcdChyZXNvbHZlOiBhbnksIHJlamVjdDogYW55KTogdm9pZCA9PlxuXHRcdFx0e1xuXHRcdFx0XHRmcy5yZWFkRmlsZSAodGhpcy5sb2NhbEZpbGUsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbiwgZGF0YTogQnVmZmVyKTogdm9pZCA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChlcnIgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGhyb3cgZXJyO1xuXG5cdFx0XHRcdFx0XHRsZXQgY29udGVudDogc3RyaW5nID0gZGF0YS50b1N0cmluZyAoKTtcblx0XHRcdFx0XHRcdHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG5cblx0XHRcdFx0XHRcdHJlc29sdmUgKHRoaXMuY29udGVudCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiAocHJvbWlzZSk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUuXG5cdCAqL1xuXHRhc3luYyBsb2FkICgpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHRoaXMudXJsICE9PSBcIlwiKVxuXHRcdFx0Y29udGVudCA9IGF3YWl0IHRoaXMubG9hZFVybCAoKTtcblxuXHRcdGlmICh0aGlzLmxvY2FsRmlsZSAhPT0gXCJcIilcblx0XHRcdGNvbnRlbnQgPSBhd2FpdCB0aGlzLmxvYWRMb2NhbEZpbGUgKCk7XG5cblx0XHRyZXR1cm4gKGNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3Mgc3RyaW5nIGNvbnRlbnQuIFRoaXMgd2lsbCB0YWtlIGluIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBcblx0ICogcGFyc2UgdGhlIGNvbnRlbnQgYmFzZWQgb24gdGhlIHJlZ2V4LiBXaGVuIHRoZSByZWdleCBjb250ZW50IGlzIGZvdW5kIFxuXHQgKiBjb250ZW50UHJvY2Vzc29yIHdpbGwgYmUgZXhlY3V0ZWQgd2l0aCB0aGUgcmVnZXggY29udGVudCBmb3VuZC4gV2hlbiBcblx0ICogdGhlIHJlZ2V4IGNvbnRlbnQgaXMgbm90IGZvdW5kLCBvZmZDb250ZW50UHJvY2Vzc29yIHdpbGwgYmUgY2FsbGVkIHdpdGggXG5cdCAqIHRoZSBjb250ZW50IG91dHNpZGUgb2YgdGhlIHJlZ2V4LlxuXHQgKiBcblx0ICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gcGFyc2UuXG5cdCAqIEBwYXJhbSBjb250ZW50UmVnZXggVGhlIHJlZ2V4IHRvIHVzZSB0byBwYXJzZSB0aGUgY29udGVudC5cblx0ICogQHBhcmFtIGNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgaW5zaWRlIHRoZSByZWdleC5cblx0ICogQHBhcmFtIG9mZkNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgb3V0c2lkZSBvZiB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tQmVnaW5uaW5nIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgXG5cdCAqIGJlZ2lubmluZyBvZiB0aGUgZm91bmQgY29udGVudC5cblx0ICogQHBhcmFtIG51bVJlbW92ZUZyb21FbmQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIHRoZSBlbmQgb2YgXG5cdCAqIHRoZSBmb3VuZCBjb250ZW50LlxuXHQgKi9cblx0c3RhdGljIHByb2Nlc3NDb250ZW50IChjb250ZW50OiBzdHJpbmcsIGNvbnRlbnRSZWdleDogUmVnRXhwLFxuXHRcdGNvbnRlbnRQcm9jZXNzb3I6IChyZWdleEZvdW5kOiBzdHJpbmcpID0+IHN0cmluZyxcblx0XHRvZmZDb250ZW50UHJvY2Vzc29yOiAob2ZmQ29udGVudDogc3RyaW5nKSA9PiBzdHJpbmcsXG5cdFx0bnVtUmVtb3ZlRnJvbUJlZ2lubmluZzogbnVtYmVyID0gMixcblx0XHRudW1SZW1vdmVGcm9tRW5kOiBudW1iZXIgPSAyKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgcmVzdWx0OiBSZWdFeHBFeGVjQXJyYXkgPSBjb250ZW50UmVnZXguZXhlYyAoY29udGVudCk7XG5cdFx0bGV0IHByZXZpb3VzSW5kZXg6IG51bWJlciA9IDA7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdHdoaWxlIChyZXN1bHQgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgc3RhcnQ6IG51bWJlciA9IHJlc3VsdC5pbmRleCAtIG51bVJlbW92ZUZyb21CZWdpbm5pbmc7XG5cdFx0XHRsZXQgZW5kOiBudW1iZXIgPSBjb250ZW50UmVnZXgubGFzdEluZGV4ICsgbnVtUmVtb3ZlRnJvbUVuZDtcblxuXHRcdFx0Ly8gR2V0IHRoZSBwcmV2aW91cyBzZWN0aW9uLlxuXHRcdFx0bGV0IHByZXZDb250ZW50OiBzdHJpbmcgPSBjb250ZW50LnN1YnN0ciAocHJldmlvdXNJbmRleCwgKHN0YXJ0IC0gcHJldmlvdXNJbmRleCkpO1xuXHRcdFx0cHJldmlvdXNJbmRleCA9IGVuZDtcblxuXHRcdFx0b3V0cHV0ICs9IG9mZkNvbnRlbnRQcm9jZXNzb3IgKHByZXZDb250ZW50KTtcblxuXHRcdFx0Ly8gUHJvY2VzcyB0aGUgY29udGVudCBmb3VuZCBmcm9tIHRoZSByZWdleFxuXHRcdFx0bGV0IGNvbnRlbnRGb3VuZDogc3RyaW5nID0gcmVzdWx0WzBdO1xuXHRcdFx0b3V0cHV0ICs9IGNvbnRlbnRQcm9jZXNzb3IgKGNvbnRlbnRGb3VuZCk7XG5cblx0XHRcdC8vIE1vdmUgb24gdG8gdGhlIG5leHQgc2VjdGlvbiB0byBwYXJzZS5cblx0XHRcdHJlc3VsdCA9IGNvbnRlbnRSZWdleC5leGVjIChjb250ZW50KTtcblx0XHR9XG5cblx0XHQvLyBBcHBlbmQgd2hhdGV2ZXIgZWxzZSBpcyBhZnRlciB0aGUgbGFzdCBwYXJzZWQgc2VjdGlvbi5cblx0XHRsZXQgbGFzdENvbnRlbnQ6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChwcmV2aW91c0luZGV4KTtcblxuXHRcdG91dHB1dCArPSBvZmZDb250ZW50UHJvY2Vzc29yIChsYXN0Q29udGVudCk7XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhbnkgY29udGVudCB0aGF0IGNvdWxkIGhhdmUgbmVzdGVkIHZhbHVlcy4gVGhpcyB3aWxsIFxuXHQgKiB0YWtlIGluIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBcblx0ICogcGFyc2UgdGhlIGNvbnRlbnQgYmFzZWQgb24gdGhlIHJlZ2V4LiBXaGVuIHRoZSByZWdleCBjb250ZW50IGlzIGZvdW5kIFxuXHQgKiBjb250ZW50UHJvY2Vzc29yIHdpbGwgYmUgZXhlY3V0ZWQgd2l0aCB0aGUgcmVnZXggY29udGVudCBmb3VuZC4gV2hlbiBcblx0ICogdGhlIHJlZ2V4IGNvbnRlbnQgaXMgbm90IGZvdW5kLCBvZmZDb250ZW50UHJvY2Vzc29yIHdpbGwgYmUgY2FsbGVkIHdpdGggXG5cdCAqIHRoZSBjb250ZW50IG91dHNpZGUgb2YgdGhlIHJlZ2V4LlxuXHQgKiBcblx0ICogQGZpeG1lIE5lZWRzIHRvIGJlIGFibGUgdG8gaWdub3JlIGFueSBjaGFyYWN0ZXJzIGZvdW5kIGluc2lkZSBjb21tZW50cyBcblx0ICogb3IgYSBzdHJpbmcuIEZvciBleGFtcGxlLCBpZiB0aGUgZm9sbG93aW5nIGlzIHVzZWQgYGBgJHtcIlRlc3QgfVwifWBgYCBJdCBcblx0ICogd2lsbCBlcnJvciBvdXQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCB0byBwYXJzZS5cblx0ICogQHBhcmFtIHN0YXJ0Q2hhcnMgVGhlIHN0YXJ0aW5nIGNoYXJhY3RlcnMgdG8gc2VhcmNoIGZvci5cblx0ICogQHBhcmFtIGVuZENoYXJzIFRoZSBlbmRpbmcgY2hhcmFjdGVycyB0byBzZWFyY2ggZm9yLlxuXHQgKiBAcGFyYW0gdHJpZ2dlckNoYXIgVGhlIGZvdW5kIGNoYXJhY3RlciB3aGVyZSBwYXJzaW5nIHdpbGwgc3RhcnQgZnJvbS5cblx0ICogQHBhcmFtIGNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgaW5zaWRlIHRoZSByZWdleC5cblx0ICogQHBhcmFtIG9mZkNvbnRlbnRQcm9jZXNzb3IgVGhlIGNvbnRlbnQgZm91bmQgb3V0c2lkZSBvZiB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tQmVnaW5uaW5nIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgXG5cdCAqIGJlZ2lubmluZyBvZiB0aGUgZm91bmQgY29udGVudC5cblx0ICogQHBhcmFtIG51bVJlbW92ZUZyb21FbmQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIHRoZSBlbmQgb2YgXG5cdCAqIHRoZSBmb3VuZCBjb250ZW50LlxuXHQgKi9cblx0c3RhdGljIHByb2Nlc3NOZXN0ZWRDb250ZW50IChjb250ZW50OiBzdHJpbmcsIHN0YXJ0Q2hhcnM6IHN0cmluZywgZW5kQ2hhcnM6IHN0cmluZywgXG5cdFx0dHJpZ2dlckNoYXI6IHN0cmluZywgY29udGVudFByb2Nlc3NvcjogKHJlZ2V4Rm91bmQ6IHN0cmluZywgc3RhcnRQb3M6IG51bWJlciwgZW5kUG9zOiBudW1iZXIpID0+IHN0cmluZyxcblx0XHRvZmZDb250ZW50UHJvY2Vzc29yOiAob2ZmQ29udGVudDogc3RyaW5nKSA9PiBzdHJpbmcsXG5cdFx0bnVtUmVtb3ZlRnJvbUJlZ2lubmluZzogbnVtYmVyID0gMixcblx0XHRudW1SZW1vdmVGcm9tRW5kOiBudW1iZXIgPSAxKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgcG9zOiBudW1iZXIgPSBjb250ZW50LmluZGV4T2YgKHN0YXJ0Q2hhcnMpO1xuXHRcdGxldCBwcmV2aW91c0luZGV4OiBudW1iZXIgPSAwO1xuXHRcdGxldCBzdGFydFRyaWdnZXJQb3M6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAodHJpZ2dlckNoYXIsIHBvcyk7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdHdoaWxlIChwb3MgPiAtMSlcblx0XHR7XG5cdFx0XHRsZXQgZW5kOiBudW1iZXIgPSBjb250ZW50LmluZGV4T2YgKGVuZENoYXJzLCBwb3MpO1xuXHRcdFx0bGV0IG5lc3RlZENvdW50ZXI6IG51bWJlciA9IDA7XG5cblx0XHRcdGlmICh0cmlnZ2VyQ2hhciAhPT0gXCJcIilcblx0XHRcdHtcblx0XHRcdFx0Ly8gUmV2ZXJzZSBzZWFyY2ggdGhlIHRyaWdnZXIgY2hhcmFjdGVycyBhbmQgY291bnQgdGhlIG51bWJlciBvZiBcblx0XHRcdFx0Ly8gb2NjdXJyZW5jZXMuXG5cdFx0XHRcdGxldCBycG9zOiBudW1iZXIgPSBjb250ZW50Lmxhc3RJbmRleE9mICh0cmlnZ2VyQ2hhciwgZW5kIC0gbnVtUmVtb3ZlRnJvbUVuZCk7XG5cblx0XHRcdFx0d2hpbGUgKHJwb3MgPiAtMSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChycG9zID09PSBzdGFydFRyaWdnZXJQb3MpXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdHJwb3MgPSBjb250ZW50Lmxhc3RJbmRleE9mICh0cmlnZ2VyQ2hhciwgcnBvcyAtIG51bVJlbW92ZUZyb21FbmQpO1xuXHRcdFx0XHRcdG5lc3RlZENvdW50ZXIrKztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGVyZSdzIG5lc3RlZCB0cmlnZ2VyIGNoYXJhY3RlcnMsIGdldCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFxuXHRcdFx0Ly8gdGhlIGVuZCBjaGFyYWN0ZXIuXG5cdFx0XHRpZiAobmVzdGVkQ291bnRlciA+IDApXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBlcG9zOiBudW1iZXIgPSBjb250ZW50LmluZGV4T2YgKGVuZENoYXJzLCBlbmQgKyBudW1SZW1vdmVGcm9tRW5kKTtcblx0XHRcdFx0bGV0IHRlbXBlcG9zOiBudW1iZXIgPSBlcG9zO1xuXG5cdFx0XHRcdHdoaWxlICgoZXBvcyA+IC0xKSAmJiAobmVzdGVkQ291bnRlciA+IDApKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRlbXBlcG9zIDwgMClcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Ly8gTWFrZSBzdXJlIHdlIGFyZW4ndCBkaXNjb3ZlcmluZyBlbmRDaGFycyB0aGF0IHdlIHNob3VsZG4ndCBiZS5cblx0XHRcdFx0XHRsZXQgcG9zT3V0c2lkZU9mQ29udGVudDogbnVtYmVyID0gY29udGVudC5sYXN0SW5kZXhPZiAoc3RhcnRDaGFycywgdGVtcGVwb3MgLSBudW1SZW1vdmVGcm9tRW5kKTtcblxuXHRcdFx0XHRcdGlmIChwb3NPdXRzaWRlT2ZDb250ZW50ID4gZXBvcylcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZXBvcyA9IHRlbXBlcG9zO1xuXG5cdFx0XHRcdFx0dGVtcGVwb3MgPSBjb250ZW50LmluZGV4T2YgKGVuZENoYXJzLCBlcG9zICsgbnVtUmVtb3ZlRnJvbUVuZCk7XG5cdFx0XHRcdFx0bmVzdGVkQ291bnRlci0tO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZW5kID0gZXBvcztcblx0XHRcdH1cblxuXHRcdFx0bGV0IG9mZkNvbnRlbnRTdHI6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChwcmV2aW91c0luZGV4LCAocG9zIC0gcHJldmlvdXNJbmRleCkpO1xuXHRcdFx0b3V0cHV0ICs9IG9mZkNvbnRlbnRQcm9jZXNzb3IgKG9mZkNvbnRlbnRTdHIpO1xuXG5cdFx0XHRsZXQgZm91bmRDb250ZW50OiBzdHJpbmcgPSBjb250ZW50LnN1YnN0ciAoXG5cdFx0XHRcdHBvcyArIG51bVJlbW92ZUZyb21CZWdpbm5pbmcsIChlbmQgLSAocG9zICsgbnVtUmVtb3ZlRnJvbUJlZ2lubmluZykpKTtcblx0XHRcdG91dHB1dCArPSBjb250ZW50UHJvY2Vzc29yIChmb3VuZENvbnRlbnQsIHBvcywgZW5kKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSBuZXh0IGNvbnRlbnRcblx0XHRcdHBvcyA9IGNvbnRlbnQuaW5kZXhPZiAoc3RhcnRDaGFycywgZW5kICsgbnVtUmVtb3ZlRnJvbUVuZCk7XG5cdFx0XHRzdGFydFRyaWdnZXJQb3MgPSBjb250ZW50LmluZGV4T2YgKHRyaWdnZXJDaGFyLCBwb3MpO1xuXHRcdFx0cHJldmlvdXNJbmRleCA9IGVuZCArIG51bVJlbW92ZUZyb21FbmQ7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwZW5kIHdoYXRldmVyIGVsc2UgaXMgYWZ0ZXIgdGhlIGxhc3QgcGFyc2VkIHNlY3Rpb24uXG5cdFx0bGV0IGxhc3RDb250ZW50OiBzdHJpbmcgPSBjb250ZW50LnN1YnN0ciAocHJldmlvdXNJbmRleCk7XG5cblx0XHRvdXRwdXQgKz0gb2ZmQ29udGVudFByb2Nlc3NvciAobGFzdENvbnRlbnQpO1xuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlIGEgZnVuY3Rpb24gZnJvbSBhIHN0cmluZy4gRXg6IDwoYSwgYiwgYyk9PntyZXR1cm4gKGEgKyBiICsgYyk7fT5cblx0ICovXG5cdHN0YXRpYyBwYXJzZUZ1bmN0aW9uIChzdHI6IHN0cmluZywgY2FsbGJhY2tBOiAoZnVuY0FyZ3M6IHN0cmluZ1tdKSA9PiB2b2lkLCBcblx0XHRjYWxsYmFja0I6IChmdW5jQm9keTogc3RyaW5nLCBlbmRUeXBlOiBzdHJpbmcpID0+IHN0cmluZyk6IHN0cmluZ1xuXHR7XG5cdFx0bGV0IHN0YXJ0SW5kZXggPSBzdHIuaW5kZXhPZihcIjwoXCIpO1xuXG5cdFx0d2hpbGUgKHN0YXJ0SW5kZXggPiAtMSlcblx0XHR7XG5cdFx0XHRjb25zdCBlbmRJbmRleCA9IHN0ci5pbmRleE9mKFwiKVwiLCBzdGFydEluZGV4KTtcblx0XHRcdGNvbnN0IGFycm93SW5kZXggPSBzdHIuaW5kZXhPZihcIj0+XCIsIGVuZEluZGV4KTtcblx0XHRcdGNvbnN0IGJyYWNlSW5kZXggPSBzdHIuaW5kZXhPZihcIntcIiwgYXJyb3dJbmRleCk7XG5cdFx0XHRsZXQgbmV4dFBvczogbnVtYmVyID0gZW5kSW5kZXg7XG5cblx0XHRcdGlmICgoc3RhcnRJbmRleCAhPT0gLTEpICYmIFxuXHRcdFx0XHQoZW5kSW5kZXggIT09IC0xKSAmJiAoYXJyb3dJbmRleCAhPT0gLTEpICYmIFxuXHRcdFx0XHQoYnJhY2VJbmRleCAhPT0gLTEpKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcG9zc2libGVFbmRzOiBzdHJpbmdbXSA9IFtcIn0+XCIsIFwifUE+XCIsIFwifWE+XCIsIFwifVI+XCIsIFwifVJBPlwiLCBcIn1SYT5cIl07XG5cdFx0XHRcdGxldCBlbmRQb3MgPSAtMTtcblx0XHRcdFx0bGV0IGZvdW5kRW5kOiBzdHJpbmcgPSBudWxsO1xuXG5cdFx0XHRcdC8vIEZpbmQgdGhlIG5lYXJlc3QgZW5kIHRhZ1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHBvc3NpYmxlRW5kcy5sZW5ndGg7IGkrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBwb3NzaWJsZUVuZDogc3RyaW5nID0gcG9zc2libGVFbmRzW2ldO1xuXHRcdFx0XHRcdGxldCBwb3NzaWJsZUVuZFBvcyA9IHN0ci5pbmRleE9mKHBvc3NpYmxlRW5kLCBhcnJvd0luZGV4KTtcblxuXHRcdFx0XHRcdGlmIChwb3NzaWJsZUVuZFBvcyA+IC0xICYmIChlbmRQb3MgPT0gLTEgfHwgcG9zc2libGVFbmRQb3MgPCBlbmRQb3MpKSB7XG5cdFx0XHRcdFx0XHRlbmRQb3MgPSBwb3NzaWJsZUVuZFBvcztcblx0XHRcdFx0XHRcdGZvdW5kRW5kID0gcG9zc2libGVFbmQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGVuZFBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uc3QgYSA9IHN0ci5zbGljZShzdGFydEluZGV4ICsgMiwgZW5kSW5kZXgpLnRyaW0oKS5zcGxpdChcIixcIikubWFwKGFyZyA9PiBhcmcudHJpbSgpKTtcblx0XHRcdFx0XHRjb25zdCBiID0gc3RyLnNsaWNlKGJyYWNlSW5kZXggKyAxLCBlbmRQb3MpLnRyaW0oKTtcblx0XHRcdFx0XHRjYWxsYmFja0EoYSk7XG5cdFx0XHRcdFx0bGV0IG91dCA9IGNhbGxiYWNrQihiLCBmb3VuZEVuZCk7XG5cblx0XHRcdFx0XHRzdHIgPSBzdHIuc2xpY2UoMCwgc3RhcnRJbmRleCkgKyBvdXQgKyBzdHIuc2xpY2UoZW5kUG9zICsgZm91bmRFbmQubGVuZ3RoKTtcblxuXHRcdFx0XHRcdG5leHRQb3MgPSBlbmRQb3M7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0c3RhcnRJbmRleCA9IHN0ci5pbmRleE9mKFwiPChcIiwgbmV4dFBvcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChzdHIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlIGFsbCB0aGUgY29udGVudCBpbnRvIGEgc2luZ2xlIEphdmFTY3JpcHQgZmlsZSB0byBiZSBleGVjdXRlZC4gYXN5bmMvYXdhaXQgaXMgdXNlZCBcblx0ICogaW4gdGhlIHByb2Nlc3NlZCBKYXZhU2NyaXB0IGZpbGUsIHdoaWNoIG1lYW5zIHRoZSAuaG90dCBmaWxlcyBwYXJzZWQgbWF5IHVzZSBhc3luYy9hd2FpdCBcblx0ICogd2l0aGluIHRoZSBjb2RlLlxuXHQgKiBcblx0ICogV2lsbCBwYXJzZSB0aGUgZm9sbG93aW5nIGluIG9yZGVyOlxuXHQgKiAqIDwqIEphdmFTY3JpcHQgY29udGVudCB0byBleGVjdXRlIGFuZCBvdXRwdXQuIFdpbGwgb3V0cHV0IHVzaW5nIEhvdC5lY2hvLiAqPlxuXHQgKiAqICF7IEV4ZWN1dGUgT05MWSBKYXZhU2NyaXB0LiBUaGlzIHdpbGwgTk9UIG91dHB1dCBhbnl0aGluZyBhdXRvbWF0aWNhbGx5LiBJZiB5b3Ugd2FudCBpdCB0byBvdXRwdXQsIHVzZSBIb3QuZWNobyBoZXJlLiB9XG5cdCAqICogU1RSeyBFeGVjdXRlIHNvbWUgSlMsIGFuZCBvdXRwdXQgYSBzdHJpbmcgdXNpbmcgSlNPTi5zdHJpbmdpZnkuIH1cblx0ICogKiAkeyBFeGVjdXRlIHNvbWUgSlMsIGFuZCBvdXRwdXQgdGhlIHJlc3VsdC4gfVxuXHQgKiAqIDwoYXJndW1lbnRzKT0+eyBTb21lIEpTIHRvIGV4ZWN1dGUgYXQgYSBsYXRlciB0aW1lLiB9PlxuXHQgKiBcdCogVGhpcyBlbnRpcmUgYmxvY2sgd2lsbCBiZSBwYXJzZWQgYXMgYSBmdW5jdGlvbiwgYW5kIHdpbGwgaW1tZWRpYXRlbHkgb3V0cHV0IFwiSG90LkN1cnJlbnRQYWdlLmNhbGxGdW5jdGlvblwiIGluIGl0cyBwbGFjZS5cblx0ICogKiA/KCBFeGVjdXRlIHNvbWUgSlMsIG11c3QgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIEhUTUwgRE9NIG9iamVjdCBpdCdzIHVzZWQgb24uIClcblx0ICogXG5cdCAqIEBwYXJhbSB0aGlzQ29udGVudCBUaGUgY29udGVudCB0byBwYXJzZS5cblx0ICogQHBhcmFtIHRocm93QWxsRXJyb3JzIElmIHNldCB0byB0cnVlLCBhbnkgZXJyb3IgdGhhdCBvY2N1cnMgd2lsbCBiZSB0aHJvd24gYXMgYW4gZXhjZXB0aW9uLlxuXHQgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBwYXJzaW5nIHRoZSBjb250ZW50LlxuXHQgKi9cblx0c3RhdGljIHBhcnNlQ29udGVudCAodGhpc0NvbnRlbnQ6IHN0cmluZywgdGhyb3dBbGxFcnJvcnM6IGJvb2xlYW4sIHBhcnNlck9wdGlvbnM6IFBhcnNlck9wdGlvbnMgPSBudWxsKTogc3RyaW5nXG5cdHtcblx0XHRpZiAocGFyc2VyT3B0aW9ucyA9PSBudWxsKVxuXHRcdHtcblx0XHRcdHBhcnNlck9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0b3V0cHV0Q29tbWFuZHM6IHRydWUsXG5cdFx0XHRcdFx0YWxsb3dTdHJpbmdpZnk6IHRydWVcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRsZXQgU1RSSU5HSUZZX1NUQVJUOiBzdHJpbmcgPSBcIkpTT04uc3RyaW5naWZ5IChcIjtcblx0XHRsZXQgU1RSSU5HSUZZX0VORDogc3RyaW5nID0gXCIpXCI7XG5cblx0XHRpZiAocGFyc2VyT3B0aW9ucy5hbGxvd1N0cmluZ2lmeSA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0U1RSSU5HSUZZX1NUQVJUID0gXCJcIjtcblx0XHRcdFNUUklOR0lGWV9FTkQgPSBcIlwiO1xuXHRcdH1cblxuXHRcdC8vIEFzc2VtYmxlIHRoZSBKUyB0byBldmFsdWF0ZS4gVGhpcyB3aWxsIHRha2UgYWxsIGNvbnRlbnQgb3V0c2lkZSBvZiBcblx0XHQvLyA8KiBhbmQgKj4gYW5kIHdyYXAgYSBIb3QuZWNobyBhcm91bmQgaXQuIEFueSBKUyBmb3VuZCBpbnNpZGUgb2YgdGhlIFxuXHRcdC8vIDwqIGFuZCAqPiB3aWxsIGJlIGV4ZWN1dGVkIGFzIGlzLlxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc0NvbnRlbnQgKHRoaXNDb250ZW50LCBcblx0XHRcdG5ldyBSZWdFeHAgKFwiKD89XFxcXDxcXFxcKikoW1xcXFxzXFxcXFNdKj8pKD89XFxcXCpcXFxcPilcIiwgXCJnXCIpLCBcblx0XHRcdChyZWdleEZvdW5kOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdHtcblx0XHRcdFx0Ly8gQSBsaXR0bGUgaGFjaywgc2luY2UgSSBzdWNrIGF0IFJlZ2V4IDooXG5cdFx0XHRcdHJlZ2V4Rm91bmQgPSByZWdleEZvdW5kLnN1YnN0ciAoMik7XG5cblx0XHRcdFx0cmV0dXJuIChgJHtyZWdleEZvdW5kfWApO1xuXHRcdFx0fSwgXG5cdFx0XHQob2ZmQ29udGVudDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHR7XG5cdFx0XHRcdGlmIChvZmZDb250ZW50ID09PSBcIlwiKVxuXHRcdFx0XHRcdHJldHVybiAoXCJcIik7XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQ6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdG9mZkNvbnRlbnQsIFwiIXtcIiwgXCJ9XCIsIFwie1wiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZywgc3RhcnRQb3M6IG51bWJlciwgZW5kUG9zOiBudW1iZXIpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb3V0OiBzdHJpbmcgPSBgKiYmJSolQCNAISR7cmVnZXhGb3VuZDJ9KiYhIyVAIUAqIWA7XG5cblx0XHRcdFx0XHRcdHJldHVybiAob3V0KTtcblx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHQob2ZmQ29udGVudDM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJldHVybiAob2ZmQ29udGVudDMpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDI6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdHRlbXBPdXRwdXQsIFwiU1RSe1wiLCBcIn1cIiwgXCJ7XCIsIFxuXHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nLCBzdGFydFBvczogbnVtYmVyLCBlbmRQb3M6IG51bWJlcik6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLm91dHB1dENvbW1hbmRzID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIWVjaG9PdXRwdXQgKEpTT04uc3RyaW5naWZ5KCR7cmVnZXhGb3VuZDJ9KSwgJHt0aHJvd0FsbEVycm9yc30pOyomISMlQCFAKiFgO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAISR7U1RSSU5HSUZZX1NUQVJUfSR7cmVnZXhGb3VuZDJ9JHtTVFJJTkdJRllfRU5EfSwgJHt0aHJvd0FsbEVycm9yc30pOyomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHR9LCA0LCAxKTtcblxuXHRcdFx0XHRsZXQgZnVuY0FyZ3NTdHI6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQzID0gXG5cdFx0XHRcdFx0SG90RmlsZS5wYXJzZUZ1bmN0aW9uICh0ZW1wT3V0cHV0MiwgKGZ1bmNBcmdzOiBzdHJpbmdbXSkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRmdW5jQXJnc1N0ciA9IEpTT04uc3RyaW5naWZ5IChmdW5jQXJncyk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KGZ1bmNCb2R5OiBzdHJpbmcsIGVuZFR5cGU6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vY29uc3QgZXNjYXBlZEJvZHk6IHN0cmluZyA9IGZ1bmNCb2R5LnJlcGxhY2UoL1tcXFxcJ1wiXFxuXFxyXFx0XS9nLCAnXFxcXCQmJyk7XG5cdFx0XHRcdFx0XHRjb25zdCBlc2NhcGVkQm9keTogc3RyaW5nID0gZnVuY0JvZHkucmVwbGFjZSAoL1xcYC9nLCBcIlxcXFxgXCIpO1xuXHRcdFx0XHRcdFx0bGV0IGZ1bmN0aW9uQ2FsbDogc3RyaW5nID0gXCJIb3QuQ3VycmVudFBhZ2UuY2FsbEZ1bmN0aW9uXCI7XG5cdFx0XHRcdFx0XHRsZXQgaXNBc3luYzogc3RyaW5nID0gXCJmYWxzZVwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoZW5kVHlwZSA9PT0gXCJ9QT5cIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25DYWxsID0gXCJhd2FpdCBIb3QuQ3VycmVudFBhZ2UuY2FsbEFzeW5jRnVuY3Rpb25cIjtcblx0XHRcdFx0XHRcdFx0aXNBc3luYyA9IFwidHJ1ZVwiO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoZW5kVHlwZSA9PT0gXCJ9YT5cIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25DYWxsID0gXCJIb3QuQ3VycmVudFBhZ2UuY2FsbEFzeW5jRnVuY3Rpb25cIjtcblx0XHRcdFx0XHRcdFx0aXNBc3luYyA9IFwidHJ1ZVwiO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoZW5kVHlwZSA9PT0gXCJ9Uj5cIilcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25DYWxsID0gXCJyZXR1cm4gSG90LkN1cnJlbnRQYWdlLmNhbGxGdW5jdGlvblwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoZW5kVHlwZSA9PT0gXCJ9UkE+XCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGZ1bmN0aW9uQ2FsbCA9IFwicmV0dXJuIGF3YWl0IEhvdC5DdXJyZW50UGFnZS5jYWxsQXN5bmNGdW5jdGlvblwiO1xuXHRcdFx0XHRcdFx0XHRpc0FzeW5jID0gXCJ0cnVlXCI7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChlbmRUeXBlID09PSBcIn1SYT5cIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25DYWxsID0gXCJyZXR1cm4gSG90LkN1cnJlbnRQYWdlLmNhbGxBc3luY0Z1bmN0aW9uXCI7XG5cdFx0XHRcdFx0XHRcdGlzQXN5bmMgPSBcInRydWVcIjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bGV0IG5ld1ZhbHVlID0gYComJiUqJUAjQCF7XG5jb25zdCBuZXdGdW5jTmFtZSA9IGNyZWF0ZUZ1bmN0aW9uIChudWxsLCAke2Z1bmNBcmdzU3RyfSwgXFxgJHtlc2NhcGVkQm9keX1cXGAsICR7aXNBc3luY30pO1xuSG90LmVjaG8gKFxcYCR7ZnVuY3Rpb25DYWxsfSAodGhpcywgJ1xcJHtuZXdGdW5jTmFtZX0nLCBhcmd1bWVudHMpO1xcYCk7XG59KiYhIyVAIUAqIWA7XG5cdFx0XHRcdFx0XHQvLyBSZXBsYWNlIGFueSAkeyB3aXRoICR7JiYhKiMhIVxuXHRcdFx0XHRcdFx0bmV3VmFsdWUgPSBuZXdWYWx1ZS5yZXBsYWNlICgvXFwkXFx7L2csIFwiJHsmJiEqIyEhXCIpO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG5ld1ZhbHVlKTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRsZXQgdGVtcE91dHB1dDQ6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdHRlbXBPdXRwdXQzLCBcIiR7XCIsIFwifVwiLCBcIntcIiwgXG5cdFx0XHRcdFx0KHJlZ2V4Rm91bmQyOiBzdHJpbmcsIHN0YXJ0UG9zOiBudW1iZXIsIGVuZFBvczogbnVtYmVyKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0XHRcdGxldCBvdXRwdXRDbWRzOiBib29sZWFuID0gcGFyc2VyT3B0aW9ucy5vdXRwdXRDb21tYW5kcztcblxuXHRcdFx0XHRcdFx0aWYgKHJlZ2V4Rm91bmQyLmluZGV4T2YgKFwiJiYhKiMhIVwiKSA+IC0xKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0ZW1wU3RyOiBzdHJpbmcgPSByZWdleEZvdW5kMi5yZXBsYWNlICgvJiZcXCFcXCpcXCNcXCFcXCEvZywgXCJcIik7XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIChgXFwkeyh0eXBlb2YgKCR7dGVtcFN0cn0pICE9PSBcInVuZGVmaW5lZFwiKSA/ICR7dGVtcFN0cn0gOiBcIlxcJHske3RlbXBTdHJ9fVwifWApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob3V0cHV0Q21kcyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGVzY2FwZU91dHB1dCA9IChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKGNvbnRlbnQucmVwbGFjZSgvW2BdL2csICdcXFxcYCcpKTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0AhdHJ5IHsgSG90LmVjaG8gKCR7cmVnZXhGb3VuZDJ9KTsgfWNhdGNoIChleCl7SG90LmVjaG8gKFxcYFxcXFxcXCR7JHtlc2NhcGVPdXRwdXQgKHJlZ2V4Rm91bmQyKX19XFxgKTt9KiYhIyVAIUAqIWA7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRocm93QWxsRXJyb3JzID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0AhSG90LmVjaG8gKCR7cmVnZXhGb3VuZDJ9KTsqJiEjJUAhQCohYDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0b3V0ID0gYComJiUqJUAjQCEke3JlZ2V4Rm91bmQyfSomISMlQCFAKiFgO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdC8qbGV0IGVzY2FwZWRDb250ZW50OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAob2ZmQ29udGVudDMpO1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gYGVjaG9PdXRwdXQgKCR7ZXNjYXBlZENvbnRlbnR9LCAke3Rocm93QWxsRXJyb3JzfSk7XFxuYDtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpOyovXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQ1OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdC8vIEFueSA/KCkgd2lsbCBiZSBpZ25vcmVkIGluIHByb2R1Y3Rpb24gbW9kZS5cblx0XHRcdFx0aWYgKEhvdC5Nb2RlID09PSBEZXZlbG9wZXJNb2RlLlByb2R1Y3Rpb24pXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZW1wT3V0cHV0NSA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdFx0dGVtcE91dHB1dDQsIFwiPyhcIiwgXCIpXCIsIFwiKFwiLCBcblx0XHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nLCBzdGFydFBvczogbnVtYmVyLCBlbmRQb3M6IG51bWJlcik6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKFwiXCIpO1xuXHRcdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XHQob2ZmQ29udGVudDM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdFx0LypsZXQgb3V0OiBzdHJpbmcgPSBgZWNob091dHB1dCAoJHtvZmZDb250ZW50M30sICR7dGhyb3dBbGxFcnJvcnN9KTtcXG5gO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAob3V0KTsqL1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoSG90Lk1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZW1wT3V0cHV0NSA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdFx0dGVtcE91dHB1dDQsIFwiPyhcIiwgXCIpXCIsIFwiKFwiLCBcblx0XHRcdFx0XHRcdChyZWdleEZvdW5kMjogc3RyaW5nLCBzdGFydFBvczogbnVtYmVyLCBlbmRQb3M6IG51bWJlcik6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgZm91bmRTdHI6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLyBDaGVjayB0byBzZWUgaWYgaXQgYmUgcGFyc2VkLiBJZiBzbywgc3RyaW5naWZ5IGl0LlxuXHRcdFx0XHRcdFx0XHRcdEpTT04ucGFyc2UgKHJlZ2V4Rm91bmQyKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLmFsbG93U3RyaW5naWZ5ID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRcdFx0Zm91bmRTdHIgPSBKU09OLnN0cmluZ2lmeSAocmVnZXhGb3VuZDIpO1xuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdGZvdW5kU3RyID0gYCR7cmVnZXhGb3VuZDJ9YDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjYXRjaCAoZXgpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLyBJZiB2YWxpZCBKU09OIGlzIG5vdCByZWNlaXZlZCwgZG9uJ3Qgd29ycnkgYWJvdXQgaXQsIHBhc3MgaXQgXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYWxvbmcgdG8gdGhlIGZ1bmN0aW9uIGJlbG93IGZvciBpdCB0byBiZSBwYXJzZWQgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIHRoZXJlIGluc3RlYWQuXG5cdFx0XHRcdFx0XHRcdFx0Zm91bmRTdHIgPSBgJHtyZWdleEZvdW5kMn1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8vIEBmaXhtZSBNYWtlIHRoaXMgYSBjYWxsYWJsZSBmdW5jdGlvbiBhbmQgcGFzcyBmb3VuZFN0ciwgZXRjLlxuXHRcdFx0XHRcdFx0XHRsZXQgb3V0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLm91dHB1dENvbW1hbmRzID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0b3V0ID0gYComJiUqJUAjQCF7XG5jb25zdCB0ZXN0RWxtID0gY3JlYXRlVGVzdEVsZW1lbnQgKCR7Zm91bmRTdHJ9KTtcbkhvdC5lY2hvIChcXGBkYXRhLXRlc3Qtb2JqZWN0LW5hbWUgPSBcIlxcJHt0ZXN0RWxtLm5hbWV9XCIgZGF0YS10ZXN0LW9iamVjdC1mdW5jID0gXCJcXCR7dGVzdEVsbS5mdW5jfVwiIGRhdGEtdGVzdC1vYmplY3QtdmFsdWUgPSBcIlxcJHt0ZXN0RWxtLnZhbHVlfVwiXFxgKTtcbn0qJiEjJUAhQCohXFxuYDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgY3JlYXRlVGVzdEVsZW1lbnQgPSAoZm91bmRTdHIyOiBhbnkpID0+XG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHRlc3RFbG0gPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IG9iaiA9IGZvdW5kU3RyMjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChmb3VuZFN0cjIpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9iaiA9IEpTT04ucGFyc2UgKGZvdW5kU3RyMik7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAob2JqKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9ialswXSwgb2JqWzFdLCBvYmpbMl0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvYmpbXCJuYW1lXCJdICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9iaik7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZS50ZXN0RWxlbWVudHNbdGVzdEVsbS5uYW1lXSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgZWxlbWVudCAke3Rlc3RFbG0ubmFtZX0gYWxyZWFkeSBleGlzdHMhYCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRjYXRjaCAoZXgpXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoXG5cdFx0XHRcdFx0XHRcdFx0YEVycm9yIHByb2Nlc3NpbmcgdGVzdCBlbGVtZW50ICR7Zm91bmRTdHIyfSBpbiAke0hvdC5DdXJyZW50UGFnZS5uYW1lfS4gRXJyb3I6ICR7ZXgubWVzc2FnZX1gXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuICh0ZXN0RWxtKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCB0ZXN0RWxtID0gY3JlYXRlVGVzdEVsZW1lbnQgKGZvdW5kU3RyKTtcblx0XHRcdFx0XHRcdFx0XHRvdXQgPSBgKiYmJSolQCNAIWRhdGEtdGVzdC1vYmplY3QtbmFtZSA9IFwiJHt0ZXN0RWxtLm5hbWV9XCIgZGF0YS10ZXN0LW9iamVjdC1mdW5jID0gXCIke3Rlc3RFbG0uZnVuY31cIiBkYXRhLXRlc3Qtb2JqZWN0LXZhbHVlID0gXCIke3Rlc3RFbG0udmFsdWV9XCIqJiEjJUAhQCohYDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHJldHVybiAob3V0KTtcblx0XHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdFx0KG9mZkNvbnRlbnQzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIChvZmZDb250ZW50Myk7XG5cdFx0XHRcdFx0XHRcdC8qbGV0IG91dDogc3RyaW5nID0gYGVjaG9PdXRwdXQgKCR7b2ZmQ29udGVudDN9LCAke3Rocm93QWxsRXJyb3JzfSk7XFxuYDtcblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7Ki9cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQ2OiBzdHJpbmcgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHR0ZW1wT3V0cHV0NSwgXCIqJiYlKiVAI0AhXCIsIFwiKiYhIyVAIUAqIVwiLCBcIiomJiUqJUAjQCFcIiwgXG5cdFx0XHRcdFx0KHJlZ2V4Rm91bmQ6IHN0cmluZywgc3RhcnRQb3M6IG51bWJlciwgZW5kUG9zOiBudW1iZXIpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKHJlZ2V4Rm91bmQpO1xuXHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdChvZmZDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgZXNjYXBlZENvbnRlbnQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChwYXJzZXJPcHRpb25zLmFsbG93U3RyaW5naWZ5ID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHRlc2NhcGVkQ29udGVudCA9IEpTT04uc3RyaW5naWZ5IChvZmZDb250ZW50KTtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0ZXNjYXBlZENvbnRlbnQgPSBvZmZDb250ZW50O1xuXG5cdFx0XHRcdFx0XHRsZXQgb3V0OiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRpZiAocGFyc2VyT3B0aW9ucy5vdXRwdXRDb21tYW5kcyA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdFx0b3V0ID0gYGVjaG9PdXRwdXQgKCR7ZXNjYXBlZENvbnRlbnR9LCAke3Rocm93QWxsRXJyb3JzfSk7XFxuYDtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0b3V0ID0gZXNjYXBlZENvbnRlbnQ7XG5cblx0XHRcdFx0XHRcdHJldHVybiAob3V0KTtcblx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHRcIiomJiUqJUAjQCFcIi5sZW5ndGgsIFwiKiYhIyVAIUAqIVwiLmxlbmd0aCk7XG5cblx0XHRcdFx0Ly8vIEBmaXhtZSBUZW1wb3JhcnkgaGFjay4gVGhlc2UgZGVsaW1pdGVycyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRlbXBPdXRwdXQgd2hlbiBcblx0XHRcdFx0Ly8vIGV4ZWN1dGluZyBwcm9jZXNzTmVzdGVkQ29udGVudC5cblx0XHRcdFx0dGVtcE91dHB1dDYgPSB0ZW1wT3V0cHV0Ni5yZXBsYWNlICgvXFwqXFwmXFwmXFwlXFwqXFwlXFxAXFwjXFxAXFwhL2csIFwiXCIpO1xuXHRcdFx0XHR0ZW1wT3V0cHV0NiA9IHRlbXBPdXRwdXQ2LnJlcGxhY2UgKC9cXCpcXCZcXCFcXCNcXCVcXEBcXCFcXEBcXCpcXCEvZywgXCJcIik7XG5cblx0XHRcdFx0cmV0dXJuICh0ZW1wT3V0cHV0Nik7XG5cdFx0XHR9LCAwKTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIHRoZSBjb250ZW50IGluIHRoaXMgZmlsZS4gVGhpcyB0cmVhdHMgZWFjaCBmaWxlIGFzIG9uZSBsYXJnZSBKYXZhU2NyaXB0XG5cdCAqIGZpbGUuIEFueSB0ZXh0IG91dHNpZGUgb2YgdGhlIDwqICo+IGFyZWFzIHdpbGwgYmUgdHJlYXRlZCBhczpcblx0ICogXG5cdCAqIFx0XHRIb3QuZWNobyAoXCJ0ZXh0XCIpO1xuXHQgKiBcblx0ICogQGZpeG1lIFRoZSByZWdleCdzIGluIHRoZSBvZmZDb250ZW50IGZ1bmN0aW9ucyBuZWVkIHRvIGJlIGZpeGVkLiBUaGVyZSdzIHNldmVyYWwgXG5cdCAqIHRlc3QgY2FzZXMgd2hlcmUgdGhleSB3aWxsIGZhaWwuXG5cdCAqL1xuXHRhc3luYyBwcm9jZXNzIChhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgdGhpc0NvbnRlbnQ6IHN0cmluZyA9IHRoaXMuY29udGVudDtcblxuXHRcdGlmIChhcmdzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKGFyZ3MgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSW4gJHt0aGlzLm5hbWV9LCB0aGUgcGFzc2VkIGFyZ3VtZW50cyByZWNlaXZlZCBjYW5ub3QgYmUgYW4gYXJyYXkhYCk7XG5cdFx0fVxuXG5cdFx0bGV0IHRlbXBBcmdzID0gSG90LkFyZ3VtZW50cztcblxuXHRcdEhvdC5Nb2RlID0gdGhpcy5wYWdlLnByb2Nlc3Nvci5tb2RlO1xuXHRcdEhvdC5Bcmd1bWVudHMgPSBhcmdzO1xuXHRcdEhvdC5DdXJyZW50UGFnZSA9IHRoaXMucGFnZTtcblx0XHRIb3QuUHVibGljS2V5cyA9IHRoaXMucGFnZS5wcm9jZXNzb3IucHVibGljS2V5cztcblx0XHRIb3QuQVBJID0gdGhpcy5wYWdlLmdldEFQSSAoKTtcblx0XHRIb3QuVGVzdGVyQVBJID0gdGhpcy5wYWdlLmdldFRlc3RlckFQSSAoKTtcblxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IEhvdEZpbGUucGFyc2VDb250ZW50ICh0aGlzQ29udGVudCwgdGhpcy50aHJvd0FsbEVycm9ycyk7XG5cblx0XHQvLyBFeGVjdXRlIHRoZSBhc3NlbWJsZWQgSlMgZmlsZS5cblx0XHRsZXQgcmV0dXJuZWRPdXRwdXQ6IGFueSA9IG51bGw7XG5cblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgZXhlY3V0aW9uQ29udGVudDogc3RyaW5nID0gYFxuXHRcdFx0dmFyIEhvdCA9IGFyZ3VtZW50c1swXTtcblx0XHRcdHZhciBQYXNzZWRIb3RGaWxlID0gYXJndW1lbnRzWzFdO1xuXG5cdFx0XHRgO1xuXG5cdFx0XHQvLyBPdXRwdXQgdGhlIGFyZ3VtZW50cyBzbyBpdCdzIHVzYWJsZSBpbiB0aGUgZW50aXJlIGRvY3VtZW50LlxuXHRcdFx0aWYgKHR5cGVvZiAoYXJncykgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRoZSBwYXNzaW5nIGFyZ3VtZW50cyBjYW5ub3QgYmUgYSBzdHJpbmchYCk7XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBhcmdzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgbmV3VmFyOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRsZXQgbmV3VmFyVmFsdWU6IGFueSA9IGFyZ3Nba2V5XTtcblx0XHRcdFx0bGV0IG5ld1ZhclZhbHVlU3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeSAobmV3VmFyVmFsdWUpO1xuXG5cdFx0XHRcdG5ld1ZhciA9IGB2YXIgJHtrZXl9ID0gJHtuZXdWYXJWYWx1ZVN0cn07XFxuYDtcblxuXHRcdFx0XHRleGVjdXRpb25Db250ZW50ICs9IG5ld1Zhcjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGNvbnRlbnROYW1lOiBzdHJpbmcgPSB0aGlzLm5hbWU7XG5cblx0XHRcdGlmIChjb250ZW50TmFtZSA9PT0gXCJcIilcblx0XHRcdFx0Y29udGVudE5hbWUgPSB0aGlzLmxvY2FsRmlsZTtcblxuXHRcdFx0aWYgKGNvbnRlbnROYW1lID09PSBcIlwiKVxuXHRcdFx0XHRjb250ZW50TmFtZSA9IHRoaXMudXJsO1xuXG5cdFx0XHRleGVjdXRpb25Db250ZW50ICs9IGBcblx0XHRcdC8qKlxuXHRcdFx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIG91dHB1dCBjb250ZW50LlxuXHRcdFx0ICovXG5cdFx0XHRmdW5jdGlvbiBlY2hvT3V0cHV0IChjb250ZW50LCB0aHJvd0Vycm9ycylcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRocm93RXJyb3JzID09IG51bGwpXG5cdFx0XHRcdFx0dGhyb3dFcnJvcnMgPSB0cnVlO1xuXG5cdFx0XHRcdGlmICh0aHJvd0Vycm9ycyA9PT0gdHJ1ZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdEhvdC5lY2hvIChjb250ZW50KTtcblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90LmVjaG8gKGNvbnRlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdEhvdC5lY2hvIChcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvKipcblx0XHRcdCAqIE91dHB1dHMgYSBcXCR7SlMgQ29udGVudH0gdmFsdWUuXG5cdFx0XHQgKi9cblx0XHRcdGZ1bmN0aW9uIG91dHB1dFN0ciAodmFsdWUsIHBvc3NpYmxlVmFsdWUpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCByZXN1bHQgPSBcXGBcXFxcXFwke1xcJHt2YWx1ZX19XFxgO1xuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHBvc3NpYmxlVmFsdWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHBvc3NpYmxlVmFsdWU7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmVzdWx0ID0gZXZhbCAodmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0e1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIChyZXN1bHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcblx0XHRcdCAqIENyZWF0ZSBhIGZ1bmN0aW9uIGZvciBsYXRlciBleGVjdXRpb24gb24gdGhpcyBwYWdlLlxuXHRcdFx0ICovXG5cdFx0XHRmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbiAobmFtZSwgYXJncywgZnVuY0JvZHksIGlzQXN5bmMpXG5cdFx0XHR7XG5cdFx0XHRcdHJldHVybiAoSG90LkN1cnJlbnRQYWdlLmFkZEZ1bmN0aW9uIChuYW1lLCBhcmdzLCBmdW5jQm9keSwgaXNBc3luYykpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKipcblx0XHRcdCAqIENyZWF0ZSBhIHRlc3QgZWxlbWVudC5cblx0XHRcdCAqL1xuXHRcdFx0ZnVuY3Rpb24gY3JlYXRlVGVzdEVsZW1lbnQgKGZvdW5kU3RyKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdGVzdEVsbSA9IG51bGw7XG5cblx0XHRcdFx0dHJ5XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgb2JqID0gZm91bmRTdHI7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChmb3VuZFN0cikgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRvYmogPSBKU09OLnBhcnNlIChmb3VuZFN0cik7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChvYmopID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9iaik7XG5cblx0XHRcdFx0XHRpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqWzBdLCBvYmpbMV0sIG9ialsyXSk7XG5cblx0XHRcdFx0XHRpZiAob2JqW1wibmFtZVwiXSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0dGVzdEVsbSA9IG5ldyBIb3QuSG90VGVzdEVsZW1lbnQgKG9iaik7XG5cblx0XHRcdFx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnRlc3RFbGVtZW50c1t0ZXN0RWxtLm5hbWVdICE9IG51bGwpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFxcYFRlc3QgZWxlbWVudCBcXCR7dGVzdEVsbS5uYW1lfSBhbHJlYWR5IGV4aXN0cyFcXGApO1xuXG5cdFx0XHRcdFx0SG90LkN1cnJlbnRQYWdlLmFkZFRlc3RFbGVtZW50ICh0ZXN0RWxtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXRjaCAoZXgpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFxuXHRcdFx0XFxgRXJyb3IgcHJvY2Vzc2luZyB0ZXN0IGVsZW1lbnQgXFwke2ZvdW5kU3RyfSBpbiBcXCR7SG90LkN1cnJlbnRQYWdlLm5hbWV9LiBFcnJvcjogXFwke2V4Lm1lc3NhZ2V9XFxgXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuICh0ZXN0RWxtKTtcblx0XHRcdH1cblxuXHRcdFx0YXN5bmMgZnVuY3Rpb24gcnVuQ29udGVudCAoQ3VycmVudEhvdEZpbGUpXG5cdFx0XHR7XFxuYDtcblx0XHRcdGV4ZWN1dGlvbkNvbnRlbnQgKz0gb3V0cHV0O1xuXHRcdFx0ZXhlY3V0aW9uQ29udGVudCArPSBgXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAocnVuQ29udGVudCAoUGFzc2VkSG90RmlsZSkudGhlbiAoKCkgPT5cblx0XHRcdHtcblx0XHRcdFx0cmV0dXJuICh7XG5cdFx0XHRcdFx0XHRob3Q6IEhvdCxcblx0XHRcdFx0XHRcdG91dHB1dDogSG90Lk91dHB1dCxcblx0XHRcdFx0XHRcdGRhdGE6IEpTT04uc3RyaW5naWZ5IChIb3QuRGF0YSlcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pKTtgO1xuXG5cdFx0XHQvLy8gQGZpeG1lIFByaW9yIHRvIGV4ZWN1dGlvbiBjb21waWxlIGFueSBUeXBlU2NyaXB0IGFuZCBtYWtlIGl0IEVTNSBjb21wYXRpYmxlLlxuXHRcdFx0bGV0IGZ1bmM6IEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uIChleGVjdXRpb25Db250ZW50KTtcblx0XHRcdHJldHVybmVkT3V0cHV0ID0gYXdhaXQgZnVuYy5hcHBseSAodGhpcywgW0hvdCwgdGhpc10pO1xuXHRcdH1cblx0XHRjYXRjaCAoZXgpXG5cdFx0e1xuXHRcdFx0aWYgKGV4IGluc3RhbmNlb2YgU3ludGF4RXJyb3IpXG5cdFx0XHR7XG5cdFx0XHRcdC8vLyBAZml4bWUgUHV0IHdoYXQncyBpbiB0aGUgY29udGVudCB2YXJpYWJsZSBpbnRvIGEgcHJldiBjb250ZW50IHZhcmlhYmxlP1xuXHRcdFx0XHQvLy8gVGhlbiBvbmNlIHRoZXJlJ3Mgbm8gbG9uZ2VyIGFueSBzeW50YXggZXJyb3JzIGJlaW5nIHRocm93biwgZXhlY3V0ZSB0aGUgXG5cdFx0XHRcdC8vLyBjb2RlPyBUaGlzIHdvdWxkIGFsc28gcmVxdWlyZSBzYXZpbmcgYW55IEhUTUwgb3V0c2lkZSBvZiB0aGUgKj4gYW5kIDwqIFxuXHRcdFx0XHQvLy8gdGhlbiBlY2hvaW5nIGl0IG91dC4gVGhlIHRocm93IGJlbG93IHdvdWxkIGhhdmUgdG8gYmUgcmVtb3ZlZCBhcyB3ZWxsLlxuXHRcdFx0XHR0aHJvdyBleDtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhyb3cgZXg7XG5cdFx0fVxuXG5cdFx0SG90LkRhdGEgPSByZXR1cm5lZE91dHB1dC5ob3QuRGF0YTtcblx0XHRsZXQgZmluYWxPdXRwdXQ6IHN0cmluZyA9IHJldHVybmVkT3V0cHV0Lm91dHB1dDtcblx0XHRIb3QuT3V0cHV0ID0gXCJcIjtcblx0XHRIb3QuQXJndW1lbnRzID0gdGVtcEFyZ3M7XG5cblx0XHRyZXR1cm4gKGZpbmFsT3V0cHV0KTtcblx0fVxufSIsIi8qKlxuICogVGhlIGxvZ2dpbmcgbGV2ZWwuXG4gKi9cbmV4cG9ydCBlbnVtIEhvdExvZ0xldmVsXG57XG5cdC8qKlxuXHQgKiBQcmludHMgb25seSBpbmZvIG1lc3NhZ2VzLlxuXHQgKi9cblx0SW5mbyxcblx0LyoqXG5cdCAqIFByaW50cyBvbmx5IHdhcm5pbmcgbWVzc2FnZXMuXG5cdCAqL1xuXHRXYXJuaW5nLFxuXHQvKipcblx0ICogUHJpbnRzIG9ubHkgZXJyb3IgbWVzc2FnZXMuXG5cdCAqL1xuXHRFcnJvcixcblx0LyoqXG5cdCAqIFByaW50cyBhbGwgbWVzc2FnZXMuXG5cdCAqL1xuXHRWZXJib3NlLFxuXHQvKipcblx0ICogUHJpbnRzIGFsbCBtZXNzYWdlcywgZXhjZXB0IHZlcmJvc2UuXG5cdCAqL1xuXHRBbGwsXG5cdC8qKlxuXHQgKiBEb2Vzbid0IHByaW50IGFueSBtZXNzYWdlLlxuXHQgKi9cblx0Tm9uZVxufVxuXG4vKipcbiAqIFRoZSBsb2dnZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RMb2dcbntcblx0LyoqXG5cdCAqIFRoZSBsb2dnaW5nIGxldmVsLlxuXHQgKi9cblx0bG9nTGV2ZWw6IEhvdExvZ0xldmVsO1xuXHQvKipcblx0ICogU2hvdyB0aGUgcmVzcG9uc2VzIHRvIGVhY2ggcmVxdWVzdC5cblx0ICovXG5cdHNob3dSZXNwb25zZXM6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBTaG93IHRoZSBIVFRQIGV2ZW50cy5cblx0ICovXG5cdHNob3dIVFRQRXZlbnRzOiBib29sZWFuO1xuXHQvKipcblx0ICogU2hvdyB0aGUgV2ViU29ja2V0IGV2ZW50cy5cblx0ICovXG5cdHNob3dXZWJTb2NrZXRFdmVudHM6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKGxvZ0xldmVsOiBIb3RMb2dMZXZlbCA9IEhvdExvZ0xldmVsLkFsbClcblx0e1xuXHRcdHRoaXMubG9nTGV2ZWwgPSBsb2dMZXZlbDtcblx0XHR0aGlzLnNob3dSZXNwb25zZXMgPSBmYWxzZTtcblx0XHR0aGlzLnNob3dIVFRQRXZlbnRzID0gZmFsc2U7XG5cdFx0dGhpcy5zaG93V2ViU29ja2V0RXZlbnRzID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2UgdGhlIGxvZ2dpbmcgbGV2ZWwuXG5cdCAqL1xuXHRzdGF0aWMgcGFyc2UgKGxvZ0xldmVsOiBzdHJpbmcpOiBIb3RMb2dMZXZlbFxuXHR7XG5cdFx0bGV0IGxldmVsOiBIb3RMb2dMZXZlbCA9IEhvdExvZ0xldmVsLkFsbDtcblxuXHRcdGlmIChsb2dMZXZlbCA9PT0gXCJpbmZvXCIpXG5cdFx0XHRsZXZlbCA9IEhvdExvZ0xldmVsLkluZm87XG5cblx0XHRpZiAobG9nTGV2ZWwgPT09IFwid2FybmluZ1wiKVxuXHRcdFx0bGV2ZWwgPSBIb3RMb2dMZXZlbC5XYXJuaW5nO1xuXG5cdFx0aWYgKGxvZ0xldmVsID09PSBcImVycm9yXCIpXG5cdFx0XHRsZXZlbCA9IEhvdExvZ0xldmVsLkVycm9yO1xuXG5cdFx0aWYgKGxvZ0xldmVsID09PSBcInZlcmJvc2VcIilcblx0XHRcdGxldmVsID0gSG90TG9nTGV2ZWwuVmVyYm9zZTtcblxuXHRcdGlmIChsb2dMZXZlbCA9PT0gXCJhbGxcIilcblx0XHRcdGxldmVsID0gSG90TG9nTGV2ZWwuQWxsO1xuXG5cdFx0aWYgKGxvZ0xldmVsID09PSBcIm5vbmVcIilcblx0XHRcdGxldmVsID0gSG90TG9nTGV2ZWwuTm9uZTtcblxuXHRcdHJldHVybiAobGV2ZWwpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIG1lc3NhZ2UuXG5cdCAqL1xuXHRsb2cgKGxldmVsOiBIb3RMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpXG5cdFx0e1xuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcilcblx0XHRcdFx0dGhpcy5lcnJvciAobWVzc2FnZSk7XG5cblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHRcdFx0dGhpcy53YXJuaW5nIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbykgfHwgXG5cdFx0XHRcdChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkpXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbClcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdFx0XHR0aGlzLmVycm9yIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKVxuXHRcdFx0XHR0aGlzLndhcm5pbmcgKG1lc3NhZ2UpO1xuXG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pXG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuRXJyb3IpXG5cdFx0XHRcdHRoaXMuZXJyb3IgKG1lc3NhZ2UpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5XYXJuaW5nKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHRcdFx0dGhpcy53YXJuaW5nIChtZXNzYWdlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuSW5mbylcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pXG5cdFx0XHRcdHRoaXMuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIHZlcmJvc2UgbWVzc2FnZS5cblx0ICovXG5cdHZlcmJvc2UgKG1lc3NhZ2U6IHN0cmluZyB8IEZ1bmN0aW9uLCBkYXRhOiBhbnkgPSBudWxsKVxuXHR7XG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHR5cGVvZiAobWVzc2FnZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSAoZGF0YSkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2cgYSBtZXNzYWdlLlxuXHQgKi9cblx0aW5mbyAobWVzc2FnZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5BbGwpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pKVxuXHRcdHtcblx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhIHdhcm5pbmcuXG5cdCAqL1xuXHR3YXJuaW5nIChtZXNzYWdlOiBzdHJpbmcpXG5cdHtcblx0XHRpZiAoKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbCkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZykpXG5cdFx0e1xuXHRcdFx0Y29uc29sZS53YXJuIChtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9nIGFuIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRlcnJvciAobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IpXG5cdHtcblx0XHRpZiAoKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkFsbCkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSkgfHwgXG5cdFx0XHQodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuRXJyb3IpKVxuXHRcdHtcblx0XHRcdGxldCBtc2c6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdGlmICh0eXBlb2YgKG1lc3NhZ2UpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRtc2cgPSBtZXNzYWdlO1xuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAobWVzc2FnZS5tZXNzYWdlICE9IG51bGwpXG5cdFx0XHRcdFx0bXNnID0gbWVzc2FnZS5tZXNzYWdlO1xuXG5cdFx0XHRcdGlmIChtZXNzYWdlLnN0YWNrICE9IG51bGwpXG5cdFx0XHRcdFx0bXNnID0gbWVzc2FnZS5zdGFjaztcblx0XHRcdH1cblxuXHRcdFx0Y29uc29sZS5lcnJvciAobXNnKTtcblx0XHR9XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3QgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90QXNzZXQgfSBmcm9tIFwiLi9Ib3RBc3NldFwiO1xuaW1wb3J0IHsgSG90Q29tcG9uZW50LCBJSG90Q29tcG9uZW50IH0gZnJvbSBcIi4vSG90Q29tcG9uZW50XCI7XG5pbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuXG4vKipcbiAqIExvYWQgYSBtb2R1bGUgdGhhdCBjb250YWlucyB0aGUgYXNzZXRzIHRvIGxvYWQgZm9yIHRoZSBmcm9udGVuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdE1vZHVsZVxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBsaXN0IG9mIE5QTSBtb2R1bGVzIHRvIGltcG9ydC5cblx0ICovXG5cdGltcG9ydD86IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIEhUTUwgZmlsZXMgdG8gbG9hZC5cblx0ICovXG5cdGh0bWw/OiAoc3RyaW5nIHwgSG90QXNzZXQpW107XG5cdC8qKlxuXHQgKiBUaGUgQ1NTIGZpbGVzIHRvIGxvYWQuXG5cdCAqL1xuXHRjc3M/OiAoc3RyaW5nIHwgSG90QXNzZXQpW107XG5cdC8qKlxuXHQgKiBUaGUgSlMgZmlsZXMgdG8gbG9hZC5cblx0ICovXG5cdGpzPzogKHN0cmluZyB8IEhvdEFzc2V0KVtdO1xuXHQvKipcblx0ICogVGhlIGV4cG9ydGVkIGNvbXBvbmVudCBsaWJyYXJ5IHRoYXQgY29udGFpbnMgYWxsIHRoZSBjb21wb25lbnRzIHRvIGxvYWQuXG5cdCAqL1xuXHRjb21wb25lbnRMaWJyYXJ5Pzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbXBvbmVudHMgdG8gbG9hZC5cblx0ICovXG5cdGNvbXBvbmVudHM/OiAobmV3IChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpW107XG5cblx0Y29uc3RydWN0b3IgKG5hbWU6IHN0cmluZylcblx0e1xuXHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdFx0dGhpcy5pbXBvcnQgPSBbXTtcblx0XHR0aGlzLmh0bWwgPSBbXTtcblx0XHR0aGlzLmNzcyA9IFtdO1xuXHRcdHRoaXMuanMgPSBbXTtcblx0XHR0aGlzLmNvbXBvbmVudExpYnJhcnkgPSBcIlwiO1xuXHRcdHRoaXMuY29tcG9uZW50cyA9IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIE91dHB1dCBDU1MuXG5cdCAqL1xuXHRvdXRwdXRDU1MgKGVjaG9PdXQ6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nXG5cdHtcblx0XHRpZiAodGhpcy5jc3MgPT0gbnVsbClcblx0XHRcdHJldHVybjtcblxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHR0aGlzLm91dHB1dEFzc2V0IChcImNzc1wiLCB0aGlzLmNzcywgKGFzc2V0OiBIb3RBc3NldCkgPT5cblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgY29udGVudDogc3RyaW5nIHwgYW55ID0gYXNzZXQub3V0cHV0ICgpO1xuXHRcdFx0XHRvdXRwdXQgKz0gYCR7Y29udGVudH1cXG5gO1xuXHRcdFx0fSk7XG5cblx0XHRpZiAoZWNob091dCA9PT0gdHJ1ZSlcblx0XHRcdEhvdC5lY2hvIChvdXRwdXQpO1xuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE91dHB1dCBKUy5cblx0ICovXG5cdG91dHB1dEpTIChlY2hvT3V0OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZ1xuXHR7XG5cdFx0aWYgKHRoaXMuanMgPT0gbnVsbClcblx0XHRcdHJldHVybjtcblxuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHR0aGlzLm91dHB1dEFzc2V0IChcImpzXCIsIHRoaXMuanMsIChhc3NldDogSG90QXNzZXQpID0+XG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IGNvbnRlbnQ6IHN0cmluZyB8IGFueSA9IGFzc2V0Lm91dHB1dCAoKTtcblx0XHRcdFx0b3V0cHV0ICs9IGAke2NvbnRlbnR9XFxuYDtcblx0XHRcdH0pO1xuXG5cdFx0aWYgKGVjaG9PdXQgPT09IHRydWUpXG5cdFx0XHRIb3QuZWNobyAob3V0cHV0KTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPdXRwdXQgYSBsb2FkZWQgSFRNTCBhc3NldC5cblx0ICovXG5cdGFzeW5jIG91dHB1dCAoYXNzZXROYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGF3YWl0IEhvdC5pbmNsdWRlIChgJHt0aGlzLm5hbWV9LyR7YXNzZXROYW1lfS5ob3R0YCwgYXJncyk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBIVE1MIGFzc2V0cy5cblx0ICovXG5cdGFzeW5jIGxvYWRIVE1MICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRpZiAodGhpcy5odG1sID09IG51bGwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRsZXQgZmlsZXM6IGFueSA9IHt9O1xuXG5cdFx0dGhpcy5vdXRwdXRBc3NldCAoXCJodG1sXCIsIHRoaXMuaHRtbCwgKGFzc2V0OiBIb3RBc3NldCkgPT5cblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgZmlsZSA9IGFzc2V0Lm91dHB1dCAoKTtcblxuXHRcdFx0XHRpZiAodHlwZW9mIChmaWxlKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIVE1MIGFzc2V0cyBjYW5ub3QgYmUgb3V0cHV0dGVkIHVzaW5nIG9ubHkgYSBzdHJpbmchYCk7XG5cblx0XHRcdFx0ZmlsZXNbZmlsZS5uYW1lXSA9IGZpbGU7XG5cdFx0XHR9KTtcblxuXHRcdGF3YWl0IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IubG9hZEhvdEZpbGVzIChmaWxlcyk7XG5cdH1cblxuXHQvKipcblx0ICogT3V0cHV0IGNvbXBvbmVudHMgYXNzZXRzLlxuXHQgKi9cblx0b3V0cHV0Q29tcG9uZW50cyAoZWNob091dDogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmdcblx0e1xuXHRcdGlmICh0aGlzLmNvbXBvbmVudHMgPT0gbnVsbClcblx0XHRcdHJldHVybiAoXCJcIik7XG5cblx0XHRpZiAodGhpcy5jb21wb25lbnRzLmxlbmd0aCA8IDEpXG5cdFx0XHRyZXR1cm4gKFwiXCIpO1xuXG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gYDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+YDtcblx0XHRsZXQgY29tcG9uZW50TGlicmFyeTogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLmNvbXBvbmVudExpYnJhcnkgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jb21wb25lbnRMaWJyYXJ5ICE9PSBcIlwiKVxuXHRcdFx0XHRjb21wb25lbnRMaWJyYXJ5ID0gYCR7dGhpcy5jb21wb25lbnRMaWJyYXJ5fS5gO1xuXHRcdH1cblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5jb21wb25lbnRzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbaUlkeF07XG5cblx0XHRcdG91dHB1dCArPSBgSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5hZGRDb21wb25lbnQgKCR7Y29tcG9uZW50TGlicmFyeX0ke2NvbXBvbmVudH0pO1xcbmA7XG5cdFx0fVxuXG5cdFx0b3V0cHV0ICs9IGA8L3NjcmlwdD5gO1xuXG5cdFx0aWYgKGVjaG9PdXQgPT09IHRydWUpXG5cdFx0XHRIb3QuZWNobyAob3V0cHV0KTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPdXRwdXQgYW4gYXNzZXQgdG8gSFRNTC5cblx0ICovXG5cdHByb3RlY3RlZCBvdXRwdXRBc3NldCAoYXNzZXRUeXBlOiBzdHJpbmcsIGFzc2V0czogKHN0cmluZyB8IEhvdEFzc2V0KVtdID0gW10sIFxuXHRcdGNhbGxiYWNrOiAoYXNzZXQ6IEhvdEFzc2V0KSA9PiB2b2lkKTogdm9pZFxuXHR7XG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBhc3NldHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGFzc2V0OiBzdHJpbmcgfCBIb3RBc3NldCA9IGFzc2V0c1tpSWR4XTtcblx0XHRcdGxldCBsb2FkQXNzZXQ6IEhvdEFzc2V0ID0gbnVsbDtcblx0XHRcdGxvYWRBc3NldCA9IG5ldyBIb3RBc3NldCAoYXNzZXRUeXBlKTtcblxuXHRcdFx0aWYgKHR5cGVvZiAoYXNzZXQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRsb2FkQXNzZXQucGF0aCA9IGFzc2V0O1xuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoYXNzZXQubmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdGxvYWRBc3NldC5uYW1lID0gYXNzZXQubmFtZTtcblxuXHRcdFx0XHRpZiAoYXNzZXQucGF0aCAhPSBudWxsKVxuXHRcdFx0XHRcdGxvYWRBc3NldC5wYXRoID0gYXNzZXQucGF0aDtcblxuXHRcdFx0XHRpZiAoYXNzZXQuY29udGVudCAhPSBudWxsKVxuXHRcdFx0XHRcdGxvYWRBc3NldC5jb250ZW50ID0gYXNzZXQuY29udGVudDtcblx0XHRcdH1cblxuXHRcdFx0Y2FsbGJhY2sgKGxvYWRBc3NldCk7XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgSG90IH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90VGVzdEVsZW1lbnQgfSBmcm9tIFwiLi9Ib3RUZXN0RWxlbWVudFwiO1xuaW1wb3J0IHsgSG90VGVzdE1hcCwgSG90VGVzdFBhdGggfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5pbXBvcnQgeyBIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcblxuLyoqXG4gKiBBIHBhZ2UgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90UGFnZVxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcm91dGUgdXNlZCB0byBnZXQgdG8gdGhpcyBwYWdlLlxuXHQgKi9cblx0cm91dGU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyBhZGRlZCB0byB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRjb21wb25lbnRzPzogeyBbbmFtZTogc3RyaW5nXTogSG90Q29tcG9uZW50IH07XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS4gRmlsZSBvcmRlcmluZyBtYXR0ZXJzIGhlcmUuXG5cdCAqIEV2ZXJ5IGZpbGUgaXMgcHJvY2Vzc2VkIGluY3JlbWVudGFsbHkuXG5cdCAqL1xuXHRmaWxlcz86IEhvdEZpbGVbXTtcblx0LyoqXG5cdCAqIFRoZSBmdW5jdGlvbnMgdG8gZXhlY3V0ZSBsYXRlci5cblx0ICovXG5cdGZ1bmN0aW9ucz86IHsgW25hbWU6IHN0cmluZ106IEZ1bmN0aW9uOyB9O1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG1hcC5cblx0ICovXG5cdHRlc3Rlck1hcD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBlbGVtZW50cyB0byB0ZXN0IG9uIHRoaXMgcGFnZS5cblx0ICovXG5cdHRlc3RFbGVtZW50cz86IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RFbGVtZW50OyB9O1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGF0aHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0UGF0aHM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcbn1cblxuLyoqXG4gKiBBIHBhZ2UgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFBhZ2UgaW1wbGVtZW50cyBJSG90UGFnZVxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZSB1c2VkIHRvIGdldCB0byB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRyb3V0ZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbXBvbmVudHMgYWRkZWQgdG8gdGhpcyBwYWdlLlxuXHQgKi9cblx0Y29tcG9uZW50czogeyBbbmFtZTogc3RyaW5nXTogSG90Q29tcG9uZW50IH07XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS4gRmlsZSBvcmRlcmluZyBtYXR0ZXJzIGhlcmUuXG5cdCAqIEV2ZXJ5IGZpbGUgaXMgcHJvY2Vzc2VkIGluY3JlbWVudGFsbHkuXG5cdCAqL1xuXHRmaWxlczogSG90RmlsZVtdO1xuXHQvKipcblx0ICogVGhlIGZ1bmN0aW9ucyB0byBleGVjdXRlIGxhdGVyLlxuXHQgKi9cblx0ZnVuY3Rpb25zOiB7IFtuYW1lOiBzdHJpbmddOiBGdW5jdGlvbjsgfTtcblx0LyoqXG5cdCAqIFRoZSBhc3NvY2lhdGVkIHRlc3RlciBuYW1lLlxuXHQgKi9cblx0dGVzdGVyTmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG1hcC5cblx0ICovXG5cdHRlc3Rlck1hcDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGVsZW1lbnRzIHRvIHRlc3Qgb24gdGhpcyBwYWdlLlxuXHQgKi9cblx0dGVzdEVsZW1lbnRzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0RWxlbWVudDsgfTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0IHBhdGhzIHRvIHRlc3Qgb24gdGhpcyBwYWdlLlxuXHQgKi9cblx0dGVzdFBhdGhzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdFBhZ2UgfCBIb3RTdGFxKVxuXHR7XG5cdFx0aWYgKGNvcHkgaW5zdGFuY2VvZiBIb3RTdGFxKVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gY29weTtcblx0XHRcdHRoaXMubmFtZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnRlc3Rlck5hbWUgPSBcIkhvdFRlc3Rlck1vY2hhU2VsZW5pdW1cIjtcblx0XHRcdHRoaXMudGVzdGVyTWFwID0gXCJcIjtcblx0XHRcdHRoaXMucm91dGUgPSBcIlwiO1xuXHRcdFx0dGhpcy5jb21wb25lbnRzID0ge307XG5cdFx0XHR0aGlzLmZpbGVzID0gW107XG5cdFx0XHR0aGlzLmZ1bmN0aW9ucyA9IHt9O1xuXHRcdFx0dGhpcy50ZXN0RWxlbWVudHMgPSB7fTtcblx0XHRcdHRoaXMudGVzdFBhdGhzID0ge307XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLnByb2Nlc3NvciA9IGNvcHkucHJvY2Vzc29yO1xuXHRcdFx0dGhpcy5uYW1lID0gY29weS5uYW1lIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnRlc3Rlck5hbWUgPSBjb3B5LnRlc3Rlck5hbWUgfHwgXCJIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtXCI7XG5cdFx0XHR0aGlzLnRlc3Rlck1hcCA9IGNvcHkudGVzdGVyTWFwIHx8IFwiXCI7XG5cdFx0XHR0aGlzLnJvdXRlID0gY29weS5yb3V0ZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy5jb21wb25lbnRzID0gY29weS5jb21wb25lbnRzIHx8IHt9O1xuXHRcdFx0dGhpcy5maWxlcyA9IGNvcHkuZmlsZXMgfHwgW107XG5cdFx0XHR0aGlzLmZ1bmN0aW9ucyA9IGNvcHkuZnVuY3Rpb25zIHx8IHt9O1xuXHRcdFx0dGhpcy50ZXN0RWxlbWVudHMgPSBjb3B5LnRlc3RFbGVtZW50cyB8fCB7fTtcblx0XHRcdHRoaXMudGVzdFBhdGhzID0gY29weS50ZXN0UGF0aHMgfHwge307XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGZpbGUgdG8gcHJvY2Vzcy4gSXQncyByZWNvbW1lbmQgdG8gbG9hZCB0aGUgZmlsZSBwcmlvciB0byBcblx0ICogYWRkaW5nIGl0IHRvIGEgcGFnZSBpZiBpdCdzIGFib3V0IHRvIGJlIHVzZWQuXG5cdCAqL1xuXHRhc3luYyBhZGRGaWxlIChmaWxlOiBIb3RGaWxlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0ZmlsZS5wYWdlID0gdGhpcztcblxuXHRcdHRoaXMuZmlsZXMucHVzaCAoZmlsZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBBUEkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS5cblx0ICovXG5cdGdldEFQSSAoKTogSG90QVBJXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucHJvY2Vzc29yLmFwaSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSB0ZXN0ZXIgQVBJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRnZXRUZXN0ZXJBUEkgKCk6IEhvdEFQSVxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLnByb2Nlc3Nvci50ZXN0ZXJBUEkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbGwgZmlsZXMgaW4gdGhlIHBhZ2UuIENvdWxkIGRlY3JlYXNlIHBhZ2UgbG9hZGluZyBwZXJmb3JtYW5jZS5cblx0ICogSXQncyByZWNvbW1lbmQgdG8gbG9hZCB0aGUgZmlsZSBwcmlvciB0byBhZGRpbmcgaXQgdG8gYSBwYWdlLlxuXHQgKi9cblx0YXN5bmMgbG9hZCAoZmlsZTogSG90RmlsZSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWxlcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IHRoaXMuZmlsZXNbaUlkeF07XG5cblx0XHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHBhZ2UgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAoYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWxlcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IHRoaXMuZmlsZXNbaUlkeF07XG5cblx0XHRcdEhvdC5PdXRwdXQgPSBcIlwiO1xuXHRcdFx0ZmlsZS5wYWdlID0gdGhpcztcblxuXHRcdFx0b3V0cHV0ICs9IGF3YWl0IGZpbGUucHJvY2VzcyAoYXJncyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgbGF0ZXIuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBUaGUgbmV3IGZ1bmN0aW9uJ3MgbmFtZS5cblx0ICovXG5cdGFkZEZ1bmN0aW9uIChuYW1lOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBmdW5jQm9keTogc3RyaW5nLCBpc0FzeW5jOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmdcblx0e1xuXHRcdGlmIChuYW1lID09IG51bGwpXG5cdFx0XHRuYW1lID0gXCJfX2Z1bmNcIiArIE9iamVjdC5rZXlzICh0aGlzLmZ1bmN0aW9ucykubGVuZ3RoO1xuXG5cdFx0bGV0IGFyZ3NTdHI6IHN0cmluZyA9IFwiXCI7XG5cdFx0bGV0IGFzeW5jU3RyOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKGlzQXN5bmMgPT09IHRydWUpXG5cdFx0XHRhc3luY1N0ciA9IFwiYXN5bmMgXCI7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGFyZ3MubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0Y29uc3QgYXJnOiBzdHJpbmcgPSBhcmdzW2lJZHhdO1xuXHRcdFx0bGV0IGNvbW1hOiBzdHJpbmcgPSBcIixcIjtcblxuXHRcdFx0aWYgKGlJZHggPT0gYXJncy5sZW5ndGggLSAxKVxuXHRcdFx0XHRjb21tYSA9IFwiXCI7XG5cblx0XHRcdGFyZ3NTdHIgKz0gYCR7YXJnfSR7Y29tbWF9YDtcblx0XHR9XG5cblx0XHR0aGlzLmZ1bmN0aW9uc1tuYW1lXSA9IG5ldyBGdW5jdGlvbiAoYHJldHVybiAoJHthc3luY1N0cn0oJHthcmdzU3RyfSkgPT4geyAke2Z1bmNCb2R5fSB9KS5hcHBseSAodGhpcywgYXJndW1lbnRzKTtgKTtcblxuXHRcdHJldHVybiAobmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbHMgYSBmdW5jdGlvbiB0aGF0J3MgYmVlbiBzdG9yZWQgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cblx0ICovXG5cdGNhbGxGdW5jdGlvbiAodGhpc09iajogYW55LCBuYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogYW55XG5cdHtcblx0XHRsZXQgZnVuYzogRnVuY3Rpb24gPSB0aGlzLmZ1bmN0aW9uc1tuYW1lXTtcblxuXHRcdGlmIChmdW5jID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBGdW5jdGlvbiAke25hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0cmV0dXJuIChmdW5jLmFwcGx5ICh0aGlzT2JqLCBhcmdzKSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbHMgYW4gYXN5bmMgZnVuY3Rpb24gdGhhdCdzIGJlZW4gc3RvcmVkIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRhc3luYyBjYWxsQXN5bmNGdW5jdGlvbiAodGhpc09iajogYW55LCBuYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgZnVuYzogRnVuY3Rpb24gPSB0aGlzLmZ1bmN0aW9uc1tuYW1lXTtcblxuXHRcdGlmIChmdW5jID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBGdW5jdGlvbiAke25hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0cmV0dXJuIChmdW5jLmFwcGx5ICh0aGlzT2JqLCBhcmdzKSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgdGVzdCBlbGVtZW50LlxuXHQgKi9cblx0YWRkVGVzdEVsZW1lbnQgKGVsbTogSG90VGVzdEVsZW1lbnQpOiB2b2lkXG5cdHtcblx0XHRpZiAodGhpcy50ZXN0RWxlbWVudHNbZWxtLm5hbWVdICE9IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IGVsZW1lbnQgJHtlbG0ubmFtZX0gYWxyZWFkeSBleGlzdHMhYCk7XG5cblx0XHR0aGlzLnRlc3RFbGVtZW50c1tlbG0ubmFtZV0gPSBlbG07XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdGVzdCBlbGVtZW50LlxuXHQgKi9cblx0Z2V0VGVzdEVsZW1lbnQgKG5hbWU6IHN0cmluZyk6IEhvdFRlc3RFbGVtZW50XG5cdHtcblx0XHRpZiAodGhpcy50ZXN0RWxlbWVudHNbbmFtZV0gPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgZWxlbWVudCAke25hbWV9IGRvZXN0IG5vdCBleGlzdCFgKTtcblxuXHRcdHJldHVybiAodGhpcy50ZXN0RWxlbWVudHNbbmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHRlc3QgcGF0aC5cblx0ICovXG5cdGNyZWF0ZVRlc3RQYXRoIChwYXRoTmFtZTogc3RyaW5nLCBkcml2ZXJGdW5jOiBIb3RUZXN0UGF0aCk6IHZvaWRcblx0e1xuXHRcdGlmICh0aGlzLnRlc3RQYXRoc1twYXRoTmFtZV0gIT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgcGF0aCAke3BhdGhOYW1lfSBhbHJlYWR5IGV4aXN0cyFgKTtcblxuXHRcdHRoaXMudGVzdFBhdGhzW3BhdGhOYW1lXSA9IGRyaXZlckZ1bmM7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBIb3RFdmVudE1ldGhvZCwgSUhvdFJvdXRlTWV0aG9kLCBcblx0U2VydmVyRXhlY3V0aW9uRnVuY3Rpb24sIFRlc3RDYXNlRnVuY3Rpb24sIFRlc3RDYXNlT2JqZWN0LCBTZXJ2ZXJSZXF1ZXN0IH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90TG9nIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5cbi8qKlxuICogVGhlIHJvdXRlIHRvIHVzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFJvdXRlXG57XG5cdC8qKlxuXHQgKiBUaGUgc2VydmVyIHRoYXQgbWFpbnRhaW5zIHRoZSBjb25uZWN0aW9ucy5cblx0ICovXG5cdGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudDtcblx0LyoqXG5cdCAqIFRoZSBhc3NvY2lhdGVkIGxvZ2dlci5cblx0ICovXG5cdGxvZ2dlcjogSG90TG9nO1xuXHQvKipcblx0ICogVGhlIHJvdXRlLlxuXHQgKi9cblx0cm91dGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuXG5cdCAqL1xuXHRkZXNjcmlwdGlvbjogc3RyaW5nO1xuXHQvKipcblx0ICogQWRkaXRpb25hbCBPcGVuQVBJIGluZm9ybWF0aW9uLiBBbnl0aGluZyBhZGRlZCBoZXJlIHdpbGwgYmUgYXV0b21lcmdlZCBpbi5cblx0ICovXG5cdG9wZW5BUEk6IGFueTtcblx0LyoqXG5cdCAqIFRoZSB2ZXJzaW9uLlxuXHQgKi9cblx0dmVyc2lvbjogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHByZWZpeCB0byBhZGQgdG8gdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJvdXRlIG1ldGhvZC5cblx0ICovXG5cdHByZWZpeDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNhbGxzIHRoYXQgY2FuIGJlIG1hZGUuXG5cdCAqL1xuXHRtZXRob2RzOiBIb3RSb3V0ZU1ldGhvZFtdO1xuXHQvKipcblx0ICogVGhlIGVycm9ycyBhbmQgdGhlaXIgSlNPTiB0aGF0IGNhbiBiZSB0aHJvd24uIENhbiBiZTpcblx0ICogKiBub3RfYXV0aG9yaXplZFxuXHQgKiAqIG5vX3NlcnZlcl9leGVjdXRlX2Z1bmN0aW9uXG5cdCAqL1xuXHRlcnJvcnM6IHsgW2Vycm9yOiBzdHJpbmddOiBhbnkgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50LCByb3V0ZTogc3RyaW5nLCBtZXRob2RzOiBIb3RSb3V0ZU1ldGhvZFtdID0gW10pXG5cdHtcblx0XHR0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXHRcdHRoaXMubG9nZ2VyID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uLnByb2Nlc3NvciAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLmxvZ2dlciA9IHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IubG9nZ2VyO1xuXHRcdH1cblxuXHRcdHRoaXMucm91dGUgPSByb3V0ZTtcblx0XHR0aGlzLmRlc2NyaXB0aW9uID0gXCJcIjtcblx0XHR0aGlzLm9wZW5BUEkgPSBudWxsO1xuXHRcdHRoaXMudmVyc2lvbiA9IFwidjFcIjtcblx0XHR0aGlzLnByZWZpeCA9IFwiXCI7XG5cdFx0dGhpcy5tZXRob2RzID0gbWV0aG9kcztcblx0XHR0aGlzLmVycm9ycyA9IHtcblx0XHRcdFx0XCJub3RfYXV0aG9yaXplZFwiOiBIb3RSb3V0ZS5jcmVhdGVFcnJvciAoXCJOb3QgYXV0aG9yaXplZC5cIiksXG5cdFx0XHRcdFwibm9fc2VydmVyX2V4ZWN1dGVfZnVuY3Rpb25cIjogSG90Um91dGUuY3JlYXRlRXJyb3IgKFwiTWlzc2luZyBzZXJ2ZXIgZXhlY3V0ZSBmdW5jdGlvbi5cIiwgNTAwKSxcblx0XHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIGFuIGVycm9yIEpTT04gb2JqZWN0LlxuXHQgKi9cblx0c3RhdGljIGNyZWF0ZUVycm9yIChtZXNzYWdlOiBzdHJpbmcsIGVycm9yQ29kZTogbnVtYmVyID0gNDAwKTogYW55XG5cdHtcblx0XHRyZXR1cm4gKHsgZXJyb3I6IG1lc3NhZ2UsIGVycm9yQ29kZTogZXJyb3JDb2RlIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbiBBUEkgbWV0aG9kIHRvIHRoaXMgcm91dGUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbWV0aG9kIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gYWRkLiBJZiBhIEhvdFJvdXRlTWV0aG9kIGlzIHN1cHBsaWVkLCB0aGUgXG5cdCAqIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBzdXBwbGllZCB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqL1xuXHRhZGRNZXRob2QgKFxuXHRcdG1ldGhvZDogSG90Um91dGVNZXRob2QgfCBJSG90Um91dGVNZXRob2QgfCBzdHJpbmcsXG5cdFx0ZXhlY3V0ZUZ1bmN0aW9uOiBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiA9IG51bGwsXG5cdFx0dHlwZTogSG90RXZlbnRNZXRob2QgPSBIb3RFdmVudE1ldGhvZC5QT1NULFxuXHRcdHRlc3RDYXNlczogKHN0cmluZyB8IFRlc3RDYXNlRnVuY3Rpb24pW10gfCBUZXN0Q2FzZUZ1bmN0aW9uW10gfCBUZXN0Q2FzZU9iamVjdFtdID0gbnVsbFxuXHRcdCk6IEhvdFJvdXRlTWV0aG9kIHwgSUhvdFJvdXRlTWV0aG9kXG5cdHtcblx0XHRpZiAodHlwZW9mIChtZXRob2QpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0bWV0aG9kID0gSG90Um91dGVNZXRob2QuY3JlYXRlICh0aGlzLCBtZXRob2QsIGV4ZWN1dGVGdW5jdGlvbiwgdHlwZSwgbnVsbCwgbnVsbCwgdGVzdENhc2VzKTtcblxuXHRcdGlmIChtZXRob2QgaW5zdGFuY2VvZiBIb3RSb3V0ZU1ldGhvZClcblx0XHRcdHRoaXMubWV0aG9kcy5wdXNoIChtZXRob2QpO1xuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAobWV0aG9kLnJvdXRlID09IG51bGwpXG5cdFx0XHRcdG1ldGhvZC5yb3V0ZSA9IHRoaXM7XG5cblx0XHRcdG1ldGhvZCA9IEhvdFJvdXRlTWV0aG9kLmNyZWF0ZSAobWV0aG9kKTtcblx0XHRcdHRoaXMubWV0aG9kcy5wdXNoICgoPEhvdFJvdXRlTWV0aG9kPm1ldGhvZCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiAobWV0aG9kKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYSBtZXRob2QgYnkgaXQncyBuYW1lLlxuXHQgKi9cblx0Z2V0TWV0aG9kIChuYW1lOiBzdHJpbmcpOiBIb3RSb3V0ZU1ldGhvZFxuXHR7XG5cdFx0bGV0IGZvdW5kTWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IG51bGw7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMubWV0aG9kcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IHRoaXMubWV0aG9kc1tpSWR4XTtcblxuXHRcdFx0aWYgKG1ldGhvZC5uYW1lID09PSBuYW1lKVxuXHRcdFx0e1xuXHRcdFx0XHRmb3VuZE1ldGhvZCA9IG1ldGhvZDtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKGZvdW5kTWV0aG9kKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBiZWZvcmUgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUHJlUmVnaXN0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4gPSBudWxsO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBmaXJzdCByZWdpc3RlcmluZyB0aGlzIHJvdXRlIHdpdGggRXhwcmVzcy4gSWYgXG5cdCAqIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvdXRlIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+ID0gbnVsbDtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGFmdGVyIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblBvc3RSZWdpc3RlcjogKCkgPT4gUHJvbWlzZTx2b2lkPiA9IG51bGw7XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gYXV0aG9yaXppbmcgYSBjYWxsZWQgbWV0aG9kLlxuXHQgKiBUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBoZXJlIHdpbGwgYmUgcGFzc2VkIHRvIG9uRXhlY3V0ZSBpbiB0aGUgXG5cdCAqIGNhbGxlZCBIb3RSb3V0ZU1ldGhvZC4gVW5kZWZpbmVkIHJldHVybmluZyBmcm9tIGhlcmUgd2lsbCBtZWFuIFxuXHQgKiB0aGUgYXV0aG9yaXphdGlvbiBmYWlsZWQuXG5cdCAqL1xuXHRvbkF1dGhvcml6ZVVzZXI6IChyZXE6IFNlcnZlclJlcXVlc3QpID0+IFByb21pc2U8YW55PiA9IG51bGw7XG59IiwiaW1wb3J0IHsgRGV2ZWxvcGVyTW9kZSB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFNlcnZlciwgSG90U2VydmVyVHlwZSB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuXG5pbXBvcnQgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHsgSG90V2ViU29ja2V0U2VydmVyQ2xpZW50IH0gZnJvbSBcIi4vSG90V2ViU29ja2V0U2VydmVyQ2xpZW50XCI7XG5cbi8qKlxuICogVGhlIGF2YWlsYWJsZSBldmVudCBtZXRob2RzLlxuICovXG5leHBvcnQgZW51bSBIb3RFdmVudE1ldGhvZFxue1xuXHQvKipcblx0ICogQSBIVFRQIEdFVCByZXF1ZXN0LlxuXHQgKi9cblx0R0VUID0gXCJnZXRcIixcblx0LyoqXG5cdCAqIEEgSFRUUCBQT1NUIHJlcXVlc3QuXG5cdCAqL1xuXHRQT1NUID0gXCJwb3N0XCIsXG5cdC8qKlxuXHQgKiBUaGlzIHdpbGwgdXBsb2FkIGEgZmlsZSwgdGhlbiBwb3N0IHRoZSBqc29uIHJlcXVlc3QgYWZ0ZXJ3YXJkcy5cblx0ICovXG5cdEZJTEVfVVBMT0FEID0gXCJmaWxlX3VwbG9hZF90aGVuX3Bvc3RfanNvblwiLFxuXHQvKipcblx0ICogQSB3ZWJzb2NrZXQgZXZlbnQuXG5cdCAqL1xuXHRXRUJTT0NLRVRfQ0xJRU5UX1BVQl9FVkVOVCA9IFwid2Vic29ja2V0X2NsaWVudF9wdWJfZXZlbnRcIixcblx0LyoqXG5cdCAqIEhhbmRsZXMgYm90aCBhIEhUVFAgUE9TVCB3ZWJzb2NrZXQgZXZlbnQgcmVxdWVzdHMuXG5cdCAqL1xuXHRQT1NUX0FORF9XRUJTT0NLRVRfQ0xJRU5UX1BVQl9FVkVOVCA9IFwicG9zdF9hbmRfd2Vic29ja2V0X2NsaWVudF9wdWJfZXZlbnRcIlxufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHRoYXQgY2FtZSBmcm9tIGEgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTZXJ2ZXJSZXF1ZXN0XG57XG5cdC8qKlxuXHQgKiBUaGUgZXhwcmVzcyByZXF1ZXN0IHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC4gV2lsbCBiZSBzZXQgdG8gbnVsbCBpZiB1c2luZyB3b3JrZXIgXG5cdCAqIHRocmVhZHMgb3IgaWYgdGhpcyByZXF1ZXN0IHdhcyByZWNlaXZlZCBmcm9tIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRyZXE/OiBleHByZXNzLlJlcXVlc3Q7XG5cdC8qKlxuXHQgKiBUaGUgZXhwcmVzcyByZXNwb25zZSB0byBzZW5kIHRvIHRoZSBjbGllbnQuIFdpbGwgYmUgc2V0IHRvIG51bGwgaWYgdXNpbmcgd29ya2VyIFxuXHQgKiB0aHJlYWRzIG9yIGlmIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgZnJvbSBhIHdlYnNvY2tldCBjb25uZWN0aW9uLlxuXHQgKi9cblx0cmVzPzogZXhwcmVzcy5SZXNwb25zZTtcblx0LyoqXG5cdCAqIFRoZSBiZWFyZXIgdG9rZW4gYmVpbmcgcHJlc2VudGVkIGZyb20gdGhlIGNsaWVudCByZXF1ZXN0aW5nIGFjY2Vzcy5cblx0ICovXG5cdGJlYXJlclRva2VuPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNsaWVudCB3ZWJzb2NrZXQgdGhhdCB3YXMgdXNlZCB0byBzZW5kIHRoZSBtZXNzYWdlLiBXaWxsIGJlIHNldCB0byBudWxsIGlmIHVzaW5nIHdvcmtlciBcblx0ICogdGhyZWFkcyBvciBpZiB0aGlzIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIGZyb20gYSBIVFRQIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHR3c1NvY2tldD86IEhvdFdlYlNvY2tldFNlcnZlckNsaWVudDtcblx0LyoqXG5cdCAqIFRoZSByZXNwb25zZSByZWNlaXZlZCBmcm9tIHN1Y2Vzc2Z1bGx5IGF1dGhvcml6aW5nIGEgY2xpZW50LiBDYW4gYmUgYSBKV1QgdG9rZW4sIGFwaSBrZXksIGV0Yy5cblx0ICogV2lsbCBiZSBudWxsIGlmIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgZnJvbSBhIHdlYnNvY2tldCBjb25uZWN0aW9uLlxuXHQgKiBETyBOT1QgU1RPUkUgU0VOU0lUSVZFIElORk9STUFUSU9OIEhFUkUgU1VDSCBBUyBQQVNTV09SRFMuXG5cdCAqL1xuXHRhdXRob3JpemVkVmFsdWU/OiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgSlNPTiByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQuXG5cdCAqL1xuXHRqc29uT2JqPzogYW55O1xuXHQvKipcblx0ICogQW55IHF1ZXJ5IHZhcmlhYmxlcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQuIFdpbGwgYmUgbnVsbCBpZiB0aGlzIHJlcXVlc3Qgd2FzIFxuXHQgKiByZWNlaXZlZCBmcm9tIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRxdWVyeU9iaj86IGFueTtcblx0LyoqXG5cdCAqIEFueSBmaWxlcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQuIFdpbGwgYmUgbnVsbCBpZiBubyBmaWxlcyB3ZXJlIHNlbnQuXG5cdCAqIE9uY2UgYSBmaWxlIGlzIHVwbG9hZGVkLCB5b3UgY2FuIGFjY2VzcyBpdCBhdCB0aGUgdGVtcG9yYXJ5IHBhdGggZm91bmQgaW46IFxuXHQgKiBmaWxlc1t1cGxvYWRJZF0ucGF0aFxuXHQgKi9cblx0ZmlsZXM/OiB7XG5cdFx0W2tleTogc3RyaW5nXToge1xuXHRcdFx0bmFtZTogc3RyaW5nO1xuXHRcdFx0c2l6ZTogbnVtYmVyO1xuXHRcdFx0cGF0aDogc3RyaW5nO1xuXHRcdH1cblx0fTtcbn1cblxuLyoqXG4gKiBIb3cgZGF0YSBzaG91bGQgYmUgcGFzc2VkIHRocm91Z2ggdGhlIHNlcnZlciBleGVjdXRlIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBlbnVtIFBhc3NUeXBlXG57XG5cdC8qKlxuXHQgKiBBbnkgZGF0YSBzZXQgaW4ganNvbk9iaiB3aWxsIGltbWVkaWF0ZWx5IGJlIHBhc3NlZCB0byB0aGUgY2xpZW50IHdoZW4gXG5cdCAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucy5cblx0ICovXG5cdFJldHVyblRvQ2xpZW50LFxuXHQvKipcblx0ICogQW55IGRhdGEgYmVpbmcgc2V0IGluIGpzb25PYmogd2lsbCBiZSBwYXNzZWQgdG8gdGhlIG5leHQgc3RlcCBhZnRlciBcblx0ICogdGhpcyBmdW5jdGlvbiByZXR1cm5zLlxuXHQgKi9cblx0VXBkYXRlLFxuXHQvKipcblx0ICogSWdub3JlIGFueSBkYXRhIHNldCBpbiBqc29uT2JqLlxuXHQgKi9cblx0SWdub3JlXG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3QgdGhhdCBjYW1lIGZyb20gYSBjbGllbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJSZXF1ZXN0IGltcGxlbWVudHMgSVNlcnZlclJlcXVlc3Rcbntcblx0LyoqXG5cdCAqIFRoZSBleHByZXNzIHJlcXVlc3QgcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50LiBXaWxsIGJlIHNldCB0byBudWxsIGlmIHVzaW5nIHdvcmtlciBcblx0ICogdGhyZWFkcyBvciBpZiB0aGlzIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIGZyb20gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbi5cblx0ICovXG5cdHJlcTogZXhwcmVzcy5SZXF1ZXN0O1xuXHQvKipcblx0ICogVGhlIGV4cHJlc3MgcmVzcG9uc2UgdG8gc2VuZCB0byB0aGUgY2xpZW50LiBXaWxsIGJlIHNldCB0byBudWxsIGlmIHVzaW5nIHdvcmtlciBcblx0ICogdGhyZWFkcyBvciBpZiB0aGlzIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIGZyb20gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbi5cblx0ICovXG5cdHJlczogZXhwcmVzcy5SZXNwb25zZTtcblx0LyoqXG5cdCAqIFRoZSBiZWFyZXIgdG9rZW4gYmVpbmcgcHJlc2VudGVkIGZyb20gdGhlIGNsaWVudCByZXF1ZXN0aW5nIGFjY2Vzcy5cblx0ICovXG5cdGJlYXJlclRva2VuOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY2xpZW50IHdlYnNvY2tldCB0aGF0IHdhcyB1c2VkIHRvIHNlbmQgdGhlIG1lc3NhZ2UuIFdpbGwgYmUgc2V0IHRvIG51bGwgaWYgdXNpbmcgd29ya2VyIFxuXHQgKiB0aHJlYWRzIG9yIGlmIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgZnJvbSBhIEhUVFAgY29ubmVjdGlvbi5cblx0ICovXG5cdHdzU29ja2V0OiBIb3RXZWJTb2NrZXRTZXJ2ZXJDbGllbnQ7XG5cdC8qKlxuXHQgKiBUaGUgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBzdWNlc3NmdWxseSBhdXRob3JpemluZyBhIGNsaWVudC4gQ2FuIGJlIGEgSldUIHRva2VuLCBhcGkga2V5LCBldGMuXG5cdCAqIFdpbGwgYmUgbnVsbCBpZiB0aGlzIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIGZyb20gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbi5cblx0ICogRE8gTk9UIFNUT1JFIFNFTlNJVElWRSBJTkZPUk1BVElPTiBIRVJFIFNVQ0ggQVMgUEFTU1dPUkRTLlxuXHQgKi9cblx0YXV0aG9yaXplZFZhbHVlOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgSlNPTiBvYmplY3QgcmVjZWl2ZWQgZnJvbSBlaXRoZXIgb25TZXJ2ZXJQcmVFeGVjdXRlIG9yIG9uU2VydmVyRXhlY3V0ZS4gSWYgXG5cdCAqIHJldHVyblRvQ2xpZW50IGlzIHNldCB0byB0cnVlLCBvblNlcnZlckV4ZWN1dGUgd2lsbCBub3QgYmUgY2FsbGVkIGFuZCB0aGUgZGF0YSBcblx0ICogcmV0dXJuZWQgZnJvbSBvblNlcnZlclByZUV4ZWN1dGUgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgaW5zdGVhZC4gSWYgcmV0dXJuVG9DbGllbnQgXG5cdCAqIGlzIHNldCB0byBlaXRoZXIgZmFsc2Ugb3IgdW5kZWZpbmVkLCBvblNlcnZlckV4ZWN1dGUgd2lsbCBiZSBjYWxsZWQgYW5kIHRoZSBkYXRhIFxuXHQgKiB3aWxsIGJlIHBhc3NlZCB0byBvblNlcnZlckV4ZWN1dGUgaW4gcGFzc09iamVjdC5qc29uT2JqLlxuXHQgKi9cblx0cGFzc09iamVjdDogeyBwYXNzVHlwZTogUGFzc1R5cGU7IGpzb25PYmo6IGFueTsgfTtcblx0LyoqXG5cdCAqIFRoZSBKU09OIHJlY2VpdmVkIGZyb20gdGhlIGNsaWVudC5cblx0ICovXG5cdGpzb25PYmo6IGFueTtcblx0LyoqXG5cdCAqIEFueSBxdWVyeSB2YXJpYWJsZXMgcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50LiBUaGUgb2JqZWN0IHdpbGwgYmUgaW4ga2V5L3ZhbHVlIHBhaXIuXG5cdCAqIFxuXHQgKiAqKkhUVFAgRXhhbXBsZSoqXG5cdCAqIFxuXHQgKiBJbiB0aGUgd2ViIGJyb3dzZXIsIHRoZSBjbGllbnQgc2VuZHMgdGhlIGZvbGxvd2luZyBxdWVyeTpcblx0ICogYGBganNcblx0ICogZmV0Y2ggKFwiaHR0cDovL2xvY2FsaG9zdDozMDAwP25hbWU9Sm9obiZhZ2U9MzBcIik7XG5cdCAqIGBgYFxuXHQgKiBcblx0ICogSW4gdGhlIHNlcnZlciwgdGhlIHF1ZXJ5IHdpbGwgYmUgcmVjZWl2ZWQgYXM6XG5cdCAqIGBgYGpzb25cblx0ICoge1xuXHQgKiBcdFx0XCJuYW1lXCI6IFwiSm9oblwiLFxuXHQgKiBcdFx0XCJhZ2VcIjogMzBcblx0ICogfVxuXHQgKiBgYGBcblx0ICogXG5cdCAqICoqV2ViU29ja2V0IEV4YW1wbGUqKlxuXHQgKiBcblx0ICogSW4gdGhlIHdlYiBicm93c2VyLCB0aGUgY2xpZW50IGluaXRpYXRlcyBhIHNvY2tldC5pbyBjb25uZWN0aW9uIGFuZCBcblx0ICogc2VuZHMgdGhlIGZvbGxvd2luZyBxdWVyeTpcblx0ICogYGBganNcblx0ICogbGV0IGNsaWVudCA9IGlvIChcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCB7XG5cdCAqIFx0XHRcdHF1ZXJ5OiB7XG5cdCAqIFx0XHRcdFx0bmFtZTogXCJKb2huXCIsXG5cdCAqIFx0XHRcdFx0YWdlOiAzMFxuXHQgKiBcdFx0XHR9XG5cdCAqIFx0XHR9KTtcblx0ICogYGBgXG5cdCAqIFxuXHQgKiBJbiB0aGUgc2VydmVyLCB0aGUgcXVlcnkgd2lsbCBiZSByZWNlaXZlZCBhczpcblx0ICogYGBganNvblxuXHQgKiB7XG5cdCAqIFx0XHRcIm5hbWVcIjogXCJKb2huXCIsXG5cdCAqIFx0XHRcImFnZVwiOiAzMFxuXHQgKiB9XG5cdCAqIGBgYFxuXHQgKi9cblx0cXVlcnlPYmo6IGFueTtcblx0LyoqXG5cdCAqIEFueSBmaWxlcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQuIFdpbGwgYmUgbnVsbCBpZiBubyBmaWxlcyB3ZXJlIHNlbnQuXG5cdCAqIE9uY2UgYSBmaWxlIGlzIHVwbG9hZGVkLCB5b3UgY2FuIGFjY2VzcyBpdCBhdCB0aGUgdGVtcG9yYXJ5IHBhdGggZm91bmQgaW46IFxuXHQgKiBmaWxlc1t1cGxvYWRJZF0ucGF0aFxuXHQgKi9cblx0ZmlsZXM6IHtcblx0XHRba2V5OiBzdHJpbmddOiB7XG5cdFx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0XHRzaXplOiBudW1iZXI7XG5cdFx0XHRwYXRoOiBzdHJpbmc7XG5cdFx0fVxuXHR9O1xuXG5cdGNvbnN0cnVjdG9yIChvYmo6IElTZXJ2ZXJSZXF1ZXN0ID0gbnVsbClcblx0e1xuXHRcdGlmIChvYmogPT0gbnVsbClcblx0XHRcdG9iaiA9IHt9O1xuXG5cdFx0dGhpcy5yZXEgPSBvYmoucmVxIHx8IG51bGw7XG5cdFx0dGhpcy5yZXMgPSBvYmoucmVzIHx8IG51bGw7XG5cdFx0dGhpcy5iZWFyZXJUb2tlbiA9IG9iai5iZWFyZXJUb2tlbiB8fCBcIlwiO1xuXHRcdHRoaXMud3NTb2NrZXQgPSBvYmoud3NTb2NrZXQgfHwgbnVsbDtcblx0XHR0aGlzLmF1dGhvcml6ZWRWYWx1ZSA9IG9iai5hdXRob3JpemVkVmFsdWUgfHwgbnVsbDtcblx0XHR0aGlzLmpzb25PYmogPSBvYmouanNvbk9iaiB8fCBudWxsO1xuXHRcdHRoaXMucXVlcnlPYmogPSBvYmoucXVlcnlPYmogfHwgbnVsbDtcblx0XHR0aGlzLmZpbGVzID0gb2JqLmZpbGVzIHx8IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgc2VydmVyIHdoZW4gZmlyc3QgcmVnaXN0ZXJpbmcgd2l0aCBFeHByZXNzLlxuICogSWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGlzIHJvdXRlIG1ldGhvZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgdHlwZSBTZXJ2ZXJSZWdpc3RyYXRpb25GdW5jdGlvbiA9ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uID0gKHJlcXVlc3Q6IFNlcnZlclJlcXVlc3QpID0+IFByb21pc2U8YW55Pjtcbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgdGhlIGNsaWVudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2xpZW50RXhlY3V0aW9uRnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8YW55Pjtcbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgdGhlIHNlcnZlciBmb3IgYXV0aG9yaXphdGlvbi4gQW55IHZhbHVlIFxuICogcmV0dXJuZWQgZnJvbSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbi5cbiAqIElmIGFuIHVuZGVmaW5lZCB2YWx1ZSBpcyByZXR1cm5lZCwgdGhpcyBpbmRpY2F0ZXMgdGhlIHNlcnZlciB3YXMgbm90IGFibGUgXG4gKiB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIsIHNvIHRoZSBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiB3aWxsIG5vdCBiZSBcbiAqIGV4ZWN1dGVkLlxuICovXG5leHBvcnQgdHlwZSBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24gPSAocmVxdWVzdDogU2VydmVyUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuLyoqXG4gKiBUaGUgdGVzdCBjYXNlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKi9cbmV4cG9ydCB0eXBlIFRlc3RDYXNlRnVuY3Rpb24gPSAoKGRyaXZlcjogSG90VGVzdERyaXZlcikgPT4gUHJvbWlzZTxhbnk+KSB8ICgoZHJpdmVyOiBIb3RUZXN0RHJpdmVyKSA9PiBhbnkpO1xuLyoqXG4gKiBUaGUgdGVzdCBjYXNlIG9iamVjdCB0byBwYXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RDYXNlT2JqZWN0XG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG5cdCAqL1xuXHRmdW5jOiBUZXN0Q2FzZUZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEEgbWV0aG9kIHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlclxue1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgcGFyYW1ldGVyLiBEZWZhdWx0OiBzdHJpbmdcblx0ICogQ2FuIGJlOlxuXHQgKiAqIHN0cmluZ1xuXHQgKiAqIGludGVnZXJcblx0ICogKiBudW1iZXJcblx0ICogKiBib29sZWFuXG5cdCAqICogYXJyYXlcblx0ICogKiBvYmplY3Rcblx0ICovXG5cdHR5cGU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgaXRlbSB0eXBlIGluIHRoZSBhcnJheS5cblx0ICogXG5cdCAqIEB0b2RvIFRoaXMgY2Fubm90IGdlbmVyYXRlIG9iamVjdHMgb3IgbmVzdGVkIG9iamVjdHMgeWV0IDovXG5cdCAqL1xuXHRpdGVtcz86IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXIuIERlZmF1bHQ6IFwiXCJcblx0ICovXG5cdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHQvKipcblx0ICogQWRkaXRpb25hbCBPcGVuQVBJIGluZm9ybWF0aW9uLiBBbnl0aGluZyBhZGRlZCBoZXJlIHdpbGwgYmUgYXV0b21lcmdlZCBpbi5cblx0ICovXG5cdG9wZW5BUEk/OiBhbnk7XG5cdC8qKlxuXHQgKiBJcyB0aGlzIHBhcmFtZXRlciByZXF1aXJlZD8gRGVmYXVsdDogZmFsc2Vcblx0ICovXG5cdHJlcXVpcmVkPzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIElzIHRoaXMgcGFyYW1ldGVyIHJlYWQgb25seT8gRGVmYXVsdDogZmFsc2Vcblx0ICovXG5cdHJlYWRPbmx5PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSBwYXJhbWV0ZXJzIGluIHRoZSBvYmplY3QuIElmIHVzaW5nIHRoZSBmdW5jdGlvbiwgdGhlIGZ1bmN0aW9uIFxuXHQgKiB3aWxsIG9ubHkgZXhlY3V0ZSBpZiB0aGUgYXBwbGljYXRpb24ncyBjb25uZWN0aW9uIHR5cGUgaXMgc2V0IHRvIGdlbmVyYXRpb24uXG5cdCAqL1xuXHRwYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogKHN0cmluZyB8IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyIHwgKCgpID0+IFByb21pc2U8SG90Um91dGVNZXRob2RQYXJhbWV0ZXI+KSk7IH07XG59XG5cbi8qKlxuICogQW4gQVBJIG1ldGhvZCB0byBtYWtlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RSb3V0ZU1ldGhvZFxue1xuXHQvKipcblx0ICogVGhlIHBhcmVudCByb3V0ZS5cblx0ICovXG5cdHJvdXRlPzogSG90Um91dGU7XG5cdC8qKlxuXHQgKiBUaGUgYXBpIGNhbGwgbmFtZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHQvKipcblx0ICogQWRkaXRpb25hbCBPcGVuQVBJIGluZm9ybWF0aW9uLiBBbnl0aGluZyBhZGRlZCBoZXJlIHdpbGwgYmUgYXV0b21lcmdlZCBpbi5cblx0ICovXG5cdG9wZW5BUEk/OiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgdGFncyBmb3IgdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHR0YWdzPzogc3RyaW5nW107XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2Ygd2hhdCByZXR1cm5zIGZyb20gdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHRyZXR1cm5zPzogc3RyaW5nIHwgSG90Um91dGVNZXRob2RQYXJhbWV0ZXIgfCAoKCkgPT4gUHJvbWlzZTxIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcj4pO1xuXHQvKipcblx0ICogVGhlIHJlZmVyZW5jZSBuYW1lIGZvciB0aGUgcGFyYW1ldGVycyB3aGVuIGdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbi5cblx0ICogVGhpcyBpcyBzbyB0aGUgZ2VuZXJhdGVkIGNvbXBvbmVudHMgYWxsIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzLlxuXHQgKi9cblx0cGFyYW1ldGVyc1JlZk5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGFyYW1ldGVycyBpbiB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdHBhcmFtZXRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlciB8ICgoKSA9PiBQcm9taXNlPEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyPik7IH07XG5cdC8qKlxuXHQgKiBUaGUgcXVlcnkgcGFyYW1ldGVycyB1c2VkIGluIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0cXVlcnlQYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogSG90Um91dGVNZXRob2RQYXJhbWV0ZXIgfCAoKCkgPT4gUHJvbWlzZTxIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcj4pOyB9O1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHR0eXBlPzogSG90RXZlbnRNZXRob2Q7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBjYXNlIG9iamVjdHMgdG8gZXhlY3V0ZSBkdXJpbmcgdGVzdHMuXG5cdCAqL1xuXHR0ZXN0Q2FzZXM/OiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXTogVGVzdENhc2VPYmplY3Q7XG5cdFx0fSB8IChzdHJpbmcgfCBUZXN0Q2FzZUZ1bmN0aW9uKVtdIHwgVGVzdENhc2VGdW5jdGlvbltdIHwgVGVzdENhc2VPYmplY3RbXTtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGJlZm9yZSBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25QcmVSZWdpc3Rlcj86ICgpID0+IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGZpcnN0IHJlZ2lzdGVyaW5nIHRoaXMgbWV0aG9kIHdpdGggRXhwcmVzcy4gSWYgXG5cdCAqIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIG1ldGhvZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25SZWdpc3Rlcj86IFNlcnZlclJlZ2lzdHJhdGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgYWZ0ZXIgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUG9zdFJlZ2lzdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBhdXRob3JpemluZyBhIGNhbGxlZCBtZXRob2QuIElmIHRoaXMgbWV0aG9kIFxuXHQgKiBpcyBzZXQsIHRoaXMgd2lsbCBub3QgY2FsbCBvbkF1dGhvcml6ZSBmb3IgdGhlIHBhcmVudCBIb3RSb3V0ZS5cblx0ICogVGhlIHZhbHVlIHJldHVybmVkIGZyb20gaGVyZSB3aWxsIGJlIHBhc3NlZCB0byBvbkV4ZWN1dGUuIFxuXHQgKiBVbmRlZmluZWQgcmV0dXJuaW5nIGZyb20gaGVyZSB3aWxsIG1lYW4gdGhlIGF1dGhvcml6YXRpb24gZmFpbGVkLlxuXHQgKiBJZiBhbnkgZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20gdGhpcyBmdW5jdGlvbiwgdGhleSB3aWxsIGJlIHNlbnQgXG5cdCAqIHRvIHRoZSBzZXJ2ZXIgYXMgYW4geyBlcnJvcjogc3RyaW5nOyB9IG9iamVjdCB3aXRoIHRoZSBleGNlcHRpb24gXG5cdCAqIG1lc3NhZ2UgYXMgdGhlIGVycm9yLlxuXHQgKiBcblx0ICogQ3VycmVudGx5IHRoaXMgaGFzIG5vIGVmZmVjdCB3aGVuIHVzaW5nIHdlYnNvY2tldHMuXG5cdCAqL1xuXHRvblNlcnZlckF1dGhvcml6ZT86IFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBleGVjdXRpbmcgYSBjYWxsZWQgbWV0aG9kIGZyb20gdGhlIHNlcnZlciBzaWRlLiBcblx0ICogVGhpcyB3aWxsIHN0cmluZ2lmeSBhbnkgSlNPTiBvYmplY3QgYW5kIHNlbmQgaXQgYXMgYSBKU09OIHJlc3BvbnNlLiBcblx0ICogSWYgdW5kZWZpbmVkIGlzIHJldHVybmVkIG5vIHJlc3BvbnNlIHdpbGwgYmUgc2VudCB0byB0aGUgc2VydmVyLiBcblx0ICogU28gdGhlIGRldmVsb3BlciB3b3VsZCBoYXZlIHRvIHNlbmQgYSByZXNwb25zZSB1c2luZyBcInJlc1wiLlxuXHQgKiBJZiBhbnkgZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20gdGhpcyBmdW5jdGlvbiwgdGhleSB3aWxsIGJlIHNlbnQgXG5cdCAqIHRvIHRoZSBzZXJ2ZXIgYXMgYW4geyBlcnJvcjogc3RyaW5nOyB9IG9iamVjdCB3aXRoIHRoZSBleGNlcHRpb24gXG5cdCAqIG1lc3NhZ2UgYXMgdGhlIGVycm9yLlxuXHQgKi9cblx0b25TZXJ2ZXJFeGVjdXRlPzogU2VydmVyRXhlY3V0aW9uRnVuY3Rpb247XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGV4ZWN1dGluZyBhIGNhbGxlZCBtZXRob2QgZnJvbSB0aGUgY2xpZW50IHNpZGUuXG5cdCAqIEBmaXhtZSBJcyB0aGlzIG5lY2Vzc2FyeT9cblx0ICovXG5cdG9uQ2xpZW50RXhlY3V0ZT86IENsaWVudEV4ZWN1dGlvbkZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEFuIEFQSSBtZXRob2QgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFJvdXRlTWV0aG9kIGltcGxlbWVudHMgSUhvdFJvdXRlTWV0aG9kXG57XG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHJvdXRlLlxuXHQgKi9cblx0cm91dGU6IEhvdFJvdXRlO1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFwaSBtZXRob2QuXG5cdCAqL1xuXHRkZXNjcmlwdGlvbjogc3RyaW5nO1xuXHQvKipcblx0ICogQWRkaXRpb25hbCBPcGVuQVBJIGluZm9ybWF0aW9uLiBBbnl0aGluZyBhZGRlZCBoZXJlIHdpbGwgYmUgYXV0b21lcmdlZCBpbi5cblx0ICovXG5cdG9wZW5BUEk6IGFueTtcblx0LyoqXG5cdCAqIFRoZSB0YWdzIGZvciB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdHRhZ3M6IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIGRlc2NyaXB0aW9uIG9mIHdoYXQgcmV0dXJucyBmcm9tIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0cmV0dXJuczogSG90Um91dGVNZXRob2RQYXJhbWV0ZXIgfCAoKCkgPT4gUHJvbWlzZTxIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcj4pO1xuXHQvKipcblx0ICogVGhlIHJlZmVyZW5jZSBuYW1lIGZvciB0aGUgcGFyYW1ldGVycyB3aGVuIGdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbi5cblx0ICogVGhpcyBpcyBzbyB0aGUgZ2VuZXJhdGVkIGNvbXBvbmVudHMgYWxsIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzLlxuXHQgKi9cblx0cGFyYW1ldGVyc1JlZk5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXJhbWV0ZXJzIGluIHRoZSBhcGkgbWV0aG9kLlxuXHQgKi9cblx0cGFyYW1ldGVyczogeyBbbmFtZTogc3RyaW5nXTogSG90Um91dGVNZXRob2RQYXJhbWV0ZXIgfCAoKCkgPT4gUHJvbWlzZTxIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcj4pOyB9O1xuXHQvKipcblx0ICogVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdXNlZCBpbiB0aGUgYXBpIG1ldGhvZC5cblx0ICovXG5cdHF1ZXJ5UGFyYW1ldGVyczogeyBbbmFtZTogc3RyaW5nXTogSG90Um91dGVNZXRob2RQYXJhbWV0ZXIgfCAoKCkgPT4gUHJvbWlzZTxIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcj4pOyB9O1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHR0eXBlOiBIb3RFdmVudE1ldGhvZDtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIG1ldGhvZCBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2VydmVyPyBUaGlzIFxuXHQgKiBwcmV2ZW50cyB0aGUgbWV0aG9kIGZyb20gYmVpbmcgcmVyZWdpc3RlcmVkLlxuXHQgKi9cblx0aXNSZWdpc3RlcmVkOiBib29sZWFuO1xuXHQvKipcblx0ICogSGFzIHRoaXMgbWV0aG9kIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZXJ2ZXI/IFRoaXMgXG5cdCAqIHByZXZlbnRzIHRoZSBtZXRob2QgZnJvbSBiZWluZyByZXJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRleGVjdXRlU2V0dXA6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBjYXNlIG9iamVjdHMgdG8gZXhlY3V0ZSBkdXJpbmcgdGVzdHMuXG5cdCAqL1xuXHR0ZXN0Q2FzZXM6IHtcblx0XHRcdFtuYW1lOiBzdHJpbmddOiBUZXN0Q2FzZU9iamVjdDtcblx0XHR9O1xuXHQvKipcblx0ICogRXhlY3V0ZXMgYmVmb3JlIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblByZVJlZ2lzdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZmlyc3QgcmVnaXN0ZXJpbmcgdGhpcyBtZXRob2Qgd2l0aCBFeHByZXNzLiBJZiBcblx0ICogdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgbWV0aG9kIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblJlZ2lzdGVyPzogU2VydmVyUmVnaXN0cmF0aW9uRnVuY3Rpb247XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhZnRlciBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25Qb3N0UmVnaXN0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGF1dGhvcml6aW5nIGEgY2FsbGVkIG1ldGhvZC4gSWYgdGhpcyBtZXRob2QgXG5cdCAqIGlzIHNldCwgdGhpcyB3aWxsIG5vdCBjYWxsIG9uQXV0aG9yaXplIGZvciB0aGUgcGFyZW50IEhvdFJvdXRlLlxuXHQgKiBUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBoZXJlIHdpbGwgYmUgcGFzc2VkIHRvIG9uU2VydmVyRXhlY3V0ZS4gXG5cdCAqIFVuZGVmaW5lZCByZXR1cm5pbmcgZnJvbSBoZXJlIHdpbGwgbWVhbiB0aGUgYXV0aG9yaXphdGlvbiBmYWlsZWQuXG5cdCAqIElmIGFueSBleGNlcHRpb25zIGFyZSB0aHJvd24gZnJvbSB0aGlzIGZ1bmN0aW9uLCB0aGV5IHdpbGwgYmUgc2VudCBcblx0ICogdG8gdGhlIGNsaWVudCBhcyBhbiB7IGVycm9yOiBzdHJpbmc7IH0gb2JqZWN0IHdpdGggdGhlIGV4Y2VwdGlvbiBcblx0ICogbWVzc2FnZSBhcyB0aGUgZXJyb3IuXG5cdCAqL1xuXHRvblNlcnZlckF1dGhvcml6ZT86IFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgYmVmb3JlIGV4ZWN1dGluZyBvblNlcnZlckV4ZWN1dGUuIEFueXRoaW5nIHRoYXQgcmV0dXJucyBcblx0ICogZnJvbSB0aGlzIHdpbGwgYmUgcGFzc2VkIG9udG8gb25TZXJ2ZXJFeGVjdXRlIHZpYSByZXF1ZXN0LnByZXZpb3VzSnNvbk9iai5cblx0ICogQW55IGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCBpbiBcblx0ICogdGhlIGZvcm0gb2YgYW4gZXJyb3IgbWVzc2FnZSBvYmplY3QuXG5cdCAqL1xuXHRvblNlcnZlclByZUV4ZWN1dGU/OiBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZXhlY3V0aW5nIGEgY2FsbGVkIG1ldGhvZCBmcm9tIHRoZSBzZXJ2ZXIgc2lkZS4gXG5cdCAqIFRoaXMgd2lsbCBzdHJpbmdpZnkgYW55IEpTT04gb2JqZWN0IGFuZCBzZW5kIGl0IGFzIGEgSlNPTiByZXNwb25zZS4gXG5cdCAqIElmIHVuZGVmaW5lZCBpcyByZXR1cm5lZCBubyByZXNwb25zZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gXG5cdCAqIFNvIHRoZSBkZXZlbG9wZXIgd291bGQgaGF2ZSB0byBzZW5kIGEgcmVzcG9uc2UgdXNpbmcgXCJyZXNcIi5cblx0ICogSWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZXkgd2lsbCBiZSBzZW50IFxuXHQgKiB0byB0aGUgc2VydmVyIGFzIGFuIHsgZXJyb3I6IHN0cmluZzsgfSBvYmplY3Qgd2l0aCB0aGUgZXhjZXB0aW9uIFxuXHQgKiBtZXNzYWdlIGFzIHRoZSBlcnJvci5cblx0ICovXG5cdG9uU2VydmVyRXhlY3V0ZT86IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgYWZ0ZXIgZXhlY3V0aW5nIG9uU2VydmVyRXhlY3V0ZS4gSWYgdGhpcyByZXR1cm5zIGFueXRoaW5nIFxuXHQgKiBvdGhlciB0aGFuIHVuZGVmaW5lZCwgdGhlIHJlc3BvbnNlIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50LlxuXHQgKi9cblx0b25TZXJ2ZXJQb3N0RXhlY3V0ZT86IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBleGVjdXRpbmcgYSBjYWxsZWQgbWV0aG9kIGZyb20gdGhlIGNsaWVudCBzaWRlLlxuXHQgKiBAZml4bWUgSXMgdGhpcyBuZWNlc3Nhcnk/XG5cdCAqL1xuXHRvbkNsaWVudEV4ZWN1dGU/OiBDbGllbnRFeGVjdXRpb25GdW5jdGlvbjtcblxuXHRwcml2YXRlIGNvbnN0cnVjdG9yICgpXG5cdHtcblx0XHR0aGlzLnJvdXRlID0gbnVsbDtcblx0XHR0aGlzLm5hbWUgPSBcIlwiO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24gPSBcIlwiO1xuXHRcdHRoaXMub3BlbkFQSSA9IG51bGw7XG5cdFx0dGhpcy50YWdzID0gW107XG5cdFx0dGhpcy5yZXR1cm5zID0gbnVsbDtcblx0XHR0aGlzLnBhcmFtZXRlcnNSZWZOYW1lID0gXCJcIjtcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7fTtcblx0XHR0aGlzLnF1ZXJ5UGFyYW1ldGVycyA9IHt9O1xuXHRcdHRoaXMudHlwZSA9IEhvdEV2ZW50TWV0aG9kLlBPU1Q7XG5cdFx0dGhpcy5pc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblx0XHR0aGlzLmV4ZWN1dGVTZXR1cCA9IHRydWU7XG5cdFx0dGhpcy50ZXN0Q2FzZXMgPSB7fTtcblx0XHR0aGlzLm9uUHJlUmVnaXN0ZXIgPSBudWxsO1xuXHRcdHRoaXMub25SZWdpc3RlciA9IG51bGw7XG5cdFx0dGhpcy5vblBvc3RSZWdpc3RlciA9IG51bGw7XG5cblx0XHR0aGlzLm9uU2VydmVyQXV0aG9yaXplID0gbnVsbDtcblx0XHR0aGlzLm9uU2VydmVyRXhlY3V0ZSA9IG51bGw7XG5cdFx0dGhpcy5vbkNsaWVudEV4ZWN1dGUgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIG5ldyByb3V0ZSBtZXRob2QuXG5cdCAqL1xuXHRzdGF0aWMgY3JlYXRlIChyb3V0ZTogSG90Um91dGUgfCBJSG90Um91dGVNZXRob2QsIG5hbWU6IHN0cmluZyA9IFwiXCIsIFxuXHRcdFx0b25FeGVjdXRlOiBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiB8IENsaWVudEV4ZWN1dGlvbkZ1bmN0aW9uID0gbnVsbCwgXG5cdFx0XHR0eXBlOiBIb3RFdmVudE1ldGhvZCA9IEhvdEV2ZW50TWV0aG9kLlBPU1QsIG9uU2VydmVyQXV0aG9yaXplOiBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24gPSBudWxsLCBcblx0XHRcdG9uUmVnaXN0ZXI6IFNlcnZlclJlZ2lzdHJhdGlvbkZ1bmN0aW9uID0gbnVsbCwgXG5cdFx0XHR0ZXN0Q2FzZXM6IHsgW25hbWU6IHN0cmluZ106IFRlc3RDYXNlT2JqZWN0OyB9IHwgKHN0cmluZyB8IFRlc3RDYXNlRnVuY3Rpb24pW10gfCBUZXN0Q2FzZUZ1bmN0aW9uW10gfCBUZXN0Q2FzZU9iamVjdFtdID0gbnVsbFxuXHRcdCk6IEhvdFJvdXRlTWV0aG9kXG5cdHtcblx0XHRsZXQgbmV3TWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IG5ldyBIb3RSb3V0ZU1ldGhvZCAoKTtcblx0XHRsZXQgbmV3Um91dGU6IEhvdFJvdXRlID0gbnVsbDtcblxuXHRcdGlmIChyb3V0ZSBpbnN0YW5jZW9mIEhvdFJvdXRlKVxuXHRcdFx0bmV3Um91dGUgPSByb3V0ZTtcblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0bmV3Um91dGUgPSByb3V0ZS5yb3V0ZTtcblxuXHRcdFx0aWYgKHJvdXRlLnR5cGUgIT0gbnVsbClcblx0XHRcdFx0dHlwZSA9IHJvdXRlLnR5cGU7XG5cblx0XHRcdGlmIChyb3V0ZS5uYW1lICE9IG51bGwpXG5cdFx0XHRcdG5hbWUgPSByb3V0ZS5uYW1lO1xuXG5cdFx0XHRpZiAocm91dGUubmFtZSAhPSBudWxsKVxuXHRcdFx0XHRuZXdNZXRob2QudGFncyA9IHJvdXRlLnRhZ3M7XG5cblx0XHRcdGlmIChyb3V0ZS5kZXNjcmlwdGlvbiAhPSBudWxsKVxuXHRcdFx0XHRuZXdNZXRob2QuZGVzY3JpcHRpb24gPSByb3V0ZS5kZXNjcmlwdGlvbjtcblxuXHRcdFx0aWYgKHJvdXRlLm9wZW5BUEkgIT0gbnVsbClcblx0XHRcdFx0bmV3TWV0aG9kLm9wZW5BUEkgPSByb3V0ZS5vcGVuQVBJO1xuXG5cdFx0XHRpZiAocm91dGUucGFyYW1ldGVyc1JlZk5hbWUgIT0gbnVsbClcblx0XHRcdFx0bmV3TWV0aG9kLnBhcmFtZXRlcnNSZWZOYW1lID0gcm91dGUucGFyYW1ldGVyc1JlZk5hbWU7XG5cblx0XHRcdGlmIChyb3V0ZS5xdWVyeVBhcmFtZXRlcnMgIT0gbnVsbClcblx0XHRcdFx0bmV3TWV0aG9kLnF1ZXJ5UGFyYW1ldGVycyA9IHJvdXRlLnF1ZXJ5UGFyYW1ldGVycztcblxuXHRcdFx0aWYgKHJvdXRlLnJldHVybnMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKHR5cGVvZiAocm91dGUucmV0dXJucykgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuZXdNZXRob2QucmV0dXJucyA9IHtcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiByb3V0ZS5yZXR1cm5zXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiAocm91dGUucmV0dXJucykgPT09IFwiZnVuY3Rpb25cIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vLyBAZml4bWUgQ2FuJ3QgcnVuIGF3YWl0IGhlcmUgZm9yIG1hbnkgcmVhc29ucy4gYXdhaXQgaXMgcmVxdWlyZWQgXG5cdFx0XHRcdFx0Ly8vIHRvIGV4ZWN1dGUgSG90U3RhcS5jb252ZXJ0SW50ZXJmYWNlVG9Sb3V0ZVBhcmFtZXRlcnMuIEZpeCBsYXRlci4uLlxuXHRcdFx0XHRcdG5ld01ldGhvZC5yZXR1cm5zID0gcm91dGUucmV0dXJucztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0bmV3TWV0aG9kLnJldHVybnMgPSByb3V0ZS5yZXR1cm5zO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm91dGUucGFyYW1ldGVycyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAocm91dGUucGFyYW1ldGVycyBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdG5ld01ldGhvZC5wYXJhbWV0ZXJzID0gcm91dGUucGFyYW1ldGVycztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gcm91dGUucGFyYW1ldGVycylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgcGFyYW0gPSByb3V0ZS5wYXJhbWV0ZXJzW2tleV07XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHBhcmFtKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmV3TWV0aG9kLnBhcmFtZXRlcnNba2V5XSA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogcGFyYW1cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSBpZiAodHlwZW9mIChwYXJhbSkgPT09IFwiZnVuY3Rpb25cIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Ly8vIEBmaXhtZSBDYW4ndCBydW4gYXdhaXQgaGVyZSBmb3IgbWFueSByZWFzb25zLiBhd2FpdCBpcyByZXF1aXJlZCBcblx0XHRcdFx0XHRcdFx0Ly8vIHRvIGV4ZWN1dGUgSG90U3RhcS5jb252ZXJ0SW50ZXJmYWNlVG9Sb3V0ZVBhcmFtZXRlcnMuIEZpeCBsYXRlci4uLlxuXG5cdFx0XHRcdFx0XHRcdG5ld01ldGhvZC5wYXJhbWV0ZXJzW2tleV0gPSBwYXJhbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtLnR5cGUgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRwYXJhbS50eXBlID0gXCJzdHJpbmdcIjtcblxuXHRcdFx0XHRcdFx0XHRuZXdNZXRob2QucGFyYW1ldGVyc1trZXldID0gcGFyYW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyb3V0ZS5vblNlcnZlckV4ZWN1dGUgIT0gbnVsbClcblx0XHRcdFx0b25FeGVjdXRlID0gcm91dGUub25TZXJ2ZXJFeGVjdXRlO1xuXG5cdFx0XHRpZiAocm91dGUub25TZXJ2ZXJBdXRob3JpemUgIT0gbnVsbClcblx0XHRcdFx0b25TZXJ2ZXJBdXRob3JpemUgPSByb3V0ZS5vblNlcnZlckF1dGhvcml6ZTtcblxuXHRcdFx0aWYgKHJvdXRlLm9uUmVnaXN0ZXIgIT0gbnVsbClcblx0XHRcdFx0b25SZWdpc3RlciA9IHJvdXRlLm9uUmVnaXN0ZXI7XG5cblx0XHRcdGlmIChyb3V0ZS5vblBvc3RSZWdpc3RlciAhPSBudWxsKVxuXHRcdFx0XHRuZXdNZXRob2Qub25Qb3N0UmVnaXN0ZXIgPSByb3V0ZS5vblBvc3RSZWdpc3RlcjtcblxuXHRcdFx0aWYgKHJvdXRlLm9uU2VydmVyRXhlY3V0ZSAhPSBudWxsKVxuXHRcdFx0XHRuZXdNZXRob2Qub25TZXJ2ZXJFeGVjdXRlID0gcm91dGUub25TZXJ2ZXJFeGVjdXRlO1xuXG5cdFx0XHRpZiAocm91dGUub25DbGllbnRFeGVjdXRlICE9IG51bGwpXG5cdFx0XHRcdG5ld01ldGhvZC5vbkNsaWVudEV4ZWN1dGUgPSByb3V0ZS5vbkNsaWVudEV4ZWN1dGU7XG5cblx0XHRcdGlmIChyb3V0ZS50ZXN0Q2FzZXMgIT0gbnVsbClcblx0XHRcdFx0dGVzdENhc2VzID0gcm91dGUudGVzdENhc2VzO1xuXHRcdH1cblxuXHRcdGlmIChuYW1lID09PSBcIlwiKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQWxsIHJvdXRlIG1ldGhvZHMgbXVzdCBoYXZlIGEgbmFtZSFgKTtcblxuXHRcdG5ld01ldGhvZC5yb3V0ZSA9IG5ld1JvdXRlO1xuXHRcdG5ld01ldGhvZC5uYW1lID0gbmFtZTtcblx0XHRuZXdNZXRob2QudHlwZSA9IHR5cGU7XG5cdFx0bmV3TWV0aG9kLmlzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXHRcdG5ld01ldGhvZC5leGVjdXRlU2V0dXAgPSBmYWxzZTtcblx0XHRuZXdNZXRob2Qub25TZXJ2ZXJBdXRob3JpemUgPSBvblNlcnZlckF1dGhvcml6ZTtcblx0XHRuZXdNZXRob2Qub25SZWdpc3RlciA9IG9uUmVnaXN0ZXI7XG5cdFx0bmV3TWV0aG9kLnRlc3RDYXNlcyA9IHt9O1xuXG5cdFx0aWYgKG5ld01ldGhvZC5yb3V0ZS5jb25uZWN0aW9uLnByb2Nlc3Nvci5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdHtcblx0XHRcdGlmICh0ZXN0Q2FzZXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRlc3RDYXNlcyBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0ZXN0Q2FzZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG9iaiA9IHRlc3RDYXNlc1tpSWR4XTtcblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAob2JqKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdGVzdENhc2VOYW1lOiBzdHJpbmcgPSBvYmo7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb24gPSAoPFRlc3RDYXNlRnVuY3Rpb24+dGVzdENhc2VzW2lJZHggKyAxXSk7XG5cblx0XHRcdFx0XHRcdFx0bmV3TWV0aG9kLmFkZFRlc3RDYXNlICh0ZXN0Q2FzZU5hbWUsIGZ1bmMpO1xuXHRcdFx0XHRcdFx0XHRpSWR4Kys7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG5ld01ldGhvZC5hZGRUZXN0Q2FzZSAob2JqKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Zm9yIChsZXQga2V5IGluIHRlc3RDYXNlcylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb2JqID0gdGVzdENhc2VzW2tleV07XG5cblx0XHRcdFx0XHRcdG5ld01ldGhvZC5hZGRUZXN0Q2FzZSAob2JqKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobmV3TWV0aG9kLnJvdXRlLmNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIb3RTZXJ2ZXIpXG5cdFx0XHRuZXdNZXRob2Qub25TZXJ2ZXJFeGVjdXRlID0gb25FeGVjdXRlO1xuXHRcdC8vZWxzZVxuXHRcdFx0Ly9uZXdNZXRob2Qub25DbGllbnRFeGVjdXRlID0gb25FeGVjdXRlO1xuXG5cdFx0cmV0dXJuIChuZXdNZXRob2QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyB0ZXN0IGNhc2UuXG5cdCAqL1xuXHRhZGRUZXN0Q2FzZSAobmV3VGVzdENhc2U6IFRlc3RDYXNlT2JqZWN0IHwgc3RyaW5nIHwgVGVzdENhc2VGdW5jdGlvbiwgXG5cdFx0XHR0ZXN0Q2FzZUZ1bmN0aW9uOiBUZXN0Q2FzZUZ1bmN0aW9uID0gbnVsbCk6IHZvaWRcblx0e1xuXHRcdGlmICh0eXBlb2YgKG5ld1Rlc3RDYXNlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRjb25zdCBuYW1lOiBzdHJpbmcgPSBuZXdUZXN0Q2FzZTtcblx0XHRcdGNvbnN0IGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb24gPSB0ZXN0Q2FzZUZ1bmN0aW9uO1xuXG5cdFx0XHR0aGlzLnRlc3RDYXNlc1tuYW1lXSA9IHtcblx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdGZ1bmM6IGZ1bmNcblx0XHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgKG5ld1Rlc3RDYXNlKSA9PT0gXCJmdW5jdGlvblwiKVxuXHRcdHtcblx0XHRcdGNvbnN0IHRlc3RDYXNlSWQ6IG51bWJlciA9IE9iamVjdC5rZXlzICh0aGlzLnRlc3RDYXNlcykubGVuZ3RoO1xuXHRcdFx0Y29uc3QgbmFtZTogc3RyaW5nID0gYCR7dGhpcy5yb3V0ZS5yb3V0ZX0vJHt0aGlzLm5hbWV9IHRlc3QgY2FzZSAke3Rlc3RDYXNlSWR9YDtcblx0XHRcdGNvbnN0IGZ1bmM6IFRlc3RDYXNlRnVuY3Rpb24gPSAoPFRlc3RDYXNlRnVuY3Rpb24+bmV3VGVzdENhc2UpO1xuXG5cdFx0XHR0aGlzLnRlc3RDYXNlc1tuYW1lXSA9IHtcblx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdGZ1bmM6IGZ1bmNcblx0XHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRlc3RDYXNlOiBUZXN0Q2FzZU9iamVjdCA9ICg8VGVzdENhc2VPYmplY3Q+bmV3VGVzdENhc2UpO1xuXHRcdHRoaXMudGVzdENhc2VzW3Rlc3RDYXNlLm5hbWVdID0gdGVzdENhc2U7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSByZWxhdGl2ZSB1cmwgZnJvbSB0aGlzIG1ldGhvZCBhbmQgaXRzIHJvdXRlLlxuXHQgKi9cblx0Z2V0Um91dGVVcmwgKCk6IHN0cmluZ1xuXHR7XG5cdFx0aWYgKHRoaXMucm91dGUgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFJvdXRlIG1ldGhvZCAke3RoaXMubmFtZX0gZG9lcyBub3QgaGF2ZSBhIHBhcmVudCByb3V0ZSFgKTtcblxuXHRcdGxldCBtZXRob2ROYW1lOiBzdHJpbmcgPSBcIi9cIjtcblxuXHRcdGlmICh0aGlzLnJvdXRlLnZlcnNpb24gIT09IFwiXCIpXG5cdFx0XHRtZXRob2ROYW1lICs9IGAke3RoaXMucm91dGUudmVyc2lvbn0vYDtcblxuXHRcdGlmICh0aGlzLnJvdXRlLnByZWZpeCAhPT0gXCJcIilcblx0XHRcdG1ldGhvZE5hbWUgKz0gYCR7dGhpcy5yb3V0ZS5wcmVmaXh9L2A7XG5cblx0XHRpZiAodGhpcy5yb3V0ZS5yb3V0ZSAhPT0gXCJcIilcblx0XHRcdG1ldGhvZE5hbWUgKz0gYCR7dGhpcy5yb3V0ZS5yb3V0ZX0vYDtcblxuXHRcdG1ldGhvZE5hbWUgKz0gdGhpcy5uYW1lO1xuXG5cdFx0cmV0dXJuIChtZXRob2ROYW1lKTtcblx0fVxufSIsImltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RMb2cgfSBmcm9tIFwiLi9Ib3RMb2dcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHNlcnZlci5cbiAqL1xuZXhwb3J0IGVudW0gSG90U2VydmVyVHlwZVxue1xuXHRIVFRQLFxuXHRXZWJTb2NrZXRzLFxuXHRHZW5lcmF0ZSxcblx0V2ViVGVzdGluZyxcblx0QVBJVGVzdGluZ1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFNlcnZlclxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgc2VydmVyIHR5cGUuXG5cdCAqL1xuXHRzZXJ2ZXJUeXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHRvIHVzZS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG5ldHdvcmsgYWRkcmVzcyB0byBsaXN0ZW4gb24uXG5cdCAqIEBkZWZhdWx0IDAuMC4wLjBcblx0ICovXG5cdGxpc3RlbkFkZHJlc3M6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwb3J0cyB0byB1c2UuXG5cdCAqL1xuXHRwb3J0czoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgSFRUUCBwb3J0IHRvIHVzZS5cblx0XHRcdCAqIEBkZWZhdWx0IDUwMDBcblx0XHRcdCAqL1xuXHRcdFx0aHR0cDogbnVtYmVyO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgSFRUUFMgcG9ydCB0byB1c2UuXG5cdFx0XHQgKiBAZGVmYXVsdCA0NDNcblx0XHRcdCAqL1xuXHRcdFx0aHR0cHM6IG51bWJlcjtcblx0XHR9O1xuXHQvKipcblx0ICogU1NMIHNldHRpbmdzLlxuXHQgKi9cblx0c3NsOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjZXJ0OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUga2V5IHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0a2V5OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgQ0EgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjYTogc3RyaW5nO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBSZWRpcmVjdCBIVFRQIHRyYWZmaWMgdG8gSFRUUFMuXG5cdCAqL1xuXHRyZWRpcmVjdEhUVFB0b0hUVFBTOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuXHQgKi9cblx0dHlwZTogSG90U2VydmVyVHlwZTtcblx0LyoqXG5cdCAqIFRoZSBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIEFueSBzZWNyZXRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci5cblx0ICovXG5cdHNlY3JldHM6IGFueTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgSG90U2VydmVyIGltcGxlbWVudHMgSUhvdFNlcnZlclxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgc2VydmVyIHR5cGUuXG5cdCAqL1xuXHRzZXJ2ZXJUeXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHRvIHVzZS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG5ldHdvcmsgYWRkcmVzcyB0byBsaXN0ZW4gb24uXG5cdCAqIEBkZWZhdWx0IDAuMC4wLjBcblx0ICovXG5cdGxpc3RlbkFkZHJlc3M6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwb3J0cyB0byB1c2UuXG5cdCAqL1xuXHRwb3J0czoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgSFRUUCBwb3J0IHRvIHVzZS5cblx0XHRcdCAqIEBkZWZhdWx0IDUwMDBcblx0XHRcdCAqL1xuXHRcdFx0aHR0cDogbnVtYmVyO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgSFRUUFMgcG9ydCB0byB1c2UuXG5cdFx0XHQgKiBAZGVmYXVsdCA0NDNcblx0XHRcdCAqL1xuXHRcdFx0aHR0cHM6IG51bWJlcjtcblx0XHR9O1xuXHQvKipcblx0ICogU1NMIHNldHRpbmdzLlxuXHQgKi9cblx0c3NsOiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjZXJ0OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUga2V5IHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0a2V5OiBzdHJpbmc7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBTU0wgY2VydGlmaWNhdGUgQ0EgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRjYTogc3RyaW5nO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBSZWRpcmVjdCBIVFRQIHRyYWZmaWMgdG8gSFRUUFMuXG5cdCAqL1xuXHRyZWRpcmVjdEhUVFB0b0hUVFBTOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2Ygc2VydmVyLlxuXHQgKi9cblx0dHlwZTogSG90U2VydmVyVHlwZTtcblx0LyoqXG5cdCAqIFRoZSBsb2dnZXIuXG5cdCAqL1xuXHRsb2dnZXI6IEhvdExvZztcblx0LyoqXG5cdCAqIEFueSBzZWNyZXRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci5cblx0ICovXG5cdHNlY3JldHM6IGFueTtcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxIHwgSG90U2VydmVyKVxuXHR7XG5cdFx0aWYgKHByb2Nlc3NvciBpbnN0YW5jZW9mIEhvdFN0YXEpXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0XHR0aGlzLnNlcnZlclR5cGUgPSBcIlNlcnZlclwiO1xuXHRcdFx0dGhpcy5hcGkgPSBudWxsO1xuXHRcdFx0dGhpcy5saXN0ZW5BZGRyZXNzID0gXCIwLjAuMC4wXCI7XG5cdFx0XHR0aGlzLnBvcnRzID0ge1xuXHRcdFx0XHRcdGh0dHA6IDUwMDAsXG5cdFx0XHRcdFx0aHR0cHM6IDQ0M1xuXHRcdFx0XHR9O1xuXHRcdFx0dGhpcy5zc2wgPSB7XG5cdFx0XHRcdFx0Y2VydDogXCJcIixcblx0XHRcdFx0XHRrZXk6IFwiXCIsXG5cdFx0XHRcdFx0Y2E6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdHRoaXMucmVkaXJlY3RIVFRQdG9IVFRQUyA9IHRydWU7XG5cdFx0XHR0aGlzLnR5cGUgPSBIb3RTZXJ2ZXJUeXBlLkhUVFA7XG5cdFx0XHR0aGlzLmxvZ2dlciA9IHByb2Nlc3Nvci5sb2dnZXI7XG5cdFx0XHR0aGlzLnNlY3JldHMgPSB7fTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yLnByb2Nlc3Nvcjtcblx0XHRcdHRoaXMuc2VydmVyVHlwZSA9IHByb2Nlc3Nvci5zZXJ2ZXJUeXBlIHx8IFwiU2VydmVyXCI7XG5cdFx0XHR0aGlzLmFwaSA9IHByb2Nlc3Nvci5hcGkgfHwgbnVsbDtcblx0XHRcdHRoaXMubGlzdGVuQWRkcmVzcyA9IHByb2Nlc3Nvci5saXN0ZW5BZGRyZXNzIHx8IFwiMC4wLjAuMFwiO1xuXHRcdFx0dGhpcy5wb3J0cyA9IHByb2Nlc3Nvci5wb3J0cyB8fCB7XG5cdFx0XHRcdFx0aHR0cDogNTAwMCxcblx0XHRcdFx0XHRodHRwczogNDQzXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnNzbCA9IHByb2Nlc3Nvci5zc2wgfHwge1xuXHRcdFx0XHRcdGNlcnQ6IFwiXCIsXG5cdFx0XHRcdFx0a2V5OiBcIlwiLFxuXHRcdFx0XHRcdGNhOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR0aGlzLnJlZGlyZWN0SFRUUHRvSFRUUFMgPSBwcm9jZXNzb3IucmVkaXJlY3RIVFRQdG9IVFRQUyAhPSBudWxsID8gcHJvY2Vzc29yLnJlZGlyZWN0SFRUUHRvSFRUUFMgOiB0cnVlO1xuXHRcdFx0dGhpcy50eXBlID0gcHJvY2Vzc29yLnR5cGUgfHwgSG90U2VydmVyVHlwZS5IVFRQO1xuXHRcdFx0dGhpcy5sb2dnZXIgPSBwcm9jZXNzb3IubG9nZ2VyO1xuXHRcdFx0dGhpcy5zZWNyZXRzID0gcHJvY2Vzc29yLnNlY3JldHMgfHwge307XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBhbiBBUEkgdG8gdGhpcyBzZXJ2ZXIuIFRoaXMgd2lsbCBhbHNvIHNldCB0aGUgYXNzb2NpYXRlZCBcblx0ICogcHJvY2Vzc29yIHRvIHRoaXMgQVBJIGFzIHdlbGwuXG5cdCAqL1xuXHRhc3luYyBzZXRBUEkgKGFwaTogSG90QVBJKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0dGhpcy5wcm9jZXNzb3IuYXBpID0gYXBpO1xuXHRcdHRoaXMuYXBpID0gYXBpO1xuXG5cdFx0Ly9pZiAocmVnaXN0ZXJSb3V0ZXMgPT09IHRydWUpXG5cdFx0XHQvL2F3YWl0IHRoaXMuYXBpLnJlZ2lzdGVyUm91dGVzICgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGEgcm91dGUgd2l0aCB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgcmVnaXN0ZXJSb3V0ZT8gKHJvdXRlOiBIb3RSb3V0ZSk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIFN0YXJ0IGxpc3RlbmluZyBmb3IgcmVxdWVzdHMuXG5cdCAqL1xuXHRhc3luYyBsaXN0ZW4/ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBTaHV0ZG93biB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgc2h1dGRvd24/ICgpOiBQcm9taXNlPHZvaWQ+O1xufSIsImltcG9ydCAqIGFzIHBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBmZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xuaW1wb3J0IHZhbGlkYXRlTW9kdWxlTmFtZSBmcm9tIFwidmFsaWRhdGUtbnBtLXBhY2thZ2UtbmFtZVwiO1xuXG5pbXBvcnQgeyBIb3RQYWdlIH0gZnJvbSBcIi4vSG90UGFnZVwiO1xuaW1wb3J0IHsgSG90RmlsZSB9IGZyb20gXCIuL0hvdEZpbGVcIjtcblxuaW1wb3J0IHsgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQsIElIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdExvZywgSG90TG9nTGV2ZWwgfSBmcm9tIFwiLi9Ib3RMb2dcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBEZXZlbG9wZXJNb2RlIH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RBc3NldCB9IGZyb20gXCIuL0hvdEFzc2V0XCI7XG5pbXBvcnQgeyBIb3RNb2R1bGUgfSBmcm9tIFwiLi9Ib3RNb2R1bGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuXG5pbXBvcnQgeyBIb3RUZXN0ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3RlckFQSSB9IGZyb20gXCIuL0hvdFRlc3RlckFQSVwiO1xuaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3RNYXAgfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5pbXBvcnQgeyBIb3RUZXN0RGVzdGluYXRpb259IGZyb20gXCIuL0hvdFRlc3REZXN0aW5hdGlvblwiO1xuXG5pbXBvcnQgeyBIb3RTaXRlLCBIb3RTaXRlUm91dGUgfSBmcm9tIFwiLi9Ib3RTaXRlXCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyQ29tcG9uZW50IH0gZnJvbSBcIi4vSG90U3RhcVJlZ2lzdGVyQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBob3RTdGFxV2ViU3RhcnQgfSBmcm9tIFwiLi9Ib3RTdGFxV2ViU3RhcnRcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcblxudmFyIEhvdFRlc3Rlck1vY2hhOiBhbnkgPSBudWxsO1xudmFyIEhvdFRlc3Rlck1vY2hhU2VsZW5pdW06IGFueSA9IG51bGw7XG52YXIgSG90VGVzdFNlbGVuaXVtRHJpdmVyOiBhbnkgPSBudWxsO1xuXG4vKipcbiAqIFRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIHN0YXJ0aW5nIGEgcGFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3RTdGFydE9wdGlvbnNcbntcblx0LyoqXG5cdCAqIFRoZSBIb3R0IHNpdGUgdG8gbG9hZC5cblx0ICovXG5cdHVybD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb250ZW50IHRvIGRpc3BsYXkuXG5cdCAqL1xuXHRjb250ZW50Pzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHBhZ2UgdG8gbG9hZC5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZSB0byBsb2FkIHRoZSBwYWdlLlxuXHQgKi9cblx0cHJvY2Vzc29yPzogSG90U3RhcTtcblx0LyoqXG5cdCAqIEFueSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbmV3IHBhZ2UuXG5cdCAqL1xuXHRhcmdzPzogYW55O1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3RlciB0byB1c2UuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3RlciBtYXAgdG8gdXNlLlxuXHQgKi9cblx0dGVzdGVyTWFwPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGJhc2UgdXJsIGZvciB0aGUgdGVzdGVyIGFwaS5cblx0ICovXG5cdHRlc3RlckFQSUJhc2VVcmw/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBodG1sIHRoYXQgbG9hZHMgdGhlIGhvdHQgZmlsZSB0aGF0J3MgXG5cdCAqIHBvaW50ZWQgYXQgdGhlIHVybCBhYm92ZS5cblx0ICovXG5cdHRlc3RlckxhdW5jaHBhZFVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlU2NyaXB0IGNvbnZlcnNpb24gb3B0aW9ucyBmb3IgY29udmVydGluZyBpbnRlcmZhY2VzIGludG8gdXNhYmxlIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVR5cGVTY3JpcHRDb252ZXJzaW9uT3B0aW9uc1xue1xuXHQvKipcblx0ICogVGhlIHR5cGUgY29udmVyc2lvbnMgdG8gdXNlIHdoZW4gY29udmVydGluZyBUeXBlU2NyaXB0IHR5cGVzIGludG8gXG5cdCAqIHBhcmFtZXRlciB0eXBlcy5cblx0ICovXG5cdHR5cGVDb252ZXJzaW9ucz86IHsgW3R5cGVOYW1lOiBzdHJpbmddOiBzdHJpbmc7IH07XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZpcnN0IHVuaW9uIHR5cGUgd2lsbCBiZSByZXR1cm5lZC4gSWYgc2V0IHRvIGZhbHNlLFxuXHQgKiB0aGUgZW50aXJlIHVuaW9uIHdpbGwgYmUgcmV0dXJuZWQuXG5cdCAqL1xuXHRyZXR1cm5GaXJzdFVuaW9uVHlwZT86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZGVmYXVsdCB0eXBlIHRvIHVzZSB3aGVuIHRoZSBhdmFpbGFibGUgT3BlbkFQSSB0eXBlIGlzIHVua25vd24gb3IgXG5cdCAqIGlzIG5vdCBhIHJhdyBkYXRhIHR5cGUuXG5cdCAqL1xuXHR1bmtub3duVHlwZURlZmF1bHRzVG9UeXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZmFjZVByb3BlcnR5XG57XG5cdG5hbWU6IHN0cmluZztcblx0dHlwZTogc3RyaW5nO1xuXHRpc09wdGlvbmFsOiBib29sZWFuO1xuXHRyZWFkT25seTogYm9vbGVhbjtcblx0aXNBcnJheTogYm9vbGVhbjtcblx0Y29tbWVudHM6IHN0cmluZ1tdO1xuXHRjaGlsZDogUGFyc2VkSW50ZXJmYWNlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRJbnRlcmZhY2Vcbntcblx0bmFtZTogc3RyaW5nO1xuXHRjb21tZW50czogc3RyaW5nW107XG5cdHByb3BlcnRpZXM6IEludGVyZmFjZVByb3BlcnR5W107XG59XG5cbi8qKlxuICogVGhlIG1haW4gY2xhc3MgdGhhdCBoYW5kbGVzIGFsbCBIVE1MIHByZXByb2Nlc3NpbmcsIHRoZW4gb3V0cHV0cyB0aGUgXG4gKiByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RTdGFxXG57XG5cdC8qKlxuXHQgKiBUaGUgYXBpIHRoYXQncyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGguXG5cdCAqL1xuXHRhcGk/OiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIGFwaSB0aGF0J3MgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoLlxuXHQgKi9cblx0dGVzdGVyQVBJPzogSG90QVBJO1xuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoYXQgdHlwZSBvZiBleGVjdXRpb24gdGhpcyBpcy5cblx0ICovXG5cdG1vZGU/OiBEZXZlbG9wZXJNb2RlO1xuXHQvKipcblx0ICogVGhlIHBhZ2VzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKi9cblx0cGFnZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RQYWdlIH07XG5cdC8qKlxuXHQgKiBUaGUgaW1wb3J0ZWQgbW9kdWxlcy5cblx0ICovXG5cdG1vZHVsZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RNb2R1bGUgfTtcblx0LyoqXG5cdCAqIFRoZSBjb21wb25lbnRzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKiBcblx0ICogQGZpeG1lIFJlbmFtZSB0aGlzIHRvIGNvbXBvbmVudFRhZ3MuXG5cdCAqL1xuXHRjb21wb25lbnRzPzoge1xuXHRcdFt0YWdOYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdGNvbXBvbmVudFR5cGU6IChuZXcgIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpLCBcblx0XHRcdFx0cHJvY2Vzc29yOiBIb3RTdGFxLCBcblx0XHRcdFx0YXBpOiBIb3RBUElcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogVGhlIGZpbGVzIHRoYXQgY2FuIGJlIHN0b3JlZCBmb3IgbGF0ZXIgdXNlLlxuXHQgKi9cblx0ZmlsZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RGaWxlIH07XG5cdC8qKlxuXHQgKiBUaGUgbG9hZGVkIGhvdHNpdGUuXG5cdCAqL1xuXHRob3RTaXRlPzogSG90U2l0ZTtcbn1cblxuLyoqXG4gKiBUaGUgbWFpbiBjbGFzcyB0aGF0IGhhbmRsZXMgYWxsIEhUTUwgcHJlcHJvY2Vzc2luZywgdGhlbiBvdXRwdXRzIHRoZSBcbiAqIHJlc3VsdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RTdGFxIGltcGxlbWVudHMgSUhvdFN0YXFcbntcblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgSG90U3RhcS5cblx0ICovXG5cdHN0YXRpYyB2ZXJzaW9uOiBzdHJpbmcgPSBcIjAuOC4xMTNcIjtcblx0LyoqXG5cdCAqIEluZGljYXRlcyBpZiB0aGlzIGlzIGEgd2ViIGJ1aWxkLlxuXHQgKi9cblx0c3RhdGljIGlzV2ViOiBib29sZWFuID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgaWYgdGhpcyBpcyByZWFkeSBmb3IgdGVzdGluZy5cblx0ICovXG5cdHN0YXRpYyBpc1JlYWR5Rm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhpcyBldmVudCB3aGVuIHRoaXMgcGFnZSBpcyByZWFkeSBmb3IgdGVzdGluZy5cblx0ICovXG5cdHN0YXRpYyBvblJlYWR5Rm9yVGVzdGluZzogKCkgPT4gUHJvbWlzZTx2b2lkPiA9IG51bGw7XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGlzIGV2ZW50IHdoZW4gdGhpcyBwYWdlIGhhcyByZWNlaXZlZCBvdXRwdXQgZm9yIHByb2Nlc3NpbmcuXG5cdCAqIFxuXHQgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgdGhhdCBpcyBhYm91dCB0byBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjdXJyZW50IHBhZ2UuXG5cdCAqL1xuXHRzdGF0aWMgb25PdXRwdXRSZWNlaXZlZDogKG91dHB1dDogc3RyaW5nKSA9PiB2b2lkID0gbnVsbDtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoaXMgZXZlbnQgd2hlbiB0aGlzIHBhZ2UgaXMgcmVhZHkgZm9yIHRlc3RpbmcuXG5cdCAqIFxuXHQgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgdGhhdCB3YXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY3VycmVudCBwYWdlLlxuXHQgKi9cblx0cHJvdGVjdGVkIHN0YXRpYyBvblJlYWR5RXZlbnQ6IChvdXRwdXQ6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gZmFsc2UsIHRoZSBwYWdlIHdpbGwgbm90IGVtaXQgRE9NQ29udGVudExvYWRlZCBvciB3aW5kb3cubG9hZC5cblx0ICovXG5cdHN0YXRpYyBkaXNwYXRjaFJlYWR5RXZlbnRzOiBib29sZWFuID0gdHJ1ZTtcblx0LyoqXG5cdCAqIEVycm9ycyB0byBleGVjdXRlIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcuXG5cdCAqL1xuXHRzdGF0aWMgZXJyb3JzOiB7IFtuYW1lOiBzdHJpbmddOiB7IHJlZGlyZWN0VG9Vcmw/OiBzdHJpbmc7IGZ1bmM/OiAoZXJyVHlwZTogc3RyaW5nKSA9PiB2b2lkOyB9OyB9ID0ge307XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hhdCB0eXBlIG9mIGV4ZWN1dGlvbiB0aGlzIGlzLlxuXHQgKi9cblx0bW9kZTogRGV2ZWxvcGVyTW9kZTtcblx0LyoqXG5cdCAqIFRoZSBhcGkgdGhhdCdzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aC5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBhcGkgdGhhdCdzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aC5cblx0ICovXG5cdHRlc3RlckFQSTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHBhZ2VzIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLlxuXHQgKi9cblx0cGFnZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFBhZ2UgfTtcblx0LyoqXG5cdCAqIFRoZSBpbXBvcnRlZCBtb2R1bGVzLlxuXHQgKi9cblx0bW9kdWxlczogeyBbbmFtZTogc3RyaW5nXTogSG90TW9kdWxlIH07XG5cdC8qKlxuXHQgKiBUaGUgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBjb25zdHJ1Y3RlZC5cblx0ICogXG5cdCAqIEBmaXhtZSBSZW5hbWUgdGhpcyB0byBjb21wb25lbnRUYWdzLlxuXHQgKi9cblx0Y29tcG9uZW50czoge1xuXHRcdFt0YWdOYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdGNvbXBvbmVudFR5cGU6IChuZXcgIChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpLCBcblx0XHRcdFx0cHJvY2Vzc29yOiBIb3RTdGFxLCBcblx0XHRcdFx0YXBpOiBIb3RBUElcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogVGhlIGZpbGVzIHRoYXQgY2FuIGJlIHN0b3JlZCBmb3IgbGF0ZXIgdXNlLlxuXHQgKi9cblx0ZmlsZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdEZpbGUgfTtcblx0LyoqXG5cdCAqIFRoZSBsb2FkZWQgaG90c2l0ZS5cblx0ICovXG5cdGhvdFNpdGU6IEhvdFNpdGU7XG5cdC8qKlxuXHQgKiBUaGUgYXBpIGNvbnRlbnQgdG8gdXNlIHdoZW4gYWJvdXQgdG8gbG9hZCBIb3RTdGFxLlxuXHQgKi9cblx0YXBpQ29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBhcGkgY29udGVudCB0byB1c2Ugd2hlbiBhYm91dCB0byBsb2FkIEhvdFN0YXEuXG5cdCAqL1xuXHR0ZXN0ZXJBcGlDb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGFnZSBjb250ZW50IHRvIHVzZSB3aGVuIGFib3V0IHRvIGxvYWQgSG90U3RhcS5cblx0ICovXG5cdHBhZ2VDb250ZW50OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cdC8qKlxuXHQgKiBBZGQgYSBzdGFydCBkZWxheSBiZWZvcmUgc3RhcnRpbmcuIFRoaXMgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBtb3N0bHkuXG5cdCAqL1xuXHRzdGFydERlbGF5OiBudW1iZXI7XG5cdC8qKlxuXHQgKiBUaGUgcHVibGljIGtleXMgdG8gYmUgZXhwb3NlZC5cblx0ICovXG5cdHB1YmxpY0tleXM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXJzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqL1xuXHR0ZXN0ZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0ZXIgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdFN0YXEgPSB7fSlcblx0e1xuXHRcdHRoaXMubG9nZ2VyID0gbmV3IEhvdExvZyAoSG90TG9nTGV2ZWwuQWxsKTtcblx0XHR0aGlzLnN0YXJ0RGVsYXkgPSAwO1xuXHRcdHRoaXMuYXBpID0gY29weS5hcGkgfHwgbnVsbDtcblx0XHR0aGlzLnRlc3RlckFQSSA9IGNvcHkudGVzdGVyQVBJIHx8IG51bGw7XG5cdFx0dGhpcy5tb2RlID0gY29weS5tb2RlIHx8IERldmVsb3Blck1vZGUuUHJvZHVjdGlvbjtcblx0XHR0aGlzLnBhZ2VzID0gY29weS5wYWdlcyB8fCB7fTtcblx0XHR0aGlzLm1vZHVsZXMgPSBjb3B5Lm1vZHVsZXMgfHwge307XG5cdFx0dGhpcy5jb21wb25lbnRzID0gY29weS5jb21wb25lbnRzIHx8IHt9O1xuXHRcdHRoaXMuZmlsZXMgPSBjb3B5LmZpbGVzIHx8IHt9O1xuXHRcdHRoaXMuaG90U2l0ZSA9IGNvcHkuaG90U2l0ZSB8fCBudWxsO1xuXHRcdHRoaXMuYXBpQ29udGVudCA9IGBcblx0XHRcdHtcblx0XHRcdFx0dmFyICVhcGlfbmFtZSUgPSAlYXBpX2V4cG9ydGVkX25hbWUlLiVhcGlfbmFtZSU7XG5cdFx0XHRcdHZhciBuZXdIb3RDbGllbnQgPSBuZXcgSG90Q2xpZW50IChwcm9jZXNzb3IpO1xuXHRcdFx0XHR2YXIgbmV3YXBpID0gbmV3ICVhcGlfbmFtZSUgKCViYXNlX3VybCUsIG5ld0hvdENsaWVudCk7XG5cdFx0XHRcdG5ld0hvdENsaWVudC5hcGkgPSBuZXdhcGk7XG5cdFx0XHRcdHByb2Nlc3Nvci5hcGkgPSBuZXdhcGk7XG5cdFx0XHR9YDtcblx0XHR0aGlzLnRlc3RlckFwaUNvbnRlbnQgPSBgXG5cdFx0XHR2YXIgSG90VGVzdGVyQVBJID0gSG90U3RhcVdlYi5Ib3RUZXN0ZXJBUEk7XG5cdFx0XHR2YXIgbmV3SG90VGVzdGVyQ2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdHZhciBuZXd0ZXN0ZXJhcGkgPSBuZXcgSG90VGVzdGVyQVBJICglYmFzZV90ZXN0ZXJfdXJsJSwgbmV3SG90VGVzdGVyQ2xpZW50KTtcblx0XHRcdG5ld0hvdFRlc3RlckNsaWVudC50ZXN0ZXJBUEkgPSBuZXd0ZXN0ZXJhcGk7XG5cdFx0XHRwcm9jZXNzb3IudGVzdGVyQVBJID0gbmV3dGVzdGVyYXBpO2A7XG5cdFx0dGhpcy5wYWdlQ29udGVudCA9IFxuYDwhRE9DVFlQRSBodG1sPlxuPGh0bWw+XG5cbjxoZWFkPlxuXHQ8dGl0bGU+JXRpdGxlJTwvdGl0bGU+XG5cblx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiVob3RzdGFxX2pzX3NyYyVcIj48L3NjcmlwdD5cblx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIj5cblx0XHR3aW5kb3cuaG90c3RhcVN0YXJ0aW5nQXBwID0gdHJ1ZTtcblxuXHRcdGZvciAobGV0IGtleSBpbiBIb3RTdGFxV2ViKVxuXHRcdFx0d2luZG93W2tleV0gPSBIb3RTdGFxV2ViW2tleV07XG5cdDwvc2NyaXB0PlxuXG4lYXBpc190b19sb2FkJVxuXG5cdDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+XG5cdFx0YXN5bmMgZnVuY3Rpb24gaG90c3RhcV9zdGFydEFwcCAoKVxuXHRcdHtcblx0XHRcdGxldCB0ZW1wTW9kZSA9IDA7XG5cblx0XHRcdGlmICh3aW5kb3dbXCJIb3RcIl0gIT0gbnVsbClcblx0XHRcdFx0dGVtcE1vZGUgPSBIb3QuTW9kZTtcblxuXHRcdFx0JXN0YXJ0X2RlbGF5JVxuXG5cdFx0XHR2YXIgcHJvY2Vzc29yID0gbmV3IEhvdFN0YXEgKCk7XG5cdFx0XHRwcm9jZXNzb3IubG9nZ2VyLmxvZ0xldmVsID0gJWxvZ2dpbmdfbGV2ZWwlO1xuXG5cdFx0XHR2YXIgcHJvbWlzZXMgPSBbXTtcblx0XHRcdCVkZXZlbG9wZXJfbW9kZSVcblxuXHRcdFx0JWFwaV9jb2RlJVxuXG5cdFx0XHQlcHVibGljX3NlY3JldHMlXG5cdFx0XHQldGVzdGVyX2FwaSVcblx0XHRcdCVsb2FkX2ZpbGVzJVxuXG5cdFx0XHRwcm9jZXNzb3IubW9kZSA9IHRlbXBNb2RlO1xuXG5cdFx0XHRQcm9taXNlLmFsbCAocHJvbWlzZXMpLnRoZW4gKGZ1bmN0aW9uICgpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRIb3RTdGFxLmRpc3BsYXlVcmwgKHtcblx0XHRcdFx0XHRcdFx0dXJsOiBcIiV1cmwlXCIsXG5cdFx0XHRcdFx0XHRcdG5hbWU6IFwiJXRpdGxlJVwiLFxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHByb2Nlc3Nvcixcblx0XHRcdFx0XHRcdFx0YXJnczogJWFyZ3MlLFxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJOYW1lOiAldGVzdGVyX25hbWUlLFxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJNYXA6ICV0ZXN0ZXJfbWFwJSxcblx0XHRcdFx0XHRcdFx0dGVzdGVyQVBJQmFzZVVybDogJXRlc3Rlcl9hcGlfYmFzZV91cmwlLFxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJMYXVuY2hwYWRVcmw6ICV0ZXN0ZXJfbGF1bmNocGFkX3VybCVcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHRob3RzdGFxX3N0YXJ0QXBwICgpO1xuXHQ8L3NjcmlwdD5cbjwvaGVhZD5cblxuPGJvZHk+XG48L2JvZHk+XG5cbjwvaHRtbD5gO1xuXHRcdHRoaXMucHVibGljS2V5cyA9IHt9O1xuXHRcdHRoaXMudGVzdGVycyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlIGEgYm9vbGVhbiB2YWx1ZS5cblx0ICovXG5cdHN0YXRpYyBwYXJzZUJvb2xlYW4gKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuXG5cdHtcblx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlICgpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcInRydWVcIilcblx0XHRcdHJldHVybiAodHJ1ZSk7XG5cblx0XHRpZiAodmFsdWUgPT09IFwiZmFsc2VcIilcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcInllc1wiKVxuXHRcdFx0cmV0dXJuICh0cnVlKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJub1wiKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0XHRpZiAodmFsdWUgPT09IFwieWVwXCIpXG5cdFx0XHRyZXR1cm4gKHRydWUpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcIm5haFwiKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IGEgVHlwZVNjcmlwdCBpbnRlcmZhY2UgdG8gYSByb3V0ZSBwYXJhbWV0ZXIuXG5cdCAqIFRoaXMgaXMgZXhwZXJpbWVudGFsLCBidXQgc3RpbGwgd29ya3MgZGVjZW50bHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgY29udmVydEludGVyZmFjZVRvUm91dGVQYXJhbWV0ZXJzIChzb3VyY2VDb2RlUGF0aDogc3RyaW5nLCBpbnRlcmZhY2VOYW1lOiBzdHJpbmcsIFxuXHRcdFx0b3B0aW9uczogSVR5cGVTY3JpcHRDb252ZXJzaW9uT3B0aW9ucyA9IFxuXHRcdFx0XHR7IHR5cGVDb252ZXJzaW9uczogeyBcIkRhdGVcIjogXCJzdHJpbmdcIiB9LCByZXR1cm5GaXJzdFVuaW9uVHlwZTogdHJ1ZSwgdW5rbm93blR5cGVEZWZhdWx0c1RvVHlwZTogXCJzdHJpbmdcIiB9XG5cdFx0KTogUHJvbWlzZTxIb3RSb3V0ZU1ldGhvZFBhcmFtZXRlcj5cblx0e1xuXHRcdGxldCBwYXJhbWV0ZXJzOiB7IFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyOyB9ID0ge307XG5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFN0YXEuY29udmVydEludGVyZmFjZVRvUm91dGVQYXJhbWV0ZXJzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIuYCk7XG5cblx0XHRsZXQgSG90SU8gPSBldmFsIChcInJlcXVpcmVcIikoXCIuL0hvdElPXCIpLkhvdElPOyAvLyBIYWNrIHRvIGdldCBhcm91bmQgV2VicGFjay5cblx0XHRjb25zdCBzb3VyY2VDb2RlQ29udGVudDogc3RyaW5nID0gYXdhaXQgSG90SU8ucmVhZFRleHRGaWxlIChzb3VyY2VDb2RlUGF0aCk7XG5cblx0XHRsZXQgcGFyc2VJbnRlcmZhY2UgPSBldmFsIChcInJlcXVpcmVcIikoXCIuL0hvdENvbnZlcnRJbnRlcmZhY2VUb1JvdXRlUGFyYW1ldGVyc1wiKS5wYXJzZUludGVyZmFjZTtcblx0XHRjb25zdCBvdXRwdXQ6IFBhcnNlZEludGVyZmFjZSA9IHBhcnNlSW50ZXJmYWNlIChcIi4vdGVtcC50c1wiLCBzb3VyY2VDb2RlQ29udGVudCwgaW50ZXJmYWNlTmFtZSwgb3B0aW9ucyk7XG5cblx0XHRpZiAob3V0cHV0ID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBJbnRlcmZhY2UgJHtpbnRlcmZhY2VOYW1lfSBub3QgZm91bmQgaW4gJHtzb3VyY2VDb2RlUGF0aH0uYCk7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dC5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCBwcm9wOiBJbnRlcmZhY2VQcm9wZXJ0eSA9IG91dHB1dC5wcm9wZXJ0aWVzW2ldO1xuXHRcdFx0bGV0IGRlc2NyaXB0aW9uOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRpZiAocHJvcC5jb21tZW50cy5sZW5ndGggPiAwKVxuXHRcdFx0XHRkZXNjcmlwdGlvbiA9IHByb3AuY29tbWVudHNbMF07XG5cblx0XHRcdHBhcmFtZXRlcnNbcHJvcC5uYW1lXSA9IHtcblx0XHRcdFx0XHRcInR5cGVcIjogcHJvcC50eXBlLFxuXHRcdFx0XHRcdFwicmVxdWlyZWRcIjogIXByb3AuaXNPcHRpb25hbCxcblx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IGRlc2NyaXB0aW9uXG5cdFx0XHRcdH07XG5cblx0XHRcdGlmIChwcm9wLnJlYWRPbmx5ID09PSB0cnVlKVxuXHRcdFx0XHRwYXJhbWV0ZXJzW3Byb3AubmFtZV0ucmVhZE9ubHkgPSB0cnVlO1xuXG5cdFx0XHRpZiAocHJvcC5pc0FycmF5ID09PSB0cnVlKVxuXHRcdFx0e1xuXHRcdFx0XHRwYXJhbWV0ZXJzW3Byb3AubmFtZV0udHlwZSA9IFwiYXJyYXlcIjtcblx0XHRcdFx0cGFyYW1ldGVyc1twcm9wLm5hbWVdLml0ZW1zID0ge1xuXHRcdFx0XHRcdFx0XCJ0eXBlXCI6IHByb3AudHlwZVxuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChwYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIHJlcXVpcmVkIHBhcmFtZXRlciBleGlzdHMgaW5zaWRlIGFuIG9iamVjdC4gSWYgaXQgZXhpc3RzLCByZXR1cm4gdGhlIHZhbHVlLlxuXHQgKi9cblx0c3RhdGljIGdldFBhcmFtIChuYW1lOiBzdHJpbmcsIG9ialdpdGhQYXJhbTogYW55LCByZXF1aXJlZDogYm9vbGVhbiA9IHRydWUsIHRocm93RXhjZXB0aW9uOiBib29sZWFuID0gdHJ1ZSk6IGFueVxuXHR7XG5cdFx0bGV0IHZhbHVlOiBhbnkgPSBvYmpXaXRoUGFyYW1bbmFtZV07XG5cblx0XHRpZiAodmFsdWUgPT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAocmVxdWlyZWQgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aHJvd0V4Y2VwdGlvbiA9PT0gdHJ1ZSlcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAke25hbWV9LmApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRpZiAocmVxdWlyZWQgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gXCJcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aHJvd0V4Y2VwdGlvbiA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICR7bmFtZX0uYCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIHJlcXVpcmVkIHBhcmFtZXRlciBleGlzdHMgaW5zaWRlIGFuIG9iamVjdC4gSWYgaXQgZXhpc3RzLCByZXR1cm4gdGhlIHZhbHVlLCBlbnN1cmUgdGhlIFxuXHQgKiBudW1iZXIgcmV0dXJuZWQgaXMgd2l0aGluIGEgY2VydGFpbiByYW5nZS5cblx0ICogXG5cdCAqIFRoZSB2YWx1ZSByZXRyaWV2ZWQgbXVzdCBiZSBhIG51bWJlci5cblx0ICovXG5cdHN0YXRpYyBnZXRQYXJhbVJhbmdlIChuYW1lOiBzdHJpbmcsIG9ialdpdGhQYXJhbTogYW55LCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIHJlcXVpcmVkOiBib29sZWFuID0gdHJ1ZSwgdGhyb3dFeGNlcHRpb246IGJvb2xlYW4gPSB0cnVlKTogYW55XG5cdHtcblx0XHRjb25zdCB2YWx1ZSA9IEhvdFN0YXEuZ2V0UGFyYW0gKG5hbWUsIG9ialdpdGhQYXJhbSwgcmVxdWlyZWQsIHRocm93RXhjZXB0aW9uKTtcblxuXHRcdGlmICh2YWx1ZSA8IG1pbilcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFBhcmFtZXRlciAke25hbWV9IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bWlufS5gKTtcblxuXHRcdGlmICh2YWx1ZSA+IG1heClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFBhcmFtZXRlciAke25hbWV9IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bWF4fS5gKTtcblxuXHRcdHJldHVybiAodmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGEgcmVxdWlyZWQgcGFyYW1ldGVyIGV4aXN0cyBpbnNpZGUgYW4gb2JqZWN0LiBJZiBpdCBleGlzdHMsIHJldHVybiB0aGUgdmFsdWUuXG5cdCAqIElmIGl0IGRvZXMgbm90IGV4aXN0LCByZXR1cm4gYSBkZWZhdWx0IHZhbHVlIGluc3RlYWQuXG5cdCAqL1xuXHRzdGF0aWMgZ2V0UGFyYW1EZWZhdWx0IChuYW1lOiBzdHJpbmcsIG9ialdpdGhQYXJhbTogYW55LCBkZWZhdWx0VmFsdWU6IGFueSk6IGFueVxuXHR7XG5cdFx0bGV0IHZhbHVlOiBhbnkgPSBvYmpXaXRoUGFyYW1bbmFtZV07XG5cblx0XHRpZiAodmFsdWUgPT0gbnVsbClcblx0XHRcdHJldHVybiAoZGVmYXVsdFZhbHVlKTtcblxuXHRcdGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRpZiAodmFsdWUgPT09IFwiXCIpXG5cdFx0XHRcdHJldHVybiAoZGVmYXVsdFZhbHVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIHZhbHVlIGlzIG51bGwgb3IgZW1wdHkuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZywgbnVsbCwgdW5kZWZpbmVkLCAwLCBldGMuXG5cdCAqL1xuXHRzdGF0aWMgY2hlY2tJZkVtcHR5ICh2YWx1ZTogYW55KTogYm9vbGVhblxuXHR7XG5cdFx0aWYgKCF2YWx1ZSlcblx0XHRcdHJldHVybiAodHJ1ZSk7XG5cblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIHJlcXVpcmVkIHBhcmFtZXRlciBleGlzdHMgaW5zaWRlIGFuIG9iamVjdC4gSWYgaXQgZXhpc3RzLCByZXR1cm4gdGhlIHZhbHVlLCBlbnN1cmUgdGhlIFxuXHQgKiBudW1iZXIgcmV0dXJuZWQgaXMgd2l0aGluIGEgY2VydGFpbiByYW5nZS4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIHJldHVybiBhIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC5cblx0ICogXG5cdCAqIFRoZSB2YWx1ZSByZXRyaWV2ZWQgbXVzdCBiZSBhIG51bWJlci5cblx0ICovXG5cdHN0YXRpYyBnZXRQYXJhbURlZmF1bHRSYW5nZSAobmFtZTogc3RyaW5nLCBvYmpXaXRoUGFyYW06IGFueSwgZGVmYXVsdFZhbHVlOiBhbnksIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IGFueVxuXHR7XG5cdFx0Y29uc3QgdmFsdWUgPSBIb3RTdGFxLmdldFBhcmFtRGVmYXVsdCAobmFtZSwgb2JqV2l0aFBhcmFtLCBkZWZhdWx0VmFsdWUpO1xuXG5cdFx0aWYgKHZhbHVlIDwgbWluKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgUGFyYW1ldGVyICR7bmFtZX0gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHttaW59LmApO1xuXG5cdFx0aWYgKHZhbHVlID4gbWF4KVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgUGFyYW1ldGVyICR7bmFtZX0gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHttYXh9LmApO1xuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbiBlcnJvci4gVGhpcyBjYW5ub3QgYmUgYW4gYXN5bmMgZnVuY3Rpb24gZHVlIHRvIHRoZSBuYXR1cmUgb2YgaG93IHRoaXMgd29ya3MuXG5cdCAqL1xuXHRzdGF0aWMgZXhlY3V0ZUVycm9yIChlcnJUeXBlOiBzdHJpbmcpXG5cdHtcblx0XHRpZiAoSG90U3RhcS5lcnJvcnNbZXJyVHlwZV0gIT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgdXJsOiBzdHJpbmcgPSBIb3RTdGFxLmVycm9yc1tlcnJUeXBlXS5yZWRpcmVjdFRvVXJsO1xuXG5cdFx0XHRpZiAodXJsICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh1cmwgIT09IFwiXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRsZXQgZnVuYyA9IEhvdFN0YXEuZXJyb3JzW2VyclR5cGVdLmZ1bmM7XG5cblx0XHRcdGlmIChmdW5jICE9IG51bGwpXG5cdFx0XHRcdGZ1bmMgKGVyclR5cGUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBXYWl0IGZvciBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgd2FpdCAobnVtTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRyZXR1cm4gKG5ldyBQcm9taXNlICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRzZXRUaW1lb3V0ICgoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJlc29sdmUgKCk7XG5cdFx0XHRcdFx0fSwgbnVtTWlsbGlzZWNvbmRzKTtcblx0XHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBwYWdlLlxuXHQgKi9cblx0YWRkUGFnZSAocGFnZTogSG90UGFnZSk6IHZvaWRcblx0e1xuXHRcdHRoaXMucGFnZXNbcGFnZS5uYW1lXSA9IHBhZ2U7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgcGFnZSB0byBwcm9jZXNzLlxuXHQgKi9cblx0Z2V0UGFnZSAocGFnZU5hbWU6IHN0cmluZyk6IEhvdFBhZ2Vcblx0e1xuXHRcdHJldHVybiAodGhpcy5wYWdlc1twYWdlTmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbiBpbXBvcnRlZCBtb2R1bGUuXG5cdCAqL1xuXHRhZGRNb2R1bGUgKG5hbWU6IHN0cmluZywgbW9kdWxlOiBIb3RNb2R1bGUpOiB2b2lkXG5cdHtcblx0XHR0aGlzLm1vZHVsZXNbbmFtZV0gPSBtb2R1bGU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFuIGltcG9ydGVkIG1vZHVsZS5cblx0ICovXG5cdGdldE1vZHVsZSAobmFtZTogc3RyaW5nKTogSG90TW9kdWxlXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMubW9kdWxlc1tuYW1lXSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgZmlsZS5cblx0ICovXG5cdGFkZEZpbGUgKGZpbGU6IEhvdEZpbGUpOiB2b2lkXG5cdHtcblx0XHRsZXQgbmFtZTogc3RyaW5nID0gZmlsZS5uYW1lO1xuXG5cdFx0aWYgKG5hbWUgPT09IFwiXCIpXG5cdFx0XHRuYW1lID0gZmlsZS5sb2NhbEZpbGU7XG5cblx0XHRpZiAobmFtZSA9PT0gXCJcIilcblx0XHRcdG5hbWUgPSBmaWxlLnVybDtcblxuXHRcdHRoaXMuZmlsZXNbbmFtZV0gPSBmaWxlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIGZpbGUuXG5cdCAqL1xuXHRnZXRGaWxlIChuYW1lOiBzdHJpbmcsIHRocm93RXg6IGJvb2xlYW4gPSB0cnVlKTogSG90RmlsZVxuXHR7XG5cdFx0aWYgKHRoaXMuZmlsZXNbbmFtZV0gPT0gbnVsbClcblx0XHR7XG5cdFx0XHRsZXQgcG9zOiBudW1iZXIgPSBuYW1lLmluZGV4T2YgKFwiP2hzdHFzZXJ2ZT1cIik7XG5cdFx0XHRsZXQgdGVtcE5hbWU6IHN0cmluZyA9IG5hbWU7XG5cblx0XHRcdGlmIChwb3MgPiAtMSlcblx0XHRcdFx0dGVtcE5hbWUgPSBuYW1lLnN1YnN0cmluZyAoMCwgcG9zKTtcblxuXHRcdFx0aWYgKHRoaXMuZmlsZXNbdGVtcE5hbWVdICE9IG51bGwpXG5cdFx0XHRcdHJldHVybiAodGhpcy5maWxlc1t0ZW1wTmFtZV0pO1xuXG5cdFx0XHRpZiAodGhyb3dFeCA9PT0gdHJ1ZSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgZmlsZSAke25hbWV9YCk7XG5cblx0XHRcdHJldHVybiAobnVsbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh0aGlzLmZpbGVzW25hbWVdKTtcblx0fVxuXG5cdC8qKiBcblx0ICogS2VlcCB0aGUgY29udGV4dCB0aGUgb2JqZWN0IGlzIGN1cnJlbnRseSBpbi5cblx0ICogXG5cdCAqIEBwYXJhbSBmdW5jIFRoZSBkb2N1bWVudCBlbGVtZW50J3MgaWQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBvYmplY3QgdG8gcmVtYWluIGluIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBbdmFsPXVuZGVmaW5lZF0gQW4gYWRkaXRpb25hbCB2YWx1ZSB0byBwYXNzIHRvIHRoZSBjb250ZXh0LlxuXHQgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCByZXN1bHQgZnJvbSB0aGUgZnVuY3Rpb24gZnVuYy5cblx0ICovXG5cdHN0YXRpYyBrZWVwQ29udGV4dChmdW5jOiBGdW5jdGlvbiwgY29udGV4dDogYW55LCB2YWw/OiBhbnkpOiBhbnlcblx0e1xuXHRcdHZhciBvYmpSZXR1cm4gPSBmdW5jdGlvbigpXG5cdFx0XHR7XG5cdFx0XHRcdHZhciBhcnlBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuXHRcdFx0XHRpZiAodmFsICE9IHVuZGVmaW5lZClcblx0XHRcdFx0XHRhcnlBcmdzLnB1c2godmFsKTtcblxuXHRcdFx0XHRpZiAoY29udGV4dCA9PSBudWxsKVxuXHRcdFx0XHRcdHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyeUFyZ3MpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJ5QXJncyk7XG5cdFx0XHR9O1xuXG5cdFx0cmV0dXJuIG9ialJldHVybjtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW5kIHJlZ2lzdGVyIGEgY29tcG9uZW50LlxuXHQgKi9cblx0YWRkQ29tcG9uZW50IChDb21wb25lbnRUeXBlOiAobmV3IChjb3B5OiBJSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpPzogSG90QVBJKSA9PiBIb3RDb21wb25lbnQpLCBhcGk6IEhvdEFQSSA9IG51bGwsIFxuXHRcdGVsZW1lbnRPcHRpb25zOiBFbGVtZW50RGVmaW5pdGlvbk9wdGlvbnMgPSB1bmRlZmluZWQpOiB2b2lkXG5cdHtcblx0XHRsZXQgdGVtcEFwaSA9IHRoaXMuYXBpXG5cblx0XHRpZiAoYXBpICE9IG51bGwpXG5cdFx0XHR0ZW1wQXBpID0gYXBpO1xuXG5cdFx0bGV0IHRlbXBDb21wb25lbnRPYmogPSBuZXcgQ29tcG9uZW50VHlwZSAodGhpcywgdGVtcEFwaSk7XG5cblx0XHRpZiAodGhpcy5jb21wb25lbnRzW3RlbXBDb21wb25lbnRPYmoudGFnXSAhPSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQ29tcG9uZW50ICR7dGVtcENvbXBvbmVudE9iai50YWd9IGFscmVhZHkgZXhpc3RzIWApO1xuXG5cdFx0dGhpcy5jb21wb25lbnRzW3RlbXBDb21wb25lbnRPYmoudGFnXSA9IHsgY29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZSwgcHJvY2Vzc29yOiB0aGlzLCBhcGk6IHRlbXBBcGkgfTtcblx0XHRyZWdpc3RlckNvbXBvbmVudC5jYWxsICh0aGlzLCB0ZW1wQ29tcG9uZW50T2JqLnRhZywgZWxlbWVudE9wdGlvbnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvcnJlY3QgYW55IEhUTUwgcHJpb3IgdG8gRE9NIHBhcnNpbmcuIFRoaXMgb25seSBhY2NvdW50cyBmb3IgPHRyPiBjdXJyZW50bHkuXG5cdCAqL1xuXHRzdGF0aWMgZml4SFRNTCAoc3RyOiBzdHJpbmcpOiB7IGZpeGVkU3RyOiBzdHJpbmcsIHF1ZXJ5U2VsZWN0b3I6IHN0cmluZzsgfVxuXHR7XG5cdFx0Ly8gVGFrZSBpbnRvIGFjY291bnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBYTUwgYW5kIEhUTUwuXG5cdFx0Y29uc3QgdGVtcFN0cjogc3RyaW5nID0gc3RyLnJlcGxhY2UoLyBcXC8+L2csICc+JykucmVwbGFjZShcblx0XHRcdC8oPChhcmVhfGJhc2V8YnJ8Y29sfGNvbW1hbmR8ZW1iZWR8aHJ8aW1nfGlucHV0fGtleWdlbnxsaW5rfG1ldGF8cGFyYW18c291cmNlfHRyYWNrfHdicikuKj8+KS9nLCAnJDE8LyQyPicpO1xuXHRcdGNvbnN0IHBhcnNlZFhNTCA9IG5ldyBET01QYXJzZXIgKCkucGFyc2VGcm9tU3RyaW5nIChgPHhtbD4ke3RlbXBTdHJ9PC94bWw+YCwgXCJ0ZXh0L3htbFwiKTtcblx0XHRsZXQgcXVlcnlTZWxlY3Rvcjogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmIChwYXJzZWRYTUwuZG9jdW1lbnRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0Y29uc3QgdGFnTmFtZTogc3RyaW5nID0gcGFyc2VkWE1MLmRvY3VtZW50RWxlbWVudC5jaGlsZHJlblswXS50YWdOYW1lLnRvTG93ZXJDYXNlICgpO1xuXG5cdFx0XHRpZiAodGFnTmFtZSA9PT0gXCJ0clwiKVxuXHRcdFx0e1xuXHRcdFx0XHRzdHIgPSBgPHRhYmxlPiR7c3RyfTwvdGFibGU+YDtcblx0XHRcdFx0cXVlcnlTZWxlY3RvciA9IFwidGJvZHlcIjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRhZ05hbWUgPT09IFwidGhcIilcblx0XHRcdHtcblx0XHRcdFx0c3RyID0gYDx0YWJsZT4ke3N0cn08L3RhYmxlPmA7XG5cdFx0XHRcdHF1ZXJ5U2VsZWN0b3IgPSB0YWdOYW1lO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAoeyBmaXhlZFN0cjogc3RyLCBxdWVyeVNlbGVjdG9yOiBxdWVyeVNlbGVjdG9yIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyBIVE1MIGVsZW1lbnQocykgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQuXG5cdCAqL1xuXHRzdGF0aWMgYWRkSHRtbCAocGFyZW50OiBzdHJpbmcgfCBIVE1MRWxlbWVudCwgaHRtbDogc3RyaW5nIHwgSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IEhUTUxFbGVtZW50W11cblx0e1xuXHRcdGxldCBmb3VuZFBhcmVudDogSFRNTEVsZW1lbnQgPSBudWxsO1xuXG5cdFx0aWYgKHR5cGVvZiAocGFyZW50KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdGZvdW5kUGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciAocGFyZW50KTtcblx0XHRlbHNlXG5cdFx0XHRmb3VuZFBhcmVudCA9IHBhcmVudDtcblxuXHRcdGlmIChmb3VuZFBhcmVudCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgcGFyZW50ICR7cGFyZW50fSFgKTtcblxuXHRcdGxldCByZXN1bHQ6IEhUTUxFbGVtZW50ID0gbnVsbDtcblxuXHRcdGlmICh0eXBlb2YgKGh0bWwpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdGxldCBodG1sSGFuZGxlciA9IEhvdFN0YXEuZml4SFRNTCAoaHRtbCk7XG5cdFx0XHRsZXQgbmV3RE9NOiBEb2N1bWVudCA9IG5ldyBET01QYXJzZXIgKCkucGFyc2VGcm9tU3RyaW5nIChodG1sSGFuZGxlci5maXhlZFN0ciwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0XHRsZXQgY2hpbGRyZW46IGFueSA9IG51bGw7XG5cblx0XHRcdGlmIChodG1sSGFuZGxlci5xdWVyeVNlbGVjdG9yID09PSBcIlwiKVxuXHRcdFx0XHRjaGlsZHJlbiA9IG5ld0RPTS5ib2R5LmNoaWxkcmVuO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRjaGlsZHJlbiA9IG5ld0RPTS5xdWVyeVNlbGVjdG9yIChodG1sSGFuZGxlci5xdWVyeVNlbGVjdG9yKS5jaGlsZHJlbjtcblxuXHRcdFx0bGV0IHJlc3VsdHM6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBjaGlsZHJlbi5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGNoaWxkOiBIVE1MRWxlbWVudCA9ICg8SFRNTEVsZW1lbnQ+Y2hpbGRyZW5baUlkeF0pO1xuXG5cdFx0XHRcdHJlc3VsdHMucHVzaCAoZm91bmRQYXJlbnQuYXBwZW5kQ2hpbGQgKGNoaWxkKSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAocmVzdWx0cyk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHJlc3VsdCA9IGZvdW5kUGFyZW50LmFwcGVuZENoaWxkIChodG1sKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIEhvdFNpdGUncyBuYW1lIGlzIHZhbGlkLlxuXHQgKi9cblx0c3RhdGljIGNoZWNrSG90U2l0ZU5hbWUgKGhvdHNpdGVOYW1lOiBzdHJpbmcsIHRocm93RXhjZXB0aW9uOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuXG5cdHtcblx0XHRsZXQgcmVzdWx0cyA9IHZhbGlkYXRlTW9kdWxlTmFtZSAoaG90c2l0ZU5hbWUpO1xuXHRcdGxldCBpc1ZhbGlkOiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdGlmIChyZXN1bHRzLnZhbGlkRm9yTmV3UGFja2FnZXMgPT09IGZhbHNlKVxuXHRcdFx0aXNWYWxpZCA9IGZhbHNlO1xuXG5cdFx0aWYgKHJlc3VsdHMuZXJyb3JzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHJlc3VsdHMuZXJyb3JzLmxlbmd0aCA+IDApXG5cdFx0XHRcdGlzVmFsaWQgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoaXNWYWxpZCA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRocm93RXhjZXB0aW9uID09PSB0cnVlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RTaXRlICR7aG90c2l0ZU5hbWV9IGhhcyBhbiBpbnZhbGlkIG5hbWUhIFRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eSBhbmQgbXVzdCBoYXZlIGEgdmFsaWQgTlBNIG1vZHVsZSBuYW1lLmApO1xuXHRcdH1cblxuXHRcdHJldHVybiAoaXNWYWxpZCk7XG5cdH1cblxuXHQvKipcblx0ICogSW4gdGhlIHN1cHBsaWVkIGNvbnRlbnQsIHJlcGxhY2UgYSBrZXkgaW4gYSAke0tFWX0gd2l0aCBhIHZhbHVlLlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIGNvbnRlbnQgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZXMuXG5cdCAqL1xuXHRzdGF0aWMgcmVwbGFjZUtleSAoY29udGVudDogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZ1xuXHR7XG5cdFx0Y29uc3QgZmluYWxTdHI6IHN0cmluZyA9IGNvbnRlbnQucmVwbGFjZSAobmV3IFJlZ0V4cCAoYFxcXFwkXFxcXHske2tleX1cXFxcfWAsIFwiZ1wiKSwgdmFsdWUpO1xuXG5cdFx0cmV0dXJuIChmaW5hbFN0cik7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdmFsdWUgZnJvbSBhIEhvdFNpdGUgb2JqZWN0LlxuXHQgKiBcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgdmFsdWUgZnJvbSB0aGUgaG90c2l0ZSBvYmplY3QuIFJldHVybnMgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0c3RhdGljIGdldFZhbHVlRnJvbUhvdFNpdGVPYmogKGhvdHNpdGU6IEhvdFNpdGUsIHBhcmFtczogc3RyaW5nW10pOiBhbnlcblx0e1xuXHRcdGxldCB2YWx1ZTogYW55ID0gbnVsbDtcblxuXHRcdGlmIChob3RzaXRlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0bGV0IHByZXZWYWx1ZTogYW55ID0gaG90c2l0ZTtcblxuXHRcdFx0Ly8gR28gdGhyb3VnaCBlYWNoIG9iamVjdCBpbiB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIGFuZCBcblx0XHRcdC8vIGdldCB0aGUgdmFsdWUgb2YgdGhlIGZpbmFsIHBhcmFtZXRlci5cblx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgcGFyYW1zLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcGFyYW06IHN0cmluZyA9IHBhcmFtc1tpSWR4XTtcblxuXHRcdFx0XHRpZiAocHJldlZhbHVlW3BhcmFtXSA9PSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cHJldlZhbHVlID0gbnVsbDtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cHJldlZhbHVlID0gcHJldlZhbHVlW3BhcmFtXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByZXZWYWx1ZSAhPSBudWxsKVxuXHRcdFx0XHR2YWx1ZSA9IHByZXZWYWx1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGEgSG90U2l0ZS5cblx0ICovXG5cdGFzeW5jIHByb2Nlc3NIb3RTaXRlICh0ZXN0ZXI6IEhvdFRlc3RlciA9IG51bGwpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRIb3RTdGFxLmNoZWNrSG90U2l0ZU5hbWUgKHRoaXMuaG90U2l0ZS5uYW1lLCB0cnVlKTtcblxuXHRcdGxldCByb3V0ZXMgPSB0aGlzLmhvdFNpdGUucm91dGVzO1xuXG5cdFx0aWYgKHJvdXRlcyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGtleSBpbiByb3V0ZXMpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCByb3V0ZTogSG90U2l0ZVJvdXRlID0gcm91dGVzW2tleV07XG5cdFx0XHRcdGxldCBmaWxlOiBIb3RGaWxlID0gbmV3IEhvdEZpbGUgKHJvdXRlKTtcblx0XHRcdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSBuZXcgSG90UGFnZSAoe1xuXHRcdFx0XHRcdFx0cHJvY2Vzc29yOiB0aGlzLFxuXHRcdFx0XHRcdFx0bmFtZTogcm91dGUubmFtZSB8fCBcIlwiLFxuXHRcdFx0XHRcdFx0cm91dGU6IGtleSxcblx0XHRcdFx0XHRcdGZpbGVzOiBbZmlsZV1cblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAodGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSByb3V0ZS5uYW1lO1xuXHRcdFx0XHRcdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRpZiAocm91dGUubWFwICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHJvdXRlLm1hcCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGVzdGVyLnRlc3RNYXBzW3JvdXRlLm1hcF0gPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgbWFwICR7cm91dGUubWFwfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXSA9IHRlc3Rlci50ZXN0TWFwc1tyb3V0ZS5tYXBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHRlc3RNYXAgPSBuZXcgSG90VGVzdE1hcCAoKTtcblx0XHRcdFx0XHRcdFx0XHRsZXQgZGVzdGluYXRpb25zOiBIb3RUZXN0RGVzdGluYXRpb25bXSB8IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3REZXN0aW5hdGlvbiB9ID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZS5tYXAgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnMgPSBbXTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCByb3V0ZS5tYXAubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBkZXN0ID0gcm91dGUubWFwW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9ucy5wdXNoIChuZXcgSG90VGVzdERlc3RpbmF0aW9uIChkZXN0KSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnMgPSB7fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQga2V5MiBpbiByb3V0ZS5tYXApXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBkZXN0ID0gcm91dGUubWFwW2tleTJdO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9uc1trZXkyXSA9IG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKGRlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdHRlc3RNYXAuZGVzdGluYXRpb25zID0gZGVzdGluYXRpb25zO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dGVzdGVyLnRlc3RNYXBzW21hcE5hbWVdID0gdGVzdE1hcDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHJvdXRlLmRlc3RpbmF0aW9uT3JkZXIgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGVzdGVyLnRlc3RNYXBzW21hcE5hbWVdLmRlc3RpbmF0aW9uT3JkZXIgPSByb3V0ZS5kZXN0aW5hdGlvbk9yZGVyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYWRkUGFnZSAocGFnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS53ZWIgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5ob3RTaXRlLndlYilcblx0XHRcdHtcblx0XHRcdFx0Y29uc3Qgd2ViID0gdGhpcy5ob3RTaXRlLndlYltrZXldO1xuXG5cdFx0XHRcdGlmICh3ZWIubWFwID09IG51bGwpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IGZhbHNlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgbWFwTmFtZTogc3RyaW5nID0ga2V5O1xuXHRcdFx0XHRcdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSBuZXcgSG90VGVzdE1hcCAoKTtcblxuXHRcdFx0XHRcdFx0dGVzdE1hcC5kZXN0aW5hdGlvbnMgPSBbXTtcblxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB3ZWIubWFwLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgbWFwOiBzdHJpbmcgPSB3ZWIubWFwW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRcdHRlc3RNYXAuZGVzdGluYXRpb25zLnB1c2ggKG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKG1hcCkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXSA9IHRlc3RNYXA7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKFwiQSB0ZXN0ZXIgd2FzIG5vdCBjcmVhdGVkIGZpcnN0ISBZb3UgbXVzdCBzcGVjaWZ5IG9uZSBpbiB0aGUgQ0xJLlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLmFwaXMgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5ob3RTaXRlLmFwaXMpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBhcGkgPSB0aGlzLmhvdFNpdGUuYXBpc1trZXldO1xuXG5cdFx0XHRcdGlmIChhcGkubWFwID09IG51bGwpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IGZhbHNlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRoaXMubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgbWFwTmFtZTogc3RyaW5nID0ga2V5O1xuXHRcdFx0XHRcdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSBuZXcgSG90VGVzdE1hcCAoKTtcblxuXHRcdFx0XHRcdFx0dGVzdE1hcC5kZXN0aW5hdGlvbnMgPSBbXTtcblxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBhcGkubWFwLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgbWFwOiBzdHJpbmcgPSBhcGkubWFwW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRcdHRlc3RNYXAuZGVzdGluYXRpb25zLnB1c2ggKG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKG1hcCkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXSA9IHRlc3RNYXA7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKFwiQSB0ZXN0ZXIgd2FzIG5vdCBjcmVhdGVkIGZpcnN0ISBZb3UgbXVzdCBzcGVjaWZ5IG9uZSBpbiB0aGUgQ0xJLlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLy8gQGZpeG1lIEFsbG93IHRoaXMgdG8gd29yayBmb3Igc2VydmVyLXNpZGUgYXMgd2VsbC4uLlxuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUuY29tcG9uZW50cylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGNvbXBvbmVudCA9IHRoaXMuaG90U2l0ZS5jb21wb25lbnRzW2tleV07XG5cdFx0XHRcdGxldCBjb21wb25lbnRVcmw6IHN0cmluZyA9IGNvbXBvbmVudC51cmw7XG5cblx0XHRcdFx0Ly8vIEBmaXhtZSBDcmVhdGUgdW5pdCB0ZXN0IGZvciBmZXRjaGluZywgbG9hZGluZywgYW5kIHJlZ2lzdGVyaW5nLlxuXHRcdFx0XHRsZXQgcmVzOiBhbnkgPSBhd2FpdCBmZXRjaCAoY29tcG9uZW50VXJsKTtcblx0XHRcdFx0bGV0IENvbXBvbmVudENsYXNzID0gZXZhbCAocmVzKTtcblxuXHRcdFx0XHR0aGlzLmFkZENvbXBvbmVudCAoQ29tcG9uZW50Q2xhc3MpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmhvdFNpdGUucm91dGVzID09IG51bGwpXG5cdFx0XHR0aGlzLmhvdFNpdGUucm91dGVzID0ge307XG5cblx0XHRsZXQgZGlzYWJsZUZpbGVMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLmRpc2FibGVGaWxlTG9hZGluZyAhPSBudWxsKVxuXHRcdFx0ZGlzYWJsZUZpbGVMb2FkaW5nID0gdGhpcy5ob3RTaXRlLmRpc2FibGVGaWxlTG9hZGluZztcblxuXHRcdGlmIChkaXNhYmxlRmlsZUxvYWRpbmcgPT09IGZhbHNlKVxuXHRcdFx0YXdhaXQgdGhpcy5sb2FkSG90RmlsZXMgKHRoaXMuaG90U2l0ZS5maWxlcywgZmFsc2UsIGZhbHNlKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgSG90c2l0ZSBoYXMgZmlsZSBsb2FkaW5nIGRpc2FibGVkLi4uYCk7XG5cblx0XHRpZiAodGVzdGVyICE9IG51bGwpXG5cdFx0XHR0aGlzLmFkZFRlc3RlciAodGVzdGVyKTtcblxuXHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBQcm9jZXNzZWQgSG90U2l0ZSAke3RoaXMuaG90U2l0ZS5uYW1lfWApO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgZnJvbSBhIEhvdFNpdGUuanNvbiBmaWxlLiBCZSBzdXJlIHRvIGxvYWQgYW5kIGF0dGFjaCBhbnkgdGVzdGVycyBiZWZvcmUgXG5cdCAqIGxvYWRpbmcgYSBIb3RTaXRlLlxuXHQgKi9cblx0YXN5bmMgbG9hZEhvdFNpdGUgKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBqc29uU3RyOiBzdHJpbmcgPSBcIlwiO1xuXHRcdGNvbnN0IGV4dDogc3RyaW5nID0gcHBhdGguZXh0bmFtZSAocGF0aCkudG9Mb3dlckNhc2UgKCk7XG5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgRG93bmxvYWRpbmcgSG90U2l0ZSAke3BhdGh9YCk7XG5cblx0XHRcdGxldCByZXM6IGFueSA9IGF3YWl0IGZldGNoIChwYXRoKTtcblxuXHRcdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYERvd25sb2FkZWQgc2l0ZSAke3BhdGh9YCk7XG5cblx0XHRcdGpzb25TdHIgPSByZXMudGV4dCAoKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHBhdGggPSBwcGF0aC5ub3JtYWxpemUgKHBhdGgpO1xuXG5cdFx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgQWNjZXNzaW5nIEhvdFNpdGUgJHtwYXRofWApO1xuXG5cdFx0XHRsZXQgSG90SU8gPSBldmFsIChcInJlcXVpcmVcIikoXCIuL0hvdElPXCIpLkhvdElPOyAvLyBIYWNrIHRvIGdldCBhcm91bmQgV2VicGFjay5cblxuXHRcdFx0aWYgKGF3YWl0IEhvdElPLmV4aXN0cyAocGF0aCkgPT09IGZhbHNlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RTaXRlICR7cGF0aH0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdGpzb25TdHIgPSBhd2FpdCBIb3RJTy5yZWFkVGV4dEZpbGUgKHBhdGgpO1xuXHRcdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYEFjY2Vzc2VkIHNpdGUgJHtwYXRofWApO1xuXHRcdH1cblxuXHRcdGlmICgoZXh0ID09PSBcIi55YW1sXCIpIHx8IChleHQgPT09IFwiLnltbFwiKSlcblx0XHR7XG5cdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgWUFNTCBzdXBwb3J0IGZvciBIb3RTaXRlcyBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSB3ZWIgeWV0IWApO1xuXG5cdFx0XHRsZXQgeWFtbCA9IGV2YWwgKFwicmVxdWlyZVwiKShcInlhbWxcIik7IC8vIEhhY2sgdG8gZ2V0IGFyb3VuZCBXZWJwYWNrLlxuXHRcdFx0dGhpcy5ob3RTaXRlID0geWFtbC5wYXJzZSAoanNvblN0cik7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuaG90U2l0ZSA9IEpTT04ucGFyc2UgKGpzb25TdHIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90U2l0ZSAke3BhdGh9IGNhbm5vdCBiZSBudWxsIWApO1xuXG5cdFx0dGhpcy5ob3RTaXRlLmhvdHNpdGVQYXRoID0gcGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlIHRoZSBjdXJyZW50IEhvdFNpdGUgdG8gYSBmaWxlLlxuXHQgKi9cblx0YXN5bmMgc2F2ZUhvdFNpdGUgKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQ2Fubm90IHNhdmUgYSBIb3RTaXRlIG9uIHRoZSB3ZWIhYCk7XG5cblx0XHRjb25zdCBleHQ6IHN0cmluZyA9IHBwYXRoLmV4dG5hbWUgKHBhdGgpLnRvTG93ZXJDYXNlICgpO1xuXHRcdGxldCBob3RzaXRlU3RyOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKChleHQgPT09IFwiLnlhbWxcIikgfHwgKGV4dCA9PT0gXCIueW1sXCIpKVxuXHRcdHtcblx0XHRcdGxldCB5YW1sID0gZXZhbCAoXCJyZXF1aXJlXCIpKFwieWFtbFwiKTsgLy8gSGFjayB0byBnZXQgYXJvdW5kIFdlYnBhY2suXG5cdFx0XHRob3RzaXRlU3RyID0geWFtbC5zdHJpbmdpZnkgKHRoaXMuaG90U2l0ZSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdGhvdHNpdGVTdHIgPSBKU09OLnN0cmluZ2lmeSAodGhpcy5ob3RTaXRlLCBudWxsLCAyKTtcblxuXHRcdGxldCBIb3RJTyA9IGV2YWwgKFwicmVxdWlyZVwiKShcIi4vSG90SU9cIikuSG90SU87IC8vIEhhY2sgdG8gZ2V0IGFyb3VuZCBXZWJwYWNrLlxuXHRcdGF3YWl0IEhvdElPLndyaXRlVGV4dEZpbGUgKHBhdGgsIGhvdHNpdGVTdHIpO1xuXHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBTYXZlZCBzaXRlICR7cGF0aH1gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIGFuIGFycmF5IG9mIGZpbGVzLiBJZiBhIGZpbGUgYWxyZWFkeSBoYXMgY29udGVudCwgaXQgd2lsbCBub3QgYmUgcmVsb2FkZWQgXG5cdCAqIHVubGVzcyBmb3JjZUNvbnRlbnRMb2FkaW5nIGlzIHNldCB0byB0cnVlLlxuXHQgKi9cblx0YXN5bmMgbG9hZEhvdEZpbGVzIChmaWxlczogeyBbbmFtZTogc3RyaW5nXTogeyB1cmw/OiBzdHJpbmc7IGxvY2FsRmlsZT86IHN0cmluZzsgY29udGVudD86IHN0cmluZzsgfSB9LCBcblx0XHRcdGZvcmNlQ29udGVudExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZSwgbG9hZFVybENvbnRlbnQ6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYExvYWRpbmcgSG90dCBmaWxlcy4uLmApO1xuXG5cdFx0Zm9yIChsZXQga2V5IGluIGZpbGVzKVxuXHRcdHtcblx0XHRcdGxldCBmaWxlID0gZmlsZXNba2V5XTtcblx0XHRcdGxldCBuZXdGaWxlOiBIb3RGaWxlID0gbnVsbDtcblxuXHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdG5ld0ZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XHRcdFx0XCJuYW1lXCI6IGtleVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRuZXdGaWxlID0gbmV3IEhvdEZpbGUgKHtcblx0XHRcdFx0XHRcdFwibmFtZVwiOiBrZXlcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGZpbGUudXJsICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdFx0XHRcdG5ld0ZpbGUudXJsID0gYCR7ZmlsZS51cmx9P2hzdHFzZXJ2ZT1uYWhmYW1gO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0bmV3RmlsZS51cmwgPSBmaWxlLnVybDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IGZhbHNlKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoZmlsZS5sb2NhbEZpbGUgIT0gbnVsbClcblx0XHRcdFx0XHRuZXdGaWxlLmxvY2FsRmlsZSA9IGZpbGUubG9jYWxGaWxlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgbG9hZENvbnRlbnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdFx0XHRpZiAoZmlsZS5jb250ZW50ICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdG5ld0ZpbGUuY29udGVudCA9IGZpbGUuY29udGVudDtcblx0XHRcdFx0bG9hZENvbnRlbnQgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGZvcmNlQ29udGVudExvYWRpbmcgPT09IHRydWUpXG5cdFx0XHRcdGxvYWRDb250ZW50ID0gdHJ1ZTtcblxuXHRcdFx0aWYgKGxvYWRVcmxDb250ZW50ID09PSBmYWxzZSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKG5ld0ZpbGUudXJsICE9PSBcIlwiKVxuXHRcdFx0XHRcdGxvYWRDb250ZW50ID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChsb2FkQ29udGVudCA9PT0gdHJ1ZSlcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYExvYWRpbmcgSG90dCBmaWxlOiAke25ld0ZpbGUudXJsfWApO1xuXHRcdFx0XHRhd2FpdCBuZXdGaWxlLmxvYWQgKCk7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKGBGaW5pc2hlZCBsb2FkaW5nIEhvdHQgZmlsZTogJHtuZXdGaWxlLnVybH1gKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5hZGRGaWxlIChuZXdGaWxlKTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci52ZXJib3NlIChgRmluaXNoZWQgbG9hZGluZyBIb3R0IGZpbGVzLi4uYCk7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGUgdGhlIGNvbnRlbnQgdG8gc2VuZCB0byBhIGNsaWVudC5cblx0ICovXG5cdGFzeW5jIGdlbmVyYXRlQ29udGVudCAocm91dGVLZXk6IHN0cmluZywgbmFtZTogc3RyaW5nID0gXCJcIiwgdXJsOiBzdHJpbmcgPSBcIi4vXCIsXG5cdFx0XHRqc1NyY1BhdGg6IHN0cmluZyA9IFwiLi9qcy9Ib3RTdGFxLm1pbi5qc1wiLCBwYXNzQXJnczogYm9vbGVhbiA9IHRydWUsIFxuXHRcdFx0YXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IGFwaVNjcmlwdHM6IHN0cmluZyA9IFwiXCI7XG5cdFx0bGV0IGFwaUNvZGU6IHN0cmluZyA9IFwiXCI7XG5cdFx0bGV0IHB1YmxpY0tleXM6IHN0cmluZyA9IFwiXCI7XG5cblx0XHQvLy8gQHRvZG8gT3B0aW1pemUgdGhpcyBmdW5jdGlvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLlxuXG5cdFx0Ly8gTG9hZCB0aGUgQVBJIHN0cmluZy5cblx0XHRpZiAodGhpcy5ob3RTaXRlICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaSAhPT0gXCJcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IGdsb2JhbEFwaSA9IHRoaXMuaG90U2l0ZS5hcGlzW3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpXTtcblxuXHRcdFx0XHRcdGlmIChnbG9iYWxBcGkgPT0gbnVsbClcblx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7dGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGl9IGRvZXNuJ3QgZXhpc3QhYCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBzZW5kSlNDb250ZW50OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0aWYgKGdsb2JhbEFwaS5qc2FwaSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7dGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGl9IGRvZXNuJ3QgaGF2ZSBhIGpzYXBpIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGdsb2JhbEFwaS5saWJyYXJ5TmFtZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7dGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGl9IGRvZXNuJ3QgaGF2ZSBhIGxpYnJhcnlOYW1lIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGdsb2JhbEFwaS5hcGlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHt0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaX0gZG9lc24ndCBoYXZlIGEgYXBpTmFtZSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChzZW5kSlNDb250ZW50ID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRhcGlTY3JpcHRzICs9IGBcXHQ8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiIHNyYyA9IFwiJHtnbG9iYWxBcGkuanNhcGl9XCI+PC9zY3JpcHQ+XFxuYDtcblxuXHRcdFx0XHRcdFx0XHRsZXQgYmFzZVVybDogc3RyaW5nID0gXCJcXFwiXFxcIlwiO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChnbG9iYWxBcGkudXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0YmFzZVVybCA9IGBcXFwiJHtnbG9iYWxBcGkudXJsfVxcXCJgO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmFwaSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGJhc2VVcmwgPSBgXFxcIiR7dGhpcy5hcGkuYmFzZVVybH1cXFwiYDtcblxuXHRcdFx0XHRcdFx0XHRsZXQgdGVtcEFQSUNvbnRlbnQ6IHN0cmluZyA9IHRoaXMuYXBpQ29udGVudDtcblx0XHRcdFx0XHRcdFx0dGVtcEFQSUNvbnRlbnQgPSB0ZW1wQVBJQ29udGVudC5yZXBsYWNlICgvXFwlYXBpXFxfbmFtZVxcJS9nLCBnbG9iYWxBcGkuYXBpTmFtZSk7XG5cdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX2V4cG9ydGVkXFxfbmFtZVxcJS9nLCBnbG9iYWxBcGkubGlicmFyeU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCViYXNlXFxfdXJsXFwlL2csIGJhc2VVcmwpO1xuXG5cdFx0XHRcdFx0XHRcdGFwaUNvZGUgKz0gdGVtcEFQSUNvbnRlbnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmhvdFNpdGUuYXBpcyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcm91dGUgPSB0aGlzLmhvdFNpdGUucm91dGVzW3JvdXRlS2V5XTtcblxuXHRcdFx0XHRpZiAocm91dGUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChyb3V0ZS5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgYXBpID0gdGhpcy5ob3RTaXRlLmFwaXNbcm91dGUuYXBpXTtcblxuXHRcdFx0XHRcdFx0aWYgKGFwaSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZmluZCBBUEkgJHtyb3V0ZS5hcGl9YCk7XG5cblx0XHRcdFx0XHRcdGlmIChyb3V0ZS5hcGkgIT09IHRoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgc2VuZEpTQ29udGVudDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGFwaS5qc2FwaSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7cm91dGUuYXBpfSBkb2Vzbid0IGhhdmUgYSBqc2FwaSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoYXBpLmxpYnJhcnlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHtyb3V0ZS5hcGl9IGRvZXNuJ3QgaGF2ZSBhIGxpYnJhcnlOYW1lIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhcGkuYXBpTmFtZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7cm91dGUuYXBpfSBkb2Vzbid0IGhhdmUgYSBhcGlOYW1lIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChzZW5kSlNDb250ZW50ID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGpzYXBpcGF0aCA9IGFwaS5qc2FwaTtcblx0XHRcdFx0XHRcdFx0XHRhcGlTY3JpcHRzICs9IGBcXHQ8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiIHNyYyA9IFwiJHtqc2FwaXBhdGh9XCI+PC9zY3JpcHQ+XFxuYDtcblxuXHRcdFx0XHRcdFx0XHRcdGxldCBiYXNlVXJsOiBzdHJpbmcgPSBcIlxcXCJcXFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYXBpLnVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0YmFzZVVybCA9IGBcXFwiJHthcGkudXJsfVxcXCJgO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRiYXNlVXJsID0gYFxcXCIke3RoaXMuYXBpLmJhc2VVcmx9XFxcImA7XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgdGVtcEFQSUNvbnRlbnQ6IHN0cmluZyA9IHRoaXMuYXBpQ29udGVudDtcblx0XHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9uYW1lXFwlL2csIGFwaS5hcGlOYW1lKTtcblx0XHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9leHBvcnRlZFxcX25hbWVcXCUvZywgYXBpLmxpYnJhcnlOYW1lKTtcblx0XHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCViYXNlXFxfdXJsXFwlL2csIGJhc2VVcmwpO1xuXG5cdFx0XHRcdFx0XHRcdFx0YXBpQ29kZSArPSB0ZW1wQVBJQ29udGVudDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlciAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlci5qc1NyY1BhdGggIT0gbnVsbClcblx0XHRcdFx0XHRqc1NyY1BhdGggPSB0aGlzLmhvdFNpdGUuc2VydmVyLmpzU3JjUGF0aDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5wdWJsaWNLZXlzICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUucHVibGljS2V5cylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBzZWNyZXQgPSB0aGlzLmhvdFNpdGUucHVibGljS2V5c1trZXldO1xuXHRcdFx0XHRcdGxldCB2YWx1ZTogc3RyaW5nID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAoc2VjcmV0KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHZhbHVlID0gSlNPTi5zdHJpbmdpZnkgKHNlY3JldCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkuY29ubmVjdGlvbiA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQ2Fubm90IHBhc3Mgc2VjcmV0cyBmcm9tIHRoZSBBUEkgaWYgdGhlcmUncyBubyBjb25uZWN0aW9uIWApO1xuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNlcnZlckNvbm46IEhvdFNlcnZlciA9ICg8SG90U2VydmVyPnRoaXMuYXBpLmNvbm5lY3Rpb24pO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNlY3JldC5wYXNzU2VjcmV0RnJvbUFQSSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAoc2VydmVyQ29ubi5zZWNyZXRzW2tleV0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKHNlY3JldC5lbnYgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vLyBAZml4bWUgQHNlY3Z1bCBJcyB0aGlzIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eT8gTmVlZCB0byB2ZXJpZnkgdGhhdCBcblx0XHRcdFx0XHRcdFx0XHQvLy8gb25seSB0aGUgc2VydmVyIGhhcyBhY2Nlc3MgdG8gdGhpcy4gQXQgdGhpcyBwb2ludCwgSSB0aGluayBvbmx5IHRoZSBcblx0XHRcdFx0XHRcdFx0XHQvLy8gc2VydmVyIGhhcyBhY2Nlc3MuXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZW52S2V5OiBzdHJpbmcgPSBzZWNyZXQuZW52O1xuXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAocHJvY2Vzcy5lbnZbZW52S2V5XSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRwdWJsaWNLZXlzICs9IGBwcm9jZXNzb3IucHVibGljS2V5c1tcIiR7a2V5fVwiXSA9ICR7dmFsdWV9O1xcbmA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgY29udGVudDogc3RyaW5nID0gdGhpcy5wYWdlQ29udGVudDtcblx0XHRsZXQgZml4Q29udGVudCA9IGFzeW5jICh0ZW1wQ29udGVudDogc3RyaW5nKSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgZGV2ZWxvcGVyTW9kZVN0cjogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IHRlc3RlckFQSVN0cjogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZGV2ZWxvcGVyTW9kZVN0ciA9IGB0ZW1wTW9kZSA9IEhvdFN0YXFXZWIuRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudDtgO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZSAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJBUElTdHIgPSB0aGlzLnRlc3RlckFwaUNvbnRlbnQ7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybCA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybCA9IFwiaHR0cDovLzEyNy4wLjAuMTo4MTgyXCI7XG5cblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJBUElTdHIgPSB0ZXN0ZXJBUElTdHIucmVwbGFjZSAoL1xcJWJhc2VcXF90ZXN0ZXJcXF91cmxcXCUvZywgYFxcXCIke3RoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJBUElVcmx9XFxcImApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGxvYWRGaWxlczogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRpZiAoT2JqZWN0LmtleXMgKHRoaXMuZmlsZXMpLmxlbmd0aCA+IDApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsb2FkRmlsZXMgKz0gYHZhciBmaWxlcyA9IHt9O1xcblxcbmA7XG5cblx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5maWxlcylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgZmlsZSA9IHRoaXMuZmlsZXNba2V5XTtcblx0XHRcdFx0XHRcdGxldCBhc3NldDogSG90QXNzZXQgPSBuZXcgSG90QXNzZXQgKFwiaHRtbFwiLCBrZXkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoZmlsZS5sb2NhbEZpbGUgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdGFzc2V0LnBhdGggPSBmaWxlLmxvY2FsRmlsZTtcblxuXHRcdFx0XHRcdFx0aWYgKGZpbGUudXJsICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHRhc3NldC5wYXRoID0gZmlsZS51cmw7XG5cblx0XHRcdFx0XHRcdGlmIChmaWxlLmNvbnRlbnQgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGFzc2V0LnBhdGggPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRhc3NldC5jb250ZW50ID0gZmlsZS5jb250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgb3V0cHV0ID0gYXdhaXQgYXNzZXQub3V0cHV0ICgpO1xuXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIChvdXRwdXQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBEdXJpbmcgaW5pdGlhbCBsb2FkLCBIVE1MIGFzc2V0cyBjYW5ub3QgYmUgb3V0cHV0dGVkIHVzaW5nIG9ubHkgYSBzdHJpbmchYCk7XG5cblx0XHRcdFx0XHRcdGxldCBmaWxlVXJsOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRcdFx0bGV0IGZpbGVDb250ZW50OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0XHRpZiAob3V0cHV0LnVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRmaWxlVXJsID0gYFwidXJsXCI6IFwiJHtvdXRwdXQudXJsfVwiLCBgO1xuXG5cdFx0XHRcdFx0XHRpZiAob3V0cHV0LmNvbnRlbnQgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0ZmlsZUNvbnRlbnQgPSBgXCJjb250ZW50XCI6ICR7b3V0cHV0LmNvbnRlbnR9YDsgLy8gTWF5IGhhdmUgdG8gZXNjYXBlIHRoZSBjb250ZW50P1xuXG5cdFx0XHRcdFx0XHRsb2FkRmlsZXMgKz0gYFxcdFxcdFxcdGZpbGVzW1wiJHtvdXRwdXQubmFtZX1cIl0gPSB7ICR7ZmlsZVVybH0ke2ZpbGVDb250ZW50fSB9O1xcbmA7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bG9hZEZpbGVzICs9IGBcXHRcXHRcXHRwcm9taXNlcy5wdXNoIChwcm9jZXNzb3IubG9hZEhvdEZpbGVzIChmaWxlcykpO1xcbmA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0aXRsZVxcJS9nLCBuYW1lKTtcblxuXHRcdFx0XHRpZiAocGFzc0FyZ3MgPT09IHRydWUpXG5cdFx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXJnc1xcJS9nLCBcIkhvdC5Bcmd1bWVudHNcIik7XG5cblx0XHRcdFx0aWYgKGFyZ3MgIT0gbnVsbClcblx0XHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVhcmdzXFwlL2csIEpTT04uc3RyaW5naWZ5IChhcmdzKSk7XG5cblx0XHRcdFx0bGV0IHRlc3Rlck1hcDogc3RyaW5nID0gcm91dGVLZXk7XG5cdFx0XHRcdGxldCB0ZXN0ZXJVcmw6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRcdGxldCB0ZXN0ZXJMYXVuY2hwYWRVcmw6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRcdGxldCB0ZXN0ZXJOYW1lOiBzdHJpbmcgPSBcIkhvdFRlc3Rlck1vY2hhU2VsZW5pdW1cIjtcblxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy50ZXN0ZXJzKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGVzdGVyTmFtZSA9IGtleTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJOYW1lICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZSA9IHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyVXJsID0gdGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybDtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLmxhdW5jaHBhZFVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHRlc3RlckxhdW5jaHBhZFVybCA9IHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi5sYXVuY2hwYWRVcmw7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5yb3V0ZXMgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnJvdXRlc1tyb3V0ZUtleV0gIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IHJvdXRlID0gdGhpcy5ob3RTaXRlLnJvdXRlc1tyb3V0ZUtleV07XG5cdFx0XHRcdFx0XHRcdHRlc3Rlck1hcCA9IHJvdXRlLm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHN0YXJ0RGVsYXlTdHI6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0aWYgKHRoaXMuc3RhcnREZWxheSAhPT0gMClcblx0XHRcdFx0XHRzdGFydERlbGF5U3RyID0gYGF3YWl0IEhvdFN0YXEud2FpdCAoJHt0aGlzLnN0YXJ0RGVsYXl9KTtgO1xuXG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXN0YXJ0XFxfZGVsYXlcXCUvZywgc3RhcnREZWxheVN0cik7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWxvZ2dpbmdcXF9sZXZlbFxcJS9nLCBgSG90TG9nTGV2ZWwuJHtIb3RMb2dMZXZlbFt0aGlzLmxvZ2dlci5sb2dMZXZlbF19YCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWhvdHN0YXFcXF9qc1xcX3NyY1xcJS9nLCBqc1NyY1BhdGgpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVkZXZlbG9wZXJcXF9tb2RlXFwlL2csIGRldmVsb3Blck1vZGVTdHIpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9hcGlcXCUvZywgdGVzdGVyQVBJU3RyKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXBpc1xcX3RvXFxfbG9hZFxcJS9nLCBhcGlTY3JpcHRzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlbG9hZFxcX2ZpbGVzXFwlL2csIGxvYWRGaWxlcyk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX2NvZGVcXCUvZywgYXBpQ29kZSk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXB1YmxpY1xcX3NlY3JldHNcXCUvZywgcHVibGljS2V5cyk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXVybFxcJS9nLCB1cmwpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9uYW1lXFwlL2csIGBcIiR7dGVzdGVyTmFtZX1cImApO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9tYXBcXCUvZywgYFwiJHt0ZXN0ZXJNYXB9XCJgKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwldGVzdGVyXFxfYXBpXFxfYmFzZVxcX3VybFxcJS9nLCBgXCIke3Rlc3RlclVybH1cImApO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9sYXVuY2hwYWRcXF91cmxcXCUvZywgYFwiJHt0ZXN0ZXJMYXVuY2hwYWRVcmx9XCJgKTtcblxuXHRcdFx0XHRyZXR1cm4gKHRlbXBDb250ZW50KTtcblx0XHRcdH07XG5cdFx0Y29udGVudCA9IGF3YWl0IGZpeENvbnRlbnQgKGNvbnRlbnQpO1xuXG5cdFx0cmV0dXJuIChjb250ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIEV4cHJlc3Mgcm91dGVzIGZyb20gdGhlIGdpdmVuIHBhZ2VzLiBCZSBzdXJlIHRvIGxvYWQgdGhlIFxuXHQgKiBwYWdlcyBmaXJzdCBiZWZvcmUgZG9pbmcgdGhpcy4gVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgdXNlZCBmb3IgXG5cdCAqIGN1c3RvbWl6ZWQgRXhwcmVzcyBhcHBsaWNhdGlvbnMuIElmIHlvdSB3aXNoIHRvIHVzZSB0aGUgbG9hZGVkIHJvdXRlcyBcblx0ICogZnJvbSB0aGlzIEhvdFN0YXEgb2JqZWN0IHdpdGggSG90SFRUUFNlcnZlciwgYmUgc3VyZSB0byB1c2UgXG5cdCAqIHRoZSBsb2FkSG90U2l0ZSBtZXRob2QgaW4gSG90SFRUUFNlcnZlci5cblx0ICovXG5cdGFzeW5jIGNyZWF0ZUV4cHJlc3NSb3V0ZXMgKGV4cHJlc3NBcHA6IGFueSwganNTcmNQYXRoOiBzdHJpbmcgPSBcIi4vanMvSG90U3RhcS5taW4uanNcIik6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGZvciAobGV0IGtleSBpbiB0aGlzLnBhZ2VzKVxuXHRcdHtcblx0XHRcdGxldCBwYWdlOiBIb3RQYWdlID0gdGhpcy5wYWdlc1trZXldO1xuXHRcdFx0Y29uc3QgY29udGVudDogc3RyaW5nID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUNvbnRlbnQgKHBhZ2Uucm91dGUsIHBhZ2UubmFtZSwgcGFnZS5maWxlc1swXS51cmwsIGpzU3JjUGF0aCk7XG5cblx0XHRcdGV4cHJlc3NBcHAuZ2V0IChwYWdlLnJvdXRlLCAocmVxOiBhbnksIHJlczogYW55KSA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIudmVyYm9zZSAoYFNlbmRpbmcgY3VzdG9tIEV4cHJlc3MgY29udGVudC5gKTtcblx0XHRcdFx0XHRyZXMuc3RhdHVzICgyMDApLnNlbmQgKGNvbnRlbnQpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgdGVzdGVyIGZvciB1c2UgbGF0ZXIuXG5cdCAqL1xuXHRhZGRUZXN0ZXIgKHRlc3RlcjogSG90VGVzdGVyKTogdm9pZFxuXHR7XG5cdFx0dGhpcy50ZXN0ZXJzW3Rlc3Rlci5uYW1lXSA9IHRlc3Rlcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGxpc3Qgb2YgbWFwcyBmb3IgdGVzdGluZyBmcm9tIHRoZSBIb3RTaXRlLlxuXHQgKi9cblx0Z2V0V2ViVGVzdGluZ01hcHMgKCk6IHN0cmluZ1tdXG5cdHtcblx0XHRpZiAodGhpcy5ob3RTaXRlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiTm8gSG90U2l0ZSB3YXMgbG9hZGVkIVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIGRvZXMgbm90IGhhdmUgYSB0ZXN0aW5nIG9iamVjdCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgZG9lcyBub3QgaGF2ZSBhIHRlc3Rpbmcgd2ViIG9iamVjdCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLm1hcHMgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSB0ZXN0aW5nIG9iamVjdCBkb2VzIG5vdCBoYXZlIGFueSBtYXBzIVwiKTtcblxuXHRcdHJldHVybiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLm1hcHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgbGlzdCBvZiBtYXBzIGZvciB0ZXN0aW5nIGZyb20gdGhlIEhvdFNpdGUuXG5cdCAqL1xuXHRnZXRBUElUZXN0aW5nTWFwcyAoKTogc3RyaW5nW11cblx0e1xuXHRcdGlmICh0aGlzLmhvdFNpdGUgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJObyBIb3RTaXRlIHdhcyBsb2FkZWQhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgZG9lcyBub3QgaGF2ZSBhIHRlc3Rpbmcgb2JqZWN0IVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy5hcGkgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSBkb2VzIG5vdCBoYXZlIGEgdGVzdGluZyBhcGkgb2JqZWN0IVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy5hcGkubWFwcyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIHRlc3Rpbmcgb2JqZWN0IGRvZXMgbm90IGhhdmUgYW55IG1hcHMhXCIpO1xuXG5cdFx0cmV0dXJuICh0aGlzLmhvdFNpdGUudGVzdGluZy5hcGkubWFwcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgcm91dGUncyBrZXkgZnJvbSBhIHJvdXRlJ3MgbmFtZS5cblx0ICovXG5cdGdldFJvdXRlS2V5RnJvbU5hbWUgKG5hbWU6IHN0cmluZyk6IHN0cmluZ1xuXHR7XG5cdFx0bGV0IGZvdW5kS2V5OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLmhvdFNpdGUucm91dGVzICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUucm91dGVzKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHJvdXRlOiBIb3RTaXRlUm91dGUgPSB0aGlzLmhvdFNpdGUucm91dGVzW2tleV07XG5cblx0XHRcdFx0XHRpZiAocm91dGUubmFtZSA9PT0gbmFtZSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRmb3VuZEtleSA9IGtleTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmhvdFNpdGUud2ViICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUud2ViKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHdlYiA9IHRoaXMuaG90U2l0ZS53ZWJba2V5XTtcblxuXHRcdFx0XHRcdGlmICh3ZWIgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRmb3VuZEtleSA9IGtleTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChmb3VuZEtleSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgcm91dGUgZnJvbSBhIHJvdXRlJ3MgbmFtZS5cblx0ICovXG5cdGdldFJvdXRlRnJvbU5hbWUgKG5hbWU6IHN0cmluZyk6IEhvdFNpdGVSb3V0ZVxuXHR7XG5cdFx0bGV0IGZvdW5kUm91dGU6IEhvdFNpdGVSb3V0ZSA9IG51bGw7XG5cdFx0bGV0IGZvdW5kS2V5OiBzdHJpbmcgPSB0aGlzLmdldFJvdXRlS2V5RnJvbU5hbWUgKG5hbWUpO1xuXG5cdFx0aWYgKGZvdW5kS2V5ICE9PSBcIlwiKVxuXHRcdFx0Zm91bmRSb3V0ZSA9IHRoaXMuaG90U2l0ZS5yb3V0ZXNbZm91bmRLZXldO1xuXG5cdFx0cmV0dXJuIChmb3VuZFJvdXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIHRlc3RzLlxuXHQgKiBcblx0ICogQHBhcmFtIHRlc3Rlck5hbWUgVGhlIHRlc3RlciB0byB1c2UgdG8gZXhlY3V0ZSB0ZXN0cy5cblx0ICogQHBhcmFtIG1hcE5hbWUgVGhlIG1hcCBvciBtYXBzIHRvIHVzZSB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRlc3RzLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RzICh0ZXN0ZXJOYW1lOiBzdHJpbmcsIG1hcE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCB0ZXN0ZXI6IEhvdFRlc3RlciA9IHRoaXMudGVzdGVyc1t0ZXN0ZXJOYW1lXTtcblxuXHRcdGlmICh0ZXN0ZXIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBleGVjdXRlIHRlc3RzLiBUZXN0ZXIgJHt0ZXN0ZXJOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdHJldHVybiAodGVzdGVyLmV4ZWN1dGUgKG1hcE5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFsbCB3ZWIgdGVzdHMgZnJvbSB0aGUgSG90U2l0ZSB0ZXN0aW5nIHdlYiBvYmplY3QuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGVzdGVyTmFtZSBUaGUgdGVzdGVyIHRvIHVzZSB0byBleGVjdXRlIHRlc3RzLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZUFsbFdlYlRlc3RzICh0ZXN0ZXJOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgbWFwczogc3RyaW5nW10gPSB0aGlzLmdldFdlYlRlc3RpbmdNYXBzICgpO1xuXHRcdGxldCB0ZXN0ZXI6IEhvdFRlc3RlciA9IHRoaXMudGVzdGVyc1t0ZXN0ZXJOYW1lXTtcblxuXHRcdGlmICh0ZXN0ZXIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBleGVjdXRlIHRlc3RzLiBUZXN0ZXIgJHt0ZXN0ZXJOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgbWFwcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgbWFwTmFtZTogc3RyaW5nID0gbWFwc1tpSWR4XTtcblxuXHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdHMgKHRlc3Rlck5hbWUsIG1hcE5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFsbCBhcGkgdGVzdHMgZnJvbSB0aGUgSG90U2l0ZSB0ZXN0aW5nIGFwaSBvYmplY3QuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGVzdGVyTmFtZSBUaGUgdGVzdGVyIHRvIHVzZSB0byBleGVjdXRlIHRlc3RzLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZUFsbEFQSVRlc3RzICh0ZXN0ZXJOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgbWFwczogc3RyaW5nW10gPSB0aGlzLmdldEFQSVRlc3RpbmdNYXBzICgpO1xuXHRcdGxldCB0ZXN0ZXI6IEhvdFRlc3RlciA9IHRoaXMudGVzdGVyc1t0ZXN0ZXJOYW1lXTtcblxuXHRcdGlmICh0ZXN0ZXIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBleGVjdXRlIHRlc3RzLiBUZXN0ZXIgJHt0ZXN0ZXJOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdHRoaXMubG9nZ2VyLnZlcmJvc2UgKCgpID0+IGBFeGVjdXRpbmcgYWxsIEFQSSB0ZXN0cyBmb3IgdGVzdGVyICR7dGVzdGVyTmFtZX0uIE1hcHM6ICR7SlNPTi5zdHJpbmdpZnkgKG1hcHMpfWApO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXBzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSBtYXBzW2lJZHhdO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZSwgbWFwTmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYSBwYWdlIGFuZCBnZXQgdGhlIHJlc3VsdC5cblx0ICovXG5cdGFzeW5jIHByb2Nlc3MgKHBhZ2VOYW1lOiBzdHJpbmcsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gdGhpcy5nZXRQYWdlIChwYWdlTmFtZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgcGFnZS5wcm9jZXNzIChhcmdzKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGEgbG9jYWwgZmlsZSBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc0xvY2FsRmlsZSAobG9jYWxGaWxlcGF0aDogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSBsb2NhbEZpbGVwYXRoLCBhcmdzOiBhbnkgPSBudWxsKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgcHJvY2Vzc29yOiBIb3RTdGFxID0gbmV3IEhvdFN0YXEgKCk7XG5cdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XCJsb2NhbEZpbGVcIjogbG9jYWxGaWxlcGF0aFxuXHRcdH0pO1xuXHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHRsZXQgcGFnZTogSG90UGFnZSA9IG5ldyBIb3RQYWdlICh7XG5cdFx0XHRcdFwicHJvY2Vzc29yXCI6IHByb2Nlc3Nvcixcblx0XHRcdFx0XCJuYW1lXCI6IG5hbWUsXG5cdFx0XHRcdFwiZmlsZXNcIjogW2ZpbGVdXG5cdFx0XHR9KTtcblx0XHRwcm9jZXNzb3IuYWRkUGFnZSAocGFnZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgcHJvY2Vzc29yLnByb2Nlc3MgKG5hbWUsIGFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYSB1cmwgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHByb2Nlc3NVcmwgKG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IGZpbGU6IEhvdEZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XCJ1cmxcIjogb3B0aW9ucy51cmxcblx0XHR9KTtcblxuXHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHRsZXQgcGFnZTogSG90UGFnZSA9IG5ldyBIb3RQYWdlICh7XG5cdFx0XHRcdFwicHJvY2Vzc29yXCI6IG9wdGlvbnMucHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogb3B0aW9ucy5uYW1lLFxuXHRcdFx0XHRcImZpbGVzXCI6IFtmaWxlXSxcblx0XHRcdFx0XCJ0ZXN0ZXJOYW1lXCI6IG9wdGlvbnMudGVzdGVyTmFtZSxcblx0XHRcdFx0XCJ0ZXN0ZXJNYXBcIjogb3B0aW9ucy50ZXN0ZXJNYXBcblx0XHRcdH0pO1xuXHRcdG9wdGlvbnMucHJvY2Vzc29yLmFkZFBhZ2UgKHBhZ2UpO1xuXHRcdGxldCByZXN1bHQ6IHN0cmluZyA9IGF3YWl0IG9wdGlvbnMucHJvY2Vzc29yLnByb2Nlc3MgKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5hcmdzKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGNvbnRlbnQgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHByb2Nlc3NDb250ZW50IChvcHRpb25zOiBIb3RTdGFydE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBmaWxlOiBIb3RGaWxlID0gbmV3IEhvdEZpbGUgKHtcblx0XHRcdFwiY29udGVudFwiOiBvcHRpb25zLmNvbnRlbnRcblx0XHR9KTtcblx0XHRhd2FpdCBmaWxlLmxvYWQgKCk7XG5cdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSBuZXcgSG90UGFnZSAoe1xuXHRcdFx0XHRcInByb2Nlc3NvclwiOiBvcHRpb25zLnByb2Nlc3Nvcixcblx0XHRcdFx0XCJuYW1lXCI6IG9wdGlvbnMubmFtZSxcblx0XHRcdFx0XCJmaWxlc1wiOiBbZmlsZV1cblx0XHRcdH0pO1xuXHRcdG9wdGlvbnMucHJvY2Vzc29yLmFkZFBhZ2UgKHBhZ2UpO1xuXHRcdGxldCByZXN1bHQ6IHN0cmluZyA9IGF3YWl0IG9wdGlvbnMucHJvY2Vzc29yLnByb2Nlc3MgKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5hcmdzKTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaGVuIHRoZSB3aW5kb3cgaGFzIGZpbmlzaGVkIGxvYWRpbmcsIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uLlxuXHQgKiBUaGlzIGlzIG1lYW50IGZvciB3ZWIgYnJvd3NlciB1c2Ugb25seS5cblx0ICovXG5cdHN0YXRpYyBvblJlYWR5IChyZWFkeUZ1bmM6IChvdXRwdXQ6IHN0cmluZykgPT4gdm9pZCk6IHZvaWRcblx0e1xuXHRcdEhvdFN0YXEub25SZWFkeUV2ZW50ID0gcmVhZHlGdW5jO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2UgdGhlIGN1cnJlbnQgSFRNTCBwYWdlIHdpdGggdGhlIG91dHB1dC5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgdXNlT3V0cHV0IChvdXRwdXQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmIChIb3RTdGFxLm9uT3V0cHV0UmVjZWl2ZWQgIT0gbnVsbClcblx0XHRcdEhvdFN0YXEub25PdXRwdXRSZWNlaXZlZCAob3V0cHV0KTtcblxuXHRcdGxldCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyICgpO1xuXHRcdGxldCBjaGlsZCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcgKG91dHB1dCwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0bGV0IGh0bWxPYmo6IEhUTUxIdG1sRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF07XG5cblx0XHRodG1sT2JqLmlubmVySFRNTCA9IGNoaWxkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF0uaW5uZXJIVE1MO1xuXG5cdFx0Ly8gVGhhbmtzIHRvIG5ld2Z1cm5pdHVyZXkgYXQ6IFxuXHRcdC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIyOTQ1ODg0L2RvbXBhcnNlci1hcHBlbmRpbmctc2NyaXB0LXRhZ3MtdG8taGVhZC1ib2R5LWJ1dC1ub3QtZXhlY3V0aW5nXG5cdFx0bGV0IHRtcFNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7XG5cdFx0aWYgKHRtcFNjcmlwdHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly8gcHVzaCBhbGwgb2YgdGhlIGRvY3VtZW50J3Mgc2NyaXB0IHRhZ3MgaW50byBhbiBhcnJheVxuXHRcdFx0Ly8gKHRvIHByZXZlbnQgZG9tIG1hbmlwdWxhdGlvbiB3aGlsZSBpdGVyYXRpbmcgb3ZlciBkb20gbm9kZXMpXG5cdFx0XHRsZXQgc2NyaXB0czogSFRNTFNjcmlwdEVsZW1lbnRbXSA9IFtdO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0bXBTY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHNjcmlwdHMucHVzaCh0bXBTY3JpcHRzW2ldKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCBzY3JpcHQgdGFncyBhbmQgY3JlYXRlIGR1cGxpY2F0ZSB0YWdzIGZvciBlYWNoXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0bGV0IHM6IEhUTUxTY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG5cblx0XHRcdFx0Ly8gYWRkIHRoZSBuZXcgbm9kZSB0byB0aGUgcGFnZVxuXHRcdFx0XHRzY3JpcHRzW2ldLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQocyk7XG5cblx0XHRcdFx0Ly8gcmVtb3ZlIHRoZSBvcmlnaW5hbCAobm9uLWV4ZWN1dGluZykgbm9kZSBmcm9tIHRoZSBwYWdlXG5cdFx0XHRcdHNjcmlwdHNbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRzW2ldKTtcblxuXHRcdFx0XHRhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPiAoKHJlc29sdmUyLCByZWplY3QyKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHMub25sb2FkID0gKCkgPT5cblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUyICgpO1xuXHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRsZXQgaGFzU3JjOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRcdFx0XHRcdGlmIChzY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSAoXCJzcmNcIikgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInNyY1wiKSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHMuc2V0QXR0cmlidXRlIChcInNyY1wiLCBzY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSAoXCJzcmNcIikpO1xuXHRcdFx0XHRcdFx0XHRcdGhhc1NyYyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInR5cGVcIikgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHNjcmlwdHNbaV0uZ2V0QXR0cmlidXRlIChcInR5cGVcIikgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0cy5zZXRBdHRyaWJ1dGUgKFwidHlwZVwiLCBzY3JpcHRzW2ldLmdldEF0dHJpYnV0ZSAoXCJ0eXBlXCIpKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cy5pbm5lckhUTUwgPSBzY3JpcHRzW2ldLmlubmVySFRNTDtcblxuXHRcdFx0XHRcdFx0aWYgKGhhc1NyYyA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUyICgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChIb3RTdGFxLmRpc3BhdGNoUmVhZHlFdmVudHMgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCAobmV3IEV2ZW50IChcIkRPTUNvbnRlbnRMb2FkZWRcIikpO1xuXHRcdFx0d2luZG93LmRpc3BhdGNoRXZlbnQgKG5ldyBFdmVudChcImxvYWRcIikpO1xuXHRcdH1cblxuXHRcdGlmIChIb3RTdGFxLm9uUmVhZHlFdmVudCAhPSBudWxsKVxuXHRcdFx0SG90U3RhcS5vblJlYWR5RXZlbnQgKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgdGVzdGVycyB0byBsb2FkLlxuXHQgKiBcblx0ICogQGZpeG1lIFRoaXMgZG9lcyBub3Qgd2FpdCBmb3IgQUxMIHRlc3RlcnMgdG8gZmluaXNoIGxvYWRpbmcuIE9ubHkgXG5cdCAqIHRoZSBmaXJzdCBvbmUuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgd2FpdEZvclRlc3RlcnMgKCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHdoaWxlIChIb3RTdGFxLmlzUmVhZHlGb3JUZXN0aW5nID09PSBmYWxzZSlcblx0XHRcdGF3YWl0IEhvdFN0YXEud2FpdCAoMTApO1xuXG5cdFx0aWYgKEhvdFN0YXEub25SZWFkeUZvclRlc3RpbmcgIT0gbnVsbClcblx0XHRcdGF3YWl0IEhvdFN0YXEub25SZWFkeUZvclRlc3RpbmcgKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0dXAgdGhlIHRlc3RlcnMgYXBpLCBpZiBhbnkuXG5cdCAqL1xuXHRzdGF0aWMgc2V0dXBUZXN0ZXJzIChwcm9jZXNzb3I6IEhvdFN0YXEsIG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucylcblx0e1xuXHRcdGlmIChwcm9jZXNzb3IubW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHR7XG5cdFx0XHRpZiAocHJvY2Vzc29yLnRlc3RlckFQSSA9PSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAob3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID09IG51bGwpXG5cdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gXCJcIjtcblxuXHRcdFx0XHRpZiAob3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID09PSBcIlwiKVxuXHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IFwiaHR0cDovLzEyNy4wLjAuMTo4MTgyXCI7XG5cblx0XHRcdFx0bGV0IGNsaWVudDogSG90Q2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdFx0bGV0IHRlc3RlckFQSTogSG90VGVzdGVyQVBJID0gbmV3IEhvdFRlc3RlckFQSSAob3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsLCBjbGllbnQpO1xuXHRcdFx0XHR0ZXN0ZXJBUEkuY29ubmVjdGlvbi5hcGkgPSB0ZXN0ZXJBUEk7XG5cdFx0XHRcdHByb2Nlc3Nvci50ZXN0ZXJBUEkgPSB0ZXN0ZXJBUEk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHVwIHRoZSB0ZXN0ZXJzIGFwaSBvbiB0aGUgY2xpZW50LCBpZiBuZWVkZWQuXG5cdCAqL1xuXHRzdGF0aWMgc2V0dXBDbGllbnRUZXN0ZXJzIChwcm9jZXNzb3I6IEhvdFN0YXEpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAocHJvY2Vzc29yLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0e1xuXHRcdFx0b3V0cHV0ICs9IFxuYDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+XG5mdW5jdGlvbiBob3RzdGFxX2lzRG9jdW1lbnRSZWFkeSAoKVxue1xuaWYgKHdpbmRvd1tcIkhvdFwiXSAhPSBudWxsKVxue1xuaWYgKEhvdC5Nb2RlID09PSBIb3RTdGFxV2ViLkRldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG57XG5sZXQgZnVuYyA9IGZ1bmN0aW9uICgpXG5cdHtcblx0XHRpZiAoSG90LlRlc3RlckFQSSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIChcImJlZm9yZXVubG9hZFwiLFxuXHRcdFx0XHQoZXZlbnQpID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRIb3RTdGFxV2ViLkhvdFN0YXEuaXNSZWFkeUZvclRlc3RpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRcdEhvdC5UZXN0ZXJBUEkudGVzdGVyLnBhZ2VVbmxvYWRlZCAoe1xuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJOYW1lOiBIb3QuQ3VycmVudFBhZ2UudGVzdGVyTmFtZVxuXHRcdFx0XHRcdFx0fSkudGhlbiAoZnVuY3Rpb24gKHJlc3ApXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAocmVzcC5lcnJvciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChyZXNwLmVycm9yICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKHJlc3AuZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgdGVzdFBhdGhzID0ge307XG5cdFx0XHRsZXQgdGVzdEVsZW1lbnRzID0gSlNPTi5zdHJpbmdpZnkgKEhvdC5DdXJyZW50UGFnZS50ZXN0RWxlbWVudHMpO1xuXHRcdFx0bGV0IHRlc3RNYXBzID0gSlNPTi5zdHJpbmdpZnkgKEhvdC5DdXJyZW50UGFnZS50ZXN0TWFwcyk7XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBIb3QuQ3VycmVudFBhZ2UudGVzdFBhdGhzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdGVzdFBhdGggPSBIb3QuQ3VycmVudFBhZ2UudGVzdFBhdGhzW2tleV07XG5cblx0XHRcdFx0dGVzdFBhdGhzW2tleV0gPSB0ZXN0UGF0aC50b1N0cmluZyAoKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IHRlc3RQYXRoc1N0ciA9IEpTT04uc3RyaW5naWZ5ICh0ZXN0UGF0aHMpO1xuXG5cdFx0XHRIb3QuVGVzdGVyQVBJLnRlc3Rlci5wYWdlTG9hZGVkICh7XG5cdFx0XHRcdFx0dGVzdGVyTmFtZTogSG90LkN1cnJlbnRQYWdlLnRlc3Rlck5hbWUsXG5cdFx0XHRcdFx0dGVzdEVsZW1lbnRzOiB0ZXN0RWxlbWVudHMsXG5cdFx0XHRcdFx0dGVzdFBhdGhzOiB0ZXN0UGF0aHNTdHJcblx0XHRcdFx0fSkudGhlbiAoZnVuY3Rpb24gKHJlc3ApXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHJlc3AuZXJyb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHJlc3AuZXJyb3IgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChyZXNwLmVycm9yKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0SG90U3RhcVdlYi5Ib3RTdGFxLmlzUmVhZHlGb3JUZXN0aW5nID0gdHJ1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cbmlmICgoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiKSB8fCAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJpbnRlcmFjdGl2ZVwiKSlcblx0ZnVuYyAoKTtcbmVsc2Vcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciAoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmMpO1xufVxufVxufVxuXG5ob3RzdGFxX2lzRG9jdW1lbnRSZWFkeSAoKTtcbjwvc2NyaXB0PmA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gdGhlIHdpbmRvdyBoYXMgZmluaXNoZWQgbG9hZGluZywgZXhlY3V0ZSB0aGUgZnVuY3Rpb24uIFRoaXMgXG5cdCAqIGlzIG1lYW50IHRvIHN0YXJ0IGV4ZWN1dGluZyBIb3RTdGFxLlxuXHQgKi9cblx0c3RhdGljIG9uSW5pdGFsTG9hZCAocmVhZHlGdW5jOiAoKSA9PiB2b2lkKTogdm9pZFxuXHR7XG5cdFx0aWYgKChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIpIHx8IChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImludGVyYWN0aXZlXCIpKVxuXHRcdFx0cmVhZHlGdW5jICgpO1xuXHRcdGVsc2Vcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIChcImxvYWRcIiwgcmVhZHlGdW5jLCB7IFwib25jZVwiOiB0cnVlIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW5kIHJlcGxhY2UgdGhlIGN1cnJlbnQgSFRNTCBwYWdlIHdpdGggdGhlIGhvdHQgc2NyaXB0IGZyb20gdGhlIGdpdmVuIHVybC5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZGlzcGxheVVybCAodXJsOiBzdHJpbmcgfCBIb3RTdGFydE9wdGlvbnMsIG5hbWU6IHN0cmluZyA9IG51bGwsIFxuXHRcdHByb2Nlc3NvcjogSG90U3RhcSA9IG51bGwsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPEhvdFN0YXE+XG5cdHtcblx0XHRyZXR1cm4gKG5ldyBQcm9taXNlPEhvdFN0YXE+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRIb3RTdGFxLm9uSW5pdGFsTG9hZCAoYXN5bmMgKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb3B0aW9uczogSG90U3RhcnRPcHRpb25zID0ge1xuXHRcdFx0XHRcdFx0XHRcdFwidXJsXCI6IFwiXCJcblx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0aWYgKG5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmw7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmwubmFtZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gbmFtZTtcblxuXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMubmFtZSA9PT0gXCJcIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmw7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSB1cmwubmFtZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAodXJsKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy51cmwgPSB1cmw7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMudXJsID0gdXJsLnVybDtcblxuXHRcdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodXJsLnByb2Nlc3NvciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yID0gdXJsLnByb2Nlc3Nvcjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChhcmdzID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodXJsLmFyZ3MgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSB1cmwuYXJncztcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICh1cmwudGVzdGVyTWFwICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJNYXAgPSB1cmwudGVzdGVyTWFwO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh1cmwudGVzdGVyTmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyTmFtZSA9IHVybC50ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh1cmwudGVzdGVyQVBJQmFzZVVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IHVybC50ZXN0ZXJBUElCYXNlVXJsO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvciA9IG5ldyBIb3RTdGFxICgpO1xuXG5cdFx0XHRcdFx0XHRIb3RTdGFxLnNldHVwVGVzdGVycyAocHJvY2Vzc29yLCBvcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0b3B0aW9ucy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0XHRcdFx0XHRvcHRpb25zLmFyZ3MgPSBhcmdzO1xuXG5cdFx0XHRcdFx0XHRpZiAob3B0aW9ucy51cmwuaW5kZXhPZiAoXCJoc3Rxc2VydmVcIikgPCAwKVxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLnVybCArPSBcIj9oc3Rxc2VydmU9bmFoZmFtXCI7XG5cblx0XHRcdFx0XHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IGF3YWl0IEhvdFN0YXEucHJvY2Vzc1VybCAob3B0aW9ucyk7XG5cblx0XHRcdFx0XHRcdG91dHB1dCArPSBIb3RTdGFxLnNldHVwQ2xpZW50VGVzdGVycyAocHJvY2Vzc29yKTtcblxuXHRcdFx0XHRcdFx0YXdhaXQgSG90U3RhcS51c2VPdXRwdXQgKG91dHB1dCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlIChwcm9jZXNzb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW5kIHJlcGxhY2UgdGhlIGN1cnJlbnQgSFRNTCBwYWdlIHdpdGggdGhlIGhvdHQgc2NyaXB0LlxuXHQgKiBUaGlzIGlzIG1lYW50IGZvciB3ZWIgYnJvd3NlciB1c2Ugb25seS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBkaXNwbGF5Q29udGVudCAoY29udGVudDogc3RyaW5nIHwgSG90U3RhcnRPcHRpb25zLCBuYW1lOiBzdHJpbmcgPSBudWxsLCBcblx0XHRcdHByb2Nlc3NvcjogSG90U3RhcSA9IG51bGwsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPEhvdFN0YXE+XG5cdHtcblx0XHRyZXR1cm4gKG5ldyBQcm9taXNlPEhvdFN0YXE+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRIb3RTdGFxLm9uSW5pdGFsTG9hZCAoYXN5bmMgKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb3B0aW9uczogSG90U3RhcnRPcHRpb25zID0ge1xuXHRcdFx0XHRcdFx0XHRcdFwiY29udGVudFwiOiBcIlwiXG5cdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdGlmIChuYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGNvbnRlbnQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm5hbWUgPSBjb250ZW50Lm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IG5hbWU7XG5cblx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm5hbWUgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGNvbnRlbnQpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IFwiXCI7IC8vLyBAZml4bWUgSXMgdGhpcyBvayB0byBkbz9cblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IGNvbnRlbnQubmFtZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAoY29udGVudCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQ7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQuY29udGVudDtcblxuXHRcdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29udGVudC5wcm9jZXNzb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvciA9IGNvbnRlbnQucHJvY2Vzc29yO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGFyZ3MgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjb250ZW50LmFyZ3MgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBjb250ZW50LmFyZ3M7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoY29udGVudC50ZXN0ZXJNYXAgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck1hcCA9IGNvbnRlbnQudGVzdGVyTWFwO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChjb250ZW50LnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck5hbWUgPSBjb250ZW50LnRlc3Rlck5hbWU7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGNvbnRlbnQudGVzdGVyQVBJQmFzZVVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9IGNvbnRlbnQudGVzdGVyQVBJQmFzZVVybDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSBuZXcgSG90U3RhcSAoKTtcblxuXHRcdFx0XHRcdFx0SG90U3RhcS5zZXR1cFRlc3RlcnMgKHByb2Nlc3Nvciwgb3B0aW9ucyk7XG5cblx0XHRcdFx0XHRcdG9wdGlvbnMucHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuXHRcdFx0XHRcdFx0b3B0aW9ucy5hcmdzID0gYXJncztcblxuXHRcdFx0XHRcdFx0bGV0IG91dHB1dDogc3RyaW5nID0gYXdhaXQgSG90U3RhcS5wcm9jZXNzQ29udGVudCAob3B0aW9ucyk7XG5cblx0XHRcdFx0XHRcdGF3YWl0IEhvdFN0YXEudXNlT3V0cHV0IChvdXRwdXQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSAocHJvY2Vzc29yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pKTtcblx0fVxufVxuXG5pZiAodHlwZW9mIChkb2N1bWVudCkgIT09IFwidW5kZWZpbmVkXCIpXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIChcImxvYWRcIiwgaG90U3RhcVdlYlN0YXJ0KTtcbiIsImltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5pbXBvcnQgeyBIb3RDb21wb25lbnQsIEhvdENvbXBvbmVudE91dHB1dCB9IGZyb20gXCIuL0hvdENvbXBvbmVudFwiO1xuaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgY29tcG9uZW50IGZvciB1c2UgYXMgYSBIVE1MIHRhZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ29tcG9uZW50ICh0YWc6IHN0cmluZywgZWxlbWVudE9wdGlvbnM6IEVsZW1lbnREZWZpbml0aW9uT3B0aW9ucyA9IHVuZGVmaW5lZCk6IHZvaWRcbntcblx0aWYgKCh0YWcgPT0gbnVsbCkgfHwgKHRhZyA9PT0gXCJcIikpXG5cdFx0dGhyb3cgbmV3IEVycm9yIChgQWxsIGNvbXBvbmVudHMgbXVzdCBoYXZlIGEgdGFnIWApO1xuXG5cdGlmIChjdXN0b21FbGVtZW50cy5nZXQgKHRhZykgIT09IHVuZGVmaW5lZClcblx0e1xuXHRcdC8vLyBAZml4bWUgVGhpcyBlbGVtZW50IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gU2hvdWxkIHRoaXMgdGhyb3cgYW4gZXJyb3Igb3Igd2FybmluZz8gSSBkb24ndCB0aGluayBpdCBzaG91bGQuLi5cblxuXHRcdHJldHVybjtcblx0fVxuXG5cdGxldCBwcm9jZXNzb3JDb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzO1xuXG5cdGN1c3RvbUVsZW1lbnRzLmRlZmluZSAodGFnLCBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50XG5cdFx0e1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgY29ubmVjdGVkIEhvdENvbXBvbmVudC5cblx0XHRcdCAqL1xuXHRcdFx0Y29tcG9uZW50OiBIb3RDb21wb25lbnQ7XG5cdFx0XG5cdFx0XHRjb25zdHJ1Y3RvciAoKVxuXHRcdFx0e1xuXHRcdFx0XHRzdXBlciAoKTtcblxuXHRcdFx0XHRsZXQgY29tcG9uZW50SW5mbyA9IHByb2Nlc3NvckNvbXBvbmVudHNbdGFnXTtcblx0XHRcdFx0dGhpcy5jb21wb25lbnQgPSBuZXcgY29tcG9uZW50SW5mby5jb21wb25lbnRUeXBlIChjb21wb25lbnRJbmZvLnByb2Nlc3NvciwgY29tcG9uZW50SW5mby5hcGkpO1xuXG5cdFx0XHRcdGxldCBjb21wSHRtbEVsZW1lbnQgPSB0aGlzO1xuXHRcdFxuXHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdGNvbXBIdG1sRWxlbWVudC5ob3RDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudDtcblx0XHRcblx0XHRcdFx0dGhpcy5jb21wb25lbnQuaHRtbEVsZW1lbnRzID0gW2NvbXBIdG1sRWxlbWVudF07XG5cdFx0XHRcdHRoaXMuY29tcG9uZW50LmlubmVyID0gdGhpcy5pbm5lckhUTUw7XG5cdFx0XG5cdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5oYW5kbGVBdHRyaWJ1dGVzICE9IG51bGwpXG5cdFx0XHRcdFx0dGhpcy5jb21wb25lbnQuaGFuZGxlQXR0cmlidXRlcyAodGhpcy5hdHRyaWJ1dGVzKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29uc3QgYXR0cjogQXR0ciA9IHRoaXMuYXR0cmlidXRlc1tpSWR4XTtcblx0XHRcdFx0XHRcdGNvbnN0IGF0dHJOYW1lOiBzdHJpbmcgPSBhdHRyLm5hbWUudG9Mb3dlckNhc2UgKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBhdHRyVmFsdWU6IHN0cmluZyA9IGF0dHIudmFsdWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAoYXR0ck5hbWUgPT09IFwiaWRcIilcblx0XHRcdFx0XHRcdFx0dGhpcy5jb21wb25lbnQubmFtZSA9IGF0dHJWYWx1ZTtcblx0XHRcblx0XHRcdFx0XHRcdGlmIChhdHRyTmFtZSA9PT0gXCJuYW1lXCIpXG5cdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9uZW50Lm5hbWUgPSBhdHRyVmFsdWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAoYXR0ck5hbWUgPT09IFwidmFsdWVcIilcblx0XHRcdFx0XHRcdFx0dGhpcy5jb21wb25lbnQudmFsdWUgPSBhdHRyVmFsdWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAoYXR0ck5hbWUuaW5kZXhPZiAoXCJob3QtXCIpID4gLTEpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGF0dHJUZW1wTmFtZTogc3RyaW5nID0gYXR0ck5hbWUuc3Vic3RyaW5nICg0KTtcblx0XHRcblx0XHRcdFx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0dGhpcy5jb21wb25lbnRbYXR0clRlbXBOYW1lXSA9IGF0dHJWYWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUHJlT3V0cHV0ICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQub25QcmVPdXRwdXQgKCkgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IG91dHB1dHMgPSB0aGlzLmNvbXBvbmVudC5vdXRwdXQgKCk7XG5cdFx0XG5cdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBvc3RPdXRwdXQgIT0gbnVsbClcblx0XHRcdFx0XHRvdXRwdXRzID0gdGhpcy5jb21wb25lbnQub25Qb3N0T3V0cHV0IChvdXRwdXRzKTtcblx0XHRcblx0XHRcdFx0bGV0IGNvbXBvbmVudE91dHB1dHM6IEhvdENvbXBvbmVudE91dHB1dFtdID0gW107XG5cdFx0XG5cdFx0XHRcdGlmICh0eXBlb2YgKG91dHB1dHMpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0XHRcdGNvbXBvbmVudE91dHB1dHMucHVzaCAoeyBodG1sOiBvdXRwdXRzIH0pO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAob3V0cHV0cyBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdFx0Y29tcG9uZW50T3V0cHV0cyA9IG91dHB1dHM7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0Y29tcG9uZW50T3V0cHV0cyA9IFtvdXRwdXRzXTtcblx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRmb3IgKGxldCBpS2R4ID0gMDsgaUtkeCA8IGNvbXBvbmVudE91dHB1dHMubGVuZ3RoOyBpS2R4KyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgb3V0cHV0ID0gY29tcG9uZW50T3V0cHV0c1tpS2R4XTtcblx0XHRcdFx0XHRsZXQgaHRtbFN0cjogc3RyaW5nID0gb3V0cHV0Lmh0bWw7XG5cdFx0XHRcdFx0bGV0IGFkZEZ1bmN0aW9uc1RvOiBzdHJpbmcgPSBcIlwiO1xuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRsZXQgcGxhY2VIZXJlOiBzdHJpbmcgPSB0aGlzLmNvbXBvbmVudFtcInBsYWNlLWhlcmVcIl07XG5cdFx0XG5cdFx0XHRcdFx0aWYgKG91dHB1dC5hZGRGdW5jdGlvbnNUbyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0YWRkRnVuY3Rpb25zVG8gPSBvdXRwdXQuYWRkRnVuY3Rpb25zVG87XG5cblx0XHRcdFx0XHRpZiAocGxhY2VIZXJlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRvdXRwdXQuZG9jdW1lbnRTZWxlY3RvciA9IGBob3QtcGxhY2UtaGVyZVtuYW1lPVwiJHtwbGFjZUhlcmV9XCJdYDtcblx0XHRcblx0XHRcdFx0XHRsZXQgc3RyOiBzdHJpbmcgPSBIb3RGaWxlLnBhcnNlQ29udGVudCAoaHRtbFN0ciwgdHJ1ZSwgeyBcIm91dHB1dENvbW1hbmRzXCI6IGZhbHNlIH0pO1xuXHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBhcnNlZCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0c3RyID0gdGhpcy5jb21wb25lbnQub25QYXJzZWQgKHN0cik7XG5cdFx0XG5cdFx0XHRcdFx0bGV0IGh0bWxIYW5kbGVyOiB7IGZpeGVkU3RyOiBzdHJpbmcsIHF1ZXJ5U2VsZWN0b3I6IHN0cmluZzsgfSA9IHsgZml4ZWRTdHI6IFwiXCIsIHF1ZXJ5U2VsZWN0b3I6IFwiXCIgfTtcblx0XHRcblx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQub25GaXhIVE1MICE9IG51bGwpXG5cdFx0XHRcdFx0XHRodG1sSGFuZGxlciA9IHRoaXMuY29tcG9uZW50Lm9uRml4SFRNTCAoc3RyKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRodG1sSGFuZGxlciA9IEhvdFN0YXEuZml4SFRNTCAoc3RyKTtcblxuXHRcdFx0XHRcdGxldCBjaGlsZHJlblRvUmVhZGQ6IE5vZGVbXSA9IFtdO1xuXHRcdFxuXHRcdFx0XHRcdC8vIFNhdmUgdGhlIGNoaWxkcmVuIGZyb20gYmVpbmcgcmVwbGFjZWQuXG5cdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9ICh0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDEpOyBpSWR4ID4gLTE7IGlJZHgtLSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgY2hpbGQ6IE5vZGUgPSB0aGlzLmNoaWxkcmVuW2lJZHhdO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y2hpbGRyZW5Ub1JlYWRkLnB1c2ggKHRoaXMucmVtb3ZlQ2hpbGQgKGNoaWxkKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGxldCBuZXdET006IERvY3VtZW50ID0gbnVsbDtcblx0XHRcdFx0XHRsZXQgbmV3T2JqOiBIVE1MRWxlbWVudCA9IG51bGw7XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUGFyc2VET00gIT0gbnVsbClcblx0XHRcdFx0XHRcdG5ld0RPTSA9IHRoaXMuY29tcG9uZW50Lm9uUGFyc2VET00gKGh0bWxIYW5kbGVyLmZpeGVkU3RyKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdC8vbmV3RE9NID0gdGhpcy5sb29zZVBhcnNlRnJvbVN0cmluZyAobmV3IERPTVBhcnNlciAoKSwgc3RyKTtcblx0XHRcdFx0XHRcdG5ld0RPTSA9IG5ldyBET01QYXJzZXIgKCkucGFyc2VGcm9tU3RyaW5nIChodG1sSGFuZGxlci5maXhlZFN0ciwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG5ld0RPTS5ib2R5LmNoaWxkcmVuLmxlbmd0aCA8IDEpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBjb21wb25lbnQgb3V0cHV0IGZyb20gJHt0aGlzLmNvbXBvbmVudC5uYW1lfSB3aXRoIHRhZyAke3RoaXMuY29tcG9uZW50LnRhZ31gKTtcblxuXHRcdFx0XHRcdGlmIChuZXdET00uYm9keS5jaGlsZHJlbi5sZW5ndGggPiAxKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCB0aHJvd0VycjogYm9vbGVhbiA9IHRydWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG5ld0RPTS5ib2R5LmNoaWxkcmVuLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgY2hpbGQgPSBuZXdET00uYm9keS5jaGlsZHJlbltpSWR4XTtcblx0XHRcblx0XHRcdFx0XHRcdFx0aWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSAoKSA9PT0gXCJwYXJzZXJlcnJvclwiKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdG5ld09iaiA9IGNoaWxkO1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3dFcnIgPSBmYWxzZTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKHRocm93RXJyID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBPbmx5IGEgc2luZ2xlIGh0bWwgZWxlbWVudCBjYW4gY29tZSBmcm9tIGNvbXBvbmVudCAke3RoaXMuY29tcG9uZW50Lm5hbWV9LCBtdWx0aXBsZSBlbGVtZW50cyB3ZXJlIGRldGVjdGVkLmApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChodG1sSGFuZGxlci5xdWVyeVNlbGVjdG9yID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0bmV3T2JqID0gKDxIVE1MRWxlbWVudD5uZXdET00uYm9keS5jaGlsZHJlblswXSk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0bmV3T2JqID0gbmV3RE9NLnF1ZXJ5U2VsZWN0b3IgKGh0bWxIYW5kbGVyLnF1ZXJ5U2VsZWN0b3IpO1xuXHRcdFxuXHRcdFx0XHRcdHRoaXMucmVwbGFjZVdpdGggKG5ld09iaik7XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50LmNsaWNrICE9IG51bGwpXG5cdFx0XHRcdFx0XHRuZXdPYmouYWRkRXZlbnRMaXN0ZW5lciAoXCJjbGlja1wiLCB0aGlzLmNvbXBvbmVudC5jbGljay5iaW5kICh0aGlzLmNvbXBvbmVudCkpO1xuXHRcdFxuXHRcdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmNvbXBvbmVudC5ldmVudHMpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGV2ZW50ID0gdGhpcy5jb21wb25lbnQuZXZlbnRzW2tleV07XG5cdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRuZXdPYmouYWRkRXZlbnRMaXN0ZW5lciAoZXZlbnQudHlwZSwgZXZlbnQuZnVuYywgZXZlbnQub3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGxldCBvYmplY3RGdW5jdGlvbnM6IHN0cmluZ1tdID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgKHRoaXMuY29tcG9uZW50LmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG5cdFx0XG5cdFx0XHRcdFx0Ly8gQXNzb2NpYXRlIGFueSBmdW5jdGlvbnMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZWxlbWVudC5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG9iamVjdEZ1bmN0aW9ucy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb2JqRnVuYzogc3RyaW5nID0gb2JqZWN0RnVuY3Rpb25zW2lJZHhdO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKG9iakZ1bmMgPT09IFwiY29uc3RydWN0b3JcIilcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRsZXQgcHJvcCA9IHRoaXMuY29tcG9uZW50W29iakZ1bmNdO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiAocHJvcCkgPT09IFwiZnVuY3Rpb25cIilcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGlzTmV3RnVuY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHQvLyBHbyB0aHJvdWdoIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGJhc2UgSG90Q29tcG9uZW50IGFuZCBzZWUgXG5cdFx0XHRcdFx0XHRcdC8vIGlmIHRoZXJlJ3MgYW55IG1hdGNoZXMuIElmIHRoZXJlJ3MgYSBtYXRjaCwgdGhhdCBtZWFucyBcblx0XHRcdFx0XHRcdFx0Ly8gd2UncmUgdHJ5aW5nIHRvIGFkZCBhbiBleGlzdGluZyBmdW5jdGlvbiwgYW5kIHdlIGRvbid0XG5cdFx0XHRcdFx0XHRcdC8vIHdhbm5hIGRvIHRoYXQuIFNraXAgaXQuXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGtleTIgaW4gSG90Q29tcG9uZW50LnByb3RvdHlwZSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChvYmpGdW5jID09PSBrZXkyKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlzTmV3RnVuY3Rpb24gPSBmYWxzZTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChpc05ld0Z1bmN0aW9uID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdG5ld09ialtvYmpGdW5jXSA9IEhvdFN0YXEua2VlcENvbnRleHQgKHRoaXMuY29tcG9uZW50W29iakZ1bmNdLCB0aGlzLmNvbXBvbmVudCk7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYWRkRnVuY3Rpb25zVG8gIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHF1ZXJ5OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgKGFkZEZ1bmN0aW9uc1RvKTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdHF1ZXJ5W29iakZ1bmNdID0gSG90U3RhcS5rZWVwQ29udGV4dCAodGhpcy5jb21wb25lbnRbb2JqRnVuY10sIHRoaXMuY29tcG9uZW50KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUHJlUGxhY2UgIT0gbnVsbClcblx0XHRcdFx0XHRcdG5ld09iaiA9IHRoaXMuY29tcG9uZW50Lm9uUHJlUGxhY2UgKG5ld09iaik7XG5cdFx0XG5cdFx0XHRcdFx0bGV0IGNvbXBIdG1sRWxlbWVudDI6IEhUTUxFbGVtZW50ID0gdGhpcy5jb21wb25lbnQub25DcmVhdGVkIChuZXdPYmopO1xuXHRcdFxuXHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvbmVudC5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5vblBhcmVudFBsYWNlID0gdGhpcy5jb21wb25lbnQub25QYXJlbnRQbGFjZTtcblx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIuaG90Q29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQ7XG5cdFx0XHRcdFx0dGhpcy5jb21wb25lbnQuaHRtbEVsZW1lbnRzLnB1c2ggKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFxuXHRcdFx0XHRcdGlmIChvdXRwdXQuY2xvc2VzdFNlbGVjdG9yICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHBhcmVudEVsbTogSFRNTEVsZW1lbnQgPSBjb21wSHRtbEVsZW1lbnQyO1xuXG5cdFx0XHRcdFx0XHR3aGlsZSAocGFyZW50RWxtKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgZm91bmROb2RlOiBOb2RlID0gcGFyZW50RWxtLnF1ZXJ5U2VsZWN0b3IgKG91dHB1dC5jbG9zZXN0U2VsZWN0b3IpO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChmb3VuZE5vZGUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHBhcmVudEVsbSA9ICg8SFRNTEVsZW1lbnQ+Zm91bmROb2RlKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHBhcmVudEVsbSA9IHBhcmVudEVsbS5wYXJlbnRFbGVtZW50O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAocGFyZW50RWxtID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIGNsb3Nlc3Qgbm9kZSB3aXRoIHNlbGVjdG9yICcke291dHB1dC5jbG9zZXN0U2VsZWN0b3J9J2ApO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFx0XHRcdHBhcmVudEVsbS5hcHBlbmRDaGlsZCAoY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRpZiAoY29tcEh0bWxFbGVtZW50Mi5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5ob3RDb21wb25lbnQub25QYXJlbnRQbGFjZSAocGFyZW50Tm9kZSwgY29tcEh0bWxFbGVtZW50Mik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdGlmIChvdXRwdXQuZG9jdW1lbnRTZWxlY3RvciAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlOiBOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciAob3V0cHV0LmRvY3VtZW50U2VsZWN0b3IpO1xuXG5cdFx0XHRcdFx0XHRpZiAocGFyZW50Tm9kZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZmluZCBkb2N1bWVudCBub2RlIHdpdGggc2VsZWN0b3IgJyR7b3V0cHV0LmRvY3VtZW50U2VsZWN0b3J9J2ApO1xuXHRcdFxuXHRcdFx0XHRcdFx0Y29tcEh0bWxFbGVtZW50Mi5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkIChjb21wSHRtbEVsZW1lbnQyKTtcblx0XHRcdFx0XHRcdHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQgKGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFxuXHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0aWYgKGNvbXBIdG1sRWxlbWVudDIub25QYXJlbnRQbGFjZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIuaG90Q29tcG9uZW50Lm9uUGFyZW50UGxhY2UgKHBhcmVudE5vZGUsIGNvbXBIdG1sRWxlbWVudDIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxldCBwbGFjZUVsbUluUGFyZW50ID0gKHBhcmVudE5vZGVUb0NoZWNrOiBQYXJlbnROb2RlLCBwbGFjZUhlcmVQYXJlbnQ6IHN0cmluZywgY2hpbGRUb1BsYWNlOiBOb2RlKTogUGFyZW50Tm9kZSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlQ2hlY2tDb3VudGVyOiBudW1iZXIgPSAwO1xuXHRcdFxuXHRcdFx0XHRcdFx0d2hpbGUgKHBhcmVudE5vZGVDaGVja0NvdW50ZXIgPCAxMCkgLy8vIEB0b2RvIE1ha2UgdGhpcyBjb250cm9sbGFibGUgd2l0aCBhIHZhcmlhYmxlIGZyb20gdGhlIGNvbXBvbmVudC5cblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE5vZGVUb0NoZWNrID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJlbnROb2RlVG9DaGVjayBpbnN0YW5jZW9mIEhUTUxIdG1sRWxlbWVudClcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGhvdC1wbGFjZS1oZXJlIGV4aXN0cywgcGxhY2UgdGhlIGNoaWxkcmVuIHRoZXJlLiBJZiBub3QsIHBsYWNlIGl0IHVuZGVyIHRoZSBcblx0XHRcdFx0XHRcdFx0Ly8gbmV3IGVsZW1lbnQuXG5cdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVBcnJheSA9IHBhcmVudE5vZGVUb0NoZWNrLnF1ZXJ5U2VsZWN0b3JBbGwgKGBob3QtcGxhY2UtaGVyZVtuYW1lPVwiJHtwbGFjZUhlcmVQYXJlbnR9XCJdYCk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChwbGFjZUhlcmVBcnJheS5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHBsYWNlSGVyZSA9IHBsYWNlSGVyZUFycmF5WzBdO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZFRvUGxhY2UucGFyZW50Tm9kZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2hpbGRUb1BsYWNlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQgKGNoaWxkVG9QbGFjZSk7XG5cblx0XHRcdFx0XHRcdFx0XHRwbGFjZUhlcmUuYXBwZW5kQ2hpbGQgKGNoaWxkVG9QbGFjZSk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZFRvUGxhY2Uub25QYXJlbnRQbGFjZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdGNoaWxkVG9QbGFjZS5ob3RDb21wb25lbnQub25QYXJlbnRQbGFjZSAocGxhY2VIZXJlLCBjaGlsZFRvUGxhY2UpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGxhY2VIZXJlQXJyYXkubGVuZ3RoIDwgMSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVBdHRyQXJyYXkgPSBwYXJlbnROb2RlVG9DaGVjay5xdWVyeVNlbGVjdG9yQWxsIChgW2hvdC1wbGFjZS1oZXJlPVwiJHtwbGFjZUhlcmVQYXJlbnR9XCJdYCk7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBsYWNlSGVyZUF0dHJBcnJheS5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmUgPSBwbGFjZUhlcmVBdHRyQXJyYXlbMF07XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjaGlsZFRvUGxhY2UucGFyZW50Tm9kZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjaGlsZFRvUGxhY2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCAoY2hpbGRUb1BsYWNlKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0cGxhY2VIZXJlLmFwcGVuZENoaWxkIChjaGlsZFRvUGxhY2UpO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNoaWxkVG9QbGFjZS5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2hpbGRUb1BsYWNlLmhvdENvbXBvbmVudC5vblBhcmVudFBsYWNlIChwbGFjZUhlcmUsIGNoaWxkVG9QbGFjZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHRcdFx0cGFyZW50Tm9kZVRvQ2hlY2sgPSBwYXJlbnROb2RlVG9DaGVjay5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdFx0XHRwYXJlbnROb2RlQ2hlY2tDb3VudGVyKys7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiAocGFyZW50Tm9kZVRvQ2hlY2spO1xuXHRcdFx0XHRcdH07XG5cdFx0XG5cdFx0XHRcdFx0aWYgKG91dHB1dC5wbGFjZUhlcmVQYXJlbnQgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgcGFyZW50Tm9kZVRvQ2hlY2sgPSBjb21wSHRtbEVsZW1lbnQyLnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0XHRwYXJlbnROb2RlVG9DaGVjayA9IHBsYWNlRWxtSW5QYXJlbnQgKHBhcmVudE5vZGVUb0NoZWNrLCBvdXRwdXQucGxhY2VIZXJlUGFyZW50LCBjb21wSHRtbEVsZW1lbnQyKTtcblxuXHRcdFx0XHRcdFx0aWYgKHBhcmVudE5vZGVUb0NoZWNrID09IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIHBhcmVudCBub2RlIHdpdGggaG90LXBsYWNlLWhlcmUgYXR0cmlidXRlICcke291dHB1dC5wbGFjZUhlcmVQYXJlbnR9J2ApO1xuXHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHQvLyBBcHBlbmQgdGhlIGNoaWxkcmVuIHRvIHRoZSBuZXdseSBjcmVhdGVkIEhUTUwgZWxlbWVudC5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGNoaWxkcmVuVG9SZWFkZC5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZDogSFRNTEVsZW1lbnQgPSAoPEhUTUxFbGVtZW50PmNoaWxkcmVuVG9SZWFkZFtpSWR4XSk7XG5cdFx0XHRcdFx0XHRsZXQgcGxhY2VkQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBhdHRyaWJ1dGUgaG90LXBsYWNlLXBhcmVudCBpbiBjaGlsZC5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKGNoaWxkLmdldEF0dHJpYnV0ZSkgIT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBwbGFjZUhlcmVQYXJlbnRBdHRyID0gY2hpbGQuZ2V0QXR0cmlidXRlIChcImhvdC1wbGFjZS1wYXJlbnRcIik7XG5cblx0XHRcdFx0XHRcdFx0aWYgKChwbGFjZUhlcmVQYXJlbnRBdHRyICE9IG51bGwpICYmIChwbGFjZUhlcmVQYXJlbnRBdHRyICE9PSBcIlwiKSlcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBwYXJlbnROb2RlVG9DaGVjazogUGFyZW50Tm9kZSA9IGNvbXBIdG1sRWxlbWVudDI7XG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50Tm9kZVRvQ2hlY2sgPSBwbGFjZUVsbUluUGFyZW50IChwYXJlbnROb2RlVG9DaGVjaywgcGxhY2VIZXJlUGFyZW50QXR0ciwgY2hpbGQpO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJlbnROb2RlVG9DaGVjayA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgcGFyZW50IG5vZGUgd2l0aCBob3QtcGxhY2UtaGVyZSBhdHRyaWJ1dGUgJyR7b3V0cHV0LnBsYWNlSGVyZVBhcmVudH0nYCk7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0cGxhY2VkQ2hpbGQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0XHRpZiAocGxhY2VkQ2hpbGQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0XHRjb21wSHRtbEVsZW1lbnQyLmFwcGVuZENoaWxkIChjaGlsZCk7XG5cblx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdGlmIChjaGlsZC5vblBhcmVudFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0Y2hpbGQuaG90Q29tcG9uZW50Lm9uUGFyZW50UGxhY2UgKGNvbXBIdG1sRWxlbWVudDIsIGNoaWxkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9uZW50Lm9uUG9zdFBsYWNlICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHRlbXA6IEhUTUxFbGVtZW50ID0gdGhpcy5jb21wb25lbnQub25Qb3N0UGxhY2UgKGNvbXBIdG1sRWxlbWVudDIucGFyZW50RWxlbWVudCwgY29tcEh0bWxFbGVtZW50Mik7XG5cblx0XHRcdFx0XHRcdGlmICh0ZW1wICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdGNvbXBIdG1sRWxlbWVudDIgPSB0ZW1wO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh0eXBlb2YgKEhvdCkgIT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgY29tcG9uZW50TmFtZTogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5jb21wb25lbnQubmFtZSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudE5hbWUgPSB0aGlzLmNvbXBvbmVudC5uYW1lO1xuXG5cdFx0XHRcdFx0XHRcdGlmICgoY29tcG9uZW50TmFtZSA9PSBudWxsKSB8fCAoY29tcG9uZW50TmFtZSA9PT0gXCJcIikpXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50TmFtZSA9IHRoaXMuaWQ7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudE5hbWUgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0SG90LkN1cnJlbnRQYWdlLmNvbXBvbmVudHNbY29tcG9uZW50TmFtZV0gPSB0aGlzLmNvbXBvbmVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhpcyBoZWxwcyBwYXJzZSA8dHI+IGFuZCBvdGhlciB0YWdzIHRoYXQgZG8gbm90IGhhdmUgYSBwYXJlbnQuXG5cdFx0XHQgKiBcblx0XHRcdCAqIFRoYW5rcyBCcmFuZG9uIE1jQ29ubmVsbCFcblx0XHRcdCAqIFxuXHRcdFx0ICogRnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjczMTM0NzkvbWFrZS1wYXJzZWZyb21zdHJpbmctcGFyc2Utd2l0aG91dC12YWxpZGF0aW9uXG5cdFx0XHQgKiBcblx0XHRcdCAqIEB0b2RvIE1heSByZW1vdmUgdGhpcyBhcyBpdCBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgd2VsbCBpbiBhIGxvdCBvZiBlZGdlIGNhc2VzLlxuXHRcdFx0ICovXG5cdFx0XHRwcm90ZWN0ZWQgbG9vc2VQYXJzZUZyb21TdHJpbmcgKHBhcnNlcjogRE9NUGFyc2VyLCBzdHI6IHN0cmluZykge1xuXHRcdFx0XHRzdHIgPSBzdHIucmVwbGFjZSgvIFxcLz4vZywgJz4nKS5yZXBsYWNlKC8oPChhcmVhfGJhc2V8YnJ8Y29sfGNvbW1hbmR8ZW1iZWR8aHJ8aW1nfGlucHV0fGtleWdlbnxsaW5rfG1ldGF8cGFyYW18c291cmNlfHRyYWNrfHdicikuKj8+KS9nLCAnJDE8LyQyPicpO1xuXHRcdFx0XHRjb25zdCB4ZG9tID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZygnPHhtbD4nK3N0cisnPC94bWw+JywgJ3RleHQveG1sJyk7XG5cdFx0XHRcdGNvbnN0IGhkb20gPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKCcnLCAndGV4dC9odG1sJyk7XG5cdFx0XHRcdGZvciAobGV0IGVsZW0gb2YgQXJyYXkuZnJvbSh4ZG9tLmRvY3VtZW50RWxlbWVudC5jaGlsZHJlbikpIHtcblx0XHRcdFx0XHQvLy8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGhkb20uYm9keS5hcHBlbmRDaGlsZChlbGVtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGxldCBlbGVtIG9mIEFycmF5LmZyb20oaGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdhcmVhLGJhc2UsYnIsY29sLGNvbW1hbmQsZW1iZWQsaHIsaW1nLGlucHV0LGtleWdlbixsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicpKSkge1xuXHRcdFx0XHRcdC8vLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0ZWxlbS5vdXRlckhUTUwgPSAnPCcrZWxlbS5vdXRlckhUTUwuc2xpY2UoMSkuc3BsaXQoJzwnKVswXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaGRvbTtcblx0XHRcdH1cblxuXHRcdFx0Z2V0IG9ic2VydmVkQXR0cmlidXRlcygpOiBzdHJpbmdbXSAvLy8gQGZpeG1lIERvZXMgdGhpcyBSRUFMTFkgaGF2ZSB0byBiZSBzdGF0aWM/IEF3ZnVsIGlmIGl0IGRvZXMuLi5cblx0XHRcdHtcblx0XHRcdFx0cmV0dXJuICh0aGlzLmNvbXBvbmVudC5vYnNlcnZlZEF0dHJpYnV0ZXMpO1xuXHRcdFx0fVxuXHRcdH0sIGVsZW1lbnRPcHRpb25zKTtcbn0iLCJpbXBvcnQgeyBIb3QgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90RmlsZSB9IGZyb20gXCIuL0hvdEZpbGVcIjtcbmltcG9ydCB7IEhvdExvZyB9IGZyb20gXCIuL0hvdExvZ1wiO1xuaW1wb3J0IHsgSG90RXZlbnRNZXRob2QgfSBmcm9tIFwiLi9Ib3RSb3V0ZU1ldGhvZFwiO1xuaW1wb3J0IHsgSG90U3RhcSwgSG90U3RhcnRPcHRpb25zIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuXG4vKipcbiAqIElmIHJ1bm5pbmcgaW4gYSBicm93c2VyLCB0aGlzIHdpbGwgc3RhcnQgSG90U3RhcS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhvdFN0YXFXZWJTdGFydCAoKVxue1xuXHQvLyBAdHMtaWdub3JlXG5cdGlmICh0eXBlb2YgKHdpbmRvdy5ob3RzdGFxU3RhcnRpbmdBcHApICE9PSBcInVuZGVmaW5lZFwiKVxuXHR7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmICh3aW5kb3cuaG90c3RhcVN0YXJ0aW5nQXBwID09PSB0cnVlKVxuXHRcdFx0cmV0dXJuO1xuXHR9XG5cblx0bGV0IGhvdHN0YXFFbG1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwiaG90c3RhcVwiKTtcblxuXHQvLyBTZXQgdGhpcyB0byB0cnVlLCBqdXN0IGluIGNhc2UuLi5cblx0SG90U3RhcS5pc1dlYiA9IHRydWU7XG5cblx0Ly8gQHRzLWlnbm9yZVxuXHRpZiAodHlwZW9mIChIb3RTdGFxV2ViKSAhPT0gXCJ1bmRlZmluZWRcIilcblx0e1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRmb3IgKGxldCBrZXkgaW4gSG90U3RhcVdlYilcblx0XHR7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHR3aW5kb3dba2V5XSA9IEhvdFN0YXFXZWJba2V5XTtcblx0XHR9XG5cdH1cblxuXHRpZiAoaG90c3RhcUVsbXMubGVuZ3RoID4gMClcblx0e1xuXHRcdGxldCBob3RzdGFxRWxtOiBIVE1MRWxlbWVudCA9ICg8SFRNTEVsZW1lbnQ+aG90c3RhcUVsbXNbMF0pO1xuXG5cdFx0c2V0VGltZW91dCAoYXN5bmMgZnVuY3Rpb24gKClcblx0XHRcdHtcblx0XHRcdFx0bGV0IGdldEF0dHIgPSAoZWxtOiBIVE1MRWxlbWVudCwgYXR0ck5hbWVzOiBzdHJpbmdbXSkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGF0dHJOYW1lcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGF0dHJOYW1lOiBzdHJpbmcgPSBhdHRyTmFtZXNbaUlkeF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKGVsbS5nZXRBdHRyaWJ1dGUgKGF0dHJOYW1lKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAoZWxtLmdldEF0dHJpYnV0ZSAoYXR0ck5hbWUpKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoZWxtLmdldEF0dHJpYnV0ZSAoYGRhdGEtJHthdHRyTmFtZX1gKSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAoZWxtLmdldEF0dHJpYnV0ZSAoYGRhdGEtJHthdHRyTmFtZX1gKSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiAodW5kZWZpbmVkKTtcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdGxldCBsb2FkUGFnZTogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wibG9hZC1wYWdlXCIsIFwibG9hZFBhZ2VcIiwgXCJzcmNcIl0pIHx8IFwiXCI7XG5cdFx0XHRcdGxldCBsb2dnaW5nTGV2ZWw6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcImxvZ2dpbmctbGV2ZWxcIiwgXCJsb2dnaW5nTGV2ZWxcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCBzdGFydERlbGF5OiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJzdGFydC1kZWxheVwiLCBcInN0YXJ0RGVsYXlcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCByb3V0ZXI6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcInJvdXRlclwiXSkgfHwgXCJcIjtcblx0XHRcdFx0bGV0IG5hbWU6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcIm5hbWVcIl0pIHx8IFwiZGVmYXVsdFwiO1xuXHRcdFx0XHRsZXQgYXJnczogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1wiYXJnc1wiXSkgfHwgbnVsbDtcblx0XHRcdFx0bGV0IGFwaUpTVXJsOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJhcGktanMtdXJsXCIsIFwiYXBpSlNVcmxcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCBhcGlMaWJyYXJ5OiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJhcGktbGlicmFyeVwiLCBcImFwaUxpYnJhcnlcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCBhcGlOYW1lOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJhcGktbmFtZVwiLCBcImFwaU5hbWVcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCBhcGlVcmw6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcImFwaS11cmxcIiwgXCJhcGlVcmxcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCB0ZXN0ZXJOYW1lOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJ0ZXN0ZXItbmFtZVwiLCBcInRlc3Rlck5hbWVcIl0pIHx8IFwiSG90VGVzdGVyTW9jaGFTZWxlbml1bVwiO1xuXHRcdFx0XHRsZXQgdGVzdGVyTWFwOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJ0ZXN0ZXItbWFwXCIsIFwidGVzdGVyTWFwXCJdKSB8fCBudWxsO1xuXHRcdFx0XHRsZXQgdGVzdGVyQXBpQmFzZVVybDogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVsbSwgW1widGVzdGVyLWFwaS1iYXNlLXVybFwiLCBcInRlc3RlckFwaUJhc2VVcmxcIl0pIHx8IG51bGw7XG5cdFx0XHRcdGxldCB0ZXN0ZXJMYXVuY2hwYWRVcmw6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFFbG0sIFtcInRlc3Rlci1sYXVuY2hwYWQtdXJsXCIsIFwidGVzdGVyTGF1bmNocGFkVXJsXCJdKSB8fCBudWxsO1xuXHRcdFx0XHRsZXQgZG9udFJldXNlUHJvY2Vzc29yOiBib29sZWFuID0gZmFsc2U7XG5cdFx0XHRcdGxldCBwYXNzUmF3VXJsOiBib29sZWFuID0gZmFsc2U7XG5cdFx0XHRcdGxldCBodG1sU291cmNlOiBzdHJpbmcgPSBob3RzdGFxRWxtLmlubmVySFRNTCB8fCBcIlwiO1xuXHRcdFx0XHRsZXQgcm91dGVyTWFuYWdlcjogeyBbcGF0aDogc3RyaW5nXTogeyByZWRpcmVjdDogc3RyaW5nOyBiYXNlUmVkaXJlY3Q6IHN0cmluZzsgYmFzZTogc3RyaW5nOyBzcmM6IHN0cmluZzsgfSB9ID0ge307XG5cdFx0XHRcdGxldCByb3V0ZXJXaWxkY2FyZHM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGxldCBzZWFyY2g6IFVSTFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXG5cdFx0XHRcdGlmIChzdGFydERlbGF5ICE9IG51bGwpXG5cdFx0XHRcdFx0YXdhaXQgSG90U3RhcS53YWl0IChwYXJzZUludCAoc3RhcnREZWxheSkpO1xuXG5cdFx0XHRcdGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJzcmNcIl0pICE9IG51bGwpXG5cdFx0XHRcdFx0bG9hZFBhZ2UgPSBnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJzcmNcIl0pO1xuXG5cdFx0XHRcdGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJwYXNzUmF3VXJsXCJdKSAhPSBudWxsKVxuXHRcdFx0XHRcdHBhc3NSYXdVcmwgPSB0cnVlO1xuXG5cdFx0XHRcdGlmIChnZXRBdHRyIChob3RzdGFxRWxtLCBbXCJkb250LXJldXNlLXByb2Nlc3NvclwiLCBcImRvbnRSZXVzZVByb2Nlc3NvclwiXSkgIT0gbnVsbClcblx0XHRcdFx0XHRkb250UmV1c2VQcm9jZXNzb3IgPSB0cnVlO1xuXG5cdFx0XHRcdGxldCBoc3RxYmFzZXJlZGlyZWN0OiBzdHJpbmcgPSBzZWFyY2guZ2V0IChcImhzdHFiYXNlcmVkaXJlY3RcIik7XG5cblx0XHRcdFx0aWYgKGhzdHFiYXNlcmVkaXJlY3QgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGhzdHFiYXNlcmVkaXJlY3QgPSBkZWNvZGVVUkkgKGhzdHFiYXNlcmVkaXJlY3QpO1xuXHRcdFx0XHRcdHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSAoXCJcIiwgXCJcIiwgaHN0cWJhc2VyZWRpcmVjdCk7XG5cdFx0XHRcdFx0bG9hZFBhZ2UgPSBoc3RxYmFzZXJlZGlyZWN0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhvdHN0YXFFcnJvcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJob3RzdGFxLWVycm9yXCIpO1xuXG5cdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgaG90c3RhcUVycm9ycy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRsZXQgaG90c3RhcUVycm9yRWxtOiBIVE1MRWxlbWVudCA9IGhvdHN0YXFFcnJvcnNbaUlkeF07XG5cdFx0XHRcdFx0bGV0IGVycm9yU3RhdHVzOiBzdHJpbmcgPSBnZXRBdHRyIChob3RzdGFxRXJyb3JFbG0sIFtcInN0YXR1c1wiXSk7XG5cdFx0XHRcdFx0bGV0IHVuc3VwcG9ydGVkQnJvd3Nlcjogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcUVycm9yRWxtLCBbXCJ1bnN1cHBvcnRlZC1icm93c2VyLXJlZGlyZWN0XCJdKTtcblxuXHRcdFx0XHRcdGlmICh1bnN1cHBvcnRlZEJyb3dzZXIgIT0gbnVsbClcblx0XHRcdFx0XHRcdEhvdFN0YXEuZXJyb3JzW1widW5zdXBwb3J0ZWRCcm93c2VyXCJdID0geyByZWRpcmVjdFRvVXJsOiB1bnN1cHBvcnRlZEJyb3dzZXIgfTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRIb3RTdGFxLmVycm9yc1tgJHtlcnJvclN0YXR1c31gXSA9IHsgcmVkaXJlY3RUb1VybDogdW5zdXBwb3J0ZWRCcm93c2VyIH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayBpZiBhc3luYy9hd2FpdCBpcyBhdmFpbGFibGUuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZXZhbCAoXCJhc3luYyAoKSA9PiB7fVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXRjaCAoZXgpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRIb3RTdGFxLmV4ZWN1dGVFcnJvciAoXCJ1bnN1cHBvcnRlZEJyb3dzZXJcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocm91dGVyICE9PSBcIlwiKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGhvdHN0YXFSb3V0ZXJFbG1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwiaG90c3RhcS1yb3V0ZXJcIik7XG5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGhvdHN0YXFSb3V0ZXJFbG1zLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdGxldCBob3RzdGFxUm91dGVyRWxtOiBIVE1MRWxlbWVudCA9IGhvdHN0YXFSb3V0ZXJFbG1zW2lJZHhdO1xuXHRcdFx0XHRcdFx0bGV0IHJvdXRlck5hbWU6IHN0cmluZyA9IGdldEF0dHIgKGhvdHN0YXFSb3V0ZXJFbG0sIFtcIm5hbWVcIl0pO1xuXHRcdFx0XHRcdFx0bGV0IHNlcnZlTG9jYWxseTogc3RyaW5nID0gZ2V0QXR0ciAoaG90c3RhcVJvdXRlckVsbSwgW1wic2VydmUtbG9jYWxcIiwgXCJzZXJ2ZUxvY2FsbHlcIl0pO1xuXG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRpZiAocm91dGVyTmFtZSA9PT0gcm91dGVyKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLyBMb2FkIGFsbCByb3V0ZXMgZnJvbSB0aGUgcm91dGVyLlxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpSmR4ID0gMDsgaUpkeCA8IGhvdHN0YXFSb3V0ZXJFbG0uY2hpbGROb2Rlcy5sZW5ndGg7IGlKZHgrKylcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRsZXQgcm91dGVyRWxtOiBIVE1MRWxlbWVudCA9IGhvdHN0YXFSb3V0ZXJFbG0uY2hpbGROb2Rlc1tpSmR4XTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJFbG0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudClcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocm91dGVyRWxtLnRhZ05hbWUudG9VcHBlckNhc2UgKCkgPT09IFwiUk9VVEVcIilcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJvdXRlclBhdGg6IHN0cmluZyA9IGdldEF0dHIgKHJvdXRlckVsbSwgW1wicGF0aFwiXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCByZWRpcmVjdDogc3RyaW5nID0gZ2V0QXR0ciAocm91dGVyRWxtLCBbXCJyZWRpcmVjdFwiXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBiYXNlUmVkaXJlY3Q6IHN0cmluZyA9IGdldEF0dHIgKHJvdXRlckVsbSwgW1wiYmFzZS1yZWRpcmVjdFwiLCBcImJhc2VSZWRpcmVjdFwiXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBiYXNlOiBzdHJpbmcgPSBnZXRBdHRyIChyb3V0ZXJFbG0sIFtcImJhc2VcIl0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgcm91dGVyU3JjOiBzdHJpbmcgPSBnZXRBdHRyIChyb3V0ZXJFbG0sIFtcInNyY1wiXSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJvdXRlclBhdGguaW5kZXhPZiAoXCIqXCIpID4gLTEpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cm91dGVyV2lsZGNhcmRzLnB1c2ggKHJvdXRlclBhdGgpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJvdXRlck1hbmFnZXJbcm91dGVyUGF0aF0gPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZWRpcmVjdDogcmVkaXJlY3QgfHwgdW5kZWZpbmVkLCBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJhc2VSZWRpcmVjdDogYmFzZVJlZGlyZWN0IHx8IHVuZGVmaW5lZCwgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiYXNlOiBiYXNlIHx8IHVuZGVmaW5lZCwgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzcmM6IHJvdXRlclNyYyB8fCB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGxldCBjaGVja1BhdGg6IHN0cmluZyA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcblx0XHRcdFx0XHRcdFx0bGV0IGdvdG9QYXRoOiBzdHJpbmcgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHNlcnZlTG9jYWxseSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbG93ZXJTZXJ2ZUxvY2FsbHk6IHN0cmluZyA9IHNlcnZlTG9jYWxseS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICgobG93ZXJTZXJ2ZUxvY2FsbHkgPT09IFwidHJ1ZVwiKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGxvd2VyU2VydmVMb2NhbGx5ID09PSBcInllc1wiKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGxvd2VyU2VydmVMb2NhbGx5ID09PSBcIjFcIikpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgbGFzdFNsYXNoUG9zOiBudW1iZXIgPSBjaGVja1BhdGgubGFzdEluZGV4T2YgKFwiL1wiKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGxhc3RTbGFzaFBvcyA+IC0xKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjaGVja1BhdGggPSBjaGVja1BhdGguc3Vic3RyaW5nIChsYXN0U2xhc2hQb3MpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRnb3RvUGF0aCA9IGdvdG9QYXRoLnN1YnN0cmluZyAobGFzdFNsYXNoUG9zKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAocm91dGVyV2lsZGNhcmRzLmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLyBTZXJ2ZSBsb2NhbGx5IGRvZXNuJ3QgcmVhbGx5IHdvcmsgd2l0aCB3aWxkY2FyZHNcblx0XHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIFRoaXMgaXNuJ3QgYWN0dWFsbHkgd29ya2luZyBsaWtlIGEgd2lsZGNhcmQgc2hvdWxkLiBUaGlzIG5lZWRzIHRvIGJlIGltcHJvdmVkLlxuXHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGlKZHggPSAwOyBpSmR4IDwgcm91dGVyV2lsZGNhcmRzLmxlbmd0aDsgaUpkeCsrKVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCByb3V0ZVdpbGRjYXJkOiBzdHJpbmcgPSByb3V0ZXJXaWxkY2FyZHNbaUpkeF07XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgdGVtcFJvdXRlV2lsZGNhcmQ6IHN0cmluZyA9IHJvdXRlV2lsZGNhcmQucmVwbGFjZSAoXCIqXCIsIFwiXCIpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoY2hlY2tQYXRoLmluZGV4T2YgKHRlbXBSb3V0ZVdpbGRjYXJkKSA+IC0xKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGlzIHNpbXBseSByZXR1cm5zIHRoZSBrZXkgaW4gdGhlIHJvdXRlck1hbmFnZXIgdG8gYWNjZXNzLlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjaGVja1BhdGggPSByb3V0ZVdpbGRjYXJkO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIEZpbmQgdGhlIGNvcnJlY3Qgcm91dGUgYW5kIGxvYWQgaXQuXG5cdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0gIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0ucmVkaXJlY3QgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJvdXRlck1hbmFnZXJbY2hlY2tQYXRoXS5yZWRpcmVjdDtcblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0uYmFzZVJlZGlyZWN0ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2VhcmNoUGFyYW1zID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaDtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBtb2RpZmllZFNlYXJjaFBhcmFtcyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICgoc2VhcmNoUGFyYW1zICE9PSBcIlwiKSAmJiAoc2VhcmNoUGFyYW1zICE9PSBcIj9cIikpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1vZGlmaWVkU2VhcmNoUGFyYW1zID0gYCYke3NlYXJjaFBhcmFtcy5zdWJzdHJpbmcgKDEpfWA7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYCR7cm91dGVyTWFuYWdlcltjaGVja1BhdGhdLmJhc2VSZWRpcmVjdH0/aHN0cWJhc2VyZWRpcmVjdD0ke2VuY29kZVVSSSAoZ290b1BhdGggKyBzZWFyY2hQYXJhbXMpfSR7bW9kaWZpZWRTZWFyY2hQYXJhbXN9YDtcblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZXJNYW5hZ2VyW2NoZWNrUGF0aF0uc3JjICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRsb2FkUGFnZSA9IHJvdXRlck1hbmFnZXJbY2hlY2tQYXRoXS5zcmM7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYXJncyAhPSBudWxsKVxuXHRcdFx0XHRcdGFyZ3MgPSBKU09OLnBhcnNlIChhcmdzKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGFyZ3MgPSBIb3QuQXJndW1lbnRzO1xuXG5cdFx0XHRcdGxldCBoYXNIdG1sU291cmNlOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRcdFx0aWYgKGh0bWxTb3VyY2UgIT09IFwiXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCBodG1sU291cmNlQ2hlY2s6IHN0cmluZyA9IGh0bWxTb3VyY2UucmVwbGFjZSAoL1xccy9nLCcnKTtcblxuXHRcdFx0XHRcdGlmIChodG1sU291cmNlQ2hlY2sgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHRoYXNIdG1sU291cmNlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCB0ZW1wTW9kZSA9IDA7XG5cblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRpZiAod2luZG93W1wiSG90XCJdICE9IG51bGwpXG5cdFx0XHRcdFx0dGVtcE1vZGUgPSBIb3QuTW9kZTtcblx0XHRcblx0XHRcdFx0bGV0IHByb2Nlc3NvcjogSG90U3RhcSA9IG51bGw7XG5cblx0XHRcdFx0aWYgKGRvbnRSZXVzZVByb2Nlc3NvciA9PT0gZmFsc2UpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodHlwZW9mIChIb3QpICE9PSBcInVuZGVmaW5lZFwiKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChIb3QuQ3VycmVudFBhZ2UgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSBIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChwcm9jZXNzb3IgPT0gbnVsbClcblx0XHRcdFx0XHRwcm9jZXNzb3IgPSBuZXcgSG90U3RhcSAoKTtcblxuXHRcdFx0XHRpZiAobG9nZ2luZ0xldmVsICE9IG51bGwpXG5cdFx0XHRcdFx0cHJvY2Vzc29yLmxvZ2dlci5sb2dMZXZlbCA9IEhvdExvZy5wYXJzZSAobG9nZ2luZ0xldmVsKTtcblxuXHRcdFx0XHRwcm9jZXNzb3IubW9kZSA9IHRlbXBNb2RlO1xuXG5cdFx0XHRcdGxldCBvcHRpb25zOiBIb3RTdGFydE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRcdFx0cHJvY2Vzc29yOiBwcm9jZXNzb3IsXG5cdFx0XHRcdFx0XHRhcmdzOiBhcmdzXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRpZiAobG9hZFBhZ2UgIT09IFwiXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAocGFzc1Jhd1VybCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGxvYWRQYWdlLmluZGV4T2YgKFwiaHN0cXNlcnZlXCIpIDwgMClcblx0XHRcdFx0XHRcdFx0bG9hZFBhZ2UgKz0gXCI/aHN0cXNlcnZlPW5haGZhbVwiO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG9wdGlvbnMudXJsID0gbG9hZFBhZ2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGVzdGVyTWFwICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck1hcCA9IHRlc3Rlck1hcDtcblx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck5hbWUgPSB0ZXN0ZXJOYW1lO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck5hbWUgPSB0ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdGlmICh0ZXN0ZXJBcGlCYXNlVXJsICE9IG51bGwpXG5cdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gdGVzdGVyQXBpQmFzZVVybDtcblxuXHRcdFx0XHRpZiAodGVzdGVyTGF1bmNocGFkVXJsICE9IG51bGwpXG5cdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJMYXVuY2hwYWRVcmwgPSB0ZXN0ZXJMYXVuY2hwYWRVcmw7XG5cblx0XHRcdFx0aWYgKGFwaU5hbWUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBjbGllbnQgPSBuZXcgSG90Q2xpZW50IChwcm9jZXNzb3IpO1xuXG5cdFx0XHRcdFx0aWYgKChhcGlVcmwgPT0gbnVsbCkgfHwgKGFwaVVybCA9PT0gXCJcIikpXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBhcGktdXJsIHdhcyBub3Qgc2V0IWApO1xuXG5cdFx0XHRcdFx0aWYgKChhcGlKU1VybCA9PSBudWxsKSB8fCAoYXBpSlNVcmwgPT09IFwiXCIpKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgYXBpLWpzLXVybCB3YXMgbm90IHNldCFgKTtcblxuXHRcdFx0XHRcdGNvbnN0IGFwaUpTVXJsQ29udGVudDogc3RyaW5nID0gYXdhaXQgSG90RmlsZS5odHRwR2V0IChhcGlKU1VybCk7XG5cblx0XHRcdFx0XHRpZiAoYXBpSlNVcmxDb250ZW50ID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgYXBpLWpzLXVybCBjb250ZW50IHdhcyBlbXB0eSFgKTtcblxuXHRcdFx0XHRcdGxldCBwYXJlbnRPYmplY3QgPSBudWxsO1xuXG5cdFx0XHRcdFx0Ly8vIEB0b2RvIFJlcXVpcmUgYSBoYXNoIHRvIGJlIHBhc3NlZCB0aGF0IG1hdGNoZXMgdGhlIGNvbnRlbnQgb2YgYXBpSlNVcmxDb250ZW50LlxuXHRcdFx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChwYXJlbnRPYmplY3QgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0cGFyZW50T2JqZWN0ID0gd2luZG93O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHBhcmVudE9iamVjdCA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRwYXJlbnRPYmplY3QgPSBnbG9iYWw7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZXZhbC5hcHBseSAocGFyZW50T2JqZWN0LCBbYXBpSlNVcmxDb250ZW50XSk7XG5cblx0XHRcdFx0XHRsZXQgcGFyZW50TGliOiBhbnkgPSB3aW5kb3c7XG5cblx0XHRcdFx0XHRpZiAoYXBpTGlicmFyeSAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdHBhcmVudExpYiA9IHdpbmRvd1thcGlMaWJyYXJ5XTtcblxuXHRcdFx0XHRcdFx0aWYgKHBhcmVudExpYiA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZmluZCB0aGUgQVBJIGxpYnJhcnkgJHthcGlMaWJyYXJ5fSFgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRsZXQgbmV3QVBJID0gbmV3IHBhcmVudExpYlthcGlOYW1lXSAoYXBpVXJsLCBjbGllbnQpO1xuXHRcdFx0XHRcdG5ld0FQSS5jb25uZWN0aW9uLmFwaSA9IG5ld0FQSTtcblx0XHRcdFx0XHRwcm9jZXNzb3IuYXBpID0gbmV3QVBJO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGhhc0h0bWxTb3VyY2UgPT09IGZhbHNlKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKGxvYWRQYWdlID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGhlIGhvdHN0YXEgdGFnIG11c3QgaGF2ZSBhIHNyYywgSFRNTCBjb250ZW50cyBpbnNpZGUgaXQsIG9yIGEgcm91dGVyIHNldC5gKTtcblxuXHRcdFx0XHRcdEhvdFN0YXEuZGlzcGxheVVybCAob3B0aW9ucyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90U3RhcS5kaXNwbGF5Q29udGVudCAob3B0aW9ucyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIDUwKTtcblx0fVxufSIsImltcG9ydCB7IEhvdFNpdGVNYXBQYXRoIH0gZnJvbSBcIi4vSG90U2l0ZVwiO1xuXG4vKipcbiAqIFRoZSBkZXN0aW5hdGlvbiB0byB0YWtlIGluIGEgbWFwLlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdERlc3RpbmF0aW9uXG57XG5cdC8qKlxuXHQgKiBUaGUgZGVzdGluYXRpb24gdG8gdGFrZS5cblx0ICovXG5cdGRlc3RpbmF0aW9uOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgc3RhcnQgZXhlY3V0aW5nIGl0J3MgXG5cdCAqIHRlc3RzIHdoZW4gaXQncyB0aW1lLlxuXHQgKi9cblx0YXV0b1N0YXJ0OiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChkZXN0aW5hdGlvbjogc3RyaW5nIHwgSG90VGVzdERlc3RpbmF0aW9uIHwgSG90U2l0ZU1hcFBhdGggPSBcIlwiLCBhdXRvU3RhcnQ6IGJvb2xlYW4gPSB0cnVlKVxuXHR7XG5cdFx0aWYgKHR5cGVvZiAoZGVzdGluYXRpb24pID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcblx0XHRcdHRoaXMuYXV0b1N0YXJ0ID0gYXV0b1N0YXJ0O1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0aWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgSG90VGVzdERlc3RpbmF0aW9uKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb24uZGVzdGluYXRpb247XG5cdFx0XHRcdHRoaXMuYXV0b1N0YXJ0ID0gZGVzdGluYXRpb24uYXV0b1N0YXJ0O1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb24ucGF0aDtcblx0XHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBkZXN0aW5hdGlvbi5hdXRvU3RhcnQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50LCBIb3RUZXN0RWxlbWVudE9wdGlvbnMgfSBmcm9tIFwiLi9Ib3RUZXN0RWxlbWVudFwiO1xuaW1wb3J0IHsgSG90VGVzdFBhZ2UgfSBmcm9tIFwiLi9Ib3RUZXN0UGFnZVwiO1xuXG4vKipcbiAqIFRoaXMgYWN0dWFsbHkgZXhlY3V0ZXMgdGhlIHRlc3RzLlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdERyaXZlclxue1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgcGFnZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50IHBhZ2UuXG5cdCAqL1xuXHRwYWdlOiBIb3RUZXN0UGFnZTtcblx0LyoqXG5cdCAqIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBlYWNoIGV4ZWN1dGVkIGNvbW1hbmQuXG5cdCAqIEBkZWZhdWx0IDIwXG5cdCAqL1xuXHRjb21tYW5kRGVsYXk6IG51bWJlcjtcblx0LyoqXG5cdCAqIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBlYWNoIGNvbXBsZXRlZCBwYWdlIHRlc3QuXG5cdCAqIEBkZWZhdWx0IDUwMFxuXHQgKi9cblx0cGFnZVRlc3REZWxheTogbnVtYmVyO1xuXHQvKipcblx0ICogQW55IGRhdGEgdGhhdCBuZWVkcyB0byBiZSBzYXZlZCBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgdGVzdGluZyBydW5zLlxuXHQgKi9cblx0cGVyc2lzdGVudERhdGE6IGFueTtcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxLCBwYWdlOiBIb3RUZXN0UGFnZSB8IG51bGwgPSBudWxsKVxuXHR7XG5cdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0dGhpcy5wYWdlID0gcGFnZTtcblx0XHR0aGlzLmNvbW1hbmREZWxheSA9IDIwO1xuXHRcdHRoaXMucGFnZVRlc3REZWxheSA9IDcwMDtcblx0XHR0aGlzLnBlcnNpc3RlbnREYXRhID0ge307XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdGVzdCBvYmplY3QgYnkgaXQncyBuYW1lLiBJZiBhICogaXMgdXNlZCwgaXQgd2lsbCBiZSB1c2VkIGFzIGEgXG5cdCAqIHdpbGRjYXJkIGZvciB0aGUgb2JqZWN0J3MgbmFtZS4gSWYgYSA+IGlzIHVzZWQsIHRoZW4gdGhlIG5hbWUgd2lsbCBcblx0ICogYmUgdHJlYXRlZCBhcyBhIENTUyBzZWxlY3Rvci5cblx0ICovXG5cdHBhcnNlVGVzdE9iamVjdCAobmFtZTogc3RyaW5nKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgcG9zOiBudW1iZXIgPSBuYW1lLmluZGV4T2YgKFwiKlwiKTtcblx0XHRsZXQgd2lsZGNhcmQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAocG9zID4gLTEpXG5cdFx0e1xuXHRcdFx0bmFtZSA9IG5hbWUucmVwbGFjZSAoL1xcKi8sIFwiXCIpO1xuXHRcdFx0d2lsZGNhcmQgPSBcIipcIjtcblx0XHR9XG5cblx0XHRsZXQgc2VsZWN0b3I6IHN0cmluZyA9IGBbZGF0YS10ZXN0LW9iamVjdC1uYW1lJHt3aWxkY2FyZH09JyR7bmFtZX0nXWA7XG5cblx0XHRpZiAobmFtZS5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdGlmIChuYW1lWzBdID09PSBcIj5cIilcblx0XHRcdHtcblx0XHRcdFx0bmFtZSA9IG5hbWUuc3Vic3RyaW5nICgxKTtcblx0XHRcdFx0c2VsZWN0b3IgPSBuYW1lO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAoc2VsZWN0b3IpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXQgZm9yIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cblx0ICovXG5cdGFzeW5jIHdhaXQgKG51bU1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0cmV0dXJuIChuZXcgUHJvbWlzZSAoKHJlc29sdmUsIHJlamVjdCkgPT5cblx0XHRcdHtcblx0XHRcdFx0c2V0VGltZW91dCAoKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXNvbHZlICgpO1xuXHRcdFx0XHRcdH0sIG51bU1pbGxpc2Vjb25kcyk7XG5cdFx0XHR9KSk7XG5cdH1cblxuXHQvKipcblx0ICogUHJpbnQgYSBtZXNzYWdlLlxuXHQgKi9cblx0YXN5bmMgcHJpbnQgKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHByb2Nlc3Muc3Rkb3V0LndyaXRlIChtZXNzYWdlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcmludCBhIG1lc3NhZ2UgbGluZS5cblx0ICovXG5cdGFzeW5jIHByaW50bG4gKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGF3YWl0IHRoaXMucHJpbnQgKGAke21lc3NhZ2V9XFxuYCk7XG5cdH1cblxuXHQvKipcblx0ICogRGlzY29ubmVjdCB0aGlzIHNlcnZlciBvciBkZXN0cm95IGFueXRoaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEhvdFRlc3REcml2ZXIuXG5cdCAqL1xuXHRhc3luYyBkZXN0cm95ICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0fVxuXG5cdC8qKlxuXHQgKiBBbiBleHByZXNzaW9uIHRvIHRlc3QuXG5cdCAqL1xuXHRhc3luYyBhc3NlcnQgKHZhbHVlOiBhbnksIGVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIik6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0aWYgKCEgKHZhbHVlKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoZXJyb3JNZXNzYWdlKTtcblx0fVxufSIsIi8qKlxuICogSG90IHRlc3QgZWxlbWVudCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RUZXN0RWxlbWVudE9wdGlvbnNcbntcblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGF0IHRoZSB0ZXN0IGVsZW1lbnQgbXVzdCBiZSB2aXNpYmxlIGluIFxuXHQgKiBvcmRlciB0byBzZWxlY3QgaXQuXG5cdCAqL1xuXHRtdXN0QmVWaXNpYmxlPzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIElmIHRoZSB0ZXN0IGVsZW1lbnQgaXMgbWlzc2luZywgaWdub3JlIHRoZSBlcnJvci4gVGhpcyBcblx0ICogd2lsbCBjYXVzZSB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuIGltbWVkaWF0ZWx5IFxuXHQgKiB3aXRob3V0IGFueSBleGNlcHRpb25zIGJlaW5nIHRocm93bi5cblx0ICovXG5cdGlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3I/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhvdCB0ZXN0IGVsZW1lbnQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFRlc3RFbGVtZW50T3B0aW9ucyBpbXBsZW1lbnRzIElIb3RUZXN0RWxlbWVudE9wdGlvbnNcbntcblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGF0IHRoZSB0ZXN0IGVsZW1lbnQgbXVzdCBiZSB2aXNpYmxlIGluIFxuXHQgKiBvcmRlciB0byBzZWxlY3QgaXQuXG5cdCAqL1xuXHRtdXN0QmVWaXNpYmxlOiBib29sZWFuO1xuXHQvKipcblx0ICogSWYgdGhlIHRlc3QgZWxlbWVudCBpcyBtaXNzaW5nLCBpZ25vcmUgdGhlIGVycm9yLiBUaGlzIFxuXHQgKiB3aWxsIGNhdXNlIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gaW1tZWRpYXRlbHkgXG5cdCAqIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duLlxuXHQgKi9cblx0aWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvcjogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdFRlc3RFbGVtZW50T3B0aW9ucyA9IHt9KVxuXHR7XG5cdFx0dGhpcy5tdXN0QmVWaXNpYmxlID0gY29weS5tdXN0QmVWaXNpYmxlIHx8IHRydWU7XG5cdFx0dGhpcy5pZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yID0gY29weS5pZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yIHx8IGZhbHNlO1xuXHR9XG59XG5cbi8qKlxuICogQSB0ZXN0IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFRlc3RFbGVtZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudC5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIFxuXHQgKiB3aGlsZSBleGVjdXRpbmcgdGhlIHRlc3QuXG5cdCAqL1xuXHRmdW5jPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIHRvIHVzZS5cblx0ICovXG5cdHZhbHVlPzogYW55O1xufVxuXG4vKipcbiAqIEEgdGVzdCBlbGVtZW50LlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdEVsZW1lbnQgaW1wbGVtZW50cyBJSG90VGVzdEVsZW1lbnRcbntcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgXG5cdCAqIHdoaWxlIGV4ZWN1dGluZyB0aGUgdGVzdC5cblx0ICovXG5cdGZ1bmM6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSB0byB1c2UuXG5cdCAqL1xuXHR2YWx1ZTogYW55O1xuXG5cdGNvbnN0cnVjdG9yIChuYW1lOiBzdHJpbmcgfCBJSG90VGVzdEVsZW1lbnQsIGZ1bmM6IHN0cmluZyA9IFwiXCIsIHZhbHVlOiBhbnkgPSBudWxsKVxuXHR7XG5cdFx0aWYgKHR5cGVvZiAobmFtZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHRcdHRoaXMuZnVuYyA9IGZ1bmM7XG5cdFx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLm5hbWUgPSBuYW1lLm5hbWU7XG5cdFx0XHR0aGlzLmZ1bmMgPSBuYW1lLmZ1bmMgfHwgZnVuYztcblx0XHRcdHRoaXMudmFsdWUgPSBuYW1lLnZhbHVlIHx8IHZhbHVlO1xuXHRcdH1cblx0fVxufSIsImltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0RHJpdmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0RGVzdGluYXRpb24gfSBmcm9tIFwiLi9Ib3RUZXN0RGVzdGluYXRpb25cIjtcbmltcG9ydCB7IEhvdFRlc3RQYWdlIH0gZnJvbSBcIi4vSG90VGVzdFBhZ2VcIjtcblxuLyoqXG4gKiBDcmVhdGUgYSB0ZXN0IHBhdGggZm9yIGxhdGVyIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgSG90VGVzdFBhdGggPSAoZHJpdmVyOiBIb3RUZXN0RHJpdmVyKSA9PiBQcm9taXNlPGFueT47XG5cbi8qKlxuICogTWFwcyB0aGUgcGF0aHMgdGhhdCBhcmUgdGFrZW4gdG8gY29tcGxldGUgYSB0ZXN0LlxuICovXG5leHBvcnQgY2xhc3MgSG90VGVzdE1hcFxue1xuXHQvKipcblx0ICogVGhlIG9yZGVyIGluIHdoaWNoIHBhdGhzIGFyZSB0byBiZSB0YWtlbi4gRWFjaCBkZXN0aW5hdGlvbiBpcyBhIHN0cmluZyBcblx0ICogaW4gYSB0eXBlIC0+IHBhdGggb3JkZXIuIFRoZSB0eXBlIGNvdWxkIGJlIGVpdGhlciBhIHBhZ2Ugb3IgYXBpIHJvdXRlLiBcblx0ICogRm9yIGV4YW1wbGU6XG5cdCAqIGBgYFxuXHQgKiBbXG5cdCAqICAgICAgXCJwYWdlOnNpZ25pbl9wYWdlIC0+IHNpZ25pbl9wYXRoXCIsXG5cdCAqICAgICAgXCJwYWdlOmFjY291bnRfcGFnZSAtPiBjaGFuZ2VfdXNlcm5hbWVfcGF0aFwiLFxuXHQgKiAgICAgIFwicGFnZTphY2NvdW50X3BhZ2UgLT4gY2hhbmdlX3Bhc3N3b3JkX3BhdGhcIixcblx0ICogICAgICBcInBhZ2U6YWNjb3VudF9wYWdlIC0+IGNoYW5nZV9uYW1lX3BhdGggLT4gY2hhbmdlX2FkZHJlc3NfcGF0aFwiLFxuXHQgKiBcdFx0XCJwYWdlOmFjY291bnRfcGFnZSAtPiBzaWdub3V0X3BhdGhcIixcblx0ICogXHRcdFwiYXBpOmFjY291bnRfYXBpX3JvdXRlIC0+IHNpZ25vdXRfcm91dGVfbWV0aG9kIC0+IHNpZ25vdXRfdGVzdF9wYXRoXCJcblx0ICogXVxuXHQgKiBgYGBcblx0ICogXG5cdCAqIFRoZSBmaXJzdCBzdHJpbmcgdG8gdGhlIGxlZnQgb2YgdGhlIC0+IHdpbGwgYWx3YXlzIGJlIHRoZSB0eXBlLCBzdWNoIGFzIGEgXG5cdCAqIHBhZ2Ugb3IgYW4gYXBpIHJvdXRlLiBBbnkgc3RyaW5ncyB0byB0aGUgcmlnaHQgb2YgdGhlIC0+IHdpbGwgYmUgYSBwYXRoLCBldmVuIFxuXHQgKiB3aGVuIGNoYWluaW5nIGFkZHRpb25hbCAtPidzLlxuXHQgKi9cblx0ZGVzdGluYXRpb25zOiBIb3RUZXN0RGVzdGluYXRpb25bXSB8IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3REZXN0aW5hdGlvbjsgfTtcblx0LyoqXG5cdCAqIFRoZSBvcmRlciBpbiB3aGljaCBkZXN0aW5hdGlvbnMgYXJlIHN1cHBvc2VkIHRvIGV4ZWN1dGUuIFRoaXMgaXMgXG5cdCAqIGlnbm9yZWQgaWYgdGhlIGRlc3RpbmF0aW9ucyBhcmUgYW4gYXJyYXkuXG5cdCAqL1xuXHRkZXN0aW5hdGlvbk9yZGVyOiBzdHJpbmdbXTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0IHBhZ2VzIHRvIGV4ZWN1dGUuXG5cdCAqL1xuXHRwYWdlczoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IEhvdFRlc3RQYWdlXG5cdFx0fTtcblxuXHRjb25zdHJ1Y3RvciAoZGVzdGluYXRpb25zOiBzdHJpbmdbXSB8IEhvdFRlc3REZXN0aW5hdGlvbltdIHwgeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgSG90VGVzdERlc3RpbmF0aW9uOyB9ID0gW10sIFxuXHRcdHBhZ2VzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGFnZSB9ID0ge30sIGRlc3RpbmF0aW9uT3JkZXI6IHN0cmluZ1tdID0gW10pXG5cdHtcblx0XHQvLyBHbyB0aHJvdWdoIGFuZCBjb252ZXJ0IGFueSBzdHJpbmdzIGludG8gSG90VGVzdERlc3RpbmF0aW9ucy5cblx0XHRpZiAoZGVzdGluYXRpb25zIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMgPSBbXTtcblxuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBkZXN0aW5hdGlvbnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBkZXN0ID0gZGVzdGluYXRpb25zW2lJZHhdO1xuXG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb25zLnB1c2ggKG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKGRlc3QpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuZGVzdGluYXRpb25zID0ge307XG5cblx0XHRcdGZvciAobGV0IGtleSBpbiBkZXN0aW5hdGlvbnMpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBkZXN0ID0gZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0dGhpcy5kZXN0aW5hdGlvbnNba2V5XSA9IG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKGRlc3QpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuZGVzdGluYXRpb25PcmRlciA9IGRlc3RpbmF0aW9uT3JkZXI7XG5cdFx0dGhpcy5wYWdlcyA9IHBhZ2VzO1xuXHR9XG59IiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBUZXN0Q2FzZU9iamVjdCB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90VGVzdE1hcCwgSG90VGVzdFBhdGggfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5pbXBvcnQgeyBIb3RUZXN0RGVzdGluYXRpb24gfSBmcm9tIFwiLi9Ib3RUZXN0RGVzdGluYXRpb25cIjtcbmltcG9ydCB7IEhvdFRlc3RQYWdlIH0gZnJvbSBcIi4vSG90VGVzdFBhZ2VcIjtcbmltcG9ydCB7IEhvdERlc3RpbmF0aW9uIH0gZnJvbSBcIi4vSG90RGVzdGluYXRpb25cIjtcbmltcG9ydCB7IEhvdFRlc3RTdG9wIH0gZnJvbSBcIi4vSG90VGVzdFN0b3BcIjtcbmltcG9ydCB7IEhvdFRlc3RTZWxlbml1bURyaXZlciB9IGZyb20gXCIuL0hvdFRlc3RTZWxlbml1bURyaXZlclwiO1xuXG4vKipcbiAqIEV4ZWN1dGVzIHRlc3RzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSG90VGVzdGVyXG57XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdGltZW91dCBmb3IgZWFjaCB0ZXN0LlxuXHQgKi9cblx0dGltZW91dDogbnVtYmVyO1xuXHQvKipcblx0ICogVGhlIGJhc2UgdXJsIHRoYXQgd2lsbCBjb25zdHJ1Y3QgZnV0dXJlIHVybHMuXG5cdCAqL1xuXHRiYXNlVXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBwcm9jZXNzb3IuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBtYXBzIHRvIHRlc3QuXG5cdCAqL1xuXHR0ZXN0TWFwczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdE1hcDsgfTtcblx0LyoqXG5cdCAqIFRoZSBkcml2ZXIgdG8gdXNlIHdoZW4gcnVubmluZyB0ZXN0cy5cblx0ICovXG5cdGRyaXZlcjogSG90VGVzdERyaXZlcjtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIHRlc3RlciBmaW5pc2hlZCBsb2FkaW5nP1xuXHQgKi9cblx0ZmluaXNoZWRMb2FkaW5nOiBib29sZWFuO1xuXHQvKipcblx0ICogSGFzIHRoaXMgdGVzdGVyIGZpbmlzaGVkIHNldHRpbmcgdXA/XG5cdCAqL1xuXHRoYXNCZWVuU2V0dXA6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyB0ZXN0ZXIgYmVlbiBkZXN0cm95ZWQ/XG5cdCAqL1xuXHRoYXNCZWVuRGVzdHJveWVkOiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgcGFnZSBjdXJyZW50bHkgZXhlY3V0aW5nLlxuXHQgKi9cblx0Y3VycmVudFBhZ2U6IEhvdFRlc3RQYWdlO1xuXHQvKipcblx0ICogVGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IGhhdmUgZmFpbGVkLlxuXHQgKi9cblx0bnVtRmFpbHVyZXM6IG51bWJlcjtcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxLCBuYW1lOiBzdHJpbmcsIGJhc2VVcmw6IHN0cmluZywgXG5cdFx0ZHJpdmVyOiBIb3RUZXN0RHJpdmVyLCB0ZXN0TWFwczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdE1hcDsgfSA9IHt9KVxuXHR7XG5cdFx0aWYgKHRlc3RNYXBzID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUaGUgdGVzdE1hcHMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbXB0eSBvYmplY3QsIGJ1dCBjYW5ub3QgYmUgbnVsbCEgSXQgaXMgc2V0IHRvIG51bGwuYCk7XG5cblx0XHR0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3Nvcjtcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSAxMDAwMDtcblx0XHR0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuXHRcdHRoaXMudGVzdE1hcHMgPSB0ZXN0TWFwcztcblx0XHR0aGlzLmRyaXZlciA9IGRyaXZlcjtcblx0XHR0aGlzLmZpbmlzaGVkTG9hZGluZyA9IGZhbHNlO1xuXHRcdHRoaXMuaGFzQmVlblNldHVwID0gZmFsc2U7XG5cdFx0dGhpcy5oYXNCZWVuRGVzdHJveWVkID0gZmFsc2U7XG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IG51bGw7XG5cdFx0dGhpcy5udW1GYWlsdXJlcyA9IDA7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBzZXR0aW5nIHVwIHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRhc3luYyBzZXR1cCAoaXNXZWJSb3V0ZTogYm9vbGVhbiwgdXJsOiBzdHJpbmcsIGRlc3RpbmF0aW9uS2V5Pzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBkZXN0cm95aW5nIHVwIHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRhc3luYyBkZXN0cm95ICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRlc3RzIGFyZSBzdGFydGVkLiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgaXQgd2lsbCBcblx0ICogY29udGludWUgYW5kIGV4ZWN1dGUgYWxsIHRlc3QgcGF0aHMuIElmIHRoaXMgcmV0dXJucyBpdCB3aWxsIFxuXHQgKiBza2lwIGFsbCB0ZXN0IHBhdGhzIGFuZCBleGVjdXRlIG9uVGVzdEVuZCBpbnN0ZWFkLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0U3RhcnQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHVybDogc3RyaW5nLCBkZXN0aW5hdGlvbktleT86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIGFuIEFQSSB0ZXN0IHBhdGggaGFzIHN0YXJ0ZWQuIElmIHRoaXMgcmV0dXJucyBmYWxzZSwgXG5cdCAqIHRoZSB0ZXN0UGF0aCB3aWxsIG5vdCBiZSBpbW1lZGlhdGVseSBleGVjdXRlZCBhZnRlcndhcmRzLlxuXHQgKi9cblx0YXN5bmMgb25UZXN0QVBJUGF0aFN0YXJ0PyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kLCBcblx0XHR0ZXN0TmFtZTogc3RyaW5nLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhbiBBUEkgdGVzdCBwYXRoIGhhcyBlbmRlZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdEFQSVBhdGhFbmQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIG1ldGhvZDogSG90Um91dGVNZXRob2QsIFxuXHRcdHRlc3ROYW1lOiBzdHJpbmcsIHJlc3VsdDogYW55LCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBwYWdlIHRlc3RzIGFyZSBzdGFydGVkLiBJZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSB0ZXN0UGF0aCB3aWxsIG5vdCBiZSBcblx0ICogaW1tZWRpYXRlbHkgZXhlY3V0ZWQgYWZ0ZXJ3YXJkcy5cblx0ICovXG5cdGFzeW5jIG9uVGVzdFBhZ2VQYXRoU3RhcnQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIFxuXHRcdHN0b3A6IEhvdFRlc3RTdG9wLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhIHBhZ2UgdGVzdCBoYXMgZW5kZWQuXG5cdCAqL1xuXHRhc3luYyBvblRlc3RQYWdlUGF0aEVuZD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgdGVzdFBhdGg6IEhvdFRlc3RQYXRoLCBcblx0XHRyZXN1bHQ6IGFueSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gYSBjb21tYW5kIGlzIGV4ZWN1dGVkLlxuXHQgKi9cblx0YXN5bmMgb25Db21tYW5kPyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBzdG9wOiBIb3RUZXN0U3RvcCwgXG5cdFx0Y21kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjbWRGdW5jOiAoKGNtZEFyZ3M6IHN0cmluZ1tdKSA9PiBQcm9taXNlPHZvaWQ+KSk6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRlc3RzIGFyZSBmaW5pc2hlZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdEVuZD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbik6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhpcyB0ZXN0ZXIgaGFzIGJlZW4gZXhlY3V0ZWQgZnJvbSB0aGUgQVBJLlxuXHQgKi9cblx0YXN5bmMgb25FeGVjdXRlPyAoKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhpcyB0ZXN0ZXIgaGFzIGZpbmlzaGVkIGxvYWRpbmcgYWxsIGRhdGEgZnJvbSB0aGUgQVBJLlxuXHQgKiBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlIG5ld1BhZ2Ugd2lsbCBiZSBhZGRlZCBhcyB0aGUgdGVzdGVyJ3MgY3VycmVudCBcblx0ICogcGFnZSB0aGF0IGlzIGV4ZWN1dGluZy4gSWYgaXQgcmV0dXJucyBmYWxzZSwgbmV3UGFnZSB3aWxsIG5vdCBiZSBzZXQgYXMgdGhlIFxuXHQgKiBjdXJyZW50IHBhZ2UuXG5cdCAqL1xuXHRhc3luYyBvbkZpbmlzaGVkTG9hZGluZz8gKG5ld1BhZ2U6IEhvdFRlc3RQYWdlKTogUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhpcyB0ZXN0ZXIgaGFzIGZpbmlzaGVkIHVubG9hZGluZy5cblx0ICovXG5cdGFzeW5jIG9uRmluaXNoZWRVbmxvYWRpbmc/ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBXYWl0cyBmb3IgdGhlIEFQSSB0byBmaW5pc2ggbG9hZGluZyBhbGwgZGF0YS5cblx0ICovXG5cdGFzeW5jIHdhaXRGb3JEYXRhICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR3aGlsZSAodGhpcy5maW5pc2hlZExvYWRpbmcgPT09IGZhbHNlKVxuXHRcdFx0YXdhaXQgSG90U3RhcS53YWl0ICgxMCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgZGVzdGluYXRpb24gSlNPTiBvYmplY3QgdG8gdXNlLlxuXHQgKi9cblx0c3RhdGljIGludGVycHJldERlc3RpbmF0aW9uIChtYXBOYW1lOiBzdHJpbmcsIHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24pOiBIb3REZXN0aW5hdGlvblxuXHR7XG5cdFx0bGV0IGRlc3RpbmF0aW9uOiBzdHJpbmcgPSB0ZXN0RGVzdC5kZXN0aW5hdGlvbjtcblx0XHRsZXQgbmV3RGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uID0ge1xuXHRcdFx0XHRtYXBOYW1lOiBtYXBOYW1lLFxuXHRcdFx0XHR1cmw6IFwiXCIsXG5cdFx0XHRcdGFwaTogXCJcIixcblx0XHRcdFx0cGF0aHM6IFtdXG5cdFx0XHR9O1xuXHRcdGxldCBzdHJzOiBzdHJpbmdbXSA9IGRlc3RpbmF0aW9uLnNwbGl0ICgvXFwtXFw+L2cpO1xuXHRcdGxldCB0eXBlOiBzdHJpbmcgPSBzdHJzWzBdO1xuXG5cdFx0aWYgKHR5cGUubGVuZ3RoIDwgMilcblx0XHRcdHJldHVybiAobnVsbCk7XG5cblx0XHRpZiAoKHR5cGVbMF0gPT09IFwiL1wiKSAmJiAodHlwZVsxXSA9PT0gXCIvXCIpKVxuXHRcdFx0cmV0dXJuIChudWxsKTtcblxuXHRcdGxldCBnZXRUeXBlOiAodHlwZVN0cjogc3RyaW5nLCB0eXBlRGVsaW1pdGVyOiBzdHJpbmcpID0+IHN0cmluZyA9IFxuXHRcdFx0KHR5cGVTdHI6IHN0cmluZywgdHlwZURlbGltaXRlcjogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHR7XG5cdFx0XHRcdGxldCBwb3M6IG51bWJlciA9IHR5cGVTdHIuaW5kZXhPZiAodHlwZURlbGltaXRlcik7XG5cdFx0XHRcdGxldCB0eXBlVmFsdWU6IHN0cmluZyA9IFwiXCI7XG5cdFx0XG5cdFx0XHRcdGlmIChwb3MgPiAtMSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHR5cGVWYWx1ZSA9IHR5cGVTdHIuc3Vic3RyIChwb3MgKyB0eXBlRGVsaW1pdGVyLmxlbmd0aCk7XG5cdFx0XHRcdFx0dHlwZVZhbHVlID0gdHlwZVZhbHVlLnRyaW0gKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gKHR5cGVWYWx1ZSk7XG5cdFx0XHR9O1xuXG5cdFx0bmV3RGVzdGluYXRpb24udXJsID0gZ2V0VHlwZSAodHlwZSwgXCJ1cmw6XCIpO1xuXHRcdG5ld0Rlc3RpbmF0aW9uLmFwaSA9IGdldFR5cGUgKHR5cGUsIFwiYXBpOlwiKTtcblxuXHRcdGZvciAobGV0IGlJZHggPSAxOyBpSWR4IDwgc3Rycy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgbmV3UGF0aFN0cjogc3RyaW5nID0gc3Ryc1tpSWR4XTtcblx0XHRcdGxldCBuZXdQYXRoOiBIb3RUZXN0U3RvcCA9IHtcblx0XHRcdFx0XHRjbWQ6IFwiXCIsXG5cdFx0XHRcdFx0ZGVzdDogXCJcIixcblx0XHRcdFx0XHRwYXRoOiBcIlwiXG5cdFx0XHRcdH07XG5cblx0XHRcdG5ld1BhdGhTdHIgPSBuZXdQYXRoU3RyLnRyaW0gKCk7XG5cdFx0XHRuZXdQYXRoLmRlc3QgPSBnZXRUeXBlIChuZXdQYXRoU3RyLCBcImRlc3Q6XCIpO1xuXHRcdFx0bmV3UGF0aC5jbWQgPSBnZXRUeXBlIChuZXdQYXRoU3RyLCBcImNtZDpcIik7XG5cdFx0XHRuZXdQYXRoLnBhdGggPSBnZXRUeXBlIChuZXdQYXRoU3RyLCBcInBhdGg6XCIpO1xuXG5cdFx0XHRpZiAoKG5ld1BhdGguZGVzdCA9PSBcIlwiKSAmJiAobmV3UGF0aC5jbWQgPT0gXCJcIikgJiYgKG5ld1BhdGgucGF0aCA9PSBcIlwiKSlcblx0XHRcdFx0bmV3UGF0aC5wYXRoID0gbmV3UGF0aFN0cjtcblxuXHRcdFx0bmV3RGVzdGluYXRpb24ucGF0aHMucHVzaCAobmV3UGF0aCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChuZXdEZXN0aW5hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbiBBUEkncyB0ZXN0IHBhdGguXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdEFQSVBhdGggKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCwgXG5cdFx0dGVzdE5hbWU6IHN0cmluZywgc2tpcEV2ZW50Q2FsbHM6IGJvb2xlYW4gPSBmYWxzZSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJ1blRlc3RQYXRoOiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdGlmIChtZXRob2QgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRyeWluZyB0byBhY2Nlc3MgbnVsbCBtZXRob2Qgb24gZGVzdGluYXRpb24gbWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX0uYCk7XG5cblx0XHQvLyBBIGR1bWIgaGFjayB0byBwcmV2ZW50IGFueSByZWN1cnNpb24gdGhhdCBjb3VsZCBvY2N1ci5cblx0XHRpZiAoc2tpcEV2ZW50Q2FsbHMgPT09IGZhbHNlKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLm9uVGVzdEFQSVBhdGhTdGFydCAhPSBudWxsKVxuXHRcdFx0XHRydW5UZXN0UGF0aCA9IGF3YWl0IHRoaXMub25UZXN0QVBJUGF0aFN0YXJ0IChkZXN0aW5hdGlvbiwgbWV0aG9kLCB0ZXN0TmFtZSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cblx0XHRpZiAocnVuVGVzdFBhdGggPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0bGV0IHRlc3RDYXNlT2JqZWN0OiBUZXN0Q2FzZU9iamVjdCA9IG1ldGhvZC50ZXN0Q2FzZXNbdGVzdE5hbWVdO1xuXG5cdFx0XHRpZiAodGVzdENhc2VPYmplY3QgPT0gbnVsbClcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBUZXN0IGNhc2Ugb2JqZWN0ICR7dGVzdE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0XHRyZXN1bHQgPSBhd2FpdCB0ZXN0Q2FzZU9iamVjdC5mdW5jICh0aGlzLmRyaXZlcik7XG5cdFx0fVxuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RBUElQYXRoRW5kICE9IG51bGwpXG5cdFx0XHRcdGF3YWl0IHRoaXMub25UZXN0QVBJUGF0aEVuZCAoZGVzdGluYXRpb24sIG1ldGhvZCwgdGVzdE5hbWUsIHJlc3VsdCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFsbCB0ZXN0IHBhdGhzIGluIGFuIEFQSSByb3V0ZS5cblx0ICogXG5cdCAqIEBmaXhtZSBUaGlzIG5lZWRzIGEgYmV0dGVyIGltcGxlbWVudGF0aW9uLi4uXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdEFQSVBhdGhzIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24pOiBQcm9taXNlPGFueVtdPlxuXHR7XG5cdFx0bGV0IHJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSB0aGlzLnRlc3RNYXBzW2Rlc3RpbmF0aW9uLm1hcE5hbWVdO1xuXG5cdFx0aWYgKHRlc3RNYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQVBJIE1hcCAke2Rlc3RpbmF0aW9uLm1hcE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0aWYgKHRoaXMucHJvY2Vzc29yLmFwaSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBBc3NvY2lhdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBoYXZlIGFuIEFQSSFgKTtcblxuXHRcdGxldCByb3V0ZTogSG90Um91dGUgPSB0aGlzLnByb2Nlc3Nvci5hcGkucm91dGVzW2Rlc3RpbmF0aW9uLmFwaV07XG5cblx0XHRpZiAocm91dGUgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQVBJIGRvZXMgbm90IGhhdmUgcm91dGUgJHtkZXN0aW5hdGlvbi5hcGl9IWApO1xuXG5cdFx0Ly8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcGF0aCBpbiB0aGUgZGVzdGluYXRpb24gdW50aWwgY29tcGxldGUuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBkZXN0aW5hdGlvbi5wYXRocy5sZW5ndGg7IGlJZHggKz0gMilcblx0XHR7XG5cdFx0XHRsZXQgc3RvcDogSG90VGVzdFN0b3AgPSBkZXN0aW5hdGlvbi5wYXRoc1tpSWR4XTtcblx0XHRcdGxldCBwYXRoTmFtZTogc3RyaW5nID0gc3RvcC5wYXRoO1xuXHRcdFx0bGV0IG1ldGhvZDogSG90Um91dGVNZXRob2QgPSByb3V0ZS5nZXRNZXRob2QgKHBhdGhOYW1lKTtcblx0XHRcdGxldCBuZXh0U3RvcDogSG90VGVzdFN0b3AgPSBkZXN0aW5hdGlvbi5wYXRoc1tpSWR4ICsgMV07XG5cdFx0XHRsZXQgdGVzdE5hbWU6IHN0cmluZyA9IG5leHRTdG9wLnBhdGg7XG5cblx0XHRcdGlmIChtZXRob2QgPT0gbnVsbClcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgbWV0aG9kIHJlbGF0ZWQgdG8gcGF0aCAke3BhdGhOYW1lfSBpbiBtYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfWApO1xuXG5cdFx0XHRsZXQgcmVzdWx0OiBhbnkgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0QVBJUGF0aCAoZGVzdGluYXRpb24sIG1ldGhvZCwgdGVzdE5hbWUpO1xuXG5cdFx0XHRyZXN1bHRzLnB1c2ggKHJlc3VsdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChyZXN1bHRzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGEgdGVzdCBwYWdlIHBhdGguXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdFBhZ2VQYXRoIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHN0b3A6IEhvdFRlc3RTdG9wLCBcblx0XHRza2lwRXZlbnRDYWxsczogYm9vbGVhbiA9IGZhbHNlLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRhd2FpdCB0aGlzLndhaXRGb3JEYXRhICgpO1xuXG5cdFx0bGV0IHJ1blRlc3RQYXRoOiBib29sZWFuID0gdHJ1ZTtcblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV07XG5cblx0XHQvLy8gQGZpeG1lIEZvciBzb21lIHJlYXNvbiB0aGUgZXJyb3JzIGJlaW5nIHRocm93biBoZXJlIGFyZSBub3QgYmVpbmcgdGhyb3duLlxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFdlYiBNYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGxldCBwYWdlOiBIb3RUZXN0UGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG5cblx0XHRpZiAocGFnZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBBIGN1cnJlbnQgcGFnZSB3YXMgbm90IHNldCFgKTtcblxuXHRcdHRoaXMuZHJpdmVyLnBhZ2UgPSBwYWdlO1xuXG5cdFx0bGV0IHRlc3RQYXRoTmFtZTogc3RyaW5nID0gc3RvcC5wYXRoO1xuXHRcdGxldCB0ZXN0UGF0aDogSG90VGVzdFBhdGggPSBwYWdlLnRlc3RQYXRoc1t0ZXN0UGF0aE5hbWVdO1xuXG5cdFx0Ly8gQSBkdW1iIGhhY2sgdG8gcHJldmVudCBhbnkgcmVjdXJzaW9uIHRoYXQgY291bGQgb2NjdXIuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RQYWdlUGF0aFN0YXJ0ICE9IG51bGwpXG5cdFx0XHRcdHJ1blRlc3RQYXRoID0gYXdhaXQgdGhpcy5vblRlc3RQYWdlUGF0aFN0YXJ0IChkZXN0aW5hdGlvbiwgc3RvcCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cblx0XHRpZiAocnVuVGVzdFBhdGggPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0aWYgKHRlc3RQYXRoID09IG51bGwpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogVGVzdCBwYXRoICR7dGVzdFBhdGhOYW1lfSBkb2VzIG5vdCBoYXZlIGEgZnVuY3Rpb24hYCk7XG5cblx0XHRcdHJlc3VsdCA9IGF3YWl0IHRlc3RQYXRoICh0aGlzLmRyaXZlcik7XG5cdFx0fVxuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RQYWdlUGF0aEVuZCAhPSBudWxsKVxuXHRcdFx0XHRhd2FpdCB0aGlzLm9uVGVzdFBhZ2VQYXRoRW5kIChkZXN0aW5hdGlvbiwgdGVzdFBhdGgsIHJlc3VsdCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdGlmIChydW5UZXN0UGF0aCA9PT0gdHJ1ZSlcblx0XHRcdGF3YWl0IEhvdFN0YXEud2FpdCAodGhpcy5kcml2ZXIucGFnZVRlc3REZWxheSk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIGNvbW1hbmQuIEV4YW1wbGU6XG5cdCAqIHBhZ2U6RGFzaGJvYXJkIC0+IGNtZDpjbGljayhidXR0b24pXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQ29tbWFuZCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBzdG9wOiBIb3RUZXN0U3RvcCwgY21kOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHQvKipcblx0XHQgKiBDaGVjayBpZiB0aGUgaW5wdXQgY29tbWFuZCBtYXRjaGVzLlxuXHRcdCAqL1xuXHRcdGxldCBoYXNDbWQ6IChpbnB1dDogc3RyaW5nLCBjbWQ6IHN0cmluZywgaGFzQXJndW1lbnRzOiBib29sZWFuKSA9PiBib29sZWFuID0gXG5cdFx0XHQoaW5wdXQ6IHN0cmluZywgY21kOiBzdHJpbmcsIGhhc0FyZ3VtZW50czogYm9vbGVhbik6IGJvb2xlYW4gPT5cblx0XHRcdHtcblx0XHRcdFx0bGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdFx0XHRcdGlmIChzdG9wLmNtZCA9PT0gY21kKVxuXHRcdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cblx0XHRcdFx0Y29uc3QgcG9zOiBudW1iZXIgPSBzdG9wLmNtZC5pbmRleE9mIChcIihcIik7XG5cblx0XHRcdFx0Ly8gSWYgdGhlcmUncyBwYXJlbnRoZXNpcywgZ2V0IHRoZSBpbmNvbWluZyBjb21tYW5kLlxuXHRcdFx0XHRpZiAocG9zID4gLTEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgaW5wdXRDbWQ6IHN0cmluZyA9IHN0b3AuY21kLnN1YnN0ciAoMCwgcG9zKTtcblxuXHRcdFx0XHRcdGlmIChpbnB1dENtZCA9PT0gY21kKVxuXHRcdFx0XHRcdFx0cmVzdWx0ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAocmVzdWx0KTtcblx0XHRcdH07XG5cdFx0LyoqXG5cdFx0ICogR2V0IHRoZSBhcmd1bWVudHMgaW4gYSBjb21tYW5kLlxuXHRcdCAqL1xuXHRcdGxldCBnZXRDbWRBcmdzOiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nW10gPSBcblx0XHRcdChpbnB1dDogc3RyaW5nKTogc3RyaW5nW10gPT5cblx0XHRcdHtcblx0XHRcdFx0bGV0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goL1xcKChbXildKylcXCkvKTtcbiAgICBcblx0XHRcdFx0aWYgKCFtYXRjaClcblx0XHRcdFx0XHRyZXR1cm4gKFtdKTtcblxuXHRcdFx0XHRyZXN1bHRzID0gbWF0Y2hbMV0uc3BsaXQoJywnKS5tYXAoYXJnID0+IGFyZy50cmltKCkpO1xuXG5cdFx0XHRcdHJldHVybiAocmVzdWx0cyk7XG5cdFx0XHR9O1xuXG5cdFx0bGV0IGNtZEZ1bmM6ICgoY21kQXJnczogc3RyaW5nW10pID0+IFByb21pc2U8dm9pZD4pID0gbnVsbDtcblx0XHRsZXQgYXJnczogc3RyaW5nW10gPSBbXTtcblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcInVybFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0OiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGlmICh0aGlzLmRyaXZlcltcIndhaXRGb3JUZXN0RWxlbWVudFwiXSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEcml2ZXIgJHt0aGlzLmRyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IHdhaXRGb3JUZXN0RWxlbWVudCFgKTtcblxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci5uYXZpZ2F0ZVRvVXJsIChpbnB1dCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwid2FpdEZvclRlc3RPYmplY3RcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCB0ZXN0T2JqZWN0OiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGlmICh0aGlzLmRyaXZlcltcIndhaXRGb3JUZXN0RWxlbWVudFwiXSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEcml2ZXIgJHt0aGlzLmRyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IHdhaXRGb3JUZXN0RWxlbWVudCFgKTtcblxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci53YWl0Rm9yVGVzdEVsZW1lbnQgKHRlc3RPYmplY3QpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcIndhaXRGb3JUZXN0ZXJBUElEYXRhXCIsIGZhbHNlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5maW5pc2hlZExvYWRpbmcgPSBmYWxzZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLndhaXRGb3JEYXRhICgpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcIndhaXRcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBudW1NaWxsaXNlY29uZHM6IG51bWJlciA9IHBhcnNlSW50IChjbWRBcmdzWzBdKTtcblxuXHRcdFx0XHRcdGF3YWl0IEhvdFN0YXEud2FpdCAobnVtTWlsbGlzZWNvbmRzKTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJwcmludFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0OiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kcml2ZXIucHJpbnQgKGlucHV0KTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJwcmludGxuXCIsIHRydWUpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgaW5wdXQ6IHN0cmluZyA9IGNtZEFyZ3NbMF07XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci5wcmludGxuIChpbnB1dCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwiY2xpY2tcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBlbG1OYW1lOiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGlmICh0aGlzLmRyaXZlcltcIndhaXRGb3JUZXN0RWxlbWVudFwiXSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEcml2ZXIgJHt0aGlzLmRyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IHdhaXRGb3JUZXN0RWxlbWVudCFgKTtcblxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRjb25zdCBlbG0gPSBhd2FpdCB0aGlzLmRyaXZlci53YWl0Rm9yVGVzdEVsZW1lbnQgKGVsbU5hbWUpO1xuXHRcdFx0XHRcdGF3YWl0IGVsbS5jbGljayAoKTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJzZW5kS2V5c1wiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGVsbU5hbWU6IHN0cmluZyA9IGNtZEFyZ3NbMF07XG5cdFx0XHRcdFx0bGV0IGlucHV0OiBzdHJpbmcgPSBjbWRBcmdzWzFdO1xuXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGlmICh0aGlzLmRyaXZlcltcIndhaXRGb3JUZXN0RWxlbWVudFwiXSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEcml2ZXIgJHt0aGlzLmRyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IHdhaXRGb3JUZXN0RWxlbWVudCFgKTtcblxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRjb25zdCBlbG0gPSBhd2FpdCB0aGlzLmRyaXZlci53YWl0Rm9yVGVzdEVsZW1lbnQgKGVsbU5hbWUpO1xuXHRcdFx0XHRcdGF3YWl0IGVsbS5zZW5kS2V5cyAoaW5wdXQpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcImNsZWFyXCIsIHRydWUpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgZWxtTmFtZTogc3RyaW5nID0gY21kQXJnc1swXTtcblxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRpZiAodGhpcy5kcml2ZXJbXCJ3YWl0Rm9yVGVzdEVsZW1lbnRcIl0gPT0gbnVsbClcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogRHJpdmVyICR7dGhpcy5kcml2ZXIuY29uc3RydWN0b3IubmFtZX0gZG9lcyBub3Qgc3VwcG9ydCB3YWl0Rm9yVGVzdEVsZW1lbnQhYCk7XG5cblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0Y29uc3QgZWxtID0gYXdhaXQgdGhpcy5kcml2ZXIud2FpdEZvclRlc3RFbGVtZW50IChlbG1OYW1lKTtcblx0XHRcdFx0XHRhd2FpdCBlbG0uY2xlYXIgKCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwiZGVidWdnZXJcIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIEtlZXAgdGhpcy4gVGhpcyBpcyBjb3JyZWN0LlxuXHRcdFx0XHRcdGRlYnVnZ2VyO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChjbWRGdW5jID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IENvbW1hbmQgJHtzdG9wLmNtZH0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRhd2FpdCB0aGlzLm9uQ29tbWFuZCAoZGVzdGluYXRpb24sIHN0b3AsIGNtZCwgYXJncywgY21kRnVuYyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbGwgdGVzdCBwYXRocyBpbiBhIHBhZ2UuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdFBhZ2VQYXRocyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxhbnlbXT5cblx0e1xuXHRcdGxldCByZXN1bHRzOiBhbnlbXSA9IFtdO1xuXHRcdGxldCB0ZXN0TWFwOiBIb3RUZXN0TWFwID0gdGhpcy50ZXN0TWFwc1tkZXN0aW5hdGlvbi5tYXBOYW1lXTtcblxuXHRcdC8vLyBAZml4bWUgRm9yIHNvbWUgcmVhc29uIHRoZSBlcnJvcnMgYmVpbmcgdGhyb3duIGhlcmUgYXJlIG5vdCBiZWluZyB0aHJvd24uXG5cdFx0aWYgKHRlc3RNYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogV2ViIE1hcCAke2Rlc3RpbmF0aW9uLm1hcE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0Ly8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcGF0aCBpbiB0aGUgZGVzdGluYXRpb24gdW50aWwgY29tcGxldGUuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBkZXN0aW5hdGlvbi5wYXRocy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgc3RvcDogSG90VGVzdFN0b3AgPSBkZXN0aW5hdGlvbi5wYXRoc1tpSWR4XTtcblx0XHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cblx0XHRcdGlmIChzdG9wLmRlc3QgIT09IFwiXCIpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0ZXN0TWFwLmRlc3RpbmF0aW9ucyBpbnN0YW5jZW9mIEFycmF5KVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogV2hlbiB1c2luZyB0eXBlICdkZXN0JyBpbiBhIGRlc3RpbmF0aW9uIHN0cmluZywgYWxsIGRlc3RpbmF0aW9ucyBpbiBtYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBtdXN0IGJlIG5hbWVkLmApO1xuXG5cdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gdGVzdE1hcC5kZXN0aW5hdGlvbnNbc3RvcC5kZXN0XTtcblx0XHRcdFx0bGV0IG5ld0Rlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiA9IEhvdFRlc3Rlci5pbnRlcnByZXREZXN0aW5hdGlvbiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9uLm1hcE5hbWUsIHRlc3REZXN0KTtcblxuXHRcdFx0XHRpZiAobmV3RGVzdGluYXRpb24gIT0gbnVsbClcblx0XHRcdFx0XHRyZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUZXN0UGFnZVBhdGhzIChuZXdEZXN0aW5hdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdG9wLmNtZCAhPT0gXCJcIilcblx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlQ29tbWFuZCAoZGVzdGluYXRpb24sIHN0b3AsIHN0b3AuY21kKTtcblxuXHRcdFx0aWYgKHN0b3AucGF0aCAhPT0gXCJcIilcblx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRoIChkZXN0aW5hdGlvbiwgc3RvcCwgZmFsc2UsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblxuXHRcdFx0cmVzdWx0cy5wdXNoIChyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0cyk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0aGUgdGVzdHMuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlIChtYXBOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgbWFwOiBIb3RUZXN0TWFwID0gdGhpcy50ZXN0TWFwc1ttYXBOYW1lXTtcblxuXHRcdGlmIChtYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogTWFwICR7bWFwTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHR0aGlzLnByb2Nlc3Nvci5sb2dnZXIudmVyYm9zZSAoYEhvdFRlc3RlcjogRXhlY3V0aW5nIG1hcCAke21hcE5hbWV9Li4uYCk7XG5cblx0XHQvLyBQcm9jZXNzIHJvdXRlcyB0ZXN0aW5nIGZpcnN0LlxuXHRcdGxldCByb3V0ZUtleTogc3RyaW5nID0gdGhpcy5wcm9jZXNzb3IuZ2V0Um91dGVLZXlGcm9tTmFtZSAobWFwTmFtZSk7XG5cblx0XHRsZXQgZXhlY3V0ZURlc3RpbmF0aW9uOiAodGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbiwgZGVzdGluYXRpb25LZXk/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4gPSBcblx0XHRcdGFzeW5jICh0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uLCBkZXN0aW5hdGlvbktleTogc3RyaW5nID0gXCJcIikgPT5cblx0XHRcdHtcblx0XHRcdFx0aWYgKHRlc3REZXN0LmF1dG9TdGFydCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5wcm9jZXNzb3IubG9nZ2VyLnZlcmJvc2UgKCgpID0+IGBIb3RUZXN0ZXI6IEV4ZWN1dGluZyAke21hcE5hbWV9IGRlc3RpbmF0aW9uICR7SlNPTi5zdHJpbmdpZnkgKHRlc3REZXN0KX0uLi5gKTtcblx0XHRcdFx0XHRsZXQgZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uID0gSG90VGVzdGVyLmludGVycHJldERlc3RpbmF0aW9uIChtYXBOYW1lLCB0ZXN0RGVzdCk7XG5cdFx0XHRcdFx0bGV0IGlzV2ViUm91dGU6IGJvb2xlYW4gPSBmYWxzZTtcblx0XHRcdFx0XHRsZXQgcnVuVGVzdFBhdGhzOiBib29sZWFuID0gdHJ1ZTtcblx0XHRcdFx0XHRsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJhc2VVcmw7XG5cblx0XHRcdFx0XHRpZiAoZGVzdGluYXRpb24udXJsICE9PSBcIlwiKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlzV2ViUm91dGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0dXJsICs9IGRlc3RpbmF0aW9uLnVybDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodGhpcy5zZXR1cCAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhc0JlZW5TZXR1cCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuc2V0dXAgKGlzV2ViUm91dGUsIHVybCwgZGVzdGluYXRpb25LZXkpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmhhc0JlZW5TZXR1cCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0XHRpZiAodGhpcy5vblRlc3RTdGFydCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0cnVuVGVzdFBhdGhzID0gYXdhaXQgdGhpcy5vblRlc3RTdGFydCAoZGVzdGluYXRpb24sIHVybCwgZGVzdGluYXRpb25LZXkpO1xuXHRcdFxuXHRcdFx0XHRcdGlmIChydW5UZXN0UGF0aHMgPT09IHRydWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGRlc3RpbmF0aW9uLnVybCAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRocyAoZGVzdGluYXRpb24pO1xuXHRcdFxuXHRcdFx0XHRcdFx0aWYgKGRlc3RpbmF0aW9uLmFwaSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdEFQSVBhdGhzIChkZXN0aW5hdGlvbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRcdFx0aWYgKHRoaXMub25UZXN0RW5kICE9IG51bGwpXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLm9uVGVzdEVuZCAoZGVzdGluYXRpb24pO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuZGVzdHJveSAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhc0JlZW5EZXN0cm95ZWQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmRlc3Ryb3kgKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlblNldHVwID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRocm93IGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIG1hcCBkZXN0aW5hdGlvbnMgYXJlIGluIGFuIGFycmF5LCBqdXN0IGV4ZWN1dGUgdGhvc2UgaW4gb3JkZXIuXG5cdFx0aWYgKG1hcC5kZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHR7XG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcC5kZXN0aW5hdGlvbnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1tpSWR4XTtcblxuXHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdC8vIElmIHRoZXJlJ3MgYSBkZXN0aW5hdGlvbiBvcmRlciwgdXNlIHRoYXQuXG5cdFx0XHRpZiAobWFwLmRlc3RpbmF0aW9uT3JkZXIubGVuZ3RoID4gMClcblx0XHRcdHtcblx0XHRcdFx0bGV0IGhhc0V4ZWN1dGVkS2V5czogc3RyaW5nW10gPSBbXTtcblxuXHRcdFx0XHQvLyBHbyB0aHJvdWdoIHRoZSBkZXN0aW5hdGlvbiBvcmRlciBhbmQgZXhlY3V0ZSBlYWNoIG9uZS5cblx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXAuZGVzdGluYXRpb25PcmRlci5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBvcmRlcktleTogc3RyaW5nID0gbWFwLmRlc3RpbmF0aW9uT3JkZXJbaUlkeF07XG5cdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW29yZGVyS2V5XTtcblxuXHRcdFx0XHRcdGlmICh0ZXN0RGVzdCA9PSBudWxsKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBEZXN0aW5hdGlvbiAke29yZGVyS2V5fSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdFx0XHRcdGhhc0V4ZWN1dGVkS2V5cy5wdXNoIChvcmRlcktleSk7XG5cdFx0XHRcdFx0YXdhaXQgZXhlY3V0ZURlc3RpbmF0aW9uICh0ZXN0RGVzdCwgb3JkZXJLZXkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgcmVzdCBvZiB0aGUgZGVzdGluYXRpb25zIHRoYXQgaGF2ZSBub3QgYmVlbiBleGVjdXRlZCB5ZXQuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiBtYXAuZGVzdGluYXRpb25zKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGV4ZWN1dGVEZXN0OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgaGFzRXhlY3V0ZWRLZXlzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBleGVjdXRlZEtleTogc3RyaW5nID0gaGFzRXhlY3V0ZWRLZXlzW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRpZiAoZXhlY3V0ZWRLZXkgPT09IGtleSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0ZXhlY3V0ZURlc3QgPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoZXhlY3V0ZURlc3QgPT09IHRydWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0XHRcdGF3YWl0IGV4ZWN1dGVEZXN0aW5hdGlvbiAodGVzdERlc3QsIGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIGRlc3RpbmF0aW9ucyBpbiBhbnkgb3JkZXIuXG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiBtYXAuZGVzdGluYXRpb25zKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24gPSBtYXAuZGVzdGluYXRpb25zW2tleV07XG5cblx0XHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0LCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgRXZlbnRFeGVjdXRpb25UeXBlLCBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90VGVzdGVyIH0gZnJvbSBcIi4vSG90VGVzdGVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0TWFwLCBIb3RUZXN0UGF0aCB9IGZyb20gXCIuL0hvdFRlc3RNYXBcIjtcbmltcG9ydCB7IEhvdEV2ZW50TWV0aG9kLCBTZXJ2ZXJSZXF1ZXN0IH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdFRlc3RQYWdlIH0gZnJvbSBcIi4vSG90VGVzdFBhZ2VcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5cbmV4cG9ydCBjbGFzcyBIb3RUZXN0ZXJBUEkgZXh0ZW5kcyBIb3RBUElcbntcblx0Y29uc3RydWN0b3IgKGJhc2VVcmw6IHN0cmluZywgY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50ID0gbnVsbCwgZGI6IGFueSA9IG51bGwpXG5cdHtcblx0XHRzdXBlcihiYXNlVXJsLCBjb25uZWN0aW9uLCBkYik7XG5cblx0XHR0aGlzLmV4ZWN1dGVFdmVudHNVc2luZyA9IEV2ZW50RXhlY3V0aW9uVHlwZS5Ib3RBUEk7XG5cblx0XHRsZXQgcm91dGU6IEhvdFJvdXRlID0gbmV3IEhvdFJvdXRlIChjb25uZWN0aW9uLCBcInRlc3RlclwiKTtcblx0XHRyb3V0ZS5hZGRNZXRob2QgKHtcblx0XHRcdFx0XCJuYW1lXCI6IFwicGFnZUxvYWRlZFwiLCBcblx0XHRcdFx0XCJvblNlcnZlckV4ZWN1dGVcIjogdGhpcy5wYWdlTG9hZGVkLFxuXHRcdFx0XHRcInBhcmFtZXRlcnNcIjoge1xuXHRcdFx0XHRcdFx0XCJ0ZXN0ZXJOYW1lXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJzdHJpbmdcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgZXhlY3V0aW5nIHRoZSB0ZXN0LlwiXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XCJ0ZXN0ZXJNYXBcIjoge1xuXHRcdFx0XHRcdFx0XHRcInJlcXVpcmVkXCI6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIHRlc3RlciBtYXAgZXhlY3V0aW5nIHRoZSB0ZXN0LlwiXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XCJwYWdlTmFtZVwiOiB7XG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogXCJUaGUgbmFtZSBvZiB0aGUgcGFnZSBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcInRlc3RFbGVtZW50c1wiOiB7XG5cdFx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwiYXJyYXlcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSB0ZXN0IGVsZW1lbnRzIG9uIHRoZSBwYWdlLlwiXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XCJ0ZXN0UGF0aHNcIjoge1xuXHRcdFx0XHRcdFx0XHRcInJlcXVpcmVkXCI6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFwidHlwZVwiOiBcImFycmF5XCIsXG5cdFx0XHRcdFx0XHRcdFwiZGVzY3JpcHRpb25cIjogXCJUaGUgdGVzdCBwYXRocyBvbiB0aGUgcGFnZS5cIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFwicmV0dXJuc1wiOiBcIlJldHVybnMgdHJ1ZSBhcyBhbiBhY2tub3dsZWRnZW1lbnQuXCJcblx0XHRcdH0pO1xuXHRcdHJvdXRlLmFkZE1ldGhvZCAoe1xuXHRcdFx0XHRcIm5hbWVcIjogXCJwYWdlVW5sb2FkZWRcIiwgXG5cdFx0XHRcdFwib25TZXJ2ZXJFeGVjdXRlXCI6IHRoaXMucGFnZVVubG9hZGVkLFxuXHRcdFx0XHRcInBhcmFtZXRlcnNcIjoge1xuXHRcdFx0XHRcdFx0XCJ0ZXN0ZXJOYW1lXCI6IHtcblx0XHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcInR5cGVcIjogXCJzdHJpbmdcIixcblx0XHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgZXhlY3V0aW5nIHRoZSB0ZXN0LlwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XCJyZXR1cm5zXCI6IFwiUmV0dXJucyB0cnVlIGFzIGFuIGFja25vd2xlZGdlbWVudC5cIlxuXHRcdFx0fSk7XG5cdFx0cm91dGUuYWRkTWV0aG9kICh7XG5cdFx0XHRcdFwibmFtZVwiOiBcImV4ZWN1dGVUZXN0c1wiLFxuXHRcdFx0XHRcIm9uU2VydmVyRXhlY3V0ZVwiOiB0aGlzLmV4ZWN1dGVUZXN0cyxcblx0XHRcdFx0XCJwYXJhbWV0ZXJzXCI6IHtcblx0XHRcdFx0XHRcInRlc3Rlck5hbWVcIjoge1xuXHRcdFx0XHRcdFx0XCJyZXF1aXJlZFwiOiB0cnVlLFxuXHRcdFx0XHRcdFx0XCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0XHRcImRlc2NyaXB0aW9uXCI6IFwiVGhlIG5hbWUgb2YgdGhlIHRlc3RlciBleGVjdXRpbmcgdGhlIHRlc3QuXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFwidGVzdGVyTWFwXCI6IHtcblx0XHRcdFx0XHRcdFwicmVxdWlyZWRcIjogdHJ1ZSxcblx0XHRcdFx0XHRcdFwidHlwZVwiOiBcIm9iamVjdFwiLFxuXHRcdFx0XHRcdFx0XCJkZXNjcmlwdGlvblwiOiBcIlRoZSB0ZXN0ZXIgbWFwIHRvIGV4ZWN1dGUuXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwicmV0dXJuc1wiOiBcIlJldHVybnMgdHJ1ZSB3aGVuIHRlc3RzIGFyZSBjb21wbGV0ZS5cIlxuXHRcdFx0fSk7XG5cdFx0cm91dGUuYWRkTWV0aG9kICh7XG5cdFx0XHRcdFwibmFtZVwiOiBcImhlYXJ0YmVhdFwiLFxuXHRcdFx0XHRcInR5cGVcIjogSG90RXZlbnRNZXRob2QuR0VULFxuXHRcdFx0XHRcIm9uU2VydmVyRXhlY3V0ZVwiOiB0aGlzLmhlYXJ0YmVhdCxcblx0XHRcdFx0XCJyZXR1cm5zXCI6IFwiUmV0dXJucyB0cnVlIGFzIGFuIGFja25vd2xlZGdlbWVudC5cIlxuXHRcdFx0fSk7XG5cdFx0dGhpcy5hZGRSb3V0ZSAocm91dGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHBhZ2UgaGFzIGZpbmlzaGVkIGxvYWRpbmcgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cblx0ICovXG5cdGFzeW5jIHBhZ2VMb2FkZWQgKHJlcXVlc3Q6IFNlcnZlclJlcXVlc3QpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCB0ZXN0ZXJPYmo6IHtcblx0XHRcdFx0dGVzdGVyTmFtZTogc3RyaW5nO1xuXHRcdFx0XHR0ZXN0RWxlbWVudHM6IGFueTtcblx0XHRcdFx0dGVzdFBhdGhzU3RyczogYW55O1xuXHRcdFx0fSA9IHtcblx0XHRcdFx0dGVzdGVyTmFtZTogcmVxdWVzdC5qc29uT2JqW1widGVzdGVyTmFtZVwiXSxcblx0XHRcdFx0dGVzdEVsZW1lbnRzOiByZXF1ZXN0Lmpzb25PYmpbXCJ0ZXN0RWxlbWVudHNcIl0sXG5cdFx0XHRcdHRlc3RQYXRoc1N0cnM6IHJlcXVlc3QuanNvbk9ialtcInRlc3RQYXRoc1wiXVxuXHRcdFx0fTtcblxuXHRcdGZvciAobGV0IGtleSBpbiB0ZXN0ZXJPYmopXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0bGV0IHRlc3RPYmo6IGFueSA9IHRlc3Rlck9ialtrZXldO1xuXHRcdFx0bGV0IHRocm93RXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0aWYgKHRlc3RPYmogPT0gbnVsbClcblx0XHRcdFx0dGhyb3dFcnJvciA9IHRydWU7XG5cblx0XHRcdGlmICgodGVzdGVyT2JqLnRlc3Rlck5hbWUgPT0gXCJcIikgfHwgXG5cdFx0XHRcdCh0ZXN0ZXJPYmoudGVzdEVsZW1lbnRzID09PSBcIlwiKSB8fCBcblx0XHRcdFx0KHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzID09PSBcIlwiKSlcblx0XHRcdHtcblx0XHRcdFx0dGhyb3dFcnJvciA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aHJvd0Vycm9yID09PSB0cnVlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IE9iamVjdCAke2tleX0gd2FzIG5vdCBwYXNzZWQuYCk7XG5cdFx0fVxuXG5cdFx0dGVzdGVyT2JqLnRlc3RFbGVtZW50cyA9IEpTT04ucGFyc2UgKHRlc3Rlck9iai50ZXN0RWxlbWVudHMpO1xuXHRcdHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzID0gSlNPTi5wYXJzZSAodGVzdGVyT2JqLnRlc3RQYXRoc1N0cnMpO1xuXG5cdFx0bGV0IHRlc3RQYXRoczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdFBhdGg7IH0gPSB7fTtcblxuXHRcdGZvciAobGV0IGtleSBpbiB0ZXN0ZXJPYmoudGVzdFBhdGhzU3Rycylcblx0XHR7XG5cdFx0XHRsZXQgdGVzdFBhdGg6IChkcml2ZXI6IEhvdFRlc3REcml2ZXIsIC4uLmFyZ3M6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gXG5cdFx0XHRcdGV2YWwgKHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzW2tleV0pO1xuXG5cdFx0XHR0ZXN0UGF0aHNba2V5XSA9IHRlc3RQYXRoO1xuXHRcdH1cblxuXHRcdGxldCB0ZXN0ZXI6IEhvdFRlc3RlciA9IHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IudGVzdGVyc1t0ZXN0ZXJPYmoudGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IFRlc3RlciAke3Rlc3Rlck9iai50ZXN0ZXJOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGxldCBuZXdQYWdlOiBIb3RUZXN0UGFnZSA9IHtcblx0XHRcdFx0XCJ0ZXN0RWxlbWVudHNcIjogdGVzdGVyT2JqLnRlc3RFbGVtZW50cyxcblx0XHRcdFx0XCJ0ZXN0UGF0aHNcIjogdGVzdFBhdGhzXG5cdFx0XHR9O1xuXG5cdFx0dGVzdGVyLmZpbmlzaGVkTG9hZGluZyA9IHRydWU7XG5cblx0XHRsZXQgc2V0QXNDdXJyZW50OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdGlmICh0ZXN0ZXIub25GaW5pc2hlZExvYWRpbmcgIT0gbnVsbClcblx0XHRcdHNldEFzQ3VycmVudCA9IGF3YWl0IHRlc3Rlci5vbkZpbmlzaGVkTG9hZGluZyAobmV3UGFnZSk7XG5cblx0XHRpZiAoc2V0QXNDdXJyZW50ID09PSB0cnVlKVxuXHRcdFx0dGVzdGVyLmN1cnJlbnRQYWdlID0gbmV3UGFnZTtcblxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgcGFnZSBoYXMgZmluaXNoZWQgdW5sb2FkaW5nIGluIGRldmVsb3BtZW50IG1vZGUuXG5cdCAqL1xuXHRhc3luYyBwYWdlVW5sb2FkZWQgKHJlcXVlc3Q6IFNlcnZlclJlcXVlc3QpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGNvbnN0IHRlc3Rlck5hbWU6IHN0cmluZyA9IEhvdFN0YXEuZ2V0UGFyYW0gKFwidGVzdGVyTmFtZVwiLCByZXF1ZXN0Lmpzb25PYmopO1xuXG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gdGhpcy5jb25uZWN0aW9uLnByb2Nlc3Nvci50ZXN0ZXJzW3Rlc3Rlck5hbWVdO1xuXG5cdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdGVyQVBJOiBUZXN0ZXIgJHt0ZXN0ZXJOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdHRlc3Rlci5maW5pc2hlZExvYWRpbmcgPSBmYWxzZTtcblx0XHR0ZXN0ZXIuY3VycmVudFBhZ2UgPSBudWxsO1xuXG5cdFx0aWYgKHRlc3Rlci5vbkZpbmlzaGVkVW5sb2FkaW5nICE9IG51bGwpXG5cdFx0XHRhd2FpdCB0ZXN0ZXIub25GaW5pc2hlZFVubG9hZGluZyAoKTtcblxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0aGUgdGVzdHMgZm9yIGEgcGFnZS5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0cyAocmVxOiBTZXJ2ZXJSZXF1ZXN0KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgdGVzdGVyTmFtZTogc3RyaW5nID0gcmVxLmpzb25PYmpbXCJ0ZXN0ZXJOYW1lXCJdO1xuXHRcdGxldCB0ZXN0ZXJNYXA6IHN0cmluZyA9IHJlcS5qc29uT2JqW1widGVzdGVyTWFwXCJdO1xuXG5cdFx0aWYgKCh0ZXN0ZXJOYW1lID09IG51bGwpIHx8ICh0ZXN0ZXJNYXAgPT0gbnVsbCkpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGVzdGVyQVBJOiBOb3QgYWxsIHJlcXVpcmVkIGpzb24gb2JqZWN0cyB3ZXJlIHBhc3NlZC5cIik7XG5cblx0XHRpZiAoKHRlc3Rlck5hbWUgPT09IFwiXCIpIHx8ICh0ZXN0ZXJNYXAgPT09IFwiXCIpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRlc3RlckFQSTogTm90IGFsbCByZXF1aXJlZCBqc29uIG9iamVjdHMgd2VyZSBwYXNzZWQuXCIpO1xuXG5cdFx0bGV0IHNlcnZlcjogSG90U2VydmVyID0gKDxIb3RTZXJ2ZXI+dGhpcy5jb25uZWN0aW9uKTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAoc2VydmVyLmV4ZWN1dGVUZXN0cyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGF3YWl0IHNlcnZlci5leGVjdXRlVGVzdHMgKHRlc3Rlck5hbWUsIHRlc3Rlck1hcCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNwb25kcyB3aXRoIHRydWUgdG8gaGVhcnRiZWF0IHJlcXVlc3RzLlxuXHQgKi9cblx0YXN5bmMgaGVhcnRiZWF0IChyZXE6IFNlcnZlclJlcXVlc3QpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdHJldHVybiAodHJ1ZSk7XG5cdH1cbn0iLCJpbXBvcnQgeyBNYW5hZ2VyT3B0aW9ucywgU29ja2V0LCBTb2NrZXRPcHRpb25zLCBpbyB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tIFwidXVpZFwiO1xuXG4vKipcbiAqIFRoZSBjbGllbnQtc2lkZSB3ZWJzb2NrZXQgY2xpZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgSG90V2ViU29ja2V0Q2xpZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSB3ZWJzb2NrZXQgc2VydmVyLlxuXHQgKi9cblx0dXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29ubmVjdGVkIHNvY2tldC5cblx0ICovXG5cdHNvY2tldDogU29ja2V0O1xuXHQvKipcblx0ICogQW55IGRhdGEgdGhhdCB0aGlzIGNsaWVudCBzb2NrZXQgc2hvdWxkIGNvbnRhaW4uXG5cdCAqL1xuXHRwZXJzaXN0ZW50RGF0YTogYW55O1xuXHQvKipcblx0ICogVGhlIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gYXV0aG9yaXppbmcgYSBjbGllbnQuIENhbiBiZSBhIEpXVCB0b2tlbiwgYXBpIGtleSwgZXRjLlxuXHQgKiBETyBOT1QgU1RPUkUgU0VOU0lUSVZFIElORk9STUFUSU9OIEhFUkUgU1VDSCBBUyBQQVNTV09SRFMuXG5cdCAqL1xuXHRhdXRob3JpemVkVmFsdWU6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGNsaWVudCBjb25uZWN0ZWQuXG5cdCAqL1xuXHRvbkNvbm5lY3Q6ICgpID0+IHZvaWQ7XG5cdC8qKlxuXHQgKiBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBjbGllbnQgaGFzIGFuIGVycm9yIHdoaWxlIGNvbm5lY3RpbmcuIFRoaXMgd2lsbCBcblx0ICogcHJldmVudCBhbiBleGNlcHRpb24gZnJvbSBiZWluZyB0aHJvd24uXG5cdCAqL1xuXHRvbkNvbm5lY3RFcnJvcjogKGVycjogYW55KSA9PiB2b2lkO1xuXHQvKipcblx0ICogVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgY2xpZW50IGhhcyBhbiBlcnJvci4gVGhpcyB3aWxsIFxuXHQgKiBwcmV2ZW50IGFuIGV4Y2VwdGlvbiBmcm9tIGJlaW5nIHRocm93bi5cblx0ICovXG5cdG9uRXJyb3I6IChlcnI6IGFueSkgPT4gdm9pZDtcblx0LyoqXG5cdCAqIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cy5cblx0ICovXG5cdG9uRGlzY29ubmVjdDogKCkgPT4gdm9pZDtcblxuXHRjb25zdHJ1Y3RvciAodXJsOiBzdHJpbmcsIHNvY2tldDogU29ja2V0ID0gbnVsbClcblx0e1xuXHRcdHRoaXMudXJsID0gdXJsO1xuXHRcdHRoaXMuc29ja2V0ID0gc29ja2V0O1xuXHRcdHRoaXMucGVyc2lzdGVudERhdGEgPSB7fTtcblx0XHR0aGlzLmF1dGhvcml6ZWRWYWx1ZSA9IG51bGw7XG5cdFx0dGhpcy5vbkNvbm5lY3RFcnJvciA9IG51bGw7XG5cdFx0dGhpcy5vbkVycm9yID0gbnVsbDtcblx0XHR0aGlzLm9uRGlzY29ubmVjdCA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogVXNlIGFuIGFscmVhZHkgY29ubmVjdGVkIHNvY2tldC5cblx0ICovXG5cdHVzZVNvY2tldCAoc29ja2V0OiBTb2NrZXQpOiB2b2lkXG5cdHtcblx0XHR0aGlzLnNvY2tldCA9IHNvY2tldDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25uZWN0IHRvIHRoZSB3ZWJzb2NrZXQgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgY29ubmVjdCAoYXV0aDogYW55ID0gbnVsbCwgcXVlcnk6IGFueSA9IG51bGwsIG9wdGlvbnM6IFBhcnRpYWw8TWFuYWdlck9wdGlvbnMgJiBTb2NrZXRPcHRpb25zPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBzb2NrZXRPYmo6IFBhcnRpYWw8TWFuYWdlck9wdGlvbnMgJiBTb2NrZXRPcHRpb25zPiB8IHVuZGVmaW5lZCA9IG9wdGlvbnM7XG5cblx0XHRpZiAoYXV0aCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmIChzb2NrZXRPYmogPT0gbnVsbClcblx0XHRcdFx0c29ja2V0T2JqID0ge307XG5cblx0XHRcdHNvY2tldE9iaiA9IHsgLi4uc29ja2V0T2JqLCBhdXRoOiBhdXRoIH07XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5ICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0aWYgKHNvY2tldE9iaiA9PSBudWxsKVxuXHRcdFx0XHRzb2NrZXRPYmogPSB7fTtcblxuXHRcdFx0c29ja2V0T2JqID0geyAuLi5zb2NrZXRPYmosIHF1ZXJ5OiBxdWVyeSB9O1xuXHRcdH1cblxuXHRcdHRoaXMuc29ja2V0ID0gaW8gKHRoaXMudXJsLCBzb2NrZXRPYmopO1xuXG5cdFx0cmV0dXJuIChuZXcgUHJvbWlzZTx2b2lkPiAoKHJlc29sdmUsIHJlamVjdCkgPT5cblx0XHRcdHtcblx0XHRcdFx0dGhpcy5zb2NrZXQub24gKFwiY29ubmVjdFwiLCAoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLm9uQ29ubmVjdCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aGlzLm9uQ29ubmVjdCAoKTtcblxuXHRcdFx0XHRcdFx0cmVzb2x2ZSAoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5zb2NrZXQub24gKFwiY29ubmVjdF9lcnJvclwiLCAoZXJyOiBhbnkpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMub25Db25uZWN0RXJyb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGhpcy5vbkNvbm5lY3RFcnJvciAoZXJyKTtcblxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJlamVjdCAoZXJyKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5zb2NrZXQub24gKFwiZXJyb3JcIiwgKGVycjogYW55KSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLm9uRXJyb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGhpcy5vbkVycm9yIChlcnIpO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmVqZWN0IChlcnIpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLnNvY2tldC5vbiAoXCJkaXNjb25uZWN0XCIsICgpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMub25EaXNjb25uZWN0ICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRoaXMub25EaXNjb25uZWN0ICgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExpc3RlbiBmb3IgYSBjbGllbnQgZXZlbnQuXG5cdCAqL1xuXHRvbiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhOiBhbnksIHV1aWQ/OiBzdHJpbmcpID0+IHZvaWQsIHV1aWQ6IHN0cmluZyA9IG51bGwpOiB2b2lkXG5cdHtcblx0XHR0aGlzLnNvY2tldC5vbiAoZXZlbnQsIGZ1bmN0aW9uICh1dWlkMjogc3RyaW5nLCBkYXRhOiBhbnkpXG5cdFx0e1xuXHRcdFx0aWYgKGRhdGEudXVpZCAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodXVpZDIgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChkYXRhLnV1aWQgPT09IHV1aWQyKVxuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgKGRhdGEuZGF0YSwgZGF0YS51dWlkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0Y2FsbGJhY2sgKGRhdGEuZGF0YSwgZGF0YS51dWlkKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0Y2FsbGJhY2sgKGRhdGEsIHV1aWQyKTtcblx0XHR9LmJpbmQgKHRoaXMsIHV1aWQpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMaXN0ZW4gZm9yIGEgY2xpZW50IGV2ZW50IHdpdGhvdXQgYW55IGludGVydmVudGlvbi4gVGhlIGV2ZW50IHdpbGwgbm90IGhhdmUgYW55IFxuXHQgKiBpbnRlcmFjdGlvbiB3aXRoIHRoZSBldmVudCB1dWlkLlxuXHQgKi9cblx0b25SYXcgKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkKTogdm9pZFxuXHR7XG5cdFx0dGhpcy5zb2NrZXQub24gKGV2ZW50LCBjYWxsYmFjayk7XG5cdH1cblxuXHQvKipcblx0ICogU3RvcCBsaXN0ZW5pbmcgZm9yIGEgY2xpZW50IGV2ZW50LlxuXHQgKi9cblx0b2ZmIChldmVudDogc3RyaW5nKTogdm9pZFxuXHR7XG5cdFx0dGhpcy5zb2NrZXQub2ZmIChldmVudCwgbnVsbCk7XG5cdH1cblxuXHQvKipcblx0ICogTGlzdGVuIGZvciBhIGNsaWVudCBldmVudCBvbmNlLlxuXHQgKi9cblx0b25jZSAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhOiBhbnksIHV1aWQ/OiBzdHJpbmcpID0+IHZvaWQsIHV1aWQ6IHN0cmluZyA9IG51bGwpOiB2b2lkXG5cdHtcblx0XHR0aGlzLnNvY2tldC5vbmNlIChldmVudCwgZnVuY3Rpb24gKHV1aWQyOiBzdHJpbmcsIGRhdGE6IGFueSlcblx0XHR7XG5cdFx0XHRpZiAoZGF0YS51dWlkICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh1dWlkMiAhPSBudWxsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKGRhdGEudXVpZCA9PT0gdXVpZDIpXG5cdFx0XHRcdFx0XHRjYWxsYmFjayAoZGF0YS5kYXRhLCBkYXRhLnV1aWQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRjYWxsYmFjayAoZGF0YS5kYXRhLCBkYXRhLnV1aWQpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRjYWxsYmFjayAoZGF0YSwgdXVpZDIpO1xuXHRcdH0uYmluZCAodGhpcywgdXVpZCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExpc3RlbiBmb3IgYSBjbGllbnQgZXZlbnQgb25jZSB3aXRob3V0IGFueSBpbnRlcnZlbnRpb24uXG5cdCAqL1xuXHRvbmNlUmF3IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWRcblx0e1xuXHRcdHRoaXMuc29ja2V0Lm9uY2UgKGV2ZW50LCBjYWxsYmFjayk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBzb2NrZXQncyBpZC5cblx0ICovXG5cdGdldElkICgpOiBzdHJpbmdcblx0e1xuXHRcdHJldHVybiAodGhpcy5zb2NrZXQuaWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIElzIHRoZSBzb2NrZXQgY29ubmVjdGVkP1xuXHQgKi9cblx0aXNDb25uZWN0ZWQgKCk6IGJvb2xlYW5cblx0e1xuXHRcdGlmICh0aGlzLnNvY2tldCA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0XHRpZiAodGhpcy5zb2NrZXQuY29ubmVjdGVkID09PSBmYWxzZSlcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0cmV0dXJuICh0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZW5kIGFuIGV2ZW50IHRvIHRoZSBjbGllbnQuIFlvdSBjYW4gb3B0aW9uYWxseSByZWNlaXZlIGEgcmVzcG9uc2UgZnJvbSB0aGUgY2xpZW50LlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIHV1aWQgb2YgdGhlIGV2ZW50IHNlbnQuXG5cdCAqL1xuXHRzZW5kIChldmVudDogc3RyaW5nLCBkYXRhOiBhbnksIHV1aWQ6IHN0cmluZyA9IG51bGwpOiBzdHJpbmdcblx0e1xuXHRcdGlmICh0aGlzLnNvY2tldCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQ2xpZW50IHNvY2tldCBpcyBudWxsLiBVbmFibGUgdG8gc2VuZCBldmVudCAke2V2ZW50fWApO1xuXG5cdFx0aWYgKHRoaXMuc29ja2V0LmNvbm5lY3RlZCA9PT0gZmFsc2UpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBDbGllbnQgc29ja2V0IGlzIG5vdCBjb25uZWN0ZWQuIFVuYWJsZSB0byBzZW5kIGV2ZW50ICR7ZXZlbnR9YCk7XG5cblx0XHRpZiAodXVpZCA9PSBudWxsKVxuXHRcdFx0dXVpZCA9IHV1aWR2NCAoKTtcblxuXHRcdHRoaXMuc29ja2V0LmVtaXQgKGV2ZW50LCB7IHV1aWQ6IHV1aWQsIGRhdGE6IGRhdGEgfSk7XG5cblx0XHRyZXR1cm4gKHV1aWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNlbmQgYW4gZXZlbnQgdG8gdGhlIGNsaWVudCwgYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2UuIEV2ZXJ5IHRpbWUgXG5cdCAqIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSB0aGlzIGV2ZW50LCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQuXG5cdCAqL1xuXHRhc3luYyBzZW5kT24gKGV2ZW50OiBzdHJpbmcsIGRhdGE6IGFueSwgY2FsbGJhY2s6IChkYXRhOiBhbnksIHV1aWQ/OiBzdHJpbmcpID0+IHZvaWQsIHV1aWQ6IHN0cmluZyA9IG51bGwpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCByZXN1bHQgPSBhd2FpdCBuZXcgUHJvbWlzZTxhbnk+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodXVpZCA9PSBudWxsKVxuXHRcdFx0XHRcdHV1aWQgPSB1dWlkdjQgKCk7XG5cblx0XHRcdFx0dGhpcy5vbiAoZXZlbnQsIGZ1bmN0aW9uICh1dWlkMjogc3RyaW5nLCBkYXRhOiBhbnkpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgKGRhdGEsIHV1aWQyKTtcblx0XHRcdFx0XHRcdHJlc29sdmUgKGRhdGEpO1xuXHRcdFx0XHRcdH0uYmluZCAodGhpcywgdXVpZCksIHV1aWQpO1xuXHRcdFx0XHR0aGlzLnNlbmQgKGV2ZW50LCBkYXRhLCB1dWlkKTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNlbmQgYW4gZXZlbnQgdG8gdGhlIGNsaWVudCwgYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2Ugb25jZS5cblx0ICovXG5cdGFzeW5jIHNlbmRPbmNlIChldmVudDogc3RyaW5nLCBkYXRhOiBhbnksIHV1aWQ6IHN0cmluZyA9IG51bGwpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCByZXN1bHQgPSBhd2FpdCBuZXcgUHJvbWlzZTxhbnk+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodXVpZCA9PSBudWxsKVxuXHRcdFx0XHRcdHV1aWQgPSB1dWlkdjQgKCk7XG5cblx0XHRcdFx0dGhpcy5vbmNlIChldmVudCwgZnVuY3Rpb24gKHV1aWQyOiBzdHJpbmcsIGRhdGE6IGFueSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXNvbHZlIChkYXRhKTtcblx0XHRcdFx0XHR9LmJpbmQgKHRoaXMsIHV1aWQpLCB1dWlkKTtcblx0XHRcdFx0dGhpcy5zZW5kIChldmVudCwgZGF0YSwgdXVpZCk7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjb25uZWN0IHRoZSBjbGllbnQuXG5cdCAqL1xuXHRkaXNjb25uZWN0IChyZW1vdmVGcm9tU2VydmVyOiBib29sZWFuID0gdHJ1ZSk6IHZvaWRcblx0e1xuXHRcdGlmICh0aGlzLnNvY2tldCA9PSBudWxsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKHRoaXMuc29ja2V0LmNvbm5lY3RlZCA9PT0gZmFsc2UpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLnNvY2tldC5kaXNjb25uZWN0ICgpO1xuXHR9XG59IiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsImV4cG9ydCBkZWZhdWx0IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTsiLCJpbXBvcnQgUkVHRVggZnJvbSAnLi9yZWdleC5qcyc7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlKHV1aWQpIHtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyAmJiBSRUdFWC50ZXN0KHV1aWQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0ZTsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG4vKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cblxudmFyIGJ5dGVUb0hleCA9IFtdO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleC5wdXNoKChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyKSB7XG4gIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIC8vIE5vdGU6IEJlIGNhcmVmdWwgZWRpdGluZyB0aGlzIGNvZGUhICBJdCdzIGJlZW4gdHVuZWQgZm9yIHBlcmZvcm1hbmNlXG4gIC8vIGFuZCB3b3JrcyBpbiB3YXlzIHlvdSBtYXkgbm90IGV4cGVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZC9wdWxsLzQzNFxuICB2YXIgdXVpZCA9IChieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXSkudG9Mb3dlckNhc2UoKTsgLy8gQ29uc2lzdGVuY3kgY2hlY2sgZm9yIHZhbGlkIFVVSUQuICBJZiB0aGlzIHRocm93cywgaXQncyBsaWtlbHkgZHVlIHRvIG9uZVxuICAvLyBvZiB0aGUgZm9sbG93aW5nOlxuICAvLyAtIE9uZSBvciBtb3JlIGlucHV0IGFycmF5IHZhbHVlcyBkb24ndCBtYXAgdG8gYSBoZXggb2N0ZXQgKGxlYWRpbmcgdG9cbiAgLy8gXCJ1bmRlZmluZWRcIiBpbiB0aGUgdXVpZClcbiAgLy8gLSBJbnZhbGlkIGlucHV0IHZhbHVlcyBmb3IgdGhlIFJGQyBgdmVyc2lvbmAgb3IgYHZhcmlhbnRgIGZpZWxkc1xuXG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgcmV0dXJuIHV1aWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmluZ2lmeTsiLCJpbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnOyAvLyAqKmB2MSgpYCAtIEdlbmVyYXRlIHRpbWUtYmFzZWQgVVVJRCoqXG4vL1xuLy8gSW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL0xpb3NLL1VVSUQuanNcbi8vIGFuZCBodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvdXVpZC5odG1sXG5cbnZhciBfbm9kZUlkO1xuXG52YXIgX2Nsb2Nrc2VxOyAvLyBQcmV2aW91cyB1dWlkIGNyZWF0aW9uIHRpbWVcblxuXG52YXIgX2xhc3RNU2VjcyA9IDA7XG52YXIgX2xhc3ROU2VjcyA9IDA7IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQgZm9yIEFQSSBkZXRhaWxzXG5cbmZ1bmN0aW9uIHYxKG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gYnVmICYmIG9mZnNldCB8fCAwO1xuICB2YXIgYiA9IGJ1ZiB8fCBuZXcgQXJyYXkoMTYpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIG5vZGUgPSBvcHRpb25zLm5vZGUgfHwgX25vZGVJZDtcbiAgdmFyIGNsb2Nrc2VxID0gb3B0aW9ucy5jbG9ja3NlcSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jbG9ja3NlcSA6IF9jbG9ja3NlcTsgLy8gbm9kZSBhbmQgY2xvY2tzZXEgbmVlZCB0byBiZSBpbml0aWFsaXplZCB0byByYW5kb20gdmFsdWVzIGlmIHRoZXkncmUgbm90XG4gIC8vIHNwZWNpZmllZC4gIFdlIGRvIHRoaXMgbGF6aWx5IHRvIG1pbmltaXplIGlzc3VlcyByZWxhdGVkIHRvIGluc3VmZmljaWVudFxuICAvLyBzeXN0ZW0gZW50cm9weS4gIFNlZSAjMTg5XG5cbiAgaWYgKG5vZGUgPT0gbnVsbCB8fCBjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgdmFyIHNlZWRCeXRlcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7XG5cbiAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC41LCBjcmVhdGUgYW5kIDQ4LWJpdCBub2RlIGlkLCAoNDcgcmFuZG9tIGJpdHMgKyBtdWx0aWNhc3QgYml0ID0gMSlcbiAgICAgIG5vZGUgPSBfbm9kZUlkID0gW3NlZWRCeXRlc1swXSB8IDB4MDEsIHNlZWRCeXRlc1sxXSwgc2VlZEJ5dGVzWzJdLCBzZWVkQnl0ZXNbM10sIHNlZWRCeXRlc1s0XSwgc2VlZEJ5dGVzWzVdXTtcbiAgICB9XG5cbiAgICBpZiAoY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuMi4yLCByYW5kb21pemUgKDE0IGJpdCkgY2xvY2tzZXFcbiAgICAgIGNsb2Nrc2VxID0gX2Nsb2Nrc2VxID0gKHNlZWRCeXRlc1s2XSA8PCA4IHwgc2VlZEJ5dGVzWzddKSAmIDB4M2ZmZjtcbiAgICB9XG4gIH0gLy8gVVVJRCB0aW1lc3RhbXBzIGFyZSAxMDAgbmFuby1zZWNvbmQgdW5pdHMgc2luY2UgdGhlIEdyZWdvcmlhbiBlcG9jaCxcbiAgLy8gKDE1ODItMTAtMTUgMDA6MDApLiAgSlNOdW1iZXJzIGFyZW4ndCBwcmVjaXNlIGVub3VnaCBmb3IgdGhpcywgc29cbiAgLy8gdGltZSBpcyBoYW5kbGVkIGludGVybmFsbHkgYXMgJ21zZWNzJyAoaW50ZWdlciBtaWxsaXNlY29uZHMpIGFuZCAnbnNlY3MnXG4gIC8vICgxMDAtbmFub3NlY29uZHMgb2Zmc2V0IGZyb20gbXNlY3MpIHNpbmNlIHVuaXggZXBvY2gsIDE5NzAtMDEtMDEgMDA6MDAuXG5cblxuICB2YXIgbXNlY3MgPSBvcHRpb25zLm1zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1zZWNzIDogRGF0ZS5ub3coKTsgLy8gUGVyIDQuMi4xLjIsIHVzZSBjb3VudCBvZiB1dWlkJ3MgZ2VuZXJhdGVkIGR1cmluZyB0aGUgY3VycmVudCBjbG9ja1xuICAvLyBjeWNsZSB0byBzaW11bGF0ZSBoaWdoZXIgcmVzb2x1dGlvbiBjbG9ja1xuXG4gIHZhciBuc2VjcyA9IG9wdGlvbnMubnNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubnNlY3MgOiBfbGFzdE5TZWNzICsgMTsgLy8gVGltZSBzaW5jZSBsYXN0IHV1aWQgY3JlYXRpb24gKGluIG1zZWNzKVxuXG4gIHZhciBkdCA9IG1zZWNzIC0gX2xhc3RNU2VjcyArIChuc2VjcyAtIF9sYXN0TlNlY3MpIC8gMTAwMDA7IC8vIFBlciA0LjIuMS4yLCBCdW1wIGNsb2Nrc2VxIG9uIGNsb2NrIHJlZ3Jlc3Npb25cblxuICBpZiAoZHQgPCAwICYmIG9wdGlvbnMuY2xvY2tzZXEgPT09IHVuZGVmaW5lZCkge1xuICAgIGNsb2Nrc2VxID0gY2xvY2tzZXEgKyAxICYgMHgzZmZmO1xuICB9IC8vIFJlc2V0IG5zZWNzIGlmIGNsb2NrIHJlZ3Jlc3NlcyAobmV3IGNsb2Nrc2VxKSBvciB3ZSd2ZSBtb3ZlZCBvbnRvIGEgbmV3XG4gIC8vIHRpbWUgaW50ZXJ2YWxcblxuXG4gIGlmICgoZHQgPCAwIHx8IG1zZWNzID4gX2xhc3RNU2VjcykgJiYgb3B0aW9ucy5uc2VjcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbnNlY3MgPSAwO1xuICB9IC8vIFBlciA0LjIuMS4yIFRocm93IGVycm9yIGlmIHRvbyBtYW55IHV1aWRzIGFyZSByZXF1ZXN0ZWRcblxuXG4gIGlmIChuc2VjcyA+PSAxMDAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInV1aWQudjEoKTogQ2FuJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjXCIpO1xuICB9XG5cbiAgX2xhc3RNU2VjcyA9IG1zZWNzO1xuICBfbGFzdE5TZWNzID0gbnNlY3M7XG4gIF9jbG9ja3NlcSA9IGNsb2Nrc2VxOyAvLyBQZXIgNC4xLjQgLSBDb252ZXJ0IGZyb20gdW5peCBlcG9jaCB0byBHcmVnb3JpYW4gZXBvY2hcblxuICBtc2VjcyArPSAxMjIxOTI5MjgwMDAwMDsgLy8gYHRpbWVfbG93YFxuXG4gIHZhciB0bCA9ICgobXNlY3MgJiAweGZmZmZmZmYpICogMTAwMDAgKyBuc2VjcykgJSAweDEwMDAwMDAwMDtcbiAgYltpKytdID0gdGwgPj4+IDI0ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDE2ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bCAmIDB4ZmY7IC8vIGB0aW1lX21pZGBcblxuICB2YXIgdG1oID0gbXNlY3MgLyAweDEwMDAwMDAwMCAqIDEwMDAwICYgMHhmZmZmZmZmO1xuICBiW2krK10gPSB0bWggPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bWggJiAweGZmOyAvLyBgdGltZV9oaWdoX2FuZF92ZXJzaW9uYFxuXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMjQgJiAweGYgfCAweDEwOyAvLyBpbmNsdWRlIHZlcnNpb25cblxuICBiW2krK10gPSB0bWggPj4+IDE2ICYgMHhmZjsgLy8gYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgIChQZXIgNC4yLjIgLSBpbmNsdWRlIHZhcmlhbnQpXG5cbiAgYltpKytdID0gY2xvY2tzZXEgPj4+IDggfCAweDgwOyAvLyBgY2xvY2tfc2VxX2xvd2BcblxuICBiW2krK10gPSBjbG9ja3NlcSAmIDB4ZmY7IC8vIGBub2RlYFxuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgNjsgKytuKSB7XG4gICAgYltpICsgbl0gPSBub2RlW25dO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZiB8fCBzdHJpbmdpZnkoYik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHYxOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gcGFyc2UodXVpZCkge1xuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIFVVSUQnKTtcbiAgfVxuXG4gIHZhciB2O1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMTYpOyAvLyBQYXJzZSAjIyMjIyMjIy0uLi4uLS4uLi4tLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0O1xuICBhcnJbMV0gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsyXSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbM10gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tIyMjIy0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzRdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDksIDEzKSwgMTYpKSA+Pj4gODtcbiAgYXJyWzVdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tIyMjIy0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls2XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTgpLCAxNikpID4+PiA4O1xuICBhcnJbN10gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLSMjIyMtLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzhdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDE5LCAyMyksIDE2KSkgPj4+IDg7XG4gIGFycls5XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLS4uLi4tLi4uLi0jIyMjIyMjIyMjIyNcbiAgLy8gKFVzZSBcIi9cIiB0byBhdm9pZCAzMi1iaXQgdHJ1bmNhdGlvbiB3aGVuIGJpdC1zaGlmdGluZyBoaWdoLW9yZGVyIGJ5dGVzKVxuXG4gIGFyclsxMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMjQsIDM2KSwgMTYpKSAvIDB4MTAwMDAwMDAwMDAgJiAweGZmO1xuICBhcnJbMTFdID0gdiAvIDB4MTAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzEyXSA9IHYgPj4+IDI0ICYgMHhmZjtcbiAgYXJyWzEzXSA9IHYgPj4+IDE2ICYgMHhmZjtcbiAgYXJyWzE0XSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbMTVdID0gdiAmIDB4ZmY7XG4gIHJldHVybiBhcnI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhcnNlOyIsImltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuaW1wb3J0IHBhcnNlIGZyb20gJy4vcGFyc2UuanMnO1xuXG5mdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikge1xuICBzdHIgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgdmFyIGJ5dGVzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBieXRlcy5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpKTtcbiAgfVxuXG4gIHJldHVybiBieXRlcztcbn1cblxuZXhwb3J0IHZhciBETlMgPSAnNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCB2YXIgVVJMID0gJzZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgaGFzaGZ1bmMpIHtcbiAgZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKHZhbHVlLCBuYW1lc3BhY2UsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gc3RyaW5nVG9CeXRlcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lc3BhY2UgPSBwYXJzZShuYW1lc3BhY2UpO1xuICAgIH1cblxuICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoICE9PSAxNikge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdOYW1lc3BhY2UgbXVzdCBiZSBhcnJheS1saWtlICgxNiBpdGVyYWJsZSBpbnRlZ2VyIHZhbHVlcywgMC0yNTUpJyk7XG4gICAgfSAvLyBDb21wdXRlIGhhc2ggb2YgbmFtZXNwYWNlIGFuZCB2YWx1ZSwgUGVyIDQuM1xuICAgIC8vIEZ1dHVyZTogVXNlIHNwcmVhZCBzeW50YXggd2hlbiBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcywgZS5nLiBgYnl0ZXMgPVxuICAgIC8vIGhhc2hmdW5jKFsuLi5uYW1lc3BhY2UsIC4uLiB2YWx1ZV0pYFxuXG5cbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNiArIHZhbHVlLmxlbmd0aCk7XG4gICAgYnl0ZXMuc2V0KG5hbWVzcGFjZSk7XG4gICAgYnl0ZXMuc2V0KHZhbHVlLCBuYW1lc3BhY2UubGVuZ3RoKTtcbiAgICBieXRlcyA9IGhhc2hmdW5jKGJ5dGVzKTtcbiAgICBieXRlc1s2XSA9IGJ5dGVzWzZdICYgMHgwZiB8IHZlcnNpb247XG4gICAgYnl0ZXNbOF0gPSBieXRlc1s4XSAmIDB4M2YgfCAweDgwO1xuXG4gICAgaWYgKGJ1Zikge1xuICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlc1tpXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5KGJ5dGVzKTtcbiAgfSAvLyBGdW5jdGlvbiNuYW1lIGlzIG5vdCBzZXR0YWJsZSBvbiBzb21lIHBsYXRmb3JtcyAoIzI3MClcblxuXG4gIHRyeSB7XG4gICAgZ2VuZXJhdGVVVUlELm5hbWUgPSBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgfSBjYXRjaCAoZXJyKSB7fSAvLyBGb3IgQ29tbW9uSlMgZGVmYXVsdCBleHBvcnQgc3VwcG9ydFxuXG5cbiAgZ2VuZXJhdGVVVUlELkROUyA9IEROUztcbiAgZ2VuZXJhdGVVVUlELlVSTCA9IFVSTDtcbiAgcmV0dXJuIGdlbmVyYXRlVVVJRDtcbn0iLCIvKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEphdmFTY3JpcHQgTUQ1XG4gKlxuICogTW9kaWZpY2F0aW9uIG9mIEphdmFTY3JpcHQgTUQ1XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9KYXZhU2NyaXB0LU1ENVxuICpcbiAqIENvcHlyaWdodCAyMDExLCBTZWJhc3RpYW4gVHNjaGFuXG4gKiBodHRwczovL2JsdWVpbXAubmV0XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqXG4gKiBCYXNlZCBvblxuICogQSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZVxuICogRGlnZXN0IEFsZ29yaXRobSwgYXMgZGVmaW5lZCBpbiBSRkMgMTMyMS5cbiAqIFZlcnNpb24gMi4yIENvcHlyaWdodCAoQykgUGF1bCBKb2huc3RvbiAxOTk5IC0gMjAwOVxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlXG4gKiBTZWUgaHR0cDovL3BhamhvbWUub3JnLnVrL2NyeXB0L21kNSBmb3IgbW9yZSBpbmZvLlxuICovXG5mdW5jdGlvbiBtZDUoYnl0ZXMpIHtcbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KG1zZy5sZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzW2ldID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1kNVRvSGV4RW5jb2RlZEFycmF5KHdvcmRzVG9NZDUoYnl0ZXNUb1dvcmRzKGJ5dGVzKSwgYnl0ZXMubGVuZ3RoICogOCkpO1xufVxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcyB0byBhbiBhcnJheSBvZiBieXRlc1xuICovXG5cblxuZnVuY3Rpb24gbWQ1VG9IZXhFbmNvZGVkQXJyYXkoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgbGVuZ3RoMzIgPSBpbnB1dC5sZW5ndGggKiAzMjtcbiAgdmFyIGhleFRhYiA9ICcwMTIzNDU2Nzg5YWJjZGVmJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDMyOyBpICs9IDgpIHtcbiAgICB2YXIgeCA9IGlucHV0W2kgPj4gNV0gPj4+IGkgJSAzMiAmIDB4ZmY7XG4gICAgdmFyIGhleCA9IHBhcnNlSW50KGhleFRhYi5jaGFyQXQoeCA+Pj4gNCAmIDB4MGYpICsgaGV4VGFiLmNoYXJBdCh4ICYgMHgwZiksIDE2KTtcbiAgICBvdXRwdXQucHVzaChoZXgpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlIG91dHB1dCBsZW5ndGggd2l0aCBwYWRkaW5nIGFuZCBiaXQgbGVuZ3RoXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGg4KSB7XG4gIHJldHVybiAoaW5wdXRMZW5ndGg4ICsgNjQgPj4+IDkgPDwgNCkgKyAxNCArIDE7XG59XG4vKlxuICogQ2FsY3VsYXRlIHRoZSBNRDUgb2YgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcywgYW5kIGEgYml0IGxlbmd0aC5cbiAqL1xuXG5cbmZ1bmN0aW9uIHdvcmRzVG9NZDUoeCwgbGVuKSB7XG4gIC8qIGFwcGVuZCBwYWRkaW5nICovXG4gIHhbbGVuID4+IDVdIHw9IDB4ODAgPDwgbGVuICUgMzI7XG4gIHhbZ2V0T3V0cHV0TGVuZ3RoKGxlbikgLSAxXSA9IGxlbjtcbiAgdmFyIGEgPSAxNzMyNTg0MTkzO1xuICB2YXIgYiA9IC0yNzE3MzM4Nzk7XG4gIHZhciBjID0gLTE3MzI1ODQxOTQ7XG4gIHZhciBkID0gMjcxNzMzODc4O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICB2YXIgb2xkYSA9IGE7XG4gICAgdmFyIG9sZGIgPSBiO1xuICAgIHZhciBvbGRjID0gYztcbiAgICB2YXIgb2xkZCA9IGQ7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaV0sIDcsIC02ODA4NzY5MzYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxXSwgMTIsIC0zODk1NjQ1ODYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTcsIDYwNjEwNTgxOSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDNdLCAyMiwgLTEwNDQ1MjUzMzApO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNywgLTE3NjQxODg5Nyk7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDVdLCAxMiwgMTIwMDA4MDQyNik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNywgLTE0NzMyMzEzNDEpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyA3XSwgMjIsIC00NTcwNTk4Myk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA3LCAxNzcwMDM1NDE2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgOV0sIDEyLCAtMTk1ODQxNDQxNyk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTcsIC00MjA2Myk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDExXSwgMjIsIC0xOTkwNDA0MTYyKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA3LCAxODA0NjAzNjgyKTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMTNdLCAxMiwgLTQwMzQxMTAxKTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNywgLTE1MDIwMDIyOTApO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxNV0sIDIyLCAxMjM2NTM1MzI5KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMV0sIDUsIC0xNjU3OTY1MTApO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyA2XSwgOSwgLTEwNjk1MDE2MzIpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE0LCA2NDM3MTc3MTMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2ldLCAyMCwgLTM3Mzg5NzMwMik7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA1LCAtNzAxNTU4NjkxKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMTBdLCA5LCAzODAxNjA4Myk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTQsIC02NjA0NzgzMzUpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA0XSwgMjAsIC00MDU1Mzc4NDgpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNSwgNTY4NDQ2NDM4KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMTRdLCA5LCAtMTAxOTgwMzY5MCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNCwgLTE4NzM2Mzk2MSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDhdLCAyMCwgMTE2MzUzMTUwMSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNSwgLTE0NDQ2ODE0NjcpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAyXSwgOSwgLTUxNDAzNzg0KTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgN10sIDE0LCAxNzM1MzI4NDczKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgMTJdLCAyMCwgLTE5MjY2MDc3MzQpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNCwgLTM3ODU1OCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE2LCAxODM5MDMwNTYyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMV0sIDQsIC0xNTMwOTkyMDYwKTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgNF0sIDExLCAxMjcyODkzMzUzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgN10sIDE2LCAtMTU1NDk3NjMyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTBdLCAyMywgLTEwOTQ3MzA2NDApO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDQsIDY4MTI3OTE3NCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaV0sIDExLCAtMzU4NTM3MjIyKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgM10sIDE2LCAtNzIyNTIxOTc5KTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgNl0sIDIzLCA3NjAyOTE4OSk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDldLCA0LCAtNjQwMzY0NDg3KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgMTJdLCAxMSwgLTQyMTgxNTgzNSk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTYsIDUzMDc0MjUyMCk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDJdLCAyMywgLTk5NTMzODY1MSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaV0sIDYsIC0xOTg2MzA4NDQpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyA3XSwgMTAsIDExMjY4OTE0MTUpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE1LCAtMTQxNjM1NDkwNSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDVdLCAyMSwgLTU3NDM0MDU1KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA2LCAxNzAwNDg1NTcxKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgM10sIDEwLCAtMTg5NDk4NjYwNik7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTUsIC0xMDUxNTIzKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMV0sIDIxLCAtMjA1NDkyMjc5OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA2LCAxODczMzEzMzU5KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTVdLCAxMCwgLTMwNjExNzQ0KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE1LCAtMTU2MDE5ODM4MCk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDEzXSwgMjEsIDEzMDkxNTE2NDkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNiwgLTE0NTUyMzA3MCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDExXSwgMTAsIC0xMTIwMjEwMzc5KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE1LCA3MTg3ODcyNTkpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA5XSwgMjEsIC0zNDM0ODU1NTEpO1xuICAgIGEgPSBzYWZlQWRkKGEsIG9sZGEpO1xuICAgIGIgPSBzYWZlQWRkKGIsIG9sZGIpO1xuICAgIGMgPSBzYWZlQWRkKGMsIG9sZGMpO1xuICAgIGQgPSBzYWZlQWRkKGQsIG9sZGQpO1xuICB9XG5cbiAgcmV0dXJuIFthLCBiLCBjLCBkXTtcbn1cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IGJ5dGVzIHRvIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHNcbiAqIENoYXJhY3RlcnMgPjI1NSBoYXZlIHRoZWlyIGhpZ2gtYnl0ZSBzaWxlbnRseSBpZ25vcmVkLlxuICovXG5cblxuZnVuY3Rpb24gYnl0ZXNUb1dvcmRzKGlucHV0KSB7XG4gIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgbGVuZ3RoOCA9IGlucHV0Lmxlbmd0aCAqIDg7XG4gIHZhciBvdXRwdXQgPSBuZXcgVWludDMyQXJyYXkoZ2V0T3V0cHV0TGVuZ3RoKGxlbmd0aDgpKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDg7IGkgKz0gOCkge1xuICAgIG91dHB1dFtpID4+IDVdIHw9IChpbnB1dFtpIC8gOF0gJiAweGZmKSA8PCBpICUgMzI7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuLypcbiAqIEFkZCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zIGludGVybmFsbHlcbiAqIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG4gKi9cblxuXG5mdW5jdGlvbiBzYWZlQWRkKHgsIHkpIHtcbiAgdmFyIGxzdyA9ICh4ICYgMHhmZmZmKSArICh5ICYgMHhmZmZmKTtcbiAgdmFyIG1zdyA9ICh4ID4+IDE2KSArICh5ID4+IDE2KSArIChsc3cgPj4gMTYpO1xuICByZXR1cm4gbXN3IDw8IDE2IHwgbHN3ICYgMHhmZmZmO1xufVxuLypcbiAqIEJpdHdpc2Ugcm90YXRlIGEgMzItYml0IG51bWJlciB0byB0aGUgbGVmdC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGJpdFJvdGF0ZUxlZnQobnVtLCBjbnQpIHtcbiAgcmV0dXJuIG51bSA8PCBjbnQgfCBudW0gPj4+IDMyIC0gY250O1xufVxuLypcbiAqIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIGZvdXIgYmFzaWMgb3BlcmF0aW9ucyB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVjbW4ocSwgYSwgYiwgeCwgcywgdCkge1xuICByZXR1cm4gc2FmZUFkZChiaXRSb3RhdGVMZWZ0KHNhZmVBZGQoc2FmZUFkZChhLCBxKSwgc2FmZUFkZCh4LCB0KSksIHMpLCBiKTtcbn1cblxuZnVuY3Rpb24gbWQ1ZmYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBjIHwgfmIgJiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1Z2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBkIHwgYyAmIH5kLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1aGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihjIF4gKGIgfCB+ZCksIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtZDU7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgbWQ1IGZyb20gJy4vbWQ1LmpzJztcbnZhciB2MyA9IHYzNSgndjMnLCAweDMwLCBtZDUpO1xuZXhwb3J0IGRlZmF1bHQgdjM7IiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTsgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZ2lmeShybmRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjQ7IiwiLy8gQWRhcHRlZCBmcm9tIENocmlzIFZlbmVzcycgU0hBMSBjb2RlIGF0XG4vLyBodHRwOi8vd3d3Lm1vdmFibGUtdHlwZS5jby51ay9zY3JpcHRzL3NoYTEuaHRtbFxuZnVuY3Rpb24gZihzLCB4LCB5LCB6KSB7XG4gIHN3aXRjaCAocykge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiB4ICYgeSBeIH54ICYgejtcblxuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG5cbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geCAmIHkgXiB4ICYgeiBeIHkgJiB6O1xuXG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIHggXiB5IF4gejtcbiAgfVxufVxuXG5mdW5jdGlvbiBST1RMKHgsIG4pIHtcbiAgcmV0dXJuIHggPDwgbiB8IHggPj4+IDMyIC0gbjtcbn1cblxuZnVuY3Rpb24gc2hhMShieXRlcykge1xuICB2YXIgSyA9IFsweDVhODI3OTk5LCAweDZlZDllYmExLCAweDhmMWJiY2RjLCAweGNhNjJjMWQ2XTtcbiAgdmFyIEggPSBbMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMF07XG5cbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzLnB1c2gobXNnLmNoYXJDb2RlQXQoaSkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShieXRlcykpIHtcbiAgICAvLyBDb252ZXJ0IEFycmF5LWxpa2UgdG8gQXJyYXlcbiAgICBieXRlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGJ5dGVzKTtcbiAgfVxuXG4gIGJ5dGVzLnB1c2goMHg4MCk7XG4gIHZhciBsID0gYnl0ZXMubGVuZ3RoIC8gNCArIDI7XG4gIHZhciBOID0gTWF0aC5jZWlsKGwgLyAxNik7XG4gIHZhciBNID0gbmV3IEFycmF5KE4pO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBOOyArK19pKSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50MzJBcnJheSgxNik7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIGFycltqXSA9IGJ5dGVzW19pICogNjQgKyBqICogNF0gPDwgMjQgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAxXSA8PCAxNiB8IGJ5dGVzW19pICogNjQgKyBqICogNCArIDJdIDw8IDggfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAzXTtcbiAgICB9XG5cbiAgICBNW19pXSA9IGFycjtcbiAgfVxuXG4gIE1bTiAtIDFdWzE0XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggLyBNYXRoLnBvdygyLCAzMik7XG4gIE1bTiAtIDFdWzE0XSA9IE1hdGguZmxvb3IoTVtOIC0gMV1bMTRdKTtcbiAgTVtOIC0gMV1bMTVdID0gKGJ5dGVzLmxlbmd0aCAtIDEpICogOCAmIDB4ZmZmZmZmZmY7XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgTjsgKytfaTIpIHtcbiAgICB2YXIgVyA9IG5ldyBVaW50MzJBcnJheSg4MCk7XG5cbiAgICBmb3IgKHZhciB0ID0gMDsgdCA8IDE2OyArK3QpIHtcbiAgICAgIFdbdF0gPSBNW19pMl1bdF07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX3QgPSAxNjsgX3QgPCA4MDsgKytfdCkge1xuICAgICAgV1tfdF0gPSBST1RMKFdbX3QgLSAzXSBeIFdbX3QgLSA4XSBeIFdbX3QgLSAxNF0gXiBXW190IC0gMTZdLCAxKTtcbiAgICB9XG5cbiAgICB2YXIgYSA9IEhbMF07XG4gICAgdmFyIGIgPSBIWzFdO1xuICAgIHZhciBjID0gSFsyXTtcbiAgICB2YXIgZCA9IEhbM107XG4gICAgdmFyIGUgPSBIWzRdO1xuXG4gICAgZm9yICh2YXIgX3QyID0gMDsgX3QyIDwgODA7ICsrX3QyKSB7XG4gICAgICB2YXIgcyA9IE1hdGguZmxvb3IoX3QyIC8gMjApO1xuICAgICAgdmFyIFQgPSBST1RMKGEsIDUpICsgZihzLCBiLCBjLCBkKSArIGUgKyBLW3NdICsgV1tfdDJdID4+PiAwO1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIGMgPSBST1RMKGIsIDMwKSA+Pj4gMDtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IFQ7XG4gICAgfVxuXG4gICAgSFswXSA9IEhbMF0gKyBhID4+PiAwO1xuICAgIEhbMV0gPSBIWzFdICsgYiA+Pj4gMDtcbiAgICBIWzJdID0gSFsyXSArIGMgPj4+IDA7XG4gICAgSFszXSA9IEhbM10gKyBkID4+PiAwO1xuICAgIEhbNF0gPSBIWzRdICsgZSA+Pj4gMDtcbiAgfVxuXG4gIHJldHVybiBbSFswXSA+PiAyNCAmIDB4ZmYsIEhbMF0gPj4gMTYgJiAweGZmLCBIWzBdID4+IDggJiAweGZmLCBIWzBdICYgMHhmZiwgSFsxXSA+PiAyNCAmIDB4ZmYsIEhbMV0gPj4gMTYgJiAweGZmLCBIWzFdID4+IDggJiAweGZmLCBIWzFdICYgMHhmZiwgSFsyXSA+PiAyNCAmIDB4ZmYsIEhbMl0gPj4gMTYgJiAweGZmLCBIWzJdID4+IDggJiAweGZmLCBIWzJdICYgMHhmZiwgSFszXSA+PiAyNCAmIDB4ZmYsIEhbM10gPj4gMTYgJiAweGZmLCBIWzNdID4+IDggJiAweGZmLCBIWzNdICYgMHhmZiwgSFs0XSA+PiAyNCAmIDB4ZmYsIEhbNF0gPj4gMTYgJiAweGZmLCBIWzRdID4+IDggJiAweGZmLCBIWzRdICYgMHhmZl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNoYTE7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgc2hhMSBmcm9tICcuL3NoYTEuanMnO1xudmFyIHY1ID0gdjM1KCd2NScsIDB4NTAsIHNoYTEpO1xuZXhwb3J0IGRlZmF1bHQgdjU7IiwiZXhwb3J0IGRlZmF1bHQgJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7IiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG5mdW5jdGlvbiB2ZXJzaW9uKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICByZXR1cm4gcGFyc2VJbnQodXVpZC5zdWJzdHIoMTQsIDEpLCAxNik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZlcnNpb247IiwibW9kdWxlLmV4cG9ydHMgPSBGb3JtRGF0YTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZldGNoOyIsIm1vZHVsZS5leHBvcnRzID0ge307IiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmhhc0NPUlMgPSB2b2lkIDA7XG4vLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb25lbnQvaGFzLWNvcnNcbmxldCB2YWx1ZSA9IGZhbHNlO1xudHJ5IHtcbiAgICB2YWx1ZSA9IHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG59XG5jYXRjaCAoZXJyKSB7XG4gICAgLy8gaWYgWE1MSHR0cCBzdXBwb3J0IGlzIGRpc2FibGVkIGluIElFIHRoZW4gaXQgd2lsbCB0aHJvd1xuICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGNyZWF0ZVxufVxuZXhwb3J0cy5oYXNDT1JTID0gdmFsdWU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIGltcG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2dhbGtuL3F1ZXJ5c3RyaW5nXG4vKipcbiAqIENvbXBpbGVzIGEgcXVlcnlzdHJpbmdcbiAqIFJldHVybnMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMuZW5jb2RlID0gdm9pZCAwO1xuZnVuY3Rpb24gZW5jb2RlKG9iaikge1xuICAgIGxldCBzdHIgPSAnJztcbiAgICBmb3IgKGxldCBpIGluIG9iaikge1xuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICBpZiAoc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICBzdHIgKz0gJyYnO1xuICAgICAgICAgICAgc3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChpKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChvYmpbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5leHBvcnRzLmVuY29kZSA9IGVuY29kZTtcbi8qKlxuICogUGFyc2VzIGEgc2ltcGxlIHF1ZXJ5c3RyaW5nIGludG8gYW4gb2JqZWN0XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHFzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVjb2RlKHFzKSB7XG4gICAgbGV0IHFyeSA9IHt9O1xuICAgIGxldCBwYWlycyA9IHFzLnNwbGl0KCcmJyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwYWlycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IHBhaXIgPSBwYWlyc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICBxcnlbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChwYWlyWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIHFyeTtcbn1cbmV4cG9ydHMuZGVjb2RlID0gZGVjb2RlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlID0gdm9pZCAwO1xuLy8gaW1wb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZ2Fsa24vcGFyc2V1cmlcbi8qKlxuICogUGFyc2VzIGEgVVJJXG4gKlxuICogTm90ZTogd2UgY291bGQgYWxzbyBoYXZlIHVzZWQgdGhlIGJ1aWx0LWluIFVSTCBvYmplY3QsIGJ1dCBpdCBpc24ndCBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3Jtcy5cbiAqXG4gKiBTZWU6XG4gKiAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkxcbiAqIC0gaHR0cHM6Ly9jYW5pdXNlLmNvbS91cmxcbiAqIC0gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzM5ODYjYXBwZW5kaXgtQlxuICpcbiAqIEhpc3Rvcnkgb2YgdGhlIHBhcnNlKCkgbWV0aG9kOlxuICogLSBmaXJzdCBjb21taXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NrZXRpby9zb2NrZXQuaW8tY2xpZW50L2NvbW1pdC80ZWUxZDVkOTRiMzkwNmE5YzA1MmI0NTlmMWE4MThiMTVmMzhmOTFjXG4gKiAtIGV4cG9ydCBpbnRvIGl0cyBvd24gbW9kdWxlOiBodHRwczovL2dpdGh1Yi5jb20vc29ja2V0aW8vZW5naW5lLmlvLWNsaWVudC9jb21taXQvZGUyYzU2MWU0NTY0ZWZlYjc4ZjFiZGIxYmEzOWVmODFiMjgyMmNiM1xuICogLSByZWltcG9ydDogaHR0cHM6Ly9naXRodWIuY29tL3NvY2tldGlvL2VuZ2luZS5pby1jbGllbnQvY29tbWl0L2RmMzIyNzdjM2Y2ZDYyMmVlYzVlZDA5ZjQ5M2NhZTNmMzM5MWQyNDJcbiAqXG4gKiBAYXV0aG9yIFN0ZXZlbiBMZXZpdGhhbiA8c3RldmVubGV2aXRoYW4uY29tPiAoTUlUIGxpY2Vuc2UpXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuY29uc3QgcmUgPSAvXig/Oig/IVteOkBcXC8/I10rOlteOkBcXC9dKkApKGh0dHB8aHR0cHN8d3N8d3NzKTpcXC9cXC8pPygoPzooKFteOkBcXC8/I10qKSg/OjooW146QFxcLz8jXSopKT8pP0ApPygoPzpbYS1mMC05XXswLDR9Oil7Miw3fVthLWYwLTldezAsNH18W146XFwvPyNdKikoPzo6KFxcZCopKT8pKCgoXFwvKD86W14/I10oPyFbXj8jXFwvXSpcXC5bXj8jXFwvLl0rKD86Wz8jXXwkKSkpKlxcLz8pPyhbXj8jXFwvXSopKSg/OlxcPyhbXiNdKikpPyg/OiMoLiopKT8pLztcbmNvbnN0IHBhcnRzID0gW1xuICAgICdzb3VyY2UnLCAncHJvdG9jb2wnLCAnYXV0aG9yaXR5JywgJ3VzZXJJbmZvJywgJ3VzZXInLCAncGFzc3dvcmQnLCAnaG9zdCcsICdwb3J0JywgJ3JlbGF0aXZlJywgJ3BhdGgnLCAnZGlyZWN0b3J5JywgJ2ZpbGUnLCAncXVlcnknLCAnYW5jaG9yJ1xuXTtcbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIGlmIChzdHIubGVuZ3RoID4gMjAwMCkge1xuICAgICAgICB0aHJvdyBcIlVSSSB0b28gbG9uZ1wiO1xuICAgIH1cbiAgICBjb25zdCBzcmMgPSBzdHIsIGIgPSBzdHIuaW5kZXhPZignWycpLCBlID0gc3RyLmluZGV4T2YoJ10nKTtcbiAgICBpZiAoYiAhPSAtMSAmJiBlICE9IC0xKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgYikgKyBzdHIuc3Vic3RyaW5nKGIsIGUpLnJlcGxhY2UoLzovZywgJzsnKSArIHN0ci5zdWJzdHJpbmcoZSwgc3RyLmxlbmd0aCk7XG4gICAgfVxuICAgIGxldCBtID0gcmUuZXhlYyhzdHIgfHwgJycpLCB1cmkgPSB7fSwgaSA9IDE0O1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgdXJpW3BhcnRzW2ldXSA9IG1baV0gfHwgJyc7XG4gICAgfVxuICAgIGlmIChiICE9IC0xICYmIGUgIT0gLTEpIHtcbiAgICAgICAgdXJpLnNvdXJjZSA9IHNyYztcbiAgICAgICAgdXJpLmhvc3QgPSB1cmkuaG9zdC5zdWJzdHJpbmcoMSwgdXJpLmhvc3QubGVuZ3RoIC0gMSkucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuYXV0aG9yaXR5ID0gdXJpLmF1dGhvcml0eS5yZXBsYWNlKCdbJywgJycpLnJlcGxhY2UoJ10nLCAnJykucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuaXB2NnVyaSA9IHRydWU7XG4gICAgfVxuICAgIHVyaS5wYXRoTmFtZXMgPSBwYXRoTmFtZXModXJpLCB1cmlbJ3BhdGgnXSk7XG4gICAgdXJpLnF1ZXJ5S2V5ID0gcXVlcnlLZXkodXJpLCB1cmlbJ3F1ZXJ5J10pO1xuICAgIHJldHVybiB1cmk7XG59XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5mdW5jdGlvbiBwYXRoTmFtZXMob2JqLCBwYXRoKSB7XG4gICAgY29uc3QgcmVneCA9IC9cXC97Miw5fS9nLCBuYW1lcyA9IHBhdGgucmVwbGFjZShyZWd4LCBcIi9cIikuc3BsaXQoXCIvXCIpO1xuICAgIGlmIChwYXRoLnNsaWNlKDAsIDEpID09ICcvJyB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBuYW1lcy5zcGxpY2UoMCwgMSk7XG4gICAgfVxuICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PSAnLycpIHtcbiAgICAgICAgbmFtZXMuc3BsaWNlKG5hbWVzLmxlbmd0aCAtIDEsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXM7XG59XG5mdW5jdGlvbiBxdWVyeUtleSh1cmksIHF1ZXJ5KSB7XG4gICAgY29uc3QgZGF0YSA9IHt9O1xuICAgIHF1ZXJ5LnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLCBmdW5jdGlvbiAoJDAsICQxLCAkMikge1xuICAgICAgICBpZiAoJDEpIHtcbiAgICAgICAgICAgIGRhdGFbJDFdID0gJDI7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbn1cbiIsIi8vIGltcG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Vuc2hpZnRpby95ZWFzdFxuJ3VzZSBzdHJpY3QnO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy55ZWFzdCA9IGV4cG9ydHMuZGVjb2RlID0gZXhwb3J0cy5lbmNvZGUgPSB2b2lkIDA7XG5jb25zdCBhbHBoYWJldCA9ICcwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei1fJy5zcGxpdCgnJyksIGxlbmd0aCA9IDY0LCBtYXAgPSB7fTtcbmxldCBzZWVkID0gMCwgaSA9IDAsIHByZXY7XG4vKipcbiAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZCBudW1iZXIuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG51bSBUaGUgbnVtYmVyIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiBlbmNvZGUobnVtKSB7XG4gICAgbGV0IGVuY29kZWQgPSAnJztcbiAgICBkbyB7XG4gICAgICAgIGVuY29kZWQgPSBhbHBoYWJldFtudW0gJSBsZW5ndGhdICsgZW5jb2RlZDtcbiAgICAgICAgbnVtID0gTWF0aC5mbG9vcihudW0gLyBsZW5ndGgpO1xuICAgIH0gd2hpbGUgKG51bSA+IDApO1xuICAgIHJldHVybiBlbmNvZGVkO1xufVxuZXhwb3J0cy5lbmNvZGUgPSBlbmNvZGU7XG4vKipcbiAqIFJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiBkZWNvZGUoc3RyKSB7XG4gICAgbGV0IGRlY29kZWQgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGVjb2RlZCA9IGRlY29kZWQgKiBsZW5ndGggKyBtYXBbc3RyLmNoYXJBdChpKV07XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVkO1xufVxuZXhwb3J0cy5kZWNvZGUgPSBkZWNvZGU7XG4vKipcbiAqIFllYXN0OiBBIHRpbnkgZ3Jvd2luZyBpZCBnZW5lcmF0b3IuXG4gKlxuICogQHJldHVybnMge1N0cmluZ30gQSB1bmlxdWUgaWQuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiB5ZWFzdCgpIHtcbiAgICBjb25zdCBub3cgPSBlbmNvZGUoK25ldyBEYXRlKCkpO1xuICAgIGlmIChub3cgIT09IHByZXYpXG4gICAgICAgIHJldHVybiBzZWVkID0gMCwgcHJldiA9IG5vdztcbiAgICByZXR1cm4gbm93ICsgJy4nICsgZW5jb2RlKHNlZWQrKyk7XG59XG5leHBvcnRzLnllYXN0ID0geWVhc3Q7XG4vL1xuLy8gTWFwIGVhY2ggY2hhcmFjdGVyIHRvIGl0cyBpbmRleC5cbi8vXG5mb3IgKDsgaSA8IGxlbmd0aDsgaSsrKVxuICAgIG1hcFthbHBoYWJldFtpXV0gPSBpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdsb2JhbFRoaXNTaGltID0gdm9pZCAwO1xuZXhwb3J0cy5nbG9iYWxUaGlzU2hpbSA9ICgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xuICAgIH1cbn0pKCk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubmV4dFRpY2sgPSBleHBvcnRzLnBhcnNlID0gZXhwb3J0cy5pbnN0YWxsVGltZXJGdW5jdGlvbnMgPSBleHBvcnRzLnRyYW5zcG9ydHMgPSBleHBvcnRzLlRyYW5zcG9ydEVycm9yID0gZXhwb3J0cy5UcmFuc3BvcnQgPSBleHBvcnRzLnByb3RvY29sID0gZXhwb3J0cy5Tb2NrZXQgPSB2b2lkIDA7XG5jb25zdCBzb2NrZXRfanNfMSA9IHJlcXVpcmUoXCIuL3NvY2tldC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNvY2tldFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc29ja2V0X2pzXzEuU29ja2V0OyB9IH0pO1xuZXhwb3J0cy5wcm90b2NvbCA9IHNvY2tldF9qc18xLlNvY2tldC5wcm90b2NvbDtcbnZhciB0cmFuc3BvcnRfanNfMSA9IHJlcXVpcmUoXCIuL3RyYW5zcG9ydC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYW5zcG9ydFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJhbnNwb3J0X2pzXzEuVHJhbnNwb3J0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhbnNwb3J0RXJyb3JcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRyYW5zcG9ydF9qc18xLlRyYW5zcG9ydEVycm9yOyB9IH0pO1xudmFyIGluZGV4X2pzXzEgPSByZXF1aXJlKFwiLi90cmFuc3BvcnRzL2luZGV4LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidHJhbnNwb3J0c1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaW5kZXhfanNfMS50cmFuc3BvcnRzOyB9IH0pO1xudmFyIHV0aWxfanNfMSA9IHJlcXVpcmUoXCIuL3V0aWwuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpbnN0YWxsVGltZXJGdW5jdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWxfanNfMS5pbnN0YWxsVGltZXJGdW5jdGlvbnM7IH0gfSk7XG52YXIgcGFyc2V1cmlfanNfMSA9IHJlcXVpcmUoXCIuL2NvbnRyaWIvcGFyc2V1cmkuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJwYXJzZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGFyc2V1cmlfanNfMS5wYXJzZTsgfSB9KTtcbnZhciB3ZWJzb2NrZXRfY29uc3RydWN0b3JfanNfMSA9IHJlcXVpcmUoXCIuL3RyYW5zcG9ydHMvd2Vic29ja2V0LWNvbnN0cnVjdG9yLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibmV4dFRpY2tcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLm5leHRUaWNrOyB9IH0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNvY2tldCA9IHZvaWQgMDtcbmNvbnN0IGluZGV4X2pzXzEgPSByZXF1aXJlKFwiLi90cmFuc3BvcnRzL2luZGV4LmpzXCIpO1xuY29uc3QgdXRpbF9qc18xID0gcmVxdWlyZShcIi4vdXRpbC5qc1wiKTtcbmNvbnN0IHBhcnNlcXNfanNfMSA9IHJlcXVpcmUoXCIuL2NvbnRyaWIvcGFyc2Vxcy5qc1wiKTtcbmNvbnN0IHBhcnNldXJpX2pzXzEgPSByZXF1aXJlKFwiLi9jb250cmliL3BhcnNldXJpLmpzXCIpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpOyAvLyBkZWJ1ZygpXG5jb25zdCBjb21wb25lbnRfZW1pdHRlcl8xID0gcmVxdWlyZShcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIik7XG5jb25zdCBlbmdpbmVfaW9fcGFyc2VyXzEgPSByZXF1aXJlKFwiZW5naW5lLmlvLXBhcnNlclwiKTtcbmNvbnN0IHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xID0gcmVxdWlyZShcIi4vdHJhbnNwb3J0cy93ZWJzb2NrZXQtY29uc3RydWN0b3IuanNcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKFwiZW5naW5lLmlvLWNsaWVudDpzb2NrZXRcIik7IC8vIGRlYnVnKClcbmNsYXNzIFNvY2tldCBleHRlbmRzIGNvbXBvbmVudF9lbWl0dGVyXzEuRW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogU29ja2V0IGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSB1cmkgLSB1cmkgb3Igb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgb3B0cyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYmluYXJ5VHlwZSA9IHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLmRlZmF1bHRCaW5hcnlUeXBlO1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyID0gW107XG4gICAgICAgIGlmICh1cmkgJiYgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHVyaSkge1xuICAgICAgICAgICAgb3B0cyA9IHVyaTtcbiAgICAgICAgICAgIHVyaSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVyaSkge1xuICAgICAgICAgICAgdXJpID0gKDAsIHBhcnNldXJpX2pzXzEucGFyc2UpKHVyaSk7XG4gICAgICAgICAgICBvcHRzLmhvc3RuYW1lID0gdXJpLmhvc3Q7XG4gICAgICAgICAgICBvcHRzLnNlY3VyZSA9IHVyaS5wcm90b2NvbCA9PT0gXCJodHRwc1wiIHx8IHVyaS5wcm90b2NvbCA9PT0gXCJ3c3NcIjtcbiAgICAgICAgICAgIG9wdHMucG9ydCA9IHVyaS5wb3J0O1xuICAgICAgICAgICAgaWYgKHVyaS5xdWVyeSlcbiAgICAgICAgICAgICAgICBvcHRzLnF1ZXJ5ID0gdXJpLnF1ZXJ5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdHMuaG9zdCkge1xuICAgICAgICAgICAgb3B0cy5ob3N0bmFtZSA9ICgwLCBwYXJzZXVyaV9qc18xLnBhcnNlKShvcHRzLmhvc3QpLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgKDAsIHV0aWxfanNfMS5pbnN0YWxsVGltZXJGdW5jdGlvbnMpKHRoaXMsIG9wdHMpO1xuICAgICAgICB0aGlzLnNlY3VyZSA9XG4gICAgICAgICAgICBudWxsICE9IG9wdHMuc2VjdXJlXG4gICAgICAgICAgICAgICAgPyBvcHRzLnNlY3VyZVxuICAgICAgICAgICAgICAgIDogdHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiICYmIFwiaHR0cHM6XCIgPT09IGxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgICBpZiAob3B0cy5ob3N0bmFtZSAmJiAhb3B0cy5wb3J0KSB7XG4gICAgICAgICAgICAvLyBpZiBubyBwb3J0IGlzIHNwZWNpZmllZCBtYW51YWxseSwgdXNlIHRoZSBwcm90b2NvbCBkZWZhdWx0XG4gICAgICAgICAgICBvcHRzLnBvcnQgPSB0aGlzLnNlY3VyZSA/IFwiNDQzXCIgOiBcIjgwXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ob3N0bmFtZSA9XG4gICAgICAgICAgICBvcHRzLmhvc3RuYW1lIHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiA/IGxvY2F0aW9uLmhvc3RuYW1lIDogXCJsb2NhbGhvc3RcIik7XG4gICAgICAgIHRoaXMucG9ydCA9XG4gICAgICAgICAgICBvcHRzLnBvcnQgfHxcbiAgICAgICAgICAgICAgICAodHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiICYmIGxvY2F0aW9uLnBvcnRcbiAgICAgICAgICAgICAgICAgICAgPyBsb2NhdGlvbi5wb3J0XG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5zZWN1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCI0NDNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcIjgwXCIpO1xuICAgICAgICB0aGlzLnRyYW5zcG9ydHMgPSBvcHRzLnRyYW5zcG9ydHMgfHwgW1xuICAgICAgICAgICAgXCJwb2xsaW5nXCIsXG4gICAgICAgICAgICBcIndlYnNvY2tldFwiLFxuICAgICAgICAgICAgXCJ3ZWJ0cmFuc3BvcnRcIixcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy53cml0ZUJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLnByZXZCdWZmZXJMZW4gPSAwO1xuICAgICAgICB0aGlzLm9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIHBhdGg6IFwiL2VuZ2luZS5pb1wiLFxuICAgICAgICAgICAgYWdlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgICAgICAgIHVwZ3JhZGU6IHRydWUsXG4gICAgICAgICAgICB0aW1lc3RhbXBQYXJhbTogXCJ0XCIsXG4gICAgICAgICAgICByZW1lbWJlclVwZ3JhZGU6IGZhbHNlLFxuICAgICAgICAgICAgYWRkVHJhaWxpbmdTbGFzaDogdHJ1ZSxcbiAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgICAgICAgIHBlck1lc3NhZ2VEZWZsYXRlOiB7XG4gICAgICAgICAgICAgICAgdGhyZXNob2xkOiAxMDI0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYW5zcG9ydE9wdGlvbnM6IHt9LFxuICAgICAgICAgICAgY2xvc2VPbkJlZm9yZXVubG9hZDogZmFsc2UsXG4gICAgICAgIH0sIG9wdHMpO1xuICAgICAgICB0aGlzLm9wdHMucGF0aCA9XG4gICAgICAgICAgICB0aGlzLm9wdHMucGF0aC5yZXBsYWNlKC9cXC8kLywgXCJcIikgK1xuICAgICAgICAgICAgICAgICh0aGlzLm9wdHMuYWRkVHJhaWxpbmdTbGFzaCA/IFwiL1wiIDogXCJcIik7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLnF1ZXJ5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLm9wdHMucXVlcnkgPSAoMCwgcGFyc2Vxc19qc18xLmRlY29kZSkodGhpcy5vcHRzLnF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgb24gaGFuZHNoYWtlXG4gICAgICAgIHRoaXMuaWQgPSBudWxsO1xuICAgICAgICB0aGlzLnVwZ3JhZGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5waW5nSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICB0aGlzLnBpbmdUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgLy8gc2V0IG9uIGhlYXJ0YmVhdFxuICAgICAgICB0aGlzLnBpbmdUaW1lb3V0VGltZXIgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIGFkZEV2ZW50TGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5jbG9zZU9uQmVmb3JldW5sb2FkKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZWZveCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gd2hlbiB0aGUgXCJiZWZvcmV1bmxvYWRcIiBldmVudCBpcyBlbWl0dGVkIGJ1dCBub3QgQ2hyb21lLiBUaGlzIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgLy8gZW5zdXJlcyBldmVyeSBicm93c2VyIGJlaGF2ZXMgdGhlIHNhbWUgKG5vIFwiZGlzY29ubmVjdFwiIGV2ZW50IGF0IHRoZSBTb2NrZXQuSU8gbGV2ZWwgd2hlbiB0aGUgcGFnZSBpc1xuICAgICAgICAgICAgICAgIC8vIGNsb3NlZC9yZWxvYWRlZClcbiAgICAgICAgICAgICAgICB0aGlzLmJlZm9yZXVubG9hZEV2ZW50TGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lsZW50bHkgY2xvc2UgdGhlIHRyYW5zcG9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIHRoaXMuYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaG9zdG5hbWUgIT09IFwibG9jYWxob3N0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZmxpbmVFdmVudExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2xvc2UoXCJ0cmFuc3BvcnQgY2xvc2VcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwibmV0d29yayBjb25uZWN0aW9uIGxvc3RcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKFwib2ZmbGluZVwiLCB0aGlzLm9mZmxpbmVFdmVudExpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdHJhbnNwb3J0IG9mIHRoZSBnaXZlbiB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSB0cmFuc3BvcnQgbmFtZVxuICAgICAqIEByZXR1cm4ge1RyYW5zcG9ydH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNyZWF0ZVRyYW5zcG9ydChuYW1lKSB7XG4gICAgICAgIGRlYnVnKCdjcmVhdGluZyB0cmFuc3BvcnQgXCIlc1wiJywgbmFtZSk7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLnF1ZXJ5KTtcbiAgICAgICAgLy8gYXBwZW5kIGVuZ2luZS5pbyBwcm90b2NvbCBpZGVudGlmaWVyXG4gICAgICAgIHF1ZXJ5LkVJTyA9IGVuZ2luZV9pb19wYXJzZXJfMS5wcm90b2NvbDtcbiAgICAgICAgLy8gdHJhbnNwb3J0IG5hbWVcbiAgICAgICAgcXVlcnkudHJhbnNwb3J0ID0gbmFtZTtcbiAgICAgICAgLy8gc2Vzc2lvbiBpZCBpZiB3ZSBhbHJlYWR5IGhhdmUgb25lXG4gICAgICAgIGlmICh0aGlzLmlkKVxuICAgICAgICAgICAgcXVlcnkuc2lkID0gdGhpcy5pZDtcbiAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywge1xuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICBzb2NrZXQ6IHRoaXMsXG4gICAgICAgICAgICBob3N0bmFtZTogdGhpcy5ob3N0bmFtZSxcbiAgICAgICAgICAgIHNlY3VyZTogdGhpcy5zZWN1cmUsXG4gICAgICAgICAgICBwb3J0OiB0aGlzLnBvcnQsXG4gICAgICAgIH0sIHRoaXMub3B0cy50cmFuc3BvcnRPcHRpb25zW25hbWVdKTtcbiAgICAgICAgZGVidWcoXCJvcHRpb25zOiAlalwiLCBvcHRzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBpbmRleF9qc18xLnRyYW5zcG9ydHNbbmFtZV0ob3B0cyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRyYW5zcG9ydCB0byB1c2UgYW5kIHN0YXJ0cyBwcm9iZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb3BlbigpIHtcbiAgICAgICAgbGV0IHRyYW5zcG9ydDtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5yZW1lbWJlclVwZ3JhZGUgJiZcbiAgICAgICAgICAgIFNvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3MgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0cy5pbmRleE9mKFwid2Vic29ja2V0XCIpICE9PSAtMSkge1xuICAgICAgICAgICAgdHJhbnNwb3J0ID0gXCJ3ZWJzb2NrZXRcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgwID09PSB0aGlzLnRyYW5zcG9ydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBFbWl0IGVycm9yIG9uIG5leHQgdGljayBzbyBpdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICAgICAgICAgIHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIFwiTm8gdHJhbnNwb3J0cyBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRyYW5zcG9ydCA9IHRoaXMudHJhbnNwb3J0c1swXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5pbmdcIjtcbiAgICAgICAgLy8gUmV0cnkgd2l0aCB0aGUgbmV4dCB0cmFuc3BvcnQgaWYgdGhlIHRyYW5zcG9ydCBpcyBkaXNhYmxlZCAoanNvbnA6IGZhbHNlKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoXCJlcnJvciB3aGlsZSBjcmVhdGluZyB0cmFuc3BvcnQ6ICVzXCIsIGUpO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cmFuc3BvcnQub3BlbigpO1xuICAgICAgICB0aGlzLnNldFRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHRyYW5zcG9ydC4gRGlzYWJsZXMgdGhlIGV4aXN0aW5nIG9uZSAoaWYgYW55KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2V0VHJhbnNwb3J0KHRyYW5zcG9ydCkge1xuICAgICAgICBkZWJ1ZyhcInNldHRpbmcgdHJhbnNwb3J0ICVzXCIsIHRyYW5zcG9ydC5uYW1lKTtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0KSB7XG4gICAgICAgICAgICBkZWJ1ZyhcImNsZWFyaW5nIGV4aXN0aW5nIHRyYW5zcG9ydCAlc1wiLCB0aGlzLnRyYW5zcG9ydC5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCB1cCB0cmFuc3BvcnRcbiAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgICAgIC8vIHNldCB1cCB0cmFuc3BvcnQgbGlzdGVuZXJzXG4gICAgICAgIHRyYW5zcG9ydFxuICAgICAgICAgICAgLm9uKFwiZHJhaW5cIiwgdGhpcy5vbkRyYWluLmJpbmQodGhpcykpXG4gICAgICAgICAgICAub24oXCJwYWNrZXRcIiwgdGhpcy5vblBhY2tldC5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKFwiZXJyb3JcIiwgdGhpcy5vbkVycm9yLmJpbmQodGhpcykpXG4gICAgICAgICAgICAub24oXCJjbG9zZVwiLCAocmVhc29uKSA9PiB0aGlzLm9uQ2xvc2UoXCJ0cmFuc3BvcnQgY2xvc2VcIiwgcmVhc29uKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2JlcyBhIHRyYW5zcG9ydC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gdHJhbnNwb3J0IG5hbWVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByb2JlKG5hbWUpIHtcbiAgICAgICAgZGVidWcoJ3Byb2JpbmcgdHJhbnNwb3J0IFwiJXNcIicsIG5hbWUpO1xuICAgICAgICBsZXQgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQobmFtZSk7XG4gICAgICAgIGxldCBmYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgU29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBvblRyYW5zcG9ydE9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmFpbGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGRlYnVnKCdwcm9iZSB0cmFuc3BvcnQgXCIlc1wiIG9wZW5lZCcsIG5hbWUpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoW3sgdHlwZTogXCJwaW5nXCIsIGRhdGE6IFwicHJvYmVcIiB9XSk7XG4gICAgICAgICAgICB0cmFuc3BvcnQub25jZShcInBhY2tldFwiLCAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZhaWxlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChcInBvbmdcIiA9PT0gbXNnLnR5cGUgJiYgXCJwcm9iZVwiID09PSBtc2cuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZygncHJvYmUgdHJhbnNwb3J0IFwiJXNcIiBwb25nJywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBncmFkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJ1cGdyYWRpbmdcIiwgdHJhbnNwb3J0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc3BvcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIFNvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3MgPSBcIndlYnNvY2tldFwiID09PSB0cmFuc3BvcnQubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoJ3BhdXNpbmcgY3VycmVudCB0cmFuc3BvcnQgXCIlc1wiJywgdGhpcy50cmFuc3BvcnQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnBhdXNlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwiY2xvc2VkXCIgPT09IHRoaXMucmVhZHlTdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhcImNoYW5naW5nIHRyYW5zcG9ydCBhbmQgc2VuZGluZyB1cGdyYWRlIHBhY2tldFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VHJhbnNwb3J0KHRyYW5zcG9ydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuc2VuZChbeyB0eXBlOiBcInVwZ3JhZGVcIiB9XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInVwZ3JhZGVcIiwgdHJhbnNwb3J0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnKCdwcm9iZSB0cmFuc3BvcnQgXCIlc1wiIGZhaWxlZCcsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJwcm9iZSBlcnJvclwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBlcnIudHJhbnNwb3J0ID0gdHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwidXBncmFkZUVycm9yXCIsIGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIGZyZWV6ZVRyYW5zcG9ydCgpIHtcbiAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gQW55IGNhbGxiYWNrIGNhbGxlZCBieSB0cmFuc3BvcnQgc2hvdWxkIGJlIGlnbm9yZWQgc2luY2Ugbm93XG4gICAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICB0cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBhbnkgZXJyb3IgdGhhdCBoYXBwZW5zIHdoaWxlIHByb2JpbmdcbiAgICAgICAgY29uc3Qgb25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFwicHJvYmUgZXJyb3I6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVycm9yLnRyYW5zcG9ydCA9IHRyYW5zcG9ydC5uYW1lO1xuICAgICAgICAgICAgZnJlZXplVHJhbnNwb3J0KCk7XG4gICAgICAgICAgICBkZWJ1ZygncHJvYmUgdHJhbnNwb3J0IFwiJXNcIiBmYWlsZWQgYmVjYXVzZSBvZiBlcnJvcjogJXMnLCBuYW1lLCBlcnIpO1xuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJ1cGdyYWRlRXJyb3JcIiwgZXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICBmdW5jdGlvbiBvblRyYW5zcG9ydENsb3NlKCkge1xuICAgICAgICAgICAgb25lcnJvcihcInRyYW5zcG9ydCBjbG9zZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZCB3aGlsZSB3ZSdyZSBwcm9iaW5nXG4gICAgICAgIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgICAgICAgICBvbmVycm9yKFwic29ja2V0IGNsb3NlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBzb2NrZXQgaXMgdXBncmFkZWQgd2hpbGUgd2UncmUgcHJvYmluZ1xuICAgICAgICBmdW5jdGlvbiBvbnVwZ3JhZGUodG8pIHtcbiAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgJiYgdG8ubmFtZSAhPT0gdHJhbnNwb3J0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnXCIlc1wiIHdvcmtzIC0gYWJvcnRpbmcgXCIlc1wiJywgdG8ubmFtZSwgdHJhbnNwb3J0Lm5hbWUpO1xuICAgICAgICAgICAgICAgIGZyZWV6ZVRyYW5zcG9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIG9uIHRoZSB0cmFuc3BvcnQgYW5kIG9uIHNlbGZcbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcIm9wZW5cIiwgb25UcmFuc3BvcnRPcGVuKTtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIG9uZXJyb3IpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLm9mZihcImNsb3NlXCIsIG9uY2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5vZmYoXCJ1cGdyYWRpbmdcIiwgb251cGdyYWRlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJhbnNwb3J0Lm9uY2UoXCJvcGVuXCIsIG9uVHJhbnNwb3J0T3Blbik7XG4gICAgICAgIHRyYW5zcG9ydC5vbmNlKFwiZXJyb3JcIiwgb25lcnJvcik7XG4gICAgICAgIHRyYW5zcG9ydC5vbmNlKFwiY2xvc2VcIiwgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgICAgIHRoaXMub25jZShcImNsb3NlXCIsIG9uY2xvc2UpO1xuICAgICAgICB0aGlzLm9uY2UoXCJ1cGdyYWRpbmdcIiwgb251cGdyYWRlKTtcbiAgICAgICAgaWYgKHRoaXMudXBncmFkZXMuaW5kZXhPZihcIndlYnRyYW5zcG9ydFwiKSAhPT0gLTEgJiZcbiAgICAgICAgICAgIG5hbWUgIT09IFwid2VidHJhbnNwb3J0XCIpIHtcbiAgICAgICAgICAgIC8vIGZhdm9yIFdlYlRyYW5zcG9ydFxuICAgICAgICAgICAgdGhpcy5zZXRUaW1lb3V0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gY29ubmVjdGlvbiBpcyBkZWVtZWQgb3Blbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25PcGVuKCkge1xuICAgICAgICBkZWJ1ZyhcInNvY2tldCBvcGVuXCIpO1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgU29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IFwid2Vic29ja2V0XCIgPT09IHRoaXMudHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwib3BlblwiKTtcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICAvLyB3ZSBjaGVjayBmb3IgYHJlYWR5U3RhdGVgIGluIGNhc2UgYW4gYG9wZW5gXG4gICAgICAgIC8vIGxpc3RlbmVyIGFscmVhZHkgY2xvc2VkIHRoZSBzb2NrZXRcbiAgICAgICAgaWYgKFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUgJiYgdGhpcy5vcHRzLnVwZ3JhZGUpIHtcbiAgICAgICAgICAgIGRlYnVnKFwic3RhcnRpbmcgdXBncmFkZSBwcm9iZXNcIik7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBjb25zdCBsID0gdGhpcy51cGdyYWRlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvYmUodGhpcy51cGdyYWRlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBhIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25QYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8XG4gICAgICAgICAgICBcIm9wZW5cIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8XG4gICAgICAgICAgICBcImNsb3NpbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICBkZWJ1Zygnc29ja2V0IHJlY2VpdmU6IHR5cGUgXCIlc1wiLCBkYXRhIFwiJXNcIicsIHBhY2tldC50eXBlLCBwYWNrZXQuZGF0YSk7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgLy8gU29ja2V0IGlzIGxpdmUgLSBhbnkgcGFja2V0IGNvdW50c1xuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJoZWFydGJlYXRcIik7XG4gICAgICAgICAgICB0aGlzLnJlc2V0UGluZ1RpbWVvdXQoKTtcbiAgICAgICAgICAgIHN3aXRjaCAocGFja2V0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwib3BlblwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uSGFuZHNoYWtlKEpTT04ucGFyc2UocGFja2V0LmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInBpbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kUGFja2V0KFwicG9uZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwaW5nXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBvbmdcIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJzZXJ2ZXIgZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgZXJyLmNvZGUgPSBwYWNrZXQuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZGF0YVwiLCBwYWNrZXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwibWVzc2FnZVwiLCBwYWNrZXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVidWcoJ3BhY2tldCByZWNlaXZlZCB3aXRoIHNvY2tldCByZWFkeVN0YXRlIFwiJXNcIicsIHRoaXMucmVhZHlTdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gaGFuZHNoYWtlIGNvbXBsZXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIGhhbmRzaGFrZSBvYmpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uSGFuZHNoYWtlKGRhdGEpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJoYW5kc2hha2VcIiwgZGF0YSk7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLnNpZDtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQucXVlcnkuc2lkID0gZGF0YS5zaWQ7XG4gICAgICAgIHRoaXMudXBncmFkZXMgPSB0aGlzLmZpbHRlclVwZ3JhZGVzKGRhdGEudXBncmFkZXMpO1xuICAgICAgICB0aGlzLnBpbmdJbnRlcnZhbCA9IGRhdGEucGluZ0ludGVydmFsO1xuICAgICAgICB0aGlzLnBpbmdUaW1lb3V0ID0gZGF0YS5waW5nVGltZW91dDtcbiAgICAgICAgdGhpcy5tYXhQYXlsb2FkID0gZGF0YS5tYXhQYXlsb2FkO1xuICAgICAgICB0aGlzLm9uT3BlbigpO1xuICAgICAgICAvLyBJbiBjYXNlIG9wZW4gaGFuZGxlciBjbG9zZXMgc29ja2V0XG4gICAgICAgIGlmIChcImNsb3NlZFwiID09PSB0aGlzLnJlYWR5U3RhdGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucmVzZXRQaW5nVGltZW91dCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGFuZCByZXNldHMgcGluZyB0aW1lb3V0IHRpbWVyIGJhc2VkIG9uIHNlcnZlciBwaW5ncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVzZXRQaW5nVGltZW91dCgpIHtcbiAgICAgICAgdGhpcy5jbGVhclRpbWVvdXRGbih0aGlzLnBpbmdUaW1lb3V0VGltZXIpO1xuICAgICAgICB0aGlzLnBpbmdUaW1lb3V0VGltZXIgPSB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQ2xvc2UoXCJwaW5nIHRpbWVvdXRcIik7XG4gICAgICAgIH0sIHRoaXMucGluZ0ludGVydmFsICsgdGhpcy5waW5nVGltZW91dCk7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXV0b1VucmVmKSB7XG4gICAgICAgICAgICB0aGlzLnBpbmdUaW1lb3V0VGltZXIudW5yZWYoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgb24gYGRyYWluYCBldmVudFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbkRyYWluKCkge1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyLnNwbGljZSgwLCB0aGlzLnByZXZCdWZmZXJMZW4pO1xuICAgICAgICAvLyBzZXR0aW5nIHByZXZCdWZmZXJMZW4gPSAwIGlzIHZlcnkgaW1wb3J0YW50XG4gICAgICAgIC8vIGZvciBleGFtcGxlLCB3aGVuIHVwZ3JhZGluZywgdXBncmFkZSBwYWNrZXQgaXMgc2VudCBvdmVyLFxuICAgICAgICAvLyBhbmQgYSBub256ZXJvIHByZXZCdWZmZXJMZW4gY291bGQgY2F1c2UgcHJvYmxlbXMgb24gYGRyYWluYFxuICAgICAgICB0aGlzLnByZXZCdWZmZXJMZW4gPSAwO1xuICAgICAgICBpZiAoMCA9PT0gdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRmx1c2ggd3JpdGUgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZmx1c2goKSB7XG4gICAgICAgIGlmIChcImNsb3NlZFwiICE9PSB0aGlzLnJlYWR5U3RhdGUgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LndyaXRhYmxlICYmXG4gICAgICAgICAgICAhdGhpcy51cGdyYWRpbmcgJiZcbiAgICAgICAgICAgIHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBwYWNrZXRzID0gdGhpcy5nZXRXcml0YWJsZVBhY2tldHMoKTtcbiAgICAgICAgICAgIGRlYnVnKFwiZmx1c2hpbmcgJWQgcGFja2V0cyBpbiBzb2NrZXRcIiwgcGFja2V0cy5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQuc2VuZChwYWNrZXRzKTtcbiAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgY3VycmVudCBsZW5ndGggb2Ygd3JpdGVCdWZmZXJcbiAgICAgICAgICAgIC8vIHNwbGljZSB3cml0ZUJ1ZmZlciBhbmQgY2FsbGJhY2tCdWZmZXIgb24gYGRyYWluYFxuICAgICAgICAgICAgdGhpcy5wcmV2QnVmZmVyTGVuID0gcGFja2V0cy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImZsdXNoXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZSB0aGUgZW5jb2RlZCBzaXplIG9mIHRoZSB3cml0ZUJ1ZmZlciBpcyBiZWxvdyB0aGUgbWF4UGF5bG9hZCB2YWx1ZSBzZW50IGJ5IHRoZSBzZXJ2ZXIgKG9ubHkgZm9yIEhUVFBcbiAgICAgKiBsb25nLXBvbGxpbmcpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldFdyaXRhYmxlUGFja2V0cygpIHtcbiAgICAgICAgY29uc3Qgc2hvdWxkQ2hlY2tQYXlsb2FkU2l6ZSA9IHRoaXMubWF4UGF5bG9hZCAmJlxuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQubmFtZSA9PT0gXCJwb2xsaW5nXCIgJiZcbiAgICAgICAgICAgIHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoID4gMTtcbiAgICAgICAgaWYgKCFzaG91bGRDaGVja1BheWxvYWRTaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF5bG9hZFNpemUgPSAxOyAvLyBmaXJzdCBwYWNrZXQgdHlwZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLndyaXRlQnVmZmVyW2ldLmRhdGE7XG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIHBheWxvYWRTaXplICs9ICgwLCB1dGlsX2pzXzEuYnl0ZUxlbmd0aCkoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSA+IDAgJiYgcGF5bG9hZFNpemUgPiB0aGlzLm1heFBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhcIm9ubHkgc2VuZCAlZCBvdXQgb2YgJWQgcGFja2V0c1wiLCBpLCB0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCdWZmZXIuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXlsb2FkU2l6ZSArPSAyOyAvLyBzZXBhcmF0b3IgKyBwYWNrZXQgdHlwZVxuICAgICAgICB9XG4gICAgICAgIGRlYnVnKFwicGF5bG9hZCBzaXplIGlzICVkIChtYXg6ICVkKVwiLCBwYXlsb2FkU2l6ZSwgdGhpcy5tYXhQYXlsb2FkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCdWZmZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm4ge1NvY2tldH0gZm9yIGNoYWluaW5nLlxuICAgICAqL1xuICAgIHdyaXRlKG1zZywgb3B0aW9ucywgZm4pIHtcbiAgICAgICAgdGhpcy5zZW5kUGFja2V0KFwibWVzc2FnZVwiLCBtc2csIG9wdGlvbnMsIGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNlbmQobXNnLCBvcHRpb25zLCBmbikge1xuICAgICAgICB0aGlzLnNlbmRQYWNrZXQoXCJtZXNzYWdlXCIsIG1zZywgb3B0aW9ucywgZm4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBwYWNrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZTogcGFja2V0IHR5cGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGEuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNlbmRQYWNrZXQodHlwZSwgZGF0YSwgb3B0aW9ucywgZm4pIHtcbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGRhdGEpIHtcbiAgICAgICAgICAgIGZuID0gZGF0YTtcbiAgICAgICAgICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGZuID0gb3B0aW9ucztcbiAgICAgICAgICAgIG9wdGlvbnMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcImNsb3NpbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8IFwiY2xvc2VkXCIgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBvcHRpb25zLmNvbXByZXNzID0gZmFsc2UgIT09IG9wdGlvbnMuY29tcHJlc3M7XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwYWNrZXRDcmVhdGVcIiwgcGFja2V0KTtcbiAgICAgICAgdGhpcy53cml0ZUJ1ZmZlci5wdXNoKHBhY2tldCk7XG4gICAgICAgIGlmIChmbilcbiAgICAgICAgICAgIHRoaXMub25jZShcImZsdXNoXCIsIGZuKTtcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNsb3NlKFwiZm9yY2VkIGNsb3NlXCIpO1xuICAgICAgICAgICAgZGVidWcoXCJzb2NrZXQgY2xvc2luZyAtIHRlbGxpbmcgdHJhbnNwb3J0IHRvIGNsb3NlXCIpO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2xlYW51cEFuZENsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vZmYoXCJ1cGdyYWRlXCIsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLm9mZihcInVwZ3JhZGVFcnJvclwiLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgd2FpdEZvclVwZ3JhZGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyB3YWl0IGZvciB1cGdyYWRlIHRvIGZpbmlzaCBzaW5jZSB3ZSBjYW4ndCBzZW5kIHBhY2tldHMgd2hpbGUgcGF1c2luZyBhIHRyYW5zcG9ydFxuICAgICAgICAgICAgdGhpcy5vbmNlKFwidXBncmFkZVwiLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5vbmNlKFwidXBncmFkZUVycm9yXCIsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8IFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwiY2xvc2luZ1wiO1xuICAgICAgICAgICAgaWYgKHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwiZHJhaW5cIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51cGdyYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnVwZ3JhZGluZykge1xuICAgICAgICAgICAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgZXJyb3JcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25FcnJvcihlcnIpIHtcbiAgICAgICAgZGVidWcoXCJzb2NrZXQgZXJyb3IgJWpcIiwgZXJyKTtcbiAgICAgICAgU29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVycik7XG4gICAgICAgIHRoaXMub25DbG9zZShcInRyYW5zcG9ydCBlcnJvclwiLCBlcnIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgY2xvc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uQ2xvc2UocmVhc29uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBpZiAoXCJvcGVuaW5nXCIgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgICAgICAgXCJvcGVuXCIgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgICAgICAgXCJjbG9zaW5nXCIgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgZGVidWcoJ3NvY2tldCBjbG9zZSB3aXRoIHJlYXNvbjogXCIlc1wiJywgcmVhc29uKTtcbiAgICAgICAgICAgIC8vIGNsZWFyIHRpbWVyc1xuICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVvdXRGbih0aGlzLnBpbmdUaW1lb3V0VGltZXIpO1xuICAgICAgICAgICAgLy8gc3RvcCBldmVudCBmcm9tIGZpcmluZyBhZ2FpbiBmb3IgdHJhbnNwb3J0XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJjbG9zZVwiKTtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0cmFuc3BvcnQgd29uJ3Qgc3RheSBvcGVuXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5jbG9zZSgpO1xuICAgICAgICAgICAgLy8gaWdub3JlIGZ1cnRoZXIgdHJhbnNwb3J0IGNvbW11bmljYXRpb25cbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZW1vdmVFdmVudExpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIHRoaXMuYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIHRoaXMub2ZmbGluZUV2ZW50TGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNldCByZWFkeSBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJjbG9zZWRcIjtcbiAgICAgICAgICAgIC8vIGNsZWFyIHNlc3Npb24gaWRcbiAgICAgICAgICAgIHRoaXMuaWQgPSBudWxsO1xuICAgICAgICAgICAgLy8gZW1pdCBjbG9zZSBldmVudFxuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjbG9zZVwiLCByZWFzb24sIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIC8vIGNsZWFuIGJ1ZmZlcnMgYWZ0ZXIsIHNvIHVzZXJzIGNhbiBzdGlsbFxuICAgICAgICAgICAgLy8gZ3JhYiB0aGUgYnVmZmVycyBvbiBgY2xvc2VgIGV2ZW50XG4gICAgICAgICAgICB0aGlzLndyaXRlQnVmZmVyID0gW107XG4gICAgICAgICAgICB0aGlzLnByZXZCdWZmZXJMZW4gPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdXBncmFkZXMsIHJldHVybmluZyBvbmx5IHRob3NlIG1hdGNoaW5nIGNsaWVudCB0cmFuc3BvcnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gdXBncmFkZXMgLSBzZXJ2ZXIgdXBncmFkZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZpbHRlclVwZ3JhZGVzKHVwZ3JhZGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkVXBncmFkZXMgPSBbXTtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBjb25zdCBqID0gdXBncmFkZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgaWYgKH50aGlzLnRyYW5zcG9ydHMuaW5kZXhPZih1cGdyYWRlc1tpXSkpXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRVcGdyYWRlcy5wdXNoKHVwZ3JhZGVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWRVcGdyYWRlcztcbiAgICB9XG59XG5leHBvcnRzLlNvY2tldCA9IFNvY2tldDtcblNvY2tldC5wcm90b2NvbCA9IGVuZ2luZV9pb19wYXJzZXJfMS5wcm90b2NvbDtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UcmFuc3BvcnQgPSBleHBvcnRzLlRyYW5zcG9ydEVycm9yID0gdm9pZCAwO1xuY29uc3QgZW5naW5lX2lvX3BhcnNlcl8xID0gcmVxdWlyZShcImVuZ2luZS5pby1wYXJzZXJcIik7XG5jb25zdCBjb21wb25lbnRfZW1pdHRlcl8xID0gcmVxdWlyZShcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIik7XG5jb25zdCB1dGlsX2pzXzEgPSByZXF1aXJlKFwiLi91dGlsLmpzXCIpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpOyAvLyBkZWJ1ZygpXG5jb25zdCBwYXJzZXFzX2pzXzEgPSByZXF1aXJlKFwiLi9jb250cmliL3BhcnNlcXMuanNcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKFwiZW5naW5lLmlvLWNsaWVudDp0cmFuc3BvcnRcIik7IC8vIGRlYnVnKClcbmNsYXNzIFRyYW5zcG9ydEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHJlYXNvbiwgZGVzY3JpcHRpb24sIGNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIocmVhc29uKTtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLnR5cGUgPSBcIlRyYW5zcG9ydEVycm9yXCI7XG4gICAgfVxufVxuZXhwb3J0cy5UcmFuc3BvcnRFcnJvciA9IFRyYW5zcG9ydEVycm9yO1xuY2xhc3MgVHJhbnNwb3J0IGV4dGVuZHMgY29tcG9uZW50X2VtaXR0ZXJfMS5FbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBUcmFuc3BvcnQgYWJzdHJhY3QgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgICgwLCB1dGlsX2pzXzEuaW5zdGFsbFRpbWVyRnVuY3Rpb25zKSh0aGlzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5xdWVyeSA9IG9wdHMucXVlcnk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gb3B0cy5zb2NrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHJlYXNvblxuICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvblxuICAgICAqIEBwYXJhbSBjb250ZXh0IC0gdGhlIGVycm9yIGNvbnRleHRcbiAgICAgKiBAcmV0dXJuIHtUcmFuc3BvcnR9IGZvciBjaGFpbmluZ1xuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvbkVycm9yKHJlYXNvbiwgZGVzY3JpcHRpb24sIGNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZXJyb3JcIiwgbmV3IFRyYW5zcG9ydEVycm9yKHJlYXNvbiwgZGVzY3JpcHRpb24sIGNvbnRleHQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQuXG4gICAgICovXG4gICAgb3BlbigpIHtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJvcGVuaW5nXCI7XG4gICAgICAgIHRoaXMuZG9PcGVuKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydC5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gXCJvcGVuaW5nXCIgfHwgdGhpcy5yZWFkeVN0YXRlID09PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgdGhpcy5kb0Nsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLm9uQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgbXVsdGlwbGUgcGFja2V0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2tldHNcbiAgICAgKi9cbiAgICBzZW5kKHBhY2tldHMpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gXCJvcGVuXCIpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGUocGFja2V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGlzIG1pZ2h0IGhhcHBlbiBpZiB0aGUgdHJhbnNwb3J0IHdhcyBzaWxlbnRseSBjbG9zZWQgaW4gdGhlIGJlZm9yZXVubG9hZCBldmVudCBoYW5kbGVyXG4gICAgICAgICAgICBkZWJ1ZyhcInRyYW5zcG9ydCBpcyBub3Qgb3BlbiwgZGlzY2FyZGluZyBwYWNrZXRzXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIG9wZW5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvbk9wZW4oKSB7XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwib3BlblwiO1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwib3BlblwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdpdGggZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG9uRGF0YShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHBhY2tldCA9ICgwLCBlbmdpbmVfaW9fcGFyc2VyXzEuZGVjb2RlUGFja2V0KShkYXRhLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlKTtcbiAgICAgICAgdGhpcy5vblBhY2tldChwYWNrZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2l0aCBhIGRlY29kZWQgcGFja2V0LlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG9uUGFja2V0KHBhY2tldCkge1xuICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJwYWNrZXRcIiwgcGFja2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gY2xvc2UuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgb25DbG9zZShkZXRhaWxzKSB7XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwiY2xvc2VkXCI7XG4gICAgICAgIHN1cGVyLmVtaXRSZXNlcnZlZChcImNsb3NlXCIsIGRldGFpbHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgdGhlIHRyYW5zcG9ydCwgaW4gb3JkZXIgbm90IHRvIGxvc2UgcGFja2V0cyBkdXJpbmcgYW4gdXBncmFkZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvblBhdXNlXG4gICAgICovXG4gICAgcGF1c2Uob25QYXVzZSkgeyB9XG4gICAgY3JlYXRlVXJpKHNjaGVtYSwgcXVlcnkgPSB7fSkge1xuICAgICAgICByZXR1cm4gKHNjaGVtYSArXG4gICAgICAgICAgICBcIjovL1wiICtcbiAgICAgICAgICAgIHRoaXMuX2hvc3RuYW1lKCkgK1xuICAgICAgICAgICAgdGhpcy5fcG9ydCgpICtcbiAgICAgICAgICAgIHRoaXMub3B0cy5wYXRoICtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXJ5KHF1ZXJ5KSk7XG4gICAgfVxuICAgIF9ob3N0bmFtZSgpIHtcbiAgICAgICAgY29uc3QgaG9zdG5hbWUgPSB0aGlzLm9wdHMuaG9zdG5hbWU7XG4gICAgICAgIHJldHVybiBob3N0bmFtZS5pbmRleE9mKFwiOlwiKSA9PT0gLTEgPyBob3N0bmFtZSA6IFwiW1wiICsgaG9zdG5hbWUgKyBcIl1cIjtcbiAgICB9XG4gICAgX3BvcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucG9ydCAmJlxuICAgICAgICAgICAgKCh0aGlzLm9wdHMuc2VjdXJlICYmIE51bWJlcih0aGlzLm9wdHMucG9ydCAhPT0gNDQzKSkgfHxcbiAgICAgICAgICAgICAgICAoIXRoaXMub3B0cy5zZWN1cmUgJiYgTnVtYmVyKHRoaXMub3B0cy5wb3J0KSAhPT0gODApKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiOlwiICsgdGhpcy5vcHRzLnBvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfcXVlcnkocXVlcnkpIHtcbiAgICAgICAgY29uc3QgZW5jb2RlZFF1ZXJ5ID0gKDAsIHBhcnNlcXNfanNfMS5lbmNvZGUpKHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIGVuY29kZWRRdWVyeS5sZW5ndGggPyBcIj9cIiArIGVuY29kZWRRdWVyeSA6IFwiXCI7XG4gICAgfVxufVxuZXhwb3J0cy5UcmFuc3BvcnQgPSBUcmFuc3BvcnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudHJhbnNwb3J0cyA9IHZvaWQgMDtcbmNvbnN0IHBvbGxpbmdfanNfMSA9IHJlcXVpcmUoXCIuL3BvbGxpbmcuanNcIik7XG5jb25zdCB3ZWJzb2NrZXRfanNfMSA9IHJlcXVpcmUoXCIuL3dlYnNvY2tldC5qc1wiKTtcbmNvbnN0IHdlYnRyYW5zcG9ydF9qc18xID0gcmVxdWlyZShcIi4vd2VidHJhbnNwb3J0LmpzXCIpO1xuZXhwb3J0cy50cmFuc3BvcnRzID0ge1xuICAgIHdlYnNvY2tldDogd2Vic29ja2V0X2pzXzEuV1MsXG4gICAgd2VidHJhbnNwb3J0OiB3ZWJ0cmFuc3BvcnRfanNfMS5XVCxcbiAgICBwb2xsaW5nOiBwb2xsaW5nX2pzXzEuUG9sbGluZyxcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVxdWVzdCA9IGV4cG9ydHMuUG9sbGluZyA9IHZvaWQgMDtcbmNvbnN0IHRyYW5zcG9ydF9qc18xID0gcmVxdWlyZShcIi4uL3RyYW5zcG9ydC5qc1wiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTsgLy8gZGVidWcoKVxuY29uc3QgeWVhc3RfanNfMSA9IHJlcXVpcmUoXCIuLi9jb250cmliL3llYXN0LmpzXCIpO1xuY29uc3QgZW5naW5lX2lvX3BhcnNlcl8xID0gcmVxdWlyZShcImVuZ2luZS5pby1wYXJzZXJcIik7XG5jb25zdCB4bWxodHRwcmVxdWVzdF9qc18xID0gcmVxdWlyZShcIi4veG1saHR0cHJlcXVlc3QuanNcIik7XG5jb25zdCBjb21wb25lbnRfZW1pdHRlcl8xID0gcmVxdWlyZShcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIik7XG5jb25zdCB1dGlsX2pzXzEgPSByZXF1aXJlKFwiLi4vdXRpbC5qc1wiKTtcbmNvbnN0IGdsb2JhbFRoaXNfanNfMSA9IHJlcXVpcmUoXCIuLi9nbG9iYWxUaGlzLmpzXCIpO1xuY29uc3QgZGVidWcgPSAoMCwgZGVidWdfMS5kZWZhdWx0KShcImVuZ2luZS5pby1jbGllbnQ6cG9sbGluZ1wiKTsgLy8gZGVidWcoKVxuZnVuY3Rpb24gZW1wdHkoKSB7IH1cbmNvbnN0IGhhc1hIUjIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHhociA9IG5ldyB4bWxodHRwcmVxdWVzdF9qc18xLlhIUih7XG4gICAgICAgIHhkb21haW46IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBudWxsICE9IHhoci5yZXNwb25zZVR5cGU7XG59KSgpO1xuY2xhc3MgUG9sbGluZyBleHRlbmRzIHRyYW5zcG9ydF9qc18xLlRyYW5zcG9ydCB7XG4gICAgLyoqXG4gICAgICogWEhSIFBvbGxpbmcgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqIEBwYWNrYWdlXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy5wb2xsaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzU1NMID0gXCJodHRwczpcIiA9PT0gbG9jYXRpb24ucHJvdG9jb2w7XG4gICAgICAgICAgICBsZXQgcG9ydCA9IGxvY2F0aW9uLnBvcnQ7XG4gICAgICAgICAgICAvLyBzb21lIHVzZXIgYWdlbnRzIGhhdmUgZW1wdHkgYGxvY2F0aW9uLnBvcnRgXG4gICAgICAgICAgICBpZiAoIXBvcnQpIHtcbiAgICAgICAgICAgICAgICBwb3J0ID0gaXNTU0wgPyBcIjQ0M1wiIDogXCI4MFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy54ZCA9XG4gICAgICAgICAgICAgICAgKHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICAgICBvcHRzLmhvc3RuYW1lICE9PSBsb2NhdGlvbi5ob3N0bmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgcG9ydCAhPT0gb3B0cy5wb3J0O1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBYSFIgc3VwcG9ydHMgYmluYXJ5XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBmb3JjZUJhc2U2NCA9IG9wdHMgJiYgb3B0cy5mb3JjZUJhc2U2NDtcbiAgICAgICAgdGhpcy5zdXBwb3J0c0JpbmFyeSA9IGhhc1hIUjIgJiYgIWZvcmNlQmFzZTY0O1xuICAgICAgICBpZiAodGhpcy5vcHRzLndpdGhDcmVkZW50aWFscykge1xuICAgICAgICAgICAgdGhpcy5jb29raWVKYXIgPSAoMCwgeG1saHR0cHJlcXVlc3RfanNfMS5jcmVhdGVDb29raWVKYXIpKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBcInBvbGxpbmdcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHNvY2tldCAodHJpZ2dlcnMgcG9sbGluZykuIFdlIHdyaXRlIGEgUElORyBtZXNzYWdlIHRvIGRldGVybWluZVxuICAgICAqIHdoZW4gdGhlIHRyYW5zcG9ydCBpcyBvcGVuLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGRvT3BlbigpIHtcbiAgICAgICAgdGhpcy5wb2xsKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhdXNlcyBwb2xsaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25QYXVzZSAtIGNhbGxiYWNrIHVwb24gYnVmZmVycyBhcmUgZmx1c2hlZCBhbmQgdHJhbnNwb3J0IGlzIHBhdXNlZFxuICAgICAqIEBwYWNrYWdlXG4gICAgICovXG4gICAgcGF1c2Uob25QYXVzZSkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcInBhdXNpbmdcIjtcbiAgICAgICAgY29uc3QgcGF1c2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBkZWJ1ZyhcInBhdXNlZFwiKTtcbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwicGF1c2VkXCI7XG4gICAgICAgICAgICBvblBhdXNlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnBvbGxpbmcgfHwgIXRoaXMud3JpdGFibGUpIHtcbiAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5wb2xsaW5nKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoXCJ3ZSBhcmUgY3VycmVudGx5IHBvbGxpbmcgLSB3YWl0aW5nIHRvIHBhdXNlXCIpO1xuICAgICAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwicG9sbENvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoXCJwcmUtcGF1c2UgcG9sbGluZyBjb21wbGV0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgLS10b3RhbCB8fCBwYXVzZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLndyaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoXCJ3ZSBhcmUgY3VycmVudGx5IHdyaXRpbmcgLSB3YWl0aW5nIHRvIHBhdXNlXCIpO1xuICAgICAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwiZHJhaW5cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhcInByZS1wYXVzZSB3cml0aW5nIGNvbXBsZXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAtLXRvdGFsIHx8IHBhdXNlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXVzZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBwb2xsaW5nIGN5Y2xlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwb2xsKCkge1xuICAgICAgICBkZWJ1ZyhcInBvbGxpbmdcIik7XG4gICAgICAgIHRoaXMucG9sbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZG9Qb2xsKCk7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicG9sbFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3ZlcmxvYWRzIG9uRGF0YSB0byBkZXRlY3QgcGF5bG9hZHMuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgb25EYXRhKGRhdGEpIHtcbiAgICAgICAgZGVidWcoXCJwb2xsaW5nIGdvdCBkYXRhICVzXCIsIGRhdGEpO1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIC8vIGlmIGl0cyB0aGUgZmlyc3QgbWVzc2FnZSB3ZSBjb25zaWRlciB0aGUgdHJhbnNwb3J0IG9wZW5cbiAgICAgICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlICYmIHBhY2tldC50eXBlID09PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgICAgIHRoaXMub25PcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiBpdHMgYSBjbG9zZSBwYWNrZXQsIHdlIGNsb3NlIHRoZSBvbmdvaW5nIHJlcXVlc3RzXG4gICAgICAgICAgICBpZiAoXCJjbG9zZVwiID09PSBwYWNrZXQudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25DbG9zZSh7IGRlc2NyaXB0aW9uOiBcInRyYW5zcG9ydCBjbG9zZWQgYnkgdGhlIHNlcnZlclwiIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBieXBhc3Mgb25EYXRhIGFuZCBoYW5kbGUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIHRoaXMub25QYWNrZXQocGFja2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gZGVjb2RlIHBheWxvYWRcbiAgICAgICAgKDAsIGVuZ2luZV9pb19wYXJzZXJfMS5kZWNvZGVQYXlsb2FkKShkYXRhLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlKS5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgICAgLy8gaWYgYW4gZXZlbnQgZGlkIG5vdCB0cmlnZ2VyIGNsb3NpbmdcbiAgICAgICAgaWYgKFwiY2xvc2VkXCIgIT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgLy8gaWYgd2UgZ290IGRhdGEgd2UncmUgbm90IHBvbGxpbmdcbiAgICAgICAgICAgIHRoaXMucG9sbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwb2xsQ29tcGxldGVcIik7XG4gICAgICAgICAgICBpZiAoXCJvcGVuXCIgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucG9sbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ2lnbm9yaW5nIHBvbGwgLSB0cmFuc3BvcnQgc3RhdGUgXCIlc1wiJywgdGhpcy5yZWFkeVN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgcG9sbGluZywgc2VuZCBhIGNsb3NlIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICBjb25zdCBjbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGRlYnVnKFwid3JpdGluZyBjbG9zZSBwYWNrZXRcIik7XG4gICAgICAgICAgICB0aGlzLndyaXRlKFt7IHR5cGU6IFwiY2xvc2VcIiB9XSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChcIm9wZW5cIiA9PT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICBkZWJ1ZyhcInRyYW5zcG9ydCBvcGVuIC0gY2xvc2luZ1wiKTtcbiAgICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIHRyeWluZyB0byBjbG9zZSB3aGlsZVxuICAgICAgICAgICAgLy8gaGFuZHNoYWtpbmcgaXMgaW4gcHJvZ3Jlc3MgKEdILTE2NClcbiAgICAgICAgICAgIGRlYnVnKFwidHJhbnNwb3J0IG5vdCBvcGVuIC0gZGVmZXJyaW5nIGNsb3NlXCIpO1xuICAgICAgICAgICAgdGhpcy5vbmNlKFwib3BlblwiLCBjbG9zZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgcGFja2V0cyBwYXlsb2FkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2V0cyAtIGRhdGEgcGFja2V0c1xuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICB3cml0ZShwYWNrZXRzKSB7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgICAgKDAsIGVuZ2luZV9pb19wYXJzZXJfMS5lbmNvZGVQYXlsb2FkKShwYWNrZXRzLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kb1dyaXRlKGRhdGEsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImRyYWluXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdXJpIGZvciBjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB1cmkoKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMub3B0cy5zZWN1cmUgPyBcImh0dHBzXCIgOiBcImh0dHBcIjtcbiAgICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJ5IHx8IHt9O1xuICAgICAgICAvLyBjYWNoZSBidXN0aW5nIGlzIGZvcmNlZFxuICAgICAgICBpZiAoZmFsc2UgIT09IHRoaXMub3B0cy50aW1lc3RhbXBSZXF1ZXN0cykge1xuICAgICAgICAgICAgcXVlcnlbdGhpcy5vcHRzLnRpbWVzdGFtcFBhcmFtXSA9ICgwLCB5ZWFzdF9qc18xLnllYXN0KSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zdXBwb3J0c0JpbmFyeSAmJiAhcXVlcnkuc2lkKSB7XG4gICAgICAgICAgICBxdWVyeS5iNjQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVVyaShzY2hlbWEsIHF1ZXJ5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZXF1ZXN0KG9wdHMgPSB7fSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKG9wdHMsIHsgeGQ6IHRoaXMueGQsIGNvb2tpZUphcjogdGhpcy5jb29raWVKYXIgfSwgdGhpcy5vcHRzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMudXJpKCksIG9wdHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgdG8gc2VuZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsZWQgdXBvbiBmbHVzaC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGRvV3JpdGUoZGF0YSwgZm4pIHtcbiAgICAgICAgY29uc3QgcmVxID0gdGhpcy5yZXF1ZXN0KHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9uKFwic3VjY2Vzc1wiLCBmbik7XG4gICAgICAgIHJlcS5vbihcImVycm9yXCIsICh4aHJTdGF0dXMsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvcihcInhociBwb3N0IGVycm9yXCIsIHhoclN0YXR1cywgY29udGV4dCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgYSBwb2xsIGN5Y2xlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkb1BvbGwoKSB7XG4gICAgICAgIGRlYnVnKFwieGhyIHBvbGxcIik7XG4gICAgICAgIGNvbnN0IHJlcSA9IHRoaXMucmVxdWVzdCgpO1xuICAgICAgICByZXEub24oXCJkYXRhXCIsIHRoaXMub25EYXRhLmJpbmQodGhpcykpO1xuICAgICAgICByZXEub24oXCJlcnJvclwiLCAoeGhyU3RhdHVzLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IoXCJ4aHIgcG9sbCBlcnJvclwiLCB4aHJTdGF0dXMsIGNvbnRleHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb2xsWGhyID0gcmVxO1xuICAgIH1cbn1cbmV4cG9ydHMuUG9sbGluZyA9IFBvbGxpbmc7XG5jbGFzcyBSZXF1ZXN0IGV4dGVuZHMgY29tcG9uZW50X2VtaXR0ZXJfMS5FbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGNvbnN0cnVjdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYWNrYWdlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJpLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgICgwLCB1dGlsX2pzXzEuaW5zdGFsbFRpbWVyRnVuY3Rpb25zKSh0aGlzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBvcHRzLm1ldGhvZCB8fCBcIkdFVFwiO1xuICAgICAgICB0aGlzLnVyaSA9IHVyaTtcbiAgICAgICAgdGhpcy5kYXRhID0gdW5kZWZpbmVkICE9PSBvcHRzLmRhdGEgPyBvcHRzLmRhdGEgOiBudWxsO1xuICAgICAgICB0aGlzLmNyZWF0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBYSFIgb2JqZWN0IGFuZCBzZW5kcyB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY3JlYXRlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG9wdHMgPSAoMCwgdXRpbF9qc18xLnBpY2spKHRoaXMub3B0cywgXCJhZ2VudFwiLCBcInBmeFwiLCBcImtleVwiLCBcInBhc3NwaHJhc2VcIiwgXCJjZXJ0XCIsIFwiY2FcIiwgXCJjaXBoZXJzXCIsIFwicmVqZWN0VW5hdXRob3JpemVkXCIsIFwiYXV0b1VucmVmXCIpO1xuICAgICAgICBvcHRzLnhkb21haW4gPSAhIXRoaXMub3B0cy54ZDtcbiAgICAgICAgY29uc3QgeGhyID0gKHRoaXMueGhyID0gbmV3IHhtbGh0dHByZXF1ZXN0X2pzXzEuWEhSKG9wdHMpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlYnVnKFwieGhyIG9wZW4gJXM6ICVzXCIsIHRoaXMubWV0aG9kLCB0aGlzLnVyaSk7XG4gICAgICAgICAgICB4aHIub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmksIHRydWUpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2V0RGlzYWJsZUhlYWRlckNoZWNrICYmIHhoci5zZXREaXNhYmxlSGVhZGVyQ2hlY2sodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5leHRyYUhlYWRlcnMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihpLCB0aGlzLm9wdHMuZXh0cmFIZWFkZXJzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgICAgIGlmIChcIlBPU1RcIiA9PT0gdGhpcy5tZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLCBcIiovKlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgICAgIChfYSA9IHRoaXMub3B0cy5jb29raWVKYXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hZGRDb29raWVzKHhocik7XG4gICAgICAgICAgICAvLyBpZTYgY2hlY2tcbiAgICAgICAgICAgIGlmIChcIndpdGhDcmVkZW50aWFsc1wiIGluIHhocikge1xuICAgICAgICAgICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLm9wdHMud2l0aENyZWRlbnRpYWxzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5yZXF1ZXN0VGltZW91dCkge1xuICAgICAgICAgICAgICAgIHhoci50aW1lb3V0ID0gdGhpcy5vcHRzLnJlcXVlc3RUaW1lb3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIChfYSA9IHRoaXMub3B0cy5jb29raWVKYXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXJzZUNvb2tpZXMoeGhyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKDQgIT09IHhoci5yZWFkeVN0YXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKDIwMCA9PT0geGhyLnN0YXR1cyB8fCAxMjIzID09PSB4aHIuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Mb2FkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGBlcnJvcmAgZXZlbnQgaGFuZGxlciB0aGF0J3MgdXNlci1zZXRcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3QgdGhyb3cgaW4gdGhlIHNhbWUgdGljayBhbmQgZ2V0cyBjYXVnaHQgaGVyZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IodHlwZW9mIHhoci5zdGF0dXMgPT09IFwibnVtYmVyXCIgPyB4aHIuc3RhdHVzIDogMCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkZWJ1ZyhcInhociBkYXRhICVzXCIsIHRoaXMuZGF0YSk7XG4gICAgICAgICAgICB4aHIuc2VuZCh0aGlzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBOZWVkIHRvIGRlZmVyIHNpbmNlIC5jcmVhdGUoKSBpcyBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgY29uc3RydWN0b3JcbiAgICAgICAgICAgIC8vIGFuZCB0aHVzIHRoZSAnZXJyb3InIGV2ZW50IGNhbiBvbmx5IGJlIG9ubHkgYm91bmQgKmFmdGVyKiB0aGlzIGV4Y2VwdGlvblxuICAgICAgICAgICAgLy8gb2NjdXJzLiAgVGhlcmVmb3JlLCBhbHNvLCB3ZSBjYW5ub3QgdGhyb3cgaGVyZSBhdCBhbGwuXG4gICAgICAgICAgICB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGUpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5pbmRleCA9IFJlcXVlc3QucmVxdWVzdHNDb3VudCsrO1xuICAgICAgICAgICAgUmVxdWVzdC5yZXF1ZXN0c1t0aGlzLmluZGV4XSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uRXJyb3IoZXJyKSB7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZXJyb3JcIiwgZXJyLCB0aGlzLnhocik7XG4gICAgICAgIHRoaXMuY2xlYW51cCh0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIGhvdXNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjbGVhbnVwKGZyb21FcnJvcikge1xuICAgICAgICBpZiAoXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIHRoaXMueGhyIHx8IG51bGwgPT09IHRoaXMueGhyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZW1wdHk7XG4gICAgICAgIGlmIChmcm9tRXJyb3IpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy54aHIuYWJvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBkZWxldGUgUmVxdWVzdC5yZXF1ZXN0c1t0aGlzLmluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnhociA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGxvYWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uTG9hZCgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMueGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgaWYgKGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZGF0YVwiLCBkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwic3VjY2Vzc1wiKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFib3J0cyB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYWNrYWdlXG4gICAgICovXG4gICAgYWJvcnQoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdCA9IFJlcXVlc3Q7XG5SZXF1ZXN0LnJlcXVlc3RzQ291bnQgPSAwO1xuUmVxdWVzdC5yZXF1ZXN0cyA9IHt9O1xuLyoqXG4gKiBBYm9ydHMgcGVuZGluZyByZXF1ZXN0cyB3aGVuIHVubG9hZGluZyB0aGUgd2luZG93LiBUaGlzIGlzIG5lZWRlZCB0byBwcmV2ZW50XG4gKiBtZW1vcnkgbGVha3MgKGUuZy4gd2hlbiB1c2luZyBJRSkgYW5kIHRvIGVuc3VyZSB0aGF0IG5vIHNwdXJpb3VzIGVycm9yIGlzXG4gKiBlbWl0dGVkLlxuICovXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgYXR0YWNoRXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGF0dGFjaEV2ZW50KFwib251bmxvYWRcIiwgdW5sb2FkSGFuZGxlcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBhZGRFdmVudExpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgdGVybWluYXRpb25FdmVudCA9IFwib25wYWdlaGlkZVwiIGluIGdsb2JhbFRoaXNfanNfMS5nbG9iYWxUaGlzU2hpbSA/IFwicGFnZWhpZGVcIiA6IFwidW5sb2FkXCI7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIodGVybWluYXRpb25FdmVudCwgdW5sb2FkSGFuZGxlciwgZmFsc2UpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVubG9hZEhhbmRsZXIoKSB7XG4gICAgZm9yIChsZXQgaSBpbiBSZXF1ZXN0LnJlcXVlc3RzKSB7XG4gICAgICAgIGlmIChSZXF1ZXN0LnJlcXVlc3RzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICBSZXF1ZXN0LnJlcXVlc3RzW2ldLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdEJpbmFyeVR5cGUgPSBleHBvcnRzLnVzaW5nQnJvd3NlcldlYlNvY2tldCA9IGV4cG9ydHMuV2ViU29ja2V0ID0gZXhwb3J0cy5uZXh0VGljayA9IHZvaWQgMDtcbmNvbnN0IGdsb2JhbFRoaXNfanNfMSA9IHJlcXVpcmUoXCIuLi9nbG9iYWxUaGlzLmpzXCIpO1xuZXhwb3J0cy5uZXh0VGljayA9ICgoKSA9PiB7XG4gICAgY29uc3QgaXNQcm9taXNlQXZhaWxhYmxlID0gdHlwZW9mIFByb21pc2UgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgUHJvbWlzZS5yZXNvbHZlID09PSBcImZ1bmN0aW9uXCI7XG4gICAgaWYgKGlzUHJvbWlzZUF2YWlsYWJsZSkge1xuICAgICAgICByZXR1cm4gKGNiKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGNiKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiAoY2IsIHNldFRpbWVvdXRGbikgPT4gc2V0VGltZW91dEZuKGNiLCAwKTtcbiAgICB9XG59KSgpO1xuZXhwb3J0cy5XZWJTb2NrZXQgPSBnbG9iYWxUaGlzX2pzXzEuZ2xvYmFsVGhpc1NoaW0uV2ViU29ja2V0IHx8IGdsb2JhbFRoaXNfanNfMS5nbG9iYWxUaGlzU2hpbS5Nb3pXZWJTb2NrZXQ7XG5leHBvcnRzLnVzaW5nQnJvd3NlcldlYlNvY2tldCA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHRCaW5hcnlUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldTID0gdm9pZCAwO1xuY29uc3QgdHJhbnNwb3J0X2pzXzEgPSByZXF1aXJlKFwiLi4vdHJhbnNwb3J0LmpzXCIpO1xuY29uc3QgeWVhc3RfanNfMSA9IHJlcXVpcmUoXCIuLi9jb250cmliL3llYXN0LmpzXCIpO1xuY29uc3QgdXRpbF9qc18xID0gcmVxdWlyZShcIi4uL3V0aWwuanNcIik7XG5jb25zdCB3ZWJzb2NrZXRfY29uc3RydWN0b3JfanNfMSA9IHJlcXVpcmUoXCIuL3dlYnNvY2tldC1jb25zdHJ1Y3Rvci5qc1wiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTsgLy8gZGVidWcoKVxuY29uc3QgZW5naW5lX2lvX3BhcnNlcl8xID0gcmVxdWlyZShcImVuZ2luZS5pby1wYXJzZXJcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKFwiZW5naW5lLmlvLWNsaWVudDp3ZWJzb2NrZXRcIik7IC8vIGRlYnVnKClcbi8vIGRldGVjdCBSZWFjdE5hdGl2ZSBlbnZpcm9ubWVudFxuY29uc3QgaXNSZWFjdE5hdGl2ZSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2YgbmF2aWdhdG9yLnByb2R1Y3QgPT09IFwic3RyaW5nXCIgJiZcbiAgICBuYXZpZ2F0b3IucHJvZHVjdC50b0xvd2VyQ2FzZSgpID09PSBcInJlYWN0bmF0aXZlXCI7XG5jbGFzcyBXUyBleHRlbmRzIHRyYW5zcG9ydF9qc18xLlRyYW5zcG9ydCB7XG4gICAgLyoqXG4gICAgICogV2ViU29ja2V0IHRyYW5zcG9ydCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gY29ubmVjdGlvbiBvcHRpb25zXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSAhb3B0cy5mb3JjZUJhc2U2NDtcbiAgICB9XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBcIndlYnNvY2tldFwiO1xuICAgIH1cbiAgICBkb09wZW4oKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGVjaygpKSB7XG4gICAgICAgICAgICAvLyBsZXQgcHJvYmUgdGltZW91dFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IHRoaXMudXJpKCk7XG4gICAgICAgIGNvbnN0IHByb3RvY29scyA9IHRoaXMub3B0cy5wcm90b2NvbHM7XG4gICAgICAgIC8vIFJlYWN0IE5hdGl2ZSBvbmx5IHN1cHBvcnRzIHRoZSAnaGVhZGVycycgb3B0aW9uLCBhbmQgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgYW55dGhpbmcgZWxzZSBpcyBwYXNzZWRcbiAgICAgICAgY29uc3Qgb3B0cyA9IGlzUmVhY3ROYXRpdmVcbiAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgIDogKDAsIHV0aWxfanNfMS5waWNrKSh0aGlzLm9wdHMsIFwiYWdlbnRcIiwgXCJwZXJNZXNzYWdlRGVmbGF0ZVwiLCBcInBmeFwiLCBcImtleVwiLCBcInBhc3NwaHJhc2VcIiwgXCJjZXJ0XCIsIFwiY2FcIiwgXCJjaXBoZXJzXCIsIFwicmVqZWN0VW5hdXRob3JpemVkXCIsIFwibG9jYWxBZGRyZXNzXCIsIFwicHJvdG9jb2xWZXJzaW9uXCIsIFwib3JpZ2luXCIsIFwibWF4UGF5bG9hZFwiLCBcImZhbWlseVwiLCBcImNoZWNrU2VydmVySWRlbnRpdHlcIik7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZXh0cmFIZWFkZXJzKSB7XG4gICAgICAgICAgICBvcHRzLmhlYWRlcnMgPSB0aGlzLm9wdHMuZXh0cmFIZWFkZXJzO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLndzID1cbiAgICAgICAgICAgICAgICB3ZWJzb2NrZXRfY29uc3RydWN0b3JfanNfMS51c2luZ0Jyb3dzZXJXZWJTb2NrZXQgJiYgIWlzUmVhY3ROYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBwcm90b2NvbHNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLldlYlNvY2tldCh1cmksIHByb3RvY29scylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLldlYlNvY2tldCh1cmkpXG4gICAgICAgICAgICAgICAgICAgIDogbmV3IHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLldlYlNvY2tldCh1cmksIHByb3RvY29scywgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdFJlc2VydmVkKFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndzLmJpbmFyeVR5cGUgPSB0aGlzLnNvY2tldC5iaW5hcnlUeXBlO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBzb2NrZXRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICAgIHRoaXMud3Mub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5hdXRvVW5yZWYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndzLl9zb2NrZXQudW5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25PcGVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud3Mub25jbG9zZSA9IChjbG9zZUV2ZW50KSA9PiB0aGlzLm9uQ2xvc2Uoe1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwid2Vic29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBjbG9zZUV2ZW50LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy53cy5vbm1lc3NhZ2UgPSAoZXYpID0+IHRoaXMub25EYXRhKGV2LmRhdGEpO1xuICAgICAgICB0aGlzLndzLm9uZXJyb3IgPSAoZSkgPT4gdGhpcy5vbkVycm9yKFwid2Vic29ja2V0IGVycm9yXCIsIGUpO1xuICAgIH1cbiAgICB3cml0ZShwYWNrZXRzKSB7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgICAgLy8gZW5jb2RlUGFja2V0IGVmZmljaWVudCBhcyBpdCB1c2VzIFdTIGZyYW1pbmdcbiAgICAgICAgLy8gbm8gbmVlZCBmb3IgZW5jb2RlUGF5bG9hZFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhY2tldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhY2tldCA9IHBhY2tldHNbaV07XG4gICAgICAgICAgICBjb25zdCBsYXN0UGFja2V0ID0gaSA9PT0gcGFja2V0cy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgKDAsIGVuZ2luZV9pb19wYXJzZXJfMS5lbmNvZGVQYWNrZXQpKHBhY2tldCwgdGhpcy5zdXBwb3J0c0JpbmFyeSwgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBhbHdheXMgY3JlYXRlIGEgbmV3IG9iamVjdCAoR0gtNDM3KVxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdHMgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoIXdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLnVzaW5nQnJvd3NlcldlYlNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFja2V0Lm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuY29tcHJlc3MgPSBwYWNrZXQub3B0aW9ucy5jb21wcmVzcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLnBlck1lc3NhZ2VEZWZsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW4gPSBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBkYXRhID8gQnVmZmVyLmJ5dGVMZW5ndGgoZGF0YSkgOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPCB0aGlzLm9wdHMucGVyTWVzc2FnZURlZmxhdGUudGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5jb21wcmVzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB0aGUgd2Vic29ja2V0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIGJ1dCB0aGUgYnJvd3NlciBkaWRuJ3RcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGEgY2hhbmNlIG9mIGluZm9ybWluZyB1cyBhYm91dCBpdCB5ZXQsIGluIHRoYXQgY2FzZSBzZW5kIHdpbGxcbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3ZWJzb2NrZXRfY29uc3RydWN0b3JfanNfMS51c2luZ0Jyb3dzZXJXZWJTb2NrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVFcnJvciBpcyB0aHJvd24gd2hlbiBwYXNzaW5nIHRoZSBzZWNvbmQgYXJndW1lbnQgb24gU2FmYXJpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndzLnNlbmQoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndzLnNlbmQoZGF0YSwgb3B0cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoXCJ3ZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSBvbmNsb3NlIGV2ZW50XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmYWtlIGRyYWluXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlZmVyIHRvIG5leHQgdGljayB0byBhbGxvdyBTb2NrZXQgdG8gY2xlYXIgd3JpdGVCdWZmZXJcbiAgICAgICAgICAgICAgICAgICAgKDAsIHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLm5leHRUaWNrKSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2V0VGltZW91dEZuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMud3MgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMud3MuY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMud3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB1cmkgZm9yIGNvbm5lY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHVyaSgpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5vcHRzLnNlY3VyZSA/IFwid3NzXCIgOiBcIndzXCI7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeSB8fCB7fTtcbiAgICAgICAgLy8gYXBwZW5kIHRpbWVzdGFtcCB0byBVUklcbiAgICAgICAgaWYgKHRoaXMub3B0cy50aW1lc3RhbXBSZXF1ZXN0cykge1xuICAgICAgICAgICAgcXVlcnlbdGhpcy5vcHRzLnRpbWVzdGFtcFBhcmFtXSA9ICgwLCB5ZWFzdF9qc18xLnllYXN0KSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbW11bmljYXRlIGJpbmFyeSBzdXBwb3J0IGNhcGFiaWxpdGllc1xuICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHNCaW5hcnkpIHtcbiAgICAgICAgICAgIHF1ZXJ5LmI2NCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVXJpKHNjaGVtYSwgcXVlcnkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZWF0dXJlIGRldGVjdGlvbiBmb3IgV2ViU29ja2V0LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBhdmFpbGFibGUuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjaGVjaygpIHtcbiAgICAgICAgcmV0dXJuICEhd2Vic29ja2V0X2NvbnN0cnVjdG9yX2pzXzEuV2ViU29ja2V0O1xuICAgIH1cbn1cbmV4cG9ydHMuV1MgPSBXUztcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5XVCA9IHZvaWQgMDtcbmNvbnN0IHRyYW5zcG9ydF9qc18xID0gcmVxdWlyZShcIi4uL3RyYW5zcG9ydC5qc1wiKTtcbmNvbnN0IHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xID0gcmVxdWlyZShcIi4vd2Vic29ja2V0LWNvbnN0cnVjdG9yLmpzXCIpO1xuY29uc3QgZW5naW5lX2lvX3BhcnNlcl8xID0gcmVxdWlyZShcImVuZ2luZS5pby1wYXJzZXJcIik7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7IC8vIGRlYnVnKClcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoXCJlbmdpbmUuaW8tY2xpZW50OndlYnRyYW5zcG9ydFwiKTsgLy8gZGVidWcoKVxuY2xhc3MgV1QgZXh0ZW5kcyB0cmFuc3BvcnRfanNfMS5UcmFuc3BvcnQge1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gXCJ3ZWJ0cmFuc3BvcnRcIjtcbiAgICB9XG4gICAgZG9PcGVuKCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0eXBlb2YgV2ViVHJhbnNwb3J0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMudHJhbnNwb3J0ID0gbmV3IFdlYlRyYW5zcG9ydCh0aGlzLmNyZWF0ZVVyaShcImh0dHBzXCIpLCB0aGlzLm9wdHMudHJhbnNwb3J0T3B0aW9uc1t0aGlzLm5hbWVdKTtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQuY2xvc2VkXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkZWJ1ZyhcInRyYW5zcG9ydCBjbG9zZWQgZ3JhY2VmdWxseVwiKTtcbiAgICAgICAgICAgIHRoaXMub25DbG9zZSgpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGRlYnVnKFwidHJhbnNwb3J0IGNsb3NlZCBkdWUgdG8gJXNcIiwgZXJyKTtcbiAgICAgICAgICAgIHRoaXMub25FcnJvcihcIndlYnRyYW5zcG9ydCBlcnJvclwiLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gbm90ZTogd2UgY291bGQgaGF2ZSB1c2VkIGFzeW5jL2F3YWl0LCBidXQgdGhhdCB3b3VsZCByZXF1aXJlIHNvbWUgYWRkaXRpb25hbCBwb2x5ZmlsbHNcbiAgICAgICAgdGhpcy50cmFuc3BvcnQucmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5jcmVhdGVCaWRpcmVjdGlvbmFsU3RyZWFtKCkudGhlbigoc3RyZWFtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVjb2RlclN0cmVhbSA9ICgwLCBlbmdpbmVfaW9fcGFyc2VyXzEuY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbSkoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIHRoaXMuc29ja2V0LmJpbmFyeVR5cGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5yZWFkYWJsZS5waXBlVGhyb3VnaChkZWNvZGVyU3RyZWFtKS5nZXRSZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVyU3RyZWFtID0gKDAsIGVuZ2luZV9pb19wYXJzZXJfMS5jcmVhdGVQYWNrZXRFbmNvZGVyU3RyZWFtKSgpO1xuICAgICAgICAgICAgICAgIGVuY29kZXJTdHJlYW0ucmVhZGFibGUucGlwZVRvKHN0cmVhbS53cml0YWJsZSk7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZXIgPSBlbmNvZGVyU3RyZWFtLndyaXRhYmxlLmdldFdyaXRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHsgZG9uZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhcInNlc3Npb24gaXMgY2xvc2VkXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKFwicmVjZWl2ZWQgY2h1bms6ICVvXCIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QYWNrZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKFwiYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZzogJXNcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZWFkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFja2V0ID0geyB0eXBlOiBcIm9wZW5cIiB9O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5LnNpZCkge1xuICAgICAgICAgICAgICAgICAgICBwYWNrZXQuZGF0YSA9IGB7XCJzaWRcIjpcIiR7dGhpcy5xdWVyeS5zaWR9XCJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZXIud3JpdGUocGFja2V0KS50aGVuKCgpID0+IHRoaXMub25PcGVuKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3cml0ZShwYWNrZXRzKSB7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWNrZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYWNrZXQgPSBwYWNrZXRzW2ldO1xuICAgICAgICAgICAgY29uc3QgbGFzdFBhY2tldCA9IGkgPT09IHBhY2tldHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVyLndyaXRlKHBhY2tldCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RQYWNrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHdlYnNvY2tldF9jb25zdHJ1Y3Rvcl9qc18xLm5leHRUaWNrKSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2V0VGltZW91dEZuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMudHJhbnNwb3J0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xvc2UoKTtcbiAgICB9XG59XG5leHBvcnRzLldUID0gV1Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIGJyb3dzZXIgc2hpbSBmb3IgeG1saHR0cHJlcXVlc3QgbW9kdWxlXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUNvb2tpZUphciA9IGV4cG9ydHMuWEhSID0gdm9pZCAwO1xuY29uc3QgaGFzX2NvcnNfanNfMSA9IHJlcXVpcmUoXCIuLi9jb250cmliL2hhcy1jb3JzLmpzXCIpO1xuY29uc3QgZ2xvYmFsVGhpc19qc18xID0gcmVxdWlyZShcIi4uL2dsb2JhbFRoaXMuanNcIik7XG5mdW5jdGlvbiBYSFIob3B0cykge1xuICAgIGNvbnN0IHhkb21haW4gPSBvcHRzLnhkb21haW47XG4gICAgLy8gWE1MSHR0cFJlcXVlc3QgY2FuIGJlIGRpc2FibGVkIG9uIElFXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAmJiAoIXhkb21haW4gfHwgaGFzX2NvcnNfanNfMS5oYXNDT1JTKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7IH1cbiAgICBpZiAoIXhkb21haW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgZ2xvYmFsVGhpc19qc18xLmdsb2JhbFRoaXNTaGltW1tcIkFjdGl2ZVwiXS5jb25jYXQoXCJPYmplY3RcIikuam9pbihcIlhcIildKFwiTWljcm9zb2Z0LlhNTEhUVFBcIik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgIH1cbn1cbmV4cG9ydHMuWEhSID0gWEhSO1xuZnVuY3Rpb24gY3JlYXRlQ29va2llSmFyKCkgeyB9XG5leHBvcnRzLmNyZWF0ZUNvb2tpZUphciA9IGNyZWF0ZUNvb2tpZUphcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5ieXRlTGVuZ3RoID0gZXhwb3J0cy5pbnN0YWxsVGltZXJGdW5jdGlvbnMgPSBleHBvcnRzLnBpY2sgPSB2b2lkIDA7XG5jb25zdCBnbG9iYWxUaGlzX2pzXzEgPSByZXF1aXJlKFwiLi9nbG9iYWxUaGlzLmpzXCIpO1xuZnVuY3Rpb24gcGljayhvYmosIC4uLmF0dHIpIHtcbiAgICByZXR1cm4gYXR0ci5yZWR1Y2UoKGFjYywgaykgPT4ge1xuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICBhY2Nba10gPSBvYmpba107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5leHBvcnRzLnBpY2sgPSBwaWNrO1xuLy8gS2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgcmVhbCB0aW1lb3V0IGZ1bmN0aW9ucyBzbyB0aGV5IGNhbiBiZSB1c2VkIHdoZW4gb3ZlcnJpZGRlblxuY29uc3QgTkFUSVZFX1NFVF9USU1FT1VUID0gZ2xvYmFsVGhpc19qc18xLmdsb2JhbFRoaXNTaGltLnNldFRpbWVvdXQ7XG5jb25zdCBOQVRJVkVfQ0xFQVJfVElNRU9VVCA9IGdsb2JhbFRoaXNfanNfMS5nbG9iYWxUaGlzU2hpbS5jbGVhclRpbWVvdXQ7XG5mdW5jdGlvbiBpbnN0YWxsVGltZXJGdW5jdGlvbnMob2JqLCBvcHRzKSB7XG4gICAgaWYgKG9wdHMudXNlTmF0aXZlVGltZXJzKSB7XG4gICAgICAgIG9iai5zZXRUaW1lb3V0Rm4gPSBOQVRJVkVfU0VUX1RJTUVPVVQuYmluZChnbG9iYWxUaGlzX2pzXzEuZ2xvYmFsVGhpc1NoaW0pO1xuICAgICAgICBvYmouY2xlYXJUaW1lb3V0Rm4gPSBOQVRJVkVfQ0xFQVJfVElNRU9VVC5iaW5kKGdsb2JhbFRoaXNfanNfMS5nbG9iYWxUaGlzU2hpbSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvYmouc2V0VGltZW91dEZuID0gZ2xvYmFsVGhpc19qc18xLmdsb2JhbFRoaXNTaGltLnNldFRpbWVvdXQuYmluZChnbG9iYWxUaGlzX2pzXzEuZ2xvYmFsVGhpc1NoaW0pO1xuICAgICAgICBvYmouY2xlYXJUaW1lb3V0Rm4gPSBnbG9iYWxUaGlzX2pzXzEuZ2xvYmFsVGhpc1NoaW0uY2xlYXJUaW1lb3V0LmJpbmQoZ2xvYmFsVGhpc19qc18xLmdsb2JhbFRoaXNTaGltKTtcbiAgICB9XG59XG5leHBvcnRzLmluc3RhbGxUaW1lckZ1bmN0aW9ucyA9IGluc3RhbGxUaW1lckZ1bmN0aW9ucztcbi8vIGJhc2U2NCBlbmNvZGVkIGJ1ZmZlcnMgYXJlIGFib3V0IDMzJSBiaWdnZXIgKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NClcbmNvbnN0IEJBU0U2NF9PVkVSSEVBRCA9IDEuMzM7XG4vLyB3ZSBjb3VsZCBhbHNvIGhhdmUgdXNlZCBgbmV3IEJsb2IoW29ial0pLnNpemVgLCBidXQgaXQgaXNuJ3Qgc3VwcG9ydGVkIGluIElFOVxuZnVuY3Rpb24gYnl0ZUxlbmd0aChvYmopIHtcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gdXRmOExlbmd0aChvYmopO1xuICAgIH1cbiAgICAvLyBhcnJheWJ1ZmZlciBvciBibG9iXG4gICAgcmV0dXJuIE1hdGguY2VpbCgob2JqLmJ5dGVMZW5ndGggfHwgb2JqLnNpemUpICogQkFTRTY0X09WRVJIRUFEKTtcbn1cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7XG5mdW5jdGlvbiB1dGY4TGVuZ3RoKHN0cikge1xuICAgIGxldCBjID0gMCwgbGVuZ3RoID0gMDtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHN0ci5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgIGxlbmd0aCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgbGVuZ3RoICs9IDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4ZDgwMCB8fCBjID49IDB4ZTAwMCkge1xuICAgICAgICAgICAgbGVuZ3RoICs9IDM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBsZW5ndGggKz0gNDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGVuZ3RoO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkVSUk9SX1BBQ0tFVCA9IGV4cG9ydHMuUEFDS0VUX1RZUEVTX1JFVkVSU0UgPSBleHBvcnRzLlBBQ0tFVF9UWVBFUyA9IHZvaWQgMDtcbmNvbnN0IFBBQ0tFVF9UWVBFUyA9IE9iamVjdC5jcmVhdGUobnVsbCk7IC8vIG5vIE1hcCA9IG5vIHBvbHlmaWxsXG5leHBvcnRzLlBBQ0tFVF9UWVBFUyA9IFBBQ0tFVF9UWVBFUztcblBBQ0tFVF9UWVBFU1tcIm9wZW5cIl0gPSBcIjBcIjtcblBBQ0tFVF9UWVBFU1tcImNsb3NlXCJdID0gXCIxXCI7XG5QQUNLRVRfVFlQRVNbXCJwaW5nXCJdID0gXCIyXCI7XG5QQUNLRVRfVFlQRVNbXCJwb25nXCJdID0gXCIzXCI7XG5QQUNLRVRfVFlQRVNbXCJtZXNzYWdlXCJdID0gXCI0XCI7XG5QQUNLRVRfVFlQRVNbXCJ1cGdyYWRlXCJdID0gXCI1XCI7XG5QQUNLRVRfVFlQRVNbXCJub29wXCJdID0gXCI2XCI7XG5jb25zdCBQQUNLRVRfVFlQRVNfUkVWRVJTRSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnRzLlBBQ0tFVF9UWVBFU19SRVZFUlNFID0gUEFDS0VUX1RZUEVTX1JFVkVSU0U7XG5PYmplY3Qua2V5cyhQQUNLRVRfVFlQRVMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIFBBQ0tFVF9UWVBFU19SRVZFUlNFW1BBQ0tFVF9UWVBFU1trZXldXSA9IGtleTtcbn0pO1xuY29uc3QgRVJST1JfUEFDS0VUID0geyB0eXBlOiBcImVycm9yXCIsIGRhdGE6IFwicGFyc2VyIGVycm9yXCIgfTtcbmV4cG9ydHMuRVJST1JfUEFDS0VUID0gRVJST1JfUEFDS0VUO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMuZW5jb2RlID0gdm9pZCAwO1xuLy8gaW1wb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc29ja2V0aW8vYmFzZTY0LWFycmF5YnVmZmVyXG5jb25zdCBjaGFycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcbi8vIFVzZSBhIGxvb2t1cCB0YWJsZSB0byBmaW5kIHRoZSBpbmRleC5cbmNvbnN0IGxvb2t1cCA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IFtdIDogbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpO1xufVxuY29uc3QgZW5jb2RlID0gKGFycmF5YnVmZmVyKSA9PiB7XG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107XG4gICAgfVxuICAgIGlmIChsZW4gJSAzID09PSAyKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nO1xuICAgIH1cbiAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JztcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U2NDtcbn07XG5leHBvcnRzLmVuY29kZSA9IGVuY29kZTtcbmNvbnN0IGRlY29kZSA9IChiYXNlNjQpID0+IHtcbiAgICBsZXQgYnVmZmVyTGVuZ3RoID0gYmFzZTY0Lmxlbmd0aCAqIDAuNzUsIGxlbiA9IGJhc2U2NC5sZW5ndGgsIGksIHAgPSAwLCBlbmNvZGVkMSwgZW5jb2RlZDIsIGVuY29kZWQzLCBlbmNvZGVkNDtcbiAgICBpZiAoYmFzZTY0W2Jhc2U2NC5sZW5ndGggLSAxXSA9PT0gJz0nKSB7XG4gICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICBpZiAoYmFzZTY0W2Jhc2U2NC5sZW5ndGggLSAyXSA9PT0gJz0nKSB7XG4gICAgICAgICAgICBidWZmZXJMZW5ndGgtLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhcnJheWJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXJMZW5ndGgpLCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICAgICAgZW5jb2RlZDEgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSldO1xuICAgICAgICBlbmNvZGVkMiA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMSldO1xuICAgICAgICBlbmNvZGVkMyA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMildO1xuICAgICAgICBlbmNvZGVkNCA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMyldO1xuICAgICAgICBieXRlc1twKytdID0gKGVuY29kZWQxIDw8IDIpIHwgKGVuY29kZWQyID4+IDQpO1xuICAgICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMiAmIDE1KSA8PCA0KSB8IChlbmNvZGVkMyA+PiAyKTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9ICgoZW5jb2RlZDMgJiAzKSA8PCA2KSB8IChlbmNvZGVkNCAmIDYzKTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5YnVmZmVyO1xufTtcbmV4cG9ydHMuZGVjb2RlID0gZGVjb2RlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlY29kZVBhY2tldCA9IHZvaWQgMDtcbmNvbnN0IGNvbW1vbnNfanNfMSA9IHJlcXVpcmUoXCIuL2NvbW1vbnMuanNcIik7XG5jb25zdCBiYXNlNjRfYXJyYXlidWZmZXJfanNfMSA9IHJlcXVpcmUoXCIuL2NvbnRyaWIvYmFzZTY0LWFycmF5YnVmZmVyLmpzXCIpO1xuY29uc3Qgd2l0aE5hdGl2ZUFycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyID09PSBcImZ1bmN0aW9uXCI7XG5jb25zdCBkZWNvZGVQYWNrZXQgPSAoZW5jb2RlZFBhY2tldCwgYmluYXJ5VHlwZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgZW5jb2RlZFBhY2tldCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICBkYXRhOiBtYXBCaW5hcnkoZW5jb2RlZFBhY2tldCwgYmluYXJ5VHlwZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBlbmNvZGVkUGFja2V0LmNoYXJBdCgwKTtcbiAgICBpZiAodHlwZSA9PT0gXCJiXCIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgZGF0YTogZGVjb2RlQmFzZTY0UGFja2V0KGVuY29kZWRQYWNrZXQuc3Vic3RyaW5nKDEpLCBiaW5hcnlUeXBlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcGFja2V0VHlwZSA9IGNvbW1vbnNfanNfMS5QQUNLRVRfVFlQRVNfUkVWRVJTRVt0eXBlXTtcbiAgICBpZiAoIXBhY2tldFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbW1vbnNfanNfMS5FUlJPUl9QQUNLRVQ7XG4gICAgfVxuICAgIHJldHVybiBlbmNvZGVkUGFja2V0Lmxlbmd0aCA+IDFcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eXBlOiBjb21tb25zX2pzXzEuUEFDS0VUX1RZUEVTX1JFVkVSU0VbdHlwZV0sXG4gICAgICAgICAgICBkYXRhOiBlbmNvZGVkUGFja2V0LnN1YnN0cmluZygxKSxcbiAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHR5cGU6IGNvbW1vbnNfanNfMS5QQUNLRVRfVFlQRVNfUkVWRVJTRVt0eXBlXSxcbiAgICAgICAgfTtcbn07XG5leHBvcnRzLmRlY29kZVBhY2tldCA9IGRlY29kZVBhY2tldDtcbmNvbnN0IGRlY29kZUJhc2U2NFBhY2tldCA9IChkYXRhLCBiaW5hcnlUeXBlKSA9PiB7XG4gICAgaWYgKHdpdGhOYXRpdmVBcnJheUJ1ZmZlcikge1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gKDAsIGJhc2U2NF9hcnJheWJ1ZmZlcl9qc18xLmRlY29kZSkoZGF0YSk7XG4gICAgICAgIHJldHVybiBtYXBCaW5hcnkoZGVjb2RlZCwgYmluYXJ5VHlwZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4geyBiYXNlNjQ6IHRydWUsIGRhdGEgfTsgLy8gZmFsbGJhY2sgZm9yIG9sZCBicm93c2Vyc1xuICAgIH1cbn07XG5jb25zdCBtYXBCaW5hcnkgPSAoZGF0YSwgYmluYXJ5VHlwZSkgPT4ge1xuICAgIHN3aXRjaCAoYmluYXJ5VHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiOlxuICAgICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgICAgICAgICAgLy8gZnJvbSBXZWJTb2NrZXQgKyBiaW5hcnlUeXBlIFwiYmxvYlwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIEhUVFAgbG9uZy1wb2xsaW5nIG9yIFdlYlRyYW5zcG9ydFxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmxvYihbZGF0YV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYXJyYXlidWZmZXJcIjpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIEhUVFAgbG9uZy1wb2xsaW5nIChiYXNlNjQpIG9yIFdlYlNvY2tldCArIGJpbmFyeVR5cGUgXCJhcnJheWJ1ZmZlclwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIFdlYlRyYW5zcG9ydCAoVWludDhBcnJheSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgfVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5lbmNvZGVQYWNrZXQgPSBleHBvcnRzLmVuY29kZVBhY2tldFRvQmluYXJ5ID0gdm9pZCAwO1xuY29uc3QgY29tbW9uc19qc18xID0gcmVxdWlyZShcIi4vY29tbW9ucy5qc1wiKTtcbmNvbnN0IHdpdGhOYXRpdmVCbG9iID0gdHlwZW9mIEJsb2IgPT09IFwiZnVuY3Rpb25cIiB8fFxuICAgICh0eXBlb2YgQmxvYiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoQmxvYikgPT09IFwiW29iamVjdCBCbG9iQ29uc3RydWN0b3JdXCIpO1xuY29uc3Qgd2l0aE5hdGl2ZUFycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyID09PSBcImZ1bmN0aW9uXCI7XG4vLyBBcnJheUJ1ZmZlci5pc1ZpZXcgbWV0aG9kIGlzIG5vdCBkZWZpbmVkIGluIElFMTBcbmNvbnN0IGlzVmlldyA9IChvYmopID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gQXJyYXlCdWZmZXIuaXNWaWV3KG9iailcbiAgICAgICAgOiBvYmogJiYgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyO1xufTtcbmNvbnN0IGVuY29kZVBhY2tldCA9ICh7IHR5cGUsIGRhdGEgfSwgc3VwcG9ydHNCaW5hcnksIGNhbGxiYWNrKSA9PiB7XG4gICAgaWYgKHdpdGhOYXRpdmVCbG9iICYmIGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgIGlmIChzdXBwb3J0c0JpbmFyeSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZUJsb2JBc0Jhc2U2NChkYXRhLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAod2l0aE5hdGl2ZUFycmF5QnVmZmVyICYmXG4gICAgICAgIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgaXNWaWV3KGRhdGEpKSkge1xuICAgICAgICBpZiAoc3VwcG9ydHNCaW5hcnkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVCbG9iQXNCYXNlNjQobmV3IEJsb2IoW2RhdGFdKSwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHBsYWluIHN0cmluZ1xuICAgIHJldHVybiBjYWxsYmFjayhjb21tb25zX2pzXzEuUEFDS0VUX1RZUEVTW3R5cGVdICsgKGRhdGEgfHwgXCJcIikpO1xufTtcbmV4cG9ydHMuZW5jb2RlUGFja2V0ID0gZW5jb2RlUGFja2V0O1xuY29uc3QgZW5jb2RlQmxvYkFzQmFzZTY0ID0gKGRhdGEsIGNhbGxiYWNrKSA9PiB7XG4gICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgZmlsZVJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmaWxlUmVhZGVyLnJlc3VsdC5zcGxpdChcIixcIilbMV07XG4gICAgICAgIGNhbGxiYWNrKFwiYlwiICsgKGNvbnRlbnQgfHwgXCJcIikpO1xuICAgIH07XG4gICAgcmV0dXJuIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChkYXRhKTtcbn07XG5mdW5jdGlvbiB0b0FycmF5KGRhdGEpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKTtcbiAgICB9XG59XG5sZXQgVEVYVF9FTkNPREVSO1xuZnVuY3Rpb24gZW5jb2RlUGFja2V0VG9CaW5hcnkocGFja2V0LCBjYWxsYmFjaykge1xuICAgIGlmICh3aXRoTmF0aXZlQmxvYiAmJiBwYWNrZXQuZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgcmV0dXJuIHBhY2tldC5kYXRhLmFycmF5QnVmZmVyKCkudGhlbih0b0FycmF5KS50aGVuKGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2l0aE5hdGl2ZUFycmF5QnVmZmVyICYmXG4gICAgICAgIChwYWNrZXQuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IGlzVmlldyhwYWNrZXQuZGF0YSkpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh0b0FycmF5KHBhY2tldC5kYXRhKSk7XG4gICAgfVxuICAgIGVuY29kZVBhY2tldChwYWNrZXQsIGZhbHNlLCAoZW5jb2RlZCkgPT4ge1xuICAgICAgICBpZiAoIVRFWFRfRU5DT0RFUikge1xuICAgICAgICAgICAgVEVYVF9FTkNPREVSID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soVEVYVF9FTkNPREVSLmVuY29kZShlbmNvZGVkKSk7XG4gICAgfSk7XG59XG5leHBvcnRzLmVuY29kZVBhY2tldFRvQmluYXJ5ID0gZW5jb2RlUGFja2V0VG9CaW5hcnk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVjb2RlUGF5bG9hZCA9IGV4cG9ydHMuZGVjb2RlUGFja2V0ID0gZXhwb3J0cy5lbmNvZGVQYXlsb2FkID0gZXhwb3J0cy5lbmNvZGVQYWNrZXQgPSBleHBvcnRzLnByb3RvY29sID0gZXhwb3J0cy5jcmVhdGVQYWNrZXREZWNvZGVyU3RyZWFtID0gZXhwb3J0cy5jcmVhdGVQYWNrZXRFbmNvZGVyU3RyZWFtID0gdm9pZCAwO1xuY29uc3QgZW5jb2RlUGFja2V0X2pzXzEgPSByZXF1aXJlKFwiLi9lbmNvZGVQYWNrZXQuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJlbmNvZGVQYWNrZXRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVuY29kZVBhY2tldF9qc18xLmVuY29kZVBhY2tldDsgfSB9KTtcbmNvbnN0IGRlY29kZVBhY2tldF9qc18xID0gcmVxdWlyZShcIi4vZGVjb2RlUGFja2V0LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVjb2RlUGFja2V0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkZWNvZGVQYWNrZXRfanNfMS5kZWNvZGVQYWNrZXQ7IH0gfSk7XG5jb25zdCBjb21tb25zX2pzXzEgPSByZXF1aXJlKFwiLi9jb21tb25zLmpzXCIpO1xuY29uc3QgU0VQQVJBVE9SID0gU3RyaW5nLmZyb21DaGFyQ29kZSgzMCk7IC8vIHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZWxpbWl0ZXIjQVNDSUlfZGVsaW1pdGVkX3RleHRcbmNvbnN0IGVuY29kZVBheWxvYWQgPSAocGFja2V0cywgY2FsbGJhY2spID0+IHtcbiAgICAvLyBzb21lIHBhY2tldHMgbWF5IGJlIGFkZGVkIHRvIHRoZSBhcnJheSB3aGlsZSBlbmNvZGluZywgc28gdGhlIGluaXRpYWwgbGVuZ3RoIG11c3QgYmUgc2F2ZWRcbiAgICBjb25zdCBsZW5ndGggPSBwYWNrZXRzLmxlbmd0aDtcbiAgICBjb25zdCBlbmNvZGVkUGFja2V0cyA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgcGFja2V0cy5mb3JFYWNoKChwYWNrZXQsIGkpID0+IHtcbiAgICAgICAgLy8gZm9yY2UgYmFzZTY0IGVuY29kaW5nIGZvciBiaW5hcnkgcGFja2V0c1xuICAgICAgICAoMCwgZW5jb2RlUGFja2V0X2pzXzEuZW5jb2RlUGFja2V0KShwYWNrZXQsIGZhbHNlLCAoZW5jb2RlZFBhY2tldCkgPT4ge1xuICAgICAgICAgICAgZW5jb2RlZFBhY2tldHNbaV0gPSBlbmNvZGVkUGFja2V0O1xuICAgICAgICAgICAgaWYgKCsrY291bnQgPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVuY29kZWRQYWNrZXRzLmpvaW4oU0VQQVJBVE9SKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbmV4cG9ydHMuZW5jb2RlUGF5bG9hZCA9IGVuY29kZVBheWxvYWQ7XG5jb25zdCBkZWNvZGVQYXlsb2FkID0gKGVuY29kZWRQYXlsb2FkLCBiaW5hcnlUeXBlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RlZFBhY2tldHMgPSBlbmNvZGVkUGF5bG9hZC5zcGxpdChTRVBBUkFUT1IpO1xuICAgIGNvbnN0IHBhY2tldHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kZWRQYWNrZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWRQYWNrZXQgPSAoMCwgZGVjb2RlUGFja2V0X2pzXzEuZGVjb2RlUGFja2V0KShlbmNvZGVkUGFja2V0c1tpXSwgYmluYXJ5VHlwZSk7XG4gICAgICAgIHBhY2tldHMucHVzaChkZWNvZGVkUGFja2V0KTtcbiAgICAgICAgaWYgKGRlY29kZWRQYWNrZXQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFja2V0cztcbn07XG5leHBvcnRzLmRlY29kZVBheWxvYWQgPSBkZWNvZGVQYXlsb2FkO1xuZnVuY3Rpb24gY3JlYXRlUGFja2V0RW5jb2RlclN0cmVhbSgpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgICB0cmFuc2Zvcm0ocGFja2V0LCBjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAoMCwgZW5jb2RlUGFja2V0X2pzXzEuZW5jb2RlUGFja2V0VG9CaW5hcnkpKHBhY2tldCwgKGVuY29kZWRQYWNrZXQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkTGVuZ3RoID0gZW5jb2RlZFBhY2tldC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlcjtcbiAgICAgICAgICAgICAgICAvLyBpbnNwaXJlZCBieSB0aGUgV2ViU29ja2V0IGZvcm1hdDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYlNvY2tldHNfQVBJL1dyaXRpbmdfV2ViU29ja2V0X3NlcnZlcnMjZGVjb2RpbmdfcGF5bG9hZF9sZW5ndGhcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZExlbmd0aCA8IDEyNikge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgVWludDhBcnJheSgxKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGFWaWV3KGhlYWRlci5idWZmZXIpLnNldFVpbnQ4KDAsIHBheWxvYWRMZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoIDwgNjU1MzYpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDgoMCwgMTI2KTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MTYoMSwgcGF5bG9hZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgVWludDhBcnJheSg5KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhoZWFkZXIuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50OCgwLCAxMjcpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NCgxLCBCaWdJbnQocGF5bG9hZExlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmaXJzdCBiaXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgcGxhaW4gdGV4dCAoMCkgb3IgYmluYXJ5ICgxKVxuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuZGF0YSAmJiB0eXBlb2YgcGFja2V0LmRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzBdIHw9IDB4ODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShoZWFkZXIpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShlbmNvZGVkUGFja2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVQYWNrZXRFbmNvZGVyU3RyZWFtID0gY3JlYXRlUGFja2V0RW5jb2RlclN0cmVhbTtcbmxldCBURVhUX0RFQ09ERVI7XG5mdW5jdGlvbiB0b3RhbExlbmd0aChjaHVua3MpIHtcbiAgICByZXR1cm4gY2h1bmtzLnJlZHVjZSgoYWNjLCBjaHVuaykgPT4gYWNjICsgY2h1bmsubGVuZ3RoLCAwKTtcbn1cbmZ1bmN0aW9uIGNvbmNhdENodW5rcyhjaHVua3MsIHNpemUpIHtcbiAgICBpZiAoY2h1bmtzWzBdLmxlbmd0aCA9PT0gc2l6ZSkge1xuICAgICAgICByZXR1cm4gY2h1bmtzLnNoaWZ0KCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIGxldCBqID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBidWZmZXJbaV0gPSBjaHVua3NbMF1baisrXTtcbiAgICAgICAgaWYgKGogPT09IGNodW5rc1swXS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgaiA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNodW5rcy5sZW5ndGggJiYgaiA8IGNodW5rc1swXS5sZW5ndGgpIHtcbiAgICAgICAgY2h1bmtzWzBdID0gY2h1bmtzWzBdLnNsaWNlKGopO1xuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbShtYXhQYXlsb2FkLCBiaW5hcnlUeXBlKSB7XG4gICAgaWYgKCFURVhUX0RFQ09ERVIpIHtcbiAgICAgICAgVEVYVF9ERUNPREVSID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGxldCBzdGF0ZSA9IDAgLyogUkVBRF9IRUFERVIgKi87XG4gICAgbGV0IGV4cGVjdGVkTGVuZ3RoID0gLTE7XG4gICAgbGV0IGlzQmluYXJ5ID0gZmFsc2U7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMCAvKiBSRUFEX0hFQURFUiAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxMZW5ndGgoY2h1bmtzKSA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IGNvbmNhdENodW5rcyhjaHVua3MsIDEpO1xuICAgICAgICAgICAgICAgICAgICBpc0JpbmFyeSA9IChoZWFkZXJbMF0gJiAweDgwKSA9PT0gMHg4MDtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRMZW5ndGggPSBoZWFkZXJbMF0gJiAweDdmO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRMZW5ndGggPCAxMjYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMyAvKiBSRUFEX1BBWUxPQUQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwZWN0ZWRMZW5ndGggPT09IDEyNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAxIC8qIFJFQURfRVhURU5ERURfTEVOR1RIXzE2ICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyIC8qIFJFQURfRVhURU5ERURfTEVOR1RIXzY0ICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09PSAxIC8qIFJFQURfRVhURU5ERURfTEVOR1RIXzE2ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbExlbmd0aChjaHVua3MpIDwgMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyQXJyYXkgPSBjb25jYXRDaHVua3MoY2h1bmtzLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRMZW5ndGggPSBuZXcgRGF0YVZpZXcoaGVhZGVyQXJyYXkuYnVmZmVyLCBoZWFkZXJBcnJheS5ieXRlT2Zmc2V0LCBoZWFkZXJBcnJheS5sZW5ndGgpLmdldFVpbnQxNigwKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzIC8qIFJFQURfUEFZTE9BRCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09IDIgLyogUkVBRF9FWFRFTkRFRF9MRU5HVEhfNjQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsTGVuZ3RoKGNodW5rcykgPCA4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJBcnJheSA9IGNvbmNhdENodW5rcyhjaHVua3MsIDgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGhlYWRlckFycmF5LmJ1ZmZlciwgaGVhZGVyQXJyYXkuYnl0ZU9mZnNldCwgaGVhZGVyQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHZpZXcuZ2V0VWludDMyKDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobiA+IE1hdGgucG93KDIsIDUzIC0gMzIpIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1heGltdW0gc2FmZSBpbnRlZ2VyIGluIEphdmFTY3JpcHQgaXMgMl41MyAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjb21tb25zX2pzXzEuRVJST1JfUEFDS0VUKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTGVuZ3RoID0gbiAqIE1hdGgucG93KDIsIDMyKSArIHZpZXcuZ2V0VWludDMyKDQpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDMgLyogUkVBRF9QQVlMT0FEICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsTGVuZ3RoKGNodW5rcykgPCBleHBlY3RlZExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGNvbmNhdENodW5rcyhjaHVua3MsIGV4cGVjdGVkTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKCgwLCBkZWNvZGVQYWNrZXRfanNfMS5kZWNvZGVQYWNrZXQpKGlzQmluYXJ5ID8gZGF0YSA6IFRFWFRfREVDT0RFUi5kZWNvZGUoZGF0YSksIGJpbmFyeVR5cGUpKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwIC8qIFJFQURfSEVBREVSICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRMZW5ndGggPT09IDAgfHwgZXhwZWN0ZWRMZW5ndGggPiBtYXhQYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjb21tb25zX2pzXzEuRVJST1JfUEFDS0VUKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVQYWNrZXREZWNvZGVyU3RyZWFtID0gY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbTtcbmV4cG9ydHMucHJvdG9jb2wgPSA0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKipcbiAqIEluaXRpYWxpemUgYmFja29mZiB0aW1lciB3aXRoIGBvcHRzYC5cbiAqXG4gKiAtIGBtaW5gIGluaXRpYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgWzEwMF1cbiAqIC0gYG1heGAgbWF4IHRpbWVvdXQgWzEwMDAwXVxuICogLSBgaml0dGVyYCBbMF1cbiAqIC0gYGZhY3RvcmAgWzJdXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqIEBhcGkgcHVibGljXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQmFja29mZiA9IHZvaWQgMDtcbmZ1bmN0aW9uIEJhY2tvZmYob3B0cykge1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIHRoaXMubXMgPSBvcHRzLm1pbiB8fCAxMDA7XG4gICAgdGhpcy5tYXggPSBvcHRzLm1heCB8fCAxMDAwMDtcbiAgICB0aGlzLmZhY3RvciA9IG9wdHMuZmFjdG9yIHx8IDI7XG4gICAgdGhpcy5qaXR0ZXIgPSBvcHRzLmppdHRlciA+IDAgJiYgb3B0cy5qaXR0ZXIgPD0gMSA/IG9wdHMuaml0dGVyIDogMDtcbiAgICB0aGlzLmF0dGVtcHRzID0gMDtcbn1cbmV4cG9ydHMuQmFja29mZiA9IEJhY2tvZmY7XG4vKipcbiAqIFJldHVybiB0aGUgYmFja29mZiBkdXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbXMgPSB0aGlzLm1zICogTWF0aC5wb3codGhpcy5mYWN0b3IsIHRoaXMuYXR0ZW1wdHMrKyk7XG4gICAgaWYgKHRoaXMuaml0dGVyKSB7XG4gICAgICAgIHZhciByYW5kID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgdmFyIGRldmlhdGlvbiA9IE1hdGguZmxvb3IocmFuZCAqIHRoaXMuaml0dGVyICogbXMpO1xuICAgICAgICBtcyA9IChNYXRoLmZsb29yKHJhbmQgKiAxMCkgJiAxKSA9PSAwID8gbXMgLSBkZXZpYXRpb24gOiBtcyArIGRldmlhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWluKG1zLCB0aGlzLm1heCkgfCAwO1xufTtcbi8qKlxuICogUmVzZXQgdGhlIG51bWJlciBvZiBhdHRlbXB0cy5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmF0dGVtcHRzID0gMDtcbn07XG4vKipcbiAqIFNldCB0aGUgbWluaW11bSBkdXJhdGlvblxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbkJhY2tvZmYucHJvdG90eXBlLnNldE1pbiA9IGZ1bmN0aW9uIChtaW4pIHtcbiAgICB0aGlzLm1zID0gbWluO1xufTtcbi8qKlxuICogU2V0IHRoZSBtYXhpbXVtIGR1cmF0aW9uXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuQmFja29mZi5wcm90b3R5cGUuc2V0TWF4ID0gZnVuY3Rpb24gKG1heCkge1xuICAgIHRoaXMubWF4ID0gbWF4O1xufTtcbi8qKlxuICogU2V0IHRoZSBqaXR0ZXJcbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5zZXRKaXR0ZXIgPSBmdW5jdGlvbiAoaml0dGVyKSB7XG4gICAgdGhpcy5qaXR0ZXIgPSBqaXR0ZXI7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLmNvbm5lY3QgPSBleHBvcnRzLmlvID0gZXhwb3J0cy5Tb2NrZXQgPSBleHBvcnRzLk1hbmFnZXIgPSBleHBvcnRzLnByb3RvY29sID0gdm9pZCAwO1xuY29uc3QgdXJsX2pzXzEgPSByZXF1aXJlKFwiLi91cmwuanNcIik7XG5jb25zdCBtYW5hZ2VyX2pzXzEgPSByZXF1aXJlKFwiLi9tYW5hZ2VyLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWFuYWdlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWFuYWdlcl9qc18xLk1hbmFnZXI7IH0gfSk7XG5jb25zdCBzb2NrZXRfanNfMSA9IHJlcXVpcmUoXCIuL3NvY2tldC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNvY2tldFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc29ja2V0X2pzXzEuU29ja2V0OyB9IH0pO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpOyAvLyBkZWJ1ZygpXG5jb25zdCBkZWJ1ZyA9IGRlYnVnXzEuZGVmYXVsdChcInNvY2tldC5pby1jbGllbnRcIik7IC8vIGRlYnVnKClcbi8qKlxuICogTWFuYWdlcnMgY2FjaGUuXG4gKi9cbmNvbnN0IGNhY2hlID0ge307XG5mdW5jdGlvbiBsb29rdXAodXJpLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiB1cmkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3B0cyA9IHVyaTtcbiAgICAgICAgdXJpID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBjb25zdCBwYXJzZWQgPSB1cmxfanNfMS51cmwodXJpLCBvcHRzLnBhdGggfHwgXCIvc29ja2V0LmlvXCIpO1xuICAgIGNvbnN0IHNvdXJjZSA9IHBhcnNlZC5zb3VyY2U7XG4gICAgY29uc3QgaWQgPSBwYXJzZWQuaWQ7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlZC5wYXRoO1xuICAgIGNvbnN0IHNhbWVOYW1lc3BhY2UgPSBjYWNoZVtpZF0gJiYgcGF0aCBpbiBjYWNoZVtpZF1bXCJuc3BzXCJdO1xuICAgIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSBvcHRzLmZvcmNlTmV3IHx8XG4gICAgICAgIG9wdHNbXCJmb3JjZSBuZXcgY29ubmVjdGlvblwiXSB8fFxuICAgICAgICBmYWxzZSA9PT0gb3B0cy5tdWx0aXBsZXggfHxcbiAgICAgICAgc2FtZU5hbWVzcGFjZTtcbiAgICBsZXQgaW87XG4gICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHtcbiAgICAgICAgZGVidWcoXCJpZ25vcmluZyBzb2NrZXQgY2FjaGUgZm9yICVzXCIsIHNvdXJjZSk7XG4gICAgICAgIGlvID0gbmV3IG1hbmFnZXJfanNfMS5NYW5hZ2VyKHNvdXJjZSwgb3B0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWNhY2hlW2lkXSkge1xuICAgICAgICAgICAgZGVidWcoXCJuZXcgaW8gaW5zdGFuY2UgZm9yICVzXCIsIHNvdXJjZSk7XG4gICAgICAgICAgICBjYWNoZVtpZF0gPSBuZXcgbWFuYWdlcl9qc18xLk1hbmFnZXIoc291cmNlLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpbyA9IGNhY2hlW2lkXTtcbiAgICB9XG4gICAgaWYgKHBhcnNlZC5xdWVyeSAmJiAhb3B0cy5xdWVyeSkge1xuICAgICAgICBvcHRzLnF1ZXJ5ID0gcGFyc2VkLnF1ZXJ5S2V5O1xuICAgIH1cbiAgICByZXR1cm4gaW8uc29ja2V0KHBhcnNlZC5wYXRoLCBvcHRzKTtcbn1cbmV4cG9ydHMuaW8gPSBsb29rdXA7XG5leHBvcnRzLmNvbm5lY3QgPSBsb29rdXA7XG5leHBvcnRzLmRlZmF1bHQgPSBsb29rdXA7XG4vLyBzbyB0aGF0IFwibG9va3VwXCIgY2FuIGJlIHVzZWQgYm90aCBhcyBhIGZ1bmN0aW9uIChlLmcuIGBpbyguLi4pYCkgYW5kIGFzIGFcbi8vIG5hbWVzcGFjZSAoZS5nLiBgaW8uY29ubmVjdCguLi4pYCksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5PYmplY3QuYXNzaWduKGxvb2t1cCwge1xuICAgIE1hbmFnZXI6IG1hbmFnZXJfanNfMS5NYW5hZ2VyLFxuICAgIFNvY2tldDogc29ja2V0X2pzXzEuU29ja2V0LFxuICAgIGlvOiBsb29rdXAsXG4gICAgY29ubmVjdDogbG9va3VwLFxufSk7XG4vKipcbiAqIFByb3RvY29sIHZlcnNpb24uXG4gKlxuICogQHB1YmxpY1xuICovXG52YXIgc29ja2V0X2lvX3BhcnNlcl8xID0gcmVxdWlyZShcInNvY2tldC5pby1wYXJzZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJwcm90b2NvbFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc29ja2V0X2lvX3BhcnNlcl8xLnByb3RvY29sOyB9IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvb2t1cDtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1hbmFnZXIgPSB2b2lkIDA7XG5jb25zdCBlbmdpbmVfaW9fY2xpZW50XzEgPSByZXF1aXJlKFwiZW5naW5lLmlvLWNsaWVudFwiKTtcbmNvbnN0IHNvY2tldF9qc18xID0gcmVxdWlyZShcIi4vc29ja2V0LmpzXCIpO1xuY29uc3QgcGFyc2VyID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJzb2NrZXQuaW8tcGFyc2VyXCIpKTtcbmNvbnN0IG9uX2pzXzEgPSByZXF1aXJlKFwiLi9vbi5qc1wiKTtcbmNvbnN0IGJhY2tvMl9qc18xID0gcmVxdWlyZShcIi4vY29udHJpYi9iYWNrbzIuanNcIik7XG5jb25zdCBjb21wb25lbnRfZW1pdHRlcl8xID0gcmVxdWlyZShcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIik7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7IC8vIGRlYnVnKClcbmNvbnN0IGRlYnVnID0gZGVidWdfMS5kZWZhdWx0KFwic29ja2V0LmlvLWNsaWVudDptYW5hZ2VyXCIpOyAvLyBkZWJ1ZygpXG5jbGFzcyBNYW5hZ2VyIGV4dGVuZHMgY29tcG9uZW50X2VtaXR0ZXJfMS5FbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih1cmksIG9wdHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5zcHMgPSB7fTtcbiAgICAgICAgdGhpcy5zdWJzID0gW107XG4gICAgICAgIGlmICh1cmkgJiYgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHVyaSkge1xuICAgICAgICAgICAgb3B0cyA9IHVyaTtcbiAgICAgICAgICAgIHVyaSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICAgICAgb3B0cy5wYXRoID0gb3B0cy5wYXRoIHx8IFwiL3NvY2tldC5pb1wiO1xuICAgICAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICAgICAgICBlbmdpbmVfaW9fY2xpZW50XzEuaW5zdGFsbFRpbWVyRnVuY3Rpb25zKHRoaXMsIG9wdHMpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbihvcHRzLnJlY29ubmVjdGlvbiAhPT0gZmFsc2UpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbkF0dGVtcHRzKG9wdHMucmVjb25uZWN0aW9uQXR0ZW1wdHMgfHwgSW5maW5pdHkpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbkRlbGF5KG9wdHMucmVjb25uZWN0aW9uRGVsYXkgfHwgMTAwMCk7XG4gICAgICAgIHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgob3B0cy5yZWNvbm5lY3Rpb25EZWxheU1heCB8fCA1MDAwKTtcbiAgICAgICAgdGhpcy5yYW5kb21pemF0aW9uRmFjdG9yKChfYSA9IG9wdHMucmFuZG9taXphdGlvbkZhY3RvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMC41KTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmID0gbmV3IGJhY2tvMl9qc18xLkJhY2tvZmYoe1xuICAgICAgICAgICAgbWluOiB0aGlzLnJlY29ubmVjdGlvbkRlbGF5KCksXG4gICAgICAgICAgICBtYXg6IHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgoKSxcbiAgICAgICAgICAgIGppdHRlcjogdGhpcy5yYW5kb21pemF0aW9uRmFjdG9yKCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRpbWVvdXQobnVsbCA9PSBvcHRzLnRpbWVvdXQgPyAyMDAwMCA6IG9wdHMudGltZW91dCk7XG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICB0aGlzLnVyaSA9IHVyaTtcbiAgICAgICAgY29uc3QgX3BhcnNlciA9IG9wdHMucGFyc2VyIHx8IHBhcnNlcjtcbiAgICAgICAgdGhpcy5lbmNvZGVyID0gbmV3IF9wYXJzZXIuRW5jb2RlcigpO1xuICAgICAgICB0aGlzLmRlY29kZXIgPSBuZXcgX3BhcnNlci5EZWNvZGVyKCk7XG4gICAgICAgIHRoaXMuX2F1dG9Db25uZWN0ID0gb3B0cy5hdXRvQ29ubmVjdCAhPT0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9hdXRvQ29ubmVjdClcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb24odikge1xuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb24gPSAhIXY7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb25BdHRlbXB0cyh2KSB7XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVjb25uZWN0aW9uQXR0ZW1wdHM7XG4gICAgICAgIHRoaXMuX3JlY29ubmVjdGlvbkF0dGVtcHRzID0gdjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlY29ubmVjdGlvbkRlbGF5KHYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkRlbGF5O1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheSA9IHY7XG4gICAgICAgIChfYSA9IHRoaXMuYmFja29mZikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNldE1pbih2KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJhbmRvbWl6YXRpb25GYWN0b3Iodikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmFuZG9taXphdGlvbkZhY3RvcjtcbiAgICAgICAgdGhpcy5fcmFuZG9taXphdGlvbkZhY3RvciA9IHY7XG4gICAgICAgIChfYSA9IHRoaXMuYmFja29mZikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNldEppdHRlcih2KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlY29ubmVjdGlvbkRlbGF5TWF4KHYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkRlbGF5TWF4O1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heCA9IHY7XG4gICAgICAgIChfYSA9IHRoaXMuYmFja29mZikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNldE1heCh2KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRpbWVvdXQodikge1xuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGltZW91dDtcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IHY7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdHJ5aW5nIHRvIHJlY29ubmVjdCBpZiByZWNvbm5lY3Rpb24gaXMgZW5hYmxlZCBhbmQgd2UgaGF2ZSBub3RcbiAgICAgKiBzdGFydGVkIHJlY29ubmVjdGluZyB5ZXRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbWF5YmVSZWNvbm5lY3RPbk9wZW4oKSB7XG4gICAgICAgIC8vIE9ubHkgdHJ5IHRvIHJlY29ubmVjdCBpZiBpdCdzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIGNvbm5lY3RpbmdcbiAgICAgICAgaWYgKCF0aGlzLl9yZWNvbm5lY3RpbmcgJiZcbiAgICAgICAgICAgIHRoaXMuX3JlY29ubmVjdGlvbiAmJlxuICAgICAgICAgICAgdGhpcy5iYWNrb2ZmLmF0dGVtcHRzID09PSAwKSB7XG4gICAgICAgICAgICAvLyBrZWVwcyByZWNvbm5lY3Rpb24gZnJvbSBmaXJpbmcgdHdpY2UgZm9yIHRoZSBzYW1lIHJlY29ubmVjdGlvbiBsb29wXG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdHJhbnNwb3J0IGBzb2NrZXRgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBvcHRpb25hbCwgY2FsbGJhY2tcbiAgICAgKiBAcmV0dXJuIHNlbGZcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgb3Blbihmbikge1xuICAgICAgICBkZWJ1ZyhcInJlYWR5U3RhdGUgJXNcIiwgdGhpcy5fcmVhZHlTdGF0ZSk7XG4gICAgICAgIGlmICh+dGhpcy5fcmVhZHlTdGF0ZS5pbmRleE9mKFwib3BlblwiKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBkZWJ1ZyhcIm9wZW5pbmcgJXNcIiwgdGhpcy51cmkpO1xuICAgICAgICB0aGlzLmVuZ2luZSA9IG5ldyBlbmdpbmVfaW9fY2xpZW50XzEuU29ja2V0KHRoaXMudXJpLCB0aGlzLm9wdHMpO1xuICAgICAgICBjb25zdCBzb2NrZXQgPSB0aGlzLmVuZ2luZTtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcIm9wZW5pbmdcIjtcbiAgICAgICAgdGhpcy5za2lwUmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgIC8vIGVtaXQgYG9wZW5gXG4gICAgICAgIGNvbnN0IG9wZW5TdWJEZXN0cm95ID0gb25fanNfMS5vbihzb2NrZXQsIFwib3BlblwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLm9ub3BlbigpO1xuICAgICAgICAgICAgZm4gJiYgZm4oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgICAgICBkZWJ1ZyhcImVycm9yXCIpO1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeVN0YXRlID0gXCJjbG9zZWRcIjtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgIGlmIChmbikge1xuICAgICAgICAgICAgICAgIGZuKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaWYgdGhlcmUgaXMgbm8gZm4gdG8gaGFuZGxlIHRoZSBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMubWF5YmVSZWNvbm5lY3RPbk9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gZW1pdCBgZXJyb3JgXG4gICAgICAgIGNvbnN0IGVycm9yU3ViID0gb25fanNfMS5vbihzb2NrZXQsIFwiZXJyb3JcIiwgb25FcnJvcik7XG4gICAgICAgIGlmIChmYWxzZSAhPT0gdGhpcy5fdGltZW91dCkge1xuICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHRoaXMuX3RpbWVvdXQ7XG4gICAgICAgICAgICBkZWJ1ZyhcImNvbm5lY3QgYXR0ZW1wdCB3aWxsIHRpbWVvdXQgYWZ0ZXIgJWRcIiwgdGltZW91dCk7XG4gICAgICAgICAgICAvLyBzZXQgdGltZXJcbiAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy5zZXRUaW1lb3V0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnKFwiY29ubmVjdCBhdHRlbXB0IHRpbWVkIG91dCBhZnRlciAlZFwiLCB0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICBvcGVuU3ViRGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIG9uRXJyb3IobmV3IEVycm9yKFwidGltZW91dFwiKSk7XG4gICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYXV0b1VucmVmKSB7XG4gICAgICAgICAgICAgICAgdGltZXIudW5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3Vicy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZW91dEZuKHRpbWVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3Vicy5wdXNoKG9wZW5TdWJEZXN0cm95KTtcbiAgICAgICAgdGhpcy5zdWJzLnB1c2goZXJyb3JTdWIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIG9wZW4oKVxuICAgICAqXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGNvbm5lY3QoZm4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3Blbihmbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHRyYW5zcG9ydCBvcGVuLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbm9wZW4oKSB7XG4gICAgICAgIGRlYnVnKFwib3BlblwiKTtcbiAgICAgICAgLy8gY2xlYXIgb2xkIHN1YnNcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIC8vIG1hcmsgYXMgb3BlblxuICAgICAgICB0aGlzLl9yZWFkeVN0YXRlID0gXCJvcGVuXCI7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwib3BlblwiKTtcbiAgICAgICAgLy8gYWRkIG5ldyBzdWJzXG4gICAgICAgIGNvbnN0IHNvY2tldCA9IHRoaXMuZW5naW5lO1xuICAgICAgICB0aGlzLnN1YnMucHVzaChvbl9qc18xLm9uKHNvY2tldCwgXCJwaW5nXCIsIHRoaXMub25waW5nLmJpbmQodGhpcykpLCBvbl9qc18xLm9uKHNvY2tldCwgXCJkYXRhXCIsIHRoaXMub25kYXRhLmJpbmQodGhpcykpLCBvbl9qc18xLm9uKHNvY2tldCwgXCJlcnJvclwiLCB0aGlzLm9uZXJyb3IuYmluZCh0aGlzKSksIG9uX2pzXzEub24oc29ja2V0LCBcImNsb3NlXCIsIHRoaXMub25jbG9zZS5iaW5kKHRoaXMpKSwgb25fanNfMS5vbih0aGlzLmRlY29kZXIsIFwiZGVjb2RlZFwiLCB0aGlzLm9uZGVjb2RlZC5iaW5kKHRoaXMpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGEgcGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25waW5nKCkge1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBpbmdcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aXRoIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uZGF0YShkYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmRlY29kZXIuYWRkKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLm9uY2xvc2UoXCJwYXJzZSBlcnJvclwiLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBwYXJzZXIgZnVsbHkgZGVjb2RlcyBhIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25kZWNvZGVkKHBhY2tldCkge1xuICAgICAgICAvLyB0aGUgbmV4dFRpY2sgY2FsbCBwcmV2ZW50cyBhbiBleGNlcHRpb24gaW4gYSB1c2VyLXByb3ZpZGVkIGV2ZW50IGxpc3RlbmVyIGZyb20gdHJpZ2dlcmluZyBhIGRpc2Nvbm5lY3Rpb24gZHVlIHRvIGEgXCJwYXJzZSBlcnJvclwiXG4gICAgICAgIGVuZ2luZV9pb19jbGllbnRfMS5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldFwiLCBwYWNrZXQpO1xuICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHNvY2tldCBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25lcnJvcihlcnIpIHtcbiAgICAgICAgZGVidWcoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVycik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc29ja2V0IGZvciB0aGUgZ2l2ZW4gYG5zcGAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTb2NrZXR9XG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHNvY2tldChuc3AsIG9wdHMpIHtcbiAgICAgICAgbGV0IHNvY2tldCA9IHRoaXMubnNwc1tuc3BdO1xuICAgICAgICBpZiAoIXNvY2tldCkge1xuICAgICAgICAgICAgc29ja2V0ID0gbmV3IHNvY2tldF9qc18xLlNvY2tldCh0aGlzLCBuc3AsIG9wdHMpO1xuICAgICAgICAgICAgdGhpcy5uc3BzW25zcF0gPSBzb2NrZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fYXV0b0Nvbm5lY3QgJiYgIXNvY2tldC5hY3RpdmUpIHtcbiAgICAgICAgICAgIHNvY2tldC5jb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvY2tldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gYSBzb2NrZXQgY2xvc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc29ja2V0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZGVzdHJveShzb2NrZXQpIHtcbiAgICAgICAgY29uc3QgbnNwcyA9IE9iamVjdC5rZXlzKHRoaXMubnNwcyk7XG4gICAgICAgIGZvciAoY29uc3QgbnNwIG9mIG5zcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvY2tldCA9IHRoaXMubnNwc1tuc3BdO1xuICAgICAgICAgICAgaWYgKHNvY2tldC5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhcInNvY2tldCAlcyBpcyBzdGlsbCBhY3RpdmUsIHNraXBwaW5nIGNsb3NlXCIsIG5zcCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9wYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGRlYnVnKFwid3JpdGluZyBwYWNrZXQgJWpcIiwgcGFja2V0KTtcbiAgICAgICAgY29uc3QgZW5jb2RlZFBhY2tldHMgPSB0aGlzLmVuY29kZXIuZW5jb2RlKHBhY2tldCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RlZFBhY2tldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZW5naW5lLndyaXRlKGVuY29kZWRQYWNrZXRzW2ldLCBwYWNrZXQub3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYW4gdXAgdHJhbnNwb3J0IHN1YnNjcmlwdGlvbnMgYW5kIHBhY2tldCBidWZmZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNsZWFudXAoKSB7XG4gICAgICAgIGRlYnVnKFwiY2xlYW51cFwiKTtcbiAgICAgICAgdGhpcy5zdWJzLmZvckVhY2goKHN1YkRlc3Ryb3kpID0+IHN1YkRlc3Ryb3koKSk7XG4gICAgICAgIHRoaXMuc3Vicy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLmRlY29kZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgY3VycmVudCBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jbG9zZSgpIHtcbiAgICAgICAgZGVidWcoXCJkaXNjb25uZWN0XCIpO1xuICAgICAgICB0aGlzLnNraXBSZWNvbm5lY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbmNsb3NlKFwiZm9yY2VkIGNsb3NlXCIpO1xuICAgICAgICBpZiAodGhpcy5lbmdpbmUpXG4gICAgICAgICAgICB0aGlzLmVuZ2luZS5jbG9zZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgY2xvc2UoKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZW5naW5lIGNsb3NlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmNsb3NlKHJlYXNvbiwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgZGVidWcoXCJjbG9zZWQgZHVlIHRvICVzXCIsIHJlYXNvbik7XG4gICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICB0aGlzLmJhY2tvZmYucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFwiY2xvc2VkXCI7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiY2xvc2VcIiwgcmVhc29uLCBkZXNjcmlwdGlvbik7XG4gICAgICAgIGlmICh0aGlzLl9yZWNvbm5lY3Rpb24gJiYgIXRoaXMuc2tpcFJlY29ubmVjdCkge1xuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IGEgcmVjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZWNvbm5lY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZWNvbm5lY3RpbmcgfHwgdGhpcy5za2lwUmVjb25uZWN0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5iYWNrb2ZmLmF0dGVtcHRzID49IHRoaXMuX3JlY29ubmVjdGlvbkF0dGVtcHRzKSB7XG4gICAgICAgICAgICBkZWJ1ZyhcInJlY29ubmVjdCBmYWlsZWRcIik7XG4gICAgICAgICAgICB0aGlzLmJhY2tvZmYucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicmVjb25uZWN0X2ZhaWxlZFwiKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29ubmVjdGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVsYXkgPSB0aGlzLmJhY2tvZmYuZHVyYXRpb24oKTtcbiAgICAgICAgICAgIGRlYnVnKFwid2lsbCB3YWl0ICVkbXMgYmVmb3JlIHJlY29ubmVjdCBhdHRlbXB0XCIsIGRlbGF5KTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29ubmVjdGluZyA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5za2lwUmVjb25uZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgZGVidWcoXCJhdHRlbXB0aW5nIHJlY29ubmVjdFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInJlY29ubmVjdF9hdHRlbXB0XCIsIHNlbGYuYmFja29mZi5hdHRlbXB0cyk7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gZm9yIHRoZSBjYXNlIHNvY2tldCBjbG9zZWQgaW4gYWJvdmUgZXZlbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuc2tpcFJlY29ubmVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHNlbGYub3BlbigoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKFwicmVjb25uZWN0IGF0dGVtcHQgZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInJlY29ubmVjdF9lcnJvclwiLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoXCJyZWNvbm5lY3Qgc3VjY2Vzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25yZWNvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5hdXRvVW5yZWYpIHtcbiAgICAgICAgICAgICAgICB0aW1lci51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdWJzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0Rm4odGltZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gc3VjY2Vzc2Z1bCByZWNvbm5lY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9ucmVjb25uZWN0KCkge1xuICAgICAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5iYWNrb2ZmLmF0dGVtcHRzO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicmVjb25uZWN0XCIsIGF0dGVtcHQpO1xuICAgIH1cbn1cbmV4cG9ydHMuTWFuYWdlciA9IE1hbmFnZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMub24gPSB2b2lkIDA7XG5mdW5jdGlvbiBvbihvYmosIGV2LCBmbikge1xuICAgIG9iai5vbihldiwgZm4pO1xuICAgIHJldHVybiBmdW5jdGlvbiBzdWJEZXN0cm95KCkge1xuICAgICAgICBvYmoub2ZmKGV2LCBmbik7XG4gICAgfTtcbn1cbmV4cG9ydHMub24gPSBvbjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Tb2NrZXQgPSB2b2lkIDA7XG5jb25zdCBzb2NrZXRfaW9fcGFyc2VyXzEgPSByZXF1aXJlKFwic29ja2V0LmlvLXBhcnNlclwiKTtcbmNvbnN0IG9uX2pzXzEgPSByZXF1aXJlKFwiLi9vbi5qc1wiKTtcbmNvbnN0IGNvbXBvbmVudF9lbWl0dGVyXzEgPSByZXF1aXJlKFwiQHNvY2tldC5pby9jb21wb25lbnQtZW1pdHRlclwiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTsgLy8gZGVidWcoKVxuY29uc3QgZGVidWcgPSBkZWJ1Z18xLmRlZmF1bHQoXCJzb2NrZXQuaW8tY2xpZW50OnNvY2tldFwiKTsgLy8gZGVidWcoKVxuLyoqXG4gKiBJbnRlcm5hbCBldmVudHMuXG4gKiBUaGVzZSBldmVudHMgY2FuJ3QgYmUgZW1pdHRlZCBieSB0aGUgdXNlci5cbiAqL1xuY29uc3QgUkVTRVJWRURfRVZFTlRTID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY29ubmVjdDogMSxcbiAgICBjb25uZWN0X2Vycm9yOiAxLFxuICAgIGRpc2Nvbm5lY3Q6IDEsXG4gICAgZGlzY29ubmVjdGluZzogMSxcbiAgICAvLyBFdmVudEVtaXR0ZXIgcmVzZXJ2ZWQgZXZlbnRzOiBodHRwczovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sI2V2ZW50c19ldmVudF9uZXdsaXN0ZW5lclxuICAgIG5ld0xpc3RlbmVyOiAxLFxuICAgIHJlbW92ZUxpc3RlbmVyOiAxLFxufSk7XG4vKipcbiAqIEEgU29ja2V0IGlzIHRoZSBmdW5kYW1lbnRhbCBjbGFzcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VydmVyLlxuICpcbiAqIEEgU29ja2V0IGJlbG9uZ3MgdG8gYSBjZXJ0YWluIE5hbWVzcGFjZSAoYnkgZGVmYXVsdCAvKSBhbmQgdXNlcyBhbiB1bmRlcmx5aW5nIHtAbGluayBNYW5hZ2VyfSB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAqXG4gKiBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAqICAgY29uc29sZS5sb2coXCJjb25uZWN0ZWRcIik7XG4gKiB9KTtcbiAqXG4gKiAvLyBzZW5kIGFuIGV2ZW50IHRvIHRoZSBzZXJ2ZXJcbiAqIHNvY2tldC5lbWl0KFwiZm9vXCIsIFwiYmFyXCIpO1xuICpcbiAqIHNvY2tldC5vbihcImZvb2JhclwiLCAoKSA9PiB7XG4gKiAgIC8vIGFuIGV2ZW50IHdhcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAqIH0pO1xuICpcbiAqIC8vIHVwb24gZGlzY29ubmVjdGlvblxuICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAocmVhc29uKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBkaXNjb25uZWN0ZWQgZHVlIHRvICR7cmVhc29ufWApO1xuICogfSk7XG4gKi9cbmNsYXNzIFNvY2tldCBleHRlbmRzIGNvbXBvbmVudF9lbWl0dGVyXzEuRW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogYFNvY2tldGAgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaW8sIG5zcCwgb3B0cykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogV2hldGhlciB0aGUgc29ja2V0IGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAgICAgICAgICpcbiAgICAgICAgICogc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc29sZS5sb2coc29ja2V0LmNvbm5lY3RlZCk7IC8vIHRydWVcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICAgKiAgIGNvbnNvbGUubG9nKHNvY2tldC5jb25uZWN0ZWQpOyAvLyBmYWxzZVxuICAgICAgICAgKiB9KTtcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBjb25uZWN0aW9uIHN0YXRlIHdhcyByZWNvdmVyZWQgYWZ0ZXIgYSB0ZW1wb3JhcnkgZGlzY29ubmVjdGlvbi4gSW4gdGhhdCBjYXNlLCBhbnkgbWlzc2VkIHBhY2tldHMgd2lsbFxuICAgICAgICAgKiBiZSB0cmFuc21pdHRlZCBieSB0aGUgc2VydmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWNvdmVyZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ1ZmZlciBmb3IgcGFja2V0cyByZWNlaXZlZCBiZWZvcmUgdGhlIENPTk5FQ1QgcGFja2V0XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlY2VpdmVCdWZmZXIgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ1ZmZlciBmb3IgcGFja2V0cyB0aGF0IHdpbGwgYmUgc2VudCBvbmNlIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBxdWV1ZSBvZiBwYWNrZXRzIHRvIGJlIHNlbnQgd2l0aCByZXRyeSBpbiBjYXNlIG9mIGZhaWx1cmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFBhY2tldHMgYXJlIHNlbnQgb25lIGJ5IG9uZSwgZWFjaCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIGFja25vd2xlZGdlbWVudCwgaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHRoZSBkZWxpdmVyeSBvcmRlci5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHNlcXVlbmNlIHRvIGdlbmVyYXRlIHRoZSBJRCBvZiB0aGUge0BsaW5rIFF1ZXVlZFBhY2tldH0uXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9xdWV1ZVNlcSA9IDA7XG4gICAgICAgIHRoaXMuaWRzID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbWFwIGNvbnRhaW5pbmcgYWNrbm93bGVkZ2VtZW50IGhhbmRsZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgYHdpdGhFcnJvcmAgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBoYW5kbGVycyB0aGF0IGFjY2VwdCBhbiBlcnJvciBhcyBmaXJzdCBhcmd1bWVudDpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgc29ja2V0LmVtaXQoXCJ0ZXN0XCIsIChlcnIsIHZhbHVlKSA9PiB7IC4uLiB9KWAgd2l0aCBgYWNrVGltZW91dGAgb3B0aW9uXG4gICAgICAgICAqIC0gYHNvY2tldC50aW1lb3V0KDUwMDApLmVtaXQoXCJ0ZXN0XCIsIChlcnIsIHZhbHVlKSA9PiB7IC4uLiB9KWBcbiAgICAgICAgICogLSBgY29uc3QgdmFsdWUgPSBhd2FpdCBzb2NrZXQuZW1pdFdpdGhBY2soXCJ0ZXN0XCIpYFxuICAgICAgICAgKlxuICAgICAgICAgKiBGcm9tIHRob3NlIHRoYXQgZG9uJ3Q6XG4gICAgICAgICAqXG4gICAgICAgICAqIC0gYHNvY2tldC5lbWl0KFwidGVzdFwiLCAodmFsdWUpID0+IHsgLi4uIH0pO2BcbiAgICAgICAgICpcbiAgICAgICAgICogSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBoYW5kbGVycyB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGVycm9yIHdoZW46XG4gICAgICAgICAqXG4gICAgICAgICAqIC0gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZFxuICAgICAgICAgKiAtIHRoZSBzb2NrZXQgZ2V0cyBkaXNjb25uZWN0ZWRcbiAgICAgICAgICpcbiAgICAgICAgICogSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgaGFuZGxlcnMgd2lsbCBiZSBzaW1wbHkgZGlzY2FyZGVkIHVwb24gZGlzY29ubmVjdGlvbiwgc2luY2UgdGhlIGNsaWVudCB3aWxsIG5ldmVyIHJlY2VpdmVcbiAgICAgICAgICogYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWNrcyA9IHt9O1xuICAgICAgICB0aGlzLmZsYWdzID0ge307XG4gICAgICAgIHRoaXMuaW8gPSBpbztcbiAgICAgICAgdGhpcy5uc3AgPSBuc3A7XG4gICAgICAgIGlmIChvcHRzICYmIG9wdHMuYXV0aCkge1xuICAgICAgICAgICAgdGhpcy5hdXRoID0gb3B0cy5hdXRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRzKTtcbiAgICAgICAgaWYgKHRoaXMuaW8uX2F1dG9Db25uZWN0KVxuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHNvY2tldCBpcyBjdXJyZW50bHkgZGlzY29ubmVjdGVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHNvY2tldCA9IGlvKCk7XG4gICAgICpcbiAgICAgKiBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHNvY2tldC5kaXNjb25uZWN0ZWQpOyAvLyBmYWxzZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhzb2NrZXQuZGlzY29ubmVjdGVkKTsgLy8gdHJ1ZVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGdldCBkaXNjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jb25uZWN0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZSB0byBvcGVuLCBjbG9zZSBhbmQgcGFja2V0IGV2ZW50c1xuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdWJFdmVudHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnN1YnMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGlvID0gdGhpcy5pbztcbiAgICAgICAgdGhpcy5zdWJzID0gW1xuICAgICAgICAgICAgb25fanNfMS5vbihpbywgXCJvcGVuXCIsIHRoaXMub25vcGVuLmJpbmQodGhpcykpLFxuICAgICAgICAgICAgb25fanNfMS5vbihpbywgXCJwYWNrZXRcIiwgdGhpcy5vbnBhY2tldC5iaW5kKHRoaXMpKSxcbiAgICAgICAgICAgIG9uX2pzXzEub24oaW8sIFwiZXJyb3JcIiwgdGhpcy5vbmVycm9yLmJpbmQodGhpcykpLFxuICAgICAgICAgICAgb25fanNfMS5vbihpbywgXCJjbG9zZVwiLCB0aGlzLm9uY2xvc2UuYmluZCh0aGlzKSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIFNvY2tldCB3aWxsIHRyeSB0byByZWNvbm5lY3Qgd2hlbiBpdHMgTWFuYWdlciBjb25uZWN0cyBvciByZWNvbm5lY3RzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coc29ja2V0LmFjdGl2ZSk7IC8vIHRydWVcbiAgICAgKlxuICAgICAqIHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKHJlYXNvbikgPT4ge1xuICAgICAqICAgaWYgKHJlYXNvbiA9PT0gXCJpbyBzZXJ2ZXIgZGlzY29ubmVjdFwiKSB7XG4gICAgICogICAgIC8vIHRoZSBkaXNjb25uZWN0aW9uIHdhcyBpbml0aWF0ZWQgYnkgdGhlIHNlcnZlciwgeW91IG5lZWQgdG8gbWFudWFsbHkgcmVjb25uZWN0XG4gICAgICogICAgIGNvbnNvbGUubG9nKHNvY2tldC5hY3RpdmUpOyAvLyBmYWxzZVxuICAgICAqICAgfVxuICAgICAqICAgLy8gZWxzZSB0aGUgc29ja2V0IHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gcmVjb25uZWN0XG4gICAgICogICBjb25zb2xlLmxvZyhzb2NrZXQuYWN0aXZlKTsgLy8gdHJ1ZVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGdldCBhY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc3VicztcbiAgICB9XG4gICAgLyoqXG4gICAgICogXCJPcGVuc1wiIHRoZSBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHNvY2tldCA9IGlvKHtcbiAgICAgKiAgIGF1dG9Db25uZWN0OiBmYWxzZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc29ja2V0LmNvbm5lY3QoKTtcbiAgICAgKi9cbiAgICBjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5zdWJFdmVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlvW1wiX3JlY29ubmVjdGluZ1wiXSlcbiAgICAgICAgICAgIHRoaXMuaW8ub3BlbigpOyAvLyBlbnN1cmUgb3BlblxuICAgICAgICBpZiAoXCJvcGVuXCIgPT09IHRoaXMuaW8uX3JlYWR5U3RhdGUpXG4gICAgICAgICAgICB0aGlzLm9ub3BlbigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHtAbGluayBjb25uZWN0KCl9LlxuICAgICAqL1xuICAgIG9wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBgbWVzc2FnZWAgZXZlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBtaW1pY3MgdGhlIFdlYlNvY2tldC5zZW5kKCkgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViU29ja2V0L3NlbmRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LnNlbmQoXCJoZWxsb1wiKTtcbiAgICAgKlxuICAgICAqIC8vIHRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAqIHNvY2tldC5lbWl0KFwibWVzc2FnZVwiLCBcImhlbGxvXCIpO1xuICAgICAqXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICovXG4gICAgc2VuZCguLi5hcmdzKSB7XG4gICAgICAgIGFyZ3MudW5zaGlmdChcIm1lc3NhZ2VcIik7XG4gICAgICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIGBlbWl0YC5cbiAgICAgKiBJZiB0aGUgZXZlbnQgaXMgaW4gYGV2ZW50c2AsIGl0J3MgZW1pdHRlZCBub3JtYWxseS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LmVtaXQoXCJoZWxsb1wiLCBcIndvcmxkXCIpO1xuICAgICAqXG4gICAgICogLy8gYWxsIHNlcmlhbGl6YWJsZSBkYXRhc3RydWN0dXJlcyBhcmUgc3VwcG9ydGVkIChubyBuZWVkIHRvIGNhbGwgSlNPTi5zdHJpbmdpZnkpXG4gICAgICogc29ja2V0LmVtaXQoXCJoZWxsb1wiLCAxLCBcIjJcIiwgeyAzOiBbXCI0XCJdLCA1OiBVaW50OEFycmF5LmZyb20oWzZdKSB9KTtcbiAgICAgKlxuICAgICAqIC8vIHdpdGggYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlclxuICAgICAqIHNvY2tldC5lbWl0KFwiaGVsbG9cIiwgXCJ3b3JsZFwiLCAodmFsKSA9PiB7XG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqL1xuICAgIGVtaXQoZXYsIC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKFJFU0VSVkVEX0VWRU5UUy5oYXNPd25Qcm9wZXJ0eShldikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgZXYudG9TdHJpbmcoKSArICdcIiBpcyBhIHJlc2VydmVkIGV2ZW50IG5hbWUnKTtcbiAgICAgICAgfVxuICAgICAgICBhcmdzLnVuc2hpZnQoZXYpO1xuICAgICAgICBpZiAodGhpcy5fb3B0cy5yZXRyaWVzICYmICF0aGlzLmZsYWdzLmZyb21RdWV1ZSAmJiAhdGhpcy5mbGFncy52b2xhdGlsZSkge1xuICAgICAgICAgICAgdGhpcy5fYWRkVG9RdWV1ZShhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IHtcbiAgICAgICAgICAgIHR5cGU6IHNvY2tldF9pb19wYXJzZXJfMS5QYWNrZXRUeXBlLkVWRU5ULFxuICAgICAgICAgICAgZGF0YTogYXJncyxcbiAgICAgICAgfTtcbiAgICAgICAgcGFja2V0Lm9wdGlvbnMgPSB7fTtcbiAgICAgICAgcGFja2V0Lm9wdGlvbnMuY29tcHJlc3MgPSB0aGlzLmZsYWdzLmNvbXByZXNzICE9PSBmYWxzZTtcbiAgICAgICAgLy8gZXZlbnQgYWNrIGNhbGxiYWNrXG4gICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5pZHMrKztcbiAgICAgICAgICAgIGRlYnVnKFwiZW1pdHRpbmcgcGFja2V0IHdpdGggYWNrIGlkICVkXCIsIGlkKTtcbiAgICAgICAgICAgIGNvbnN0IGFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlckFja0NhbGxiYWNrKGlkLCBhY2spO1xuICAgICAgICAgICAgcGFja2V0LmlkID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNUcmFuc3BvcnRXcml0YWJsZSA9IHRoaXMuaW8uZW5naW5lICYmXG4gICAgICAgICAgICB0aGlzLmlvLmVuZ2luZS50cmFuc3BvcnQgJiZcbiAgICAgICAgICAgIHRoaXMuaW8uZW5naW5lLnRyYW5zcG9ydC53cml0YWJsZTtcbiAgICAgICAgY29uc3QgZGlzY2FyZFBhY2tldCA9IHRoaXMuZmxhZ3Mudm9sYXRpbGUgJiYgKCFpc1RyYW5zcG9ydFdyaXRhYmxlIHx8ICF0aGlzLmNvbm5lY3RlZCk7XG4gICAgICAgIGlmIChkaXNjYXJkUGFja2V0KSB7XG4gICAgICAgICAgICBkZWJ1ZyhcImRpc2NhcmQgcGFja2V0IGFzIHRoZSB0cmFuc3BvcnQgaXMgbm90IGN1cnJlbnRseSB3cml0YWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlPdXRnb2luZ0xpc3RlbmVycyhwYWNrZXQpO1xuICAgICAgICAgICAgdGhpcy5wYWNrZXQocGFja2V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEJ1ZmZlci5wdXNoKHBhY2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mbGFncyA9IHt9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcmVnaXN0ZXJBY2tDYWxsYmFjayhpZCwgYWNrKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IChfYSA9IHRoaXMuZmxhZ3MudGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5fb3B0cy5hY2tUaW1lb3V0O1xuICAgICAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFja3NbaWRdID0gYWNrO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLmlvLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5hY2tzW2lkXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZW5kQnVmZmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VuZEJ1ZmZlcltpXS5pZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoXCJyZW1vdmluZyBwYWNrZXQgd2l0aCBhY2sgaWQgJWQgZnJvbSB0aGUgYnVmZmVyXCIsIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kQnVmZmVyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWJ1ZyhcImV2ZW50IHdpdGggYWNrIGlkICVkIGhhcyB0aW1lZCBvdXQgYWZ0ZXIgJWQgbXNcIiwgaWQsIHRpbWVvdXQpO1xuICAgICAgICAgICAgYWNrLmNhbGwodGhpcywgbmV3IEVycm9yKFwib3BlcmF0aW9uIGhhcyB0aW1lZCBvdXRcIikpO1xuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgY29uc3QgZm4gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5pby5jbGVhclRpbWVvdXRGbih0aW1lcik7XG4gICAgICAgICAgICBhY2suYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIGZuLndpdGhFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuYWNrc1tpZF0gPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgYW5kIHdhaXRzIGZvciBhbiBhY2tub3dsZWRnZW1lbnRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gd2l0aG91dCB0aW1lb3V0XG4gICAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzb2NrZXQuZW1pdFdpdGhBY2soXCJoZWxsb1wiLCBcIndvcmxkXCIpO1xuICAgICAqXG4gICAgICogLy8gd2l0aCBhIHNwZWNpZmljIHRpbWVvdXRcbiAgICAgKiB0cnkge1xuICAgICAqICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzb2NrZXQudGltZW91dCgxMDAwKS5lbWl0V2l0aEFjayhcImhlbGxvXCIsIFwid29ybGRcIik7XG4gICAgICogfSBjYXRjaCAoZXJyKSB7XG4gICAgICogICAvLyB0aGUgc2VydmVyIGRpZCBub3QgYWNrbm93bGVkZ2UgdGhlIGV2ZW50IGluIHRoZSBnaXZlbiBkZWxheVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEByZXR1cm4gYSBQcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgd2hlbiB0aGUgc2VydmVyIGFja25vd2xlZGdlcyB0aGUgZXZlbnRcbiAgICAgKi9cbiAgICBlbWl0V2l0aEFjayhldiwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm4gPSAoYXJnMSwgYXJnMikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmcxID8gcmVqZWN0KGFyZzEpIDogcmVzb2x2ZShhcmcyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmbi53aXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgYXJncy5wdXNoKGZuKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChldiwgLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgdGhlIHBhY2tldCB0byB0aGUgcXVldWUuXG4gICAgICogQHBhcmFtIGFyZ3NcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRUb1F1ZXVlKGFyZ3MpIHtcbiAgICAgICAgbGV0IGFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgYWNrID0gYXJncy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5fcXVldWVTZXErKyxcbiAgICAgICAgICAgIHRyeUNvdW50OiAwLFxuICAgICAgICAgICAgcGVuZGluZzogZmFsc2UsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgZmxhZ3M6IE9iamVjdC5hc3NpZ24oeyBmcm9tUXVldWU6IHRydWUgfSwgdGhpcy5mbGFncyksXG4gICAgICAgIH07XG4gICAgICAgIGFyZ3MucHVzaCgoZXJyLCAuLi5yZXNwb25zZUFyZ3MpID0+IHtcbiAgICAgICAgICAgIGlmIChwYWNrZXQgIT09IHRoaXMuX3F1ZXVlWzBdKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIHBhY2tldCBoYXMgYWxyZWFkeSBiZWVuIGFja25vd2xlZGdlZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhhc0Vycm9yID0gZXJyICE9PSBudWxsO1xuICAgICAgICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldC50cnlDb3VudCA+IHRoaXMuX29wdHMucmV0cmllcykge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhcInBhY2tldCBbJWRdIGlzIGRpc2NhcmRlZCBhZnRlciAlZCB0cmllc1wiLCBwYWNrZXQuaWQsIHBhY2tldC50cnlDb3VudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWcoXCJwYWNrZXQgWyVkXSB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnRcIiwgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgYWNrKG51bGwsIC4uLnJlc3BvbnNlQXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2V0LnBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcmFpblF1ZXVlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKHBhY2tldCk7XG4gICAgICAgIHRoaXMuX2RyYWluUXVldWUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgZmlyc3QgcGFja2V0IG9mIHRoZSBxdWV1ZSwgYW5kIHdhaXQgZm9yIGFuIGFja25vd2xlZGdlbWVudCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAgICogQHBhcmFtIGZvcmNlIC0gd2hldGhlciB0byByZXNlbmQgYSBwYWNrZXQgdGhhdCBoYXMgbm90IGJlZW4gYWNrbm93bGVkZ2VkIHlldFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZHJhaW5RdWV1ZShmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIGRlYnVnKFwiZHJhaW5pbmcgcXVldWVcIik7XG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0ZWQgfHwgdGhpcy5fcXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFja2V0ID0gdGhpcy5fcXVldWVbMF07XG4gICAgICAgIGlmIChwYWNrZXQucGVuZGluZyAmJiAhZm9yY2UpIHtcbiAgICAgICAgICAgIGRlYnVnKFwicGFja2V0IFslZF0gaGFzIGFscmVhZHkgYmVlbiBzZW50IGFuZCBpcyB3YWl0aW5nIGZvciBhbiBhY2tcIiwgcGFja2V0LmlkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYWNrZXQucGVuZGluZyA9IHRydWU7XG4gICAgICAgIHBhY2tldC50cnlDb3VudCsrO1xuICAgICAgICBkZWJ1ZyhcInNlbmRpbmcgcGFja2V0IFslZF0gKHRyeSBuwrAlZClcIiwgcGFja2V0LmlkLCBwYWNrZXQudHJ5Q291bnQpO1xuICAgICAgICB0aGlzLmZsYWdzID0gcGFja2V0LmZsYWdzO1xuICAgICAgICB0aGlzLmVtaXQuYXBwbHkodGhpcywgcGFja2V0LmFyZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHBhY2tldChwYWNrZXQpIHtcbiAgICAgICAgcGFja2V0Lm5zcCA9IHRoaXMubnNwO1xuICAgICAgICB0aGlzLmlvLl9wYWNrZXQocGFja2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZW5naW5lIGBvcGVuYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25vcGVuKCkge1xuICAgICAgICBkZWJ1ZyhcInRyYW5zcG9ydCBpcyBvcGVuIC0gY29ubmVjdGluZ1wiKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmF1dGggPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGgoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZW5kQ29ubmVjdFBhY2tldChkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2VuZENvbm5lY3RQYWNrZXQodGhpcy5hdXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIENPTk5FQ1QgcGFja2V0IHRvIGluaXRpYXRlIHRoZSBTb2NrZXQuSU8gc2Vzc2lvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfc2VuZENvbm5lY3RQYWNrZXQoZGF0YSkge1xuICAgICAgICB0aGlzLnBhY2tldCh7XG4gICAgICAgICAgICB0eXBlOiBzb2NrZXRfaW9fcGFyc2VyXzEuUGFja2V0VHlwZS5DT05ORUNULFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fcGlkXG4gICAgICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKHsgcGlkOiB0aGlzLl9waWQsIG9mZnNldDogdGhpcy5fbGFzdE9mZnNldCB9LCBkYXRhKVxuICAgICAgICAgICAgICAgIDogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGVuZ2luZSBvciBtYW5hZ2VyIGBlcnJvcmAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXJyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmVycm9yKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBlbmdpbmUgYGNsb3NlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFzb25cbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uY2xvc2UocmVhc29uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBkZWJ1ZyhcImNsb3NlICglcylcIiwgcmVhc29uKTtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuaWQ7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZGlzY29ubmVjdFwiLCByZWFzb24sIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgdGhpcy5fY2xlYXJBY2tzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgYWNrbm93bGVkZ2VtZW50IGhhbmRsZXJzIHVwb24gZGlzY29ubmVjdGlvbiwgc2luY2UgdGhlIGNsaWVudCB3aWxsIG5ldmVyIHJlY2VpdmUgYW4gYWNrbm93bGVkZ2VtZW50IGZyb21cbiAgICAgKiB0aGUgc2VydmVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2xlYXJBY2tzKCkge1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmFja3MpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0J1ZmZlcmVkID0gdGhpcy5zZW5kQnVmZmVyLnNvbWUoKHBhY2tldCkgPT4gU3RyaW5nKHBhY2tldC5pZCkgPT09IGlkKTtcbiAgICAgICAgICAgIGlmICghaXNCdWZmZXJlZCkge1xuICAgICAgICAgICAgICAgIC8vIG5vdGU6IGhhbmRsZXJzIHRoYXQgZG8gbm90IGFjY2VwdCBhbiBlcnJvciBhcyBmaXJzdCBhcmd1bWVudCBhcmUgaWdub3JlZCBoZXJlXG4gICAgICAgICAgICAgICAgY29uc3QgYWNrID0gdGhpcy5hY2tzW2lkXTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5hY2tzW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoYWNrLndpdGhFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBhY2suY2FsbCh0aGlzLCBuZXcgRXJyb3IoXCJzb2NrZXQgaGFzIGJlZW4gZGlzY29ubmVjdGVkXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2l0aCBzb2NrZXQgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25wYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGNvbnN0IHNhbWVOYW1lc3BhY2UgPSBwYWNrZXQubnNwID09PSB0aGlzLm5zcDtcbiAgICAgICAgaWYgKCFzYW1lTmFtZXNwYWNlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzd2l0Y2ggKHBhY2tldC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIHNvY2tldF9pb19wYXJzZXJfMS5QYWNrZXRUeXBlLkNPTk5FQ1Q6XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldC5kYXRhICYmIHBhY2tldC5kYXRhLnNpZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uY29ubmVjdChwYWNrZXQuZGF0YS5zaWQsIHBhY2tldC5kYXRhLnBpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNvbm5lY3RfZXJyb3JcIiwgbmV3IEVycm9yKFwiSXQgc2VlbXMgeW91IGFyZSB0cnlpbmcgdG8gcmVhY2ggYSBTb2NrZXQuSU8gc2VydmVyIGluIHYyLnggd2l0aCBhIHYzLnggY2xpZW50LCBidXQgdGhleSBhcmUgbm90IGNvbXBhdGlibGUgKG1vcmUgaW5mb3JtYXRpb24gaGVyZTogaHR0cHM6Ly9zb2NrZXQuaW8vZG9jcy92My9taWdyYXRpbmctZnJvbS0yLXgtdG8tMy0wLylcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugc29ja2V0X2lvX3BhcnNlcl8xLlBhY2tldFR5cGUuRVZFTlQ6XG4gICAgICAgICAgICBjYXNlIHNvY2tldF9pb19wYXJzZXJfMS5QYWNrZXRUeXBlLkJJTkFSWV9FVkVOVDpcbiAgICAgICAgICAgICAgICB0aGlzLm9uZXZlbnQocGFja2V0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugc29ja2V0X2lvX3BhcnNlcl8xLlBhY2tldFR5cGUuQUNLOlxuICAgICAgICAgICAgY2FzZSBzb2NrZXRfaW9fcGFyc2VyXzEuUGFja2V0VHlwZS5CSU5BUllfQUNLOlxuICAgICAgICAgICAgICAgIHRoaXMub25hY2socGFja2V0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugc29ja2V0X2lvX3BhcnNlcl8xLlBhY2tldFR5cGUuRElTQ09OTkVDVDpcbiAgICAgICAgICAgICAgICB0aGlzLm9uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBzb2NrZXRfaW9fcGFyc2VyXzEuUGFja2V0VHlwZS5DT05ORUNUX0VSUk9SOlxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihwYWNrZXQuZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgZXJyLmRhdGEgPSBwYWNrZXQuZGF0YS5kYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiY29ubmVjdF9lcnJvclwiLCBlcnIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGEgc2VydmVyIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25ldmVudChwYWNrZXQpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHBhY2tldC5kYXRhIHx8IFtdO1xuICAgICAgICBkZWJ1ZyhcImVtaXR0aW5nIGV2ZW50ICVqXCIsIGFyZ3MpO1xuICAgICAgICBpZiAobnVsbCAhPSBwYWNrZXQuaWQpIHtcbiAgICAgICAgICAgIGRlYnVnKFwiYXR0YWNoaW5nIGFjayBjYWxsYmFjayB0byBldmVudFwiKTtcbiAgICAgICAgICAgIGFyZ3MucHVzaCh0aGlzLmFjayhwYWNrZXQuaWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdEV2ZW50KGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlQnVmZmVyLnB1c2goT2JqZWN0LmZyZWV6ZShhcmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW1pdEV2ZW50KGFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FueUxpc3RlbmVycyAmJiB0aGlzLl9hbnlMaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9hbnlMaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZW1pdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgaWYgKHRoaXMuX3BpZCAmJiBhcmdzLmxlbmd0aCAmJiB0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0T2Zmc2V0ID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2R1Y2VzIGFuIGFjayBjYWxsYmFjayB0byBlbWl0IHdpdGggYW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFjayhpZCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgbGV0IHNlbnQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAvLyBwcmV2ZW50IGRvdWJsZSBjYWxsYmFja3NcbiAgICAgICAgICAgIGlmIChzZW50KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgZGVidWcoXCJzZW5kaW5nIGFjayAlalwiLCBhcmdzKTtcbiAgICAgICAgICAgIHNlbGYucGFja2V0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBzb2NrZXRfaW9fcGFyc2VyXzEuUGFja2V0VHlwZS5BQ0ssXG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGFyZ3MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gYSBzZXJ2ZXIgYWNrbm93bGVkZ2VtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25hY2socGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGFjayA9IHRoaXMuYWNrc1twYWNrZXQuaWRdO1xuICAgICAgICBpZiAodHlwZW9mIGFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkZWJ1ZyhcImJhZCBhY2sgJXNcIiwgcGFja2V0LmlkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5hY2tzW3BhY2tldC5pZF07XG4gICAgICAgIGRlYnVnKFwiY2FsbGluZyBhY2sgJXMgd2l0aCAlalwiLCBwYWNrZXQuaWQsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGSVhNRSBhY2sgaXMgaW5jb3JyZWN0bHkgaW5mZXJyZWQgYXMgJ25ldmVyJ1xuICAgICAgICBpZiAoYWNrLndpdGhFcnJvcikge1xuICAgICAgICAgICAgcGFja2V0LmRhdGEudW5zaGlmdChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGFjay5hcHBseSh0aGlzLCBwYWNrZXQuZGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHNlcnZlciBjb25uZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmNvbm5lY3QoaWQsIHBpZCkge1xuICAgICAgICBkZWJ1ZyhcInNvY2tldCBjb25uZWN0ZWQgd2l0aCBpZCAlc1wiLCBpZCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5yZWNvdmVyZWQgPSBwaWQgJiYgdGhpcy5fcGlkID09PSBwaWQ7XG4gICAgICAgIHRoaXMuX3BpZCA9IHBpZDsgLy8gZGVmaW5lZCBvbmx5IGlmIGNvbm5lY3Rpb24gc3RhdGUgcmVjb3ZlcnkgaXMgZW5hYmxlZFxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZW1pdEJ1ZmZlcmVkKCk7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiY29ubmVjdFwiKTtcbiAgICAgICAgdGhpcy5fZHJhaW5RdWV1ZSh0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdCBidWZmZXJlZCBldmVudHMgKHJlY2VpdmVkIGFuZCBlbWl0dGVkKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZW1pdEJ1ZmZlcmVkKCkge1xuICAgICAgICB0aGlzLnJlY2VpdmVCdWZmZXIuZm9yRWFjaCgoYXJncykgPT4gdGhpcy5lbWl0RXZlbnQoYXJncykpO1xuICAgICAgICB0aGlzLnJlY2VpdmVCdWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5zZW5kQnVmZmVyLmZvckVhY2goKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlPdXRnb2luZ0xpc3RlbmVycyhwYWNrZXQpO1xuICAgICAgICAgICAgdGhpcy5wYWNrZXQocGFja2V0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBzZXJ2ZXIgZGlzY29ubmVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25kaXNjb25uZWN0KCkge1xuICAgICAgICBkZWJ1ZyhcInNlcnZlciBkaXNjb25uZWN0ICglcylcIiwgdGhpcy5uc3ApO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5vbmNsb3NlKFwiaW8gc2VydmVyIGRpc2Nvbm5lY3RcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGZvcmNlZCBjbGllbnQvc2VydmVyIHNpZGUgZGlzY29ubmVjdGlvbnMsXG4gICAgICogdGhpcyBtZXRob2QgZW5zdXJlcyB0aGUgbWFuYWdlciBzdG9wcyB0cmFja2luZyB1cyBhbmRcbiAgICAgKiB0aGF0IHJlY29ubmVjdGlvbnMgZG9uJ3QgZ2V0IHRyaWdnZXJlZCBmb3IgdGhpcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vicykge1xuICAgICAgICAgICAgLy8gY2xlYW4gc3Vic2NyaXB0aW9ucyB0byBhdm9pZCByZWNvbm5lY3Rpb25zXG4gICAgICAgICAgICB0aGlzLnN1YnMuZm9yRWFjaCgoc3ViRGVzdHJveSkgPT4gc3ViRGVzdHJveSgpKTtcbiAgICAgICAgICAgIHRoaXMuc3VicyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlvW1wiX2Rlc3Ryb3lcIl0odGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIHRoZSBzb2NrZXQgbWFudWFsbHkuIEluIHRoYXQgY2FzZSwgdGhlIHNvY2tldCB3aWxsIG5vdCB0cnkgdG8gcmVjb25uZWN0LlxuICAgICAqXG4gICAgICogSWYgdGhpcyBpcyB0aGUgbGFzdCBhY3RpdmUgU29ja2V0IGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgTWFuYWdlcn0sIHRoZSBsb3ctbGV2ZWwgY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAgICAgKlxuICAgICAqIHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKHJlYXNvbikgPT4ge1xuICAgICAqICAgLy8gY29uc29sZS5sb2cocmVhc29uKTsgcHJpbnRzIFwiaW8gY2xpZW50IGRpc2Nvbm5lY3RcIlxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc29ja2V0LmRpc2Nvbm5lY3QoKTtcbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgZGVidWcoXCJwZXJmb3JtaW5nIGRpc2Nvbm5lY3QgKCVzKVwiLCB0aGlzLm5zcCk7XG4gICAgICAgICAgICB0aGlzLnBhY2tldCh7IHR5cGU6IHNvY2tldF9pb19wYXJzZXJfMS5QYWNrZXRUeXBlLkRJU0NPTk5FQ1QgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVtb3ZlIHNvY2tldCBmcm9tIHBvb2xcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgLy8gZmlyZSBldmVudHNcbiAgICAgICAgICAgIHRoaXMub25jbG9zZShcImlvIGNsaWVudCBkaXNjb25uZWN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3Ige0BsaW5rIGRpc2Nvbm5lY3QoKX0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHNlbGZcbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb21wcmVzcyBmbGFnLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQuY29tcHJlc3MoZmFsc2UpLmVtaXQoXCJoZWxsb1wiKTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb21wcmVzcyAtIGlmIGB0cnVlYCwgY29tcHJlc3NlcyB0aGUgc2VuZGluZyBkYXRhXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICovXG4gICAgY29tcHJlc3MoY29tcHJlc3MpIHtcbiAgICAgICAgdGhpcy5mbGFncy5jb21wcmVzcyA9IGNvbXByZXNzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIG1vZGlmaWVyIGZvciBhIHN1YnNlcXVlbnQgZXZlbnQgZW1pc3Npb24gdGhhdCB0aGUgZXZlbnQgbWVzc2FnZSB3aWxsIGJlIGRyb3BwZWQgd2hlbiB0aGlzIHNvY2tldCBpcyBub3RcbiAgICAgKiByZWFkeSB0byBzZW5kIG1lc3NhZ2VzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQudm9sYXRpbGUuZW1pdChcImhlbGxvXCIpOyAvLyB0aGUgc2VydmVyIG1heSBvciBtYXkgbm90IHJlY2VpdmUgaXRcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHNlbGZcbiAgICAgKi9cbiAgICBnZXQgdm9sYXRpbGUoKSB7XG4gICAgICAgIHRoaXMuZmxhZ3Mudm9sYXRpbGUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIG1vZGlmaWVyIGZvciBhIHN1YnNlcXVlbnQgZXZlbnQgZW1pc3Npb24gdGhhdCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCBhbiBlcnJvciB3aGVuIHRoZVxuICAgICAqIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHdpdGhvdXQgYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlcjpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LnRpbWVvdXQoNTAwMCkuZW1pdChcIm15LWV2ZW50XCIsIChlcnIpID0+IHtcbiAgICAgKiAgIGlmIChlcnIpIHtcbiAgICAgKiAgICAgLy8gdGhlIHNlcnZlciBkaWQgbm90IGFja25vd2xlZGdlIHRoZSBldmVudCBpbiB0aGUgZ2l2ZW4gZGVsYXlcbiAgICAgKiAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHNlbGZcbiAgICAgKi9cbiAgICB0aW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5mbGFncy50aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBhbnkgZXZlbnQgaXMgZW1pdHRlZC4gVGhlIGV2ZW50IG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVcbiAgICAgKiBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0Lm9uQW55KChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coYGdvdCAke2V2ZW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyXG4gICAgICovXG4gICAgb25BbnkobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fYW55TGlzdGVuZXJzID0gdGhpcy5fYW55TGlzdGVuZXJzIHx8IFtdO1xuICAgICAgICB0aGlzLl9hbnlMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gYW55IGV2ZW50IGlzIGVtaXR0ZWQuIFRoZSBldmVudCBuYW1lIGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlXG4gICAgICogY2FsbGJhY2suIFRoZSBsaXN0ZW5lciBpcyBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC5wcmVwZW5kQW55KChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coYGdvdCBldmVudCAke2V2ZW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyXG4gICAgICovXG4gICAgcHJlcGVuZEFueShsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9hbnlMaXN0ZW5lcnMgPSB0aGlzLl9hbnlMaXN0ZW5lcnMgfHwgW107XG4gICAgICAgIHRoaXMuX2FueUxpc3RlbmVycy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGFueSBldmVudCBpcyBlbWl0dGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBjYXRjaEFsbExpc3RlbmVyID0gKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgZ290IGV2ZW50ICR7ZXZlbnR9YCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogc29ja2V0Lm9uQW55KGNhdGNoQWxsTGlzdGVuZXIpO1xuICAgICAqXG4gICAgICogLy8gcmVtb3ZlIGEgc3BlY2lmaWMgbGlzdGVuZXJcbiAgICAgKiBzb2NrZXQub2ZmQW55KGNhdGNoQWxsTGlzdGVuZXIpO1xuICAgICAqXG4gICAgICogLy8gb3IgcmVtb3ZlIGFsbCBsaXN0ZW5lcnNcbiAgICAgKiBzb2NrZXQub2ZmQW55KCk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBvZmZBbnkobGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9hbnlMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fYW55TGlzdGVuZXJzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgPT09IGxpc3RlbmVyc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hbnlMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBsaXN0ZW5lcnMgdGhhdCBhcmUgbGlzdGVuaW5nIGZvciBhbnkgZXZlbnQgdGhhdCBpcyBzcGVjaWZpZWQuIFRoaXMgYXJyYXkgY2FuIGJlIG1hbmlwdWxhdGVkLFxuICAgICAqIGUuZy4gdG8gcmVtb3ZlIGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICBsaXN0ZW5lcnNBbnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbnlMaXN0ZW5lcnMgfHwgW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBhbnkgZXZlbnQgaXMgZW1pdHRlZC4gVGhlIGV2ZW50IG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVcbiAgICAgKiBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIE5vdGU6IGFja25vd2xlZGdlbWVudHMgc2VudCB0byB0aGUgc2VydmVyIGFyZSBub3QgaW5jbHVkZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC5vbkFueU91dGdvaW5nKChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coYHNlbnQgZXZlbnQgJHtldmVudH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaXN0ZW5lclxuICAgICAqL1xuICAgIG9uQW55T3V0Z29pbmcobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMgPSB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyB8fCBbXTtcbiAgICAgICAgdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gYW55IGV2ZW50IGlzIGVtaXR0ZWQuIFRoZSBldmVudCBuYW1lIGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlXG4gICAgICogY2FsbGJhY2suIFRoZSBsaXN0ZW5lciBpcyBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkuXG4gICAgICpcbiAgICAgKiBOb3RlOiBhY2tub3dsZWRnZW1lbnRzIHNlbnQgdG8gdGhlIHNlcnZlciBhcmUgbm90IGluY2x1ZGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQucHJlcGVuZEFueU91dGdvaW5nKChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coYHNlbnQgZXZlbnQgJHtldmVudH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHByZXBlbmRBbnlPdXRnb2luZyhsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyA9IHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzIHx8IFtdO1xuICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGFueSBldmVudCBpcyBlbWl0dGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBjYXRjaEFsbExpc3RlbmVyID0gKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgc2VudCBldmVudCAke2V2ZW50fWApO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHNvY2tldC5vbkFueU91dGdvaW5nKGNhdGNoQWxsTGlzdGVuZXIpO1xuICAgICAqXG4gICAgICogLy8gcmVtb3ZlIGEgc3BlY2lmaWMgbGlzdGVuZXJcbiAgICAgKiBzb2NrZXQub2ZmQW55T3V0Z29pbmcoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyBvciByZW1vdmUgYWxsIGxpc3RlbmVyc1xuICAgICAqIHNvY2tldC5vZmZBbnlPdXRnb2luZygpO1xuICAgICAqXG4gICAgICogQHBhcmFtIFtsaXN0ZW5lcl0gLSB0aGUgY2F0Y2gtYWxsIGxpc3RlbmVyIChvcHRpb25hbClcbiAgICAgKi9cbiAgICBvZmZBbnlPdXRnb2luZyhsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIXRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgPT09IGxpc3RlbmVyc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBsaXN0ZW5pbmcgZm9yIGFueSBldmVudCB0aGF0IGlzIHNwZWNpZmllZC4gVGhpcyBhcnJheSBjYW4gYmUgbWFuaXB1bGF0ZWQsXG4gICAgICogZS5nLiB0byByZW1vdmUgbGlzdGVuZXJzLlxuICAgICAqL1xuICAgIGxpc3RlbmVyc0FueU91dGdvaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMgfHwgW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vdGlmeSB0aGUgbGlzdGVuZXJzIGZvciBlYWNoIHBhY2tldCBzZW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFja2V0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG5vdGlmeU91dGdvaW5nTGlzdGVuZXJzKHBhY2tldCkge1xuICAgICAgICBpZiAodGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMgJiYgdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycy5zbGljZSgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBwYWNrZXQuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLlNvY2tldCA9IFNvY2tldDtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51cmwgPSB2b2lkIDA7XG5jb25zdCBlbmdpbmVfaW9fY2xpZW50XzEgPSByZXF1aXJlKFwiZW5naW5lLmlvLWNsaWVudFwiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTsgLy8gZGVidWcoKVxuY29uc3QgZGVidWcgPSBkZWJ1Z18xLmRlZmF1bHQoXCJzb2NrZXQuaW8tY2xpZW50OnVybFwiKTsgLy8gZGVidWcoKVxuLyoqXG4gKiBVUkwgcGFyc2VyLlxuICpcbiAqIEBwYXJhbSB1cmkgLSB1cmxcbiAqIEBwYXJhbSBwYXRoIC0gdGhlIHJlcXVlc3QgcGF0aCBvZiB0aGUgY29ubmVjdGlvblxuICogQHBhcmFtIGxvYyAtIEFuIG9iamVjdCBtZWFudCB0byBtaW1pYyB3aW5kb3cubG9jYXRpb24uXG4gKiAgICAgICAgRGVmYXVsdHMgdG8gd2luZG93LmxvY2F0aW9uLlxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiB1cmwodXJpLCBwYXRoID0gXCJcIiwgbG9jKSB7XG4gICAgbGV0IG9iaiA9IHVyaTtcbiAgICAvLyBkZWZhdWx0IHRvIHdpbmRvdy5sb2NhdGlvblxuICAgIGxvYyA9IGxvYyB8fCAodHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiICYmIGxvY2F0aW9uKTtcbiAgICBpZiAobnVsbCA9PSB1cmkpXG4gICAgICAgIHVyaSA9IGxvYy5wcm90b2NvbCArIFwiLy9cIiArIGxvYy5ob3N0O1xuICAgIC8vIHJlbGF0aXZlIHBhdGggc3VwcG9ydFxuICAgIGlmICh0eXBlb2YgdXJpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmIChcIi9cIiA9PT0gdXJpLmNoYXJBdCgwKSkge1xuICAgICAgICAgICAgaWYgKFwiL1wiID09PSB1cmkuY2hhckF0KDEpKSB7XG4gICAgICAgICAgICAgICAgdXJpID0gbG9jLnByb3RvY29sICsgdXJpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXJpID0gbG9jLmhvc3QgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEvXihodHRwcz98d3NzPyk6XFwvXFwvLy50ZXN0KHVyaSkpIHtcbiAgICAgICAgICAgIGRlYnVnKFwicHJvdG9jb2wtbGVzcyB1cmwgJXNcIiwgdXJpKTtcbiAgICAgICAgICAgIGlmIChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgbG9jKSB7XG4gICAgICAgICAgICAgICAgdXJpID0gbG9jLnByb3RvY29sICsgXCIvL1wiICsgdXJpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXJpID0gXCJodHRwczovL1wiICsgdXJpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHBhcnNlXG4gICAgICAgIGRlYnVnKFwicGFyc2UgJXNcIiwgdXJpKTtcbiAgICAgICAgb2JqID0gZW5naW5lX2lvX2NsaWVudF8xLnBhcnNlKHVyaSk7XG4gICAgfVxuICAgIC8vIG1ha2Ugc3VyZSB3ZSB0cmVhdCBgbG9jYWxob3N0OjgwYCBhbmQgYGxvY2FsaG9zdGAgZXF1YWxseVxuICAgIGlmICghb2JqLnBvcnQpIHtcbiAgICAgICAgaWYgKC9eKGh0dHB8d3MpJC8udGVzdChvYmoucHJvdG9jb2wpKSB7XG4gICAgICAgICAgICBvYmoucG9ydCA9IFwiODBcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgvXihodHRwfHdzKXMkLy50ZXN0KG9iai5wcm90b2NvbCkpIHtcbiAgICAgICAgICAgIG9iai5wb3J0ID0gXCI0NDNcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvYmoucGF0aCA9IG9iai5wYXRoIHx8IFwiL1wiO1xuICAgIGNvbnN0IGlwdjYgPSBvYmouaG9zdC5pbmRleE9mKFwiOlwiKSAhPT0gLTE7XG4gICAgY29uc3QgaG9zdCA9IGlwdjYgPyBcIltcIiArIG9iai5ob3N0ICsgXCJdXCIgOiBvYmouaG9zdDtcbiAgICAvLyBkZWZpbmUgdW5pcXVlIGlkXG4gICAgb2JqLmlkID0gb2JqLnByb3RvY29sICsgXCI6Ly9cIiArIGhvc3QgKyBcIjpcIiArIG9iai5wb3J0ICsgcGF0aDtcbiAgICAvLyBkZWZpbmUgaHJlZlxuICAgIG9iai5ocmVmID1cbiAgICAgICAgb2JqLnByb3RvY29sICtcbiAgICAgICAgICAgIFwiOi8vXCIgK1xuICAgICAgICAgICAgaG9zdCArXG4gICAgICAgICAgICAobG9jICYmIGxvYy5wb3J0ID09PSBvYmoucG9ydCA/IFwiXCIgOiBcIjpcIiArIG9iai5wb3J0KTtcbiAgICByZXR1cm4gb2JqO1xufVxuZXhwb3J0cy51cmwgPSB1cmw7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVjb25zdHJ1Y3RQYWNrZXQgPSBleHBvcnRzLmRlY29uc3RydWN0UGFja2V0ID0gdm9pZCAwO1xuY29uc3QgaXNfYmluYXJ5X2pzXzEgPSByZXF1aXJlKFwiLi9pcy1iaW5hcnkuanNcIik7XG4vKipcbiAqIFJlcGxhY2VzIGV2ZXJ5IEJ1ZmZlciB8IEFycmF5QnVmZmVyIHwgQmxvYiB8IEZpbGUgaW4gcGFja2V0IHdpdGggYSBudW1iZXJlZCBwbGFjZWhvbGRlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0IC0gc29ja2V0LmlvIGV2ZW50IHBhY2tldFxuICogQHJldHVybiB7T2JqZWN0fSB3aXRoIGRlY29uc3RydWN0ZWQgcGFja2V0IGFuZCBsaXN0IG9mIGJ1ZmZlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gZGVjb25zdHJ1Y3RQYWNrZXQocGFja2V0KSB7XG4gICAgY29uc3QgYnVmZmVycyA9IFtdO1xuICAgIGNvbnN0IHBhY2tldERhdGEgPSBwYWNrZXQuZGF0YTtcbiAgICBjb25zdCBwYWNrID0gcGFja2V0O1xuICAgIHBhY2suZGF0YSA9IF9kZWNvbnN0cnVjdFBhY2tldChwYWNrZXREYXRhLCBidWZmZXJzKTtcbiAgICBwYWNrLmF0dGFjaG1lbnRzID0gYnVmZmVycy5sZW5ndGg7IC8vIG51bWJlciBvZiBiaW5hcnkgJ2F0dGFjaG1lbnRzJ1xuICAgIHJldHVybiB7IHBhY2tldDogcGFjaywgYnVmZmVyczogYnVmZmVycyB9O1xufVxuZXhwb3J0cy5kZWNvbnN0cnVjdFBhY2tldCA9IGRlY29uc3RydWN0UGFja2V0O1xuZnVuY3Rpb24gX2RlY29uc3RydWN0UGFja2V0KGRhdGEsIGJ1ZmZlcnMpIHtcbiAgICBpZiAoIWRhdGEpXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIGlmICgoMCwgaXNfYmluYXJ5X2pzXzEuaXNCaW5hcnkpKGRhdGEpKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0geyBfcGxhY2Vob2xkZXI6IHRydWUsIG51bTogYnVmZmVycy5sZW5ndGggfTtcbiAgICAgICAgYnVmZmVycy5wdXNoKGRhdGEpO1xuICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IG5ldyBBcnJheShkYXRhLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbmV3RGF0YVtpXSA9IF9kZWNvbnN0cnVjdFBhY2tldChkYXRhW2ldLCBidWZmZXJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3RGF0YTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgIShkYXRhIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBuZXdEYXRhW2tleV0gPSBfZGVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtrZXldLCBidWZmZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3RGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG4vKipcbiAqIFJlY29uc3RydWN0cyBhIGJpbmFyeSBwYWNrZXQgZnJvbSBpdHMgcGxhY2Vob2xkZXIgcGFja2V0IGFuZCBidWZmZXJzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhY2tldCAtIGV2ZW50IHBhY2tldCB3aXRoIHBsYWNlaG9sZGVyc1xuICogQHBhcmFtIHtBcnJheX0gYnVmZmVycyAtIGJpbmFyeSBidWZmZXJzIHRvIHB1dCBpbiBwbGFjZWhvbGRlciBwb3NpdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gcmVjb25zdHJ1Y3RlZCBwYWNrZXRcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gcmVjb25zdHJ1Y3RQYWNrZXQocGFja2V0LCBidWZmZXJzKSB7XG4gICAgcGFja2V0LmRhdGEgPSBfcmVjb25zdHJ1Y3RQYWNrZXQocGFja2V0LmRhdGEsIGJ1ZmZlcnMpO1xuICAgIGRlbGV0ZSBwYWNrZXQuYXR0YWNobWVudHM7IC8vIG5vIGxvbmdlciB1c2VmdWxcbiAgICByZXR1cm4gcGFja2V0O1xufVxuZXhwb3J0cy5yZWNvbnN0cnVjdFBhY2tldCA9IHJlY29uc3RydWN0UGFja2V0O1xuZnVuY3Rpb24gX3JlY29uc3RydWN0UGFja2V0KGRhdGEsIGJ1ZmZlcnMpIHtcbiAgICBpZiAoIWRhdGEpXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIGlmIChkYXRhICYmIGRhdGEuX3BsYWNlaG9sZGVyID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGlzSW5kZXhWYWxpZCA9IHR5cGVvZiBkYXRhLm51bSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgZGF0YS5udW0gPj0gMCAmJlxuICAgICAgICAgICAgZGF0YS5udW0gPCBidWZmZXJzLmxlbmd0aDtcbiAgICAgICAgaWYgKGlzSW5kZXhWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcnNbZGF0YS5udW1dOyAvLyBhcHByb3ByaWF0ZSBidWZmZXIgKHNob3VsZCBiZSBuYXR1cmFsIG9yZGVyIGFueXdheSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgYXR0YWNobWVudHNcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBfcmVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtpXSwgYnVmZmVycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgZGF0YVtrZXldID0gX3JlY29uc3RydWN0UGFja2V0KGRhdGFba2V5XSwgYnVmZmVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRGVjb2RlciA9IGV4cG9ydHMuRW5jb2RlciA9IGV4cG9ydHMuUGFja2V0VHlwZSA9IGV4cG9ydHMucHJvdG9jb2wgPSB2b2lkIDA7XG5jb25zdCBjb21wb25lbnRfZW1pdHRlcl8xID0gcmVxdWlyZShcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIik7XG5jb25zdCBiaW5hcnlfanNfMSA9IHJlcXVpcmUoXCIuL2JpbmFyeS5qc1wiKTtcbmNvbnN0IGlzX2JpbmFyeV9qc18xID0gcmVxdWlyZShcIi4vaXMtYmluYXJ5LmpzXCIpO1xuY29uc3QgZGVidWdfMSA9IHJlcXVpcmUoXCJkZWJ1Z1wiKTsgLy8gZGVidWcoKVxuY29uc3QgZGVidWcgPSAoMCwgZGVidWdfMS5kZWZhdWx0KShcInNvY2tldC5pby1wYXJzZXJcIik7IC8vIGRlYnVnKClcbi8qKlxuICogVGhlc2Ugc3RyaW5ncyBtdXN0IG5vdCBiZSB1c2VkIGFzIGV2ZW50IG5hbWVzLCBhcyB0aGV5IGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcuXG4gKi9cbmNvbnN0IFJFU0VSVkVEX0VWRU5UUyA9IFtcbiAgICBcImNvbm5lY3RcIixcbiAgICBcImNvbm5lY3RfZXJyb3JcIixcbiAgICBcImRpc2Nvbm5lY3RcIixcbiAgICBcImRpc2Nvbm5lY3RpbmdcIixcbiAgICBcIm5ld0xpc3RlbmVyXCIsXG4gICAgXCJyZW1vdmVMaXN0ZW5lclwiLCAvLyB1c2VkIGJ5IHRoZSBOb2RlLmpzIEV2ZW50RW1pdHRlclxuXTtcbi8qKlxuICogUHJvdG9jb2wgdmVyc2lvbi5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydHMucHJvdG9jb2wgPSA1O1xudmFyIFBhY2tldFR5cGU7XG4oZnVuY3Rpb24gKFBhY2tldFR5cGUpIHtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJDT05ORUNUXCJdID0gMF0gPSBcIkNPTk5FQ1RcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJESVNDT05ORUNUXCJdID0gMV0gPSBcIkRJU0NPTk5FQ1RcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJFVkVOVFwiXSA9IDJdID0gXCJFVkVOVFwiO1xuICAgIFBhY2tldFR5cGVbUGFja2V0VHlwZVtcIkFDS1wiXSA9IDNdID0gXCJBQ0tcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJDT05ORUNUX0VSUk9SXCJdID0gNF0gPSBcIkNPTk5FQ1RfRVJST1JcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJCSU5BUllfRVZFTlRcIl0gPSA1XSA9IFwiQklOQVJZX0VWRU5UXCI7XG4gICAgUGFja2V0VHlwZVtQYWNrZXRUeXBlW1wiQklOQVJZX0FDS1wiXSA9IDZdID0gXCJCSU5BUllfQUNLXCI7XG59KShQYWNrZXRUeXBlID0gZXhwb3J0cy5QYWNrZXRUeXBlIHx8IChleHBvcnRzLlBhY2tldFR5cGUgPSB7fSkpO1xuLyoqXG4gKiBBIHNvY2tldC5pbyBFbmNvZGVyIGluc3RhbmNlXG4gKi9cbmNsYXNzIEVuY29kZXIge1xuICAgIC8qKlxuICAgICAqIEVuY29kZXIgY29uc3RydWN0b3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlcGxhY2VyIC0gY3VzdG9tIHJlcGxhY2VyIHRvIHBhc3MgZG93biB0byBKU09OLnBhcnNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVwbGFjZXIpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgYSBwYWNrZXQgYXMgYSBzaW5nbGUgc3RyaW5nIGlmIG5vbi1iaW5hcnksIG9yIGFzIGFcbiAgICAgKiBidWZmZXIgc2VxdWVuY2UsIGRlcGVuZGluZyBvbiBwYWNrZXQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBwYWNrZXQgb2JqZWN0XG4gICAgICovXG4gICAgZW5jb2RlKG9iaikge1xuICAgICAgICBkZWJ1ZyhcImVuY29kaW5nIHBhY2tldCAlalwiLCBvYmopO1xuICAgICAgICBpZiAob2JqLnR5cGUgPT09IFBhY2tldFR5cGUuRVZFTlQgfHwgb2JqLnR5cGUgPT09IFBhY2tldFR5cGUuQUNLKSB7XG4gICAgICAgICAgICBpZiAoKDAsIGlzX2JpbmFyeV9qc18xLmhhc0JpbmFyeSkob2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZUFzQmluYXJ5KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogb2JqLnR5cGUgPT09IFBhY2tldFR5cGUuRVZFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gUGFja2V0VHlwZS5CSU5BUllfRVZFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogUGFja2V0VHlwZS5CSU5BUllfQUNLLFxuICAgICAgICAgICAgICAgICAgICBuc3A6IG9iai5uc3AsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG9iai5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBpZDogb2JqLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy5lbmNvZGVBc1N0cmluZyhvYmopXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIHBhY2tldCBhcyBzdHJpbmcuXG4gICAgICovXG4gICAgZW5jb2RlQXNTdHJpbmcob2JqKSB7XG4gICAgICAgIC8vIGZpcnN0IGlzIHR5cGVcbiAgICAgICAgbGV0IHN0ciA9IFwiXCIgKyBvYmoudHlwZTtcbiAgICAgICAgLy8gYXR0YWNobWVudHMgaWYgd2UgaGF2ZSB0aGVtXG4gICAgICAgIGlmIChvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfRVZFTlQgfHxcbiAgICAgICAgICAgIG9iai50eXBlID09PSBQYWNrZXRUeXBlLkJJTkFSWV9BQ0spIHtcbiAgICAgICAgICAgIHN0ciArPSBvYmouYXR0YWNobWVudHMgKyBcIi1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4gYC9gXG4gICAgICAgIC8vIHdlIGFwcGVuZCBpdCBmb2xsb3dlZCBieSBhIGNvbW1hIGAsYFxuICAgICAgICBpZiAob2JqLm5zcCAmJiBcIi9cIiAhPT0gb2JqLm5zcCkge1xuICAgICAgICAgICAgc3RyICs9IG9iai5uc3AgKyBcIixcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgaWRcbiAgICAgICAgaWYgKG51bGwgIT0gb2JqLmlkKSB7XG4gICAgICAgICAgICBzdHIgKz0gb2JqLmlkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGpzb24gZGF0YVxuICAgICAgICBpZiAobnVsbCAhPSBvYmouZGF0YSkge1xuICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KG9iai5kYXRhLCB0aGlzLnJlcGxhY2VyKTtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1ZyhcImVuY29kZWQgJWogYXMgJXNcIiwgb2JqLCBzdHIpO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgcGFja2V0IGFzICdidWZmZXIgc2VxdWVuY2UnIGJ5IHJlbW92aW5nIGJsb2JzLCBhbmRcbiAgICAgKiBkZWNvbnN0cnVjdGluZyBwYWNrZXQgaW50byBvYmplY3Qgd2l0aCBwbGFjZWhvbGRlcnMgYW5kXG4gICAgICogYSBsaXN0IG9mIGJ1ZmZlcnMuXG4gICAgICovXG4gICAgZW5jb2RlQXNCaW5hcnkob2JqKSB7XG4gICAgICAgIGNvbnN0IGRlY29uc3RydWN0aW9uID0gKDAsIGJpbmFyeV9qc18xLmRlY29uc3RydWN0UGFja2V0KShvYmopO1xuICAgICAgICBjb25zdCBwYWNrID0gdGhpcy5lbmNvZGVBc1N0cmluZyhkZWNvbnN0cnVjdGlvbi5wYWNrZXQpO1xuICAgICAgICBjb25zdCBidWZmZXJzID0gZGVjb25zdHJ1Y3Rpb24uYnVmZmVycztcbiAgICAgICAgYnVmZmVycy51bnNoaWZ0KHBhY2spOyAvLyBhZGQgcGFja2V0IGluZm8gdG8gYmVnaW5uaW5nIG9mIGRhdGEgbGlzdFxuICAgICAgICByZXR1cm4gYnVmZmVyczsgLy8gd3JpdGUgYWxsIHRoZSBidWZmZXJzXG4gICAgfVxufVxuZXhwb3J0cy5FbmNvZGVyID0gRW5jb2Rlcjtcbi8vIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NTExMjgxL2NoZWNrLWlmLWEtdmFsdWUtaXMtYW4tb2JqZWN0LWluLWphdmFzY3JpcHRcbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IFwiW29iamVjdCBPYmplY3RdXCI7XG59XG4vKipcbiAqIEEgc29ja2V0LmlvIERlY29kZXIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGRlY29kZXJcbiAqL1xuY2xhc3MgRGVjb2RlciBleHRlbmRzIGNvbXBvbmVudF9lbWl0dGVyXzEuRW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogRGVjb2RlciBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmV2aXZlciAtIGN1c3RvbSByZXZpdmVyIHRvIHBhc3MgZG93biB0byBKU09OLnN0cmluZ2lmeVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJldml2ZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZXZpdmVyID0gcmV2aXZlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVjb2RlcyBhbiBlbmNvZGVkIHBhY2tldCBzdHJpbmcgaW50byBwYWNrZXQgSlNPTi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvYmogLSBlbmNvZGVkIHBhY2tldFxuICAgICAqL1xuICAgIGFkZChvYmopIHtcbiAgICAgICAgbGV0IHBhY2tldDtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnb3QgcGxhaW50ZXh0IGRhdGEgd2hlbiByZWNvbnN0cnVjdGluZyBhIHBhY2tldFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhY2tldCA9IHRoaXMuZGVjb2RlU3RyaW5nKG9iaik7XG4gICAgICAgICAgICBjb25zdCBpc0JpbmFyeUV2ZW50ID0gcGFja2V0LnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0VWRU5UO1xuICAgICAgICAgICAgaWYgKGlzQmluYXJ5RXZlbnQgfHwgcGFja2V0LnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0FDSykge1xuICAgICAgICAgICAgICAgIHBhY2tldC50eXBlID0gaXNCaW5hcnlFdmVudCA/IFBhY2tldFR5cGUuRVZFTlQgOiBQYWNrZXRUeXBlLkFDSztcbiAgICAgICAgICAgICAgICAvLyBiaW5hcnkgcGFja2V0J3MganNvblxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25zdHJ1Y3RvciA9IG5ldyBCaW5hcnlSZWNvbnN0cnVjdG9yKHBhY2tldCk7XG4gICAgICAgICAgICAgICAgLy8gbm8gYXR0YWNobWVudHMsIGxhYmVsZWQgYmluYXJ5IGJ1dCBubyBiaW5hcnkgZGF0YSB0byBmb2xsb3dcbiAgICAgICAgICAgICAgICBpZiAocGFja2V0LmF0dGFjaG1lbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyLmVtaXRSZXNlcnZlZChcImRlY29kZWRcIiwgcGFja2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBub24tYmluYXJ5IGZ1bGwgcGFja2V0XG4gICAgICAgICAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZGVjb2RlZFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCgwLCBpc19iaW5hcnlfanNfMS5pc0JpbmFyeSkob2JqKSB8fCBvYmouYmFzZTY0KSB7XG4gICAgICAgICAgICAvLyByYXcgYmluYXJ5IGRhdGFcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ290IGJpbmFyeSBkYXRhIHdoZW4gbm90IHJlY29uc3RydWN0aW5nIGEgcGFja2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5yZWNvbnN0cnVjdG9yLnRha2VCaW5hcnlEYXRhKG9iaik7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlZCBmaW5hbCBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZGVjb2RlZFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdHlwZTogXCIgKyBvYmopO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBhIHBhY2tldCBTdHJpbmcgKEpTT04gZGF0YSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHBhY2tldFxuICAgICAqL1xuICAgIGRlY29kZVN0cmluZyhzdHIpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAvLyBsb29rIHVwIHR5cGVcbiAgICAgICAgY29uc3QgcCA9IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcihzdHIuY2hhckF0KDApKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFBhY2tldFR5cGVbcC50eXBlXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHBhY2tldCB0eXBlIFwiICsgcC50eXBlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rIHVwIGF0dGFjaG1lbnRzIGlmIHR5cGUgYmluYXJ5XG4gICAgICAgIGlmIChwLnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0VWRU5UIHx8XG4gICAgICAgICAgICBwLnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0FDSykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChzdHIuY2hhckF0KCsraSkgIT09IFwiLVwiICYmIGkgIT0gc3RyLmxlbmd0aCkgeyB9XG4gICAgICAgICAgICBjb25zdCBidWYgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKTtcbiAgICAgICAgICAgIGlmIChidWYgIT0gTnVtYmVyKGJ1ZikgfHwgc3RyLmNoYXJBdChpKSAhPT0gXCItXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIGF0dGFjaG1lbnRzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcC5hdHRhY2htZW50cyA9IE51bWJlcihidWYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGxvb2sgdXAgbmFtZXNwYWNlIChpZiBhbnkpXG4gICAgICAgIGlmIChcIi9cIiA9PT0gc3RyLmNoYXJBdChpICsgMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKFwiLFwiID09PSBjKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLm5zcCA9IHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcC5uc3AgPSBcIi9cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rIHVwIGlkXG4gICAgICAgIGNvbnN0IG5leHQgPSBzdHIuY2hhckF0KGkgKyAxKTtcbiAgICAgICAgaWYgKFwiXCIgIT09IG5leHQgJiYgTnVtYmVyKG5leHQpID09IG5leHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gYyB8fCBOdW1iZXIoYykgIT0gYykge1xuICAgICAgICAgICAgICAgICAgICAtLWk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLmlkID0gTnVtYmVyKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9vayB1cCBqc29uIGRhdGFcbiAgICAgICAgaWYgKHN0ci5jaGFyQXQoKytpKSkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudHJ5UGFyc2Uoc3RyLnN1YnN0cihpKSk7XG4gICAgICAgICAgICBpZiAoRGVjb2Rlci5pc1BheWxvYWRWYWxpZChwLnR5cGUsIHBheWxvYWQpKSB7XG4gICAgICAgICAgICAgICAgcC5kYXRhID0gcGF5bG9hZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgcGF5bG9hZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWJ1ZyhcImRlY29kZWQgJXMgYXMgJWpcIiwgc3RyLCBwKTtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIHRyeVBhcnNlKHN0cikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyLCB0aGlzLnJldml2ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGlzUGF5bG9hZFZhbGlkKHR5cGUsIHBheWxvYWQpIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQ09OTkVDVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNPYmplY3QocGF5bG9hZCk7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuRElTQ09OTkVDVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZCA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY2FzZSBQYWNrZXRUeXBlLkNPTk5FQ1RfRVJST1I6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiIHx8IGlzT2JqZWN0KHBheWxvYWQpO1xuICAgICAgICAgICAgY2FzZSBQYWNrZXRUeXBlLkVWRU5UOlxuICAgICAgICAgICAgY2FzZSBQYWNrZXRUeXBlLkJJTkFSWV9FVkVOVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkocGF5bG9hZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBwYXlsb2FkWzBdID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHBheWxvYWRbMF0gPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNFUlZFRF9FVkVOVFMuaW5kZXhPZihwYXlsb2FkWzBdKSA9PT0gLTEpKSk7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQUNLOlxuICAgICAgICAgICAgY2FzZSBQYWNrZXRUeXBlLkJJTkFSWV9BQ0s6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVhbGxvY2F0ZXMgYSBwYXJzZXIncyByZXNvdXJjZXNcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5yZWNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnJlY29uc3RydWN0b3IuZmluaXNoZWRSZWNvbnN0cnVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuRGVjb2RlciA9IERlY29kZXI7XG4vKipcbiAqIEEgbWFuYWdlciBvZiBhIGJpbmFyeSBldmVudCdzICdidWZmZXIgc2VxdWVuY2UnLiBTaG91bGRcbiAqIGJlIGNvbnN0cnVjdGVkIHdoZW5ldmVyIGEgcGFja2V0IG9mIHR5cGUgQklOQVJZX0VWRU5UIGlzXG4gKiBkZWNvZGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWNrZXRcbiAqIEByZXR1cm4ge0JpbmFyeVJlY29uc3RydWN0b3J9IGluaXRpYWxpemVkIHJlY29uc3RydWN0b3JcbiAqL1xuY2xhc3MgQmluYXJ5UmVjb25zdHJ1Y3RvciB7XG4gICAgY29uc3RydWN0b3IocGFja2V0KSB7XG4gICAgICAgIHRoaXMucGFja2V0ID0gcGFja2V0O1xuICAgICAgICB0aGlzLmJ1ZmZlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5yZWNvblBhY2sgPSBwYWNrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ldGhvZCB0byBiZSBjYWxsZWQgd2hlbiBiaW5hcnkgZGF0YSByZWNlaXZlZCBmcm9tIGNvbm5lY3Rpb25cbiAgICAgKiBhZnRlciBhIEJJTkFSWV9FVkVOVCBwYWNrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0J1ZmZlciB8IEFycmF5QnVmZmVyfSBiaW5EYXRhIC0gdGhlIHJhdyBiaW5hcnkgZGF0YSByZWNlaXZlZFxuICAgICAqIEByZXR1cm4ge251bGwgfCBPYmplY3R9IHJldHVybnMgbnVsbCBpZiBtb3JlIGJpbmFyeSBkYXRhIGlzIGV4cGVjdGVkIG9yXG4gICAgICogICBhIHJlY29uc3RydWN0ZWQgcGFja2V0IG9iamVjdCBpZiBhbGwgYnVmZmVycyBoYXZlIGJlZW4gcmVjZWl2ZWQuXG4gICAgICovXG4gICAgdGFrZUJpbmFyeURhdGEoYmluRGF0YSkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMucHVzaChiaW5EYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVycy5sZW5ndGggPT09IHRoaXMucmVjb25QYWNrLmF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgICAvLyBkb25lIHdpdGggYnVmZmVyIGxpc3RcbiAgICAgICAgICAgIGNvbnN0IHBhY2tldCA9ICgwLCBiaW5hcnlfanNfMS5yZWNvbnN0cnVjdFBhY2tldCkodGhpcy5yZWNvblBhY2ssIHRoaXMuYnVmZmVycyk7XG4gICAgICAgICAgICB0aGlzLmZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFucyB1cCBiaW5hcnkgcGFja2V0IHJlY29uc3RydWN0aW9uIHZhcmlhYmxlcy5cbiAgICAgKi9cbiAgICBmaW5pc2hlZFJlY29uc3RydWN0aW9uKCkge1xuICAgICAgICB0aGlzLnJlY29uUGFjayA9IG51bGw7XG4gICAgICAgIHRoaXMuYnVmZmVycyA9IFtdO1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5oYXNCaW5hcnkgPSBleHBvcnRzLmlzQmluYXJ5ID0gdm9pZCAwO1xuY29uc3Qgd2l0aE5hdGl2ZUFycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyID09PSBcImZ1bmN0aW9uXCI7XG5jb25zdCBpc1ZpZXcgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IEFycmF5QnVmZmVyLmlzVmlldyhvYmopXG4gICAgICAgIDogb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyO1xufTtcbmNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbmNvbnN0IHdpdGhOYXRpdmVCbG9iID0gdHlwZW9mIEJsb2IgPT09IFwiZnVuY3Rpb25cIiB8fFxuICAgICh0eXBlb2YgQmxvYiAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0b1N0cmluZy5jYWxsKEJsb2IpID09PSBcIltvYmplY3QgQmxvYkNvbnN0cnVjdG9yXVwiKTtcbmNvbnN0IHdpdGhOYXRpdmVGaWxlID0gdHlwZW9mIEZpbGUgPT09IFwiZnVuY3Rpb25cIiB8fFxuICAgICh0eXBlb2YgRmlsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0b1N0cmluZy5jYWxsKEZpbGUpID09PSBcIltvYmplY3QgRmlsZUNvbnN0cnVjdG9yXVwiKTtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIG9iaiBpcyBhIEJ1ZmZlciwgYW4gQXJyYXlCdWZmZXIsIGEgQmxvYiBvciBhIEZpbGUuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNCaW5hcnkob2JqKSB7XG4gICAgcmV0dXJuICgod2l0aE5hdGl2ZUFycmF5QnVmZmVyICYmIChvYmogaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBpc1ZpZXcob2JqKSkpIHx8XG4gICAgICAgICh3aXRoTmF0aXZlQmxvYiAmJiBvYmogaW5zdGFuY2VvZiBCbG9iKSB8fFxuICAgICAgICAod2l0aE5hdGl2ZUZpbGUgJiYgb2JqIGluc3RhbmNlb2YgRmlsZSkpO1xufVxuZXhwb3J0cy5pc0JpbmFyeSA9IGlzQmluYXJ5O1xuZnVuY3Rpb24gaGFzQmluYXJ5KG9iaiwgdG9KU09OKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaGFzQmluYXJ5KG9ialtpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc0JpbmFyeShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAob2JqLnRvSlNPTiAmJlxuICAgICAgICB0eXBlb2Ygb2JqLnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGhhc0JpbmFyeShvYmoudG9KU09OKCksIHRydWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkgJiYgaGFzQmluYXJ5KG9ialtrZXldKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5oYXNCaW5hcnkgPSBoYXNCaW5hcnk7XG4iLCIvKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYEVtaXR0ZXJgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufVxuXG4vKipcbiAqIE1peGluIHRoZSBlbWl0dGVyIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWl4aW4ob2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBFbWl0dGVyLnByb3RvdHlwZSkge1xuICAgIG9ialtrZXldID0gRW1pdHRlci5wcm90b3R5cGVba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIExpc3RlbiBvbiB0aGUgZ2l2ZW4gYGV2ZW50YCB3aXRoIGBmbmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUub24gPVxuRW1pdHRlci5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcbiAgKHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdKVxuICAgIC5wdXNoKGZuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFkZHMgYW4gYGV2ZW50YCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBhIHNpbmdsZVxuICogdGltZSB0aGVuIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcbiAgZnVuY3Rpb24gb24oKSB7XG4gICAgdGhpcy5vZmYoZXZlbnQsIG9uKTtcbiAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgb24uZm4gPSBmbjtcbiAgdGhpcy5vbihldmVudCwgb24pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgYGV2ZW50YCBvciBhbGxcbiAqIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLm9mZiA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICAvLyBhbGxcbiAgaWYgKDAgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHRoaXMuX2NhbGxiYWNrcyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG4gIGlmICghY2FsbGJhY2tzKSByZXR1cm4gdGhpcztcblxuICAvLyByZW1vdmUgYWxsIGhhbmRsZXJzXG4gIGlmICgxID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHJlbW92ZSBzcGVjaWZpYyBoYW5kbGVyXG4gIHZhciBjYjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICBjYiA9IGNhbGxiYWNrc1tpXTtcbiAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xuICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSBldmVudCBzcGVjaWZpYyBhcnJheXMgZm9yIGV2ZW50IHR5cGVzIHRoYXQgbm9cbiAgLy8gb25lIGlzIHN1YnNjcmliZWQgZm9yIHRvIGF2b2lkIG1lbW9yeSBsZWFrLlxuICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtNaXhlZH0gLi4uXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSlcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgfVxuXG4gIGlmIChjYWxsYmFja3MpIHtcbiAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgY2FsbGJhY2tzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gYWxpYXMgdXNlZCBmb3IgcmVzZXJ2ZWQgZXZlbnRzIChwcm90ZWN0ZWQgbWV0aG9kKVxuRW1pdHRlci5wcm90b3R5cGUuZW1pdFJlc2VydmVkID0gRW1pdHRlci5wcm90b3R5cGUuZW1pdDtcblxuLyoqXG4gKiBSZXR1cm4gYXJyYXkgb2YgY2FsbGJhY2tzIGZvciBgZXZlbnRgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBlbWl0dGVyIGhhcyBgZXZlbnRgIGhhbmRsZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUuaGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xuICByZXR1cm4gISEgdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aDtcbn07XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IHsgSG90U3RhcSwgSG90U3RhcnRPcHRpb25zLCBJSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdFNpdGUsIEhvdFNpdGVSb3V0ZSwgSG90U2l0ZU1hcFBhdGggfSBmcm9tIFwiLi9Ib3RTaXRlXCI7XG5pbXBvcnQgeyBIb3QsIERldmVsb3Blck1vZGUgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdEFzc2V0IH0gZnJvbSBcIi4vSG90QXNzZXRcIjtcbmltcG9ydCB7IEhvdE1vZHVsZSB9IGZyb20gXCIuL0hvdE1vZHVsZVwiO1xuaW1wb3J0IHsgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQsIElIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdEZpbGUgfSBmcm9tIFwiLi9Ib3RGaWxlXCI7XG5pbXBvcnQgeyBIb3RMb2csIEhvdExvZ0xldmVsIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5pbXBvcnQgeyBIb3RQYWdlIH0gZnJvbSBcIi4vSG90UGFnZVwiO1xuXG4vLyBTZXJ2ZXIgc3R1ZmZcbmltcG9ydCB7IEhvdEFQSSwgRXZlbnRFeGVjdXRpb25UeXBlLCBBUEl0b0xvYWQgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBIb3RFdmVudE1ldGhvZCwgU2VydmVyUmVxdWVzdCwgUGFzc1R5cGUsIEhvdFJvdXRlTWV0aG9kUGFyYW1ldGVyIH0gZnJvbSBcIi4vSG90Um91dGVNZXRob2RcIjtcbmltcG9ydCB7IEhvdFNlcnZlciwgSG90U2VydmVyVHlwZSB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgSG90Q2xpZW50IH0gZnJvbSBcIi4vSG90Q2xpZW50XCI7XG5cbmltcG9ydCB7IEhvdFdlYlNvY2tldENsaWVudCB9IGZyb20gXCIuL0hvdFdlYlNvY2tldENsaWVudFwiO1xuXG4vLyBUZXN0aW5nIHN0dWZmXG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSUhvdFRlc3RFbGVtZW50LCBIb3RUZXN0RWxlbWVudCwgSG90VGVzdEVsZW1lbnRPcHRpb25zLCBJSG90VGVzdEVsZW1lbnRPcHRpb25zIH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcbmltcG9ydCB7IEhvdFRlc3RlciB9IGZyb20gXCIuL0hvdFRlc3RlclwiO1xuaW1wb3J0IHsgSG90VGVzdFN0b3AgfSBmcm9tIFwiLi9Ib3RUZXN0U3RvcFwiO1xuaW1wb3J0IHsgSG90RGVzdGluYXRpb24gfSBmcm9tIFwiLi9Ib3REZXN0aW5hdGlvblwiO1xuLy9pbXBvcnQgeyBIb3RUZXN0ZXJNb2NoYSB9IGZyb20gXCIuL0hvdFRlc3Rlck1vY2hhXCI7XG4vL2ltcG9ydCB7IEhvdFRlc3Rlck1vY2hhU2VsZW5pdW0gfSBmcm9tIFwiLi9Ib3RUZXN0ZXJNb2NoYVNlbGVuaXVtXCI7XG5pbXBvcnQgeyBIb3RUZXN0ZXJBUEkgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJBUElcIjtcbmltcG9ydCB7IEhvdFRlc3RNYXAsIEhvdFRlc3RQYXRoIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuaW1wb3J0IHsgSG90VGVzdERlc3RpbmF0aW9uIH0gZnJvbSBcIi4vSG90VGVzdERlc3RpbmF0aW9uXCI7XG5pbXBvcnQgeyBIb3RUZXN0UGFnZSB9IGZyb20gXCIuL0hvdFRlc3RQYWdlXCI7XG5cbkhvdFN0YXEuaXNXZWIgPSB0cnVlO1xuXG4vLyBDYW4ndCBleHBvcnQgaW50ZXJmYWNlcyBmcm9tIGhlcmUgOihcblxuZXhwb3J0IHtcbiAgICBIb3RTdGFxLCBIb3RTdGFydE9wdGlvbnMsIElIb3RTdGFxLCBcbiAgICBIb3RTaXRlLCBIb3RTaXRlUm91dGUsIEhvdFNpdGVNYXBQYXRoLCBcbiAgICBIb3QsXG4gICAgSG90TW9kdWxlLFxuICAgIEhvdEFzc2V0LFxuICAgIERldmVsb3Blck1vZGUsXG4gICAgSG90Q29tcG9uZW50LCBIb3RDb21wb25lbnRPdXRwdXQsIElIb3RDb21wb25lbnQsIFxuICAgIEhvdEFQSSxcbiAgICBFdmVudEV4ZWN1dGlvblR5cGUsIEFQSXRvTG9hZCwgXG4gICAgSG90RmlsZSxcbiAgICBIb3RMb2csXG4gICAgSG90TG9nTGV2ZWwsXG4gICAgSG90UGFnZSxcbiAgICBIb3RSb3V0ZSxcbiAgICBIb3RSb3V0ZU1ldGhvZCxcbiAgICBIb3RFdmVudE1ldGhvZCxcbiAgICBTZXJ2ZXJSZXF1ZXN0LCBQYXNzVHlwZSwgSG90Um91dGVNZXRob2RQYXJhbWV0ZXIsIFxuICAgIEhvdFNlcnZlcixcbiAgICBIb3RTZXJ2ZXJUeXBlLFxuICAgIEhvdENsaWVudCxcbiAgICBIb3RXZWJTb2NrZXRDbGllbnQsXG4gICAgSG90VGVzdGVyLCBIb3RUZXN0U3RvcCwgSG90RGVzdGluYXRpb24sIFxuICAgIEhvdFRlc3RlckFQSSxcbiAgICBIb3RUZXN0TWFwLCBIb3RUZXN0UGF0aCwgXG4gICAgSG90VGVzdERlc3RpbmF0aW9uLCBIb3RUZXN0UGFnZSwgXG4gICAgSG90VGVzdEVsZW1lbnQsXG4gICAgSUhvdFRlc3RFbGVtZW50LCBIb3RUZXN0RWxlbWVudE9wdGlvbnMsIElIb3RUZXN0RWxlbWVudE9wdGlvbnMsIFxuICAgIEhvdFRlc3REcml2ZXJcbn07Il0sIm5hbWVzIjpbImV4cG9ydHMiLCJmb3JtYXRBcmdzIiwiYXJncyIsInRoaXMiLCJ1c2VDb2xvcnMiLCJuYW1lc3BhY2UiLCJtb2R1bGUiLCJodW1hbml6ZSIsImRpZmYiLCJjIiwiY29sb3IiLCJzcGxpY2UiLCJpbmRleCIsImxhc3RDIiwicmVwbGFjZSIsIm1hdGNoIiwic2F2ZSIsIm5hbWVzcGFjZXMiLCJzdG9yYWdlIiwic2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlcnJvciIsImxvYWQiLCJyIiwiZ2V0SXRlbSIsInByb2Nlc3MiLCJlbnYiLCJERUJVRyIsIndpbmRvdyIsInR5cGUiLCJfX253anMiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ0b0xvd2VyQ2FzZSIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iiwic3R5bGUiLCJXZWJraXRBcHBlYXJhbmNlIiwiY29uc29sZSIsImZpcmVidWciLCJleGNlcHRpb24iLCJ0YWJsZSIsInBhcnNlSW50IiwiUmVnRXhwIiwiJDEiLCJsb2NhbFN0b3JhZ2UiLCJsb2NhbHN0b3JhZ2UiLCJkZXN0cm95Iiwid2FybmVkIiwid2FybiIsImNvbG9ycyIsImxvZyIsImRlYnVnIiwiZm9ybWF0dGVycyIsImoiLCJ2IiwiSlNPTiIsInN0cmluZ2lmeSIsIm1lc3NhZ2UiLCJjcmVhdGVEZWJ1ZyIsInByZXZUaW1lIiwibmFtZXNwYWNlc0NhY2hlIiwiZW5hYmxlZENhY2hlIiwiZW5hYmxlT3ZlcnJpZGUiLCJlbmFibGVkIiwic2VsZiIsImN1cnIiLCJOdW1iZXIiLCJEYXRlIiwibXMiLCJwcmV2IiwiY29lcmNlIiwidW5zaGlmdCIsImZvcm1hdCIsImZvcm1hdHRlciIsInZhbCIsImNhbGwiLCJhcHBseSIsInNlbGVjdENvbG9yIiwiZXh0ZW5kIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwiZ2V0Iiwic2V0IiwiaW5pdCIsImRlbGltaXRlciIsIm5ld0RlYnVnIiwidG9OYW1lc3BhY2UiLCJyZWdleHAiLCJ0b1N0cmluZyIsInN1YnN0cmluZyIsImxlbmd0aCIsImRlZmF1bHQiLCJFcnJvciIsInN0YWNrIiwiZGlzYWJsZSIsIm5hbWVzIiwibWFwIiwic2tpcHMiLCJqb2luIiwiZW5hYmxlIiwiaSIsInNwbGl0IiwibGVuIiwicHVzaCIsInNsaWNlIiwibmFtZSIsInRlc3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImhhc2giLCJjaGFyQ29kZUF0IiwiTWF0aCIsImFicyIsImFzc2lnbiIsInRhcmdldCIsImFyZ3VtZW50cyIsInNvdXJjZSIsImNvbnZlcnRlciIsImRlZmF1bHRBdHRyaWJ1dGVzIiwidmFsdWUiLCJhdHRyaWJ1dGVzIiwiZXhwaXJlcyIsIm5vdyIsInRvVVRDU3RyaW5nIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwic3RyaW5naWZpZWRBdHRyaWJ1dGVzIiwiYXR0cmlidXRlTmFtZSIsImNvb2tpZSIsIndyaXRlIiwiY3JlYXRlIiwiY29va2llcyIsImphciIsInBhcnRzIiwiZm91bmRLZXkiLCJyZWFkIiwiZSIsInJlbW92ZSIsIndpdGhBdHRyaWJ1dGVzIiwid2l0aENvbnZlcnRlciIsImZyZWV6ZSIsInBhdGgiLCJmYWN0b3J5IiwicyIsIm0iLCJoIiwiZCIsInciLCJwbHVyYWwiLCJtc0FicyIsIm4iLCJpc1BsdXJhbCIsInJvdW5kIiwib3B0aW9ucyIsInN0ciIsIlN0cmluZyIsImV4ZWMiLCJwYXJzZUZsb2F0IiwicGFyc2UiLCJpc0Zpbml0ZSIsImxvbmciLCJmbXRTaG9ydCIsIkRldmVsb3Blck1vZGUiLCJIb3QiLCJnZXRVcmxQYXJhbSIsInBhcmFtIiwidmFsaWRhdGlvbiIsIlVSTFNlYXJjaFBhcmFtcyIsImxvY2F0aW9uIiwic2VhcmNoIiwiaW5kZXhPZiIsIm51bUNoYXJzIiwiaW5jbHVkZSIsImZpbGUiLCJIb3RTdGFxIiwiaXNXZWIiLCJsb3dlckZpbGUiLCJlY2hvIiwiZ2V0RmlsZSIsImluY2x1ZGVKUyIsInBhcmVudE9iamVjdCIsIm91dHB1dCIsImciLCJGdW5jdGlvbiIsImltcG9ydCIsIm1vZHVsZU5hbWUiLCJmb3VuZE1vZHVsZSIsIkN1cnJlbnRQYWdlIiwicHJvY2Vzc29yIiwiZ2V0TW9kdWxlIiwibmV3TW9kdWxlIiwibG9hZEhUTUwiLCJhZGRNb2R1bGUiLCJydW5GaWxlIiwiZmlsZU5hbWUiLCJ0ZW1wRmlsZSIsInBhZ2UiLCJjb250ZW50IiwiSG90RmlsZSIsInVybCIsImxvY2FsRmlsZSIsImNoZWNrRmlsZSIsImFwaUNhbGwiLCJyb3V0ZSIsImRhdGEiLCJodHRwTWV0aG9kIiwiSG90RXZlbnRNZXRob2QiLCJQT1NUIiwiZmlsZXMiLCJiZWFyZXJUb2tlbiIsInJlc3VsdCIsImFwaSIsIm1ha2VDYWxsIiwiZ2V0SlNPTiIsImpzb25SZXF1ZXN0IiwiR0VUIiwiZmV0Y2hPYmoiLCJoZWFkZXJzIiwicmVzIiwib2siLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwianNvbiIsImV4IiwiaHR0cFJlcXVlc3QiLCJudW1GaWxlcyIsImh0dHBNZXRob2RMb3dlciIsIkZJTEVfVVBMT0FEIiwidXBsb2FkRmlsZSIsImZvcm1EYXRhIiwiYXBwZW5kIiwicmVxdWVzdEluaXQiLCJtZXRob2QiLCJib2R5IiwianNvblJlcyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidGhlbiIsImpzb25PYmoiLCJjYXRjaCIsInJlYXNvbiIsIk91dHB1dCIsImRpc3BsYXlDU1MiLCJpSWR4IiwiQ1NTIiwiY3NzRmlsZSIsImNzc091dCIsImNzc1N0ciIsImRpc3BsYXlKU0ZpbGVzIiwiSlNGaWxlcyIsImpzRmlsZSIsImpzRmlsZU91dCIsImpzRmlsZVN0ciIsImRpc3BsYXlKU1NjcmlwdHMiLCJKU1NjcmlwdHMiLCJqc1NjcmlwdCIsImpzU2NyaXB0T3V0IiwianNTY3JpcHRzU3RyIiwiQXJndW1lbnRzIiwiSG90VGVzdEVsZW1lbnQiLCJNb2RlIiwiUHJvZHVjdGlvbiIsIkFQSSIsIlRlc3RlckFQSSIsIkRhdGEiLCJDb29raWVzIiwiUHVibGljS2V5cyIsIkV2ZW50RXhlY3V0aW9uVHlwZSIsImNvbnN0cnVjdG9yIiwiYmFzZVVybCIsImNvbm5lY3Rpb24iLCJkYiIsImRlc2NyaXB0aW9uIiwiY3JlYXRlRnVuY3Rpb25zIiwiZXhlY3V0ZUV2ZW50c1VzaW5nIiwiSG90Um91dGUiLCJvcGVuQVBJIiwidXNlckF1dGgiLCJyb3V0ZXMiLCJvblByZVJlZ2lzdGVyIiwib25Qb3N0UmVnaXN0ZXIiLCJzZXREQlNjaGVtYSIsInNjaGVtYSIsImdldERCIiwiZ2V0REJTY2hlbWEiLCJhZGRSb3V0ZSIsInJvdXRlTWV0aG9kIiwiZXhlY3V0ZUZ1bmN0aW9uIiwicm91dGVOYW1lIiwiYWRkTWV0aG9kIiwiSG90Um91dGVNZXRob2QiLCJjcmVhdGVBUElSb3V0ZU1ldGhvZHMiLCJuZXdSb3V0ZSIsIm1ldGhvZHMiLCJuZXdSb3V0ZU1ldGhvZCIsImdldFJvdXRlVXJsIiwicmVnaXN0ZXJSb3V0ZSIsIkhvdFNlcnZlciIsInJlZ2lzdGVyUm91dGVzIiwidG9VcHBlckNhc2UiLCJzdWJzdHIiLCJlc2NhcGVkQ29udGVudCIsImZpbGVVcmwiLCJmaWxlQ29udGVudCIsInRlc3RlckFQSSIsIkhvdFNlcnZlclR5cGUiLCJIVFRQIiwibG9nZ2VyIiwiY29weSIsImh0bWxFbGVtZW50cyIsInRhZyIsImVsZW1lbnRPcHRpb25zIiwidW5kZWZpbmVkIiwib2JzZXJ2ZWRBdHRyaWJ1dGVzIiwiaW5uZXIiLCJldmVudHMiLCJvbkNyZWF0ZWQiLCJlbGVtZW50IiwidGhyb3dBbGxFcnJvcnMiLCJzZXRDb250ZW50IiwiZ2V0Q29udGVudCIsImh0dHBHZXQiLCJ0ZXh0IiwibG9hZFVybCIsImxvYWRMb2NhbEZpbGUiLCJmcyIsInJlYWRGaWxlIiwiZXJyIiwicHJvY2Vzc0NvbnRlbnQiLCJjb250ZW50UmVnZXgiLCJjb250ZW50UHJvY2Vzc29yIiwib2ZmQ29udGVudFByb2Nlc3NvciIsIm51bVJlbW92ZUZyb21CZWdpbm5pbmciLCJudW1SZW1vdmVGcm9tRW5kIiwicHJldmlvdXNJbmRleCIsInN0YXJ0IiwiZW5kIiwibGFzdEluZGV4IiwicHJldkNvbnRlbnQiLCJwcm9jZXNzTmVzdGVkQ29udGVudCIsInN0YXJ0Q2hhcnMiLCJlbmRDaGFycyIsInRyaWdnZXJDaGFyIiwicG9zIiwic3RhcnRUcmlnZ2VyUG9zIiwibmVzdGVkQ291bnRlciIsInJwb3MiLCJsYXN0SW5kZXhPZiIsImVwb3MiLCJ0ZW1wZXBvcyIsInBhcnNlRnVuY3Rpb24iLCJjYWxsYmFja0EiLCJjYWxsYmFja0IiLCJzdGFydEluZGV4IiwiZW5kSW5kZXgiLCJhcnJvd0luZGV4IiwiYnJhY2VJbmRleCIsIm5leHRQb3MiLCJwb3NzaWJsZUVuZHMiLCJlbmRQb3MiLCJmb3VuZEVuZCIsInBvc3NpYmxlRW5kIiwicG9zc2libGVFbmRQb3MiLCJhIiwidHJpbSIsImFyZyIsImIiLCJvdXQiLCJwYXJzZUNvbnRlbnQiLCJ0aGlzQ29udGVudCIsInBhcnNlck9wdGlvbnMiLCJvdXRwdXRDb21tYW5kcyIsImFsbG93U3RyaW5naWZ5IiwiU1RSSU5HSUZZX1NUQVJUIiwiU1RSSU5HSUZZX0VORCIsInJlZ2V4Rm91bmQiLCJvZmZDb250ZW50IiwidGVtcE91dHB1dCIsInJlZ2V4Rm91bmQyIiwic3RhcnRQb3MiLCJvZmZDb250ZW50MyIsInRlbXBPdXRwdXQyIiwiZnVuY0FyZ3NTdHIiLCJ0ZW1wT3V0cHV0MyIsImZ1bmNBcmdzIiwiZnVuY0JvZHkiLCJlbmRUeXBlIiwiZXNjYXBlZEJvZHkiLCJmdW5jdGlvbkNhbGwiLCJpc0FzeW5jIiwibmV3VmFsdWUiLCJ0ZW1wT3V0cHV0NCIsIm91dHB1dENtZHMiLCJ0ZW1wU3RyIiwidGVtcE91dHB1dDUiLCJEZXZlbG9wbWVudCIsImZvdW5kU3RyIiwiY3JlYXRlVGVzdEVsZW1lbnQiLCJmb3VuZFN0cjIiLCJ0ZXN0RWxtIiwib2JqIiwiQXJyYXkiLCJ0ZXN0RWxlbWVudHMiLCJmdW5jIiwidGVtcE91dHB1dDYiLCJ0ZW1wQXJncyIsIm1vZGUiLCJwdWJsaWNLZXlzIiwiZ2V0QVBJIiwiZ2V0VGVzdGVyQVBJIiwicmV0dXJuZWRPdXRwdXQiLCJleGVjdXRpb25Db250ZW50IiwibmV3VmFyIiwibmV3VmFyVmFsdWUiLCJjb250ZW50TmFtZSIsIlN5bnRheEVycm9yIiwiaG90IiwiZmluYWxPdXRwdXQiLCJIb3RMb2dMZXZlbCIsImxvZ0xldmVsIiwiQWxsIiwic2hvd1Jlc3BvbnNlcyIsInNob3dIVFRQRXZlbnRzIiwic2hvd1dlYlNvY2tldEV2ZW50cyIsImxldmVsIiwiSW5mbyIsIldhcm5pbmciLCJWZXJib3NlIiwiTm9uZSIsIndhcm5pbmciLCJpbmZvIiwidmVyYm9zZSIsIm1zZyIsImh0bWwiLCJjc3MiLCJqcyIsImNvbXBvbmVudExpYnJhcnkiLCJjb21wb25lbnRzIiwib3V0cHV0Q1NTIiwiZWNob091dCIsIm91dHB1dEFzc2V0IiwiYXNzZXQiLCJvdXRwdXRKUyIsImFzc2V0TmFtZSIsImxvYWRIb3RGaWxlcyIsIm91dHB1dENvbXBvbmVudHMiLCJhc3NldFR5cGUiLCJhc3NldHMiLCJjYWxsYmFjayIsImxvYWRBc3NldCIsIkhvdEFzc2V0IiwidGVzdGVyTmFtZSIsInRlc3Rlck1hcCIsImZ1bmN0aW9ucyIsInRlc3RQYXRocyIsImFkZEZpbGUiLCJhZGRGdW5jdGlvbiIsImFyZ3NTdHIiLCJhc3luY1N0ciIsImNvbW1hIiwiY2FsbEZ1bmN0aW9uIiwidGhpc09iaiIsImNhbGxBc3luY0Z1bmN0aW9uIiwiYWRkVGVzdEVsZW1lbnQiLCJlbG0iLCJnZXRUZXN0RWxlbWVudCIsImNyZWF0ZVRlc3RQYXRoIiwicGF0aE5hbWUiLCJkcml2ZXJGdW5jIiwib25SZWdpc3RlciIsIm9uQXV0aG9yaXplVXNlciIsInZlcnNpb24iLCJwcmVmaXgiLCJlcnJvcnMiLCJjcmVhdGVFcnJvciIsImVycm9yQ29kZSIsInRlc3RDYXNlcyIsImdldE1ldGhvZCIsImZvdW5kTWV0aG9kIiwiUGFzc1R5cGUiLCJyZXEiLCJ3c1NvY2tldCIsImF1dGhvcml6ZWRWYWx1ZSIsInF1ZXJ5T2JqIiwidGFncyIsInJldHVybnMiLCJwYXJhbWV0ZXJzUmVmTmFtZSIsInBhcmFtZXRlcnMiLCJxdWVyeVBhcmFtZXRlcnMiLCJpc1JlZ2lzdGVyZWQiLCJleGVjdXRlU2V0dXAiLCJvblNlcnZlckF1dGhvcml6ZSIsIm9uU2VydmVyRXhlY3V0ZSIsIm9uQ2xpZW50RXhlY3V0ZSIsIm9uRXhlY3V0ZSIsIm5ld01ldGhvZCIsInRlc3RDYXNlTmFtZSIsImFkZFRlc3RDYXNlIiwibmV3VGVzdENhc2UiLCJ0ZXN0Q2FzZUZ1bmN0aW9uIiwidGVzdENhc2VJZCIsInRlc3RDYXNlIiwibWV0aG9kTmFtZSIsInNlcnZlclR5cGUiLCJsaXN0ZW5BZGRyZXNzIiwicG9ydHMiLCJodHRwIiwiaHR0cHMiLCJzc2wiLCJjZXJ0IiwiY2EiLCJyZWRpcmVjdEhUVFB0b0hUVFBTIiwic2VjcmV0cyIsInNldEFQSSIsIkhvdFRlc3Rlck1vY2hhIiwiSG90VGVzdGVyTW9jaGFTZWxlbml1bSIsIkhvdFRlc3RTZWxlbml1bURyaXZlciIsIkhvdExvZyIsInN0YXJ0RGVsYXkiLCJwYWdlcyIsIm1vZHVsZXMiLCJob3RTaXRlIiwiYXBpQ29udGVudCIsInRlc3RlckFwaUNvbnRlbnQiLCJwYWdlQ29udGVudCIsInRlc3RlcnMiLCJwYXJzZUJvb2xlYW4iLCJjb252ZXJ0SW50ZXJmYWNlVG9Sb3V0ZVBhcmFtZXRlcnMiLCJzb3VyY2VDb2RlUGF0aCIsImludGVyZmFjZU5hbWUiLCJ0eXBlQ29udmVyc2lvbnMiLCJyZXR1cm5GaXJzdFVuaW9uVHlwZSIsInVua25vd25UeXBlRGVmYXVsdHNUb1R5cGUiLCJIb3RJTyIsImV2YWwiLCJzb3VyY2VDb2RlQ29udGVudCIsInJlYWRUZXh0RmlsZSIsInBhcnNlSW50ZXJmYWNlIiwicHJvcGVydGllcyIsInByb3AiLCJjb21tZW50cyIsImlzT3B0aW9uYWwiLCJyZWFkT25seSIsImlzQXJyYXkiLCJpdGVtcyIsImdldFBhcmFtIiwib2JqV2l0aFBhcmFtIiwicmVxdWlyZWQiLCJ0aHJvd0V4Y2VwdGlvbiIsImdldFBhcmFtUmFuZ2UiLCJtaW4iLCJtYXgiLCJnZXRQYXJhbURlZmF1bHQiLCJkZWZhdWx0VmFsdWUiLCJjaGVja0lmRW1wdHkiLCJnZXRQYXJhbURlZmF1bHRSYW5nZSIsImV4ZWN1dGVFcnJvciIsImVyclR5cGUiLCJyZWRpcmVjdFRvVXJsIiwiaHJlZiIsIndhaXQiLCJudW1NaWxsaXNlY29uZHMiLCJzZXRUaW1lb3V0IiwiYWRkUGFnZSIsImdldFBhZ2UiLCJwYWdlTmFtZSIsInRocm93RXgiLCJ0ZW1wTmFtZSIsImtlZXBDb250ZXh0IiwiY29udGV4dCIsImFyeUFyZ3MiLCJwcm90b3R5cGUiLCJhZGRDb21wb25lbnQiLCJDb21wb25lbnRUeXBlIiwidGVtcEFwaSIsInRlbXBDb21wb25lbnRPYmoiLCJjb21wb25lbnRUeXBlIiwicmVnaXN0ZXJDb21wb25lbnQiLCJmaXhIVE1MIiwicGFyc2VkWE1MIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwicXVlcnlTZWxlY3RvciIsImNoaWxkcmVuIiwidGFnTmFtZSIsImZpeGVkU3RyIiwiYWRkSHRtbCIsInBhcmVudCIsImZvdW5kUGFyZW50IiwiaHRtbEhhbmRsZXIiLCJuZXdET00iLCJyZXN1bHRzIiwiY2hpbGQiLCJhcHBlbmRDaGlsZCIsImNoZWNrSG90U2l0ZU5hbWUiLCJob3RzaXRlTmFtZSIsImlzVmFsaWQiLCJ2YWxpZEZvck5ld1BhY2thZ2VzIiwicmVwbGFjZUtleSIsImdldFZhbHVlRnJvbUhvdFNpdGVPYmoiLCJob3RzaXRlIiwicGFyYW1zIiwicHJldlZhbHVlIiwicHJvY2Vzc0hvdFNpdGUiLCJ0ZXN0ZXIiLCJIb3RQYWdlIiwibWFwTmFtZSIsInRlc3RNYXAiLCJ0ZXN0TWFwcyIsIkhvdFRlc3RNYXAiLCJkZXN0aW5hdGlvbnMiLCJkZXN0IiwiSG90VGVzdERlc3RpbmF0aW9uIiwia2V5MiIsImRlc3RpbmF0aW9uT3JkZXIiLCJ3ZWIiLCJhcGlzIiwiY29tcG9uZW50IiwiY29tcG9uZW50VXJsIiwiQ29tcG9uZW50Q2xhc3MiLCJkaXNhYmxlRmlsZUxvYWRpbmciLCJhZGRUZXN0ZXIiLCJsb2FkSG90U2l0ZSIsImpzb25TdHIiLCJleHQiLCJwcGF0aCIsImV4dG5hbWUiLCJub3JtYWxpemUiLCJleGlzdHMiLCJ5YW1sIiwiaG90c2l0ZVBhdGgiLCJzYXZlSG90U2l0ZSIsImhvdHNpdGVTdHIiLCJ3cml0ZVRleHRGaWxlIiwiZm9yY2VDb250ZW50TG9hZGluZyIsImxvYWRVcmxDb250ZW50IiwibmV3RmlsZSIsImxvYWRDb250ZW50IiwiZ2VuZXJhdGVDb250ZW50Iiwicm91dGVLZXkiLCJqc1NyY1BhdGgiLCJwYXNzQXJncyIsImFwaVNjcmlwdHMiLCJhcGlDb2RlIiwic2VydmVyIiwiZ2xvYmFsQXBpIiwic2VuZEpTQ29udGVudCIsImpzYXBpIiwibGlicmFyeU5hbWUiLCJhcGlOYW1lIiwidGVtcEFQSUNvbnRlbnQiLCJqc2FwaXBhdGgiLCJzZWNyZXQiLCJzZXJ2ZXJDb25uIiwicGFzc1NlY3JldEZyb21BUEkiLCJlbnZLZXkiLCJ0ZW1wQ29udGVudCIsImRldmVsb3Blck1vZGVTdHIiLCJ0ZXN0ZXJBUElTdHIiLCJ0ZXN0aW5nIiwidGVzdGVyQVBJVXJsIiwibG9hZEZpbGVzIiwidGVzdGVyVXJsIiwidGVzdGVyTGF1bmNocGFkVXJsIiwibGF1bmNocGFkVXJsIiwic3RhcnREZWxheVN0ciIsImZpeENvbnRlbnQiLCJjcmVhdGVFeHByZXNzUm91dGVzIiwiZXhwcmVzc0FwcCIsInNlbmQiLCJnZXRXZWJUZXN0aW5nTWFwcyIsIm1hcHMiLCJnZXRBUElUZXN0aW5nTWFwcyIsImdldFJvdXRlS2V5RnJvbU5hbWUiLCJnZXRSb3V0ZUZyb21OYW1lIiwiZm91bmRSb3V0ZSIsImV4ZWN1dGVUZXN0cyIsImV4ZWN1dGUiLCJleGVjdXRlQWxsV2ViVGVzdHMiLCJleGVjdXRlQWxsQVBJVGVzdHMiLCJwcm9jZXNzTG9jYWxGaWxlIiwibG9jYWxGaWxlcGF0aCIsInByb2Nlc3NVcmwiLCJvblJlYWR5IiwicmVhZHlGdW5jIiwib25SZWFkeUV2ZW50IiwidXNlT3V0cHV0Iiwib25PdXRwdXRSZWNlaXZlZCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiaW5uZXJIVE1MIiwidG1wU2NyaXB0cyIsInNjcmlwdHMiLCJjcmVhdGVFbGVtZW50IiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwicmVzb2x2ZTIiLCJyZWplY3QyIiwib25sb2FkIiwiaGFzU3JjIiwiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiZGlzcGF0Y2hSZWFkeUV2ZW50cyIsImRpc3BhdGNoRXZlbnQiLCJFdmVudCIsIndhaXRGb3JUZXN0ZXJzIiwiaXNSZWFkeUZvclRlc3RpbmciLCJvblJlYWR5Rm9yVGVzdGluZyIsInNldHVwVGVzdGVycyIsInRlc3RlckFQSUJhc2VVcmwiLCJjbGllbnQiLCJIb3RDbGllbnQiLCJIb3RUZXN0ZXJBUEkiLCJzZXR1cENsaWVudFRlc3RlcnMiLCJvbkluaXRhbExvYWQiLCJyZWFkeVN0YXRlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRpc3BsYXlVcmwiLCJkaXNwbGF5Q29udGVudCIsImhvdFN0YXFXZWJTdGFydCIsImN1c3RvbUVsZW1lbnRzIiwicHJvY2Vzc29yQ29tcG9uZW50cyIsImRlZmluZSIsIkhUTUxFbGVtZW50Iiwic3VwZXIiLCJjb21wb25lbnRJbmZvIiwiaG90Q29tcG9uZW50IiwiaGFuZGxlQXR0cmlidXRlcyIsImF0dHIiLCJhdHRyTmFtZSIsImF0dHJWYWx1ZSIsImF0dHJUZW1wTmFtZSIsIm9uUHJlT3V0cHV0Iiwib3V0cHV0cyIsIm9uUG9zdE91dHB1dCIsImNvbXBvbmVudE91dHB1dHMiLCJpS2R4IiwiaHRtbFN0ciIsImFkZEZ1bmN0aW9uc1RvIiwicGxhY2VIZXJlIiwiZG9jdW1lbnRTZWxlY3RvciIsIm9uUGFyc2VkIiwib25GaXhIVE1MIiwiY2hpbGRyZW5Ub1JlYWRkIiwibmV3T2JqIiwib25QYXJzZURPTSIsInRocm93RXJyIiwicmVwbGFjZVdpdGgiLCJjbGljayIsImJpbmQiLCJldmVudCIsIm9iamVjdEZ1bmN0aW9ucyIsImdldE93blByb3BlcnR5TmFtZXMiLCJvYmpGdW5jIiwiaXNOZXdGdW5jdGlvbiIsIkhvdENvbXBvbmVudCIsIm9uUHJlUGxhY2UiLCJjb21wSHRtbEVsZW1lbnQyIiwib25QYXJlbnRQbGFjZSIsImNsb3Nlc3RTZWxlY3RvciIsInBhcmVudEVsbSIsImZvdW5kTm9kZSIsInBhcmVudEVsZW1lbnQiLCJwbGFjZUVsbUluUGFyZW50IiwicGFyZW50Tm9kZVRvQ2hlY2siLCJwbGFjZUhlcmVQYXJlbnQiLCJjaGlsZFRvUGxhY2UiLCJwYXJlbnROb2RlQ2hlY2tDb3VudGVyIiwiSFRNTEh0bWxFbGVtZW50IiwicGxhY2VIZXJlQXJyYXkiLCJxdWVyeVNlbGVjdG9yQWxsIiwicGxhY2VIZXJlQXR0ckFycmF5IiwicGxhY2VkQ2hpbGQiLCJwbGFjZUhlcmVQYXJlbnRBdHRyIiwib25Qb3N0UGxhY2UiLCJ0ZW1wIiwiY29tcG9uZW50TmFtZSIsImlkIiwibG9vc2VQYXJzZUZyb21TdHJpbmciLCJwYXJzZXIiLCJ4ZG9tIiwiaGRvbSIsImVsZW0iLCJmcm9tIiwib3V0ZXJIVE1MIiwiaG90c3RhcVN0YXJ0aW5nQXBwIiwiaG90c3RhcUVsbXMiLCJIb3RTdGFxV2ViIiwiaG90c3RhcUVsbSIsImdldEF0dHIiLCJhdHRyTmFtZXMiLCJsb2FkUGFnZSIsImxvZ2dpbmdMZXZlbCIsInJvdXRlciIsImFwaUpTVXJsIiwiYXBpTGlicmFyeSIsImFwaVVybCIsInRlc3RlckFwaUJhc2VVcmwiLCJkb250UmV1c2VQcm9jZXNzb3IiLCJwYXNzUmF3VXJsIiwiaHRtbFNvdXJjZSIsInJvdXRlck1hbmFnZXIiLCJyb3V0ZXJXaWxkY2FyZHMiLCJoc3RxYmFzZXJlZGlyZWN0IiwiZGVjb2RlVVJJIiwiaGlzdG9yeSIsInJlcGxhY2VTdGF0ZSIsImhvdHN0YXFFcnJvcnMiLCJob3RzdGFxRXJyb3JFbG0iLCJlcnJvclN0YXR1cyIsInVuc3VwcG9ydGVkQnJvd3NlciIsImhvdHN0YXFSb3V0ZXJFbG1zIiwiaG90c3RhcVJvdXRlckVsbSIsInJvdXRlck5hbWUiLCJzZXJ2ZUxvY2FsbHkiLCJpSmR4IiwiY2hpbGROb2RlcyIsInJvdXRlckVsbSIsInJvdXRlclBhdGgiLCJyZWRpcmVjdCIsImJhc2VSZWRpcmVjdCIsImJhc2UiLCJyb3V0ZXJTcmMiLCJzcmMiLCJjaGVja1BhdGgiLCJwYXRobmFtZSIsImdvdG9QYXRoIiwibG93ZXJTZXJ2ZUxvY2FsbHkiLCJsYXN0U2xhc2hQb3MiLCJyb3V0ZVdpbGRjYXJkIiwidGVtcFJvdXRlV2lsZGNhcmQiLCJzZWFyY2hQYXJhbXMiLCJtb2RpZmllZFNlYXJjaFBhcmFtcyIsImVuY29kZVVSSSIsImhhc0h0bWxTb3VyY2UiLCJodG1sU291cmNlQ2hlY2siLCJ0ZW1wTW9kZSIsImFwaUpTVXJsQ29udGVudCIsInBhcmVudExpYiIsIm5ld0FQSSIsImRlc3RpbmF0aW9uIiwiYXV0b1N0YXJ0IiwiY29tbWFuZERlbGF5IiwicGFnZVRlc3REZWxheSIsInBlcnNpc3RlbnREYXRhIiwicGFyc2VUZXN0T2JqZWN0Iiwid2lsZGNhcmQiLCJzZWxlY3RvciIsInByaW50Iiwic3Rkb3V0IiwicHJpbnRsbiIsImFzc2VydCIsImVycm9yTWVzc2FnZSIsIm11c3RCZVZpc2libGUiLCJpZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yIiwiSG90VGVzdGVyIiwiZHJpdmVyIiwidGltZW91dCIsImZpbmlzaGVkTG9hZGluZyIsImhhc0JlZW5TZXR1cCIsImhhc0JlZW5EZXN0cm95ZWQiLCJjdXJyZW50UGFnZSIsIm51bUZhaWx1cmVzIiwic2V0dXAiLCJpc1dlYlJvdXRlIiwiZGVzdGluYXRpb25LZXkiLCJ3YWl0Rm9yRGF0YSIsImludGVycHJldERlc3RpbmF0aW9uIiwidGVzdERlc3QiLCJuZXdEZXN0aW5hdGlvbiIsInBhdGhzIiwic3RycyIsImdldFR5cGUiLCJ0eXBlU3RyIiwidHlwZURlbGltaXRlciIsInR5cGVWYWx1ZSIsIm5ld1BhdGhTdHIiLCJuZXdQYXRoIiwiY21kIiwiZXhlY3V0ZVRlc3RBUElQYXRoIiwidGVzdE5hbWUiLCJza2lwRXZlbnRDYWxscyIsImNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlIiwicnVuVGVzdFBhdGgiLCJvblRlc3RBUElQYXRoU3RhcnQiLCJ0ZXN0Q2FzZU9iamVjdCIsIm9uVGVzdEFQSVBhdGhFbmQiLCJleGVjdXRlVGVzdEFQSVBhdGhzIiwiZXhlY3V0ZVRlc3RQYWdlUGF0aCIsInN0b3AiLCJ0ZXN0UGF0aE5hbWUiLCJ0ZXN0UGF0aCIsIm9uVGVzdFBhZ2VQYXRoU3RhcnQiLCJvblRlc3RQYWdlUGF0aEVuZCIsImV4ZWN1dGVDb21tYW5kIiwiaGFzQ21kIiwiaW5wdXQiLCJoYXNBcmd1bWVudHMiLCJnZXRDbWRBcmdzIiwiY21kRnVuYyIsImNtZEFyZ3MiLCJuYXZpZ2F0ZVRvVXJsIiwidGVzdE9iamVjdCIsIndhaXRGb3JUZXN0RWxlbWVudCIsImVsbU5hbWUiLCJzZW5kS2V5cyIsImNsZWFyIiwib25Db21tYW5kIiwiZXhlY3V0ZVRlc3RQYWdlUGF0aHMiLCJleGVjdXRlRGVzdGluYXRpb24iLCJydW5UZXN0UGF0aHMiLCJvblRlc3RTdGFydCIsIm9uVGVzdEVuZCIsImhhc0V4ZWN1dGVkS2V5cyIsIm9yZGVyS2V5IiwiZXhlY3V0ZURlc3QiLCJIb3RBUEkiLCJwYWdlTG9hZGVkIiwicGFnZVVubG9hZGVkIiwiaGVhcnRiZWF0IiwicmVxdWVzdCIsInRlc3Rlck9iaiIsInRlc3RQYXRoc1N0cnMiLCJ0ZXN0T2JqIiwidGhyb3dFcnJvciIsIm5ld1BhZ2UiLCJzZXRBc0N1cnJlbnQiLCJvbkZpbmlzaGVkTG9hZGluZyIsIm9uRmluaXNoZWRVbmxvYWRpbmciLCJzb2NrZXQiLCJvbkNvbm5lY3RFcnJvciIsIm9uRXJyb3IiLCJvbkRpc2Nvbm5lY3QiLCJ1c2VTb2NrZXQiLCJjb25uZWN0IiwiYXV0aCIsInF1ZXJ5Iiwic29ja2V0T2JqIiwiaW8iLCJvbiIsIm9uQ29ubmVjdCIsInV1aWQiLCJ1dWlkMiIsIm9uUmF3Iiwib2ZmIiwib25jZSIsIm9uY2VSYXciLCJnZXRJZCIsImlzQ29ubmVjdGVkIiwiY29ubmVjdGVkIiwiZW1pdCIsInNlbmRPbiIsInNlbmRPbmNlIiwiZGlzY29ubmVjdCIsInJlbW92ZUZyb21TZXJ2ZXIiLCJnZXRSYW5kb21WYWx1ZXMiLCJybmRzOCIsIlVpbnQ4QXJyYXkiLCJybmciLCJjcnlwdG8iLCJtc0NyeXB0byIsImJ5dGVUb0hleCIsImFyciIsIm9mZnNldCIsIlR5cGVFcnJvciIsIl9ub2RlSWQiLCJfY2xvY2tzZXEiLCJfbGFzdE1TZWNzIiwiX2xhc3ROU2VjcyIsImJ1ZiIsIm5vZGUiLCJjbG9ja3NlcSIsInNlZWRCeXRlcyIsInJhbmRvbSIsIm1zZWNzIiwibnNlY3MiLCJkdCIsInRsIiwidG1oIiwiaGFzaGZ1bmMiLCJnZW5lcmF0ZVVVSUQiLCJ1bmVzY2FwZSIsImJ5dGVzIiwic3RyaW5nVG9CeXRlcyIsIkROUyIsIlVSTCIsImdldE91dHB1dExlbmd0aCIsImlucHV0TGVuZ3RoOCIsInNhZmVBZGQiLCJ4IiwieSIsImxzdyIsIm1kNWNtbiIsInEiLCJ0IiwibnVtIiwiY250IiwibWQ1ZmYiLCJtZDVnZyIsIm1kNWhoIiwibWQ1aWkiLCJ2MzUiLCJsZW5ndGgzMiIsImhleFRhYiIsImhleCIsImNoYXJBdCIsIm1kNVRvSGV4RW5jb2RlZEFycmF5Iiwib2xkYSIsIm9sZGIiLCJvbGRjIiwib2xkZCIsIndvcmRzVG9NZDUiLCJsZW5ndGg4IiwiVWludDMyQXJyYXkiLCJieXRlc1RvV29yZHMiLCJybmRzIiwiZiIsInoiLCJST1RMIiwiSyIsIkgiLCJsIiwiTiIsImNlaWwiLCJNIiwiX2kiLCJwb3ciLCJmbG9vciIsIl9pMiIsIlciLCJfdCIsIl90MiIsIlQiLCJGb3JtRGF0YSIsImZldGNoIiwiaGFzQ09SUyIsIlhNTEh0dHBSZXF1ZXN0IiwiZGVjb2RlIiwiZW5jb2RlIiwiaGFzT3duUHJvcGVydHkiLCJxcyIsInFyeSIsInBhaXJzIiwicGFpciIsInJlIiwidXJpIiwiaG9zdCIsImF1dGhvcml0eSIsImlwdjZ1cmkiLCJwYXRoTmFtZXMiLCJxdWVyeUtleSIsIiQwIiwiJDIiLCJ5ZWFzdCIsImFscGhhYmV0Iiwic2VlZCIsImVuY29kZWQiLCJkZWNvZGVkIiwiZ2xvYmFsVGhpc1NoaW0iLCJuZXh0VGljayIsImluc3RhbGxUaW1lckZ1bmN0aW9ucyIsInRyYW5zcG9ydHMiLCJUcmFuc3BvcnRFcnJvciIsIlRyYW5zcG9ydCIsInByb3RvY29sIiwiU29ja2V0Iiwic29ja2V0X2pzXzEiLCJ0cmFuc3BvcnRfanNfMSIsImluZGV4X2pzXzEiLCJ1dGlsX2pzXzEiLCJwYXJzZXVyaV9qc18xIiwid2Vic29ja2V0X2NvbnN0cnVjdG9yX2pzXzEiLCJfX2ltcG9ydERlZmF1bHQiLCJtb2QiLCJfX2VzTW9kdWxlIiwicGFyc2Vxc19qc18xIiwiZGVidWdfMSIsImNvbXBvbmVudF9lbWl0dGVyXzEiLCJlbmdpbmVfaW9fcGFyc2VyXzEiLCJFbWl0dGVyIiwib3B0cyIsImJpbmFyeVR5cGUiLCJkZWZhdWx0QmluYXJ5VHlwZSIsIndyaXRlQnVmZmVyIiwiaG9zdG5hbWUiLCJzZWN1cmUiLCJwb3J0IiwicHJldkJ1ZmZlckxlbiIsImFnZW50Iiwid2l0aENyZWRlbnRpYWxzIiwidXBncmFkZSIsInRpbWVzdGFtcFBhcmFtIiwicmVtZW1iZXJVcGdyYWRlIiwiYWRkVHJhaWxpbmdTbGFzaCIsInJlamVjdFVuYXV0aG9yaXplZCIsInBlck1lc3NhZ2VEZWZsYXRlIiwidGhyZXNob2xkIiwidHJhbnNwb3J0T3B0aW9ucyIsImNsb3NlT25CZWZvcmV1bmxvYWQiLCJ1cGdyYWRlcyIsInBpbmdJbnRlcnZhbCIsInBpbmdUaW1lb3V0IiwicGluZ1RpbWVvdXRUaW1lciIsImJlZm9yZXVubG9hZEV2ZW50TGlzdGVuZXIiLCJ0cmFuc3BvcnQiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJjbG9zZSIsIm9mZmxpbmVFdmVudExpc3RlbmVyIiwib25DbG9zZSIsIm9wZW4iLCJjcmVhdGVUcmFuc3BvcnQiLCJFSU8iLCJzaWQiLCJwcmlvcldlYnNvY2tldFN1Y2Nlc3MiLCJzZXRUaW1lb3V0Rm4iLCJlbWl0UmVzZXJ2ZWQiLCJzaGlmdCIsInNldFRyYW5zcG9ydCIsIm9uRHJhaW4iLCJvblBhY2tldCIsInByb2JlIiwiZmFpbGVkIiwib25UcmFuc3BvcnRPcGVuIiwidXBncmFkaW5nIiwicGF1c2UiLCJjbGVhbnVwIiwiZmx1c2giLCJmcmVlemVUcmFuc3BvcnQiLCJvbmVycm9yIiwib25UcmFuc3BvcnRDbG9zZSIsIm9uY2xvc2UiLCJvbnVwZ3JhZGUiLCJ0byIsInJlbW92ZUxpc3RlbmVyIiwib25PcGVuIiwicGFja2V0IiwicmVzZXRQaW5nVGltZW91dCIsIm9uSGFuZHNoYWtlIiwic2VuZFBhY2tldCIsImNvZGUiLCJmaWx0ZXJVcGdyYWRlcyIsIm1heFBheWxvYWQiLCJjbGVhclRpbWVvdXRGbiIsImF1dG9VbnJlZiIsInVucmVmIiwid3JpdGFibGUiLCJwYWNrZXRzIiwiZ2V0V3JpdGFibGVQYWNrZXRzIiwicGF5bG9hZFNpemUiLCJieXRlTGVuZ3RoIiwiZm4iLCJjb21wcmVzcyIsImNsZWFudXBBbmRDbG9zZSIsIndhaXRGb3JVcGdyYWRlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImZpbHRlcmVkVXBncmFkZXMiLCJkb09wZW4iLCJkb0Nsb3NlIiwib25EYXRhIiwiZGVjb2RlUGFja2V0IiwiZGV0YWlscyIsIm9uUGF1c2UiLCJjcmVhdGVVcmkiLCJfaG9zdG5hbWUiLCJfcG9ydCIsIl9xdWVyeSIsImVuY29kZWRRdWVyeSIsInBvbGxpbmdfanNfMSIsIndlYnNvY2tldF9qc18xIiwid2VidHJhbnNwb3J0X2pzXzEiLCJ3ZWJzb2NrZXQiLCJXUyIsIndlYnRyYW5zcG9ydCIsIldUIiwicG9sbGluZyIsIlBvbGxpbmciLCJSZXF1ZXN0IiwieWVhc3RfanNfMSIsInhtbGh0dHByZXF1ZXN0X2pzXzEiLCJnbG9iYWxUaGlzX2pzXzEiLCJlbXB0eSIsImhhc1hIUjIiLCJYSFIiLCJ4ZG9tYWluIiwicmVzcG9uc2VUeXBlIiwiaXNTU0wiLCJ4ZCIsImZvcmNlQmFzZTY0Iiwic3VwcG9ydHNCaW5hcnkiLCJjb29raWVKYXIiLCJjcmVhdGVDb29raWVKYXIiLCJwb2xsIiwidG90YWwiLCJkb1BvbGwiLCJkZWNvZGVQYXlsb2FkIiwiZW5jb2RlUGF5bG9hZCIsImRvV3JpdGUiLCJ0aW1lc3RhbXBSZXF1ZXN0cyIsImI2NCIsInhoclN0YXR1cyIsInBvbGxYaHIiLCJfYSIsInBpY2siLCJ4aHIiLCJleHRyYUhlYWRlcnMiLCJzZXREaXNhYmxlSGVhZGVyQ2hlY2siLCJzZXRSZXF1ZXN0SGVhZGVyIiwiYWRkQ29va2llcyIsInJlcXVlc3RUaW1lb3V0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicGFyc2VDb29raWVzIiwib25Mb2FkIiwicmVxdWVzdHNDb3VudCIsInJlcXVlc3RzIiwiZnJvbUVycm9yIiwiYWJvcnQiLCJyZXNwb25zZVRleHQiLCJhdHRhY2hFdmVudCIsInVubG9hZEhhbmRsZXIiLCJ0ZXJtaW5hdGlvbkV2ZW50IiwidXNpbmdCcm93c2VyV2ViU29ja2V0IiwiV2ViU29ja2V0IiwiY2IiLCJNb3pXZWJTb2NrZXQiLCJpc1JlYWN0TmF0aXZlIiwicHJvZHVjdCIsImNoZWNrIiwicHJvdG9jb2xzIiwid3MiLCJhZGRFdmVudExpc3RlbmVycyIsIm9ub3BlbiIsIl9zb2NrZXQiLCJjbG9zZUV2ZW50Iiwib25tZXNzYWdlIiwiZXYiLCJsYXN0UGFja2V0IiwiZW5jb2RlUGFja2V0IiwiQnVmZmVyIiwiV2ViVHJhbnNwb3J0IiwiY2xvc2VkIiwicmVhZHkiLCJjcmVhdGVCaWRpcmVjdGlvbmFsU3RyZWFtIiwic3RyZWFtIiwiZGVjb2RlclN0cmVhbSIsImNyZWF0ZVBhY2tldERlY29kZXJTdHJlYW0iLCJNQVhfU0FGRV9JTlRFR0VSIiwicmVhZGVyIiwicmVhZGFibGUiLCJwaXBlVGhyb3VnaCIsImdldFJlYWRlciIsImVuY29kZXJTdHJlYW0iLCJjcmVhdGVQYWNrZXRFbmNvZGVyU3RyZWFtIiwicGlwZVRvIiwid3JpdGVyIiwiZ2V0V3JpdGVyIiwiZG9uZSIsImhhc19jb3JzX2pzXzEiLCJjb25jYXQiLCJyZWR1Y2UiLCJhY2MiLCJrIiwiTkFUSVZFX1NFVF9USU1FT1VUIiwiTkFUSVZFX0NMRUFSX1RJTUVPVVQiLCJjbGVhclRpbWVvdXQiLCJ1c2VOYXRpdmVUaW1lcnMiLCJ1dGY4TGVuZ3RoIiwic2l6ZSIsIkVSUk9SX1BBQ0tFVCIsIlBBQ0tFVF9UWVBFU19SRVZFUlNFIiwiUEFDS0VUX1RZUEVTIiwiY2hhcnMiLCJsb29rdXAiLCJhcnJheWJ1ZmZlciIsImJhc2U2NCIsImVuY29kZWQxIiwiZW5jb2RlZDIiLCJlbmNvZGVkMyIsImVuY29kZWQ0IiwiYnVmZmVyTGVuZ3RoIiwicCIsIkFycmF5QnVmZmVyIiwiY29tbW9uc19qc18xIiwiYmFzZTY0X2FycmF5YnVmZmVyX2pzXzEiLCJ3aXRoTmF0aXZlQXJyYXlCdWZmZXIiLCJlbmNvZGVkUGFja2V0IiwibWFwQmluYXJ5IiwiZGVjb2RlQmFzZTY0UGFja2V0IiwiQmxvYiIsImJ1ZmZlciIsImVuY29kZVBhY2tldFRvQmluYXJ5Iiwid2l0aE5hdGl2ZUJsb2IiLCJpc1ZpZXciLCJlbmNvZGVCbG9iQXNCYXNlNjQiLCJmaWxlUmVhZGVyIiwiRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJ0b0FycmF5IiwiYnl0ZU9mZnNldCIsIlRFWFRfRU5DT0RFUiIsImFycmF5QnVmZmVyIiwiVGV4dEVuY29kZXIiLCJlbmNvZGVQYWNrZXRfanNfMSIsImRlY29kZVBhY2tldF9qc18xIiwiU0VQQVJBVE9SIiwiZnJvbUNoYXJDb2RlIiwiVEVYVF9ERUNPREVSIiwidG90YWxMZW5ndGgiLCJjaHVua3MiLCJjaHVuayIsImNvbmNhdENodW5rcyIsImVuY29kZWRQYWNrZXRzIiwiY291bnQiLCJlbmNvZGVkUGF5bG9hZCIsImRlY29kZWRQYWNrZXQiLCJUcmFuc2Zvcm1TdHJlYW0iLCJ0cmFuc2Zvcm0iLCJjb250cm9sbGVyIiwicGF5bG9hZExlbmd0aCIsImhlYWRlciIsIkRhdGFWaWV3Iiwic2V0VWludDgiLCJ2aWV3Iiwic2V0VWludDE2Iiwic2V0QmlnVWludDY0IiwiQmlnSW50IiwiZW5xdWV1ZSIsIlRleHREZWNvZGVyIiwic3RhdGUiLCJleHBlY3RlZExlbmd0aCIsImlzQmluYXJ5IiwiaGVhZGVyQXJyYXkiLCJnZXRVaW50MTYiLCJnZXRVaW50MzIiLCJCYWNrb2ZmIiwiZmFjdG9yIiwiaml0dGVyIiwiYXR0ZW1wdHMiLCJkdXJhdGlvbiIsInJhbmQiLCJkZXZpYXRpb24iLCJyZXNldCIsInNldE1pbiIsInNldE1heCIsInNldEppdHRlciIsIk1hbmFnZXIiLCJ1cmxfanNfMSIsIm1hbmFnZXJfanNfMSIsImNhY2hlIiwicGFyc2VkIiwic2FtZU5hbWVzcGFjZSIsImZvcmNlTmV3IiwibXVsdGlwbGV4Iiwic29ja2V0X2lvX3BhcnNlcl8xIiwiX19jcmVhdGVCaW5kaW5nIiwibyIsImsyIiwiX19zZXRNb2R1bGVEZWZhdWx0IiwiX19pbXBvcnRTdGFyIiwiZW5naW5lX2lvX2NsaWVudF8xIiwib25fanNfMSIsImJhY2tvMl9qc18xIiwibnNwcyIsInN1YnMiLCJyZWNvbm5lY3Rpb24iLCJyZWNvbm5lY3Rpb25BdHRlbXB0cyIsIkluZmluaXR5IiwicmVjb25uZWN0aW9uRGVsYXkiLCJyZWNvbm5lY3Rpb25EZWxheU1heCIsInJhbmRvbWl6YXRpb25GYWN0b3IiLCJiYWNrb2ZmIiwiX3JlYWR5U3RhdGUiLCJfcGFyc2VyIiwiZW5jb2RlciIsIkVuY29kZXIiLCJkZWNvZGVyIiwiRGVjb2RlciIsIl9hdXRvQ29ubmVjdCIsImF1dG9Db25uZWN0IiwiX3JlY29ubmVjdGlvbiIsIl9yZWNvbm5lY3Rpb25BdHRlbXB0cyIsIl9yZWNvbm5lY3Rpb25EZWxheSIsIl9yYW5kb21pemF0aW9uRmFjdG9yIiwiX3JlY29ubmVjdGlvbkRlbGF5TWF4IiwiX3RpbWVvdXQiLCJtYXliZVJlY29ubmVjdE9uT3BlbiIsIl9yZWNvbm5lY3RpbmciLCJyZWNvbm5lY3QiLCJlbmdpbmUiLCJza2lwUmVjb25uZWN0Iiwib3BlblN1YkRlc3Ryb3kiLCJlcnJvclN1YiIsInRpbWVyIiwib25waW5nIiwib25kYXRhIiwib25kZWNvZGVkIiwiYWRkIiwibnNwIiwiYWN0aXZlIiwiX2Rlc3Ryb3kiLCJfY2xvc2UiLCJfcGFja2V0Iiwic3ViRGVzdHJveSIsImRlbGF5Iiwib25yZWNvbm5lY3QiLCJhdHRlbXB0IiwiUkVTRVJWRURfRVZFTlRTIiwiY29ubmVjdF9lcnJvciIsImRpc2Nvbm5lY3RpbmciLCJuZXdMaXN0ZW5lciIsInJlY292ZXJlZCIsInJlY2VpdmVCdWZmZXIiLCJzZW5kQnVmZmVyIiwiX3F1ZXVlIiwiX3F1ZXVlU2VxIiwiaWRzIiwiYWNrcyIsImZsYWdzIiwiX29wdHMiLCJkaXNjb25uZWN0ZWQiLCJzdWJFdmVudHMiLCJvbnBhY2tldCIsInJldHJpZXMiLCJmcm9tUXVldWUiLCJ2b2xhdGlsZSIsIl9hZGRUb1F1ZXVlIiwiUGFja2V0VHlwZSIsIkVWRU5UIiwiYWNrIiwicG9wIiwiX3JlZ2lzdGVyQWNrQ2FsbGJhY2siLCJpc1RyYW5zcG9ydFdyaXRhYmxlIiwibm90aWZ5T3V0Z29pbmdMaXN0ZW5lcnMiLCJhY2tUaW1lb3V0Iiwid2l0aEVycm9yIiwiZW1pdFdpdGhBY2siLCJhcmcxIiwiYXJnMiIsInRyeUNvdW50IiwicGVuZGluZyIsInJlc3BvbnNlQXJncyIsIl9kcmFpblF1ZXVlIiwiZm9yY2UiLCJfc2VuZENvbm5lY3RQYWNrZXQiLCJDT05ORUNUIiwiX3BpZCIsInBpZCIsIl9sYXN0T2Zmc2V0IiwiX2NsZWFyQWNrcyIsInNvbWUiLCJvbmNvbm5lY3QiLCJCSU5BUllfRVZFTlQiLCJvbmV2ZW50IiwiQUNLIiwiQklOQVJZX0FDSyIsIm9uYWNrIiwiRElTQ09OTkVDVCIsIm9uZGlzY29ubmVjdCIsIkNPTk5FQ1RfRVJST1IiLCJlbWl0RXZlbnQiLCJfYW55TGlzdGVuZXJzIiwibGlzdGVuZXJzIiwibGlzdGVuZXIiLCJzZW50IiwiZW1pdEJ1ZmZlcmVkIiwib25BbnkiLCJwcmVwZW5kQW55Iiwib2ZmQW55IiwibGlzdGVuZXJzQW55Iiwib25BbnlPdXRnb2luZyIsIl9hbnlPdXRnb2luZ0xpc3RlbmVycyIsInByZXBlbmRBbnlPdXRnb2luZyIsIm9mZkFueU91dGdvaW5nIiwibGlzdGVuZXJzQW55T3V0Z29pbmciLCJsb2MiLCJyZWNvbnN0cnVjdFBhY2tldCIsImRlY29uc3RydWN0UGFja2V0IiwiaXNfYmluYXJ5X2pzXzEiLCJfZGVjb25zdHJ1Y3RQYWNrZXQiLCJidWZmZXJzIiwicGxhY2Vob2xkZXIiLCJfcGxhY2Vob2xkZXIiLCJuZXdEYXRhIiwiX3JlY29uc3RydWN0UGFja2V0IiwicGFja2V0RGF0YSIsInBhY2siLCJhdHRhY2htZW50cyIsImJpbmFyeV9qc18xIiwiaXNPYmplY3QiLCJyZXBsYWNlciIsImhhc0JpbmFyeSIsImVuY29kZUFzU3RyaW5nIiwiZW5jb2RlQXNCaW5hcnkiLCJkZWNvbnN0cnVjdGlvbiIsInJldml2ZXIiLCJyZWNvbnN0cnVjdG9yIiwiZGVjb2RlU3RyaW5nIiwiaXNCaW5hcnlFdmVudCIsIkJpbmFyeVJlY29uc3RydWN0b3IiLCJ0YWtlQmluYXJ5RGF0YSIsIm5leHQiLCJwYXlsb2FkIiwidHJ5UGFyc2UiLCJpc1BheWxvYWRWYWxpZCIsImZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24iLCJyZWNvblBhY2siLCJiaW5EYXRhIiwid2l0aE5hdGl2ZUZpbGUiLCJGaWxlIiwidG9KU09OIiwibWl4aW4iLCJfY2FsbGJhY2tzIiwiY2FsbGJhY2tzIiwiaGFzTGlzdGVuZXJzIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsImRlZmluaXRpb24iLCJnbG9iYWxUaGlzIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJIb3RTdGFydE9wdGlvbnMiLCJJSG90U3RhcSIsIkhvdFNpdGUiLCJIb3RTaXRlUm91dGUiLCJIb3RTaXRlTWFwUGF0aCIsIkhvdE1vZHVsZSIsIkhvdENvbXBvbmVudE91dHB1dCIsIklIb3RDb21wb25lbnQiLCJBUEl0b0xvYWQiLCJTZXJ2ZXJSZXF1ZXN0IiwiSG90Um91dGVNZXRob2RQYXJhbWV0ZXIiLCJIb3RXZWJTb2NrZXRDbGllbnQiLCJIb3RUZXN0RHJpdmVyIiwiSUhvdFRlc3RFbGVtZW50IiwiSG90VGVzdEVsZW1lbnRPcHRpb25zIiwiSUhvdFRlc3RFbGVtZW50T3B0aW9ucyIsIkhvdFRlc3RTdG9wIiwiSG90RGVzdGluYXRpb24iLCJIb3RUZXN0UGF0aCIsIkhvdFRlc3RQYWdlIl0sInNvdXJjZVJvb3QiOiIifQ==
|