piclist 1.3.7 → 1.3.8

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.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import fs from"fs-extra";import path from"path";import{EventEmitter}from"events";import os,{homedir}from"os";import{Command}from"commander";import inquirer from"inquirer";import{imageSize}from"image-size";import{URL}from"url";import TextToSVG from"text-to-svg";import sharp from"sharp";import crypto from"crypto";import{v4}from"uuid";import chalk from"chalk";import match from"minimatch";import globby from"globby";import ejs from"ejs";import download from"download-git-repo";import rm from"rimraf";import dayjs from"dayjs";import util from"util";import axios from"axios";import{cloneDeep,merge,get,set,unset}from"lodash";import heicConvert from"heic-convert";import mime from"mime-types";import qiniu from"qiniu";import{NodeSSH}from"node-ssh-no-cpu-features";import resolve from"resolve";import{spawn}from"child_process";import isWsl from"is-wsl";import FormData from"form-data";import https from"https";import tunnel from"tunnel";import{JSONStore}from"@picgo/store";import spawn$1 from"cross-spawn";import yaml from"js-yaml";import{ObjectAdapter,I18n}from"@picgo/i18n";const pluginHandler={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 plugins").option("-r, --registry <registry>","Choose a registry for installing plugins").action(((t,n)=>{const{proxy:r,registry:i}=n,a={proxy:r,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,n)=>{const{proxy:r,registry:i}=n,a={proxy:r,registry:i};e.pluginHandler.update(t,a).catch((t=>{e.log.error(t)}))}))}},config$f={handle:e=>{e.cmd.program.option("-c, --config <path>","set config path")}};function randomStringGenerator(e){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";return Array.from({length:e}).map((()=>t.charAt(Math.floor(Math.random()*t.length)))).join("")}function renameFileNameWithTimestamp(e){return`${Math.floor(Date.now()/1e3)}${randomStringGenerator(5)}${path.extname(e)}`}function renameFileNameWithRandomString(e,t=5){return`${randomStringGenerator(t)}${path.extname(e)}`}function renameFileNameWithCustomString(e,t,n){const r={"{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}":()=>crypto.createHash("md5").update(path.basename(e,path.extname(e))).digest("hex"),"{md5-16}":()=>crypto.createHash("md5").update(path.basename(e,path.extname(e))).digest("hex").slice(0,16),"{str-10}":()=>randomStringGenerator(10),"{str-20}":()=>randomStringGenerator(20),"{filename}":()=>n?path.basename(n,path.extname(n)):path.basename(e,path.extname(e)),"{uuid}":()=>v4().replace(/-/g,""),"{timestamp}":()=>Math.floor(Date.now()/1e3).toString()};if(void 0===t||!Object.keys(r).some((e=>t.includes(e)))&&!t.includes("localFolder"))return e;const i=path.extname(e);let a=Object.keys(r).reduce(((e,t)=>e.replace(new RegExp(t,"g"),r[t]())),t)+i;return a=a.replace(/{(localFolder:?(\d+)?)}/gi,((t,n,r)=>{r=Math.max(1,r||0);return path.dirname(e).split(path.sep).slice(0-r).reduce(((e,t)=>`${e}/${t}`)).replace(/:/g,"")})),a}const isUrl=e=>/^https?:\/\//.test(e),isUrlEncode=e=>{e=e||"";try{return e!==decodeURI(e)}catch(e){return!1}},handleUrlEncode=e=>(isUrlEncode(e)||(e=encodeURI(e)),e),getImageSize=e=>{try{const{width:t=0,height:n=0,type:r}=imageSize(e);return{real:!0,width:t,height:n,extname:r?`.${r}`:".png"}}catch(e){return{real:!1,width:200,height:200,extname:".png"}}},getFSFile=async e=>{try{return{extname:path.extname(e),fileName:path.basename(e),buffer:await fs.readFile(e),success:!0}}catch(t){return{reason:`read file ${e} error`,success:!1}}},getURLFile=async(e,t)=>{let n;e=handleUrlEncode(e);const r=new Promise(((r,i)=>{(async()=>{var i;try{const i=await t.request({method:"get",url:e,resolveWithFullResponse:!0,responseType:"arraybuffer"}).then((e=>e.data));clearTimeout(n);const a=new URL(e).pathname;let s="";try{s=new URL(e).searchParams.get("wx_fmt")||path.extname(a)||""}catch(e){s=path.extname(a)||""}!s.startsWith(".")&&s&&(s=`.${s}`),r({buffer:i,fileName:path.basename(a),extname:s,success:!0})}catch(t){clearTimeout(n),r({success:!1,reason:`request ${e} error, ${null!==(i=null==t?void 0:t.message)&&void 0!==i?i:""}`})}})().catch(i)})),i=new Promise((t=>{n=setTimeout((()=>{t({success:!1,reason:`request ${e} timeout`})}),3e4)}));return Promise.race([r,i])},getPluginNameType=e=>/^@[^/]+\/picgo-plugin-/.test(e)?"scope":e.startsWith("picgo-plugin-")?"normal":isSimpleName(e)?"simple":"unknown",isSimpleName=e=>{if(path.isAbsolute(e))return!1;const t=path.join(process.cwd(),e);return!fs.existsSync(t)&&(!e.includes("/")&&!e.includes("\\"))},handleStreamlinePluginName=e=>/^@[^/]+\/picgo-plugin-/.test(e)?e.replace(/^@[^/]+\/picgo-plugin-/,""):e.replace(/picgo-plugin-/,""),handleCompletePluginName=(e,t="")=>t?`@${t}/picgo-plugin-${e}`:`picgo-plugin-${e}`,getProcessPluginName=(e,t=console)=>{switch(getPluginNameType(e)){case"normal":case"scope":return e;case"simple":return handleCompletePluginName(e);default:{let n=e;return path.isAbsolute(e)&&fs.existsSync(e)?handleUnixStylePath(n):(n=path.join(process.cwd(),e),fs.existsSync(n)?handleUnixStylePath(n):(t.warn(`Can't find plugin ${e}`),""))}}},getNormalPluginName=(e,t=console)=>{var n;switch(getPluginNameType(e)){case"normal":return removePluginVersion(e);case"scope":return removePluginVersion(e,!0);case"simple":return removePluginVersion(handleCompletePluginName(e));default:{if(!fs.existsSync(e))return t.warn(`Can't find plugin: ${e}`),"";const r=path.posix.join(e,"package.json");if(fs.existsSync(r)){const e=fs.readJSONSync(r)||{};return(null===(n=e.name)||void 0===n?void 0:n.includes("picgo-plugin-"))?e.name:(t.warn(`The plugin package.json's name filed is ${e.name||"empty"}, need to include the prefix: picgo-plugin-`),"")}return t.warn(`Can't find plugin: ${e}`),""}}},handleUnixStylePath=e=>e.split(path.sep).join("/"),removePluginVersion=(e,t=!1)=>{if(e.includes("@")){let n=/(.+\/)?(picgo-plugin-\w+)(@.+)*/;t&&(n=/(.+\/)?(^@[^/]+\/picgo-plugin-\w+)(@.+)*/);const r=e.match(n);return r?r[2]:(console.warn("can not remove plugin version"),e)}return e},configBlackList=[],isConfigKeyInBlackList=e=>configBlackList.some((t=>e.startsWith(t))),isInputConfigValid=e=>"object"==typeof e&&!Array.isArray(e)&&Object.keys(e).length>0;function safeParse(e){try{return JSON.parse(e)}catch(t){return e}}const forceNumber=(e=0)=>isNaN(Number(e))?0:Number(e),isDev=()=>"development"===process.env.NODE_ENV,isProd=()=>"production"===process.env.NODE_ENV;async function text2SVG(e,t,n,r){t=t||"测试",r=r||e;const i={anchor:"top",attributes:{fill:n=n||"rgba(204, 204, 204, 0.45)"}},a=TextToSVG.loadSync(r).getSVG(t,i);return Buffer.from(a)}const defaultWatermarkImagePath=path.join(__dirname,"assets","piclist.png");async function AddWatermark(e,t,n,r,i,a,s,o,l,E,I){o=!o||o<0||o>1?.15:o;const c=sharp(e,{animated:!0}),{width:u=200}=await c.metadata(),_=await createWatermark(t,n,a,s,o,l,E,u,i);return await c.composite([{input:_,gravity:I||"southeast",tile:r}]).toBuffer()}async function createWatermark(e,t,n,r,i,a,s,o=200,l=0){let E;"image"===e?(s=s||defaultWatermarkImagePath,E=await sharp(s).toBuffer()):E=await text2SVG(t,n,a,r||t);const{width:I,height:c}=await getSize(E),u=Math.floor(o*forceNumber(i)),_=Math.floor(u*c/I);return await sharp(E).resize(u,_,{fit:"inside"}).rotate(l,{background:{r:255,g:255,b:255,alpha:0}}).toBuffer()}async function getSize(e){const{width:t,height:n}=await sharp(e).metadata();return{width:t||200,height:n||200}}const validParam=(...e)=>e.every((e=>null!=e&&("string"==typeof e?""!==e:"number"==typeof e?e>0:"object"!=typeof e||Object.keys(e).length>0))),availableConvertFormatList=["avif","dz","fits","gif","heif","input","jpeg","jpg","jp2","jxl","magick","openslide","pdf","png","ppm","raw","svg","tiff","tif","v","webp"],validOutputFormat=e=>availableConvertFormatList.includes(e),imageExtList=["jpg","jpeg","png","webp","bmp","tiff","tif","svg","ico","avif","heif","heic"];async function imageAddWaterMark(e,t,n){try{let r=sharp(e,{animated:!0});return validParam(t.watermarkText)&&(r=sharp(await AddWatermark(e,t.watermarkType||"text",n,t.isFullScreenWatermark,forceNumber(t.watermarkDegree),t.watermarkText,t.watermarkFontPath,forceNumber(t.watermarkScaleRatio),t.watermarkColor,t.watermarkImagePath,t.watermarkPosition),{animated:!0})),await r.toBuffer()}catch(t){return console.log(t),e}}function formatOptions(e){return{quality:forceNumber(e.quality),isConvert:e.isConvert||!1,convertFormat:e.convertFormat||"jpg",isReSize:e.isReSize||!1,reSizeHeight:forceNumber(e.reSizeHeight),reSizeWidth:forceNumber(e.reSizeWidth),skipReSizeOfSmallImg:e.skipReSizeOfSmallImg||!1,isReSizeByPercent:e.isReSizeByPercent||!1,reSizePercent:forceNumber(e.reSizePercent),isRotate:e.isRotate||!1,isFlip:e.isFlip||!1,isFlop:e.isFlop||!1,rotateDegree:forceNumber(e.rotateDegree),picBed:e.picBed||"smms"}}async function imageProcess(e,t,n){t=formatOptions(t);try{if(n=n.toLowerCase().replace(".",""),!imageExtList.includes(n))return e;let r=sharp(e,{animated:!0}),i=100;if(validParam(t.quality)&&t.quality<100&&(i=t.quality),t.isReSizeByPercent){if(validParam(t.reSizePercent)){const e=await r.metadata().then((e=>e.width)),n=await r.metadata().then((e=>e.height));e&&n&&(r=r.resize(Math.round(e*t.reSizePercent/100),Math.round(n*t.reSizePercent/100),{fit:"inside"}))}}else if(t.isReSize)if("number"==typeof t.reSizeHeight&&t.reSizeHeight>0&&"number"==typeof t.reSizeWidth&&t.reSizeWidth>0)r=r.resize(t.reSizeWidth,t.reSizeHeight,{fit:"fill"});else if("number"==typeof t.reSizeHeight&&t.reSizeHeight>0&&("number"!=typeof t.reSizeWidth||0===t.reSizeWidth)){const e=await r.metadata().then((e=>e.width)),n=await r.metadata().then((e=>e.height));if(e&&n&&(!t.skipReSizeOfSmallImg||t.skipReSizeOfSmallImg&&t.reSizeHeight<n)){const i=t.reSizeHeight/n;r=r.resize(Math.round(e*i),t.reSizeHeight,{fit:"inside"})}}else if("number"==typeof t.reSizeWidth&&t.reSizeWidth>0&&("number"!=typeof t.reSizeHeight||0===t.reSizeHeight)){const e=await r.metadata().then((e=>e.width)),n=await r.metadata().then((e=>e.height));if(e&&n&&(!t.skipReSizeOfSmallImg||t.skipReSizeOfSmallImg&&t.reSizeWidth<e)){const i=t.reSizeWidth/e;r=r.resize(t.reSizeWidth,Math.round(n*i),{fit:"inside"})}}if(t.isRotate&&t.rotateDegree&&(r=r.rotate(t.rotateDegree,{background:{r:255,g:255,b:255,alpha:0}})),t.isFlip&&(console.log("flip"),r=r.flip()),t.isFlop&&(r=r.flop()),t.isConvert){let e=t.convertFormat||"jpg";"imgur"===t.picBed&&"webp"===e&&(e="jpg"),r=r.toFormat(e,{quality:i})}else r=n&&validOutputFormat(n)?r.toFormat(n,{quality:i}):r.toFormat("jpg",{quality:i});return await r.toBuffer()}catch(t){return console.log(t),e}}const imageFormatList=["jpg","jpeg","png","webp","bmp","tiff","tif","svg","ico","avif","heif","heic","gif"],needAddWatermark=(e,t)=>(t=t.toLowerCase().replace(".",""),!!e&&!!e.isAddWatermark&&imageFormatList.includes(t)),needCompress=(e,t)=>{const n=t.toLowerCase().replace(".","");if(!imageFormatList.includes(n)||!e)return!1;const{quality:r,isReSizeByPercent:i,reSizePercent:a,isReSize:s,reSizeHeight:o,reSizeWidth:l,isRotate:E,rotateDegree:I,isConvert:c,convertFormat:u,isFlip:_,isFlop:p}=formatOptions(e);if(validParam(r)&&r<100)return!0;if(i&&validParam(a))return!0;if(s&&("number"==typeof o&&o>0||"number"==typeof l&&l>0))return!0;if(E&&I)return!0;if(_||p)return!0;if(c){return t!==(u||"jpg")}return!1},removeExif=async(e,t)=>(t=t.toLowerCase().replace(".",""),imageFormatList.includes(t)?await sharp(e,{animated:!0}).toBuffer():e);var common=Object.freeze({__proto__:null,randomStringGenerator:randomStringGenerator,renameFileNameWithTimestamp:renameFileNameWithTimestamp,renameFileNameWithRandomString:renameFileNameWithRandomString,renameFileNameWithCustomString:renameFileNameWithCustomString,isUrl:isUrl,isUrlEncode:isUrlEncode,handleUrlEncode:handleUrlEncode,getImageSize:getImageSize,getFSFile:getFSFile,getURLFile:getURLFile,getPluginNameType:getPluginNameType,isSimpleName:isSimpleName,handleStreamlinePluginName:handleStreamlinePluginName,handleCompletePluginName:handleCompletePluginName,getProcessPluginName:getProcessPluginName,getNormalPluginName:getNormalPluginName,handleUnixStylePath:handleUnixStylePath,removePluginVersion:removePluginVersion,configBlackList:configBlackList,isConfigKeyInBlackList:isConfigKeyInBlackList,isInputConfigValid:isInputConfigValid,safeParse:safeParse,forceNumber:forceNumber,isDev:isDev,isProd:isProd,AddWatermark:AddWatermark,imageAddWaterMark:imageAddWaterMark,imageProcess:imageProcess,needAddWatermark:needAddWatermark,needCompress:needCompress,removeExif:removeExif});const upload={handle:e=>{e.cmd.program.command("upload").description("upload, go go go").arguments("[input...]").alias("u").action((t=>{(async()=>{const n=t.map((e=>isUrl(e)?e:path.resolve(e))).filter((t=>{const n=fs.existsSync(t)||isUrl(t);return n||e.log.warn(`${t} does not exist.`),n}));await e.upload(n)})().catch((t=>{e.log.error(t)}))}))}},config$e=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:"skipReSizeOfSmallImg",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_SKIPRESIZEOFSMALLIMG")},required:!1,default:t.skipReSizeOfSmallImg||!1},{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:"isFlip",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISFLIP")},required:!1,default:t.isFlip||!1},{name:"isFlop",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISFLOP")},required:!1,default:t.isFlop||!1},{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 compress={config:config$e};const config$d=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 watermark={config:config$d};const config$c=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}]};var rename={config:config$c};const handleConfig=async(e,t,n,r)=>{const i=await e.cmd.inquirer.prompt(t),a="uploader"===n?`picBed.${r}`:"transformer"===n?`transformer.${r}`:"buildin"===n?`buildIn.${r}`:r;e.saveConfig({[a]:i}),"uploader"===n?e.saveConfig({"picBed.current":r,"picBed.uploader":r}):"transformer"===n&&e.saveConfig({"picBed.transformer":r})},setting={handle:e=>{e.cmd.program.command("set").alias("config").arguments("<module> [name]").description("configure config of picgo modules, uploader|transformer|plugin|buildin").action(((t,n)=>{(async()=>{var r,i;try{switch(t){case"buildin":if("compress"===n)await handleConfig(e,compress.config(e),t,n);else if("watermark"===n)await handleConfig(e,watermark.config(e),t,n);else if("rename"===n)await handleConfig(e,rename.config(e),t,n);else{const n=[{type:"list",name:"buildin",choices:["compress","watermark","rename"],message:"Choose a buildin module"}],r=await e.cmd.inquirer.prompt(n);"compress"===r.buildin?await handleConfig(e,compress.config(e),t,r.buildin):"watermark"===r.buildin?await handleConfig(e,watermark.config(e),t,r.buildin):"rename"===r.buildin&&await handleConfig(e,rename.config(e),t,r.buildin)}break;case"uploader":case"transformer":if(n){const r=e.helper[t].get(n);if(!r)return void e.log.error(`No ${t} named ${n}`);r.config&&await handleConfig(e,r.config(e),t,n)}else{const n=[{type:"list",name:`${t}`,choices:e.helper[t].getIdList(),message:`Choose a(n) ${t}`}],r=await e.cmd.inquirer.prompt(n),i=e.helper[t].get(r[t]);(null==i?void 0:i.config)&&await handleConfig(e,i.config(e),t,r[t])}break;case"plugin":if(n){if(n.includes("picgo-plugin-")||(n=`picgo-plugin-${n}`),!Object.keys(e.getConfig("picgoPlugins")).includes(n))return void e.log.error(`No plugin named ${n}`);(null===(r=e.pluginLoader.getPlugin(n))||void 0===r?void 0:r.config)&&await handleConfig(e,e.pluginLoader.getPlugin(n).config(e),"plugin",n)}else{const t=[{type:"list",name:"plugin",choices:e.pluginLoader.getFullList(),message:"Choose a plugin"}],n=await e.cmd.inquirer.prompt(t);(null===(i=e.pluginLoader.getPlugin(n.plugin))||void 0===i?void 0:i.config)&&await handleConfig(e,e.pluginLoader.getPlugin(n.plugin).config(e),"plugin",n.plugin)}break;default:return e.log.warn(`No module named ${t}`),void 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)}))}))}},use={handle:async e=>{const t=e.cmd;t.program.command("use").arguments("[module]").description("use modules of picgo").action((n=>{(async()=>{try{let r=[];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(n){if(!i[n])return e.log.warn(`No module named ${n}`),void e.log.warn("Available modules are uploader|transformer|plugins");r.push(i[n])}else r=Object.keys(i).map((e=>i[e]));const a=await t.inquirer.prompt(r);if(a.plugins){const t=e.getConfig("picgoPlugins");Object.keys(t).forEach((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)}))}))}},proxy={handle:e=>{e.cmd.program.option("-p, --proxy <url>","set proxy for uploading",(t=>{e.setConfig({"picBed.proxy":t})}))}},generate=async(e,t)=>{try{const n=getOptions$1(t.tmp),r=path.join(t.tmp,"template");let i={};n.prompts&&n.prompts.length>0&&(i=await e.cmd.inquirer.prompt(n.prompts));let a=await globby(["**/*"],{cwd:r,dot:!0});if(a=a.filter((t=>{let r="";return Object.keys(n.filters).forEach((e=>{match(t,e,{dot:!0})&&(r=t)})),!r||filters(e,n.filters[r],i)})),0===a.length)return void e.log.warn("Template files not found!");const s=render(a,r,i);writeFileTree(t.dest,s),"function"==typeof n.complete&&n.complete({answers:i,options:t,files:a,ctx:e}),n.completeMessage&&e.log.success(n.completeMessage),e.log.success("Done!")}catch(t){e.log.error(t)}},filters=(e,t,n)=>{const r=new Function("data","with (data) { return "+t+"}");try{return r(n)}catch(n){return e.log.error(`Error when evaluating filter condition: ${JSON.stringify(t)}`),!1}},getOptions$1=e=>{const t=path.join(e,"index.js");if(fs.existsSync(t)){return require(t)}return{}},render=(e,t,n)=>{const r={};return e.forEach((e=>{const i=fs.readFileSync(path.join(t,e),"utf8"),a=ejs.render(i,n);(Buffer.isBuffer(a)||/[^\s]/.test(a))&&(r[e]=a)})),r},writeFileTree=(e,t)=>{Object.keys(t).forEach((n=>{const r=path.join(e,n);fs.ensureDirSync(path.dirname(r)),fs.writeFileSync(r,t[n])}))},run=(e,t)=>{t.offline?fs.existsSync(t.template)?generate(e,t).catch((t=>{e.log.error(t)})):e.log.error(`Local template ${t.template} not found`):(t.template=t.hasSlash?t.template:"PicGo/picgo-template-"+t.template,downloadAndGenerate(e,t))},downloadAndGenerate=(e,t)=>{fs.existsSync(t.tmp)&&rm.sync(t.tmp),e.log.info("Template files are downloading..."),download(t.template,t.tmp,{clone:t.clone},(n=>{n?e.log.error(n):(e.log.success("Template files are downloaded!"),generate(e,t).catch((t=>{e.log.error(t)})))}))},init={handle:async e=>{e.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(((t,n,r)=>{(async()=>{try{const i=t.includes("/"),a=!n||"."===n,s=path.resolve(n||"."),o=r.clone||!1,l=r.offline||!1,E=path.join(homedir(),".picgo/templates",t.replace(/[/:]/g,"-"));r.offline&&(t=E);const I={template:t,project:n,hasSlash:i,inPlace:a,dest:s,clone:o,tmp:E,offline:l};a||fs.existsSync(s)?await e.cmd.inquirer.prompt([{type:"confirm",message:a?"Generate project in current directory?":"Target directory exists. Continue?",name:"ok"}]).then((t=>{t.ok&&run(e,I)})):run(e,I)}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))})).on("--help",(()=>{console.log(),console.log("Examples:"),console.log(),console.log(chalk.gray(" # create a new project with an official template")),console.log(" $ picgo init plugin my-project"),console.log(),console.log(chalk.gray(" # create a new project straight from a github template")),console.log(" $ picgo init username/repo my-project"),console.log()}))}},i18n={handle:e=>{e.cmd.program.command("i18n").arguments("[lang]").description("change picgo language").action((async(t="")=>{const n=e.i18n.getLanguageList();if(!t){const t=[{type:"list",name:"i18n",choices:n,message:"Choose a language",default:e.getConfig("settings.language")||"zh-CN"}],r=await e.cmd.inquirer.prompt(t);return e.i18n.setLanguage(r.i18n),void e.log.success(`Language set to ${r.i18n}`)}n.includes(t)?(e.i18n.setLanguage(t),e.log.success(`Language set to ${t}`)):e.log.warn("No such language")}))}};var commanders=e=>{e.cmd.register("pluginHandler",pluginHandler),e.cmd.register("config",config$f),e.cmd.register("setting",setting),e.cmd.register("upload",upload),e.cmd.register("use",use),e.cmd.register("proxy",proxy),e.cmd.register("init",init),e.cmd.register("i18n",i18n)};class LifecyclePlugins{constructor(e){this.name=e,this.list=new Map,this.pluginIdMap=new Map}register(e,t){var n;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),LifecyclePlugins.currentPlugin&&(this.pluginIdMap.has(LifecyclePlugins.currentPlugin)?null===(n=this.pluginIdMap.get(LifecyclePlugins.currentPlugin))||void 0===n||n.push(e):this.pluginIdMap.set(LifecyclePlugins.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 setCurrentPluginName=(e=null)=>{LifecyclePlugins.currentPlugin=e},getCurrentPluginName=()=>LifecyclePlugins.currentPlugin;class Commander{constructor(e){this.name="commander",this.list=new Map,this.pluginIdMap=new Map,this.program=new Command,this.inquirer=inquirer,this.ctx=e}getName(){return this.name}init(){this.program.version("1.3.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)})),commanders(this.ctx)}register(e,t){var n;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 r=getCurrentPluginName();null!==r&&(this.pluginIdMap.has(r)?null===(n=this.pluginIdMap.get(r))||void 0===n||n.push(e):this.pluginIdMap.set(r,[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 ILogType,IBuildInEvent,IBusEvent;!function(e){e.success="success",e.info="info",e.warn="warn",e.error="error"}(ILogType||(ILogType={})),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"}(IBuildInEvent||(IBuildInEvent={})),function(e){e.CONFIG_CHANGE="CONFIG_CHANGE"}(IBusEvent||(IBusEvent={}));class Logger{constructor(e){this.level={[ILogType.success]:"green",[ILogType.info]:"blue",[ILogType.warn]:"yellow",[ILogType.error]:"red"},this.ctx=e}handleLog(e,...t){if(this.logLevel=this.ctx.getConfig("settings.logLevel"),!this.ctx.getConfig("silent")&&this.checkLogLevel(e,this.logLevel)){const n=chalk[this.level[e]](`[PicList ${e.toUpperCase()}]:`);console.log(n,...t),this.logPath=this.ctx.getConfig("settings.logPath")||path.join(this.ctx.baseDir,"./piclist.log"),setTimeout((()=>{try{const n=this.checkLogFileIsLarge(this.logPath);if(n.isLarge){const e=`Log file is too large (> ${n.logFileSizeLimit/1024/1024||"10"} MB), recreate log file`;console.log(chalk.yellow("[PicList WARN]:"),e),this.recreateLogFile(this.logPath),t.unshift(e)}this.handleWriteLog(this.logPath,e,...t)}catch(e){console.error("[PicList Error] on checking log file size",e)}}),0)}}checkLogFileIsLarge(e){if(fs.existsSync(e)){const t=fs.statSync(e).size,n=1024*forceNumber(this.ctx.getConfig("settings.logFileSizeLimit")||10)*1024;return{isLarge:t>n,logFileSize:t,logFileSizeLimit:n}}return{isLarge:!1}}recreateLogFile(e){fs.existsSync(e)&&(fs.unlinkSync(e),fs.createFileSync(e))}handleWriteLog(e,t,...n){try{let r=`${dayjs().format("YYYY-MM-DD HH:mm:ss")} [PicList ${t.toUpperCase()}] `;n.forEach((e=>{e instanceof Error&&"error"===t?r+=`\n------Error Stack Begin------\n${util.format(null==e?void 0:e.stack)}\n-------Error Stack End------- `:("object"==typeof e&&(e=JSON.stringify(e,null,2)),r+=`${e} `)})),r+="\n",fs.appendFileSync(e,r)}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){this.handleLog(ILogType.success,...e)}info(...e){this.handleLog(ILogType.info,...e)}error(...e){this.handleLog(ILogType.error,...e)}warn(...e){this.handleLog(ILogType.warn,...e)}debug(...e){isDev()&&this.handleLog(ILogType.info,...e)}}const createContext=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)});class Lifecycle extends EventEmitter{constructor(e){super(),this.ttfLink="https://release.piclist.cn/simhei.ttf",this.ctx=e;const t=path.join(e.baseDir,"piclistTemp"),n=path.join(e.baseDir,"imgTemp");fs.ensureDirSync(n),fs.emptyDirSync(t),this.ttfPath=path.join(e.baseDir,"assets","simhei.ttf")}async downloadTTF(){const e=path.dirname(this.ttfPath);if(fs.existsSync(e)||fs.mkdirSync(e,{recursive:!0}),fs.existsSync(this.ttfPath))return!0;this.ctx.log.info("Download ttf file.");try{const e=await axios.get(this.ttfLink,{responseType:"arraybuffer"});return fs.writeFileSync(this.ttfPath,e.data),this.ctx.log.info("Download ttf file success."),!0}catch(e){return this.ctx.log.error("Download ttf file failed."),!1}}async start(e){const t=createContext(this.ctx);try{if(!Array.isArray(e))throw new Error("Input must be an array.");t.input=e,t.rawInputPath=[],t.rawInput=cloneDeep(e),t.output=[];const n=t.getConfig("buildIn.compress"),r=t.getConfig("picBed.uploader")||t.getConfig("picBed.current")||"smms";!t.helper.uploader.get(r)&&n?n.picBed="smms":n&&(n.picBed=r);const i=t.getConfig("buildIn.watermark");if(n||i){const e=path.join(t.baseDir,"piclistTemp");fs.existsSync(e)||fs.mkdirSync(e);const r="Add watermark to image",a="Compress or convert image";await Promise.allSettled(t.input.map((async(s,o)=>{var l,E,I,c,u,_,p;let S;if(isUrl(s)){if(t.rawInputPath[o]=s,S=await getURLFile(s,t),!S.success||!S.buffer)throw new Error(S.reason);{let p,g=!1;if(needAddWatermark(i,null!==(l=S.extname)&&void 0!==l?l:"")){if(!(null==i?void 0:i.watermarkFontPath)&&"image"!==(null==i?void 0:i.watermarkType)){await this.downloadTTF()||(this.ctx.log.warn("Download ttf file failed, skip add watermark."),g=!0)}g||(t.log.info(r),p=await imageAddWaterMark(S.buffer,i,this.ttfPath))}if(needCompress(n,null!==(E=S.extname)&&void 0!==E?E:"")&&(t.log.info(a),p=await imageProcess(null!=p?p:S.buffer,n,null!==(I=S.extname)&&void 0!==I?I:"")),!p&&(null==n?void 0:n.isRemoveExif)&&(t.log.info("Remove exif info."),p=await removeExif(S.buffer,null!==(c=S.extname)&&void 0!==c?c:"")),p){let r;r=(null==n?void 0:n.isConvert)?null!==(u=null==n?void 0:n.convertFormat)&&void 0!==u?u:"jpg":null!==(_=S.extname)&&void 0!==_?_:"",r=r.startsWith(".")?r:`.${r}`;const i=path.join(e,`${S.fileName?`${path.basename(S.fileName,path.extname(S.fileName))}${r}`:(new Date).getTime()}${r}`);t.rawInputPath[o]=path.join(path.dirname(s),path.basename(i)),fs.writeFileSync(i,p),t.input[o]=i}}}else{let l;if(t.rawInputPath[o]=s,needAddWatermark(i,path.extname(s))){await this.downloadTTF()?(t.log.info(r),l=await imageAddWaterMark(fs.readFileSync(s),i,this.ttfPath)):this.ctx.log.warn("Download ttf file failed, skip add watermark.")}if(needCompress(n,path.extname(s)))if(t.log.info(a),".heic"===path.extname(s)||".heif"===path.extname(s)){const t=fs.readFileSync(s),r=await heicConvert({buffer:t,format:"JPEG",quality:1}),i=path.join(e,`${path.basename(s,path.extname(s))}.jpg`);fs.writeFileSync(i,Buffer.from(r)),l=await imageProcess(fs.readFileSync(i),n,".jpg")}else l=await imageProcess(null!=l?l:fs.readFileSync(s),n,path.extname(s));if(!l&&(null==n?void 0:n.isRemoveExif)&&(t.log.info("Remove exif info."),l=await removeExif(fs.readFileSync(s),path.extname(s))),l){let r;r=(null==n?void 0:n.isConvert)?null!==(p=null==n?void 0:n.convertFormat)&&void 0!==p?p:"jpg":path.extname(s),r=r.startsWith(".")?r:`.${r}`;const i=path.join(e,`${path.basename(s,path.extname(s))}${r}`);t.rawInputPath[o]=path.join(path.dirname(s),`${path.basename(s,path.extname(s))}${r}`),fs.writeFileSync(i,l),t.input[o]=i}}})))}else for(const e of t.input)t.rawInputPath.push(e);await this.beforeTransform(t),await this.doTransform(t);const a=t.getConfig("buildIn.rename")||{};if(a.enable){const e=a.format||"{filename}";t.output=t.output.map(((n,r)=>{let i=n.fileName;return e&&(i=renameFileNameWithCustomString(t.rawInputPath[r],e),i=i.replace(/\/+/g,"/"),"/"===i.slice(-1)&&(i+=r.toString())),n.fileName=i,n}))}return await this.beforeUpload(t),await this.doUpload(t),t.input=t.rawInput,await this.afterUpload(t),t}catch(e){if(t.log.warn(IBuildInEvent.FAILED),t.emit(IBuildInEvent.UPLOAD_PROGRESS,-1),t.emit(IBuildInEvent.FAILED,e),t.log.error(e),t.getConfig("debug"))throw e;return t}}async beforeTransform(e){return e.emit(IBuildInEvent.UPLOAD_PROGRESS,0),e.emit(IBuildInEvent.BEFORE_TRANSFORM,e),e.log.info("Before transform"),await this.handlePlugins(e.helper.beforeTransformPlugins,e),e}async doTransform(e){e.emit(IBuildInEvent.UPLOAD_PROGRESS,30);const t=e.getConfig("picBed.transformer")||"path";let n=t,r=e.helper.transformer.get(t);return r||(r=e.helper.transformer.get("path"),n="path",e.log.warn(`Can't find transformer - ${t}, switch to default transformer - path`)),e.log.info(`Transforming... Current transformer is [${n}]`),await(null==r?void 0:r.handle(e)),e}async beforeUpload(e){return e.emit(IBuildInEvent.UPLOAD_PROGRESS,60),e.log.info("Before upload"),e.emit(IBuildInEvent.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",n=e.helper.uploader.get(t),r=t;n||(t="smms",r="smms",n=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 [${r}]`),await(null==n?void 0:n.handle(e));for(const n of e.output)n.type=t;return e}async afterUpload(e){e.emit(IBuildInEvent.AFTER_UPLOAD,e),e.emit(IBuildInEvent.UPLOAD_PROGRESS,100),await this.handlePlugins(e.helper.afterUploadPlugins,e);let t="";const n=e.output.length,r=!0===e.getConfig("settings.encodeOutputURL");for(let i=0;i<n;i++)void 0!==e.output[i].imgUrl&&(t+=r?handleUrlEncode(e.output[i].imgUrl):e.output[i].imgUrl,i!==n-1&&(t+="\n")),delete e.output[i].base64Image,delete e.output[i].buffer;return e.emit(IBuildInEvent.FINISHED,e),e.log.success(`\n${t}`),e}async handlePlugins(e,t){const n=e.getList(),r=e.getIdList(),i=e.getName();return await Promise.all(n.map((async(e,n)=>{try{t.log.info(`${i}: ${r[n]} running`),await e.handle(t)}catch(e){throw t.log.error(`${i}: ${r[n]} error`),e}}))),t}}const postOptions$8=(e,t,n,r="")=>({method:"POST",url:`https://${r||"sm.ms"}/api/v2/upload`,headers:{contentType:"multipart/form-data","User-Agent":"PicList",Authorization:n},formData:{smfile:{value:t,options:{filename:e}},ssl:"true"}}),handle$d=async e=>{const t=e.getConfig("picBed.smms");if(!t)throw new Error("Can not find smms config!");const n=e.output;for(const r of n)if(r.fileName&&r.buffer){let n=r.buffer;!n&&r.base64Image&&(n=Buffer.from(r.base64Image,"base64"));const i=postOptions$8(r.fileName,n,null==t?void 0:t.token,null==t?void 0:t.backupDomain);try{const t=await e.request(i),n=JSON.parse(t);if("success"===n.code)delete r.base64Image,delete r.buffer,r.imgUrl=n.data.url,r.hash=n.data.hash;else{if("image_repeated"!==n.code||"string"!=typeof n.images)throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:n.message}),new Error(n.message);delete r.base64Image,delete r.buffer,r.imgUrl=n.images}}catch(t){throw e.log.error(t),t}}return e},config$b=e=>{const t=e.getConfig("picBed.smms")||{};return[{name:"token",message:"api token",type:"input",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}]};function register$b(e){e.helper.uploader.register("smms",{get name(){return e.i18n.translate("PICBED_SMMS")},handle:handle$d,config:config$b})}const generateSignature$2=(e,t)=>{const n=e.secretId,r=e.secretKey,i=e.appId,a=e.bucket;let s,o="";if(e.version&&"v4"!==e.version){const n=Math.floor((new Date).getTime()/1e3);o=`${n};${n+86400}`;const i=crypto.createHmac("sha1",r).update(o).digest("hex"),a=e.endpoint?e.endpoint:`cos.${e.area}.myqcloud.com`,l=`put\n/${e.path}${t}\n\nhost=${e.bucket}.${a}\n`,E=`sha1\n${o}\n${crypto.createHash("sha1").update(l).digest("hex")}\n`;s=crypto.createHmac("sha1",i).update(E).digest("hex")}else{const e=Math.floor(1e10*Math.random()),t=Math.floor((new Date).getTime()/1e3)-1,o=`a=${i}&b=${a}&k=${n}&e=${t+3600}&t=${t}&r=${e}&f=`,l=crypto.createHmac("sha1",r).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}},postOptions$7=(e,t,n,r,i)=>{const a=e.area,s=e.path;if(e.version&&"v4"!==e.version){const a=e.endpoint?e.endpoint:`cos.${e.area}.myqcloud.com`;return{method:"PUT",url:`http://${e.bucket}.${a}/${encodeURIComponent(s)}${encodeURIComponent(t)}`,headers:{Host:`${e.bucket}.${a}`,Authorization:`q-sign-algorithm=sha1&q-ak=${e.secretId}&q-sign-time=${n.signTime}&q-key-time=${n.signTime}&q-header-list=host&q-url-param-list=&q-signature=${n.signature}`,contentType:mime.lookup(t)||"application/octet-stream","User-Agent":`PicGo;${i};null;null`},body:r,resolveWithFullResponse:!0}}return{method:"POST",url:`http://${a}.file.myqcloud.com/files/v2/${n.appId}/${n.bucket}/${encodeURI(s)}${t}`,headers:{Host:`${a}.file.myqcloud.com`,Authorization:n.signature,contentType:"multipart/form-data","User-Agent":`PicGo;${i};null;null`},formData:{op:"upload",filecontent:r},resolveWithFullResponse:!0}},handle$c=async e=>{var t,n,r,i;const a=e.getConfig("picBed.tcyun");if(!a)throw new Error("Can't find tencent COS config");try{const s=e.output,o=a.customUrl,l=null!==(t=a.path)&&void 0!==t?t:"",E=!a.version||"v4"===a.version;for(const t of s)if(t.fileName&&t.buffer){const s=generateSignature$2(a,t.fileName);if(!s)return!1;let I=t.buffer;!I&&t.base64Image&&(I=Buffer.from(t.base64Image,"base64"));const c=postOptions$7(a,t.fileName,s,I,e.GUI_VERSION||e.VERSION),u=await e.request(c).then((e=>e)).catch((t=>({statusCode:400,body:{msg:e.i18n.translate("AUTH_FAILED"),err:t}})));let _;if(_=E&&"string"==typeof u?JSON.parse(u):u,400===_.statusCode)throw(null===(n=null==_?void 0:_.body)||void 0===n?void 0:n.err)?_.body.err:new Error((null===(r=null==_?void 0:_.body)||void 0===r?void 0:r.msg)||(null===(i=null==_?void 0:_.body)||void 0===i?void 0:i.message));const p=a.options||"",S=void 0!==a.slim&&!!a.slim;if(E&&"SUCCESS"===_.message)delete t.base64Image,delete t.buffer,t.imgUrl=o?`${o}/${l}${t.fileName}`:`${_.data.source_url}${p}`;else{if(E||!_||200!==_.statusCode)throw new Error(u.body.msg);if(delete t.base64Image,delete t.buffer,o)t.imgUrl=`${o}/${encodeURIComponent(l)}${encodeURIComponent(t.fileName)}${p}`.replace(/%2F/g,"/");else{const e=a.endpoint?a.endpoint:`cos.${a.area}.myqcloud.com`;t.imgUrl=`https://${a.bucket}.${e}/${encodeURIComponent(l)}${encodeURIComponent(t.fileName)}${p}`.replace(/%2F/g,"/")}}S&&(t.imgUrl+=p?"&imageSlim":"?imageSlim")}return e}catch(t){if(!a.version||"v4"===a.version)try{const n=JSON.parse(t.error);e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:n.code}),text:"https://cloud.tencent.com/document/product/436/8432"})}catch(e){}throw t}},config$a=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:"input",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:"endpoint",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_ENDPOINT")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_ENDPOINT")},default:t.endpoint||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_ENDPOINT")},required:!1},{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},{name:"slim",type:"confirm",default:void 0!==t.slim&&!!t.slim,get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_SLIM")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SLIM")},required:!1,get confirmText(){return e.i18n.translate("PICBED_TENCENTCLOUD_SLIM_CONFIRM")},get cancelText(){return e.i18n.translate("PICBED_TENCENTCLOUD_SLIM_CANCEL")},get tips(){return e.i18n.translate("PICBED_TENCENTCLOUD_SLIM_TIP")}}]};function register$a(e){e.helper.uploader.register("tcyun",{get name(){return e.i18n.translate("PICBED_TENCENTCLOUD")},handle:handle$c,config:config$a})}const postOptions$6=(e,t,n)=>{const r=t.path||"",{token:i,repo:a}=t;return{method:"PUT",url:`https://api.github.com/repos/${a}/contents/${encodeURIComponent(r)}${encodeURIComponent(e)}`.replace(/%2F/g,"/"),headers:{Authorization:`token ${i}`,"User-Agent":"PicList","Content-Type":mime.lookup(e)||"application/octet-stream"},body:n,json:!0}},getOptions=(e,t)=>{const n=t.path||"",{token:r,repo:i,branch:a}=t;return{method:"GET",url:`https://api.github.com/repos/${i}/contents/${encodeURIComponent(n)}${encodeURIComponent(e)}?ref=${a}`.replace(/%2F/g,"/"),headers:{Authorization:`token ${r}`,"User-Agent":"PicGo"},json:!0}},handle$b=async e=>{const t=e.getConfig("picBed.github");if(!t)throw new Error("Can't find github config");try{const n=e.output,r=t.path||"";for(const i of n)if(i.fileName&&i.buffer){const n=i.base64Image||Buffer.from(i.buffer).toString("base64"),a={message:"Upload by PicList",branch:t.branch,content:n,path:r+encodeURI(i.fileName)},s=postOptions$6(i.fileName,t,a);try{const n=await e.request(s);if(!n)throw new Error("Server error, please try again");delete i.base64Image,delete i.buffer,t.customUrl?i.imgUrl=`${t.customUrl}/${encodeURIComponent(r)}${encodeURIComponent(i.fileName)}`.replace(/%2F/g,"/"):i.imgUrl=n.content.download_url,i.hash=n.content.sha}catch(n){if(422!==n.statusCode)throw n;{delete i.base64Image,delete i.buffer;const n=await e.request(getOptions(i.fileName,t));if(!Object.keys(n).length)throw new Error("Get Contents error, please try again");i.hash=n.sha,t.customUrl?i.imgUrl=`${t.customUrl}/${encodeURIComponent(r)}${encodeURIComponent(i.fileName)}`.replace(/%2F/g,"/"):i.imgUrl=n.download_url}}}return e}catch(t){throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK")}),t}},config$9=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:"input",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 register$9(e){e.helper.uploader.register("github",{get name(){return e.i18n.translate("PICBED_GITHUB")},handle:handle$b,config:config$9})}function postOptions$5(e,t,n,r){const i=selectArea(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 ${n}`,"Content-Type":mime.lookup(t)||"application/octet-stream"},body:r}}function selectArea(e){return"z0"===e?"":"-"+e}function getToken(e){const t=e.accessKey,n=e.secretKey,r=new qiniu.auth.digest.Mac(t,n),i={scope:e.bucket};return new qiniu.rs.PutPolicy(i).uploadToken(r)}const handle$a=async e=>{const t=e.getConfig("picBed.qiniu");if(!t)throw new Error("Can't find qiniu config");try{const n=e.output;for(const r of n)if(r.fileName&&r.buffer){const n=r.base64Image||Buffer.from(r.buffer).toString("base64"),i=postOptions$5(t,r.fileName,getToken(t),n),a=await e.request(i),s=JSON.parse(a);if(!(null==s?void 0:s.key))throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:s.msg}),e.log.error("qiniu error",s),new Error("Upload failed");{delete r.base64Image,delete r.buffer;const e=t.url,n=t.options||"";r.imgUrl=`${e}/${s.key}${n}`}}return e}catch(t){if("Upload failed"!==t.message&&t.response){const n=t.response.body;e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:n.error})}throw t}},config$8=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:"input",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}]};function register$8(e){e.helper.uploader.register("qiniu",{get name(){return e.i18n.translate("PICBED_QINIU")},handle:handle$a,config:config$8})}const formatAccessToken=e=>e?e.startsWith("Bearer")?e:`Bearer ${e}`:"",postOptions$4=async(e,t,n,r)=>{const i=t.clientId||"",a=t.username||"",s=formatAccessToken(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:r,type:"base64",name:n,description:"Uploaded with PicList"}};if(a&&s&&o){let n,r=0,i="";do{const s={method:"GET",url:`https://api.imgur.com/3/account/${a}/albums/${r}`,headers:{Authorization:l},json:!0,resolveWithFullResponse:!0,timeout:1e4};if(t.proxy&&(s.proxy=t.proxy),n=await e.request(s),200!==n.statusCode||!n.body.success)throw new Error("Server error, please try again");const E=n.body.data;for(const e of E)if(e.title===o){i=e.id;break}r++}while(n.body.data.length>0);i&&E.formData&&(E.formData.album=i)}return t.proxy&&(E.proxy=t.proxy),E},handle$9=async e=>{var t;const n=e.getConfig("picBed.imgur");if(!n)throw new Error("Can't find imgur config");try{const t=e.output;for(const r of t)if(r.fileName&&r.buffer){const t=r.base64Image||Buffer.from(r.buffer).toString("base64"),i=await postOptions$4(e,n,r.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 r.base64Image,delete r.buffer,r.imgUrl=s.data.link,r.hash=s.data.deletehash}return e}catch(n){throw e.emit(IBuildInEvent.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==n?void 0:n.response)||void 0===t?void 0:t.data)||n}},config$7=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}]};function register$7(e){e.helper.uploader.register("imgur",{get name(){return e.i18n.translate("PICBED_IMGUR")},handle:handle$9,config:config$7})}const generateSignature$1=(e,t)=>{const n=(new Date).toUTCString(),r=`PUT\n\n${mime.lookup(t)||"application/octet-stream"}\n${n}\n/${e.bucket}/${e.path}${t}`,i=crypto.createHmac("sha1",e.accessKeySecret).update(r).digest("base64");return`OSS ${e.accessKeyId}:${i}`},postOptions$3=(e,t,n,r)=>({method:"PUT",url:`https://${e.bucket}.${e.area}.aliyuncs.com/${encodeURIComponent(e.path)}${encodeURIComponent(t)}`.replace(/%2F/g,"/"),headers:{Host:`${e.bucket}.${e.area}.aliyuncs.com`,Authorization:n,Date:(new Date).toUTCString(),"Content-Type":mime.lookup(t)},body:r,resolveWithFullResponse:!0}),handle$8=async e=>{var t;const n=e.getConfig("picBed.aliyun");if(!n)throw new Error("Can't find aliYun OSS config");n.path=n.path.replace(/\/*$/,"").replace(/^\/*/,"")+"/","/"===n.path&&(n.path="");try{const r=e.output,i=n.customUrl,a=null!==(t=n.path)&&void 0!==t?t:"";for(const t of r)if(t.fileName&&t.buffer){const r=generateSignature$1(n,t.fileName);let s=t.buffer;!s&&t.base64Image&&(s=Buffer.from(t.base64Image,"base64"));const o=postOptions$3(n,t.fileName,r,s);if(200!==(await e.request(o)).statusCode)throw new Error("Upload failed");{delete t.base64Image,delete t.buffer;const e=n.options||"";t.imgUrl=i?`${i}/${encodeURIComponent(a)}${encodeURIComponent(t.fileName)}${e}`.replace(/%2F/g,"/"):`https://${n.bucket}.${n.area}.aliyuncs.com/${encodeURIComponent(a)}${encodeURIComponent(t.fileName)}${e}`.replace(/%2F/g,"/")}}return e}catch(t){throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},config$6=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:"input",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}]};function register$6(e){e.helper.uploader.register("aliyun",{get name(){return e.i18n.translate("PICBED_ALICLOUD")},handle:handle$8,config:config$6})}const generateSignature=(e,t)=>{const n=e.path||"",r=e.operator,i=MD5(e.password),a=(new Date).toUTCString(),s=`PUT&${`/${e.bucket}/${encodeURIComponent(n)}${encodeURIComponent(t)}`.replace(/%2F/g,"/")}&${a}`;return`UPYUN ${r}:${crypto.createHmac("sha1",i).update(s).digest("base64")}`},postOptions$2=(e,t,n,r)=>{const i=e.bucket,a=e.path||"";return{method:"PUT",url:`https://v0.api.upyun.com/${i}/${encodeURIComponent(a)}${encodeURIComponent(t)}`.replace(/%2F/g,"/"),headers:{Authorization:n,Date:(new Date).toUTCString(),"Content-Type":mime.lookup(t)||"application/octet-stream"},body:r,resolveWithFullResponse:!0}};function MD5(e){return crypto.createHash("md5").update(e).digest("hex")}const getAntiLeechParam=(e,t,n,r)=>{const i=`/${n.path||""}${r}`.replace(/%2F/g,"/").replace(/^\/+/g,"/"),a=Math.round((new Date).getTime()/1e3),s=t?a+parseInt(t.toString(),10):a+1800;return`_upt=${`${MD5(`${e}&${s}&${i}`).substring(12,20)}${s}`}`},handle$7=async e=>{const t=e.getConfig("picBed.upyun");if(!t)throw new Error("Can't find upYun config");try{const n=e.output,r=t.path||"";for(const i of n)if(i.fileName&&i.buffer){let n=i.buffer;!n&&i.base64Image&&(n=Buffer.from(i.base64Image,"base64"));const a=generateSignature(t,i.fileName),s=postOptions$2(t,i.fileName,a,n),o=t.options||"";if(200!==(await e.request(s)).statusCode)throw new Error("Upload failed");if(delete i.base64Image,delete i.buffer,i.imgUrl=`${t.url}/${encodeURIComponent(r)}${encodeURIComponent(i.fileName)}${o}`.replace(/%2F/g,"/"),t.antiLeechToken){const e=getAntiLeechParam(t.antiLeechToken,t.expireTime,t,i.fileName);i.imgUrl=i.imgUrl.includes("?")?`${i.imgUrl}&${e}`:`${i.imgUrl}?${e}`}}return e}catch(t){if("Upload failed"===t.message)e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")});else{const n=safeParse(t.error);e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:"object"==typeof n?n.code:n}),text:"http://docs.upyun.com/api/errno/"})}throw t}},config$5=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:"input",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},{name:"antiLeechToken",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_ANTI_LEECH_TOKEN")},get alias(){return e.i18n.translate("PICBED_UPYUN_ANTI_LEECH_TOKEN")},get message(){return e.i18n.translate("PICBED_UPYUN_ANTI_LEECH_TOKEN")},default:t.antiLeechToken||"",required:!1},{name:"expireTime",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_EXPIRE_TIME")},get alias(){return e.i18n.translate("PICBED_UPYUN_EXPIRE_TIME")},get message(){return e.i18n.translate("PICBED_UPYUN_EXPIRE_TIME")},default:t.expireTime||"",required:!1}]};function register$5(e){e.helper.uploader.register("upyun",{get name(){return e.i18n.translate("PICBED_UPYUN")},handle:handle$7,config:config$5})}const handle$6=async ctx=>{const{AuthType:AuthType,createClient:createClient}=await eval("import('webdav')"),webdavplistOptions=ctx.getConfig("picBed.webdavplist");if(!webdavplistOptions)throw new Error("Can't find webdavplist config");webdavplistOptions.host=webdavplistOptions.host.replace(/^https?:\/\/|\/+$/g,""),webdavplistOptions.host=(webdavplistOptions.sslEnabled?"https://":"http://")+webdavplistOptions.host,webdavplistOptions.path=(webdavplistOptions.path||"").replace(/^\/+|\/+$/g,"")+"/";const authType=webdavplistOptions.authType||"basic",webpath=(webdavplistOptions.webpath||"").replace(/^\/+|\/+$/g,"")+"/";try{const e=ctx.output,t=webdavplistOptions.customUrl,n=webdavplistOptions.path;for(const r of e)if(r.fileName&&r.buffer){let e=r.buffer;!e&&r.base64Image&&(e=Buffer.from(r.base64Image,"base64"));const i={username:webdavplistOptions.username,password:webdavplistOptions.password,maxBodyLength:4294967296,maxContentLength:4294967296};"digest"===authType&&(i.authType=AuthType.Digest);const a=createClient(webdavplistOptions.host,i),s="/"===n?"":n;s&&await a.createDirectory(s,{recursive:!0});const o=await a.putFileContents(`${n}${r.fileName}`.replace(/^\/+|\/+$/g,""),e,{overwrite:!0});if(!o)throw new Error("Upload failed");{const i=path.join(ctx.baseDir,"imgTemp","webdavplist"),a=path.join(i,r.fileName);fs.ensureDirSync(i),fs.writeFileSync(a,e),delete r.base64Image,delete r.buffer;const s=t||webdavplistOptions.host;webdavplistOptions.webpath?r.imgUrl=`${s}/${"/"===webpath?"":encodeURIComponent(webpath)}${encodeURIComponent(r.fileName)}`.replace(/%2F/g,"/"):r.imgUrl=`${s}/${"/"===n?"":encodeURIComponent(n)}${encodeURIComponent(r.fileName)}`.replace(/%2F/g,"/"),r.galleryPath=`http://localhost:36699/webdavplist/${encodeURIComponent(r.fileName)}`}}return ctx}catch(e){throw ctx.emit(IBuildInEvent.NOTIFICATION,{title:ctx.i18n.translate("UPLOAD_FAILED"),body:ctx.i18n.translate("CHECK_SETTINGS")}),e}},config$4=e=>{var t;const n=e.getConfig("picBed.webdavplist")||{};return[{name:"host",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_HOST")},default:n.host||"",required:!0},{name:"sslEnabled",type:"confirm",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_SSLENABLED")},required:!1,default:null!==(t=n.sslEnabled)&&void 0!==t&&t,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:n.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:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_PASSWORD")},default:n.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:n.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:n.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:n.customUrl||"",required:!1,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL")}},{name:"authType",type:"list",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_AUTHTYPE")},choices:["basic","digest"],default:n.authType||"basic",required:!1}]};function register$4(e){e.helper.uploader.register("webdavplist",{get name(){return e.i18n.translate("PICBED_WEBDAVPLIST")},handle:handle$6,config:config$4})}const handle$5=async e=>{const t=e.getConfig("picBed.local");if(!t)throw new Error("Can not find local config!");const n=t.path||"";let r=t.customUrl||"";r&&(r=r.replace(/\/$/,""));let i=t.webPath||"";i&&(i=i.replace(/\\/g,"/").replace(/^\//,"").replace(/\/$/,""));const a=e.output;for(const t of a)if(t.fileName&&t.buffer){let a=t.buffer;!a&&t.base64Image&&(a=Buffer.from(t.base64Image,"base64"));try{try{const s=path.join(e.baseDir,"imgTemp","local");fs.ensureDirSync(s),fs.ensureDirSync(n),fs.writeFileSync(path.join(n,t.fileName),a),fs.copyFileSync(path.join(n,t.fileName),path.join(e.baseDir,"imgTemp","local",t.fileName)),delete t.base64Image,delete t.buffer,t.imgUrl=r?i?`${r}/${encodeURIComponent(i)}/${encodeURIComponent(t.fileName)}`.replace(/%2F/g,"/"):`${r}/${encodeURIComponent(t.fileName)}`.replace(/%2F/g,"/"):path.join(n,t.fileName),t.hash=path.join(n,t.fileName),t.galleryPath=`http://localhost:36699/local/${encodeURIComponent(t.fileName)}`}catch(t){throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:"failed to upload image"}),new Error("failed to upload image")}}catch(t){throw e.log.error(t),t}}return e},config$3=e=>{const t=e.getConfig("picBed.local")||{};return[{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_LOCAL_PATH")},get alias(){return e.i18n.translate("PICBED_LOCAL_PATH")},default:t.path||"",get message(){return e.i18n.translate("PICBED_LOCAL_MESSAGE_PATH")},required:!0},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_LOCAL_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_LOCAL_CUSTOMURL")},default:t.customUrl||"",get message(){return e.i18n.translate("PICBED_LOCAL_MESSAGE_CUSTOMURL")},required:!1},{name:"webPath",type:"input",get alias(){return e.i18n.translate("PICBED_LOCAL_WEBPATH")},default:t.webPath||"",required:!1,get prefix(){return e.i18n.translate("PICBED_LOCAL_WEBPATH")},get message(){return e.i18n.translate("PICBED_LOCAL_MESSAGE_WEBPATH")}}]};function register$3(e){e.helper.uploader.register("local",{get name(){return e.i18n.translate("PICBED_LOCAL")},handle:handle$5,config:config$3})}class SSHClient{constructor(){this._isConnected=!1}static get instance(){return this._instance||(this._instance=new this)}static get client(){return this._client||(this._client=new NodeSSH)}changeWinStylePathToUnix(e){return e.replace(/\\/g,"/")}async connect(e){const{username:t,password:n,privateKey:r,passphrase:i}=e,a=r?{username:t,privateKeyPath:r,passphrase:i||void 0}:{username:t,password:n};try{return await SSHClient.client.connect(Object.assign({host:e.host,port:Number(e.port)||22},a)),this._isConnected=!0,!0}catch(e){throw new Error(e)}}async upload(e,t,n){if(!this._isConnected)throw new Error("SSH 未连接");try{t=this.changeWinStylePathToUnix(t),await this.mkdir(path.dirname(t).replace(/^\/+|\/+$/g,""),n),await SSHClient.client.putFile(e,t);const r=n.fileMode||"0644";if("0644"!==r){const e=`chmod ${r} "${t}"`;return await this.exec(e)}return!0}catch(e){throw new Error(e)}}async mkdir(e,t){if(!SSHClient.client.isConnected())throw new Error("SSH 未连接");const n=t.dirMode||"0755";if("0755"!==n){const t=e.split("/");let r="";for(const e of t)if(e){r+=`/${e}`;const t=`mkdir "${r}" && chmod ${n} "${r}"`;await this.exec(t)}}else{const t=`cd / && mkdir -p "${e}"`;await this.exec(t)}}async chown(e,t,n){e=this.changeWinStylePathToUnix(e);const[r,i]=n?[t,n]:t.includes(":")?t.split(":"):[t,t],a=`chown ${r}:${i} "${e}"`;return this.exec(a)}async exec(e){return 0===(await SSHClient.client.execCommand(e)).code}close(){SSHClient.client.dispose(),this._isConnected=!1}}const handle$4=async e=>{const t=e.getConfig("picBed.sftpplist");if(!t)throw new Error("Can not find sftpplist config!");t.port=Number(t.port)||22,t.uploadPath=(t.uploadPath||"").replace(/^\/+|\/+$/g,"")+"/";const n=(t.webPath||"").replace(/^\/+|\/+$/g,"")+"/";try{const r=e.output;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=path.join(e.baseDir,"uploadTemp"),s=path.join(e.baseDir,"imgTemp","sftpplist");fs.ensureDirSync(a),fs.ensureDirSync(s);const o=path.join(a,i.fileName);fs.writeFileSync(o,r);const l=SSHClient.instance;await l.connect(t);const E=path.join(`/${t.uploadPath}`.replace(/\/\/+/g,"/"),i.fileName);await l.upload(o,E,t),t.fileUser&&await l.chown(E,t.fileUser),delete i.base64Image,delete i.buffer;const I=t.customUrl||t.host;t.webPath?i.imgUrl=`${I}/${"/"===n?"":encodeURIComponent(n)}${encodeURIComponent(i.fileName)}`.replace(/%2F/g,"/"):i.imgUrl=`${I}/${"/"===t.uploadPath?"":encodeURIComponent(t.uploadPath)}${encodeURIComponent(i.fileName)}`.replace(/%2F/g,"/"),fs.moveSync(o,path.join(s,i.fileName)),i.galleryPath=`http://localhost:36699/sftpplist/${encodeURIComponent(i.fileName)}`,l.close()}return e}catch(t){throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},config$2=e=>{const t=e.getConfig("picBed.sftpplist")||{};return[{name:"host",type:"input",get alias(){return e.i18n.translate("PICBED_SFTPPLIST_HOST")},get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_HOST")},default:t.host||"",required:!0},{name:"port",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_PORT")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_PORT")},default:t.port||22,required:!1},{name:"username",type:"input",get alias(){return e.i18n.translate("PICBED_SFTPPLIST_USERNAME")},default:t.username||"",required:!0},{name:"password",type:"input",get alias(){return e.i18n.translate("PICBED_SFTPPLIST_PASSWORD")},default:t.password||"",required:!1},{name:"privateKey",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_PRIVATEKEY")},default:t.privateKey||"",required:!1},{name:"passphrase",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY_PASSPHRASE")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_PRIVATEKEY_PASSPHRASE")},default:t.passphrase||"",required:!1},{name:"uploadPath",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_UPLOADPATH")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_UPLOADPATH")},default:t.uploadPath||"",required:!1},{name:"customUrl",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_CUSTOMURL")},default:t.customUrl||"",required:!1},{name:"webPath",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_WEBSITE_PATH")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_WEBSITE_PATH")},default:t.webPath||"",required:!1},{name:"fileUser",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_FILE_USER")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_FILE_USER")},default:t.fileUser||"",required:!1},{name:"fileMode",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_FILE_MODE")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_FILE_MODE")},default:t.fileMode||"",required:!1},{name:"dirMode",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_DIR_MODE")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_DIR_MODE")},default:t.dirMode||"",required:!1}]};function register$2(e){e.helper.uploader.register("sftpplist",{get name(){return e.i18n.translate("PICBED_SFTPPLIST")},handle:handle$4,config:config$2})}const postOptions$1=async(e,t)=>{const n={method:"POST",url:"https://telegra.ph/upload",headers:{"content-type":"multipart/form-data"},formData:{file:t}};return e.proxy&&(n.proxy=e.proxy),n},handle$3=async e=>{var t,n;let r=e.getConfig("picBed.telegraphplist");r||(r={});try{const n=e.output;for(const i of n)if(i.fileName&&i.buffer){let n=i.buffer;!n&&i.base64Image&&(n=Buffer.from(i.base64Image,"base64"));const a=path.join(e.baseDir,"uploadTemp");fs.ensureDirSync(a);const s=path.join(a,i.fileName);fs.writeFileSync(s,n);const o=await postOptions$1(r,fs.createReadStream(s)),l=await e.request(o),E="string"==typeof l?JSON.parse(l):l;if(fs.remove(s),!(null===(t=null==E?void 0:E[0])||void 0===t?void 0:t.src))throw new Error("Server error, please try again");delete i.base64Image,delete i.buffer,i.imgUrl=`https://telegra.ph${E[0].src}`}return e}catch(t){throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK"),text:""}),(null===(n=null==t?void 0:t.response)||void 0===n?void 0:n.data)||t}},config$1=e=>[{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:(e.getConfig("picBed.telegraphplist")||{}).proxy||"",required:!1}];function register$1(e){e.helper.uploader.register("telegraphplist",{get name(){return e.i18n.translate("PICBED_TELEGRAPH")},handle:handle$3,config:config$1})}const postOptions=(e,t,n)=>{const r=e.host||"127.0.0.1",i=e.port||36677,a=e.picbed||"",s=e.configName||"Default",o=e.serverKey||"";let l=`http://${r}:${i}/upload?configName=${s}`;return a&&(l+=`&picbed=${a}`),o&&(l+=`&key=${o}`),{method:"POST",url:l,headers:{"content-type":"multipart/form-data"},formData:{file:{value:n,options:{filename:t,contentType:mime.lookup(t)}}},resolveWithFullResponse:!0}},handle$2=async e=>{var t;const n=e.getConfig("picBed.piclist");if(!n)throw new Error("Can't find PicList config");try{const r=e.output;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=postOptions(n,i.fileName,r),s=await e.request(a).then((e=>e)).catch((t=>({statusCode:400,body:{msg:e.i18n.translate("AUTH_FAILED"),err:t}})));if(200!==s.statusCode||!(null===(t=s.body)||void 0===t?void 0:t.success))throw new Error(s.body.message);delete i.base64Image,delete i.buffer,i.imgUrl=s.body.result[0],i.fullResult=s.body.fullResult[0]}return e}catch(t){throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},config=e=>{const t=e.getConfig("picBed.piclist")||{};return[{name:"host",type:"input",get alias(){return e.i18n.translate("PICBED_PICLIST_HOST")},default:t.host||"127.0.0.1",required:!0},{name:"port",type:"input",get alias(){return e.i18n.translate("PICBED_PICLIST_PORT")},default:t.port||36677,required:!1},{name:"picbed",type:"input",get alias(){return e.i18n.translate("PICBED_PICLIST_PICBED")},default:t.picbed||"",required:!1},{name:"configName",type:"input",get alias(){return e.i18n.translate("PICBED_PICLIST_CONFIGNAME")},default:t.configName||"",required:!1},{name:"serverKey",type:"input",get alias(){return e.i18n.translate("PICBED_PICLIST_KEY")},default:t.serverKey||"",required:!1}]};function register(e){e.helper.uploader.register("piclist",{get name(){return e.i18n.translate("PICBED_PICLIST")},handle:handle$2,config:config})}const buildInUploaders=()=>({register(e){register$6(e),register$a(e),register$b(e),register$9(e),register$8(e),register$7(e),register$5(e),register$4(e),register$3(e),register$2(e),register$1(e),register(e)}}),handle$1=async e=>{const t=e.output;return await Promise.all(e.input.map((async(n,r)=>{let i;if(i=Buffer.isBuffer(n)?{success:!0,buffer:n,fileName:"",extname:""}:isUrl(n)?await getURLFile(n,e):await getFSFile(n),i.success&&i.buffer){const a=getImgSize(e,i.buffer,n),s=i.extname||a.extname||".png";t[r]={buffer:i.buffer,fileName:i.fileName||`${dayjs().format("YYYYMMDDHHmmss")}${s}}`,width:a.width,height:a.height,extname:i.extname}}else e.log.error(i.reason)}))),e.output=t.filter((e=>e)),e},getImgSize=(e,t,n)=>{const r=getImageSize(t);return r.real||("string"==typeof n?e.log.warn(`can't get ${n}'s image size`):e.log.warn("can't get image size"),e.log.warn("fallback to 200 * 200")),r};var ImgFromPath={handle:handle$1};const handle=async e=>(e.output.push(...e.input),e);var ImgFromBase64={handle:handle};const buildInTransformers=()=>({register(e){e.helper.transformer.register("path",ImgFromPath),e.helper.transformer.register("base64",ImgFromBase64)}});class PluginLoader{constructor(e){this.list=[],this.fullList=new Set,this.pluginMap=new Map,this.ctx=e,this.init()}init(){const e=path.join(this.ctx.baseDir,"package.json");if(!fs.existsSync(e)){const t={name:"picgo-plugins",description:"picgo-plugins",repository:"https://github.com/PicGo/PicGo-Core",license:"MIT"};fs.writeFileSync(e,JSON.stringify(t),"utf8")}}resolvePlugin(e,t){try{return resolve.sync(t,{basedir:e.baseDir})}catch(n){return path.join(e.baseDir,"node_modules",t)}}load(){const e=path.join(this.ctx.baseDir,"package.json"),t=path.join(this.ctx.baseDir,"node_modules/");if(!fs.existsSync(t))return!1;const n=fs.readJSONSync(e),r=Object.keys(n.dependencies||{}),i=Object.keys(n.devDependencies||{}),a=r.concat(i).filter((e=>{if(!/^picgo-plugin-|^@[^/]+\/picgo-plugin-/.test(e))return!1;const t=this.resolvePlugin(this.ctx,e);return fs.existsSync(t)}));for(const e of a)this.registerPlugin(e);return!0}registerPlugin(e,t){if(e&&"string"==typeof e){this.fullList.add(e);try{if(t){this.list.push(e),setCurrentPluginName(e);const n=t(this.ctx);this.pluginMap.set(e,n),n.register(this.ctx)}else if(!0===this.ctx.getConfig(`picgoPlugins.${e}`)||void 0===this.ctx.getConfig(`picgoPlugins.${e}`)){this.list.push(e),setCurrentPluginName(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(IBuildInEvent.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),setCurrentPluginName(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 t=path.join(this.ctx.baseDir,"node_modules/"),n=require(t+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]}}var macClipboardScript='-- 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',windowsClipboardScript='\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',windows10ClipboardScript='# 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',linuxClipboardScript='#!/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',wslClipboardScript='#!/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';const CLIPBOARD_IMAGE_FOLDER="piclist-clipboard-images",getCurrentPlatform=()=>{const e=process.platform;if(isWsl)return"wsl";if("win32"===e){return"10"===os.release().split(".")[0]?"win10":"win32"}return"darwin"===e?"darwin":"linux"},platform2ScriptContent={darwin:macClipboardScript,win32:windowsClipboardScript,win10:windows10ClipboardScript,linux:linuxClipboardScript,wsl:wslClipboardScript},platform2ScriptFilename={darwin:"mac.applescript",win32:"windows.ps1",win10:"windows10.ps1",linux:"linux.sh",wsl:"wsl.sh"};function createImageFolder(e){const t=path.join(e.baseDir,CLIPBOARD_IMAGE_FOLDER);fs.existsSync(t)||fs.mkdirSync(t)}const getClipboardImage=async e=>{createImageFolder(e);const t=path.join(e.baseDir,CLIPBOARD_IMAGE_FOLDER,`${dayjs().format("YYYYMMDDHHmmss")}.png`);return await new Promise(((n,r)=>{const i=getCurrentPlatform(),a=path.join(e.baseDir,platform2ScriptFilename[i]);let s;fs.existsSync(a)||fs.writeFileSync(a,platform2ScriptContent[i],"utf8"),s="darwin"===i?spawn("osascript",[a,t]):"win32"===i||"win10"===i?spawn("powershell",["-noprofile","-noninteractive","-nologo","-sta","-executionpolicy","unrestricted","-file",a,t]):spawn("sh",[a,t]),s.stdout.on("data",(a=>{if("linux"===i&&"no xclip or wl-clipboard"===a.toString().trim())return e.emit(IBuildInEvent.NOTIFICATION,{title:"xclip or wl-clipboard not found",body:"Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"}),r(new Error("Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"));const s=a.toString().trim();let o=!1;if(path.basename(s)!==path.basename(t)&&fs.existsSync(s)&&(o=!0),"no image"!==s&&!fs.existsSync(s))return r(new Error(`Can't find ${s}`));n({imgPath:s,shouldKeepAfterUploading:o})}))}))},eventBus=new EventEmitter,httpsAgent=new https.Agent({maxVersion:"TLSv1.2",minVersion:"TLSv1.2"});function appendFormData(e,t,n){"object"==typeof n&&"value"in n&&"options"in n?e.append(t,n.value,n.options):e.append(t,n)}function requestInterceptor(e){var t;let n=!1;const r=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 URL(e.proxy)}catch(e){i=!1,r.proxy=!1,console.error(e)}n=!0}i&&((null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(r.proxy=!1,r.httpsAgent=tunnel.httpsOverHttp({proxy:{host:null==i?void 0:i.hostname,port:parseInt(null==i?void 0:i.port,10)}})):r.proxy={host:i.hostname,port:parseInt(i.port,10),protocol:"http"})}if("formData"in e){const t=new FormData;for(const n in e.formData){appendFormData(t,n,e.formData[n])}r.data=t,r.headers=Object.assign(r.headers||{},t.getHeaders()),n=!0,delete r.formData}return"body"in e&&(r.data=e.body,n=!0,delete r.body),"qs"in e&&(r.params=e.qs,n=!0),r.__isOldOptions=n,r}function responseInterceptor(e){return Object.assign(Object.assign({},e),{statusCode:e.status,body:e.data})}function responseErrorHandler(e){var t,n,r,i,a,s,o;const l={method:(null===(n=null===(t=null==e?void 0:e.config)||void 0===t?void 0:t.method)||void 0===n?void 0:n.toUpperCase())||"",url:(null===(r=null==e?void 0:e.config)||void 0===r?void 0:r.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 Request{constructor(e){this.proxy="",this.options={},this.ctx=e,this.init(),eventBus.on(IBusEvent.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 URL(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=tunnel.httpsOverHttp({proxy:{host:this.options.proxy.host,port:this.options.proxy.port}}),this.options.proxy=!1):this.options.httpsAgent=httpsAgent;const n=axios.create(this.options);n.interceptors.response.use(responseInterceptor,responseErrorHandler);const r=requestInterceptor(e);return n.interceptors.request.use((function(e){var t,n,r;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===(n=null==e?void 0:e.headers)||void 0===n?void 0:n.ContentType)?(i=e.headers.ContentType,delete e.headers.ContentType):(null===(r=null==e?void 0:e.headers)||void 0===r?void 0:r["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?n.request(r):n.request(r).then((t=>r.__isOldOptions?"json"in e?e.json?t.data:void 0:JSON.stringify(t.data):t.data))}}class DB{constructor(e){if(this.ctx=e,this.db=new JSONStore(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){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 PluginHandler{constructor(e){this.ctx=e}async install(e,t={},n){const r=[],i=e.map((e=>handlePluginNameProcess(this.ctx,e))).filter((e=>this.ctx.pluginLoader.hasPlugin(e.pkgName)?(r.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,n);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,...r]});return{success:!0,body:[...s,...r]}}if(0===r.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,...r]});return{success:!0,body:[...s,...r]}}async uninstall(e){const t=e.map((e=>handlePluginNameProcess(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={},n){const r=e.map((e=>handlePluginNameProcess(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(r.length>0){const e=await this.execCommand("update",r,this.ctx.baseDir,t,n);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:r});return{success:!0,body:r}}{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,n,r={},i={}){const a=r.registry||this.ctx.getConfig("settings.registry"),s=r.proxy||this.ctx.getConfig("settings.proxy");return await new Promise((r=>{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=spawn$1("npm",E,{cwd:n,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=>{r(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(IBuildInEvent.FAILED,"NPM is not installed")}))}catch(e){this.ctx.log.error(e),this.ctx.emit(IBuildInEvent.FAILED,e)}}))}}const handlePluginNameProcess=(e,t)=>{const n={success:!1,fullName:"",pkgName:""},r=getProcessPluginName(t,e.log);if(!r)return n;const i=getNormalPluginName(r,e.log);return i?{success:!0,fullName:r,pkgName:i}:n},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_LOCAL:"本地上传",PICBED_LOCAL_PATH:"设定路径",PICBED_LOCAL_MESSAGE_PATH:"例如 /usr/local/images/",PICBED_LOCAL_CUSTOMURL:"设定自定义域名",PICBED_LOCAL_MESSAGE_CUSTOMURL:"例如 https://test.com",PICBED_LOCAL_WEBPATH:"设定网站路径",PICBED_LOCAL_MESSAGE_WEBPATH:"用于拼接网址路径",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_ENDPOINT:"设定接入点",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_TENCENTCLOUD_MESSAGE_ENDPOINT:"例如:cos-internal.accelerate.tencentcos.cn",PICBED_TENCENTCLOUD_SLIM:"极智压缩",PICBED_TENCENTCLOUD_SLIM_TIP:"图片极智压缩,详情请参考[文档说明](https://cloud.tencent.com/document/product/436/49259)",PICBED_TENCENTCLOUD_SLIM_CONFIRM:"开启",PICBED_TENCENTCLOUD_SLIM_CANCEL:"关闭",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_TELEGRAPH:"Telegraph",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_ANTI_LEECH_TOKEN:"设定防盗链Token",PICBED_UPYUN_EXPIRE_TIME:"设定过期时间(秒)",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_AUTHTYPE:"设定认证方式",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",PICBED_SFTPPLIST:"内置SFTP",PICBED_SFTPPLIST_HOST:"设定主机",PICBED_SFTPPLIST_PORT:"设定端口",PICBED_SFTPPLIST_USERNAME:"设定用户名",PICBED_SFTPPLIST_PASSWORD:"设定密码",PICBED_SFTPPLIST_PRIVATEKEY:"设定私钥",PICBED_SFTPPLIST_PRIVATEKEY_PASSPHRASE:"设定私钥密码",PICBED_SFTPPLIST_UPLOADPATH:"设定上传路径",PICBED_SFTPPLIST_CUSTOMURL:"设定自定义域名",PICBED_SFTPPLIST_WEBSITE_PATH:"设定网站路径",PICBED_SFTPPLIST_FILE_USER:"设定文件用户:组",PICBED_SFTPPLIST_FILE_MODE:"设定文件权限",PICBED_SFTPPLIST_DIR_MODE:"设定文件夹权限",PICBED_SFTPPLIST_MESSAGE_HOST:"例如:1.1.1.3",PICBED_SFTPPLIST_MESSAGE_PORT:"默认22",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY:"例如:/Users/xxx/.ssh/id_rsa",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY_PASSPHRASE:"输入私钥密码",PICBED_SFTPPLIST_MESSAGE_UPLOADPATH:"例如:test/",PICBED_SFTPPLIST_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_SFTPPLIST_MESSAGE_WEBSITE_PATH:"拼接网址时使用",PICBED_SFTPPLIST_MESSAGE_FILE_USER:"例如:www:data",PICBED_SFTPPLIST_MESSAGE_FILE_MODE:"例如:0664",PICBED_SFTPPLIST_MESSAGE_DIR_MODE:"例如:0775",PICBED_PICLIST:"PicList",PICBED_PICLIST_HOST:"设定主机",PICBED_PICLIST_PORT:"设定端口",PICBED_PICLIST_PICBED:"设定图床",PICBED_PICLIST_CONFIGNAME:"设定配置名",PICBED_PICLIST_KEY:"设定鉴权Key",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_ISFLIP:"是否垂直翻转图片",BUILDIN_COMPRESS_ISFLOP:"是否水平翻转图片",BUILDIN_COMPRESS_RESIZEPERCENT:"设定缩放百分比",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"请输入数字",BUILDIN_COMPRESS_SKIPRESIZEOFSMALLIMG:"是否跳过小图缩放",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_LOCAL:"Local",PICBED_LOCAL_PATH:"Set Path",PICBED_LOCAL_MESSAGE_PATH:"Ex. /Users/name/Pictures/",PICBED_LOCAL_CUSTOMURL:"Set Custom URL",PICBED_LOCAL_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_LOCAL_WEBPATH:"Set Web Path",PICBED_LOCAL_MESSAGE_WEBPATH:"Used to generate url path",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_ENDPOINT:"Set Endpoint",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_TENCENTCLOUD_MESSAGE_ENDPOINT:"Ex. cos-internal.accelerate.tencentcos.cn",PICBED_TENCENTCLOUD_SLIM:"極智壓縮",PICBED_TENCENTCLOUD_SLIM_CANCEL:"關閉",PICBED_TENCENTCLOUD_SLIM_CONFIRM:"開啓",PICBED_TENCENTCLOUD_SLIM_TIP:"圖片極智壓縮,詳情請參考[文檔說明](https://cloud.tencent.com/document/product/436/49259)",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_TELEGRAPH:"Telegraph",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_ANTI_LEECH_TOKEN:"Set Anti-Leech Token",PICBED_UPYUN_EXPIRE_TIME:"Set Expire Time(seconds)",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_AUTHTYPE:"Set Auth Type",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",PICBED_SFTPPLIST:"SFTP Buildin",PICBED_SFTPPLIST_HOST:"Set Host",PICBED_SFTPPLIST_PORT:"Set Port",PICBED_SFTPPLIST_USERNAME:"Set Username",PICBED_SFTPPLIST_PASSWORD:"Set Password",PICBED_SFTPPLIST_PRIVATEKEY:"Set Private Key",PICBED_SFTPPLIST_PRIVATEKEY_PASSPHRASE:"Set Private Key Passphrase",PICBED_SFTPPLIST_UPLOADPATH:"Set Upload Path",PICBED_SFTPPLIST_CUSTOMURL:"Set Custom URL",PICBED_SFTPPLIST_WEBSITE_PATH:"Set Website Path",PICBED_SFTPPLIST_FILE_USER:"Set File User:Group",PICBED_SFTPPLIST_FILE_MODE:"Set File Mode",PICBED_SFTPPLIST_DIR_MODE:"Set Directory Mode",PICBED_SFTPPLIST_MESSAGE_HOST:"Ex. 1.1.1.3",PICBED_SFTPPLIST_MESSAGE_PORT:"Default 22",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY:"Ex. /Users/xxx/.ssh/id_rsa",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY_PASSPHRASE:"Please type the private key passphrase",PICBED_SFTPPLIST_MESSAGE_UPLOADPATH:"Ex. test/",PICBED_SFTPPLIST_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_SFTPPLIST_MESSAGE_WEBSITE_PATH:"Used to generate the URL of the image",PICBED_SFTPPLIST_MESSAGE_FILE_USER:"Ex. www:data",PICBED_SFTPPLIST_MESSAGE_FILE_MODE:"Ex. 0664",PICBED_SFTPPLIST_MESSAGE_DIR_MODE:"Ex. 0775",PICBED_PICLIST:"PicList",PICBED_PICLIST_HOST:"Set Host",PICBED_PICLIST_PORT:"Set Port",PICBED_PICLIST_PICBED:"Set PicBed",PICBED_PICLIST_CONFIGNAME:"Set Config Name",PICBED_PICLIST_KEY:"Set Key",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_ISFLIP:"Whether to flip the image vertically",BUILDIN_COMPRESS_ISFLOP:"Whether to flip the image horizontally",BUILDIN_COMPRESS_RESIZEPERCENT:"Set resizing percentage",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"Please enter a number",BUILDIN_COMPRESS_SKIPRESIZEOFSMALLIMG:"Whether to skip resizing of small images",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"},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_LOCAL:"本地",PICBED_LOCAL_PATH:"設定儲存路徑",PICBED_LOCAL_MESSAGE_PATH:"例如 /usr/local/images/",PICBED_LOCAL_CUSTOMURL:"設定自訂網址",PICBED_LOCAL_MESSAGE_CUSTOMURL:"例如 https://test.com",PICBED_LOCAL_WEBPATH:"設定網址路徑",PICBED_LOCAL_MESSAGE_WEBPATH:"用于網頁顯示的路徑",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_ENDPOINT:"設定接入點",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_TENCENTCLOUD_MESSAGE_ENDPOINT:"例如:cos-internal.accelerate.tencentcos.cn",PICBED_TENCENTCLOUD_SLIM:"Set ImageSlim",PICBED_TENCENTCLOUD_SLIM_TIP:"Image extremely intelligent compression, please refer to the [document description](https://cloud.tencent.com/document/product/436/49259)",PICBED_TENCENTCLOUD_SLIM_CONFIRM:"OPEN",PICBED_TENCENTCLOUD_SLIM_CANCEL:"CLOSE",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_TELEGRAPH:"Telegraph",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_ANTI_LEECH_TOKEN:"設定防盜鏈Token",PICBED_UPYUN_EXPIRE_TIME:"設定過期時間(秒)",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_AUTHTYPE:"設定認證方式",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",PICBED_SFTPPLIST:"內置SFTP",PICBED_SFTPPLIST_HOST:"設定主機",PICBED_SFTPPLIST_PORT:"設定端口",PICBED_SFTPPLIST_USERNAME:"設定用戶名",PICBED_SFTPPLIST_PASSWORD:"設定密碼",PICBED_SFTPPLIST_PRIVATEKEY:"設定私鑰",PICBED_SFTPPLIST_PRIVATEKEY_PASSPHRASE:"設定私鑰密碼",PICBED_SFTPPLIST_UPLOADPATH:"設定上傳路徑",PICBED_SFTPPLIST_CUSTOMURL:"設定自訂網址",PICBED_SFTPPLIST_WEBSITE_PATH:"設定網站路徑",PICBED_SFTPPLIST_FILE_USER:"設定文件用戶:組",PICBED_SFTPPLIST_FILE_MODE:"設定文件權限",PICBED_SFTPPLIST_DIR_MODE:"設定文件夾權限",PICBED_SFTPPLIST_MESSAGE_HOST:"例如:1.1.1.3",PICBED_SFTPPLIST_MESSAGE_PORT:"默認22",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY:"例如:/Users/xxx/.ssh/id_rsa",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY_PASSPHRASE:"輸入私鑰密碼",PICBED_SFTPPLIST_MESSAGE_UPLOADPATH:"例如:test/",PICBED_SFTPPLIST_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_SFTPPLIST_MESSAGE_WEBSITE_PATH:"拼接網址時使用",PICBED_SFTPPLIST_MESSAGE_FILE_USER:"例如:www:data",PICBED_SFTPPLIST_MESSAGE_FILE_MODE:"例如:0664",PICBED_SFTPPLIST_MESSAGE_DIR_MODE:"例如:0775",PICBED_PICLIST:"PicList",PICBED_PICLIST_HOST:"設定主機",PICBED_PICLIST_PORT:"設定端口",PICBED_PICLIST_PICBED:"設定圖床",PICBED_PICLIST_CONFIGNAME:"設定配置名",PICBED_PICLIST_KEY:"設定鑒權Key",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_ISFLIP:"是否垂直翻轉圖片",BUILDIN_COMPRESS_ISFLOP:"是否水平翻轉圖片",BUILDIN_COMPRESS_RESIZEPERCENT:"設定縮放百分比",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"請輸入数字",BUILDIN_COMPRESS_SKIPRESIZEOFSMALLIMG:"是否跳過小圖縮放",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:"插件更新失敗,請輸入正確的插件名稱"},languageList={"zh-CN":ZH_CN,"zh-TW":ZH_TW,en:EN};class I18nManager{constructor(e){this.ctx=e,this.objectAdapter=new ObjectAdapter(languageList);let t=this.ctx.getConfig("settings.language")||"zh-CN";languageList[t]||(t="zh-CN"),this.i18n=new I18n({adapter:this.objectAdapter,defaultLanguage:t}),this.loadOutterI18n()}loadOutterI18n(){const e=this.getOutterI18nFolder();fs.readdirSync(e,{withFileTypes:!0}).forEach((t=>{if(t.isFile()&&t.name.endsWith(".yml")){const n=path.join(e,t.name),r=fs.readFileSync(n,"utf8");try{const e=yaml.load(r);languageList[t.name.replace(/\.yml$/,"")]=e}catch(e){console.error(e)}}}))}getOutterI18nFolder(){const e=path.join(this.ctx.baseDir,"i18n-cli");return fs.pathExistsSync(e)||fs.ensureDirSync(e),e}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 n=this.objectAdapter.getLocale(e);if(!n)return!1;const r=merge(n,t);return this.objectAdapter.setLocale(e,r),!0}addLanguage(e,t){return!this.objectAdapter.getLocale(e)&&(this.objectAdapter.setLocale(e,t),languageList[e]=t,!0)}getLanguageList(){return Object.keys(languageList)}}class PicGo extends EventEmitter{get pluginLoader(){return this._pluginLoader}constructor(e=""){super(),this.VERSION="1.3.7",this.configPath=e,this.output=[],this.input=[],this.rawInput=[],this.helper={transformer:new LifecyclePlugins("transformer"),uploader:new LifecyclePlugins("uploader"),beforeTransformPlugins:new LifecyclePlugins("beforeTransformPlugins"),beforeUploadPlugins:new LifecyclePlugins("beforeUploadPlugins"),afterUploadPlugins:new LifecyclePlugins("afterUploadPlugins")},this.initConfigPath(),this.log=new Logger(this),this.cmd=new Commander(this),this.pluginHandler=new PluginHandler(this),this.initConfig(),this.init()}initConfigPath(){if(""===this.configPath&&(this.configPath=homedir()+"/.piclist/config.json"),".JSON"!==path.extname(this.configPath).toUpperCase())throw this.configPath="",Error("The configuration file only supports JSON format.");this.baseDir=path.dirname(this.configPath);fs.pathExistsSync(this.configPath)||fs.ensureFileSync(`${this.configPath}`)}initConfig(){this.db=new DB(this),this._config=this.db.read(!0)}init(){try{this.i18n=new I18nManager(this),this.Request=new Request(this),this._pluginLoader=new PluginLoader(this),setCurrentPluginName("picgo"),buildInUploaders(this).register(this),buildInTransformers(this).register(this),setCurrentPluginName(""),this._pluginLoader.load(),this.lifecycle=new Lifecycle(this)}catch(e){throw this.emit(IBuildInEvent.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?get(this._config,e):this._config}saveConfig(e){isInputConfigValid(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&&(isConfigKeyInBlackList(e)?this.log.warn(`the config.${e} can't be removed`):(this.unsetConfig(e,t),this.db.unset(e,t)))}setConfig(e){isInputConfigValid(e)?Object.keys(e).forEach((t=>{isConfigKeyInBlackList(t)&&(this.log.warn(`the config.${t} can't be modified`),delete e[t]),set(this._config,t,e[t]),eventBus.emit(IBusEvent.CONFIG_CHANGE,{configName:t,value:e[t]})})):this.log.warn("the format of config is invalid, please provide object")}unsetConfig(e,t){e&&t&&(isConfigKeyInBlackList(e)?this.log.warn(`the config.${e} can't be unset`):unset(this.getConfig(e),t))}get request(){return this.Request.request.bind(this.Request)}async upload(e){if(""===this.configPath)return this.log.error("The configuration file only supports JSON format."),[];if(void 0!==e&&0!==e.length){const{output:t}=await this.lifecycle.start(e);return t}try{const{imgPath:e,shouldKeepAfterUploading:t}=await getClipboardImage(this);if("no image"===e)throw new Error("image not found in clipboard");{this.once(IBuildInEvent.FAILED,(()=>{t||fs.remove(e).catch((e=>{this.log.error(e)}))})),this.once("finished",(()=>{t||fs.remove(e).catch((e=>{this.log.error(e)}))}));const{output:n}=await this.lifecycle.start([e]);return n}}catch(e){throw this.emit(IBuildInEvent.FAILED,e),e}}}export{Commander,Lifecycle,LifecyclePlugins,Logger,PicGo,common as PicGoUtils,PluginHandler,PluginLoader,Request};
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcGx1Z2luSGFuZGxlci50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9jb25maWcudHMiLCIuLi9zcmMvdXRpbHMvY29tbW9uLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VwbG9hZC50cyIsIi4uL3NyYy9wbHVnaW5zL2JlZm9yZXRyYW5zZm9ybWVyL2NvbXByZXNzLnRzIiwiLi4vc3JjL3BsdWdpbnMvYmVmb3JldHJhbnNmb3JtZXIvd2F0ZXJtYXJrLnRzIiwiLi4vc3JjL3BsdWdpbnMvYmVmb3JldXBsb2FkL2J1aWxkSW5SZW5hbWUudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvc2V0dGluZy50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci91c2UudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcHJveHkudHMiLCIuLi9zcmMvdXRpbHMvaW5pdFV0aWxzLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL2luaXQudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaTE4bi50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9pbmRleC50cyIsIi4uL3NyYy9saWIvTGlmZWN5Y2xlUGx1Z2lucy50cyIsIi4uL3NyYy9saWIvQ29tbWFuZGVyLnRzIiwiLi4vc3JjL3V0aWxzL2VudW0udHMiLCIuLi9zcmMvbGliL0xvZ2dlci50cyIsIi4uL3NyYy91dGlscy9jcmVhdGVDb250ZXh0LnRzIiwiLi4vc3JjL2NvcmUvTGlmZWN5Y2xlLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvc21tcy50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3RjeXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvZ2l0aHViLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvcWluaXUudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9pbWd1ci50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL2FsaXl1bi50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3VweXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvd2ViZGF2LnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvbG9jYWwudHMiLCIuLi9zcmMvdXRpbHMvc3NoQ2xpZW50LnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvc2Z0cC50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3RlbGVncmFwaC50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3BpY2xpc3QudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9pbmRleC50cyIsIi4uL3NyYy9wbHVnaW5zL3RyYW5zZm9ybWVyL3BhdGgudHMiLCIuLi9zcmMvcGx1Z2lucy90cmFuc2Zvcm1lci9iYXNlNjQudHMiLCIuLi9zcmMvcGx1Z2lucy90cmFuc2Zvcm1lci9pbmRleC50cyIsIi4uL3NyYy9saWIvUGx1Z2luTG9hZGVyLnRzIiwiLi4vc3JjL3V0aWxzL3N0YXRpYy50cyIsIi4uL3NyYy91dGlscy9nZXRDbGlwYm9hcmRJbWFnZS50cyIsIi4uL3NyYy91dGlscy9ldmVudEJ1cy50cyIsIi4uL3NyYy9saWIvUmVxdWVzdC50cyIsIi4uL3NyYy91dGlscy9kYi50cyIsIi4uL3NyYy9saWIvUGx1Z2luSGFuZGxlci50cyIsIi4uL3NyYy9pMThuL3poLUNOLnRzIiwiLi4vc3JjL2kxOG4vZW4udHMiLCIuLi9zcmMvaTE4bi96aC1UVy50cyIsIi4uL3NyYy9pMThuL2luZGV4LnRzIiwiLi4vc3JjL2NvcmUvUGljR28udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgcGx1Z2luSGFuZGxlcjogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgLy8gY29uc3QgcGx1Z2luSGFuZGxlciA9IG5ldyBQbHVnaW5IYW5kbGVyKGN0eClcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCdpbnN0YWxsIDxwbHVnaW5zLi4uPicpXHJcbiAgICAgIC5kZXNjcmlwdGlvbignaW5zdGFsbCBwaWNnbyBwbHVnaW4nKVxyXG4gICAgICAuYWxpYXMoJ2FkZCcpXHJcbiAgICAgIC5vcHRpb24oJy1wLCAtLXByb3h5IDxwcm94eT4nLCAnQWRkIHByb3h5IGZvciBpbnN0YWxsaW5nIHBsdWdpbnMnKVxyXG4gICAgICAub3B0aW9uKCctciwgLS1yZWdpc3RyeSA8cmVnaXN0cnk+JywgJ0Nob29zZSBhIHJlZ2lzdHJ5IGZvciBpbnN0YWxsaW5nIHBsdWdpbnMnKVxyXG4gICAgICAuYWN0aW9uKChwbHVnaW5zOiBzdHJpbmdbXSwgcHJvZ3JhbTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBwcm94eSwgcmVnaXN0cnkgfSA9IHByb2dyYW1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgcHJveHksXHJcbiAgICAgICAgICByZWdpc3RyeVxyXG4gICAgICAgIH1cclxuICAgICAgICBjdHgucGx1Z2luSGFuZGxlci5pbnN0YWxsKHBsdWdpbnMsIG9wdGlvbnMpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgfSlcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCd1bmluc3RhbGwgPHBsdWdpbnMuLi4+JylcclxuICAgICAgLmFsaWFzKCdybScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbigndW5pbnN0YWxsIHBpY2dvIHBsdWdpbicpXHJcbiAgICAgIC5hY3Rpb24oKHBsdWdpbnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgY3R4LnBsdWdpbkhhbmRsZXIudW5pbnN0YWxsKHBsdWdpbnMpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgfSlcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCd1cGRhdGUgPHBsdWdpbnMuLi4+JylcclxuICAgICAgLmRlc2NyaXB0aW9uKCd1cGRhdGUgcGljZ28gcGx1Z2luJylcclxuICAgICAgLm9wdGlvbignLXAsIC0tcHJveHkgPHByb3h5PicsICdBZGQgcHJveHkgZm9yIGluc3RhbGxpbmcnKVxyXG4gICAgICAub3B0aW9uKCctciwgLS1yZWdpc3RyeSA8cmVnaXN0cnk+JywgJ0Nob29zZSBhIHJlZ2lzdHJ5IGZvciBpbnN0YWxsaW5nJylcclxuICAgICAgLmFjdGlvbigocGx1Z2luczogc3RyaW5nW10sIHByb2dyYW06IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgcHJveHksIHJlZ2lzdHJ5IH0gPSBwcm9ncmFtXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgIHByb3h5LFxyXG4gICAgICAgICAgcmVnaXN0cnlcclxuICAgICAgICB9XHJcbiAgICAgICAgY3R4LnBsdWdpbkhhbmRsZXIudXBkYXRlKHBsdWdpbnMsIG9wdGlvbnMpLmNhdGNoKChlOiBFcnJvcikgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBwbHVnaW5IYW5kbGVyXHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW4gfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmNvbnN0IGNvbmZpZzogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxwYXRoPicsICdzZXQgY29uZmlnIHBhdGgnKVxyXG4gICAgICAvLyB3aWxsIGhhbmRsZSBpbiBgYmluL3BpY2dvYFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY29uZmlnXHJcbiIsImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgaW1hZ2VTaXplIH0gZnJvbSAnaW1hZ2Utc2l6ZSdcclxuaW1wb3J0IHtcclxuICB0eXBlIElJbWdTaXplLFxyXG4gIHR5cGUgSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8sXHJcbiAgdHlwZSBJUGx1Z2luTmFtZVR5cGUsXHJcbiAgdHlwZSBJTG9nZ2VyLFxyXG4gIHR5cGUgSVBpY0dvLFxyXG4gIHR5cGUgSUJ1aWxkSW5Db21wcmVzc09wdGlvbnMsXHJcbiAgdHlwZSBJQnVpbGRJbldhdGVyTWFya09wdGlvbnNcclxufSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJ1xyXG5pbXBvcnQgVGV4dFRvU1ZHIGZyb20gJ3RleHQtdG8tc3ZnJ1xyXG5pbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnXHJcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xyXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJ1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbVN0cmluZ0dlbmVyYXRvciAobGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5J1xyXG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoIH0pLm1hcCgoKSA9PiBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSkpLmpvaW4oJycpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZW5hbWVGaWxlTmFtZVdpdGhUaW1lc3RhbXAgKG9sZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGAke01hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApfSR7cmFuZG9tU3RyaW5nR2VuZXJhdG9yKDUpfSR7cGF0aC5leHRuYW1lKG9sZE5hbWUpfWBcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZUZpbGVOYW1lV2l0aFJhbmRvbVN0cmluZyAob2xkTmFtZTogc3RyaW5nLCBsZW5ndGg6IG51bWJlciA9IDUpOiBzdHJpbmcge1xyXG4gIHJldHVybiBgJHtyYW5kb21TdHJpbmdHZW5lcmF0b3IobGVuZ3RoKX0ke3BhdGguZXh0bmFtZShvbGROYW1lKX1gXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZW5hbWVGaWxlTmFtZVdpdGhDdXN0b21TdHJpbmcgKG9sZE5hbWU6IHN0cmluZywgY3VzdG9tRm9ybWF0OiBzdHJpbmcsIGFmZml4RmlsZU5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGNvbnZlcnNpb25NYXA6IFJlY29yZDxzdHJpbmcsICgpID0+IHN0cmluZz4gPSB7XHJcbiAgICAne1l9JzogKCkgPT4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCksXHJcbiAgICAne3l9JzogKCkgPT4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkuc2xpY2UoMiksXHJcbiAgICAne219JzogKCkgPT4gKG5ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDF9YCA6IChuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLFxyXG4gICAgJ3tkfSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0RGF0ZSgpfWAgOiBuZXcgRGF0ZSgpLmdldERhdGUoKS50b1N0cmluZygpLFxyXG4gICAgJ3tofSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0SG91cnMoKS50b1N0cmluZygpLmxlbmd0aCA9PT0gMSA/IGAwJHtuZXcgRGF0ZSgpLmdldEhvdXJzKCl9YCA6IG5ldyBEYXRlKCkuZ2V0SG91cnMoKS50b1N0cmluZygpLFxyXG4gICAgJ3tpfSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0TWludXRlcygpfWAgOiBuZXcgRGF0ZSgpLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLFxyXG4gICAgJ3tzfSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0U2Vjb25kcygpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0U2Vjb25kcygpfWAgOiBuZXcgRGF0ZSgpLmdldFNlY29uZHMoKS50b1N0cmluZygpLFxyXG4gICAgJ3ttZDV9JzogKCkgPT4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShwYXRoLmJhc2VuYW1lKG9sZE5hbWUsIHBhdGguZXh0bmFtZShvbGROYW1lKSkpLmRpZ2VzdCgnaGV4JyksXHJcbiAgICAne21kNS0xNn0nOiAoKSA9PiBjcnlwdG8uY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKHBhdGguYmFzZW5hbWUob2xkTmFtZSwgcGF0aC5leHRuYW1lKG9sZE5hbWUpKSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCAxNiksXHJcbiAgICAne3N0ci0xMH0nOiAoKSA9PiByYW5kb21TdHJpbmdHZW5lcmF0b3IoMTApLFxyXG4gICAgJ3tzdHItMjB9JzogKCkgPT4gcmFuZG9tU3RyaW5nR2VuZXJhdG9yKDIwKSxcclxuICAgICd7ZmlsZW5hbWV9JzogKCkgPT4gYWZmaXhGaWxlTmFtZSA/IHBhdGguYmFzZW5hbWUoYWZmaXhGaWxlTmFtZSwgcGF0aC5leHRuYW1lKGFmZml4RmlsZU5hbWUpKSA6IHBhdGguYmFzZW5hbWUob2xkTmFtZSwgcGF0aC5leHRuYW1lKG9sZE5hbWUpKSxcclxuICAgICd7dXVpZH0nOiAoKSA9PiB1dWlkdjQoKS5yZXBsYWNlKC8tL2csICcnKSxcclxuICAgICd7dGltZXN0YW1wfSc6ICgpID0+IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApLnRvU3RyaW5nKClcclxuICB9XHJcbiAgaWYgKGN1c3RvbUZvcm1hdCA9PT0gdW5kZWZpbmVkIHx8ICghT2JqZWN0LmtleXMoY29udmVyc2lvbk1hcCkuc29tZShpdGVtID0+IGN1c3RvbUZvcm1hdC5pbmNsdWRlcyhpdGVtKSkgJiYgIWN1c3RvbUZvcm1hdC5pbmNsdWRlcygnbG9jYWxGb2xkZXInKSkpIHtcclxuICAgIHJldHVybiBvbGROYW1lXHJcbiAgfVxyXG4gIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShvbGROYW1lKVxyXG4gIGxldCBuZXdOYW1lID0gT2JqZWN0LmtleXMoY29udmVyc2lvbk1hcCkucmVkdWNlKChhY2MsIGN1cikgPT4ge1xyXG4gICAgcmV0dXJuIGFjYy5yZXBsYWNlKG5ldyBSZWdFeHAoY3VyLCAnZycpLCBjb252ZXJzaW9uTWFwW2N1cl0oKSlcclxuICB9LCBjdXN0b21Gb3JtYXQpICsgZXh0XHJcbiAgbmV3TmFtZSA9IG5ld05hbWUucmVwbGFjZSgveyhsb2NhbEZvbGRlcjo/KFxcZCspPyl9L2dpLCAoX3Jlc3VsdCwga2V5LCBjb3VudCkgPT4ge1xyXG4gICAgY291bnQgPSBNYXRoLm1heCgxLCBjb3VudCB8fCAwKVxyXG4gICAgY29uc3QgcGF0aHMgPSBwYXRoLmRpcm5hbWUob2xkTmFtZSkuc3BsaXQocGF0aC5zZXApXHJcbiAgICBrZXkgPSBwYXRocy5zbGljZSgwIC0gY291bnQpLnJlZHVjZSgoYSwgYikgPT4gYCR7YX0vJHtifWApXHJcbiAgICByZXR1cm4ga2V5LnJlcGxhY2UoLzovZywgJycpXHJcbiAgfSlcclxuICByZXR1cm4gbmV3TmFtZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNVcmwgPSAodXJsOiBzdHJpbmcpOiBib29sZWFuID0+ICgvXmh0dHBzPzpcXC9cXC8vKS50ZXN0KHVybClcclxuXHJcbmV4cG9ydCBjb25zdCBpc1VybEVuY29kZSA9ICh1cmw6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIHVybCA9IHVybCB8fCAnJ1xyXG4gIHRyeSB7XHJcbiAgICAvLyB0aGUgd2hvbGUgdXJsIGVuY29kZSBvciBkZWNvZGUgc2hvbGQgbm90IHVzZSBlbmNvZGVVUklDb21wb25lbnQgb3IgZGVjb2RlVVJJQ29tcG9uZW50XHJcbiAgICByZXR1cm4gdXJsICE9PSBkZWNvZGVVUkkodXJsKVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxufVxyXG5leHBvcnQgY29uc3QgaGFuZGxlVXJsRW5jb2RlID0gKHVybDogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBpZiAoIWlzVXJsRW5jb2RlKHVybCkpIHtcclxuICAgIHVybCA9IGVuY29kZVVSSSh1cmwpXHJcbiAgfVxyXG4gIHJldHVybiB1cmxcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEltYWdlU2l6ZSA9IChmaWxlOiBCdWZmZXIpOiBJSW1nU2l6ZSA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHsgd2lkdGggPSAwLCBoZWlnaHQgPSAwLCB0eXBlIH0gPSBpbWFnZVNpemUoZmlsZSlcclxuICAgIGNvbnN0IGV4dG5hbWUgPSB0eXBlID8gYC4ke3R5cGV9YCA6ICcucG5nJ1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVhbDogdHJ1ZSxcclxuICAgICAgd2lkdGgsXHJcbiAgICAgIGhlaWdodCxcclxuICAgICAgZXh0bmFtZVxyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIC8vIGZhbGxiYWNrIHRvIDIwMCAqIDIwMFxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVhbDogZmFsc2UsXHJcbiAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgIGhlaWdodDogMjAwLFxyXG4gICAgICBleHRuYW1lOiAnLnBuZydcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGU0ZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8SVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8+ID0+IHtcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZXh0bmFtZTogcGF0aC5leHRuYW1lKGZpbGVQYXRoKSxcclxuICAgICAgZmlsZU5hbWU6IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpLFxyXG4gICAgICBidWZmZXI6IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKSxcclxuICAgICAgc3VjY2VzczogdHJ1ZVxyXG4gICAgfVxyXG4gIH0gY2F0Y2gge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVhc29uOiBgcmVhZCBmaWxlICR7ZmlsZVBhdGh9IGVycm9yYCxcclxuICAgICAgc3VjY2VzczogZmFsc2VcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRVUkxGaWxlID0gYXN5bmMgKHVybDogc3RyaW5nLCBjdHg6IElQaWNHbyk6IFByb21pc2U8SVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8+ID0+IHtcclxuICB1cmwgPSBoYW5kbGVVcmxFbmNvZGUodXJsKVxyXG4gIGxldCB0aW1lb3V0SWQ6IE5vZGVKUy5UaW1lb3V0XHJcbiAgY29uc3QgcmVxdWVzdEZuID0gbmV3IFByb21pc2U8SVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3Qoe1xyXG4gICAgICAgICAgbWV0aG9kOiAnZ2V0JyxcclxuICAgICAgICAgIHVybCxcclxuICAgICAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxyXG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXHJcbiAgICAgICAgfSlcclxuICAgICAgICAgIC50aGVuKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwLmRhdGEgYXMgQnVmZmVyXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXHJcbiAgICAgICAgY29uc3QgdXJsUGF0aCA9IG5ldyBVUkwodXJsKS5wYXRobmFtZVxyXG4gICAgICAgIGxldCBleHRuYW1lID0gJydcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTCh1cmwpLnNlYXJjaFBhcmFtc1xyXG4gICAgICAgICAgZXh0bmFtZSA9IHVybFBhcmFtcy5nZXQoJ3d4X2ZtdCcpIHx8IHBhdGguZXh0bmFtZSh1cmxQYXRoKSB8fCAnJ1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICBleHRuYW1lID0gcGF0aC5leHRuYW1lKHVybFBhdGgpIHx8ICcnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZXh0bmFtZS5zdGFydHNXaXRoKCcuJykgJiYgZXh0bmFtZSkge1xyXG4gICAgICAgICAgZXh0bmFtZSA9IGAuJHtleHRuYW1lfWBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICBidWZmZXI6IHJlcyxcclxuICAgICAgICAgIGZpbGVOYW1lOiBwYXRoLmJhc2VuYW1lKHVybFBhdGgpLFxyXG4gICAgICAgICAgZXh0bmFtZSxcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcclxuICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xyXG4gICAgICAgICAgcmVhc29uOiBgcmVxdWVzdCAke3VybH0gZXJyb3IsICR7ZXJyb3I/Lm1lc3NhZ2UgPz8gJyd9YFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pKCkuY2F0Y2gocmVqZWN0KVxyXG4gIH0pXHJcbiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTxJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbz4oKHJlc29sdmUpOiB2b2lkID0+IHtcclxuICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICByZXNvbHZlKHtcclxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICByZWFzb246IGByZXF1ZXN0ICR7dXJsfSB0aW1lb3V0YFxyXG4gICAgICB9KVxyXG4gICAgfSwgMzAwMDApXHJcbiAgfSlcclxuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtyZXF1ZXN0Rm4sIHRpbWVvdXRQcm9taXNlXSlcclxufVxyXG5cclxuLyoqXHJcbiAqIGRldGVjdCB0aGUgaW5wdXQgc3RyaW5nJ3MgdHlwZVxyXG4gKiBmb3IgZXhhbXBsZVxyXG4gKiAxLiBAeHh4L3BpY2dvLXBsdWdpbi14eHggLT4gc2NvcGVcclxuICogMi4gcGljZ28tcGx1Z2luLXh4eCAtPiBub3JtYWxcclxuICogMy4geHh4IC0+IHNpbXBsZVxyXG4gKiA0LiBub3QgZXhpc3RzIG9yIGlzIGEgcGF0aCAtPiB1bmtub3duXHJcbiAqIEBwYXJhbSBuYW1lXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0UGx1Z2luTmFtZVR5cGUgPSAobmFtZTogc3RyaW5nKTogSVBsdWdpbk5hbWVUeXBlID0+IHtcclxuICBpZiAoL15AW14vXStcXC9waWNnby1wbHVnaW4tLy50ZXN0KG5hbWUpKSB7XHJcbiAgICByZXR1cm4gJ3Njb3BlJ1xyXG4gIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCdwaWNnby1wbHVnaW4tJykpIHtcclxuICAgIHJldHVybiAnbm9ybWFsJ1xyXG4gIH0gZWxzZSBpZiAoaXNTaW1wbGVOYW1lKG5hbWUpKSB7XHJcbiAgICByZXR1cm4gJ3NpbXBsZSdcclxuICB9XHJcbiAgcmV0dXJuICd1bmtub3duJ1xyXG59XHJcblxyXG4vKipcclxuICogZGV0ZWN0IHRoZSBpbnB1dCBzdHJpbmcgaXMgYSBzaW1wbGUgcGx1Z2luIG5hbWUgb3Igbm90XHJcbiAqIGZvciBleGFtcGxlXHJcbiAqIDEuIHh4eCAtPiB0cnVlXHJcbiAqIDIuIC9Vc3IveHgveHh4eC9waWNnby1wbHVnaW4teHh4IC0+IGZhbHNlXHJcbiAqIEBwYXJhbSBuYW1lIHBsdWdpbk5hbWVPclBhdGhcclxuICovXHJcbmV4cG9ydCBjb25zdCBpc1NpbXBsZU5hbWUgPSAobmFtZU9yUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgaWYgKHBhdGguaXNBYnNvbHV0ZShuYW1lT3JQYXRoKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgbmFtZU9yUGF0aClcclxuICBpZiAoZnMuZXhpc3RzU3luYyhwbHVnaW5QYXRoKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIGlmIChuYW1lT3JQYXRoLmluY2x1ZGVzKCcvJykgfHwgbmFtZU9yUGF0aC5pbmNsdWRlcygnXFxcXCcpKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgcmV0dXJuIHRydWVcclxufVxyXG5cclxuLyoqXHJcbiAqIHN0cmVhbWxpbmUgdGhlIGZ1bGwgcGx1Z2luIG5hbWUgdG8gYSBzaW1wbGUgb25lXHJcbiAqIGZvciBleGFtcGxlOlxyXG4gKiAxLiBwaWNnby1wbHVnaW4teHh4IC0+IHh4eFxyXG4gKiAyLiBAeHh4L3BpY2dvLXBsdWdpbi15eXkgLT4geXl5XHJcbiAqIEBwYXJhbSBuYW1lIHBsdWdpbkZ1bGxOYW1lXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaGFuZGxlU3RyZWFtbGluZVBsdWdpbk5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBpZiAoL15AW14vXStcXC9waWNnby1wbHVnaW4tLy50ZXN0KG5hbWUpKSB7XHJcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9eQFteL10rXFwvcGljZ28tcGx1Z2luLS8sICcnKVxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9waWNnby1wbHVnaW4tLywgJycpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogY29tcGxldGUgcGx1Z2luIG5hbWUgdG8gZnVsbCBuYW1lXHJcbiAqIGZvciBleGFtcGxlOlxyXG4gKiAxLiB4eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAyLiBwaWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogQHBhcmFtIG5hbWUgcGx1Z2luU2ltcGxlTmFtZVxyXG4gKiBAcGFyYW0gc2NvcGUgcGx1Z2luU2NvcGVcclxuICovXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVDb21wbGV0ZVBsdWdpbk5hbWUgPSAobmFtZTogc3RyaW5nLCBzY29wZSA9ICcnKTogc3RyaW5nID0+IHtcclxuICBpZiAoc2NvcGUpIHtcclxuICAgIHJldHVybiBgQCR7c2NvcGV9L3BpY2dvLXBsdWdpbi0ke25hbWV9YFxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gYHBpY2dvLXBsdWdpbi0ke25hbWV9YFxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIGhhbmRsZSBpbnN0YWxsL3VuaW5zdGFsbC91cGRhdGUgcGx1Z2luIG5hbWUgb3IgcGF0aFxyXG4gKiBmb3IgZXhhbXBsZVxyXG4gKiAxLiBwaWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogMi4gQHh4eC9waWNnby1wbHVnaW4teHh4IC0+IEB4eHgvcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAzLiB4eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiA0LiAuL3h4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiAvYWJzb2x1dGVQYXRoLy4uLi94eHh4L3BpY2dvLXBsdWdpbi14eHhcclxuICogNS4gL2Fic29sdXRlUGF0aC8uLi4vcGljZ28tcGx1Z2luLXh4eCAtPiAvYWJzb2x1dGVQYXRoLy4uLi9waWNnby1wbHVnaW4teHh4XHJcbiAqIEBwYXJhbSBuYW1lT3JQYXRoIHBsdWdpbk5hbWUgb3IgcGx1Z2luUGF0aFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldFByb2Nlc3NQbHVnaW5OYW1lID0gKG5hbWVPclBhdGg6IHN0cmluZywgbG9nZ2VyOiBJTG9nZ2VyIHwgQ29uc29sZSA9IGNvbnNvbGUpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IHBsdWdpbk5hbWVUeXBlID0gZ2V0UGx1Z2luTmFtZVR5cGUobmFtZU9yUGF0aClcclxuICBzd2l0Y2ggKHBsdWdpbk5hbWVUeXBlKSB7XHJcbiAgICBjYXNlICdub3JtYWwnOlxyXG4gICAgY2FzZSAnc2NvcGUnOlxyXG4gICAgICByZXR1cm4gbmFtZU9yUGF0aFxyXG4gICAgY2FzZSAnc2ltcGxlJzpcclxuICAgICAgcmV0dXJuIGhhbmRsZUNvbXBsZXRlUGx1Z2luTmFtZShuYW1lT3JQYXRoKVxyXG4gICAgZGVmYXVsdDoge1xyXG4gICAgICAvLyBub3csIHRoZSBwbHVnaW5OYW1lVHlwZSBpcyB1bmtub3cgaGVyZVxyXG4gICAgICAvLyAxLiBjaGVjayBpZiBpcyBhbiBhYnNvbHV0ZSBwYXRoXHJcbiAgICAgIGxldCBwbHVnaW5QYXRoID0gbmFtZU9yUGF0aFxyXG4gICAgICBpZiAocGF0aC5pc0Fic29sdXRlKG5hbWVPclBhdGgpICYmIGZzLmV4aXN0c1N5bmMobmFtZU9yUGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gaGFuZGxlVW5peFN0eWxlUGF0aChwbHVnaW5QYXRoKVxyXG4gICAgICB9XHJcbiAgICAgIC8vIDIuIGNoZWNrIGlmIGlzIGEgcmVsYXRpdmUgcGF0aFxyXG4gICAgICBwbHVnaW5QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIG5hbWVPclBhdGgpXHJcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBsdWdpblBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIGhhbmRsZVVuaXhTdHlsZVBhdGgocGx1Z2luUGF0aClcclxuICAgICAgfVxyXG4gICAgICAvLyAzLiBpbnZhbGlkIG5hbWVPclBhdGhcclxuICAgICAgbG9nZ2VyLndhcm4oYENhbid0IGZpbmQgcGx1Z2luICR7bmFtZU9yUGF0aH1gKVxyXG4gICAgICByZXR1cm4gJydcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBnZXQgdGhlIG5vcm1hbCBwbHVnaW4gbmFtZVxyXG4gKiBmb3IgZXhhbXBsZTpcclxuICogMS4gcGljZ28tcGx1Z2luLXh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBAeHh4L3BpY2dvLXBsdWdpbi14eHhcclxuICogMy4gLi94eHh4L3BpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiA0LiAvYWJzb2x1dGVQYXRoLy4uLi9waWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogNS4gYW4gZXhjZXB0aW9uOiBbcGFja2FnZS5qc29uJ3MgbmFtZV0gIT09IFtmb2xkZXIgbmFtZV1cclxuICogdGhlbiB1c2UgW3BhY2thZ2UuanNvbidzIG5hbWVdLCB1c3VhbGx5IG1hdGNoIHRoZSBzY29wZSBwYWNrYWdlLlxyXG4gKiA2LiBpZiBwbHVnaW4gbmFtZSBoYXMgdmVyc2lvbjogcGljZ28tcGx1Z2luLXh4eEB4LngueCB0aGVuIHJlbW92ZSB0aGUgdmVyc2lvblxyXG4gKiBAcGFyYW0gbmFtZU9yUGF0aFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldE5vcm1hbFBsdWdpbk5hbWUgPSAobmFtZU9yUGF0aDogc3RyaW5nLCBsb2dnZXI6IElMb2dnZXIgfCBDb25zb2xlID0gY29uc29sZSk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgcGx1Z2luTmFtZVR5cGUgPSBnZXRQbHVnaW5OYW1lVHlwZShuYW1lT3JQYXRoKVxyXG4gIHN3aXRjaCAocGx1Z2luTmFtZVR5cGUpIHtcclxuICAgIGNhc2UgJ25vcm1hbCc6XHJcbiAgICAgIHJldHVybiByZW1vdmVQbHVnaW5WZXJzaW9uKG5hbWVPclBhdGgpXHJcbiAgICBjYXNlICdzY29wZSc6XHJcbiAgICAgIHJldHVybiByZW1vdmVQbHVnaW5WZXJzaW9uKG5hbWVPclBhdGgsIHRydWUpXHJcbiAgICBjYXNlICdzaW1wbGUnOlxyXG4gICAgICByZXR1cm4gcmVtb3ZlUGx1Z2luVmVyc2lvbihoYW5kbGVDb21wbGV0ZVBsdWdpbk5hbWUobmFtZU9yUGF0aCkpXHJcbiAgICBkZWZhdWx0OiB7XHJcbiAgICAgIC8vIG5vdywgdGhlIG5hbWVPclBhdGggbXVzdCBiZSBwYXRoXHJcbiAgICAgIC8vIHRoZSBuYW1lT3JQYXRoIGhlcmUgd2lsbCBiZSBlbnN1cmVkIHdpdGggdW5peCBzdHlsZVxyXG4gICAgICAvLyB3ZSBuZWVkIHRvIGZpbmQgdGhlIHBhY2thZ2UuanNvbidzIG5hbWUgY2F1c2UgbnBtIHVzaW5nIHRoZSBuYW1lIGluIHBhY2thZ2UuanNvbidzIG5hbWUgZmlsZWRcclxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG5hbWVPclBhdGgpKSB7XHJcbiAgICAgICAgbG9nZ2VyLndhcm4oYENhbid0IGZpbmQgcGx1Z2luOiAke25hbWVPclBhdGh9YClcclxuICAgICAgICByZXR1cm4gJydcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYWNrYWdlSlNPTlBhdGggPSBwYXRoLnBvc2l4LmpvaW4obmFtZU9yUGF0aCwgJ3BhY2thZ2UuanNvbicpXHJcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSlNPTlBhdGgpKSB7XHJcbiAgICAgICAgbG9nZ2VyLndhcm4oYENhbid0IGZpbmQgcGx1Z2luOiAke25hbWVPclBhdGh9YClcclxuICAgICAgICByZXR1cm4gJydcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBwa2cgPSBmcy5yZWFkSlNPTlN5bmMocGFja2FnZUpTT05QYXRoKSB8fCB7fVxyXG4gICAgICAgIGlmICghcGtnLm5hbWU/LmluY2x1ZGVzKCdwaWNnby1wbHVnaW4tJykpIHtcclxuICAgICAgICAgIGxvZ2dlci53YXJuKGBUaGUgcGx1Z2luIHBhY2thZ2UuanNvbidzIG5hbWUgZmlsZWQgaXMgJHtwa2cubmFtZSBhcyBzdHJpbmcgfHwgJ2VtcHR5J30sIG5lZWQgdG8gaW5jbHVkZSB0aGUgcHJlZml4OiBwaWNnby1wbHVnaW4tYClcclxuICAgICAgICAgIHJldHVybiAnJ1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGtnLm5hbWVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIGhhbmRsZSB0cmFuc2Zvcm0gdGhlIHBhdGggdG8gdW5peCBzdHlsZVxyXG4gKiBmb3IgZXhhbXBsZVxyXG4gKiAxLiBDOlxcXFx4eHhcXFxceHh4IC0+IEM6L3h4eC94eHhcclxuICogMi4gL3h4eC94eHggLT4gL3h4eC94eHhcclxuICogQHBhcmFtIHBhdGhcclxuICovXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVVbml4U3R5bGVQYXRoID0gKHBhdGhTdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgcGF0aEFyciA9IHBhdGhTdHIuc3BsaXQocGF0aC5zZXApXHJcbiAgcmV0dXJuIHBhdGhBcnIuam9pbignLycpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiByZW1vdmUgcGx1Z2luIHZlcnNpb24gd2hlbiByZWdpc3RlciBwbHVnaW4gbmFtZVxyXG4gKiAxLiBwaWNnby1wbHVnaW4teHh4QDEuMC4wIC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogMi4gQHh4eC9waWNnby1wbHVnaW4teHh4QDEuMC4wIC0+IEB4eHgvcGljZ28tcGx1Z2luLXh4eFxyXG4gKiBAcGFyYW0gbmFtZU9yUGF0aFxyXG4gKiBAcGFyYW0gc2NvcGVcclxuICovXHJcbmV4cG9ydCBjb25zdCByZW1vdmVQbHVnaW5WZXJzaW9uID0gKG5hbWVPclBhdGg6IHN0cmluZywgc2NvcGU6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKCFuYW1lT3JQYXRoLmluY2x1ZGVzKCdAJykpIHtcclxuICAgIHJldHVybiBuYW1lT3JQYXRoXHJcbiAgfSBlbHNlIHtcclxuICAgIGxldCByZWcgPSAvKC4rXFwvKT8ocGljZ28tcGx1Z2luLVxcdyspKEAuKykqL1xyXG4gICAgLy8gaWYgaXMgYSBzY29wZSBwa2dcclxuICAgIGlmIChzY29wZSkge1xyXG4gICAgICByZWcgPSAvKC4rXFwvKT8oXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi1cXHcrKShALispKi9cclxuICAgIH1cclxuICAgIGNvbnN0IG1hdGNoQXJyID0gbmFtZU9yUGF0aC5tYXRjaChyZWcpXHJcbiAgICBpZiAoIW1hdGNoQXJyKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignY2FuIG5vdCByZW1vdmUgcGx1Z2luIHZlcnNpb24nKVxyXG4gICAgICByZXR1cm4gbmFtZU9yUGF0aFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG1hdGNoQXJyWzJdXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogdGhlIGNvbmZpZyBibGFjayBpdGVtIGxpc3Qgd2hpY2ggd29uJ3QgYmUgc2V0dGVkXHJcbiAqIG9ubHkgY2FuIGJlIGdvdFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNvbmZpZ0JsYWNrTGlzdCA9IFtdXHJcblxyXG4vKipcclxuICogY2hlY2sgc29tZSBjb25maWcga2V5IGlzIGluIGJsYWNrTGlzdFxyXG4gKiBAcGFyYW0ga2V5XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXNDb25maWdLZXlJbkJsYWNrTGlzdCA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiBjb25maWdCbGFja0xpc3Quc29tZShibGFja0l0ZW0gPT4ga2V5LnN0YXJ0c1dpdGgoYmxhY2tJdGVtKSlcclxufVxyXG5cclxuLyoqXHJcbiAqIGNoZWNrIHRoZSBpbnB1dCBjb25maWcgaXMgdmFsaWRcclxuICogY29uZmlnIG11c3QgYmUgb2JqZWN0IHN1Y2ggYXMgeyB4eHg6ICd4eHgnIH1cclxuICogJiYgY2FuJ3QgYmUgYXJyYXlcclxuICogQHBhcmFtIGNvbmZpZ1xyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzSW5wdXRDb25maWdWYWxpZCA9IChjb25maWc6IGFueSk6IGJvb2xlYW4gPT4ge1xyXG4gIGlmIChcclxuICAgIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmXHJcbiAgICAhQXJyYXkuaXNBcnJheShjb25maWcpICYmXHJcbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmxlbmd0aCA+IDBcclxuICApIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2FmZVBhcnNlPFQ+IChzdHI6IHN0cmluZyk6IFQgfCBzdHJpbmcge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpXHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIHJldHVybiBzdHJcclxuICB9XHJcbn1cclxuXHJcbi8vIGhvbGQuLi5cclxuLy8gZXhwb3J0IGNvbnN0IGNvbmZpZ1doaXRlTGlzdDogUmVnRXhwW10gPSBbXHJcbi8vICAgL15waWNCZWQvLFxyXG4vLyAgIC9ecGljZ29QbHVnaW5zLyxcclxuLy8gICAvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLFxyXG4vLyAgIC9kZWJ1Zy8sXHJcbi8vICAgL3NpbGVudC8sXHJcbi8vICAgL2NvbmZpZ1BhdGgvLFxyXG4vLyAgIC9ec2V0dGluZ3MvLFxyXG4vLyBdXHJcblxyXG4vLyBleHBvcnQgY29uc3QgaXNDb25maWdLZXlJbldoaXRlTGlzdCA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4vLyAgIHJldHVybiBjb25maWdXaGl0ZUxpc3Quc29tZSh3aGl0ZUl0ZW0gPT4gd2hpdGVJdGVtLnRlc3Qoa2V5KSlcclxuLy8gfVxyXG5cclxuZXhwb3J0IGNvbnN0IGZvcmNlTnVtYmVyID0gKG51bTogc3RyaW5nIHwgbnVtYmVyID0gMCk6IG51bWJlciA9PiB7XHJcbiAgcmV0dXJuIGlzTmFOKE51bWJlcihudW0pKSA/IDAgOiBOdW1iZXIobnVtKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNEZXYgPSAoKTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc1Byb2QgPSAoKTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbidcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gdGV4dDJTVkcgKFxyXG4gIGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aDogc3RyaW5nLFxyXG4gIHRleHQ/OiBzdHJpbmcsXHJcbiAgY29sb3I/OiBzdHJpbmcsXHJcbiAgZm9udEZhbWlseT86IHN0cmluZ1xyXG4pOiBQcm9taXNlPEJ1ZmZlcj4ge1xyXG4gIHRleHQgPSAhdGV4dCA/ICfmtYvor5UnIDogdGV4dFxyXG4gIGZvbnRGYW1pbHkgPSAhZm9udEZhbWlseSA/IGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aCA6IGZvbnRGYW1pbHlcclxuICBjb2xvciA9ICFjb2xvciA/ICdyZ2JhKDIwNCwgMjA0LCAyMDQsIDAuNDUpJyA6IGNvbG9yXHJcbiAgY29uc3QgdGV4dDJTVkcgPSBUZXh0VG9TVkcubG9hZFN5bmMoZm9udEZhbWlseSlcclxuICBjb25zdCBvcHRpb25zOiBUZXh0VG9TVkcuR2VuZXJhdGlvbk9wdGlvbnMgPSB7XHJcbiAgICBhbmNob3I6ICd0b3AnLFxyXG4gICAgYXR0cmlidXRlczoge1xyXG4gICAgICBmaWxsOiBjb2xvclxyXG4gICAgfVxyXG4gIH1cclxuICBjb25zdCB0ZXh0U1ZHID0gdGV4dDJTVkcuZ2V0U1ZHKHRleHQsIG9wdGlvbnMpXHJcbiAgY29uc3Qgc3ZnID0gQnVmZmVyLmZyb20odGV4dFNWRylcclxuICByZXR1cm4gc3ZnXHJcbn1cclxuXHJcbmNvbnN0IGRlZmF1bHRXYXRlcm1hcmtJbWFnZVBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnYXNzZXRzJywgJ3BpY2xpc3QucG5nJylcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBBZGRXYXRlcm1hcmsgKFxyXG4gIGltZzogQnVmZmVyLFxyXG4gIHdhdGVybWFya1R5cGU6ICd0ZXh0JyB8ICdpbWFnZScsXHJcbiAgZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoOiBzdHJpbmcsXHJcbiAgaXNGdWxsU2NyZWVuV2F0ZXJtYXJrPzogYm9vbGVhbixcclxuICB3YXRlcm1hcmtEZWdyZWU/OiBudW1iZXIsXHJcbiAgdGV4dD86IHN0cmluZyxcclxuICB3YXRlcm1hcmtGb250UGF0aD86IHN0cmluZyxcclxuICB3YXRlcm1hcmtTY2FsZVJhdGlvPzogbnVtYmVyLFxyXG4gIHdhdGVybWFya0NvbG9yPzogc3RyaW5nLFxyXG4gIHdhdGVybWFya0ltYWdlUGF0aD86IHN0cmluZyxcclxuICBwb3NpdGlvbj86IHNoYXJwLkdyYXZpdHlcclxuKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICB3YXRlcm1hcmtTY2FsZVJhdGlvID0gIXdhdGVybWFya1NjYWxlUmF0aW8gfHwgd2F0ZXJtYXJrU2NhbGVSYXRpbyA8IDAgfHwgd2F0ZXJtYXJrU2NhbGVSYXRpbyA+IDEgPyAwLjE1IDogd2F0ZXJtYXJrU2NhbGVSYXRpb1xyXG4gIGNvbnN0IGltYWdlID0gc2hhcnAoaW1nLCB7IGFuaW1hdGVkOiB0cnVlIH0pXHJcbiAgY29uc3QgeyB3aWR0aDogaW1nV2lkdGggPSAyMDAgfSA9IGF3YWl0IGltYWdlLm1ldGFkYXRhKClcclxuICBjb25zdCB3YXRlcm1hcmsgPSBhd2FpdCBjcmVhdGVXYXRlcm1hcmsoXHJcbiAgICB3YXRlcm1hcmtUeXBlLFxyXG4gICAgZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoLFxyXG4gICAgdGV4dCxcclxuICAgIHdhdGVybWFya0ZvbnRQYXRoLFxyXG4gICAgd2F0ZXJtYXJrU2NhbGVSYXRpbyxcclxuICAgIHdhdGVybWFya0NvbG9yLFxyXG4gICAgd2F0ZXJtYXJrSW1hZ2VQYXRoLFxyXG4gICAgaW1nV2lkdGgsXHJcbiAgICB3YXRlcm1hcmtEZWdyZWVcclxuICApXHJcbiAgY29uc3QgY29tcG9zaXRlZCA9IGF3YWl0IGltYWdlXHJcbiAgICAuY29tcG9zaXRlKFtcclxuICAgICAge1xyXG4gICAgICAgIGlucHV0OiB3YXRlcm1hcmssXHJcbiAgICAgICAgZ3Jhdml0eTogcG9zaXRpb24gfHwgJ3NvdXRoZWFzdCcsXHJcbiAgICAgICAgdGlsZTogaXNGdWxsU2NyZWVuV2F0ZXJtYXJrXHJcbiAgICAgIH1cclxuICAgIF0pXHJcbiAgICAudG9CdWZmZXIoKVxyXG4gIHJldHVybiBjb21wb3NpdGVkXHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdhdGVybWFyayAoXHJcbiAgd2F0ZXJtYXJrVHlwZTogJ3RleHQnIHwgJ2ltYWdlJyxcclxuICBkZWZhdWx0V2F0ZXJtYXJrRm9udFBhdGg6IHN0cmluZyxcclxuICB0ZXh0Pzogc3RyaW5nLFxyXG4gIHdhdGVybWFya0ZvbnRQYXRoPzogc3RyaW5nLFxyXG4gIHdhdGVybWFya1NjYWxlUmF0aW8/OiBudW1iZXIsXHJcbiAgd2F0ZXJtYXJrQ29sb3I/OiBzdHJpbmcsXHJcbiAgd2F0ZXJtYXJrSW1hZ2VQYXRoPzogc3RyaW5nLFxyXG4gIGltZ1dpZHRoOiBudW1iZXIgPSAyMDAsXHJcbiAgd2F0ZXJtYXJrRGVncmVlOiBudW1iZXIgPSAwXHJcbik6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgbGV0IHdhdGVybWFyazogYW55XHJcbiAgaWYgKHdhdGVybWFya1R5cGUgPT09ICdpbWFnZScpIHtcclxuICAgIHdhdGVybWFya0ltYWdlUGF0aCA9IHdhdGVybWFya0ltYWdlUGF0aCB8fCBkZWZhdWx0V2F0ZXJtYXJrSW1hZ2VQYXRoXHJcbiAgICB3YXRlcm1hcmsgPSBhd2FpdCBzaGFycCh3YXRlcm1hcmtJbWFnZVBhdGgpLnRvQnVmZmVyKClcclxuICB9IGVsc2Uge1xyXG4gICAgd2F0ZXJtYXJrID0gYXdhaXQgdGV4dDJTVkcoXHJcbiAgICAgIGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aCxcclxuICAgICAgdGV4dCxcclxuICAgICAgd2F0ZXJtYXJrQ29sb3IsXHJcbiAgICAgIHdhdGVybWFya0ZvbnRQYXRoIHx8IGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aFxyXG4gICAgKVxyXG4gIH1cclxuICBjb25zdCB7IHdpZHRoOiB3YXRlcm1hcmtXaWR0aCwgaGVpZ2h0OiB3YXRlcm1hcmtIZWlnaHQgfSA9IGF3YWl0IGdldFNpemUoXHJcbiAgICB3YXRlcm1hcmtcclxuICApXHJcbiAgY29uc3Qgd2F0ZXJtYXJrUmVzaXplV2lkdGggPSBNYXRoLmZsb29yKGltZ1dpZHRoICogZm9yY2VOdW1iZXIod2F0ZXJtYXJrU2NhbGVSYXRpbykpXHJcbiAgY29uc3Qgd2F0ZXJtYXJrUmVzaXplSGVpZ2h0ID0gTWF0aC5mbG9vcihcclxuICAgICh3YXRlcm1hcmtSZXNpemVXaWR0aCAqIHdhdGVybWFya0hlaWdodCkgLyB3YXRlcm1hcmtXaWR0aFxyXG4gIClcclxuICByZXR1cm4gYXdhaXQgc2hhcnAod2F0ZXJtYXJrKVxyXG4gICAgLnJlc2l6ZSh3YXRlcm1hcmtSZXNpemVXaWR0aCwgd2F0ZXJtYXJrUmVzaXplSGVpZ2h0LCB7XHJcbiAgICAgIGZpdDogJ2luc2lkZSdcclxuICAgIH0pXHJcbiAgICAucm90YXRlKHdhdGVybWFya0RlZ3JlZSwgeyBiYWNrZ3JvdW5kOiB7IHI6IDI1NSwgZzogMjU1LCBiOiAyNTUsIGFscGhhOiAwIH0gfSlcclxuICAgIC50b0J1ZmZlcigpXHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldFNpemUgKGltYWdlOiBCdWZmZXIpOiBQcm9taXNlPHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfT4ge1xyXG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYXdhaXQgc2hhcnAoaW1hZ2UpLm1ldGFkYXRhKClcclxuICByZXR1cm4geyB3aWR0aDogd2lkdGggfHwgMjAwLCBoZWlnaHQ6IGhlaWdodCB8fCAyMDAgfVxyXG59XHJcblxyXG5jb25zdCB2YWxpZFBhcmFtID0gKC4uLnBhcmFtczogYW55W10pOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gcGFyYW1zLmV2ZXJ5KHBhcmFtID0+IHtcclxuICAgIGlmIChwYXJhbSA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIHBhcmFtICE9PSAnJ1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgcmV0dXJuIHBhcmFtID4gMFxyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtKS5sZW5ndGggPiAwXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IGF2YWlsYWJsZUNvbnZlcnRGb3JtYXRMaXN0ID0gW1xyXG4gICdhdmlmJyxcclxuICAnZHonLFxyXG4gICdmaXRzJyxcclxuICAnZ2lmJyxcclxuICAnaGVpZicsXHJcbiAgJ2lucHV0JyxcclxuICAnanBlZycsXHJcbiAgJ2pwZycsXHJcbiAgJ2pwMicsXHJcbiAgJ2p4bCcsXHJcbiAgJ21hZ2ljaycsXHJcbiAgJ29wZW5zbGlkZScsXHJcbiAgJ3BkZicsXHJcbiAgJ3BuZycsXHJcbiAgJ3BwbScsXHJcbiAgJ3JhdycsXHJcbiAgJ3N2ZycsXHJcbiAgJ3RpZmYnLFxyXG4gICd0aWYnLFxyXG4gICd2JyxcclxuICAnd2VicCdcclxuXVxyXG5cclxuY29uc3QgdmFsaWRPdXRwdXRGb3JtYXQgPSAoZm9ybWF0OiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gYXZhaWxhYmxlQ29udmVydEZvcm1hdExpc3QuaW5jbHVkZXMoZm9ybWF0KVxyXG59XHJcblxyXG5jb25zdCBpbWFnZUV4dExpc3QgPSBbJ2pwZycsICdqcGVnJywgJ3BuZycsICd3ZWJwJywgJ2JtcCcsICd0aWZmJywgJ3RpZicsICdzdmcnLCAnaWNvJywgJ2F2aWYnLCAnaGVpZicsICdoZWljJ11cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbWFnZUFkZFdhdGVyTWFyayAoaW1nOiBCdWZmZXIsIG9wdGlvbnM6IElCdWlsZEluV2F0ZXJNYXJrT3B0aW9ucywgZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xyXG4gIHRyeSB7XHJcbiAgICBsZXQgaW1hZ2U6IHNoYXJwLlNoYXJwID0gc2hhcnAoaW1nLCB7IGFuaW1hdGVkOiB0cnVlIH0pXHJcbiAgICBpZiAodmFsaWRQYXJhbShvcHRpb25zLndhdGVybWFya1RleHQpKSB7XHJcbiAgICAgIGltYWdlID0gc2hhcnAoYXdhaXQgQWRkV2F0ZXJtYXJrKFxyXG4gICAgICAgIGltZyxcclxuICAgICAgICBvcHRpb25zLndhdGVybWFya1R5cGUgfHwgJ3RleHQnLFxyXG4gICAgICAgIGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aCxcclxuICAgICAgICBvcHRpb25zLmlzRnVsbFNjcmVlbldhdGVybWFyayxcclxuICAgICAgICBmb3JjZU51bWJlcihvcHRpb25zLndhdGVybWFya0RlZ3JlZSksXHJcbiAgICAgICAgb3B0aW9ucy53YXRlcm1hcmtUZXh0LFxyXG4gICAgICAgIG9wdGlvbnMud2F0ZXJtYXJrRm9udFBhdGgsXHJcbiAgICAgICAgZm9yY2VOdW1iZXIob3B0aW9ucy53YXRlcm1hcmtTY2FsZVJhdGlvKSxcclxuICAgICAgICBvcHRpb25zLndhdGVybWFya0NvbG9yLFxyXG4gICAgICAgIG9wdGlvbnMud2F0ZXJtYXJrSW1hZ2VQYXRoLFxyXG4gICAgICAgIG9wdGlvbnMud2F0ZXJtYXJrUG9zaXRpb25cclxuICAgICAgKSwgeyBhbmltYXRlZDogdHJ1ZSB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IGltYWdlLnRvQnVmZmVyKClcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5sb2coZXJyb3IpXHJcbiAgICByZXR1cm4gaW1nXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtYXRPcHRpb25zIChvcHRpb25zOiBJQnVpbGRJbkNvbXByZXNzT3B0aW9ucyk6IElCdWlsZEluQ29tcHJlc3NPcHRpb25zIHtcclxuICByZXR1cm4ge1xyXG4gICAgcXVhbGl0eTogZm9yY2VOdW1iZXIob3B0aW9ucy5xdWFsaXR5KSxcclxuICAgIGlzQ29udmVydDogb3B0aW9ucy5pc0NvbnZlcnQgfHwgZmFsc2UsXHJcbiAgICBjb252ZXJ0Rm9ybWF0OiBvcHRpb25zLmNvbnZlcnRGb3JtYXQgfHwgJ2pwZycsXHJcbiAgICBpc1JlU2l6ZTogb3B0aW9ucy5pc1JlU2l6ZSB8fCBmYWxzZSxcclxuICAgIHJlU2l6ZUhlaWdodDogZm9yY2VOdW1iZXIob3B0aW9ucy5yZVNpemVIZWlnaHQpLFxyXG4gICAgcmVTaXplV2lkdGg6IGZvcmNlTnVtYmVyKG9wdGlvbnMucmVTaXplV2lkdGgpLFxyXG4gICAgc2tpcFJlU2l6ZU9mU21hbGxJbWc6IG9wdGlvbnMuc2tpcFJlU2l6ZU9mU21hbGxJbWcgfHwgZmFsc2UsXHJcbiAgICBpc1JlU2l6ZUJ5UGVyY2VudDogb3B0aW9ucy5pc1JlU2l6ZUJ5UGVyY2VudCB8fCBmYWxzZSxcclxuICAgIHJlU2l6ZVBlcmNlbnQ6IGZvcmNlTnVtYmVyKG9wdGlvbnMucmVTaXplUGVyY2VudCksXHJcbiAgICBpc1JvdGF0ZTogb3B0aW9ucy5pc1JvdGF0ZSB8fCBmYWxzZSxcclxuICAgIGlzRmxpcDogb3B0aW9ucy5pc0ZsaXAgfHwgZmFsc2UsXHJcbiAgICBpc0Zsb3A6IG9wdGlvbnMuaXNGbG9wIHx8IGZhbHNlLFxyXG4gICAgcm90YXRlRGVncmVlOiBmb3JjZU51bWJlcihvcHRpb25zLnJvdGF0ZURlZ3JlZSksXHJcbiAgICBwaWNCZWQ6IG9wdGlvbnMucGljQmVkIHx8ICdzbW1zJ1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltYWdlUHJvY2VzcyAoaW1nOiBCdWZmZXIsIG9wdGlvbnM6IElCdWlsZEluQ29tcHJlc3NPcHRpb25zLCByYXdGb3JtYXQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgb3B0aW9ucyA9IGZvcm1hdE9wdGlvbnMob3B0aW9ucylcclxuICB0cnkge1xyXG4gICAgcmF3Rm9ybWF0ID0gcmF3Rm9ybWF0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICcnKVxyXG4gICAgaWYgKCFpbWFnZUV4dExpc3QuaW5jbHVkZXMocmF3Rm9ybWF0KSkge1xyXG4gICAgICByZXR1cm4gaW1nXHJcbiAgICB9XHJcbiAgICBsZXQgaW1hZ2U6IHNoYXJwLlNoYXJwID0gc2hhcnAoaW1nLCB7IGFuaW1hdGVkOiB0cnVlIH0pXHJcbiAgICBsZXQgcXVhbGl0eSA9IDEwMFxyXG4gICAgaWYgKHZhbGlkUGFyYW0ob3B0aW9ucy5xdWFsaXR5KSAmJiBvcHRpb25zLnF1YWxpdHkhIDwgMTAwKSB7XHJcbiAgICAgIHF1YWxpdHkgPSBvcHRpb25zLnF1YWxpdHkhXHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5pc1JlU2l6ZUJ5UGVyY2VudCkge1xyXG4gICAgICBpZiAodmFsaWRQYXJhbShvcHRpb25zLnJlU2l6ZVBlcmNlbnQpKSB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VXaWR0aCA9IGF3YWl0IGltYWdlLm1ldGFkYXRhKCkudGhlbihtZXRhZGF0YSA9PiBtZXRhZGF0YS53aWR0aClcclxuICAgICAgICBjb25zdCBpbWFnZUhlaWdodCA9IGF3YWl0IGltYWdlLm1ldGFkYXRhKCkudGhlbihtZXRhZGF0YSA9PiBtZXRhZGF0YS5oZWlnaHQpXHJcbiAgICAgICAgaWYgKGltYWdlV2lkdGggJiYgaW1hZ2VIZWlnaHQpIHtcclxuICAgICAgICAgIGltYWdlID0gaW1hZ2UucmVzaXplKFxyXG4gICAgICAgICAgICBNYXRoLnJvdW5kKGltYWdlV2lkdGggKiBvcHRpb25zLnJlU2l6ZVBlcmNlbnQhIC8gMTAwKSxcclxuICAgICAgICAgICAgTWF0aC5yb3VuZChpbWFnZUhlaWdodCAqIG9wdGlvbnMucmVTaXplUGVyY2VudCEgLyAxMDApLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZml0OiAnaW5zaWRlJ1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmlzUmVTaXplKSB7XHJcbiAgICAgIGlmICgodHlwZW9mIG9wdGlvbnMucmVTaXplSGVpZ2h0ID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLnJlU2l6ZUhlaWdodCA+IDApICYmICh0eXBlb2Ygb3B0aW9ucy5yZVNpemVXaWR0aCA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5yZVNpemVXaWR0aCA+IDApKSB7XHJcbiAgICAgICAgaW1hZ2UgPSBpbWFnZS5yZXNpemUoXHJcbiAgICAgICAgICBvcHRpb25zLnJlU2l6ZVdpZHRoLFxyXG4gICAgICAgICAgb3B0aW9ucy5yZVNpemVIZWlnaHQsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpdDogJ2ZpbGwnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2UgaWYgKCh0eXBlb2Ygb3B0aW9ucy5yZVNpemVIZWlnaHQgPT09ICdudW1iZXInICYmIG9wdGlvbnMucmVTaXplSGVpZ2h0ID4gMCkgJiYgKHR5cGVvZiBvcHRpb25zLnJlU2l6ZVdpZHRoICE9PSAnbnVtYmVyJyB8fCBvcHRpb25zLnJlU2l6ZVdpZHRoID09PSAwKSkge1xyXG4gICAgICAgIGNvbnN0IGltYWdlV2lkdGggPSBhd2FpdCBpbWFnZS5tZXRhZGF0YSgpLnRoZW4obWV0YWRhdGEgPT4gbWV0YWRhdGEud2lkdGgpXHJcbiAgICAgICAgY29uc3QgaW1hZ2VIZWlnaHQgPSBhd2FpdCBpbWFnZS5tZXRhZGF0YSgpLnRoZW4obWV0YWRhdGEgPT4gbWV0YWRhdGEuaGVpZ2h0KVxyXG4gICAgICAgIGlmIChpbWFnZVdpZHRoICYmIGltYWdlSGVpZ2h0KSB7XHJcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuc2tpcFJlU2l6ZU9mU21hbGxJbWcgfHwgKG9wdGlvbnMuc2tpcFJlU2l6ZU9mU21hbGxJbWcgJiYgb3B0aW9ucy5yZVNpemVIZWlnaHQgPCBpbWFnZUhlaWdodCkpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2NhbGVSYXRpbyA9IG9wdGlvbnMucmVTaXplSGVpZ2h0IC8gaW1hZ2VIZWlnaHRcclxuICAgICAgICAgICAgaW1hZ2UgPSBpbWFnZS5yZXNpemUoXHJcbiAgICAgICAgICAgICAgTWF0aC5yb3VuZChpbWFnZVdpZHRoICogc2NhbGVSYXRpbyksXHJcbiAgICAgICAgICAgICAgb3B0aW9ucy5yZVNpemVIZWlnaHQsXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZml0OiAnaW5zaWRlJ1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICgodHlwZW9mIG9wdGlvbnMucmVTaXplV2lkdGggPT09ICdudW1iZXInICYmIG9wdGlvbnMucmVTaXplV2lkdGggPiAwKSAmJiAodHlwZW9mIG9wdGlvbnMucmVTaXplSGVpZ2h0ICE9PSAnbnVtYmVyJyB8fCBvcHRpb25zLnJlU2l6ZUhlaWdodCA9PT0gMCkpIHtcclxuICAgICAgICBjb25zdCBpbWFnZVdpZHRoID0gYXdhaXQgaW1hZ2UubWV0YWRhdGEoKS50aGVuKG1ldGFkYXRhID0+IG1ldGFkYXRhLndpZHRoKVxyXG4gICAgICAgIGNvbnN0IGltYWdlSGVpZ2h0ID0gYXdhaXQgaW1hZ2UubWV0YWRhdGEoKS50aGVuKG1ldGFkYXRhID0+IG1ldGFkYXRhLmhlaWdodClcclxuICAgICAgICBpZiAoaW1hZ2VXaWR0aCAmJiBpbWFnZUhlaWdodCkge1xyXG4gICAgICAgICAgaWYgKCFvcHRpb25zLnNraXBSZVNpemVPZlNtYWxsSW1nIHx8IChvcHRpb25zLnNraXBSZVNpemVPZlNtYWxsSW1nICYmIG9wdGlvbnMucmVTaXplV2lkdGggPCBpbWFnZVdpZHRoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBzY2FsZVJhdGlvID0gb3B0aW9ucy5yZVNpemVXaWR0aCAvIGltYWdlV2lkdGhcclxuICAgICAgICAgICAgaW1hZ2UgPSBpbWFnZS5yZXNpemUoXHJcbiAgICAgICAgICAgICAgb3B0aW9ucy5yZVNpemVXaWR0aCxcclxuICAgICAgICAgICAgICBNYXRoLnJvdW5kKGltYWdlSGVpZ2h0ICogc2NhbGVSYXRpbyksXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZml0OiAnaW5zaWRlJ1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMuaXNSb3RhdGUgJiYgb3B0aW9ucy5yb3RhdGVEZWdyZWUpIHtcclxuICAgICAgaW1hZ2UgPSBpbWFnZS5yb3RhdGUob3B0aW9ucy5yb3RhdGVEZWdyZWUsIHsgYmFja2dyb3VuZDogeyByOiAyNTUsIGc6IDI1NSwgYjogMjU1LCBhbHBoYTogMCB9IH0pXHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5pc0ZsaXApIHtcclxuICAgICAgY29uc29sZS5sb2coJ2ZsaXAnKVxyXG4gICAgICBpbWFnZSA9IGltYWdlLmZsaXAoKVxyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMuaXNGbG9wKSB7XHJcbiAgICAgIGltYWdlID0gaW1hZ2UuZmxvcCgpXHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5pc0NvbnZlcnQpIHtcclxuICAgICAgbGV0IG5ld0Zvcm1hdCA9IG9wdGlvbnMuY29udmVydEZvcm1hdCB8fCAnanBnJ1xyXG4gICAgICBpZiAob3B0aW9ucy5waWNCZWQgPT09ICdpbWd1cicgJiYgbmV3Rm9ybWF0ID09PSAnd2VicCcpIHtcclxuICAgICAgICBuZXdGb3JtYXQgPSAnanBnJ1xyXG4gICAgICB9XHJcbiAgICAgIGltYWdlID0gaW1hZ2UudG9Gb3JtYXQobmV3Rm9ybWF0LCB7XHJcbiAgICAgICAgcXVhbGl0eVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHJhd0Zvcm1hdCAmJiB2YWxpZE91dHB1dEZvcm1hdChyYXdGb3JtYXQpKSB7XHJcbiAgICAgICAgaW1hZ2UgPSBpbWFnZS50b0Zvcm1hdChyYXdGb3JtYXQgYXMgYW55LCB7XHJcbiAgICAgICAgICBxdWFsaXR5XHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbWFnZSA9IGltYWdlLnRvRm9ybWF0KCdqcGcnLCB7XHJcbiAgICAgICAgICBxdWFsaXR5XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IGltYWdlLnRvQnVmZmVyKClcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5sb2coZXJyb3IpXHJcbiAgICByZXR1cm4gaW1nXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBpbWFnZUZvcm1hdExpc3QgPSBbJ2pwZycsICdqcGVnJywgJ3BuZycsICd3ZWJwJywgJ2JtcCcsICd0aWZmJywgJ3RpZicsICdzdmcnLCAnaWNvJywgJ2F2aWYnLCAnaGVpZicsICdoZWljJywgJ2dpZiddXHJcblxyXG5leHBvcnQgY29uc3QgbmVlZEFkZFdhdGVybWFyayA9ICh3YXRlcm1hcmtPcHRpb25zOiBJQnVpbGRJbldhdGVyTWFya09wdGlvbnMgfCB1bmRlZmluZWQsIGZpbGVFeHQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIGZpbGVFeHQgPSBmaWxlRXh0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICcnKVxyXG4gIHJldHVybiAhIXdhdGVybWFya09wdGlvbnMgJiYgISF3YXRlcm1hcmtPcHRpb25zLmlzQWRkV2F0ZXJtYXJrICYmIGltYWdlRm9ybWF0TGlzdC5pbmNsdWRlcyhmaWxlRXh0KVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbmVlZENvbXByZXNzID0gKGNvbXByZXNzT3B0aW9uczogSUJ1aWxkSW5Db21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQsIGZpbGVFeHQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHQgPSBmaWxlRXh0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICcnKVxyXG5cclxuICBpZiAoIWltYWdlRm9ybWF0TGlzdC5pbmNsdWRlcyhub3JtYWxpemVkRXh0KSB8fCAhY29tcHJlc3NPcHRpb25zKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGNvbnN0IHtcclxuICAgIHF1YWxpdHksXHJcbiAgICBpc1JlU2l6ZUJ5UGVyY2VudCxcclxuICAgIHJlU2l6ZVBlcmNlbnQsXHJcbiAgICBpc1JlU2l6ZSxcclxuICAgIHJlU2l6ZUhlaWdodCxcclxuICAgIHJlU2l6ZVdpZHRoLFxyXG4gICAgaXNSb3RhdGUsXHJcbiAgICByb3RhdGVEZWdyZWUsXHJcbiAgICBpc0NvbnZlcnQsXHJcbiAgICBjb252ZXJ0Rm9ybWF0LFxyXG4gICAgaXNGbGlwLFxyXG4gICAgaXNGbG9wXHJcbiAgfSA9IGZvcm1hdE9wdGlvbnMoY29tcHJlc3NPcHRpb25zKVxyXG5cclxuICBpZiAodmFsaWRQYXJhbShxdWFsaXR5KSAmJiBxdWFsaXR5ISA8IDEwMCkge1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcbiAgaWYgKGlzUmVTaXplQnlQZXJjZW50ICYmIHZhbGlkUGFyYW0ocmVTaXplUGVyY2VudCkpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG4gIGlmIChpc1JlU2l6ZSAmJiAoKHR5cGVvZiByZVNpemVIZWlnaHQgPT09ICdudW1iZXInICYmIHJlU2l6ZUhlaWdodCA+IDApIHx8ICh0eXBlb2YgcmVTaXplV2lkdGggPT09ICdudW1iZXInICYmIHJlU2l6ZVdpZHRoID4gMCkpKSB7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuICBpZiAoaXNSb3RhdGUgJiYgcm90YXRlRGVncmVlKSB7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuICBpZiAoaXNGbGlwIHx8IGlzRmxvcCkge1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcbiAgaWYgKGlzQ29udmVydCkge1xyXG4gICAgY29uc3QgbmV3Rm9ybWF0ID0gY29udmVydEZvcm1hdCB8fCAnanBnJ1xyXG4gICAgcmV0dXJuIGZpbGVFeHQgIT09IG5ld0Zvcm1hdFxyXG4gIH1cclxuICByZXR1cm4gZmFsc2VcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlbW92ZUV4aWYgPSBhc3luYyAoaW1nOiBCdWZmZXIsIGZpbGVFeHQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiA9PiB7XHJcbiAgZmlsZUV4dCA9IGZpbGVFeHQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCcuJywgJycpXHJcbiAgaWYgKCFpbWFnZUZvcm1hdExpc3QuaW5jbHVkZXMoZmlsZUV4dCkpIHtcclxuICAgIHJldHVybiBpbWdcclxuICB9XHJcbiAgcmV0dXJuIGF3YWl0IHNoYXJwKGltZywge1xyXG4gICAgYW5pbWF0ZWQ6IHRydWVcclxuICB9KS50b0J1ZmZlcigpXHJcbn1cclxuIiwiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgeyBpc1VybCB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgdXBsb2FkOiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgndXBsb2FkJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCd1cGxvYWQsIGdvIGdvIGdvJylcclxuICAgICAgLmFyZ3VtZW50cygnW2lucHV0Li4uXScpXHJcbiAgICAgIC5hbGlhcygndScpXHJcbiAgICAgIC5hY3Rpb24oKGlucHV0OiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbnB1dExpc3QgPSBpbnB1dFxyXG4gICAgICAgICAgICAubWFwKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gaXNVcmwoaXRlbSkgPyBpdGVtIDogcGF0aC5yZXNvbHZlKGl0ZW0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0ID0gZnMuZXhpc3RzU3luYyhpdGVtKSB8fCBpc1VybChpdGVtKVxyXG4gICAgICAgICAgICAgIGlmICghZXhpc3QpIHtcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgJHtpdGVtfSBkb2VzIG5vdCBleGlzdC5gKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gZXhpc3RcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIGF3YWl0IGN0eC51cGxvYWQoaW5wdXRMaXN0KVxyXG4gICAgICAgIH0pKCkuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgdXBsb2FkXHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSUJ1aWxkSW5Db21wcmVzc09wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgdHlwZSBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElCdWlsZEluQ29tcHJlc3NPcHRpb25zPignYnVpbGRJbi5jb21wcmVzcycpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdxdWFsaXR5JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUVVBTElUWScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5xdWFsaXR5IHx8IDEwMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzQ29udmVydCcsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfSVNDT05WRVJUJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmlzQ29udmVydCB8fCBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2NvbnZlcnRGb3JtYXQnLFxyXG4gICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX0NPTlZFUlRGT1JNQVQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGNob2ljZXM6IFsnYXZpZicsICdkeicsICdmaXRzJywgJ2dpZicsICdoZWlmJywgJ2lucHV0JywgJ2pwZWcnLCAnanBnJywgJ2pwMicsICdqeGwnLCAnbWFnaWNrJywgJ29wZW5zbGlkZScsICdwZGYnLCAncG5nJywgJ3BwbScsICdyYXcnLCAnc3ZnJywgJ3RpZmYnLCAndGlmJywgJ3YnLCAnd2VicCddLFxyXG4gICAgICBkZWZhdWx0OiAnanBnJ1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzUmVTaXplJyxcclxuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9DT01QUkVTU19JU1JFU0laRScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5pc1JlU2l6ZSB8fCBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3JlU2l6ZVdpZHRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUkVTSVpFV0lEVEgnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucmVTaXplV2lkdGggfHwgNTAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncmVTaXplSGVpZ2h0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUkVTSVpFSEVJR0hUJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnJlU2l6ZUhlaWdodCB8fCA1MDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdza2lwUmVTaXplT2ZTbWFsbEltZycsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfU0tJUFJFU0laRU9GU01BTExJTUcnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc2tpcFJlU2l6ZU9mU21hbGxJbWcgfHwgZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdpc1JlU2l6ZUJ5UGVyY2VudCcsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkVCWVBFUkNFTlQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuaXNSZVNpemVCeVBlcmNlbnQgfHwgZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdyZVNpemVQZXJjZW50JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUkVTSVpFUEVSQ0VOVCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5yZVNpemVQZXJjZW50IHx8IDUwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaXNGbGlwJyxcclxuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9DT01QUkVTU19JU0ZMSVAnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuaXNGbGlwIHx8IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaXNGbG9wJyxcclxuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9DT01QUkVTU19JU0ZMT1AnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuaXNGbG9wIHx8IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaXNSb3RhdGUnLFxyXG4gICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX0lTUk9UQVRFJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmlzUm90YXRlIHx8IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncm90YXRlRGVncmVlJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUk9UQVRFREVHUkVFJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnJvdGF0ZURlZ3JlZSB8fCA5MFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzUmVtb3ZlRXhpZicsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfSVNSRU1PVkVFWElGJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmlzUmVtb3ZlRXhpZiB8fCBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBjb25maWdcclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGx1Z2luQ29uZmlnLCB0eXBlIElCdWlsZEluV2F0ZXJNYXJrT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUJ1aWxkSW5XYXRlck1hcmtPcHRpb25zPignYnVpbGRJbi53YXRlcm1hcmsnKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaXNBZGRXYXRlcm1hcmsnLFxyXG4gICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19JU0FERFdBVEVSTUFSSycpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5pc0FkZFdhdGVybWFyayB8fCBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3dhdGVybWFya1R5cGUnLFxyXG4gICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktUWVBFJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBjaG9pY2VzOiBbJ3RleHQnLCAnaW1hZ2UnXSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53YXRlcm1hcmtUeXBlIHx8ICd0ZXh0J1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzRnVsbFNjcmVlbldhdGVybWFyaycsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX0lTRlVMTFNDUkVFTldBVEVSTUFSSycpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5pc0Z1bGxTY3JlZW5XYXRlcm1hcmsgfHwgZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtEZWdyZWUnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLREVHUkVFJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndhdGVybWFya0RlZ3JlZSB8fCAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnd2F0ZXJtYXJrVGV4dCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhUJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndhdGVybWFya1RleHQgfHwgJydcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtGb250UGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhURk9OVFBBVEgnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcud2F0ZXJtYXJrRm9udFBhdGggfHwgJydcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtTY2FsZVJhdGlvJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRSQVRJTycpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53YXRlcm1hcmtTY2FsZVJhdGlvIHx8IDAuMTVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtDb2xvcicsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktGT05UQ09MT1InKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcud2F0ZXJtYXJrQ29sb3IgfHwgJ3JnYmEoMjA0LCAyMDQsIDIwNCwgMC40NSknXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnd2F0ZXJtYXJrSW1hZ2VQYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0lNQUdFUEFUSCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53YXRlcm1hcmtJbWFnZVBhdGggfHwgJydcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtQb3NpdGlvbicsXHJcbiAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1BPU0lUSU9OJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBjaG9pY2VzOiBbJ25vcnRoJywgJ25vcnRoZWFzdCcsICdzb3V0aGVhc3QnLCAnc291dGgnLCAnc291dGh3ZXN0JywgJ25vcnRod2VzdCcsICd3ZXN0JywgJ2Vhc3QnLCAnY2VudGVyJywgJ2NlbnRyZSddLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndhdGVybWFya1Bvc2l0aW9uIHx8ICdzb3V0aGVhc3QnXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIGNvbmZpZ1xyXG59XHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgdHlwZSBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPGFueT4oJ2J1aWxkSW4ucmVuYW1lJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2Zvcm1hdCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1JFTkFNRV9GT1JNQVQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuZm9ybWF0IHx8ICd7ZmlsZW5hbWV9J1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2VuYWJsZScsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fUkVOQU1FX0VOQUJMRScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5lbmFibGUgfHwgZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgY29uZmlnXHJcbn1cclxuIiwiaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbkNvbmZpZywgdHlwZSBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBjb21wcmVzcyBmcm9tICcuLi9iZWZvcmV0cmFuc2Zvcm1lci9jb21wcmVzcydcclxuaW1wb3J0IHdhdGVybWFyayBmcm9tICcuLi9iZWZvcmV0cmFuc2Zvcm1lci93YXRlcm1hcmsnXHJcbmltcG9ydCByZW5hbWUgZnJvbSAnLi4vYmVmb3JldXBsb2FkL2J1aWxkSW5SZW5hbWUnXHJcblxyXG4vLyBoYW5kbGUgbW9kdWxlcyBjb25maWcgLT4gc2F2ZSB0byBwaWNnbyBjb25maWcgZmlsZVxyXG5jb25zdCBoYW5kbGVDb25maWcgPSBhc3luYyAoY3R4OiBJUGljR28sIHByb21wdHM6IElQbHVnaW5Db25maWdbXSwgbW9kdWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KHByb21wdHMpXHJcbiAgY29uc3QgY29uZmlnTmFtZSA9IG1vZHVsZSA9PT0gJ3VwbG9hZGVyJ1xyXG4gICAgPyBgcGljQmVkLiR7bmFtZX1gXHJcbiAgICA6IG1vZHVsZSA9PT0gJ3RyYW5zZm9ybWVyJ1xyXG4gICAgICA/IGB0cmFuc2Zvcm1lci4ke25hbWV9YFxyXG4gICAgICA6IG1vZHVsZSA9PT0gJ2J1aWxkaW4nXHJcbiAgICAgICAgPyBgYnVpbGRJbi4ke25hbWV9YFxyXG4gICAgICAgIDogbmFtZVxyXG4gIGN0eC5zYXZlQ29uZmlnKHtcclxuICAgIFtjb25maWdOYW1lXTogYW5zd2VyXHJcbiAgfSlcclxuICBpZiAobW9kdWxlID09PSAndXBsb2FkZXInKSB7XHJcbiAgICBjdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICdwaWNCZWQuY3VycmVudCc6IG5hbWUsXHJcbiAgICAgICdwaWNCZWQudXBsb2FkZXInOiBuYW1lXHJcbiAgICB9KVxyXG4gIH0gZWxzZSBpZiAobW9kdWxlID09PSAndHJhbnNmb3JtZXInKSB7XHJcbiAgICBjdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICdwaWNCZWQudHJhbnNmb3JtZXInOiBuYW1lXHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuY29uc3Qgc2V0dGluZyA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ3NldCcpXHJcbiAgICAgIC5hbGlhcygnY29uZmlnJylcclxuICAgICAgLmFyZ3VtZW50cygnPG1vZHVsZT4gW25hbWVdJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCdjb25maWd1cmUgY29uZmlnIG9mIHBpY2dvIG1vZHVsZXMsIHVwbG9hZGVyfHRyYW5zZm9ybWVyfHBsdWdpbnxidWlsZGluJylcclxuICAgICAgLmFjdGlvbigobW9kdWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcclxuICAgICAgICAgICAgLy8gYXdhaXQgY3R4LnBsdWdpbkxvYWRlci5sb2FkKClcclxuICAgICAgICAgICAgLy8gaWYgYSBtb2R1bGUgaXMgc3BlY2lmaWMsIHRoZW4ganVzdCBzZXQgdGhpcyBvcHRpb24gaW4gY29uZmlnXHJcbiAgICAgICAgICAgIHN3aXRjaCAobW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAnYnVpbGRpbic6XHJcbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2NvbXByZXNzJykge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBjb21wcmVzcy5jb25maWcoY3R4KSwgbW9kdWxlLCBuYW1lKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09PSAnd2F0ZXJtYXJrJykge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCB3YXRlcm1hcmsuY29uZmlnKGN0eCksIG1vZHVsZSwgbmFtZSlcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3JlbmFtZScpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgcmVuYW1lLmNvbmZpZyhjdHgpLCBtb2R1bGUsIG5hbWUpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdidWlsZGluJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM6IFsnY29tcHJlc3MnLCAnd2F0ZXJtYXJrJywgJ3JlbmFtZSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Nob29zZSBhIGJ1aWxkaW4gbW9kdWxlJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdDxJU3RyaW5nS2V5TWFwPGFueT4+KHByb21wdHMpXHJcbiAgICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIuYnVpbGRpbiA9PT0gJ2NvbXByZXNzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGNvbXByZXNzLmNvbmZpZyhjdHgpLCBtb2R1bGUsIGFuc3dlci5idWlsZGluKVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFuc3dlci5idWlsZGluID09PSAnd2F0ZXJtYXJrJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIHdhdGVybWFyay5jb25maWcoY3R4KSwgbW9kdWxlLCBhbnN3ZXIuYnVpbGRpbilcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbnN3ZXIuYnVpbGRpbiA9PT0gJ3JlbmFtZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCByZW5hbWUuY29uZmlnKGN0eCksIG1vZHVsZSwgYW5zd2VyLmJ1aWxkaW4pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgY2FzZSAndXBsb2FkZXInOlxyXG4gICAgICAgICAgICAgIGNhc2UgJ3RyYW5zZm9ybWVyJzpcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdHguaGVscGVyW21vZHVsZV0uZ2V0KG5hbWUpXHJcbiAgICAgICAgICAgICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoYE5vICR7bW9kdWxlfSBuYW1lZCAke25hbWV9YCk7IHJldHVyblxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGl0ZW0uY29uZmlnKGN0eCksIG1vZHVsZSwgbmFtZSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbXB0cyA9IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBgJHttb2R1bGV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5oZWxwZXJbbW9kdWxlXS5nZXRJZExpc3QoKSxcclxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBDaG9vc2UgYShuKSAke21vZHVsZX1gXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnKCdwaWNCZWQudXBsb2FkZXInKSB8fCBjdHguZ2V0Q29uZmlnKCdwaWNCZWQuY3VycmVudCcpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0PElTdHJpbmdLZXlNYXA8YW55Pj4ocHJvbXB0cylcclxuICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGN0eC5oZWxwZXJbbW9kdWxlXS5nZXQoYW5zd2VyW21vZHVsZV0pXHJcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtPy5jb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBpdGVtLmNvbmZpZyhjdHgpLCBtb2R1bGUsIGFuc3dlclttb2R1bGVdKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIGNhc2UgJ3BsdWdpbic6XHJcbiAgICAgICAgICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJ3BpY2dvLXBsdWdpbi0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBgcGljZ28tcGx1Z2luLSR7bmFtZX1gXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGN0eC5nZXRDb25maWcoJ3BpY2dvUGx1Z2lucycpKS5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihuYW1lKT8uY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihuYW1lKSEuY29uZmlnIShjdHgpLCAncGx1Z2luJywgbmFtZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxvZy5lcnJvcihgTm8gcGx1Z2luIG5hbWVkICR7bmFtZX1gKTsgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21wdHMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3BsdWdpbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHgucGx1Z2luTG9hZGVyLmdldEZ1bGxMaXN0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQ2hvb3NlIGEgcGx1Z2luJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdDxhbnk+KHByb21wdHMpXHJcbiAgICAgICAgICAgICAgICAgIGlmIChjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihhbnN3ZXIucGx1Z2luKT8uY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgY3R4LnBsdWdpbkxvYWRlci5nZXRQbHVnaW4oYW5zd2VyLnBsdWdpbikhLmNvbmZpZyEoY3R4KSwgJ3BsdWdpbicsIGFuc3dlci5wbHVnaW4pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLndhcm4oJ0F2YWlsYWJsZSBtb2R1bGVzIGFyZSB1cGxvYWRlcnx0cmFuc2Zvcm1lcnxwbHVnaW58YnVpbGRpbicpOyByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoJ0NvbmZpZ3VyZSBjb25maWcgc3VjY2Vzc2Z1bGx5IScpXHJcbiAgICAgICAgICAgIGlmIChtb2R1bGUgPT09ICdwbHVnaW4nKSB7XHJcbiAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKCdJZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBjb25maWcsIHBsZWFzZSBydW4gXFwncGljZ28gdXNlIHBsdWdpbnNcXCcnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWRlYnVnJykpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSgpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHNldHRpbmdcclxuIiwiaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbiwgdHlwZSBVbmRlZmluYWJsZSwgdHlwZSBJQ0xJQ29uZmlncywgdHlwZSBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCB1c2U6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiBhc3luYyAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCd1c2UnKVxyXG4gICAgICAuYXJndW1lbnRzKCdbbW9kdWxlXScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbigndXNlIG1vZHVsZXMgb2YgcGljZ28nKVxyXG4gICAgICAuYWN0aW9uKChtb2R1bGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcclxuICAgICAgICAgICAgLy8gYXdhaXQgY3R4LnBsdWdpbkxvYWRlci5sb2FkKClcclxuICAgICAgICAgICAgbGV0IHByb21wdHM6IGFueVtdID0gW11cclxuICAgICAgICAgICAgY29uc3QgY29uZmlnOiBJQ0xJQ29uZmlncyA9IHtcclxuICAgICAgICAgICAgICB1cGxvYWRlcjoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3VwbG9hZGVyJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2UgYW4gdXBsb2FkZXInLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LmhlbHBlci51cGxvYWRlci5nZXRJZExpc3QoKSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGN0eC5nZXRDb25maWcoJ3BpY0JlZC51cGxvYWRlcicpIHx8IGN0eC5nZXRDb25maWcoJ3BpY0JlZC5jdXJyZW50JykgfHwgJ3NtbXMnXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lcjoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RyYW5zZm9ybWVyJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2UgYSB0cmFuc2Zvcm1lcicsXHJcbiAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldElkTGlzdCgpLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnRyYW5zZm9ybWVyJykgfHwgJ3BhdGgnXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBwbHVnaW5zOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3BsdWdpbnMnLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZSBwbHVnaW5zJyxcclxuICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5wbHVnaW5Mb2FkZXIuZ2V0RnVsbExpc3QoKSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IE9iamVjdC5rZXlzKGN0eC5nZXRDb25maWcoJ3BpY2dvUGx1Z2lucycpKS5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7aXRlbX1gKSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgYW4gb3B0aW9uIGlzIHNwZWNpZmljLCB0aGVuIGp1c3Qgc2V0IHRoaXMgb3B0aW9uIGluIGNvbmZpZ1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZ1ttb2R1bGVdKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9tcHRzLnB1c2goY29uZmlnW21vZHVsZV0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLndhcm4oJ0F2YWlsYWJsZSBtb2R1bGVzIGFyZSB1cGxvYWRlcnx0cmFuc2Zvcm1lcnxwbHVnaW5zJyk7IHJldHVyblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBwcm9tcHRzID0gT2JqZWN0LmtleXMoY29uZmlnKS5tYXAoKGl0ZW06IHN0cmluZykgPT4gY29uZmlnW2l0ZW1dKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGNtZC5pbnF1aXJlci5wcm9tcHQ8YW55Pihwcm9tcHRzKVxyXG5cclxuICAgICAgICAgICAgLy8gaGFuZGxlIGZvciBwbHVnaW5zIG9wdGlvbiBmcm9tIEFycmF5IHRvIG9iamVjdFxyXG4gICAgICAgICAgICBpZiAoYW5zd2VyLnBsdWdpbnMpIHtcclxuICAgICAgICAgICAgICBjb25zdCBwbHVnaW5zID0gY3R4LmdldENvbmZpZzxJU3RyaW5nS2V5TWFwPGJvb2xlYW4+PigncGljZ29QbHVnaW5zJylcclxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwbHVnaW5zKS5mb3JFYWNoKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIucGx1Z2lucy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICBwbHVnaW5zW2l0ZW1dID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcGx1Z2luc1tpdGVtXSA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAvLyBzYXZlIGNvbmZpZyBmb3IgcGx1Z2luc1xyXG4gICAgICAgICAgICAgIGN0eC5zYXZlQ29uZmlnKHtcclxuICAgICAgICAgICAgICAgIHBpY2dvUGx1Z2luczogcGx1Z2luc1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gc2F2ZSBjb25maWcgZm9yIHVwbG9hZGVyICYgdHJhbnNmb3JtZXJcclxuICAgICAgICAgICAgY3R4LnNhdmVDb25maWcoe1xyXG4gICAgICAgICAgICAgICdwaWNCZWQuY3VycmVudCc6IGFuc3dlci51cGxvYWRlciB8fCBjdHguZ2V0Q29uZmlnPHN0cmluZz4oJ3BpY0JlZC5jdXJyZW50JyksXHJcbiAgICAgICAgICAgICAgJ3BpY0JlZC51cGxvYWRlcic6IGFuc3dlci51cGxvYWRlciB8fCBjdHguZ2V0Q29uZmlnPHN0cmluZz4oJ3BpY0JlZC5jdXJyZW50JyksXHJcbiAgICAgICAgICAgICAgJ3BpY0JlZC50cmFuc2Zvcm1lcic6IGFuc3dlci50cmFuc2Zvcm1lciB8fCAncGF0aCdcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgY3R4LmxvZy5zdWNjZXNzKCdDb25maWd1cmUgY29uZmlnIHN1Y2Nlc3NmdWxseSEnKVxyXG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1kZWJ1ZycpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB1c2VcclxuIiwiaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgcHJveHk6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5vcHRpb24oJy1wLCAtLXByb3h5IDx1cmw+JywgJ3NldCBwcm94eSBmb3IgdXBsb2FkaW5nJywgKHByb3h5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjdHguc2V0Q29uZmlnKHtcclxuICAgICAgICAgICdwaWNCZWQucHJveHknOiBwcm94eVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBwcm94eVxyXG4iLCJpbXBvcnQgbWF0Y2ggZnJvbSAnbWluaW1hdGNoJ1xyXG5pbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJT3B0aW9ucywgdHlwZSBJRmlsZVRyZWUgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgZ2xvYmJ5IGZyb20gJ2dsb2JieSdcclxuaW1wb3J0IGVqcyBmcm9tICdlanMnXHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgdGVtcGxhdGUgZmlsZXMgdG8gZGVzdGluYXRpb24gZmlsZXMuXHJcbiAqIEBwYXJhbSB7UGljR299IGN0eFxyXG4gKiBAcGFyYW0ge0lPcHRpb25zfSBvcHRpb25zXHJcbiAqL1xyXG5jb25zdCBnZW5lcmF0ZSA9IGFzeW5jIChjdHg6IElQaWNHbywgb3B0aW9uczogSU9wdGlvbnMpOiBQcm9taXNlPGFueT4gPT4ge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBvcHRzID0gZ2V0T3B0aW9ucyhvcHRpb25zLnRtcClcclxuICAgIGNvbnN0IHNvdXJjZSA9IHBhdGguam9pbihvcHRpb25zLnRtcCwgJ3RlbXBsYXRlJylcclxuICAgIGxldCBhbnN3ZXJzID0ge31cclxuICAgIGlmIChvcHRzLnByb21wdHMgJiYgb3B0cy5wcm9tcHRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgYW5zd2VycyA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KG9wdHMucHJvbXB0cylcclxuICAgIH1cclxuICAgIGxldCBfZmlsZXM6IHN0cmluZ1tdID0gYXdhaXQgZ2xvYmJ5KFsnKiovKiddLCB7IGN3ZDogc291cmNlLCBkb3Q6IHRydWUgfSkgLy8gZ2V0IGZpbGVzJyBuYW1lIGFycmF5XHJcbiAgICBfZmlsZXMgPSBfZmlsZXMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgbGV0IGdsb2IgPSAnJ1xyXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZpbHRlcnMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKG1hdGNoKGl0ZW0sIGtleSwgeyBkb3Q6IHRydWUgfSkpIHtcclxuICAgICAgICAgIGdsb2IgPSBpdGVtXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBpZiAoZ2xvYikgeyAvLyBmaW5kIGEgZmlsdGVyIGV4cHJlc3Npb25cclxuICAgICAgICByZXR1cm4gZmlsdGVycyhjdHgsIG9wdHMuZmlsdGVyc1tnbG9iXSwgYW5zd2VycylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgaWYgKF9maWxlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY3R4LmxvZy53YXJuKCdUZW1wbGF0ZSBmaWxlcyBub3QgZm91bmQhJyk7IHJldHVyblxyXG4gICAgfVxyXG4gICAgY29uc3QgZmlsZXMgPSByZW5kZXIoX2ZpbGVzLCBzb3VyY2UsIGFuc3dlcnMpXHJcbiAgICB3cml0ZUZpbGVUcmVlKG9wdGlvbnMuZGVzdCwgZmlsZXMpXHJcbiAgICBpZiAodHlwZW9mIG9wdHMuY29tcGxldGUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgb3B0cy5jb21wbGV0ZSh7IGFuc3dlcnMsIG9wdGlvbnMsIGZpbGVzOiBfZmlsZXMsIGN0eCB9KVxyXG4gICAgfVxyXG4gICAgaWYgKG9wdHMuY29tcGxldGVNZXNzYWdlKSB7XHJcbiAgICAgIGN0eC5sb2cuc3VjY2VzcyhvcHRzLmNvbXBsZXRlTWVzc2FnZSlcclxuICAgIH1cclxuICAgIGN0eC5sb2cuc3VjY2VzcygnRG9uZSEnKVxyXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0aGUgZmlsdGVycycgcmVzdWx0XHJcbiAqIEBwYXJhbSBjdHggUGljR29cclxuICogQHBhcmFtIGV4cCBjb25kaXRpb24gZXhwcmVzc2lvblxyXG4gKiBAcGFyYW0gZGF0YSBvcHRpb25zIGRhdGFcclxuICovXHJcbmNvbnN0IGZpbHRlcnMgPSAoY3R4OiBJUGljR28sIGV4cDogYW55LCBkYXRhOiBhbnkpOiBib29sZWFuID0+IHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXBsdXMtb3BlcmFuZHMsIG5vLW5ldy1mdW5jLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsXHJcbiAgY29uc3QgZm4gPSBuZXcgRnVuY3Rpb24oJ2RhdGEnLCAnd2l0aCAoZGF0YSkgeyByZXR1cm4gJyArIGV4cCArICd9JylcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIGZuKGRhdGEpXHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgY3R4LmxvZy5lcnJvcihgRXJyb3Igd2hlbiBldmFsdWF0aW5nIGZpbHRlciBjb25kaXRpb246ICR7SlNPTi5zdHJpbmdpZnkoZXhwKX1gKVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRlbXBsYXRlIG9wdGlvbnNcclxuICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlUGF0aFxyXG4gKi9cclxuY29uc3QgZ2V0T3B0aW9ucyA9ICh0ZW1wbGF0ZVBhdGg6IHN0cmluZyk6IGFueSA9PiB7XHJcbiAgY29uc3Qgb3B0aW9uc1BhdGggPSBwYXRoLmpvaW4odGVtcGxhdGVQYXRoLCAnaW5kZXguanMnKVxyXG4gIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnNQYXRoKSkge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcclxuICAgIGNvbnN0IG9wdGlvbnMgPSByZXF1aXJlKG9wdGlvbnNQYXRoKVxyXG4gICAgcmV0dXJuIG9wdGlvbnNcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHt9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmVuZGVyIGZpbGVzIHRvIGEgdmlydHVhbCB0cmVlIG9iamVjdFxyXG4gKiBAcGFyYW0ge2FycmF5fSBmaWxlc1xyXG4gKi9cclxuY29uc3QgcmVuZGVyID0gKGZpbGVzOiBzdHJpbmdbXSwgc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSA9PiB7XHJcbiAgY29uc3QgZmlsZVRyZWU6IElGaWxlVHJlZSA9IHt9XHJcbiAgZmlsZXMuZm9yRWFjaCgoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgZmlsZSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oc291cmNlLCBmaWxlUGF0aCksICd1dGY4JylcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBlanMucmVuZGVyKGZpbGUsIG9wdGlvbnMpXHJcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbnRlbnQpIHx8IC9bXlxcc10vLnRlc3QoY29udGVudCkpIHtcclxuICAgICAgZmlsZVRyZWVbZmlsZVBhdGhdID0gY29udGVudFxyXG4gICAgfVxyXG4gIH0pXHJcbiAgcmV0dXJuIGZpbGVUcmVlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBXcml0ZSByZW5kZXJlZCBmaWxlcycgY29udGVudCB0byByZWFsIGZpbGVcclxuICogQHBhcmFtIHtzdHJpbmd9IGRpclxyXG4gKiBAcGFyYW0ge29iamVjdH0gZmlsZXNcclxuICovXHJcbmNvbnN0IHdyaXRlRmlsZVRyZWUgPSAoZGlyOiBzdHJpbmcsIGZpbGVzOiBhbnkpOiB2b2lkID0+IHtcclxuICBPYmplY3Qua2V5cyhmaWxlcykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXIsIG5hbWUpXHJcbiAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCkpXHJcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmaWxlc1tuYW1lXSlcclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQge1xyXG4gIGZpbHRlcnMsXHJcbiAgZ2VuZXJhdGUsXHJcbiAgcmVuZGVyLFxyXG4gIHdyaXRlRmlsZVRyZWVcclxufVxyXG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICcuLi8uLi91dGlscy9pbml0VXRpbHMnXHJcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcydcclxuaW1wb3J0IGRvd25sb2FkIGZyb20gJ2Rvd25sb2FkLWdpdC1yZXBvJ1xyXG5pbXBvcnQgeyB0eXBlIElPcHRpb25zLCB0eXBlIElQbHVnaW4sIHR5cGUgSVBpY0dvIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBybSBmcm9tICdyaW1yYWYnXHJcblxyXG5jb25zdCBydW4gPSAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElPcHRpb25zKTogdm9pZCA9PiB7XHJcbiAgLy8gY29uc3QgbmFtZSA9IG9wdGlvbnMuaW5QbGFjZSA/IHBhdGgucmVsYXRpdmUoJy4uLycsIHByb2Nlc3MuY3dkKCkpIDogb3B0aW9ucy5wcm9qZWN0XHJcbiAgaWYgKG9wdGlvbnMub2ZmbGluZSkgeyAvLyBvZmZsaW5lIG1vZGVcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnMudGVtcGxhdGUpKSB7XHJcbiAgICAgIGdlbmVyYXRlKGN0eCwgb3B0aW9ucykuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3R4LmxvZy5lcnJvcihgTG9jYWwgdGVtcGxhdGUgJHtvcHRpb25zLnRlbXBsYXRlfSBub3QgZm91bmRgKVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7IC8vIG9ubGluZSBtb2RlXHJcbiAgICBvcHRpb25zLnRlbXBsYXRlID0gIW9wdGlvbnMuaGFzU2xhc2hcclxuICAgICAgPyAnUGljR28vcGljZ28tdGVtcGxhdGUtJyArIG9wdGlvbnMudGVtcGxhdGUgLy8gb2ZmaWNpYWwgdGVtcGxhdGVcclxuICAgICAgOiBvcHRpb25zLnRlbXBsYXRlXHJcbiAgICBkb3dubG9hZEFuZEdlbmVyYXRlKGN0eCwgb3B0aW9ucylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBkb3dubG9hZCB0ZW1wbGF0ZSAmIGdlbmVyYXRlXHJcbiAqIEBwYXJhbSB7IFBpY0dvIH0gY3R4XHJcbiAqIEBwYXJhbSB7IElPcHRpb25zIH0gb3B0aW9uc1xyXG4gKi9cclxuY29uc3QgZG93bmxvYWRBbmRHZW5lcmF0ZSA9IChjdHg6IElQaWNHbywgb3B0aW9uczogSU9wdGlvbnMpOiB2b2lkID0+IHtcclxuICBpZiAoZnMuZXhpc3RzU3luYyhvcHRpb25zLnRtcCkpIHtcclxuICAgIHJtLnN5bmMob3B0aW9ucy50bXApXHJcbiAgfVxyXG4gIGN0eC5sb2cuaW5mbygnVGVtcGxhdGUgZmlsZXMgYXJlIGRvd25sb2FkaW5nLi4uJylcclxuICBkb3dubG9hZChvcHRpb25zLnRlbXBsYXRlLCBvcHRpb25zLnRtcCwgeyBjbG9uZTogb3B0aW9ucy5jbG9uZSB9LCAoZXJyOiBFcnJvcikgPT4ge1xyXG4gICAgaWYgKGVycikge1xyXG4gICAgICBjdHgubG9nLmVycm9yKGVycik7IHJldHVyblxyXG4gICAgfVxyXG4gICAgY3R4LmxvZy5zdWNjZXNzKCdUZW1wbGF0ZSBmaWxlcyBhcmUgZG93bmxvYWRlZCEnKVxyXG4gICAgZ2VuZXJhdGUoY3R4LCBvcHRpb25zKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3QgaW5pdDogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IGFzeW5jIChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ2luaXQnKVxyXG4gICAgICAuYXJndW1lbnRzKCc8dGVtcGxhdGU+IFtwcm9qZWN0XScpXHJcbiAgICAgIC5vcHRpb24oJy0tY2xvbmUnLCAndXNlIGdpdCBjbG9uZScpXHJcbiAgICAgIC5vcHRpb24oJy0tb2ZmbGluZScsICd1c2UgY2FjaGVkIHRlbXBsYXRlJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCdjcmVhdGUgcGljZ28gcGx1Z2luXFwncyBkZXZlbG9wbWVudCB0ZW1wbGF0ZXMnKVxyXG4gICAgICAuYWN0aW9uKCh0ZW1wbGF0ZTogc3RyaW5nLCBwcm9qZWN0OiBzdHJpbmcsIHByb2dyYW06IGFueSkgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAvLyBUaGFua3MgdG8gdnVlLWNsaSBpbml0OiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWNsaS9ibG9iL21hc3Rlci9iaW4vdnVlLWluaXRcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc1NsYXNoID0gdGVtcGxhdGUuaW5jbHVkZXMoJy8nKVxyXG4gICAgICAgICAgICBjb25zdCBpblBsYWNlID0gIXByb2plY3QgfHwgcHJvamVjdCA9PT0gJy4nXHJcbiAgICAgICAgICAgIGNvbnN0IGRlc3QgPSBwYXRoLnJlc29sdmUocHJvamVjdCB8fCAnLicpXHJcbiAgICAgICAgICAgIGNvbnN0IGNsb25lID0gcHJvZ3JhbS5jbG9uZSB8fCBmYWxzZVxyXG4gICAgICAgICAgICBjb25zdCBvZmZsaW5lID0gcHJvZ3JhbS5vZmZsaW5lIHx8IGZhbHNlXHJcbiAgICAgICAgICAgIGNvbnN0IHRtcCA9IHBhdGguam9pbihob21lZGlyKCksICcucGljZ28vdGVtcGxhdGVzJywgdGVtcGxhdGUucmVwbGFjZSgvWy86XS9nLCAnLScpKSAvLyBmb3IgY2FjaGluZyB0ZW1wbGF0ZVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb2dyYW0ub2ZmbGluZSkge1xyXG4gICAgICAgICAgICAgIHRlbXBsYXRlID0gdG1wXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgdGVtcGxhdGUsXHJcbiAgICAgICAgICAgICAgcHJvamVjdCxcclxuICAgICAgICAgICAgICBoYXNTbGFzaCxcclxuICAgICAgICAgICAgICBpblBsYWNlLFxyXG4gICAgICAgICAgICAgIGRlc3QsXHJcbiAgICAgICAgICAgICAgY2xvbmUsXHJcbiAgICAgICAgICAgICAgdG1wLFxyXG4gICAgICAgICAgICAgIG9mZmxpbmVcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgcHJvamVjdCBpcyBlbXB0eSBvciBleGlzdFxyXG4gICAgICAgICAgICBpZiAoaW5QbGFjZSB8fCBmcy5leGlzdHNTeW5jKGRlc3QpKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgY3R4LmNtZC5pbnF1aXJlci5wcm9tcHQoW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGluUGxhY2VcclxuICAgICAgICAgICAgICAgICAgICA/ICdHZW5lcmF0ZSBwcm9qZWN0IGluIGN1cnJlbnQgZGlyZWN0b3J5PydcclxuICAgICAgICAgICAgICAgICAgICA6ICdUYXJnZXQgZGlyZWN0b3J5IGV4aXN0cy4gQ29udGludWU/JyxcclxuICAgICAgICAgICAgICAgICAgbmFtZTogJ29rJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIF0pLnRoZW4oKGFuc3dlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyLm9rKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJ1bihjdHgsIG9wdGlvbnMpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHsgLy8gcHJvamVjdCBpcyBnaXZlblxyXG4gICAgICAgICAgICAgIHJ1bihjdHgsIG9wdGlvbnMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZGVidWcnKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKCkuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gICAgICAub24oJy0taGVscCcsICgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgICAgY29uc29sZS5sb2coJ0V4YW1wbGVzOicpXHJcbiAgICAgICAgY29uc29sZS5sb2coKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgIyBjcmVhdGUgYSBuZXcgcHJvamVjdCB3aXRoIGFuIG9mZmljaWFsIHRlbXBsYXRlJykpXHJcbiAgICAgICAgY29uc29sZS5sb2coJyAgJCBwaWNnbyBpbml0IHBsdWdpbiBteS1wcm9qZWN0JylcclxuICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAjIGNyZWF0ZSBhIG5ldyBwcm9qZWN0IHN0cmFpZ2h0IGZyb20gYSBnaXRodWIgdGVtcGxhdGUnKSlcclxuICAgICAgICBjb25zb2xlLmxvZygnICAkIHBpY2dvIGluaXQgdXNlcm5hbWUvcmVwbyBteS1wcm9qZWN0JylcclxuICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBpbml0XHJcbiIsImltcG9ydCB7IHR5cGUgSVBsdWdpbiwgdHlwZSBJUGljR28sIHR5cGUgSVN0cmluZ0tleU1hcCB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgaTE4bjogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ2kxOG4nKVxyXG4gICAgICAuYXJndW1lbnRzKCdbbGFuZ10nKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ2NoYW5nZSBwaWNnbyBsYW5ndWFnZScpXHJcbiAgICAgIC5hY3Rpb24oYXN5bmMgKGxhbmc6IHN0cmluZyA9ICcnKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGlzdCA9IGN0eC5pMThuLmdldExhbmd1YWdlTGlzdCgpXHJcbiAgICAgICAgaWYgKCFsYW5nKSB7XHJcbiAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgIG5hbWU6ICdpMThuJyxcclxuICAgICAgICAgICAgICBjaG9pY2VzOiBsaXN0LFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdDaG9vc2UgYSBsYW5ndWFnZScsXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDogY3R4LmdldENvbmZpZygnc2V0dGluZ3MubGFuZ3VhZ2UnKSB8fCAnemgtQ04nXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0PElTdHJpbmdLZXlNYXA8c3RyaW5nPj4ocHJvbXB0cylcclxuICAgICAgICAgIGN0eC5pMThuLnNldExhbmd1YWdlKGFuc3dlci5pMThuKVxyXG4gICAgICAgICAgY3R4LmxvZy5zdWNjZXNzKGBMYW5ndWFnZSBzZXQgdG8gJHthbnN3ZXIuaTE4bn1gKVxyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbGlzdC5pbmNsdWRlcyhsYW5nKSkge1xyXG4gICAgICAgICAgY3R4LmxvZy53YXJuKCdObyBzdWNoIGxhbmd1YWdlJyk7IHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBjdHguaTE4bi5zZXRMYW5ndWFnZShsYW5nKVxyXG4gICAgICAgIGN0eC5sb2cuc3VjY2VzcyhgTGFuZ3VhZ2Ugc2V0IHRvICR7bGFuZ31gKVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgaTE4blxyXG4iLCJpbXBvcnQgcGx1Z2luSGFuZGxlciBmcm9tICcuL3BsdWdpbkhhbmRsZXInXHJcbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnXHJcbmltcG9ydCB1cGxvYWQgZnJvbSAnLi91cGxvYWQnXHJcbmltcG9ydCBzZXR0aW5nIGZyb20gJy4vc2V0dGluZydcclxuaW1wb3J0IHVzZSBmcm9tICcuL3VzZSdcclxuaW1wb3J0IHByb3h5IGZyb20gJy4vcHJveHknXHJcbmltcG9ydCBpbml0IGZyb20gJy4vaW5pdCdcclxuaW1wb3J0IGkxOG4gZnJvbSAnLi9pMThuJ1xyXG5pbXBvcnQgeyB0eXBlIElQaWNHbyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKGN0eDogSVBpY0dvKTogdm9pZCA9PiB7XHJcbiAgY3R4LmNtZC5yZWdpc3RlcigncGx1Z2luSGFuZGxlcicsIHBsdWdpbkhhbmRsZXIpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcignY29uZmlnJywgY29uZmlnKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3NldHRpbmcnLCBzZXR0aW5nKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3VwbG9hZCcsIHVwbG9hZClcclxuICBjdHguY21kLnJlZ2lzdGVyKCd1c2UnLCB1c2UpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcigncHJveHknLCBwcm94eSlcclxuICBjdHguY21kLnJlZ2lzdGVyKCdpbml0JywgaW5pdClcclxuICBjdHguY21kLnJlZ2lzdGVyKCdpMThuJywgaTE4bilcclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQbHVnaW4sIHR5cGUgSUxpZmVjeWNsZVBsdWdpbnMgfSBmcm9tICcuLi90eXBlcydcclxuXHJcbmV4cG9ydCBjbGFzcyBMaWZlY3ljbGVQbHVnaW5zIGltcGxlbWVudHMgSUxpZmVjeWNsZVBsdWdpbnMge1xyXG4gIHN0YXRpYyBjdXJyZW50UGx1Z2luOiBzdHJpbmcgfCBudWxsXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0OiBNYXA8c3RyaW5nLCBJUGx1Z2luPlxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPlxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nXHJcblxyXG4gIGNvbnN0cnVjdG9yIChuYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubmFtZSA9IG5hbWVcclxuICAgIHRoaXMubGlzdCA9IG5ldyBNYXAoKVxyXG4gICAgdGhpcy5wbHVnaW5JZE1hcCA9IG5ldyBNYXAoKVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXIgKGlkOiBzdHJpbmcsIHBsdWdpbjogSVBsdWdpbik6IHZvaWQge1xyXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignaWQgaXMgcmVxdWlyZWQhJylcclxuICAgIGlmICh0eXBlb2YgcGx1Z2luLmhhbmRsZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcigncGx1Z2luLmhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24hJylcclxuICAgIGlmICh0aGlzLmxpc3QuaGFzKGlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLm5hbWV9IGR1cGxpY2F0ZSBpZDogJHtpZH0hYClcclxuICAgIHRoaXMubGlzdC5zZXQoaWQsIHBsdWdpbilcclxuICAgIGlmIChMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW4pIHtcclxuICAgICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbikpIHtcclxuICAgICAgICB0aGlzLnBsdWdpbklkTWFwLmdldChMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW4pPy5wdXNoKGlkKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuc2V0KExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbiwgW2lkXSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlciAocGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMocGx1Z2luTmFtZSkpIHtcclxuICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luSWRNYXAuZ2V0KHBsdWdpbk5hbWUpXHJcbiAgICAgIHBsdWdpbkxpc3Q/LmZvckVhY2goKHBsdWdpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5saXN0LmRlbGV0ZShwbHVnaW4pXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXROYW1lICgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubmFtZVxyXG4gIH1cclxuXHJcbiAgZ2V0IChpZDogc3RyaW5nKTogSVBsdWdpbiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5saXN0LmdldChpZClcclxuICB9XHJcblxyXG4gIGdldExpc3QgKCk6IElQbHVnaW5bXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMubGlzdC52YWx1ZXMoKV1cclxuICB9XHJcblxyXG4gIGdldElkTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3Qua2V5cygpXVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldEN1cnJlbnRQbHVnaW5OYW1lID0gKG5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogdm9pZCA9PiB7XHJcbiAgTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luID0gbmFtZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBsdWdpbk5hbWUgPSAoKTogc3RyaW5nIHwgbnVsbCA9PiB7XHJcbiAgcmV0dXJuIExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaWZlY3ljbGVQbHVnaW5zXHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1taXN1c2VkLXByb21pc2VzICovXHJcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInXHJcbmltcG9ydCBpbnF1aXJlciwgeyB0eXBlIElucXVpcmVyIH0gZnJvbSAnaW5xdWlyZXInXHJcbmltcG9ydCB7IHR5cGUgSVBsdWdpbiwgdHlwZSBJQ29tbWFuZGVyLCB0eXBlIElQaWNHbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgY29tbWFuZGVycyBmcm9tICcuLi9wbHVnaW5zL2NvbW1hbmRlcidcclxuaW1wb3J0IHsgZ2V0Q3VycmVudFBsdWdpbk5hbWUgfSBmcm9tICcuL0xpZmVjeWNsZVBsdWdpbnMnXHJcblxyXG5leHBvcnQgY2xhc3MgQ29tbWFuZGVyIGltcGxlbWVudHMgSUNvbW1hbmRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lID0gJ2NvbW1hbmRlcidcclxuICBzdGF0aWMgY3VycmVudFBsdWdpbjogc3RyaW5nIHwgbnVsbFxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdCA9IG5ldyBNYXA8c3RyaW5nLCBJUGx1Z2luPigpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuXHJcbiAgcHJvZ3JhbTogQ29tbWFuZFxyXG4gIGlucXVpcmVyOiBJbnF1aXJlclxyXG5cclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcclxuICAgIHRoaXMuaW5xdWlyZXIgPSBpbnF1aXJlclxyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICB9XHJcblxyXG4gIGdldE5hbWUgKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5uYW1lXHJcbiAgfVxyXG5cclxuICBpbml0ICgpOiB2b2lkIHtcclxuICAgIHRoaXMucHJvZ3JhbVxyXG4gICAgICAudmVyc2lvbihwcm9jZXNzLmVudi5QSUNHT19WRVJTSU9OLCAnLXYsIC0tdmVyc2lvbicpXHJcbiAgICAgIC5vcHRpb24oJy1kLCAtLWRlYnVnJywgJ2RlYnVnIG1vZGUnLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdHguc2V0Q29uZmlnKHtcclxuICAgICAgICAgIGRlYnVnOiB0cnVlXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgLm9wdGlvbignLXMsIC0tc2lsZW50JywgJ3NpbGVudCBtb2RlJywgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3R4LnNldENvbmZpZyh7XHJcbiAgICAgICAgICBzaWxlbnQ6IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgICAub24oJ2NvbW1hbmQ6KicsICgpID0+IHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoYEludmFsaWQgY29tbWFuZDogJHt0aGlzLnByb2dyYW0uYXJncy5qb2luKCcgJyl9XFxuU2VlIC0taGVscCBmb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBjb21tYW5kcy5gKVxyXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxyXG4gICAgICB9KVxyXG5cclxuICAgIC8vIGJ1aWx0LWluIGNvbW1hbmRzXHJcbiAgICBjb21tYW5kZXJzKHRoaXMuY3R4KVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXIgKGlkOiBzdHJpbmcsIHBsdWdpbjogSVBsdWdpbik6IHZvaWQge1xyXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignbmFtZSBpcyByZXF1aXJlZCEnKVxyXG4gICAgaWYgKHR5cGVvZiBwbHVnaW4uaGFuZGxlICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdwbHVnaW4uaGFuZGxlIG11c3QgYmUgYSBmdW5jdGlvbiEnKVxyXG4gICAgaWYgKHRoaXMubGlzdC5oYXMoaWQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3RoaXMubmFtZX0gcGx1Z2luIGR1cGxpY2F0ZSBpZDogJHtpZH0hYClcclxuICAgIHRoaXMubGlzdC5zZXQoaWQsIHBsdWdpbilcclxuICAgIGNvbnN0IGN1cnJlbnRQbHVnaW5OYW1lID0gZ2V0Q3VycmVudFBsdWdpbk5hbWUoKVxyXG4gICAgaWYgKGN1cnJlbnRQbHVnaW5OYW1lICE9PSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLnBsdWdpbklkTWFwLmhhcyhjdXJyZW50UGx1Z2luTmFtZSkpIHtcclxuICAgICAgICB0aGlzLnBsdWdpbklkTWFwLmdldChjdXJyZW50UGx1Z2luTmFtZSk/LnB1c2goaWQpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5JZE1hcC5zZXQoY3VycmVudFBsdWdpbk5hbWUsIFtpZF0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVucmVnaXN0ZXIgKHBsdWdpbk5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKHBsdWdpbk5hbWUpKSB7XHJcbiAgICAgIGNvbnN0IHBsdWdpbkxpc3QgPSB0aGlzLnBsdWdpbklkTWFwLmdldChwbHVnaW5OYW1lKVxyXG4gICAgICBwbHVnaW5MaXN0Py5mb3JFYWNoKChwbHVnaW46IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHRoaXMubGlzdC5kZWxldGUocGx1Z2luKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZENvbW1hbmRzICgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2V0TGlzdCgpLmZvckVhY2goKGl0ZW06IElQbHVnaW4pID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpdGVtLmhhbmRsZSh0aGlzLmN0eClcclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGUpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgKGlkOiBzdHJpbmcpOiBJUGx1Z2luIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmxpc3QuZ2V0KGlkKVxyXG4gIH1cclxuXHJcbiAgZ2V0TGlzdCAoKTogSVBsdWdpbltdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5saXN0LnZhbHVlcygpXVxyXG4gIH1cclxuXHJcbiAgZ2V0SWRMaXN0ICgpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMubGlzdC5rZXlzKCldXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDb21tYW5kZXJcclxuIiwiZXhwb3J0IGVudW0gSUxvZ1R5cGUge1xyXG4gIHN1Y2Nlc3MgPSAnc3VjY2VzcycsXHJcbiAgaW5mbyA9ICdpbmZvJyxcclxuICB3YXJuID0gJ3dhcm4nLFxyXG4gIGVycm9yID0gJ2Vycm9yJ1xyXG59XHJcblxyXG4vKipcclxuICogdGhlc2UgZXZlbnRzIHdpbGwgYmUgY2F0Y2hlZCBieSB1c2Vyc1xyXG4gKi9cclxuZXhwb3J0IGVudW0gSUJ1aWxkSW5FdmVudCB7XHJcbiAgVVBMT0FEX1BST0dSRVNTID0gJ3VwbG9hZFByb2dyZXNzJyxcclxuICBGQUlMRUQgPSAnZmFpbGVkJyxcclxuICBCRUZPUkVfVFJBTlNGT1JNID0gJ2JlZm9yZVRyYW5zZm9ybScsXHJcbiAgQkVGT1JFX1VQTE9BRCA9ICdiZWZvcmVVcGxvYWQnLFxyXG4gIEFGVEVSX1VQTE9BRCA9ICdhZnRlclVwbG9hZCcsXHJcbiAgRklOSVNIRUQgPSAnZmluaXNoZWQnLFxyXG4gIElOU1RBTEwgPSAnaW5zdGFsbCcsXHJcbiAgVU5JTlNUQUxMID0gJ3VuaW5zdGFsbCcsXHJcbiAgVVBEQVRFID0gJ3VwZGF0ZScsXHJcbiAgTk9USUZJQ0FUSU9OID0gJ25vdGlmaWNhdGlvbidcclxufVxyXG5cclxuLyoqXHJcbiAqIHRoZXNlIGV2ZW50cyB3aWxsIGJlIGNhdGNoZWQgb25seSBieSBwaWNnb1xyXG4gKi9cclxuZXhwb3J0IGVudW0gSUJ1c0V2ZW50IHtcclxuICBDT05GSUdfQ0hBTkdFID0gJ0NPTkZJR19DSEFOR0UnXHJcbn1cclxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHV0aWwgZnJvbSAndXRpbCdcclxuaW1wb3J0IHsgSUxvZ1R5cGUgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQge1xyXG4gIHR5cGUgSUxvZ0FyZ3ZUeXBlLFxyXG4gIHR5cGUgSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yLFxyXG4gIHR5cGUgVW5kZWZpbmFibGUsXHJcbiAgdHlwZSBJTG9nQ29sb3IsXHJcbiAgdHlwZSBJTG9nZ2VyLFxyXG4gIHR5cGUgSVBpY0dvXHJcbn0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IGZvcmNlTnVtYmVyLCBpc0RldiB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbidcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxldmVsID0ge1xyXG4gICAgW0lMb2dUeXBlLnN1Y2Nlc3NdOiAnZ3JlZW4nLFxyXG4gICAgW0lMb2dUeXBlLmluZm9dOiAnYmx1ZScsXHJcbiAgICBbSUxvZ1R5cGUud2Fybl06ICd5ZWxsb3cnLFxyXG4gICAgW0lMb2dUeXBlLmVycm9yXTogJ3JlZCdcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBwcml2YXRlIGxvZ0xldmVsITogc3RyaW5nIHwgc3RyaW5nW11cclxuICBwcml2YXRlIGxvZ1BhdGghOiBzdHJpbmdcclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUxvZyAodHlwZTogSUxvZ1R5cGUsIC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcclxuICAgIC8vIGNoZWNrIGNvbmZpZy5zaWxlbnRcclxuICAgIHRoaXMubG9nTGV2ZWwgPSB0aGlzLmN0eC5nZXRDb25maWcoJ3NldHRpbmdzLmxvZ0xldmVsJylcclxuICAgIGlmICghdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdzaWxlbnQnKSAmJiB0aGlzLmNoZWNrTG9nTGV2ZWwodHlwZSwgdGhpcy5sb2dMZXZlbCkpIHtcclxuICAgICAgY29uc3QgbG9nSGVhZGVyID0gY2hhbGtbdGhpcy5sZXZlbFt0eXBlXSBhcyBJTG9nQ29sb3JdKGBbUGljTGlzdCAke3R5cGUudG9VcHBlckNhc2UoKX1dOmApXHJcbiAgICAgIGNvbnNvbGUubG9nKGxvZ0hlYWRlciwgLi4ubXNnKVxyXG4gICAgICB0aGlzLmxvZ1BhdGggPSB0aGlzLmN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3NldHRpbmdzLmxvZ1BhdGgnKSB8fCBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgJy4vcGljbGlzdC5sb2cnKVxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyBmaXggbG9nIGZpbGUgaXMgdG9vIGxhcmdlLCBub3cgdGhlIGxvZyBmaWxlJ3MgZGVmYXVsdCBzaXplIGlzIDEwIE1CXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY2hlY2tMb2dGaWxlSXNMYXJnZSh0aGlzLmxvZ1BhdGgpXHJcbiAgICAgICAgICBpZiAocmVzdWx0LmlzTGFyZ2UpIHtcclxuICAgICAgICAgICAgY29uc3Qgd2FybmluZ01zZyA9IGBMb2cgZmlsZSBpcyB0b28gbGFyZ2UgKD4gJHsocmVzdWx0LmxvZ0ZpbGVTaXplTGltaXQhKSAvIDEwMjQgLyAxMDI0IHx8ICcxMCd9IE1CKSwgcmVjcmVhdGUgbG9nIGZpbGVgXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnW1BpY0xpc3QgV0FSTl06JyksIHdhcm5pbmdNc2cpXHJcbiAgICAgICAgICAgIHRoaXMucmVjcmVhdGVMb2dGaWxlKHRoaXMubG9nUGF0aClcclxuICAgICAgICAgICAgbXNnLnVuc2hpZnQod2FybmluZ01zZylcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaGFuZGxlV3JpdGVMb2codGhpcy5sb2dQYXRoLCB0eXBlLCAuLi5tc2cpXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gd2h5Pz8/XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbUGljTGlzdCBFcnJvcl0gb24gY2hlY2tpbmcgbG9nIGZpbGUgc2l6ZScsIGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAwKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0xvZ0ZpbGVJc0xhcmdlIChsb2dQYXRoOiBzdHJpbmcpOiB7XHJcbiAgICBpc0xhcmdlOiBib29sZWFuXHJcbiAgICBsb2dGaWxlU2l6ZT86IG51bWJlclxyXG4gICAgbG9nRmlsZVNpemVMaW1pdD86IG51bWJlclxyXG4gIH0ge1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9nUGF0aCkpIHtcclxuICAgICAgY29uc3QgbG9nRmlsZVNpemUgPSBmcy5zdGF0U3luYyhsb2dQYXRoKS5zaXplXHJcbiAgICAgIGNvbnN0IGxvZ0ZpbGVTaXplTGltaXQgPSBmb3JjZU51bWJlcih0aGlzLmN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8bnVtYmVyPj4oJ3NldHRpbmdzLmxvZ0ZpbGVTaXplTGltaXQnKSB8fCAxMCkgKiAxMDI0ICogMTAyNCAvLyAxMCBNQiBkZWZhdWx0XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaXNMYXJnZTogbG9nRmlsZVNpemUgPiBsb2dGaWxlU2l6ZUxpbWl0LFxyXG4gICAgICAgIGxvZ0ZpbGVTaXplLFxyXG4gICAgICAgIGxvZ0ZpbGVTaXplTGltaXRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaXNMYXJnZTogZmFsc2VcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVjcmVhdGVMb2dGaWxlIChsb2dQYXRoOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvZ1BhdGgpKSB7XHJcbiAgICAgIGZzLnVubGlua1N5bmMobG9nUGF0aClcclxuICAgICAgZnMuY3JlYXRlRmlsZVN5bmMobG9nUGF0aClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlV3JpdGVMb2cgKGxvZ1BhdGg6IHN0cmluZywgdHlwZTogc3RyaW5nLCAuLi5tc2c6IElMb2dBcmd2VHlwZVdpdGhFcnJvcltdKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgbG9nID0gYCR7ZGF5anMoKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKX0gW1BpY0xpc3QgJHt0eXBlLnRvVXBwZXJDYXNlKCl9XSBgXHJcbiAgICAgIG1zZy5mb3JFYWNoKChpdGVtOiBJTG9nQXJndlR5cGVXaXRoRXJyb3IpID0+IHtcclxuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEVycm9yICYmIHR5cGUgPT09ICdlcnJvcicpIHtcclxuICAgICAgICAgIGxvZyArPSBgXFxuLS0tLS0tRXJyb3IgU3RhY2sgQmVnaW4tLS0tLS1cXG4ke3V0aWwuZm9ybWF0KGl0ZW0/LnN0YWNrKX1cXG4tLS0tLS0tRXJyb3IgU3RhY2sgRW5kLS0tLS0tLSBgXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgaXRlbSA9IEpTT04uc3RyaW5naWZ5KGl0ZW0sIG51bGwsIDIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsb2cgKz0gYCR7aXRlbSBhcyBzdHJpbmd9IGBcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGxvZyArPSAnXFxuJ1xyXG4gICAgICAvLyBBIHN5bmNocm9uaXplZCBhcHByb2FjaCB0byBhdm9pZCBsb2cgbXNnIHNlcXVlbmNlIGVycm9yc1xyXG4gICAgICBmcy5hcHBlbmRGaWxlU3luYyhsb2dQYXRoLCBsb2cpXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tQaWNMaXN0IEVycm9yXSBvbiB3cml0aW5nIGxvZyBmaWxlJywgZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tMb2dMZXZlbCAodHlwZTogc3RyaW5nLCBsZXZlbDogdW5kZWZpbmVkIHwgc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcclxuICAgIGlmIChsZXZlbCA9PT0gdW5kZWZpbmVkIHx8IGxldmVsID09PSAnYWxsJykge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGV2ZWwpKSB7XHJcbiAgICAgIHJldHVybiBsZXZlbC5zb21lKChpdGVtOiBzdHJpbmcpID0+IChpdGVtID09PSB0eXBlIHx8IGl0ZW0gPT09ICdhbGwnKSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0eXBlID09PSBsZXZlbFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3VjY2VzcyAoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUuc3VjY2VzcywgLi4ubXNnKVxyXG4gIH1cclxuXHJcbiAgaW5mbyAoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUuaW5mbywgLi4ubXNnKVxyXG4gIH1cclxuXHJcbiAgZXJyb3IgKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcclxuICAgIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLmVycm9yLCAuLi5tc2cpXHJcbiAgfVxyXG5cclxuICB3YXJuICguLi5tc2c6IElMb2dBcmd2VHlwZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS53YXJuLCAuLi5tc2cpXHJcbiAgfVxyXG5cclxuICBkZWJ1ZyAoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2KCkpIHtcclxuICAgICAgdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUuaW5mbywgLi4ubXNnKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTG9nZ2VyXHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvIH0gZnJvbSAnLi4vdHlwZXMnXHJcblxyXG4vKipcclxuICogY3JlYXRlIGFuIHVuaXF1ZSBjb250ZXh0IGZvciBlYWNoIHVwbG9hZCBwcm9jZXNzXHJcbiAqIEBwYXJhbSBjdHhcclxuICovXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVDb250ZXh0ID0gKGN0eDogSVBpY0dvKTogSVBpY0dvID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgY29uZmlnUGF0aDogY3R4LmNvbmZpZ1BhdGgsXHJcbiAgICBiYXNlRGlyOiBjdHguYmFzZURpcixcclxuICAgIGxvZzogY3R4LmxvZyxcclxuICAgIGNtZDogY3R4LmNtZCxcclxuICAgIG91dHB1dDogW10sXHJcbiAgICBpbnB1dDogW10sXHJcbiAgICByYXdJbnB1dDogW10sXHJcbiAgICBwbHVnaW5Mb2FkZXI6IGN0eC5wbHVnaW5Mb2FkZXIsXHJcbiAgICBwbHVnaW5IYW5kbGVyOiBjdHgucGx1Z2luSGFuZGxlcixcclxuICAgIFJlcXVlc3Q6IGN0eC5SZXF1ZXN0LFxyXG4gICAgaGVscGVyOiBjdHguaGVscGVyLFxyXG4gICAgVkVSU0lPTjogY3R4LlZFUlNJT04sXHJcbiAgICBHVUlfVkVSU0lPTjogY3R4LkdVSV9WRVJTSU9OLFxyXG4gICAgcmVxdWVzdDogY3R4LnJlcXVlc3QsXHJcbiAgICBpMThuOiBjdHguaTE4bixcclxuICAgIGdldENvbmZpZzogY3R4LmdldENvbmZpZy5iaW5kKGN0eCksXHJcbiAgICBzYXZlQ29uZmlnOiBjdHguc2F2ZUNvbmZpZy5iaW5kKGN0eCksXHJcbiAgICByZW1vdmVDb25maWc6IGN0eC5yZW1vdmVDb25maWcuYmluZChjdHgpLFxyXG4gICAgc2V0Q29uZmlnOiBjdHguc2V0Q29uZmlnLmJpbmQoY3R4KSxcclxuICAgIHVuc2V0Q29uZmlnOiBjdHgudW5zZXRDb25maWcuYmluZChjdHgpLFxyXG4gICAgdXBsb2FkOiBjdHgudXBsb2FkLmJpbmQoY3R4KSxcclxuICAgIGFkZExpc3RlbmVyOiBjdHguYWRkTGlzdGVuZXIuYmluZChjdHgpLFxyXG4gICAgb246IGN0eC5vbi5iaW5kKGN0eCksXHJcbiAgICBvbmNlOiBjdHgub25jZS5iaW5kKGN0eCksXHJcbiAgICByZW1vdmVMaXN0ZW5lcjogY3R4LnJlbW92ZUxpc3RlbmVyLmJpbmQoY3R4KSxcclxuICAgIG9mZjogY3R4Lm9mZi5iaW5kKGN0eCksXHJcbiAgICByZW1vdmVBbGxMaXN0ZW5lcnM6IGN0eC5yZW1vdmVBbGxMaXN0ZW5lcnMuYmluZChjdHgpLFxyXG4gICAgc2V0TWF4TGlzdGVuZXJzOiBjdHguc2V0TWF4TGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIGdldE1heExpc3RlbmVyczogY3R4LmdldE1heExpc3RlbmVycy5iaW5kKGN0eCksXHJcbiAgICBsaXN0ZW5lcnM6IGN0eC5saXN0ZW5lcnMuYmluZChjdHgpLFxyXG4gICAgcmF3TGlzdGVuZXJzOiBjdHgucmF3TGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIGVtaXQ6IGN0eC5lbWl0LmJpbmQoY3R4KSxcclxuICAgIGxpc3RlbmVyQ291bnQ6IGN0eC5saXN0ZW5lckNvdW50LmJpbmQoY3R4KSxcclxuICAgIHByZXBlbmRMaXN0ZW5lcjogY3R4LnByZXBlbmRMaXN0ZW5lci5iaW5kKGN0eCksXHJcbiAgICBwcmVwZW5kT25jZUxpc3RlbmVyOiBjdHgucHJlcGVuZE9uY2VMaXN0ZW5lci5iaW5kKGN0eCksXHJcbiAgICBldmVudE5hbWVzOiBjdHguZXZlbnROYW1lcy5iaW5kKGN0eClcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xyXG5pbXBvcnQgeyB0eXBlIElCdWlsZEluV2F0ZXJNYXJrT3B0aW9ucywgdHlwZSBJQnVpbGRJbkNvbXByZXNzT3B0aW9ucywgdHlwZSBJTGlmZWN5Y2xlUGx1Z2lucywgdHlwZSBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbywgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbiwgdHlwZSBVbmRlZmluYWJsZSwgdHlwZSBJSW1nSW5mbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBnZXRVUkxGaWxlLCBoYW5kbGVVcmxFbmNvZGUsIGltYWdlUHJvY2VzcywgaXNVcmwsIG5lZWRDb21wcmVzcywgbmVlZEFkZFdhdGVybWFyaywgaW1hZ2VBZGRXYXRlck1hcmssIHJlbW92ZUV4aWYsIHJlbmFtZUZpbGVOYW1lV2l0aEN1c3RvbVN0cmluZyB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuLi91dGlscy9jcmVhdGVDb250ZXh0J1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcydcclxuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoJ1xyXG5pbXBvcnQgaGVpY0NvbnZlcnQgZnJvbSAnaGVpYy1jb252ZXJ0J1xyXG5cclxuZXhwb3J0IGNsYXNzIExpZmVjeWNsZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdHRmTGluazogc3RyaW5nID0gJ2h0dHBzOi8vcmVsZWFzZS5waWNsaXN0LmNuL3NpbWhlaS50dGYnXHJcbiAgdHRmUGF0aDogc3RyaW5nXHJcblxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgc3VwZXIoKVxyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgJ3BpY2xpc3RUZW1wJylcclxuICAgIGNvbnN0IGltZ0ZsZVBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICdpbWdUZW1wJylcclxuICAgIGZzLmVuc3VyZURpclN5bmMoaW1nRmxlUGF0aClcclxuICAgIGZzLmVtcHR5RGlyU3luYyh0ZW1wRmlsZVBhdGgpXHJcbiAgICB0aGlzLnR0ZlBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICdhc3NldHMnLCAnc2ltaGVpLnR0ZicpXHJcbiAgfVxyXG5cclxuICBhc3luYyBkb3dubG9hZFRURiAoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBvdXRwdXREaXIgPSBwYXRoLmRpcm5hbWUodGhpcy50dGZQYXRoKVxyXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dERpcikpIHtcclxuICAgICAgZnMubWtkaXJTeW5jKG91dHB1dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcclxuICAgIH1cclxuICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLnR0ZlBhdGgpKSB7XHJcbiAgICAgIHRoaXMuY3R4LmxvZy5pbmZvKCdEb3dubG9hZCB0dGYgZmlsZS4nKVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGF4aW9zLmdldCh0aGlzLnR0ZkxpbmssIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIH0pXHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLnR0ZlBhdGgsIHJlcy5kYXRhKVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5pbmZvKCdEb3dubG9hZCB0dGYgZmlsZSBzdWNjZXNzLicpXHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKCdEb3dubG9hZCB0dGYgZmlsZSBmYWlsZWQuJylcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHN0YXJ0IChpbnB1dDogYW55W10pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgLy8gZW5zdXJlIGV2ZXJ5IHVwbG9hZCBwcm9jZXNzIGhhcyBhbiB1bmlxdWUgY29udGV4dFxyXG4gICAgY29uc3QgY3R4ID0gY3JlYXRlQ29udGV4dCh0aGlzLmN0eClcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGltYWdlcyBpbnB1dFxyXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBtdXN0IGJlIGFuIGFycmF5LicpXHJcbiAgICAgIH1cclxuICAgICAgY3R4LmlucHV0ID0gaW5wdXRcclxuICAgICAgY3R4LnJhd0lucHV0UGF0aCA9IFtdIGFzIHN0cmluZ1tdXHJcbiAgICAgIGN0eC5yYXdJbnB1dCA9IGNsb25lRGVlcChpbnB1dClcclxuICAgICAgY3R4Lm91dHB1dCA9IFtdIGFzIElJbWdJbmZvW11cclxuICAgICAgY29uc3QgY29tcHJlc3NPcHRpb25zID0gY3R4LmdldENvbmZpZzxJQnVpbGRJbkNvbXByZXNzT3B0aW9ucz4oJ2J1aWxkSW4uY29tcHJlc3MnKVxyXG4gICAgICBjb25zdCB0eXBlID0gY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnVwbG9hZGVyJykgfHwgY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLmN1cnJlbnQnKSB8fCAnc21tcydcclxuICAgICAgY29uc3QgdXBsb2FkZXIgPSBjdHguaGVscGVyLnVwbG9hZGVyLmdldCh0eXBlKVxyXG4gICAgICBpZiAoIXVwbG9hZGVyICYmIGNvbXByZXNzT3B0aW9ucykge1xyXG4gICAgICAgIGNvbXByZXNzT3B0aW9ucy5waWNCZWQgPSAnc21tcydcclxuICAgICAgfSBlbHNlIGlmIChjb21wcmVzc09wdGlvbnMpIHtcclxuICAgICAgICBjb21wcmVzc09wdGlvbnMucGljQmVkID0gdHlwZVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHdhdGVybWFya09wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElCdWlsZEluV2F0ZXJNYXJrT3B0aW9ucz4oJ2J1aWxkSW4ud2F0ZXJtYXJrJylcclxuICAgICAgaWYgKGNvbXByZXNzT3B0aW9ucyB8fCB3YXRlcm1hcmtPcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcEZpbGVQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCAncGljbGlzdFRlbXAnKVxyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wRmlsZVBhdGgpKSB7XHJcbiAgICAgICAgICBmcy5ta2RpclN5bmModGVtcEZpbGVQYXRoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB3YXRlcm1hcmtNc2cgPSAnQWRkIHdhdGVybWFyayB0byBpbWFnZSdcclxuICAgICAgICBjb25zdCBjb21wcmVzc01zZyA9ICdDb21wcmVzcyBvciBjb252ZXJ0IGltYWdlJ1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjdHguaW5wdXQubWFwKGFzeW5jIChpdGVtOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGxldCBpbmZvOiBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mb1xyXG4gICAgICAgICAgaWYgKGlzVXJsKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIGN0eC5yYXdJbnB1dFBhdGghW2luZGV4XSA9IGl0ZW1cclxuICAgICAgICAgICAgaW5mbyA9IGF3YWl0IGdldFVSTEZpbGUoaXRlbSwgY3R4KVxyXG4gICAgICAgICAgICBpZiAoaW5mby5zdWNjZXNzICYmIGluZm8uYnVmZmVyKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybWVkQnVmZmVyXHJcbiAgICAgICAgICAgICAgbGV0IGlzU2tpcCA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgaWYgKG5lZWRBZGRXYXRlcm1hcmsod2F0ZXJtYXJrT3B0aW9ucywgaW5mby5leHRuYW1lID8/ICcnKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEod2F0ZXJtYXJrT3B0aW9ucz8ud2F0ZXJtYXJrRm9udFBhdGggfHwgd2F0ZXJtYXJrT3B0aW9ucz8ud2F0ZXJtYXJrVHlwZSA9PT0gJ2ltYWdlJykpIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgZG93bmxvYWRUVEZSZXQgPSBhd2FpdCB0aGlzLmRvd25sb2FkVFRGKClcclxuICAgICAgICAgICAgICAgICAgaWYgKCFkb3dubG9hZFRURlJldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LmxvZy53YXJuKCdEb3dubG9hZCB0dGYgZmlsZSBmYWlsZWQsIHNraXAgYWRkIHdhdGVybWFyay4nKVxyXG4gICAgICAgICAgICAgICAgICAgIGlzU2tpcCA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFpc1NraXApIHtcclxuICAgICAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKHdhdGVybWFya01zZylcclxuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRCdWZmZXIgPSBhd2FpdCBpbWFnZUFkZFdhdGVyTWFyayhpbmZvLmJ1ZmZlciwgd2F0ZXJtYXJrT3B0aW9ucywgdGhpcy50dGZQYXRoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAobmVlZENvbXByZXNzKGNvbXByZXNzT3B0aW9ucywgaW5mby5leHRuYW1lID8/ICcnKSkge1xyXG4gICAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKGNvbXByZXNzTXNnKVxyXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRCdWZmZXIgPSBhd2FpdCBpbWFnZVByb2Nlc3ModHJhbnNmb3JtZWRCdWZmZXIgPz8gaW5mby5idWZmZXIsIGNvbXByZXNzT3B0aW9ucywgaW5mby5leHRuYW1lID8/ICcnKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoIXRyYW5zZm9ybWVkQnVmZmVyICYmIGNvbXByZXNzT3B0aW9ucz8uaXNSZW1vdmVFeGlmKSB7XHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLmluZm8oJ1JlbW92ZSBleGlmIGluZm8uJylcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQnVmZmVyID0gYXdhaXQgcmVtb3ZlRXhpZihpbmZvLmJ1ZmZlciwgaW5mby5leHRuYW1lID8/ICcnKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtZWRCdWZmZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBuZXdFeHRcclxuICAgICAgICAgICAgICAgIGlmIChjb21wcmVzc09wdGlvbnM/LmlzQ29udmVydCkge1xyXG4gICAgICAgICAgICAgICAgICBuZXdFeHQgPSBjb21wcmVzc09wdGlvbnM/LmNvbnZlcnRGb3JtYXQgPz8gJ2pwZydcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIG5ld0V4dCA9IGluZm8uZXh0bmFtZSA/PyAnJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbmV3RXh0ID0gbmV3RXh0LnN0YXJ0c1dpdGgoJy4nKSA/IG5ld0V4dCA6IGAuJHtuZXdFeHR9YFxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcEZpbGUgPSBwYXRoLmpvaW4odGVtcEZpbGVQYXRoLCBgJHtpbmZvLmZpbGVOYW1lXHJcbiAgICAgICAgICAgICAgICAgID8gYCR7cGF0aC5iYXNlbmFtZShpbmZvLmZpbGVOYW1lLCBwYXRoLmV4dG5hbWUoaW5mby5maWxlTmFtZSkpfSR7bmV3RXh0fWBcclxuICAgICAgICAgICAgICAgICAgOiBuZXcgRGF0ZSgpLmdldFRpbWUoKX0ke25ld0V4dH1gKVxyXG4gICAgICAgICAgICAgICAgY3R4LnJhd0lucHV0UGF0aCFbaW5kZXhdID0gcGF0aC5qb2luKHBhdGguZGlybmFtZShpdGVtKSwgcGF0aC5iYXNlbmFtZSh0ZW1wRmlsZSkpXHJcbiAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBGaWxlLCB0cmFuc2Zvcm1lZEJ1ZmZlcilcclxuICAgICAgICAgICAgICAgIGN0eC5pbnB1dFtpbmRleF0gPSB0ZW1wRmlsZVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW5mby5yZWFzb24pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB0cmFuc2Zvcm1lZEJ1ZmZlclxyXG4gICAgICAgICAgICBjdHgucmF3SW5wdXRQYXRoIVtpbmRleF0gPSBpdGVtXHJcbiAgICAgICAgICAgIGlmIChuZWVkQWRkV2F0ZXJtYXJrKHdhdGVybWFya09wdGlvbnMsIHBhdGguZXh0bmFtZShpdGVtKSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCBkb3dubG9hZFRURlJldCA9IGF3YWl0IHRoaXMuZG93bmxvYWRUVEYoKVxyXG4gICAgICAgICAgICAgIGlmICghZG93bmxvYWRUVEZSZXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3R4LmxvZy53YXJuKCdEb3dubG9hZCB0dGYgZmlsZSBmYWlsZWQsIHNraXAgYWRkIHdhdGVybWFyay4nKVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLmluZm8od2F0ZXJtYXJrTXNnKVxyXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRCdWZmZXIgPSBhd2FpdCBpbWFnZUFkZFdhdGVyTWFyayhmcy5yZWFkRmlsZVN5bmMoaXRlbSksIHdhdGVybWFya09wdGlvbnMsIHRoaXMudHRmUGF0aClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG5lZWRDb21wcmVzcyhjb21wcmVzc09wdGlvbnMsIHBhdGguZXh0bmFtZShpdGVtKSkpIHtcclxuICAgICAgICAgICAgICBjdHgubG9nLmluZm8oY29tcHJlc3NNc2cpXHJcbiAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShpdGVtKSA9PT0gJy5oZWljJyB8fCBwYXRoLmV4dG5hbWUoaXRlbSkgPT09ICcuaGVpZicpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWNCdWZmZXIgPSBmcy5yZWFkRmlsZVN5bmMoaXRlbSlcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWNSZXN1bHQgPSBhd2FpdCBoZWljQ29udmVydCh7XHJcbiAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogaGVpY0J1ZmZlcixcclxuICAgICAgICAgICAgICAgICAgZm9ybWF0OiAnSlBFRycsXHJcbiAgICAgICAgICAgICAgICAgIHF1YWxpdHk6IDFcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wSGVpY0NvbnZlcnRGaWxlID0gcGF0aC5qb2luKHRlbXBGaWxlUGF0aCwgYCR7cGF0aC5iYXNlbmFtZShpdGVtLCBwYXRoLmV4dG5hbWUoaXRlbSkpfS5qcGdgKVxyXG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0ZW1wSGVpY0NvbnZlcnRGaWxlLCBCdWZmZXIuZnJvbShoZWljUmVzdWx0KSlcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQnVmZmVyID0gYXdhaXQgaW1hZ2VQcm9jZXNzKGZzLnJlYWRGaWxlU3luYyh0ZW1wSGVpY0NvbnZlcnRGaWxlKSwgY29tcHJlc3NPcHRpb25zLCAnLmpwZycpXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQnVmZmVyID0gYXdhaXQgaW1hZ2VQcm9jZXNzKHRyYW5zZm9ybWVkQnVmZmVyID8/IGZzLnJlYWRGaWxlU3luYyhpdGVtKSwgY29tcHJlc3NPcHRpb25zLCBwYXRoLmV4dG5hbWUoaXRlbSkpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghdHJhbnNmb3JtZWRCdWZmZXIgJiYgY29tcHJlc3NPcHRpb25zPy5pc1JlbW92ZUV4aWYpIHtcclxuICAgICAgICAgICAgICBjdHgubG9nLmluZm8oJ1JlbW92ZSBleGlmIGluZm8uJylcclxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZEJ1ZmZlciA9IGF3YWl0IHJlbW92ZUV4aWYoZnMucmVhZEZpbGVTeW5jKGl0ZW0pLCBwYXRoLmV4dG5hbWUoaXRlbSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVkQnVmZmVyKSB7XHJcbiAgICAgICAgICAgICAgbGV0IG5ld0V4dFxyXG4gICAgICAgICAgICAgIGlmIChjb21wcmVzc09wdGlvbnM/LmlzQ29udmVydCkge1xyXG4gICAgICAgICAgICAgICAgbmV3RXh0ID0gY29tcHJlc3NPcHRpb25zPy5jb252ZXJ0Rm9ybWF0ID8/ICdqcGcnXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5ld0V4dCA9IHBhdGguZXh0bmFtZShpdGVtKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBuZXdFeHQgPSBuZXdFeHQuc3RhcnRzV2l0aCgnLicpID8gbmV3RXh0IDogYC4ke25ld0V4dH1gXHJcbiAgICAgICAgICAgICAgY29uc3QgdGVtcEZpbGUgPSBwYXRoLmpvaW4odGVtcEZpbGVQYXRoLCBgJHtwYXRoLmJhc2VuYW1lKGl0ZW0sIHBhdGguZXh0bmFtZShpdGVtKSl9JHtuZXdFeHR9YClcclxuICAgICAgICAgICAgICBjdHgucmF3SW5wdXRQYXRoIVtpbmRleF0gPSBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKGl0ZW0pLCBgJHtwYXRoLmJhc2VuYW1lKGl0ZW0sIHBhdGguZXh0bmFtZShpdGVtKSl9JHtuZXdFeHR9YClcclxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBGaWxlLCB0cmFuc2Zvcm1lZEJ1ZmZlcilcclxuICAgICAgICAgICAgICBjdHguaW5wdXRbaW5kZXhdID0gdGVtcEZpbGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjdHguaW5wdXQpIHtcclxuICAgICAgICAgIGN0eC5yYXdJbnB1dFBhdGgucHVzaChpdGVtKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBsaWZlY3ljbGUgbWFpblxyXG4gICAgICBhd2FpdCB0aGlzLmJlZm9yZVRyYW5zZm9ybShjdHgpXHJcbiAgICAgIGF3YWl0IHRoaXMuZG9UcmFuc2Zvcm0oY3R4KVxyXG4gICAgICBjb25zdCByZW5hbWVDb25maWcgPSBjdHguZ2V0Q29uZmlnPGFueT4oJ2J1aWxkSW4ucmVuYW1lJykgfHwge31cclxuICAgICAgaWYgKHJlbmFtZUNvbmZpZy5lbmFibGUpIHtcclxuICAgICAgICBjb25zdCBmb3JtYXQgPSByZW5hbWVDb25maWcuZm9ybWF0IHx8ICd7ZmlsZW5hbWV9J1xyXG4gICAgICAgIGN0eC5vdXRwdXQgPSBjdHgub3V0cHV0Lm1hcCgoaXRlbTogSUltZ0luZm8sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGxldCBmaWxlTmFtZSA9IGl0ZW0uZmlsZU5hbWVcclxuICAgICAgICAgIGlmIChmb3JtYXQpIHtcclxuICAgICAgICAgICAgZmlsZU5hbWUgPSByZW5hbWVGaWxlTmFtZVdpdGhDdXN0b21TdHJpbmcoY3R4LnJhd0lucHV0UGF0aCFbaW5kZXhdLCBmb3JtYXQpXHJcbiAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgvXFwvKy9nLCAnLycpXHJcbiAgICAgICAgICAgIGlmIChmaWxlTmFtZS5zbGljZSgtMSkgPT09ICcvJykge1xyXG4gICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUgKyBpbmRleC50b1N0cmluZygpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGl0ZW0uZmlsZU5hbWUgPSBmaWxlTmFtZVxyXG4gICAgICAgICAgcmV0dXJuIGl0ZW1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IHRoaXMuYmVmb3JlVXBsb2FkKGN0eClcclxuICAgICAgYXdhaXQgdGhpcy5kb1VwbG9hZChjdHgpXHJcbiAgICAgIGN0eC5pbnB1dCA9IGN0eC5yYXdJbnB1dFxyXG4gICAgICBhd2FpdCB0aGlzLmFmdGVyVXBsb2FkKGN0eClcclxuICAgICAgcmV0dXJuIGN0eFxyXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgIGN0eC5sb2cud2FybihJQnVpbGRJbkV2ZW50LkZBSUxFRClcclxuICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIC0xKVxyXG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LkZBSUxFRCwgZSlcclxuICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICBpZiAoY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PignZGVidWcnKSkge1xyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY3R4XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGJlZm9yZVRyYW5zZm9ybSAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIDApXHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LkJFRk9SRV9UUkFOU0ZPUk0sIGN0eClcclxuICAgIGN0eC5sb2cuaW5mbygnQmVmb3JlIHRyYW5zZm9ybScpXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVBsdWdpbnMoY3R4LmhlbHBlci5iZWZvcmVUcmFuc2Zvcm1QbHVnaW5zLCBjdHgpXHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRvVHJhbnNmb3JtIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgMzApXHJcbiAgICBjb25zdCB0eXBlID0gY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnRyYW5zZm9ybWVyJykgfHwgJ3BhdGgnXHJcbiAgICBsZXQgY3VycmVudFRyYW5zZm9ybWVyID0gdHlwZVxyXG4gICAgbGV0IHRyYW5zZm9ybWVyID0gY3R4LmhlbHBlci50cmFuc2Zvcm1lci5nZXQodHlwZSlcclxuICAgIGlmICghdHJhbnNmb3JtZXIpIHtcclxuICAgICAgdHJhbnNmb3JtZXIgPSBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldCgncGF0aCcpXHJcbiAgICAgIGN1cnJlbnRUcmFuc2Zvcm1lciA9ICdwYXRoJ1xyXG4gICAgICBjdHgubG9nLndhcm4oYENhbid0IGZpbmQgdHJhbnNmb3JtZXIgLSAke3R5cGV9LCBzd2l0Y2ggdG8gZGVmYXVsdCB0cmFuc2Zvcm1lciAtIHBhdGhgKVxyXG4gICAgfVxyXG4gICAgY3R4LmxvZy5pbmZvKGBUcmFuc2Zvcm1pbmcuLi4gQ3VycmVudCB0cmFuc2Zvcm1lciBpcyBbJHtjdXJyZW50VHJhbnNmb3JtZXJ9XWApXHJcbiAgICBhd2FpdCB0cmFuc2Zvcm1lcj8uaGFuZGxlKGN0eClcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYmVmb3JlVXBsb2FkIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgNjApXHJcbiAgICBjdHgubG9nLmluZm8oJ0JlZm9yZSB1cGxvYWQnKVxyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5CRUZPUkVfVVBMT0FELCBjdHgpXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVBsdWdpbnMoY3R4LmhlbHBlci5iZWZvcmVVcGxvYWRQbHVnaW5zLCBjdHgpXHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRvVXBsb2FkIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBsZXQgdHlwZSA9IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC51cGxvYWRlcicpIHx8IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC5jdXJyZW50JykgfHwgJ3NtbXMnXHJcbiAgICBsZXQgdXBsb2FkZXIgPSBjdHguaGVscGVyLnVwbG9hZGVyLmdldCh0eXBlKVxyXG4gICAgbGV0IGN1cnJlbnRUcmFuc2Zvcm1lciA9IHR5cGVcclxuICAgIGlmICghdXBsb2FkZXIpIHtcclxuICAgICAgdHlwZSA9ICdzbW1zJ1xyXG4gICAgICBjdXJyZW50VHJhbnNmb3JtZXIgPSAnc21tcydcclxuICAgICAgdXBsb2FkZXIgPSBjdHguaGVscGVyLnVwbG9hZGVyLmdldCgnc21tcycpXHJcbiAgICAgIGN0eC5sb2cud2FybihgQ2FuJ3QgZmluZCB1cGxvYWRlciAtICR7dHlwZX0sIHN3aXRjaCB0byBkZWZhdWx0IHVwbG9hZGVyIC0gc21tc2ApXHJcbiAgICB9XHJcbiAgICBjdHgubG9nLmluZm8oYFVwbG9hZGluZy4uLiBDdXJyZW50IHVwbG9hZGVyIGlzIFske2N1cnJlbnRUcmFuc2Zvcm1lcn1dYClcclxuICAgIGF3YWl0IHVwbG9hZGVyPy5oYW5kbGUoY3R4KVxyXG4gICAgZm9yIChjb25zdCBvdXRwdXRJbWcgb2YgY3R4Lm91dHB1dCkge1xyXG4gICAgICBvdXRwdXRJbWcudHlwZSA9IHR5cGVcclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYWZ0ZXJVcGxvYWQgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuQUZURVJfVVBMT0FELCBjdHgpXHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgMTAwKVxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVQbHVnaW5zKGN0eC5oZWxwZXIuYWZ0ZXJVcGxvYWRQbHVnaW5zLCBjdHgpXHJcbiAgICBsZXQgbXNnID0gJydcclxuICAgIGNvbnN0IGxlbmd0aCA9IGN0eC5vdXRwdXQubGVuZ3RoXHJcbiAgICBjb25zdCBpc0VuY29kZU91dHB1dFVSTCA9IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8Ym9vbGVhbj4+KCdzZXR0aW5ncy5lbmNvZGVPdXRwdXRVUkwnKSA9PT0gdHJ1ZVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodHlwZW9mIGN0eC5vdXRwdXRbaV0uaW1nVXJsICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIG1zZyArPSBpc0VuY29kZU91dHB1dFVSTCA/IGhhbmRsZVVybEVuY29kZShjdHgub3V0cHV0W2ldLmltZ1VybCEpIDogY3R4Lm91dHB1dFtpXS5pbWdVcmwhXHJcbiAgICAgICAgaWYgKGkgIT09IGxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgIG1zZyArPSAnXFxuJ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBkZWxldGUgY3R4Lm91dHB1dFtpXS5iYXNlNjRJbWFnZVxyXG4gICAgICBkZWxldGUgY3R4Lm91dHB1dFtpXS5idWZmZXJcclxuICAgIH1cclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuRklOSVNIRUQsIGN0eClcclxuICAgIGN0eC5sb2cuc3VjY2VzcyhgXFxuJHttc2d9YClcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUGx1Z2lucyAobGlmZUN5Y2xlUGx1Z2luczogSUxpZmVjeWNsZVBsdWdpbnMsIGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBsaWZlQ3ljbGVQbHVnaW5zLmdldExpc3QoKVxyXG4gICAgY29uc3QgcGx1Z2luTmFtZXMgPSBsaWZlQ3ljbGVQbHVnaW5zLmdldElkTGlzdCgpXHJcbiAgICBjb25zdCBsaWZlQ3ljbGVOYW1lID0gbGlmZUN5Y2xlUGx1Z2lucy5nZXROYW1lKClcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHBsdWdpbnMubWFwKGFzeW5jIChwbHVnaW46IElQbHVnaW4sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjdHgubG9nLmluZm8oYCR7bGlmZUN5Y2xlTmFtZX06ICR7cGx1Z2luTmFtZXNbaW5kZXhdfSBydW5uaW5nYClcclxuICAgICAgICBhd2FpdCBwbHVnaW4uaGFuZGxlKGN0eClcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGN0eC5sb2cuZXJyb3IoYCR7bGlmZUN5Y2xlTmFtZX06ICR7cGx1Z2luTmFtZXNbaW5kZXhdfSBlcnJvcmApXHJcbiAgICAgICAgdGhyb3cgZVxyXG4gICAgICB9XHJcbiAgICB9KSlcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExpZmVjeWNsZVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGx1Z2luQ29uZmlnLCB0eXBlIElTbW1zQ29uZmlnLCB0eXBlIElPbGRSZXFPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKGZpbGVOYW1lOiBzdHJpbmcsIGltYWdlOiBCdWZmZXIsIGFwaVRva2VuOiBzdHJpbmcsIGJhY2t1cERvbWFpbiA9ICcnKTogSU9sZFJlcU9wdGlvbnMgPT4ge1xyXG4gIGNvbnN0IGRvbWFpbiA9IGJhY2t1cERvbWFpbiB8fCAnc20ubXMnXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgdXJsOiBgaHR0cHM6Ly8ke2RvbWFpbn0vYXBpL3YyL3VwbG9hZGAsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIGNvbnRlbnRUeXBlOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXHJcbiAgICAgICdVc2VyLUFnZW50JzogJ1BpY0xpc3QnLFxyXG4gICAgICBBdXRob3JpemF0aW9uOiBhcGlUb2tlblxyXG4gICAgfSxcclxuICAgIGZvcm1EYXRhOiB7XHJcbiAgICAgIHNtZmlsZToge1xyXG4gICAgICAgIHZhbHVlOiBpbWFnZSxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICBmaWxlbmFtZTogZmlsZU5hbWVcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHNzbDogJ3RydWUnXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHNtbXNDb25maWcgPSBjdHguZ2V0Q29uZmlnPElTbW1zQ29uZmlnPigncGljQmVkLnNtbXMnKVxyXG4gIGlmICghc21tc0NvbmZpZykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGZpbmQgc21tcyBjb25maWchJylcclxuICB9XHJcbiAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCAnYmFzZTY0JylcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwb3N0Q29uZmlnID0gcG9zdE9wdGlvbnMoaW1nLmZpbGVOYW1lLCBpbWFnZSwgc21tc0NvbmZpZz8udG9rZW4sIHNtbXNDb25maWc/LmJhY2t1cERvbWFpbilcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXM6IHN0cmluZyA9IGF3YWl0IGN0eC5yZXF1ZXN0KHBvc3RDb25maWcpXHJcbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UocmVzKVxyXG4gICAgICAgIGlmIChib2R5LmNvZGUgPT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBib2R5LmRhdGEudXJsXHJcbiAgICAgICAgICBpbWcuaGFzaCA9IGJvZHkuZGF0YS5oYXNoXHJcbiAgICAgICAgfSBlbHNlIGlmIChib2R5LmNvZGUgPT09ICdpbWFnZV9yZXBlYXRlZCcgJiYgdHlwZW9mIGJvZHkuaW1hZ2VzID09PSAnc3RyaW5nJykgeyAvLyBkbyBleHRyYSBjaGVjayBzaW5jZSB0aGlzIGVycm9yIHJldHVybiBpcyBub3QgZG9jdW1lbnRlZCBhdCBodHRwczovL2RvYy5zbS5tcy8jYXBpLUltYWdlLVVwbG9hZFxyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBib2R5LmltYWdlc1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICBib2R5OiBib2R5Lm1lc3NhZ2VcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gY3R4XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVNtbXNDb25maWc+KCdwaWNCZWQuc21tcycpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd0b2tlbicsXHJcbiAgICAgIG1lc3NhZ2U6ICdhcGkgdG9rZW4nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVNfVE9LRU4nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnRva2VuIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2JhY2t1cERvbWFpbicsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTicpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOJylcclxuICAgICAgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU4nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJhY2t1cERvbWFpbiB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3Rlcignc21tcycsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TTU1TJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcbmltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSVRjeXVuQ29uZmlnLCB0eXBlIElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgdHlwZSBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG4vLyBnZW5lcmF0ZSBDT1Mgc2lnbmF0dXJlIHN0cmluZ1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2lnbmF0dXJlIHtcclxuICBzaWduYXR1cmU6IHN0cmluZ1xyXG4gIGFwcElkOiBzdHJpbmdcclxuICBidWNrZXQ6IHN0cmluZ1xyXG4gIHNpZ25UaW1lOiBzdHJpbmdcclxufVxyXG5cclxuY29uc3QgZ2VuZXJhdGVTaWduYXR1cmUgPSAob3B0aW9uczogSVRjeXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nKTogSVNpZ25hdHVyZSA9PiB7XHJcbiAgY29uc3Qgc2VjcmV0SWQgPSBvcHRpb25zLnNlY3JldElkXHJcbiAgY29uc3Qgc2VjcmV0S2V5ID0gb3B0aW9ucy5zZWNyZXRLZXlcclxuICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWRcclxuICBjb25zdCBidWNrZXQgPSBvcHRpb25zLmJ1Y2tldFxyXG4gIGxldCBzaWduYXR1cmVcclxuICBsZXQgc2lnblRpbWU6IHN0cmluZyA9ICcnXHJcbiAgaWYgKCFvcHRpb25zLnZlcnNpb24gfHwgb3B0aW9ucy52ZXJzaW9uID09PSAndjQnKSB7XHJcbiAgICBjb25zdCByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDAwMClcclxuICAgIGNvbnN0IGN1cnJlbnQgPSBNYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCkgLSAxXHJcbiAgICBjb25zdCBleHBpcmVkID0gY3VycmVudCArIDM2MDBcclxuXHJcbiAgICBjb25zdCBtdWx0aVNpZ25hdHVyZSA9IGBhPSR7YXBwSWR9JmI9JHtidWNrZXR9Jms9JHtzZWNyZXRJZH0mZT0ke2V4cGlyZWR9JnQ9JHtjdXJyZW50fSZyPSR7cmFuZG9tfSZmPWBcclxuXHJcbiAgICBjb25zdCBzaWduSGV4S2V5ID0gY3J5cHRvLmNyZWF0ZUhtYWMoJ3NoYTEnLCBzZWNyZXRLZXkpLnVwZGF0ZShtdWx0aVNpZ25hdHVyZSkuZGlnZXN0KClcclxuICAgIGNvbnN0IHRlbXBTdHJpbmcgPSBCdWZmZXIuY29uY2F0KFtzaWduSGV4S2V5LCBCdWZmZXIuZnJvbShtdWx0aVNpZ25hdHVyZSldKVxyXG4gICAgc2lnbmF0dXJlID0gQnVmZmVyLmZyb20odGVtcFN0cmluZykudG9TdHJpbmcoJ2Jhc2U2NCcpXHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIGh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzc3OCNzaWduYXR1cmVcclxuICAgIGNvbnN0IHRvZGF5ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApXHJcbiAgICBjb25zdCB0b21vcnJvdyA9IHRvZGF5ICsgODY0MDBcclxuICAgIHNpZ25UaW1lID0gYCR7dG9kYXl9OyR7dG9tb3Jyb3d9YFxyXG4gICAgY29uc3Qgc2lnbktleSA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgc2VjcmV0S2V5KS51cGRhdGUoc2lnblRpbWUpLmRpZ2VzdCgnaGV4JylcclxuICAgIGNvbnN0IGVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludCA/IG9wdGlvbnMuZW5kcG9pbnQgOiBgY29zLiR7b3B0aW9ucy5hcmVhfS5teXFjbG91ZC5jb21gXHJcbiAgICBjb25zdCBodHRwU3RyaW5nID0gYHB1dFxcbi8ke29wdGlvbnMucGF0aH0ke2ZpbGVOYW1lfVxcblxcbmhvc3Q9JHtvcHRpb25zLmJ1Y2tldH0uJHtlbmRwb2ludH1cXG5gXHJcbiAgICBjb25zdCBzaGExZWRIdHRwU3RyaW5nID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUoaHR0cFN0cmluZykuZGlnZXN0KCdoZXgnKVxyXG4gICAgY29uc3Qgc3RyaW5nVG9TaWduID0gYHNoYTFcXG4ke3NpZ25UaW1lfVxcbiR7c2hhMWVkSHR0cFN0cmluZ31cXG5gXHJcbiAgICBzaWduYXR1cmUgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIHNpZ25LZXkpLnVwZGF0ZShzdHJpbmdUb1NpZ24pLmRpZ2VzdCgnaGV4JylcclxuICB9XHJcbiAgcmV0dXJuIHtcclxuICAgIHNpZ25hdHVyZSxcclxuICAgIGFwcElkLFxyXG4gICAgYnVja2V0LFxyXG4gICAgc2lnblRpbWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElUY3l1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgc2lnbmF0dXJlOiBJU2lnbmF0dXJlLCBpbWFnZTogQnVmZmVyLCB2ZXJzaW9uOiBzdHJpbmcpOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xyXG4gIGNvbnN0IGFyZWEgPSBvcHRpb25zLmFyZWFcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoXHJcbiAgaWYgKCFvcHRpb25zLnZlcnNpb24gfHwgb3B0aW9ucy52ZXJzaW9uID09PSAndjQnKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgdXJsOiBgaHR0cDovLyR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb20vZmlsZXMvdjIvJHtzaWduYXR1cmUuYXBwSWR9LyR7c2lnbmF0dXJlLmJ1Y2tldH0vJHtlbmNvZGVVUkkocGF0aCl9JHtmaWxlTmFtZX1gLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgSG9zdDogYCR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb21gLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IHNpZ25hdHVyZS5zaWduYXR1cmUsXHJcbiAgICAgICAgY29udGVudFR5cGU6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcclxuICAgICAgICAnVXNlci1BZ2VudCc6IGBQaWNHbzske3ZlcnNpb259O251bGw7bnVsbGBcclxuICAgICAgfSxcclxuICAgICAgZm9ybURhdGE6IHtcclxuICAgICAgICBvcDogJ3VwbG9hZCcsXHJcbiAgICAgICAgZmlsZWNvbnRlbnQ6IGltYWdlXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludCA/IG9wdGlvbnMuZW5kcG9pbnQgOiBgY29zLiR7b3B0aW9ucy5hcmVhfS5teXFjbG91ZC5jb21gXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICB1cmw6IGBodHRwOi8vJHtvcHRpb25zLmJ1Y2tldH0uJHtlbmRwb2ludH0vJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpfWAsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBIb3N0OiBgJHtvcHRpb25zLmJ1Y2tldH0uJHtlbmRwb2ludH1gLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBxLXNpZ24tYWxnb3JpdGhtPXNoYTEmcS1haz0ke29wdGlvbnMuc2VjcmV0SWR9JnEtc2lnbi10aW1lPSR7c2lnbmF0dXJlLnNpZ25UaW1lfSZxLWtleS10aW1lPSR7c2lnbmF0dXJlLnNpZ25UaW1lfSZxLWhlYWRlci1saXN0PWhvc3QmcS11cmwtcGFyYW0tbGlzdD0mcS1zaWduYXR1cmU9JHtzaWduYXR1cmUuc2lnbmF0dXJlfWAsXHJcbiAgICAgICAgY29udGVudFR5cGU6IG1pbWUubG9va3VwKGZpbGVOYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyxcclxuICAgICAgICAnVXNlci1BZ2VudCc6IGBQaWNHbzske3ZlcnNpb259O251bGw7bnVsbGBcclxuICAgICAgfSxcclxuICAgICAgYm9keTogaW1hZ2UsXHJcbiAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbyB8IGJvb2xlYW4+ID0+IHtcclxuICBjb25zdCB0Y1l1bk9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElUY3l1bkNvbmZpZz4oJ3BpY0JlZC50Y3l1bicpXHJcbiAgaWYgKCF0Y1l1bk9wdGlvbnMpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIHRlbmNlbnQgQ09TIGNvbmZpZycpXHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgY29uc3QgY3VzdG9tVXJsID0gdGNZdW5PcHRpb25zLmN1c3RvbVVybFxyXG4gICAgY29uc3QgcGF0aCA9IHRjWXVuT3B0aW9ucy5wYXRoID8/ICcnXHJcbiAgICBjb25zdCB1c2VWNCA9ICF0Y1l1bk9wdGlvbnMudmVyc2lvbiB8fCB0Y1l1bk9wdGlvbnMudmVyc2lvbiA9PT0gJ3Y0J1xyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBnZW5lcmF0ZVNpZ25hdHVyZSh0Y1l1bk9wdGlvbnMsIGltZy5maWxlTmFtZSlcclxuICAgICAgICBpZiAoIXNpZ25hdHVyZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0gcG9zdE9wdGlvbnModGNZdW5PcHRpb25zLCBpbWcuZmlsZU5hbWUsIHNpZ25hdHVyZSwgaW1hZ2UsIGN0eC5HVUlfVkVSU0lPTiB8fCBjdHguVkVSU0lPTilcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgICAgLnRoZW4oKHJlczogYW55KSA9PiByZXMpXHJcbiAgICAgICAgICAuY2F0Y2goKGVycjogRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiA0MDAsXHJcbiAgICAgICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICAgICAgbXNnOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdBVVRIX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICAgICAgZXJyXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIGxldCBib2R5XHJcbiAgICAgICAgaWYgKHVzZVY0ICYmIHR5cGVvZiByZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShyZXMpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJvZHkgPSByZXNcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJvZHkuc3RhdHVzQ29kZSA9PT0gNDAwKSB7XHJcbiAgICAgICAgICBpZiAoYm9keT8uYm9keT8uZXJyKSB7XHJcbiAgICAgICAgICAgIHRocm93IGJvZHkuYm9keS5lcnJcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihib2R5Py5ib2R5Py5tc2cgfHwgYm9keT8uYm9keT8ubWVzc2FnZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uVXJsID0gdGNZdW5PcHRpb25zLm9wdGlvbnMgfHwgJydcclxuICAgICAgICBjb25zdCBzbGltID0gdGNZdW5PcHRpb25zLnNsaW0gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogISF0Y1l1bk9wdGlvbnMuc2xpbVxyXG4gICAgICAgIGlmICh1c2VWNCAmJiBib2R5Lm1lc3NhZ2UgPT09ICdTVUNDRVNTJykge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGlmIChjdXN0b21VcmwpIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2N1c3RvbVVybH0vJHtwYXRofSR7aW1nLmZpbGVOYW1lfWBcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtib2R5LmRhdGEuc291cmNlX3VybCBhcyBzdHJpbmd9JHtvcHRpb25Vcmx9YFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZVY0ICYmIGJvZHkgJiYgYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpZiAoY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtjdXN0b21Vcmx9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9JHtvcHRpb25Vcmx9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnQgPSB0Y1l1bk9wdGlvbnMuZW5kcG9pbnQgPyB0Y1l1bk9wdGlvbnMuZW5kcG9pbnQgOiBgY29zLiR7dGNZdW5PcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbWBcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGBodHRwczovLyR7dGNZdW5PcHRpb25zLmJ1Y2tldH0uJHtlbmRwb2ludH0vJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX0ke29wdGlvblVybH1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXMuYm9keS5tc2cpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzbGltKSB7XHJcbiAgICAgICAgICBpZiAob3B0aW9uVXJsKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgKz0gJyZpbWFnZVNsaW0nXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsICs9ICc/aW1hZ2VTbGltJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICBpZiAoIXRjWXVuT3B0aW9ucy52ZXJzaW9uIHx8IHRjWXVuT3B0aW9ucy52ZXJzaW9uID09PSAndjQnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZXJyLmVycm9yKVxyXG4gICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICAgIGNvZGU6IGJvZHkuY29kZSBhcyBzdHJpbmdcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgdGV4dDogJ2h0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvODQzMidcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgfVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElUY3l1bkNvbmZpZz4oJ3BpY0JlZC50Y3l1bicpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd2ZXJzaW9uJyxcclxuICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICBhbGlhczogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OJyksXHJcbiAgICAgIGNob2ljZXM6IFsndjQnLCAndjUnXSxcclxuICAgICAgZGVmYXVsdDogJ3Y1JyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc2VjcmV0SWQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc2VjcmV0SWQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc2VjcmV0S2V5JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zZWNyZXRLZXkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5idWNrZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYXBwSWQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXBwSWQgfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYXJlYScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUEnKSB9LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2VuZHBvaW50JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0VORFBPSU5UJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfRU5EUE9JTlQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmVuZHBvaW50IHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfRU5EUE9JTlQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2N1c3RvbVVybCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ29wdGlvbnMnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc2xpbScsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zbGltID09PSB1bmRlZmluZWQgPyBmYWxzZSA6ICEhdXNlckNvbmZpZy5zbGltLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU0nKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGdldCBjb25maXJtVGV4dCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU1fQ09ORklSTScpIH0sXHJcbiAgICAgIGdldCBjYW5jZWxUZXh0ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTV9DQU5DRUwnKSB9LFxyXG4gICAgICBnZXQgdGlwcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU1fVElQJykgfVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ3RjeXVuJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRCcpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSUdpdGh1YkNvbmZpZywgdHlwZSBJT2xkUmVxT3B0aW9uc1dpdGhKU09OIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKGZpbGVOYW1lOiBzdHJpbmcsIG9wdGlvbnM6IElHaXRodWJDb25maWcsIGRhdGE6IGFueSk6IElPbGRSZXFPcHRpb25zV2l0aEpTT04gPT4ge1xyXG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggfHwgJydcclxuICBjb25zdCB7IHRva2VuLCByZXBvIH0gPSBvcHRpb25zXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICB1cmw6IGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7cmVwb30vY29udGVudHMvJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJyksXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEF1dGhvcml6YXRpb246IGB0b2tlbiAke3Rva2VufWAsXHJcbiAgICAgICdVc2VyLUFnZW50JzogJ1BpY0xpc3QnLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogbWltZS5sb29rdXAoZmlsZU5hbWUpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXHJcbiAgICB9LFxyXG4gICAgYm9keTogZGF0YSxcclxuICAgIGpzb246IHRydWVcclxuICB9IGFzIGNvbnN0XHJcbn1cclxuXHJcbmNvbnN0IGdldE9wdGlvbnMgPSAoZmlsZU5hbWU6IHN0cmluZywgb3B0aW9uczogSUdpdGh1YkNvbmZpZyk6IElPbGRSZXFPcHRpb25zV2l0aEpTT04gPT4ge1xyXG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggfHwgJydcclxuICBjb25zdCB7IHRva2VuLCByZXBvLCBicmFuY2ggfSA9IG9wdGlvbnNcclxuICByZXR1cm4ge1xyXG4gICAgbWV0aG9kOiAnR0VUJyxcclxuICAgIHVybDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvfS9jb250ZW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSl9P3JlZj0ke2JyYW5jaH1gLnJlcGxhY2UoLyUyRi9nLCAnLycpLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBgdG9rZW4gJHt0b2tlbn1gLFxyXG4gICAgICAnVXNlci1BZ2VudCc6ICdQaWNHbydcclxuICAgIH0sXHJcbiAgICBqc29uOiB0cnVlXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IGdpdGh1Yk9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElHaXRodWJDb25maWc+KCdwaWNCZWQuZ2l0aHViJylcclxuICBpZiAoIWdpdGh1Yk9wdGlvbnMpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIGdpdGh1YiBjb25maWcnKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGNvbnN0IHVwbG9hZFBhdGggPSBnaXRodWJPcHRpb25zLnBhdGggfHwgJydcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBpbWcuYmFzZTY0SW1hZ2UgfHwgQnVmZmVyLmZyb20oaW1nLmJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpXHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgIG1lc3NhZ2U6ICdVcGxvYWQgYnkgUGljTGlzdCcsXHJcbiAgICAgICAgICBicmFuY2g6IGdpdGh1Yk9wdGlvbnMuYnJhbmNoLFxyXG4gICAgICAgICAgY29udGVudDogYmFzZTY0SW1hZ2UsXHJcbiAgICAgICAgICBwYXRoOiB1cGxvYWRQYXRoICsgZW5jb2RlVVJJKGltZy5maWxlTmFtZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcG9zdENvbmZpZyA9IHBvc3RPcHRpb25zKGltZy5maWxlTmFtZSwgZ2l0aHViT3B0aW9ucywgZGF0YSlcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgYm9keToge1xyXG4gICAgICAgICAgICBjb250ZW50OiB7XHJcbiAgICAgICAgICAgICAgZG93bmxvYWRfdXJsOiBzdHJpbmdcclxuICAgICAgICAgICAgICBzaGE6IHN0cmluZ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ID0gYXdhaXQgY3R4LnJlcXVlc3QocG9zdENvbmZpZylcclxuICAgICAgICAgIGlmIChib2R5KSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgICAgaWYgKGdpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2dpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsfS8ke2VuY29kZVVSSUNvbXBvbmVudCh1cGxvYWRQYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBpbWcuaW1nVXJsID0gYm9keS5jb250ZW50LmRvd25sb2FkX3VybFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGltZy5oYXNoID0gYm9keS5jb250ZW50LnNoYVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgICAgICBpZiAoZXJyLnN0YXR1c0NvZGUgPT09IDQyMikge1xyXG4gICAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGN0eC5yZXF1ZXN0KGdldE9wdGlvbnMoaW1nLmZpbGVOYW1lLCBnaXRodWJPcHRpb25zKSkgYXMgYW55XHJcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZXMpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGltZy5oYXNoID0gcmVzLnNoYVxyXG4gICAgICAgICAgICAgIGlmIChnaXRodWJPcHRpb25zLmN1c3RvbVVybCkge1xyXG4gICAgICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2dpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsfS8ke2VuY29kZVVSSUNvbXBvbmVudCh1cGxvYWRQYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaW1nLmltZ1VybCA9IHJlcy5kb3dubG9hZF91cmxcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZXQgQ29udGVudHMgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLJylcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUdpdGh1YkNvbmZpZz4oJ3BpY0JlZC5naXRodWInKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAncmVwbycsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9SRVBPJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUkVQTycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5yZXBvIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2JyYW5jaCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9CUkFOQ0gnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9CUkFOQ0gnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5icmFuY2ggfHwgJ21hc3RlcicsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAndG9rZW4nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9UT0tFTicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudG9rZW4gfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdnaXRodWInLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHFpbml1IGZyb20gJ3Fpbml1J1xyXG5pbXBvcnQgeyB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSVFpbml1Q29uZmlnLCB0eXBlIElQaWNHbywgdHlwZSBJT2xkUmVxT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgdHlwZSBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcblxyXG5mdW5jdGlvbiBwb3N0T3B0aW9ucyAob3B0aW9uczogSVFpbml1Q29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBpbWdCYXNlNjQ6IHN0cmluZyk6IElPbGRSZXFPcHRpb25zIHtcclxuICBjb25zdCBhcmVhID0gc2VsZWN0QXJlYShvcHRpb25zLmFyZWEgfHwgJ3owJylcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3QgYmFzZTY0RmlsZU5hbWUgPSBCdWZmZXIuZnJvbShwYXRoICsgZmlsZU5hbWUsICd1dGYtOCcpLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKVxyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgIHVybDogYGh0dHA6Ly91cGxvYWQke2FyZWF9LnFpbml1cC5jb20vcHV0YjY0Ly0xL2tleS8ke2Jhc2U2NEZpbGVOYW1lfWAsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEF1dGhvcml6YXRpb246IGBVcFRva2VuICR7dG9rZW59YCxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xyXG4gICAgfSxcclxuICAgIGJvZHk6IGltZ0Jhc2U2NFxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2VsZWN0QXJlYSAoYXJlYTogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gYXJlYSA9PT0gJ3owJyA/ICcnIDogJy0nICsgYXJlYVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRUb2tlbiAocWluaXVPcHRpb25zOiBhbnkpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGFjY2Vzc0tleSA9IHFpbml1T3B0aW9ucy5hY2Nlc3NLZXlcclxuICBjb25zdCBzZWNyZXRLZXkgPSBxaW5pdU9wdGlvbnMuc2VjcmV0S2V5XHJcbiAgY29uc3QgbWFjID0gbmV3IHFpbml1LmF1dGguZGlnZXN0Lk1hYyhhY2Nlc3NLZXksIHNlY3JldEtleSlcclxuICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgc2NvcGU6IHFpbml1T3B0aW9ucy5idWNrZXRcclxuICB9XHJcbiAgY29uc3QgcHV0UG9saWN5ID0gbmV3IHFpbml1LnJzLlB1dFBvbGljeShvcHRpb25zKVxyXG4gIHJldHVybiBwdXRQb2xpY3kudXBsb2FkVG9rZW4obWFjKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHFpbml1T3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVFpbml1Q29uZmlnPigncGljQmVkLnFpbml1JylcclxuICBpZiAoIXFpbml1T3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgcWluaXUgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhxaW5pdU9wdGlvbnMsIGltZy5maWxlTmFtZSwgZ2V0VG9rZW4ocWluaXVPcHRpb25zKSwgYmFzZTY0SW1hZ2UpXHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShyZXMpXHJcbiAgICAgICAgaWYgKGJvZHk/LmtleSkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSBxaW5pdU9wdGlvbnMudXJsXHJcbiAgICAgICAgICBjb25zdCB1cmxPcHRpb25zID0gcWluaXVPcHRpb25zLm9wdGlvbnMgfHwgJydcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtiYXNlVXJsfS8ke2JvZHkua2V5IGFzIHN0cmluZ30ke3VybE9wdGlvbnN9YFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICBib2R5OiBib2R5Lm1zZ1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGN0eC5sb2cuZXJyb3IoJ3Fpbml1IGVycm9yJywgYm9keSlcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXBsb2FkIGZhaWxlZCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGlmIChlcnIubWVzc2FnZSAhPT0gJ1VwbG9hZCBmYWlsZWQnKSB7XHJcbiAgICAgIC8vIGVyci5yZXNwb25zZSBtYXliZSB1bmRlZmluZWRcclxuICAgICAgaWYgKGVyci5yZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyLnJlc3BvbnNlLmJvZHlcclxuICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGVycm9yLmVycm9yXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElRaW5pdUNvbmZpZz4oJ3BpY0JlZC5xaW5pdScpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NLZXknLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX0FDQ0VTU0tFWScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYWNjZXNzS2V5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NlY3JldEtleScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfU0VDUkVUS0VZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zZWNyZXRLZXkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd1cmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX1VSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FyZWEnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9BUkVBJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9BUkVBJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9QQVRIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcigncWluaXUnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVUnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGx1Z2luQ29uZmlnLCB0eXBlIElJbWd1ckNvbmZpZywgdHlwZSBJT2xkUmVxT3B0aW9ucywgdHlwZSBJRnVsbFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbmNvbnN0IGZvcm1hdEFjY2Vzc1Rva2VuID0gKGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBzdHJpbmcgPT4gYWNjZXNzVG9rZW4gPyBhY2Nlc3NUb2tlbi5zdGFydHNXaXRoKCdCZWFyZXInKSA/IGFjY2Vzc1Rva2VuIDogYEJlYXJlciAke2FjY2Vzc1Rva2VufWAgOiAnJ1xyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSBhc3luYyAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElJbWd1ckNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgaW1nQmFzZTY0OiBzdHJpbmcpOiBQcm9taXNlPElPbGRSZXFPcHRpb25zPiA9PiB7XHJcbiAgY29uc3QgY2xpZW50SWQgPSBvcHRpb25zLmNsaWVudElkIHx8ICcnXHJcbiAgY29uc3QgdXNlcm5hbWUgPSBvcHRpb25zLnVzZXJuYW1lIHx8ICcnXHJcbiAgY29uc3QgYWNjZXNzVG9rZW4gPSBmb3JtYXRBY2Nlc3NUb2tlbihvcHRpb25zLmFjY2Vzc1Rva2VuIHx8ICcnKVxyXG4gIGNvbnN0IGFsYnVtID0gb3B0aW9ucy5hbGJ1bSB8fCAnJ1xyXG4gIGxldCBhdXRob3JpemF0aW9uXHJcbiAgaWYgKHVzZXJuYW1lICYmIGFjY2Vzc1Rva2VuKSB7XHJcbiAgICBhdXRob3JpemF0aW9uID0gYWNjZXNzVG9rZW5cclxuICB9IGVsc2UgaWYgKGNsaWVudElkKSB7XHJcbiAgICBhdXRob3JpemF0aW9uID0gYENsaWVudC1JRCAke2NsaWVudElkfWBcclxuICB9IGVsc2Uge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGllbnRJZCBvciBhY2Nlc3NUb2tlbiBpcyByZXF1aXJlZCcpXHJcbiAgfVxyXG4gIGNvbnN0IHJlcXVlc3RPcHRpb25zOiBJT2xkUmVxT3B0aW9ucyA9IHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgdXJsOiAnaHR0cHM6Ly9hcGkuaW1ndXIuY29tLzMvaW1hZ2UnLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBhdXRob3JpemF0aW9uLFxyXG4gICAgICAnY29udGVudC10eXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnLFxyXG4gICAgICBIb3N0OiAnYXBpLmltZ3VyLmNvbScsXHJcbiAgICAgICdVc2VyLUFnZW50JzogJ1BpY0xpc3QnXHJcbiAgICB9LFxyXG4gICAgZm9ybURhdGE6IHtcclxuICAgICAgaW1hZ2U6IGltZ0Jhc2U2NCxcclxuICAgICAgdHlwZTogJ2Jhc2U2NCcsXHJcbiAgICAgIG5hbWU6IGZpbGVOYW1lLFxyXG4gICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZGVkIHdpdGggUGljTGlzdCdcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKHVzZXJuYW1lICYmIGFjY2Vzc1Rva2VuICYmIGFsYnVtKSB7XHJcbiAgICBsZXQgaW5pdFBhZ2VzID0gMFxyXG4gICAgbGV0IHJlc1xyXG4gICAgbGV0IGFsYnVtSGFzaCA9ICcnXHJcbiAgICBkbyB7XHJcbiAgICAgIGNvbnN0IGdldEFsYnVtSGFzaE9wdGlvbnM6IElPbGRSZXFPcHRpb25zID0ge1xyXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgdXJsOiBgaHR0cHM6Ly9hcGkuaW1ndXIuY29tLzMvYWNjb3VudC8ke3VzZXJuYW1lfS9hbGJ1bXMvJHtpbml0UGFnZXN9YCxcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRob3JpemF0aW9uXHJcbiAgICAgICAgfSxcclxuICAgICAgICBqc29uOiB0cnVlLFxyXG4gICAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxyXG4gICAgICAgIHRpbWVvdXQ6IDEwMDAwXHJcbiAgICAgIH1cclxuICAgICAgaWYgKG9wdGlvbnMucHJveHkpIHtcclxuICAgICAgICBnZXRBbGJ1bUhhc2hPcHRpb25zLnByb3h5ID0gb3B0aW9ucy5wcm94eVxyXG4gICAgICB9XHJcbiAgICAgIHJlcyA9IGF3YWl0IGN0eC5yZXF1ZXN0KGdldEFsYnVtSGFzaE9wdGlvbnMpIGFzIHVua25vd24gYXMgSUZ1bGxSZXNwb25zZVxyXG4gICAgICBpZiAoIShyZXMuc3RhdHVzQ29kZSA9PT0gMjAwICYmIHJlcy5ib2R5LnN1Y2Nlc3MpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFsYnVtTGlzdCA9IHJlcy5ib2R5LmRhdGFcclxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFsYnVtTGlzdCkge1xyXG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBhbGJ1bSkge1xyXG4gICAgICAgICAgYWxidW1IYXNoID0gaXRlbS5pZFxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaW5pdFBhZ2VzKytcclxuICAgIH0gd2hpbGUgKHJlcy5ib2R5LmRhdGEubGVuZ3RoID4gMClcclxuICAgIGlmIChhbGJ1bUhhc2ggJiYgcmVxdWVzdE9wdGlvbnMuZm9ybURhdGEpIHtcclxuICAgICAgcmVxdWVzdE9wdGlvbnMuZm9ybURhdGEuYWxidW0gPSBhbGJ1bUhhc2hcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKG9wdGlvbnMucHJveHkpIHtcclxuICAgIHJlcXVlc3RPcHRpb25zLnByb3h5ID0gb3B0aW9ucy5wcm94eVxyXG4gIH1cclxuICByZXR1cm4gcmVxdWVzdE9wdGlvbnNcclxufVxyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjb25zdCBpbWd1ck9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElJbWd1ckNvbmZpZz4oJ3BpY0JlZC5pbWd1cicpXHJcbiAgaWYgKCFpbWd1ck9wdGlvbnMpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIGltZ3VyIGNvbmZpZycpXHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBjb25zdCBiYXNlNjRJbWFnZSA9IGltZy5iYXNlNjRJbWFnZSB8fCBCdWZmZXIuZnJvbShpbWcuYnVmZmVyKS50b1N0cmluZygnYmFzZTY0JylcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgcG9zdE9wdGlvbnMoY3R4LCBpbWd1ck9wdGlvbnMsIGltZy5maWxlTmFtZSwgYmFzZTY0SW1hZ2UpXHJcbiAgICAgICAgY29uc3QgcmVzOiBzdHJpbmcgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSB0eXBlb2YgcmVzID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UocmVzKSA6IHJlc1xyXG4gICAgICAgIGlmIChib2R5LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpbWcuaW1nVXJsID0gYm9keS5kYXRhLmxpbmtcclxuICAgICAgICAgIGltZy5oYXNoID0gYm9keS5kYXRhLmRlbGV0ZWhhc2hcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUksnKSxcclxuICAgICAgdGV4dDogJ2h0dHA6Ly9kb2NzLmltZ3VyLmNvbS9hcGkvZXJybm8vJ1xyXG4gICAgfSlcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc3RyaW5nIHwgSUVycm9yXHJcbiAgICB0aHJvdyBlcnI/LnJlc3BvbnNlPy5kYXRhIHx8IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJSW1ndXJDb25maWc+KCdwaWNCZWQuaW1ndXInKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY2xpZW50SWQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9DTElFTlRJRCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfQ0xJRU5USUQnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfTUVTU0FHRV9DTElFTlRJRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY2xpZW50SWQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3VzZXJuYW1lJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfVVNFUk5BTUUnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX1VTRVJOQU1FJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX01FU1NBR0VfVVNFUk5BTUUnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnVzZXJuYW1lIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NUb2tlbicsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX0FDQ0VTU19UT0tFTicpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfQUNDRVNTX1RPS0VOJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX01FU1NBR0VfQUNDRVNTX1RPS0VOJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NUb2tlbiB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYWxidW0nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9BTEJVTScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfQUxCVU0nKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfTUVTU0FHRV9BTEJVTScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYWxidW0gfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Byb3h5JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfUFJPWFknKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX1BST1hZJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX01FU1NBR0VfUFJPWFknKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnByb3h5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdpbWd1cicsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUicpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSUFsaXl1bkNvbmZpZywgdHlwZSBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbi8vIGdlbmVyYXRlIE9TUyBzaWduYXR1cmVcclxuY29uc3QgZ2VuZXJhdGVTaWduYXR1cmUgPSAob3B0aW9uczogSUFsaXl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKVxyXG4gIGNvbnN0IG1pbWVUeXBlID0gbWltZS5sb29rdXAoZmlsZU5hbWUpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXHJcblxyXG4gIGNvbnN0IHNpZ25TdHJpbmcgPSBgUFVUXFxuXFxuJHttaW1lVHlwZX1cXG4ke2RhdGV9XFxuLyR7b3B0aW9ucy5idWNrZXR9LyR7b3B0aW9ucy5wYXRofSR7ZmlsZU5hbWV9YFxyXG5cclxuICBjb25zdCBzaWduYXR1cmUgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIG9wdGlvbnMuYWNjZXNzS2V5U2VjcmV0KS51cGRhdGUoc2lnblN0cmluZykuZGlnZXN0KCdiYXNlNjQnKVxyXG4gIHJldHVybiBgT1NTICR7b3B0aW9ucy5hY2Nlc3NLZXlJZH06JHtzaWduYXR1cmV9YFxyXG59XHJcblxyXG5jb25zdCBwb3N0T3B0aW9ucyA9IChvcHRpb25zOiBJQWxpeXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgaW1hZ2U6IEJ1ZmZlcik6IElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICB1cmw6IGBodHRwczovLyR7b3B0aW9ucy5idWNrZXR9LiR7b3B0aW9ucy5hcmVhfS5hbGl5dW5jcy5jb20vJHtlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5wYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSl9YC5yZXBsYWNlKC8lMkYvZywgJy8nKSxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgSG9zdDogYCR7b3B0aW9ucy5idWNrZXR9LiR7b3B0aW9ucy5hcmVhfS5hbGl5dW5jcy5jb21gLFxyXG4gICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUsXHJcbiAgICAgIERhdGU6IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKVxyXG4gICAgfSxcclxuICAgIGJvZHk6IGltYWdlLFxyXG4gICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgYWxpWXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SUFsaXl1bkNvbmZpZz4oJ3BpY0JlZC5hbGl5dW4nKVxyXG4gIGlmICghYWxpWXVuT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgYWxpWXVuIE9TUyBjb25maWcnKVxyXG4gIH1cclxuICBhbGlZdW5PcHRpb25zLnBhdGggPSBhbGlZdW5PcHRpb25zLnBhdGgucmVwbGFjZSgvXFwvKiQvLCAnJykucmVwbGFjZSgvXlxcLyovLCAnJykgKyAnLydcclxuICBpZiAoYWxpWXVuT3B0aW9ucy5wYXRoID09PSAnLycpIHtcclxuICAgIGFsaVl1bk9wdGlvbnMucGF0aCA9ICcnXHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgY29uc3QgY3VzdG9tVXJsID0gYWxpWXVuT3B0aW9ucy5jdXN0b21VcmxcclxuICAgIGNvbnN0IHBhdGggPSBhbGlZdW5PcHRpb25zLnBhdGggPz8gJydcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ2VuZXJhdGVTaWduYXR1cmUoYWxpWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0gcG9zdE9wdGlvbnMoYWxpWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lLCBzaWduYXR1cmUsIGltYWdlKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGNvbnN0IG9wdGlvblVybCA9IGFsaVl1bk9wdGlvbnMub3B0aW9ucyB8fCAnJ1xyXG4gICAgICAgICAgaWYgKGN1c3RvbVVybCkge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke2VuY29kZVVSSUNvbXBvbmVudChwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfSR7b3B0aW9uVXJsfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgaHR0cHM6Ly8ke2FsaVl1bk9wdGlvbnMuYnVja2V0fS4ke2FsaVl1bk9wdGlvbnMuYXJlYX0uYWxpeXVuY3MuY29tLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9JHtvcHRpb25Vcmx9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VwbG9hZCBmYWlsZWQnKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1MnKVxyXG4gICAgfSlcclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJQWxpeXVuQ29uZmlnPigncGljQmVkLmFsaXl1bicpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NLZXlJZCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFjY2Vzc0tleUlkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FjY2Vzc0tleVNlY3JldCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXlTZWNyZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhcmVhJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ2FsaXl1bicsIHtcclxuICAgIGdldCBuYW1lICgpIHtcclxuICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRCcpXHJcbiAgICB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGx1Z2luQ29uZmlnLCB0eXBlIElVcHl1bkNvbmZpZywgdHlwZSBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IHsgc2FmZVBhcnNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xyXG5cclxuLy8gZ2VuZXJhdGUgQ09TIHNpZ25hdHVyZSBzdHJpbmdcclxuY29uc3QgZ2VuZXJhdGVTaWduYXR1cmUgPSAob3B0aW9uczogSVVweXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3Qgb3BlcmF0b3IgPSBvcHRpb25zLm9wZXJhdG9yXHJcbiAgY29uc3QgcGFzc3dvcmQgPSBvcHRpb25zLnBhc3N3b3JkXHJcbiAgY29uc3QgbWQ1UGFzc3dvcmQgPSBNRDUocGFzc3dvcmQpXHJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKVxyXG4gIGNvbnN0IHVyaSA9IGAvJHtvcHRpb25zLmJ1Y2tldH0vJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICBjb25zdCB2YWx1ZSA9IGBQVVQmJHt1cml9JiR7ZGF0ZX1gXHJcbiAgY29uc3Qgc2lnbiA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgbWQ1UGFzc3dvcmQpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KCdiYXNlNjQnKVxyXG4gIHJldHVybiBgVVBZVU4gJHtvcGVyYXRvcn06JHtzaWdufWBcclxufVxyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAob3B0aW9uczogSVVweXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgaW1hZ2U6IEJ1ZmZlcik6IElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSA9PiB7XHJcbiAgY29uc3QgYnVja2V0ID0gb3B0aW9ucy5idWNrZXRcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICB1cmw6IGBodHRwczovL3YwLmFwaS51cHl1bi5jb20vJHtidWNrZXR9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUsXHJcbiAgICAgIERhdGU6IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xyXG4gICAgfSxcclxuICAgIGJvZHk6IGltYWdlLFxyXG4gICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIE1ENSAoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShjb250ZW50KS5kaWdlc3QoJ2hleCcpXHJcbn1cclxuXHJcbmNvbnN0IGdldEFudGlMZWVjaFBhcmFtID0gKGFudGlMZWVjaFRva2VuOiBzdHJpbmcsIGV4cGlyZVRpbWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgb3B0aW9uczogSVVweXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCB1cmkgPSBgLyR7b3B0aW9ucy5wYXRoIHx8ICcnfSR7ZmlsZU5hbWV9YC5yZXBsYWNlKC8lMkYvZywgJy8nKS5yZXBsYWNlKC9eXFwvKy9nLCAnLycpXHJcbiAgY29uc3Qgbm93ID0gTWF0aC5yb3VuZChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApXHJcbiAgY29uc3QgZXhwaXJlID0gZXhwaXJlVGltZSA/IG5vdyArIHBhcnNlSW50KGV4cGlyZVRpbWUudG9TdHJpbmcoKSwgMTApIDogbm93ICsgMTgwMFxyXG4gIGNvbnN0IHNpZ24gPSBNRDUoYCR7YW50aUxlZWNoVG9rZW59JiR7ZXhwaXJlfSYke3VyaX1gKVxyXG4gIGNvbnN0IHVwdCA9IGAke3NpZ24uc3Vic3RyaW5nKDEyLCAyMCl9JHtleHBpcmV9YFxyXG4gIHJldHVybiBgX3VwdD0ke3VwdH1gXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgdXB5dW5PcHRpb25zID0gY3R4LmdldENvbmZpZzxJVXB5dW5Db25maWc+KCdwaWNCZWQudXB5dW4nKVxyXG4gIGlmICghdXB5dW5PcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCB1cFl1biBjb25maWcnKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGNvbnN0IHBhdGggPSB1cHl1bk9wdGlvbnMucGF0aCB8fCAnJ1xyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcclxuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCAnYmFzZTY0JylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ2VuZXJhdGVTaWduYXR1cmUodXB5dW5PcHRpb25zLCBpbWcuZmlsZU5hbWUpXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHBvc3RPcHRpb25zKHVweXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lLCBzaWduYXR1cmUsIGltYWdlKVxyXG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IHVweXVuT3B0aW9ucy5vcHRpb25zIHx8ICcnXHJcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXHJcbiAgICAgICAgaWYgKGJvZHkuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGAke3VweXVuT3B0aW9ucy51cmx9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9JHtzdWZmaXh9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgICAgaWYgKHVweXVuT3B0aW9ucy5hbnRpTGVlY2hUb2tlbikge1xyXG4gICAgICAgICAgICBjb25zdCB1cHQgPSBnZXRBbnRpTGVlY2hQYXJhbSh1cHl1bk9wdGlvbnMuYW50aUxlZWNoVG9rZW4sIHVweXVuT3B0aW9ucy5leHBpcmVUaW1lLCB1cHl1bk9wdGlvbnMsIGltZy5maWxlTmFtZSlcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGltZy5pbWdVcmwuaW5jbHVkZXMoJz8nKSA/IGAke2ltZy5pbWdVcmx9JiR7dXB0fWAgOiBgJHtpbWcuaW1nVXJsfT8ke3VwdH1gXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXBsb2FkIGZhaWxlZCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGlmIChlcnIubWVzc2FnZSA9PT0gJ1VwbG9hZCBmYWlsZWQnKSB7XHJcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdDSEVDS19TRVRUSU5HUycpXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBib2R5ID0gc2FmZVBhcnNlPHsgY29kZTogc3RyaW5nIH0+KGVyci5lcnJvcilcclxuICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRURfUkVBU09OJywge1xyXG4gICAgICAgICAgY29kZTogdHlwZW9mIGJvZHkgPT09ICdvYmplY3QnID8gYm9keS5jb2RlIDogYm9keVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRleHQ6ICdodHRwOi8vZG9jcy51cHl1bi5jb20vYXBpL2Vycm5vLydcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJVXB5dW5Db25maWc+KCdwaWNCZWQudXB5dW4nKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcGVyYXRvcicsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fT1BFUkFUT1InKSB9LFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX09QRVJBVE9SJylcclxuICAgICAgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1InKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wZXJhdG9yIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fUEFTU1dPUkQnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGFzc3dvcmQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAndXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9VUkwnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9QQVRIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYW50aUxlZWNoVG9rZW4nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9BTlRJX0xFRUNIX1RPS0VOJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9BTlRJX0xFRUNIX1RPS0VOJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX0FOVElfTEVFQ0hfVE9LRU4nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFudGlMZWVjaFRva2VuIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdleHBpcmVUaW1lJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fRVhQSVJFX1RJTUUnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX0VYUElSRV9USU1FJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX0VYUElSRV9USU1FJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5leHBpcmVUaW1lIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCd1cHl1bicsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTicpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSVdlYmRhdlBsaXN0Q29uZmlnIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28gfCBib29sZWFuPiA9PiB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV2YWxcclxuICBjb25zdCB7IEF1dGhUeXBlLCBjcmVhdGVDbGllbnQgfSA9IGF3YWl0IGV2YWwoXCJpbXBvcnQoJ3dlYmRhdicpXCIpXHJcbiAgY29uc3Qgd2ViZGF2cGxpc3RPcHRpb25zID0gY3R4LmdldENvbmZpZzxJV2ViZGF2UGxpc3RDb25maWc+KCdwaWNCZWQud2ViZGF2cGxpc3QnKVxyXG4gIGlmICghd2ViZGF2cGxpc3RPcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCB3ZWJkYXZwbGlzdCBjb25maWcnKVxyXG4gIH1cclxuICB3ZWJkYXZwbGlzdE9wdGlvbnMuaG9zdCA9IHdlYmRhdnBsaXN0T3B0aW9ucy5ob3N0LnJlcGxhY2UoL15odHRwcz86XFwvXFwvfFxcLyskL2csICcnKVxyXG4gIHdlYmRhdnBsaXN0T3B0aW9ucy5ob3N0ID0gKHdlYmRhdnBsaXN0T3B0aW9ucy5zc2xFbmFibGVkID8gJ2h0dHBzOi8vJyA6ICdodHRwOi8vJykgKyB3ZWJkYXZwbGlzdE9wdGlvbnMuaG9zdFxyXG4gIHdlYmRhdnBsaXN0T3B0aW9ucy5wYXRoID0gKHdlYmRhdnBsaXN0T3B0aW9ucy5wYXRoIHx8ICcnKS5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCAnJykgKyAnLydcclxuICBjb25zdCBhdXRoVHlwZSA9IHdlYmRhdnBsaXN0T3B0aW9ucy5hdXRoVHlwZSB8fCAnYmFzaWMnXHJcbiAgY29uc3Qgd2VicGF0aCA9ICh3ZWJkYXZwbGlzdE9wdGlvbnMud2VicGF0aCB8fCAnJykucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpICsgJy8nXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBjb25zdCBjdXN0b21VcmwgPSB3ZWJkYXZwbGlzdE9wdGlvbnMuY3VzdG9tVXJsXHJcbiAgICBjb25zdCB1cGxvYWRQYXRoID0gd2ViZGF2cGxpc3RPcHRpb25zLnBhdGhcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNsaWVudE9wdGlvbnM6IGFueSA9IHtcclxuICAgICAgICAgIHVzZXJuYW1lOiB3ZWJkYXZwbGlzdE9wdGlvbnMudXNlcm5hbWUsXHJcbiAgICAgICAgICBwYXNzd29yZDogd2ViZGF2cGxpc3RPcHRpb25zLnBhc3N3b3JkLFxyXG4gICAgICAgICAgbWF4Qm9keUxlbmd0aDogNCAqIDEwMjQgKiAxMDI0ICogMTAyNCxcclxuICAgICAgICAgIG1heENvbnRlbnRMZW5ndGg6IDQgKiAxMDI0ICogMTAyNCAqIDEwMjRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGF1dGhUeXBlID09PSAnZGlnZXN0Jykge1xyXG4gICAgICAgICAgY2xpZW50T3B0aW9ucy5hdXRoVHlwZSA9IEF1dGhUeXBlLkRpZ2VzdFxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjbGllbnQ6IGFueSA9IGNyZWF0ZUNsaWVudCh3ZWJkYXZwbGlzdE9wdGlvbnMuaG9zdCwgY2xpZW50T3B0aW9ucylcclxuICAgICAgICBjb25zdCBwYXRoVG9DcmVhdGUgPSB1cGxvYWRQYXRoID09PSAnLycgPyAnJyA6IHVwbG9hZFBhdGhcclxuICAgICAgICBpZiAocGF0aFRvQ3JlYXRlKSB7XHJcbiAgICAgICAgICBhd2FpdCBjbGllbnQuY3JlYXRlRGlyZWN0b3J5KHBhdGhUb0NyZWF0ZSwgeyByZWN1cnNpdmU6IHRydWUgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LnB1dEZpbGVDb250ZW50cyhgJHt1cGxvYWRQYXRofSR7aW1nLmZpbGVOYW1lfWAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpLCBpbWFnZSwge1xyXG4gICAgICAgICAgb3ZlcndyaXRlOiB0cnVlXHJcbiAgICAgICAgfSlcclxuICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICBjb25zdCBpbWdUZW1wUGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgJ2ltZ1RlbXAnLCAnd2ViZGF2cGxpc3QnKVxyXG4gICAgICAgICAgY29uc3QgaW1nVGVtcEZpbGVQYXRoID0gcGF0aC5qb2luKGltZ1RlbXBQYXRoLCBpbWcuZmlsZU5hbWUpXHJcbiAgICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKGltZ1RlbXBQYXRoKVxyXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhpbWdUZW1wRmlsZVBhdGgsIGltYWdlKVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSBjdXN0b21VcmwgfHwgd2ViZGF2cGxpc3RPcHRpb25zLmhvc3RcclxuICAgICAgICAgIGlmICh3ZWJkYXZwbGlzdE9wdGlvbnMud2VicGF0aCkge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7YmFzZVVybH0vJHt3ZWJwYXRoID09PSAnLycgPyAnJyA6IGVuY29kZVVSSUNvbXBvbmVudCh3ZWJwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtiYXNlVXJsfS8ke3VwbG9hZFBhdGggPT09ICcvJyA/ICcnIDogZW5jb2RlVVJJQ29tcG9uZW50KHVwbG9hZFBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaW1nLmdhbGxlcnlQYXRoID0gYGh0dHA6Ly9sb2NhbGhvc3Q6MzY2OTkvd2ViZGF2cGxpc3QvJHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX1gXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXBsb2FkIGZhaWxlZCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTJylcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVdlYmRhdlBsaXN0Q29uZmlnPigncGljQmVkLndlYmRhdnBsaXN0JykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2hvc3QnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX0hPU1QnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmhvc3QgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc3NsRW5hYmxlZCcsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnNzbEVuYWJsZWQgPz8gZmFsc2UsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX1NTTEVOQUJMRUQnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9TU0xFTkFCTEVEJykgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3VzZXJuYW1lJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9VU0VSTkFNRScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudXNlcm5hbWUgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9VU0VSTkFNRScpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1VTRVJOQU1FJykgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9QQVNTV09SRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGFzc3dvcmQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9QQVNTV09SRCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBU1NXT1JEJykgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX1BBVEgnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhdGggfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBVEgnKSB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnd2VicGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfV0VCU0lURV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX1dFQlNJVEVfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1dFQlNJVEVfUEFUSCcpIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0NVU1RPTVVSTCcpIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhdXRoVHlwZScsXHJcbiAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9BVVRIVFlQRScpIH0sXHJcbiAgICAgIGNob2ljZXM6IFsnYmFzaWMnLCAnZGlnZXN0J10sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXV0aFR5cGUgfHwgJ2Jhc2ljJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3Rlcignd2ViZGF2cGxpc3QnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1QnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGx1Z2luQ29uZmlnLCB0eXBlIElMb2NhbENvbmZpZyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgdHlwZSBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgbG9jYWxDb25maWcgPSBjdHguZ2V0Q29uZmlnPElMb2NhbENvbmZpZz4oJ3BpY0JlZC5sb2NhbCcpXHJcbiAgaWYgKCFsb2NhbENvbmZpZykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGZpbmQgbG9jYWwgY29uZmlnIScpXHJcbiAgfVxyXG4gIGNvbnN0IHVwbG9hZFBhdGggPSBsb2NhbENvbmZpZy5wYXRoIHx8ICcnXHJcbiAgbGV0IGN1c3RvbVVybCA9IGxvY2FsQ29uZmlnLmN1c3RvbVVybCB8fCAnJ1xyXG4gIGlmIChjdXN0b21VcmwpIHtcclxuICAgIGN1c3RvbVVybCA9IGN1c3RvbVVybC5yZXBsYWNlKC9cXC8kLywgJycpXHJcbiAgfVxyXG4gIGxldCB3ZWJQYXRoID0gbG9jYWxDb25maWcud2ViUGF0aCB8fCAnJ1xyXG4gIGlmICh3ZWJQYXRoKSB7XHJcbiAgICB3ZWJQYXRoID0gd2ViUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJykucmVwbGFjZSgvXlxcLy8sICcnKS5yZXBsYWNlKC9cXC8kLywgJycpXHJcbiAgfVxyXG4gIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcclxuICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgIH1cclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgaW1nVGVtcFBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICdpbWdUZW1wJywgJ2xvY2FsJylcclxuICAgICAgICAgIGZzLmVuc3VyZURpclN5bmMoaW1nVGVtcFBhdGgpXHJcbiAgICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHVwbG9hZFBhdGgpXHJcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbih1cGxvYWRQYXRoLCBpbWcuZmlsZU5hbWUpLCBpbWFnZSlcclxuICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhwYXRoLmpvaW4odXBsb2FkUGF0aCwgaW1nLmZpbGVOYW1lKSwgcGF0aC5qb2luKGN0eC5iYXNlRGlyLCAnaW1nVGVtcCcsICdsb2NhbCcsIGltZy5maWxlTmFtZSkpXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaWYgKGN1c3RvbVVybCkge1xyXG4gICAgICAgICAgICBpZiAod2ViUGF0aCkge1xyXG4gICAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtjdXN0b21Vcmx9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHdlYlBhdGgpfS8ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IHBhdGguam9pbih1cGxvYWRQYXRoLCBpbWcuZmlsZU5hbWUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpbWcuaGFzaCA9IHBhdGguam9pbih1cGxvYWRQYXRoLCBpbWcuZmlsZU5hbWUpXHJcbiAgICAgICAgICBpbWcuZ2FsbGVyeVBhdGggPSBgaHR0cDovL2xvY2FsaG9zdDozNjY5OS9sb2NhbC8ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWBcclxuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgICAgICAgIGJvZHk6ICdmYWlsZWQgdG8gdXBsb2FkIGltYWdlJ1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHVwbG9hZCBpbWFnZScpXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICBjdHgubG9nLmVycm9yKGUpXHJcbiAgICAgICAgdGhyb3cgZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBjdHhcclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJTG9jYWxDb25maWc+KCdwaWNCZWQubG9jYWwnKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0xPQ0FMX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0xPQ0FMX1BBVEgnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhdGggfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9MT0NBTF9NRVNTQUdFX1BBVEgnKSB9LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2N1c3RvbVVybCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0xPQ0FMX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfTE9DQUxfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5jdXN0b21VcmwgfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9MT0NBTF9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3dlYlBhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0xPQ0FMX1dFQlBBVEgnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndlYlBhdGggfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfTE9DQUxfV0VCUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9MT0NBTF9NRVNTQUdFX1dFQlBBVEgnKSB9XHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcignbG9jYWwnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfTE9DQUwnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBOb2RlU1NILCB0eXBlIENvbmZpZyB9IGZyb20gJ25vZGUtc3NoLW5vLWNwdS1mZWF0dXJlcydcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgdHlwZSBJU2Z0cFBsaXN0Q29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnXHJcblxyXG5jbGFzcyBTU0hDbGllbnQge1xyXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogU1NIQ2xpZW50XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2NsaWVudDogTm9kZVNTSFxyXG4gIHByaXZhdGUgX2lzQ29ubmVjdGVkID0gZmFsc2VcclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXQgaW5zdGFuY2UgKCk6IFNTSENsaWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IHRoaXMoKSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGNsaWVudCAoKTogTm9kZVNTSCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50IHx8ICh0aGlzLl9jbGllbnQgPSBuZXcgTm9kZVNTSCgpKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGFuZ2VXaW5TdHlsZVBhdGhUb1VuaXggKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJylcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0IChjb25maWc6IElTZnRwUGxpc3RDb25maWcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IHsgdXNlcm5hbWUsIHBhc3N3b3JkLCBwcml2YXRlS2V5LCBwYXNzcGhyYXNlIH0gPSBjb25maWdcclxuICAgIGNvbnN0IGxvZ2luSW5mbzogQ29uZmlnID0gcHJpdmF0ZUtleVxyXG4gICAgICA/IHsgdXNlcm5hbWUsIHByaXZhdGVLZXlQYXRoOiBwcml2YXRlS2V5LCBwYXNzcGhyYXNlOiBwYXNzcGhyYXNlIHx8IHVuZGVmaW5lZCB9XHJcbiAgICAgIDogeyB1c2VybmFtZSwgcGFzc3dvcmQgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgU1NIQ2xpZW50LmNsaWVudC5jb25uZWN0KHtcclxuICAgICAgICBob3N0OiBjb25maWcuaG9zdCxcclxuICAgICAgICBwb3J0OiBOdW1iZXIoY29uZmlnLnBvcnQpIHx8IDIyLFxyXG4gICAgICAgIC4uLmxvZ2luSW5mb1xyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IHRydWVcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBsb2FkIChsb2NhbDogc3RyaW5nLCByZW1vdGU6IHN0cmluZywgY29uZmlnOiBJU2Z0cFBsaXN0Q29uZmlnKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuX2lzQ29ubmVjdGVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignU1NIIOacqui/nuaOpScpXHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICByZW1vdGUgPSB0aGlzLmNoYW5nZVdpblN0eWxlUGF0aFRvVW5peChyZW1vdGUpXHJcbiAgICAgIGF3YWl0IHRoaXMubWtkaXIocGF0aC5kaXJuYW1lKHJlbW90ZSkucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpLCBjb25maWcpXHJcbiAgICAgIGF3YWl0IFNTSENsaWVudC5jbGllbnQucHV0RmlsZShsb2NhbCwgcmVtb3RlKVxyXG4gICAgICBjb25zdCBmaWxlTW9kZSA9IGNvbmZpZy5maWxlTW9kZSB8fCAnMDY0NCdcclxuICAgICAgaWYgKGZpbGVNb2RlICE9PSAnMDY0NCcpIHtcclxuICAgICAgICBjb25zdCBzY3JpcHQgPSBgY2htb2QgJHtmaWxlTW9kZX0gXCIke3JlbW90ZX1cImBcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWMoc2NyaXB0KVxyXG4gICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbWtkaXIgKGRpclBhdGg6IHN0cmluZywgY29uZmlnOiBJU2Z0cFBsaXN0Q29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIVNTSENsaWVudC5jbGllbnQuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NTSCDmnKrov57mjqUnKVxyXG4gICAgfVxyXG4gICAgY29uc3QgZGlyZWN0b3J5TW9kZSA9IGNvbmZpZy5kaXJNb2RlIHx8ICcwNzU1J1xyXG4gICAgaWYgKGRpcmVjdG9yeU1vZGUgIT09ICcwNzU1Jykge1xyXG4gICAgICBjb25zdCBkaXJzID0gZGlyUGF0aC5zcGxpdCgnLycpXHJcbiAgICAgIGxldCBjdXJyZW50UGF0aCA9ICcnXHJcbiAgICAgIGZvciAoY29uc3QgZGlyIG9mIGRpcnMpIHtcclxuICAgICAgICBpZiAoZGlyKSB7XHJcbiAgICAgICAgICBjdXJyZW50UGF0aCArPSBgLyR7ZGlyfWBcclxuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGBta2RpciBcIiR7Y3VycmVudFBhdGh9XCIgJiYgY2htb2QgJHtkaXJlY3RvcnlNb2RlfSBcIiR7Y3VycmVudFBhdGh9XCJgXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWMoc2NyaXB0KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3Qgc2NyaXB0ID0gYGNkIC8gJiYgbWtkaXIgLXAgXCIke2RpclBhdGh9XCJgXHJcbiAgICAgIGF3YWl0IHRoaXMuZXhlYyhzY3JpcHQpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY2hvd24gKHJlbW90ZTogc3RyaW5nLCB1c2VyOiBzdHJpbmcsIGdyb3VwPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZW1vdGUgPSB0aGlzLmNoYW5nZVdpblN0eWxlUGF0aFRvVW5peChyZW1vdGUpXHJcbiAgICBjb25zdCBbX3VzZXIsIF9ncm91cF0gPSBncm91cCA/IFt1c2VyLCBncm91cF0gOiB1c2VyLmluY2x1ZGVzKCc6JykgPyB1c2VyLnNwbGl0KCc6JykgOiBbdXNlciwgdXNlcl1cclxuXHJcbiAgICBjb25zdCBzY3JpcHQgPSBgY2hvd24gJHtfdXNlcn06JHtfZ3JvdXB9IFwiJHtyZW1vdGV9XCJgXHJcbiAgICByZXR1cm4gdGhpcy5leGVjKHNjcmlwdClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZXhlYyAoc2NyaXB0OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBTU0hDbGllbnQuY2xpZW50LmV4ZWNDb21tYW5kKHNjcmlwdClcclxuICAgIHJldHVybiBleGVjUmVzdWx0LmNvZGUgPT09IDBcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZSAoKTogdm9pZCB7XHJcbiAgICBTU0hDbGllbnQuY2xpZW50LmRpc3Bvc2UoKVxyXG4gICAgdGhpcy5faXNDb25uZWN0ZWQgPSBmYWxzZVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU1NIQ2xpZW50XHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSVNmdHBQbGlzdENvbmZpZyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgdHlwZSBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBTU0hDbGllbnQgZnJvbSAnLi4vLi4vdXRpbHMvc3NoQ2xpZW50J1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHNmdHBwbGlzdENvbmZpZyA9IGN0eC5nZXRDb25maWc8SVNmdHBQbGlzdENvbmZpZz4oJ3BpY0JlZC5zZnRwcGxpc3QnKVxyXG4gIGlmICghc2Z0cHBsaXN0Q29uZmlnKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgZmluZCBzZnRwcGxpc3QgY29uZmlnIScpXHJcbiAgfVxyXG4gIHNmdHBwbGlzdENvbmZpZy5wb3J0ID0gTnVtYmVyKHNmdHBwbGlzdENvbmZpZy5wb3J0KSB8fCAyMlxyXG4gIHNmdHBwbGlzdENvbmZpZy51cGxvYWRQYXRoID0gKHNmdHBwbGlzdENvbmZpZy51cGxvYWRQYXRoIHx8ICcnKS5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCAnJykgKyAnLydcclxuICBjb25zdCB3ZWJQYXRoID0gKHNmdHBwbGlzdENvbmZpZy53ZWJQYXRoIHx8ICcnKS5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCAnJykgKyAnLydcclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVwbG9hZFRlbXBQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCAndXBsb2FkVGVtcCcpXHJcbiAgICAgICAgY29uc3QgaW1nVGVtcFBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICdpbWdUZW1wJywgJ3NmdHBwbGlzdCcpXHJcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyh1cGxvYWRUZW1wUGF0aClcclxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKGltZ1RlbXBQYXRoKVxyXG4gICAgICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IHBhdGguam9pbih1cGxvYWRUZW1wUGF0aCwgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGVtcEZpbGVQYXRoLCBpbWFnZSlcclxuICAgICAgICBjb25zdCBjbGllbnQgPSBTU0hDbGllbnQuaW5zdGFuY2VcclxuICAgICAgICBhd2FpdCBjbGllbnQuY29ubmVjdChzZnRwcGxpc3RDb25maWcpXHJcbiAgICAgICAgY29uc3QgcmVtb3RlUGF0aCA9IHBhdGguam9pbihgLyR7c2Z0cHBsaXN0Q29uZmlnLnVwbG9hZFBhdGh9YC5yZXBsYWNlKC9cXC9cXC8rL2csICcvJyksIGltZy5maWxlTmFtZSlcclxuICAgICAgICBhd2FpdCBjbGllbnQudXBsb2FkKHRlbXBGaWxlUGF0aCwgcmVtb3RlUGF0aCwgc2Z0cHBsaXN0Q29uZmlnKVxyXG4gICAgICAgIHNmdHBwbGlzdENvbmZpZy5maWxlVXNlciAmJiBhd2FpdCBjbGllbnQuY2hvd24ocmVtb3RlUGF0aCwgc2Z0cHBsaXN0Q29uZmlnLmZpbGVVc2VyKVxyXG4gICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBzZnRwcGxpc3RDb25maWcuY3VzdG9tVXJsIHx8IHNmdHBwbGlzdENvbmZpZy5ob3N0XHJcbiAgICAgICAgaWYgKHNmdHBwbGlzdENvbmZpZy53ZWJQYXRoKSB7XHJcbiAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7YmFzZVVybH0vJHt3ZWJQYXRoID09PSAnLycgPyAnJyA6IGVuY29kZVVSSUNvbXBvbmVudCh3ZWJQYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGAke2Jhc2VVcmx9LyR7c2Z0cHBsaXN0Q29uZmlnLnVwbG9hZFBhdGggPT09ICcvJyA/ICcnIDogZW5jb2RlVVJJQ29tcG9uZW50KHNmdHBwbGlzdENvbmZpZy51cGxvYWRQYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICB9XHJcbiAgICAgICAgZnMubW92ZVN5bmModGVtcEZpbGVQYXRoLCBwYXRoLmpvaW4oaW1nVGVtcFBhdGgsIGltZy5maWxlTmFtZSkpXHJcbiAgICAgICAgaW1nLmdhbGxlcnlQYXRoID0gYGh0dHA6Ly9sb2NhbGhvc3Q6MzY2OTkvc2Z0cHBsaXN0LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9YFxyXG4gICAgICAgIGNsaWVudC5jbG9zZSgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1MnKVxyXG4gICAgfSlcclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJU2Z0cFBsaXN0Q29uZmlnPigncGljQmVkLnNmdHBwbGlzdCcpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdob3N0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfSE9TVCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0hPU1QnKVxyXG4gICAgICB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmhvc3QgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncG9ydCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1BPUlQnKVxyXG4gICAgICB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9QT1JUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wb3J0IHx8IDIyLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd1c2VybmFtZScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX1VTRVJOQU1FJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy51c2VybmFtZSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXNzd29yZCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX1BBU1NXT1JEJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXNzd29yZCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncHJpdmF0ZUtleScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1BSSVZBVEVLRVknKVxyXG4gICAgICB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9QUklWQVRFS0VZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wcml2YXRlS2V5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXNzcGhyYXNlJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkge1xyXG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfUFJJVkFURUtFWV9QQVNTUEhSQVNFJylcclxuICAgICAgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfUFJJVkFURUtFWV9QQVNTUEhSQVNFJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXNzcGhyYXNlIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd1cGxvYWRQYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkge1xyXG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfVVBMT0FEUEFUSCcpXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX1VQTE9BRFBBVEgnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnVwbG9hZFBhdGggfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2N1c3RvbVVybCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0NVU1RPTVVSTCcpXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3ZWJQYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkge1xyXG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfV0VCU0lURV9QQVRIJylcclxuICAgICAgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfV0VCU0lURV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53ZWJQYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdmaWxlVXNlcicsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0ZJTEVfVVNFUicpXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX0ZJTEVfVVNFUicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuZmlsZVVzZXIgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2ZpbGVNb2RlJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkge1xyXG4gICAgICAgIHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfRklMRV9NT0RFJylcclxuICAgICAgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfRklMRV9NT0RFJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5maWxlTW9kZSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnZGlyTW9kZScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0RJUl9NT0RFJylcclxuICAgICAgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfRElSX01PREUnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmRpck1vZGUgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ3NmdHBwbGlzdCcsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1QnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGx1Z2luQ29uZmlnLCB0eXBlIElUZWxlZ3JhcGhDb25maWcsIHR5cGUgSU9sZFJlcU9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IHR5cGUgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCB0eXBlIHsgUmVhZFN0cmVhbSB9IGZyb20gJ2ZzJ1xyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSBhc3luYyAob3B0aW9uczogSVRlbGVncmFwaENvbmZpZywgaW1hZ2U6IFJlYWRTdHJlYW0pOiBQcm9taXNlPElPbGRSZXFPcHRpb25zPiA9PiB7XHJcbiAgY29uc3QgcmVxdWVzdE9wdGlvbnM6IElPbGRSZXFPcHRpb25zID0ge1xyXG4gICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICB1cmw6ICdodHRwczovL3RlbGVncmEucGgvdXBsb2FkJyxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJ1xyXG4gICAgfSxcclxuICAgIGZvcm1EYXRhOiB7XHJcbiAgICAgIGZpbGU6IGltYWdlXHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmIChvcHRpb25zLnByb3h5KSB7XHJcbiAgICByZXF1ZXN0T3B0aW9ucy5wcm94eSA9IG9wdGlvbnMucHJveHlcclxuICB9XHJcbiAgcmV0dXJuIHJlcXVlc3RPcHRpb25zXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgbGV0IHRnT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVRlbGVncmFwaENvbmZpZz4oJ3BpY0JlZC50ZWxlZ3JhcGhwbGlzdCcpXHJcbiAgaWYgKCF0Z09wdGlvbnMpIHtcclxuICAgIHRnT3B0aW9ucyA9IHt9XHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcclxuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCAnYmFzZTY0JylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdXBsb2FkVGVtcFBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICd1cGxvYWRUZW1wJylcclxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHVwbG9hZFRlbXBQYXRoKVxyXG4gICAgICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IHBhdGguam9pbih1cGxvYWRUZW1wUGF0aCwgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGVtcEZpbGVQYXRoLCBpbWFnZSlcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgcG9zdE9wdGlvbnModGdPcHRpb25zLCBmcy5jcmVhdGVSZWFkU3RyZWFtKHRlbXBGaWxlUGF0aCkpXHJcbiAgICAgICAgY29uc3QgcmVzOiBzdHJpbmcgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSB0eXBlb2YgcmVzID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UocmVzKSA6IHJlc1xyXG4gICAgICAgIGZzLnJlbW92ZSh0ZW1wRmlsZVBhdGgpXHJcbiAgICAgICAgaWYgKGJvZHk/LlswXT8uc3JjKSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGBodHRwczovL3RlbGVncmEucGgke2JvZHlbMF0uc3JjfWBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUksnKSxcclxuICAgICAgdGV4dDogJydcclxuICAgIH0pXHJcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHN0cmluZyB8IElFcnJvclxyXG4gICAgdGhyb3cgZXJyPy5yZXNwb25zZT8uZGF0YSB8fCBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVRlbGVncmFwaENvbmZpZz4oJ3BpY0JlZC50ZWxlZ3JhcGhwbGlzdCcpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwcm94eScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX1BST1hZJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9QUk9YWScpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wcm94eSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcigndGVsZWdyYXBocGxpc3QnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVMRUdSQVBIJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuaW1wb3J0IHR5cGUgeyBJUGljTGlzdENvbmZpZywgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IHR5cGUgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAob3B0aW9uczogSVBpY0xpc3RDb25maWcsIGZpbGVOYW1lOiBzdHJpbmcsIGltYWdlOiBCdWZmZXIpOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xyXG4gIGNvbnN0IGhvc3QgPSBvcHRpb25zLmhvc3QgfHwgJzEyNy4wLjAuMSdcclxuICBjb25zdCBwb3J0ID0gb3B0aW9ucy5wb3J0IHx8IDM2Njc3XHJcbiAgY29uc3QgcGljYmVkID0gb3B0aW9ucy5waWNiZWQgfHwgJydcclxuICBjb25zdCBjb25maWdOYW1lID0gb3B0aW9ucy5jb25maWdOYW1lIHx8ICdEZWZhdWx0J1xyXG4gIGNvbnN0IHNlcnZlcktleSA9IG9wdGlvbnMuc2VydmVyS2V5IHx8ICcnXHJcbiAgbGV0IHVybCA9IGBodHRwOi8vJHtob3N0fToke3BvcnR9L3VwbG9hZD9jb25maWdOYW1lPSR7Y29uZmlnTmFtZX1gXHJcbiAgaWYgKHBpY2JlZCkge1xyXG4gICAgdXJsICs9IGAmcGljYmVkPSR7cGljYmVkfWBcclxuICB9XHJcbiAgaWYgKHNlcnZlcktleSkge1xyXG4gICAgdXJsICs9IGAma2V5PSR7c2VydmVyS2V5fWBcclxuICB9XHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgdXJsLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICAnY29udGVudC10eXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnXHJcbiAgICB9LFxyXG4gICAgZm9ybURhdGE6IHtcclxuICAgICAgZmlsZToge1xyXG4gICAgICAgIHZhbHVlOiBpbWFnZSxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICBmaWxlbmFtZTogZmlsZU5hbWUsXHJcbiAgICAgICAgICBjb250ZW50VHlwZTogbWltZS5sb29rdXAoZmlsZU5hbWUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvIHwgYm9vbGVhbj4gPT4ge1xyXG4gIGNvbnN0IHBpY2xpc3RPcHRpb25zID0gY3R4LmdldENvbmZpZzxJUGljTGlzdENvbmZpZz4oJ3BpY0JlZC5waWNsaXN0JylcclxuICBpZiAoIXBpY2xpc3RPcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCBQaWNMaXN0IGNvbmZpZycpXHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcclxuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCAnYmFzZTY0JylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHBvc3RPcHRpb25zKHBpY2xpc3RPcHRpb25zLCBpbWcuZmlsZU5hbWUsIGltYWdlKVxyXG5cclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgICAgLnRoZW4oKHJlczogYW55KSA9PiByZXMpXHJcbiAgICAgICAgICAuY2F0Y2goKGVycjogRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiA0MDAsXHJcbiAgICAgICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICAgICAgbXNnOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdBVVRIX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICAgICAgZXJyXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMjAwICYmIHJlcy5ib2R5Py5zdWNjZXNzKSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IHJlcy5ib2R5LnJlc3VsdFswXVxyXG4gICAgICAgICAgaW1nLmZ1bGxSZXN1bHQgPSByZXMuYm9keS5mdWxsUmVzdWx0WzBdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXMuYm9keS5tZXNzYWdlKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdDSEVDS19TRVRUSU5HUycpXHJcbiAgICB9KVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElQaWNMaXN0Q29uZmlnPigncGljQmVkLnBpY2xpc3QnKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaG9zdCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUElDTElTVF9IT1NUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5ob3N0IHx8ICcxMjcuMC4wLjEnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BvcnQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1BJQ0xJU1RfUE9SVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucG9ydCB8fCAzNjY3NyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGljYmVkJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9QSUNMSVNUX1BJQ0JFRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGljYmVkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjb25maWdOYW1lJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9QSUNMSVNUX0NPTkZJR05BTUUnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmNvbmZpZ05hbWUgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NlcnZlcktleScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUElDTElTVF9LRVknKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnNlcnZlcktleSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcigncGljbGlzdCcsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9QSUNMSVNUJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBpY0dvUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBTTU1TVXBsb2FkZXIgZnJvbSAnLi9zbW1zJ1xyXG5pbXBvcnQgdGNZdW5VcGxvYWRlciBmcm9tICcuL3RjeXVuJ1xyXG5pbXBvcnQgZ2l0aHViVXBsb2FkZXIgZnJvbSAnLi9naXRodWInXHJcbmltcG9ydCBxaW5pdVVwbG9hZGVyIGZyb20gJy4vcWluaXUnXHJcbmltcG9ydCBpbWd1clVwbG9hZGVyIGZyb20gJy4vaW1ndXInXHJcbmltcG9ydCBhbGlZdW5VcGxvYWRlciBmcm9tICcuL2FsaXl1bidcclxuaW1wb3J0IHVwWXVuVXBsb2FkZXIgZnJvbSAnLi91cHl1bidcclxuaW1wb3J0IHdlYmRhdnBsaXN0VXBsb2FkZXIgZnJvbSAnLi93ZWJkYXYnXHJcbmltcG9ydCBsb2NhbFVwbG9hZGVyIGZyb20gJy4vbG9jYWwnXHJcbmltcG9ydCBzZnRwVXBsb2FkZXIgZnJvbSAnLi9zZnRwJ1xyXG5pbXBvcnQgdGVsZWdyYXBoVXBsb2FkZXIgZnJvbSAnLi90ZWxlZ3JhcGgnXHJcbmltcG9ydCBwaWNsaXN0VXBsb2FkZXIgZnJvbSAnLi9waWNsaXN0J1xyXG5cclxuY29uc3QgYnVpbGRJblVwbG9hZGVyczogSVBpY0dvUGx1Z2luID0gKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICByZWdpc3RlciAoY3R4OiBJUGljR28pIHtcclxuICAgICAgYWxpWXVuVXBsb2FkZXIoY3R4KVxyXG4gICAgICB0Y1l1blVwbG9hZGVyKGN0eClcclxuICAgICAgU01NU1VwbG9hZGVyKGN0eClcclxuICAgICAgZ2l0aHViVXBsb2FkZXIoY3R4KVxyXG4gICAgICBxaW5pdVVwbG9hZGVyKGN0eClcclxuICAgICAgaW1ndXJVcGxvYWRlcihjdHgpXHJcbiAgICAgIHVwWXVuVXBsb2FkZXIoY3R4KVxyXG4gICAgICB3ZWJkYXZwbGlzdFVwbG9hZGVyKGN0eClcclxuICAgICAgbG9jYWxVcGxvYWRlcihjdHgpXHJcbiAgICAgIHNmdHBVcGxvYWRlcihjdHgpXHJcbiAgICAgIHRlbGVncmFwaFVwbG9hZGVyKGN0eClcclxuICAgICAgcGljbGlzdFVwbG9hZGVyKGN0eClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGJ1aWxkSW5VcGxvYWRlcnNcclxuIiwiaW1wb3J0IHtcclxuICBpc1VybCxcclxuICBnZXRJbWFnZVNpemUsXHJcbiAgZ2V0RlNGaWxlLFxyXG4gIGdldFVSTEZpbGVcclxufSBmcm9tICcuLi8uLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvLCB0eXBlIElJbWdJbmZvLCB0eXBlIElJbWdTaXplIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcydcclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgcmVzdWx0czogSUltZ0luZm9bXSA9IGN0eC5vdXRwdXRcclxuICBhd2FpdCBQcm9taXNlLmFsbChjdHguaW5wdXQubWFwKGFzeW5jIChpdGVtOiBzdHJpbmcgfCBCdWZmZXIsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgIGxldCBpbmZvOiBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mb1xyXG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpdGVtKSkge1xyXG4gICAgICBpbmZvID0ge1xyXG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgYnVmZmVyOiBpdGVtLFxyXG4gICAgICAgIGZpbGVOYW1lOiAnJyxcclxuICAgICAgICBleHRuYW1lOiAnJ1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGlzVXJsKGl0ZW0pKSB7XHJcbiAgICAgIGluZm8gPSBhd2FpdCBnZXRVUkxGaWxlKGl0ZW0sIGN0eClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGluZm8gPSBhd2FpdCBnZXRGU0ZpbGUoaXRlbSlcclxuICAgIH1cclxuICAgIGlmIChpbmZvLnN1Y2Nlc3MgJiYgaW5mby5idWZmZXIpIHtcclxuICAgICAgY29uc3QgaW1nU2l6ZSA9IGdldEltZ1NpemUoY3R4LCBpbmZvLmJ1ZmZlciwgaXRlbSlcclxuICAgICAgY29uc3QgZXh0bmFtZSA9IGluZm8uZXh0bmFtZSB8fCBpbWdTaXplLmV4dG5hbWUgfHwgJy5wbmcnXHJcbiAgICAgIHJlc3VsdHNbaW5kZXhdID0ge1xyXG4gICAgICAgIGJ1ZmZlcjogaW5mby5idWZmZXIsXHJcbiAgICAgICAgZmlsZU5hbWU6IGluZm8uZmlsZU5hbWUgfHwgYCR7ZGF5anMoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJyl9JHtleHRuYW1lfX1gLFxyXG4gICAgICAgIHdpZHRoOiBpbWdTaXplLndpZHRoLFxyXG4gICAgICAgIGhlaWdodDogaW1nU2l6ZS5oZWlnaHQsXHJcbiAgICAgICAgZXh0bmFtZTogaW5mby5leHRuYW1lXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGN0eC5sb2cuZXJyb3IoaW5mby5yZWFzb24pXHJcbiAgICB9XHJcbiAgfSkpXHJcbiAgLy8gcmVtb3ZlIGVtcHR5IGl0ZW1cclxuICBjdHgub3V0cHV0ID0gcmVzdWx0cy5maWx0ZXIoaXRlbSA9PiBpdGVtKVxyXG4gIHJldHVybiBjdHhcclxufVxyXG5cclxuY29uc3QgZ2V0SW1nU2l6ZSA9IChjdHg6IElQaWNHbywgZmlsZTogQnVmZmVyLCBwYXRoOiBzdHJpbmcgfCBCdWZmZXIpOiBJSW1nU2l6ZSA9PiB7XHJcbiAgY29uc3QgaW1hZ2VTaXplID0gZ2V0SW1hZ2VTaXplKGZpbGUpXHJcbiAgaWYgKCFpbWFnZVNpemUucmVhbCkge1xyXG4gICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjdHgubG9nLndhcm4oYGNhbid0IGdldCAke3BhdGh9J3MgaW1hZ2Ugc2l6ZWApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjdHgubG9nLndhcm4oJ2NhblxcJ3QgZ2V0IGltYWdlIHNpemUnKVxyXG4gICAgfVxyXG4gICAgY3R4LmxvZy53YXJuKCdmYWxsYmFjayB0byAyMDAgKiAyMDAnKVxyXG4gIH1cclxuICByZXR1cm4gaW1hZ2VTaXplXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBoYW5kbGVcclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQaWNHbyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGN0eC5vdXRwdXQucHVzaCguLi5jdHguaW5wdXQpXHJcbiAgcmV0dXJuIGN0eFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgaGFuZGxlXHJcbn1cclxuIiwiaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBpY0dvUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBJbWdGcm9tUGF0aCBmcm9tICcuL3BhdGgnXHJcbmltcG9ydCBJbWdGcm9tQmFzZTY0IGZyb20gJy4vYmFzZTY0J1xyXG5cclxuY29uc3QgYnVpbGRJblRyYW5zZm9ybWVyczogSVBpY0dvUGx1Z2luID0gKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICByZWdpc3RlciAoY3R4OiBJUGljR28pIHtcclxuICAgICAgY3R4LmhlbHBlci50cmFuc2Zvcm1lci5yZWdpc3RlcigncGF0aCcsIEltZ0Zyb21QYXRoKVxyXG4gICAgICBjdHguaGVscGVyLnRyYW5zZm9ybWVyLnJlZ2lzdGVyKCdiYXNlNjQnLCBJbWdGcm9tQmFzZTY0KVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgYnVpbGRJblRyYW5zZm9ybWVyc1xyXG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCByZXNvbHZlIGZyb20gJ3Jlc29sdmUnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGljR29QbHVnaW4sIHR5cGUgSVBsdWdpbkxvYWRlciwgdHlwZSBJUGljR29QbHVnaW5JbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcy9pbmRleCdcclxuaW1wb3J0IHsgc2V0Q3VycmVudFBsdWdpbk5hbWUgfSBmcm9tICcuL0xpZmVjeWNsZVBsdWdpbnMnXHJcblxyXG4vKipcclxuICogTG9jYWwgcGx1Z2luIGxvYWRlciwgZmlsZSBzeXN0ZW0gaXMgcmVxdWlyZWRcclxuICovXHJcbmV4cG9ydCBjbGFzcyBQbHVnaW5Mb2FkZXIgaW1wbGVtZW50cyBJUGx1Z2luTG9hZGVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcbiAgcHJpdmF0ZSBsaXN0OiBzdHJpbmdbXSA9IFtdXHJcbiAgcHJpdmF0ZSByZWFkb25seSBmdWxsTGlzdCA9IG5ldyBTZXQ8c3RyaW5nPigpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5NYXAgPSBuZXcgTWFwPHN0cmluZywgSVBpY0dvUGx1Z2luSW50ZXJmYWNlPigpXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gICAgdGhpcy5pbml0KClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdCAoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAncGFja2FnZS5qc29uJylcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlUGF0aCkpIHtcclxuICAgICAgY29uc3QgcGtnID0ge1xyXG4gICAgICAgIG5hbWU6ICdwaWNnby1wbHVnaW5zJyxcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ3BpY2dvLXBsdWdpbnMnLFxyXG4gICAgICAgIHJlcG9zaXRvcnk6ICdodHRwczovL2dpdGh1Yi5jb20vUGljR28vUGljR28tQ29yZScsXHJcbiAgICAgICAgbGljZW5zZTogJ01JVCdcclxuICAgICAgfVxyXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VQYXRoLCBKU09OLnN0cmluZ2lmeShwa2cpLCAndXRmOCcpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgcGx1Z2luIGVudHJ5XHJcbiAgcHJpdmF0ZSByZXNvbHZlUGx1Z2luIChjdHg6IElQaWNHbywgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiByZXNvbHZlLnN5bmMobmFtZSwgeyBiYXNlZGlyOiBjdHguYmFzZURpciB9KVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHJldHVybiBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICdub2RlX21vZHVsZXMnLCBuYW1lKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gbG9hZCBhbGwgdGhpcmQgcGFydHkgcGx1Z2luXHJcbiAgbG9hZCAoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAncGFja2FnZS5qc29uJylcclxuICAgIGNvbnN0IHBsdWdpbkRpciA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAnbm9kZV9tb2R1bGVzLycpXHJcbiAgICAvLyBUaGFua3MgdG8gaGV4byAtPiBodHRwczovL2dpdGh1Yi5jb20vaGV4b2pzL2hleG8vYmxvYi9tYXN0ZXIvbGliL2hleG8vbG9hZF9wbHVnaW5zLmpzXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGx1Z2luRGlyKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIGNvbnN0IGpzb24gPSBmcy5yZWFkSlNPTlN5bmMocGFja2FnZVBhdGgpXHJcbiAgICBjb25zdCBkZXBzID0gT2JqZWN0LmtleXMoanNvbi5kZXBlbmRlbmNpZXMgfHwge30pXHJcbiAgICBjb25zdCBkZXZEZXBzID0gT2JqZWN0LmtleXMoanNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge30pXHJcbiAgICBjb25zdCBtb2R1bGVzID0gZGVwcy5jb25jYXQoZGV2RGVwcykuZmlsdGVyKChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKCEvXnBpY2dvLXBsdWdpbi18XkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLnRlc3QobmFtZSkpIHJldHVybiBmYWxzZVxyXG4gICAgICBjb25zdCBwYXRoID0gdGhpcy5yZXNvbHZlUGx1Z2luKHRoaXMuY3R4LCBuYW1lKVxyXG4gICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoKVxyXG4gICAgfSlcclxuICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcclxuICAgICAgdGhpcy5yZWdpc3RlclBsdWdpbihtb2R1bGUpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJQbHVnaW4gKG5hbWU6IHN0cmluZywgcGx1Z2luPzogSVBpY0dvUGx1Z2luKTogdm9pZCB7XHJcbiAgICBpZiAoIW5hbWUgfHwgdHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMuY3R4LmxvZy53YXJuKCdQbGVhc2UgcHJvdmlkZSB2YWxpZCBwbHVnaW4nKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuZnVsbExpc3QuYWRkKG5hbWUpXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyByZWdpc3RlciBsb2NhbCBwbHVnaW5cclxuICAgICAgaWYgKCFwbHVnaW4pIHtcclxuICAgICAgICBpZiAodGhpcy5jdHguZ2V0Q29uZmlnKGBwaWNnb1BsdWdpbnMuJHtuYW1lfWApID09PSB0cnVlIHx8ICh0aGlzLmN0eC5nZXRDb25maWcoYHBpY2dvUGx1Z2lucy4ke25hbWV9YCkgPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgIHRoaXMubGlzdC5wdXNoKG5hbWUpXHJcbiAgICAgICAgICBzZXRDdXJyZW50UGx1Z2luTmFtZShuYW1lKVxyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICAgIHRoaXMuZ2V0UGx1Z2luKG5hbWUpIS5yZWdpc3Rlcih0aGlzLmN0eClcclxuICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IGBwaWNnb1BsdWdpbnNbJHtuYW1lfV1gXHJcbiAgICAgICAgICB0aGlzLmN0eC5zYXZlQ29uZmlnKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgW3BsdWdpbl06IHRydWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyByZWdpc3RlciBwcm92aWRlZCBwbHVnaW5cclxuICAgICAgICAvLyAmJiB3b24ndCB3cml0ZSBjb25maWcgdG8gZmlsZXNcclxuICAgICAgICB0aGlzLmxpc3QucHVzaChuYW1lKVxyXG4gICAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKG5hbWUpXHJcbiAgICAgICAgY29uc3QgcGx1Z2luSW50ZXJmYWNlID0gcGx1Z2luKHRoaXMuY3R4KVxyXG4gICAgICAgIHRoaXMucGx1Z2luTWFwLnNldChuYW1lLCBwbHVnaW5JbnRlcmZhY2UpXHJcbiAgICAgICAgcGx1Z2luSW50ZXJmYWNlLnJlZ2lzdGVyKHRoaXMuY3R4KVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMucGx1Z2luTWFwLmRlbGV0ZShuYW1lKVxyXG4gICAgICB0aGlzLmxpc3QgPSB0aGlzLmxpc3QuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09IG5hbWUpXHJcbiAgICAgIHRoaXMuZnVsbExpc3QuZGVsZXRlKG5hbWUpXHJcbiAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlIGFzIEVycm9yKVxyXG4gICAgICB0aGlzLmN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgdGl0bGU6IGBQbHVnaW4gJHtuYW1lfSBMb2FkIEVycm9yYCxcclxuICAgICAgICBib2R5OiBlXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1bnJlZ2lzdGVyUGx1Z2luIChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubGlzdCA9IHRoaXMubGlzdC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gbmFtZSlcclxuICAgIHRoaXMuZnVsbExpc3QuZGVsZXRlKG5hbWUpXHJcbiAgICB0aGlzLnBsdWdpbk1hcC5kZWxldGUobmFtZSlcclxuICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5oZWxwZXIudXBsb2FkZXIudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLnRyYW5zZm9ybWVyLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci5iZWZvcmVUcmFuc2Zvcm1QbHVnaW5zLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci5iZWZvcmVVcGxvYWRQbHVnaW5zLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci5hZnRlclVwbG9hZFBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguY21kLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LnJlbW92ZUNvbmZpZygncGljZ29QbHVnaW5zJywgbmFtZSlcclxuICB9XHJcblxyXG4gIC8vIGdldCBwbHVnaW4gYnkgbmFtZVxyXG4gIGdldFBsdWdpbiAobmFtZTogc3RyaW5nKTogSVBpY0dvUGx1Z2luSW50ZXJmYWNlIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICh0aGlzLnBsdWdpbk1hcC5oYXMobmFtZSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGx1Z2luTWFwLmdldChuYW1lKVxyXG4gICAgfVxyXG4gICAgY29uc3QgcGx1Z2luRGlyID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdub2RlX21vZHVsZXMvJylcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXHJcbiAgICBjb25zdCBwbHVnaW4gPSByZXF1aXJlKHBsdWdpbkRpciArIG5hbWUpKHRoaXMuY3R4KVxyXG4gICAgdGhpcy5wbHVnaW5NYXAuc2V0KG5hbWUsIHBsdWdpbilcclxuICAgIHJldHVybiBwbHVnaW5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgbGlzdCBvZiBlbmFibGVkIHBsdWdpbnNcclxuICAgKi9cclxuICBnZXRMaXN0ICgpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5saXN0XHJcbiAgfVxyXG5cclxuICBoYXNQbHVnaW4gKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZnVsbExpc3QuaGFzKG5hbWUpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGZ1bGwgbGlzdCBvZiBwbHVnaW5zLCB3aGV0aGVyIGl0IGlzIGVuYWJsZWQgb3Igbm90XHJcbiAgICovXHJcbiAgZ2V0RnVsbExpc3QgKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5mdWxsTGlzdF1cclxuICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgUGx1Z2luTG9hZGVyXHJcbiIsImV4cG9ydCBjb25zdCBDTElQQk9BUkRfSU1BR0VfRk9MREVSID0gJ3BpY2xpc3QtY2xpcGJvYXJkLWltYWdlcydcclxuIiwiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJ1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcbmltcG9ydCBvcyBmcm9tICdvcydcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgaXNXc2wgZnJvbSAnaXMtd3NsJ1xyXG5pbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJQ2xpcGJvYXJkSW1hZ2UgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4vZW51bSdcclxuaW1wb3J0IG1hY0NsaXBib2FyZFNjcmlwdCBmcm9tICcuL2NsaXBib2FyZC9tYWMuYXBwbGVzY3JpcHQnXHJcbmltcG9ydCB3aW5kb3dzQ2xpcGJvYXJkU2NyaXB0IGZyb20gJy4vY2xpcGJvYXJkL3dpbmRvd3MucHMxJ1xyXG5pbXBvcnQgd2luZG93czEwQ2xpcGJvYXJkU2NyaXB0IGZyb20gJy4vY2xpcGJvYXJkL3dpbmRvd3MxMC5wczEnXHJcbmltcG9ydCBsaW51eENsaXBib2FyZFNjcmlwdCBmcm9tICcuL2NsaXBib2FyZC9saW51eC5zaCdcclxuaW1wb3J0IHdzbENsaXBib2FyZFNjcmlwdCBmcm9tICcuL2NsaXBib2FyZC93c2wuc2gnXHJcbmltcG9ydCB7IENMSVBCT0FSRF9JTUFHRV9GT0xERVIgfSBmcm9tICcuL3N0YXRpYydcclxuXHJcbmV4cG9ydCB0eXBlIFBsYXRmb3JtID0gJ2RhcndpbicgfCAnd2luMzInIHwgJ3dpbjEwJyB8ICdsaW51eCcgfCAnd3NsJ1xyXG5cclxuY29uc3QgZ2V0Q3VycmVudFBsYXRmb3JtID0gKCk6IFBsYXRmb3JtID0+IHtcclxuICBjb25zdCBwbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm1cclxuICBpZiAoaXNXc2wpIHtcclxuICAgIHJldHVybiAnd3NsJ1xyXG4gIH1cclxuICBpZiAocGxhdGZvcm0gPT09ICd3aW4zMicpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRPUyA9IG9zLnJlbGVhc2UoKS5zcGxpdCgnLicpWzBdXHJcbiAgICBpZiAoY3VycmVudE9TID09PSAnMTAnKSB7XHJcbiAgICAgIHJldHVybiAnd2luMTAnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJ3dpbjMyJ1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAocGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XHJcbiAgICByZXR1cm4gJ2RhcndpbidcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuICdsaW51eCdcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHBsYXRmb3JtMlNjcmlwdENvbnRlbnQ6IHtcclxuICBba2V5IGluIFBsYXRmb3JtXTogc3RyaW5nXHJcbn0gPSB7XHJcbiAgZGFyd2luOiBtYWNDbGlwYm9hcmRTY3JpcHQsXHJcbiAgd2luMzI6IHdpbmRvd3NDbGlwYm9hcmRTY3JpcHQsXHJcbiAgd2luMTA6IHdpbmRvd3MxMENsaXBib2FyZFNjcmlwdCxcclxuICBsaW51eDogbGludXhDbGlwYm9hcmRTY3JpcHQsXHJcbiAgd3NsOiB3c2xDbGlwYm9hcmRTY3JpcHRcclxufVxyXG4vKipcclxuICogcG93ZXJzaGVsbCB3aWxsIHJlcG9ydCBlcnJvciBpZiBmaWxlIGRvZXMgbm90IGhhdmUgYSAnLnBzMScgZXh0ZW5zaW9uLFxyXG4gKiBzbyB3ZSBzaG91bGQga2VlcCB0aGUgZXh0ZW5zaW9uIG5hbWUgY29uc2lzdGVudCB3aXRoIGNvcnJlc3BvbmRpbmcgc2hlbGxcclxuICovXHJcbmNvbnN0IHBsYXRmb3JtMlNjcmlwdEZpbGVuYW1lOiB7XHJcbiAgW2tleSBpbiBQbGF0Zm9ybV06IHN0cmluZ1xyXG59ID0ge1xyXG4gIGRhcndpbjogJ21hYy5hcHBsZXNjcmlwdCcsXHJcbiAgd2luMzI6ICd3aW5kb3dzLnBzMScsXHJcbiAgd2luMTA6ICd3aW5kb3dzMTAucHMxJyxcclxuICBsaW51eDogJ2xpbnV4LnNoJyxcclxuICB3c2w6ICd3c2wuc2gnXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUltYWdlRm9sZGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGNvbnN0IGltYWdlUGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUilcclxuICBpZiAoIWZzLmV4aXN0c1N5bmMoaW1hZ2VQYXRoKSkge1xyXG4gICAgZnMubWtkaXJTeW5jKGltYWdlUGF0aClcclxuICB9XHJcbn1cclxuXHJcbi8vIFRoYW5rcyB0byB2cy1waWNnbzogaHR0cHM6Ly9naXRodWIuY29tL1NwYWRlcy1TL3ZzLXBpY2dvL2Jsb2IvbWFzdGVyL3NyYy9leHRlbnNpb24udHNcclxuY29uc3QgZ2V0Q2xpcGJvYXJkSW1hZ2UgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElDbGlwYm9hcmRJbWFnZT4gPT4ge1xyXG4gIGNyZWF0ZUltYWdlRm9sZGVyKGN0eClcclxuICAvLyBhZGQgYW4gY2xpcGJvYXJkIGltYWdlIGZvbGRlciB0byBjb250cm9sIHRoZSBpbWFnZSBjYWNoZSBmaWxlXHJcbiAgY29uc3QgaW1hZ2VQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCBDTElQQk9BUkRfSU1BR0VfRk9MREVSLCBgJHtkYXlqcygpLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKX0ucG5nYClcclxuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8SUNsaXBib2FyZEltYWdlPigocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgcGxhdGZvcm0gPSBnZXRDdXJyZW50UGxhdGZvcm0oKVxyXG4gICAgY29uc3Qgc2NyaXB0UGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgcGxhdGZvcm0yU2NyaXB0RmlsZW5hbWVbcGxhdGZvcm1dKVxyXG4gICAgLy8gSWYgdGhlIHNjcmlwdCBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGNvbnRlbnQgdG8gdGhlIHNjcmlwdCBmaWxlXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHtcclxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcclxuICAgICAgICBzY3JpcHRQYXRoLFxyXG4gICAgICAgIHBsYXRmb3JtMlNjcmlwdENvbnRlbnRbcGxhdGZvcm1dLFxyXG4gICAgICAgICd1dGY4J1xyXG4gICAgICApXHJcbiAgICB9XHJcbiAgICBsZXQgZXhlY3V0aW9uXHJcbiAgICBpZiAocGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XHJcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKCdvc2FzY3JpcHQnLCBbc2NyaXB0UGF0aCwgaW1hZ2VQYXRoXSlcclxuICAgIH0gZWxzZSBpZiAocGxhdGZvcm0gPT09ICd3aW4zMicgfHwgcGxhdGZvcm0gPT09ICd3aW4xMCcpIHtcclxuICAgICAgZXhlY3V0aW9uID0gc3Bhd24oJ3Bvd2Vyc2hlbGwnLCBbXHJcbiAgICAgICAgJy1ub3Byb2ZpbGUnLFxyXG4gICAgICAgICctbm9uaW50ZXJhY3RpdmUnLFxyXG4gICAgICAgICctbm9sb2dvJyxcclxuICAgICAgICAnLXN0YScsXHJcbiAgICAgICAgJy1leGVjdXRpb25wb2xpY3knLCAndW5yZXN0cmljdGVkJyxcclxuICAgICAgICAvLyBmaXggd2luZG93cyAxMCBuYXRpdmUgY21kIGNyYXNoIGJ1ZyB3aGVuIFwicGljZ28gdXBsb2FkXCJcclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vUGljR28vUGljR28tQ29yZS9pc3N1ZXMvMzJcclxuICAgICAgICAvLyAnLXdpbmRvd3N0eWxlJywnaGlkZGVuJyxcclxuICAgICAgICAvLyAnLW5vZXhpdCcsXHJcbiAgICAgICAgJy1maWxlJywgc2NyaXB0UGF0aCxcclxuICAgICAgICBpbWFnZVBhdGhcclxuICAgICAgXSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKCdzaCcsIFtzY3JpcHRQYXRoLCBpbWFnZVBhdGhdKVxyXG4gICAgfVxyXG5cclxuICAgIGV4ZWN1dGlvbi5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XHJcbiAgICAgIGlmIChwbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xyXG4gICAgICAgIGlmIChkYXRhLnRvU3RyaW5nKCkudHJpbSgpID09PSAnbm8geGNsaXAgb3Igd2wtY2xpcGJvYXJkJykge1xyXG4gICAgICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICAgICAgdGl0bGU6ICd4Y2xpcCBvciB3bC1jbGlwYm9hcmQgbm90IGZvdW5kJyxcclxuICAgICAgICAgICAgYm9keTogJ1BsZWFzZSBpbnN0YWxsIHhjbGlwKGZvciB4MTEpIG9yIHdsLWNsaXBib2FyZChmb3Igd2F5bGFuZCkgYmVmb3JlIHJ1biBwaWNnbydcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignUGxlYXNlIGluc3RhbGwgeGNsaXAoZm9yIHgxMSkgb3Igd2wtY2xpcGJvYXJkKGZvciB3YXlsYW5kKSBiZWZvcmUgcnVuIHBpY2dvJykpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGltZ1BhdGggPSBkYXRhLnRvU3RyaW5nKCkudHJpbSgpXHJcblxyXG4gICAgICAvLyBpZiB0aGUgZmlsZVBhdGggaXMgdGhlIHJlYWwgZmlsZSBpbiBzeXN0ZW1cclxuICAgICAgLy8gd2Ugc2hvdWxkIGtlZXAgaXQgaW5zdGVhZCBvZiByZW1vdmluZ1xyXG4gICAgICBsZXQgc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nID0gZmFsc2VcclxuXHJcbiAgICAgIC8vIGluIG1hY09TIGlmIHlvdXIgY29weSB0aGUgZmlsZSBpbiBzeXN0ZW0sIGl0J3MgYmFzZW5hbWUgd2lsbCBub3QgZXF1YWwgdG8gb3VyIGRlZmF1bHQgYmFzZW5hbWVcclxuICAgICAgaWYgKHBhdGguYmFzZW5hbWUoaW1nUGF0aCkgIT09IHBhdGguYmFzZW5hbWUoaW1hZ2VQYXRoKSkge1xyXG4gICAgICAgIC8vIGlmIHRoZSBwYXRoIGlzIG5vdCBnZW5lcmF0ZSBieSBwaWNnb1xyXG4gICAgICAgIC8vIGJ1dCB0aGUgcGF0aCBleGlzdHMsIHdlIHNob3VsZCBrZWVwIGl0XHJcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoaW1nUGF0aCkpIHtcclxuICAgICAgICAgIHNob3VsZEtlZXBBZnRlclVwbG9hZGluZyA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gaWYgdGhlIGltZ1BhdGggaXMgaW52YWxpZFxyXG4gICAgICBpZiAoaW1nUGF0aCAhPT0gJ25vIGltYWdlJyAmJiAhZnMuZXhpc3RzU3luYyhpbWdQYXRoKSkge1xyXG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBDYW4ndCBmaW5kICR7aW1nUGF0aH1gKSlcclxuICAgICAgfVxyXG5cclxuICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgaW1nUGF0aCxcclxuICAgICAgICBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmdcclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfSlcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ2V0Q2xpcGJvYXJkSW1hZ2VcclxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xyXG5cclxuY29uc3QgZXZlbnRCdXMgPSBuZXcgRXZlbnRFbWl0dGVyKClcclxuZXhwb3J0IHtcclxuICBldmVudEJ1c1xyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJvbWlzZS1mdW5jdGlvbi1hc3luYyAqL1xyXG5pbXBvcnQgYXhpb3MsIHsgdHlwZSBBeGlvc1JlcXVlc3RDb25maWcsIHR5cGUgQXhpb3NSZXNwb25zZSB9IGZyb20gJ2F4aW9zJ1xyXG5pbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBVbmRlZmluYWJsZSwgdHlwZSBJQ29uZmlnQ2hhbmdlUGF5bG9hZCwgdHlwZSBJQ29uZmlnLCB0eXBlIElSZXF1ZXN0Q29uZmlnLCB0eXBlIElPbGRSZXFPcHRpb25zLCB0eXBlIElSZXNwb25zZSwgdHlwZSBJRnVsbFJlc3BvbnNlLCB0eXBlIElSZXF1ZXN0IH0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdXNFdmVudCB9IGZyb20gJy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IGV2ZW50QnVzIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnRCdXMnXHJcbmltcG9ydCB7IFVSTCB9IGZyb20gJ3VybCdcclxuaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSdcclxuaW1wb3J0IGh0dHBzIGZyb20gJ2h0dHBzJ1xyXG5pbXBvcnQgdHVubmVsIGZyb20gJ3R1bm5lbCdcclxuY29uc3QgaHR0cHNBZ2VudCA9IG5ldyBodHRwcy5BZ2VudCh7XHJcbiAgbWF4VmVyc2lvbjogJ1RMU3YxLjInLFxyXG4gIG1pblZlcnNpb246ICdUTFN2MS4yJ1xyXG59KVxyXG5cclxuLy8gdGhhbmtzIGZvciBodHRwczovL2dpdGh1Yi5kZXYvcmVxdWVzdC9yZXF1ZXN0L2Jsb2IvbWFzdGVyL2luZGV4LmpzXHJcbmZ1bmN0aW9uIGFwcGVuZEZvcm1EYXRhIChmb3JtOiBGb3JtRGF0YSwga2V5OiBzdHJpbmcsIGRhdGE6IGFueSk6IHZvaWQge1xyXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgJ3ZhbHVlJyBpbiBkYXRhICYmICdvcHRpb25zJyBpbiBkYXRhKSB7XHJcbiAgICBmb3JtLmFwcGVuZChrZXksIGRhdGEudmFsdWUsIGRhdGEub3B0aW9ucylcclxuICB9IGVsc2Uge1xyXG4gICAgZm9ybS5hcHBlbmQoa2V5LCBkYXRhKVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVxdWVzdEludGVyY2VwdG9yIChvcHRpb25zOiBJT2xkUmVxT3B0aW9ucyB8IEF4aW9zUmVxdWVzdENvbmZpZyk6IEF4aW9zUmVxdWVzdENvbmZpZyAmIHtcclxuICBfX2lzT2xkT3B0aW9ucz86IGJvb2xlYW5cclxufSB7XHJcbiAgbGV0IF9faXNPbGRPcHRpb25zID0gZmFsc2VcclxuICBjb25zdCBvcHQ6IEF4aW9zUmVxdWVzdENvbmZpZzxhbnk+ICYge1xyXG4gICAgX19pc09sZE9wdGlvbnM/OiBib29sZWFuXHJcbiAgfSA9IHtcclxuICAgIC4uLm9wdGlvbnMsXHJcbiAgICB1cmw6IChvcHRpb25zLnVybCBhcyBzdHJpbmcpIHx8ICcnLFxyXG4gICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIHx8IHt9XHJcbiAgfVxyXG4gIC8vIHVzZXIgcmVxdWVzdCBjb25maWcgcHJveHlcclxuICBpZiAob3B0aW9ucy5wcm94eSkge1xyXG4gICAgbGV0IHByb3h5T3B0aW9ucyA9IG9wdGlvbnMucHJveHlcclxuICAgIGlmICh0eXBlb2YgcHJveHlPcHRpb25zID09PSAnc3RyaW5nJykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHByb3h5T3B0aW9ucyA9IG5ldyBVUkwob3B0aW9ucy5wcm94eSlcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHByb3h5T3B0aW9ucyA9IGZhbHNlXHJcbiAgICAgICAgb3B0LnByb3h5ID0gZmFsc2VcclxuICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgIH1cclxuICAgICAgX19pc09sZE9wdGlvbnMgPSB0cnVlXHJcbiAgICB9XHJcbiAgICBpZiAocHJveHlPcHRpb25zKSB7XHJcbiAgICAgIGlmIChvcHRpb25zLnVybD8uc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xyXG4gICAgICAgIG9wdC5wcm94eSA9IGZhbHNlXHJcbiAgICAgICAgb3B0Lmh0dHBzQWdlbnQgPSB0dW5uZWwuaHR0cHNPdmVySHR0cCh7XHJcbiAgICAgICAgICBwcm94eToge1xyXG4gICAgICAgICAgICBob3N0OiBwcm94eU9wdGlvbnM/Lmhvc3RuYW1lLFxyXG4gICAgICAgICAgICBwb3J0OiBwYXJzZUludChwcm94eU9wdGlvbnM/LnBvcnQsIDEwKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgb3B0LnByb3h5ID0ge1xyXG4gICAgICAgICAgaG9zdDogcHJveHlPcHRpb25zLmhvc3RuYW1lLFxyXG4gICAgICAgICAgcG9ydDogcGFyc2VJbnQocHJveHlPcHRpb25zLnBvcnQsIDEwKSxcclxuICAgICAgICAgIHByb3RvY29sOiAnaHR0cCdcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgaWYgKCdmb3JtRGF0YScgaW4gb3B0aW9ucykge1xyXG4gICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zLmZvcm1EYXRhKSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBvcHRpb25zLmZvcm1EYXRhW2tleV1cclxuICAgICAgYXBwZW5kRm9ybURhdGEoZm9ybSwga2V5LCBkYXRhKVxyXG4gICAgfVxyXG4gICAgb3B0LmRhdGEgPSBmb3JtXHJcbiAgICBvcHQuaGVhZGVycyA9IE9iamVjdC5hc3NpZ24ob3B0LmhlYWRlcnMgfHwge30sIGZvcm0uZ2V0SGVhZGVycygpKVxyXG4gICAgX19pc09sZE9wdGlvbnMgPSB0cnVlXHJcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoaXMgaXMgb2xkIG9wdGlvblxyXG4gICAgZGVsZXRlIG9wdC5mb3JtRGF0YVxyXG4gIH1cclxuICBpZiAoJ2JvZHknIGluIG9wdGlvbnMpIHtcclxuICAgIG9wdC5kYXRhID0gb3B0aW9ucy5ib2R5XHJcbiAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhpcyBpcyBvbGQgb3B0aW9uc1xyXG4gICAgZGVsZXRlIG9wdC5ib2R5XHJcbiAgfVxyXG4gIGlmICgncXMnIGluIG9wdGlvbnMpIHtcclxuICAgIG9wdC5wYXJhbXMgPSBvcHRpb25zLnFzXHJcbiAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcclxuICB9XHJcbiAgb3B0Ll9faXNPbGRPcHRpb25zID0gX19pc09sZE9wdGlvbnNcclxuICByZXR1cm4gb3B0XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc3BvbnNlSW50ZXJjZXB0b3IgKHJlc3BvbnNlOiBBeGlvc1Jlc3BvbnNlKTogSUZ1bGxSZXNwb25zZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIC4uLnJlc3BvbnNlLFxyXG4gICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgYm9keTogcmVzcG9uc2UuZGF0YVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVzcG9uc2VFcnJvckhhbmRsZXIgKGVycm9yOiBhbnkpIHtcclxuICAvLyBpZiAoZXJyb3IucmVzcG9uc2UpIHtcclxuICAvLyAgIC8vIFRoZSByZXF1ZXN0IHdhcyBtYWRlIGFuZCB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEgc3RhdHVzIGNvZGVcclxuICAvLyAgIC8vIHRoYXQgZmFsbHMgb3V0IG9mIHRoZSByYW5nZSBvZiAyeHhcclxuICAvLyAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvKVxyXG4gIC8vIH0gZWxzZSBpZiAoZXJyb3IucmVxdWVzdCkge1xyXG4gIC8vICAgLy8gVGhlIHJlcXVlc3Qgd2FzIG1hZGUgYnV0IG5vIHJlc3BvbnNlIHdhcyByZWNlaXZlZFxyXG4gIC8vICAgLy8gYGVycm9yLnJlcXVlc3RgIGlzIGFuIGluc3RhbmNlIG9mIFhNTEh0dHBSZXF1ZXN0IGluIHRoZSBicm93c2VyIGFuZCBhbiBpbnN0YW5jZSBvZlxyXG4gIC8vICAgLy8gaHR0cC5DbGllbnRSZXF1ZXN0IGluIG5vZGUuanNcclxuICAvLyAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5yZXF1ZXN0KVxyXG4gIC8vIH0gZWxzZSB7XHJcbiAgLy8gICAvLyBTb21ldGhpbmcgaGFwcGVuZWQgaW4gc2V0dGluZyB1cCB0aGUgcmVxdWVzdCB0aGF0IHRyaWdnZXJlZCBhbiBFcnJvclxyXG4gIC8vICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yLm1lc3NhZ2UpXHJcbiAgLy8gfVxyXG4gIGNvbnN0IGVycm9yT2JqID0ge1xyXG4gICAgbWV0aG9kOiBlcnJvcj8uY29uZmlnPy5tZXRob2Q/LnRvVXBwZXJDYXNlKCkgfHwgJycsXHJcbiAgICB1cmw6IGVycm9yPy5jb25maWc/LnVybCB8fCAnJyxcclxuICAgIHN0YXR1c0NvZGU6IGVycm9yPy5yZXNwb25zZT8uc3RhdHVzIHx8IDAsXHJcbiAgICBtZXNzYWdlOiBlcnJvcj8ubWVzc2FnZSB8fCAnJyxcclxuICAgIHN0YWNrOiBlcnJvcj8uc3RhY2sgfHwge30sXHJcbiAgICByZXNwb25zZToge1xyXG4gICAgICBzdGF0dXM6IGVycm9yPy5yZXNwb25zZT8uc3RhdHVzIHx8IDAsXHJcbiAgICAgIHN0YXR1c0NvZGU6IGVycm9yPy5yZXNwb25zZT8uc3RhdHVzIHx8IDAsXHJcbiAgICAgIGJvZHk6IGVycm9yPy5yZXNwb25zZT8uZGF0YSB8fCAnJ1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3JPYmopXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSZXF1ZXN0IGltcGxlbWVudHMgSVJlcXVlc3Qge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBwcml2YXRlIHByb3h5OiBVbmRlZmluYWJsZTxzdHJpbmc+ID0gJydcclxuICBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWc8YW55PiA9IHt9XHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gICAgdGhpcy5pbml0KClcclxuICAgIGV2ZW50QnVzLm9uKElCdXNFdmVudC5DT05GSUdfQ0hBTkdFLCAoZGF0YTogSUNvbmZpZ0NoYW5nZVBheWxvYWQ8c3RyaW5nIHwgSUNvbmZpZ1sncGljQmVkJ10+KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoZGF0YS5jb25maWdOYW1lKSB7XHJcbiAgICAgICAgY2FzZSAncGljQmVkJzpcclxuICAgICAgICAgIGlmICgoZGF0YS52YWx1ZSBhcyBJQ29uZmlnWydwaWNCZWQnXSk/LnByb3h5KSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJveHkgPSAoZGF0YS52YWx1ZSBhcyBJQ29uZmlnWydwaWNCZWQnXSkucHJveHlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAncGljQmVkLnByb3h5JzpcclxuICAgICAgICAgIHRoaXMucHJveHkgPSBkYXRhLnZhbHVlIGFzIHN0cmluZ1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdCAoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwcm94eSA9IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnByb3h5JylcclxuICAgIGlmIChwcm94eSkge1xyXG4gICAgICB0aGlzLnByb3h5ID0gcHJveHlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlUHJveHkgKCk6IEF4aW9zUmVxdWVzdENvbmZpZ1sncHJveHknXSB8IGZhbHNlIHtcclxuICAgIGlmICh0aGlzLnByb3h5KSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcHJveHlPcHRpb25zID0gbmV3IFVSTCh0aGlzLnByb3h5KVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBob3N0OiBwcm94eU9wdGlvbnMuaG9zdG5hbWUsXHJcbiAgICAgICAgICBwb3J0OiBwYXJzZUludChwcm94eU9wdGlvbnMucG9ydCB8fCAnMCcsIDEwKSxcclxuICAgICAgICAgIHByb3RvY29sOiBwcm94eU9wdGlvbnMucHJvdG9jb2xcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICAvLyAjNjQgZHluYW1pYyBnZXQgcHJveHkgdmFsdWVcclxuICByZXF1ZXN0PFQsIFUgZXh0ZW5kcyAoXHJcbiAgICBJUmVxdWVzdENvbmZpZzxVPiBleHRlbmRzIElPbGRSZXFPcHRpb25zID8gSU9sZFJlcU9wdGlvbnMgOiBJUmVxdWVzdENvbmZpZzxVPiBleHRlbmRzIEF4aW9zUmVxdWVzdENvbmZpZyA/IEF4aW9zUmVxdWVzdENvbmZpZyA6IG5ldmVyXHJcbiAgKT4gKG9wdGlvbnM6IFUpOiBQcm9taXNlPElSZXNwb25zZTxULCBVPj4ge1xyXG4gICAgdGhpcy5vcHRpb25zLnByb3h5ID0gdGhpcy5oYW5kbGVQcm94eSgpXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLm1heEJvZHlMZW5ndGggPSBJbmZpbml0eVxyXG4gICAgdGhpcy5vcHRpb25zLm1heENvbnRlbnRMZW5ndGggPSBJbmZpbml0eVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcm94eSAmJiBvcHRpb25zLnVybD8uc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaHR0cHNBZ2VudCA9IHR1bm5lbC5odHRwc092ZXJIdHRwKHtcclxuICAgICAgICBwcm94eToge1xyXG4gICAgICAgICAgaG9zdDogdGhpcy5vcHRpb25zLnByb3h5Lmhvc3QsXHJcbiAgICAgICAgICBwb3J0OiB0aGlzLm9wdGlvbnMucHJveHkucG9ydFxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5vcHRpb25zLnByb3h5ID0gZmFsc2VcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5odHRwc0FnZW50ID0gaHR0cHNBZ2VudFxyXG4gICAgfVxyXG4gICAgLy8gIU5PVElDRSB0aGlzLm9wdGlvbnMgIT09IG9wdGlvbnNcclxuICAgIC8vIHRoaXMub3B0aW9ucyBpcyB0aGUgZGVmYXVsdCBvcHRpb25zXHJcbiAgICBjb25zdCBpbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSh0aGlzLm9wdGlvbnMpXHJcbiAgICBpbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKHJlc3BvbnNlSW50ZXJjZXB0b3IsIHJlc3BvbnNlRXJyb3JIYW5kbGVyKVxyXG5cclxuICAgIC8vIGNvbXBhdGlibGUgd2l0aCBvbGQgcmVxdWVzdCBvcHRpb25zIHRvIG5ldyBvcHRpb25zXHJcbiAgICBjb25zdCBvcHQgPSByZXF1ZXN0SW50ZXJjZXB0b3Iob3B0aW9ucylcclxuXHJcbiAgICBpbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoZnVuY3Rpb24gKG9iaikge1xyXG4gICAgICAvLyBoYW5kbGUgQ29udGVudC1UeXBlXHJcbiAgICAgIGxldCBjb250ZW50VHlwZSA9ICcnXHJcbiAgICAgIGlmIChvYmo/LmhlYWRlcnM/LmNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgY29udGVudFR5cGUgPSBvYmouaGVhZGVycy5jb250ZW50VHlwZSBhcyBzdHJpbmdcclxuICAgICAgICBkZWxldGUgb2JqLmhlYWRlcnMuY29udGVudFR5cGVcclxuICAgICAgfSBlbHNlIGlmIChvYmo/LmhlYWRlcnM/LkNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgY29udGVudFR5cGUgPSBvYmouaGVhZGVycy5Db250ZW50VHlwZSBhcyBzdHJpbmdcclxuICAgICAgICBkZWxldGUgb2JqLmhlYWRlcnMuQ29udGVudFR5cGVcclxuICAgICAgfSBlbHNlIGlmIChvYmo/LmhlYWRlcnM/LlsnY29udGVudC10eXBlJ10pIHtcclxuICAgICAgICBjb250ZW50VHlwZSA9IG9iai5oZWFkZXJzWydjb250ZW50LXR5cGUnXSBhcyBzdHJpbmdcclxuICAgICAgICBkZWxldGUgb2JqLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddXHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbnRlbnRUeXBlICE9PSAnJyAmJiBvYmouaGVhZGVycykge1xyXG4gICAgICAgIG9iai5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGNvbnRlbnRUeXBlXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG9ialxyXG4gICAgfSlcclxuICAgIGlmICgncmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2UnIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5yZXNvbHZlV2l0aEZ1bGxSZXNwb25zZSkge1xyXG4gICAgICByZXR1cm4gaW5zdGFuY2UucmVxdWVzdChvcHQpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gaW5zdGFuY2UucmVxdWVzdChvcHQpLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAvLyB1c2Ugb2xkIHJlcXVlc3Qgb3B0aW9uIGZvcm1hdFxyXG4gICAgICAgIGlmIChvcHQuX19pc09sZE9wdGlvbnMpIHtcclxuICAgICAgICAgIGlmICgnanNvbicgaW4gb3B0aW9ucykge1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcy5kYXRhXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZXMuZGF0YSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHJlcy5kYXRhXHJcbiAgICAgICAgfVxyXG4gICAgICB9KSBhcyBQcm9taXNlPElSZXNwb25zZTxULCBVPj5cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlcXVlc3RcclxuIiwiaW1wb3J0IHsgdHlwZSBJQ29uZmlnLCB0eXBlIElQaWNHbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBKU09OU3RvcmUgfSBmcm9tICdAcGljZ28vc3RvcmUnXHJcbmltcG9ydCB7IHR5cGUgSUpTT04gfSBmcm9tICdAcGljZ28vc3RvcmUvZGlzdC90eXBlcydcclxuXHJcbmNsYXNzIERCIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYjogSlNPTlN0b3JlXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gICAgdGhpcy5kYiA9IG5ldyBKU09OU3RvcmUodGhpcy5jdHguY29uZmlnUGF0aClcclxuXHJcbiAgICBpZiAoIXRoaXMuZGIuaGFzKCdwaWNCZWQnKSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuZGIuc2V0KCdwaWNCZWQnLCB7XHJcbiAgICAgICAgICB1cGxvYWRlcjogJ3NtbXMnLFxyXG4gICAgICAgICAgY3VycmVudDogJ3NtbXMnXHJcbiAgICAgICAgfSlcclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGUpXHJcbiAgICAgICAgdGhyb3cgZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZGIuaGFzKCdwaWNnb1BsdWdpbnMnKSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuZGIuc2V0KCdwaWNnb1BsdWdpbnMnLCB7fSlcclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGUpXHJcbiAgICAgICAgdGhyb3cgZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWFkIChmbHVzaD86IGJvb2xlYW4pOiBJSlNPTiB7XHJcbiAgICByZXR1cm4gdGhpcy5kYi5yZWFkKGZsdXNoKVxyXG4gIH1cclxuXHJcbiAgZ2V0IChrZXk6IHN0cmluZyA9ICcnKTogYW55IHtcclxuICAgIHRoaXMucmVhZCh0cnVlKVxyXG4gICAgcmV0dXJuIHRoaXMuZGIuZ2V0KGtleSlcclxuICB9XHJcblxyXG4gIHNldCAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucmVhZCh0cnVlKVxyXG4gICAgdGhpcy5kYi5zZXQoa2V5LCB2YWx1ZSlcclxuICB9XHJcblxyXG4gIGhhcyAoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHRoaXMucmVhZCh0cnVlKVxyXG4gICAgcmV0dXJuIHRoaXMuZGIuaGFzKGtleSlcclxuICB9XHJcblxyXG4gIHVuc2V0IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5yZWFkKHRydWUpXHJcbiAgICByZXR1cm4gdGhpcy5kYi51bnNldChrZXksIHZhbHVlKVxyXG4gIH1cclxuXHJcbiAgc2F2ZUNvbmZpZyAoY29uZmlnOiBQYXJ0aWFsPElDb25maWc+KTogdm9pZCB7XHJcbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICB0aGlzLnNldChuYW1lLCBjb25maWdbbmFtZV0pXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ29uZmlnIChjb25maWc6IElDb25maWcpOiB2b2lkIHtcclxuICAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIHRoaXMudW5zZXQobmFtZSwgY29uZmlnW25hbWVdKVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERCXHJcblxyXG4vLyBjb25zdCBpbml0Q29uZmlnID0gKGNvbmZpZ1BhdGg6IHN0cmluZyk6IGxvd2RiLkxvd2RiU3luYzxhbnk+ID0+IHtcclxuLy8gfVxyXG5cclxuLy8gY29uc3Qgc2F2ZUNvbmZpZyA9IChjb25maWdQYXRoOiBzdHJpbmcsIGNvbmZpZzogYW55KTogdm9pZCA9PiB7XHJcbi8vICAgY29uc3QgZGIgPSBpbml0Q29uZmlnKGNvbmZpZ1BhdGgpXHJcbi8vICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcclxuLy8gICAgIGRiLnJlYWQoKS5zZXQobmFtZSwgY29uZmlnW25hbWVdKS53cml0ZSgpXHJcbi8vICAgfSlcclxuLy8gfVxyXG5cclxuLy8gZXhwb3J0IHtcclxuLy8gaW5pdENvbmZpZyxcclxuLy8gc2F2ZUNvbmZpZ1xyXG4vLyB9XHJcbiIsImltcG9ydCBzcGF3biBmcm9tICdjcm9zcy1zcGF3bidcclxuaW1wb3J0IHtcclxuICB0eXBlIElSZXN1bHQsXHJcbiAgdHlwZSBJUHJvY2Vzc0VudixcclxuICB0eXBlIElQbHVnaW5Qcm9jZXNzUmVzdWx0LFxyXG4gIHR5cGUgSVBsdWdpbkhhbmRsZXIsXHJcbiAgdHlwZSBJUGx1Z2luSGFuZGxlck9wdGlvbnMsXHJcbiAgdHlwZSBVbmRlZmluYWJsZSxcclxuICB0eXBlIElQaWNHbyxcclxuICB0eXBlIElQbHVnaW5IYW5kbGVyUmVzdWx0XHJcbn0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBnZXRQcm9jZXNzUGx1Z2luTmFtZSwgZ2V0Tm9ybWFsUGx1Z2luTmFtZSB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IHsgdHlwZSBJTG9jYWxlc0tleSB9IGZyb20gJy4uL2kxOG4vemgtQ04nXHJcblxyXG5leHBvcnQgY2xhc3MgUGx1Z2luSGFuZGxlciBpbXBsZW1lbnRzIElQbHVnaW5IYW5kbGVyIHtcclxuICAvLyBUaGFua3MgdG8gZmVmbG93IC0+IGh0dHBzOi8vZ2l0aHViLmNvbS9mZWZsb3cvZmVmbG93L2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9pbnN0YWxsL3BsdWdpbi5qc1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbnN0YWxsIChwbHVnaW5zOiBzdHJpbmdbXSwgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sIGVudj86IElQcm9jZXNzRW52KTogUHJvbWlzZTxJUGx1Z2luSGFuZGxlclJlc3VsdDxib29sZWFuPj4ge1xyXG4gICAgY29uc3QgaW5zdGFsbGVkUGx1Z2luczogc3RyaW5nW10gPSBbXVxyXG4gICAgY29uc3QgcHJvY2Vzc1BsdWdpbnMgPSBwbHVnaW5zXHJcbiAgICAgIC5tYXAoKGl0ZW06IHN0cmluZykgPT4gaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3ModGhpcy5jdHgsIGl0ZW0pKVxyXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgLy8gZGV0ZWN0IGlmIGhhcyBhbHJlYWR5IGluc3RhbGxlZFxyXG4gICAgICAgIC8vIG9yIHdpbGwgY2F1c2UgZXJyb3JcclxuICAgICAgICBpZiAodGhpcy5jdHgucGx1Z2luTG9hZGVyLmhhc1BsdWdpbihpdGVtLnBrZ05hbWUpKSB7XHJcbiAgICAgICAgICBpbnN0YWxsZWRQbHVnaW5zLnB1c2goaXRlbS5wa2dOYW1lKVxyXG4gICAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3MoYFBpY0dvIGhhcyBhbHJlYWR5IGluc3RhbGxlZCAke2l0ZW0ucGtnTmFtZX1gKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHNvbWV0aGluZyB3cm9uZywgZmlsdGVyIGl0IG91dFxyXG4gICAgICAgIGlmICghaXRlbS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfSlcclxuICAgIGNvbnN0IGZ1bGxOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0uZnVsbE5hbWUpXHJcbiAgICBjb25zdCBwa2dOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0ucGtnTmFtZSlcclxuICAgIGlmIChmdWxsTmFtZUxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBpbnN0YWxsIHBsdWdpbnMgbXVzdCB1c2UgZnVsbE5hbWVMaXN0OlxyXG4gICAgICAvLyAxLiBpbnN0YWxsIHJlbW90ZSBwYWNhZ2VcclxuICAgICAgLy8gMi4gaW5zdGFsbCBsb2NhbCBwYWNhZ2VcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZCgnaW5zdGFsbCcsIGZ1bGxOYW1lTGlzdCwgdGhpcy5jdHguYmFzZURpciwgb3B0aW9ucywgZW52KVxyXG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSB7XHJcbiAgICAgICAgcGtnTmFtZUxpc3QuZm9yRWFjaCgocGx1Z2luTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN0eC5wbHVnaW5Mb2FkZXIucmVnaXN0ZXJQbHVnaW4ocGx1Z2luTmFtZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUycpKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ2luc3RhbGxTdWNjZXNzJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUycpLFxyXG4gICAgICAgICAgYm9keTogWy4uLnBrZ05hbWVMaXN0LCAuLi5pbnN0YWxsZWRQbHVnaW5zXVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDx0cnVlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxyXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGFcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgnaW5zdGFsbEZhaWxlZCcsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChpbnN0YWxsZWRQbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEJylcclxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgdGhpcy5jdHguZW1pdCgnaW5zdGFsbEZhaWxlZCcsIHtcclxuICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfSlcclxuICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTJykpXHJcbiAgICAgIHRoaXMuY3R4LmVtaXQoJ2luc3RhbGxTdWNjZXNzJywge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1MnKSxcclxuICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgIH0pXHJcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdW5pbnN0YWxsIChwbHVnaW5zOiBzdHJpbmdbXSk6IFByb21pc2U8SVBsdWdpbkhhbmRsZXJSZXN1bHQ8Ym9vbGVhbj4+IHtcclxuICAgIGNvbnN0IHByb2Nlc3NQbHVnaW5zID0gcGx1Z2lucy5tYXAoKGl0ZW06IHN0cmluZykgPT4gaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3ModGhpcy5jdHgsIGl0ZW0pKS5maWx0ZXIoaXRlbSA9PiBpdGVtLnN1Y2Nlc3MpXHJcbiAgICBjb25zdCBwa2dOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0ucGtnTmFtZSlcclxuICAgIGlmIChwa2dOYW1lTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIHVuaW5zdGFsbCBwbHVnaW5zIG11c3QgdXNlIHBrZ05hbWVMaXN0OlxyXG4gICAgICAvLyBucG0gdW5pbnN0YWxsIHdpbGwgdXNlIHRoZSBwYWNrYWdlLmpzb24ncyBuYW1lXHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY0NvbW1hbmQoJ3VuaW5zdGFsbCcsIHBrZ05hbWVMaXN0LCB0aGlzLmN0eC5iYXNlRGlyKVxyXG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSB7XHJcbiAgICAgICAgcGtnTmFtZUxpc3QuZm9yRWFjaCgocGx1Z2luTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN0eC5wbHVnaW5Mb2FkZXIudW5yZWdpc3RlclBsdWdpbihwbHVnaW5OYW1lKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1MnKSlcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KCd1bmluc3RhbGxTdWNjZXNzJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTJyksXHJcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDx0cnVlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxyXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGFcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgndW5pbnN0YWxsRmFpbGVkJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQnKVxyXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICB0aGlzLmN0eC5lbWl0KCd1bmluc3RhbGxGYWlsZWQnLCB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfSlcclxuICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlIChwbHVnaW5zOiBzdHJpbmdbXSwgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sIGVudj86IElQcm9jZXNzRW52KTogUHJvbWlzZTxJUGx1Z2luSGFuZGxlclJlc3VsdDxib29sZWFuPj4ge1xyXG4gICAgY29uc3QgcHJvY2Vzc1BsdWdpbnMgPSBwbHVnaW5zLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBoYW5kbGVQbHVnaW5OYW1lUHJvY2Vzcyh0aGlzLmN0eCwgaXRlbSkpLmZpbHRlcihpdGVtID0+IGl0ZW0uc3VjY2VzcylcclxuICAgIGNvbnN0IHBrZ05hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKGl0ZW0gPT4gaXRlbS5wa2dOYW1lKVxyXG4gICAgaWYgKHBrZ05hbWVMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gdXBkYXRlIHBsdWdpbnMgbXVzdCB1c2UgcGtnTmFtZUxpc3Q6XHJcbiAgICAgIC8vIG5wbSB1cGRhdGUgd2lsbCB1c2UgdGhlIHBhY2thZ2UuanNvbidzIG5hbWVcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZCgndXBkYXRlJywgcGtnTmFtZUxpc3QsIHRoaXMuY3R4LmJhc2VEaXIsIG9wdGlvbnMsIGVudilcclxuICAgICAgaWYgKCFyZXN1bHQuY29kZSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTJykpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgndXBkYXRlU3VjY2VzcycsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUycpLFxyXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3RcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3RcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OJywge1xyXG4gICAgICAgICAgY29kZTogYCR7cmVzdWx0LmNvZGV9YCxcclxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ3VwZGF0ZUZhaWxlZCcsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEJyksXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEJylcclxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgdGhpcy5jdHguZW1pdCgndXBkYXRlRmFpbGVkJywge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEJyksXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH0pXHJcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIGJvZHk6IGVyclxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY0NvbW1hbmQgKGNtZDogc3RyaW5nLCBtb2R1bGVzOiBzdHJpbmdbXSwgd2hlcmU6IHN0cmluZywgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sIGVudjogSVByb2Nlc3NFbnYgPSB7fSk6IFByb21pc2U8SVJlc3VsdD4ge1xyXG4gICAgLy8gb3B0aW9ucyBmaXJzdFxyXG4gICAgY29uc3QgcmVnaXN0cnkgPSBvcHRpb25zLnJlZ2lzdHJ5IHx8IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2V0dGluZ3MucmVnaXN0cnknKVxyXG4gICAgY29uc3QgcHJveHkgPSBvcHRpb25zLnByb3h5IHx8IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2V0dGluZ3MucHJveHknKVxyXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlOiBhbnkpOiB2b2lkID0+IHtcclxuICAgICAgbGV0IGFyZ3MgPSBbY21kXS5jb25jYXQobW9kdWxlcykuY29uY2F0KCctLWNvbG9yPWFsd2F5cycpLmNvbmNhdCgnLS1zYXZlJylcclxuICAgICAgaWYgKHJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KGAtLXJlZ2lzdHJ5PSR7cmVnaXN0cnl9YClcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJveHkpIHtcclxuICAgICAgICBhcmdzID0gYXJncy5jb25jYXQoYC0tcHJveHk9JHtwcm94eX1gKVxyXG4gICAgICB9XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgbnBtID0gc3Bhd24oJ25wbScsIGFyZ3MsIHsgY3dkOiB3aGVyZSwgZW52OiBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwgZW52KSB9KVxyXG5cclxuICAgICAgICBsZXQgb3V0cHV0ID0gJydcclxuICAgICAgICBucG0uc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIG91dHB1dCArPSBkYXRhXHJcbiAgICAgICAgfSkucGlwZShwcm9jZXNzLnN0ZG91dClcclxuXHJcbiAgICAgICAgbnBtLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBvdXRwdXQgKz0gZGF0YVxyXG4gICAgICAgIH0pLnBpcGUocHJvY2Vzcy5zdGRlcnIpXHJcblxyXG4gICAgICAgIG5wbS5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWNvZGUpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh7IGNvZGU6IDAsIGRhdGE6IG91dHB1dCB9KVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh7IGNvZGUsIGRhdGE6IG91dHB1dCB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLy8gZm9yIHVzZXJzIHdobyBoYXZlbid0IGluc3RhbGxlZCBub2RlLmpzXHJcbiAgICAgICAgbnBtLm9uKCdlcnJvcicsIChlcnI6IEVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKCdOUE0gaXMgbm90IGluc3RhbGxlZCcpXHJcbiAgICAgICAgICB0aGlzLmN0eC5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCAnTlBNIGlzIG5vdCBpbnN0YWxsZWQnKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSBhcyBFcnJvcilcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCBlKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIHRyYW5zZm9ybSB0aGUgaW5wdXQgcGx1Z2luIG5hbWUgb3IgcGF0aCBzdHJpbmcgdG8gdmFsaWQgcmVzdWx0XHJcbiAqIEBwYXJhbSBjdHhcclxuICogQHBhcmFtIG5hbWVPclBhdGhcclxuICovXHJcbmNvbnN0IGhhbmRsZVBsdWdpbk5hbWVQcm9jZXNzID0gKGN0eDogSVBpY0dvLCBuYW1lT3JQYXRoOiBzdHJpbmcpOiBJUGx1Z2luUHJvY2Vzc1Jlc3VsdCA9PiB7XHJcbiAgY29uc3QgcmVzID0ge1xyXG4gICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICBmdWxsTmFtZTogJycsXHJcbiAgICBwa2dOYW1lOiAnJ1xyXG4gIH1cclxuICBjb25zdCByZXN1bHQgPSBnZXRQcm9jZXNzUGx1Z2luTmFtZShuYW1lT3JQYXRoLCBjdHgubG9nKVxyXG4gIGlmICghcmVzdWx0KSB7XHJcbiAgICByZXR1cm4gcmVzXHJcbiAgfVxyXG4gIC8vIGZpcnN0IGdldCByZXN1bHQgdGhlbiBkbyB0aGlzIHByb2Nlc3NcclxuICAvLyBvciBzb21lIGVycm9yIHdpbGwgbG9nIHR3aWNlXHJcbiAgY29uc3QgcGtnTmFtZSA9IGdldE5vcm1hbFBsdWdpbk5hbWUocmVzdWx0LCBjdHgubG9nKVxyXG4gIGlmICghcGtnTmFtZSkge1xyXG4gICAgcmV0dXJuIHJlc1xyXG4gIH1cclxuICByZXR1cm4ge1xyXG4gICAgc3VjY2VzczogdHJ1ZSxcclxuICAgIGZ1bGxOYW1lOiByZXN1bHQsXHJcbiAgICBwa2dOYW1lXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQbHVnaW5IYW5kbGVyXHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyAqL1xyXG5leHBvcnQgY29uc3QgWkhfQ04gPSB7XHJcbiAgVVBMT0FEX0ZBSUxFRDogJ+S4iuS8oOWksei0pScsXHJcbiAgQ0hFQ0tfU0VUVElOR1M6ICfor7fmo4Dmn6XkvaDnmoTphY3nva7pobnmmK/lkKbmraPnoa4nLFxyXG4gIENIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLOiAn6K+35qOA5p+l5L2g55qE6YWN572u6aG55Lul5Y+K572R57ucJyxcclxuICBVUExPQURfRkFJTEVEX1JFQVNPTjogJ+mUmeivr+egge+8miR7Y29kZX3vvIzor7fmiZPlvIDmtY/op4jlmajnspjotLTlnLDlnYDmn6XnnIvnm7jlhbPljp/lm6AnLFxyXG4gIFNFUlZFUl9FUlJPUjogJ+acjeWKoeerr+WHuumUme+8jOivt+mHjeivlScsXHJcbiAgQVVUSF9GQUlMRUQ6ICforqTor4HlpLHotKUnLFxyXG5cclxuICAvLyBzbW1zXHJcbiAgUElDQkVEX1NNTVM6ICdTTS5NUycsXHJcbiAgUElDQkVEX1NNTVNfVE9LRU46ICforr7lrppUb2tlbicsXHJcbiAgUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTjogJ+Wkh+eUqOS4iuS8oOWfn+WQjScsXHJcbiAgUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOOiAn5L6L5aaCIHNtbXMuYXBwJyxcclxuXHJcbiAgLy8gbG9jYWxcclxuICBQSUNCRURfTE9DQUw6ICfmnKzlnLDkuIrkvKAnLFxyXG4gIFBJQ0JFRF9MT0NBTF9QQVRIOiAn6K6+5a6a6Lev5b6EJyxcclxuICBQSUNCRURfTE9DQUxfTUVTU0FHRV9QQVRIOiAn5L6L5aaCIC91c3IvbG9jYWwvaW1hZ2VzLycsXHJcbiAgUElDQkVEX0xPQ0FMX0NVU1RPTVVSTDogJ+iuvuWumuiHquWumuS5ieWfn+WQjScsXHJcbiAgUElDQkVEX0xPQ0FMX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaCIGh0dHBzOi8vdGVzdC5jb20nLFxyXG4gIFBJQ0JFRF9MT0NBTF9XRUJQQVRIOiAn6K6+5a6a572R56uZ6Lev5b6EJyxcclxuICBQSUNCRURfTE9DQUxfTUVTU0FHRV9XRUJQQVRIOiAn55So5LqO5ou85o6l572R5Z2A6Lev5b6EJyxcclxuXHJcbiAgLy8gQWxpLWNsb3VkXHJcbiAgUElDQkVEX0FMSUNMT1VEOiAn6Zi/6YeM5LqRT1NTJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQ6ICforr7lrppLZXlJZCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVDogJ+iuvuWumktleVNlY3JldCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0JVQ0tFVDogJ+iuvuWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FSRUE6ICforr7lrprlrZjlgqjljLrln58nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9QQVRIOiAn6K6+5a6a5a2Y5YKo6Lev5b6EJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMOiAn6K6+5a6a6Ieq5a6a5LmJ5Z+f5ZCNJyxcclxuICBQSUNCRURfQUxJQ0xPVURfT1BUSU9OUzogJ+iuvuWumue9keWdgOWQjue8gCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mm9zcy1jbi1iZWlqaW5nJyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJo/eC1vc3MtcHJvY2Vzcz14eHgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBUZW5jZW50LWNsb3VkXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRDogJ+iFvuiur+S6kUNPUycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OOiAnQ09T54mI5pysJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEOiAn6K6+5a6aU2VjcmV0SWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZOiAn6K6+5a6aU2VjcmV0S2V5JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FQUElEOiAn6K6+5a6aQXBwSWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUOiAn6K6+5a6aQnVja2V0JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUE6ICforr7lrprlrZjlgqjljLrln58nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfRU5EUE9JTlQ6ICforr7lrprmjqXlhaXngrknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TOiAn6K6+5a6a572R5Z2A5ZCO57yAJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTDogJ+iuvuWumuiHquWumuS5ieWfn+WQjScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEOiAn5L6L5aaC77yaMTIzNDU2Nzg5MCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJphcC1iZWlqaW5nJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJo/aW1hZ2VNb2dyMicsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0VORFBPSU5UOiAn5L6L5aaC77yaY29zLWludGVybmFsLmFjY2VsZXJhdGUudGVuY2VudGNvcy5jbicsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TTElNOiAn5p6B5pm65Y6L57ypJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU1fVElQOiAn5Zu+54mH5p6B5pm65Y6L57yp77yM6K+m5oOF6K+35Y+C6ICDW+aWh+aho+ivtOaYjl0oaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi80OTI1OSknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTV9DT05GSVJNOiAn5byA5ZCvJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU1fQ0FOQ0VMOiAn5YWz6ZetJyxcclxuXHJcbiAgLy8gR2l0SHViXHJcbiAgUElDQkVEX0dJVEhVQjogJ0dpdEh1YicsXHJcbiAgUElDQkVEX0dJVEhVQl9UT0tFTjogJ+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+8mmh0dHBzOi8veHh4Lnl5eS5nbGIuY2xvdWRkbi5jb20nLFxyXG4gIFBJQ0JFRF9URUxFR1JBUEg6ICdUZWxlZ3JhcGgnLFxyXG4gIC8vIGltZ3VyXHJcbiAgUElDQkVEX0lNR1VSOiAnSW1ndXInLFxyXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogJ+iuvuWumkNsaWVudElkJyxcclxuICBQSUNCRURfSU1HVVJfVVNFUk5BTUU6ICforr7lrprnlKjmiLflkI0nLFxyXG4gIFBJQ0JFRF9JTUdVUl9BQ0NFU1NfVE9LRU46ICforr7lrpphY2Nlc3NUb2tlbicsXHJcbiAgUElDQkVEX0lNR1VSX0FMQlVNOiAn6K6+5a6a55u45YaM5ZCNJyxcclxuICBQSUNCRURfSU1HVVJfUFJPWFk6ICforr7lrprku6PnkIYnLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX0NMSUVOVElEOiAn5Yy/5ZCN5LiK5Lyg5pe25aGr5YaZJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9VU0VSTkFNRTogJ+mcgOimgeS4iuS8oOWIsOi0puaIt+aXtuWhq+WGmScsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfQUNDRVNTX1RPS0VOOiAn6ZyA6KaB5LiK5Lyg5Yiw6LSm5oi35pe25aGr5YaZJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9BTEJVTTogJ+S+i+Wmgu+8mnRlc3QnLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZOiAn5L6L5aaC77yaaHR0cDovLzEyNy4wLjAuMToxMDgwJyxcclxuXHJcbiAgLy8gdXB5dW5cclxuICBQSUNCRURfVVBZVU46ICflj4jmi43kupEnLFxyXG4gIFBJQ0JFRF9VUFlVTl9CVUNLRVQ6ICforr7lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUEVSQVRPUjogJ+iuvuWumuaTjeS9nOWRmCcsXHJcbiAgUElDQkVEX1VQWVVOX1BBU1NXT1JEOiAn6K6+5a6a5pON5L2c5ZGY5a+G56CBJyxcclxuICBQSUNCRURfVVBZVU5fUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX1VQWVVOX1VSTDogJ+iuvuWumuWKoOmAn+Wfn+WQjScsXHJcbiAgUElDQkVEX1VQWVVOX09QVElPTlM6ICforr7lrprnvZHlnYDlkI7nvIAnLFxyXG4gIFBJQ0JFRF9VUFlVTl9BTlRJX0xFRUNIX1RPS0VOOiAn6K6+5a6a6Ziy55uX6ZO+VG9rZW4nLFxyXG4gIFBJQ0JFRF9VUFlVTl9FWFBJUkVfVElNRTogJ+iuvuWumui/h+acn+aXtumXtCjnp5IpJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUEVSQVRPUjogJ+S+i+Wmgu+8mm1lJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRDogJ+i+k+WFpeaTjeS9nOWRmOWvhueggScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMOiAn5L6L5aaC77yaaHR0cDovL3h4eC50ZXN0LnVwY2RuLm5ldCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8miFpbWdzbGltJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG5cclxuICAvLyB3ZWJkYXZwbGlzdFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVDogJ1dlYkRBVicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0hPU1Q6ICforr7lrprmjqXlj6PnvZHlnYAnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEOiAn5ZCv55SoU1NMJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfVVNFUk5BTUU6ICforr7lrprnlKjmiLflkI0nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9QQVNTV09SRDogJ+iuvuWumuWvhueggScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9XRUJTSVRFX1BBVEg6ICforr7lrprnvZHlnYDot6/lvoQnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkw6ICforr7lrproh6rlrprkuYnln5/lkI0nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9BVVRIVFlQRTogJ+iuvuWumuiupOivgeaWueW8jycsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfSE9TVDogJ+S+i+Wmgu+8mmh0dHBzOi8vZXhhbXBsZS5jb20vd2ViZGF2JyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9TU0xFTkFCTEVEOiAn6ZyA6KaBSFRUUFPml7blkK/nlKgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1VTRVJOQU1FOiAn5L6L5aaC77yabWUnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBU1NXT1JEOiAn6L6T5YWl5a+G56CBJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1dFQlNJVEVfUEFUSDogJ+aLvOaOpee9keWdgOaXtuS9v+eUqCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIHNmdHBwbGlzdFxyXG4gIFBJQ0JFRF9TRlRQUExJU1Q6ICflhoXnva5TRlRQJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX0hPU1Q6ICforr7lrprkuLvmnLonLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfUE9SVDogJ+iuvuWumuerr+WPoycsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9VU0VSTkFNRTogJ+iuvuWumueUqOaIt+WQjScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9QQVNTV09SRDogJ+iuvuWumuWvhueggScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9QUklWQVRFS0VZOiAn6K6+5a6a56eB6ZKlJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1BSSVZBVEVLRVlfUEFTU1BIUkFTRTogJ+iuvuWumuengemSpeWvhueggScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9VUExPQURQQVRIOiAn6K6+5a6a5LiK5Lyg6Lev5b6EJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX0NVU1RPTVVSTDogJ+iuvuWumuiHquWumuS5ieWfn+WQjScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9XRUJTSVRFX1BBVEg6ICforr7lrprnvZHnq5not6/lvoQnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfRklMRV9VU0VSOiAn6K6+5a6a5paH5Lu255So5oi3Oue7hCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9GSUxFX01PREU6ICforr7lrprmlofku7bmnYPpmZAnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfRElSX01PREU6ICforr7lrprmlofku7blpLnmnYPpmZAnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9IT1NUOiAn5L6L5aaC77yaMS4xLjEuMycsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1BPUlQ6ICfpu5jorqQyMicsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1BSSVZBVEVLRVk6ICfkvovlpoLvvJovVXNlcnMveHh4Ly5zc2gvaWRfcnNhJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfUFJJVkFURUtFWV9QQVNTUEhSQVNFOiAn6L6T5YWl56eB6ZKl5a+G56CBJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfVVBMT0FEUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1dFQlNJVEVfUEFUSDogJ+aLvOaOpee9keWdgOaXtuS9v+eUqCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0ZJTEVfVVNFUjogJ+S+i+Wmgu+8mnd3dzpkYXRhJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfRklMRV9NT0RFOiAn5L6L5aaC77yaMDY2NCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0RJUl9NT0RFOiAn5L6L5aaC77yaMDc3NScsXHJcblxyXG4gIC8vIFBpY0xpc3RcclxuICBQSUNCRURfUElDTElTVDogJ1BpY0xpc3QnLFxyXG4gIFBJQ0JFRF9QSUNMSVNUX0hPU1Q6ICforr7lrprkuLvmnLonLFxyXG4gIFBJQ0JFRF9QSUNMSVNUX1BPUlQ6ICforr7lrprnq6/lj6MnLFxyXG4gIFBJQ0JFRF9QSUNMSVNUX1BJQ0JFRDogJ+iuvuWumuWbvuW6iicsXHJcbiAgUElDQkVEX1BJQ0xJU1RfQ09ORklHTkFNRTogJ+iuvuWumumFjee9ruWQjScsXHJcbiAgUElDQkVEX1BJQ0xJU1RfS0VZOiAn6K6+5a6a6Ym05p2DS2V5JyxcclxuXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfSVNBRERXQVRFUk1BUks6ICfmmK/lkKbmt7vliqDmsLTljbAnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfSVNBRERXQVRFUk1BUks6ICfpnIDopoHmt7vliqDmsLTljbDml7blkK/nlKgnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RZUEU6ICforr7lrprmsLTljbDnsbvlnosnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLVFlQRTogJ+ivt+mAieaLqeawtOWNsOexu+WeiycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfSVNGVUxMU0NSRUVOV0FURVJNQVJLOiAn5piv5ZCm5YWo5bGP5rC05Y2wJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX0lTRlVMTFNDUkVFTldBVEVSTUFSSzogJ+mcgOimgeWFqOWxj+awtOWNsOaXtuWQr+eUqCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLREVHUkVFOiAn6K6+5a6a5rC05Y2w6KeS5bqmJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0RFR1JFRTogJ+ivt+i+k+WFpeaVsOWtlycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVEVYVDogJ+iuvuWumuawtOWNsOaWh+WtlycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktURVhUOiAn6K+36L6T5YWl5rC05Y2w5paH5a2XJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhURk9OVFBBVEg6ICforr7lrprmsLTljbDlrZfkvZPmlofku7bot6/lvoQnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVFBBVEg6ICfor7fovpPlhaXmsLTljbDlrZfkvZPmlofku7bot6/lvoQnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRSQVRJTzogJ+iuvuWumuawtOWNsOebuOWvueS6juWbvueJh+eahOavlOS+iycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UUkFUSU86ICfor7fovpPlhaUwLTHnmoTlsI/mlbAnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRDT0xPUjogJ+iuvuWumuawtOWNsOWtl+S9k+minOiJsicsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UQ09MT1I6ICfor7fovpPlhaVyZ2LpopzoibLlgLwnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0lNQUdFUEFUSDogJ+iuvuWumuawtOWNsOWbvueJh+i3r+W+hCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktJTUFHRVBBVEg6ICfor7fovpPlhaXmsLTljbDlm77niYfot6/lvoQnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1BPU0lUSU9OOiAn6K6+5a6a5rC05Y2w5L2N572uJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1BPU0lUSU9OOiAn6K+36YCJ5oup5rC05Y2w5L2N572uJyxcclxuXHJcbiAgQlVJTERJTl9SRU5BTUVfRk9STUFUOiAn6K6+5a6a6YeN5ZG95ZCN5qC85byPJyxcclxuICBCVUlMRElOX1JFTkFNRV9FTkFCTEU6ICfmmK/lkKblkK/nlKjph43lkb3lkI0nLFxyXG5cclxuICBCVUlMRElOX0NPTVBSRVNTX1FVQUxJVFk6ICforr7lrprlm77niYfotKjph48nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9RVUFMSVRZOiAn6K+36L6T5YWlMC0xMDDnmoTmlbTmlbAnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNDT05WRVJUOiAn5piv5ZCm6L+b6KGM5qC85byP6L2s5o2iJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNDT05WRVJUOiAn6ZyA6KaB6L2s5o2i5pe25ZCv55SoJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0NPTlZFUlRGT1JNQVQ6ICforr7lrprovazmjaLmoLzlvI8nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9DT05WRVJURk9STUFUOiAn6K+36YCJ5oup6L2s5o2i5qC85byPJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTUkVTSVpFOiAn5piv5ZCm6L+b6KGM5Zu+54mH57yp5pS+JyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRVNJWkU6ICfpnIDopoHnvKnmlL7ml7blkK/nlKgnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUkVTSVpFV0lEVEg6ICforr7lrprnvKnmlL7lrr3luqYnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVXSURUSDogJ+ivt+i+k+WFpeaVsOWtlycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19SRVNJWkVIRUlHSFQ6ICforr7lrprnvKnmlL7pq5jluqYnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVIRUlHSFQ6ICfor7fovpPlhaXmlbDlrZcnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkVCWVBFUkNFTlQ6ICfmmK/lkKbmjInnmb7liIbmr5Tov5vooYznvKnmlL4nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JFU0laRUJZUEVSQ0VOVDogJ+mcgOimgeaMieeZvuWIhuavlOe8qeaUvuaXtuWQr+eUqCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU0ZMSVA6ICfmmK/lkKblnoLnm7Tnv7vovazlm77niYcnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNGTE9QOiAn5piv5ZCm5rC05bmz57+76L2s5Zu+54mHJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1JFU0laRVBFUkNFTlQ6ICforr7lrprnvKnmlL7nmb7liIbmr5QnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVQRVJDRU5UOiAn6K+36L6T5YWl5pWw5a2XJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1NLSVBSRVNJWkVPRlNNQUxMSU1HOiAn5piv5ZCm6Lez6L+H5bCP5Zu+57yp5pS+JyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTUk9UQVRFOiAn5piv5ZCm6L+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+S5Lu25ZCNJ1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJTG9jYWxlc0tleSA9IGtleW9mIHR5cGVvZiBaSF9DTlxyXG5leHBvcnQgdHlwZSBJTG9jYWxlcyA9IHR5cGVvZiBaSF9DTlxyXG4iLCJpbXBvcnQgeyB0eXBlIElMb2NhbGVzIH0gZnJvbSAnLi96aC1DTidcclxuXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyAqL1xyXG5leHBvcnQgY29uc3QgRU46IElMb2NhbGVzID0ge1xyXG4gIFVQTE9BRF9GQUlMRUQ6ICdVcGxvYWQgZmFpbGVkJyxcclxuICBDSEVDS19TRVRUSU5HUzogJ1BsZWFzZSBjaGVjayB5b3VyIHNldHRpbmdzJyxcclxuICBDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSzogJ1BsZWFzZSBjaGVjayB5b3VyIHNldHRpbmdzIGFuZCBuZXR3b3JrJyxcclxuICBVUExPQURfRkFJTEVEX1JFQVNPTjogJ0Vycm9yIGNvZGU6ICR7Y29kZX0sIHBsZWFzZSBvcGVuIHRoZSBicm93c2VyIGFuZCBwYXN0ZSB0aGUgYWRkcmVzcyB0byBzZWUgdGhlIHJlYXNvbicsXHJcbiAgU0VSVkVSX0VSUk9SOiAnU2VydmVyIGVycm9yLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyJyxcclxuICBBVVRIX0ZBSUxFRDogJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCcsXHJcblxyXG4gIC8vIHNtbXNcclxuICBQSUNCRURfU01NUzogJ1NNLk1TJyxcclxuICBQSUNCRURfU01NU19UT0tFTjogJ1NldCBUb2tlbicsXHJcbiAgUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTjogJ1NldCBCYWNrdXAgVXBsb2FkIERvbWFpbicsXHJcbiAgUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOOiAnRXguIHNtbXMuYXBwJyxcclxuXHJcbiAgLy8gbG9jYWxcclxuICBQSUNCRURfTE9DQUw6ICdMb2NhbCcsXHJcbiAgUElDQkVEX0xPQ0FMX1BBVEg6ICdTZXQgUGF0aCcsXHJcbiAgUElDQkVEX0xPQ0FMX01FU1NBR0VfUEFUSDogJ0V4LiAvVXNlcnMvbmFtZS9QaWN0dXJlcy8nLFxyXG4gIFBJQ0JFRF9MT0NBTF9DVVNUT01VUkw6ICdTZXQgQ3VzdG9tIFVSTCcsXHJcbiAgUElDQkVEX0xPQ0FMX01FU1NBR0VfQ1VTVE9NVVJMOiAnRXguIGh0dHBzOi8vdGVzdC5jb20nLFxyXG4gIFBJQ0JFRF9MT0NBTF9XRUJQQVRIOiAnU2V0IFdlYiBQYXRoJyxcclxuICBQSUNCRURfTE9DQUxfTUVTU0FHRV9XRUJQQVRIOiAnVXNlZCB0byBnZW5lcmF0ZSB1cmwgcGF0aCcsXHJcblxyXG4gIC8vIEFsaS1jbG91ZFxyXG4gIFBJQ0JFRF9BTElDTE9VRDogJ0FsaSBDbG91ZCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEOiAnU2V0IEtleUlkJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUOiAnU2V0IEtleVNlY3JldCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0JVQ0tFVDogJ1NldCBCdWNrZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BUkVBOiAnU2V0IEFyZWEnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkw6ICdTZXQgQ3VzdG9tIFVSTCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX09QVElPTlM6ICdTZXQgVVJMIFN1ZmZpeCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQTogJ0V4LiBvc3MtY24tYmVpamluZycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSDogJ0V4LiB0ZXN0LycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfT1BUSU9OUzogJ0V4LiA/eC1vc3MtcHJvY2Vzcz14eHgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogJ0V4LiBodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gVGVuY2VudC1jbG91ZFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVUQ6ICdUZW5jZW50IENsb3VkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1ZFUlNJT046ICdDaG9vc2UgQ09TIHZlcnNpb24nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQ6ICdTZXQgU2VjcmV0SWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZOiAnU2V0IFNlY3JldEtleScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRDogJ1NldCBBcHBJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUE6ICdTZXQgQXJlYScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9FTkRQT0lOVDogJ1NldCBFbmRwb2ludCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUzogJ1NldCBVUkwgU3VmZml4JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTDogJ1NldCBDdXN0b20gVVJMJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQ6ICdFeC4gMTIzNDU2Nzg5MCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUE6ICdFeC4gYXAtYmVpamluZycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cDovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfT1BUSU9OUzogJ0V4LiA/aW1hZ2VNb2dyMicsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0VORFBPSU5UOiAnRXguIGNvcy1pbnRlcm5hbC5hY2NlbGVyYXRlLnRlbmNlbnRjb3MuY24nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTTogJ+alteaZuuWjk+e4ricsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TTElNX0NBTkNFTDogJ+mXnOmWiScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TTElNX0NPTkZJUk06ICfplovllZMnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTV9USVA6ICflnJbniYfmpbXmmbrlo5PnuK7vvIzoqbPmg4Xoq4vlj4PogINb5paH5qqU6Kqq5piOXShodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2LzQ5MjU5KScsXHJcblxyXG4gIC8vIEdpdEh1YlxyXG4gIFBJQ0JFRF9HSVRIVUI6ICdHaXRIdWInLFxyXG4gIFBJQ0JFRF9HSVRIVUJfVE9LRU46ICdTZXQgVG9rZW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUkVQTzogJ1NldCBSZXBvIE5hbWUnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfR0lUSFVCX0JSQU5DSDogJ1NldCBCcmFuY2gnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMOiAnU2V0IEN1c3RvbSBVUkwnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPOiAnRXguIHVzZXJuYW1lL3JlcG8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0g6ICdFeC4gbWFpbicsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIHFpbml1XHJcbiAgUElDQkVEX1FJTklVOiAnUWluaXUnLFxyXG4gIFBJQ0JFRF9RSU5JVV9BQ0NFU1NLRVk6ICdTZXQgQWNjZXNzS2V5JyxcclxuICBQSUNCRURfUUlOSVVfU0VDUkVUS0VZOiAnU2V0IFNlY3JldEtleScsXHJcbiAgUElDQkVEX1FJTklVX0JVQ0tFVDogJ1NldCBCdWNrZXQnLFxyXG4gIFBJQ0JFRF9RSU5JVV9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9RSU5JVV9VUkw6ICdTZXQgVVJMJyxcclxuICBQSUNCRURfUUlOSVVfT1BUSU9OUzogJ1NldCBVUkwgU3VmZml4JyxcclxuICBQSUNCRURfUUlOSVVfQVJFQTogJ1NldCBBcmVhJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBOiAnRXguIHowJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9PUFRJT05TOiAnRXguID9pbWFnZXNsaW0nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTDogJ0V4LiBodHRwczovL3h4eC55eXkuZ2xiLmNsb3VkZG4uY29tJyxcclxuXHJcbiAgLy8gdGVsZWdyYXBoXHJcbiAgUElDQkVEX1RFTEVHUkFQSDogJ1RlbGVncmFwaCcsXHJcblxyXG4gIC8vIGltZ3VyXHJcbiAgUElDQkVEX0lNR1VSOiAnSW1ndXInLFxyXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogJ1NldCBDbGllbnRJZCcsXHJcbiAgUElDQkVEX0lNR1VSX1VTRVJOQU1FOiAnU2V0IFVzZXJuYW1lJyxcclxuICBQSUNCRURfSU1HVVJfQUNDRVNTX1RPS0VOOiAnU2V0IEFjY2VzcyBUb2tlbicsXHJcbiAgUElDQkVEX0lNR1VSX0FMQlVNOiAnU2V0IEFsYnVtIE5hbWUnLFxyXG4gIFBJQ0JFRF9JTUdVUl9QUk9YWTogJ1NldCBQcm94eScsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfQ0xJRU5USUQ6ICdGaWxsIGluIHdoZW4geW91IG5lZWQgdG8gdXBsb2FkIGFzIGFub255bW91cycsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfVVNFUk5BTUU6ICdGaWxsIGluIHdoZW4geW91IG5lZWQgdG8gdXBsb2FkIHRvIHRoZSBhY2NvdW50JyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9BQ0NFU1NfVE9LRU46ICdGaWxsIGluIHdoZW4geW91IG5lZWQgdG8gdXBsb2FkIHRvIHRoZSBhY2NvdW50JyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9BTEJVTTogJ+S+i+Wmgu+8mnRlc3QnLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZOiAnRXguIGh0dHA6Ly8xMjcuMC4wLjE6MTA4MCcsXHJcblxyXG4gIC8vIHVweXVuXHJcbiAgUElDQkVEX1VQWVVOOiAnVXB5dW4nLFxyXG4gIFBJQ0JFRF9VUFlVTl9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfVVBZVU5fT1BFUkFUT1I6ICdTZXQgT3BlcmF0b3InLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVNTV09SRDogJ1NldCBPcGVyYXRvciBQYXNzd29yZCcsXHJcbiAgUElDQkVEX1VQWVVOX1BBVEg6ICdTZXQgUGF0aCcsXHJcbiAgUElDQkVEX1VQWVVOX1VSTDogJ1NldCBVUkwnLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUFRJT05TOiAnU2V0IFVSTCBTdWZmaXgnLFxyXG4gIFBJQ0JFRF9VUFlVTl9BTlRJX0xFRUNIX1RPS0VOOiAnU2V0IEFudGktTGVlY2ggVG9rZW4nLFxyXG4gIFBJQ0JFRF9VUFlVTl9FWFBJUkVfVElNRTogJ1NldCBFeHBpcmUgVGltZShzZWNvbmRzKScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1I6ICdFeC4gbWUnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEOiAnUGxlYXNlIHR5cGUgdGhlIG9wZXJhdG9yIHBhc3N3b3JkJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkw6ICdFeC4gaHR0cDovL3h4eC50ZXN0LnVwY2RuLm5ldCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BUSU9OUzogJ0V4LiAhaW1nc2xpbScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSDogJ0V4LiB0ZXN0LycsXHJcblxyXG4gIC8vIHdlYmRhdlxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVDogJ1dlYkRBVicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0hPU1Q6ICdTZXQgSG9zdCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1NTTEVOQUJMRUQ6ICdFbmFibGUgSFRUUFMnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9VU0VSTkFNRTogJ1NldCBVc2VybmFtZScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1BBU1NXT1JEOiAnU2V0IFBhc3N3b3JkJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfV0VCU0lURV9QQVRIOiAnU2V0IFdlYnNpdGUgUGF0aCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTDogJ1NldCBDdXN0b20gVVJMJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfQVVUSFRZUEU6ICdTZXQgQXV0aCBUeXBlJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9IT1NUOiAnRXguIGh0dHBzOi8vZXhhbXBsZS5jb20vd2ViZGF2JyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9TU0xFTkFCTEVEOiAnRW5hYmxlIEhUVFBTJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9VU0VSTkFNRTogJ0V4LiBtZScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfUEFTU1dPUkQ6ICdQbGVhc2UgdHlwZSB0aGUgcGFzc3dvcmQnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1dFQlNJVEVfUEFUSDogJ1VzZWQgdG8gZ2VuZXJhdGUgdGhlIFVSTCBvZiB0aGUgaW1hZ2UnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0NVU1RPTVVSTDogJ0V4LiBodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gc2Z0cHBsaXN0XHJcbiAgUElDQkVEX1NGVFBQTElTVDogJ1NGVFAgQnVpbGRpbicsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9IT1NUOiAnU2V0IEhvc3QnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfUE9SVDogJ1NldCBQb3J0JyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1VTRVJOQU1FOiAnU2V0IFVzZXJuYW1lJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1BBU1NXT1JEOiAnU2V0IFBhc3N3b3JkJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1BSSVZBVEVLRVk6ICdTZXQgUHJpdmF0ZSBLZXknLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfUFJJVkFURUtFWV9QQVNTUEhSQVNFOiAnU2V0IFByaXZhdGUgS2V5IFBhc3NwaHJhc2UnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfVVBMT0FEUEFUSDogJ1NldCBVcGxvYWQgUGF0aCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9DVVNUT01VUkw6ICdTZXQgQ3VzdG9tIFVSTCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9XRUJTSVRFX1BBVEg6ICdTZXQgV2Vic2l0ZSBQYXRoJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX0ZJTEVfVVNFUjogJ1NldCBGaWxlIFVzZXI6R3JvdXAnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfRklMRV9NT0RFOiAnU2V0IEZpbGUgTW9kZScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9ESVJfTU9ERTogJ1NldCBEaXJlY3RvcnkgTW9kZScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0hPU1Q6ICdFeC4gMS4xLjEuMycsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1BPUlQ6ICdEZWZhdWx0IDIyJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfUFJJVkFURUtFWTogJ0V4LiAvVXNlcnMveHh4Ly5zc2gvaWRfcnNhJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfUFJJVkFURUtFWV9QQVNTUEhSQVNFOiAnUGxlYXNlIHR5cGUgdGhlIHByaXZhdGUga2V5IHBhc3NwaHJhc2UnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9VUExPQURQQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfQ1VTVE9NVVJMOiAnRXguIGh0dHBzOi8vdGVzdC5jb20nLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEg6ICdVc2VkIHRvIGdlbmVyYXRlIHRoZSBVUkwgb2YgdGhlIGltYWdlJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfRklMRV9VU0VSOiAnRXguIHd3dzpkYXRhJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfRklMRV9NT0RFOiAnRXguIDA2NjQnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9ESVJfTU9ERTogJ0V4LiAwNzc1JyxcclxuXHJcbiAgLy8gUGljTGlzdFxyXG4gIFBJQ0JFRF9QSUNMSVNUOiAnUGljTGlzdCcsXHJcbiAgUElDQkVEX1BJQ0xJU1RfSE9TVDogJ1NldCBIb3N0JyxcclxuICBQSUNCRURfUElDTElTVF9QT1JUOiAnU2V0IFBvcnQnLFxyXG4gIFBJQ0JFRF9QSUNMSVNUX1BJQ0JFRDogJ1NldCBQaWNCZWQnLFxyXG4gIFBJQ0JFRF9QSUNMSVNUX0NPTkZJR05BTUU6ICdTZXQgQ29uZmlnIE5hbWUnLFxyXG4gIFBJQ0JFRF9QSUNMSVNUX0tFWTogJ1NldCBLZXknLFxyXG5cclxuICBCVUlMRElOX1JFTkFNRV9GT1JNQVQ6ICdTZXQgcmVuYW1lIGZvcm1hdCcsXHJcbiAgQlVJTERJTl9SRU5BTUVfRU5BQkxFOiAnRW5hYmxlIHJlbmFtZScsXHJcblxyXG4gIEJVSUxESU5fV0FURVJNQVJLX0lTQUREV0FURVJNQVJLOiAnV2hldGhlciB0byBhZGQgd2F0ZXJtYXJrJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX0lTQUREV0FURVJNQVJLOiAnRW5hYmxlIHdoZW4gd2F0ZXJtYXJrIGlzIHJlcXVpcmVkJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktUWVBFOiAnU2V0IHdhdGVybWFyayB0eXBlJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1RZUEU6ICdQbGVhc2Ugc2VsZWN0IHdhdGVybWFyayB0eXBlJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19JU0ZVTExTQ1JFRU5XQVRFUk1BUks6ICdXaGV0aGVyIHRvIHVzZSBmdWxsLXNjcmVlbiB3YXRlcm1hcmsnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfSVNGVUxMU0NSRUVOV0FURVJNQVJLOiAnRW5hYmxlIHdoZW4gZnVsbC1zY3JlZW4gd2F0ZXJtYXJrIGlzIHJlcXVpcmVkJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktERUdSRUU6ICdTZXQgd2F0ZXJtYXJrIGFuZ2xlJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0RFR1JFRTogJ1BsZWFzZSBlbnRlciBhIG51bWJlcicsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVEVYVDogJ1NldCB3YXRlcm1hcmsgdGV4dCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktURVhUOiAnUGxlYXNlIGVudGVyIHdhdGVybWFyayB0ZXh0JyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhURk9OVFBBVEg6ICdTZXQgd2F0ZXJtYXJrIGZvbnQnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVFBBVEg6ICdQbGVhc2UgZW50ZXIgdGhlIHdhdGVybWFyayBmb250IGZpbGUgcGF0aCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLRk9OVFJBVElPOiAnU2V0IHRoZSByYXRpbyBvZiB0aGUgd2F0ZXJtYXJrIHRvIHRoZSBpbWFnZScsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UUkFUSU86ICdQbGVhc2UgZW50ZXIgYSBudW1iZXIgYmV0d2VlbiAwLTEnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRDT0xPUjogJ1NldCB3YXRlcm1hcmsgZm9udCBjb2xvcicsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UQ09MT1I6ICdQbGVhc2UgZW50ZXIgdGhlIFJHQiBjb2xvciB2YWx1ZScsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLSU1BR0VQQVRIOiAnU2V0IHdhdGVybWFyayBpbWFnZSBwYXRoJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0lNQUdFUEFUSDogJ1BsZWFzZSBlbnRlciB0aGUgd2F0ZXJtYXJrIGltYWdlIHBhdGgnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1BPU0lUSU9OOiAnU2V0IHdhdGVybWFyayBwb3NpdGlvbicsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktQT1NJVElPTjogJ1BsZWFzZSBzZWxlY3Qgd2F0ZXJtYXJrIHBvc2l0aW9uJyxcclxuXHJcbiAgQlVJTERJTl9DT01QUkVTU19RVUFMSVRZOiAnU2V0IGltYWdlIHF1YWxpdHknLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9RVUFMSVRZOiAnUGxlYXNlIGVudGVyIGFuIGludGVnZXIgYmV0d2VlbiAwLTEwMCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU0NPTlZFUlQ6ICdXaGV0aGVyIHRvIHBlcmZvcm0gZm9ybWF0IGNvbnZlcnNpb24nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU0NPTlZFUlQ6ICdFbmFibGUgd2hlbiBmb3JtYXQgY29udmVyc2lvbiBpcyByZXF1aXJlZCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19DT05WRVJURk9STUFUOiAnU2V0IGNvbnZlcnNpb24gZm9ybWF0JyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfQ09OVkVSVEZPUk1BVDogJ1BsZWFzZSBzZWxlY3QgY29udmVyc2lvbiBmb3JtYXQnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkU6ICdXaGV0aGVyIHRvIHJlc2l6ZSB0aGUgaW1hZ2UnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JFU0laRTogJ0VuYWJsZSB3aGVuIGltYWdlIHJlc2l6aW5nIGlzIHJlcXVpcmVkJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1JFU0laRVdJRFRIOiAnU2V0IHJlc2l6aW5nIHdpZHRoJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFV0lEVEg6ICdQbGVhc2UgZW50ZXIgYSBudW1iZXInLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUkVTSVpFSEVJR0hUOiAnU2V0IHJlc2l6aW5nIGhlaWdodCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRUhFSUdIVDogJ1BsZWFzZSBlbnRlciBhIG51bWJlcicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JFU0laRUJZUEVSQ0VOVDogJ1doZXRoZXIgdG8gcmVzaXplIHRoZSBpbWFnZSBieSBwZXJjZW50YWdlJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRVNJWkVCWVBFUkNFTlQ6ICdFbmFibGUgd2hlbiByZXNpemluZyBieSBwZXJjZW50YWdlIGlzIHJlcXVpcmVkJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTRkxJUDogJ1doZXRoZXIgdG8gZmxpcCB0aGUgaW1hZ2UgdmVydGljYWxseScsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU0ZMT1A6ICdXaGV0aGVyIHRvIGZsaXAgdGhlIGltYWdlIGhvcml6b250YWxseScsXHJcbiAgQlVJTERJTl9DT01QUkVTU19SRVNJWkVQRVJDRU5UOiAnU2V0IHJlc2l6aW5nIHBlcmNlbnRhZ2UnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVQRVJDRU5UOiAnUGxlYXNlIGVudGVyIGEgbnVtYmVyJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1NLSVBSRVNJWkVPRlNNQUxMSU1HOiAnV2hldGhlciB0byBza2lwIHJlc2l6aW5nIG9mIHNtYWxsIGltYWdlcycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JPVEFURTogJ1doZXRoZXIgdG8gcm90YXRlIHRoZSBpbWFnZScsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUk9UQVRFOiAnRW5hYmxlIHdoZW4gaW1hZ2Ugcm90YXRpb24gaXMgcmVxdWlyZWQnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUk9UQVRFREVHUkVFOiAnU2V0IHJvdGF0aW9uIGFuZ2xlJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUk9UQVRFREVHUkVFOiAnUGxlYXNlIGVudGVyIGEgbnVtYmVyLCBjYW4gYmUgbmVnYXRpdmUnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNSRU1PVkVFWElGOiAnV2hldGhlciB0byByZW1vdmUgRVhJRiBpbmZvcm1hdGlvbicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVNT1ZFRVhJRjogJ0VuYWJsZSB3aGVuIHJlbW92aW5nIEVYSUYgaW5mb3JtYXRpb24gaXMgcmVxdWlyZWQnLFxyXG4gIC8vIFBsdWdpbiBIYW5kbGVyXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUzogJ1BsdWdpbiBpbnN0YWxsZWQgc3VjY2Vzc2Z1bGx5JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQ6ICdQbHVnaW4gaW5zdGFsbGF0aW9uIGZhaWxlZCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTjogJ1BsdWdpbiBpbnN0YWxsYXRpb24gZmFpbGVkLCBlcnJvciBjb2RlIGlzICR7Y29kZX0sIGVycm9yIGxvZyBpcyBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1BBVEg6ICdQbHVnaW4gaW5zdGFsbGF0aW9uIGZhaWxlZCwgcGxlYXNlIGVudGVyIGEgdmFsaWQgcGx1Z2luIG5hbWUgb3IgdmFsaWQgaW5zdGFsbGF0aW9uIHBhdGgnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTUzogJ1BsdWdpbiB1bmluc3RhbGxlZCBzdWNjZXNzZnVsbHknLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEOiAnUGx1Z2luIHVuaW5zdGFsbCBmYWlsZWQnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1JFQVNPTjogJ1BsdWdpbiB1bmluc3RhbGwgZmFpbGVkLCBlcnJvciBjb2RlIGlzICR7Y29kZX0sIGVycm9yIGxvZyBpcyBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQ6ICdQbHVnaW4gdW5pbnN0YWxsIGZhaWxlZCwgcGxlYXNlIGVudGVyIGEgdmFsaWQgcGx1Z2luIG5hbWUnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUzogJ1BsdWdpbiB1cGRhdGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQ6ICdQbHVnaW4gdXBkYXRlIGZhaWxlZCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OOiAnUGx1Z2luIHVwZGF0ZSBmYWlsZWQsIGVycm9yIGNvZGUgaXMgJHtjb2RlfSwgZXJyb3IgbG9nIGlzIFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRDogJ1BsdWdpbiB1cGRhdGUgZmFpbGVkLCBwbGVhc2UgZW50ZXIgYSB2YWxpZCBwbHVnaW4gbmFtZSdcclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlIElMb2NhbGVzIH0gZnJvbSAnLi96aC1DTidcclxuXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyAqL1xyXG5leHBvcnQgY29uc3QgWkhfVFc6IElMb2NhbGVzID0ge1xyXG4gIFVQTE9BRF9GQUlMRUQ6ICfkuIrlgrPlpLHmlZcnLFxyXG4gIENIRUNLX1NFVFRJTkdTOiAn6KuL5qqi5p+l5L2g55qE6Kit5a6a5piv5ZCm5q2j56K6JyxcclxuICBDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSzogJ+iri+aqouafpeS9oOeahOioreWumuWPiue2sui3rycsXHJcbiAgVVBMT0FEX0ZBSUxFRF9SRUFTT046ICfpjK/oqqTnorzvvJoke2NvZGV977yM6KuL5omT6ZaL54CP6Ka95Zmo6LK85LiK5Zyw5Z2A5p+l55yL55u46Zec5Y6f5ZugJyxcclxuICBTRVJWRVJfRVJST1I6ICfkvLrmnI3lmajlh7rpjK/vvIzoq4vph43oqaYnLFxyXG4gIEFVVEhfRkFJTEVEOiAn6KqN6K2J5aSx5pWXJyxcclxuXHJcbiAgLy8gc21tc1xyXG4gIFBJQ0JFRF9TTU1TOiAnU00uTVMnLFxyXG4gIFBJQ0JFRF9TTU1TX1RPS0VOOiAn6Kit5a6aVG9rZW4nLFxyXG4gIFBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU46ICflgpnnlKjkuIrlgrPntrLlnYAnLFxyXG4gIFBJQ0JFRF9TTU1TX01FU1NBR0VfQkFDS1VQX0RPTUFJTjogJ+S+i+WmgiBzbW1zLmFwcCcsXHJcblxyXG4gIC8vIGxvY2FsXHJcbiAgUElDQkVEX0xPQ0FMOiAn5pys5ZywJyxcclxuICBQSUNCRURfTE9DQUxfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX0xPQ0FMX01FU1NBR0VfUEFUSDogJ+S+i+WmgiAvdXNyL2xvY2FsL2ltYWdlcy8nLFxyXG4gIFBJQ0JFRF9MT0NBTF9DVVNUT01VUkw6ICfoqK3lrproh6roqILntrLlnYAnLFxyXG4gIFBJQ0JFRF9MT0NBTF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+WmgiBodHRwczovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfTE9DQUxfV0VCUEFUSDogJ+ioreWumue2suWdgOi3r+W+kScsXHJcbiAgUElDQkVEX0xPQ0FMX01FU1NBR0VfV0VCUEFUSDogJ+eUqOS6jue2sumggemhr+ekuueahOi3r+W+kScsXHJcblxyXG4gIC8vIEFsaS1jbG91ZFxyXG4gIFBJQ0JFRF9BTElDTE9VRDogJ+mYv+mHjOS6kU9TUycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEOiAn6Kit5a6aS2V5SWQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVQ6ICfoqK3lrppLZXlTZWNyZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9CVUNLRVQ6ICfoqK3lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BUkVBOiAn6Kit5a6a5YSy5a2Y5Y2A5Z+fJyxcclxuICBQSUNCRURfQUxJQ0xPVURfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTDogJ+ioreWumuiHquiogue2suWdgCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX09QVElPTlM6ICfoqK3lrprntrLlnYDlvozntrQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJpvc3MtY24tYmVpamluZycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP3gtb3NzLXByb2Nlc3M9eHh4JyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gVGVuY2VudC1jbG91ZFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVUQ6ICfpqLDoqIrkupFDT1MnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTjogJ0NPU+eJiOacrCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRDogJ+ioreWumlNlY3JldElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogJ+ioreWumlNlY3JldEtleScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRDogJ+ioreWumkFwcElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVDogJ+ioreWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiAn6Kit5a6a5YSy5a2Y5Y2A5Z+fJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0VORFBPSU5UOiAn6Kit5a6a5o6l5YWl6bueJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUzogJ+ioreWumue2suWdgOW+jOe2tCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6ICfoqK3lrproh6roqILntrLlnYAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRDogJ+S+i+Wmgu+8mjEyMzQ1Njc4OTAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yaYXAtYmVpamluZycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP2ltYWdlTW9ncjInLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9FTkRQT0lOVDogJ+S+i+Wmgu+8mmNvcy1pbnRlcm5hbC5hY2NlbGVyYXRlLnRlbmNlbnRjb3MuY24nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTTogJ1NldCBJbWFnZVNsaW0nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTV9USVA6ICdJbWFnZSBleHRyZW1lbHkgaW50ZWxsaWdlbnQgY29tcHJlc3Npb24sIHBsZWFzZSByZWZlciB0byB0aGUgW2RvY3VtZW50IGRlc2NyaXB0aW9uXShodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2LzQ5MjU5KScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TTElNX0NPTkZJUk06ICdPUEVOJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU1fQ0FOQ0VMOiAnQ0xPU0UnLFxyXG5cclxuICAvLyBHaXRIdWJcclxuICBQSUNCRURfR0lUSFVCOiAnR2l0SHViJyxcclxuICBQSUNCRURfR0lUSFVCX1RPS0VOOiAn6Kit5a6aVG9rZW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUkVQTzogJ+ioreWumuWAieW6q+WQjeeosScsXHJcbiAgUElDQkVEX0dJVEhVQl9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfR0lUSFVCX0JSQU5DSDogJ+ioreWumuWIhuaUr+WQjeeosScsXHJcbiAgUElDQkVEX0dJVEhVQl9DVVNUT01VUkw6ICfoqK3lrproh6roqILntrLlnYAnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPOiAn5qC85byP77yadXNlcm5hbWUvcmVwbycsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX0JSQU5DSDogJ+S+i+Wmgu+8mm1haW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gcWluaXVcclxuICBQSUNCRURfUUlOSVU6ICfkuIPniZvkupEnLFxyXG4gIFBJQ0JFRF9RSU5JVV9BQ0NFU1NLRVk6ICfoqK3lrppBY2Nlc3NLZXknLFxyXG4gIFBJQ0JFRF9RSU5JVV9TRUNSRVRLRVk6ICfoqK3lrppTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9RSU5JVV9CVUNLRVQ6ICfoqK3lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9RSU5JVV9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfUUlOSVVfVVJMOiAn6Kit5a6a6Kiq5ZWP57ay5Z2AJyxcclxuICBQSUNCRURfUUlOSVVfT1BUSU9OUzogJ+ioreWumue2suWdgOW+jOe2tCcsXHJcbiAgUElDQkVEX1FJTklVX0FSRUE6ICfoqK3lrprlhLLlrZjljYDln58nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mnowJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP2ltYWdlc2xpbScsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly94eHgueXl5LmdsYi5jbG91ZGRuLmNvbScsXHJcbiAgUElDQkVEX1RFTEVHUkFQSDogJ1RlbGVncmFwaCcsXHJcbiAgLy8gaW1ndXJcclxuICBQSUNCRURfSU1HVVI6ICdJbWd1cicsXHJcbiAgUElDQkVEX0lNR1VSX0NMSUVOVElEOiAn6Kit5a6aQ2xpZW50SWQnLFxyXG4gIFBJQ0JFRF9JTUdVUl9VU0VSTkFNRTogJ+ioreWumueUqOaItuWQjScsXHJcbiAgUElDQkVEX0lNR1VSX0FDQ0VTU19UT0tFTjogJ+ioreWummFjY2Vzc1Rva2VuJyxcclxuICBQSUNCRURfSU1HVVJfQUxCVU06ICfoqK3lrprnm7jnsL/lkI0nLFxyXG4gIFBJQ0JFRF9JTUdVUl9QUk9YWTogJ+ioreWumlBST1hZJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9DTElFTlRJRDogJ+WMv+WQjeS4iuWCs+aZguWhq+WvqycsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfVVNFUk5BTUU6ICfpnIDopoHkuIrlgrPliLDos6zmiLbmmYLloavlr6snLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX0FDQ0VTU19UT0tFTjogJ+mcgOimgeS4iuWCs+WIsOizrOaItuaZguWhq+WvqycsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfQUxCVU06ICfkvovlpoLvvJp0ZXN0JyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogJ+S+i+Wmgu+8mmh0dHA6Ly8xMjcuMC4wLjE6MTA4MCcsXHJcblxyXG4gIC8vIHVweXVuXHJcbiAgUElDQkVEX1VQWVVOOiAn5Y+I5ouN5LqRJyxcclxuICBQSUNCRURfVVBZVU5fQlVDS0VUOiAn6Kit5a6aQnVja2V0JyxcclxuICBQSUNCRURfVVBZVU5fT1BFUkFUT1I6ICfoqK3lrprmk43kvZzlk6EnLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVNTV09SRDogJ+ioreWumuaTjeS9nOWToeWvhueivCcsXHJcbiAgUElDQkVEX1VQWVVOX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9VUFlVTl9VUkw6ICfoqK3lrprliqDpgJ/ntrLlnYAnLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUFRJT05TOiAn6Kit5a6a57ay5Z2A5b6M57a0JyxcclxuICBQSUNCRURfVVBZVU5fQU5USV9MRUVDSF9UT0tFTjogJ+ioreWumumYsuebnOmPiFRva2VuJyxcclxuICBQSUNCRURfVVBZVU5fRVhQSVJFX1RJTUU6ICfoqK3lrprpgY7mnJ/mmYLplpMo56eSKScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1I6ICfkvovlpoLvvJptZScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQ6ICfovLjlhaXmk43kvZzlk6Hlr4bnorwnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTDogJ+S+i+Wmgu+8mmh0dHA6Ly94eHgudGVzdC51cGNkbi5uZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJohaW1nc2xpbScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuXHJcbiAgLy8gd2ViZGF2XHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUOiAnV2ViREFWJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfSE9TVDogJ+ioreWumkFQSeS4u+apnycsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1NTTEVOQUJMRUQ6ICfpnIDopoFIVFRQU+aZguWVn+eUqCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1VTRVJOQU1FOiAn6Kit5a6a55So5oi25ZCNJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfUEFTU1dPUkQ6ICfoqK3lrprlr4bnorwnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfQ1VTVE9NVVJMOiAn6Kit5a6a6Ieq6KiC57ay5Z2AJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfQVVUSFRZUEU6ICfoqK3lrproqo3orYnmlrnlvI8nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9XRUJTSVRFX1BBVEg6ICfoqK3lrprntrLnq5not6/lvpEnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0hPU1Q6ICfkvovlpoLvvJpodHRwczovL2V4YW1wbGUuY29tL3dlYmRhdicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfU1NMRU5BQkxFRDogJ+mcgOimgUhUVFBT5pmC5ZWf55SoJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9VU0VSTkFNRTogJ+S+i+Wmgu+8mm1lJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVNTV09SRDogJ+i8uOWFpeeUqOaItuWvhueivCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEg6ICfmi7zmjqXntrLlnYDmmYLkvb/nlKgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBzZnRwcGxpc3RcclxuICBQSUNCRURfU0ZUUFBMSVNUOiAn5YWn572uU0ZUUCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9IT1NUOiAn6Kit5a6a5Li75qmfJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1BPUlQ6ICfoqK3lrprnq6/lj6MnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfVVNFUk5BTUU6ICfoqK3lrprnlKjmiLblkI0nLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfUEFTU1dPUkQ6ICfoqK3lrprlr4bnorwnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfUFJJVkFURUtFWTogJ+ioreWumuengemRsCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9QUklWQVRFS0VZX1BBU1NQSFJBU0U6ICfoqK3lrprnp4HpkbDlr4bnorwnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfVVBMT0FEUEFUSDogJ+ioreWumuS4iuWCs+i3r+W+kScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9DVVNUT01VUkw6ICfoqK3lrproh6roqILntrLlnYAnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfV0VCU0lURV9QQVRIOiAn6Kit5a6a57ay56uZ6Lev5b6RJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX0ZJTEVfVVNFUjogJ+ioreWumuaWh+S7tueUqOaItjrntYQnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfRklMRV9NT0RFOiAn6Kit5a6a5paH5Lu25qyK6ZmQJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX0RJUl9NT0RFOiAn6Kit5a6a5paH5Lu25aS+5qyK6ZmQJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfSE9TVDogJ+S+i+Wmgu+8mjEuMS4xLjMnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9QT1JUOiAn6buY6KqNMjInLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9QUklWQVRFS0VZOiAn5L6L5aaC77yaL1VzZXJzL3h4eC8uc3NoL2lkX3JzYScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1BSSVZBVEVLRVlfUEFTU1BIUkFTRTogJ+i8uOWFpeengemRsOWvhueivCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1VQTE9BRFBBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEg6ICfmi7zmjqXntrLlnYDmmYLkvb/nlKgnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9GSUxFX1VTRVI6ICfkvovlpoLvvJp3d3c6ZGF0YScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0ZJTEVfTU9ERTogJ+S+i+Wmgu+8mjA2NjQnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9ESVJfTU9ERTogJ+S+i+Wmgu+8mjA3NzUnLFxyXG5cclxuICAvLyBQaWNMaXN0XHJcbiAgUElDQkVEX1BJQ0xJU1Q6ICdQaWNMaXN0JyxcclxuICBQSUNCRURfUElDTElTVF9IT1NUOiAn6Kit5a6a5Li75qmfJyxcclxuICBQSUNCRURfUElDTElTVF9QT1JUOiAn6Kit5a6a56uv5Y+jJyxcclxuICBQSUNCRURfUElDTElTVF9QSUNCRUQ6ICfoqK3lrprlnJbluoonLFxyXG4gIFBJQ0JFRF9QSUNMSVNUX0NPTkZJR05BTUU6ICfoqK3lrprphY3nva7lkI0nLFxyXG4gIFBJQ0JFRF9QSUNMSVNUX0tFWTogJ+ioreWumumRkuasiktleScsXHJcblxyXG4gIEJVSUxESU5fV0FURVJNQVJLX0lTQUREV0FURVJNQVJLOiAn5piv5ZCm5re75Yqg5rC05Y2wJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX0lTQUREV0FURVJNQVJLOiAn6ZyA6KaB5re75Yqg5rC05Y2w5pmC5ZWf55SoJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktUWVBFOiAn6Kit5a6a5rC05Y2w6aGe5Z6LJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1RZUEU6ICfoq4vpgbjmk4fmsLTljbDpoZ7lnosnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX0lTRlVMTFNDUkVFTldBVEVSTUFSSzogJ+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/nlKgnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNGTElQOiAn5piv5ZCm5Z6C55u057+76L2J5ZyW54mHJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTRkxPUDogJ+aYr+WQpuawtOW5s+e/u+i9ieWclueJhycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19SRVNJWkVQRVJDRU5UOiAn6Kit5a6a57iu5pS+55m+5YiG5q+UJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFUEVSQ0VOVDogJ+iri+i8uOWFpeaVsOWtlycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19TS0lQUkVTSVpFT0ZTTUFMTElNRzogJ+aYr+WQpui3s+mBjuWwj+Wclue4ruaUvicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JPVEFURTogJ+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+eiuueahOaPkuS7tuWQjeeosSdcclxufVxyXG4iLCJpbXBvcnQgeyBaSF9DTiwgdHlwZSBJTG9jYWxlc0tleSwgdHlwZSBJTG9jYWxlcyB9IGZyb20gJy4vemgtQ04nXHJcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnbG9kYXNoJ1xyXG5pbXBvcnQgeyB0eXBlIElQaWNHbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnXHJcblxyXG5pbXBvcnQgeyBPYmplY3RBZGFwdGVyLCBJMThuIH0gZnJvbSAnQHBpY2dvL2kxOG4nXHJcbmltcG9ydCB7IHR5cGUgSVN0cmluZ0tleU1hcCwgdHlwZSBJSTE4bk1hbmFnZXIgfSBmcm9tICcuLi90eXBlcy9pbmRleCdcclxuaW1wb3J0IHsgdHlwZSBJTG9jYWxlIH0gZnJvbSAnQHBpY2dvL2kxOG4vZGlzdC90eXBlcydcclxuaW1wb3J0IHsgRU4gfSBmcm9tICcuL2VuJ1xyXG5pbXBvcnQgeyBaSF9UVyB9IGZyb20gJy4vemgtVFcnXHJcblxyXG5jb25zdCBsYW5ndWFnZUxpc3Q6IElTdHJpbmdLZXlNYXA8SVN0cmluZ0tleU1hcDxzdHJpbmc+PiA9IHtcclxuICAnemgtQ04nOiBaSF9DTixcclxuICAnemgtVFcnOiBaSF9UVyxcclxuICBlbjogRU5cclxufVxyXG5cclxuY2xhc3MgSTE4bk1hbmFnZXIgaW1wbGVtZW50cyBJSTE4bk1hbmFnZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaTE4bjogSTE4blxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0QWRhcHRlcjogT2JqZWN0QWRhcHRlclxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgICB0aGlzLm9iamVjdEFkYXB0ZXIgPSBuZXcgT2JqZWN0QWRhcHRlcihsYW5ndWFnZUxpc3QpXHJcbiAgICBsZXQgbGFuZ3VhZ2UgPSB0aGlzLmN0eC5nZXRDb25maWc8c3RyaW5nPignc2V0dGluZ3MubGFuZ3VhZ2UnKSB8fCAnemgtQ04nXHJcbiAgICBpZiAoIWxhbmd1YWdlTGlzdFtsYW5ndWFnZV0pIHtcclxuICAgICAgbGFuZ3VhZ2UgPSAnemgtQ04nIC8vIHVzZSBkZWZhdWx0XHJcbiAgICB9XHJcbiAgICB0aGlzLmkxOG4gPSBuZXcgSTE4bih7XHJcbiAgICAgIGFkYXB0ZXI6IHRoaXMub2JqZWN0QWRhcHRlcixcclxuICAgICAgZGVmYXVsdExhbmd1YWdlOiBsYW5ndWFnZVxyXG4gICAgfSlcclxuICAgIHRoaXMubG9hZE91dHRlckkxOG4oKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkT3V0dGVySTE4biAoKTogdm9pZCB7XHJcbiAgICBjb25zdCBpMThuRm9sZGVyID0gdGhpcy5nZXRPdXR0ZXJJMThuRm9sZGVyKClcclxuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoaTE4bkZvbGRlciwge1xyXG4gICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXHJcbiAgICB9KVxyXG4gICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcclxuICAgICAgaWYgKGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5uYW1lLmVuZHNXaXRoKCcueW1sJykpIHtcclxuICAgICAgICBjb25zdCBpMThuRmlsZVBhdGggPSBwYXRoLmpvaW4oaTE4bkZvbGRlciwgZmlsZS5uYW1lKVxyXG4gICAgICAgIGNvbnN0IGkxOG5GaWxlID0gZnMucmVhZEZpbGVTeW5jKGkxOG5GaWxlUGF0aCwgJ3V0ZjgnKVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBpMThuRmlsZU9iaiA9IHlhbWwubG9hZChpMThuRmlsZSkgYXMgSUxvY2FsZXNcclxuICAgICAgICAgIGxhbmd1YWdlTGlzdFtmaWxlLm5hbWUucmVwbGFjZSgvXFwueW1sJC8sICcnKV0gPSBpMThuRmlsZU9ialxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE91dHRlckkxOG5Gb2xkZXIgKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBpMThuRm9sZGVyID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdpMThuLWNsaScpXHJcbiAgICBpZiAoIWZzLnBhdGhFeGlzdHNTeW5jKGkxOG5Gb2xkZXIpKSB7XHJcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoaTE4bkZvbGRlcilcclxuICAgIH1cclxuICAgIHJldHVybiBpMThuRm9sZGVyXHJcbiAgfVxyXG5cclxuICB0cmFuc2xhdGU8VCBleHRlbmRzIHN0cmluZz4oa2V5OiBJTG9jYWxlc0tleSB8IFQsIGFyZ3M/OiBJU3RyaW5nS2V5TWFwPHN0cmluZz4pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuaTE4bi50cmFuc2xhdGUoa2V5LCBhcmdzKSB8fCBrZXlcclxuICB9XHJcblxyXG4gIHNldExhbmd1YWdlIChsYW5ndWFnZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmkxOG4uc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpXHJcbiAgICB0aGlzLmN0eC5zYXZlQ29uZmlnKHtcclxuICAgICAgJ3NldHRpbmdzLmxhbmd1YWdlJzogbGFuZ3VhZ2VcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRMb2NhbGUgKGxhbmd1YWdlOiBzdHJpbmcsIGxvY2FsZXM6IElMb2NhbGUpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG9yaWdpbkxvY2FsZXMgPSB0aGlzLm9iamVjdEFkYXB0ZXIuZ2V0TG9jYWxlKGxhbmd1YWdlKVxyXG4gICAgaWYgKCFvcmlnaW5Mb2NhbGVzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gICAgY29uc3QgbmV3TG9jYWxlcyA9IG1lcmdlKG9yaWdpbkxvY2FsZXMsIGxvY2FsZXMpXHJcbiAgICB0aGlzLm9iamVjdEFkYXB0ZXIuc2V0TG9jYWxlKGxhbmd1YWdlLCBuZXdMb2NhbGVzKVxyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcblxyXG4gIGFkZExhbmd1YWdlIChsYW5ndWFnZTogc3RyaW5nLCBsb2NhbGVzOiBJTG9jYWxlKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBvcmlnaW5Mb2NhbGVzID0gdGhpcy5vYmplY3RBZGFwdGVyLmdldExvY2FsZShsYW5ndWFnZSlcclxuICAgIGlmIChvcmlnaW5Mb2NhbGVzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gICAgdGhpcy5vYmplY3RBZGFwdGVyLnNldExvY2FsZShsYW5ndWFnZSwgbG9jYWxlcylcclxuICAgIGxhbmd1YWdlTGlzdFtsYW5ndWFnZV0gPSBsb2NhbGVzXHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgZ2V0TGFuZ3VhZ2VMaXN0ICgpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobGFuZ3VhZ2VMaXN0KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IHtcclxuICBJMThuTWFuYWdlclxyXG59XHJcbiIsImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xyXG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnb3MnXHJcbmltcG9ydCBDb21tYW5kZXIgZnJvbSAnLi4vbGliL0NvbW1hbmRlcidcclxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbGliL0xvZ2dlcidcclxuaW1wb3J0IExpZmVjeWNsZSBmcm9tICcuL0xpZmVjeWNsZSdcclxuaW1wb3J0IExpZmVjeWNsZVBsdWdpbnMsIHsgc2V0Q3VycmVudFBsdWdpbk5hbWUgfSBmcm9tICcuLi9saWIvTGlmZWN5Y2xlUGx1Z2lucydcclxuaW1wb3J0IHVwbG9hZGVycyBmcm9tICcuLi9wbHVnaW5zL3VwbG9hZGVyJ1xyXG5pbXBvcnQgdHJhbnNmb3JtZXJzIGZyb20gJy4uL3BsdWdpbnMvdHJhbnNmb3JtZXInXHJcbmltcG9ydCBQbHVnaW5Mb2FkZXIgZnJvbSAnLi4vbGliL1BsdWdpbkxvYWRlcidcclxuaW1wb3J0IHsgZ2V0LCBzZXQsIHVuc2V0IH0gZnJvbSAnbG9kYXNoJ1xyXG5pbXBvcnQgeyB0eXBlIElIZWxwZXIsIHR5cGUgSUltZ0luZm8sIHR5cGUgSUNvbmZpZywgdHlwZSBJUGljR28sIHR5cGUgSVN0cmluZ0tleU1hcCwgdHlwZSBJUGx1Z2luTG9hZGVyLCB0eXBlIElJMThuTWFuYWdlciwgdHlwZSBJUGljR29QbHVnaW4sIHR5cGUgSVBpY0dvUGx1Z2luSW50ZXJmYWNlLCB0eXBlIElSZXF1ZXN0IH0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCBnZXRDbGlwYm9hcmRJbWFnZSBmcm9tICcuLi91dGlscy9nZXRDbGlwYm9hcmRJbWFnZSdcclxuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi4vbGliL1JlcXVlc3QnXHJcbmltcG9ydCBEQiBmcm9tICcuLi91dGlscy9kYidcclxuaW1wb3J0IFBsdWdpbkhhbmRsZXIgZnJvbSAnLi4vbGliL1BsdWdpbkhhbmRsZXInXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQsIElCdXNFdmVudCB9IGZyb20gJy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IGV2ZW50QnVzIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnRCdXMnXHJcbmltcG9ydCB7IGlzQ29uZmlnS2V5SW5CbGFja0xpc3QsIGlzSW5wdXRDb25maWdWYWxpZCB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IHsgSTE4bk1hbmFnZXIgfSBmcm9tICcuLi9pMThuJ1xyXG5cclxuZXhwb3J0IGNsYXNzIFBpY0dvIGV4dGVuZHMgRXZlbnRFbWl0dGVyIGltcGxlbWVudHMgSVBpY0dvIHtcclxuICBwcml2YXRlIF9jb25maWchOiBJQ29uZmlnXHJcbiAgcHJpdmF0ZSBsaWZlY3ljbGUhOiBMaWZlY3ljbGVcclxuICBwcml2YXRlIGRiITogREJcclxuICBwcml2YXRlIF9wbHVnaW5Mb2FkZXIhOiBQbHVnaW5Mb2FkZXJcclxuICBjb25maWdQYXRoOiBzdHJpbmdcclxuICBiYXNlRGlyITogc3RyaW5nXHJcbiAgaGVscGVyITogSUhlbHBlclxyXG4gIGxvZzogTG9nZ2VyXHJcbiAgY21kOiBDb21tYW5kZXJcclxuICBvdXRwdXQ6IElJbWdJbmZvW11cclxuICBpbnB1dDogYW55W11cclxuICByYXdJbnB1dDogYW55W11cclxuICBwbHVnaW5IYW5kbGVyOiBQbHVnaW5IYW5kbGVyXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgd2lsbCBiZSByZW1vdmVkIGluIHYxLjUuMCtcclxuICAgKlxyXG4gICAqIHVzZSByZXF1ZXN0IGluc3RlYWRcclxuICAgKi9cclxuICBSZXF1ZXN0ITogUmVxdWVzdFxyXG4gIGkxOG4hOiBJSTE4bk1hbmFnZXJcclxuICBWRVJTSU9OOiBzdHJpbmcgPSBwcm9jZXNzLmVudi5QSUNHT19WRVJTSU9OXHJcbiAgR1VJX1ZFUlNJT04/OiBzdHJpbmdcclxuXHJcbiAgZ2V0IHBsdWdpbkxvYWRlciAoKTogSVBsdWdpbkxvYWRlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGx1Z2luTG9hZGVyXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvciAoY29uZmlnUGF0aDogc3RyaW5nID0gJycpIHtcclxuICAgIHN1cGVyKClcclxuICAgIHRoaXMuY29uZmlnUGF0aCA9IGNvbmZpZ1BhdGhcclxuICAgIHRoaXMub3V0cHV0ID0gW11cclxuICAgIHRoaXMuaW5wdXQgPSBbXVxyXG4gICAgdGhpcy5yYXdJbnB1dCA9IFtdXHJcbiAgICB0aGlzLmhlbHBlciA9IHtcclxuICAgICAgdHJhbnNmb3JtZXI6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCd0cmFuc2Zvcm1lcicpLFxyXG4gICAgICB1cGxvYWRlcjogbmV3IExpZmVjeWNsZVBsdWdpbnMoJ3VwbG9hZGVyJyksXHJcbiAgICAgIGJlZm9yZVRyYW5zZm9ybVBsdWdpbnM6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCdiZWZvcmVUcmFuc2Zvcm1QbHVnaW5zJyksXHJcbiAgICAgIGJlZm9yZVVwbG9hZFBsdWdpbnM6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCdiZWZvcmVVcGxvYWRQbHVnaW5zJyksXHJcbiAgICAgIGFmdGVyVXBsb2FkUGx1Z2luczogbmV3IExpZmVjeWNsZVBsdWdpbnMoJ2FmdGVyVXBsb2FkUGx1Z2lucycpXHJcbiAgICB9XHJcbiAgICB0aGlzLmluaXRDb25maWdQYXRoKClcclxuICAgIHRoaXMubG9nID0gbmV3IExvZ2dlcih0aGlzKVxyXG4gICAgdGhpcy5jbWQgPSBuZXcgQ29tbWFuZGVyKHRoaXMpXHJcbiAgICB0aGlzLnBsdWdpbkhhbmRsZXIgPSBuZXcgUGx1Z2luSGFuZGxlcih0aGlzKVxyXG4gICAgdGhpcy5pbml0Q29uZmlnKClcclxuICAgIHRoaXMuaW5pdCgpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRDb25maWdQYXRoICgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1BhdGggPT09ICcnKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnUGF0aCA9IGhvbWVkaXIoKSArICcvLnBpY2xpc3QvY29uZmlnLmpzb24nXHJcbiAgICB9XHJcbiAgICBpZiAocGF0aC5leHRuYW1lKHRoaXMuY29uZmlnUGF0aCkudG9VcHBlckNhc2UoKSAhPT0gJy5KU09OJykge1xyXG4gICAgICB0aGlzLmNvbmZpZ1BhdGggPSAnJ1xyXG4gICAgICB0aHJvdyBFcnJvcignVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBvbmx5IHN1cHBvcnRzIEpTT04gZm9ybWF0LicpXHJcbiAgICB9XHJcbiAgICB0aGlzLmJhc2VEaXIgPSBwYXRoLmRpcm5hbWUodGhpcy5jb25maWdQYXRoKVxyXG4gICAgY29uc3QgZXhpc3QgPSBmcy5wYXRoRXhpc3RzU3luYyh0aGlzLmNvbmZpZ1BhdGgpXHJcbiAgICBpZiAoIWV4aXN0KSB7XHJcbiAgICAgIGZzLmVuc3VyZUZpbGVTeW5jKGAke3RoaXMuY29uZmlnUGF0aH1gKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q29uZmlnICgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGIgPSBuZXcgREIodGhpcylcclxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuZGIucmVhZCh0cnVlKSBhcyBJQ29uZmlnXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQgKCk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gaW5pdCAxOG4gYXQgZmlyc3RcclxuICAgICAgdGhpcy5pMThuID0gbmV3IEkxOG5NYW5hZ2VyKHRoaXMpXHJcbiAgICAgIHRoaXMuUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHRoaXMpXHJcbiAgICAgIHRoaXMuX3BsdWdpbkxvYWRlciA9IG5ldyBQbHVnaW5Mb2FkZXIodGhpcylcclxuICAgICAgLy8gbG9hZCBzZWxmIHBsdWdpbnNcclxuICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUoJ3BpY2dvJylcclxuICAgICAgdXBsb2FkZXJzKHRoaXMpLnJlZ2lzdGVyKHRoaXMpXHJcbiAgICAgIHRyYW5zZm9ybWVycyh0aGlzKS5yZWdpc3Rlcih0aGlzKVxyXG4gICAgICBzZXRDdXJyZW50UGx1Z2luTmFtZSgnJylcclxuICAgICAgLy8gbG9hZCB0aGlyZC1wYXJ0eSBwbHVnaW5zXHJcbiAgICAgIHRoaXMuX3BsdWdpbkxvYWRlci5sb2FkKClcclxuICAgICAgdGhpcy5saWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlKHRoaXMpXHJcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgdGhpcy5lbWl0KElCdWlsZEluRXZlbnQuVVBMT0FEX1BST0dSRVNTLCAtMSlcclxuICAgICAgdGhpcy5sb2cuZXJyb3IoZSlcclxuICAgICAgdGhyb3cgZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZWFzaWx5IG1hbm51YWxseSBsb2FkIGEgcGx1Z2luXHJcbiAgICogaWYgcHJvdmlkZSBwbHVnaW4gbmFtZSwgd2lsbCByZWdpc3RlciBwbHVnaW4gYnkgbmFtZVxyXG4gICAqIG9yIGp1c3QgaW5zdGFudGlhdGUgYSBwbHVnaW5cclxuICAgKi9cclxuICB1c2UgKHBsdWdpbjogSVBpY0dvUGx1Z2luLCBuYW1lPzogc3RyaW5nKTogSVBpY0dvUGx1Z2luSW50ZXJmYWNlIHtcclxuICAgIGlmIChuYW1lKSB7XHJcbiAgICAgIHRoaXMucGx1Z2luTG9hZGVyLnJlZ2lzdGVyUGx1Z2luKG5hbWUsIHBsdWdpbilcclxuICAgICAgcmV0dXJuIHRoaXMucGx1Z2luTG9hZGVyLmdldFBsdWdpbihuYW1lKSFcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGx1Z2luKHRoaXMpXHJcbiAgICAgIHJldHVybiBwbHVnaW5JbnN0YW5jZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJDb21tYW5kcyAoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb25maWdQYXRoICE9PSAnJykge1xyXG4gICAgICB0aGlzLmNtZC5pbml0KClcclxuICAgICAgdGhpcy5jbWQubG9hZENvbW1hbmRzKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENvbmZpZzxUPiAobmFtZT86IHN0cmluZyk6IFQge1xyXG4gICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jb25maWcgYXMgdW5rbm93biBhcyBUXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZ2V0KHRoaXMuX2NvbmZpZywgbmFtZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhdmVDb25maWcgKGNvbmZpZzogSVN0cmluZ0tleU1hcDxhbnk+KTogdm9pZCB7XHJcbiAgICBpZiAoIWlzSW5wdXRDb25maWdWYWxpZChjb25maWcpKSB7XHJcbiAgICAgIHRoaXMubG9nLndhcm4oJ3RoZSBmb3JtYXQgb2YgY29uZmlnIGlzIGludmFsaWQsIHBsZWFzZSBwcm92aWRlIG9iamVjdCcpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRDb25maWcoY29uZmlnKVxyXG4gICAgdGhpcy5kYi5zYXZlQ29uZmlnKGNvbmZpZylcclxuICB9XHJcblxyXG4gIHJlbW92ZUNvbmZpZyAoa2V5OiBzdHJpbmcsIHByb3BOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICgha2V5IHx8ICFwcm9wTmFtZSkgcmV0dXJuXHJcbiAgICBpZiAoaXNDb25maWdLZXlJbkJsYWNrTGlzdChrZXkpKSB7XHJcbiAgICAgIHRoaXMubG9nLndhcm4oYHRoZSBjb25maWcuJHtrZXl9IGNhbid0IGJlIHJlbW92ZWRgKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMudW5zZXRDb25maWcoa2V5LCBwcm9wTmFtZSlcclxuICAgIHRoaXMuZGIudW5zZXQoa2V5LCBwcm9wTmFtZSlcclxuICB9XHJcblxyXG4gIHNldENvbmZpZyAoY29uZmlnOiBJU3RyaW5nS2V5TWFwPGFueT4pOiB2b2lkIHtcclxuICAgIGlmICghaXNJbnB1dENvbmZpZ1ZhbGlkKGNvbmZpZykpIHtcclxuICAgICAgdGhpcy5sb2cud2FybigndGhlIGZvcm1hdCBvZiBjb25maWcgaXMgaW52YWxpZCwgcGxlYXNlIHByb3ZpZGUgb2JqZWN0JylcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoaXNDb25maWdLZXlJbkJsYWNrTGlzdChuYW1lKSkge1xyXG4gICAgICAgIHRoaXMubG9nLndhcm4oYHRoZSBjb25maWcuJHtuYW1lfSBjYW4ndCBiZSBtb2RpZmllZGApXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxyXG4gICAgICAgIGRlbGV0ZSBjb25maWdbbmFtZV1cclxuICAgICAgfVxyXG4gICAgICBzZXQodGhpcy5fY29uZmlnLCBuYW1lLCBjb25maWdbbmFtZV0pXHJcbiAgICAgIGV2ZW50QnVzLmVtaXQoSUJ1c0V2ZW50LkNPTkZJR19DSEFOR0UsIHtcclxuICAgICAgICBjb25maWdOYW1lOiBuYW1lLFxyXG4gICAgICAgIHZhbHVlOiBjb25maWdbbmFtZV1cclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB1bnNldENvbmZpZyAoa2V5OiBzdHJpbmcsIHByb3BOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICgha2V5IHx8ICFwcm9wTmFtZSkgcmV0dXJuXHJcbiAgICBpZiAoaXNDb25maWdLZXlJbkJsYWNrTGlzdChrZXkpKSB7XHJcbiAgICAgIHRoaXMubG9nLndhcm4oYHRoZSBjb25maWcuJHtrZXl9IGNhbid0IGJlIHVuc2V0YClcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB1bnNldCh0aGlzLmdldENvbmZpZyhrZXkpLCBwcm9wTmFtZSlcclxuICB9XHJcblxyXG4gIGdldCByZXF1ZXN0ICgpOiBJUmVxdWVzdFsncmVxdWVzdCddIHtcclxuICAgIHJldHVybiB0aGlzLlJlcXVlc3QucmVxdWVzdC5iaW5kKHRoaXMuUmVxdWVzdClcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwbG9hZCAoaW5wdXQ/OiBhbnlbXSk6IFByb21pc2U8SUltZ0luZm9bXSB8IEVycm9yPiB7XHJcbiAgICBpZiAodGhpcy5jb25maWdQYXRoID09PSAnJykge1xyXG4gICAgICB0aGlzLmxvZy5lcnJvcignVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBvbmx5IHN1cHBvcnRzIEpTT04gZm9ybWF0LicpXHJcbiAgICAgIHJldHVybiBbXVxyXG4gICAgfVxyXG4gICAgLy8gdXBsb2FkIGZyb20gY2xpcGJvYXJkXHJcbiAgICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCB8fCBpbnB1dC5sZW5ndGggPT09IDApIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCB7IGltZ1BhdGgsIHNob3VsZEtlZXBBZnRlclVwbG9hZGluZyB9ID0gYXdhaXQgZ2V0Q2xpcGJvYXJkSW1hZ2UodGhpcylcclxuICAgICAgICBpZiAoaW1nUGF0aCA9PT0gJ25vIGltYWdlJykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbWFnZSBub3QgZm91bmQgaW4gY2xpcGJvYXJkJylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5vbmNlKElCdWlsZEluRXZlbnQuRkFJTEVELCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nKSB7XHJcbiAgICAgICAgICAgICAgLy8g5Yig6ZmkIHBpY2dvIOeUn+aIkOeahOWbvueJh+aWh+S7tu+8jOS+i+WmgiBgfi8ucGljZ28vMjAyMDA2MjEyMDU3MjAucG5nYFxyXG4gICAgICAgICAgICAgIGZzLnJlbW92ZShpbWdQYXRoKS5jYXRjaCgoZSkgPT4geyB0aGlzLmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhpcy5vbmNlKCdmaW5pc2hlZCcsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcpIHtcclxuICAgICAgICAgICAgICBmcy5yZW1vdmUoaW1nUGF0aCkuY2F0Y2goKGUpID0+IHsgdGhpcy5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSBhd2FpdCB0aGlzLmxpZmVjeWNsZS5zdGFydChbaW1nUGF0aF0pXHJcbiAgICAgICAgICByZXR1cm4gb3V0cHV0XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCBlKVxyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gdXBsb2FkIGZyb20gcGF0aFxyXG4gICAgICBjb25zdCB7IG91dHB1dCB9ID0gYXdhaXQgdGhpcy5saWZlY3ljbGUuc3RhcnQoaW5wdXQpXHJcbiAgICAgIHJldHVybiBvdXRwdXRcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbInBsdWdpbkhhbmRsZXIiLCJoYW5kbGUiLCJjdHgiLCJjbWQiLCJwcm9ncmFtIiwiY29tbWFuZCIsImRlc2NyaXB0aW9uIiwiYWxpYXMiLCJvcHRpb24iLCJhY3Rpb24iLCJwbHVnaW5zIiwicHJveHkiLCJyZWdpc3RyeSIsIm9wdGlvbnMiLCJpbnN0YWxsIiwiY2F0Y2giLCJlIiwibG9nIiwiZXJyb3IiLCJ1bmluc3RhbGwiLCJ1cGRhdGUiLCJjb25maWciLCJyYW5kb21TdHJpbmdHZW5lcmF0b3IiLCJsZW5ndGgiLCJjaGFycyIsIkFycmF5IiwiZnJvbSIsIm1hcCIsImNoYXJBdCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImpvaW4iLCJyZW5hbWVGaWxlTmFtZVdpdGhUaW1lc3RhbXAiLCJvbGROYW1lIiwiRGF0ZSIsIm5vdyIsInBhdGgiLCJleHRuYW1lIiwicmVuYW1lRmlsZU5hbWVXaXRoUmFuZG9tU3RyaW5nIiwicmVuYW1lRmlsZU5hbWVXaXRoQ3VzdG9tU3RyaW5nIiwiY3VzdG9tRm9ybWF0IiwiYWZmaXhGaWxlTmFtZSIsImNvbnZlcnNpb25NYXAiLCJnZXRGdWxsWWVhciIsInRvU3RyaW5nIiwic2xpY2UiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiY3J5cHRvIiwiY3JlYXRlSGFzaCIsImJhc2VuYW1lIiwiZGlnZXN0IiwidXVpZHY0IiwicmVwbGFjZSIsInVuZGVmaW5lZCIsIk9iamVjdCIsImtleXMiLCJzb21lIiwiaXRlbSIsImluY2x1ZGVzIiwiZXh0IiwibmV3TmFtZSIsInJlZHVjZSIsImFjYyIsImN1ciIsIlJlZ0V4cCIsIl9yZXN1bHQiLCJrZXkiLCJjb3VudCIsIm1heCIsImRpcm5hbWUiLCJzcGxpdCIsInNlcCIsImEiLCJiIiwiaXNVcmwiLCJ1cmwiLCJ0ZXN0IiwiaXNVcmxFbmNvZGUiLCJkZWNvZGVVUkkiLCJoYW5kbGVVcmxFbmNvZGUiLCJlbmNvZGVVUkkiLCJnZXRJbWFnZVNpemUiLCJmaWxlIiwid2lkdGgiLCJoZWlnaHQiLCJ0eXBlIiwiaW1hZ2VTaXplIiwicmVhbCIsImdldEZTRmlsZSIsImFzeW5jIiwiZmlsZVBhdGgiLCJmaWxlTmFtZSIsImJ1ZmZlciIsImZzIiwicmVhZEZpbGUiLCJzdWNjZXNzIiwiX2EiLCJyZWFzb24iLCJnZXRVUkxGaWxlIiwidGltZW91dElkIiwicmVxdWVzdEZuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZXMiLCJyZXF1ZXN0IiwibWV0aG9kIiwicmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2UiLCJyZXNwb25zZVR5cGUiLCJ0aGVuIiwicmVzcCIsImRhdGEiLCJjbGVhclRpbWVvdXQiLCJ1cmxQYXRoIiwiVVJMIiwicGF0aG5hbWUiLCJzZWFyY2hQYXJhbXMiLCJnZXQiLCJzdGFydHNXaXRoIiwibWVzc2FnZSIsInRpbWVvdXRQcm9taXNlIiwic2V0VGltZW91dCIsInJhY2UiLCJnZXRQbHVnaW5OYW1lVHlwZSIsIm5hbWUiLCJpc1NpbXBsZU5hbWUiLCJuYW1lT3JQYXRoIiwiaXNBYnNvbHV0ZSIsInBsdWdpblBhdGgiLCJwcm9jZXNzIiwiY3dkIiwiZXhpc3RzU3luYyIsImhhbmRsZVN0cmVhbWxpbmVQbHVnaW5OYW1lIiwiaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lIiwic2NvcGUiLCJnZXRQcm9jZXNzUGx1Z2luTmFtZSIsImxvZ2dlciIsImNvbnNvbGUiLCJoYW5kbGVVbml4U3R5bGVQYXRoIiwid2FybiIsImdldE5vcm1hbFBsdWdpbk5hbWUiLCJyZW1vdmVQbHVnaW5WZXJzaW9uIiwicGFja2FnZUpTT05QYXRoIiwicG9zaXgiLCJwa2ciLCJyZWFkSlNPTlN5bmMiLCJwYXRoU3RyIiwicmVnIiwibWF0Y2hBcnIiLCJtYXRjaCIsImNvbmZpZ0JsYWNrTGlzdCIsImlzQ29uZmlnS2V5SW5CbGFja0xpc3QiLCJibGFja0l0ZW0iLCJpc0lucHV0Q29uZmlnVmFsaWQiLCJpc0FycmF5Iiwic2FmZVBhcnNlIiwic3RyIiwiSlNPTiIsInBhcnNlIiwiZm9yY2VOdW1iZXIiLCJudW0iLCJpc05hTiIsIk51bWJlciIsImlzRGV2IiwiZW52IiwiTk9ERV9FTlYiLCJpc1Byb2QiLCJ0ZXh0MlNWRyIsImRlZmF1bHRXYXRlcm1hcmtGb250UGF0aCIsInRleHQiLCJjb2xvciIsImZvbnRGYW1pbHkiLCJhbmNob3IiLCJhdHRyaWJ1dGVzIiwiZmlsbCIsInRleHRTVkciLCJUZXh0VG9TVkciLCJsb2FkU3luYyIsImdldFNWRyIsIkJ1ZmZlciIsImRlZmF1bHRXYXRlcm1hcmtJbWFnZVBhdGgiLCJfX2Rpcm5hbWUiLCJBZGRXYXRlcm1hcmsiLCJpbWciLCJ3YXRlcm1hcmtUeXBlIiwiaXNGdWxsU2NyZWVuV2F0ZXJtYXJrIiwid2F0ZXJtYXJrRGVncmVlIiwid2F0ZXJtYXJrRm9udFBhdGgiLCJ3YXRlcm1hcmtTY2FsZVJhdGlvIiwid2F0ZXJtYXJrQ29sb3IiLCJ3YXRlcm1hcmtJbWFnZVBhdGgiLCJwb3NpdGlvbiIsImltYWdlIiwic2hhcnAiLCJhbmltYXRlZCIsImltZ1dpZHRoIiwibWV0YWRhdGEiLCJ3YXRlcm1hcmsiLCJjcmVhdGVXYXRlcm1hcmsiLCJjb21wb3NpdGUiLCJpbnB1dCIsImdyYXZpdHkiLCJ0aWxlIiwidG9CdWZmZXIiLCJ3YXRlcm1hcmtXaWR0aCIsIndhdGVybWFya0hlaWdodCIsImdldFNpemUiLCJ3YXRlcm1hcmtSZXNpemVXaWR0aCIsIndhdGVybWFya1Jlc2l6ZUhlaWdodCIsInJlc2l6ZSIsImZpdCIsInJvdGF0ZSIsImJhY2tncm91bmQiLCJyIiwiZyIsImFscGhhIiwidmFsaWRQYXJhbSIsInBhcmFtcyIsImV2ZXJ5IiwicGFyYW0iLCJhdmFpbGFibGVDb252ZXJ0Rm9ybWF0TGlzdCIsInZhbGlkT3V0cHV0Rm9ybWF0IiwiZm9ybWF0IiwiaW1hZ2VFeHRMaXN0IiwiaW1hZ2VBZGRXYXRlck1hcmsiLCJ3YXRlcm1hcmtUZXh0Iiwid2F0ZXJtYXJrUG9zaXRpb24iLCJmb3JtYXRPcHRpb25zIiwicXVhbGl0eSIsImlzQ29udmVydCIsImNvbnZlcnRGb3JtYXQiLCJpc1JlU2l6ZSIsInJlU2l6ZUhlaWdodCIsInJlU2l6ZVdpZHRoIiwic2tpcFJlU2l6ZU9mU21hbGxJbWciLCJpc1JlU2l6ZUJ5UGVyY2VudCIsInJlU2l6ZVBlcmNlbnQiLCJpc1JvdGF0ZSIsImlzRmxpcCIsImlzRmxvcCIsInJvdGF0ZURlZ3JlZSIsInBpY0JlZCIsImltYWdlUHJvY2VzcyIsInJhd0Zvcm1hdCIsInRvTG93ZXJDYXNlIiwiaW1hZ2VXaWR0aCIsImltYWdlSGVpZ2h0Iiwicm91bmQiLCJzY2FsZVJhdGlvIiwiZmxpcCIsImZsb3AiLCJuZXdGb3JtYXQiLCJ0b0Zvcm1hdCIsImltYWdlRm9ybWF0TGlzdCIsIm5lZWRBZGRXYXRlcm1hcmsiLCJ3YXRlcm1hcmtPcHRpb25zIiwiZmlsZUV4dCIsImlzQWRkV2F0ZXJtYXJrIiwibmVlZENvbXByZXNzIiwiY29tcHJlc3NPcHRpb25zIiwibm9ybWFsaXplZEV4dCIsInJlbW92ZUV4aWYiLCJ1cGxvYWQiLCJhcmd1bWVudHMiLCJpbnB1dExpc3QiLCJmaWx0ZXIiLCJleGlzdCIsInVzZXJDb25maWciLCJnZXRDb25maWciLCJpMThuIiwidHJhbnNsYXRlIiwicmVxdWlyZWQiLCJkZWZhdWx0IiwiY2hvaWNlcyIsImlzUmVtb3ZlRXhpZiIsImNvbXByZXNzIiwiZW5hYmxlIiwicmVuYW1lIiwiaGFuZGxlQ29uZmlnIiwicHJvbXB0cyIsIm1vZHVsZSIsImFuc3dlciIsImlucXVpcmVyIiwicHJvbXB0IiwiY29uZmlnTmFtZSIsInNhdmVDb25maWciLCJzZXR0aW5nIiwiYnVpbGRpbiIsImhlbHBlciIsImdldElkTGlzdCIsInBsdWdpbkxvYWRlciIsImdldFBsdWdpbiIsImdldEZ1bGxMaXN0IiwiX2IiLCJwbHVnaW4iLCJpbmZvIiwiYXJndiIsInVzZSIsInVwbG9hZGVyIiwidHJhbnNmb3JtZXIiLCJwdXNoIiwiZm9yRWFjaCIsInBpY2dvUGx1Z2lucyIsInNldENvbmZpZyIsImdlbmVyYXRlIiwib3B0cyIsImdldE9wdGlvbnMiLCJ0bXAiLCJzb3VyY2UiLCJhbnN3ZXJzIiwiX2ZpbGVzIiwiZ2xvYmJ5IiwiZG90IiwiZ2xvYiIsImZpbHRlcnMiLCJmaWxlcyIsInJlbmRlciIsIndyaXRlRmlsZVRyZWUiLCJkZXN0IiwiY29tcGxldGUiLCJjb21wbGV0ZU1lc3NhZ2UiLCJleHAiLCJmbiIsIkZ1bmN0aW9uIiwic3RyaW5naWZ5IiwidGVtcGxhdGVQYXRoIiwib3B0aW9uc1BhdGgiLCJyZXF1aXJlIiwiZmlsZVRyZWUiLCJyZWFkRmlsZVN5bmMiLCJjb250ZW50IiwiZWpzIiwiaXNCdWZmZXIiLCJkaXIiLCJlbnN1cmVEaXJTeW5jIiwid3JpdGVGaWxlU3luYyIsInJ1biIsIm9mZmxpbmUiLCJ0ZW1wbGF0ZSIsImhhc1NsYXNoIiwiZG93bmxvYWRBbmRHZW5lcmF0ZSIsInJtIiwic3luYyIsImRvd25sb2FkIiwiY2xvbmUiLCJlcnIiLCJpbml0IiwicHJvamVjdCIsImluUGxhY2UiLCJob21lZGlyIiwib2siLCJvbiIsImNoYWxrIiwiZ3JheSIsImxhbmciLCJsaXN0IiwiZ2V0TGFuZ3VhZ2VMaXN0Iiwic2V0TGFuZ3VhZ2UiLCJjb21tYW5kZXJzIiwicmVnaXN0ZXIiLCJMaWZlY3ljbGVQbHVnaW5zIiwiY29uc3RydWN0b3IiLCJ0aGlzIiwiTWFwIiwicGx1Z2luSWRNYXAiLCJpZCIsIlR5cGVFcnJvciIsImhhcyIsInNldCIsImN1cnJlbnRQbHVnaW4iLCJ1bnJlZ2lzdGVyIiwicGx1Z2luTmFtZSIsInBsdWdpbkxpc3QiLCJkZWxldGUiLCJnZXROYW1lIiwiZ2V0TGlzdCIsInZhbHVlcyIsInNldEN1cnJlbnRQbHVnaW5OYW1lIiwiZ2V0Q3VycmVudFBsdWdpbk5hbWUiLCJDb21tYW5kZXIiLCJDb21tYW5kIiwidmVyc2lvbiIsImRlYnVnIiwic2lsZW50IiwiYXJncyIsImV4aXQiLCJjdXJyZW50UGx1Z2luTmFtZSIsImxvYWRDb21tYW5kcyIsIklMb2dUeXBlIiwiSUJ1aWxkSW5FdmVudCIsIklCdXNFdmVudCIsIkxvZ2dlciIsImxldmVsIiwiaGFuZGxlTG9nIiwibXNnIiwibG9nTGV2ZWwiLCJjaGVja0xvZ0xldmVsIiwibG9nSGVhZGVyIiwidG9VcHBlckNhc2UiLCJsb2dQYXRoIiwiYmFzZURpciIsInJlc3VsdCIsImNoZWNrTG9nRmlsZUlzTGFyZ2UiLCJpc0xhcmdlIiwid2FybmluZ01zZyIsInllbGxvdyIsInJlY3JlYXRlTG9nRmlsZSIsInVuc2hpZnQiLCJoYW5kbGVXcml0ZUxvZyIsImxvZ0ZpbGVTaXplIiwic3RhdFN5bmMiLCJzaXplIiwibG9nRmlsZVNpemVMaW1pdCIsInVubGlua1N5bmMiLCJjcmVhdGVGaWxlU3luYyIsImRheWpzIiwiRXJyb3IiLCJ1dGlsIiwic3RhY2siLCJhcHBlbmRGaWxlU3luYyIsImNyZWF0ZUNvbnRleHQiLCJjb25maWdQYXRoIiwib3V0cHV0IiwicmF3SW5wdXQiLCJSZXF1ZXN0IiwiVkVSU0lPTiIsIkdVSV9WRVJTSU9OIiwiYmluZCIsInJlbW92ZUNvbmZpZyIsInVuc2V0Q29uZmlnIiwiYWRkTGlzdGVuZXIiLCJvbmNlIiwicmVtb3ZlTGlzdGVuZXIiLCJvZmYiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJzZXRNYXhMaXN0ZW5lcnMiLCJnZXRNYXhMaXN0ZW5lcnMiLCJsaXN0ZW5lcnMiLCJyYXdMaXN0ZW5lcnMiLCJlbWl0IiwibGlzdGVuZXJDb3VudCIsInByZXBlbmRMaXN0ZW5lciIsInByZXBlbmRPbmNlTGlzdGVuZXIiLCJldmVudE5hbWVzIiwiTGlmZWN5Y2xlIiwiRXZlbnRFbWl0dGVyIiwic3VwZXIiLCJ0dGZMaW5rIiwidGVtcEZpbGVQYXRoIiwiaW1nRmxlUGF0aCIsImVtcHR5RGlyU3luYyIsInR0ZlBhdGgiLCJvdXRwdXREaXIiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJheGlvcyIsInJhd0lucHV0UGF0aCIsImNsb25lRGVlcCIsIndhdGVybWFya01zZyIsImNvbXByZXNzTXNnIiwiYWxsU2V0dGxlZCIsImluZGV4IiwidHJhbnNmb3JtZWRCdWZmZXIiLCJpc1NraXAiLCJkb3dubG9hZFRURiIsIl9jIiwiX2QiLCJuZXdFeHQiLCJfZSIsIl9mIiwidGVtcEZpbGUiLCJnZXRUaW1lIiwiaGVpY0J1ZmZlciIsImhlaWNSZXN1bHQiLCJoZWljQ29udmVydCIsInRlbXBIZWljQ29udmVydEZpbGUiLCJfZyIsImJlZm9yZVRyYW5zZm9ybSIsImRvVHJhbnNmb3JtIiwicmVuYW1lQ29uZmlnIiwiYmVmb3JlVXBsb2FkIiwiZG9VcGxvYWQiLCJhZnRlclVwbG9hZCIsIkZBSUxFRCIsIlVQTE9BRF9QUk9HUkVTUyIsIkJFRk9SRV9UUkFOU0ZPUk0iLCJoYW5kbGVQbHVnaW5zIiwiYmVmb3JlVHJhbnNmb3JtUGx1Z2lucyIsImN1cnJlbnRUcmFuc2Zvcm1lciIsIkJFRk9SRV9VUExPQUQiLCJiZWZvcmVVcGxvYWRQbHVnaW5zIiwib3V0cHV0SW1nIiwiQUZURVJfVVBMT0FEIiwiYWZ0ZXJVcGxvYWRQbHVnaW5zIiwiaXNFbmNvZGVPdXRwdXRVUkwiLCJpIiwiaW1nVXJsIiwiYmFzZTY0SW1hZ2UiLCJGSU5JU0hFRCIsImxpZmVDeWNsZVBsdWdpbnMiLCJwbHVnaW5OYW1lcyIsImxpZmVDeWNsZU5hbWUiLCJhbGwiLCJwb3N0T3B0aW9ucyIsImFwaVRva2VuIiwiYmFja3VwRG9tYWluIiwiaGVhZGVycyIsImNvbnRlbnRUeXBlIiwiQXV0aG9yaXphdGlvbiIsImZvcm1EYXRhIiwic21maWxlIiwidmFsdWUiLCJmaWxlbmFtZSIsInNzbCIsInNtbXNDb25maWciLCJpbWdMaXN0IiwicG9zdENvbmZpZyIsInRva2VuIiwiYm9keSIsImNvZGUiLCJoYXNoIiwiaW1hZ2VzIiwiTk9USUZJQ0FUSU9OIiwidGl0bGUiLCJwcmVmaXgiLCJnZW5lcmF0ZVNpZ25hdHVyZSIsInNlY3JldElkIiwic2VjcmV0S2V5IiwiYXBwSWQiLCJidWNrZXQiLCJzaWduYXR1cmUiLCJzaWduVGltZSIsInRvZGF5Iiwic2lnbktleSIsImNyZWF0ZUhtYWMiLCJlbmRwb2ludCIsImFyZWEiLCJodHRwU3RyaW5nIiwic3RyaW5nVG9TaWduIiwiY3VycmVudCIsIm11bHRpU2lnbmF0dXJlIiwic2lnbkhleEtleSIsInRlbXBTdHJpbmciLCJjb25jYXQiLCJlbmNvZGVVUklDb21wb25lbnQiLCJIb3N0IiwibWltZSIsImxvb2t1cCIsIm9wIiwiZmlsZWNvbnRlbnQiLCJ0Y1l1bk9wdGlvbnMiLCJjdXN0b21VcmwiLCJ1c2VWNCIsInN0YXR1c0NvZGUiLCJvcHRpb25VcmwiLCJzbGltIiwic291cmNlX3VybCIsImNvbmZpcm1UZXh0IiwiY2FuY2VsVGV4dCIsInRpcHMiLCJyZXBvIiwianNvbiIsImJyYW5jaCIsImdpdGh1Yk9wdGlvbnMiLCJ1cGxvYWRQYXRoIiwiZG93bmxvYWRfdXJsIiwic2hhIiwiaW1nQmFzZTY0Iiwic2VsZWN0QXJlYSIsImdldFRva2VuIiwicWluaXVPcHRpb25zIiwiYWNjZXNzS2V5IiwibWFjIiwicWluaXUiLCJhdXRoIiwiTWFjIiwicnMiLCJQdXRQb2xpY3kiLCJ1cGxvYWRUb2tlbiIsImJhc2VVcmwiLCJ1cmxPcHRpb25zIiwicmVzcG9uc2UiLCJmb3JtYXRBY2Nlc3NUb2tlbiIsImFjY2Vzc1Rva2VuIiwiY2xpZW50SWQiLCJ1c2VybmFtZSIsImFsYnVtIiwiYXV0aG9yaXphdGlvbiIsInJlcXVlc3RPcHRpb25zIiwiaW5pdFBhZ2VzIiwiYWxidW1IYXNoIiwiZ2V0QWxidW1IYXNoT3B0aW9ucyIsInRpbWVvdXQiLCJhbGJ1bUxpc3QiLCJpbWd1ck9wdGlvbnMiLCJsaW5rIiwiZGVsZXRlaGFzaCIsImRhdGUiLCJ0b1VUQ1N0cmluZyIsInNpZ25TdHJpbmciLCJhY2Nlc3NLZXlTZWNyZXQiLCJhY2Nlc3NLZXlJZCIsImFsaVl1bk9wdGlvbnMiLCJvcGVyYXRvciIsIm1kNVBhc3N3b3JkIiwiTUQ1IiwicGFzc3dvcmQiLCJnZXRBbnRpTGVlY2hQYXJhbSIsImFudGlMZWVjaFRva2VuIiwiZXhwaXJlVGltZSIsInVyaSIsImV4cGlyZSIsInBhcnNlSW50Iiwic3Vic3RyaW5nIiwidXB5dW5PcHRpb25zIiwic3VmZml4IiwidXB0IiwiQXV0aFR5cGUiLCJjcmVhdGVDbGllbnQiLCJldmFsIiwid2ViZGF2cGxpc3RPcHRpb25zIiwiaG9zdCIsInNzbEVuYWJsZWQiLCJhdXRoVHlwZSIsIndlYnBhdGgiLCJjbGllbnRPcHRpb25zIiwibWF4Qm9keUxlbmd0aCIsIm1heENvbnRlbnRMZW5ndGgiLCJEaWdlc3QiLCJjbGllbnQiLCJwYXRoVG9DcmVhdGUiLCJjcmVhdGVEaXJlY3RvcnkiLCJwdXRGaWxlQ29udGVudHMiLCJvdmVyd3JpdGUiLCJpbWdUZW1wUGF0aCIsImltZ1RlbXBGaWxlUGF0aCIsImdhbGxlcnlQYXRoIiwibG9jYWxDb25maWciLCJ3ZWJQYXRoIiwiY29weUZpbGVTeW5jIiwiU1NIQ2xpZW50IiwiX2lzQ29ubmVjdGVkIiwiaW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJfY2xpZW50IiwiTm9kZVNTSCIsImNoYW5nZVdpblN0eWxlUGF0aFRvVW5peCIsInByaXZhdGVLZXkiLCJwYXNzcGhyYXNlIiwibG9naW5JbmZvIiwicHJpdmF0ZUtleVBhdGgiLCJjb25uZWN0IiwicG9ydCIsImxvY2FsIiwicmVtb3RlIiwibWtkaXIiLCJwdXRGaWxlIiwiZmlsZU1vZGUiLCJzY3JpcHQiLCJleGVjIiwiZGlyUGF0aCIsImlzQ29ubmVjdGVkIiwiZGlyZWN0b3J5TW9kZSIsImRpck1vZGUiLCJkaXJzIiwiY3VycmVudFBhdGgiLCJ1c2VyIiwiZ3JvdXAiLCJfdXNlciIsIl9ncm91cCIsImV4ZWNDb21tYW5kIiwiY2xvc2UiLCJkaXNwb3NlIiwic2Z0cHBsaXN0Q29uZmlnIiwidXBsb2FkVGVtcFBhdGgiLCJyZW1vdGVQYXRoIiwiZmlsZVVzZXIiLCJjaG93biIsIm1vdmVTeW5jIiwidGdPcHRpb25zIiwiY3JlYXRlUmVhZFN0cmVhbSIsInJlbW92ZSIsInNyYyIsInBpY2JlZCIsInNlcnZlcktleSIsInBpY2xpc3RPcHRpb25zIiwiZnVsbFJlc3VsdCIsImJ1aWxkSW5VcGxvYWRlcnMiLCJhbGlZdW5VcGxvYWRlciIsInRjWXVuVXBsb2FkZXIiLCJTTU1TVXBsb2FkZXIiLCJnaXRodWJVcGxvYWRlciIsInFpbml1VXBsb2FkZXIiLCJpbWd1clVwbG9hZGVyIiwidXBZdW5VcGxvYWRlciIsIndlYmRhdnBsaXN0VXBsb2FkZXIiLCJsb2NhbFVwbG9hZGVyIiwic2Z0cFVwbG9hZGVyIiwidGVsZWdyYXBoVXBsb2FkZXIiLCJwaWNsaXN0VXBsb2FkZXIiLCJyZXN1bHRzIiwiaW1nU2l6ZSIsImdldEltZ1NpemUiLCJJbWdGcm9tUGF0aCIsIkltZ0Zyb21CYXNlNjQiLCJidWlsZEluVHJhbnNmb3JtZXJzIiwiUGx1Z2luTG9hZGVyIiwiZnVsbExpc3QiLCJTZXQiLCJwbHVnaW5NYXAiLCJwYWNrYWdlUGF0aCIsInJlcG9zaXRvcnkiLCJsaWNlbnNlIiwicmVzb2x2ZVBsdWdpbiIsImJhc2VkaXIiLCJsb2FkIiwicGx1Z2luRGlyIiwiZGVwcyIsImRlcGVuZGVuY2llcyIsImRldkRlcHMiLCJkZXZEZXBlbmRlbmNpZXMiLCJtb2R1bGVzIiwicmVnaXN0ZXJQbHVnaW4iLCJhZGQiLCJwbHVnaW5JbnRlcmZhY2UiLCJ1bnJlZ2lzdGVyUGx1Z2luIiwiaGFzUGx1Z2luIiwiQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUiIsImdldEN1cnJlbnRQbGF0Zm9ybSIsInBsYXRmb3JtIiwiaXNXc2wiLCJvcyIsInJlbGVhc2UiLCJwbGF0Zm9ybTJTY3JpcHRDb250ZW50IiwiZGFyd2luIiwibWFjQ2xpcGJvYXJkU2NyaXB0Iiwid2luMzIiLCJ3aW5kb3dzQ2xpcGJvYXJkU2NyaXB0Iiwid2luMTAiLCJ3aW5kb3dzMTBDbGlwYm9hcmRTY3JpcHQiLCJsaW51eCIsImxpbnV4Q2xpcGJvYXJkU2NyaXB0Iiwid3NsIiwid3NsQ2xpcGJvYXJkU2NyaXB0IiwicGxhdGZvcm0yU2NyaXB0RmlsZW5hbWUiLCJjcmVhdGVJbWFnZUZvbGRlciIsImltYWdlUGF0aCIsImdldENsaXBib2FyZEltYWdlIiwic2NyaXB0UGF0aCIsImV4ZWN1dGlvbiIsInNwYXduIiwic3Rkb3V0IiwidHJpbSIsImltZ1BhdGgiLCJzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmciLCJldmVudEJ1cyIsImh0dHBzQWdlbnQiLCJodHRwcyIsIkFnZW50IiwibWF4VmVyc2lvbiIsIm1pblZlcnNpb24iLCJhcHBlbmRGb3JtRGF0YSIsImZvcm0iLCJhcHBlbmQiLCJyZXF1ZXN0SW50ZXJjZXB0b3IiLCJfX2lzT2xkT3B0aW9ucyIsIm9wdCIsInByb3h5T3B0aW9ucyIsInR1bm5lbCIsImh0dHBzT3Zlckh0dHAiLCJob3N0bmFtZSIsInByb3RvY29sIiwiRm9ybURhdGEiLCJhc3NpZ24iLCJnZXRIZWFkZXJzIiwicXMiLCJyZXNwb25zZUludGVyY2VwdG9yIiwic3RhdHVzIiwicmVzcG9uc2VFcnJvckhhbmRsZXIiLCJlcnJvck9iaiIsIkNPTkZJR19DSEFOR0UiLCJoYW5kbGVQcm94eSIsIkluZmluaXR5IiwiY3JlYXRlIiwiaW50ZXJjZXB0b3JzIiwib2JqIiwiQ29udGVudFR5cGUiLCJEQiIsImRiIiwiSlNPTlN0b3JlIiwicmVhZCIsImZsdXNoIiwidW5zZXQiLCJQbHVnaW5IYW5kbGVyIiwiaW5zdGFsbGVkUGx1Z2lucyIsInByb2Nlc3NQbHVnaW5zIiwiaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3MiLCJwa2dOYW1lIiwiZnVsbE5hbWVMaXN0IiwiZnVsbE5hbWUiLCJwa2dOYW1lTGlzdCIsIndoZXJlIiwibnBtIiwicGlwZSIsInN0ZGVyciIsIlpIX0NOIiwiVVBMT0FEX0ZBSUxFRCIsIkNIRUNLX1NFVFRJTkdTIiwiQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUksiLCJVUExPQURfRkFJTEVEX1JFQVNPTiIsIlNFUlZFUl9FUlJPUiIsIkFVVEhfRkFJTEVEIiwiUElDQkVEX1NNTVMiLCJQSUNCRURfU01NU19UT0tFTiIsIlBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU4iLCJQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU4iLCJQSUNCRURfTE9DQUwiLCJQSUNCRURfTE9DQUxfUEFUSCIsIlBJQ0JFRF9MT0NBTF9NRVNTQUdFX1BBVEgiLCJQSUNCRURfTE9DQUxfQ1VTVE9NVVJMIiwiUElDQkVEX0xPQ0FMX01FU1NBR0VfQ1VTVE9NVVJMIiwiUElDQkVEX0xPQ0FMX1dFQlBBVEgiLCJQSUNCRURfTE9DQUxfTUVTU0FHRV9XRUJQQVRIIiwiUElDQkVEX0FMSUNMT1VEIiwiUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEIiwiUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVCIsIlBJQ0JFRF9BTElDTE9VRF9CVUNLRVQiLCJQSUNCRURfQUxJQ0xPVURfQVJFQSIsIlBJQ0JFRF9BTElDTE9VRF9QQVRIIiwiUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTCIsIlBJQ0JFRF9BTElDTE9VRF9PUFRJT05TIiwiUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQSIsIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEgiLCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TIiwiUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQ1VTVE9NVVJMIiwiUElDQkVEX1RFTkNFTlRDTE9VRCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTiIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWSIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQSIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfRU5EUE9JTlQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEgiLCJQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlMiLCJQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEgiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlMiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfRU5EUE9JTlQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU0iLCJQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU1fVElQIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9TTElNX0NPTkZJUk0iLCJQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU1fQ0FOQ0VMIiwiUElDQkVEX0dJVEhVQiIsIlBJQ0JFRF9HSVRIVUJfVE9LRU4iLCJQSUNCRURfR0lUSFVCX1JFUE8iLCJQSUNCRURfR0lUSFVCX1BBVEgiLCJQSUNCRURfR0lUSFVCX0JSQU5DSCIsIlBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX1JFUE8iLCJQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEgiLCJQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMIiwiUElDQkVEX1FJTklVIiwiUElDQkVEX1FJTklVX0FDQ0VTU0tFWSIsIlBJQ0JFRF9RSU5JVV9TRUNSRVRLRVkiLCJQSUNCRURfUUlOSVVfQlVDS0VUIiwiUElDQkVEX1FJTklVX1BBVEgiLCJQSUNCRURfUUlOSVVfVVJMIiwiUElDQkVEX1FJTklVX09QVElPTlMiLCJQSUNCRURfUUlOSVVfQVJFQSIsIlBJQ0JFRF9RSU5JVV9NRVNTQUdFX1BBVEgiLCJQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBIiwiUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUyIsIlBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTCIsIlBJQ0JFRF9URUxFR1JBUEgiLCJQSUNCRURfSU1HVVIiLCJQSUNCRURfSU1HVVJfQ0xJRU5USUQiLCJQSUNCRURfSU1HVVJfVVNFUk5BTUUiLCJQSUNCRURfSU1HVVJfQUNDRVNTX1RPS0VOIiwiUElDQkVEX0lNR1VSX0FMQlVNIiwiUElDQkVEX0lNR1VSX1BST1hZIiwiUElDQkVEX0lNR1VSX01FU1NBR0VfQ0xJRU5USUQiLCJQSUNCRURfSU1HVVJfTUVTU0FHRV9VU0VSTkFNRSIsIlBJQ0JFRF9JTUdVUl9NRVNTQUdFX0FDQ0VTU19UT0tFTiIsIlBJQ0JFRF9JTUdVUl9NRVNTQUdFX0FMQlVNIiwiUElDQkVEX0lNR1VSX01FU1NBR0VfUFJPWFkiLCJQSUNCRURfVVBZVU4iLCJQSUNCRURfVVBZVU5fQlVDS0VUIiwiUElDQkVEX1VQWVVOX09QRVJBVE9SIiwiUElDQkVEX1VQWVVOX1BBU1NXT1JEIiwiUElDQkVEX1VQWVVOX1BBVEgiLCJQSUNCRURfVVBZVU5fVVJMIiwiUElDQkVEX1VQWVVOX09QVElPTlMiLCJQSUNCRURfVVBZVU5fQU5USV9MRUVDSF9UT0tFTiIsIlBJQ0JFRF9VUFlVTl9FWFBJUkVfVElNRSIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SIiwiUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkwiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TIiwiUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSCIsIlBJQ0JFRF9XRUJEQVZQTElTVCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9IT1NUIiwiUElDQkVEX1dFQkRBVlBMSVNUX1NTTEVOQUJMRUQiLCJQSUNCRURfV0VCREFWUExJU1RfVVNFUk5BTUUiLCJQSUNCRURfV0VCREFWUExJU1RfUEFTU1dPUkQiLCJQSUNCRURfV0VCREFWUExJU1RfUEFUSCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9XRUJTSVRFX1BBVEgiLCJQSUNCRURfV0VCREFWUExJU1RfQ1VTVE9NVVJMIiwiUElDQkVEX1dFQkRBVlBMSVNUX0FVVEhUWVBFIiwiUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfSE9TVCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1NTTEVOQUJMRUQiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9VU0VSTkFNRSIsIlBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBU1NXT1JEIiwiUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfUEFUSCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1dFQlNJVEVfUEFUSCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0NVU1RPTVVSTCIsIlBJQ0JFRF9TRlRQUExJU1QiLCJQSUNCRURfU0ZUUFBMSVNUX0hPU1QiLCJQSUNCRURfU0ZUUFBMSVNUX1BPUlQiLCJQSUNCRURfU0ZUUFBMSVNUX1VTRVJOQU1FIiwiUElDQkVEX1NGVFBQTElTVF9QQVNTV09SRCIsIlBJQ0JFRF9TRlRQUExJU1RfUFJJVkFURUtFWSIsIlBJQ0JFRF9TRlRQUExJU1RfUFJJVkFURUtFWV9QQVNTUEhSQVNFIiwiUElDQkVEX1NGVFBQTElTVF9VUExPQURQQVRIIiwiUElDQkVEX1NGVFBQTElTVF9DVVNUT01VUkwiLCJQSUNCRURfU0ZUUFBMSVNUX1dFQlNJVEVfUEFUSCIsIlBJQ0JFRF9TRlRQUExJU1RfRklMRV9VU0VSIiwiUElDQkVEX1NGVFBQTElTVF9GSUxFX01PREUiLCJQSUNCRURfU0ZUUFBMSVNUX0RJUl9NT0RFIiwiUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0hPU1QiLCJQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfUE9SVCIsIlBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9QUklWQVRFS0VZIiwiUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1BSSVZBVEVLRVlfUEFTU1BIUkFTRSIsIlBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9VUExPQURQQVRIIiwiUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0NVU1RPTVVSTCIsIlBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEgiLCJQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfRklMRV9VU0VSIiwiUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0ZJTEVfTU9ERSIsIlBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9ESVJfTU9ERSIsIlBJQ0JFRF9QSUNMSVNUIiwiUElDQkVEX1BJQ0xJU1RfSE9TVCIsIlBJQ0JFRF9QSUNMSVNUX1BPUlQiLCJQSUNCRURfUElDTElTVF9QSUNCRUQiLCJQSUNCRURfUElDTElTVF9DT05GSUdOQU1FIiwiUElDQkVEX1BJQ0xJU1RfS0VZIiwiQlVJTERJTl9XQVRFUk1BUktfSVNBRERXQVRFUk1BUksiLCJCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX0lTQUREV0FURVJNQVJLIiwiQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVFlQRSIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLVFlQRSIsIkJVSUxESU5fV0FURVJNQVJLX0lTRlVMTFNDUkVFTldBVEVSTUFSSyIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfSVNGVUxMU0NSRUVOV0FURVJNQVJLIiwiQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLREVHUkVFIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktERUdSRUUiLCJCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhUIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktURVhUIiwiQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVEVYVEZPTlRQQVRIIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UUEFUSCIsIkJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRSQVRJTyIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVFJBVElPIiwiQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLRk9OVENPTE9SIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UQ09MT1IiLCJCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktJTUFHRVBBVEgiLCJCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0lNQUdFUEFUSCIsIkJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1BPU0lUSU9OIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktQT1NJVElPTiIsIkJVSUxESU5fUkVOQU1FX0ZPUk1BVCIsIkJVSUxESU5fUkVOQU1FX0VOQUJMRSIsIkJVSUxESU5fQ09NUFJFU1NfUVVBTElUWSIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9RVUFMSVRZIiwiQlVJTERJTl9DT01QUkVTU19JU0NPTlZFUlQiLCJCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNDT05WRVJUIiwiQlVJTERJTl9DT01QUkVTU19DT05WRVJURk9STUFUIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0NPTlZFUlRGT1JNQVQiLCJCVUlMRElOX0NPTVBSRVNTX0lTUkVTSVpFIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVTSVpFIiwiQlVJTERJTl9DT01QUkVTU19SRVNJWkVXSURUSCIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVXSURUSCIsIkJVSUxESU5fQ09NUFJFU1NfUkVTSVpFSEVJR0hUIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRUhFSUdIVCIsIkJVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkVCWVBFUkNFTlQiLCJCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRVNJWkVCWVBFUkNFTlQiLCJCVUlMRElOX0NPTVBSRVNTX0lTRkxJUCIsIkJVSUxESU5fQ09NUFJFU1NfSVNGTE9QIiwiQlVJTERJTl9DT01QUkVTU19SRVNJWkVQRVJDRU5UIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRVBFUkNFTlQiLCJCVUlMRElOX0NPTVBSRVNTX1NLSVBSRVNJWkVPRlNNQUxMSU1HIiwiQlVJTERJTl9DT01QUkVTU19JU1JPVEFURSIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JPVEFURSIsIkJVSUxESU5fQ09NUFJFU1NfUk9UQVRFREVHUkVFIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JPVEFURURFR1JFRSIsIkJVSUxESU5fQ09NUFJFU1NfSVNSRU1PVkVFWElGIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVNT1ZFRVhJRiIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1MiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUkVBU09OIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1BBVEgiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1MiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1JFQVNPTiIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9SRUFTT04iLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRCIsIkVOIiwiWkhfVFciLCJsYW5ndWFnZUxpc3QiLCJlbiIsIkkxOG5NYW5hZ2VyIiwib2JqZWN0QWRhcHRlciIsIk9iamVjdEFkYXB0ZXIiLCJsYW5ndWFnZSIsIkkxOG4iLCJhZGFwdGVyIiwiZGVmYXVsdExhbmd1YWdlIiwibG9hZE91dHRlckkxOG4iLCJpMThuRm9sZGVyIiwiZ2V0T3V0dGVySTE4bkZvbGRlciIsInJlYWRkaXJTeW5jIiwid2l0aEZpbGVUeXBlcyIsImlzRmlsZSIsImVuZHNXaXRoIiwiaTE4bkZpbGVQYXRoIiwiaTE4bkZpbGUiLCJpMThuRmlsZU9iaiIsInlhbWwiLCJwYXRoRXhpc3RzU3luYyIsImFkZExvY2FsZSIsImxvY2FsZXMiLCJvcmlnaW5Mb2NhbGVzIiwiZ2V0TG9jYWxlIiwibmV3TG9jYWxlcyIsIm1lcmdlIiwic2V0TG9jYWxlIiwiYWRkTGFuZ3VhZ2UiLCJQaWNHbyIsIl9wbHVnaW5Mb2FkZXIiLCJpbml0Q29uZmlnUGF0aCIsImluaXRDb25maWciLCJlbnN1cmVGaWxlU3luYyIsIl9jb25maWciLCJ1cGxvYWRlcnMiLCJ0cmFuc2Zvcm1lcnMiLCJsaWZlY3ljbGUiLCJyZWdpc3RlckNvbW1hbmRzIiwicHJvcE5hbWUiLCJzdGFydCJdLCJtYXBwaW5ncyI6IitpQ0FFQSxNQUFNQSxjQUF5QixDQUM3QkMsT0FBU0MsSUFFUCxNQUFNQyxFQUFNRCxFQUFJQyxJQUNoQkEsRUFBSUMsUUFDREMsUUFBUSx3QkFDUkMsWUFBWSx3QkFDWkMsTUFBTSxPQUNOQyxPQUFPLHNCQUF1QixvQ0FDOUJBLE9BQU8sNEJBQTZCLDRDQUNwQ0MsUUFBTyxDQUFDQyxFQUFtQk4sS0FDMUIsTUFBTU8sTUFBRUEsRUFBS0MsU0FBRUEsR0FBYVIsRUFDdEJTLEVBQVUsQ0FDZEYsTUFBQUEsRUFDQUMsU0FBQUEsR0FFRlYsRUFBSUYsY0FBY2MsUUFBUUosRUFBU0csR0FBU0UsT0FBT0MsSUFBUWQsRUFBSWUsSUFBSUMsTUFBTUYsU0FFN0ViLEVBQUlDLFFBQ0RDLFFBQVEsMEJBQ1JFLE1BQU0sTUFDTkQsWUFBWSwwQkFDWkcsUUFBUUMsSUFDUFIsRUFBSUYsY0FBY21CLFVBQVVULEdBQVNLLE9BQU9DLElBQVFkLEVBQUllLElBQUlDLE1BQU1GLFNBRXRFYixFQUFJQyxRQUNEQyxRQUFRLHVCQUNSQyxZQUFZLHVCQUNaRSxPQUFPLHNCQUF1Qiw0QkFDOUJBLE9BQU8sNEJBQTZC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
1
+ import fs from"fs-extra";import path from"path";import{EventEmitter}from"events";import os,{homedir}from"os";import{Command}from"commander";import inquirer from"inquirer";import{imageSize}from"image-size";import{URL}from"url";import TextToSVG from"text-to-svg";import sharp from"sharp";import crypto from"crypto";import{v4}from"uuid";import chalk from"chalk";import match from"minimatch";import globby from"globby";import ejs from"ejs";import download from"download-git-repo";import rm from"rimraf";import dayjs from"dayjs";import util from"util";import axios from"axios";import{cloneDeep,merge,get,set,unset}from"lodash";import heicConvert from"heic-convert";import mime from"mime-types";import qiniu from"qiniu";import{NodeSSH}from"node-ssh-no-cpu-features";import resolve from"resolve";import{spawn}from"child_process";import isWsl from"is-wsl";import FormData from"form-data";import https from"https";import tunnel from"tunnel";import{JSONStore}from"@picgo/store";import spawn$1 from"cross-spawn";import yaml from"js-yaml";import{ObjectAdapter,I18n}from"@picgo/i18n";const pluginHandler={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 plugins").option("-r, --registry <registry>","Choose a registry for installing plugins").action(((t,n)=>{const{proxy:r,registry:i}=n,a={proxy:r,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,n)=>{const{proxy:r,registry:i}=n,a={proxy:r,registry:i};e.pluginHandler.update(t,a).catch((t=>{e.log.error(t)}))}))}},config$f={handle:e=>{e.cmd.program.option("-c, --config <path>","set config path")}};function randomStringGenerator(e){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";return Array.from({length:e}).map((()=>t.charAt(Math.floor(Math.random()*t.length)))).join("")}function renameFileNameWithTimestamp(e){return`${Math.floor(Date.now()/1e3)}${randomStringGenerator(5)}${path.extname(e)}`}function renameFileNameWithRandomString(e,t=5){return`${randomStringGenerator(t)}${path.extname(e)}`}function renameFileNameWithCustomString(e,t,n){const r={"{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}":()=>crypto.createHash("md5").update(path.basename(e,path.extname(e))).digest("hex"),"{md5-16}":()=>crypto.createHash("md5").update(path.basename(e,path.extname(e))).digest("hex").slice(0,16),"{str-10}":()=>randomStringGenerator(10),"{str-20}":()=>randomStringGenerator(20),"{filename}":()=>n?path.basename(n,path.extname(n)):path.basename(e,path.extname(e)),"{uuid}":()=>v4().replace(/-/g,""),"{timestamp}":()=>Math.floor(Date.now()/1e3).toString()};if(void 0===t||!Object.keys(r).some((e=>t.includes(e)))&&!t.includes("localFolder"))return e;const i=path.extname(e);let a=Object.keys(r).reduce(((e,t)=>e.replace(new RegExp(t,"g"),r[t]())),t)+i;return a=a.replace(/{(localFolder:?(\d+)?)}/gi,((t,n,r)=>{r=Math.max(1,r||0);return path.dirname(e).split(path.sep).slice(0-r).reduce(((e,t)=>`${e}/${t}`)).replace(/:/g,"")})),a}const isUrl=e=>/^https?:\/\//.test(e),isUrlEncode=e=>{e=e||"";try{return e!==decodeURI(e)}catch(e){return!1}},handleUrlEncode=e=>(isUrlEncode(e)||(e=encodeURI(e)),e),getImageSize=e=>{try{const{width:t=0,height:n=0,type:r}=imageSize(e);return{real:!0,width:t,height:n,extname:r?`.${r}`:".png"}}catch(e){return{real:!1,width:200,height:200,extname:".png"}}},getFSFile=async e=>{try{return{extname:path.extname(e),fileName:path.basename(e),buffer:await fs.readFile(e),success:!0}}catch(t){return{reason:`read file ${e} error`,success:!1}}},getURLFile=async(e,t)=>{let n;e=handleUrlEncode(e);const r=new Promise(((r,i)=>{(async()=>{var i;try{const i=await t.request({method:"get",url:e,resolveWithFullResponse:!0,responseType:"arraybuffer"}).then((e=>e.data));clearTimeout(n);const a=new URL(e).pathname;let s="";try{s=new URL(e).searchParams.get("wx_fmt")||path.extname(a)||""}catch(e){s=path.extname(a)||""}!s.startsWith(".")&&s&&(s=`.${s}`),r({buffer:i,fileName:path.basename(a),extname:s,success:!0})}catch(t){clearTimeout(n),r({success:!1,reason:`request ${e} error, ${null!==(i=null==t?void 0:t.message)&&void 0!==i?i:""}`})}})().catch(i)})),i=new Promise((t=>{n=setTimeout((()=>{t({success:!1,reason:`request ${e} timeout`})}),3e4)}));return Promise.race([r,i])},getPluginNameType=e=>/^@[^/]+\/picgo-plugin-/.test(e)?"scope":e.startsWith("picgo-plugin-")?"normal":isSimpleName(e)?"simple":"unknown",isSimpleName=e=>{if(path.isAbsolute(e))return!1;const t=path.join(process.cwd(),e);return!fs.existsSync(t)&&(!e.includes("/")&&!e.includes("\\"))},handleStreamlinePluginName=e=>/^@[^/]+\/picgo-plugin-/.test(e)?e.replace(/^@[^/]+\/picgo-plugin-/,""):e.replace(/picgo-plugin-/,""),handleCompletePluginName=(e,t="")=>t?`@${t}/picgo-plugin-${e}`:`picgo-plugin-${e}`,getProcessPluginName=(e,t=console)=>{switch(getPluginNameType(e)){case"normal":case"scope":return e;case"simple":return handleCompletePluginName(e);default:{let n=e;return path.isAbsolute(e)&&fs.existsSync(e)?handleUnixStylePath(n):(n=path.join(process.cwd(),e),fs.existsSync(n)?handleUnixStylePath(n):(t.warn(`Can't find plugin ${e}`),""))}}},getNormalPluginName=(e,t=console)=>{var n;switch(getPluginNameType(e)){case"normal":return removePluginVersion(e);case"scope":return removePluginVersion(e,!0);case"simple":return removePluginVersion(handleCompletePluginName(e));default:{if(!fs.existsSync(e))return t.warn(`Can't find plugin: ${e}`),"";const r=path.posix.join(e,"package.json");if(fs.existsSync(r)){const e=fs.readJSONSync(r)||{};return(null===(n=e.name)||void 0===n?void 0:n.includes("picgo-plugin-"))?e.name:(t.warn(`The plugin package.json's name filed is ${e.name||"empty"}, need to include the prefix: picgo-plugin-`),"")}return t.warn(`Can't find plugin: ${e}`),""}}},handleUnixStylePath=e=>e.split(path.sep).join("/"),removePluginVersion=(e,t=!1)=>{if(e.includes("@")){let n=/(.+\/)?(picgo-plugin-\w+)(@.+)*/;t&&(n=/(.+\/)?(^@[^/]+\/picgo-plugin-\w+)(@.+)*/);const r=e.match(n);return r?r[2]:(console.warn("can not remove plugin version"),e)}return e},configBlackList=[],isConfigKeyInBlackList=e=>configBlackList.some((t=>e.startsWith(t))),isInputConfigValid=e=>"object"==typeof e&&!Array.isArray(e)&&Object.keys(e).length>0;function safeParse(e){try{return JSON.parse(e)}catch(t){return e}}const forceNumber=(e=0)=>isNaN(Number(e))?0:Number(e),isDev=()=>"development"===process.env.NODE_ENV,isProd=()=>"production"===process.env.NODE_ENV;async function text2SVG(e,t,n,r){t=t||"测试",r=r||e;const i={anchor:"top",attributes:{fill:n=n||"rgba(204, 204, 204, 0.45)"}},a=TextToSVG.loadSync(r).getSVG(t,i);return Buffer.from(a)}const defaultWatermarkImagePath=path.join(__dirname,"assets","piclist.png");async function AddWatermark(e,t,n,r,i,a,s,o,l,E,I){o=!o||o<0||o>1?.15:o;const c=sharp(e,{animated:!0}),{width:u=200}=await c.metadata(),_=await createWatermark(t,n,a,s,o,l,E,u,i);return await c.composite([{input:_,gravity:I||"southeast",tile:r}]).toBuffer()}async function createWatermark(e,t,n,r,i,a,s,o=200,l=0){let E;"image"===e?(s=s||defaultWatermarkImagePath,E=await sharp(s).toBuffer()):E=await text2SVG(t,n,a,r||t);const{width:I,height:c}=await getSize(E),u=Math.floor(o*forceNumber(i)),_=Math.floor(u*c/I);return await sharp(E).resize(u,_,{fit:"inside"}).rotate(l,{background:{r:255,g:255,b:255,alpha:0}}).toBuffer()}async function getSize(e){const{width:t,height:n}=await sharp(e).metadata();return{width:t||200,height:n||200}}const validParam=(...e)=>e.every((e=>null!=e&&("string"==typeof e?""!==e:"number"==typeof e?e>0:"object"!=typeof e||Object.keys(e).length>0))),availableConvertFormatList=["avif","dz","fits","gif","heif","input","jpeg","jpg","jp2","jxl","magick","openslide","pdf","png","ppm","raw","svg","tiff","tif","v","webp"],validOutputFormat=e=>availableConvertFormatList.includes(e),imageExtList=["jpg","jpeg","png","webp","bmp","tiff","tif","svg","ico","avif","heif","heic"];async function imageAddWaterMark(e,t,n){try{let r=sharp(e,{animated:!0});return validParam(t.watermarkText)&&(r=sharp(await AddWatermark(e,t.watermarkType||"text",n,t.isFullScreenWatermark,forceNumber(t.watermarkDegree),t.watermarkText,t.watermarkFontPath,forceNumber(t.watermarkScaleRatio),t.watermarkColor,t.watermarkImagePath,t.watermarkPosition),{animated:!0})),await r.toBuffer()}catch(t){return console.log(t),e}}function formatOptions(e){return{quality:forceNumber(e.quality),isConvert:e.isConvert||!1,convertFormat:e.convertFormat||"jpg",isReSize:e.isReSize||!1,reSizeHeight:forceNumber(e.reSizeHeight),reSizeWidth:forceNumber(e.reSizeWidth),skipReSizeOfSmallImg:e.skipReSizeOfSmallImg||!1,isReSizeByPercent:e.isReSizeByPercent||!1,reSizePercent:forceNumber(e.reSizePercent),isRotate:e.isRotate||!1,isFlip:e.isFlip||!1,isFlop:e.isFlop||!1,rotateDegree:forceNumber(e.rotateDegree),picBed:e.picBed||"smms"}}async function imageProcess(e,t,n){t=formatOptions(t);try{if(n=n.toLowerCase().replace(".",""),!imageExtList.includes(n))return e;let r=sharp(e,{animated:!0}),i=100;if(validParam(t.quality)&&t.quality<100&&(i=t.quality),t.isReSizeByPercent){if(validParam(t.reSizePercent)){const e=await r.metadata().then((e=>e.width)),n=await r.metadata().then((e=>e.height));e&&n&&(r=r.resize(Math.round(e*t.reSizePercent/100),Math.round(n*t.reSizePercent/100),{fit:"inside"}))}}else if(t.isReSize)if("number"==typeof t.reSizeHeight&&t.reSizeHeight>0&&"number"==typeof t.reSizeWidth&&t.reSizeWidth>0)r=r.resize(t.reSizeWidth,t.reSizeHeight,{fit:"fill"});else if("number"==typeof t.reSizeHeight&&t.reSizeHeight>0&&("number"!=typeof t.reSizeWidth||0===t.reSizeWidth)){const e=await r.metadata().then((e=>e.width)),n=await r.metadata().then((e=>e.height));if(e&&n&&(!t.skipReSizeOfSmallImg||t.skipReSizeOfSmallImg&&t.reSizeHeight<n)){const i=t.reSizeHeight/n;r=r.resize(Math.round(e*i),t.reSizeHeight,{fit:"inside"})}}else if("number"==typeof t.reSizeWidth&&t.reSizeWidth>0&&("number"!=typeof t.reSizeHeight||0===t.reSizeHeight)){const e=await r.metadata().then((e=>e.width)),n=await r.metadata().then((e=>e.height));if(e&&n&&(!t.skipReSizeOfSmallImg||t.skipReSizeOfSmallImg&&t.reSizeWidth<e)){const i=t.reSizeWidth/e;r=r.resize(t.reSizeWidth,Math.round(n*i),{fit:"inside"})}}if(t.isRotate&&t.rotateDegree&&(r=r.rotate(t.rotateDegree,{background:{r:255,g:255,b:255,alpha:0}})),t.isFlip&&(console.log("flip"),r=r.flip()),t.isFlop&&(r=r.flop()),t.isConvert){let e=t.convertFormat||"jpg";"imgur"===t.picBed&&"webp"===e&&(e="jpg"),r=r.toFormat(e,{quality:i})}else r=n&&validOutputFormat(n)?r.toFormat(n,{quality:i}):r.toFormat("jpg",{quality:i});return await r.toBuffer()}catch(t){return console.log(t),e}}const imageFormatList=["jpg","jpeg","png","webp","bmp","tiff","tif","svg","ico","avif","heif","heic","gif"],needAddWatermark=(e,t)=>(t=t.toLowerCase().replace(".",""),!!e&&!!e.isAddWatermark&&imageFormatList.includes(t)),needCompress=(e,t)=>{const n=t.toLowerCase().replace(".","");if(!imageFormatList.includes(n)||!e)return!1;const{quality:r,isReSizeByPercent:i,reSizePercent:a,isReSize:s,reSizeHeight:o,reSizeWidth:l,isRotate:E,rotateDegree:I,isConvert:c,convertFormat:u,isFlip:_,isFlop:p}=formatOptions(e);if(validParam(r)&&r<100)return!0;if(i&&validParam(a))return!0;if(s&&("number"==typeof o&&o>0||"number"==typeof l&&l>0))return!0;if(E&&I)return!0;if(_||p)return!0;if(c){return t!==(u||"jpg")}return!1},removeExif=async(e,t)=>(t=t.toLowerCase().replace(".",""),imageFormatList.includes(t)?await sharp(e,{animated:!0}).toBuffer():e);var common=Object.freeze({__proto__:null,randomStringGenerator:randomStringGenerator,renameFileNameWithTimestamp:renameFileNameWithTimestamp,renameFileNameWithRandomString:renameFileNameWithRandomString,renameFileNameWithCustomString:renameFileNameWithCustomString,isUrl:isUrl,isUrlEncode:isUrlEncode,handleUrlEncode:handleUrlEncode,getImageSize:getImageSize,getFSFile:getFSFile,getURLFile:getURLFile,getPluginNameType:getPluginNameType,isSimpleName:isSimpleName,handleStreamlinePluginName:handleStreamlinePluginName,handleCompletePluginName:handleCompletePluginName,getProcessPluginName:getProcessPluginName,getNormalPluginName:getNormalPluginName,handleUnixStylePath:handleUnixStylePath,removePluginVersion:removePluginVersion,configBlackList:configBlackList,isConfigKeyInBlackList:isConfigKeyInBlackList,isInputConfigValid:isInputConfigValid,safeParse:safeParse,forceNumber:forceNumber,isDev:isDev,isProd:isProd,AddWatermark:AddWatermark,imageAddWaterMark:imageAddWaterMark,imageProcess:imageProcess,needAddWatermark:needAddWatermark,needCompress:needCompress,removeExif:removeExif});const upload={handle:e=>{e.cmd.program.command("upload").description("upload, go go go").arguments("[input...]").alias("u").action((t=>{(async()=>{const n=t.map((e=>isUrl(e)?e:path.resolve(e))).filter((t=>{const n=fs.existsSync(t)||isUrl(t);return n||e.log.warn(`${t} does not exist.`),n}));await e.upload(n)})().catch((t=>{e.log.error(t)}))}))}},config$e=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:"skipReSizeOfSmallImg",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_SKIPRESIZEOFSMALLIMG")},required:!1,default:t.skipReSizeOfSmallImg||!1},{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:"isFlip",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISFLIP")},required:!1,default:t.isFlip||!1},{name:"isFlop",type:"confirm",get alias(){return e.i18n.translate("BUILDIN_COMPRESS_ISFLOP")},required:!1,default:t.isFlop||!1},{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 compress={config:config$e};const config$d=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 watermark={config:config$d};const config$c=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}]};var rename={config:config$c};const handleConfig=async(e,t,n,r)=>{const i=await e.cmd.inquirer.prompt(t),a="uploader"===n?`picBed.${r}`:"transformer"===n?`transformer.${r}`:"buildin"===n?`buildIn.${r}`:r;e.saveConfig({[a]:i}),"uploader"===n?e.saveConfig({"picBed.current":r,"picBed.uploader":r}):"transformer"===n&&e.saveConfig({"picBed.transformer":r})},setting={handle:e=>{e.cmd.program.command("set").alias("config").arguments("<module> [name]").description("configure config of picgo modules, uploader|transformer|plugin|buildin").action(((t,n)=>{(async()=>{var r,i;try{switch(t){case"buildin":if("compress"===n)await handleConfig(e,compress.config(e),t,n);else if("watermark"===n)await handleConfig(e,watermark.config(e),t,n);else if("rename"===n)await handleConfig(e,rename.config(e),t,n);else{const n=[{type:"list",name:"buildin",choices:["compress","watermark","rename"],message:"Choose a buildin module"}],r=await e.cmd.inquirer.prompt(n);"compress"===r.buildin?await handleConfig(e,compress.config(e),t,r.buildin):"watermark"===r.buildin?await handleConfig(e,watermark.config(e),t,r.buildin):"rename"===r.buildin&&await handleConfig(e,rename.config(e),t,r.buildin)}break;case"uploader":case"transformer":if(n){const r=e.helper[t].get(n);if(!r)return void e.log.error(`No ${t} named ${n}`);r.config&&await handleConfig(e,r.config(e),t,n)}else{const n=[{type:"list",name:`${t}`,choices:e.helper[t].getIdList(),message:`Choose a(n) ${t}`}],r=await e.cmd.inquirer.prompt(n),i=e.helper[t].get(r[t]);(null==i?void 0:i.config)&&await handleConfig(e,i.config(e),t,r[t])}break;case"plugin":if(n){if(n.includes("picgo-plugin-")||(n=`picgo-plugin-${n}`),!Object.keys(e.getConfig("picgoPlugins")).includes(n))return void e.log.error(`No plugin named ${n}`);(null===(r=e.pluginLoader.getPlugin(n))||void 0===r?void 0:r.config)&&await handleConfig(e,e.pluginLoader.getPlugin(n).config(e),"plugin",n)}else{const t=[{type:"list",name:"plugin",choices:e.pluginLoader.getFullList(),message:"Choose a plugin"}],n=await e.cmd.inquirer.prompt(t);(null===(i=e.pluginLoader.getPlugin(n.plugin))||void 0===i?void 0:i.config)&&await handleConfig(e,e.pluginLoader.getPlugin(n.plugin).config(e),"plugin",n.plugin)}break;default:return e.log.warn(`No module named ${t}`),void 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)}))}))}},use={handle:async e=>{const t=e.cmd;t.program.command("use").arguments("[module]").description("use modules of picgo").action((n=>{(async()=>{try{let r=[];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(n){if(!i[n])return e.log.warn(`No module named ${n}`),void e.log.warn("Available modules are uploader|transformer|plugins");r.push(i[n])}else r=Object.keys(i).map((e=>i[e]));const a=await t.inquirer.prompt(r);if(a.plugins){const t=e.getConfig("picgoPlugins");Object.keys(t).forEach((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)}))}))}},proxy={handle:e=>{e.cmd.program.option("-p, --proxy <url>","set proxy for uploading",(t=>{e.setConfig({"picBed.proxy":t})}))}},generate=async(e,t)=>{try{const n=getOptions$1(t.tmp),r=path.join(t.tmp,"template");let i={};n.prompts&&n.prompts.length>0&&(i=await e.cmd.inquirer.prompt(n.prompts));let a=await globby(["**/*"],{cwd:r,dot:!0});if(a=a.filter((t=>{let r="";return Object.keys(n.filters).forEach((e=>{match(t,e,{dot:!0})&&(r=t)})),!r||filters(e,n.filters[r],i)})),0===a.length)return void e.log.warn("Template files not found!");const s=render(a,r,i);writeFileTree(t.dest,s),"function"==typeof n.complete&&n.complete({answers:i,options:t,files:a,ctx:e}),n.completeMessage&&e.log.success(n.completeMessage),e.log.success("Done!")}catch(t){e.log.error(t)}},filters=(e,t,n)=>{const r=new Function("data","with (data) { return "+t+"}");try{return r(n)}catch(n){return e.log.error(`Error when evaluating filter condition: ${JSON.stringify(t)}`),!1}},getOptions$1=e=>{const t=path.join(e,"index.js");if(fs.existsSync(t)){return require(t)}return{}},render=(e,t,n)=>{const r={};return e.forEach((e=>{const i=fs.readFileSync(path.join(t,e),"utf8"),a=ejs.render(i,n);(Buffer.isBuffer(a)||/[^\s]/.test(a))&&(r[e]=a)})),r},writeFileTree=(e,t)=>{Object.keys(t).forEach((n=>{const r=path.join(e,n);fs.ensureDirSync(path.dirname(r)),fs.writeFileSync(r,t[n])}))},run=(e,t)=>{t.offline?fs.existsSync(t.template)?generate(e,t).catch((t=>{e.log.error(t)})):e.log.error(`Local template ${t.template} not found`):(t.template=t.hasSlash?t.template:"PicGo/picgo-template-"+t.template,downloadAndGenerate(e,t))},downloadAndGenerate=(e,t)=>{fs.existsSync(t.tmp)&&rm.sync(t.tmp),e.log.info("Template files are downloading..."),download(t.template,t.tmp,{clone:t.clone},(n=>{n?e.log.error(n):(e.log.success("Template files are downloaded!"),generate(e,t).catch((t=>{e.log.error(t)})))}))},init={handle:async e=>{e.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(((t,n,r)=>{(async()=>{try{const i=t.includes("/"),a=!n||"."===n,s=path.resolve(n||"."),o=r.clone||!1,l=r.offline||!1,E=path.join(homedir(),".picgo/templates",t.replace(/[/:]/g,"-"));r.offline&&(t=E);const I={template:t,project:n,hasSlash:i,inPlace:a,dest:s,clone:o,tmp:E,offline:l};a||fs.existsSync(s)?await e.cmd.inquirer.prompt([{type:"confirm",message:a?"Generate project in current directory?":"Target directory exists. Continue?",name:"ok"}]).then((t=>{t.ok&&run(e,I)})):run(e,I)}catch(t){if(e.log.error(t),process.argv.includes("--debug"))throw t}})().catch((t=>{e.log.error(t)}))})).on("--help",(()=>{console.log(),console.log("Examples:"),console.log(),console.log(chalk.gray(" # create a new project with an official template")),console.log(" $ picgo init plugin my-project"),console.log(),console.log(chalk.gray(" # create a new project straight from a github template")),console.log(" $ picgo init username/repo my-project"),console.log()}))}},i18n={handle:e=>{e.cmd.program.command("i18n").arguments("[lang]").description("change picgo language").action((async(t="")=>{const n=e.i18n.getLanguageList();if(!t){const t=[{type:"list",name:"i18n",choices:n,message:"Choose a language",default:e.getConfig("settings.language")||"zh-CN"}],r=await e.cmd.inquirer.prompt(t);return e.i18n.setLanguage(r.i18n),void e.log.success(`Language set to ${r.i18n}`)}n.includes(t)?(e.i18n.setLanguage(t),e.log.success(`Language set to ${t}`)):e.log.warn("No such language")}))}};var commanders=e=>{e.cmd.register("pluginHandler",pluginHandler),e.cmd.register("config",config$f),e.cmd.register("setting",setting),e.cmd.register("upload",upload),e.cmd.register("use",use),e.cmd.register("proxy",proxy),e.cmd.register("init",init),e.cmd.register("i18n",i18n)};class LifecyclePlugins{constructor(e){this.name=e,this.list=new Map,this.pluginIdMap=new Map}register(e,t){var n;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),LifecyclePlugins.currentPlugin&&(this.pluginIdMap.has(LifecyclePlugins.currentPlugin)?null===(n=this.pluginIdMap.get(LifecyclePlugins.currentPlugin))||void 0===n||n.push(e):this.pluginIdMap.set(LifecyclePlugins.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 setCurrentPluginName=(e=null)=>{LifecyclePlugins.currentPlugin=e},getCurrentPluginName=()=>LifecyclePlugins.currentPlugin;class Commander{constructor(e){this.name="commander",this.list=new Map,this.pluginIdMap=new Map,this.program=new Command,this.inquirer=inquirer,this.ctx=e}getName(){return this.name}init(){this.program.version("1.3.8","-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)})),commanders(this.ctx)}register(e,t){var n;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 r=getCurrentPluginName();null!==r&&(this.pluginIdMap.has(r)?null===(n=this.pluginIdMap.get(r))||void 0===n||n.push(e):this.pluginIdMap.set(r,[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 ILogType,IBuildInEvent,IBusEvent;!function(e){e.success="success",e.info="info",e.warn="warn",e.error="error"}(ILogType||(ILogType={})),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"}(IBuildInEvent||(IBuildInEvent={})),function(e){e.CONFIG_CHANGE="CONFIG_CHANGE"}(IBusEvent||(IBusEvent={}));class Logger{constructor(e){this.level={[ILogType.success]:"green",[ILogType.info]:"blue",[ILogType.warn]:"yellow",[ILogType.error]:"red"},this.ctx=e}handleLog(e,...t){if(this.logLevel=this.ctx.getConfig("settings.logLevel"),!this.ctx.getConfig("silent")&&this.checkLogLevel(e,this.logLevel)){const n=chalk[this.level[e]](`[PicList ${e.toUpperCase()}]:`);console.log(n,...t),this.logPath=this.ctx.getConfig("settings.logPath")||path.join(this.ctx.baseDir,"./piclist.log"),setTimeout((()=>{try{const n=this.checkLogFileIsLarge(this.logPath);if(n.isLarge){const e=`Log file is too large (> ${n.logFileSizeLimit/1024/1024||"10"} MB), recreate log file`;console.log(chalk.yellow("[PicList WARN]:"),e),this.recreateLogFile(this.logPath),t.unshift(e)}this.handleWriteLog(this.logPath,e,...t)}catch(e){console.error("[PicList Error] on checking log file size",e)}}),0)}}checkLogFileIsLarge(e){if(fs.existsSync(e)){const t=fs.statSync(e).size,n=1024*forceNumber(this.ctx.getConfig("settings.logFileSizeLimit")||10)*1024;return{isLarge:t>n,logFileSize:t,logFileSizeLimit:n}}return{isLarge:!1}}recreateLogFile(e){fs.existsSync(e)&&(fs.unlinkSync(e),fs.createFileSync(e))}handleWriteLog(e,t,...n){try{let r=`${dayjs().format("YYYY-MM-DD HH:mm:ss")} [PicList ${t.toUpperCase()}] `;n.forEach((e=>{e instanceof Error&&"error"===t?r+=`\n------Error Stack Begin------\n${util.format(null==e?void 0:e.stack)}\n-------Error Stack End------- `:("object"==typeof e&&(e=JSON.stringify(e,null,2)),r+=`${e} `)})),r+="\n",fs.appendFileSync(e,r)}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){this.handleLog(ILogType.success,...e)}info(...e){this.handleLog(ILogType.info,...e)}error(...e){this.handleLog(ILogType.error,...e)}warn(...e){this.handleLog(ILogType.warn,...e)}debug(...e){isDev()&&this.handleLog(ILogType.info,...e)}}const createContext=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)});class Lifecycle extends EventEmitter{constructor(e){super(),this.ttfLink="https://release.piclist.cn/simhei.ttf",this.ctx=e;const t=path.join(e.baseDir,"piclistTemp"),n=path.join(e.baseDir,"imgTemp");fs.ensureDirSync(n),fs.emptyDirSync(t),this.ttfPath=path.join(e.baseDir,"assets","simhei.ttf")}async downloadTTF(){const e=path.dirname(this.ttfPath);if(fs.existsSync(e)||fs.mkdirSync(e,{recursive:!0}),fs.existsSync(this.ttfPath))return!0;this.ctx.log.info("Download ttf file.");try{const e=await axios.get(this.ttfLink,{responseType:"arraybuffer"});return fs.writeFileSync(this.ttfPath,e.data),this.ctx.log.info("Download ttf file success."),!0}catch(e){return this.ctx.log.error("Download ttf file failed."),!1}}async start(e){const t=createContext(this.ctx);try{if(!Array.isArray(e))throw new Error("Input must be an array.");t.input=e,t.rawInputPath=[],t.rawInput=cloneDeep(e),t.output=[];const n=t.getConfig("buildIn.compress"),r=t.getConfig("picBed.uploader")||t.getConfig("picBed.current")||"smms";!t.helper.uploader.get(r)&&n?n.picBed="smms":n&&(n.picBed=r);const i=t.getConfig("buildIn.watermark");if(n||i){const e=path.join(t.baseDir,"piclistTemp");fs.existsSync(e)||fs.mkdirSync(e);const r="Add watermark to image",a="Compress or convert image";await Promise.allSettled(t.input.map((async(s,o)=>{var l,E,I,c,u,_,p;let S;if(isUrl(s)){if(t.rawInputPath[o]=s,S=await getURLFile(s,t),!S.success||!S.buffer)throw new Error(S.reason);{let p,g=!1;if(needAddWatermark(i,null!==(l=S.extname)&&void 0!==l?l:"")){if(!(null==i?void 0:i.watermarkFontPath)&&"image"!==(null==i?void 0:i.watermarkType)){await this.downloadTTF()||(this.ctx.log.warn("Download ttf file failed, skip add watermark."),g=!0)}g||(t.log.info(r),p=await imageAddWaterMark(S.buffer,i,this.ttfPath))}if(needCompress(n,null!==(E=S.extname)&&void 0!==E?E:"")&&(t.log.info(a),p=await imageProcess(null!=p?p:S.buffer,n,null!==(I=S.extname)&&void 0!==I?I:"")),!p&&(null==n?void 0:n.isRemoveExif)&&(t.log.info("Remove exif info."),p=await removeExif(S.buffer,null!==(c=S.extname)&&void 0!==c?c:"")),p){let r;r=(null==n?void 0:n.isConvert)?null!==(u=null==n?void 0:n.convertFormat)&&void 0!==u?u:"jpg":null!==(_=S.extname)&&void 0!==_?_:"",r=r.startsWith(".")?r:`.${r}`;const i=path.join(e,`${S.fileName?`${path.basename(S.fileName,path.extname(S.fileName))}${r}`:(new Date).getTime()}${r}`);t.rawInputPath[o]=path.join(path.dirname(s),path.basename(i)),fs.writeFileSync(i,p),t.input[o]=i}}}else{let l;if(t.rawInputPath[o]=s,needAddWatermark(i,path.extname(s))){await this.downloadTTF()?(t.log.info(r),l=await imageAddWaterMark(fs.readFileSync(s),i,this.ttfPath)):this.ctx.log.warn("Download ttf file failed, skip add watermark.")}if(needCompress(n,path.extname(s)))if(t.log.info(a),".heic"===path.extname(s)||".heif"===path.extname(s)){const t=fs.readFileSync(s),r=await heicConvert({buffer:t,format:"JPEG",quality:1}),i=path.join(e,`${path.basename(s,path.extname(s))}.jpg`);fs.writeFileSync(i,Buffer.from(r)),l=await imageProcess(fs.readFileSync(i),n,".jpg")}else l=await imageProcess(null!=l?l:fs.readFileSync(s),n,path.extname(s));if(!l&&(null==n?void 0:n.isRemoveExif)&&(t.log.info("Remove exif info."),l=await removeExif(fs.readFileSync(s),path.extname(s))),l){let r;r=(null==n?void 0:n.isConvert)?null!==(p=null==n?void 0:n.convertFormat)&&void 0!==p?p:"jpg":path.extname(s),r=r.startsWith(".")?r:`.${r}`;const i=path.join(e,`${path.basename(s,path.extname(s))}${r}`);t.rawInputPath[o]=path.join(path.dirname(s),`${path.basename(s,path.extname(s))}${r}`),fs.writeFileSync(i,l),t.input[o]=i}}})))}else for(const e of t.input)t.rawInputPath.push(e);await this.beforeTransform(t),await this.doTransform(t);const a=t.getConfig("buildIn.rename")||{};if(a.enable){const e=a.format||"{filename}";t.output=t.output.map(((n,r)=>{let i=n.fileName;return e&&(i=renameFileNameWithCustomString(t.rawInputPath[r],e),i=i.replace(/\/+/g,"/"),"/"===i.slice(-1)&&(i+=r.toString())),n.fileName=i,n}))}return await this.beforeUpload(t),await this.doUpload(t),t.input=t.rawInput,await this.afterUpload(t),t}catch(e){if(t.log.warn(IBuildInEvent.FAILED),t.emit(IBuildInEvent.UPLOAD_PROGRESS,-1),t.emit(IBuildInEvent.FAILED,e),t.log.error(e),t.getConfig("debug"))throw e;return t}}async beforeTransform(e){return e.emit(IBuildInEvent.UPLOAD_PROGRESS,0),e.emit(IBuildInEvent.BEFORE_TRANSFORM,e),e.log.info("Before transform"),await this.handlePlugins(e.helper.beforeTransformPlugins,e),e}async doTransform(e){e.emit(IBuildInEvent.UPLOAD_PROGRESS,30);const t=e.getConfig("picBed.transformer")||"path";let n=t,r=e.helper.transformer.get(t);return r||(r=e.helper.transformer.get("path"),n="path",e.log.warn(`Can't find transformer - ${t}, switch to default transformer - path`)),e.log.info(`Transforming... Current transformer is [${n}]`),await(null==r?void 0:r.handle(e)),e}async beforeUpload(e){return e.emit(IBuildInEvent.UPLOAD_PROGRESS,60),e.log.info("Before upload"),e.emit(IBuildInEvent.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",n=e.helper.uploader.get(t),r=t;n||(t="smms",r="smms",n=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 [${r}]`),await(null==n?void 0:n.handle(e));for(const n of e.output)n.type=t;return e}async afterUpload(e){e.emit(IBuildInEvent.AFTER_UPLOAD,e),e.emit(IBuildInEvent.UPLOAD_PROGRESS,100),await this.handlePlugins(e.helper.afterUploadPlugins,e);let t="";const n=e.output.length,r=!0===e.getConfig("settings.encodeOutputURL");for(let i=0;i<n;i++)void 0!==e.output[i].imgUrl&&(t+=r?handleUrlEncode(e.output[i].imgUrl):e.output[i].imgUrl,i!==n-1&&(t+="\n")),delete e.output[i].base64Image,delete e.output[i].buffer;return e.emit(IBuildInEvent.FINISHED,e),e.log.success(`\n${t}`),e}async handlePlugins(e,t){const n=e.getList(),r=e.getIdList(),i=e.getName();return await Promise.all(n.map((async(e,n)=>{try{t.log.info(`${i}: ${r[n]} running`),await e.handle(t)}catch(e){throw t.log.error(`${i}: ${r[n]} error`),e}}))),t}}const postOptions$8=(e,t,n,r="")=>({method:"POST",url:`https://${r||"sm.ms"}/api/v2/upload`,headers:{contentType:"multipart/form-data","User-Agent":"PicList",Authorization:n},formData:{smfile:{value:t,options:{filename:e}},ssl:"true"}}),handle$d=async e=>{const t=e.getConfig("picBed.smms");if(!t)throw new Error("Can not find smms config!");const n=e.output;for(const r of n)if(r.fileName&&r.buffer){let n=r.buffer;!n&&r.base64Image&&(n=Buffer.from(r.base64Image,"base64"));const i=postOptions$8(r.fileName,n,null==t?void 0:t.token,null==t?void 0:t.backupDomain);try{const t=await e.request(i),n=JSON.parse(t);if("success"===n.code)delete r.base64Image,delete r.buffer,r.imgUrl=n.data.url,r.hash=n.data.hash;else{if("image_repeated"!==n.code||"string"!=typeof n.images)throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:n.message}),new Error(n.message);delete r.base64Image,delete r.buffer,r.imgUrl=n.images}}catch(t){throw e.log.error(t),t}}return e},config$b=e=>{const t=e.getConfig("picBed.smms")||{};return[{name:"token",message:"api token",type:"input",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}]};function register$b(e){e.helper.uploader.register("smms",{get name(){return e.i18n.translate("PICBED_SMMS")},handle:handle$d,config:config$b})}const generateSignature$2=(e,t)=>{const n=e.secretId,r=e.secretKey,i=e.appId,a=e.bucket;let s,o="";if(e.version&&"v4"!==e.version){const n=Math.floor((new Date).getTime()/1e3);o=`${n};${n+86400}`;const i=crypto.createHmac("sha1",r).update(o).digest("hex"),a=e.endpoint?e.endpoint:`cos.${e.area}.myqcloud.com`,l=`put\n/${e.path}${t}\n\nhost=${e.bucket}.${a}\n`,E=`sha1\n${o}\n${crypto.createHash("sha1").update(l).digest("hex")}\n`;s=crypto.createHmac("sha1",i).update(E).digest("hex")}else{const e=Math.floor(1e10*Math.random()),t=Math.floor((new Date).getTime()/1e3)-1,o=`a=${i}&b=${a}&k=${n}&e=${t+3600}&t=${t}&r=${e}&f=`,l=crypto.createHmac("sha1",r).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}},postOptions$7=(e,t,n,r,i)=>{const a=e.area,s=e.path;if(e.version&&"v4"!==e.version){const a=e.endpoint?e.endpoint:`cos.${e.area}.myqcloud.com`;return{method:"PUT",url:`http://${e.bucket}.${a}/${encodeURIComponent(s)}${encodeURIComponent(t)}`,headers:{Host:`${e.bucket}.${a}`,Authorization:`q-sign-algorithm=sha1&q-ak=${e.secretId}&q-sign-time=${n.signTime}&q-key-time=${n.signTime}&q-header-list=host&q-url-param-list=&q-signature=${n.signature}`,contentType:mime.lookup(t)||"application/octet-stream","User-Agent":`PicGo;${i};null;null`},body:r,resolveWithFullResponse:!0}}return{method:"POST",url:`http://${a}.file.myqcloud.com/files/v2/${n.appId}/${n.bucket}/${encodeURI(s)}${t}`,headers:{Host:`${a}.file.myqcloud.com`,Authorization:n.signature,contentType:"multipart/form-data","User-Agent":`PicGo;${i};null;null`},formData:{op:"upload",filecontent:r},resolveWithFullResponse:!0}},handle$c=async e=>{var t,n,r,i;const a=e.getConfig("picBed.tcyun");if(!a)throw new Error("Can't find tencent COS config");try{const s=e.output,o=a.customUrl,l=null!==(t=a.path)&&void 0!==t?t:"",E=!a.version||"v4"===a.version;for(const t of s)if(t.fileName&&t.buffer){const s=generateSignature$2(a,t.fileName);if(!s)return!1;let I=t.buffer;!I&&t.base64Image&&(I=Buffer.from(t.base64Image,"base64"));const c=postOptions$7(a,t.fileName,s,I,e.GUI_VERSION||e.VERSION),u=await e.request(c).then((e=>e)).catch((t=>({statusCode:400,body:{msg:e.i18n.translate("AUTH_FAILED"),err:t}})));let _;if(_=E&&"string"==typeof u?JSON.parse(u):u,400===_.statusCode)throw(null===(n=null==_?void 0:_.body)||void 0===n?void 0:n.err)?_.body.err:new Error((null===(r=null==_?void 0:_.body)||void 0===r?void 0:r.msg)||(null===(i=null==_?void 0:_.body)||void 0===i?void 0:i.message));const p=a.options||"",S=void 0!==a.slim&&!!a.slim;if(E&&"SUCCESS"===_.message)delete t.base64Image,delete t.buffer,t.imgUrl=o?`${o}/${l}${t.fileName}`:`${_.data.source_url}${p}`;else{if(E||!_||200!==_.statusCode)throw new Error(u.body.msg);if(delete t.base64Image,delete t.buffer,o)t.imgUrl=`${o}/${encodeURIComponent(l)}${encodeURIComponent(t.fileName)}${p}`.replace(/%2F/g,"/");else{const e=a.endpoint?a.endpoint:`cos.${a.area}.myqcloud.com`;t.imgUrl=`https://${a.bucket}.${e}/${encodeURIComponent(l)}${encodeURIComponent(t.fileName)}${p}`.replace(/%2F/g,"/")}}S&&(t.imgUrl+=p?"&imageSlim":"?imageSlim")}return e}catch(t){if(!a.version||"v4"===a.version)try{const n=JSON.parse(t.error);e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:n.code}),text:"https://cloud.tencent.com/document/product/436/8432"})}catch(e){}throw t}},config$a=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:"input",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:"endpoint",type:"input",get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_ENDPOINT")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_ENDPOINT")},default:t.endpoint||"",get message(){return e.i18n.translate("PICBED_TENCENTCLOUD_MESSAGE_ENDPOINT")},required:!1},{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},{name:"slim",type:"confirm",default:void 0!==t.slim&&!!t.slim,get prefix(){return e.i18n.translate("PICBED_TENCENTCLOUD_SLIM")},get alias(){return e.i18n.translate("PICBED_TENCENTCLOUD_SLIM")},required:!1,get confirmText(){return e.i18n.translate("PICBED_TENCENTCLOUD_SLIM_CONFIRM")},get cancelText(){return e.i18n.translate("PICBED_TENCENTCLOUD_SLIM_CANCEL")},get tips(){return e.i18n.translate("PICBED_TENCENTCLOUD_SLIM_TIP")}}]};function register$a(e){e.helper.uploader.register("tcyun",{get name(){return e.i18n.translate("PICBED_TENCENTCLOUD")},handle:handle$c,config:config$a})}const postOptions$6=(e,t,n)=>{const r=t.path||"",{token:i,repo:a}=t;return{method:"PUT",url:`https://api.github.com/repos/${a}/contents/${encodeURIComponent(r)}${encodeURIComponent(e)}`.replace(/%2F/g,"/"),headers:{Authorization:`token ${i}`,"User-Agent":"PicList","Content-Type":mime.lookup(e)||"application/octet-stream"},body:n,json:!0}},getOptions=(e,t)=>{const n=t.path||"",{token:r,repo:i,branch:a}=t;return{method:"GET",url:`https://api.github.com/repos/${i}/contents/${encodeURIComponent(n)}${encodeURIComponent(e)}?ref=${a}`.replace(/%2F/g,"/"),headers:{Authorization:`token ${r}`,"User-Agent":"PicGo"},json:!0}},handle$b=async e=>{const t=e.getConfig("picBed.github");if(!t)throw new Error("Can't find github config");try{const n=e.output,r=t.path||"";for(const i of n)if(i.fileName&&i.buffer){const n=i.base64Image||Buffer.from(i.buffer).toString("base64"),a={message:"Upload by PicList",branch:t.branch,content:n,path:r+encodeURI(i.fileName)},s=postOptions$6(i.fileName,t,a);try{const n=await e.request(s);if(!n)throw new Error("Server error, please try again");delete i.base64Image,delete i.buffer,t.customUrl?i.imgUrl=`${t.customUrl}/${encodeURIComponent(r)}${encodeURIComponent(i.fileName)}`.replace(/%2F/g,"/"):i.imgUrl=n.content.download_url,i.hash=n.content.sha}catch(n){if(422!==n.statusCode)throw n;{delete i.base64Image,delete i.buffer;const n=await e.request(getOptions(i.fileName,t));if(!Object.keys(n).length)throw new Error("Get Contents error, please try again");i.hash=n.sha,t.customUrl?i.imgUrl=`${t.customUrl}/${encodeURIComponent(r)}${encodeURIComponent(i.fileName)}`.replace(/%2F/g,"/"):i.imgUrl=n.download_url}}}return e}catch(t){throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK")}),t}},config$9=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:"input",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 register$9(e){e.helper.uploader.register("github",{get name(){return e.i18n.translate("PICBED_GITHUB")},handle:handle$b,config:config$9})}function postOptions$5(e,t,n,r){const i=selectArea(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 ${n}`,"Content-Type":mime.lookup(t)||"application/octet-stream"},body:r}}function selectArea(e){return"z0"===e?"":"-"+e}function getToken(e){const t=e.accessKey,n=e.secretKey,r=new qiniu.auth.digest.Mac(t,n),i={scope:e.bucket};return new qiniu.rs.PutPolicy(i).uploadToken(r)}const handle$a=async e=>{const t=e.getConfig("picBed.qiniu");if(!t)throw new Error("Can't find qiniu config");try{const n=e.output;for(const r of n)if(r.fileName&&r.buffer){const n=r.base64Image||Buffer.from(r.buffer).toString("base64"),i=postOptions$5(t,r.fileName,getToken(t),n),a=await e.request(i),s=JSON.parse(a);if(!(null==s?void 0:s.key))throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:s.msg}),e.log.error("qiniu error",s),new Error("Upload failed");{delete r.base64Image,delete r.buffer;const e=t.url,n=t.options||"";r.imgUrl=`${e}/${s.key}${n}`}}return e}catch(t){if("Upload failed"!==t.message&&t.response){const n=t.response.body;e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:n.error})}throw t}},config$8=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:"input",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}]};function register$8(e){e.helper.uploader.register("qiniu",{get name(){return e.i18n.translate("PICBED_QINIU")},handle:handle$a,config:config$8})}const formatAccessToken=e=>e?e.startsWith("Bearer")?e:`Bearer ${e}`:"",postOptions$4=async(e,t,n,r)=>{const i=t.clientId||"",a=t.username||"",s=formatAccessToken(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:r,type:"base64",name:n,description:"Uploaded with PicList"}};if(a&&s&&o){let n,r=0,i="";do{const s={method:"GET",url:`https://api.imgur.com/3/account/${a}/albums/${r}`,headers:{Authorization:l},json:!0,resolveWithFullResponse:!0,timeout:1e4};if(t.proxy&&(s.proxy=t.proxy),n=await e.request(s),200!==n.statusCode||!n.body.success)throw new Error("Server error, please try again");const E=n.body.data;for(const e of E)if(e.title===o){i=e.id;break}r++}while(n.body.data.length>0);i&&E.formData&&(E.formData.album=i)}return t.proxy&&(E.proxy=t.proxy),E},handle$9=async e=>{var t;const n=e.getConfig("picBed.imgur");if(!n)throw new Error("Can't find imgur config");try{const t=e.output;for(const r of t)if(r.fileName&&r.buffer){const t=r.base64Image||Buffer.from(r.buffer).toString("base64"),i=await postOptions$4(e,n,r.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 r.base64Image,delete r.buffer,r.imgUrl=s.data.link,r.hash=s.data.deletehash}return e}catch(n){throw e.emit(IBuildInEvent.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==n?void 0:n.response)||void 0===t?void 0:t.data)||n}},config$7=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}]};function register$7(e){e.helper.uploader.register("imgur",{get name(){return e.i18n.translate("PICBED_IMGUR")},handle:handle$9,config:config$7})}const generateSignature$1=(e,t)=>{const n=(new Date).toUTCString(),r=`PUT\n\n${mime.lookup(t)||"application/octet-stream"}\n${n}\n/${e.bucket}/${e.path}${t}`,i=crypto.createHmac("sha1",e.accessKeySecret).update(r).digest("base64");return`OSS ${e.accessKeyId}:${i}`},postOptions$3=(e,t,n,r)=>({method:"PUT",url:`https://${e.bucket}.${e.area}.aliyuncs.com/${encodeURIComponent(e.path)}${encodeURIComponent(t)}`.replace(/%2F/g,"/"),headers:{Host:`${e.bucket}.${e.area}.aliyuncs.com`,Authorization:n,Date:(new Date).toUTCString(),"Content-Type":mime.lookup(t)},body:r,resolveWithFullResponse:!0}),handle$8=async e=>{var t;const n=e.getConfig("picBed.aliyun");if(!n)throw new Error("Can't find aliYun OSS config");n.path=n.path.replace(/\/*$/,"").replace(/^\/*/,"")+"/","/"===n.path&&(n.path="");try{const r=e.output,i=n.customUrl,a=null!==(t=n.path)&&void 0!==t?t:"";for(const t of r)if(t.fileName&&t.buffer){const r=generateSignature$1(n,t.fileName);let s=t.buffer;!s&&t.base64Image&&(s=Buffer.from(t.base64Image,"base64"));const o=postOptions$3(n,t.fileName,r,s);if(200!==(await e.request(o)).statusCode)throw new Error("Upload failed");{delete t.base64Image,delete t.buffer;const e=n.options||"";t.imgUrl=i?`${i}/${encodeURIComponent(a)}${encodeURIComponent(t.fileName)}${e}`.replace(/%2F/g,"/"):`https://${n.bucket}.${n.area}.aliyuncs.com/${encodeURIComponent(a)}${encodeURIComponent(t.fileName)}${e}`.replace(/%2F/g,"/")}}return e}catch(t){throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},config$6=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:"input",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}]};function register$6(e){e.helper.uploader.register("aliyun",{get name(){return e.i18n.translate("PICBED_ALICLOUD")},handle:handle$8,config:config$6})}const generateSignature=(e,t)=>{const n=e.path||"",r=e.operator,i=MD5(e.password),a=(new Date).toUTCString(),s=`PUT&${`/${e.bucket}/${encodeURIComponent(n)}${encodeURIComponent(t)}`.replace(/%2F/g,"/")}&${a}`;return`UPYUN ${r}:${crypto.createHmac("sha1",i).update(s).digest("base64")}`},postOptions$2=(e,t,n,r)=>{const i=e.bucket,a=e.path||"";return{method:"PUT",url:`https://v0.api.upyun.com/${i}/${encodeURIComponent(a)}${encodeURIComponent(t)}`.replace(/%2F/g,"/"),headers:{Authorization:n,Date:(new Date).toUTCString(),"Content-Type":mime.lookup(t)||"application/octet-stream"},body:r,resolveWithFullResponse:!0}};function MD5(e){return crypto.createHash("md5").update(e).digest("hex")}const getAntiLeechParam=(e,t,n,r)=>{const i=`/${n.path||""}${r}`.replace(/%2F/g,"/").replace(/^\/+/g,"/"),a=Math.round((new Date).getTime()/1e3),s=t?a+parseInt(t.toString(),10):a+1800;return`_upt=${`${MD5(`${e}&${s}&${i}`).substring(12,20)}${s}`}`},handle$7=async e=>{const t=e.getConfig("picBed.upyun");if(!t)throw new Error("Can't find upYun config");try{const n=e.output,r=t.path||"";for(const i of n)if(i.fileName&&i.buffer){let n=i.buffer;!n&&i.base64Image&&(n=Buffer.from(i.base64Image,"base64"));const a=generateSignature(t,i.fileName),s=postOptions$2(t,i.fileName,a,n),o=t.options||"";if(200!==(await e.request(s)).statusCode)throw new Error("Upload failed");if(delete i.base64Image,delete i.buffer,i.imgUrl=`${t.url}/${encodeURIComponent(r)}${encodeURIComponent(i.fileName)}${o}`.replace(/%2F/g,"/"),t.antiLeechToken){const e=getAntiLeechParam(t.antiLeechToken,t.expireTime,t,i.fileName);i.imgUrl=i.imgUrl.includes("?")?`${i.imgUrl}&${e}`:`${i.imgUrl}?${e}`}}return e}catch(t){if("Upload failed"===t.message)e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")});else{const n=safeParse(t.error);e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("UPLOAD_FAILED_REASON",{code:"object"==typeof n?n.code:n}),text:"http://docs.upyun.com/api/errno/"})}throw t}},config$5=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:"input",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},{name:"antiLeechToken",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_ANTI_LEECH_TOKEN")},get alias(){return e.i18n.translate("PICBED_UPYUN_ANTI_LEECH_TOKEN")},get message(){return e.i18n.translate("PICBED_UPYUN_ANTI_LEECH_TOKEN")},default:t.antiLeechToken||"",required:!1},{name:"expireTime",type:"input",get prefix(){return e.i18n.translate("PICBED_UPYUN_EXPIRE_TIME")},get alias(){return e.i18n.translate("PICBED_UPYUN_EXPIRE_TIME")},get message(){return e.i18n.translate("PICBED_UPYUN_EXPIRE_TIME")},default:t.expireTime||"",required:!1}]};function register$5(e){e.helper.uploader.register("upyun",{get name(){return e.i18n.translate("PICBED_UPYUN")},handle:handle$7,config:config$5})}const handle$6=async ctx=>{const{AuthType:AuthType,createClient:createClient}=await eval("import('webdav/dist/node/index.js')"),webdavplistOptions=ctx.getConfig("picBed.webdavplist");if(!webdavplistOptions)throw new Error("Can't find webdavplist config");webdavplistOptions.host=webdavplistOptions.host.replace(/^https?:\/\/|\/+$/g,""),webdavplistOptions.host=(webdavplistOptions.sslEnabled?"https://":"http://")+webdavplistOptions.host,webdavplistOptions.path=(webdavplistOptions.path||"").replace(/^\/+|\/+$/g,"")+"/";const authType=webdavplistOptions.authType||"basic",webpath=(webdavplistOptions.webpath||"").replace(/^\/+|\/+$/g,"")+"/";try{const e=ctx.output,t=webdavplistOptions.customUrl,n=webdavplistOptions.path;for(const r of e)if(r.fileName&&r.buffer){let e=r.buffer;!e&&r.base64Image&&(e=Buffer.from(r.base64Image,"base64"));const i={username:webdavplistOptions.username,password:webdavplistOptions.password,maxBodyLength:4294967296,maxContentLength:4294967296};"digest"===authType&&(i.authType=AuthType.Digest);const a=createClient(webdavplistOptions.host,i),s="/"===n?"":n;s&&await a.createDirectory(s,{recursive:!0});const o=await a.putFileContents(`${n}${r.fileName}`.replace(/^\/+|\/+$/g,""),e,{overwrite:!0});if(!o)throw new Error("Upload failed");{const i=path.join(ctx.baseDir,"imgTemp","webdavplist"),a=path.join(i,r.fileName);fs.ensureDirSync(i),fs.writeFileSync(a,e),delete r.base64Image,delete r.buffer;const s=t||webdavplistOptions.host;webdavplistOptions.webpath?r.imgUrl=`${s}/${"/"===webpath?"":encodeURIComponent(webpath)}${encodeURIComponent(r.fileName)}`.replace(/%2F/g,"/"):r.imgUrl=`${s}/${"/"===n?"":encodeURIComponent(n)}${encodeURIComponent(r.fileName)}`.replace(/%2F/g,"/"),r.galleryPath=`http://localhost:36699/webdavplist/${encodeURIComponent(r.fileName)}`}}return ctx}catch(e){throw ctx.emit(IBuildInEvent.NOTIFICATION,{title:ctx.i18n.translate("UPLOAD_FAILED"),body:ctx.i18n.translate("CHECK_SETTINGS")}),e}},config$4=e=>{var t;const n=e.getConfig("picBed.webdavplist")||{};return[{name:"host",type:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_HOST")},default:n.host||"",required:!0},{name:"sslEnabled",type:"confirm",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_SSLENABLED")},required:!1,default:null!==(t=n.sslEnabled)&&void 0!==t&&t,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:n.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:"input",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_PASSWORD")},default:n.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:n.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:n.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:n.customUrl||"",required:!1,get prefix(){return e.i18n.translate("PICBED_WEBDAVPLIST_CUSTOMURL")},get message(){return e.i18n.translate("PICBED_WEBDAVPLIST_MESSAGE_CUSTOMURL")}},{name:"authType",type:"list",get alias(){return e.i18n.translate("PICBED_WEBDAVPLIST_AUTHTYPE")},choices:["basic","digest"],default:n.authType||"basic",required:!1}]};function register$4(e){e.helper.uploader.register("webdavplist",{get name(){return e.i18n.translate("PICBED_WEBDAVPLIST")},handle:handle$6,config:config$4})}const handle$5=async e=>{const t=e.getConfig("picBed.local");if(!t)throw new Error("Can not find local config!");const n=t.path||"";let r=t.customUrl||"";r&&(r=r.replace(/\/$/,""));let i=t.webPath||"";i&&(i=i.replace(/\\/g,"/").replace(/^\//,"").replace(/\/$/,""));const a=e.output;for(const t of a)if(t.fileName&&t.buffer){let a=t.buffer;!a&&t.base64Image&&(a=Buffer.from(t.base64Image,"base64"));try{try{const s=path.join(e.baseDir,"imgTemp","local");fs.ensureDirSync(s),fs.ensureDirSync(n),fs.writeFileSync(path.join(n,t.fileName),a),fs.copyFileSync(path.join(n,t.fileName),path.join(e.baseDir,"imgTemp","local",t.fileName)),delete t.base64Image,delete t.buffer,t.imgUrl=r?i?`${r}/${encodeURIComponent(i)}/${encodeURIComponent(t.fileName)}`.replace(/%2F/g,"/"):`${r}/${encodeURIComponent(t.fileName)}`.replace(/%2F/g,"/"):path.join(n,t.fileName),t.hash=path.join(n,t.fileName),t.galleryPath=`http://localhost:36699/local/${encodeURIComponent(t.fileName)}`}catch(t){throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:"failed to upload image"}),new Error("failed to upload image")}}catch(t){throw e.log.error(t),t}}return e},config$3=e=>{const t=e.getConfig("picBed.local")||{};return[{name:"path",type:"input",get prefix(){return e.i18n.translate("PICBED_LOCAL_PATH")},get alias(){return e.i18n.translate("PICBED_LOCAL_PATH")},default:t.path||"",get message(){return e.i18n.translate("PICBED_LOCAL_MESSAGE_PATH")},required:!0},{name:"customUrl",type:"input",get prefix(){return e.i18n.translate("PICBED_LOCAL_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_LOCAL_CUSTOMURL")},default:t.customUrl||"",get message(){return e.i18n.translate("PICBED_LOCAL_MESSAGE_CUSTOMURL")},required:!1},{name:"webPath",type:"input",get alias(){return e.i18n.translate("PICBED_LOCAL_WEBPATH")},default:t.webPath||"",required:!1,get prefix(){return e.i18n.translate("PICBED_LOCAL_WEBPATH")},get message(){return e.i18n.translate("PICBED_LOCAL_MESSAGE_WEBPATH")}}]};function register$3(e){e.helper.uploader.register("local",{get name(){return e.i18n.translate("PICBED_LOCAL")},handle:handle$5,config:config$3})}class SSHClient{constructor(){this._isConnected=!1}static get instance(){return this._instance||(this._instance=new this)}static get client(){return this._client||(this._client=new NodeSSH)}changeWinStylePathToUnix(e){return e.replace(/\\/g,"/")}async connect(e){const{username:t,password:n,privateKey:r,passphrase:i}=e,a=r?{username:t,privateKeyPath:r,passphrase:i||void 0}:{username:t,password:n};try{return await SSHClient.client.connect(Object.assign({host:e.host,port:Number(e.port)||22},a)),this._isConnected=!0,!0}catch(e){throw new Error(e)}}async upload(e,t,n){if(!this._isConnected)throw new Error("SSH 未连接");try{t=this.changeWinStylePathToUnix(t),await this.mkdir(path.dirname(t).replace(/^\/+|\/+$/g,""),n),await SSHClient.client.putFile(e,t);const r=n.fileMode||"0644";if("0644"!==r){const e=`chmod ${r} "${t}"`;return await this.exec(e)}return!0}catch(e){throw new Error(e)}}async mkdir(e,t){if(!SSHClient.client.isConnected())throw new Error("SSH 未连接");const n=t.dirMode||"0755";if("0755"!==n){const t=e.split("/");let r="";for(const e of t)if(e){r+=`/${e}`;const t=`mkdir "${r}" && chmod ${n} "${r}"`;await this.exec(t)}}else{const t=`cd / && mkdir -p "${e}"`;await this.exec(t)}}async chown(e,t,n){e=this.changeWinStylePathToUnix(e);const[r,i]=n?[t,n]:t.includes(":")?t.split(":"):[t,t],a=`chown ${r}:${i} "${e}"`;return this.exec(a)}async exec(e){return 0===(await SSHClient.client.execCommand(e)).code}close(){SSHClient.client.dispose(),this._isConnected=!1}}const handle$4=async e=>{const t=e.getConfig("picBed.sftpplist");if(!t)throw new Error("Can not find sftpplist config!");t.port=Number(t.port)||22,t.uploadPath=(t.uploadPath||"").replace(/^\/+|\/+$/g,"")+"/";const n=(t.webPath||"").replace(/^\/+|\/+$/g,"")+"/";try{const r=e.output;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=path.join(e.baseDir,"uploadTemp"),s=path.join(e.baseDir,"imgTemp","sftpplist");fs.ensureDirSync(a),fs.ensureDirSync(s);const o=path.join(a,i.fileName);fs.writeFileSync(o,r);const l=SSHClient.instance;await l.connect(t);const E=path.join(`/${t.uploadPath}`.replace(/\/\/+/g,"/"),i.fileName);await l.upload(o,E,t),t.fileUser&&await l.chown(E,t.fileUser),delete i.base64Image,delete i.buffer;const I=t.customUrl||t.host;t.webPath?i.imgUrl=`${I}/${"/"===n?"":encodeURIComponent(n)}${encodeURIComponent(i.fileName)}`.replace(/%2F/g,"/"):i.imgUrl=`${I}/${"/"===t.uploadPath?"":encodeURIComponent(t.uploadPath)}${encodeURIComponent(i.fileName)}`.replace(/%2F/g,"/"),fs.moveSync(o,path.join(s,i.fileName)),i.galleryPath=`http://localhost:36699/sftpplist/${encodeURIComponent(i.fileName)}`,l.close()}return e}catch(t){throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},config$2=e=>{const t=e.getConfig("picBed.sftpplist")||{};return[{name:"host",type:"input",get alias(){return e.i18n.translate("PICBED_SFTPPLIST_HOST")},get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_HOST")},default:t.host||"",required:!0},{name:"port",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_PORT")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_PORT")},default:t.port||22,required:!1},{name:"username",type:"input",get alias(){return e.i18n.translate("PICBED_SFTPPLIST_USERNAME")},default:t.username||"",required:!0},{name:"password",type:"input",get alias(){return e.i18n.translate("PICBED_SFTPPLIST_PASSWORD")},default:t.password||"",required:!1},{name:"privateKey",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_PRIVATEKEY")},default:t.privateKey||"",required:!1},{name:"passphrase",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY_PASSPHRASE")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_PRIVATEKEY_PASSPHRASE")},default:t.passphrase||"",required:!1},{name:"uploadPath",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_UPLOADPATH")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_UPLOADPATH")},default:t.uploadPath||"",required:!1},{name:"customUrl",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_CUSTOMURL")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_CUSTOMURL")},default:t.customUrl||"",required:!1},{name:"webPath",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_WEBSITE_PATH")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_WEBSITE_PATH")},default:t.webPath||"",required:!1},{name:"fileUser",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_FILE_USER")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_FILE_USER")},default:t.fileUser||"",required:!1},{name:"fileMode",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_FILE_MODE")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_FILE_MODE")},default:t.fileMode||"",required:!1},{name:"dirMode",type:"input",get message(){return e.i18n.translate("PICBED_SFTPPLIST_MESSAGE_DIR_MODE")},get alias(){return e.i18n.translate("PICBED_SFTPPLIST_DIR_MODE")},default:t.dirMode||"",required:!1}]};function register$2(e){e.helper.uploader.register("sftpplist",{get name(){return e.i18n.translate("PICBED_SFTPPLIST")},handle:handle$4,config:config$2})}const postOptions$1=async(e,t)=>{const n={method:"POST",url:"https://telegra.ph/upload",headers:{"content-type":"multipart/form-data"},formData:{file:t}};return e.proxy&&(n.proxy=e.proxy),n},handle$3=async e=>{var t,n;let r=e.getConfig("picBed.telegraphplist");r||(r={});try{const n=e.output;for(const i of n)if(i.fileName&&i.buffer){let n=i.buffer;!n&&i.base64Image&&(n=Buffer.from(i.base64Image,"base64"));const a=path.join(e.baseDir,"uploadTemp");fs.ensureDirSync(a);const s=path.join(a,i.fileName);fs.writeFileSync(s,n);const o=await postOptions$1(r,fs.createReadStream(s)),l=await e.request(o),E="string"==typeof l?JSON.parse(l):l;if(fs.remove(s),!(null===(t=null==E?void 0:E[0])||void 0===t?void 0:t.src))throw new Error("Server error, please try again");delete i.base64Image,delete i.buffer,i.imgUrl=`https://telegra.ph${E[0].src}`}return e}catch(t){throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS_AND_NETWORK"),text:""}),(null===(n=null==t?void 0:t.response)||void 0===n?void 0:n.data)||t}},config$1=e=>[{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:(e.getConfig("picBed.telegraphplist")||{}).proxy||"",required:!1}];function register$1(e){e.helper.uploader.register("telegraphplist",{get name(){return e.i18n.translate("PICBED_TELEGRAPH")},handle:handle$3,config:config$1})}const postOptions=(e,t,n)=>{const r=e.host||"127.0.0.1",i=e.port||36677,a=e.picbed||"",s=e.configName||"Default",o=e.serverKey||"";let l=`http://${r}:${i}/upload?configName=${s}`;return a&&(l+=`&picbed=${a}`),o&&(l+=`&key=${o}`),{method:"POST",url:l,headers:{"content-type":"multipart/form-data"},formData:{file:{value:n,options:{filename:t,contentType:mime.lookup(t)}}},resolveWithFullResponse:!0}},handle$2=async e=>{var t;const n=e.getConfig("picBed.piclist");if(!n)throw new Error("Can't find PicList config");try{const r=e.output;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=postOptions(n,i.fileName,r),s=await e.request(a).then((e=>e)).catch((t=>({statusCode:400,body:{msg:e.i18n.translate("AUTH_FAILED"),err:t}})));if(200!==s.statusCode||!(null===(t=s.body)||void 0===t?void 0:t.success))throw new Error(s.body.message);delete i.base64Image,delete i.buffer,i.imgUrl=s.body.result[0],i.fullResult=s.body.fullResult[0]}return e}catch(t){throw e.emit(IBuildInEvent.NOTIFICATION,{title:e.i18n.translate("UPLOAD_FAILED"),body:e.i18n.translate("CHECK_SETTINGS")}),t}},config=e=>{const t=e.getConfig("picBed.piclist")||{};return[{name:"host",type:"input",get alias(){return e.i18n.translate("PICBED_PICLIST_HOST")},default:t.host||"127.0.0.1",required:!0},{name:"port",type:"input",get alias(){return e.i18n.translate("PICBED_PICLIST_PORT")},default:t.port||36677,required:!1},{name:"picbed",type:"input",get alias(){return e.i18n.translate("PICBED_PICLIST_PICBED")},default:t.picbed||"",required:!1},{name:"configName",type:"input",get alias(){return e.i18n.translate("PICBED_PICLIST_CONFIGNAME")},default:t.configName||"",required:!1},{name:"serverKey",type:"input",get alias(){return e.i18n.translate("PICBED_PICLIST_KEY")},default:t.serverKey||"",required:!1}]};function register(e){e.helper.uploader.register("piclist",{get name(){return e.i18n.translate("PICBED_PICLIST")},handle:handle$2,config:config})}const buildInUploaders=()=>({register(e){register$6(e),register$a(e),register$b(e),register$9(e),register$8(e),register$7(e),register$5(e),register$4(e),register$3(e),register$2(e),register$1(e),register(e)}}),handle$1=async e=>{const t=e.output;return await Promise.all(e.input.map((async(n,r)=>{let i;if(i=Buffer.isBuffer(n)?{success:!0,buffer:n,fileName:"",extname:""}:isUrl(n)?await getURLFile(n,e):await getFSFile(n),i.success&&i.buffer){const a=getImgSize(e,i.buffer,n),s=i.extname||a.extname||".png";t[r]={buffer:i.buffer,fileName:i.fileName||`${dayjs().format("YYYYMMDDHHmmss")}${s}}`,width:a.width,height:a.height,extname:i.extname}}else e.log.error(i.reason)}))),e.output=t.filter((e=>e)),e},getImgSize=(e,t,n)=>{const r=getImageSize(t);return r.real||("string"==typeof n?e.log.warn(`can't get ${n}'s image size`):e.log.warn("can't get image size"),e.log.warn("fallback to 200 * 200")),r};var ImgFromPath={handle:handle$1};const handle=async e=>(e.output.push(...e.input),e);var ImgFromBase64={handle:handle};const buildInTransformers=()=>({register(e){e.helper.transformer.register("path",ImgFromPath),e.helper.transformer.register("base64",ImgFromBase64)}});class PluginLoader{constructor(e){this.list=[],this.fullList=new Set,this.pluginMap=new Map,this.ctx=e,this.init()}init(){const e=path.join(this.ctx.baseDir,"package.json");if(!fs.existsSync(e)){const t={name:"picgo-plugins",description:"picgo-plugins",repository:"https://github.com/PicGo/PicGo-Core",license:"MIT"};fs.writeFileSync(e,JSON.stringify(t),"utf8")}}resolvePlugin(e,t){try{return resolve.sync(t,{basedir:e.baseDir})}catch(n){return path.join(e.baseDir,"node_modules",t)}}load(){const e=path.join(this.ctx.baseDir,"package.json"),t=path.join(this.ctx.baseDir,"node_modules/");if(!fs.existsSync(t))return!1;const n=fs.readJSONSync(e),r=Object.keys(n.dependencies||{}),i=Object.keys(n.devDependencies||{}),a=r.concat(i).filter((e=>{if(!/^picgo-plugin-|^@[^/]+\/picgo-plugin-/.test(e))return!1;const t=this.resolvePlugin(this.ctx,e);return fs.existsSync(t)}));for(const e of a)this.registerPlugin(e);return!0}registerPlugin(e,t){if(e&&"string"==typeof e){this.fullList.add(e);try{if(t){this.list.push(e),setCurrentPluginName(e);const n=t(this.ctx);this.pluginMap.set(e,n),n.register(this.ctx)}else if(!0===this.ctx.getConfig(`picgoPlugins.${e}`)||void 0===this.ctx.getConfig(`picgoPlugins.${e}`)){this.list.push(e),setCurrentPluginName(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(IBuildInEvent.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),setCurrentPluginName(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 t=path.join(this.ctx.baseDir,"node_modules/"),n=require(t+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]}}var macClipboardScript='-- 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',windowsClipboardScript='\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',windows10ClipboardScript='# 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',linuxClipboardScript='#!/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',wslClipboardScript='#!/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';const CLIPBOARD_IMAGE_FOLDER="piclist-clipboard-images",getCurrentPlatform=()=>{const e=process.platform;if(isWsl)return"wsl";if("win32"===e){return"10"===os.release().split(".")[0]?"win10":"win32"}return"darwin"===e?"darwin":"linux"},platform2ScriptContent={darwin:macClipboardScript,win32:windowsClipboardScript,win10:windows10ClipboardScript,linux:linuxClipboardScript,wsl:wslClipboardScript},platform2ScriptFilename={darwin:"mac.applescript",win32:"windows.ps1",win10:"windows10.ps1",linux:"linux.sh",wsl:"wsl.sh"};function createImageFolder(e){const t=path.join(e.baseDir,CLIPBOARD_IMAGE_FOLDER);fs.existsSync(t)||fs.mkdirSync(t)}const getClipboardImage=async e=>{createImageFolder(e);const t=path.join(e.baseDir,CLIPBOARD_IMAGE_FOLDER,`${dayjs().format("YYYYMMDDHHmmss")}.png`);return await new Promise(((n,r)=>{const i=getCurrentPlatform(),a=path.join(e.baseDir,platform2ScriptFilename[i]);let s;fs.existsSync(a)||fs.writeFileSync(a,platform2ScriptContent[i],"utf8"),s="darwin"===i?spawn("osascript",[a,t]):"win32"===i||"win10"===i?spawn("powershell",["-noprofile","-noninteractive","-nologo","-sta","-executionpolicy","unrestricted","-file",a,t]):spawn("sh",[a,t]),s.stdout.on("data",(a=>{if("linux"===i&&"no xclip or wl-clipboard"===a.toString().trim())return e.emit(IBuildInEvent.NOTIFICATION,{title:"xclip or wl-clipboard not found",body:"Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"}),r(new Error("Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo"));const s=a.toString().trim();let o=!1;if(path.basename(s)!==path.basename(t)&&fs.existsSync(s)&&(o=!0),"no image"!==s&&!fs.existsSync(s))return r(new Error(`Can't find ${s}`));n({imgPath:s,shouldKeepAfterUploading:o})}))}))},eventBus=new EventEmitter,httpsAgent=new https.Agent({maxVersion:"TLSv1.2",minVersion:"TLSv1.2"});function appendFormData(e,t,n){"object"==typeof n&&"value"in n&&"options"in n?e.append(t,n.value,n.options):e.append(t,n)}function requestInterceptor(e){var t;let n=!1;const r=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 URL(e.proxy)}catch(e){i=!1,r.proxy=!1,console.error(e)}n=!0}i&&((null===(t=e.url)||void 0===t?void 0:t.startsWith("https://"))?(r.proxy=!1,r.httpsAgent=tunnel.httpsOverHttp({proxy:{host:null==i?void 0:i.hostname,port:parseInt(null==i?void 0:i.port,10)}})):r.proxy={host:i.hostname,port:parseInt(i.port,10),protocol:"http"})}if("formData"in e){const t=new FormData;for(const n in e.formData){appendFormData(t,n,e.formData[n])}r.data=t,r.headers=Object.assign(r.headers||{},t.getHeaders()),n=!0,delete r.formData}return"body"in e&&(r.data=e.body,n=!0,delete r.body),"qs"in e&&(r.params=e.qs,n=!0),r.__isOldOptions=n,r}function responseInterceptor(e){return Object.assign(Object.assign({},e),{statusCode:e.status,body:e.data})}function responseErrorHandler(e){var t,n,r,i,a,s,o;const l={method:(null===(n=null===(t=null==e?void 0:e.config)||void 0===t?void 0:t.method)||void 0===n?void 0:n.toUpperCase())||"",url:(null===(r=null==e?void 0:e.config)||void 0===r?void 0:r.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 Request{constructor(e){this.proxy="",this.options={},this.ctx=e,this.init(),eventBus.on(IBusEvent.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 URL(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=tunnel.httpsOverHttp({proxy:{host:this.options.proxy.host,port:this.options.proxy.port}}),this.options.proxy=!1):this.options.httpsAgent=httpsAgent;const n=axios.create(this.options);n.interceptors.response.use(responseInterceptor,responseErrorHandler);const r=requestInterceptor(e);return n.interceptors.request.use((function(e){var t,n,r;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===(n=null==e?void 0:e.headers)||void 0===n?void 0:n.ContentType)?(i=e.headers.ContentType,delete e.headers.ContentType):(null===(r=null==e?void 0:e.headers)||void 0===r?void 0:r["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?n.request(r):n.request(r).then((t=>r.__isOldOptions?"json"in e?e.json?t.data:void 0:JSON.stringify(t.data):t.data))}}class DB{constructor(e){if(this.ctx=e,this.db=new JSONStore(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){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 PluginHandler{constructor(e){this.ctx=e}async install(e,t={},n){const r=[],i=e.map((e=>handlePluginNameProcess(this.ctx,e))).filter((e=>this.ctx.pluginLoader.hasPlugin(e.pkgName)?(r.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,n);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,...r]});return{success:!0,body:[...s,...r]}}if(0===r.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,...r]});return{success:!0,body:[...s,...r]}}async uninstall(e){const t=e.map((e=>handlePluginNameProcess(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={},n){const r=e.map((e=>handlePluginNameProcess(this.ctx,e))).filter((e=>e.success)).map((e=>e.pkgName));if(r.length>0){const e=await this.execCommand("update",r,this.ctx.baseDir,t,n);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:r});return{success:!0,body:r}}{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,n,r={},i={}){const a=r.registry||this.ctx.getConfig("settings.registry"),s=r.proxy||this.ctx.getConfig("settings.proxy");return await new Promise((r=>{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=spawn$1("npm",E,{cwd:n,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=>{r(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(IBuildInEvent.FAILED,"NPM is not installed")}))}catch(e){this.ctx.log.error(e),this.ctx.emit(IBuildInEvent.FAILED,e)}}))}}const handlePluginNameProcess=(e,t)=>{const n={success:!1,fullName:"",pkgName:""},r=getProcessPluginName(t,e.log);if(!r)return n;const i=getNormalPluginName(r,e.log);return i?{success:!0,fullName:r,pkgName:i}:n},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_LOCAL:"本地上传",PICBED_LOCAL_PATH:"设定路径",PICBED_LOCAL_MESSAGE_PATH:"例如 /usr/local/images/",PICBED_LOCAL_CUSTOMURL:"设定自定义域名",PICBED_LOCAL_MESSAGE_CUSTOMURL:"例如 https://test.com",PICBED_LOCAL_WEBPATH:"设定网站路径",PICBED_LOCAL_MESSAGE_WEBPATH:"用于拼接网址路径",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_ENDPOINT:"设定接入点",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_TENCENTCLOUD_MESSAGE_ENDPOINT:"例如:cos-internal.accelerate.tencentcos.cn",PICBED_TENCENTCLOUD_SLIM:"极智压缩",PICBED_TENCENTCLOUD_SLIM_TIP:"图片极智压缩,详情请参考[文档说明](https://cloud.tencent.com/document/product/436/49259)",PICBED_TENCENTCLOUD_SLIM_CONFIRM:"开启",PICBED_TENCENTCLOUD_SLIM_CANCEL:"关闭",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_TELEGRAPH:"Telegraph",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_ANTI_LEECH_TOKEN:"设定防盗链Token",PICBED_UPYUN_EXPIRE_TIME:"设定过期时间(秒)",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_AUTHTYPE:"设定认证方式",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",PICBED_SFTPPLIST:"内置SFTP",PICBED_SFTPPLIST_HOST:"设定主机",PICBED_SFTPPLIST_PORT:"设定端口",PICBED_SFTPPLIST_USERNAME:"设定用户名",PICBED_SFTPPLIST_PASSWORD:"设定密码",PICBED_SFTPPLIST_PRIVATEKEY:"设定私钥",PICBED_SFTPPLIST_PRIVATEKEY_PASSPHRASE:"设定私钥密码",PICBED_SFTPPLIST_UPLOADPATH:"设定上传路径",PICBED_SFTPPLIST_CUSTOMURL:"设定自定义域名",PICBED_SFTPPLIST_WEBSITE_PATH:"设定网站路径",PICBED_SFTPPLIST_FILE_USER:"设定文件用户:组",PICBED_SFTPPLIST_FILE_MODE:"设定文件权限",PICBED_SFTPPLIST_DIR_MODE:"设定文件夹权限",PICBED_SFTPPLIST_MESSAGE_HOST:"例如:1.1.1.3",PICBED_SFTPPLIST_MESSAGE_PORT:"默认22",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY:"例如:/Users/xxx/.ssh/id_rsa",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY_PASSPHRASE:"输入私钥密码",PICBED_SFTPPLIST_MESSAGE_UPLOADPATH:"例如:test/",PICBED_SFTPPLIST_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_SFTPPLIST_MESSAGE_WEBSITE_PATH:"拼接网址时使用",PICBED_SFTPPLIST_MESSAGE_FILE_USER:"例如:www:data",PICBED_SFTPPLIST_MESSAGE_FILE_MODE:"例如:0664",PICBED_SFTPPLIST_MESSAGE_DIR_MODE:"例如:0775",PICBED_PICLIST:"PicList",PICBED_PICLIST_HOST:"设定主机",PICBED_PICLIST_PORT:"设定端口",PICBED_PICLIST_PICBED:"设定图床",PICBED_PICLIST_CONFIGNAME:"设定配置名",PICBED_PICLIST_KEY:"设定鉴权Key",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_ISFLIP:"是否垂直翻转图片",BUILDIN_COMPRESS_ISFLOP:"是否水平翻转图片",BUILDIN_COMPRESS_RESIZEPERCENT:"设定缩放百分比",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"请输入数字",BUILDIN_COMPRESS_SKIPRESIZEOFSMALLIMG:"是否跳过小图缩放",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_LOCAL:"Local",PICBED_LOCAL_PATH:"Set Path",PICBED_LOCAL_MESSAGE_PATH:"Ex. /Users/name/Pictures/",PICBED_LOCAL_CUSTOMURL:"Set Custom URL",PICBED_LOCAL_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_LOCAL_WEBPATH:"Set Web Path",PICBED_LOCAL_MESSAGE_WEBPATH:"Used to generate url path",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_ENDPOINT:"Set Endpoint",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_TENCENTCLOUD_MESSAGE_ENDPOINT:"Ex. cos-internal.accelerate.tencentcos.cn",PICBED_TENCENTCLOUD_SLIM:"極智壓縮",PICBED_TENCENTCLOUD_SLIM_CANCEL:"關閉",PICBED_TENCENTCLOUD_SLIM_CONFIRM:"開啓",PICBED_TENCENTCLOUD_SLIM_TIP:"圖片極智壓縮,詳情請參考[文檔說明](https://cloud.tencent.com/document/product/436/49259)",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_TELEGRAPH:"Telegraph",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_ANTI_LEECH_TOKEN:"Set Anti-Leech Token",PICBED_UPYUN_EXPIRE_TIME:"Set Expire Time(seconds)",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_AUTHTYPE:"Set Auth Type",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",PICBED_SFTPPLIST:"SFTP Buildin",PICBED_SFTPPLIST_HOST:"Set Host",PICBED_SFTPPLIST_PORT:"Set Port",PICBED_SFTPPLIST_USERNAME:"Set Username",PICBED_SFTPPLIST_PASSWORD:"Set Password",PICBED_SFTPPLIST_PRIVATEKEY:"Set Private Key",PICBED_SFTPPLIST_PRIVATEKEY_PASSPHRASE:"Set Private Key Passphrase",PICBED_SFTPPLIST_UPLOADPATH:"Set Upload Path",PICBED_SFTPPLIST_CUSTOMURL:"Set Custom URL",PICBED_SFTPPLIST_WEBSITE_PATH:"Set Website Path",PICBED_SFTPPLIST_FILE_USER:"Set File User:Group",PICBED_SFTPPLIST_FILE_MODE:"Set File Mode",PICBED_SFTPPLIST_DIR_MODE:"Set Directory Mode",PICBED_SFTPPLIST_MESSAGE_HOST:"Ex. 1.1.1.3",PICBED_SFTPPLIST_MESSAGE_PORT:"Default 22",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY:"Ex. /Users/xxx/.ssh/id_rsa",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY_PASSPHRASE:"Please type the private key passphrase",PICBED_SFTPPLIST_MESSAGE_UPLOADPATH:"Ex. test/",PICBED_SFTPPLIST_MESSAGE_CUSTOMURL:"Ex. https://test.com",PICBED_SFTPPLIST_MESSAGE_WEBSITE_PATH:"Used to generate the URL of the image",PICBED_SFTPPLIST_MESSAGE_FILE_USER:"Ex. www:data",PICBED_SFTPPLIST_MESSAGE_FILE_MODE:"Ex. 0664",PICBED_SFTPPLIST_MESSAGE_DIR_MODE:"Ex. 0775",PICBED_PICLIST:"PicList",PICBED_PICLIST_HOST:"Set Host",PICBED_PICLIST_PORT:"Set Port",PICBED_PICLIST_PICBED:"Set PicBed",PICBED_PICLIST_CONFIGNAME:"Set Config Name",PICBED_PICLIST_KEY:"Set Key",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_ISFLIP:"Whether to flip the image vertically",BUILDIN_COMPRESS_ISFLOP:"Whether to flip the image horizontally",BUILDIN_COMPRESS_RESIZEPERCENT:"Set resizing percentage",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"Please enter a number",BUILDIN_COMPRESS_SKIPRESIZEOFSMALLIMG:"Whether to skip resizing of small images",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"},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_LOCAL:"本地",PICBED_LOCAL_PATH:"設定儲存路徑",PICBED_LOCAL_MESSAGE_PATH:"例如 /usr/local/images/",PICBED_LOCAL_CUSTOMURL:"設定自訂網址",PICBED_LOCAL_MESSAGE_CUSTOMURL:"例如 https://test.com",PICBED_LOCAL_WEBPATH:"設定網址路徑",PICBED_LOCAL_MESSAGE_WEBPATH:"用于網頁顯示的路徑",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_ENDPOINT:"設定接入點",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_TENCENTCLOUD_MESSAGE_ENDPOINT:"例如:cos-internal.accelerate.tencentcos.cn",PICBED_TENCENTCLOUD_SLIM:"Set ImageSlim",PICBED_TENCENTCLOUD_SLIM_TIP:"Image extremely intelligent compression, please refer to the [document description](https://cloud.tencent.com/document/product/436/49259)",PICBED_TENCENTCLOUD_SLIM_CONFIRM:"OPEN",PICBED_TENCENTCLOUD_SLIM_CANCEL:"CLOSE",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_TELEGRAPH:"Telegraph",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_ANTI_LEECH_TOKEN:"設定防盜鏈Token",PICBED_UPYUN_EXPIRE_TIME:"設定過期時間(秒)",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_AUTHTYPE:"設定認證方式",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",PICBED_SFTPPLIST:"內置SFTP",PICBED_SFTPPLIST_HOST:"設定主機",PICBED_SFTPPLIST_PORT:"設定端口",PICBED_SFTPPLIST_USERNAME:"設定用戶名",PICBED_SFTPPLIST_PASSWORD:"設定密碼",PICBED_SFTPPLIST_PRIVATEKEY:"設定私鑰",PICBED_SFTPPLIST_PRIVATEKEY_PASSPHRASE:"設定私鑰密碼",PICBED_SFTPPLIST_UPLOADPATH:"設定上傳路徑",PICBED_SFTPPLIST_CUSTOMURL:"設定自訂網址",PICBED_SFTPPLIST_WEBSITE_PATH:"設定網站路徑",PICBED_SFTPPLIST_FILE_USER:"設定文件用戶:組",PICBED_SFTPPLIST_FILE_MODE:"設定文件權限",PICBED_SFTPPLIST_DIR_MODE:"設定文件夾權限",PICBED_SFTPPLIST_MESSAGE_HOST:"例如:1.1.1.3",PICBED_SFTPPLIST_MESSAGE_PORT:"默認22",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY:"例如:/Users/xxx/.ssh/id_rsa",PICBED_SFTPPLIST_MESSAGE_PRIVATEKEY_PASSPHRASE:"輸入私鑰密碼",PICBED_SFTPPLIST_MESSAGE_UPLOADPATH:"例如:test/",PICBED_SFTPPLIST_MESSAGE_CUSTOMURL:"例如:https://test.com",PICBED_SFTPPLIST_MESSAGE_WEBSITE_PATH:"拼接網址時使用",PICBED_SFTPPLIST_MESSAGE_FILE_USER:"例如:www:data",PICBED_SFTPPLIST_MESSAGE_FILE_MODE:"例如:0664",PICBED_SFTPPLIST_MESSAGE_DIR_MODE:"例如:0775",PICBED_PICLIST:"PicList",PICBED_PICLIST_HOST:"設定主機",PICBED_PICLIST_PORT:"設定端口",PICBED_PICLIST_PICBED:"設定圖床",PICBED_PICLIST_CONFIGNAME:"設定配置名",PICBED_PICLIST_KEY:"設定鑒權Key",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_ISFLIP:"是否垂直翻轉圖片",BUILDIN_COMPRESS_ISFLOP:"是否水平翻轉圖片",BUILDIN_COMPRESS_RESIZEPERCENT:"設定縮放百分比",BUILDIN_COMPRESS_MESSAGE_RESIZEPERCENT:"請輸入数字",BUILDIN_COMPRESS_SKIPRESIZEOFSMALLIMG:"是否跳過小圖縮放",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:"插件更新失敗,請輸入正確的插件名稱"},languageList={"zh-CN":ZH_CN,"zh-TW":ZH_TW,en:EN};class I18nManager{constructor(e){this.ctx=e,this.objectAdapter=new ObjectAdapter(languageList);let t=this.ctx.getConfig("settings.language")||"zh-CN";languageList[t]||(t="zh-CN"),this.i18n=new I18n({adapter:this.objectAdapter,defaultLanguage:t}),this.loadOutterI18n()}loadOutterI18n(){const e=this.getOutterI18nFolder();fs.readdirSync(e,{withFileTypes:!0}).forEach((t=>{if(t.isFile()&&t.name.endsWith(".yml")){const n=path.join(e,t.name),r=fs.readFileSync(n,"utf8");try{const e=yaml.load(r);languageList[t.name.replace(/\.yml$/,"")]=e}catch(e){console.error(e)}}}))}getOutterI18nFolder(){const e=path.join(this.ctx.baseDir,"i18n-cli");return fs.pathExistsSync(e)||fs.ensureDirSync(e),e}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 n=this.objectAdapter.getLocale(e);if(!n)return!1;const r=merge(n,t);return this.objectAdapter.setLocale(e,r),!0}addLanguage(e,t){return!this.objectAdapter.getLocale(e)&&(this.objectAdapter.setLocale(e,t),languageList[e]=t,!0)}getLanguageList(){return Object.keys(languageList)}}class PicGo extends EventEmitter{get pluginLoader(){return this._pluginLoader}constructor(e=""){super(),this.VERSION="1.3.8",this.configPath=e,this.output=[],this.input=[],this.rawInput=[],this.helper={transformer:new LifecyclePlugins("transformer"),uploader:new LifecyclePlugins("uploader"),beforeTransformPlugins:new LifecyclePlugins("beforeTransformPlugins"),beforeUploadPlugins:new LifecyclePlugins("beforeUploadPlugins"),afterUploadPlugins:new LifecyclePlugins("afterUploadPlugins")},this.initConfigPath(),this.log=new Logger(this),this.cmd=new Commander(this),this.pluginHandler=new PluginHandler(this),this.initConfig(),this.init()}initConfigPath(){if(""===this.configPath&&(this.configPath=homedir()+"/.piclist/config.json"),".JSON"!==path.extname(this.configPath).toUpperCase())throw this.configPath="",Error("The configuration file only supports JSON format.");this.baseDir=path.dirname(this.configPath);fs.pathExistsSync(this.configPath)||fs.ensureFileSync(`${this.configPath}`)}initConfig(){this.db=new DB(this),this._config=this.db.read(!0)}init(){try{this.i18n=new I18nManager(this),this.Request=new Request(this),this._pluginLoader=new PluginLoader(this),setCurrentPluginName("picgo"),buildInUploaders(this).register(this),buildInTransformers(this).register(this),setCurrentPluginName(""),this._pluginLoader.load(),this.lifecycle=new Lifecycle(this)}catch(e){throw this.emit(IBuildInEvent.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?get(this._config,e):this._config}saveConfig(e){isInputConfigValid(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&&(isConfigKeyInBlackList(e)?this.log.warn(`the config.${e} can't be removed`):(this.unsetConfig(e,t),this.db.unset(e,t)))}setConfig(e){isInputConfigValid(e)?Object.keys(e).forEach((t=>{isConfigKeyInBlackList(t)&&(this.log.warn(`the config.${t} can't be modified`),delete e[t]),set(this._config,t,e[t]),eventBus.emit(IBusEvent.CONFIG_CHANGE,{configName:t,value:e[t]})})):this.log.warn("the format of config is invalid, please provide object")}unsetConfig(e,t){e&&t&&(isConfigKeyInBlackList(e)?this.log.warn(`the config.${e} can't be unset`):unset(this.getConfig(e),t))}get request(){return this.Request.request.bind(this.Request)}async upload(e){if(""===this.configPath)return this.log.error("The configuration file only supports JSON format."),[];if(void 0!==e&&0!==e.length){const{output:t}=await this.lifecycle.start(e);return t}try{const{imgPath:e,shouldKeepAfterUploading:t}=await getClipboardImage(this);if("no image"===e)throw new Error("image not found in clipboard");{this.once(IBuildInEvent.FAILED,(()=>{t||fs.remove(e).catch((e=>{this.log.error(e)}))})),this.once("finished",(()=>{t||fs.remove(e).catch((e=>{this.log.error(e)}))}));const{output:n}=await this.lifecycle.start([e]);return n}}catch(e){throw this.emit(IBuildInEvent.FAILED,e),e}}}export{Commander,Lifecycle,LifecyclePlugins,Logger,PicGo,common as PicGoUtils,PluginHandler,PluginLoader,Request};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcGx1Z2luSGFuZGxlci50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9jb25maWcudHMiLCIuLi9zcmMvdXRpbHMvY29tbW9uLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VwbG9hZC50cyIsIi4uL3NyYy9wbHVnaW5zL2JlZm9yZXRyYW5zZm9ybWVyL2NvbXByZXNzLnRzIiwiLi4vc3JjL3BsdWdpbnMvYmVmb3JldHJhbnNmb3JtZXIvd2F0ZXJtYXJrLnRzIiwiLi4vc3JjL3BsdWdpbnMvYmVmb3JldXBsb2FkL2J1aWxkSW5SZW5hbWUudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvc2V0dGluZy50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci91c2UudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcHJveHkudHMiLCIuLi9zcmMvdXRpbHMvaW5pdFV0aWxzLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL2luaXQudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaTE4bi50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9pbmRleC50cyIsIi4uL3NyYy9saWIvTGlmZWN5Y2xlUGx1Z2lucy50cyIsIi4uL3NyYy9saWIvQ29tbWFuZGVyLnRzIiwiLi4vc3JjL3V0aWxzL2VudW0udHMiLCIuLi9zcmMvbGliL0xvZ2dlci50cyIsIi4uL3NyYy91dGlscy9jcmVhdGVDb250ZXh0LnRzIiwiLi4vc3JjL2NvcmUvTGlmZWN5Y2xlLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvc21tcy50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3RjeXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvZ2l0aHViLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvcWluaXUudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9pbWd1ci50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL2FsaXl1bi50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3VweXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvd2ViZGF2LnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvbG9jYWwudHMiLCIuLi9zcmMvdXRpbHMvc3NoQ2xpZW50LnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvc2Z0cC50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3RlbGVncmFwaC50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL3BpY2xpc3QudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9pbmRleC50cyIsIi4uL3NyYy9wbHVnaW5zL3RyYW5zZm9ybWVyL3BhdGgudHMiLCIuLi9zcmMvcGx1Z2lucy90cmFuc2Zvcm1lci9iYXNlNjQudHMiLCIuLi9zcmMvcGx1Z2lucy90cmFuc2Zvcm1lci9pbmRleC50cyIsIi4uL3NyYy9saWIvUGx1Z2luTG9hZGVyLnRzIiwiLi4vc3JjL3V0aWxzL3N0YXRpYy50cyIsIi4uL3NyYy91dGlscy9nZXRDbGlwYm9hcmRJbWFnZS50cyIsIi4uL3NyYy91dGlscy9ldmVudEJ1cy50cyIsIi4uL3NyYy9saWIvUmVxdWVzdC50cyIsIi4uL3NyYy91dGlscy9kYi50cyIsIi4uL3NyYy9saWIvUGx1Z2luSGFuZGxlci50cyIsIi4uL3NyYy9pMThuL3poLUNOLnRzIiwiLi4vc3JjL2kxOG4vZW4udHMiLCIuLi9zcmMvaTE4bi96aC1UVy50cyIsIi4uL3NyYy9pMThuL2luZGV4LnRzIiwiLi4vc3JjL2NvcmUvUGljR28udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgcGx1Z2luSGFuZGxlcjogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgLy8gY29uc3QgcGx1Z2luSGFuZGxlciA9IG5ldyBQbHVnaW5IYW5kbGVyKGN0eClcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCdpbnN0YWxsIDxwbHVnaW5zLi4uPicpXHJcbiAgICAgIC5kZXNjcmlwdGlvbignaW5zdGFsbCBwaWNnbyBwbHVnaW4nKVxyXG4gICAgICAuYWxpYXMoJ2FkZCcpXHJcbiAgICAgIC5vcHRpb24oJy1wLCAtLXByb3h5IDxwcm94eT4nLCAnQWRkIHByb3h5IGZvciBpbnN0YWxsaW5nIHBsdWdpbnMnKVxyXG4gICAgICAub3B0aW9uKCctciwgLS1yZWdpc3RyeSA8cmVnaXN0cnk+JywgJ0Nob29zZSBhIHJlZ2lzdHJ5IGZvciBpbnN0YWxsaW5nIHBsdWdpbnMnKVxyXG4gICAgICAuYWN0aW9uKChwbHVnaW5zOiBzdHJpbmdbXSwgcHJvZ3JhbTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBwcm94eSwgcmVnaXN0cnkgfSA9IHByb2dyYW1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgcHJveHksXHJcbiAgICAgICAgICByZWdpc3RyeVxyXG4gICAgICAgIH1cclxuICAgICAgICBjdHgucGx1Z2luSGFuZGxlci5pbnN0YWxsKHBsdWdpbnMsIG9wdGlvbnMpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgfSlcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCd1bmluc3RhbGwgPHBsdWdpbnMuLi4+JylcclxuICAgICAgLmFsaWFzKCdybScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbigndW5pbnN0YWxsIHBpY2dvIHBsdWdpbicpXHJcbiAgICAgIC5hY3Rpb24oKHBsdWdpbnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgICAgY3R4LnBsdWdpbkhhbmRsZXIudW5pbnN0YWxsKHBsdWdpbnMpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgfSlcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCd1cGRhdGUgPHBsdWdpbnMuLi4+JylcclxuICAgICAgLmRlc2NyaXB0aW9uKCd1cGRhdGUgcGljZ28gcGx1Z2luJylcclxuICAgICAgLm9wdGlvbignLXAsIC0tcHJveHkgPHByb3h5PicsICdBZGQgcHJveHkgZm9yIGluc3RhbGxpbmcnKVxyXG4gICAgICAub3B0aW9uKCctciwgLS1yZWdpc3RyeSA8cmVnaXN0cnk+JywgJ0Nob29zZSBhIHJlZ2lzdHJ5IGZvciBpbnN0YWxsaW5nJylcclxuICAgICAgLmFjdGlvbigocGx1Z2luczogc3RyaW5nW10sIHByb2dyYW06IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgcHJveHksIHJlZ2lzdHJ5IH0gPSBwcm9ncmFtXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgIHByb3h5LFxyXG4gICAgICAgICAgcmVnaXN0cnlcclxuICAgICAgICB9XHJcbiAgICAgICAgY3R4LnBsdWdpbkhhbmRsZXIudXBkYXRlKHBsdWdpbnMsIG9wdGlvbnMpLmNhdGNoKChlOiBFcnJvcikgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBwbHVnaW5IYW5kbGVyXHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW4gfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmNvbnN0IGNvbmZpZzogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxwYXRoPicsICdzZXQgY29uZmlnIHBhdGgnKVxyXG4gICAgICAvLyB3aWxsIGhhbmRsZSBpbiBgYmluL3BpY2dvYFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY29uZmlnXHJcbiIsImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgaW1hZ2VTaXplIH0gZnJvbSAnaW1hZ2Utc2l6ZSdcclxuaW1wb3J0IHtcclxuICB0eXBlIElJbWdTaXplLFxyXG4gIHR5cGUgSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8sXHJcbiAgdHlwZSBJUGx1Z2luTmFtZVR5cGUsXHJcbiAgdHlwZSBJTG9nZ2VyLFxyXG4gIHR5cGUgSVBpY0dvLFxyXG4gIHR5cGUgSUJ1aWxkSW5Db21wcmVzc09wdGlvbnMsXHJcbiAgdHlwZSBJQnVpbGRJbldhdGVyTWFya09wdGlvbnNcclxufSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJ1xyXG5pbXBvcnQgVGV4dFRvU1ZHIGZyb20gJ3RleHQtdG8tc3ZnJ1xyXG5pbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnXHJcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xyXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJ1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbVN0cmluZ0dlbmVyYXRvciAobGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5J1xyXG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoIH0pLm1hcCgoKSA9PiBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSkpLmpvaW4oJycpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZW5hbWVGaWxlTmFtZVdpdGhUaW1lc3RhbXAgKG9sZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGAke01hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApfSR7cmFuZG9tU3RyaW5nR2VuZXJhdG9yKDUpfSR7cGF0aC5leHRuYW1lKG9sZE5hbWUpfWBcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZUZpbGVOYW1lV2l0aFJhbmRvbVN0cmluZyAob2xkTmFtZTogc3RyaW5nLCBsZW5ndGg6IG51bWJlciA9IDUpOiBzdHJpbmcge1xyXG4gIHJldHVybiBgJHtyYW5kb21TdHJpbmdHZW5lcmF0b3IobGVuZ3RoKX0ke3BhdGguZXh0bmFtZShvbGROYW1lKX1gXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZW5hbWVGaWxlTmFtZVdpdGhDdXN0b21TdHJpbmcgKG9sZE5hbWU6IHN0cmluZywgY3VzdG9tRm9ybWF0OiBzdHJpbmcsIGFmZml4RmlsZU5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGNvbnZlcnNpb25NYXA6IFJlY29yZDxzdHJpbmcsICgpID0+IHN0cmluZz4gPSB7XHJcbiAgICAne1l9JzogKCkgPT4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCksXHJcbiAgICAne3l9JzogKCkgPT4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkuc2xpY2UoMiksXHJcbiAgICAne219JzogKCkgPT4gKG5ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDF9YCA6IChuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLFxyXG4gICAgJ3tkfSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0RGF0ZSgpfWAgOiBuZXcgRGF0ZSgpLmdldERhdGUoKS50b1N0cmluZygpLFxyXG4gICAgJ3tofSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0SG91cnMoKS50b1N0cmluZygpLmxlbmd0aCA9PT0gMSA/IGAwJHtuZXcgRGF0ZSgpLmdldEhvdXJzKCl9YCA6IG5ldyBEYXRlKCkuZ2V0SG91cnMoKS50b1N0cmluZygpLFxyXG4gICAgJ3tpfSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0TWludXRlcygpfWAgOiBuZXcgRGF0ZSgpLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLFxyXG4gICAgJ3tzfSc6ICgpID0+IG5ldyBEYXRlKCkuZ2V0U2Vjb25kcygpLnRvU3RyaW5nKCkubGVuZ3RoID09PSAxID8gYDAke25ldyBEYXRlKCkuZ2V0U2Vjb25kcygpfWAgOiBuZXcgRGF0ZSgpLmdldFNlY29uZHMoKS50b1N0cmluZygpLFxyXG4gICAgJ3ttZDV9JzogKCkgPT4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShwYXRoLmJhc2VuYW1lKG9sZE5hbWUsIHBhdGguZXh0bmFtZShvbGROYW1lKSkpLmRpZ2VzdCgnaGV4JyksXHJcbiAgICAne21kNS0xNn0nOiAoKSA9PiBjcnlwdG8uY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKHBhdGguYmFzZW5hbWUob2xkTmFtZSwgcGF0aC5leHRuYW1lKG9sZE5hbWUpKSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCAxNiksXHJcbiAgICAne3N0ci0xMH0nOiAoKSA9PiByYW5kb21TdHJpbmdHZW5lcmF0b3IoMTApLFxyXG4gICAgJ3tzdHItMjB9JzogKCkgPT4gcmFuZG9tU3RyaW5nR2VuZXJhdG9yKDIwKSxcclxuICAgICd7ZmlsZW5hbWV9JzogKCkgPT4gYWZmaXhGaWxlTmFtZSA/IHBhdGguYmFzZW5hbWUoYWZmaXhGaWxlTmFtZSwgcGF0aC5leHRuYW1lKGFmZml4RmlsZU5hbWUpKSA6IHBhdGguYmFzZW5hbWUob2xkTmFtZSwgcGF0aC5leHRuYW1lKG9sZE5hbWUpKSxcclxuICAgICd7dXVpZH0nOiAoKSA9PiB1dWlkdjQoKS5yZXBsYWNlKC8tL2csICcnKSxcclxuICAgICd7dGltZXN0YW1wfSc6ICgpID0+IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApLnRvU3RyaW5nKClcclxuICB9XHJcbiAgaWYgKGN1c3RvbUZvcm1hdCA9PT0gdW5kZWZpbmVkIHx8ICghT2JqZWN0LmtleXMoY29udmVyc2lvbk1hcCkuc29tZShpdGVtID0+IGN1c3RvbUZvcm1hdC5pbmNsdWRlcyhpdGVtKSkgJiYgIWN1c3RvbUZvcm1hdC5pbmNsdWRlcygnbG9jYWxGb2xkZXInKSkpIHtcclxuICAgIHJldHVybiBvbGROYW1lXHJcbiAgfVxyXG4gIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShvbGROYW1lKVxyXG4gIGxldCBuZXdOYW1lID0gT2JqZWN0LmtleXMoY29udmVyc2lvbk1hcCkucmVkdWNlKChhY2MsIGN1cikgPT4ge1xyXG4gICAgcmV0dXJuIGFjYy5yZXBsYWNlKG5ldyBSZWdFeHAoY3VyLCAnZycpLCBjb252ZXJzaW9uTWFwW2N1cl0oKSlcclxuICB9LCBjdXN0b21Gb3JtYXQpICsgZXh0XHJcbiAgbmV3TmFtZSA9IG5ld05hbWUucmVwbGFjZSgveyhsb2NhbEZvbGRlcjo/KFxcZCspPyl9L2dpLCAoX3Jlc3VsdCwga2V5LCBjb3VudCkgPT4ge1xyXG4gICAgY291bnQgPSBNYXRoLm1heCgxLCBjb3VudCB8fCAwKVxyXG4gICAgY29uc3QgcGF0aHMgPSBwYXRoLmRpcm5hbWUob2xkTmFtZSkuc3BsaXQocGF0aC5zZXApXHJcbiAgICBrZXkgPSBwYXRocy5zbGljZSgwIC0gY291bnQpLnJlZHVjZSgoYSwgYikgPT4gYCR7YX0vJHtifWApXHJcbiAgICByZXR1cm4ga2V5LnJlcGxhY2UoLzovZywgJycpXHJcbiAgfSlcclxuICByZXR1cm4gbmV3TmFtZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNVcmwgPSAodXJsOiBzdHJpbmcpOiBib29sZWFuID0+ICgvXmh0dHBzPzpcXC9cXC8vKS50ZXN0KHVybClcclxuXHJcbmV4cG9ydCBjb25zdCBpc1VybEVuY29kZSA9ICh1cmw6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIHVybCA9IHVybCB8fCAnJ1xyXG4gIHRyeSB7XHJcbiAgICAvLyB0aGUgd2hvbGUgdXJsIGVuY29kZSBvciBkZWNvZGUgc2hvbGQgbm90IHVzZSBlbmNvZGVVUklDb21wb25lbnQgb3IgZGVjb2RlVVJJQ29tcG9uZW50XHJcbiAgICByZXR1cm4gdXJsICE9PSBkZWNvZGVVUkkodXJsKVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxufVxyXG5leHBvcnQgY29uc3QgaGFuZGxlVXJsRW5jb2RlID0gKHVybDogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBpZiAoIWlzVXJsRW5jb2RlKHVybCkpIHtcclxuICAgIHVybCA9IGVuY29kZVVSSSh1cmwpXHJcbiAgfVxyXG4gIHJldHVybiB1cmxcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEltYWdlU2l6ZSA9IChmaWxlOiBCdWZmZXIpOiBJSW1nU2l6ZSA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHsgd2lkdGggPSAwLCBoZWlnaHQgPSAwLCB0eXBlIH0gPSBpbWFnZVNpemUoZmlsZSlcclxuICAgIGNvbnN0IGV4dG5hbWUgPSB0eXBlID8gYC4ke3R5cGV9YCA6ICcucG5nJ1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVhbDogdHJ1ZSxcclxuICAgICAgd2lkdGgsXHJcbiAgICAgIGhlaWdodCxcclxuICAgICAgZXh0bmFtZVxyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIC8vIGZhbGxiYWNrIHRvIDIwMCAqIDIwMFxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVhbDogZmFsc2UsXHJcbiAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgIGhlaWdodDogMjAwLFxyXG4gICAgICBleHRuYW1lOiAnLnBuZydcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGU0ZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8SVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8+ID0+IHtcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZXh0bmFtZTogcGF0aC5leHRuYW1lKGZpbGVQYXRoKSxcclxuICAgICAgZmlsZU5hbWU6IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpLFxyXG4gICAgICBidWZmZXI6IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKSxcclxuICAgICAgc3VjY2VzczogdHJ1ZVxyXG4gICAgfVxyXG4gIH0gY2F0Y2gge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVhc29uOiBgcmVhZCBmaWxlICR7ZmlsZVBhdGh9IGVycm9yYCxcclxuICAgICAgc3VjY2VzczogZmFsc2VcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRVUkxGaWxlID0gYXN5bmMgKHVybDogc3RyaW5nLCBjdHg6IElQaWNHbyk6IFByb21pc2U8SVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8+ID0+IHtcclxuICB1cmwgPSBoYW5kbGVVcmxFbmNvZGUodXJsKVxyXG4gIGxldCB0aW1lb3V0SWQ6IE5vZGVKUy5UaW1lb3V0XHJcbiAgY29uc3QgcmVxdWVzdEZuID0gbmV3IFByb21pc2U8SVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3Qoe1xyXG4gICAgICAgICAgbWV0aG9kOiAnZ2V0JyxcclxuICAgICAgICAgIHVybCxcclxuICAgICAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxyXG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXHJcbiAgICAgICAgfSlcclxuICAgICAgICAgIC50aGVuKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwLmRhdGEgYXMgQnVmZmVyXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXHJcbiAgICAgICAgY29uc3QgdXJsUGF0aCA9IG5ldyBVUkwodXJsKS5wYXRobmFtZVxyXG4gICAgICAgIGxldCBleHRuYW1lID0gJydcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTCh1cmwpLnNlYXJjaFBhcmFtc1xyXG4gICAgICAgICAgZXh0bmFtZSA9IHVybFBhcmFtcy5nZXQoJ3d4X2ZtdCcpIHx8IHBhdGguZXh0bmFtZSh1cmxQYXRoKSB8fCAnJ1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICBleHRuYW1lID0gcGF0aC5leHRuYW1lKHVybFBhdGgpIHx8ICcnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZXh0bmFtZS5zdGFydHNXaXRoKCcuJykgJiYgZXh0bmFtZSkge1xyXG4gICAgICAgICAgZXh0bmFtZSA9IGAuJHtleHRuYW1lfWBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICBidWZmZXI6IHJlcyxcclxuICAgICAgICAgIGZpbGVOYW1lOiBwYXRoLmJhc2VuYW1lKHVybFBhdGgpLFxyXG4gICAgICAgICAgZXh0bmFtZSxcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcclxuICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xyXG4gICAgICAgICAgcmVhc29uOiBgcmVxdWVzdCAke3VybH0gZXJyb3IsICR7ZXJyb3I/Lm1lc3NhZ2UgPz8gJyd9YFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pKCkuY2F0Y2gocmVqZWN0KVxyXG4gIH0pXHJcbiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTxJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbz4oKHJlc29sdmUpOiB2b2lkID0+IHtcclxuICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICByZXNvbHZlKHtcclxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICByZWFzb246IGByZXF1ZXN0ICR7dXJsfSB0aW1lb3V0YFxyXG4gICAgICB9KVxyXG4gICAgfSwgMzAwMDApXHJcbiAgfSlcclxuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtyZXF1ZXN0Rm4sIHRpbWVvdXRQcm9taXNlXSlcclxufVxyXG5cclxuLyoqXHJcbiAqIGRldGVjdCB0aGUgaW5wdXQgc3RyaW5nJ3MgdHlwZVxyXG4gKiBmb3IgZXhhbXBsZVxyXG4gKiAxLiBAeHh4L3BpY2dvLXBsdWdpbi14eHggLT4gc2NvcGVcclxuICogMi4gcGljZ28tcGx1Z2luLXh4eCAtPiBub3JtYWxcclxuICogMy4geHh4IC0+IHNpbXBsZVxyXG4gKiA0LiBub3QgZXhpc3RzIG9yIGlzIGEgcGF0aCAtPiB1bmtub3duXHJcbiAqIEBwYXJhbSBuYW1lXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0UGx1Z2luTmFtZVR5cGUgPSAobmFtZTogc3RyaW5nKTogSVBsdWdpbk5hbWVUeXBlID0+IHtcclxuICBpZiAoL15AW14vXStcXC9waWNnby1wbHVnaW4tLy50ZXN0KG5hbWUpKSB7XHJcbiAgICByZXR1cm4gJ3Njb3BlJ1xyXG4gIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCdwaWNnby1wbHVnaW4tJykpIHtcclxuICAgIHJldHVybiAnbm9ybWFsJ1xyXG4gIH0gZWxzZSBpZiAoaXNTaW1wbGVOYW1lKG5hbWUpKSB7XHJcbiAgICByZXR1cm4gJ3NpbXBsZSdcclxuICB9XHJcbiAgcmV0dXJuICd1bmtub3duJ1xyXG59XHJcblxyXG4vKipcclxuICogZGV0ZWN0IHRoZSBpbnB1dCBzdHJpbmcgaXMgYSBzaW1wbGUgcGx1Z2luIG5hbWUgb3Igbm90XHJcbiAqIGZvciBleGFtcGxlXHJcbiAqIDEuIHh4eCAtPiB0cnVlXHJcbiAqIDIuIC9Vc3IveHgveHh4eC9waWNnby1wbHVnaW4teHh4IC0+IGZhbHNlXHJcbiAqIEBwYXJhbSBuYW1lIHBsdWdpbk5hbWVPclBhdGhcclxuICovXHJcbmV4cG9ydCBjb25zdCBpc1NpbXBsZU5hbWUgPSAobmFtZU9yUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgaWYgKHBhdGguaXNBYnNvbHV0ZShuYW1lT3JQYXRoKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgbmFtZU9yUGF0aClcclxuICBpZiAoZnMuZXhpc3RzU3luYyhwbHVnaW5QYXRoKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIGlmIChuYW1lT3JQYXRoLmluY2x1ZGVzKCcvJykgfHwgbmFtZU9yUGF0aC5pbmNsdWRlcygnXFxcXCcpKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgcmV0dXJuIHRydWVcclxufVxyXG5cclxuLyoqXHJcbiAqIHN0cmVhbWxpbmUgdGhlIGZ1bGwgcGx1Z2luIG5hbWUgdG8gYSBzaW1wbGUgb25lXHJcbiAqIGZvciBleGFtcGxlOlxyXG4gKiAxLiBwaWNnby1wbHVnaW4teHh4IC0+IHh4eFxyXG4gKiAyLiBAeHh4L3BpY2dvLXBsdWdpbi15eXkgLT4geXl5XHJcbiAqIEBwYXJhbSBuYW1lIHBsdWdpbkZ1bGxOYW1lXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaGFuZGxlU3RyZWFtbGluZVBsdWdpbk5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBpZiAoL15AW14vXStcXC9waWNnby1wbHVnaW4tLy50ZXN0KG5hbWUpKSB7XHJcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9eQFteL10rXFwvcGljZ28tcGx1Z2luLS8sICcnKVxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9waWNnby1wbHVnaW4tLywgJycpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogY29tcGxldGUgcGx1Z2luIG5hbWUgdG8gZnVsbCBuYW1lXHJcbiAqIGZvciBleGFtcGxlOlxyXG4gKiAxLiB4eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAyLiBwaWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogQHBhcmFtIG5hbWUgcGx1Z2luU2ltcGxlTmFtZVxyXG4gKiBAcGFyYW0gc2NvcGUgcGx1Z2luU2NvcGVcclxuICovXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVDb21wbGV0ZVBsdWdpbk5hbWUgPSAobmFtZTogc3RyaW5nLCBzY29wZSA9ICcnKTogc3RyaW5nID0+IHtcclxuICBpZiAoc2NvcGUpIHtcclxuICAgIHJldHVybiBgQCR7c2NvcGV9L3BpY2dvLXBsdWdpbi0ke25hbWV9YFxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gYHBpY2dvLXBsdWdpbi0ke25hbWV9YFxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIGhhbmRsZSBpbnN0YWxsL3VuaW5zdGFsbC91cGRhdGUgcGx1Z2luIG5hbWUgb3IgcGF0aFxyXG4gKiBmb3IgZXhhbXBsZVxyXG4gKiAxLiBwaWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogMi4gQHh4eC9waWNnby1wbHVnaW4teHh4IC0+IEB4eHgvcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAzLiB4eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiA0LiAuL3h4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiAvYWJzb2x1dGVQYXRoLy4uLi94eHh4L3BpY2dvLXBsdWdpbi14eHhcclxuICogNS4gL2Fic29sdXRlUGF0aC8uLi4vcGljZ28tcGx1Z2luLXh4eCAtPiAvYWJzb2x1dGVQYXRoLy4uLi9waWNnby1wbHVnaW4teHh4XHJcbiAqIEBwYXJhbSBuYW1lT3JQYXRoIHBsdWdpbk5hbWUgb3IgcGx1Z2luUGF0aFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldFByb2Nlc3NQbHVnaW5OYW1lID0gKG5hbWVPclBhdGg6IHN0cmluZywgbG9nZ2VyOiBJTG9nZ2VyIHwgQ29uc29sZSA9IGNvbnNvbGUpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IHBsdWdpbk5hbWVUeXBlID0gZ2V0UGx1Z2luTmFtZVR5cGUobmFtZU9yUGF0aClcclxuICBzd2l0Y2ggKHBsdWdpbk5hbWVUeXBlKSB7XHJcbiAgICBjYXNlICdub3JtYWwnOlxyXG4gICAgY2FzZSAnc2NvcGUnOlxyXG4gICAgICByZXR1cm4gbmFtZU9yUGF0aFxyXG4gICAgY2FzZSAnc2ltcGxlJzpcclxuICAgICAgcmV0dXJuIGhhbmRsZUNvbXBsZXRlUGx1Z2luTmFtZShuYW1lT3JQYXRoKVxyXG4gICAgZGVmYXVsdDoge1xyXG4gICAgICAvLyBub3csIHRoZSBwbHVnaW5OYW1lVHlwZSBpcyB1bmtub3cgaGVyZVxyXG4gICAgICAvLyAxLiBjaGVjayBpZiBpcyBhbiBhYnNvbHV0ZSBwYXRoXHJcbiAgICAgIGxldCBwbHVnaW5QYXRoID0gbmFtZU9yUGF0aFxyXG4gICAgICBpZiAocGF0aC5pc0Fic29sdXRlKG5hbWVPclBhdGgpICYmIGZzLmV4aXN0c1N5bmMobmFtZU9yUGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gaGFuZGxlVW5peFN0eWxlUGF0aChwbHVnaW5QYXRoKVxyXG4gICAgICB9XHJcbiAgICAgIC8vIDIuIGNoZWNrIGlmIGlzIGEgcmVsYXRpdmUgcGF0aFxyXG4gICAgICBwbHVnaW5QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIG5hbWVPclBhdGgpXHJcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBsdWdpblBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIGhhbmRsZVVuaXhTdHlsZVBhdGgocGx1Z2luUGF0aClcclxuICAgICAgfVxyXG4gICAgICAvLyAzLiBpbnZhbGlkIG5hbWVPclBhdGhcclxuICAgICAgbG9nZ2VyLndhcm4oYENhbid0IGZpbmQgcGx1Z2luICR7bmFtZU9yUGF0aH1gKVxyXG4gICAgICByZXR1cm4gJydcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBnZXQgdGhlIG5vcm1hbCBwbHVnaW4gbmFtZVxyXG4gKiBmb3IgZXhhbXBsZTpcclxuICogMS4gcGljZ28tcGx1Z2luLXh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBAeHh4L3BpY2dvLXBsdWdpbi14eHhcclxuICogMy4gLi94eHh4L3BpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiA0LiAvYWJzb2x1dGVQYXRoLy4uLi9waWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogNS4gYW4gZXhjZXB0aW9uOiBbcGFja2FnZS5qc29uJ3MgbmFtZV0gIT09IFtmb2xkZXIgbmFtZV1cclxuICogdGhlbiB1c2UgW3BhY2thZ2UuanNvbidzIG5hbWVdLCB1c3VhbGx5IG1hdGNoIHRoZSBzY29wZSBwYWNrYWdlLlxyXG4gKiA2LiBpZiBwbHVnaW4gbmFtZSBoYXMgdmVyc2lvbjogcGljZ28tcGx1Z2luLXh4eEB4LngueCB0aGVuIHJlbW92ZSB0aGUgdmVyc2lvblxyXG4gKiBAcGFyYW0gbmFtZU9yUGF0aFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldE5vcm1hbFBsdWdpbk5hbWUgPSAobmFtZU9yUGF0aDogc3RyaW5nLCBsb2dnZXI6IElMb2dnZXIgfCBDb25zb2xlID0gY29uc29sZSk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgcGx1Z2luTmFtZVR5cGUgPSBnZXRQbHVnaW5OYW1lVHlwZShuYW1lT3JQYXRoKVxyXG4gIHN3aXRjaCAocGx1Z2luTmFtZVR5cGUpIHtcclxuICAgIGNhc2UgJ25vcm1hbCc6XHJcbiAgICAgIHJldHVybiByZW1vdmVQbHVnaW5WZXJzaW9uKG5hbWVPclBhdGgpXHJcbiAgICBjYXNlICdzY29wZSc6XHJcbiAgICAgIHJldHVybiByZW1vdmVQbHVnaW5WZXJzaW9uKG5hbWVPclBhdGgsIHRydWUpXHJcbiAgICBjYXNlICdzaW1wbGUnOlxyXG4gICAgICByZXR1cm4gcmVtb3ZlUGx1Z2luVmVyc2lvbihoYW5kbGVDb21wbGV0ZVBsdWdpbk5hbWUobmFtZU9yUGF0aCkpXHJcbiAgICBkZWZhdWx0OiB7XHJcbiAgICAgIC8vIG5vdywgdGhlIG5hbWVPclBhdGggbXVzdCBiZSBwYXRoXHJcbiAgICAgIC8vIHRoZSBuYW1lT3JQYXRoIGhlcmUgd2lsbCBiZSBlbnN1cmVkIHdpdGggdW5peCBzdHlsZVxyXG4gICAgICAvLyB3ZSBuZWVkIHRvIGZpbmQgdGhlIHBhY2thZ2UuanNvbidzIG5hbWUgY2F1c2UgbnBtIHVzaW5nIHRoZSBuYW1lIGluIHBhY2thZ2UuanNvbidzIG5hbWUgZmlsZWRcclxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG5hbWVPclBhdGgpKSB7XHJcbiAgICAgICAgbG9nZ2VyLndhcm4oYENhbid0IGZpbmQgcGx1Z2luOiAke25hbWVPclBhdGh9YClcclxuICAgICAgICByZXR1cm4gJydcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYWNrYWdlSlNPTlBhdGggPSBwYXRoLnBvc2l4LmpvaW4obmFtZU9yUGF0aCwgJ3BhY2thZ2UuanNvbicpXHJcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSlNPTlBhdGgpKSB7XHJcbiAgICAgICAgbG9nZ2VyLndhcm4oYENhbid0IGZpbmQgcGx1Z2luOiAke25hbWVPclBhdGh9YClcclxuICAgICAgICByZXR1cm4gJydcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBwa2cgPSBmcy5yZWFkSlNPTlN5bmMocGFja2FnZUpTT05QYXRoKSB8fCB7fVxyXG4gICAgICAgIGlmICghcGtnLm5hbWU/LmluY2x1ZGVzKCdwaWNnby1wbHVnaW4tJykpIHtcclxuICAgICAgICAgIGxvZ2dlci53YXJuKGBUaGUgcGx1Z2luIHBhY2thZ2UuanNvbidzIG5hbWUgZmlsZWQgaXMgJHtwa2cubmFtZSBhcyBzdHJpbmcgfHwgJ2VtcHR5J30sIG5lZWQgdG8gaW5jbHVkZSB0aGUgcHJlZml4OiBwaWNnby1wbHVnaW4tYClcclxuICAgICAgICAgIHJldHVybiAnJ1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGtnLm5hbWVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIGhhbmRsZSB0cmFuc2Zvcm0gdGhlIHBhdGggdG8gdW5peCBzdHlsZVxyXG4gKiBmb3IgZXhhbXBsZVxyXG4gKiAxLiBDOlxcXFx4eHhcXFxceHh4IC0+IEM6L3h4eC94eHhcclxuICogMi4gL3h4eC94eHggLT4gL3h4eC94eHhcclxuICogQHBhcmFtIHBhdGhcclxuICovXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVVbml4U3R5bGVQYXRoID0gKHBhdGhTdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgcGF0aEFyciA9IHBhdGhTdHIuc3BsaXQocGF0aC5zZXApXHJcbiAgcmV0dXJuIHBhdGhBcnIuam9pbignLycpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiByZW1vdmUgcGx1Z2luIHZlcnNpb24gd2hlbiByZWdpc3RlciBwbHVnaW4gbmFtZVxyXG4gKiAxLiBwaWNnby1wbHVnaW4teHh4QDEuMC4wIC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogMi4gQHh4eC9waWNnby1wbHVnaW4teHh4QDEuMC4wIC0+IEB4eHgvcGljZ28tcGx1Z2luLXh4eFxyXG4gKiBAcGFyYW0gbmFtZU9yUGF0aFxyXG4gKiBAcGFyYW0gc2NvcGVcclxuICovXHJcbmV4cG9ydCBjb25zdCByZW1vdmVQbHVnaW5WZXJzaW9uID0gKG5hbWVPclBhdGg6IHN0cmluZywgc2NvcGU6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKCFuYW1lT3JQYXRoLmluY2x1ZGVzKCdAJykpIHtcclxuICAgIHJldHVybiBuYW1lT3JQYXRoXHJcbiAgfSBlbHNlIHtcclxuICAgIGxldCByZWcgPSAvKC4rXFwvKT8ocGljZ28tcGx1Z2luLVxcdyspKEAuKykqL1xyXG4gICAgLy8gaWYgaXMgYSBzY29wZSBwa2dcclxuICAgIGlmIChzY29wZSkge1xyXG4gICAgICByZWcgPSAvKC4rXFwvKT8oXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi1cXHcrKShALispKi9cclxuICAgIH1cclxuICAgIGNvbnN0IG1hdGNoQXJyID0gbmFtZU9yUGF0aC5tYXRjaChyZWcpXHJcbiAgICBpZiAoIW1hdGNoQXJyKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignY2FuIG5vdCByZW1vdmUgcGx1Z2luIHZlcnNpb24nKVxyXG4gICAgICByZXR1cm4gbmFtZU9yUGF0aFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG1hdGNoQXJyWzJdXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogdGhlIGNvbmZpZyBibGFjayBpdGVtIGxpc3Qgd2hpY2ggd29uJ3QgYmUgc2V0dGVkXHJcbiAqIG9ubHkgY2FuIGJlIGdvdFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNvbmZpZ0JsYWNrTGlzdCA9IFtdXHJcblxyXG4vKipcclxuICogY2hlY2sgc29tZSBjb25maWcga2V5IGlzIGluIGJsYWNrTGlzdFxyXG4gKiBAcGFyYW0ga2V5XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXNDb25maWdLZXlJbkJsYWNrTGlzdCA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiBjb25maWdCbGFja0xpc3Quc29tZShibGFja0l0ZW0gPT4ga2V5LnN0YXJ0c1dpdGgoYmxhY2tJdGVtKSlcclxufVxyXG5cclxuLyoqXHJcbiAqIGNoZWNrIHRoZSBpbnB1dCBjb25maWcgaXMgdmFsaWRcclxuICogY29uZmlnIG11c3QgYmUgb2JqZWN0IHN1Y2ggYXMgeyB4eHg6ICd4eHgnIH1cclxuICogJiYgY2FuJ3QgYmUgYXJyYXlcclxuICogQHBhcmFtIGNvbmZpZ1xyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzSW5wdXRDb25maWdWYWxpZCA9IChjb25maWc6IGFueSk6IGJvb2xlYW4gPT4ge1xyXG4gIGlmIChcclxuICAgIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmXHJcbiAgICAhQXJyYXkuaXNBcnJheShjb25maWcpICYmXHJcbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmxlbmd0aCA+IDBcclxuICApIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2FmZVBhcnNlPFQ+IChzdHI6IHN0cmluZyk6IFQgfCBzdHJpbmcge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpXHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIHJldHVybiBzdHJcclxuICB9XHJcbn1cclxuXHJcbi8vIGhvbGQuLi5cclxuLy8gZXhwb3J0IGNvbnN0IGNvbmZpZ1doaXRlTGlzdDogUmVnRXhwW10gPSBbXHJcbi8vICAgL15waWNCZWQvLFxyXG4vLyAgIC9ecGljZ29QbHVnaW5zLyxcclxuLy8gICAvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLFxyXG4vLyAgIC9kZWJ1Zy8sXHJcbi8vICAgL3NpbGVudC8sXHJcbi8vICAgL2NvbmZpZ1BhdGgvLFxyXG4vLyAgIC9ec2V0dGluZ3MvLFxyXG4vLyBdXHJcblxyXG4vLyBleHBvcnQgY29uc3QgaXNDb25maWdLZXlJbldoaXRlTGlzdCA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4vLyAgIHJldHVybiBjb25maWdXaGl0ZUxpc3Quc29tZSh3aGl0ZUl0ZW0gPT4gd2hpdGVJdGVtLnRlc3Qoa2V5KSlcclxuLy8gfVxyXG5cclxuZXhwb3J0IGNvbnN0IGZvcmNlTnVtYmVyID0gKG51bTogc3RyaW5nIHwgbnVtYmVyID0gMCk6IG51bWJlciA9PiB7XHJcbiAgcmV0dXJuIGlzTmFOKE51bWJlcihudW0pKSA/IDAgOiBOdW1iZXIobnVtKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNEZXYgPSAoKTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc1Byb2QgPSAoKTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbidcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gdGV4dDJTVkcgKFxyXG4gIGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aDogc3RyaW5nLFxyXG4gIHRleHQ/OiBzdHJpbmcsXHJcbiAgY29sb3I/OiBzdHJpbmcsXHJcbiAgZm9udEZhbWlseT86IHN0cmluZ1xyXG4pOiBQcm9taXNlPEJ1ZmZlcj4ge1xyXG4gIHRleHQgPSAhdGV4dCA/ICfmtYvor5UnIDogdGV4dFxyXG4gIGZvbnRGYW1pbHkgPSAhZm9udEZhbWlseSA/IGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aCA6IGZvbnRGYW1pbHlcclxuICBjb2xvciA9ICFjb2xvciA/ICdyZ2JhKDIwNCwgMjA0LCAyMDQsIDAuNDUpJyA6IGNvbG9yXHJcbiAgY29uc3QgdGV4dDJTVkcgPSBUZXh0VG9TVkcubG9hZFN5bmMoZm9udEZhbWlseSlcclxuICBjb25zdCBvcHRpb25zOiBUZXh0VG9TVkcuR2VuZXJhdGlvbk9wdGlvbnMgPSB7XHJcbiAgICBhbmNob3I6ICd0b3AnLFxyXG4gICAgYXR0cmlidXRlczoge1xyXG4gICAgICBmaWxsOiBjb2xvclxyXG4gICAgfVxyXG4gIH1cclxuICBjb25zdCB0ZXh0U1ZHID0gdGV4dDJTVkcuZ2V0U1ZHKHRleHQsIG9wdGlvbnMpXHJcbiAgY29uc3Qgc3ZnID0gQnVmZmVyLmZyb20odGV4dFNWRylcclxuICByZXR1cm4gc3ZnXHJcbn1cclxuXHJcbmNvbnN0IGRlZmF1bHRXYXRlcm1hcmtJbWFnZVBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnYXNzZXRzJywgJ3BpY2xpc3QucG5nJylcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBBZGRXYXRlcm1hcmsgKFxyXG4gIGltZzogQnVmZmVyLFxyXG4gIHdhdGVybWFya1R5cGU6ICd0ZXh0JyB8ICdpbWFnZScsXHJcbiAgZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoOiBzdHJpbmcsXHJcbiAgaXNGdWxsU2NyZWVuV2F0ZXJtYXJrPzogYm9vbGVhbixcclxuICB3YXRlcm1hcmtEZWdyZWU/OiBudW1iZXIsXHJcbiAgdGV4dD86IHN0cmluZyxcclxuICB3YXRlcm1hcmtGb250UGF0aD86IHN0cmluZyxcclxuICB3YXRlcm1hcmtTY2FsZVJhdGlvPzogbnVtYmVyLFxyXG4gIHdhdGVybWFya0NvbG9yPzogc3RyaW5nLFxyXG4gIHdhdGVybWFya0ltYWdlUGF0aD86IHN0cmluZyxcclxuICBwb3NpdGlvbj86IHNoYXJwLkdyYXZpdHlcclxuKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICB3YXRlcm1hcmtTY2FsZVJhdGlvID0gIXdhdGVybWFya1NjYWxlUmF0aW8gfHwgd2F0ZXJtYXJrU2NhbGVSYXRpbyA8IDAgfHwgd2F0ZXJtYXJrU2NhbGVSYXRpbyA+IDEgPyAwLjE1IDogd2F0ZXJtYXJrU2NhbGVSYXRpb1xyXG4gIGNvbnN0IGltYWdlID0gc2hhcnAoaW1nLCB7IGFuaW1hdGVkOiB0cnVlIH0pXHJcbiAgY29uc3QgeyB3aWR0aDogaW1nV2lkdGggPSAyMDAgfSA9IGF3YWl0IGltYWdlLm1ldGFkYXRhKClcclxuICBjb25zdCB3YXRlcm1hcmsgPSBhd2FpdCBjcmVhdGVXYXRlcm1hcmsoXHJcbiAgICB3YXRlcm1hcmtUeXBlLFxyXG4gICAgZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoLFxyXG4gICAgdGV4dCxcclxuICAgIHdhdGVybWFya0ZvbnRQYXRoLFxyXG4gICAgd2F0ZXJtYXJrU2NhbGVSYXRpbyxcclxuICAgIHdhdGVybWFya0NvbG9yLFxyXG4gICAgd2F0ZXJtYXJrSW1hZ2VQYXRoLFxyXG4gICAgaW1nV2lkdGgsXHJcbiAgICB3YXRlcm1hcmtEZWdyZWVcclxuICApXHJcbiAgY29uc3QgY29tcG9zaXRlZCA9IGF3YWl0IGltYWdlXHJcbiAgICAuY29tcG9zaXRlKFtcclxuICAgICAge1xyXG4gICAgICAgIGlucHV0OiB3YXRlcm1hcmssXHJcbiAgICAgICAgZ3Jhdml0eTogcG9zaXRpb24gfHwgJ3NvdXRoZWFzdCcsXHJcbiAgICAgICAgdGlsZTogaXNGdWxsU2NyZWVuV2F0ZXJtYXJrXHJcbiAgICAgIH1cclxuICAgIF0pXHJcbiAgICAudG9CdWZmZXIoKVxyXG4gIHJldHVybiBjb21wb3NpdGVkXHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdhdGVybWFyayAoXHJcbiAgd2F0ZXJtYXJrVHlwZTogJ3RleHQnIHwgJ2ltYWdlJyxcclxuICBkZWZhdWx0V2F0ZXJtYXJrRm9udFBhdGg6IHN0cmluZyxcclxuICB0ZXh0Pzogc3RyaW5nLFxyXG4gIHdhdGVybWFya0ZvbnRQYXRoPzogc3RyaW5nLFxyXG4gIHdhdGVybWFya1NjYWxlUmF0aW8/OiBudW1iZXIsXHJcbiAgd2F0ZXJtYXJrQ29sb3I/OiBzdHJpbmcsXHJcbiAgd2F0ZXJtYXJrSW1hZ2VQYXRoPzogc3RyaW5nLFxyXG4gIGltZ1dpZHRoOiBudW1iZXIgPSAyMDAsXHJcbiAgd2F0ZXJtYXJrRGVncmVlOiBudW1iZXIgPSAwXHJcbik6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgbGV0IHdhdGVybWFyazogYW55XHJcbiAgaWYgKHdhdGVybWFya1R5cGUgPT09ICdpbWFnZScpIHtcclxuICAgIHdhdGVybWFya0ltYWdlUGF0aCA9IHdhdGVybWFya0ltYWdlUGF0aCB8fCBkZWZhdWx0V2F0ZXJtYXJrSW1hZ2VQYXRoXHJcbiAgICB3YXRlcm1hcmsgPSBhd2FpdCBzaGFycCh3YXRlcm1hcmtJbWFnZVBhdGgpLnRvQnVmZmVyKClcclxuICB9IGVsc2Uge1xyXG4gICAgd2F0ZXJtYXJrID0gYXdhaXQgdGV4dDJTVkcoXHJcbiAgICAgIGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aCxcclxuICAgICAgdGV4dCxcclxuICAgICAgd2F0ZXJtYXJrQ29sb3IsXHJcbiAgICAgIHdhdGVybWFya0ZvbnRQYXRoIHx8IGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aFxyXG4gICAgKVxyXG4gIH1cclxuICBjb25zdCB7IHdpZHRoOiB3YXRlcm1hcmtXaWR0aCwgaGVpZ2h0OiB3YXRlcm1hcmtIZWlnaHQgfSA9IGF3YWl0IGdldFNpemUoXHJcbiAgICB3YXRlcm1hcmtcclxuICApXHJcbiAgY29uc3Qgd2F0ZXJtYXJrUmVzaXplV2lkdGggPSBNYXRoLmZsb29yKGltZ1dpZHRoICogZm9yY2VOdW1iZXIod2F0ZXJtYXJrU2NhbGVSYXRpbykpXHJcbiAgY29uc3Qgd2F0ZXJtYXJrUmVzaXplSGVpZ2h0ID0gTWF0aC5mbG9vcihcclxuICAgICh3YXRlcm1hcmtSZXNpemVXaWR0aCAqIHdhdGVybWFya0hlaWdodCkgLyB3YXRlcm1hcmtXaWR0aFxyXG4gIClcclxuICByZXR1cm4gYXdhaXQgc2hhcnAod2F0ZXJtYXJrKVxyXG4gICAgLnJlc2l6ZSh3YXRlcm1hcmtSZXNpemVXaWR0aCwgd2F0ZXJtYXJrUmVzaXplSGVpZ2h0LCB7XHJcbiAgICAgIGZpdDogJ2luc2lkZSdcclxuICAgIH0pXHJcbiAgICAucm90YXRlKHdhdGVybWFya0RlZ3JlZSwgeyBiYWNrZ3JvdW5kOiB7IHI6IDI1NSwgZzogMjU1LCBiOiAyNTUsIGFscGhhOiAwIH0gfSlcclxuICAgIC50b0J1ZmZlcigpXHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldFNpemUgKGltYWdlOiBCdWZmZXIpOiBQcm9taXNlPHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfT4ge1xyXG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYXdhaXQgc2hhcnAoaW1hZ2UpLm1ldGFkYXRhKClcclxuICByZXR1cm4geyB3aWR0aDogd2lkdGggfHwgMjAwLCBoZWlnaHQ6IGhlaWdodCB8fCAyMDAgfVxyXG59XHJcblxyXG5jb25zdCB2YWxpZFBhcmFtID0gKC4uLnBhcmFtczogYW55W10pOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gcGFyYW1zLmV2ZXJ5KHBhcmFtID0+IHtcclxuICAgIGlmIChwYXJhbSA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIHBhcmFtICE9PSAnJ1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgcmV0dXJuIHBhcmFtID4gMFxyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtKS5sZW5ndGggPiAwXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IGF2YWlsYWJsZUNvbnZlcnRGb3JtYXRMaXN0ID0gW1xyXG4gICdhdmlmJyxcclxuICAnZHonLFxyXG4gICdmaXRzJyxcclxuICAnZ2lmJyxcclxuICAnaGVpZicsXHJcbiAgJ2lucHV0JyxcclxuICAnanBlZycsXHJcbiAgJ2pwZycsXHJcbiAgJ2pwMicsXHJcbiAgJ2p4bCcsXHJcbiAgJ21hZ2ljaycsXHJcbiAgJ29wZW5zbGlkZScsXHJcbiAgJ3BkZicsXHJcbiAgJ3BuZycsXHJcbiAgJ3BwbScsXHJcbiAgJ3JhdycsXHJcbiAgJ3N2ZycsXHJcbiAgJ3RpZmYnLFxyXG4gICd0aWYnLFxyXG4gICd2JyxcclxuICAnd2VicCdcclxuXVxyXG5cclxuY29uc3QgdmFsaWRPdXRwdXRGb3JtYXQgPSAoZm9ybWF0OiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gYXZhaWxhYmxlQ29udmVydEZvcm1hdExpc3QuaW5jbHVkZXMoZm9ybWF0KVxyXG59XHJcblxyXG5jb25zdCBpbWFnZUV4dExpc3QgPSBbJ2pwZycsICdqcGVnJywgJ3BuZycsICd3ZWJwJywgJ2JtcCcsICd0aWZmJywgJ3RpZicsICdzdmcnLCAnaWNvJywgJ2F2aWYnLCAnaGVpZicsICdoZWljJ11cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbWFnZUFkZFdhdGVyTWFyayAoaW1nOiBCdWZmZXIsIG9wdGlvbnM6IElCdWlsZEluV2F0ZXJNYXJrT3B0aW9ucywgZGVmYXVsdFdhdGVybWFya0ZvbnRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xyXG4gIHRyeSB7XHJcbiAgICBsZXQgaW1hZ2U6IHNoYXJwLlNoYXJwID0gc2hhcnAoaW1nLCB7IGFuaW1hdGVkOiB0cnVlIH0pXHJcbiAgICBpZiAodmFsaWRQYXJhbShvcHRpb25zLndhdGVybWFya1RleHQpKSB7XHJcbiAgICAgIGltYWdlID0gc2hhcnAoYXdhaXQgQWRkV2F0ZXJtYXJrKFxyXG4gICAgICAgIGltZyxcclxuICAgICAgICBvcHRpb25zLndhdGVybWFya1R5cGUgfHwgJ3RleHQnLFxyXG4gICAgICAgIGRlZmF1bHRXYXRlcm1hcmtGb250UGF0aCxcclxuICAgICAgICBvcHRpb25zLmlzRnVsbFNjcmVlbldhdGVybWFyayxcclxuICAgICAgICBmb3JjZU51bWJlcihvcHRpb25zLndhdGVybWFya0RlZ3JlZSksXHJcbiAgICAgICAgb3B0aW9ucy53YXRlcm1hcmtUZXh0LFxyXG4gICAgICAgIG9wdGlvbnMud2F0ZXJtYXJrRm9udFBhdGgsXHJcbiAgICAgICAgZm9yY2VOdW1iZXIob3B0aW9ucy53YXRlcm1hcmtTY2FsZVJhdGlvKSxcclxuICAgICAgICBvcHRpb25zLndhdGVybWFya0NvbG9yLFxyXG4gICAgICAgIG9wdGlvbnMud2F0ZXJtYXJrSW1hZ2VQYXRoLFxyXG4gICAgICAgIG9wdGlvbnMud2F0ZXJtYXJrUG9zaXRpb25cclxuICAgICAgKSwgeyBhbmltYXRlZDogdHJ1ZSB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IGltYWdlLnRvQnVmZmVyKClcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5sb2coZXJyb3IpXHJcbiAgICByZXR1cm4gaW1nXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtYXRPcHRpb25zIChvcHRpb25zOiBJQnVpbGRJbkNvbXByZXNzT3B0aW9ucyk6IElCdWlsZEluQ29tcHJlc3NPcHRpb25zIHtcclxuICByZXR1cm4ge1xyXG4gICAgcXVhbGl0eTogZm9yY2VOdW1iZXIob3B0aW9ucy5xdWFsaXR5KSxcclxuICAgIGlzQ29udmVydDogb3B0aW9ucy5pc0NvbnZlcnQgfHwgZmFsc2UsXHJcbiAgICBjb252ZXJ0Rm9ybWF0OiBvcHRpb25zLmNvbnZlcnRGb3JtYXQgfHwgJ2pwZycsXHJcbiAgICBpc1JlU2l6ZTogb3B0aW9ucy5pc1JlU2l6ZSB8fCBmYWxzZSxcclxuICAgIHJlU2l6ZUhlaWdodDogZm9yY2VOdW1iZXIob3B0aW9ucy5yZVNpemVIZWlnaHQpLFxyXG4gICAgcmVTaXplV2lkdGg6IGZvcmNlTnVtYmVyKG9wdGlvbnMucmVTaXplV2lkdGgpLFxyXG4gICAgc2tpcFJlU2l6ZU9mU21hbGxJbWc6IG9wdGlvbnMuc2tpcFJlU2l6ZU9mU21hbGxJbWcgfHwgZmFsc2UsXHJcbiAgICBpc1JlU2l6ZUJ5UGVyY2VudDogb3B0aW9ucy5pc1JlU2l6ZUJ5UGVyY2VudCB8fCBmYWxzZSxcclxuICAgIHJlU2l6ZVBlcmNlbnQ6IGZvcmNlTnVtYmVyKG9wdGlvbnMucmVTaXplUGVyY2VudCksXHJcbiAgICBpc1JvdGF0ZTogb3B0aW9ucy5pc1JvdGF0ZSB8fCBmYWxzZSxcclxuICAgIGlzRmxpcDogb3B0aW9ucy5pc0ZsaXAgfHwgZmFsc2UsXHJcbiAgICBpc0Zsb3A6IG9wdGlvbnMuaXNGbG9wIHx8IGZhbHNlLFxyXG4gICAgcm90YXRlRGVncmVlOiBmb3JjZU51bWJlcihvcHRpb25zLnJvdGF0ZURlZ3JlZSksXHJcbiAgICBwaWNCZWQ6IG9wdGlvbnMucGljQmVkIHx8ICdzbW1zJ1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltYWdlUHJvY2VzcyAoaW1nOiBCdWZmZXIsIG9wdGlvbnM6IElCdWlsZEluQ29tcHJlc3NPcHRpb25zLCByYXdGb3JtYXQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgb3B0aW9ucyA9IGZvcm1hdE9wdGlvbnMob3B0aW9ucylcclxuICB0cnkge1xyXG4gICAgcmF3Rm9ybWF0ID0gcmF3Rm9ybWF0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICcnKVxyXG4gICAgaWYgKCFpbWFnZUV4dExpc3QuaW5jbHVkZXMocmF3Rm9ybWF0KSkge1xyXG4gICAgICByZXR1cm4gaW1nXHJcbiAgICB9XHJcbiAgICBsZXQgaW1hZ2U6IHNoYXJwLlNoYXJwID0gc2hhcnAoaW1nLCB7IGFuaW1hdGVkOiB0cnVlIH0pXHJcbiAgICBsZXQgcXVhbGl0eSA9IDEwMFxyXG4gICAgaWYgKHZhbGlkUGFyYW0ob3B0aW9ucy5xdWFsaXR5KSAmJiBvcHRpb25zLnF1YWxpdHkhIDwgMTAwKSB7XHJcbiAgICAgIHF1YWxpdHkgPSBvcHRpb25zLnF1YWxpdHkhXHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5pc1JlU2l6ZUJ5UGVyY2VudCkge1xyXG4gICAgICBpZiAodmFsaWRQYXJhbShvcHRpb25zLnJlU2l6ZVBlcmNlbnQpKSB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VXaWR0aCA9IGF3YWl0IGltYWdlLm1ldGFkYXRhKCkudGhlbihtZXRhZGF0YSA9PiBtZXRhZGF0YS53aWR0aClcclxuICAgICAgICBjb25zdCBpbWFnZUhlaWdodCA9IGF3YWl0IGltYWdlLm1ldGFkYXRhKCkudGhlbihtZXRhZGF0YSA9PiBtZXRhZGF0YS5oZWlnaHQpXHJcbiAgICAgICAgaWYgKGltYWdlV2lkdGggJiYgaW1hZ2VIZWlnaHQpIHtcclxuICAgICAgICAgIGltYWdlID0gaW1hZ2UucmVzaXplKFxyXG4gICAgICAgICAgICBNYXRoLnJvdW5kKGltYWdlV2lkdGggKiBvcHRpb25zLnJlU2l6ZVBlcmNlbnQhIC8gMTAwKSxcclxuICAgICAgICAgICAgTWF0aC5yb3VuZChpbWFnZUhlaWdodCAqIG9wdGlvbnMucmVTaXplUGVyY2VudCEgLyAxMDApLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZml0OiAnaW5zaWRlJ1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmlzUmVTaXplKSB7XHJcbiAgICAgIGlmICgodHlwZW9mIG9wdGlvbnMucmVTaXplSGVpZ2h0ID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLnJlU2l6ZUhlaWdodCA+IDApICYmICh0eXBlb2Ygb3B0aW9ucy5yZVNpemVXaWR0aCA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5yZVNpemVXaWR0aCA+IDApKSB7XHJcbiAgICAgICAgaW1hZ2UgPSBpbWFnZS5yZXNpemUoXHJcbiAgICAgICAgICBvcHRpb25zLnJlU2l6ZVdpZHRoLFxyXG4gICAgICAgICAgb3B0aW9ucy5yZVNpemVIZWlnaHQsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpdDogJ2ZpbGwnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2UgaWYgKCh0eXBlb2Ygb3B0aW9ucy5yZVNpemVIZWlnaHQgPT09ICdudW1iZXInICYmIG9wdGlvbnMucmVTaXplSGVpZ2h0ID4gMCkgJiYgKHR5cGVvZiBvcHRpb25zLnJlU2l6ZVdpZHRoICE9PSAnbnVtYmVyJyB8fCBvcHRpb25zLnJlU2l6ZVdpZHRoID09PSAwKSkge1xyXG4gICAgICAgIGNvbnN0IGltYWdlV2lkdGggPSBhd2FpdCBpbWFnZS5tZXRhZGF0YSgpLnRoZW4obWV0YWRhdGEgPT4gbWV0YWRhdGEud2lkdGgpXHJcbiAgICAgICAgY29uc3QgaW1hZ2VIZWlnaHQgPSBhd2FpdCBpbWFnZS5tZXRhZGF0YSgpLnRoZW4obWV0YWRhdGEgPT4gbWV0YWRhdGEuaGVpZ2h0KVxyXG4gICAgICAgIGlmIChpbWFnZVdpZHRoICYmIGltYWdlSGVpZ2h0KSB7XHJcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuc2tpcFJlU2l6ZU9mU21hbGxJbWcgfHwgKG9wdGlvbnMuc2tpcFJlU2l6ZU9mU21hbGxJbWcgJiYgb3B0aW9ucy5yZVNpemVIZWlnaHQgPCBpbWFnZUhlaWdodCkpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2NhbGVSYXRpbyA9IG9wdGlvbnMucmVTaXplSGVpZ2h0IC8gaW1hZ2VIZWlnaHRcclxuICAgICAgICAgICAgaW1hZ2UgPSBpbWFnZS5yZXNpemUoXHJcbiAgICAgICAgICAgICAgTWF0aC5yb3VuZChpbWFnZVdpZHRoICogc2NhbGVSYXRpbyksXHJcbiAgICAgICAgICAgICAgb3B0aW9ucy5yZVNpemVIZWlnaHQsXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZml0OiAnaW5zaWRlJ1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICgodHlwZW9mIG9wdGlvbnMucmVTaXplV2lkdGggPT09ICdudW1iZXInICYmIG9wdGlvbnMucmVTaXplV2lkdGggPiAwKSAmJiAodHlwZW9mIG9wdGlvbnMucmVTaXplSGVpZ2h0ICE9PSAnbnVtYmVyJyB8fCBvcHRpb25zLnJlU2l6ZUhlaWdodCA9PT0gMCkpIHtcclxuICAgICAgICBjb25zdCBpbWFnZVdpZHRoID0gYXdhaXQgaW1hZ2UubWV0YWRhdGEoKS50aGVuKG1ldGFkYXRhID0+IG1ldGFkYXRhLndpZHRoKVxyXG4gICAgICAgIGNvbnN0IGltYWdlSGVpZ2h0ID0gYXdhaXQgaW1hZ2UubWV0YWRhdGEoKS50aGVuKG1ldGFkYXRhID0+IG1ldGFkYXRhLmhlaWdodClcclxuICAgICAgICBpZiAoaW1hZ2VXaWR0aCAmJiBpbWFnZUhlaWdodCkge1xyXG4gICAgICAgICAgaWYgKCFvcHRpb25zLnNraXBSZVNpemVPZlNtYWxsSW1nIHx8IChvcHRpb25zLnNraXBSZVNpemVPZlNtYWxsSW1nICYmIG9wdGlvbnMucmVTaXplV2lkdGggPCBpbWFnZVdpZHRoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBzY2FsZVJhdGlvID0gb3B0aW9ucy5yZVNpemVXaWR0aCAvIGltYWdlV2lkdGhcclxuICAgICAgICAgICAgaW1hZ2UgPSBpbWFnZS5yZXNpemUoXHJcbiAgICAgICAgICAgICAgb3B0aW9ucy5yZVNpemVXaWR0aCxcclxuICAgICAgICAgICAgICBNYXRoLnJvdW5kKGltYWdlSGVpZ2h0ICogc2NhbGVSYXRpbyksXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZml0OiAnaW5zaWRlJ1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMuaXNSb3RhdGUgJiYgb3B0aW9ucy5yb3RhdGVEZWdyZWUpIHtcclxuICAgICAgaW1hZ2UgPSBpbWFnZS5yb3RhdGUob3B0aW9ucy5yb3RhdGVEZWdyZWUsIHsgYmFja2dyb3VuZDogeyByOiAyNTUsIGc6IDI1NSwgYjogMjU1LCBhbHBoYTogMCB9IH0pXHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5pc0ZsaXApIHtcclxuICAgICAgY29uc29sZS5sb2coJ2ZsaXAnKVxyXG4gICAgICBpbWFnZSA9IGltYWdlLmZsaXAoKVxyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMuaXNGbG9wKSB7XHJcbiAgICAgIGltYWdlID0gaW1hZ2UuZmxvcCgpXHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5pc0NvbnZlcnQpIHtcclxuICAgICAgbGV0IG5ld0Zvcm1hdCA9IG9wdGlvbnMuY29udmVydEZvcm1hdCB8fCAnanBnJ1xyXG4gICAgICBpZiAob3B0aW9ucy5waWNCZWQgPT09ICdpbWd1cicgJiYgbmV3Rm9ybWF0ID09PSAnd2VicCcpIHtcclxuICAgICAgICBuZXdGb3JtYXQgPSAnanBnJ1xyXG4gICAgICB9XHJcbiAgICAgIGltYWdlID0gaW1hZ2UudG9Gb3JtYXQobmV3Rm9ybWF0LCB7XHJcbiAgICAgICAgcXVhbGl0eVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHJhd0Zvcm1hdCAmJiB2YWxpZE91dHB1dEZvcm1hdChyYXdGb3JtYXQpKSB7XHJcbiAgICAgICAgaW1hZ2UgPSBpbWFnZS50b0Zvcm1hdChyYXdGb3JtYXQgYXMgYW55LCB7XHJcbiAgICAgICAgICBxdWFsaXR5XHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbWFnZSA9IGltYWdlLnRvRm9ybWF0KCdqcGcnLCB7XHJcbiAgICAgICAgICBxdWFsaXR5XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IGltYWdlLnRvQnVmZmVyKClcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5sb2coZXJyb3IpXHJcbiAgICByZXR1cm4gaW1nXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBpbWFnZUZvcm1hdExpc3QgPSBbJ2pwZycsICdqcGVnJywgJ3BuZycsICd3ZWJwJywgJ2JtcCcsICd0aWZmJywgJ3RpZicsICdzdmcnLCAnaWNvJywgJ2F2aWYnLCAnaGVpZicsICdoZWljJywgJ2dpZiddXHJcblxyXG5leHBvcnQgY29uc3QgbmVlZEFkZFdhdGVybWFyayA9ICh3YXRlcm1hcmtPcHRpb25zOiBJQnVpbGRJbldhdGVyTWFya09wdGlvbnMgfCB1bmRlZmluZWQsIGZpbGVFeHQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIGZpbGVFeHQgPSBmaWxlRXh0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICcnKVxyXG4gIHJldHVybiAhIXdhdGVybWFya09wdGlvbnMgJiYgISF3YXRlcm1hcmtPcHRpb25zLmlzQWRkV2F0ZXJtYXJrICYmIGltYWdlRm9ybWF0TGlzdC5pbmNsdWRlcyhmaWxlRXh0KVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbmVlZENvbXByZXNzID0gKGNvbXByZXNzT3B0aW9uczogSUJ1aWxkSW5Db21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQsIGZpbGVFeHQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHQgPSBmaWxlRXh0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICcnKVxyXG5cclxuICBpZiAoIWltYWdlRm9ybWF0TGlzdC5pbmNsdWRlcyhub3JtYWxpemVkRXh0KSB8fCAhY29tcHJlc3NPcHRpb25zKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGNvbnN0IHtcclxuICAgIHF1YWxpdHksXHJcbiAgICBpc1JlU2l6ZUJ5UGVyY2VudCxcclxuICAgIHJlU2l6ZVBlcmNlbnQsXHJcbiAgICBpc1JlU2l6ZSxcclxuICAgIHJlU2l6ZUhlaWdodCxcclxuICAgIHJlU2l6ZVdpZHRoLFxyXG4gICAgaXNSb3RhdGUsXHJcbiAgICByb3RhdGVEZWdyZWUsXHJcbiAgICBpc0NvbnZlcnQsXHJcbiAgICBjb252ZXJ0Rm9ybWF0LFxyXG4gICAgaXNGbGlwLFxyXG4gICAgaXNGbG9wXHJcbiAgfSA9IGZvcm1hdE9wdGlvbnMoY29tcHJlc3NPcHRpb25zKVxyXG5cclxuICBpZiAodmFsaWRQYXJhbShxdWFsaXR5KSAmJiBxdWFsaXR5ISA8IDEwMCkge1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcbiAgaWYgKGlzUmVTaXplQnlQZXJjZW50ICYmIHZhbGlkUGFyYW0ocmVTaXplUGVyY2VudCkpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG4gIGlmIChpc1JlU2l6ZSAmJiAoKHR5cGVvZiByZVNpemVIZWlnaHQgPT09ICdudW1iZXInICYmIHJlU2l6ZUhlaWdodCA+IDApIHx8ICh0eXBlb2YgcmVTaXplV2lkdGggPT09ICdudW1iZXInICYmIHJlU2l6ZVdpZHRoID4gMCkpKSB7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuICBpZiAoaXNSb3RhdGUgJiYgcm90YXRlRGVncmVlKSB7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuICBpZiAoaXNGbGlwIHx8IGlzRmxvcCkge1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcbiAgaWYgKGlzQ29udmVydCkge1xyXG4gICAgY29uc3QgbmV3Rm9ybWF0ID0gY29udmVydEZvcm1hdCB8fCAnanBnJ1xyXG4gICAgcmV0dXJuIGZpbGVFeHQgIT09IG5ld0Zvcm1hdFxyXG4gIH1cclxuICByZXR1cm4gZmFsc2VcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlbW92ZUV4aWYgPSBhc3luYyAoaW1nOiBCdWZmZXIsIGZpbGVFeHQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiA9PiB7XHJcbiAgZmlsZUV4dCA9IGZpbGVFeHQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCcuJywgJycpXHJcbiAgaWYgKCFpbWFnZUZvcm1hdExpc3QuaW5jbHVkZXMoZmlsZUV4dCkpIHtcclxuICAgIHJldHVybiBpbWdcclxuICB9XHJcbiAgcmV0dXJuIGF3YWl0IHNoYXJwKGltZywge1xyXG4gICAgYW5pbWF0ZWQ6IHRydWVcclxuICB9KS50b0J1ZmZlcigpXHJcbn1cclxuIiwiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgeyBpc1VybCB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgdXBsb2FkOiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgndXBsb2FkJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCd1cGxvYWQsIGdvIGdvIGdvJylcclxuICAgICAgLmFyZ3VtZW50cygnW2lucHV0Li4uXScpXHJcbiAgICAgIC5hbGlhcygndScpXHJcbiAgICAgIC5hY3Rpb24oKGlucHV0OiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbnB1dExpc3QgPSBpbnB1dFxyXG4gICAgICAgICAgICAubWFwKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gaXNVcmwoaXRlbSkgPyBpdGVtIDogcGF0aC5yZXNvbHZlKGl0ZW0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0ID0gZnMuZXhpc3RzU3luYyhpdGVtKSB8fCBpc1VybChpdGVtKVxyXG4gICAgICAgICAgICAgIGlmICghZXhpc3QpIHtcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgJHtpdGVtfSBkb2VzIG5vdCBleGlzdC5gKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gZXhpc3RcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIGF3YWl0IGN0eC51cGxvYWQoaW5wdXRMaXN0KVxyXG4gICAgICAgIH0pKCkuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgdXBsb2FkXHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSUJ1aWxkSW5Db21wcmVzc09wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgdHlwZSBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElCdWlsZEluQ29tcHJlc3NPcHRpb25zPignYnVpbGRJbi5jb21wcmVzcycpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdxdWFsaXR5JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUVVBTElUWScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5xdWFsaXR5IHx8IDEwMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzQ29udmVydCcsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfSVNDT05WRVJUJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmlzQ29udmVydCB8fCBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2NvbnZlcnRGb3JtYXQnLFxyXG4gICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX0NPTlZFUlRGT1JNQVQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGNob2ljZXM6IFsnYXZpZicsICdkeicsICdmaXRzJywgJ2dpZicsICdoZWlmJywgJ2lucHV0JywgJ2pwZWcnLCAnanBnJywgJ2pwMicsICdqeGwnLCAnbWFnaWNrJywgJ29wZW5zbGlkZScsICdwZGYnLCAncG5nJywgJ3BwbScsICdyYXcnLCAnc3ZnJywgJ3RpZmYnLCAndGlmJywgJ3YnLCAnd2VicCddLFxyXG4gICAgICBkZWZhdWx0OiAnanBnJ1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzUmVTaXplJyxcclxuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9DT01QUkVTU19JU1JFU0laRScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5pc1JlU2l6ZSB8fCBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3JlU2l6ZVdpZHRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUkVTSVpFV0lEVEgnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucmVTaXplV2lkdGggfHwgNTAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncmVTaXplSGVpZ2h0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUkVTSVpFSEVJR0hUJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnJlU2l6ZUhlaWdodCB8fCA1MDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdza2lwUmVTaXplT2ZTbWFsbEltZycsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfU0tJUFJFU0laRU9GU01BTExJTUcnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc2tpcFJlU2l6ZU9mU21hbGxJbWcgfHwgZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdpc1JlU2l6ZUJ5UGVyY2VudCcsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkVCWVBFUkNFTlQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuaXNSZVNpemVCeVBlcmNlbnQgfHwgZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdyZVNpemVQZXJjZW50JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUkVTSVpFUEVSQ0VOVCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5yZVNpemVQZXJjZW50IHx8IDUwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaXNGbGlwJyxcclxuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9DT01QUkVTU19JU0ZMSVAnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuaXNGbGlwIHx8IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaXNGbG9wJyxcclxuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9DT01QUkVTU19JU0ZMT1AnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuaXNGbG9wIHx8IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaXNSb3RhdGUnLFxyXG4gICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX0NPTVBSRVNTX0lTUk9UQVRFJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmlzUm90YXRlIHx8IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncm90YXRlRGVncmVlJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfUk9UQVRFREVHUkVFJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnJvdGF0ZURlZ3JlZSB8fCA5MFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzUmVtb3ZlRXhpZicsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fQ09NUFJFU1NfSVNSRU1PVkVFWElGJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmlzUmVtb3ZlRXhpZiB8fCBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBjb25maWdcclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGx1Z2luQ29uZmlnLCB0eXBlIElCdWlsZEluV2F0ZXJNYXJrT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUJ1aWxkSW5XYXRlck1hcmtPcHRpb25zPignYnVpbGRJbi53YXRlcm1hcmsnKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaXNBZGRXYXRlcm1hcmsnLFxyXG4gICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19JU0FERFdBVEVSTUFSSycpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5pc0FkZFdhdGVybWFyayB8fCBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3dhdGVybWFya1R5cGUnLFxyXG4gICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktUWVBFJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBjaG9pY2VzOiBbJ3RleHQnLCAnaW1hZ2UnXSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53YXRlcm1hcmtUeXBlIHx8ICd0ZXh0J1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2lzRnVsbFNjcmVlbldhdGVybWFyaycsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX0lTRlVMTFNDUkVFTldBVEVSTUFSSycpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5pc0Z1bGxTY3JlZW5XYXRlcm1hcmsgfHwgZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtEZWdyZWUnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLREVHUkVFJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndhdGVybWFya0RlZ3JlZSB8fCAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnd2F0ZXJtYXJrVGV4dCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhUJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndhdGVybWFya1RleHQgfHwgJydcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtGb250UGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhURk9OVFBBVEgnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcud2F0ZXJtYXJrRm9udFBhdGggfHwgJydcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtTY2FsZVJhdGlvJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRSQVRJTycpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53YXRlcm1hcmtTY2FsZVJhdGlvIHx8IDAuMTVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtDb2xvcicsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktGT05UQ09MT1InKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcud2F0ZXJtYXJrQ29sb3IgfHwgJ3JnYmEoMjA0LCAyMDQsIDIwNCwgMC40NSknXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnd2F0ZXJtYXJrSW1hZ2VQYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0lNQUdFUEFUSCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53YXRlcm1hcmtJbWFnZVBhdGggfHwgJydcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3YXRlcm1hcmtQb3NpdGlvbicsXHJcbiAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1BPU0lUSU9OJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBjaG9pY2VzOiBbJ25vcnRoJywgJ25vcnRoZWFzdCcsICdzb3V0aGVhc3QnLCAnc291dGgnLCAnc291dGh3ZXN0JywgJ25vcnRod2VzdCcsICd3ZXN0JywgJ2Vhc3QnLCAnY2VudGVyJywgJ2NlbnRyZSddLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLndhdGVybWFya1Bvc2l0aW9uIHx8ICdzb3V0aGVhc3QnXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIGNvbmZpZ1xyXG59XHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgdHlwZSBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPGFueT4oJ2J1aWxkSW4ucmVuYW1lJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2Zvcm1hdCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdCVUlMRElOX1JFTkFNRV9GT1JNQVQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuZm9ybWF0IHx8ICd7ZmlsZW5hbWV9J1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2VuYWJsZScsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0JVSUxESU5fUkVOQU1FX0VOQUJMRScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5lbmFibGUgfHwgZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgY29uZmlnXHJcbn1cclxuIiwiaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbkNvbmZpZywgdHlwZSBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBjb21wcmVzcyBmcm9tICcuLi9iZWZvcmV0cmFuc2Zvcm1lci9jb21wcmVzcydcclxuaW1wb3J0IHdhdGVybWFyayBmcm9tICcuLi9iZWZvcmV0cmFuc2Zvcm1lci93YXRlcm1hcmsnXHJcbmltcG9ydCByZW5hbWUgZnJvbSAnLi4vYmVmb3JldXBsb2FkL2J1aWxkSW5SZW5hbWUnXHJcblxyXG4vLyBoYW5kbGUgbW9kdWxlcyBjb25maWcgLT4gc2F2ZSB0byBwaWNnbyBjb25maWcgZmlsZVxyXG5jb25zdCBoYW5kbGVDb25maWcgPSBhc3luYyAoY3R4OiBJUGljR28sIHByb21wdHM6IElQbHVnaW5Db25maWdbXSwgbW9kdWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KHByb21wdHMpXHJcbiAgY29uc3QgY29uZmlnTmFtZSA9IG1vZHVsZSA9PT0gJ3VwbG9hZGVyJ1xyXG4gICAgPyBgcGljQmVkLiR7bmFtZX1gXHJcbiAgICA6IG1vZHVsZSA9PT0gJ3RyYW5zZm9ybWVyJ1xyXG4gICAgICA/IGB0cmFuc2Zvcm1lci4ke25hbWV9YFxyXG4gICAgICA6IG1vZHVsZSA9PT0gJ2J1aWxkaW4nXHJcbiAgICAgICAgPyBgYnVpbGRJbi4ke25hbWV9YFxyXG4gICAgICAgIDogbmFtZVxyXG4gIGN0eC5zYXZlQ29uZmlnKHtcclxuICAgIFtjb25maWdOYW1lXTogYW5zd2VyXHJcbiAgfSlcclxuICBpZiAobW9kdWxlID09PSAndXBsb2FkZXInKSB7XHJcbiAgICBjdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICdwaWNCZWQuY3VycmVudCc6IG5hbWUsXHJcbiAgICAgICdwaWNCZWQudXBsb2FkZXInOiBuYW1lXHJcbiAgICB9KVxyXG4gIH0gZWxzZSBpZiAobW9kdWxlID09PSAndHJhbnNmb3JtZXInKSB7XHJcbiAgICBjdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICdwaWNCZWQudHJhbnNmb3JtZXInOiBuYW1lXHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuY29uc3Qgc2V0dGluZyA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ3NldCcpXHJcbiAgICAgIC5hbGlhcygnY29uZmlnJylcclxuICAgICAgLmFyZ3VtZW50cygnPG1vZHVsZT4gW25hbWVdJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCdjb25maWd1cmUgY29uZmlnIG9mIHBpY2dvIG1vZHVsZXMsIHVwbG9hZGVyfHRyYW5zZm9ybWVyfHBsdWdpbnxidWlsZGluJylcclxuICAgICAgLmFjdGlvbigobW9kdWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcclxuICAgICAgICAgICAgLy8gYXdhaXQgY3R4LnBsdWdpbkxvYWRlci5sb2FkKClcclxuICAgICAgICAgICAgLy8gaWYgYSBtb2R1bGUgaXMgc3BlY2lmaWMsIHRoZW4ganVzdCBzZXQgdGhpcyBvcHRpb24gaW4gY29uZmlnXHJcbiAgICAgICAgICAgIHN3aXRjaCAobW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAnYnVpbGRpbic6XHJcbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2NvbXByZXNzJykge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBjb21wcmVzcy5jb25maWcoY3R4KSwgbW9kdWxlLCBuYW1lKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09PSAnd2F0ZXJtYXJrJykge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCB3YXRlcm1hcmsuY29uZmlnKGN0eCksIG1vZHVsZSwgbmFtZSlcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3JlbmFtZScpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgcmVuYW1lLmNvbmZpZyhjdHgpLCBtb2R1bGUsIG5hbWUpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdidWlsZGluJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM6IFsnY29tcHJlc3MnLCAnd2F0ZXJtYXJrJywgJ3JlbmFtZSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Nob29zZSBhIGJ1aWxkaW4gbW9kdWxlJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdDxJU3RyaW5nS2V5TWFwPGFueT4+KHByb21wdHMpXHJcbiAgICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIuYnVpbGRpbiA9PT0gJ2NvbXByZXNzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGNvbXByZXNzLmNvbmZpZyhjdHgpLCBtb2R1bGUsIGFuc3dlci5idWlsZGluKVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFuc3dlci5idWlsZGluID09PSAnd2F0ZXJtYXJrJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIHdhdGVybWFyay5jb25maWcoY3R4KSwgbW9kdWxlLCBhbnN3ZXIuYnVpbGRpbilcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbnN3ZXIuYnVpbGRpbiA9PT0gJ3JlbmFtZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCByZW5hbWUuY29uZmlnKGN0eCksIG1vZHVsZSwgYW5zd2VyLmJ1aWxkaW4pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgY2FzZSAndXBsb2FkZXInOlxyXG4gICAgICAgICAgICAgIGNhc2UgJ3RyYW5zZm9ybWVyJzpcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdHguaGVscGVyW21vZHVsZV0uZ2V0KG5hbWUpXHJcbiAgICAgICAgICAgICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoYE5vICR7bW9kdWxlfSBuYW1lZCAke25hbWV9YCk7IHJldHVyblxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGl0ZW0uY29uZmlnKGN0eCksIG1vZHVsZSwgbmFtZSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbXB0cyA9IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBgJHttb2R1bGV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5oZWxwZXJbbW9kdWxlXS5nZXRJZExpc3QoKSxcclxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBDaG9vc2UgYShuKSAke21vZHVsZX1gXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnKCdwaWNCZWQudXBsb2FkZXInKSB8fCBjdHguZ2V0Q29uZmlnKCdwaWNCZWQuY3VycmVudCcpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0PElTdHJpbmdLZXlNYXA8YW55Pj4ocHJvbXB0cylcclxuICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGN0eC5oZWxwZXJbbW9kdWxlXS5nZXQoYW5zd2VyW21vZHVsZV0pXHJcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtPy5jb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBpdGVtLmNvbmZpZyhjdHgpLCBtb2R1bGUsIGFuc3dlclttb2R1bGVdKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIGNhc2UgJ3BsdWdpbic6XHJcbiAgICAgICAgICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJ3BpY2dvLXBsdWdpbi0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBgcGljZ28tcGx1Z2luLSR7bmFtZX1gXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGN0eC5nZXRDb25maWcoJ3BpY2dvUGx1Z2lucycpKS5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihuYW1lKT8uY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDb25maWcoY3R4LCBjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihuYW1lKSEuY29uZmlnIShjdHgpLCAncGx1Z2luJywgbmFtZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxvZy5lcnJvcihgTm8gcGx1Z2luIG5hbWVkICR7bmFtZX1gKTsgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21wdHMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3BsdWdpbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHgucGx1Z2luTG9hZGVyLmdldEZ1bGxMaXN0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQ2hvb3NlIGEgcGx1Z2luJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdDxhbnk+KHByb21wdHMpXHJcbiAgICAgICAgICAgICAgICAgIGlmIChjdHgucGx1Z2luTG9hZGVyLmdldFBsdWdpbihhbnN3ZXIucGx1Z2luKT8uY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgY3R4LnBsdWdpbkxvYWRlci5nZXRQbHVnaW4oYW5zd2VyLnBsdWdpbikhLmNvbmZpZyEoY3R4KSwgJ3BsdWdpbicsIGFuc3dlci5wbHVnaW4pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLndhcm4oJ0F2YWlsYWJsZSBtb2R1bGVzIGFyZSB1cGxvYWRlcnx0cmFuc2Zvcm1lcnxwbHVnaW58YnVpbGRpbicpOyByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoJ0NvbmZpZ3VyZSBjb25maWcgc3VjY2Vzc2Z1bGx5IScpXHJcbiAgICAgICAgICAgIGlmIChtb2R1bGUgPT09ICdwbHVnaW4nKSB7XHJcbiAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKCdJZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBjb25maWcsIHBsZWFzZSBydW4gXFwncGljZ28gdXNlIHBsdWdpbnNcXCcnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWRlYnVnJykpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSgpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHNldHRpbmdcclxuIiwiaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbiwgdHlwZSBVbmRlZmluYWJsZSwgdHlwZSBJQ0xJQ29uZmlncywgdHlwZSBJU3RyaW5nS2V5TWFwIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCB1c2U6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiBhc3luYyAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCd1c2UnKVxyXG4gICAgICAuYXJndW1lbnRzKCdbbW9kdWxlXScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbigndXNlIG1vZHVsZXMgb2YgcGljZ28nKVxyXG4gICAgICAuYWN0aW9uKChtb2R1bGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcclxuICAgICAgICAgICAgLy8gYXdhaXQgY3R4LnBsdWdpbkxvYWRlci5sb2FkKClcclxuICAgICAgICAgICAgbGV0IHByb21wdHM6IGFueVtdID0gW11cclxuICAgICAgICAgICAgY29uc3QgY29uZmlnOiBJQ0xJQ29uZmlncyA9IHtcclxuICAgICAgICAgICAgICB1cGxvYWRlcjoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3VwbG9hZGVyJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2UgYW4gdXBsb2FkZXInLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LmhlbHBlci51cGxvYWRlci5nZXRJZExpc3QoKSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGN0eC5nZXRDb25maWcoJ3BpY0JlZC51cGxvYWRlcicpIHx8IGN0eC5nZXRDb25maWcoJ3BpY0JlZC5jdXJyZW50JykgfHwgJ3NtbXMnXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lcjoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RyYW5zZm9ybWVyJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2UgYSB0cmFuc2Zvcm1lcicsXHJcbiAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldElkTGlzdCgpLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnRyYW5zZm9ybWVyJykgfHwgJ3BhdGgnXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBwbHVnaW5zOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3BsdWdpbnMnLFxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZSBwbHVnaW5zJyxcclxuICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5wbHVnaW5Mb2FkZXIuZ2V0RnVsbExpc3QoKSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IE9iamVjdC5rZXlzKGN0eC5nZXRDb25maWcoJ3BpY2dvUGx1Z2lucycpKS5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7aXRlbX1gKSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgYW4gb3B0aW9uIGlzIHNwZWNpZmljLCB0aGVuIGp1c3Qgc2V0IHRoaXMgb3B0aW9uIGluIGNvbmZpZ1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZ1ttb2R1bGVdKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9tcHRzLnB1c2goY29uZmlnW21vZHVsZV0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgTm8gbW9kdWxlIG5hbWVkICR7bW9kdWxlfWApXHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLndhcm4oJ0F2YWlsYWJsZSBtb2R1bGVzIGFyZSB1cGxvYWRlcnx0cmFuc2Zvcm1lcnxwbHVnaW5zJyk7IHJldHVyblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBwcm9tcHRzID0gT2JqZWN0LmtleXMoY29uZmlnKS5tYXAoKGl0ZW06IHN0cmluZykgPT4gY29uZmlnW2l0ZW1dKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGNtZC5pbnF1aXJlci5wcm9tcHQ8YW55Pihwcm9tcHRzKVxyXG5cclxuICAgICAgICAgICAgLy8gaGFuZGxlIGZvciBwbHVnaW5zIG9wdGlvbiBmcm9tIEFycmF5IHRvIG9iamVjdFxyXG4gICAgICAgICAgICBpZiAoYW5zd2VyLnBsdWdpbnMpIHtcclxuICAgICAgICAgICAgICBjb25zdCBwbHVnaW5zID0gY3R4LmdldENvbmZpZzxJU3RyaW5nS2V5TWFwPGJvb2xlYW4+PigncGljZ29QbHVnaW5zJylcclxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwbHVnaW5zKS5mb3JFYWNoKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIucGx1Z2lucy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICBwbHVnaW5zW2l0ZW1dID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcGx1Z2luc1tpdGVtXSA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAvLyBzYXZlIGNvbmZpZyBmb3IgcGx1Z2luc1xyXG4gICAgICAgICAgICAgIGN0eC5zYXZlQ29uZmlnKHtcclxuICAgICAgICAgICAgICAgIHBpY2dvUGx1Z2luczogcGx1Z2luc1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gc2F2ZSBjb25maWcgZm9yIHVwbG9hZGVyICYgdHJhbnNmb3JtZXJcclxuICAgICAgICAgICAgY3R4LnNhdmVDb25maWcoe1xyXG4gICAgICAgICAgICAgICdwaWNCZWQuY3VycmVudCc6IGFuc3dlci51cGxvYWRlciB8fCBjdHguZ2V0Q29uZmlnPHN0cmluZz4oJ3BpY0JlZC5jdXJyZW50JyksXHJcbiAgICAgICAgICAgICAgJ3BpY0JlZC51cGxvYWRlcic6IGFuc3dlci51cGxvYWRlciB8fCBjdHguZ2V0Q29uZmlnPHN0cmluZz4oJ3BpY0JlZC5jdXJyZW50JyksXHJcbiAgICAgICAgICAgICAgJ3BpY0JlZC50cmFuc2Zvcm1lcic6IGFuc3dlci50cmFuc2Zvcm1lciB8fCAncGF0aCdcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgY3R4LmxvZy5zdWNjZXNzKCdDb25maWd1cmUgY29uZmlnIHN1Y2Nlc3NmdWxseSEnKVxyXG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1kZWJ1ZycpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkoKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB1c2VcclxuIiwiaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgcHJveHk6IElQbHVnaW4gPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5vcHRpb24oJy1wLCAtLXByb3h5IDx1cmw+JywgJ3NldCBwcm94eSBmb3IgdXBsb2FkaW5nJywgKHByb3h5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjdHguc2V0Q29uZmlnKHtcclxuICAgICAgICAgICdwaWNCZWQucHJveHknOiBwcm94eVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBwcm94eVxyXG4iLCJpbXBvcnQgbWF0Y2ggZnJvbSAnbWluaW1hdGNoJ1xyXG5pbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJT3B0aW9ucywgdHlwZSBJRmlsZVRyZWUgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgZ2xvYmJ5IGZyb20gJ2dsb2JieSdcclxuaW1wb3J0IGVqcyBmcm9tICdlanMnXHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgdGVtcGxhdGUgZmlsZXMgdG8gZGVzdGluYXRpb24gZmlsZXMuXHJcbiAqIEBwYXJhbSB7UGljR299IGN0eFxyXG4gKiBAcGFyYW0ge0lPcHRpb25zfSBvcHRpb25zXHJcbiAqL1xyXG5jb25zdCBnZW5lcmF0ZSA9IGFzeW5jIChjdHg6IElQaWNHbywgb3B0aW9uczogSU9wdGlvbnMpOiBQcm9taXNlPGFueT4gPT4ge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBvcHRzID0gZ2V0T3B0aW9ucyhvcHRpb25zLnRtcClcclxuICAgIGNvbnN0IHNvdXJjZSA9IHBhdGguam9pbihvcHRpb25zLnRtcCwgJ3RlbXBsYXRlJylcclxuICAgIGxldCBhbnN3ZXJzID0ge31cclxuICAgIGlmIChvcHRzLnByb21wdHMgJiYgb3B0cy5wcm9tcHRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgYW5zd2VycyA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0KG9wdHMucHJvbXB0cylcclxuICAgIH1cclxuICAgIGxldCBfZmlsZXM6IHN0cmluZ1tdID0gYXdhaXQgZ2xvYmJ5KFsnKiovKiddLCB7IGN3ZDogc291cmNlLCBkb3Q6IHRydWUgfSkgLy8gZ2V0IGZpbGVzJyBuYW1lIGFycmF5XHJcbiAgICBfZmlsZXMgPSBfZmlsZXMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgbGV0IGdsb2IgPSAnJ1xyXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZpbHRlcnMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKG1hdGNoKGl0ZW0sIGtleSwgeyBkb3Q6IHRydWUgfSkpIHtcclxuICAgICAgICAgIGdsb2IgPSBpdGVtXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBpZiAoZ2xvYikgeyAvLyBmaW5kIGEgZmlsdGVyIGV4cHJlc3Npb25cclxuICAgICAgICByZXR1cm4gZmlsdGVycyhjdHgsIG9wdHMuZmlsdGVyc1tnbG9iXSwgYW5zd2VycylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgaWYgKF9maWxlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY3R4LmxvZy53YXJuKCdUZW1wbGF0ZSBmaWxlcyBub3QgZm91bmQhJyk7IHJldHVyblxyXG4gICAgfVxyXG4gICAgY29uc3QgZmlsZXMgPSByZW5kZXIoX2ZpbGVzLCBzb3VyY2UsIGFuc3dlcnMpXHJcbiAgICB3cml0ZUZpbGVUcmVlKG9wdGlvbnMuZGVzdCwgZmlsZXMpXHJcbiAgICBpZiAodHlwZW9mIG9wdHMuY29tcGxldGUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgb3B0cy5jb21wbGV0ZSh7IGFuc3dlcnMsIG9wdGlvbnMsIGZpbGVzOiBfZmlsZXMsIGN0eCB9KVxyXG4gICAgfVxyXG4gICAgaWYgKG9wdHMuY29tcGxldGVNZXNzYWdlKSB7XHJcbiAgICAgIGN0eC5sb2cuc3VjY2VzcyhvcHRzLmNvbXBsZXRlTWVzc2FnZSlcclxuICAgIH1cclxuICAgIGN0eC5sb2cuc3VjY2VzcygnRG9uZSEnKVxyXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0aGUgZmlsdGVycycgcmVzdWx0XHJcbiAqIEBwYXJhbSBjdHggUGljR29cclxuICogQHBhcmFtIGV4cCBjb25kaXRpb24gZXhwcmVzc2lvblxyXG4gKiBAcGFyYW0gZGF0YSBvcHRpb25zIGRhdGFcclxuICovXHJcbmNvbnN0IGZpbHRlcnMgPSAoY3R4OiBJUGljR28sIGV4cDogYW55LCBkYXRhOiBhbnkpOiBib29sZWFuID0+IHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXBsdXMtb3BlcmFuZHMsIG5vLW5ldy1mdW5jLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsXHJcbiAgY29uc3QgZm4gPSBuZXcgRnVuY3Rpb24oJ2RhdGEnLCAnd2l0aCAoZGF0YSkgeyByZXR1cm4gJyArIGV4cCArICd9JylcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIGZuKGRhdGEpXHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgY3R4LmxvZy5lcnJvcihgRXJyb3Igd2hlbiBldmFsdWF0aW5nIGZpbHRlciBjb25kaXRpb246ICR7SlNPTi5zdHJpbmdpZnkoZXhwKX1gKVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRlbXBsYXRlIG9wdGlvbnNcclxuICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlUGF0aFxyXG4gKi9cclxuY29uc3QgZ2V0T3B0aW9ucyA9ICh0ZW1wbGF0ZVBhdGg6IHN0cmluZyk6IGFueSA9PiB7XHJcbiAgY29uc3Qgb3B0aW9uc1BhdGggPSBwYXRoLmpvaW4odGVtcGxhdGVQYXRoLCAnaW5kZXguanMnKVxyXG4gIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnNQYXRoKSkge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcclxuICAgIGNvbnN0IG9wdGlvbnMgPSByZXF1aXJlKG9wdGlvbnNQYXRoKVxyXG4gICAgcmV0dXJuIG9wdGlvbnNcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHt9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmVuZGVyIGZpbGVzIHRvIGEgdmlydHVhbCB0cmVlIG9iamVjdFxyXG4gKiBAcGFyYW0ge2FycmF5fSBmaWxlc1xyXG4gKi9cclxuY29uc3QgcmVuZGVyID0gKGZpbGVzOiBzdHJpbmdbXSwgc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSA9PiB7XHJcbiAgY29uc3QgZmlsZVRyZWU6IElGaWxlVHJlZSA9IHt9XHJcbiAgZmlsZXMuZm9yRWFjaCgoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgZmlsZSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oc291cmNlLCBmaWxlUGF0aCksICd1dGY4JylcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBlanMucmVuZGVyKGZpbGUsIG9wdGlvbnMpXHJcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbnRlbnQpIHx8IC9bXlxcc10vLnRlc3QoY29udGVudCkpIHtcclxuICAgICAgZmlsZVRyZWVbZmlsZVBhdGhdID0gY29udGVudFxyXG4gICAgfVxyXG4gIH0pXHJcbiAgcmV0dXJuIGZpbGVUcmVlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBXcml0ZSByZW5kZXJlZCBmaWxlcycgY29udGVudCB0byByZWFsIGZpbGVcclxuICogQHBhcmFtIHtzdHJpbmd9IGRpclxyXG4gKiBAcGFyYW0ge29iamVjdH0gZmlsZXNcclxuICovXHJcbmNvbnN0IHdyaXRlRmlsZVRyZWUgPSAoZGlyOiBzdHJpbmcsIGZpbGVzOiBhbnkpOiB2b2lkID0+IHtcclxuICBPYmplY3Qua2V5cyhmaWxlcykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXIsIG5hbWUpXHJcbiAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCkpXHJcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmaWxlc1tuYW1lXSlcclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQge1xyXG4gIGZpbHRlcnMsXHJcbiAgZ2VuZXJhdGUsXHJcbiAgcmVuZGVyLFxyXG4gIHdyaXRlRmlsZVRyZWVcclxufVxyXG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICcuLi8uLi91dGlscy9pbml0VXRpbHMnXHJcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcydcclxuaW1wb3J0IGRvd25sb2FkIGZyb20gJ2Rvd25sb2FkLWdpdC1yZXBvJ1xyXG5pbXBvcnQgeyB0eXBlIElPcHRpb25zLCB0eXBlIElQbHVnaW4sIHR5cGUgSVBpY0dvIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBybSBmcm9tICdyaW1yYWYnXHJcblxyXG5jb25zdCBydW4gPSAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElPcHRpb25zKTogdm9pZCA9PiB7XHJcbiAgLy8gY29uc3QgbmFtZSA9IG9wdGlvbnMuaW5QbGFjZSA/IHBhdGgucmVsYXRpdmUoJy4uLycsIHByb2Nlc3MuY3dkKCkpIDogb3B0aW9ucy5wcm9qZWN0XHJcbiAgaWYgKG9wdGlvbnMub2ZmbGluZSkgeyAvLyBvZmZsaW5lIG1vZGVcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKG9wdGlvbnMudGVtcGxhdGUpKSB7XHJcbiAgICAgIGdlbmVyYXRlKGN0eCwgb3B0aW9ucykuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3R4LmxvZy5lcnJvcihgTG9jYWwgdGVtcGxhdGUgJHtvcHRpb25zLnRlbXBsYXRlfSBub3QgZm91bmRgKVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7IC8vIG9ubGluZSBtb2RlXHJcbiAgICBvcHRpb25zLnRlbXBsYXRlID0gIW9wdGlvbnMuaGFzU2xhc2hcclxuICAgICAgPyAnUGljR28vcGljZ28tdGVtcGxhdGUtJyArIG9wdGlvbnMudGVtcGxhdGUgLy8gb2ZmaWNpYWwgdGVtcGxhdGVcclxuICAgICAgOiBvcHRpb25zLnRlbXBsYXRlXHJcbiAgICBkb3dubG9hZEFuZEdlbmVyYXRlKGN0eCwgb3B0aW9ucylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBkb3dubG9hZCB0ZW1wbGF0ZSAmIGdlbmVyYXRlXHJcbiAqIEBwYXJhbSB7IFBpY0dvIH0gY3R4XHJcbiAqIEBwYXJhbSB7IElPcHRpb25zIH0gb3B0aW9uc1xyXG4gKi9cclxuY29uc3QgZG93bmxvYWRBbmRHZW5lcmF0ZSA9IChjdHg6IElQaWNHbywgb3B0aW9uczogSU9wdGlvbnMpOiB2b2lkID0+IHtcclxuICBpZiAoZnMuZXhpc3RzU3luYyhvcHRpb25zLnRtcCkpIHtcclxuICAgIHJtLnN5bmMob3B0aW9ucy50bXApXHJcbiAgfVxyXG4gIGN0eC5sb2cuaW5mbygnVGVtcGxhdGUgZmlsZXMgYXJlIGRvd25sb2FkaW5nLi4uJylcclxuICBkb3dubG9hZChvcHRpb25zLnRlbXBsYXRlLCBvcHRpb25zLnRtcCwgeyBjbG9uZTogb3B0aW9ucy5jbG9uZSB9LCAoZXJyOiBFcnJvcikgPT4ge1xyXG4gICAgaWYgKGVycikge1xyXG4gICAgICBjdHgubG9nLmVycm9yKGVycik7IHJldHVyblxyXG4gICAgfVxyXG4gICAgY3R4LmxvZy5zdWNjZXNzKCdUZW1wbGF0ZSBmaWxlcyBhcmUgZG93bmxvYWRlZCEnKVxyXG4gICAgZ2VuZXJhdGUoY3R4LCBvcHRpb25zKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3QgaW5pdDogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IGFzeW5jIChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ2luaXQnKVxyXG4gICAgICAuYXJndW1lbnRzKCc8dGVtcGxhdGU+IFtwcm9qZWN0XScpXHJcbiAgICAgIC5vcHRpb24oJy0tY2xvbmUnLCAndXNlIGdpdCBjbG9uZScpXHJcbiAgICAgIC5vcHRpb24oJy0tb2ZmbGluZScsICd1c2UgY2FjaGVkIHRlbXBsYXRlJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCdjcmVhdGUgcGljZ28gcGx1Z2luXFwncyBkZXZlbG9wbWVudCB0ZW1wbGF0ZXMnKVxyXG4gICAgICAuYWN0aW9uKCh0ZW1wbGF0ZTogc3RyaW5nLCBwcm9qZWN0OiBzdHJpbmcsIHByb2dyYW06IGFueSkgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAvLyBUaGFua3MgdG8gdnVlLWNsaSBpbml0OiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWNsaS9ibG9iL21hc3Rlci9iaW4vdnVlLWluaXRcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc1NsYXNoID0gdGVtcGxhdGUuaW5jbHVkZXMoJy8nKVxyXG4gICAgICAgICAgICBjb25zdCBpblBsYWNlID0gIXByb2plY3QgfHwgcHJvamVjdCA9PT0gJy4nXHJcbiAgICAgICAgICAgIGNvbnN0IGRlc3QgPSBwYXRoLnJlc29sdmUocHJvamVjdCB8fCAnLicpXHJcbiAgICAgICAgICAgIGNvbnN0IGNsb25lID0gcHJvZ3JhbS5jbG9uZSB8fCBmYWxzZVxyXG4gICAgICAgICAgICBjb25zdCBvZmZsaW5lID0gcHJvZ3JhbS5vZmZsaW5lIHx8IGZhbHNlXHJcbiAgICAgICAgICAgIGNvbnN0IHRtcCA9IHBhdGguam9pbihob21lZGlyKCksICcucGljZ28vdGVtcGxhdGVzJywgdGVtcGxhdGUucmVwbGFjZSgvWy86XS9nLCAnLScpKSAvLyBmb3IgY2FjaGluZyB0ZW1wbGF0ZVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb2dyYW0ub2ZmbGluZSkge1xyXG4gICAgICAgICAgICAgIHRlbXBsYXRlID0gdG1wXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgdGVtcGxhdGUsXHJcbiAgICAgICAgICAgICAgcHJvamVjdCxcclxuICAgICAgICAgICAgICBoYXNTbGFzaCxcclxuICAgICAgICAgICAgICBpblBsYWNlLFxyXG4gICAgICAgICAgICAgIGRlc3QsXHJcbiAgICAgICAgICAgICAgY2xvbmUsXHJcbiAgICAgICAgICAgICAgdG1wLFxyXG4gICAgICAgICAgICAgIG9mZmxpbmVcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgcHJvamVjdCBpcyBlbXB0eSBvciBleGlzdFxyXG4gICAgICAgICAgICBpZiAoaW5QbGFjZSB8fCBmcy5leGlzdHNTeW5jKGRlc3QpKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgY3R4LmNtZC5pbnF1aXJlci5wcm9tcHQoW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGluUGxhY2VcclxuICAgICAgICAgICAgICAgICAgICA/ICdHZW5lcmF0ZSBwcm9qZWN0IGluIGN1cnJlbnQgZGlyZWN0b3J5PydcclxuICAgICAgICAgICAgICAgICAgICA6ICdUYXJnZXQgZGlyZWN0b3J5IGV4aXN0cy4gQ29udGludWU/JyxcclxuICAgICAgICAgICAgICAgICAgbmFtZTogJ29rJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIF0pLnRoZW4oKGFuc3dlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyLm9rKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJ1bihjdHgsIG9wdGlvbnMpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHsgLy8gcHJvamVjdCBpcyBnaXZlblxyXG4gICAgICAgICAgICAgIHJ1bihjdHgsIG9wdGlvbnMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZGVidWcnKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKCkuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gICAgICAub24oJy0taGVscCcsICgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgICAgY29uc29sZS5sb2coJ0V4YW1wbGVzOicpXHJcbiAgICAgICAgY29uc29sZS5sb2coKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgIyBjcmVhdGUgYSBuZXcgcHJvamVjdCB3aXRoIGFuIG9mZmljaWFsIHRlbXBsYXRlJykpXHJcbiAgICAgICAgY29uc29sZS5sb2coJyAgJCBwaWNnbyBpbml0IHBsdWdpbiBteS1wcm9qZWN0JylcclxuICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAjIGNyZWF0ZSBhIG5ldyBwcm9qZWN0IHN0cmFpZ2h0IGZyb20gYSBnaXRodWIgdGVtcGxhdGUnKSlcclxuICAgICAgICBjb25zb2xlLmxvZygnICAkIHBpY2dvIGluaXQgdXNlcm5hbWUvcmVwbyBteS1wcm9qZWN0JylcclxuICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBpbml0XHJcbiIsImltcG9ydCB7IHR5cGUgSVBsdWdpbiwgdHlwZSBJUGljR28sIHR5cGUgSVN0cmluZ0tleU1hcCB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgaTE4bjogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ2kxOG4nKVxyXG4gICAgICAuYXJndW1lbnRzKCdbbGFuZ10nKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ2NoYW5nZSBwaWNnbyBsYW5ndWFnZScpXHJcbiAgICAgIC5hY3Rpb24oYXN5bmMgKGxhbmc6IHN0cmluZyA9ICcnKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGlzdCA9IGN0eC5pMThuLmdldExhbmd1YWdlTGlzdCgpXHJcbiAgICAgICAgaWYgKCFsYW5nKSB7XHJcbiAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgIG5hbWU6ICdpMThuJyxcclxuICAgICAgICAgICAgICBjaG9pY2VzOiBsaXN0LFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdDaG9vc2UgYSBsYW5ndWFnZScsXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDogY3R4LmdldENvbmZpZygnc2V0dGluZ3MubGFuZ3VhZ2UnKSB8fCAnemgtQ04nXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0PElTdHJpbmdLZXlNYXA8c3RyaW5nPj4ocHJvbXB0cylcclxuICAgICAgICAgIGN0eC5pMThuLnNldExhbmd1YWdlKGFuc3dlci5pMThuKVxyXG4gICAgICAgICAgY3R4LmxvZy5zdWNjZXNzKGBMYW5ndWFnZSBzZXQgdG8gJHthbnN3ZXIuaTE4bn1gKVxyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbGlzdC5pbmNsdWRlcyhsYW5nKSkge1xyXG4gICAgICAgICAgY3R4LmxvZy53YXJuKCdObyBzdWNoIGxhbmd1YWdlJyk7IHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBjdHguaTE4bi5zZXRMYW5ndWFnZShsYW5nKVxyXG4gICAgICAgIGN0eC5sb2cuc3VjY2VzcyhgTGFuZ3VhZ2Ugc2V0IHRvICR7bGFuZ31gKVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgaTE4blxyXG4iLCJpbXBvcnQgcGx1Z2luSGFuZGxlciBmcm9tICcuL3BsdWdpbkhhbmRsZXInXHJcbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnXHJcbmltcG9ydCB1cGxvYWQgZnJvbSAnLi91cGxvYWQnXHJcbmltcG9ydCBzZXR0aW5nIGZyb20gJy4vc2V0dGluZydcclxuaW1wb3J0IHVzZSBmcm9tICcuL3VzZSdcclxuaW1wb3J0IHByb3h5IGZyb20gJy4vcHJveHknXHJcbmltcG9ydCBpbml0IGZyb20gJy4vaW5pdCdcclxuaW1wb3J0IGkxOG4gZnJvbSAnLi9pMThuJ1xyXG5pbXBvcnQgeyB0eXBlIElQaWNHbyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKGN0eDogSVBpY0dvKTogdm9pZCA9PiB7XHJcbiAgY3R4LmNtZC5yZWdpc3RlcigncGx1Z2luSGFuZGxlcicsIHBsdWdpbkhhbmRsZXIpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcignY29uZmlnJywgY29uZmlnKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3NldHRpbmcnLCBzZXR0aW5nKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3VwbG9hZCcsIHVwbG9hZClcclxuICBjdHguY21kLnJlZ2lzdGVyKCd1c2UnLCB1c2UpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcigncHJveHknLCBwcm94eSlcclxuICBjdHguY21kLnJlZ2lzdGVyKCdpbml0JywgaW5pdClcclxuICBjdHguY21kLnJlZ2lzdGVyKCdpMThuJywgaTE4bilcclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQbHVnaW4sIHR5cGUgSUxpZmVjeWNsZVBsdWdpbnMgfSBmcm9tICcuLi90eXBlcydcclxuXHJcbmV4cG9ydCBjbGFzcyBMaWZlY3ljbGVQbHVnaW5zIGltcGxlbWVudHMgSUxpZmVjeWNsZVBsdWdpbnMge1xyXG4gIHN0YXRpYyBjdXJyZW50UGx1Z2luOiBzdHJpbmcgfCBudWxsXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0OiBNYXA8c3RyaW5nLCBJUGx1Z2luPlxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPlxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nXHJcblxyXG4gIGNvbnN0cnVjdG9yIChuYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubmFtZSA9IG5hbWVcclxuICAgIHRoaXMubGlzdCA9IG5ldyBNYXAoKVxyXG4gICAgdGhpcy5wbHVnaW5JZE1hcCA9IG5ldyBNYXAoKVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXIgKGlkOiBzdHJpbmcsIHBsdWdpbjogSVBsdWdpbik6IHZvaWQge1xyXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignaWQgaXMgcmVxdWlyZWQhJylcclxuICAgIGlmICh0eXBlb2YgcGx1Z2luLmhhbmRsZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcigncGx1Z2luLmhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24hJylcclxuICAgIGlmICh0aGlzLmxpc3QuaGFzKGlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLm5hbWV9IGR1cGxpY2F0ZSBpZDogJHtpZH0hYClcclxuICAgIHRoaXMubGlzdC5zZXQoaWQsIHBsdWdpbilcclxuICAgIGlmIChMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW4pIHtcclxuICAgICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbikpIHtcclxuICAgICAgICB0aGlzLnBsdWdpbklkTWFwLmdldChMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW4pPy5wdXNoKGlkKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuc2V0KExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbiwgW2lkXSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlciAocGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMocGx1Z2luTmFtZSkpIHtcclxuICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luSWRNYXAuZ2V0KHBsdWdpbk5hbWUpXHJcbiAgICAgIHBsdWdpbkxpc3Q/LmZvckVhY2goKHBsdWdpbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5saXN0LmRlbGV0ZShwbHVnaW4pXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXROYW1lICgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubmFtZVxyXG4gIH1cclxuXHJcbiAgZ2V0IChpZDogc3RyaW5nKTogSVBsdWdpbiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5saXN0LmdldChpZClcclxuICB9XHJcblxyXG4gIGdldExpc3QgKCk6IElQbHVnaW5bXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMubGlzdC52YWx1ZXMoKV1cclxuICB9XHJcblxyXG4gIGdldElkTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3Qua2V5cygpXVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldEN1cnJlbnRQbHVnaW5OYW1lID0gKG5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogdm9pZCA9PiB7XHJcbiAgTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luID0gbmFtZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBsdWdpbk5hbWUgPSAoKTogc3RyaW5nIHwgbnVsbCA9PiB7XHJcbiAgcmV0dXJuIExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaWZlY3ljbGVQbHVnaW5zXHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1taXN1c2VkLXByb21pc2VzICovXHJcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInXHJcbmltcG9ydCBpbnF1aXJlciwgeyB0eXBlIElucXVpcmVyIH0gZnJvbSAnaW5xdWlyZXInXHJcbmltcG9ydCB7IHR5cGUgSVBsdWdpbiwgdHlwZSBJQ29tbWFuZGVyLCB0eXBlIElQaWNHbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgY29tbWFuZGVycyBmcm9tICcuLi9wbHVnaW5zL2NvbW1hbmRlcidcclxuaW1wb3J0IHsgZ2V0Q3VycmVudFBsdWdpbk5hbWUgfSBmcm9tICcuL0xpZmVjeWNsZVBsdWdpbnMnXHJcblxyXG5leHBvcnQgY2xhc3MgQ29tbWFuZGVyIGltcGxlbWVudHMgSUNvbW1hbmRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lID0gJ2NvbW1hbmRlcidcclxuICBzdGF0aWMgY3VycmVudFBsdWdpbjogc3RyaW5nIHwgbnVsbFxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdCA9IG5ldyBNYXA8c3RyaW5nLCBJUGx1Z2luPigpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuXHJcbiAgcHJvZ3JhbTogQ29tbWFuZFxyXG4gIGlucXVpcmVyOiBJbnF1aXJlclxyXG5cclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcclxuICAgIHRoaXMuaW5xdWlyZXIgPSBpbnF1aXJlclxyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICB9XHJcblxyXG4gIGdldE5hbWUgKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5uYW1lXHJcbiAgfVxyXG5cclxuICBpbml0ICgpOiB2b2lkIHtcclxuICAgIHRoaXMucHJvZ3JhbVxyXG4gICAgICAudmVyc2lvbihwcm9jZXNzLmVudi5QSUNHT19WRVJTSU9OLCAnLXYsIC0tdmVyc2lvbicpXHJcbiAgICAgIC5vcHRpb24oJy1kLCAtLWRlYnVnJywgJ2RlYnVnIG1vZGUnLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdHguc2V0Q29uZmlnKHtcclxuICAgICAgICAgIGRlYnVnOiB0cnVlXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgLm9wdGlvbignLXMsIC0tc2lsZW50JywgJ3NpbGVudCBtb2RlJywgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3R4LnNldENvbmZpZyh7XHJcbiAgICAgICAgICBzaWxlbnQ6IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgICAub24oJ2NvbW1hbmQ6KicsICgpID0+IHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoYEludmFsaWQgY29tbWFuZDogJHt0aGlzLnByb2dyYW0uYXJncy5qb2luKCcgJyl9XFxuU2VlIC0taGVscCBmb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBjb21tYW5kcy5gKVxyXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxyXG4gICAgICB9KVxyXG5cclxuICAgIC8vIGJ1aWx0LWluIGNvbW1hbmRzXHJcbiAgICBjb21tYW5kZXJzKHRoaXMuY3R4KVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXIgKGlkOiBzdHJpbmcsIHBsdWdpbjogSVBsdWdpbik6IHZvaWQge1xyXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignbmFtZSBpcyByZXF1aXJlZCEnKVxyXG4gICAgaWYgKHR5cGVvZiBwbHVnaW4uaGFuZGxlICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdwbHVnaW4uaGFuZGxlIG11c3QgYmUgYSBmdW5jdGlvbiEnKVxyXG4gICAgaWYgKHRoaXMubGlzdC5oYXMoaWQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3RoaXMubmFtZX0gcGx1Z2luIGR1cGxpY2F0ZSBpZDogJHtpZH0hYClcclxuICAgIHRoaXMubGlzdC5zZXQoaWQsIHBsdWdpbilcclxuICAgIGNvbnN0IGN1cnJlbnRQbHVnaW5OYW1lID0gZ2V0Q3VycmVudFBsdWdpbk5hbWUoKVxyXG4gICAgaWYgKGN1cnJlbnRQbHVnaW5OYW1lICE9PSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLnBsdWdpbklkTWFwLmhhcyhjdXJyZW50UGx1Z2luTmFtZSkpIHtcclxuICAgICAgICB0aGlzLnBsdWdpbklkTWFwLmdldChjdXJyZW50UGx1Z2luTmFtZSk/LnB1c2goaWQpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5JZE1hcC5zZXQoY3VycmVudFBsdWdpbk5hbWUsIFtpZF0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVucmVnaXN0ZXIgKHBsdWdpbk5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucGx1Z2luSWRNYXAuaGFzKHBsdWdpbk5hbWUpKSB7XHJcbiAgICAgIGNvbnN0IHBsdWdpbkxpc3QgPSB0aGlzLnBsdWdpbklkTWFwLmdldChwbHVnaW5OYW1lKVxyXG4gICAgICBwbHVnaW5MaXN0Py5mb3JFYWNoKChwbHVnaW46IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHRoaXMubGlzdC5kZWxldGUocGx1Z2luKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZENvbW1hbmRzICgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2V0TGlzdCgpLmZvckVhY2goKGl0ZW06IElQbHVnaW4pID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpdGVtLmhhbmRsZSh0aGlzLmN0eClcclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGUpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgKGlkOiBzdHJpbmcpOiBJUGx1Z2luIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmxpc3QuZ2V0KGlkKVxyXG4gIH1cclxuXHJcbiAgZ2V0TGlzdCAoKTogSVBsdWdpbltdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5saXN0LnZhbHVlcygpXVxyXG4gIH1cclxuXHJcbiAgZ2V0SWRMaXN0ICgpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMubGlzdC5rZXlzKCldXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDb21tYW5kZXJcclxuIiwiZXhwb3J0IGVudW0gSUxvZ1R5cGUge1xyXG4gIHN1Y2Nlc3MgPSAnc3VjY2VzcycsXHJcbiAgaW5mbyA9ICdpbmZvJyxcclxuICB3YXJuID0gJ3dhcm4nLFxyXG4gIGVycm9yID0gJ2Vycm9yJ1xyXG59XHJcblxyXG4vKipcclxuICogdGhlc2UgZXZlbnRzIHdpbGwgYmUgY2F0Y2hlZCBieSB1c2Vyc1xyXG4gKi9cclxuZXhwb3J0IGVudW0gSUJ1aWxkSW5FdmVudCB7XHJcbiAgVVBMT0FEX1BST0dSRVNTID0gJ3VwbG9hZFByb2dyZXNzJyxcclxuICBGQUlMRUQgPSAnZmFpbGVkJyxcclxuICBCRUZPUkVfVFJBTlNGT1JNID0gJ2JlZm9yZVRyYW5zZm9ybScsXHJcbiAgQkVGT1JFX1VQTE9BRCA9ICdiZWZvcmVVcGxvYWQnLFxyXG4gIEFGVEVSX1VQTE9BRCA9ICdhZnRlclVwbG9hZCcsXHJcbiAgRklOSVNIRUQgPSAnZmluaXNoZWQnLFxyXG4gIElOU1RBTEwgPSAnaW5zdGFsbCcsXHJcbiAgVU5JTlNUQUxMID0gJ3VuaW5zdGFsbCcsXHJcbiAgVVBEQVRFID0gJ3VwZGF0ZScsXHJcbiAgTk9USUZJQ0FUSU9OID0gJ25vdGlmaWNhdGlvbidcclxufVxyXG5cclxuLyoqXHJcbiAqIHRoZXNlIGV2ZW50cyB3aWxsIGJlIGNhdGNoZWQgb25seSBieSBwaWNnb1xyXG4gKi9cclxuZXhwb3J0IGVudW0gSUJ1c0V2ZW50IHtcclxuICBDT05GSUdfQ0hBTkdFID0gJ0NPTkZJR19DSEFOR0UnXHJcbn1cclxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHV0aWwgZnJvbSAndXRpbCdcclxuaW1wb3J0IHsgSUxvZ1R5cGUgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQge1xyXG4gIHR5cGUgSUxvZ0FyZ3ZUeXBlLFxyXG4gIHR5cGUgSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yLFxyXG4gIHR5cGUgVW5kZWZpbmFibGUsXHJcbiAgdHlwZSBJTG9nQ29sb3IsXHJcbiAgdHlwZSBJTG9nZ2VyLFxyXG4gIHR5cGUgSVBpY0dvXHJcbn0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IGZvcmNlTnVtYmVyLCBpc0RldiB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbidcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxldmVsID0ge1xyXG4gICAgW0lMb2dUeXBlLnN1Y2Nlc3NdOiAnZ3JlZW4nLFxyXG4gICAgW0lMb2dUeXBlLmluZm9dOiAnYmx1ZScsXHJcbiAgICBbSUxvZ1R5cGUud2Fybl06ICd5ZWxsb3cnLFxyXG4gICAgW0lMb2dUeXBlLmVycm9yXTogJ3JlZCdcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBwcml2YXRlIGxvZ0xldmVsITogc3RyaW5nIHwgc3RyaW5nW11cclxuICBwcml2YXRlIGxvZ1BhdGghOiBzdHJpbmdcclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUxvZyAodHlwZTogSUxvZ1R5cGUsIC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcclxuICAgIC8vIGNoZWNrIGNvbmZpZy5zaWxlbnRcclxuICAgIHRoaXMubG9nTGV2ZWwgPSB0aGlzLmN0eC5nZXRDb25maWcoJ3NldHRpbmdzLmxvZ0xldmVsJylcclxuICAgIGlmICghdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdzaWxlbnQnKSAmJiB0aGlzLmNoZWNrTG9nTGV2ZWwodHlwZSwgdGhpcy5sb2dMZXZlbCkpIHtcclxuICAgICAgY29uc3QgbG9nSGVhZGVyID0gY2hhbGtbdGhpcy5sZXZlbFt0eXBlXSBhcyBJTG9nQ29sb3JdKGBbUGljTGlzdCAke3R5cGUudG9VcHBlckNhc2UoKX1dOmApXHJcbiAgICAgIGNvbnNvbGUubG9nKGxvZ0hlYWRlciwgLi4ubXNnKVxyXG4gICAgICB0aGlzLmxvZ1BhdGggPSB0aGlzLmN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3NldHRpbmdzLmxvZ1BhdGgnKSB8fCBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgJy4vcGljbGlzdC5sb2cnKVxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyBmaXggbG9nIGZpbGUgaXMgdG9vIGxhcmdlLCBub3cgdGhlIGxvZyBmaWxlJ3MgZGVmYXVsdCBzaXplIGlzIDEwIE1CXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY2hlY2tMb2dGaWxlSXNMYXJnZSh0aGlzLmxvZ1BhdGgpXHJcbiAgICAgICAgICBpZiAocmVzdWx0LmlzTGFyZ2UpIHtcclxuICAgICAgICAgICAgY29uc3Qgd2FybmluZ01zZyA9IGBMb2cgZmlsZSBpcyB0b28gbGFyZ2UgKD4gJHsocmVzdWx0LmxvZ0ZpbGVTaXplTGltaXQhKSAvIDEwMjQgLyAxMDI0IHx8ICcxMCd9IE1CKSwgcmVjcmVhdGUgbG9nIGZpbGVgXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnW1BpY0xpc3QgV0FSTl06JyksIHdhcm5pbmdNc2cpXHJcbiAgICAgICAgICAgIHRoaXMucmVjcmVhdGVMb2dGaWxlKHRoaXMubG9nUGF0aClcclxuICAgICAgICAgICAgbXNnLnVuc2hpZnQod2FybmluZ01zZylcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaGFuZGxlV3JpdGVMb2codGhpcy5sb2dQYXRoLCB0eXBlLCAuLi5tc2cpXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gd2h5Pz8/XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbUGljTGlzdCBFcnJvcl0gb24gY2hlY2tpbmcgbG9nIGZpbGUgc2l6ZScsIGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAwKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0xvZ0ZpbGVJc0xhcmdlIChsb2dQYXRoOiBzdHJpbmcpOiB7XHJcbiAgICBpc0xhcmdlOiBib29sZWFuXHJcbiAgICBsb2dGaWxlU2l6ZT86IG51bWJlclxyXG4gICAgbG9nRmlsZVNpemVMaW1pdD86IG51bWJlclxyXG4gIH0ge1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9nUGF0aCkpIHtcclxuICAgICAgY29uc3QgbG9nRmlsZVNpemUgPSBmcy5zdGF0U3luYyhsb2dQYXRoKS5zaXplXHJcbiAgICAgIGNvbnN0IGxvZ0ZpbGVTaXplTGltaXQgPSBmb3JjZU51bWJlcih0aGlzLmN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8bnVtYmVyPj4oJ3NldHRpbmdzLmxvZ0ZpbGVTaXplTGltaXQnKSB8fCAxMCkgKiAxMDI0ICogMTAyNCAvLyAxMCBNQiBkZWZhdWx0XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaXNMYXJnZTogbG9nRmlsZVNpemUgPiBsb2dGaWxlU2l6ZUxpbWl0LFxyXG4gICAgICAgIGxvZ0ZpbGVTaXplLFxyXG4gICAgICAgIGxvZ0ZpbGVTaXplTGltaXRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaXNMYXJnZTogZmFsc2VcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVjcmVhdGVMb2dGaWxlIChsb2dQYXRoOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvZ1BhdGgpKSB7XHJcbiAgICAgIGZzLnVubGlua1N5bmMobG9nUGF0aClcclxuICAgICAgZnMuY3JlYXRlRmlsZVN5bmMobG9nUGF0aClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlV3JpdGVMb2cgKGxvZ1BhdGg6IHN0cmluZywgdHlwZTogc3RyaW5nLCAuLi5tc2c6IElMb2dBcmd2VHlwZVdpdGhFcnJvcltdKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgbG9nID0gYCR7ZGF5anMoKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKX0gW1BpY0xpc3QgJHt0eXBlLnRvVXBwZXJDYXNlKCl9XSBgXHJcbiAgICAgIG1zZy5mb3JFYWNoKChpdGVtOiBJTG9nQXJndlR5cGVXaXRoRXJyb3IpID0+IHtcclxuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEVycm9yICYmIHR5cGUgPT09ICdlcnJvcicpIHtcclxuICAgICAgICAgIGxvZyArPSBgXFxuLS0tLS0tRXJyb3IgU3RhY2sgQmVnaW4tLS0tLS1cXG4ke3V0aWwuZm9ybWF0KGl0ZW0/LnN0YWNrKX1cXG4tLS0tLS0tRXJyb3IgU3RhY2sgRW5kLS0tLS0tLSBgXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgaXRlbSA9IEpTT04uc3RyaW5naWZ5KGl0ZW0sIG51bGwsIDIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsb2cgKz0gYCR7aXRlbSBhcyBzdHJpbmd9IGBcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGxvZyArPSAnXFxuJ1xyXG4gICAgICAvLyBBIHN5bmNocm9uaXplZCBhcHByb2FjaCB0byBhdm9pZCBsb2cgbXNnIHNlcXVlbmNlIGVycm9yc1xyXG4gICAgICBmcy5hcHBlbmRGaWxlU3luYyhsb2dQYXRoLCBsb2cpXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tQaWNMaXN0IEVycm9yXSBvbiB3cml0aW5nIGxvZyBmaWxlJywgZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tMb2dMZXZlbCAodHlwZTogc3RyaW5nLCBsZXZlbDogdW5kZWZpbmVkIHwgc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcclxuICAgIGlmIChsZXZlbCA9PT0gdW5kZWZpbmVkIHx8IGxldmVsID09PSAnYWxsJykge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGV2ZWwpKSB7XHJcbiAgICAgIHJldHVybiBsZXZlbC5zb21lKChpdGVtOiBzdHJpbmcpID0+IChpdGVtID09PSB0eXBlIHx8IGl0ZW0gPT09ICdhbGwnKSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0eXBlID09PSBsZXZlbFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3VjY2VzcyAoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUuc3VjY2VzcywgLi4ubXNnKVxyXG4gIH1cclxuXHJcbiAgaW5mbyAoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUuaW5mbywgLi4ubXNnKVxyXG4gIH1cclxuXHJcbiAgZXJyb3IgKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yW10pOiB2b2lkIHtcclxuICAgIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLmVycm9yLCAuLi5tc2cpXHJcbiAgfVxyXG5cclxuICB3YXJuICguLi5tc2c6IElMb2dBcmd2VHlwZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS53YXJuLCAuLi5tc2cpXHJcbiAgfVxyXG5cclxuICBkZWJ1ZyAoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2KCkpIHtcclxuICAgICAgdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUuaW5mbywgLi4ubXNnKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTG9nZ2VyXHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvIH0gZnJvbSAnLi4vdHlwZXMnXHJcblxyXG4vKipcclxuICogY3JlYXRlIGFuIHVuaXF1ZSBjb250ZXh0IGZvciBlYWNoIHVwbG9hZCBwcm9jZXNzXHJcbiAqIEBwYXJhbSBjdHhcclxuICovXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVDb250ZXh0ID0gKGN0eDogSVBpY0dvKTogSVBpY0dvID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgY29uZmlnUGF0aDogY3R4LmNvbmZpZ1BhdGgsXHJcbiAgICBiYXNlRGlyOiBjdHguYmFzZURpcixcclxuICAgIGxvZzogY3R4LmxvZyxcclxuICAgIGNtZDogY3R4LmNtZCxcclxuICAgIG91dHB1dDogW10sXHJcbiAgICBpbnB1dDogW10sXHJcbiAgICByYXdJbnB1dDogW10sXHJcbiAgICBwbHVnaW5Mb2FkZXI6IGN0eC5wbHVnaW5Mb2FkZXIsXHJcbiAgICBwbHVnaW5IYW5kbGVyOiBjdHgucGx1Z2luSGFuZGxlcixcclxuICAgIFJlcXVlc3Q6IGN0eC5SZXF1ZXN0LFxyXG4gICAgaGVscGVyOiBjdHguaGVscGVyLFxyXG4gICAgVkVSU0lPTjogY3R4LlZFUlNJT04sXHJcbiAgICBHVUlfVkVSU0lPTjogY3R4LkdVSV9WRVJTSU9OLFxyXG4gICAgcmVxdWVzdDogY3R4LnJlcXVlc3QsXHJcbiAgICBpMThuOiBjdHguaTE4bixcclxuICAgIGdldENvbmZpZzogY3R4LmdldENvbmZpZy5iaW5kKGN0eCksXHJcbiAgICBzYXZlQ29uZmlnOiBjdHguc2F2ZUNvbmZpZy5iaW5kKGN0eCksXHJcbiAgICByZW1vdmVDb25maWc6IGN0eC5yZW1vdmVDb25maWcuYmluZChjdHgpLFxyXG4gICAgc2V0Q29uZmlnOiBjdHguc2V0Q29uZmlnLmJpbmQoY3R4KSxcclxuICAgIHVuc2V0Q29uZmlnOiBjdHgudW5zZXRDb25maWcuYmluZChjdHgpLFxyXG4gICAgdXBsb2FkOiBjdHgudXBsb2FkLmJpbmQoY3R4KSxcclxuICAgIGFkZExpc3RlbmVyOiBjdHguYWRkTGlzdGVuZXIuYmluZChjdHgpLFxyXG4gICAgb246IGN0eC5vbi5iaW5kKGN0eCksXHJcbiAgICBvbmNlOiBjdHgub25jZS5iaW5kKGN0eCksXHJcbiAgICByZW1vdmVMaXN0ZW5lcjogY3R4LnJlbW92ZUxpc3RlbmVyLmJpbmQoY3R4KSxcclxuICAgIG9mZjogY3R4Lm9mZi5iaW5kKGN0eCksXHJcbiAgICByZW1vdmVBbGxMaXN0ZW5lcnM6IGN0eC5yZW1vdmVBbGxMaXN0ZW5lcnMuYmluZChjdHgpLFxyXG4gICAgc2V0TWF4TGlzdGVuZXJzOiBjdHguc2V0TWF4TGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIGdldE1heExpc3RlbmVyczogY3R4LmdldE1heExpc3RlbmVycy5iaW5kKGN0eCksXHJcbiAgICBsaXN0ZW5lcnM6IGN0eC5saXN0ZW5lcnMuYmluZChjdHgpLFxyXG4gICAgcmF3TGlzdGVuZXJzOiBjdHgucmF3TGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIGVtaXQ6IGN0eC5lbWl0LmJpbmQoY3R4KSxcclxuICAgIGxpc3RlbmVyQ291bnQ6IGN0eC5saXN0ZW5lckNvdW50LmJpbmQoY3R4KSxcclxuICAgIHByZXBlbmRMaXN0ZW5lcjogY3R4LnByZXBlbmRMaXN0ZW5lci5iaW5kKGN0eCksXHJcbiAgICBwcmVwZW5kT25jZUxpc3RlbmVyOiBjdHgucHJlcGVuZE9uY2VMaXN0ZW5lci5iaW5kKGN0eCksXHJcbiAgICBldmVudE5hbWVzOiBjdHguZXZlbnROYW1lcy5iaW5kKGN0eClcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xyXG5pbXBvcnQgeyB0eXBlIElCdWlsZEluV2F0ZXJNYXJrT3B0aW9ucywgdHlwZSBJQnVpbGRJbkNvbXByZXNzT3B0aW9ucywgdHlwZSBJTGlmZWN5Y2xlUGx1Z2lucywgdHlwZSBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbywgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbiwgdHlwZSBVbmRlZmluYWJsZSwgdHlwZSBJSW1nSW5mbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBnZXRVUkxGaWxlLCBoYW5kbGVVcmxFbmNvZGUsIGltYWdlUHJvY2VzcywgaXNVcmwsIG5lZWRDb21wcmVzcywgbmVlZEFkZFdhdGVybWFyaywgaW1hZ2VBZGRXYXRlck1hcmssIHJlbW92ZUV4aWYsIHJlbmFtZUZpbGVOYW1lV2l0aEN1c3RvbVN0cmluZyB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbidcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuLi91dGlscy9jcmVhdGVDb250ZXh0J1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcydcclxuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoJ1xyXG5pbXBvcnQgaGVpY0NvbnZlcnQgZnJvbSAnaGVpYy1jb252ZXJ0J1xyXG5cclxuZXhwb3J0IGNsYXNzIExpZmVjeWNsZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdHRmTGluazogc3RyaW5nID0gJ2h0dHBzOi8vcmVsZWFzZS5waWNsaXN0LmNuL3NpbWhlaS50dGYnXHJcbiAgdHRmUGF0aDogc3RyaW5nXHJcblxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgc3VwZXIoKVxyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIGNvbnN0IHRlbXBGaWxlUGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgJ3BpY2xpc3RUZW1wJylcclxuICAgIGNvbnN0IGltZ0ZsZVBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICdpbWdUZW1wJylcclxuICAgIGZzLmVuc3VyZURpclN5bmMoaW1nRmxlUGF0aClcclxuICAgIGZzLmVtcHR5RGlyU3luYyh0ZW1wRmlsZVBhdGgpXHJcbiAgICB0aGlzLnR0ZlBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICdhc3NldHMnLCAnc2ltaGVpLnR0ZicpXHJcbiAgfVxyXG5cclxuICBhc3luYyBkb3dubG9hZFRURiAoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBvdXRwdXREaXIgPSBwYXRoLmRpcm5hbWUodGhpcy50dGZQYXRoKVxyXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dERpcikpIHtcclxuICAgICAgZnMubWtkaXJTeW5jKG91dHB1dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcclxuICAgIH1cclxuICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLnR0ZlBhdGgpKSB7XHJcbiAgICAgIHRoaXMuY3R4LmxvZy5pbmZvKCdEb3dubG9hZCB0dGYgZmlsZS4nKVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGF4aW9zLmdldCh0aGlzLnR0ZkxpbmssIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIH0pXHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLnR0ZlBhdGgsIHJlcy5kYXRhKVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5pbmZvKCdEb3dubG9hZCB0dGYgZmlsZSBzdWNjZXNzLicpXHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKCdEb3dubG9hZCB0dGYgZmlsZSBmYWlsZWQuJylcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHN0YXJ0IChpbnB1dDogYW55W10pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgLy8gZW5zdXJlIGV2ZXJ5IHVwbG9hZCBwcm9jZXNzIGhhcyBhbiB1bmlxdWUgY29udGV4dFxyXG4gICAgY29uc3QgY3R4ID0gY3JlYXRlQ29udGV4dCh0aGlzLmN0eClcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGltYWdlcyBpbnB1dFxyXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBtdXN0IGJlIGFuIGFycmF5LicpXHJcbiAgICAgIH1cclxuICAgICAgY3R4LmlucHV0ID0gaW5wdXRcclxuICAgICAgY3R4LnJhd0lucHV0UGF0aCA9IFtdIGFzIHN0cmluZ1tdXHJcbiAgICAgIGN0eC5yYXdJbnB1dCA9IGNsb25lRGVlcChpbnB1dClcclxuICAgICAgY3R4Lm91dHB1dCA9IFtdIGFzIElJbWdJbmZvW11cclxuICAgICAgY29uc3QgY29tcHJlc3NPcHRpb25zID0gY3R4LmdldENvbmZpZzxJQnVpbGRJbkNvbXByZXNzT3B0aW9ucz4oJ2J1aWxkSW4uY29tcHJlc3MnKVxyXG4gICAgICBjb25zdCB0eXBlID0gY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnVwbG9hZGVyJykgfHwgY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLmN1cnJlbnQnKSB8fCAnc21tcydcclxuICAgICAgY29uc3QgdXBsb2FkZXIgPSBjdHguaGVscGVyLnVwbG9hZGVyLmdldCh0eXBlKVxyXG4gICAgICBpZiAoIXVwbG9hZGVyICYmIGNvbXByZXNzT3B0aW9ucykge1xyXG4gICAgICAgIGNvbXByZXNzT3B0aW9ucy5waWNCZWQgPSAnc21tcydcclxuICAgICAgfSBlbHNlIGlmIChjb21wcmVzc09wdGlvbnMpIHtcclxuICAgICAgICBjb21wcmVzc09wdGlvbnMucGljQmVkID0gdHlwZVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHdhdGVybWFya09wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElCdWlsZEluV2F0ZXJNYXJrT3B0aW9ucz4oJ2J1aWxkSW4ud2F0ZXJtYXJrJylcclxuICAgICAgaWYgKGNvbXByZXNzT3B0aW9ucyB8fCB3YXRlcm1hcmtPcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcEZpbGVQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCAncGljbGlzdFRlbXAnKVxyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wRmlsZVBhdGgpKSB7XHJcbiAgICAgICAgICBmcy5ta2RpclN5bmModGVtcEZpbGVQYXRoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB3YXRlcm1hcmtNc2cgPSAnQWRkIHdhdGVybWFyayB0byBpbWFnZSdcclxuICAgICAgICBjb25zdCBjb21wcmVzc01zZyA9ICdDb21wcmVzcyBvciBjb252ZXJ0IGltYWdlJ1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjdHguaW5wdXQubWFwKGFzeW5jIChpdGVtOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGxldCBpbmZvOiBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mb1xyXG4gICAgICAgICAgaWYgKGlzVXJsKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIGN0eC5yYXdJbnB1dFBhdGghW2luZGV4XSA9IGl0ZW1cclxuICAgICAgICAgICAgaW5mbyA9IGF3YWl0IGdldFVSTEZpbGUoaXRlbSwgY3R4KVxyXG4gICAgICAgICAgICBpZiAoaW5mby5zdWNjZXNzICYmIGluZm8uYnVmZmVyKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybWVkQnVmZmVyXHJcbiAgICAgICAgICAgICAgbGV0IGlzU2tpcCA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgaWYgKG5lZWRBZGRXYXRlcm1hcmsod2F0ZXJtYXJrT3B0aW9ucywgaW5mby5leHRuYW1lID8/ICcnKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEod2F0ZXJtYXJrT3B0aW9ucz8ud2F0ZXJtYXJrRm9udFBhdGggfHwgd2F0ZXJtYXJrT3B0aW9ucz8ud2F0ZXJtYXJrVHlwZSA9PT0gJ2ltYWdlJykpIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgZG93bmxvYWRUVEZSZXQgPSBhd2FpdCB0aGlzLmRvd25sb2FkVFRGKClcclxuICAgICAgICAgICAgICAgICAgaWYgKCFkb3dubG9hZFRURlJldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LmxvZy53YXJuKCdEb3dubG9hZCB0dGYgZmlsZSBmYWlsZWQsIHNraXAgYWRkIHdhdGVybWFyay4nKVxyXG4gICAgICAgICAgICAgICAgICAgIGlzU2tpcCA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFpc1NraXApIHtcclxuICAgICAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKHdhdGVybWFya01zZylcclxuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRCdWZmZXIgPSBhd2FpdCBpbWFnZUFkZFdhdGVyTWFyayhpbmZvLmJ1ZmZlciwgd2F0ZXJtYXJrT3B0aW9ucywgdGhpcy50dGZQYXRoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAobmVlZENvbXByZXNzKGNvbXByZXNzT3B0aW9ucywgaW5mby5leHRuYW1lID8/ICcnKSkge1xyXG4gICAgICAgICAgICAgICAgY3R4LmxvZy5pbmZvKGNvbXByZXNzTXNnKVxyXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRCdWZmZXIgPSBhd2FpdCBpbWFnZVByb2Nlc3ModHJhbnNmb3JtZWRCdWZmZXIgPz8gaW5mby5idWZmZXIsIGNvbXByZXNzT3B0aW9ucywgaW5mby5leHRuYW1lID8/ICcnKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoIXRyYW5zZm9ybWVkQnVmZmVyICYmIGNvbXByZXNzT3B0aW9ucz8uaXNSZW1vdmVFeGlmKSB7XHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLmluZm8oJ1JlbW92ZSBleGlmIGluZm8uJylcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQnVmZmVyID0gYXdhaXQgcmVtb3ZlRXhpZihpbmZvLmJ1ZmZlciwgaW5mby5leHRuYW1lID8/ICcnKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtZWRCdWZmZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBuZXdFeHRcclxuICAgICAgICAgICAgICAgIGlmIChjb21wcmVzc09wdGlvbnM/LmlzQ29udmVydCkge1xyXG4gICAgICAgICAgICAgICAgICBuZXdFeHQgPSBjb21wcmVzc09wdGlvbnM/LmNvbnZlcnRGb3JtYXQgPz8gJ2pwZydcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIG5ld0V4dCA9IGluZm8uZXh0bmFtZSA/PyAnJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbmV3RXh0ID0gbmV3RXh0LnN0YXJ0c1dpdGgoJy4nKSA/IG5ld0V4dCA6IGAuJHtuZXdFeHR9YFxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcEZpbGUgPSBwYXRoLmpvaW4odGVtcEZpbGVQYXRoLCBgJHtpbmZvLmZpbGVOYW1lXHJcbiAgICAgICAgICAgICAgICAgID8gYCR7cGF0aC5iYXNlbmFtZShpbmZvLmZpbGVOYW1lLCBwYXRoLmV4dG5hbWUoaW5mby5maWxlTmFtZSkpfSR7bmV3RXh0fWBcclxuICAgICAgICAgICAgICAgICAgOiBuZXcgRGF0ZSgpLmdldFRpbWUoKX0ke25ld0V4dH1gKVxyXG4gICAgICAgICAgICAgICAgY3R4LnJhd0lucHV0UGF0aCFbaW5kZXhdID0gcGF0aC5qb2luKHBhdGguZGlybmFtZShpdGVtKSwgcGF0aC5iYXNlbmFtZSh0ZW1wRmlsZSkpXHJcbiAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBGaWxlLCB0cmFuc2Zvcm1lZEJ1ZmZlcilcclxuICAgICAgICAgICAgICAgIGN0eC5pbnB1dFtpbmRleF0gPSB0ZW1wRmlsZVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW5mby5yZWFzb24pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB0cmFuc2Zvcm1lZEJ1ZmZlclxyXG4gICAgICAgICAgICBjdHgucmF3SW5wdXRQYXRoIVtpbmRleF0gPSBpdGVtXHJcbiAgICAgICAgICAgIGlmIChuZWVkQWRkV2F0ZXJtYXJrKHdhdGVybWFya09wdGlvbnMsIHBhdGguZXh0bmFtZShpdGVtKSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCBkb3dubG9hZFRURlJldCA9IGF3YWl0IHRoaXMuZG93bmxvYWRUVEYoKVxyXG4gICAgICAgICAgICAgIGlmICghZG93bmxvYWRUVEZSZXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3R4LmxvZy53YXJuKCdEb3dubG9hZCB0dGYgZmlsZSBmYWlsZWQsIHNraXAgYWRkIHdhdGVybWFyay4nKVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLmluZm8od2F0ZXJtYXJrTXNnKVxyXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRCdWZmZXIgPSBhd2FpdCBpbWFnZUFkZFdhdGVyTWFyayhmcy5yZWFkRmlsZVN5bmMoaXRlbSksIHdhdGVybWFya09wdGlvbnMsIHRoaXMudHRmUGF0aClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG5lZWRDb21wcmVzcyhjb21wcmVzc09wdGlvbnMsIHBhdGguZXh0bmFtZShpdGVtKSkpIHtcclxuICAgICAgICAgICAgICBjdHgubG9nLmluZm8oY29tcHJlc3NNc2cpXHJcbiAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShpdGVtKSA9PT0gJy5oZWljJyB8fCBwYXRoLmV4dG5hbWUoaXRlbSkgPT09ICcuaGVpZicpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWNCdWZmZXIgPSBmcy5yZWFkRmlsZVN5bmMoaXRlbSlcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWNSZXN1bHQgPSBhd2FpdCBoZWljQ29udmVydCh7XHJcbiAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogaGVpY0J1ZmZlcixcclxuICAgICAgICAgICAgICAgICAgZm9ybWF0OiAnSlBFRycsXHJcbiAgICAgICAgICAgICAgICAgIHF1YWxpdHk6IDFcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wSGVpY0NvbnZlcnRGaWxlID0gcGF0aC5qb2luKHRlbXBGaWxlUGF0aCwgYCR7cGF0aC5iYXNlbmFtZShpdGVtLCBwYXRoLmV4dG5hbWUoaXRlbSkpfS5qcGdgKVxyXG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0ZW1wSGVpY0NvbnZlcnRGaWxlLCBCdWZmZXIuZnJvbShoZWljUmVzdWx0KSlcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQnVmZmVyID0gYXdhaXQgaW1hZ2VQcm9jZXNzKGZzLnJlYWRGaWxlU3luYyh0ZW1wSGVpY0NvbnZlcnRGaWxlKSwgY29tcHJlc3NPcHRpb25zLCAnLmpwZycpXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQnVmZmVyID0gYXdhaXQgaW1hZ2VQcm9jZXNzKHRyYW5zZm9ybWVkQnVmZmVyID8/IGZzLnJlYWRGaWxlU3luYyhpdGVtKSwgY29tcHJlc3NPcHRpb25zLCBwYXRoLmV4dG5hbWUoaXRlbSkpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghdHJhbnNmb3JtZWRCdWZmZXIgJiYgY29tcHJlc3NPcHRpb25zPy5pc1JlbW92ZUV4aWYpIHtcclxuICAgICAgICAgICAgICBjdHgubG9nLmluZm8oJ1JlbW92ZSBleGlmIGluZm8uJylcclxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lZEJ1ZmZlciA9IGF3YWl0IHJlbW92ZUV4aWYoZnMucmVhZEZpbGVTeW5jKGl0ZW0pLCBwYXRoLmV4dG5hbWUoaXRlbSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVkQnVmZmVyKSB7XHJcbiAgICAgICAgICAgICAgbGV0IG5ld0V4dFxyXG4gICAgICAgICAgICAgIGlmIChjb21wcmVzc09wdGlvbnM/LmlzQ29udmVydCkge1xyXG4gICAgICAgICAgICAgICAgbmV3RXh0ID0gY29tcHJlc3NPcHRpb25zPy5jb252ZXJ0Rm9ybWF0ID8/ICdqcGcnXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5ld0V4dCA9IHBhdGguZXh0bmFtZShpdGVtKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBuZXdFeHQgPSBuZXdFeHQuc3RhcnRzV2l0aCgnLicpID8gbmV3RXh0IDogYC4ke25ld0V4dH1gXHJcbiAgICAgICAgICAgICAgY29uc3QgdGVtcEZpbGUgPSBwYXRoLmpvaW4odGVtcEZpbGVQYXRoLCBgJHtwYXRoLmJhc2VuYW1lKGl0ZW0sIHBhdGguZXh0bmFtZShpdGVtKSl9JHtuZXdFeHR9YClcclxuICAgICAgICAgICAgICBjdHgucmF3SW5wdXRQYXRoIVtpbmRleF0gPSBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKGl0ZW0pLCBgJHtwYXRoLmJhc2VuYW1lKGl0ZW0sIHBhdGguZXh0bmFtZShpdGVtKSl9JHtuZXdFeHR9YClcclxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBGaWxlLCB0cmFuc2Zvcm1lZEJ1ZmZlcilcclxuICAgICAgICAgICAgICBjdHguaW5wdXRbaW5kZXhdID0gdGVtcEZpbGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjdHguaW5wdXQpIHtcclxuICAgICAgICAgIGN0eC5yYXdJbnB1dFBhdGgucHVzaChpdGVtKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBsaWZlY3ljbGUgbWFpblxyXG4gICAgICBhd2FpdCB0aGlzLmJlZm9yZVRyYW5zZm9ybShjdHgpXHJcbiAgICAgIGF3YWl0IHRoaXMuZG9UcmFuc2Zvcm0oY3R4KVxyXG4gICAgICBjb25zdCByZW5hbWVDb25maWcgPSBjdHguZ2V0Q29uZmlnPGFueT4oJ2J1aWxkSW4ucmVuYW1lJykgfHwge31cclxuICAgICAgaWYgKHJlbmFtZUNvbmZpZy5lbmFibGUpIHtcclxuICAgICAgICBjb25zdCBmb3JtYXQgPSByZW5hbWVDb25maWcuZm9ybWF0IHx8ICd7ZmlsZW5hbWV9J1xyXG4gICAgICAgIGN0eC5vdXRwdXQgPSBjdHgub3V0cHV0Lm1hcCgoaXRlbTogSUltZ0luZm8sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGxldCBmaWxlTmFtZSA9IGl0ZW0uZmlsZU5hbWVcclxuICAgICAgICAgIGlmIChmb3JtYXQpIHtcclxuICAgICAgICAgICAgZmlsZU5hbWUgPSByZW5hbWVGaWxlTmFtZVdpdGhDdXN0b21TdHJpbmcoY3R4LnJhd0lucHV0UGF0aCFbaW5kZXhdLCBmb3JtYXQpXHJcbiAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgvXFwvKy9nLCAnLycpXHJcbiAgICAgICAgICAgIGlmIChmaWxlTmFtZS5zbGljZSgtMSkgPT09ICcvJykge1xyXG4gICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUgKyBpbmRleC50b1N0cmluZygpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGl0ZW0uZmlsZU5hbWUgPSBmaWxlTmFtZVxyXG4gICAgICAgICAgcmV0dXJuIGl0ZW1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IHRoaXMuYmVmb3JlVXBsb2FkKGN0eClcclxuICAgICAgYXdhaXQgdGhpcy5kb1VwbG9hZChjdHgpXHJcbiAgICAgIGN0eC5pbnB1dCA9IGN0eC5yYXdJbnB1dFxyXG4gICAgICBhd2FpdCB0aGlzLmFmdGVyVXBsb2FkKGN0eClcclxuICAgICAgcmV0dXJuIGN0eFxyXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgIGN0eC5sb2cud2FybihJQnVpbGRJbkV2ZW50LkZBSUxFRClcclxuICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIC0xKVxyXG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LkZBSUxFRCwgZSlcclxuICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICBpZiAoY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PignZGVidWcnKSkge1xyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY3R4XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGJlZm9yZVRyYW5zZm9ybSAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIDApXHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LkJFRk9SRV9UUkFOU0ZPUk0sIGN0eClcclxuICAgIGN0eC5sb2cuaW5mbygnQmVmb3JlIHRyYW5zZm9ybScpXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVBsdWdpbnMoY3R4LmhlbHBlci5iZWZvcmVUcmFuc2Zvcm1QbHVnaW5zLCBjdHgpXHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRvVHJhbnNmb3JtIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgMzApXHJcbiAgICBjb25zdCB0eXBlID0gY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnRyYW5zZm9ybWVyJykgfHwgJ3BhdGgnXHJcbiAgICBsZXQgY3VycmVudFRyYW5zZm9ybWVyID0gdHlwZVxyXG4gICAgbGV0IHRyYW5zZm9ybWVyID0gY3R4LmhlbHBlci50cmFuc2Zvcm1lci5nZXQodHlwZSlcclxuICAgIGlmICghdHJhbnNmb3JtZXIpIHtcclxuICAgICAgdHJhbnNmb3JtZXIgPSBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldCgncGF0aCcpXHJcbiAgICAgIGN1cnJlbnRUcmFuc2Zvcm1lciA9ICdwYXRoJ1xyXG4gICAgICBjdHgubG9nLndhcm4oYENhbid0IGZpbmQgdHJhbnNmb3JtZXIgLSAke3R5cGV9LCBzd2l0Y2ggdG8gZGVmYXVsdCB0cmFuc2Zvcm1lciAtIHBhdGhgKVxyXG4gICAgfVxyXG4gICAgY3R4LmxvZy5pbmZvKGBUcmFuc2Zvcm1pbmcuLi4gQ3VycmVudCB0cmFuc2Zvcm1lciBpcyBbJHtjdXJyZW50VHJhbnNmb3JtZXJ9XWApXHJcbiAgICBhd2FpdCB0cmFuc2Zvcm1lcj8uaGFuZGxlKGN0eClcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYmVmb3JlVXBsb2FkIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgNjApXHJcbiAgICBjdHgubG9nLmluZm8oJ0JlZm9yZSB1cGxvYWQnKVxyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5CRUZPUkVfVVBMT0FELCBjdHgpXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVBsdWdpbnMoY3R4LmhlbHBlci5iZWZvcmVVcGxvYWRQbHVnaW5zLCBjdHgpXHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRvVXBsb2FkIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBsZXQgdHlwZSA9IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC51cGxvYWRlcicpIHx8IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC5jdXJyZW50JykgfHwgJ3NtbXMnXHJcbiAgICBsZXQgdXBsb2FkZXIgPSBjdHguaGVscGVyLnVwbG9hZGVyLmdldCh0eXBlKVxyXG4gICAgbGV0IGN1cnJlbnRUcmFuc2Zvcm1lciA9IHR5cGVcclxuICAgIGlmICghdXBsb2FkZXIpIHtcclxuICAgICAgdHlwZSA9ICdzbW1zJ1xyXG4gICAgICBjdXJyZW50VHJhbnNmb3JtZXIgPSAnc21tcydcclxuICAgICAgdXBsb2FkZXIgPSBjdHguaGVscGVyLnVwbG9hZGVyLmdldCgnc21tcycpXHJcbiAgICAgIGN0eC5sb2cud2FybihgQ2FuJ3QgZmluZCB1cGxvYWRlciAtICR7dHlwZX0sIHN3aXRjaCB0byBkZWZhdWx0IHVwbG9hZGVyIC0gc21tc2ApXHJcbiAgICB9XHJcbiAgICBjdHgubG9nLmluZm8oYFVwbG9hZGluZy4uLiBDdXJyZW50IHVwbG9hZGVyIGlzIFske2N1cnJlbnRUcmFuc2Zvcm1lcn1dYClcclxuICAgIGF3YWl0IHVwbG9hZGVyPy5oYW5kbGUoY3R4KVxyXG4gICAgZm9yIChjb25zdCBvdXRwdXRJbWcgb2YgY3R4Lm91dHB1dCkge1xyXG4gICAgICBvdXRwdXRJbWcudHlwZSA9IHR5cGVcclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYWZ0ZXJVcGxvYWQgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuQUZURVJfVVBMT0FELCBjdHgpXHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgMTAwKVxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVQbHVnaW5zKGN0eC5oZWxwZXIuYWZ0ZXJVcGxvYWRQbHVnaW5zLCBjdHgpXHJcbiAgICBsZXQgbXNnID0gJydcclxuICAgIGNvbnN0IGxlbmd0aCA9IGN0eC5vdXRwdXQubGVuZ3RoXHJcbiAgICBjb25zdCBpc0VuY29kZU91dHB1dFVSTCA9IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8Ym9vbGVhbj4+KCdzZXR0aW5ncy5lbmNvZGVPdXRwdXRVUkwnKSA9PT0gdHJ1ZVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodHlwZW9mIGN0eC5vdXRwdXRbaV0uaW1nVXJsICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIG1zZyArPSBpc0VuY29kZU91dHB1dFVSTCA/IGhhbmRsZVVybEVuY29kZShjdHgub3V0cHV0W2ldLmltZ1VybCEpIDogY3R4Lm91dHB1dFtpXS5pbWdVcmwhXHJcbiAgICAgICAgaWYgKGkgIT09IGxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgIG1zZyArPSAnXFxuJ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBkZWxldGUgY3R4Lm91dHB1dFtpXS5iYXNlNjRJbWFnZVxyXG4gICAgICBkZWxldGUgY3R4Lm91dHB1dFtpXS5idWZmZXJcclxuICAgIH1cclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuRklOSVNIRUQsIGN0eClcclxuICAgIGN0eC5sb2cuc3VjY2VzcyhgXFxuJHttc2d9YClcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUGx1Z2lucyAobGlmZUN5Y2xlUGx1Z2luczogSUxpZmVjeWNsZVBsdWdpbnMsIGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBsaWZlQ3ljbGVQbHVnaW5zLmdldExpc3QoKVxyXG4gICAgY29uc3QgcGx1Z2luTmFtZXMgPSBsaWZlQ3ljbGVQbHVnaW5zLmdldElkTGlzdCgpXHJcbiAgICBjb25zdCBsaWZlQ3ljbGVOYW1lID0gbGlmZUN5Y2xlUGx1Z2lucy5nZXROYW1lKClcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHBsdWdpbnMubWFwKGFzeW5jIChwbHVnaW46IElQbHVnaW4sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjdHgubG9nLmluZm8oYCR7bGlmZUN5Y2xlTmFtZX06ICR7cGx1Z2luTmFtZXNbaW5kZXhdfSBydW5uaW5nYClcclxuICAgICAgICBhd2FpdCBwbHVnaW4uaGFuZGxlKGN0eClcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGN0eC5sb2cuZXJyb3IoYCR7bGlmZUN5Y2xlTmFtZX06ICR7cGx1Z2luTmFtZXNbaW5kZXhdfSBlcnJvcmApXHJcbiAgICAgICAgdGhyb3cgZVxyXG4gICAgICB9XHJcbiAgICB9KSlcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExpZmVjeWNsZVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGx1Z2luQ29uZmlnLCB0eXBlIElTbW1zQ29uZmlnLCB0eXBlIElPbGRSZXFPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKGZpbGVOYW1lOiBzdHJpbmcsIGltYWdlOiBCdWZmZXIsIGFwaVRva2VuOiBzdHJpbmcsIGJhY2t1cERvbWFpbiA9ICcnKTogSU9sZFJlcU9wdGlvbnMgPT4ge1xyXG4gIGNvbnN0IGRvbWFpbiA9IGJhY2t1cERvbWFpbiB8fCAnc20ubXMnXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgdXJsOiBgaHR0cHM6Ly8ke2RvbWFpbn0vYXBpL3YyL3VwbG9hZGAsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIGNvbnRlbnRUeXBlOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXHJcbiAgICAgICdVc2VyLUFnZW50JzogJ1BpY0xpc3QnLFxyXG4gICAgICBBdXRob3JpemF0aW9uOiBhcGlUb2tlblxyXG4gICAgfSxcclxuICAgIGZvcm1EYXRhOiB7XHJcbiAgICAgIHNtZmlsZToge1xyXG4gICAgICAgIHZhbHVlOiBpbWFnZSxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICBmaWxlbmFtZTogZmlsZU5hbWVcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHNzbDogJ3RydWUnXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHNtbXNDb25maWcgPSBjdHguZ2V0Q29uZmlnPElTbW1zQ29uZmlnPigncGljQmVkLnNtbXMnKVxyXG4gIGlmICghc21tc0NvbmZpZykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGZpbmQgc21tcyBjb25maWchJylcclxuICB9XHJcbiAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCAnYmFzZTY0JylcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwb3N0Q29uZmlnID0gcG9zdE9wdGlvbnMoaW1nLmZpbGVOYW1lLCBpbWFnZSwgc21tc0NvbmZpZz8udG9rZW4sIHNtbXNDb25maWc/LmJhY2t1cERvbWFpbilcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXM6IHN0cmluZyA9IGF3YWl0IGN0eC5yZXF1ZXN0KHBvc3RDb25maWcpXHJcbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UocmVzKVxyXG4gICAgICAgIGlmIChib2R5LmNvZGUgPT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBib2R5LmRhdGEudXJsXHJcbiAgICAgICAgICBpbWcuaGFzaCA9IGJvZHkuZGF0YS5oYXNoXHJcbiAgICAgICAgfSBlbHNlIGlmIChib2R5LmNvZGUgPT09ICdpbWFnZV9yZXBlYXRlZCcgJiYgdHlwZW9mIGJvZHkuaW1hZ2VzID09PSAnc3RyaW5nJykgeyAvLyBkbyBleHRyYSBjaGVjayBzaW5jZSB0aGlzIGVycm9yIHJldHVybiBpcyBub3QgZG9jdW1lbnRlZCBhdCBodHRwczovL2RvYy5zbS5tcy8jYXBpLUltYWdlLVVwbG9hZFxyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBib2R5LmltYWdlc1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICBib2R5OiBib2R5Lm1lc3NhZ2VcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gY3R4XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVNtbXNDb25maWc+KCdwaWNCZWQuc21tcycpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd0b2tlbicsXHJcbiAgICAgIG1lc3NhZ2U6ICdhcGkgdG9rZW4nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVNfVE9LRU4nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnRva2VuIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2JhY2t1cERvbWFpbicsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTicpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOJylcclxuICAgICAgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU4nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJhY2t1cERvbWFpbiB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3Rlcignc21tcycsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TTU1TJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcbmltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSVRjeXVuQ29uZmlnLCB0eXBlIElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgdHlwZSBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG4vLyBnZW5lcmF0ZSBDT1Mgc2lnbmF0dXJlIHN0cmluZ1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2lnbmF0dXJlIHtcclxuICBzaWduYXR1cmU6IHN0cmluZ1xyXG4gIGFwcElkOiBzdHJpbmdcclxuICBidWNrZXQ6IHN0cmluZ1xyXG4gIHNpZ25UaW1lOiBzdHJpbmdcclxufVxyXG5cclxuY29uc3QgZ2VuZXJhdGVTaWduYXR1cmUgPSAob3B0aW9uczogSVRjeXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nKTogSVNpZ25hdHVyZSA9PiB7XHJcbiAgY29uc3Qgc2VjcmV0SWQgPSBvcHRpb25zLnNlY3JldElkXHJcbiAgY29uc3Qgc2VjcmV0S2V5ID0gb3B0aW9ucy5zZWNyZXRLZXlcclxuICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWRcclxuICBjb25zdCBidWNrZXQgPSBvcHRpb25zLmJ1Y2tldFxyXG4gIGxldCBzaWduYXR1cmVcclxuICBsZXQgc2lnblRpbWU6IHN0cmluZyA9ICcnXHJcbiAgaWYgKCFvcHRpb25zLnZlcnNpb24gfHwgb3B0aW9ucy52ZXJzaW9uID09PSAndjQnKSB7XHJcbiAgICBjb25zdCByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDAwMClcclxuICAgIGNvbnN0IGN1cnJlbnQgPSBNYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCkgLSAxXHJcbiAgICBjb25zdCBleHBpcmVkID0gY3VycmVudCArIDM2MDBcclxuXHJcbiAgICBjb25zdCBtdWx0aVNpZ25hdHVyZSA9IGBhPSR7YXBwSWR9JmI9JHtidWNrZXR9Jms9JHtzZWNyZXRJZH0mZT0ke2V4cGlyZWR9JnQ9JHtjdXJyZW50fSZyPSR7cmFuZG9tfSZmPWBcclxuXHJcbiAgICBjb25zdCBzaWduSGV4S2V5ID0gY3J5cHRvLmNyZWF0ZUhtYWMoJ3NoYTEnLCBzZWNyZXRLZXkpLnVwZGF0ZShtdWx0aVNpZ25hdHVyZSkuZGlnZXN0KClcclxuICAgIGNvbnN0IHRlbXBTdHJpbmcgPSBCdWZmZXIuY29uY2F0KFtzaWduSGV4S2V5LCBCdWZmZXIuZnJvbShtdWx0aVNpZ25hdHVyZSldKVxyXG4gICAgc2lnbmF0dXJlID0gQnVmZmVyLmZyb20odGVtcFN0cmluZykudG9TdHJpbmcoJ2Jhc2U2NCcpXHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIGh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzc3OCNzaWduYXR1cmVcclxuICAgIGNvbnN0IHRvZGF5ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApXHJcbiAgICBjb25zdCB0b21vcnJvdyA9IHRvZGF5ICsgODY0MDBcclxuICAgIHNpZ25UaW1lID0gYCR7dG9kYXl9OyR7dG9tb3Jyb3d9YFxyXG4gICAgY29uc3Qgc2lnbktleSA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgc2VjcmV0S2V5KS51cGRhdGUoc2lnblRpbWUpLmRpZ2VzdCgnaGV4JylcclxuICAgIGNvbnN0IGVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludCA/IG9wdGlvbnMuZW5kcG9pbnQgOiBgY29zLiR7b3B0aW9ucy5hcmVhfS5teXFjbG91ZC5jb21gXHJcbiAgICBjb25zdCBodHRwU3RyaW5nID0gYHB1dFxcbi8ke29wdGlvbnMucGF0aH0ke2ZpbGVOYW1lfVxcblxcbmhvc3Q9JHtvcHRpb25zLmJ1Y2tldH0uJHtlbmRwb2ludH1cXG5gXHJcbiAgICBjb25zdCBzaGExZWRIdHRwU3RyaW5nID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUoaHR0cFN0cmluZykuZGlnZXN0KCdoZXgnKVxyXG4gICAgY29uc3Qgc3RyaW5nVG9TaWduID0gYHNoYTFcXG4ke3NpZ25UaW1lfVxcbiR7c2hhMWVkSHR0cFN0cmluZ31cXG5gXHJcbiAgICBzaWduYXR1cmUgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIHNpZ25LZXkpLnVwZGF0ZShzdHJpbmdUb1NpZ24pLmRpZ2VzdCgnaGV4JylcclxuICB9XHJcbiAgcmV0dXJuIHtcclxuICAgIHNpZ25hdHVyZSxcclxuICAgIGFwcElkLFxyXG4gICAgYnVja2V0LFxyXG4gICAgc2lnblRpbWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElUY3l1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgc2lnbmF0dXJlOiBJU2lnbmF0dXJlLCBpbWFnZTogQnVmZmVyLCB2ZXJzaW9uOiBzdHJpbmcpOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xyXG4gIGNvbnN0IGFyZWEgPSBvcHRpb25zLmFyZWFcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoXHJcbiAgaWYgKCFvcHRpb25zLnZlcnNpb24gfHwgb3B0aW9ucy52ZXJzaW9uID09PSAndjQnKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgdXJsOiBgaHR0cDovLyR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb20vZmlsZXMvdjIvJHtzaWduYXR1cmUuYXBwSWR9LyR7c2lnbmF0dXJlLmJ1Y2tldH0vJHtlbmNvZGVVUkkocGF0aCl9JHtmaWxlTmFtZX1gLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgSG9zdDogYCR7YXJlYX0uZmlsZS5teXFjbG91ZC5jb21gLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IHNpZ25hdHVyZS5zaWduYXR1cmUsXHJcbiAgICAgICAgY29udGVudFR5cGU6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcclxuICAgICAgICAnVXNlci1BZ2VudCc6IGBQaWNHbzske3ZlcnNpb259O251bGw7bnVsbGBcclxuICAgICAgfSxcclxuICAgICAgZm9ybURhdGE6IHtcclxuICAgICAgICBvcDogJ3VwbG9hZCcsXHJcbiAgICAgICAgZmlsZWNvbnRlbnQ6IGltYWdlXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludCA/IG9wdGlvbnMuZW5kcG9pbnQgOiBgY29zLiR7b3B0aW9ucy5hcmVhfS5teXFjbG91ZC5jb21gXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICB1cmw6IGBodHRwOi8vJHtvcHRpb25zLmJ1Y2tldH0uJHtlbmRwb2ludH0vJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpfWAsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBIb3N0OiBgJHtvcHRpb25zLmJ1Y2tldH0uJHtlbmRwb2ludH1gLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBxLXNpZ24tYWxnb3JpdGhtPXNoYTEmcS1haz0ke29wdGlvbnMuc2VjcmV0SWR9JnEtc2lnbi10aW1lPSR7c2lnbmF0dXJlLnNpZ25UaW1lfSZxLWtleS10aW1lPSR7c2lnbmF0dXJlLnNpZ25UaW1lfSZxLWhlYWRlci1saXN0PWhvc3QmcS11cmwtcGFyYW0tbGlzdD0mcS1zaWduYXR1cmU9JHtzaWduYXR1cmUuc2lnbmF0dXJlfWAsXHJcbiAgICAgICAgY29udGVudFR5cGU6IG1pbWUubG9va3VwKGZpbGVOYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyxcclxuICAgICAgICAnVXNlci1BZ2VudCc6IGBQaWNHbzske3ZlcnNpb259O251bGw7bnVsbGBcclxuICAgICAgfSxcclxuICAgICAgYm9keTogaW1hZ2UsXHJcbiAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbyB8IGJvb2xlYW4+ID0+IHtcclxuICBjb25zdCB0Y1l1bk9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElUY3l1bkNvbmZpZz4oJ3BpY0JlZC50Y3l1bicpXHJcbiAgaWYgKCF0Y1l1bk9wdGlvbnMpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIHRlbmNlbnQgQ09TIGNvbmZpZycpXHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgY29uc3QgY3VzdG9tVXJsID0gdGNZdW5PcHRpb25zLmN1c3RvbVVybFxyXG4gICAgY29uc3QgcGF0aCA9IHRjWXVuT3B0aW9ucy5wYXRoID8/ICcnXHJcbiAgICBjb25zdCB1c2VWNCA9ICF0Y1l1bk9wdGlvbnMudmVyc2lvbiB8fCB0Y1l1bk9wdGlvbnMudmVyc2lvbiA9PT0gJ3Y0J1xyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBnZW5lcmF0ZVNpZ25hdHVyZSh0Y1l1bk9wdGlvbnMsIGltZy5maWxlTmFtZSlcclxuICAgICAgICBpZiAoIXNpZ25hdHVyZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0gcG9zdE9wdGlvbnModGNZdW5PcHRpb25zLCBpbWcuZmlsZU5hbWUsIHNpZ25hdHVyZSwgaW1hZ2UsIGN0eC5HVUlfVkVSU0lPTiB8fCBjdHguVkVSU0lPTilcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgICAgLnRoZW4oKHJlczogYW55KSA9PiByZXMpXHJcbiAgICAgICAgICAuY2F0Y2goKGVycjogRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiA0MDAsXHJcbiAgICAgICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICAgICAgbXNnOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdBVVRIX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICAgICAgZXJyXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIGxldCBib2R5XHJcbiAgICAgICAgaWYgKHVzZVY0ICYmIHR5cGVvZiByZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShyZXMpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJvZHkgPSByZXNcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJvZHkuc3RhdHVzQ29kZSA9PT0gNDAwKSB7XHJcbiAgICAgICAgICBpZiAoYm9keT8uYm9keT8uZXJyKSB7XHJcbiAgICAgICAgICAgIHRocm93IGJvZHkuYm9keS5lcnJcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihib2R5Py5ib2R5Py5tc2cgfHwgYm9keT8uYm9keT8ubWVzc2FnZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uVXJsID0gdGNZdW5PcHRpb25zLm9wdGlvbnMgfHwgJydcclxuICAgICAgICBjb25zdCBzbGltID0gdGNZdW5PcHRpb25zLnNsaW0gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogISF0Y1l1bk9wdGlvbnMuc2xpbVxyXG4gICAgICAgIGlmICh1c2VWNCAmJiBib2R5Lm1lc3NhZ2UgPT09ICdTVUNDRVNTJykge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGlmIChjdXN0b21VcmwpIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2N1c3RvbVVybH0vJHtwYXRofSR7aW1nLmZpbGVOYW1lfWBcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtib2R5LmRhdGEuc291cmNlX3VybCBhcyBzdHJpbmd9JHtvcHRpb25Vcmx9YFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZVY0ICYmIGJvZHkgJiYgYm9keS5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpZiAoY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtjdXN0b21Vcmx9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9JHtvcHRpb25Vcmx9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnQgPSB0Y1l1bk9wdGlvbnMuZW5kcG9pbnQgPyB0Y1l1bk9wdGlvbnMuZW5kcG9pbnQgOiBgY29zLiR7dGNZdW5PcHRpb25zLmFyZWF9Lm15cWNsb3VkLmNvbWBcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGBodHRwczovLyR7dGNZdW5PcHRpb25zLmJ1Y2tldH0uJHtlbmRwb2ludH0vJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX0ke29wdGlvblVybH1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXMuYm9keS5tc2cpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzbGltKSB7XHJcbiAgICAgICAgICBpZiAob3B0aW9uVXJsKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgKz0gJyZpbWFnZVNsaW0nXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsICs9ICc/aW1hZ2VTbGltJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICBpZiAoIXRjWXVuT3B0aW9ucy52ZXJzaW9uIHx8IHRjWXVuT3B0aW9ucy52ZXJzaW9uID09PSAndjQnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZXJyLmVycm9yKVxyXG4gICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICAgIGNvZGU6IGJvZHkuY29kZSBhcyBzdHJpbmdcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgdGV4dDogJ2h0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvODQzMidcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgfVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElUY3l1bkNvbmZpZz4oJ3BpY0JlZC50Y3l1bicpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd2ZXJzaW9uJyxcclxuICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICBhbGlhczogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OJyksXHJcbiAgICAgIGNob2ljZXM6IFsndjQnLCAndjUnXSxcclxuICAgICAgZGVmYXVsdDogJ3Y1JyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc2VjcmV0SWQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuc2VjcmV0SWQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc2VjcmV0S2V5JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zZWNyZXRLZXkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5idWNrZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYXBwSWQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXBwSWQgfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYXJlYScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUEnKSB9LFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2VuZHBvaW50JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0VORFBPSU5UJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfRU5EUE9JTlQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmVuZHBvaW50IHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfRU5EUE9JTlQnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2N1c3RvbVVybCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ29wdGlvbnMnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc2xpbScsXHJcbiAgICAgIHR5cGU6ICdjb25maXJtJyxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zbGltID09PSB1bmRlZmluZWQgPyBmYWxzZSA6ICEhdXNlckNvbmZpZy5zbGltLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU0nKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGdldCBjb25maXJtVGV4dCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU1fQ09ORklSTScpIH0sXHJcbiAgICAgIGdldCBjYW5jZWxUZXh0ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTV9DQU5DRUwnKSB9LFxyXG4gICAgICBnZXQgdGlwcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU1fVElQJykgfVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ3RjeXVuJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRCcpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSUdpdGh1YkNvbmZpZywgdHlwZSBJT2xkUmVxT3B0aW9uc1dpdGhKU09OIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKGZpbGVOYW1lOiBzdHJpbmcsIG9wdGlvbnM6IElHaXRodWJDb25maWcsIGRhdGE6IGFueSk6IElPbGRSZXFPcHRpb25zV2l0aEpTT04gPT4ge1xyXG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggfHwgJydcclxuICBjb25zdCB7IHRva2VuLCByZXBvIH0gPSBvcHRpb25zXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICB1cmw6IGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7cmVwb30vY29udGVudHMvJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJyksXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEF1dGhvcml6YXRpb246IGB0b2tlbiAke3Rva2VufWAsXHJcbiAgICAgICdVc2VyLUFnZW50JzogJ1BpY0xpc3QnLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogbWltZS5sb29rdXAoZmlsZU5hbWUpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXHJcbiAgICB9LFxyXG4gICAgYm9keTogZGF0YSxcclxuICAgIGpzb246IHRydWVcclxuICB9IGFzIGNvbnN0XHJcbn1cclxuXHJcbmNvbnN0IGdldE9wdGlvbnMgPSAoZmlsZU5hbWU6IHN0cmluZywgb3B0aW9uczogSUdpdGh1YkNvbmZpZyk6IElPbGRSZXFPcHRpb25zV2l0aEpTT04gPT4ge1xyXG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggfHwgJydcclxuICBjb25zdCB7IHRva2VuLCByZXBvLCBicmFuY2ggfSA9IG9wdGlvbnNcclxuICByZXR1cm4ge1xyXG4gICAgbWV0aG9kOiAnR0VUJyxcclxuICAgIHVybDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvfS9jb250ZW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSl9P3JlZj0ke2JyYW5jaH1gLnJlcGxhY2UoLyUyRi9nLCAnLycpLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBgdG9rZW4gJHt0b2tlbn1gLFxyXG4gICAgICAnVXNlci1BZ2VudCc6ICdQaWNHbydcclxuICAgIH0sXHJcbiAgICBqc29uOiB0cnVlXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IGdpdGh1Yk9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElHaXRodWJDb25maWc+KCdwaWNCZWQuZ2l0aHViJylcclxuICBpZiAoIWdpdGh1Yk9wdGlvbnMpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIGdpdGh1YiBjb25maWcnKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGNvbnN0IHVwbG9hZFBhdGggPSBnaXRodWJPcHRpb25zLnBhdGggfHwgJydcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBpbWcuYmFzZTY0SW1hZ2UgfHwgQnVmZmVyLmZyb20oaW1nLmJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpXHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgIG1lc3NhZ2U6ICdVcGxvYWQgYnkgUGljTGlzdCcsXHJcbiAgICAgICAgICBicmFuY2g6IGdpdGh1Yk9wdGlvbnMuYnJhbmNoLFxyXG4gICAgICAgICAgY29udGVudDogYmFzZTY0SW1hZ2UsXHJcbiAgICAgICAgICBwYXRoOiB1cGxvYWRQYXRoICsgZW5jb2RlVVJJKGltZy5maWxlTmFtZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcG9zdENvbmZpZyA9IHBvc3RPcHRpb25zKGltZy5maWxlTmFtZSwgZ2l0aHViT3B0aW9ucywgZGF0YSlcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgYm9keToge1xyXG4gICAgICAgICAgICBjb250ZW50OiB7XHJcbiAgICAgICAgICAgICAgZG93bmxvYWRfdXJsOiBzdHJpbmdcclxuICAgICAgICAgICAgICBzaGE6IHN0cmluZ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ID0gYXdhaXQgY3R4LnJlcXVlc3QocG9zdENvbmZpZylcclxuICAgICAgICAgIGlmIChib2R5KSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgICAgaWYgKGdpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2dpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsfS8ke2VuY29kZVVSSUNvbXBvbmVudCh1cGxvYWRQYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBpbWcuaW1nVXJsID0gYm9keS5jb250ZW50LmRvd25sb2FkX3VybFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGltZy5oYXNoID0gYm9keS5jb250ZW50LnNoYVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgICAgICBpZiAoZXJyLnN0YXR1c0NvZGUgPT09IDQyMikge1xyXG4gICAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGN0eC5yZXF1ZXN0KGdldE9wdGlvbnMoaW1nLmZpbGVOYW1lLCBnaXRodWJPcHRpb25zKSkgYXMgYW55XHJcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZXMpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGltZy5oYXNoID0gcmVzLnNoYVxyXG4gICAgICAgICAgICAgIGlmIChnaXRodWJPcHRpb25zLmN1c3RvbVVybCkge1xyXG4gICAgICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2dpdGh1Yk9wdGlvbnMuY3VzdG9tVXJsfS8ke2VuY29kZVVSSUNvbXBvbmVudCh1cGxvYWRQYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaW1nLmltZ1VybCA9IHJlcy5kb3dubG9hZF91cmxcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZXQgQ29udGVudHMgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLJylcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUdpdGh1YkNvbmZpZz4oJ3BpY0JlZC5naXRodWInKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAncmVwbycsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9SRVBPJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUkVQTycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5yZXBvIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2JyYW5jaCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9CUkFOQ0gnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9CUkFOQ0gnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5icmFuY2ggfHwgJ21hc3RlcicsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAndG9rZW4nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9UT0tFTicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudG9rZW4gfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdnaXRodWInLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHFpbml1IGZyb20gJ3Fpbml1J1xyXG5pbXBvcnQgeyB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSVFpbml1Q29uZmlnLCB0eXBlIElQaWNHbywgdHlwZSBJT2xkUmVxT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgdHlwZSBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcblxyXG5mdW5jdGlvbiBwb3N0T3B0aW9ucyAob3B0aW9uczogSVFpbml1Q29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBpbWdCYXNlNjQ6IHN0cmluZyk6IElPbGRSZXFPcHRpb25zIHtcclxuICBjb25zdCBhcmVhID0gc2VsZWN0QXJlYShvcHRpb25zLmFyZWEgfHwgJ3owJylcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3QgYmFzZTY0RmlsZU5hbWUgPSBCdWZmZXIuZnJvbShwYXRoICsgZmlsZU5hbWUsICd1dGYtOCcpLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKVxyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgIHVybDogYGh0dHA6Ly91cGxvYWQke2FyZWF9LnFpbml1cC5jb20vcHV0YjY0Ly0xL2tleS8ke2Jhc2U2NEZpbGVOYW1lfWAsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEF1dGhvcml6YXRpb246IGBVcFRva2VuICR7dG9rZW59YCxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xyXG4gICAgfSxcclxuICAgIGJvZHk6IGltZ0Jhc2U2NFxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2VsZWN0QXJlYSAoYXJlYTogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gYXJlYSA9PT0gJ3owJyA/ICcnIDogJy0nICsgYXJlYVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRUb2tlbiAocWluaXVPcHRpb25zOiBhbnkpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGFjY2Vzc0tleSA9IHFpbml1T3B0aW9ucy5hY2Nlc3NLZXlcclxuICBjb25zdCBzZWNyZXRLZXkgPSBxaW5pdU9wdGlvbnMuc2VjcmV0S2V5XHJcbiAgY29uc3QgbWFjID0gbmV3IHFpbml1LmF1dGguZGlnZXN0Lk1hYyhhY2Nlc3NLZXksIHNlY3JldEtleSlcclxuICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgc2NvcGU6IHFpbml1T3B0aW9ucy5idWNrZXRcclxuICB9XHJcbiAgY29uc3QgcHV0UG9saWN5ID0gbmV3IHFpbml1LnJzLlB1dFBvbGljeShvcHRpb25zKVxyXG4gIHJldHVybiBwdXRQb2xpY3kudXBsb2FkVG9rZW4obWFjKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHFpbml1T3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVFpbml1Q29uZmlnPigncGljQmVkLnFpbml1JylcclxuICBpZiAoIXFpbml1T3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgcWluaXUgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NEltYWdlID0gaW1nLmJhc2U2NEltYWdlIHx8IEJ1ZmZlci5mcm9tKGltZy5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhxaW5pdU9wdGlvbnMsIGltZy5maWxlTmFtZSwgZ2V0VG9rZW4ocWluaXVPcHRpb25zKSwgYmFzZTY0SW1hZ2UpXHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShyZXMpXHJcbiAgICAgICAgaWYgKGJvZHk/LmtleSkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSBxaW5pdU9wdGlvbnMudXJsXHJcbiAgICAgICAgICBjb25zdCB1cmxPcHRpb25zID0gcWluaXVPcHRpb25zLm9wdGlvbnMgfHwgJydcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtiYXNlVXJsfS8ke2JvZHkua2V5IGFzIHN0cmluZ30ke3VybE9wdGlvbnN9YFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICBib2R5OiBib2R5Lm1zZ1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGN0eC5sb2cuZXJyb3IoJ3Fpbml1IGVycm9yJywgYm9keSlcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXBsb2FkIGZhaWxlZCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGlmIChlcnIubWVzc2FnZSAhPT0gJ1VwbG9hZCBmYWlsZWQnKSB7XHJcbiAgICAgIC8vIGVyci5yZXNwb25zZSBtYXliZSB1bmRlZmluZWRcclxuICAgICAgaWYgKGVyci5yZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyLnJlc3BvbnNlLmJvZHlcclxuICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGVycm9yLmVycm9yXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElRaW5pdUNvbmZpZz4oJ3BpY0JlZC5xaW5pdScpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NLZXknLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX0FDQ0VTU0tFWScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYWNjZXNzS2V5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NlY3JldEtleScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfU0VDUkVUS0VZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zZWNyZXRLZXkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd1cmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX1VSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FyZWEnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9BUkVBJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9BUkVBJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9QQVRIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcigncWluaXUnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVUnKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGx1Z2luQ29uZmlnLCB0eXBlIElJbWd1ckNvbmZpZywgdHlwZSBJT2xkUmVxT3B0aW9ucywgdHlwZSBJRnVsbFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbmNvbnN0IGZvcm1hdEFjY2Vzc1Rva2VuID0gKGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBzdHJpbmcgPT4gYWNjZXNzVG9rZW4gPyBhY2Nlc3NUb2tlbi5zdGFydHNXaXRoKCdCZWFyZXInKSA/IGFjY2Vzc1Rva2VuIDogYEJlYXJlciAke2FjY2Vzc1Rva2VufWAgOiAnJ1xyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSBhc3luYyAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElJbWd1ckNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgaW1nQmFzZTY0OiBzdHJpbmcpOiBQcm9taXNlPElPbGRSZXFPcHRpb25zPiA9PiB7XHJcbiAgY29uc3QgY2xpZW50SWQgPSBvcHRpb25zLmNsaWVudElkIHx8ICcnXHJcbiAgY29uc3QgdXNlcm5hbWUgPSBvcHRpb25zLnVzZXJuYW1lIHx8ICcnXHJcbiAgY29uc3QgYWNjZXNzVG9rZW4gPSBmb3JtYXRBY2Nlc3NUb2tlbihvcHRpb25zLmFjY2Vzc1Rva2VuIHx8ICcnKVxyXG4gIGNvbnN0IGFsYnVtID0gb3B0aW9ucy5hbGJ1bSB8fCAnJ1xyXG4gIGxldCBhdXRob3JpemF0aW9uXHJcbiAgaWYgKHVzZXJuYW1lICYmIGFjY2Vzc1Rva2VuKSB7XHJcbiAgICBhdXRob3JpemF0aW9uID0gYWNjZXNzVG9rZW5cclxuICB9IGVsc2UgaWYgKGNsaWVudElkKSB7XHJcbiAgICBhdXRob3JpemF0aW9uID0gYENsaWVudC1JRCAke2NsaWVudElkfWBcclxuICB9IGVsc2Uge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGllbnRJZCBvciBhY2Nlc3NUb2tlbiBpcyByZXF1aXJlZCcpXHJcbiAgfVxyXG4gIGNvbnN0IHJlcXVlc3RPcHRpb25zOiBJT2xkUmVxT3B0aW9ucyA9IHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgdXJsOiAnaHR0cHM6Ly9hcGkuaW1ndXIuY29tLzMvaW1hZ2UnLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBhdXRob3JpemF0aW9uLFxyXG4gICAgICAnY29udGVudC10eXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnLFxyXG4gICAgICBIb3N0OiAnYXBpLmltZ3VyLmNvbScsXHJcbiAgICAgICdVc2VyLUFnZW50JzogJ1BpY0xpc3QnXHJcbiAgICB9LFxyXG4gICAgZm9ybURhdGE6IHtcclxuICAgICAgaW1hZ2U6IGltZ0Jhc2U2NCxcclxuICAgICAgdHlwZTogJ2Jhc2U2NCcsXHJcbiAgICAgIG5hbWU6IGZpbGVOYW1lLFxyXG4gICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZGVkIHdpdGggUGljTGlzdCdcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKHVzZXJuYW1lICYmIGFjY2Vzc1Rva2VuICYmIGFsYnVtKSB7XHJcbiAgICBsZXQgaW5pdFBhZ2VzID0gMFxyXG4gICAgbGV0IHJlc1xyXG4gICAgbGV0IGFsYnVtSGFzaCA9ICcnXHJcbiAgICBkbyB7XHJcbiAgICAgIGNvbnN0IGdldEFsYnVtSGFzaE9wdGlvbnM6IElPbGRSZXFPcHRpb25zID0ge1xyXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgdXJsOiBgaHR0cHM6Ly9hcGkuaW1ndXIuY29tLzMvYWNjb3VudC8ke3VzZXJuYW1lfS9hbGJ1bXMvJHtpbml0UGFnZXN9YCxcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRob3JpemF0aW9uXHJcbiAgICAgICAgfSxcclxuICAgICAgICBqc29uOiB0cnVlLFxyXG4gICAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxyXG4gICAgICAgIHRpbWVvdXQ6IDEwMDAwXHJcbiAgICAgIH1cclxuICAgICAgaWYgKG9wdGlvbnMucHJveHkpIHtcclxuICAgICAgICBnZXRBbGJ1bUhhc2hPcHRpb25zLnByb3h5ID0gb3B0aW9ucy5wcm94eVxyXG4gICAgICB9XHJcbiAgICAgIHJlcyA9IGF3YWl0IGN0eC5yZXF1ZXN0KGdldEFsYnVtSGFzaE9wdGlvbnMpIGFzIHVua25vd24gYXMgSUZ1bGxSZXNwb25zZVxyXG4gICAgICBpZiAoIShyZXMuc3RhdHVzQ29kZSA9PT0gMjAwICYmIHJlcy5ib2R5LnN1Y2Nlc3MpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFsYnVtTGlzdCA9IHJlcy5ib2R5LmRhdGFcclxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFsYnVtTGlzdCkge1xyXG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBhbGJ1bSkge1xyXG4gICAgICAgICAgYWxidW1IYXNoID0gaXRlbS5pZFxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaW5pdFBhZ2VzKytcclxuICAgIH0gd2hpbGUgKHJlcy5ib2R5LmRhdGEubGVuZ3RoID4gMClcclxuICAgIGlmIChhbGJ1bUhhc2ggJiYgcmVxdWVzdE9wdGlvbnMuZm9ybURhdGEpIHtcclxuICAgICAgcmVxdWVzdE9wdGlvbnMuZm9ybURhdGEuYWxidW0gPSBhbGJ1bUhhc2hcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKG9wdGlvbnMucHJveHkpIHtcclxuICAgIHJlcXVlc3RPcHRpb25zLnByb3h5ID0gb3B0aW9ucy5wcm94eVxyXG4gIH1cclxuICByZXR1cm4gcmVxdWVzdE9wdGlvbnNcclxufVxyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjb25zdCBpbWd1ck9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElJbWd1ckNvbmZpZz4oJ3BpY0JlZC5pbWd1cicpXHJcbiAgaWYgKCFpbWd1ck9wdGlvbnMpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIGltZ3VyIGNvbmZpZycpXHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBjb25zdCBiYXNlNjRJbWFnZSA9IGltZy5iYXNlNjRJbWFnZSB8fCBCdWZmZXIuZnJvbShpbWcuYnVmZmVyKS50b1N0cmluZygnYmFzZTY0JylcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgcG9zdE9wdGlvbnMoY3R4LCBpbWd1ck9wdGlvbnMsIGltZy5maWxlTmFtZSwgYmFzZTY0SW1hZ2UpXHJcbiAgICAgICAgY29uc3QgcmVzOiBzdHJpbmcgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSB0eXBlb2YgcmVzID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UocmVzKSA6IHJlc1xyXG4gICAgICAgIGlmIChib2R5LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpbWcuaW1nVXJsID0gYm9keS5kYXRhLmxpbmtcclxuICAgICAgICAgIGltZy5oYXNoID0gYm9keS5kYXRhLmRlbGV0ZWhhc2hcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4nKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUksnKSxcclxuICAgICAgdGV4dDogJ2h0dHA6Ly9kb2NzLmltZ3VyLmNvbS9hcGkvZXJybm8vJ1xyXG4gICAgfSlcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc3RyaW5nIHwgSUVycm9yXHJcbiAgICB0aHJvdyBlcnI/LnJlc3BvbnNlPy5kYXRhIHx8IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJSW1ndXJDb25maWc+KCdwaWNCZWQuaW1ndXInKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY2xpZW50SWQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9DTElFTlRJRCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfQ0xJRU5USUQnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfTUVTU0FHRV9DTElFTlRJRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY2xpZW50SWQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3VzZXJuYW1lJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfVVNFUk5BTUUnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX1VTRVJOQU1FJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX01FU1NBR0VfVVNFUk5BTUUnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnVzZXJuYW1lIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NUb2tlbicsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX0FDQ0VTU19UT0tFTicpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfQUNDRVNTX1RPS0VOJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX01FU1NBR0VfQUNDRVNTX1RPS0VOJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NUb2tlbiB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYWxidW0nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9BTEJVTScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfQUxCVU0nKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfTUVTU0FHRV9BTEJVTScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYWxidW0gfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Byb3h5JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfUFJPWFknKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX1BST1hZJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSX01FU1NBR0VfUFJPWFknKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnByb3h5IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdpbWd1cicsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUicpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSUFsaXl1bkNvbmZpZywgdHlwZSBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbi8vIGdlbmVyYXRlIE9TUyBzaWduYXR1cmVcclxuY29uc3QgZ2VuZXJhdGVTaWduYXR1cmUgPSAob3B0aW9uczogSUFsaXl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKVxyXG4gIGNvbnN0IG1pbWVUeXBlID0gbWltZS5sb29rdXAoZmlsZU5hbWUpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXHJcblxyXG4gIGNvbnN0IHNpZ25TdHJpbmcgPSBgUFVUXFxuXFxuJHttaW1lVHlwZX1cXG4ke2RhdGV9XFxuLyR7b3B0aW9ucy5idWNrZXR9LyR7b3B0aW9ucy5wYXRofSR7ZmlsZU5hbWV9YFxyXG5cclxuICBjb25zdCBzaWduYXR1cmUgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIG9wdGlvbnMuYWNjZXNzS2V5U2VjcmV0KS51cGRhdGUoc2lnblN0cmluZykuZGlnZXN0KCdiYXNlNjQnKVxyXG4gIHJldHVybiBgT1NTICR7b3B0aW9ucy5hY2Nlc3NLZXlJZH06JHtzaWduYXR1cmV9YFxyXG59XHJcblxyXG5jb25zdCBwb3N0T3B0aW9ucyA9IChvcHRpb25zOiBJQWxpeXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgaW1hZ2U6IEJ1ZmZlcik6IElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICB1cmw6IGBodHRwczovLyR7b3B0aW9ucy5idWNrZXR9LiR7b3B0aW9ucy5hcmVhfS5hbGl5dW5jcy5jb20vJHtlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5wYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlTmFtZSl9YC5yZXBsYWNlKC8lMkYvZywgJy8nKSxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgSG9zdDogYCR7b3B0aW9ucy5idWNrZXR9LiR7b3B0aW9ucy5hcmVhfS5hbGl5dW5jcy5jb21gLFxyXG4gICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUsXHJcbiAgICAgIERhdGU6IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKVxyXG4gICAgfSxcclxuICAgIGJvZHk6IGltYWdlLFxyXG4gICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgYWxpWXVuT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SUFsaXl1bkNvbmZpZz4oJ3BpY0JlZC5hbGl5dW4nKVxyXG4gIGlmICghYWxpWXVuT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgYWxpWXVuIE9TUyBjb25maWcnKVxyXG4gIH1cclxuICBhbGlZdW5PcHRpb25zLnBhdGggPSBhbGlZdW5PcHRpb25zLnBhdGgucmVwbGFjZSgvXFwvKiQvLCAnJykucmVwbGFjZSgvXlxcLyovLCAnJykgKyAnLydcclxuICBpZiAoYWxpWXVuT3B0aW9ucy5wYXRoID09PSAnLycpIHtcclxuICAgIGFsaVl1bk9wdGlvbnMucGF0aCA9ICcnXHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgY29uc3QgY3VzdG9tVXJsID0gYWxpWXVuT3B0aW9ucy5jdXN0b21VcmxcclxuICAgIGNvbnN0IHBhdGggPSBhbGlZdW5PcHRpb25zLnBhdGggPz8gJydcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ2VuZXJhdGVTaWduYXR1cmUoYWxpWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0gcG9zdE9wdGlvbnMoYWxpWXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lLCBzaWduYXR1cmUsIGltYWdlKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGNvbnN0IG9wdGlvblVybCA9IGFsaVl1bk9wdGlvbnMub3B0aW9ucyB8fCAnJ1xyXG4gICAgICAgICAgaWYgKGN1c3RvbVVybCkge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke2VuY29kZVVSSUNvbXBvbmVudChwYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfSR7b3B0aW9uVXJsfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgaHR0cHM6Ly8ke2FsaVl1bk9wdGlvbnMuYnVja2V0fS4ke2FsaVl1bk9wdGlvbnMuYXJlYX0uYWxpeXVuY3MuY29tLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9JHtvcHRpb25Vcmx9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VwbG9hZCBmYWlsZWQnKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1MnKVxyXG4gICAgfSlcclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJQWxpeXVuQ29uZmlnPigncGljQmVkLmFsaXl1bicpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NLZXlJZCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFjY2Vzc0tleUlkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FjY2Vzc0tleVNlY3JldCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXlTZWNyZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhcmVhJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ2FsaXl1bicsIHtcclxuICAgIGdldCBuYW1lICgpIHtcclxuICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRCcpXHJcbiAgICB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGx1Z2luQ29uZmlnLCB0eXBlIElVcHl1bkNvbmZpZywgdHlwZSBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IHsgc2FmZVBhcnNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xyXG5cclxuLy8gZ2VuZXJhdGUgQ09TIHNpZ25hdHVyZSBzdHJpbmdcclxuY29uc3QgZ2VuZXJhdGVTaWduYXR1cmUgPSAob3B0aW9uczogSVVweXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3Qgb3BlcmF0b3IgPSBvcHRpb25zLm9wZXJhdG9yXHJcbiAgY29uc3QgcGFzc3dvcmQgPSBvcHRpb25zLnBhc3N3b3JkXHJcbiAgY29uc3QgbWQ1UGFzc3dvcmQgPSBNRDUocGFzc3dvcmQpXHJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKVxyXG4gIGNvbnN0IHVyaSA9IGAvJHtvcHRpb25zLmJ1Y2tldH0vJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICBjb25zdCB2YWx1ZSA9IGBQVVQmJHt1cml9JiR7ZGF0ZX1gXHJcbiAgY29uc3Qgc2lnbiA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgbWQ1UGFzc3dvcmQpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KCdiYXNlNjQnKVxyXG4gIHJldHVybiBgVVBZVU4gJHtvcGVyYXRvcn06JHtzaWdufWBcclxufVxyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAob3B0aW9uczogSVVweXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgaW1hZ2U6IEJ1ZmZlcik6IElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSA9PiB7XHJcbiAgY29uc3QgYnVja2V0ID0gb3B0aW9ucy5idWNrZXRcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICB1cmw6IGBodHRwczovL3YwLmFwaS51cHl1bi5jb20vJHtidWNrZXR9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUsXHJcbiAgICAgIERhdGU6IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xyXG4gICAgfSxcclxuICAgIGJvZHk6IGltYWdlLFxyXG4gICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIE1ENSAoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShjb250ZW50KS5kaWdlc3QoJ2hleCcpXHJcbn1cclxuXHJcbmNvbnN0IGdldEFudGlMZWVjaFBhcmFtID0gKGFudGlMZWVjaFRva2VuOiBzdHJpbmcsIGV4cGlyZVRpbWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgb3B0aW9uczogSVVweXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCB1cmkgPSBgLyR7b3B0aW9ucy5wYXRoIHx8ICcnfSR7ZmlsZU5hbWV9YC5yZXBsYWNlKC8lMkYvZywgJy8nKS5yZXBsYWNlKC9eXFwvKy9nLCAnLycpXHJcbiAgY29uc3Qgbm93ID0gTWF0aC5yb3VuZChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApXHJcbiAgY29uc3QgZXhwaXJlID0gZXhwaXJlVGltZSA/IG5vdyArIHBhcnNlSW50KGV4cGlyZVRpbWUudG9TdHJpbmcoKSwgMTApIDogbm93ICsgMTgwMFxyXG4gIGNvbnN0IHNpZ24gPSBNRDUoYCR7YW50aUxlZWNoVG9rZW59JiR7ZXhwaXJlfSYke3VyaX1gKVxyXG4gIGNvbnN0IHVwdCA9IGAke3NpZ24uc3Vic3RyaW5nKDEyLCAyMCl9JHtleHBpcmV9YFxyXG4gIHJldHVybiBgX3VwdD0ke3VwdH1gXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgdXB5dW5PcHRpb25zID0gY3R4LmdldENvbmZpZzxJVXB5dW5Db25maWc+KCdwaWNCZWQudXB5dW4nKVxyXG4gIGlmICghdXB5dW5PcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCB1cFl1biBjb25maWcnKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGNvbnN0IHBhdGggPSB1cHl1bk9wdGlvbnMucGF0aCB8fCAnJ1xyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcclxuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCAnYmFzZTY0JylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ2VuZXJhdGVTaWduYXR1cmUodXB5dW5PcHRpb25zLCBpbWcuZmlsZU5hbWUpXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHBvc3RPcHRpb25zKHVweXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lLCBzaWduYXR1cmUsIGltYWdlKVxyXG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IHVweXVuT3B0aW9ucy5vcHRpb25zIHx8ICcnXHJcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXHJcbiAgICAgICAgaWYgKGJvZHkuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGAke3VweXVuT3B0aW9ucy51cmx9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9JHtzdWZmaXh9YC5yZXBsYWNlKC8lMkYvZywgJy8nKVxyXG4gICAgICAgICAgaWYgKHVweXVuT3B0aW9ucy5hbnRpTGVlY2hUb2tlbikge1xyXG4gICAgICAgICAgICBjb25zdCB1cHQgPSBnZXRBbnRpTGVlY2hQYXJhbSh1cHl1bk9wdGlvbnMuYW50aUxlZWNoVG9rZW4sIHVweXVuT3B0aW9ucy5leHBpcmVUaW1lLCB1cHl1bk9wdGlvbnMsIGltZy5maWxlTmFtZSlcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGltZy5pbWdVcmwuaW5jbHVkZXMoJz8nKSA/IGAke2ltZy5pbWdVcmx9JiR7dXB0fWAgOiBgJHtpbWcuaW1nVXJsfT8ke3VwdH1gXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXBsb2FkIGZhaWxlZCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGlmIChlcnIubWVzc2FnZSA9PT0gJ1VwbG9hZCBmYWlsZWQnKSB7XHJcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdDSEVDS19TRVRUSU5HUycpXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBib2R5ID0gc2FmZVBhcnNlPHsgY29kZTogc3RyaW5nIH0+KGVyci5lcnJvcilcclxuICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRURfUkVBU09OJywge1xyXG4gICAgICAgICAgY29kZTogdHlwZW9mIGJvZHkgPT09ICdvYmplY3QnID8gYm9keS5jb2RlIDogYm9keVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRleHQ6ICdodHRwOi8vZG9jcy51cHl1bi5jb20vYXBpL2Vycm5vLydcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJVXB5dW5Db25maWc+KCdwaWNCZWQudXB5dW4nKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcGVyYXRvcicsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fT1BFUkFUT1InKSB9LFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX09QRVJBVE9SJylcclxuICAgICAgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1InKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wZXJhdG9yIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fUEFTU1dPUkQnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGFzc3dvcmQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAndXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9VUkwnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9QQVRIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYW50aUxlZWNoVG9rZW4nLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9BTlRJX0xFRUNIX1RPS0VOJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9BTlRJX0xFRUNIX1RPS0VOJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX0FOVElfTEVFQ0hfVE9LRU4nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFudGlMZWVjaFRva2VuIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdleHBpcmVUaW1lJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fRVhQSVJFX1RJTUUnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX0VYUElSRV9USU1FJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX0VYUElSRV9USU1FJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5leHBpcmVUaW1lIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCd1cHl1bicsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTicpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQbHVnaW5Db25maWcsIHR5cGUgSVdlYmRhdlBsaXN0Q29uZmlnIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28gfCBib29sZWFuPiA9PiB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV2YWxcclxuICBjb25zdCB7IEF1dGhUeXBlLCBjcmVhdGVDbGllbnQgfSA9IGF3YWl0IGV2YWwoXCJpbXBvcnQoJ3dlYmRhdi9kaXN0L25vZGUvaW5kZXguanMnKVwiKVxyXG4gIGNvbnN0IHdlYmRhdnBsaXN0T3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVdlYmRhdlBsaXN0Q29uZmlnPigncGljQmVkLndlYmRhdnBsaXN0JylcclxuICBpZiAoIXdlYmRhdnBsaXN0T3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgd2ViZGF2cGxpc3QgY29uZmlnJylcclxuICB9XHJcbiAgd2ViZGF2cGxpc3RPcHRpb25zLmhvc3QgPSB3ZWJkYXZwbGlzdE9wdGlvbnMuaG9zdC5yZXBsYWNlKC9eaHR0cHM/OlxcL1xcL3xcXC8rJC9nLCAnJylcclxuICB3ZWJkYXZwbGlzdE9wdGlvbnMuaG9zdCA9ICh3ZWJkYXZwbGlzdE9wdGlvbnMuc3NsRW5hYmxlZCA/ICdodHRwczovLycgOiAnaHR0cDovLycpICsgd2ViZGF2cGxpc3RPcHRpb25zLmhvc3RcclxuICB3ZWJkYXZwbGlzdE9wdGlvbnMucGF0aCA9ICh3ZWJkYXZwbGlzdE9wdGlvbnMucGF0aCB8fCAnJykucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpICsgJy8nXHJcbiAgY29uc3QgYXV0aFR5cGUgPSB3ZWJkYXZwbGlzdE9wdGlvbnMuYXV0aFR5cGUgfHwgJ2Jhc2ljJ1xyXG4gIGNvbnN0IHdlYnBhdGggPSAod2ViZGF2cGxpc3RPcHRpb25zLndlYnBhdGggfHwgJycpLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKSArICcvJ1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgY29uc3QgY3VzdG9tVXJsID0gd2ViZGF2cGxpc3RPcHRpb25zLmN1c3RvbVVybFxyXG4gICAgY29uc3QgdXBsb2FkUGF0aCA9IHdlYmRhdnBsaXN0T3B0aW9ucy5wYXRoXHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjbGllbnRPcHRpb25zOiBhbnkgPSB7XHJcbiAgICAgICAgICB1c2VybmFtZTogd2ViZGF2cGxpc3RPcHRpb25zLnVzZXJuYW1lLFxyXG4gICAgICAgICAgcGFzc3dvcmQ6IHdlYmRhdnBsaXN0T3B0aW9ucy5wYXNzd29yZCxcclxuICAgICAgICAgIG1heEJvZHlMZW5ndGg6IDQgKiAxMDI0ICogMTAyNCAqIDEwMjQsXHJcbiAgICAgICAgICBtYXhDb250ZW50TGVuZ3RoOiA0ICogMTAyNCAqIDEwMjQgKiAxMDI0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhdXRoVHlwZSA9PT0gJ2RpZ2VzdCcpIHtcclxuICAgICAgICAgIGNsaWVudE9wdGlvbnMuYXV0aFR5cGUgPSBBdXRoVHlwZS5EaWdlc3RcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2xpZW50OiBhbnkgPSBjcmVhdGVDbGllbnQod2ViZGF2cGxpc3RPcHRpb25zLmhvc3QsIGNsaWVudE9wdGlvbnMpXHJcbiAgICAgICAgY29uc3QgcGF0aFRvQ3JlYXRlID0gdXBsb2FkUGF0aCA9PT0gJy8nID8gJycgOiB1cGxvYWRQYXRoXHJcbiAgICAgICAgaWYgKHBhdGhUb0NyZWF0ZSkge1xyXG4gICAgICAgICAgYXdhaXQgY2xpZW50LmNyZWF0ZURpcmVjdG9yeShwYXRoVG9DcmVhdGUsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5wdXRGaWxlQ29udGVudHMoYCR7dXBsb2FkUGF0aH0ke2ltZy5maWxlTmFtZX1gLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKSwgaW1hZ2UsIHtcclxuICAgICAgICAgIG92ZXJ3cml0ZTogdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgY29uc3QgaW1nVGVtcFBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsICdpbWdUZW1wJywgJ3dlYmRhdnBsaXN0JylcclxuICAgICAgICAgIGNvbnN0IGltZ1RlbXBGaWxlUGF0aCA9IHBhdGguam9pbihpbWdUZW1wUGF0aCwgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhpbWdUZW1wUGF0aClcclxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoaW1nVGVtcEZpbGVQYXRoLCBpbWFnZSlcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBjb25zdCBiYXNlVXJsID0gY3VzdG9tVXJsIHx8IHdlYmRhdnBsaXN0T3B0aW9ucy5ob3N0XHJcbiAgICAgICAgICBpZiAod2ViZGF2cGxpc3RPcHRpb25zLndlYnBhdGgpIHtcclxuICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2Jhc2VVcmx9LyR7d2VicGF0aCA9PT0gJy8nID8gJycgOiBlbmNvZGVVUklDb21wb25lbnQod2VicGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7YmFzZVVybH0vJHt1cGxvYWRQYXRoID09PSAnLycgPyAnJyA6IGVuY29kZVVSSUNvbXBvbmVudCh1cGxvYWRQYXRoKX0ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWAucmVwbGFjZSgvJTJGL2csICcvJylcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGltZy5nYWxsZXJ5UGF0aCA9IGBodHRwOi8vbG9jYWxob3N0OjM2Njk5L3dlYmRhdnBsaXN0LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGltZy5maWxlTmFtZSl9YFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VwbG9hZCBmYWlsZWQnKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdDSEVDS19TRVRUSU5HUycpXHJcbiAgICB9KVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElXZWJkYXZQbGlzdENvbmZpZz4oJ3BpY0JlZC53ZWJkYXZwbGlzdCcpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdob3N0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9IT1NUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5ob3N0IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3NzbEVuYWJsZWQnLFxyXG4gICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfU1NMRU5BQkxFRCcpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zc2xFbmFibGVkID8/IGZhbHNlLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfU1NMRU5BQkxFRCcpIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd1c2VybmFtZScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfVVNFUk5BTUUnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnVzZXJuYW1lIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfVVNFUk5BTUUnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9VU0VSTkFNRScpIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXNzd29yZCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfUEFTU1dPUkQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBhc3N3b3JkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfUEFTU1dPUkQnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVNTV09SRCcpIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVRIJykgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3dlYnBhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUX1dFQlNJVEVfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9XRUJTSVRFX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEgnKSB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY3VzdG9tVXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9DVVNUT01VUkwnKSB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYXV0aFR5cGUnLFxyXG4gICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfV0VCREFWUExJU1RfQVVUSFRZUEUnKSB9LFxyXG4gICAgICBjaG9pY2VzOiBbJ2Jhc2ljJywgJ2RpZ2VzdCddLFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmF1dGhUeXBlIHx8ICdiYXNpYycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ3dlYmRhdnBsaXN0Jywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1dFQkRBVlBMSVNUJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbkNvbmZpZywgdHlwZSBJTG9jYWxDb25maWcgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IHR5cGUgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IGxvY2FsQ29uZmlnID0gY3R4LmdldENvbmZpZzxJTG9jYWxDb25maWc+KCdwaWNCZWQubG9jYWwnKVxyXG4gIGlmICghbG9jYWxDb25maWcpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBmaW5kIGxvY2FsIGNvbmZpZyEnKVxyXG4gIH1cclxuICBjb25zdCB1cGxvYWRQYXRoID0gbG9jYWxDb25maWcucGF0aCB8fCAnJ1xyXG4gIGxldCBjdXN0b21VcmwgPSBsb2NhbENvbmZpZy5jdXN0b21VcmwgfHwgJydcclxuICBpZiAoY3VzdG9tVXJsKSB7XHJcbiAgICBjdXN0b21VcmwgPSBjdXN0b21VcmwucmVwbGFjZSgvXFwvJC8sICcnKVxyXG4gIH1cclxuICBsZXQgd2ViUGF0aCA9IGxvY2FsQ29uZmlnLndlYlBhdGggfHwgJydcclxuICBpZiAod2ViUGF0aCkge1xyXG4gICAgd2ViUGF0aCA9IHdlYlBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpLnJlcGxhY2UoL15cXC8vLCAnJykucmVwbGFjZSgvXFwvJC8sICcnKVxyXG4gIH1cclxuICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICB9XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGltZ1RlbXBQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCAnaW1nVGVtcCcsICdsb2NhbCcpXHJcbiAgICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKGltZ1RlbXBQYXRoKVxyXG4gICAgICAgICAgZnMuZW5zdXJlRGlyU3luYyh1cGxvYWRQYXRoKVxyXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4odXBsb2FkUGF0aCwgaW1nLmZpbGVOYW1lKSwgaW1hZ2UpXHJcbiAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMocGF0aC5qb2luKHVwbG9hZFBhdGgsIGltZy5maWxlTmFtZSksIHBhdGguam9pbihjdHguYmFzZURpciwgJ2ltZ1RlbXAnLCAnbG9jYWwnLCBpbWcuZmlsZU5hbWUpKVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGlmIChjdXN0b21VcmwpIHtcclxuICAgICAgICAgICAgaWYgKHdlYlBhdGgpIHtcclxuICAgICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke2VuY29kZVVSSUNvbXBvbmVudCh3ZWJQYXRoKX0vJHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaW1nLmltZ1VybCA9IGAke2N1c3RvbVVybH0vJHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBwYXRoLmpvaW4odXBsb2FkUGF0aCwgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaW1nLmhhc2ggPSBwYXRoLmpvaW4odXBsb2FkUGF0aCwgaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgICAgaW1nLmdhbGxlcnlQYXRoID0gYGh0dHA6Ly9sb2NhbGhvc3Q6MzY2OTkvbG9jYWwvJHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX1gXHJcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICBib2R5OiAnZmFpbGVkIHRvIHVwbG9hZCBpbWFnZSdcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byB1cGxvYWQgaW1hZ2UnKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gY3R4XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUxvY2FsQ29uZmlnPigncGljQmVkLmxvY2FsJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9MT0NBTF9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9MT0NBTF9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfTE9DQUxfTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9MT0NBTF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0xPQ0FMX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfTE9DQUxfTUVTU0FHRV9DVVNUT01VUkwnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd3ZWJQYXRoJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9MT0NBTF9XRUJQQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy53ZWJQYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2UsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0xPQ0FMX1dFQlBBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfTE9DQUxfTUVTU0FHRV9XRUJQQVRIJykgfVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ2xvY2FsJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0xPQ0FMJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgTm9kZVNTSCwgdHlwZSBDb25maWcgfSBmcm9tICdub2RlLXNzaC1uby1jcHUtZmVhdHVyZXMnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCB7IHR5cGUgSVNmdHBQbGlzdENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5cclxuY2xhc3MgU1NIQ2xpZW50IHtcclxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFNTSENsaWVudFxyXG4gIHByaXZhdGUgc3RhdGljIF9jbGllbnQ6IE5vZGVTU0hcclxuICBwcml2YXRlIF9pc0Nvbm5lY3RlZCA9IGZhbHNlXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGluc3RhbmNlICgpOiBTU0hDbGllbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlIHx8ICh0aGlzLl9pbnN0YW5jZSA9IG5ldyB0aGlzKCkpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldCBjbGllbnQgKCk6IE5vZGVTU0gge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudCB8fCAodGhpcy5fY2xpZW50ID0gbmV3IE5vZGVTU0goKSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hhbmdlV2luU3R5bGVQYXRoVG9Vbml4IChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY29ubmVjdCAoY29uZmlnOiBJU2Z0cFBsaXN0Q29uZmlnKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCB7IHVzZXJuYW1lLCBwYXNzd29yZCwgcHJpdmF0ZUtleSwgcGFzc3BocmFzZSB9ID0gY29uZmlnXHJcbiAgICBjb25zdCBsb2dpbkluZm86IENvbmZpZyA9IHByaXZhdGVLZXlcclxuICAgICAgPyB7IHVzZXJuYW1lLCBwcml2YXRlS2V5UGF0aDogcHJpdmF0ZUtleSwgcGFzc3BocmFzZTogcGFzc3BocmFzZSB8fCB1bmRlZmluZWQgfVxyXG4gICAgICA6IHsgdXNlcm5hbWUsIHBhc3N3b3JkIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IFNTSENsaWVudC5jbGllbnQuY29ubmVjdCh7XHJcbiAgICAgICAgaG9zdDogY29uZmlnLmhvc3QsXHJcbiAgICAgICAgcG9ydDogTnVtYmVyKGNvbmZpZy5wb3J0KSB8fCAyMixcclxuICAgICAgICAuLi5sb2dpbkluZm9cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5faXNDb25uZWN0ZWQgPSB0cnVlXHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHVwbG9hZCAobG9jYWw6IHN0cmluZywgcmVtb3RlOiBzdHJpbmcsIGNvbmZpZzogSVNmdHBQbGlzdENvbmZpZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCF0aGlzLl9pc0Nvbm5lY3RlZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NTSCDmnKrov57mjqUnKVxyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgcmVtb3RlID0gdGhpcy5jaGFuZ2VXaW5TdHlsZVBhdGhUb1VuaXgocmVtb3RlKVxyXG4gICAgICBhd2FpdCB0aGlzLm1rZGlyKHBhdGguZGlybmFtZShyZW1vdGUpLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKSwgY29uZmlnKVxyXG4gICAgICBhd2FpdCBTU0hDbGllbnQuY2xpZW50LnB1dEZpbGUobG9jYWwsIHJlbW90ZSlcclxuICAgICAgY29uc3QgZmlsZU1vZGUgPSBjb25maWcuZmlsZU1vZGUgfHwgJzA2NDQnXHJcbiAgICAgIGlmIChmaWxlTW9kZSAhPT0gJzA2NDQnKSB7XHJcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gYGNobW9kICR7ZmlsZU1vZGV9IFwiJHtyZW1vdGV9XCJgXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjKHNjcmlwdClcclxuICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG1rZGlyIChkaXJQYXRoOiBzdHJpbmcsIGNvbmZpZzogSVNmdHBQbGlzdENvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFTU0hDbGllbnQuY2xpZW50LmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTU0gg5pyq6L+e5o6lJylcclxuICAgIH1cclxuICAgIGNvbnN0IGRpcmVjdG9yeU1vZGUgPSBjb25maWcuZGlyTW9kZSB8fCAnMDc1NSdcclxuICAgIGlmIChkaXJlY3RvcnlNb2RlICE9PSAnMDc1NScpIHtcclxuICAgICAgY29uc3QgZGlycyA9IGRpclBhdGguc3BsaXQoJy8nKVxyXG4gICAgICBsZXQgY3VycmVudFBhdGggPSAnJ1xyXG4gICAgICBmb3IgKGNvbnN0IGRpciBvZiBkaXJzKSB7XHJcbiAgICAgICAgaWYgKGRpcikge1xyXG4gICAgICAgICAgY3VycmVudFBhdGggKz0gYC8ke2Rpcn1gXHJcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBgbWtkaXIgXCIke2N1cnJlbnRQYXRofVwiICYmIGNobW9kICR7ZGlyZWN0b3J5TW9kZX0gXCIke2N1cnJlbnRQYXRofVwiYFxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5leGVjKHNjcmlwdClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGBjZCAvICYmIG1rZGlyIC1wIFwiJHtkaXJQYXRofVwiYFxyXG4gICAgICBhd2FpdCB0aGlzLmV4ZWMoc2NyaXB0KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNob3duIChyZW1vdGU6IHN0cmluZywgdXNlcjogc3RyaW5nLCBncm91cD86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmVtb3RlID0gdGhpcy5jaGFuZ2VXaW5TdHlsZVBhdGhUb1VuaXgocmVtb3RlKVxyXG4gICAgY29uc3QgW191c2VyLCBfZ3JvdXBdID0gZ3JvdXAgPyBbdXNlciwgZ3JvdXBdIDogdXNlci5pbmNsdWRlcygnOicpID8gdXNlci5zcGxpdCgnOicpIDogW3VzZXIsIHVzZXJdXHJcblxyXG4gICAgY29uc3Qgc2NyaXB0ID0gYGNob3duICR7X3VzZXJ9OiR7X2dyb3VwfSBcIiR7cmVtb3RlfVwiYFxyXG4gICAgcmV0dXJuIHRoaXMuZXhlYyhzY3JpcHQpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGV4ZWMgKHNjcmlwdDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgU1NIQ2xpZW50LmNsaWVudC5leGVjQ29tbWFuZChzY3JpcHQpXHJcbiAgICByZXR1cm4gZXhlY1Jlc3VsdC5jb2RlID09PSAwXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UgKCk6IHZvaWQge1xyXG4gICAgU1NIQ2xpZW50LmNsaWVudC5kaXNwb3NlKClcclxuICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gZmFsc2VcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNTSENsaWVudFxyXG4iLCJpbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGx1Z2luQ29uZmlnLCB0eXBlIElTZnRwUGxpc3RDb25maWcgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IHR5cGUgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgU1NIQ2xpZW50IGZyb20gJy4uLy4uL3V0aWxzL3NzaENsaWVudCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5cclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjb25zdCBzZnRwcGxpc3RDb25maWcgPSBjdHguZ2V0Q29uZmlnPElTZnRwUGxpc3RDb25maWc+KCdwaWNCZWQuc2Z0cHBsaXN0JylcclxuICBpZiAoIXNmdHBwbGlzdENvbmZpZykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGZpbmQgc2Z0cHBsaXN0IGNvbmZpZyEnKVxyXG4gIH1cclxuICBzZnRwcGxpc3RDb25maWcucG9ydCA9IE51bWJlcihzZnRwcGxpc3RDb25maWcucG9ydCkgfHwgMjJcclxuICBzZnRwcGxpc3RDb25maWcudXBsb2FkUGF0aCA9IChzZnRwcGxpc3RDb25maWcudXBsb2FkUGF0aCB8fCAnJykucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpICsgJy8nXHJcbiAgY29uc3Qgd2ViUGF0aCA9IChzZnRwcGxpc3RDb25maWcud2ViUGF0aCB8fCAnJykucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpICsgJy8nXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICAgIGlmIChpbWcuZmlsZU5hbWUgJiYgaW1nLmJ1ZmZlcikge1xyXG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB1cGxvYWRUZW1wUGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgJ3VwbG9hZFRlbXAnKVxyXG4gICAgICAgIGNvbnN0IGltZ1RlbXBQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCAnaW1nVGVtcCcsICdzZnRwcGxpc3QnKVxyXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmModXBsb2FkVGVtcFBhdGgpXHJcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhpbWdUZW1wUGF0aClcclxuICAgICAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSBwYXRoLmpvaW4odXBsb2FkVGVtcFBhdGgsIGltZy5maWxlTmFtZSlcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBGaWxlUGF0aCwgaW1hZ2UpXHJcbiAgICAgICAgY29uc3QgY2xpZW50ID0gU1NIQ2xpZW50Lmluc3RhbmNlXHJcbiAgICAgICAgYXdhaXQgY2xpZW50LmNvbm5lY3Qoc2Z0cHBsaXN0Q29uZmlnKVxyXG4gICAgICAgIGNvbnN0IHJlbW90ZVBhdGggPSBwYXRoLmpvaW4oYC8ke3NmdHBwbGlzdENvbmZpZy51cGxvYWRQYXRofWAucmVwbGFjZSgvXFwvXFwvKy9nLCAnLycpLCBpbWcuZmlsZU5hbWUpXHJcbiAgICAgICAgYXdhaXQgY2xpZW50LnVwbG9hZCh0ZW1wRmlsZVBhdGgsIHJlbW90ZVBhdGgsIHNmdHBwbGlzdENvbmZpZylcclxuICAgICAgICBzZnRwcGxpc3RDb25maWcuZmlsZVVzZXIgJiYgYXdhaXQgY2xpZW50LmNob3duKHJlbW90ZVBhdGgsIHNmdHBwbGlzdENvbmZpZy5maWxlVXNlcilcclxuICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICBjb25zdCBiYXNlVXJsID0gc2Z0cHBsaXN0Q29uZmlnLmN1c3RvbVVybCB8fCBzZnRwcGxpc3RDb25maWcuaG9zdFxyXG4gICAgICAgIGlmIChzZnRwcGxpc3RDb25maWcud2ViUGF0aCkge1xyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGAke2Jhc2VVcmx9LyR7d2ViUGF0aCA9PT0gJy8nID8gJycgOiBlbmNvZGVVUklDb21wb25lbnQod2ViUGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtiYXNlVXJsfS8ke3NmdHBwbGlzdENvbmZpZy51cGxvYWRQYXRoID09PSAnLycgPyAnJyA6IGVuY29kZVVSSUNvbXBvbmVudChzZnRwcGxpc3RDb25maWcudXBsb2FkUGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoaW1nLmZpbGVOYW1lKX1gLnJlcGxhY2UoLyUyRi9nLCAnLycpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZzLm1vdmVTeW5jKHRlbXBGaWxlUGF0aCwgcGF0aC5qb2luKGltZ1RlbXBQYXRoLCBpbWcuZmlsZU5hbWUpKVxyXG4gICAgICAgIGltZy5nYWxsZXJ5UGF0aCA9IGBodHRwOi8vbG9jYWxob3N0OjM2Njk5L3NmdHBwbGlzdC8ke2VuY29kZVVSSUNvbXBvbmVudChpbWcuZmlsZU5hbWUpfWBcclxuICAgICAgICBjbGllbnQuY2xvc2UoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTJylcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVNmdHBQbGlzdENvbmZpZz4oJ3BpY0JlZC5zZnRwcGxpc3QnKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnaG9zdCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX0hPU1QnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9IT1NUJylcclxuICAgICAgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5ob3N0IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BvcnQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9QT1JUJylcclxuICAgICAgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfUE9SVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucG9ydCB8fCAyMixcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAndXNlcm5hbWUnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9VU0VSTkFNRScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudXNlcm5hbWUgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGFzc3dvcmQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9QQVNTV09SRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGFzc3dvcmQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3ByaXZhdGVLZXknLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9QUklWQVRFS0VZJylcclxuICAgICAgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfUFJJVkFURUtFWScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucHJpdmF0ZUtleSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGFzc3BocmFzZScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1BSSVZBVEVLRVlfUEFTU1BIUkFTRScpXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX1BSSVZBVEVLRVlfUEFTU1BIUkFTRScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGFzc3BocmFzZSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAndXBsb2FkUGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1VQTE9BRFBBVEgnKVxyXG4gICAgICB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9VUExPQURQQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy51cGxvYWRQYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9DVVNUT01VUkwnKVxyXG4gICAgICB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmN1c3RvbVVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnd2ViUGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1dFQlNJVEVfUEFUSCcpXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX1dFQlNJVEVfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcud2ViUGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnZmlsZVVzZXInLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9GSUxFX1VTRVInKVxyXG4gICAgICB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9GSUxFX1VTRVInKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmZpbGVVc2VyIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdmaWxlTW9kZScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0ZJTEVfTU9ERScpXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX0ZJTEVfTU9ERScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuZmlsZU1vZGUgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2Rpck1vZGUnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9ESVJfTU9ERScpXHJcbiAgICAgIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUX0RJUl9NT0RFJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5kaXJNb2RlIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdzZnRwcGxpc3QnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfU0ZUUFBMSVNUJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBsdWdpbkNvbmZpZywgdHlwZSBJVGVsZWdyYXBoQ29uZmlnLCB0eXBlIElPbGRSZXFPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgdHlwZSB7IFJlYWRTdHJlYW0gfSBmcm9tICdmcydcclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gYXN5bmMgKG9wdGlvbnM6IElUZWxlZ3JhcGhDb25maWcsIGltYWdlOiBSZWFkU3RyZWFtKTogUHJvbWlzZTxJT2xkUmVxT3B0aW9ucz4gPT4ge1xyXG4gIGNvbnN0IHJlcXVlc3RPcHRpb25zOiBJT2xkUmVxT3B0aW9ucyA9IHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgdXJsOiAnaHR0cHM6Ly90ZWxlZ3JhLnBoL3VwbG9hZCcsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgICdjb250ZW50LXR5cGUnOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSdcclxuICAgIH0sXHJcbiAgICBmb3JtRGF0YToge1xyXG4gICAgICBmaWxlOiBpbWFnZVxyXG4gICAgfVxyXG4gIH1cclxuICBpZiAob3B0aW9ucy5wcm94eSkge1xyXG4gICAgcmVxdWVzdE9wdGlvbnMucHJveHkgPSBvcHRpb25zLnByb3h5XHJcbiAgfVxyXG4gIHJldHVybiByZXF1ZXN0T3B0aW9uc1xyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGxldCB0Z09wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElUZWxlZ3JhcGhDb25maWc+KCdwaWNCZWQudGVsZWdyYXBocGxpc3QnKVxyXG4gIGlmICghdGdPcHRpb25zKSB7XHJcbiAgICB0Z09wdGlvbnMgPSB7fVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVwbG9hZFRlbXBQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCAndXBsb2FkVGVtcCcpXHJcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyh1cGxvYWRUZW1wUGF0aClcclxuICAgICAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSBwYXRoLmpvaW4odXBsb2FkVGVtcFBhdGgsIGltZy5maWxlTmFtZSlcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBGaWxlUGF0aCwgaW1hZ2UpXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHBvc3RPcHRpb25zKHRnT3B0aW9ucywgZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZW1wRmlsZVBhdGgpKVxyXG4gICAgICAgIGNvbnN0IHJlczogc3RyaW5nID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICBjb25zdCBib2R5ID0gdHlwZW9mIHJlcyA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHJlcykgOiByZXNcclxuICAgICAgICBmcy5yZW1vdmUodGVtcEZpbGVQYXRoKVxyXG4gICAgICAgIGlmIChib2R5Py5bMF0/LnNyYykge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgaHR0cHM6Ly90ZWxlZ3JhLnBoJHtib2R5WzBdLnNyY31gXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2VydmVyIGVycm9yLCBwbGVhc2UgdHJ5IGFnYWluJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLJyksXHJcbiAgICAgIHRleHQ6ICcnXHJcbiAgICB9KVxyXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzdHJpbmcgfCBJRXJyb3JcclxuICAgIHRocm93IGVycj8ucmVzcG9uc2U/LmRhdGEgfHwgZXJyXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjb25maWcgPSAoY3R4OiBJUGljR28pOiBJUGx1Z2luQ29uZmlnW10gPT4ge1xyXG4gIGNvbnN0IHVzZXJDb25maWcgPSBjdHguZ2V0Q29uZmlnPElUZWxlZ3JhcGhDb25maWc+KCdwaWNCZWQudGVsZWdyYXBocGxpc3QnKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAncHJveHknLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9QUk9YWScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfUFJPWFknKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucHJveHkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ3RlbGVncmFwaHBsaXN0Jywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTEVHUkFQSCcpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcbmltcG9ydCB0eXBlIHsgSVBpY0xpc3RDb25maWcsIElQaWNHbywgSVBsdWdpbkNvbmZpZywgSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyB0eXBlIElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbmNvbnN0IHBvc3RPcHRpb25zID0gKG9wdGlvbnM6IElQaWNMaXN0Q29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCBpbWFnZTogQnVmZmVyKTogSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlID0+IHtcclxuICBjb25zdCBob3N0ID0gb3B0aW9ucy5ob3N0IHx8ICcxMjcuMC4wLjEnXHJcbiAgY29uc3QgcG9ydCA9IG9wdGlvbnMucG9ydCB8fCAzNjY3N1xyXG4gIGNvbnN0IHBpY2JlZCA9IG9wdGlvbnMucGljYmVkIHx8ICcnXHJcbiAgY29uc3QgY29uZmlnTmFtZSA9IG9wdGlvbnMuY29uZmlnTmFtZSB8fCAnRGVmYXVsdCdcclxuICBjb25zdCBzZXJ2ZXJLZXkgPSBvcHRpb25zLnNlcnZlcktleSB8fCAnJ1xyXG4gIGxldCB1cmwgPSBgaHR0cDovLyR7aG9zdH06JHtwb3J0fS91cGxvYWQ/Y29uZmlnTmFtZT0ke2NvbmZpZ05hbWV9YFxyXG4gIGlmIChwaWNiZWQpIHtcclxuICAgIHVybCArPSBgJnBpY2JlZD0ke3BpY2JlZH1gXHJcbiAgfVxyXG4gIGlmIChzZXJ2ZXJLZXkpIHtcclxuICAgIHVybCArPSBgJmtleT0ke3NlcnZlcktleX1gXHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgIHVybCxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJ1xyXG4gICAgfSxcclxuICAgIGZvcm1EYXRhOiB7XHJcbiAgICAgIGZpbGU6IHtcclxuICAgICAgICB2YWx1ZTogaW1hZ2UsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgZmlsZW5hbWU6IGZpbGVOYW1lLFxyXG4gICAgICAgICAgY29udGVudFR5cGU6IG1pbWUubG9va3VwKGZpbGVOYW1lKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbyB8IGJvb2xlYW4+ID0+IHtcclxuICBjb25zdCBwaWNsaXN0T3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SVBpY0xpc3RDb25maWc+KCdwaWNCZWQucGljbGlzdCcpXHJcbiAgaWYgKCFwaWNsaXN0T3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgUGljTGlzdCBjb25maWcnKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhwaWNsaXN0T3B0aW9ucywgaW1nLmZpbGVOYW1lLCBpbWFnZSlcclxuXHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3Qob3B0aW9ucylcclxuICAgICAgICAgIC50aGVuKChyZXM6IGFueSkgPT4gcmVzKVxyXG4gICAgICAgICAgLmNhdGNoKChlcnI6IEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogNDAwLFxyXG4gICAgICAgICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgICAgICAgIG1zZzogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQVVUSF9GQUlMRUQnKSxcclxuICAgICAgICAgICAgICAgIGVyclxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwMCAmJiByZXMuYm9keT8uc3VjY2Vzcykge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSByZXMuYm9keS5yZXN1bHRbMF1cclxuICAgICAgICAgIGltZy5mdWxsUmVzdWx0ID0gcmVzLmJvZHkuZnVsbFJlc3VsdFswXVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzLmJvZHkubWVzc2FnZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1MnKVxyXG4gICAgfSlcclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJUGljTGlzdENvbmZpZz4oJ3BpY0JlZC5waWNsaXN0JykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2hvc3QnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1BJQ0xJU1RfSE9TVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuaG9zdCB8fCAnMTI3LjAuMC4xJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdwb3J0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9QSUNMSVNUX1BPUlQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBvcnQgfHwgMzY2NzcsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BpY2JlZCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUElDTElTVF9QSUNCRUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnBpY2JlZCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY29uZmlnTmFtZScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUElDTElTVF9DT05GSUdOQU1FJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5jb25maWdOYW1lIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdzZXJ2ZXJLZXknLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1BJQ0xJU1RfS0VZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zZXJ2ZXJLZXkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ3BpY2xpc3QnLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUElDTElTVCcpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQaWNHb1BsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgU01NU1VwbG9hZGVyIGZyb20gJy4vc21tcydcclxuaW1wb3J0IHRjWXVuVXBsb2FkZXIgZnJvbSAnLi90Y3l1bidcclxuaW1wb3J0IGdpdGh1YlVwbG9hZGVyIGZyb20gJy4vZ2l0aHViJ1xyXG5pbXBvcnQgcWluaXVVcGxvYWRlciBmcm9tICcuL3Fpbml1J1xyXG5pbXBvcnQgaW1ndXJVcGxvYWRlciBmcm9tICcuL2ltZ3VyJ1xyXG5pbXBvcnQgYWxpWXVuVXBsb2FkZXIgZnJvbSAnLi9hbGl5dW4nXHJcbmltcG9ydCB1cFl1blVwbG9hZGVyIGZyb20gJy4vdXB5dW4nXHJcbmltcG9ydCB3ZWJkYXZwbGlzdFVwbG9hZGVyIGZyb20gJy4vd2ViZGF2J1xyXG5pbXBvcnQgbG9jYWxVcGxvYWRlciBmcm9tICcuL2xvY2FsJ1xyXG5pbXBvcnQgc2Z0cFVwbG9hZGVyIGZyb20gJy4vc2Z0cCdcclxuaW1wb3J0IHRlbGVncmFwaFVwbG9hZGVyIGZyb20gJy4vdGVsZWdyYXBoJ1xyXG5pbXBvcnQgcGljbGlzdFVwbG9hZGVyIGZyb20gJy4vcGljbGlzdCdcclxuXHJcbmNvbnN0IGJ1aWxkSW5VcGxvYWRlcnM6IElQaWNHb1BsdWdpbiA9ICgpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgcmVnaXN0ZXIgKGN0eDogSVBpY0dvKSB7XHJcbiAgICAgIGFsaVl1blVwbG9hZGVyKGN0eClcclxuICAgICAgdGNZdW5VcGxvYWRlcihjdHgpXHJcbiAgICAgIFNNTVNVcGxvYWRlcihjdHgpXHJcbiAgICAgIGdpdGh1YlVwbG9hZGVyKGN0eClcclxuICAgICAgcWluaXVVcGxvYWRlcihjdHgpXHJcbiAgICAgIGltZ3VyVXBsb2FkZXIoY3R4KVxyXG4gICAgICB1cFl1blVwbG9hZGVyKGN0eClcclxuICAgICAgd2ViZGF2cGxpc3RVcGxvYWRlcihjdHgpXHJcbiAgICAgIGxvY2FsVXBsb2FkZXIoY3R4KVxyXG4gICAgICBzZnRwVXBsb2FkZXIoY3R4KVxyXG4gICAgICB0ZWxlZ3JhcGhVcGxvYWRlcihjdHgpXHJcbiAgICAgIHBpY2xpc3RVcGxvYWRlcihjdHgpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBidWlsZEluVXBsb2FkZXJzXHJcbiIsImltcG9ydCB7XHJcbiAgaXNVcmwsXHJcbiAgZ2V0SW1hZ2VTaXplLFxyXG4gIGdldEZTRmlsZSxcclxuICBnZXRVUkxGaWxlXHJcbn0gZnJvbSAnLi4vLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgeyB0eXBlIElQaWNHbywgdHlwZSBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbywgdHlwZSBJSW1nSW5mbywgdHlwZSBJSW1nU2l6ZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHJlc3VsdHM6IElJbWdJbmZvW10gPSBjdHgub3V0cHV0XHJcbiAgYXdhaXQgUHJvbWlzZS5hbGwoY3R4LmlucHV0Lm1hcChhc3luYyAoaXRlbTogc3RyaW5nIHwgQnVmZmVyLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICBsZXQgaW5mbzogSVBhdGhUcmFuc2Zvcm1lZEltZ0luZm9cclxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoaXRlbSkpIHtcclxuICAgICAgaW5mbyA9IHtcclxuICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgIGJ1ZmZlcjogaXRlbSxcclxuICAgICAgICBmaWxlTmFtZTogJycsXHJcbiAgICAgICAgZXh0bmFtZTogJydcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChpc1VybChpdGVtKSkge1xyXG4gICAgICBpbmZvID0gYXdhaXQgZ2V0VVJMRmlsZShpdGVtLCBjdHgpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpbmZvID0gYXdhaXQgZ2V0RlNGaWxlKGl0ZW0pXHJcbiAgICB9XHJcbiAgICBpZiAoaW5mby5zdWNjZXNzICYmIGluZm8uYnVmZmVyKSB7XHJcbiAgICAgIGNvbnN0IGltZ1NpemUgPSBnZXRJbWdTaXplKGN0eCwgaW5mby5idWZmZXIsIGl0ZW0pXHJcbiAgICAgIGNvbnN0IGV4dG5hbWUgPSBpbmZvLmV4dG5hbWUgfHwgaW1nU2l6ZS5leHRuYW1lIHx8ICcucG5nJ1xyXG4gICAgICByZXN1bHRzW2luZGV4XSA9IHtcclxuICAgICAgICBidWZmZXI6IGluZm8uYnVmZmVyLFxyXG4gICAgICAgIGZpbGVOYW1lOiBpbmZvLmZpbGVOYW1lIHx8IGAke2RheWpzKCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpfSR7ZXh0bmFtZX19YCxcclxuICAgICAgICB3aWR0aDogaW1nU2l6ZS53aWR0aCxcclxuICAgICAgICBoZWlnaHQ6IGltZ1NpemUuaGVpZ2h0LFxyXG4gICAgICAgIGV4dG5hbWU6IGluZm8uZXh0bmFtZVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjdHgubG9nLmVycm9yKGluZm8ucmVhc29uKVxyXG4gICAgfVxyXG4gIH0pKVxyXG4gIC8vIHJlbW92ZSBlbXB0eSBpdGVtXHJcbiAgY3R4Lm91dHB1dCA9IHJlc3VsdHMuZmlsdGVyKGl0ZW0gPT4gaXRlbSlcclxuICByZXR1cm4gY3R4XHJcbn1cclxuXHJcbmNvbnN0IGdldEltZ1NpemUgPSAoY3R4OiBJUGljR28sIGZpbGU6IEJ1ZmZlciwgcGF0aDogc3RyaW5nIHwgQnVmZmVyKTogSUltZ1NpemUgPT4ge1xyXG4gIGNvbnN0IGltYWdlU2l6ZSA9IGdldEltYWdlU2l6ZShmaWxlKVxyXG4gIGlmICghaW1hZ2VTaXplLnJlYWwpIHtcclxuICAgIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgY3R4LmxvZy53YXJuKGBjYW4ndCBnZXQgJHtwYXRofSdzIGltYWdlIHNpemVgKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3R4LmxvZy53YXJuKCdjYW5cXCd0IGdldCBpbWFnZSBzaXplJylcclxuICAgIH1cclxuICAgIGN0eC5sb2cud2FybignZmFsbGJhY2sgdG8gMjAwICogMjAwJylcclxuICB9XHJcbiAgcmV0dXJuIGltYWdlU2l6ZVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgaGFuZGxlXHJcbn1cclxuIiwiaW1wb3J0IHsgdHlwZSBJUGljR28gfSBmcm9tICcuLi8uLi90eXBlcydcclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjdHgub3V0cHV0LnB1c2goLi4uY3R4LmlucHV0KVxyXG4gIHJldHVybiBjdHhcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIGhhbmRsZVxyXG59XHJcbiIsImltcG9ydCB7IHR5cGUgSVBpY0dvLCB0eXBlIElQaWNHb1BsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgSW1nRnJvbVBhdGggZnJvbSAnLi9wYXRoJ1xyXG5pbXBvcnQgSW1nRnJvbUJhc2U2NCBmcm9tICcuL2Jhc2U2NCdcclxuXHJcbmNvbnN0IGJ1aWxkSW5UcmFuc2Zvcm1lcnM6IElQaWNHb1BsdWdpbiA9ICgpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgcmVnaXN0ZXIgKGN0eDogSVBpY0dvKSB7XHJcbiAgICAgIGN0eC5oZWxwZXIudHJhbnNmb3JtZXIucmVnaXN0ZXIoJ3BhdGgnLCBJbWdGcm9tUGF0aClcclxuICAgICAgY3R4LmhlbHBlci50cmFuc2Zvcm1lci5yZWdpc3RlcignYmFzZTY0JywgSW1nRnJvbUJhc2U2NClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGJ1aWxkSW5UcmFuc2Zvcm1lcnNcclxuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgcmVzb2x2ZSBmcm9tICdyZXNvbHZlJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSVBpY0dvUGx1Z2luLCB0eXBlIElQbHVnaW5Mb2FkZXIsIHR5cGUgSVBpY0dvUGx1Z2luSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnXHJcbmltcG9ydCB7IHNldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSAnLi9MaWZlY3ljbGVQbHVnaW5zJ1xyXG5cclxuLyoqXHJcbiAqIExvY2FsIHBsdWdpbiBsb2FkZXIsIGZpbGUgc3lzdGVtIGlzIHJlcXVpcmVkXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGx1Z2luTG9hZGVyIGltcGxlbWVudHMgSVBsdWdpbkxvYWRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgbGlzdDogc3RyaW5nW10gPSBbXVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZnVsbExpc3QgPSBuZXcgU2V0PHN0cmluZz4oKVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTWFwID0gbmV3IE1hcDxzdHJpbmcsIElQaWNHb1BsdWdpbkludGVyZmFjZT4oKVxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMuaW5pdCgpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQgKCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgJ3BhY2thZ2UuanNvbicpXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZVBhdGgpKSB7XHJcbiAgICAgIGNvbnN0IHBrZyA9IHtcclxuICAgICAgICBuYW1lOiAncGljZ28tcGx1Z2lucycsXHJcbiAgICAgICAgZGVzY3JpcHRpb246ICdwaWNnby1wbHVnaW5zJyxcclxuICAgICAgICByZXBvc2l0b3J5OiAnaHR0cHM6Ly9naXRodWIuY29tL1BpY0dvL1BpY0dvLUNvcmUnLFxyXG4gICAgICAgIGxpY2Vuc2U6ICdNSVQnXHJcbiAgICAgIH1cclxuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYWNrYWdlUGF0aCwgSlNPTi5zdHJpbmdpZnkocGtnKSwgJ3V0ZjgnKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IHBsdWdpbiBlbnRyeVxyXG4gIHByaXZhdGUgcmVzb2x2ZVBsdWdpbiAoY3R4OiBJUGljR28sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gcmVzb2x2ZS5zeW5jKG5hbWUsIHsgYmFzZWRpcjogY3R4LmJhc2VEaXIgfSlcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICByZXR1cm4gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCAnbm9kZV9tb2R1bGVzJywgbmFtZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGxvYWQgYWxsIHRoaXJkIHBhcnR5IHBsdWdpblxyXG4gIGxvYWQgKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgJ3BhY2thZ2UuanNvbicpXHJcbiAgICBjb25zdCBwbHVnaW5EaXIgPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgJ25vZGVfbW9kdWxlcy8nKVxyXG4gICAgLy8gVGhhbmtzIHRvIGhleG8gLT4gaHR0cHM6Ly9naXRodWIuY29tL2hleG9qcy9oZXhvL2Jsb2IvbWFzdGVyL2xpYi9oZXhvL2xvYWRfcGx1Z2lucy5qc1xyXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBsdWdpbkRpcikpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBjb25zdCBqc29uID0gZnMucmVhZEpTT05TeW5jKHBhY2thZ2VQYXRoKVxyXG4gICAgY29uc3QgZGVwcyA9IE9iamVjdC5rZXlzKGpzb24uZGVwZW5kZW5jaWVzIHx8IHt9KVxyXG4gICAgY29uc3QgZGV2RGVwcyA9IE9iamVjdC5rZXlzKGpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9KVxyXG4gICAgY29uc3QgbW9kdWxlcyA9IGRlcHMuY29uY2F0KGRldkRlcHMpLmZpbHRlcigobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmICghL15waWNnby1wbHVnaW4tfF5AW14vXStcXC9waWNnby1wbHVnaW4tLy50ZXN0KG5hbWUpKSByZXR1cm4gZmFsc2VcclxuICAgICAgY29uc3QgcGF0aCA9IHRoaXMucmVzb2x2ZVBsdWdpbih0aGlzLmN0eCwgbmFtZSlcclxuICAgICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aClcclxuICAgIH0pXHJcbiAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJQbHVnaW4obW9kdWxlKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyUGx1Z2luIChuYW1lOiBzdHJpbmcsIHBsdWdpbj86IElQaWNHb1BsdWdpbik6IHZvaWQge1xyXG4gICAgaWYgKCFuYW1lIHx8IHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xyXG4gICAgICB0aGlzLmN0eC5sb2cud2FybignUGxlYXNlIHByb3ZpZGUgdmFsaWQgcGx1Z2luJylcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLmZ1bGxMaXN0LmFkZChuYW1lKVxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gcmVnaXN0ZXIgbG9jYWwgcGx1Z2luXHJcbiAgICAgIGlmICghcGx1Z2luKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7bmFtZX1gKSA9PT0gdHJ1ZSB8fCAodGhpcy5jdHguZ2V0Q29uZmlnKGBwaWNnb1BsdWdpbnMuJHtuYW1lfWApID09PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICB0aGlzLmxpc3QucHVzaChuYW1lKVxyXG4gICAgICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUobmFtZSlcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgICAgICB0aGlzLmdldFBsdWdpbihuYW1lKSEucmVnaXN0ZXIodGhpcy5jdHgpXHJcbiAgICAgICAgICBjb25zdCBwbHVnaW4gPSBgcGljZ29QbHVnaW5zWyR7bmFtZX1dYFxyXG4gICAgICAgICAgdGhpcy5jdHguc2F2ZUNvbmZpZyhcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFtwbHVnaW5dOiB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gcmVnaXN0ZXIgcHJvdmlkZWQgcGx1Z2luXHJcbiAgICAgICAgLy8gJiYgd29uJ3Qgd3JpdGUgY29uZmlnIHRvIGZpbGVzXHJcbiAgICAgICAgdGhpcy5saXN0LnB1c2gobmFtZSlcclxuICAgICAgICBzZXRDdXJyZW50UGx1Z2luTmFtZShuYW1lKVxyXG4gICAgICAgIGNvbnN0IHBsdWdpbkludGVyZmFjZSA9IHBsdWdpbih0aGlzLmN0eClcclxuICAgICAgICB0aGlzLnBsdWdpbk1hcC5zZXQobmFtZSwgcGx1Z2luSW50ZXJmYWNlKVxyXG4gICAgICAgIHBsdWdpbkludGVyZmFjZS5yZWdpc3Rlcih0aGlzLmN0eClcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB0aGlzLnBsdWdpbk1hcC5kZWxldGUobmFtZSlcclxuICAgICAgdGhpcy5saXN0ID0gdGhpcy5saXN0LmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSBuYW1lKVxyXG4gICAgICB0aGlzLmZ1bGxMaXN0LmRlbGV0ZShuYW1lKVxyXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSBhcyBFcnJvcilcclxuICAgICAgdGhpcy5jdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgIHRpdGxlOiBgUGx1Z2luICR7bmFtZX0gTG9hZCBFcnJvcmAsXHJcbiAgICAgICAgYm9keTogZVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlclBsdWdpbiAobmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmxpc3QgPSB0aGlzLmxpc3QuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09IG5hbWUpXHJcbiAgICB0aGlzLmZ1bGxMaXN0LmRlbGV0ZShuYW1lKVxyXG4gICAgdGhpcy5wbHVnaW5NYXAuZGVsZXRlKG5hbWUpXHJcbiAgICBzZXRDdXJyZW50UGx1Z2luTmFtZShuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLnVwbG9hZGVyLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci50cmFuc2Zvcm1lci51bnJlZ2lzdGVyKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5oZWxwZXIuYmVmb3JlVHJhbnNmb3JtUGx1Z2lucy51bnJlZ2lzdGVyKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5oZWxwZXIuYmVmb3JlVXBsb2FkUGx1Z2lucy51bnJlZ2lzdGVyKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5oZWxwZXIuYWZ0ZXJVcGxvYWRQbHVnaW5zLnVucmVnaXN0ZXIobmFtZSlcclxuICAgIHRoaXMuY3R4LmNtZC51bnJlZ2lzdGVyKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5yZW1vdmVDb25maWcoJ3BpY2dvUGx1Z2lucycsIG5hbWUpXHJcbiAgfVxyXG5cclxuICAvLyBnZXQgcGx1Z2luIGJ5IG5hbWVcclxuICBnZXRQbHVnaW4gKG5hbWU6IHN0cmluZyk6IElQaWNHb1BsdWdpbkludGVyZmFjZSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodGhpcy5wbHVnaW5NYXAuaGFzKG5hbWUpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBsdWdpbk1hcC5nZXQobmFtZSlcclxuICAgIH1cclxuICAgIGNvbnN0IHBsdWdpbkRpciA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAnbm9kZV9tb2R1bGVzLycpXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xyXG4gICAgY29uc3QgcGx1Z2luID0gcmVxdWlyZShwbHVnaW5EaXIgKyBuYW1lKSh0aGlzLmN0eClcclxuICAgIHRoaXMucGx1Z2luTWFwLnNldChuYW1lLCBwbHVnaW4pXHJcbiAgICByZXR1cm4gcGx1Z2luXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgZW5hYmxlZCBwbHVnaW5zXHJcbiAgICovXHJcbiAgZ2V0TGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMubGlzdFxyXG4gIH1cclxuXHJcbiAgaGFzUGx1Z2luIChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZ1bGxMaXN0LmhhcyhuYW1lKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBmdWxsIGxpc3Qgb2YgcGx1Z2lucywgd2hldGhlciBpdCBpcyBlbmFibGVkIG9yIG5vdFxyXG4gICAqL1xyXG4gIGdldEZ1bGxMaXN0ICgpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMuZnVsbExpc3RdXHJcbiAgfVxyXG59XHJcbmV4cG9ydCBkZWZhdWx0IFBsdWdpbkxvYWRlclxyXG4iLCJleHBvcnQgY29uc3QgQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUiA9ICdwaWNsaXN0LWNsaXBib2FyZC1pbWFnZXMnXHJcbiIsImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2VzcydcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xyXG5pbXBvcnQgb3MgZnJvbSAnb3MnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IGlzV3NsIGZyb20gJ2lzLXdzbCdcclxuaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgSUNsaXBib2FyZEltYWdlIH0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuL2VudW0nXHJcbmltcG9ydCBtYWNDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvbWFjLmFwcGxlc2NyaXB0J1xyXG5pbXBvcnQgd2luZG93c0NsaXBib2FyZFNjcmlwdCBmcm9tICcuL2NsaXBib2FyZC93aW5kb3dzLnBzMSdcclxuaW1wb3J0IHdpbmRvd3MxMENsaXBib2FyZFNjcmlwdCBmcm9tICcuL2NsaXBib2FyZC93aW5kb3dzMTAucHMxJ1xyXG5pbXBvcnQgbGludXhDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvbGludXguc2gnXHJcbmltcG9ydCB3c2xDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvd3NsLnNoJ1xyXG5pbXBvcnQgeyBDTElQQk9BUkRfSU1BR0VfRk9MREVSIH0gZnJvbSAnLi9zdGF0aWMnXHJcblxyXG5leHBvcnQgdHlwZSBQbGF0Zm9ybSA9ICdkYXJ3aW4nIHwgJ3dpbjMyJyB8ICd3aW4xMCcgfCAnbGludXgnIHwgJ3dzbCdcclxuXHJcbmNvbnN0IGdldEN1cnJlbnRQbGF0Zm9ybSA9ICgpOiBQbGF0Zm9ybSA9PiB7XHJcbiAgY29uc3QgcGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtXHJcbiAgaWYgKGlzV3NsKSB7XHJcbiAgICByZXR1cm4gJ3dzbCdcclxuICB9XHJcbiAgaWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcbiAgICBjb25zdCBjdXJyZW50T1MgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKVswXVxyXG4gICAgaWYgKGN1cnJlbnRPUyA9PT0gJzEwJykge1xyXG4gICAgICByZXR1cm4gJ3dpbjEwJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICd3aW4zMidcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnZGFyd2luJykge1xyXG4gICAgcmV0dXJuICdkYXJ3aW4nXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiAnbGludXgnXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBwbGF0Zm9ybTJTY3JpcHRDb250ZW50OiB7XHJcbiAgW2tleSBpbiBQbGF0Zm9ybV06IHN0cmluZ1xyXG59ID0ge1xyXG4gIGRhcndpbjogbWFjQ2xpcGJvYXJkU2NyaXB0LFxyXG4gIHdpbjMyOiB3aW5kb3dzQ2xpcGJvYXJkU2NyaXB0LFxyXG4gIHdpbjEwOiB3aW5kb3dzMTBDbGlwYm9hcmRTY3JpcHQsXHJcbiAgbGludXg6IGxpbnV4Q2xpcGJvYXJkU2NyaXB0LFxyXG4gIHdzbDogd3NsQ2xpcGJvYXJkU2NyaXB0XHJcbn1cclxuLyoqXHJcbiAqIHBvd2Vyc2hlbGwgd2lsbCByZXBvcnQgZXJyb3IgaWYgZmlsZSBkb2VzIG5vdCBoYXZlIGEgJy5wczEnIGV4dGVuc2lvbixcclxuICogc28gd2Ugc2hvdWxkIGtlZXAgdGhlIGV4dGVuc2lvbiBuYW1lIGNvbnNpc3RlbnQgd2l0aCBjb3JyZXNwb25kaW5nIHNoZWxsXHJcbiAqL1xyXG5jb25zdCBwbGF0Zm9ybTJTY3JpcHRGaWxlbmFtZToge1xyXG4gIFtrZXkgaW4gUGxhdGZvcm1dOiBzdHJpbmdcclxufSA9IHtcclxuICBkYXJ3aW46ICdtYWMuYXBwbGVzY3JpcHQnLFxyXG4gIHdpbjMyOiAnd2luZG93cy5wczEnLFxyXG4gIHdpbjEwOiAnd2luZG93czEwLnBzMScsXHJcbiAgbGludXg6ICdsaW51eC5zaCcsXHJcbiAgd3NsOiAnd3NsLnNoJ1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVJbWFnZUZvbGRlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjb25zdCBpbWFnZVBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsIENMSVBCT0FSRF9JTUFHRV9GT0xERVIpXHJcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGltYWdlUGF0aCkpIHtcclxuICAgIGZzLm1rZGlyU3luYyhpbWFnZVBhdGgpXHJcbiAgfVxyXG59XHJcblxyXG4vLyBUaGFua3MgdG8gdnMtcGljZ286IGh0dHBzOi8vZ2l0aHViLmNvbS9TcGFkZXMtUy92cy1waWNnby9ibG9iL21hc3Rlci9zcmMvZXh0ZW5zaW9uLnRzXHJcbmNvbnN0IGdldENsaXBib2FyZEltYWdlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJQ2xpcGJvYXJkSW1hZ2U+ID0+IHtcclxuICBjcmVhdGVJbWFnZUZvbGRlcihjdHgpXHJcbiAgLy8gYWRkIGFuIGNsaXBib2FyZCBpbWFnZSBmb2xkZXIgdG8gY29udHJvbCB0aGUgaW1hZ2UgY2FjaGUgZmlsZVxyXG4gIGNvbnN0IGltYWdlUGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUiwgYCR7ZGF5anMoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJyl9LnBuZ2ApXHJcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPElDbGlwYm9hcmRJbWFnZT4oKHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpOiB2b2lkID0+IHtcclxuICAgIGNvbnN0IHBsYXRmb3JtID0gZ2V0Q3VycmVudFBsYXRmb3JtKClcclxuICAgIGNvbnN0IHNjcmlwdFBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsIHBsYXRmb3JtMlNjcmlwdEZpbGVuYW1lW3BsYXRmb3JtXSlcclxuICAgIC8vIElmIHRoZSBzY3JpcHQgZG9lcyBub3QgZXhpc3QgeWV0LCB3ZSBuZWVkIHRvIHdyaXRlIHRoZSBjb250ZW50IHRvIHRoZSBzY3JpcHQgZmlsZVxyXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHNjcmlwdFBhdGgpKSB7XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXHJcbiAgICAgICAgc2NyaXB0UGF0aCxcclxuICAgICAgICBwbGF0Zm9ybTJTY3JpcHRDb250ZW50W3BsYXRmb3JtXSxcclxuICAgICAgICAndXRmOCdcclxuICAgICAgKVxyXG4gICAgfVxyXG4gICAgbGV0IGV4ZWN1dGlvblxyXG4gICAgaWYgKHBsYXRmb3JtID09PSAnZGFyd2luJykge1xyXG4gICAgICBleGVjdXRpb24gPSBzcGF3bignb3Nhc2NyaXB0JywgW3NjcmlwdFBhdGgsIGltYWdlUGF0aF0pXHJcbiAgICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnd2luMzInIHx8IHBsYXRmb3JtID09PSAnd2luMTAnKSB7XHJcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKCdwb3dlcnNoZWxsJywgW1xyXG4gICAgICAgICctbm9wcm9maWxlJyxcclxuICAgICAgICAnLW5vbmludGVyYWN0aXZlJyxcclxuICAgICAgICAnLW5vbG9nbycsXHJcbiAgICAgICAgJy1zdGEnLFxyXG4gICAgICAgICctZXhlY3V0aW9ucG9saWN5JywgJ3VucmVzdHJpY3RlZCcsXHJcbiAgICAgICAgLy8gZml4IHdpbmRvd3MgMTAgbmF0aXZlIGNtZCBjcmFzaCBidWcgd2hlbiBcInBpY2dvIHVwbG9hZFwiXHJcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1BpY0dvL1BpY0dvLUNvcmUvaXNzdWVzLzMyXHJcbiAgICAgICAgLy8gJy13aW5kb3dzdHlsZScsJ2hpZGRlbicsXHJcbiAgICAgICAgLy8gJy1ub2V4aXQnLFxyXG4gICAgICAgICctZmlsZScsIHNjcmlwdFBhdGgsXHJcbiAgICAgICAgaW1hZ2VQYXRoXHJcbiAgICAgIF0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBleGVjdXRpb24gPSBzcGF3bignc2gnLCBbc2NyaXB0UGF0aCwgaW1hZ2VQYXRoXSlcclxuICAgIH1cclxuXHJcbiAgICBleGVjdXRpb24uc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xyXG4gICAgICBpZiAocGxhdGZvcm0gPT09ICdsaW51eCcpIHtcclxuICAgICAgICBpZiAoZGF0YS50b1N0cmluZygpLnRyaW0oKSA9PT0gJ25vIHhjbGlwIG9yIHdsLWNsaXBib2FyZCcpIHtcclxuICAgICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgICAgIHRpdGxlOiAneGNsaXAgb3Igd2wtY2xpcGJvYXJkIG5vdCBmb3VuZCcsXHJcbiAgICAgICAgICAgIGJvZHk6ICdQbGVhc2UgaW5zdGFsbCB4Y2xpcChmb3IgeDExKSBvciB3bC1jbGlwYm9hcmQoZm9yIHdheWxhbmQpIGJlZm9yZSBydW4gcGljZ28nXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ1BsZWFzZSBpbnN0YWxsIHhjbGlwKGZvciB4MTEpIG9yIHdsLWNsaXBib2FyZChmb3Igd2F5bGFuZCkgYmVmb3JlIHJ1biBwaWNnbycpKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpbWdQYXRoID0gZGF0YS50b1N0cmluZygpLnRyaW0oKVxyXG5cclxuICAgICAgLy8gaWYgdGhlIGZpbGVQYXRoIGlzIHRoZSByZWFsIGZpbGUgaW4gc3lzdGVtXHJcbiAgICAgIC8vIHdlIHNob3VsZCBrZWVwIGl0IGluc3RlYWQgb2YgcmVtb3ZpbmdcclxuICAgICAgbGV0IHNob3VsZEtlZXBBZnRlclVwbG9hZGluZyA9IGZhbHNlXHJcblxyXG4gICAgICAvLyBpbiBtYWNPUyBpZiB5b3VyIGNvcHkgdGhlIGZpbGUgaW4gc3lzdGVtLCBpdCdzIGJhc2VuYW1lIHdpbGwgbm90IGVxdWFsIHRvIG91ciBkZWZhdWx0IGJhc2VuYW1lXHJcbiAgICAgIGlmIChwYXRoLmJhc2VuYW1lKGltZ1BhdGgpICE9PSBwYXRoLmJhc2VuYW1lKGltYWdlUGF0aCkpIHtcclxuICAgICAgICAvLyBpZiB0aGUgcGF0aCBpcyBub3QgZ2VuZXJhdGUgYnkgcGljZ29cclxuICAgICAgICAvLyBidXQgdGhlIHBhdGggZXhpc3RzLCB3ZSBzaG91bGQga2VlcCBpdFxyXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGltZ1BhdGgpKSB7XHJcbiAgICAgICAgICBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcgPSB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIGlmIHRoZSBpbWdQYXRoIGlzIGludmFsaWRcclxuICAgICAgaWYgKGltZ1BhdGggIT09ICdubyBpbWFnZScgJiYgIWZzLmV4aXN0c1N5bmMoaW1nUGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgQ2FuJ3QgZmluZCAke2ltZ1BhdGh9YCkpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgIGltZ1BhdGgsXHJcbiAgICAgICAgc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gIH0pXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGdldENsaXBib2FyZEltYWdlXHJcbiIsImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cydcclxuXHJcbmNvbnN0IGV2ZW50QnVzID0gbmV3IEV2ZW50RW1pdHRlcigpXHJcbmV4cG9ydCB7XHJcbiAgZXZlbnRCdXNcclxufVxyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtZnVuY3Rpb24tcmV0dXJuLXR5cGUgKi9cclxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L3Byb21pc2UtZnVuY3Rpb24tYXN5bmMgKi9cclxuaW1wb3J0IGF4aW9zLCB7IHR5cGUgQXhpb3NSZXF1ZXN0Q29uZmlnLCB0eXBlIEF4aW9zUmVzcG9uc2UgfSBmcm9tICdheGlvcydcclxuaW1wb3J0IHsgdHlwZSBJUGljR28sIHR5cGUgVW5kZWZpbmFibGUsIHR5cGUgSUNvbmZpZ0NoYW5nZVBheWxvYWQsIHR5cGUgSUNvbmZpZywgdHlwZSBJUmVxdWVzdENvbmZpZywgdHlwZSBJT2xkUmVxT3B0aW9ucywgdHlwZSBJUmVzcG9uc2UsIHR5cGUgSUZ1bGxSZXNwb25zZSwgdHlwZSBJUmVxdWVzdCB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVzRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBldmVudEJ1cyB9IGZyb20gJy4uL3V0aWxzL2V2ZW50QnVzJ1xyXG5pbXBvcnQgeyBVUkwgfSBmcm9tICd1cmwnXHJcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnXHJcbmltcG9ydCBodHRwcyBmcm9tICdodHRwcydcclxuaW1wb3J0IHR1bm5lbCBmcm9tICd0dW5uZWwnXHJcbmNvbnN0IGh0dHBzQWdlbnQgPSBuZXcgaHR0cHMuQWdlbnQoe1xyXG4gIG1heFZlcnNpb246ICdUTFN2MS4yJyxcclxuICBtaW5WZXJzaW9uOiAnVExTdjEuMidcclxufSlcclxuXHJcbi8vIHRoYW5rcyBmb3IgaHR0cHM6Ly9naXRodWIuZGV2L3JlcXVlc3QvcmVxdWVzdC9ibG9iL21hc3Rlci9pbmRleC5qc1xyXG5mdW5jdGlvbiBhcHBlbmRGb3JtRGF0YSAoZm9ybTogRm9ybURhdGEsIGtleTogc3RyaW5nLCBkYXRhOiBhbnkpOiB2b2lkIHtcclxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICd2YWx1ZScgaW4gZGF0YSAmJiAnb3B0aW9ucycgaW4gZGF0YSkge1xyXG4gICAgZm9ybS5hcHBlbmQoa2V5LCBkYXRhLnZhbHVlLCBkYXRhLm9wdGlvbnMpXHJcbiAgfSBlbHNlIHtcclxuICAgIGZvcm0uYXBwZW5kKGtleSwgZGF0YSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcXVlc3RJbnRlcmNlcHRvciAob3B0aW9uczogSU9sZFJlcU9wdGlvbnMgfCBBeGlvc1JlcXVlc3RDb25maWcpOiBBeGlvc1JlcXVlc3RDb25maWcgJiB7XHJcbiAgX19pc09sZE9wdGlvbnM/OiBib29sZWFuXHJcbn0ge1xyXG4gIGxldCBfX2lzT2xkT3B0aW9ucyA9IGZhbHNlXHJcbiAgY29uc3Qgb3B0OiBBeGlvc1JlcXVlc3RDb25maWc8YW55PiAmIHtcclxuICAgIF9faXNPbGRPcHRpb25zPzogYm9vbGVhblxyXG4gIH0gPSB7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgdXJsOiAob3B0aW9ucy51cmwgYXMgc3RyaW5nKSB8fCAnJyxcclxuICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB8fCB7fVxyXG4gIH1cclxuICAvLyB1c2VyIHJlcXVlc3QgY29uZmlnIHByb3h5XHJcbiAgaWYgKG9wdGlvbnMucHJveHkpIHtcclxuICAgIGxldCBwcm94eU9wdGlvbnMgPSBvcHRpb25zLnByb3h5XHJcbiAgICBpZiAodHlwZW9mIHByb3h5T3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBwcm94eU9wdGlvbnMgPSBuZXcgVVJMKG9wdGlvbnMucHJveHkpXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBwcm94eU9wdGlvbnMgPSBmYWxzZVxyXG4gICAgICAgIG9wdC5wcm94eSA9IGZhbHNlXHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICB9XHJcbiAgICAgIF9faXNPbGRPcHRpb25zID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYgKHByb3h5T3B0aW9ucykge1xyXG4gICAgICBpZiAob3B0aW9ucy51cmw/LnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcclxuICAgICAgICBvcHQucHJveHkgPSBmYWxzZVxyXG4gICAgICAgIG9wdC5odHRwc0FnZW50ID0gdHVubmVsLmh0dHBzT3Zlckh0dHAoe1xyXG4gICAgICAgICAgcHJveHk6IHtcclxuICAgICAgICAgICAgaG9zdDogcHJveHlPcHRpb25zPy5ob3N0bmFtZSxcclxuICAgICAgICAgICAgcG9ydDogcGFyc2VJbnQocHJveHlPcHRpb25zPy5wb3J0LCAxMClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG9wdC5wcm94eSA9IHtcclxuICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucy5ob3N0bmFtZSxcclxuICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KHByb3h5T3B0aW9ucy5wb3J0LCAxMCksXHJcbiAgICAgICAgICBwcm90b2NvbDogJ2h0dHAnXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmICgnZm9ybURhdGEnIGluIG9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucy5mb3JtRGF0YSkge1xyXG4gICAgICBjb25zdCBkYXRhID0gb3B0aW9ucy5mb3JtRGF0YVtrZXldXHJcbiAgICAgIGFwcGVuZEZvcm1EYXRhKGZvcm0sIGtleSwgZGF0YSlcclxuICAgIH1cclxuICAgIG9wdC5kYXRhID0gZm9ybVxyXG4gICAgb3B0LmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKG9wdC5oZWFkZXJzIHx8IHt9LCBmb3JtLmdldEhlYWRlcnMoKSlcclxuICAgIF9faXNPbGRPcHRpb25zID0gdHJ1ZVxyXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGlzIGlzIG9sZCBvcHRpb25cclxuICAgIGRlbGV0ZSBvcHQuZm9ybURhdGFcclxuICB9XHJcbiAgaWYgKCdib2R5JyBpbiBvcHRpb25zKSB7XHJcbiAgICBvcHQuZGF0YSA9IG9wdGlvbnMuYm9keVxyXG4gICAgX19pc09sZE9wdGlvbnMgPSB0cnVlXHJcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoaXMgaXMgb2xkIG9wdGlvbnNcclxuICAgIGRlbGV0ZSBvcHQuYm9keVxyXG4gIH1cclxuICBpZiAoJ3FzJyBpbiBvcHRpb25zKSB7XHJcbiAgICBvcHQucGFyYW1zID0gb3B0aW9ucy5xc1xyXG4gICAgX19pc09sZE9wdGlvbnMgPSB0cnVlXHJcbiAgfVxyXG4gIG9wdC5fX2lzT2xkT3B0aW9ucyA9IF9faXNPbGRPcHRpb25zXHJcbiAgcmV0dXJuIG9wdFxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNwb25zZUludGVyY2VwdG9yIChyZXNwb25zZTogQXhpb3NSZXNwb25zZSk6IElGdWxsUmVzcG9uc2Uge1xyXG4gIHJldHVybiB7XHJcbiAgICAuLi5yZXNwb25zZSxcclxuICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcclxuICAgIGJvZHk6IHJlc3BvbnNlLmRhdGFcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc3BvbnNlRXJyb3JIYW5kbGVyIChlcnJvcjogYW55KSB7XHJcbiAgLy8gaWYgKGVycm9yLnJlc3BvbnNlKSB7XHJcbiAgLy8gICAvLyBUaGUgcmVxdWVzdCB3YXMgbWFkZSBhbmQgdGhlIHNlcnZlciByZXNwb25kZWQgd2l0aCBhIHN0YXR1cyBjb2RlXHJcbiAgLy8gICAvLyB0aGF0IGZhbGxzIG91dCBvZiB0aGUgcmFuZ2Ugb2YgMnh4XHJcbiAgLy8gICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJybylcclxuICAvLyB9IGVsc2UgaWYgKGVycm9yLnJlcXVlc3QpIHtcclxuICAvLyAgIC8vIFRoZSByZXF1ZXN0IHdhcyBtYWRlIGJ1dCBubyByZXNwb25zZSB3YXMgcmVjZWl2ZWRcclxuICAvLyAgIC8vIGBlcnJvci5yZXF1ZXN0YCBpcyBhbiBpbnN0YW5jZSBvZiBYTUxIdHRwUmVxdWVzdCBpbiB0aGUgYnJvd3NlciBhbmQgYW4gaW5zdGFuY2Ugb2ZcclxuICAvLyAgIC8vIGh0dHAuQ2xpZW50UmVxdWVzdCBpbiBub2RlLmpzXHJcbiAgLy8gICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IucmVxdWVzdClcclxuICAvLyB9IGVsc2Uge1xyXG4gIC8vICAgLy8gU29tZXRoaW5nIGhhcHBlbmVkIGluIHNldHRpbmcgdXAgdGhlIHJlcXVlc3QgdGhhdCB0cmlnZ2VyZWQgYW4gRXJyb3JcclxuICAvLyAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlKVxyXG4gIC8vIH1cclxuICBjb25zdCBlcnJvck9iaiA9IHtcclxuICAgIG1ldGhvZDogZXJyb3I/LmNvbmZpZz8ubWV0aG9kPy50b1VwcGVyQ2FzZSgpIHx8ICcnLFxyXG4gICAgdXJsOiBlcnJvcj8uY29uZmlnPy51cmwgfHwgJycsXHJcbiAgICBzdGF0dXNDb2RlOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxyXG4gICAgbWVzc2FnZTogZXJyb3I/Lm1lc3NhZ2UgfHwgJycsXHJcbiAgICBzdGFjazogZXJyb3I/LnN0YWNrIHx8IHt9LFxyXG4gICAgcmVzcG9uc2U6IHtcclxuICAgICAgc3RhdHVzOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxyXG4gICAgICBzdGF0dXNDb2RlOiBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyB8fCAwLFxyXG4gICAgICBib2R5OiBlcnJvcj8ucmVzcG9uc2U/LmRhdGEgfHwgJydcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yT2JqKVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmVxdWVzdCBpbXBsZW1lbnRzIElSZXF1ZXN0IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcbiAgcHJpdmF0ZSBwcm94eTogVW5kZWZpbmFibGU8c3RyaW5nPiA9ICcnXHJcbiAgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnPGFueT4gPSB7fVxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMuaW5pdCgpXHJcbiAgICBldmVudEJ1cy5vbihJQnVzRXZlbnQuQ09ORklHX0NIQU5HRSwgKGRhdGE6IElDb25maWdDaGFuZ2VQYXlsb2FkPHN0cmluZyB8IElDb25maWdbJ3BpY0JlZCddPikgPT4ge1xyXG4gICAgICBzd2l0Y2ggKGRhdGEuY29uZmlnTmFtZSkge1xyXG4gICAgICAgIGNhc2UgJ3BpY0JlZCc6XHJcbiAgICAgICAgICBpZiAoKGRhdGEudmFsdWUgYXMgSUNvbmZpZ1sncGljQmVkJ10pPy5wcm94eSkge1xyXG4gICAgICAgICAgICB0aGlzLnByb3h5ID0gKGRhdGEudmFsdWUgYXMgSUNvbmZpZ1sncGljQmVkJ10pLnByb3h5XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJ3BpY0JlZC5wcm94eSc6XHJcbiAgICAgICAgICB0aGlzLnByb3h5ID0gZGF0YS52YWx1ZSBhcyBzdHJpbmdcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQgKCk6IHZvaWQge1xyXG4gICAgY29uc3QgcHJveHkgPSB0aGlzLmN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC5wcm94eScpXHJcbiAgICBpZiAocHJveHkpIHtcclxuICAgICAgdGhpcy5wcm94eSA9IHByb3h5XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVByb3h5ICgpOiBBeGlvc1JlcXVlc3RDb25maWdbJ3Byb3h5J10gfCBmYWxzZSB7XHJcbiAgICBpZiAodGhpcy5wcm94eSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHByb3h5T3B0aW9ucyA9IG5ldyBVUkwodGhpcy5wcm94eSlcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgaG9zdDogcHJveHlPcHRpb25zLmhvc3RuYW1lLFxyXG4gICAgICAgICAgcG9ydDogcGFyc2VJbnQocHJveHlPcHRpb25zLnBvcnQgfHwgJzAnLCAxMCksXHJcbiAgICAgICAgICBwcm90b2NvbDogcHJveHlPcHRpb25zLnByb3RvY29sXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgLy8gIzY0IGR5bmFtaWMgZ2V0IHByb3h5IHZhbHVlXHJcbiAgcmVxdWVzdDxULCBVIGV4dGVuZHMgKFxyXG4gICAgSVJlcXVlc3RDb25maWc8VT4gZXh0ZW5kcyBJT2xkUmVxT3B0aW9ucyA/IElPbGRSZXFPcHRpb25zIDogSVJlcXVlc3RDb25maWc8VT4gZXh0ZW5kcyBBeGlvc1JlcXVlc3RDb25maWcgPyBBeGlvc1JlcXVlc3RDb25maWcgOiBuZXZlclxyXG4gICk+IChvcHRpb25zOiBVKTogUHJvbWlzZTxJUmVzcG9uc2U8VCwgVT4+IHtcclxuICAgIHRoaXMub3B0aW9ucy5wcm94eSA9IHRoaXMuaGFuZGxlUHJveHkoKVxyXG4gICAgdGhpcy5vcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5tYXhCb2R5TGVuZ3RoID0gSW5maW5pdHlcclxuICAgIHRoaXMub3B0aW9ucy5tYXhDb250ZW50TGVuZ3RoID0gSW5maW5pdHlcclxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkgJiYgb3B0aW9ucy51cmw/LnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmh0dHBzQWdlbnQgPSB0dW5uZWwuaHR0cHNPdmVySHR0cCh7XHJcbiAgICAgICAgcHJveHk6IHtcclxuICAgICAgICAgIGhvc3Q6IHRoaXMub3B0aW9ucy5wcm94eS5ob3N0LFxyXG4gICAgICAgICAgcG9ydDogdGhpcy5vcHRpb25zLnByb3h5LnBvcnRcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMub3B0aW9ucy5wcm94eSA9IGZhbHNlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaHR0cHNBZ2VudCA9IGh0dHBzQWdlbnRcclxuICAgIH1cclxuICAgIC8vICFOT1RJQ0UgdGhpcy5vcHRpb25zICE9PSBvcHRpb25zXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMgaXMgdGhlIGRlZmF1bHQgb3B0aW9uc1xyXG4gICAgY29uc3QgaW5zdGFuY2UgPSBheGlvcy5jcmVhdGUodGhpcy5vcHRpb25zKVxyXG4gICAgaW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShyZXNwb25zZUludGVyY2VwdG9yLCByZXNwb25zZUVycm9ySGFuZGxlcilcclxuXHJcbiAgICAvLyBjb21wYXRpYmxlIHdpdGggb2xkIHJlcXVlc3Qgb3B0aW9ucyB0byBuZXcgb3B0aW9uc1xyXG4gICAgY29uc3Qgb3B0ID0gcmVxdWVzdEludGVyY2VwdG9yKG9wdGlvbnMpXHJcblxyXG4gICAgaW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgLy8gaGFuZGxlIENvbnRlbnQtVHlwZVxyXG4gICAgICBsZXQgY29udGVudFR5cGUgPSAnJ1xyXG4gICAgICBpZiAob2JqPy5oZWFkZXJzPy5jb250ZW50VHlwZSkge1xyXG4gICAgICAgIGNvbnRlbnRUeXBlID0gb2JqLmhlYWRlcnMuY29udGVudFR5cGUgYXMgc3RyaW5nXHJcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzLmNvbnRlbnRUeXBlXHJcbiAgICAgIH0gZWxzZSBpZiAob2JqPy5oZWFkZXJzPy5Db250ZW50VHlwZSkge1xyXG4gICAgICAgIGNvbnRlbnRUeXBlID0gb2JqLmhlYWRlcnMuQ29udGVudFR5cGUgYXMgc3RyaW5nXHJcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzLkNvbnRlbnRUeXBlXHJcbiAgICAgIH0gZWxzZSBpZiAob2JqPy5oZWFkZXJzPy5bJ2NvbnRlbnQtdHlwZSddKSB7XHJcbiAgICAgICAgY29udGVudFR5cGUgPSBvYmouaGVhZGVyc1snY29udGVudC10eXBlJ10gYXMgc3RyaW5nXHJcbiAgICAgICAgZGVsZXRlIG9iai5oZWFkZXJzWydjb250ZW50LXR5cGUnXVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb250ZW50VHlwZSAhPT0gJycgJiYgb2JqLmhlYWRlcnMpIHtcclxuICAgICAgICBvYmouaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBjb250ZW50VHlwZVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvYmpcclxuICAgIH0pXHJcbiAgICBpZiAoJ3Jlc29sdmVXaXRoRnVsbFJlc3BvbnNlJyBpbiBvcHRpb25zICYmIG9wdGlvbnMucmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2UpIHtcclxuICAgICAgcmV0dXJuIGluc3RhbmNlLnJlcXVlc3Qob3B0KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGluc3RhbmNlLnJlcXVlc3Qob3B0KS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgLy8gdXNlIG9sZCByZXF1ZXN0IG9wdGlvbiBmb3JtYXRcclxuICAgICAgICBpZiAob3B0Ll9faXNPbGRPcHRpb25zKSB7XHJcbiAgICAgICAgICBpZiAoJ2pzb24nIGluIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXMuZGF0YVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiByZXMuZGF0YVxyXG4gICAgICAgIH1cclxuICAgICAgfSkgYXMgUHJvbWlzZTxJUmVzcG9uc2U8VCwgVT4+XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZXF1ZXN0XHJcbiIsImltcG9ydCB7IHR5cGUgSUNvbmZpZywgdHlwZSBJUGljR28gfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgSlNPTlN0b3JlIH0gZnJvbSAnQHBpY2dvL3N0b3JlJ1xyXG5pbXBvcnQgeyB0eXBlIElKU09OIH0gZnJvbSAnQHBpY2dvL3N0b3JlL2Rpc3QvdHlwZXMnXHJcblxyXG5jbGFzcyBEQiB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGI6IEpTT05TdG9yZVxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMuZGIgPSBuZXcgSlNPTlN0b3JlKHRoaXMuY3R4LmNvbmZpZ1BhdGgpXHJcblxyXG4gICAgaWYgKCF0aGlzLmRiLmhhcygncGljQmVkJykpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmRiLnNldCgncGljQmVkJywge1xyXG4gICAgICAgICAgdXBsb2FkZXI6ICdzbW1zJyxcclxuICAgICAgICAgIGN1cnJlbnQ6ICdzbW1zJ1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmRiLmhhcygncGljZ29QbHVnaW5zJykpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmRiLnNldCgncGljZ29QbHVnaW5zJywge30pXHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVhZCAoZmx1c2g/OiBib29sZWFuKTogSUpTT04ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGIucmVhZChmbHVzaClcclxuICB9XHJcblxyXG4gIGdldCAoa2V5OiBzdHJpbmcgPSAnJyk6IGFueSB7XHJcbiAgICB0aGlzLnJlYWQodHJ1ZSlcclxuICAgIHJldHVybiB0aGlzLmRiLmdldChrZXkpXHJcbiAgfVxyXG5cclxuICBzZXQgKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnJlYWQodHJ1ZSlcclxuICAgIHRoaXMuZGIuc2V0KGtleSwgdmFsdWUpXHJcbiAgfVxyXG5cclxuICBoYXMgKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLnJlYWQodHJ1ZSlcclxuICAgIHJldHVybiB0aGlzLmRiLmhhcyhrZXkpXHJcbiAgfVxyXG5cclxuICB1bnNldCAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHRoaXMucmVhZCh0cnVlKVxyXG4gICAgcmV0dXJuIHRoaXMuZGIudW5zZXQoa2V5LCB2YWx1ZSlcclxuICB9XHJcblxyXG4gIHNhdmVDb25maWcgKGNvbmZpZzogUGFydGlhbDxJQ29uZmlnPik6IHZvaWQge1xyXG4gICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5zZXQobmFtZSwgY29uZmlnW25hbWVdKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJlbW92ZUNvbmZpZyAoY29uZmlnOiBJQ29uZmlnKTogdm9pZCB7XHJcbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICB0aGlzLnVuc2V0KG5hbWUsIGNvbmZpZ1tuYW1lXSlcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEQlxyXG5cclxuLy8gY29uc3QgaW5pdENvbmZpZyA9IChjb25maWdQYXRoOiBzdHJpbmcpOiBsb3dkYi5Mb3dkYlN5bmM8YW55PiA9PiB7XHJcbi8vIH1cclxuXHJcbi8vIGNvbnN0IHNhdmVDb25maWcgPSAoY29uZmlnUGF0aDogc3RyaW5nLCBjb25maWc6IGFueSk6IHZvaWQgPT4ge1xyXG4vLyAgIGNvbnN0IGRiID0gaW5pdENvbmZpZyhjb25maWdQYXRoKVxyXG4vLyAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbi8vICAgICBkYi5yZWFkKCkuc2V0KG5hbWUsIGNvbmZpZ1tuYW1lXSkud3JpdGUoKVxyXG4vLyAgIH0pXHJcbi8vIH1cclxuXHJcbi8vIGV4cG9ydCB7XHJcbi8vIGluaXRDb25maWcsXHJcbi8vIHNhdmVDb25maWdcclxuLy8gfVxyXG4iLCJpbXBvcnQgc3Bhd24gZnJvbSAnY3Jvc3Mtc3Bhd24nXHJcbmltcG9ydCB7XHJcbiAgdHlwZSBJUmVzdWx0LFxyXG4gIHR5cGUgSVByb2Nlc3NFbnYsXHJcbiAgdHlwZSBJUGx1Z2luUHJvY2Vzc1Jlc3VsdCxcclxuICB0eXBlIElQbHVnaW5IYW5kbGVyLFxyXG4gIHR5cGUgSVBsdWdpbkhhbmRsZXJPcHRpb25zLFxyXG4gIHR5cGUgVW5kZWZpbmFibGUsXHJcbiAgdHlwZSBJUGljR28sXHJcbiAgdHlwZSBJUGx1Z2luSGFuZGxlclJlc3VsdFxyXG59IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgZ2V0UHJvY2Vzc1BsdWdpbk5hbWUsIGdldE5vcm1hbFBsdWdpbk5hbWUgfSBmcm9tICcuLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IHR5cGUgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi9pMThuL3poLUNOJ1xyXG5cclxuZXhwb3J0IGNsYXNzIFBsdWdpbkhhbmRsZXIgaW1wbGVtZW50cyBJUGx1Z2luSGFuZGxlciB7XHJcbiAgLy8gVGhhbmtzIHRvIGZlZmxvdyAtPiBodHRwczovL2dpdGh1Yi5jb20vZmVmbG93L2ZlZmxvdy9ibG9iL21hc3Rlci9saWIvaW50ZXJuYWwvaW5zdGFsbC9wbHVnaW4uanNcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gIH1cclxuXHJcbiAgYXN5bmMgaW5zdGFsbCAocGx1Z2luczogc3RyaW5nW10sIG9wdGlvbnM6IElQbHVnaW5IYW5kbGVyT3B0aW9ucyA9IHt9LCBlbnY/OiBJUHJvY2Vzc0Vudik6IFByb21pc2U8SVBsdWdpbkhhbmRsZXJSZXN1bHQ8Ym9vbGVhbj4+IHtcclxuICAgIGNvbnN0IGluc3RhbGxlZFBsdWdpbnM6IHN0cmluZ1tdID0gW11cclxuICAgIGNvbnN0IHByb2Nlc3NQbHVnaW5zID0gcGx1Z2luc1xyXG4gICAgICAubWFwKChpdGVtOiBzdHJpbmcpID0+IGhhbmRsZVBsdWdpbk5hbWVQcm9jZXNzKHRoaXMuY3R4LCBpdGVtKSlcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgIC8vIGRldGVjdCBpZiBoYXMgYWxyZWFkeSBpbnN0YWxsZWRcclxuICAgICAgICAvLyBvciB3aWxsIGNhdXNlIGVycm9yXHJcbiAgICAgICAgaWYgKHRoaXMuY3R4LnBsdWdpbkxvYWRlci5oYXNQbHVnaW4oaXRlbS5wa2dOYW1lKSkge1xyXG4gICAgICAgICAgaW5zdGFsbGVkUGx1Z2lucy5wdXNoKGl0ZW0ucGtnTmFtZSlcclxuICAgICAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKGBQaWNHbyBoYXMgYWxyZWFkeSBpbnN0YWxsZWQgJHtpdGVtLnBrZ05hbWV9YClcclxuICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiBzb21ldGhpbmcgd3JvbmcsIGZpbHRlciBpdCBvdXRcclxuICAgICAgICBpZiAoIWl0ZW0uc3VjY2Vzcykge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgIH0pXHJcbiAgICBjb25zdCBmdWxsTmFtZUxpc3QgPSBwcm9jZXNzUGx1Z2lucy5tYXAoaXRlbSA9PiBpdGVtLmZ1bGxOYW1lKVxyXG4gICAgY29uc3QgcGtnTmFtZUxpc3QgPSBwcm9jZXNzUGx1Z2lucy5tYXAoaXRlbSA9PiBpdGVtLnBrZ05hbWUpXHJcbiAgICBpZiAoZnVsbE5hbWVMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gaW5zdGFsbCBwbHVnaW5zIG11c3QgdXNlIGZ1bGxOYW1lTGlzdDpcclxuICAgICAgLy8gMS4gaW5zdGFsbCByZW1vdGUgcGFjYWdlXHJcbiAgICAgIC8vIDIuIGluc3RhbGwgbG9jYWwgcGFjYWdlXHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY0NvbW1hbmQoJ2luc3RhbGwnLCBmdWxsTmFtZUxpc3QsIHRoaXMuY3R4LmJhc2VEaXIsIG9wdGlvbnMsIGVudilcclxuICAgICAgaWYgKCFyZXN1bHQuY29kZSkge1xyXG4gICAgICAgIHBrZ05hbWVMaXN0LmZvckVhY2goKHBsdWdpbk5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jdHgucGx1Z2luTG9hZGVyLnJlZ2lzdGVyUGx1Z2luKHBsdWdpbk5hbWUpXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmN0eC5sb2cuc3VjY2Vzcyh0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1MnKSlcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KCdpbnN0YWxsU3VjY2VzcycsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1MnKSxcclxuICAgICAgICAgIGJvZHk6IFsuLi5wa2dOYW1lTGlzdCwgLi4uaW5zdGFsbGVkUGx1Z2luc11cclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgYm9keTogWy4uLnBrZ05hbWVMaXN0LCAuLi5pbnN0YWxsZWRQbHVnaW5zXVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUkVBU09OJywge1xyXG4gICAgICAgICAgY29kZTogYCR7cmVzdWx0LmNvZGV9YCxcclxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ2luc3RhbGxGYWlsZWQnLCB7XHJcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoaW5zdGFsbGVkUGx1Z2lucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRCcpXHJcbiAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgIHRoaXMuY3R4LmVtaXQoJ2luc3RhbGxGYWlsZWQnLCB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEJyksXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH0pXHJcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIGJvZHk6IGVyclxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXNcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUycpKVxyXG4gICAgICB0aGlzLmN0eC5lbWl0KCdpbnN0YWxsU3VjY2VzcycsIHtcclxuICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTJyksXHJcbiAgICAgICAgYm9keTogWy4uLnBrZ05hbWVMaXN0LCAuLi5pbnN0YWxsZWRQbHVnaW5zXVxyXG4gICAgICB9KVxyXG4gICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PHRydWU+ID0ge1xyXG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgYm9keTogWy4uLnBrZ05hbWVMaXN0LCAuLi5pbnN0YWxsZWRQbHVnaW5zXVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHVuaW5zdGFsbCAocGx1Z2luczogc3RyaW5nW10pOiBQcm9taXNlPElQbHVnaW5IYW5kbGVyUmVzdWx0PGJvb2xlYW4+PiB7XHJcbiAgICBjb25zdCBwcm9jZXNzUGx1Z2lucyA9IHBsdWdpbnMubWFwKChpdGVtOiBzdHJpbmcpID0+IGhhbmRsZVBsdWdpbk5hbWVQcm9jZXNzKHRoaXMuY3R4LCBpdGVtKSkuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zdWNjZXNzKVxyXG4gICAgY29uc3QgcGtnTmFtZUxpc3QgPSBwcm9jZXNzUGx1Z2lucy5tYXAoaXRlbSA9PiBpdGVtLnBrZ05hbWUpXHJcbiAgICBpZiAocGtnTmFtZUxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyB1bmluc3RhbGwgcGx1Z2lucyBtdXN0IHVzZSBwa2dOYW1lTGlzdDpcclxuICAgICAgLy8gbnBtIHVuaW5zdGFsbCB3aWxsIHVzZSB0aGUgcGFja2FnZS5qc29uJ3MgbmFtZVxyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWNDb21tYW5kKCd1bmluc3RhbGwnLCBwa2dOYW1lTGlzdCwgdGhpcy5jdHguYmFzZURpcilcclxuICAgICAgaWYgKCFyZXN1bHQuY29kZSkge1xyXG4gICAgICAgIHBrZ05hbWVMaXN0LmZvckVhY2goKHBsdWdpbk5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jdHgucGx1Z2luTG9hZGVyLnVucmVnaXN0ZXJQbHVnaW4ocGx1Z2luTmFtZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTJykpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgndW5pbnN0YWxsU3VjY2VzcycsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTUycpLFxyXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3RcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3RcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfUkVBU09OJywge1xyXG4gICAgICAgICAgY29kZTogYCR7cmVzdWx0LmNvZGV9YCxcclxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ3VuaW5zdGFsbEZhaWxlZCcsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEJyksXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEJylcclxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgdGhpcy5jdHguZW1pdCgndW5pbnN0YWxsRmFpbGVkJywge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEJyksXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH0pXHJcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIGJvZHk6IGVyclxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZSAocGx1Z2luczogc3RyaW5nW10sIG9wdGlvbnM6IElQbHVnaW5IYW5kbGVyT3B0aW9ucyA9IHt9LCBlbnY/OiBJUHJvY2Vzc0Vudik6IFByb21pc2U8SVBsdWdpbkhhbmRsZXJSZXN1bHQ8Ym9vbGVhbj4+IHtcclxuICAgIGNvbnN0IHByb2Nlc3NQbHVnaW5zID0gcGx1Z2lucy5tYXAoKGl0ZW06IHN0cmluZykgPT4gaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3ModGhpcy5jdHgsIGl0ZW0pKS5maWx0ZXIoaXRlbSA9PiBpdGVtLnN1Y2Nlc3MpXHJcbiAgICBjb25zdCBwa2dOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0ucGtnTmFtZSlcclxuICAgIGlmIChwa2dOYW1lTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIHVwZGF0ZSBwbHVnaW5zIG11c3QgdXNlIHBrZ05hbWVMaXN0OlxyXG4gICAgICAvLyBucG0gdXBkYXRlIHdpbGwgdXNlIHRoZSBwYWNrYWdlLmpzb24ncyBuYW1lXHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY0NvbW1hbmQoJ3VwZGF0ZScsIHBrZ05hbWVMaXN0LCB0aGlzLmN0eC5iYXNlRGlyLCBvcHRpb25zLCBlbnYpXHJcbiAgICAgIGlmICghcmVzdWx0LmNvZGUpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuc3VjY2Vzcyh0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUycpKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ3VwZGF0ZVN1Y2Nlc3MnLCB7XHJcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX1NVQ0NFU1MnKSxcclxuICAgICAgICAgIGJvZHk6IHBrZ05hbWVMaXN0XHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PHRydWU+ID0ge1xyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgIGJvZHk6IHBrZ05hbWVMaXN0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1JFQVNPTicsIHtcclxuICAgICAgICAgIGNvZGU6IGAke3Jlc3VsdC5jb2RlfWAsXHJcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KCd1cGRhdGVGYWlsZWQnLCB7XHJcbiAgICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRCcpXHJcbiAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgIHRoaXMuY3R4LmVtaXQoJ3VwZGF0ZUZhaWxlZCcsIHtcclxuICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRCcpLFxyXG4gICAgICAgIGJvZHk6IGVyclxyXG4gICAgICB9KVxyXG4gICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcclxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGV4ZWNDb21tYW5kIChjbWQ6IHN0cmluZywgbW9kdWxlczogc3RyaW5nW10sIHdoZXJlOiBzdHJpbmcsIG9wdGlvbnM6IElQbHVnaW5IYW5kbGVyT3B0aW9ucyA9IHt9LCBlbnY6IElQcm9jZXNzRW52ID0ge30pOiBQcm9taXNlPElSZXN1bHQ+IHtcclxuICAgIC8vIG9wdGlvbnMgZmlyc3RcclxuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gb3B0aW9ucy5yZWdpc3RyeSB8fCB0aGlzLmN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3NldHRpbmdzLnJlZ2lzdHJ5JylcclxuICAgIGNvbnN0IHByb3h5ID0gb3B0aW9ucy5wcm94eSB8fCB0aGlzLmN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3NldHRpbmdzLnByb3h5JylcclxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55KTogdm9pZCA9PiB7XHJcbiAgICAgIGxldCBhcmdzID0gW2NtZF0uY29uY2F0KG1vZHVsZXMpLmNvbmNhdCgnLS1jb2xvcj1hbHdheXMnKS5jb25jYXQoJy0tc2F2ZScpXHJcbiAgICAgIGlmIChyZWdpc3RyeSkge1xyXG4gICAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChgLS1yZWdpc3RyeT0ke3JlZ2lzdHJ5fWApXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHByb3h5KSB7XHJcbiAgICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KGAtLXByb3h5PSR7cHJveHl9YClcclxuICAgICAgfVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IG5wbSA9IHNwYXduKCducG0nLCBhcmdzLCB7IGN3ZDogd2hlcmUsIGVudjogT2JqZWN0LmFzc2lnbih7fSwgcHJvY2Vzcy5lbnYsIGVudikgfSlcclxuXHJcbiAgICAgICAgbGV0IG91dHB1dCA9ICcnXHJcbiAgICAgICAgbnBtLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBvdXRwdXQgKz0gZGF0YVxyXG4gICAgICAgIH0pLnBpcGUocHJvY2Vzcy5zdGRvdXQpXHJcblxyXG4gICAgICAgIG5wbS5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgb3V0cHV0ICs9IGRhdGFcclxuICAgICAgICB9KS5waXBlKHByb2Nlc3Muc3RkZXJyKVxyXG5cclxuICAgICAgICBucG0ub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgaWYgKCFjb2RlKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoeyBjb2RlOiAwLCBkYXRhOiBvdXRwdXQgfSlcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoeyBjb2RlLCBkYXRhOiBvdXRwdXQgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC8vIGZvciB1c2VycyB3aG8gaGF2ZW4ndCBpbnN0YWxsZWQgbm9kZS5qc1xyXG4gICAgICAgIG5wbS5vbignZXJyb3InLCAoZXJyOiBFcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcignTlBNIGlzIG5vdCBpbnN0YWxsZWQnKVxyXG4gICAgICAgICAgdGhpcy5jdHguZW1pdChJQnVpbGRJbkV2ZW50LkZBSUxFRCwgJ05QTSBpcyBub3QgaW5zdGFsbGVkJylcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGUgYXMgRXJyb3IpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdChJQnVpbGRJbkV2ZW50LkZBSUxFRCwgZSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0cmFuc2Zvcm0gdGhlIGlucHV0IHBsdWdpbiBuYW1lIG9yIHBhdGggc3RyaW5nIHRvIHZhbGlkIHJlc3VsdFxyXG4gKiBAcGFyYW0gY3R4XHJcbiAqIEBwYXJhbSBuYW1lT3JQYXRoXHJcbiAqL1xyXG5jb25zdCBoYW5kbGVQbHVnaW5OYW1lUHJvY2VzcyA9IChjdHg6IElQaWNHbywgbmFtZU9yUGF0aDogc3RyaW5nKTogSVBsdWdpblByb2Nlc3NSZXN1bHQgPT4ge1xyXG4gIGNvbnN0IHJlcyA9IHtcclxuICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgZnVsbE5hbWU6ICcnLFxyXG4gICAgcGtnTmFtZTogJydcclxuICB9XHJcbiAgY29uc3QgcmVzdWx0ID0gZ2V0UHJvY2Vzc1BsdWdpbk5hbWUobmFtZU9yUGF0aCwgY3R4LmxvZylcclxuICBpZiAoIXJlc3VsdCkge1xyXG4gICAgcmV0dXJuIHJlc1xyXG4gIH1cclxuICAvLyBmaXJzdCBnZXQgcmVzdWx0IHRoZW4gZG8gdGhpcyBwcm9jZXNzXHJcbiAgLy8gb3Igc29tZSBlcnJvciB3aWxsIGxvZyB0d2ljZVxyXG4gIGNvbnN0IHBrZ05hbWUgPSBnZXROb3JtYWxQbHVnaW5OYW1lKHJlc3VsdCwgY3R4LmxvZylcclxuICBpZiAoIXBrZ05hbWUpIHtcclxuICAgIHJldHVybiByZXNcclxuICB9XHJcbiAgcmV0dXJuIHtcclxuICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICBmdWxsTmFtZTogcmVzdWx0LFxyXG4gICAgcGtnTmFtZVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGx1Z2luSGFuZGxlclxyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcgKi9cclxuZXhwb3J0IGNvbnN0IFpIX0NOID0ge1xyXG4gIFVQTE9BRF9GQUlMRUQ6ICfkuIrkvKDlpLHotKUnLFxyXG4gIENIRUNLX1NFVFRJTkdTOiAn6K+35qOA5p+l5L2g55qE6YWN572u6aG55piv5ZCm5q2j56GuJyxcclxuICBDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSzogJ+ivt+ajgOafpeS9oOeahOmFjee9rumhueS7peWPiue9kee7nCcsXHJcbiAgVVBMT0FEX0ZBSUxFRF9SRUFTT046ICfplJnor6/noIHvvJoke2NvZGV977yM6K+35omT5byA5rWP6KeI5Zmo57KY6LS05Zyw5Z2A5p+l55yL55u45YWz5Y6f5ZugJyxcclxuICBTRVJWRVJfRVJST1I6ICfmnI3liqHnq6/lh7rplJnvvIzor7fph43or5UnLFxyXG4gIEFVVEhfRkFJTEVEOiAn6K6k6K+B5aSx6LSlJyxcclxuXHJcbiAgLy8gc21tc1xyXG4gIFBJQ0JFRF9TTU1TOiAnU00uTVMnLFxyXG4gIFBJQ0JFRF9TTU1TX1RPS0VOOiAn6K6+5a6aVG9rZW4nLFxyXG4gIFBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU46ICflpIfnlKjkuIrkvKDln5/lkI0nLFxyXG4gIFBJQ0JFRF9TTU1TX01FU1NBR0VfQkFDS1VQX0RPTUFJTjogJ+S+i+WmgiBzbW1zLmFwcCcsXHJcblxyXG4gIC8vIGxvY2FsXHJcbiAgUElDQkVEX0xPQ0FMOiAn5pys5Zyw5LiK5LygJyxcclxuICBQSUNCRURfTE9DQUxfUEFUSDogJ+iuvuWumui3r+W+hCcsXHJcbiAgUElDQkVEX0xPQ0FMX01FU1NBR0VfUEFUSDogJ+S+i+WmgiAvdXNyL2xvY2FsL2ltYWdlcy8nLFxyXG4gIFBJQ0JFRF9MT0NBTF9DVVNUT01VUkw6ICforr7lrproh6rlrprkuYnln5/lkI0nLFxyXG4gIFBJQ0JFRF9MT0NBTF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+WmgiBodHRwczovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfTE9DQUxfV0VCUEFUSDogJ+iuvuWumue9keermei3r+W+hCcsXHJcbiAgUElDQkVEX0xPQ0FMX01FU1NBR0VfV0VCUEFUSDogJ+eUqOS6juaLvOaOpee9keWdgOi3r+W+hCcsXHJcblxyXG4gIC8vIEFsaS1jbG91ZFxyXG4gIFBJQ0JFRF9BTElDTE9VRDogJ+mYv+mHjOS6kU9TUycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEOiAn6K6+5a6aS2V5SWQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVQ6ICforr7lrppLZXlTZWNyZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9CVUNLRVQ6ICforr7lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BUkVBOiAn6K6+5a6a5a2Y5YKo5Yy65Z+fJyxcclxuICBQSUNCRURfQUxJQ0xPVURfUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTDogJ+iuvuWumuiHquWumuS5ieWfn+WQjScsXHJcbiAgUElDQkVEX0FMSUNMT1VEX09QVElPTlM6ICforr7lrprnvZHlnYDlkI7nvIAnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJpvc3MtY24tYmVpamluZycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP3gtb3NzLXByb2Nlc3M9eHh4JyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gVGVuY2VudC1jbG91ZFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVUQ6ICfohb7orq/kupFDT1MnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfVkVSU0lPTjogJ0NPU+eJiOacrCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRJRDogJ+iuvuWumlNlY3JldElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogJ+iuvuWumlNlY3JldEtleScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRDogJ+iuvuWumkFwcElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0JVQ0tFVDogJ+iuvuWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiAn6K6+5a6a5a2Y5YKo5Yy65Z+fJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0VORFBPSU5UOiAn6K6+5a6a5o6l5YWl54K5JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUzogJ+iuvuWumue9keWdgOWQjue8gCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6ICforr7lrproh6rlrprkuYnln5/lkI0nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUFBJRDogJ+S+i+Wmgu+8mjEyMzQ1Njc4OTAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yaYXAtYmVpamluZycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaP2ltYWdlTW9ncjInLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9FTkRQT0lOVDogJ+S+i+Wmgu+8mmNvcy1pbnRlcm5hbC5hY2NlbGVyYXRlLnRlbmNlbnRjb3MuY24nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTTogJ+aegeaZuuWOi+e8qScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TTElNX1RJUDogJ+WbvueJh+aegeaZuuWOi+e8qe+8jOivpuaDheivt+WPguiAg1vmlofmoaPor7TmmI5dKGh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNDkyNTkpJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU1fQ09ORklSTTogJ+W8gOWQrycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TTElNX0NBTkNFTDogJ+WFs+mXrScsXHJcblxyXG4gIC8vIEdpdEh1YlxyXG4gIFBJQ0JFRF9HSVRIVUI6ICdHaXRIdWInLFxyXG4gIFBJQ0JFRF9HSVRIVUJfVE9LRU46ICforr7lrppUb2tlbicsXHJcbiAgUElDQkVEX0dJVEhVQl9SRVBPOiAn6K6+5a6a5LuT5bqT5ZCNJyxcclxuICBQSUNCRURfR0lUSFVCX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfQlJBTkNIOiAn6K6+5a6a5YiG5pSv5ZCNJyxcclxuICBQSUNCRURfR0lUSFVCX0NVU1RPTVVSTDogJ+iuvuWumuiHquWumuS5ieWfn+WQjScsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1JFUE86ICfmoLzlvI/vvJp1c2VybmFtZS9yZXBvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIOiAn5L6L5aaC77yabWFpbicsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBxaW5pdVxyXG4gIFBJQ0JFRF9RSU5JVTogJ+S4g+eJm+S6kScsXHJcbiAgUElDQkVEX1FJTklVX0FDQ0VTU0tFWTogJ+iuvuWumkFjY2Vzc0tleScsXHJcbiAgUElDQkVEX1FJTklVX1NFQ1JFVEtFWTogJ+iuvuWumlNlY3JldEtleScsXHJcbiAgUElDQkVEX1FJTklVX0JVQ0tFVDogJ+iuvuWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX1FJTklVX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9RSU5JVV9VUkw6ICforr7lrprorr/pl67nvZHlnYAnLFxyXG4gIFBJQ0JFRF9RSU5JVV9PUFRJT05TOiAn6K6+5a6a572R5Z2A5ZCO57yAJyxcclxuICBQSUNCRURfUUlOSVVfQVJFQTogJ+iuvuWumuWtmOWCqOWMuuWfnycsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yaejAnLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJo/aW1hZ2VzbGltJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9VUkw6ICfkvovlpoLvvJpodHRwczovL3h4eC55eXkuZ2xiLmNsb3VkZG4uY29tJyxcclxuICBQSUNCRURfVEVMRUdSQVBIOiAnVGVsZWdyYXBoJyxcclxuICAvLyBpbWd1clxyXG4gIFBJQ0JFRF9JTUdVUjogJ0ltZ3VyJyxcclxuICBQSUNCRURfSU1HVVJfQ0xJRU5USUQ6ICforr7lrppDbGllbnRJZCcsXHJcbiAgUElDQkVEX0lNR1VSX1VTRVJOQU1FOiAn6K6+5a6a55So5oi35ZCNJyxcclxuICBQSUNCRURfSU1HVVJfQUNDRVNTX1RPS0VOOiAn6K6+5a6aYWNjZXNzVG9rZW4nLFxyXG4gIFBJQ0JFRF9JTUdVUl9BTEJVTTogJ+iuvuWumuebuOWGjOWQjScsXHJcbiAgUElDQkVEX0lNR1VSX1BST1hZOiAn6K6+5a6a5Luj55CGJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9DTElFTlRJRDogJ+WMv+WQjeS4iuS8oOaXtuWhq+WGmScsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfVVNFUk5BTUU6ICfpnIDopoHkuIrkvKDliLDotKbmiLfml7bloavlhpknLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX0FDQ0VTU19UT0tFTjogJ+mcgOimgeS4iuS8oOWIsOi0puaIt+aXtuWhq+WGmScsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfQUxCVU06ICfkvovlpoLvvJp0ZXN0JyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogJ+S+i+Wmgu+8mmh0dHA6Ly8xMjcuMC4wLjE6MTA4MCcsXHJcblxyXG4gIC8vIHVweXVuXHJcbiAgUElDQkVEX1VQWVVOOiAn5Y+I5ouN5LqRJyxcclxuICBQSUNCRURfVVBZVU5fQlVDS0VUOiAn6K6+5a6aQnVja2V0JyxcclxuICBQSUNCRURfVVBZVU5fT1BFUkFUT1I6ICforr7lrprmk43kvZzlkZgnLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVNTV09SRDogJ+iuvuWumuaTjeS9nOWRmOWvhueggScsXHJcbiAgUElDQkVEX1VQWVVOX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9VUkw6ICforr7lrprliqDpgJ/ln5/lkI0nLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUFRJT05TOiAn6K6+5a6a572R5Z2A5ZCO57yAJyxcclxuICBQSUNCRURfVVBZVU5fQU5USV9MRUVDSF9UT0tFTjogJ+iuvuWumumYsuebl+mTvlRva2VuJyxcclxuICBQSUNCRURfVVBZVU5fRVhQSVJFX1RJTUU6ICforr7lrprov4fmnJ/ml7bpl7Qo56eSKScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1I6ICfkvovlpoLvvJptZScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQ6ICfovpPlhaXmk43kvZzlkZjlr4bnoIEnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTDogJ+S+i+Wmgu+8mmh0dHA6Ly94eHgudGVzdC51cGNkbi5uZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJohaW1nc2xpbScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuXHJcbiAgLy8gd2ViZGF2cGxpc3RcclxuICBQSUNCRURfV0VCREFWUExJU1Q6ICdXZWJEQVYnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9IT1NUOiAn6K6+5a6a5o6l5Y+j572R5Z2AJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfU1NMRU5BQkxFRDogJ+WQr+eUqFNTTCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1VTRVJOQU1FOiAn6K6+5a6a55So5oi35ZCNJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfUEFTU1dPUkQ6ICforr7lrprlr4bnoIEnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9QQVRIOiAn6K6+5a6a5a2Y5YKo6Lev5b6EJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfV0VCU0lURV9QQVRIOiAn6K6+5a6a572R5Z2A6Lev5b6EJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfQ1VTVE9NVVJMOiAn6K6+5a6a6Ieq5a6a5LmJ5Z+f5ZCNJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfQVVUSFRZUEU6ICforr7lrprorqTor4HmlrnlvI8nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0hPU1Q6ICfkvovlpoLvvJpodHRwczovL2V4YW1wbGUuY29tL3dlYmRhdicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfU1NMRU5BQkxFRDogJ+mcgOimgUhUVFBT5pe25ZCv55SoJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9VU0VSTkFNRTogJ+S+i+Wmgu+8mm1lJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVNTV09SRDogJ+i+k+WFpeWvhueggScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEg6ICfmi7zmjqXnvZHlnYDml7bkvb/nlKgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBzZnRwcGxpc3RcclxuICBQSUNCRURfU0ZUUFBMSVNUOiAn5YaF572uU0ZUUCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9IT1NUOiAn6K6+5a6a5Li75py6JyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1BPUlQ6ICforr7lrprnq6/lj6MnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfVVNFUk5BTUU6ICforr7lrprnlKjmiLflkI0nLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfUEFTU1dPUkQ6ICforr7lrprlr4bnoIEnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfUFJJVkFURUtFWTogJ+iuvuWumuengemSpScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9QUklWQVRFS0VZX1BBU1NQSFJBU0U6ICforr7lrprnp4HpkqXlr4bnoIEnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfVVBMT0FEUEFUSDogJ+iuvuWumuS4iuS8oOi3r+W+hCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9DVVNUT01VUkw6ICforr7lrproh6rlrprkuYnln5/lkI0nLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfV0VCU0lURV9QQVRIOiAn6K6+5a6a572R56uZ6Lev5b6EJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX0ZJTEVfVVNFUjogJ+iuvuWumuaWh+S7tueUqOaItzrnu4QnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfRklMRV9NT0RFOiAn6K6+5a6a5paH5Lu25p2D6ZmQJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX0RJUl9NT0RFOiAn6K6+5a6a5paH5Lu25aS55p2D6ZmQJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfSE9TVDogJ+S+i+Wmgu+8mjEuMS4xLjMnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9QT1JUOiAn6buY6K6kMjInLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9QUklWQVRFS0VZOiAn5L6L5aaC77yaL1VzZXJzL3h4eC8uc3NoL2lkX3JzYScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1BSSVZBVEVLRVlfUEFTU1BIUkFTRTogJ+i+k+WFpeengemSpeWvhueggScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1VQTE9BRFBBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEg6ICfmi7zmjqXnvZHlnYDml7bkvb/nlKgnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9GSUxFX1VTRVI6ICfkvovlpoLvvJp3d3c6ZGF0YScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0ZJTEVfTU9ERTogJ+S+i+Wmgu+8mjA2NjQnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9ESVJfTU9ERTogJ+S+i+Wmgu+8mjA3NzUnLFxyXG5cclxuICAvLyBQaWNMaXN0XHJcbiAgUElDQkVEX1BJQ0xJU1Q6ICdQaWNMaXN0JyxcclxuICBQSUNCRURfUElDTElTVF9IT1NUOiAn6K6+5a6a5Li75py6JyxcclxuICBQSUNCRURfUElDTElTVF9QT1JUOiAn6K6+5a6a56uv5Y+jJyxcclxuICBQSUNCRURfUElDTElTVF9QSUNCRUQ6ICforr7lrprlm77luoonLFxyXG4gIFBJQ0JFRF9QSUNMSVNUX0NPTkZJR05BTUU6ICforr7lrprphY3nva7lkI0nLFxyXG4gIFBJQ0JFRF9QSUNMSVNUX0tFWTogJ+iuvuWumumJtOadg0tleScsXHJcblxyXG4gIEJVSUxESU5fV0FURVJNQVJLX0lTQUREV0FURVJNQVJLOiAn5piv5ZCm5re75Yqg5rC05Y2wJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX0lTQUREV0FURVJNQVJLOiAn6ZyA6KaB5re75Yqg5rC05Y2w5pe25ZCv55SoJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktUWVBFOiAn6K6+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/nlKgnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNGTElQOiAn5piv5ZCm5Z6C55u057+76L2s5Zu+54mHJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTRkxPUDogJ+aYr+WQpuawtOW5s+e/u+i9rOWbvueJhycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19SRVNJWkVQRVJDRU5UOiAn6K6+5a6a57yp5pS+55m+5YiG5q+UJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFUEVSQ0VOVDogJ+ivt+i+k+WFpeaVsOWtlycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19TS0lQUkVTSVpFT0ZTTUFMTElNRzogJ+aYr+WQpui3s+i/h+Wwj+Wbvue8qeaUvicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JPVEFURTogJ+aYr+WQpui/m+ihjOWbvueJh+aXi+i9rCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUk9UQVRFOiAn6ZyA6KaB5peL6L2s5pe25ZCv55SoJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1JPVEFURURFR1JFRTogJ+iuvuWumuaXi+i9rOinkuW6picsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JPVEFURURFR1JFRTogJ+ivt+i+k+WFpeaVsOWtl++8jOWPr+S4uui0n+aVsCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JFTU9WRUVYSUY6ICfmmK/lkKbnp7vpmaRFWElG5L+h5oGvJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRU1PVkVFWElGOiAn6ZyA6KaB56e76ZmkRVhJRuS/oeaBr+aXtuWQr+eUqCcsXHJcblxyXG4gIC8vIFBsdWdpbiBIYW5kbGVyXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUzogJ+aPkuS7tuWuieijheaIkOWKnycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEOiAn5o+S5Lu25a6J6KOF5aSx6LSlJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUkVBU09OOiAn5o+S5Lu25a6J6KOF5aSx6LSl77yM5aSx6LSl56CB5Li6JHtjb2Rlfe+8jOmUmeivr+aXpeW/l+S4uiBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1BBVEg6ICfmj5Lku7blronoo4XlpLHotKXvvIzor7fovpPlhaXlkIjms5Xmj5Lku7blkI3miJblkIjms5Xlronoo4Xot6/lvoQnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfU1VDQ0VTUzogJ+aPkuS7tuWNuOi9veaIkOWKnycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQ6ICfmj5Lku7bljbjovb3lpLHotKUnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1JFQVNPTjogJ+aPkuS7tuWNuOi9veWksei0pe+8jOWksei0peeggeS4uiR7Y29kZX3vvIzplJnor6/ml6Xlv5fkuLogXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEOiAn5o+S5Lu25Y246L295aSx6LSl77yM6K+36L6T5YWl5ZCI5rOV5o+S5Lu25ZCNJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX1NVQ0NFU1M6ICfmj5Lku7bmm7TmlrDmiJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEOiAn5o+S5Lu25pu05paw5aSx6LSlJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9SRUFTT046ICfmj5Lku7bmm7TmlrDlpLHotKXvvIzlpLHotKXnoIHkuLoke2NvZGV977yM6ZSZ6K+v5pel5b+X5Li6IFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRF9WQUxJRDogJ+aPkuS7tuabtOaWsOWksei0pe+8jOivt+i+k+WFpeWQiOazleaPkuS7tuWQjSdcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSUxvY2FsZXNLZXkgPSBrZXlvZiB0eXBlb2YgWkhfQ05cclxuZXhwb3J0IHR5cGUgSUxvY2FsZXMgPSB0eXBlb2YgWkhfQ05cclxuIiwiaW1wb3J0IHsgdHlwZSBJTG9jYWxlcyB9IGZyb20gJy4vemgtQ04nXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcgKi9cclxuZXhwb3J0IGNvbnN0IEVOOiBJTG9jYWxlcyA9IHtcclxuICBVUExPQURfRkFJTEVEOiAnVXBsb2FkIGZhaWxlZCcsXHJcbiAgQ0hFQ0tfU0VUVElOR1M6ICdQbGVhc2UgY2hlY2sgeW91ciBzZXR0aW5ncycsXHJcbiAgQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUks6ICdQbGVhc2UgY2hlY2sgeW91ciBzZXR0aW5ncyBhbmQgbmV0d29yaycsXHJcbiAgVVBMT0FEX0ZBSUxFRF9SRUFTT046ICdFcnJvciBjb2RlOiAke2NvZGV9LCBwbGVhc2Ugb3BlbiB0aGUgYnJvd3NlciBhbmQgcGFzdGUgdGhlIGFkZHJlc3MgdG8gc2VlIHRoZSByZWFzb24nLFxyXG4gIFNFUlZFUl9FUlJPUjogJ1NlcnZlciBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcicsXHJcbiAgQVVUSF9GQUlMRUQ6ICdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLFxyXG5cclxuICAvLyBzbW1zXHJcbiAgUElDQkVEX1NNTVM6ICdTTS5NUycsXHJcbiAgUElDQkVEX1NNTVNfVE9LRU46ICdTZXQgVG9rZW4nLFxyXG4gIFBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU46ICdTZXQgQmFja3VwIFVwbG9hZCBEb21haW4nLFxyXG4gIFBJQ0JFRF9TTU1TX01FU1NBR0VfQkFDS1VQX0RPTUFJTjogJ0V4LiBzbW1zLmFwcCcsXHJcblxyXG4gIC8vIGxvY2FsXHJcbiAgUElDQkVEX0xPQ0FMOiAnTG9jYWwnLFxyXG4gIFBJQ0JFRF9MT0NBTF9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9MT0NBTF9NRVNTQUdFX1BBVEg6ICdFeC4gL1VzZXJzL25hbWUvUGljdHVyZXMvJyxcclxuICBQSUNCRURfTE9DQUxfQ1VTVE9NVVJMOiAnU2V0IEN1c3RvbSBVUkwnLFxyXG4gIFBJQ0JFRF9MT0NBTF9NRVNTQUdFX0NVU1RPTVVSTDogJ0V4LiBodHRwczovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfTE9DQUxfV0VCUEFUSDogJ1NldCBXZWIgUGF0aCcsXHJcbiAgUElDQkVEX0xPQ0FMX01FU1NBR0VfV0VCUEFUSDogJ1VzZWQgdG8gZ2VuZXJhdGUgdXJsIHBhdGgnLFxyXG5cclxuICAvLyBBbGktY2xvdWRcclxuICBQSUNCRURfQUxJQ0xPVUQ6ICdBbGkgQ2xvdWQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRDogJ1NldCBLZXlJZCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVDogJ1NldCBLZXlTZWNyZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQVJFQTogJ1NldCBBcmVhJyxcclxuICBQSUNCRURfQUxJQ0xPVURfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMOiAnU2V0IEN1c3RvbSBVUkwnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9PUFRJT05TOiAnU2V0IFVSTCBTdWZmaXgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUE6ICdFeC4gb3NzLWNuLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlM6ICdFeC4gP3gtb3NzLXByb2Nlc3M9eHh4JyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIFRlbmNlbnQtY2xvdWRcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEOiAnVGVuY2VudCBDbG91ZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OOiAnQ2hvb3NlIENPUyB2ZXJzaW9uJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEOiAnU2V0IFNlY3JldElkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVEtFWTogJ1NldCBTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQ6ICdTZXQgQXBwSWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUOiAnU2V0IEJ1Y2tldCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBOiAnU2V0IEFyZWEnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfRU5EUE9JTlQ6ICdTZXQgRW5kcG9pbnQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlM6ICdTZXQgVVJMIFN1ZmZpeCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkw6ICdTZXQgQ3VzdG9tIFVSTCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEOiAnRXguIDEyMzQ1Njc4OTAnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9BUkVBOiAnRXguIGFwLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAnRXguIGh0dHA6Ly90ZXN0LmNvbScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlM6ICdFeC4gP2ltYWdlTW9ncjInLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9FTkRQT0lOVDogJ0V4LiBjb3MtaW50ZXJuYWwuYWNjZWxlcmF0ZS50ZW5jZW50Y29zLmNuJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU06ICfmpbXmmbrlo5PnuK4nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTV9DQU5DRUw6ICfpl5zploknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTV9DT05GSVJNOiAn6ZaL5ZWTJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU1fVElQOiAn5ZyW54mH5qW15pm65aOT57iu77yM6Kmz5oOF6KuL5Y+D6ICDW+aWh+aqlOiqquaYjl0oaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi80OTI1OSknLFxyXG5cclxuICAvLyBHaXRIdWJcclxuICBQSUNCRURfR0lUSFVCOiAnR2l0SHViJyxcclxuICBQSUNCRURfR0lUSFVCX1RPS0VOOiAnU2V0IFRva2VuJyxcclxuICBQSUNCRURfR0lUSFVCX1JFUE86ICdTZXQgUmVwbyBOYW1lJyxcclxuICBQSUNCRURfR0lUSFVCX1BBVEg6ICdTZXQgUGF0aCcsXHJcbiAgUElDQkVEX0dJVEhVQl9CUkFOQ0g6ICdTZXQgQnJhbmNoJyxcclxuICBQSUNCRURfR0lUSFVCX0NVU1RPTVVSTDogJ1NldCBDdXN0b20gVVJMJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTzogJ0V4LiB1c2VybmFtZS9yZXBvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIOiAnRXguIG1haW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMOiAnRXguIGh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBxaW5pdVxyXG4gIFBJQ0JFRF9RSU5JVTogJ1Fpbml1JyxcclxuICBQSUNCRURfUUlOSVVfQUNDRVNTS0VZOiAnU2V0IEFjY2Vzc0tleScsXHJcbiAgUElDQkVEX1FJTklVX1NFQ1JFVEtFWTogJ1NldCBTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9RSU5JVV9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfUUlOSVVfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfUUlOSVVfVVJMOiAnU2V0IFVSTCcsXHJcbiAgUElDQkVEX1FJTklVX09QVElPTlM6ICdTZXQgVVJMIFN1ZmZpeCcsXHJcbiAgUElDQkVEX1FJTklVX0FSRUE6ICdTZXQgQXJlYScsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSDogJ0V4LiB0ZXN0LycsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQTogJ0V4LiB6MCcsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUzogJ0V4LiA/aW1hZ2VzbGltJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9VUkw6ICdFeC4gaHR0cHM6Ly94eHgueXl5LmdsYi5jbG91ZGRuLmNvbScsXHJcblxyXG4gIC8vIHRlbGVncmFwaFxyXG4gIFBJQ0JFRF9URUxFR1JBUEg6ICdUZWxlZ3JhcGgnLFxyXG5cclxuICAvLyBpbWd1clxyXG4gIFBJQ0JFRF9JTUdVUjogJ0ltZ3VyJyxcclxuICBQSUNCRURfSU1HVVJfQ0xJRU5USUQ6ICdTZXQgQ2xpZW50SWQnLFxyXG4gIFBJQ0JFRF9JTUdVUl9VU0VSTkFNRTogJ1NldCBVc2VybmFtZScsXHJcbiAgUElDQkVEX0lNR1VSX0FDQ0VTU19UT0tFTjogJ1NldCBBY2Nlc3MgVG9rZW4nLFxyXG4gIFBJQ0JFRF9JTUdVUl9BTEJVTTogJ1NldCBBbGJ1bSBOYW1lJyxcclxuICBQSUNCRURfSU1HVVJfUFJPWFk6ICdTZXQgUHJveHknLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX0NMSUVOVElEOiAnRmlsbCBpbiB3aGVuIHlvdSBuZWVkIHRvIHVwbG9hZCBhcyBhbm9ueW1vdXMnLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1VTRVJOQU1FOiAnRmlsbCBpbiB3aGVuIHlvdSBuZWVkIHRvIHVwbG9hZCB0byB0aGUgYWNjb3VudCcsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfQUNDRVNTX1RPS0VOOiAnRmlsbCBpbiB3aGVuIHlvdSBuZWVkIHRvIHVwbG9hZCB0byB0aGUgYWNjb3VudCcsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfQUxCVU06ICfkvovlpoLvvJp0ZXN0JyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogJ0V4LiBodHRwOi8vMTI3LjAuMC4xOjEwODAnLFxyXG5cclxuICAvLyB1cHl1blxyXG4gIFBJQ0JFRF9VUFlVTjogJ1VweXVuJyxcclxuICBQSUNCRURfVVBZVU5fQlVDS0VUOiAnU2V0IEJ1Y2tldCcsXHJcbiAgUElDQkVEX1VQWVVOX09QRVJBVE9SOiAnU2V0IE9wZXJhdG9yJyxcclxuICBQSUNCRURfVVBZVU5fUEFTU1dPUkQ6ICdTZXQgT3BlcmF0b3IgUGFzc3dvcmQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9VUFlVTl9VUkw6ICdTZXQgVVJMJyxcclxuICBQSUNCRURfVVBZVU5fT1BUSU9OUzogJ1NldCBVUkwgU3VmZml4JyxcclxuICBQSUNCRURfVVBZVU5fQU5USV9MRUVDSF9UT0tFTjogJ1NldCBBbnRpLUxlZWNoIFRva2VuJyxcclxuICBQSUNCRURfVVBZVU5fRVhQSVJFX1RJTUU6ICdTZXQgRXhwaXJlIFRpbWUoc2Vjb25kcyknLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SOiAnRXguIG1lJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRDogJ1BsZWFzZSB0eXBlIHRoZSBvcGVyYXRvciBwYXNzd29yZCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMOiAnRXguIGh0dHA6Ly94eHgudGVzdC51cGNkbi5uZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlM6ICdFeC4gIWltZ3NsaW0nLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG5cclxuICAvLyB3ZWJkYXZcclxuICBQSUNCRURfV0VCREFWUExJU1Q6ICdXZWJEQVYnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9IT1NUOiAnU2V0IEhvc3QnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEOiAnRW5hYmxlIEhUVFBTJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfVVNFUk5BTUU6ICdTZXQgVXNlcm5hbWUnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9QQVNTV09SRDogJ1NldCBQYXNzd29yZCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1BBVEg6ICdTZXQgUGF0aCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1dFQlNJVEVfUEFUSDogJ1NldCBXZWJzaXRlIFBhdGgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9DVVNUT01VUkw6ICdTZXQgQ3VzdG9tIFVSTCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0FVVEhUWVBFOiAnU2V0IEF1dGggVHlwZScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfSE9TVDogJ0V4LiBodHRwczovL2V4YW1wbGUuY29tL3dlYmRhdicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfU1NMRU5BQkxFRDogJ0VuYWJsZSBIVFRQUycsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfVVNFUk5BTUU6ICdFeC4gbWUnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBU1NXT1JEOiAnUGxlYXNlIHR5cGUgdGhlIHBhc3N3b3JkJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEg6ICdVc2VkIHRvIGdlbmVyYXRlIHRoZSBVUkwgb2YgdGhlIGltYWdlJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIHNmdHBwbGlzdFxyXG4gIFBJQ0JFRF9TRlRQUExJU1Q6ICdTRlRQIEJ1aWxkaW4nLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfSE9TVDogJ1NldCBIb3N0JyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1BPUlQ6ICdTZXQgUG9ydCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9VU0VSTkFNRTogJ1NldCBVc2VybmFtZScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9QQVNTV09SRDogJ1NldCBQYXNzd29yZCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9QUklWQVRFS0VZOiAnU2V0IFByaXZhdGUgS2V5JyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1BSSVZBVEVLRVlfUEFTU1BIUkFTRTogJ1NldCBQcml2YXRlIEtleSBQYXNzcGhyYXNlJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1VQTE9BRFBBVEg6ICdTZXQgVXBsb2FkIFBhdGgnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfQ1VTVE9NVVJMOiAnU2V0IEN1c3RvbSBVUkwnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfV0VCU0lURV9QQVRIOiAnU2V0IFdlYnNpdGUgUGF0aCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9GSUxFX1VTRVI6ICdTZXQgRmlsZSBVc2VyOkdyb3VwJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX0ZJTEVfTU9ERTogJ1NldCBGaWxlIE1vZGUnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfRElSX01PREU6ICdTZXQgRGlyZWN0b3J5IE1vZGUnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9IT1NUOiAnRXguIDEuMS4xLjMnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9QT1JUOiAnRGVmYXVsdCAyMicsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1BSSVZBVEVLRVk6ICdFeC4gL1VzZXJzL3h4eC8uc3NoL2lkX3JzYScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1BSSVZBVEVLRVlfUEFTU1BIUkFTRTogJ1BsZWFzZSB0eXBlIHRoZSBwcml2YXRlIGtleSBwYXNzcGhyYXNlJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfVVBMT0FEUEFUSDogJ0V4LiB0ZXN0LycsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0NVU1RPTVVSTDogJ0V4LiBodHRwczovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfV0VCU0lURV9QQVRIOiAnVXNlZCB0byBnZW5lcmF0ZSB0aGUgVVJMIG9mIHRoZSBpbWFnZScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0ZJTEVfVVNFUjogJ0V4LiB3d3c6ZGF0YScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0ZJTEVfTU9ERTogJ0V4LiAwNjY0JyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfRElSX01PREU6ICdFeC4gMDc3NScsXHJcblxyXG4gIC8vIFBpY0xpc3RcclxuICBQSUNCRURfUElDTElTVDogJ1BpY0xpc3QnLFxyXG4gIFBJQ0JFRF9QSUNMSVNUX0hPU1Q6ICdTZXQgSG9zdCcsXHJcbiAgUElDQkVEX1BJQ0xJU1RfUE9SVDogJ1NldCBQb3J0JyxcclxuICBQSUNCRURfUElDTElTVF9QSUNCRUQ6ICdTZXQgUGljQmVkJyxcclxuICBQSUNCRURfUElDTElTVF9DT05GSUdOQU1FOiAnU2V0IENvbmZpZyBOYW1lJyxcclxuICBQSUNCRURfUElDTElTVF9LRVk6ICdTZXQgS2V5JyxcclxuXHJcbiAgQlVJTERJTl9SRU5BTUVfRk9STUFUOiAnU2V0IHJlbmFtZSBmb3JtYXQnLFxyXG4gIEJVSUxESU5fUkVOQU1FX0VOQUJMRTogJ0VuYWJsZSByZW5hbWUnLFxyXG5cclxuICBCVUlMRElOX1dBVEVSTUFSS19JU0FERFdBVEVSTUFSSzogJ1doZXRoZXIgdG8gYWRkIHdhdGVybWFyaycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9JU0FERFdBVEVSTUFSSzogJ0VuYWJsZSB3aGVuIHdhdGVybWFyayBpcyByZXF1aXJlZCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVFlQRTogJ1NldCB3YXRlcm1hcmsgdHlwZScsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktUWVBFOiAnUGxlYXNlIHNlbGVjdCB3YXRlcm1hcmsgdHlwZScsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfSVNGVUxMU0NSRUVOV0FURVJNQVJLOiAnV2hldGhlciB0byB1c2UgZnVsbC1zY3JlZW4gd2F0ZXJtYXJrJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX0lTRlVMTFNDUkVFTldBVEVSTUFSSzogJ0VuYWJsZSB3aGVuIGZ1bGwtc2NyZWVuIHdhdGVybWFyayBpcyByZXF1aXJlZCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLREVHUkVFOiAnU2V0IHdhdGVybWFyayBhbmdsZScsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktERUdSRUU6ICdQbGVhc2UgZW50ZXIgYSBudW1iZXInLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RFWFQ6ICdTZXQgd2F0ZXJtYXJrIHRleHQnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLVEVYVDogJ1BsZWFzZSBlbnRlciB3YXRlcm1hcmsgdGV4dCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVEVYVEZPTlRQQVRIOiAnU2V0IHdhdGVybWFyayBmb250JyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRQQVRIOiAnUGxlYXNlIGVudGVyIHRoZSB3YXRlcm1hcmsgZm9udCBmaWxlIHBhdGgnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRSQVRJTzogJ1NldCB0aGUgcmF0aW8gb2YgdGhlIHdhdGVybWFyayB0byB0aGUgaW1hZ2UnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVFJBVElPOiAnUGxlYXNlIGVudGVyIGEgbnVtYmVyIGJldHdlZW4gMC0xJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktGT05UQ09MT1I6ICdTZXQgd2F0ZXJtYXJrIGZvbnQgY29sb3InLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVENPTE9SOiAnUGxlYXNlIGVudGVyIHRoZSBSR0IgY29sb3IgdmFsdWUnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0lNQUdFUEFUSDogJ1NldCB3YXRlcm1hcmsgaW1hZ2UgcGF0aCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktJTUFHRVBBVEg6ICdQbGVhc2UgZW50ZXIgdGhlIHdhdGVybWFyayBpbWFnZSBwYXRoJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktQT1NJVElPTjogJ1NldCB3YXRlcm1hcmsgcG9zaXRpb24nLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLUE9TSVRJT046ICdQbGVhc2Ugc2VsZWN0IHdhdGVybWFyayBwb3NpdGlvbicsXHJcblxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUVVBTElUWTogJ1NldCBpbWFnZSBxdWFsaXR5JyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUVVBTElUWTogJ1BsZWFzZSBlbnRlciBhbiBpbnRlZ2VyIGJldHdlZW4gMC0xMDAnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNDT05WRVJUOiAnV2hldGhlciB0byBwZXJmb3JtIGZvcm1hdCBjb252ZXJzaW9uJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNDT05WRVJUOiAnRW5hYmxlIHdoZW4gZm9ybWF0IGNvbnZlcnNpb24gaXMgcmVxdWlyZWQnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfQ09OVkVSVEZPUk1BVDogJ1NldCBjb252ZXJzaW9uIGZvcm1hdCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0NPTlZFUlRGT1JNQVQ6ICdQbGVhc2Ugc2VsZWN0IGNvbnZlcnNpb24gZm9ybWF0JyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTUkVTSVpFOiAnV2hldGhlciB0byByZXNpemUgdGhlIGltYWdlJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNSRVNJWkU6ICdFbmFibGUgd2hlbiBpbWFnZSByZXNpemluZyBpcyByZXF1aXJlZCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19SRVNJWkVXSURUSDogJ1NldCByZXNpemluZyB3aWR0aCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRVdJRFRIOiAnUGxlYXNlIGVudGVyIGEgbnVtYmVyJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1JFU0laRUhFSUdIVDogJ1NldCByZXNpemluZyBoZWlnaHQnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVIRUlHSFQ6ICdQbGVhc2UgZW50ZXIgYSBudW1iZXInLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkVCWVBFUkNFTlQ6ICdXaGV0aGVyIHRvIHJlc2l6ZSB0aGUgaW1hZ2UgYnkgcGVyY2VudGFnZScsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVTSVpFQllQRVJDRU5UOiAnRW5hYmxlIHdoZW4gcmVzaXppbmcgYnkgcGVyY2VudGFnZSBpcyByZXF1aXJlZCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU0ZMSVA6ICdXaGV0aGVyIHRvIGZsaXAgdGhlIGltYWdlIHZlcnRpY2FsbHknLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNGTE9QOiAnV2hldGhlciB0byBmbGlwIHRoZSBpbWFnZSBob3Jpem9udGFsbHknLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUkVTSVpFUEVSQ0VOVDogJ1NldCByZXNpemluZyBwZXJjZW50YWdlJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFUEVSQ0VOVDogJ1BsZWFzZSBlbnRlciBhIG51bWJlcicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19TS0lQUkVTSVpFT0ZTTUFMTElNRzogJ1doZXRoZXIgdG8gc2tpcCByZXNpemluZyBvZiBzbWFsbCBpbWFnZXMnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNST1RBVEU6ICdXaGV0aGVyIHRvIHJvdGF0ZSB0aGUgaW1hZ2UnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JPVEFURTogJ0VuYWJsZSB3aGVuIGltYWdlIHJvdGF0aW9uIGlzIHJlcXVpcmVkJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1JPVEFURURFR1JFRTogJ1NldCByb3RhdGlvbiBhbmdsZScsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JPVEFURURFR1JFRTogJ1BsZWFzZSBlbnRlciBhIG51bWJlciwgY2FuIGJlIG5lZ2F0aXZlJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTUkVNT1ZFRVhJRjogJ1doZXRoZXIgdG8gcmVtb3ZlIEVYSUYgaW5mb3JtYXRpb24nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JFTU9WRUVYSUY6ICdFbmFibGUgd2hlbiByZW1vdmluZyBFWElGIGluZm9ybWF0aW9uIGlzIHJlcXVpcmVkJyxcclxuICAvLyBQbHVnaW4gSGFuZGxlclxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1M6ICdQbHVnaW4gaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEOiAnUGx1Z2luIGluc3RhbGxhdGlvbiBmYWlsZWQnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT046ICdQbHVnaW4gaW5zdGFsbGF0aW9uIGZhaWxlZCwgZXJyb3IgY29kZSBpcyAke2NvZGV9LCBlcnJvciBsb2cgaXMgXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9QQVRIOiAnUGx1Z2luIGluc3RhbGxhdGlvbiBmYWlsZWQsIHBsZWFzZSBlbnRlciBhIHZhbGlkIHBsdWdpbiBuYW1lIG9yIHZhbGlkIGluc3RhbGxhdGlvbiBwYXRoJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1M6ICdQbHVnaW4gdW5pbnN0YWxsZWQgc3VjY2Vzc2Z1bGx5JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRDogJ1BsdWdpbiB1bmluc3RhbGwgZmFpbGVkJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT046ICdQbHVnaW4gdW5pbnN0YWxsIGZhaWxlZCwgZXJyb3IgY29kZSBpcyAke2NvZGV9LCBlcnJvciBsb2cgaXMgXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEOiAnUGx1Z2luIHVuaW5zdGFsbCBmYWlsZWQsIHBsZWFzZSBlbnRlciBhIHZhbGlkIHBsdWdpbiBuYW1lJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX1NVQ0NFU1M6ICdQbHVnaW4gdXBkYXRlZCBzdWNjZXNzZnVsbHknLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEOiAnUGx1Z2luIHVwZGF0ZSBmYWlsZWQnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1JFQVNPTjogJ1BsdWdpbiB1cGRhdGUgZmFpbGVkLCBlcnJvciBjb2RlIGlzICR7Y29kZX0sIGVycm9yIGxvZyBpcyBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQ6ICdQbHVnaW4gdXBkYXRlIGZhaWxlZCwgcGxlYXNlIGVudGVyIGEgdmFsaWQgcGx1Z2luIG5hbWUnXHJcbn1cclxuIiwiaW1wb3J0IHsgdHlwZSBJTG9jYWxlcyB9IGZyb20gJy4vemgtQ04nXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcgKi9cclxuZXhwb3J0IGNvbnN0IFpIX1RXOiBJTG9jYWxlcyA9IHtcclxuICBVUExPQURfRkFJTEVEOiAn5LiK5YKz5aSx5pWXJyxcclxuICBDSEVDS19TRVRUSU5HUzogJ+iri+aqouafpeS9oOeahOioreWumuaYr+WQpuato+eiuicsXHJcbiAgQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUks6ICfoq4vmqqLmn6XkvaDnmoToqK3lrprlj4rntrLot68nLFxyXG4gIFVQTE9BRF9GQUlMRURfUkVBU09OOiAn6Yyv6Kqk56K877yaJHtjb2Rlfe+8jOiri+aJk+mWi+eAj+imveWZqOiyvOS4iuWcsOWdgOafpeeci+ebuOmXnOWOn+WboCcsXHJcbiAgU0VSVkVSX0VSUk9SOiAn5Ly65pyN5Zmo5Ye66Yyv77yM6KuL6YeN6KmmJyxcclxuICBBVVRIX0ZBSUxFRDogJ+iqjeitieWkseaVlycsXHJcblxyXG4gIC8vIHNtbXNcclxuICBQSUNCRURfU01NUzogJ1NNLk1TJyxcclxuICBQSUNCRURfU01NU19UT0tFTjogJ+ioreWumlRva2VuJyxcclxuICBQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOOiAn5YKZ55So5LiK5YKz57ay5Z2AJyxcclxuICBQSUNCRURfU01NU19NRVNTQUdFX0JBQ0tVUF9ET01BSU46ICfkvovlpoIgc21tcy5hcHAnLFxyXG5cclxuICAvLyBsb2NhbFxyXG4gIFBJQ0JFRF9MT0NBTDogJ+acrOWcsCcsXHJcbiAgUElDQkVEX0xPQ0FMX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9MT0NBTF9NRVNTQUdFX1BBVEg6ICfkvovlpoIgL3Vzci9sb2NhbC9pbWFnZXMvJyxcclxuICBQSUNCRURfTE9DQUxfQ1VTVE9NVVJMOiAn6Kit5a6a6Ieq6KiC57ay5Z2AJyxcclxuICBQSUNCRURfTE9DQUxfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoIgaHR0cHM6Ly90ZXN0LmNvbScsXHJcbiAgUElDQkVEX0xPQ0FMX1dFQlBBVEg6ICfoqK3lrprntrLlnYDot6/lvpEnLFxyXG4gIFBJQ0JFRF9MT0NBTF9NRVNTQUdFX1dFQlBBVEg6ICfnlKjkuo7ntrLpoIHpoa/npLrnmoTot6/lvpEnLFxyXG5cclxuICAvLyBBbGktY2xvdWRcclxuICBQSUNCRURfQUxJQ0xPVUQ6ICfpmL/ph4zkupFPU1MnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRDogJ+ioreWumktleUlkJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUOiAn6Kit5a6aS2V5U2VjcmV0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQlVDS0VUOiAn6Kit5a6aQnVja2V0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfQVJFQTogJ+ioreWumuWEsuWtmOWNgOWfnycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkw6ICfoqK3lrproh6roqILntrLlnYAnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9PUFRJT05TOiAn6Kit5a6a57ay5Z2A5b6M57a0JyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yab3NzLWNuLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj94LW9zcy1wcm9jZXNzPXh4eCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIFRlbmNlbnQtY2xvdWRcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEOiAn6aiw6KiK5LqRQ09TJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1ZFUlNJT046ICdDT1PniYjmnKwnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQ6ICfoqK3lrppTZWNyZXRJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRLRVk6ICfoqK3lrppTZWNyZXRLZXknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVBQSUQ6ICfoqK3lrppBcHBJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVQ6ICfoqK3lrppCdWNrZXQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQVJFQTogJ+ioreWumuWEsuWtmOWNgOWfnycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9FTkRQT0lOVDogJ+ioreWumuaOpeWFpem7nicsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlM6ICfoqK3lrprntrLlnYDlvozntrQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQ1VTVE9NVVJMOiAn6Kit5a6a6Ieq6KiC57ay5Z2AJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQ6ICfkvovlpoLvvJoxMjM0NTY3ODkwJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mmFwLWJlaWppbmcnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj9pbWFnZU1vZ3IyJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfRU5EUE9JTlQ6ICfkvovlpoLvvJpjb3MtaW50ZXJuYWwuYWNjZWxlcmF0ZS50ZW5jZW50Y29zLmNuJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU06ICdTZXQgSW1hZ2VTbGltJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NMSU1fVElQOiAnSW1hZ2UgZXh0cmVtZWx5IGludGVsbGlnZW50IGNvbXByZXNzaW9uLCBwbGVhc2UgcmVmZXIgdG8gdGhlIFtkb2N1bWVudCBkZXNjcmlwdGlvbl0oaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi80OTI1OSknLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTV9DT05GSVJNOiAnT1BFTicsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9TTElNX0NBTkNFTDogJ0NMT1NFJyxcclxuXHJcbiAgLy8gR2l0SHViXHJcbiAgUElDQkVEX0dJVEhVQjogJ0dpdEh1YicsXHJcbiAgUElDQkVEX0dJVEhVQl9UT0tFTjogJ+ioreWumlRva2VuJyxcclxuICBQSUNCRURfR0lUSFVCX1JFUE86ICfoqK3lrprlgInluqvlkI3nqLEnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX0dJVEhVQl9CUkFOQ0g6ICfoqK3lrprliIbmlK/lkI3nqLEnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMOiAn6Kit5a6a6Ieq6KiC57ay5Z2AJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUkVQTzogJ+agvOW8j++8mnVzZXJuYW1lL3JlcG8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0g6ICfkvovlpoLvvJptYWluJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIHFpbml1XHJcbiAgUElDQkVEX1FJTklVOiAn5LiD54mb5LqRJyxcclxuICBQSUNCRURfUUlOSVVfQUNDRVNTS0VZOiAn6Kit5a6aQWNjZXNzS2V5JyxcclxuICBQSUNCRURfUUlOSVVfU0VDUkVUS0VZOiAn6Kit5a6aU2VjcmV0S2V5JyxcclxuICBQSUNCRURfUUlOSVVfQlVDS0VUOiAn6Kit5a6aQnVja2V0JyxcclxuICBQSUNCRURfUUlOSVVfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX1FJTklVX1VSTDogJ+ioreWumuioquWVj+e2suWdgCcsXHJcbiAgUElDQkVEX1FJTklVX09QVElPTlM6ICfoqK3lrprntrLlnYDlvozntrQnLFxyXG4gIFBJQ0JFRF9RSU5JVV9BUkVBOiAn6Kit5a6a5YSy5a2Y5Y2A5Z+fJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJp6MCcsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8mj9pbWFnZXNsaW0nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTDogJ+S+i+Wmgu+8mmh0dHBzOi8veHh4Lnl5eS5nbGIuY2xvdWRkbi5jb20nLFxyXG4gIFBJQ0JFRF9URUxFR1JBUEg6ICdUZWxlZ3JhcGgnLFxyXG4gIC8vIGltZ3VyXHJcbiAgUElDQkVEX0lNR1VSOiAnSW1ndXInLFxyXG4gIFBJQ0JFRF9JTUdVUl9DTElFTlRJRDogJ+ioreWumkNsaWVudElkJyxcclxuICBQSUNCRURfSU1HVVJfVVNFUk5BTUU6ICfoqK3lrprnlKjmiLblkI0nLFxyXG4gIFBJQ0JFRF9JTUdVUl9BQ0NFU1NfVE9LRU46ICfoqK3lrpphY2Nlc3NUb2tlbicsXHJcbiAgUElDQkVEX0lNR1VSX0FMQlVNOiAn6Kit5a6a55u457C/5ZCNJyxcclxuICBQSUNCRURfSU1HVVJfUFJPWFk6ICfoqK3lrppQUk9YWScsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfQ0xJRU5USUQ6ICfljL/lkI3kuIrlgrPmmYLloavlr6snLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1VTRVJOQU1FOiAn6ZyA6KaB5LiK5YKz5Yiw6LOs5oi25pmC5aGr5a+rJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9BQ0NFU1NfVE9LRU46ICfpnIDopoHkuIrlgrPliLDos6zmiLbmmYLloavlr6snLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX0FMQlVNOiAn5L6L5aaC77yadGVzdCcsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfUFJPWFk6ICfkvovlpoLvvJpodHRwOi8vMTI3LjAuMC4xOjEwODAnLFxyXG5cclxuICAvLyB1cHl1blxyXG4gIFBJQ0JFRF9VUFlVTjogJ+WPiOaLjeS6kScsXHJcbiAgUElDQkVEX1VQWVVOX0JVQ0tFVDogJ+ioreWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX1VQWVVOX09QRVJBVE9SOiAn6Kit5a6a5pON5L2c5ZOhJyxcclxuICBQSUNCRURfVVBZVU5fUEFTU1dPUkQ6ICfoqK3lrprmk43kvZzlk6Hlr4bnorwnLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfVVBZVU5fVVJMOiAn6Kit5a6a5Yqg6YCf57ay5Z2AJyxcclxuICBQSUNCRURfVVBZVU5fT1BUSU9OUzogJ+ioreWumue2suWdgOW+jOe2tCcsXHJcbiAgUElDQkVEX1VQWVVOX0FOVElfTEVFQ0hfVE9LRU46ICfoqK3lrprpmLLnm5zpj4hUb2tlbicsXHJcbiAgUElDQkVEX1VQWVVOX0VYUElSRV9USU1FOiAn6Kit5a6a6YGO5pyf5pmC6ZaTKOenkiknLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SOiAn5L6L5aaC77yabWUnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEOiAn6Ly45YWl5pON5L2c5ZOh5a+G56K8JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkw6ICfkvovlpoLvvJpodHRwOi8veHh4LnRlc3QudXBjZG4ubmV0JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUFRJT05TOiAn5L6L5aaC77yaIWltZ3NsaW0nLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcblxyXG4gIC8vIHdlYmRhdlxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVDogJ1dlYkRBVicsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0hPU1Q6ICfoqK3lrppBUEnkuLvmqZ8nLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEOiAn6ZyA6KaBSFRUUFPmmYLllZ/nlKgnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9VU0VSTkFNRTogJ+ioreWumueUqOaItuWQjScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX1BBU1NXT1JEOiAn6Kit5a6a5a+G56K8JyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTDogJ+ioreWumuiHquiogue2suWdgCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX0FVVEhUWVBFOiAn6Kit5a6a6KqN6K2J5pa55byPJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfV0VCU0lURV9QQVRIOiAn6Kit5a6a57ay56uZ6Lev5b6RJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9IT1NUOiAn5L6L5aaC77yaaHR0cHM6Ly9leGFtcGxlLmNvbS93ZWJkYXYnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1NTTEVOQUJMRUQ6ICfpnIDopoFIVFRQU+aZguWVn+eUqCcsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfVVNFUk5BTUU6ICfkvovlpoLvvJptZScsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfUEFTU1dPUkQ6ICfovLjlhaXnlKjmiLblr4bnorwnLFxyXG4gIFBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfV0VCU0lURV9QQVRIOiAn5ou85o6l57ay5Z2A5pmC5L2/55SoJyxcclxuICBQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gc2Z0cHBsaXN0XHJcbiAgUElDQkVEX1NGVFBQTElTVDogJ+WFp+e9rlNGVFAnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfSE9TVDogJ+ioreWumuS4u+apnycsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9QT1JUOiAn6Kit5a6a56uv5Y+jJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1VTRVJOQU1FOiAn6Kit5a6a55So5oi25ZCNJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1BBU1NXT1JEOiAn6Kit5a6a5a+G56K8JyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1BSSVZBVEVLRVk6ICfoqK3lrprnp4HpkbAnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfUFJJVkFURUtFWV9QQVNTUEhSQVNFOiAn6Kit5a6a56eB6ZGw5a+G56K8JyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1VQTE9BRFBBVEg6ICfoqK3lrprkuIrlgrPot6/lvpEnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfQ1VTVE9NVVJMOiAn6Kit5a6a6Ieq6KiC57ay5Z2AJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX1dFQlNJVEVfUEFUSDogJ+ioreWumue2suermei3r+W+kScsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9GSUxFX1VTRVI6ICfoqK3lrprmlofku7bnlKjmiLY657WEJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX0ZJTEVfTU9ERTogJ+ioreWumuaWh+S7tuasiumZkCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9ESVJfTU9ERTogJ+ioreWumuaWh+S7tuWkvuasiumZkCcsXHJcbiAgUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0hPU1Q6ICfkvovlpoLvvJoxLjEuMS4zJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfUE9SVDogJ+m7mOiqjTIyJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfUFJJVkFURUtFWTogJ+S+i+Wmgu+8mi9Vc2Vycy94eHgvLnNzaC9pZF9yc2EnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9QUklWQVRFS0VZX1BBU1NQSFJBU0U6ICfovLjlhaXnp4HpkbDlr4bnorwnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9VUExPQURQQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9DVVNUT01VUkw6ICfkvovlpoLvvJpodHRwczovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfV0VCU0lURV9QQVRIOiAn5ou85o6l57ay5Z2A5pmC5L2/55SoJyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfRklMRV9VU0VSOiAn5L6L5aaC77yad3d3OmRhdGEnLFxyXG4gIFBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9GSUxFX01PREU6ICfkvovlpoLvvJowNjY0JyxcclxuICBQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfRElSX01PREU6ICfkvovlpoLvvJowNzc1JyxcclxuXHJcbiAgLy8gUGljTGlzdFxyXG4gIFBJQ0JFRF9QSUNMSVNUOiAnUGljTGlzdCcsXHJcbiAgUElDQkVEX1BJQ0xJU1RfSE9TVDogJ+ioreWumuS4u+apnycsXHJcbiAgUElDQkVEX1BJQ0xJU1RfUE9SVDogJ+ioreWumuerr+WPoycsXHJcbiAgUElDQkVEX1BJQ0xJU1RfUElDQkVEOiAn6Kit5a6a5ZyW5bqKJyxcclxuICBQSUNCRURfUElDTElTVF9DT05GSUdOQU1FOiAn6Kit5a6a6YWN572u5ZCNJyxcclxuICBQSUNCRURfUElDTElTVF9LRVk6ICfoqK3lrprpkZLmrIpLZXknLFxyXG5cclxuICBCVUlMRElOX1dBVEVSTUFSS19JU0FERFdBVEVSTUFSSzogJ+aYr+WQpua3u+WKoOawtOWNsCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9JU0FERFdBVEVSTUFSSzogJ+mcgOimgea3u+WKoOawtOWNsOaZguWVn+eUqCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVFlQRTogJ+ioreWumuawtOWNsOmhnuWeiycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktUWVBFOiAn6KuL6YG45pOH5rC05Y2w6aGe5Z6LJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19JU0ZVTExTQ1JFRU5XQVRFUk1BUks6ICfmmK/lkKblhajlsY/msLTljbAnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfSVNGVUxMU0NSRUVOV0FURVJNQVJLOiAn6ZyA6KaB5YWo5bGP5rC05Y2w5pmC5ZWf55SoJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktERUdSRUU6ICfoqK3lrprmsLTljbDop5LluqYnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLREVHUkVFOiAn6KuL6Ly45YWl5pW45a2XJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktURVhUOiAn6Kit5a6a5rC05Y2w5paH5a2XJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1RFWFQ6ICfoq4vovLjlhaXmsLTljbDmloflrZcnLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RFWFRGT05UUEFUSDogJ+ioreWumuawtOWNsOWtl+mrlCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktGT05UUEFUSDogJ+iri+i8uOWFpeawtOWNsOWtl+mrlOaWh+S7tui3r+W+kScsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLRk9OVFJBVElPOiAn6Kit5a6a5rC05Y2w5ZyW54mH5q+U5L6LJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRSQVRJTzogJ+iri+i8uOWFpTAtMeeahOaVuOWtlycsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLRk9OVENPTE9SOiAn6Kit5a6a5rC05Y2w5a2X6auU6aGP6ImyJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRDT0xPUjogJ+iri+i8uOWFpXJnYumhj+iJsuWAvCcsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLSU1BR0VQQVRIOiAn6Kit5a6a5rC05Y2w5ZyW54mH6Lev5b6RJyxcclxuICBCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0lNQUdFUEFUSDogJ+iri+i8uOWFpeawtOWNsOWclueJh+i3r+W+kScsXHJcbiAgQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLUE9TSVRJT046ICfoqK3lrprmsLTljbDkvY3nva4nLFxyXG4gIEJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLUE9TSVRJT046ICfoq4vpgbjmk4fmsLTljbDkvY3nva4nLFxyXG5cclxuICBCVUlMRElOX1JFTkFNRV9GT1JNQVQ6ICfoqK3lrprph43lkb3lkI3moLzlvI8nLFxyXG4gIEJVSUxESU5fUkVOQU1FX0VOQUJMRTogJ+aYr+WQpuWVn+eUqOmHjeWRveWQjScsXHJcblxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUVVBTElUWTogJ+ioreWumuWclueJh+izqumHjycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1FVQUxJVFk6ICfoq4vovLjlhaUwLTEwMOeahOaVtOaVuCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU0NPTlZFUlQ6ICfmmK/lkKbpgLLooYzmoLzlvI/ovYnmj5snLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU0NPTlZFUlQ6ICfpnIDopoHovYnmj5vmmYLllZ/nlKgnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfQ09OVkVSVEZPUk1BVDogJ+ioreWumui9ieaPm+agvOW8jycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0NPTlZFUlRGT1JNQVQ6ICfoq4vpgbjmk4fovYnmj5vmoLzlvI8nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNSRVNJWkU6ICfmmK/lkKbpgLLooYzlnJbniYfnuK7mlL4nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JFU0laRTogJ+mcgOimgee4ruaUvuaZguWVn+eUqCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19SRVNJWkVXSURUSDogJ+ioreWumue4ruaUvuWvrOW6picsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRVdJRFRIOiAn6KuL6Ly45YWl5pW45a2XJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX1JFU0laRUhFSUdIVDogJ+ioreWumue4ruaUvumrmOW6picsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRUhFSUdIVDogJ+iri+i8uOWFpeaVuOWtlycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU1JFU0laRUJZUEVSQ0VOVDogJ+aYr+WQpuaMieeZvuWIhuavlOmAsuihjOe4ruaUvicsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVTSVpFQllQRVJDRU5UOiAn6ZyA6KaB5oyJ55m+5YiG5q+U57iu5pS+5pmC5ZWf55SoJyxcclxuICBCVUlMRElOX0NPTVBSRVNTX0lTRkxJUDogJ+aYr+WQpuWeguebtOe/u+i9ieWclueJhycsXHJcbiAgQlVJTERJTl9DT01QUkVTU19JU0ZMT1A6ICfmmK/lkKbmsLTlubPnv7vovYnlnJbniYcnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfUkVTSVpFUEVSQ0VOVDogJ+ioreWumue4ruaUvueZvuWIhuavlCcsXHJcbiAgQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX1JFU0laRVBFUkNFTlQ6ICfoq4vovLjlhaXmlbDlrZcnLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfU0tJUFJFU0laRU9GU01BTExJTUc6ICfmmK/lkKbot7PpgY7lsI/lnJbnuK7mlL4nLFxyXG4gIEJVSUxESU5fQ09NUFJFU1NfSVNST1RBVEU6ICfmmK/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+iqpOe0gOmMhOeCuiBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQ6ICfmj5Lku7bmm7TmlrDlpLHmlZfvvIzoq4vovLjlhaXmraPnorrnmoTmj5Lku7blkI3nqLEnXHJcbn1cclxuIiwiaW1wb3J0IHsgWkhfQ04sIHR5cGUgSUxvY2FsZXNLZXksIHR5cGUgSUxvY2FsZXMgfSBmcm9tICcuL3poLUNOJ1xyXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgdHlwZSBJUGljR28gfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJ1xyXG5cclxuaW1wb3J0IHsgT2JqZWN0QWRhcHRlciwgSTE4biB9IGZyb20gJ0BwaWNnby9pMThuJ1xyXG5pbXBvcnQgeyB0eXBlIElTdHJpbmdLZXlNYXAsIHR5cGUgSUkxOG5NYW5hZ2VyIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnXHJcbmltcG9ydCB7IHR5cGUgSUxvY2FsZSB9IGZyb20gJ0BwaWNnby9pMThuL2Rpc3QvdHlwZXMnXHJcbmltcG9ydCB7IEVOIH0gZnJvbSAnLi9lbidcclxuaW1wb3J0IHsgWkhfVFcgfSBmcm9tICcuL3poLVRXJ1xyXG5cclxuY29uc3QgbGFuZ3VhZ2VMaXN0OiBJU3RyaW5nS2V5TWFwPElTdHJpbmdLZXlNYXA8c3RyaW5nPj4gPSB7XHJcbiAgJ3poLUNOJzogWkhfQ04sXHJcbiAgJ3poLVRXJzogWkhfVFcsXHJcbiAgZW46IEVOXHJcbn1cclxuXHJcbmNsYXNzIEkxOG5NYW5hZ2VyIGltcGxlbWVudHMgSUkxOG5NYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGkxOG46IEkxOG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdEFkYXB0ZXI6IE9iamVjdEFkYXB0ZXJcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gICAgdGhpcy5vYmplY3RBZGFwdGVyID0gbmV3IE9iamVjdEFkYXB0ZXIobGFuZ3VhZ2VMaXN0KVxyXG4gICAgbGV0IGxhbmd1YWdlID0gdGhpcy5jdHguZ2V0Q29uZmlnPHN0cmluZz4oJ3NldHRpbmdzLmxhbmd1YWdlJykgfHwgJ3poLUNOJ1xyXG4gICAgaWYgKCFsYW5ndWFnZUxpc3RbbGFuZ3VhZ2VdKSB7XHJcbiAgICAgIGxhbmd1YWdlID0gJ3poLUNOJyAvLyB1c2UgZGVmYXVsdFxyXG4gICAgfVxyXG4gICAgdGhpcy5pMThuID0gbmV3IEkxOG4oe1xyXG4gICAgICBhZGFwdGVyOiB0aGlzLm9iamVjdEFkYXB0ZXIsXHJcbiAgICAgIGRlZmF1bHRMYW5ndWFnZTogbGFuZ3VhZ2VcclxuICAgIH0pXHJcbiAgICB0aGlzLmxvYWRPdXR0ZXJJMThuKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZE91dHRlckkxOG4gKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaTE4bkZvbGRlciA9IHRoaXMuZ2V0T3V0dGVySTE4bkZvbGRlcigpXHJcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGkxOG5Gb2xkZXIsIHtcclxuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxyXG4gICAgfSlcclxuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XHJcbiAgICAgIGlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUubmFtZS5lbmRzV2l0aCgnLnltbCcpKSB7XHJcbiAgICAgICAgY29uc3QgaTE4bkZpbGVQYXRoID0gcGF0aC5qb2luKGkxOG5Gb2xkZXIsIGZpbGUubmFtZSlcclxuICAgICAgICBjb25zdCBpMThuRmlsZSA9IGZzLnJlYWRGaWxlU3luYyhpMThuRmlsZVBhdGgsICd1dGY4JylcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgaTE4bkZpbGVPYmogPSB5YW1sLmxvYWQoaTE4bkZpbGUpIGFzIElMb2NhbGVzXHJcbiAgICAgICAgICBsYW5ndWFnZUxpc3RbZmlsZS5uYW1lLnJlcGxhY2UoL1xcLnltbCQvLCAnJyldID0gaTE4bkZpbGVPYmpcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPdXR0ZXJJMThuRm9sZGVyICgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaTE4bkZvbGRlciA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAnaTE4bi1jbGknKVxyXG4gICAgaWYgKCFmcy5wYXRoRXhpc3RzU3luYyhpMThuRm9sZGVyKSkge1xyXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKGkxOG5Gb2xkZXIpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gaTE4bkZvbGRlclxyXG4gIH1cclxuXHJcbiAgdHJhbnNsYXRlPFQgZXh0ZW5kcyBzdHJpbmc+KGtleTogSUxvY2FsZXNLZXkgfCBULCBhcmdzPzogSVN0cmluZ0tleU1hcDxzdHJpbmc+KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmkxOG4udHJhbnNsYXRlKGtleSwgYXJncykgfHwga2V5XHJcbiAgfVxyXG5cclxuICBzZXRMYW5ndWFnZSAobGFuZ3VhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5pMThuLnNldExhbmd1YWdlKGxhbmd1YWdlKVxyXG4gICAgdGhpcy5jdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICdzZXR0aW5ncy5sYW5ndWFnZSc6IGxhbmd1YWdlXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgYWRkTG9jYWxlIChsYW5ndWFnZTogc3RyaW5nLCBsb2NhbGVzOiBJTG9jYWxlKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBvcmlnaW5Mb2NhbGVzID0gdGhpcy5vYmplY3RBZGFwdGVyLmdldExvY2FsZShsYW5ndWFnZSlcclxuICAgIGlmICghb3JpZ2luTG9jYWxlcykge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0xvY2FsZXMgPSBtZXJnZShvcmlnaW5Mb2NhbGVzLCBsb2NhbGVzKVxyXG4gICAgdGhpcy5vYmplY3RBZGFwdGVyLnNldExvY2FsZShsYW5ndWFnZSwgbmV3TG9jYWxlcylcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICBhZGRMYW5ndWFnZSAobGFuZ3VhZ2U6IHN0cmluZywgbG9jYWxlczogSUxvY2FsZSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgb3JpZ2luTG9jYWxlcyA9IHRoaXMub2JqZWN0QWRhcHRlci5nZXRMb2NhbGUobGFuZ3VhZ2UpXHJcbiAgICBpZiAob3JpZ2luTG9jYWxlcykge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIHRoaXMub2JqZWN0QWRhcHRlci5zZXRMb2NhbGUobGFuZ3VhZ2UsIGxvY2FsZXMpXHJcbiAgICBsYW5ndWFnZUxpc3RbbGFuZ3VhZ2VdID0gbG9jYWxlc1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcblxyXG4gIGdldExhbmd1YWdlTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxhbmd1YWdlTGlzdClcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB7XHJcbiAgSTE4bk1hbmFnZXJcclxufVxyXG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cydcclxuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJ1xyXG5pbXBvcnQgQ29tbWFuZGVyIGZyb20gJy4uL2xpYi9Db21tYW5kZXInXHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2xpYi9Mb2dnZXInXHJcbmltcG9ydCBMaWZlY3ljbGUgZnJvbSAnLi9MaWZlY3ljbGUnXHJcbmltcG9ydCBMaWZlY3ljbGVQbHVnaW5zLCB7IHNldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSAnLi4vbGliL0xpZmVjeWNsZVBsdWdpbnMnXHJcbmltcG9ydCB1cGxvYWRlcnMgZnJvbSAnLi4vcGx1Z2lucy91cGxvYWRlcidcclxuaW1wb3J0IHRyYW5zZm9ybWVycyBmcm9tICcuLi9wbHVnaW5zL3RyYW5zZm9ybWVyJ1xyXG5pbXBvcnQgUGx1Z2luTG9hZGVyIGZyb20gJy4uL2xpYi9QbHVnaW5Mb2FkZXInXHJcbmltcG9ydCB7IGdldCwgc2V0LCB1bnNldCB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgdHlwZSBJSGVscGVyLCB0eXBlIElJbWdJbmZvLCB0eXBlIElDb25maWcsIHR5cGUgSVBpY0dvLCB0eXBlIElTdHJpbmdLZXlNYXAsIHR5cGUgSVBsdWdpbkxvYWRlciwgdHlwZSBJSTE4bk1hbmFnZXIsIHR5cGUgSVBpY0dvUGx1Z2luLCB0eXBlIElQaWNHb1BsdWdpbkludGVyZmFjZSwgdHlwZSBJUmVxdWVzdCB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgZ2V0Q2xpcGJvYXJkSW1hZ2UgZnJvbSAnLi4vdXRpbHMvZ2V0Q2xpcGJvYXJkSW1hZ2UnXHJcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4uL2xpYi9SZXF1ZXN0J1xyXG5pbXBvcnQgREIgZnJvbSAnLi4vdXRpbHMvZGInXHJcbmltcG9ydCBQbHVnaW5IYW5kbGVyIGZyb20gJy4uL2xpYi9QbHVnaW5IYW5kbGVyJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50LCBJQnVzRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBldmVudEJ1cyB9IGZyb20gJy4uL3V0aWxzL2V2ZW50QnVzJ1xyXG5pbXBvcnQgeyBpc0NvbmZpZ0tleUluQmxhY2tMaXN0LCBpc0lucHV0Q29uZmlnVmFsaWQgfSBmcm9tICcuLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IEkxOG5NYW5hZ2VyIH0gZnJvbSAnLi4vaTE4bidcclxuXHJcbmV4cG9ydCBjbGFzcyBQaWNHbyBleHRlbmRzIEV2ZW50RW1pdHRlciBpbXBsZW1lbnRzIElQaWNHbyB7XHJcbiAgcHJpdmF0ZSBfY29uZmlnITogSUNvbmZpZ1xyXG4gIHByaXZhdGUgbGlmZWN5Y2xlITogTGlmZWN5Y2xlXHJcbiAgcHJpdmF0ZSBkYiE6IERCXHJcbiAgcHJpdmF0ZSBfcGx1Z2luTG9hZGVyITogUGx1Z2luTG9hZGVyXHJcbiAgY29uZmlnUGF0aDogc3RyaW5nXHJcbiAgYmFzZURpciE6IHN0cmluZ1xyXG4gIGhlbHBlciE6IElIZWxwZXJcclxuICBsb2c6IExvZ2dlclxyXG4gIGNtZDogQ29tbWFuZGVyXHJcbiAgb3V0cHV0OiBJSW1nSW5mb1tdXHJcbiAgaW5wdXQ6IGFueVtdXHJcbiAgcmF3SW5wdXQ6IGFueVtdXHJcbiAgcGx1Z2luSGFuZGxlcjogUGx1Z2luSGFuZGxlclxyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBpbiB2MS41LjArXHJcbiAgICpcclxuICAgKiB1c2UgcmVxdWVzdCBpbnN0ZWFkXHJcbiAgICovXHJcbiAgUmVxdWVzdCE6IFJlcXVlc3RcclxuICBpMThuITogSUkxOG5NYW5hZ2VyXHJcbiAgVkVSU0lPTjogc3RyaW5nID0gcHJvY2Vzcy5lbnYuUElDR09fVkVSU0lPTlxyXG4gIEdVSV9WRVJTSU9OPzogc3RyaW5nXHJcblxyXG4gIGdldCBwbHVnaW5Mb2FkZXIgKCk6IElQbHVnaW5Mb2FkZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BsdWdpbkxvYWRlclxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IgKGNvbmZpZ1BhdGg6IHN0cmluZyA9ICcnKSB7XHJcbiAgICBzdXBlcigpXHJcbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBjb25maWdQYXRoXHJcbiAgICB0aGlzLm91dHB1dCA9IFtdXHJcbiAgICB0aGlzLmlucHV0ID0gW11cclxuICAgIHRoaXMucmF3SW5wdXQgPSBbXVxyXG4gICAgdGhpcy5oZWxwZXIgPSB7XHJcbiAgICAgIHRyYW5zZm9ybWVyOiBuZXcgTGlmZWN5Y2xlUGx1Z2lucygndHJhbnNmb3JtZXInKSxcclxuICAgICAgdXBsb2FkZXI6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCd1cGxvYWRlcicpLFxyXG4gICAgICBiZWZvcmVUcmFuc2Zvcm1QbHVnaW5zOiBuZXcgTGlmZWN5Y2xlUGx1Z2lucygnYmVmb3JlVHJhbnNmb3JtUGx1Z2lucycpLFxyXG4gICAgICBiZWZvcmVVcGxvYWRQbHVnaW5zOiBuZXcgTGlmZWN5Y2xlUGx1Z2lucygnYmVmb3JlVXBsb2FkUGx1Z2lucycpLFxyXG4gICAgICBhZnRlclVwbG9hZFBsdWdpbnM6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCdhZnRlclVwbG9hZFBsdWdpbnMnKVxyXG4gICAgfVxyXG4gICAgdGhpcy5pbml0Q29uZmlnUGF0aCgpXHJcbiAgICB0aGlzLmxvZyA9IG5ldyBMb2dnZXIodGhpcylcclxuICAgIHRoaXMuY21kID0gbmV3IENvbW1hbmRlcih0aGlzKVxyXG4gICAgdGhpcy5wbHVnaW5IYW5kbGVyID0gbmV3IFBsdWdpbkhhbmRsZXIodGhpcylcclxuICAgIHRoaXMuaW5pdENvbmZpZygpXHJcbiAgICB0aGlzLmluaXQoKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q29uZmlnUGF0aCAoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb25maWdQYXRoID09PSAnJykge1xyXG4gICAgICB0aGlzLmNvbmZpZ1BhdGggPSBob21lZGlyKCkgKyAnLy5waWNsaXN0L2NvbmZpZy5qc29uJ1xyXG4gICAgfVxyXG4gICAgaWYgKHBhdGguZXh0bmFtZSh0aGlzLmNvbmZpZ1BhdGgpLnRvVXBwZXJDYXNlKCkgIT09ICcuSlNPTicpIHtcclxuICAgICAgdGhpcy5jb25maWdQYXRoID0gJydcclxuICAgICAgdGhyb3cgRXJyb3IoJ1RoZSBjb25maWd1cmF0aW9uIGZpbGUgb25seSBzdXBwb3J0cyBKU09OIGZvcm1hdC4nKVxyXG4gICAgfVxyXG4gICAgdGhpcy5iYXNlRGlyID0gcGF0aC5kaXJuYW1lKHRoaXMuY29uZmlnUGF0aClcclxuICAgIGNvbnN0IGV4aXN0ID0gZnMucGF0aEV4aXN0c1N5bmModGhpcy5jb25maWdQYXRoKVxyXG4gICAgaWYgKCFleGlzdCkge1xyXG4gICAgICBmcy5lbnN1cmVGaWxlU3luYyhgJHt0aGlzLmNvbmZpZ1BhdGh9YClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdENvbmZpZyAoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRiID0gbmV3IERCKHRoaXMpXHJcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLmRiLnJlYWQodHJ1ZSkgYXMgSUNvbmZpZ1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0ICgpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGluaXQgMThuIGF0IGZpcnN0XHJcbiAgICAgIHRoaXMuaTE4biA9IG5ldyBJMThuTWFuYWdlcih0aGlzKVxyXG4gICAgICB0aGlzLlJlcXVlc3QgPSBuZXcgUmVxdWVzdCh0aGlzKVxyXG4gICAgICB0aGlzLl9wbHVnaW5Mb2FkZXIgPSBuZXcgUGx1Z2luTG9hZGVyKHRoaXMpXHJcbiAgICAgIC8vIGxvYWQgc2VsZiBwbHVnaW5zXHJcbiAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKCdwaWNnbycpXHJcbiAgICAgIHVwbG9hZGVycyh0aGlzKS5yZWdpc3Rlcih0aGlzKVxyXG4gICAgICB0cmFuc2Zvcm1lcnModGhpcykucmVnaXN0ZXIodGhpcylcclxuICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUoJycpXHJcbiAgICAgIC8vIGxvYWQgdGhpcmQtcGFydHkgcGx1Z2luc1xyXG4gICAgICB0aGlzLl9wbHVnaW5Mb2FkZXIubG9hZCgpXHJcbiAgICAgIHRoaXMubGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZSh0aGlzKVxyXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgIHRoaXMuZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgLTEpXHJcbiAgICAgIHRoaXMubG9nLmVycm9yKGUpXHJcbiAgICAgIHRocm93IGVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGVhc2lseSBtYW5udWFsbHkgbG9hZCBhIHBsdWdpblxyXG4gICAqIGlmIHByb3ZpZGUgcGx1Z2luIG5hbWUsIHdpbGwgcmVnaXN0ZXIgcGx1Z2luIGJ5IG5hbWVcclxuICAgKiBvciBqdXN0IGluc3RhbnRpYXRlIGEgcGx1Z2luXHJcbiAgICovXHJcbiAgdXNlIChwbHVnaW46IElQaWNHb1BsdWdpbiwgbmFtZT86IHN0cmluZyk6IElQaWNHb1BsdWdpbkludGVyZmFjZSB7XHJcbiAgICBpZiAobmFtZSkge1xyXG4gICAgICB0aGlzLnBsdWdpbkxvYWRlci5yZWdpc3RlclBsdWdpbihuYW1lLCBwbHVnaW4pXHJcbiAgICAgIHJldHVybiB0aGlzLnBsdWdpbkxvYWRlci5nZXRQbHVnaW4obmFtZSkhXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBwbHVnaW5JbnN0YW5jZSA9IHBsdWdpbih0aGlzKVxyXG4gICAgICByZXR1cm4gcGx1Z2luSW5zdGFuY2VcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyQ29tbWFuZHMgKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnUGF0aCAhPT0gJycpIHtcclxuICAgICAgdGhpcy5jbWQuaW5pdCgpXHJcbiAgICAgIHRoaXMuY21kLmxvYWRDb21tYW5kcygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb25maWc8VD4gKG5hbWU/OiBzdHJpbmcpOiBUIHtcclxuICAgIGlmICghbmFtZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fY29uZmlnIGFzIHVua25vd24gYXMgVFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGdldCh0aGlzLl9jb25maWcsIG5hbWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzYXZlQ29uZmlnIChjb25maWc6IElTdHJpbmdLZXlNYXA8YW55Pik6IHZvaWQge1xyXG4gICAgaWYgKCFpc0lucHV0Q29uZmlnVmFsaWQoY29uZmlnKSkge1xyXG4gICAgICB0aGlzLmxvZy53YXJuKCd0aGUgZm9ybWF0IG9mIGNvbmZpZyBpcyBpbnZhbGlkLCBwbGVhc2UgcHJvdmlkZSBvYmplY3QnKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuc2V0Q29uZmlnKGNvbmZpZylcclxuICAgIHRoaXMuZGIuc2F2ZUNvbmZpZyhjb25maWcpXHJcbiAgfVxyXG5cclxuICByZW1vdmVDb25maWcgKGtleTogc3RyaW5nLCBwcm9wTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIWtleSB8fCAhcHJvcE5hbWUpIHJldHVyblxyXG4gICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3Qoa2V5KSkge1xyXG4gICAgICB0aGlzLmxvZy53YXJuKGB0aGUgY29uZmlnLiR7a2V5fSBjYW4ndCBiZSByZW1vdmVkYClcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLnVuc2V0Q29uZmlnKGtleSwgcHJvcE5hbWUpXHJcbiAgICB0aGlzLmRiLnVuc2V0KGtleSwgcHJvcE5hbWUpXHJcbiAgfVxyXG5cclxuICBzZXRDb25maWcgKGNvbmZpZzogSVN0cmluZ0tleU1hcDxhbnk+KTogdm9pZCB7XHJcbiAgICBpZiAoIWlzSW5wdXRDb25maWdWYWxpZChjb25maWcpKSB7XHJcbiAgICAgIHRoaXMubG9nLndhcm4oJ3RoZSBmb3JtYXQgb2YgY29uZmlnIGlzIGludmFsaWQsIHBsZWFzZSBwcm92aWRlIG9iamVjdCcpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3QobmFtZSkpIHtcclxuICAgICAgICB0aGlzLmxvZy53YXJuKGB0aGUgY29uZmlnLiR7bmFtZX0gY2FuJ3QgYmUgbW9kaWZpZWRgKVxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcclxuICAgICAgICBkZWxldGUgY29uZmlnW25hbWVdXHJcbiAgICAgIH1cclxuICAgICAgc2V0KHRoaXMuX2NvbmZpZywgbmFtZSwgY29uZmlnW25hbWVdKVxyXG4gICAgICBldmVudEJ1cy5lbWl0KElCdXNFdmVudC5DT05GSUdfQ0hBTkdFLCB7XHJcbiAgICAgICAgY29uZmlnTmFtZTogbmFtZSxcclxuICAgICAgICB2YWx1ZTogY29uZmlnW25hbWVdXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdW5zZXRDb25maWcgKGtleTogc3RyaW5nLCBwcm9wTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIWtleSB8fCAhcHJvcE5hbWUpIHJldHVyblxyXG4gICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3Qoa2V5KSkge1xyXG4gICAgICB0aGlzLmxvZy53YXJuKGB0aGUgY29uZmlnLiR7a2V5fSBjYW4ndCBiZSB1bnNldGApXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdW5zZXQodGhpcy5nZXRDb25maWcoa2V5KSwgcHJvcE5hbWUpXHJcbiAgfVxyXG5cclxuICBnZXQgcmVxdWVzdCAoKTogSVJlcXVlc3RbJ3JlcXVlc3QnXSB7XHJcbiAgICByZXR1cm4gdGhpcy5SZXF1ZXN0LnJlcXVlc3QuYmluZCh0aGlzLlJlcXVlc3QpXHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGxvYWQgKGlucHV0PzogYW55W10pOiBQcm9taXNlPElJbWdJbmZvW10gfCBFcnJvcj4ge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnUGF0aCA9PT0gJycpIHtcclxuICAgICAgdGhpcy5sb2cuZXJyb3IoJ1RoZSBjb25maWd1cmF0aW9uIGZpbGUgb25seSBzdXBwb3J0cyBKU09OIGZvcm1hdC4nKVxyXG4gICAgICByZXR1cm4gW11cclxuICAgIH1cclxuICAgIC8vIHVwbG9hZCBmcm9tIGNsaXBib2FyZFxyXG4gICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQgfHwgaW5wdXQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgeyBpbWdQYXRoLCBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcgfSA9IGF3YWl0IGdldENsaXBib2FyZEltYWdlKHRoaXMpXHJcbiAgICAgICAgaWYgKGltZ1BhdGggPT09ICdubyBpbWFnZScpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW1hZ2Ugbm90IGZvdW5kIGluIGNsaXBib2FyZCcpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMub25jZShJQnVpbGRJbkV2ZW50LkZBSUxFRCwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNob3VsZEtlZXBBZnRlclVwbG9hZGluZykge1xyXG4gICAgICAgICAgICAgIC8vIOWIoOmZpCBwaWNnbyDnlJ/miJDnmoTlm77niYfmlofku7bvvIzkvovlpoIgYH4vLnBpY2dvLzIwMjAwNjIxMjA1NzIwLnBuZ2BcclxuICAgICAgICAgICAgICBmcy5yZW1vdmUoaW1nUGF0aCkuY2F0Y2goKGUpID0+IHsgdGhpcy5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRoaXMub25jZSgnZmluaXNoZWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nKSB7XHJcbiAgICAgICAgICAgICAgZnMucmVtb3ZlKGltZ1BhdGgpLmNhdGNoKChlKSA9PiB7IHRoaXMubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zdCB7IG91dHB1dCB9ID0gYXdhaXQgdGhpcy5saWZlY3ljbGUuc3RhcnQoW2ltZ1BhdGhdKVxyXG4gICAgICAgICAgcmV0dXJuIG91dHB1dFxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRoaXMuZW1pdChJQnVpbGRJbkV2ZW50LkZBSUxFRCwgZSlcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHVwbG9hZCBmcm9tIHBhdGhcclxuICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IHRoaXMubGlmZWN5Y2xlLnN0YXJ0KGlucHV0KVxyXG4gICAgICByZXR1cm4gb3V0cHV0XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJwbHVnaW5IYW5kbGVyIiwiaGFuZGxlIiwiY3R4IiwiY21kIiwicHJvZ3JhbSIsImNvbW1hbmQiLCJkZXNjcmlwdGlvbiIsImFsaWFzIiwib3B0aW9uIiwiYWN0aW9uIiwicGx1Z2lucyIsInByb3h5IiwicmVnaXN0cnkiLCJvcHRpb25zIiwiaW5zdGFsbCIsImNhdGNoIiwiZSIsImxvZyIsImVycm9yIiwidW5pbnN0YWxsIiwidXBkYXRlIiwiY29uZmlnIiwicmFuZG9tU3RyaW5nR2VuZXJhdG9yIiwibGVuZ3RoIiwiY2hhcnMiLCJBcnJheSIsImZyb20iLCJtYXAiLCJjaGFyQXQiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJqb2luIiwicmVuYW1lRmlsZU5hbWVXaXRoVGltZXN0YW1wIiwib2xkTmFtZSIsIkRhdGUiLCJub3ciLCJwYXRoIiwiZXh0bmFtZSIsInJlbmFtZUZpbGVOYW1lV2l0aFJhbmRvbVN0cmluZyIsInJlbmFtZUZpbGVOYW1lV2l0aEN1c3RvbVN0cmluZyIsImN1c3RvbUZvcm1hdCIsImFmZml4RmlsZU5hbWUiLCJjb252ZXJzaW9uTWFwIiwiZ2V0RnVsbFllYXIiLCJ0b1N0cmluZyIsInNsaWNlIiwiZ2V0TW9udGgiLCJnZXREYXRlIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImNyeXB0byIsImNyZWF0ZUhhc2giLCJiYXNlbmFtZSIsImRpZ2VzdCIsInV1aWR2NCIsInJlcGxhY2UiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJrZXlzIiwic29tZSIsIml0ZW0iLCJpbmNsdWRlcyIsImV4dCIsIm5ld05hbWUiLCJyZWR1Y2UiLCJhY2MiLCJjdXIiLCJSZWdFeHAiLCJfcmVzdWx0Iiwia2V5IiwiY291bnQiLCJtYXgiLCJkaXJuYW1lIiwic3BsaXQiLCJzZXAiLCJhIiwiYiIsImlzVXJsIiwidXJsIiwidGVzdCIsImlzVXJsRW5jb2RlIiwiZGVjb2RlVVJJIiwiaGFuZGxlVXJsRW5jb2RlIiwiZW5jb2RlVVJJIiwiZ2V0SW1hZ2VTaXplIiwiZmlsZSIsIndpZHRoIiwiaGVpZ2h0IiwidHlwZSIsImltYWdlU2l6ZSIsInJlYWwiLCJnZXRGU0ZpbGUiLCJhc3luYyIsImZpbGVQYXRoIiwiZmlsZU5hbWUiLCJidWZmZXIiLCJmcyIsInJlYWRGaWxlIiwic3VjY2VzcyIsIl9hIiwicmVhc29uIiwiZ2V0VVJMRmlsZSIsInRpbWVvdXRJZCIsInJlcXVlc3RGbiIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVzIiwicmVxdWVzdCIsIm1ldGhvZCIsInJlc29sdmVXaXRoRnVsbFJlc3BvbnNlIiwicmVzcG9uc2VUeXBlIiwidGhlbiIsInJlc3AiLCJkYXRhIiwiY2xlYXJUaW1lb3V0IiwidXJsUGF0aCIsIlVSTCIsInBhdGhuYW1lIiwic2VhcmNoUGFyYW1zIiwiZ2V0Iiwic3RhcnRzV2l0aCIsIm1lc3NhZ2UiLCJ0aW1lb3V0UHJvbWlzZSIsInNldFRpbWVvdXQiLCJyYWNlIiwiZ2V0UGx1Z2luTmFtZVR5cGUiLCJuYW1lIiwiaXNTaW1wbGVOYW1lIiwibmFtZU9yUGF0aCIsImlzQWJzb2x1dGUiLCJwbHVnaW5QYXRoIiwicHJvY2VzcyIsImN3ZCIsImV4aXN0c1N5bmMiLCJoYW5kbGVTdHJlYW1saW5lUGx1Z2luTmFtZSIsImhhbmRsZUNvbXBsZXRlUGx1Z2luTmFtZSIsInNjb3BlIiwiZ2V0UHJvY2Vzc1BsdWdpbk5hbWUiLCJsb2dnZXIiLCJjb25zb2xlIiwiaGFuZGxlVW5peFN0eWxlUGF0aCIsIndhcm4iLCJnZXROb3JtYWxQbHVnaW5OYW1lIiwicmVtb3ZlUGx1Z2luVmVyc2lvbiIsInBhY2thZ2VKU09OUGF0aCIsInBvc2l4IiwicGtnIiwicmVhZEpTT05TeW5jIiwicGF0aFN0ciIsInJlZyIsIm1hdGNoQXJyIiwibWF0Y2giLCJjb25maWdCbGFja0xpc3QiLCJpc0NvbmZpZ0tleUluQmxhY2tMaXN0IiwiYmxhY2tJdGVtIiwiaXNJbnB1dENvbmZpZ1ZhbGlkIiwiaXNBcnJheSIsInNhZmVQYXJzZSIsInN0ciIsIkpTT04iLCJwYXJzZSIsImZvcmNlTnVtYmVyIiwibnVtIiwiaXNOYU4iLCJOdW1iZXIiLCJpc0RldiIsImVudiIsIk5PREVfRU5WIiwiaXNQcm9kIiwidGV4dDJTVkciLCJkZWZhdWx0V2F0ZXJtYXJrRm9udFBhdGgiLCJ0ZXh0IiwiY29sb3IiLCJmb250RmFtaWx5IiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImZpbGwiLCJ0ZXh0U1ZHIiwiVGV4dFRvU1ZHIiwibG9hZFN5bmMiLCJnZXRTVkciLCJCdWZmZXIiLCJkZWZhdWx0V2F0ZXJtYXJrSW1hZ2VQYXRoIiwiX19kaXJuYW1lIiwiQWRkV2F0ZXJtYXJrIiwiaW1nIiwid2F0ZXJtYXJrVHlwZSIsImlzRnVsbFNjcmVlbldhdGVybWFyayIsIndhdGVybWFya0RlZ3JlZSIsIndhdGVybWFya0ZvbnRQYXRoIiwid2F0ZXJtYXJrU2NhbGVSYXRpbyIsIndhdGVybWFya0NvbG9yIiwid2F0ZXJtYXJrSW1hZ2VQYXRoIiwicG9zaXRpb24iLCJpbWFnZSIsInNoYXJwIiwiYW5pbWF0ZWQiLCJpbWdXaWR0aCIsIm1ldGFkYXRhIiwid2F0ZXJtYXJrIiwiY3JlYXRlV2F0ZXJtYXJrIiwiY29tcG9zaXRlIiwiaW5wdXQiLCJncmF2aXR5IiwidGlsZSIsInRvQnVmZmVyIiwid2F0ZXJtYXJrV2lkdGgiLCJ3YXRlcm1hcmtIZWlnaHQiLCJnZXRTaXplIiwid2F0ZXJtYXJrUmVzaXplV2lkdGgiLCJ3YXRlcm1hcmtSZXNpemVIZWlnaHQiLCJyZXNpemUiLCJmaXQiLCJyb3RhdGUiLCJiYWNrZ3JvdW5kIiwiciIsImciLCJhbHBoYSIsInZhbGlkUGFyYW0iLCJwYXJhbXMiLCJldmVyeSIsInBhcmFtIiwiYXZhaWxhYmxlQ29udmVydEZvcm1hdExpc3QiLCJ2YWxpZE91dHB1dEZvcm1hdCIsImZvcm1hdCIsImltYWdlRXh0TGlzdCIsImltYWdlQWRkV2F0ZXJNYXJrIiwid2F0ZXJtYXJrVGV4dCIsIndhdGVybWFya1Bvc2l0aW9uIiwiZm9ybWF0T3B0aW9ucyIsInF1YWxpdHkiLCJpc0NvbnZlcnQiLCJjb252ZXJ0Rm9ybWF0IiwiaXNSZVNpemUiLCJyZVNpemVIZWlnaHQiLCJyZVNpemVXaWR0aCIsInNraXBSZVNpemVPZlNtYWxsSW1nIiwiaXNSZVNpemVCeVBlcmNlbnQiLCJyZVNpemVQZXJjZW50IiwiaXNSb3RhdGUiLCJpc0ZsaXAiLCJpc0Zsb3AiLCJyb3RhdGVEZWdyZWUiLCJwaWNCZWQiLCJpbWFnZVByb2Nlc3MiLCJyYXdGb3JtYXQiLCJ0b0xvd2VyQ2FzZSIsImltYWdlV2lkdGgiLCJpbWFnZUhlaWdodCIsInJvdW5kIiwic2NhbGVSYXRpbyIsImZsaXAiLCJmbG9wIiwibmV3Rm9ybWF0IiwidG9Gb3JtYXQiLCJpbWFnZUZvcm1hdExpc3QiLCJuZWVkQWRkV2F0ZXJtYXJrIiwid2F0ZXJtYXJrT3B0aW9ucyIsImZpbGVFeHQiLCJpc0FkZFdhdGVybWFyayIsIm5lZWRDb21wcmVzcyIsImNvbXByZXNzT3B0aW9ucyIsIm5vcm1hbGl6ZWRFeHQiLCJyZW1vdmVFeGlmIiwidXBsb2FkIiwiYXJndW1lbnRzIiwiaW5wdXRMaXN0IiwiZmlsdGVyIiwiZXhpc3QiLCJ1c2VyQ29uZmlnIiwiZ2V0Q29uZmlnIiwiaTE4biIsInRyYW5zbGF0ZSIsInJlcXVpcmVkIiwiZGVmYXVsdCIsImNob2ljZXMiLCJpc1JlbW92ZUV4aWYiLCJjb21wcmVzcyIsImVuYWJsZSIsInJlbmFtZSIsImhhbmRsZUNvbmZpZyIsInByb21wdHMiLCJtb2R1bGUiLCJhbnN3ZXIiLCJpbnF1aXJlciIsInByb21wdCIsImNvbmZpZ05hbWUiLCJzYXZlQ29uZmlnIiwic2V0dGluZyIsImJ1aWxkaW4iLCJoZWxwZXIiLCJnZXRJZExpc3QiLCJwbHVnaW5Mb2FkZXIiLCJnZXRQbHVnaW4iLCJnZXRGdWxsTGlzdCIsIl9iIiwicGx1Z2luIiwiaW5mbyIsImFyZ3YiLCJ1c2UiLCJ1cGxvYWRlciIsInRyYW5zZm9ybWVyIiwicHVzaCIsImZvckVhY2giLCJwaWNnb1BsdWdpbnMiLCJzZXRDb25maWciLCJnZW5lcmF0ZSIsIm9wdHMiLCJnZXRPcHRpb25zIiwidG1wIiwic291cmNlIiwiYW5zd2VycyIsIl9maWxlcyIsImdsb2JieSIsImRvdCIsImdsb2IiLCJmaWx0ZXJzIiwiZmlsZXMiLCJyZW5kZXIiLCJ3cml0ZUZpbGVUcmVlIiwiZGVzdCIsImNvbXBsZXRlIiwiY29tcGxldGVNZXNzYWdlIiwiZXhwIiwiZm4iLCJGdW5jdGlvbiIsInN0cmluZ2lmeSIsInRlbXBsYXRlUGF0aCIsIm9wdGlvbnNQYXRoIiwicmVxdWlyZSIsImZpbGVUcmVlIiwicmVhZEZpbGVTeW5jIiwiY29udGVudCIsImVqcyIsImlzQnVmZmVyIiwiZGlyIiwiZW5zdXJlRGlyU3luYyIsIndyaXRlRmlsZVN5bmMiLCJydW4iLCJvZmZsaW5lIiwidGVtcGxhdGUiLCJoYXNTbGFzaCIsImRvd25sb2FkQW5kR2VuZXJhdGUiLCJybSIsInN5bmMiLCJkb3dubG9hZCIsImNsb25lIiwiZXJyIiwiaW5pdCIsInByb2plY3QiLCJpblBsYWNlIiwiaG9tZWRpciIsIm9rIiwib24iLCJjaGFsayIsImdyYXkiLCJsYW5nIiwibGlzdCIsImdldExhbmd1YWdlTGlzdCIsInNldExhbmd1YWdlIiwiY29tbWFuZGVycyIsInJlZ2lzdGVyIiwiTGlmZWN5Y2xlUGx1Z2lucyIsImNvbnN0cnVjdG9yIiwidGhpcyIsIk1hcCIsInBsdWdpbklkTWFwIiwiaWQiLCJUeXBlRXJyb3IiLCJoYXMiLCJzZXQiLCJjdXJyZW50UGx1Z2luIiwidW5yZWdpc3RlciIsInBsdWdpbk5hbWUiLCJwbHVnaW5MaXN0IiwiZGVsZXRlIiwiZ2V0TmFtZSIsImdldExpc3QiLCJ2YWx1ZXMiLCJzZXRDdXJyZW50UGx1Z2luTmFtZSIsImdldEN1cnJlbnRQbHVnaW5OYW1lIiwiQ29tbWFuZGVyIiwiQ29tbWFuZCIsInZlcnNpb24iLCJkZWJ1ZyIsInNpbGVudCIsImFyZ3MiLCJleGl0IiwiY3VycmVudFBsdWdpbk5hbWUiLCJsb2FkQ29tbWFuZHMiLCJJTG9nVHlwZSIsIklCdWlsZEluRXZlbnQiLCJJQnVzRXZlbnQiLCJMb2dnZXIiLCJsZXZlbCIsImhhbmRsZUxvZyIsIm1zZyIsImxvZ0xldmVsIiwiY2hlY2tMb2dMZXZlbCIsImxvZ0hlYWRlciIsInRvVXBwZXJDYXNlIiwibG9nUGF0aCIsImJhc2VEaXIiLCJyZXN1bHQiLCJjaGVja0xvZ0ZpbGVJc0xhcmdlIiwiaXNMYXJnZSIsIndhcm5pbmdNc2ciLCJ5ZWxsb3ciLCJyZWNyZWF0ZUxvZ0ZpbGUiLCJ1bnNoaWZ0IiwiaGFuZGxlV3JpdGVMb2ciLCJsb2dGaWxlU2l6ZSIsInN0YXRTeW5jIiwic2l6ZSIsImxvZ0ZpbGVTaXplTGltaXQiLCJ1bmxpbmtTeW5jIiwiY3JlYXRlRmlsZVN5bmMiLCJkYXlqcyIsIkVycm9yIiwidXRpbCIsInN0YWNrIiwiYXBwZW5kRmlsZVN5bmMiLCJjcmVhdGVDb250ZXh0IiwiY29uZmlnUGF0aCIsIm91dHB1dCIsInJhd0lucHV0IiwiUmVxdWVzdCIsIlZFUlNJT04iLCJHVUlfVkVSU0lPTiIsImJpbmQiLCJyZW1vdmVDb25maWciLCJ1bnNldENvbmZpZyIsImFkZExpc3RlbmVyIiwib25jZSIsInJlbW92ZUxpc3RlbmVyIiwib2ZmIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic2V0TWF4TGlzdGVuZXJzIiwiZ2V0TWF4TGlzdGVuZXJzIiwibGlzdGVuZXJzIiwicmF3TGlzdGVuZXJzIiwiZW1pdCIsImxpc3RlbmVyQ291bnQiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwiZXZlbnROYW1lcyIsIkxpZmVjeWNsZSIsIkV2ZW50RW1pdHRlciIsInN1cGVyIiwidHRmTGluayIsInRlbXBGaWxlUGF0aCIsImltZ0ZsZVBhdGgiLCJlbXB0eURpclN5bmMiLCJ0dGZQYXRoIiwib3V0cHV0RGlyIiwibWtkaXJTeW5jIiwicmVjdXJzaXZlIiwiYXhpb3MiLCJyYXdJbnB1dFBhdGgiLCJjbG9uZURlZXAiLCJ3YXRlcm1hcmtNc2ciLCJjb21wcmVzc01zZyIsImFsbFNldHRsZWQiLCJpbmRleCIsInRyYW5zZm9ybWVkQnVmZmVyIiwiaXNTa2lwIiwiZG93bmxvYWRUVEYiLCJfYyIsIl9kIiwibmV3RXh0IiwiX2UiLCJfZiIsInRlbXBGaWxlIiwiZ2V0VGltZSIsImhlaWNCdWZmZXIiLCJoZWljUmVzdWx0IiwiaGVpY0NvbnZlcnQiLCJ0ZW1wSGVpY0NvbnZlcnRGaWxlIiwiX2ciLCJiZWZvcmVUcmFuc2Zvcm0iLCJkb1RyYW5zZm9ybSIsInJlbmFtZUNvbmZpZyIsImJlZm9yZVVwbG9hZCIsImRvVXBsb2FkIiwiYWZ0ZXJVcGxvYWQiLCJGQUlMRUQiLCJVUExPQURfUFJPR1JFU1MiLCJCRUZPUkVfVFJBTlNGT1JNIiwiaGFuZGxlUGx1Z2lucyIsImJlZm9yZVRyYW5zZm9ybVBsdWdpbnMiLCJjdXJyZW50VHJhbnNmb3JtZXIiLCJCRUZPUkVfVVBMT0FEIiwiYmVmb3JlVXBsb2FkUGx1Z2lucyIsIm91dHB1dEltZyIsIkFGVEVSX1VQTE9BRCIsImFmdGVyVXBsb2FkUGx1Z2lucyIsImlzRW5jb2RlT3V0cHV0VVJMIiwiaSIsImltZ1VybCIsImJhc2U2NEltYWdlIiwiRklOSVNIRUQiLCJsaWZlQ3ljbGVQbHVnaW5zIiwicGx1Z2luTmFtZXMiLCJsaWZlQ3ljbGVOYW1lIiwiYWxsIiwicG9zdE9wdGlvbnMiLCJhcGlUb2tlbiIsImJhY2t1cERvbWFpbiIsImhlYWRlcnMiLCJjb250ZW50VHlwZSIsIkF1dGhvcml6YXRpb24iLCJmb3JtRGF0YSIsInNtZmlsZSIsInZhbHVlIiwiZmlsZW5hbWUiLCJzc2wiLCJzbW1zQ29uZmlnIiwiaW1nTGlzdCIsInBvc3RDb25maWciLCJ0b2tlbiIsImJvZHkiLCJjb2RlIiwiaGFzaCIsImltYWdlcyIsIk5PVElGSUNBVElPTiIsInRpdGxlIiwicHJlZml4IiwiZ2VuZXJhdGVTaWduYXR1cmUiLCJzZWNyZXRJZCIsInNlY3JldEtleSIsImFwcElkIiwiYnVja2V0Iiwic2lnbmF0dXJlIiwic2lnblRpbWUiLCJ0b2RheSIsInNpZ25LZXkiLCJjcmVhdGVIbWFjIiwiZW5kcG9pbnQiLCJhcmVhIiwiaHR0cFN0cmluZyIsInN0cmluZ1RvU2lnbiIsImN1cnJlbnQiLCJtdWx0aVNpZ25hdHVyZSIsInNpZ25IZXhLZXkiLCJ0ZW1wU3RyaW5nIiwiY29uY2F0IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiSG9zdCIsIm1pbWUiLCJsb29rdXAiLCJvcCIsImZpbGVjb250ZW50IiwidGNZdW5PcHRpb25zIiwiY3VzdG9tVXJsIiwidXNlVjQiLCJzdGF0dXNDb2RlIiwib3B0aW9uVXJsIiwic2xpbSIsInNvdXJjZV91cmwiLCJjb25maXJtVGV4dCIsImNhbmNlbFRleHQiLCJ0aXBzIiwicmVwbyIsImpzb24iLCJicmFuY2giLCJnaXRodWJPcHRpb25zIiwidXBsb2FkUGF0aCIsImRvd25sb2FkX3VybCIsInNoYSIsImltZ0Jhc2U2NCIsInNlbGVjdEFyZWEiLCJnZXRUb2tlbiIsInFpbml1T3B0aW9ucyIsImFjY2Vzc0tleSIsIm1hYyIsInFpbml1IiwiYXV0aCIsIk1hYyIsInJzIiwiUHV0UG9saWN5IiwidXBsb2FkVG9rZW4iLCJiYXNlVXJsIiwidXJsT3B0aW9ucyIsInJlc3BvbnNlIiwiZm9ybWF0QWNjZXNzVG9rZW4iLCJhY2Nlc3NUb2tlbiIsImNsaWVudElkIiwidXNlcm5hbWUiLCJhbGJ1bSIsImF1dGhvcml6YXRpb24iLCJyZXF1ZXN0T3B0aW9ucyIsImluaXRQYWdlcyIsImFsYnVtSGFzaCIsImdldEFsYnVtSGFzaE9wdGlvbnMiLCJ0aW1lb3V0IiwiYWxidW1MaXN0IiwiaW1ndXJPcHRpb25zIiwibGluayIsImRlbGV0ZWhhc2giLCJkYXRlIiwidG9VVENTdHJpbmciLCJzaWduU3RyaW5nIiwiYWNjZXNzS2V5U2VjcmV0IiwiYWNjZXNzS2V5SWQiLCJhbGlZdW5PcHRpb25zIiwib3BlcmF0b3IiLCJtZDVQYXNzd29yZCIsIk1ENSIsInBhc3N3b3JkIiwiZ2V0QW50aUxlZWNoUGFyYW0iLCJhbnRpTGVlY2hUb2tlbiIsImV4cGlyZVRpbWUiLCJ1cmkiLCJleHBpcmUiLCJwYXJzZUludCIsInN1YnN0cmluZyIsInVweXVuT3B0aW9ucyIsInN1ZmZpeCIsInVwdCIsIkF1dGhUeXBlIiwiY3JlYXRlQ2xpZW50IiwiZXZhbCIsIndlYmRhdnBsaXN0T3B0aW9ucyIsImhvc3QiLCJzc2xFbmFibGVkIiwiYXV0aFR5cGUiLCJ3ZWJwYXRoIiwiY2xpZW50T3B0aW9ucyIsIm1heEJvZHlMZW5ndGgiLCJtYXhDb250ZW50TGVuZ3RoIiwiRGlnZXN0IiwiY2xpZW50IiwicGF0aFRvQ3JlYXRlIiwiY3JlYXRlRGlyZWN0b3J5IiwicHV0RmlsZUNvbnRlbnRzIiwib3ZlcndyaXRlIiwiaW1nVGVtcFBhdGgiLCJpbWdUZW1wRmlsZVBhdGgiLCJnYWxsZXJ5UGF0aCIsImxvY2FsQ29uZmlnIiwid2ViUGF0aCIsImNvcHlGaWxlU3luYyIsIlNTSENsaWVudCIsIl9pc0Nvbm5lY3RlZCIsImluc3RhbmNlIiwiX2luc3RhbmNlIiwiX2NsaWVudCIsIk5vZGVTU0giLCJjaGFuZ2VXaW5TdHlsZVBhdGhUb1VuaXgiLCJwcml2YXRlS2V5IiwicGFzc3BocmFzZSIsImxvZ2luSW5mbyIsInByaXZhdGVLZXlQYXRoIiwiY29ubmVjdCIsInBvcnQiLCJsb2NhbCIsInJlbW90ZSIsIm1rZGlyIiwicHV0RmlsZSIsImZpbGVNb2RlIiwic2NyaXB0IiwiZXhlYyIsImRpclBhdGgiLCJpc0Nvbm5lY3RlZCIsImRpcmVjdG9yeU1vZGUiLCJkaXJNb2RlIiwiZGlycyIsImN1cnJlbnRQYXRoIiwidXNlciIsImdyb3VwIiwiX3VzZXIiLCJfZ3JvdXAiLCJleGVjQ29tbWFuZCIsImNsb3NlIiwiZGlzcG9zZSIsInNmdHBwbGlzdENvbmZpZyIsInVwbG9hZFRlbXBQYXRoIiwicmVtb3RlUGF0aCIsImZpbGVVc2VyIiwiY2hvd24iLCJtb3ZlU3luYyIsInRnT3B0aW9ucyIsImNyZWF0ZVJlYWRTdHJlYW0iLCJyZW1vdmUiLCJzcmMiLCJwaWNiZWQiLCJzZXJ2ZXJLZXkiLCJwaWNsaXN0T3B0aW9ucyIsImZ1bGxSZXN1bHQiLCJidWlsZEluVXBsb2FkZXJzIiwiYWxpWXVuVXBsb2FkZXIiLCJ0Y1l1blVwbG9hZGVyIiwiU01NU1VwbG9hZGVyIiwiZ2l0aHViVXBsb2FkZXIiLCJxaW5pdVVwbG9hZGVyIiwiaW1ndXJVcGxvYWRlciIsInVwWXVuVXBsb2FkZXIiLCJ3ZWJkYXZwbGlzdFVwbG9hZGVyIiwibG9jYWxVcGxvYWRlciIsInNmdHBVcGxvYWRlciIsInRlbGVncmFwaFVwbG9hZGVyIiwicGljbGlzdFVwbG9hZGVyIiwicmVzdWx0cyIsImltZ1NpemUiLCJnZXRJbWdTaXplIiwiSW1nRnJvbVBhdGgiLCJJbWdGcm9tQmFzZTY0IiwiYnVpbGRJblRyYW5zZm9ybWVycyIsIlBsdWdpbkxvYWRlciIsImZ1bGxMaXN0IiwiU2V0IiwicGx1Z2luTWFwIiwicGFja2FnZVBhdGgiLCJyZXBvc2l0b3J5IiwibGljZW5zZSIsInJlc29sdmVQbHVnaW4iLCJiYXNlZGlyIiwibG9hZCIsInBsdWdpbkRpciIsImRlcHMiLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBzIiwiZGV2RGVwZW5kZW5jaWVzIiwibW9kdWxlcyIsInJlZ2lzdGVyUGx1Z2luIiwiYWRkIiwicGx1Z2luSW50ZXJmYWNlIiwidW5yZWdpc3RlclBsdWdpbiIsImhhc1BsdWdpbiIsIkNMSVBCT0FSRF9JTUFHRV9GT0xERVIiLCJnZXRDdXJyZW50UGxhdGZvcm0iLCJwbGF0Zm9ybSIsImlzV3NsIiwib3MiLCJyZWxlYXNlIiwicGxhdGZvcm0yU2NyaXB0Q29udGVudCIsImRhcndpbiIsIm1hY0NsaXBib2FyZFNjcmlwdCIsIndpbjMyIiwid2luZG93c0NsaXBib2FyZFNjcmlwdCIsIndpbjEwIiwid2luZG93czEwQ2xpcGJvYXJkU2NyaXB0IiwibGludXgiLCJsaW51eENsaXBib2FyZFNjcmlwdCIsIndzbCIsIndzbENsaXBib2FyZFNjcmlwdCIsInBsYXRmb3JtMlNjcmlwdEZpbGVuYW1lIiwiY3JlYXRlSW1hZ2VGb2xkZXIiLCJpbWFnZVBhdGgiLCJnZXRDbGlwYm9hcmRJbWFnZSIsInNjcmlwdFBhdGgiLCJleGVjdXRpb24iLCJzcGF3biIsInN0ZG91dCIsInRyaW0iLCJpbWdQYXRoIiwic2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nIiwiZXZlbnRCdXMiLCJodHRwc0FnZW50IiwiaHR0cHMiLCJBZ2VudCIsIm1heFZlcnNpb24iLCJtaW5WZXJzaW9uIiwiYXBwZW5kRm9ybURhdGEiLCJmb3JtIiwiYXBwZW5kIiwicmVxdWVzdEludGVyY2VwdG9yIiwiX19pc09sZE9wdGlvbnMiLCJvcHQiLCJwcm94eU9wdGlvbnMiLCJ0dW5uZWwiLCJodHRwc092ZXJIdHRwIiwiaG9zdG5hbWUiLCJwcm90b2NvbCIsIkZvcm1EYXRhIiwiYXNzaWduIiwiZ2V0SGVhZGVycyIsInFzIiwicmVzcG9uc2VJbnRlcmNlcHRvciIsInN0YXR1cyIsInJlc3BvbnNlRXJyb3JIYW5kbGVyIiwiZXJyb3JPYmoiLCJDT05GSUdfQ0hBTkdFIiwiaGFuZGxlUHJveHkiLCJJbmZpbml0eSIsImNyZWF0ZSIsImludGVyY2VwdG9ycyIsIm9iaiIsIkNvbnRlbnRUeXBlIiwiREIiLCJkYiIsIkpTT05TdG9yZSIsInJlYWQiLCJmbHVzaCIsInVuc2V0IiwiUGx1Z2luSGFuZGxlciIsImluc3RhbGxlZFBsdWdpbnMiLCJwcm9jZXNzUGx1Z2lucyIsImhhbmRsZVBsdWdpbk5hbWVQcm9jZXNzIiwicGtnTmFtZSIsImZ1bGxOYW1lTGlzdCIsImZ1bGxOYW1lIiwicGtnTmFtZUxpc3QiLCJ3aGVyZSIsIm5wbSIsInBpcGUiLCJzdGRlcnIiLCJaSF9DTiIsIlVQTE9BRF9GQUlMRUQiLCJDSEVDS19TRVRUSU5HUyIsIkNIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLIiwiVVBMT0FEX0ZBSUxFRF9SRUFTT04iLCJTRVJWRVJfRVJST1IiLCJBVVRIX0ZBSUxFRCIsIlBJQ0JFRF9TTU1TIiwiUElDQkVEX1NNTVNfVE9LRU4iLCJQSUNCRURfU01NU19CQUNLVVBfRE9NQUlOIiwiUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOIiwiUElDQkVEX0xPQ0FMIiwiUElDQkVEX0xPQ0FMX1BBVEgiLCJQSUNCRURfTE9DQUxfTUVTU0FHRV9QQVRIIiwiUElDQkVEX0xPQ0FMX0NVU1RPTVVSTCIsIlBJQ0JFRF9MT0NBTF9NRVNTQUdFX0NVU1RPTVVSTCIsIlBJQ0JFRF9MT0NBTF9XRUJQQVRIIiwiUElDQkVEX0xPQ0FMX01FU1NBR0VfV0VCUEFUSCIsIlBJQ0JFRF9BTElDTE9VRCIsIlBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlJRCIsIlBJQ0JFRF9BTElDTE9VRF9BQ0NFU1NLRVlTRUNSRVQiLCJQSUNCRURfQUxJQ0xPVURfQlVDS0VUIiwiUElDQkVEX0FMSUNMT1VEX0FSRUEiLCJQSUNCRURfQUxJQ0xPVURfUEFUSCIsIlBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkwiLCJQSUNCRURfQUxJQ0xPVURfT1BUSU9OUyIsIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0FSRUEiLCJQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9QQVRIIiwiUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfT1BUSU9OUyIsIlBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCIsIlBJQ0JFRF9URU5DRU5UQ0xPVUQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX1ZFUlNJT04iLCJQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRLRVkiLCJQSUNCRURfVEVOQ0VOVENMT1VEX0FQUElEIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUEiLCJQSUNCRURfVEVOQ0VOVENMT1VEX0VORFBPSU5UIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9DVVNUT01VUkwiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQiLCJQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVJFQSIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9QQVRIIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9PUFRJT05TIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0VORFBPSU5UIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9TTElNIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9TTElNX1RJUCIsIlBJQ0JFRF9URU5DRU5UQ0xPVURfU0xJTV9DT05GSVJNIiwiUElDQkVEX1RFTkNFTlRDTE9VRF9TTElNX0NBTkNFTCIsIlBJQ0JFRF9HSVRIVUIiLCJQSUNCRURfR0lUSFVCX1RPS0VOIiwiUElDQkVEX0dJVEhVQl9SRVBPIiwiUElDQkVEX0dJVEhVQl9QQVRIIiwiUElDQkVEX0dJVEhVQl9CUkFOQ0giLCJQSUNCRURfR0lUSFVCX0NVU1RPTVVSTCIsIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX0JSQU5DSCIsIlBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIIiwiUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTCIsIlBJQ0JFRF9RSU5JVSIsIlBJQ0JFRF9RSU5JVV9BQ0NFU1NLRVkiLCJQSUNCRURfUUlOSVVfU0VDUkVUS0VZIiwiUElDQkVEX1FJTklVX0JVQ0tFVCIsIlBJQ0JFRF9RSU5JVV9QQVRIIiwiUElDQkVEX1FJTklVX1VSTCIsIlBJQ0JFRF9RSU5JVV9PUFRJT05TIiwiUElDQkVEX1FJTklVX0FSRUEiLCJQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIIiwiUElDQkVEX1FJTklVX01FU1NBR0VfQVJFQSIsIlBJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlMiLCJQSUNCRURfUUlOSVVfTUVTU0FHRV9VUkwiLCJQSUNCRURfVEVMRUdSQVBIIiwiUElDQkVEX0lNR1VSIiwiUElDQkVEX0lNR1VSX0NMSUVOVElEIiwiUElDQkVEX0lNR1VSX1VTRVJOQU1FIiwiUElDQkVEX0lNR1VSX0FDQ0VTU19UT0tFTiIsIlBJQ0JFRF9JTUdVUl9BTEJVTSIsIlBJQ0JFRF9JTUdVUl9QUk9YWSIsIlBJQ0JFRF9JTUdVUl9NRVNTQUdFX0NMSUVOVElEIiwiUElDQkVEX0lNR1VSX01FU1NBR0VfVVNFUk5BTUUiLCJQSUNCRURfSU1HVVJfTUVTU0FHRV9BQ0NFU1NfVE9LRU4iLCJQSUNCRURfSU1HVVJfTUVTU0FHRV9BTEJVTSIsIlBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZIiwiUElDQkVEX1VQWVVOIiwiUElDQkVEX1VQWVVOX0JVQ0tFVCIsIlBJQ0JFRF9VUFlVTl9PUEVSQVRPUiIsIlBJQ0JFRF9VUFlVTl9QQVNTV09SRCIsIlBJQ0JFRF9VUFlVTl9QQVRIIiwiUElDQkVEX1VQWVVOX1VSTCIsIlBJQ0JFRF9VUFlVTl9PUFRJT05TIiwiUElDQkVEX1VQWVVOX0FOVElfTEVFQ0hfVE9LRU4iLCJQSUNCRURfVVBZVU5fRVhQSVJFX1RJTUUiLCJQSUNCRURfVVBZVU5fTUVTU0FHRV9PUEVSQVRPUiIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBU1NXT1JEIiwiUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMIiwiUElDQkVEX1VQWVVOX01FU1NBR0VfT1BUSU9OUyIsIlBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEgiLCJQSUNCRURfV0VCREFWUExJU1QiLCJQSUNCRURfV0VCREFWUExJU1RfSE9TVCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9TU0xFTkFCTEVEIiwiUElDQkVEX1dFQkRBVlBMSVNUX1VTRVJOQU1FIiwiUElDQkVEX1dFQkRBVlBMSVNUX1BBU1NXT1JEIiwiUElDQkVEX1dFQkRBVlBMSVNUX1BBVEgiLCJQSUNCRURfV0VCREFWUExJU1RfV0VCU0lURV9QQVRIIiwiUElDQkVEX1dFQkRBVlBMSVNUX0NVU1RPTVVSTCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9BVVRIVFlQRSIsIlBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX0hPU1QiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9TU0xFTkFCTEVEIiwiUElDQkVEX1dFQkRBVlBMSVNUX01FU1NBR0VfVVNFUk5BTUUiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9QQVNTV09SRCIsIlBJQ0JFRF9XRUJEQVZQTElTVF9NRVNTQUdFX1BBVEgiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9XRUJTSVRFX1BBVEgiLCJQSUNCRURfV0VCREFWUExJU1RfTUVTU0FHRV9DVVNUT01VUkwiLCJQSUNCRURfU0ZUUFBMSVNUIiwiUElDQkVEX1NGVFBQTElTVF9IT1NUIiwiUElDQkVEX1NGVFBQTElTVF9QT1JUIiwiUElDQkVEX1NGVFBQTElTVF9VU0VSTkFNRSIsIlBJQ0JFRF9TRlRQUExJU1RfUEFTU1dPUkQiLCJQSUNCRURfU0ZUUFBMSVNUX1BSSVZBVEVLRVkiLCJQSUNCRURfU0ZUUFBMSVNUX1BSSVZBVEVLRVlfUEFTU1BIUkFTRSIsIlBJQ0JFRF9TRlRQUExJU1RfVVBMT0FEUEFUSCIsIlBJQ0JFRF9TRlRQUExJU1RfQ1VTVE9NVVJMIiwiUElDQkVEX1NGVFBQTElTVF9XRUJTSVRFX1BBVEgiLCJQSUNCRURfU0ZUUFBMSVNUX0ZJTEVfVVNFUiIsIlBJQ0JFRF9TRlRQUExJU1RfRklMRV9NT0RFIiwiUElDQkVEX1NGVFBQTElTVF9ESVJfTU9ERSIsIlBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9IT1NUIiwiUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX1BPUlQiLCJQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfUFJJVkFURUtFWSIsIlBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9QUklWQVRFS0VZX1BBU1NQSFJBU0UiLCJQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfVVBMT0FEUEFUSCIsIlBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9DVVNUT01VUkwiLCJQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfV0VCU0lURV9QQVRIIiwiUElDQkVEX1NGVFBQTElTVF9NRVNTQUdFX0ZJTEVfVVNFUiIsIlBJQ0JFRF9TRlRQUExJU1RfTUVTU0FHRV9GSUxFX01PREUiLCJQSUNCRURfU0ZUUFBMSVNUX01FU1NBR0VfRElSX01PREUiLCJQSUNCRURfUElDTElTVCIsIlBJQ0JFRF9QSUNMSVNUX0hPU1QiLCJQSUNCRURfUElDTElTVF9QT1JUIiwiUElDQkVEX1BJQ0xJU1RfUElDQkVEIiwiUElDQkVEX1BJQ0xJU1RfQ09ORklHTkFNRSIsIlBJQ0JFRF9QSUNMSVNUX0tFWSIsIkJVSUxESU5fV0FURVJNQVJLX0lTQUREV0FURVJNQVJLIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9JU0FERFdBVEVSTUFSSyIsIkJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RZUEUiLCJCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS1RZUEUiLCJCVUlMRElOX1dBVEVSTUFSS19JU0ZVTExTQ1JFRU5XQVRFUk1BUksiLCJCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX0lTRlVMTFNDUkVFTldBVEVSTUFSSyIsIkJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0RFR1JFRSIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLREVHUkVFIiwiQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLVEVYVCIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLVEVYVCIsIkJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS1RFWFRGT05UUEFUSCIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVFBBVEgiLCJCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktGT05UUkFUSU8iLCJCVUlMRElOX1dBVEVSTUFSS19NRVNTQUdFX1dBVEVSTUFSS0ZPTlRSQVRJTyIsIkJVSUxESU5fV0FURVJNQVJLX1dBVEVSTUFSS0ZPTlRDT0xPUiIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLRk9OVENPTE9SIiwiQlVJTERJTl9XQVRFUk1BUktfV0FURVJNQVJLSU1BR0VQQVRIIiwiQlVJTERJTl9XQVRFUk1BUktfTUVTU0FHRV9XQVRFUk1BUktJTUFHRVBBVEgiLCJCVUlMRElOX1dBVEVSTUFSS19XQVRFUk1BUktQT1NJVElPTiIsIkJVSUxESU5fV0FURVJNQVJLX01FU1NBR0VfV0FURVJNQVJLUE9TSVRJT04iLCJCVUlMRElOX1JFTkFNRV9GT1JNQVQiLCJCVUlMRElOX1JFTkFNRV9FTkFCTEUiLCJCVUlMRElOX0NPTVBSRVNTX1FVQUxJVFkiLCJCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUVVBTElUWSIsIkJVSUxESU5fQ09NUFJFU1NfSVNDT05WRVJUIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTQ09OVkVSVCIsIkJVSUxESU5fQ09NUFJFU1NfQ09OVkVSVEZPUk1BVCIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9DT05WRVJURk9STUFUIiwiQlVJTERJTl9DT01QUkVTU19JU1JFU0laRSIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JFU0laRSIsIkJVSUxESU5fQ09NUFJFU1NfUkVTSVpFV0lEVEgiLCJCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfUkVTSVpFV0lEVEgiLCJCVUlMRElOX0NPTVBSRVNTX1JFU0laRUhFSUdIVCIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVIRUlHSFQiLCJCVUlMRElOX0NPTVBSRVNTX0lTUkVTSVpFQllQRVJDRU5UIiwiQlVJTERJTl9DT01QUkVTU19NRVNTQUdFX0lTUkVTSVpFQllQRVJDRU5UIiwiQlVJTERJTl9DT01QUkVTU19JU0ZMSVAiLCJCVUlMRElOX0NPTVBSRVNTX0lTRkxPUCIsIkJVSUxESU5fQ09NUFJFU1NfUkVTSVpFUEVSQ0VOVCIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9SRVNJWkVQRVJDRU5UIiwiQlVJTERJTl9DT01QUkVTU19TS0lQUkVTSVpFT0ZTTUFMTElNRyIsIkJVSUxESU5fQ09NUFJFU1NfSVNST1RBVEUiLCJCVUlMRElOX0NPTVBSRVNTX01FU1NBR0VfSVNST1RBVEUiLCJCVUlMRElOX0NPTVBSRVNTX1JPVEFURURFR1JFRSIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9ST1RBVEVERUdSRUUiLCJCVUlMRElOX0NPTVBSRVNTX0lTUkVNT1ZFRVhJRiIsIkJVSUxESU5fQ09NUFJFU1NfTUVTU0FHRV9JU1JFTU9WRUVYSUYiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTiIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9QQVRIIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQiLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT04iLCJQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRCIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUyIsIlBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OIiwiUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQiLCJFTiIsIlpIX1RXIiwibGFuZ3VhZ2VMaXN0IiwiZW4iLCJJMThuTWFuYWdlciIsIm9iamVjdEFkYXB0ZXIiLCJPYmplY3RBZGFwdGVyIiwibGFuZ3VhZ2UiLCJJMThuIiwiYWRhcHRlciIsImRlZmF1bHRMYW5ndWFnZSIsImxvYWRPdXR0ZXJJMThuIiwiaTE4bkZvbGRlciIsImdldE91dHRlckkxOG5Gb2xkZXIiLCJyZWFkZGlyU3luYyIsIndpdGhGaWxlVHlwZXMiLCJpc0ZpbGUiLCJlbmRzV2l0aCIsImkxOG5GaWxlUGF0aCIsImkxOG5GaWxlIiwiaTE4bkZpbGVPYmoiLCJ5YW1sIiwicGF0aEV4aXN0c1N5bmMiLCJhZGRMb2NhbGUiLCJsb2NhbGVzIiwib3JpZ2luTG9jYWxlcyIsImdldExvY2FsZSIsIm5ld0xvY2FsZXMiLCJtZXJnZSIsInNldExvY2FsZSIsImFkZExhbmd1YWdlIiwiUGljR28iLCJfcGx1Z2luTG9hZGVyIiwiaW5pdENvbmZpZ1BhdGgiLCJpbml0Q29uZmlnIiwiZW5zdXJlRmlsZVN5bmMiLCJfY29uZmlnIiwidXBsb2FkZXJzIiwidHJhbnNmb3JtZXJzIiwibGlmZWN5Y2xlIiwicmVnaXN0ZXJDb21tYW5kcyIsInByb3BOYW1lIiwic3RhcnQiXSwibWFwcGluZ3MiOiIraUNBRUEsTUFBTUEsY0FBeUIsQ0FDN0JDLE9BQVNDLElBRVAsTUFBTUMsRUFBTUQsRUFBSUMsSUFDaEJBLEVBQUlDLFFBQ0RDLFFBQVEsd0JBQ1JDLFlBQVksd0JBQ1pDLE1BQU0sT0FDTkMsT0FBTyxzQkFBdUIsb0NBQzlCQSxPQUFPLDRCQUE2Qiw0Q0FDcENDLFFBQU8sQ0FBQ0MsRUFBbUJOLEtBQzFCLE1BQU1PLE1BQUVBLEVBQUtDLFNBQUVBLEdBQWFSLEVBQ3RCUyxFQUFVLENBQ2RGLE1BQUFBLEVBQ0FDLFNBQUFBLEdBRUZWLEVBQUlGLGNBQWNjLFFBQVFKLEVBQVNHLEdBQVNFLE9BQU9DLElBQVFkLEVBQUllLElBQUlDLE1BQU1GLFNBRTdFYixFQUFJQyxRQUNEQyxRQUFRLDBCQUNSRSxNQUFNLE1BQ05ELFlBQVksMEJBQ1pHLFFBQVFDLElBQ1BSLEVBQUlGLGNBQWNtQixVQUFVVCxHQUFTSyxPQUFPQyxJQUFRZCxFQUFJZSxJQUFJQyxNQUFNRixTQUV0RWIsRUFBSUMsUUFDREMsUUFBUSx1QkFDUkMsWUFBWSx1QkFDWkUsT0FBTyxzQkFBdUIs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