piclist 0.6.7 → 0.6.9
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/dist/index.cjs.js +2 -2
- package/dist/index.esm.js +2 -2
- package/dist/types/index.d.ts +1 -0
- package/package.json +4 -4
package/dist/index.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"fs-extra";import t from"path";import{EventEmitter as r}from"events";import n,{homedir as i}from"os";import{Command as a}from"commander";import s from"inquirer";import{imageSize as o}from"image-size";import{URL as l}from"url";import E from"text-to-svg";import c from"sharp";import u from"crypto";import{v4 as I}from"uuid";import _ from"chalk";import p from"minimatch";import g from"globby";import S from"ejs";import d from"download-git-repo";import m from"rimraf";import A from"dayjs";import P from"util";import h from"axios";import{cloneDeep as f,merge as C,get as D,set as U,unset as T}from"lodash";import N from"heic-convert";import L from"mime-types";import R from"qiniu";import B from"md5";import M from"resolve";import{spawn as O}from"child_process";import y from"is-wsl";import w from"form-data";import G from"https";import b from"tunnel";import{JSONStore as x}from"@picgo/store";import $ from"cross-spawn";import W from"js-yaml";import{ObjectAdapter as v,I18n as H}from"@picgo/i18n";const F={handle:e=>{const t=e.cmd;t.program.command("install <plugins...>").description("install picgo plugin").alias("add").option("-p, --proxy <proxy>","Add proxy for installing").option("-r, --registry <registry>","Choose a registry for installing").action(((t,r)=>{const{proxy:n,registry:i}=r,a={proxy:n,registry:i};e.pluginHandler.install(t,a).catch((t=>{e.log.error(t)}))})),t.program.command("uninstall <plugins...>").alias("rm").description("uninstall picgo plugin").action((t=>{e.pluginHandler.uninstall(t).catch((t=>{e.log.error(t)}))})),t.program.command("update <plugins...>").description("update picgo plugin").option("-p, --proxy <proxy>","Add proxy for installing").option("-r, --registry <registry>","Choose a registry for installing").action(((t,r)=>{const{proxy:n,registry:i}=r,a={proxy:n,registry:i};e.pluginHandler.update(t,a).catch((t=>{e.log.error(t)}))}))}},K={handle:e=>{e.cmd.program.option("-c, --config <path>","set config path")}};function k(e){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";return Array.from({length:e}).map((()=>t.charAt(Math.floor(Math.random()*t.length)))).join("")}function q(e,r,n){const i={"{Y}":()=>(new Date).getFullYear().toString(),"{y}":()=>(new Date).getFullYear().toString().slice(2),"{m}":()=>1===((new Date).getMonth()+1).toString().length?`0${(new Date).getMonth()+1}`:((new Date).getMonth()+1).toString(),"{d}":()=>1===(new Date).getDate().toString().length?`0${(new Date).getDate()}`:(new Date).getDate().toString(),"{h}":()=>1===(new Date).getHours().toString().length?`0${(new Date).getHours()}`:(new Date).getHours().toString(),"{i}":()=>1===(new Date).getMinutes().toString().length?`0${(new Date).getMinutes()}`:(new Date).getMinutes().toString(),"{s}":()=>1===(new Date).getSeconds().toString().length?`0${(new Date).getSeconds()}`:(new Date).getSeconds().toString(),"{md5}":()=>u.createHash("md5").update(t.basename(e,t.extname(e))).digest("hex"),"{md5-16}":()=>u.createHash("md5").update(t.basename(e,t.extname(e))).digest("hex").slice(0,16),"{str-10}":()=>k(10),"{str-20}":()=>k(20),"{filename}":()=>n?t.basename(n,t.extname(n)):t.basename(e,t.extname(e)),"{uuid}":()=>I().replace(/-/g,""),"{timestamp}":()=>Math.floor(Date.now()/1e3).toString()};if(void 0===r||!Object.keys(i).some((e=>r.includes(e)))&&!r.includes("localFolder"))return e;const a=t.extname(e);let s=Object.keys(i).reduce(((e,t)=>e.replace(new RegExp(t,"g"),i[t]())),r)+a;return s=s.replace(/{(localFolder:?(\d+)?)}/gi,((r,n,i)=>{i=Math.max(1,i||0);return t.dirname(e).split(t.sep).slice(0-i).reduce(((e,t)=>`${e}/${t}`)).replace(/:/g,"")})),s}const j=e=>/^https?:\/\//.test(e),V=e=>{e=e||"";try{return e!==decodeURI(e)}catch(e){return!1}},Y=e=>(V(e)||(e=encodeURI(e)),e),z=e=>{try{const{width:t=0,height:r=0}=o(e);return{real:!0,width:t,height:r}}catch(e){return{real:!1,width:200,height:200}}},Q=async r=>{try{return{extname:t.extname(r),fileName:t.basename(r),buffer:await e.readFile(r),success:!0}}catch(e){return{reason:`read file ${r} error`,success:!1}}},X=async(e,r)=>{let n;e=Y(e);const i=new Promise(((i,a)=>{(async()=>{var a;try{const a=await r.request({method:"get",url:e,resolveWithFullResponse:!0,responseType:"arraybuffer"}).then((e=>e.data));clearTimeout(n);const s=new l(e).pathname;i({buffer:a,fileName:t.basename(s),extname:t.extname(s),success:!0})}catch(t){clearTimeout(n),i({success:!1,reason:`request ${e} error, ${null!==(a=null==t?void 0:t.message)&&void 0!==a?a:""}`})}})().catch(a)})),a=new Promise((t=>{n=setTimeout((()=>{t({success:!1,reason:`request ${e} timeout`})}),3e4)}));return Promise.race([i,a])},Z=e=>/^@[^/]+\/picgo-plugin-/.test(e)?"scope":e.startsWith("picgo-plugin-")?"normal":J(e)?"simple":"unknown",J=r=>{if(t.isAbsolute(r))return!1;const n=t.join(process.cwd(),r);return!e.existsSync(n)&&(!r.includes("/")&&!r.includes("\\"))},ee=(e,t="")=>t?`@${t}/picgo-plugin-${e}`:`picgo-plugin-${e}`,te=(r,n=console)=>{switch(Z(r)){case"normal":case"scope":return r;case"simple":return ee(r);default:{let i=r;return t.isAbsolute(r)&&e.existsSync(r)?ne(i):(i=t.join(process.cwd(),r),e.existsSync(i)?ne(i):(n.warn(`Can't find plugin ${r}`),""))}}},re=(r,n=console)=>{var i;switch(Z(r)){case"normal":return ie(r);case"scope":return ie(r,!0);case"simple":return ie(ee(r));default:{if(!e.existsSync(r))return n.warn(`Can't find plugin: ${r}`),"";const a=t.posix.join(r,"package.json");if(e.existsSync(a)){const t=e.readJSONSync(a)||{};return(null===(i=t.name)||void 0===i?void 0:i.includes("picgo-plugin-"))?t.name:(n.warn(`The plugin package.json's name filed is ${t.name||"empty"}, need to include the prefix: picgo-plugin-`),"")}return n.warn(`Can't find plugin: ${r}`),""}}},ne=e=>e.split(t.sep).join("/"),ie=(e,t=!1)=>{if(e.includes("@")){let r=/(.+\/)?(picgo-plugin-\w+)(@.+)*/;t&&(r=/(.+\/)?(^@[^/]+\/picgo-plugin-\w+)(@.+)*/);const n=e.match(r);return n?n[2]:(console.warn("can not remove plugin version"),e)}return e},ae=[],se=e=>ae.some((t=>e.startsWith(t))),oe=e=>"object"==typeof e&&!Array.isArray(e)&&Object.keys(e).length>0;function le(e){try{return JSON.parse(e)}catch(t){return e}}const Ee=(e=0)=>isNaN(Number(e))?0:Number(e),ce=()=>"development"===process.env.NODE_ENV;const ue=`${__dirname}/assets/piclist.png`;async function Ie(e,t,r,n,i,a,s,o,l,u,I){o=!o||o<0||o>1?.15:o;const _=c(e),{width:p=200}=await _.metadata(),g=await async function(e,t,r,n,i,a,s,o=200,l=0){let u;"image"===e?(s=s||ue,u=await c(s).toBuffer()):u=await async function(e,t,r,n){t=t||"测试",n=n||e;const i={anchor:"top",attributes:{fill:r=r||"rgba(204, 204, 204, 0.45)"}},a=E.loadSync(n).getSVG(t,i);return Buffer.from(a)}(t,r,a,n||t);const{width:I,height:_}=await async function(e){const{width:t,height:r}=await c(e).metadata();return{width:t||200,height:r||200}}(u),p=Math.floor(o*Ee(i)),g=Math.floor(p*_/I);return await c(u).resize(p,g,{fit:"inside"}).rotate(l,{background:{r:255,g:255,b:255,alpha:0}}).toBuffer()}(t,r,a,s,o,l,u,p,i);return await _.composite([{input:g,gravity:I||"southeast",tile:n}]).toBuffer()}const _e=(...e)=>e.every((e=>null!=e&&("string"==typeof e?""!==e:"number"==typeof e?e>0:"object"!=typeof e||Object.keys(e).length>0))),pe=["avif","dz","fits","gif","heif","input","jpeg","jpg","jp2","jxl","magick","openslide","pdf","png","ppm","raw","svg","tiff","tif","v","webp"],ge=["jpg","jpeg","png","gif","webp","bmp","tiff","tif","svg","ico","avif","heif","heic"];async function Se(e,t,r){try{let n=c(e);return _e(t.watermarkText)&&(n=c(await Ie(e,t.watermarkType||"text",r,t.isFullScreenWatermark,Ee(t.watermarkDegree),t.watermarkText,t.watermarkFontPath,Ee(t.watermarkScaleRatio),t.watermarkColor,t.watermarkImagePath,t.watermarkPosition))),await n.toBuffer()}catch(t){return console.log(t),e}}function de(e){return{quality:Ee(e.quality),isConvert:e.isConvert||!1,convertFormat:e.convertFormat||"jpg",isReSize:e.isReSize||!1,reSizeHeight:Ee(e.reSizeHeight),reSizeWidth:Ee(e.reSizeWidth),isReSizeByPercent:e.isReSizeByPercent||!1,reSizePercent:Ee(e.reSizePercent),isRotate:e.isRotate||!1,rotateDegree:Ee(e.rotateDegree)}}async function me(e,t,r){t=de(t);try{if(r=r.toLowerCase().replace(".",""),!ge.includes(r))return e;let i=c(e),a=100;if(_e(t.quality)&&t.quality<100&&(a=t.quality),t.isReSizeByPercent){if(_e(t.reSizePercent)){const e=await i.metadata().then((e=>e.width)),r=await i.metadata().then((e=>e.height));e&&r&&(i=i.resize(Math.round(e*t.reSizePercent/100),Math.round(r*t.reSizePercent/100),{fit:"inside"}))}}else t.isReSize&&_e(t.reSizeHeight,t.reSizeWidth)&&(i=i.resize(t.reSizeWidth,t.reSizeHeight,{fit:"inside"}));if(t.isRotate&&t.rotateDegree&&(i=i.rotate(t.rotateDegree,{background:{r:255,g:255,b:255,alpha:0}})),t.isConvert){const e=t.convertFormat||"jpg";i=i.toFormat(e,{quality:a})}else i=r&&(n=r,pe.includes(n))?i.toFormat(r,{quality:a}):i.toFormat("jpg",{quality:a});return await i.toBuffer()}catch(t){return console.log(t),e}var n}const Ae=["jpg","jpeg","png","gif","webp","bmp","tiff","tif","svg","ico","avif","heif","heic"],Pe=(e,t)=>(t=t.toLowerCase().replace(".",""),!!e&&!!e.isAddWatermark&&Ae.includes(t)),he=(e,t)=>{if(t=t.toLowerCase().replace(".",""),!Ae.includes(t))return!1;if(e){if(e=de(e),_e(e.quality)&&e.quality<100)return!0;if(e.isReSizeByPercent&&_e(e.reSizePercent))return!0;if(e.isReSize&&_e(e.reSizeHeight,e.reSizeWidth))return!0;if(e.isRotate&&e.rotateDegree)return!0;if(e.isConvert){return t!==(e.convertFormat||"jpg")}return!1}return!1},fe=async(e,t)=>(t=t.toLowerCase().replace(".",""),Ae.includes(t)?await c(e).toBuffer():e);var Ce=Object.freeze({__proto__:null,randomStringGenerator:k,renameFileNameWithTimestamp:function(e){return`${Math.floor(Date.now()/1e3)}${k(5)}${t.extname(e)}`},renameFileNameWithRandomString:function(e,r=5){return`${k(r)}${t.extname(e)}`},renameFileNameWithCustomString:q,isUrl:j,isUrlEncode:V,handleUrlEncode:Y,getImageSize:z,getFSFile:Q,getURLFile:X,getPluginNameType:Z,isSimpleName:J,handleStreamlinePluginName:e=>/^@[^/]+\/picgo-plugin-/.test(e)?e.replace(/^@[^/]+\/picgo-plugin-/,""):e.replace(/picgo-plugin-/,""),handleCompletePluginName:ee,getProcessPluginName:te,getNormalPluginName:re,handleUnixStylePath:ne,removePluginVersion:ie,configBlackList:ae,isConfigKeyInBlackList:se,isInputConfigValid:oe,safeParse:le,forceNumber:Ee,isDev:ce,isProd:()=>"production"===process.env.NODE_ENV,AddWatermark:Ie,imageAddWaterMark:Se,imageProcess:me,needAddWatermark:Pe,needCompress:he,removeExif:fe});const De={handle:r=>{r.cmd.program.command("upload").description("upload, go go go").arguments("[input...]").alias("u").action((n=>{(async()=>{const i=n.map((e=>j(e)?e:t.resolve(e))).filter((t=>{const n=e.existsSync(t)||j(t);return n||r.log.warn(`${t} does not exist.`),n}));await r.upload(i)})().catch((e=>{r.log.error(e)}))}))}};var Ue=e=>{const t=e.getConfig("buildIn.compress")||{};return[{name:"quality",type:"input",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_QUALITY")},required:!1,default:t.quality||100},{name:"isConvert",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISCONVERT")},required:!1,default:t.isConvert||!1},{name:"convertFormat",type:"list",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_CONVERTFORMAT")},required:!1,choices:["avif","dz","fits","gif","heif","input","jpeg","jpg","jp2","jxl","magick","openslide","pdf","png","ppm","raw","svg","tiff","tif","v","webp"],default:"jpg"},{name:"isReSize",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISRESIZE")},required:!1,default:t.isReSize||!1},{name:"reSizeWidth",type:"input",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_RESIZEWIDTH")},required:!1,default:t.reSizeWidth||500},{name:"reSizeHeight",type:"input",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_RESIZEHEIGHT")},required:!1,default:t.reSizeHeight||500},{name:"isReSizeByPercent",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISRESIZEBYPERCENT")},required:!1,default:t.isReSizeByPercent||!1},{name:"reSizePercent",type:"input",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_RESIZEPERCENT")},required:!1,default:t.reSizePercent||50},{name:"isRotate",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISROTATE")},required:!1,default:t.isRotate||!1},{name:"rotateDegree",type:"input",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ROTATEDEGREE")},required:!1,default:t.rotateDegree||90},{name:"isRemoveExif",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISREMOVEEXIF")},required:!1,default:t.isRemoveExif||!1}]};var Te=e=>{const t=e.getConfig("buildIn.watermark")||{};return[{name:"isAddWatermark",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_ISADDWATERMARK")},required:!1,default:t.isAddWatermark||!1},{name:"watermarkType",type:"list",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKTYPE")},required:!1,choices:["text","image"],default:t.watermarkType||"text"},{name:"isFullScreenWatermark",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_ISFULLSCREENWATERMARK")},required:!1,default:t.isFullScreenWatermark||!1},{name:"watermarkDegree",type:"input",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKDEGREE")},required:!1,default:t.watermarkDegree||0},{name:"watermarkText",type:"input",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKTEXT")},required:!1,default:t.watermarkText||""},{name:"watermarkFontPath",type:"input",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKTEXTFONTPATH")},required:!1,default:t.watermarkFontPath||""},{name:"watermarkScaleRatio",type:"input",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKFONTRATIO")},required:!1,default:t.watermarkScaleRatio||.15},{name:"watermarkColor",type:"input",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKFONTCOLOR")},required:!1,default:t.watermarkColor||"rgba(204, 204, 204, 0.45)"},{name:"watermarkImagePath",type:"input",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKIMAGEPATH")},required:!1,default:t.watermarkImagePath||""},{name:"watermarkPosition",type:"list",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKPOSITION")},required:!1,choices:["north","northeast","southeast","south","southwest","northwest","west","east","center","centre"],default:t.watermarkPosition||"southeast"}]};var Ne=e=>{const t=e.getConfig("buildIn.rename")||{};return[{name:"format",type:"input",get alias(){return e.i18n.translate("BUILDIN_RENAME_FORMAT")},required:!1,default:t.format||"{filename}"},{name:"enable",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_RENAME_ENABLE")},required:!1,default:t.enable||!1}]};const Le=async(e,t,r,n)=>{const i=await e.cmd.inquirer.prompt(t),a="uploader"===r?`picBed.${n}`:"transformer"===r?`transformer.${n}`:"buildin"===r?`buildIn.${n}`:n;e.saveConfig({[a]:i}),"uploader"===r?e.saveConfig({"picBed.current":n,"picBed.uploader":n}):"transformer"===r&&e.saveConfig({"picBed.transformer":n})},Re={handle:e=>{e.cmd.program.command("set").alias("config").arguments("<module> [name]").description("configure config of picgo modules, uploader|transformer|plugin|buildin").action(((t,r)=>{(async()=>{var n,i;try{switch(t){case"buildin":if("compress"===r)await Le(e,Ue(e),t,r);else if("watermark"===r)await Le(e,Te(e),t,r);else if("rename"===r)await Le(e,Ne(e),t,r);else{const r=[{type:"list",name:"buildin",choices:["compress","watermark","rename"],message:"Choose a buildin module"}],n=await e.cmd.inquirer.prompt(r);"compress"===n.buildin?await Le(e,Ue(e),t,n.buildin):"watermark"===n.buildin?await Le(e,Te(e),t,n.buildin):"rename"===n.buildin&&await Le(e,Ne(e),t,n.buildin)}break;case"uploader":case"transformer":if(r){const n=e.helper[t].get(r);if(!n)return e.log.error(`No ${t} named ${r}`);n.config&&await Le(e,n.config(e),t,r)}else{const r=[{type:"list",name:`${t}`,choices:e.helper[t].getIdList(),message:`Choose a(n) ${t}`}],n=await e.cmd.inquirer.prompt(r),i=e.helper[t].get(n[t]);(null==i?void 0:i.config)&&await Le(e,i.config(e),t,n[t])}break;case"plugin":if(r){if(r.includes("picgo-plugin-")||(r=`picgo-plugin-${r}`),!Object.keys(e.getConfig("picgoPlugins")).includes(r))return e.log.error(`No plugin named ${r}`);(null===(n=e.pluginLoader.getPlugin(r))||void 0===n?void 0:n.config)&&await Le(e,e.pluginLoader.getPlugin(r).config(e),"plugin",r)}else{const t=[{type:"list",name:"plugin",choices:e.pluginLoader.getFullList(),message:"Choose a plugin"}],r=await e.cmd.inquirer.prompt(t);(null===(i=e.pluginLoader.getPlugin(r.plugin))||void 0===i?void 0:i.config)&&await Le(e,e.pluginLoader.getPlugin(r.plugin).config(e),"plugin",r.plugin)}break;default:return e.log.warn(`No module named ${t}`),e.log.warn("Available modules are uploader|transformer|plugin|buildin")}e.log.success("Configure config successfully!"),"plugin"===t&&e.log.info("If you want to use this config, please run 'picgo use plugins'")}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))}))}},Be={handle:async e=>{const t=e.cmd;t.program.command("use").arguments("[module]").description("use modules of picgo").action((r=>{(async()=>{try{let n=[];const i={uploader:{type:"list",name:"uploader",message:"Use an uploader",choices:e.helper.uploader.getIdList(),default:e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||"smms"},transformer:{type:"list",name:"transformer",message:"Use a transformer",choices:e.helper.transformer.getIdList(),default:e.getConfig("picBed.transformer")||"path"},plugins:{type:"checkbox",name:"plugins",message:"Use plugins",choices:e.pluginLoader.getFullList(),default:Object.keys(e.getConfig("picgoPlugins")).filter((t=>e.getConfig(`picgoPlugins.${t}`)))}};if(r){if(!i[r])return e.log.warn(`No module named ${r}`),e.log.warn("Available modules are uploader|transformer|plugins");n.push(i[r])}else n=Object.keys(i).map((e=>i[e]));const a=await t.inquirer.prompt(n);if(a.plugins){const t=e.getConfig("picgoPlugins");Object.keys(t).map((e=>{a.plugins.includes(e)?t[e]=!0:t[e]=!1})),e.saveConfig({picgoPlugins:t})}e.saveConfig({"picBed.current":a.uploader||e.getConfig("picBed.current"),"picBed.uploader":a.uploader||e.getConfig("picBed.current"),"picBed.transformer":a.transformer||"path"}),e.log.success("Configure config successfully!")}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))}))}},Me={handle:e=>{e.cmd.program.option("-p, --proxy <url>","set proxy for uploading",(t=>{e.setConfig({"picBed.proxy":t})}))}},Oe=async(e,r)=>{try{const n=we(r.tmp),i=t.join(r.tmp,"template");let a={};n.prompts&&n.prompts.length>0&&(a=await e.cmd.inquirer.prompt(n.prompts));let s=await g(["**/*"],{cwd:i,dot:!0});if(s=s.filter((t=>{let r="";return Object.keys(n.filters).forEach((e=>{p(t,e,{dot:!0})&&(r=t)})),!r||ye(e,n.filters[r],a)})),0===s.length)return e.log.warn("Template files not found!");const o=Ge(s,i,a);be(r.dest,o),"function"==typeof n.complete&&n.complete({answers:a,options:r,files:s,ctx:e}),n.completeMessage&&e.log.success(n.completeMessage),e.log.success("Done!")}catch(t){return e.log.error(t)}},ye=(e,t,r)=>{const n=new Function("data","with (data) { return "+t+"}");try{return n(r)}catch(r){return e.log.error(`Error when evaluating filter condition: ${JSON.stringify(t)}`),!1}},we=r=>{const n=t.join(r,"index.js");if(e.existsSync(n)){return require(n)}return{}},Ge=(r,n,i)=>{const a={};return r.forEach((r=>{const s=e.readFileSync(t.join(n,r),"utf8"),o=S.render(s,i);(Buffer.isBuffer(o)||/[^\s]/.test(o))&&(a[r]=o)})),a},be=(r,n)=>{Object.keys(n).forEach((i=>{const a=t.join(r,i);e.ensureDirSync(t.dirname(a)),e.writeFileSync(a,n[i])}))},xe=(t,r)=>{r.offline?e.existsSync(r.template)?Oe(t,r).catch((e=>{t.log.error(e)})):t.log.error(`Local template ${r.template} not found`):(r.template=r.hasSlash?r.template:"PicGo/picgo-template-"+r.template,$e(t,r))},$e=(t,r)=>{e.existsSync(r.tmp)&&m.sync(r.tmp),t.log.info("Template files are downloading..."),d(r.template,r.tmp,{clone:r.clone},(e=>{if(e)return t.log.error(e);t.log.success("Template files are downloaded!"),Oe(t,r).catch((e=>{t.log.error(e)}))}))},We={handle:async r=>{r.cmd.program.command("init").arguments("<template> [project]").option("--clone","use git clone").option("--offline","use cached template").description("create picgo plugin's development templates").action(((n,a,s)=>{(async()=>{try{const o=n.includes("/"),l=!a||"."===a,E=t.resolve(a||"."),c=s.clone||!1,u=s.offline||!1,I=t.join(i(),".picgo/templates",n.replace(/[/:]/g,"-"));s.offline&&(n=I);const _={template:n,project:a,hasSlash:o,inPlace:l,dest:E,clone:c,tmp:I,offline:u};l||e.existsSync(E)?await r.cmd.inquirer.prompt([{type:"confirm",message:l?"Generate project in current directory?":"Target directory exists. Continue?",name:"ok"}]).then((e=>{e.ok&&xe(r,_)})):xe(r,_)}catch(e){if(r.log.error(e),process.argv.includes("--debug"))throw e}})().catch((e=>{r.log.error(e)}))})).on("--help",(()=>{console.log(),console.log("Examples:"),console.log(),console.log(_.gray(" # create a new project with an official template")),console.log(" $ picgo init plugin my-project"),console.log(),console.log(_.gray(" # create a new project straight from a github template")),console.log(" $ picgo init username/repo my-project"),console.log()}))}},ve={handle:e=>{e.cmd.program.command("i18n").arguments("[lang]").description("change picgo language").action((async(t="")=>{const r=e.i18n.getLanguageList();if(!t){const t=[{type:"list",name:"i18n",choices:r,message:"Choose a language",default:e.getConfig("settings.language")||"zh-CN"}],n=await e.cmd.inquirer.prompt(t);return e.i18n.setLanguage(n.i18n),void e.log.success(`Language set to ${n.i18n}`)}if(!r.includes(t))return e.log.warn("No such language");e.i18n.setLanguage(t),e.log.success(`Language set to ${t}`)}))}};class He{constructor(e){this.name=e,this.list=new Map,this.pluginIdMap=new Map}register(e,t){var r;if(!e)throw new TypeError("id is required!");if("function"!=typeof t.handle)throw new TypeError("plugin.handle must be a function!");if(this.list.has(e))throw new TypeError(`${this.name} duplicate id: ${e}!`);this.list.set(e,t),He.currentPlugin&&(this.pluginIdMap.has(He.currentPlugin)?null===(r=this.pluginIdMap.get(He.currentPlugin))||void 0===r||r.push(e):this.pluginIdMap.set(He.currentPlugin,[e]))}unregister(e){if(this.pluginIdMap.has(e)){const t=this.pluginIdMap.get(e);null==t||t.forEach((e=>{this.list.delete(e)}))}}getName(){return this.name}get(e){return this.list.get(e)}getList(){return[...this.list.values()]}getIdList(){return[...this.list.keys()]}}const Fe=(e=null)=>{He.currentPlugin=e};class Ke{constructor(e){this.name="commander",this.list=new Map,this.pluginIdMap=new Map,this.program=new a,this.inquirer=s,this.ctx=e}getName(){return this.name}init(){var e;this.program.version("0.6.7","-v, --version").option("-d, --debug","debug mode",(()=>{this.ctx.setConfig({debug:!0})})).option("-s, --silent","silent mode",(()=>{this.ctx.setConfig({silent:!0})})).on("command:*",(()=>{this.ctx.log.error(`Invalid command: ${this.program.args.join(" ")}\nSee --help for a list of available commands.`),process.exit(1)})),(e=this.ctx).cmd.register("pluginHandler",F),e.cmd.register("config",K),e.cmd.register("setting",Re),e.cmd.register("upload",De),e.cmd.register("use",Be),e.cmd.register("proxy",Me),e.cmd.register("init",We),e.cmd.register("i18n",ve)}register(e,t){var r;if(!e)throw new TypeError("name is required!");if("function"!=typeof t.handle)throw new TypeError("plugin.handle must be a function!");if(this.list.has(e))throw new TypeError(`${this.name} plugin duplicate id: ${e}!`);this.list.set(e,t);const n=He.currentPlugin;null!==n&&(this.pluginIdMap.has(n)?null===(r=this.pluginIdMap.get(n))||void 0===r||r.push(e):this.pluginIdMap.set(n,[e]))}unregister(e){if(this.pluginIdMap.has(e)){const t=this.pluginIdMap.get(e);null==t||t.forEach((e=>{this.list.delete(e)}))}}loadCommands(){this.getList().forEach((e=>{try{e.handle(this.ctx)}catch(e){this.ctx.log.error(e)}}))}get(e){return this.list.get(e)}getList(){return[...this.list.values()]}getIdList(){return[...this.list.keys()]}}var ke,qe,je;!function(e){e.success="success",e.info="info",e.warn="warn",e.error="error"}(ke||(ke={})),function(e){e.UPLOAD_PROGRESS="uploadProgress",e.FAILED="failed",e.BEFORE_TRANSFORM="beforeTransform",e.BEFORE_UPLOAD="beforeUpload",e.AFTER_UPLOAD="afterUpload",e.FINISHED="finished",e.INSTALL="install",e.UNINSTALL="uninstall",e.UPDATE="update",e.NOTIFICATION="notification"}(qe||(qe={})),function(e){e.CONFIG_CHANGE="CONFIG_CHANGE"}(je||(je={}));class Ve{constructor(e){this.level={[ke.success]:"green",[ke.info]:"blue",[ke.warn]:"yellow",[ke.error]:"red"},this.ctx=e}handleLog(e,...r){if(!this.ctx.getConfig("silent")){const n=_[this.level[e]](`[PicList ${e.toUpperCase()}]:`);console.log(n,...r),this.logLevel=this.ctx.getConfig("settings.logLevel"),this.logPath=this.ctx.getConfig("settings.logPath")||t.join(this.ctx.baseDir,"./piclist.log"),setTimeout((()=>{try{const t=this.checkLogFileIsLarge(this.logPath);if(t.isLarge){const e=`Log file is too large (> ${t.logFileSizeLimit/1024/1024||"10"} MB), recreate log file`;console.log(_.yellow("[PicList WARN]:"),e),this.recreateLogFile(this.logPath),r.unshift(e)}this.handleWriteLog(this.logPath,e,...r)}catch(e){console.error("[PicList Error] on checking log file size",e)}}),0)}}checkLogFileIsLarge(t){if(e.existsSync(t)){const r=e.statSync(t).size,n=1024*Ee(this.ctx.getConfig("settings.logFileSizeLimit")||10)*1024;return{isLarge:r>n,logFileSize:r,logFileSizeLimit:n}}return{isLarge:!1}}recreateLogFile(t){e.existsSync(t)&&(e.unlinkSync(t),e.createFileSync(t))}handleWriteLog(t,r,...n){try{if(this.checkLogLevel(r,this.logLevel)){let i=`${A().format("YYYY-MM-DD HH:mm:ss")} [PicList ${r.toUpperCase()}] `;n.forEach((e=>{e instanceof Error&&"error"===r?i+=`\n------Error Stack Begin------\n${P.format(null==e?void 0:e.stack)}\n-------Error Stack End------- `:("object"==typeof e&&(e=JSON.stringify(e,null,2)),i+=`${e} `)})),i+="\n",e.appendFileSync(t,i)}}catch(e){console.error("[PicList Error] on writing log file",e)}}checkLogLevel(e,t){return void 0===t||"all"===t||(Array.isArray(t)?t.some((t=>t===e||"all"===t)):e===t)}success(...e){return this.handleLog(ke.success,...e)}info(...e){return this.handleLog(ke.info,...e)}error(...e){return this.handleLog(ke.error,...e)}warn(...e){return this.handleLog(ke.warn,...e)}debug(...e){ce()&&this.handleLog(ke.info,...e)}}class Ye extends r{constructor(r){super(),this.ttfLink="https://release.piclist.cn/simhei.ttf",this.ctx=r;const n=t.join(r.baseDir,"piclistTemp");e.emptyDirSync(n),this.ttfPath=t.join(r.baseDir,"assets","simhei.ttf")}async downloadTTF(){const r=t.dirname(this.ttfPath);if(e.existsSync(r)||e.mkdirSync(r,{recursive:!0}),e.existsSync(this.ttfPath))return!0;this.ctx.log.info("Download ttf file.");try{const t=await h.get(this.ttfLink,{responseType:"arraybuffer"});return e.writeFileSync(this.ttfPath,t.data),this.ctx.log.info("Download ttf file success."),!0}catch(e){return this.ctx.log.error("Download ttf file failed."),!1}}async start(r){const n=(e=>({configPath:e.configPath,baseDir:e.baseDir,log:e.log,cmd:e.cmd,output:[],input:[],rawInput:[],pluginLoader:e.pluginLoader,pluginHandler:e.pluginHandler,Request:e.Request,helper:e.helper,VERSION:e.VERSION,GUI_VERSION:e.GUI_VERSION,request:e.request,i18n:e.i18n,getConfig:e.getConfig.bind(e),saveConfig:e.saveConfig.bind(e),removeConfig:e.removeConfig.bind(e),setConfig:e.setConfig.bind(e),unsetConfig:e.unsetConfig.bind(e),upload:e.upload.bind(e),addListener:e.addListener.bind(e),on:e.on.bind(e),once:e.once.bind(e),removeListener:e.removeListener.bind(e),off:e.off.bind(e),removeAllListeners:e.removeAllListeners.bind(e),setMaxListeners:e.setMaxListeners.bind(e),getMaxListeners:e.getMaxListeners.bind(e),listeners:e.listeners.bind(e),rawListeners:e.rawListeners.bind(e),emit:e.emit.bind(e),listenerCount:e.listenerCount.bind(e),prependListener:e.prependListener.bind(e),prependOnceListener:e.prependOnceListener.bind(e),eventNames:e.eventNames.bind(e)}))(this.ctx);try{if(!Array.isArray(r))throw new Error("Input must be an array.");n.input=r,n.rawInputPath=[],n.rawInput=f(r),n.output=[];const i=n.getConfig("buildIn.compress"),a=n.getConfig("buildIn.watermark");if(i||a){const r=t.join(n.baseDir,"piclistTemp");e.existsSync(r)||e.mkdirSync(r);const s="Add watermark to image",o="Compress or convert image";await Promise.allSettled(n.input.map((async(l,E)=>{var c,u,I,_,p,g,S;let d;if(j(l)){if(n.rawInputPath[E]=l,d=await X(l,n),!d.success||!d.buffer)throw new Error(d.reason);{let S;if(Pe(a,null!==(c=d.extname)&&void 0!==c?c:"")){await this.downloadTTF()?(n.log.info(s),S=await Se(d.buffer,a,this.ttfPath)):this.ctx.log.warn("Download ttf file failed, skip add watermark.")}if(he(i,null!==(u=d.extname)&&void 0!==u?u:"")&&(n.log.info(o),S=await me(null!=S?S:d.buffer,i,null!==(I=d.extname)&&void 0!==I?I:"")),!S&&(null==i?void 0:i.isRemoveExif)&&(n.log.info("Remove exif info."),S=await fe(d.buffer,null!==(_=d.extname)&&void 0!==_?_:"")),S){let a;a=(null==i?void 0:i.isConvert)?null!==(p=null==i?void 0:i.convertFormat)&&void 0!==p?p:"jpg":null!==(g=d.extname)&&void 0!==g?g:"",a=a.startsWith(".")?a:`.${a}`;const s=t.join(r,`${d.fileName?`${t.basename(d.fileName,t.extname(d.fileName))}${a}`:(new Date).getTime()}${a}`);n.rawInputPath[E]=t.join(t.dirname(l),t.basename(s)),e.writeFileSync(s,S),n.input[E]=s}}}else{let c;if(n.rawInputPath[E]=l,Pe(a,t.extname(l))){await this.downloadTTF()?(n.log.info(s),c=await Se(e.readFileSync(l),a,this.ttfPath)):this.ctx.log.warn("Download ttf file failed, skip add watermark.")}if(he(i,t.extname(l)))if(n.log.info(o),".heic"===t.extname(l)||".heif"===t.extname(l)){const n=e.readFileSync(l),a=await N({buffer:n,format:"JPEG",quality:1}),s=t.join(r,`${t.basename(l,t.extname(l))}.jpg`);e.writeFileSync(s,Buffer.from(a)),c=await me(e.readFileSync(s),i,".jpg")}else c=await me(null!=c?c:e.readFileSync(l),i,t.extname(l));if(!c&&(null==i?void 0:i.isRemoveExif)&&(n.log.info("Remove exif info."),c=await fe(e.readFileSync(l),t.extname(l))),c){let a;a=(null==i?void 0:i.isConvert)?null!==(S=null==i?void 0:i.convertFormat)&&void 0!==S?S:"jpg":t.extname(l),a=a.startsWith(".")?a:`.${a}`;const s=t.join(r,`${t.basename(l,t.extname(l))}${a}`);n.rawInputPath[E]=t.join(t.dirname(l),`${t.basename(l,t.extname(l))}${a}`),e.writeFileSync(s,c),n.input[E]=s}}})))}else for(const e of n.input)n.rawInputPath.push(e);await this.beforeTransform(n),await this.doTransform(n);const s=n.getConfig("buildIn.rename")||{};if(s.enable){const e=s.format||"{filename}";n.output=n.output.map(((t,r)=>{let i=t.fileName;return e&&(i=q(n.rawInputPath[r],e),i=i.replace(/\/+/g,"/"),"/"===i.slice(-1)&&(i+=r.toString())),t.fileName=i,t}))}return await this.beforeUpload(n),await this.doUpload(n),n.input=n.rawInput,await this.afterUpload(n),n}catch(e){if(n.log.warn(qe.FAILED),n.emit(qe.UPLOAD_PROGRESS,-1),n.emit(qe.FAILED,e),n.log.error(e),n.getConfig("debug"))throw e;return n}}async beforeTransform(e){return e.emit(qe.UPLOAD_PROGRESS,0),e.emit(qe.BEFORE_TRANSFORM,e),e.log.info("Before transform"),await this.handlePlugins(e.helper.beforeTransformPlugins,e),e}async doTransform(e){e.emit(qe.UPLOAD_PROGRESS,30);const t=e.getConfig("picBed.transformer")||"path";let r=t,n=e.helper.transformer.get(t);return n||(n=e.helper.transformer.get("path"),r="path",e.log.warn(`Can't find transformer - ${t}, switch to default transformer - path`)),e.log.info(`Transforming... Current transformer is [${r}]`),await(null==n?void 0:n.handle(e)),e}async beforeUpload(e){return e.emit(qe.UPLOAD_PROGRESS,60),e.log.info("Before upload"),e.emit(qe.BEFORE_UPLOAD,e),await this.handlePlugins(e.helper.beforeUploadPlugins,e),e}async doUpload(e){let t=e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||"smms",r=e.helper.uploader.get(t),n=t;r||(t="smms",n="smms",r=e.helper.uploader.get("smms"),e.log.warn(`Can't find uploader - ${t}, switch to default uploader - smms`)),e.log.info(`Uploading... Current uploader is [${n}]`),await(null==r?void 0:r.handle(e));for(const r of e.output)r.type=t;return e}async afterUpload(e){e.emit(qe.AFTER_UPLOAD,e),e.emit(qe.UPLOAD_PROGRESS,100),await this.handlePlugins(e.helper.afterUploadPlugins,e);let t="";const r=e.output.length,n=!0===e.getConfig("settings.encodeOutputURL");for(let i=0;i<r;i++)void 0!==e.output[i].imgUrl&&(t+=n?Y(e.output[i].imgUrl):e.output[i].imgUrl,i!==r-1&&(t+="\n")),delete e.output[i].base64Image,delete e.output[i].buffer;return e.emit(qe.FINISHED,e),e.log.success(`\n${t}`),e}async handlePlugins(e,t){const r=e.getList(),n=e.getIdList(),i=e.getName();return await Promise.all(r.map((async(e,r)=>{try{t.log.info(`${i}: ${n[r]} running`),await e.handle(t)}catch(e){throw t.log.error(`${i}: ${n[r]} error`),e}}))),t}}const ze=(e,t,r,n="")=>({method:"POST",url:`https://${n||"sm.ms"}/api/v2/upload`,headers:{contentType:"multipart/form-data","User-Agent":"PicGo",Authorization:r},formData:{smfile:{value:t,options:{filename:e}},ssl:"true"}}),Qe=async e=>{const t=e.getConfig("picBed.smms");if(!t)throw new Error("Can not find smms config!");const r=e.output;for(const n of r)if(n.fileName&&n.buffer){let r=n.buffer;!r&&n.base64Image&&(r=Buffer.from(n.base64Image,"base64"));const i=ze(n.fileName,r,null==t?void 0:t.token,null==t?void 0:t.backupDomain);try{const t=await e.request(i),r=JSON.parse(t);if("success"===r.code)delete n.base64Image,delete n.buffer,n.imgUrl=r.data.url,n.hash=r.data.hash;else{if("image_repeated"!==r.code||"string"!=typeof r.images)throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:r.message}),new Error(r.message);delete n.base64Image,delete n.buffer,n.imgUrl=r.images}}catch(t){throw e.log.error(t),t}}return e},Xe=e=>{const t=e.getConfig("picBed.smms")||{};return[{name:"token",message:"api token",type:"password",get alias(){return e.i18n.translate("PICBED_SMMS_TOKEN")},default:t.token||"",required:!0},{name:"backupDomain",type:"input",get prefix(){return e.i18n.translate("PICBED_SMMS_BACKUP_DOMAIN")},get message(){return e.i18n.translate("PICBED_SMMS_MESSAGE_BACKUP_DOMAIN")},get alias(){return e.i18n.translate("PICBED_SMMS_BACKUP_DOMAIN")},default:t.backupDomain||"",required:!1}]};const Ze=(e,t)=>{const r=e.secretId,n=e.secretKey,i=e.appId,a=e.bucket;let s,o="";if(e.version&&"v4"!==e.version){const r=Math.floor((new Date).getTime()/1e3);o=`${r};${r+86400}`;const i=u.createHmac("sha1",n).update(o).digest("hex"),a=`put\n/${e.path}${t}\n\nhost=${e.bucket}.cos.${e.area}.myqcloud.com\n`,l=`sha1\n${o}\n${u.createHash("sha1").update(a).digest("hex")}\n`;s=u.createHmac("sha1",i).update(l).digest("hex")}else{const e=Math.floor(1e10*Math.random()),t=Math.floor((new Date).getTime()/1e3)-1,o=`a=${i}&b=${a}&k=${r}&e=${t+3600}&t=${t}&r=${e}&f=`,l=u.createHmac("sha1",n).update(o).digest(),E=Buffer.concat([l,Buffer.from(o)]);s=Buffer.from(E).toString("base64")}return{signature:s,appId:i,bucket:a,signTime:o}},Je=(e,t,r,n,i)=>{const a=e.area,s=e.path;return e.version&&"v4"!==e.version?{method:"PUT",url:`http://${e.bucket}.cos.${e.area}.myqcloud.com/${encodeURIComponent(s)}${encodeURIComponent(t)}`,headers:{Host:`${e.bucket}.cos.${e.area}.myqcloud.com`,Authorization:`q-sign-algorithm=sha1&q-ak=${e.secretId}&q-sign-time=${r.signTime}&q-key-time=${r.signTime}&q-header-list=host&q-url-param-list=&q-signature=${r.signature}`,contentType:L.lookup(t)||"application/octet-stream","User-Agent":`PicGo;${i};null;null`},body:n,resolveWithFullResponse:!0}:{method:"POST",url:`http://${a}.file.myqcloud.com/files/v2/${r.appId}/${r.bucket}/${encodeURI(s)}${t}`,headers:{Host:`${a}.file.myqcloud.com`,Authorization:r.signature,contentType:"multipart/form-data","User-Agent":`PicGo;${i};null;null`},formData:{op:"upload",filecontent:n},resolveWithFullResponse:!0}},et=async e=>{var t,r,n;const i=e.getConfig("picBed.tcyun");if(!i)throw new Error("Can't find tencent COS config");try{const a=e.output,s=i.customUrl,o=i.path,l=!i.version||"v4"===i.version;for(const E of a)if(E.fileName&&E.buffer){const a=Ze(i,E.fileName);if(!a)return!1;let c=E.buffer;!c&&E.base64Image&&(c=Buffer.from(E.base64Image,"base64"));const u=Je(i,E.fileName,a,c,e.GUI_VERSION||e.VERSION),I=await e.request(u).then((e=>e)).catch((t=>({statusCode:400,body:{msg:e.i18n.translate("AUTH_FAILED"),err:t}})));let _;if(_=l&&"string"==typeof I?JSON.parse(I):I,400===_.statusCode)throw(null===(t=null==_?void 0:_.body)||void 0===t?void 0:t.err)?_.body.err:new Error((null===(r=null==_?void 0:_.body)||void 0===r?void 0:r.msg)||(null===(n=null==_?void 0:_.body)||void 0===n?void 0:n.message));const p=i.options||"";if(l&&"SUCCESS"===_.message)delete E.base64Image,delete E.buffer,E.imgUrl=s?`${s}/${o}${E.fileName}`:`${_.data.source_url}${p}`;else{if(l||!_||200!==_.statusCode)throw new Error(I.body.msg);delete E.base64Image,delete E.buffer,E.imgUrl=s?`${s}/${encodeURIComponent(o)}${encodeURIComponent(E.fileName)}${p}`.replace(/%2F/g,"/"):`https://${i.bucket}.cos.${i.area}.myqcloud.com/${encodeURIComponent(o)}${encodeURIComponent(E.fileName)}${p}`.replace(/%2F/g,"/")}}return e}catch(t){if(!i.version||"v4"===i.version)try{const r=JSON.parse(t.error);e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:r.code}),text:"https://cloud.tencent.com/document/product/436/8432"})}catch(e){}throw t}},tt=e=>{const t=e.getConfig("picBed.tcyun")||{};return[{name:"version",type:"list",alias:e.i18n.translate("PICBED_TENCENTCLOUD_VERSION"),choices:["v4","v5"],default:"v5",required:!1},{name:"secretId",type:"input",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SECRETID")},default:t.secretId||"",required:!0},{name:"secretKey",type:"password",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SECRETKEY")},default:t.secretKey||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_BUCKET")},default:t.bucket||"",required:!0},{name:"appId",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_APPID")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_APPID")},default:t.appId||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_APPID")},required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_AREA")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_AREA")},default:t.area||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_AREA")},required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_PATH")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_PATH")},default:t.path||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_PATH")},required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_CUSTOMURL")},default:t.customUrl||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL")},required:!1},{name:"options",type:"input",default:t.options||"",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_OPTIONS")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_OPTIONS")},get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_OPTIONS")},required:!1}]};const rt=(e,t,r)=>{const n=t.path||"",{token:i,repo:a}=t;return{method:"PUT",url:`https://api.github.com/repos/${a}/contents/${encodeURI(n)}${encodeURIComponent(e)}`.replace(/%2F/g,"/"),headers:{Authorization:`token ${i}`,"User-Agent":"PicList","Content-Type":L.lookup(e)||"application/octet-stream"},body:r,json:!0}},nt=(e,t)=>{const r=t.path||"",{token:n,repo:i,branch:a}=t;return{method:"GET",url:`https://api.github.com/repos/${i}/contents/${encodeURI(r)}${encodeURIComponent(e)}?ref=${a}`.replace(/%2F/g,"/"),headers:{Authorization:`token ${n}`,"User-Agent":"PicGo"},json:!0}},it=async e=>{const t=e.getConfig("picBed.github");if(!t)throw new Error("Can't find github config");try{const r=e.output;for(const n of r)if(n.fileName&&n.buffer){const r=n.base64Image||Buffer.from(n.buffer).toString("base64"),i={message:"Upload by PicList",branch:t.branch,content:r,path:t.path+encodeURI(n.fileName)},a=rt(n.fileName,t,i);try{const r=await e.request(a);if(!r)throw new Error("Server error, please try again");delete n.base64Image,delete n.buffer,t.customUrl?n.imgUrl=`${t.customUrl}/${encodeURIComponent(t.path)}${encodeURIComponent(n.fileName)}`.replace(/%2F/g,"/"):n.imgUrl=r.content.download_url,n.hash=r.content.sha}catch(r){if(422!==r.statusCode)throw r;{delete n.base64Image,delete n.buffer;const r=await e.request(nt(n.fileName,t));if(!Object.keys(r).length)throw new Error("Get Contents error, please try again");n.hash=r.sha,t.customUrl?n.imgUrl=`${t.customUrl}/${encodeURIComponent(t.path)}${encodeURIComponent(n.fileName)}`.replace(/%2F/g,"/"):n.imgUrl=r.download_url}}}return e}catch(t){throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK")}),t}},at=e=>{const t=e.getConfig("picBed.github")||{};return[{name:"repo",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_REPO")},get alias(){return e.i18n.translate("PICBED_GITHUB_REPO")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_REPO")},default:t.repo||"",required:!0},{name:"branch",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_BRANCH")},get alias(){return e.i18n.translate("PICBED_GITHUB_BRANCH")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_BRANCH")},default:t.branch||"master",required:!0},{name:"token",type:"password",get alias(){return e.i18n.translate("PICBED_GITHUB_TOKEN")},default:t.token||"",required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_PATH")},get alias(){return e.i18n.translate("PICBED_GITHUB_PATH")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_PATH")},default:t.path||"",required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_GITHUB_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_CUSTOMURL")},default:t.customUrl||"",required:!1}]};function st(e,t,r,n){const i=function(e){return"z0"===e?"":"-"+e}(e.area||"z0"),a=e.path||"";return{method:"POST",url:`http://upload${i}.qiniup.com/putb64/-1/key/${Buffer.from(a+t,"utf-8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_")}`,headers:{Authorization:`UpToken ${r}`,"Content-Type":L.lookup(t)||"application/octet-stream"},body:n}}function ot(e){const t=e.accessKey,r=e.secretKey,n=new R.auth.digest.Mac(t,r),i={scope:e.bucket};return new R.rs.PutPolicy(i).uploadToken(n)}const lt=async e=>{const t=e.getConfig("picBed.qiniu");if(!t)throw new Error("Can't find qiniu config");try{const r=e.output;for(const n of r)if(n.fileName&&n.buffer){const r=n.base64Image||Buffer.from(n.buffer).toString("base64"),i=st(t,n.fileName,ot(t),r),a=await e.request(i),s=JSON.parse(a);if(!(null==s?void 0:s.key))throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:s.msg}),e.log.error("qiniu error",s),new Error("Upload failed");{delete n.base64Image,delete n.buffer;const e=t.url,r=t.options;n.imgUrl=`${e}/${s.key}${r}`}}return e}catch(t){if("Upload failed"!==t.message&&t.response){const r=t.response.body;e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:r.error})}throw t}},Et=e=>{const t=e.getConfig("picBed.qiniu")||{};return[{name:"accessKey",type:"input",get alias(){return e.i18n.translate("PICBED_QINIU_ACCESSKEY")},default:t.accessKey||"",required:!0},{name:"secretKey",type:"password",get alias(){return e.i18n.translate("PICBED_QINIU_SECRETKEY")},default:t.secretKey||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_QINIU_BUCKET")},default:t.bucket||"",required:!0},{name:"url",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_URL")},get alias(){return e.i18n.translate("PICBED_QINIU_URL")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_URL")},default:t.url||"",required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_AREA")},get alias(){return e.i18n.translate("PICBED_QINIU_AREA")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_AREA")},default:t.area||"",required:!0},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_OPTIONS")},get alias(){return e.i18n.translate("PICBED_QINIU_OPTIONS")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_OPTIONS")},default:t.options||"",required:!1},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_PATH")},get alias(){return e.i18n.translate("PICBED_QINIU_PATH")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_PATH")},default:t.path||"",required:!1}]};const ct=async(e,t,r,n)=>{const i=t.clientId||"",a=t.username||"",s=(e=>e?e.startsWith("Bearer")?e:`Bearer ${e}`:"")(t.accessToken||""),o=t.album||"";let l;if(a&&s)l=s;else{if(!i)throw new Error("clientId or accessToken is required");l=`Client-ID ${i}`}const E={method:"POST",url:"https://api.imgur.com/3/image",headers:{Authorization:l,"content-type":"multipart/form-data",Host:"api.imgur.com","User-Agent":"PicList"},formData:{image:n,type:"base64",name:r,description:"Uploaded with PicList"}};if(a&&s&&o){let r,n=0,i="";do{const s={method:"GET",url:`https://api.imgur.com/3/account/${a}/albums/${n}`,headers:{Authorization:l},json:!0,resolveWithFullResponse:!0,timeout:1e4};if(t.proxy&&(s.proxy=t.proxy),r=await e.request(s),200!==r.statusCode||!r.body.success)throw new Error("Server error, please try again");const E=r.body.data;for(const e of E)if(e.title===o){i=e.id;break}n++}while(r.body.data.length>0);i&&E.formData&&(E.formData.album=i)}return t.proxy&&(E.proxy=t.proxy),E},ut=async e=>{var t;const r=e.getConfig("picBed.imgur");if(!r)throw new Error("Can't find imgur config");try{const t=e.output;for(const n of t)if(n.fileName&&n.buffer){const t=n.base64Image||Buffer.from(n.buffer).toString("base64"),i=await ct(e,r,n.fileName,t),a=await e.request(i),s="string"==typeof a?JSON.parse(a):a;if(!s.success)throw new Error("Server error, please try again");delete n.base64Image,delete n.buffer,n.imgUrl=s.data.link,n.hash=s.data.deletehash}return e}catch(r){throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK"),text:"http://docs.imgur.com/api/errno/"}),(null===(t=null==r?void 0:r.response)||void 0===t?void 0:t.data)||r}},It=e=>{const t=e.getConfig("picBed.imgur")||{};return[{name:"clientId",type:"input",get prefix(){return e.i18n.translate("PICBED_IMGUR_CLIENTID")},get alias(){return e.i18n.translate("PICBED_IMGUR_CLIENTID")},get message(){return e.i18n.translate("PICBED_IMGUR_MESSAGE_CLIENTID")},default:t.clientId||"",required:!1},{name:"username",type:"input",get prefix(){return e.i18n.translate("PICBED_IMGUR_USERNAME")},get alias(){return e.i18n.translate("PICBED_IMGUR_USERNAME")},get message(){return e.i18n.translate("PICBED_IMGUR_MESSAGE_USERNAME")},default:t.username||"",required:!1},{name:"accessToken",type:"input",get prefix(){return e.i18n.translate("PICBED_IMGUR_ACCESS_TOKEN")},get alias(){return e.i18n.translate("PICBED_IMGUR_ACCESS_TOKEN")},get message(){return e.i18n.translate("PICBED_IMGUR_MESSAGE_ACCESS_TOKEN")},default:t.accessToken||"",required:!1},{name:"album",type:"input",get prefix(){return e.i18n.translate("PICBED_IMGUR_ALBUM")},get alias(){return e.i18n.translate("PICBED_IMGUR_ALBUM")},get message(){return e.i18n.translate("PICBED_IMGUR_MESSAGE_ALBUM")},default:t.album||"",required:!1},{name:"proxy",type:"input",get prefix(){return e.i18n.translate("PICBED_IMGUR_PROXY")},get alias(){return e.i18n.translate("PICBED_IMGUR_PROXY")},get message(){return e.i18n.translate("PICBED_IMGUR_MESSAGE_PROXY")},default:t.proxy||"",required:!1}]};const _t=(e,t)=>{const r=(new Date).toUTCString(),n=L.lookup(t);if(!n)throw Error(`No mime type found for file ${t}`);const i=`PUT\n\n${n}\n${r}\n/${e.bucket}/${e.path}${t}`,a=u.createHmac("sha1",e.accessKeySecret).update(i).digest("base64");return`OSS ${e.accessKeyId}:${a}`},pt=(e,t,r,n)=>({method:"PUT",url:`https://${e.bucket}.${e.area}.aliyuncs.com/${encodeURI(e.path)}${encodeURIComponent(t)}`.replace(/%2F/g,"/"),headers:{Host:`${e.bucket}.${e.area}.aliyuncs.com`,Authorization:r,Date:(new Date).toUTCString(),"Content-Type":L.lookup(t)},body:n,resolveWithFullResponse:!0}),gt=async e=>{const t=e.getConfig("picBed.aliyun");if(!t)throw new Error("Can't find aliYun OSS config");t.path=t.path.replace(/\/*$/,"").replace(/^\/*/,"")+"/","/"===t.path&&(t.path="");try{const r=e.output,n=t.customUrl,i=t.path;for(const a of r)if(a.fileName&&a.buffer){const r=_t(t,a.fileName);let s=a.buffer;!s&&a.base64Image&&(s=Buffer.from(a.base64Image,"base64"));const o=pt(t,a.fileName,r,s);if(200!==(await e.request(o)).statusCode)throw new Error("Upload failed");{delete a.base64Image,delete a.buffer;const e=t.options||"";a.imgUrl=n?`${n}/${encodeURIComponent(i)}${encodeURIComponent(a.fileName)}${e}`.replace(/%2F/g,"/"):`https://${t.bucket}.${t.area}.aliyuncs.com/${encodeURIComponent(i)}${encodeURIComponent(a.fileName)}${e}`.replace(/%2F/g,"/")}}return e}catch(t){throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},St=e=>{const t=e.getConfig("picBed.aliyun")||{};return[{name:"accessKeyId",type:"input",get alias(){return e.i18n.translate("PICBED_ALICLOUD_ACCESSKEYID")},default:t.accessKeyId||"",required:!0},{name:"accessKeySecret",type:"password",get alias(){return e.i18n.translate("PICBED_ALICLOUD_ACCESSKEYSECRET")},default:t.accessKeySecret||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_ALICLOUD_BUCKET")},default:t.bucket||"",required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_AREA")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_AREA")},default:t.area||"",get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_AREA")},required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_PATH")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_PATH")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_PATH")},default:t.path||"",required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_CUSTOMURL")},default:t.customUrl||"",required:!1},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_OPTIONS")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_OPTIONS")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_OPTIONS")},default:t.options||"",required:!1}]};const dt=(e,t)=>{const r=e.path||"",n=e.operator,i=e.password,a=B(i),s=(new Date).toUTCString(),o=`PUT&${`/${e.bucket}/${encodeURI(r)}${encodeURIComponent(t)}`.replace(/%2F/g,"/")}&${s}`;return`UPYUN ${n}:${u.createHmac("sha1",a).update(o).digest("base64")}`},mt=(e,t,r,n)=>{const i=e.bucket,a=e.path||"";return{method:"PUT",url:`https://v0.api.upyun.com/${i}/${encodeURI(a)}${encodeURIComponent(t)}`.replace(/%2F/g,"/"),headers:{Authorization:r,Date:(new Date).toUTCString(),"Content-Type":L.lookup(t)||"application/octet-stream"},body:n,resolveWithFullResponse:!0}},At=async e=>{const t=e.getConfig("picBed.upyun");if(!t)throw new Error("Can't find upYun config");try{const r=e.output,n=t.path||"";for(const i of r)if(i.fileName&&i.buffer){let r=i.buffer;!r&&i.base64Image&&(r=Buffer.from(i.base64Image,"base64"));const a=dt(t,i.fileName),s=mt(t,i.fileName,a,r);if(200!==(await e.request(s)).statusCode)throw new Error("Upload failed");delete i.base64Image,delete i.buffer,i.imgUrl=`${t.url}/${encodeURIComponent(n)}${encodeURIComponent(i.fileName)}${t.options}`.replace(/%2F/g,"/")}return e}catch(t){if("Upload failed"===t.message)e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")});else{const r=le(t.error);e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:"object"==typeof r?r.code:r}),text:"http://docs.upyun.com/api/errno/"})}throw t}},Pt=e=>{const t=e.getConfig("picBed.upyun")||{};return[{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_BUCKET")},default:t.bucket||"",required:!0},{name:"operator",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_OPERATOR")},get prefix(){return e.i18n.translate("PICBED_UPYUN_OPERATOR")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_OPERATOR")},default:t.operator||"",required:!0},{name:"password",type:"password",get prefix(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PASSWORD")},get alias(){return e.i18n.translate("PICBED_UPYUN_PASSWORD")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PASSWORD")},default:t.password||"",required:!0},{name:"url",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_URL")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_URL")},default:t.url||"",required:!0},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_OPTIONS")},get alias(){return e.i18n.translate("PICBED_UPYUN_OPTIONS")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_OPTIONS")},default:t.options||"",required:!1},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_PATH")},get alias(){return e.i18n.translate("PICBED_UPYUN_PATH")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PATH")},default:t.path||"",required:!1}]};const ht=async(e,r,n,i)=>{const a=[...r.path.replace(/\/+$/g,"").split("/"),...t.dirname(n).split("/")];let s="";for(const t of a)if(t){s+=`/${t}`;const n={method:"MKCOL",url:`${r.host}${encodeURI(s)}`.replace(/%2F/g,"/"),headers:{Authorization:`Basic ${Buffer.from(`${r.username}:${r.password}`).toString("base64")}`}};try{await e.request(n)}catch(e){console.log(e)}}return{method:"PUT",url:`${r.host}/${"/"===r.path?"":encodeURI(r.path)}${encodeURIComponent(n)}`.replace(/%2F/g,"/"),headers:{Authorization:`Basic ${Buffer.from(`${r.username}:${r.password}`).toString("base64")}`,"Content-Type":L.lookup(n)||"application/octet-stream","Content-Length":i.length},body:i,resolveWithFullResponse:!0}},ft=async e=>{const t=e.getConfig("picBed.webdavplist");if(!t)throw new Error("Can't find webdavplist config");t.host=t.host.replace(/^https?:\/\/|\/+$/g,""),t.host=(t.sslEnabled?"https://":"http://")+t.host,t.path=(t.path||"").replace(/^\/+|\/+$/g,"")+"/";const r=(t.webpath||"").replace(/^\/+|\/+$/g,"")+"/";try{const n=e.output,i=t.customUrl,a=t.path;for(const s of n)if(s.fileName&&s.buffer){let n=s.buffer;!n&&s.base64Image&&(n=Buffer.from(s.base64Image,"base64"));const o=await ht(e,t,s.fileName,n),l=await e.request(o);if(!(l.statusCode>=200&&l.statusCode<300))throw new Error("Upload failed");{delete s.base64Image,delete s.buffer;const e=i||t.host;t.webpath?s.imgUrl=`${e}/${"/"===r?"":encodeURIComponent(r)}${encodeURIComponent(s.fileName)}`.replace(/%2F/g,"/"):s.imgUrl=`${e}/${"/"===a?"":encodeURIComponent(a)}${encodeURIComponent(s.fileName)}`.replace(/%2F/g,"/")}}return e}catch(t){throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},Ct=e=>{const t=e.getConfig("picBed.webdavplist")||{};return[{name:"host",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_HOST")},default:t.host||"",required:!0},{name:"sslEnabled",type:"confirm",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_SSLENABLED")},required:!0,default:t.sslEnabled||!0,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_SSLENABLED")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED")}},{name:"username",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_USERNAME")},default:t.username||"",required:!0,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_USERNAME")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_USERNAME")}},{name:"password",type:"password",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_PASSWORD")},default:t.password||"",required:!0,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_PASSWORD")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_PASSWORD")}},{name:"path",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_PATH")},default:t.path||"",required:!1,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_PATH")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_PATH")}},{name:"webpath",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_WEBSITE_PATH")},default:t.path||"",required:!1,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_WEBSITE_PATH")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_WEBSITE_PATH")}},{name:"customUrl",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_CUSTOMURL")},default:t.customUrl||"",required:!1,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL")}}]};const Dt=()=>({register(e){!function(e){e.helper.uploader.register("aliyun",{get name(){return e.i18n.translate("PICBED_ALICLOUD")},handle:gt,config:St})}(e),function(e){e.helper.uploader.register("tcyun",{get name(){return e.i18n.translate("PICBED_TENCENTCLOUD")},handle:et,config:tt})}(e),function(e){e.helper.uploader.register("smms",{get name(){return e.i18n.translate("PICBED_SMMS")},handle:Qe,config:Xe})}(e),function(e){e.helper.uploader.register("github",{get name(){return e.i18n.translate("PICBED_GITHUB")},handle:it,config:at})}(e),function(e){e.helper.uploader.register("qiniu",{get name(){return e.i18n.translate("PICBED_QINIU")},handle:lt,config:Et})}(e),function(e){e.helper.uploader.register("imgur",{get name(){return e.i18n.translate("PICBED_IMGUR")},handle:ut,config:It})}(e),function(e){e.helper.uploader.register("upyun",{get name(){return e.i18n.translate("PICBED_UPYUN")},handle:At,config:Pt})}(e),function(e){e.helper.uploader.register("webdavplist",{get name(){return e.i18n.translate("PICBED_WEBDAVPLIST")},handle:ft,config:Ct})}(e)}}),Ut=(e,t,r)=>{const n=z(t);return n.real||(e.log.warn(`can't get ${r}'s image size`),e.log.warn("fallback to 200 * 200")),n};var Tt={handle:async e=>{const t=e.output;return await Promise.all(e.input.map((async(r,n)=>{let i;if(i=j(r)?await X(r,e):await Q(r),!i.success||!i.buffer)throw new Error(i.reason);{const a=Ut(e,i.buffer,r);t[n]={buffer:i.buffer,fileName:i.fileName,width:a.width,height:a.height,extname:i.extname}}}))),e.output=t.filter((e=>e)),e}};var Nt={handle:async e=>(e.output.push(...e.input),e)};class Lt{constructor(e){this.list=[],this.fullList=new Set,this.pluginMap=new Map,this.ctx=e,this.init()}init(){const r=t.join(this.ctx.baseDir,"package.json");if(!e.existsSync(r)){const t={name:"picgo-plugins",description:"picgo-plugins",repository:"https://github.com/PicGo/PicGo-Core",license:"MIT"};e.writeFileSync(r,JSON.stringify(t),"utf8")}}resolvePlugin(e,r){try{return M.sync(r,{basedir:e.baseDir})}catch(n){return t.join(e.baseDir,"node_modules",r)}}load(){const r=t.join(this.ctx.baseDir,"package.json"),n=t.join(this.ctx.baseDir,"node_modules/");if(!e.existsSync(n))return!1;const i=e.readJSONSync(r),a=Object.keys(i.dependencies||{}),s=Object.keys(i.devDependencies||{}),o=a.concat(s).filter((t=>{if(!/^picgo-plugin-|^@[^/]+\/picgo-plugin-/.test(t))return!1;const r=this.resolvePlugin(this.ctx,t);return e.existsSync(r)}));for(const e of o)this.registerPlugin(e);return!0}registerPlugin(e,t){if(e&&"string"==typeof e){this.fullList.add(e);try{if(t){this.list.push(e),Fe(e);const r=t(this.ctx);this.pluginMap.set(e,r),r.register(this.ctx)}else if(!0===this.ctx.getConfig(`picgoPlugins.${e}`)||void 0===this.ctx.getConfig(`picgoPlugins.${e}`)){this.list.push(e),Fe(e),this.getPlugin(e).register(this.ctx);const t=`picgoPlugins[${e}]`;this.ctx.saveConfig({[t]:!0})}}catch(t){this.pluginMap.delete(e),this.list=this.list.filter((t=>t!==e)),this.fullList.delete(e),this.ctx.log.error(t),this.ctx.emit(qe.NOTIFICATION,{title:`Plugin ${e} Load Error`,body:t})}}else this.ctx.log.warn("Please provide valid plugin")}unregisterPlugin(e){this.list=this.list.filter((t=>t!==e)),this.fullList.delete(e),this.pluginMap.delete(e),Fe(e),this.ctx.helper.uploader.unregister(e),this.ctx.helper.transformer.unregister(e),this.ctx.helper.beforeTransformPlugins.unregister(e),this.ctx.helper.beforeUploadPlugins.unregister(e),this.ctx.helper.afterUploadPlugins.unregister(e),this.ctx.cmd.unregister(e),this.ctx.removeConfig("picgoPlugins",e)}getPlugin(e){if(this.pluginMap.has(e))return this.pluginMap.get(e);const r=t.join(this.ctx.baseDir,"node_modules/"),n=require(r+e)(this.ctx);return this.pluginMap.set(e,n),n}getList(){return this.list}hasPlugin(e){return this.fullList.has(e)}getFullList(){return[...this.fullList]}}const Rt={darwin:'-- From https://github.com/mushanshitiancai/vscode-paste-image\r\nproperty fileTypes : {{«class PNGf», ".png"}}\r\n\r\non run argv\r\n\tif argv is {} then\r\n\t\treturn ""\r\n\tend if\r\n\r\n\tif ((clipboard info) as string) contains "«class furl»" then\r\n\t\treturn POSIX path of (the clipboard as «class furl»)\r\n\telse\r\n\t\tset imagePath to (item 1 of argv)\r\n\t\tset theType to getType()\r\n\r\n\t\tif theType is not missing value then\r\n\t\t\ttry\r\n\t\t\t\tset myFile to (open for access imagePath with write permission)\r\n\t\t\t\tset eof myFile to 0\r\n\t\t\t\twrite (the clipboard as (first item of theType)) to myFile\r\n\t\t\t\tclose access myFile\r\n\t\t\t\treturn (POSIX path of imagePath)\r\n\t\t\ton error\r\n\t\t\t\ttry\r\n\t\t\t\t\tclose access myFile\r\n\t\t\t\tend try\r\n\t\t\t\treturn "no image"\r\n\t\t\tend try\r\n\t\telse\r\n\t\t\treturn "no image"\r\n\t\tend if\r\n\tend if\r\nend run\r\n\r\non getType()\r\n\trepeat with aType in fileTypes\r\n\t\trepeat with theInfo in (clipboard info)\r\n\t\t\tif (first item of theInfo) is equal to (first item of aType) then return aType\r\n\t\tend repeat\r\n\tend repeat\r\n\treturn missing value\r\nend getType\r\n',win32:'\r\nparam($imagePath)\r\n\r\n# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\r\n\r\nAdd-Type -Assembly PresentationCore\r\n$img = [Windows.Clipboard]::GetImage()\r\n\r\nif ($img -eq $null) {\r\n "no image"\r\n Exit 1\r\n}\r\n\r\nif (-not $imagePath) {\r\n "no image"\r\n Exit 1\r\n}\r\n\r\n$fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\r\n$stream = [IO.File]::Open($imagePath, "OpenOrCreate")\r\n$encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\r\n$encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\r\n$encoder.Save($stream) | out-null\r\n$stream.Dispose() | out-null\r\n\r\n$imagePath\r\n',win10:'# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\r\nparam($imagePath)\r\n\r\n# https://github.com/PowerShell/PowerShell/issues/7233\r\n# fix the output encoding bug\r\n[console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding\r\n\r\nAdd-Type -Assembly PresentationCore\r\nfunction main {\r\n $img = [Windows.Clipboard]::GetImage()\r\n\r\n if ($img -eq $null) {\r\n "no image"\r\n Exit 1\r\n }\r\n\r\n if (-not $imagePath) {\r\n "no image"\r\n Exit 1\r\n }\r\n\r\n $fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\r\n $stream = [IO.File]::Open($imagePath, "OpenOrCreate")\r\n $encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\r\n $encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\r\n $encoder.Save($stream) | out-null\r\n $stream.Dispose() | out-null\r\n\r\n $imagePath\r\n # fix windows 10 native cmd crash bug when "picgo upload"\r\n # https://github.com/PicGo/PicGo-Core/issues/32\r\n Exit 1\r\n}\r\n\r\ntry {\r\n # For WIN10\r\n $file = Get-Clipboard -Format FileDropList\r\n if ($file -ne $null) {\r\n Convert-Path $file\r\n Exit 1\r\n }\r\n} catch {\r\n # For WIN7 WIN8 WIN10\r\n main\r\n}\r\n\r\nmain',linux:'#!/bin/sh\r\n\r\nif [ -z "$DISPLAY" ]; then\r\n echo "no support" >&2\r\n exit 1\r\nfi\r\n\r\ncase "$XDG_SESSION_TYPE" in\r\nwayland)\r\n command -v wl-copy >/dev/null 2>&1 || {\r\n echo >&2 "no wl-clipboard"\r\n exit 1\r\n }\r\n filePath=$(wl-copy -o 2>/dev/null | grep ^file:// | cut -c8-)\r\n if [ -z "$filePath" ]; then\r\n if\r\n wl-copy -t image/png image/png -o >"$1" 2>/dev/null\r\n then\r\n echo "$1"\r\n else\r\n rm -f "$1"\r\n echo "no image"\r\n fi\r\n else\r\n echo "$filePath"\r\n fi\r\n ;;\r\nx11 | tty)\r\n # require xclip(see http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212)\r\n command -v xclip >/dev/null 2>&1 || {\r\n echo >&2 "no xclip"\r\n exit 1\r\n }\r\n # write image in clipboard to file (see http://unix.stackexchange.com/questions/145131/copy-image-from-clipboard-to-file)\r\n filePath=$(xclip -selection clipboard -o 2>/dev/null | grep ^file:// | cut -c8-)\r\n if [ -z "$filePath" ]; then\r\n if\r\n xclip -selection clipboard -target image/png -o >"$1" 2>/dev/null\r\n then\r\n echo "$1"\r\n else\r\n rm -f "$1"\r\n echo "no image"\r\n fi\r\n else\r\n echo "$filePath"\r\n fi\r\n ;;\r\nesac\r\n',wsl:'#!/bin/sh\r\n# grab the paths\r\nscriptPath=$(echo $0 | awk \'{ print substr( $0, 1, length($0)-6 ) }\')"windows10.ps1"\r\nimagePath=$(echo $1 | awk \'{ print substr( $0, 1, length($0)-18 ) }\')\r\nimageName=$(echo $1 | awk \'{ print substr( $0, length($0)-17, length($0) ) }\')\r\n\r\n# run the powershell script\r\nres=$(powershell.exe -noprofile -noninteractive -nologo -sta -executionpolicy unrestricted -file $(wslpath -w $scriptPath) $(wslpath -w $imagePath)"\\\\"$imageName)\r\n\r\n# note that there is a return symbol in powershell result\r\nnoImage=$(echo "no image\\r")\r\n\r\n# check whether image exists\r\nif [ "$res" = "$noImage" ] ;then\r\n echo "no image"\r\nelse\r\n echo $(wslpath -u -a "${res}")\r\nfi\r\n'},Bt={darwin:"mac.applescript",win32:"windows.ps1",win10:"windows10.ps1",linux:"linux.sh",wsl:"wsl.sh"};const Mt=async r=>{!function(r){const n=t.join(r.baseDir,"piclist-clipboard-images");e.existsSync(n)||e.mkdirSync(n)}(r);const i=t.join(r.baseDir,"piclist-clipboard-images",`${A().format("YYYYMMDDHHmmss")}.png`);return await new Promise(((a,s)=>{const o=(()=>{const e=process.platform;if(y)return"wsl";if("win32"===e)return"10"===n.release().split(".")[0]?"win10":"win32";return"darwin"===e?"darwin":"linux"})(),l=t.join(r.baseDir,Bt[o]);let E;e.existsSync(l)||e.writeFileSync(l,Rt[o],"utf8"),E="darwin"===o?O("osascript",[l,i]):"win32"===o||"win10"===o?O("powershell",["-noprofile","-noninteractive","-nologo","-sta","-executionpolicy","unrestricted","-file",l,i]):O("sh",[l,i]),E.stdout.on("data",(n=>{if("linux"===o&&"no xclip or wl-clipboard"===n.toString().trim())return r.emit(qe.NOTIFICATION,{title:"xclip or wl-clipboard not found",body:"Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"}),s(new Error("Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"));const l=n.toString().trim();let E=!1;if(t.basename(l)!==t.basename(i)&&e.existsSync(l)&&(E=!0),"no image"!==l&&!e.existsSync(l))return s(new Error(`Can't find ${l}`));a({imgPath:l,shouldKeepAfterUploading:E})}))}))},Ot=new r,yt=new G.Agent({maxVersion:"TLSv1.2",minVersion:"TLSv1.2"});function wt(e,t,r){"object"==typeof r&&"value"in r&&"options"in r?e.append(t,r.value,r.options):e.append(t,r)}function Gt(e){return Object.assign(Object.assign({},e),{statusCode:e.status,body:e.data})}function bt(e){var t,r,n,i,a,s,o;const l={method:(null===(r=null===(t=null==e?void 0:e.config)||void 0===t?void 0:t.method)||void 0===r?void 0:r.toUpperCase())||"",url:(null===(n=null==e?void 0:e.config)||void 0===n?void 0:n.url)||"",statusCode:(null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status)||0,message:(null==e?void 0:e.message)||"",stack:(null==e?void 0:e.stack)||{},response:{status:(null===(a=null==e?void 0:e.response)||void 0===a?void 0:a.status)||0,statusCode:(null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.status)||0,body:(null===(o=null==e?void 0:e.response)||void 0===o?void 0:o.data)||""}};return Promise.reject(l)}class xt{constructor(e){this.proxy="",this.options={},this.ctx=e,this.init(),Ot.on(je.CONFIG_CHANGE,(e=>{var t;switch(e.configName){case"picBed":(null===(t=e.value)||void 0===t?void 0:t.proxy)&&(this.proxy=e.value.proxy);break;case"picBed.proxy":this.proxy=e.value}}))}init(){const e=this.ctx.getConfig("picBed.proxy");e&&(this.proxy=e)}handleProxy(){if(this.proxy)try{const e=new l(this.proxy);return{host:e.hostname,port:parseInt(e.port||"0",10),protocol:e.protocol}}catch(e){}return!1}request(e){var t;this.options.proxy=this.handleProxy(),this.options.headers=e.headers||{},this.options.maxBodyLength=1/0,this.options.maxContentLength=1/0,this.options.proxy&&(null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(this.options.httpsAgent=b.httpsOverHttp({proxy:{host:this.options.proxy.host,port:this.options.proxy.port}}),this.options.proxy=!1):this.options.httpsAgent=yt;const r=h.create(this.options);r.interceptors.response.use(Gt,bt);const n=function(e){var t;let r=!1;const n=Object.assign(Object.assign({},e),{url:e.url||"",headers:e.headers||{}});if(e.proxy){let i=e.proxy;if("string"==typeof i){try{i=new l(e.proxy)}catch(e){i=!1,n.proxy=!1,console.error(e)}r=!0}i&&((null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(n.proxy=!1,n.httpsAgent=b.httpsOverHttp({proxy:{host:null==i?void 0:i.hostname,port:parseInt(null==i?void 0:i.port,10)}})):n.proxy={host:i.hostname,port:parseInt(i.port,10),protocol:"http"})}if("formData"in e){const t=new w;for(const r in e.formData)wt(t,r,e.formData[r]);n.data=t,n.headers=Object.assign(n.headers||{},t.getHeaders()),r=!0,delete n.formData}return"body"in e&&(n.data=e.body,r=!0,delete n.body),"qs"in e&&(n.params=e.qs,r=!0),n.__isOldOptions=r,n}(e);return r.interceptors.request.use((function(e){var t,r,n;let i="";return(null===(t=null==e?void 0:e.headers)||void 0===t?void 0:t.contentType)?(i=e.headers.contentType,delete e.headers.contentType):(null===(r=null==e?void 0:e.headers)||void 0===r?void 0:r.ContentType)?(i=e.headers.ContentType,delete e.headers.ContentType):(null===(n=null==e?void 0:e.headers)||void 0===n?void 0:n["content-type"])&&(i=e.headers["content-type"],delete e.headers["content-type"]),""!==i&&e.headers&&(e.headers["Content-Type"]=i),e})),"resolveWithFullResponse"in e&&e.resolveWithFullResponse?r.request(n):r.request(n).then((t=>n.__isOldOptions?"json"in e?e.json?t.data:void 0:JSON.stringify(t.data):t.data))}}class $t{constructor(e){if(this.ctx=e,this.db=new x(this.ctx.configPath),!this.db.has("picBed"))try{this.db.set("picBed",{uploader:"smms",current:"smms"})}catch(e){throw this.ctx.log.error(e),e}if(!this.db.has("picgoPlugins"))try{this.db.set("picgoPlugins",{})}catch(e){throw this.ctx.log.error(e),e}}read(e){return this.db.read(e)}get(e=""){return this.read(!0),this.db.get(e)}set(e,t){return this.read(!0),this.db.set(e,t)}has(e){return this.read(!0),this.db.has(e)}unset(e,t){return this.read(!0),this.db.unset(e,t)}saveConfig(e){Object.keys(e).forEach((t=>{this.set(t,e[t])}))}removeConfig(e){Object.keys(e).forEach((t=>{this.unset(t,e[t])}))}}class Wt{constructor(e){this.ctx=e}async install(e,t={},r){const n=[],i=e.map((e=>vt(this.ctx,e))).filter((e=>this.ctx.pluginLoader.hasPlugin(e.pkgName)?(n.push(e.pkgName),this.ctx.log.success(`PicGo has already installed ${e.pkgName}`),!1):!!e.success)),a=i.map((e=>e.fullName)),s=i.map((e=>e.pkgName));if(a.length>0){const e=await this.execCommand("install",a,this.ctx.baseDir,t,r);if(e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("installFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),body:t});return{success:!1,body:t}}s.forEach((e=>{this.ctx.pluginLoader.registerPlugin(e)})),this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS")),this.ctx.emit("installSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),body:[...s,...n]});return{success:!0,body:[...s,...n]}}if(0===n.length){const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("installFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),body:e});return{success:!1,body:e}}this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS")),this.ctx.emit("installSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),body:[...s,...n]});return{success:!0,body:[...s,...n]}}async uninstall(e){const t=e.map((e=>vt(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(t.length>0){const e=await this.execCommand("uninstall",t,this.ctx.baseDir);if(e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("uninstallFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),body:t});return{success:!1,body:t}}t.forEach((e=>{this.ctx.pluginLoader.unregisterPlugin(e)})),this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS")),this.ctx.emit("uninstallSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS"),body:t});return{success:!0,body:t}}{const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("uninstallFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),body:e});return{success:!1,body:e}}}async update(e,t={},r){const n=e.map((e=>vt(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(n.length>0){const e=await this.execCommand("update",n,this.ctx.baseDir,t,r);if(e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("updateFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),body:t});return{success:!1,body:t}}this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS")),this.ctx.emit("updateSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS"),body:n});return{success:!0,body:n}}{const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("updateFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),body:e});return{success:!1,body:e}}}async execCommand(e,t,r,n={},i={}){const a=n.registry||this.ctx.getConfig("settings.registry"),s=n.proxy||this.ctx.getConfig("settings.proxy");return await new Promise((n=>{var o,l;let E=[e].concat(t).concat("--color=always").concat("--save");a&&(E=E.concat(`--registry=${a}`)),s&&(E=E.concat(`--proxy=${s}`));try{const e=$("npm",E,{cwd:r,env:Object.assign({},process.env,i)});let t="";null===(o=e.stdout)||void 0===o||o.on("data",(e=>{t+=e})).pipe(process.stdout),null===(l=e.stderr)||void 0===l||l.on("data",(e=>{t+=e})).pipe(process.stderr),e.on("close",(e=>{n(e?{code:e,data:t}:{code:0,data:t})})),e.on("error",(e=>{this.ctx.log.error(e),this.ctx.log.error("NPM is not installed"),this.ctx.emit(qe.FAILED,"NPM is not installed")}))}catch(e){this.ctx.log.error(e),this.ctx.emit(qe.FAILED,e)}}))}}const vt=(e,t)=>{const r={success:!1,fullName:"",pkgName:""},n=te(t,e.log);if(!n)return r;const i=re(n,e.log);return i?{success:!0,fullName:n,pkgName:i}:r},Ht={"zh-CN":{UPLOAD_FAILED:"上传失败",CHECK_SETTINGS:"请检查你的配置项是否正确",CHECK_SETTINGS_AND_NETWORK:"请检查你的配置项以及网络",UPLOAD_FAILED_REASON:"错误码:${code},请打开浏览器粘贴地址查看相关原因",SERVER_ERROR:"服务端出错,请重试",AUTH_FAILED:"认证失败",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"设定Token",PICBED_SMMS_BACKUP_DOMAIN:"备用上传域名",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"例如 smms.app",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"设定KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"设定KeySecret",PICBED_ALICLOUD_BUCKET:"设定Bucket",PICBED_ALICLOUD_AREA:"设定存储区域",PICBED_ALICLOUD_PATH:"设定存储路径",PICBED_ALICLOUD_CUSTOMURL:"设定自定义域名",PICBED_ALICLOUD_OPTIONS:"设定网址后缀",PICBED_ALICLOUD_MESSAGE_AREA:"例如:oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如:test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如:?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD:"腾讯云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"设定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"设定SecretKey",PICBED_TENCENTCLOUD_APPID:"设定AppId",PICBED_TENCENTCLOUD_BUCKET:"设定Bucket",PICBED_TENCENTCLOUD_AREA:"设定存储区域",PICBED_TENCENTCLOUD_PATH:"设定存储路径",PICBED_TENCENTCLOUD_OPTIONS:"设定网址后缀",PICBED_TENCENTCLOUD_CUSTOMURL:"设定自定义域名",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如:1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如:ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如:test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如:?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"设定Token",PICBED_GITHUB_REPO:"设定仓库名",PICBED_GITHUB_PATH:"设定存储路径",PICBED_GITHUB_BRANCH:"设定分支名",PICBED_GITHUB_CUSTOMURL:"设定自定义域名",PICBED_GITHUB_MESSAGE_REPO:"格式:username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如:main",PICBED_GITHUB_MESSAGE_PATH:"例如:test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"设定AccessKey",PICBED_QINIU_SECRETKEY:"设定SecretKey",PICBED_QINIU_BUCKET:"设定Bucket",PICBED_QINIU_PATH:"设定存储路径",PICBED_QINIU_URL:"设定访问网址",PICBED_QINIU_OPTIONS:"设定网址后缀",PICBED_QINIU_AREA:"设定存储区域",PICBED_QINIU_MESSAGE_PATH:"例如:test/",PICBED_QINIU_MESSAGE_AREA:"例如:z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如:?imageslim",PICBED_QINIU_MESSAGE_URL:"例如:https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"设定ClientId",PICBED_IMGUR_USERNAME:"设定用户名",PICBED_IMGUR_ACCESS_TOKEN:"设定accessToken",PICBED_IMGUR_ALBUM:"设定相册名",PICBED_IMGUR_PROXY:"设定代理",PICBED_IMGUR_MESSAGE_CLIENTID:"匿名上传时填写",PICBED_IMGUR_MESSAGE_USERNAME:"需要上传到账户时填写",PICBED_IMGUR_MESSAGE_ACCESS_TOKEN:"需要上传到账户时填写",PICBED_IMGUR_MESSAGE_ALBUM:"例如:test",PICBED_IMGUR_MESSAGE_PROXY:"例如:http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"设定Bucket",PICBED_UPYUN_OPERATOR:"设定操作员",PICBED_UPYUN_PASSWORD:"设定操作员密码",PICBED_UPYUN_PATH:"设定存储路径",PICBED_UPYUN_URL:"设定加速域名",PICBED_UPYUN_OPTIONS:"设定网址后缀",PICBED_UPYUN_MESSAGE_OPERATOR:"例如:me",PICBED_UPYUN_MESSAGE_PASSWORD:"输入操作员密码",PICBED_UPYUN_MESSAGE_URL:"例如:http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如:!imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如:test/",PICBED_WEBDAVPLIST:"WebDAV",PICBED_WEBDAVPLIST_HOST:"设定接口网址",PICBED_WEBDAVPLIST_SSLENABLED:"启用SSL",PICBED_WEBDAVPLIST_USERNAME:"设定用户名",PICBED_WEBDAVPLIST_PASSWORD:"设定密码",PICBED_WEBDAVPLIST_PATH:"设定存储路径",PICBED_WEBDAVPLIST_WEBSITE_PATH:"设定网址路径",PICBED_WEBDAVPLIST_CUSTOMURL:"设定自定义域名",PICBED_WEBDAVPLIST_MESSAGE_HOST:"例如:https://example.com/webdav",PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED:"需要HTTPS时启用",PICBED_WEBDAVPLIST_MESSAGE_USERNAME:"例如:me",PICBED_WEBDAVPLIST_MESSAGE_PASSWORD:"输入密码",PICBED_WEBDAVPLIST_MESSAGE_PATH:"例如:test/",PICBED_WEBDAVPLIST_MESSAGE_WEBSITE_PATH:"拼接网址时使用",PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL:"例如:https://test.com",BUILDIN_WATERMARK_ISADDWATERMARK:"是否添加水印",BUILDIN_WATERMARK_MESSAGE_ISADDWATERMARK:"需要添加水印时启用",BUILDIN_WATERMARK_WATERMARKTYPE:"设定水印类型",BUILDIN_WATERMARK_MESSAGE_WATERMARKTYPE:"请选择水印类型",BUILDIN_WATERMARK_ISFULLSCREENWATERMARK:"是否全屏水印",BUILDIN_WATERMARK_MESSAGE_ISFULLSCREENWATERMARK:"需要全屏水印时启用",BUILDIN_WATERMARK_WATERMARKDEGREE:"设定水印角度",BUILDIN_WATERMARK_MESSAGE_WATERMARKDEGREE:"请输入数字",BUILDIN_WATERMARK_WATERMARKTEXT:"设定水印文字",BUILDIN_WATERMARK_MESSAGE_WATERMARKTEXT:"请输入水印文字",BUILDIN_WATERMARK_WATERMARKTEXTFONTPATH:"设定水印字体文件路径",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTPATH:"请输入水印字体文件路径",BUILDIN_WATERMARK_WATERMARKFONTRATIO:"设定水印相对于图片的比例",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTRATIO:"请输入0-1的小数",BUILDIN_WATERMARK_WATERMARKFONTCOLOR:"设定水印字体颜色",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTCOLOR:"请输入rgb颜色值",BUILDIN_WATERMARK_WATERMARKIMAGEPATH:"设定水印图片路径",BUILDIN_WATERMARK_MESSAGE_WATERMARKIMAGEPATH:"请输入水印图片路径",BUILDIN_WATERMARK_WATERMARKPOSITION:"设定水印位置",BUILDIN_WATERMARK_MESSAGE_WATERMARKPOSITION:"请选择水印位置",BUILDIN_RENAME_FORMAT:"设定重命名格式",BUILDIN_RENAME_ENABLE:"是否启用重命名",BUILDIN_COMPRESS_QUALITY:"设定图片质量",BUILDIN_COMPRESS_MESSAGE_QUALITY:"请输入0-100的整数",BUILDIN_COMPRESS_ISCONVERT:"是否进行格式转换",BUILDIN_COMPRESS_MESSAGE_ISCONVERT:"需要转换时启用",BUILDIN_COMPRESS_CONVERTFORMAT:"设定转换格式",BUILDIN_COMPRESS_MESSAGE_CONVERTFORMAT:"请选择转换格式",BUILDIN_COMPRESS_ISRESIZE:"是否进行图片缩放",BUILDIN_COMPRESS_MESSAGE_ISRESIZE:"需要缩放时启用",BUILDIN_COMPRESS_RESIZEWIDTH:"设定缩放宽度",BUILDIN_COMPRESS_MESSAGE_RESIZEWIDTH:"请输入数字",BUILDIN_COMPRESS_RESIZEHEIGHT:"设定缩放高度",BUILDIN_COMPRESS_MESSAGE_RESIZEHEIGHT:"请输入数字",BUILDIN_COMPRESS_ISRESIZEBYPERCENT:"是否按百分比进行缩放",BUILDIN_COMPRESS_MESSAGE_ISRESIZEBYPERCENT:"需要按百分比缩放时启用",BUILDIN_COMPRESS_RESIZEPERCENT:"设定缩放百分比",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"请输入数字",BUILDIN_COMPRESS_ISROTATE:"是否进行图片旋转",BUILDIN_COMPRESS_MESSAGE_ISROTATE:"需要旋转时启用",BUILDIN_COMPRESS_ROTATEDEGREE:"设定旋转角度",BUILDIN_COMPRESS_MESSAGE_ROTATEDEGREE:"请输入数字,可为负数",BUILDIN_COMPRESS_ISREMOVEEXIF:"是否移除EXIF信息",BUILDIN_COMPRESS_MESSAGE_ISREMOVEEXIF:"需要移除EXIF信息时启用",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安装成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安装失败",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安装失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安装失败,请输入合法插件名或合法安装路径",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸载成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸载失败",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸载失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸载失败,请输入合法插件名",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失败",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失败,请输入合法插件名"},"zh-TW":{UPLOAD_FAILED:"上傳失敗",CHECK_SETTINGS:"請檢查你的設定是否正確",CHECK_SETTINGS_AND_NETWORK:"請檢查你的設定及網路",UPLOAD_FAILED_REASON:"錯誤碼:${code},請打開瀏覽器貼上地址查看相關原因",SERVER_ERROR:"伺服器出錯,請重試",AUTH_FAILED:"認證失敗",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"設定Token",PICBED_SMMS_BACKUP_DOMAIN:"備用上傳網址",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"例如 smms.app",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"設定KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"設定KeySecret",PICBED_ALICLOUD_BUCKET:"設定Bucket",PICBED_ALICLOUD_AREA:"設定儲存區域",PICBED_ALICLOUD_PATH:"設定儲存路徑",PICBED_ALICLOUD_CUSTOMURL:"設定自訂網址",PICBED_ALICLOUD_OPTIONS:"設定網址後綴",PICBED_ALICLOUD_MESSAGE_AREA:"例如:oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如:test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如:?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD:"騰訊云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"設定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"設定SecretKey",PICBED_TENCENTCLOUD_APPID:"設定AppId",PICBED_TENCENTCLOUD_BUCKET:"設定Bucket",PICBED_TENCENTCLOUD_AREA:"設定儲存區域",PICBED_TENCENTCLOUD_PATH:"設定儲存路徑",PICBED_TENCENTCLOUD_OPTIONS:"設定網址後綴",PICBED_TENCENTCLOUD_CUSTOMURL:"設定自訂網址",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如:1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如:ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如:test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如:?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"設定Token",PICBED_GITHUB_REPO:"設定倉庫名稱",PICBED_GITHUB_PATH:"設定儲存路徑",PICBED_GITHUB_BRANCH:"設定分支名稱",PICBED_GITHUB_CUSTOMURL:"設定自訂網址",PICBED_GITHUB_MESSAGE_REPO:"格式:username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如:main",PICBED_GITHUB_MESSAGE_PATH:"例如:test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"設定AccessKey",PICBED_QINIU_SECRETKEY:"設定SecretKey",PICBED_QINIU_BUCKET:"設定Bucket",PICBED_QINIU_PATH:"設定儲存路徑",PICBED_QINIU_URL:"設定訪問網址",PICBED_QINIU_OPTIONS:"設定網址後綴",PICBED_QINIU_AREA:"設定儲存區域",PICBED_QINIU_MESSAGE_PATH:"例如:test/",PICBED_QINIU_MESSAGE_AREA:"例如:z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如:?imageslim",PICBED_QINIU_MESSAGE_URL:"例如:https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"設定ClientId",PICBED_IMGUR_USERNAME:"設定用戶名",PICBED_IMGUR_ACCESS_TOKEN:"設定accessToken",PICBED_IMGUR_ALBUM:"設定相簿名",PICBED_IMGUR_PROXY:"設定PROXY",PICBED_IMGUR_MESSAGE_CLIENTID:"匿名上傳時填寫",PICBED_IMGUR_MESSAGE_USERNAME:"需要上傳到賬戶時填寫",PICBED_IMGUR_MESSAGE_ACCESS_TOKEN:"需要上傳到賬戶時填寫",PICBED_IMGUR_MESSAGE_ALBUM:"例如:test",PICBED_IMGUR_MESSAGE_PROXY:"例如:http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"設定Bucket",PICBED_UPYUN_OPERATOR:"設定操作員",PICBED_UPYUN_PASSWORD:"設定操作員密碼",PICBED_UPYUN_PATH:"設定儲存路徑",PICBED_UPYUN_URL:"設定加速網址",PICBED_UPYUN_OPTIONS:"設定網址後綴",PICBED_UPYUN_MESSAGE_OPERATOR:"例如:me",PICBED_UPYUN_MESSAGE_PASSWORD:"輸入操作員密碼",PICBED_UPYUN_MESSAGE_URL:"例如:http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如:!imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如:test/",PICBED_WEBDAVPLIST:"WebDAV",PICBED_WEBDAVPLIST_HOST:"設定API主機",PICBED_WEBDAVPLIST_SSLENABLED:"需要HTTPS時啟用",PICBED_WEBDAVPLIST_USERNAME:"設定用戶名",PICBED_WEBDAVPLIST_PASSWORD:"設定密碼",PICBED_WEBDAVPLIST_PATH:"設定儲存路徑",PICBED_WEBDAVPLIST_CUSTOMURL:"設定自訂網址",PICBED_WEBDAVPLIST_WEBSITE_PATH:"設定網站路徑",PICBED_WEBDAVPLIST_MESSAGE_HOST:"例如:https://example.com/webdav",PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED:"需要HTTPS時啟用",PICBED_WEBDAVPLIST_MESSAGE_USERNAME:"例如:me",PICBED_WEBDAVPLIST_MESSAGE_PASSWORD:"輸入用戶密碼",PICBED_WEBDAVPLIST_MESSAGE_PATH:"例如:test/",PICBED_WEBDAVPLIST_MESSAGE_WEBSITE_PATH:"拼接網址時使用",PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL:"例如:https://test.com",BUILDIN_WATERMARK_ISADDWATERMARK:"是否添加水印",BUILDIN_WATERMARK_MESSAGE_ISADDWATERMARK:"需要添加水印時啟用",BUILDIN_WATERMARK_WATERMARKTYPE:"設定水印類型",BUILDIN_WATERMARK_MESSAGE_WATERMARKTYPE:"請選擇水印類型",BUILDIN_WATERMARK_ISFULLSCREENWATERMARK:"是否全屏水印",BUILDIN_WATERMARK_MESSAGE_ISFULLSCREENWATERMARK:"需要全屏水印時啟用",BUILDIN_WATERMARK_WATERMARKDEGREE:"設定水印角度",BUILDIN_WATERMARK_MESSAGE_WATERMARKDEGREE:"請輸入數字",BUILDIN_WATERMARK_WATERMARKTEXT:"設定水印文字",BUILDIN_WATERMARK_MESSAGE_WATERMARKTEXT:"請輸入水印文字",BUILDIN_WATERMARK_WATERMARKTEXTFONTPATH:"設定水印字體",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTPATH:"請輸入水印字體文件路徑",BUILDIN_WATERMARK_WATERMARKFONTRATIO:"設定水印圖片比例",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTRATIO:"請輸入0-1的數字",BUILDIN_WATERMARK_WATERMARKFONTCOLOR:"設定水印字體顏色",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTCOLOR:"請輸入rgb顏色值",BUILDIN_WATERMARK_WATERMARKIMAGEPATH:"設定水印圖片路徑",BUILDIN_WATERMARK_MESSAGE_WATERMARKIMAGEPATH:"請輸入水印圖片路徑",BUILDIN_WATERMARK_WATERMARKPOSITION:"設定水印位置",BUILDIN_WATERMARK_MESSAGE_WATERMARKPOSITION:"請選擇水印位置",BUILDIN_RENAME_FORMAT:"設定重命名格式",BUILDIN_RENAME_ENABLE:"是否啟用重命名",BUILDIN_COMPRESS_QUALITY:"設定圖片質量",BUILDIN_COMPRESS_MESSAGE_QUALITY:"請輸入0-100的整數",BUILDIN_COMPRESS_ISCONVERT:"是否進行格式轉換",BUILDIN_COMPRESS_MESSAGE_ISCONVERT:"需要轉換時啟用",BUILDIN_COMPRESS_CONVERTFORMAT:"設定轉換格式",BUILDIN_COMPRESS_MESSAGE_CONVERTFORMAT:"請選擇轉換格式",BUILDIN_COMPRESS_ISRESIZE:"是否進行圖片縮放",BUILDIN_COMPRESS_MESSAGE_ISRESIZE:"需要縮放時啟用",BUILDIN_COMPRESS_RESIZEWIDTH:"設定縮放寬度",BUILDIN_COMPRESS_MESSAGE_RESIZEWIDTH:"請輸入數字",BUILDIN_COMPRESS_RESIZEHEIGHT:"設定縮放高度",BUILDIN_COMPRESS_MESSAGE_RESIZEHEIGHT:"請輸入數字",BUILDIN_COMPRESS_ISRESIZEBYPERCENT:"是否按百分比進行縮放",BUILDIN_COMPRESS_MESSAGE_ISRESIZEBYPERCENT:"需要按百分比縮放時啟用",BUILDIN_COMPRESS_RESIZEPERCENT:"設定縮放百分比",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"請輸入数字",BUILDIN_COMPRESS_ISROTATE:"是否進行圖片旋轉",BUILDIN_COMPRESS_MESSAGE_ISROTATE:"需要旋轉時啟用",BUILDIN_COMPRESS_ROTATEDEGREE:"設定旋轉角度",BUILDIN_COMPRESS_MESSAGE_ROTATEDEGREE:"請輸入數字,可為負數",BUILDIN_COMPRESS_ISREMOVEEXIF:"是否移除EXIF資訊",BUILDIN_COMPRESS_MESSAGE_ISREMOVEEXIF:"需要移除EXIF資訊時啟用",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安裝成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安裝失敗",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安裝失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安裝失敗,請輸入正確的插件名稱或正確的安裝路徑",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸載成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸載失敗",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸載失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸載失敗,請輸入正確的插件名稱",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失敗",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失敗,請輸入正確的插件名稱"},en:{UPLOAD_FAILED:"Upload failed",CHECK_SETTINGS:"Please check your settings",CHECK_SETTINGS_AND_NETWORK:"Please check your settings and network",UPLOAD_FAILED_REASON:"Error code: ${code}, please open the browser and paste the address to see the reason",SERVER_ERROR:"Server error, please try again later",AUTH_FAILED:"Authentication failed",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"Set Token",PICBED_SMMS_BACKUP_DOMAIN:"Set Backup Upload Domain",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"Ex. smms.app",PICBED_ALICLOUD:"Ali Cloud",PICBED_ALICLOUD_ACCESSKEYID:"Set KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"Set KeySecret",PICBED_ALICLOUD_BUCKET:"Set Bucket",PICBED_ALICLOUD_AREA:"Set Area",PICBED_ALICLOUD_PATH:"Set Path",PICBED_ALICLOUD_CUSTOMURL:"Set Custom URL",PICBED_ALICLOUD_OPTIONS:"Set URL Suffix",PICBED_ALICLOUD_MESSAGE_AREA:"Ex. oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"Ex. test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"Ex. ?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_TENCENTCLOUD:"Tencent Cloud",PICBED_TENCENTCLOUD_VERSION:"Choose COS version",PICBED_TENCENTCLOUD_SECRETID:"Set SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"Set SecretKey",PICBED_TENCENTCLOUD_APPID:"Set AppId",PICBED_TENCENTCLOUD_BUCKET:"Set Bucket",PICBED_TENCENTCLOUD_AREA:"Set Area",PICBED_TENCENTCLOUD_PATH:"Set Path",PICBED_TENCENTCLOUD_OPTIONS:"Set URL Suffix",PICBED_TENCENTCLOUD_CUSTOMURL:"Set Custom URL",PICBED_TENCENTCLOUD_MESSAGE_APPID:"Ex. 1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"Ex. ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"Ex. test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"Ex. http://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"Ex. ?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"Set Token",PICBED_GITHUB_REPO:"Set Repo Name",PICBED_GITHUB_PATH:"Set Path",PICBED_GITHUB_BRANCH:"Set Branch",PICBED_GITHUB_CUSTOMURL:"Set Custom URL",PICBED_GITHUB_MESSAGE_REPO:"Ex. username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"Ex. main",PICBED_GITHUB_MESSAGE_PATH:"Ex. test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_QINIU:"Qiniu",PICBED_QINIU_ACCESSKEY:"Set AccessKey",PICBED_QINIU_SECRETKEY:"Set SecretKey",PICBED_QINIU_BUCKET:"Set Bucket",PICBED_QINIU_PATH:"Set Path",PICBED_QINIU_URL:"Set URL",PICBED_QINIU_OPTIONS:"Set URL Suffix",PICBED_QINIU_AREA:"Set Area",PICBED_QINIU_MESSAGE_PATH:"Ex. test/",PICBED_QINIU_MESSAGE_AREA:"Ex. z0",PICBED_QINIU_MESSAGE_OPTIONS:"Ex. ?imageslim",PICBED_QINIU_MESSAGE_URL:"Ex. https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"Set ClientId",PICBED_IMGUR_USERNAME:"Set Username",PICBED_IMGUR_ACCESS_TOKEN:"Set Access Token",PICBED_IMGUR_ALBUM:"Set Album Name",PICBED_IMGUR_PROXY:"Set Proxy",PICBED_IMGUR_MESSAGE_CLIENTID:"Fill in when you need to upload as anonymous",PICBED_IMGUR_MESSAGE_USERNAME:"Fill in when you need to upload to the account",PICBED_IMGUR_MESSAGE_ACCESS_TOKEN:"Fill in when you need to upload to the account",PICBED_IMGUR_MESSAGE_ALBUM:"例如:test",PICBED_IMGUR_MESSAGE_PROXY:"Ex. http://127.0.0.1:1080",PICBED_UPYUN:"Upyun",PICBED_UPYUN_BUCKET:"Set Bucket",PICBED_UPYUN_OPERATOR:"Set Operator",PICBED_UPYUN_PASSWORD:"Set Operator Password",PICBED_UPYUN_PATH:"Set Path",PICBED_UPYUN_URL:"Set URL",PICBED_UPYUN_OPTIONS:"Set URL Suffix",PICBED_UPYUN_MESSAGE_OPERATOR:"Ex. me",PICBED_UPYUN_MESSAGE_PASSWORD:"Please type the operator password",PICBED_UPYUN_MESSAGE_URL:"Ex. http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"Ex. !imgslim",PICBED_UPYUN_MESSAGE_PATH:"Ex. test/",PICBED_WEBDAVPLIST:"WebDAV",PICBED_WEBDAVPLIST_HOST:"Set Host",PICBED_WEBDAVPLIST_SSLENABLED:"Enable HTTPS",PICBED_WEBDAVPLIST_USERNAME:"Set Username",PICBED_WEBDAVPLIST_PASSWORD:"Set Password",PICBED_WEBDAVPLIST_PATH:"Set Path",PICBED_WEBDAVPLIST_WEBSITE_PATH:"Set Website Path",PICBED_WEBDAVPLIST_CUSTOMURL:"Set Custom URL",PICBED_WEBDAVPLIST_MESSAGE_HOST:"Ex. https://example.com/webdav",PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED:"Enable HTTPS",PICBED_WEBDAVPLIST_MESSAGE_USERNAME:"Ex. me",PICBED_WEBDAVPLIST_MESSAGE_PASSWORD:"Please type the password",PICBED_WEBDAVPLIST_MESSAGE_PATH:"Ex. test/",PICBED_WEBDAVPLIST_MESSAGE_WEBSITE_PATH:"Used to generate the URL of the image",PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL:"Ex. https://test.com",BUILDIN_RENAME_FORMAT:"Set rename format",BUILDIN_RENAME_ENABLE:"Enable rename",BUILDIN_WATERMARK_ISADDWATERMARK:"Whether to add watermark",BUILDIN_WATERMARK_MESSAGE_ISADDWATERMARK:"Enable when watermark is required",BUILDIN_WATERMARK_WATERMARKTYPE:"Set watermark type",BUILDIN_WATERMARK_MESSAGE_WATERMARKTYPE:"Please select watermark type",BUILDIN_WATERMARK_ISFULLSCREENWATERMARK:"Whether to use full-screen watermark",BUILDIN_WATERMARK_MESSAGE_ISFULLSCREENWATERMARK:"Enable when full-screen watermark is required",BUILDIN_WATERMARK_WATERMARKDEGREE:"Set watermark angle",BUILDIN_WATERMARK_MESSAGE_WATERMARKDEGREE:"Please enter a number",BUILDIN_WATERMARK_WATERMARKTEXT:"Set watermark text",BUILDIN_WATERMARK_MESSAGE_WATERMARKTEXT:"Please enter watermark text",BUILDIN_WATERMARK_WATERMARKTEXTFONTPATH:"Set watermark font",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTPATH:"Please enter the watermark font file path",BUILDIN_WATERMARK_WATERMARKFONTRATIO:"Set the ratio of the watermark to the image",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTRATIO:"Please enter a number between 0-1",BUILDIN_WATERMARK_WATERMARKFONTCOLOR:"Set watermark font color",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTCOLOR:"Please enter the RGB color value",BUILDIN_WATERMARK_WATERMARKIMAGEPATH:"Set watermark image path",BUILDIN_WATERMARK_MESSAGE_WATERMARKIMAGEPATH:"Please enter the watermark image path",BUILDIN_WATERMARK_WATERMARKPOSITION:"Set watermark position",BUILDIN_WATERMARK_MESSAGE_WATERMARKPOSITION:"Please select watermark position",BUILDIN_COMPRESS_QUALITY:"Set image quality",BUILDIN_COMPRESS_MESSAGE_QUALITY:"Please enter an integer between 0-100",BUILDIN_COMPRESS_ISCONVERT:"Whether to perform format conversion",BUILDIN_COMPRESS_MESSAGE_ISCONVERT:"Enable when format conversion is required",BUILDIN_COMPRESS_CONVERTFORMAT:"Set conversion format",BUILDIN_COMPRESS_MESSAGE_CONVERTFORMAT:"Please select conversion format",BUILDIN_COMPRESS_ISRESIZE:"Whether to resize the image",BUILDIN_COMPRESS_MESSAGE_ISRESIZE:"Enable when image resizing is required",BUILDIN_COMPRESS_RESIZEWIDTH:"Set resizing width",BUILDIN_COMPRESS_MESSAGE_RESIZEWIDTH:"Please enter a number",BUILDIN_COMPRESS_RESIZEHEIGHT:"Set resizing height",BUILDIN_COMPRESS_MESSAGE_RESIZEHEIGHT:"Please enter a number",BUILDIN_COMPRESS_ISRESIZEBYPERCENT:"Whether to resize the image by percentage",BUILDIN_COMPRESS_MESSAGE_ISRESIZEBYPERCENT:"Enable when resizing by percentage is required",BUILDIN_COMPRESS_RESIZEPERCENT:"Set resizing percentage",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"Please enter a number",BUILDIN_COMPRESS_ISROTATE:"Whether to rotate the image",BUILDIN_COMPRESS_MESSAGE_ISROTATE:"Enable when image rotation is required",BUILDIN_COMPRESS_ROTATEDEGREE:"Set rotation angle",BUILDIN_COMPRESS_MESSAGE_ROTATEDEGREE:"Please enter a number, can be negative",BUILDIN_COMPRESS_ISREMOVEEXIF:"Whether to remove EXIF information",BUILDIN_COMPRESS_MESSAGE_ISREMOVEEXIF:"Enable when removing EXIF information is required",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"Plugin installed successfully",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"Plugin installation failed",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"Plugin installation failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"Plugin installation failed, please enter a valid plugin name or valid installation path",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"Plugin uninstalled successfully",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"Plugin uninstall failed",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"Plugin uninstall failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"Plugin uninstall failed, please enter a valid plugin name",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"Plugin updated successfully",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"Plugin update failed",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"Plugin update failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"Plugin update failed, please enter a valid plugin name"}};class Ft{constructor(e){this.ctx=e,this.objectAdapter=new v(Ht);let t=this.ctx.getConfig("settings.language")||"zh-CN";Ht[t]||(t="zh-CN"),this.i18n=new H({adapter:this.objectAdapter,defaultLanguage:t}),this.loadOutterI18n()}loadOutterI18n(){const r=this.getOutterI18nFolder();e.readdirSync(r,{withFileTypes:!0}).forEach((n=>{if(n.isFile()&&n.name.endsWith(".yml")){const i=t.join(r,n.name),a=e.readFileSync(i,"utf8");try{const e=W.load(a);Ht[n.name.replace(/\.yml$/,"")]=e}catch(e){console.error(e)}}}))}getOutterI18nFolder(){const r=t.join(this.ctx.baseDir,"i18n-cli");return e.pathExistsSync(r)||e.ensureDirSync(r),r}translate(e,t){return this.i18n.translate(e,t)||e}setLanguage(e){this.i18n.setLanguage(e),this.ctx.saveConfig({"settings.language":e})}addLocale(e,t){const r=this.objectAdapter.getLocale(e);if(!r)return!1;const n=C(r,t);return this.objectAdapter.setLocale(e,n),!0}addLanguage(e,t){return!this.objectAdapter.getLocale(e)&&(this.objectAdapter.setLocale(e,t),Ht[e]=t,!0)}getLanguageList(){return Object.keys(Ht)}}class Kt extends r{constructor(e=""){super(),this.VERSION="0.6.7",this.configPath=e,this.output=[],this.input=[],this.rawInput=[],this.helper={transformer:new He("transformer"),uploader:new He("uploader"),beforeTransformPlugins:new He("beforeTransformPlugins"),beforeUploadPlugins:new He("beforeUploadPlugins"),afterUploadPlugins:new He("afterUploadPlugins")},this.initConfigPath(),this.log=new Ve(this),this.cmd=new Ke(this),this.pluginHandler=new Wt(this),this.initConfig(),this.init()}get pluginLoader(){return this._pluginLoader}initConfigPath(){if(""===this.configPath&&(this.configPath=i()+"/.piclist/config.json"),".JSON"!==t.extname(this.configPath).toUpperCase())throw this.configPath="",Error("The configuration file only supports JSON format.");this.baseDir=t.dirname(this.configPath);e.pathExistsSync(this.configPath)||e.ensureFileSync(`${this.configPath}`)}initConfig(){this.db=new $t(this),this._config=this.db.read(!0)}init(){try{this.i18n=new Ft(this),this.Request=new xt(this),this._pluginLoader=new Lt(this),Fe("picgo"),Dt().register(this),{register(e){e.helper.transformer.register("path",Tt),e.helper.transformer.register("base64",Nt)}}.register(this),Fe(""),this._pluginLoader.load(),this.lifecycle=new Ye(this)}catch(e){throw this.emit(qe.UPLOAD_PROGRESS,-1),this.log.error(e),e}}use(e,t){if(t)return this.pluginLoader.registerPlugin(t,e),this.pluginLoader.getPlugin(t);return e(this)}registerCommands(){""!==this.configPath&&(this.cmd.init(),this.cmd.loadCommands())}getConfig(e){return e?D(this._config,e):this._config}saveConfig(e){oe(e)?(this.setConfig(e),this.db.saveConfig(e)):this.log.warn("the format of config is invalid, please provide object")}removeConfig(e,t){e&&t&&(se(e)?this.log.warn(`the config.${e} can't be removed`):(this.unsetConfig(e,t),this.db.unset(e,t)))}setConfig(e){oe(e)?Object.keys(e).forEach((t=>{se(t)&&(this.log.warn(`the config.${t} can't be modified`),delete e[t]),U(this._config,t,e[t]),Ot.emit(je.CONFIG_CHANGE,{configName:t,value:e[t]})})):this.log.warn("the format of config is invalid, please provide object")}unsetConfig(e,t){e&&t&&(se(e)?this.log.warn(`the config.${e} can't be unset`):T(this.getConfig(e),t))}get request(){return this.Request.request.bind(this.Request)}async upload(t){if(""===this.configPath)return this.log.error("The configuration file only supports JSON format."),[];if(void 0!==t&&0!==t.length){const{output:e}=await this.lifecycle.start(t);return e}try{const{imgPath:t,shouldKeepAfterUploading:r}=await Mt(this);if("no image"===t)throw new Error("image not found in clipboard");{this.once(qe.FAILED,(()=>{r||e.remove(t).catch((e=>{this.log.error(e)}))})),this.once("finished",(()=>{r||e.remove(t).catch((e=>{this.log.error(e)}))}));const{output:n}=await this.lifecycle.start([t]);return n}}catch(e){throw this.emit(qe.FAILED,e),e}}}export{Ke as Commander,Ye as Lifecycle,He as LifecyclePlugins,Ve as Logger,Kt as PicGo,Ce as PicGoUtils,Wt as PluginHandler,Lt as PluginLoader,xt as Request};
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcGx1Z2luSGFuZGxlci50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9jb25maWcudHMiLCIuLi9zcmMvdXRpbHMvY29tbW9uLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VwbG9hZC50cyIsIi4uL3NyYy9wbHVnaW5zL2JlZm9yZXRyYW5zZm9ybWVyL2NvbXByZXNzLnRzIiwiLi4vc3JjL3BsdWdpbnMvYmVmb3JldHJhbnNmb3JtZXIvd2F0ZXJtYXJrLnRzIiwiLi4vc3JjL3BsdWdpbnMvYmVmb3JldXBsb2FkL2J1aWxkSW5SZW5hbWUudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvc2V0dGluZy50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci91c2UudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcHJveHkudHMiLCIuLi9zcmMvdXRpbHMvaW5pdFV0aWxzLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL2luaXQudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaTE4bi50cyIsIi4uL3NyYy9saWIvTGlmZWN5Y2xlUGx1Z2lucy50cyIsIi4uL3NyYy9saWIvQ29tbWFuZGVyLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL2luZGV4LnRzIiwiLi4vc3JjL3V0aWxzL2VudW0udHMiLCIuLi9zcmMvbGliL0xvZ2dlci50cyIsIi4uL3NyYy9jb3JlL0xpZmVjeWNsZS50cyIsIi4uL3NyYy91dGlscy9jcmVhdGVDb250ZXh0LnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvc21tcy50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3RjeXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvZ2l0aHViLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvcWluaXUudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9pbWd1ci50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL2FsaXl1bi50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3VweXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvd2ViZGF2LnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvaW5kZXgudHMiLCIuLi9zcmMvcGx1Z2lucy90cmFuc2Zvcm1lci9wYXRoLnRzIiwiLi4vc3JjL3BsdWdpbnMvdHJhbnNmb3JtZXIvYmFzZTY0LnRzIiwiLi4vc3JjL2xpYi9QbHVnaW5Mb2FkZXIudHMiLCIuLi9zcmMvdXRpbHMvc3RhdGljLnRzIiwiLi4vc3JjL3V0aWxzL2dldENsaXBib2FyZEltYWdlLnRzIiwiLi4vc3JjL3V0aWxzL2V2ZW50QnVzLnRzIiwiLi4vc3JjL2xpYi9SZXF1ZXN0LnRzIiwiLi4vc3JjL3V0aWxzL2RiLnRzIiwiLi4vc3JjL2xpYi9QbHVnaW5IYW5kbGVyLnRzIiwiLi4vc3JjL2kxOG4vaW5kZXgudHMiLCIuLi9zcmMvaTE4bi96aC1DTi50cyIsIi4uL3NyYy9pMThuL3poLVRXLnRzIiwiLi4vc3JjL2kxOG4vZW4udHMiLCIuLi9zcmMvY29yZS9QaWNHby50cyIsIi4uL3NyYy9wbHVnaW5zL3RyYW5zZm9ybWVyL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElQaWNHbywgSVBsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgcGx1Z2luSGFuZGxlcjogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgLy8gY29uc3QgcGx1Z2luSGFuZGxlciA9IG5ldyBQbHVnaW5IYW5kbGVyKGN0eClcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCdpbnN0YWxsIDxwbHVnaW5zLi4uPicpXHJcbiAgICAgIC5kZXNjcmlwdGlvbignaW5zdGFsbCBwaWNnbyBwbHVnaW4nKVxyXG4gICAgICAuYWxpYXMoJ2FkZCcpXHJcbiAgICAgIC5vcHRpb24oJy1wLCAtLXByb3h5IDxwcm94eT4nLCAnQWRkIHByb3h5IGZvciBpbnN0YWxsaW5nJylcclxuICAgICAgLm9wdGlvbignLXIsIC0tcmVnaXN0cnkgPHJlZ2lzdHJ5PicsICdDaG9vc2UgYSByZWdpc3RyeSBmb3IgaW5zdGFsbGluZycpXHJcbiAgICAgIC5hY3Rpb24oKHBsdWdpbnM6IHN0cmluZ1tdLCBwcm9ncmFtOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB7IHByb3h5LCByZWdpc3RyeSB9ID0gcHJvZ3JhbVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICBwcm94eSxcclxuICAgICAgICAgIHJlZ2lzdHJ5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN0eC5wbHVnaW5IYW5kbGVyLmluc3RhbGwocGx1Z2lucywgb3B0aW9ucykuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ3VuaW5zdGFsbCA8cGx1Z2lucy4uLj4nKVxyXG4gICAgICAuYWxpYXMoJ3JtJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCd1bmluc3RhbGwgcGljZ28gcGx1Z2luJylcclxuICAgICAgLmFjdGlvbigocGx1Z2luczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICBjdHgucGx1Z2luSGFuZGxlci51bmluc3RhbGwocGx1Z2lucykuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ3VwZGF0ZSA8cGx1Z2lucy4uLj4nKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ3VwZGF0ZSBwaWNnbyBwbHVnaW4nKVxyXG4gICAgICAub3B0aW9uKCctcCwgLS1wcm94eSA8cHJveHk+JywgJ0FkZCBwcm94eSBmb3IgaW5zdGFsbGluZycpXHJcbiAgICAgIC5vcHRpb24oJy1yLCAtLXJlZ2lzdHJ5IDxyZWdpc3RyeT4nLCAnQ2hvb3NlIGEgcmVnaXN0cnkgZm9yIGluc3RhbGxpbmcnKVxyXG4gICAgICAuYWN0aW9uKChwbHVnaW5zOiBzdHJpbmdbXSwgcHJvZ3JhbTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBwcm94eSwgcmVnaXN0cnkgfSA9IHByb2dyYW1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgcHJveHksXHJcbiAgICAgICAgICByZWdpc3RyeVxyXG4gICAgICAgIH1cclxuICAgICAgICBjdHgucGx1Z2luSGFuZGxlci51cGRhdGUocGx1Z2lucywgb3B0aW9ucykuY2F0Y2goKGU6IEVycm9yKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHBsdWdpbkhhbmRsZXJcclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCBjb25maWc6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5vcHRpb24oJy1jLCAtLWNvbmZpZyA8cGF0aD4nLCAnc2V0IGNvbmZpZyBwYXRoJylcclxuICAgICAgLy8gd2lsbCBoYW5kbGUgaW4gYGJpbi9waWNnb2BcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNvbmZpZ1xyXG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCB7IGltYWdlU2l6ZSB9IGZyb20gJ2ltYWdlLXNpemUnXHJcbmltcG9ydCB7XHJcbiAgSUltZ1NpemUsXHJcbiAgSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8sXHJcbiAgSVBsdWdpbk5hbWVUeXBlLFxyXG4gIElMb2dnZXIsXHJcbiAgSVBpY0dvLFxyXG4gIElCdWlsZEluQ29tcHJlc3NPcHRpb25zLFxyXG4gIElCdWlsZEluV2F0ZXJNYXJrT3B0aW9uc1xyXG59IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBVUkwgfSBmcm9tICd1cmwnXHJcbmltcG9ydCBUZXh0VG9TVkcgZnJvbSAndGV4dC10by1zdmcnXHJcbmltcG9ydCBzaGFycCBmcm9tICdzaGFycCdcclxuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXHJcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tU3RyaW5nR2VuZXJhdG9yIChsZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgY29uc3QgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknXHJcbiAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGggfSkubWFwKCgpID0+IGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpKSkuam9pbignJylcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZUZpbGVOYW1lV2l0aFRpbWVzdGFtcCAob2xkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gYCR7TWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCl9JHtyYW5kb21TdHJpbmdHZW5lcmF0b3IoNSl9JHtwYXRoLmV4dG5hbWUob2xkTmFtZSl9YFxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVuYW1lRmlsZU5hbWVXaXRoUmFuZG9tU3RyaW5nIChvbGROYW1lOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyID0gNSk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGAke3JhbmRvbVN0cmluZ0dlbmVyYXRvcihsZW5ndGgpfSR7cGF0aC5leHRuYW1lKG9sZE5hbWUpfWBcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZUZpbGVOYW1lV2l0aEN1c3RvbVN0cmluZyAob2xkTmFtZTogc3RyaW5nLCBjdXN0b21Gb3JtYXQ6IHN0cmluZywgYWZmaXhGaWxlTmFtZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgY29udmVyc2lvbk1hcDoge1trZXk6IHN0cmluZ106ICgpID0+IHN0cmluZ30gPSB7XHJcbiAgICAne1l9JzogKCkgPT4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCksXHJcbiAgICAne3l9JzogKCkgPT4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkuc2xpY2UoMiksXHJcbiAgICAne219JzogKCkgPT4gKG5ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDF9YCA6IChuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLFxyXG4gICAgJ3tkfSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0RGF0ZSgpfWAgOiBuZXcgRGF0ZSgpLmdldERhdGUoKS50b1N0cmluZygpLFxyXG4gICAgJ3tofSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0SG91cnMoKS50b1N0cmluZygpLmxlbmd0aCA9PT0gMSA/IGAwJHtuZXcgRGF0ZSgpLmdldEhvdXJzKCl9YCA6IG5ldyBEYXRlKCkuZ2V0SG91cnMoKS50b1N0cmluZygpLFxyXG4gICAgJ3tpfSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0TWludXRlcygpfWAgOiBuZXcgRGF0ZSgpLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLFxyXG4gICAgJ3tzfSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0U2Vjb25kcygpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0U2Vjb25kcygpfWAgOiBuZXcgRGF0ZSgpLmdldFNlY29uZHMoKS50b1N0cmluZygpLFxyXG4gICAgJ3ttZDV9JzogKCkgPT4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShwYXRoLmJhc2VuYW1lKG9sZE5hbWUsIHBhdGguZXh0bmFtZShvbGROYW1lKSkpLmRpZ2VzdCgnaGV4JyksXHJcbiAgICAne21kNS0xNn0nOiAoKSA9PiBjcnlwdG8uY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKHBhdGguYmFzZW5hbWUob2xkTmFtZSwgcGF0aC5leHRuYW1lKG9sZE5hbWUpKSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCAxNiksXHJcbiAgICAne3N0ci0xMH0nOiAoKSA9PiByYW5kb21TdHJpbmdHZW5lcmF0b3IoMTApLFxyXG4gICAgJ3tzdHItMjB9JzogKCkgPT4gcmFuZG9tU3RyaW5nR2VuZXJhdG9yKDIwKSxcclxuICAgICd7ZmlsZW5hbWV9JzogKCkgPT4gYWZmaXhGaWxlTmFtZSA/IHBhdGguYmFzZW5hbWUoYWZmaXhGaWxlTmFtZSwgcGF0aC5leHRuYW1lKGFmZml4RmlsZU5hbWUpKSA6IHBhdGguYmFzZW5hbWUob2xkTmFtZSwgcGF0aC5leHRuYW1lKG9sZE5hbWUpKSxcclxuICAgICd7dXVpZH0nOiAoKSA9PiB1dWlkdjQoKS5yZXBsYWNlKC8tL2csICcnKSxcclxuICAgICd7dGltZXN0YW1wfSc6ICgpID0+IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApLnRvU3RyaW5nKClcclxuICB9XHJcbiAgaWYgKGN1c3RvbUZvcm1hdCA9PT0gdW5kZWZpbmVkIHx8ICghT2JqZWN0LmtleXMoY29udmVyc2lvbk1hcCkuc29tZShpdGVtID0+IGN1c3RvbUZvcm1hdC5pbmNsdWRlcyhpdGVtKSkgJiYgIWN1c3RvbUZvcm1hdC5pbmNsdWRlcygnbG9jYWxGb2xkZXInKSkpIHtcclxuICAgIHJldHVybiBvbGROYW1lXHJcbiAgfVxyXG4gIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShvbGROYW1lKVxyXG4gIGxldCBuZXdOYW1lID0gT2JqZWN0LmtleXMoY29udmVyc2lvbk1hcCkucmVkdWNlKChhY2MsIGN1cikgPT4ge1xyXG4gICAgcmV0dXJuIGFjYy5yZXBsYWNlKG5ldyBSZWdFeHAoY3VyLCAnZycpLCBjb252ZXJzaW9uTWFwW2N1cl0oKSlcclxuICB9LCBjdXN0b21Gb3JtYXQpICsgZXh0XHJcbiAgbmV3TmFtZSA9IG5ld05hbWUucmVwbGFjZSgveyhsb2NhbEZvbGRlcjo/KFxcZCspPyl9L2dpLCAoX3Jlc3VsdCwga2V5LCBjb3VudCkgPT4ge1xyXG4gICAgY291bnQgPSBNYXRoLm1heCgxLCBjb3VudCB8fCAwKVxyXG4gICAgY29uc3QgcGF0aHMgPSBwYXRoLmRpcm5hbWUob2xkTmFtZSkuc3BsaXQocGF0aC5zZXApXHJcbiAgICBrZXkgPSBwYXRocy5zbGljZSgwIC0gY291bnQpLnJlZHVjZSgoYSwgYikgPT4gYCR7YX0vJHtifWApXHJcbiAgICByZXR1cm4ga2V5LnJlcGxhY2UoLzovZywgJycpXHJcbiAgfSlcclxuICByZXR1cm4gbmV3TmFtZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNVcmwgPSAodXJsOiBzdHJpbmcpOiBib29sZWFuID0+ICgvXmh0dHBzPzpcXC9cXC8vKS50ZXN0KHVybClcclxuXHJcbmV4cG9ydCBjb25zdCBpc1VybEVuY29kZSA9ICh1cmw6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIHVybCA9IHVybCB8fCAnJ1xyXG4gIHRyeSB7XHJcbiAgICAvLyB0aGUgd2hvbGUgdXJsIGVuY29kZSBvciBkZWNvZGUgc2hvbGQgbm90IHVzZSBlbmNvZGVVUklDb21wb25lbnQgb3IgZGVjb2RlVVJJQ29tcG9uZW50XHJcbiAgICByZXR1cm4gdXJsICE9PSBkZWNvZGVVUkkodXJsKVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxufVxyXG5leHBvcnQgY29uc3QgaGFuZGxlVXJsRW5jb2RlID0gKHVybDogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBpZiAoIWlzVXJsRW5jb2RlKHVybCkpIHtcclxuICAgIHVybCA9IGVuY29kZVVSSSh1cmwpXHJcbiAgfVxyXG4gIHJldHVybiB1cmxcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEltYWdlU2l6ZSA9IChmaWxlOiBCdWZmZXIpOiBJSW1nU2l6ZSA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHsgd2lkdGggPSAwLCBoZWlnaHQgPSAwIH0gPSBpbWFnZVNpemUoZmlsZSlcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlYWw6IHRydWUsXHJcbiAgICAgIHdpZHRoLFxyXG4gICAgICBoZWlnaHRcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICAvLyBmYWxsYmFjayB0byAyMDAgKiAyMDBcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlYWw6IGZhbHNlLFxyXG4gICAgICB3aWR0aDogMjAwLFxyXG4gICAgICBoZWlnaHQ6IDIwMFxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEZTRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbz4gPT4ge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBleHRuYW1lOiBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLFxyXG4gICAgICBmaWxlTmFtZTogcGF0aC5iYXNlbmFtZShmaWxlUGF0aCksXHJcbiAgICAgIGJ1ZmZlcjogYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpLFxyXG4gICAgICBzdWNjZXNzOiB0cnVlXHJcbiAgICB9XHJcbiAgfSBjYXRjaCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZWFzb246IGByZWFkIGZpbGUgJHtmaWxlUGF0aH0gZXJyb3JgLFxyXG4gICAgICBzdWNjZXNzOiBmYWxzZVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFVSTEZpbGUgPSBhc3luYyAodXJsOiBzdHJpbmcsIGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbz4gPT4ge1xyXG4gIHVybCA9IGhhbmRsZVVybEVuY29kZSh1cmwpXHJcbiAgbGV0IHRpbWVvdXRJZDogTm9kZUpTLlRpbWVvdXRcclxuICBjb25zdCByZXF1ZXN0Rm4gPSBuZXcgUHJvbWlzZTxJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjdHgucmVxdWVzdCh7XHJcbiAgICAgICAgICBtZXRob2Q6ICdnZXQnLFxyXG4gICAgICAgICAgdXJsLFxyXG4gICAgICAgICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWUsXHJcbiAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcidcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgLnRoZW4oKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3AuZGF0YSBhcyBCdWZmZXJcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcclxuICAgICAgICBjb25zdCB1cmxQYXRoID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lXHJcbiAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICBidWZmZXI6IHJlcyxcclxuICAgICAgICAgIGZpbGVOYW1lOiBwYXRoLmJhc2VuYW1lKHVybFBhdGgpLFxyXG4gICAgICAgICAgZXh0bmFtZTogcGF0aC5leHRuYW1lKHVybFBhdGgpLFxyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxyXG4gICAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXHJcbiAgICAgICAgICByZWFzb246IGByZXF1ZXN0ICR7dXJsfSBlcnJvciwgJHtlcnJvcj8ubWVzc2FnZSA/PyAnJ31gXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSkoKS5jYXRjaChyZWplY3QpXHJcbiAgfSlcclxuICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPigocmVzb2x2ZSk6IHZvaWQgPT4ge1xyXG4gICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIHJlYXNvbjogYHJlcXVlc3QgJHt1cmx9IHRpbWVvdXRgXHJcbiAgICAgIH0pXHJcbiAgICB9LCAzMDAwMClcclxuICB9KVxyXG4gIHJldHVybiBQcm9taXNlLnJhY2UoW3JlcXVlc3RGbiwgdGltZW91dFByb21pc2VdKVxyXG59XHJcblxyXG4vKipcclxuICogZGV0ZWN0IHRoZSBpbnB1dCBzdHJpbmcncyB0eXBlXHJcbiAqIGZvciBleGFtcGxlXHJcbiAqIDEuIEB4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBzY29wZVxyXG4gKiAyLiBwaWNnby1wbHVnaW4teHh4IC0+IG5vcm1hbFxyXG4gKiAzLiB4eHggLT4gc2ltcGxlXHJcbiAqIDQuIG5vdCBleGlzdHMgb3IgaXMgYSBwYXRoIC0+IHVua25vd25cclxuICogQHBhcmFtIG5hbWVcclxuICovXHJcbmV4cG9ydCBjb25zdCBnZXRQbHVnaW5OYW1lVHlwZSA9IChuYW1lOiBzdHJpbmcpOiBJUGx1Z2luTmFtZVR5cGUgPT4ge1xyXG4gIGlmICgvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLnRlc3QobmFtZSkpIHtcclxuICAgIHJldHVybiAnc2NvcGUnXHJcbiAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ3BpY2dvLXBsdWdpbi0nKSkge1xyXG4gICAgcmV0dXJuICdub3JtYWwnXHJcbiAgfSBlbHNlIGlmIChpc1NpbXBsZU5hbWUobmFtZSkpIHtcclxuICAgIHJldHVybiAnc2ltcGxlJ1xyXG4gIH1cclxuICByZXR1cm4gJ3Vua25vd24nXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBkZXRlY3QgdGhlIGlucHV0IHN0cmluZyBpcyBhIHNpbXBsZSBwbHVnaW4gbmFtZSBvciBub3RcclxuICogZm9yIGV4YW1wbGVcclxuICogMS4geHh4IC0+IHRydWVcclxuICogMi4gL1Vzci94eC94eHh4L3BpY2dvLXBsdWdpbi14eHggLT4gZmFsc2VcclxuICogQHBhcmFtIG5hbWUgcGx1Z2luTmFtZU9yUGF0aFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzU2ltcGxlTmFtZSA9IChuYW1lT3JQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICBpZiAocGF0aC5pc0Fic29sdXRlKG5hbWVPclBhdGgpKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBuYW1lT3JQYXRoKVxyXG4gIGlmIChmcy5leGlzdHNTeW5jKHBsdWdpblBhdGgpKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgaWYgKG5hbWVPclBhdGguaW5jbHVkZXMoJy8nKSB8fCBuYW1lT3JQYXRoLmluY2x1ZGVzKCdcXFxcJykpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuICByZXR1cm4gdHJ1ZVxyXG59XHJcblxyXG4vKipcclxuICogc3RyZWFtbGluZSB0aGUgZnVsbCBwbHVnaW4gbmFtZSB0byBhIHNpbXBsZSBvbmVcclxuICogZm9yIGV4YW1wbGU6XHJcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHggLT4geHh4XHJcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXl5eSAtPiB5eXlcclxuICogQHBhcmFtIG5hbWUgcGx1Z2luRnVsbE5hbWVcclxuICovXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVTdHJlYW1saW5lUGx1Z2luTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGlmICgvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLnRlc3QobmFtZSkpIHtcclxuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL15AW14vXStcXC9waWNnby1wbHVnaW4tLywgJycpXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL3BpY2dvLXBsdWdpbi0vLCAnJylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBjb21wbGV0ZSBwbHVnaW4gbmFtZSB0byBmdWxsIG5hbWVcclxuICogZm9yIGV4YW1wbGU6XHJcbiAqIDEuIHh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDIuIHBpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiBAcGFyYW0gbmFtZSBwbHVnaW5TaW1wbGVOYW1lXHJcbiAqIEBwYXJhbSBzY29wZSBwbHVnaW5TY29wZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGhhbmRsZUNvbXBsZXRlUGx1Z2luTmFtZSA9IChuYW1lOiBzdHJpbmcsIHNjb3BlID0gJycpOiBzdHJpbmcgPT4ge1xyXG4gIGlmIChzY29wZSkge1xyXG4gICAgcmV0dXJuIGBAJHtzY29wZX0vcGljZ28tcGx1Z2luLSR7bmFtZX1gXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBgcGljZ28tcGx1Z2luLSR7bmFtZX1gXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogaGFuZGxlIGluc3RhbGwvdW5pbnN0YWxsL3VwZGF0ZSBwbHVnaW4gbmFtZSBvciBwYXRoXHJcbiAqIGZvciBleGFtcGxlXHJcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAyLiBAeHh4L3BpY2dvLXBsdWdpbi14eHggLT4gQHh4eC9waWNnby1wbHVnaW4teHh4XHJcbiAqIDMuIHh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDQuIC4veHh4eC9waWNnby1wbHVnaW4teHh4IC0+IC9hYnNvbHV0ZVBhdGgvLi4uL3h4eHgvcGljZ28tcGx1Z2luLXh4eFxyXG4gKiA1LiAvYWJzb2x1dGVQYXRoLy4uLi9waWNnby1wbHVnaW4teHh4IC0+IC9hYnNvbHV0ZVBhdGgvLi4uL3BpY2dvLXBsdWdpbi14eHhcclxuICogQHBhcmFtIG5hbWVPclBhdGggcGx1Z2luTmFtZSBvciBwbHVnaW5QYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0UHJvY2Vzc1BsdWdpbk5hbWUgPSAobmFtZU9yUGF0aDogc3RyaW5nLCBsb2dnZXI6IElMb2dnZXIgfCBDb25zb2xlID0gY29uc29sZSk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgcGx1Z2luTmFtZVR5cGUgPSBnZXRQbHVnaW5OYW1lVHlwZShuYW1lT3JQYXRoKVxyXG4gIHN3aXRjaCAocGx1Z2luTmFtZVR5cGUpIHtcclxuICAgIGNhc2UgJ25vcm1hbCc6XHJcbiAgICBjYXNlICdzY29wZSc6XHJcbiAgICAgIHJldHVybiBuYW1lT3JQYXRoXHJcbiAgICBjYXNlICdzaW1wbGUnOlxyXG4gICAgICByZXR1cm4gaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lKG5hbWVPclBhdGgpXHJcbiAgICBkZWZhdWx0OiB7XHJcbiAgICAgIC8vIG5vdywgdGhlIHBsdWdpbk5hbWVUeXBlIGlzIHVua25vdyBoZXJlXHJcbiAgICAgIC8vIDEuIGNoZWNrIGlmIGlzIGFuIGFic29sdXRlIHBhdGhcclxuICAgICAgbGV0IHBsdWdpblBhdGggPSBuYW1lT3JQYXRoXHJcbiAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUobmFtZU9yUGF0aCkgJiYgZnMuZXhpc3RzU3luYyhuYW1lT3JQYXRoKSkge1xyXG4gICAgICAgIHJldHVybiBoYW5kbGVVbml4U3R5bGVQYXRoKHBsdWdpblBhdGgpXHJcbiAgICAgIH1cclxuICAgICAgLy8gMi4gY2hlY2sgaWYgaXMgYSByZWxhdGl2ZSBwYXRoXHJcbiAgICAgIHBsdWdpblBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgbmFtZU9yUGF0aClcclxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGx1Z2luUGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gaGFuZGxlVW5peFN0eWxlUGF0aChwbHVnaW5QYXRoKVxyXG4gICAgICB9XHJcbiAgICAgIC8vIDMuIGludmFsaWQgbmFtZU9yUGF0aFxyXG4gICAgICBsb2dnZXIud2FybihgQ2FuJ3QgZmluZCBwbHVnaW4gJHtuYW1lT3JQYXRofWApXHJcbiAgICAgIHJldHVybiAnJ1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIGdldCB0aGUgbm9ybWFsIHBsdWdpbiBuYW1lXHJcbiAqIGZvciBleGFtcGxlOlxyXG4gKiAxLiBwaWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogMi4gQHh4eC9waWNnby1wbHVnaW4teHh4IC0+IEB4eHgvcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAzLiAuL3h4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDQuIC9hYnNvbHV0ZVBhdGgvLi4uL3BpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiA1LiBhbiBleGNlcHRpb246IFtwYWNrYWdlLmpzb24ncyBuYW1lXSAhPT0gW2ZvbGRlciBuYW1lXVxyXG4gKiB0aGVuIHVzZSBbcGFja2FnZS5qc29uJ3MgbmFtZV0sIHVzdWFsbHkgbWF0Y2ggdGhlIHNjb3BlIHBhY2thZ2UuXHJcbiAqIDYuIGlmIHBsdWdpbiBuYW1lIGhhcyB2ZXJzaW9uOiBwaWNnby1wbHVnaW4teHh4QHgueC54IHRoZW4gcmVtb3ZlIHRoZSB2ZXJzaW9uXHJcbiAqIEBwYXJhbSBuYW1lT3JQYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0Tm9ybWFsUGx1Z2luTmFtZSA9IChuYW1lT3JQYXRoOiBzdHJpbmcsIGxvZ2dlcjogSUxvZ2dlciB8IENvbnNvbGUgPSBjb25zb2xlKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwbHVnaW5OYW1lVHlwZSA9IGdldFBsdWdpbk5hbWVUeXBlKG5hbWVPclBhdGgpXHJcbiAgc3dpdGNoIChwbHVnaW5OYW1lVHlwZSkge1xyXG4gICAgY2FzZSAnbm9ybWFsJzpcclxuICAgICAgcmV0dXJuIHJlbW92ZVBsdWdpblZlcnNpb24obmFtZU9yUGF0aClcclxuICAgIGNhc2UgJ3Njb3BlJzpcclxuICAgICAgcmV0dXJuIHJlbW92ZVBsdWdpblZlcnNpb24obmFtZU9yUGF0aCwgdHJ1ZSlcclxuICAgIGNhc2UgJ3NpbXBsZSc6XHJcbiAgICAgIHJldHVybiByZW1vdmVQbHVnaW5WZXJzaW9uKGhhbmRsZUNvbXBsZXRlUGx1Z2luTmFtZShuYW1lT3JQYXRoKSlcclxuICAgIGRlZmF1bHQ6IHtcclxuICAgICAgLy8gbm93LCB0aGUgbmFtZU9yUGF0aCBtdXN0IGJlIHBhdGhcclxuICAgICAgLy8gdGhlIG5hbWVPclBhdGggaGVyZSB3aWxsIGJlIGVuc3VyZWQgd2l0aCB1bml4IHN0eWxlXHJcbiAgICAgIC8vIHdlIG5lZWQgdG8gZmluZCB0aGUgcGFja2FnZS5qc29uJ3MgbmFtZSBjYXVzZSBucG0gdXNpbmcgdGhlIG5hbWUgaW4gcGFja2FnZS5qc29uJ3MgbmFtZSBmaWxlZFxyXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobmFtZU9yUGF0aCkpIHtcclxuICAgICAgICBsb2dnZXIud2FybihgQ2FuJ3QgZmluZCBwbHVnaW46ICR7bmFtZU9yUGF0aH1gKVxyXG4gICAgICAgIHJldHVybiAnJ1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHBhY2thZ2VKU09OUGF0aCA9IHBhdGgucG9zaXguam9pbihuYW1lT3JQYXRoLCAncGFja2FnZS5qc29uJylcclxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKU09OUGF0aCkpIHtcclxuICAgICAgICBsb2dnZXIud2FybihgQ2FuJ3QgZmluZCBwbHVnaW46ICR7bmFtZU9yUGF0aH1gKVxyXG4gICAgICAgIHJldHVybiAnJ1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHBrZyA9IGZzLnJlYWRKU09OU3luYyhwYWNrYWdlSlNPTlBhdGgpIHx8IHt9XHJcbiAgICAgICAgaWYgKCFwa2cubmFtZT8uaW5jbHVkZXMoJ3BpY2dvLXBsdWdpbi0nKSkge1xyXG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFRoZSBwbHVnaW4gcGFja2FnZS5qc29uJ3MgbmFtZSBmaWxlZCBpcyAke3BrZy5uYW1lIGFzIHN0cmluZyB8fCAnZW1wdHknfSwgbmVlZCB0byBpbmNsdWRlIHRoZSBwcmVmaXg6IHBpY2dvLXBsdWdpbi1gKVxyXG4gICAgICAgICAgcmV0dXJuICcnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwa2cubmFtZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogaGFuZGxlIHRyYW5zZm9ybSB0aGUgcGF0aCB0byB1bml4IHN0eWxlXHJcbiAqIGZvciBleGFtcGxlXHJcbiAqIDEuIEM6XFxcXHh4eFxcXFx4eHggLT4gQzoveHh4L3h4eFxyXG4gKiAyLiAveHh4L3h4eCAtPiAveHh4L3h4eFxyXG4gKiBAcGFyYW0gcGF0aFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGhhbmRsZVVuaXhTdHlsZVBhdGggPSAocGF0aFN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwYXRoQXJyID0gcGF0aFN0ci5zcGxpdChwYXRoLnNlcClcclxuICByZXR1cm4gcGF0aEFyci5qb2luKCcvJylcclxufVxyXG5cclxuLyoqXHJcbiAqIHJlbW92ZSBwbHVnaW4gdmVyc2lvbiB3aGVuIHJlZ2lzdGVyIHBsdWdpbiBuYW1lXHJcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHhAMS4wLjAgLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAyLiBAeHh4L3BpY2dvLXBsdWdpbi14eHhAMS4wLjAgLT4gQHh4eC9waWNnby1wbHVnaW4teHh4XHJcbiAqIEBwYXJhbSBuYW1lT3JQYXRoXHJcbiAqIEBwYXJhbSBzY29wZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbW92ZVBsdWdpblZlcnNpb24gPSAobmFtZU9yUGF0aDogc3RyaW5nLCBzY29wZTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nID0+IHtcclxuICBpZiAoIW5hbWVPclBhdGguaW5jbHVkZXMoJ0AnKSkge1xyXG4gICAgcmV0dXJuIG5hbWVPclBhdGhcclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IHJlZyA9IC8oLitcXC8pPyhwaWNnby1wbHVnaW4tXFx3KykoQC4rKSovXHJcbiAgICAvLyBpZiBpcyBhIHNjb3BlIHBrZ1xyXG4gICAgaWYgKHNjb3BlKSB7XHJcbiAgICAgIHJlZyA9IC8oLitcXC8pPyheQFteL10rXFwvcGljZ28tcGx1Z2luLVxcdyspKEAuKykqL1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWF0Y2hBcnIgPSBuYW1lT3JQYXRoLm1hdGNoKHJlZylcclxuICAgIGlmICghbWF0Y2hBcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdjYW4gbm90IHJlbW92ZSBwbHVnaW4gdmVyc2lvbicpXHJcbiAgICAgIHJldHVybiBuYW1lT3JQYXRoXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbWF0Y2hBcnJbMl1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0aGUgY29uZmlnIGJsYWNrIGl0ZW0gbGlzdCB3aGljaCB3b24ndCBiZSBzZXR0ZWRcclxuICogb25seSBjYW4gYmUgZ290XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29uZmlnQmxhY2tMaXN0ID0gW11cclxuXHJcbi8qKlxyXG4gKiBjaGVjayBzb21lIGNvbmZpZyBrZXkgaXMgaW4gYmxhY2tMaXN0XHJcbiAqIEBwYXJhbSBrZXlcclxuICovXHJcbmV4cG9ydCBjb25zdCBpc0NvbmZpZ0tleUluQmxhY2tMaXN0ID0gKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIGNvbmZpZ0JsYWNrTGlzdC5zb21lKGJsYWNrSXRlbSA9PiBrZXkuc3RhcnRzV2l0aChibGFja0l0ZW0pKVxyXG59XHJcblxyXG4vKipcclxuICogY2hlY2sgdGhlIGlucHV0IGNvbmZpZyBpcyB2YWxpZFxyXG4gKiBjb25maWcgbXVzdCBiZSBvYmplY3Qgc3VjaCBhcyB7IHh4eDogJ3h4eCcgfVxyXG4gKiAmJiBjYW4ndCBiZSBhcnJheVxyXG4gKiBAcGFyYW0gY29uZmlnXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXNJbnB1dENvbmZpZ1ZhbGlkID0gKGNvbmZpZzogYW55KTogYm9vbGVhbiA9PiB7XHJcbiAgaWYgKFxyXG4gICAgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiZcclxuICAgICFBcnJheS5pc0FycmF5KGNvbmZpZykgJiZcclxuICAgIE9iamVjdC5rZXlzKGNvbmZpZykubGVuZ3RoID4gMFxyXG4gICkge1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcbiAgcmV0dXJuIGZhbHNlXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzYWZlUGFyc2U8VD4gKHN0cjogc3RyaW5nKTogVCB8IHN0cmluZyB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHN0cilcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgcmV0dXJuIHN0clxyXG4gIH1cclxufVxyXG5cclxuLy8gaG9sZC4uLlxyXG4vLyBleHBvcnQgY29uc3QgY29uZmlnV2hpdGVMaXN0OiBSZWdFeHBbXSA9IFtcclxuLy8gICAvXnBpY0JlZC8sXHJcbi8vICAgL15waWNnb1BsdWdpbnMvLFxyXG4vLyAgIC9eQFteL10rXFwvcGljZ28tcGx1Z2luLS8sXHJcbi8vICAgL2RlYnVnLyxcclxuLy8gICAvc2lsZW50LyxcclxuLy8gICAvY29uZmlnUGF0aC8sXHJcbi8vICAgL15zZXR0aW5ncy8sXHJcbi8vIF1cclxuXHJcbi8vIGV4cG9ydCBjb25zdCBpc0NvbmZpZ0tleUluV2hpdGVMaXN0ID0gKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbi8vICAgcmV0dXJuIGNvbmZpZ1doaXRlTGlzdC5zb21lKHdoaXRlSXRlbSA9PiB3aGl0ZUl0ZW0udGVzdChrZXkpKVxyXG4vLyB9XHJcblxyXG5leHBvcnQgY29uc3QgZm9yY2VOdW1iZXIgPSAobnVtOiBzdHJpbmcgfCBudW1iZXIgPSAwKTogbnVtYmVyID0+IHtcclxuICByZXR1cm4gaXNOYU4oTnVtYmVyKG51bSkpID8gMCA6IE51bWJlcihudW0pXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc0RldiA9ICgpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCdcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzUHJvZCA9ICgpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJ1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiB0ZXh0MlNWRyAoXHJcbiAgZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoOiBzdHJpbmcsXHJcbiAgdGV4dD86IHN0cmluZyxcclxuICBjb2xvcj86IHN0cmluZyxcclxuICBmb250RmFtaWx5Pzogc3RyaW5nXHJcbik6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgdGV4dCA9ICF0ZXh0ID8gJ+a1i+ivlScgOiB0ZXh0XHJcbiAgZm9udEZhbWlseSA9ICFmb250RmFtaWx5ID8gZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoIDogZm9udEZhbWlseVxyXG4gIGNvbG9yID0gIWNvbG9yID8gJ3JnYmEoMjA0LCAyMDQsIDIwNCwgMC40NSknIDogY29sb3JcclxuICBjb25zdCB0ZXh0MlNWRyA9IFRleHRUb1NWRy5sb2FkU3luYyhmb250RmFtaWx5KVxyXG4gIGNvbnN0IG9wdGlvbnM6IFRleHRUb1NWRy5HZW5lcmF0aW9uT3B0aW9ucyA9IHtcclxuICAgIGFuY2hvcjogJ3RvcCcsXHJcbiAgICBhdHRyaWJ1dGVzOiB7XHJcbiAgICAgIGZpbGw6IGNvbG9yXHJcbiAgICB9XHJcbiAgfVxyXG4gIGNvbnN0IHRleHRTVkcgPSB0ZXh0MlNWRy5nZXRTVkcodGV4dCwgb3B0aW9ucylcclxuICBjb25zdCBzdmcgPSBCdWZmZXIuZnJvbSh0ZXh0U1ZHKVxyXG4gIHJldHVybiBzdmdcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdFdhdGVybWFya0ltYWdlUGF0aCA9IGAke19fZGlybmFtZX0vYXNzZXRzL3BpY2xpc3QucG5nYFxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEFkZFdhdGVybWFyayAoXHJcbiAgaW1nOiBCdWZmZXIsXHJcbiAgd2F0ZXJtYXJrVHlwZTogJ3RleHQnIHwgJ2ltYWdlJyxcclxuICBkZWZhdWx0V2F0ZXJtYXJrRm9udFBhdGg6IHN0cmluZyxcclxuICBpc0Z1bGxTY3JlZW5XYXRlcm1hcms/OiBib29sZWFuLFxyXG4gIHdhdGVybWFya0RlZ3JlZT86IG51bWJlcixcclxuICB0ZXh0Pzogc3RyaW5nLFxyXG4gIHdhdGVybWFya0ZvbnRQYXRoPzogc3RyaW5nLFxyXG4gIHdhdGVybWFya1NjYWxlUmF0aW8/OiBudW1iZXIsXHJcbiAgd2F0ZXJtYXJrQ29sb3I/OiBzdHJpbmcsXHJcbiAgd2F0ZXJtYXJrSW1hZ2VQYXRoPzogc3RyaW5nLFxyXG4gIHBvc2l0aW9uPzogc2hhcnAuR3Jhdml0eVxyXG4pOiBQcm9taXNlPEJ1ZmZlcj4ge1xyXG4gIHdhdGVybWFya1NjYWxlUmF0aW8gPSAhd2F0ZXJtYXJrU2NhbGVSYXRpbyB8fCB3YXRlcm1hcmtTY2FsZVJhdGlvIDwgMCB8fCB3YXRlcm1hcmtTY2FsZVJhdGlvID4gMSA/IDAuMTUgOiB3YXRlcm1hcmtTY2FsZVJhdGlvXHJcbiAgY29uc3QgaW1hZ2UgPSBzaGFycChpbWcpXHJcbiAgY29uc3QgeyB3aWR0aDogaW1nV2lkdGggPSAyMDAgfSA9IGF3YWl0IGltYWdlLm1ldGFkYXRhKClcclxuICBjb25zdCB3YXRlcm1hcmsgPSBhd2FpdCBjcmVhdGVXYXRlcm1hcmsoXHJcbiAgICB3YXRlcm1hcmtUeXBlLFxyXG4gICAgZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoLFxyXG4gICAgdGV4dCxcclxuICAgIHdhdGVybWFya0ZvbnRQYXRoLFxyXG4gICAgd2F0ZXJtYXJrU2NhbGVSYXRpbyxcclxuICAgIHdhdGVybWFya0NvbG9yLFxyXG4gICAgd2F0ZXJtYXJrSW1hZ2VQYXRoLFxyXG4gICAgaW1nV2lkdGgsXHJcbiAgICB3YXRlcm1hcmtEZWdyZWVcclxuICApXHJcbiAgY29uc3QgY29tcG9zaXRlZCA9IGF3YWl0IGltYWdlXHJcbiAgICAuY29tcG9zaXRlKFtcclxuICAgICAge1xyXG4gICAgICAgIGlucHV0OiB3YXRlcm1hcmssXHJcbiAgICAgICAgZ3Jhdml0eTogcG9zaXRpb24gfHwgJ3NvdXRoZWFzdCcsXHJcbiAgICAgICAgdGlsZTogaXNGdWxsU2NyZWVuV2F0ZXJtYXJrXHJcbiAgICAgIH1cclxuICAgIF0pXHJcbiAgICAudG9CdWZmZXIoKVxyXG4gIHJldHVybiBjb21wb3NpdGVkXHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdhdGVybWFyayAoXHJcbiAgd2F0ZXJtYXJrVHlwZTogJ3RleHQnIHwgJ2ltYWdlJyxcclxuICBkZWZhdWx0V2F0ZXJtYXJrRm9udFBhdGg6IHN0cmluZyxcclxuICB0ZXh0Pzogc3RyaW5nLFxyXG4gIHdhdGVybWFya0ZvbnRQYXRoPzogc3RyaW5nLFxyXG4gIHdhdGVybWFya1NjYWxlUmF0aW8/OiBudW1iZXIsXHJcbiAgd2F0ZXJtYXJrQ29sb3I/OiBzdHJpbmcsXHJcbiAgd2F0ZXJtYXJrSW1hZ2VQYXRoPzogc3RyaW5nLFxyXG4gIGltZ1dpZHRoOiBudW1iZXIgPSAyMDAsXHJcbiAgd2F0ZXJtYXJrRGVncmVlOiBudW1iZXIgPSAwXHJcbik6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgbGV0IHdhdGVybWFyazogYW55XHJcbiAgaWYgKHdhdGVybWFya1R5cGUgPT09ICdpbWFnZScpIHtcclxuICAgIHdhdGVybWFya0ltYWdlUGF0aCA9IHdhdGVybWFya0ltYWdlUGF0aCB8fCBkZWZhdWx0V2F0ZXJtYXJrSW1hZ2VQYXRoXHJcbiAgICB3YXRlcm1hcmsgPSBhd2FpdCBzaGFycCh3YXRlcm1hcmtJbWFnZVBhdGgpLnRvQnVmZmVyKClcclxuICB9IGVsc2Uge1xyXG4gICAgd2F0ZXJtYXJrID0gYXdhaXQgdGV4dDJTVkcoXHJcbiAgICAgIGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aCxcclxuICAgICAgdGV4dCxcclxuICAgICAgd2F0ZXJtYXJrQ29sb3IsXHJcbiAgICAgIHdhdGVybWFya0ZvbnRQYXRoIHx8IGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aFxyXG4gICAgKVxyXG4gIH1cclxuICBjb25zdCB7IHdpZHRoOiB3YXRlcm1hcmtXaWR0aCwgaGVpZ2h0OiB3YXRlcm1hcmtIZWlnaHQgfSA9IGF3YWl0IGdldFNpemUoXHJcbiAgICB3YXRlcm1hcmtcclxuICApXHJcbiAgY29uc3Qgd2F0ZXJtYXJrUmVzaXplV2lkdGggPSBNYXRoLmZsb29yKGltZ1dpZHRoICogZm9yY2VOdW1iZXIod2F0ZXJtYXJrU2NhbGVSYXRpbykpXHJcbiAgY29uc3Qgd2F0ZXJtYXJrUmVzaXplSGVpZ2h0ID0gTWF0aC5mbG9vcihcclxuICAgICh3YXRlcm1hcmtSZXNpemVXaWR0aCAqIHdhdGVybWFya0hlaWdodCkgLyB3YXRlcm1hcmtXaWR0aFxyXG4gIClcclxuICByZXR1cm4gYXdhaXQgc2hhcnAod2F0ZXJtYXJrKVxyXG4gICAgLnJlc2l6ZSh3YXRlcm1hcmtSZXNpemVXaWR0aCwgd2F0ZXJtYXJrUmVzaXplSGVpZ2h0LCB7XHJcbiAgICAgIGZpdDogJ2luc2lkZSdcclxuICAgIH0pXHJcbiAgICAucm90YXRlKHdhdGVybWFya0RlZ3JlZSwgeyBiYWNrZ3JvdW5kOiB7IHI6IDI1NSwgZzogMjU1LCBiOiAyNTUsIGFscGhhOiAwIH0gfSlcclxuICAgIC50b0J1ZmZlcigpXHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldFNpemUgKGltYWdlOiBCdWZmZXIpOiBQcm9taXNlPHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfT4ge1xyXG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYXdhaXQgc2hhcnAoaW1hZ2UpLm1ldGFkYXRhKClcclxuICByZXR1cm4geyB3aWR0aDogd2lkdGggfHwgMjAwLCBoZWlnaHQ6IGhlaWdodCB8fCAyMDAgfVxyXG59XHJcblxyXG5jb25zdCB2YWxpZFBhcmFtID0gKC4uLnBhcmFtczogYW55W10pOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gcGFyYW1zLmV2ZXJ5KHBhcmFtID0+IHtcclxuICAgIGlmIChwYXJhbSA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIHBhcmFtICE9PSAnJ1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgcmV0dXJuIHBhcmFtID4gMFxyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtKS5sZW5ndGggPiAwXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IGF2YWlsYWJsZUNvbnZlcnRGb3JtYXRMaXN0ID0gW1xyXG4gICdhdmlmJyxcclxuICAnZHonLFxyXG4gICdmaXRzJyxcclxuICAnZ2lmJyxcclxuICAnaGVpZicsXHJcbiAgJ2lucHV0JyxcclxuICAnanBlZycsXHJcbiAgJ2pwZycsXHJcbiAgJ2pwMicsXHJcbiAgJ2p4bCcsXHJcbiAgJ21hZ2ljaycsXHJcbiAgJ29wZW5zbGlkZScsXHJcbiAgJ3BkZicsXHJcbiAgJ3BuZycsXHJcbiAgJ3BwbScsXHJcbiAgJ3JhdycsXHJcbiAgJ3N2ZycsXHJcbiAgJ3RpZmYnLFxyXG4gICd0aWYnLFxyXG4gICd2JyxcclxuICAnd2VicCdcclxuXVxyXG5cclxuY29uc3QgdmFsaWRPdXRwdXRGb3JtYXQgPSAoZm9ybWF0OiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gYXZhaWxhYmxlQ29udmVydEZvcm1hdExpc3QuaW5jbHVkZXMoZm9ybWF0KVxyXG59XHJcblxyXG5jb25zdCBpbWFnZUV4dExpc3QgPSBbJ2pwZycsICdqcGVnJywgJ3BuZycsICdnaWYnLCAnd2VicCcsICdibXAnLCAndGlmZicsICd0aWYnLCAnc3ZnJywgJ2ljbycsICdhdmlmJywgJ2hlaWYnLCAnaGVpYyddXHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1hZ2VBZGRXYXRlck1hcmsgKGltZzogQnVmZmVyLCBvcHRpb25zOiBJQnVpbGRJbldhdGVyTWFya09wdGlvbnMsIGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICB0cnkge1xyXG4gICAgbGV0IGltYWdlOiBzaGFycC5TaGFycCA9IHNoYXJwKGltZylcclxuICAgIGlmICh2YWxpZFBhcmFtKG9wdGlvbnMud2F0ZXJtYXJrVGV4dCkpIHtcclxuICAgICAgaW1hZ2UgPSBzaGFycChhd2FpdCBBZGRXYXRlcm1hcmsoXHJcbiAgICAgICAgaW1nLFxyXG4gICAgICAgIG9wdGlvbnMud2F0ZXJtYXJrVHlwZSB8fCAndGV4dCcsXHJcbiAgICAgICAgZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoLFxyXG4gICAgICAgIG9wdGlvbnMuaXNGdWxsU2NyZWVuV2F0ZXJtYXJrLFxyXG4gICAgICAgIGZvcmNlTnVtYmVyKG9wdGlvbnMud2F0ZXJtYXJrRGVncmVlKSxcclxuICAgICAgICBvcHRpb25zLndhdGVybWFya1RleHQsXHJcbiAgICAgICAgb3B0aW9ucy53YXRlcm1hcmtGb250UGF0aCxcclxuICAgICAgICBmb3JjZU51bWJlcihvcHRpb25zLndhdGVybWFya1NjYWxlUmF0aW8pLFxyXG4gICAgICAgIG9wdGlvbnMud2F0ZXJtYXJrQ29sb3IsXHJcbiAgICAgICAgb3B0aW9ucy53YXRlcm1hcmtJbWFnZVBhdGgsXHJcbiAgICAgICAgb3B0aW9ucy53YXRlcm1hcmtQb3NpdGlvblxyXG4gICAgICApKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IGltYWdlLnRvQnVmZmVyKClcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5sb2coZXJyb3IpXHJcbiAgICByZXR1cm4gaW1nXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtYXRPcHRpb25zIChvcHRpb25zOiBJQnVpbGRJbkNvbXByZXNzT3B0aW9ucyk6IElCdWlsZEluQ29tcHJlc3NPcHRpb25zIHtcclxuICByZXR1cm4ge1xyXG4gICAgcXVhbGl0eTogZm9yY2VOdW1iZXIob3B0aW9ucy5xdWFsaXR5KSxcclxuICAgIGlzQ29udmVydDogb3B0aW9ucy5pc0NvbnZlcnQgfHwgZmFsc2UsXHJcbiAgICBjb252ZXJ0Rm9ybWF0OiBvcHRpb25zLmNvbnZlcnRGb3JtYXQgfHwgJ2pwZycsXHJcbiAgICBpc1JlU2l6ZTogb3B0aW9ucy5pc1JlU2l6ZSB8fCBmYWxzZSxcclxuICAgIHJlU2l6ZUhlaWdodDogZm9yY2VOdW1iZXIob3B0aW9ucy5yZVNpemVIZWlnaHQpLFxyXG4gICAgcmVTaXplV2lkdGg6IGZvcmNlTnVtYmVyKG9wdGlvbnMucmVTaXplV2lkdGgpLFxyXG4gICAgaXNSZVNpemVCeVBlcmNlbnQ6IG9wdGlvbnMuaXNSZVNpemVCeVBlcmNlbnQgfHwgZmFsc2UsXHJcbiAgICByZVNpemVQZXJjZW50OiBmb3JjZU51bWJlcihvcHRpb25zLnJlU2l6ZVBlcmNlbnQpLFxyXG4gICAgaXNSb3RhdGU6IG9wdGlvbnMuaXNSb3RhdGUgfHwgZmFsc2UsXHJcbiAgICByb3RhdGVEZWdyZWU6IGZvcmNlTnVtYmVyKG9wdGlvbnMucm90YXRlRGVncmVlKVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltYWdlUHJvY2VzcyAoaW1nOiBCdWZmZXIsIG9wdGlvbnM6IElCdWlsZEluQ29tcHJlc3NPcHRpb25zLCByYXdGb3JtYXQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgb3B0aW9ucyA9IGZvcm1hdE9wdGlvbnMob3B0aW9ucylcclxuICB0cnkge1xyXG4gICAgcmF3Rm9ybWF0ID0gcmF3Rm9ybWF0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICcnKVxyXG4gICAgaWYgKCFpbWFnZUV4dExpc3QuaW5jbHVkZXMocmF3Rm9ybWF0KSkge1xyXG4gICAgICByZXR1cm4gaW1nXHJcbiAgICB9XHJcbiAgICBsZXQgaW1hZ2U6IHNoYXJwLlNoYXJwID0gc2hhcnAoaW1nKVxyXG4gICAgbGV0IHF1YWxpdHkgPSAxMDBcclxuICAgIGlmICh2YWxpZFBhcmFtKG9wdGlvbnMucXVhbGl0eSkgJiYgb3B0aW9ucy5xdWFsaXR5ISA8IDEwMCkge1xyXG4gICAgICBxdWFsaXR5ID0gb3B0aW9ucy5xdWFsaXR5IVxyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMuaXNSZVNpemVCeVBlcmNlbnQpIHtcclxuICAgICAgaWYgKHZhbGlkUGFyYW0ob3B0aW9ucy5yZVNpemVQZXJjZW50KSkge1xyXG4gICAgICAgIGNvbnN0IGltYWdlV2lkdGggPSBhd2FpdCBpbWFnZS5tZXRhZGF0YSgpLnRoZW4obWV0YWRhdGEgPT4gbWV0YWRhdGEud2lkdGgpXHJcbiAgICAgICAgY29uc3QgaW1hZ2VIZWlnaHQgPSBhd2FpdCBpbWFnZS5tZXRhZGF0YSgpLnRoZW4obWV0YWRhdGEgPT4gbWV0YWRhdGEuaGVpZ2h0KVxyXG4gICAgICAgIGlmIChpbWFnZVdpZHRoICYmIGltYWdlSGVpZ2h0KSB7XHJcbiAgICAgICAgICBpbWFnZSA9IGltYWdlLnJlc2l6ZShcclxuICAgICAgICAgICAgTWF0aC5yb3VuZChpbWFnZVdpZHRoICogb3B0aW9ucy5yZVNpemVQZXJjZW50ISAvIDEwMCksXHJcbiAgICAgICAgICAgIE1hdGgucm91bmQoaW1hZ2VIZWlnaHQgKiBvcHRpb25zLnJlU2l6ZVBlcmNlbnQhIC8gMTAwKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGZpdDogJ2luc2lkZSdcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pc1JlU2l6ZSkge1xyXG4gICAgICBpZiAodmFsaWRQYXJhbShvcHRpb25zLnJlU2l6ZUhlaWdodCwgb3B0aW9ucy5yZVNpemVXaWR0aCkpIHtcclxuICAgICAgICBpbWFnZSA9IGltYWdlLnJlc2l6ZShcclxuICAgICAgICAgIG9wdGlvbnMucmVTaXplV2lkdGgsXHJcbiAgICAgICAgICBvcHRpb25zLnJlU2l6ZUhlaWdodCxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZml0OiAnaW5zaWRlJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMuaXNSb3RhdGUgJiYgb3B0aW9ucy5yb3RhdGVEZWdyZWUpIHtcclxuICAgICAgaW1hZ2UgPSBpbWFnZS5yb3RhdGUob3B0aW9ucy5yb3RhdGVEZWdyZWUsIHsgYmFja2dyb3VuZDogeyByOiAyNTUsIGc6IDI1NSwgYjogMjU1LCBhbHBoYTogMCB9IH0pXHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5pc0NvbnZlcnQpIHtcclxuICAgICAgY29uc3QgbmV3Rm9ybWF0ID0gb3B0aW9ucy5jb252ZXJ0Rm9ybWF0IHx8ICdqcGcnXHJcbiAgICAgIGltYWdlID0gaW1hZ2UudG9Gb3JtYXQobmV3Rm9ybWF0LCB7XHJcbiAgICAgICAgcXVhbGl0eVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHJhd0Zvcm1hdCAmJiB2YWxpZE91dHB1dEZvcm1hdChyYXdGb3JtYXQpKSB7XHJcbiAgICAgICAgaW1hZ2UgPSBpbWFnZS50b0Zvcm1hdChyYXdGb3JtYXQgYXMgYW55LCB7XHJcbiAgICAgICAgICBxdWFsaXR5XHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbWFnZSA9IGltYWdlLnRvRm9ybWF0KCdqcGcnLCB7XHJcbiAgICAgICAgICBxdWFsaXR5XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IGltYWdlLnRvQnVmZmVyKClcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5sb2coZXJyb3IpXHJcbiAgICByZXR1cm4gaW1nXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBpbWFnZUZvcm1hdExpc3QgPSBbJ2pwZycsICdqcGVnJywgJ3BuZycsICdnaWYnLCAnd2VicCcsICdibXAnLCAndGlmZicsICd0aWYnLCAnc3ZnJywgJ2ljbycsICdhdmlmJywgJ2hlaWYnLCAnaGVpYyddXHJcblxyXG5leHBvcnQgY29uc3QgbmVlZEFkZFdhdGVybWFyayA9ICh3YXRlcm1hcmtPcHRpb25zOiBJQnVpbGRJbldhdGVyTWFya09wdGlvbnMgfCB1bmRlZmluZWQsIGZpbGVFeHQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIGZpbGVFeHQgPSBmaWxlRXh0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICcnKVxyXG4gIHJldHVybiAhIXdhdGVybWFya09wdGlvbnMgJiYgISF3YXRlcm1hcmtPcHRpb25zLmlzQWRkV2F0ZXJtYXJrICYmIGltYWdlRm9ybWF0TGlzdC5pbmNsdWRlcyhmaWxlRXh0KVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbmVlZENvbXByZXNzID0gKGNvbXByZXNzT3B0aW9uczogSUJ1aWxkSW5Db21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQsIGZpbGVFeHQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIGZpbGVFeHQgPSBmaWxlRXh0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICcnKVxyXG4gIGlmICghaW1hZ2VGb3JtYXRMaXN0LmluY2x1ZGVzKGZpbGVFeHQpKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgaWYgKGNvbXByZXNzT3B0aW9ucykge1xyXG4gICAgY29tcHJlc3NPcHRpb25zID0gZm9ybWF0T3B0aW9ucyhjb21wcmVzc09wdGlvbnMpXHJcbiAgICBpZiAodmFsaWRQYXJhbShjb21wcmVzc09wdGlvbnMucXVhbGl0eSkgJiYgY29tcHJlc3NPcHRpb25zLnF1YWxpdHkhIDwgMTAwKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICBpZiAoY29tcHJlc3NPcHRpb25zLmlzUmVTaXplQnlQZXJjZW50ICYmIHZhbGlkUGFyYW0oY29tcHJlc3NPcHRpb25zLnJlU2l6ZVBlcmNlbnQpKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICBpZiAoY29tcHJlc3NPcHRpb25zLmlzUmVTaXplICYmIHZhbGlkUGFyYW0oY29tcHJlc3NPcHRpb25zLnJlU2l6ZUhlaWdodCwgY29tcHJlc3NPcHRpb25zLnJlU2l6ZVdpZHRoKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYgKGNvbXByZXNzT3B0aW9ucy5pc1JvdGF0ZSAmJiBjb21wcmVzc09wdGlvbnMucm90YXRlRGVncmVlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICBpZiAoY29tcHJlc3NPcHRpb25zLmlzQ29udmVydCkge1xyXG4gICAgICBjb25zdCBuZXdGb3JtYXQgPSBjb21wcmVzc09wdGlvbnMuY29udmVydEZvcm1hdCB8fCAnanBnJ1xyXG4gICAgICByZXR1cm4gZmlsZUV4dCAhPT0gbmV3Rm9ybWF0XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgcmV0dXJuIGZhbHNlXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCByZW1vdmVFeGlmID0gYXN5bmMgKGltZzogQnVmZmVyLCBmaWxlRXh0OiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4gPT4ge1xyXG4gIGZpbGVFeHQgPSBmaWxlRXh0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICcnKVxyXG4gIGlmICghaW1hZ2VGb3JtYXRMaXN0LmluY2x1ZGVzKGZpbGVFeHQpKSB7XHJcbiAgICByZXR1cm4gaW1nXHJcbiAgfVxyXG4gIHJldHVybiBhd2FpdCBzaGFycChpbWcpLnRvQnVmZmVyKClcclxufVxyXG4iLCJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCB7IGlzVXJsIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgeyBJUGljR28sIElQbHVnaW4gfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmNvbnN0IHVwbG9hZDogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ3VwbG9hZCcpXHJcbiAgICAgIC5kZXNjcmlwdGlvbigndXBsb2FkLCBnbyBnbyBnbycpXHJcbiAgICAgIC5hcmd1bWVudHMoJ1tpbnB1dC4uLl0nKVxyXG4gICAgICAuYWxpYXMoJ3UnKVxyXG4gICAgICAuYWN0aW9uKChpbnB1dDogc3RyaW5nW10pID0+IHtcclxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgaW5wdXRMaXN0ID0gaW5wdXRcclxuICAgICAgICAgICAgLm1hcCgoaXRlbTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGlzVXJsKGl0ZW0pID8gaXRlbSA6IHBhdGgucmVzb2x2ZShpdGVtKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBleGlzdCA9IGZzLmV4aXN0c1N5bmMoaXRlbSkgfHwgaXNVcmwoaXRlbSlcclxuICAgICAgICAgICAgICBpZiAoIWV4aXN0KSB7XHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLndhcm4oYCR7aXRlbX0gZG9lcyBub3QgZXhpc3QuYClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhd2FpdCBjdHgudXBsb2FkKGlucHV0TGlzdClcclxuICAgICAgICB9KSgpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHVwbG9hZFxyXG4iLCJcclxuaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJQnVpbGRJbkNvbXByZXNzT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElCdWlsZEluQ29tcHJlc3NPcHRpb25zPignYnVpbGRJbi5jb21wcmVzcycpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdxdWFsaXR5JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUVVBTElUWScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5xdWFsaXR5IHx8IDEwMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzQ29udmVydCcsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfSVNDT05WRVJUJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmlzQ29udmVydCB8fCBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2NvbnZlcnRGb3JtYXQnLFxyXG4gICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX0NPTlZFUlRGT1JNQVQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGNob2ljZXM6IFsnYXZpZicsICdkeicsICdmaXRzJywgJ2dpZicsICdoZWlmJywgJ2lucHV0JywgJ2pwZWcnLCAnanBnJywgJ2pwMicsICdqeGwnLCAnbWFnaWNrJywgJ29wZW5zbGlkZScsICdwZGYnLCAncG5nJywgJ3BwbScsICdyYXcnLCAnc3ZnJywgJ3RpZmYnLCAndGlmJywgJ3YnLCAnd2VicCddLFxyXG4gICAgICBkZWZhdWx0OiAnanBnJ1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzUmVTaXplJyxcclxuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9DT01QUkVTU19JU1JFU0laRScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5pc1JlU2l6ZSB8fCBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3JlU2l6ZVdpZHRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUkVTSVpFV0lEVEgnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucmVTaXplV2lkdGggfHwgNTAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncmVTaXplSGVpZ2h0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUkVTSVpFSEVJR0hUJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnJlU2l6ZUhlaWdodCB8fCA1MDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdpc1JlU2l6ZUJ5UGVyY2VudCcsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkVCWVBFUkNFTlQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuaXNSZVNpemVCeVBlcmNlbnQgfHwgZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdyZVNpemVQZXJjZW50JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUkVTSVpFUEVSQ0VOVCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5yZVNpemVQZXJjZW50IHx8IDUwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaXNSb3RhdGUnLFxyXG4gICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX0lTUk9UQVRFJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmlzUm90YXRlIHx8IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncm90YXRlRGVncmVlJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUk9UQVRFREVHUkVFJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnJvdGF0ZURlZ3JlZSB8fCA5MFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzUmVtb3ZlRXhpZicsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfSVNSRU1PVkVFWElGJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmlzUmVtb3ZlRXhpZiB8fCBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBjb25maWdcclxufVxyXG4iLCJcclxuaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJQnVpbGRJbldhdGVyTWFya09wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJQnVpbGRJbldhdGVyTWFya09wdGlvbnM+KCdidWlsZEluLndhdGVybWFyaycpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdpc0FkZFdhdGVybWFyaycsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX0lTQUREV0FURVJNQVJLJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmlzQWRkV2F0ZXJtYXJrIHx8IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnd2F0ZXJtYXJrVHlwZScsXHJcbiAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RZUEUnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGNob2ljZXM6IFsndGV4dCcsICdpbWFnZSddLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndhdGVybWFya1R5cGUgfHwgJ3RleHQnXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaXNGdWxsU2NyZWVuV2F0ZXJtYXJrJyxcclxuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9XQVRFUk1BUktfSVNGVUxMU0NSRUVOV0FURVJNQVJLJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmlzRnVsbFNjcmVlbldhdGVybWFyayB8fCBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3dhdGVybWFya0RlZ3JlZScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktERUdSRUUnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcud2F0ZXJtYXJrRGVncmVlIHx8IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtUZXh0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RFWFQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcud2F0ZXJtYXJrVGV4dCB8fCAnJ1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3dhdGVybWFya0ZvbnRQYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RFWFRGT05UUEFUSCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53YXRlcm1hcmtGb250UGF0aCB8fCAnJ1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3dhdGVybWFya1NjYWxlUmF0aW8nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLRk9OVFJBVElPJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndhdGVybWFya1NjYWxlUmF0aW8gfHwgMC4xNVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3dhdGVybWFya0NvbG9yJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRDT0xPUicpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53YXRlcm1hcmtDb2xvciB8fCAncmdiYSgyMDQsIDIwNCwgMjA0LCAwLjQ1KSdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtJbWFnZVBhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLSU1BR0VQQVRIJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndhdGVybWFya0ltYWdlUGF0aCB8fCAnJ1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3dhdGVybWFya1Bvc2l0aW9uJyxcclxuICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLUE9TSVRJT04nKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGNob2ljZXM6IFsnbm9ydGgnLCAnbm9ydGhlYXN0JywgJ3NvdXRoZWFzdCcsICdzb3V0aCcsICdzb3V0aHdlc3QnLCAnbm9ydGh3ZXN0JywgJ3dlc3QnLCAnZWFzdCcsICdjZW50ZXInLCAnY2VudHJlJ10sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcud2F0ZXJtYXJrUG9zaXRpb24gfHwgJ3NvdXRoZWFzdCdcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgY29uZmlnXHJcbn1cclxuIiwiXHJcbmltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPGFueT4oJ2J1aWxkSW4ucmVuYW1lJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2Zvcm1hdCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1JFTkFNRV9GT1JNQVQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuZm9ybWF0IHx8ICd7ZmlsZW5hbWV9J1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2VuYWJsZScsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fUkVOQU1FX0VOQUJMRScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5lbmFibGUgfHwgZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgY29uZmlnXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBjb21wcmVzcyBmcm9tICcuLi9iZWZvcmV0cmFuc2Zvcm1lci9jb21wcmVzcydcclxuaW1wb3J0IHdhdGVybWFyayBmcm9tICcuLi9iZWZvcmV0cmFuc2Zvcm1lci93YXRlcm1hcmsnXHJcbmltcG9ydCByZW5hbWUgZnJvbSAnLi4vYmVmb3JldXBsb2FkL2J1aWxkSW5SZW5hbWUnXHJcblxyXG4vLyBoYW5kbGUgbW9kdWxlcyBjb25maWcgLT4gc2F2ZSB0byBwaWNnbyBjb25maWcgZmlsZVxyXG5jb25zdCBoYW5kbGVDb25maWcgPSBhc3luYyAoY3R4OiBJUGljR28sIHByb21wdHM6IElQbHVnaW5Db25maWdbXSwgbW9kdWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KHByb21wdHMpXHJcbiAgY29uc3QgY29uZmlnTmFtZSA9IG1vZHVsZSA9PT0gJ3VwbG9hZGVyJ1xyXG4gICAgPyBgcGljQmVkLiR7bmFtZX1gIDogbW9kdWxlID09PSAndHJhbnNmb3JtZXInXHJcbiAgICAgID8gYHRyYW5zZm9ybWVyLiR7bmFtZX1gIDogbW9kdWxlID09PSAnYnVpbGRpbidcclxuICAgICAgICA/IGBidWlsZEluLiR7bmFtZX1gIDogbmFtZVxyXG4gIGN0eC5zYXZlQ29uZmlnKHtcclxuICAgIFtjb25maWdOYW1lXTogYW5zd2VyXHJcbiAgfSlcclxuICBpZiAobW9kdWxlID09PSAndXBsb2FkZXInKSB7XHJcbiAgICBjdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICdwaWNCZWQuY3VycmVudCc6IG5hbWUsXHJcbiAgICAgICdwaWNCZWQudXBsb2FkZXInOiBuYW1lXHJcbiAgICB9KVxyXG4gIH0gZWxzZSBpZiAobW9kdWxlID09PSAndHJhbnNmb3JtZXInKSB7XHJcbiAgICBjdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICdwaWNCZWQudHJhbnNmb3JtZXInOiBuYW1lXHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuY29uc3Qgc2V0dGluZyA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ3NldCcpXHJcbiAgICAgIC5hbGlhcygnY29uZmlnJylcclxuICAgICAgLmFyZ3VtZW50cygnPG1vZHVsZT4gW25hbWVdJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCdjb25maWd1cmUgY29uZmlnIG9mIHBpY2dvIG1vZHVsZXMsIHVwbG9hZGVyfHRyYW5zZm9ybWVyfHBsdWdpbnxidWlsZGluJylcclxuICAgICAgLmFjdGlvbigobW9kdWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcclxuICAgICAgICAgICAgLy8gYXdhaXQgY3R4LnBsdWdpbkxvYWRlci5sb2FkKClcclxuICAgICAgICAgICAgLy8gaWYgYSBtb2R1bGUgaXMgc3BlY2lmaWMsIHRoZW4ganVzdCBzZXQgdGhpcyBvcHRpb24gaW4gY29uZmlnXHJcbiAgICAgICAgICAgIHN3aXRjaCAobW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAnYnVpbGRpbic6XHJcbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2NvbXByZXNzJykge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBjb21wcmVzcy5jb25maWcoY3R4KSwgbW9kdWxlLCBuYW1lKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09PSAnd2F0ZXJtYXJrJykge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCB3YXRlcm1hcmsuY29uZmlnKGN0eCksIG1vZHVsZSwgbmFtZSlcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3JlbmFtZScpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgcmVuYW1lLmNvbmZpZyhjdHgpLCBtb2R1bGUsIG5hbWUpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdidWlsZGluJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM6IFsnY29tcHJlc3MnLCAnd2F0ZXJtYXJrJywgJ3JlbmFtZSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Nob29zZSBhIGJ1aWxkaW4gbW9kdWxlJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdDxJU3RyaW5nS2V5TWFwPGFueT4+KHByb21wdHMpXHJcbiAgICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIuYnVpbGRpbiA9PT0gJ2NvbXByZXNzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGNvbXByZXNzLmNvbmZpZyhjdHgpLCBtb2R1bGUsIGFuc3dlci5idWlsZGluKVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFuc3dlci5idWlsZGluID09PSAnd2F0ZXJtYXJrJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIHdhdGVybWFyay5jb25maWcoY3R4KSwgbW9kdWxlLCBhbnN3ZXIuYnVpbGRpbilcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbnN3ZXIuYnVpbGRpbiA9PT0gJ3JlbmFtZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCByZW5hbWUuY29uZmlnKGN0eCksIG1vZHVsZSwgYW5zd2VyLmJ1aWxkaW4pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgY2FzZSAndXBsb2FkZXInOlxyXG4gICAgICAgICAgICAgIGNhc2UgJ3RyYW5zZm9ybWVyJzpcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdHguaGVscGVyW21vZHVsZV0uZ2V0KG5hbWUpXHJcbiAgICAgICAgICAgICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdHgubG9nLmVycm9yKGBObyAke21vZHVsZX0gbmFtZWQgJHtuYW1lfWApXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgaXRlbS5jb25maWcoY3R4KSwgbW9kdWxlLCBuYW1lKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke21vZHVsZX1gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LmhlbHBlclttb2R1bGVdLmdldElkTGlzdCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYENob29zZSBhKG4pICR7bW9kdWxlfWBcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQ6IGN0eC5nZXRDb25maWcoJ3BpY0JlZC51cGxvYWRlcicpIHx8IGN0eC5nZXRDb25maWcoJ3BpY0JlZC5jdXJyZW50JylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY3R4LmNtZC5pbnF1aXJlci5wcm9tcHQ8SVN0cmluZ0tleU1hcDxhbnk+Pihwcm9tcHRzKVxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY3R4LmhlbHBlclttb2R1bGVdLmdldChhbnN3ZXJbbW9kdWxlXSlcclxuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0/LmNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGl0ZW0uY29uZmlnKGN0eCksIG1vZHVsZSwgYW5zd2VyW21vZHVsZV0pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgY2FzZSAncGx1Z2luJzpcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5pbmNsdWRlcygncGljZ28tcGx1Z2luLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGBwaWNnby1wbHVnaW4tJHtuYW1lfWBcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY3R4LmdldENvbmZpZygncGljZ29QbHVnaW5zJykpLmluY2x1ZGVzKG5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC5wbHVnaW5Mb2FkZXIuZ2V0UGx1Z2luKG5hbWUpPy5jb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGN0eC5wbHVnaW5Mb2FkZXIuZ2V0UGx1Z2luKG5hbWUpIS5jb25maWchKGN0eCksICdwbHVnaW4nLCBuYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihgTm8gcGx1Z2luIG5hbWVkICR7bmFtZX1gKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwbHVnaW4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LnBsdWdpbkxvYWRlci5nZXRGdWxsTGlzdCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Nob29zZSBhIHBsdWdpbidcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY3R4LmNtZC5pbnF1aXJlci5wcm9tcHQ8YW55Pihwcm9tcHRzKVxyXG4gICAgICAgICAgICAgICAgICBpZiAoY3R4LnBsdWdpbkxvYWRlci5nZXRQbHVnaW4oYW5zd2VyLnBsdWdpbik/LmNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGN0eC5wbHVnaW5Mb2FkZXIuZ2V0UGx1Z2luKGFuc3dlci5wbHVnaW4pIS5jb25maWchKGN0eCksICdwbHVnaW4nLCBhbnN3ZXIucGx1Z2luKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLndhcm4oYE5vIG1vZHVsZSBuYW1lZCAke21vZHVsZX1gKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5sb2cud2FybignQXZhaWxhYmxlIG1vZHVsZXMgYXJlIHVwbG9hZGVyfHRyYW5zZm9ybWVyfHBsdWdpbnxidWlsZGluJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoJ0NvbmZpZ3VyZSBjb25maWcgc3VjY2Vzc2Z1bGx5IScpXHJcbiAgICAgICAgICAgIGlmIChtb2R1bGUgPT09ICdwbHVnaW4nKSB7XHJcbiAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKCdJZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBjb25maWcsIHBsZWFzZSBydW4gXFwncGljZ28gdXNlIHBsdWdpbnNcXCcnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWRlYnVnJykpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSgpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHNldHRpbmdcclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luLCBVbmRlZmluYWJsZSwgSUNMSUNvbmZpZ3MsIElTdHJpbmdLZXlNYXAgfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmNvbnN0IHVzZTogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IGFzeW5jIChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ3VzZScpXHJcbiAgICAgIC5hcmd1bWVudHMoJ1ttb2R1bGVdJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCd1c2UgbW9kdWxlcyBvZiBwaWNnbycpXHJcbiAgICAgIC5hY3Rpb24oKG1vZHVsZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIC8vIGxvYWQgdGhpcmQtcGFydHkgcGx1Z2luc1xyXG4gICAgICAgICAgICAvLyBhd2FpdCBjdHgucGx1Z2luTG9hZGVyLmxvYWQoKVxyXG4gICAgICAgICAgICBsZXQgcHJvbXB0czogYW55W10gPSBbXVxyXG4gICAgICAgICAgICBjb25zdCBjb25maWc6IElDTElDb25maWdzID0ge1xyXG4gICAgICAgICAgICAgIHVwbG9hZGVyOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAndXBsb2FkZXInLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZSBhbiB1cGxvYWRlcicsXHJcbiAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHguaGVscGVyLnVwbG9hZGVyLmdldElkTGlzdCgpLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogY3R4LmdldENvbmZpZygncGljQmVkLnVwbG9hZGVyJykgfHwgY3R4LmdldENvbmZpZygncGljQmVkLmN1cnJlbnQnKSB8fCAnc21tcydcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHRyYW5zZm9ybWVyOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAndHJhbnNmb3JtZXInLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZSBhIHRyYW5zZm9ybWVyJyxcclxuICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5oZWxwZXIudHJhbnNmb3JtZXIuZ2V0SWRMaXN0KCksXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdwaWNCZWQudHJhbnNmb3JtZXInKSB8fCAncGF0aCdcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHBsdWdpbnM6IHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAncGx1Z2lucycsXHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVXNlIHBsdWdpbnMnLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LnBsdWdpbkxvYWRlci5nZXRGdWxsTGlzdCgpLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogT2JqZWN0LmtleXMoY3R4LmdldENvbmZpZygncGljZ29QbHVnaW5zJykpLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBjdHguZ2V0Q29uZmlnKGBwaWNnb1BsdWdpbnMuJHtpdGVtfWApKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiBhbiBvcHRpb24gaXMgc3BlY2lmaWMsIHRoZW4ganVzdCBzZXQgdGhpcyBvcHRpb24gaW4gY29uZmlnXHJcbiAgICAgICAgICAgIGlmIChtb2R1bGUpIHtcclxuICAgICAgICAgICAgICBpZiAoY29uZmlnW21vZHVsZV0pIHtcclxuICAgICAgICAgICAgICAgIHByb21wdHMucHVzaChjb25maWdbbW9kdWxlXSlcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY3R4LmxvZy53YXJuKGBObyBtb2R1bGUgbmFtZWQgJHttb2R1bGV9YClcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdHgubG9nLndhcm4oJ0F2YWlsYWJsZSBtb2R1bGVzIGFyZSB1cGxvYWRlcnx0cmFuc2Zvcm1lcnxwbHVnaW5zJylcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcHJvbXB0cyA9IE9iamVjdC5rZXlzKGNvbmZpZykubWFwKChpdGVtOiBzdHJpbmcpID0+IGNvbmZpZ1tpdGVtXSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjbWQuaW5xdWlyZXIucHJvbXB0PGFueT4ocHJvbXB0cylcclxuXHJcbiAgICAgICAgICAgIC8vIGhhbmRsZSBmb3IgcGx1Z2lucyBvcHRpb24gZnJvbSBBcnJheSB0byBvYmplY3RcclxuICAgICAgICAgICAgaWYgKGFuc3dlci5wbHVnaW5zKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcGx1Z2lucyA9IGN0eC5nZXRDb25maWc8SVN0cmluZ0tleU1hcDxib29sZWFuPj4oJ3BpY2dvUGx1Z2lucycpXHJcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMocGx1Z2lucykubWFwKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIucGx1Z2lucy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICBwbHVnaW5zW2l0ZW1dID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcGx1Z2luc1tpdGVtXSA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAvLyBzYXZlIGNvbmZpZyBmb3IgcGx1Z2luc1xyXG4gICAgICAgICAgICAgIGN0eC5zYXZlQ29uZmlnKHtcclxuICAgICAgICAgICAgICAgIHBpY2dvUGx1Z2luczogcGx1Z2luc1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gc2F2ZSBjb25maWcgZm9yIHVwbG9hZGVyICYgdHJhbnNmb3JtZXJcclxuICAgICAgICAgICAgY3R4LnNhdmVDb25maWcoe1xyXG4gICAgICAgICAgICAgICdwaWNCZWQuY3VycmVudCc6IGFuc3dlci51cGxvYWRlciB8fCBjdHguZ2V0Q29uZmlnPHN0cmluZz4oJ3BpY0JlZC5jdXJyZW50JyksXHJcbiAgICAgICAgICAgICAgJ3BpY0JlZC51cGxvYWRlcic6IGFuc3dlci51cGxvYWRlciB8fCBjdHguZ2V0Q29uZmlnPHN0cmluZz4oJ3BpY0JlZC5jdXJyZW50JyksXHJcbiAgICAgICAgICAgICAgJ3BpY0JlZC50cmFuc2Zvcm1lcic6IGFuc3dlci50cmFuc2Zvcm1lciB8fCAncGF0aCdcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgY3R4LmxvZy5zdWNjZXNzKCdDb25maWd1cmUgY29uZmlnIHN1Y2Nlc3NmdWxseSEnKVxyXG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1kZWJ1ZycpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB1c2VcclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCBwcm94eTogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLm9wdGlvbignLXAsIC0tcHJveHkgPHVybD4nLCAnc2V0IHByb3h5IGZvciB1cGxvYWRpbmcnLCAocHJveHk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGN0eC5zZXRDb25maWcoe1xyXG4gICAgICAgICAgJ3BpY0JlZC5wcm94eSc6IHByb3h5XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHByb3h5XHJcbiIsImltcG9ydCBtYXRjaCBmcm9tICdtaW5pbWF0Y2gnXHJcbmltcG9ydCB7IElQaWNHbywgSU9wdGlvbnMsIElGaWxlVHJlZSB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBnbG9iYnkgZnJvbSAnZ2xvYmJ5J1xyXG5pbXBvcnQgZWpzIGZyb20gJ2VqcydcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSB0ZW1wbGF0ZSBmaWxlcyB0byBkZXN0aW5hdGlvbiBmaWxlcy5cclxuICogQHBhcmFtIHtQaWNHb30gY3R4XHJcbiAqIEBwYXJhbSB7SU9wdGlvbnN9IG9wdGlvbnNcclxuICovXHJcbmNvbnN0IGdlbmVyYXRlID0gYXN5bmMgKGN0eDogSVBpY0dvLCBvcHRpb25zOiBJT3B0aW9ucyk6IFByb21pc2U8YW55PiA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IG9wdHMgPSBnZXRPcHRpb25zKG9wdGlvbnMudG1wKVxyXG4gICAgY29uc3Qgc291cmNlID0gcGF0aC5qb2luKG9wdGlvbnMudG1wLCAndGVtcGxhdGUnKVxyXG4gICAgbGV0IGFuc3dlcnMgPSB7fVxyXG4gICAgaWYgKG9wdHMucHJvbXB0cyAmJiBvcHRzLnByb21wdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBhbnN3ZXJzID0gYXdhaXQgY3R4LmNtZC5pbnF1aXJlci5wcm9tcHQob3B0cy5wcm9tcHRzKVxyXG4gICAgfVxyXG4gICAgbGV0IF9maWxlczogc3RyaW5nW10gPSBhd2FpdCBnbG9iYnkoWycqKi8qJ10sIHsgY3dkOiBzb3VyY2UsIGRvdDogdHJ1ZSB9KSAvLyBnZXQgZmlsZXMnIG5hbWUgYXJyYXlcclxuICAgIF9maWxlcyA9IF9maWxlcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICBsZXQgZ2xvYiA9ICcnXHJcbiAgICAgIE9iamVjdC5rZXlzKG9wdHMuZmlsdGVycykuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAobWF0Y2goaXRlbSwga2V5LCB7IGRvdDogdHJ1ZSB9KSkge1xyXG4gICAgICAgICAgZ2xvYiA9IGl0ZW1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGlmIChnbG9iKSB7IC8vIGZpbmQgYSBmaWx0ZXIgZXhwcmVzc2lvblxyXG4gICAgICAgIHJldHVybiBmaWx0ZXJzKGN0eCwgb3B0cy5maWx0ZXJzW2dsb2JdLCBhbnN3ZXJzKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBpZiAoX2ZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gY3R4LmxvZy53YXJuKCdUZW1wbGF0ZSBmaWxlcyBub3QgZm91bmQhJylcclxuICAgIH1cclxuICAgIGNvbnN0IGZpbGVzID0gcmVuZGVyKF9maWxlcywgc291cmNlLCBhbnN3ZXJzKVxyXG4gICAgd3JpdGVGaWxlVHJlZShvcHRpb25zLmRlc3QsIGZpbGVzKVxyXG4gICAgaWYgKHR5cGVvZiBvcHRzLmNvbXBsZXRlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIG9wdHMuY29tcGxldGUoeyBhbnN3ZXJzLCBvcHRpb25zLCBmaWxlczogX2ZpbGVzLCBjdHggfSlcclxuICAgIH1cclxuICAgIGlmIChvcHRzLmNvbXBsZXRlTWVzc2FnZSkge1xyXG4gICAgICBjdHgubG9nLnN1Y2Nlc3Mob3B0cy5jb21wbGV0ZU1lc3NhZ2UpXHJcbiAgICB9XHJcbiAgICBjdHgubG9nLnN1Y2Nlc3MoJ0RvbmUhJylcclxuICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgIHJldHVybiBjdHgubG9nLmVycm9yKGUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRoZSBmaWx0ZXJzJyByZXN1bHRcclxuICogQHBhcmFtIGN0eCBQaWNHb1xyXG4gKiBAcGFyYW0gZXhwIGNvbmRpdGlvbiBleHByZXNzaW9uXHJcbiAqIEBwYXJhbSBkYXRhIG9wdGlvbnMgZGF0YVxyXG4gKi9cclxuY29uc3QgZmlsdGVycyA9IChjdHg6IElQaWNHbywgZXhwOiBhbnksIGRhdGE6IGFueSk6IGJvb2xlYW4gPT4ge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtcGx1cy1vcGVyYW5kcywgbm8tbmV3LWZ1bmMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbXBsaWVkLWV2YWxcclxuICBjb25zdCBmbiA9IG5ldyBGdW5jdGlvbignZGF0YScsICd3aXRoIChkYXRhKSB7IHJldHVybiAnICsgZXhwICsgJ30nKVxyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gZm4oZGF0YSlcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICBjdHgubG9nLmVycm9yKGBFcnJvciB3aGVuIGV2YWx1YXRpbmcgZmlsdGVyIGNvbmRpdGlvbjogJHtKU09OLnN0cmluZ2lmeShleHApfWApXHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGVtcGxhdGUgb3B0aW9uc1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGVQYXRoXHJcbiAqL1xyXG5jb25zdCBnZXRPcHRpb25zID0gKHRlbXBsYXRlUGF0aDogc3RyaW5nKTogYW55ID0+IHtcclxuICBjb25zdCBvcHRpb25zUGF0aCA9IHBhdGguam9pbih0ZW1wbGF0ZVBhdGgsICdpbmRleC5qcycpXHJcbiAgaWYgKGZzLmV4aXN0c1N5bmMob3B0aW9uc1BhdGgpKSB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHJlcXVpcmUob3B0aW9uc1BhdGgpXHJcbiAgICByZXR1cm4gb3B0aW9uc1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4ge31cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW5kZXIgZmlsZXMgdG8gYSB2aXJ0dWFsIHRyZWUgb2JqZWN0XHJcbiAqIEBwYXJhbSB7YXJyYXl9IGZpbGVzXHJcbiAqL1xyXG5jb25zdCByZW5kZXIgPSAoZmlsZXM6IHN0cmluZ1tdLCBzb3VyY2U6IHN0cmluZywgb3B0aW9uczogYW55KTogYW55ID0+IHtcclxuICBjb25zdCBmaWxlVHJlZTogSUZpbGVUcmVlID0ge31cclxuICBmaWxlcy5mb3JFYWNoKChmaWxlUGF0aDogc3RyaW5nKTogdm9pZCA9PiB7XHJcbiAgICBjb25zdCBmaWxlID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihzb3VyY2UsIGZpbGVQYXRoKSwgJ3V0ZjgnKVxyXG4gICAgY29uc3QgY29udGVudCA9IGVqcy5yZW5kZXIoZmlsZSwgb3B0aW9ucylcclxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udGVudCkgfHwgL1teXFxzXS8udGVzdChjb250ZW50KSkge1xyXG4gICAgICBmaWxlVHJlZVtmaWxlUGF0aF0gPSBjb250ZW50XHJcbiAgICB9XHJcbiAgfSlcclxuICByZXR1cm4gZmlsZVRyZWVcclxufVxyXG5cclxuLyoqXHJcbiAqIFdyaXRlIHJlbmRlcmVkIGZpbGVzJyBjb250ZW50IHRvIHJlYWwgZmlsZVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWxlc1xyXG4gKi9cclxuY29uc3Qgd3JpdGVGaWxlVHJlZSA9IChkaXI6IHN0cmluZywgZmlsZXM6IGFueSk6IHZvaWQgPT4ge1xyXG4gIE9iamVjdC5rZXlzKGZpbGVzKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpciwgbmFtZSlcclxuICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcclxuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGZpbGVzW25hbWVdKVxyXG4gIH0pXHJcbn1cclxuXHJcbmV4cG9ydCB7XHJcbiAgZmlsdGVycyxcclxuICBnZW5lcmF0ZSxcclxuICByZW5kZXIsXHJcbiAgd3JpdGVGaWxlVHJlZVxyXG59XHJcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2luaXRVdGlscydcclxuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJ1xyXG5pbXBvcnQgZG93bmxvYWQgZnJvbSAnZG93bmxvYWQtZ2l0LXJlcG8nXHJcbmltcG9ydCB7IElPcHRpb25zLCBJUGx1Z2luLCBJUGljR28gfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHJtIGZyb20gJ3JpbXJhZidcclxuXHJcbmNvbnN0IHJ1biA9IChjdHg6IElQaWNHbywgb3B0aW9uczogSU9wdGlvbnMpOiB2b2lkID0+IHtcclxuICAvLyBjb25zdCBuYW1lID0gb3B0aW9ucy5pblBsYWNlID8gcGF0aC5yZWxhdGl2ZSgnLi4vJywgcHJvY2Vzcy5jd2QoKSkgOiBvcHRpb25zLnByb2plY3RcclxuICBpZiAob3B0aW9ucy5vZmZsaW5lKSB7IC8vIG9mZmxpbmUgbW9kZVxyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMob3B0aW9ucy50ZW1wbGF0ZSkpIHtcclxuICAgICAgZ2VuZXJhdGUoY3R4LCBvcHRpb25zKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjdHgubG9nLmVycm9yKGBMb2NhbCB0ZW1wbGF0ZSAke29wdGlvbnMudGVtcGxhdGV9IG5vdCBmb3VuZGApXHJcbiAgICB9XHJcbiAgfSBlbHNlIHsgLy8gb25saW5lIG1vZGVcclxuICAgIG9wdGlvbnMudGVtcGxhdGUgPSAhb3B0aW9ucy5oYXNTbGFzaFxyXG4gICAgICA/ICdQaWNHby9waWNnby10ZW1wbGF0ZS0nICsgb3B0aW9ucy50ZW1wbGF0ZSAvLyBvZmZpY2lhbCB0ZW1wbGF0ZVxyXG4gICAgICA6IG9wdGlvbnMudGVtcGxhdGVcclxuICAgIGRvd25sb2FkQW5kR2VuZXJhdGUoY3R4LCBvcHRpb25zKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIGRvd25sb2FkIHRlbXBsYXRlICYgZ2VuZXJhdGVcclxuICogQHBhcmFtIHsgUGljR28gfSBjdHhcclxuICogQHBhcmFtIHsgSU9wdGlvbnMgfSBvcHRpb25zXHJcbiAqL1xyXG5jb25zdCBkb3dubG9hZEFuZEdlbmVyYXRlID0gKGN0eDogSVBpY0dvLCBvcHRpb25zOiBJT3B0aW9ucyk6IHZvaWQgPT4ge1xyXG4gIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnMudG1wKSkge1xyXG4gICAgcm0uc3luYyhvcHRpb25zLnRtcClcclxuICB9XHJcbiAgY3R4LmxvZy5pbmZvKCdUZW1wbGF0ZSBmaWxlcyBhcmUgZG93bmxvYWRpbmcuLi4nKVxyXG4gIGRvd25sb2FkKG9wdGlvbnMudGVtcGxhdGUsIG9wdGlvbnMudG1wLCB7IGNsb25lOiBvcHRpb25zLmNsb25lIH0sIChlcnI6IEVycm9yKSA9PiB7XHJcbiAgICBpZiAoZXJyKSB7XHJcbiAgICAgIHJldHVybiBjdHgubG9nLmVycm9yKGVycilcclxuICAgIH1cclxuICAgIGN0eC5sb2cuc3VjY2VzcygnVGVtcGxhdGUgZmlsZXMgYXJlIGRvd25sb2FkZWQhJylcclxuICAgIGdlbmVyYXRlKGN0eCwgb3B0aW9ucykuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IGluaXQ6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiBhc3luYyAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCdpbml0JylcclxuICAgICAgLmFyZ3VtZW50cygnPHRlbXBsYXRlPiBbcHJvamVjdF0nKVxyXG4gICAgICAub3B0aW9uKCctLWNsb25lJywgJ3VzZSBnaXQgY2xvbmUnKVxyXG4gICAgICAub3B0aW9uKCctLW9mZmxpbmUnLCAndXNlIGNhY2hlZCB0ZW1wbGF0ZScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbignY3JlYXRlIHBpY2dvIHBsdWdpblxcJ3MgZGV2ZWxvcG1lbnQgdGVtcGxhdGVzJylcclxuICAgICAgLmFjdGlvbigodGVtcGxhdGU6IHN0cmluZywgcHJvamVjdDogc3RyaW5nLCBwcm9ncmFtOiBhbnkpID0+IHtcclxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgLy8gVGhhbmtzIHRvIHZ1ZS1jbGkgaW5pdDogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1jbGkvYmxvYi9tYXN0ZXIvYmluL3Z1ZS1pbml0XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBoYXNTbGFzaCA9IHRlbXBsYXRlLmluY2x1ZGVzKCcvJylcclxuICAgICAgICAgICAgY29uc3QgaW5QbGFjZSA9ICFwcm9qZWN0IHx8IHByb2plY3QgPT09ICcuJ1xyXG4gICAgICAgICAgICBjb25zdCBkZXN0ID0gcGF0aC5yZXNvbHZlKHByb2plY3QgfHwgJy4nKVxyXG4gICAgICAgICAgICBjb25zdCBjbG9uZSA9IHByb2dyYW0uY2xvbmUgfHwgZmFsc2VcclxuICAgICAgICAgICAgY29uc3Qgb2ZmbGluZSA9IHByb2dyYW0ub2ZmbGluZSB8fCBmYWxzZVxyXG4gICAgICAgICAgICBjb25zdCB0bXAgPSBwYXRoLmpvaW4oaG9tZWRpcigpLCAnLnBpY2dvL3RlbXBsYXRlcycsIHRlbXBsYXRlLnJlcGxhY2UoL1svOl0vZywgJy0nKSkgLy8gZm9yIGNhY2hpbmcgdGVtcGxhdGVcclxuXHJcbiAgICAgICAgICAgIGlmIChwcm9ncmFtLm9mZmxpbmUpIHtcclxuICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRtcFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgIHRlbXBsYXRlLFxyXG4gICAgICAgICAgICAgIHByb2plY3QsXHJcbiAgICAgICAgICAgICAgaGFzU2xhc2gsXHJcbiAgICAgICAgICAgICAgaW5QbGFjZSxcclxuICAgICAgICAgICAgICBkZXN0LFxyXG4gICAgICAgICAgICAgIGNsb25lLFxyXG4gICAgICAgICAgICAgIHRtcCxcclxuICAgICAgICAgICAgICBvZmZsaW5lXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHByb2plY3QgaXMgZW1wdHkgb3IgZXhpc3RcclxuICAgICAgICAgICAgaWYgKGluUGxhY2UgfHwgZnMuZXhpc3RzU3luYyhkZXN0KSkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgdHlwZTogJ2NvbmZpcm0nLFxyXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBpblBsYWNlXHJcbiAgICAgICAgICAgICAgICAgICAgPyAnR2VuZXJhdGUgcHJvamVjdCBpbiBjdXJyZW50IGRpcmVjdG9yeT8nXHJcbiAgICAgICAgICAgICAgICAgICAgOiAnVGFyZ2V0IGRpcmVjdG9yeSBleGlzdHMuIENvbnRpbnVlPycsXHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdvaydcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBdKS50aGVuKChhbnN3ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlci5vaykge1xyXG4gICAgICAgICAgICAgICAgICBydW4oY3R4LCBvcHRpb25zKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIHByb2plY3QgaXMgZ2l2ZW5cclxuICAgICAgICAgICAgICBydW4oY3R4LCBvcHRpb25zKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWRlYnVnJykpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSgpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgfSlcclxuICAgICAgLm9uKCctLWhlbHAnLCAoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdFeGFtcGxlczonKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKClcclxuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICMgY3JlYXRlIGEgbmV3IHByb2plY3Qgd2l0aCBhbiBvZmZpY2lhbCB0ZW1wbGF0ZScpKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCcgICQgcGljZ28gaW5pdCBwbHVnaW4gbXktcHJvamVjdCcpXHJcbiAgICAgICAgY29uc29sZS5sb2coKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgIyBjcmVhdGUgYSBuZXcgcHJvamVjdCBzdHJhaWdodCBmcm9tIGEgZ2l0aHViIHRlbXBsYXRlJykpXHJcbiAgICAgICAgY29uc29sZS5sb2coJyAgJCBwaWNnbyBpbml0IHVzZXJuYW1lL3JlcG8gbXktcHJvamVjdCcpXHJcbiAgICAgICAgY29uc29sZS5sb2coKVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgaW5pdFxyXG4iLCJpbXBvcnQgeyBJUGx1Z2luLCBJUGljR28sIElTdHJpbmdLZXlNYXAgfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmNvbnN0IGkxOG46IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCdpMThuJylcclxuICAgICAgLmFyZ3VtZW50cygnW2xhbmddJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCdjaGFuZ2UgcGljZ28gbGFuZ3VhZ2UnKVxyXG4gICAgICAuYWN0aW9uKGFzeW5jIChsYW5nOiBzdHJpbmcgPSAnJykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGxpc3QgPSBjdHguaTE4bi5nZXRMYW5ndWFnZUxpc3QoKVxyXG4gICAgICAgIGlmICghbGFuZykge1xyXG4gICAgICAgICAgY29uc3QgcHJvbXB0cyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgICAgICAgICBuYW1lOiAnaTE4bicsXHJcbiAgICAgICAgICAgICAgY2hvaWNlczogbGlzdCxcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAnQ2hvb3NlIGEgbGFuZ3VhZ2UnLFxyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6IGN0eC5nZXRDb25maWcoJ3NldHRpbmdzLmxhbmd1YWdlJykgfHwgJ3poLUNOJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdDxJU3RyaW5nS2V5TWFwPHN0cmluZz4+KHByb21wdHMpXHJcbiAgICAgICAgICBjdHguaTE4bi5zZXRMYW5ndWFnZShhbnN3ZXIuaTE4bilcclxuICAgICAgICAgIGN0eC5sb2cuc3VjY2VzcyhgTGFuZ3VhZ2Ugc2V0IHRvICR7YW5zd2VyLmkxOG59YClcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWxpc3QuaW5jbHVkZXMobGFuZykpIHtcclxuICAgICAgICAgIHJldHVybiBjdHgubG9nLndhcm4oJ05vIHN1Y2ggbGFuZ3VhZ2UnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjdHguaTE4bi5zZXRMYW5ndWFnZShsYW5nKVxyXG4gICAgICAgIGN0eC5sb2cuc3VjY2VzcyhgTGFuZ3VhZ2Ugc2V0IHRvICR7bGFuZ31gKVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgaTE4blxyXG4iLCJpbXBvcnQgeyBJUGx1Z2luLCBJTGlmZWN5Y2xlUGx1Z2lucyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5cclxuZXhwb3J0IGNsYXNzIExpZmVjeWNsZVBsdWdpbnMgaW1wbGVtZW50cyBJTGlmZWN5Y2xlUGx1Z2lucyB7XHJcbiAgc3RhdGljIGN1cnJlbnRQbHVnaW46IHN0cmluZyB8IG51bGxcclxuICBwcml2YXRlIHJlYWRvbmx5IGxpc3Q6IE1hcDxzdHJpbmcsIElQbHVnaW4+XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZE1hcDogTWFwPHN0cmluZywgc3RyaW5nW10+XHJcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmdcclxuXHJcbiAgY29uc3RydWN0b3IgKG5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5uYW1lID0gbmFtZVxyXG4gICAgdGhpcy5saXN0ID0gbmV3IE1hcCgpXHJcbiAgICB0aGlzLnBsdWdpbklkTWFwID0gbmV3IE1hcCgpXHJcbiAgfVxyXG5cclxuICByZWdpc3RlciAoaWQ6IHN0cmluZywgcGx1Z2luOiBJUGx1Z2luKTogdm9pZCB7XHJcbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpZCBpcyByZXF1aXJlZCEnKVxyXG4gICAgaWYgKHR5cGVvZiBwbHVnaW4uaGFuZGxlICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdwbHVnaW4uaGFuZGxlIG11c3QgYmUgYSBmdW5jdGlvbiEnKVxyXG4gICAgaWYgKHRoaXMubGlzdC5oYXMoaWQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3RoaXMubmFtZX0gZHVwbGljYXRlIGlkOiAke2lkfSFgKVxyXG4gICAgdGhpcy5saXN0LnNldChpZCwgcGx1Z2luKVxyXG4gICAgaWYgKExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbikge1xyXG4gICAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMoTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luKSkge1xyXG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuZ2V0KExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbik/LnB1c2goaWQpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5JZE1hcC5zZXQoTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luLCBbaWRdKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1bnJlZ2lzdGVyIChwbHVnaW5OYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBsdWdpbklkTWFwLmhhcyhwbHVnaW5OYW1lKSkge1xyXG4gICAgICBjb25zdCBwbHVnaW5MaXN0ID0gdGhpcy5wbHVnaW5JZE1hcC5nZXQocGx1Z2luTmFtZSlcclxuICAgICAgcGx1Z2luTGlzdD8uZm9yRWFjaCgocGx1Z2luOiBzdHJpbmcpID0+IHtcclxuICAgICAgICB0aGlzLmxpc3QuZGVsZXRlKHBsdWdpbilcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE5hbWUgKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5uYW1lXHJcbiAgfVxyXG5cclxuICBnZXQgKGlkOiBzdHJpbmcpOiBJUGx1Z2luIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmxpc3QuZ2V0KGlkKVxyXG4gIH1cclxuXHJcbiAgZ2V0TGlzdCAoKTogSVBsdWdpbltdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5saXN0LnZhbHVlcygpXVxyXG4gIH1cclxuXHJcbiAgZ2V0SWRMaXN0ICgpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMubGlzdC5rZXlzKCldXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0Q3VycmVudFBsdWdpbk5hbWUgPSAobmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiB2b2lkID0+IHtcclxuICBMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW4gPSBuYW1lXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50UGx1Z2luTmFtZSA9ICgpOiBzdHJpbmcgfCBudWxsID0+IHtcclxuICByZXR1cm4gTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExpZmVjeWNsZVBsdWdpbnNcclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtcHJvbWlzZXMgKi9cclxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcidcclxuaW1wb3J0IGlucXVpcmVyLCB7IElucXVpcmVyIH0gZnJvbSAnaW5xdWlyZXInXHJcbmltcG9ydCB7IElQbHVnaW4sIElDb21tYW5kZXIsIElQaWNHbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgY29tbWFuZGVycyBmcm9tICcuLi9wbHVnaW5zL2NvbW1hbmRlcidcclxuaW1wb3J0IHsgZ2V0Q3VycmVudFBsdWdpbk5hbWUgfSBmcm9tICcuL0xpZmVjeWNsZVBsdWdpbnMnXHJcblxyXG5leHBvcnQgY2xhc3MgQ29tbWFuZGVyIGltcGxlbWVudHMgSUNvbW1hbmRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lID0gJ2NvbW1hbmRlcidcclxuICBzdGF0aWMgY3VycmVudFBsdWdpbjogc3RyaW5nIHwgbnVsbFxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdDogTWFwPHN0cmluZywgSVBsdWdpbj4gPSBuZXcgTWFwKClcclxuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbklkTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4gPSBuZXcgTWFwKClcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcblxyXG4gIHByb2dyYW06IENvbW1hbmRcclxuICBpbnF1aXJlcjogSW5xdWlyZXJcclxuXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLnByb2dyYW0gPSBuZXcgQ29tbWFuZCgpXHJcbiAgICB0aGlzLmlucXVpcmVyID0gaW5xdWlyZXJcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgfVxyXG5cclxuICBnZXROYW1lICgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubmFtZVxyXG4gIH1cclxuXHJcbiAgaW5pdCAoKTogdm9pZCB7XHJcbiAgICB0aGlzLnByb2dyYW1cclxuICAgICAgLnZlcnNpb24ocHJvY2Vzcy5lbnYuUElDR09fVkVSU0lPTiwgJy12LCAtLXZlcnNpb24nKVxyXG4gICAgICAub3B0aW9uKCctZCwgLS1kZWJ1ZycsICdkZWJ1ZyBtb2RlJywgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3R4LnNldENvbmZpZyh7XHJcbiAgICAgICAgICBkZWJ1ZzogdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIC5vcHRpb24oJy1zLCAtLXNpbGVudCcsICdzaWxlbnQgbW9kZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLmN0eC5zZXRDb25maWcoe1xyXG4gICAgICAgICAgc2lsZW50OiB0cnVlXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgLm9uKCdjb21tYW5kOionLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGBJbnZhbGlkIGNvbW1hbmQ6ICR7dGhpcy5wcm9ncmFtLmFyZ3Muam9pbignICcpfVxcblNlZSAtLWhlbHAgZm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMuYClcclxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcclxuICAgICAgfSlcclxuXHJcbiAgICAvLyBidWlsdC1pbiBjb21tYW5kc1xyXG4gICAgY29tbWFuZGVycyh0aGlzLmN0eClcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyIChpZDogc3RyaW5nLCBwbHVnaW46IElQbHVnaW4pOiB2b2lkIHtcclxuICAgIGlmICghaWQpIHRocm93IG5ldyBUeXBlRXJyb3IoJ25hbWUgaXMgcmVxdWlyZWQhJylcclxuICAgIGlmICh0eXBlb2YgcGx1Z2luLmhhbmRsZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcigncGx1Z2luLmhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24hJylcclxuICAgIGlmICh0aGlzLmxpc3QuaGFzKGlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLm5hbWV9IHBsdWdpbiBkdXBsaWNhdGUgaWQ6ICR7aWR9IWApXHJcbiAgICB0aGlzLmxpc3Quc2V0KGlkLCBwbHVnaW4pXHJcbiAgICBjb25zdCBjdXJyZW50UGx1Z2luTmFtZSA9IGdldEN1cnJlbnRQbHVnaW5OYW1lKClcclxuICAgIGlmIChjdXJyZW50UGx1Z2luTmFtZSAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMoY3VycmVudFBsdWdpbk5hbWUpKSB7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5JZE1hcC5nZXQoY3VycmVudFBsdWdpbk5hbWUpPy5wdXNoKGlkKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuc2V0KGN1cnJlbnRQbHVnaW5OYW1lLCBbaWRdKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1bnJlZ2lzdGVyIChwbHVnaW5OYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBsdWdpbklkTWFwLmhhcyhwbHVnaW5OYW1lKSkge1xyXG4gICAgICBjb25zdCBwbHVnaW5MaXN0ID0gdGhpcy5wbHVnaW5JZE1hcC5nZXQocGx1Z2luTmFtZSlcclxuICAgICAgcGx1Z2luTGlzdD8uZm9yRWFjaCgocGx1Z2luOiBzdHJpbmcpID0+IHtcclxuICAgICAgICB0aGlzLmxpc3QuZGVsZXRlKHBsdWdpbilcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRDb21tYW5kcyAoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdldExpc3QoKS5mb3JFYWNoKChpdGVtOiBJUGx1Z2luKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaXRlbS5oYW5kbGUodGhpcy5jdHgpXHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IChpZDogc3RyaW5nKTogSVBsdWdpbiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5saXN0LmdldChpZClcclxuICB9XHJcblxyXG4gIGdldExpc3QgKCk6IElQbHVnaW5bXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMubGlzdC52YWx1ZXMoKV1cclxuICB9XHJcblxyXG4gIGdldElkTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3Qua2V5cygpXVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29tbWFuZGVyXHJcbiIsImltcG9ydCBwbHVnaW5IYW5kbGVyIGZyb20gJy4vcGx1Z2luSGFuZGxlcidcclxuaW1wb3J0IGNvbmZpZyBmcm9tICcuL2NvbmZpZydcclxuaW1wb3J0IHVwbG9hZCBmcm9tICcuL3VwbG9hZCdcclxuaW1wb3J0IHNldHRpbmcgZnJvbSAnLi9zZXR0aW5nJ1xyXG5pbXBvcnQgdXNlIGZyb20gJy4vdXNlJ1xyXG5pbXBvcnQgcHJveHkgZnJvbSAnLi9wcm94eSdcclxuaW1wb3J0IGluaXQgZnJvbSAnLi9pbml0J1xyXG5pbXBvcnQgaTE4biBmcm9tICcuL2kxOG4nXHJcbmltcG9ydCB7IElQaWNHbyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKGN0eDogSVBpY0dvKTogdm9pZCA9PiB7XHJcbiAgY3R4LmNtZC5yZWdpc3RlcigncGx1Z2luSGFuZGxlcicsIHBsdWdpbkhhbmRsZXIpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcignY29uZmlnJywgY29uZmlnKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3NldHRpbmcnLCBzZXR0aW5nKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3VwbG9hZCcsIHVwbG9hZClcclxuICBjdHguY21kLnJlZ2lzdGVyKCd1c2UnLCB1c2UpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcigncHJveHknLCBwcm94eSlcclxuICBjdHguY21kLnJlZ2lzdGVyKCdpbml0JywgaW5pdClcclxuICBjdHguY21kLnJlZ2lzdGVyKCdpMThuJywgaTE4bilcclxufVxyXG4iLCJleHBvcnQgZW51bSBJTG9nVHlwZSB7XHJcbiAgc3VjY2VzcyA9ICdzdWNjZXNzJyxcclxuICBpbmZvID0gJ2luZm8nLFxyXG4gIHdhcm4gPSAnd2FybicsXHJcbiAgZXJyb3IgPSAnZXJyb3InXHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0aGVzZSBldmVudHMgd2lsbCBiZSBjYXRjaGVkIGJ5IHVzZXJzXHJcbiAqL1xyXG5leHBvcnQgZW51bSBJQnVpbGRJbkV2ZW50IHtcclxuICBVUExPQURfUFJPR1JFU1MgPSAndXBsb2FkUHJvZ3Jlc3MnLFxyXG4gIEZBSUxFRCA9ICdmYWlsZWQnLFxyXG4gIEJFRk9SRV9UUkFOU0ZPUk0gPSAnYmVmb3JlVHJhbnNmb3JtJyxcclxuICBCRUZPUkVfVVBMT0FEID0gJ2JlZm9yZVVwbG9hZCcsXHJcbiAgQUZURVJfVVBMT0FEID0gJ2FmdGVyVXBsb2FkJyxcclxuICBGSU5JU0hFRCA9ICdmaW5pc2hlZCcsXHJcbiAgSU5TVEFMTCA9ICdpbnN0YWxsJyxcclxuICBVTklOU1RBTEwgPSAndW5pbnN0YWxsJyxcclxuICBVUERBVEUgPSAndXBkYXRlJyxcclxuICBOT1RJRklDQVRJT04gPSAnbm90aWZpY2F0aW9uJ1xyXG59XHJcblxyXG4vKipcclxuICogdGhlc2UgZXZlbnRzIHdpbGwgYmUgY2F0Y2hlZCBvbmx5IGJ5IHBpY2dvXHJcbiAqL1xyXG5leHBvcnQgZW51bSBJQnVzRXZlbnQge1xyXG4gIENPTkZJR19DSEFOR0UgPSAnQ09ORklHX0NIQU5HRSdcclxufVxyXG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcydcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgdXRpbCBmcm9tICd1dGlsJ1xyXG5pbXBvcnQgeyBJTG9nVHlwZSB9IGZyb20gJy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7XHJcbiAgSUxvZ0FyZ3ZUeXBlLFxyXG4gIElMb2dBcmd2VHlwZVdpdGhFcnJvcixcclxuICBVbmRlZmluYWJsZSxcclxuICBJTG9nQ29sb3IsXHJcbiAgSUxvZ2dlcixcclxuICBJUGljR29cclxufSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgZm9yY2VOdW1iZXIsIGlzRGV2IH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uJ1xyXG5cclxuZXhwb3J0IGNsYXNzIExvZ2dlciBpbXBsZW1lbnRzIElMb2dnZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbGV2ZWwgPSB7XHJcbiAgICBbSUxvZ1R5cGUuc3VjY2Vzc106ICdncmVlbicsXHJcbiAgICBbSUxvZ1R5cGUuaW5mb106ICdibHVlJyxcclxuICAgIFtJTG9nVHlwZS53YXJuXTogJ3llbGxvdycsXHJcbiAgICBbSUxvZ1R5cGUuZXJyb3JdOiAncmVkJ1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgbG9nTGV2ZWwhOiBzdHJpbmdcclxuICBwcml2YXRlIGxvZ1BhdGghOiBzdHJpbmdcclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUxvZyAodHlwZTogSUxvZ1R5cGUsIC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcclxuICAgIC8vIGNoZWNrIGNvbmZpZy5zaWxlbnRcclxuICAgIGlmICghdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdzaWxlbnQnKSkge1xyXG4gICAgICBjb25zdCBsb2dIZWFkZXIgPSBjaGFsa1t0aGlzLmxldmVsW3R5cGVdIGFzIElMb2dDb2xvcl0oYFtQaWNMaXN0ICR7dHlwZS50b1VwcGVyQ2FzZSgpfV06YClcclxuICAgICAgY29uc29sZS5sb2cobG9nSGVhZGVyLCAuLi5tc2cpXHJcbiAgICAgIHRoaXMubG9nTGV2ZWwgPSB0aGlzLmN0eC5nZXRDb25maWcoJ3NldHRpbmdzLmxvZ0xldmVsJylcclxuICAgICAgdGhpcy5sb2dQYXRoID0gdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdzZXR0aW5ncy5sb2dQYXRoJykgfHwgcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICcuL3BpY2xpc3QubG9nJylcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gZml4IGxvZyBmaWxlIGlzIHRvbyBsYXJnZSwgbm93IHRoZSBsb2cgZmlsZSdzIGRlZmF1bHQgc2l6ZSBpcyAxMCBNQlxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNoZWNrTG9nRmlsZUlzTGFyZ2UodGhpcy5sb2dQYXRoKVxyXG4gICAgICAgICAgaWYgKHJlc3VsdC5pc0xhcmdlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdhcm5pbmdNc2cgPSBgTG9nIGZpbGUgaXMgdG9vIGxhcmdlICg+ICR7KHJlc3VsdC5sb2dGaWxlU2l6ZUxpbWl0ISkgLyAxMDI0IC8gMTAyNCB8fCAnMTAnfSBNQiksIHJlY3JlYXRlIGxvZyBmaWxlYFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ1tQaWNMaXN0IFdBUk5dOicpLCB3YXJuaW5nTXNnKVxyXG4gICAgICAgICAgICB0aGlzLnJlY3JlYXRlTG9nRmlsZSh0aGlzLmxvZ1BhdGgpXHJcbiAgICAgICAgICAgIG1zZy51bnNoaWZ0KHdhcm5pbmdNc2cpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZVdyaXRlTG9nKHRoaXMubG9nUGF0aCwgdHlwZSwgLi4ubXNnKVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIC8vIHdoeT8/P1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignW1BpY0xpc3QgRXJyb3JdIG9uIGNoZWNraW5nIGxvZyBmaWxlIHNpemUnLCBlKVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tMb2dGaWxlSXNMYXJnZSAobG9nUGF0aDogc3RyaW5nKToge1xyXG4gICAgaXNMYXJnZTogYm9vbGVhblxyXG4gICAgbG9nRmlsZVNpemU/OiBudW1iZXJcclxuICAgIGxvZ0ZpbGVTaXplTGltaXQ/OiBudW1iZXJcclxuICB9IHtcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvZ1BhdGgpKSB7XHJcbiAgICAgIGNvbnN0IGxvZ0ZpbGVTaXplID0gZnMuc3RhdFN5bmMobG9nUGF0aCkuc2l6ZVxyXG4gICAgICBjb25zdCBsb2dGaWxlU2l6ZUxpbWl0ID0gZm9yY2VOdW1iZXIodGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPG51bWJlcj4+KCdzZXR0aW5ncy5sb2dGaWxlU2l6ZUxpbWl0JykgfHwgMTApICogMTAyNCAqIDEwMjQgLy8gMTAgTUIgZGVmYXVsdFxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGlzTGFyZ2U6IGxvZ0ZpbGVTaXplID4gbG9nRmlsZVNpemVMaW1pdCxcclxuICAgICAgICBsb2dGaWxlU2l6ZSxcclxuICAgICAgICBsb2dGaWxlU2l6ZUxpbWl0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlzTGFyZ2U6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY3JlYXRlTG9nRmlsZSAobG9nUGF0aDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2dQYXRoKSkge1xyXG4gICAgICBmcy51bmxpbmtTeW5jKGxvZ1BhdGgpXHJcbiAgICAgIGZzLmNyZWF0ZUZpbGVTeW5jKGxvZ1BhdGgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVdyaXRlTG9nIChsb2dQYXRoOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgLi4ubXNnOiBJTG9nQXJndlR5cGVXaXRoRXJyb3JbXSk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMuY2hlY2tMb2dMZXZlbCh0eXBlLCB0aGlzLmxvZ0xldmVsKSkge1xyXG4gICAgICAgIGxldCBsb2cgPSBgJHtkYXlqcygpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpfSBbUGljTGlzdCAke3R5cGUudG9VcHBlckNhc2UoKX1dIGBcclxuICAgICAgICBtc2cuZm9yRWFjaCgoaXRlbTogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEVycm9yICYmIHR5cGUgPT09ICdlcnJvcicpIHtcclxuICAgICAgICAgICAgbG9nICs9IGBcXG4tLS0tLS1FcnJvciBTdGFjayBCZWdpbi0tLS0tLVxcbiR7dXRpbC5mb3JtYXQoaXRlbT8uc3RhY2spfVxcbi0tLS0tLS1FcnJvciBTdGFjayBFbmQtLS0tLS0tIGBcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICBpdGVtID0gSlNPTi5zdHJpbmdpZnkoaXRlbSwgbnVsbCwgMilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsb2cgKz0gYCR7aXRlbSBhcyBzdHJpbmd9IGBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIGxvZyArPSAnXFxuJ1xyXG4gICAgICAgIC8vIEEgc3luY2hyb25pemVkIGFwcHJvYWNoIHRvIGF2b2lkIGxvZyBtc2cgc2VxdWVuY2UgZXJyb3JzXHJcbiAgICAgICAgZnMuYXBwZW5kRmlsZVN5bmMobG9nUGF0aCwgbG9nKVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tQaWNMaXN0IEVycm9yXSBvbiB3cml0aW5nIGxvZyBmaWxlJywgZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tMb2dMZXZlbCAodHlwZTogc3RyaW5nLCBsZXZlbDogdW5kZWZpbmVkIHwgc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcclxuICAgIGlmIChsZXZlbCA9PT0gdW5kZWZpbmVkIHx8IGxldmVsID09PSAnYWxsJykge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGV2ZWwpKSB7XHJcbiAgICAgIHJldHVybiBsZXZlbC5zb21lKChpdGVtOiBzdHJpbmcpID0+IChpdGVtID09PSB0eXBlIHx8IGl0ZW0gPT09ICdhbGwnKSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0eXBlID09PSBsZXZlbFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3VjY2VzcyAoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLnN1Y2Nlc3MsIC4uLm1zZylcclxuICB9XHJcblxyXG4gIGluZm8gKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlW10pOiB2b2lkIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5pbmZvLCAuLi5tc2cpXHJcbiAgfVxyXG5cclxuICBlcnJvciAoLi4ubXNnOiBJTG9nQXJndlR5cGVXaXRoRXJyb3JbXSk6IHZvaWQge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLmVycm9yLCAuLi5tc2cpXHJcbiAgfVxyXG5cclxuICB3YXJuICguLi5tc2c6IElMb2dBcmd2VHlwZVtdKTogdm9pZCB7XHJcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUud2FybiwgLi4ubXNnKVxyXG4gIH1cclxuXHJcbiAgZGVidWcgKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlW10pOiB2b2lkIHtcclxuICAgIGlmIChpc0RldigpKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLmluZm8sIC4uLm1zZylcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExvZ2dlclxyXG4iLCJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnXHJcbmltcG9ydCB7IElCdWlsZEluV2F0ZXJNYXJrT3B0aW9ucywgSUJ1aWxkSW5Db21wcmVzc09wdGlvbnMsIElMaWZlY3ljbGVQbHVnaW5zLCBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbywgSVBpY0dvLCBJUGx1Z2luLCBVbmRlZmluYWJsZSwgSUltZ0luZm8gfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgZ2V0VVJMRmlsZSwgaGFuZGxlVXJsRW5jb2RlLCBpbWFnZVByb2Nlc3MsIGlzVXJsLCBuZWVkQ29tcHJlc3MsIG5lZWRBZGRXYXRlcm1hcmssIGltYWdlQWRkV2F0ZXJNYXJrLCByZW1vdmVFeGlmLCByZW5hbWVGaWxlTmFtZVdpdGhDdXN0b21TdHJpbmcgfSBmcm9tICcuLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi4vdXRpbHMvY3JlYXRlQ29udGV4dCdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnXHJcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IGhlaWNDb252ZXJ0IGZyb20gJ2hlaWMtY29udmVydCdcclxuXHJcbmV4cG9ydCBjbGFzcyBMaWZlY3ljbGUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBwcml2YXRlIHJlYWRvbmx5IHR0Zkxpbms6IHN0cmluZyA9ICdodHRwczovL3JlbGVhc2UucGljbGlzdC5jbi9zaW1oZWkudHRmJ1xyXG4gIHR0ZlBhdGg6IHN0cmluZ1xyXG5cclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHN1cGVyKClcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICdwaWNsaXN0VGVtcCcpXHJcbiAgICBmcy5lbXB0eURpclN5bmModGVtcEZpbGVQYXRoKVxyXG4gICAgdGhpcy50dGZQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCAnYXNzZXRzJywgJ3NpbWhlaS50dGYnKVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZG93bmxvYWRUVEYgKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3Qgb3V0cHV0RGlyID0gcGF0aC5kaXJuYW1lKHRoaXMudHRmUGF0aClcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhvdXRwdXREaXIpKSB7XHJcbiAgICAgIGZzLm1rZGlyU3luYyhvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXHJcbiAgICB9XHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy50dGZQYXRoKSkge1xyXG4gICAgICB0aGlzLmN0eC5sb2cuaW5mbygnRG93bmxvYWQgdHRmIGZpbGUuJylcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBheGlvcy5nZXQodGhpcy50dGZMaW5rLCB7IHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyB9KVxyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy50dGZQYXRoLCByZXMuZGF0YSlcclxuICAgICAgICB0aGlzLmN0eC5sb2cuaW5mbygnRG93bmxvYWQgdHRmIGZpbGUgc3VjY2Vzcy4nKVxyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcignRG93bmxvYWQgdHRmIGZpbGUgZmFpbGVkLicpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBzdGFydCAoaW5wdXQ6IGFueVtdKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIC8vIGVuc3VyZSBldmVyeSB1cGxvYWQgcHJvY2VzcyBoYXMgYW4gdW5pcXVlIGNvbnRleHRcclxuICAgIGNvbnN0IGN0eCA9IGNyZWF0ZUNvbnRleHQodGhpcy5jdHgpXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBpbWFnZXMgaW5wdXRcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgbXVzdCBiZSBhbiBhcnJheS4nKVxyXG4gICAgICB9XHJcbiAgICAgIGN0eC5pbnB1dCA9IGlucHV0XHJcbiAgICAgIGN0eC5yYXdJbnB1dFBhdGggPSBbXSBhcyBzdHJpbmdbXVxyXG4gICAgICBjdHgucmF3SW5wdXQgPSBjbG9uZURlZXAoaW5wdXQpXHJcbiAgICAgIGN0eC5vdXRwdXQgPSBbXSBhcyBJSW1nSW5mb1tdXHJcbiAgICAgIGNvbnN0IGNvbXByZXNzT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SUJ1aWxkSW5Db21wcmVzc09wdGlvbnM+KCdidWlsZEluLmNvbXByZXNzJylcclxuICAgICAgY29uc3Qgd2F0ZXJtYXJrT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SUJ1aWxkSW5XYXRlck1hcmtPcHRpb25zPignYnVpbGRJbi53YXRlcm1hcmsnKVxyXG4gICAgICBpZiAoY29tcHJlc3NPcHRpb25zIHx8IHdhdGVybWFya09wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICdwaWNsaXN0VGVtcCcpXHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBGaWxlUGF0aCkpIHtcclxuICAgICAgICAgIGZzLm1rZGlyU3luYyh0ZW1wRmlsZVBhdGgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHdhdGVybWFya01zZyA9ICdBZGQgd2F0ZXJtYXJrIHRvIGltYWdlJ1xyXG4gICAgICAgIGNvbnN0IGNvbXByZXNzTXNnID0gJ0NvbXByZXNzIG9yIGNvbnZlcnQgaW1hZ2UnXHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGN0eC5pbnB1dC5tYXAoYXN5bmMgKGl0ZW06IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgbGV0IGluZm86IElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvXHJcbiAgICAgICAgICBpZiAoaXNVcmwoaXRlbSkpIHtcclxuICAgICAgICAgICAgY3R4LnJhd0lucHV0UGF0aCFbaW5kZXhdID0gaXRlbVxyXG4gICAgICAgICAgICBpbmZvID0gYXdhaXQgZ2V0VVJMRmlsZShpdGVtLCBjdHgpXHJcbiAgICAgICAgICAgIGlmIChpbmZvLnN1Y2Nlc3MgJiYgaW5mby5idWZmZXIpIHtcclxuICAgICAgICAgICAgICBsZXQgdHJhbnNmb3JtZWRCdWZmZXJcclxuICAgICAgICAgICAgICBpZiAobmVlZEFkZFdhdGVybWFyayh3YXRlcm1hcmtPcHRpb25zLCBpbmZvLmV4dG5hbWUgPz8gJycpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkb3dubG9hZFRURlJldCA9IGF3YWl0IHRoaXMuZG93bmxvYWRUVEYoKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFkb3dubG9hZFRURlJldCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmN0eC5sb2cud2FybignRG93bmxvYWQgdHRmIGZpbGUgZmFpbGVkLCBza2lwIGFkZCB3YXRlcm1hcmsuJylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGN0eC5sb2cuaW5mbyh3YXRlcm1hcmtNc2cpXHJcbiAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQnVmZmVyID0gYXdhaXQgaW1hZ2VBZGRXYXRlck1hcmsoaW5mby5idWZmZXIsIHdhdGVybWFya09wdGlvbnMsIHRoaXMudHRmUGF0aClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKG5lZWRDb21wcmVzcyhjb21wcmVzc09wdGlvbnMsIGluZm8uZXh0bmFtZSA/PyAnJykpIHtcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cuaW5mbyhjb21wcmVzc01zZylcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQnVmZmVyID0gYXdhaXQgaW1hZ2VQcm9jZXNzKHRyYW5zZm9ybWVkQnVmZmVyID8/IGluZm8uYnVmZmVyLCBjb21wcmVzc09wdGlvbnMsIGluZm8uZXh0bmFtZSA/PyAnJylcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1lZEJ1ZmZlciAmJiBjb21wcmVzc09wdGlvbnM/LmlzUmVtb3ZlRXhpZikge1xyXG4gICAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKCdSZW1vdmUgZXhpZiBpbmZvLicpXHJcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZEJ1ZmZlciA9IGF3YWl0IHJlbW92ZUV4aWYoaW5mby5idWZmZXIsIGluZm8uZXh0bmFtZSA/PyAnJylcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVkQnVmZmVyKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmV3RXh0XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcHJlc3NPcHRpb25zPy5pc0NvbnZlcnQpIHtcclxuICAgICAgICAgICAgICAgICAgbmV3RXh0ID0gY29tcHJlc3NPcHRpb25zPy5jb252ZXJ0Rm9ybWF0ID8/ICdqcGcnXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBuZXdFeHQgPSBpbmZvLmV4dG5hbWUgPz8gJydcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG5ld0V4dCA9IG5ld0V4dC5zdGFydHNXaXRoKCcuJykgPyBuZXdFeHQgOiBgLiR7bmV3RXh0fWBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBGaWxlID0gcGF0aC5qb2luKHRlbXBGaWxlUGF0aCwgYCR7aW5mby5maWxlTmFtZVxyXG4gICAgICAgICAgICAgICAgICA/IGAke3BhdGguYmFzZW5hbWUoaW5mby5maWxlTmFtZSwgcGF0aC5leHRuYW1lKGluZm8uZmlsZU5hbWUpKX0ke25ld0V4dH1gXHJcbiAgICAgICAgICAgICAgICAgIDogbmV3IERhdGUoKS5nZXRUaW1lKCl9JHtuZXdFeHR9YClcclxuICAgICAgICAgICAgICAgIGN0eC5yYXdJbnB1dFBhdGghW2luZGV4XSA9IHBhdGguam9pbihwYXRoLmRpcm5hbWUoaXRlbSksIHBhdGguYmFzZW5hbWUodGVtcEZpbGUpKVxyXG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0ZW1wRmlsZSwgdHJhbnNmb3JtZWRCdWZmZXIpXHJcbiAgICAgICAgICAgICAgICBjdHguaW5wdXRbaW5kZXhdID0gdGVtcEZpbGVcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGluZm8ucmVhc29uKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgdHJhbnNmb3JtZWRCdWZmZXJcclxuICAgICAgICAgICAgY3R4LnJhd0lucHV0UGF0aCFbaW5kZXhdID0gaXRlbVxyXG4gICAgICAgICAgICBpZiAobmVlZEFkZFdhdGVybWFyayh3YXRlcm1hcmtPcHRpb25zLCBwYXRoLmV4dG5hbWUoaXRlbSkpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZG93bmxvYWRUVEZSZXQgPSBhd2FpdCB0aGlzLmRvd25sb2FkVFRGKClcclxuICAgICAgICAgICAgICBpZiAoIWRvd25sb2FkVFRGUmV0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC5sb2cud2FybignRG93bmxvYWQgdHRmIGZpbGUgZmFpbGVkLCBza2lwIGFkZCB3YXRlcm1hcmsuJylcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKHdhdGVybWFya01zZylcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQnVmZmVyID0gYXdhaXQgaW1hZ2VBZGRXYXRlck1hcmsoZnMucmVhZEZpbGVTeW5jKGl0ZW0pLCB3YXRlcm1hcmtPcHRpb25zLCB0aGlzLnR0ZlBhdGgpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChuZWVkQ29tcHJlc3MoY29tcHJlc3NPcHRpb25zLCBwYXRoLmV4dG5hbWUoaXRlbSkpKSB7XHJcbiAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKGNvbXByZXNzTXNnKVxyXG4gICAgICAgICAgICAgIGlmIChwYXRoLmV4dG5hbWUoaXRlbSkgPT09ICcuaGVpYycgfHwgcGF0aC5leHRuYW1lKGl0ZW0pID09PSAnLmhlaWYnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBoZWljQnVmZmVyID0gZnMucmVhZEZpbGVTeW5jKGl0ZW0pXHJcbiAgICAgICAgICAgICAgICBjb25zdCBoZWljUmVzdWx0ID0gYXdhaXQgaGVpY0NvbnZlcnQoe1xyXG4gICAgICAgICAgICAgICAgICBidWZmZXI6IGhlaWNCdWZmZXIsXHJcbiAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ0pQRUcnLFxyXG4gICAgICAgICAgICAgICAgICBxdWFsaXR5OiAxXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcEhlaWNDb252ZXJ0RmlsZSA9IHBhdGguam9pbih0ZW1wRmlsZVBhdGgsIGAke3BhdGguYmFzZW5hbWUoaXRlbSwgcGF0aC5leHRuYW1lKGl0ZW0pKX0uanBnYClcclxuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmModGVtcEhlaWNDb252ZXJ0RmlsZSwgQnVmZmVyLmZyb20oaGVpY1Jlc3VsdCkpXHJcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZEJ1ZmZlciA9IGF3YWl0IGltYWdlUHJvY2Vzcyhmcy5yZWFkRmlsZVN5bmModGVtcEhlaWNDb252ZXJ0RmlsZSksIGNvbXByZXNzT3B0aW9ucywgJy5qcGcnKVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZEJ1ZmZlciA9IGF3YWl0IGltYWdlUHJvY2Vzcyh0cmFuc2Zvcm1lZEJ1ZmZlciA/PyBmcy5yZWFkRmlsZVN5bmMoaXRlbSksIGNvbXByZXNzT3B0aW9ucywgcGF0aC5leHRuYW1lKGl0ZW0pKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXRyYW5zZm9ybWVkQnVmZmVyICYmIGNvbXByZXNzT3B0aW9ucz8uaXNSZW1vdmVFeGlmKSB7XHJcbiAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKCdSZW1vdmUgZXhpZiBpbmZvLicpXHJcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZWRCdWZmZXIgPSBhd2FpdCByZW1vdmVFeGlmKGZzLnJlYWRGaWxlU3luYyhpdGVtKSwgcGF0aC5leHRuYW1lKGl0ZW0pKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lZEJ1ZmZlcikge1xyXG4gICAgICAgICAgICAgIGxldCBuZXdFeHRcclxuICAgICAgICAgICAgICBpZiAoY29tcHJlc3NPcHRpb25zPy5pc0NvbnZlcnQpIHtcclxuICAgICAgICAgICAgICAgIG5ld0V4dCA9IGNvbXByZXNzT3B0aW9ucz8uY29udmVydEZvcm1hdCA/PyAnanBnJ1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBuZXdFeHQgPSBwYXRoLmV4dG5hbWUoaXRlbSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgbmV3RXh0ID0gbmV3RXh0LnN0YXJ0c1dpdGgoJy4nKSA/IG5ld0V4dCA6IGAuJHtuZXdFeHR9YFxyXG4gICAgICAgICAgICAgIGNvbnN0IHRlbXBGaWxlID0gcGF0aC5qb2luKHRlbXBGaWxlUGF0aCwgYCR7cGF0aC5iYXNlbmFtZShpdGVtLCBwYXRoLmV4dG5hbWUoaXRlbSkpfSR7bmV3RXh0fWApXHJcbiAgICAgICAgICAgICAgY3R4LnJhd0lucHV0UGF0aCFbaW5kZXhdID0gcGF0aC5qb2luKHBhdGguZGlybmFtZShpdGVtKSwgYCR7cGF0aC5iYXNlbmFtZShpdGVtLCBwYXRoLmV4dG5hbWUoaXRlbSkpfSR7bmV3RXh0fWApXHJcbiAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0ZW1wRmlsZSwgdHJhbnNmb3JtZWRCdWZmZXIpXHJcbiAgICAgICAgICAgICAgY3R4LmlucHV0W2luZGV4XSA9IHRlbXBGaWxlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY3R4LmlucHV0KSB7XHJcbiAgICAgICAgICBjdHgucmF3SW5wdXRQYXRoLnB1c2goaXRlbSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gbGlmZWN5Y2xlIG1haW5cclxuICAgICAgYXdhaXQgdGhpcy5iZWZvcmVUcmFuc2Zvcm0oY3R4KVxyXG4gICAgICBhd2FpdCB0aGlzLmRvVHJhbnNmb3JtKGN0eClcclxuICAgICAgY29uc3QgcmVuYW1lQ29uZmlnID0gY3R4LmdldENvbmZpZzxhbnk+KCdidWlsZEluLnJlbmFtZScpIHx8IHt9XHJcbiAgICAgIGlmIChyZW5hbWVDb25maWcuZW5hYmxlKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gcmVuYW1lQ29uZmlnLmZvcm1hdCB8fCAne2ZpbGVuYW1lfSdcclxuICAgICAgICBjdHgub3V0cHV0ID0gY3R4Lm91dHB1dC5tYXAoKGl0ZW06IElJbWdJbmZvLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZmlsZU5hbWUgPSBpdGVtLmZpbGVOYW1lXHJcbiAgICAgICAgICBpZiAoZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGZpbGVOYW1lID0gcmVuYW1lRmlsZU5hbWVXaXRoQ3VzdG9tU3RyaW5nKGN0eC5yYXdJbnB1dFBhdGghW2luZGV4XSwgZm9ybWF0KVxyXG4gICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2UoL1xcLysvZywgJy8nKVxyXG4gICAgICAgICAgICBpZiAoZmlsZU5hbWUuc2xpY2UoLTEpID09PSAnLycpIHtcclxuICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lICsgaW5kZXgudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpdGVtLmZpbGVOYW1lID0gZmlsZU5hbWVcclxuICAgICAgICAgIHJldHVybiBpdGVtXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICBhd2FpdCB0aGlzLmJlZm9yZVVwbG9hZChjdHgpXHJcbiAgICAgIGF3YWl0IHRoaXMuZG9VcGxvYWQoY3R4KVxyXG4gICAgICBjdHguaW5wdXQgPSBjdHgucmF3SW5wdXRcclxuICAgICAgYXdhaXQgdGhpcy5hZnRlclVwbG9hZChjdHgpXHJcbiAgICAgIHJldHVybiBjdHhcclxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICBjdHgubG9nLndhcm4oSUJ1aWxkSW5FdmVudC5GQUlMRUQpXHJcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAtMSlcclxuICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsIGUpXHJcbiAgICAgIGN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgaWYgKGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ2RlYnVnJykpIHtcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGN0eFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBiZWZvcmVUcmFuc2Zvcm0gKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAwKVxyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5CRUZPUkVfVFJBTlNGT1JNLCBjdHgpXHJcbiAgICBjdHgubG9nLmluZm8oJ0JlZm9yZSB0cmFuc2Zvcm0nKVxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVQbHVnaW5zKGN0eC5oZWxwZXIuYmVmb3JlVHJhbnNmb3JtUGx1Z2lucywgY3R4KVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBkb1RyYW5zZm9ybSAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIDMwKVxyXG4gICAgY29uc3QgdHlwZSA9IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC50cmFuc2Zvcm1lcicpIHx8ICdwYXRoJ1xyXG4gICAgbGV0IGN1cnJlbnRUcmFuc2Zvcm1lciA9IHR5cGVcclxuICAgIGxldCB0cmFuc2Zvcm1lciA9IGN0eC5oZWxwZXIudHJhbnNmb3JtZXIuZ2V0KHR5cGUpXHJcbiAgICBpZiAoIXRyYW5zZm9ybWVyKSB7XHJcbiAgICAgIHRyYW5zZm9ybWVyID0gY3R4LmhlbHBlci50cmFuc2Zvcm1lci5nZXQoJ3BhdGgnKVxyXG4gICAgICBjdXJyZW50VHJhbnNmb3JtZXIgPSAncGF0aCdcclxuICAgICAgY3R4LmxvZy53YXJuKGBDYW4ndCBmaW5kIHRyYW5zZm9ybWVyIC0gJHt0eXBlfSwgc3dpdGNoIHRvIGRlZmF1bHQgdHJhbnNmb3JtZXIgLSBwYXRoYClcclxuICAgIH1cclxuICAgIGN0eC5sb2cuaW5mbyhgVHJhbnNmb3JtaW5nLi4uIEN1cnJlbnQgdHJhbnNmb3JtZXIgaXMgWyR7Y3VycmVudFRyYW5zZm9ybWVyfV1gKVxyXG4gICAgYXdhaXQgdHJhbnNmb3JtZXI/LmhhbmRsZShjdHgpXHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGJlZm9yZVVwbG9hZCAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIDYwKVxyXG4gICAgY3R4LmxvZy5pbmZvKCdCZWZvcmUgdXBsb2FkJylcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuQkVGT1JFX1VQTE9BRCwgY3R4KVxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVQbHVnaW5zKGN0eC5oZWxwZXIuYmVmb3JlVXBsb2FkUGx1Z2lucywgY3R4KVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBkb1VwbG9hZCAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgbGV0IHR5cGUgPSBjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdwaWNCZWQudXBsb2FkZXInKSB8fCBjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdwaWNCZWQuY3VycmVudCcpIHx8ICdzbW1zJ1xyXG4gICAgbGV0IHVwbG9hZGVyID0gY3R4LmhlbHBlci51cGxvYWRlci5nZXQodHlwZSlcclxuICAgIGxldCBjdXJyZW50VHJhbnNmb3JtZXIgPSB0eXBlXHJcbiAgICBpZiAoIXVwbG9hZGVyKSB7XHJcbiAgICAgIHR5cGUgPSAnc21tcydcclxuICAgICAgY3VycmVudFRyYW5zZm9ybWVyID0gJ3NtbXMnXHJcbiAgICAgIHVwbG9hZGVyID0gY3R4LmhlbHBlci51cGxvYWRlci5nZXQoJ3NtbXMnKVxyXG4gICAgICBjdHgubG9nLndhcm4oYENhbid0IGZpbmQgdXBsb2FkZXIgLSAke3R5cGV9LCBzd2l0Y2ggdG8gZGVmYXVsdCB1cGxvYWRlciAtIHNtbXNgKVxyXG4gICAgfVxyXG4gICAgY3R4LmxvZy5pbmZvKGBVcGxvYWRpbmcuLi4gQ3VycmVudCB1cGxvYWRlciBpcyBbJHtjdXJyZW50VHJhbnNmb3JtZXJ9XWApXHJcbiAgICBhd2FpdCB1cGxvYWRlcj8uaGFuZGxlKGN0eClcclxuICAgIGZvciAoY29uc3Qgb3V0cHV0SW1nIG9mIGN0eC5vdXRwdXQpIHtcclxuICAgICAgb3V0cHV0SW1nLnR5cGUgPSB0eXBlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGFmdGVyVXBsb2FkIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LkFGVEVSX1VQTE9BRCwgY3R4KVxyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIDEwMClcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlUGx1Z2lucyhjdHguaGVscGVyLmFmdGVyVXBsb2FkUGx1Z2lucywgY3R4KVxyXG4gICAgbGV0IG1zZyA9ICcnXHJcbiAgICBjb25zdCBsZW5ndGggPSBjdHgub3V0cHV0Lmxlbmd0aFxyXG4gICAgY29uc3QgaXNFbmNvZGVPdXRwdXRVUkwgPSBjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPGJvb2xlYW4+Pignc2V0dGluZ3MuZW5jb2RlT3V0cHV0VVJMJykgPT09IHRydWVcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHR5cGVvZiBjdHgub3V0cHV0W2ldLmltZ1VybCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBtc2cgKz0gaXNFbmNvZGVPdXRwdXRVUkwgPyBoYW5kbGVVcmxFbmNvZGUoY3R4Lm91dHB1dFtpXS5pbWdVcmwhKSA6IGN0eC5vdXRwdXRbaV0uaW1nVXJsIVxyXG4gICAgICAgIGlmIChpICE9PSBsZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICBtc2cgKz0gJ1xcbidcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZGVsZXRlIGN0eC5vdXRwdXRbaV0uYmFzZTY0SW1hZ2VcclxuICAgICAgZGVsZXRlIGN0eC5vdXRwdXRbaV0uYnVmZmVyXHJcbiAgICB9XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LkZJTklTSEVELCBjdHgpXHJcbiAgICBjdHgubG9nLnN1Y2Nlc3MoYFxcbiR7bXNnfWApXHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVBsdWdpbnMgKGxpZmVDeWNsZVBsdWdpbnM6IElMaWZlY3ljbGVQbHVnaW5zLCBjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBjb25zdCBwbHVnaW5zID0gbGlmZUN5Y2xlUGx1Z2lucy5nZXRMaXN0KClcclxuICAgIGNvbnN0IHBsdWdpbk5hbWVzID0gbGlmZUN5Y2xlUGx1Z2lucy5nZXRJZExpc3QoKVxyXG4gICAgY29uc3QgbGlmZUN5Y2xlTmFtZSA9IGxpZmVDeWNsZVBsdWdpbnMuZ2V0TmFtZSgpXHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwbHVnaW5zLm1hcChhc3luYyAocGx1Z2luOiBJUGx1Z2luLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY3R4LmxvZy5pbmZvKGAke2xpZmVDeWNsZU5hbWV9OiAke3BsdWdpbk5hbWVzW2luZGV4XX0gcnVubmluZ2ApXHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLmhhbmRsZShjdHgpXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjdHgubG9nLmVycm9yKGAke2xpZmVDeWNsZU5hbWV9OiAke3BsdWdpbk5hbWVzW2luZGV4XX0gZXJyb3JgKVxyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgfSkpXHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaWZlY3ljbGVcclxuIiwiaW1wb3J0IHsgSVBpY0dvIH0gZnJvbSAnLi4vdHlwZXMnXHJcblxyXG4vKipcclxuICogY3JlYXRlIGFuIHVuaXF1ZSBjb250ZXh0IGZvciBlYWNoIHVwbG9hZCBwcm9jZXNzXHJcbiAqIEBwYXJhbSBjdHhcclxuICovXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVDb250ZXh0ID0gKGN0eDogSVBpY0dvKTogSVBpY0dvID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgY29uZmlnUGF0aDogY3R4LmNvbmZpZ1BhdGgsXHJcbiAgICBiYXNlRGlyOiBjdHguYmFzZURpcixcclxuICAgIGxvZzogY3R4LmxvZyxcclxuICAgIGNtZDogY3R4LmNtZCxcclxuICAgIG91dHB1dDogW10sXHJcbiAgICBpbnB1dDogW10sXHJcbiAgICByYXdJbnB1dDogW10sXHJcbiAgICBwbHVnaW5Mb2FkZXI6IGN0eC5wbHVnaW5Mb2FkZXIsXHJcbiAgICBwbHVnaW5IYW5kbGVyOiBjdHgucGx1Z2luSGFuZGxlcixcclxuICAgIFJlcXVlc3Q6IGN0eC5SZXF1ZXN0LFxyXG4gICAgaGVscGVyOiBjdHguaGVscGVyLFxyXG4gICAgVkVSU0lPTjogY3R4LlZFUlNJT04sXHJcbiAgICBHVUlfVkVSU0lPTjogY3R4LkdVSV9WRVJTSU9OLFxyXG4gICAgcmVxdWVzdDogY3R4LnJlcXVlc3QsXHJcbiAgICBpMThuOiBjdHguaTE4bixcclxuICAgIGdldENvbmZpZzogY3R4LmdldENvbmZpZy5iaW5kKGN0eCksXHJcbiAgICBzYXZlQ29uZmlnOiBjdHguc2F2ZUNvbmZpZy5iaW5kKGN0eCksXHJcbiAgICByZW1vdmVDb25maWc6IGN0eC5yZW1vdmVDb25maWcuYmluZChjdHgpLFxyXG4gICAgc2V0Q29uZmlnOiBjdHguc2V0Q29uZmlnLmJpbmQoY3R4KSxcclxuICAgIHVuc2V0Q29uZmlnOiBjdHgudW5zZXRDb25maWcuYmluZChjdHgpLFxyXG4gICAgdXBsb2FkOiBjdHgudXBsb2FkLmJpbmQoY3R4KSxcclxuICAgIGFkZExpc3RlbmVyOiBjdHguYWRkTGlzdGVuZXIuYmluZChjdHgpLFxyXG4gICAgb246IGN0eC5vbi5iaW5kKGN0eCksXHJcbiAgICBvbmNlOiBjdHgub25jZS5iaW5kKGN0eCksXHJcbiAgICByZW1vdmVMaXN0ZW5lcjogY3R4LnJlbW92ZUxpc3RlbmVyLmJpbmQoY3R4KSxcclxuICAgIG9mZjogY3R4Lm9mZi5iaW5kKGN0eCksXHJcbiAgICByZW1vdmVBbGxMaXN0ZW5lcnM6IGN0eC5yZW1vdmVBbGxMaXN0ZW5lcnMuYmluZChjdHgpLFxyXG4gICAgc2V0TWF4TGlzdGVuZXJzOiBjdHguc2V0TWF4TGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIGdldE1heExpc3RlbmVyczogY3R4LmdldE1heExpc3RlbmVycy5iaW5kKGN0eCksXHJcbiAgICBsaXN0ZW5lcnM6IGN0eC5saXN0ZW5lcnMuYmluZChjdHgpLFxyXG4gICAgcmF3TGlzdGVuZXJzOiBjdHgucmF3TGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIGVtaXQ6IGN0eC5lbWl0LmJpbmQoY3R4KSxcclxuICAgIGxpc3RlbmVyQ291bnQ6IGN0eC5saXN0ZW5lckNvdW50LmJpbmQoY3R4KSxcclxuICAgIHByZXBlbmRMaXN0ZW5lcjogY3R4LnByZXBlbmRMaXN0ZW5lci5iaW5kKGN0eCksXHJcbiAgICBwcmVwZW5kT25jZUxpc3RlbmVyOiBjdHgucHJlcGVuZE9uY2VMaXN0ZW5lci5iaW5kKGN0eCksXHJcbiAgICBldmVudE5hbWVzOiBjdHguZXZlbnROYW1lcy5iaW5kKGN0eClcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJU21tc0NvbmZpZywgSU9sZFJlcU9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKGZpbGVOYW1lOiBzdHJpbmcsIGltYWdlOiBCdWZmZXIsIGFwaVRva2VuOiBzdHJpbmcsIGJhY2t1cERvbWFpbiA9ICcnKTogSU9sZFJlcU9wdGlvbnMgPT4ge1xyXG4gIGNvbnN0IGRvbWFpbiA9IGJhY2t1cERvbWFpbiB8fCAnc20ubXMnXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgdXJsOiBgaHR0cHM6Ly8ke2RvbWFpbn0vYXBpL3YyL3VwbG9hZGAsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIGNvbnRlbnRUeXBlOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXHJcbiAgICAgICdVc2VyLUFnZW50JzogJ1BpY0dvJyxcclxuICAgICAgQXV0aG9yaXphdGlvbjogYXBpVG9rZW5cclxuICAgIH0sXHJcbiAgICBmb3JtRGF0YToge1xyXG4gICAgICBzbWZpbGU6IHtcclxuICAgICAgICB2YWx1ZTogaW1hZ2UsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgZmlsZW5hbWU6IGZpbGVOYW1lXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBzc2w6ICd0cnVlJ1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjb25zdCBzbW1zQ29uZmlnID0gY3R4LmdldENvbmZpZzxJU21tc0NvbmZpZz4oJ3BpY0JlZC5zbW1zJylcclxuICBpZiAoIXNtbXNDb25maWcpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBmaW5kIHNtbXMgY29uZmlnIScpXHJcbiAgfVxyXG4gIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcclxuICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcG9zdENvbmZpZyA9IHBvc3RPcHRpb25zKGltZy5maWxlTmFtZSwgaW1hZ2UsIHNtbXNDb25maWc/LnRva2VuLCBzbW1zQ29uZmlnPy5iYWNrdXBEb21haW4pXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBzdHJpbmcgPSBhd2FpdCBjdHgucmVxdWVzdChwb3N0Q29uZmlnKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKHJlcylcclxuICAgICAgICBpZiAoYm9keS5jb2RlID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpbWcuaW1nVXJsID0gYm9keS5kYXRhLnVybFxyXG4gICAgICAgICAgaW1nLmhhc2ggPSBib2R5LmRhdGEuaGFzaFxyXG4gICAgICAgIH0gZWxzZSBpZiAoYm9keS5jb2RlID09PSAnaW1hZ2VfcmVwZWF0ZWQnICYmIHR5cGVvZiBib2R5LmltYWdlcyA9PT0gJ3N0cmluZycpIHsgLy8gZG8gZXh0cmEgY2hlY2sgc2luY2UgdGhpcyBlcnJvciByZXR1cm4gaXMgbm90IGRvY3VtZW50ZWQgYXQgaHR0cHM6Ly9kb2Muc20ubXMvI2FwaS1JbWFnZS1VcGxvYWRcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpbWcuaW1nVXJsID0gYm9keS5pbWFnZXNcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICAgICAgYm9keTogYm9keS5tZXNzYWdlXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJvZHkubWVzc2FnZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGN0eFxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElTbW1zQ29uZmlnPigncGljQmVkLnNtbXMnKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAndG9rZW4nLFxyXG4gICAgICBtZXNzYWdlOiAnYXBpIHRva2VuJyxcclxuICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TTU1TX1RPS0VOJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy50b2tlbiB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdiYWNrdXBEb21haW4nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU4nKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TTU1TX01FU1NBR0VfQkFDS1VQX0RPTUFJTicpXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5iYWNrdXBEb21haW4gfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ3NtbXMnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU01NUycpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xyXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xyXG5pbXBvcnQgeyBJUGljR28sIElQbHVnaW5Db25maWcsIElUY3l1bkNvbmZpZywgSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG4vLyBnZW5lcmF0ZSBDT1Mgc2lnbmF0dXJlIHN0cmluZ1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2lnbmF0dXJlIHtcclxuICBzaWduYXR1cmU6IHN0cmluZ1xyXG4gIGFwcElkOiBzdHJpbmdcclxuICBidWNrZXQ6IHN0cmluZ1xyXG4gIHNpZ25UaW1lOiBzdHJpbmdcclxufVxyXG5cclxuY29uc3QgZ2VuZXJhdGVTaWduYXR1cmUgPSAob3B0aW9uczogSVRjeXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nKTogSVNpZ25hdHVyZSA9PiB7XHJcbiAgY29uc3Qgc2VjcmV0SWQgPSBvcHRpb25zLnNlY3JldElkXHJcbiAgY29uc3Qgc2VjcmV0S2V5ID0gb3B0aW9ucy5zZWNyZXRLZXlcclxuICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWRcclxuICBjb25zdCBidWNrZXQgPSBvcHRpb25zLmJ1Y2tldFxyXG4gIGxldCBzaWduYXR1cmVcclxuICBsZXQgc2lnblRpbWU6IHN0cmluZyA9ICcnXHJcbiAgaWYgKCFvcHRpb25zLnZlcnNpb24gfHwgb3B0aW9ucy52ZXJzaW9uID09PSAndjQnKSB7XHJcbiAgICBjb25zdCByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDAwMClcclxuICAgIGNvbnN0IGN1cnJlbnQgPSBNYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCkgLSAxXHJcbiAgICBjb25zdCBleHBpcmVkID0gY3VycmVudCArIDM2MDBcclxuXHJcbiAgICBjb25zdCBtdWx0aVNpZ25hdHVyZSA9IGBhPSR7YXBwSWR9JmI9JHtidWNrZXR9Jms9JHtzZWNyZXRJZH0mZT0ke2V4cGlyZWR9JnQ9JHtjdXJyZW50fSZyPSR7cmFuZG9tfSZmPWBcclxuXHJcbiAgICBjb25zdCBzaWduSGV4S2V5ID0gY3J5cHRvLmNyZWF0ZUhtYWMoJ3NoYTEnLCBzZWNyZXRLZXkpLnVwZGF0ZShtdWx0aVNpZ25hdHVyZSkuZGlnZXN0KClcclxuICAgIGNvbnN0IHRlbXBTdHJpbmcgPSBCdWZmZXIuY29uY2F0KFtzaWduSGV4S2V5LCBCdWZmZXIuZnJvbShtdWx0aVNpZ25hdHVyZSldKVxyXG4gICAgc2lnbmF0dXJlID0gQnVmZmVyLmZyb20odGVtcFN0cmluZykudG9TdHJpbmcoJ2Jhc2U2NCcpXHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIGh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzc3OCNzaWduYXR1cmVcclxuICAgIGNvbnN0IHRvZGF5ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApXHJcbiAgICBjb25zdCB0b21vcnJvdyA9IHRvZGF5ICsgODY0MDBcclxuICAgIHNpZ25UaW1lID0gYCR7dG9kYXl9OyR7dG9tb3Jyb3d9YFxyXG4gICAgY29uc3Qgc2lnbktleSA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgc2VjcmV0S2V5KS51cGRhdGUoc2lnblRpbWUpLmRpZ2VzdCgnaGV4JylcclxuICAgIGNvbnN0IGh0dHBTdHJpbmcgPSBgcHV0XFxuLyR7b3B0aW9ucy5wYXRofSR7ZmlsZU5hbWV9XFxuXFxuaG9zdD0ke29wdGlvbnMuYnVja2V0fS5jb3MuJHtvcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbVxcbmBcclxuICAgIGNvbnN0IHNoYTFlZEh0dHBTdHJpbmcgPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpLnVwZGF0ZShodHRwU3RyaW5nKS5kaWdlc3QoJ2hleCcpXHJcbiAgICBjb25zdCBzdHJpbmdUb1NpZ24gPSBgc2hhMVxcbiR7c2lnblRpbWV9XFxuJHtzaGExZWRIdHRwU3RyaW5nfVxcbmBcclxuICAgIHNpZ25hdHVyZSA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgc2lnbktleSkudXBkYXRlKHN0cmluZ1RvU2lnbikuZGlnZXN0KCdoZXgnKVxyXG4gIH1cclxuICByZXR1cm4ge1xyXG4gICAgc2lnbmF0dXJlLFxyXG4gICAgYXBwSWQsXHJcbiAgICBidWNrZXQsXHJcbiAgICBzaWduVGltZVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAob3B0aW9uczogSVRjeXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCBzaWduYXR1cmU6IElTaWduYXR1cmUsIGltYWdlOiBCdWZmZXIsIHZlcnNpb246IHN0cmluZyk6IElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSA9PiB7XHJcbiAgY29uc3QgYXJlYSA9IG9wdGlvbnMuYXJlYVxyXG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGhcclxuICBpZiAoIW9wdGlvbnMudmVyc2lvbiB8fCBvcHRpb25zLnZlcnNpb24gPT09ICd2NCcpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICB1cmw6IGBodHRwOi8vJHthcmVhfS5maWxlLm15cWNsb3VkLmNvbS9maWxlcy92Mi8ke3NpZ25hdHVyZS5hcHBJZH0vJHtzaWduYXR1cmUuYnVja2V0fS8ke2VuY29kZVVSSShwYXRoKX0ke2ZpbGVOYW1lfWAsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBIb3N0OiBgJHthcmVhfS5maWxlLm15cWNsb3VkLmNvbWAsXHJcbiAgICAgICAgQXV0aG9yaXphdGlvbjogc2lnbmF0dXJlLnNpZ25hdHVyZSxcclxuICAgICAgICBjb250ZW50VHlwZTogJ211bHRpcGFydC9mb3JtLWRhdGEnLFxyXG4gICAgICAgICdVc2VyLUFnZW50JzogYFBpY0dvOyR7dmVyc2lvbn07bnVsbDtudWxsYFxyXG4gICAgICB9LFxyXG4gICAgICBmb3JtRGF0YToge1xyXG4gICAgICAgIG9wOiAndXBsb2FkJyxcclxuICAgICAgICBmaWxlY29udGVudDogaW1hZ2VcclxuICAgICAgfSxcclxuICAgICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbWV0aG9kOiAnUFVUJyxcclxuICAgICAgdXJsOiBgaHR0cDovLyR7b3B0aW9ucy5idWNrZXR9LmNvcy4ke29wdGlvbnMuYXJlYX0ubXlxY2xvdWQuY29tLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVOYW1lKX1gLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgSG9zdDogYCR7b3B0aW9ucy5idWNrZXR9LmNvcy4ke29wdGlvbnMuYXJlYX0ubXlxY2xvdWQuY29tYCxcclxuICAgICAgICBBdXRob3JpemF0aW9uOiBgcS1zaWduLWFsZ29yaXRobT1zaGExJnEtYWs9JHtvcHRpb25zLnNlY3JldElkfSZxLXNpZ24tdGltZT0ke3NpZ25hdHVyZS5zaWduVGltZX0mcS1rZXktdGltZT0ke3NpZ25hdHVyZS5zaWduVGltZX0mcS1oZWFkZXItbGlzdD1ob3N0JnEtdXJsLXBhcmFtLWxpc3Q9JnEtc2lnbmF0dXJlPSR7c2lnbmF0dXJlLnNpZ25hdHVyZX1gLFxyXG4gICAgICAgIGNvbnRlbnRUeXBlOiBtaW1lLmxvb2t1cChmaWxlTmFtZSkgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsXHJcbiAgICAgICAgJ1VzZXItQWdlbnQnOiBgUGljR287JHt2ZXJzaW9ufTtudWxsO251bGxgXHJcbiAgICAgIH0sXHJcbiAgICAgIGJvZHk6IGltYWdlLFxyXG4gICAgICByZXNvbHZlV2l0aEZ1bGxSZXNwb25zZTogdHJ1ZVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28gfCBib29sZWFuPiA9PiB7XHJcbiAgY29uc3QgdGNZdW5PcHRpb25zID0gY3R4LmdldENvbmZpZzxJVGN5dW5Db25maWc+KCdwaWNCZWQudGN5dW4nKVxyXG4gIGlmICghdGNZdW5PcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCB0ZW5jZW50IENPUyBjb25maWcnKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGNvbnN0IGN1c3RvbVVybCA9IHRjWXVuT3B0aW9ucy5jdXN0b21VcmxcclxuICAgIGNvbnN0IHBhdGggPSB0Y1l1bk9wdGlvbnMucGF0aFxyXG4gICAgY29uc3QgdXNlVjQgPSAhdGNZdW5PcHRpb25zLnZlcnNpb24gfHwgdGNZdW5PcHRpb25zLnZlcnNpb24gPT09ICd2NCdcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ2VuZXJhdGVTaWduYXR1cmUodGNZdW5PcHRpb25zLCBpbWcuZmlsZU5hbWUpXHJcbiAgICAgICAgaWYgKCFzaWduYXR1cmUpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcclxuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCAnYmFzZTY0JylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHBvc3RPcHRpb25zKHRjWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lLCBzaWduYXR1cmUsIGltYWdlLCBjdHguR1VJX1ZFUlNJT04gfHwgY3R4LlZFUlNJT04pXHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICAgIC50aGVuKChyZXM6IGFueSkgPT4gcmVzKVxyXG4gICAgICAgICAgLmNhdGNoKChlcnI6IEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogNDAwLFxyXG4gICAgICAgICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgICAgICAgIG1zZzogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQVVUSF9GQUlMRUQnKSxcclxuICAgICAgICAgICAgICAgIGVyclxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICBsZXQgYm9keVxyXG4gICAgICAgIGlmICh1c2VWNCAmJiB0eXBlb2YgcmVzID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgYm9keSA9IEpTT04ucGFyc2UocmVzKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBib2R5ID0gcmVzXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDQwMCkge1xyXG4gICAgICAgICAgaWYgKGJvZHk/LmJvZHk/LmVycikge1xyXG4gICAgICAgICAgICB0aHJvdyBib2R5LmJvZHkuZXJyXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYm9keT8uYm9keT8ubXNnIHx8IGJvZHk/LmJvZHk/Lm1lc3NhZ2UpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvblVybCA9IHRjWXVuT3B0aW9ucy5vcHRpb25zIHx8ICcnXHJcbiAgICAgICAgaWYgKHVzZVY0ICYmIGJvZHkubWVzc2FnZSA9PT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaWYgKGN1c3RvbVVybCkge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke3BhdGh9JHtpbWcuZmlsZU5hbWV9YFxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2JvZHkuZGF0YS5zb3VyY2VfdXJsIGFzIHN0cmluZ30ke29wdGlvblVybH1gXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICghdXNlVjQgJiYgYm9keSAmJiBib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGlmIChjdXN0b21VcmwpIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2N1c3RvbVVybH0vJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX0ke29wdGlvblVybH1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYGh0dHBzOi8vJHt0Y1l1bk9wdGlvbnMuYnVja2V0fS5jb3MuJHt0Y1l1bk9wdGlvbnMuYXJlYX0ubXlxY2xvdWQuY29tLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9JHtvcHRpb25Vcmx9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzLmJvZHkubXNnKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICBpZiAoIXRjWXVuT3B0aW9ucy52ZXJzaW9uIHx8IHRjWXVuT3B0aW9ucy52ZXJzaW9uID09PSAndjQnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZXJyLmVycm9yKVxyXG4gICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICAgIGNvZGU6IGJvZHkuY29kZSBhcyBzdHJpbmdcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgdGV4dDogJ2h0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvODQzMidcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgfVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElUY3l1bkNvbmZpZz4oJ3BpY0JlZC50Y3l1bicpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd2ZXJzaW9uJyxcclxuICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICBhbGlhczogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OJyksXHJcbiAgICAgIGNob2ljZXM6IFsndjQnLCAndjUnXSxcclxuICAgICAgZGVmYXVsdDogJ3Y1JyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc2VjcmV0SWQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc2VjcmV0SWQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc2VjcmV0S2V5JyxcclxuICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zZWNyZXRLZXkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5idWNrZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYXBwSWQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXBwSWQgfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYXJlYScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUEnKSB9LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhdGggfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY3VzdG9tVXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnb3B0aW9ucycsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcub3B0aW9ucyB8fCAnJyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCd0Y3l1bicsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVUQnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW5Db25maWcsIElHaXRodWJDb25maWcsIElPbGRSZXFPcHRpb25zV2l0aEpTT04gfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKGZpbGVOYW1lOiBzdHJpbmcsIG9wdGlvbnM6IElHaXRodWJDb25maWcsIGRhdGE6IGFueSk6IElPbGRSZXFPcHRpb25zV2l0aEpTT04gPT4ge1xyXG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggfHwgJydcclxuICBjb25zdCB7IHRva2VuLCByZXBvIH0gPSBvcHRpb25zXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICB1cmw6IGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7cmVwb30vY29udGVudHMvJHtlbmNvZGVVUkkocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJyksXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEF1dGhvcml6YXRpb246IGB0b2tlbiAke3Rva2VufWAsXHJcbiAgICAgICdVc2VyLUFnZW50JzogJ1BpY0xpc3QnLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogbWltZS5sb29rdXAoZmlsZU5hbWUpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXHJcbiAgICB9LFxyXG4gICAgYm9keTogZGF0YSxcclxuICAgIGpzb246IHRydWVcclxuICB9IGFzIGNvbnN0XHJcbn1cclxuXHJcbmNvbnN0IGdldE9wdGlvbnMgPSAoZmlsZU5hbWU6IHN0cmluZywgb3B0aW9uczogSUdpdGh1YkNvbmZpZyk6IElPbGRSZXFPcHRpb25zV2l0aEpTT04gPT4ge1xyXG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggfHwgJydcclxuICBjb25zdCB7IHRva2VuLCByZXBvLCBicmFuY2ggfSA9IG9wdGlvbnNcclxuICByZXR1cm4ge1xyXG4gICAgbWV0aG9kOiAnR0VUJyxcclxuICAgIHVybDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvfS9jb250ZW50cy8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSl9P3JlZj0ke2JyYW5jaH1gLnJlcGxhY2UoLyUyRi9nLCAnLycpLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBgdG9rZW4gJHt0b2tlbn1gLFxyXG4gICAgICAnVXNlci1BZ2VudCc6ICdQaWNHbydcclxuICAgIH0sXHJcbiAgICBqc29uOiB0cnVlXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IGdpdGh1Yk9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElHaXRodWJDb25maWc+KCdwaWNCZWQuZ2l0aHViJylcclxuICBpZiAoIWdpdGh1Yk9wdGlvbnMpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIGdpdGh1YiBjb25maWcnKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBpbWcuYmFzZTY0SW1hZ2UgfHwgQnVmZmVyLmZyb20oaW1nLmJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpXHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgIG1lc3NhZ2U6ICdVcGxvYWQgYnkgUGljTGlzdCcsXHJcbiAgICAgICAgICBicmFuY2g6IGdpdGh1Yk9wdGlvbnMuYnJhbmNoLFxyXG4gICAgICAgICAgY29udGVudDogYmFzZTY0SW1hZ2UsXHJcbiAgICAgICAgICBwYXRoOiBnaXRodWJPcHRpb25zLnBhdGggKyBlbmNvZGVVUkkoaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwb3N0Q29uZmlnID0gcG9zdE9wdGlvbnMoaW1nLmZpbGVOYW1lLCBnaXRodWJPcHRpb25zLCBkYXRhKVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBib2R5OiB7XHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcclxuICAgICAgICAgICAgICBkb3dubG9hZF91cmw6IHN0cmluZ1xyXG4gICAgICAgICAgICAgIHNoYTogc3RyaW5nXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gPSBhd2FpdCBjdHgucmVxdWVzdChwb3N0Q29uZmlnKVxyXG4gICAgICAgICAgaWYgKGJvZHkpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgICBpZiAoZ2l0aHViT3B0aW9ucy5jdXN0b21VcmwpIHtcclxuICAgICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Z2l0aHViT3B0aW9ucy5jdXN0b21Vcmx9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGdpdGh1Yk9wdGlvbnMucGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaW1nLmltZ1VybCA9IGJvZHkuY29udGVudC5kb3dubG9hZF91cmxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbWcuaGFzaCA9IGJvZHkuY29udGVudC5zaGFcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2VydmVyIGVycm9yLCBwbGVhc2UgdHJ5IGFnYWluJylcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgICAgICAgaWYgKGVyci5zdGF0dXNDb2RlID09PSA0MjIpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjdHgucmVxdWVzdChnZXRPcHRpb25zKGltZy5maWxlTmFtZSwgZ2l0aHViT3B0aW9ucykpIGFzIGFueVxyXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVzKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICBpbWcuaGFzaCA9IHJlcy5zaGFcclxuICAgICAgICAgICAgICBpZiAoZ2l0aHViT3B0aW9ucy5jdXN0b21VcmwpIHtcclxuICAgICAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtnaXRodWJPcHRpb25zLmN1c3RvbVVybH0vJHtlbmNvZGVVUklDb21wb25lbnQoZ2l0aHViT3B0aW9ucy5wYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaW1nLmltZ1VybCA9IHJlcy5kb3dubG9hZF91cmxcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZXQgQ29udGVudHMgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLJylcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUdpdGh1YkNvbmZpZz4oJ3BpY0JlZC5naXRodWInKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAncmVwbycsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9SRVBPJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUkVQTycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5yZXBvIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2JyYW5jaCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9CUkFOQ0gnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9CUkFOQ0gnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5icmFuY2ggfHwgJ21hc3RlcicsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAndG9rZW4nLFxyXG4gICAgICB0eXBlOiAncGFzc3dvcmQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9UT0tFTicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudG9rZW4gfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdnaXRodWInLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHFpbml1IGZyb20gJ3Fpbml1J1xyXG5pbXBvcnQgeyBJUGx1Z2luQ29uZmlnLCBJUWluaXVDb25maWcsIElQaWNHbywgSU9sZFJlcU9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuXHJcbmZ1bmN0aW9uIHBvc3RPcHRpb25zIChvcHRpb25zOiBJUWluaXVDb25maWcsIGZpbGVOYW1lOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGltZ0Jhc2U2NDogc3RyaW5nKTogSU9sZFJlcU9wdGlvbnMge1xyXG4gIGNvbnN0IGFyZWEgPSBzZWxlY3RBcmVhKG9wdGlvbnMuYXJlYSB8fCAnejAnKVxyXG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggfHwgJydcclxuICBjb25zdCBiYXNlNjRGaWxlTmFtZSA9IEJ1ZmZlci5mcm9tKHBhdGggKyBmaWxlTmFtZSwgJ3V0Zi04JykudG9TdHJpbmcoJ2Jhc2U2NCcpLnJlcGxhY2UoL1xcKy9nLCAnLScpLnJlcGxhY2UoL1xcLy9nLCAnXycpXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgdXJsOiBgaHR0cDovL3VwbG9hZCR7YXJlYX0ucWluaXVwLmNvbS9wdXRiNjQvLTEva2V5LyR7YmFzZTY0RmlsZU5hbWV9YCxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQXV0aG9yaXphdGlvbjogYFVwVG9rZW4gJHt0b2tlbn1gLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogbWltZS5sb29rdXAoZmlsZU5hbWUpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXHJcbiAgICB9LFxyXG4gICAgYm9keTogaW1nQmFzZTY0XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzZWxlY3RBcmVhIChhcmVhOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHJldHVybiBhcmVhID09PSAnejAnID8gJycgOiAnLScgKyBhcmVhXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFRva2VuIChxaW5pdU9wdGlvbnM6IGFueSk6IHN0cmluZyB7XHJcbiAgY29uc3QgYWNjZXNzS2V5ID0gcWluaXVPcHRpb25zLmFjY2Vzc0tleVxyXG4gIGNvbnN0IHNlY3JldEtleSA9IHFpbml1T3B0aW9ucy5zZWNyZXRLZXlcclxuICBjb25zdCBtYWMgPSBuZXcgcWluaXUuYXV0aC5kaWdlc3QuTWFjKGFjY2Vzc0tleSwgc2VjcmV0S2V5KVxyXG4gIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICBzY29wZTogcWluaXVPcHRpb25zLmJ1Y2tldFxyXG4gIH1cclxuICBjb25zdCBwdXRQb2xpY3kgPSBuZXcgcWluaXUucnMuUHV0UG9saWN5KG9wdGlvbnMpXHJcbiAgcmV0dXJuIHB1dFBvbGljeS51cGxvYWRUb2tlbihtYWMpXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgcWluaXVPcHRpb25zID0gY3R4LmdldENvbmZpZzxJUWluaXVDb25maWc+KCdwaWNCZWQucWluaXUnKVxyXG4gIGlmICghcWluaXVPcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCBxaW5pdSBjb25maWcnKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBpbWcuYmFzZTY0SW1hZ2UgfHwgQnVmZmVyLmZyb20oaW1nLmJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHBvc3RPcHRpb25zKHFpbml1T3B0aW9ucywgaW1nLmZpbGVOYW1lLCBnZXRUb2tlbihxaW5pdU9wdGlvbnMpLCBiYXNlNjRJbWFnZSlcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKHJlcylcclxuICAgICAgICBpZiAoYm9keT8ua2V5KSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgY29uc3QgYmFzZVVybCA9IHFpbml1T3B0aW9ucy51cmxcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBxaW5pdU9wdGlvbnMub3B0aW9uc1xyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGAke2Jhc2VVcmx9LyR7Ym9keS5rZXkgYXMgc3RyaW5nfSR7b3B0aW9uc31gXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgICAgICAgIGJvZHk6IGJvZHkubXNnXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgY3R4LmxvZy5lcnJvcigncWluaXUgZXJyb3InLCBib2R5KVxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGxvYWQgZmFpbGVkJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgaWYgKGVyci5tZXNzYWdlICE9PSAnVXBsb2FkIGZhaWxlZCcpIHtcclxuICAgICAgLy8gZXJyLnJlc3BvbnNlIG1heWJlIHVuZGVmaW5lZFxyXG4gICAgICBpZiAoZXJyLnJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIucmVzcG9uc2UuYm9keVxyXG4gICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgYm9keTogZXJyb3IuZXJyb3JcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVFpbml1Q29uZmlnPigncGljQmVkLnFpbml1JykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FjY2Vzc0tleScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfQUNDRVNTS0VZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc2VjcmV0S2V5JyxcclxuICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9TRUNSRVRLRVknKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnNlY3JldEtleSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdidWNrZXQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX0JVQ0tFVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYnVja2V0IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3VybCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX1VSTCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfVVJMJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfVVJMJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy51cmwgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYXJlYScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX0FSRUEnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX0FSRUEnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hcmVhIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ29wdGlvbnMnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9PUFRJT05TJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9PUFRJT05TJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUycpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcub3B0aW9ucyB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdxaW5pdScsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVScpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSUltZ3VyQ29uZmlnLCBJT2xkUmVxT3B0aW9ucywgSUZ1bGxSZXNwb25zZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuY29uc3QgZm9ybWF0QWNjZXNzVG9rZW4gPSAoYWNjZXNzVG9rZW46IHN0cmluZyk6IHN0cmluZyA9PiBhY2Nlc3NUb2tlbiA/IGFjY2Vzc1Rva2VuLnN0YXJ0c1dpdGgoJ0JlYXJlcicpID8gYWNjZXNzVG9rZW4gOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCA6ICcnXHJcblxyXG5jb25zdCBwb3N0T3B0aW9ucyA9IGFzeW5jIChjdHg6IElQaWNHbywgb3B0aW9uczogSUltZ3VyQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCBpbWdCYXNlNjQ6IHN0cmluZyk6IFByb21pc2U8SU9sZFJlcU9wdGlvbnM+ID0+IHtcclxuICBjb25zdCBjbGllbnRJZCA9IG9wdGlvbnMuY2xpZW50SWQgfHwgJydcclxuICBjb25zdCB1c2VybmFtZSA9IG9wdGlvbnMudXNlcm5hbWUgfHwgJydcclxuICBjb25zdCBhY2Nlc3NUb2tlbiA9IGZvcm1hdEFjY2Vzc1Rva2VuKG9wdGlvbnMuYWNjZXNzVG9rZW4gfHwgJycpXHJcbiAgY29uc3QgYWxidW0gPSBvcHRpb25zLmFsYnVtIHx8ICcnXHJcbiAgbGV0IGF1dGhvcml6YXRpb25cclxuICBpZiAodXNlcm5hbWUgJiYgYWNjZXNzVG9rZW4pIHtcclxuICAgIGF1dGhvcml6YXRpb24gPSBhY2Nlc3NUb2tlblxyXG4gIH0gZWxzZSBpZiAoY2xpZW50SWQpIHtcclxuICAgIGF1dGhvcml6YXRpb24gPSBgQ2xpZW50LUlEICR7Y2xpZW50SWR9YFxyXG4gIH0gZWxzZSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsaWVudElkIG9yIGFjY2Vzc1Rva2VuIGlzIHJlcXVpcmVkJylcclxuICB9XHJcbiAgY29uc3QgcmVxdWVzdE9wdGlvbnM6IElPbGRSZXFPcHRpb25zID0ge1xyXG4gICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICB1cmw6ICdodHRwczovL2FwaS5pbWd1ci5jb20vMy9pbWFnZScsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEF1dGhvcml6YXRpb246IGF1dGhvcml6YXRpb24sXHJcbiAgICAgICdjb250ZW50LXR5cGUnOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXHJcbiAgICAgIEhvc3Q6ICdhcGkuaW1ndXIuY29tJyxcclxuICAgICAgJ1VzZXItQWdlbnQnOiAnUGljTGlzdCdcclxuICAgIH0sXHJcbiAgICBmb3JtRGF0YToge1xyXG4gICAgICBpbWFnZTogaW1nQmFzZTY0LFxyXG4gICAgICB0eXBlOiAnYmFzZTY0JyxcclxuICAgICAgbmFtZTogZmlsZU5hbWUsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkZWQgd2l0aCBQaWNMaXN0J1xyXG4gICAgfVxyXG4gIH1cclxuICBpZiAodXNlcm5hbWUgJiYgYWNjZXNzVG9rZW4gJiYgYWxidW0pIHtcclxuICAgIGxldCBpbml0UGFnZXMgPSAwXHJcbiAgICBsZXQgcmVzXHJcbiAgICBsZXQgYWxidW1IYXNoID0gJydcclxuICAgIGRvIHtcclxuICAgICAgY29uc3QgZ2V0QWxidW1IYXNoT3B0aW9uczogSU9sZFJlcU9wdGlvbnMgPSB7XHJcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICB1cmw6IGBodHRwczovL2FwaS5pbWd1ci5jb20vMy9hY2NvdW50LyR7dXNlcm5hbWV9L2FsYnVtcy8ke2luaXRQYWdlc31gLFxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGhvcml6YXRpb25cclxuICAgICAgICB9LFxyXG4gICAgICAgIGpzb246IHRydWUsXHJcbiAgICAgICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWUsXHJcbiAgICAgICAgdGltZW91dDogMTAwMDBcclxuICAgICAgfVxyXG4gICAgICBpZiAob3B0aW9ucy5wcm94eSkge1xyXG4gICAgICAgIGdldEFsYnVtSGFzaE9wdGlvbnMucHJveHkgPSBvcHRpb25zLnByb3h5XHJcbiAgICAgIH1cclxuICAgICAgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3QoZ2V0QWxidW1IYXNoT3B0aW9ucykgYXMgdW5rbm93biBhcyBJRnVsbFJlc3BvbnNlXHJcbiAgICAgIGlmICghKHJlcy5zdGF0dXNDb2RlID09PSAyMDAgJiYgcmVzLmJvZHkuc3VjY2VzcykpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpbicpXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYWxidW1MaXN0ID0gcmVzLmJvZHkuZGF0YVxyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYWxidW1MaXN0KSB7XHJcbiAgICAgICAgaWYgKGl0ZW0udGl0bGUgPT09IGFsYnVtKSB7XHJcbiAgICAgICAgICBhbGJ1bUhhc2ggPSBpdGVtLmlkXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpbml0UGFnZXMrK1xyXG4gICAgfSB3aGlsZSAocmVzLmJvZHkuZGF0YS5sZW5ndGggPiAwKVxyXG4gICAgaWYgKGFsYnVtSGFzaCAmJiByZXF1ZXN0T3B0aW9ucy5mb3JtRGF0YSkge1xyXG4gICAgICByZXF1ZXN0T3B0aW9ucy5mb3JtRGF0YS5hbGJ1bSA9IGFsYnVtSGFzaFxyXG4gICAgfVxyXG4gIH1cclxuICBpZiAob3B0aW9ucy5wcm94eSkge1xyXG4gICAgcmVxdWVzdE9wdGlvbnMucHJveHkgPSBvcHRpb25zLnByb3h5XHJcbiAgfVxyXG4gIHJldHVybiByZXF1ZXN0T3B0aW9uc1xyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IGltZ3VyT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SUltZ3VyQ29uZmlnPigncGljQmVkLmltZ3VyJylcclxuICBpZiAoIWltZ3VyT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgaW1ndXIgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCBwb3N0T3B0aW9ucyhjdHgsIGltZ3VyT3B0aW9ucywgaW1nLmZpbGVOYW1lLCBiYXNlNjRJbWFnZSlcclxuICAgICAgICBjb25zdCByZXM6IHN0cmluZyA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXHJcbiAgICAgICAgY29uc3QgYm9keSA9IHR5cGVvZiByZXMgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShyZXMpIDogcmVzXHJcbiAgICAgICAgaWYgKGJvZHkuc3VjY2Vzcykge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBib2R5LmRhdGEubGlua1xyXG4gICAgICAgICAgaW1nLmhhc2ggPSBib2R5LmRhdGEuZGVsZXRlaGFzaFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpbicpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSycpLFxyXG4gICAgICB0ZXh0OiAnaHR0cDovL2RvY3MuaW1ndXIuY29tL2FwaS9lcnJuby8nXHJcbiAgICB9KVxyXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxyXG4gICAgdGhyb3cgZXJyPy5yZXNwb25zZT8uZGF0YSB8fCBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUltZ3VyQ29uZmlnPigncGljQmVkLmltZ3VyJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2NsaWVudElkJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfQ0xJRU5USUQnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX0NMSUVOVElEJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX01FU1NBR0VfQ0xJRU5USUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmNsaWVudElkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd1c2VybmFtZScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX1VTRVJOQU1FJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9VU0VSTkFNRScpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9NRVNTQUdFX1VTRVJOQU1FJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy51c2VybmFtZSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYWNjZXNzVG9rZW4nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9BQ0NFU1NfVE9LRU4nKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX0FDQ0VTU19UT0tFTicpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9NRVNTQUdFX0FDQ0VTU19UT0tFTicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYWNjZXNzVG9rZW4gfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FsYnVtJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfQUxCVU0nKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX0FMQlVNJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX01FU1NBR0VfQUxCVU0nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFsYnVtIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwcm94eScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX1BST1hZJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9QUk9YWScpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wcm94eSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcignaW1ndXInLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVInKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW5Db25maWcsIElBbGl5dW5Db25maWcsIElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0bydcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbi8vIGdlbmVyYXRlIE9TUyBzaWduYXR1cmVcclxuY29uc3QgZ2VuZXJhdGVTaWduYXR1cmUgPSAob3B0aW9uczogSUFsaXl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKVxyXG4gIGNvbnN0IG1pbWVUeXBlID0gbWltZS5sb29rdXAoZmlsZU5hbWUpXHJcbiAgaWYgKCFtaW1lVHlwZSkgdGhyb3cgRXJyb3IoYE5vIG1pbWUgdHlwZSBmb3VuZCBmb3IgZmlsZSAke2ZpbGVOYW1lfWApXHJcblxyXG4gIGNvbnN0IHNpZ25TdHJpbmcgPSBgUFVUXFxuXFxuJHttaW1lVHlwZX1cXG4ke2RhdGV9XFxuLyR7b3B0aW9ucy5idWNrZXR9LyR7b3B0aW9ucy5wYXRofSR7ZmlsZU5hbWV9YFxyXG5cclxuICBjb25zdCBzaWduYXR1cmUgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIG9wdGlvbnMuYWNjZXNzS2V5U2VjcmV0KS51cGRhdGUoc2lnblN0cmluZykuZGlnZXN0KCdiYXNlNjQnKVxyXG4gIHJldHVybiBgT1NTICR7b3B0aW9ucy5hY2Nlc3NLZXlJZH06JHtzaWduYXR1cmV9YFxyXG59XHJcblxyXG5jb25zdCBwb3N0T3B0aW9ucyA9IChvcHRpb25zOiBJQWxpeXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgaW1hZ2U6IEJ1ZmZlcik6IElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICB1cmw6IGBodHRwczovLyR7b3B0aW9ucy5idWNrZXR9LiR7b3B0aW9ucy5hcmVhfS5hbGl5dW5jcy5jb20vJHtlbmNvZGVVUkkob3B0aW9ucy5wYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSl9YC5yZXBsYWNlKC8lMkYvZywgJy8nKSxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgSG9zdDogYCR7b3B0aW9ucy5idWNrZXR9LiR7b3B0aW9ucy5hcmVhfS5hbGl5dW5jcy5jb21gLFxyXG4gICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUsXHJcbiAgICAgIERhdGU6IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKVxyXG4gICAgfSxcclxuICAgIGJvZHk6IGltYWdlLFxyXG4gICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgYWxpWXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SUFsaXl1bkNvbmZpZz4oJ3BpY0JlZC5hbGl5dW4nKVxyXG4gIGlmICghYWxpWXVuT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgYWxpWXVuIE9TUyBjb25maWcnKVxyXG4gIH1cclxuICBhbGlZdW5PcHRpb25zLnBhdGggPSBhbGlZdW5PcHRpb25zLnBhdGgucmVwbGFjZSgvXFwvKiQvLCAnJykucmVwbGFjZSgvXlxcLyovLCAnJykgKyAnLydcclxuICBpZiAoYWxpWXVuT3B0aW9ucy5wYXRoID09PSAnLycpIHtcclxuICAgIGFsaVl1bk9wdGlvbnMucGF0aCA9ICcnXHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgY29uc3QgY3VzdG9tVXJsID0gYWxpWXVuT3B0aW9ucy5jdXN0b21VcmxcclxuICAgIGNvbnN0IHBhdGggPSBhbGlZdW5PcHRpb25zLnBhdGhcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ2VuZXJhdGVTaWduYXR1cmUoYWxpWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0gcG9zdE9wdGlvbnMoYWxpWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lLCBzaWduYXR1cmUsIGltYWdlKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGNvbnN0IG9wdGlvblVybCA9IGFsaVl1bk9wdGlvbnMub3B0aW9ucyB8fCAnJ1xyXG4gICAgICAgICAgaWYgKGN1c3RvbVVybCkge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke2VuY29kZVVSSUNvbXBvbmVudChwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfSR7b3B0aW9uVXJsfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgaHR0cHM6Ly8ke2FsaVl1bk9wdGlvbnMuYnVja2V0fS4ke2FsaVl1bk9wdGlvbnMuYXJlYX0uYWxpeXVuY3MuY29tLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9JHtvcHRpb25Vcmx9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VwbG9hZCBmYWlsZWQnKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1MnKVxyXG4gICAgfSlcclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJQWxpeXVuQ29uZmlnPigncGljQmVkLmFsaXl1bicpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NLZXlJZCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFjY2Vzc0tleUlkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FjY2Vzc0tleVNlY3JldCcsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXlTZWNyZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhcmVhJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ2FsaXl1bicsIHtcclxuICAgIGdldCBuYW1lICgpIHtcclxuICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRCcpXHJcbiAgICB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW5Db25maWcsIElVcHl1bkNvbmZpZywgSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xyXG5pbXBvcnQgTUQ1IGZyb20gJ21kNSdcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IHsgc2FmZVBhcnNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xyXG5cclxuLy8gZ2VuZXJhdGUgQ09TIHNpZ25hdHVyZSBzdHJpbmdcclxuY29uc3QgZ2VuZXJhdGVTaWduYXR1cmUgPSAob3B0aW9uczogSVVweXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3Qgb3BlcmF0b3IgPSBvcHRpb25zLm9wZXJhdG9yXHJcbiAgY29uc3QgcGFzc3dvcmQgPSBvcHRpb25zLnBhc3N3b3JkXHJcbiAgY29uc3QgbWQ1UGFzc3dvcmQgPSBNRDUocGFzc3dvcmQpXHJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKVxyXG4gIGNvbnN0IHVyaSA9IGAvJHtvcHRpb25zLmJ1Y2tldH0vJHtlbmNvZGVVUkkocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICBjb25zdCB2YWx1ZSA9IGBQVVQmJHt1cml9JiR7ZGF0ZX1gXHJcbiAgY29uc3Qgc2lnbiA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgbWQ1UGFzc3dvcmQpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KCdiYXNlNjQnKVxyXG4gIHJldHVybiBgVVBZVU4gJHtvcGVyYXRvcn06JHtzaWdufWBcclxufVxyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAob3B0aW9uczogSVVweXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgaW1hZ2U6IEJ1ZmZlcik6IElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSA9PiB7XHJcbiAgY29uc3QgYnVja2V0ID0gb3B0aW9ucy5idWNrZXRcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICB1cmw6IGBodHRwczovL3YwLmFwaS51cHl1bi5jb20vJHtidWNrZXR9LyR7ZW5jb2RlVVJJKHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUsXHJcbiAgICAgIERhdGU6IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xyXG4gICAgfSxcclxuICAgIGJvZHk6IGltYWdlLFxyXG4gICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgdXB5dW5PcHRpb25zID0gY3R4LmdldENvbmZpZzxJVXB5dW5Db25maWc+KCdwaWNCZWQudXB5dW4nKVxyXG4gIGlmICghdXB5dW5PcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCB1cFl1biBjb25maWcnKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGNvbnN0IHBhdGggPSB1cHl1bk9wdGlvbnMucGF0aCB8fCAnJ1xyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcclxuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCAnYmFzZTY0JylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ2VuZXJhdGVTaWduYXR1cmUodXB5dW5PcHRpb25zLCBpbWcuZmlsZU5hbWUpXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHBvc3RPcHRpb25zKHVweXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lLCBzaWduYXR1cmUsIGltYWdlKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHt1cHl1bk9wdGlvbnMudXJsfS8ke2VuY29kZVVSSUNvbXBvbmVudChwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfSR7dXB5dW5PcHRpb25zLm9wdGlvbnN9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VwbG9hZCBmYWlsZWQnKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdVcGxvYWQgZmFpbGVkJykge1xyXG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1MnKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYm9keSA9IHNhZmVQYXJzZTx7IGNvZGU6IHN0cmluZyB9PihlcnIuZXJyb3IpXHJcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEX1JFQVNPTicsIHtcclxuICAgICAgICAgIGNvZGU6IHR5cGVvZiBib2R5ID09PSAnb2JqZWN0JyA/IGJvZHkuY29kZSA6IGJvZHlcclxuICAgICAgICB9KSxcclxuICAgICAgICB0ZXh0OiAnaHR0cDovL2RvY3MudXB5dW4uY29tL2FwaS9lcnJuby8nXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVVweXVuQ29uZmlnPigncGljQmVkLnVweXVuJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2J1Y2tldCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fQlVDS0VUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5idWNrZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnb3BlcmF0b3InLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX09QRVJBVE9SJykgfSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9PUEVSQVRPUicpXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcGVyYXRvciB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXNzd29yZCcsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX1BBU1NXT1JEJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhc3N3b3JkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3VybCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fVVJMJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy51cmwgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnb3B0aW9ucycsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcHRpb25zIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fUEFUSCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEgnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhdGggfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ3VweXVuJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJV2ViZGF2UGxpc3RDb25maWcsIElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSBhc3luYyAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElXZWJkYXZQbGlzdENvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgaW1hZ2U6IEJ1ZmZlcik6IFByb21pc2U8SU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlPiA9PiB7XHJcbiAgY29uc3QgcGF0aHMgPSBbLi4ub3B0aW9ucy5wYXRoLnJlcGxhY2UoL1xcLyskL2csICcnKS5zcGxpdCgnLycpLCAuLi5wYXRoLmRpcm5hbWUoZmlsZU5hbWUpLnNwbGl0KCcvJyldXHJcbiAgbGV0IGN1cnJlbnRQYXRoID0gJydcclxuICBmb3IgKGNvbnN0IHAgb2YgcGF0aHMpIHtcclxuICAgIGlmIChwKSB7XHJcbiAgICAgIGN1cnJlbnRQYXRoICs9IGAvJHtwfWBcclxuICAgICAgY29uc3QgZGlyb3B0aW9ucyA9IHtcclxuICAgICAgICBtZXRob2Q6ICdNS0NPTCcsXHJcbiAgICAgICAgdXJsOiBgJHtvcHRpb25zLmhvc3R9JHtlbmNvZGVVUkkoY3VycmVudFBhdGgpfWAucmVwbGFjZSgvJTJGL2csICcvJyksXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7b3B0aW9ucy51c2VybmFtZX06JHtvcHRpb25zLnBhc3N3b3JkfWApLnRvU3RyaW5nKCdiYXNlNjQnKX1gXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgY3R4LnJlcXVlc3QoZGlyb3B0aW9ucylcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgdXJsOiBgJHtvcHRpb25zLmhvc3R9LyR7b3B0aW9ucy5wYXRoID09PSAnLycgPyAnJyA6IGVuY29kZVVSSShvcHRpb25zLnBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtvcHRpb25zLnVzZXJuYW1lfToke29wdGlvbnMucGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXHJcbiAgICAgICdDb250ZW50LVR5cGUnOiBtaW1lLmxvb2t1cChmaWxlTmFtZSkgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsXHJcbiAgICAgICdDb250ZW50LUxlbmd0aCc6IGltYWdlLmxlbmd0aFxyXG4gICAgfSxcclxuICAgIGJvZHk6IGltYWdlLFxyXG4gICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvIHwgYm9vbGVhbj4gPT4ge1xyXG4gIGNvbnN0IHdlYmRhdnBsaXN0T3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVdlYmRhdlBsaXN0Q29uZmlnPigncGljQmVkLndlYmRhdnBsaXN0JylcclxuICBpZiAoIXdlYmRhdnBsaXN0T3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgd2ViZGF2cGxpc3QgY29uZmlnJylcclxuICB9XHJcbiAgd2ViZGF2cGxpc3RPcHRpb25zLmhvc3QgPSB3ZWJkYXZwbGlzdE9wdGlvbnMuaG9zdC5yZXBsYWNlKC9eaHR0cHM/OlxcL1xcL3xcXC8rJC9nLCAnJylcclxuICB3ZWJkYXZwbGlzdE9wdGlvbnMuaG9zdCA9ICh3ZWJkYXZwbGlzdE9wdGlvbnMuc3NsRW5hYmxlZCA/ICdodHRwczovLycgOiAnaHR0cDovLycpICsgd2ViZGF2cGxpc3RPcHRpb25zLmhvc3RcclxuICB3ZWJkYXZwbGlzdE9wdGlvbnMucGF0aCA9ICh3ZWJkYXZwbGlzdE9wdGlvbnMucGF0aCB8fCAnJykucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpICsgJy8nXHJcbiAgY29uc3Qgd2VicGF0aCA9ICh3ZWJkYXZwbGlzdE9wdGlvbnMud2VicGF0aCB8fCAnJykucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpICsgJy8nXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBjb25zdCBjdXN0b21VcmwgPSB3ZWJkYXZwbGlzdE9wdGlvbnMuY3VzdG9tVXJsXHJcbiAgICBjb25zdCBwYXRoID0gd2ViZGF2cGxpc3RPcHRpb25zLnBhdGhcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCBwb3N0T3B0aW9ucyhjdHgsIHdlYmRhdnBsaXN0T3B0aW9ucywgaW1nLmZpbGVOYW1lLCBpbWFnZSlcclxuICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID49IDIwMCAmJiBib2R5LnN0YXR1c0NvZGUgPCAzMDApIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBjb25zdCBiYXNlVXJsID0gY3VzdG9tVXJsIHx8IHdlYmRhdnBsaXN0T3B0aW9ucy5ob3N0XHJcbiAgICAgICAgICBpZiAod2ViZGF2cGxpc3RPcHRpb25zLndlYnBhdGgpIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2Jhc2VVcmx9LyR7d2VicGF0aCA9PT0gJy8nID8gJycgOiBlbmNvZGVVUklDb21wb25lbnQod2VicGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7YmFzZVVybH0vJHtwYXRoID09PSAnLycgPyAnJyA6IGVuY29kZVVSSUNvbXBvbmVudChwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGxvYWQgZmFpbGVkJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1MnKVxyXG4gICAgfSlcclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJV2ViZGF2UGxpc3RDb25maWc+KCdwaWNCZWQud2ViZGF2cGxpc3QnKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaG9zdCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfSE9TVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuaG9zdCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdzc2xFbmFibGVkJyxcclxuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX1NTTEVOQUJMRUQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zc2xFbmFibGVkIHx8IHRydWUsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX1NTTEVOQUJMRUQnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9TU0xFTkFCTEVEJykgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3VzZXJuYW1lJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9VU0VSTkFNRScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudXNlcm5hbWUgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9VU0VSTkFNRScpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1VTRVJOQU1FJykgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9QQVNTV09SRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGFzc3dvcmQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9QQVNTV09SRCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBU1NXT1JEJykgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX1BBVEgnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhdGggfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBVEgnKSB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnd2VicGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfV0VCU0lURV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX1dFQlNJVEVfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1dFQlNJVEVfUEFUSCcpIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0NVU1RPTVVSTCcpIH1cclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCd3ZWJkYXZwbGlzdCcsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVCcpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBpY0dvUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBTTU1TVXBsb2FkZXIgZnJvbSAnLi9zbW1zJ1xyXG5pbXBvcnQgdGNZdW5VcGxvYWRlciBmcm9tICcuL3RjeXVuJ1xyXG5pbXBvcnQgZ2l0aHViVXBsb2FkZXIgZnJvbSAnLi9naXRodWInXHJcbmltcG9ydCBxaW5pdVVwbG9hZGVyIGZyb20gJy4vcWluaXUnXHJcbmltcG9ydCBpbWd1clVwbG9hZGVyIGZyb20gJy4vaW1ndXInXHJcbmltcG9ydCBhbGlZdW5VcGxvYWRlciBmcm9tICcuL2FsaXl1bidcclxuaW1wb3J0IHVwWXVuVXBsb2FkZXIgZnJvbSAnLi91cHl1bidcclxuaW1wb3J0IHdlYmRhdnBsaXN0VXBsb2FkZXIgZnJvbSAnLi93ZWJkYXYnXHJcblxyXG5jb25zdCBidWlsZEluVXBsb2FkZXJzOiBJUGljR29QbHVnaW4gPSAoKSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHJlZ2lzdGVyIChjdHg6IElQaWNHbykge1xyXG4gICAgICBhbGlZdW5VcGxvYWRlcihjdHgpXHJcbiAgICAgIHRjWXVuVXBsb2FkZXIoY3R4KVxyXG4gICAgICBTTU1TVXBsb2FkZXIoY3R4KVxyXG4gICAgICBnaXRodWJVcGxvYWRlcihjdHgpXHJcbiAgICAgIHFpbml1VXBsb2FkZXIoY3R4KVxyXG4gICAgICBpbWd1clVwbG9hZGVyKGN0eClcclxuICAgICAgdXBZdW5VcGxvYWRlcihjdHgpXHJcbiAgICAgIHdlYmRhdnBsaXN0VXBsb2FkZXIoY3R4KVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgYnVpbGRJblVwbG9hZGVyc1xyXG4iLCJpbXBvcnQge1xyXG4gIGlzVXJsLFxyXG4gIGdldEltYWdlU2l6ZSxcclxuICBnZXRGU0ZpbGUsXHJcbiAgZ2V0VVJMRmlsZVxyXG59IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IHsgSVBpY0dvLCBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbywgSUltZ0luZm8sIElJbWdTaXplIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHJlc3VsdHM6IElJbWdJbmZvW10gPSBjdHgub3V0cHV0XHJcbiAgYXdhaXQgUHJvbWlzZS5hbGwoY3R4LmlucHV0Lm1hcChhc3luYyAoaXRlbTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICBsZXQgaW5mbzogSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm9cclxuICAgIGlmIChpc1VybChpdGVtKSkge1xyXG4gICAgICBpbmZvID0gYXdhaXQgZ2V0VVJMRmlsZShpdGVtLCBjdHgpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpbmZvID0gYXdhaXQgZ2V0RlNGaWxlKGl0ZW0pXHJcbiAgICB9XHJcbiAgICBpZiAoaW5mby5zdWNjZXNzICYmIGluZm8uYnVmZmVyKSB7XHJcbiAgICAgIGNvbnN0IGltZ1NpemUgPSBnZXRJbWdTaXplKGN0eCwgaW5mby5idWZmZXIsIGl0ZW0pXHJcbiAgICAgIHJlc3VsdHNbaW5kZXhdID0ge1xyXG4gICAgICAgIGJ1ZmZlcjogaW5mby5idWZmZXIsXHJcbiAgICAgICAgZmlsZU5hbWU6IGluZm8uZmlsZU5hbWUsXHJcbiAgICAgICAgd2lkdGg6IGltZ1NpemUud2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBpbWdTaXplLmhlaWdodCxcclxuICAgICAgICBleHRuYW1lOiBpbmZvLmV4dG5hbWVcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGluZm8ucmVhc29uKVxyXG4gICAgfVxyXG4gIH0pKVxyXG4gIC8vIHJlbW92ZSBlbXB0eSBpdGVtXHJcbiAgY3R4Lm91dHB1dCA9IHJlc3VsdHMuZmlsdGVyKGl0ZW0gPT4gaXRlbSlcclxuICByZXR1cm4gY3R4XHJcbn1cclxuXHJcbmNvbnN0IGdldEltZ1NpemUgPSAoY3R4OiBJUGljR28sIGZpbGU6IEJ1ZmZlciwgcGF0aDogc3RyaW5nKTogSUltZ1NpemUgPT4ge1xyXG4gIGNvbnN0IGltYWdlU2l6ZSA9IGdldEltYWdlU2l6ZShmaWxlKVxyXG4gIGlmICghaW1hZ2VTaXplLnJlYWwpIHtcclxuICAgIGN0eC5sb2cud2FybihgY2FuJ3QgZ2V0ICR7cGF0aH0ncyBpbWFnZSBzaXplYClcclxuICAgIGN0eC5sb2cud2FybignZmFsbGJhY2sgdG8gMjAwICogMjAwJylcclxuICB9XHJcbiAgcmV0dXJuIGltYWdlU2l6ZVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgaGFuZGxlXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY3R4Lm91dHB1dC5wdXNoKC4uLmN0eC5pbnB1dClcclxuICByZXR1cm4gY3R4XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBoYW5kbGVcclxufVxyXG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCByZXNvbHZlIGZyb20gJ3Jlc29sdmUnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJUGljR28sIElQaWNHb1BsdWdpbiwgSVBsdWdpbkxvYWRlciwgSVBpY0dvUGx1Z2luSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnXHJcbmltcG9ydCB7IHNldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSAnLi9MaWZlY3ljbGVQbHVnaW5zJ1xyXG5cclxuLyoqXHJcbiAqIExvY2FsIHBsdWdpbiBsb2FkZXIsIGZpbGUgc3lzdGVtIGlzIHJlcXVpcmVkXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGx1Z2luTG9hZGVyIGltcGxlbWVudHMgSVBsdWdpbkxvYWRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgbGlzdDogc3RyaW5nW10gPSBbXVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZnVsbExpc3Q6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5NYXA6IE1hcDxzdHJpbmcsIElQaWNHb1BsdWdpbkludGVyZmFjZT4gPSBuZXcgTWFwKClcclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgICB0aGlzLmluaXQoKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0ICgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdwYWNrYWdlLmpzb24nKVxyXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VQYXRoKSkge1xyXG4gICAgICBjb25zdCBwa2cgPSB7XHJcbiAgICAgICAgbmFtZTogJ3BpY2dvLXBsdWdpbnMnLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiAncGljZ28tcGx1Z2lucycsXHJcbiAgICAgICAgcmVwb3NpdG9yeTogJ2h0dHBzOi8vZ2l0aHViLmNvbS9QaWNHby9QaWNHby1Db3JlJyxcclxuICAgICAgICBsaWNlbnNlOiAnTUlUJ1xyXG4gICAgICB9XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZVBhdGgsIEpTT04uc3RyaW5naWZ5KHBrZyksICd1dGY4JylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldCBwbHVnaW4gZW50cnlcclxuICBwcml2YXRlIHJlc29sdmVQbHVnaW4gKGN0eDogSVBpY0dvLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHJlc29sdmUuc3luYyhuYW1lLCB7IGJhc2VkaXI6IGN0eC5iYXNlRGlyIH0pXHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgcmV0dXJuIHBhdGguam9pbihjdHguYmFzZURpciwgJ25vZGVfbW9kdWxlcycsIG5hbWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBsb2FkIGFsbCB0aGlyZCBwYXJ0eSBwbHVnaW5cclxuICBsb2FkICgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdwYWNrYWdlLmpzb24nKVxyXG4gICAgY29uc3QgcGx1Z2luRGlyID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdub2RlX21vZHVsZXMvJylcclxuICAgIC8vIFRoYW5rcyB0byBoZXhvIC0+IGh0dHBzOi8vZ2l0aHViLmNvbS9oZXhvanMvaGV4by9ibG9iL21hc3Rlci9saWIvaGV4by9sb2FkX3BsdWdpbnMuanNcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhwbHVnaW5EaXIpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gICAgY29uc3QganNvbiA9IGZzLnJlYWRKU09OU3luYyhwYWNrYWdlUGF0aClcclxuICAgIGNvbnN0IGRlcHMgPSBPYmplY3Qua2V5cyhqc29uLmRlcGVuZGVuY2llcyB8fCB7fSlcclxuICAgIGNvbnN0IGRldkRlcHMgPSBPYmplY3Qua2V5cyhqc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fSlcclxuICAgIGNvbnN0IG1vZHVsZXMgPSBkZXBzLmNvbmNhdChkZXZEZXBzKS5maWx0ZXIoKG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoIS9ecGljZ28tcGx1Z2luLXxeQFteL10rXFwvcGljZ28tcGx1Z2luLS8udGVzdChuYW1lKSkgcmV0dXJuIGZhbHNlXHJcbiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnJlc29sdmVQbHVnaW4odGhpcy5jdHgsIG5hbWUpXHJcbiAgICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgpXHJcbiAgICB9KVxyXG4gICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICB0aGlzLnJlZ2lzdGVyUGx1Z2luKG1vZHVsZSlcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICByZWdpc3RlclBsdWdpbiAobmFtZTogc3RyaW5nLCBwbHVnaW4/OiBJUGljR29QbHVnaW4pOiB2b2lkIHtcclxuICAgIGlmICghbmFtZSB8fCB0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgdGhpcy5jdHgubG9nLndhcm4oJ1BsZWFzZSBwcm92aWRlIHZhbGlkIHBsdWdpbicpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5mdWxsTGlzdC5hZGQobmFtZSlcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIHJlZ2lzdGVyIGxvY2FsIHBsdWdpblxyXG4gICAgICBpZiAoIXBsdWdpbikge1xyXG4gICAgICAgIGlmICh0aGlzLmN0eC5nZXRDb25maWcoYHBpY2dvUGx1Z2lucy4ke25hbWV9YCkgPT09IHRydWUgfHwgKHRoaXMuY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7bmFtZX1gKSA9PT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgdGhpcy5saXN0LnB1c2gobmFtZSlcclxuICAgICAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKG5hbWUpXHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgdGhpcy5nZXRQbHVnaW4obmFtZSkhLnJlZ2lzdGVyKHRoaXMuY3R4KVxyXG4gICAgICAgICAgY29uc3QgcGx1Z2luID0gYHBpY2dvUGx1Z2luc1ske25hbWV9XWBcclxuICAgICAgICAgIHRoaXMuY3R4LnNhdmVDb25maWcoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBbcGx1Z2luXTogdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIHJlZ2lzdGVyIHByb3ZpZGVkIHBsdWdpblxyXG4gICAgICAgIC8vICYmIHdvbid0IHdyaXRlIGNvbmZpZyB0byBmaWxlc1xyXG4gICAgICAgIHRoaXMubGlzdC5wdXNoKG5hbWUpXHJcbiAgICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUobmFtZSlcclxuICAgICAgICBjb25zdCBwbHVnaW5JbnRlcmZhY2UgPSBwbHVnaW4odGhpcy5jdHgpXHJcbiAgICAgICAgdGhpcy5wbHVnaW5NYXAuc2V0KG5hbWUsIHBsdWdpbkludGVyZmFjZSlcclxuICAgICAgICBwbHVnaW5JbnRlcmZhY2UucmVnaXN0ZXIodGhpcy5jdHgpXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhpcy5wbHVnaW5NYXAuZGVsZXRlKG5hbWUpXHJcbiAgICAgIHRoaXMubGlzdCA9IHRoaXMubGlzdC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gbmFtZSlcclxuICAgICAgdGhpcy5mdWxsTGlzdC5kZWxldGUobmFtZSlcclxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGUgYXMgRXJyb3IpXHJcbiAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICB0aXRsZTogYFBsdWdpbiAke25hbWV9IExvYWQgRXJyb3JgLFxyXG4gICAgICAgIGJvZHk6IGVcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVucmVnaXN0ZXJQbHVnaW4gKG5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5saXN0ID0gdGhpcy5saXN0LmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSBuYW1lKVxyXG4gICAgdGhpcy5mdWxsTGlzdC5kZWxldGUobmFtZSlcclxuICAgIHRoaXMucGx1Z2luTWFwLmRlbGV0ZShuYW1lKVxyXG4gICAgc2V0Q3VycmVudFBsdWdpbk5hbWUobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci51cGxvYWRlci51bnJlZ2lzdGVyKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5oZWxwZXIudHJhbnNmb3JtZXIudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLmJlZm9yZVRyYW5zZm9ybVBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLmJlZm9yZVVwbG9hZFBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLmFmdGVyVXBsb2FkUGx1Z2lucy51bnJlZ2lzdGVyKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5jbWQudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHgucmVtb3ZlQ29uZmlnKCdwaWNnb1BsdWdpbnMnLCBuYW1lKVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IHBsdWdpbiBieSBuYW1lXHJcbiAgZ2V0UGx1Z2luIChuYW1lOiBzdHJpbmcpOiBJUGljR29QbHVnaW5JbnRlcmZhY2UgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMucGx1Z2luTWFwLmhhcyhuYW1lKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5wbHVnaW5NYXAuZ2V0KG5hbWUpXHJcbiAgICB9XHJcbiAgICBjb25zdCBwbHVnaW5EaXIgPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgJ25vZGVfbW9kdWxlcy8nKVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcclxuICAgIGNvbnN0IHBsdWdpbiA9IHJlcXVpcmUocGx1Z2luRGlyICsgbmFtZSkodGhpcy5jdHgpXHJcbiAgICB0aGlzLnBsdWdpbk1hcC5zZXQobmFtZSwgcGx1Z2luKVxyXG4gICAgcmV0dXJuIHBsdWdpblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBsaXN0IG9mIGVuYWJsZWQgcGx1Z2luc1xyXG4gICAqL1xyXG4gIGdldExpc3QgKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLmxpc3RcclxuICB9XHJcblxyXG4gIGhhc1BsdWdpbiAobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mdWxsTGlzdC5oYXMobmFtZSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZnVsbCBsaXN0IG9mIHBsdWdpbnMsIHdoZXRoZXIgaXQgaXMgZW5hYmxlZCBvciBub3RcclxuICAgKi9cclxuICBnZXRGdWxsTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmZ1bGxMaXN0XVxyXG4gIH1cclxufVxyXG5leHBvcnQgZGVmYXVsdCBQbHVnaW5Mb2FkZXJcclxuIiwiZXhwb3J0IGNvbnN0IENMSVBCT0FSRF9JTUFHRV9GT0xERVIgPSAncGljbGlzdC1jbGlwYm9hcmQtaW1hZ2VzJ1xyXG4iLCJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnXHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcydcclxuaW1wb3J0IG9zIGZyb20gJ29zJ1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBpc1dzbCBmcm9tICdpcy13c2wnXHJcbmltcG9ydCB7IElQaWNHbywgSUNsaXBib2FyZEltYWdlIH0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuL2VudW0nXHJcbmltcG9ydCBtYWNDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvbWFjLmFwcGxlc2NyaXB0J1xyXG5pbXBvcnQgd2luZG93c0NsaXBib2FyZFNjcmlwdCBmcm9tICcuL2NsaXBib2FyZC93aW5kb3dzLnBzMSdcclxuaW1wb3J0IHdpbmRvd3MxMENsaXBib2FyZFNjcmlwdCBmcm9tICcuL2NsaXBib2FyZC93aW5kb3dzMTAucHMxJ1xyXG5pbXBvcnQgbGludXhDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvbGludXguc2gnXHJcbmltcG9ydCB3c2xDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvd3NsLnNoJ1xyXG5pbXBvcnQgeyBDTElQQk9BUkRfSU1BR0VfRk9MREVSIH0gZnJvbSAnLi9zdGF0aWMnXHJcblxyXG5leHBvcnQgdHlwZSBQbGF0Zm9ybSA9ICdkYXJ3aW4nIHwgJ3dpbjMyJyB8ICd3aW4xMCcgfCAnbGludXgnIHwgJ3dzbCdcclxuXHJcbmNvbnN0IGdldEN1cnJlbnRQbGF0Zm9ybSA9ICgpOiBQbGF0Zm9ybSA9PiB7XHJcbiAgY29uc3QgcGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtXHJcbiAgaWYgKGlzV3NsKSB7XHJcbiAgICByZXR1cm4gJ3dzbCdcclxuICB9XHJcbiAgaWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcbiAgICBjb25zdCBjdXJyZW50T1MgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKVswXVxyXG4gICAgaWYgKGN1cnJlbnRPUyA9PT0gJzEwJykge1xyXG4gICAgICByZXR1cm4gJ3dpbjEwJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICd3aW4zMidcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnZGFyd2luJykge1xyXG4gICAgcmV0dXJuICdkYXJ3aW4nXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiAnbGludXgnXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBwbGF0Zm9ybTJTY3JpcHRDb250ZW50OiB7XHJcbiAgW2tleSBpbiBQbGF0Zm9ybV06IHN0cmluZ1xyXG59ID0ge1xyXG4gIGRhcndpbjogbWFjQ2xpcGJvYXJkU2NyaXB0LFxyXG4gIHdpbjMyOiB3aW5kb3dzQ2xpcGJvYXJkU2NyaXB0LFxyXG4gIHdpbjEwOiB3aW5kb3dzMTBDbGlwYm9hcmRTY3JpcHQsXHJcbiAgbGludXg6IGxpbnV4Q2xpcGJvYXJkU2NyaXB0LFxyXG4gIHdzbDogd3NsQ2xpcGJvYXJkU2NyaXB0XHJcbn1cclxuLyoqXHJcbiAqIHBvd2Vyc2hlbGwgd2lsbCByZXBvcnQgZXJyb3IgaWYgZmlsZSBkb2VzIG5vdCBoYXZlIGEgJy5wczEnIGV4dGVuc2lvbixcclxuICogc28gd2Ugc2hvdWxkIGtlZXAgdGhlIGV4dGVuc2lvbiBuYW1lIGNvbnNpc3RlbnQgd2l0aCBjb3JyZXNwb25kaW5nIHNoZWxsXHJcbiAqL1xyXG5jb25zdCBwbGF0Zm9ybTJTY3JpcHRGaWxlbmFtZToge1xyXG4gIFtrZXkgaW4gUGxhdGZvcm1dOiBzdHJpbmdcclxufSA9IHtcclxuICBkYXJ3aW46ICdtYWMuYXBwbGVzY3JpcHQnLFxyXG4gIHdpbjMyOiAnd2luZG93cy5wczEnLFxyXG4gIHdpbjEwOiAnd2luZG93czEwLnBzMScsXHJcbiAgbGludXg6ICdsaW51eC5zaCcsXHJcbiAgd3NsOiAnd3NsLnNoJ1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVJbWFnZUZvbGRlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjb25zdCBpbWFnZVBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsIENMSVBCT0FSRF9JTUFHRV9GT0xERVIpXHJcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGltYWdlUGF0aCkpIHtcclxuICAgIGZzLm1rZGlyU3luYyhpbWFnZVBhdGgpXHJcbiAgfVxyXG59XHJcblxyXG4vLyBUaGFua3MgdG8gdnMtcGljZ286IGh0dHBzOi8vZ2l0aHViLmNvbS9TcGFkZXMtUy92cy1waWNnby9ibG9iL21hc3Rlci9zcmMvZXh0ZW5zaW9uLnRzXHJcbmNvbnN0IGdldENsaXBib2FyZEltYWdlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJQ2xpcGJvYXJkSW1hZ2U+ID0+IHtcclxuICBjcmVhdGVJbWFnZUZvbGRlcihjdHgpXHJcbiAgLy8gYWRkIGFuIGNsaXBib2FyZCBpbWFnZSBmb2xkZXIgdG8gY29udHJvbCB0aGUgaW1hZ2UgY2FjaGUgZmlsZVxyXG4gIGNvbnN0IGltYWdlUGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUiwgYCR7ZGF5anMoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJyl9LnBuZ2ApXHJcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPElDbGlwYm9hcmRJbWFnZT4oKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKTogdm9pZCA9PiB7XHJcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGdldEN1cnJlbnRQbGF0Zm9ybSgpXHJcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCBwbGF0Zm9ybTJTY3JpcHRGaWxlbmFtZVtwbGF0Zm9ybV0pXHJcbiAgICAvLyBJZiB0aGUgc2NyaXB0IGRvZXMgbm90IGV4aXN0IHlldCwgd2UgbmVlZCB0byB3cml0ZSB0aGUgY29udGVudCB0byB0aGUgc2NyaXB0IGZpbGVcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhzY3JpcHRQYXRoKSkge1xyXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxyXG4gICAgICAgIHNjcmlwdFBhdGgsXHJcbiAgICAgICAgcGxhdGZvcm0yU2NyaXB0Q29udGVudFtwbGF0Zm9ybV0sXHJcbiAgICAgICAgJ3V0ZjgnXHJcbiAgICAgIClcclxuICAgIH1cclxuICAgIGxldCBleGVjdXRpb25cclxuICAgIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcclxuICAgICAgZXhlY3V0aW9uID0gc3Bhd24oJ29zYXNjcmlwdCcsIFtzY3JpcHRQYXRoLCBpbWFnZVBhdGhdKVxyXG4gICAgfSBlbHNlIGlmIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJyB8fCBwbGF0Zm9ybSA9PT0gJ3dpbjEwJykge1xyXG4gICAgICBleGVjdXRpb24gPSBzcGF3bigncG93ZXJzaGVsbCcsIFtcclxuICAgICAgICAnLW5vcHJvZmlsZScsXHJcbiAgICAgICAgJy1ub25pbnRlcmFjdGl2ZScsXHJcbiAgICAgICAgJy1ub2xvZ28nLFxyXG4gICAgICAgICctc3RhJyxcclxuICAgICAgICAnLWV4ZWN1dGlvbnBvbGljeScsICd1bnJlc3RyaWN0ZWQnLFxyXG4gICAgICAgIC8vIGZpeCB3aW5kb3dzIDEwIG5hdGl2ZSBjbWQgY3Jhc2ggYnVnIHdoZW4gXCJwaWNnbyB1cGxvYWRcIlxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9QaWNHby9QaWNHby1Db3JlL2lzc3Vlcy8zMlxyXG4gICAgICAgIC8vICctd2luZG93c3R5bGUnLCdoaWRkZW4nLFxyXG4gICAgICAgIC8vICctbm9leGl0JyxcclxuICAgICAgICAnLWZpbGUnLCBzY3JpcHRQYXRoLFxyXG4gICAgICAgIGltYWdlUGF0aFxyXG4gICAgICBdKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZXhlY3V0aW9uID0gc3Bhd24oJ3NoJywgW3NjcmlwdFBhdGgsIGltYWdlUGF0aF0pXHJcbiAgICB9XHJcblxyXG4gICAgZXhlY3V0aW9uLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcclxuICAgICAgaWYgKHBsYXRmb3JtID09PSAnbGludXgnKSB7XHJcbiAgICAgICAgaWYgKGRhdGEudG9TdHJpbmcoKS50cmltKCkgPT09ICdubyB4Y2xpcCBvciB3bC1jbGlwYm9hcmQnKSB7XHJcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgICB0aXRsZTogJ3hjbGlwIG9yIHdsLWNsaXBib2FyZCBub3QgZm91bmQnLFxyXG4gICAgICAgICAgICBib2R5OiAnUGxlYXNlIGluc3RhbGwgeGNsaXAoZm9yIHgxMSkgb3Igd2wtY2xpcGJvYXJkKGZvciB3YXlsYW5kKSBiZWZvcmUgcnVuIHBpY2dvJ1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdQbGVhc2UgaW5zdGFsbCB4Y2xpcChmb3IgeDExKSBvciB3bC1jbGlwYm9hcmQoZm9yIHdheWxhbmQpIGJlZm9yZSBydW4gcGljZ28nKSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaW1nUGF0aCA9IGRhdGEudG9TdHJpbmcoKS50cmltKClcclxuXHJcbiAgICAgIC8vIGlmIHRoZSBmaWxlUGF0aCBpcyB0aGUgcmVhbCBmaWxlIGluIHN5c3RlbVxyXG4gICAgICAvLyB3ZSBzaG91bGQga2VlcCBpdCBpbnN0ZWFkIG9mIHJlbW92aW5nXHJcbiAgICAgIGxldCBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcgPSBmYWxzZVxyXG5cclxuICAgICAgLy8gaW4gbWFjT1MgaWYgeW91ciBjb3B5IHRoZSBmaWxlIGluIHN5c3RlbSwgaXQncyBiYXNlbmFtZSB3aWxsIG5vdCBlcXVhbCB0byBvdXIgZGVmYXVsdCBiYXNlbmFtZVxyXG4gICAgICBpZiAocGF0aC5iYXNlbmFtZShpbWdQYXRoKSAhPT0gcGF0aC5iYXNlbmFtZShpbWFnZVBhdGgpKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIHBhdGggaXMgbm90IGdlbmVyYXRlIGJ5IHBpY2dvXHJcbiAgICAgICAgLy8gYnV0IHRoZSBwYXRoIGV4aXN0cywgd2Ugc2hvdWxkIGtlZXAgaXRcclxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhpbWdQYXRoKSkge1xyXG4gICAgICAgICAgc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBpZiB0aGUgaW1nUGF0aCBpcyBpbnZhbGlkXHJcbiAgICAgIGlmIChpbWdQYXRoICE9PSAnbm8gaW1hZ2UnICYmICFmcy5leGlzdHNTeW5jKGltZ1BhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYENhbid0IGZpbmQgJHtpbWdQYXRofWApKVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXNvbHZlKHtcclxuICAgICAgICBpbWdQYXRoLFxyXG4gICAgICAgIHNob3VsZEtlZXBBZnRlclVwbG9hZGluZ1xyXG4gICAgICB9KVxyXG4gICAgfSlcclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBnZXRDbGlwYm9hcmRJbWFnZVxyXG4iLCJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnXHJcblxyXG5jb25zdCBldmVudEJ1cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxyXG5leHBvcnQge1xyXG4gIGV2ZW50QnVzXHJcbn1cclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LWZ1bmN0aW9uLXJldHVybi10eXBlICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9wcm9taXNlLWZ1bmN0aW9uLWFzeW5jICovXHJcbmltcG9ydCBheGlvcywgeyBBeGlvc1JlcXVlc3RDb25maWcsIEF4aW9zUmVzcG9uc2UgfSBmcm9tICdheGlvcydcclxuaW1wb3J0IHsgSVBpY0dvLCBVbmRlZmluYWJsZSwgSUNvbmZpZ0NoYW5nZVBheWxvYWQsIElDb25maWcsIElSZXF1ZXN0Q29uZmlnLCBJT2xkUmVxT3B0aW9ucywgSVJlc3BvbnNlLCBJRnVsbFJlc3BvbnNlLCBJUmVxdWVzdCB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVzRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBldmVudEJ1cyB9IGZyb20gJy4uL3V0aWxzL2V2ZW50QnVzJ1xyXG5pbXBvcnQgeyBVUkwgfSBmcm9tICd1cmwnXHJcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnXHJcbmltcG9ydCBodHRwcyBmcm9tICdodHRwcydcclxuaW1wb3J0IHR1bm5lbCBmcm9tICd0dW5uZWwnXHJcbmNvbnN0IGh0dHBzQWdlbnQgPSBuZXcgaHR0cHMuQWdlbnQoe1xyXG4gIG1heFZlcnNpb246ICdUTFN2MS4yJyxcclxuICBtaW5WZXJzaW9uOiAnVExTdjEuMidcclxufSlcclxuXHJcbi8vIHRoYW5rcyBmb3IgaHR0cHM6Ly9naXRodWIuZGV2L3JlcXVlc3QvcmVxdWVzdC9ibG9iL21hc3Rlci9pbmRleC5qc1xyXG5mdW5jdGlvbiBhcHBlbmRGb3JtRGF0YSAoZm9ybTogRm9ybURhdGEsIGtleTogc3RyaW5nLCBkYXRhOiBhbnkpOiB2b2lkIHtcclxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICd2YWx1ZScgaW4gZGF0YSAmJiAnb3B0aW9ucycgaW4gZGF0YSkge1xyXG4gICAgZm9ybS5hcHBlbmQoa2V5LCBkYXRhLnZhbHVlLCBkYXRhLm9wdGlvbnMpXHJcbiAgfSBlbHNlIHtcclxuICAgIGZvcm0uYXBwZW5kKGtleSwgZGF0YSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcXVlc3RJbnRlcmNlcHRvciAob3B0aW9uczogSU9sZFJlcU9wdGlvbnMgfCBBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1JlcXVlc3RDb25maWcgJiB7XHJcbiAgX19pc09sZE9wdGlvbnM/OiBib29sZWFuXHJcbn0ge1xyXG4gIGxldCBfX2lzT2xkT3B0aW9ucyA9IGZhbHNlXHJcbiAgY29uc3Qgb3B0OiBBeGlvc1JlcXVlc3RDb25maWc8YW55PiAmIHtcclxuICAgIF9faXNPbGRPcHRpb25zPzogYm9vbGVhblxyXG4gIH0gPSB7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgdXJsOiAob3B0aW9ucy51cmwgYXMgc3RyaW5nKSB8fCAnJyxcclxuICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB8fCB7fVxyXG4gIH1cclxuICAvLyB1c2VyIHJlcXVlc3QgY29uZmlnIHByb3h5XHJcbiAgaWYgKG9wdGlvbnMucHJveHkpIHtcclxuICAgIGxldCBwcm94eU9wdGlvbnMgPSBvcHRpb25zLnByb3h5XHJcbiAgICBpZiAodHlwZW9mIHByb3h5T3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBwcm94eU9wdGlvbnMgPSBuZXcgVVJMKG9wdGlvbnMucHJveHkpXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBwcm94eU9wdGlvbnMgPSBmYWxzZVxyXG4gICAgICAgIG9wdC5wcm94eSA9IGZhbHNlXHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICB9XHJcbiAgICAgIF9faXNPbGRPcHRpb25zID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYgKHByb3h5T3B0aW9ucykge1xyXG4gICAgICBpZiAob3B0aW9ucy51cmw/LnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcclxuICAgICAgICBvcHQucHJveHkgPSBmYWxzZVxyXG4gICAgICAgIG9wdC5odHRwc0FnZW50ID0gdHVubmVsLmh0dHBzT3Zlckh0dHAoe1xyXG4gICAgICAgICAgcHJveHk6IHtcclxuICAgICAgICAgICAgaG9zdDogcHJveHlPcHRpb25zPy5ob3N0bmFtZSxcclxuICAgICAgICAgICAgcG9ydDogcGFyc2VJbnQocHJveHlPcHRpb25zPy5wb3J0LCAxMClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG9wdC5wcm94eSA9IHtcclxuICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucy5ob3N0bmFtZSxcclxuICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KHByb3h5T3B0aW9ucy5wb3J0LCAxMCksXHJcbiAgICAgICAgICBwcm90b2NvbDogJ2h0dHAnXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmICgnZm9ybURhdGEnIGluIG9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucy5mb3JtRGF0YSkge1xyXG4gICAgICBjb25zdCBkYXRhID0gb3B0aW9ucy5mb3JtRGF0YVtrZXldXHJcbiAgICAgIGFwcGVuZEZvcm1EYXRhKGZvcm0sIGtleSwgZGF0YSlcclxuICAgIH1cclxuICAgIG9wdC5kYXRhID0gZm9ybVxyXG4gICAgb3B0LmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKG9wdC5oZWFkZXJzIHx8IHt9LCBmb3JtLmdldEhlYWRlcnMoKSlcclxuICAgIF9faXNPbGRPcHRpb25zID0gdHJ1ZVxyXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxyXG4gICAgZGVsZXRlIG9wdC5mb3JtRGF0YVxyXG4gIH1cclxuICBpZiAoJ2JvZHknIGluIG9wdGlvbnMpIHtcclxuICAgIG9wdC5kYXRhID0gb3B0aW9ucy5ib2R5XHJcbiAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcclxuICAgIGRlbGV0ZSBvcHQuYm9keVxyXG4gIH1cclxuICBpZiAoJ3FzJyBpbiBvcHRpb25zKSB7XHJcbiAgICBvcHQucGFyYW1zID0gb3B0aW9ucy5xc1xyXG4gICAgX19pc09sZE9wdGlvbnMgPSB0cnVlXHJcbiAgfVxyXG4gIG9wdC5fX2lzT2xkT3B0aW9ucyA9IF9faXNPbGRPcHRpb25zXHJcbiAgcmV0dXJuIG9wdFxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNwb25zZUludGVyY2VwdG9yIChyZXNwb25zZTogQXhpb3NSZXNwb25zZSk6IElGdWxsUmVzcG9uc2Uge1xyXG4gIHJldHVybiB7XHJcbiAgICAuLi5yZXNwb25zZSxcclxuICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcclxuICAgIGJvZHk6IHJlc3BvbnNlLmRhdGFcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc3BvbnNlRXJyb3JIYW5kbGVyIChlcnJvcjogYW55KSB7XHJcbiAgLy8gaWYgKGVycm9yLnJlc3BvbnNlKSB7XHJcbiAgLy8gICAvLyBUaGUgcmVxdWVzdCB3YXMgbWFkZSBhbmQgdGhlIHNlcnZlciByZXNwb25kZWQgd2l0aCBhIHN0YXR1cyBjb2RlXHJcbiAgLy8gICAvLyB0aGF0IGZhbGxzIG91dCBvZiB0aGUgcmFuZ2Ugb2YgMnh4XHJcbiAgLy8gICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJybylcclxuICAvLyB9IGVsc2UgaWYgKGVycm9yLnJlcXVlc3QpIHtcclxuICAvLyAgIC8vIFRoZSByZXF1ZXN0IHdhcyBtYWRlIGJ1dCBubyByZXNwb25zZSB3YXMgcmVjZWl2ZWRcclxuICAvLyAgIC8vIGBlcnJvci5yZXF1ZXN0YCBpcyBhbiBpbnN0YW5jZSBvZiBYTUxIdHRwUmVxdWVzdCBpbiB0aGUgYnJvd3NlciBhbmQgYW4gaW5zdGFuY2Ugb2ZcclxuICAvLyAgIC8vIGh0dHAuQ2xpZW50UmVxdWVzdCBpbiBub2RlLmpzXHJcbiAgLy8gICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IucmVxdWVzdClcclxuICAvLyB9IGVsc2Uge1xyXG4gIC8vICAgLy8gU29tZXRoaW5nIGhhcHBlbmVkIGluIHNldHRpbmcgdXAgdGhlIHJlcXVlc3QgdGhhdCB0cmlnZ2VyZWQgYW4gRXJyb3JcclxuICAvLyAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlKVxyXG4gIC8vIH1cclxuICBjb25zdCBlcnJvck9iaiA9IHtcclxuICAgIG1ldGhvZDogZXJyb3I/LmNvbmZpZz8ubWV0aG9kPy50b1VwcGVyQ2FzZSgpIHx8ICcnLFxyXG4gICAgdXJsOiBlcnJvcj8uY29uZmlnPy51cmwgfHwgJycsXHJcbiAgICBzdGF0dXNDb2RlOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxyXG4gICAgbWVzc2FnZTogZXJyb3I/Lm1lc3NhZ2UgfHwgJycsXHJcbiAgICBzdGFjazogZXJyb3I/LnN0YWNrIHx8IHt9LFxyXG4gICAgcmVzcG9uc2U6IHtcclxuICAgICAgc3RhdHVzOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxyXG4gICAgICBzdGF0dXNDb2RlOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxyXG4gICAgICBib2R5OiBlcnJvcj8ucmVzcG9uc2U/LmRhdGEgfHwgJydcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yT2JqKVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmVxdWVzdCBpbXBsZW1lbnRzIElSZXF1ZXN0IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcbiAgcHJpdmF0ZSBwcm94eTogVW5kZWZpbmFibGU8c3RyaW5nPiA9ICcnXHJcbiAgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnPGFueT4gPSB7fVxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMuaW5pdCgpXHJcbiAgICBldmVudEJ1cy5vbihJQnVzRXZlbnQuQ09ORklHX0NIQU5HRSwgKGRhdGE6IElDb25maWdDaGFuZ2VQYXlsb2FkPHN0cmluZyB8IElDb25maWdbJ3BpY0JlZCddPikgPT4ge1xyXG4gICAgICBzd2l0Y2ggKGRhdGEuY29uZmlnTmFtZSkge1xyXG4gICAgICAgIGNhc2UgJ3BpY0JlZCc6XHJcbiAgICAgICAgICBpZiAoKGRhdGEudmFsdWUgYXMgSUNvbmZpZ1sncGljQmVkJ10pPy5wcm94eSkge1xyXG4gICAgICAgICAgICB0aGlzLnByb3h5ID0gKGRhdGEudmFsdWUgYXMgSUNvbmZpZ1sncGljQmVkJ10pLnByb3h5XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJ3BpY0JlZC5wcm94eSc6XHJcbiAgICAgICAgICB0aGlzLnByb3h5ID0gZGF0YS52YWx1ZSBhcyBzdHJpbmdcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQgKCk6IHZvaWQge1xyXG4gICAgY29uc3QgcHJveHkgPSB0aGlzLmN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC5wcm94eScpXHJcbiAgICBpZiAocHJveHkpIHtcclxuICAgICAgdGhpcy5wcm94eSA9IHByb3h5XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVByb3h5ICgpOiBBeGlvc1JlcXVlc3RDb25maWdbJ3Byb3h5J10gfCBmYWxzZSB7XHJcbiAgICBpZiAodGhpcy5wcm94eSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHByb3h5T3B0aW9ucyA9IG5ldyBVUkwodGhpcy5wcm94eSlcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgaG9zdDogcHJveHlPcHRpb25zLmhvc3RuYW1lLFxyXG4gICAgICAgICAgcG9ydDogcGFyc2VJbnQocHJveHlPcHRpb25zLnBvcnQgfHwgJzAnLCAxMCksXHJcbiAgICAgICAgICBwcm90b2NvbDogcHJveHlPcHRpb25zLnByb3RvY29sXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgLy8gIzY0IGR5bmFtaWMgZ2V0IHByb3h5IHZhbHVlXHJcbiAgcmVxdWVzdDxULCBVIGV4dGVuZHMgKFxyXG4gICAgSVJlcXVlc3RDb25maWc8VT4gZXh0ZW5kcyBJT2xkUmVxT3B0aW9ucyA/IElPbGRSZXFPcHRpb25zIDogSVJlcXVlc3RDb25maWc8VT4gZXh0ZW5kcyBBeGlvc1JlcXVlc3RDb25maWcgPyBBeGlvc1JlcXVlc3RDb25maWcgOiBuZXZlclxyXG4gICk+IChvcHRpb25zOiBVKTogUHJvbWlzZTxJUmVzcG9uc2U8VCwgVT4+IHtcclxuICAgIHRoaXMub3B0aW9ucy5wcm94eSA9IHRoaXMuaGFuZGxlUHJveHkoKVxyXG4gICAgdGhpcy5vcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5tYXhCb2R5TGVuZ3RoID0gSW5maW5pdHlcclxuICAgIHRoaXMub3B0aW9ucy5tYXhDb250ZW50TGVuZ3RoID0gSW5maW5pdHlcclxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkgJiYgb3B0aW9ucy51cmw/LnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmh0dHBzQWdlbnQgPSB0dW5uZWwuaHR0cHNPdmVySHR0cCh7XHJcbiAgICAgICAgcHJveHk6IHtcclxuICAgICAgICAgIGhvc3Q6IHRoaXMub3B0aW9ucy5wcm94eS5ob3N0LFxyXG4gICAgICAgICAgcG9ydDogdGhpcy5vcHRpb25zLnByb3h5LnBvcnRcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMub3B0aW9ucy5wcm94eSA9IGZhbHNlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaHR0cHNBZ2VudCA9IGh0dHBzQWdlbnRcclxuICAgIH1cclxuICAgIC8vICFOT1RJQ0UgdGhpcy5vcHRpb25zICE9PSBvcHRpb25zXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMgaXMgdGhlIGRlZmF1bHQgb3B0aW9uc1xyXG4gICAgY29uc3QgaW5zdGFuY2UgPSBheGlvcy5jcmVhdGUodGhpcy5vcHRpb25zKVxyXG4gICAgaW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShyZXNwb25zZUludGVyY2VwdG9yLCByZXNwb25zZUVycm9ySGFuZGxlcilcclxuXHJcbiAgICAvLyBjb21wYXRpYmxlIHdpdGggb2xkIHJlcXVlc3Qgb3B0aW9ucyB0byBuZXcgb3B0aW9uc1xyXG4gICAgY29uc3Qgb3B0ID0gcmVxdWVzdEludGVyY2VwdG9yKG9wdGlvbnMpXHJcblxyXG4gICAgaW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgLy8gaGFuZGxlIENvbnRlbnQtVHlwZVxyXG4gICAgICBsZXQgY29udGVudFR5cGUgPSAnJ1xyXG4gICAgICBpZiAob2JqPy5oZWFkZXJzPy5jb250ZW50VHlwZSkge1xyXG4gICAgICAgIGNvbnRlbnRUeXBlID0gb2JqLmhlYWRlcnMuY29udGVudFR5cGUgYXMgc3RyaW5nXHJcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzLmNvbnRlbnRUeXBlXHJcbiAgICAgIH0gZWxzZSBpZiAob2JqPy5oZWFkZXJzPy5Db250ZW50VHlwZSkge1xyXG4gICAgICAgIGNvbnRlbnRUeXBlID0gb2JqLmhlYWRlcnMuQ29udGVudFR5cGUgYXMgc3RyaW5nXHJcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzLkNvbnRlbnRUeXBlXHJcbiAgICAgIH0gZWxzZSBpZiAob2JqPy5oZWFkZXJzPy5bJ2NvbnRlbnQtdHlwZSddKSB7XHJcbiAgICAgICAgY29udGVudFR5cGUgPSBvYmouaGVhZGVyc1snY29udGVudC10eXBlJ10gYXMgc3RyaW5nXHJcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzWydjb250ZW50LXR5cGUnXVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb250ZW50VHlwZSAhPT0gJycgJiYgb2JqLmhlYWRlcnMpIHtcclxuICAgICAgICBvYmouaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBjb250ZW50VHlwZVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvYmpcclxuICAgIH0pXHJcbiAgICBpZiAoJ3Jlc29sdmVXaXRoRnVsbFJlc3BvbnNlJyBpbiBvcHRpb25zICYmIG9wdGlvbnMucmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2UpIHtcclxuICAgICAgcmV0dXJuIGluc3RhbmNlLnJlcXVlc3Qob3B0KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGluc3RhbmNlLnJlcXVlc3Qob3B0KS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgLy8gdXNlIG9sZCByZXF1ZXN0IG9wdGlvbiBmb3JtYXRcclxuICAgICAgICBpZiAob3B0Ll9faXNPbGRPcHRpb25zKSB7XHJcbiAgICAgICAgICBpZiAoJ2pzb24nIGluIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXMuZGF0YVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiByZXMuZGF0YVxyXG4gICAgICAgIH1cclxuICAgICAgfSkgYXMgUHJvbWlzZTxJUmVzcG9uc2U8VCwgVT4+XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZXF1ZXN0XHJcbiIsImltcG9ydCB7IElDb25maWcsIElQaWNHbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBKU09OU3RvcmUgfSBmcm9tICdAcGljZ28vc3RvcmUnXHJcbmltcG9ydCB7IElKU09OIH0gZnJvbSAnQHBpY2dvL3N0b3JlL2Rpc3QvdHlwZXMnXHJcblxyXG5jbGFzcyBEQiB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGI6IEpTT05TdG9yZVxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMuZGIgPSBuZXcgSlNPTlN0b3JlKHRoaXMuY3R4LmNvbmZpZ1BhdGgpXHJcblxyXG4gICAgaWYgKCF0aGlzLmRiLmhhcygncGljQmVkJykpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmRiLnNldCgncGljQmVkJywge1xyXG4gICAgICAgICAgdXBsb2FkZXI6ICdzbW1zJyxcclxuICAgICAgICAgIGN1cnJlbnQ6ICdzbW1zJ1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmRiLmhhcygncGljZ29QbHVnaW5zJykpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmRiLnNldCgncGljZ29QbHVnaW5zJywge30pXHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVhZCAoZmx1c2g/OiBib29sZWFuKTogSUpTT04ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGIucmVhZChmbHVzaClcclxuICB9XHJcblxyXG4gIGdldCAoa2V5OiBzdHJpbmcgPSAnJyk6IGFueSB7XHJcbiAgICB0aGlzLnJlYWQodHJ1ZSlcclxuICAgIHJldHVybiB0aGlzLmRiLmdldChrZXkpXHJcbiAgfVxyXG5cclxuICBzZXQgKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnJlYWQodHJ1ZSlcclxuICAgIHJldHVybiB0aGlzLmRiLnNldChrZXksIHZhbHVlKVxyXG4gIH1cclxuXHJcbiAgaGFzIChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5yZWFkKHRydWUpXHJcbiAgICByZXR1cm4gdGhpcy5kYi5oYXMoa2V5KVxyXG4gIH1cclxuXHJcbiAgdW5zZXQgKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLnJlYWQodHJ1ZSlcclxuICAgIHJldHVybiB0aGlzLmRiLnVuc2V0KGtleSwgdmFsdWUpXHJcbiAgfVxyXG5cclxuICBzYXZlQ29uZmlnIChjb25maWc6IFBhcnRpYWw8SUNvbmZpZz4pOiB2b2lkIHtcclxuICAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0KG5hbWUsIGNvbmZpZ1tuYW1lXSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZW1vdmVDb25maWcgKGNvbmZpZzogSUNvbmZpZyk6IHZvaWQge1xyXG4gICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy51bnNldChuYW1lLCBjb25maWdbbmFtZV0pXHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgREJcclxuXHJcbi8vIGNvbnN0IGluaXRDb25maWcgPSAoY29uZmlnUGF0aDogc3RyaW5nKTogbG93ZGIuTG93ZGJTeW5jPGFueT4gPT4ge1xyXG4vLyB9XHJcblxyXG4vLyBjb25zdCBzYXZlQ29uZmlnID0gKGNvbmZpZ1BhdGg6IHN0cmluZywgY29uZmlnOiBhbnkpOiB2b2lkID0+IHtcclxuLy8gICBjb25zdCBkYiA9IGluaXRDb25maWcoY29uZmlnUGF0aClcclxuLy8gICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xyXG4vLyAgICAgZGIucmVhZCgpLnNldChuYW1lLCBjb25maWdbbmFtZV0pLndyaXRlKClcclxuLy8gICB9KVxyXG4vLyB9XHJcblxyXG4vLyBleHBvcnQge1xyXG4vLyBpbml0Q29uZmlnLFxyXG4vLyBzYXZlQ29uZmlnXHJcbi8vIH1cclxuIiwiaW1wb3J0IHNwYXduIGZyb20gJ2Nyb3NzLXNwYXduJ1xyXG5pbXBvcnQge1xyXG4gIElSZXN1bHQsXHJcbiAgSVByb2Nlc3NFbnYsXHJcbiAgSVBsdWdpblByb2Nlc3NSZXN1bHQsXHJcbiAgSVBsdWdpbkhhbmRsZXIsXHJcbiAgSVBsdWdpbkhhbmRsZXJPcHRpb25zLFxyXG4gIFVuZGVmaW5hYmxlLFxyXG4gIElQaWNHbyxcclxuICBJUGx1Z2luSGFuZGxlclJlc3VsdFxyXG59IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgZ2V0UHJvY2Vzc1BsdWdpbk5hbWUsIGdldE5vcm1hbFBsdWdpbk5hbWUgfSBmcm9tICcuLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vaTE4bi96aC1DTidcclxuXHJcbmV4cG9ydCBjbGFzcyBQbHVnaW5IYW5kbGVyIGltcGxlbWVudHMgSVBsdWdpbkhhbmRsZXIge1xyXG4gIC8vIFRoYW5rcyB0byBmZWZsb3cgLT4gaHR0cHM6Ly9naXRodWIuY29tL2ZlZmxvdy9mZWZsb3cvYmxvYi9tYXN0ZXIvbGliL2ludGVybmFsL2luc3RhbGwvcGx1Z2luLmpzXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICB9XHJcblxyXG4gIGFzeW5jIGluc3RhbGwgKHBsdWdpbnM6IHN0cmluZ1tdLCBvcHRpb25zOiBJUGx1Z2luSGFuZGxlck9wdGlvbnMgPSB7fSwgZW52PzogSVByb2Nlc3NFbnYpOiBQcm9taXNlPElQbHVnaW5IYW5kbGVyUmVzdWx0PGJvb2xlYW4+PiB7XHJcbiAgICBjb25zdCBpbnN0YWxsZWRQbHVnaW5zOiBzdHJpbmdbXSA9IFtdXHJcbiAgICBjb25zdCBwcm9jZXNzUGx1Z2lucyA9IHBsdWdpbnNcclxuICAgICAgLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBoYW5kbGVQbHVnaW5OYW1lUHJvY2Vzcyh0aGlzLmN0eCwgaXRlbSkpXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICAvLyBkZXRlY3QgaWYgaGFzIGFscmVhZHkgaW5zdGFsbGVkXHJcbiAgICAgICAgLy8gb3Igd2lsbCBjYXVzZSBlcnJvclxyXG4gICAgICAgIGlmICh0aGlzLmN0eC5wbHVnaW5Mb2FkZXIuaGFzUGx1Z2luKGl0ZW0ucGtnTmFtZSkpIHtcclxuICAgICAgICAgIGluc3RhbGxlZFBsdWdpbnMucHVzaChpdGVtLnBrZ05hbWUpXHJcbiAgICAgICAgICB0aGlzLmN0eC5sb2cuc3VjY2VzcyhgUGljR28gaGFzIGFscmVhZHkgaW5zdGFsbGVkICR7aXRlbS5wa2dOYW1lfWApXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgc29tZXRoaW5nIHdyb25nLCBmaWx0ZXIgaXQgb3V0XHJcbiAgICAgICAgaWYgKCFpdGVtLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9KVxyXG4gICAgY29uc3QgZnVsbE5hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKGl0ZW0gPT4gaXRlbS5mdWxsTmFtZSlcclxuICAgIGNvbnN0IHBrZ05hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKGl0ZW0gPT4gaXRlbS5wa2dOYW1lKVxyXG4gICAgaWYgKGZ1bGxOYW1lTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIGluc3RhbGwgcGx1Z2lucyBtdXN0IHVzZSBmdWxsTmFtZUxpc3Q6XHJcbiAgICAgIC8vIDEuIGluc3RhbGwgcmVtb3RlIHBhY2FnZVxyXG4gICAgICAvLyAyLiBpbnN0YWxsIGxvY2FsIHBhY2FnZVxyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWNDb21tYW5kKCdpbnN0YWxsJywgZnVsbE5hbWVMaXN0LCB0aGlzLmN0eC5iYXNlRGlyLCBvcHRpb25zLCBlbnYpXHJcbiAgICAgIGlmICghcmVzdWx0LmNvZGUpIHtcclxuICAgICAgICBwa2dOYW1lTGlzdC5mb3JFYWNoKChwbHVnaW5OYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3R4LnBsdWdpbkxvYWRlci5yZWdpc3RlclBsdWdpbihwbHVnaW5OYW1lKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTJykpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgnaW5zdGFsbFN1Y2Nlc3MnLCB7XHJcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTJyksXHJcbiAgICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PHRydWU+ID0ge1xyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgIGJvZHk6IFsuLi5wa2dOYW1lTGlzdCwgLi4uaW5zdGFsbGVkUGx1Z2luc11cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTicsIHtcclxuICAgICAgICAgIGNvZGU6IGAke3Jlc3VsdC5jb2RlfWAsXHJcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KCdpbnN0YWxsRmFpbGVkJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEJyksXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxlZFBsdWdpbnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQnKVxyXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICB0aGlzLmN0eC5lbWl0KCdpbnN0YWxsRmFpbGVkJywge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRCcpLFxyXG4gICAgICAgIGJvZHk6IGVyclxyXG4gICAgICB9KVxyXG4gICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcclxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN0eC5sb2cuc3VjY2Vzcyh0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1MnKSlcclxuICAgICAgdGhpcy5jdHguZW1pdCgnaW5zdGFsbFN1Y2Nlc3MnLCB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUycpLFxyXG4gICAgICAgIGJvZHk6IFsuLi5wa2dOYW1lTGlzdCwgLi4uaW5zdGFsbGVkUGx1Z2luc11cclxuICAgICAgfSlcclxuICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDx0cnVlPiA9IHtcclxuICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgIGJvZHk6IFsuLi5wa2dOYW1lTGlzdCwgLi4uaW5zdGFsbGVkUGx1Z2luc11cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyB1bmluc3RhbGwgKHBsdWdpbnM6IHN0cmluZ1tdKTogUHJvbWlzZTxJUGx1Z2luSGFuZGxlclJlc3VsdDxib29sZWFuPj4ge1xyXG4gICAgY29uc3QgcHJvY2Vzc1BsdWdpbnMgPSBwbHVnaW5zLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBoYW5kbGVQbHVnaW5OYW1lUHJvY2Vzcyh0aGlzLmN0eCwgaXRlbSkpLmZpbHRlcihpdGVtID0+IGl0ZW0uc3VjY2VzcylcclxuICAgIGNvbnN0IHBrZ05hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKGl0ZW0gPT4gaXRlbS5wa2dOYW1lKVxyXG4gICAgaWYgKHBrZ05hbWVMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gdW5pbnN0YWxsIHBsdWdpbnMgbXVzdCB1c2UgcGtnTmFtZUxpc3Q6XHJcbiAgICAgIC8vIG5wbSB1bmluc3RhbGwgd2lsbCB1c2UgdGhlIHBhY2thZ2UuanNvbidzIG5hbWVcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZCgndW5pbnN0YWxsJywgcGtnTmFtZUxpc3QsIHRoaXMuY3R4LmJhc2VEaXIpXHJcbiAgICAgIGlmICghcmVzdWx0LmNvZGUpIHtcclxuICAgICAgICBwa2dOYW1lTGlzdC5mb3JFYWNoKChwbHVnaW5OYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3R4LnBsdWdpbkxvYWRlci51bnJlZ2lzdGVyUGx1Z2luKHBsdWdpbk5hbWUpXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmN0eC5sb2cuc3VjY2Vzcyh0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTUycpKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ3VuaW5zdGFsbFN1Y2Nlc3MnLCB7XHJcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1MnKSxcclxuICAgICAgICAgIGJvZHk6IHBrZ05hbWVMaXN0XHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PHRydWU+ID0ge1xyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgIGJvZHk6IHBrZ05hbWVMaXN0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1JFQVNPTicsIHtcclxuICAgICAgICAgIGNvZGU6IGAke3Jlc3VsdC5jb2RlfWAsXHJcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KCd1bmluc3RhbGxGYWlsZWQnLCB7XHJcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRCcpXHJcbiAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgIHRoaXMuY3R4LmVtaXQoJ3VuaW5zdGFsbEZhaWxlZCcsIHtcclxuICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRCcpLFxyXG4gICAgICAgIGJvZHk6IGVyclxyXG4gICAgICB9KVxyXG4gICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcclxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGUgKHBsdWdpbnM6IHN0cmluZ1tdLCBvcHRpb25zOiBJUGx1Z2luSGFuZGxlck9wdGlvbnMgPSB7fSwgZW52PzogSVByb2Nlc3NFbnYpOiBQcm9taXNlPElQbHVnaW5IYW5kbGVyUmVzdWx0PGJvb2xlYW4+PiB7XHJcbiAgICBjb25zdCBwcm9jZXNzUGx1Z2lucyA9IHBsdWdpbnMubWFwKChpdGVtOiBzdHJpbmcpID0+IGhhbmRsZVBsdWdpbk5hbWVQcm9jZXNzKHRoaXMuY3R4LCBpdGVtKSkuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zdWNjZXNzKVxyXG4gICAgY29uc3QgcGtnTmFtZUxpc3QgPSBwcm9jZXNzUGx1Z2lucy5tYXAoaXRlbSA9PiBpdGVtLnBrZ05hbWUpXHJcbiAgICBpZiAocGtnTmFtZUxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyB1cGRhdGUgcGx1Z2lucyBtdXN0IHVzZSBwa2dOYW1lTGlzdDpcclxuICAgICAgLy8gbnBtIHVwZGF0ZSB3aWxsIHVzZSB0aGUgcGFja2FnZS5qc29uJ3MgbmFtZVxyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWNDb21tYW5kKCd1cGRhdGUnLCBwa2dOYW1lTGlzdCwgdGhpcy5jdHguYmFzZURpciwgb3B0aW9ucywgZW52KVxyXG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSB7XHJcbiAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX1NVQ0NFU1MnKSlcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KCd1cGRhdGVTdWNjZXNzJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTJyksXHJcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDx0cnVlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxyXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGFcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgndXBkYXRlRmFpbGVkJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQnKVxyXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICB0aGlzLmN0eC5lbWl0KCd1cGRhdGVGYWlsZWQnLCB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfSlcclxuICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBleGVjQ29tbWFuZCAoY21kOiBzdHJpbmcsIG1vZHVsZXM6IHN0cmluZ1tdLCB3aGVyZTogc3RyaW5nLCBvcHRpb25zOiBJUGx1Z2luSGFuZGxlck9wdGlvbnMgPSB7fSwgZW52OiBJUHJvY2Vzc0VudiA9IHt9KTogUHJvbWlzZTxJUmVzdWx0PiB7XHJcbiAgICAvLyBvcHRpb25zIGZpcnN0XHJcbiAgICBjb25zdCByZWdpc3RyeSA9IG9wdGlvbnMucmVnaXN0cnkgfHwgdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdzZXR0aW5ncy5yZWdpc3RyeScpXHJcbiAgICBjb25zdCBwcm94eSA9IG9wdGlvbnMucHJveHkgfHwgdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdzZXR0aW5ncy5wcm94eScpXHJcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSk6IHZvaWQgPT4ge1xyXG4gICAgICBsZXQgYXJncyA9IFtjbWRdLmNvbmNhdChtb2R1bGVzKS5jb25jYXQoJy0tY29sb3I9YWx3YXlzJykuY29uY2F0KCctLXNhdmUnKVxyXG4gICAgICBpZiAocmVnaXN0cnkpIHtcclxuICAgICAgICBhcmdzID0gYXJncy5jb25jYXQoYC0tcmVnaXN0cnk9JHtyZWdpc3RyeX1gKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm94eSkge1xyXG4gICAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChgLS1wcm94eT0ke3Byb3h5fWApXHJcbiAgICAgIH1cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBucG0gPSBzcGF3bignbnBtJywgYXJncywgeyBjd2Q6IHdoZXJlLCBlbnY6IE9iamVjdC5hc3NpZ24oe30sIHByb2Nlc3MuZW52LCBlbnYpIH0pXHJcblxyXG4gICAgICAgIGxldCBvdXRwdXQgPSAnJ1xyXG4gICAgICAgIG5wbS5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgb3V0cHV0ICs9IGRhdGFcclxuICAgICAgICB9KS5waXBlKHByb2Nlc3Muc3Rkb3V0KVxyXG5cclxuICAgICAgICBucG0uc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIG91dHB1dCArPSBkYXRhXHJcbiAgICAgICAgfSkucGlwZShwcm9jZXNzLnN0ZGVycilcclxuXHJcbiAgICAgICAgbnBtLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGlmICghY29kZSkge1xyXG4gICAgICAgICAgICByZXNvbHZlKHsgY29kZTogMCwgZGF0YTogb3V0cHV0IH0pXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXNvbHZlKHsgY29kZTogY29kZSwgZGF0YTogb3V0cHV0IH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAvLyBmb3IgdXNlcnMgd2hvIGhhdmVuJ3QgaW5zdGFsbGVkIG5vZGUuanNcclxuICAgICAgICBucG0ub24oJ2Vycm9yJywgKGVycjogRXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoJ05QTSBpcyBub3QgaW5zdGFsbGVkJylcclxuICAgICAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsICdOUE0gaXMgbm90IGluc3RhbGxlZCcpXHJcbiAgICAgICAgfSlcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlIGFzIEVycm9yKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsIGUpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogdHJhbnNmb3JtIHRoZSBpbnB1dCBwbHVnaW4gbmFtZSBvciBwYXRoIHN0cmluZyB0byB2YWxpZCByZXN1bHRcclxuICogQHBhcmFtIGN0eFxyXG4gKiBAcGFyYW0gbmFtZU9yUGF0aFxyXG4gKi9cclxuY29uc3QgaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3MgPSAoY3R4OiBJUGljR28sIG5hbWVPclBhdGg6IHN0cmluZyk6IElQbHVnaW5Qcm9jZXNzUmVzdWx0ID0+IHtcclxuICBjb25zdCByZXMgPSB7XHJcbiAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgIGZ1bGxOYW1lOiAnJyxcclxuICAgIHBrZ05hbWU6ICcnXHJcbiAgfVxyXG4gIGNvbnN0IHJlc3VsdCA9IGdldFByb2Nlc3NQbHVnaW5OYW1lKG5hbWVPclBhdGgsIGN0eC5sb2cpXHJcbiAgaWYgKCFyZXN1bHQpIHtcclxuICAgIHJldHVybiByZXNcclxuICB9XHJcbiAgLy8gZmlyc3QgZ2V0IHJlc3VsdCB0aGVuIGRvIHRoaXMgcHJvY2Vzc1xyXG4gIC8vIG9yIHNvbWUgZXJyb3Igd2lsbCBsb2cgdHdpY2VcclxuICBjb25zdCBwa2dOYW1lID0gZ2V0Tm9ybWFsUGx1Z2luTmFtZShyZXN1bHQsIGN0eC5sb2cpXHJcbiAgaWYgKCFwa2dOYW1lKSB7XHJcbiAgICByZXR1cm4gcmVzXHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgZnVsbE5hbWU6IHJlc3VsdCxcclxuICAgIHBrZ05hbWVcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBsdWdpbkhhbmRsZXJcclxuIiwiaW1wb3J0IHsgWkhfQ04sIElMb2NhbGVzS2V5LCBJTG9jYWxlcyB9IGZyb20gJy4vemgtQ04nXHJcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnbG9kYXNoJ1xyXG5pbXBvcnQgeyBJUGljR28gfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJ1xyXG5cclxuaW1wb3J0IHsgT2JqZWN0QWRhcHRlciwgSTE4biB9IGZyb20gJ0BwaWNnby9pMThuJ1xyXG5pbXBvcnQgeyBJU3RyaW5nS2V5TWFwLCBJSTE4bk1hbmFnZXIgfSBmcm9tICcuLi90eXBlcy9pbmRleCdcclxuaW1wb3J0IHsgSUxvY2FsZSB9IGZyb20gJ0BwaWNnby9pMThuL2Rpc3QvdHlwZXMnXHJcbmltcG9ydCB7IEVOIH0gZnJvbSAnLi9lbidcclxuaW1wb3J0IHsgWkhfVFcgfSBmcm9tICcuL3poLVRXJ1xyXG5cclxuY29uc3QgbGFuZ3VhZ2VMaXN0OiBJU3RyaW5nS2V5TWFwPElTdHJpbmdLZXlNYXA8c3RyaW5nPj4gPSB7XHJcbiAgJ3poLUNOJzogWkhfQ04sXHJcbiAgJ3poLVRXJzogWkhfVFcsXHJcbiAgZW46IEVOXHJcbn1cclxuXHJcbmNsYXNzIEkxOG5NYW5hZ2VyIGltcGxlbWVudHMgSUkxOG5NYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGkxOG46IEkxOG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdEFkYXB0ZXI6IE9iamVjdEFkYXB0ZXJcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gICAgdGhpcy5vYmplY3RBZGFwdGVyID0gbmV3IE9iamVjdEFkYXB0ZXIobGFuZ3VhZ2VMaXN0KVxyXG4gICAgbGV0IGxhbmd1YWdlID0gdGhpcy5jdHguZ2V0Q29uZmlnPHN0cmluZz4oJ3NldHRpbmdzLmxhbmd1YWdlJykgfHwgJ3poLUNOJ1xyXG4gICAgaWYgKCFsYW5ndWFnZUxpc3RbbGFuZ3VhZ2VdKSB7XHJcbiAgICAgIGxhbmd1YWdlID0gJ3poLUNOJyAvLyB1c2UgZGVmYXVsdFxyXG4gICAgfVxyXG4gICAgdGhpcy5pMThuID0gbmV3IEkxOG4oe1xyXG4gICAgICBhZGFwdGVyOiB0aGlzLm9iamVjdEFkYXB0ZXIsXHJcbiAgICAgIGRlZmF1bHRMYW5ndWFnZTogbGFuZ3VhZ2VcclxuICAgIH0pXHJcbiAgICB0aGlzLmxvYWRPdXR0ZXJJMThuKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZE91dHRlckkxOG4gKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaTE4bkZvbGRlciA9IHRoaXMuZ2V0T3V0dGVySTE4bkZvbGRlcigpXHJcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGkxOG5Gb2xkZXIsIHtcclxuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxyXG4gICAgfSlcclxuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XHJcbiAgICAgIGlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUubmFtZS5lbmRzV2l0aCgnLnltbCcpKSB7XHJcbiAgICAgICAgY29uc3QgaTE4bkZpbGVQYXRoID0gcGF0aC5qb2luKGkxOG5Gb2xkZXIsIGZpbGUubmFtZSlcclxuICAgICAgICBjb25zdCBpMThuRmlsZSA9IGZzLnJlYWRGaWxlU3luYyhpMThuRmlsZVBhdGgsICd1dGY4JylcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgaTE4bkZpbGVPYmogPSB5YW1sLmxvYWQoaTE4bkZpbGUpIGFzIElMb2NhbGVzXHJcbiAgICAgICAgICBsYW5ndWFnZUxpc3RbZmlsZS5uYW1lLnJlcGxhY2UoL1xcLnltbCQvLCAnJyldID0gaTE4bkZpbGVPYmpcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPdXR0ZXJJMThuRm9sZGVyICgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaTE4bkZvbGRlciA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAnaTE4bi1jbGknKVxyXG4gICAgaWYgKCFmcy5wYXRoRXhpc3RzU3luYyhpMThuRm9sZGVyKSkge1xyXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKGkxOG5Gb2xkZXIpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gaTE4bkZvbGRlclxyXG4gIH1cclxuXHJcbiAgdHJhbnNsYXRlPFQgZXh0ZW5kcyBzdHJpbmc+KGtleTogSUxvY2FsZXNLZXkgfCBULCBhcmdzPzogSVN0cmluZ0tleU1hcDxzdHJpbmc+KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmkxOG4udHJhbnNsYXRlKGtleSwgYXJncykgfHwga2V5XHJcbiAgfVxyXG5cclxuICBzZXRMYW5ndWFnZSAobGFuZ3VhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5pMThuLnNldExhbmd1YWdlKGxhbmd1YWdlKVxyXG4gICAgdGhpcy5jdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICdzZXR0aW5ncy5sYW5ndWFnZSc6IGxhbmd1YWdlXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgYWRkTG9jYWxlIChsYW5ndWFnZTogc3RyaW5nLCBsb2NhbGVzOiBJTG9jYWxlKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBvcmlnaW5Mb2NhbGVzID0gdGhpcy5vYmplY3RBZGFwdGVyLmdldExvY2FsZShsYW5ndWFnZSlcclxuICAgIGlmICghb3JpZ2luTG9jYWxlcykge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0xvY2FsZXMgPSBtZXJnZShvcmlnaW5Mb2NhbGVzLCBsb2NhbGVzKVxyXG4gICAgdGhpcy5vYmplY3RBZGFwdGVyLnNldExvY2FsZShsYW5ndWFnZSwgbmV3TG9jYWxlcylcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICBhZGRMYW5ndWFnZSAobGFuZ3VhZ2U6IHN0cmluZywgbG9jYWxlczogSUxvY2FsZSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgb3JpZ2luTG9jYWxlcyA9IHRoaXMub2JqZWN0QWRhcHRlci5nZXRMb2NhbGUobGFuZ3VhZ2UpXHJcbiAgICBpZiAob3JpZ2luTG9jYWxlcykge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIHRoaXMub2JqZWN0QWRhcHRlci5zZXRMb2NhbGUobGFuZ3VhZ2UsIGxvY2FsZXMpXHJcbiAgICBsYW5ndWFnZUxpc3RbbGFuZ3VhZ2VdID0gbG9jYWxlc1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcblxyXG4gIGdldExhbmd1YWdlTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxhbmd1YWdlTGlzdClcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB7XHJcbiAgSTE4bk1hbmFnZXJcclxufVxyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcgKi9cclxuZXhwb3J0IGNvbnN0IFpIX0NOID0ge1xyXG4gIFVQTE9BRF9GQUlMRUQ6ICfkuIrkvKDlpLHotKUnLFxyXG4gIENIRUNLX1NFVFRJTkdTOiAn6K+35qOA5p+l5L2g55qE6YWN572u6aG55piv5ZCm5q2j56GuJyxcclxuICBDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSzogJ+ivt+ajgOafpeS9oOeahOmFjee9rumhueS7peWPiue9kee7nCcsXHJcbiAgVVBMT0FEX0ZBSUxFRF9SRUFTT046ICfplJnor6/noIHvvJoke2NvZGV977yM6K+35omT5byA5rWP6KeI5Zmo57KY6LS05Zyw5Z2A5p+l55yL55u45YWz5Y6f5ZugJyxcclxuICBTRVJWRVJfRVJST1I6ICfmnI3liqHnq6/lh7rplJnvvIzor7fph43or5UnLFxyXG4gIEFVVEhfRkFJTEVEOiAn6K6k6K+B5aSx6LSlJyxcclxuXHJcbiAgLy8gc21tc1xyXG4gIFBJQ0JFRF9TTU1TOiAnU00uTVMnLFxyXG4gIFBJQ0JFRF9TTU1TX1RPS0VOOiAn6K6+5a6aVG9rZW4nLFxyXG4gIFBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU46ICflpIfnlKjkuIrkvKDln5/lkI0nLFxyXG4gIFBJQ0JFRF9TTU1TX01FU1NBR0VfQkFDS1VQX0RPTUFJTjogJ+S+i+WmgiBzbW1zLmFwcCcsXHJcblxyXG4gIC8vIEFsaS1jbG91ZFxyXG4gIFBJQ0JFRF9BTElDTE9VRDogJ+mYv+mHjOS6kU9TUycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEOiAn6K6+5a6aS2V5SWQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVQ6ICforr7lrppLZXlTZWNyZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9CVUNLRVQ6ICforr7lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BUkVBOiAn6K6+5a6a5a2Y5YKo5Yy65Z+fJyxcclxuICBQSUNCRURfQUxJQ0xPVURfUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTDogJ+iuvuWumuiHquWumuS5ieWfn+WQjScsXHJcbiAgUElDQkVEX0FMSUNMT1VEX09QVElPTlM6ICforr7lrprnvZHlnYDlkI7nvIAnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJpvc3MtY24tYmVpamluZycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP3gtb3NzLXByb2Nlc3M9eHh4JyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gVGVuY2VudC1jbG91ZFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVUQ6ICfohb7orq/kupFDT1MnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTjogJ0NPU+eJiOacrCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRDogJ+iuvuWumlNlY3JldElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogJ+iuvuWumlNlY3JldEtleScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRDogJ+iuvuWumkFwcElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVDogJ+iuvuWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiAn6K6+5a6a5a2Y5YKo5Yy65Z+fJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUzogJ+iuvuWumue9keWdgOWQjue8gCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6ICforr7lrproh6rlrprkuYnln5/lkI0nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRDogJ+S+i+Wmgu+8mjEyMzQ1Njc4OTAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yaYXAtYmVpamluZycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP2ltYWdlTW9ncjInLFxyXG5cclxuICAvLyBHaXRIdWJcclxuICBQSUNCRURfR0lUSFVCOiAnR2l0SHViJyxcclxuICBQSUNCRURfR0lUSFVCX1RPS0VOOiAn6K6+5a6aVG9rZW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUkVQTzogJ+iuvuWumuS7k+W6k+WQjScsXHJcbiAgUElDQkVEX0dJVEhVQl9QQVRIOiAn6K6+5a6a5a2Y5YKo6Lev5b6EJyxcclxuICBQSUNCRURfR0lUSFVCX0JSQU5DSDogJ+iuvuWumuWIhuaUr+WQjScsXHJcbiAgUElDQkVEX0dJVEhVQl9DVVNUT01VUkw6ICforr7lrproh6rlrprkuYnln5/lkI0nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPOiAn5qC85byP77yadXNlcm5hbWUvcmVwbycsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX0JSQU5DSDogJ+S+i+Wmgu+8mm1haW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gcWluaXVcclxuICBQSUNCRURfUUlOSVU6ICfkuIPniZvkupEnLFxyXG4gIFBJQ0JFRF9RSU5JVV9BQ0NFU1NLRVk6ICforr7lrppBY2Nlc3NLZXknLFxyXG4gIFBJQ0JFRF9RSU5JVV9TRUNSRVRLRVk6ICforr7lrppTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9RSU5JVV9CVUNLRVQ6ICforr7lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9RSU5JVV9QQVRIOiAn6K6+5a6a5a2Y5YKo6Lev5b6EJyxcclxuICBQSUNCRURfUUlOSVVfVVJMOiAn6K6+5a6a6K6/6Zeu572R5Z2AJyxcclxuICBQSUNCRURfUUlOSVVfT1BUSU9OUzogJ+iuvuWumue9keWdgOWQjue8gCcsXHJcbiAgUElDQkVEX1FJTklVX0FSRUE6ICforr7lrprlrZjlgqjljLrln58nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mnowJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP2ltYWdlc2xpbScsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly94eHgueXl5LmdsYi5jbG91ZGRuLmNvbScsXHJcblxyXG4gIC8vIGltZ3VyXHJcbiAgUElDQkVEX0lNR1VSOiAnSW1ndXInLFxyXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogJ+iuvuWumkNsaWVudElkJyxcclxuICBQSUNCRURfSU1HVVJfVVNFUk5BTUU6ICforr7lrprnlKjmiLflkI0nLFxyXG4gIFBJQ0JFRF9JTUdVUl9BQ0NFU1NfVE9LRU46ICforr7lrpphY2Nlc3NUb2tlbicsXHJcbiAgUElDQkVEX0lNR1VSX0FMQlVNOiAn6K6+5a6a55u45YaM5ZCNJyxcclxuICBQSUNCRURfSU1HVVJfUFJPWFk6ICforr7lrprku6PnkIYnLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX0NMSUVOVElEOiAn5Yy/5ZCN5LiK5Lyg5pe25aGr5YaZJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9VU0VSTkFNRTogJ+mcgOimgeS4iuS8oOWIsOi0puaIt+aXtuWhq+WGmScsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfQUNDRVNTX1RPS0VOOiAn6ZyA6KaB5LiK5Lyg5Yiw6LSm5oi35pe25aGr5YaZJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9BTEJVTTogJ+S+i+Wmgu+8mnRlc3QnLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZOiAn5L6L5aaC77yaaHR0cDovLzEyNy4wLjAuMToxMDgwJyxcclxuXHJcbiAgLy8gdXB5dW5cclxuICBQSUNCRURfVVBZVU46ICflj4jmi43kupEnLFxyXG4gIFBJQ0JFRF9VUFlVTl9CVUNLRVQ6ICforr7lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUEVSQVRPUjogJ+iuvuWumuaTjeS9nOWRmCcsXHJcbiAgUElDQkVEX1VQWVVOX1BBU1NXT1JEOiAn6K6+5a6a5pON5L2c5ZGY5a+G56CBJyxcclxuICBQSUNCRURfVVBZVU5fUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX1VQWVVOX1VSTDogJ+iuvuWumuWKoOmAn+Wfn+WQjScsXHJcbiAgUElDQkVEX1VQWVVOX09QVElPTlM6ICforr7lrprnvZHlnYDlkI7nvIAnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SOiAn5L6L5aaC77yabWUnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEOiAn6L6T5YWl5pON5L2c5ZGY5a+G56CBJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkw6ICfkvovlpoLvvJpodHRwOi8veHh4LnRlc3QudXBjZG4ubmV0JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaIWltZ3NsaW0nLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcblxyXG4gIC8vIHdlYmRhdnBsaXN0XHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUOiAnV2ViREFWJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfSE9TVDogJ+iuvuWumuaOpeWPo+e9keWdgCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1NTTEVOQUJMRUQ6ICflkK/nlKhTU0wnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9VU0VSTkFNRTogJ+iuvuWumueUqOaIt+WQjScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1BBU1NXT1JEOiAn6K6+5a6a5a+G56CBJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1dFQlNJVEVfUEFUSDogJ+iuvuWumue9keWdgOi3r+W+hCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTDogJ+iuvuWumuiHquWumuS5ieWfn+WQjScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfSE9TVDogJ+S+i+Wmgu+8mmh0dHBzOi8vZXhhbXBsZS5jb20vd2ViZGF2JyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9TU0xFTkFCTEVEOiAn6ZyA6KaBSFRUUFPml7blkK/nlKgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1VTRVJOQU1FOiAn5L6L5aaC77yabWUnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBU1NXT1JEOiAn6L6T5YWl5a+G56CBJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1dFQlNJVEVfUEFUSDogJ+aLvOaOpee9keWdgOaXtuS9v+eUqCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIEJVSUxESU5fV0FURVJNQVJLX0lTQUREV0FURVJNQVJLOiAn5piv5ZCm5re75Yqg5rC05Y2wJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX0lTQUREV0FURVJNQVJLOiAn6ZyA6KaB5re75Yqg5rC05Y2w5pe25ZCv55SoJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktUWVBFOiAn6K6+5a6a5rC05Y2w57G75Z6LJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1RZUEU6ICfor7fpgInmi6nmsLTljbDnsbvlnosnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX0lTRlVMTFNDUkVFTldBVEVSTUFSSzogJ+aYr+WQpuWFqOWxj+awtOWNsCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9JU0ZVTExTQ1JFRU5XQVRFUk1BUks6ICfpnIDopoHlhajlsY/msLTljbDml7blkK/nlKgnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0RFR1JFRTogJ+iuvuWumuawtOWNsOinkuW6picsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktERUdSRUU6ICfor7fovpPlhaXmlbDlrZcnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RFWFQ6ICforr7lrprmsLTljbDmloflrZcnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLVEVYVDogJ+ivt+i+k+WFpeawtOWNsOaWh+WtlycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVEVYVEZPTlRQQVRIOiAn6K6+5a6a5rC05Y2w5a2X5L2T5paH5Lu26Lev5b6EJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRQQVRIOiAn6K+36L6T5YWl5rC05Y2w5a2X5L2T5paH5Lu26Lev5b6EJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktGT05UUkFUSU86ICforr7lrprmsLTljbDnm7jlr7nkuo7lm77niYfnmoTmr5TkvosnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVFJBVElPOiAn6K+36L6T5YWlMC0x55qE5bCP5pWwJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktGT05UQ09MT1I6ICforr7lrprmsLTljbDlrZfkvZPpopzoibInLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVENPTE9SOiAn6K+36L6T5YWlcmdi6aKc6Imy5YC8JyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktJTUFHRVBBVEg6ICforr7lrprmsLTljbDlm77niYfot6/lvoQnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLSU1BR0VQQVRIOiAn6K+36L6T5YWl5rC05Y2w5Zu+54mH6Lev5b6EJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktQT1NJVElPTjogJ+iuvuWumuawtOWNsOS9jee9ricsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktQT1NJVElPTjogJ+ivt+mAieaLqeawtOWNsOS9jee9ricsXHJcblxyXG4gIEJVSUxESU5fUkVOQU1FX0ZPUk1BVDogJ+iuvuWumumHjeWRveWQjeagvOW8jycsXHJcbiAgQlVJTERJTl9SRU5BTUVfRU5BQkxFOiAn5piv5ZCm5ZCv55So6YeN5ZG95ZCNJyxcclxuXHJcbiAgQlVJTERJTl9DT01QUkVTU19RVUFMSVRZOiAn6K6+5a6a5Zu+54mH6LSo6YePJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUVVBTElUWTogJ+ivt+i+k+WFpTAtMTAw55qE5pW05pWwJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTQ09OVkVSVDogJ+aYr+WQpui/m+ihjOagvOW8j+i9rOaNoicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTQ09OVkVSVDogJ+mcgOimgei9rOaNouaXtuWQr+eUqCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19DT05WRVJURk9STUFUOiAn6K6+5a6a6L2s5o2i5qC85byPJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfQ09OVkVSVEZPUk1BVDogJ+ivt+mAieaLqei9rOaNouagvOW8jycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JFU0laRTogJ+aYr+WQpui/m+ihjOWbvueJh+e8qeaUvicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVTSVpFOiAn6ZyA6KaB57yp5pS+5pe25ZCv55SoJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1JFU0laRVdJRFRIOiAn6K6+5a6a57yp5pS+5a695bqmJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFV0lEVEg6ICfor7fovpPlhaXmlbDlrZcnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUkVTSVpFSEVJR0hUOiAn6K6+5a6a57yp5pS+6auY5bqmJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFSEVJR0hUOiAn6K+36L6T5YWl5pWw5a2XJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTUkVTSVpFQllQRVJDRU5UOiAn5piv5ZCm5oyJ55m+5YiG5q+U6L+b6KGM57yp5pS+JyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRVNJWkVCWVBFUkNFTlQ6ICfpnIDopoHmjInnmb7liIbmr5TnvKnmlL7ml7blkK/nlKgnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUkVTSVpFUEVSQ0VOVDogJ+iuvuWumue8qeaUvueZvuWIhuavlCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRVBFUkNFTlQ6ICfor7fovpPlhaXmlbDlrZcnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNST1RBVEU6ICfmmK/lkKbov5vooYzlm77niYfml4vovawnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JPVEFURTogJ+mcgOimgeaXi+i9rOaXtuWQr+eUqCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19ST1RBVEVERUdSRUU6ICforr7lrprml4vovazop5LluqYnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9ST1RBVEVERUdSRUU6ICfor7fovpPlhaXmlbDlrZfvvIzlj6/kuLrotJ/mlbAnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNSRU1PVkVFWElGOiAn5piv5ZCm56e76ZmkRVhJRuS/oeaBrycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVNT1ZFRVhJRjogJ+mcgOimgeenu+mZpEVYSUbkv6Hmga/ml7blkK/nlKgnLFxyXG5cclxuICAvLyBQbHVnaW4gSGFuZGxlclxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1M6ICfmj5Lku7blronoo4XmiJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRDogJ+aPkuS7tuWuieijheWksei0pScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTjogJ+aPkuS7tuWuieijheWksei0pe+8jOWksei0peeggeS4uiR7Y29kZX3vvIzplJnor6/ml6Xlv5fkuLogXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9QQVRIOiAn5o+S5Lu25a6J6KOF5aSx6LSl77yM6K+36L6T5YWl5ZCI5rOV5o+S5Lu25ZCN5oiW5ZCI5rOV5a6J6KOF6Lev5b6EJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1M6ICfmj5Lku7bljbjovb3miJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEOiAn5o+S5Lu25Y246L295aSx6LSlJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT046ICfmj5Lku7bljbjovb3lpLHotKXvvIzlpLHotKXnoIHkuLoke2NvZGV977yM6ZSZ6K+v5pel5b+X5Li6IFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRDogJ+aPkuS7tuWNuOi9veWksei0pe+8jOivt+i+k+WFpeWQiOazleaPkuS7tuWQjScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTOiAn5o+S5Lu25pu05paw5oiQ5YqfJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRDogJ+aPkuS7tuabtOaWsOWksei0pScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OOiAn5o+S5Lu25pu05paw5aSx6LSl77yM5aSx6LSl56CB5Li6JHtjb2Rlfe+8jOmUmeivr+aXpeW/l+S4uiBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQ6ICfmj5Lku7bmm7TmlrDlpLHotKXvvIzor7fovpPlhaXlkIjms5Xmj5Lku7blkI0nXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElMb2NhbGVzS2V5ID0ga2V5b2YgdHlwZW9mIFpIX0NOXHJcbmV4cG9ydCB0eXBlIElMb2NhbGVzID0gdHlwZW9mIFpIX0NOXHJcbiIsImltcG9ydCB7IElMb2NhbGVzIH0gZnJvbSAnLi96aC1DTidcclxuXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyAqL1xyXG5leHBvcnQgY29uc3QgWkhfVFc6IElMb2NhbGVzID0ge1xyXG4gIFVQTE9BRF9GQUlMRUQ6ICfkuIrlgrPlpLHmlZcnLFxyXG4gIENIRUNLX1NFVFRJTkdTOiAn6KuL5qqi5p+l5L2g55qE6Kit5a6a5piv5ZCm5q2j56K6JyxcclxuICBDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSzogJ+iri+aqouafpeS9oOeahOioreWumuWPiue2sui3rycsXHJcbiAgVVBMT0FEX0ZBSUxFRF9SRUFTT046ICfpjK/oqqTnorzvvJoke2NvZGV977yM6KuL5omT6ZaL54CP6Ka95Zmo6LK85LiK5Zyw5Z2A5p+l55yL55u46Zec5Y6f5ZugJyxcclxuICBTRVJWRVJfRVJST1I6ICfkvLrmnI3lmajlh7rpjK/vvIzoq4vph43oqaYnLFxyXG4gIEFVVEhfRkFJTEVEOiAn6KqN6K2J5aSx5pWXJyxcclxuXHJcbiAgLy8gc21tc1xyXG4gIFBJQ0JFRF9TTU1TOiAnU00uTVMnLFxyXG4gIFBJQ0JFRF9TTU1TX1RPS0VOOiAn6Kit5a6aVG9rZW4nLFxyXG4gIFBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU46ICflgpnnlKjkuIrlgrPntrLlnYAnLFxyXG4gIFBJQ0JFRF9TTU1TX01FU1NBR0VfQkFDS1VQX0RPTUFJTjogJ+S+i+WmgiBzbW1zLmFwcCcsXHJcblxyXG4gIC8vIEFsaS1jbG91ZFxyXG4gIFBJQ0JFRF9BTElDTE9VRDogJ+mYv+mHjOS6kU9TUycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEOiAn6Kit5a6aS2V5SWQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVQ6ICfoqK3lrppLZXlTZWNyZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9CVUNLRVQ6ICfoqK3lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BUkVBOiAn6Kit5a6a5YSy5a2Y5Y2A5Z+fJyxcclxuICBQSUNCRURfQUxJQ0xPVURfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTDogJ+ioreWumuiHquiogue2suWdgCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX09QVElPTlM6ICfoqK3lrprntrLlnYDlvozntrQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJpvc3MtY24tYmVpamluZycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP3gtb3NzLXByb2Nlc3M9eHh4JyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gVGVuY2VudC1jbG91ZFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVUQ6ICfpqLDoqIrkupFDT1MnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTjogJ0NPU+eJiOacrCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRDogJ+ioreWumlNlY3JldElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogJ+ioreWumlNlY3JldEtleScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRDogJ+ioreWumkFwcElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVDogJ+ioreWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiAn6Kit5a6a5YSy5a2Y5Y2A5Z+fJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUzogJ+ioreWumue2suWdgOW+jOe2tCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6ICfoqK3lrproh6roqILntrLlnYAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRDogJ+S+i+Wmgu+8mjEyMzQ1Njc4OTAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yaYXAtYmVpamluZycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP2ltYWdlTW9ncjInLFxyXG5cclxuICAvLyBHaXRIdWJcclxuICBQSUNCRURfR0lUSFVCOiAnR2l0SHViJyxcclxuICBQSUNCRURfR0lUSFVCX1RPS0VOOiAn6Kit5a6aVG9rZW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUkVQTzogJ+ioreWumuWAieW6q+WQjeeosScsXHJcbiAgUElDQkVEX0dJVEhVQl9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfR0lUSFVCX0JSQU5DSDogJ+ioreWumuWIhuaUr+WQjeeosScsXHJcbiAgUElDQkVEX0dJVEhVQl9DVVNUT01VUkw6ICfoqK3lrproh6roqILntrLlnYAnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPOiAn5qC85byP77yadXNlcm5hbWUvcmVwbycsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX0JSQU5DSDogJ+S+i+Wmgu+8mm1haW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gcWluaXVcclxuICBQSUNCRURfUUlOSVU6ICfkuIPniZvkupEnLFxyXG4gIFBJQ0JFRF9RSU5JVV9BQ0NFU1NLRVk6ICfoqK3lrppBY2Nlc3NLZXknLFxyXG4gIFBJQ0JFRF9RSU5JVV9TRUNSRVRLRVk6ICfoqK3lrppTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9RSU5JVV9CVUNLRVQ6ICfoqK3lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9RSU5JVV9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfUUlOSVVfVVJMOiAn6Kit5a6a6Kiq5ZWP57ay5Z2AJyxcclxuICBQSUNCRURfUUlOSVVfT1BUSU9OUzogJ+ioreWumue2suWdgOW+jOe2tCcsXHJcbiAgUElDQkVEX1FJTklVX0FSRUE6ICfoqK3lrprlhLLlrZjljYDln58nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mnowJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP2ltYWdlc2xpbScsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly94eHgueXl5LmdsYi5jbG91ZGRuLmNvbScsXHJcblxyXG4gIC8vIGltZ3VyXHJcbiAgUElDQkVEX0lNR1VSOiAnSW1ndXInLFxyXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogJ+ioreWumkNsaWVudElkJyxcclxuICBQSUNCRURfSU1HVVJfVVNFUk5BTUU6ICfoqK3lrprnlKjmiLblkI0nLFxyXG4gIFBJQ0JFRF9JTUdVUl9BQ0NFU1NfVE9LRU46ICfoqK3lrpphY2Nlc3NUb2tlbicsXHJcbiAgUElDQkVEX0lNR1VSX0FMQlVNOiAn6Kit5a6a55u457C/5ZCNJyxcclxuICBQSUNCRURfSU1HVVJfUFJPWFk6ICfoqK3lrppQUk9YWScsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfQ0xJRU5USUQ6ICfljL/lkI3kuIrlgrPmmYLloavlr6snLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1VTRVJOQU1FOiAn6ZyA6KaB5LiK5YKz5Yiw6LOs5oi25pmC5aGr5a+rJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9BQ0NFU1NfVE9LRU46ICfpnIDopoHkuIrlgrPliLDos6zmiLbmmYLloavlr6snLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX0FMQlVNOiAn5L6L5aaC77yadGVzdCcsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfUFJPWFk6ICfkvovlpoLvvJpodHRwOi8vMTI3LjAuMC4xOjEwODAnLFxyXG5cclxuICAvLyB1cHl1blxyXG4gIFBJQ0JFRF9VUFlVTjogJ+WPiOaLjeS6kScsXHJcbiAgUElDQkVEX1VQWVVOX0JVQ0tFVDogJ+ioreWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX1VQWVVOX09QRVJBVE9SOiAn6Kit5a6a5pON5L2c5ZOhJyxcclxuICBQSUNCRURfVVBZVU5fUEFTU1dPUkQ6ICfoqK3lrprmk43kvZzlk6Hlr4bnorwnLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfVVBZVU5fVVJMOiAn6Kit5a6a5Yqg6YCf57ay5Z2AJyxcclxuICBQSUNCRURfVVBZVU5fT1BUSU9OUzogJ+ioreWumue2suWdgOW+jOe2tCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1I6ICfkvovlpoLvvJptZScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQ6ICfovLjlhaXmk43kvZzlk6Hlr4bnorwnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTDogJ+S+i+Wmgu+8mmh0dHA6Ly94eHgudGVzdC51cGNkbi5uZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJohaW1nc2xpbScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuXHJcbiAgLy8gd2ViZGF2XHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUOiAnV2ViREFWJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfSE9TVDogJ+ioreWumkFQSeS4u+apnycsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1NTTEVOQUJMRUQ6ICfpnIDopoFIVFRQU+aZguWVn+eUqCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1VTRVJOQU1FOiAn6Kit5a6a55So5oi25ZCNJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfUEFTU1dPUkQ6ICfoqK3lrprlr4bnorwnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfQ1VTVE9NVVJMOiAn6Kit5a6a6Ieq6KiC57ay5Z2AJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfV0VCU0lURV9QQVRIOiAn6Kit5a6a57ay56uZ6Lev5b6RJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9IT1NUOiAn5L6L5aaC77yaaHR0cHM6Ly9leGFtcGxlLmNvbS93ZWJkYXYnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1NTTEVOQUJMRUQ6ICfpnIDopoFIVFRQU+aZguWVn+eUqCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfVVNFUk5BTUU6ICfkvovlpoLvvJptZScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfUEFTU1dPUkQ6ICfovLjlhaXnlKjmiLblr4bnorwnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfV0VCU0lURV9QQVRIOiAn5ou85o6l57ay5Z2A5pmC5L2/55SoJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfSVNBRERXQVRFUk1BUks6ICfmmK/lkKbmt7vliqDmsLTljbAnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfSVNBRERXQVRFUk1BUks6ICfpnIDopoHmt7vliqDmsLTljbDmmYLllZ/nlKgnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RZUEU6ICfoqK3lrprmsLTljbDpoZ7lnosnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLVFlQRTogJ+iri+mBuOaTh+awtOWNsOmhnuWeiycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfSVNGVUxMU0NSRUVOV0FURVJNQVJLOiAn5piv5ZCm5YWo5bGP5rC05Y2wJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX0lTRlVMTFNDUkVFTldBVEVSTUFSSzogJ+mcgOimgeWFqOWxj+awtOWNsOaZguWVn+eUqCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLREVHUkVFOiAn6Kit5a6a5rC05Y2w6KeS5bqmJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0RFR1JFRTogJ+iri+i8uOWFpeaVuOWtlycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVEVYVDogJ+ioreWumuawtOWNsOaWh+WtlycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktURVhUOiAn6KuL6Ly45YWl5rC05Y2w5paH5a2XJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhURk9OVFBBVEg6ICfoqK3lrprmsLTljbDlrZfpq5QnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVFBBVEg6ICfoq4vovLjlhaXmsLTljbDlrZfpq5Tmlofku7bot6/lvpEnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRSQVRJTzogJ+ioreWumuawtOWNsOWclueJh+avlOS+iycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UUkFUSU86ICfoq4vovLjlhaUwLTHnmoTmlbjlrZcnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRDT0xPUjogJ+ioreWumuawtOWNsOWtl+mrlOmhj+iJsicsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UQ09MT1I6ICfoq4vovLjlhaVyZ2LpoY/oibLlgLwnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0lNQUdFUEFUSDogJ+ioreWumuawtOWNsOWclueJh+i3r+W+kScsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktJTUFHRVBBVEg6ICfoq4vovLjlhaXmsLTljbDlnJbniYfot6/lvpEnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1BPU0lUSU9OOiAn6Kit5a6a5rC05Y2w5L2N572uJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1BPU0lUSU9OOiAn6KuL6YG45pOH5rC05Y2w5L2N572uJyxcclxuXHJcbiAgQlVJTERJTl9SRU5BTUVfRk9STUFUOiAn6Kit5a6a6YeN5ZG95ZCN5qC85byPJyxcclxuICBCVUlMRElOX1JFTkFNRV9FTkFCTEU6ICfmmK/lkKbllZ/nlKjph43lkb3lkI0nLFxyXG5cclxuICBCVUlMRElOX0NPTVBSRVNTX1FVQUxJVFk6ICfoqK3lrprlnJbniYfos6rph48nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9RVUFMSVRZOiAn6KuL6Ly45YWlMC0xMDDnmoTmlbTmlbgnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNDT05WRVJUOiAn5piv5ZCm6YCy6KGM5qC85byP6L2J5o+bJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNDT05WRVJUOiAn6ZyA6KaB6L2J5o+b5pmC5ZWf55SoJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0NPTlZFUlRGT1JNQVQ6ICfoqK3lrprovYnmj5vmoLzlvI8nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9DT05WRVJURk9STUFUOiAn6KuL6YG45pOH6L2J5o+b5qC85byPJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTUkVTSVpFOiAn5piv5ZCm6YCy6KGM5ZyW54mH57iu5pS+JyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRVNJWkU6ICfpnIDopoHnuK7mlL7mmYLllZ/nlKgnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUkVTSVpFV0lEVEg6ICfoqK3lrprnuK7mlL7lr6zluqYnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVXSURUSDogJ+iri+i8uOWFpeaVuOWtlycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19SRVNJWkVIRUlHSFQ6ICfoqK3lrprnuK7mlL7pq5jluqYnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVIRUlHSFQ6ICfoq4vovLjlhaXmlbjlrZcnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkVCWVBFUkNFTlQ6ICfmmK/lkKbmjInnmb7liIbmr5TpgLLooYznuK7mlL4nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JFU0laRUJZUEVSQ0VOVDogJ+mcgOimgeaMieeZvuWIhuavlOe4ruaUvuaZguWVn+eUqCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19SRVNJWkVQRVJDRU5UOiAn6Kit5a6a57iu5pS+55m+5YiG5q+UJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFUEVSQ0VOVDogJ+iri+i8uOWFpeaVsOWtlycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JPVEFURTogJ+aYr+WQpumAsuihjOWclueJh+aXi+i9iScsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUk9UQVRFOiAn6ZyA6KaB5peL6L2J5pmC5ZWf55SoJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1JPVEFURURFR1JFRTogJ+ioreWumuaXi+i9ieinkuW6picsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JPVEFURURFR1JFRTogJ+iri+i8uOWFpeaVuOWtl++8jOWPr+eCuuiyoOaVuCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JFTU9WRUVYSUY6ICfmmK/lkKbnp7vpmaRFWElG6LOH6KiKJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRU1PVkVFWElGOiAn6ZyA6KaB56e76ZmkRVhJRuizh+ioiuaZguWVn+eUqCcsXHJcblxyXG4gIC8vIFBsdWdpbiBIYW5kbGVyXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUzogJ+aPkuS7tuWuieijneaIkOWKnycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEOiAn5o+S5Lu25a6J6KOd5aSx5pWXJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUkVBU09OOiAn5o+S5Lu25a6J6KOd5aSx5pWX77yM5aSx5pWX56K854K6JHtjb2Rlfe+8jOmMr+iqpOe0gOmMhOeCuiBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1BBVEg6ICfmj5Lku7blronoo53lpLHmlZfvvIzoq4vovLjlhaXmraPnorrnmoTmj5Lku7blkI3nqLHmiJbmraPnorrnmoTlronoo53ot6/lvpEnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTUzogJ+aPkuS7tuWNuOi8ieaIkOWKnycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQ6ICfmj5Lku7bljbjovInlpLHmlZcnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1JFQVNPTjogJ+aPkuS7tuWNuOi8ieWkseaVl++8jOWkseaVl+eivOeCuiR7Y29kZX3vvIzpjK/oqqTntIDpjITngrogXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEOiAn5o+S5Lu25Y246LyJ5aSx5pWX77yM6KuL6Ly45YWl5q2j56K655qE5o+S5Lu25ZCN56ixJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX1NVQ0NFU1M6ICfmj5Lku7bmm7TmlrDmiJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEOiAn5o+S5Lu25pu05paw5aSx5pWXJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9SRUFTT046ICfmj5Lku7bmm7TmlrDlpLHmlZfvvIzlpLHmlZfnorzngroke2NvZGV977yM6Yyv6Kqk57SA6YyE54K6IFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRDogJ+aPkuS7tuabtOaWsOWkseaVl++8jOiri+i8uOWFpeato+eiuueahOaPkuS7tuWQjeeosSdcclxufVxyXG4iLCJpbXBvcnQgeyBJTG9jYWxlcyB9IGZyb20gJy4vemgtQ04nXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcgKi9cclxuZXhwb3J0IGNvbnN0IEVOOiBJTG9jYWxlcyA9IHtcclxuICBVUExPQURfRkFJTEVEOiAnVXBsb2FkIGZhaWxlZCcsXHJcbiAgQ0hFQ0tfU0VUVElOR1M6ICdQbGVhc2UgY2hlY2sgeW91ciBzZXR0aW5ncycsXHJcbiAgQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUks6ICdQbGVhc2UgY2hlY2sgeW91ciBzZXR0aW5ncyBhbmQgbmV0d29yaycsXHJcbiAgVVBMT0FEX0ZBSUxFRF9SRUFTT046ICdFcnJvciBjb2RlOiAke2NvZGV9LCBwbGVhc2Ugb3BlbiB0aGUgYnJvd3NlciBhbmQgcGFzdGUgdGhlIGFkZHJlc3MgdG8gc2VlIHRoZSByZWFzb24nLFxyXG4gIFNFUlZFUl9FUlJPUjogJ1NlcnZlciBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcicsXHJcbiAgQVVUSF9GQUlMRUQ6ICdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLFxyXG5cclxuICAvLyBzbW1zXHJcbiAgUElDQkVEX1NNTVM6ICdTTS5NUycsXHJcbiAgUElDQkVEX1NNTVNfVE9LRU46ICdTZXQgVG9rZW4nLFxyXG4gIFBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU46ICdTZXQgQmFja3VwIFVwbG9hZCBEb21haW4nLFxyXG4gIFBJQ0JFRF9TTU1TX01FU1NBR0VfQkFDS1VQX0RPTUFJTjogJ0V4LiBzbW1zLmFwcCcsXHJcblxyXG4gIC8vIEFsaS1jbG91ZFxyXG4gIFBJQ0JFRF9BTElDTE9VRDogJ0FsaSBDbG91ZCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEOiAnU2V0IEtleUlkJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUOiAnU2V0IEtleVNlY3JldCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0JVQ0tFVDogJ1NldCBCdWNrZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BUkVBOiAnU2V0IEFyZWEnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkw6ICdTZXQgQ3VzdG9tIFVSTCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX09QVElPTlM6ICdTZXQgVVJMIFN1ZmZpeCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQTogJ0V4LiBvc3MtY24tYmVpamluZycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSDogJ0V4LiB0ZXN0LycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfT1BUSU9OUzogJ0V4LiA/eC1vc3MtcHJvY2Vzcz14eHgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogJ0V4LiBodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gVGVuY2VudC1jbG91ZFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVUQ6ICdUZW5jZW50IENsb3VkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1ZFUlNJT046ICdDaG9vc2UgQ09TIHZlcnNpb24nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQ6ICdTZXQgU2VjcmV0SWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZOiAnU2V0IFNlY3JldEtleScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRDogJ1NldCBBcHBJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUE6ICdTZXQgQXJlYScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUzogJ1NldCBVUkwgU3VmZml4JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTDogJ1NldCBDdXN0b20gVVJMJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQ6ICdFeC4gMTIzNDU2Nzg5MCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUE6ICdFeC4gYXAtYmVpamluZycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cDovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfT1BUSU9OUzogJ0V4LiA/aW1hZ2VNb2dyMicsXHJcblxyXG4gIC8vIEdpdEh1YlxyXG4gIFBJQ0JFRF9HSVRIVUI6ICdHaXRIdWInLFxyXG4gIFBJQ0JFRF9HSVRIVUJfVE9LRU46ICdTZXQgVG9rZW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUkVQTzogJ1NldCBSZXBvIE5hbWUnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfR0lUSFVCX0JSQU5DSDogJ1NldCBCcmFuY2gnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMOiAnU2V0IEN1c3RvbSBVUkwnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPOiAnRXguIHVzZXJuYW1lL3JlcG8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0g6ICdFeC4gbWFpbicsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIHFpbml1XHJcbiAgUElDQkVEX1FJTklVOiAnUWluaXUnLFxyXG4gIFBJQ0JFRF9RSU5JVV9BQ0NFU1NLRVk6ICdTZXQgQWNjZXNzS2V5JyxcclxuICBQSUNCRURfUUlOSVVfU0VDUkVUS0VZOiAnU2V0IFNlY3JldEtleScsXHJcbiAgUElDQkVEX1FJTklVX0JVQ0tFVDogJ1NldCBCdWNrZXQnLFxyXG4gIFBJQ0JFRF9RSU5JVV9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9RSU5JVV9VUkw6ICdTZXQgVVJMJyxcclxuICBQSUNCRURfUUlOSVVfT1BUSU9OUzogJ1NldCBVUkwgU3VmZml4JyxcclxuICBQSUNCRURfUUlOSVVfQVJFQTogJ1NldCBBcmVhJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBOiAnRXguIHowJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9PUFRJT05TOiAnRXguID9pbWFnZXNsaW0nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTDogJ0V4LiBodHRwczovL3h4eC55eXkuZ2xiLmNsb3VkZG4uY29tJyxcclxuXHJcbiAgLy8gaW1ndXJcclxuICBQSUNCRURfSU1HVVI6ICdJbWd1cicsXHJcbiAgUElDQkVEX0lNR1VSX0NMSUVOVElEOiAnU2V0IENsaWVudElkJyxcclxuICBQSUNCRURfSU1HVVJfVVNFUk5BTUU6ICdTZXQgVXNlcm5hbWUnLFxyXG4gIFBJQ0JFRF9JTUdVUl9BQ0NFU1NfVE9LRU46ICdTZXQgQWNjZXNzIFRva2VuJyxcclxuICBQSUNCRURfSU1HVVJfQUxCVU06ICdTZXQgQWxidW0gTmFtZScsXHJcbiAgUElDQkVEX0lNR1VSX1BST1hZOiAnU2V0IFByb3h5JyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9DTElFTlRJRDogJ0ZpbGwgaW4gd2hlbiB5b3UgbmVlZCB0byB1cGxvYWQgYXMgYW5vbnltb3VzJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9VU0VSTkFNRTogJ0ZpbGwgaW4gd2hlbiB5b3UgbmVlZCB0byB1cGxvYWQgdG8gdGhlIGFjY291bnQnLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX0FDQ0VTU19UT0tFTjogJ0ZpbGwgaW4gd2hlbiB5b3UgbmVlZCB0byB1cGxvYWQgdG8gdGhlIGFjY291bnQnLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX0FMQlVNOiAn5L6L5aaC77yadGVzdCcsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfUFJPWFk6ICdFeC4gaHR0cDovLzEyNy4wLjAuMToxMDgwJyxcclxuXHJcbiAgLy8gdXB5dW5cclxuICBQSUNCRURfVVBZVU46ICdVcHl1bicsXHJcbiAgUElDQkVEX1VQWVVOX0JVQ0tFVDogJ1NldCBCdWNrZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUEVSQVRPUjogJ1NldCBPcGVyYXRvcicsXHJcbiAgUElDQkVEX1VQWVVOX1BBU1NXT1JEOiAnU2V0IE9wZXJhdG9yIFBhc3N3b3JkJyxcclxuICBQSUNCRURfVVBZVU5fUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfVVBZVU5fVVJMOiAnU2V0IFVSTCcsXHJcbiAgUElDQkVEX1VQWVVOX09QVElPTlM6ICdTZXQgVVJMIFN1ZmZpeCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1I6ICdFeC4gbWUnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEOiAnUGxlYXNlIHR5cGUgdGhlIG9wZXJhdG9yIHBhc3N3b3JkJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkw6ICdFeC4gaHR0cDovL3h4eC50ZXN0LnVwY2RuLm5ldCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BUSU9OUzogJ0V4LiAhaW1nc2xpbScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSDogJ0V4LiB0ZXN0LycsXHJcblxyXG4gIC8vIHdlYmRhdlxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVDogJ1dlYkRBVicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0hPU1Q6ICdTZXQgSG9zdCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1NTTEVOQUJMRUQ6ICdFbmFibGUgSFRUUFMnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9VU0VSTkFNRTogJ1NldCBVc2VybmFtZScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1BBU1NXT1JEOiAnU2V0IFBhc3N3b3JkJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfV0VCU0lURV9QQVRIOiAnU2V0IFdlYnNpdGUgUGF0aCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTDogJ1NldCBDdXN0b20gVVJMJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9IT1NUOiAnRXguIGh0dHBzOi8vZXhhbXBsZS5jb20vd2ViZGF2JyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9TU0xFTkFCTEVEOiAnRW5hYmxlIEhUVFBTJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9VU0VSTkFNRTogJ0V4LiBtZScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfUEFTU1dPUkQ6ICdQbGVhc2UgdHlwZSB0aGUgcGFzc3dvcmQnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1dFQlNJVEVfUEFUSDogJ1VzZWQgdG8gZ2VuZXJhdGUgdGhlIFVSTCBvZiB0aGUgaW1hZ2UnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0NVU1RPTVVSTDogJ0V4LiBodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgQlVJTERJTl9SRU5BTUVfRk9STUFUOiAnU2V0IHJlbmFtZSBmb3JtYXQnLFxyXG4gIEJVSUxESU5fUkVOQU1FX0VOQUJMRTogJ0VuYWJsZSByZW5hbWUnLFxyXG5cclxuICBCVUlMRElOX1dBVEVSTUFSS19JU0FERFdBVEVSTUFSSzogJ1doZXRoZXIgdG8gYWRkIHdhdGVybWFyaycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9JU0FERFdBVEVSTUFSSzogJ0VuYWJsZSB3aGVuIHdhdGVybWFyayBpcyByZXF1aXJlZCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVFlQRTogJ1NldCB3YXRlcm1hcmsgdHlwZScsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktUWVBFOiAnUGxlYXNlIHNlbGVjdCB3YXRlcm1hcmsgdHlwZScsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfSVNGVUxMU0NSRUVOV0FURVJNQVJLOiAnV2hldGhlciB0byB1c2UgZnVsbC1zY3JlZW4gd2F0ZXJtYXJrJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX0lTRlVMTFNDUkVFTldBVEVSTUFSSzogJ0VuYWJsZSB3aGVuIGZ1bGwtc2NyZWVuIHdhdGVybWFyayBpcyByZXF1aXJlZCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLREVHUkVFOiAnU2V0IHdhdGVybWFyayBhbmdsZScsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktERUdSRUU6ICdQbGVhc2UgZW50ZXIgYSBudW1iZXInLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RFWFQ6ICdTZXQgd2F0ZXJtYXJrIHRleHQnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLVEVYVDogJ1BsZWFzZSBlbnRlciB3YXRlcm1hcmsgdGV4dCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVEVYVEZPTlRQQVRIOiAnU2V0IHdhdGVybWFyayBmb250JyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRQQVRIOiAnUGxlYXNlIGVudGVyIHRoZSB3YXRlcm1hcmsgZm9udCBmaWxlIHBhdGgnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRSQVRJTzogJ1NldCB0aGUgcmF0aW8gb2YgdGhlIHdhdGVybWFyayB0byB0aGUgaW1hZ2UnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVFJBVElPOiAnUGxlYXNlIGVudGVyIGEgbnVtYmVyIGJldHdlZW4gMC0xJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktGT05UQ09MT1I6ICdTZXQgd2F0ZXJtYXJrIGZvbnQgY29sb3InLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVENPTE9SOiAnUGxlYXNlIGVudGVyIHRoZSBSR0IgY29sb3IgdmFsdWUnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0lNQUdFUEFUSDogJ1NldCB3YXRlcm1hcmsgaW1hZ2UgcGF0aCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktJTUFHRVBBVEg6ICdQbGVhc2UgZW50ZXIgdGhlIHdhdGVybWFyayBpbWFnZSBwYXRoJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktQT1NJVElPTjogJ1NldCB3YXRlcm1hcmsgcG9zaXRpb24nLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLUE9TSVRJT046ICdQbGVhc2Ugc2VsZWN0IHdhdGVybWFyayBwb3NpdGlvbicsXHJcblxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUVVBTElUWTogJ1NldCBpbWFnZSBxdWFsaXR5JyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUVVBTElUWTogJ1BsZWFzZSBlbnRlciBhbiBpbnRlZ2VyIGJldHdlZW4gMC0xMDAnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNDT05WRVJUOiAnV2hldGhlciB0byBwZXJmb3JtIGZvcm1hdCBjb252ZXJzaW9uJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNDT05WRVJUOiAnRW5hYmxlIHdoZW4gZm9ybWF0IGNvbnZlcnNpb24gaXMgcmVxdWlyZWQnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfQ09OVkVSVEZPUk1BVDogJ1NldCBjb252ZXJzaW9uIGZvcm1hdCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0NPTlZFUlRGT1JNQVQ6ICdQbGVhc2Ugc2VsZWN0IGNvbnZlcnNpb24gZm9ybWF0JyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTUkVTSVpFOiAnV2hldGhlciB0byByZXNpemUgdGhlIGltYWdlJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRVNJWkU6ICdFbmFibGUgd2hlbiBpbWFnZSByZXNpemluZyBpcyByZXF1aXJlZCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19SRVNJWkVXSURUSDogJ1NldCByZXNpemluZyB3aWR0aCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRVdJRFRIOiAnUGxlYXNlIGVudGVyIGEgbnVtYmVyJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1JFU0laRUhFSUdIVDogJ1NldCByZXNpemluZyBoZWlnaHQnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVIRUlHSFQ6ICdQbGVhc2UgZW50ZXIgYSBudW1iZXInLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkVCWVBFUkNFTlQ6ICdXaGV0aGVyIHRvIHJlc2l6ZSB0aGUgaW1hZ2UgYnkgcGVyY2VudGFnZScsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVTSVpFQllQRVJDRU5UOiAnRW5hYmxlIHdoZW4gcmVzaXppbmcgYnkgcGVyY2VudGFnZSBpcyByZXF1aXJlZCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19SRVNJWkVQRVJDRU5UOiAnU2V0IHJlc2l6aW5nIHBlcmNlbnRhZ2UnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVQRVJDRU5UOiAnUGxlYXNlIGVudGVyIGEgbnVtYmVyJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTUk9UQVRFOiAnV2hldGhlciB0byByb3RhdGUgdGhlIGltYWdlJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNST1RBVEU6ICdFbmFibGUgd2hlbiBpbWFnZSByb3RhdGlvbiBpcyByZXF1aXJlZCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19ST1RBVEVERUdSRUU6ICdTZXQgcm90YXRpb24gYW5nbGUnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9ST1RBVEVERUdSRUU6ICdQbGVhc2UgZW50ZXIgYSBudW1iZXIsIGNhbiBiZSBuZWdhdGl2ZScsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JFTU9WRUVYSUY6ICdXaGV0aGVyIHRvIHJlbW92ZSBFWElGIGluZm9ybWF0aW9uJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRU1PVkVFWElGOiAnRW5hYmxlIHdoZW4gcmVtb3ZpbmcgRVhJRiBpbmZvcm1hdGlvbiBpcyByZXF1aXJlZCcsXHJcbiAgLy8gUGx1Z2luIEhhbmRsZXJcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTOiAnUGx1Z2luIGluc3RhbGxlZCBzdWNjZXNzZnVsbHknLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRDogJ1BsdWdpbiBpbnN0YWxsYXRpb24gZmFpbGVkJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUkVBU09OOiAnUGx1Z2luIGluc3RhbGxhdGlvbiBmYWlsZWQsIGVycm9yIGNvZGUgaXMgJHtjb2RlfSwgZXJyb3IgbG9nIGlzIFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUEFUSDogJ1BsdWdpbiBpbnN0YWxsYXRpb24gZmFpbGVkLCBwbGVhc2UgZW50ZXIgYSB2YWxpZCBwbHVnaW4gbmFtZSBvciB2YWxpZCBpbnN0YWxsYXRpb24gcGF0aCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTOiAnUGx1Z2luIHVuaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQ6ICdQbHVnaW4gdW5pbnN0YWxsIGZhaWxlZCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfUkVBU09OOiAnUGx1Z2luIHVuaW5zdGFsbCBmYWlsZWQsIGVycm9yIGNvZGUgaXMgJHtjb2RlfSwgZXJyb3IgbG9nIGlzIFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRDogJ1BsdWdpbiB1bmluc3RhbGwgZmFpbGVkLCBwbGVhc2UgZW50ZXIgYSB2YWxpZCBwbHVnaW4gbmFtZScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTOiAnUGx1Z2luIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRDogJ1BsdWdpbiB1cGRhdGUgZmFpbGVkJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9SRUFTT046ICdQbHVnaW4gdXBkYXRlIGZhaWxlZCwgZXJyb3IgY29kZSBpcyAke2NvZGV9LCBlcnJvciBsb2cgaXMgXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEOiAnUGx1Z2luIHVwZGF0ZSBmYWlsZWQsIHBsZWFzZSBlbnRlciBhIHZhbGlkIHBsdWdpbiBuYW1lJ1xyXG59XHJcbiIsImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xyXG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnb3MnXHJcbmltcG9ydCBDb21tYW5kZXIgZnJvbSAnLi4vbGliL0NvbW1hbmRlcidcclxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbGliL0xvZ2dlcidcclxuaW1wb3J0IExpZmVjeWNsZSBmcm9tICcuL0xpZmVjeWNsZSdcclxuaW1wb3J0IExpZmVjeWNsZVBsdWdpbnMsIHsgc2V0Q3VycmVudFBsdWdpbk5hbWUgfSBmcm9tICcuLi9saWIvTGlmZWN5Y2xlUGx1Z2lucydcclxuaW1wb3J0IHVwbG9hZGVycyBmcm9tICcuLi9wbHVnaW5zL3VwbG9hZGVyJ1xyXG5pbXBvcnQgdHJhbnNmb3JtZXJzIGZyb20gJy4uL3BsdWdpbnMvdHJhbnNmb3JtZXInXHJcbmltcG9ydCBQbHVnaW5Mb2FkZXIgZnJvbSAnLi4vbGliL1BsdWdpbkxvYWRlcidcclxuaW1wb3J0IHsgZ2V0LCBzZXQsIHVuc2V0IH0gZnJvbSAnbG9kYXNoJ1xyXG5pbXBvcnQgeyBJSGVscGVyLCBJSW1nSW5mbywgSUNvbmZpZywgSVBpY0dvLCBJU3RyaW5nS2V5TWFwLCBJUGx1Z2luTG9hZGVyLCBJSTE4bk1hbmFnZXIsIElQaWNHb1BsdWdpbiwgSVBpY0dvUGx1Z2luSW50ZXJmYWNlLCBJUmVxdWVzdCB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgZ2V0Q2xpcGJvYXJkSW1hZ2UgZnJvbSAnLi4vdXRpbHMvZ2V0Q2xpcGJvYXJkSW1hZ2UnXHJcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4uL2xpYi9SZXF1ZXN0J1xyXG5pbXBvcnQgREIgZnJvbSAnLi4vdXRpbHMvZGInXHJcbmltcG9ydCBQbHVnaW5IYW5kbGVyIGZyb20gJy4uL2xpYi9QbHVnaW5IYW5kbGVyJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50LCBJQnVzRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBldmVudEJ1cyB9IGZyb20gJy4uL3V0aWxzL2V2ZW50QnVzJ1xyXG5pbXBvcnQgeyBpc0NvbmZpZ0tleUluQmxhY2tMaXN0LCBpc0lucHV0Q29uZmlnVmFsaWQgfSBmcm9tICcuLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IEkxOG5NYW5hZ2VyIH0gZnJvbSAnLi4vaTE4bidcclxuXHJcbmV4cG9ydCBjbGFzcyBQaWNHbyBleHRlbmRzIEV2ZW50RW1pdHRlciBpbXBsZW1lbnRzIElQaWNHbyB7XHJcbiAgcHJpdmF0ZSBfY29uZmlnITogSUNvbmZpZ1xyXG4gIHByaXZhdGUgbGlmZWN5Y2xlITogTGlmZWN5Y2xlXHJcbiAgcHJpdmF0ZSBkYiE6IERCXHJcbiAgcHJpdmF0ZSBfcGx1Z2luTG9hZGVyITogUGx1Z2luTG9hZGVyXHJcbiAgY29uZmlnUGF0aDogc3RyaW5nXHJcbiAgYmFzZURpciE6IHN0cmluZ1xyXG4gIGhlbHBlciE6IElIZWxwZXJcclxuICBsb2c6IExvZ2dlclxyXG4gIGNtZDogQ29tbWFuZGVyXHJcbiAgb3V0cHV0OiBJSW1nSW5mb1tdXHJcbiAgaW5wdXQ6IGFueVtdXHJcbiAgcmF3SW5wdXQ6IGFueVtdXHJcbiAgcGx1Z2luSGFuZGxlcjogUGx1Z2luSGFuZGxlclxyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBpbiB2MS41LjArXHJcbiAgICpcclxuICAgKiB1c2UgcmVxdWVzdCBpbnN0ZWFkXHJcbiAgICovXHJcbiAgUmVxdWVzdCE6IFJlcXVlc3RcclxuICBpMThuITogSUkxOG5NYW5hZ2VyXHJcbiAgVkVSU0lPTjogc3RyaW5nID0gcHJvY2Vzcy5lbnYuUElDR09fVkVSU0lPTlxyXG4gIEdVSV9WRVJTSU9OPzogc3RyaW5nXHJcblxyXG4gIGdldCBwbHVnaW5Mb2FkZXIgKCk6IElQbHVnaW5Mb2FkZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BsdWdpbkxvYWRlclxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IgKGNvbmZpZ1BhdGg6IHN0cmluZyA9ICcnKSB7XHJcbiAgICBzdXBlcigpXHJcbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBjb25maWdQYXRoXHJcbiAgICB0aGlzLm91dHB1dCA9IFtdXHJcbiAgICB0aGlzLmlucHV0ID0gW11cclxuICAgIHRoaXMucmF3SW5wdXQgPSBbXVxyXG4gICAgdGhpcy5oZWxwZXIgPSB7XHJcbiAgICAgIHRyYW5zZm9ybWVyOiBuZXcgTGlmZWN5Y2xlUGx1Z2lucygndHJhbnNmb3JtZXInKSxcclxuICAgICAgdXBsb2FkZXI6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCd1cGxvYWRlcicpLFxyXG4gICAgICBiZWZvcmVUcmFuc2Zvcm1QbHVnaW5zOiBuZXcgTGlmZWN5Y2xlUGx1Z2lucygnYmVmb3JlVHJhbnNmb3JtUGx1Z2lucycpLFxyXG4gICAgICBiZWZvcmVVcGxvYWRQbHVnaW5zOiBuZXcgTGlmZWN5Y2xlUGx1Z2lucygnYmVmb3JlVXBsb2FkUGx1Z2lucycpLFxyXG4gICAgICBhZnRlclVwbG9hZFBsdWdpbnM6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCdhZnRlclVwbG9hZFBsdWdpbnMnKVxyXG4gICAgfVxyXG4gICAgdGhpcy5pbml0Q29uZmlnUGF0aCgpXHJcbiAgICB0aGlzLmxvZyA9IG5ldyBMb2dnZXIodGhpcylcclxuICAgIHRoaXMuY21kID0gbmV3IENvbW1hbmRlcih0aGlzKVxyXG4gICAgdGhpcy5wbHVnaW5IYW5kbGVyID0gbmV3IFBsdWdpbkhhbmRsZXIodGhpcylcclxuICAgIHRoaXMuaW5pdENvbmZpZygpXHJcbiAgICB0aGlzLmluaXQoKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q29uZmlnUGF0aCAoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb25maWdQYXRoID09PSAnJykge1xyXG4gICAgICB0aGlzLmNvbmZpZ1BhdGggPSBob21lZGlyKCkgKyAnLy5waWNsaXN0L2NvbmZpZy5qc29uJ1xyXG4gICAgfVxyXG4gICAgaWYgKHBhdGguZXh0bmFtZSh0aGlzLmNvbmZpZ1BhdGgpLnRvVXBwZXJDYXNlKCkgIT09ICcuSlNPTicpIHtcclxuICAgICAgdGhpcy5jb25maWdQYXRoID0gJydcclxuICAgICAgdGhyb3cgRXJyb3IoJ1RoZSBjb25maWd1cmF0aW9uIGZpbGUgb25seSBzdXBwb3J0cyBKU09OIGZvcm1hdC4nKVxyXG4gICAgfVxyXG4gICAgdGhpcy5iYXNlRGlyID0gcGF0aC5kaXJuYW1lKHRoaXMuY29uZmlnUGF0aClcclxuICAgIGNvbnN0IGV4aXN0ID0gZnMucGF0aEV4aXN0c1N5bmModGhpcy5jb25maWdQYXRoKVxyXG4gICAgaWYgKCFleGlzdCkge1xyXG4gICAgICBmcy5lbnN1cmVGaWxlU3luYyhgJHt0aGlzLmNvbmZpZ1BhdGh9YClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdENvbmZpZyAoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRiID0gbmV3IERCKHRoaXMpXHJcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLmRiLnJlYWQodHJ1ZSkgYXMgSUNvbmZpZ1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0ICgpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGluaXQgMThuIGF0IGZpcnN0XHJcbiAgICAgIHRoaXMuaTE4biA9IG5ldyBJMThuTWFuYWdlcih0aGlzKVxyXG4gICAgICB0aGlzLlJlcXVlc3QgPSBuZXcgUmVxdWVzdCh0aGlzKVxyXG4gICAgICB0aGlzLl9wbHVnaW5Mb2FkZXIgPSBuZXcgUGx1Z2luTG9hZGVyKHRoaXMpXHJcbiAgICAgIC8vIGxvYWQgc2VsZiBwbHVnaW5zXHJcbiAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKCdwaWNnbycpXHJcbiAgICAgIHVwbG9hZGVycyh0aGlzKS5yZWdpc3Rlcih0aGlzKVxyXG4gICAgICB0cmFuc2Zvcm1lcnModGhpcykucmVnaXN0ZXIodGhpcylcclxuICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUoJycpXHJcbiAgICAgIC8vIGxvYWQgdGhpcmQtcGFydHkgcGx1Z2luc1xyXG4gICAgICB0aGlzLl9wbHVnaW5Mb2FkZXIubG9hZCgpXHJcbiAgICAgIHRoaXMubGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZSh0aGlzKVxyXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgIHRoaXMuZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgLTEpXHJcbiAgICAgIHRoaXMubG9nLmVycm9yKGUpXHJcbiAgICAgIHRocm93IGVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGVhc2lseSBtYW5udWFsbHkgbG9hZCBhIHBsdWdpblxyXG4gICAqIGlmIHByb3ZpZGUgcGx1Z2luIG5hbWUsIHdpbGwgcmVnaXN0ZXIgcGx1Z2luIGJ5IG5hbWVcclxuICAgKiBvciBqdXN0IGluc3RhbnRpYXRlIGEgcGx1Z2luXHJcbiAgICovXHJcbiAgdXNlIChwbHVnaW46IElQaWNHb1BsdWdpbiwgbmFtZT86IHN0cmluZyk6IElQaWNHb1BsdWdpbkludGVyZmFjZSB7XHJcbiAgICBpZiAobmFtZSkge1xyXG4gICAgICB0aGlzLnBsdWdpbkxvYWRlci5yZWdpc3RlclBsdWdpbihuYW1lLCBwbHVnaW4pXHJcbiAgICAgIHJldHVybiB0aGlzLnBsdWdpbkxvYWRlci5nZXRQbHVnaW4obmFtZSkhXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBwbHVnaW5JbnN0YW5jZSA9IHBsdWdpbih0aGlzKVxyXG4gICAgICByZXR1cm4gcGx1Z2luSW5zdGFuY2VcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyQ29tbWFuZHMgKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnUGF0aCAhPT0gJycpIHtcclxuICAgICAgdGhpcy5jbWQuaW5pdCgpXHJcbiAgICAgIHRoaXMuY21kLmxvYWRDb21tYW5kcygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb25maWc8VD4gKG5hbWU/OiBzdHJpbmcpOiBUIHtcclxuICAgIGlmICghbmFtZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fY29uZmlnIGFzIHVua25vd24gYXMgVFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGdldCh0aGlzLl9jb25maWcsIG5hbWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzYXZlQ29uZmlnIChjb25maWc6IElTdHJpbmdLZXlNYXA8YW55Pik6IHZvaWQge1xyXG4gICAgaWYgKCFpc0lucHV0Q29uZmlnVmFsaWQoY29uZmlnKSkge1xyXG4gICAgICB0aGlzLmxvZy53YXJuKCd0aGUgZm9ybWF0IG9mIGNvbmZpZyBpcyBpbnZhbGlkLCBwbGVhc2UgcHJvdmlkZSBvYmplY3QnKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuc2V0Q29uZmlnKGNvbmZpZylcclxuICAgIHRoaXMuZGIuc2F2ZUNvbmZpZyhjb25maWcpXHJcbiAgfVxyXG5cclxuICByZW1vdmVDb25maWcgKGtleTogc3RyaW5nLCBwcm9wTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIWtleSB8fCAhcHJvcE5hbWUpIHJldHVyblxyXG4gICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3Qoa2V5KSkge1xyXG4gICAgICB0aGlzLmxvZy53YXJuKGB0aGUgY29uZmlnLiR7a2V5fSBjYW4ndCBiZSByZW1vdmVkYClcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLnVuc2V0Q29uZmlnKGtleSwgcHJvcE5hbWUpXHJcbiAgICB0aGlzLmRiLnVuc2V0KGtleSwgcHJvcE5hbWUpXHJcbiAgfVxyXG5cclxuICBzZXRDb25maWcgKGNvbmZpZzogSVN0cmluZ0tleU1hcDxhbnk+KTogdm9pZCB7XHJcbiAgICBpZiAoIWlzSW5wdXRDb25maWdWYWxpZChjb25maWcpKSB7XHJcbiAgICAgIHRoaXMubG9nLndhcm4oJ3RoZSBmb3JtYXQgb2YgY29uZmlnIGlzIGludmFsaWQsIHBsZWFzZSBwcm92aWRlIG9iamVjdCcpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3QobmFtZSkpIHtcclxuICAgICAgICB0aGlzLmxvZy53YXJuKGB0aGUgY29uZmlnLiR7bmFtZX0gY2FuJ3QgYmUgbW9kaWZpZWRgKVxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcclxuICAgICAgICBkZWxldGUgY29uZmlnW25hbWVdXHJcbiAgICAgIH1cclxuICAgICAgc2V0KHRoaXMuX2NvbmZpZywgbmFtZSwgY29uZmlnW25hbWVdKVxyXG4gICAgICBldmVudEJ1cy5lbWl0KElCdXNFdmVudC5DT05GSUdfQ0hBTkdFLCB7XHJcbiAgICAgICAgY29uZmlnTmFtZTogbmFtZSxcclxuICAgICAgICB2YWx1ZTogY29uZmlnW25hbWVdXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdW5zZXRDb25maWcgKGtleTogc3RyaW5nLCBwcm9wTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIWtleSB8fCAhcHJvcE5hbWUpIHJldHVyblxyXG4gICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3Qoa2V5KSkge1xyXG4gICAgICB0aGlzLmxvZy53YXJuKGB0aGUgY29uZmlnLiR7a2V5fSBjYW4ndCBiZSB1bnNldGApXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdW5zZXQodGhpcy5nZXRDb25maWcoa2V5KSwgcHJvcE5hbWUpXHJcbiAgfVxyXG5cclxuICBnZXQgcmVxdWVzdCAoKTogSVJlcXVlc3RbJ3JlcXVlc3QnXSB7XHJcbiAgICByZXR1cm4gdGhpcy5SZXF1ZXN0LnJlcXVlc3QuYmluZCh0aGlzLlJlcXVlc3QpXHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGxvYWQgKGlucHV0PzogYW55W10pOiBQcm9taXNlPElJbWdJbmZvW10gfCBFcnJvcj4ge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnUGF0aCA9PT0gJycpIHtcclxuICAgICAgdGhpcy5sb2cuZXJyb3IoJ1RoZSBjb25maWd1cmF0aW9uIGZpbGUgb25seSBzdXBwb3J0cyBKU09OIGZvcm1hdC4nKVxyXG4gICAgICByZXR1cm4gW11cclxuICAgIH1cclxuICAgIC8vIHVwbG9hZCBmcm9tIGNsaXBib2FyZFxyXG4gICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQgfHwgaW5wdXQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgeyBpbWdQYXRoLCBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcgfSA9IGF3YWl0IGdldENsaXBib2FyZEltYWdlKHRoaXMpXHJcbiAgICAgICAgaWYgKGltZ1BhdGggPT09ICdubyBpbWFnZScpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW1hZ2Ugbm90IGZvdW5kIGluIGNsaXBib2FyZCcpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMub25jZShJQnVpbGRJbkV2ZW50LkZBSUxFRCwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNob3VsZEtlZXBBZnRlclVwbG9hZGluZykge1xyXG4gICAgICAgICAgICAgIC8vIOWIoOmZpCBwaWNnbyDnlJ/miJDnmoTlm77niYfmlofku7bvvIzkvovlpoIgYH4vLnBpY2dvLzIwMjAwNjIxMjA1NzIwLnBuZ2BcclxuICAgICAgICAgICAgICBmcy5yZW1vdmUoaW1nUGF0aCkuY2F0Y2goKGUpID0+IHsgdGhpcy5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRoaXMub25jZSgnZmluaXNoZWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nKSB7XHJcbiAgICAgICAgICAgICAgZnMucmVtb3ZlKGltZ1BhdGgpLmNhdGNoKChlKSA9PiB7IHRoaXMubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zdCB7IG91dHB1dCB9ID0gYXdhaXQgdGhpcy5saWZlY3ljbGUuc3RhcnQoW2ltZ1BhdGhdKVxyXG4gICAgICAgICAgcmV0dXJuIG91dHB1dFxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRoaXMuZW1pdChJQnVpbGRJbkV2ZW50LkZBSUxFRCwgZSlcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHVwbG9hZCBmcm9tIHBhdGhcclxuICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IHRoaXMubGlmZWN5Y2xlLnN0YXJ0KGlucHV0KVxyXG4gICAgICByZXR1cm4gb3V0cHV0XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBpY0dvUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBJbWdGcm9tUGF0aCBmcm9tICcuL3BhdGgnXHJcbmltcG9ydCBJbWdGcm9tQmFzZTY0IGZyb20gJy4vYmFzZTY0J1xyXG5cclxuY29uc3QgYnVpbGRJblRyYW5zZm9ybWVyczogSVBpY0dvUGx1Z2luID0gKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICByZWdpc3RlciAoY3R4OiBJUGljR28pIHtcclxuICAgICAgY3R4LmhlbHBlci50cmFuc2Zvcm1lci5yZWdpc3RlcigncGF0aCcsIEltZ0Zyb21QYXRoKVxyXG4gICAgICBjdHguaGVscGVyLnRyYW5zZm9ybWVyLnJlZ2lzdGVyKCdiYXNlNjQnLCBJbWdGcm9tQmFzZTY0KVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgYnVpbGRJblRyYW5zZm9ybWVyc1xyXG4iXSwibmFtZXMiOlsicGx1Z2luSGFuZGxlciIsImhhbmRsZSIsImN0eCIsImNtZCIsInByb2dyYW0iLCJjb21tYW5kIiwiZGVzY3JpcHRpb24iLCJhbGlhcyIsIm9wdGlvbiIsImFjdGlvbiIsInBsdWdpbnMiLCJwcm94eSIsInJlZ2lzdHJ5Iiwib3B0aW9ucyIsImluc3RhbGwiLCJjYXRjaCIsImUiLCJsb2ciLCJlcnJvciIsInVuaW5zdGFsbCIsInVwZGF0ZSIsImNvbmZpZyIsInJhbmRvbVN0cmluZ0dlbmVyYXRvciIsImxlbmd0aCIsImNoYXJzIiwiQXJyYXkiLCJmcm9tIiwibWFwIiwiY2hhckF0IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwiam9pbiIsInJlbmFtZUZpbGVOYW1lV2l0aEN1c3RvbVN0cmluZyIsIm9sZE5hbWUiLCJjdXN0b21Gb3JtYXQiLCJhZmZpeEZpbGVOYW1lIiwiY29udmVyc2lvbk1hcCIsIkRhdGUiLCJnZXRGdWxsWWVhciIsInRvU3RyaW5nIiwic2xpY2UiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiY3J5cHRvIiwiY3JlYXRlSGFzaCIsInBhdGgiLCJiYXNlbmFtZSIsImV4dG5hbWUiLCJkaWdlc3QiLCJ1dWlkdjQiLCJyZXBsYWNlIiwibm93IiwidW5kZWZpbmVkIiwiT2JqZWN0Iiwia2V5cyIsInNvbWUiLCJpdGVtIiwiaW5jbHVkZXMiLCJleHQiLCJuZXdOYW1lIiwicmVkdWNlIiwiYWNjIiwiY3VyIiwiUmVnRXhwIiwiX3Jlc3VsdCIsImtleSIsImNvdW50IiwibWF4IiwiZGlybmFtZSIsInNwbGl0Iiwic2VwIiwiYSIsImIiLCJpc1VybCIsInVybCIsInRlc3QiLCJpc1VybEVuY29kZSIsImRlY29kZVVSSSIsImhhbmRsZVVybEVuY29kZSIsImVuY29kZVVSSSIsImdldEltYWdlU2l6ZSIsImZpbGUiLCJ3aWR0aCIsImhlaWdodCIsImltYWdlU2l6ZSIsInJlYWwiLCJnZXRGU0ZpbGUiLCJhc3luYyIsImZpbGVQYXRoIiwiZmlsZU5hbWUiLCJidWZmZXIiLCJmcyIsInJlYWRGaWxlIiwic3VjY2VzcyIsInJlYXNvbiIsImdldFVSTEZpbGUiLCJ0aW1lb3V0SWQiLCJyZXF1ZXN0Rm4iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlcyIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNvbHZlV2l0aEZ1bGxSZXNwb25zZSIsInJlc3BvbnNlVHlwZSIsInRoZW4iLCJyZXNwIiwiZGF0YSIsImNsZWFyVGltZW91dCIsInVybFBhdGgiLCJVUkwiLCJwYXRobmFtZSIsIm1lc3NhZ2UiLCJ0aW1lb3V0UHJvbWlzZSIsInNldFRpbWVvdXQiLCJyYWNlIiwiZ2V0UGx1Z2luTmFtZVR5cGUiLCJuYW1lIiwic3RhcnRzV2l0aCIsImlzU2ltcGxlTmFtZSIsIm5hbWVPclBhdGgiLCJpc0Fic29sdXRlIiwicGx1Z2luUGF0aCIsInByb2Nlc3MiLCJjd2QiLCJleGlzdHNTeW5jIiwiaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lIiwic2NvcGUiLCJnZXRQcm9jZXNzUGx1Z2luTmFtZSIsImxvZ2dlciIsImNvbnNvbGUiLCJoYW5kbGVVbml4U3R5bGVQYXRoIiwid2FybiIsImdldE5vcm1hbFBsdWdpbk5hbWUiLCJyZW1vdmVQbHVnaW5WZXJzaW9uIiwicGFja2FnZUpTT05QYXRoIiwicG9zaXgiLCJwa2ciLCJyZWFkSlNPTlN5bmMiLCJwYXRoU3RyIiwicmVnIiwibWF0Y2hBcnIiLCJtYXRjaCIsImNvbmZpZ0JsYWNrTGlzdCIsImlzQ29uZmlnS2V5SW5CbGFja0xpc3QiLCJibGFja0l0ZW0iLCJpc0lucHV0Q29uZmlnVmFsaWQiLCJpc0FycmF5Iiwic2FmZVBhcnNlIiwic3RyIiwiSlNPTiIsInBhcnNlIiwiZm9yY2VOdW1iZXIiLCJudW0iLCJpc05hTiIsIk51bWJlciIsImlzRGV2IiwiZW52IiwiTk9ERV9FTlYiLCJkZWZhdWx0V2F0ZXJtYXJrSW1hZ2VQYXRoIiwiX19kaXJuYW1lIiwiQWRkV2F0ZXJtYXJrIiwiaW1nIiwid2F0ZXJtYXJrVHlwZSIsImRlZmF1bHRXYXRlcm1hcmtGb250UGF0aCIsImlzRnVsbFNjcmVlbldhdGVybWFyayIsIndhdGVybWFya0RlZ3JlZSIsInRleHQiLCJ3YXRlcm1hcmtGb250UGF0aCIsIndhdGVybWFya1NjYWxlUmF0aW8iLCJ3YXRlcm1hcmtDb2xvciIsIndhdGVybWFya0ltYWdlUGF0aCIsInBvc2l0aW9uIiwiaW1hZ2UiLCJzaGFycCIsImltZ1dpZHRoIiwibWV0YWRhdGEiLCJ3YXRlcm1hcmsiLCJ0b0J1ZmZlciIsImNvbG9yIiwiZm9udEZhbWlseSIsImFuY2hvciIsImF0dHJpYnV0ZXMiLCJmaWxsIiwidGV4dFNWRyIsIlRleHRUb1NWRyIsImxvYWRTeW5jIiwiZ2V0U1ZHIiwiQnVmZmVyIiwidGV4dDJTVkciLCJ3YXRlcm1hcmtXaWR0aCIsIndhdGVybWFya0hlaWdodCIsImdldFNpemUiLCJ3YXRlcm1hcmtSZXNpemVXaWR0aCIsIndhdGVybWFya1Jlc2l6ZUhlaWdodCIsInJlc2l6ZSIsImZpdCIsInJvdGF0ZSIsImJhY2tncm91bmQiLCJyIiwiZyIsImFscGhhIiwiY3JlYXRlV2F0ZXJtYXJrIiwiY29tcG9zaXRlIiwiaW5wdXQiLCJncmF2aXR5IiwidGlsZSIsInZhbGlkUGFyYW0iLCJwYXJhbXMiLCJldmVyeSIsInBhcmFtIiwiYXZhaWxhYmxlQ29udmVydEZvcm1hdExpc3QiLCJpbWFnZUV4dExpc3QiLCJpbWFnZUFkZFdhdGVyTWFyayIsIndhdGVybWFya1RleHQiLCJ3YXRlcm1hcmtQb3NpdGlvbiIsImZvcm1hdE9wdGlvbnMiLCJxdWFsaXR5IiwiaXNDb252ZXJ0IiwiY29udmVydEZvcm1hdCIsImlzUmVTaXplIiwicmVTaXplSGVpZ2h0IiwicmVTaXplV2lkdGgiLCJpc1JlU2l6ZUJ5UGVyY2VudCIsInJlU2l6ZVBlcmNlbnQiLCJpc1JvdGF0ZSIsInJvdGF0ZURlZ3JlZSIsImltYWdlUHJvY2VzcyIsInJhd0Zvcm1hdCIsInRvTG93ZXJDYXNlIiwiaW1hZ2VXaWR0aCIsImltYWdlSGVpZ2h0Iiwicm91bmQiLCJuZXdGb3JtYXQiLCJ0b0Zvcm1hdCIsImZvcm1hdCIsImltYWdlRm9ybWF0TGlzdCIsIm5lZWRBZGRXYXRlcm1hcmsiLCJ3YXRlcm1hcmtPcHRpb25zIiwiZmlsZUV4dCIsImlzQWRkV2F0ZXJtYXJrIiwibmVlZENvbXByZXNzIiwiY29tcHJlc3NPcHRpb25zIiwicmVtb3ZlRXhpZiIsInVwbG9hZCIsImFyZ3VtZW50cyIsImlucHV0TGlzdCIsImZpbHRlciIsImV4aXN0IiwidXNlckNvbmZpZyIsImdldENvbmZpZyIsInR5cGUiLCJpMThuIiwidHJhbnNsYXRlIiwicmVxdWlyZWQiLCJkZWZhdWx0IiwiY2hvaWNlcyIsImlzUmVtb3ZlRXhpZiIsImVuYWJsZSIsImhhbmRsZUNvbmZpZyIsInByb21wdHMiLCJtb2R1bGUiLCJhbnN3ZXIiLCJpbnF1aXJlciIsInByb21wdCIsImNvbmZpZ05hbWUiLCJzYXZlQ29uZmlnIiwic2V0dGluZyIsImNvbXByZXNzIiwicmVuYW1lIiwiYnVpbGRpbiIsImhlbHBlciIsImdldCIsImdldElkTGlzdCIsInBsdWdpbkxvYWRlciIsImdldFBsdWdpbiIsImdldEZ1bGxMaXN0IiwicGx1Z2luIiwiaW5mbyIsImFyZ3YiLCJ1c2UiLCJ1cGxvYWRlciIsInRyYW5zZm9ybWVyIiwicHVzaCIsInBpY2dvUGx1Z2lucyIsInNldENvbmZpZyIsImdlbmVyYXRlIiwib3B0cyIsImdldE9wdGlvbnMiLCJ0bXAiLCJzb3VyY2UiLCJhbnN3ZXJzIiwiX2ZpbGVzIiwiZ2xvYmJ5IiwiZG90IiwiZ2xvYiIsImZpbHRlcnMiLCJmb3JFYWNoIiwiZmlsZXMiLCJyZW5kZXIiLCJ3cml0ZUZpbGVUcmVlIiwiZGVzdCIsImNvbXBsZXRlIiwiY29tcGxldGVNZXNzYWdlIiwiZXhwIiwiZm4iLCJGdW5jdGlvbiIsInN0cmluZ2lmeSIsInRlbXBsYXRlUGF0aCIsIm9wdGlvbnNQYXRoIiwicmVxdWlyZSIsImZpbGVUcmVlIiwicmVhZEZpbGVTeW5jIiwiY29udGVudCIsImVqcyIsImlzQnVmZmVyIiwiZGlyIiwiZW5zdXJlRGlyU3luYyIsIndyaXRlRmlsZVN5bmMiLCJydW4iLCJvZmZsaW5lIiwidGVtcGxhdGUiLCJoYXNTbGFzaCIsImRvd25sb2FkQW5kR2VuZXJhdGUiLCJybSIsInN5bmMiLCJkb3dubG9hZCIsImNsb25lIiwiZXJyIiwiaW5pdCIsInByb2plY3QiLCJpblBsYWNlIiwiaG9tZWRpciIsIm9rIiwib24iLCJjaGFsayIsImdyYXkiLCJsYW5nIiwibGlzdCIsImdldExhbmd1YWdlTGlzdCIsInNldExhbmd1YWdlIiwiTGlmZWN5Y2xlUGx1Z2lucyIsImNvbnN0cnVjdG9yIiwidGhpcyIsIk1hcCIsInBsdWdpbklkTWFwIiwicmVnaXN0ZXIiLCJpZCIsIlR5cGVFcnJvciIsImhhcyIsInNldCIsImN1cnJlbnRQbHVnaW4iLCJ1bnJlZ2lzdGVyIiwicGx1Z2luTmFtZSIsInBsdWdpbkxpc3QiLCJkZWxldGUiLCJnZXROYW1lIiwiZ2V0TGlzdCIsInZhbHVlcyIsInNldEN1cnJlbnRQbHVnaW5OYW1lIiwiQ29tbWFuZGVyIiwiQ29tbWFuZCIsInZlcnNpb24iLCJkZWJ1ZyIsInNpbGVudCIsImFyZ3MiLCJleGl0IiwiY3VycmVudFBsdWdpbk5hbWUiLCJsb2FkQ29tbWFuZHMiLCJJTG9nVHlwZSIsIklCdWlsZEluRXZlbnQiLCJJQnVzRXZlbnQiLCJMb2dnZXIiLCJoYW5kbGVMb2ciLCJtc2ciLCJsb2dIZWFkZXIiLCJsZXZlbCIsInRvVXBwZXJDYXNlIiwibG9nTGV2ZWwiLCJsb2dQYXRoIiwiYmFzZURpciIsInJlc3VsdCIsImNoZWNrTG9nRmlsZUlzTGFyZ2UiLCJpc0xhcmdlIiwid2FybmluZ01zZyIsInllbGxvdyIsInJlY3JlYXRlTG9nRmlsZSIsInVuc2hpZnQiLCJoYW5kbGVXcml0ZUxvZyIsImxvZ0ZpbGVTaXplIiwic3RhdFN5bmMiLCJzaXplIiwibG9nRmlsZVNpemVMaW1pdCIsInVubGlua1N5bmMiLCJjcmVhdGVGaWxlU3luYyIsImNoZWNrTG9nTGV2ZWwiLCJkYXlqcyIsIkVycm9yIiwidXRpbCIsInN0YWNrIiwiYXBwZW5kRmlsZVN5bmMiLCJMaWZlY3ljbGUiLCJFdmVudEVtaXR0ZXIiLCJzdXBlciIsInRlbXBGaWxlUGF0aCIsImVtcHR5RGlyU3luYyIsInR0ZlBhdGgiLCJvdXRwdXREaXIiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJheGlvcyIsInR0ZkxpbmsiLCJjb25maWdQYXRoIiwib3V0cHV0IiwicmF3SW5wdXQiLCJSZXF1ZXN0IiwiVkVSU0lPTiIsIkdVSV9WRVJTSU9OIiwiYmluZCIsInJlbW92ZUNvbmZpZyIsInVuc2V0Q29uZmlnIiwiYWRkTGlzdGVuZXIiLCJvbmNlIiwicmVtb3ZlTGlzdGVuZXIiLCJvZmYiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJzZXRNYXhMaXN0ZW5lcnMiLCJnZXRNYXhMaXN0ZW5lcnMiLCJsaXN0ZW5lcnMiLCJyYXdMaXN0ZW5lcnMiLCJlbWl0IiwibGlzdGVuZXJDb3VudCIsInByZXBlbmRMaXN0ZW5lciIsInByZXBlbmRPbmNlTGlzdGVuZXIiLCJldmVudE5hbWVzIiwiY3JlYXRlQ29udGV4dCIsInJhd0lucHV0UGF0aCIsImNsb25lRGVlcCIsIndhdGVybWFya01zZyIsImNvbXByZXNzTXNnIiwiYWxsU2V0dGxlZCIsImluZGV4IiwidHJhbnNmb3JtZWRCdWZmZXIiLCJkb3dubG9hZFRURiIsIm5ld0V4dCIsInRlbXBGaWxlIiwiZ2V0VGltZSIsImhlaWNCdWZmZXIiLCJoZWljUmVzdWx0IiwiaGVpY0NvbnZlcnQiLCJ0ZW1wSGVpY0NvbnZlcnRGaWxlIiwiYmVmb3JlVHJhbnNmb3JtIiwiZG9UcmFuc2Zvcm0iLCJyZW5hbWVDb25maWciLCJiZWZvcmVVcGxvYWQiLCJkb1VwbG9hZCIsImFmdGVyVXBsb2FkIiwiRkFJTEVEIiwiVVBMT0FEX1BST0dSRVNTIiwiQkVGT1JFX1RSQU5TRk9STSIsImhhbmRsZVBsdWdpbnMiLCJiZWZvcmVUcmFuc2Zvcm1QbHVnaW5zIiwiY3VycmVudFRyYW5zZm9ybWVyIiwiQkVGT1JFX1VQTE9BRCIsImJlZm9yZVVwbG9hZFBsdWdpbnMiLCJvdXRwdXRJbWciLCJBRlRFUl9VUExPQUQiLCJhZnRlclVwbG9hZFBsdWdpbnMiLCJpc0VuY29kZU91dHB1dFVSTCIsImkiLCJpbWdVcmwiLCJiYXNlNjRJbWFnZSIsIkZJTklTSEVEIiwibGlmZUN5Y2xlUGx1Z2lucyIsInBsdWdpbk5hbWVzIiwibGlmZUN5Y2xlTmFtZSIsImFsbCIsInBvc3RPcHRpb25zIiwiYXBpVG9rZW4iLCJiYWNrdXBEb21haW4iLCJoZWFkZXJzIiwiY29udGVudFR5cGUiLCJBdXRob3JpemF0aW9uIiwiZm9ybURhdGEiLCJzbWZpbGUiLCJ2YWx1ZSIsImZpbGVuYW1lIiwic3NsIiwic21tc0NvbmZpZyIsImltZ0xpc3QiLCJwb3N0Q29uZmlnIiwidG9rZW4iLCJib2R5IiwiY29kZSIsImhhc2giLCJpbWFnZXMiLCJOT1RJRklDQVRJT04iLCJ0aXRsZSIsInByZWZpeCIsImdlbmVyYXRlU2lnbmF0dXJlIiwic2VjcmV0SWQiLCJzZWNyZXRLZXkiLCJhcHBJZCIsImJ1Y2tldCIsInNpZ25hdHVyZSIsInNpZ25UaW1lIiwidG9kYXkiLCJzaWduS2V5IiwiY3JlYXRlSG1hYyIsImh0dHBTdHJpbmciLCJhcmVhIiwic3RyaW5nVG9TaWduIiwiY3VycmVudCIsIm11bHRpU2lnbmF0dXJlIiwic2lnbkhleEtleSIsInRlbXBTdHJpbmciLCJjb25jYXQiLCJlbmNvZGVVUklDb21wb25lbnQiLCJIb3N0IiwibWltZSIsImxvb2t1cCIsIm9wIiwiZmlsZWNvbnRlbnQiLCJ0Y1l1bk9wdGlvbnMiLCJjdXN0b21VcmwiLCJ1c2VWNCIsInN0YXR1c0NvZGUiLCJvcHRpb25VcmwiLCJzb3VyY2VfdXJsIiwicmVwbyIsImpzb24iLCJicmFuY2giLCJnaXRodWJPcHRpb25zIiwiZG93bmxvYWRfdXJsIiwic2hhIiwiaW1nQmFzZTY0Iiwic2VsZWN0QXJlYSIsImdldFRva2VuIiwicWluaXVPcHRpb25zIiwiYWNjZXNzS2V5IiwibWFjIiwicWluaXUiLCJhdXRoIiwiTWFjIiwicnMiLCJQdXRQb2xpY3kiLCJ1cGxvYWRUb2tlbiIsImJhc2VVcmwiLCJyZXNwb25zZSIsImNsaWVudElkIiwidXNlcm5hbWUiLCJhY2Nlc3NUb2tlbiIsImZvcm1hdEFjY2Vzc1Rva2VuIiwiYWxidW0iLCJhdXRob3JpemF0aW9uIiwicmVxdWVzdE9wdGlvbnMiLCJpbml0UGFnZXMiLCJhbGJ1bUhhc2giLCJnZXRBbGJ1bUhhc2hPcHRpb25zIiwidGltZW91dCIsImFsYnVtTGlzdCIsImltZ3VyT3B0aW9ucyIsImxpbmsiLCJkZWxldGVoYXNoIiwiZGF0ZSIsInRvVVRDU3RyaW5nIiwibWltZVR5cGUiLCJzaWduU3RyaW5nIiwiYWNjZXNzS2V5U2VjcmV0IiwiYWNjZXNzS2V5SWQiLCJhbGlZdW5PcHRpb25zIiwib3BlcmF0b3IiLCJwYXNzd29yZCIsIm1kNVBhc3N3b3JkIiwiTUQ1IiwidXB5dW5PcHRpb25zIiwicGF0aHMiLCJjdXJyZW50UGF0aCIsInAiLCJkaXJvcHRpb25zIiwiaG9zdCIsIndlYmRhdnBsaXN0T3B0aW9ucyIsInNzbEVuYWJsZWQiLCJ3ZWJwYXRoIiwiYnVpbGRJblVwbG9hZGVycyIsImFsaVl1blVwbG9hZGVyIiwidGNZdW5VcGxvYWRlciIsIlNNTVNVcGxvYWRlciIsImdpdGh1YlVwbG9hZGVyIiwicWluaXVVcGxvYWRlciIsImltZ3VyVXBsb2FkZXIiLCJ1cFl1blVwbG9hZGVyIiwid2ViZGF2cGxpc3RVcGxvYWRlciIsImdldEltZ1NpemUiLCJyZXN1bHRzIiwiaW1nU2l6ZSIsIlBsdWdpbkxvYWRlciIsIlNldCIsInBhY2thZ2VQYXRoIiwicmVwb3NpdG9yeSIsImxpY2Vuc2UiLCJyZXNvbHZlUGx1Z2luIiwiYmFzZWRpciIsImxvYWQiLCJwbHVnaW5EaXIiLCJkZXBzIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwcyIsImRldkRlcGVuZGVuY2llcyIsIm1vZHVsZXMiLCJyZWdpc3RlclBsdWdpbiIsImZ1bGxMaXN0IiwiYWRkIiwicGx1Z2luSW50ZXJmYWNlIiwicGx1Z2luTWFwIiwidW5yZWdpc3RlclBsdWdpbiIsImhhc1BsdWdpbiIsInBsYXRmb3JtMlNjcmlwdENvbnRlbnQiLCJkYXJ3aW4iLCJ3aW4zMiIsIndpbjEwIiwibGludXgiLCJ3c2wiLCJwbGF0Zm9ybTJTY3JpcHRGaWxlbmFtZSIsImdldENsaXBib2FyZEltYWdlIiwiaW1hZ2VQYXRoIiwiY3JlYXRlSW1hZ2VGb2xkZXIiLCJwbGF0Zm9ybSIsImlzV3NsIiwib3MiLCJyZWxlYXNlIiwiZ2V0Q3VycmVudFBsYXRmb3JtIiwic2NyaXB0UGF0aCIsImV4ZWN1dGlvbiIsInNwYXduIiwic3Rkb3V0IiwidHJpbSIsImltZ1BhdGgiLCJzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmciLCJldmVudEJ1cyIsImh0dHBzQWdlbnQiLCJodHRwcyIsIkFnZW50IiwibWF4VmVyc2lvbiIsIm1pblZlcnNpb24iLCJhcHBlbmRGb3JtRGF0YSIsImZvcm0iLCJhcHBlbmQiLCJyZXNwb25zZUludGVyY2VwdG9yIiwic3RhdHVzIiwicmVzcG9uc2VFcnJvckhhbmRsZXIiLCJlcnJvck9iaiIsIkNPTkZJR19DSEFOR0UiLCJoYW5kbGVQcm94eSIsInByb3h5T3B0aW9ucyIsImhvc3RuYW1lIiwicG9ydCIsInBhcnNlSW50IiwicHJvdG9jb2wiLCJtYXhCb2R5TGVuZ3RoIiwiSW5maW5pdHkiLCJtYXhDb250ZW50TGVuZ3RoIiwidHVubmVsIiwiaHR0cHNPdmVySHR0cCIsImluc3RhbmNlIiwiY3JlYXRlIiwiaW50ZXJjZXB0b3JzIiwib3B0IiwiX19pc09sZE9wdGlvbnMiLCJGb3JtRGF0YSIsImFzc2lnbiIsImdldEhlYWRlcnMiLCJxcyIsInJlcXVlc3RJbnRlcmNlcHRvciIsIm9iaiIsIkNvbnRlbnRUeXBlIiwiREIiLCJkYiIsIkpTT05TdG9yZSIsInJlYWQiLCJmbHVzaCIsInVuc2V0IiwiUGx1Z2luSGFuZGxlciIsImluc3RhbGxlZFBsdWdpbnMiLCJwcm9jZXNzUGx1Z2lucyIsImhhbmRsZVBsdWdpbk5hbWVQcm9jZXNzIiwicGtnTmFtZSIsImZ1bGxOYW1lTGlzdCIsImZ1bGxOYW1lIiwicGtnTmFtZUxpc3QiLCJleGVjQ29tbWFuZCIsIndoZXJlIiwibnBtIiwicGlwZSIsInN0ZGVyciIsImxhbmd1YWdlTGlzdCIsIlVQTE9BRF9GQUlMRUQiLCJDSEVDS19TRVRUSU5HUyIsIkNIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLIiwiVVBMT0FEX0ZBSUxFRF9SRUFTT04iLCJTRVJWRVJfRVJST1IiLCJBVVRIX0ZBSUxFRCIsIlBJQ0JFRF9TTU1TIiwiUElDQkVEX1NNTVNfVE9LRU4iLCJQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOIiwiUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOIiwiUElDQkVEX0FMSUNMT1VEIiwiUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEIiwiUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVCIsIlBJQ0JFRF9BTElDTE9VRF9CVUNLRVQiLCJQSUNCRURfQUxJQ0xPVURfQVJFQSIsIlBJQ0JFRF9BTElDTE9VRF9QQVRIIiwiUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTCIsIlBJQ0JFRF9BTElDTE9VRF9PUFRJT05TIiwiUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQSIsIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEgiLCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TIiwiUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQ1VTVE9NVVJMIiwiUElDQkVEX1RFTkNFTlRDTE9VRCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTiIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWSIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQSIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUyIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfQ1VTVE9NVVJMIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUEiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9DVVNUT01VUkwiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfT1BUSU9OUyIsIlBJQ0JFRF9HSVRIVUIiLCJQSUNCRURfR0lUSFVCX1RPS0VOIiwiUElDQkVEX0dJVEhVQl9SRVBPIiwiUElDQkVEX0dJVEhVQl9QQVRIIiwiUElDQkVEX0dJVEhVQl9CUkFOQ0giLCJQSUNCRURfR0lUSFVCX0NVU1RPTVVSTCIsIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX0JSQU5DSCIsIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTCIsIlBJQ0JFRF9RSU5JVSIsIlBJQ0JFRF9RSU5JVV9BQ0NFU1NLRVkiLCJQSUNCRURfUUlOSVVfU0VDUkVUS0VZIiwiUElDQkVEX1FJTklVX0JVQ0tFVCIsIlBJQ0JFRF9RSU5JVV9QQVRIIiwiUElDQkVEX1FJTklVX1VSTCIsIlBJQ0JFRF9RSU5JVV9PUFRJT05TIiwiUElDQkVEX1FJTklVX0FSRUEiLCJQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIIiwiUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQSIsIlBJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlMiLCJQSUNCRURfUUlOSVVfTUVTU0FHRV9VUkwiLCJQSUNCRURfSU1HVVIiLCJQSUNCRURfSU1HVVJfQ0xJRU5USUQiLCJQSUNCRURfSU1HVVJfVVNFUk5BTUUiLCJQSUNCRURfSU1HVVJfQUNDRVNTX1RPS0VOIiwiUElDQkVEX0lNR1VSX0FMQlVNIiwiUElDQkVEX0lNR1VSX1BST1hZIiwiUElDQkVEX0lNR1VSX01FU1NBR0VfQ0xJRU5USUQiLCJQSUNCRURfSU1HVVJfTUVTU0FHRV9VU0VSTkFNRSIsIlBJQ0JFRF9JTUdVUl9NRVNTQUdFX0FDQ0VTU19UT0tFTiIsIlBJQ0JFRF9JTUdVUl9NRVNTQUdFX0FMQlVNIiwiUElDQkVEX0lNR1VSX01FU1NBR0VfUFJPWFkiLCJQSUNCRURfVVBZVU4iLCJQSUNCRURfVVBZVU5fQlVDS0VUIiwiUElDQkVEX1VQWVVOX09QRVJBVE9SIiwiUElDQkVEX1VQWVVOX1BBU1NXT1JEIiwiUElDQkVEX1VQWVVOX1BBVEgiLCJQSUNCRURfVVBZVU5fVVJMIiwiUElDQkVEX1VQWVVOX09QVElPTlMiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9PUEVSQVRPUiIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEIiwiUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMIiwiUElDQkVEX1VQWVVOX01FU1NBR0VfT1BUSU9OUyIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEgiLCJQSUNCRURfV0VCREFWUExJU1QiLCJQSUNCRURfV0VCREFWUExJU1RfSE9TVCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEIiwiUElDQkVEX1dFQkRBVlBMSVNUX1VTRVJOQU1FIiwiUElDQkVEX1dFQkRBVlBMSVNUX1BBU1NXT1JEIiwiUElDQkVEX1dFQkRBVlBMSVNUX1BBVEgiLCJQSUNCRURfV0VCREFWUExJU1RfV0VCU0lURV9QQVRIIiwiUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0hPU1QiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9TU0xFTkFCTEVEIiwiUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfVVNFUk5BTUUiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVNTV09SRCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBVEgiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEgiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9DVVNUT01VUkwiLCJCVUlMRElOX1dBVEVSTUFSS19JU0FERFdBVEVSTUFSSyIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfSVNBRERXQVRFUk1BUksiLCJCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktUWVBFIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktUWVBFIiwiQlVJTERJTl9XQVRFUk1BUktfSVNGVUxMU0NSRUVOV0FURVJNQVJLIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9JU0ZVTExTQ1JFRU5XQVRFUk1BUksiLCJCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktERUdSRUUiLCJCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0RFR1JFRSIsIkJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RFWFQiLCJCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1RFWFQiLCJCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhURk9OVFBBVEgiLCJCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRQQVRIIiwiQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLRk9OVFJBVElPIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UUkFUSU8iLCJCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktGT05UQ09MT1IiLCJCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRDT0xPUiIsIkJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0lNQUdFUEFUSCIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLSU1BR0VQQVRIIiwiQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLUE9TSVRJT04iLCJCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1BPU0lUSU9OIiwiQlVJTERJTl9SRU5BTUVfRk9STUFUIiwiQlVJTERJTl9SRU5BTUVfRU5BQkxFIiwiQlVJTERJTl9DT01QUkVTU19RVUFMSVRZIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1FVQUxJVFkiLCJCVUlMRElOX0NPTVBSRVNTX0lTQ09OVkVSVCIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU0NPTlZFUlQiLCJCVUlMRElOX0NPTVBSRVNTX0NPTlZFUlRGT1JNQVQiLCJCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfQ09OVkVSVEZPUk1BVCIsIkJVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkUiLCJCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRVNJWkUiLCJCVUlMRElOX0NPTVBSRVNTX1JFU0laRVdJRFRIIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRVdJRFRIIiwiQlVJTERJTl9DT01QUkVTU19SRVNJWkVIRUlHSFQiLCJCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFSEVJR0hUIiwiQlVJTERJTl9DT01QUkVTU19JU1JFU0laRUJZUEVSQ0VOVCIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JFU0laRUJZUEVSQ0VOVCIsIkJVSUxESU5fQ09NUFJFU1NfUkVTSVpFUEVSQ0VOVCIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVQRVJDRU5UIiwiQlVJTERJTl9DT01QUkVTU19JU1JPVEFURSIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JPVEFURSIsIkJVSUxESU5fQ09NUFJFU1NfUk9UQVRFREVHUkVFIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JPVEFURURFR1JFRSIsIkJVSUxESU5fQ09NUFJFU1NfSVNSRU1PVkVFWElGIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVNT1ZFRVhJRiIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1MiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUkVBU09OIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1BBVEgiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1MiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1JFQVNPTiIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9SRUFTT04iLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRCIsImVuIiwiSTE4bk1hbmFnZXIiLCJvYmplY3RBZGFwdGVyIiwiT2JqZWN0QWRhcHRlciIsImxhbmd1YWdlIiwiSTE4biIsImFkYXB0ZXIiLCJkZWZhdWx0TGFuZ3VhZ2UiLCJsb2FkT3V0dGVySTE4biIsImkxOG5Gb2xkZXIiLCJnZXRPdXR0ZXJJMThuRm9sZGVyIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwiaXNGaWxlIiwiZW5kc1dpdGgiLCJpMThuRmlsZVBhdGgiLCJpMThuRmlsZSIsImkxOG5GaWxlT2JqIiwieWFtbCIsInBhdGhFeGlzdHNTeW5jIiwiYWRkTG9jYWxlIiwibG9jYWxlcyIsIm9yaWdpbkxvY2FsZXMiLCJnZXRMb2NhbGUiLCJuZXdMb2NhbGVzIiwibWVyZ2UiLCJzZXRMb2NhbGUiLCJhZGRMYW5ndWFnZSIsIlBpY0dvIiwiaW5pdENvbmZpZ1BhdGgiLCJpbml0Q29uZmlnIiwiX3BsdWdpbkxvYWRlciIsImVuc3VyZUZpbGVTeW5jIiwiX2NvbmZpZyIsInVwbG9hZGVycyIsIkltZ0Zyb21QYXRoIiwiSW1nRnJvbUJhc2U2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
|
|
1
|
+
import e from"fs-extra";import t from"path";import{EventEmitter as r}from"events";import n,{homedir as i}from"os";import{Command as a}from"commander";import s from"inquirer";import{imageSize as o}from"image-size";import{URL as l}from"url";import E from"text-to-svg";import c from"sharp";import u from"crypto";import{v4 as I}from"uuid";import _ from"chalk";import p from"minimatch";import g from"globby";import S from"ejs";import d from"download-git-repo";import m from"rimraf";import A from"dayjs";import P from"util";import h from"axios";import{cloneDeep as f,merge as C,get as D,set as U,unset as T}from"lodash";import N from"heic-convert";import L from"mime-types";import R from"qiniu";import B from"md5";import M from"resolve";import{spawn as O}from"child_process";import y from"is-wsl";import w from"form-data";import G from"https";import b from"tunnel";import{JSONStore as x}from"@picgo/store";import $ from"cross-spawn";import W from"js-yaml";import{ObjectAdapter as v,I18n as H}from"@picgo/i18n";const F={handle:e=>{const t=e.cmd;t.program.command("install <plugins...>").description("install picgo plugin").alias("add").option("-p, --proxy <proxy>","Add proxy for installing").option("-r, --registry <registry>","Choose a registry for installing").action(((t,r)=>{const{proxy:n,registry:i}=r,a={proxy:n,registry:i};e.pluginHandler.install(t,a).catch((t=>{e.log.error(t)}))})),t.program.command("uninstall <plugins...>").alias("rm").description("uninstall picgo plugin").action((t=>{e.pluginHandler.uninstall(t).catch((t=>{e.log.error(t)}))})),t.program.command("update <plugins...>").description("update picgo plugin").option("-p, --proxy <proxy>","Add proxy for installing").option("-r, --registry <registry>","Choose a registry for installing").action(((t,r)=>{const{proxy:n,registry:i}=r,a={proxy:n,registry:i};e.pluginHandler.update(t,a).catch((t=>{e.log.error(t)}))}))}},K={handle:e=>{e.cmd.program.option("-c, --config <path>","set config path")}};function k(e){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";return Array.from({length:e}).map((()=>t.charAt(Math.floor(Math.random()*t.length)))).join("")}function q(e,r,n){const i={"{Y}":()=>(new Date).getFullYear().toString(),"{y}":()=>(new Date).getFullYear().toString().slice(2),"{m}":()=>1===((new Date).getMonth()+1).toString().length?`0${(new Date).getMonth()+1}`:((new Date).getMonth()+1).toString(),"{d}":()=>1===(new Date).getDate().toString().length?`0${(new Date).getDate()}`:(new Date).getDate().toString(),"{h}":()=>1===(new Date).getHours().toString().length?`0${(new Date).getHours()}`:(new Date).getHours().toString(),"{i}":()=>1===(new Date).getMinutes().toString().length?`0${(new Date).getMinutes()}`:(new Date).getMinutes().toString(),"{s}":()=>1===(new Date).getSeconds().toString().length?`0${(new Date).getSeconds()}`:(new Date).getSeconds().toString(),"{md5}":()=>u.createHash("md5").update(t.basename(e,t.extname(e))).digest("hex"),"{md5-16}":()=>u.createHash("md5").update(t.basename(e,t.extname(e))).digest("hex").slice(0,16),"{str-10}":()=>k(10),"{str-20}":()=>k(20),"{filename}":()=>n?t.basename(n,t.extname(n)):t.basename(e,t.extname(e)),"{uuid}":()=>I().replace(/-/g,""),"{timestamp}":()=>Math.floor(Date.now()/1e3).toString()};if(void 0===r||!Object.keys(i).some((e=>r.includes(e)))&&!r.includes("localFolder"))return e;const a=t.extname(e);let s=Object.keys(i).reduce(((e,t)=>e.replace(new RegExp(t,"g"),i[t]())),r)+a;return s=s.replace(/{(localFolder:?(\d+)?)}/gi,((r,n,i)=>{i=Math.max(1,i||0);return t.dirname(e).split(t.sep).slice(0-i).reduce(((e,t)=>`${e}/${t}`)).replace(/:/g,"")})),s}const j=e=>/^https?:\/\//.test(e),V=e=>{e=e||"";try{return e!==decodeURI(e)}catch(e){return!1}},Y=e=>(V(e)||(e=encodeURI(e)),e),z=e=>{try{const{width:t=0,height:r=0}=o(e);return{real:!0,width:t,height:r}}catch(e){return{real:!1,width:200,height:200}}},Q=async r=>{try{return{extname:t.extname(r),fileName:t.basename(r),buffer:await e.readFile(r),success:!0}}catch(e){return{reason:`read file ${r} error`,success:!1}}},X=async(e,r)=>{let n;e=Y(e);const i=new Promise(((i,a)=>{(async()=>{var a;try{const a=await r.request({method:"get",url:e,resolveWithFullResponse:!0,responseType:"arraybuffer"}).then((e=>e.data));clearTimeout(n);const s=new l(e).pathname;i({buffer:a,fileName:t.basename(s),extname:t.extname(s),success:!0})}catch(t){clearTimeout(n),i({success:!1,reason:`request ${e} error, ${null!==(a=null==t?void 0:t.message)&&void 0!==a?a:""}`})}})().catch(a)})),a=new Promise((t=>{n=setTimeout((()=>{t({success:!1,reason:`request ${e} timeout`})}),3e4)}));return Promise.race([i,a])},Z=e=>/^@[^/]+\/picgo-plugin-/.test(e)?"scope":e.startsWith("picgo-plugin-")?"normal":J(e)?"simple":"unknown",J=r=>{if(t.isAbsolute(r))return!1;const n=t.join(process.cwd(),r);return!e.existsSync(n)&&(!r.includes("/")&&!r.includes("\\"))},ee=(e,t="")=>t?`@${t}/picgo-plugin-${e}`:`picgo-plugin-${e}`,te=(r,n=console)=>{switch(Z(r)){case"normal":case"scope":return r;case"simple":return ee(r);default:{let i=r;return t.isAbsolute(r)&&e.existsSync(r)?ne(i):(i=t.join(process.cwd(),r),e.existsSync(i)?ne(i):(n.warn(`Can't find plugin ${r}`),""))}}},re=(r,n=console)=>{var i;switch(Z(r)){case"normal":return ie(r);case"scope":return ie(r,!0);case"simple":return ie(ee(r));default:{if(!e.existsSync(r))return n.warn(`Can't find plugin: ${r}`),"";const a=t.posix.join(r,"package.json");if(e.existsSync(a)){const t=e.readJSONSync(a)||{};return(null===(i=t.name)||void 0===i?void 0:i.includes("picgo-plugin-"))?t.name:(n.warn(`The plugin package.json's name filed is ${t.name||"empty"}, need to include the prefix: picgo-plugin-`),"")}return n.warn(`Can't find plugin: ${r}`),""}}},ne=e=>e.split(t.sep).join("/"),ie=(e,t=!1)=>{if(e.includes("@")){let r=/(.+\/)?(picgo-plugin-\w+)(@.+)*/;t&&(r=/(.+\/)?(^@[^/]+\/picgo-plugin-\w+)(@.+)*/);const n=e.match(r);return n?n[2]:(console.warn("can not remove plugin version"),e)}return e},ae=[],se=e=>ae.some((t=>e.startsWith(t))),oe=e=>"object"==typeof e&&!Array.isArray(e)&&Object.keys(e).length>0;function le(e){try{return JSON.parse(e)}catch(t){return e}}const Ee=(e=0)=>isNaN(Number(e))?0:Number(e),ce=()=>"development"===process.env.NODE_ENV;const ue=`${__dirname}/assets/piclist.png`;async function Ie(e,t,r,n,i,a,s,o,l,u,I){o=!o||o<0||o>1?.15:o;const _=c(e),{width:p=200}=await _.metadata(),g=await async function(e,t,r,n,i,a,s,o=200,l=0){let u;"image"===e?(s=s||ue,u=await c(s).toBuffer()):u=await async function(e,t,r,n){t=t||"测试",n=n||e;const i={anchor:"top",attributes:{fill:r=r||"rgba(204, 204, 204, 0.45)"}},a=E.loadSync(n).getSVG(t,i);return Buffer.from(a)}(t,r,a,n||t);const{width:I,height:_}=await async function(e){const{width:t,height:r}=await c(e).metadata();return{width:t||200,height:r||200}}(u),p=Math.floor(o*Ee(i)),g=Math.floor(p*_/I);return await c(u).resize(p,g,{fit:"inside"}).rotate(l,{background:{r:255,g:255,b:255,alpha:0}}).toBuffer()}(t,r,a,s,o,l,u,p,i);return await _.composite([{input:g,gravity:I||"southeast",tile:n}]).toBuffer()}const _e=(...e)=>e.every((e=>null!=e&&("string"==typeof e?""!==e:"number"==typeof e?e>0:"object"!=typeof e||Object.keys(e).length>0))),pe=["avif","dz","fits","gif","heif","input","jpeg","jpg","jp2","jxl","magick","openslide","pdf","png","ppm","raw","svg","tiff","tif","v","webp"],ge=["jpg","jpeg","png","gif","webp","bmp","tiff","tif","svg","ico","avif","heif","heic"];async function Se(e,t,r){try{let n=c(e);return _e(t.watermarkText)&&(n=c(await Ie(e,t.watermarkType||"text",r,t.isFullScreenWatermark,Ee(t.watermarkDegree),t.watermarkText,t.watermarkFontPath,Ee(t.watermarkScaleRatio),t.watermarkColor,t.watermarkImagePath,t.watermarkPosition))),await n.toBuffer()}catch(t){return console.log(t),e}}function de(e){return{quality:Ee(e.quality),isConvert:e.isConvert||!1,convertFormat:e.convertFormat||"jpg",isReSize:e.isReSize||!1,reSizeHeight:Ee(e.reSizeHeight),reSizeWidth:Ee(e.reSizeWidth),isReSizeByPercent:e.isReSizeByPercent||!1,reSizePercent:Ee(e.reSizePercent),isRotate:e.isRotate||!1,rotateDegree:Ee(e.rotateDegree),picBed:e.picBed||"smms"}}async function me(e,t,r){t=de(t);try{if(r=r.toLowerCase().replace(".",""),!ge.includes(r))return e;let i=c(e),a=100;if(_e(t.quality)&&t.quality<100&&(a=t.quality),t.isReSizeByPercent){if(_e(t.reSizePercent)){const e=await i.metadata().then((e=>e.width)),r=await i.metadata().then((e=>e.height));e&&r&&(i=i.resize(Math.round(e*t.reSizePercent/100),Math.round(r*t.reSizePercent/100),{fit:"inside"}))}}else t.isReSize&&_e(t.reSizeHeight,t.reSizeWidth)&&(i=i.resize(t.reSizeWidth,t.reSizeHeight,{fit:"inside"}));if(t.isRotate&&t.rotateDegree&&(i=i.rotate(t.rotateDegree,{background:{r:255,g:255,b:255,alpha:0}})),t.isConvert&&"gif"!==r){let e=t.convertFormat||"jpg";"imgur"===t.picBed&&"webp"===e&&(e="jpg"),i=i.toFormat(e,{quality:a})}else i=r&&(n=r,pe.includes(n))?i.toFormat(r,{quality:a}):i.toFormat("jpg",{quality:a});return await i.toBuffer()}catch(t){return console.log(t),e}var n}const Ae=["jpg","jpeg","png","gif","webp","bmp","tiff","tif","svg","ico","avif","heif","heic"],Pe=(e,t)=>(t=t.toLowerCase().replace(".",""),!!e&&!!e.isAddWatermark&&Ae.includes(t)),he=(e,t)=>{if(t=t.toLowerCase().replace(".",""),!Ae.includes(t))return!1;if(e){if(e=de(e),_e(e.quality)&&e.quality<100)return!0;if(e.isReSizeByPercent&&_e(e.reSizePercent))return!0;if(e.isReSize&&_e(e.reSizeHeight,e.reSizeWidth))return!0;if(e.isRotate&&e.rotateDegree)return!0;if(e.isConvert){return t!==(e.convertFormat||"jpg")}return!1}return!1},fe=async(e,t)=>(t=t.toLowerCase().replace(".",""),Ae.includes(t)?await c(e).toBuffer():e);var Ce=Object.freeze({__proto__:null,randomStringGenerator:k,renameFileNameWithTimestamp:function(e){return`${Math.floor(Date.now()/1e3)}${k(5)}${t.extname(e)}`},renameFileNameWithRandomString:function(e,r=5){return`${k(r)}${t.extname(e)}`},renameFileNameWithCustomString:q,isUrl:j,isUrlEncode:V,handleUrlEncode:Y,getImageSize:z,getFSFile:Q,getURLFile:X,getPluginNameType:Z,isSimpleName:J,handleStreamlinePluginName:e=>/^@[^/]+\/picgo-plugin-/.test(e)?e.replace(/^@[^/]+\/picgo-plugin-/,""):e.replace(/picgo-plugin-/,""),handleCompletePluginName:ee,getProcessPluginName:te,getNormalPluginName:re,handleUnixStylePath:ne,removePluginVersion:ie,configBlackList:ae,isConfigKeyInBlackList:se,isInputConfigValid:oe,safeParse:le,forceNumber:Ee,isDev:ce,isProd:()=>"production"===process.env.NODE_ENV,AddWatermark:Ie,imageAddWaterMark:Se,imageProcess:me,needAddWatermark:Pe,needCompress:he,removeExif:fe});const De={handle:r=>{r.cmd.program.command("upload").description("upload, go go go").arguments("[input...]").alias("u").action((n=>{(async()=>{const i=n.map((e=>j(e)?e:t.resolve(e))).filter((t=>{const n=e.existsSync(t)||j(t);return n||r.log.warn(`${t} does not exist.`),n}));await r.upload(i)})().catch((e=>{r.log.error(e)}))}))}};var Ue=e=>{const t=e.getConfig("buildIn.compress")||{};return[{name:"quality",type:"input",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_QUALITY")},required:!1,default:t.quality||100},{name:"isConvert",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISCONVERT")},required:!1,default:t.isConvert||!1},{name:"convertFormat",type:"list",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_CONVERTFORMAT")},required:!1,choices:["avif","dz","fits","gif","heif","input","jpeg","jpg","jp2","jxl","magick","openslide","pdf","png","ppm","raw","svg","tiff","tif","v","webp"],default:"jpg"},{name:"isReSize",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISRESIZE")},required:!1,default:t.isReSize||!1},{name:"reSizeWidth",type:"input",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_RESIZEWIDTH")},required:!1,default:t.reSizeWidth||500},{name:"reSizeHeight",type:"input",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_RESIZEHEIGHT")},required:!1,default:t.reSizeHeight||500},{name:"isReSizeByPercent",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISRESIZEBYPERCENT")},required:!1,default:t.isReSizeByPercent||!1},{name:"reSizePercent",type:"input",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_RESIZEPERCENT")},required:!1,default:t.reSizePercent||50},{name:"isRotate",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISROTATE")},required:!1,default:t.isRotate||!1},{name:"rotateDegree",type:"input",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ROTATEDEGREE")},required:!1,default:t.rotateDegree||90},{name:"isRemoveExif",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISREMOVEEXIF")},required:!1,default:t.isRemoveExif||!1}]};var Te=e=>{const t=e.getConfig("buildIn.watermark")||{};return[{name:"isAddWatermark",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_ISADDWATERMARK")},required:!1,default:t.isAddWatermark||!1},{name:"watermarkType",type:"list",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKTYPE")},required:!1,choices:["text","image"],default:t.watermarkType||"text"},{name:"isFullScreenWatermark",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_ISFULLSCREENWATERMARK")},required:!1,default:t.isFullScreenWatermark||!1},{name:"watermarkDegree",type:"input",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKDEGREE")},required:!1,default:t.watermarkDegree||0},{name:"watermarkText",type:"input",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKTEXT")},required:!1,default:t.watermarkText||""},{name:"watermarkFontPath",type:"input",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKTEXTFONTPATH")},required:!1,default:t.watermarkFontPath||""},{name:"watermarkScaleRatio",type:"input",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKFONTRATIO")},required:!1,default:t.watermarkScaleRatio||.15},{name:"watermarkColor",type:"input",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKFONTCOLOR")},required:!1,default:t.watermarkColor||"rgba(204, 204, 204, 0.45)"},{name:"watermarkImagePath",type:"input",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKIMAGEPATH")},required:!1,default:t.watermarkImagePath||""},{name:"watermarkPosition",type:"list",get alias(){return e.i18n.translate("BUILDIN_WATERMARK_WATERMARKPOSITION")},required:!1,choices:["north","northeast","southeast","south","southwest","northwest","west","east","center","centre"],default:t.watermarkPosition||"southeast"}]};var Ne=e=>{const t=e.getConfig("buildIn.rename")||{};return[{name:"format",type:"input",get alias(){return e.i18n.translate("BUILDIN_RENAME_FORMAT")},required:!1,default:t.format||"{filename}"},{name:"enable",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_RENAME_ENABLE")},required:!1,default:t.enable||!1}]};const Le=async(e,t,r,n)=>{const i=await e.cmd.inquirer.prompt(t),a="uploader"===r?`picBed.${n}`:"transformer"===r?`transformer.${n}`:"buildin"===r?`buildIn.${n}`:n;e.saveConfig({[a]:i}),"uploader"===r?e.saveConfig({"picBed.current":n,"picBed.uploader":n}):"transformer"===r&&e.saveConfig({"picBed.transformer":n})},Re={handle:e=>{e.cmd.program.command("set").alias("config").arguments("<module> [name]").description("configure config of picgo modules, uploader|transformer|plugin|buildin").action(((t,r)=>{(async()=>{var n,i;try{switch(t){case"buildin":if("compress"===r)await Le(e,Ue(e),t,r);else if("watermark"===r)await Le(e,Te(e),t,r);else if("rename"===r)await Le(e,Ne(e),t,r);else{const r=[{type:"list",name:"buildin",choices:["compress","watermark","rename"],message:"Choose a buildin module"}],n=await e.cmd.inquirer.prompt(r);"compress"===n.buildin?await Le(e,Ue(e),t,n.buildin):"watermark"===n.buildin?await Le(e,Te(e),t,n.buildin):"rename"===n.buildin&&await Le(e,Ne(e),t,n.buildin)}break;case"uploader":case"transformer":if(r){const n=e.helper[t].get(r);if(!n)return e.log.error(`No ${t} named ${r}`);n.config&&await Le(e,n.config(e),t,r)}else{const r=[{type:"list",name:`${t}`,choices:e.helper[t].getIdList(),message:`Choose a(n) ${t}`}],n=await e.cmd.inquirer.prompt(r),i=e.helper[t].get(n[t]);(null==i?void 0:i.config)&&await Le(e,i.config(e),t,n[t])}break;case"plugin":if(r){if(r.includes("picgo-plugin-")||(r=`picgo-plugin-${r}`),!Object.keys(e.getConfig("picgoPlugins")).includes(r))return e.log.error(`No plugin named ${r}`);(null===(n=e.pluginLoader.getPlugin(r))||void 0===n?void 0:n.config)&&await Le(e,e.pluginLoader.getPlugin(r).config(e),"plugin",r)}else{const t=[{type:"list",name:"plugin",choices:e.pluginLoader.getFullList(),message:"Choose a plugin"}],r=await e.cmd.inquirer.prompt(t);(null===(i=e.pluginLoader.getPlugin(r.plugin))||void 0===i?void 0:i.config)&&await Le(e,e.pluginLoader.getPlugin(r.plugin).config(e),"plugin",r.plugin)}break;default:return e.log.warn(`No module named ${t}`),e.log.warn("Available modules are uploader|transformer|plugin|buildin")}e.log.success("Configure config successfully!"),"plugin"===t&&e.log.info("If you want to use this config, please run 'picgo use plugins'")}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))}))}},Be={handle:async e=>{const t=e.cmd;t.program.command("use").arguments("[module]").description("use modules of picgo").action((r=>{(async()=>{try{let n=[];const i={uploader:{type:"list",name:"uploader",message:"Use an uploader",choices:e.helper.uploader.getIdList(),default:e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||"smms"},transformer:{type:"list",name:"transformer",message:"Use a transformer",choices:e.helper.transformer.getIdList(),default:e.getConfig("picBed.transformer")||"path"},plugins:{type:"checkbox",name:"plugins",message:"Use plugins",choices:e.pluginLoader.getFullList(),default:Object.keys(e.getConfig("picgoPlugins")).filter((t=>e.getConfig(`picgoPlugins.${t}`)))}};if(r){if(!i[r])return e.log.warn(`No module named ${r}`),e.log.warn("Available modules are uploader|transformer|plugins");n.push(i[r])}else n=Object.keys(i).map((e=>i[e]));const a=await t.inquirer.prompt(n);if(a.plugins){const t=e.getConfig("picgoPlugins");Object.keys(t).map((e=>{a.plugins.includes(e)?t[e]=!0:t[e]=!1})),e.saveConfig({picgoPlugins:t})}e.saveConfig({"picBed.current":a.uploader||e.getConfig("picBed.current"),"picBed.uploader":a.uploader||e.getConfig("picBed.current"),"picBed.transformer":a.transformer||"path"}),e.log.success("Configure config successfully!")}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))}))}},Me={handle:e=>{e.cmd.program.option("-p, --proxy <url>","set proxy for uploading",(t=>{e.setConfig({"picBed.proxy":t})}))}},Oe=async(e,r)=>{try{const n=we(r.tmp),i=t.join(r.tmp,"template");let a={};n.prompts&&n.prompts.length>0&&(a=await e.cmd.inquirer.prompt(n.prompts));let s=await g(["**/*"],{cwd:i,dot:!0});if(s=s.filter((t=>{let r="";return Object.keys(n.filters).forEach((e=>{p(t,e,{dot:!0})&&(r=t)})),!r||ye(e,n.filters[r],a)})),0===s.length)return e.log.warn("Template files not found!");const o=Ge(s,i,a);be(r.dest,o),"function"==typeof n.complete&&n.complete({answers:a,options:r,files:s,ctx:e}),n.completeMessage&&e.log.success(n.completeMessage),e.log.success("Done!")}catch(t){return e.log.error(t)}},ye=(e,t,r)=>{const n=new Function("data","with (data) { return "+t+"}");try{return n(r)}catch(r){return e.log.error(`Error when evaluating filter condition: ${JSON.stringify(t)}`),!1}},we=r=>{const n=t.join(r,"index.js");if(e.existsSync(n)){return require(n)}return{}},Ge=(r,n,i)=>{const a={};return r.forEach((r=>{const s=e.readFileSync(t.join(n,r),"utf8"),o=S.render(s,i);(Buffer.isBuffer(o)||/[^\s]/.test(o))&&(a[r]=o)})),a},be=(r,n)=>{Object.keys(n).forEach((i=>{const a=t.join(r,i);e.ensureDirSync(t.dirname(a)),e.writeFileSync(a,n[i])}))},xe=(t,r)=>{r.offline?e.existsSync(r.template)?Oe(t,r).catch((e=>{t.log.error(e)})):t.log.error(`Local template ${r.template} not found`):(r.template=r.hasSlash?r.template:"PicGo/picgo-template-"+r.template,$e(t,r))},$e=(t,r)=>{e.existsSync(r.tmp)&&m.sync(r.tmp),t.log.info("Template files are downloading..."),d(r.template,r.tmp,{clone:r.clone},(e=>{if(e)return t.log.error(e);t.log.success("Template files are downloaded!"),Oe(t,r).catch((e=>{t.log.error(e)}))}))},We={handle:async r=>{r.cmd.program.command("init").arguments("<template> [project]").option("--clone","use git clone").option("--offline","use cached template").description("create picgo plugin's development templates").action(((n,a,s)=>{(async()=>{try{const o=n.includes("/"),l=!a||"."===a,E=t.resolve(a||"."),c=s.clone||!1,u=s.offline||!1,I=t.join(i(),".picgo/templates",n.replace(/[/:]/g,"-"));s.offline&&(n=I);const _={template:n,project:a,hasSlash:o,inPlace:l,dest:E,clone:c,tmp:I,offline:u};l||e.existsSync(E)?await r.cmd.inquirer.prompt([{type:"confirm",message:l?"Generate project in current directory?":"Target directory exists. Continue?",name:"ok"}]).then((e=>{e.ok&&xe(r,_)})):xe(r,_)}catch(e){if(r.log.error(e),process.argv.includes("--debug"))throw e}})().catch((e=>{r.log.error(e)}))})).on("--help",(()=>{console.log(),console.log("Examples:"),console.log(),console.log(_.gray(" # create a new project with an official template")),console.log(" $ picgo init plugin my-project"),console.log(),console.log(_.gray(" # create a new project straight from a github template")),console.log(" $ picgo init username/repo my-project"),console.log()}))}},ve={handle:e=>{e.cmd.program.command("i18n").arguments("[lang]").description("change picgo language").action((async(t="")=>{const r=e.i18n.getLanguageList();if(!t){const t=[{type:"list",name:"i18n",choices:r,message:"Choose a language",default:e.getConfig("settings.language")||"zh-CN"}],n=await e.cmd.inquirer.prompt(t);return e.i18n.setLanguage(n.i18n),void e.log.success(`Language set to ${n.i18n}`)}if(!r.includes(t))return e.log.warn("No such language");e.i18n.setLanguage(t),e.log.success(`Language set to ${t}`)}))}};class He{constructor(e){this.name=e,this.list=new Map,this.pluginIdMap=new Map}register(e,t){var r;if(!e)throw new TypeError("id is required!");if("function"!=typeof t.handle)throw new TypeError("plugin.handle must be a function!");if(this.list.has(e))throw new TypeError(`${this.name} duplicate id: ${e}!`);this.list.set(e,t),He.currentPlugin&&(this.pluginIdMap.has(He.currentPlugin)?null===(r=this.pluginIdMap.get(He.currentPlugin))||void 0===r||r.push(e):this.pluginIdMap.set(He.currentPlugin,[e]))}unregister(e){if(this.pluginIdMap.has(e)){const t=this.pluginIdMap.get(e);null==t||t.forEach((e=>{this.list.delete(e)}))}}getName(){return this.name}get(e){return this.list.get(e)}getList(){return[...this.list.values()]}getIdList(){return[...this.list.keys()]}}const Fe=(e=null)=>{He.currentPlugin=e};class Ke{constructor(e){this.name="commander",this.list=new Map,this.pluginIdMap=new Map,this.program=new a,this.inquirer=s,this.ctx=e}getName(){return this.name}init(){var e;this.program.version("0.6.9","-v, --version").option("-d, --debug","debug mode",(()=>{this.ctx.setConfig({debug:!0})})).option("-s, --silent","silent mode",(()=>{this.ctx.setConfig({silent:!0})})).on("command:*",(()=>{this.ctx.log.error(`Invalid command: ${this.program.args.join(" ")}\nSee --help for a list of available commands.`),process.exit(1)})),(e=this.ctx).cmd.register("pluginHandler",F),e.cmd.register("config",K),e.cmd.register("setting",Re),e.cmd.register("upload",De),e.cmd.register("use",Be),e.cmd.register("proxy",Me),e.cmd.register("init",We),e.cmd.register("i18n",ve)}register(e,t){var r;if(!e)throw new TypeError("name is required!");if("function"!=typeof t.handle)throw new TypeError("plugin.handle must be a function!");if(this.list.has(e))throw new TypeError(`${this.name} plugin duplicate id: ${e}!`);this.list.set(e,t);const n=He.currentPlugin;null!==n&&(this.pluginIdMap.has(n)?null===(r=this.pluginIdMap.get(n))||void 0===r||r.push(e):this.pluginIdMap.set(n,[e]))}unregister(e){if(this.pluginIdMap.has(e)){const t=this.pluginIdMap.get(e);null==t||t.forEach((e=>{this.list.delete(e)}))}}loadCommands(){this.getList().forEach((e=>{try{e.handle(this.ctx)}catch(e){this.ctx.log.error(e)}}))}get(e){return this.list.get(e)}getList(){return[...this.list.values()]}getIdList(){return[...this.list.keys()]}}var ke,qe,je;!function(e){e.success="success",e.info="info",e.warn="warn",e.error="error"}(ke||(ke={})),function(e){e.UPLOAD_PROGRESS="uploadProgress",e.FAILED="failed",e.BEFORE_TRANSFORM="beforeTransform",e.BEFORE_UPLOAD="beforeUpload",e.AFTER_UPLOAD="afterUpload",e.FINISHED="finished",e.INSTALL="install",e.UNINSTALL="uninstall",e.UPDATE="update",e.NOTIFICATION="notification"}(qe||(qe={})),function(e){e.CONFIG_CHANGE="CONFIG_CHANGE"}(je||(je={}));class Ve{constructor(e){this.level={[ke.success]:"green",[ke.info]:"blue",[ke.warn]:"yellow",[ke.error]:"red"},this.ctx=e}handleLog(e,...r){if(!this.ctx.getConfig("silent")){const n=_[this.level[e]](`[PicList ${e.toUpperCase()}]:`);console.log(n,...r),this.logLevel=this.ctx.getConfig("settings.logLevel"),this.logPath=this.ctx.getConfig("settings.logPath")||t.join(this.ctx.baseDir,"./piclist.log"),setTimeout((()=>{try{const t=this.checkLogFileIsLarge(this.logPath);if(t.isLarge){const e=`Log file is too large (> ${t.logFileSizeLimit/1024/1024||"10"} MB), recreate log file`;console.log(_.yellow("[PicList WARN]:"),e),this.recreateLogFile(this.logPath),r.unshift(e)}this.handleWriteLog(this.logPath,e,...r)}catch(e){console.error("[PicList Error] on checking log file size",e)}}),0)}}checkLogFileIsLarge(t){if(e.existsSync(t)){const r=e.statSync(t).size,n=1024*Ee(this.ctx.getConfig("settings.logFileSizeLimit")||10)*1024;return{isLarge:r>n,logFileSize:r,logFileSizeLimit:n}}return{isLarge:!1}}recreateLogFile(t){e.existsSync(t)&&(e.unlinkSync(t),e.createFileSync(t))}handleWriteLog(t,r,...n){try{if(this.checkLogLevel(r,this.logLevel)){let i=`${A().format("YYYY-MM-DD HH:mm:ss")} [PicList ${r.toUpperCase()}] `;n.forEach((e=>{e instanceof Error&&"error"===r?i+=`\n------Error Stack Begin------\n${P.format(null==e?void 0:e.stack)}\n-------Error Stack End------- `:("object"==typeof e&&(e=JSON.stringify(e,null,2)),i+=`${e} `)})),i+="\n",e.appendFileSync(t,i)}}catch(e){console.error("[PicList Error] on writing log file",e)}}checkLogLevel(e,t){return void 0===t||"all"===t||(Array.isArray(t)?t.some((t=>t===e||"all"===t)):e===t)}success(...e){return this.handleLog(ke.success,...e)}info(...e){return this.handleLog(ke.info,...e)}error(...e){return this.handleLog(ke.error,...e)}warn(...e){return this.handleLog(ke.warn,...e)}debug(...e){ce()&&this.handleLog(ke.info,...e)}}class Ye extends r{constructor(r){super(),this.ttfLink="https://release.piclist.cn/simhei.ttf",this.ctx=r;const n=t.join(r.baseDir,"piclistTemp");e.emptyDirSync(n),this.ttfPath=t.join(r.baseDir,"assets","simhei.ttf")}async downloadTTF(){const r=t.dirname(this.ttfPath);if(e.existsSync(r)||e.mkdirSync(r,{recursive:!0}),e.existsSync(this.ttfPath))return!0;this.ctx.log.info("Download ttf file.");try{const t=await h.get(this.ttfLink,{responseType:"arraybuffer"});return e.writeFileSync(this.ttfPath,t.data),this.ctx.log.info("Download ttf file success."),!0}catch(e){return this.ctx.log.error("Download ttf file failed."),!1}}async start(r){const n=(e=>({configPath:e.configPath,baseDir:e.baseDir,log:e.log,cmd:e.cmd,output:[],input:[],rawInput:[],pluginLoader:e.pluginLoader,pluginHandler:e.pluginHandler,Request:e.Request,helper:e.helper,VERSION:e.VERSION,GUI_VERSION:e.GUI_VERSION,request:e.request,i18n:e.i18n,getConfig:e.getConfig.bind(e),saveConfig:e.saveConfig.bind(e),removeConfig:e.removeConfig.bind(e),setConfig:e.setConfig.bind(e),unsetConfig:e.unsetConfig.bind(e),upload:e.upload.bind(e),addListener:e.addListener.bind(e),on:e.on.bind(e),once:e.once.bind(e),removeListener:e.removeListener.bind(e),off:e.off.bind(e),removeAllListeners:e.removeAllListeners.bind(e),setMaxListeners:e.setMaxListeners.bind(e),getMaxListeners:e.getMaxListeners.bind(e),listeners:e.listeners.bind(e),rawListeners:e.rawListeners.bind(e),emit:e.emit.bind(e),listenerCount:e.listenerCount.bind(e),prependListener:e.prependListener.bind(e),prependOnceListener:e.prependOnceListener.bind(e),eventNames:e.eventNames.bind(e)}))(this.ctx);try{if(!Array.isArray(r))throw new Error("Input must be an array.");n.input=r,n.rawInputPath=[],n.rawInput=f(r),n.output=[];const i=n.getConfig("buildIn.compress"),a=n.getConfig("picBed.uploader")||n.getConfig("picBed.current")||"smms",s=n.helper.uploader.get(a);i.picBed=s?a:"smms";const o=n.getConfig("buildIn.watermark");if(i||o){const r=t.join(n.baseDir,"piclistTemp");e.existsSync(r)||e.mkdirSync(r);const a="Add watermark to image",s="Compress or convert image";await Promise.allSettled(n.input.map((async(l,E)=>{var c,u,I,_,p,g,S;let d;if(j(l)){if(n.rawInputPath[E]=l,d=await X(l,n),!d.success||!d.buffer)throw new Error(d.reason);{let S;if(Pe(o,null!==(c=d.extname)&&void 0!==c?c:"")){await this.downloadTTF()?(n.log.info(a),S=await Se(d.buffer,o,this.ttfPath)):this.ctx.log.warn("Download ttf file failed, skip add watermark.")}if(he(i,null!==(u=d.extname)&&void 0!==u?u:"")&&(n.log.info(s),S=await me(null!=S?S:d.buffer,i,null!==(I=d.extname)&&void 0!==I?I:"")),!S&&(null==i?void 0:i.isRemoveExif)&&(n.log.info("Remove exif info."),S=await fe(d.buffer,null!==(_=d.extname)&&void 0!==_?_:"")),S){let a;a=(null==i?void 0:i.isConvert)?null!==(p=null==i?void 0:i.convertFormat)&&void 0!==p?p:"jpg":null!==(g=d.extname)&&void 0!==g?g:"",a=a.startsWith(".")?a:`.${a}`;const s=t.join(r,`${d.fileName?`${t.basename(d.fileName,t.extname(d.fileName))}${a}`:(new Date).getTime()}${a}`);n.rawInputPath[E]=t.join(t.dirname(l),t.basename(s)),e.writeFileSync(s,S),n.input[E]=s}}}else{let c;if(n.rawInputPath[E]=l,Pe(o,t.extname(l))){await this.downloadTTF()?(n.log.info(a),c=await Se(e.readFileSync(l),o,this.ttfPath)):this.ctx.log.warn("Download ttf file failed, skip add watermark.")}if(he(i,t.extname(l)))if(n.log.info(s),".heic"===t.extname(l)||".heif"===t.extname(l)){const n=e.readFileSync(l),a=await N({buffer:n,format:"JPEG",quality:1}),s=t.join(r,`${t.basename(l,t.extname(l))}.jpg`);e.writeFileSync(s,Buffer.from(a)),c=await me(e.readFileSync(s),i,".jpg")}else c=await me(null!=c?c:e.readFileSync(l),i,t.extname(l));if(!c&&(null==i?void 0:i.isRemoveExif)&&(n.log.info("Remove exif info."),c=await fe(e.readFileSync(l),t.extname(l))),c){let a;a=(null==i?void 0:i.isConvert)?null!==(S=null==i?void 0:i.convertFormat)&&void 0!==S?S:"jpg":t.extname(l),a=a.startsWith(".")?a:`.${a}`;const s=t.join(r,`${t.basename(l,t.extname(l))}${a}`);n.rawInputPath[E]=t.join(t.dirname(l),`${t.basename(l,t.extname(l))}${a}`),e.writeFileSync(s,c),n.input[E]=s}}})))}else for(const e of n.input)n.rawInputPath.push(e);await this.beforeTransform(n),await this.doTransform(n);const l=n.getConfig("buildIn.rename")||{};if(l.enable){const e=l.format||"{filename}";n.output=n.output.map(((t,r)=>{let i=t.fileName;return e&&(i=q(n.rawInputPath[r],e),i=i.replace(/\/+/g,"/"),"/"===i.slice(-1)&&(i+=r.toString())),t.fileName=i,t}))}return await this.beforeUpload(n),await this.doUpload(n),n.input=n.rawInput,await this.afterUpload(n),n}catch(e){if(n.log.warn(qe.FAILED),n.emit(qe.UPLOAD_PROGRESS,-1),n.emit(qe.FAILED,e),n.log.error(e),n.getConfig("debug"))throw e;return n}}async beforeTransform(e){return e.emit(qe.UPLOAD_PROGRESS,0),e.emit(qe.BEFORE_TRANSFORM,e),e.log.info("Before transform"),await this.handlePlugins(e.helper.beforeTransformPlugins,e),e}async doTransform(e){e.emit(qe.UPLOAD_PROGRESS,30);const t=e.getConfig("picBed.transformer")||"path";let r=t,n=e.helper.transformer.get(t);return n||(n=e.helper.transformer.get("path"),r="path",e.log.warn(`Can't find transformer - ${t}, switch to default transformer - path`)),e.log.info(`Transforming... Current transformer is [${r}]`),await(null==n?void 0:n.handle(e)),e}async beforeUpload(e){return e.emit(qe.UPLOAD_PROGRESS,60),e.log.info("Before upload"),e.emit(qe.BEFORE_UPLOAD,e),await this.handlePlugins(e.helper.beforeUploadPlugins,e),e}async doUpload(e){let t=e.getConfig("picBed.uploader")||e.getConfig("picBed.current")||"smms",r=e.helper.uploader.get(t),n=t;r||(t="smms",n="smms",r=e.helper.uploader.get("smms"),e.log.warn(`Can't find uploader - ${t}, switch to default uploader - smms`)),e.log.info(`Uploading... Current uploader is [${n}]`),await(null==r?void 0:r.handle(e));for(const r of e.output)r.type=t;return e}async afterUpload(e){e.emit(qe.AFTER_UPLOAD,e),e.emit(qe.UPLOAD_PROGRESS,100),await this.handlePlugins(e.helper.afterUploadPlugins,e);let t="";const r=e.output.length,n=!0===e.getConfig("settings.encodeOutputURL");for(let i=0;i<r;i++)void 0!==e.output[i].imgUrl&&(t+=n?Y(e.output[i].imgUrl):e.output[i].imgUrl,i!==r-1&&(t+="\n")),delete e.output[i].base64Image,delete e.output[i].buffer;return e.emit(qe.FINISHED,e),e.log.success(`\n${t}`),e}async handlePlugins(e,t){const r=e.getList(),n=e.getIdList(),i=e.getName();return await Promise.all(r.map((async(e,r)=>{try{t.log.info(`${i}: ${n[r]} running`),await e.handle(t)}catch(e){throw t.log.error(`${i}: ${n[r]} error`),e}}))),t}}const ze=(e,t,r,n="")=>({method:"POST",url:`https://${n||"sm.ms"}/api/v2/upload`,headers:{contentType:"multipart/form-data","User-Agent":"PicList",Authorization:r},formData:{smfile:{value:t,options:{filename:e}},ssl:"true"}}),Qe=async e=>{const t=e.getConfig("picBed.smms");if(!t)throw new Error("Can not find smms config!");const r=e.output;for(const n of r)if(n.fileName&&n.buffer){let r=n.buffer;!r&&n.base64Image&&(r=Buffer.from(n.base64Image,"base64"));const i=ze(n.fileName,r,null==t?void 0:t.token,null==t?void 0:t.backupDomain);try{const t=await e.request(i),r=JSON.parse(t);if("success"===r.code)delete n.base64Image,delete n.buffer,n.imgUrl=r.data.url,n.hash=r.data.hash;else{if("image_repeated"!==r.code||"string"!=typeof r.images)throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:r.message}),new Error(r.message);delete n.base64Image,delete n.buffer,n.imgUrl=r.images}}catch(t){throw e.log.error(t),t}}return e},Xe=e=>{const t=e.getConfig("picBed.smms")||{};return[{name:"token",message:"api token",type:"password",get alias(){return e.i18n.translate("PICBED_SMMS_TOKEN")},default:t.token||"",required:!0},{name:"backupDomain",type:"input",get prefix(){return e.i18n.translate("PICBED_SMMS_BACKUP_DOMAIN")},get message(){return e.i18n.translate("PICBED_SMMS_MESSAGE_BACKUP_DOMAIN")},get alias(){return e.i18n.translate("PICBED_SMMS_BACKUP_DOMAIN")},default:t.backupDomain||"",required:!1}]};const Ze=(e,t)=>{const r=e.secretId,n=e.secretKey,i=e.appId,a=e.bucket;let s,o="";if(e.version&&"v4"!==e.version){const r=Math.floor((new Date).getTime()/1e3);o=`${r};${r+86400}`;const i=u.createHmac("sha1",n).update(o).digest("hex"),a=`put\n/${e.path}${t}\n\nhost=${e.bucket}.cos.${e.area}.myqcloud.com\n`,l=`sha1\n${o}\n${u.createHash("sha1").update(a).digest("hex")}\n`;s=u.createHmac("sha1",i).update(l).digest("hex")}else{const e=Math.floor(1e10*Math.random()),t=Math.floor((new Date).getTime()/1e3)-1,o=`a=${i}&b=${a}&k=${r}&e=${t+3600}&t=${t}&r=${e}&f=`,l=u.createHmac("sha1",n).update(o).digest(),E=Buffer.concat([l,Buffer.from(o)]);s=Buffer.from(E).toString("base64")}return{signature:s,appId:i,bucket:a,signTime:o}},Je=(e,t,r,n,i)=>{const a=e.area,s=e.path;return e.version&&"v4"!==e.version?{method:"PUT",url:`http://${e.bucket}.cos.${e.area}.myqcloud.com/${encodeURIComponent(s)}${encodeURIComponent(t)}`,headers:{Host:`${e.bucket}.cos.${e.area}.myqcloud.com`,Authorization:`q-sign-algorithm=sha1&q-ak=${e.secretId}&q-sign-time=${r.signTime}&q-key-time=${r.signTime}&q-header-list=host&q-url-param-list=&q-signature=${r.signature}`,contentType:L.lookup(t)||"application/octet-stream","User-Agent":`PicGo;${i};null;null`},body:n,resolveWithFullResponse:!0}:{method:"POST",url:`http://${a}.file.myqcloud.com/files/v2/${r.appId}/${r.bucket}/${encodeURI(s)}${t}`,headers:{Host:`${a}.file.myqcloud.com`,Authorization:r.signature,contentType:"multipart/form-data","User-Agent":`PicGo;${i};null;null`},formData:{op:"upload",filecontent:n},resolveWithFullResponse:!0}},et=async e=>{var t,r,n;const i=e.getConfig("picBed.tcyun");if(!i)throw new Error("Can't find tencent COS config");try{const a=e.output,s=i.customUrl,o=i.path,l=!i.version||"v4"===i.version;for(const E of a)if(E.fileName&&E.buffer){const a=Ze(i,E.fileName);if(!a)return!1;let c=E.buffer;!c&&E.base64Image&&(c=Buffer.from(E.base64Image,"base64"));const u=Je(i,E.fileName,a,c,e.GUI_VERSION||e.VERSION),I=await e.request(u).then((e=>e)).catch((t=>({statusCode:400,body:{msg:e.i18n.translate("AUTH_FAILED"),err:t}})));let _;if(_=l&&"string"==typeof I?JSON.parse(I):I,400===_.statusCode)throw(null===(t=null==_?void 0:_.body)||void 0===t?void 0:t.err)?_.body.err:new Error((null===(r=null==_?void 0:_.body)||void 0===r?void 0:r.msg)||(null===(n=null==_?void 0:_.body)||void 0===n?void 0:n.message));const p=i.options||"";if(l&&"SUCCESS"===_.message)delete E.base64Image,delete E.buffer,E.imgUrl=s?`${s}/${o}${E.fileName}`:`${_.data.source_url}${p}`;else{if(l||!_||200!==_.statusCode)throw new Error(I.body.msg);delete E.base64Image,delete E.buffer,E.imgUrl=s?`${s}/${encodeURIComponent(o)}${encodeURIComponent(E.fileName)}${p}`.replace(/%2F/g,"/"):`https://${i.bucket}.cos.${i.area}.myqcloud.com/${encodeURIComponent(o)}${encodeURIComponent(E.fileName)}${p}`.replace(/%2F/g,"/")}}return e}catch(t){if(!i.version||"v4"===i.version)try{const r=JSON.parse(t.error);e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:r.code}),text:"https://cloud.tencent.com/document/product/436/8432"})}catch(e){}throw t}},tt=e=>{const t=e.getConfig("picBed.tcyun")||{};return[{name:"version",type:"list",alias:e.i18n.translate("PICBED_TENCENTCLOUD_VERSION"),choices:["v4","v5"],default:"v5",required:!1},{name:"secretId",type:"input",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SECRETID")},default:t.secretId||"",required:!0},{name:"secretKey",type:"password",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SECRETKEY")},default:t.secretKey||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_BUCKET")},default:t.bucket||"",required:!0},{name:"appId",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_APPID")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_APPID")},default:t.appId||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_APPID")},required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_AREA")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_AREA")},default:t.area||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_AREA")},required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_PATH")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_PATH")},default:t.path||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_PATH")},required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_CUSTOMURL")},default:t.customUrl||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL")},required:!1},{name:"options",type:"input",default:t.options||"",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_OPTIONS")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_OPTIONS")},get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_OPTIONS")},required:!1}]};const rt=(e,t,r)=>{const n=t.path||"",{token:i,repo:a}=t;return{method:"PUT",url:`https://api.github.com/repos/${a}/contents/${encodeURI(n)}${encodeURIComponent(e)}`.replace(/%2F/g,"/"),headers:{Authorization:`token ${i}`,"User-Agent":"PicList","Content-Type":L.lookup(e)||"application/octet-stream"},body:r,json:!0}},nt=(e,t)=>{const r=t.path||"",{token:n,repo:i,branch:a}=t;return{method:"GET",url:`https://api.github.com/repos/${i}/contents/${encodeURI(r)}${encodeURIComponent(e)}?ref=${a}`.replace(/%2F/g,"/"),headers:{Authorization:`token ${n}`,"User-Agent":"PicGo"},json:!0}},it=async e=>{const t=e.getConfig("picBed.github");if(!t)throw new Error("Can't find github config");try{const r=e.output;for(const n of r)if(n.fileName&&n.buffer){const r=n.base64Image||Buffer.from(n.buffer).toString("base64"),i={message:"Upload by PicList",branch:t.branch,content:r,path:t.path+encodeURI(n.fileName)},a=rt(n.fileName,t,i);try{const r=await e.request(a);if(!r)throw new Error("Server error, please try again");delete n.base64Image,delete n.buffer,t.customUrl?n.imgUrl=`${t.customUrl}/${encodeURIComponent(t.path)}${encodeURIComponent(n.fileName)}`.replace(/%2F/g,"/"):n.imgUrl=r.content.download_url,n.hash=r.content.sha}catch(r){if(422!==r.statusCode)throw r;{delete n.base64Image,delete n.buffer;const r=await e.request(nt(n.fileName,t));if(!Object.keys(r).length)throw new Error("Get Contents error, please try again");n.hash=r.sha,t.customUrl?n.imgUrl=`${t.customUrl}/${encodeURIComponent(t.path)}${encodeURIComponent(n.fileName)}`.replace(/%2F/g,"/"):n.imgUrl=r.download_url}}}return e}catch(t){throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK")}),t}},at=e=>{const t=e.getConfig("picBed.github")||{};return[{name:"repo",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_REPO")},get alias(){return e.i18n.translate("PICBED_GITHUB_REPO")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_REPO")},default:t.repo||"",required:!0},{name:"branch",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_BRANCH")},get alias(){return e.i18n.translate("PICBED_GITHUB_BRANCH")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_BRANCH")},default:t.branch||"master",required:!0},{name:"token",type:"password",get alias(){return e.i18n.translate("PICBED_GITHUB_TOKEN")},default:t.token||"",required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_PATH")},get alias(){return e.i18n.translate("PICBED_GITHUB_PATH")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_PATH")},default:t.path||"",required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_GITHUB_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_GITHUB_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_GITHUB_MESSAGE_CUSTOMURL")},default:t.customUrl||"",required:!1}]};function st(e,t,r,n){const i=function(e){return"z0"===e?"":"-"+e}(e.area||"z0"),a=e.path||"";return{method:"POST",url:`http://upload${i}.qiniup.com/putb64/-1/key/${Buffer.from(a+t,"utf-8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_")}`,headers:{Authorization:`UpToken ${r}`,"Content-Type":L.lookup(t)||"application/octet-stream"},body:n}}function ot(e){const t=e.accessKey,r=e.secretKey,n=new R.auth.digest.Mac(t,r),i={scope:e.bucket};return new R.rs.PutPolicy(i).uploadToken(n)}const lt=async e=>{const t=e.getConfig("picBed.qiniu");if(!t)throw new Error("Can't find qiniu config");try{const r=e.output;for(const n of r)if(n.fileName&&n.buffer){const r=n.base64Image||Buffer.from(n.buffer).toString("base64"),i=st(t,n.fileName,ot(t),r),a=await e.request(i),s=JSON.parse(a);if(!(null==s?void 0:s.key))throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:s.msg}),e.log.error("qiniu error",s),new Error("Upload failed");{delete n.base64Image,delete n.buffer;const e=t.url,r=t.options;n.imgUrl=`${e}/${s.key}${r}`}}return e}catch(t){if("Upload failed"!==t.message&&t.response){const r=t.response.body;e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:r.error})}throw t}},Et=e=>{const t=e.getConfig("picBed.qiniu")||{};return[{name:"accessKey",type:"input",get alias(){return e.i18n.translate("PICBED_QINIU_ACCESSKEY")},default:t.accessKey||"",required:!0},{name:"secretKey",type:"password",get alias(){return e.i18n.translate("PICBED_QINIU_SECRETKEY")},default:t.secretKey||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_QINIU_BUCKET")},default:t.bucket||"",required:!0},{name:"url",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_URL")},get alias(){return e.i18n.translate("PICBED_QINIU_URL")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_URL")},default:t.url||"",required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_AREA")},get alias(){return e.i18n.translate("PICBED_QINIU_AREA")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_AREA")},default:t.area||"",required:!0},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_OPTIONS")},get alias(){return e.i18n.translate("PICBED_QINIU_OPTIONS")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_OPTIONS")},default:t.options||"",required:!1},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_QINIU_PATH")},get alias(){return e.i18n.translate("PICBED_QINIU_PATH")},get message(){return e.i18n.translate("PICBED_QINIU_MESSAGE_PATH")},default:t.path||"",required:!1}]};const ct=async(e,t,r,n)=>{const i=t.clientId||"",a=t.username||"",s=(e=>e?e.startsWith("Bearer")?e:`Bearer ${e}`:"")(t.accessToken||""),o=t.album||"";let l;if(a&&s)l=s;else{if(!i)throw new Error("clientId or accessToken is required");l=`Client-ID ${i}`}const E={method:"POST",url:"https://api.imgur.com/3/image",headers:{Authorization:l,"content-type":"multipart/form-data",Host:"api.imgur.com","User-Agent":"PicList"},formData:{image:n,type:"base64",name:r,description:"Uploaded with PicList"}};if(a&&s&&o){let r,n=0,i="";do{const s={method:"GET",url:`https://api.imgur.com/3/account/${a}/albums/${n}`,headers:{Authorization:l},json:!0,resolveWithFullResponse:!0,timeout:1e4};if(t.proxy&&(s.proxy=t.proxy),r=await e.request(s),200!==r.statusCode||!r.body.success)throw new Error("Server error, please try again");const E=r.body.data;for(const e of E)if(e.title===o){i=e.id;break}n++}while(r.body.data.length>0);i&&E.formData&&(E.formData.album=i)}return t.proxy&&(E.proxy=t.proxy),E},ut=async e=>{var t;const r=e.getConfig("picBed.imgur");if(!r)throw new Error("Can't find imgur config");try{const t=e.output;for(const n of t)if(n.fileName&&n.buffer){const t=n.base64Image||Buffer.from(n.buffer).toString("base64"),i=await ct(e,r,n.fileName,t),a=await e.request(i),s="string"==typeof a?JSON.parse(a):a;if(!s.success)throw new Error("Server error, please try again");delete n.base64Image,delete n.buffer,n.imgUrl=s.data.link,n.hash=s.data.deletehash}return e}catch(r){throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK"),text:"http://docs.imgur.com/api/errno/"}),(null===(t=null==r?void 0:r.response)||void 0===t?void 0:t.data)||r}},It=e=>{const t=e.getConfig("picBed.imgur")||{};return[{name:"clientId",type:"input",get prefix(){return e.i18n.translate("PICBED_IMGUR_CLIENTID")},get alias(){return e.i18n.translate("PICBED_IMGUR_CLIENTID")},get message(){return e.i18n.translate("PICBED_IMGUR_MESSAGE_CLIENTID")},default:t.clientId||"",required:!1},{name:"username",type:"input",get prefix(){return e.i18n.translate("PICBED_IMGUR_USERNAME")},get alias(){return e.i18n.translate("PICBED_IMGUR_USERNAME")},get message(){return e.i18n.translate("PICBED_IMGUR_MESSAGE_USERNAME")},default:t.username||"",required:!1},{name:"accessToken",type:"input",get prefix(){return e.i18n.translate("PICBED_IMGUR_ACCESS_TOKEN")},get alias(){return e.i18n.translate("PICBED_IMGUR_ACCESS_TOKEN")},get message(){return e.i18n.translate("PICBED_IMGUR_MESSAGE_ACCESS_TOKEN")},default:t.accessToken||"",required:!1},{name:"album",type:"input",get prefix(){return e.i18n.translate("PICBED_IMGUR_ALBUM")},get alias(){return e.i18n.translate("PICBED_IMGUR_ALBUM")},get message(){return e.i18n.translate("PICBED_IMGUR_MESSAGE_ALBUM")},default:t.album||"",required:!1},{name:"proxy",type:"input",get prefix(){return e.i18n.translate("PICBED_IMGUR_PROXY")},get alias(){return e.i18n.translate("PICBED_IMGUR_PROXY")},get message(){return e.i18n.translate("PICBED_IMGUR_MESSAGE_PROXY")},default:t.proxy||"",required:!1}]};const _t=(e,t)=>{const r=(new Date).toUTCString(),n=L.lookup(t);if(!n)throw Error(`No mime type found for file ${t}`);const i=`PUT\n\n${n}\n${r}\n/${e.bucket}/${e.path}${t}`,a=u.createHmac("sha1",e.accessKeySecret).update(i).digest("base64");return`OSS ${e.accessKeyId}:${a}`},pt=(e,t,r,n)=>({method:"PUT",url:`https://${e.bucket}.${e.area}.aliyuncs.com/${encodeURI(e.path)}${encodeURIComponent(t)}`.replace(/%2F/g,"/"),headers:{Host:`${e.bucket}.${e.area}.aliyuncs.com`,Authorization:r,Date:(new Date).toUTCString(),"Content-Type":L.lookup(t)},body:n,resolveWithFullResponse:!0}),gt=async e=>{const t=e.getConfig("picBed.aliyun");if(!t)throw new Error("Can't find aliYun OSS config");t.path=t.path.replace(/\/*$/,"").replace(/^\/*/,"")+"/","/"===t.path&&(t.path="");try{const r=e.output,n=t.customUrl,i=t.path;for(const a of r)if(a.fileName&&a.buffer){const r=_t(t,a.fileName);let s=a.buffer;!s&&a.base64Image&&(s=Buffer.from(a.base64Image,"base64"));const o=pt(t,a.fileName,r,s);if(200!==(await e.request(o)).statusCode)throw new Error("Upload failed");{delete a.base64Image,delete a.buffer;const e=t.options||"";a.imgUrl=n?`${n}/${encodeURIComponent(i)}${encodeURIComponent(a.fileName)}${e}`.replace(/%2F/g,"/"):`https://${t.bucket}.${t.area}.aliyuncs.com/${encodeURIComponent(i)}${encodeURIComponent(a.fileName)}${e}`.replace(/%2F/g,"/")}}return e}catch(t){throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},St=e=>{const t=e.getConfig("picBed.aliyun")||{};return[{name:"accessKeyId",type:"input",get alias(){return e.i18n.translate("PICBED_ALICLOUD_ACCESSKEYID")},default:t.accessKeyId||"",required:!0},{name:"accessKeySecret",type:"password",get alias(){return e.i18n.translate("PICBED_ALICLOUD_ACCESSKEYSECRET")},default:t.accessKeySecret||"",required:!0},{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_ALICLOUD_BUCKET")},default:t.bucket||"",required:!0},{name:"area",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_AREA")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_AREA")},default:t.area||"",get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_AREA")},required:!0},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_PATH")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_PATH")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_PATH")},default:t.path||"",required:!1},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_CUSTOMURL")},default:t.customUrl||"",required:!1},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_ALICLOUD_OPTIONS")},get alias(){return e.i18n.translate("PICBED_ALICLOUD_OPTIONS")},get message(){return e.i18n.translate("PICBED_ALICLOUD_MESSAGE_OPTIONS")},default:t.options||"",required:!1}]};const dt=(e,t)=>{const r=e.path||"",n=e.operator,i=e.password,a=B(i),s=(new Date).toUTCString(),o=`PUT&${`/${e.bucket}/${encodeURI(r)}${encodeURIComponent(t)}`.replace(/%2F/g,"/")}&${s}`;return`UPYUN ${n}:${u.createHmac("sha1",a).update(o).digest("base64")}`},mt=(e,t,r,n)=>{const i=e.bucket,a=e.path||"";return{method:"PUT",url:`https://v0.api.upyun.com/${i}/${encodeURI(a)}${encodeURIComponent(t)}`.replace(/%2F/g,"/"),headers:{Authorization:r,Date:(new Date).toUTCString(),"Content-Type":L.lookup(t)||"application/octet-stream"},body:n,resolveWithFullResponse:!0}},At=async e=>{const t=e.getConfig("picBed.upyun");if(!t)throw new Error("Can't find upYun config");try{const r=e.output,n=t.path||"";for(const i of r)if(i.fileName&&i.buffer){let r=i.buffer;!r&&i.base64Image&&(r=Buffer.from(i.base64Image,"base64"));const a=dt(t,i.fileName),s=mt(t,i.fileName,a,r);if(200!==(await e.request(s)).statusCode)throw new Error("Upload failed");delete i.base64Image,delete i.buffer,i.imgUrl=`${t.url}/${encodeURIComponent(n)}${encodeURIComponent(i.fileName)}${t.options}`.replace(/%2F/g,"/")}return e}catch(t){if("Upload failed"===t.message)e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")});else{const r=le(t.error);e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:"object"==typeof r?r.code:r}),text:"http://docs.upyun.com/api/errno/"})}throw t}},Pt=e=>{const t=e.getConfig("picBed.upyun")||{};return[{name:"bucket",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_BUCKET")},default:t.bucket||"",required:!0},{name:"operator",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_OPERATOR")},get prefix(){return e.i18n.translate("PICBED_UPYUN_OPERATOR")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_OPERATOR")},default:t.operator||"",required:!0},{name:"password",type:"password",get prefix(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PASSWORD")},get alias(){return e.i18n.translate("PICBED_UPYUN_PASSWORD")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PASSWORD")},default:t.password||"",required:!0},{name:"url",type:"input",get alias(){return e.i18n.translate("PICBED_UPYUN_URL")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_URL")},default:t.url||"",required:!0},{name:"options",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_OPTIONS")},get alias(){return e.i18n.translate("PICBED_UPYUN_OPTIONS")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_OPTIONS")},default:t.options||"",required:!1},{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_PATH")},get alias(){return e.i18n.translate("PICBED_UPYUN_PATH")},get message(){return e.i18n.translate("PICBED_UPYUN_MESSAGE_PATH")},default:t.path||"",required:!1}]};const ht=async(e,r,n,i)=>{const a=[...r.path.replace(/\/+$/g,"").split("/"),...t.dirname(n).split("/")];let s="";for(const t of a)if(t){s+=`/${t}`;const n={method:"MKCOL",url:`${r.host}${encodeURI(s)}`.replace(/%2F/g,"/"),headers:{Authorization:`Basic ${Buffer.from(`${r.username}:${r.password}`).toString("base64")}`}};try{await e.request(n)}catch(e){console.log(e)}}return{method:"PUT",url:`${r.host}/${"/"===r.path?"":encodeURI(r.path)}${encodeURIComponent(n)}`.replace(/%2F/g,"/"),headers:{Authorization:`Basic ${Buffer.from(`${r.username}:${r.password}`).toString("base64")}`,"Content-Type":L.lookup(n)||"application/octet-stream","Content-Length":i.length},body:i,resolveWithFullResponse:!0}},ft=async e=>{const t=e.getConfig("picBed.webdavplist");if(!t)throw new Error("Can't find webdavplist config");t.host=t.host.replace(/^https?:\/\/|\/+$/g,""),t.host=(t.sslEnabled?"https://":"http://")+t.host,t.path=(t.path||"").replace(/^\/+|\/+$/g,"")+"/";const r=(t.webpath||"").replace(/^\/+|\/+$/g,"")+"/";try{const n=e.output,i=t.customUrl,a=t.path;for(const s of n)if(s.fileName&&s.buffer){let n=s.buffer;!n&&s.base64Image&&(n=Buffer.from(s.base64Image,"base64"));const o=await ht(e,t,s.fileName,n),l=await e.request(o);if(!(l.statusCode>=200&&l.statusCode<300))throw new Error("Upload failed");{delete s.base64Image,delete s.buffer;const e=i||t.host;t.webpath?s.imgUrl=`${e}/${"/"===r?"":encodeURIComponent(r)}${encodeURIComponent(s.fileName)}`.replace(/%2F/g,"/"):s.imgUrl=`${e}/${"/"===a?"":encodeURIComponent(a)}${encodeURIComponent(s.fileName)}`.replace(/%2F/g,"/")}}return e}catch(t){throw e.emit(qe.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},Ct=e=>{const t=e.getConfig("picBed.webdavplist")||{};return[{name:"host",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_HOST")},default:t.host||"",required:!0},{name:"sslEnabled",type:"confirm",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_SSLENABLED")},required:!0,default:t.sslEnabled||!0,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_SSLENABLED")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED")}},{name:"username",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_USERNAME")},default:t.username||"",required:!0,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_USERNAME")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_USERNAME")}},{name:"password",type:"password",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_PASSWORD")},default:t.password||"",required:!0,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_PASSWORD")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_PASSWORD")}},{name:"path",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_PATH")},default:t.path||"",required:!1,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_PATH")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_PATH")}},{name:"webpath",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_WEBSITE_PATH")},default:t.path||"",required:!1,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_WEBSITE_PATH")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_WEBSITE_PATH")}},{name:"customUrl",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_CUSTOMURL")},default:t.customUrl||"",required:!1,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL")}}]};const Dt=()=>({register(e){!function(e){e.helper.uploader.register("aliyun",{get name(){return e.i18n.translate("PICBED_ALICLOUD")},handle:gt,config:St})}(e),function(e){e.helper.uploader.register("tcyun",{get name(){return e.i18n.translate("PICBED_TENCENTCLOUD")},handle:et,config:tt})}(e),function(e){e.helper.uploader.register("smms",{get name(){return e.i18n.translate("PICBED_SMMS")},handle:Qe,config:Xe})}(e),function(e){e.helper.uploader.register("github",{get name(){return e.i18n.translate("PICBED_GITHUB")},handle:it,config:at})}(e),function(e){e.helper.uploader.register("qiniu",{get name(){return e.i18n.translate("PICBED_QINIU")},handle:lt,config:Et})}(e),function(e){e.helper.uploader.register("imgur",{get name(){return e.i18n.translate("PICBED_IMGUR")},handle:ut,config:It})}(e),function(e){e.helper.uploader.register("upyun",{get name(){return e.i18n.translate("PICBED_UPYUN")},handle:At,config:Pt})}(e),function(e){e.helper.uploader.register("webdavplist",{get name(){return e.i18n.translate("PICBED_WEBDAVPLIST")},handle:ft,config:Ct})}(e)}}),Ut=(e,t,r)=>{const n=z(t);return n.real||(e.log.warn(`can't get ${r}'s image size`),e.log.warn("fallback to 200 * 200")),n};var Tt={handle:async e=>{const t=e.output;return await Promise.all(e.input.map((async(r,n)=>{let i;if(i=j(r)?await X(r,e):await Q(r),!i.success||!i.buffer)throw new Error(i.reason);{const a=Ut(e,i.buffer,r);t[n]={buffer:i.buffer,fileName:i.fileName,width:a.width,height:a.height,extname:i.extname}}}))),e.output=t.filter((e=>e)),e}};var Nt={handle:async e=>(e.output.push(...e.input),e)};class Lt{constructor(e){this.list=[],this.fullList=new Set,this.pluginMap=new Map,this.ctx=e,this.init()}init(){const r=t.join(this.ctx.baseDir,"package.json");if(!e.existsSync(r)){const t={name:"picgo-plugins",description:"picgo-plugins",repository:"https://github.com/PicGo/PicGo-Core",license:"MIT"};e.writeFileSync(r,JSON.stringify(t),"utf8")}}resolvePlugin(e,r){try{return M.sync(r,{basedir:e.baseDir})}catch(n){return t.join(e.baseDir,"node_modules",r)}}load(){const r=t.join(this.ctx.baseDir,"package.json"),n=t.join(this.ctx.baseDir,"node_modules/");if(!e.existsSync(n))return!1;const i=e.readJSONSync(r),a=Object.keys(i.dependencies||{}),s=Object.keys(i.devDependencies||{}),o=a.concat(s).filter((t=>{if(!/^picgo-plugin-|^@[^/]+\/picgo-plugin-/.test(t))return!1;const r=this.resolvePlugin(this.ctx,t);return e.existsSync(r)}));for(const e of o)this.registerPlugin(e);return!0}registerPlugin(e,t){if(e&&"string"==typeof e){this.fullList.add(e);try{if(t){this.list.push(e),Fe(e);const r=t(this.ctx);this.pluginMap.set(e,r),r.register(this.ctx)}else if(!0===this.ctx.getConfig(`picgoPlugins.${e}`)||void 0===this.ctx.getConfig(`picgoPlugins.${e}`)){this.list.push(e),Fe(e),this.getPlugin(e).register(this.ctx);const t=`picgoPlugins[${e}]`;this.ctx.saveConfig({[t]:!0})}}catch(t){this.pluginMap.delete(e),this.list=this.list.filter((t=>t!==e)),this.fullList.delete(e),this.ctx.log.error(t),this.ctx.emit(qe.NOTIFICATION,{title:`Plugin ${e} Load Error`,body:t})}}else this.ctx.log.warn("Please provide valid plugin")}unregisterPlugin(e){this.list=this.list.filter((t=>t!==e)),this.fullList.delete(e),this.pluginMap.delete(e),Fe(e),this.ctx.helper.uploader.unregister(e),this.ctx.helper.transformer.unregister(e),this.ctx.helper.beforeTransformPlugins.unregister(e),this.ctx.helper.beforeUploadPlugins.unregister(e),this.ctx.helper.afterUploadPlugins.unregister(e),this.ctx.cmd.unregister(e),this.ctx.removeConfig("picgoPlugins",e)}getPlugin(e){if(this.pluginMap.has(e))return this.pluginMap.get(e);const r=t.join(this.ctx.baseDir,"node_modules/"),n=require(r+e)(this.ctx);return this.pluginMap.set(e,n),n}getList(){return this.list}hasPlugin(e){return this.fullList.has(e)}getFullList(){return[...this.fullList]}}const Rt={darwin:'-- From https://github.com/mushanshitiancai/vscode-paste-image\r\nproperty fileTypes : {{«class PNGf», ".png"}}\r\n\r\non run argv\r\n\tif argv is {} then\r\n\t\treturn ""\r\n\tend if\r\n\r\n\tif ((clipboard info) as string) contains "«class furl»" then\r\n\t\treturn POSIX path of (the clipboard as «class furl»)\r\n\telse\r\n\t\tset imagePath to (item 1 of argv)\r\n\t\tset theType to getType()\r\n\r\n\t\tif theType is not missing value then\r\n\t\t\ttry\r\n\t\t\t\tset myFile to (open for access imagePath with write permission)\r\n\t\t\t\tset eof myFile to 0\r\n\t\t\t\twrite (the clipboard as (first item of theType)) to myFile\r\n\t\t\t\tclose access myFile\r\n\t\t\t\treturn (POSIX path of imagePath)\r\n\t\t\ton error\r\n\t\t\t\ttry\r\n\t\t\t\t\tclose access myFile\r\n\t\t\t\tend try\r\n\t\t\t\treturn "no image"\r\n\t\t\tend try\r\n\t\telse\r\n\t\t\treturn "no image"\r\n\t\tend if\r\n\tend if\r\nend run\r\n\r\non getType()\r\n\trepeat with aType in fileTypes\r\n\t\trepeat with theInfo in (clipboard info)\r\n\t\t\tif (first item of theInfo) is equal to (first item of aType) then return aType\r\n\t\tend repeat\r\n\tend repeat\r\n\treturn missing value\r\nend getType\r\n',win32:'\r\nparam($imagePath)\r\n\r\n# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\r\n\r\nAdd-Type -Assembly PresentationCore\r\n$img = [Windows.Clipboard]::GetImage()\r\n\r\nif ($img -eq $null) {\r\n "no image"\r\n Exit 1\r\n}\r\n\r\nif (-not $imagePath) {\r\n "no image"\r\n Exit 1\r\n}\r\n\r\n$fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\r\n$stream = [IO.File]::Open($imagePath, "OpenOrCreate")\r\n$encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\r\n$encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\r\n$encoder.Save($stream) | out-null\r\n$stream.Dispose() | out-null\r\n\r\n$imagePath\r\n',win10:'# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\r\nparam($imagePath)\r\n\r\n# https://github.com/PowerShell/PowerShell/issues/7233\r\n# fix the output encoding bug\r\n[console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding\r\n\r\nAdd-Type -Assembly PresentationCore\r\nfunction main {\r\n $img = [Windows.Clipboard]::GetImage()\r\n\r\n if ($img -eq $null) {\r\n "no image"\r\n Exit 1\r\n }\r\n\r\n if (-not $imagePath) {\r\n "no image"\r\n Exit 1\r\n }\r\n\r\n $fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\r\n $stream = [IO.File]::Open($imagePath, "OpenOrCreate")\r\n $encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\r\n $encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\r\n $encoder.Save($stream) | out-null\r\n $stream.Dispose() | out-null\r\n\r\n $imagePath\r\n # fix windows 10 native cmd crash bug when "picgo upload"\r\n # https://github.com/PicGo/PicGo-Core/issues/32\r\n Exit 1\r\n}\r\n\r\ntry {\r\n # For WIN10\r\n $file = Get-Clipboard -Format FileDropList\r\n if ($file -ne $null) {\r\n Convert-Path $file\r\n Exit 1\r\n }\r\n} catch {\r\n # For WIN7 WIN8 WIN10\r\n main\r\n}\r\n\r\nmain',linux:'#!/bin/sh\r\n\r\nif [ -z "$DISPLAY" ]; then\r\n echo "no support" >&2\r\n exit 1\r\nfi\r\n\r\ncase "$XDG_SESSION_TYPE" in\r\nwayland)\r\n command -v wl-copy >/dev/null 2>&1 || {\r\n echo >&2 "no wl-clipboard"\r\n exit 1\r\n }\r\n filePath=$(wl-copy -o 2>/dev/null | grep ^file:// | cut -c8-)\r\n if [ -z "$filePath" ]; then\r\n if\r\n wl-copy -t image/png image/png -o >"$1" 2>/dev/null\r\n then\r\n echo "$1"\r\n else\r\n rm -f "$1"\r\n echo "no image"\r\n fi\r\n else\r\n echo "$filePath"\r\n fi\r\n ;;\r\nx11 | tty)\r\n # require xclip(see http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212)\r\n command -v xclip >/dev/null 2>&1 || {\r\n echo >&2 "no xclip"\r\n exit 1\r\n }\r\n # write image in clipboard to file (see http://unix.stackexchange.com/questions/145131/copy-image-from-clipboard-to-file)\r\n filePath=$(xclip -selection clipboard -o 2>/dev/null | grep ^file:// | cut -c8-)\r\n if [ -z "$filePath" ]; then\r\n if\r\n xclip -selection clipboard -target image/png -o >"$1" 2>/dev/null\r\n then\r\n echo "$1"\r\n else\r\n rm -f "$1"\r\n echo "no image"\r\n fi\r\n else\r\n echo "$filePath"\r\n fi\r\n ;;\r\nesac\r\n',wsl:'#!/bin/sh\r\n# grab the paths\r\nscriptPath=$(echo $0 | awk \'{ print substr( $0, 1, length($0)-6 ) }\')"windows10.ps1"\r\nimagePath=$(echo $1 | awk \'{ print substr( $0, 1, length($0)-18 ) }\')\r\nimageName=$(echo $1 | awk \'{ print substr( $0, length($0)-17, length($0) ) }\')\r\n\r\n# run the powershell script\r\nres=$(powershell.exe -noprofile -noninteractive -nologo -sta -executionpolicy unrestricted -file $(wslpath -w $scriptPath) $(wslpath -w $imagePath)"\\\\"$imageName)\r\n\r\n# note that there is a return symbol in powershell result\r\nnoImage=$(echo "no image\\r")\r\n\r\n# check whether image exists\r\nif [ "$res" = "$noImage" ] ;then\r\n echo "no image"\r\nelse\r\n echo $(wslpath -u -a "${res}")\r\nfi\r\n'},Bt={darwin:"mac.applescript",win32:"windows.ps1",win10:"windows10.ps1",linux:"linux.sh",wsl:"wsl.sh"};const Mt=async r=>{!function(r){const n=t.join(r.baseDir,"piclist-clipboard-images");e.existsSync(n)||e.mkdirSync(n)}(r);const i=t.join(r.baseDir,"piclist-clipboard-images",`${A().format("YYYYMMDDHHmmss")}.png`);return await new Promise(((a,s)=>{const o=(()=>{const e=process.platform;if(y)return"wsl";if("win32"===e)return"10"===n.release().split(".")[0]?"win10":"win32";return"darwin"===e?"darwin":"linux"})(),l=t.join(r.baseDir,Bt[o]);let E;e.existsSync(l)||e.writeFileSync(l,Rt[o],"utf8"),E="darwin"===o?O("osascript",[l,i]):"win32"===o||"win10"===o?O("powershell",["-noprofile","-noninteractive","-nologo","-sta","-executionpolicy","unrestricted","-file",l,i]):O("sh",[l,i]),E.stdout.on("data",(n=>{if("linux"===o&&"no xclip or wl-clipboard"===n.toString().trim())return r.emit(qe.NOTIFICATION,{title:"xclip or wl-clipboard not found",body:"Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"}),s(new Error("Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"));const l=n.toString().trim();let E=!1;if(t.basename(l)!==t.basename(i)&&e.existsSync(l)&&(E=!0),"no image"!==l&&!e.existsSync(l))return s(new Error(`Can't find ${l}`));a({imgPath:l,shouldKeepAfterUploading:E})}))}))},Ot=new r,yt=new G.Agent({maxVersion:"TLSv1.2",minVersion:"TLSv1.2"});function wt(e,t,r){"object"==typeof r&&"value"in r&&"options"in r?e.append(t,r.value,r.options):e.append(t,r)}function Gt(e){return Object.assign(Object.assign({},e),{statusCode:e.status,body:e.data})}function bt(e){var t,r,n,i,a,s,o;const l={method:(null===(r=null===(t=null==e?void 0:e.config)||void 0===t?void 0:t.method)||void 0===r?void 0:r.toUpperCase())||"",url:(null===(n=null==e?void 0:e.config)||void 0===n?void 0:n.url)||"",statusCode:(null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status)||0,message:(null==e?void 0:e.message)||"",stack:(null==e?void 0:e.stack)||{},response:{status:(null===(a=null==e?void 0:e.response)||void 0===a?void 0:a.status)||0,statusCode:(null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.status)||0,body:(null===(o=null==e?void 0:e.response)||void 0===o?void 0:o.data)||""}};return Promise.reject(l)}class xt{constructor(e){this.proxy="",this.options={},this.ctx=e,this.init(),Ot.on(je.CONFIG_CHANGE,(e=>{var t;switch(e.configName){case"picBed":(null===(t=e.value)||void 0===t?void 0:t.proxy)&&(this.proxy=e.value.proxy);break;case"picBed.proxy":this.proxy=e.value}}))}init(){const e=this.ctx.getConfig("picBed.proxy");e&&(this.proxy=e)}handleProxy(){if(this.proxy)try{const e=new l(this.proxy);return{host:e.hostname,port:parseInt(e.port||"0",10),protocol:e.protocol}}catch(e){}return!1}request(e){var t;this.options.proxy=this.handleProxy(),this.options.headers=e.headers||{},this.options.maxBodyLength=1/0,this.options.maxContentLength=1/0,this.options.proxy&&(null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(this.options.httpsAgent=b.httpsOverHttp({proxy:{host:this.options.proxy.host,port:this.options.proxy.port}}),this.options.proxy=!1):this.options.httpsAgent=yt;const r=h.create(this.options);r.interceptors.response.use(Gt,bt);const n=function(e){var t;let r=!1;const n=Object.assign(Object.assign({},e),{url:e.url||"",headers:e.headers||{}});if(e.proxy){let i=e.proxy;if("string"==typeof i){try{i=new l(e.proxy)}catch(e){i=!1,n.proxy=!1,console.error(e)}r=!0}i&&((null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(n.proxy=!1,n.httpsAgent=b.httpsOverHttp({proxy:{host:null==i?void 0:i.hostname,port:parseInt(null==i?void 0:i.port,10)}})):n.proxy={host:i.hostname,port:parseInt(i.port,10),protocol:"http"})}if("formData"in e){const t=new w;for(const r in e.formData)wt(t,r,e.formData[r]);n.data=t,n.headers=Object.assign(n.headers||{},t.getHeaders()),r=!0,delete n.formData}return"body"in e&&(n.data=e.body,r=!0,delete n.body),"qs"in e&&(n.params=e.qs,r=!0),n.__isOldOptions=r,n}(e);return r.interceptors.request.use((function(e){var t,r,n;let i="";return(null===(t=null==e?void 0:e.headers)||void 0===t?void 0:t.contentType)?(i=e.headers.contentType,delete e.headers.contentType):(null===(r=null==e?void 0:e.headers)||void 0===r?void 0:r.ContentType)?(i=e.headers.ContentType,delete e.headers.ContentType):(null===(n=null==e?void 0:e.headers)||void 0===n?void 0:n["content-type"])&&(i=e.headers["content-type"],delete e.headers["content-type"]),""!==i&&e.headers&&(e.headers["Content-Type"]=i),e})),"resolveWithFullResponse"in e&&e.resolveWithFullResponse?r.request(n):r.request(n).then((t=>n.__isOldOptions?"json"in e?e.json?t.data:void 0:JSON.stringify(t.data):t.data))}}class $t{constructor(e){if(this.ctx=e,this.db=new x(this.ctx.configPath),!this.db.has("picBed"))try{this.db.set("picBed",{uploader:"smms",current:"smms"})}catch(e){throw this.ctx.log.error(e),e}if(!this.db.has("picgoPlugins"))try{this.db.set("picgoPlugins",{})}catch(e){throw this.ctx.log.error(e),e}}read(e){return this.db.read(e)}get(e=""){return this.read(!0),this.db.get(e)}set(e,t){return this.read(!0),this.db.set(e,t)}has(e){return this.read(!0),this.db.has(e)}unset(e,t){return this.read(!0),this.db.unset(e,t)}saveConfig(e){Object.keys(e).forEach((t=>{this.set(t,e[t])}))}removeConfig(e){Object.keys(e).forEach((t=>{this.unset(t,e[t])}))}}class Wt{constructor(e){this.ctx=e}async install(e,t={},r){const n=[],i=e.map((e=>vt(this.ctx,e))).filter((e=>this.ctx.pluginLoader.hasPlugin(e.pkgName)?(n.push(e.pkgName),this.ctx.log.success(`PicGo has already installed ${e.pkgName}`),!1):!!e.success)),a=i.map((e=>e.fullName)),s=i.map((e=>e.pkgName));if(a.length>0){const e=await this.execCommand("install",a,this.ctx.baseDir,t,r);if(e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("installFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),body:t});return{success:!1,body:t}}s.forEach((e=>{this.ctx.pluginLoader.registerPlugin(e)})),this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS")),this.ctx.emit("installSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),body:[...s,...n]});return{success:!0,body:[...s,...n]}}if(0===n.length){const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("installFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED"),body:e});return{success:!1,body:e}}this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS")),this.ctx.emit("installSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS"),body:[...s,...n]});return{success:!0,body:[...s,...n]}}async uninstall(e){const t=e.map((e=>vt(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(t.length>0){const e=await this.execCommand("uninstall",t,this.ctx.baseDir);if(e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("uninstallFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),body:t});return{success:!1,body:t}}t.forEach((e=>{this.ctx.pluginLoader.unregisterPlugin(e)})),this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS")),this.ctx.emit("uninstallSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS"),body:t});return{success:!0,body:t}}{const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("uninstallFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED"),body:e});return{success:!1,body:e}}}async update(e,t={},r){const n=e.map((e=>vt(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(n.length>0){const e=await this.execCommand("update",n,this.ctx.baseDir,t,r);if(e.code){const t=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON",{code:`${e.code}`,data:e.data});this.ctx.log.error(t),this.ctx.emit("updateFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),body:t});return{success:!1,body:t}}this.ctx.log.success(this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS")),this.ctx.emit("updateSuccess",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS"),body:n});return{success:!0,body:n}}{const e=this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID");this.ctx.log.error(e),this.ctx.emit("updateFailed",{title:this.ctx.i18n.translate("PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED"),body:e});return{success:!1,body:e}}}async execCommand(e,t,r,n={},i={}){const a=n.registry||this.ctx.getConfig("settings.registry"),s=n.proxy||this.ctx.getConfig("settings.proxy");return await new Promise((n=>{var o,l;let E=[e].concat(t).concat("--color=always").concat("--save");a&&(E=E.concat(`--registry=${a}`)),s&&(E=E.concat(`--proxy=${s}`));try{const e=$("npm",E,{cwd:r,env:Object.assign({},process.env,i)});let t="";null===(o=e.stdout)||void 0===o||o.on("data",(e=>{t+=e})).pipe(process.stdout),null===(l=e.stderr)||void 0===l||l.on("data",(e=>{t+=e})).pipe(process.stderr),e.on("close",(e=>{n(e?{code:e,data:t}:{code:0,data:t})})),e.on("error",(e=>{this.ctx.log.error(e),this.ctx.log.error("NPM is not installed"),this.ctx.emit(qe.FAILED,"NPM is not installed")}))}catch(e){this.ctx.log.error(e),this.ctx.emit(qe.FAILED,e)}}))}}const vt=(e,t)=>{const r={success:!1,fullName:"",pkgName:""},n=te(t,e.log);if(!n)return r;const i=re(n,e.log);return i?{success:!0,fullName:n,pkgName:i}:r},Ht={"zh-CN":{UPLOAD_FAILED:"上传失败",CHECK_SETTINGS:"请检查你的配置项是否正确",CHECK_SETTINGS_AND_NETWORK:"请检查你的配置项以及网络",UPLOAD_FAILED_REASON:"错误码:${code},请打开浏览器粘贴地址查看相关原因",SERVER_ERROR:"服务端出错,请重试",AUTH_FAILED:"认证失败",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"设定Token",PICBED_SMMS_BACKUP_DOMAIN:"备用上传域名",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"例如 smms.app",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"设定KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"设定KeySecret",PICBED_ALICLOUD_BUCKET:"设定Bucket",PICBED_ALICLOUD_AREA:"设定存储区域",PICBED_ALICLOUD_PATH:"设定存储路径",PICBED_ALICLOUD_CUSTOMURL:"设定自定义域名",PICBED_ALICLOUD_OPTIONS:"设定网址后缀",PICBED_ALICLOUD_MESSAGE_AREA:"例如:oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如:test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如:?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD:"腾讯云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"设定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"设定SecretKey",PICBED_TENCENTCLOUD_APPID:"设定AppId",PICBED_TENCENTCLOUD_BUCKET:"设定Bucket",PICBED_TENCENTCLOUD_AREA:"设定存储区域",PICBED_TENCENTCLOUD_PATH:"设定存储路径",PICBED_TENCENTCLOUD_OPTIONS:"设定网址后缀",PICBED_TENCENTCLOUD_CUSTOMURL:"设定自定义域名",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如:1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如:ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如:test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如:?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"设定Token",PICBED_GITHUB_REPO:"设定仓库名",PICBED_GITHUB_PATH:"设定存储路径",PICBED_GITHUB_BRANCH:"设定分支名",PICBED_GITHUB_CUSTOMURL:"设定自定义域名",PICBED_GITHUB_MESSAGE_REPO:"格式:username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如:main",PICBED_GITHUB_MESSAGE_PATH:"例如:test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"设定AccessKey",PICBED_QINIU_SECRETKEY:"设定SecretKey",PICBED_QINIU_BUCKET:"设定Bucket",PICBED_QINIU_PATH:"设定存储路径",PICBED_QINIU_URL:"设定访问网址",PICBED_QINIU_OPTIONS:"设定网址后缀",PICBED_QINIU_AREA:"设定存储区域",PICBED_QINIU_MESSAGE_PATH:"例如:test/",PICBED_QINIU_MESSAGE_AREA:"例如:z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如:?imageslim",PICBED_QINIU_MESSAGE_URL:"例如:https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"设定ClientId",PICBED_IMGUR_USERNAME:"设定用户名",PICBED_IMGUR_ACCESS_TOKEN:"设定accessToken",PICBED_IMGUR_ALBUM:"设定相册名",PICBED_IMGUR_PROXY:"设定代理",PICBED_IMGUR_MESSAGE_CLIENTID:"匿名上传时填写",PICBED_IMGUR_MESSAGE_USERNAME:"需要上传到账户时填写",PICBED_IMGUR_MESSAGE_ACCESS_TOKEN:"需要上传到账户时填写",PICBED_IMGUR_MESSAGE_ALBUM:"例如:test",PICBED_IMGUR_MESSAGE_PROXY:"例如:http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"设定Bucket",PICBED_UPYUN_OPERATOR:"设定操作员",PICBED_UPYUN_PASSWORD:"设定操作员密码",PICBED_UPYUN_PATH:"设定存储路径",PICBED_UPYUN_URL:"设定加速域名",PICBED_UPYUN_OPTIONS:"设定网址后缀",PICBED_UPYUN_MESSAGE_OPERATOR:"例如:me",PICBED_UPYUN_MESSAGE_PASSWORD:"输入操作员密码",PICBED_UPYUN_MESSAGE_URL:"例如:http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如:!imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如:test/",PICBED_WEBDAVPLIST:"WebDAV",PICBED_WEBDAVPLIST_HOST:"设定接口网址",PICBED_WEBDAVPLIST_SSLENABLED:"启用SSL",PICBED_WEBDAVPLIST_USERNAME:"设定用户名",PICBED_WEBDAVPLIST_PASSWORD:"设定密码",PICBED_WEBDAVPLIST_PATH:"设定存储路径",PICBED_WEBDAVPLIST_WEBSITE_PATH:"设定网址路径",PICBED_WEBDAVPLIST_CUSTOMURL:"设定自定义域名",PICBED_WEBDAVPLIST_MESSAGE_HOST:"例如:https://example.com/webdav",PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED:"需要HTTPS时启用",PICBED_WEBDAVPLIST_MESSAGE_USERNAME:"例如:me",PICBED_WEBDAVPLIST_MESSAGE_PASSWORD:"输入密码",PICBED_WEBDAVPLIST_MESSAGE_PATH:"例如:test/",PICBED_WEBDAVPLIST_MESSAGE_WEBSITE_PATH:"拼接网址时使用",PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL:"例如:https://test.com",BUILDIN_WATERMARK_ISADDWATERMARK:"是否添加水印",BUILDIN_WATERMARK_MESSAGE_ISADDWATERMARK:"需要添加水印时启用",BUILDIN_WATERMARK_WATERMARKTYPE:"设定水印类型",BUILDIN_WATERMARK_MESSAGE_WATERMARKTYPE:"请选择水印类型",BUILDIN_WATERMARK_ISFULLSCREENWATERMARK:"是否全屏水印",BUILDIN_WATERMARK_MESSAGE_ISFULLSCREENWATERMARK:"需要全屏水印时启用",BUILDIN_WATERMARK_WATERMARKDEGREE:"设定水印角度",BUILDIN_WATERMARK_MESSAGE_WATERMARKDEGREE:"请输入数字",BUILDIN_WATERMARK_WATERMARKTEXT:"设定水印文字",BUILDIN_WATERMARK_MESSAGE_WATERMARKTEXT:"请输入水印文字",BUILDIN_WATERMARK_WATERMARKTEXTFONTPATH:"设定水印字体文件路径",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTPATH:"请输入水印字体文件路径",BUILDIN_WATERMARK_WATERMARKFONTRATIO:"设定水印相对于图片的比例",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTRATIO:"请输入0-1的小数",BUILDIN_WATERMARK_WATERMARKFONTCOLOR:"设定水印字体颜色",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTCOLOR:"请输入rgb颜色值",BUILDIN_WATERMARK_WATERMARKIMAGEPATH:"设定水印图片路径",BUILDIN_WATERMARK_MESSAGE_WATERMARKIMAGEPATH:"请输入水印图片路径",BUILDIN_WATERMARK_WATERMARKPOSITION:"设定水印位置",BUILDIN_WATERMARK_MESSAGE_WATERMARKPOSITION:"请选择水印位置",BUILDIN_RENAME_FORMAT:"设定重命名格式",BUILDIN_RENAME_ENABLE:"是否启用重命名",BUILDIN_COMPRESS_QUALITY:"设定图片质量",BUILDIN_COMPRESS_MESSAGE_QUALITY:"请输入0-100的整数",BUILDIN_COMPRESS_ISCONVERT:"是否进行格式转换",BUILDIN_COMPRESS_MESSAGE_ISCONVERT:"需要转换时启用",BUILDIN_COMPRESS_CONVERTFORMAT:"设定转换格式",BUILDIN_COMPRESS_MESSAGE_CONVERTFORMAT:"请选择转换格式",BUILDIN_COMPRESS_ISRESIZE:"是否进行图片缩放",BUILDIN_COMPRESS_MESSAGE_ISRESIZE:"需要缩放时启用",BUILDIN_COMPRESS_RESIZEWIDTH:"设定缩放宽度",BUILDIN_COMPRESS_MESSAGE_RESIZEWIDTH:"请输入数字",BUILDIN_COMPRESS_RESIZEHEIGHT:"设定缩放高度",BUILDIN_COMPRESS_MESSAGE_RESIZEHEIGHT:"请输入数字",BUILDIN_COMPRESS_ISRESIZEBYPERCENT:"是否按百分比进行缩放",BUILDIN_COMPRESS_MESSAGE_ISRESIZEBYPERCENT:"需要按百分比缩放时启用",BUILDIN_COMPRESS_RESIZEPERCENT:"设定缩放百分比",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"请输入数字",BUILDIN_COMPRESS_ISROTATE:"是否进行图片旋转",BUILDIN_COMPRESS_MESSAGE_ISROTATE:"需要旋转时启用",BUILDIN_COMPRESS_ROTATEDEGREE:"设定旋转角度",BUILDIN_COMPRESS_MESSAGE_ROTATEDEGREE:"请输入数字,可为负数",BUILDIN_COMPRESS_ISREMOVEEXIF:"是否移除EXIF信息",BUILDIN_COMPRESS_MESSAGE_ISREMOVEEXIF:"需要移除EXIF信息时启用",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安装成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安装失败",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安装失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安装失败,请输入合法插件名或合法安装路径",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸载成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸载失败",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸载失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸载失败,请输入合法插件名",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失败",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失败,失败码为${code},错误日志为 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失败,请输入合法插件名"},"zh-TW":{UPLOAD_FAILED:"上傳失敗",CHECK_SETTINGS:"請檢查你的設定是否正確",CHECK_SETTINGS_AND_NETWORK:"請檢查你的設定及網路",UPLOAD_FAILED_REASON:"錯誤碼:${code},請打開瀏覽器貼上地址查看相關原因",SERVER_ERROR:"伺服器出錯,請重試",AUTH_FAILED:"認證失敗",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"設定Token",PICBED_SMMS_BACKUP_DOMAIN:"備用上傳網址",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"例如 smms.app",PICBED_ALICLOUD:"阿里云OSS",PICBED_ALICLOUD_ACCESSKEYID:"設定KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"設定KeySecret",PICBED_ALICLOUD_BUCKET:"設定Bucket",PICBED_ALICLOUD_AREA:"設定儲存區域",PICBED_ALICLOUD_PATH:"設定儲存路徑",PICBED_ALICLOUD_CUSTOMURL:"設定自訂網址",PICBED_ALICLOUD_OPTIONS:"設定網址後綴",PICBED_ALICLOUD_MESSAGE_AREA:"例如:oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"例如:test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"例如:?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD:"騰訊云COS",PICBED_TENCENTCLOUD_VERSION:"COS版本",PICBED_TENCENTCLOUD_SECRETID:"設定SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"設定SecretKey",PICBED_TENCENTCLOUD_APPID:"設定AppId",PICBED_TENCENTCLOUD_BUCKET:"設定Bucket",PICBED_TENCENTCLOUD_AREA:"設定儲存區域",PICBED_TENCENTCLOUD_PATH:"設定儲存路徑",PICBED_TENCENTCLOUD_OPTIONS:"設定網址後綴",PICBED_TENCENTCLOUD_CUSTOMURL:"設定自訂網址",PICBED_TENCENTCLOUD_MESSAGE_APPID:"例如:1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"例如:ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"例如:test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"例如:?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"設定Token",PICBED_GITHUB_REPO:"設定倉庫名稱",PICBED_GITHUB_PATH:"設定儲存路徑",PICBED_GITHUB_BRANCH:"設定分支名稱",PICBED_GITHUB_CUSTOMURL:"設定自訂網址",PICBED_GITHUB_MESSAGE_REPO:"格式:username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"例如:main",PICBED_GITHUB_MESSAGE_PATH:"例如:test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_QINIU:"七牛云",PICBED_QINIU_ACCESSKEY:"設定AccessKey",PICBED_QINIU_SECRETKEY:"設定SecretKey",PICBED_QINIU_BUCKET:"設定Bucket",PICBED_QINIU_PATH:"設定儲存路徑",PICBED_QINIU_URL:"設定訪問網址",PICBED_QINIU_OPTIONS:"設定網址後綴",PICBED_QINIU_AREA:"設定儲存區域",PICBED_QINIU_MESSAGE_PATH:"例如:test/",PICBED_QINIU_MESSAGE_AREA:"例如:z0",PICBED_QINIU_MESSAGE_OPTIONS:"例如:?imageslim",PICBED_QINIU_MESSAGE_URL:"例如:https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"設定ClientId",PICBED_IMGUR_USERNAME:"設定用戶名",PICBED_IMGUR_ACCESS_TOKEN:"設定accessToken",PICBED_IMGUR_ALBUM:"設定相簿名",PICBED_IMGUR_PROXY:"設定PROXY",PICBED_IMGUR_MESSAGE_CLIENTID:"匿名上傳時填寫",PICBED_IMGUR_MESSAGE_USERNAME:"需要上傳到賬戶時填寫",PICBED_IMGUR_MESSAGE_ACCESS_TOKEN:"需要上傳到賬戶時填寫",PICBED_IMGUR_MESSAGE_ALBUM:"例如:test",PICBED_IMGUR_MESSAGE_PROXY:"例如:http://127.0.0.1:1080",PICBED_UPYUN:"又拍云",PICBED_UPYUN_BUCKET:"設定Bucket",PICBED_UPYUN_OPERATOR:"設定操作員",PICBED_UPYUN_PASSWORD:"設定操作員密碼",PICBED_UPYUN_PATH:"設定儲存路徑",PICBED_UPYUN_URL:"設定加速網址",PICBED_UPYUN_OPTIONS:"設定網址後綴",PICBED_UPYUN_MESSAGE_OPERATOR:"例如:me",PICBED_UPYUN_MESSAGE_PASSWORD:"輸入操作員密碼",PICBED_UPYUN_MESSAGE_URL:"例如:http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"例如:!imgslim",PICBED_UPYUN_MESSAGE_PATH:"例如:test/",PICBED_WEBDAVPLIST:"WebDAV",PICBED_WEBDAVPLIST_HOST:"設定API主機",PICBED_WEBDAVPLIST_SSLENABLED:"需要HTTPS時啟用",PICBED_WEBDAVPLIST_USERNAME:"設定用戶名",PICBED_WEBDAVPLIST_PASSWORD:"設定密碼",PICBED_WEBDAVPLIST_PATH:"設定儲存路徑",PICBED_WEBDAVPLIST_CUSTOMURL:"設定自訂網址",PICBED_WEBDAVPLIST_WEBSITE_PATH:"設定網站路徑",PICBED_WEBDAVPLIST_MESSAGE_HOST:"例如:https://example.com/webdav",PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED:"需要HTTPS時啟用",PICBED_WEBDAVPLIST_MESSAGE_USERNAME:"例如:me",PICBED_WEBDAVPLIST_MESSAGE_PASSWORD:"輸入用戶密碼",PICBED_WEBDAVPLIST_MESSAGE_PATH:"例如:test/",PICBED_WEBDAVPLIST_MESSAGE_WEBSITE_PATH:"拼接網址時使用",PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL:"例如:https://test.com",BUILDIN_WATERMARK_ISADDWATERMARK:"是否添加水印",BUILDIN_WATERMARK_MESSAGE_ISADDWATERMARK:"需要添加水印時啟用",BUILDIN_WATERMARK_WATERMARKTYPE:"設定水印類型",BUILDIN_WATERMARK_MESSAGE_WATERMARKTYPE:"請選擇水印類型",BUILDIN_WATERMARK_ISFULLSCREENWATERMARK:"是否全屏水印",BUILDIN_WATERMARK_MESSAGE_ISFULLSCREENWATERMARK:"需要全屏水印時啟用",BUILDIN_WATERMARK_WATERMARKDEGREE:"設定水印角度",BUILDIN_WATERMARK_MESSAGE_WATERMARKDEGREE:"請輸入數字",BUILDIN_WATERMARK_WATERMARKTEXT:"設定水印文字",BUILDIN_WATERMARK_MESSAGE_WATERMARKTEXT:"請輸入水印文字",BUILDIN_WATERMARK_WATERMARKTEXTFONTPATH:"設定水印字體",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTPATH:"請輸入水印字體文件路徑",BUILDIN_WATERMARK_WATERMARKFONTRATIO:"設定水印圖片比例",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTRATIO:"請輸入0-1的數字",BUILDIN_WATERMARK_WATERMARKFONTCOLOR:"設定水印字體顏色",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTCOLOR:"請輸入rgb顏色值",BUILDIN_WATERMARK_WATERMARKIMAGEPATH:"設定水印圖片路徑",BUILDIN_WATERMARK_MESSAGE_WATERMARKIMAGEPATH:"請輸入水印圖片路徑",BUILDIN_WATERMARK_WATERMARKPOSITION:"設定水印位置",BUILDIN_WATERMARK_MESSAGE_WATERMARKPOSITION:"請選擇水印位置",BUILDIN_RENAME_FORMAT:"設定重命名格式",BUILDIN_RENAME_ENABLE:"是否啟用重命名",BUILDIN_COMPRESS_QUALITY:"設定圖片質量",BUILDIN_COMPRESS_MESSAGE_QUALITY:"請輸入0-100的整數",BUILDIN_COMPRESS_ISCONVERT:"是否進行格式轉換",BUILDIN_COMPRESS_MESSAGE_ISCONVERT:"需要轉換時啟用",BUILDIN_COMPRESS_CONVERTFORMAT:"設定轉換格式",BUILDIN_COMPRESS_MESSAGE_CONVERTFORMAT:"請選擇轉換格式",BUILDIN_COMPRESS_ISRESIZE:"是否進行圖片縮放",BUILDIN_COMPRESS_MESSAGE_ISRESIZE:"需要縮放時啟用",BUILDIN_COMPRESS_RESIZEWIDTH:"設定縮放寬度",BUILDIN_COMPRESS_MESSAGE_RESIZEWIDTH:"請輸入數字",BUILDIN_COMPRESS_RESIZEHEIGHT:"設定縮放高度",BUILDIN_COMPRESS_MESSAGE_RESIZEHEIGHT:"請輸入數字",BUILDIN_COMPRESS_ISRESIZEBYPERCENT:"是否按百分比進行縮放",BUILDIN_COMPRESS_MESSAGE_ISRESIZEBYPERCENT:"需要按百分比縮放時啟用",BUILDIN_COMPRESS_RESIZEPERCENT:"設定縮放百分比",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"請輸入数字",BUILDIN_COMPRESS_ISROTATE:"是否進行圖片旋轉",BUILDIN_COMPRESS_MESSAGE_ISROTATE:"需要旋轉時啟用",BUILDIN_COMPRESS_ROTATEDEGREE:"設定旋轉角度",BUILDIN_COMPRESS_MESSAGE_ROTATEDEGREE:"請輸入數字,可為負數",BUILDIN_COMPRESS_ISREMOVEEXIF:"是否移除EXIF資訊",BUILDIN_COMPRESS_MESSAGE_ISREMOVEEXIF:"需要移除EXIF資訊時啟用",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"插件安裝成功",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"插件安裝失敗",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"插件安裝失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"插件安裝失敗,請輸入正確的插件名稱或正確的安裝路徑",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"插件卸載成功",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"插件卸載失敗",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"插件卸載失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"插件卸載失敗,請輸入正確的插件名稱",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"插件更新成功",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"插件更新失敗",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"插件更新失敗,失敗碼為${code},錯誤紀錄為 \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"插件更新失敗,請輸入正確的插件名稱"},en:{UPLOAD_FAILED:"Upload failed",CHECK_SETTINGS:"Please check your settings",CHECK_SETTINGS_AND_NETWORK:"Please check your settings and network",UPLOAD_FAILED_REASON:"Error code: ${code}, please open the browser and paste the address to see the reason",SERVER_ERROR:"Server error, please try again later",AUTH_FAILED:"Authentication failed",PICBED_SMMS:"SM.MS",PICBED_SMMS_TOKEN:"Set Token",PICBED_SMMS_BACKUP_DOMAIN:"Set Backup Upload Domain",PICBED_SMMS_MESSAGE_BACKUP_DOMAIN:"Ex. smms.app",PICBED_ALICLOUD:"Ali Cloud",PICBED_ALICLOUD_ACCESSKEYID:"Set KeyId",PICBED_ALICLOUD_ACCESSKEYSECRET:"Set KeySecret",PICBED_ALICLOUD_BUCKET:"Set Bucket",PICBED_ALICLOUD_AREA:"Set Area",PICBED_ALICLOUD_PATH:"Set Path",PICBED_ALICLOUD_CUSTOMURL:"Set Custom URL",PICBED_ALICLOUD_OPTIONS:"Set URL Suffix",PICBED_ALICLOUD_MESSAGE_AREA:"Ex. oss-cn-beijing",PICBED_ALICLOUD_MESSAGE_PATH:"Ex. test/",PICBED_ALICLOUD_MESSAGE_OPTIONS:"Ex. ?x-oss-process=xxx",PICBED_ALICLOUD_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_TENCENTCLOUD:"Tencent Cloud",PICBED_TENCENTCLOUD_VERSION:"Choose COS version",PICBED_TENCENTCLOUD_SECRETID:"Set SecretId",PICBED_TENCENTCLOUD_SECRETKEY:"Set SecretKey",PICBED_TENCENTCLOUD_APPID:"Set AppId",PICBED_TENCENTCLOUD_BUCKET:"Set Bucket",PICBED_TENCENTCLOUD_AREA:"Set Area",PICBED_TENCENTCLOUD_PATH:"Set Path",PICBED_TENCENTCLOUD_OPTIONS:"Set URL Suffix",PICBED_TENCENTCLOUD_CUSTOMURL:"Set Custom URL",PICBED_TENCENTCLOUD_MESSAGE_APPID:"Ex. 1234567890",PICBED_TENCENTCLOUD_MESSAGE_AREA:"Ex. ap-beijing",PICBED_TENCENTCLOUD_MESSAGE_PATH:"Ex. test/",PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL:"Ex. http://test.com",PICBED_TENCENTCLOUD_MESSAGE_OPTIONS:"Ex. ?imageMogr2",PICBED_GITHUB:"GitHub",PICBED_GITHUB_TOKEN:"Set Token",PICBED_GITHUB_REPO:"Set Repo Name",PICBED_GITHUB_PATH:"Set Path",PICBED_GITHUB_BRANCH:"Set Branch",PICBED_GITHUB_CUSTOMURL:"Set Custom URL",PICBED_GITHUB_MESSAGE_REPO:"Ex. username/repo",PICBED_GITHUB_MESSAGE_BRANCH:"Ex. main",PICBED_GITHUB_MESSAGE_PATH:"Ex. test/",PICBED_GITHUB_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_QINIU:"Qiniu",PICBED_QINIU_ACCESSKEY:"Set AccessKey",PICBED_QINIU_SECRETKEY:"Set SecretKey",PICBED_QINIU_BUCKET:"Set Bucket",PICBED_QINIU_PATH:"Set Path",PICBED_QINIU_URL:"Set URL",PICBED_QINIU_OPTIONS:"Set URL Suffix",PICBED_QINIU_AREA:"Set Area",PICBED_QINIU_MESSAGE_PATH:"Ex. test/",PICBED_QINIU_MESSAGE_AREA:"Ex. z0",PICBED_QINIU_MESSAGE_OPTIONS:"Ex. ?imageslim",PICBED_QINIU_MESSAGE_URL:"Ex. https://xxx.yyy.glb.clouddn.com",PICBED_IMGUR:"Imgur",PICBED_IMGUR_CLIENTID:"Set ClientId",PICBED_IMGUR_USERNAME:"Set Username",PICBED_IMGUR_ACCESS_TOKEN:"Set Access Token",PICBED_IMGUR_ALBUM:"Set Album Name",PICBED_IMGUR_PROXY:"Set Proxy",PICBED_IMGUR_MESSAGE_CLIENTID:"Fill in when you need to upload as anonymous",PICBED_IMGUR_MESSAGE_USERNAME:"Fill in when you need to upload to the account",PICBED_IMGUR_MESSAGE_ACCESS_TOKEN:"Fill in when you need to upload to the account",PICBED_IMGUR_MESSAGE_ALBUM:"例如:test",PICBED_IMGUR_MESSAGE_PROXY:"Ex. http://127.0.0.1:1080",PICBED_UPYUN:"Upyun",PICBED_UPYUN_BUCKET:"Set Bucket",PICBED_UPYUN_OPERATOR:"Set Operator",PICBED_UPYUN_PASSWORD:"Set Operator Password",PICBED_UPYUN_PATH:"Set Path",PICBED_UPYUN_URL:"Set URL",PICBED_UPYUN_OPTIONS:"Set URL Suffix",PICBED_UPYUN_MESSAGE_OPERATOR:"Ex. me",PICBED_UPYUN_MESSAGE_PASSWORD:"Please type the operator password",PICBED_UPYUN_MESSAGE_URL:"Ex. http://xxx.test.upcdn.net",PICBED_UPYUN_MESSAGE_OPTIONS:"Ex. !imgslim",PICBED_UPYUN_MESSAGE_PATH:"Ex. test/",PICBED_WEBDAVPLIST:"WebDAV",PICBED_WEBDAVPLIST_HOST:"Set Host",PICBED_WEBDAVPLIST_SSLENABLED:"Enable HTTPS",PICBED_WEBDAVPLIST_USERNAME:"Set Username",PICBED_WEBDAVPLIST_PASSWORD:"Set Password",PICBED_WEBDAVPLIST_PATH:"Set Path",PICBED_WEBDAVPLIST_WEBSITE_PATH:"Set Website Path",PICBED_WEBDAVPLIST_CUSTOMURL:"Set Custom URL",PICBED_WEBDAVPLIST_MESSAGE_HOST:"Ex. https://example.com/webdav",PICBED_WEBDAVPLIST_MESSAGE_SSLENABLED:"Enable HTTPS",PICBED_WEBDAVPLIST_MESSAGE_USERNAME:"Ex. me",PICBED_WEBDAVPLIST_MESSAGE_PASSWORD:"Please type the password",PICBED_WEBDAVPLIST_MESSAGE_PATH:"Ex. test/",PICBED_WEBDAVPLIST_MESSAGE_WEBSITE_PATH:"Used to generate the URL of the image",PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL:"Ex. https://test.com",BUILDIN_RENAME_FORMAT:"Set rename format",BUILDIN_RENAME_ENABLE:"Enable rename",BUILDIN_WATERMARK_ISADDWATERMARK:"Whether to add watermark",BUILDIN_WATERMARK_MESSAGE_ISADDWATERMARK:"Enable when watermark is required",BUILDIN_WATERMARK_WATERMARKTYPE:"Set watermark type",BUILDIN_WATERMARK_MESSAGE_WATERMARKTYPE:"Please select watermark type",BUILDIN_WATERMARK_ISFULLSCREENWATERMARK:"Whether to use full-screen watermark",BUILDIN_WATERMARK_MESSAGE_ISFULLSCREENWATERMARK:"Enable when full-screen watermark is required",BUILDIN_WATERMARK_WATERMARKDEGREE:"Set watermark angle",BUILDIN_WATERMARK_MESSAGE_WATERMARKDEGREE:"Please enter a number",BUILDIN_WATERMARK_WATERMARKTEXT:"Set watermark text",BUILDIN_WATERMARK_MESSAGE_WATERMARKTEXT:"Please enter watermark text",BUILDIN_WATERMARK_WATERMARKTEXTFONTPATH:"Set watermark font",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTPATH:"Please enter the watermark font file path",BUILDIN_WATERMARK_WATERMARKFONTRATIO:"Set the ratio of the watermark to the image",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTRATIO:"Please enter a number between 0-1",BUILDIN_WATERMARK_WATERMARKFONTCOLOR:"Set watermark font color",BUILDIN_WATERMARK_MESSAGE_WATERMARKFONTCOLOR:"Please enter the RGB color value",BUILDIN_WATERMARK_WATERMARKIMAGEPATH:"Set watermark image path",BUILDIN_WATERMARK_MESSAGE_WATERMARKIMAGEPATH:"Please enter the watermark image path",BUILDIN_WATERMARK_WATERMARKPOSITION:"Set watermark position",BUILDIN_WATERMARK_MESSAGE_WATERMARKPOSITION:"Please select watermark position",BUILDIN_COMPRESS_QUALITY:"Set image quality",BUILDIN_COMPRESS_MESSAGE_QUALITY:"Please enter an integer between 0-100",BUILDIN_COMPRESS_ISCONVERT:"Whether to perform format conversion",BUILDIN_COMPRESS_MESSAGE_ISCONVERT:"Enable when format conversion is required",BUILDIN_COMPRESS_CONVERTFORMAT:"Set conversion format",BUILDIN_COMPRESS_MESSAGE_CONVERTFORMAT:"Please select conversion format",BUILDIN_COMPRESS_ISRESIZE:"Whether to resize the image",BUILDIN_COMPRESS_MESSAGE_ISRESIZE:"Enable when image resizing is required",BUILDIN_COMPRESS_RESIZEWIDTH:"Set resizing width",BUILDIN_COMPRESS_MESSAGE_RESIZEWIDTH:"Please enter a number",BUILDIN_COMPRESS_RESIZEHEIGHT:"Set resizing height",BUILDIN_COMPRESS_MESSAGE_RESIZEHEIGHT:"Please enter a number",BUILDIN_COMPRESS_ISRESIZEBYPERCENT:"Whether to resize the image by percentage",BUILDIN_COMPRESS_MESSAGE_ISRESIZEBYPERCENT:"Enable when resizing by percentage is required",BUILDIN_COMPRESS_RESIZEPERCENT:"Set resizing percentage",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"Please enter a number",BUILDIN_COMPRESS_ISROTATE:"Whether to rotate the image",BUILDIN_COMPRESS_MESSAGE_ISROTATE:"Enable when image rotation is required",BUILDIN_COMPRESS_ROTATEDEGREE:"Set rotation angle",BUILDIN_COMPRESS_MESSAGE_ROTATEDEGREE:"Please enter a number, can be negative",BUILDIN_COMPRESS_ISREMOVEEXIF:"Whether to remove EXIF information",BUILDIN_COMPRESS_MESSAGE_ISREMOVEEXIF:"Enable when removing EXIF information is required",PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS:"Plugin installed successfully",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED:"Plugin installation failed",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON:"Plugin installation failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH:"Plugin installation failed, please enter a valid plugin name or valid installation path",PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS:"Plugin uninstalled successfully",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED:"Plugin uninstall failed",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON:"Plugin uninstall failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID:"Plugin uninstall failed, please enter a valid plugin name",PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS:"Plugin updated successfully",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED:"Plugin update failed",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON:"Plugin update failed, error code is ${code}, error log is \n ${data}",PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID:"Plugin update failed, please enter a valid plugin name"}};class Ft{constructor(e){this.ctx=e,this.objectAdapter=new v(Ht);let t=this.ctx.getConfig("settings.language")||"zh-CN";Ht[t]||(t="zh-CN"),this.i18n=new H({adapter:this.objectAdapter,defaultLanguage:t}),this.loadOutterI18n()}loadOutterI18n(){const r=this.getOutterI18nFolder();e.readdirSync(r,{withFileTypes:!0}).forEach((n=>{if(n.isFile()&&n.name.endsWith(".yml")){const i=t.join(r,n.name),a=e.readFileSync(i,"utf8");try{const e=W.load(a);Ht[n.name.replace(/\.yml$/,"")]=e}catch(e){console.error(e)}}}))}getOutterI18nFolder(){const r=t.join(this.ctx.baseDir,"i18n-cli");return e.pathExistsSync(r)||e.ensureDirSync(r),r}translate(e,t){return this.i18n.translate(e,t)||e}setLanguage(e){this.i18n.setLanguage(e),this.ctx.saveConfig({"settings.language":e})}addLocale(e,t){const r=this.objectAdapter.getLocale(e);if(!r)return!1;const n=C(r,t);return this.objectAdapter.setLocale(e,n),!0}addLanguage(e,t){return!this.objectAdapter.getLocale(e)&&(this.objectAdapter.setLocale(e,t),Ht[e]=t,!0)}getLanguageList(){return Object.keys(Ht)}}class Kt extends r{constructor(e=""){super(),this.VERSION="0.6.9",this.configPath=e,this.output=[],this.input=[],this.rawInput=[],this.helper={transformer:new He("transformer"),uploader:new He("uploader"),beforeTransformPlugins:new He("beforeTransformPlugins"),beforeUploadPlugins:new He("beforeUploadPlugins"),afterUploadPlugins:new He("afterUploadPlugins")},this.initConfigPath(),this.log=new Ve(this),this.cmd=new Ke(this),this.pluginHandler=new Wt(this),this.initConfig(),this.init()}get pluginLoader(){return this._pluginLoader}initConfigPath(){if(""===this.configPath&&(this.configPath=i()+"/.piclist/config.json"),".JSON"!==t.extname(this.configPath).toUpperCase())throw this.configPath="",Error("The configuration file only supports JSON format.");this.baseDir=t.dirname(this.configPath);e.pathExistsSync(this.configPath)||e.ensureFileSync(`${this.configPath}`)}initConfig(){this.db=new $t(this),this._config=this.db.read(!0)}init(){try{this.i18n=new Ft(this),this.Request=new xt(this),this._pluginLoader=new Lt(this),Fe("picgo"),Dt().register(this),{register(e){e.helper.transformer.register("path",Tt),e.helper.transformer.register("base64",Nt)}}.register(this),Fe(""),this._pluginLoader.load(),this.lifecycle=new Ye(this)}catch(e){throw this.emit(qe.UPLOAD_PROGRESS,-1),this.log.error(e),e}}use(e,t){if(t)return this.pluginLoader.registerPlugin(t,e),this.pluginLoader.getPlugin(t);return e(this)}registerCommands(){""!==this.configPath&&(this.cmd.init(),this.cmd.loadCommands())}getConfig(e){return e?D(this._config,e):this._config}saveConfig(e){oe(e)?(this.setConfig(e),this.db.saveConfig(e)):this.log.warn("the format of config is invalid, please provide object")}removeConfig(e,t){e&&t&&(se(e)?this.log.warn(`the config.${e} can't be removed`):(this.unsetConfig(e,t),this.db.unset(e,t)))}setConfig(e){oe(e)?Object.keys(e).forEach((t=>{se(t)&&(this.log.warn(`the config.${t} can't be modified`),delete e[t]),U(this._config,t,e[t]),Ot.emit(je.CONFIG_CHANGE,{configName:t,value:e[t]})})):this.log.warn("the format of config is invalid, please provide object")}unsetConfig(e,t){e&&t&&(se(e)?this.log.warn(`the config.${e} can't be unset`):T(this.getConfig(e),t))}get request(){return this.Request.request.bind(this.Request)}async upload(t){if(""===this.configPath)return this.log.error("The configuration file only supports JSON format."),[];if(void 0!==t&&0!==t.length){const{output:e}=await this.lifecycle.start(t);return e}try{const{imgPath:t,shouldKeepAfterUploading:r}=await Mt(this);if("no image"===t)throw new Error("image not found in clipboard");{this.once(qe.FAILED,(()=>{r||e.remove(t).catch((e=>{this.log.error(e)}))})),this.once("finished",(()=>{r||e.remove(t).catch((e=>{this.log.error(e)}))}));const{output:n}=await this.lifecycle.start([t]);return n}}catch(e){throw this.emit(qe.FAILED,e),e}}}export{Ke as Commander,Ye as Lifecycle,He as LifecyclePlugins,Ve as Logger,Kt as PicGo,Ce as PicGoUtils,Wt as PluginHandler,Lt as PluginLoader,xt as Request};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcGx1Z2luSGFuZGxlci50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9jb25maWcudHMiLCIuLi9zcmMvdXRpbHMvY29tbW9uLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VwbG9hZC50cyIsIi4uL3NyYy9wbHVnaW5zL2JlZm9yZXRyYW5zZm9ybWVyL2NvbXByZXNzLnRzIiwiLi4vc3JjL3BsdWdpbnMvYmVmb3JldHJhbnNmb3JtZXIvd2F0ZXJtYXJrLnRzIiwiLi4vc3JjL3BsdWdpbnMvYmVmb3JldXBsb2FkL2J1aWxkSW5SZW5hbWUudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvc2V0dGluZy50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci91c2UudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcHJveHkudHMiLCIuLi9zcmMvdXRpbHMvaW5pdFV0aWxzLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL2luaXQudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaTE4bi50cyIsIi4uL3NyYy9saWIvTGlmZWN5Y2xlUGx1Z2lucy50cyIsIi4uL3NyYy9saWIvQ29tbWFuZGVyLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL2luZGV4LnRzIiwiLi4vc3JjL3V0aWxzL2VudW0udHMiLCIuLi9zcmMvbGliL0xvZ2dlci50cyIsIi4uL3NyYy9jb3JlL0xpZmVjeWNsZS50cyIsIi4uL3NyYy91dGlscy9jcmVhdGVDb250ZXh0LnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvc21tcy50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3RjeXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvZ2l0aHViLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvcWluaXUudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9pbWd1ci50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL2FsaXl1bi50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3VweXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvd2ViZGF2LnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvaW5kZXgudHMiLCIuLi9zcmMvcGx1Z2lucy90cmFuc2Zvcm1lci9wYXRoLnRzIiwiLi4vc3JjL3BsdWdpbnMvdHJhbnNmb3JtZXIvYmFzZTY0LnRzIiwiLi4vc3JjL2xpYi9QbHVnaW5Mb2FkZXIudHMiLCIuLi9zcmMvdXRpbHMvc3RhdGljLnRzIiwiLi4vc3JjL3V0aWxzL2dldENsaXBib2FyZEltYWdlLnRzIiwiLi4vc3JjL3V0aWxzL2V2ZW50QnVzLnRzIiwiLi4vc3JjL2xpYi9SZXF1ZXN0LnRzIiwiLi4vc3JjL3V0aWxzL2RiLnRzIiwiLi4vc3JjL2xpYi9QbHVnaW5IYW5kbGVyLnRzIiwiLi4vc3JjL2kxOG4vaW5kZXgudHMiLCIuLi9zcmMvaTE4bi96aC1DTi50cyIsIi4uL3NyYy9pMThuL3poLVRXLnRzIiwiLi4vc3JjL2kxOG4vZW4udHMiLCIuLi9zcmMvY29yZS9QaWNHby50cyIsIi4uL3NyYy9wbHVnaW5zL3RyYW5zZm9ybWVyL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElQaWNHbywgSVBsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgcGx1Z2luSGFuZGxlcjogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgLy8gY29uc3QgcGx1Z2luSGFuZGxlciA9IG5ldyBQbHVnaW5IYW5kbGVyKGN0eClcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCdpbnN0YWxsIDxwbHVnaW5zLi4uPicpXHJcbiAgICAgIC5kZXNjcmlwdGlvbignaW5zdGFsbCBwaWNnbyBwbHVnaW4nKVxyXG4gICAgICAuYWxpYXMoJ2FkZCcpXHJcbiAgICAgIC5vcHRpb24oJy1wLCAtLXByb3h5IDxwcm94eT4nLCAnQWRkIHByb3h5IGZvciBpbnN0YWxsaW5nJylcclxuICAgICAgLm9wdGlvbignLXIsIC0tcmVnaXN0cnkgPHJlZ2lzdHJ5PicsICdDaG9vc2UgYSByZWdpc3RyeSBmb3IgaW5zdGFsbGluZycpXHJcbiAgICAgIC5hY3Rpb24oKHBsdWdpbnM6IHN0cmluZ1tdLCBwcm9ncmFtOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB7IHByb3h5LCByZWdpc3RyeSB9ID0gcHJvZ3JhbVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICBwcm94eSxcclxuICAgICAgICAgIHJlZ2lzdHJ5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN0eC5wbHVnaW5IYW5kbGVyLmluc3RhbGwocGx1Z2lucywgb3B0aW9ucykuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ3VuaW5zdGFsbCA8cGx1Z2lucy4uLj4nKVxyXG4gICAgICAuYWxpYXMoJ3JtJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCd1bmluc3RhbGwgcGljZ28gcGx1Z2luJylcclxuICAgICAgLmFjdGlvbigocGx1Z2luczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICBjdHgucGx1Z2luSGFuZGxlci51bmluc3RhbGwocGx1Z2lucykuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ3VwZGF0ZSA8cGx1Z2lucy4uLj4nKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ3VwZGF0ZSBwaWNnbyBwbHVnaW4nKVxyXG4gICAgICAub3B0aW9uKCctcCwgLS1wcm94eSA8cHJveHk+JywgJ0FkZCBwcm94eSBmb3IgaW5zdGFsbGluZycpXHJcbiAgICAgIC5vcHRpb24oJy1yLCAtLXJlZ2lzdHJ5IDxyZWdpc3RyeT4nLCAnQ2hvb3NlIGEgcmVnaXN0cnkgZm9yIGluc3RhbGxpbmcnKVxyXG4gICAgICAuYWN0aW9uKChwbHVnaW5zOiBzdHJpbmdbXSwgcHJvZ3JhbTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBwcm94eSwgcmVnaXN0cnkgfSA9IHByb2dyYW1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgcHJveHksXHJcbiAgICAgICAgICByZWdpc3RyeVxyXG4gICAgICAgIH1cclxuICAgICAgICBjdHgucGx1Z2luSGFuZGxlci51cGRhdGUocGx1Z2lucywgb3B0aW9ucykuY2F0Y2goKGU6IEVycm9yKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHBsdWdpbkhhbmRsZXJcclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCBjb25maWc6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5vcHRpb24oJy1jLCAtLWNvbmZpZyA8cGF0aD4nLCAnc2V0IGNvbmZpZyBwYXRoJylcclxuICAgICAgLy8gd2lsbCBoYW5kbGUgaW4gYGJpbi9waWNnb2BcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNvbmZpZ1xyXG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCB7IGltYWdlU2l6ZSB9IGZyb20gJ2ltYWdlLXNpemUnXHJcbmltcG9ydCB7XHJcbiAgSUltZ1NpemUsXHJcbiAgSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8sXHJcbiAgSVBsdWdpbk5hbWVUeXBlLFxyXG4gIElMb2dnZXIsXHJcbiAgSVBpY0dvLFxyXG4gIElCdWlsZEluQ29tcHJlc3NPcHRpb25zLFxyXG4gIElCdWlsZEluV2F0ZXJNYXJrT3B0aW9uc1xyXG59IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBVUkwgfSBmcm9tICd1cmwnXHJcbmltcG9ydCBUZXh0VG9TVkcgZnJvbSAndGV4dC10by1zdmcnXHJcbmltcG9ydCBzaGFycCBmcm9tICdzaGFycCdcclxuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXHJcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tU3RyaW5nR2VuZXJhdG9yIChsZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgY29uc3QgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknXHJcbiAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGggfSkubWFwKCgpID0+IGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpKSkuam9pbignJylcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZUZpbGVOYW1lV2l0aFRpbWVzdGFtcCAob2xkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gYCR7TWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCl9JHtyYW5kb21TdHJpbmdHZW5lcmF0b3IoNSl9JHtwYXRoLmV4dG5hbWUob2xkTmFtZSl9YFxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVuYW1lRmlsZU5hbWVXaXRoUmFuZG9tU3RyaW5nIChvbGROYW1lOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyID0gNSk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGAke3JhbmRvbVN0cmluZ0dlbmVyYXRvcihsZW5ndGgpfSR7cGF0aC5leHRuYW1lKG9sZE5hbWUpfWBcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZUZpbGVOYW1lV2l0aEN1c3RvbVN0cmluZyAob2xkTmFtZTogc3RyaW5nLCBjdXN0b21Gb3JtYXQ6IHN0cmluZywgYWZmaXhGaWxlTmFtZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgY29udmVyc2lvbk1hcDoge1trZXk6IHN0cmluZ106ICgpID0+IHN0cmluZ30gPSB7XHJcbiAgICAne1l9JzogKCkgPT4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCksXHJcbiAgICAne3l9JzogKCkgPT4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkuc2xpY2UoMiksXHJcbiAgICAne219JzogKCkgPT4gKG5ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDF9YCA6IChuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLFxyXG4gICAgJ3tkfSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0RGF0ZSgpfWAgOiBuZXcgRGF0ZSgpLmdldERhdGUoKS50b1N0cmluZygpLFxyXG4gICAgJ3tofSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0SG91cnMoKS50b1N0cmluZygpLmxlbmd0aCA9PT0gMSA/IGAwJHtuZXcgRGF0ZSgpLmdldEhvdXJzKCl9YCA6IG5ldyBEYXRlKCkuZ2V0SG91cnMoKS50b1N0cmluZygpLFxyXG4gICAgJ3tpfSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0TWludXRlcygpfWAgOiBuZXcgRGF0ZSgpLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLFxyXG4gICAgJ3tzfSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0U2Vjb25kcygpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0U2Vjb25kcygpfWAgOiBuZXcgRGF0ZSgpLmdldFNlY29uZHMoKS50b1N0cmluZygpLFxyXG4gICAgJ3ttZDV9JzogKCkgPT4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShwYXRoLmJhc2VuYW1lKG9sZE5hbWUsIHBhdGguZXh0bmFtZShvbGROYW1lKSkpLmRpZ2VzdCgnaGV4JyksXHJcbiAgICAne21kNS0xNn0nOiAoKSA9PiBjcnlwdG8uY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKHBhdGguYmFzZW5hbWUob2xkTmFtZSwgcGF0aC5leHRuYW1lKG9sZE5hbWUpKSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCAxNiksXHJcbiAgICAne3N0ci0xMH0nOiAoKSA9PiByYW5kb21TdHJpbmdHZW5lcmF0b3IoMTApLFxyXG4gICAgJ3tzdHItMjB9JzogKCkgPT4gcmFuZG9tU3RyaW5nR2VuZXJhdG9yKDIwKSxcclxuICAgICd7ZmlsZW5hbWV9JzogKCkgPT4gYWZmaXhGaWxlTmFtZSA/IHBhdGguYmFzZW5hbWUoYWZmaXhGaWxlTmFtZSwgcGF0aC5leHRuYW1lKGFmZml4RmlsZU5hbWUpKSA6IHBhdGguYmFzZW5hbWUob2xkTmFtZSwgcGF0aC5leHRuYW1lKG9sZE5hbWUpKSxcclxuICAgICd7dXVpZH0nOiAoKSA9PiB1dWlkdjQoKS5yZXBsYWNlKC8tL2csICcnKSxcclxuICAgICd7dGltZXN0YW1wfSc6ICgpID0+IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApLnRvU3RyaW5nKClcclxuICB9XHJcbiAgaWYgKGN1c3RvbUZvcm1hdCA9PT0gdW5kZWZpbmVkIHx8ICghT2JqZWN0LmtleXMoY29udmVyc2lvbk1hcCkuc29tZShpdGVtID0+IGN1c3RvbUZvcm1hdC5pbmNsdWRlcyhpdGVtKSkgJiYgIWN1c3RvbUZvcm1hdC5pbmNsdWRlcygnbG9jYWxGb2xkZXInKSkpIHtcclxuICAgIHJldHVybiBvbGROYW1lXHJcbiAgfVxyXG4gIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShvbGROYW1lKVxyXG4gIGxldCBuZXdOYW1lID0gT2JqZWN0LmtleXMoY29udmVyc2lvbk1hcCkucmVkdWNlKChhY2MsIGN1cikgPT4ge1xyXG4gICAgcmV0dXJuIGFjYy5yZXBsYWNlKG5ldyBSZWdFeHAoY3VyLCAnZycpLCBjb252ZXJzaW9uTWFwW2N1cl0oKSlcclxuICB9LCBjdXN0b21Gb3JtYXQpICsgZXh0XHJcbiAgbmV3TmFtZSA9IG5ld05hbWUucmVwbGFjZSgveyhsb2NhbEZvbGRlcjo/KFxcZCspPyl9L2dpLCAoX3Jlc3VsdCwga2V5LCBjb3VudCkgPT4ge1xyXG4gICAgY291bnQgPSBNYXRoLm1heCgxLCBjb3VudCB8fCAwKVxyXG4gICAgY29uc3QgcGF0aHMgPSBwYXRoLmRpcm5hbWUob2xkTmFtZSkuc3BsaXQocGF0aC5zZXApXHJcbiAgICBrZXkgPSBwYXRocy5zbGljZSgwIC0gY291bnQpLnJlZHVjZSgoYSwgYikgPT4gYCR7YX0vJHtifWApXHJcbiAgICByZXR1cm4ga2V5LnJlcGxhY2UoLzovZywgJycpXHJcbiAgfSlcclxuICByZXR1cm4gbmV3TmFtZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNVcmwgPSAodXJsOiBzdHJpbmcpOiBib29sZWFuID0+ICgvXmh0dHBzPzpcXC9cXC8vKS50ZXN0KHVybClcclxuXHJcbmV4cG9ydCBjb25zdCBpc1VybEVuY29kZSA9ICh1cmw6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIHVybCA9IHVybCB8fCAnJ1xyXG4gIHRyeSB7XHJcbiAgICAvLyB0aGUgd2hvbGUgdXJsIGVuY29kZSBvciBkZWNvZGUgc2hvbGQgbm90IHVzZSBlbmNvZGVVUklDb21wb25lbnQgb3IgZGVjb2RlVVJJQ29tcG9uZW50XHJcbiAgICByZXR1cm4gdXJsICE9PSBkZWNvZGVVUkkodXJsKVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxufVxyXG5leHBvcnQgY29uc3QgaGFuZGxlVXJsRW5jb2RlID0gKHVybDogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBpZiAoIWlzVXJsRW5jb2RlKHVybCkpIHtcclxuICAgIHVybCA9IGVuY29kZVVSSSh1cmwpXHJcbiAgfVxyXG4gIHJldHVybiB1cmxcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEltYWdlU2l6ZSA9IChmaWxlOiBCdWZmZXIpOiBJSW1nU2l6ZSA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHsgd2lkdGggPSAwLCBoZWlnaHQgPSAwIH0gPSBpbWFnZVNpemUoZmlsZSlcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlYWw6IHRydWUsXHJcbiAgICAgIHdpZHRoLFxyXG4gICAgICBoZWlnaHRcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICAvLyBmYWxsYmFjayB0byAyMDAgKiAyMDBcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlYWw6IGZhbHNlLFxyXG4gICAgICB3aWR0aDogMjAwLFxyXG4gICAgICBoZWlnaHQ6IDIwMFxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEZTRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbz4gPT4ge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBleHRuYW1lOiBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLFxyXG4gICAgICBmaWxlTmFtZTogcGF0aC5iYXNlbmFtZShmaWxlUGF0aCksXHJcbiAgICAgIGJ1ZmZlcjogYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpLFxyXG4gICAgICBzdWNjZXNzOiB0cnVlXHJcbiAgICB9XHJcbiAgfSBjYXRjaCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZWFzb246IGByZWFkIGZpbGUgJHtmaWxlUGF0aH0gZXJyb3JgLFxyXG4gICAgICBzdWNjZXNzOiBmYWxzZVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFVSTEZpbGUgPSBhc3luYyAodXJsOiBzdHJpbmcsIGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbz4gPT4ge1xyXG4gIHVybCA9IGhhbmRsZVVybEVuY29kZSh1cmwpXHJcbiAgbGV0IHRpbWVvdXRJZDogTm9kZUpTLlRpbWVvdXRcclxuICBjb25zdCByZXF1ZXN0Rm4gPSBuZXcgUHJvbWlzZTxJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjdHgucmVxdWVzdCh7XHJcbiAgICAgICAgICBtZXRob2Q6ICdnZXQnLFxyXG4gICAgICAgICAgdXJsLFxyXG4gICAgICAgICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWUsXHJcbiAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcidcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgLnRoZW4oKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3AuZGF0YSBhcyBCdWZmZXJcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcclxuICAgICAgICBjb25zdCB1cmxQYXRoID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lXHJcbiAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICBidWZmZXI6IHJlcyxcclxuICAgICAgICAgIGZpbGVOYW1lOiBwYXRoLmJhc2VuYW1lKHVybFBhdGgpLFxyXG4gICAgICAgICAgZXh0bmFtZTogcGF0aC5leHRuYW1lKHVybFBhdGgpLFxyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxyXG4gICAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXHJcbiAgICAgICAgICByZWFzb246IGByZXF1ZXN0ICR7dXJsfSBlcnJvciwgJHtlcnJvcj8ubWVzc2FnZSA/PyAnJ31gXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSkoKS5jYXRjaChyZWplY3QpXHJcbiAgfSlcclxuICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPigocmVzb2x2ZSk6IHZvaWQgPT4ge1xyXG4gICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIHJlYXNvbjogYHJlcXVlc3QgJHt1cmx9IHRpbWVvdXRgXHJcbiAgICAgIH0pXHJcbiAgICB9LCAzMDAwMClcclxuICB9KVxyXG4gIHJldHVybiBQcm9taXNlLnJhY2UoW3JlcXVlc3RGbiwgdGltZW91dFByb21pc2VdKVxyXG59XHJcblxyXG4vKipcclxuICogZGV0ZWN0IHRoZSBpbnB1dCBzdHJpbmcncyB0eXBlXHJcbiAqIGZvciBleGFtcGxlXHJcbiAqIDEuIEB4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBzY29wZVxyXG4gKiAyLiBwaWNnby1wbHVnaW4teHh4IC0+IG5vcm1hbFxyXG4gKiAzLiB4eHggLT4gc2ltcGxlXHJcbiAqIDQuIG5vdCBleGlzdHMgb3IgaXMgYSBwYXRoIC0+IHVua25vd25cclxuICogQHBhcmFtIG5hbWVcclxuICovXHJcbmV4cG9ydCBjb25zdCBnZXRQbHVnaW5OYW1lVHlwZSA9IChuYW1lOiBzdHJpbmcpOiBJUGx1Z2luTmFtZVR5cGUgPT4ge1xyXG4gIGlmICgvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLnRlc3QobmFtZSkpIHtcclxuICAgIHJldHVybiAnc2NvcGUnXHJcbiAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ3BpY2dvLXBsdWdpbi0nKSkge1xyXG4gICAgcmV0dXJuICdub3JtYWwnXHJcbiAgfSBlbHNlIGlmIChpc1NpbXBsZU5hbWUobmFtZSkpIHtcclxuICAgIHJldHVybiAnc2ltcGxlJ1xyXG4gIH1cclxuICByZXR1cm4gJ3Vua25vd24nXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBkZXRlY3QgdGhlIGlucHV0IHN0cmluZyBpcyBhIHNpbXBsZSBwbHVnaW4gbmFtZSBvciBub3RcclxuICogZm9yIGV4YW1wbGVcclxuICogMS4geHh4IC0+IHRydWVcclxuICogMi4gL1Vzci94eC94eHh4L3BpY2dvLXBsdWdpbi14eHggLT4gZmFsc2VcclxuICogQHBhcmFtIG5hbWUgcGx1Z2luTmFtZU9yUGF0aFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzU2ltcGxlTmFtZSA9IChuYW1lT3JQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICBpZiAocGF0aC5pc0Fic29sdXRlKG5hbWVPclBhdGgpKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBuYW1lT3JQYXRoKVxyXG4gIGlmIChmcy5leGlzdHNTeW5jKHBsdWdpblBhdGgpKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgaWYgKG5hbWVPclBhdGguaW5jbHVkZXMoJy8nKSB8fCBuYW1lT3JQYXRoLmluY2x1ZGVzKCdcXFxcJykpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuICByZXR1cm4gdHJ1ZVxyXG59XHJcblxyXG4vKipcclxuICogc3RyZWFtbGluZSB0aGUgZnVsbCBwbHVnaW4gbmFtZSB0byBhIHNpbXBsZSBvbmVcclxuICogZm9yIGV4YW1wbGU6XHJcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHggLT4geHh4XHJcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXl5eSAtPiB5eXlcclxuICogQHBhcmFtIG5hbWUgcGx1Z2luRnVsbE5hbWVcclxuICovXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVTdHJlYW1saW5lUGx1Z2luTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGlmICgvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLnRlc3QobmFtZSkpIHtcclxuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL15AW14vXStcXC9waWNnby1wbHVnaW4tLywgJycpXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL3BpY2dvLXBsdWdpbi0vLCAnJylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBjb21wbGV0ZSBwbHVnaW4gbmFtZSB0byBmdWxsIG5hbWVcclxuICogZm9yIGV4YW1wbGU6XHJcbiAqIDEuIHh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDIuIHBpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiBAcGFyYW0gbmFtZSBwbHVnaW5TaW1wbGVOYW1lXHJcbiAqIEBwYXJhbSBzY29wZSBwbHVnaW5TY29wZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGhhbmRsZUNvbXBsZXRlUGx1Z2luTmFtZSA9IChuYW1lOiBzdHJpbmcsIHNjb3BlID0gJycpOiBzdHJpbmcgPT4ge1xyXG4gIGlmIChzY29wZSkge1xyXG4gICAgcmV0dXJuIGBAJHtzY29wZX0vcGljZ28tcGx1Z2luLSR7bmFtZX1gXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBgcGljZ28tcGx1Z2luLSR7bmFtZX1gXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogaGFuZGxlIGluc3RhbGwvdW5pbnN0YWxsL3VwZGF0ZSBwbHVnaW4gbmFtZSBvciBwYXRoXHJcbiAqIGZvciBleGFtcGxlXHJcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAyLiBAeHh4L3BpY2dvLXBsdWdpbi14eHggLT4gQHh4eC9waWNnby1wbHVnaW4teHh4XHJcbiAqIDMuIHh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDQuIC4veHh4eC9waWNnby1wbHVnaW4teHh4IC0+IC9hYnNvbHV0ZVBhdGgvLi4uL3h4eHgvcGljZ28tcGx1Z2luLXh4eFxyXG4gKiA1LiAvYWJzb2x1dGVQYXRoLy4uLi9waWNnby1wbHVnaW4teHh4IC0+IC9hYnNvbHV0ZVBhdGgvLi4uL3BpY2dvLXBsdWdpbi14eHhcclxuICogQHBhcmFtIG5hbWVPclBhdGggcGx1Z2luTmFtZSBvciBwbHVnaW5QYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0UHJvY2Vzc1BsdWdpbk5hbWUgPSAobmFtZU9yUGF0aDogc3RyaW5nLCBsb2dnZXI6IElMb2dnZXIgfCBDb25zb2xlID0gY29uc29sZSk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgcGx1Z2luTmFtZVR5cGUgPSBnZXRQbHVnaW5OYW1lVHlwZShuYW1lT3JQYXRoKVxyXG4gIHN3aXRjaCAocGx1Z2luTmFtZVR5cGUpIHtcclxuICAgIGNhc2UgJ25vcm1hbCc6XHJcbiAgICBjYXNlICdzY29wZSc6XHJcbiAgICAgIHJldHVybiBuYW1lT3JQYXRoXHJcbiAgICBjYXNlICdzaW1wbGUnOlxyXG4gICAgICByZXR1cm4gaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lKG5hbWVPclBhdGgpXHJcbiAgICBkZWZhdWx0OiB7XHJcbiAgICAgIC8vIG5vdywgdGhlIHBsdWdpbk5hbWVUeXBlIGlzIHVua25vdyBoZXJlXHJcbiAgICAgIC8vIDEuIGNoZWNrIGlmIGlzIGFuIGFic29sdXRlIHBhdGhcclxuICAgICAgbGV0IHBsdWdpblBhdGggPSBuYW1lT3JQYXRoXHJcbiAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUobmFtZU9yUGF0aCkgJiYgZnMuZXhpc3RzU3luYyhuYW1lT3JQYXRoKSkge1xyXG4gICAgICAgIHJldHVybiBoYW5kbGVVbml4U3R5bGVQYXRoKHBsdWdpblBhdGgpXHJcbiAgICAgIH1cclxuICAgICAgLy8gMi4gY2hlY2sgaWYgaXMgYSByZWxhdGl2ZSBwYXRoXHJcbiAgICAgIHBsdWdpblBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgbmFtZU9yUGF0aClcclxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGx1Z2luUGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gaGFuZGxlVW5peFN0eWxlUGF0aChwbHVnaW5QYXRoKVxyXG4gICAgICB9XHJcbiAgICAgIC8vIDMuIGludmFsaWQgbmFtZU9yUGF0aFxyXG4gICAgICBsb2dnZXIud2FybihgQ2FuJ3QgZmluZCBwbHVnaW4gJHtuYW1lT3JQYXRofWApXHJcbiAgICAgIHJldHVybiAnJ1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIGdldCB0aGUgbm9ybWFsIHBsdWdpbiBuYW1lXHJcbiAqIGZvciBleGFtcGxlOlxyXG4gKiAxLiBwaWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogMi4gQHh4eC9waWNnby1wbHVnaW4teHh4IC0+IEB4eHgvcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAzLiAuL3h4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDQuIC9hYnNvbHV0ZVBhdGgvLi4uL3BpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiA1LiBhbiBleGNlcHRpb246IFtwYWNrYWdlLmpzb24ncyBuYW1lXSAhPT0gW2ZvbGRlciBuYW1lXVxyXG4gKiB0aGVuIHVzZSBbcGFja2FnZS5qc29uJ3MgbmFtZV0sIHVzdWFsbHkgbWF0Y2ggdGhlIHNjb3BlIHBhY2thZ2UuXHJcbiAqIDYuIGlmIHBsdWdpbiBuYW1lIGhhcyB2ZXJzaW9uOiBwaWNnby1wbHVnaW4teHh4QHgueC54IHRoZW4gcmVtb3ZlIHRoZSB2ZXJzaW9uXHJcbiAqIEBwYXJhbSBuYW1lT3JQYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0Tm9ybWFsUGx1Z2luTmFtZSA9IChuYW1lT3JQYXRoOiBzdHJpbmcsIGxvZ2dlcjogSUxvZ2dlciB8IENvbnNvbGUgPSBjb25zb2xlKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwbHVnaW5OYW1lVHlwZSA9IGdldFBsdWdpbk5hbWVUeXBlKG5hbWVPclBhdGgpXHJcbiAgc3dpdGNoIChwbHVnaW5OYW1lVHlwZSkge1xyXG4gICAgY2FzZSAnbm9ybWFsJzpcclxuICAgICAgcmV0dXJuIHJlbW92ZVBsdWdpblZlcnNpb24obmFtZU9yUGF0aClcclxuICAgIGNhc2UgJ3Njb3BlJzpcclxuICAgICAgcmV0dXJuIHJlbW92ZVBsdWdpblZlcnNpb24obmFtZU9yUGF0aCwgdHJ1ZSlcclxuICAgIGNhc2UgJ3NpbXBsZSc6XHJcbiAgICAgIHJldHVybiByZW1vdmVQbHVnaW5WZXJzaW9uKGhhbmRsZUNvbXBsZXRlUGx1Z2luTmFtZShuYW1lT3JQYXRoKSlcclxuICAgIGRlZmF1bHQ6IHtcclxuICAgICAgLy8gbm93LCB0aGUgbmFtZU9yUGF0aCBtdXN0IGJlIHBhdGhcclxuICAgICAgLy8gdGhlIG5hbWVPclBhdGggaGVyZSB3aWxsIGJlIGVuc3VyZWQgd2l0aCB1bml4IHN0eWxlXHJcbiAgICAgIC8vIHdlIG5lZWQgdG8gZmluZCB0aGUgcGFja2FnZS5qc29uJ3MgbmFtZSBjYXVzZSBucG0gdXNpbmcgdGhlIG5hbWUgaW4gcGFja2FnZS5qc29uJ3MgbmFtZSBmaWxlZFxyXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobmFtZU9yUGF0aCkpIHtcclxuICAgICAgICBsb2dnZXIud2FybihgQ2FuJ3QgZmluZCBwbHVnaW46ICR7bmFtZU9yUGF0aH1gKVxyXG4gICAgICAgIHJldHVybiAnJ1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHBhY2thZ2VKU09OUGF0aCA9IHBhdGgucG9zaXguam9pbihuYW1lT3JQYXRoLCAncGFja2FnZS5qc29uJylcclxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKU09OUGF0aCkpIHtcclxuICAgICAgICBsb2dnZXIud2FybihgQ2FuJ3QgZmluZCBwbHVnaW46ICR7bmFtZU9yUGF0aH1gKVxyXG4gICAgICAgIHJldHVybiAnJ1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHBrZyA9IGZzLnJlYWRKU09OU3luYyhwYWNrYWdlSlNPTlBhdGgpIHx8IHt9XHJcbiAgICAgICAgaWYgKCFwa2cubmFtZT8uaW5jbHVkZXMoJ3BpY2dvLXBsdWdpbi0nKSkge1xyXG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFRoZSBwbHVnaW4gcGFja2FnZS5qc29uJ3MgbmFtZSBmaWxlZCBpcyAke3BrZy5uYW1lIGFzIHN0cmluZyB8fCAnZW1wdHknfSwgbmVlZCB0byBpbmNsdWRlIHRoZSBwcmVmaXg6IHBpY2dvLXBsdWdpbi1gKVxyXG4gICAgICAgICAgcmV0dXJuICcnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwa2cubmFtZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogaGFuZGxlIHRyYW5zZm9ybSB0aGUgcGF0aCB0byB1bml4IHN0eWxlXHJcbiAqIGZvciBleGFtcGxlXHJcbiAqIDEuIEM6XFxcXHh4eFxcXFx4eHggLT4gQzoveHh4L3h4eFxyXG4gKiAyLiAveHh4L3h4eCAtPiAveHh4L3h4eFxyXG4gKiBAcGFyYW0gcGF0aFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGhhbmRsZVVuaXhTdHlsZVBhdGggPSAocGF0aFN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwYXRoQXJyID0gcGF0aFN0ci5zcGxpdChwYXRoLnNlcClcclxuICByZXR1cm4gcGF0aEFyci5qb2luKCcvJylcclxufVxyXG5cclxuLyoqXHJcbiAqIHJlbW92ZSBwbHVnaW4gdmVyc2lvbiB3aGVuIHJlZ2lzdGVyIHBsdWdpbiBuYW1lXHJcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHhAMS4wLjAgLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAyLiBAeHh4L3BpY2dvLXBsdWdpbi14eHhAMS4wLjAgLT4gQHh4eC9waWNnby1wbHVnaW4teHh4XHJcbiAqIEBwYXJhbSBuYW1lT3JQYXRoXHJcbiAqIEBwYXJhbSBzY29wZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbW92ZVBsdWdpblZlcnNpb24gPSAobmFtZU9yUGF0aDogc3RyaW5nLCBzY29wZTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nID0+IHtcclxuICBpZiAoIW5hbWVPclBhdGguaW5jbHVkZXMoJ0AnKSkge1xyXG4gICAgcmV0dXJuIG5hbWVPclBhdGhcclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IHJlZyA9IC8oLitcXC8pPyhwaWNnby1wbHVnaW4tXFx3KykoQC4rKSovXHJcbiAgICAvLyBpZiBpcyBhIHNjb3BlIHBrZ1xyXG4gICAgaWYgKHNjb3BlKSB7XHJcbiAgICAgIHJlZyA9IC8oLitcXC8pPyheQFteL10rXFwvcGljZ28tcGx1Z2luLVxcdyspKEAuKykqL1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWF0Y2hBcnIgPSBuYW1lT3JQYXRoLm1hdGNoKHJlZylcclxuICAgIGlmICghbWF0Y2hBcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdjYW4gbm90IHJlbW92ZSBwbHVnaW4gdmVyc2lvbicpXHJcbiAgICAgIHJldHVybiBuYW1lT3JQYXRoXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbWF0Y2hBcnJbMl1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0aGUgY29uZmlnIGJsYWNrIGl0ZW0gbGlzdCB3aGljaCB3b24ndCBiZSBzZXR0ZWRcclxuICogb25seSBjYW4gYmUgZ290XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29uZmlnQmxhY2tMaXN0ID0gW11cclxuXHJcbi8qKlxyXG4gKiBjaGVjayBzb21lIGNvbmZpZyBrZXkgaXMgaW4gYmxhY2tMaXN0XHJcbiAqIEBwYXJhbSBrZXlcclxuICovXHJcbmV4cG9ydCBjb25zdCBpc0NvbmZpZ0tleUluQmxhY2tMaXN0ID0gKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIGNvbmZpZ0JsYWNrTGlzdC5zb21lKGJsYWNrSXRlbSA9PiBrZXkuc3RhcnRzV2l0aChibGFja0l0ZW0pKVxyXG59XHJcblxyXG4vKipcclxuICogY2hlY2sgdGhlIGlucHV0IGNvbmZpZyBpcyB2YWxpZFxyXG4gKiBjb25maWcgbXVzdCBiZSBvYmplY3Qgc3VjaCBhcyB7IHh4eDogJ3h4eCcgfVxyXG4gKiAmJiBjYW4ndCBiZSBhcnJheVxyXG4gKiBAcGFyYW0gY29uZmlnXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXNJbnB1dENvbmZpZ1ZhbGlkID0gKGNvbmZpZzogYW55KTogYm9vbGVhbiA9PiB7XHJcbiAgaWYgKFxyXG4gICAgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiZcclxuICAgICFBcnJheS5pc0FycmF5KGNvbmZpZykgJiZcclxuICAgIE9iamVjdC5rZXlzKGNvbmZpZykubGVuZ3RoID4gMFxyXG4gICkge1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcbiAgcmV0dXJuIGZhbHNlXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzYWZlUGFyc2U8VD4gKHN0cjogc3RyaW5nKTogVCB8IHN0cmluZyB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHN0cilcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgcmV0dXJuIHN0clxyXG4gIH1cclxufVxyXG5cclxuLy8gaG9sZC4uLlxyXG4vLyBleHBvcnQgY29uc3QgY29uZmlnV2hpdGVMaXN0OiBSZWdFeHBbXSA9IFtcclxuLy8gICAvXnBpY0JlZC8sXHJcbi8vICAgL15waWNnb1BsdWdpbnMvLFxyXG4vLyAgIC9eQFteL10rXFwvcGljZ28tcGx1Z2luLS8sXHJcbi8vICAgL2RlYnVnLyxcclxuLy8gICAvc2lsZW50LyxcclxuLy8gICAvY29uZmlnUGF0aC8sXHJcbi8vICAgL15zZXR0aW5ncy8sXHJcbi8vIF1cclxuXHJcbi8vIGV4cG9ydCBjb25zdCBpc0NvbmZpZ0tleUluV2hpdGVMaXN0ID0gKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbi8vICAgcmV0dXJuIGNvbmZpZ1doaXRlTGlzdC5zb21lKHdoaXRlSXRlbSA9PiB3aGl0ZUl0ZW0udGVzdChrZXkpKVxyXG4vLyB9XHJcblxyXG5leHBvcnQgY29uc3QgZm9yY2VOdW1iZXIgPSAobnVtOiBzdHJpbmcgfCBudW1iZXIgPSAwKTogbnVtYmVyID0+IHtcclxuICByZXR1cm4gaXNOYU4oTnVtYmVyKG51bSkpID8gMCA6IE51bWJlcihudW0pXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc0RldiA9ICgpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCdcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzUHJvZCA9ICgpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJ1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiB0ZXh0MlNWRyAoXHJcbiAgZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoOiBzdHJpbmcsXHJcbiAgdGV4dD86IHN0cmluZyxcclxuICBjb2xvcj86IHN0cmluZyxcclxuICBmb250RmFtaWx5Pzogc3RyaW5nXHJcbik6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgdGV4dCA9ICF0ZXh0ID8gJ+a1i+ivlScgOiB0ZXh0XHJcbiAgZm9udEZhbWlseSA9ICFmb250RmFtaWx5ID8gZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoIDogZm9udEZhbWlseVxyXG4gIGNvbG9yID0gIWNvbG9yID8gJ3JnYmEoMjA0LCAyMDQsIDIwNCwgMC40NSknIDogY29sb3JcclxuICBjb25zdCB0ZXh0MlNWRyA9IFRleHRUb1NWRy5sb2FkU3luYyhmb250RmFtaWx5KVxyXG4gIGNvbnN0IG9wdGlvbnM6IFRleHRUb1NWRy5HZW5lcmF0aW9uT3B0aW9ucyA9IHtcclxuICAgIGFuY2hvcjogJ3RvcCcsXHJcbiAgICBhdHRyaWJ1dGVzOiB7XHJcbiAgICAgIGZpbGw6IGNvbG9yXHJcbiAgICB9XHJcbiAgfVxyXG4gIGNvbnN0IHRleHRTVkcgPSB0ZXh0MlNWRy5nZXRTVkcodGV4dCwgb3B0aW9ucylcclxuICBjb25zdCBzdmcgPSBCdWZmZXIuZnJvbSh0ZXh0U1ZHKVxyXG4gIHJldHVybiBzdmdcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdFdhdGVybWFya0ltYWdlUGF0aCA9IGAke19fZGlybmFtZX0vYXNzZXRzL3BpY2xpc3QucG5nYFxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEFkZFdhdGVybWFyayAoXHJcbiAgaW1nOiBCdWZmZXIsXHJcbiAgd2F0ZXJtYXJrVHlwZTogJ3RleHQnIHwgJ2ltYWdlJyxcclxuICBkZWZhdWx0V2F0ZXJtYXJrRm9udFBhdGg6IHN0cmluZyxcclxuICBpc0Z1bGxTY3JlZW5XYXRlcm1hcms/OiBib29sZWFuLFxyXG4gIHdhdGVybWFya0RlZ3JlZT86IG51bWJlcixcclxuICB0ZXh0Pzogc3RyaW5nLFxyXG4gIHdhdGVybWFya0ZvbnRQYXRoPzogc3RyaW5nLFxyXG4gIHdhdGVybWFya1NjYWxlUmF0aW8/OiBudW1iZXIsXHJcbiAgd2F0ZXJtYXJrQ29sb3I/OiBzdHJpbmcsXHJcbiAgd2F0ZXJtYXJrSW1hZ2VQYXRoPzogc3RyaW5nLFxyXG4gIHBvc2l0aW9uPzogc2hhcnAuR3Jhdml0eVxyXG4pOiBQcm9taXNlPEJ1ZmZlcj4ge1xyXG4gIHdhdGVybWFya1NjYWxlUmF0aW8gPSAhd2F0ZXJtYXJrU2NhbGVSYXRpbyB8fCB3YXRlcm1hcmtTY2FsZVJhdGlvIDwgMCB8fCB3YXRlcm1hcmtTY2FsZVJhdGlvID4gMSA/IDAuMTUgOiB3YXRlcm1hcmtTY2FsZVJhdGlvXHJcbiAgY29uc3QgaW1hZ2UgPSBzaGFycChpbWcpXHJcbiAgY29uc3QgeyB3aWR0aDogaW1nV2lkdGggPSAyMDAgfSA9IGF3YWl0IGltYWdlLm1ldGFkYXRhKClcclxuICBjb25zdCB3YXRlcm1hcmsgPSBhd2FpdCBjcmVhdGVXYXRlcm1hcmsoXHJcbiAgICB3YXRlcm1hcmtUeXBlLFxyXG4gICAgZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoLFxyXG4gICAgdGV4dCxcclxuICAgIHdhdGVybWFya0ZvbnRQYXRoLFxyXG4gICAgd2F0ZXJtYXJrU2NhbGVSYXRpbyxcclxuICAgIHdhdGVybWFya0NvbG9yLFxyXG4gICAgd2F0ZXJtYXJrSW1hZ2VQYXRoLFxyXG4gICAgaW1nV2lkdGgsXHJcbiAgICB3YXRlcm1hcmtEZWdyZWVcclxuICApXHJcbiAgY29uc3QgY29tcG9zaXRlZCA9IGF3YWl0IGltYWdlXHJcbiAgICAuY29tcG9zaXRlKFtcclxuICAgICAge1xyXG4gICAgICAgIGlucHV0OiB3YXRlcm1hcmssXHJcbiAgICAgICAgZ3Jhdml0eTogcG9zaXRpb24gfHwgJ3NvdXRoZWFzdCcsXHJcbiAgICAgICAgdGlsZTogaXNGdWxsU2NyZWVuV2F0ZXJtYXJrXHJcbiAgICAgIH1cclxuICAgIF0pXHJcbiAgICAudG9CdWZmZXIoKVxyXG4gIHJldHVybiBjb21wb3NpdGVkXHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdhdGVybWFyayAoXHJcbiAgd2F0ZXJtYXJrVHlwZTogJ3RleHQnIHwgJ2ltYWdlJyxcclxuICBkZWZhdWx0V2F0ZXJtYXJrRm9udFBhdGg6IHN0cmluZyxcclxuICB0ZXh0Pzogc3RyaW5nLFxyXG4gIHdhdGVybWFya0ZvbnRQYXRoPzogc3RyaW5nLFxyXG4gIHdhdGVybWFya1NjYWxlUmF0aW8/OiBudW1iZXIsXHJcbiAgd2F0ZXJtYXJrQ29sb3I/OiBzdHJpbmcsXHJcbiAgd2F0ZXJtYXJrSW1hZ2VQYXRoPzogc3RyaW5nLFxyXG4gIGltZ1dpZHRoOiBudW1iZXIgPSAyMDAsXHJcbiAgd2F0ZXJtYXJrRGVncmVlOiBudW1iZXIgPSAwXHJcbik6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgbGV0IHdhdGVybWFyazogYW55XHJcbiAgaWYgKHdhdGVybWFya1R5cGUgPT09ICdpbWFnZScpIHtcclxuICAgIHdhdGVybWFya0ltYWdlUGF0aCA9IHdhdGVybWFya0ltYWdlUGF0aCB8fCBkZWZhdWx0V2F0ZXJtYXJrSW1hZ2VQYXRoXHJcbiAgICB3YXRlcm1hcmsgPSBhd2FpdCBzaGFycCh3YXRlcm1hcmtJbWFnZVBhdGgpLnRvQnVmZmVyKClcclxuICB9IGVsc2Uge1xyXG4gICAgd2F0ZXJtYXJrID0gYXdhaXQgdGV4dDJTVkcoXHJcbiAgICAgIGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aCxcclxuICAgICAgdGV4dCxcclxuICAgICAgd2F0ZXJtYXJrQ29sb3IsXHJcbiAgICAgIHdhdGVybWFya0ZvbnRQYXRoIHx8IGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aFxyXG4gICAgKVxyXG4gIH1cclxuICBjb25zdCB7IHdpZHRoOiB3YXRlcm1hcmtXaWR0aCwgaGVpZ2h0OiB3YXRlcm1hcmtIZWlnaHQgfSA9IGF3YWl0IGdldFNpemUoXHJcbiAgICB3YXRlcm1hcmtcclxuICApXHJcbiAgY29uc3Qgd2F0ZXJtYXJrUmVzaXplV2lkdGggPSBNYXRoLmZsb29yKGltZ1dpZHRoICogZm9yY2VOdW1iZXIod2F0ZXJtYXJrU2NhbGVSYXRpbykpXHJcbiAgY29uc3Qgd2F0ZXJtYXJrUmVzaXplSGVpZ2h0ID0gTWF0aC5mbG9vcihcclxuICAgICh3YXRlcm1hcmtSZXNpemVXaWR0aCAqIHdhdGVybWFya0hlaWdodCkgLyB3YXRlcm1hcmtXaWR0aFxyXG4gIClcclxuICByZXR1cm4gYXdhaXQgc2hhcnAod2F0ZXJtYXJrKVxyXG4gICAgLnJlc2l6ZSh3YXRlcm1hcmtSZXNpemVXaWR0aCwgd2F0ZXJtYXJrUmVzaXplSGVpZ2h0LCB7XHJcbiAgICAgIGZpdDogJ2luc2lkZSdcclxuICAgIH0pXHJcbiAgICAucm90YXRlKHdhdGVybWFya0RlZ3JlZSwgeyBiYWNrZ3JvdW5kOiB7IHI6IDI1NSwgZzogMjU1LCBiOiAyNTUsIGFscGhhOiAwIH0gfSlcclxuICAgIC50b0J1ZmZlcigpXHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldFNpemUgKGltYWdlOiBCdWZmZXIpOiBQcm9taXNlPHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfT4ge1xyXG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYXdhaXQgc2hhcnAoaW1hZ2UpLm1ldGFkYXRhKClcclxuICByZXR1cm4geyB3aWR0aDogd2lkdGggfHwgMjAwLCBoZWlnaHQ6IGhlaWdodCB8fCAyMDAgfVxyXG59XHJcblxyXG5jb25zdCB2YWxpZFBhcmFtID0gKC4uLnBhcmFtczogYW55W10pOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gcGFyYW1zLmV2ZXJ5KHBhcmFtID0+IHtcclxuICAgIGlmIChwYXJhbSA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIHBhcmFtICE9PSAnJ1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgcmV0dXJuIHBhcmFtID4gMFxyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtKS5sZW5ndGggPiAwXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IGF2YWlsYWJsZUNvbnZlcnRGb3JtYXRMaXN0ID0gW1xyXG4gICdhdmlmJyxcclxuICAnZHonLFxyXG4gICdmaXRzJyxcclxuICAnZ2lmJyxcclxuICAnaGVpZicsXHJcbiAgJ2lucHV0JyxcclxuICAnanBlZycsXHJcbiAgJ2pwZycsXHJcbiAgJ2pwMicsXHJcbiAgJ2p4bCcsXHJcbiAgJ21hZ2ljaycsXHJcbiAgJ29wZW5zbGlkZScsXHJcbiAgJ3BkZicsXHJcbiAgJ3BuZycsXHJcbiAgJ3BwbScsXHJcbiAgJ3JhdycsXHJcbiAgJ3N2ZycsXHJcbiAgJ3RpZmYnLFxyXG4gICd0aWYnLFxyXG4gICd2JyxcclxuICAnd2VicCdcclxuXVxyXG5cclxuY29uc3QgdmFsaWRPdXRwdXRGb3JtYXQgPSAoZm9ybWF0OiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gYXZhaWxhYmxlQ29udmVydEZvcm1hdExpc3QuaW5jbHVkZXMoZm9ybWF0KVxyXG59XHJcblxyXG5jb25zdCBpbWFnZUV4dExpc3QgPSBbJ2pwZycsICdqcGVnJywgJ3BuZycsICdnaWYnLCAnd2VicCcsICdibXAnLCAndGlmZicsICd0aWYnLCAnc3ZnJywgJ2ljbycsICdhdmlmJywgJ2hlaWYnLCAnaGVpYyddXHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1hZ2VBZGRXYXRlck1hcmsgKGltZzogQnVmZmVyLCBvcHRpb25zOiBJQnVpbGRJbldhdGVyTWFya09wdGlvbnMsIGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICB0cnkge1xyXG4gICAgbGV0IGltYWdlOiBzaGFycC5TaGFycCA9IHNoYXJwKGltZylcclxuICAgIGlmICh2YWxpZFBhcmFtKG9wdGlvbnMud2F0ZXJtYXJrVGV4dCkpIHtcclxuICAgICAgaW1hZ2UgPSBzaGFycChhd2FpdCBBZGRXYXRlcm1hcmsoXHJcbiAgICAgICAgaW1nLFxyXG4gICAgICAgIG9wdGlvbnMud2F0ZXJtYXJrVHlwZSB8fCAndGV4dCcsXHJcbiAgICAgICAgZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoLFxyXG4gICAgICAgIG9wdGlvbnMuaXNGdWxsU2NyZWVuV2F0ZXJtYXJrLFxyXG4gICAgICAgIGZvcmNlTnVtYmVyKG9wdGlvbnMud2F0ZXJtYXJrRGVncmVlKSxcclxuICAgICAgICBvcHRpb25zLndhdGVybWFya1RleHQsXHJcbiAgICAgICAgb3B0aW9ucy53YXRlcm1hcmtGb250UGF0aCxcclxuICAgICAgICBmb3JjZU51bWJlcihvcHRpb25zLndhdGVybWFya1NjYWxlUmF0aW8pLFxyXG4gICAgICAgIG9wdGlvbnMud2F0ZXJtYXJrQ29sb3IsXHJcbiAgICAgICAgb3B0aW9ucy53YXRlcm1hcmtJbWFnZVBhdGgsXHJcbiAgICAgICAgb3B0aW9ucy53YXRlcm1hcmtQb3NpdGlvblxyXG4gICAgICApKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IGltYWdlLnRvQnVmZmVyKClcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5sb2coZXJyb3IpXHJcbiAgICByZXR1cm4gaW1nXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtYXRPcHRpb25zIChvcHRpb25zOiBJQnVpbGRJbkNvbXByZXNzT3B0aW9ucyk6IElCdWlsZEluQ29tcHJlc3NPcHRpb25zIHtcclxuICByZXR1cm4ge1xyXG4gICAgcXVhbGl0eTogZm9yY2VOdW1iZXIob3B0aW9ucy5xdWFsaXR5KSxcclxuICAgIGlzQ29udmVydDogb3B0aW9ucy5pc0NvbnZlcnQgfHwgZmFsc2UsXHJcbiAgICBjb252ZXJ0Rm9ybWF0OiBvcHRpb25zLmNvbnZlcnRGb3JtYXQgfHwgJ2pwZycsXHJcbiAgICBpc1JlU2l6ZTogb3B0aW9ucy5pc1JlU2l6ZSB8fCBmYWxzZSxcclxuICAgIHJlU2l6ZUhlaWdodDogZm9yY2VOdW1iZXIob3B0aW9ucy5yZVNpemVIZWlnaHQpLFxyXG4gICAgcmVTaXplV2lkdGg6IGZvcmNlTnVtYmVyKG9wdGlvbnMucmVTaXplV2lkdGgpLFxyXG4gICAgaXNSZVNpemVCeVBlcmNlbnQ6IG9wdGlvbnMuaXNSZVNpemVCeVBlcmNlbnQgfHwgZmFsc2UsXHJcbiAgICByZVNpemVQZXJjZW50OiBmb3JjZU51bWJlcihvcHRpb25zLnJlU2l6ZVBlcmNlbnQpLFxyXG4gICAgaXNSb3RhdGU6IG9wdGlvbnMuaXNSb3RhdGUgfHwgZmFsc2UsXHJcbiAgICByb3RhdGVEZWdyZWU6IGZvcmNlTnVtYmVyKG9wdGlvbnMucm90YXRlRGVncmVlKSxcclxuICAgIHBpY0JlZDogb3B0aW9ucy5waWNCZWQgfHwgJ3NtbXMnXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1hZ2VQcm9jZXNzIChpbWc6IEJ1ZmZlciwgb3B0aW9uczogSUJ1aWxkSW5Db21wcmVzc09wdGlvbnMsIHJhd0Zvcm1hdDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICBvcHRpb25zID0gZm9ybWF0T3B0aW9ucyhvcHRpb25zKVxyXG4gIHRyeSB7XHJcbiAgICByYXdGb3JtYXQgPSByYXdGb3JtYXQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCcuJywgJycpXHJcbiAgICBpZiAoIWltYWdlRXh0TGlzdC5pbmNsdWRlcyhyYXdGb3JtYXQpKSB7XHJcbiAgICAgIHJldHVybiBpbWdcclxuICAgIH1cclxuICAgIGxldCBpbWFnZTogc2hhcnAuU2hhcnAgPSBzaGFycChpbWcpXHJcbiAgICBsZXQgcXVhbGl0eSA9IDEwMFxyXG4gICAgaWYgKHZhbGlkUGFyYW0ob3B0aW9ucy5xdWFsaXR5KSAmJiBvcHRpb25zLnF1YWxpdHkhIDwgMTAwKSB7XHJcbiAgICAgIHF1YWxpdHkgPSBvcHRpb25zLnF1YWxpdHkhXHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5pc1JlU2l6ZUJ5UGVyY2VudCkge1xyXG4gICAgICBpZiAodmFsaWRQYXJhbShvcHRpb25zLnJlU2l6ZVBlcmNlbnQpKSB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VXaWR0aCA9IGF3YWl0IGltYWdlLm1ldGFkYXRhKCkudGhlbihtZXRhZGF0YSA9PiBtZXRhZGF0YS53aWR0aClcclxuICAgICAgICBjb25zdCBpbWFnZUhlaWdodCA9IGF3YWl0IGltYWdlLm1ldGFkYXRhKCkudGhlbihtZXRhZGF0YSA9PiBtZXRhZGF0YS5oZWlnaHQpXHJcbiAgICAgICAgaWYgKGltYWdlV2lkdGggJiYgaW1hZ2VIZWlnaHQpIHtcclxuICAgICAgICAgIGltYWdlID0gaW1hZ2UucmVzaXplKFxyXG4gICAgICAgICAgICBNYXRoLnJvdW5kKGltYWdlV2lkdGggKiBvcHRpb25zLnJlU2l6ZVBlcmNlbnQhIC8gMTAwKSxcclxuICAgICAgICAgICAgTWF0aC5yb3VuZChpbWFnZUhlaWdodCAqIG9wdGlvbnMucmVTaXplUGVyY2VudCEgLyAxMDApLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZml0OiAnaW5zaWRlJ1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmlzUmVTaXplKSB7XHJcbiAgICAgIGlmICh2YWxpZFBhcmFtKG9wdGlvbnMucmVTaXplSGVpZ2h0LCBvcHRpb25zLnJlU2l6ZVdpZHRoKSkge1xyXG4gICAgICAgIGltYWdlID0gaW1hZ2UucmVzaXplKFxyXG4gICAgICAgICAgb3B0aW9ucy5yZVNpemVXaWR0aCxcclxuICAgICAgICAgIG9wdGlvbnMucmVTaXplSGVpZ2h0LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaXQ6ICdpbnNpZGUnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5pc1JvdGF0ZSAmJiBvcHRpb25zLnJvdGF0ZURlZ3JlZSkge1xyXG4gICAgICBpbWFnZSA9IGltYWdlLnJvdGF0ZShvcHRpb25zLnJvdGF0ZURlZ3JlZSwgeyBiYWNrZ3JvdW5kOiB7IHI6IDI1NSwgZzogMjU1LCBiOiAyNTUsIGFscGhhOiAwIH0gfSlcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25zLmlzQ29udmVydCAmJiByYXdGb3JtYXQgIT09ICdnaWYnKSB7XHJcbiAgICAgIGxldCBuZXdGb3JtYXQgPSBvcHRpb25zLmNvbnZlcnRGb3JtYXQgfHwgJ2pwZydcclxuICAgICAgaWYgKG9wdGlvbnMucGljQmVkID09PSAnaW1ndXInICYmIG5ld0Zvcm1hdCA9PT0gJ3dlYnAnKSB7XHJcbiAgICAgICAgbmV3Rm9ybWF0ID0gJ2pwZydcclxuICAgICAgfVxyXG4gICAgICBpbWFnZSA9IGltYWdlLnRvRm9ybWF0KG5ld0Zvcm1hdCwge1xyXG4gICAgICAgIHF1YWxpdHlcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChyYXdGb3JtYXQgJiYgdmFsaWRPdXRwdXRGb3JtYXQocmF3Rm9ybWF0KSkge1xyXG4gICAgICAgIGltYWdlID0gaW1hZ2UudG9Gb3JtYXQocmF3Rm9ybWF0IGFzIGFueSwge1xyXG4gICAgICAgICAgcXVhbGl0eVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW1hZ2UgPSBpbWFnZS50b0Zvcm1hdCgnanBnJywge1xyXG4gICAgICAgICAgcXVhbGl0eVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhd2FpdCBpbWFnZS50b0J1ZmZlcigpXHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIGNvbnNvbGUubG9nKGVycm9yKVxyXG4gICAgcmV0dXJuIGltZ1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgaW1hZ2VGb3JtYXRMaXN0ID0gWydqcGcnLCAnanBlZycsICdwbmcnLCAnZ2lmJywgJ3dlYnAnLCAnYm1wJywgJ3RpZmYnLCAndGlmJywgJ3N2ZycsICdpY28nLCAnYXZpZicsICdoZWlmJywgJ2hlaWMnXVxyXG5cclxuZXhwb3J0IGNvbnN0IG5lZWRBZGRXYXRlcm1hcmsgPSAod2F0ZXJtYXJrT3B0aW9uczogSUJ1aWxkSW5XYXRlck1hcmtPcHRpb25zIHwgdW5kZWZpbmVkLCBmaWxlRXh0OiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICBmaWxlRXh0ID0gZmlsZUV4dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJy4nLCAnJylcclxuICByZXR1cm4gISF3YXRlcm1hcmtPcHRpb25zICYmICEhd2F0ZXJtYXJrT3B0aW9ucy5pc0FkZFdhdGVybWFyayAmJiBpbWFnZUZvcm1hdExpc3QuaW5jbHVkZXMoZmlsZUV4dClcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IG5lZWRDb21wcmVzcyA9IChjb21wcmVzc09wdGlvbnM6IElCdWlsZEluQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkLCBmaWxlRXh0OiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICBmaWxlRXh0ID0gZmlsZUV4dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJy4nLCAnJylcclxuICBpZiAoIWltYWdlRm9ybWF0TGlzdC5pbmNsdWRlcyhmaWxlRXh0KSkge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIGlmIChjb21wcmVzc09wdGlvbnMpIHtcclxuICAgIGNvbXByZXNzT3B0aW9ucyA9IGZvcm1hdE9wdGlvbnMoY29tcHJlc3NPcHRpb25zKVxyXG4gICAgaWYgKHZhbGlkUGFyYW0oY29tcHJlc3NPcHRpb25zLnF1YWxpdHkpICYmIGNvbXByZXNzT3B0aW9ucy5xdWFsaXR5ISA8IDEwMCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYgKGNvbXByZXNzT3B0aW9ucy5pc1JlU2l6ZUJ5UGVyY2VudCAmJiB2YWxpZFBhcmFtKGNvbXByZXNzT3B0aW9ucy5yZVNpemVQZXJjZW50KSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYgKGNvbXByZXNzT3B0aW9ucy5pc1JlU2l6ZSAmJiB2YWxpZFBhcmFtKGNvbXByZXNzT3B0aW9ucy5yZVNpemVIZWlnaHQsIGNvbXByZXNzT3B0aW9ucy5yZVNpemVXaWR0aCkpIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICAgIGlmIChjb21wcmVzc09wdGlvbnMuaXNSb3RhdGUgJiYgY29tcHJlc3NPcHRpb25zLnJvdGF0ZURlZ3JlZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYgKGNvbXByZXNzT3B0aW9ucy5pc0NvbnZlcnQpIHtcclxuICAgICAgY29uc3QgbmV3Rm9ybWF0ID0gY29tcHJlc3NPcHRpb25zLmNvbnZlcnRGb3JtYXQgfHwgJ2pwZydcclxuICAgICAgcmV0dXJuIGZpbGVFeHQgIT09IG5ld0Zvcm1hdFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgcmVtb3ZlRXhpZiA9IGFzeW5jIChpbWc6IEJ1ZmZlciwgZmlsZUV4dDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+ID0+IHtcclxuICBmaWxlRXh0ID0gZmlsZUV4dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJy4nLCAnJylcclxuICBpZiAoIWltYWdlRm9ybWF0TGlzdC5pbmNsdWRlcyhmaWxlRXh0KSkge1xyXG4gICAgcmV0dXJuIGltZ1xyXG4gIH1cclxuICByZXR1cm4gYXdhaXQgc2hhcnAoaW1nKS50b0J1ZmZlcigpXHJcbn1cclxuIiwiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgeyBpc1VybCB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCB1cGxvYWQ6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCd1cGxvYWQnKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ3VwbG9hZCwgZ28gZ28gZ28nKVxyXG4gICAgICAuYXJndW1lbnRzKCdbaW5wdXQuLi5dJylcclxuICAgICAgLmFsaWFzKCd1JylcclxuICAgICAgLmFjdGlvbigoaW5wdXQ6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0TGlzdCA9IGlucHV0XHJcbiAgICAgICAgICAgIC5tYXAoKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBpc1VybChpdGVtKSA/IGl0ZW0gOiBwYXRoLnJlc29sdmUoaXRlbSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3QgPSBmcy5leGlzdHNTeW5jKGl0ZW0pIHx8IGlzVXJsKGl0ZW0pXHJcbiAgICAgICAgICAgICAgaWYgKCFleGlzdCkge1xyXG4gICAgICAgICAgICAgICAgY3R4LmxvZy53YXJuKGAke2l0ZW19IGRvZXMgbm90IGV4aXN0LmApXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiBleGlzdFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgYXdhaXQgY3R4LnVwbG9hZChpbnB1dExpc3QpXHJcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB1cGxvYWRcclxuIiwiXHJcbmltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSUJ1aWxkSW5Db21wcmVzc09wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJQnVpbGRJbkNvbXByZXNzT3B0aW9ucz4oJ2J1aWxkSW4uY29tcHJlc3MnKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAncXVhbGl0eScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX1FVQUxJVFknKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucXVhbGl0eSB8fCAxMDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdpc0NvbnZlcnQnLFxyXG4gICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX0lTQ09OVkVSVCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5pc0NvbnZlcnQgfHwgZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjb252ZXJ0Rm9ybWF0JyxcclxuICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9DT01QUkVTU19DT05WRVJURk9STUFUJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBjaG9pY2VzOiBbJ2F2aWYnLCAnZHonLCAnZml0cycsICdnaWYnLCAnaGVpZicsICdpbnB1dCcsICdqcGVnJywgJ2pwZycsICdqcDInLCAnanhsJywgJ21hZ2ljaycsICdvcGVuc2xpZGUnLCAncGRmJywgJ3BuZycsICdwcG0nLCAncmF3JywgJ3N2ZycsICd0aWZmJywgJ3RpZicsICd2JywgJ3dlYnAnXSxcclxuICAgICAgZGVmYXVsdDogJ2pwZydcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdpc1JlU2l6ZScsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkUnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuaXNSZVNpemUgfHwgZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdyZVNpemVXaWR0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX1JFU0laRVdJRFRIJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnJlU2l6ZVdpZHRoIHx8IDUwMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3JlU2l6ZUhlaWdodCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX1JFU0laRUhFSUdIVCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5yZVNpemVIZWlnaHQgfHwgNTAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaXNSZVNpemVCeVBlcmNlbnQnLFxyXG4gICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX0lTUkVTSVpFQllQRVJDRU5UJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmlzUmVTaXplQnlQZXJjZW50IHx8IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncmVTaXplUGVyY2VudCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX1JFU0laRVBFUkNFTlQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucmVTaXplUGVyY2VudCB8fCA1MFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzUm90YXRlJyxcclxuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9DT01QUkVTU19JU1JPVEFURScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5pc1JvdGF0ZSB8fCBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3JvdGF0ZURlZ3JlZScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX1JPVEFURURFR1JFRScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5yb3RhdGVEZWdyZWUgfHwgOTBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdpc1JlbW92ZUV4aWYnLFxyXG4gICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX0lTUkVNT1ZFRVhJRicpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5pc1JlbW92ZUV4aWYgfHwgZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgY29uZmlnXHJcbn1cclxuIiwiXHJcbmltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSUJ1aWxkSW5XYXRlck1hcmtPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUJ1aWxkSW5XYXRlck1hcmtPcHRpb25zPignYnVpbGRJbi53YXRlcm1hcmsnKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaXNBZGRXYXRlcm1hcmsnLFxyXG4gICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19JU0FERFdBVEVSTUFSSycpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5pc0FkZFdhdGVybWFyayB8fCBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3dhdGVybWFya1R5cGUnLFxyXG4gICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktUWVBFJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBjaG9pY2VzOiBbJ3RleHQnLCAnaW1hZ2UnXSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53YXRlcm1hcmtUeXBlIHx8ICd0ZXh0J1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzRnVsbFNjcmVlbldhdGVybWFyaycsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX0lTRlVMTFNDUkVFTldBVEVSTUFSSycpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5pc0Z1bGxTY3JlZW5XYXRlcm1hcmsgfHwgZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtEZWdyZWUnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLREVHUkVFJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndhdGVybWFya0RlZ3JlZSB8fCAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnd2F0ZXJtYXJrVGV4dCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhUJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndhdGVybWFya1RleHQgfHwgJydcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtGb250UGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhURk9OVFBBVEgnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcud2F0ZXJtYXJrRm9udFBhdGggfHwgJydcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtTY2FsZVJhdGlvJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRSQVRJTycpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53YXRlcm1hcmtTY2FsZVJhdGlvIHx8IDAuMTVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtDb2xvcicsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktGT05UQ09MT1InKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcud2F0ZXJtYXJrQ29sb3IgfHwgJ3JnYmEoMjA0LCAyMDQsIDIwNCwgMC40NSknXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnd2F0ZXJtYXJrSW1hZ2VQYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0lNQUdFUEFUSCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53YXRlcm1hcmtJbWFnZVBhdGggfHwgJydcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtQb3NpdGlvbicsXHJcbiAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1BPU0lUSU9OJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBjaG9pY2VzOiBbJ25vcnRoJywgJ25vcnRoZWFzdCcsICdzb3V0aGVhc3QnLCAnc291dGgnLCAnc291dGh3ZXN0JywgJ25vcnRod2VzdCcsICd3ZXN0JywgJ2Vhc3QnLCAnY2VudGVyJywgJ2NlbnRyZSddLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndhdGVybWFya1Bvc2l0aW9uIHx8ICdzb3V0aGVhc3QnXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIGNvbmZpZ1xyXG59XHJcbiIsIlxyXG5pbXBvcnQgeyBJUGljR28sIElQbHVnaW5Db25maWcgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxhbnk+KCdidWlsZEluLnJlbmFtZScpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdmb3JtYXQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9SRU5BTUVfRk9STUFUJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmZvcm1hdCB8fCAne2ZpbGVuYW1lfSdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdlbmFibGUnLFxyXG4gICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1JFTkFNRV9FTkFCTEUnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuZW5hYmxlIHx8IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIGNvbmZpZ1xyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSVN0cmluZ0tleU1hcCB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgY29tcHJlc3MgZnJvbSAnLi4vYmVmb3JldHJhbnNmb3JtZXIvY29tcHJlc3MnXHJcbmltcG9ydCB3YXRlcm1hcmsgZnJvbSAnLi4vYmVmb3JldHJhbnNmb3JtZXIvd2F0ZXJtYXJrJ1xyXG5pbXBvcnQgcmVuYW1lIGZyb20gJy4uL2JlZm9yZXVwbG9hZC9idWlsZEluUmVuYW1lJ1xyXG5cclxuLy8gaGFuZGxlIG1vZHVsZXMgY29uZmlnIC0+IHNhdmUgdG8gcGljZ28gY29uZmlnIGZpbGVcclxuY29uc3QgaGFuZGxlQ29uZmlnID0gYXN5bmMgKGN0eDogSVBpY0dvLCBwcm9tcHRzOiBJUGx1Z2luQ29uZmlnW10sIG1vZHVsZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdChwcm9tcHRzKVxyXG4gIGNvbnN0IGNvbmZpZ05hbWUgPSBtb2R1bGUgPT09ICd1cGxvYWRlcidcclxuICAgID8gYHBpY0JlZC4ke25hbWV9YCA6IG1vZHVsZSA9PT0gJ3RyYW5zZm9ybWVyJ1xyXG4gICAgICA/IGB0cmFuc2Zvcm1lci4ke25hbWV9YCA6IG1vZHVsZSA9PT0gJ2J1aWxkaW4nXHJcbiAgICAgICAgPyBgYnVpbGRJbi4ke25hbWV9YCA6IG5hbWVcclxuICBjdHguc2F2ZUNvbmZpZyh7XHJcbiAgICBbY29uZmlnTmFtZV06IGFuc3dlclxyXG4gIH0pXHJcbiAgaWYgKG1vZHVsZSA9PT0gJ3VwbG9hZGVyJykge1xyXG4gICAgY3R4LnNhdmVDb25maWcoe1xyXG4gICAgICAncGljQmVkLmN1cnJlbnQnOiBuYW1lLFxyXG4gICAgICAncGljQmVkLnVwbG9hZGVyJzogbmFtZVxyXG4gICAgfSlcclxuICB9IGVsc2UgaWYgKG1vZHVsZSA9PT0gJ3RyYW5zZm9ybWVyJykge1xyXG4gICAgY3R4LnNhdmVDb25maWcoe1xyXG4gICAgICAncGljQmVkLnRyYW5zZm9ybWVyJzogbmFtZVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHNldHRpbmcgPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCdzZXQnKVxyXG4gICAgICAuYWxpYXMoJ2NvbmZpZycpXHJcbiAgICAgIC5hcmd1bWVudHMoJzxtb2R1bGU+IFtuYW1lXScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbignY29uZmlndXJlIGNvbmZpZyBvZiBwaWNnbyBtb2R1bGVzLCB1cGxvYWRlcnx0cmFuc2Zvcm1lcnxwbHVnaW58YnVpbGRpbicpXHJcbiAgICAgIC5hY3Rpb24oKG1vZHVsZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gLy8gbG9hZCB0aGlyZC1wYXJ0eSBwbHVnaW5zXHJcbiAgICAgICAgICAgIC8vIGF3YWl0IGN0eC5wbHVnaW5Mb2FkZXIubG9hZCgpXHJcbiAgICAgICAgICAgIC8vIGlmIGEgbW9kdWxlIGlzIHNwZWNpZmljLCB0aGVuIGp1c3Qgc2V0IHRoaXMgb3B0aW9uIGluIGNvbmZpZ1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG1vZHVsZSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgJ2J1aWxkaW4nOlxyXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdjb21wcmVzcycpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgY29tcHJlc3MuY29uZmlnKGN0eCksIG1vZHVsZSwgbmFtZSlcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3dhdGVybWFyaycpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgd2F0ZXJtYXJrLmNvbmZpZyhjdHgpLCBtb2R1bGUsIG5hbWUpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdyZW5hbWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIHJlbmFtZS5jb25maWcoY3R4KSwgbW9kdWxlLCBuYW1lKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbXB0cyA9IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYnVpbGRpbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzOiBbJ2NvbXByZXNzJywgJ3dhdGVybWFyaycsICdyZW5hbWUnXSxcclxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdDaG9vc2UgYSBidWlsZGluIG1vZHVsZSdcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY3R4LmNtZC5pbnF1aXJlci5wcm9tcHQ8SVN0cmluZ0tleU1hcDxhbnk+Pihwcm9tcHRzKVxyXG4gICAgICAgICAgICAgICAgICBpZiAoYW5zd2VyLmJ1aWxkaW4gPT09ICdjb21wcmVzcycpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBjb21wcmVzcy5jb25maWcoY3R4KSwgbW9kdWxlLCBhbnN3ZXIuYnVpbGRpbilcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbnN3ZXIuYnVpbGRpbiA9PT0gJ3dhdGVybWFyaycpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCB3YXRlcm1hcmsuY29uZmlnKGN0eCksIG1vZHVsZSwgYW5zd2VyLmJ1aWxkaW4pXHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5zd2VyLmJ1aWxkaW4gPT09ICdyZW5hbWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgcmVuYW1lLmNvbmZpZyhjdHgpLCBtb2R1bGUsIGFuc3dlci5idWlsZGluKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIGNhc2UgJ3VwbG9hZGVyJzpcclxuICAgICAgICAgICAgICBjYXNlICd0cmFuc2Zvcm1lcic6XHJcbiAgICAgICAgICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY3R4LmhlbHBlclttb2R1bGVdLmdldChuYW1lKVxyXG4gICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihgTm8gJHttb2R1bGV9IG5hbWVkICR7bmFtZX1gKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGl0ZW0uY29uZmlnKGN0eCksIG1vZHVsZSwgbmFtZSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbXB0cyA9IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBgJHttb2R1bGV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5oZWxwZXJbbW9kdWxlXS5nZXRJZExpc3QoKSxcclxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBDaG9vc2UgYShuKSAke21vZHVsZX1gXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnKCdwaWNCZWQudXBsb2FkZXInKSB8fCBjdHguZ2V0Q29uZmlnKCdwaWNCZWQuY3VycmVudCcpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0PElTdHJpbmdLZXlNYXA8YW55Pj4ocHJvbXB0cylcclxuICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGN0eC5oZWxwZXJbbW9kdWxlXS5nZXQoYW5zd2VyW21vZHVsZV0pXHJcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtPy5jb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBpdGVtLmNvbmZpZyhjdHgpLCBtb2R1bGUsIGFuc3dlclttb2R1bGVdKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIGNhc2UgJ3BsdWdpbic6XHJcbiAgICAgICAgICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJ3BpY2dvLXBsdWdpbi0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBgcGljZ28tcGx1Z2luLSR7bmFtZX1gXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGN0eC5nZXRDb25maWcoJ3BpY2dvUGx1Z2lucycpKS5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihuYW1lKT8uY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihuYW1lKSEuY29uZmlnIShjdHgpLCAncGx1Z2luJywgbmFtZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5sb2cuZXJyb3IoYE5vIHBsdWdpbiBuYW1lZCAke25hbWV9YClcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbXB0cyA9IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGx1Z2luJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5wbHVnaW5Mb2FkZXIuZ2V0RnVsbExpc3QoKSxcclxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdDaG9vc2UgYSBwbHVnaW4nXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0PGFueT4ocHJvbXB0cylcclxuICAgICAgICAgICAgICAgICAgaWYgKGN0eC5wbHVnaW5Mb2FkZXIuZ2V0UGx1Z2luKGFuc3dlci5wbHVnaW4pPy5jb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihhbnN3ZXIucGx1Z2luKSEuY29uZmlnIShjdHgpLCAncGx1Z2luJywgYW5zd2VyLnBsdWdpbilcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgY3R4LmxvZy53YXJuKGBObyBtb2R1bGUgbmFtZWQgJHttb2R1bGV9YClcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdHgubG9nLndhcm4oJ0F2YWlsYWJsZSBtb2R1bGVzIGFyZSB1cGxvYWRlcnx0cmFuc2Zvcm1lcnxwbHVnaW58YnVpbGRpbicpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3R4LmxvZy5zdWNjZXNzKCdDb25maWd1cmUgY29uZmlnIHN1Y2Nlc3NmdWxseSEnKVxyXG4gICAgICAgICAgICBpZiAobW9kdWxlID09PSAncGx1Z2luJykge1xyXG4gICAgICAgICAgICAgIGN0eC5sb2cuaW5mbygnSWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgY29uZmlnLCBwbGVhc2UgcnVuIFxcJ3BpY2dvIHVzZSBwbHVnaW5zXFwnJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1kZWJ1ZycpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBzZXR0aW5nXHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbiwgVW5kZWZpbmFibGUsIElDTElDb25maWdzLCBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCB1c2U6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiBhc3luYyAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCd1c2UnKVxyXG4gICAgICAuYXJndW1lbnRzKCdbbW9kdWxlXScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbigndXNlIG1vZHVsZXMgb2YgcGljZ28nKVxyXG4gICAgICAuYWN0aW9uKChtb2R1bGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcclxuICAgICAgICAgICAgLy8gYXdhaXQgY3R4LnBsdWdpbkxvYWRlci5sb2FkKClcclxuICAgICAgICAgICAgbGV0IHByb21wdHM6IGFueVtdID0gW11cclxuICAgICAgICAgICAgY29uc3QgY29uZmlnOiBJQ0xJQ29uZmlncyA9IHtcclxuICAgICAgICAgICAgICB1cGxvYWRlcjoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3VwbG9hZGVyJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2UgYW4gdXBsb2FkZXInLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LmhlbHBlci51cGxvYWRlci5nZXRJZExpc3QoKSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGN0eC5nZXRDb25maWcoJ3BpY0JlZC51cGxvYWRlcicpIHx8IGN0eC5nZXRDb25maWcoJ3BpY0JlZC5jdXJyZW50JykgfHwgJ3NtbXMnXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lcjoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RyYW5zZm9ybWVyJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2UgYSB0cmFuc2Zvcm1lcicsXHJcbiAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldElkTGlzdCgpLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnRyYW5zZm9ybWVyJykgfHwgJ3BhdGgnXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBwbHVnaW5zOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3BsdWdpbnMnLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZSBwbHVnaW5zJyxcclxuICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5wbHVnaW5Mb2FkZXIuZ2V0RnVsbExpc3QoKSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IE9iamVjdC5rZXlzKGN0eC5nZXRDb25maWcoJ3BpY2dvUGx1Z2lucycpKS5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7aXRlbX1gKSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgYW4gb3B0aW9uIGlzIHNwZWNpZmljLCB0aGVuIGp1c3Qgc2V0IHRoaXMgb3B0aW9uIGluIGNvbmZpZ1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZ1ttb2R1bGVdKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9tcHRzLnB1c2goY29uZmlnW21vZHVsZV0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmxvZy53YXJuKCdBdmFpbGFibGUgbW9kdWxlcyBhcmUgdXBsb2FkZXJ8dHJhbnNmb3JtZXJ8cGx1Z2lucycpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHByb21wdHMgPSBPYmplY3Qua2V5cyhjb25maWcpLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBjb25maWdbaXRlbV0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY21kLmlucXVpcmVyLnByb21wdDxhbnk+KHByb21wdHMpXHJcblxyXG4gICAgICAgICAgICAvLyBoYW5kbGUgZm9yIHBsdWdpbnMgb3B0aW9uIGZyb20gQXJyYXkgdG8gb2JqZWN0XHJcbiAgICAgICAgICAgIGlmIChhbnN3ZXIucGx1Z2lucykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBjdHguZ2V0Q29uZmlnPElTdHJpbmdLZXlNYXA8Ym9vbGVhbj4+KCdwaWNnb1BsdWdpbnMnKVxyXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHBsdWdpbnMpLm1hcCgoaXRlbTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyLnBsdWdpbnMuaW5jbHVkZXMoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgcGx1Z2luc1tpdGVtXSA9IHRydWVcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHBsdWdpbnNbaXRlbV0gPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgLy8gc2F2ZSBjb25maWcgZm9yIHBsdWdpbnNcclxuICAgICAgICAgICAgICBjdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICAgICAgICAgICBwaWNnb1BsdWdpbnM6IHBsdWdpbnNcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHNhdmUgY29uZmlnIGZvciB1cGxvYWRlciAmIHRyYW5zZm9ybWVyXHJcbiAgICAgICAgICAgIGN0eC5zYXZlQ29uZmlnKHtcclxuICAgICAgICAgICAgICAncGljQmVkLmN1cnJlbnQnOiBhbnN3ZXIudXBsb2FkZXIgfHwgY3R4LmdldENvbmZpZzxzdHJpbmc+KCdwaWNCZWQuY3VycmVudCcpLFxyXG4gICAgICAgICAgICAgICdwaWNCZWQudXBsb2FkZXInOiBhbnN3ZXIudXBsb2FkZXIgfHwgY3R4LmdldENvbmZpZzxzdHJpbmc+KCdwaWNCZWQuY3VycmVudCcpLFxyXG4gICAgICAgICAgICAgICdwaWNCZWQudHJhbnNmb3JtZXInOiBhbnN3ZXIudHJhbnNmb3JtZXIgfHwgJ3BhdGgnXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGN0eC5sb2cuc3VjY2VzcygnQ29uZmlndXJlIGNvbmZpZyBzdWNjZXNzZnVsbHkhJylcclxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZGVidWcnKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKCkuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgdXNlXHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgcHJveHk6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5vcHRpb24oJy1wLCAtLXByb3h5IDx1cmw+JywgJ3NldCBwcm94eSBmb3IgdXBsb2FkaW5nJywgKHByb3h5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjdHguc2V0Q29uZmlnKHtcclxuICAgICAgICAgICdwaWNCZWQucHJveHknOiBwcm94eVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBwcm94eVxyXG4iLCJpbXBvcnQgbWF0Y2ggZnJvbSAnbWluaW1hdGNoJ1xyXG5pbXBvcnQgeyBJUGljR28sIElPcHRpb25zLCBJRmlsZVRyZWUgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgZ2xvYmJ5IGZyb20gJ2dsb2JieSdcclxuaW1wb3J0IGVqcyBmcm9tICdlanMnXHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgdGVtcGxhdGUgZmlsZXMgdG8gZGVzdGluYXRpb24gZmlsZXMuXHJcbiAqIEBwYXJhbSB7UGljR299IGN0eFxyXG4gKiBAcGFyYW0ge0lPcHRpb25zfSBvcHRpb25zXHJcbiAqL1xyXG5jb25zdCBnZW5lcmF0ZSA9IGFzeW5jIChjdHg6IElQaWNHbywgb3B0aW9uczogSU9wdGlvbnMpOiBQcm9taXNlPGFueT4gPT4ge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBvcHRzID0gZ2V0T3B0aW9ucyhvcHRpb25zLnRtcClcclxuICAgIGNvbnN0IHNvdXJjZSA9IHBhdGguam9pbihvcHRpb25zLnRtcCwgJ3RlbXBsYXRlJylcclxuICAgIGxldCBhbnN3ZXJzID0ge31cclxuICAgIGlmIChvcHRzLnByb21wdHMgJiYgb3B0cy5wcm9tcHRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgYW5zd2VycyA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KG9wdHMucHJvbXB0cylcclxuICAgIH1cclxuICAgIGxldCBfZmlsZXM6IHN0cmluZ1tdID0gYXdhaXQgZ2xvYmJ5KFsnKiovKiddLCB7IGN3ZDogc291cmNlLCBkb3Q6IHRydWUgfSkgLy8gZ2V0IGZpbGVzJyBuYW1lIGFycmF5XHJcbiAgICBfZmlsZXMgPSBfZmlsZXMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgbGV0IGdsb2IgPSAnJ1xyXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZpbHRlcnMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKG1hdGNoKGl0ZW0sIGtleSwgeyBkb3Q6IHRydWUgfSkpIHtcclxuICAgICAgICAgIGdsb2IgPSBpdGVtXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBpZiAoZ2xvYikgeyAvLyBmaW5kIGEgZmlsdGVyIGV4cHJlc3Npb25cclxuICAgICAgICByZXR1cm4gZmlsdGVycyhjdHgsIG9wdHMuZmlsdGVyc1tnbG9iXSwgYW5zd2VycylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgaWYgKF9maWxlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIGN0eC5sb2cud2FybignVGVtcGxhdGUgZmlsZXMgbm90IGZvdW5kIScpXHJcbiAgICB9XHJcbiAgICBjb25zdCBmaWxlcyA9IHJlbmRlcihfZmlsZXMsIHNvdXJjZSwgYW5zd2VycylcclxuICAgIHdyaXRlRmlsZVRyZWUob3B0aW9ucy5kZXN0LCBmaWxlcylcclxuICAgIGlmICh0eXBlb2Ygb3B0cy5jb21wbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBvcHRzLmNvbXBsZXRlKHsgYW5zd2Vycywgb3B0aW9ucywgZmlsZXM6IF9maWxlcywgY3R4IH0pXHJcbiAgICB9XHJcbiAgICBpZiAob3B0cy5jb21wbGV0ZU1lc3NhZ2UpIHtcclxuICAgICAgY3R4LmxvZy5zdWNjZXNzKG9wdHMuY29tcGxldGVNZXNzYWdlKVxyXG4gICAgfVxyXG4gICAgY3R4LmxvZy5zdWNjZXNzKCdEb25lIScpXHJcbiAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0aGUgZmlsdGVycycgcmVzdWx0XHJcbiAqIEBwYXJhbSBjdHggUGljR29cclxuICogQHBhcmFtIGV4cCBjb25kaXRpb24gZXhwcmVzc2lvblxyXG4gKiBAcGFyYW0gZGF0YSBvcHRpb25zIGRhdGFcclxuICovXHJcbmNvbnN0IGZpbHRlcnMgPSAoY3R4OiBJUGljR28sIGV4cDogYW55LCBkYXRhOiBhbnkpOiBib29sZWFuID0+IHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXBsdXMtb3BlcmFuZHMsIG5vLW5ldy1mdW5jLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsXHJcbiAgY29uc3QgZm4gPSBuZXcgRnVuY3Rpb24oJ2RhdGEnLCAnd2l0aCAoZGF0YSkgeyByZXR1cm4gJyArIGV4cCArICd9JylcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIGZuKGRhdGEpXHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgY3R4LmxvZy5lcnJvcihgRXJyb3Igd2hlbiBldmFsdWF0aW5nIGZpbHRlciBjb25kaXRpb246ICR7SlNPTi5zdHJpbmdpZnkoZXhwKX1gKVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRlbXBsYXRlIG9wdGlvbnNcclxuICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlUGF0aFxyXG4gKi9cclxuY29uc3QgZ2V0T3B0aW9ucyA9ICh0ZW1wbGF0ZVBhdGg6IHN0cmluZyk6IGFueSA9PiB7XHJcbiAgY29uc3Qgb3B0aW9uc1BhdGggPSBwYXRoLmpvaW4odGVtcGxhdGVQYXRoLCAnaW5kZXguanMnKVxyXG4gIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnNQYXRoKSkge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcclxuICAgIGNvbnN0IG9wdGlvbnMgPSByZXF1aXJlKG9wdGlvbnNQYXRoKVxyXG4gICAgcmV0dXJuIG9wdGlvbnNcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHt9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmVuZGVyIGZpbGVzIHRvIGEgdmlydHVhbCB0cmVlIG9iamVjdFxyXG4gKiBAcGFyYW0ge2FycmF5fSBmaWxlc1xyXG4gKi9cclxuY29uc3QgcmVuZGVyID0gKGZpbGVzOiBzdHJpbmdbXSwgc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSA9PiB7XHJcbiAgY29uc3QgZmlsZVRyZWU6IElGaWxlVHJlZSA9IHt9XHJcbiAgZmlsZXMuZm9yRWFjaCgoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgZmlsZSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oc291cmNlLCBmaWxlUGF0aCksICd1dGY4JylcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBlanMucmVuZGVyKGZpbGUsIG9wdGlvbnMpXHJcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbnRlbnQpIHx8IC9bXlxcc10vLnRlc3QoY29udGVudCkpIHtcclxuICAgICAgZmlsZVRyZWVbZmlsZVBhdGhdID0gY29udGVudFxyXG4gICAgfVxyXG4gIH0pXHJcbiAgcmV0dXJuIGZpbGVUcmVlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBXcml0ZSByZW5kZXJlZCBmaWxlcycgY29udGVudCB0byByZWFsIGZpbGVcclxuICogQHBhcmFtIHtzdHJpbmd9IGRpclxyXG4gKiBAcGFyYW0ge29iamVjdH0gZmlsZXNcclxuICovXHJcbmNvbnN0IHdyaXRlRmlsZVRyZWUgPSAoZGlyOiBzdHJpbmcsIGZpbGVzOiBhbnkpOiB2b2lkID0+IHtcclxuICBPYmplY3Qua2V5cyhmaWxlcykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXIsIG5hbWUpXHJcbiAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCkpXHJcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmaWxlc1tuYW1lXSlcclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQge1xyXG4gIGZpbHRlcnMsXHJcbiAgZ2VuZXJhdGUsXHJcbiAgcmVuZGVyLFxyXG4gIHdyaXRlRmlsZVRyZWVcclxufVxyXG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICcuLi8uLi91dGlscy9pbml0VXRpbHMnXHJcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcydcclxuaW1wb3J0IGRvd25sb2FkIGZyb20gJ2Rvd25sb2FkLWdpdC1yZXBvJ1xyXG5pbXBvcnQgeyBJT3B0aW9ucywgSVBsdWdpbiwgSVBpY0dvIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBybSBmcm9tICdyaW1yYWYnXHJcblxyXG5jb25zdCBydW4gPSAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElPcHRpb25zKTogdm9pZCA9PiB7XHJcbiAgLy8gY29uc3QgbmFtZSA9IG9wdGlvbnMuaW5QbGFjZSA/IHBhdGgucmVsYXRpdmUoJy4uLycsIHByb2Nlc3MuY3dkKCkpIDogb3B0aW9ucy5wcm9qZWN0XHJcbiAgaWYgKG9wdGlvbnMub2ZmbGluZSkgeyAvLyBvZmZsaW5lIG1vZGVcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnMudGVtcGxhdGUpKSB7XHJcbiAgICAgIGdlbmVyYXRlKGN0eCwgb3B0aW9ucykuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3R4LmxvZy5lcnJvcihgTG9jYWwgdGVtcGxhdGUgJHtvcHRpb25zLnRlbXBsYXRlfSBub3QgZm91bmRgKVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7IC8vIG9ubGluZSBtb2RlXHJcbiAgICBvcHRpb25zLnRlbXBsYXRlID0gIW9wdGlvbnMuaGFzU2xhc2hcclxuICAgICAgPyAnUGljR28vcGljZ28tdGVtcGxhdGUtJyArIG9wdGlvbnMudGVtcGxhdGUgLy8gb2ZmaWNpYWwgdGVtcGxhdGVcclxuICAgICAgOiBvcHRpb25zLnRlbXBsYXRlXHJcbiAgICBkb3dubG9hZEFuZEdlbmVyYXRlKGN0eCwgb3B0aW9ucylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBkb3dubG9hZCB0ZW1wbGF0ZSAmIGdlbmVyYXRlXHJcbiAqIEBwYXJhbSB7IFBpY0dvIH0gY3R4XHJcbiAqIEBwYXJhbSB7IElPcHRpb25zIH0gb3B0aW9uc1xyXG4gKi9cclxuY29uc3QgZG93bmxvYWRBbmRHZW5lcmF0ZSA9IChjdHg6IElQaWNHbywgb3B0aW9uczogSU9wdGlvbnMpOiB2b2lkID0+IHtcclxuICBpZiAoZnMuZXhpc3RzU3luYyhvcHRpb25zLnRtcCkpIHtcclxuICAgIHJtLnN5bmMob3B0aW9ucy50bXApXHJcbiAgfVxyXG4gIGN0eC5sb2cuaW5mbygnVGVtcGxhdGUgZmlsZXMgYXJlIGRvd25sb2FkaW5nLi4uJylcclxuICBkb3dubG9hZChvcHRpb25zLnRlbXBsYXRlLCBvcHRpb25zLnRtcCwgeyBjbG9uZTogb3B0aW9ucy5jbG9uZSB9LCAoZXJyOiBFcnJvcikgPT4ge1xyXG4gICAgaWYgKGVycikge1xyXG4gICAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICB9XHJcbiAgICBjdHgubG9nLnN1Y2Nlc3MoJ1RlbXBsYXRlIGZpbGVzIGFyZSBkb3dubG9hZGVkIScpXHJcbiAgICBnZW5lcmF0ZShjdHgsIG9wdGlvbnMpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICB9KVxyXG59XHJcblxyXG5jb25zdCBpbml0OiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogYXN5bmMgKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgnaW5pdCcpXHJcbiAgICAgIC5hcmd1bWVudHMoJzx0ZW1wbGF0ZT4gW3Byb2plY3RdJylcclxuICAgICAgLm9wdGlvbignLS1jbG9uZScsICd1c2UgZ2l0IGNsb25lJylcclxuICAgICAgLm9wdGlvbignLS1vZmZsaW5lJywgJ3VzZSBjYWNoZWQgdGVtcGxhdGUnKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ2NyZWF0ZSBwaWNnbyBwbHVnaW5cXCdzIGRldmVsb3BtZW50IHRlbXBsYXRlcycpXHJcbiAgICAgIC5hY3Rpb24oKHRlbXBsYXRlOiBzdHJpbmcsIHByb2plY3Q6IHN0cmluZywgcHJvZ3JhbTogYW55KSA9PiB7XHJcbiAgICAgICAgKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIC8vIFRoYW5rcyB0byB2dWUtY2xpIGluaXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtY2xpL2Jsb2IvbWFzdGVyL2Jpbi92dWUtaW5pdFxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzU2xhc2ggPSB0ZW1wbGF0ZS5pbmNsdWRlcygnLycpXHJcbiAgICAgICAgICAgIGNvbnN0IGluUGxhY2UgPSAhcHJvamVjdCB8fCBwcm9qZWN0ID09PSAnLidcclxuICAgICAgICAgICAgY29uc3QgZGVzdCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0IHx8ICcuJylcclxuICAgICAgICAgICAgY29uc3QgY2xvbmUgPSBwcm9ncmFtLmNsb25lIHx8IGZhbHNlXHJcbiAgICAgICAgICAgIGNvbnN0IG9mZmxpbmUgPSBwcm9ncmFtLm9mZmxpbmUgfHwgZmFsc2VcclxuICAgICAgICAgICAgY29uc3QgdG1wID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5waWNnby90ZW1wbGF0ZXMnLCB0ZW1wbGF0ZS5yZXBsYWNlKC9bLzpdL2csICctJykpIC8vIGZvciBjYWNoaW5nIHRlbXBsYXRlXHJcblxyXG4gICAgICAgICAgICBpZiAocHJvZ3JhbS5vZmZsaW5lKSB7XHJcbiAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0bXBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICB0ZW1wbGF0ZSxcclxuICAgICAgICAgICAgICBwcm9qZWN0LFxyXG4gICAgICAgICAgICAgIGhhc1NsYXNoLFxyXG4gICAgICAgICAgICAgIGluUGxhY2UsXHJcbiAgICAgICAgICAgICAgZGVzdCxcclxuICAgICAgICAgICAgICBjbG9uZSxcclxuICAgICAgICAgICAgICB0bXAsXHJcbiAgICAgICAgICAgICAgb2ZmbGluZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBwcm9qZWN0IGlzIGVtcHR5IG9yIGV4aXN0XHJcbiAgICAgICAgICAgIGlmIChpblBsYWNlIHx8IGZzLmV4aXN0c1N5bmMoZGVzdCkpIHtcclxuICAgICAgICAgICAgICBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdChbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaW5QbGFjZVxyXG4gICAgICAgICAgICAgICAgICAgID8gJ0dlbmVyYXRlIHByb2plY3QgaW4gY3VycmVudCBkaXJlY3Rvcnk/J1xyXG4gICAgICAgICAgICAgICAgICAgIDogJ1RhcmdldCBkaXJlY3RvcnkgZXhpc3RzLiBDb250aW51ZT8nLFxyXG4gICAgICAgICAgICAgICAgICBuYW1lOiAnb2snXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXSkudGhlbigoYW5zd2VyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIub2spIHtcclxuICAgICAgICAgICAgICAgICAgcnVuKGN0eCwgb3B0aW9ucylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBwcm9qZWN0IGlzIGdpdmVuXHJcbiAgICAgICAgICAgICAgcnVuKGN0eCwgb3B0aW9ucylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1kZWJ1ZycpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIC5vbignLS1oZWxwJywgKCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKClcclxuICAgICAgICBjb25zb2xlLmxvZygnRXhhbXBsZXM6JylcclxuICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAjIGNyZWF0ZSBhIG5ldyBwcm9qZWN0IHdpdGggYW4gb2ZmaWNpYWwgdGVtcGxhdGUnKSlcclxuICAgICAgICBjb25zb2xlLmxvZygnICAkIHBpY2dvIGluaXQgcGx1Z2luIG15LXByb2plY3QnKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKClcclxuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICMgY3JlYXRlIGEgbmV3IHByb2plY3Qgc3RyYWlnaHQgZnJvbSBhIGdpdGh1YiB0ZW1wbGF0ZScpKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCcgICQgcGljZ28gaW5pdCB1c2VybmFtZS9yZXBvIG15LXByb2plY3QnKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKClcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGluaXRcclxuIiwiaW1wb3J0IHsgSVBsdWdpbiwgSVBpY0dvLCBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCBpMThuOiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgnaTE4bicpXHJcbiAgICAgIC5hcmd1bWVudHMoJ1tsYW5nXScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbignY2hhbmdlIHBpY2dvIGxhbmd1YWdlJylcclxuICAgICAgLmFjdGlvbihhc3luYyAobGFuZzogc3RyaW5nID0gJycpID0+IHtcclxuICAgICAgICBjb25zdCBsaXN0ID0gY3R4LmkxOG4uZ2V0TGFuZ3VhZ2VMaXN0KClcclxuICAgICAgICBpZiAoIWxhbmcpIHtcclxuICAgICAgICAgIGNvbnN0IHByb21wdHMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgICAgICAgICAgbmFtZTogJ2kxOG4nLFxyXG4gICAgICAgICAgICAgIGNob2ljZXM6IGxpc3QsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ0Nob29zZSBhIGxhbmd1YWdlJyxcclxuICAgICAgICAgICAgICBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnKCdzZXR0aW5ncy5sYW5ndWFnZScpIHx8ICd6aC1DTidcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY3R4LmNtZC5pbnF1aXJlci5wcm9tcHQ8SVN0cmluZ0tleU1hcDxzdHJpbmc+Pihwcm9tcHRzKVxyXG4gICAgICAgICAgY3R4LmkxOG4uc2V0TGFuZ3VhZ2UoYW5zd2VyLmkxOG4pXHJcbiAgICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoYExhbmd1YWdlIHNldCB0byAke2Fuc3dlci5pMThufWApXHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFsaXN0LmluY2x1ZGVzKGxhbmcpKSB7XHJcbiAgICAgICAgICByZXR1cm4gY3R4LmxvZy53YXJuKCdObyBzdWNoIGxhbmd1YWdlJylcclxuICAgICAgICB9XHJcbiAgICAgICAgY3R4LmkxOG4uc2V0TGFuZ3VhZ2UobGFuZylcclxuICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoYExhbmd1YWdlIHNldCB0byAke2xhbmd9YClcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGkxOG5cclxuIiwiaW1wb3J0IHsgSVBsdWdpbiwgSUxpZmVjeWNsZVBsdWdpbnMgfSBmcm9tICcuLi90eXBlcydcclxuXHJcbmV4cG9ydCBjbGFzcyBMaWZlY3ljbGVQbHVnaW5zIGltcGxlbWVudHMgSUxpZmVjeWNsZVBsdWdpbnMge1xyXG4gIHN0YXRpYyBjdXJyZW50UGx1Z2luOiBzdHJpbmcgfCBudWxsXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0OiBNYXA8c3RyaW5nLCBJUGx1Z2luPlxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPlxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nXHJcblxyXG4gIGNvbnN0cnVjdG9yIChuYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubmFtZSA9IG5hbWVcclxuICAgIHRoaXMubGlzdCA9IG5ldyBNYXAoKVxyXG4gICAgdGhpcy5wbHVnaW5JZE1hcCA9IG5ldyBNYXAoKVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXIgKGlkOiBzdHJpbmcsIHBsdWdpbjogSVBsdWdpbik6IHZvaWQge1xyXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignaWQgaXMgcmVxdWlyZWQhJylcclxuICAgIGlmICh0eXBlb2YgcGx1Z2luLmhhbmRsZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcigncGx1Z2luLmhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24hJylcclxuICAgIGlmICh0aGlzLmxpc3QuaGFzKGlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLm5hbWV9IGR1cGxpY2F0ZSBpZDogJHtpZH0hYClcclxuICAgIHRoaXMubGlzdC5zZXQoaWQsIHBsdWdpbilcclxuICAgIGlmIChMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW4pIHtcclxuICAgICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbikpIHtcclxuICAgICAgICB0aGlzLnBsdWdpbklkTWFwLmdldChMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW4pPy5wdXNoKGlkKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuc2V0KExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbiwgW2lkXSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlciAocGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMocGx1Z2luTmFtZSkpIHtcclxuICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luSWRNYXAuZ2V0KHBsdWdpbk5hbWUpXHJcbiAgICAgIHBsdWdpbkxpc3Q/LmZvckVhY2goKHBsdWdpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5saXN0LmRlbGV0ZShwbHVnaW4pXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXROYW1lICgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubmFtZVxyXG4gIH1cclxuXHJcbiAgZ2V0IChpZDogc3RyaW5nKTogSVBsdWdpbiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5saXN0LmdldChpZClcclxuICB9XHJcblxyXG4gIGdldExpc3QgKCk6IElQbHVnaW5bXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMubGlzdC52YWx1ZXMoKV1cclxuICB9XHJcblxyXG4gIGdldElkTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3Qua2V5cygpXVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldEN1cnJlbnRQbHVnaW5OYW1lID0gKG5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogdm9pZCA9PiB7XHJcbiAgTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luID0gbmFtZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBsdWdpbk5hbWUgPSAoKTogc3RyaW5nIHwgbnVsbCA9PiB7XHJcbiAgcmV0dXJuIExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaWZlY3ljbGVQbHVnaW5zXHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1taXN1c2VkLXByb21pc2VzICovXHJcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInXHJcbmltcG9ydCBpbnF1aXJlciwgeyBJbnF1aXJlciB9IGZyb20gJ2lucXVpcmVyJ1xyXG5pbXBvcnQgeyBJUGx1Z2luLCBJQ29tbWFuZGVyLCBJUGljR28gfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IGNvbW1hbmRlcnMgZnJvbSAnLi4vcGx1Z2lucy9jb21tYW5kZXInXHJcbmltcG9ydCB7IGdldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSAnLi9MaWZlY3ljbGVQbHVnaW5zJ1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbW1hbmRlciBpbXBsZW1lbnRzIElDb21tYW5kZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZSA9ICdjb21tYW5kZXInXHJcbiAgc3RhdGljIGN1cnJlbnRQbHVnaW46IHN0cmluZyB8IG51bGxcclxuICBwcml2YXRlIHJlYWRvbmx5IGxpc3Q6IE1hcDxzdHJpbmcsIElQbHVnaW4+ID0gbmV3IE1hcCgpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZE1hcDogTWFwPHN0cmluZywgc3RyaW5nW10+ID0gbmV3IE1hcCgpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG5cclxuICBwcm9ncmFtOiBDb21tYW5kXHJcbiAgaW5xdWlyZXI6IElucXVpcmVyXHJcblxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5wcm9ncmFtID0gbmV3IENvbW1hbmQoKVxyXG4gICAgdGhpcy5pbnF1aXJlciA9IGlucXVpcmVyXHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZSAoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm5hbWVcclxuICB9XHJcblxyXG4gIGluaXQgKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wcm9ncmFtXHJcbiAgICAgIC52ZXJzaW9uKHByb2Nlc3MuZW52LlBJQ0dPX1ZFUlNJT04sICctdiwgLS12ZXJzaW9uJylcclxuICAgICAgLm9wdGlvbignLWQsIC0tZGVidWcnLCAnZGVidWcgbW9kZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLmN0eC5zZXRDb25maWcoe1xyXG4gICAgICAgICAgZGVidWc6IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgICAub3B0aW9uKCctcywgLS1zaWxlbnQnLCAnc2lsZW50IG1vZGUnLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdHguc2V0Q29uZmlnKHtcclxuICAgICAgICAgIHNpbGVudDogdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIC5vbignY29tbWFuZDoqJywgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihgSW52YWxpZCBjb21tYW5kOiAke3RoaXMucHJvZ3JhbS5hcmdzLmpvaW4oJyAnKX1cXG5TZWUgLS1oZWxwIGZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLmApXHJcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgICAgIH0pXHJcblxyXG4gICAgLy8gYnVpbHQtaW4gY29tbWFuZHNcclxuICAgIGNvbW1hbmRlcnModGhpcy5jdHgpXHJcbiAgfVxyXG5cclxuICByZWdpc3RlciAoaWQ6IHN0cmluZywgcGx1Z2luOiBJUGx1Z2luKTogdm9pZCB7XHJcbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCduYW1lIGlzIHJlcXVpcmVkIScpXHJcbiAgICBpZiAodHlwZW9mIHBsdWdpbi5oYW5kbGUgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BsdWdpbi5oYW5kbGUgbXVzdCBiZSBhIGZ1bmN0aW9uIScpXHJcbiAgICBpZiAodGhpcy5saXN0LmhhcyhpZCkpIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7dGhpcy5uYW1lfSBwbHVnaW4gZHVwbGljYXRlIGlkOiAke2lkfSFgKVxyXG4gICAgdGhpcy5saXN0LnNldChpZCwgcGx1Z2luKVxyXG4gICAgY29uc3QgY3VycmVudFBsdWdpbk5hbWUgPSBnZXRDdXJyZW50UGx1Z2luTmFtZSgpXHJcbiAgICBpZiAoY3VycmVudFBsdWdpbk5hbWUgIT09IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKGN1cnJlbnRQbHVnaW5OYW1lKSkge1xyXG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuZ2V0KGN1cnJlbnRQbHVnaW5OYW1lKT8ucHVzaChpZClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnBsdWdpbklkTWFwLnNldChjdXJyZW50UGx1Z2luTmFtZSwgW2lkXSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlciAocGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMocGx1Z2luTmFtZSkpIHtcclxuICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luSWRNYXAuZ2V0KHBsdWdpbk5hbWUpXHJcbiAgICAgIHBsdWdpbkxpc3Q/LmZvckVhY2goKHBsdWdpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5saXN0LmRlbGV0ZShwbHVnaW4pXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkQ29tbWFuZHMgKCk6IHZvaWQge1xyXG4gICAgdGhpcy5nZXRMaXN0KCkuZm9yRWFjaCgoaXRlbTogSVBsdWdpbikgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGl0ZW0uaGFuZGxlKHRoaXMuY3R4KVxyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCAoaWQ6IHN0cmluZyk6IElQbHVnaW4gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMubGlzdC5nZXQoaWQpXHJcbiAgfVxyXG5cclxuICBnZXRMaXN0ICgpOiBJUGx1Z2luW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3QudmFsdWVzKCldXHJcbiAgfVxyXG5cclxuICBnZXRJZExpc3QgKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5saXN0LmtleXMoKV1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENvbW1hbmRlclxyXG4iLCJpbXBvcnQgcGx1Z2luSGFuZGxlciBmcm9tICcuL3BsdWdpbkhhbmRsZXInXHJcbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnXHJcbmltcG9ydCB1cGxvYWQgZnJvbSAnLi91cGxvYWQnXHJcbmltcG9ydCBzZXR0aW5nIGZyb20gJy4vc2V0dGluZydcclxuaW1wb3J0IHVzZSBmcm9tICcuL3VzZSdcclxuaW1wb3J0IHByb3h5IGZyb20gJy4vcHJveHknXHJcbmltcG9ydCBpbml0IGZyb20gJy4vaW5pdCdcclxuaW1wb3J0IGkxOG4gZnJvbSAnLi9pMThuJ1xyXG5pbXBvcnQgeyBJUGljR28gfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmV4cG9ydCBkZWZhdWx0IChjdHg6IElQaWNHbyk6IHZvaWQgPT4ge1xyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3BsdWdpbkhhbmRsZXInLCBwbHVnaW5IYW5kbGVyKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ2NvbmZpZycsIGNvbmZpZylcclxuICBjdHguY21kLnJlZ2lzdGVyKCdzZXR0aW5nJywgc2V0dGluZylcclxuICBjdHguY21kLnJlZ2lzdGVyKCd1cGxvYWQnLCB1cGxvYWQpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcigndXNlJywgdXNlKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3Byb3h5JywgcHJveHkpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcignaW5pdCcsIGluaXQpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcignaTE4bicsIGkxOG4pXHJcbn1cclxuIiwiZXhwb3J0IGVudW0gSUxvZ1R5cGUge1xyXG4gIHN1Y2Nlc3MgPSAnc3VjY2VzcycsXHJcbiAgaW5mbyA9ICdpbmZvJyxcclxuICB3YXJuID0gJ3dhcm4nLFxyXG4gIGVycm9yID0gJ2Vycm9yJ1xyXG59XHJcblxyXG4vKipcclxuICogdGhlc2UgZXZlbnRzIHdpbGwgYmUgY2F0Y2hlZCBieSB1c2Vyc1xyXG4gKi9cclxuZXhwb3J0IGVudW0gSUJ1aWxkSW5FdmVudCB7XHJcbiAgVVBMT0FEX1BST0dSRVNTID0gJ3VwbG9hZFByb2dyZXNzJyxcclxuICBGQUlMRUQgPSAnZmFpbGVkJyxcclxuICBCRUZPUkVfVFJBTlNGT1JNID0gJ2JlZm9yZVRyYW5zZm9ybScsXHJcbiAgQkVGT1JFX1VQTE9BRCA9ICdiZWZvcmVVcGxvYWQnLFxyXG4gIEFGVEVSX1VQTE9BRCA9ICdhZnRlclVwbG9hZCcsXHJcbiAgRklOSVNIRUQgPSAnZmluaXNoZWQnLFxyXG4gIElOU1RBTEwgPSAnaW5zdGFsbCcsXHJcbiAgVU5JTlNUQUxMID0gJ3VuaW5zdGFsbCcsXHJcbiAgVVBEQVRFID0gJ3VwZGF0ZScsXHJcbiAgTk9USUZJQ0FUSU9OID0gJ25vdGlmaWNhdGlvbidcclxufVxyXG5cclxuLyoqXHJcbiAqIHRoZXNlIGV2ZW50cyB3aWxsIGJlIGNhdGNoZWQgb25seSBieSBwaWNnb1xyXG4gKi9cclxuZXhwb3J0IGVudW0gSUJ1c0V2ZW50IHtcclxuICBDT05GSUdfQ0hBTkdFID0gJ0NPTkZJR19DSEFOR0UnXHJcbn1cclxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHV0aWwgZnJvbSAndXRpbCdcclxuaW1wb3J0IHsgSUxvZ1R5cGUgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQge1xyXG4gIElMb2dBcmd2VHlwZSxcclxuICBJTG9nQXJndlR5cGVXaXRoRXJyb3IsXHJcbiAgVW5kZWZpbmFibGUsXHJcbiAgSUxvZ0NvbG9yLFxyXG4gIElMb2dnZXIsXHJcbiAgSVBpY0dvXHJcbn0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IGZvcmNlTnVtYmVyLCBpc0RldiB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbidcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxldmVsID0ge1xyXG4gICAgW0lMb2dUeXBlLnN1Y2Nlc3NdOiAnZ3JlZW4nLFxyXG4gICAgW0lMb2dUeXBlLmluZm9dOiAnYmx1ZScsXHJcbiAgICBbSUxvZ1R5cGUud2Fybl06ICd5ZWxsb3cnLFxyXG4gICAgW0lMb2dUeXBlLmVycm9yXTogJ3JlZCdcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBwcml2YXRlIGxvZ0xldmVsITogc3RyaW5nXHJcbiAgcHJpdmF0ZSBsb2dQYXRoITogc3RyaW5nXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVMb2cgKHR5cGU6IElMb2dUeXBlLCAuLi5tc2c6IElMb2dBcmd2VHlwZVdpdGhFcnJvcltdKTogdm9pZCB7XHJcbiAgICAvLyBjaGVjayBjb25maWcuc2lsZW50XHJcbiAgICBpZiAoIXRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2lsZW50JykpIHtcclxuICAgICAgY29uc3QgbG9nSGVhZGVyID0gY2hhbGtbdGhpcy5sZXZlbFt0eXBlXSBhcyBJTG9nQ29sb3JdKGBbUGljTGlzdCAke3R5cGUudG9VcHBlckNhc2UoKX1dOmApXHJcbiAgICAgIGNvbnNvbGUubG9nKGxvZ0hlYWRlciwgLi4ubXNnKVxyXG4gICAgICB0aGlzLmxvZ0xldmVsID0gdGhpcy5jdHguZ2V0Q29uZmlnKCdzZXR0aW5ncy5sb2dMZXZlbCcpXHJcbiAgICAgIHRoaXMubG9nUGF0aCA9IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2V0dGluZ3MubG9nUGF0aCcpIHx8IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAnLi9waWNsaXN0LmxvZycpXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vIGZpeCBsb2cgZmlsZSBpcyB0b28gbGFyZ2UsIG5vdyB0aGUgbG9nIGZpbGUncyBkZWZhdWx0IHNpemUgaXMgMTAgTUJcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jaGVja0xvZ0ZpbGVJc0xhcmdlKHRoaXMubG9nUGF0aClcclxuICAgICAgICAgIGlmIChyZXN1bHQuaXNMYXJnZSkge1xyXG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nTXNnID0gYExvZyBmaWxlIGlzIHRvbyBsYXJnZSAoPiAkeyhyZXN1bHQubG9nRmlsZVNpemVMaW1pdCEpIC8gMTAyNCAvIDEwMjQgfHwgJzEwJ30gTUIpLCByZWNyZWF0ZSBsb2cgZmlsZWBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdbUGljTGlzdCBXQVJOXTonKSwgd2FybmluZ01zZylcclxuICAgICAgICAgICAgdGhpcy5yZWNyZWF0ZUxvZ0ZpbGUodGhpcy5sb2dQYXRoKVxyXG4gICAgICAgICAgICBtc2cudW5zaGlmdCh3YXJuaW5nTXNnKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVXcml0ZUxvZyh0aGlzLmxvZ1BhdGgsIHR5cGUsIC4uLm1zZylcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAvLyB3aHk/Pz9cclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tQaWNMaXN0IEVycm9yXSBvbiBjaGVja2luZyBsb2cgZmlsZSBzaXplJywgZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrTG9nRmlsZUlzTGFyZ2UgKGxvZ1BhdGg6IHN0cmluZyk6IHtcclxuICAgIGlzTGFyZ2U6IGJvb2xlYW5cclxuICAgIGxvZ0ZpbGVTaXplPzogbnVtYmVyXHJcbiAgICBsb2dGaWxlU2l6ZUxpbWl0PzogbnVtYmVyXHJcbiAgfSB7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2dQYXRoKSkge1xyXG4gICAgICBjb25zdCBsb2dGaWxlU2l6ZSA9IGZzLnN0YXRTeW5jKGxvZ1BhdGgpLnNpemVcclxuICAgICAgY29uc3QgbG9nRmlsZVNpemVMaW1pdCA9IGZvcmNlTnVtYmVyKHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxudW1iZXI+Pignc2V0dGluZ3MubG9nRmlsZVNpemVMaW1pdCcpIHx8IDEwKSAqIDEwMjQgKiAxMDI0IC8vIDEwIE1CIGRlZmF1bHRcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpc0xhcmdlOiBsb2dGaWxlU2l6ZSA+IGxvZ0ZpbGVTaXplTGltaXQsXHJcbiAgICAgICAgbG9nRmlsZVNpemUsXHJcbiAgICAgICAgbG9nRmlsZVNpemVMaW1pdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpc0xhcmdlOiBmYWxzZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWNyZWF0ZUxvZ0ZpbGUgKGxvZ1BhdGg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9nUGF0aCkpIHtcclxuICAgICAgZnMudW5saW5rU3luYyhsb2dQYXRoKVxyXG4gICAgICBmcy5jcmVhdGVGaWxlU3luYyhsb2dQYXRoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVXcml0ZUxvZyAobG9nUGF0aDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmNoZWNrTG9nTGV2ZWwodHlwZSwgdGhpcy5sb2dMZXZlbCkpIHtcclxuICAgICAgICBsZXQgbG9nID0gYCR7ZGF5anMoKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKX0gW1BpY0xpc3QgJHt0eXBlLnRvVXBwZXJDYXNlKCl9XSBgXHJcbiAgICAgICAgbXNnLmZvckVhY2goKGl0ZW06IElMb2dBcmd2VHlwZVdpdGhFcnJvcikgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFcnJvciAmJiB0eXBlID09PSAnZXJyb3InKSB7XHJcbiAgICAgICAgICAgIGxvZyArPSBgXFxuLS0tLS0tRXJyb3IgU3RhY2sgQmVnaW4tLS0tLS1cXG4ke3V0aWwuZm9ybWF0KGl0ZW0/LnN0YWNrKX1cXG4tLS0tLS0tRXJyb3IgU3RhY2sgRW5kLS0tLS0tLSBgXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgaXRlbSA9IEpTT04uc3RyaW5naWZ5KGl0ZW0sIG51bGwsIDIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9nICs9IGAke2l0ZW0gYXMgc3RyaW5nfSBgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBsb2cgKz0gJ1xcbidcclxuICAgICAgICAvLyBBIHN5bmNocm9uaXplZCBhcHByb2FjaCB0byBhdm9pZCBsb2cgbXNnIHNlcXVlbmNlIGVycm9yc1xyXG4gICAgICAgIGZzLmFwcGVuZEZpbGVTeW5jKGxvZ1BhdGgsIGxvZylcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbUGljTGlzdCBFcnJvcl0gb24gd3JpdGluZyBsb2cgZmlsZScsIGUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrTG9nTGV2ZWwgKHR5cGU6IHN0cmluZywgbGV2ZWw6IHVuZGVmaW5lZCB8IHN0cmluZyB8IHN0cmluZ1tdKTogYm9vbGVhbiB7XHJcbiAgICBpZiAobGV2ZWwgPT09IHVuZGVmaW5lZCB8fCBsZXZlbCA9PT0gJ2FsbCcpIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICAgIGlmIChBcnJheS5pc0FycmF5KGxldmVsKSkge1xyXG4gICAgICByZXR1cm4gbGV2ZWwuc29tZSgoaXRlbTogc3RyaW5nKSA9PiAoaXRlbSA9PT0gdHlwZSB8fCBpdGVtID09PSAnYWxsJykpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHlwZSA9PT0gbGV2ZWxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN1Y2Nlc3MgKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlW10pOiB2b2lkIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5zdWNjZXNzLCAuLi5tc2cpXHJcbiAgfVxyXG5cclxuICBpbmZvICguLi5tc2c6IElMb2dBcmd2VHlwZVtdKTogdm9pZCB7XHJcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUuaW5mbywgLi4ubXNnKVxyXG4gIH1cclxuXHJcbiAgZXJyb3IgKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5lcnJvciwgLi4ubXNnKVxyXG4gIH1cclxuXHJcbiAgd2FybiAoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLndhcm4sIC4uLm1zZylcclxuICB9XHJcblxyXG4gIGRlYnVnICguLi5tc2c6IElMb2dBcmd2VHlwZVtdKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXYoKSkge1xyXG4gICAgICB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS5pbmZvLCAuLi5tc2cpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMb2dnZXJcclxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbldhdGVyTWFya09wdGlvbnMsIElCdWlsZEluQ29tcHJlc3NPcHRpb25zLCBJTGlmZWN5Y2xlUGx1Z2lucywgSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8sIElQaWNHbywgSVBsdWdpbiwgVW5kZWZpbmFibGUsIElJbWdJbmZvIH0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IGdldFVSTEZpbGUsIGhhbmRsZVVybEVuY29kZSwgaW1hZ2VQcm9jZXNzLCBpc1VybCwgbmVlZENvbXByZXNzLCBuZWVkQWRkV2F0ZXJtYXJrLCBpbWFnZUFkZFdhdGVyTWFyaywgcmVtb3ZlRXhpZiwgcmVuYW1lRmlsZU5hbWVXaXRoQ3VzdG9tU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4uL3V0aWxzL2NyZWF0ZUNvbnRleHQnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJ1xyXG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gnXHJcbmltcG9ydCBoZWljQ29udmVydCBmcm9tICdoZWljLWNvbnZlcnQnXHJcblxyXG5leHBvcnQgY2xhc3MgTGlmZWN5Y2xlIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcbiAgcHJpdmF0ZSByZWFkb25seSB0dGZMaW5rOiBzdHJpbmcgPSAnaHR0cHM6Ly9yZWxlYXNlLnBpY2xpc3QuY24vc2ltaGVpLnR0ZidcclxuICB0dGZQYXRoOiBzdHJpbmdcclxuXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICBzdXBlcigpXHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gICAgY29uc3QgdGVtcEZpbGVQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCAncGljbGlzdFRlbXAnKVxyXG4gICAgZnMuZW1wdHlEaXJTeW5jKHRlbXBGaWxlUGF0aClcclxuICAgIHRoaXMudHRmUGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgJ2Fzc2V0cycsICdzaW1oZWkudHRmJylcclxuICB9XHJcblxyXG4gIGFzeW5jIGRvd25sb2FkVFRGICgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IG91dHB1dERpciA9IHBhdGguZGlybmFtZSh0aGlzLnR0ZlBhdGgpXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMob3V0cHV0RGlyKSkge1xyXG4gICAgICBmcy5ta2RpclN5bmMob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxyXG4gICAgfVxyXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMudHRmUGF0aCkpIHtcclxuICAgICAgdGhpcy5jdHgubG9nLmluZm8oJ0Rvd25sb2FkIHR0ZiBmaWxlLicpXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXhpb3MuZ2V0KHRoaXMudHRmTGluaywgeyByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicgfSlcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMudHRmUGF0aCwgcmVzLmRhdGEpXHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmluZm8oJ0Rvd25sb2FkIHR0ZiBmaWxlIHN1Y2Nlc3MuJylcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoJ0Rvd25sb2FkIHR0ZiBmaWxlIGZhaWxlZC4nKVxyXG4gICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgc3RhcnQgKGlucHV0OiBhbnlbXSk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICAvLyBlbnN1cmUgZXZlcnkgdXBsb2FkIHByb2Nlc3MgaGFzIGFuIHVuaXF1ZSBjb250ZXh0XHJcbiAgICBjb25zdCBjdHggPSBjcmVhdGVDb250ZXh0KHRoaXMuY3R4KVxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gaW1hZ2VzIGlucHV0XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IG11c3QgYmUgYW4gYXJyYXkuJylcclxuICAgICAgfVxyXG4gICAgICBjdHguaW5wdXQgPSBpbnB1dFxyXG4gICAgICBjdHgucmF3SW5wdXRQYXRoID0gW10gYXMgc3RyaW5nW11cclxuICAgICAgY3R4LnJhd0lucHV0ID0gY2xvbmVEZWVwKGlucHV0KVxyXG4gICAgICBjdHgub3V0cHV0ID0gW10gYXMgSUltZ0luZm9bXVxyXG4gICAgICBjb25zdCBjb21wcmVzc09wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElCdWlsZEluQ29tcHJlc3NPcHRpb25zPignYnVpbGRJbi5jb21wcmVzcycpXHJcbiAgICAgIGNvbnN0IHR5cGUgPSBjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdwaWNCZWQudXBsb2FkZXInKSB8fCBjdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdwaWNCZWQuY3VycmVudCcpIHx8ICdzbW1zJ1xyXG4gICAgICBjb25zdCB1cGxvYWRlciA9IGN0eC5oZWxwZXIudXBsb2FkZXIuZ2V0KHR5cGUpXHJcbiAgICAgIGlmICghdXBsb2FkZXIpIHtcclxuICAgICAgICBjb21wcmVzc09wdGlvbnMucGljQmVkID0gJ3NtbXMnXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29tcHJlc3NPcHRpb25zLnBpY0JlZCA9IHR5cGVcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB3YXRlcm1hcmtPcHRpb25zID0gY3R4LmdldENvbmZpZzxJQnVpbGRJbldhdGVyTWFya09wdGlvbnM+KCdidWlsZEluLndhdGVybWFyaycpXHJcbiAgICAgIGlmIChjb21wcmVzc09wdGlvbnMgfHwgd2F0ZXJtYXJrT3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgJ3BpY2xpc3RUZW1wJylcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGVtcEZpbGVQYXRoKSkge1xyXG4gICAgICAgICAgZnMubWtkaXJTeW5jKHRlbXBGaWxlUGF0aClcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgd2F0ZXJtYXJrTXNnID0gJ0FkZCB3YXRlcm1hcmsgdG8gaW1hZ2UnXHJcbiAgICAgICAgY29uc3QgY29tcHJlc3NNc2cgPSAnQ29tcHJlc3Mgb3IgY29udmVydCBpbWFnZSdcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY3R4LmlucHV0Lm1hcChhc3luYyAoaXRlbTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBsZXQgaW5mbzogSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm9cclxuICAgICAgICAgIGlmIChpc1VybChpdGVtKSkge1xyXG4gICAgICAgICAgICBjdHgucmF3SW5wdXRQYXRoIVtpbmRleF0gPSBpdGVtXHJcbiAgICAgICAgICAgIGluZm8gPSBhd2FpdCBnZXRVUkxGaWxlKGl0ZW0sIGN0eClcclxuICAgICAgICAgICAgaWYgKGluZm8uc3VjY2VzcyAmJiBpbmZvLmJ1ZmZlcikge1xyXG4gICAgICAgICAgICAgIGxldCB0cmFuc2Zvcm1lZEJ1ZmZlclxyXG4gICAgICAgICAgICAgIGlmIChuZWVkQWRkV2F0ZXJtYXJrKHdhdGVybWFya09wdGlvbnMsIGluZm8uZXh0bmFtZSA/PyAnJykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRvd25sb2FkVFRGUmV0ID0gYXdhaXQgdGhpcy5kb3dubG9hZFRURigpXHJcbiAgICAgICAgICAgICAgICBpZiAoIWRvd25sb2FkVFRGUmV0KSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LmxvZy53YXJuKCdEb3dubG9hZCB0dGYgZmlsZSBmYWlsZWQsIHNraXAgYWRkIHdhdGVybWFyay4nKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKHdhdGVybWFya01zZylcclxuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRCdWZmZXIgPSBhd2FpdCBpbWFnZUFkZFdhdGVyTWFyayhpbmZvLmJ1ZmZlciwgd2F0ZXJtYXJrT3B0aW9ucywgdGhpcy50dGZQYXRoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAobmVlZENvbXByZXNzKGNvbXByZXNzT3B0aW9ucywgaW5mby5leHRuYW1lID8/ICcnKSkge1xyXG4gICAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKGNvbXByZXNzTXNnKVxyXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRCdWZmZXIgPSBhd2FpdCBpbWFnZVByb2Nlc3ModHJhbnNmb3JtZWRCdWZmZXIgPz8gaW5mby5idWZmZXIsIGNvbXByZXNzT3B0aW9ucywgaW5mby5leHRuYW1lID8/ICcnKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoIXRyYW5zZm9ybWVkQnVmZmVyICYmIGNvbXByZXNzT3B0aW9ucz8uaXNSZW1vdmVFeGlmKSB7XHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLmluZm8oJ1JlbW92ZSBleGlmIGluZm8uJylcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQnVmZmVyID0gYXdhaXQgcmVtb3ZlRXhpZihpbmZvLmJ1ZmZlciwgaW5mby5leHRuYW1lID8/ICcnKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtZWRCdWZmZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBuZXdFeHRcclxuICAgICAgICAgICAgICAgIGlmIChjb21wcmVzc09wdGlvbnM/LmlzQ29udmVydCkge1xyXG4gICAgICAgICAgICAgICAgICBuZXdFeHQgPSBjb21wcmVzc09wdGlvbnM/LmNvbnZlcnRGb3JtYXQgPz8gJ2pwZydcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIG5ld0V4dCA9IGluZm8uZXh0bmFtZSA/PyAnJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbmV3RXh0ID0gbmV3RXh0LnN0YXJ0c1dpdGgoJy4nKSA/IG5ld0V4dCA6IGAuJHtuZXdFeHR9YFxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcEZpbGUgPSBwYXRoLmpvaW4odGVtcEZpbGVQYXRoLCBgJHtpbmZvLmZpbGVOYW1lXHJcbiAgICAgICAgICAgICAgICAgID8gYCR7cGF0aC5iYXNlbmFtZShpbmZvLmZpbGVOYW1lLCBwYXRoLmV4dG5hbWUoaW5mby5maWxlTmFtZSkpfSR7bmV3RXh0fWBcclxuICAgICAgICAgICAgICAgICAgOiBuZXcgRGF0ZSgpLmdldFRpbWUoKX0ke25ld0V4dH1gKVxyXG4gICAgICAgICAgICAgICAgY3R4LnJhd0lucHV0UGF0aCFbaW5kZXhdID0gcGF0aC5qb2luKHBhdGguZGlybmFtZShpdGVtKSwgcGF0aC5iYXNlbmFtZSh0ZW1wRmlsZSkpXHJcbiAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBGaWxlLCB0cmFuc2Zvcm1lZEJ1ZmZlcilcclxuICAgICAgICAgICAgICAgIGN0eC5pbnB1dFtpbmRleF0gPSB0ZW1wRmlsZVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW5mby5yZWFzb24pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB0cmFuc2Zvcm1lZEJ1ZmZlclxyXG4gICAgICAgICAgICBjdHgucmF3SW5wdXRQYXRoIVtpbmRleF0gPSBpdGVtXHJcbiAgICAgICAgICAgIGlmIChuZWVkQWRkV2F0ZXJtYXJrKHdhdGVybWFya09wdGlvbnMsIHBhdGguZXh0bmFtZShpdGVtKSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCBkb3dubG9hZFRURlJldCA9IGF3YWl0IHRoaXMuZG93bmxvYWRUVEYoKVxyXG4gICAgICAgICAgICAgIGlmICghZG93bmxvYWRUVEZSZXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3R4LmxvZy53YXJuKCdEb3dubG9hZCB0dGYgZmlsZSBmYWlsZWQsIHNraXAgYWRkIHdhdGVybWFyay4nKVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLmluZm8od2F0ZXJtYXJrTXNnKVxyXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRCdWZmZXIgPSBhd2FpdCBpbWFnZUFkZFdhdGVyTWFyayhmcy5yZWFkRmlsZVN5bmMoaXRlbSksIHdhdGVybWFya09wdGlvbnMsIHRoaXMudHRmUGF0aClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG5lZWRDb21wcmVzcyhjb21wcmVzc09wdGlvbnMsIHBhdGguZXh0bmFtZShpdGVtKSkpIHtcclxuICAgICAgICAgICAgICBjdHgubG9nLmluZm8oY29tcHJlc3NNc2cpXHJcbiAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShpdGVtKSA9PT0gJy5oZWljJyB8fCBwYXRoLmV4dG5hbWUoaXRlbSkgPT09ICcuaGVpZicpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWNCdWZmZXIgPSBmcy5yZWFkRmlsZVN5bmMoaXRlbSlcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWNSZXN1bHQgPSBhd2FpdCBoZWljQ29udmVydCh7XHJcbiAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogaGVpY0J1ZmZlcixcclxuICAgICAgICAgICAgICAgICAgZm9ybWF0OiAnSlBFRycsXHJcbiAgICAgICAgICAgICAgICAgIHF1YWxpdHk6IDFcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wSGVpY0NvbnZlcnRGaWxlID0gcGF0aC5qb2luKHRlbXBGaWxlUGF0aCwgYCR7cGF0aC5iYXNlbmFtZShpdGVtLCBwYXRoLmV4dG5hbWUoaXRlbSkpfS5qcGdgKVxyXG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0ZW1wSGVpY0NvbnZlcnRGaWxlLCBCdWZmZXIuZnJvbShoZWljUmVzdWx0KSlcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQnVmZmVyID0gYXdhaXQgaW1hZ2VQcm9jZXNzKGZzLnJlYWRGaWxlU3luYyh0ZW1wSGVpY0NvbnZlcnRGaWxlKSwgY29tcHJlc3NPcHRpb25zLCAnLmpwZycpXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQnVmZmVyID0gYXdhaXQgaW1hZ2VQcm9jZXNzKHRyYW5zZm9ybWVkQnVmZmVyID8/IGZzLnJlYWRGaWxlU3luYyhpdGVtKSwgY29tcHJlc3NPcHRpb25zLCBwYXRoLmV4dG5hbWUoaXRlbSkpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghdHJhbnNmb3JtZWRCdWZmZXIgJiYgY29tcHJlc3NPcHRpb25zPy5pc1JlbW92ZUV4aWYpIHtcclxuICAgICAgICAgICAgICBjdHgubG9nLmluZm8oJ1JlbW92ZSBleGlmIGluZm8uJylcclxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZEJ1ZmZlciA9IGF3YWl0IHJlbW92ZUV4aWYoZnMucmVhZEZpbGVTeW5jKGl0ZW0pLCBwYXRoLmV4dG5hbWUoaXRlbSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVkQnVmZmVyKSB7XHJcbiAgICAgICAgICAgICAgbGV0IG5ld0V4dFxyXG4gICAgICAgICAgICAgIGlmIChjb21wcmVzc09wdGlvbnM/LmlzQ29udmVydCkge1xyXG4gICAgICAgICAgICAgICAgbmV3RXh0ID0gY29tcHJlc3NPcHRpb25zPy5jb252ZXJ0Rm9ybWF0ID8/ICdqcGcnXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5ld0V4dCA9IHBhdGguZXh0bmFtZShpdGVtKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBuZXdFeHQgPSBuZXdFeHQuc3RhcnRzV2l0aCgnLicpID8gbmV3RXh0IDogYC4ke25ld0V4dH1gXHJcbiAgICAgICAgICAgICAgY29uc3QgdGVtcEZpbGUgPSBwYXRoLmpvaW4odGVtcEZpbGVQYXRoLCBgJHtwYXRoLmJhc2VuYW1lKGl0ZW0sIHBhdGguZXh0bmFtZShpdGVtKSl9JHtuZXdFeHR9YClcclxuICAgICAgICAgICAgICBjdHgucmF3SW5wdXRQYXRoIVtpbmRleF0gPSBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKGl0ZW0pLCBgJHtwYXRoLmJhc2VuYW1lKGl0ZW0sIHBhdGguZXh0bmFtZShpdGVtKSl9JHtuZXdFeHR9YClcclxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBGaWxlLCB0cmFuc2Zvcm1lZEJ1ZmZlcilcclxuICAgICAgICAgICAgICBjdHguaW5wdXRbaW5kZXhdID0gdGVtcEZpbGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjdHguaW5wdXQpIHtcclxuICAgICAgICAgIGN0eC5yYXdJbnB1dFBhdGgucHVzaChpdGVtKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBsaWZlY3ljbGUgbWFpblxyXG4gICAgICBhd2FpdCB0aGlzLmJlZm9yZVRyYW5zZm9ybShjdHgpXHJcbiAgICAgIGF3YWl0IHRoaXMuZG9UcmFuc2Zvcm0oY3R4KVxyXG4gICAgICBjb25zdCByZW5hbWVDb25maWcgPSBjdHguZ2V0Q29uZmlnPGFueT4oJ2J1aWxkSW4ucmVuYW1lJykgfHwge31cclxuICAgICAgaWYgKHJlbmFtZUNvbmZpZy5lbmFibGUpIHtcclxuICAgICAgICBjb25zdCBmb3JtYXQgPSByZW5hbWVDb25maWcuZm9ybWF0IHx8ICd7ZmlsZW5hbWV9J1xyXG4gICAgICAgIGN0eC5vdXRwdXQgPSBjdHgub3V0cHV0Lm1hcCgoaXRlbTogSUltZ0luZm8sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGxldCBmaWxlTmFtZSA9IGl0ZW0uZmlsZU5hbWVcclxuICAgICAgICAgIGlmIChmb3JtYXQpIHtcclxuICAgICAgICAgICAgZmlsZU5hbWUgPSByZW5hbWVGaWxlTmFtZVdpdGhDdXN0b21TdHJpbmcoY3R4LnJhd0lucHV0UGF0aCFbaW5kZXhdLCBmb3JtYXQpXHJcbiAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgvXFwvKy9nLCAnLycpXHJcbiAgICAgICAgICAgIGlmIChmaWxlTmFtZS5zbGljZSgtMSkgPT09ICcvJykge1xyXG4gICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUgKyBpbmRleC50b1N0cmluZygpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGl0ZW0uZmlsZU5hbWUgPSBmaWxlTmFtZVxyXG4gICAgICAgICAgcmV0dXJuIGl0ZW1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IHRoaXMuYmVmb3JlVXBsb2FkKGN0eClcclxuICAgICAgYXdhaXQgdGhpcy5kb1VwbG9hZChjdHgpXHJcbiAgICAgIGN0eC5pbnB1dCA9IGN0eC5yYXdJbnB1dFxyXG4gICAgICBhd2FpdCB0aGlzLmFmdGVyVXBsb2FkKGN0eClcclxuICAgICAgcmV0dXJuIGN0eFxyXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgIGN0eC5sb2cud2FybihJQnVpbGRJbkV2ZW50LkZBSUxFRClcclxuICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIC0xKVxyXG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LkZBSUxFRCwgZSlcclxuICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICBpZiAoY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PignZGVidWcnKSkge1xyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY3R4XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGJlZm9yZVRyYW5zZm9ybSAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIDApXHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LkJFRk9SRV9UUkFOU0ZPUk0sIGN0eClcclxuICAgIGN0eC5sb2cuaW5mbygnQmVmb3JlIHRyYW5zZm9ybScpXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVBsdWdpbnMoY3R4LmhlbHBlci5iZWZvcmVUcmFuc2Zvcm1QbHVnaW5zLCBjdHgpXHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRvVHJhbnNmb3JtIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgMzApXHJcbiAgICBjb25zdCB0eXBlID0gY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnRyYW5zZm9ybWVyJykgfHwgJ3BhdGgnXHJcbiAgICBsZXQgY3VycmVudFRyYW5zZm9ybWVyID0gdHlwZVxyXG4gICAgbGV0IHRyYW5zZm9ybWVyID0gY3R4LmhlbHBlci50cmFuc2Zvcm1lci5nZXQodHlwZSlcclxuICAgIGlmICghdHJhbnNmb3JtZXIpIHtcclxuICAgICAgdHJhbnNmb3JtZXIgPSBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldCgncGF0aCcpXHJcbiAgICAgIGN1cnJlbnRUcmFuc2Zvcm1lciA9ICdwYXRoJ1xyXG4gICAgICBjdHgubG9nLndhcm4oYENhbid0IGZpbmQgdHJhbnNmb3JtZXIgLSAke3R5cGV9LCBzd2l0Y2ggdG8gZGVmYXVsdCB0cmFuc2Zvcm1lciAtIHBhdGhgKVxyXG4gICAgfVxyXG4gICAgY3R4LmxvZy5pbmZvKGBUcmFuc2Zvcm1pbmcuLi4gQ3VycmVudCB0cmFuc2Zvcm1lciBpcyBbJHtjdXJyZW50VHJhbnNmb3JtZXJ9XWApXHJcbiAgICBhd2FpdCB0cmFuc2Zvcm1lcj8uaGFuZGxlKGN0eClcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYmVmb3JlVXBsb2FkIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgNjApXHJcbiAgICBjdHgubG9nLmluZm8oJ0JlZm9yZSB1cGxvYWQnKVxyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5CRUZPUkVfVVBMT0FELCBjdHgpXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVBsdWdpbnMoY3R4LmhlbHBlci5iZWZvcmVVcGxvYWRQbHVnaW5zLCBjdHgpXHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRvVXBsb2FkIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBsZXQgdHlwZSA9IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC51cGxvYWRlcicpIHx8IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC5jdXJyZW50JykgfHwgJ3NtbXMnXHJcbiAgICBsZXQgdXBsb2FkZXIgPSBjdHguaGVscGVyLnVwbG9hZGVyLmdldCh0eXBlKVxyXG4gICAgbGV0IGN1cnJlbnRUcmFuc2Zvcm1lciA9IHR5cGVcclxuICAgIGlmICghdXBsb2FkZXIpIHtcclxuICAgICAgdHlwZSA9ICdzbW1zJ1xyXG4gICAgICBjdXJyZW50VHJhbnNmb3JtZXIgPSAnc21tcydcclxuICAgICAgdXBsb2FkZXIgPSBjdHguaGVscGVyLnVwbG9hZGVyLmdldCgnc21tcycpXHJcbiAgICAgIGN0eC5sb2cud2FybihgQ2FuJ3QgZmluZCB1cGxvYWRlciAtICR7dHlwZX0sIHN3aXRjaCB0byBkZWZhdWx0IHVwbG9hZGVyIC0gc21tc2ApXHJcbiAgICB9XHJcbiAgICBjdHgubG9nLmluZm8oYFVwbG9hZGluZy4uLiBDdXJyZW50IHVwbG9hZGVyIGlzIFske2N1cnJlbnRUcmFuc2Zvcm1lcn1dYClcclxuICAgIGF3YWl0IHVwbG9hZGVyPy5oYW5kbGUoY3R4KVxyXG4gICAgZm9yIChjb25zdCBvdXRwdXRJbWcgb2YgY3R4Lm91dHB1dCkge1xyXG4gICAgICBvdXRwdXRJbWcudHlwZSA9IHR5cGVcclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYWZ0ZXJVcGxvYWQgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuQUZURVJfVVBMT0FELCBjdHgpXHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgMTAwKVxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVQbHVnaW5zKGN0eC5oZWxwZXIuYWZ0ZXJVcGxvYWRQbHVnaW5zLCBjdHgpXHJcbiAgICBsZXQgbXNnID0gJydcclxuICAgIGNvbnN0IGxlbmd0aCA9IGN0eC5vdXRwdXQubGVuZ3RoXHJcbiAgICBjb25zdCBpc0VuY29kZU91dHB1dFVSTCA9IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8Ym9vbGVhbj4+KCdzZXR0aW5ncy5lbmNvZGVPdXRwdXRVUkwnKSA9PT0gdHJ1ZVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodHlwZW9mIGN0eC5vdXRwdXRbaV0uaW1nVXJsICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIG1zZyArPSBpc0VuY29kZU91dHB1dFVSTCA/IGhhbmRsZVVybEVuY29kZShjdHgub3V0cHV0W2ldLmltZ1VybCEpIDogY3R4Lm91dHB1dFtpXS5pbWdVcmwhXHJcbiAgICAgICAgaWYgKGkgIT09IGxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgIG1zZyArPSAnXFxuJ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBkZWxldGUgY3R4Lm91dHB1dFtpXS5iYXNlNjRJbWFnZVxyXG4gICAgICBkZWxldGUgY3R4Lm91dHB1dFtpXS5idWZmZXJcclxuICAgIH1cclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuRklOSVNIRUQsIGN0eClcclxuICAgIGN0eC5sb2cuc3VjY2VzcyhgXFxuJHttc2d9YClcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUGx1Z2lucyAobGlmZUN5Y2xlUGx1Z2luczogSUxpZmVjeWNsZVBsdWdpbnMsIGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBsaWZlQ3ljbGVQbHVnaW5zLmdldExpc3QoKVxyXG4gICAgY29uc3QgcGx1Z2luTmFtZXMgPSBsaWZlQ3ljbGVQbHVnaW5zLmdldElkTGlzdCgpXHJcbiAgICBjb25zdCBsaWZlQ3ljbGVOYW1lID0gbGlmZUN5Y2xlUGx1Z2lucy5nZXROYW1lKClcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHBsdWdpbnMubWFwKGFzeW5jIChwbHVnaW46IElQbHVnaW4sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjdHgubG9nLmluZm8oYCR7bGlmZUN5Y2xlTmFtZX06ICR7cGx1Z2luTmFtZXNbaW5kZXhdfSBydW5uaW5nYClcclxuICAgICAgICBhd2FpdCBwbHVnaW4uaGFuZGxlKGN0eClcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGN0eC5sb2cuZXJyb3IoYCR7bGlmZUN5Y2xlTmFtZX06ICR7cGx1Z2luTmFtZXNbaW5kZXhdfSBlcnJvcmApXHJcbiAgICAgICAgdGhyb3cgZVxyXG4gICAgICB9XHJcbiAgICB9KSlcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExpZmVjeWNsZVxyXG4iLCJpbXBvcnQgeyBJUGljR28gfSBmcm9tICcuLi90eXBlcydcclxuXHJcbi8qKlxyXG4gKiBjcmVhdGUgYW4gdW5pcXVlIGNvbnRleHQgZm9yIGVhY2ggdXBsb2FkIHByb2Nlc3NcclxuICogQHBhcmFtIGN0eFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNyZWF0ZUNvbnRleHQgPSAoY3R4OiBJUGljR28pOiBJUGljR28gPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICBjb25maWdQYXRoOiBjdHguY29uZmlnUGF0aCxcclxuICAgIGJhc2VEaXI6IGN0eC5iYXNlRGlyLFxyXG4gICAgbG9nOiBjdHgubG9nLFxyXG4gICAgY21kOiBjdHguY21kLFxyXG4gICAgb3V0cHV0OiBbXSxcclxuICAgIGlucHV0OiBbXSxcclxuICAgIHJhd0lucHV0OiBbXSxcclxuICAgIHBsdWdpbkxvYWRlcjogY3R4LnBsdWdpbkxvYWRlcixcclxuICAgIHBsdWdpbkhhbmRsZXI6IGN0eC5wbHVnaW5IYW5kbGVyLFxyXG4gICAgUmVxdWVzdDogY3R4LlJlcXVlc3QsXHJcbiAgICBoZWxwZXI6IGN0eC5oZWxwZXIsXHJcbiAgICBWRVJTSU9OOiBjdHguVkVSU0lPTixcclxuICAgIEdVSV9WRVJTSU9OOiBjdHguR1VJX1ZFUlNJT04sXHJcbiAgICByZXF1ZXN0OiBjdHgucmVxdWVzdCxcclxuICAgIGkxOG46IGN0eC5pMThuLFxyXG4gICAgZ2V0Q29uZmlnOiBjdHguZ2V0Q29uZmlnLmJpbmQoY3R4KSxcclxuICAgIHNhdmVDb25maWc6IGN0eC5zYXZlQ29uZmlnLmJpbmQoY3R4KSxcclxuICAgIHJlbW92ZUNvbmZpZzogY3R4LnJlbW92ZUNvbmZpZy5iaW5kKGN0eCksXHJcbiAgICBzZXRDb25maWc6IGN0eC5zZXRDb25maWcuYmluZChjdHgpLFxyXG4gICAgdW5zZXRDb25maWc6IGN0eC51bnNldENvbmZpZy5iaW5kKGN0eCksXHJcbiAgICB1cGxvYWQ6IGN0eC51cGxvYWQuYmluZChjdHgpLFxyXG4gICAgYWRkTGlzdGVuZXI6IGN0eC5hZGRMaXN0ZW5lci5iaW5kKGN0eCksXHJcbiAgICBvbjogY3R4Lm9uLmJpbmQoY3R4KSxcclxuICAgIG9uY2U6IGN0eC5vbmNlLmJpbmQoY3R4KSxcclxuICAgIHJlbW92ZUxpc3RlbmVyOiBjdHgucmVtb3ZlTGlzdGVuZXIuYmluZChjdHgpLFxyXG4gICAgb2ZmOiBjdHgub2ZmLmJpbmQoY3R4KSxcclxuICAgIHJlbW92ZUFsbExpc3RlbmVyczogY3R4LnJlbW92ZUFsbExpc3RlbmVycy5iaW5kKGN0eCksXHJcbiAgICBzZXRNYXhMaXN0ZW5lcnM6IGN0eC5zZXRNYXhMaXN0ZW5lcnMuYmluZChjdHgpLFxyXG4gICAgZ2V0TWF4TGlzdGVuZXJzOiBjdHguZ2V0TWF4TGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIGxpc3RlbmVyczogY3R4Lmxpc3RlbmVycy5iaW5kKGN0eCksXHJcbiAgICByYXdMaXN0ZW5lcnM6IGN0eC5yYXdMaXN0ZW5lcnMuYmluZChjdHgpLFxyXG4gICAgZW1pdDogY3R4LmVtaXQuYmluZChjdHgpLFxyXG4gICAgbGlzdGVuZXJDb3VudDogY3R4Lmxpc3RlbmVyQ291bnQuYmluZChjdHgpLFxyXG4gICAgcHJlcGVuZExpc3RlbmVyOiBjdHgucHJlcGVuZExpc3RlbmVyLmJpbmQoY3R4KSxcclxuICAgIHByZXBlbmRPbmNlTGlzdGVuZXI6IGN0eC5wcmVwZW5kT25jZUxpc3RlbmVyLmJpbmQoY3R4KSxcclxuICAgIGV2ZW50TmFtZXM6IGN0eC5ldmVudE5hbWVzLmJpbmQoY3R4KVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW5Db25maWcsIElTbW1zQ29uZmlnLCBJT2xkUmVxT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAoZmlsZU5hbWU6IHN0cmluZywgaW1hZ2U6IEJ1ZmZlciwgYXBpVG9rZW46IHN0cmluZywgYmFja3VwRG9tYWluID0gJycpOiBJT2xkUmVxT3B0aW9ucyA9PiB7XHJcbiAgY29uc3QgZG9tYWluID0gYmFja3VwRG9tYWluIHx8ICdzbS5tcydcclxuICByZXR1cm4ge1xyXG4gICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICB1cmw6IGBodHRwczovLyR7ZG9tYWlufS9hcGkvdjIvdXBsb2FkYCxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgY29udGVudFR5cGU6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcclxuICAgICAgJ1VzZXItQWdlbnQnOiAnUGljTGlzdCcsXHJcbiAgICAgIEF1dGhvcml6YXRpb246IGFwaVRva2VuXHJcbiAgICB9LFxyXG4gICAgZm9ybURhdGE6IHtcclxuICAgICAgc21maWxlOiB7XHJcbiAgICAgICAgdmFsdWU6IGltYWdlLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIGZpbGVuYW1lOiBmaWxlTmFtZVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgc3NsOiAndHJ1ZSdcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3Qgc21tc0NvbmZpZyA9IGN0eC5nZXRDb25maWc8SVNtbXNDb25maWc+KCdwaWNCZWQuc21tcycpXHJcbiAgaWYgKCFzbW1zQ29uZmlnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgZmluZCBzbW1zIGNvbmZpZyEnKVxyXG4gIH1cclxuICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHBvc3RDb25maWcgPSBwb3N0T3B0aW9ucyhpbWcuZmlsZU5hbWUsIGltYWdlLCBzbW1zQ29uZmlnPy50b2tlbiwgc21tc0NvbmZpZz8uYmFja3VwRG9tYWluKVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlczogc3RyaW5nID0gYXdhaXQgY3R4LnJlcXVlc3QocG9zdENvbmZpZylcclxuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShyZXMpXHJcbiAgICAgICAgaWYgKGJvZHkuY29kZSA9PT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGJvZHkuZGF0YS51cmxcclxuICAgICAgICAgIGltZy5oYXNoID0gYm9keS5kYXRhLmhhc2hcclxuICAgICAgICB9IGVsc2UgaWYgKGJvZHkuY29kZSA9PT0gJ2ltYWdlX3JlcGVhdGVkJyAmJiB0eXBlb2YgYm9keS5pbWFnZXMgPT09ICdzdHJpbmcnKSB7IC8vIGRvIGV4dHJhIGNoZWNrIHNpbmNlIHRoaXMgZXJyb3IgcmV0dXJuIGlzIG5vdCBkb2N1bWVudGVkIGF0IGh0dHBzOi8vZG9jLnNtLm1zLyNhcGktSW1hZ2UtVXBsb2FkXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGJvZHkuaW1hZ2VzXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgICAgICAgIGJvZHk6IGJvZHkubWVzc2FnZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihib2R5Lm1lc3NhZ2UpXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICBjdHgubG9nLmVycm9yKGUpXHJcbiAgICAgICAgdGhyb3cgZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBjdHhcclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJU21tc0NvbmZpZz4oJ3BpY0JlZC5zbW1zJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Rva2VuJyxcclxuICAgICAgbWVzc2FnZTogJ2FwaSB0b2tlbicsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU01NU19UT0tFTicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudG9rZW4gfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYmFja3VwRG9tYWluJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkge1xyXG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU4nKVxyXG4gICAgICB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYmFja3VwRG9tYWluIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdzbW1zJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVMnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0bydcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJVGN5dW5Db25maWcsIElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuLy8gZ2VuZXJhdGUgQ09TIHNpZ25hdHVyZSBzdHJpbmdcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNpZ25hdHVyZSB7XHJcbiAgc2lnbmF0dXJlOiBzdHJpbmdcclxuICBhcHBJZDogc3RyaW5nXHJcbiAgYnVja2V0OiBzdHJpbmdcclxuICBzaWduVGltZTogc3RyaW5nXHJcbn1cclxuXHJcbmNvbnN0IGdlbmVyYXRlU2lnbmF0dXJlID0gKG9wdGlvbnM6IElUY3l1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZyk6IElTaWduYXR1cmUgPT4ge1xyXG4gIGNvbnN0IHNlY3JldElkID0gb3B0aW9ucy5zZWNyZXRJZFxyXG4gIGNvbnN0IHNlY3JldEtleSA9IG9wdGlvbnMuc2VjcmV0S2V5XHJcbiAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkXHJcbiAgY29uc3QgYnVja2V0ID0gb3B0aW9ucy5idWNrZXRcclxuICBsZXQgc2lnbmF0dXJlXHJcbiAgbGV0IHNpZ25UaW1lOiBzdHJpbmcgPSAnJ1xyXG4gIGlmICghb3B0aW9ucy52ZXJzaW9uIHx8IG9wdGlvbnMudmVyc2lvbiA9PT0gJ3Y0Jykge1xyXG4gICAgY29uc3QgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAwMDApXHJcbiAgICBjb25zdCBjdXJyZW50ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApIC0gMVxyXG4gICAgY29uc3QgZXhwaXJlZCA9IGN1cnJlbnQgKyAzNjAwXHJcblxyXG4gICAgY29uc3QgbXVsdGlTaWduYXR1cmUgPSBgYT0ke2FwcElkfSZiPSR7YnVja2V0fSZrPSR7c2VjcmV0SWR9JmU9JHtleHBpcmVkfSZ0PSR7Y3VycmVudH0mcj0ke3JhbmRvbX0mZj1gXHJcblxyXG4gICAgY29uc3Qgc2lnbkhleEtleSA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgc2VjcmV0S2V5KS51cGRhdGUobXVsdGlTaWduYXR1cmUpLmRpZ2VzdCgpXHJcbiAgICBjb25zdCB0ZW1wU3RyaW5nID0gQnVmZmVyLmNvbmNhdChbc2lnbkhleEtleSwgQnVmZmVyLmZyb20obXVsdGlTaWduYXR1cmUpXSlcclxuICAgIHNpZ25hdHVyZSA9IEJ1ZmZlci5mcm9tKHRlbXBTdHJpbmcpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3Nzgjc2lnbmF0dXJlXHJcbiAgICBjb25zdCB0b2RheSA9IE1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKVxyXG4gICAgY29uc3QgdG9tb3Jyb3cgPSB0b2RheSArIDg2NDAwXHJcbiAgICBzaWduVGltZSA9IGAke3RvZGF5fTske3RvbW9ycm93fWBcclxuICAgIGNvbnN0IHNpZ25LZXkgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIHNlY3JldEtleSkudXBkYXRlKHNpZ25UaW1lKS5kaWdlc3QoJ2hleCcpXHJcbiAgICBjb25zdCBodHRwU3RyaW5nID0gYHB1dFxcbi8ke29wdGlvbnMucGF0aH0ke2ZpbGVOYW1lfVxcblxcbmhvc3Q9JHtvcHRpb25zLmJ1Y2tldH0uY29zLiR7b3B0aW9ucy5hcmVhfS5teXFjbG91ZC5jb21cXG5gXHJcbiAgICBjb25zdCBzaGExZWRIdHRwU3RyaW5nID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUoaHR0cFN0cmluZykuZGlnZXN0KCdoZXgnKVxyXG4gICAgY29uc3Qgc3RyaW5nVG9TaWduID0gYHNoYTFcXG4ke3NpZ25UaW1lfVxcbiR7c2hhMWVkSHR0cFN0cmluZ31cXG5gXHJcbiAgICBzaWduYXR1cmUgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIHNpZ25LZXkpLnVwZGF0ZShzdHJpbmdUb1NpZ24pLmRpZ2VzdCgnaGV4JylcclxuICB9XHJcbiAgcmV0dXJuIHtcclxuICAgIHNpZ25hdHVyZSxcclxuICAgIGFwcElkLFxyXG4gICAgYnVja2V0LFxyXG4gICAgc2lnblRpbWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElUY3l1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgc2lnbmF0dXJlOiBJU2lnbmF0dXJlLCBpbWFnZTogQnVmZmVyLCB2ZXJzaW9uOiBzdHJpbmcpOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xyXG4gIGNvbnN0IGFyZWEgPSBvcHRpb25zLmFyZWFcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoXHJcbiAgaWYgKCFvcHRpb25zLnZlcnNpb24gfHwgb3B0aW9ucy52ZXJzaW9uID09PSAndjQnKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgdXJsOiBgaHR0cDovLyR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb20vZmlsZXMvdjIvJHtzaWduYXR1cmUuYXBwSWR9LyR7c2lnbmF0dXJlLmJ1Y2tldH0vJHtlbmNvZGVVUkkocGF0aCl9JHtmaWxlTmFtZX1gLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgSG9zdDogYCR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb21gLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IHNpZ25hdHVyZS5zaWduYXR1cmUsXHJcbiAgICAgICAgY29udGVudFR5cGU6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcclxuICAgICAgICAnVXNlci1BZ2VudCc6IGBQaWNHbzske3ZlcnNpb259O251bGw7bnVsbGBcclxuICAgICAgfSxcclxuICAgICAgZm9ybURhdGE6IHtcclxuICAgICAgICBvcDogJ3VwbG9hZCcsXHJcbiAgICAgICAgZmlsZWNvbnRlbnQ6IGltYWdlXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICAgIHVybDogYGh0dHA6Ly8ke29wdGlvbnMuYnVja2V0fS5jb3MuJHtvcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbS8ke2VuY29kZVVSSUNvbXBvbmVudChwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSl9YCxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIEhvc3Q6IGAke29wdGlvbnMuYnVja2V0fS5jb3MuJHtvcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbWAsXHJcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYHEtc2lnbi1hbGdvcml0aG09c2hhMSZxLWFrPSR7b3B0aW9ucy5zZWNyZXRJZH0mcS1zaWduLXRpbWU9JHtzaWduYXR1cmUuc2lnblRpbWV9JnEta2V5LXRpbWU9JHtzaWduYXR1cmUuc2lnblRpbWV9JnEtaGVhZGVyLWxpc3Q9aG9zdCZxLXVybC1wYXJhbS1saXN0PSZxLXNpZ25hdHVyZT0ke3NpZ25hdHVyZS5zaWduYXR1cmV9YCxcclxuICAgICAgICBjb250ZW50VHlwZTogbWltZS5sb29rdXAoZmlsZU5hbWUpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxyXG4gICAgICAgICdVc2VyLUFnZW50JzogYFBpY0dvOyR7dmVyc2lvbn07bnVsbDtudWxsYFxyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBpbWFnZSxcclxuICAgICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvIHwgYm9vbGVhbj4gPT4ge1xyXG4gIGNvbnN0IHRjWXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVRjeXVuQ29uZmlnPigncGljQmVkLnRjeXVuJylcclxuICBpZiAoIXRjWXVuT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgdGVuY2VudCBDT1MgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBjb25zdCBjdXN0b21VcmwgPSB0Y1l1bk9wdGlvbnMuY3VzdG9tVXJsXHJcbiAgICBjb25zdCBwYXRoID0gdGNZdW5PcHRpb25zLnBhdGhcclxuICAgIGNvbnN0IHVzZVY0ID0gIXRjWXVuT3B0aW9ucy52ZXJzaW9uIHx8IHRjWXVuT3B0aW9ucy52ZXJzaW9uID09PSAndjQnXHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGdlbmVyYXRlU2lnbmF0dXJlKHRjWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGlmICghc2lnbmF0dXJlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyh0Y1l1bk9wdGlvbnMsIGltZy5maWxlTmFtZSwgc2lnbmF0dXJlLCBpbWFnZSwgY3R4LkdVSV9WRVJTSU9OIHx8IGN0eC5WRVJTSU9OKVxyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXHJcbiAgICAgICAgICAudGhlbigocmVzOiBhbnkpID0+IHJlcylcclxuICAgICAgICAgIC5jYXRjaCgoZXJyOiBFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDQwMCxcclxuICAgICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgICBtc2c6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0FVVEhfRkFJTEVEJyksXHJcbiAgICAgICAgICAgICAgICBlcnJcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgbGV0IGJvZHlcclxuICAgICAgICBpZiAodXNlVjQgJiYgdHlwZW9mIHJlcyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKHJlcylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYm9keSA9IHJlc1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID09PSA0MDApIHtcclxuICAgICAgICAgIGlmIChib2R5Py5ib2R5Py5lcnIpIHtcclxuICAgICAgICAgICAgdGhyb3cgYm9keS5ib2R5LmVyclxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJvZHk/LmJvZHk/Lm1zZyB8fCBib2R5Py5ib2R5Py5tZXNzYWdlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25VcmwgPSB0Y1l1bk9wdGlvbnMub3B0aW9ucyB8fCAnJ1xyXG4gICAgICAgIGlmICh1c2VWNCAmJiBib2R5Lm1lc3NhZ2UgPT09ICdTVUNDRVNTJykge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGlmIChjdXN0b21VcmwpIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2N1c3RvbVVybH0vJHtwYXRofSR7aW1nLmZpbGVOYW1lfWBcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtib2R5LmRhdGEuc291cmNlX3VybCBhcyBzdHJpbmd9JHtvcHRpb25Vcmx9YFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZVY0ICYmIGJvZHkgJiYgYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpZiAoY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtjdXN0b21Vcmx9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9JHtvcHRpb25Vcmx9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGBodHRwczovLyR7dGNZdW5PcHRpb25zLmJ1Y2tldH0uY29zLiR7dGNZdW5PcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbS8ke2VuY29kZVVSSUNvbXBvbmVudChwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfSR7b3B0aW9uVXJsfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcy5ib2R5Lm1zZylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgaWYgKCF0Y1l1bk9wdGlvbnMudmVyc2lvbiB8fCB0Y1l1bk9wdGlvbnMudmVyc2lvbiA9PT0gJ3Y0Jykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKGVyci5lcnJvcilcclxuICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRURfUkVBU09OJywge1xyXG4gICAgICAgICAgICBjb2RlOiBib2R5LmNvZGUgYXMgc3RyaW5nXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHRleHQ6ICdodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzg0MzInXHJcbiAgICAgICAgfSlcclxuICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgIH1cclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJVGN5dW5Db25maWc+KCdwaWNCZWQudGN5dW4nKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAndmVyc2lvbicsXHJcbiAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgYWxpYXM6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTicpLFxyXG4gICAgICBjaG9pY2VzOiBbJ3Y0JywgJ3Y1J10sXHJcbiAgICAgIGRlZmF1bHQ6ICd2NScsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NlY3JldElkJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnNlY3JldElkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NlY3JldEtleScsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc2VjcmV0S2V5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2J1Y2tldCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYnVja2V0IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FwcElkJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0FQUElEJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFwcElkIHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FyZWEnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUEnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFyZWEgfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2N1c3RvbVVybCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ29wdGlvbnMnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcigndGN5dW4nLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJR2l0aHViQ29uZmlnLCBJT2xkUmVxT3B0aW9uc1dpdGhKU09OIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcblxyXG5jb25zdCBwb3N0T3B0aW9ucyA9IChmaWxlTmFtZTogc3RyaW5nLCBvcHRpb25zOiBJR2l0aHViQ29uZmlnLCBkYXRhOiBhbnkpOiBJT2xkUmVxT3B0aW9uc1dpdGhKU09OID0+IHtcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3QgeyB0b2tlbiwgcmVwbyB9ID0gb3B0aW9uc1xyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgdXJsOiBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke3JlcG99L2NvbnRlbnRzLyR7ZW5jb2RlVVJJKHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBgdG9rZW4gJHt0b2tlbn1gLFxyXG4gICAgICAnVXNlci1BZ2VudCc6ICdQaWNMaXN0JyxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xyXG4gICAgfSxcclxuICAgIGJvZHk6IGRhdGEsXHJcbiAgICBqc29uOiB0cnVlXHJcbiAgfSBhcyBjb25zdFxyXG59XHJcblxyXG5jb25zdCBnZXRPcHRpb25zID0gKGZpbGVOYW1lOiBzdHJpbmcsIG9wdGlvbnM6IElHaXRodWJDb25maWcpOiBJT2xkUmVxT3B0aW9uc1dpdGhKU09OID0+IHtcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3QgeyB0b2tlbiwgcmVwbywgYnJhbmNoIH0gPSBvcHRpb25zXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICB1cmw6IGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7cmVwb30vY29udGVudHMvJHtlbmNvZGVVUkkocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpfT9yZWY9JHticmFuY2h9YC5yZXBsYWNlKC8lMkYvZywgJy8nKSxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQXV0aG9yaXphdGlvbjogYHRva2VuICR7dG9rZW59YCxcclxuICAgICAgJ1VzZXItQWdlbnQnOiAnUGljR28nXHJcbiAgICB9LFxyXG4gICAganNvbjogdHJ1ZVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjb25zdCBnaXRodWJPcHRpb25zID0gY3R4LmdldENvbmZpZzxJR2l0aHViQ29uZmlnPigncGljQmVkLmdpdGh1YicpXHJcbiAgaWYgKCFnaXRodWJPcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCBnaXRodWIgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICBtZXNzYWdlOiAnVXBsb2FkIGJ5IFBpY0xpc3QnLFxyXG4gICAgICAgICAgYnJhbmNoOiBnaXRodWJPcHRpb25zLmJyYW5jaCxcclxuICAgICAgICAgIGNvbnRlbnQ6IGJhc2U2NEltYWdlLFxyXG4gICAgICAgICAgcGF0aDogZ2l0aHViT3B0aW9ucy5wYXRoICsgZW5jb2RlVVJJKGltZy5maWxlTmFtZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcG9zdENvbmZpZyA9IHBvc3RPcHRpb25zKGltZy5maWxlTmFtZSwgZ2l0aHViT3B0aW9ucywgZGF0YSlcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgYm9keToge1xyXG4gICAgICAgICAgICBjb250ZW50OiB7XHJcbiAgICAgICAgICAgICAgZG93bmxvYWRfdXJsOiBzdHJpbmdcclxuICAgICAgICAgICAgICBzaGE6IHN0cmluZ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ID0gYXdhaXQgY3R4LnJlcXVlc3QocG9zdENvbmZpZylcclxuICAgICAgICAgIGlmIChib2R5KSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgICAgaWYgKGdpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2dpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsfS8ke2VuY29kZVVSSUNvbXBvbmVudChnaXRodWJPcHRpb25zLnBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGltZy5pbWdVcmwgPSBib2R5LmNvbnRlbnQuZG93bmxvYWRfdXJsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW1nLmhhc2ggPSBib2R5LmNvbnRlbnQuc2hhXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpbicpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgICAgICAgIGlmIChlcnIuc3RhdHVzQ29kZSA9PT0gNDIyKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3QoZ2V0T3B0aW9ucyhpbWcuZmlsZU5hbWUsIGdpdGh1Yk9wdGlvbnMpKSBhcyBhbnlcclxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlcykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgaW1nLmhhc2ggPSByZXMuc2hhXHJcbiAgICAgICAgICAgICAgaWYgKGdpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Z2l0aHViT3B0aW9ucy5jdXN0b21Vcmx9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGdpdGh1Yk9wdGlvbnMucGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGltZy5pbWdVcmwgPSByZXMuZG93bmxvYWRfdXJsXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR2V0IENvbnRlbnRzIGVycm9yLCBwbGVhc2UgdHJ5IGFnYWluJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJyXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSycpXHJcbiAgICB9KVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElHaXRodWJDb25maWc+KCdwaWNCZWQuZ2l0aHViJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3JlcG8nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUkVQTycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX1JFUE8nKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTycpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucmVwbyB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdicmFuY2gnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQlJBTkNIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQlJBTkNIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9NRVNTQUdFX0JSQU5DSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYnJhbmNoIHx8ICdtYXN0ZXInLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Rva2VuJyxcclxuICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfVE9LRU4nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnRva2VuIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY3VzdG9tVXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcignZ2l0aHViJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQicpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCBxaW5pdSBmcm9tICdxaW5pdSdcclxuaW1wb3J0IHsgSVBsdWdpbkNvbmZpZywgSVFpbml1Q29uZmlnLCBJUGljR28sIElPbGRSZXFPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcblxyXG5mdW5jdGlvbiBwb3N0T3B0aW9ucyAob3B0aW9uczogSVFpbml1Q29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBpbWdCYXNlNjQ6IHN0cmluZyk6IElPbGRSZXFPcHRpb25zIHtcclxuICBjb25zdCBhcmVhID0gc2VsZWN0QXJlYShvcHRpb25zLmFyZWEgfHwgJ3owJylcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3QgYmFzZTY0RmlsZU5hbWUgPSBCdWZmZXIuZnJvbShwYXRoICsgZmlsZU5hbWUsICd1dGYtOCcpLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKVxyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgIHVybDogYGh0dHA6Ly91cGxvYWQke2FyZWF9LnFpbml1cC5jb20vcHV0YjY0Ly0xL2tleS8ke2Jhc2U2NEZpbGVOYW1lfWAsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEF1dGhvcml6YXRpb246IGBVcFRva2VuICR7dG9rZW59YCxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xyXG4gICAgfSxcclxuICAgIGJvZHk6IGltZ0Jhc2U2NFxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2VsZWN0QXJlYSAoYXJlYTogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gYXJlYSA9PT0gJ3owJyA/ICcnIDogJy0nICsgYXJlYVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRUb2tlbiAocWluaXVPcHRpb25zOiBhbnkpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGFjY2Vzc0tleSA9IHFpbml1T3B0aW9ucy5hY2Nlc3NLZXlcclxuICBjb25zdCBzZWNyZXRLZXkgPSBxaW5pdU9wdGlvbnMuc2VjcmV0S2V5XHJcbiAgY29uc3QgbWFjID0gbmV3IHFpbml1LmF1dGguZGlnZXN0Lk1hYyhhY2Nlc3NLZXksIHNlY3JldEtleSlcclxuICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgc2NvcGU6IHFpbml1T3B0aW9ucy5idWNrZXRcclxuICB9XHJcbiAgY29uc3QgcHV0UG9saWN5ID0gbmV3IHFpbml1LnJzLlB1dFBvbGljeShvcHRpb25zKVxyXG4gIHJldHVybiBwdXRQb2xpY3kudXBsb2FkVG9rZW4obWFjKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHFpbml1T3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVFpbml1Q29uZmlnPigncGljQmVkLnFpbml1JylcclxuICBpZiAoIXFpbml1T3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgcWluaXUgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhxaW5pdU9wdGlvbnMsIGltZy5maWxlTmFtZSwgZ2V0VG9rZW4ocWluaXVPcHRpb25zKSwgYmFzZTY0SW1hZ2UpXHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShyZXMpXHJcbiAgICAgICAgaWYgKGJvZHk/LmtleSkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSBxaW5pdU9wdGlvbnMudXJsXHJcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gcWluaXVPcHRpb25zLm9wdGlvbnNcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtiYXNlVXJsfS8ke2JvZHkua2V5IGFzIHN0cmluZ30ke29wdGlvbnN9YFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICBib2R5OiBib2R5Lm1zZ1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGN0eC5sb2cuZXJyb3IoJ3Fpbml1IGVycm9yJywgYm9keSlcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXBsb2FkIGZhaWxlZCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGlmIChlcnIubWVzc2FnZSAhPT0gJ1VwbG9hZCBmYWlsZWQnKSB7XHJcbiAgICAgIC8vIGVyci5yZXNwb25zZSBtYXliZSB1bmRlZmluZWRcclxuICAgICAgaWYgKGVyci5yZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyLnJlc3BvbnNlLmJvZHlcclxuICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGVycm9yLmVycm9yXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElRaW5pdUNvbmZpZz4oJ3BpY0JlZC5xaW5pdScpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NLZXknLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX0FDQ0VTU0tFWScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYWNjZXNzS2V5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NlY3JldEtleScsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfU0VDUkVUS0VZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zZWNyZXRLZXkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd1cmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX1VSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FyZWEnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9BUkVBJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9BUkVBJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9QQVRIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcigncWluaXUnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVUnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW5Db25maWcsIElJbWd1ckNvbmZpZywgSU9sZFJlcU9wdGlvbnMsIElGdWxsUmVzcG9uc2UgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbmNvbnN0IGZvcm1hdEFjY2Vzc1Rva2VuID0gKGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBzdHJpbmcgPT4gYWNjZXNzVG9rZW4gPyBhY2Nlc3NUb2tlbi5zdGFydHNXaXRoKCdCZWFyZXInKSA/IGFjY2Vzc1Rva2VuIDogYEJlYXJlciAke2FjY2Vzc1Rva2VufWAgOiAnJ1xyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSBhc3luYyAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElJbWd1ckNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgaW1nQmFzZTY0OiBzdHJpbmcpOiBQcm9taXNlPElPbGRSZXFPcHRpb25zPiA9PiB7XHJcbiAgY29uc3QgY2xpZW50SWQgPSBvcHRpb25zLmNsaWVudElkIHx8ICcnXHJcbiAgY29uc3QgdXNlcm5hbWUgPSBvcHRpb25zLnVzZXJuYW1lIHx8ICcnXHJcbiAgY29uc3QgYWNjZXNzVG9rZW4gPSBmb3JtYXRBY2Nlc3NUb2tlbihvcHRpb25zLmFjY2Vzc1Rva2VuIHx8ICcnKVxyXG4gIGNvbnN0IGFsYnVtID0gb3B0aW9ucy5hbGJ1bSB8fCAnJ1xyXG4gIGxldCBhdXRob3JpemF0aW9uXHJcbiAgaWYgKHVzZXJuYW1lICYmIGFjY2Vzc1Rva2VuKSB7XHJcbiAgICBhdXRob3JpemF0aW9uID0gYWNjZXNzVG9rZW5cclxuICB9IGVsc2UgaWYgKGNsaWVudElkKSB7XHJcbiAgICBhdXRob3JpemF0aW9uID0gYENsaWVudC1JRCAke2NsaWVudElkfWBcclxuICB9IGVsc2Uge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGllbnRJZCBvciBhY2Nlc3NUb2tlbiBpcyByZXF1aXJlZCcpXHJcbiAgfVxyXG4gIGNvbnN0IHJlcXVlc3RPcHRpb25zOiBJT2xkUmVxT3B0aW9ucyA9IHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgdXJsOiAnaHR0cHM6Ly9hcGkuaW1ndXIuY29tLzMvaW1hZ2UnLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBhdXRob3JpemF0aW9uLFxyXG4gICAgICAnY29udGVudC10eXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnLFxyXG4gICAgICBIb3N0OiAnYXBpLmltZ3VyLmNvbScsXHJcbiAgICAgICdVc2VyLUFnZW50JzogJ1BpY0xpc3QnXHJcbiAgICB9LFxyXG4gICAgZm9ybURhdGE6IHtcclxuICAgICAgaW1hZ2U6IGltZ0Jhc2U2NCxcclxuICAgICAgdHlwZTogJ2Jhc2U2NCcsXHJcbiAgICAgIG5hbWU6IGZpbGVOYW1lLFxyXG4gICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZGVkIHdpdGggUGljTGlzdCdcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKHVzZXJuYW1lICYmIGFjY2Vzc1Rva2VuICYmIGFsYnVtKSB7XHJcbiAgICBsZXQgaW5pdFBhZ2VzID0gMFxyXG4gICAgbGV0IHJlc1xyXG4gICAgbGV0IGFsYnVtSGFzaCA9ICcnXHJcbiAgICBkbyB7XHJcbiAgICAgIGNvbnN0IGdldEFsYnVtSGFzaE9wdGlvbnM6IElPbGRSZXFPcHRpb25zID0ge1xyXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgdXJsOiBgaHR0cHM6Ly9hcGkuaW1ndXIuY29tLzMvYWNjb3VudC8ke3VzZXJuYW1lfS9hbGJ1bXMvJHtpbml0UGFnZXN9YCxcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRob3JpemF0aW9uXHJcbiAgICAgICAgfSxcclxuICAgICAgICBqc29uOiB0cnVlLFxyXG4gICAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxyXG4gICAgICAgIHRpbWVvdXQ6IDEwMDAwXHJcbiAgICAgIH1cclxuICAgICAgaWYgKG9wdGlvbnMucHJveHkpIHtcclxuICAgICAgICBnZXRBbGJ1bUhhc2hPcHRpb25zLnByb3h5ID0gb3B0aW9ucy5wcm94eVxyXG4gICAgICB9XHJcbiAgICAgIHJlcyA9IGF3YWl0IGN0eC5yZXF1ZXN0KGdldEFsYnVtSGFzaE9wdGlvbnMpIGFzIHVua25vd24gYXMgSUZ1bGxSZXNwb25zZVxyXG4gICAgICBpZiAoIShyZXMuc3RhdHVzQ29kZSA9PT0gMjAwICYmIHJlcy5ib2R5LnN1Y2Nlc3MpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFsYnVtTGlzdCA9IHJlcy5ib2R5LmRhdGFcclxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFsYnVtTGlzdCkge1xyXG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBhbGJ1bSkge1xyXG4gICAgICAgICAgYWxidW1IYXNoID0gaXRlbS5pZFxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaW5pdFBhZ2VzKytcclxuICAgIH0gd2hpbGUgKHJlcy5ib2R5LmRhdGEubGVuZ3RoID4gMClcclxuICAgIGlmIChhbGJ1bUhhc2ggJiYgcmVxdWVzdE9wdGlvbnMuZm9ybURhdGEpIHtcclxuICAgICAgcmVxdWVzdE9wdGlvbnMuZm9ybURhdGEuYWxidW0gPSBhbGJ1bUhhc2hcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKG9wdGlvbnMucHJveHkpIHtcclxuICAgIHJlcXVlc3RPcHRpb25zLnByb3h5ID0gb3B0aW9ucy5wcm94eVxyXG4gIH1cclxuICByZXR1cm4gcmVxdWVzdE9wdGlvbnNcclxufVxyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjb25zdCBpbWd1ck9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElJbWd1ckNvbmZpZz4oJ3BpY0JlZC5pbWd1cicpXHJcbiAgaWYgKCFpbWd1ck9wdGlvbnMpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIGltZ3VyIGNvbmZpZycpXHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBjb25zdCBiYXNlNjRJbWFnZSA9IGltZy5iYXNlNjRJbWFnZSB8fCBCdWZmZXIuZnJvbShpbWcuYnVmZmVyKS50b1N0cmluZygnYmFzZTY0JylcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgcG9zdE9wdGlvbnMoY3R4LCBpbWd1ck9wdGlvbnMsIGltZy5maWxlTmFtZSwgYmFzZTY0SW1hZ2UpXHJcbiAgICAgICAgY29uc3QgcmVzOiBzdHJpbmcgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSB0eXBlb2YgcmVzID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UocmVzKSA6IHJlc1xyXG4gICAgICAgIGlmIChib2R5LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpbWcuaW1nVXJsID0gYm9keS5kYXRhLmxpbmtcclxuICAgICAgICAgIGltZy5oYXNoID0gYm9keS5kYXRhLmRlbGV0ZWhhc2hcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUksnKSxcclxuICAgICAgdGV4dDogJ2h0dHA6Ly9kb2NzLmltZ3VyLmNvbS9hcGkvZXJybm8vJ1xyXG4gICAgfSlcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcclxuICAgIHRocm93IGVycj8ucmVzcG9uc2U/LmRhdGEgfHwgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElJbWd1ckNvbmZpZz4oJ3BpY0JlZC5pbWd1cicpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjbGllbnRJZCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX0NMSUVOVElEJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9DTElFTlRJRCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9NRVNTQUdFX0NMSUVOVElEJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5jbGllbnRJZCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAndXNlcm5hbWUnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9VU0VSTkFNRScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfVVNFUk5BTUUnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfTUVTU0FHRV9VU0VSTkFNRScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudXNlcm5hbWUgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FjY2Vzc1Rva2VuJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfQUNDRVNTX1RPS0VOJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9BQ0NFU1NfVE9LRU4nKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfTUVTU0FHRV9BQ0NFU1NfVE9LRU4nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFjY2Vzc1Rva2VuIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhbGJ1bScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX0FMQlVNJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9BTEJVTScpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9NRVNTQUdFX0FMQlVNJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hbGJ1bSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncHJveHknLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9QUk9YWScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfUFJPWFknKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucHJveHkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ2ltZ3VyJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJQWxpeXVuQ29uZmlnLCBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG4vLyBnZW5lcmF0ZSBPU1Mgc2lnbmF0dXJlXHJcbmNvbnN0IGdlbmVyYXRlU2lnbmF0dXJlID0gKG9wdGlvbnM6IElBbGl5dW5Db25maWcsIGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKClcclxuICBjb25zdCBtaW1lVHlwZSA9IG1pbWUubG9va3VwKGZpbGVOYW1lKVxyXG4gIGlmICghbWltZVR5cGUpIHRocm93IEVycm9yKGBObyBtaW1lIHR5cGUgZm91bmQgZm9yIGZpbGUgJHtmaWxlTmFtZX1gKVxyXG5cclxuICBjb25zdCBzaWduU3RyaW5nID0gYFBVVFxcblxcbiR7bWltZVR5cGV9XFxuJHtkYXRlfVxcbi8ke29wdGlvbnMuYnVja2V0fS8ke29wdGlvbnMucGF0aH0ke2ZpbGVOYW1lfWBcclxuXHJcbiAgY29uc3Qgc2lnbmF0dXJlID0gY3J5cHRvLmNyZWF0ZUhtYWMoJ3NoYTEnLCBvcHRpb25zLmFjY2Vzc0tleVNlY3JldCkudXBkYXRlKHNpZ25TdHJpbmcpLmRpZ2VzdCgnYmFzZTY0JylcclxuICByZXR1cm4gYE9TUyAke29wdGlvbnMuYWNjZXNzS2V5SWR9OiR7c2lnbmF0dXJlfWBcclxufVxyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAob3B0aW9uczogSUFsaXl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgc2lnbmF0dXJlOiBzdHJpbmcsIGltYWdlOiBCdWZmZXIpOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgdXJsOiBgaHR0cHM6Ly8ke29wdGlvbnMuYnVja2V0fS4ke29wdGlvbnMuYXJlYX0uYWxpeXVuY3MuY29tLyR7ZW5jb2RlVVJJKG9wdGlvbnMucGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJyksXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEhvc3Q6IGAke29wdGlvbnMuYnVja2V0fS4ke29wdGlvbnMuYXJlYX0uYWxpeXVuY3MuY29tYCxcclxuICAgICAgQXV0aG9yaXphdGlvbjogc2lnbmF0dXJlLFxyXG4gICAgICBEYXRlOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXHJcbiAgICAgICdDb250ZW50LVR5cGUnOiBtaW1lLmxvb2t1cChmaWxlTmFtZSlcclxuICAgIH0sXHJcbiAgICBib2R5OiBpbWFnZSxcclxuICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IGFsaVl1bk9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElBbGl5dW5Db25maWc+KCdwaWNCZWQuYWxpeXVuJylcclxuICBpZiAoIWFsaVl1bk9wdGlvbnMpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIGFsaVl1biBPU1MgY29uZmlnJylcclxuICB9XHJcbiAgYWxpWXVuT3B0aW9ucy5wYXRoID0gYWxpWXVuT3B0aW9ucy5wYXRoLnJlcGxhY2UoL1xcLyokLywgJycpLnJlcGxhY2UoL15cXC8qLywgJycpICsgJy8nXHJcbiAgaWYgKGFsaVl1bk9wdGlvbnMucGF0aCA9PT0gJy8nKSB7XHJcbiAgICBhbGlZdW5PcHRpb25zLnBhdGggPSAnJ1xyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGNvbnN0IGN1c3RvbVVybCA9IGFsaVl1bk9wdGlvbnMuY3VzdG9tVXJsXHJcbiAgICBjb25zdCBwYXRoID0gYWxpWXVuT3B0aW9ucy5wYXRoXHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGdlbmVyYXRlU2lnbmF0dXJlKGFsaVl1bk9wdGlvbnMsIGltZy5maWxlTmFtZSlcclxuICAgICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcclxuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCAnYmFzZTY0JylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHBvc3RPcHRpb25zKGFsaVl1bk9wdGlvbnMsIGltZy5maWxlTmFtZSwgc2lnbmF0dXJlLCBpbWFnZSlcclxuICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBjb25zdCBvcHRpb25VcmwgPSBhbGlZdW5PcHRpb25zLm9wdGlvbnMgfHwgJydcclxuICAgICAgICAgIGlmIChjdXN0b21VcmwpIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2N1c3RvbVVybH0vJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX0ke29wdGlvblVybH1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYGh0dHBzOi8vJHthbGlZdW5PcHRpb25zLmJ1Y2tldH0uJHthbGlZdW5PcHRpb25zLmFyZWF9LmFsaXl1bmNzLmNvbS8ke2VuY29kZVVSSUNvbXBvbmVudChwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfSR7b3B0aW9uVXJsfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGxvYWQgZmFpbGVkJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTJylcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUFsaXl1bkNvbmZpZz4oJ3BpY0JlZC5hbGl5dW4nKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYWNjZXNzS2V5SWQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXlJZCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NLZXlTZWNyZXQnLFxyXG4gICAgICB0eXBlOiAncGFzc3dvcmQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYWNjZXNzS2V5U2VjcmV0IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2J1Y2tldCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQlVDS0VUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5idWNrZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYXJlYScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0FSRUEnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0FSRUEnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFyZWEgfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUEnKSB9LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9QQVRIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY3VzdG9tVXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnb3B0aW9ucycsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcHRpb25zIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdhbGl5dW4nLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7XHJcbiAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVUQnKVxyXG4gICAgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJVXB5dW5Db25maWcsIElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0bydcclxuaW1wb3J0IE1ENSBmcm9tICdtZDUnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCB7IHNhZmVQYXJzZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuXHJcbi8vIGdlbmVyYXRlIENPUyBzaWduYXR1cmUgc3RyaW5nXHJcbmNvbnN0IGdlbmVyYXRlU2lnbmF0dXJlID0gKG9wdGlvbnM6IElVcHl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCAnJ1xyXG4gIGNvbnN0IG9wZXJhdG9yID0gb3B0aW9ucy5vcGVyYXRvclxyXG4gIGNvbnN0IHBhc3N3b3JkID0gb3B0aW9ucy5wYXNzd29yZFxyXG4gIGNvbnN0IG1kNVBhc3N3b3JkID0gTUQ1KHBhc3N3b3JkKVxyXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKClcclxuICBjb25zdCB1cmkgPSBgLyR7b3B0aW9ucy5idWNrZXR9LyR7ZW5jb2RlVVJJKHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgY29uc3QgdmFsdWUgPSBgUFVUJiR7dXJpfSYke2RhdGV9YFxyXG4gIGNvbnN0IHNpZ24gPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIG1kNVBhc3N3b3JkKS51cGRhdGUodmFsdWUpLmRpZ2VzdCgnYmFzZTY0JylcclxuICByZXR1cm4gYFVQWVVOICR7b3BlcmF0b3J9OiR7c2lnbn1gXHJcbn1cclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElVcHl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgc2lnbmF0dXJlOiBzdHJpbmcsIGltYWdlOiBCdWZmZXIpOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xyXG4gIGNvbnN0IGJ1Y2tldCA9IG9wdGlvbnMuYnVja2V0XHJcbiAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCAnJ1xyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgdXJsOiBgaHR0cHM6Ly92MC5hcGkudXB5dW4uY29tLyR7YnVja2V0fS8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSl9YC5yZXBsYWNlKC8lMkYvZywgJy8nKSxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQXV0aG9yaXphdGlvbjogc2lnbmF0dXJlLFxyXG4gICAgICBEYXRlOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXHJcbiAgICAgICdDb250ZW50LVR5cGUnOiBtaW1lLmxvb2t1cChmaWxlTmFtZSkgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcclxuICAgIH0sXHJcbiAgICBib2R5OiBpbWFnZSxcclxuICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHVweXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVVweXVuQ29uZmlnPigncGljQmVkLnVweXVuJylcclxuICBpZiAoIXVweXVuT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgdXBZdW4gY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBjb25zdCBwYXRoID0gdXB5dW5PcHRpb25zLnBhdGggfHwgJydcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGdlbmVyYXRlU2lnbmF0dXJlKHVweXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyh1cHl1bk9wdGlvbnMsIGltZy5maWxlTmFtZSwgc2lnbmF0dXJlLCBpbWFnZSlcclxuICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICBpZiAoYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7dXB5dW5PcHRpb25zLnVybH0vJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX0ke3VweXVuT3B0aW9ucy5vcHRpb25zfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGxvYWQgZmFpbGVkJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgaWYgKGVyci5tZXNzYWdlID09PSAnVXBsb2FkIGZhaWxlZCcpIHtcclxuICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTJylcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGJvZHkgPSBzYWZlUGFyc2U8eyBjb2RlOiBzdHJpbmcgfT4oZXJyLmVycm9yKVxyXG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICBjb2RlOiB0eXBlb2YgYm9keSA9PT0gJ29iamVjdCcgPyBib2R5LmNvZGUgOiBib2R5XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGV4dDogJ2h0dHA6Ly9kb2NzLnVweXVuLmNvbS9hcGkvZXJybm8vJ1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElVcHl1bkNvbmZpZz4oJ3BpY0JlZC51cHl1bicpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdidWNrZXQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX0JVQ0tFVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYnVja2V0IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ29wZXJhdG9yJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9PUEVSQVRPUicpIH0sXHJcbiAgICAgIGdldCBwcmVmaXggKCkge1xyXG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fT1BFUkFUT1InKVxyXG4gICAgICB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9PUEVSQVRPUicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcub3BlcmF0b3IgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGFzc3dvcmQnLFxyXG4gICAgICB0eXBlOiAncGFzc3dvcmQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9QQVNTV09SRCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXNzd29yZCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd1cmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX1VSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ29wdGlvbnMnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9PUFRJT05TJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9PUFRJT05TJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfT1BUSU9OUycpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcub3B0aW9ucyB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCd1cHl1bicsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTicpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSVdlYmRhdlBsaXN0Q29uZmlnLCBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gYXN5bmMgKGN0eDogSVBpY0dvLCBvcHRpb25zOiBJV2ViZGF2UGxpc3RDb25maWcsIGZpbGVOYW1lOiBzdHJpbmcsIGltYWdlOiBCdWZmZXIpOiBQcm9taXNlPElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZT4gPT4ge1xyXG4gIGNvbnN0IHBhdGhzID0gWy4uLm9wdGlvbnMucGF0aC5yZXBsYWNlKC9cXC8rJC9nLCAnJykuc3BsaXQoJy8nKSwgLi4ucGF0aC5kaXJuYW1lKGZpbGVOYW1lKS5zcGxpdCgnLycpXVxyXG4gIGxldCBjdXJyZW50UGF0aCA9ICcnXHJcbiAgZm9yIChjb25zdCBwIG9mIHBhdGhzKSB7XHJcbiAgICBpZiAocCkge1xyXG4gICAgICBjdXJyZW50UGF0aCArPSBgLyR7cH1gXHJcbiAgICAgIGNvbnN0IGRpcm9wdGlvbnMgPSB7XHJcbiAgICAgICAgbWV0aG9kOiAnTUtDT0wnLFxyXG4gICAgICAgIHVybDogYCR7b3B0aW9ucy5ob3N0fSR7ZW5jb2RlVVJJKGN1cnJlbnRQYXRoKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpLFxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke29wdGlvbnMudXNlcm5hbWV9OiR7b3B0aW9ucy5wYXNzd29yZH1gKS50b1N0cmluZygnYmFzZTY0Jyl9YFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IGN0eC5yZXF1ZXN0KGRpcm9wdGlvbnMpXHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4ge1xyXG4gICAgbWV0aG9kOiAnUFVUJyxcclxuICAgIHVybDogYCR7b3B0aW9ucy5ob3N0fS8ke29wdGlvbnMucGF0aCA9PT0gJy8nID8gJycgOiBlbmNvZGVVUkkob3B0aW9ucy5wYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSl9YC5yZXBsYWNlKC8lMkYvZywgJy8nKSxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7b3B0aW9ucy51c2VybmFtZX06JHtvcHRpb25zLnBhc3N3b3JkfWApLnRvU3RyaW5nKCdiYXNlNjQnKX1gLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogbWltZS5sb29rdXAoZmlsZU5hbWUpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxyXG4gICAgICAnQ29udGVudC1MZW5ndGgnOiBpbWFnZS5sZW5ndGhcclxuICAgIH0sXHJcbiAgICBib2R5OiBpbWFnZSxcclxuICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbyB8IGJvb2xlYW4+ID0+IHtcclxuICBjb25zdCB3ZWJkYXZwbGlzdE9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElXZWJkYXZQbGlzdENvbmZpZz4oJ3BpY0JlZC53ZWJkYXZwbGlzdCcpXHJcbiAgaWYgKCF3ZWJkYXZwbGlzdE9wdGlvbnMpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIHdlYmRhdnBsaXN0IGNvbmZpZycpXHJcbiAgfVxyXG4gIHdlYmRhdnBsaXN0T3B0aW9ucy5ob3N0ID0gd2ViZGF2cGxpc3RPcHRpb25zLmhvc3QucmVwbGFjZSgvXmh0dHBzPzpcXC9cXC98XFwvKyQvZywgJycpXHJcbiAgd2ViZGF2cGxpc3RPcHRpb25zLmhvc3QgPSAod2ViZGF2cGxpc3RPcHRpb25zLnNzbEVuYWJsZWQgPyAnaHR0cHM6Ly8nIDogJ2h0dHA6Ly8nKSArIHdlYmRhdnBsaXN0T3B0aW9ucy5ob3N0XHJcbiAgd2ViZGF2cGxpc3RPcHRpb25zLnBhdGggPSAod2ViZGF2cGxpc3RPcHRpb25zLnBhdGggfHwgJycpLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKSArICcvJ1xyXG4gIGNvbnN0IHdlYnBhdGggPSAod2ViZGF2cGxpc3RPcHRpb25zLndlYnBhdGggfHwgJycpLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKSArICcvJ1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgY29uc3QgY3VzdG9tVXJsID0gd2ViZGF2cGxpc3RPcHRpb25zLmN1c3RvbVVybFxyXG4gICAgY29uc3QgcGF0aCA9IHdlYmRhdnBsaXN0T3B0aW9ucy5wYXRoXHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgcG9zdE9wdGlvbnMoY3R4LCB3ZWJkYXZwbGlzdE9wdGlvbnMsIGltZy5maWxlTmFtZSwgaW1hZ2UpXHJcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXHJcbiAgICAgICAgaWYgKGJvZHkuc3RhdHVzQ29kZSA+PSAyMDAgJiYgYm9keS5zdGF0dXNDb2RlIDwgMzAwKSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgY29uc3QgYmFzZVVybCA9IGN1c3RvbVVybCB8fCB3ZWJkYXZwbGlzdE9wdGlvbnMuaG9zdFxyXG4gICAgICAgICAgaWYgKHdlYmRhdnBsaXN0T3B0aW9ucy53ZWJwYXRoKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtiYXNlVXJsfS8ke3dlYnBhdGggPT09ICcvJyA/ICcnIDogZW5jb2RlVVJJQ29tcG9uZW50KHdlYnBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2Jhc2VVcmx9LyR7cGF0aCA9PT0gJy8nID8gJycgOiBlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXBsb2FkIGZhaWxlZCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTJylcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVdlYmRhdlBsaXN0Q29uZmlnPigncGljQmVkLndlYmRhdnBsaXN0JykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2hvc3QnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX0hPU1QnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmhvc3QgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc3NsRW5hYmxlZCcsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc3NsRW5hYmxlZCB8fCB0cnVlLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfU1NMRU5BQkxFRCcpIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd1c2VybmFtZScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfVVNFUk5BTUUnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnVzZXJuYW1lIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfVVNFUk5BTUUnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9VU0VSTkFNRScpIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXNzd29yZCcsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfUEFTU1dPUkQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhc3N3b3JkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfUEFTU1dPUkQnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVNTV09SRCcpIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVRIJykgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3dlYnBhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX1dFQlNJVEVfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9XRUJTSVRFX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEgnKSB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY3VzdG9tVXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9DVVNUT01VUkwnKSB9XHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3Rlcignd2ViZGF2cGxpc3QnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1QnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQaWNHb1BsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgU01NU1VwbG9hZGVyIGZyb20gJy4vc21tcydcclxuaW1wb3J0IHRjWXVuVXBsb2FkZXIgZnJvbSAnLi90Y3l1bidcclxuaW1wb3J0IGdpdGh1YlVwbG9hZGVyIGZyb20gJy4vZ2l0aHViJ1xyXG5pbXBvcnQgcWluaXVVcGxvYWRlciBmcm9tICcuL3Fpbml1J1xyXG5pbXBvcnQgaW1ndXJVcGxvYWRlciBmcm9tICcuL2ltZ3VyJ1xyXG5pbXBvcnQgYWxpWXVuVXBsb2FkZXIgZnJvbSAnLi9hbGl5dW4nXHJcbmltcG9ydCB1cFl1blVwbG9hZGVyIGZyb20gJy4vdXB5dW4nXHJcbmltcG9ydCB3ZWJkYXZwbGlzdFVwbG9hZGVyIGZyb20gJy4vd2ViZGF2J1xyXG5cclxuY29uc3QgYnVpbGRJblVwbG9hZGVyczogSVBpY0dvUGx1Z2luID0gKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICByZWdpc3RlciAoY3R4OiBJUGljR28pIHtcclxuICAgICAgYWxpWXVuVXBsb2FkZXIoY3R4KVxyXG4gICAgICB0Y1l1blVwbG9hZGVyKGN0eClcclxuICAgICAgU01NU1VwbG9hZGVyKGN0eClcclxuICAgICAgZ2l0aHViVXBsb2FkZXIoY3R4KVxyXG4gICAgICBxaW5pdVVwbG9hZGVyKGN0eClcclxuICAgICAgaW1ndXJVcGxvYWRlcihjdHgpXHJcbiAgICAgIHVwWXVuVXBsb2FkZXIoY3R4KVxyXG4gICAgICB3ZWJkYXZwbGlzdFVwbG9hZGVyKGN0eClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGJ1aWxkSW5VcGxvYWRlcnNcclxuIiwiaW1wb3J0IHtcclxuICBpc1VybCxcclxuICBnZXRJbWFnZVNpemUsXHJcbiAgZ2V0RlNGaWxlLFxyXG4gIGdldFVSTEZpbGVcclxufSBmcm9tICcuLi8uLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IElQaWNHbywgSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8sIElJbWdJbmZvLCBJSW1nU2l6ZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjb25zdCByZXN1bHRzOiBJSW1nSW5mb1tdID0gY3R4Lm91dHB1dFxyXG4gIGF3YWl0IFByb21pc2UuYWxsKGN0eC5pbnB1dC5tYXAoYXN5bmMgKGl0ZW06IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgbGV0IGluZm86IElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvXHJcbiAgICBpZiAoaXNVcmwoaXRlbSkpIHtcclxuICAgICAgaW5mbyA9IGF3YWl0IGdldFVSTEZpbGUoaXRlbSwgY3R4KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW5mbyA9IGF3YWl0IGdldEZTRmlsZShpdGVtKVxyXG4gICAgfVxyXG4gICAgaWYgKGluZm8uc3VjY2VzcyAmJiBpbmZvLmJ1ZmZlcikge1xyXG4gICAgICBjb25zdCBpbWdTaXplID0gZ2V0SW1nU2l6ZShjdHgsIGluZm8uYnVmZmVyLCBpdGVtKVxyXG4gICAgICByZXN1bHRzW2luZGV4XSA9IHtcclxuICAgICAgICBidWZmZXI6IGluZm8uYnVmZmVyLFxyXG4gICAgICAgIGZpbGVOYW1lOiBpbmZvLmZpbGVOYW1lLFxyXG4gICAgICAgIHdpZHRoOiBpbWdTaXplLndpZHRoLFxyXG4gICAgICAgIGhlaWdodDogaW1nU2l6ZS5oZWlnaHQsXHJcbiAgICAgICAgZXh0bmFtZTogaW5mby5leHRuYW1lXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihpbmZvLnJlYXNvbilcclxuICAgIH1cclxuICB9KSlcclxuICAvLyByZW1vdmUgZW1wdHkgaXRlbVxyXG4gIGN0eC5vdXRwdXQgPSByZXN1bHRzLmZpbHRlcihpdGVtID0+IGl0ZW0pXHJcbiAgcmV0dXJuIGN0eFxyXG59XHJcblxyXG5jb25zdCBnZXRJbWdTaXplID0gKGN0eDogSVBpY0dvLCBmaWxlOiBCdWZmZXIsIHBhdGg6IHN0cmluZyk6IElJbWdTaXplID0+IHtcclxuICBjb25zdCBpbWFnZVNpemUgPSBnZXRJbWFnZVNpemUoZmlsZSlcclxuICBpZiAoIWltYWdlU2l6ZS5yZWFsKSB7XHJcbiAgICBjdHgubG9nLndhcm4oYGNhbid0IGdldCAke3BhdGh9J3MgaW1hZ2Ugc2l6ZWApXHJcbiAgICBjdHgubG9nLndhcm4oJ2ZhbGxiYWNrIHRvIDIwMCAqIDIwMCcpXHJcbiAgfVxyXG4gIHJldHVybiBpbWFnZVNpemVcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIGhhbmRsZVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGN0eC5vdXRwdXQucHVzaCguLi5jdHguaW5wdXQpXHJcbiAgcmV0dXJuIGN0eFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgaGFuZGxlXHJcbn1cclxuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgcmVzb2x2ZSBmcm9tICdyZXNvbHZlJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSVBpY0dvLCBJUGljR29QbHVnaW4sIElQbHVnaW5Mb2FkZXIsIElQaWNHb1BsdWdpbkludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzL2luZGV4J1xyXG5pbXBvcnQgeyBzZXRDdXJyZW50UGx1Z2luTmFtZSB9IGZyb20gJy4vTGlmZWN5Y2xlUGx1Z2lucydcclxuXHJcbi8qKlxyXG4gKiBMb2NhbCBwbHVnaW4gbG9hZGVyLCBmaWxlIHN5c3RlbSBpcyByZXF1aXJlZFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBsdWdpbkxvYWRlciBpbXBsZW1lbnRzIElQbHVnaW5Mb2FkZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBwcml2YXRlIGxpc3Q6IHN0cmluZ1tdID0gW11cclxuICBwcml2YXRlIHJlYWRvbmx5IGZ1bGxMaXN0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTWFwOiBNYXA8c3RyaW5nLCBJUGljR29QbHVnaW5JbnRlcmZhY2U+ID0gbmV3IE1hcCgpXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gICAgdGhpcy5pbml0KClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdCAoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAncGFja2FnZS5qc29uJylcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlUGF0aCkpIHtcclxuICAgICAgY29uc3QgcGtnID0ge1xyXG4gICAgICAgIG5hbWU6ICdwaWNnby1wbHVnaW5zJyxcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ3BpY2dvLXBsdWdpbnMnLFxyXG4gICAgICAgIHJlcG9zaXRvcnk6ICdodHRwczovL2dpdGh1Yi5jb20vUGljR28vUGljR28tQ29yZScsXHJcbiAgICAgICAgbGljZW5zZTogJ01JVCdcclxuICAgICAgfVxyXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VQYXRoLCBKU09OLnN0cmluZ2lmeShwa2cpLCAndXRmOCcpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgcGx1Z2luIGVudHJ5XHJcbiAgcHJpdmF0ZSByZXNvbHZlUGx1Z2luIChjdHg6IElQaWNHbywgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiByZXNvbHZlLnN5bmMobmFtZSwgeyBiYXNlZGlyOiBjdHguYmFzZURpciB9KVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHJldHVybiBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICdub2RlX21vZHVsZXMnLCBuYW1lKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gbG9hZCBhbGwgdGhpcmQgcGFydHkgcGx1Z2luXHJcbiAgbG9hZCAoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAncGFja2FnZS5qc29uJylcclxuICAgIGNvbnN0IHBsdWdpbkRpciA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAnbm9kZV9tb2R1bGVzLycpXHJcbiAgICAvLyBUaGFua3MgdG8gaGV4byAtPiBodHRwczovL2dpdGh1Yi5jb20vaGV4b2pzL2hleG8vYmxvYi9tYXN0ZXIvbGliL2hleG8vbG9hZF9wbHVnaW5zLmpzXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGx1Z2luRGlyKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIGNvbnN0IGpzb24gPSBmcy5yZWFkSlNPTlN5bmMocGFja2FnZVBhdGgpXHJcbiAgICBjb25zdCBkZXBzID0gT2JqZWN0LmtleXMoanNvbi5kZXBlbmRlbmNpZXMgfHwge30pXHJcbiAgICBjb25zdCBkZXZEZXBzID0gT2JqZWN0LmtleXMoanNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge30pXHJcbiAgICBjb25zdCBtb2R1bGVzID0gZGVwcy5jb25jYXQoZGV2RGVwcykuZmlsdGVyKChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKCEvXnBpY2dvLXBsdWdpbi18XkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLnRlc3QobmFtZSkpIHJldHVybiBmYWxzZVxyXG4gICAgICBjb25zdCBwYXRoID0gdGhpcy5yZXNvbHZlUGx1Z2luKHRoaXMuY3R4LCBuYW1lKVxyXG4gICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoKVxyXG4gICAgfSlcclxuICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcclxuICAgICAgdGhpcy5yZWdpc3RlclBsdWdpbihtb2R1bGUpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJQbHVnaW4gKG5hbWU6IHN0cmluZywgcGx1Z2luPzogSVBpY0dvUGx1Z2luKTogdm9pZCB7XHJcbiAgICBpZiAoIW5hbWUgfHwgdHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMuY3R4LmxvZy53YXJuKCdQbGVhc2UgcHJvdmlkZSB2YWxpZCBwbHVnaW4nKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuZnVsbExpc3QuYWRkKG5hbWUpXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyByZWdpc3RlciBsb2NhbCBwbHVnaW5cclxuICAgICAgaWYgKCFwbHVnaW4pIHtcclxuICAgICAgICBpZiAodGhpcy5jdHguZ2V0Q29uZmlnKGBwaWNnb1BsdWdpbnMuJHtuYW1lfWApID09PSB0cnVlIHx8ICh0aGlzLmN0eC5nZXRDb25maWcoYHBpY2dvUGx1Z2lucy4ke25hbWV9YCkgPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgIHRoaXMubGlzdC5wdXNoKG5hbWUpXHJcbiAgICAgICAgICBzZXRDdXJyZW50UGx1Z2luTmFtZShuYW1lKVxyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICAgIHRoaXMuZ2V0UGx1Z2luKG5hbWUpIS5yZWdpc3Rlcih0aGlzLmN0eClcclxuICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IGBwaWNnb1BsdWdpbnNbJHtuYW1lfV1gXHJcbiAgICAgICAgICB0aGlzLmN0eC5zYXZlQ29uZmlnKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgW3BsdWdpbl06IHRydWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyByZWdpc3RlciBwcm92aWRlZCBwbHVnaW5cclxuICAgICAgICAvLyAmJiB3b24ndCB3cml0ZSBjb25maWcgdG8gZmlsZXNcclxuICAgICAgICB0aGlzLmxpc3QucHVzaChuYW1lKVxyXG4gICAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKG5hbWUpXHJcbiAgICAgICAgY29uc3QgcGx1Z2luSW50ZXJmYWNlID0gcGx1Z2luKHRoaXMuY3R4KVxyXG4gICAgICAgIHRoaXMucGx1Z2luTWFwLnNldChuYW1lLCBwbHVnaW5JbnRlcmZhY2UpXHJcbiAgICAgICAgcGx1Z2luSW50ZXJmYWNlLnJlZ2lzdGVyKHRoaXMuY3R4KVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMucGx1Z2luTWFwLmRlbGV0ZShuYW1lKVxyXG4gICAgICB0aGlzLmxpc3QgPSB0aGlzLmxpc3QuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09IG5hbWUpXHJcbiAgICAgIHRoaXMuZnVsbExpc3QuZGVsZXRlKG5hbWUpXHJcbiAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlIGFzIEVycm9yKVxyXG4gICAgICB0aGlzLmN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgdGl0bGU6IGBQbHVnaW4gJHtuYW1lfSBMb2FkIEVycm9yYCxcclxuICAgICAgICBib2R5OiBlXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1bnJlZ2lzdGVyUGx1Z2luIChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubGlzdCA9IHRoaXMubGlzdC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gbmFtZSlcclxuICAgIHRoaXMuZnVsbExpc3QuZGVsZXRlKG5hbWUpXHJcbiAgICB0aGlzLnBsdWdpbk1hcC5kZWxldGUobmFtZSlcclxuICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5oZWxwZXIudXBsb2FkZXIudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLnRyYW5zZm9ybWVyLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci5iZWZvcmVUcmFuc2Zvcm1QbHVnaW5zLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci5iZWZvcmVVcGxvYWRQbHVnaW5zLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci5hZnRlclVwbG9hZFBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguY21kLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LnJlbW92ZUNvbmZpZygncGljZ29QbHVnaW5zJywgbmFtZSlcclxuICB9XHJcblxyXG4gIC8vIGdldCBwbHVnaW4gYnkgbmFtZVxyXG4gIGdldFBsdWdpbiAobmFtZTogc3RyaW5nKTogSVBpY0dvUGx1Z2luSW50ZXJmYWNlIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICh0aGlzLnBsdWdpbk1hcC5oYXMobmFtZSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGx1Z2luTWFwLmdldChuYW1lKVxyXG4gICAgfVxyXG4gICAgY29uc3QgcGx1Z2luRGlyID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdub2RlX21vZHVsZXMvJylcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXHJcbiAgICBjb25zdCBwbHVnaW4gPSByZXF1aXJlKHBsdWdpbkRpciArIG5hbWUpKHRoaXMuY3R4KVxyXG4gICAgdGhpcy5wbHVnaW5NYXAuc2V0KG5hbWUsIHBsdWdpbilcclxuICAgIHJldHVybiBwbHVnaW5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgbGlzdCBvZiBlbmFibGVkIHBsdWdpbnNcclxuICAgKi9cclxuICBnZXRMaXN0ICgpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5saXN0XHJcbiAgfVxyXG5cclxuICBoYXNQbHVnaW4gKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZnVsbExpc3QuaGFzKG5hbWUpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGZ1bGwgbGlzdCBvZiBwbHVnaW5zLCB3aGV0aGVyIGl0IGlzIGVuYWJsZWQgb3Igbm90XHJcbiAgICovXHJcbiAgZ2V0RnVsbExpc3QgKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5mdWxsTGlzdF1cclxuICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgUGx1Z2luTG9hZGVyXHJcbiIsImV4cG9ydCBjb25zdCBDTElQQk9BUkRfSU1BR0VfRk9MREVSID0gJ3BpY2xpc3QtY2xpcGJvYXJkLWltYWdlcydcclxuIiwiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJ1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcbmltcG9ydCBvcyBmcm9tICdvcydcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgaXNXc2wgZnJvbSAnaXMtd3NsJ1xyXG5pbXBvcnQgeyBJUGljR28sIElDbGlwYm9hcmRJbWFnZSB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi9lbnVtJ1xyXG5pbXBvcnQgbWFjQ2xpcGJvYXJkU2NyaXB0IGZyb20gJy4vY2xpcGJvYXJkL21hYy5hcHBsZXNjcmlwdCdcclxuaW1wb3J0IHdpbmRvd3NDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvd2luZG93cy5wczEnXHJcbmltcG9ydCB3aW5kb3dzMTBDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvd2luZG93czEwLnBzMSdcclxuaW1wb3J0IGxpbnV4Q2xpcGJvYXJkU2NyaXB0IGZyb20gJy4vY2xpcGJvYXJkL2xpbnV4LnNoJ1xyXG5pbXBvcnQgd3NsQ2xpcGJvYXJkU2NyaXB0IGZyb20gJy4vY2xpcGJvYXJkL3dzbC5zaCdcclxuaW1wb3J0IHsgQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUiB9IGZyb20gJy4vc3RhdGljJ1xyXG5cclxuZXhwb3J0IHR5cGUgUGxhdGZvcm0gPSAnZGFyd2luJyB8ICd3aW4zMicgfCAnd2luMTAnIHwgJ2xpbnV4JyB8ICd3c2wnXHJcblxyXG5jb25zdCBnZXRDdXJyZW50UGxhdGZvcm0gPSAoKTogUGxhdGZvcm0gPT4ge1xyXG4gIGNvbnN0IHBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybVxyXG4gIGlmIChpc1dzbCkge1xyXG4gICAgcmV0dXJuICd3c2wnXHJcbiAgfVxyXG4gIGlmIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xyXG4gICAgY29uc3QgY3VycmVudE9TID0gb3MucmVsZWFzZSgpLnNwbGl0KCcuJylbMF1cclxuICAgIGlmIChjdXJyZW50T1MgPT09ICcxMCcpIHtcclxuICAgICAgcmV0dXJuICd3aW4xMCdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnd2luMzInXHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcclxuICAgIHJldHVybiAnZGFyd2luJ1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gJ2xpbnV4J1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgcGxhdGZvcm0yU2NyaXB0Q29udGVudDoge1xyXG4gIFtrZXkgaW4gUGxhdGZvcm1dOiBzdHJpbmdcclxufSA9IHtcclxuICBkYXJ3aW46IG1hY0NsaXBib2FyZFNjcmlwdCxcclxuICB3aW4zMjogd2luZG93c0NsaXBib2FyZFNjcmlwdCxcclxuICB3aW4xMDogd2luZG93czEwQ2xpcGJvYXJkU2NyaXB0LFxyXG4gIGxpbnV4OiBsaW51eENsaXBib2FyZFNjcmlwdCxcclxuICB3c2w6IHdzbENsaXBib2FyZFNjcmlwdFxyXG59XHJcbi8qKlxyXG4gKiBwb3dlcnNoZWxsIHdpbGwgcmVwb3J0IGVycm9yIGlmIGZpbGUgZG9lcyBub3QgaGF2ZSBhICcucHMxJyBleHRlbnNpb24sXHJcbiAqIHNvIHdlIHNob3VsZCBrZWVwIHRoZSBleHRlbnNpb24gbmFtZSBjb25zaXN0ZW50IHdpdGggY29ycmVzcG9uZGluZyBzaGVsbFxyXG4gKi9cclxuY29uc3QgcGxhdGZvcm0yU2NyaXB0RmlsZW5hbWU6IHtcclxuICBba2V5IGluIFBsYXRmb3JtXTogc3RyaW5nXHJcbn0gPSB7XHJcbiAgZGFyd2luOiAnbWFjLmFwcGxlc2NyaXB0JyxcclxuICB3aW4zMjogJ3dpbmRvd3MucHMxJyxcclxuICB3aW4xMDogJ3dpbmRvd3MxMC5wczEnLFxyXG4gIGxpbnV4OiAnbGludXguc2gnLFxyXG4gIHdzbDogJ3dzbC5zaCdcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlSW1hZ2VGb2xkZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY29uc3QgaW1hZ2VQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCBDTElQQk9BUkRfSU1BR0VfRk9MREVSKVxyXG4gIGlmICghZnMuZXhpc3RzU3luYyhpbWFnZVBhdGgpKSB7XHJcbiAgICBmcy5ta2RpclN5bmMoaW1hZ2VQYXRoKVxyXG4gIH1cclxufVxyXG5cclxuLy8gVGhhbmtzIHRvIHZzLXBpY2dvOiBodHRwczovL2dpdGh1Yi5jb20vU3BhZGVzLVMvdnMtcGljZ28vYmxvYi9tYXN0ZXIvc3JjL2V4dGVuc2lvbi50c1xyXG5jb25zdCBnZXRDbGlwYm9hcmRJbWFnZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SUNsaXBib2FyZEltYWdlPiA9PiB7XHJcbiAgY3JlYXRlSW1hZ2VGb2xkZXIoY3R4KVxyXG4gIC8vIGFkZCBhbiBjbGlwYm9hcmQgaW1hZ2UgZm9sZGVyIHRvIGNvbnRyb2wgdGhlIGltYWdlIGNhY2hlIGZpbGVcclxuICBjb25zdCBpbWFnZVBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsIENMSVBCT0FSRF9JTUFHRV9GT0xERVIsIGAke2RheWpzKCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpfS5wbmdgKVxyXG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxJQ2xpcGJvYXJkSW1hZ2U+KChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbik6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgcGxhdGZvcm0gPSBnZXRDdXJyZW50UGxhdGZvcm0oKVxyXG4gICAgY29uc3Qgc2NyaXB0UGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgcGxhdGZvcm0yU2NyaXB0RmlsZW5hbWVbcGxhdGZvcm1dKVxyXG4gICAgLy8gSWYgdGhlIHNjcmlwdCBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGNvbnRlbnQgdG8gdGhlIHNjcmlwdCBmaWxlXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHtcclxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcclxuICAgICAgICBzY3JpcHRQYXRoLFxyXG4gICAgICAgIHBsYXRmb3JtMlNjcmlwdENvbnRlbnRbcGxhdGZvcm1dLFxyXG4gICAgICAgICd1dGY4J1xyXG4gICAgICApXHJcbiAgICB9XHJcbiAgICBsZXQgZXhlY3V0aW9uXHJcbiAgICBpZiAocGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XHJcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKCdvc2FzY3JpcHQnLCBbc2NyaXB0UGF0aCwgaW1hZ2VQYXRoXSlcclxuICAgIH0gZWxzZSBpZiAocGxhdGZvcm0gPT09ICd3aW4zMicgfHwgcGxhdGZvcm0gPT09ICd3aW4xMCcpIHtcclxuICAgICAgZXhlY3V0aW9uID0gc3Bhd24oJ3Bvd2Vyc2hlbGwnLCBbXHJcbiAgICAgICAgJy1ub3Byb2ZpbGUnLFxyXG4gICAgICAgICctbm9uaW50ZXJhY3RpdmUnLFxyXG4gICAgICAgICctbm9sb2dvJyxcclxuICAgICAgICAnLXN0YScsXHJcbiAgICAgICAgJy1leGVjdXRpb25wb2xpY3knLCAndW5yZXN0cmljdGVkJyxcclxuICAgICAgICAvLyBmaXggd2luZG93cyAxMCBuYXRpdmUgY21kIGNyYXNoIGJ1ZyB3aGVuIFwicGljZ28gdXBsb2FkXCJcclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vUGljR28vUGljR28tQ29yZS9pc3N1ZXMvMzJcclxuICAgICAgICAvLyAnLXdpbmRvd3N0eWxlJywnaGlkZGVuJyxcclxuICAgICAgICAvLyAnLW5vZXhpdCcsXHJcbiAgICAgICAgJy1maWxlJywgc2NyaXB0UGF0aCxcclxuICAgICAgICBpbWFnZVBhdGhcclxuICAgICAgXSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKCdzaCcsIFtzY3JpcHRQYXRoLCBpbWFnZVBhdGhdKVxyXG4gICAgfVxyXG5cclxuICAgIGV4ZWN1dGlvbi5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XHJcbiAgICAgIGlmIChwbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xyXG4gICAgICAgIGlmIChkYXRhLnRvU3RyaW5nKCkudHJpbSgpID09PSAnbm8geGNsaXAgb3Igd2wtY2xpcGJvYXJkJykge1xyXG4gICAgICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICAgICAgdGl0bGU6ICd4Y2xpcCBvciB3bC1jbGlwYm9hcmQgbm90IGZvdW5kJyxcclxuICAgICAgICAgICAgYm9keTogJ1BsZWFzZSBpbnN0YWxsIHhjbGlwKGZvciB4MTEpIG9yIHdsLWNsaXBib2FyZChmb3Igd2F5bGFuZCkgYmVmb3JlIHJ1biBwaWNnbydcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignUGxlYXNlIGluc3RhbGwgeGNsaXAoZm9yIHgxMSkgb3Igd2wtY2xpcGJvYXJkKGZvciB3YXlsYW5kKSBiZWZvcmUgcnVuIHBpY2dvJykpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGltZ1BhdGggPSBkYXRhLnRvU3RyaW5nKCkudHJpbSgpXHJcblxyXG4gICAgICAvLyBpZiB0aGUgZmlsZVBhdGggaXMgdGhlIHJlYWwgZmlsZSBpbiBzeXN0ZW1cclxuICAgICAgLy8gd2Ugc2hvdWxkIGtlZXAgaXQgaW5zdGVhZCBvZiByZW1vdmluZ1xyXG4gICAgICBsZXQgc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nID0gZmFsc2VcclxuXHJcbiAgICAgIC8vIGluIG1hY09TIGlmIHlvdXIgY29weSB0aGUgZmlsZSBpbiBzeXN0ZW0sIGl0J3MgYmFzZW5hbWUgd2lsbCBub3QgZXF1YWwgdG8gb3VyIGRlZmF1bHQgYmFzZW5hbWVcclxuICAgICAgaWYgKHBhdGguYmFzZW5hbWUoaW1nUGF0aCkgIT09IHBhdGguYmFzZW5hbWUoaW1hZ2VQYXRoKSkge1xyXG4gICAgICAgIC8vIGlmIHRoZSBwYXRoIGlzIG5vdCBnZW5lcmF0ZSBieSBwaWNnb1xyXG4gICAgICAgIC8vIGJ1dCB0aGUgcGF0aCBleGlzdHMsIHdlIHNob3VsZCBrZWVwIGl0XHJcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoaW1nUGF0aCkpIHtcclxuICAgICAgICAgIHNob3VsZEtlZXBBZnRlclVwbG9hZGluZyA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gaWYgdGhlIGltZ1BhdGggaXMgaW52YWxpZFxyXG4gICAgICBpZiAoaW1nUGF0aCAhPT0gJ25vIGltYWdlJyAmJiAhZnMuZXhpc3RzU3luYyhpbWdQYXRoKSkge1xyXG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBDYW4ndCBmaW5kICR7aW1nUGF0aH1gKSlcclxuICAgICAgfVxyXG5cclxuICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgaW1nUGF0aCxcclxuICAgICAgICBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmdcclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfSlcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ2V0Q2xpcGJvYXJkSW1hZ2VcclxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xyXG5cclxuY29uc3QgZXZlbnRCdXMgPSBuZXcgRXZlbnRFbWl0dGVyKClcclxuZXhwb3J0IHtcclxuICBldmVudEJ1c1xyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJvbWlzZS1mdW5jdGlvbi1hc3luYyAqL1xyXG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnLCBBeGlvc1Jlc3BvbnNlIH0gZnJvbSAnYXhpb3MnXHJcbmltcG9ydCB7IElQaWNHbywgVW5kZWZpbmFibGUsIElDb25maWdDaGFuZ2VQYXlsb2FkLCBJQ29uZmlnLCBJUmVxdWVzdENvbmZpZywgSU9sZFJlcU9wdGlvbnMsIElSZXNwb25zZSwgSUZ1bGxSZXNwb25zZSwgSVJlcXVlc3QgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1c0V2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgZXZlbnRCdXMgfSBmcm9tICcuLi91dGlscy9ldmVudEJ1cydcclxuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJ1xyXG5pbXBvcnQgRm9ybURhdGEgZnJvbSAnZm9ybS1kYXRhJ1xyXG5pbXBvcnQgaHR0cHMgZnJvbSAnaHR0cHMnXHJcbmltcG9ydCB0dW5uZWwgZnJvbSAndHVubmVsJ1xyXG5jb25zdCBodHRwc0FnZW50ID0gbmV3IGh0dHBzLkFnZW50KHtcclxuICBtYXhWZXJzaW9uOiAnVExTdjEuMicsXHJcbiAgbWluVmVyc2lvbjogJ1RMU3YxLjInXHJcbn0pXHJcblxyXG4vLyB0aGFua3MgZm9yIGh0dHBzOi8vZ2l0aHViLmRldi9yZXF1ZXN0L3JlcXVlc3QvYmxvYi9tYXN0ZXIvaW5kZXguanNcclxuZnVuY3Rpb24gYXBwZW5kRm9ybURhdGEgKGZvcm06IEZvcm1EYXRhLCBrZXk6IHN0cmluZywgZGF0YTogYW55KTogdm9pZCB7XHJcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAndmFsdWUnIGluIGRhdGEgJiYgJ29wdGlvbnMnIGluIGRhdGEpIHtcclxuICAgIGZvcm0uYXBwZW5kKGtleSwgZGF0YS52YWx1ZSwgZGF0YS5vcHRpb25zKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBmb3JtLmFwcGVuZChrZXksIGRhdGEpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXF1ZXN0SW50ZXJjZXB0b3IgKG9wdGlvbnM6IElPbGRSZXFPcHRpb25zIHwgQXhpb3NSZXF1ZXN0Q29uZmlnKTogQXhpb3NSZXF1ZXN0Q29uZmlnICYge1xyXG4gIF9faXNPbGRPcHRpb25zPzogYm9vbGVhblxyXG59IHtcclxuICBsZXQgX19pc09sZE9wdGlvbnMgPSBmYWxzZVxyXG4gIGNvbnN0IG9wdDogQXhpb3NSZXF1ZXN0Q29uZmlnPGFueT4gJiB7XHJcbiAgICBfX2lzT2xkT3B0aW9ucz86IGJvb2xlYW5cclxuICB9ID0ge1xyXG4gICAgLi4ub3B0aW9ucyxcclxuICAgIHVybDogKG9wdGlvbnMudXJsIGFzIHN0cmluZykgfHwgJycsXHJcbiAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMgfHwge31cclxuICB9XHJcbiAgLy8gdXNlciByZXF1ZXN0IGNvbmZpZyBwcm94eVxyXG4gIGlmIChvcHRpb25zLnByb3h5KSB7XHJcbiAgICBsZXQgcHJveHlPcHRpb25zID0gb3B0aW9ucy5wcm94eVxyXG4gICAgaWYgKHR5cGVvZiBwcm94eU9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcHJveHlPcHRpb25zID0gbmV3IFVSTChvcHRpb25zLnByb3h5KVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgcHJveHlPcHRpb25zID0gZmFsc2VcclxuICAgICAgICBvcHQucHJveHkgPSBmYWxzZVxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgfVxyXG4gICAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcclxuICAgIH1cclxuICAgIGlmIChwcm94eU9wdGlvbnMpIHtcclxuICAgICAgaWYgKG9wdGlvbnMudXJsPy5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XHJcbiAgICAgICAgb3B0LnByb3h5ID0gZmFsc2VcclxuICAgICAgICBvcHQuaHR0cHNBZ2VudCA9IHR1bm5lbC5odHRwc092ZXJIdHRwKHtcclxuICAgICAgICAgIHByb3h5OiB7XHJcbiAgICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucz8uaG9zdG5hbWUsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KHByb3h5T3B0aW9ucz8ucG9ydCwgMTApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvcHQucHJveHkgPSB7XHJcbiAgICAgICAgICBob3N0OiBwcm94eU9wdGlvbnMuaG9zdG5hbWUsXHJcbiAgICAgICAgICBwb3J0OiBwYXJzZUludChwcm94eU9wdGlvbnMucG9ydCwgMTApLFxyXG4gICAgICAgICAgcHJvdG9jb2w6ICdodHRwJ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBpZiAoJ2Zvcm1EYXRhJyBpbiBvcHRpb25zKSB7XHJcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMuZm9ybURhdGEpIHtcclxuICAgICAgY29uc3QgZGF0YSA9IG9wdGlvbnMuZm9ybURhdGFba2V5XVxyXG4gICAgICBhcHBlbmRGb3JtRGF0YShmb3JtLCBrZXksIGRhdGEpXHJcbiAgICB9XHJcbiAgICBvcHQuZGF0YSA9IGZvcm1cclxuICAgIG9wdC5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbihvcHQuaGVhZGVycyB8fCB7fSwgZm9ybS5nZXRIZWFkZXJzKCkpXHJcbiAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcclxuICAgIGRlbGV0ZSBvcHQuZm9ybURhdGFcclxuICB9XHJcbiAgaWYgKCdib2R5JyBpbiBvcHRpb25zKSB7XHJcbiAgICBvcHQuZGF0YSA9IG9wdGlvbnMuYm9keVxyXG4gICAgX19pc09sZE9wdGlvbnMgPSB0cnVlXHJcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXHJcbiAgICBkZWxldGUgb3B0LmJvZHlcclxuICB9XHJcbiAgaWYgKCdxcycgaW4gb3B0aW9ucykge1xyXG4gICAgb3B0LnBhcmFtcyA9IG9wdGlvbnMucXNcclxuICAgIF9faXNPbGRPcHRpb25zID0gdHJ1ZVxyXG4gIH1cclxuICBvcHQuX19pc09sZE9wdGlvbnMgPSBfX2lzT2xkT3B0aW9uc1xyXG4gIHJldHVybiBvcHRcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzcG9uc2VJbnRlcmNlcHRvciAocmVzcG9uc2U6IEF4aW9zUmVzcG9uc2UpOiBJRnVsbFJlc3BvbnNlIHtcclxuICByZXR1cm4ge1xyXG4gICAgLi4ucmVzcG9uc2UsXHJcbiAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXHJcbiAgICBib2R5OiByZXNwb25zZS5kYXRhXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNwb25zZUVycm9ySGFuZGxlciAoZXJyb3I6IGFueSkge1xyXG4gIC8vIGlmIChlcnJvci5yZXNwb25zZSkge1xyXG4gIC8vICAgLy8gVGhlIHJlcXVlc3Qgd2FzIG1hZGUgYW5kIHRoZSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggYSBzdGF0dXMgY29kZVxyXG4gIC8vICAgLy8gdGhhdCBmYWxscyBvdXQgb2YgdGhlIHJhbmdlIG9mIDJ4eFxyXG4gIC8vICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm8pXHJcbiAgLy8gfSBlbHNlIGlmIChlcnJvci5yZXF1ZXN0KSB7XHJcbiAgLy8gICAvLyBUaGUgcmVxdWVzdCB3YXMgbWFkZSBidXQgbm8gcmVzcG9uc2Ugd2FzIHJlY2VpdmVkXHJcbiAgLy8gICAvLyBgZXJyb3IucmVxdWVzdGAgaXMgYW4gaW5zdGFuY2Ugb2YgWE1MSHR0cFJlcXVlc3QgaW4gdGhlIGJyb3dzZXIgYW5kIGFuIGluc3RhbmNlIG9mXHJcbiAgLy8gICAvLyBodHRwLkNsaWVudFJlcXVlc3QgaW4gbm9kZS5qc1xyXG4gIC8vICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yLnJlcXVlc3QpXHJcbiAgLy8gfSBlbHNlIHtcclxuICAvLyAgIC8vIFNvbWV0aGluZyBoYXBwZW5lZCBpbiBzZXR0aW5nIHVwIHRoZSByZXF1ZXN0IHRoYXQgdHJpZ2dlcmVkIGFuIEVycm9yXHJcbiAgLy8gICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IubWVzc2FnZSlcclxuICAvLyB9XHJcbiAgY29uc3QgZXJyb3JPYmogPSB7XHJcbiAgICBtZXRob2Q6IGVycm9yPy5jb25maWc/Lm1ldGhvZD8udG9VcHBlckNhc2UoKSB8fCAnJyxcclxuICAgIHVybDogZXJyb3I/LmNvbmZpZz8udXJsIHx8ICcnLFxyXG4gICAgc3RhdHVzQ29kZTogZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgfHwgMCxcclxuICAgIG1lc3NhZ2U6IGVycm9yPy5tZXNzYWdlIHx8ICcnLFxyXG4gICAgc3RhY2s6IGVycm9yPy5zdGFjayB8fCB7fSxcclxuICAgIHJlc3BvbnNlOiB7XHJcbiAgICAgIHN0YXR1czogZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgfHwgMCxcclxuICAgICAgc3RhdHVzQ29kZTogZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgfHwgMCxcclxuICAgICAgYm9keTogZXJyb3I/LnJlc3BvbnNlPy5kYXRhIHx8ICcnXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvck9iailcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlcXVlc3QgaW1wbGVtZW50cyBJUmVxdWVzdCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgcHJveHk6IFVuZGVmaW5hYmxlPHN0cmluZz4gPSAnJ1xyXG4gIG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZzxhbnk+ID0ge31cclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgICB0aGlzLmluaXQoKVxyXG4gICAgZXZlbnRCdXMub24oSUJ1c0V2ZW50LkNPTkZJR19DSEFOR0UsIChkYXRhOiBJQ29uZmlnQ2hhbmdlUGF5bG9hZDxzdHJpbmcgfCBJQ29uZmlnWydwaWNCZWQnXT4pID0+IHtcclxuICAgICAgc3dpdGNoIChkYXRhLmNvbmZpZ05hbWUpIHtcclxuICAgICAgICBjYXNlICdwaWNCZWQnOlxyXG4gICAgICAgICAgaWYgKChkYXRhLnZhbHVlIGFzIElDb25maWdbJ3BpY0JlZCddKT8ucHJveHkpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm94eSA9IChkYXRhLnZhbHVlIGFzIElDb25maWdbJ3BpY0JlZCddKS5wcm94eVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICdwaWNCZWQucHJveHknOlxyXG4gICAgICAgICAgdGhpcy5wcm94eSA9IGRhdGEudmFsdWUgYXMgc3RyaW5nXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0ICgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHByb3h5ID0gdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdwaWNCZWQucHJveHknKVxyXG4gICAgaWYgKHByb3h5KSB7XHJcbiAgICAgIHRoaXMucHJveHkgPSBwcm94eVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVQcm94eSAoKTogQXhpb3NSZXF1ZXN0Q29uZmlnWydwcm94eSddIHwgZmFsc2Uge1xyXG4gICAgaWYgKHRoaXMucHJveHkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwcm94eU9wdGlvbnMgPSBuZXcgVVJMKHRoaXMucHJveHkpXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucy5ob3N0bmFtZSxcclxuICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KHByb3h5T3B0aW9ucy5wb3J0IHx8ICcwJywgMTApLFxyXG4gICAgICAgICAgcHJvdG9jb2w6IHByb3h5T3B0aW9ucy5wcm90b2NvbFxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIC8vICM2NCBkeW5hbWljIGdldCBwcm94eSB2YWx1ZVxyXG4gIHJlcXVlc3Q8VCwgVSBleHRlbmRzIChcclxuICAgIElSZXF1ZXN0Q29uZmlnPFU+IGV4dGVuZHMgSU9sZFJlcU9wdGlvbnMgPyBJT2xkUmVxT3B0aW9ucyA6IElSZXF1ZXN0Q29uZmlnPFU+IGV4dGVuZHMgQXhpb3NSZXF1ZXN0Q29uZmlnID8gQXhpb3NSZXF1ZXN0Q29uZmlnIDogbmV2ZXJcclxuICApPiAob3B0aW9uczogVSk6IFByb21pc2U8SVJlc3BvbnNlPFQsIFU+PiB7XHJcbiAgICB0aGlzLm9wdGlvbnMucHJveHkgPSB0aGlzLmhhbmRsZVByb3h5KClcclxuICAgIHRoaXMub3B0aW9ucy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMubWF4Qm9keUxlbmd0aCA9IEluZmluaXR5XHJcbiAgICB0aGlzLm9wdGlvbnMubWF4Q29udGVudExlbmd0aCA9IEluZmluaXR5XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5ICYmIG9wdGlvbnMudXJsPy5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5odHRwc0FnZW50ID0gdHVubmVsLmh0dHBzT3Zlckh0dHAoe1xyXG4gICAgICAgIHByb3h5OiB7XHJcbiAgICAgICAgICBob3N0OiB0aGlzLm9wdGlvbnMucHJveHkuaG9zdCxcclxuICAgICAgICAgIHBvcnQ6IHRoaXMub3B0aW9ucy5wcm94eS5wb3J0XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLm9wdGlvbnMucHJveHkgPSBmYWxzZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmh0dHBzQWdlbnQgPSBodHRwc0FnZW50XHJcbiAgICB9XHJcbiAgICAvLyAhTk9USUNFIHRoaXMub3B0aW9ucyAhPT0gb3B0aW9uc1xyXG4gICAgLy8gdGhpcy5vcHRpb25zIGlzIHRoZSBkZWZhdWx0IG9wdGlvbnNcclxuICAgIGNvbnN0IGluc3RhbmNlID0gYXhpb3MuY3JlYXRlKHRoaXMub3B0aW9ucylcclxuICAgIGluc3RhbmNlLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UocmVzcG9uc2VJbnRlcmNlcHRvciwgcmVzcG9uc2VFcnJvckhhbmRsZXIpXHJcblxyXG4gICAgLy8gY29tcGF0aWJsZSB3aXRoIG9sZCByZXF1ZXN0IG9wdGlvbnMgdG8gbmV3IG9wdGlvbnNcclxuICAgIGNvbnN0IG9wdCA9IHJlcXVlc3RJbnRlcmNlcHRvcihvcHRpb25zKVxyXG5cclxuICAgIGluc3RhbmNlLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAob2JqKSB7XHJcbiAgICAgIC8vIGhhbmRsZSBDb250ZW50LVR5cGVcclxuICAgICAgbGV0IGNvbnRlbnRUeXBlID0gJydcclxuICAgICAgaWYgKG9iaj8uaGVhZGVycz8uY29udGVudFR5cGUpIHtcclxuICAgICAgICBjb250ZW50VHlwZSA9IG9iai5oZWFkZXJzLmNvbnRlbnRUeXBlIGFzIHN0cmluZ1xyXG4gICAgICAgIGRlbGV0ZSBvYmouaGVhZGVycy5jb250ZW50VHlwZVxyXG4gICAgICB9IGVsc2UgaWYgKG9iaj8uaGVhZGVycz8uQ29udGVudFR5cGUpIHtcclxuICAgICAgICBjb250ZW50VHlwZSA9IG9iai5oZWFkZXJzLkNvbnRlbnRUeXBlIGFzIHN0cmluZ1xyXG4gICAgICAgIGRlbGV0ZSBvYmouaGVhZGVycy5Db250ZW50VHlwZVxyXG4gICAgICB9IGVsc2UgaWYgKG9iaj8uaGVhZGVycz8uWydjb250ZW50LXR5cGUnXSkge1xyXG4gICAgICAgIGNvbnRlbnRUeXBlID0gb2JqLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddIGFzIHN0cmluZ1xyXG4gICAgICAgIGRlbGV0ZSBvYmouaGVhZGVyc1snY29udGVudC10eXBlJ11cclxuICAgICAgfVxyXG4gICAgICBpZiAoY29udGVudFR5cGUgIT09ICcnICYmIG9iai5oZWFkZXJzKSB7XHJcbiAgICAgICAgb2JqLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gY29udGVudFR5cGVcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2JqXHJcbiAgICB9KVxyXG4gICAgaWYgKCdyZXNvbHZlV2l0aEZ1bGxSZXNwb25zZScgaW4gb3B0aW9ucyAmJiBvcHRpb25zLnJlc29sdmVXaXRoRnVsbFJlc3BvbnNlKSB7XHJcbiAgICAgIHJldHVybiBpbnN0YW5jZS5yZXF1ZXN0KG9wdClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBpbnN0YW5jZS5yZXF1ZXN0KG9wdCkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIC8vIHVzZSBvbGQgcmVxdWVzdCBvcHRpb24gZm9ybWF0XHJcbiAgICAgICAgaWYgKG9wdC5fX2lzT2xkT3B0aW9ucykge1xyXG4gICAgICAgICAgaWYgKCdqc29uJyBpbiBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVzLmRhdGFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcy5kYXRhKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzLmRhdGFcclxuICAgICAgICB9XHJcbiAgICAgIH0pIGFzIFByb21pc2U8SVJlc3BvbnNlPFQsIFU+PlxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVxdWVzdFxyXG4iLCJpbXBvcnQgeyBJQ29uZmlnLCBJUGljR28gfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgSlNPTlN0b3JlIH0gZnJvbSAnQHBpY2dvL3N0b3JlJ1xyXG5pbXBvcnQgeyBJSlNPTiB9IGZyb20gJ0BwaWNnby9zdG9yZS9kaXN0L3R5cGVzJ1xyXG5cclxuY2xhc3MgREIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBwcml2YXRlIHJlYWRvbmx5IGRiOiBKU09OU3RvcmVcclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgICB0aGlzLmRiID0gbmV3IEpTT05TdG9yZSh0aGlzLmN0eC5jb25maWdQYXRoKVxyXG5cclxuICAgIGlmICghdGhpcy5kYi5oYXMoJ3BpY0JlZCcpKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5kYi5zZXQoJ3BpY0JlZCcsIHtcclxuICAgICAgICAgIHVwbG9hZGVyOiAnc21tcycsXHJcbiAgICAgICAgICBjdXJyZW50OiAnc21tcydcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghdGhpcy5kYi5oYXMoJ3BpY2dvUGx1Z2lucycpKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5kYi5zZXQoJ3BpY2dvUGx1Z2lucycsIHt9KVxyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlYWQgKGZsdXNoPzogYm9vbGVhbik6IElKU09OIHtcclxuICAgIHJldHVybiB0aGlzLmRiLnJlYWQoZmx1c2gpXHJcbiAgfVxyXG5cclxuICBnZXQgKGtleTogc3RyaW5nID0gJycpOiBhbnkge1xyXG4gICAgdGhpcy5yZWFkKHRydWUpXHJcbiAgICByZXR1cm4gdGhpcy5kYi5nZXQoa2V5KVxyXG4gIH1cclxuXHJcbiAgc2V0IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWFkKHRydWUpXHJcbiAgICByZXR1cm4gdGhpcy5kYi5zZXQoa2V5LCB2YWx1ZSlcclxuICB9XHJcblxyXG4gIGhhcyAoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHRoaXMucmVhZCh0cnVlKVxyXG4gICAgcmV0dXJuIHRoaXMuZGIuaGFzKGtleSlcclxuICB9XHJcblxyXG4gIHVuc2V0IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5yZWFkKHRydWUpXHJcbiAgICByZXR1cm4gdGhpcy5kYi51bnNldChrZXksIHZhbHVlKVxyXG4gIH1cclxuXHJcbiAgc2F2ZUNvbmZpZyAoY29uZmlnOiBQYXJ0aWFsPElDb25maWc+KTogdm9pZCB7XHJcbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICB0aGlzLnNldChuYW1lLCBjb25maWdbbmFtZV0pXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ29uZmlnIChjb25maWc6IElDb25maWcpOiB2b2lkIHtcclxuICAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIHRoaXMudW5zZXQobmFtZSwgY29uZmlnW25hbWVdKVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERCXHJcblxyXG4vLyBjb25zdCBpbml0Q29uZmlnID0gKGNvbmZpZ1BhdGg6IHN0cmluZyk6IGxvd2RiLkxvd2RiU3luYzxhbnk+ID0+IHtcclxuLy8gfVxyXG5cclxuLy8gY29uc3Qgc2F2ZUNvbmZpZyA9IChjb25maWdQYXRoOiBzdHJpbmcsIGNvbmZpZzogYW55KTogdm9pZCA9PiB7XHJcbi8vICAgY29uc3QgZGIgPSBpbml0Q29uZmlnKGNvbmZpZ1BhdGgpXHJcbi8vICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcclxuLy8gICAgIGRiLnJlYWQoKS5zZXQobmFtZSwgY29uZmlnW25hbWVdKS53cml0ZSgpXHJcbi8vICAgfSlcclxuLy8gfVxyXG5cclxuLy8gZXhwb3J0IHtcclxuLy8gaW5pdENvbmZpZyxcclxuLy8gc2F2ZUNvbmZpZ1xyXG4vLyB9XHJcbiIsImltcG9ydCBzcGF3biBmcm9tICdjcm9zcy1zcGF3bidcclxuaW1wb3J0IHtcclxuICBJUmVzdWx0LFxyXG4gIElQcm9jZXNzRW52LFxyXG4gIElQbHVnaW5Qcm9jZXNzUmVzdWx0LFxyXG4gIElQbHVnaW5IYW5kbGVyLFxyXG4gIElQbHVnaW5IYW5kbGVyT3B0aW9ucyxcclxuICBVbmRlZmluYWJsZSxcclxuICBJUGljR28sXHJcbiAgSVBsdWdpbkhhbmRsZXJSZXN1bHRcclxufSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IGdldFByb2Nlc3NQbHVnaW5OYW1lLCBnZXROb3JtYWxQbHVnaW5OYW1lIH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uL2kxOG4vemgtQ04nXHJcblxyXG5leHBvcnQgY2xhc3MgUGx1Z2luSGFuZGxlciBpbXBsZW1lbnRzIElQbHVnaW5IYW5kbGVyIHtcclxuICAvLyBUaGFua3MgdG8gZmVmbG93IC0+IGh0dHBzOi8vZ2l0aHViLmNvbS9mZWZsb3cvZmVmbG93L2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9pbnN0YWxsL3BsdWdpbi5qc1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbnN0YWxsIChwbHVnaW5zOiBzdHJpbmdbXSwgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sIGVudj86IElQcm9jZXNzRW52KTogUHJvbWlzZTxJUGx1Z2luSGFuZGxlclJlc3VsdDxib29sZWFuPj4ge1xyXG4gICAgY29uc3QgaW5zdGFsbGVkUGx1Z2luczogc3RyaW5nW10gPSBbXVxyXG4gICAgY29uc3QgcHJvY2Vzc1BsdWdpbnMgPSBwbHVnaW5zXHJcbiAgICAgIC5tYXAoKGl0ZW06IHN0cmluZykgPT4gaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3ModGhpcy5jdHgsIGl0ZW0pKVxyXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgLy8gZGV0ZWN0IGlmIGhhcyBhbHJlYWR5IGluc3RhbGxlZFxyXG4gICAgICAgIC8vIG9yIHdpbGwgY2F1c2UgZXJyb3JcclxuICAgICAgICBpZiAodGhpcy5jdHgucGx1Z2luTG9hZGVyLmhhc1BsdWdpbihpdGVtLnBrZ05hbWUpKSB7XHJcbiAgICAgICAgICBpbnN0YWxsZWRQbHVnaW5zLnB1c2goaXRlbS5wa2dOYW1lKVxyXG4gICAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3MoYFBpY0dvIGhhcyBhbHJlYWR5IGluc3RhbGxlZCAke2l0ZW0ucGtnTmFtZX1gKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHNvbWV0aGluZyB3cm9uZywgZmlsdGVyIGl0IG91dFxyXG4gICAgICAgIGlmICghaXRlbS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfSlcclxuICAgIGNvbnN0IGZ1bGxOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0uZnVsbE5hbWUpXHJcbiAgICBjb25zdCBwa2dOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0ucGtnTmFtZSlcclxuICAgIGlmIChmdWxsTmFtZUxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBpbnN0YWxsIHBsdWdpbnMgbXVzdCB1c2UgZnVsbE5hbWVMaXN0OlxyXG4gICAgICAvLyAxLiBpbnN0YWxsIHJlbW90ZSBwYWNhZ2VcclxuICAgICAgLy8gMi4gaW5zdGFsbCBsb2NhbCBwYWNhZ2VcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZCgnaW5zdGFsbCcsIGZ1bGxOYW1lTGlzdCwgdGhpcy5jdHguYmFzZURpciwgb3B0aW9ucywgZW52KVxyXG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSB7XHJcbiAgICAgICAgcGtnTmFtZUxpc3QuZm9yRWFjaCgocGx1Z2luTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN0eC5wbHVnaW5Mb2FkZXIucmVnaXN0ZXJQbHVnaW4ocGx1Z2luTmFtZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUycpKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ2luc3RhbGxTdWNjZXNzJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUycpLFxyXG4gICAgICAgICAgYm9keTogWy4uLnBrZ05hbWVMaXN0LCAuLi5pbnN0YWxsZWRQbHVnaW5zXVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDx0cnVlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxyXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGFcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgnaW5zdGFsbEZhaWxlZCcsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChpbnN0YWxsZWRQbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEJylcclxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgdGhpcy5jdHguZW1pdCgnaW5zdGFsbEZhaWxlZCcsIHtcclxuICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfSlcclxuICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTJykpXHJcbiAgICAgIHRoaXMuY3R4LmVtaXQoJ2luc3RhbGxTdWNjZXNzJywge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1MnKSxcclxuICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgIH0pXHJcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdW5pbnN0YWxsIChwbHVnaW5zOiBzdHJpbmdbXSk6IFByb21pc2U8SVBsdWdpbkhhbmRsZXJSZXN1bHQ8Ym9vbGVhbj4+IHtcclxuICAgIGNvbnN0IHByb2Nlc3NQbHVnaW5zID0gcGx1Z2lucy5tYXAoKGl0ZW06IHN0cmluZykgPT4gaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3ModGhpcy5jdHgsIGl0ZW0pKS5maWx0ZXIoaXRlbSA9PiBpdGVtLnN1Y2Nlc3MpXHJcbiAgICBjb25zdCBwa2dOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0ucGtnTmFtZSlcclxuICAgIGlmIChwa2dOYW1lTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIHVuaW5zdGFsbCBwbHVnaW5zIG11c3QgdXNlIHBrZ05hbWVMaXN0OlxyXG4gICAgICAvLyBucG0gdW5pbnN0YWxsIHdpbGwgdXNlIHRoZSBwYWNrYWdlLmpzb24ncyBuYW1lXHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY0NvbW1hbmQoJ3VuaW5zdGFsbCcsIHBrZ05hbWVMaXN0LCB0aGlzLmN0eC5iYXNlRGlyKVxyXG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSB7XHJcbiAgICAgICAgcGtnTmFtZUxpc3QuZm9yRWFjaCgocGx1Z2luTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN0eC5wbHVnaW5Mb2FkZXIudW5yZWdpc3RlclBsdWdpbihwbHVnaW5OYW1lKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1MnKSlcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KCd1bmluc3RhbGxTdWNjZXNzJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTJyksXHJcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDx0cnVlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxyXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGFcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgndW5pbnN0YWxsRmFpbGVkJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQnKVxyXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICB0aGlzLmN0eC5lbWl0KCd1bmluc3RhbGxGYWlsZWQnLCB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfSlcclxuICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlIChwbHVnaW5zOiBzdHJpbmdbXSwgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sIGVudj86IElQcm9jZXNzRW52KTogUHJvbWlzZTxJUGx1Z2luSGFuZGxlclJlc3VsdDxib29sZWFuPj4ge1xyXG4gICAgY29uc3QgcHJvY2Vzc1BsdWdpbnMgPSBwbHVnaW5zLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBoYW5kbGVQbHVnaW5OYW1lUHJvY2Vzcyh0aGlzLmN0eCwgaXRlbSkpLmZpbHRlcihpdGVtID0+IGl0ZW0uc3VjY2VzcylcclxuICAgIGNvbnN0IHBrZ05hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKGl0ZW0gPT4gaXRlbS5wa2dOYW1lKVxyXG4gICAgaWYgKHBrZ05hbWVMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gdXBkYXRlIHBsdWdpbnMgbXVzdCB1c2UgcGtnTmFtZUxpc3Q6XHJcbiAgICAgIC8vIG5wbSB1cGRhdGUgd2lsbCB1c2UgdGhlIHBhY2thZ2UuanNvbidzIG5hbWVcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZCgndXBkYXRlJywgcGtnTmFtZUxpc3QsIHRoaXMuY3R4LmJhc2VEaXIsIG9wdGlvbnMsIGVudilcclxuICAgICAgaWYgKCFyZXN1bHQuY29kZSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTJykpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgndXBkYXRlU3VjY2VzcycsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUycpLFxyXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3RcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3RcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OJywge1xyXG4gICAgICAgICAgY29kZTogYCR7cmVzdWx0LmNvZGV9YCxcclxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ3VwZGF0ZUZhaWxlZCcsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEJyksXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEJylcclxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgdGhpcy5jdHguZW1pdCgndXBkYXRlRmFpbGVkJywge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEJyksXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH0pXHJcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIGJvZHk6IGVyclxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY0NvbW1hbmQgKGNtZDogc3RyaW5nLCBtb2R1bGVzOiBzdHJpbmdbXSwgd2hlcmU6IHN0cmluZywgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sIGVudjogSVByb2Nlc3NFbnYgPSB7fSk6IFByb21pc2U8SVJlc3VsdD4ge1xyXG4gICAgLy8gb3B0aW9ucyBmaXJzdFxyXG4gICAgY29uc3QgcmVnaXN0cnkgPSBvcHRpb25zLnJlZ2lzdHJ5IHx8IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2V0dGluZ3MucmVnaXN0cnknKVxyXG4gICAgY29uc3QgcHJveHkgPSBvcHRpb25zLnByb3h5IHx8IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2V0dGluZ3MucHJveHknKVxyXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlOiBhbnkpOiB2b2lkID0+IHtcclxuICAgICAgbGV0IGFyZ3MgPSBbY21kXS5jb25jYXQobW9kdWxlcykuY29uY2F0KCctLWNvbG9yPWFsd2F5cycpLmNvbmNhdCgnLS1zYXZlJylcclxuICAgICAgaWYgKHJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KGAtLXJlZ2lzdHJ5PSR7cmVnaXN0cnl9YClcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJveHkpIHtcclxuICAgICAgICBhcmdzID0gYXJncy5jb25jYXQoYC0tcHJveHk9JHtwcm94eX1gKVxyXG4gICAgICB9XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgbnBtID0gc3Bhd24oJ25wbScsIGFyZ3MsIHsgY3dkOiB3aGVyZSwgZW52OiBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwgZW52KSB9KVxyXG5cclxuICAgICAgICBsZXQgb3V0cHV0ID0gJydcclxuICAgICAgICBucG0uc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIG91dHB1dCArPSBkYXRhXHJcbiAgICAgICAgfSkucGlwZShwcm9jZXNzLnN0ZG91dClcclxuXHJcbiAgICAgICAgbnBtLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBvdXRwdXQgKz0gZGF0YVxyXG4gICAgICAgIH0pLnBpcGUocHJvY2Vzcy5zdGRlcnIpXHJcblxyXG4gICAgICAgIG5wbS5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWNvZGUpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh7IGNvZGU6IDAsIGRhdGE6IG91dHB1dCB9KVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh7IGNvZGU6IGNvZGUsIGRhdGE6IG91dHB1dCB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLy8gZm9yIHVzZXJzIHdobyBoYXZlbid0IGluc3RhbGxlZCBub2RlLmpzXHJcbiAgICAgICAgbnBtLm9uKCdlcnJvcicsIChlcnI6IEVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKCdOUE0gaXMgbm90IGluc3RhbGxlZCcpXHJcbiAgICAgICAgICB0aGlzLmN0eC5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCAnTlBNIGlzIG5vdCBpbnN0YWxsZWQnKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSBhcyBFcnJvcilcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCBlKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIHRyYW5zZm9ybSB0aGUgaW5wdXQgcGx1Z2luIG5hbWUgb3IgcGF0aCBzdHJpbmcgdG8gdmFsaWQgcmVzdWx0XHJcbiAqIEBwYXJhbSBjdHhcclxuICogQHBhcmFtIG5hbWVPclBhdGhcclxuICovXHJcbmNvbnN0IGhhbmRsZVBsdWdpbk5hbWVQcm9jZXNzID0gKGN0eDogSVBpY0dvLCBuYW1lT3JQYXRoOiBzdHJpbmcpOiBJUGx1Z2luUHJvY2Vzc1Jlc3VsdCA9PiB7XHJcbiAgY29uc3QgcmVzID0ge1xyXG4gICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICBmdWxsTmFtZTogJycsXHJcbiAgICBwa2dOYW1lOiAnJ1xyXG4gIH1cclxuICBjb25zdCByZXN1bHQgPSBnZXRQcm9jZXNzUGx1Z2luTmFtZShuYW1lT3JQYXRoLCBjdHgubG9nKVxyXG4gIGlmICghcmVzdWx0KSB7XHJcbiAgICByZXR1cm4gcmVzXHJcbiAgfVxyXG4gIC8vIGZpcnN0IGdldCByZXN1bHQgdGhlbiBkbyB0aGlzIHByb2Nlc3NcclxuICAvLyBvciBzb21lIGVycm9yIHdpbGwgbG9nIHR3aWNlXHJcbiAgY29uc3QgcGtnTmFtZSA9IGdldE5vcm1hbFBsdWdpbk5hbWUocmVzdWx0LCBjdHgubG9nKVxyXG4gIGlmICghcGtnTmFtZSkge1xyXG4gICAgcmV0dXJuIHJlc1xyXG4gIH1cclxuICByZXR1cm4ge1xyXG4gICAgc3VjY2VzczogdHJ1ZSxcclxuICAgIGZ1bGxOYW1lOiByZXN1bHQsXHJcbiAgICBwa2dOYW1lXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQbHVnaW5IYW5kbGVyXHJcbiIsImltcG9ydCB7IFpIX0NOLCBJTG9jYWxlc0tleSwgSUxvY2FsZXMgfSBmcm9tICcuL3poLUNOJ1xyXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgSVBpY0dvIH0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCdcclxuXHJcbmltcG9ydCB7IE9iamVjdEFkYXB0ZXIsIEkxOG4gfSBmcm9tICdAcGljZ28vaTE4bidcclxuaW1wb3J0IHsgSVN0cmluZ0tleU1hcCwgSUkxOG5NYW5hZ2VyIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnXHJcbmltcG9ydCB7IElMb2NhbGUgfSBmcm9tICdAcGljZ28vaTE4bi9kaXN0L3R5cGVzJ1xyXG5pbXBvcnQgeyBFTiB9IGZyb20gJy4vZW4nXHJcbmltcG9ydCB7IFpIX1RXIH0gZnJvbSAnLi96aC1UVydcclxuXHJcbmNvbnN0IGxhbmd1YWdlTGlzdDogSVN0cmluZ0tleU1hcDxJU3RyaW5nS2V5TWFwPHN0cmluZz4+ID0ge1xyXG4gICd6aC1DTic6IFpIX0NOLFxyXG4gICd6aC1UVyc6IFpIX1RXLFxyXG4gIGVuOiBFTlxyXG59XHJcblxyXG5jbGFzcyBJMThuTWFuYWdlciBpbXBsZW1lbnRzIElJMThuTWFuYWdlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpMThuOiBJMThuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvYmplY3RBZGFwdGVyOiBPYmplY3RBZGFwdGVyXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMub2JqZWN0QWRhcHRlciA9IG5ldyBPYmplY3RBZGFwdGVyKGxhbmd1YWdlTGlzdClcclxuICAgIGxldCBsYW5ndWFnZSA9IHRoaXMuY3R4LmdldENvbmZpZzxzdHJpbmc+KCdzZXR0aW5ncy5sYW5ndWFnZScpIHx8ICd6aC1DTidcclxuICAgIGlmICghbGFuZ3VhZ2VMaXN0W2xhbmd1YWdlXSkge1xyXG4gICAgICBsYW5ndWFnZSA9ICd6aC1DTicgLy8gdXNlIGRlZmF1bHRcclxuICAgIH1cclxuICAgIHRoaXMuaTE4biA9IG5ldyBJMThuKHtcclxuICAgICAgYWRhcHRlcjogdGhpcy5vYmplY3RBZGFwdGVyLFxyXG4gICAgICBkZWZhdWx0TGFuZ3VhZ2U6IGxhbmd1YWdlXHJcbiAgICB9KVxyXG4gICAgdGhpcy5sb2FkT3V0dGVySTE4bigpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRPdXR0ZXJJMThuICgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGkxOG5Gb2xkZXIgPSB0aGlzLmdldE91dHRlckkxOG5Gb2xkZXIoKVxyXG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhpMThuRm9sZGVyLCB7XHJcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcclxuICAgIH0pXHJcbiAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xyXG4gICAgICBpZiAoZmlsZS5pc0ZpbGUoKSAmJiBmaWxlLm5hbWUuZW5kc1dpdGgoJy55bWwnKSkge1xyXG4gICAgICAgIGNvbnN0IGkxOG5GaWxlUGF0aCA9IHBhdGguam9pbihpMThuRm9sZGVyLCBmaWxlLm5hbWUpXHJcbiAgICAgICAgY29uc3QgaTE4bkZpbGUgPSBmcy5yZWFkRmlsZVN5bmMoaTE4bkZpbGVQYXRoLCAndXRmOCcpXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGkxOG5GaWxlT2JqID0geWFtbC5sb2FkKGkxOG5GaWxlKSBhcyBJTG9jYWxlc1xyXG4gICAgICAgICAgbGFuZ3VhZ2VMaXN0W2ZpbGUubmFtZS5yZXBsYWNlKC9cXC55bWwkLywgJycpXSA9IGkxOG5GaWxlT2JqXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T3V0dGVySTE4bkZvbGRlciAoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGkxOG5Gb2xkZXIgPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgJ2kxOG4tY2xpJylcclxuICAgIGlmICghZnMucGF0aEV4aXN0c1N5bmMoaTE4bkZvbGRlcikpIHtcclxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhpMThuRm9sZGVyKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGkxOG5Gb2xkZXJcclxuICB9XHJcblxyXG4gIHRyYW5zbGF0ZTxUIGV4dGVuZHMgc3RyaW5nPihrZXk6IElMb2NhbGVzS2V5IHwgVCwgYXJncz86IElTdHJpbmdLZXlNYXA8c3RyaW5nPik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5pMThuLnRyYW5zbGF0ZShrZXksIGFyZ3MpIHx8IGtleVxyXG4gIH1cclxuXHJcbiAgc2V0TGFuZ3VhZ2UgKGxhbmd1YWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuaTE4bi5zZXRMYW5ndWFnZShsYW5ndWFnZSlcclxuICAgIHRoaXMuY3R4LnNhdmVDb25maWcoe1xyXG4gICAgICAnc2V0dGluZ3MubGFuZ3VhZ2UnOiBsYW5ndWFnZVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGFkZExvY2FsZSAobGFuZ3VhZ2U6IHN0cmluZywgbG9jYWxlczogSUxvY2FsZSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgb3JpZ2luTG9jYWxlcyA9IHRoaXMub2JqZWN0QWRhcHRlci5nZXRMb2NhbGUobGFuZ3VhZ2UpXHJcbiAgICBpZiAoIW9yaWdpbkxvY2FsZXMpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXdMb2NhbGVzID0gbWVyZ2Uob3JpZ2luTG9jYWxlcywgbG9jYWxlcylcclxuICAgIHRoaXMub2JqZWN0QWRhcHRlci5zZXRMb2NhbGUobGFuZ3VhZ2UsIG5ld0xvY2FsZXMpXHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgYWRkTGFuZ3VhZ2UgKGxhbmd1YWdlOiBzdHJpbmcsIGxvY2FsZXM6IElMb2NhbGUpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG9yaWdpbkxvY2FsZXMgPSB0aGlzLm9iamVjdEFkYXB0ZXIuZ2V0TG9jYWxlKGxhbmd1YWdlKVxyXG4gICAgaWYgKG9yaWdpbkxvY2FsZXMpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLm9iamVjdEFkYXB0ZXIuc2V0TG9jYWxlKGxhbmd1YWdlLCBsb2NhbGVzKVxyXG4gICAgbGFuZ3VhZ2VMaXN0W2xhbmd1YWdlXSA9IGxvY2FsZXNcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICBnZXRMYW5ndWFnZUxpc3QgKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhsYW5ndWFnZUxpc3QpXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQge1xyXG4gIEkxOG5NYW5hZ2VyXHJcbn1cclxuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nICovXHJcbmV4cG9ydCBjb25zdCBaSF9DTiA9IHtcclxuICBVUExPQURfRkFJTEVEOiAn5LiK5Lyg5aSx6LSlJyxcclxuICBDSEVDS19TRVRUSU5HUzogJ+ivt+ajgOafpeS9oOeahOmFjee9rumhueaYr+WQpuato+ehricsXHJcbiAgQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUks6ICfor7fmo4Dmn6XkvaDnmoTphY3nva7pobnku6Xlj4rnvZHnu5wnLFxyXG4gIFVQTE9BRF9GQUlMRURfUkVBU09OOiAn6ZSZ6K+v56CB77yaJHtjb2Rlfe+8jOivt+aJk+W8gOa1j+iniOWZqOeymOi0tOWcsOWdgOafpeeci+ebuOWFs+WOn+WboCcsXHJcbiAgU0VSVkVSX0VSUk9SOiAn5pyN5Yqh56uv5Ye66ZSZ77yM6K+36YeN6K+VJyxcclxuICBBVVRIX0ZBSUxFRDogJ+iupOivgeWksei0pScsXHJcblxyXG4gIC8vIHNtbXNcclxuICBQSUNCRURfU01NUzogJ1NNLk1TJyxcclxuICBQSUNCRURfU01NU19UT0tFTjogJ+iuvuWumlRva2VuJyxcclxuICBQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOOiAn5aSH55So5LiK5Lyg5Z+f5ZCNJyxcclxuICBQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU46ICfkvovlpoIgc21tcy5hcHAnLFxyXG5cclxuICAvLyBBbGktY2xvdWRcclxuICBQSUNCRURfQUxJQ0xPVUQ6ICfpmL/ph4zkupFPU1MnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRDogJ+iuvuWumktleUlkJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUOiAn6K6+5a6aS2V5U2VjcmV0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQlVDS0VUOiAn6K6+5a6aQnVja2V0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQVJFQTogJ+iuvuWumuWtmOWCqOWMuuWfnycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkw6ICforr7lrproh6rlrprkuYnln5/lkI0nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9PUFRJT05TOiAn6K6+5a6a572R5Z2A5ZCO57yAJyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yab3NzLWNuLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj94LW9zcy1wcm9jZXNzPXh4eCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIFRlbmNlbnQtY2xvdWRcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEOiAn6IW+6K6v5LqRQ09TJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1ZFUlNJT046ICdDT1PniYjmnKwnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQ6ICforr7lrppTZWNyZXRJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRLRVk6ICforr7lrppTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQ6ICforr7lrppBcHBJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVQ6ICforr7lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQTogJ+iuvuWumuWtmOWCqOWMuuWfnycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIOiAn6K6+5a6a5a2Y5YKo6Lev5b6EJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlM6ICforr7lrprnvZHlnYDlkI7nvIAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQ1VTVE9NVVJMOiAn6K6+5a6a6Ieq5a6a5LmJ5Z+f5ZCNJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQ6ICfkvovlpoLvvJoxMjM0NTY3ODkwJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mmFwLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj9pbWFnZU1vZ3IyJyxcclxuXHJcbiAgLy8gR2l0SHViXHJcbiAgUElDQkVEX0dJVEhVQjogJ0dpdEh1YicsXHJcbiAgUElDQkVEX0dJVEhVQl9UT0tFTjogJ+iuvuWumlRva2VuJyxcclxuICBQSUNCRURfR0lUSFVCX1JFUE86ICforr7lrprku5PlupPlkI0nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX0dJVEhVQl9CUkFOQ0g6ICforr7lrprliIbmlK/lkI0nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMOiAn6K6+5a6a6Ieq5a6a5LmJ5Z+f5ZCNJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTzogJ+agvOW8j++8mnVzZXJuYW1lL3JlcG8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0g6ICfkvovlpoLvvJptYWluJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIHFpbml1XHJcbiAgUElDQkVEX1FJTklVOiAn5LiD54mb5LqRJyxcclxuICBQSUNCRURfUUlOSVVfQUNDRVNTS0VZOiAn6K6+5a6aQWNjZXNzS2V5JyxcclxuICBQSUNCRURfUUlOSVVfU0VDUkVUS0VZOiAn6K6+5a6aU2VjcmV0S2V5JyxcclxuICBQSUNCRURfUUlOSVVfQlVDS0VUOiAn6K6+5a6aQnVja2V0JyxcclxuICBQSUNCRURfUUlOSVVfUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX1FJTklVX1VSTDogJ+iuvuWumuiuv+mXrue9keWdgCcsXHJcbiAgUElDQkVEX1FJTklVX09QVElPTlM6ICforr7lrprnvZHlnYDlkI7nvIAnLFxyXG4gIFBJQ0JFRF9RSU5JVV9BUkVBOiAn6K6+5a6a5a2Y5YKo5Yy65Z+fJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJp6MCcsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj9pbWFnZXNsaW0nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTDogJ+S+i+Wmgu+8mmh0dHBzOi8veHh4Lnl5eS5nbGIuY2xvdWRkbi5jb20nLFxyXG5cclxuICAvLyBpbWd1clxyXG4gIFBJQ0JFRF9JTUdVUjogJ0ltZ3VyJyxcclxuICBQSUNCRURfSU1HVVJfQ0xJRU5USUQ6ICforr7lrppDbGllbnRJZCcsXHJcbiAgUElDQkVEX0lNR1VSX1VTRVJOQU1FOiAn6K6+5a6a55So5oi35ZCNJyxcclxuICBQSUNCRURfSU1HVVJfQUNDRVNTX1RPS0VOOiAn6K6+5a6aYWNjZXNzVG9rZW4nLFxyXG4gIFBJQ0JFRF9JTUdVUl9BTEJVTTogJ+iuvuWumuebuOWGjOWQjScsXHJcbiAgUElDQkVEX0lNR1VSX1BST1hZOiAn6K6+5a6a5Luj55CGJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9DTElFTlRJRDogJ+WMv+WQjeS4iuS8oOaXtuWhq+WGmScsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfVVNFUk5BTUU6ICfpnIDopoHkuIrkvKDliLDotKbmiLfml7bloavlhpknLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX0FDQ0VTU19UT0tFTjogJ+mcgOimgeS4iuS8oOWIsOi0puaIt+aXtuWhq+WGmScsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfQUxCVU06ICfkvovlpoLvvJp0ZXN0JyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogJ+S+i+Wmgu+8mmh0dHA6Ly8xMjcuMC4wLjE6MTA4MCcsXHJcblxyXG4gIC8vIHVweXVuXHJcbiAgUElDQkVEX1VQWVVOOiAn5Y+I5ouN5LqRJyxcclxuICBQSUNCRURfVVBZVU5fQlVDS0VUOiAn6K6+5a6aQnVja2V0JyxcclxuICBQSUNCRURfVVBZVU5fT1BFUkFUT1I6ICforr7lrprmk43kvZzlkZgnLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVNTV09SRDogJ+iuvuWumuaTjeS9nOWRmOWvhueggScsXHJcbiAgUElDQkVEX1VQWVVOX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9VUkw6ICforr7lrprliqDpgJ/ln5/lkI0nLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUFRJT05TOiAn6K6+5a6a572R5Z2A5ZCO57yAJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUEVSQVRPUjogJ+S+i+Wmgu+8mm1lJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRDogJ+i+k+WFpeaTjeS9nOWRmOWvhueggScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMOiAn5L6L5aaC77yaaHR0cDovL3h4eC50ZXN0LnVwY2RuLm5ldCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8miFpbWdzbGltJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG5cclxuICAvLyB3ZWJkYXZwbGlzdFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVDogJ1dlYkRBVicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0hPU1Q6ICforr7lrprmjqXlj6PnvZHlnYAnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEOiAn5ZCv55SoU1NMJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfVVNFUk5BTUU6ICforr7lrprnlKjmiLflkI0nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9QQVNTV09SRDogJ+iuvuWumuWvhueggScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9XRUJTSVRFX1BBVEg6ICforr7lrprnvZHlnYDot6/lvoQnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkw6ICforr7lrproh6rlrprkuYnln5/lkI0nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0hPU1Q6ICfkvovlpoLvvJpodHRwczovL2V4YW1wbGUuY29tL3dlYmRhdicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfU1NMRU5BQkxFRDogJ+mcgOimgUhUVFBT5pe25ZCv55SoJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9VU0VSTkFNRTogJ+S+i+Wmgu+8mm1lJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVNTV09SRDogJ+i+k+WFpeWvhueggScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEg6ICfmi7zmjqXnvZHlnYDml7bkvb/nlKgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICBCVUlMRElOX1dBVEVSTUFSS19JU0FERFdBVEVSTUFSSzogJ+aYr+WQpua3u+WKoOawtOWNsCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9JU0FERFdBVEVSTUFSSzogJ+mcgOimgea3u+WKoOawtOWNsOaXtuWQr+eUqCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVFlQRTogJ+iuvuWumuawtOWNsOexu+WeiycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktUWVBFOiAn6K+36YCJ5oup5rC05Y2w57G75Z6LJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19JU0ZVTExTQ1JFRU5XQVRFUk1BUks6ICfmmK/lkKblhajlsY/msLTljbAnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfSVNGVUxMU0NSRUVOV0FURVJNQVJLOiAn6ZyA6KaB5YWo5bGP5rC05Y2w5pe25ZCv55SoJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktERUdSRUU6ICforr7lrprmsLTljbDop5LluqYnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLREVHUkVFOiAn6K+36L6T5YWl5pWw5a2XJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhUOiAn6K6+5a6a5rC05Y2w5paH5a2XJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1RFWFQ6ICfor7fovpPlhaXmsLTljbDmloflrZcnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RFWFRGT05UUEFUSDogJ+iuvuWumuawtOWNsOWtl+S9k+aWh+S7tui3r+W+hCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UUEFUSDogJ+ivt+i+k+WFpeawtOWNsOWtl+S9k+aWh+S7tui3r+W+hCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLRk9OVFJBVElPOiAn6K6+5a6a5rC05Y2w55u45a+55LqO5Zu+54mH55qE5q+U5L6LJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRSQVRJTzogJ+ivt+i+k+WFpTAtMeeahOWwj+aVsCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLRk9OVENPTE9SOiAn6K6+5a6a5rC05Y2w5a2X5L2T6aKc6ImyJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRDT0xPUjogJ+ivt+i+k+WFpXJnYuminOiJsuWAvCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLSU1BR0VQQVRIOiAn6K6+5a6a5rC05Y2w5Zu+54mH6Lev5b6EJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0lNQUdFUEFUSDogJ+ivt+i+k+WFpeawtOWNsOWbvueJh+i3r+W+hCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLUE9TSVRJT046ICforr7lrprmsLTljbDkvY3nva4nLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLUE9TSVRJT046ICfor7fpgInmi6nmsLTljbDkvY3nva4nLFxyXG5cclxuICBCVUlMRElOX1JFTkFNRV9GT1JNQVQ6ICforr7lrprph43lkb3lkI3moLzlvI8nLFxyXG4gIEJVSUxESU5fUkVOQU1FX0VOQUJMRTogJ+aYr+WQpuWQr+eUqOmHjeWRveWQjScsXHJcblxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUVVBTElUWTogJ+iuvuWumuWbvueJh+i0qOmHjycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1FVQUxJVFk6ICfor7fovpPlhaUwLTEwMOeahOaVtOaVsCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU0NPTlZFUlQ6ICfmmK/lkKbov5vooYzmoLzlvI/ovazmjaInLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU0NPTlZFUlQ6ICfpnIDopoHovazmjaLml7blkK/nlKgnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfQ09OVkVSVEZPUk1BVDogJ+iuvuWumui9rOaNouagvOW8jycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0NPTlZFUlRGT1JNQVQ6ICfor7fpgInmi6novazmjaLmoLzlvI8nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkU6ICfmmK/lkKbov5vooYzlm77niYfnvKnmlL4nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JFU0laRTogJ+mcgOimgee8qeaUvuaXtuWQr+eUqCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19SRVNJWkVXSURUSDogJ+iuvuWumue8qeaUvuWuveW6picsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRVdJRFRIOiAn6K+36L6T5YWl5pWw5a2XJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1JFU0laRUhFSUdIVDogJ+iuvuWumue8qeaUvumrmOW6picsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRUhFSUdIVDogJ+ivt+i+k+WFpeaVsOWtlycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JFU0laRUJZUEVSQ0VOVDogJ+aYr+WQpuaMieeZvuWIhuavlOi/m+ihjOe8qeaUvicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVTSVpFQllQRVJDRU5UOiAn6ZyA6KaB5oyJ55m+5YiG5q+U57yp5pS+5pe25ZCv55SoJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1JFU0laRVBFUkNFTlQ6ICforr7lrprnvKnmlL7nmb7liIbmr5QnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVQRVJDRU5UOiAn6K+36L6T5YWl5pWw5a2XJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTUk9UQVRFOiAn5piv5ZCm6L+b6KGM5Zu+54mH5peL6L2sJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNST1RBVEU6ICfpnIDopoHml4vovazml7blkK/nlKgnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUk9UQVRFREVHUkVFOiAn6K6+5a6a5peL6L2s6KeS5bqmJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUk9UQVRFREVHUkVFOiAn6K+36L6T5YWl5pWw5a2X77yM5Y+v5Li66LSf5pWwJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTUkVNT1ZFRVhJRjogJ+aYr+WQpuenu+mZpEVYSUbkv6Hmga8nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JFTU9WRUVYSUY6ICfpnIDopoHnp7vpmaRFWElG5L+h5oGv5pe25ZCv55SoJyxcclxuXHJcbiAgLy8gUGx1Z2luIEhhbmRsZXJcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTOiAn5o+S5Lu25a6J6KOF5oiQ5YqfJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQ6ICfmj5Lku7blronoo4XlpLHotKUnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT046ICfmj5Lku7blronoo4XlpLHotKXvvIzlpLHotKXnoIHkuLoke2NvZGV977yM6ZSZ6K+v5pel5b+X5Li6IFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUEFUSDogJ+aPkuS7tuWuieijheWksei0pe+8jOivt+i+k+WFpeWQiOazleaPkuS7tuWQjeaIluWQiOazleWuieijhei3r+W+hCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTOiAn5o+S5Lu25Y246L295oiQ5YqfJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRDogJ+aPkuS7tuWNuOi9veWksei0pScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfUkVBU09OOiAn5o+S5Lu25Y246L295aSx6LSl77yM5aSx6LSl56CB5Li6JHtjb2Rlfe+8jOmUmeivr+aXpeW/l+S4uiBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQ6ICfmj5Lku7bljbjovb3lpLHotKXvvIzor7fovpPlhaXlkIjms5Xmj5Lku7blkI0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUzogJ+aPkuS7tuabtOaWsOaIkOWKnycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQ6ICfmj5Lku7bmm7TmlrDlpLHotKUnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1JFQVNPTjogJ+aPkuS7tuabtOaWsOWksei0pe+8jOWksei0peeggeS4uiR7Y29kZX3vvIzplJnor6/ml6Xlv5fkuLogXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEOiAn5o+S5Lu25pu05paw5aSx6LSl77yM6K+36L6T5YWl5ZCI5rOV5o+S5Lu25ZCNJ1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJTG9jYWxlc0tleSA9IGtleW9mIHR5cGVvZiBaSF9DTlxyXG5leHBvcnQgdHlwZSBJTG9jYWxlcyA9IHR5cGVvZiBaSF9DTlxyXG4iLCJpbXBvcnQgeyBJTG9jYWxlcyB9IGZyb20gJy4vemgtQ04nXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcgKi9cclxuZXhwb3J0IGNvbnN0IFpIX1RXOiBJTG9jYWxlcyA9IHtcclxuICBVUExPQURfRkFJTEVEOiAn5LiK5YKz5aSx5pWXJyxcclxuICBDSEVDS19TRVRUSU5HUzogJ+iri+aqouafpeS9oOeahOioreWumuaYr+WQpuato+eiuicsXHJcbiAgQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUks6ICfoq4vmqqLmn6XkvaDnmoToqK3lrprlj4rntrLot68nLFxyXG4gIFVQTE9BRF9GQUlMRURfUkVBU09OOiAn6Yyv6Kqk56K877yaJHtjb2Rlfe+8jOiri+aJk+mWi+eAj+imveWZqOiyvOS4iuWcsOWdgOafpeeci+ebuOmXnOWOn+WboCcsXHJcbiAgU0VSVkVSX0VSUk9SOiAn5Ly65pyN5Zmo5Ye66Yyv77yM6KuL6YeN6KmmJyxcclxuICBBVVRIX0ZBSUxFRDogJ+iqjeitieWkseaVlycsXHJcblxyXG4gIC8vIHNtbXNcclxuICBQSUNCRURfU01NUzogJ1NNLk1TJyxcclxuICBQSUNCRURfU01NU19UT0tFTjogJ+ioreWumlRva2VuJyxcclxuICBQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOOiAn5YKZ55So5LiK5YKz57ay5Z2AJyxcclxuICBQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU46ICfkvovlpoIgc21tcy5hcHAnLFxyXG5cclxuICAvLyBBbGktY2xvdWRcclxuICBQSUNCRURfQUxJQ0xPVUQ6ICfpmL/ph4zkupFPU1MnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRDogJ+ioreWumktleUlkJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUOiAn6Kit5a6aS2V5U2VjcmV0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQlVDS0VUOiAn6Kit5a6aQnVja2V0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQVJFQTogJ+ioreWumuWEsuWtmOWNgOWfnycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkw6ICfoqK3lrproh6roqILntrLlnYAnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9PUFRJT05TOiAn6Kit5a6a57ay5Z2A5b6M57a0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yab3NzLWNuLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj94LW9zcy1wcm9jZXNzPXh4eCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIFRlbmNlbnQtY2xvdWRcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEOiAn6aiw6KiK5LqRQ09TJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1ZFUlNJT046ICdDT1PniYjmnKwnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQ6ICfoqK3lrppTZWNyZXRJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRLRVk6ICfoqK3lrppTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQ6ICfoqK3lrppBcHBJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVQ6ICfoqK3lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQTogJ+ioreWumuWEsuWtmOWNgOWfnycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlM6ICfoqK3lrprntrLlnYDlvozntrQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQ1VTVE9NVVJMOiAn6Kit5a6a6Ieq6KiC57ay5Z2AJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQ6ICfkvovlpoLvvJoxMjM0NTY3ODkwJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mmFwLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj9pbWFnZU1vZ3IyJyxcclxuXHJcbiAgLy8gR2l0SHViXHJcbiAgUElDQkVEX0dJVEhVQjogJ0dpdEh1YicsXHJcbiAgUElDQkVEX0dJVEhVQl9UT0tFTjogJ+ioreWumlRva2VuJyxcclxuICBQSUNCRURfR0lUSFVCX1JFUE86ICfoqK3lrprlgInluqvlkI3nqLEnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX0dJVEhVQl9CUkFOQ0g6ICfoqK3lrprliIbmlK/lkI3nqLEnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMOiAn6Kit5a6a6Ieq6KiC57ay5Z2AJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTzogJ+agvOW8j++8mnVzZXJuYW1lL3JlcG8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0g6ICfkvovlpoLvvJptYWluJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIHFpbml1XHJcbiAgUElDQkVEX1FJTklVOiAn5LiD54mb5LqRJyxcclxuICBQSUNCRURfUUlOSVVfQUNDRVNTS0VZOiAn6Kit5a6aQWNjZXNzS2V5JyxcclxuICBQSUNCRURfUUlOSVVfU0VDUkVUS0VZOiAn6Kit5a6aU2VjcmV0S2V5JyxcclxuICBQSUNCRURfUUlOSVVfQlVDS0VUOiAn6Kit5a6aQnVja2V0JyxcclxuICBQSUNCRURfUUlOSVVfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX1FJTklVX1VSTDogJ+ioreWumuioquWVj+e2suWdgCcsXHJcbiAgUElDQkVEX1FJTklVX09QVElPTlM6ICfoqK3lrprntrLlnYDlvozntrQnLFxyXG4gIFBJQ0JFRF9RSU5JVV9BUkVBOiAn6Kit5a6a5YSy5a2Y5Y2A5Z+fJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJp6MCcsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj9pbWFnZXNsaW0nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTDogJ+S+i+Wmgu+8mmh0dHBzOi8veHh4Lnl5eS5nbGIuY2xvdWRkbi5jb20nLFxyXG5cclxuICAvLyBpbWd1clxyXG4gIFBJQ0JFRF9JTUdVUjogJ0ltZ3VyJyxcclxuICBQSUNCRURfSU1HVVJfQ0xJRU5USUQ6ICfoqK3lrppDbGllbnRJZCcsXHJcbiAgUElDQkVEX0lNR1VSX1VTRVJOQU1FOiAn6Kit5a6a55So5oi25ZCNJyxcclxuICBQSUNCRURfSU1HVVJfQUNDRVNTX1RPS0VOOiAn6Kit5a6aYWNjZXNzVG9rZW4nLFxyXG4gIFBJQ0JFRF9JTUdVUl9BTEJVTTogJ+ioreWumuebuOewv+WQjScsXHJcbiAgUElDQkVEX0lNR1VSX1BST1hZOiAn6Kit5a6aUFJPWFknLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX0NMSUVOVElEOiAn5Yy/5ZCN5LiK5YKz5pmC5aGr5a+rJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9VU0VSTkFNRTogJ+mcgOimgeS4iuWCs+WIsOizrOaItuaZguWhq+WvqycsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfQUNDRVNTX1RPS0VOOiAn6ZyA6KaB5LiK5YKz5Yiw6LOs5oi25pmC5aGr5a+rJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9BTEJVTTogJ+S+i+Wmgu+8mnRlc3QnLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZOiAn5L6L5aaC77yaaHR0cDovLzEyNy4wLjAuMToxMDgwJyxcclxuXHJcbiAgLy8gdXB5dW5cclxuICBQSUNCRURfVVBZVU46ICflj4jmi43kupEnLFxyXG4gIFBJQ0JFRF9VUFlVTl9CVUNLRVQ6ICfoqK3lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUEVSQVRPUjogJ+ioreWumuaTjeS9nOWToScsXHJcbiAgUElDQkVEX1VQWVVOX1BBU1NXT1JEOiAn6Kit5a6a5pON5L2c5ZOh5a+G56K8JyxcclxuICBQSUNCRURfVVBZVU5fUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX1VQWVVOX1VSTDogJ+ioreWumuWKoOmAn+e2suWdgCcsXHJcbiAgUElDQkVEX1VQWVVOX09QVElPTlM6ICfoqK3lrprntrLlnYDlvozntrQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SOiAn5L6L5aaC77yabWUnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEOiAn6Ly45YWl5pON5L2c5ZOh5a+G56K8JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkw6ICfkvovlpoLvvJpodHRwOi8veHh4LnRlc3QudXBjZG4ubmV0JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaIWltZ3NsaW0nLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcblxyXG4gIC8vIHdlYmRhdlxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVDogJ1dlYkRBVicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0hPU1Q6ICfoqK3lrppBUEnkuLvmqZ8nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEOiAn6ZyA6KaBSFRUUFPmmYLllZ/nlKgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9VU0VSTkFNRTogJ+ioreWumueUqOaItuWQjScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1BBU1NXT1JEOiAn6Kit5a6a5a+G56K8JyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTDogJ+ioreWumuiHquiogue2suWdgCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1dFQlNJVEVfUEFUSDogJ+ioreWumue2suermei3r+W+kScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfSE9TVDogJ+S+i+Wmgu+8mmh0dHBzOi8vZXhhbXBsZS5jb20vd2ViZGF2JyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9TU0xFTkFCTEVEOiAn6ZyA6KaBSFRUUFPmmYLllZ/nlKgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1VTRVJOQU1FOiAn5L6L5aaC77yabWUnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBU1NXT1JEOiAn6Ly45YWl55So5oi25a+G56K8JyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1dFQlNJVEVfUEFUSDogJ+aLvOaOpee2suWdgOaZguS9v+eUqCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIEJVSUxESU5fV0FURVJNQVJLX0lTQUREV0FURVJNQVJLOiAn5piv5ZCm5re75Yqg5rC05Y2wJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX0lTQUREV0FURVJNQVJLOiAn6ZyA6KaB5re75Yqg5rC05Y2w5pmC5ZWf55SoJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktUWVBFOiAn6Kit5a6a5rC05Y2w6aGe5Z6LJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1RZUEU6ICfoq4vpgbjmk4fmsLTljbDpoZ7lnosnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX0lTRlVMTFNDUkVFTldBVEVSTUFSSzogJ+aYr+WQpuWFqOWxj+awtOWNsCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9JU0ZVTExTQ1JFRU5XQVRFUk1BUks6ICfpnIDopoHlhajlsY/msLTljbDmmYLllZ/nlKgnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0RFR1JFRTogJ+ioreWumuawtOWNsOinkuW6picsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktERUdSRUU6ICfoq4vovLjlhaXmlbjlrZcnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RFWFQ6ICfoqK3lrprmsLTljbDmloflrZcnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLVEVYVDogJ+iri+i8uOWFpeawtOWNsOaWh+WtlycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVEVYVEZPTlRQQVRIOiAn6Kit5a6a5rC05Y2w5a2X6auUJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRQQVRIOiAn6KuL6Ly45YWl5rC05Y2w5a2X6auU5paH5Lu26Lev5b6RJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktGT05UUkFUSU86ICfoqK3lrprmsLTljbDlnJbniYfmr5TkvosnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVFJBVElPOiAn6KuL6Ly45YWlMC0x55qE5pW45a2XJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktGT05UQ09MT1I6ICfoqK3lrprmsLTljbDlrZfpq5TpoY/oibInLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVENPTE9SOiAn6KuL6Ly45YWlcmdi6aGP6Imy5YC8JyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktJTUFHRVBBVEg6ICfoqK3lrprmsLTljbDlnJbniYfot6/lvpEnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLSU1BR0VQQVRIOiAn6KuL6Ly45YWl5rC05Y2w5ZyW54mH6Lev5b6RJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktQT1NJVElPTjogJ+ioreWumuawtOWNsOS9jee9ricsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktQT1NJVElPTjogJ+iri+mBuOaTh+awtOWNsOS9jee9ricsXHJcblxyXG4gIEJVSUxESU5fUkVOQU1FX0ZPUk1BVDogJ+ioreWumumHjeWRveWQjeagvOW8jycsXHJcbiAgQlVJTERJTl9SRU5BTUVfRU5BQkxFOiAn5piv5ZCm5ZWf55So6YeN5ZG95ZCNJyxcclxuXHJcbiAgQlVJTERJTl9DT01QUkVTU19RVUFMSVRZOiAn6Kit5a6a5ZyW54mH6LOq6YePJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUVVBTElUWTogJ+iri+i8uOWFpTAtMTAw55qE5pW05pW4JyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTQ09OVkVSVDogJ+aYr+WQpumAsuihjOagvOW8j+i9ieaPmycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTQ09OVkVSVDogJ+mcgOimgei9ieaPm+aZguWVn+eUqCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19DT05WRVJURk9STUFUOiAn6Kit5a6a6L2J5o+b5qC85byPJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfQ09OVkVSVEZPUk1BVDogJ+iri+mBuOaTh+i9ieaPm+agvOW8jycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JFU0laRTogJ+aYr+WQpumAsuihjOWclueJh+e4ruaUvicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVTSVpFOiAn6ZyA6KaB57iu5pS+5pmC5ZWf55SoJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1JFU0laRVdJRFRIOiAn6Kit5a6a57iu5pS+5a+s5bqmJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFV0lEVEg6ICfoq4vovLjlhaXmlbjlrZcnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUkVTSVpFSEVJR0hUOiAn6Kit5a6a57iu5pS+6auY5bqmJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFSEVJR0hUOiAn6KuL6Ly45YWl5pW45a2XJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTUkVTSVpFQllQRVJDRU5UOiAn5piv5ZCm5oyJ55m+5YiG5q+U6YCy6KGM57iu5pS+JyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRVNJWkVCWVBFUkNFTlQ6ICfpnIDopoHmjInnmb7liIbmr5TnuK7mlL7mmYLllZ/nlKgnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUkVTSVpFUEVSQ0VOVDogJ+ioreWumue4ruaUvueZvuWIhuavlCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRVBFUkNFTlQ6ICfoq4vovLjlhaXmlbDlrZcnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNST1RBVEU6ICfmmK/lkKbpgLLooYzlnJbniYfml4vovYknLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JPVEFURTogJ+mcgOimgeaXi+i9ieaZguWVn+eUqCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19ST1RBVEVERUdSRUU6ICfoqK3lrprml4vovYnop5LluqYnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9ST1RBVEVERUdSRUU6ICfoq4vovLjlhaXmlbjlrZfvvIzlj6/ngrrosqDmlbgnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNSRU1PVkVFWElGOiAn5piv5ZCm56e76ZmkRVhJRuizh+ioiicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVNT1ZFRVhJRjogJ+mcgOimgeenu+mZpEVYSUbos4foqIrmmYLllZ/nlKgnLFxyXG5cclxuICAvLyBQbHVnaW4gSGFuZGxlclxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1M6ICfmj5Lku7blronoo53miJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRDogJ+aPkuS7tuWuieijneWkseaVlycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTjogJ+aPkuS7tuWuieijneWkseaVl++8jOWkseaVl+eivOeCuiR7Y29kZX3vvIzpjK/oqqTntIDpjITngrogXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9QQVRIOiAn5o+S5Lu25a6J6KOd5aSx5pWX77yM6KuL6Ly45YWl5q2j56K655qE5o+S5Lu25ZCN56ix5oiW5q2j56K655qE5a6J6KOd6Lev5b6RJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1M6ICfmj5Lku7bljbjovInmiJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEOiAn5o+S5Lu25Y246LyJ5aSx5pWXJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT046ICfmj5Lku7bljbjovInlpLHmlZfvvIzlpLHmlZfnorzngroke2NvZGV977yM6Yyv6Kqk57SA6YyE54K6IFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRDogJ+aPkuS7tuWNuOi8ieWkseaVl++8jOiri+i8uOWFpeato+eiuueahOaPkuS7tuWQjeeosScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTOiAn5o+S5Lu25pu05paw5oiQ5YqfJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRDogJ+aPkuS7tuabtOaWsOWkseaVlycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OOiAn5o+S5Lu25pu05paw5aSx5pWX77yM5aSx5pWX56K854K6JHtjb2Rlfe+8jOmMr+iqpOe0gOmMhOeCuiBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQ6ICfmj5Lku7bmm7TmlrDlpLHmlZfvvIzoq4vovLjlhaXmraPnorrnmoTmj5Lku7blkI3nqLEnXHJcbn1cclxuIiwiaW1wb3J0IHsgSUxvY2FsZXMgfSBmcm9tICcuL3poLUNOJ1xyXG5cclxuLyogZXNsaW50LWRpc2FibGUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nICovXHJcbmV4cG9ydCBjb25zdCBFTjogSUxvY2FsZXMgPSB7XHJcbiAgVVBMT0FEX0ZBSUxFRDogJ1VwbG9hZCBmYWlsZWQnLFxyXG4gIENIRUNLX1NFVFRJTkdTOiAnUGxlYXNlIGNoZWNrIHlvdXIgc2V0dGluZ3MnLFxyXG4gIENIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLOiAnUGxlYXNlIGNoZWNrIHlvdXIgc2V0dGluZ3MgYW5kIG5ldHdvcmsnLFxyXG4gIFVQTE9BRF9GQUlMRURfUkVBU09OOiAnRXJyb3IgY29kZTogJHtjb2RlfSwgcGxlYXNlIG9wZW4gdGhlIGJyb3dzZXIgYW5kIHBhc3RlIHRoZSBhZGRyZXNzIHRvIHNlZSB0aGUgcmVhc29uJyxcclxuICBTRVJWRVJfRVJST1I6ICdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXInLFxyXG4gIEFVVEhfRkFJTEVEOiAnQXV0aGVudGljYXRpb24gZmFpbGVkJyxcclxuXHJcbiAgLy8gc21tc1xyXG4gIFBJQ0JFRF9TTU1TOiAnU00uTVMnLFxyXG4gIFBJQ0JFRF9TTU1TX1RPS0VOOiAnU2V0IFRva2VuJyxcclxuICBQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOOiAnU2V0IEJhY2t1cCBVcGxvYWQgRG9tYWluJyxcclxuICBQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU46ICdFeC4gc21tcy5hcHAnLFxyXG5cclxuICAvLyBBbGktY2xvdWRcclxuICBQSUNCRURfQUxJQ0xPVUQ6ICdBbGkgQ2xvdWQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRDogJ1NldCBLZXlJZCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVDogJ1NldCBLZXlTZWNyZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQVJFQTogJ1NldCBBcmVhJyxcclxuICBQSUNCRURfQUxJQ0xPVURfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMOiAnU2V0IEN1c3RvbSBVUkwnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9PUFRJT05TOiAnU2V0IFVSTCBTdWZmaXgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUE6ICdFeC4gb3NzLWNuLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlM6ICdFeC4gP3gtb3NzLXByb2Nlc3M9eHh4JyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIFRlbmNlbnQtY2xvdWRcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEOiAnVGVuY2VudCBDbG91ZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OOiAnQ2hvb3NlIENPUyB2ZXJzaW9uJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEOiAnU2V0IFNlY3JldElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogJ1NldCBTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQ6ICdTZXQgQXBwSWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUOiAnU2V0IEJ1Y2tldCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiAnU2V0IEFyZWEnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlM6ICdTZXQgVVJMIFN1ZmZpeCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6ICdTZXQgQ3VzdG9tIFVSTCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEOiAnRXguIDEyMzQ1Njc4OTAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiAnRXguIGFwLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAnRXguIGh0dHA6Ly90ZXN0LmNvbScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlM6ICdFeC4gP2ltYWdlTW9ncjInLFxyXG5cclxuICAvLyBHaXRIdWJcclxuICBQSUNCRURfR0lUSFVCOiAnR2l0SHViJyxcclxuICBQSUNCRURfR0lUSFVCX1RPS0VOOiAnU2V0IFRva2VuJyxcclxuICBQSUNCRURfR0lUSFVCX1JFUE86ICdTZXQgUmVwbyBOYW1lJyxcclxuICBQSUNCRURfR0lUSFVCX1BBVEg6ICdTZXQgUGF0aCcsXHJcbiAgUElDQkVEX0dJVEhVQl9CUkFOQ0g6ICdTZXQgQnJhbmNoJyxcclxuICBQSUNCRURfR0lUSFVCX0NVU1RPTVVSTDogJ1NldCBDdXN0b20gVVJMJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTzogJ0V4LiB1c2VybmFtZS9yZXBvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIOiAnRXguIG1haW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMOiAnRXguIGh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBxaW5pdVxyXG4gIFBJQ0JFRF9RSU5JVTogJ1Fpbml1JyxcclxuICBQSUNCRURfUUlOSVVfQUNDRVNTS0VZOiAnU2V0IEFjY2Vzc0tleScsXHJcbiAgUElDQkVEX1FJTklVX1NFQ1JFVEtFWTogJ1NldCBTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9RSU5JVV9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfUUlOSVVfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfUUlOSVVfVVJMOiAnU2V0IFVSTCcsXHJcbiAgUElDQkVEX1FJTklVX09QVElPTlM6ICdTZXQgVVJMIFN1ZmZpeCcsXHJcbiAgUElDQkVEX1FJTklVX0FSRUE6ICdTZXQgQXJlYScsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSDogJ0V4LiB0ZXN0LycsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQTogJ0V4LiB6MCcsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUzogJ0V4LiA/aW1hZ2VzbGltJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9VUkw6ICdFeC4gaHR0cHM6Ly94eHgueXl5LmdsYi5jbG91ZGRuLmNvbScsXHJcblxyXG4gIC8vIGltZ3VyXHJcbiAgUElDQkVEX0lNR1VSOiAnSW1ndXInLFxyXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogJ1NldCBDbGllbnRJZCcsXHJcbiAgUElDQkVEX0lNR1VSX1VTRVJOQU1FOiAnU2V0IFVzZXJuYW1lJyxcclxuICBQSUNCRURfSU1HVVJfQUNDRVNTX1RPS0VOOiAnU2V0IEFjY2VzcyBUb2tlbicsXHJcbiAgUElDQkVEX0lNR1VSX0FMQlVNOiAnU2V0IEFsYnVtIE5hbWUnLFxyXG4gIFBJQ0JFRF9JTUdVUl9QUk9YWTogJ1NldCBQcm94eScsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfQ0xJRU5USUQ6ICdGaWxsIGluIHdoZW4geW91IG5lZWQgdG8gdXBsb2FkIGFzIGFub255bW91cycsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfVVNFUk5BTUU6ICdGaWxsIGluIHdoZW4geW91IG5lZWQgdG8gdXBsb2FkIHRvIHRoZSBhY2NvdW50JyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9BQ0NFU1NfVE9LRU46ICdGaWxsIGluIHdoZW4geW91IG5lZWQgdG8gdXBsb2FkIHRvIHRoZSBhY2NvdW50JyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9BTEJVTTogJ+S+i+Wmgu+8mnRlc3QnLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZOiAnRXguIGh0dHA6Ly8xMjcuMC4wLjE6MTA4MCcsXHJcblxyXG4gIC8vIHVweXVuXHJcbiAgUElDQkVEX1VQWVVOOiAnVXB5dW4nLFxyXG4gIFBJQ0JFRF9VUFlVTl9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfVVBZVU5fT1BFUkFUT1I6ICdTZXQgT3BlcmF0b3InLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVNTV09SRDogJ1NldCBPcGVyYXRvciBQYXNzd29yZCcsXHJcbiAgUElDQkVEX1VQWVVOX1BBVEg6ICdTZXQgUGF0aCcsXHJcbiAgUElDQkVEX1VQWVVOX1VSTDogJ1NldCBVUkwnLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUFRJT05TOiAnU2V0IFVSTCBTdWZmaXgnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SOiAnRXguIG1lJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRDogJ1BsZWFzZSB0eXBlIHRoZSBvcGVyYXRvciBwYXNzd29yZCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMOiAnRXguIGh0dHA6Ly94eHgudGVzdC51cGNkbi5uZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlM6ICdFeC4gIWltZ3NsaW0nLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG5cclxuICAvLyB3ZWJkYXZcclxuICBQSUNCRURfV0VCREFWUExJU1Q6ICdXZWJEQVYnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9IT1NUOiAnU2V0IEhvc3QnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEOiAnRW5hYmxlIEhUVFBTJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfVVNFUk5BTUU6ICdTZXQgVXNlcm5hbWUnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9QQVNTV09SRDogJ1NldCBQYXNzd29yZCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1BBVEg6ICdTZXQgUGF0aCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1dFQlNJVEVfUEFUSDogJ1NldCBXZWJzaXRlIFBhdGgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkw6ICdTZXQgQ3VzdG9tIFVSTCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfSE9TVDogJ0V4LiBodHRwczovL2V4YW1wbGUuY29tL3dlYmRhdicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfU1NMRU5BQkxFRDogJ0VuYWJsZSBIVFRQUycsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfVVNFUk5BTUU6ICdFeC4gbWUnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBU1NXT1JEOiAnUGxlYXNlIHR5cGUgdGhlIHBhc3N3b3JkJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEg6ICdVc2VkIHRvIGdlbmVyYXRlIHRoZSBVUkwgb2YgdGhlIGltYWdlJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIEJVSUxESU5fUkVOQU1FX0ZPUk1BVDogJ1NldCByZW5hbWUgZm9ybWF0JyxcclxuICBCVUlMRElOX1JFTkFNRV9FTkFCTEU6ICdFbmFibGUgcmVuYW1lJyxcclxuXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfSVNBRERXQVRFUk1BUks6ICdXaGV0aGVyIHRvIGFkZCB3YXRlcm1hcmsnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfSVNBRERXQVRFUk1BUks6ICdFbmFibGUgd2hlbiB3YXRlcm1hcmsgaXMgcmVxdWlyZWQnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RZUEU6ICdTZXQgd2F0ZXJtYXJrIHR5cGUnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLVFlQRTogJ1BsZWFzZSBzZWxlY3Qgd2F0ZXJtYXJrIHR5cGUnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX0lTRlVMTFNDUkVFTldBVEVSTUFSSzogJ1doZXRoZXIgdG8gdXNlIGZ1bGwtc2NyZWVuIHdhdGVybWFyaycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9JU0ZVTExTQ1JFRU5XQVRFUk1BUks6ICdFbmFibGUgd2hlbiBmdWxsLXNjcmVlbiB3YXRlcm1hcmsgaXMgcmVxdWlyZWQnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0RFR1JFRTogJ1NldCB3YXRlcm1hcmsgYW5nbGUnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLREVHUkVFOiAnUGxlYXNlIGVudGVyIGEgbnVtYmVyJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhUOiAnU2V0IHdhdGVybWFyayB0ZXh0JyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1RFWFQ6ICdQbGVhc2UgZW50ZXIgd2F0ZXJtYXJrIHRleHQnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RFWFRGT05UUEFUSDogJ1NldCB3YXRlcm1hcmsgZm9udCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UUEFUSDogJ1BsZWFzZSBlbnRlciB0aGUgd2F0ZXJtYXJrIGZvbnQgZmlsZSBwYXRoJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktGT05UUkFUSU86ICdTZXQgdGhlIHJhdGlvIG9mIHRoZSB3YXRlcm1hcmsgdG8gdGhlIGltYWdlJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRSQVRJTzogJ1BsZWFzZSBlbnRlciBhIG51bWJlciBiZXR3ZWVuIDAtMScsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLRk9OVENPTE9SOiAnU2V0IHdhdGVybWFyayBmb250IGNvbG9yJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRDT0xPUjogJ1BsZWFzZSBlbnRlciB0aGUgUkdCIGNvbG9yIHZhbHVlJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktJTUFHRVBBVEg6ICdTZXQgd2F0ZXJtYXJrIGltYWdlIHBhdGgnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLSU1BR0VQQVRIOiAnUGxlYXNlIGVudGVyIHRoZSB3YXRlcm1hcmsgaW1hZ2UgcGF0aCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLUE9TSVRJT046ICdTZXQgd2F0ZXJtYXJrIHBvc2l0aW9uJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1BPU0lUSU9OOiAnUGxlYXNlIHNlbGVjdCB3YXRlcm1hcmsgcG9zaXRpb24nLFxyXG5cclxuICBCVUlMRElOX0NPTVBSRVNTX1FVQUxJVFk6ICdTZXQgaW1hZ2UgcXVhbGl0eScsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1FVQUxJVFk6ICdQbGVhc2UgZW50ZXIgYW4gaW50ZWdlciBiZXR3ZWVuIDAtMTAwJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTQ09OVkVSVDogJ1doZXRoZXIgdG8gcGVyZm9ybSBmb3JtYXQgY29udmVyc2lvbicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTQ09OVkVSVDogJ0VuYWJsZSB3aGVuIGZvcm1hdCBjb252ZXJzaW9uIGlzIHJlcXVpcmVkJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0NPTlZFUlRGT1JNQVQ6ICdTZXQgY29udmVyc2lvbiBmb3JtYXQnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9DT05WRVJURk9STUFUOiAnUGxlYXNlIHNlbGVjdCBjb252ZXJzaW9uIGZvcm1hdCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JFU0laRTogJ1doZXRoZXIgdG8gcmVzaXplIHRoZSBpbWFnZScsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVTSVpFOiAnRW5hYmxlIHdoZW4gaW1hZ2UgcmVzaXppbmcgaXMgcmVxdWlyZWQnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUkVTSVpFV0lEVEg6ICdTZXQgcmVzaXppbmcgd2lkdGgnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVXSURUSDogJ1BsZWFzZSBlbnRlciBhIG51bWJlcicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19SRVNJWkVIRUlHSFQ6ICdTZXQgcmVzaXppbmcgaGVpZ2h0JyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFSEVJR0hUOiAnUGxlYXNlIGVudGVyIGEgbnVtYmVyJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTUkVTSVpFQllQRVJDRU5UOiAnV2hldGhlciB0byByZXNpemUgdGhlIGltYWdlIGJ5IHBlcmNlbnRhZ2UnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JFU0laRUJZUEVSQ0VOVDogJ0VuYWJsZSB3aGVuIHJlc2l6aW5nIGJ5IHBlcmNlbnRhZ2UgaXMgcmVxdWlyZWQnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUkVTSVpFUEVSQ0VOVDogJ1NldCByZXNpemluZyBwZXJjZW50YWdlJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFUEVSQ0VOVDogJ1BsZWFzZSBlbnRlciBhIG51bWJlcicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JPVEFURTogJ1doZXRoZXIgdG8gcm90YXRlIHRoZSBpbWFnZScsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUk9UQVRFOiAnRW5hYmxlIHdoZW4gaW1hZ2Ugcm90YXRpb24gaXMgcmVxdWlyZWQnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUk9UQVRFREVHUkVFOiAnU2V0IHJvdGF0aW9uIGFuZ2xlJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUk9UQVRFREVHUkVFOiAnUGxlYXNlIGVudGVyIGEgbnVtYmVyLCBjYW4gYmUgbmVnYXRpdmUnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNSRU1PVkVFWElGOiAnV2hldGhlciB0byByZW1vdmUgRVhJRiBpbmZvcm1hdGlvbicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVNT1ZFRVhJRjogJ0VuYWJsZSB3aGVuIHJlbW92aW5nIEVYSUYgaW5mb3JtYXRpb24gaXMgcmVxdWlyZWQnLFxyXG4gIC8vIFBsdWdpbiBIYW5kbGVyXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUzogJ1BsdWdpbiBpbnN0YWxsZWQgc3VjY2Vzc2Z1bGx5JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQ6ICdQbHVnaW4gaW5zdGFsbGF0aW9uIGZhaWxlZCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTjogJ1BsdWdpbiBpbnN0YWxsYXRpb24gZmFpbGVkLCBlcnJvciBjb2RlIGlzICR7Y29kZX0sIGVycm9yIGxvZyBpcyBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1BBVEg6ICdQbHVnaW4gaW5zdGFsbGF0aW9uIGZhaWxlZCwgcGxlYXNlIGVudGVyIGEgdmFsaWQgcGx1Z2luIG5hbWUgb3IgdmFsaWQgaW5zdGFsbGF0aW9uIHBhdGgnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTUzogJ1BsdWdpbiB1bmluc3RhbGxlZCBzdWNjZXNzZnVsbHknLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEOiAnUGx1Z2luIHVuaW5zdGFsbCBmYWlsZWQnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1JFQVNPTjogJ1BsdWdpbiB1bmluc3RhbGwgZmFpbGVkLCBlcnJvciBjb2RlIGlzICR7Y29kZX0sIGVycm9yIGxvZyBpcyBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQ6ICdQbHVnaW4gdW5pbnN0YWxsIGZhaWxlZCwgcGxlYXNlIGVudGVyIGEgdmFsaWQgcGx1Z2luIG5hbWUnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUzogJ1BsdWdpbiB1cGRhdGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQ6ICdQbHVnaW4gdXBkYXRlIGZhaWxlZCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OOiAnUGx1Z2luIHVwZGF0ZSBmYWlsZWQsIGVycm9yIGNvZGUgaXMgJHtjb2RlfSwgZXJyb3IgbG9nIGlzIFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRDogJ1BsdWdpbiB1cGRhdGUgZmFpbGVkLCBwbGVhc2UgZW50ZXIgYSB2YWxpZCBwbHVnaW4gbmFtZSdcclxufVxyXG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cydcclxuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJ1xyXG5pbXBvcnQgQ29tbWFuZGVyIGZyb20gJy4uL2xpYi9Db21tYW5kZXInXHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2xpYi9Mb2dnZXInXHJcbmltcG9ydCBMaWZlY3ljbGUgZnJvbSAnLi9MaWZlY3ljbGUnXHJcbmltcG9ydCBMaWZlY3ljbGVQbHVnaW5zLCB7IHNldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSAnLi4vbGliL0xpZmVjeWNsZVBsdWdpbnMnXHJcbmltcG9ydCB1cGxvYWRlcnMgZnJvbSAnLi4vcGx1Z2lucy91cGxvYWRlcidcclxuaW1wb3J0IHRyYW5zZm9ybWVycyBmcm9tICcuLi9wbHVnaW5zL3RyYW5zZm9ybWVyJ1xyXG5pbXBvcnQgUGx1Z2luTG9hZGVyIGZyb20gJy4uL2xpYi9QbHVnaW5Mb2FkZXInXHJcbmltcG9ydCB7IGdldCwgc2V0LCB1bnNldCB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgSUhlbHBlciwgSUltZ0luZm8sIElDb25maWcsIElQaWNHbywgSVN0cmluZ0tleU1hcCwgSVBsdWdpbkxvYWRlciwgSUkxOG5NYW5hZ2VyLCBJUGljR29QbHVnaW4sIElQaWNHb1BsdWdpbkludGVyZmFjZSwgSVJlcXVlc3QgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IGdldENsaXBib2FyZEltYWdlIGZyb20gJy4uL3V0aWxzL2dldENsaXBib2FyZEltYWdlJ1xyXG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi9saWIvUmVxdWVzdCdcclxuaW1wb3J0IERCIGZyb20gJy4uL3V0aWxzL2RiJ1xyXG5pbXBvcnQgUGx1Z2luSGFuZGxlciBmcm9tICcuLi9saWIvUGx1Z2luSGFuZGxlcidcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCwgSUJ1c0V2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgZXZlbnRCdXMgfSBmcm9tICcuLi91dGlscy9ldmVudEJ1cydcclxuaW1wb3J0IHsgaXNDb25maWdLZXlJbkJsYWNrTGlzdCwgaXNJbnB1dENvbmZpZ1ZhbGlkIH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgeyBJMThuTWFuYWdlciB9IGZyb20gJy4uL2kxOG4nXHJcblxyXG5leHBvcnQgY2xhc3MgUGljR28gZXh0ZW5kcyBFdmVudEVtaXR0ZXIgaW1wbGVtZW50cyBJUGljR28ge1xyXG4gIHByaXZhdGUgX2NvbmZpZyE6IElDb25maWdcclxuICBwcml2YXRlIGxpZmVjeWNsZSE6IExpZmVjeWNsZVxyXG4gIHByaXZhdGUgZGIhOiBEQlxyXG4gIHByaXZhdGUgX3BsdWdpbkxvYWRlciE6IFBsdWdpbkxvYWRlclxyXG4gIGNvbmZpZ1BhdGg6IHN0cmluZ1xyXG4gIGJhc2VEaXIhOiBzdHJpbmdcclxuICBoZWxwZXIhOiBJSGVscGVyXHJcbiAgbG9nOiBMb2dnZXJcclxuICBjbWQ6IENvbW1hbmRlclxyXG4gIG91dHB1dDogSUltZ0luZm9bXVxyXG4gIGlucHV0OiBhbnlbXVxyXG4gIHJhd0lucHV0OiBhbnlbXVxyXG4gIHBsdWdpbkhhbmRsZXI6IFBsdWdpbkhhbmRsZXJcclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB3aWxsIGJlIHJlbW92ZWQgaW4gdjEuNS4wK1xyXG4gICAqXHJcbiAgICogdXNlIHJlcXVlc3QgaW5zdGVhZFxyXG4gICAqL1xyXG4gIFJlcXVlc3QhOiBSZXF1ZXN0XHJcbiAgaTE4biE6IElJMThuTWFuYWdlclxyXG4gIFZFUlNJT046IHN0cmluZyA9IHByb2Nlc3MuZW52LlBJQ0dPX1ZFUlNJT05cclxuICBHVUlfVkVSU0lPTj86IHN0cmluZ1xyXG5cclxuICBnZXQgcGx1Z2luTG9hZGVyICgpOiBJUGx1Z2luTG9hZGVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wbHVnaW5Mb2FkZXJcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yIChjb25maWdQYXRoOiBzdHJpbmcgPSAnJykge1xyXG4gICAgc3VwZXIoKVxyXG4gICAgdGhpcy5jb25maWdQYXRoID0gY29uZmlnUGF0aFxyXG4gICAgdGhpcy5vdXRwdXQgPSBbXVxyXG4gICAgdGhpcy5pbnB1dCA9IFtdXHJcbiAgICB0aGlzLnJhd0lucHV0ID0gW11cclxuICAgIHRoaXMuaGVscGVyID0ge1xyXG4gICAgICB0cmFuc2Zvcm1lcjogbmV3IExpZmVjeWNsZVBsdWdpbnMoJ3RyYW5zZm9ybWVyJyksXHJcbiAgICAgIHVwbG9hZGVyOiBuZXcgTGlmZWN5Y2xlUGx1Z2lucygndXBsb2FkZXInKSxcclxuICAgICAgYmVmb3JlVHJhbnNmb3JtUGx1Z2luczogbmV3IExpZmVjeWNsZVBsdWdpbnMoJ2JlZm9yZVRyYW5zZm9ybVBsdWdpbnMnKSxcclxuICAgICAgYmVmb3JlVXBsb2FkUGx1Z2luczogbmV3IExpZmVjeWNsZVBsdWdpbnMoJ2JlZm9yZVVwbG9hZFBsdWdpbnMnKSxcclxuICAgICAgYWZ0ZXJVcGxvYWRQbHVnaW5zOiBuZXcgTGlmZWN5Y2xlUGx1Z2lucygnYWZ0ZXJVcGxvYWRQbHVnaW5zJylcclxuICAgIH1cclxuICAgIHRoaXMuaW5pdENvbmZpZ1BhdGgoKVxyXG4gICAgdGhpcy5sb2cgPSBuZXcgTG9nZ2VyKHRoaXMpXHJcbiAgICB0aGlzLmNtZCA9IG5ldyBDb21tYW5kZXIodGhpcylcclxuICAgIHRoaXMucGx1Z2luSGFuZGxlciA9IG5ldyBQbHVnaW5IYW5kbGVyKHRoaXMpXHJcbiAgICB0aGlzLmluaXRDb25maWcoKVxyXG4gICAgdGhpcy5pbml0KClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdENvbmZpZ1BhdGggKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnUGF0aCA9PT0gJycpIHtcclxuICAgICAgdGhpcy5jb25maWdQYXRoID0gaG9tZWRpcigpICsgJy8ucGljbGlzdC9jb25maWcuanNvbidcclxuICAgIH1cclxuICAgIGlmIChwYXRoLmV4dG5hbWUodGhpcy5jb25maWdQYXRoKS50b1VwcGVyQ2FzZSgpICE9PSAnLkpTT04nKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnUGF0aCA9ICcnXHJcbiAgICAgIHRocm93IEVycm9yKCdUaGUgY29uZmlndXJhdGlvbiBmaWxlIG9ubHkgc3VwcG9ydHMgSlNPTiBmb3JtYXQuJylcclxuICAgIH1cclxuICAgIHRoaXMuYmFzZURpciA9IHBhdGguZGlybmFtZSh0aGlzLmNvbmZpZ1BhdGgpXHJcbiAgICBjb25zdCBleGlzdCA9IGZzLnBhdGhFeGlzdHNTeW5jKHRoaXMuY29uZmlnUGF0aClcclxuICAgIGlmICghZXhpc3QpIHtcclxuICAgICAgZnMuZW5zdXJlRmlsZVN5bmMoYCR7dGhpcy5jb25maWdQYXRofWApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRDb25maWcgKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYiA9IG5ldyBEQih0aGlzKVxyXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5kYi5yZWFkKHRydWUpIGFzIElDb25maWdcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdCAoKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBpbml0IDE4biBhdCBmaXJzdFxyXG4gICAgICB0aGlzLmkxOG4gPSBuZXcgSTE4bk1hbmFnZXIodGhpcylcclxuICAgICAgdGhpcy5SZXF1ZXN0ID0gbmV3IFJlcXVlc3QodGhpcylcclxuICAgICAgdGhpcy5fcGx1Z2luTG9hZGVyID0gbmV3IFBsdWdpbkxvYWRlcih0aGlzKVxyXG4gICAgICAvLyBsb2FkIHNlbGYgcGx1Z2luc1xyXG4gICAgICBzZXRDdXJyZW50UGx1Z2luTmFtZSgncGljZ28nKVxyXG4gICAgICB1cGxvYWRlcnModGhpcykucmVnaXN0ZXIodGhpcylcclxuICAgICAgdHJhbnNmb3JtZXJzKHRoaXMpLnJlZ2lzdGVyKHRoaXMpXHJcbiAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKCcnKVxyXG4gICAgICAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcclxuICAgICAgdGhpcy5fcGx1Z2luTG9hZGVyLmxvYWQoKVxyXG4gICAgICB0aGlzLmxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGUodGhpcylcclxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICB0aGlzLmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIC0xKVxyXG4gICAgICB0aGlzLmxvZy5lcnJvcihlKVxyXG4gICAgICB0aHJvdyBlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBlYXNpbHkgbWFubnVhbGx5IGxvYWQgYSBwbHVnaW5cclxuICAgKiBpZiBwcm92aWRlIHBsdWdpbiBuYW1lLCB3aWxsIHJlZ2lzdGVyIHBsdWdpbiBieSBuYW1lXHJcbiAgICogb3IganVzdCBpbnN0YW50aWF0ZSBhIHBsdWdpblxyXG4gICAqL1xyXG4gIHVzZSAocGx1Z2luOiBJUGljR29QbHVnaW4sIG5hbWU/OiBzdHJpbmcpOiBJUGljR29QbHVnaW5JbnRlcmZhY2Uge1xyXG4gICAgaWYgKG5hbWUpIHtcclxuICAgICAgdGhpcy5wbHVnaW5Mb2FkZXIucmVnaXN0ZXJQbHVnaW4obmFtZSwgcGx1Z2luKVxyXG4gICAgICByZXR1cm4gdGhpcy5wbHVnaW5Mb2FkZXIuZ2V0UGx1Z2luKG5hbWUpIVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcGx1Z2luSW5zdGFuY2UgPSBwbHVnaW4odGhpcylcclxuICAgICAgcmV0dXJuIHBsdWdpbkluc3RhbmNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3RlckNvbW1hbmRzICgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1BhdGggIT09ICcnKSB7XHJcbiAgICAgIHRoaXMuY21kLmluaXQoKVxyXG4gICAgICB0aGlzLmNtZC5sb2FkQ29tbWFuZHMoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Q29uZmlnPFQ+IChuYW1lPzogc3RyaW5nKTogVCB7XHJcbiAgICBpZiAoIW5hbWUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZyBhcyB1bmtub3duIGFzIFRcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBnZXQodGhpcy5fY29uZmlnLCBuYW1lKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2F2ZUNvbmZpZyAoY29uZmlnOiBJU3RyaW5nS2V5TWFwPGFueT4pOiB2b2lkIHtcclxuICAgIGlmICghaXNJbnB1dENvbmZpZ1ZhbGlkKGNvbmZpZykpIHtcclxuICAgICAgdGhpcy5sb2cud2FybigndGhlIGZvcm1hdCBvZiBjb25maWcgaXMgaW52YWxpZCwgcGxlYXNlIHByb3ZpZGUgb2JqZWN0JylcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLnNldENvbmZpZyhjb25maWcpXHJcbiAgICB0aGlzLmRiLnNhdmVDb25maWcoY29uZmlnKVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ29uZmlnIChrZXk6IHN0cmluZywgcHJvcE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCFrZXkgfHwgIXByb3BOYW1lKSByZXR1cm5cclxuICAgIGlmIChpc0NvbmZpZ0tleUluQmxhY2tMaXN0KGtleSkpIHtcclxuICAgICAgdGhpcy5sb2cud2FybihgdGhlIGNvbmZpZy4ke2tleX0gY2FuJ3QgYmUgcmVtb3ZlZGApXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy51bnNldENvbmZpZyhrZXksIHByb3BOYW1lKVxyXG4gICAgdGhpcy5kYi51bnNldChrZXksIHByb3BOYW1lKVxyXG4gIH1cclxuXHJcbiAgc2V0Q29uZmlnIChjb25maWc6IElTdHJpbmdLZXlNYXA8YW55Pik6IHZvaWQge1xyXG4gICAgaWYgKCFpc0lucHV0Q29uZmlnVmFsaWQoY29uZmlnKSkge1xyXG4gICAgICB0aGlzLmxvZy53YXJuKCd0aGUgZm9ybWF0IG9mIGNvbmZpZyBpcyBpbnZhbGlkLCBwbGVhc2UgcHJvdmlkZSBvYmplY3QnKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmIChpc0NvbmZpZ0tleUluQmxhY2tMaXN0KG5hbWUpKSB7XHJcbiAgICAgICAgdGhpcy5sb2cud2FybihgdGhlIGNvbmZpZy4ke25hbWV9IGNhbid0IGJlIG1vZGlmaWVkYClcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXHJcbiAgICAgICAgZGVsZXRlIGNvbmZpZ1tuYW1lXVxyXG4gICAgICB9XHJcbiAgICAgIHNldCh0aGlzLl9jb25maWcsIG5hbWUsIGNvbmZpZ1tuYW1lXSlcclxuICAgICAgZXZlbnRCdXMuZW1pdChJQnVzRXZlbnQuQ09ORklHX0NIQU5HRSwge1xyXG4gICAgICAgIGNvbmZpZ05hbWU6IG5hbWUsXHJcbiAgICAgICAgdmFsdWU6IGNvbmZpZ1tuYW1lXVxyXG4gICAgICB9KVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHVuc2V0Q29uZmlnIChrZXk6IHN0cmluZywgcHJvcE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCFrZXkgfHwgIXByb3BOYW1lKSByZXR1cm5cclxuICAgIGlmIChpc0NvbmZpZ0tleUluQmxhY2tMaXN0KGtleSkpIHtcclxuICAgICAgdGhpcy5sb2cud2FybihgdGhlIGNvbmZpZy4ke2tleX0gY2FuJ3QgYmUgdW5zZXRgKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHVuc2V0KHRoaXMuZ2V0Q29uZmlnKGtleSksIHByb3BOYW1lKVxyXG4gIH1cclxuXHJcbiAgZ2V0IHJlcXVlc3QgKCk6IElSZXF1ZXN0WydyZXF1ZXN0J10ge1xyXG4gICAgcmV0dXJuIHRoaXMuUmVxdWVzdC5yZXF1ZXN0LmJpbmQodGhpcy5SZXF1ZXN0KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBsb2FkIChpbnB1dD86IGFueVtdKTogUHJvbWlzZTxJSW1nSW5mb1tdIHwgRXJyb3I+IHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1BhdGggPT09ICcnKSB7XHJcbiAgICAgIHRoaXMubG9nLmVycm9yKCdUaGUgY29uZmlndXJhdGlvbiBmaWxlIG9ubHkgc3VwcG9ydHMgSlNPTiBmb3JtYXQuJylcclxuICAgICAgcmV0dXJuIFtdXHJcbiAgICB9XHJcbiAgICAvLyB1cGxvYWQgZnJvbSBjbGlwYm9hcmRcclxuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkIHx8IGlucHV0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHsgaW1nUGF0aCwgc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nIH0gPSBhd2FpdCBnZXRDbGlwYm9hcmRJbWFnZSh0aGlzKVxyXG4gICAgICAgIGlmIChpbWdQYXRoID09PSAnbm8gaW1hZ2UnKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ltYWdlIG5vdCBmb3VuZCBpbiBjbGlwYm9hcmQnKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm9uY2UoSUJ1aWxkSW5FdmVudC5GQUlMRUQsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcpIHtcclxuICAgICAgICAgICAgICAvLyDliKDpmaQgcGljZ28g55Sf5oiQ55qE5Zu+54mH5paH5Lu277yM5L6L5aaCIGB+Ly5waWNnby8yMDIwMDYyMTIwNTcyMC5wbmdgXHJcbiAgICAgICAgICAgICAgZnMucmVtb3ZlKGltZ1BhdGgpLmNhdGNoKChlKSA9PiB7IHRoaXMubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aGlzLm9uY2UoJ2ZpbmlzaGVkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNob3VsZEtlZXBBZnRlclVwbG9hZGluZykge1xyXG4gICAgICAgICAgICAgIGZzLnJlbW92ZShpbWdQYXRoKS5jYXRjaCgoZSkgPT4geyB0aGlzLmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IHRoaXMubGlmZWN5Y2xlLnN0YXJ0KFtpbWdQYXRoXSlcclxuICAgICAgICAgIHJldHVybiBvdXRwdXRcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aGlzLmVtaXQoSUJ1aWxkSW5FdmVudC5GQUlMRUQsIGUpXHJcbiAgICAgICAgdGhyb3cgZVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyB1cGxvYWQgZnJvbSBwYXRoXHJcbiAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSBhd2FpdCB0aGlzLmxpZmVjeWNsZS5zdGFydChpbnB1dClcclxuICAgICAgcmV0dXJuIG91dHB1dFxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQaWNHb1BsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgSW1nRnJvbVBhdGggZnJvbSAnLi9wYXRoJ1xyXG5pbXBvcnQgSW1nRnJvbUJhc2U2NCBmcm9tICcuL2Jhc2U2NCdcclxuXHJcbmNvbnN0IGJ1aWxkSW5UcmFuc2Zvcm1lcnM6IElQaWNHb1BsdWdpbiA9ICgpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgcmVnaXN0ZXIgKGN0eDogSVBpY0dvKSB7XHJcbiAgICAgIGN0eC5oZWxwZXIudHJhbnNmb3JtZXIucmVnaXN0ZXIoJ3BhdGgnLCBJbWdGcm9tUGF0aClcclxuICAgICAgY3R4LmhlbHBlci50cmFuc2Zvcm1lci5yZWdpc3RlcignYmFzZTY0JywgSW1nRnJvbUJhc2U2NClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGJ1aWxkSW5UcmFuc2Zvcm1lcnNcclxuIl0sIm5hbWVzIjpbInBsdWdpbkhhbmRsZXIiLCJoYW5kbGUiLCJjdHgiLCJjbWQiLCJwcm9ncmFtIiwiY29tbWFuZCIsImRlc2NyaXB0aW9uIiwiYWxpYXMiLCJvcHRpb24iLCJhY3Rpb24iLCJwbHVnaW5zIiwicHJveHkiLCJyZWdpc3RyeSIsIm9wdGlvbnMiLCJpbnN0YWxsIiwiY2F0Y2giLCJlIiwibG9nIiwiZXJyb3IiLCJ1bmluc3RhbGwiLCJ1cGRhdGUiLCJjb25maWciLCJyYW5kb21TdHJpbmdHZW5lcmF0b3IiLCJsZW5ndGgiLCJjaGFycyIsIkFycmF5IiwiZnJvbSIsIm1hcCIsImNoYXJBdCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImpvaW4iLCJyZW5hbWVGaWxlTmFtZVdpdGhDdXN0b21TdHJpbmciLCJvbGROYW1lIiwiY3VzdG9tRm9ybWF0IiwiYWZmaXhGaWxlTmFtZSIsImNvbnZlcnNpb25NYXAiLCJEYXRlIiwiZ2V0RnVsbFllYXIiLCJ0b1N0cmluZyIsInNsaWNlIiwiZ2V0TW9udGgiLCJnZXREYXRlIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImNyeXB0byIsImNyZWF0ZUhhc2giLCJwYXRoIiwiYmFzZW5hbWUiLCJleHRuYW1lIiwiZGlnZXN0IiwidXVpZHY0IiwicmVwbGFjZSIsIm5vdyIsInVuZGVmaW5lZCIsIk9iamVjdCIsImtleXMiLCJzb21lIiwiaXRlbSIsImluY2x1ZGVzIiwiZXh0IiwibmV3TmFtZSIsInJlZHVjZSIsImFjYyIsImN1ciIsIlJlZ0V4cCIsIl9yZXN1bHQiLCJrZXkiLCJjb3VudCIsIm1heCIsImRpcm5hbWUiLCJzcGxpdCIsInNlcCIsImEiLCJiIiwiaXNVcmwiLCJ1cmwiLCJ0ZXN0IiwiaXNVcmxFbmNvZGUiLCJkZWNvZGVVUkkiLCJoYW5kbGVVcmxFbmNvZGUiLCJlbmNvZGVVUkkiLCJnZXRJbWFnZVNpemUiLCJmaWxlIiwid2lkdGgiLCJoZWlnaHQiLCJpbWFnZVNpemUiLCJyZWFsIiwiZ2V0RlNGaWxlIiwiYXN5bmMiLCJmaWxlUGF0aCIsImZpbGVOYW1lIiwiYnVmZmVyIiwiZnMiLCJyZWFkRmlsZSIsInN1Y2Nlc3MiLCJyZWFzb24iLCJnZXRVUkxGaWxlIiwidGltZW91dElkIiwicmVxdWVzdEZuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZXMiLCJyZXF1ZXN0IiwibWV0aG9kIiwicmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2UiLCJyZXNwb25zZVR5cGUiLCJ0aGVuIiwicmVzcCIsImRhdGEiLCJjbGVhclRpbWVvdXQiLCJ1cmxQYXRoIiwiVVJMIiwicGF0aG5hbWUiLCJtZXNzYWdlIiwidGltZW91dFByb21pc2UiLCJzZXRUaW1lb3V0IiwicmFjZSIsImdldFBsdWdpbk5hbWVUeXBlIiwibmFtZSIsInN0YXJ0c1dpdGgiLCJpc1NpbXBsZU5hbWUiLCJuYW1lT3JQYXRoIiwiaXNBYnNvbHV0ZSIsInBsdWdpblBhdGgiLCJwcm9jZXNzIiwiY3dkIiwiZXhpc3RzU3luYyIsImhhbmRsZUNvbXBsZXRlUGx1Z2luTmFtZSIsInNjb3BlIiwiZ2V0UHJvY2Vzc1BsdWdpbk5hbWUiLCJsb2dnZXIiLCJjb25zb2xlIiwiaGFuZGxlVW5peFN0eWxlUGF0aCIsIndhcm4iLCJnZXROb3JtYWxQbHVnaW5OYW1lIiwicmVtb3ZlUGx1Z2luVmVyc2lvbiIsInBhY2thZ2VKU09OUGF0aCIsInBvc2l4IiwicGtnIiwicmVhZEpTT05TeW5jIiwicGF0aFN0ciIsInJlZyIsIm1hdGNoQXJyIiwibWF0Y2giLCJjb25maWdCbGFja0xpc3QiLCJpc0NvbmZpZ0tleUluQmxhY2tMaXN0IiwiYmxhY2tJdGVtIiwiaXNJbnB1dENvbmZpZ1ZhbGlkIiwiaXNBcnJheSIsInNhZmVQYXJzZSIsInN0ciIsIkpTT04iLCJwYXJzZSIsImZvcmNlTnVtYmVyIiwibnVtIiwiaXNOYU4iLCJOdW1iZXIiLCJpc0RldiIsImVudiIsIk5PREVfRU5WIiwiZGVmYXVsdFdhdGVybWFya0ltYWdlUGF0aCIsIl9fZGlybmFtZSIsIkFkZFdhdGVybWFyayIsImltZyIsIndhdGVybWFya1R5cGUiLCJkZWZhdWx0V2F0ZXJtYXJrRm9udFBhdGgiLCJpc0Z1bGxTY3JlZW5XYXRlcm1hcmsiLCJ3YXRlcm1hcmtEZWdyZWUiLCJ0ZXh0Iiwid2F0ZXJtYXJrRm9udFBhdGgiLCJ3YXRlcm1hcmtTY2FsZVJhdGlvIiwid2F0ZXJtYXJrQ29sb3IiLCJ3YXRlcm1hcmtJbWFnZVBhdGgiLCJwb3NpdGlvbiIsImltYWdlIiwic2hhcnAiLCJpbWdXaWR0aCIsIm1ldGFkYXRhIiwid2F0ZXJtYXJrIiwidG9CdWZmZXIiLCJjb2xvciIsImZvbnRGYW1pbHkiLCJhbmNob3IiLCJhdHRyaWJ1dGVzIiwiZmlsbCIsInRleHRTVkciLCJUZXh0VG9TVkciLCJsb2FkU3luYyIsImdldFNWRyIsIkJ1ZmZlciIsInRleHQyU1ZHIiwid2F0ZXJtYXJrV2lkdGgiLCJ3YXRlcm1hcmtIZWlnaHQiLCJnZXRTaXplIiwid2F0ZXJtYXJrUmVzaXplV2lkdGgiLCJ3YXRlcm1hcmtSZXNpemVIZWlnaHQiLCJyZXNpemUiLCJmaXQiLCJyb3RhdGUiLCJiYWNrZ3JvdW5kIiwiciIsImciLCJhbHBoYSIsImNyZWF0ZVdhdGVybWFyayIsImNvbXBvc2l0ZSIsImlucHV0IiwiZ3Jhdml0eSIsInRpbGUiLCJ2YWxpZFBhcmFtIiwicGFyYW1zIiwiZXZlcnkiLCJwYXJhbSIsImF2YWlsYWJsZUNvbnZlcnRGb3JtYXRMaXN0IiwiaW1hZ2VFeHRMaXN0IiwiaW1hZ2VBZGRXYXRlck1hcmsiLCJ3YXRlcm1hcmtUZXh0Iiwid2F0ZXJtYXJrUG9zaXRpb24iLCJmb3JtYXRPcHRpb25zIiwicXVhbGl0eSIsImlzQ29udmVydCIsImNvbnZlcnRGb3JtYXQiLCJpc1JlU2l6ZSIsInJlU2l6ZUhlaWdodCIsInJlU2l6ZVdpZHRoIiwiaXNSZVNpemVCeVBlcmNlbnQiLCJyZVNpemVQZXJjZW50IiwiaXNSb3RhdGUiLCJyb3RhdGVEZWdyZWUiLCJwaWNCZWQiLCJpbWFnZVByb2Nlc3MiLCJyYXdGb3JtYXQiLCJ0b0xvd2VyQ2FzZSIsImltYWdlV2lkdGgiLCJpbWFnZUhlaWdodCIsInJvdW5kIiwibmV3Rm9ybWF0IiwidG9Gb3JtYXQiLCJmb3JtYXQiLCJpbWFnZUZvcm1hdExpc3QiLCJuZWVkQWRkV2F0ZXJtYXJrIiwid2F0ZXJtYXJrT3B0aW9ucyIsImZpbGVFeHQiLCJpc0FkZFdhdGVybWFyayIsIm5lZWRDb21wcmVzcyIsImNvbXByZXNzT3B0aW9ucyIsInJlbW92ZUV4aWYiLCJ1cGxvYWQiLCJhcmd1bWVudHMiLCJpbnB1dExpc3QiLCJmaWx0ZXIiLCJleGlzdCIsInVzZXJDb25maWciLCJnZXRDb25maWciLCJ0eXBlIiwiaTE4biIsInRyYW5zbGF0ZSIsInJlcXVpcmVkIiwiZGVmYXVsdCIsImNob2ljZXMiLCJpc1JlbW92ZUV4aWYiLCJlbmFibGUiLCJoYW5kbGVDb25maWciLCJwcm9tcHRzIiwibW9kdWxlIiwiYW5zd2VyIiwiaW5xdWlyZXIiLCJwcm9tcHQiLCJjb25maWdOYW1lIiwic2F2ZUNvbmZpZyIsInNldHRpbmciLCJjb21wcmVzcyIsInJlbmFtZSIsImJ1aWxkaW4iLCJoZWxwZXIiLCJnZXQiLCJnZXRJZExpc3QiLCJwbHVnaW5Mb2FkZXIiLCJnZXRQbHVnaW4iLCJnZXRGdWxsTGlzdCIsInBsdWdpbiIsImluZm8iLCJhcmd2IiwidXNlIiwidXBsb2FkZXIiLCJ0cmFuc2Zvcm1lciIsInB1c2giLCJwaWNnb1BsdWdpbnMiLCJzZXRDb25maWciLCJnZW5lcmF0ZSIsIm9wdHMiLCJnZXRPcHRpb25zIiwidG1wIiwic291cmNlIiwiYW5zd2VycyIsIl9maWxlcyIsImdsb2JieSIsImRvdCIsImdsb2IiLCJmaWx0ZXJzIiwiZm9yRWFjaCIsImZpbGVzIiwicmVuZGVyIiwid3JpdGVGaWxlVHJlZSIsImRlc3QiLCJjb21wbGV0ZSIsImNvbXBsZXRlTWVzc2FnZSIsImV4cCIsImZuIiwiRnVuY3Rpb24iLCJzdHJpbmdpZnkiLCJ0ZW1wbGF0ZVBhdGgiLCJvcHRpb25zUGF0aCIsInJlcXVpcmUiLCJmaWxlVHJlZSIsInJlYWRGaWxlU3luYyIsImNvbnRlbnQiLCJlanMiLCJpc0J1ZmZlciIsImRpciIsImVuc3VyZURpclN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwicnVuIiwib2ZmbGluZSIsInRlbXBsYXRlIiwiaGFzU2xhc2giLCJkb3dubG9hZEFuZEdlbmVyYXRlIiwicm0iLCJzeW5jIiwiZG93bmxvYWQiLCJjbG9uZSIsImVyciIsImluaXQiLCJwcm9qZWN0IiwiaW5QbGFjZSIsImhvbWVkaXIiLCJvayIsIm9uIiwiY2hhbGsiLCJncmF5IiwibGFuZyIsImxpc3QiLCJnZXRMYW5ndWFnZUxpc3QiLCJzZXRMYW5ndWFnZSIsIkxpZmVjeWNsZVBsdWdpbnMiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJNYXAiLCJwbHVnaW5JZE1hcCIsInJlZ2lzdGVyIiwiaWQiLCJUeXBlRXJyb3IiLCJoYXMiLCJzZXQiLCJjdXJyZW50UGx1Z2luIiwidW5yZWdpc3RlciIsInBsdWdpbk5hbWUiLCJwbHVnaW5MaXN0IiwiZGVsZXRlIiwiZ2V0TmFtZSIsImdldExpc3QiLCJ2YWx1ZXMiLCJzZXRDdXJyZW50UGx1Z2luTmFtZSIsIkNvbW1hbmRlciIsIkNvbW1hbmQiLCJ2ZXJzaW9uIiwiZGVidWciLCJzaWxlbnQiLCJhcmdzIiwiZXhpdCIsImN1cnJlbnRQbHVnaW5OYW1lIiwibG9hZENvbW1hbmRzIiwiSUxvZ1R5cGUiLCJJQnVpbGRJbkV2ZW50IiwiSUJ1c0V2ZW50IiwiTG9nZ2VyIiwiaGFuZGxlTG9nIiwibXNnIiwibG9nSGVhZGVyIiwibGV2ZWwiLCJ0b1VwcGVyQ2FzZSIsImxvZ0xldmVsIiwibG9nUGF0aCIsImJhc2VEaXIiLCJyZXN1bHQiLCJjaGVja0xvZ0ZpbGVJc0xhcmdlIiwiaXNMYXJnZSIsIndhcm5pbmdNc2ciLCJ5ZWxsb3ciLCJyZWNyZWF0ZUxvZ0ZpbGUiLCJ1bnNoaWZ0IiwiaGFuZGxlV3JpdGVMb2ciLCJsb2dGaWxlU2l6ZSIsInN0YXRTeW5jIiwic2l6ZSIsImxvZ0ZpbGVTaXplTGltaXQiLCJ1bmxpbmtTeW5jIiwiY3JlYXRlRmlsZVN5bmMiLCJjaGVja0xvZ0xldmVsIiwiZGF5anMiLCJFcnJvciIsInV0aWwiLCJzdGFjayIsImFwcGVuZEZpbGVTeW5jIiwiTGlmZWN5Y2xlIiwiRXZlbnRFbWl0dGVyIiwic3VwZXIiLCJ0ZW1wRmlsZVBhdGgiLCJlbXB0eURpclN5bmMiLCJ0dGZQYXRoIiwib3V0cHV0RGlyIiwibWtkaXJTeW5jIiwicmVjdXJzaXZlIiwiYXhpb3MiLCJ0dGZMaW5rIiwiY29uZmlnUGF0aCIsIm91dHB1dCIsInJhd0lucHV0IiwiUmVxdWVzdCIsIlZFUlNJT04iLCJHVUlfVkVSU0lPTiIsImJpbmQiLCJyZW1vdmVDb25maWciLCJ1bnNldENvbmZpZyIsImFkZExpc3RlbmVyIiwib25jZSIsInJlbW92ZUxpc3RlbmVyIiwib2ZmIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic2V0TWF4TGlzdGVuZXJzIiwiZ2V0TWF4TGlzdGVuZXJzIiwibGlzdGVuZXJzIiwicmF3TGlzdGVuZXJzIiwiZW1pdCIsImxpc3RlbmVyQ291bnQiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwiZXZlbnROYW1lcyIsImNyZWF0ZUNvbnRleHQiLCJyYXdJbnB1dFBhdGgiLCJjbG9uZURlZXAiLCJ3YXRlcm1hcmtNc2ciLCJjb21wcmVzc01zZyIsImFsbFNldHRsZWQiLCJpbmRleCIsInRyYW5zZm9ybWVkQnVmZmVyIiwiZG93bmxvYWRUVEYiLCJuZXdFeHQiLCJ0ZW1wRmlsZSIsImdldFRpbWUiLCJoZWljQnVmZmVyIiwiaGVpY1Jlc3VsdCIsImhlaWNDb252ZXJ0IiwidGVtcEhlaWNDb252ZXJ0RmlsZSIsImJlZm9yZVRyYW5zZm9ybSIsImRvVHJhbnNmb3JtIiwicmVuYW1lQ29uZmlnIiwiYmVmb3JlVXBsb2FkIiwiZG9VcGxvYWQiLCJhZnRlclVwbG9hZCIsIkZBSUxFRCIsIlVQTE9BRF9QUk9HUkVTUyIsIkJFRk9SRV9UUkFOU0ZPUk0iLCJoYW5kbGVQbHVnaW5zIiwiYmVmb3JlVHJhbnNmb3JtUGx1Z2lucyIsImN1cnJlbnRUcmFuc2Zvcm1lciIsIkJFRk9SRV9VUExPQUQiLCJiZWZvcmVVcGxvYWRQbHVnaW5zIiwib3V0cHV0SW1nIiwiQUZURVJfVVBMT0FEIiwiYWZ0ZXJVcGxvYWRQbHVnaW5zIiwiaXNFbmNvZGVPdXRwdXRVUkwiLCJpIiwiaW1nVXJsIiwiYmFzZTY0SW1hZ2UiLCJGSU5JU0hFRCIsImxpZmVDeWNsZVBsdWdpbnMiLCJwbHVnaW5OYW1lcyIsImxpZmVDeWNsZU5hbWUiLCJhbGwiLCJwb3N0T3B0aW9ucyIsImFwaVRva2VuIiwiYmFja3VwRG9tYWluIiwiaGVhZGVycyIsImNvbnRlbnRUeXBlIiwiQXV0aG9yaXphdGlvbiIsImZvcm1EYXRhIiwic21maWxlIiwidmFsdWUiLCJmaWxlbmFtZSIsInNzbCIsInNtbXNDb25maWciLCJpbWdMaXN0IiwicG9zdENvbmZpZyIsInRva2VuIiwiYm9keSIsImNvZGUiLCJoYXNoIiwiaW1hZ2VzIiwiTk9USUZJQ0FUSU9OIiwidGl0bGUiLCJwcmVmaXgiLCJnZW5lcmF0ZVNpZ25hdHVyZSIsInNlY3JldElkIiwic2VjcmV0S2V5IiwiYXBwSWQiLCJidWNrZXQiLCJzaWduYXR1cmUiLCJzaWduVGltZSIsInRvZGF5Iiwic2lnbktleSIsImNyZWF0ZUhtYWMiLCJodHRwU3RyaW5nIiwiYXJlYSIsInN0cmluZ1RvU2lnbiIsImN1cnJlbnQiLCJtdWx0aVNpZ25hdHVyZSIsInNpZ25IZXhLZXkiLCJ0ZW1wU3RyaW5nIiwiY29uY2F0IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiSG9zdCIsIm1pbWUiLCJsb29rdXAiLCJvcCIsImZpbGVjb250ZW50IiwidGNZdW5PcHRpb25zIiwiY3VzdG9tVXJsIiwidXNlVjQiLCJzdGF0dXNDb2RlIiwib3B0aW9uVXJsIiwic291cmNlX3VybCIsInJlcG8iLCJqc29uIiwiYnJhbmNoIiwiZ2l0aHViT3B0aW9ucyIsImRvd25sb2FkX3VybCIsInNoYSIsImltZ0Jhc2U2NCIsInNlbGVjdEFyZWEiLCJnZXRUb2tlbiIsInFpbml1T3B0aW9ucyIsImFjY2Vzc0tleSIsIm1hYyIsInFpbml1IiwiYXV0aCIsIk1hYyIsInJzIiwiUHV0UG9saWN5IiwidXBsb2FkVG9rZW4iLCJiYXNlVXJsIiwicmVzcG9uc2UiLCJjbGllbnRJZCIsInVzZXJuYW1lIiwiYWNjZXNzVG9rZW4iLCJmb3JtYXRBY2Nlc3NUb2tlbiIsImFsYnVtIiwiYXV0aG9yaXphdGlvbiIsInJlcXVlc3RPcHRpb25zIiwiaW5pdFBhZ2VzIiwiYWxidW1IYXNoIiwiZ2V0QWxidW1IYXNoT3B0aW9ucyIsInRpbWVvdXQiLCJhbGJ1bUxpc3QiLCJpbWd1ck9wdGlvbnMiLCJsaW5rIiwiZGVsZXRlaGFzaCIsImRhdGUiLCJ0b1VUQ1N0cmluZyIsIm1pbWVUeXBlIiwic2lnblN0cmluZyIsImFjY2Vzc0tleVNlY3JldCIsImFjY2Vzc0tleUlkIiwiYWxpWXVuT3B0aW9ucyIsIm9wZXJhdG9yIiwicGFzc3dvcmQiLCJtZDVQYXNzd29yZCIsIk1ENSIsInVweXVuT3B0aW9ucyIsInBhdGhzIiwiY3VycmVudFBhdGgiLCJwIiwiZGlyb3B0aW9ucyIsImhvc3QiLCJ3ZWJkYXZwbGlzdE9wdGlvbnMiLCJzc2xFbmFibGVkIiwid2VicGF0aCIsImJ1aWxkSW5VcGxvYWRlcnMiLCJhbGlZdW5VcGxvYWRlciIsInRjWXVuVXBsb2FkZXIiLCJTTU1TVXBsb2FkZXIiLCJnaXRodWJVcGxvYWRlciIsInFpbml1VXBsb2FkZXIiLCJpbWd1clVwbG9hZGVyIiwidXBZdW5VcGxvYWRlciIsIndlYmRhdnBsaXN0VXBsb2FkZXIiLCJnZXRJbWdTaXplIiwicmVzdWx0cyIsImltZ1NpemUiLCJQbHVnaW5Mb2FkZXIiLCJTZXQiLCJwYWNrYWdlUGF0aCIsInJlcG9zaXRvcnkiLCJsaWNlbnNlIiwicmVzb2x2ZVBsdWdpbiIsImJhc2VkaXIiLCJsb2FkIiwicGx1Z2luRGlyIiwiZGVwcyIsImRlcGVuZGVuY2llcyIsImRldkRlcHMiLCJkZXZEZXBlbmRlbmNpZXMiLCJtb2R1bGVzIiwicmVnaXN0ZXJQbHVnaW4iLCJmdWxsTGlzdCIsImFkZCIsInBsdWdpbkludGVyZmFjZSIsInBsdWdpbk1hcCIsInVucmVnaXN0ZXJQbHVnaW4iLCJoYXNQbHVnaW4iLCJwbGF0Zm9ybTJTY3JpcHRDb250ZW50IiwiZGFyd2luIiwid2luMzIiLCJ3aW4xMCIsImxpbnV4Iiwid3NsIiwicGxhdGZvcm0yU2NyaXB0RmlsZW5hbWUiLCJnZXRDbGlwYm9hcmRJbWFnZSIsImltYWdlUGF0aCIsImNyZWF0ZUltYWdlRm9sZGVyIiwicGxhdGZvcm0iLCJpc1dzbCIsIm9zIiwicmVsZWFzZSIsImdldEN1cnJlbnRQbGF0Zm9ybSIsInNjcmlwdFBhdGgiLCJleGVjdXRpb24iLCJzcGF3biIsInN0ZG91dCIsInRyaW0iLCJpbWdQYXRoIiwic2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nIiwiZXZlbnRCdXMiLCJodHRwc0FnZW50IiwiaHR0cHMiLCJBZ2VudCIsIm1heFZlcnNpb24iLCJtaW5WZXJzaW9uIiwiYXBwZW5kRm9ybURhdGEiLCJmb3JtIiwiYXBwZW5kIiwicmVzcG9uc2VJbnRlcmNlcHRvciIsInN0YXR1cyIsInJlc3BvbnNlRXJyb3JIYW5kbGVyIiwiZXJyb3JPYmoiLCJDT05GSUdfQ0hBTkdFIiwiaGFuZGxlUHJveHkiLCJwcm94eU9wdGlvbnMiLCJob3N0bmFtZSIsInBvcnQiLCJwYXJzZUludCIsInByb3RvY29sIiwibWF4Qm9keUxlbmd0aCIsIkluZmluaXR5IiwibWF4Q29udGVudExlbmd0aCIsInR1bm5lbCIsImh0dHBzT3Zlckh0dHAiLCJpbnN0YW5jZSIsImNyZWF0ZSIsImludGVyY2VwdG9ycyIsIm9wdCIsIl9faXNPbGRPcHRpb25zIiwiRm9ybURhdGEiLCJhc3NpZ24iLCJnZXRIZWFkZXJzIiwicXMiLCJyZXF1ZXN0SW50ZXJjZXB0b3IiLCJvYmoiLCJDb250ZW50VHlwZSIsIkRCIiwiZGIiLCJKU09OU3RvcmUiLCJyZWFkIiwiZmx1c2giLCJ1bnNldCIsIlBsdWdpbkhhbmRsZXIiLCJpbnN0YWxsZWRQbHVnaW5zIiwicHJvY2Vzc1BsdWdpbnMiLCJoYW5kbGVQbHVnaW5OYW1lUHJvY2VzcyIsInBrZ05hbWUiLCJmdWxsTmFtZUxpc3QiLCJmdWxsTmFtZSIsInBrZ05hbWVMaXN0IiwiZXhlY0NvbW1hbmQiLCJ3aGVyZSIsIm5wbSIsInBpcGUiLCJzdGRlcnIiLCJsYW5ndWFnZUxpc3QiLCJVUExPQURfRkFJTEVEIiwiQ0hFQ0tfU0VUVElOR1MiLCJDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSyIsIlVQTE9BRF9GQUlMRURfUkVBU09OIiwiU0VSVkVSX0VSUk9SIiwiQVVUSF9GQUlMRUQiLCJQSUNCRURfU01NUyIsIlBJQ0JFRF9TTU1TX1RPS0VOIiwiUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTiIsIlBJQ0JFRF9TTU1TX01FU1NBR0VfQkFDS1VQX0RPTUFJTiIsIlBJQ0JFRF9BTElDTE9VRCIsIlBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRCIsIlBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVQiLCJQSUNCRURfQUxJQ0xPVURfQlVDS0VUIiwiUElDQkVEX0FMSUNMT1VEX0FSRUEiLCJQSUNCRURfQUxJQ0xPVURfUEFUSCIsIlBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkwiLCJQSUNCRURfQUxJQ0xPVURfT1BUSU9OUyIsIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUEiLCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9QQVRIIiwiUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfT1BUSU9OUyIsIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCIsIlBJQ0JFRF9URU5DRU5UQ0xPVUQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX1ZFUlNJT04iLCJQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRLRVkiLCJQSUNCRURfVEVOQ0VOVENMT1VEX0FQUElEIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUEiLCJQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEgiLCJQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlMiLCJQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEgiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlMiLCJQSUNCRURfR0lUSFVCIiwiUElDQkVEX0dJVEhVQl9UT0tFTiIsIlBJQ0JFRF9HSVRIVUJfUkVQTyIsIlBJQ0JFRF9HSVRIVUJfUEFUSCIsIlBJQ0JFRF9HSVRIVUJfQlJBTkNIIiwiUElDQkVEX0dJVEhVQl9DVVNUT01VUkwiLCJQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTyIsIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0giLCJQSUNCRURfR0lUSFVCX01FU1NBR0VfUEFUSCIsIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkwiLCJQSUNCRURfUUlOSVUiLCJQSUNCRURfUUlOSVVfQUNDRVNTS0VZIiwiUElDQkVEX1FJTklVX1NFQ1JFVEtFWSIsIlBJQ0JFRF9RSU5JVV9CVUNLRVQiLCJQSUNCRURfUUlOSVVfUEFUSCIsIlBJQ0JFRF9RSU5JVV9VUkwiLCJQSUNCRURfUUlOSVVfT1BUSU9OUyIsIlBJQ0JFRF9RSU5JVV9BUkVBIiwiUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSCIsIlBJQ0JFRF9RSU5JVV9NRVNTQUdFX0FSRUEiLCJQSUNCRURfUUlOSVVfTUVTU0FHRV9PUFRJT05TIiwiUElDQkVEX1FJTklVX01FU1NBR0VfVVJMIiwiUElDQkVEX0lNR1VSIiwiUElDQkVEX0lNR1VSX0NMSUVOVElEIiwiUElDQkVEX0lNR1VSX1VTRVJOQU1FIiwiUElDQkVEX0lNR1VSX0FDQ0VTU19UT0tFTiIsIlBJQ0JFRF9JTUdVUl9BTEJVTSIsIlBJQ0JFRF9JTUdVUl9QUk9YWSIsIlBJQ0JFRF9JTUdVUl9NRVNTQUdFX0NMSUVOVElEIiwiUElDQkVEX0lNR1VSX01FU1NBR0VfVVNFUk5BTUUiLCJQSUNCRURfSU1HVVJfTUVTU0FHRV9BQ0NFU1NfVE9LRU4iLCJQSUNCRURfSU1HVVJfTUVTU0FHRV9BTEJVTSIsIlBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZIiwiUElDQkVEX1VQWVVOIiwiUElDQkVEX1VQWVVOX0JVQ0tFVCIsIlBJQ0JFRF9VUFlVTl9PUEVSQVRPUiIsIlBJQ0JFRF9VUFlVTl9QQVNTV09SRCIsIlBJQ0JFRF9VUFlVTl9QQVRIIiwiUElDQkVEX1VQWVVOX1VSTCIsIlBJQ0JFRF9VUFlVTl9PUFRJT05TIiwiUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1IiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRCIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTCIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlMiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVRIIiwiUElDQkVEX1dFQkRBVlBMSVNUIiwiUElDQkVEX1dFQkRBVlBMSVNUX0hPU1QiLCJQSUNCRURfV0VCREFWUExJU1RfU1NMRU5BQkxFRCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9VU0VSTkFNRSIsIlBJQ0JFRF9XRUJEQVZQTElTVF9QQVNTV09SRCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9QQVRIIiwiUElDQkVEX1dFQkRBVlBMSVNUX1dFQlNJVEVfUEFUSCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkwiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9IT1NUIiwiUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfU1NMRU5BQkxFRCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1VTRVJOQU1FIiwiUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfUEFTU1dPUkQiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVRIIiwiUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfV0VCU0lURV9QQVRIIiwiUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfQ1VTVE9NVVJMIiwiQlVJTERJTl9XQVRFUk1BUktfSVNBRERXQVRFUk1BUksiLCJCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX0lTQUREV0FURVJNQVJLIiwiQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVFlQRSIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLVFlQRSIsIkJVSUxESU5fV0FURVJNQVJLX0lTRlVMTFNDUkVFTldBVEVSTUFSSyIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfSVNGVUxMU0NSRUVOV0FURVJNQVJLIiwiQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLREVHUkVFIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktERUdSRUUiLCJCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhUIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktURVhUIiwiQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVEVYVEZPTlRQQVRIIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UUEFUSCIsIkJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRSQVRJTyIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVFJBVElPIiwiQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLRk9OVENPTE9SIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UQ09MT1IiLCJCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktJTUFHRVBBVEgiLCJCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0lNQUdFUEFUSCIsIkJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1BPU0lUSU9OIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktQT1NJVElPTiIsIkJVSUxESU5fUkVOQU1FX0ZPUk1BVCIsIkJVSUxESU5fUkVOQU1FX0VOQUJMRSIsIkJVSUxESU5fQ09NUFJFU1NfUVVBTElUWSIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9RVUFMSVRZIiwiQlVJTERJTl9DT01QUkVTU19JU0NPTlZFUlQiLCJCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNDT05WRVJUIiwiQlVJTERJTl9DT01QUkVTU19DT05WRVJURk9STUFUIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0NPTlZFUlRGT1JNQVQiLCJCVUlMRElOX0NPTVBSRVNTX0lTUkVTSVpFIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVTSVpFIiwiQlVJTERJTl9DT01QUkVTU19SRVNJWkVXSURUSCIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVXSURUSCIsIkJVSUxESU5fQ09NUFJFU1NfUkVTSVpFSEVJR0hUIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRUhFSUdIVCIsIkJVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkVCWVBFUkNFTlQiLCJCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRVNJWkVCWVBFUkNFTlQiLCJCVUlMRElOX0NPTVBSRVNTX1JFU0laRVBFUkNFTlQiLCJCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFUEVSQ0VOVCIsIkJVSUxESU5fQ09NUFJFU1NfSVNST1RBVEUiLCJCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNST1RBVEUiLCJCVUlMRElOX0NPTVBSRVNTX1JPVEFURURFR1JFRSIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9ST1RBVEVERUdSRUUiLCJCVUlMRElOX0NPTVBSRVNTX0lTUkVNT1ZFRVhJRiIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JFTU9WRUVYSUYiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTiIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9QQVRIIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT04iLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUyIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQiLCJlbiIsIkkxOG5NYW5hZ2VyIiwib2JqZWN0QWRhcHRlciIsIk9iamVjdEFkYXB0ZXIiLCJsYW5ndWFnZSIsIkkxOG4iLCJhZGFwdGVyIiwiZGVmYXVsdExhbmd1YWdlIiwibG9hZE91dHRlckkxOG4iLCJpMThuRm9sZGVyIiwiZ2V0T3V0dGVySTE4bkZvbGRlciIsInJlYWRkaXJTeW5jIiwid2l0aEZpbGVUeXBlcyIsImlzRmlsZSIsImVuZHNXaXRoIiwiaTE4bkZpbGVQYXRoIiwiaTE4bkZpbGUiLCJpMThuRmlsZU9iaiIsInlhbWwiLCJwYXRoRXhpc3RzU3luYyIsImFkZExvY2FsZSIsImxvY2FsZXMiLCJvcmlnaW5Mb2NhbGVzIiwiZ2V0TG9jYWxlIiwibmV3TG9jYWxlcyIsIm1lcmdlIiwic2V0TG9jYWxlIiwiYWRkTGFuZ3VhZ2UiLCJQaWNHbyIsImluaXRDb25maWdQYXRoIiwiaW5pdENvbmZpZyIsIl9wbHVnaW5Mb2FkZXIiLCJlbnN1cmVGaWxlU3luYyIsIl9jb25maWciLCJ1cGxvYWRlcnMiLCJJbWdGcm9tUGF0aCIsIkltZ0Zyb21CYXNlNjQiLCJsaWZlY3ljbGUiLCJyZWdpc3RlckNvbW1hbmRzIiwicHJvcE5hbWUiLCJzdGFydCIsInJlbW92ZSJdLCJtYXBwaW5ncyI6IjQrQkFFQSxNQUFNQSxFQUF5QixDQUM3QkMsT0FBU0MsSUFFUCxNQUFNQyxFQUFNRCxFQUFJQyxJQUNoQkEsRUFBSUMsUUFDREMsUUFBUSx3QkFDUkMsWUFBWSx3QkFDWkMsTUFBTSxPQUNOQyxPQUFPLHNCQUF1Qiw0QkFDOUJBLE9BQU8sNEJBQTZCLG9DQUNwQ0MsUUFBTyxDQUFDQyxFQUFtQk4sS0FDMUIsTUFBTU8sTUFBRUEsRUFBS0MsU0FBRUEsR0FBYVIsRUFDdEJTLEVBQVUsQ0FDZEYsTUFBQUEsRUFDQUMsU0FBQUEsR0FFRlYsRUFBSUYsY0FBY2MsUUFBUUosRUFBU0csR0FBU0UsT0FBT0MsSUFBUWQsRUFBSWUsSUFBSUMsTUFBTUYsU0FF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
|