You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
25 lines
254 KiB
25 lines
254 KiB
var je=Object.create;var K=Object.defineProperty;var qe=Object.getOwnPropertyDescriptor;var Je=Object.getOwnPropertyNames;var We=Object.getPrototypeOf,Qe=Object.prototype.hasOwnProperty;var Ke=(i,t)=>()=>(t||i((t={exports:{}}).exports,t),t.exports),Ge=(i,t)=>{for(var e in t)K(i,e,{get:t[e],enumerable:!0})},pe=(i,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Je(t))!Qe.call(i,s)&&s!==e&&K(i,s,{get:()=>t[s],enumerable:!(n=qe(t,s))||n.enumerable});return i};var Ze=(i,t,e)=>(e=i!=null?je(We(i)):{},pe(t||!i||!i.__esModule?K(e,"default",{value:i,enumerable:!0}):e,i)),Xe=i=>pe(K({},"__esModule",{value:!0}),i);var a=(i,t,e)=>new Promise((n,s)=>{var o=g=>{try{l(e.next(g))}catch(u){s(u)}},r=g=>{try{l(e.throw(g))}catch(u){s(u)}},l=g=>g.done?n(g.value):Promise.resolve(g.value).then(o,r);l((e=e.apply(i,t)).next())});var ze=Ke(c=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var f=require("obsidian"),ae="YYYY-MM-DD",re="gggg-[W]ww",Ne="YYYY-MM",Ee="YYYY-[Q]Q",Le="YYYY";function z(i){var e,n;let t=window.app.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e[i])==null?void 0:n.enabled)}function _(){var i,t,e,n;try{let{internalPlugins:s,plugins:o}=window.app;if(z("daily")){let{format:u,folder:m,template:d}=((t=(i=o.getPlugin("periodic-notes"))==null?void 0:i.settings)==null?void 0:t.daily)||{};return{format:u||ae,folder:(m==null?void 0:m.trim())||"",template:(d==null?void 0:d.trim())||""}}let{folder:r,format:l,template:g}=((n=(e=s.getPluginById("daily-notes"))==null?void 0:e.instance)==null?void 0:n.options)||{};return{format:l||ae,folder:(r==null?void 0:r.trim())||"",template:(g==null?void 0:g.trim())||""}}catch(s){console.info("No custom daily note settings found!",s)}}function H(){var i,t,e,n,s,o,r;try{let l=window.app.plugins,g=(i=l.getPlugin("calendar"))==null?void 0:i.options,u=(e=(t=l.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.weekly;if(z("weekly"))return{format:u.format||re,folder:((n=u.folder)==null?void 0:n.trim())||"",template:((s=u.template)==null?void 0:s.trim())||""};let m=g||{};return{format:m.weeklyNoteFormat||re,folder:((o=m.weeklyNoteFolder)==null?void 0:o.trim())||"",template:((r=m.weeklyNoteTemplate)==null?void 0:r.trim())||""}}catch(l){console.info("No custom weekly note settings found!",l)}}function V(){var t,e,n,s;let i=window.app.plugins;try{let o=z("monthly")&&((e=(t=i.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.monthly)||{};return{format:o.format||Ne,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((s=o.template)==null?void 0:s.trim())||""}}catch(o){console.info("No custom monthly note settings found!",o)}}function Y(){var t,e,n,s;let i=window.app.plugins;try{let o=z("quarterly")&&((e=(t=i.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.quarterly)||{};return{format:o.format||Ee,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((s=o.template)==null?void 0:s.trim())||""}}catch(o){console.info("No custom quarterly note settings found!",o)}}function j(){var t,e,n,s;let i=window.app.plugins;try{let o=z("yearly")&&((e=(t=i.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.yearly)||{};return{format:o.format||Le,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((s=o.template)==null?void 0:s.trim())||""}}catch(o){console.info("No custom yearly note settings found!",o)}}function Ie(...i){let t=[];for(let n=0,s=i.length;n<s;n++)t=t.concat(i[n].split("/"));let e=[];for(let n=0,s=t.length;n<s;n++){let o=t[n];!o||o==="."||e.push(o)}return t[0]===""&&e.unshift(""),e.join("/")}function st(i){let t=i.substring(i.lastIndexOf("/")+1);return t.lastIndexOf(".")!=-1&&(t=t.substring(0,t.lastIndexOf("."))),t}function ot(i){return a(this,null,function*(){let t=i.replace(/\\/g,"/").split("/");if(t.pop(),t.length){let e=Ie(...t);window.app.vault.getAbstractFileByPath(e)||(yield window.app.vault.createFolder(e))}})}function q(i,t){return a(this,null,function*(){t.endsWith(".md")||(t+=".md");let e=f.normalizePath(Ie(i,t));return yield ot(e),e})}function D(i){return a(this,null,function*(){let{metadataCache:t,vault:e}=window.app,n=f.normalizePath(i);if(n==="/")return Promise.resolve(["",null]);try{let s=t.getFirstLinkpathDest(n,""),o=yield e.cachedRead(s),r=window.app.foldManager.load(s);return[o,r]}catch(s){return console.error(`Failed to read the daily note template '${n}'`,s),new f.Notice("Failed to read the daily note template"),["",null]}})}function C(i,t="day"){let e=i.clone().startOf(t).format();return`${t}-${e}`}function ke(i){return i.replace(/\[[^\]]*\]/g,"")}function at(i,t){if(t==="week"){let e=ke(i);return/w{1,2}/i.test(e)&&(/M{1,4}/.test(e)||/D{1,4}/.test(e))}return!1}function B(i,t){return De(i.basename,t)}function rt(i,t){return De(st(i),t)}function De(i,t){let n={day:_,week:H,month:V,quarter:Y,year:j}[t]().format.split("/").pop(),s=window.moment(i,n,!0);if(!s.isValid())return null;if(at(n,t)&&t==="week"){let o=ke(n);if(/w{1,2}/i.test(o))return window.moment(i,n.replace(/M{1,4}/g,"").replace(/D{1,4}/g,""),!1)}return s}var le=class extends Error{};function Be(i){return a(this,null,function*(){let t=window.app,{vault:e}=t,n=window.moment,{template:s,format:o,folder:r}=_(),[l,g]=yield D(s),u=i.format(o),m=yield q(r,u);try{let d=yield e.create(m,l.replace(/{{\s*date\s*}}/gi,u).replace(/{{\s*time\s*}}/gi,n().format("HH:mm")).replace(/{{\s*title\s*}}/gi,u).replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,T,w,b,P,y)=>{let se=n(),oe=i.clone().set({hour:se.get("hour"),minute:se.get("minute"),second:se.get("second")});return w&&oe.add(parseInt(b,10),P),y?oe.format(y.substring(1).trim()):oe.format(o)}).replace(/{{\s*yesterday\s*}}/gi,i.clone().subtract(1,"day").format(o)).replace(/{{\s*tomorrow\s*}}/gi,i.clone().add(1,"d").format(o)));return t.foldManager.save(d,g),d}catch(d){console.error(`Failed to create file: '${m}'`,d),new f.Notice("Unable to create new file.")}})}function lt(i,t){var e;return(e=t[C(i,"day")])!=null?e:null}function gt(){let{vault:i}=window.app,{folder:t}=_(),e=i.getAbstractFileByPath(f.normalizePath(t));if(!e)throw new le("Failed to find daily notes folder");let n={};return f.Vault.recurseChildren(e,s=>{if(s instanceof f.TFile){let o=B(s,"day");if(o){let r=C(o,"day");n[r]=s}}}),n}var ge=class extends Error{};function ut(){let{moment:i}=window,t=i.localeData()._week.dow,e=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"];for(;t;)e.push(e.shift()),t--;return e}function ct(i){return ut().indexOf(i.toLowerCase())}function Me(i){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:s}=H(),[o,r]=yield D(e),l=i.format(n),g=yield q(s,l);try{let u=yield t.create(g,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(m,d,h,T,w,b)=>{let P=window.moment(),y=i.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return h&&y.add(parseInt(T,10),w),b?y.format(b.substring(1).trim()):y.format(n)}).replace(/{{\s*title\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi,(m,d,h)=>{let T=ct(d);return i.weekday(T).format(h.trim())}));return window.app.foldManager.save(u,r),u}catch(u){console.error(`Failed to create file: '${g}'`,u),new f.Notice("Unable to create new file.")}})}function dt(i,t){var e;return(e=t[C(i,"week")])!=null?e:null}function pt(){let i={};if(!xe())return i;let{vault:t}=window.app,{folder:e}=H(),n=t.getAbstractFileByPath(f.normalizePath(e));if(!n)throw new ge("Failed to find weekly notes folder");return f.Vault.recurseChildren(n,s=>{if(s instanceof f.TFile){let o=B(s,"week");if(o){let r=C(o,"week");i[r]=s}}}),i}var ue=class extends Error{};function Re(i){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:s}=V(),[o,r]=yield D(e),l=i.format(n),g=yield q(s,l);try{let u=yield t.create(g,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(m,d,h,T,w,b)=>{let P=window.moment(),y=i.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return h&&y.add(parseInt(T,10),w),b?y.format(b.substring(1).trim()):y.format(n)}).replace(/{{\s*date\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,l));return window.app.foldManager.save(u,r),u}catch(u){console.error(`Failed to create file: '${g}'`,u),new f.Notice("Unable to create new file.")}})}function mt(i,t){var e;return(e=t[C(i,"month")])!=null?e:null}function ft(){let i={};if(!Oe())return i;let{vault:t}=window.app,{folder:e}=V(),n=t.getAbstractFileByPath(f.normalizePath(e));if(!n)throw new ue("Failed to find monthly notes folder");return f.Vault.recurseChildren(n,s=>{if(s instanceof f.TFile){let o=B(s,"month");if(o){let r=C(o,"month");i[r]=s}}}),i}var ce=class extends Error{};function ht(i){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:s}=Y(),[o,r]=yield D(e),l=i.format(n),g=yield q(s,l);try{let u=yield t.create(g,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(m,d,h,T,w,b)=>{let P=window.moment(),y=i.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return h&&y.add(parseInt(T,10),w),b?y.format(b.substring(1).trim()):y.format(n)}).replace(/{{\s*date\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,l));return window.app.foldManager.save(u,r),u}catch(u){console.error(`Failed to create file: '${g}'`,u),new f.Notice("Unable to create new file.")}})}function bt(i,t){var e;return(e=t[C(i,"quarter")])!=null?e:null}function wt(){let i={};if(!$e())return i;let{vault:t}=window.app,{folder:e}=Y(),n=t.getAbstractFileByPath(f.normalizePath(e));if(!n)throw new ce("Failed to find quarterly notes folder");return f.Vault.recurseChildren(n,s=>{if(s instanceof f.TFile){let o=B(s,"quarter");if(o){let r=C(o,"quarter");i[r]=s}}}),i}var de=class extends Error{};function yt(i){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:s}=j(),[o,r]=yield D(e),l=i.format(n),g=yield q(s,l);try{let u=yield t.create(g,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(m,d,h,T,w,b)=>{let P=window.moment(),y=i.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return h&&y.add(parseInt(T,10),w),b?y.format(b.substring(1).trim()):y.format(n)}).replace(/{{\s*date\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,l));return window.app.foldManager.save(u,r),u}catch(u){console.error(`Failed to create file: '${g}'`,u),new f.Notice("Unable to create new file.")}})}function Tt(i,t){var e;return(e=t[C(i,"year")])!=null?e:null}function Pt(){let i={};if(!Ue())return i;let{vault:t}=window.app,{folder:e}=j(),n=t.getAbstractFileByPath(f.normalizePath(e));if(!n)throw new de("Failed to find yearly notes folder");return f.Vault.recurseChildren(n,s=>{if(s instanceof f.TFile){let o=B(s,"year");if(o){let r=C(o,"year");i[r]=s}}}),i}function vt(){var n,s;let{app:i}=window,t=i.internalPlugins.plugins["daily-notes"];if(t&&t.enabled)return!0;let e=i.plugins.getPlugin("periodic-notes");return e&&((s=(n=e.settings)==null?void 0:n.daily)==null?void 0:s.enabled)}function xe(){var e,n;let{app:i}=window;if(i.plugins.getPlugin("calendar"))return!0;let t=i.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.weekly)==null?void 0:n.enabled)}function Oe(){var e,n;let{app:i}=window,t=i.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.monthly)==null?void 0:n.enabled)}function $e(){var e,n;let{app:i}=window,t=i.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.quarterly)==null?void 0:n.enabled)}function Ue(){var e,n;let{app:i}=window,t=i.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.yearly)==null?void 0:n.enabled)}function Ct(i){let t={day:_,week:H,month:V,quarter:Y,year:j}[i];return t()}function St(i,t){return{day:Be,month:Re,week:Me}[i](t)}c.DEFAULT_DAILY_NOTE_FORMAT=ae;c.DEFAULT_MONTHLY_NOTE_FORMAT=Ne;c.DEFAULT_QUARTERLY_NOTE_FORMAT=Ee;c.DEFAULT_WEEKLY_NOTE_FORMAT=re;c.DEFAULT_YEARLY_NOTE_FORMAT=Le;c.appHasDailyNotesPluginLoaded=vt;c.appHasMonthlyNotesPluginLoaded=Oe;c.appHasQuarterlyNotesPluginLoaded=$e;c.appHasWeeklyNotesPluginLoaded=xe;c.appHasYearlyNotesPluginLoaded=Ue;c.createDailyNote=Be;c.createMonthlyNote=Re;c.createPeriodicNote=St;c.createQuarterlyNote=ht;c.createWeeklyNote=Me;c.createYearlyNote=yt;c.getAllDailyNotes=gt;c.getAllMonthlyNotes=ft;c.getAllQuarterlyNotes=wt;c.getAllWeeklyNotes=pt;c.getAllYearlyNotes=Pt;c.getDailyNote=lt;c.getDailyNoteSettings=_;c.getDateFromFile=B;c.getDateFromPath=rt;c.getDateUID=C;c.getMonthlyNote=mt;c.getMonthlyNoteSettings=V;c.getPeriodicNoteSettings=Ct;c.getQuarterlyNote=bt;c.getQuarterlyNoteSettings=Y;c.getTemplateInfo=D;c.getWeeklyNote=dt;c.getWeeklyNoteSettings=H;c.getYearlyNote=Tt;c.getYearlyNoteSettings=j});var Ft={};Ge(Ft,{default:()=>ie});module.exports=Xe(Ft);var Ye=require("obsidian");var v=require("obsidian");var N=require("obsidian");var F=require("obsidian");var et="https://raw.githubusercontent.com/",G=(i,t,e,n=!0)=>a(void 0,null,function*(){let s=`https://github.com/${i}/releases/download/${t}/${e}`;try{let o=yield(0,F.request)({url:s});return o==="Not Found"||o==='{"error":"Not Found"}'?null:o}catch(o){return n&&console.log("error in grabReleaseFileFromRepository",s,o),null}}),me=(i,t=!0,e=!0)=>a(void 0,null,function*(){let n=et+i+(t===!0?"/HEAD/manifest.json":"/HEAD/manifest-beta.json");try{let s=yield(0,F.request)({url:n});return s==="404: Not Found"?null:yield JSON.parse(s)}catch(s){return s!="Error: Request failed, status 404"&&e&&console.log(`error in grabManifestJsonFromRepository for ${n}`,s),null}}),fe=(i=!0)=>a(void 0,null,function*(){let t="https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json";try{let e=yield(0,F.request)({url:t});return e==="404: Not Found"?null:yield JSON.parse(e)}catch(e){return i&&console.log("error in grabCommmunityPluginList",e),null}}),he=(i=!0)=>a(void 0,null,function*(){let t="https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-css-themes.json";try{let e=yield(0,F.request)({url:t});return e==="404: Not Found"?null:yield JSON.parse(e)}catch(e){return i&&console.log("error in grabCommmunityThemesList",e),null}}),L=(i,t=!1,e)=>a(void 0,null,function*(){let n=`https://raw.githubusercontent.com/${i}/HEAD/theme${t?"-beta":""}.css`;try{let s=yield(0,F.request)({url:n});return s==="404: Not Found"?null:s}catch(s){return e&&console.log("error in grabCommmunityThemeCssFile",s),null}}),be=(i,t=!0)=>a(void 0,null,function*(){let e=`https://raw.githubusercontent.com/${i}/HEAD/manifest.json`;try{let n=yield(0,F.request)({url:e});return n==="404: Not Found"?null:n}catch(n){return t&&console.log("error in grabCommmunityThemeManifestFile",n),null}}),tt=i=>{let t=0;for(let e=0;e<i.length;e++)t+=i.charCodeAt(e);return t},M=i=>tt(i).toString(),R=(i,t,e)=>a(void 0,null,function*(){let n=yield L(i,t,e);return n?M(n):"0"}),nt=(i,t,e=!0)=>a(void 0,null,function*(){let n=`https://api.github.com/repos/${i}/commits?path=${t}&page=1&per_page=1`;try{let s=yield(0,F.request)({url:n});return s==="404: Not Found"?null:JSON.parse(s)}catch(s){return e&&console.log("error in grabLastCommitInfoForAFile",s),null}}),we=(i,t)=>a(void 0,null,function*(){let e=yield nt(i,t);return e[0].commit.committer.date?e[0].commit.committer.date:""});var ye={pluginList:[],pluginSubListFrozenVersion:[],themesList:[],updateAtStartup:!1,updateThemesAtStartup:!1,ribbonIconEnabled:!0,loggingEnabled:!1,loggingPath:"BRAT-log",loggingVerboseEnabled:!1,debuggingMode:!0,notificationsEnabled:!0};function Te(i,t,e=""){return a(this,null,function*(){let n=!1;i.settings.pluginList.contains(t)||(i.settings.pluginList.unshift(t),n=!0),e!==""&&i.settings.pluginSubListFrozenVersion.filter(s=>s.repo===t).length===0&&(i.settings.pluginSubListFrozenVersion.unshift({repo:t,version:e}),n=!0),n&&i.saveSettings()})}function Pe(i,t){return a(this,null,function*(){return i.settings.pluginList.contains(t)})}function ve(i,t,e){return a(this,null,function*(){let n={repo:t,lastUpdate:M(e)};i.settings.themesList.unshift(n),i.saveSettings()})}function Ce(i,t){return a(this,null,function*(){return!!i.settings.themesList.find(n=>n.repo===t)})}function Se(i,t,e){i.settings.themesList.forEach(n=>{n.repo===t&&(n.lastUpdate=e,i.saveSettings())})}var Z=require("obsidian");function p(i,t,e=10,n){if(i.settings.notificationsEnabled===!1)return;let s=n?Z.Platform.isDesktop?"(click=dismiss, right-click=Info)":"(click=dismiss)":"",o=new Z.Notice(`BRAT
|
|
${t}
|
|
${s}`,e*1e3);n&&(o.noticeEl.oncontextmenu=()=>a(this,null,function*(){n()}))}function X(){return a(this,null,function*(){try{let i=yield fetch("https://obsidian.md/?"+Math.random());return i.status>=200&&i.status<300}catch(i){return!1}})}var x=(i,t,e)=>a(void 0,null,function*(){let n=yield L(t,!0,i.settings.debuggingMode);if(n||(n=yield L(t,!1,i.settings.debuggingMode)),!n)return p(i,"There is no theme.css or theme-beta.css file in the root path of this repository, so there is no theme to install."),!1;let s=yield be(t,i.settings.debuggingMode);if(!s)return p(i,"There is no manifest.json file in the root path of this repository, so theme cannot be installed."),!1;let o=yield JSON.parse(s),r=(0,N.normalizePath)(it(i)+o.name),l=i.app.vault.adapter;(yield l.exists(r))===!1&&(yield l.mkdir(r)),yield l.write((0,N.normalizePath)(r+"/theme.css"),n),yield l.write((0,N.normalizePath)(r+"/manifest.json"),s),Se(i,t,M(n));let g="";return e?(yield ve(i,t,n),g=`${o.name} theme installed from ${t}. `,setTimeout(()=>{i.app.customCss.setTheme(o.name)},500)):g=`${o.name} theme updated from ${t}.`,i.log(g+`[Theme Info](https://github.com/${t})`,!1),p(i,`${g}`,20,()=>a(void 0,null,function*(){window.open(`https://github.com/${t}`)})),!0}),I=(i,t)=>a(void 0,null,function*(){if((yield X())===!1){console.log("BRAT: No internet detected.");return}let e,n="Checking for beta theme updates STARTED";i.log(n,!0),t&&i.settings.notificationsEnabled&&(e=new N.Notice(`BRAT
|
|
${n}`,3e4));for(let o of i.settings.themesList){let r=yield R(o.repo,!0,i.settings.debuggingMode);r==="0"&&(r=yield R(o.repo,!1,i.settings.debuggingMode)),r!==o.lastUpdate&&(yield x(i,o.repo,!1))}let s="Checking for beta theme updates COMPLETED";i.log(s,!0),t&&(i.settings.notificationsEnabled&&e.hide(),p(i,s))}),ee=(i,t)=>a(void 0,null,function*(){i.settings.themesList=i.settings.themesList.filter(n=>n.repo!=t),i.saveSettings();let e=`Removed ${t} from BRAT themes list and will no longer be updated. However, the theme files still exist in the vault. To remove them, go into Settings > Appearance and remove the theme.`;i.log(e,!0),p(i,`${e}`)}),it=i=>(0,N.normalizePath)(i.app.vault.configDir+"/themes")+"/";var te=require("obsidian");var k=(i,t=!0)=>{let e=t?40:30,n=i.createEl("div");n.style.float="right",t===!1?(n.style.padding="10px",n.style.paddingLeft="15px",n.style.paddingRight="15px"):(n.style.padding="15px",n.style.paddingLeft="15px",n.style.paddingRight="15px",n.style.marginLeft="15px");let s=n.createSpan("coffee");s.addClass("ex-coffee-span");let r=s.createEl("a",{href:"https://bit.ly/o42-kofi"}).createEl("img",{attr:{src:"https://cdn.ko-fi.com/cdn/kofi3.png?v=3"}});r.height=e;let l=n.createSpan("coffee");l.addClass("ex-twitter-span"),l.style.paddingLeft="10px";let u=l.createEl("a",{href:"https://bit.ly/o42-twitter"}).createEl("img",{attr:{src:"https://cdn.cdnlogo.com/logos/t/96/twitter-icon.svg"}});u.height=e;let m=n.createSpan("coffee");m.addClass("ex-twitter-span"),m.style.paddingLeft="10px",m.style.right="0";let h=m.createEl("a",{href:"https://bit.ly/o42-medium"}).createEl("img",{attr:{src:"https://miro.medium.com/v2/resize:fill:176:176/1*sHhtYhaCe2Uc3IU0IgKwIQ.png"}});return h.height=e,n};var E=class extends te.Modal{constructor(e,n=!1){super(e.app);this.plugin=e,this.address="",this.openSettingsTabAfterwards=n}submitForm(){return a(this,null,function*(){if(this.address==="")return;let e=this.address.replace("https://github.com/","");if(yield Ce(this.plugin,e)){p(this.plugin,"This plugin is already in the list for beta testing",10);return}(yield x(this.plugin,e,!0))&&this.close()})}onOpen(){this.contentEl.createEl("h4",{text:"Github repository for beta theme:"}),this.contentEl.createEl("form",{},e=>{e.addClass("brat-modal"),new te.Setting(e).addText(o=>{o.setPlaceholder("Repository (example: https://github.com/GitubUserName/repository-name"),o.onChange(r=>{this.address=r.trim()}),o.inputEl.addEventListener("keydown",r=>a(this,null,function*(){r.key==="Enter"&&this.address!==" "&&(r.preventDefault(),yield this.submitForm())})),o.inputEl.style.width="100%",window.setTimeout(()=>{let r=document.querySelector(".setting-item-info");r&&r.remove(),o.inputEl.focus()},10)}),e.createDiv("modal-button-container",o=>{o.createEl("button",{attr:{type:"button"},text:"Never mind"}).addEventListener("click",()=>this.close()),o.createEl("button",{attr:{type:"submit"},cls:"mod-cta",text:"Add Theme"})});let n=e.createDiv();n.style.borderTop="1px solid #ccc",n.style.marginTop="30px";let s=n.createSpan();s.innerHTML="BRAT by <a href='https://bit.ly/o42-twitter'>TFTHacker</a>",s.style.fontStyle="italic",n.appendChild(s),k(n,!1),window.setTimeout(()=>{e.querySelectorAll(".brat-modal .setting-item-info").forEach(r=>{r.remove()})},50),e.addEventListener("submit",o=>a(this,null,function*(){o.preventDefault(),this.address!==""&&(yield this.submitForm())}))})}onClose(){return a(this,null,function*(){this.openSettingsTabAfterwards&&(yield this.plugin.app.setting.open(),yield this.plugin.app.setting.openTabById("obsidian42-brat"))})}};var ne=class extends v.PluginSettingTab{constructor(e,n){super(e,n);this.plugin=n}display(){let{containerEl:e}=this;e.empty(),k(e,!0),e.createEl("h1",{text:this.plugin.appName}),e.createEl("h2",{text:"by TfTHacker"}),new v.Setting(e).setName("Auto-update plugins at startup").setDesc("If enabled all beta plugins will be checked for updates each time Obsidian starts. Note: this does not update frozen version plugins.").addToggle(s=>{s.setValue(this.plugin.settings.updateAtStartup),s.onChange(o=>a(this,null,function*(){this.plugin.settings.updateAtStartup=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Auto-update themes at startup").setDesc("If enabled all beta themes will be checked for updates each time Obsidian starts.").addToggle(s=>{s.setValue(this.plugin.settings.updateThemesAtStartup),s.onChange(o=>a(this,null,function*(){this.plugin.settings.updateThemesAtStartup=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Ribbon Button").setDesc("Toggle ribbon button off and on.").addToggle(s=>{s.setValue(this.plugin.settings.ribbonIconEnabled),s.onChange(o=>a(this,null,function*(){this.plugin.settings.ribbonIconEnabled=o,this.plugin.settings.ribbonIconEnabled===!1?this.plugin.ribbonIcon.remove():this.plugin.showRibbonButton(),yield this.plugin.saveSettings()}))}),e.createEl("hr"),e.createEl("h2",{text:"Beta Plugin List"}),e.createEl("div",{text:'The following is a list of beta plugins added via the command palette "Add a beta plugin for testing" or "Add a beta plugin with frozen version for testing". A frozen version is a specific release of a plugin based on its releease tag. '}),e.createEl("p"),e.createEl("div",{text:"Click the x button next to a plugin to remove it from the list."}),e.createEl("p"),e.createEl("span").createEl("b",{text:"Note: "}),e.createSpan({text:"This does not delete the plugin, this should be done from the Community Plugins tab in Settings."}),new v.Setting(e).addButton(s=>{s.setButtonText("Add Beta plugin"),s.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),yield this.plugin.betaPlugins.displayAddNewPluginModal(!0,!1)}))});let n=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(s=>s.repo));for(let s of this.plugin.settings.pluginList)n.has(s)||new v.Setting(e).setName(s).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta plugin"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield this.plugin.betaPlugins.deletePlugin(s))}))});new v.Setting(e).addButton(s=>{s.setButtonText("Add Beta plugin with frozen version"),s.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),yield this.plugin.betaPlugins.displayAddNewPluginModal(!0,!0)}))});for(let s of this.plugin.settings.pluginSubListFrozenVersion)new v.Setting(e).setName(`${s.repo} (version ${s.version})`).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta plugin"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield this.plugin.betaPlugins.deletePlugin(s.repo))}))});e.createEl("hr"),e.createEl("h2",{text:"Beta Themes List"}),new v.Setting(e).addButton(s=>{s.setButtonText("Add Beta Theme"),s.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),new E(this.plugin).open()}))});for(let s of this.plugin.settings.themesList)new v.Setting(e).setName(s.repo).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta theme"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield ee(this.plugin,s.repo))}))});e.createEl("hr"),e.createEl("h2",{text:"Monitoring"}),new v.Setting(e).setName("Enable Notifications").setDesc("BRAT will provide popup notifications for its various activities. Turn this off means no notifications from BRAT.").addToggle(s=>{s.setValue(this.plugin.settings.notificationsEnabled),s.onChange(o=>a(this,null,function*(){this.plugin.settings.notificationsEnabled=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Enable Logging").setDesc("Plugin updates will be logged to a file in the log file.").addToggle(s=>{s.setValue(this.plugin.settings.loggingEnabled),s.onChange(o=>a(this,null,function*(){this.plugin.settings.loggingEnabled=o,yield this.plugin.saveSettings()}))}),new v.Setting(this.containerEl).setName("BRAT Log File Location").setDesc("Logs will be saved to this file. Don't add .md to the file name.").addSearch(s=>{s.setPlaceholder("Example: BRAT-log").setValue(this.plugin.settings.loggingPath).onChange(o=>a(this,null,function*(){this.plugin.settings.loggingPath=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Enable Verbose Logging").setDesc("Get a lot more information in the log.").addToggle(s=>{s.setValue(this.plugin.settings.loggingVerboseEnabled),s.onChange(o=>a(this,null,function*(){this.plugin.settings.loggingVerboseEnabled=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Debugging Mode").setDesc("Atomic Bomb level console logging. Can be used for troubleshoting and development.").addToggle(s=>{s.setValue(this.plugin.settings.debuggingMode),s.onChange(o=>a(this,null,function*(){this.plugin.settings.debuggingMode=o,yield this.plugin.saveSettings()}))})}};var O=require("obsidian");var $=class extends O.Modal{constructor(e,n,s=!1,o=!1){super(e.app);this.plugin=e,this.betaPlugins=n,this.address="",this.openSettingsTabAfterwards=s,this.useFrozenVersion=o,this.version=""}submitForm(){return a(this,null,function*(){if(this.address==="")return;let e=this.address.replace("https://github.com/","");if(yield Pe(this.plugin,e)){p(this.plugin,"This plugin is already in the list for beta testing",10);return}(yield this.betaPlugins.addPlugin(e,!1,!1,!1,this.version))&&this.close()})}onOpen(){this.contentEl.createEl("h4",{text:"Github repository for beta plugin:"}),this.contentEl.createEl("form",{},e=>{e.addClass("brat-modal"),new O.Setting(e).addText(o=>{o.setPlaceholder("Repository (example: https://github.com/GitubUserName/repository-name)"),o.onChange(r=>{this.address=r.trim()}),o.inputEl.addEventListener("keydown",r=>a(this,null,function*(){r.key==="Enter"&&this.address!==" "&&(this.useFrozenVersion&&this.version!==""||!this.useFrozenVersion)&&(r.preventDefault(),yield this.submitForm())})),o.inputEl.style.width="100%"}),this.useFrozenVersion&&new O.Setting(e).addText(o=>{o.setPlaceholder("Specify the release version tag (example: 1.0.0)"),o.onChange(r=>{this.version=r.trim()}),o.inputEl.style.width="100%"}),e.createDiv("modal-button-container",o=>{o.createEl("button",{attr:{type:"button"},text:"Never mind"}).addEventListener("click",()=>this.close()),o.createEl("button",{attr:{type:"submit"},cls:"mod-cta",text:"Add Plugin"})});let n=e.createDiv();n.style.borderTop="1px solid #ccc",n.style.marginTop="30px";let s=n.createSpan();s.innerHTML="BRAT by <a href='https://bit.ly/o42-twitter'>TFTHacker</a>",s.style.fontStyle="italic",n.appendChild(s),k(n,!1),window.setTimeout(()=>{e.querySelectorAll(".brat-modal .setting-item-info").forEach(r=>{r.remove()})},50),e.addEventListener("submit",o=>a(this,null,function*(){o.preventDefault(),this.address!==""&&(this.useFrozenVersion&&this.version!==""||!this.useFrozenVersion)&&(yield this.submitForm())}))})}onClose(){return a(this,null,function*(){this.openSettingsTabAfterwards&&(yield this.plugin.app.setting.open(),yield this.plugin.app.setting.openTabById("obsidian42-brat"))})}};var A=require("obsidian");var U=class{constructor(t){this.plugin=t}displayAddNewPluginModal(t=!1,e=!1){return a(this,null,function*(){new $(this.plugin,this,t,e).open()})}validateRepository(t,e=!1,n=!1){return a(this,null,function*(){let o=yield me(t,!e,this.plugin.settings.debuggingMode);return o?"id"in o?"version"in o?o:(n&&p(this.plugin,`${t}
|
|
The version attribute for the release is missing from the manifest file`,15),null):(n&&p(this.plugin,`${t}
|
|
The plugin id attribute for the release is missing from the manifest file`,15),null):(n&&p(this.plugin,`${t}
|
|
This does not seem to be an obsidian plugin, as there is no manifest.json file.`,15),null)})}getAllReleaseFiles(t,e,n,s=""){return a(this,null,function*(){let o=s===""?e.version:s,r=n||s!=="";return{mainJs:yield G(t,o,"main.js",this.plugin.settings.debuggingMode),manifest:r?yield G(t,o,"manifest.json",this.plugin.settings.debuggingMode):"",styles:yield G(t,o,"styles.css",this.plugin.settings.debuggingMode)}})}writeReleaseFilesToPluginFolder(t,e){return a(this,null,function*(){let n=(0,A.normalizePath)(this.plugin.app.vault.configDir+"/plugins/"+t)+"/",s=this.plugin.app.vault.adapter;((yield s.exists(n))===!1||!(yield s.exists(n+"manifest.json")))&&(yield s.mkdir(n)),yield s.write(n+"main.js",e.mainJs),yield s.write(n+"manifest.json",e.manifest),e.styles&&(yield s.write(n+"styles.css",e.styles))})}addPlugin(t,e=!1,n=!1,s=!1,o=""){return a(this,null,function*(){var m;let l=yield this.validateRepository(t,!0,!1),g=!!l;if(g===!1&&(l=yield this.validateRepository(t,!1,!0)),l===null){let d=`${t}
|
|
A manifest.json or manifest-beta.json file does not exist in the root directory of the repository. This plugin cannot be installed.`;return this.plugin.log(d,!0),p(this.plugin,`${d}`,10),!1}if(!l.hasOwnProperty("version")){let d=`${t}
|
|
The manifest${g?"-beta":""}.json file in the root directory of the repository does not have a version number in the file. This plugin cannot be installed.`;return this.plugin.log(d,!0),p(this.plugin,`${d}`,10),!1}if(l.hasOwnProperty("minAppVersion")&&!(0,A.requireApiVersion)(l.minAppVersion)){let d=`Plugin: ${t}
|
|
|
|
The manifest${g?"-beta":""}.json for this plugin indicates that the Obsidian version of the app needs to be ${l.minAppVersion}, but this installation of Obsidian is ${A.apiVersion}.
|
|
|
|
You will need to update your Obsidian to use this plugin or contact the plugin developer for more information.`;return this.plugin.log(d,!0),p(this.plugin,`${d}`,30),!1}let u=()=>a(this,null,function*(){let d=yield this.getAllReleaseFiles(t,l,g,o);if((g||d.manifest==="")&&(d.manifest=JSON.stringify(l)),d.mainJs===null){let h=`${t}
|
|
The release is not complete and cannot be download. main.js is missing from the Release`;return this.plugin.log(h,!0),p(this.plugin,`${h}`,10),null}return d});if(e===!1){let d=yield u();if(d===null)return!1;yield this.writeReleaseFilesToPluginFolder(l.id,d),yield Te(this.plugin,t,o),yield this.plugin.app.plugins.loadManifests();let h=o===""?"":` (version: ${o})`,T=`${t}${h}
|
|
The plugin has been registered with BRAT. You may still need to enable it the Community Plugin List.`;this.plugin.log(T,!0),p(this.plugin,T,10)}else{let d=this.plugin.app.vault.configDir+"/plugins/"+l.id+"/",h="";try{h=yield this.plugin.app.vault.adapter.read(d+"manifest.json")}catch(w){if(w.errno===-4058||w.errno===-2)return yield this.addPlugin(t,!1,g,!1,o),!0;console.log("BRAT - Local Manifest Load",l.id,JSON.stringify(w,null,2))}if(o!==""||this.plugin.settings.pluginSubListFrozenVersion.map(w=>w.repo).includes(t))return p(this.plugin,`The version of ${t} is frozen, not updating.`,3),!1;let T=yield JSON.parse(h);if(T.version!==l.version){let w=yield u();if(w===null)return!1;if(n){let b=`There is an update available for ${l.id} from version ${T.version} to ${l.version}. `;this.plugin.log(b+`[Release Info](https://github.com/${t}/releases/tag/${l.version})`,!1),p(this.plugin,b,30,()=>a(this,null,function*(){window.open(`https://github.com/${t}/releases/tag/${l.version}`)}))}else{yield this.writeReleaseFilesToPluginFolder(l.id,w),yield this.plugin.app.plugins.loadManifests(),(m=this.plugin.app.plugins.plugins[l.id])!=null&&m.manifest&&(yield this.reloadPlugin(l.id));let b=`${l.id}
|
|
Plugin has been updated from version ${T.version} to ${l.version}. `;this.plugin.log(b+`[Release Info](https://github.com/${t}/releases/tag/${l.version})`,!1),p(this.plugin,b,30,()=>a(this,null,function*(){window.open(`https://github.com/${t}/releases/tag/${l.version}`)}))}}else s&&p(this.plugin,`No update available for ${t}`,3)}return!0})}reloadPlugin(t){return a(this,null,function*(){let e=this.plugin.app.plugins;try{yield e.disablePlugin(t),yield e.enablePlugin(t)}catch(n){this.plugin.settings.debuggingMode&&console.log("reload plugin",n)}})}updatePlugin(t,e=!1,n=!1){return a(this,null,function*(){let s=yield this.addPlugin(t,!0,e,n);return s===!1&&e===!1&&p(this.plugin,`${t}
|
|
Update of plugin failed.`),s})}checkForUpdatesAndInstallUpdates(t=!1,e=!1){return a(this,null,function*(){if((yield X())===!1){console.log("BRAT: No internet detected.");return}let n,s="Checking for plugin updates STARTED";this.plugin.log(s,!0),t&&this.plugin.settings.notificationsEnabled&&(n=new A.Notice(`BRAT
|
|
${s}`,3e4));let o=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(l=>l.repo));for(let l of this.plugin.settings.pluginList)o.has(l)||(yield this.updatePlugin(l,e));let r="Checking for plugin updates COMPLETED";this.plugin.log(r,!0),t&&(n.hide(),p(this.plugin,r,10))})}deletePlugin(t){return a(this,null,function*(){let e=`Removed ${t} from BRAT plugin list`;this.plugin.log(e,!0),this.plugin.settings.pluginList=this.plugin.settings.pluginList.filter(n=>n!=t),this.plugin.settings.pluginSubListFrozenVersion=this.plugin.settings.pluginSubListFrozenVersion.filter(n=>n.repo!=t),this.plugin.saveSettings()})}getEnabledDisabledPlugins(t){let e=this.plugin.app.plugins,n=Object.values(e.manifests),s=Object.values(e.plugins).map(o=>o.manifest);return t?n.filter(o=>s.find(r=>o.id===r.id)):n.filter(o=>!s.find(r=>o.id===r.id))}};var Fe=require("obsidian");function Ae(){(0,Fe.addIcon)("BratIcon",'<path fill="currentColor" stroke="currentColor" d="M 41.667969 41.667969 C 41.667969 39.367188 39.800781 37.5 37.5 37.5 C 35.199219 37.5 33.332031 39.367188 33.332031 41.667969 C 33.332031 43.96875 35.199219 45.832031 37.5 45.832031 C 39.800781 45.832031 41.667969 43.96875 41.667969 41.667969 Z M 60.417969 58.582031 C 59.460938 58.023438 58.320312 57.867188 57.25 58.148438 C 56.179688 58.429688 55.265625 59.125 54.707031 60.082031 C 53.746094 61.777344 51.949219 62.820312 50 62.820312 C 48.050781 62.820312 46.253906 61.777344 45.292969 60.082031 C 44.734375 59.125 43.820312 58.429688 42.75 58.148438 C 41.679688 57.867188 40.539062 58.023438 39.582031 58.582031 C 37.597656 59.726562 36.910156 62.257812 38.042969 64.25 C 40.5 68.53125 45.0625 71.171875 50 71.171875 C 54.9375 71.171875 59.5 68.53125 61.957031 64.25 C 63.089844 62.257812 62.402344 59.726562 60.417969 58.582031 Z M 62.5 37.5 C 60.199219 37.5 58.332031 39.367188 58.332031 41.667969 C 58.332031 43.96875 60.199219 45.832031 62.5 45.832031 C 64.800781 45.832031 66.667969 43.96875 66.667969 41.667969 C 66.667969 39.367188 64.800781 37.5 62.5 37.5 Z M 50 8.332031 C 26.988281 8.332031 8.332031 26.988281 8.332031 50 C 8.332031 73.011719 26.988281 91.667969 50 91.667969 C 73.011719 91.667969 91.667969 73.011719 91.667969 50 C 91.667969 26.988281 73.011719 8.332031 50 8.332031 Z M 50 83.332031 C 33.988281 83.402344 20.191406 72.078125 17.136719 56.363281 C 14.078125 40.644531 22.628906 24.976562 37.5 19.042969 C 37.457031 19.636719 37.457031 20.238281 37.5 20.832031 C 37.5 27.738281 43.097656 33.332031 50 33.332031 C 52.300781 33.332031 54.167969 31.46875 54.167969 29.167969 C 54.167969 26.867188 52.300781 25 50 25 C 47.699219 25 45.832031 23.132812 45.832031 20.832031 C 45.832031 18.53125 47.699219 16.667969 50 16.667969 C 68.410156 16.667969 83.332031 31.589844 83.332031 50 C 83.332031 68.410156 68.410156 83.332031 50 83.332031 Z M 50 83.332031 " />')}var J=require("obsidian"),_e=Ze(ze());function He(i,t,e=!1){if(i.settings.debuggingMode&&console.log("BRAT: "+t),i.settings.loggingEnabled){if(i.settings.loggingVerboseEnabled===!1&&e===!0)return;{let n=i.settings.loggingPath+".md",s="[["+(0,J.moment)().format((0,_e.getDailyNoteSettings)().format).toString()+"]] "+(0,J.moment)().format("HH:mm"),o=J.Platform.isDesktop?window.require("os").hostname():"MOBILE",r=s+" "+o+" "+t.replace(`
|
|
`," ")+`
|
|
|
|
`;setTimeout(()=>a(this,null,function*(){if((yield i.app.vault.adapter.exists(n))===!0){let l=yield i.app.vault.adapter.read(n);r=r+l;let g=i.app.vault.getAbstractFileByPath(n);yield i.app.vault.modify(g,r)}else yield i.app.vault.create(n,r)}),10)}}}var Ve=require("obsidian");var S=class extends Ve.FuzzySuggestModal{constructor(e){super(e.app);this.scope.register(["Shift"],"Enter",n=>this.enterTrigger(n)),this.scope.register(["Ctrl"],"Enter",n=>this.enterTrigger(n))}setSuggesterData(e){this.data=e}display(e){return a(this,null,function*(){this.callbackFunction=e,this.open()})}getItems(){return this.data}getItemText(e){return e.display}onChooseItem(){}renderSuggestion(e,n){n.createEl("div",{text:e.item.display})}enterTrigger(e){let n=document.querySelector(".suggestion-item.is-selected div").textContent,s=this.data.find(o=>o.display===n);s&&(this.invokeCallback(s,e),this.close())}onChooseSuggestion(e,n){this.invokeCallback(e.item,n)}invokeCallback(e,n){this.callbackFunction(e,n)}};var W=class{constructor(t){this.bratCommands=[{id:"BRAT-AddBetaPlugin",icon:"BratIcon",name:"Plugins: Add a beta plugin for testing",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.displayAddNewPluginModal(!1,!1)})},{id:"BRAT-AddBetaPluginWithFrozenVersion",icon:"BratIcon",name:"Plugins: Add a beta plugin with frozen version based on a release tag",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.displayAddNewPluginModal(!1,!0)})},{id:"BRAT-checkForUpdatesAndUpdate",icon:"BratIcon",name:"Plugins: Check for updates to all beta plugins and UPDATE",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(!0,!1)})},{id:"BRAT-checkForUpdatesAndDontUpdate",icon:"BratIcon",name:"Plugins: Only check for updates to beta plugins, but don't Update",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(!0,!0)})},{id:"BRAT-updateOnePlugin",icon:"BratIcon",name:"Plugins: Choose a single plugin version to update",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(s=>s.repo)),e=Object.values(this.plugin.settings.pluginList).filter(s=>!t.has(s)).map(s=>({display:s,info:s})),n=new S(this.plugin);n.setSuggesterData(e),yield n.display(s=>a(this,null,function*(){let o=`Checking for updates for ${s.info}`;this.plugin.log(o,!0),p(this.plugin,`
|
|
${o}`,3),yield this.plugin.betaPlugins.updatePlugin(s.info,!1,!0)}))})},{id:"BRAT-restartPlugin",icon:"BratIcon",name:"Plugins: Restart a plugin that is already installed",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=Object.values(this.plugin.app.plugins.manifests).map(n=>({display:n.id,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){p(this.plugin,`${n.info}
|
|
Plugin reloading .....`,5),yield this.plugin.betaPlugins.reloadPlugin(n.info)}))})},{id:"BRAT-disablePlugin",icon:"BratIcon",name:"Plugins: Disable a plugin - toggle it off",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.betaPlugins.getEnabledDisabledPlugins(!0).map(n=>({display:`${n.name} (${n.id})`,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`${n.display} plugin disabled`,!1),this.plugin.settings.debuggingMode&&console.log(n.info),yield this.plugin.app.plugins.disablePluginAndSave(n.info)}))})},{id:"BRAT-enablePlugin",icon:"BratIcon",name:"Plugins: Enable a plugin - toggle it on",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.betaPlugins.getEnabledDisabledPlugins(!1).map(n=>({display:`${n.name} (${n.id})`,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`${n.display} plugin enabled`,!1),yield this.plugin.app.plugins.enablePluginAndSave(n.info)}))})},{id:"BRAT-openGitHubZRepository",icon:"BratIcon",name:"Plugins: Open the GitHub repository for a plugin",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=yield fe(this.plugin.settings.debuggingMode),e=Object.values(t).map(o=>({display:`Plugin: ${o.name} (${o.repo})`,info:o.repo})),n=Object.values(this.plugin.settings.pluginList).map(o=>({display:"BRAT: "+o,info:o}));e.forEach(o=>n.push(o));let s=new S(this.plugin);s.setSuggesterData(n),yield s.display(o=>a(this,null,function*(){o.info&&window.open(`https://github.com/${o.info}`)}))})},{id:"BRAT-openGitHubRepoTheme",icon:"BratIcon",name:"Themes: Open the GitHub repository for a theme (appearance)",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=yield he(this.plugin.settings.debuggingMode),e=Object.values(t).map(s=>({display:`Theme: ${s.name} (${s.repo})`,info:s.repo})),n=new S(this.plugin);n.setSuggesterData(e),yield n.display(s=>a(this,null,function*(){s.info&&window.open(`https://github.com/${s.info}`)}))})},{id:"BRAT-opentPluginSettings",icon:"BratIcon",name:"Plugins: Open Plugin Settings Tab",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.app.setting,e=Object.values(t.pluginTabs).map(o=>({display:"Plugin: "+o.name,info:o.id})),n=new S(this.plugin),s=Object.values(t.settingTabs).map(o=>({display:"Core: "+o.name,info:o.id}));e.forEach(o=>s.push(o)),n.setSuggesterData(s),yield n.display(o=>a(this,null,function*(){t.open(),t.openTabById(o.info)}))})},{id:"BRAT-GrabBetaTheme",icon:"BratIcon",name:"Themes: Grab a beta theme for testing from a Github repository",showInRibbon:!0,callback:()=>a(this,null,function*(){new E(this.plugin).open()})},{id:"BRAT-updateBetaThemes",icon:"BratIcon",name:"Themes: Update beta themes",showInRibbon:!0,callback:()=>a(this,null,function*(){return yield I(this.plugin,!0)})},{id:"BRAT-allCommands",icon:"BratIcon",name:"All Commands list",showInRibbon:!1,callback:()=>a(this,null,function*(){return this.ribbonDisplayCommands()})}];this.plugin=t,this.bratCommands.forEach(e=>a(this,null,function*(){this.plugin.addCommand({id:e.id,name:e.name,icon:e.icon,callback:()=>a(this,null,function*(){yield e.callback()})})}))}ribbonDisplayCommands(){return a(this,null,function*(){let t=[];this.bratCommands.forEach(r=>{r.showInRibbon&&t.push({display:r.name,info:r.callback})});let e=new S(this.plugin),n=this.plugin.app.setting,s=Object.values(n.settingTabs).map(r=>({display:"Core: "+r.name,info:()=>a(this,null,function*(){n.open(),n.openTabById(r.id)})})),o=Object.values(n.pluginTabs).map(r=>({display:"Plugin: "+r.name,info:()=>a(this,null,function*(){n.open(),n.openTabById(r.id)})}));t.push({display:"---- Core Plugin Settings ----",info:()=>a(this,null,function*(){yield this.ribbonDisplayCommands()})}),s.forEach(r=>t.push(r)),t.push({display:"---- Plugin Settings ----",info:()=>a(this,null,function*(){yield this.ribbonDisplayCommands()})}),o.forEach(r=>t.push(r)),e.setSuggesterData(t),yield e.display(r=>a(this,null,function*(){return yield r.info()}))})}};var Q=class{constructor(t){this.console=(t,...e)=>{console.log("BRAT: "+t,e)};this.themes={themeseCheckAndUpates:t=>a(this,null,function*(){yield I(this.plugin,t)}),themeInstallTheme:t=>a(this,null,function*(){let e=t.replace("https://github.com/","");yield x(this.plugin,e,!0)}),themesDelete:t=>a(this,null,function*(){let e=t.replace("https://github.com/","");yield ee(this.plugin,e)}),grabCommmunityThemeCssFile:(t,e=!1)=>a(this,null,function*(){return yield L(t,e,this.plugin.settings.debuggingMode)}),grabChecksumOfThemeCssFile:(t,e=!1)=>a(this,null,function*(){return yield R(t,e,this.plugin.settings.debuggingMode)}),grabLastCommitDateForAFile:(t,e)=>a(this,null,function*(){return yield we(t,e)})};this.plugin=t}};var ie=class extends Ye.Plugin{constructor(){super(...arguments);this.appName="Obsidian42 - Beta Reviewer's Auto-update Tool (BRAT)";this.appID="obsidian42-brat"}onload(){return a(this,null,function*(){console.log("loading Obsidian42 - BRAT"),yield this.loadSettings(),this.addSettingTab(new ne(this.app,this)),this.betaPlugins=new U(this),this.commands=new W(this),Ae(),this.settings.ribbonIconEnabled&&this.showRibbonButton(),this.app.workspace.onLayoutReady(()=>{this.settings.updateAtStartup&&setTimeout(()=>a(this,null,function*(){yield this.betaPlugins.checkForUpdatesAndInstallUpdates(!1)}),6e4),this.settings.updateThemesAtStartup&&setTimeout(()=>a(this,null,function*(){yield I(this,!1)}),12e4),setTimeout(()=>a(this,null,function*(){this.bratAPI=new Q(this),globalThis.bratAPI=this.bratAPI}),500)})})}showRibbonButton(){this.ribbonIcon=this.addRibbonIcon("BratIcon","BRAT",()=>a(this,null,function*(){return this.commands.ribbonDisplayCommands()}))}log(e,n=!1){He(this,e,n)}onunload(){console.log("unloading "+this.appName)}loadSettings(){return a(this,null,function*(){this.settings=Object.assign({},ye,yield this.loadData())})}saveSettings(){return a(this,null,function*(){yield this.saveData(this.settings)})}};
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZS9kaXN0L21haW4uanMiLCAiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL3VpL1NldHRpbmdzVGFiLnRzIiwgIi4uL3NyYy9mZWF0dXJlcy90aGVtZXMudHMiLCAiLi4vc3JjL2ZlYXR1cmVzL2dpdGh1YlV0aWxzLnRzIiwgIi4uL3NyYy91aS9zZXR0aW5ncy50cyIsICIuLi9zcmMvdXRpbHMvbm90aWZpY2F0aW9ucy50cyIsICIuLi9zcmMvdXRpbHMvaW50ZXJuZXRjb25uZWN0aW9uLnRzIiwgIi4uL3NyYy91aS9BZGROZXdUaGVtZS50cyIsICIuLi9zcmMvdWkvUHJvbW90aW9uYWwudHMiLCAiLi4vc3JjL3VpL0FkZE5ld1BsdWdpbk1vZGFsLnRzIiwgIi4uL3NyYy9mZWF0dXJlcy9CZXRhUGx1Z2lucy50cyIsICIuLi9zcmMvdWkvaWNvbnMudHMiLCAiLi4vc3JjL3V0aWxzL2xvZ2dpbmcudHMiLCAiLi4vc3JjL3VpL0dlbmVyaWNGdXp6eVN1Z2dlc3Rlci50cyIsICIuLi9zcmMvdWkvUGx1Z2luQ29tbWFuZHMudHMiLCAiLi4vc3JjL3V0aWxzL0JyYXRBUEkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxudmFyIG9ic2lkaWFuID0gcmVxdWlyZSgnb2JzaWRpYW4nKTtcblxuY29uc3QgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWS1NTS1ERFwiO1xuY29uc3QgREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQgPSBcImdnZ2ctW1ddd3dcIjtcbmNvbnN0IERFRkFVTFRfTU9OVEhMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWS1NTVwiO1xuY29uc3QgREVGQVVMVF9RVUFSVEVSTFlfTk9URV9GT1JNQVQgPSBcIllZWVktW1FdUVwiO1xuY29uc3QgREVGQVVMVF9ZRUFSTFlfTk9URV9GT1JNQVQgPSBcIllZWVlcIjtcblxuZnVuY3Rpb24gc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKHBlcmlvZGljaXR5KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gd2luZG93LmFwcC5wbHVnaW5zLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpO1xuICAgIHJldHVybiBwZXJpb2RpY05vdGVzICYmIHBlcmlvZGljTm90ZXMuc2V0dGluZ3M/LltwZXJpb2RpY2l0eV0/LmVuYWJsZWQ7XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgZGFpbHktbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldERhaWx5Tm90ZVNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHsgaW50ZXJuYWxQbHVnaW5zLCBwbHVnaW5zIH0gPSB3aW5kb3cuYXBwO1xuICAgICAgICBpZiAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwiZGFpbHlcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9ybWF0LCBmb2xkZXIsIHRlbXBsYXRlIH0gPSBwbHVnaW5zLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8uZGFpbHkgfHwge307XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogZm9ybWF0IHx8IERFRkFVTFRfREFJTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICAgICAgZm9sZGVyOiBmb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgZm9sZGVyLCBmb3JtYXQsIHRlbXBsYXRlIH0gPSBpbnRlcm5hbFBsdWdpbnMuZ2V0UGx1Z2luQnlJZChcImRhaWx5LW5vdGVzXCIpPy5pbnN0YW5jZT8ub3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogZm9ybWF0IHx8IERFRkFVTFRfREFJTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IGZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGN1c3RvbSBkYWlseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGB3ZWVrbHktbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldFdlZWtseU5vdGVTZXR0aW5ncygpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBjb25zdCBwbHVnaW5NYW5hZ2VyID0gd2luZG93LmFwcC5wbHVnaW5zO1xuICAgICAgICBjb25zdCBjYWxlbmRhclNldHRpbmdzID0gcGx1Z2luTWFuYWdlci5nZXRQbHVnaW4oXCJjYWxlbmRhclwiKT8ub3B0aW9ucztcbiAgICAgICAgY29uc3QgcGVyaW9kaWNOb3Rlc1NldHRpbmdzID0gcGx1Z2luTWFuYWdlci5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKT8uc2V0dGluZ3M/LndlZWtseTtcbiAgICAgICAgaWYgKHNob3VsZFVzZVBlcmlvZGljTm90ZXNTZXR0aW5ncyhcIndlZWtseVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHBlcmlvZGljTm90ZXNTZXR0aW5ncy5mb3JtYXQgfHwgREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICAgICAgZm9sZGVyOiBwZXJpb2RpY05vdGVzU2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogcGVyaW9kaWNOb3Rlc1NldHRpbmdzLnRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBjYWxlbmRhclNldHRpbmdzIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiBzZXR0aW5ncy53ZWVrbHlOb3RlRm9ybWF0IHx8IERFRkFVTFRfV0VFS0xZX05PVEVfRk9STUFULFxuICAgICAgICAgICAgZm9sZGVyOiBzZXR0aW5ncy53ZWVrbHlOb3RlRm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy53ZWVrbHlOb3RlVGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGN1c3RvbSB3ZWVrbHkgbm90ZSBzZXR0aW5ncyBmb3VuZCFcIiwgZXJyKTtcbiAgICB9XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgcGVyaW9kaWMtbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldE1vbnRobHlOb3RlU2V0dGluZ3MoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwbHVnaW5NYW5hZ2VyID0gd2luZG93LmFwcC5wbHVnaW5zO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gKHNob3VsZFVzZVBlcmlvZGljTm90ZXNTZXR0aW5ncyhcIm1vbnRobHlcIikgJiZcbiAgICAgICAgICAgIHBsdWdpbk1hbmFnZXIuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy5tb250aGx5KSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IHNldHRpbmdzLmZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogc2V0dGluZ3MudGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGN1c3RvbSBtb250aGx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuLyoqXG4gKiBSZWFkIHRoZSB1c2VyIHNldHRpbmdzIGZvciB0aGUgYHBlcmlvZGljLW5vdGVzYCBwbHVnaW5cbiAqIHRvIGtlZXAgYmVoYXZpb3Igb2YgY3JlYXRpbmcgYSBuZXcgbm90ZSBpbi1zeW5jLlxuICovXG5mdW5jdGlvbiBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwbHVnaW5NYW5hZ2VyID0gd2luZG93LmFwcC5wbHVnaW5zO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gKHNob3VsZFVzZVBlcmlvZGljTm90ZXNTZXR0aW5ncyhcInF1YXJ0ZXJseVwiKSAmJlxuICAgICAgICAgICAgcGx1Z2luTWFuYWdlci5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKT8uc2V0dGluZ3M/LnF1YXJ0ZXJseSkgfHxcbiAgICAgICAgICAgIHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiBzZXR0aW5ncy5mb3JtYXQgfHwgREVGQVVMVF9RVUFSVEVSTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IHNldHRpbmdzLmZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogc2V0dGluZ3MudGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGN1c3RvbSBxdWFydGVybHkgbm90ZSBzZXR0aW5ncyBmb3VuZCFcIiwgZXJyKTtcbiAgICB9XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgcGVyaW9kaWMtbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldFllYXJseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwieWVhcmx5XCIpICYmXG4gICAgICAgICAgICBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ueWVhcmx5KSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1lFQVJMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogc2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy50ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHllYXJseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cblxuLy8gQ3JlZGl0OiBAY3JlYXRpb25peC9wYXRoLmpzXG5mdW5jdGlvbiBqb2luKC4uLnBhcnRTZWdtZW50cykge1xuICAgIC8vIFNwbGl0IHRoZSBpbnB1dHMgaW50byBhIGxpc3Qgb2YgcGF0aCBjb21tYW5kcy5cbiAgICBsZXQgcGFydHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHBhcnRTZWdtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgcGFydHMgPSBwYXJ0cy5jb25jYXQocGFydFNlZ21lbnRzW2ldLnNwbGl0KFwiL1wiKSk7XG4gICAgfVxuICAgIC8vIEludGVycHJldCB0aGUgcGF0aCBjb21tYW5kcyB0byBnZXQgdGhlIG5ldyByZXNvbHZlZCBwYXRoLlxuICAgIGNvbnN0IG5ld1BhcnRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAvLyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlc1xuICAgICAgICAvLyBBbHNvIHJlbW92ZSBcIi5cIiBzZWdtZW50c1xuICAgICAgICBpZiAoIXBhcnQgfHwgcGFydCA9PT0gXCIuXCIpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgLy8gUHVzaCBuZXcgcGF0aCBzZWdtZW50cy5cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbmV3UGFydHMucHVzaChwYXJ0KTtcbiAgICB9XG4gICAgLy8gUHJlc2VydmUgdGhlIGluaXRpYWwgc2xhc2ggaWYgdGhlcmUgd2FzIG9uZS5cbiAgICBpZiAocGFydHNbMF0gPT09IFwiXCIpXG4gICAgICAgIG5ld1BhcnRzLnVuc2hpZnQoXCJcIik7XG4gICAgLy8gVHVybiBiYWNrIGludG8gYSBzaW5nbGUgc3RyaW5nIHBhdGguXG4gICAgcmV0dXJuIG5ld1BhcnRzLmpvaW4oXCIvXCIpO1xufVxuZnVuY3Rpb24gYmFzZW5hbWUoZnVsbFBhdGgpIHtcbiAgICBsZXQgYmFzZSA9IGZ1bGxQYXRoLnN1YnN0cmluZyhmdWxsUGF0aC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcbiAgICBpZiAoYmFzZS5sYXN0SW5kZXhPZihcIi5cIikgIT0gLTEpXG4gICAgICAgIGJhc2UgPSBiYXNlLnN1YnN0cmluZygwLCBiYXNlLmxhc3RJbmRleE9mKFwiLlwiKSk7XG4gICAgcmV0dXJuIGJhc2U7XG59XG5hc3luYyBmdW5jdGlvbiBlbnN1cmVGb2xkZXJFeGlzdHMocGF0aCkge1xuICAgIGNvbnN0IGRpcnMgPSBwYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpLnNwbGl0KFwiL1wiKTtcbiAgICBkaXJzLnBvcCgpOyAvLyByZW1vdmUgYmFzZW5hbWVcbiAgICBpZiAoZGlycy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGlyID0gam9pbiguLi5kaXJzKTtcbiAgICAgICAgaWYgKCF3aW5kb3cuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChkaXIpKSB7XG4gICAgICAgICAgICBhd2FpdCB3aW5kb3cuYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihkaXIpO1xuICAgICAgICB9XG4gICAgfVxufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Tm90ZVBhdGgoZGlyZWN0b3J5LCBmaWxlbmFtZSkge1xuICAgIGlmICghZmlsZW5hbWUuZW5kc1dpdGgoXCIubWRcIikpIHtcbiAgICAgICAgZmlsZW5hbWUgKz0gXCIubWRcIjtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoam9pbihkaXJlY3RvcnksIGZpbGVuYW1lKSk7XG4gICAgYXdhaXQgZW5zdXJlRm9sZGVyRXhpc3RzKHBhdGgpO1xuICAgIHJldHVybiBwYXRoO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKSB7XG4gICAgY29uc3QgeyBtZXRhZGF0YUNhY2hlLCB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBvYnNpZGlhbi5ub3JtYWxpemVQYXRoKHRlbXBsYXRlKTtcbiAgICBpZiAodGVtcGxhdGVQYXRoID09PSBcIi9cIikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtcIlwiLCBudWxsXSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlRmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QodGVtcGxhdGVQYXRoLCBcIlwiKTtcbiAgICAgICAgY29uc3QgY29udGVudHMgPSBhd2FpdCB2YXVsdC5jYWNoZWRSZWFkKHRlbXBsYXRlRmlsZSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IElGb2xkSW5mbyA9IHdpbmRvdy5hcHAuZm9sZE1hbmFnZXIubG9hZCh0ZW1wbGF0ZUZpbGUpO1xuICAgICAgICByZXR1cm4gW2NvbnRlbnRzLCBJRm9sZEluZm9dO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byByZWFkIHRoZSBkYWlseSBub3RlIHRlbXBsYXRlICcke3RlbXBsYXRlUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIkZhaWxlZCB0byByZWFkIHRoZSBkYWlseSBub3RlIHRlbXBsYXRlXCIpO1xuICAgICAgICByZXR1cm4gW1wiXCIsIG51bGxdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBkYXRlVUlEIGlzIGEgd2F5IG9mIHdlZWtseSBpZGVudGlmeWluZyBkYWlseS93ZWVrbHkvbW9udGhseSBub3Rlcy5cbiAqIFRoZXkgYXJlIHByZWZpeGVkIHdpdGggdGhlIGdyYW51bGFyaXR5IHRvIGF2b2lkIGFtYmlndWl0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RGF0ZVVJRChkYXRlLCBncmFudWxhcml0eSA9IFwiZGF5XCIpIHtcbiAgICBjb25zdCB0cyA9IGRhdGUuY2xvbmUoKS5zdGFydE9mKGdyYW51bGFyaXR5KS5mb3JtYXQoKTtcbiAgICByZXR1cm4gYCR7Z3JhbnVsYXJpdHl9LSR7dHN9YDtcbn1cbmZ1bmN0aW9uIHJlbW92ZUVzY2FwZWRDaGFyYWN0ZXJzKGZvcm1hdCkge1xuICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgvXFxbW15cXF1dKlxcXS9nLCBcIlwiKTsgLy8gcmVtb3ZlIGV2ZXJ5dGhpbmcgd2l0aGluIGJyYWNrZXRzXG59XG4vKipcbiAqIFhYWDogV2hlbiBwYXJzaW5nIGRhdGVzIHRoYXQgY29udGFpbiBib3RoIHdlZWsgbnVtYmVycyBhbmQgbW9udGhzLFxuICogTW9tZW50IGNob3NlcyB0byBpZ25vcmUgdGhlIHdlZWsgbnVtYmVycy4gRm9yIHRoZSB3ZWVrIGRhdGVVSUQsIHdlXG4gKiB3YW50IHRoZSBvcHBvc2l0ZSBiZWhhdmlvci4gU3RyaXAgdGhlIE1NTSBmcm9tIHRoZSBmb3JtYXQgdG8gcGF0Y2guXG4gKi9cbmZ1bmN0aW9uIGlzRm9ybWF0QW1iaWd1b3VzKGZvcm1hdCwgZ3JhbnVsYXJpdHkpIHtcbiAgICBpZiAoZ3JhbnVsYXJpdHkgPT09IFwid2Vla1wiKSB7XG4gICAgICAgIGNvbnN0IGNsZWFuRm9ybWF0ID0gcmVtb3ZlRXNjYXBlZENoYXJhY3RlcnMoZm9ybWF0KTtcbiAgICAgICAgcmV0dXJuICgvd3sxLDJ9L2kudGVzdChjbGVhbkZvcm1hdCkgJiZcbiAgICAgICAgICAgICgvTXsxLDR9Ly50ZXN0KGNsZWFuRm9ybWF0KSB8fCAvRHsxLDR9Ly50ZXN0KGNsZWFuRm9ybWF0KSkpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZXREYXRlRnJvbUZpbGUoZmlsZSwgZ3JhbnVsYXJpdHkpIHtcbiAgICByZXR1cm4gZ2V0RGF0ZUZyb21GaWxlbmFtZShmaWxlLmJhc2VuYW1lLCBncmFudWxhcml0eSk7XG59XG5mdW5jdGlvbiBnZXREYXRlRnJvbVBhdGgocGF0aCwgZ3JhbnVsYXJpdHkpIHtcbiAgICByZXR1cm4gZ2V0RGF0ZUZyb21GaWxlbmFtZShiYXNlbmFtZShwYXRoKSwgZ3JhbnVsYXJpdHkpO1xufVxuZnVuY3Rpb24gZ2V0RGF0ZUZyb21GaWxlbmFtZShmaWxlbmFtZSwgZ3JhbnVsYXJpdHkpIHtcbiAgICBjb25zdCBnZXRTZXR0aW5ncyA9IHtcbiAgICAgICAgZGF5OiBnZXREYWlseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgd2VlazogZ2V0V2Vla2x5Tm90ZVNldHRpbmdzLFxuICAgICAgICBtb250aDogZ2V0TW9udGhseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgcXVhcnRlcjogZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzLFxuICAgICAgICB5ZWFyOiBnZXRZZWFybHlOb3RlU2V0dGluZ3MsXG4gICAgfTtcbiAgICBjb25zdCBmb3JtYXQgPSBnZXRTZXR0aW5nc1tncmFudWxhcml0eV0oKS5mb3JtYXQuc3BsaXQoXCIvXCIpLnBvcCgpO1xuICAgIGNvbnN0IG5vdGVEYXRlID0gd2luZG93Lm1vbWVudChmaWxlbmFtZSwgZm9ybWF0LCB0cnVlKTtcbiAgICBpZiAoIW5vdGVEYXRlLmlzVmFsaWQoKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGlzRm9ybWF0QW1iaWd1b3VzKGZvcm1hdCwgZ3JhbnVsYXJpdHkpKSB7XG4gICAgICAgIGlmIChncmFudWxhcml0eSA9PT0gXCJ3ZWVrXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFuRm9ybWF0ID0gcmVtb3ZlRXNjYXBlZENoYXJhY3RlcnMoZm9ybWF0KTtcbiAgICAgICAgICAgIGlmICgvd3sxLDJ9L2kudGVzdChjbGVhbkZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93Lm1vbWVudChmaWxlbmFtZSwgXG4gICAgICAgICAgICAgICAgLy8gSWYgZm9ybWF0IGNvbnRhaW5zIHdlZWssIHJlbW92ZSBkYXkgJiBtb250aCBmb3JtYXR0aW5nXG4gICAgICAgICAgICAgICAgZm9ybWF0LnJlcGxhY2UoL017MSw0fS9nLCBcIlwiKS5yZXBsYWNlKC9EezEsNH0vZywgXCJcIiksIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm90ZURhdGU7XG59XG5cbmNsYXNzIERhaWx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGFpbHktbm90ZXMgcGx1Z2luXG4gKiBzbyBpdCB3aWxsIHJlcGxhY2Uge3tkYXRlfX0sIHt7dGl0bGV9fSwgYW5kIHt7dGltZX19IHdpdGggdGhlXG4gKiBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICpcbiAqIE5vdGU6IGl0IGhhcyBhbiBhZGRlZCBib251cyB0aGF0IGl0J3Mgbm90ICd0b2RheScgc3BlY2lmaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURhaWx5Tm90ZShkYXRlKSB7XG4gICAgY29uc3QgYXBwID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSBhcHA7XG4gICAgY29uc3QgbW9tZW50ID0gd2luZG93Lm1vbWVudDtcbiAgICBjb25zdCB7IHRlbXBsYXRlLCBmb3JtYXQsIGZvbGRlciB9ID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccypkYXRlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aW1lXFxzKn19L2dpLCBtb21lbnQoKS5mb3JtYXQoXCJISDptbVwiKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqKGRhdGV8dGltZSlcXHMqKChbKy1dXFxkKykoW3lxbXdkaHNdKSk/XFxzKig6Lis/KT99fS9naSwgKF8sIF90aW1lT3JEYXRlLCBjYWxjLCB0aW1lRGVsdGEsIHVuaXQsIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gbW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp5ZXN0ZXJkYXlcXHMqfX0vZ2ksIGRhdGUuY2xvbmUoKS5zdWJ0cmFjdCgxLCBcImRheVwiKS5mb3JtYXQoZm9ybWF0KSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0b21vcnJvd1xccyp9fS9naSwgZGF0ZS5jbG9uZSgpLmFkZCgxLCBcImRcIikuZm9ybWF0KGZvcm1hdCkpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgYXBwLmZvbGRNYW5hZ2VyLnNhdmUoY3JlYXRlZEZpbGUsIElGb2xkSW5mbyk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke25vcm1hbGl6ZWRQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0RGFpbHlOb3RlKGRhdGUsIGRhaWx5Tm90ZXMpIHtcbiAgICByZXR1cm4gZGFpbHlOb3Rlc1tnZXREYXRlVUlEKGRhdGUsIFwiZGF5XCIpXSA/PyBudWxsO1xufVxuZnVuY3Rpb24gZ2V0QWxsRGFpbHlOb3RlcygpIHtcbiAgICAvKipcbiAgICAgKiBGaW5kIGFsbCBkYWlseSBub3RlcyBpbiB0aGUgZGFpbHkgbm90ZSBmb2xkZXJcbiAgICAgKi9cbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgZm9sZGVyIH0gPSBnZXREYWlseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IGRhaWx5Tm90ZXNGb2xkZXIgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgob2JzaWRpYW4ubm9ybWFsaXplUGF0aChmb2xkZXIpKTtcbiAgICBpZiAoIWRhaWx5Tm90ZXNGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IERhaWx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBkYWlseSBub3RlcyBmb2xkZXJcIik7XG4gICAgfVxuICAgIGNvbnN0IGRhaWx5Tm90ZXMgPSB7fTtcbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4oZGFpbHlOb3Rlc0ZvbGRlciwgKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKG5vdGUgaW5zdGFuY2VvZiBvYnNpZGlhbi5URmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IGdldERhdGVGcm9tRmlsZShub3RlLCBcImRheVwiKTtcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVN0cmluZyA9IGdldERhdGVVSUQoZGF0ZSwgXCJkYXlcIik7XG4gICAgICAgICAgICAgICAgZGFpbHlOb3Rlc1tkYXRlU3RyaW5nXSA9IG5vdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGFpbHlOb3Rlcztcbn1cblxuY2xhc3MgV2Vla2x5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG5mdW5jdGlvbiBnZXREYXlzT2ZXZWVrKCkge1xuICAgIGNvbnN0IHsgbW9tZW50IH0gPSB3aW5kb3c7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBsZXQgd2Vla1N0YXJ0ID0gbW9tZW50LmxvY2FsZURhdGEoKS5fd2Vlay5kb3c7XG4gICAgY29uc3QgZGF5c09mV2VlayA9IFtcbiAgICAgICAgXCJzdW5kYXlcIixcbiAgICAgICAgXCJtb25kYXlcIixcbiAgICAgICAgXCJ0dWVzZGF5XCIsXG4gICAgICAgIFwid2VkbmVzZGF5XCIsXG4gICAgICAgIFwidGh1cnNkYXlcIixcbiAgICAgICAgXCJmcmlkYXlcIixcbiAgICAgICAgXCJzYXR1cmRheVwiLFxuICAgIF07XG4gICAgd2hpbGUgKHdlZWtTdGFydCkge1xuICAgICAgICBkYXlzT2ZXZWVrLnB1c2goZGF5c09mV2Vlay5zaGlmdCgpKTtcbiAgICAgICAgd2Vla1N0YXJ0LS07XG4gICAgfVxuICAgIHJldHVybiBkYXlzT2ZXZWVrO1xufVxuZnVuY3Rpb24gZ2V0RGF5T2ZXZWVrTnVtZXJpY2FsVmFsdWUoZGF5T2ZXZWVrTmFtZSkge1xuICAgIHJldHVybiBnZXREYXlzT2ZXZWVrKCkuaW5kZXhPZihkYXlPZldlZWtOYW1lLnRvTG93ZXJDYXNlKCkpO1xufVxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlV2Vla2x5Tm90ZShkYXRlKSB7XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IHRlbXBsYXRlLCBmb3JtYXQsIGZvbGRlciB9ID0gZ2V0V2Vla2x5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgW3RlbXBsYXRlQ29udGVudHMsIElGb2xkSW5mb10gPSBhd2FpdCBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IGF3YWl0IGdldE5vdGVQYXRoKGZvbGRlciwgZmlsZW5hbWUpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlKG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZUNvbnRlbnRzXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqKGRhdGV8dGltZSlcXHMqKChbKy1dXFxkKykoW3lxbXdkaHNdKSk/XFxzKig6Lis/KT99fS9naSwgKF8sIF90aW1lT3JEYXRlLCBjYWxjLCB0aW1lRGVsdGEsIHVuaXQsIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gd2luZG93Lm1vbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBkYXRlLmNsb25lKCkuc2V0KHtcbiAgICAgICAgICAgICAgICBob3VyOiBub3cuZ2V0KFwiaG91clwiKSxcbiAgICAgICAgICAgICAgICBtaW51dGU6IG5vdy5nZXQoXCJtaW51dGVcIiksXG4gICAgICAgICAgICAgICAgc2Vjb25kOiBub3cuZ2V0KFwic2Vjb25kXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY2FsYykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlLmFkZChwYXJzZUludCh0aW1lRGVsdGEsIDEwKSwgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9tZW50Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChtb21lbnRGb3JtYXQuc3Vic3RyaW5nKDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGl0bGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoXCJISDptbVwiKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooc3VuZGF5fG1vbmRheXx0dWVzZGF5fHdlZG5lc2RheXx0aHVyc2RheXxmcmlkYXl8c2F0dXJkYXkpXFxzKjooLio/KX19L2dpLCAoXywgZGF5T2ZXZWVrLCBtb21lbnRGb3JtYXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRheSA9IGdldERheU9mV2Vla051bWVyaWNhbFZhbHVlKGRheU9mV2Vlayk7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS53ZWVrZGF5KGRheSkuZm9ybWF0KG1vbWVudEZvcm1hdC50cmltKCkpO1xuICAgICAgICB9KSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHdpbmRvdy5hcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRXZWVrbHlOb3RlKGRhdGUsIHdlZWtseU5vdGVzKSB7XG4gICAgcmV0dXJuIHdlZWtseU5vdGVzW2dldERhdGVVSUQoZGF0ZSwgXCJ3ZWVrXCIpXSA/PyBudWxsO1xufVxuZnVuY3Rpb24gZ2V0QWxsV2Vla2x5Tm90ZXMoKSB7XG4gICAgY29uc3Qgd2Vla2x5Tm90ZXMgPSB7fTtcbiAgICBpZiAoIWFwcEhhc1dlZWtseU5vdGVzUGx1Z2luTG9hZGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHdlZWtseU5vdGVzO1xuICAgIH1cbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgZm9sZGVyIH0gPSBnZXRXZWVrbHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCB3ZWVrbHlOb3Rlc0ZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICghd2Vla2x5Tm90ZXNGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdlZWtseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKFwiRmFpbGVkIHRvIGZpbmQgd2Vla2x5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgb2JzaWRpYW4uVmF1bHQucmVjdXJzZUNoaWxkcmVuKHdlZWtseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwid2Vla1wiKTtcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVN0cmluZyA9IGdldERhdGVVSUQoZGF0ZSwgXCJ3ZWVrXCIpO1xuICAgICAgICAgICAgICAgIHdlZWtseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB3ZWVrbHlOb3Rlcztcbn1cblxuY2xhc3MgTW9udGhseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRhaWx5LW5vdGVzIHBsdWdpblxuICogc28gaXQgd2lsbCByZXBsYWNlIHt7ZGF0ZX19LCB7e3RpdGxlfX0sIGFuZCB7e3RpbWV9fSB3aXRoIHRoZVxuICogZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqXG4gKiBOb3RlOiBpdCBoYXMgYW4gYWRkZWQgYm9udXMgdGhhdCBpdCdzIG5vdCAndG9kYXknIHNwZWNpZmljLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVNb250aGx5Tm90ZShkYXRlKSB7XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IHRlbXBsYXRlLCBmb3JtYXQsIGZvbGRlciB9ID0gZ2V0TW9udGhseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihkYXRlfHRpbWUpXFxzKigoWystXVxcZCspKFt5cW13ZGhzXSkpP1xccyooOi4rPyk/fX0vZ2ksIChfLCBfdGltZU9yRGF0ZSwgY2FsYywgdGltZURlbHRhLCB1bml0LCBtb21lbnRGb3JtYXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHdpbmRvdy5tb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKmRhdGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoXCJISDptbVwiKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93LmFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldE1vbnRobHlOb3RlKGRhdGUsIG1vbnRobHlOb3Rlcykge1xuICAgIHJldHVybiBtb250aGx5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcIm1vbnRoXCIpXSA/PyBudWxsO1xufVxuZnVuY3Rpb24gZ2V0QWxsTW9udGhseU5vdGVzKCkge1xuICAgIGNvbnN0IG1vbnRobHlOb3RlcyA9IHt9O1xuICAgIGlmICghYXBwSGFzTW9udGhseU5vdGVzUGx1Z2luTG9hZGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIG1vbnRobHlOb3RlcztcbiAgICB9XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IGZvbGRlciB9ID0gZ2V0TW9udGhseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IG1vbnRobHlOb3Rlc0ZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICghbW9udGhseU5vdGVzRm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBNb250aGx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBtb250aGx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgb2JzaWRpYW4uVmF1bHQucmVjdXJzZUNoaWxkcmVuKG1vbnRobHlOb3Rlc0ZvbGRlciwgKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKG5vdGUgaW5zdGFuY2VvZiBvYnNpZGlhbi5URmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IGdldERhdGVGcm9tRmlsZShub3RlLCBcIm1vbnRoXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcIm1vbnRoXCIpO1xuICAgICAgICAgICAgICAgIG1vbnRobHlOb3Rlc1tkYXRlU3RyaW5nXSA9IG5vdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbW9udGhseU5vdGVzO1xufVxuXG5jbGFzcyBRdWFydGVybHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSBkYWlseS1ub3RlcyBwbHVnaW5cbiAqIHNvIGl0IHdpbGwgcmVwbGFjZSB7e2RhdGV9fSwge3t0aXRsZX19LCBhbmQge3t0aW1lfX0gd2l0aCB0aGVcbiAqIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gKlxuICogTm90ZTogaXQgaGFzIGFuIGFkZGVkIGJvbnVzIHRoYXQgaXQncyBub3QgJ3RvZGF5JyBzcGVjaWZpYy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlUXVhcnRlcmx5Tm90ZShkYXRlKSB7XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IHRlbXBsYXRlLCBmb3JtYXQsIGZvbGRlciB9ID0gZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgW3RlbXBsYXRlQ29udGVudHMsIElGb2xkSW5mb10gPSBhd2FpdCBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IGF3YWl0IGdldE5vdGVQYXRoKGZvbGRlciwgZmlsZW5hbWUpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlKG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZUNvbnRlbnRzXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqKGRhdGV8dGltZSlcXHMqKChbKy1dXFxkKykoW3lxbXdkaHNdKSk/XFxzKig6Lis/KT99fS9naSwgKF8sIF90aW1lT3JEYXRlLCBjYWxjLCB0aW1lRGVsdGEsIHVuaXQsIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gd2luZG93Lm1vbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBkYXRlLmNsb25lKCkuc2V0KHtcbiAgICAgICAgICAgICAgICBob3VyOiBub3cuZ2V0KFwiaG91clwiKSxcbiAgICAgICAgICAgICAgICBtaW51dGU6IG5vdy5nZXQoXCJtaW51dGVcIiksXG4gICAgICAgICAgICAgICAgc2Vjb25kOiBub3cuZ2V0KFwic2Vjb25kXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY2FsYykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlLmFkZChwYXJzZUludCh0aW1lRGVsdGEsIDEwKSwgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9tZW50Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChtb21lbnRGb3JtYXQuc3Vic3RyaW5nKDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqZGF0ZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgd2luZG93Lm1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB3aW5kb3cuYXBwLmZvbGRNYW5hZ2VyLnNhdmUoY3JlYXRlZEZpbGUsIElGb2xkSW5mbyk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke25vcm1hbGl6ZWRQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UXVhcnRlcmx5Tm90ZShkYXRlLCBxdWFydGVybHkpIHtcbiAgICByZXR1cm4gcXVhcnRlcmx5W2dldERhdGVVSUQoZGF0ZSwgXCJxdWFydGVyXCIpXSA/PyBudWxsO1xufVxuZnVuY3Rpb24gZ2V0QWxsUXVhcnRlcmx5Tm90ZXMoKSB7XG4gICAgY29uc3QgcXVhcnRlcmx5ID0ge307XG4gICAgaWYgKCFhcHBIYXNRdWFydGVybHlOb3Rlc1BsdWdpbkxvYWRlZCgpKSB7XG4gICAgICAgIHJldHVybiBxdWFydGVybHk7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldFF1YXJ0ZXJseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IHF1YXJ0ZXJseUZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICghcXVhcnRlcmx5Rm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBRdWFydGVybHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIHF1YXJ0ZXJseSBub3RlcyBmb2xkZXJcIik7XG4gICAgfVxuICAgIG9ic2lkaWFuLlZhdWx0LnJlY3Vyc2VDaGlsZHJlbihxdWFydGVybHlGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJxdWFydGVyXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcInF1YXJ0ZXJcIik7XG4gICAgICAgICAgICAgICAgcXVhcnRlcmx5W2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBxdWFydGVybHk7XG59XG5cbmNsYXNzIFllYXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRhaWx5LW5vdGVzIHBsdWdpblxuICogc28gaXQgd2lsbCByZXBsYWNlIHt7ZGF0ZX19LCB7e3RpdGxlfX0sIGFuZCB7e3RpbWV9fSB3aXRoIHRoZVxuICogZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqXG4gKiBOb3RlOiBpdCBoYXMgYW4gYWRkZWQgYm9udXMgdGhhdCBpdCdzIG5vdCAndG9kYXknIHNwZWNpZmljLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVZZWFybHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRZZWFybHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccypkYXRlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aW1lXFxzKn19L2dpLCB3aW5kb3cubW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIikpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGl0bGVcXHMqfX0vZ2ksIGZpbGVuYW1lKSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHdpbmRvdy5hcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRZZWFybHlOb3RlKGRhdGUsIHllYXJseU5vdGVzKSB7XG4gICAgcmV0dXJuIHllYXJseU5vdGVzW2dldERhdGVVSUQoZGF0ZSwgXCJ5ZWFyXCIpXSA/PyBudWxsO1xufVxuZnVuY3Rpb24gZ2V0QWxsWWVhcmx5Tm90ZXMoKSB7XG4gICAgY29uc3QgeWVhcmx5Tm90ZXMgPSB7fTtcbiAgICBpZiAoIWFwcEhhc1llYXJseU5vdGVzUGx1Z2luTG9hZGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHllYXJseU5vdGVzO1xuICAgIH1cbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgZm9sZGVyIH0gPSBnZXRZZWFybHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCB5ZWFybHlOb3Rlc0ZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICgheWVhcmx5Tm90ZXNGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFllYXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKFwiRmFpbGVkIHRvIGZpbmQgeWVhcmx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgb2JzaWRpYW4uVmF1bHQucmVjdXJzZUNoaWxkcmVuKHllYXJseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwieWVhclwiKTtcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVN0cmluZyA9IGdldERhdGVVSUQoZGF0ZSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgICAgIHllYXJseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB5ZWFybHlOb3Rlcztcbn1cblxuZnVuY3Rpb24gYXBwSGFzRGFpbHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgZGFpbHlOb3Rlc1BsdWdpbiA9IGFwcC5pbnRlcm5hbFBsdWdpbnMucGx1Z2luc1tcImRhaWx5LW5vdGVzXCJdO1xuICAgIGlmIChkYWlseU5vdGVzUGx1Z2luICYmIGRhaWx5Tm90ZXNQbHVnaW4uZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8uZGFpbHk/LmVuYWJsZWQ7XG59XG4vKipcbiAqIFhYWDogXCJXZWVrbHkgTm90ZXNcIiBsaXZlIGluIGVpdGhlciB0aGUgQ2FsZW5kYXIgcGx1Z2luIG9yIHRoZSBwZXJpb2RpYy1ub3RlcyBwbHVnaW4uXG4gKiBDaGVjayBib3RoIHVudGlsIHRoZSB3ZWVrbHkgbm90ZXMgZmVhdHVyZSBpcyByZW1vdmVkIGZyb20gdGhlIENhbGVuZGFyIHBsdWdpbi5cbiAqL1xuZnVuY3Rpb24gYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGlmIChhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJjYWxlbmRhclwiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8ud2Vla2x5Py5lbmFibGVkO1xufVxuZnVuY3Rpb24gYXBwSGFzTW9udGhseU5vdGVzUGx1Z2luTG9hZGVkKCkge1xuICAgIGNvbnN0IHsgYXBwIH0gPSB3aW5kb3c7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8ubW9udGhseT8uZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkKCkge1xuICAgIGNvbnN0IHsgYXBwIH0gPSB3aW5kb3c7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBwZXJpb2RpY05vdGVzID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8ucXVhcnRlcmx5Py5lbmFibGVkO1xufVxuZnVuY3Rpb24gYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy55ZWFybHk/LmVuYWJsZWQ7XG59XG5mdW5jdGlvbiBnZXRQZXJpb2RpY05vdGVTZXR0aW5ncyhncmFudWxhcml0eSkge1xuICAgIGNvbnN0IGdldFNldHRpbmdzID0ge1xuICAgICAgICBkYXk6IGdldERhaWx5Tm90ZVNldHRpbmdzLFxuICAgICAgICB3ZWVrOiBnZXRXZWVrbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIG1vbnRoOiBnZXRNb250aGx5Tm90ZVNldHRpbmdzLFxuICAgICAgICBxdWFydGVyOiBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHllYXI6IGdldFllYXJseU5vdGVTZXR0aW5ncyxcbiAgICB9W2dyYW51bGFyaXR5XTtcbiAgICByZXR1cm4gZ2V0U2V0dGluZ3MoKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBlcmlvZGljTm90ZShncmFudWxhcml0eSwgZGF0ZSkge1xuICAgIGNvbnN0IGNyZWF0ZUZuID0ge1xuICAgICAgICBkYXk6IGNyZWF0ZURhaWx5Tm90ZSxcbiAgICAgICAgbW9udGg6IGNyZWF0ZU1vbnRobHlOb3RlLFxuICAgICAgICB3ZWVrOiBjcmVhdGVXZWVrbHlOb3RlLFxuICAgIH07XG4gICAgcmV0dXJuIGNyZWF0ZUZuW2dyYW51bGFyaXR5XShkYXRlKTtcbn1cblxuZXhwb3J0cy5ERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUID0gREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVDtcbmV4cG9ydHMuREVGQVVMVF9NT05USExZX05PVEVfRk9STUFUID0gREVGQVVMVF9NT05USExZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5ERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCA9IERFRkFVTFRfUVVBUlRFUkxZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5ERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCA9IERFRkFVTFRfV0VFS0xZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5ERUZBVUxUX1lFQVJMWV9OT1RFX0ZPUk1BVCA9IERFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5hcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzRGFpbHlOb3Rlc1BsdWdpbkxvYWRlZDtcbmV4cG9ydHMuYXBwSGFzTW9udGhseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzTW9udGhseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5hcHBIYXNRdWFydGVybHlOb3Rlc1BsdWdpbkxvYWRlZCA9IGFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5hcHBIYXNXZWVrbHlOb3Rlc1BsdWdpbkxvYWRlZCA9IGFwcEhhc1dlZWtseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5hcHBIYXNZZWFybHlOb3Rlc1BsdWdpbkxvYWRlZCA9IGFwcEhhc1llYXJseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5jcmVhdGVEYWlseU5vdGUgPSBjcmVhdGVEYWlseU5vdGU7XG5leHBvcnRzLmNyZWF0ZU1vbnRobHlOb3RlID0gY3JlYXRlTW9udGhseU5vdGU7XG5leHBvcnRzLmNyZWF0ZVBlcmlvZGljTm90ZSA9IGNyZWF0ZVBlcmlvZGljTm90ZTtcbmV4cG9ydHMuY3JlYXRlUXVhcnRlcmx5Tm90ZSA9IGNyZWF0ZVF1YXJ0ZXJseU5vdGU7XG5leHBvcnRzLmNyZWF0ZVdlZWtseU5vdGUgPSBjcmVhdGVXZWVrbHlOb3RlO1xuZXhwb3J0cy5jcmVhdGVZZWFybHlOb3RlID0gY3JlYXRlWWVhcmx5Tm90ZTtcbmV4cG9ydHMuZ2V0QWxsRGFpbHlOb3RlcyA9IGdldEFsbERhaWx5Tm90ZXM7XG5leHBvcnRzLmdldEFsbE1vbnRobHlOb3RlcyA9IGdldEFsbE1vbnRobHlOb3RlcztcbmV4cG9ydHMuZ2V0QWxsUXVhcnRlcmx5Tm90ZXMgPSBnZXRBbGxRdWFydGVybHlOb3RlcztcbmV4cG9ydHMuZ2V0QWxsV2Vla2x5Tm90ZXMgPSBnZXRBbGxXZWVrbHlOb3RlcztcbmV4cG9ydHMuZ2V0QWxsWWVhcmx5Tm90ZXMgPSBnZXRBbGxZZWFybHlOb3RlcztcbmV4cG9ydHMuZ2V0RGFpbHlOb3RlID0gZ2V0RGFpbHlOb3RlO1xuZXhwb3J0cy5nZXREYWlseU5vdGVTZXR0aW5ncyA9IGdldERhaWx5Tm90ZVNldHRpbmdzO1xuZXhwb3J0cy5nZXREYXRlRnJvbUZpbGUgPSBnZXREYXRlRnJvbUZpbGU7XG5leHBvcnRzLmdldERhdGVGcm9tUGF0aCA9IGdldERhdGVGcm9tUGF0aDtcbmV4cG9ydHMuZ2V0RGF0ZVVJRCA9IGdldERhdGVVSUQ7XG5leHBvcnRzLmdldE1vbnRobHlOb3RlID0gZ2V0TW9udGhseU5vdGU7XG5leHBvcnRzLmdldE1vbnRobHlOb3RlU2V0dGluZ3MgPSBnZXRNb250aGx5Tm90ZVNldHRpbmdzO1xuZXhwb3J0cy5nZXRQZXJpb2RpY05vdGVTZXR0aW5ncyA9IGdldFBlcmlvZGljTm90ZVNldHRpbmdzO1xuZXhwb3J0cy5nZXRRdWFydGVybHlOb3RlID0gZ2V0UXVhcnRlcmx5Tm90ZTtcbmV4cG9ydHMuZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzID0gZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzO1xuZXhwb3J0cy5nZXRUZW1wbGF0ZUluZm8gPSBnZXRUZW1wbGF0ZUluZm87XG5leHBvcnRzLmdldFdlZWtseU5vdGUgPSBnZXRXZWVrbHlOb3RlO1xuZXhwb3J0cy5nZXRXZWVrbHlOb3RlU2V0dGluZ3MgPSBnZXRXZWVrbHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFllYXJseU5vdGUgPSBnZXRZZWFybHlOb3RlO1xuZXhwb3J0cy5nZXRZZWFybHlOb3RlU2V0dGluZ3MgPSBnZXRZZWFybHlOb3RlU2V0dGluZ3M7XG4iLCAiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBCcmF0U2V0dGluZ3NUYWIgfSBmcm9tIFwiLi91aS9TZXR0aW5nc1RhYlwiO1xuaW1wb3J0IHsgU2V0dGluZ3MsIERFRkFVTFRfU0VUVElOR1MgfSBmcm9tIFwiLi91aS9zZXR0aW5nc1wiO1xuaW1wb3J0IEJldGFQbHVnaW5zIGZyb20gXCIuL2ZlYXR1cmVzL0JldGFQbHVnaW5zXCI7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gXCIuL3VpL2ljb25zXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi91dGlscy9sb2dnaW5nXCI7XG5pbXBvcnQgUGx1Z2luQ29tbWFuZHMgZnJvbSBcIi4vdWkvUGx1Z2luQ29tbWFuZHNcIjtcbmltcG9ydCB7IHRoZW1lc0NoZWNrQW5kVXBkYXRlcyB9IGZyb20gXCIuL2ZlYXR1cmVzL3RoZW1lc1wiO1xuaW1wb3J0IEJyYXRBUEkgZnJvbSBcIi4vdXRpbHMvQnJhdEFQSVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuXHRhcHBOYW1lID0gXCJPYnNpZGlhbjQyIC0gQmV0YSBSZXZpZXdlcidzIEF1dG8tdXBkYXRlIFRvb2wgKEJSQVQpXCI7XG5cdGFwcElEID0gXCJvYnNpZGlhbjQyLWJyYXRcIjtcblx0c2V0dGluZ3M6IFNldHRpbmdzO1xuXHRiZXRhUGx1Z2luczogQmV0YVBsdWdpbnM7XG5cdHJpYmJvbkljb246IEhUTUxFbGVtZW50O1xuXHRjb21tYW5kczogUGx1Z2luQ29tbWFuZHM7XG5cdGJyYXRBUEk6IEJyYXRBUElcblxuXHRhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc29sZS5sb2coXCJsb2FkaW5nIE9ic2lkaWFuNDIgLSBCUkFUXCIpO1x0XHRcblxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBCcmF0U2V0dGluZ3NUYWIodGhpcy5hcHAsIHRoaXMpKTtcblxuXHRcdHRoaXMuYmV0YVBsdWdpbnMgPSBuZXcgQmV0YVBsdWdpbnModGhpcyk7XG5cdFx0dGhpcy5jb21tYW5kcyA9IG5ldyBQbHVnaW5Db21tYW5kcyh0aGlzKTtcblxuXHRcdGFkZEljb25zKCk7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MucmliYm9uSWNvbkVuYWJsZWQpIHRoaXMuc2hvd1JpYmJvbkJ1dHRvbigpO1xuXG5cdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCk6IHZvaWQgPT4geyAvLyBsZXQgb2JzaWRpYW4gbG9hZCBhbmQgY2FsbSBkb3duIGJlZm9yZSBjaGVja1xuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MudXBkYXRlQXRTdGFydHVwKSB7IFxuXHRcdFx0XHRzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJldGFQbHVnaW5zLmNoZWNrRm9yVXBkYXRlc0FuZEluc3RhbGxVcGRhdGVzKGZhbHNlKVxuXHRcdFx0XHR9LCA2MDAwMCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy51cGRhdGVUaGVtZXNBdFN0YXJ0dXApIHsgXG5cdFx0XHRcdHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoZW1lc0NoZWNrQW5kVXBkYXRlcyh0aGlzLCBmYWxzZSk7XG5cdFx0XHRcdH0sIDEyMDAwMCk7XG5cdFx0XHR9XG5cdFx0XHRzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcblx0XHRcdFx0dGhpcy5icmF0QVBJID0gbmV3IEJyYXRBUEkodGhpcyk7XG5cdFx0XHRcdGdsb2JhbFRoaXMuYnJhdEFQSSA9IHRoaXMuYnJhdEFQSTtcblx0XHRcdH0sIDUwMCk7XG5cdFx0fSk7XG5cdH1cblxuXHRzaG93UmliYm9uQnV0dG9uKCk6IHZvaWQgeyB0aGlzLnJpYmJvbkljb24gPSB0aGlzLmFkZFJpYmJvbkljb24oXCJCcmF0SWNvblwiLCBcIkJSQVRcIiwgYXN5bmMgKCkgPT4gdGhpcy5jb21tYW5kcy5yaWJib25EaXNwbGF5Q29tbWFuZHMoKSkgfVxuXG5cdGxvZyh0ZXh0VG9Mb2c6IHN0cmluZywgdmVyYm9zZSA9IGZhbHNlKTogdm9pZCB7IGxvZ2dlcih0aGlzLCB0ZXh0VG9Mb2csIHZlcmJvc2UpIH1cblx0XG5cdG9udW5sb2FkKCk6IHZvaWQgeyBjb25zb2xlLmxvZyhcInVubG9hZGluZyBcIiArIHRoaXMuYXBwTmFtZSkgfVxuXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHsgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSkgfVxuXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHsgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKSB9XG59IiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgVG9nZ2xlQ29tcG9uZW50LCBCdXR0b25Db21wb25lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyB0aGVtZURlbGV0ZSB9IGZyb20gJy4uL2ZlYXR1cmVzL3RoZW1lcyc7XG5pbXBvcnQgVGhlUGx1Z2luIGZyb20gJy4uL21haW4nO1xuaW1wb3J0IEFkZE5ld1RoZW1lIGZyb20gJy4vQWRkTmV3VGhlbWUnO1xuaW1wb3J0IHsgcHJvbW90aW9uYWxMaW5rcyB9IGZyb20gJy4vUHJvbW90aW9uYWwnO1xuXG5leHBvcnQgY2xhc3MgQnJhdFNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG5cdHBsdWdpbjogVGhlUGx1Z2luO1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFRoZVBsdWdpbikge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuXG5cdFx0cHJvbW90aW9uYWxMaW5rcyhjb250YWluZXJFbCwgdHJ1ZSlcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMScsIHsgdGV4dDogdGhpcy5wbHVnaW4uYXBwTmFtZSB9KSBcblx0XHQvLyAuc3R5bGUubWFyZ2luVG9wID0gXCI1MHB4XCI7XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiBcImJ5IFRmVEhhY2tlclwiIH0pIFxuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnQXV0by11cGRhdGUgcGx1Z2lucyBhdCBzdGFydHVwJylcblx0XHRcdC5zZXREZXNjKCdJZiBlbmFibGVkIGFsbCBiZXRhIHBsdWdpbnMgd2lsbCBiZSBjaGVja2VkIGZvciB1cGRhdGVzIGVhY2ggdGltZSBPYnNpZGlhbiBzdGFydHMuIE5vdGU6IHRoaXMgZG9lcyBub3QgdXBkYXRlIGZyb3plbiB2ZXJzaW9uIHBsdWdpbnMuJylcblx0XHRcdC5hZGRUb2dnbGUoKGNiOiBUb2dnbGVDb21wb25lbnQpID0+IHtcblx0XHRcdFx0Y2Iuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXBkYXRlQXRTdGFydHVwKTtcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXBkYXRlQXRTdGFydHVwID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0F1dG8tdXBkYXRlIHRoZW1lcyBhdCBzdGFydHVwJylcblx0XHRcdC5zZXREZXNjKCdJZiBlbmFibGVkIGFsbCBiZXRhIHRoZW1lcyB3aWxsIGJlIGNoZWNrZWQgZm9yIHVwZGF0ZXMgZWFjaCB0aW1lIE9ic2lkaWFuIHN0YXJ0cy4nKVxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xuXHRcdFx0XHRjYi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51cGRhdGVUaGVtZXNBdFN0YXJ0dXApO1xuXHRcdFx0XHRjYi5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51cGRhdGVUaGVtZXNBdFN0YXJ0dXAgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdSaWJib24gQnV0dG9uJylcblx0XHRcdC5zZXREZXNjKCdUb2dnbGUgcmliYm9uIGJ1dHRvbiBvZmYgYW5kIG9uLicpXG5cdFx0XHQuYWRkVG9nZ2xlKChjYjogVG9nZ2xlQ29tcG9uZW50KSA9PiB7XG5cdFx0XHRcdGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnJpYmJvbkljb25FbmFibGVkKTtcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucmliYm9uSWNvbkVuYWJsZWQgPSB2YWx1ZTtcblx0XHRcdFx0XHRpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MucmliYm9uSWNvbkVuYWJsZWQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4ucmliYm9uSWNvbi5yZW1vdmUoKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zaG93UmliYm9uQnV0dG9uKCk7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcdFx0XHRcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaHJcIik7XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiQmV0YSBQbHVnaW4gTGlzdFwiIH0pO1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiZGl2XCIsIHsgdGV4dDogYFRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIGJldGEgcGx1Z2lucyBhZGRlZCB2aWEgdGhlIGNvbW1hbmQgcGFsZXR0ZSBcIkFkZCBhIGJldGEgcGx1Z2luIGZvciB0ZXN0aW5nXCIgb3IgXCJBZGQgYSBiZXRhIHBsdWdpbiB3aXRoIGZyb3plbiB2ZXJzaW9uIGZvciB0ZXN0aW5nXCIuIEEgZnJvemVuIHZlcnNpb24gaXMgYSBzcGVjaWZpYyByZWxlYXNlIG9mIGEgcGx1Z2luIGJhc2VkIG9uIGl0cyByZWxlZWFzZSB0YWcuIGAgfSk7XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIpO1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiZGl2XCIsIHsgdGV4dDogYENsaWNrIHRoZSB4IGJ1dHRvbiBuZXh0IHRvIGEgcGx1Z2luIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LmAgfSk7XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIpO1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwic3BhblwiKVxuXHRcdFx0LmNyZWF0ZUVsKFwiYlwiLCB7IHRleHQ6IFwiTm90ZTogXCIgfSlcblx0XHRjb250YWluZXJFbC5jcmVhdGVTcGFuKHsgdGV4dDogXCJUaGlzIGRvZXMgbm90IGRlbGV0ZSB0aGUgcGx1Z2luLCB0aGlzIHNob3VsZCBiZSBkb25lIGZyb20gdGhlICBDb21tdW5pdHkgUGx1Z2lucyB0YWIgaW4gU2V0dGluZ3MuXCIgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5hZGRCdXR0b24oKGNiOiBCdXR0b25Db21wb25lbnQpPT57XG5cdFx0XHRcdGNiLnNldEJ1dHRvblRleHQoXCJBZGQgQmV0YSBwbHVnaW5cIilcblx0XHRcdFx0Y2Iub25DbGljayhhc3luYyAoKT0+e1xuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5hcHAuc2V0dGluZy5jbG9zZSgpO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLmJldGFQbHVnaW5zLmRpc3BsYXlBZGROZXdQbHVnaW5Nb2RhbCh0cnVlLCBmYWxzZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHR9KTtcblxuXHRcdGNvbnN0IHBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uTmFtZXNcblx0XHRcdD0gbmV3IFNldCh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbi5tYXAoeCA9PiB4LnJlcG8pKTtcblx0XHRmb3IgKGNvbnN0IGJwIG9mIHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkxpc3QpIHtcblx0XHRcdGlmIChwbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbk5hbWVzLmhhcyhicCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdFx0LnNldE5hbWUoYnApXG5cdFx0XHRcdC5hZGRCdXR0b24oKGJ0bjogQnV0dG9uQ29tcG9uZW50KSA9PiB7XG5cdFx0XHRcdFx0YnRuLnNldEljb24oXCJjcm9zc1wiKTtcblx0XHRcdFx0XHRidG4uc2V0VG9vbHRpcChcIkRlbGV0ZSB0aGlzIGJldGEgcGx1Z2luXCIpO1xuXHRcdFx0XHRcdGJ0bi5vbkNsaWNrKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdC8vIGF3YWl0IHRoaXMucGx1Z2luLmJldGFQbHVnaW5zLmRlbGV0ZVBsdWdpbihicCk7XG5cdFx0XHRcdFx0XHRpZiAoYnRuLmJ1dHRvbkVsLnRleHRDb250ZW50ID09PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHRidG4uc2V0QnV0dG9uVGV4dChcIkNsaWNrIG9uY2UgbW9yZSB0byBjb25maXJtIHJlbW92YWxcIik7XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0YnRuLmJ1dHRvbkVsLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGVsZXRlUGx1Z2luKGJwKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KVxuXHRcdH1cblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LmFkZEJ1dHRvbigoY2I6IEJ1dHRvbkNvbXBvbmVudCk9Pntcblx0XHRcdFx0Y2Iuc2V0QnV0dG9uVGV4dChcIkFkZCBCZXRhIHBsdWdpbiB3aXRoIGZyb3plbiB2ZXJzaW9uXCIpXG5cdFx0XHRcdGNiLm9uQ2xpY2soYXN5bmMgKCk9Pntcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uYXBwLnNldHRpbmcuY2xvc2UoKTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5kaXNwbGF5QWRkTmV3UGx1Z2luTW9kYWwodHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHR9KTtcblx0XHRmb3IgKGNvbnN0IGJwIG9mIHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uKSB7XG5cdFx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdFx0LnNldE5hbWUoYCR7YnAucmVwb30gKHZlcnNpb24gJHticC52ZXJzaW9ufSlgKVxuXHRcdFx0XHQuYWRkQnV0dG9uKChidG46IEJ1dHRvbkNvbXBvbmVudCkgPT4ge1xuXHRcdFx0XHRcdGJ0bi5zZXRJY29uKFwiY3Jvc3NcIik7XG5cdFx0XHRcdFx0YnRuLnNldFRvb2x0aXAoXCJEZWxldGUgdGhpcyBiZXRhIHBsdWdpblwiKTtcblx0XHRcdFx0XHRidG4ub25DbGljayhhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5kZWxldGVQbHVnaW4oYnApO1xuXHRcdFx0XHRcdFx0aWYgKGJ0bi5idXR0b25FbC50ZXh0Q29udGVudCA9PT0gXCJcIilcblx0XHRcdFx0XHRcdFx0YnRuLnNldEJ1dHRvblRleHQoXCJDbGljayBvbmNlIG1vcmUgdG8gY29uZmlybSByZW1vdmFsXCIpO1xuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGJ0bi5idXR0b25FbC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLmJldGFQbHVnaW5zLmRlbGV0ZVBsdWdpbihicC5yZXBvKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSlcblx0XHR9XG5cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImhyXCIpO1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDJcIiwgeyB0ZXh0OiBcIkJldGEgVGhlbWVzIExpc3RcIiB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LmFkZEJ1dHRvbigoY2I6IEJ1dHRvbkNvbXBvbmVudCk9Pntcblx0XHRcdFx0Y2Iuc2V0QnV0dG9uVGV4dChcIkFkZCBCZXRhIFRoZW1lXCIpXG5cdFx0XHRcdGNiLm9uQ2xpY2soYXN5bmMgKCk9Pntcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uYXBwLnNldHRpbmcuY2xvc2UoKTtcblx0XHRcdFx0XHQobmV3IEFkZE5ld1RoZW1lKHRoaXMucGx1Z2luKSkub3BlbigpO1xuXHRcdFx0XHR9KVxuXHRcdFx0fSk7XHRcdFxuXG5cblx0XHRmb3IgKGNvbnN0IGJwIG9mIHRoaXMucGx1Z2luLnNldHRpbmdzLnRoZW1lc0xpc3QpIHtcblx0XHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0XHQuc2V0TmFtZShicC5yZXBvKVxuXHRcdFx0XHQuYWRkQnV0dG9uKChidG46IEJ1dHRvbkNvbXBvbmVudCkgPT4ge1xuXHRcdFx0XHRcdGJ0bi5zZXRJY29uKFwiY3Jvc3NcIik7XG5cdFx0XHRcdFx0YnRuLnNldFRvb2x0aXAoXCJEZWxldGUgdGhpcyBiZXRhIHRoZW1lXCIpO1xuXHRcdFx0XHRcdGJ0bi5vbkNsaWNrKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChidG4uYnV0dG9uRWwudGV4dENvbnRlbnQgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdGJ0bi5zZXRCdXR0b25UZXh0KFwiQ2xpY2sgb25jZSBtb3JlIHRvIGNvbmZpcm0gcmVtb3ZhbFwiKTtcblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRidG4uYnV0dG9uRWwucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGVtZURlbGV0ZSh0aGlzLnBsdWdpbiwgYnAucmVwbyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pXG5cdFx0fVxuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJoclwiKTtcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogXCJNb25pdG9yaW5nXCIgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdFbmFibGUgTm90aWZpY2F0aW9ucycpXG5cdFx0XHQuc2V0RGVzYygnQlJBVCB3aWxsIHByb3ZpZGUgcG9wdXAgbm90aWZpY2F0aW9ucyBmb3IgaXRzIHZhcmlvdXMgYWN0aXZpdGllcy4gVHVybiB0aGlzIG9mZiBtZWFucyAgbm8gbm90aWZpY2F0aW9ucyBmcm9tIEJSQVQuJylcblx0XHRcdC5hZGRUb2dnbGUoKGNiOiBUb2dnbGVDb21wb25lbnQpID0+IHtcblx0XHRcdFx0Y2Iuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Mubm90aWZpY2F0aW9uc0VuYWJsZWQpO1xuXHRcdFx0XHRjYi5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5ub3RpZmljYXRpb25zRW5hYmxlZCA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdFbmFibGUgTG9nZ2luZycpXG5cdFx0XHQuc2V0RGVzYygnUGx1Z2luIHVwZGF0ZXMgd2lsbCBiZSBsb2dnZWQgdG8gYSBmaWxlIGluIHRoZSBsb2cgZmlsZS4nKVxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xuXHRcdFx0XHRjYi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5sb2dnaW5nRW5hYmxlZCk7XG5cdFx0XHRcdGNiLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdFbmFibGVkID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblxuXHRcdG5ldyBTZXR0aW5nKHRoaXMuY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkJSQVQgTG9nIEZpbGUgTG9jYXRpb25cIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiTG9ncyB3aWxsIGJlIHNhdmVkIHRvIHRoaXMgZmlsZS4gRG9uJ3QgYWRkIC5tZCB0byB0aGUgZmlsZSBuYW1lLlwiKVxuICAgICAgICAgICAgLmFkZFNlYXJjaCgoY2IpID0+IHtcbiAgICAgICAgICAgICAgICBjYi5zZXRQbGFjZWhvbGRlcihcIkV4YW1wbGU6IEJSQVQtbG9nXCIpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5sb2dnaW5nUGF0aClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIChuZXdfZm9sZGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5sb2dnaW5nUGF0aCA9IG5ld19mb2xkZXI7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcdFx0XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdFbmFibGUgVmVyYm9zZSBMb2dnaW5nJylcblx0XHRcdC5zZXREZXNjKCdHZXQgYSBsb3QgIG1vcmUgaW5mb3JtYXRpb24gaW4gIHRoZSBsb2cuJylcblx0XHRcdC5hZGRUb2dnbGUoKGNiOiBUb2dnbGVDb21wb25lbnQpID0+IHtcblx0XHRcdFx0Y2Iuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MubG9nZ2luZ1ZlcmJvc2VFbmFibGVkKTtcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MubG9nZ2luZ1ZlcmJvc2VFbmFibGVkID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblxuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVidWdnaW5nIE1vZGUnKVxuXHRcdFx0LnNldERlc2MoJ0F0b21pYyBCb21iIGxldmVsIGNvbnNvbGUgbG9nZ2luZy4gQ2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG90aW5nIGFuZCBkZXZlbG9wbWVudC4nKVxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xuXHRcdFx0XHRjYi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z2dpbmdNb2RlKTtcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdnaW5nTW9kZSA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXHRcdFx0XG5cdFxuXHR9XG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplUGF0aCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgVGhlUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XG5pbXBvcnQgeyBhZGRCZXRhVGhlbWVUb0xpc3QsIHVwZGF0ZUJldGFUaGVtZUxhc3RVcGRhdGVDaGVja3N1bSB9IGZyb20gXCIuLi91aS9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgY2hlY2tzdW1Gb3JTdHJpbmcsIGdyYWJDaGVja3N1bU9mVGhlbWVDc3NGaWxlLCBncmFiQ29tbW11bml0eVRoZW1lQ3NzRmlsZSwgZ3JhYkNvbW1tdW5pdHlUaGVtZU1hbmlmZXN0RmlsZSB9IGZyb20gXCIuL2dpdGh1YlV0aWxzXCI7XG5pbXBvcnQgeyBUb2FzdE1lc3NhZ2UgfSBmcm9tIFwiLi4vdXRpbHMvbm90aWZpY2F0aW9uc1wiO1xuaW1wb3J0IHsgaXNDb25uZWN0ZWRUb0ludGVybmV0IH0gZnJvbSBcIi4uL3V0aWxzL2ludGVybmV0Y29ubmVjdGlvblwiO1xuXG5cbi8qKlxuICogSW5zdGFsbHMgb3IgdXBkYXRlcyBhIHRoZW1lXG4gKlxuICogQHBhcmFtICAge1RoZVBsdWdpbn0gICAgIHBsdWdpbiAgICAgICAgICAgICAgIFRoZVBsdWdpblxuICogQHBhcmFtICAge3N0cmluZ30gICAgICAgIGNzc0dpdGh1YlJlcG9zaXRvcnkgIFRoZSByZXBvc2l0b3J5IHdpdGggdGhlIHRoZW1lXG4gKiBAcGFyYW0gICB7Ym9vbGVhbn0gICAgICAgbmV3SW5zdGFsbCAgICAgICAgICAgdHJ1ZSA9IE5ldyB0aGVtZSBpbnN0YWxsLCBmYWxzZSB1cGRhdGUgdGhlIHRoZW1lXG4gKlxuICogQHJldHVybiAge1Byb21pc2U8Ym9vbGVhbj59ICAgICAgICAgICAgICAgICAgIHRydWUgZm9yIHN1Y2NjZXNzXG4gKi9cbmV4cG9ydCBjb25zdCB0aGVtZVNhdmUgPSBhc3luYyAocGx1Z2luOiBUaGVQbHVnaW4sIGNzc0dpdGh1YlJlcG9zaXRvcnk6IHN0cmluZywgbmV3SW5zdGFsbDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGxldCB0aGVtZUNTUyA9IGF3YWl0IGdyYWJDb21tbXVuaXR5VGhlbWVDc3NGaWxlKGNzc0dpdGh1YlJlcG9zaXRvcnksIHRydWUsIHBsdWdpbi5zZXR0aW5ncy5kZWJ1Z2dpbmdNb2RlKTsgLy90ZXN0IGZvciB0aGVtZXMtYmV0YS5jc3NcbiAgICBpZighdGhlbWVDU1MpIHRoZW1lQ1NTID0gYXdhaXQgZ3JhYkNvbW1tdW5pdHlUaGVtZUNzc0ZpbGUoY3NzR2l0aHViUmVwb3NpdG9yeSwgZmFsc2UsIHBsdWdpbi5zZXR0aW5ncy5kZWJ1Z2dpbmdNb2RlKTsgLy8gZ3JhYmUgdGhlbWVzLmNzcyBpZiBubyBiZXRhXG5cbiAgICBpZighdGhlbWVDU1MpIHtcbiAgICAgICAgVG9hc3RNZXNzYWdlKHBsdWdpbixcIlRoZXJlIGlzIG5vIHRoZW1lLmNzcyBvciB0aGVtZS1iZXRhLmNzcyBmaWxlIGluIHRoZSByb290IHBhdGggb2YgdGhpcyByZXBvc2l0b3J5LCBzbyB0aGVyZSBpcyBubyB0aGVtZSB0byBpbnN0YWxsLlwiKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGhlbWVNYW5pZmVzdCA9IGF3YWl0IGdyYWJDb21tbXVuaXR5VGhlbWVNYW5pZmVzdEZpbGUoY3NzR2l0aHViUmVwb3NpdG9yeSwgcGx1Z2luLnNldHRpbmdzLmRlYnVnZ2luZ01vZGUpO1xuICAgIGlmKCF0aGVtZU1hbmlmZXN0KSB7XG4gICAgICAgIFRvYXN0TWVzc2FnZShwbHVnaW4sXCJUaGVyZSBpcyBubyBtYW5pZmVzdC5qc29uIGZpbGUgaW4gdGhlIHJvb3QgcGF0aCBvZiB0aGlzIHJlcG9zaXRvcnksIHNvIHRoZW1lIGNhbm5vdCBiZSBpbnN0YWxsZWQuXCIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYW5pZmVzdEluZm8gPSBhd2FpdCBKU09OLnBhcnNlKHRoZW1lTWFuaWZlc3QpO1xuXG4gICAgY29uc3QgdGhlbWVUYXJnZXRGb2xkZXJQYXRoID0gbm9ybWFsaXplUGF0aCh0aGVtZXNSb290UGF0aChwbHVnaW4pICsgbWFuaWZlc3RJbmZvLm5hbWUpO1xuXG4gICAgY29uc3QgYWRhcHRlciA9IHBsdWdpbi5hcHAudmF1bHQuYWRhcHRlcjtcbiAgICBpZiAoYXdhaXQgYWRhcHRlci5leGlzdHModGhlbWVUYXJnZXRGb2xkZXJQYXRoKSA9PT0gZmFsc2UpIGF3YWl0IGFkYXB0ZXIubWtkaXIodGhlbWVUYXJnZXRGb2xkZXJQYXRoKTtcblxuICAgIGF3YWl0IGFkYXB0ZXIud3JpdGUoIG5vcm1hbGl6ZVBhdGgodGhlbWVUYXJnZXRGb2xkZXJQYXRoICsgXCIvdGhlbWUuY3NzXCIpLCB0aGVtZUNTUyk7XG4gICAgYXdhaXQgYWRhcHRlci53cml0ZSggbm9ybWFsaXplUGF0aCh0aGVtZVRhcmdldEZvbGRlclBhdGggKyBcIi9tYW5pZmVzdC5qc29uXCIpLCB0aGVtZU1hbmlmZXN0KTtcblxuICAgIHVwZGF0ZUJldGFUaGVtZUxhc3RVcGRhdGVDaGVja3N1bShwbHVnaW4sIGNzc0dpdGh1YlJlcG9zaXRvcnksIGNoZWNrc3VtRm9yU3RyaW5nKHRoZW1lQ1NTKSlcblxuICAgIGxldCBtc2cgPSBgYDtcbiAgICBcbiAgICBpZihuZXdJbnN0YWxsKSB7XG4gICAgICAgIGF3YWl0IGFkZEJldGFUaGVtZVRvTGlzdChwbHVnaW4sIGNzc0dpdGh1YlJlcG9zaXRvcnksIHRoZW1lQ1NTKTtcbiAgICAgICAgbXNnID0gYCR7bWFuaWZlc3RJbmZvLm5hbWV9IHRoZW1lIGluc3RhbGxlZCBmcm9tICR7Y3NzR2l0aHViUmVwb3NpdG9yeX0uIGA7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSAgICAgICAgICAgIFxuICAgICAgICAgICAgcGx1Z2luLmFwcC5jdXN0b21Dc3Muc2V0VGhlbWUobWFuaWZlc3RJbmZvLm5hbWUpO1xuICAgICAgICB9LCA1MDApOyAgICBcbiAgICB9IGVsc2Uge1xuICAgICAgICBtc2cgPSBgJHttYW5pZmVzdEluZm8ubmFtZX0gdGhlbWUgdXBkYXRlZCBmcm9tICR7Y3NzR2l0aHViUmVwb3NpdG9yeX0uYDtcbiAgICB9XG5cbiAgICBwbHVnaW4ubG9nKG1zZyArIGBbVGhlbWUgSW5mb10oaHR0cHM6Ly9naXRodWIuY29tLyR7Y3NzR2l0aHViUmVwb3NpdG9yeX0pYCwgZmFsc2UpO1xuICAgIFRvYXN0TWVzc2FnZShwbHVnaW4sYCR7bXNnfWAsMjAsIGFzeW5jICgpOlByb21pc2U8dm9pZD49Pnsgd2luZG93Lm9wZW4oYGh0dHBzOi8vZ2l0aHViLmNvbS8ke2Nzc0dpdGh1YlJlcG9zaXRvcnl9YCl9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgIGlmIHRoZXJlICBhcmUgdGhlbWUgdXBkYXRlcyBiYXNlZCBvbiB0aGUgY29tbWl0IGRhdGUgb2YgdGhlIG9ic2lkaWFuLmNzcyBmaWxlIG9uIGdpdGh1YiBpbiBjb21wYXJpc29uIHRvIHdoYXQgaXMgc3RvcmVkIGluIHRoZSBCUkFUIHRoZW1lIGxpc3RcbiAqXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgIHBsdWdpbiAgICBUaGVQbHVnaW5cbiAqIEBwYXJhbSAgIHtib29sZWFuPHZvaWQ+fSAgc2hvd0luZm8gIHByb3ZpZGUgIG5vdGljZXMgZHVyaW5nIHRoZSB1cGRhdGUgcHJvY2VzXG4gKlxuICogQHJldHVybiAge1Byb21pc2U8dm9pZD59ICAgICAgICAgICAgXG4gKi9cbmV4cG9ydCBjb25zdCB0aGVtZXNDaGVja0FuZFVwZGF0ZXMgPSBhc3luYyAocGx1Z2luOiBUaGVQbHVnaW4sIHNob3dJbmZvOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYoYXdhaXQgaXNDb25uZWN0ZWRUb0ludGVybmV0KCk9PT1mYWxzZSkgeyBcbiAgICAgICAgY29uc29sZS5sb2coXCJCUkFUOiBObyBpbnRlcm5ldCBkZXRlY3RlZC5cIikgXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG5ld05vdGljZTogTm90aWNlO1xuICAgIGNvbnN0IG1zZzEgPSBgQ2hlY2tpbmcgZm9yIGJldGEgdGhlbWUgdXBkYXRlcyBTVEFSVEVEYDtcbiAgICBwbHVnaW4ubG9nKG1zZzEsIHRydWUpO1xuICAgIGlmIChzaG93SW5mbyAmJiBwbHVnaW4uc2V0dGluZ3Mubm90aWZpY2F0aW9uc0VuYWJsZWQpIG5ld05vdGljZSA9IG5ldyBOb3RpY2UoYEJSQVRcXG4ke21zZzF9YCwgMzAwMDApO1xuICAgIGZvcihjb25zdCB0IG9mIHBsdWdpbi5zZXR0aW5ncy50aGVtZXNMaXN0KSB7XG4gICAgICAgIC8vIGZpcnN0IHRlc3QgdG8gc2VlIGlmIHRoZW1lLWJldGEuY3NzIGV4aXN0c1xuICAgICAgICBsZXQgbGFzdFVwZGF0ZU9ubGluZSA9IGF3YWl0IGdyYWJDaGVja3N1bU9mVGhlbWVDc3NGaWxlKHQucmVwbywgdHJ1ZSwgcGx1Z2luLnNldHRpbmdzLmRlYnVnZ2luZ01vZGUpO1xuICAgICAgICAvLyBpZiB0aGVtZS1iZXRhLmNzcyBkb2VzIE5PVCBleGlzdCwgdHJ5IHRvIGdldCB0aGVtZS5jc3NcbiAgICAgICAgaWYobGFzdFVwZGF0ZU9ubGluZT09PVwiMFwiKSBsYXN0VXBkYXRlT25saW5lID0gYXdhaXQgZ3JhYkNoZWNrc3VtT2ZUaGVtZUNzc0ZpbGUodC5yZXBvLCBmYWxzZSwgcGx1Z2luLnNldHRpbmdzLmRlYnVnZ2luZ01vZGUpO1xuICAgICAgICBpZihsYXN0VXBkYXRlT25saW5lIT09dC5sYXN0VXBkYXRlKSBcbiAgICAgICAgICAgIGF3YWl0IHRoZW1lU2F2ZShwbHVnaW4sdC5yZXBvLGZhbHNlKVxuICAgIH1cbiAgICBjb25zdCBtc2cyID0gYENoZWNraW5nIGZvciBiZXRhIHRoZW1lIHVwZGF0ZXMgQ09NUExFVEVEYDtcbiAgICBwbHVnaW4ubG9nKG1zZzIsIHRydWUpO1xuICAgIGlmIChzaG93SW5mbykge1xuICAgICAgICBpZihwbHVnaW4uc2V0dGluZ3Mubm90aWZpY2F0aW9uc0VuYWJsZWQpIG5ld05vdGljZS5oaWRlKCk7XG4gICAgICAgIFRvYXN0TWVzc2FnZShwbHVnaW4sIG1zZzIpO1xuICAgIH1cbn0gXG5cbi8qKlxuICogRGVsZXRlcyBhIHRoZW1lIGZyb20gdGhlIEJSQVQgbGlzdCAoRG9lcyBub3QgcGh5c2ljYWxseSBkZWxldGUgdGhlIHRoZW1lKVxuICpcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICBwbHVnaW4gICAgICAgICAgICAgICBUaGVQbHVnaW5cbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICBjc3NHaXRodWJSZXBvc2l0b3J5ICBSZXBvc2l0b3J5IHBhdGhcbiAqXG4gKiBAcmV0dXJuICB7dm9pZH1cbiAqL1xuZXhwb3J0IGNvbnN0IHRoZW1lRGVsZXRlID0gYXN5bmMgKHBsdWdpbjogVGhlUGx1Z2luLCBjc3NHaXRodWJSZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBwbHVnaW4uc2V0dGluZ3MudGhlbWVzTGlzdCA9IHBsdWdpbi5zZXR0aW5ncy50aGVtZXNMaXN0LmZpbHRlcigodCkgPT4gdC5yZXBvICE9IGNzc0dpdGh1YlJlcG9zaXRvcnkpO1xuICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBtc2cgPSBgUmVtb3ZlZCAke2Nzc0dpdGh1YlJlcG9zaXRvcnl9IGZyb20gQlJBVCB0aGVtZXMgbGlzdCBhbmQgd2lsbCBubyBsb25nZXIgYmUgdXBkYXRlZC4gSG93ZXZlciwgdGhlIHRoZW1lIGZpbGVzIHN0aWxsIGV4aXN0IGluIHRoZSB2YXVsdC4gVG8gcmVtb3ZlIHRoZW0sIGdvIGludG8gU2V0dGluZ3MgPiBBcHBlYXJhbmNlIGFuZCByZW1vdmUgdGhlIHRoZW1lLmA7XG4gICAgcGx1Z2luLmxvZyhtc2csIHRydWUpO1xuICAgIFRvYXN0TWVzc2FnZShwbHVnaW4sIGAke21zZ31gKTtcbn1cblxuXG4vKipcbiAqIEdldCB0aGUgcGF0aCB0byB0aGUgdGhlbWVzIGZvbGRlciBmbyBydGhpcyB2YXVsdFxuICpcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICBwbHVnaW4gIFRoUGx1Z2luXG4gKlxuICogQHJldHVybiAge3N0cmluZ30gICAgICAgICAgICAgcGF0aCB0byB0aGVtZXMgZm9sZGVyXG4gKi9cbmV4cG9ydCBjb25zdCB0aGVtZXNSb290UGF0aCA9IChwbHVnaW46IFRoZVBsdWdpbik6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgocGx1Z2luLmFwcC52YXVsdC5jb25maWdEaXIgKyBcIi90aGVtZXNcIikgKyBcIi9cIjtcbn1cblxuIiwgImltcG9ydCB7IFBsdWdpbk1hbmlmZXN0LCByZXF1ZXN0IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmNvbnN0IEdJVEhVQl9SQVdfVVNFUkNPTlRFTlRfUEFUSCA9IFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1wiO1xuXG4vKipcbiAqIHB1bGxzIGZyb20gZ2l0aHViIGEgcmVsZWFzZSBmaWxlIGJ5IGl0cyB2ZXJzaW9uIG51bWJlclxuICpcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICByZXBvc2l0b3J5ICBwYXRoIHRvIEdpdEh1YiByZXBvc2l0b3J5IGluIGZvcm1hdCBVU0VSTkFNRS9yZXBvc2l0b3J5XG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgICAgdmVyc2lvbiAgICAgdmVyc2lvbiBvZiByZWxlYXNlIHRvIHJldHJpdmUgXG4gKiBAcGFyYW0gICB7c3RyaW5nPHN0cmluZz59ICAgZmlsZU5hbWUgICAgbmFtZSBvZiBmaWxlIHRvIHJldHJpZXZlIGZyb20gcmVsZWFzZVxuICpcbiAqIEByZXR1cm4gIHtQcm9taXNlPHN0cmluZz59ICAgICAgICAgICAgICBjb250ZW50cyBvZiBmaWxlIGFzIHN0cmluZyBmcm9tIHRoZSByZXBvc2l0b3J5J3MgcmVsZWFzZVxuICovXG5leHBvcnQgY29uc3QgZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnkgPSBhc3luYyAocmVwb3NpdG9yeTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIGRlYnVnTG9nZ2luZyA9IHRydWUpOiBQcm9taXNlPHN0cmluZ3xudWxsPiA9PiB7XG4gICAgY29uc3QgVVJMID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L3JlbGVhc2VzL2Rvd25sb2FkLyR7dmVyc2lvbn0vJHtmaWxlTmFtZX1gO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRvd25sb2FkID0gYXdhaXQgcmVxdWVzdCh7IHVybDogVVJMIH0pO1xuICAgICAgICByZXR1cm4gKChkb3dubG9hZCA9PT0gXCJOb3QgRm91bmRcIiB8fCBkb3dubG9hZCA9PT0gYHtcImVycm9yXCI6XCJOb3QgRm91bmRcIn1gKSA/IG51bGwgOiBkb3dubG9hZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYoZGVidWdMb2dnaW5nKSBjb25zb2xlLmxvZyhcImVycm9yIGluIGdyYWJSZWxlYXNlRmlsZUZyb21SZXBvc2l0b3J5XCIsIFVSTCwgZXJyb3IpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiBcbi8qKlxuICogZ3JhYnMgdGhlIG1hbmlmZXN0Lmpzb24gZnJvbSB0aGUgcmVwb3NpdG9yeS4gcm9vdE1hbmlmZXN0IC0gaWYgdHJ1ZSBncmFicyBtYW5pZmVzdC5qc29uIGlmIGZhbHNlIGdyYWJzIG1hbmlmZXN0LWJldGEuanNvblxuICpcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeVBhdGggIHBhdGggdG8gR2l0SHViIHJlcG9zaXRvcnkgaW4gZm9ybWF0IFVTRVJOQU1FL3JlcG9zaXRvcnlcbiAqIEBwYXJhbSAgIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICAgcm9vdE1hbmlmZXN0ICAgIGlmIHRydWUgZ3JhYnMgbWFuaWZlc3QuanNvbiBpZiBmYWxzZSBncmFicyBtYW5pZmVzdC1iZXRhLmpzb25cbiAqXG4gKiBAcmV0dXJuICB7UHJvbWlzZTxQbHVnaW5NYW5pZmVzdD59ICAgICAgICAgICAgICAgICAgICByZXR1cm5zIG1hbmlmZXN0IGZpbGUgZm9yICBhIHBsdWdpblxuICovXG5leHBvcnQgY29uc3QgZ3JhYk1hbmlmZXN0SnNvbkZyb21SZXBvc2l0b3J5ID0gYXN5bmMgKHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIHJvb3RNYW5pZmVzdCA9IHRydWUsIGRlYnVnTG9nZ2luZyA9IHRydWUpOiBQcm9taXNlPFBsdWdpbk1hbmlmZXN0fG51bGw+ID0+IHtcbiAgICBjb25zdCBtYW5pZmVzdEpzb25QYXRoID0gR0lUSFVCX1JBV19VU0VSQ09OVEVOVF9QQVRIICsgcmVwb3NpdG9yeVBhdGggK1xuICAgICAgICAocm9vdE1hbmlmZXN0ID09PSB0cnVlID8gXCIvSEVBRC9tYW5pZmVzdC5qc29uXCIgOiBcIi9IRUFEL21hbmlmZXN0LWJldGEuanNvblwiKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoeyB1cmw6IG1hbmlmZXN0SnNvblBhdGggfSk7XG4gICAgICAgIHJldHVybiAocmVzcG9uc2UgPT09IFwiNDA0OiBOb3QgRm91bmRcIiA/IG51bGwgOiBhd2FpdCBKU09OLnBhcnNlKHJlc3BvbnNlKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYoZXJyb3IhPVwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkLCBzdGF0dXMgNDA0XCIgJiYgZGVidWdMb2dnaW5nKSAgeyAvL25vcm1hbCBlcnJvciwgaWdub3JlXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgZXJyb3IgaW4gZ3JhYk1hbmlmZXN0SnNvbkZyb21SZXBvc2l0b3J5IGZvciAke21hbmlmZXN0SnNvblBhdGh9YCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuXG5leHBvcnQgY29uc3QgZ3JhYkNvbW1tdW5pdHlQbHVnaW5MaXN0ID0gYXN5bmMgKGRlYnVnTG9nZ2luZyA9IHRydWUpOiBQcm9taXNlPEpTT058bnVsbD4gPT4ge1xuICAgIGNvbnN0IHBsdWdpbkxpc3RVUkwgPSBgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29ic2lkaWFubWQvb2JzaWRpYW4tcmVsZWFzZXMvSEVBRC9jb21tdW5pdHktcGx1Z2lucy5qc29uYDtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoeyB1cmw6IHBsdWdpbkxpc3RVUkwgfSk7XG4gICAgICAgIHJldHVybiAocmVzcG9uc2UgPT09IFwiNDA0OiBOb3QgRm91bmRcIiA/IG51bGwgOiBhd2FpdCBKU09OLnBhcnNlKHJlc3BvbnNlKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYoZGVidWdMb2dnaW5nKSBjb25zb2xlLmxvZyhcImVycm9yIGluIGdyYWJDb21tbXVuaXR5UGx1Z2luTGlzdFwiLCBlcnJvcilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZ3JhYkNvbW1tdW5pdHlUaGVtZXNMaXN0ID0gYXN5bmMgKGRlYnVnTG9nZ2luZyA9IHRydWUpOiBQcm9taXNlPEpTT058bnVsbD4gPT4ge1xuICAgIGNvbnN0IHRoZW1lc1VSTCA9IGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9IRUFEL2NvbW11bml0eS1jc3MtdGhlbWVzLmpzb25gO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdCh7IHVybDogdGhlbWVzVVJMIH0pO1xuICAgICAgICByZXR1cm4gKHJlc3BvbnNlID09PSBcIjQwNDogTm90IEZvdW5kXCIgPyBudWxsIDogYXdhaXQgSlNPTi5wYXJzZShyZXNwb25zZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmKGRlYnVnTG9nZ2luZykgY29uc29sZS5sb2coXCJlcnJvciBpbiBncmFiQ29tbW11bml0eVRoZW1lc0xpc3RcIiwgZXJyb3IpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuXG5leHBvcnQgY29uc3QgZ3JhYkNvbW1tdW5pdHlUaGVtZUNzc0ZpbGUgPSBhc3luYyAocmVwb3NpdG9yeVBhdGg6IHN0cmluZywgYmV0YVZlcnNpb24gPSBmYWxzZSwgZGVidWdMb2dnaW5nKTogUHJvbWlzZTxzdHJpbmd8bnVsbD4gPT4ge1xuICAgIGNvbnN0IHRoZW1lc1VSTCA9IGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vJHtyZXBvc2l0b3J5UGF0aH0vSEVBRC90aGVtZSR7YmV0YVZlcnNpb24gPyBcIi1iZXRhXCIgOiBcIlwifS5jc3NgO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdCh7IHVybDogdGhlbWVzVVJMIH0pO1xuICAgICAgICByZXR1cm4gKHJlc3BvbnNlID09PSBcIjQwNDogTm90IEZvdW5kXCIgPyBudWxsIDogcmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmKGRlYnVnTG9nZ2luZykgY29uc29sZS5sb2coXCJlcnJvciBpbiBncmFiQ29tbW11bml0eVRoZW1lQ3NzRmlsZVwiLCBlcnJvcilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZ3JhYkNvbW1tdW5pdHlUaGVtZU1hbmlmZXN0RmlsZSA9IGFzeW5jIChyZXBvc2l0b3J5UGF0aDogc3RyaW5nLCBkZWJ1Z0xvZ2dpbmcgPSB0cnVlKTogUHJvbWlzZTxzdHJpbmd8bnVsbD4gPT4ge1xuICAgIGNvbnN0IHRoZW1lc1VSTCA9IGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vJHtyZXBvc2l0b3J5UGF0aH0vSEVBRC9tYW5pZmVzdC5qc29uYDtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoeyB1cmw6IHRoZW1lc1VSTCB9KTtcbiAgICAgICAgcmV0dXJuIChyZXNwb25zZSA9PT0gXCI0MDQ6IE5vdCBGb3VuZFwiID8gbnVsbCA6IHJlc3BvbnNlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZihkZWJ1Z0xvZ2dpbmcpIGNvbnNvbGUubG9nKFwiZXJyb3IgaW4gZ3JhYkNvbW1tdW5pdHlUaGVtZU1hbmlmZXN0RmlsZVwiLCBlcnJvcilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5jb25zdCBjaGVja3N1bSA9IChzdHI6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3VtICs9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG5leHBvcnQgY29uc3QgY2hlY2tzdW1Gb3JTdHJpbmcgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBjaGVja3N1bShzdHIpLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBjb25zdCBncmFiQ2hlY2tzdW1PZlRoZW1lQ3NzRmlsZSA9IGFzeW5jIChyZXBvc2l0b3J5UGF0aDogc3RyaW5nLCBiZXRhVmVyc2lvbiwgZGVidWdMb2dnaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+e1xuICAgIGNvbnN0IHRoZW1lQ1NTID0gYXdhaXQgZ3JhYkNvbW1tdW5pdHlUaGVtZUNzc0ZpbGUocmVwb3NpdG9yeVBhdGgsIGJldGFWZXJzaW9uLCBkZWJ1Z0xvZ2dpbmcpXG4gICAgcmV0dXJuIHRoZW1lQ1NTID8gY2hlY2tzdW1Gb3JTdHJpbmcodGhlbWVDU1MpIDogXCIwXCI7XG59XG5cbmV4cG9ydCBjb25zdCBncmFiTGFzdENvbW1pdEluZm9Gb3JBRmlsZSA9IGFzeW5jIChyZXBvc2l0b3J5UGF0aDogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIGRlYnVnTG9nZ2luZyA9IHRydWUpOiBQcm9taXNlPHN0cmluZ3xudWxsPiA9PiB7XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvc2l0b3J5UGF0aH0vY29tbWl0cz9wYXRoPSR7cGF0aH0mcGFnZT0xJnBlcl9wYWdlPTFgO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdCh7IHVybDogdXJsIH0pO1xuICAgICAgICByZXR1cm4gKHJlc3BvbnNlID09PSBcIjQwNDogTm90IEZvdW5kXCIgPyBudWxsIDogSlNPTi5wYXJzZShyZXNwb25zZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmKGRlYnVnTG9nZ2luZykgY29uc29sZS5sb2coXCJlcnJvciBpbiBncmFiTGFzdENvbW1pdEluZm9Gb3JBRmlsZVwiLCBlcnJvcilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZ3JhYkxhc3RDb21taXREYXRlRm9yQUZpbGUgPSBhc3luYyAocmVwb3NpdG9yeVBhdGg6IHN0cmluZywgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICBjb25zdCB0ZXN0ID0gYXdhaXQgZ3JhYkxhc3RDb21taXRJbmZvRm9yQUZpbGUocmVwb3NpdG9yeVBhdGgsIHBhdGgpO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGlmKHRlc3RbMF0uY29tbWl0LmNvbW1pdHRlci5kYXRlKXtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIHJldHVybiB0ZXN0WzBdLmNvbW1pdC5jb21taXR0ZXIuZGF0ZVxuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBcIlwiO1xufVxuXG4iLCAiaW1wb3J0IHsgY2hlY2tzdW1Gb3JTdHJpbmcgfSBmcm9tIFwiLi4vZmVhdHVyZXMvZ2l0aHViVXRpbHNcIjtcbmltcG9ydCBUaGVQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcblxuZXhwb3J0IGludGVyZmFjZSBUaGVtZUluZm9yYW10aW9uIHtcbiAgICByZXBvOiBzdHJpbmc7XG4gICAgbGFzdFVwZGF0ZTogc3RyaW5nOyAvL2NoZWNrc3VtIG9mIHRoZW1lIGZpbGUgKGVpdGhlciB0aGVtZS5jc3Mgb3IgdGhlbWUtYmV0YS5jc3MpXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRnJvemVuVmVyc2lvbiB7XG4gICAgcmVwbzogc3RyaW5nO1xuICAgIHZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXR0aW5ncyB7XG4gICAgcGx1Z2luTGlzdDogc3RyaW5nW107XG4gICAgcGx1Z2luU3ViTGlzdEZyb3plblZlcnNpb246IFBsdWdpbkZyb3plblZlcnNpb25bXSxcbiAgICB0aGVtZXNMaXN0OiBUaGVtZUluZm9yYW10aW9uW107XG4gICAgdXBkYXRlQXRTdGFydHVwOiBib29sZWFuO1xuICAgIHVwZGF0ZVRoZW1lc0F0U3RhcnR1cDogIGJvb2xlYW47XG4gICAgcmliYm9uSWNvbkVuYWJsZWQ6IGJvb2xlYW47XG4gICAgbG9nZ2luZ0VuYWJsZWQ6IGJvb2xlYW47XG4gICAgbG9nZ2luZ1BhdGg6IHN0cmluZztcbiAgICBsb2dnaW5nVmVyYm9zZUVuYWJsZWQ6IGJvb2xlYW47XG4gICAgZGVidWdnaW5nTW9kZTogYm9vbGVhbjtcbiAgICBub3RpZmljYXRpb25zRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFNldHRpbmdzID0ge1xuICAgIHBsdWdpbkxpc3Q6IFtdLFxuICAgIHBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uOiBbXSxcbiAgICB0aGVtZXNMaXN0OiBbXSxcbiAgICB1cGRhdGVBdFN0YXJ0dXA6IGZhbHNlLFxuICAgIHVwZGF0ZVRoZW1lc0F0U3RhcnR1cDogZmFsc2UsXG4gICAgcmliYm9uSWNvbkVuYWJsZWQ6IHRydWUsXG4gICAgbG9nZ2luZ0VuYWJsZWQ6IGZhbHNlLFxuICAgIGxvZ2dpbmdQYXRoOiBcIkJSQVQtbG9nXCIsXG4gICAgbG9nZ2luZ1ZlcmJvc2VFbmFibGVkOiBmYWxzZSxcbiAgICBkZWJ1Z2dpbmdNb2RlOiB0cnVlLFxuICAgIG5vdGlmaWNhdGlvbnNFbmFibGVkOiB0cnVlXG59XG5cbi8qKlxuICogQWRkcyBhIHBsdWdpbiBmb3IgYmV0YSB0ZXN0aW5nIHRvIHRoZSBkYXRhLmpzb24gZmlsZSBvZiB0aGlzICBwbHVnaW5cbiAqXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgIHBsdWdpbiAgICAgICAgIFxuICogQHBhcmFtICAge3N0cmluZzx2b2lkPn0gICByZXBvc2l0b3J5UGF0aCAgcGF0aCB0byB0aGUgR2l0SHViIHJlcG9zaXRvcnlcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgc3BlY2lmeVZlcnNpb24gIGlmIHRoZSBwbHVnaW4gbmVlZHMgdG8gc3RheSBhdCB0aGUgZnJvemVuIHZlcnNpb24sIHdlIG5lZWQgdG8gYWxzbyByZWNvcmQgdGhlIHZlcnNpb25cbiAqXG4gKiBAcmV0dXJuICB7UHJvbWlzZTx2b2lkPn0gICAgICAgICAgICAgICAgICBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZEJldGFQbHVnaW5Ub0xpc3QocGx1Z2luOiBUaGVQbHVnaW4sIHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIHNwZWNpZnlWZXJzaW9uID0gXCJcIik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBzYXZlID0gZmFsc2U7XG4gICAgaWYgKCFwbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdC5jb250YWlucyhyZXBvc2l0b3J5UGF0aCkpIHtcbiAgICAgICAgcGx1Z2luLnNldHRpbmdzLnBsdWdpbkxpc3QudW5zaGlmdChyZXBvc2l0b3J5UGF0aCk7XG4gICAgICAgIHNhdmUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgIHNwZWNpZnlWZXJzaW9uICE9PSBcIlwiIFxuICAgICAgICAmJiAocGx1Z2luLnNldHRpbmdzLnBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uLmZpbHRlcih4ID0+IHgucmVwbyA9PT0gcmVwb3NpdG9yeVBhdGgpLmxlbmd0aCA9PT0gMClcbiAgICApIHtcbiAgICAgICAgcGx1Z2luLnNldHRpbmdzLnBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uLnVuc2hpZnQoe1xuICAgICAgICAgICAgcmVwbzogcmVwb3NpdG9yeVBhdGgsXG4gICAgICAgICAgICB2ZXJzaW9uOiBzcGVjaWZ5VmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgc2F2ZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChzYXZlKSB7XG4gICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICB9XG59XG5cbi8qKlxuICogVGVzdHMgaWYgIGEgIHBsdWdpbiAgaXMgaW4gZGF0YS5qc29uXG4gKlxuICogQHBhcmFtICAge1RoZVBsdWdpbn0gICAgICAgICBwbHVnaW4gICAgICAgICAgXG4gKiBAcGFyYW0gICB7c3RyaW5nPGJvb2xlYW4+fSAgIHJlcG9zaXRvcnlQYXRoICBwYXRoIHRvIHRoZSBHaXRIdWIgcmVwb3NpdG9yeVxuICpcbiAqIEByZXR1cm4gIHtQcm9taXNlPGJvb2xlYW4+fSAgdHJ1ZSBpZiBleGlzdHMgICAgICBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4aXN0QmV0YVBsdWdpbkluTGlzdChwbHVnaW46IFRoZVBsdWdpbiwgcmVwb3NpdG9yeVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBwbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdC5jb250YWlucyhyZXBvc2l0b3J5UGF0aCk7XG59XG5cblxuLyoqXG4gKiBBZGRzIGEgdGhlbWUgZm9yIGJldGEgdGVzdGluZyB0byB0aGUgZGF0YS5qc29uIGZpbGUgb2YgdGhpcyAgcGx1Z2luXG4gKlxuICogQHBhcmFtICAge1RoZVBsdWdpbn0gICAgICBwbHVnaW4gICAgICAgICBcbiAqIEBwYXJhbSAgIHtzdHJpbmc8dm9pZD59ICAgcmVwb3NpdG9yeVBhdGggIHBhdGggdG8gdGhlIEdpdEh1YiByZXBvc2l0b3J5XG4gKiBAcGFyYW0gICB7c3RyaW5nPHZvaWQ+fSAgIHRoZW1lQ1NTICByYXcgdGV4dCBvZiB0aGUgdGhlbWUuIEl0IGlzIGNoZWNrc3VtbWVkIGFuZCB0aGlzIGlzIHVzZWQgZm9yIHRyYWNraW5nIGlmIGNoYW5nZXMgb2NjdXJyZWQgdG8gdGhlIHRoZW1lXG4gKlxuICogQHJldHVybiAge1Byb21pc2U8dm9pZD59ICAgICAgICAgICAgICAgICAgXG4gKi9cbiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkQmV0YVRoZW1lVG9MaXN0KHBsdWdpbjogVGhlUGx1Z2luLCByZXBvc2l0b3J5UGF0aDogc3RyaW5nLCB0aGVtZUNTUzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgIGNvbnN0IG5ld1RoZW1lOiBUaGVtZUluZm9yYW10aW9uID0geyBcbiAgICAgICAgIHJlcG86IHJlcG9zaXRvcnlQYXRoLCBcbiAgICAgICAgIGxhc3RVcGRhdGU6IGNoZWNrc3VtRm9yU3RyaW5nKHRoZW1lQ1NTKVxuICAgIH1cbiAgICBwbHVnaW4uc2V0dGluZ3MudGhlbWVzTGlzdC51bnNoaWZ0KG5ld1RoZW1lKTtcbiAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG59XG5cbi8qKlxuICogVGVzdHMgaWYgYSAgdGhlbWUgIGlzIGluIGRhdGEuanNvblxuICpcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICAgICAgICAgcGx1Z2luICAgICAgICAgIFxuICogQHBhcmFtICAge3N0cmluZzxib29sZWFuPn0gICByZXBvc2l0b3J5UGF0aCAgcGF0aCB0byB0aGUgR2l0SHViIHJlcG9zaXRvcnlcbiAqXG4gKiBAcmV0dXJuICB7UHJvbWlzZTxib29sZWFuPn0gIHRydWUgaWYgZXhpc3RzICAgICAgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGlzdEJldGFUaGVtZWluSW5MaXN0KHBsdWdpbjogVGhlUGx1Z2luLCByZXBvc2l0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGVzdElmVGhlbUV4aXN0cyA9IHBsdWdpbi5zZXR0aW5ncy50aGVtZXNMaXN0LmZpbmQodD0+IHQucmVwbyA9PT0gcmVwb3NpdG9yeVBhdGgpO1xuICAgIHJldHVybiB0ZXN0SWZUaGVtRXhpc3RzID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG5cbi8qKlxuICogVXBkYXRlIHRoZSBsYXN0VXBhdGUgZmllbGQgZm9yIHRoZSB0aGVtZVxuICpcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICAgICAgICAgcGx1Z2luICAgICAgICAgIFxuICogQHBhcmFtICAge3N0cmluZzxib29sZWFuPn0gICByZXBvc2l0b3J5UGF0aCAgcGF0aCB0byB0aGUgR2l0SHViIHJlcG9zaXRvcnlcbiAqIEBwYXJhbSAgIHtzdHJpbmc8Y2hlY2tzdW0+fSAgY2hlY2tzdW0gIGNoZWNrc3VtIG9mIGZpbGUuIEluIHBhc3Qgd2UgdXNlZCB0aGUgZGF0ZSBvZiBmaWxlIHVwZGF0ZSwgYnV0IHRoaXMgcHJvdmVkIHRvIG5vdCBiZSBjb25zaXNlbnQgd2l0aCB0aGUgR2l0SHViIGNhY2hlLlxuICpcbiAqL1xuIGV4cG9ydCBmdW5jdGlvbiB1cGRhdGVCZXRhVGhlbWVMYXN0VXBkYXRlQ2hlY2tzdW0ocGx1Z2luOiBUaGVQbHVnaW4sIHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIGNoZWNrc3VtOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBwbHVnaW4uc2V0dGluZ3MudGhlbWVzTGlzdC5mb3JFYWNoKHQ9PntcbiAgICAgICAgaWYodC5yZXBvID09PSByZXBvc2l0b3J5UGF0aCkge1xuICAgICAgICAgICAgdC5sYXN0VXBkYXRlID0gY2hlY2tzdW07XG4gICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuIiwgImltcG9ydCB7IE5vdGljZSwgUGxhdGZvcm0gfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBUaGVQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcblxuLyoqXG4gKiBEaXNwbGF5cyBhIG5vdGljZSB0byB0aGUgdXNlclxuICpcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICBwbHVnaW4gICAgICAgICAgICAgIFBsdWdpbiBvYmplY3RcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICBtc2cgICAgICAgICAgICAgICAgIFRleHQgdG8gZGlzcGxheSB0byB0aGUgdXNlclxuICogQHBhcmFtICAge251bWJlcn0gICAgIHRpbWVvdXRJblNlY29uZHMgICAgTnVtYmVyIG9mIHNlY29uZHMgdG8gc2hvdyB0aGUgVG9hc3QgbWVzc2FnZVxuICogQHBhcmFtICAge251bGx9ICAgICAgIGNvbnRleHRNZW51Q2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCBpZiByaWdodCBtb3VzZSBjbGlja2VkXG4gKiBAcmV0dXJuICB7dm9pZH0gICAgICAgICAgICAgICAgICAgICAgICAgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUb2FzdE1lc3NhZ2UocGx1Z2luOiBUaGVQbHVnaW4sIG1zZzogc3RyaW5nLCB0aW1lb3V0SW5TZWNvbmRzID0gMTAsIGNvbnRleHRNZW51Q2FsbGJhY2s/OigpPT52b2lkKTogdm9pZCB7XG4gICAgaWYocGx1Z2luLnNldHRpbmdzLm5vdGlmaWNhdGlvbnNFbmFibGVkPT09ZmFsc2UpIHJldHVybjtcbiAgICBjb25zdCBhZGRpdGlvbmFsSW5mbyA9IGNvbnRleHRNZW51Q2FsbGJhY2sgID8gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBsYXRmb3JtLmlzRGVza3RvcCA/IFwiKGNsaWNrPWRpc21pc3MsIHJpZ2h0LWNsaWNrPUluZm8pXCIgOiBcIihjbGljaz1kaXNtaXNzKVwiKSA6IFwiXCI7XG4gICAgY29uc3QgbmV3Tm90aWNlOiBOb3RpY2UgPSBuZXcgTm90aWNlKGBCUkFUXFxuJHttc2d9XFxuJHthZGRpdGlvbmFsSW5mb31gLCB0aW1lb3V0SW5TZWNvbmRzKjEwMDApO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGlmKGNvbnRleHRNZW51Q2FsbGJhY2spIG5ld05vdGljZS5ub3RpY2VFbC5vbmNvbnRleHRtZW51ID0gYXN5bmMgKCkgPT4geyBjb250ZXh0TWVudUNhbGxiYWNrKCkgfTsgICAgXG59IiwgIlxuLyoqXG4gKiBUZXN0cyBpZiB0aGVyZSBpcyBhbiBpbnRlcm5ldCBjb25uZWN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIGNvbm5lY3RlZCwgZmFsc2UgaWYgbm8gaW50ZXJuZXRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzQ29ubmVjdGVkVG9JbnRlcm5ldCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBvbmxpbmUgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vb2JzaWRpYW4ubWQvP1wiICsgTWF0aC5yYW5kb20oKSk7XG4gICAgICAgIHJldHVybiBvbmxpbmUuc3RhdHVzID49IDIwMCAmJiBvbmxpbmUuc3RhdHVzIDwgMzAwO1xuICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59IiwgImltcG9ydCB7IE1vZGFsLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgdGhlbWVTYXZlIH0gZnJvbSAnLi4vZmVhdHVyZXMvdGhlbWVzJztcbmltcG9ydCBUaGVQbHVnaW4gZnJvbSAnLi4vbWFpbic7XG5pbXBvcnQgeyBUb2FzdE1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9ub3RpZmljYXRpb25zJztcbmltcG9ydCB7ICBleGlzdEJldGFUaGVtZWluSW5MaXN0IH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5pbXBvcnQgeyBwcm9tb3Rpb25hbExpbmtzIH0gZnJvbSAnLi9Qcm9tb3Rpb25hbCc7XG5cbi8qKlxuICogQWRkIGEgYmV0YSB0aGVtZSB0byB0aGUgbGlzdCBvZiBwbHVnaW5zIGJlaW5nIHRyYWNrZWQgYW5kIHVwZGF0ZWRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRkTmV3VGhlbWUgZXh0ZW5kcyBNb2RhbCB7XG4gICAgcGx1Z2luOiBUaGVQbHVnaW47XG4gICAgYWRkcmVzczogc3RyaW5nO1xuICAgIG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHM6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IFRoZVBsdWdpbiwgb3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcyA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKHBsdWdpbi5hcHApO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICAgICAgdGhpcy5hZGRyZXNzID0gXCJcIjtcbiAgICAgICAgdGhpcy5vcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzID0gb3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcztcbiAgICB9XG5cbiAgICBhc3luYyBzdWJtaXRGb3JtKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5hZGRyZXNzID09PSBcIlwiKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNjcnViYmVkQWRkcmVzcyA9IHRoaXMuYWRkcmVzcy5yZXBsYWNlKFwiaHR0cHM6Ly9naXRodWIuY29tL1wiLCBcIlwiKTtcbiAgICAgICAgaWYgKGF3YWl0IGV4aXN0QmV0YVRoZW1laW5Jbkxpc3QodGhpcy5wbHVnaW4sIHNjcnViYmVkQWRkcmVzcykpIHtcbiAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYFRoaXMgcGx1Z2luIGlzIGFscmVhZHkgaW4gdGhlIGxpc3QgZm9yIGJldGEgdGVzdGluZ2AsIDEwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYoYXdhaXQgdGhlbWVTYXZlKHRoaXMucGx1Z2luLCBzY3J1YmJlZEFkZHJlc3MsIHRydWUpKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7ICAgIFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25PcGVuKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRlbnRFbC5jcmVhdGVFbCgnaDQnLCB7IHRleHQ6IFwiR2l0aHViIHJlcG9zaXRvcnkgZm9yIGJldGEgdGhlbWU6XCIgfSk7XG4gICAgICAgIHRoaXMuY29udGVudEVsLmNyZWF0ZUVsKCdmb3JtJywge30sIChmb3JtRWwpID0+IHtcbiAgICAgICAgICAgIGZvcm1FbC5hZGRDbGFzcyhcImJyYXQtbW9kYWxcIik7XG4gICAgICAgICAgICBuZXcgU2V0dGluZyhmb3JtRWwpXG4gICAgICAgICAgICAgICAgLmFkZFRleHQoKHRleHRFbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuc2V0UGxhY2Vob2xkZXIoJ1JlcG9zaXRvcnkgKGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9HaXR1YlVzZXJOYW1lL3JlcG9zaXRvcnktbmFtZScpO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3MgPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgYXN5bmMgKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiB0aGlzLmFkZHJlc3MgIT09ICcgJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN1Ym1pdEZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRleHRFbC5pbnB1dEVsLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5zZXR0aW5nLWl0ZW0taW5mb1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aXRsZSkgdGl0bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5mb2N1cygpXG4gICAgICAgICAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9ybUVsLmNyZWF0ZURpdignbW9kYWwtYnV0dG9uLWNvbnRhaW5lcicsIChidXR0b25Db250YWluZXJFbCkgPT4ge1xuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lckVsXG4gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVFbCgnYnV0dG9uJywgeyBhdHRyOiB7IHR5cGU6ICdidXR0b24nIH0sIHRleHQ6ICdOZXZlciBtaW5kJyB9KVxuICAgICAgICAgICAgICAgICAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lckVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHI6IHsgdHlwZTogJ3N1Ym1pdCcgfSxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiAnbW9kLWN0YScsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdBZGQgVGhlbWUnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0RpdiA9IGZvcm1FbC5jcmVhdGVEaXYoKTtcbiAgICAgICAgICAgIG5ld0Rpdi5zdHlsZS5ib3JkZXJUb3AgPSBcIjFweCBzb2xpZCAjY2NjXCI7XG4gICAgICAgICAgICBuZXdEaXYuc3R5bGUubWFyZ2luVG9wID0gXCIzMHB4XCI7XG4gICAgICAgICAgICBjb25zdCBieVRmVGhhY2tlciA9IG5ld0Rpdi5jcmVhdGVTcGFuKCk7XG4gICAgICAgICAgICBieVRmVGhhY2tlci5pbm5lckhUTUwgPSBcIkJSQVQgYnkgPGEgaHJlZj0naHR0cHM6Ly9iaXQubHkvbzQyLXR3aXR0ZXInPlRGVEhhY2tlcjwvYT5cIjtcbiAgICAgICAgICAgIGJ5VGZUaGFja2VyLnN0eWxlLmZvbnRTdHlsZSA9IFwiaXRhbGljXCI7XG4gICAgICAgICAgICBuZXdEaXYuYXBwZW5kQ2hpbGQoYnlUZlRoYWNrZXIpO1xuICAgICAgICAgICAgcHJvbW90aW9uYWxMaW5rcyhuZXdEaXYsIGZhbHNlKTtcblxuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZm9ybUVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuYnJhdC1tb2RhbCAuc2V0dGluZy1pdGVtLWluZm9cIik7XG4gICAgICAgICAgICAgICAgdGl0bGUuZm9yRWFjaCgodGl0bGVFbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZUVsLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCA1MClcblxuICAgICAgICAgICAgLy8gaW52b2tlZCB3aGVuIGJ1dHRvbiBpcyBjbGlja2VkLiBcbiAgICAgICAgICAgIGZvcm1FbC5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBhc3luYyAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRkcmVzcyAhPT0gJycpIGF3YWl0IHRoaXMuc3VibWl0Rm9ybSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIG9uQ2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMpIHtcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLnBsdWdpbiBhcyBhbnkpLmFwcC5zZXR0aW5nLm9wZW4oKTtcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLnBsdWdpbiBhcyBhbnkpLmFwcC5zZXR0aW5nLm9wZW5UYWJCeUlkKFwib2JzaWRpYW40Mi1icmF0XCIpO1xuICAgICAgICB9XG5cbiAgICB9XG59IiwgIlxuXG5leHBvcnQgY29uc3QgcHJvbW90aW9uYWxMaW5rcyA9IChjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIHNldHRpbmdzVGFiID0gdHJ1ZSkgOiBIVE1MRWxlbWVudCA9PiB7XG5cbiAgICBjb25zdCBsaW5rSGVpZ2h0ID0gc2V0dGluZ3NUYWIgPyA0MCA6IDMwO1xuXG4gICAgY29uc3QgbGlua3NEaXYgPSBjb250YWluZXJFbC5jcmVhdGVFbChcImRpdlwiKTtcbiAgICBsaW5rc0Rpdi5zdHlsZS5mbG9hdCA9IFwicmlnaHRcIjtcbiAgICBcbiAgICBpZihzZXR0aW5nc1RhYj09PWZhbHNlKSB7XG4gICAgICAgIGxpbmtzRGl2LnN0eWxlLnBhZGRpbmcgPSBcIjEwcHhcIjtcbiAgICAgICAgbGlua3NEaXYuc3R5bGUucGFkZGluZ0xlZnQgPSBcIjE1cHhcIjtcbiAgICAgICAgbGlua3NEaXYuc3R5bGUucGFkZGluZ1JpZ2h0ID0gXCIxNXB4XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGlua3NEaXYuc3R5bGUucGFkZGluZyA9IFwiMTVweFwiO1xuICAgICAgICBsaW5rc0Rpdi5zdHlsZS5wYWRkaW5nTGVmdCA9IFwiMTVweFwiO1xuICAgICAgICBsaW5rc0Rpdi5zdHlsZS5wYWRkaW5nUmlnaHQgPSBcIjE1cHhcIjtcbiAgICAgICAgbGlua3NEaXYuc3R5bGUubWFyZ2luTGVmdCA9IFwiMTVweFwiOyAgICBcbiAgICB9XG5cbiAgICBjb25zdCBjb2ZmZWVTcGFuID0gbGlua3NEaXYuY3JlYXRlU3BhbihcImNvZmZlZVwiKTtcbiAgICBjb2ZmZWVTcGFuLmFkZENsYXNzKFwiZXgtY29mZmVlLXNwYW5cIik7XG4gICAgY29uc3QgY29mZmVlTGluayA9IGNvZmZlZVNwYW4uY3JlYXRlRWwoXCJhXCIsIHsgaHJlZjogXCJodHRwczovL2JpdC5seS9vNDIta29maVwiIH0pO1xuICAgIC8vIGNvbnN0IGNvZmZlZUxvZ28gPSBzZXR0aW5nc1RhYiA/IFwiaHR0cHM6Ly9jZG4ua28tZmkuY29tL2Nkbi9rb2ZpMy5wbmc/dj0zXCIgOiBcImh0dHBzOi8vdXBsb2Fkcy1zc2wud2ViZmxvdy5jb20vNWMxNGUzODdkYWI1NzZmZTY2NzY4OWNmLzYxZTExMTY3NzlmYzBhOWJkNWJkYmNjN19GcmFtZSUyMDYucG5nXCJcbiAgICBjb25zdCBjb2ZmZWVJbWcgPSBjb2ZmZWVMaW5rLmNyZWF0ZUVsKFwiaW1nXCIsIHsgYXR0cjogeyBzcmM6IFwiaHR0cHM6Ly9jZG4ua28tZmkuY29tL2Nkbi9rb2ZpMy5wbmc/dj0zXCIgfSB9KTtcbiAgICBjb2ZmZWVJbWcuaGVpZ2h0ID0gbGlua0hlaWdodDtcbiAgICBcbiAgICBjb25zdCB0d2l0dGVyU3BhbiA9IGxpbmtzRGl2LmNyZWF0ZVNwYW4oXCJjb2ZmZWVcIik7XG4gICAgdHdpdHRlclNwYW4uYWRkQ2xhc3MoXCJleC10d2l0dGVyLXNwYW5cIik7XG4gICAgdHdpdHRlclNwYW4uc3R5bGUucGFkZGluZ0xlZnQgPSBcIjEwcHhcIjtcbiAgICBjb25zdCB0d2l0dGVyTGluayA9IHR3aXR0ZXJTcGFuLmNyZWF0ZUVsKFwiYVwiLCB7IGhyZWY6IFwiaHR0cHM6Ly9iaXQubHkvbzQyLXR3aXR0ZXJcIiB9KTtcbiAgICBjb25zdCB0d2l0dGVySW1nID0gdHdpdHRlckxpbmsuY3JlYXRlRWwoXCJpbWdcIiwgeyBhdHRyOiB7IHNyYzogXCJodHRwczovL2Nkbi5jZG5sb2dvLmNvbS9sb2dvcy90Lzk2L3R3aXR0ZXItaWNvbi5zdmdcIiB9IH0pO1xuICAgIHR3aXR0ZXJJbWcuaGVpZ2h0ID0gbGlua0hlaWdodDtcblxuICAgIGNvbnN0IG1lZGl1bVNwYW4gPSBsaW5rc0Rpdi5jcmVhdGVTcGFuKFwiY29mZmVlXCIpO1xuICAgIG1lZGl1bVNwYW4uYWRkQ2xhc3MoXCJleC10d2l0dGVyLXNwYW5cIik7XG4gICAgbWVkaXVtU3Bhbi5zdHlsZS5wYWRkaW5nTGVmdCA9IFwiMTBweFwiO1xuICAgIG1lZGl1bVNwYW4uc3R5bGUucmlnaHQgPSBcIjBcIjtcbiAgICBjb25zdCBtZWRpdW1MaW5rID0gbWVkaXVtU3Bhbi5jcmVhdGVFbChcImFcIiwgeyBocmVmOiBcImh0dHBzOi8vYml0Lmx5L280Mi1tZWRpdW1cIiB9KTtcbiAgICBjb25zdCBtZWRpdW1JbWcgPSBtZWRpdW1MaW5rLmNyZWF0ZUVsKFwiaW1nXCIsIHsgYXR0cjogeyBzcmM6IFwiaHR0cHM6Ly9taXJvLm1lZGl1bS5jb20vdjIvcmVzaXplOmZpbGw6MTc2OjE3Ni8xKnNIaHRZaGFDZTJVYzNJVTBJZ0t3SVEucG5nXCIgfSB9KTtcbiAgICBtZWRpdW1JbWcuaGVpZ2h0ID0gbGlua0hlaWdodDtcblxuICAgIHJldHVybiBsaW5rc0Rpdjtcbn1cblxuIiwgImltcG9ydCB7IE1vZGFsLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IEJldGFQbHVnaW5zIGZyb20gJy4uL2ZlYXR1cmVzL0JldGFQbHVnaW5zJztcbmltcG9ydCBUaGVQbHVnaW4gZnJvbSAnLi4vbWFpbic7XG5pbXBvcnQgeyBUb2FzdE1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9ub3RpZmljYXRpb25zJztcbmltcG9ydCB7IHByb21vdGlvbmFsTGlua3MgfSBmcm9tICcuL1Byb21vdGlvbmFsJztcbmltcG9ydCB7IGV4aXN0QmV0YVBsdWdpbkluTGlzdCB9IGZyb20gJy4vc2V0dGluZ3MnO1xuXG4vKipcbiAqIEFkZCBhIGJldGEgcGx1Z2luIHRvIHRoZSBsaXN0IG9mIHBsdWdpbnMgYmVpbmcgdHJhY2tlZCBhbmQgdXBkYXRlZFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZGROZXdQbHVnaW5Nb2RhbCBleHRlbmRzIE1vZGFsIHtcbiAgICBwbHVnaW46IFRoZVBsdWdpbjtcbiAgICBiZXRhUGx1Z2luczogQmV0YVBsdWdpbnM7XG4gICAgYWRkcmVzczogc3RyaW5nO1xuICAgIG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHM6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgdXNlRnJvemVuVmVyc2lvbjogYm9vbGVhbjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IFRoZVBsdWdpbiwgYmV0YVBsdWdpbnM6IEJldGFQbHVnaW5zLCBvcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzID0gZmFsc2UsIHVzZUZyb3plblZlcnNpb24gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihwbHVnaW4uYXBwKTtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgICAgIHRoaXMuYmV0YVBsdWdpbnMgPSBiZXRhUGx1Z2lucztcbiAgICAgICAgdGhpcy5hZGRyZXNzID0gXCJcIjtcbiAgICAgICAgdGhpcy5vcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzID0gb3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcztcbiAgICAgICAgdGhpcy51c2VGcm96ZW5WZXJzaW9uID0gdXNlRnJvemVuVmVyc2lvbjtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gXCJcIjtcbiAgICB9XG5cbiAgICBhc3luYyBzdWJtaXRGb3JtKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5hZGRyZXNzID09PSBcIlwiKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNjcnViYmVkQWRkcmVzcyA9IHRoaXMuYWRkcmVzcy5yZXBsYWNlKFwiaHR0cHM6Ly9naXRodWIuY29tL1wiLFwiXCIpO1xuICAgICAgICBpZiAoYXdhaXQgZXhpc3RCZXRhUGx1Z2luSW5MaXN0KHRoaXMucGx1Z2luLCBzY3J1YmJlZEFkZHJlc3MpKSB7XG4gICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGBUaGlzIHBsdWdpbiBpcyBhbHJlYWR5IGluIHRoZSBsaXN0IGZvciBiZXRhIHRlc3RpbmdgLCAxMCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5iZXRhUGx1Z2lucy5hZGRQbHVnaW4oc2NydWJiZWRBZGRyZXNzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0aGlzLnZlcnNpb24pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk9wZW4oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGVudEVsLmNyZWF0ZUVsKCdoNCcsIHsgdGV4dDogXCJHaXRodWIgcmVwb3NpdG9yeSBmb3IgYmV0YSBwbHVnaW46XCIgfSk7XG4gICAgICAgIHRoaXMuY29udGVudEVsLmNyZWF0ZUVsKCdmb3JtJywge30sIChmb3JtRWwpID0+IHtcbiAgICAgICAgICAgIGZvcm1FbC5hZGRDbGFzcyhcImJyYXQtbW9kYWxcIilcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGZvcm1FbClcbiAgICAgICAgICAgICAgICAuYWRkVGV4dCgodGV4dEVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRFbC5zZXRQbGFjZWhvbGRlcignUmVwb3NpdG9yeSAoZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL0dpdHViVXNlck5hbWUvcmVwb3NpdG9yeS1uYW1lKScpO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3MgPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgYXN5bmMgKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiB0aGlzLmFkZHJlc3MgIT09ICcgJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudXNlRnJvemVuVmVyc2lvbiAmJiB0aGlzLnZlcnNpb24gIT09IFwiXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIXRoaXMudXNlRnJvemVuVmVyc2lvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN1Ym1pdEZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy51c2VGcm96ZW5WZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgbmV3IFNldHRpbmcoZm9ybUVsKVxuICAgICAgICAgICAgICAgICAgICAuYWRkVGV4dCgodGV4dEVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuc2V0UGxhY2Vob2xkZXIoJ1NwZWNpZnkgdGhlIHJlbGVhc2UgdmVyc2lvbiB0YWcgKGV4YW1wbGU6IDEuMC4wKScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVsLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVsLmlucHV0RWwuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1FbC5jcmVhdGVEaXYoJ21vZGFsLWJ1dHRvbi1jb250YWluZXInLCAoYnV0dG9uQ29udGFpbmVyRWwpID0+IHtcbiAgICAgICAgICAgICAgICBidXR0b25Db250YWluZXJFbFxuICAgICAgICAgICAgICAgICAgICAuY3JlYXRlRWwoJ2J1dHRvbicsIHsgYXR0cjogeyB0eXBlOiAnYnV0dG9uJyB9LCB0ZXh0OiAnTmV2ZXIgbWluZCcgfSlcbiAgICAgICAgICAgICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICAgICAgICAgICAgICBidXR0b25Db250YWluZXJFbC5jcmVhdGVFbCgnYnV0dG9uJywge1xuICAgICAgICAgICAgICAgICAgICBhdHRyOiB7IHR5cGU6ICdzdWJtaXQnIH0sXG4gICAgICAgICAgICAgICAgICAgIGNsczogJ21vZC1jdGEnLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQWRkIFBsdWdpbicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgbmV3RGl2ID0gZm9ybUVsLmNyZWF0ZURpdigpO1xuICAgICAgICAgICAgbmV3RGl2LnN0eWxlLmJvcmRlclRvcCA9IFwiMXB4IHNvbGlkICNjY2NcIjtcbiAgICAgICAgICAgIG5ld0Rpdi5zdHlsZS5tYXJnaW5Ub3AgPSBcIjMwcHhcIjtcbiAgICAgICAgICAgIGNvbnN0IGJ5VGZUaGFja2VyID0gbmV3RGl2LmNyZWF0ZVNwYW4oKTtcbiAgICAgICAgICAgIGJ5VGZUaGFja2VyLmlubmVySFRNTCA9IFwiQlJBVCBieSA8YSBocmVmPSdodHRwczovL2JpdC5seS9vNDItdHdpdHRlcic+VEZUSGFja2VyPC9hPlwiO1xuICAgICAgICAgICAgYnlUZlRoYWNrZXIuc3R5bGUuZm9udFN0eWxlID0gXCJpdGFsaWNcIjtcbiAgICAgICAgICAgIG5ld0Rpdi5hcHBlbmRDaGlsZChieVRmVGhhY2tlcik7XG4gICAgICAgICAgICBwcm9tb3Rpb25hbExpbmtzKG5ld0RpdiwgZmFsc2UpO1xuXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBmb3JtRWwucXVlcnlTZWxlY3RvckFsbChcIi5icmF0LW1vZGFsIC5zZXR0aW5nLWl0ZW0taW5mb1wiKTtcbiAgICAgICAgICAgICAgICB0aXRsZS5mb3JFYWNoKCh0aXRsZUVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlRWwucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIDUwKVxuXG5cbiAgICAgICAgICAgIC8vIGludm9rZWQgd2hlbiBidXR0b24gaXMgY2xpY2tlZC4gXG4gICAgICAgICAgICBmb3JtRWwuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgYXN5bmMgKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZHJlc3MgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnVzZUZyb3plblZlcnNpb24gJiYgdGhpcy52ZXJzaW9uICE9PSBcIlwiKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghdGhpcy51c2VGcm96ZW5WZXJzaW9uKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3VibWl0Rm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBhc3luYyBvbkNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZih0aGlzLm9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMpIHtcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLnBsdWdpbiBhcyBhbnkpLmFwcC5zZXR0aW5nLm9wZW4oKTtcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLnBsdWdpbiBhcyBhbnkpLmFwcC5zZXR0aW5nLm9wZW5UYWJCeUlkKFwib2JzaWRpYW40Mi1icmF0XCIpO1xuICAgICAgICB9XG5cbiAgICB9XG59IiwgImltcG9ydCBUaGVQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcbmltcG9ydCBBZGROZXdQbHVnaW5Nb2RhbCBmcm9tIFwiLi4vdWkvQWRkTmV3UGx1Z2luTW9kYWxcIjtcbmltcG9ydCB7IGdyYWJNYW5pZmVzdEpzb25Gcm9tUmVwb3NpdG9yeSwgZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnkgfSBmcm9tIFwiLi9naXRodWJVdGlsc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplUGF0aCwgUGx1Z2luTWFuaWZlc3QsIE5vdGljZSwgcmVxdWlyZUFwaVZlcnNpb24sIGFwaVZlcnNpb24gfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IGFkZEJldGFQbHVnaW5Ub0xpc3QgfSBmcm9tIFwiLi4vdWkvc2V0dGluZ3NcIjtcbmltcG9ydCB7IFRvYXN0TWVzc2FnZSB9IGZyb20gXCIuLi91dGlscy9ub3RpZmljYXRpb25zXCI7XG5pbXBvcnQgeyBpc0Nvbm5lY3RlZFRvSW50ZXJuZXQgfSBmcm9tIFwiLi4vdXRpbHMvaW50ZXJuZXRjb25uZWN0aW9uXCI7XG5cbi8qKlxuICogYWxsIHRoZSBmaWxlcyBuZWVkZWQgZm9yIGEgcGx1Z2luIGJhc2VkIG9uIHRoZSByZWxlYXNlIGZpbGVzIGFyZSBocmVcbiAqL1xuaW50ZXJmYWNlIFJlbGVhc2VGaWxlcyB7XG4gICAgbWFpbkpzOiAgICAgc3RyaW5nIHwgbnVsbDtcbiAgICBtYW5pZmVzdDogICBzdHJpbmcgfCBudWxsO1xuICAgIHN0eWxlczogICAgIHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogUHJpbWFyeSBoYW5kbGVyIGZvciBhZGRpbmcsIHVwZGF0aW5nLCBkZWxldGluZyBiZXRhIHBsdWdpbnMgdHJhY2tlZCBieSB0aGlzIHBsdWdpblxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCZXRhUGx1Z2lucyB7XG4gICAgcGx1Z2luOiBUaGVQbHVnaW47XG5cbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IFRoZVBsdWdpbikge1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBvcGVucyB0aGUgQWRkTmV3UGx1Z2luTW9kYWwgdG8gZ2V0IGluZm8gZm9yICBhIG5ldyBiZXRhIHBsdWdpblxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgIG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMgd2lsbCBvcGVuIHNldHRpbmdzIHNjcmVlbiBhZnRlcndhcmRzLiBVc2VkIHdoZW4gdGhpcyBjb21tYW5kIGlzIGNhbGxlZCBmcm9tIHNldHRpbmdzIHRhYlxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgIHVzZUZyb3plblZlcnNpb24gICAgICAgICAgaW5zdGFsbCB0aGUgcGx1Z2luIHVzaW5nIGZyb3plbiB2ZXJzaW9uLlxuICAgICAqIEByZXR1cm4gIHs8UHJvbWlzZT48dm9pZD59XG4gICAgICovXG4gICAgYXN5bmMgZGlzcGxheUFkZE5ld1BsdWdpbk1vZGFsKG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMgPSBmYWxzZSwgdXNlRnJvemVuVmVyc2lvbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG5ld1BsdWdpbiA9IG5ldyBBZGROZXdQbHVnaW5Nb2RhbCh0aGlzLnBsdWdpbiwgdGhpcywgb3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcywgdXNlRnJvemVuVmVyc2lvbik7XG4gICAgICAgIG5ld1BsdWdpbi5vcGVuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIHRoYXQgYSBHaXRIdWIgcmVwb3NpdG9yeSBpcyBwbHVnaW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeVBhdGggICBHaXRodWJVc2VyL1JlcG9zaXRvcnlOYW1lIChleGFtcGxlOiBUZlRoYWNrZXIvb2JzaWRpYW40Mi1icmF0KVxuICAgICAqIEBwYXJhbSAgIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICAgZ2V0QmV0YU1hbmlmZXN0ICB0ZXN0IHRoZSBiZXRhIHZlcnNpb24gb2YgdGhlIG1hbmlmZXN0LCBub3QgYXQgdGhlIHJvb3RcbiAgICAgKiBAcGFyYW0gICB7W3R5cGVdfSAgICAgICAgICAgICAgICAgICAgIGZhbHNlICAgICAgICAgICAgW2ZhbHNlIGRlc2NyaXB0aW9uXVxuICAgICAqIEBwYXJhbSAgIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICAgcmVwb3J0SXNzdWVzICAgICAgd2lsbCBkaXNwbGF5IG5vdGljZXMgYXMgaXQgZmluZHMgaXNzdWVzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuICB7UHJvbWlzZTxQbHVnaW5NYW5pZmVzdD59ICAgICAgICAgICAgICAgICAgICAgdGhlIG1hbmlmZXN0IGZpbGUgaWYgZm91bmQsIG9yIG51bGwgaWYgaXRzIGluY29tcGxldGVcbiAgICAgKi9cbiAgICBhc3luYyB2YWxpZGF0ZVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGg6IHN0cmluZywgZ2V0QmV0YU1hbmlmZXN0ID0gZmFsc2UsIHJlcG9ydElzc3VlcyA9IGZhbHNlKTogUHJvbWlzZTxQbHVnaW5NYW5pZmVzdHxudWxsPiB7XG4gICAgICAgIGNvbnN0IG5vdGljZVRpbWVvdXQgPSAxNTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3RKc29uID0gYXdhaXQgZ3JhYk1hbmlmZXN0SnNvbkZyb21SZXBvc2l0b3J5KHJlcG9zaXRvcnlQYXRoLCAhZ2V0QmV0YU1hbmlmZXN0LCB0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z2dpbmdNb2RlKTtcbiAgICAgICAgaWYgKCFtYW5pZmVzdEpzb24pIHsgLy8gdGhpcyBpcyBhIHBsdWdpbiB3aXRoIGEgbWFuaWZlc3QganNvbiwgdHJ5IHRvIHNlZSBpZiB0aGVyZSBpcyBhIGJldGEgdmVyc2lvblxuICAgICAgICAgICAgaWYgKHJlcG9ydElzc3VlcykgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgJHtyZXBvc2l0b3J5UGF0aH1cXG5UaGlzIGRvZXMgbm90IHNlZW0gdG8gYmUgYW4gb2JzaWRpYW4gcGx1Z2luLCBhcyB0aGVyZSBpcyBubyBtYW5pZmVzdC5qc29uIGZpbGUuYCwgbm90aWNlVGltZW91dCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUZXN0IHRoYXQgdGhlIG1haW5mZXN0IGhhcyBzb21lIGtleSBlbGVtZW50cywgbGlrZSBJRCBhbmQgdmVyc2lvblxuICAgICAgICBpZiAoIShcImlkXCIgaW4gbWFuaWZlc3RKc29uKSkgeyAvLyB0aGlzIGlzIGEgcGx1Z2luIHdpdGggYSBtYW5pZmVzdCBqc29uLCB0cnkgdG8gc2VlIGlmIHRoZXJlIGlzIGEgYmV0YSB2ZXJzaW9uXG4gICAgICAgICAgICBpZiAocmVwb3J0SXNzdWVzKSBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sYCR7cmVwb3NpdG9yeVBhdGh9XFxuVGhlIHBsdWdpbiBpZCBhdHRyaWJ1dGUgZm9yIHRoZSByZWxlYXNlIGlzIG1pc3NpbmcgZnJvbSB0aGUgbWFuaWZlc3QgZmlsZWAsIG5vdGljZVRpbWVvdXQpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoXCJ2ZXJzaW9uXCIgaW4gbWFuaWZlc3RKc29uKSkgeyAvLyB0aGlzIGlzIGEgcGx1Z2luIHdpdGggYSBtYW5pZmVzdCBqc29uLCB0cnkgdG8gc2VlIGlmIHRoZXJlIGlzIGEgYmV0YSB2ZXJzaW9uXG4gICAgICAgICAgICBpZiAocmVwb3J0SXNzdWVzKSBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sYCR7cmVwb3NpdG9yeVBhdGh9XFxuVGhlIHZlcnNpb24gYXR0cmlidXRlIGZvciB0aGUgcmVsZWFzZSBpcyBtaXNzaW5nIGZyb20gdGhlIG1hbmlmZXN0IGZpbGVgLCBub3RpY2VUaW1lb3V0KTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYW5pZmVzdEpzb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgdGhlIHJlbGVhc2UgZmlsZXMgYmFzZWQgb24gdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBtYW5pZmVzdFxuICAgICAqXG4gICAgICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5UGF0aCAgcGF0aCB0byB0aGUgR2l0SHViIHJlcG9zaXRvcnlcbiAgICAgKiBAcGFyYW0gICB7UGx1Z2luTWFuaWZlc3Q8UmVsZWFzZUZpbGVzPn0gIG1hbmlmZXN0ICAgICAgICBtYW5pZmVzdCBmaWxlXG4gICAgICogQHBhcmFtICAge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICAgICBnZXRNYW5pZmVzdCAgICAgZ3JhYiB0aGUgcmVtb3RlIG1hbmlmZXN0IGZpbGVcbiAgICAgKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnlWZXJzaW9uICBncmFiIHRoZSBzcGVjaWZpZWQgdmVyc2lvbiBpZiBzZXRcbiAgICAgKlxuICAgICAqIEByZXR1cm4gIHtQcm9taXNlPFJlbGVhc2VGaWxlcz59ICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCByZWxhc2UgZmlsZXMgYXMgc3RyaW5ncyBiYXNlZCBvbiB0aGUgUmVsZWFzZUZpbGVzIGludGVyYWZhY2VcbiAgICAgKi9cbiAgICBhc3luYyBnZXRBbGxSZWxlYXNlRmlsZXMocmVwb3NpdG9yeVBhdGg6IHN0cmluZywgbWFuaWZlc3Q6IFBsdWdpbk1hbmlmZXN0LCBnZXRNYW5pZmVzdDogYm9vbGVhbiwgc3BlY2lmeVZlcnNpb24gPSBcIlwiKTogUHJvbWlzZTxSZWxlYXNlRmlsZXM+IHtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHNwZWNpZnlWZXJzaW9uID09PSBcIlwiID8gbWFuaWZlc3QudmVyc2lvbiA6IHNwZWNpZnlWZXJzaW9uO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgdmVyc2lvbiBzcGVjaWZpZWQsIHdlIGFsd2F5cyB3YW50IHRvIGdldCB0aGUgcmVtb3RlIG1hbmlmZXN0IGZpbGUuXG4gICAgICAgIGNvbnN0IHJlYWxseUdldE1hbmlmZXN0T3JOb3QgPSBnZXRNYW5pZmVzdCB8fCAoc3BlY2lmeVZlcnNpb24gIT09IFwiXCIpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYWluSnM6IGF3YWl0IGdyYWJSZWxlYXNlRmlsZUZyb21SZXBvc2l0b3J5KHJlcG9zaXRvcnlQYXRoLCB2ZXJzaW9uLCBcIm1haW4uanNcIiwgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdnaW5nTW9kZSksXG4gICAgICAgICAgICBtYW5pZmVzdDogcmVhbGx5R2V0TWFuaWZlc3RPck5vdCA/IGF3YWl0IGdyYWJSZWxlYXNlRmlsZUZyb21SZXBvc2l0b3J5KHJlcG9zaXRvcnlQYXRoLCB2ZXJzaW9uLCBcIm1hbmlmZXN0Lmpzb25cIiwgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdnaW5nTW9kZSkgOiBcIlwiLFxuICAgICAgICAgICAgc3R5bGVzOiBhd2FpdCBncmFiUmVsZWFzZUZpbGVGcm9tUmVwb3NpdG9yeShyZXBvc2l0b3J5UGF0aCwgdmVyc2lvbiwgXCJzdHlsZXMuY3NzXCIsIHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnZ2luZ01vZGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgdGhlIHBsdWdpbiByZWxlYXNlIGZpbGVzIHRvIHRoZSBsb2NhbCBvYnNpZGlhbiAucGx1Z2lucyBmb2xkZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICBiZXRhUGx1Z2luSUQgIHRoZSBpZCBvZiB0aGUgcGx1Z2luIChub3QgdGhlIHJlcG9zaXRvcnkgcGF0aClcbiAgICAgKiBAcGFyYW0gICB7UmVsZWFzZUZpbGVzPHZvaWQ+fSAgcmVsRmlsZXMgICAgICByZWxlYXNlIGZpbGUgYXMgc3RyaW5ncywgYmFzZWQgb24gdGhlIFJlbGVhc2VGaWxlcyBpbnRlcmZhY2VcbiAgICAgKlxuICAgICAqIEByZXR1cm4gIHtQcm9taXNlPHZvaWQ+fSAgICAgICAgICAgICAgICAgICAgIFxuICAgICAqL1xuICAgIGFzeW5jIHdyaXRlUmVsZWFzZUZpbGVzVG9QbHVnaW5Gb2xkZXIoYmV0YVBsdWdpbklEOiBzdHJpbmcsIHJlbEZpbGVzOiBSZWxlYXNlRmlsZXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGx1Z2luVGFyZ2V0Rm9sZGVyUGF0aCA9IG5vcm1hbGl6ZVBhdGgodGhpcy5wbHVnaW4uYXBwLnZhdWx0LmNvbmZpZ0RpciArIFwiL3BsdWdpbnMvXCIgKyBiZXRhUGx1Z2luSUQpICsgXCIvXCI7XG4gICAgICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlcjtcbiAgICAgICAgaWYgKGF3YWl0IGFkYXB0ZXIuZXhpc3RzKHBsdWdpblRhcmdldEZvbGRlclBhdGgpID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgIShhd2FpdCBhZGFwdGVyLmV4aXN0cyhwbHVnaW5UYXJnZXRGb2xkZXJQYXRoICsgXCJtYW5pZmVzdC5qc29uXCIpKSkge1xuICAgICAgICAgICAgLy8gaWYgcGx1Z2luIGZvbGRlciBkb2VzbnQgZXhpc3Qgb3IgbWFuaWZlc3QuanNvbiBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgaXQgYW5kIHNhdmUgdGhlIHBsdWdpbiBmaWxlc1xuICAgICAgICAgICAgYXdhaXQgYWRhcHRlci5ta2RpcihwbHVnaW5UYXJnZXRGb2xkZXJQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBhZGFwdGVyLndyaXRlKHBsdWdpblRhcmdldEZvbGRlclBhdGggKyBcIm1haW4uanNcIiwgcmVsRmlsZXMubWFpbkpzKTtcbiAgICAgICAgYXdhaXQgYWRhcHRlci53cml0ZShwbHVnaW5UYXJnZXRGb2xkZXJQYXRoICsgXCJtYW5pZmVzdC5qc29uXCIsIHJlbEZpbGVzLm1hbmlmZXN0KTtcbiAgICAgICAgaWYgKHJlbEZpbGVzLnN0eWxlcykgYXdhaXQgYWRhcHRlci53cml0ZShwbHVnaW5UYXJnZXRGb2xkZXJQYXRoICsgXCJzdHlsZXMuY3NzXCIsIHJlbEZpbGVzLnN0eWxlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBmdW5jdGlvbiBmb3IgYWRkaW5nIGEgbmV3IGJldGEgcGx1Z2luIHRvIE9ic2lkaWFuLiBcbiAgICAgKiBBbHNvIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdXBkYXRpbmcgZXhpc3RpbmcgcGx1Z2lucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICByZXBvc2l0b3J5UGF0aCAgICAgcGF0aCB0byBHaXRIdWIgcmVwb3NpdG9yeSBmb3JtYXRlZCBhcyBVU0VSTkFNRS9yZXBvc2l0b3J5XG4gICAgICogQHBhcmFtICAge2Jvb2xlYW59ICAgICAgICAgICAgIHVwZGF0ZVBsdWdpbkZpbGVzICB0cnVlIGlmIHRoaXMgaXMganVzdCBhbiB1cGRhdGUgbm90IGFuIGluc3RhbGxcbiAgICAgKiBAcGFyYW0gICB7Ym9vbGVhbn0gICAgICAgICAgICAgc2VlSWZVcGRhdGVkT25seSAgIGlmIHRydWUsIGFuZCB1cGRhdGVQbHVnaW5GaWxlcyB0cnVlLCB3aWxsIGp1c3QgY2hlY2sgZm9yIHVwZGF0ZXMsIGJ1dCBub3QgZG8gdGhlIHVwZGF0ZS4gd2lsbCByZXBvcnQgdG8gdXNlciB0aGF0IHRoZXJlIGlzIGEgbmV3IHBsdWdpblxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgICAgICAgICAgICByZXBvcnRJZk5vdFVwZHRlZCAgaWYgdHJ1ZSwgcmVwb3J0IGlmIGFuIHVwZGF0ZSBoYXMgbm90IHN1Y2NlZFxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICBzcGVjaWZ5VmVyc2lvbiAgICAgaWYgbm90IGVtcHR5LCBuZWVkIHRvIGluc3RhbGwgYSBzcGVjaWZpZWQgdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSB2YWx1ZSBpbiBtYW5pZmVzdHstYmV0YX0uanNvblxuICAgICAqXG4gICAgICogQHJldHVybiAge1Byb21pc2U8Ym9vbGVhbj59ICAgICAgICAgICAgICAgICAgICAgICB0cnVlIGlmIHN1Y2NlZWRzXG4gICAgICovXG4gICAgYXN5bmMgYWRkUGx1Z2luKHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIHVwZGF0ZVBsdWdpbkZpbGVzID0gZmFsc2UsIHNlZUlmVXBkYXRlZE9ubHkgPSBmYWxzZSwgcmVwb3J0SWZOb3RVcGR0ZWQgPSBmYWxzZSwgc3BlY2lmeVZlcnNpb24gPSBcIlwiKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IG5vdGljZVRpbWVvdXQgPSAxMDtcbiAgICAgICAgbGV0IHByaW1hcnlNYW5pZmVzdCA9IGF3YWl0IHRoaXMudmFsaWRhdGVSZXBvc2l0b3J5KHJlcG9zaXRvcnlQYXRoLCB0cnVlLCBmYWxzZSk7IC8vIGF0dGVtcHQgdG8gZ2V0IG1hbmlmZXN0LWJldGEuanNvblxuICAgICAgICBjb25zdCB1c2luZ0JldGFNYW5pZmVzdDogYm9vbGVhbiA9IHByaW1hcnlNYW5pZmVzdCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgaWYgKHVzaW5nQmV0YU1hbmlmZXN0ID09PSBmYWxzZSlcbiAgICAgICAgICAgIHByaW1hcnlNYW5pZmVzdCA9IGF3YWl0IHRoaXMudmFsaWRhdGVSZXBvc2l0b3J5KHJlcG9zaXRvcnlQYXRoLCBmYWxzZSwgdHJ1ZSk7IC8vIGF0dGVtcHQgdG8gZ2V0IG1hbmlmZXN0Lmpzb25cblxuICAgICAgICBpZiAocHJpbWFyeU1hbmlmZXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgJHtyZXBvc2l0b3J5UGF0aH1cXG5BIG1hbmlmZXN0Lmpzb24gb3IgbWFuaWZlc3QtYmV0YS5qc29uIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSByZXBvc2l0b3J5LiBUaGlzIHBsdWdpbiBjYW5ub3QgYmUgaW5zdGFsbGVkLmA7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnLCB0cnVlKTtcbiAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYCR7bXNnfWAsIG5vdGljZVRpbWVvdXQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwcmltYXJ5TWFuaWZlc3QuaGFzT3duUHJvcGVydHkoJ3ZlcnNpb24nKSkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7cmVwb3NpdG9yeVBhdGh9XFxuVGhlIG1hbmlmZXN0JHt1c2luZ0JldGFNYW5pZmVzdCA/IFwiLWJldGFcIiA6IFwiXCJ9Lmpzb24gZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHJlcG9zaXRvcnkgZG9lcyBub3QgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGluIHRoZSBmaWxlLiBUaGlzIHBsdWdpbiBjYW5ub3QgYmUgaW5zdGFsbGVkLmA7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnLCB0cnVlKTtcbiAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYCR7bXNnfWAsIG5vdGljZVRpbWVvdXQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbWFuaWZlc3QgbWluQXBwVmVyc2lvbiBhbmQgY3VycmVudCB2ZXJzaW9uIG9mIE9iaXNpZGFuLCBkb24ndCBsb2FkIHBsdWdpbiBpZiBub3QgY29tcGF0aWJsZVxuICAgICAgICBpZihwcmltYXJ5TWFuaWZlc3QuaGFzT3duUHJvcGVydHkoJ21pbkFwcFZlcnNpb24nKSkgeyBcbiAgICAgICAgICAgIGlmKCAhcmVxdWlyZUFwaVZlcnNpb24ocHJpbWFyeU1hbmlmZXN0Lm1pbkFwcFZlcnNpb24pICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBQbHVnaW46ICR7cmVwb3NpdG9yeVBhdGh9XFxuXFxuYCtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlIG1hbmlmZXN0JHt1c2luZ0JldGFNYW5pZmVzdCA/IFwiLWJldGFcIiA6IFwiXCJ9Lmpzb24gZm9yIHRoaXMgcGx1Z2luIGluZGljYXRlcyB0aGF0IHRoZSBPYnNpZGlhbiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdmVyc2lvbiBvZiB0aGUgYXBwIG5lZWRzIHRvIGJlICR7cHJpbWFyeU1hbmlmZXN0Lm1pbkFwcFZlcnNpb259LCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYnV0IHRoaXMgaW5zdGFsbGF0aW9uIG9mIE9ic2lkaWFuIGlzICR7YXBpVmVyc2lvbn0uIFxcblxcbllvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHlvdXIgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYE9ic2lkaWFuIHRvIHVzZSB0aGlzIHBsdWdpbiBvciBjb250YWN0IHRoZSBwbHVnaW4gZGV2ZWxvcGVyIGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgJHttc2d9YCwgMzApO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBnZXRSZWxlYXNlID0gYXN5bmMgKCkgPT4geyBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgckZpbGVzID0gYXdhaXQgdGhpcy5nZXRBbGxSZWxlYXNlRmlsZXMocmVwb3NpdG9yeVBhdGgsIHByaW1hcnlNYW5pZmVzdCBhcyBQbHVnaW5NYW5pZmVzdCwgdXNpbmdCZXRhTWFuaWZlc3QsIHNwZWNpZnlWZXJzaW9uKTtcbiAgICAgICAgICAgIGlmICh1c2luZ0JldGFNYW5pZmVzdCB8fCByRmlsZXMubWFuaWZlc3QgPT09IFwiXCIpICAvL2lmIGJldGEsIHVzZSB0aGF0IG1hbmlmZXN0LCBvciBpZiB0aGVyZSBpcyBubyBtYW5pZmVzdCBpbiByZWxlYXNlLCB1c2UgdGhlIHByaW1hcnlNYW5pZmVzdFxuICAgICAgICAgICAgICAgIHJGaWxlcy5tYW5pZmVzdCA9IEpTT04uc3RyaW5naWZ5KHByaW1hcnlNYW5pZmVzdCk7XG5cbiAgICAgICAgICAgIGlmIChyRmlsZXMubWFpbkpzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7cmVwb3NpdG9yeVBhdGh9XFxuVGhlIHJlbGVhc2UgaXMgbm90IGNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgZG93bmxvYWQuIG1haW4uanMgaXMgbWlzc2luZyBmcm9tIHRoZSBSZWxlYXNlYDtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGAke21zZ31gLCBub3RpY2VUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByRmlsZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlUGx1Z2luRmlsZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb25zdCByZWxlYXNlRmlsZXMgPSBhd2FpdCBnZXRSZWxlYXNlKCk7XG4gICAgICAgICAgICBpZiAocmVsZWFzZUZpbGVzID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlUmVsZWFzZUZpbGVzVG9QbHVnaW5Gb2xkZXIocHJpbWFyeU1hbmlmZXN0LmlkLCByZWxlYXNlRmlsZXMpO1xuICAgICAgICAgICAgYXdhaXQgYWRkQmV0YVBsdWdpblRvTGlzdCh0aGlzLnBsdWdpbiwgcmVwb3NpdG9yeVBhdGgsIHNwZWNpZnlWZXJzaW9uKTtcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uYXBwLnBsdWdpbnMubG9hZE1hbmlmZXN0cygpO1xuICAgICAgICAgICAgY29uc3QgdmVyc2lvblRleHQgPSBzcGVjaWZ5VmVyc2lvbiA9PT0gXCJcIiA/IFwiXCIgOiBgICh2ZXJzaW9uOiAke3NwZWNpZnlWZXJzaW9ufSlgO1xuICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7cmVwb3NpdG9yeVBhdGh9JHt2ZXJzaW9uVGV4dH1cXG5UaGUgcGx1Z2luIGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aCBCUkFULiBZb3UgbWF5IHN0aWxsIG5lZWQgdG8gZW5hYmxlIGl0IHRoZSBDb21tdW5pdHkgUGx1Z2luIExpc3QuYDtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2csIHRydWUpO1xuICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBtc2csIG5vdGljZVRpbWVvdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdGVzdCBpZiB0aGUgcGx1Z2luIG5lZWRzIHRvIGJlIHVwZGF0ZWRcbiAgICAgICAgICAgIC8vIGlmIGEgc3BlY2lmaWVkIHZlcnNpb24gaXMgcHJvdmlkZWQsIHRoZW4gd2Ugc2hhbGwgc2tpcCB0aGUgdXBkYXRlXG4gICAgICAgICAgICBjb25zdCBwbHVnaW5UYXJnZXRGb2xkZXJQYXRoID0gdGhpcy5wbHVnaW4uYXBwLnZhdWx0LmNvbmZpZ0RpciArIFwiL3BsdWdpbnMvXCIgKyBwcmltYXJ5TWFuaWZlc3QuaWQgKyBcIi9cIjtcbiAgICAgICAgICAgIGxldCBsb2NhbE1hbmlmZXN0Q29udGVudHMgPSBcIlwiO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsb2NhbE1hbmlmZXN0Q29udGVudHMgPSBhd2FpdCB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlci5yZWFkKHBsdWdpblRhcmdldEZvbGRlclBhdGggKyBcIm1hbmlmZXN0Lmpzb25cIilcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5lcnJubyA9PT0gLTQwNTggfHwgZS5lcnJubyA9PT0gLTIpIHsgLy8gZmlsZSBkb2VzIG5vdCBleGlzdCwgdHJ5IGluc3RhbGxpbmcgdGhlIHBsdWdpblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZFBsdWdpbihyZXBvc2l0b3J5UGF0aCwgZmFsc2UsIHVzaW5nQmV0YU1hbmlmZXN0LCBmYWxzZSwgc3BlY2lmeVZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZXZlbiB0aG91Z2ggZmFpbGVkLCByZXR1cm4gdHJ1ZSBzaW5jZSBpbnN0YWxsIHdpbGwgYmUgYXR0ZW1wdGVkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJCUkFUIC0gTG9jYWwgTWFuaWZlc3QgTG9hZFwiLCBwcmltYXJ5TWFuaWZlc3QuaWQsIEpTT04uc3RyaW5naWZ5KGUsIG51bGwsIDIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNwZWNpZnlWZXJzaW9uICE9PSBcIlwiIFxuICAgICAgICAgICAgICAgIHx8IHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uLm1hcCh4PT54LnJlcG8pLmluY2x1ZGVzKHJlcG9zaXRvcnlQYXRoKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgZnJvemVuIHZlcnNpb24gcGx1Z2luXG4gICAgICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgVGhlIHZlcnNpb24gb2YgJHtyZXBvc2l0b3J5UGF0aH0gaXMgZnJvemVuLCBub3QgdXBkYXRpbmcuYCwgMyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbE1hbmlmZXN0SlNPTiA9IGF3YWl0IEpTT04ucGFyc2UobG9jYWxNYW5pZmVzdENvbnRlbnRzKTtcbiAgICAgICAgICAgIGlmIChsb2NhbE1hbmlmZXN0SlNPTi52ZXJzaW9uICE9PSBwcmltYXJ5TWFuaWZlc3QudmVyc2lvbikgeyAvL21hbmlmZXN0IGZpbGVzIGFyZSBub3QgdGhlIHNhbWUsIGRvIGFuIHVwZGF0ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGVhc2VGaWxlcyA9IGF3YWl0IGdldFJlbGVhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAocmVsZWFzZUZpbGVzID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VlSWZVcGRhdGVkT25seSkgeyAvLyBkb250IHVwZGF0ZSwganVzdCByZXBvcnQgaXRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYFRoZXJlIGlzIGFuIHVwZGF0ZSBhdmFpbGFibGUgZm9yICR7cHJpbWFyeU1hbmlmZXN0LmlkfSBmcm9tIHZlcnNpb24gJHtsb2NhbE1hbmlmZXN0SlNPTi52ZXJzaW9ufSB0byAke3ByaW1hcnlNYW5pZmVzdC52ZXJzaW9ufS4gYDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZyArIGBbUmVsZWFzZSBJbmZvXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5UGF0aH0vcmVsZWFzZXMvdGFnLyR7cHJpbWFyeU1hbmlmZXN0LnZlcnNpb259KWAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBtc2csIDMwLCBhc3luYyAoKSA9PiB7IHdpbmRvdy5vcGVuKGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5UGF0aH0vcmVsZWFzZXMvdGFnLyR7cHJpbWFyeU1hbmlmZXN0LnZlcnNpb259YCl9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlUmVsZWFzZUZpbGVzVG9QbHVnaW5Gb2xkZXIocHJpbWFyeU1hbmlmZXN0LmlkLCByZWxlYXNlRmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uYXBwLnBsdWdpbnMubG9hZE1hbmlmZXN0cygpO1xuICAgICAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGx1Z2luLmFwcC5wbHVnaW5zLnBsdWdpbnNbcHJpbWFyeU1hbmlmZXN0LmlkXT8ubWFuaWZlc3QpIGF3YWl0IHRoaXMucmVsb2FkUGx1Z2luKHByaW1hcnlNYW5pZmVzdC5pZCk7IC8vcmVsb2FkIGlmIGVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7cHJpbWFyeU1hbmlmZXN0LmlkfVxcblBsdWdpbiBoYXMgYmVlbiB1cGRhdGVkIGZyb20gdmVyc2lvbiAke2xvY2FsTWFuaWZlc3RKU09OLnZlcnNpb259IHRvICR7cHJpbWFyeU1hbmlmZXN0LnZlcnNpb259LiBgO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnICsgYFtSZWxlYXNlIEluZm9dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnlQYXRofS9yZWxlYXNlcy90YWcvJHtwcmltYXJ5TWFuaWZlc3QudmVyc2lvbn0pYCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIG1zZywgMzAsIGFzeW5jICgpID0+IHsgd2luZG93Lm9wZW4oYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnlQYXRofS9yZWxlYXNlcy90YWcvJHtwcmltYXJ5TWFuaWZlc3QudmVyc2lvbn1gKSB9ICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydElmTm90VXBkdGVkKSBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGBObyB1cGRhdGUgYXZhaWxhYmxlIGZvciAke3JlcG9zaXRvcnlQYXRofWAsIDMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlbG9hZHMgYSBwbHVnaW4gKGFzc3VtaW5nIGl0IGhhcyBiZWVuIGVuYWJsZWQgYnkgdXNlcilcbiAgICAgKiBwamVieSwgVGhhbmtzIEJybyBodHRwczovL2dpdGh1Yi5jb20vcGplYnkvaG90LXJlbG9hZC9ibG9iL21hc3Rlci9tYWluLmpzXG4gICAgICogXG4gICAgICogQHBhcmFtICAge3N0cmluZzx2b2lkPn0gICBwbHVnaW5OYW1lICBuYW1lIG9mIHBsdWdpblxuICAgICAqXG4gICAgICogQHJldHVybiAge1Byb21pc2U8dm9pZD59ICAgICAgICAgICAgICBcbiAgICAgKi9cbiAgICBhc3luYyByZWxvYWRQbHVnaW4ocGx1Z2luTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMucGx1Z2luLmFwcC5wbHVnaW5zO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgcGx1Z2lucy5kaXNhYmxlUGx1Z2luKHBsdWdpbk5hbWUpO1xuICAgICAgICAgICAgYXdhaXQgcGx1Z2lucy5lbmFibGVQbHVnaW4ocGx1Z2luTmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgXG4gICAgICAgICAgICBpZih0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z2dpbmdNb2RlKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVsb2FkIHBsdWdpblwiLCBlKSBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHVwZGF0ZXMgYSBiZXRhIHBsdWdpblxuICAgICAqXG4gICAgICogQHBhcmFtICAge3N0cmluZ30gICByZXBvc2l0b3J5UGF0aCAgcmVwb3NpdG9yeSBwYXRoIG9uIEdpdEh1YlxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgb25seUNoZWNrRG9udFVwZGF0ZSBvbmx5IGxvb2tzIGZvciB1cGRhdGVcbiAgICAgKlxuICAgICAqIEByZXR1cm4gIHtQcm9taXNlPHZvaWQ+fSAgICAgICAgICAgICAgICAgIFxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVBsdWdpbihyZXBvc2l0b3J5UGF0aDogc3RyaW5nLCBvbmx5Q2hlY2tEb250VXBkYXRlID0gZmFsc2UsIHJlcG9ydElmTm90VXBkdGVkID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGRQbHVnaW4ocmVwb3NpdG9yeVBhdGgsIHRydWUsIG9ubHlDaGVja0RvbnRVcGRhdGUsIHJlcG9ydElmTm90VXBkdGVkKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UgJiYgb25seUNoZWNrRG9udFVwZGF0ZSA9PT0gZmFsc2UpXG4gICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYCR7cmVwb3NpdG9yeVBhdGh9XFxuVXBkYXRlIG9mIHBsdWdpbiBmYWlsZWQuYClcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB3YWxrcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHBsdWdpbnMgd2l0aG91dCBmcm96ZW4gdmVyc2lvbiBhbmQgcGVyZm9ybXMgYW4gdXBkYXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gICB7Ym9vbGVhbn0gICAgICAgICAgIHNob3dJbmZvICBzaG91bGQgdGhpcyB3aXRoIGEgc3RhcnRlZC9jb21wbGV0ZWQgbWVzc2FnZSAtIHVzZWZ1bCB3aGVuIHJhbiBmcm9tIENQXG4gICAgICogQHJldHVybiAge1Byb21pc2U8dm9pZD59ICAgICAgICAgICAgICBcbiAgICAgKi9cbiAgICBhc3luYyBjaGVja0ZvclVwZGF0ZXNBbmRJbnN0YWxsVXBkYXRlcyhzaG93SW5mbyA9IGZhbHNlLCBvbmx5Q2hlY2tEb250VXBkYXRlID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYoYXdhaXQgaXNDb25uZWN0ZWRUb0ludGVybmV0KCk9PT1mYWxzZSkgeyBcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQlJBVDogTm8gaW50ZXJuZXQgZGV0ZWN0ZWQuXCIpIFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdOb3RpY2U6IE5vdGljZTtcbiAgICAgICAgY29uc3QgbXNnMSA9IGBDaGVja2luZyBmb3IgcGx1Z2luIHVwZGF0ZXMgU1RBUlRFRGA7XG4gICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2cxLCB0cnVlKTtcbiAgICAgICAgaWYgKHNob3dJbmZvICYmIHRoaXMucGx1Z2luLnNldHRpbmdzLm5vdGlmaWNhdGlvbnNFbmFibGVkKSBuZXdOb3RpY2UgPSBuZXcgTm90aWNlKGBCUkFUXFxuJHttc2cxfWAsIDMwMDAwKTtcbiAgICAgICAgY29uc3QgcGx1Z2luU3ViTGlzdEZyb3plblZlcnNpb25OYW1lcyA9IFxuICAgICAgICAgICAgbmV3IFNldCh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbi5tYXAoZiA9PiBmLnJlcG8pKTtcbiAgICAgICAgZm9yIChjb25zdCBicCBvZiB0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5MaXN0KSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luU3ViTGlzdEZyb3plblZlcnNpb25OYW1lcy5oYXMoYnApKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVBsdWdpbihicCwgb25seUNoZWNrRG9udFVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbXNnMiA9IGBDaGVja2luZyBmb3IgcGx1Z2luIHVwZGF0ZXMgQ09NUExFVEVEYDtcbiAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZzIsIHRydWUpO1xuICAgICAgICBpZiAoc2hvd0luZm8pIHtcbiAgICAgICAgICAgIG5ld05vdGljZS5oaWRlKCk7XG4gICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIG1zZzIsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGJldGEgcGx1Z2luIGZyb20gdGhlIGxpc3Qgb2YgYmV0YSBwbHVnaW5zIChkb2VzIG5vdCBkZWxldGUgdGhlbSBmcm9tIGRpc2spXG4gICAgICpcbiAgICAgKiBAcGFyYW0gICB7c3RyaW5nPHZvaWQ+fSAgIGJldGFQbHVnaW5JRCAgcmVwb3NpdG9yeSBwYXRoXG4gICAgICpcbiAgICAgKiBAcmV0dXJuICB7UHJvbWlzZTx2b2lkPn0gICAgICAgICAgICAgICAgW3JldHVybiBkZXNjcmlwdGlvbl1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVQbHVnaW4ocmVwb3NpdG9yeVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtc2cgPSBgUmVtb3ZlZCAke3JlcG9zaXRvcnlQYXRofSBmcm9tIEJSQVQgcGx1Z2luIGxpc3RgO1xuICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnLCB0cnVlKTtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkxpc3QuZmlsdGVyKChiKSA9PiBiICE9IHJlcG9zaXRvcnlQYXRoKTtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luU3ViTGlzdEZyb3plblZlcnNpb24gPSBcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoYikgPT4gYi5yZXBvICE9IHJlcG9zaXRvcnlQYXRoXG4gICAgICAgICAgICApO1xuICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBwbHVnaW5zIHRoYXQgYXJlIGN1cnJlbnRseSBlbmFibGVkIG9yIGN1cnJlbnRseSBkaXNhYmxlZFxuICAgICAqXG4gICAgICogQHBhcmFtICAge2Jvb2xlYW5bXX0gICAgICAgIGVuYWJsZWQgIHRydWUgZm9yIGVuYWJsZWQgcGx1Z2lucywgZmFsc2UgZm9yIGRpc2FibGVkIHBsdXRpbmdzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuICB7UGx1Z2luTWFuaWZlc3RbXX0gICAgICAgICAgIG1hbmlmZXN0cyAgb2YgcGx1Z2luc1xuICAgICAqL1xuICAgIGdldEVuYWJsZWREaXNhYmxlZFBsdWdpbnMoZW5hYmxlZDogYm9vbGVhbik6IFBsdWdpbk1hbmlmZXN0W10ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IHBsID0gdGhpcy5wbHVnaW4uYXBwLnBsdWdpbnM7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0czogUGx1Z2luTWFuaWZlc3RbXSA9IE9iamVjdC52YWx1ZXMocGwubWFuaWZlc3RzKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBlbmFibGVkUGx1Z2luczogUGx1Z2luTWFuaWZlc3RbXSA9IE9iamVjdC52YWx1ZXMocGwucGx1Z2lucykubWFwKHAgPT4gcC5tYW5pZmVzdCk7XG4gICAgICAgIHJldHVybiBlbmFibGVkID9cbiAgICAgICAgICAgIG1hbmlmZXN0cy5maWx0ZXIobWFuaWZlc3QgPT4gZW5hYmxlZFBsdWdpbnMuZmluZChwbHVnaW5OYW1lID0+IG1hbmlmZXN0LmlkID09PSBwbHVnaW5OYW1lLmlkKSkgOlxuICAgICAgICAgICAgbWFuaWZlc3RzLmZpbHRlcihtYW5pZmVzdCA9PiAhZW5hYmxlZFBsdWdpbnMuZmluZChwbHVnaW5OYW1lID0+IG1hbmlmZXN0LmlkID09PSBwbHVnaW5OYW1lLmlkKSk7XG4gICAgfVxufSIsICJpbXBvcnQgeyBhZGRJY29uIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkSWNvbnMoKTogdm9pZCB7XG4gICAgYWRkSWNvbihcbiAgICAgICAgXCJCcmF0SWNvblwiLFxuICAgICAgICBgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiICBkPVwiTSA0MS42Njc5NjkgNDEuNjY3OTY5IEMgNDEuNjY3OTY5IDM5LjM2NzE4OCAzOS44MDA3ODEgMzcuNSAzNy41IDM3LjUgQyAzNS4xOTkyMTkgMzcuNSAzMy4zMzIwMzEgMzkuMzY3MTg4IDMzLjMzMjAzMSA0MS42Njc5NjkgQyAzMy4zMzIwMzEgNDMuOTY4NzUgMzUuMTk5MjE5IDQ1LjgzMjAzMSAzNy41IDQ1LjgzMjAzMSBDIDM5LjgwMDc4MSA0NS44MzIwMzEgNDEuNjY3OTY5IDQzLjk2ODc1IDQxLjY2Nzk2OSA0MS42Njc5NjkgWiBNIDYwLjQxNzk2OSA1OC41ODIwMzEgQyA1OS40NjA5MzggNTguMDIzNDM4IDU4LjMyMDMxMiA1Ny44NjcxODggNTcuMjUgNTguMTQ4NDM4IEMgNTYuMTc5Njg4IDU4LjQyOTY4OCA1NS4yNjU2MjUgNTkuMTI1IDU0LjcwNzAzMSA2MC4wODIwMzEgQyA1My43NDYwOTQgNjEuNzc3MzQ0IDUxLjk0OTIxOSA2Mi44MjAzMTIgNTAgNjIuODIwMzEyIEMgNDguMDUwNzgxIDYyLjgyMDMxMiA0Ni4yNTM5MDYgNjEuNzc3MzQ0IDQ1LjI5Mjk2OSA2MC4wODIwMzEgQyA0NC43MzQzNzUgNTkuMTI1IDQzLjgyMDMxMiA1OC40Mjk2ODggNDIuNzUgNTguMTQ4NDM4IEMgNDEuNjc5Njg4IDU3Ljg2NzE4OCA0MC41MzkwNjIgNTguMDIzNDM4IDM5LjU4MjAzMSA1OC41ODIwMzEgQyAzNy41OTc2NTYgNTkuNzI2NTYyIDM2LjkxMDE1NiA2Mi4yNTc4MTIgMzguMDQyOTY5IDY0LjI1IEMgNDAuNSA2OC41MzEyNSA0NS4wNjI1IDcxLjE3MTg3NSA1MCA3MS4xNzE4NzUgQyA1NC45Mzc1IDcxLjE3MTg3NSA1OS41IDY4LjUzMTI1IDYxLjk1NzAzMSA2NC4yNSBDIDYzLjA4OTg0NCA2Mi4yNTc4MTIgNjIuNDAyMzQ0IDU5LjcyNjU2MiA2MC40MTc5NjkgNTguNTgyMDMxIFogTSA2Mi41IDM3LjUgQyA2MC4xOTkyMTkgMzcuNSA1OC4zMzIwMzEgMzkuMzY3MTg4IDU4LjMzMjAzMSA0MS42Njc5NjkgQyA1OC4zMzIwMzEgNDMuOTY4NzUgNjAuMTk5MjE5IDQ1LjgzMjAzMSA2Mi41IDQ1LjgzMjAzMSBDIDY0LjgwMDc4MSA0NS44MzIwMzEgNjYuNjY3OTY5IDQzLjk2ODc1IDY2LjY2Nzk2OSA0MS42Njc5NjkgQyA2Ni42Njc5NjkgMzkuMzY3MTg4IDY0LjgwMDc4MSAzNy41IDYyLjUgMzcuNSBaIE0gNTAgOC4zMzIwMzEgQyAyNi45ODgyODEgOC4zMzIwMzEgOC4zMzIwMzEgMjYuOTg4MjgxIDguMzMyMDMxIDUwIEMgOC4zMzIwMzEgNzMuMDExNzE5IDI2Ljk4ODI4MSA5MS42Njc5NjkgNTAgOTEuNjY3OTY5IEMgNzMuMDExNzE5IDkxLjY2Nzk2OSA5MS42Njc5NjkgNzMuMDExNzE5IDkxLjY2Nzk2OSA1MCBDIDkxLjY2Nzk2OSAyNi45ODgyODEgNzMuMDExNzE5IDguMzMyMDMxIDUwIDguMzMyMDMxIFogTSA1MCA4My4zMzIwMzEgQyAzMy45ODgyODEgODMuNDAyMzQ0IDIwLjE5MTQwNiA3Mi4wNzgxMjUgMTcuMTM2NzE5IDU2LjM2MzI4MSBDIDE0LjA3ODEyNSA0MC42NDQ1MzEgMjIuNjI4OTA2IDI0Ljk3NjU2MiAzNy41IDE5LjA0Mjk2OSBDIDM3LjQ1NzAzMSAxOS42MzY3MTkgMzcuNDU3MDMxIDIwLjIzODI4MSAzNy41IDIwLjgzMjAzMSBDIDM3LjUgMjcuNzM4MjgxIDQzLjA5NzY1NiAzMy4zMzIwMzEgNTAgMzMuMzMyMDMxIEMgNTIuMzAwNzgxIDMzLjMzMjAzMSA1NC4xNjc5NjkgMzEuNDY4NzUgNTQuMTY3OTY5IDI5LjE2Nzk2OSBDIDU0LjE2Nzk2OSAyNi44NjcxODggNTIuMzAwNzgxIDI1IDUwIDI1IEMgNDcuNjk5MjE5IDI1IDQ1LjgzMjAzMSAyMy4xMzI4MTIgNDUuODMyMDMxIDIwLjgzMjAzMSBDIDQ1LjgzMjAzMSAxOC41MzEyNSA0Ny42OTkyMTkgMTYuNjY3OTY5IDUwIDE2LjY2Nzk2OSBDIDY4LjQxMDE1NiAxNi42Njc5NjkgODMuMzMyMDMxIDMxLjU4OTg0NCA4My4zMzIwMzEgNTAgQyA4My4zMzIwMzEgNjguNDEwMTU2IDY4LjQxMDE1NiA4My4zMzIwMzEgNTAgODMuMzMyMDMxIFogTSA1MCA4My4zMzIwMzEgXCIgLz5gXG4gICAgKTtcbn0iLCAiaW1wb3J0IHsgbW9tZW50LCBURmlsZSwgUGxhdGZvcm0gfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IGdldERhaWx5Tm90ZVNldHRpbmdzIH0gZnJvbSBcIm9ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZVwiO1xuaW1wb3J0IFRoZVBsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xuXG4vKipcbiAqIExvZ3MgZXZlbnRzIHRvIGEgbG9nIGZpbGVcbiAqXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgcGx1Z2luICAgICAgICAgICAgUGx1Z2luIG9iamVjdFxuICogQHBhcmFtICAge3N0cmluZ30gICAgIHRleHRUb0xvZyAgICAgICAgIHRleHQgdG8gYmUgc2F2ZWQgdG8gbG9nIGZpbGVcbiAqIEBwYXJhbSAgIHtbdHlwZV19ICAgICB2ZXJib3NlTG9nZ2luZ09uICBUcnVlIGlmIHNob3VsZCBvbmx5IGJlIGxvZ2dlZCBpZiB2ZXJib3NlIGxvZ2dpbmcgaXMgZW5hYmxlZFxuICpcbiAqIEByZXR1cm4gIHt2b2lkfSAgICAgICAgICAgICAgICAgICAgICAgICBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ2dlcihwbHVnaW46IFRoZVBsdWdpbiwgdGV4dFRvTG9nOiBzdHJpbmcsIHZlcmJvc2VMb2dnaW5nT24gPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmKHBsdWdpbi5zZXR0aW5ncy5kZWJ1Z2dpbmdNb2RlKSBjb25zb2xlLmxvZyhcIkJSQVQ6IFwiICsgdGV4dFRvTG9nKTtcbiAgICBpZiAocGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdFbmFibGVkKSB7XG4gICAgICAgIGlmIChwbHVnaW4uc2V0dGluZ3MubG9nZ2luZ1ZlcmJvc2VFbmFibGVkID09PSBmYWxzZSAmJiB2ZXJib3NlTG9nZ2luZ09uID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBsdWdpbi5zZXR0aW5ncy5sb2dnaW5nUGF0aCArIFwiLm1kXCI7XG4gICAgICAgICAgICBjb25zdCBkYXRlT3V0cHV0ID0gXCJbW1wiICsgbW9tZW50KCkuZm9ybWF0KGdldERhaWx5Tm90ZVNldHRpbmdzKCkuZm9ybWF0KS50b1N0cmluZygpICsgXCJdXSBcIiArXG4gICAgICAgICAgICAgICAgbW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIik7XG4gICAgICAgICAgICBjb25zdCBtYWNoaW5lTmFtZSA9IFBsYXRmb3JtLmlzRGVza3RvcCA/IHdpbmRvdy5yZXF1aXJlKFwib3NcIikuaG9zdG5hbWUoKSA6IFwiTU9CSUxFXCI7XG4gICAgICAgICAgICBsZXQgb3V0cHV0ID0gZGF0ZU91dHB1dCArIFwiIFwiICsgbWFjaGluZU5hbWUgKyBcIiBcIiArIHRleHRUb0xvZy5yZXBsYWNlKFwiXFxuXCIsXCIgXCIpICsgXCJcXG5cXG5cIjtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGZpbGVOYW1lKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXIucmVhZChmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dCArIGZpbGVDb250ZW50cztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHBsdWdpbi5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZpbGVOYW1lKSBhcyBURmlsZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luLmFwcC52YXVsdC5tb2RpZnkoZmlsZSwgb3V0cHV0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luLmFwcC52YXVsdC5jcmVhdGUoZmlsZU5hbWUsIG91dHB1dCk7XG4gICAgICAgICAgICB9LCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG59IiwgImltcG9ydCB7IEZ1enp5U3VnZ2VzdE1vZGFsLCBGdXp6eU1hdGNoIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IFRoZVBsdWdpbiBmcm9tICcuLi9tYWluJztcblxuLyoqXG4gKiBTaW1wbGUgaW50ZXJmYWNlIGZvciB3aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgYW5kIHN0b3JlZCBmb3Igc3VnZ2VzdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VnZ2VzdGVySXRlbSB7XG4gICAgZGlzcGxheTogc3RyaW5nLCAgICAgICAgLy8gZGlzcGxheWVkIHRvIHVzZXJcbiAgICBpbmZvOiBhbnkgICAgICAgICAgICAgICAvLyBzdXBwbG1lbnRhbCBpbmZvIGZvciB0aGUgY2FsbGJhY2tcbn1cblxuLyoqXG4gKiBHZW5lcmljIHN1Z2dlc3RlciBmb3IgcXVpY2sgcmV1c2VcbiAqL1xuZXhwb3J0IGNsYXNzIEdlbmVyaWNGdXp6eVN1Z2dlc3RlciBleHRlbmRzIEZ1enp5U3VnZ2VzdE1vZGFsPFN1Z2dlc3Rlckl0ZW0+e1xuICAgIGRhdGE6IFN1Z2dlc3Rlckl0ZW1bXTtcbiAgICBjYWxsYmFja0Z1bmN0aW9uOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IFRoZVBsdWdpbikge1xuICAgICAgICBzdXBlcihwbHVnaW4uYXBwKTtcbiAgICAgICAgdGhpcy5zY29wZS5yZWdpc3RlcihbXCJTaGlmdFwiXSwgXCJFbnRlclwiLCBldnQgPT4gdGhpcy5lbnRlclRyaWdnZXIoZXZ0KSk7XG4gICAgICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiQ3RybFwiXSwgXCJFbnRlclwiLCBldnQgPT4gdGhpcy5lbnRlclRyaWdnZXIoZXZ0KSk7XG4gICAgfVxuXG4gICAgc2V0U3VnZ2VzdGVyRGF0YShzdWdnZXN0ZXJEYXRhOiBBcnJheTxTdWdnZXN0ZXJJdGVtPik6IHZvaWQgeyB0aGlzLmRhdGEgPSBzdWdnZXN0ZXJEYXRhIH1cblxuICAgIGFzeW5jIGRpc3BsYXkoY2FsbEJhY2s6IChpdGVtOiBTdWdnZXN0ZXJJdGVtLCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KSA9PiB2b2lkKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgdGhpcy5jYWxsYmFja0Z1bmN0aW9uID0gY2FsbEJhY2s7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cblxuICAgIGdldEl0ZW1zKCk6IFN1Z2dlc3Rlckl0ZW1bXSB7IHJldHVybiB0aGlzLmRhdGEgfVxuXG4gICAgZ2V0SXRlbVRleHQoaXRlbTogU3VnZ2VzdGVySXRlbSk6IHN0cmluZyB7IHJldHVybiBpdGVtLmRpc3BsYXkgfVxuXG4gICAgb25DaG9vc2VJdGVtKCk6IHZvaWQgeyByZXR1cm4gfSAvLyByZXF1aXJlZCBieSBUUywgYnV0IG5vdCB1c2luZ1xuXG4gICAgcmVuZGVyU3VnZ2VzdGlvbihpdGVtOiBGdXp6eU1hdGNoPFN1Z2dlc3Rlckl0ZW0+LCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHsgZWwuY3JlYXRlRWwoJ2RpdicsIHsgdGV4dDogaXRlbS5pdGVtLmRpc3BsYXkgfSkgfVxuXG4gICAgZW50ZXJUcmlnZ2VyKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnN1Z2dlc3Rpb24taXRlbS5pcy1zZWxlY3RlZCBkaXZcIikudGV4dENvbnRlbnQ7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmRhdGEuZmluZChpID0+IGkuZGlzcGxheSA9PT0gc2VsZWN0ZWRUZXh0KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlQ2FsbGJhY2soaXRlbSwgZXZ0KTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2hvb3NlU3VnZ2VzdGlvbihpdGVtOiBGdXp6eU1hdGNoPFN1Z2dlc3Rlckl0ZW0+LCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7IHRoaXMuaW52b2tlQ2FsbGJhY2soaXRlbS5pdGVtLCBldnQpIH1cblxuICAgIGludm9rZUNhbGxiYWNrKGl0ZW06IFN1Z2dlc3Rlckl0ZW0sIGV2dDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQpOiB2b2lkIHsgdGhpcy5jYWxsYmFja0Z1bmN0aW9uKGl0ZW0sIGV2dCkgfVxufVxuIiwgImltcG9ydCBUaGVQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcbmltcG9ydCB7IEdlbmVyaWNGdXp6eVN1Z2dlc3RlciwgU3VnZ2VzdGVySXRlbSB9IGZyb20gXCIuL0dlbmVyaWNGdXp6eVN1Z2dlc3RlclwiO1xuaW1wb3J0IHsgZ3JhYkNvbW1tdW5pdHlQbHVnaW5MaXN0LCBncmFiQ29tbW11bml0eVRoZW1lc0xpc3QgfSBmcm9tIFwiLi4vZmVhdHVyZXMvZ2l0aHViVXRpbHNcIjtcbmltcG9ydCB7IHRoZW1lc0NoZWNrQW5kVXBkYXRlcyB9IGZyb20gXCIuLi9mZWF0dXJlcy90aGVtZXNcIjtcbmltcG9ydCBBZGROZXdUaGVtZSBmcm9tIFwiLi9BZGROZXdUaGVtZVwiO1xuaW1wb3J0IHsgVG9hc3RNZXNzYWdlIH0gZnJvbSBcIi4uL3V0aWxzL25vdGlmaWNhdGlvbnNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luQ29tbWFuZHMge1xuICAgIHBsdWdpbjogVGhlUGx1Z2luO1xuICAgIGJyYXRDb21tYW5kcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFwiQlJBVC1BZGRCZXRhUGx1Z2luXCIsXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IEFkZCBhIGJldGEgcGx1Z2luIGZvciB0ZXN0aW5nXCIsXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4geyBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5kaXNwbGF5QWRkTmV3UGx1Z2luTW9kYWwoZmFsc2UsIGZhbHNlKSB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtQWRkQmV0YVBsdWdpbldpdGhGcm96ZW5WZXJzaW9uXCIsXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IEFkZCBhIGJldGEgcGx1Z2luIHdpdGggZnJvemVuIHZlcnNpb24gYmFzZWQgb24gYSByZWxlYXNlIHRhZ1wiLFxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGlzcGxheUFkZE5ld1BsdWdpbk1vZGFsKGZhbHNlLCB0cnVlKSB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtY2hlY2tGb3JVcGRhdGVzQW5kVXBkYXRlXCIsXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IENoZWNrIGZvciB1cGRhdGVzIHRvIGFsbCBiZXRhIHBsdWdpbnMgYW5kIFVQREFURVwiLFxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuY2hlY2tGb3JVcGRhdGVzQW5kSW5zdGFsbFVwZGF0ZXModHJ1ZSwgZmFsc2UpIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFwiQlJBVC1jaGVja0ZvclVwZGF0ZXNBbmREb250VXBkYXRlXCIsXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IE9ubHkgY2hlY2sgZm9yIHVwZGF0ZXMgdG8gYmV0YSBwbHVnaW5zLCBidXQgZG9uJ3QgVXBkYXRlXCIsXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4geyBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5jaGVja0ZvclVwZGF0ZXNBbmRJbnN0YWxsVXBkYXRlcyh0cnVlLCB0cnVlKSB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtdXBkYXRlT25lUGx1Z2luXCIsXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IENob29zZSBhIHNpbmdsZSBwbHVnaW4gdmVyc2lvbiB0byB1cGRhdGVcIixcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luU3ViTGlzdEZyb3plblZlcnNpb25OYW1lcyA9IFxuICAgICAgICAgICAgICAgICAgICBuZXcgU2V0KHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uLm1hcChmID0+IGYucmVwbykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpbkxpc3Q6IFN1Z2dlc3Rlckl0ZW1bXSA9IFxuICAgICAgICAgICAgICAgICAgICBPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZXModGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGYpID0+ICFwbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbk5hbWVzLmhhcyhmKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IHsgcmV0dXJuIHsgZGlzcGxheTogbSwgaW5mbzogbSB9IH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdmcyA9IG5ldyBHZW5lcmljRnV6enlTdWdnZXN0ZXIodGhpcy5wbHVnaW4pO1xuICAgICAgICAgICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKHBsdWdpbkxpc3QpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBDaGVja2luZyBmb3IgdXBkYXRlcyBmb3IgJHtyZXN1bHRzLmluZm99YDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZyx0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgXFxuJHttc2d9YCwgMyk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLmJldGFQbHVnaW5zLnVwZGF0ZVBsdWdpbihyZXN1bHRzLmluZm8sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFwiQlJBVC1yZXN0YXJ0UGx1Z2luXCIsXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IFJlc3RhcnQgYSBwbHVnaW4gdGhhdCBpcyBhbHJlYWR5IGluc3RhbGxlZFwiLFxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luTGlzdDogU3VnZ2VzdGVySXRlbVtdID0gT2JqZWN0LnZhbHVlcyh0aGlzLnBsdWdpbi5hcHAucGx1Z2lucy5tYW5pZmVzdHMpLm1hcCgobSkgPT4geyByZXR1cm4geyBkaXNwbGF5OiBtLmlkLCBpbmZvOiBtLmlkIH0gfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XG4gICAgICAgICAgICAgICAgZ2ZzLnNldFN1Z2dlc3RlckRhdGEocGx1Z2luTGlzdCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2ZzLmRpc3BsYXkoYXN5bmMgKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgJHtyZXN1bHRzLmluZm99XFxuUGx1Z2luIHJlbG9hZGluZyAuLi4uLmAsIDUpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5yZWxvYWRQbHVnaW4ocmVzdWx0cy5pbmZvKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFwiQlJBVC1kaXNhYmxlUGx1Z2luXCIsXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IERpc2FibGUgYSBwbHVnaW4gLSB0b2dnbGUgaXQgb2ZmXCIsXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpbkxpc3QgPSB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5nZXRFbmFibGVkRGlzYWJsZWRQbHVnaW5zKHRydWUpLm1hcChtYW5pZmVzdCA9PiB7IHJldHVybiB7IGRpc3BsYXk6IGAke21hbmlmZXN0Lm5hbWV9ICgke21hbmlmZXN0LmlkfSlgLCBpbmZvOiBtYW5pZmVzdC5pZCB9IH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdmcyA9IG5ldyBHZW5lcmljRnV6enlTdWdnZXN0ZXIodGhpcy5wbHVnaW4pO1xuICAgICAgICAgICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKHBsdWdpbkxpc3QpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZyhgJHtyZXN1bHRzLmRpc3BsYXl9IHBsdWdpbiBkaXNhYmxlZGAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdnaW5nTW9kZSkgY29uc29sZS5sb2cocmVzdWx0cy5pbmZvKVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLmFwcC5wbHVnaW5zLmRpc2FibGVQbHVnaW5BbmRTYXZlKHJlc3VsdHMuaW5mbyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtZW5hYmxlUGx1Z2luXCIsXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IEVuYWJsZSBhIHBsdWdpbiAtIHRvZ2dsZSBpdCBvblwiLFxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwbHVnaW5MaXN0ID0gdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZ2V0RW5hYmxlZERpc2FibGVkUGx1Z2lucyhmYWxzZSkubWFwKG1hbmlmZXN0ID0+IHsgcmV0dXJuIHsgZGlzcGxheTogYCR7bWFuaWZlc3QubmFtZX0gKCR7bWFuaWZlc3QuaWR9KWAsIGluZm86IG1hbmlmZXN0LmlkIH0gfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XG4gICAgICAgICAgICAgICAgZ2ZzLnNldFN1Z2dlc3RlckRhdGEocGx1Z2luTGlzdCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2ZzLmRpc3BsYXkoYXN5bmMgKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKGAke3Jlc3VsdHMuZGlzcGxheX0gcGx1Z2luIGVuYWJsZWRgLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uYXBwLnBsdWdpbnMuZW5hYmxlUGx1Z2luQW5kU2F2ZShyZXN1bHRzLmluZm8pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBpZDogXCJCUkFULW9wZW5HaXRIdWJaUmVwb3NpdG9yeVwiLFxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxuICAgICAgICAgICAgbmFtZTogXCJQbHVnaW5zOiBPcGVuIHRoZSBHaXRIdWIgcmVwb3NpdG9yeSBmb3IgYSBwbHVnaW5cIixcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbXVuaXR5UGx1Z2lucyA9IGF3YWl0IGdyYWJDb21tbXVuaXR5UGx1Z2luTGlzdCh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z2dpbmdNb2RlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tdW5pdHlQbHVnaW5MaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKGNvbW11bml0eVBsdWdpbnMpLm1hcCgocCkgPT4geyByZXR1cm4geyBkaXNwbGF5OiBgUGx1Z2luOiAke3AubmFtZX0gICgke3AucmVwb30pYCwgaW5mbzogcC5yZXBvIH0gfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnJhdExpc3Q6IFN1Z2dlc3Rlckl0ZW1bXSA9IE9iamVjdC52YWx1ZXModGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdCkubWFwKChwKSA9PiB7IHJldHVybiB7IGRpc3BsYXk6IFwiQlJBVDogXCIgKyBwLCBpbmZvOiBwIH0gfSk7XG4gICAgICAgICAgICAgICAgY29tbXVuaXR5UGx1Z2luTGlzdC5mb3JFYWNoKHNpID0+IGJyYXRMaXN0LnB1c2goc2kpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHRoaXMucGx1Z2luKTtcbiAgICAgICAgICAgICAgICBnZnMuc2V0U3VnZ2VzdGVyRGF0YShicmF0TGlzdCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2ZzLmRpc3BsYXkoYXN5bmMgKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMuaW5mbykgd2luZG93Lm9wZW4oYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3Jlc3VsdHMuaW5mb31gKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBpZDogXCJCUkFULW9wZW5HaXRIdWJSZXBvVGhlbWVcIixcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcbiAgICAgICAgICAgIG5hbWU6IFwiVGhlbWVzOiBPcGVuIHRoZSBHaXRIdWIgcmVwb3NpdG9yeSBmb3IgYSB0aGVtZSAoYXBwZWFyYW5jZSlcIixcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbXVuaXR5VGhlbWUgPSBhd2FpdCBncmFiQ29tbW11bml0eVRoZW1lc0xpc3QodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdnaW5nTW9kZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbXVuaXR5VGhlbWVMaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKGNvbW11bml0eVRoZW1lKS5tYXAoKHApID0+IHsgcmV0dXJuIHsgZGlzcGxheTogYFRoZW1lOiAke3AubmFtZX0gICgke3AucmVwb30pYCwgaW5mbzogcC5yZXBvIH0gfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XG4gICAgICAgICAgICAgICAgZ2ZzLnNldFN1Z2dlc3RlckRhdGEoY29tbXVuaXR5VGhlbWVMaXN0KTtcbiAgICAgICAgICAgICAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5pbmZvKSB3aW5kb3cub3BlbihgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVzdWx0cy5pbmZvfWApXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtb3BlbnRQbHVnaW5TZXR0aW5nc1wiLFxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxuICAgICAgICAgICAgbmFtZTogXCJQbHVnaW5zOiBPcGVuIFBsdWdpbiBTZXR0aW5ncyBUYWJcIixcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5wbHVnaW4uYXBwLnNldHRpbmc7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RPZlBsdWdpblNldHRpbmdzVGFiczogU3VnZ2VzdGVySXRlbVtdID0gT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5wbHVnaW5UYWJzKS5tYXAoKHQpID0+IHsgcmV0dXJuIHsgZGlzcGxheTogXCJQbHVnaW46IFwiICsgdC5uYW1lLCBpbmZvOiB0LmlkIH0gfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RPZkNvcmVTZXR0aW5nc1RhYnM6IFN1Z2dlc3Rlckl0ZW1bXSA9IE9iamVjdC52YWx1ZXMoc2V0dGluZ3Muc2V0dGluZ1RhYnMpLm1hcCgodCkgPT4geyByZXR1cm4geyBkaXNwbGF5OiBcIkNvcmU6IFwiICsgdC5uYW1lLCBpbmZvOiB0LmlkIH0gfSk7XG4gICAgICAgICAgICAgICAgbGlzdE9mUGx1Z2luU2V0dGluZ3NUYWJzLmZvckVhY2goc2kgPT4gbGlzdE9mQ29yZVNldHRpbmdzVGFicy5wdXNoKHNpKSk7XG4gICAgICAgICAgICAgICAgZ2ZzLnNldFN1Z2dlc3RlckRhdGEobGlzdE9mQ29yZVNldHRpbmdzVGFicyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2ZzLmRpc3BsYXkoYXN5bmMgKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5vcGVuVGFiQnlJZChyZXN1bHRzLmluZm8pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBpZDogXCJCUkFULUdyYWJCZXRhVGhlbWVcIixcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcbiAgICAgICAgICAgIG5hbWU6IFwiVGhlbWVzOiBHcmFiIGEgYmV0YSB0aGVtZSBmb3IgdGVzdGluZyBmcm9tIGEgR2l0aHViIHJlcG9zaXRvcnlcIixcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7IChuZXcgQWRkTmV3VGhlbWUodGhpcy5wbHVnaW4pKS5vcGVuKCkgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBpZDogXCJCUkFULXVwZGF0ZUJldGFUaGVtZXNcIixcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcbiAgICAgICAgICAgIG5hbWU6IFwiVGhlbWVzOiBVcGRhdGUgYmV0YSB0aGVtZXNcIixcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCB0aGVtZXNDaGVja0FuZFVwZGF0ZXModGhpcy5wbHVnaW4sIHRydWUpIFxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtYWxsQ29tbWFuZHNcIixcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcbiAgICAgICAgICAgIG5hbWU6IFwiQWxsIENvbW1hbmRzIGxpc3RcIixcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogZmFsc2UsXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4gdGhpcy5yaWJib25EaXNwbGF5Q29tbWFuZHMoKVxuICAgICAgICB9LFxuICAgIF1cblxuICAgIGFzeW5jIHJpYmJvbkRpc3BsYXlDb21tYW5kcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYnJhdENvbW1hbmRMaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBbXTtcbiAgICAgICAgdGhpcy5icmF0Q29tbWFuZHMuZm9yRWFjaChjbWQgPT4geyBpZiAoY21kLnNob3dJblJpYmJvbikgYnJhdENvbW1hbmRMaXN0LnB1c2goeyBkaXNwbGF5OiBjbWQubmFtZSwgaW5mbzogY21kLmNhbGxiYWNrIH0pIH0pO1xuICAgICAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHRoaXMucGx1Z2luKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMucGx1Z2luLmFwcC5zZXR0aW5nO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGxpc3RPZkNvcmVTZXR0aW5nc1RhYnM6IFN1Z2dlc3Rlckl0ZW1bXSA9IE9iamVjdC52YWx1ZXMoc2V0dGluZ3Muc2V0dGluZ1RhYnMpLm1hcCgodDogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiQ29yZTogXCIgKyB0Lm5hbWUsXG4gICAgICAgICAgICAgICAgaW5mbzogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5vcGVuKCk7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm9wZW5UYWJCeUlkKHQuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgbGlzdE9mUGx1Z2luU2V0dGluZ3NUYWJzOiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKHNldHRpbmdzLnBsdWdpblRhYnMpLm1hcCgodDogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiUGx1Z2luOiBcIiArIHQubmFtZSxcbiAgICAgICAgICAgICAgICBpbmZvOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm9wZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub3BlblRhYkJ5SWQodC5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBicmF0Q29tbWFuZExpc3QucHVzaCh7IGRpc3BsYXk6IFwiLS0tLSBDb3JlIFBsdWdpbiBTZXR0aW5ncyAtLS0tXCIsIGluZm86IGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5yaWJib25EaXNwbGF5Q29tbWFuZHMoKSB9IH0pXG4gICAgICAgIGxpc3RPZkNvcmVTZXR0aW5nc1RhYnMuZm9yRWFjaChzaSA9PiBicmF0Q29tbWFuZExpc3QucHVzaChzaSkpO1xuICAgICAgICBicmF0Q29tbWFuZExpc3QucHVzaCh7IGRpc3BsYXk6IFwiLS0tLSBQbHVnaW4gU2V0dGluZ3MgLS0tLVwiLCBpbmZvOiBhc3luYyAoKSA9PiB7IGF3YWl0IHRoaXMucmliYm9uRGlzcGxheUNvbW1hbmRzKCkgfSB9KVxuICAgICAgICBsaXN0T2ZQbHVnaW5TZXR0aW5nc1RhYnMuZm9yRWFjaChzaSA9PiBicmF0Q29tbWFuZExpc3QucHVzaChzaSkpO1xuXG4gICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKGJyYXRDb21tYW5kTGlzdCk7XG4gICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiBhd2FpdCByZXN1bHRzLmluZm8oKSk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocGx1Z2luOiBUaGVQbHVnaW4pIHtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG5cbiAgICAgICAgdGhpcy5icmF0Q29tbWFuZHMuZm9yRWFjaChhc3luYyAoaXRlbSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxuICAgICAgICAgICAgICAgIGljb246IGl0ZW0uaWNvbixcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4geyBhd2FpdCBpdGVtLmNhbGxiYWNrKCkgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgfVxuXG59XG5cbiIsICJpbXBvcnQgeyBncmFiQ2hlY2tzdW1PZlRoZW1lQ3NzRmlsZSwgZ3JhYkNvbW1tdW5pdHlUaGVtZUNzc0ZpbGUsIGdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlIH0gZnJvbSBcIi4uL2ZlYXR1cmVzL2dpdGh1YlV0aWxzXCI7XG5pbXBvcnQgeyB0aGVtZVNhdmUsIHRoZW1lRGVsZXRlLCB0aGVtZXNDaGVja0FuZFVwZGF0ZXMgfSBmcm9tIFwiLi4vZmVhdHVyZXMvdGhlbWVzXCI7XG5pbXBvcnQgVGhlUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XG5pbXBvcnQgeyBTZXR0aW5ncyB9IGZyb20gXCIuLi91aS9zZXR0aW5nc1wiO1xuXG5cbi8vIFRoaXMgbW9kdWxlIGlzIGZvciBBUEkgYWNjZXNzIGZvciB1c2UgaW4gZGVidWdpbmcgY29uc29sZSBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnJhdEFQSSB7XG4gICAgcGx1Z2luOiBUaGVQbHVnaW47XG4gICAgc2V0dGluZ3M6IFNldHRpbmdzOyBcblxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbjogVGhlUGx1Z2luKSB7XG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luICAgIFxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc29sZSA9IChsb2dEZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5vdXRwdXRzOiBhbnlbXSk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkJSQVQ6IFwiICsgbG9nRGVzY3JpcHRpb24sIG91dHB1dHMpXG4gICAgfVxuXG4gICAgdGhlbWVzID0ge1xuXG4gICAgICAgIHRoZW1lc2VDaGVja0FuZFVwYXRlczogYXN5bmMgKHNob3dJbmZvOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGVtZXNDaGVja0FuZFVwZGF0ZXModGhpcy5wbHVnaW4sIHNob3dJbmZvKTtcbiAgICAgICAgfSxcblxuICAgICAgICB0aGVtZUluc3RhbGxUaGVtZTogYXN5bmMgKGNzc0dpdGh1YlJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2NydWJiZWRBZGRyZXNzID0gY3NzR2l0aHViUmVwb3NpdG9yeS5yZXBsYWNlKFwiaHR0cHM6Ly9naXRodWIuY29tL1wiLCBcIlwiKTtcbiAgICAgICAgICAgIGF3YWl0IHRoZW1lU2F2ZSh0aGlzLnBsdWdpbiwgc2NydWJiZWRBZGRyZXNzLCB0cnVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICB0aGVtZXNEZWxldGU6IGFzeW5jIChjc3NHaXRodWJSZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNjcnViYmVkQWRkcmVzcyA9IGNzc0dpdGh1YlJlcG9zaXRvcnkucmVwbGFjZShcImh0dHBzOi8vZ2l0aHViLmNvbS9cIiwgXCJcIik7XG4gICAgICAgICAgICBhd2FpdCB0aGVtZURlbGV0ZSh0aGlzLnBsdWdpbiwgc2NydWJiZWRBZGRyZXNzKVxuICAgICAgICB9LFxuXG4gICAgICAgIGdyYWJDb21tbXVuaXR5VGhlbWVDc3NGaWxlOiBhc3luYyAocmVwb3NpdG9yeVBhdGg6IHN0cmluZywgYmV0YVZlcnNpb24gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nfG51bGw+ID0+ICB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ3JhYkNvbW1tdW5pdHlUaGVtZUNzc0ZpbGUocmVwb3NpdG9yeVBhdGgsIGJldGFWZXJzaW9uLCB0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z2dpbmdNb2RlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBncmFiQ2hlY2tzdW1PZlRoZW1lQ3NzRmlsZTogYXN5bmMgKHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIGJldGFWZXJzaW9uID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZz4gPT4gIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBncmFiQ2hlY2tzdW1PZlRoZW1lQ3NzRmlsZShyZXBvc2l0b3J5UGF0aCwgYmV0YVZlcnNpb24sIHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnZ2luZ01vZGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlOiBhc3luYyAocmVwb3NpdG9yeVBhdGg6IHN0cmluZywgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgICAgIC8vIGV4YW1wbGUgYXdhaXQgZ3JhYkxhc3RDb21taXREYXRlRm9yQUZpbGUodC5yZXBvLCBcInRoZW1lLWJldGEuY3NzXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlKHJlcG9zaXRvcnlQYXRoLCBwYXRoKVxuICAgICAgICB9LFxuXG5cblxuXG4gICAgICAgIFxuICAgIH1cblxufSJdLAogICJtYXBwaW5ncyI6ICJxMEJB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LElBQUlNLEVBQVEsSUFBSSxFQUMvQixXQUFXLFFBQVUsS0FBSyxPQUMzQixHQUFHLEdBQUcsQ0FDUCxDQUFDLENBQ0YsR0FFQSxrQkFBeUIsQ0FBRSxLQUFLLFdBQWEsS0FBSyxjQUFjLFdBQVksT0FBUSxJQUFTTixFQUFBLHNCQUFHLFlBQUssU0FBUyxzQkFBc0IsR0FBQyxDQUFFLENBRXZJLElBQUlPLEVBQW1CQyxFQUFVLEdBQWEsQ0FBRUMsR0FBTyxLQUFNRixFQUFXQyxDQUFPLENBQUUsQ0FFakYsVUFBaUIsQ0FBRSxRQUFRLElBQUksYUFBZSxLQUFLLE9BQU8sQ0FBRSxDQUV0RCxjQUE4QixRQUFBUixFQUFBLHNCQUFFLEtBQUssU0FBVyxPQUFPLE9BQU8sQ0FBQyxFQUFHVSxHQUFrQixNQUFNLEtBQUssU0FBUyxDQUFDLENBQUUsR0FFM0csY0FBOEIsUUFBQVYsRUFBQSxzQkFBRSxNQUFNLEtBQUssU0FBUyxLQUFLLFFBQVEsQ0FBRSxHQUMxRSIsCiAgIm5hbWVzIjogWyJyZXF1aXJlX21haW4iLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm9ic2lkaWFuIiwgIkRFRkFVTFRfREFJTFlfTk9URV9GT1JNQVQiLCAiREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQiLCAiREVGQVVMVF9NT05USExZX05PVEVfRk9STUFUIiwgIkRFRkFVTFRfUVVBUlRFUkxZX05PVEVfRk9STUFUIiwgIkRFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFUIiwgInNob3VsZFVzZVBlcmlvZGljTm90ZXNTZXR0aW5ncyIsICJwZXJpb2RpY2l0eSIsICJfYSIsICJfYiIsICJwZXJpb2RpY05vdGVzIiwgImdldERhaWx5Tm90ZVNldHRpbmdzIiwgIl9jIiwgIl9kIiwgImludGVybmFsUGx1Z2lucyIsICJwbHVnaW5zIiwgImZvcm1hdCIsICJmb2xkZXIiLCAidGVtcGxhdGUiLCAiZXJyIiwgImdldFdlZWtseU5vdGVTZXR0aW5ncyIsICJfZSIsICJfZiIsICJfZyIsICJwbHVnaW5NYW5hZ2VyIiwgImNhbGVuZGFyU2V0dGluZ3MiLCAicGVyaW9kaWNOb3Rlc1NldHRpbmdzIiwgInNldHRpbmdzIiwgImdldE1vbnRobHlOb3RlU2V0dGluZ3MiLCAiZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzIiwgImdldFllYXJseU5vdGVTZXR0aW5ncyIsICJqb2luIiwgInBhcnRTZWdtZW50cyIsICJwYXJ0cyIsICJpIiwgImwiLCAibmV3UGFydHMiLCAicGFydCIsICJiYXNlbmFtZSIsICJmdWxsUGF0aCIsICJiYXNlIiwgImVuc3VyZUZvbGRlckV4aXN0cyIsICJwYXRoIiwgIl9fYXN5bmMiLCAiZGlycyIsICJkaXIiLCAiZ2V0Tm90ZVBhdGgiLCAiZGlyZWN0b3J5IiwgImZpbGVuYW1lIiwgImdldFRlbXBsYXRlSW5mbyIsICJtZXRhZGF0YUNhY2hlIiwgInZhdWx0IiwgInRlbXBsYXRlUGF0aCIsICJ0ZW1wbGF0ZUZpbGUiLCAiY29udGVudHMiLCAiSUZvbGRJbmZvIiwgImdldERhdGVVSUQiLCAiZGF0ZSIsICJncmFudWxhcml0eSIsICJ0cyIsICJyZW1vdmVFc2NhcGVkQ2hhcmFjdGVycyIsICJpc0Zvcm1hdEFtYmlndW91cyIsICJjbGVhbkZvcm1hdCIsICJnZXREYXRlRnJvbUZpbGUiLCAiZmlsZSIsICJnZXREYXRlRnJvbUZpbGVuYW1lIiwgImdldERhdGVGcm9tUGF0aCIsICJub3RlRGF0ZSIsICJEYWlseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIiwgImNyZWF0ZURhaWx5Tm90ZSIsICJhcHAiLCAibW9tZW50IiwgInRlbXBsYXRlQ29udGVudHMiLCAibm9ybWFsaXplZFBhdGgiLCAiY3JlYXRlZEZpbGUiLCAiXyIsICJfdGltZU9yRGF0ZSIsICJjYWxjIiwgInRpbWVEZWx0YSIsICJ1bml0IiwgIm1vbWVudEZvcm1hdCIsICJub3ciLCAiY3VycmVudERhdGUiLCAiZ2V0RGFpbHlOb3RlIiwgImRhaWx5Tm90ZXMiLCAiZ2V0QWxsRGFpbHlOb3RlcyIsICJkYWlseU5vdGVzRm9sZGVyIiwgIm5vdGUiLCAiZGF0ZVN0cmluZyIsICJXZWVrbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciIsICJnZXREYXlzT2ZXZWVrIiwgIndlZWtTdGFydCIsICJkYXlzT2ZXZWVrIiwgImdldERheU9mV2Vla051bWVyaWNhbFZhbHVlIiwgImRheU9mV2Vla05hbWUiLCAiY3JlYXRlV2Vla2x5Tm90ZSIsICJkYXlPZldlZWsiLCAiZGF5IiwgImdldFdlZWtseU5vdGUiLCAid2Vla2x5Tm90ZXMiLCAiZ2V0QWxsV2Vla2x5Tm90ZXMiLCAiYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQiLCAid2Vla2x5Tm90ZXNGb2xkZXIiLCAiTW9udGhseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIiwgImNyZWF0ZU1vbnRobHlOb3RlIiwgImdldE1vbnRobHlOb3RlIiwgIm1vbnRobHlOb3RlcyIsICJnZXRBbGxNb250aGx5Tm90ZXMiLCAiYXBwSGFzTW9udGhseU5vdGVzUGx1Z2luTG9hZGVkIiwgIm1vbnRobHlOb3Rlc0ZvbGRlciIsICJRdWFydGVybHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciIsICJjcmVhdGVRdWFydGVybHlOb3RlIiwgImdldFF1YXJ0ZXJseU5vdGUiLCAicXVhcnRlcmx5IiwgImdldEFsbFF1YXJ0ZXJseU5vdGVzIiwgImFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkIiwgInF1YXJ0ZXJseUZvbGRlciIsICJZZWFybHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciIsICJjcmVhdGVZZWFybHlOb3RlIiwgImdldFllYXJseU5vdGUiLCAieWVhcmx5Tm90ZXMiLCAiZ2V0QWxsWWVhcmx5Tm90ZXMiLCAiYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQiLCAieWVhcmx5Tm90ZXNGb2xkZXIiLCAiYXBwSGFzRGFpbHlOb3Rlc1BsdWdpbkxvYWRlZCIsICJkYWlseU5vdGVzUGx1Z2luIiwgImdldFBlcmlvZGljTm90ZVNldHRpbmdzIiwgImdldFNldHRpbmdzIiwgImNyZWF0ZVBlcmlvZGljTm90ZSIsICJtYWluX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiVGhlUGx1Z2luIiwgIl9fdG9Db21tb25KUyIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiR0lUSFVCX1JBV19VU0VSQ09OVEVOVF9QQVRIIiwgImdyYWJSZWxlYXNlRmlsZUZyb21SZXBvc2l0b3J5IiwgInJlcG9zaXRvcnkiLCAidmVyc2lvbiIsICJmaWxlTmFtZSIsICJkZWJ1Z0xvZ2dpbmciLCAiX19hc3luYyIsICJVUkwiLCAiZG93bmxvYWQiLCAiZXJyb3IiLCAiZ3JhYk1hbmlmZXN0SnNvbkZyb21SZXBvc2l0b3J5IiwgInJlcG9zaXRvcnlQYXRoIiwgInJvb3RNYW5pZmVzdCIsICJtYW5pZmVzdEpzb25QYXRoIiwgInJlc3BvbnNlIiwgImdyYWJDb21tbXVuaXR5UGx1Z2luTGlzdCIsICJwbHVnaW5MaXN0VVJMIiwgImdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdCIsICJ0aGVtZXNVUkwiLCAiZ3JhYkNvbW1tdW5pdHlUaGVtZUNzc0ZpbGUiLCAiYmV0YVZlcnNpb24iLCAiZ3JhYkNvbW1tdW5pdHlUaGVtZU1hbmlmZXN0RmlsZSIsICJjaGVja3N1bSIsICJzdHIiLCAic3VtIiwgImkiLCAiY2hlY2tzdW1Gb3JTdHJpbmciLCAiZ3JhYkNoZWNrc3VtT2ZUaGVtZUNzc0ZpbGUiLCAidGhlbWVDU1MiLCAiZ3JhYkxhc3RDb21taXRJbmZvRm9yQUZpbGUiLCAicGF0aCIsICJ1cmwiLCAiZ3JhYkxhc3RDb21taXREYXRlRm9yQUZpbGUiLCAidGVzdCIsICJERUZBVUxUX1NFVFRJTkdTIiwgImFkZEJldGFQbHVnaW5Ub0xpc3QiLCAicGx1Z2luIiwgInJlcG9zaXRvcnlQYXRoIiwgInNwZWNpZnlWZXJzaW9uIiwgIl9fYXN5bmMiLCAic2F2ZSIsICJ4IiwgImV4aXN0QmV0YVBsdWdpbkluTGlzdCIsICJhZGRCZXRhVGhlbWVUb0xpc3QiLCAidGhlbWVDU1MiLCAibmV3VGhlbWUiLCAiY2hlY2tzdW1Gb3JTdHJpbmciLCAiZXhpc3RCZXRhVGhlbWVpbkluTGlzdCIsICJ0IiwgInVwZGF0ZUJldGFUaGVtZUxhc3RVcGRhdGVDaGVja3N1bSIsICJjaGVja3N1bSIsICJpbXBvcnRfb2JzaWRpYW4iLCAiVG9hc3RNZXNzYWdlIiwgInBsdWdpbiIsICJtc2ciLCAidGltZW91dEluU2Vjb25kcyIsICJjb250ZXh0TWVudUNhbGxiYWNrIiwgImFkZGl0aW9uYWxJbmZvIiwgIm5ld05vdGljZSIsICJfX2FzeW5jIiwgImlzQ29ubmVjdGVkVG9JbnRlcm5ldCIsICJfX2FzeW5jIiwgIm9ubGluZSIsICJlcnIiLCAidGhlbWVTYXZlIiwgInBsdWdpbiIsICJjc3NHaXRodWJSZXBvc2l0b3J5IiwgIm5ld0luc3RhbGwiLCAiX19hc3luYyIsICJ0aGVtZUNTUyIsICJncmFiQ29tbW11bml0eVRoZW1lQ3NzRmlsZSIsICJUb2FzdE1lc3NhZ2UiLCAidGhlbWVNYW5pZmVzdCIsICJncmFiQ29tbW11bml0eVRoZW1lTWFuaWZlc3RGaWxlIiwgIm1hbmlmZXN0SW5mbyIsICJ0aGVtZVRhcmdldEZvbGRlclBhdGgiLCAidGhlbWVzUm9vdFBhdGgiLCAiYWRhcHRlciIsICJ1cGRhdGVCZXRhVGhlbWVMYXN0VXBkYXRlQ2hlY2tzdW0iLCAiY2hlY2tzdW1Gb3JTdHJpbmciLCAibXNnIiwgImFkZEJldGFUaGVtZVRvTGlzdCIsICJ0aGVtZXNDaGVja0FuZFVwZGF0ZXMiLCAic2hvd0luZm8iLCAiaXNDb25uZWN0ZWRUb0ludGVybmV0IiwgIm5ld05vdGljZSIsICJtc2cxIiwgInQiLCAibGFzdFVwZGF0ZU9ubGluZSIsICJncmFiQ2hlY2tzdW1PZlRoZW1lQ3NzRmlsZSIsICJtc2cyIiwgInRoZW1lRGVsZXRlIiwgImltcG9ydF9vYnNpZGlhbiIsICJwcm9tb3Rpb25hbExpbmtzIiwgImNvbnRhaW5lckVsIiwgInNldHRpbmdzVGFiIiwgImxpbmtIZWlnaHQiLCAibGlua3NEaXYiLCAiY29mZmVlU3BhbiIsICJjb2ZmZWVJbWciLCAidHdpdHRlclNwYW4iLCAidHdpdHRlckltZyIsICJtZWRpdW1TcGFuIiwgIm1lZGl1bUltZyIsICJBZGROZXdUaGVtZSIsICJwbHVnaW4iLCAib3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcyIsICJfX2FzeW5jIiwgInNjcnViYmVkQWRkcmVzcyIsICJleGlzdEJldGFUaGVtZWluSW5MaXN0IiwgIlRvYXN0TWVzc2FnZSIsICJ0aGVtZVNhdmUiLCAiZm9ybUVsIiwgInRleHRFbCIsICJ2YWx1ZSIsICJlIiwgInRpdGxlIiwgImJ1dHRvbkNvbnRhaW5lckVsIiwgIm5ld0RpdiIsICJieVRmVGhhY2tlciIsICJwcm9tb3Rpb25hbExpbmtzIiwgInRpdGxlRWwiLCAiQnJhdFNldHRpbmdzVGFiIiwgImFwcCIsICJwbHVnaW4iLCAiY29udGFpbmVyRWwiLCAicHJvbW90aW9uYWxMaW5rcyIsICJjYiIsICJ2YWx1ZSIsICJfX2FzeW5jIiwgInBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uTmFtZXMiLCAieCIsICJicCIsICJidG4iLCAiQWRkTmV3VGhlbWUiLCAidGhlbWVEZWxldGUiLCAibmV3X2ZvbGRlciIsICJpbXBvcnRfb2JzaWRpYW4iLCAiQWRkTmV3UGx1Z2luTW9kYWwiLCAicGx1Z2luIiwgImJldGFQbHVnaW5zIiwgIm9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMiLCAidXNlRnJvemVuVmVyc2lvbiIsICJfX2FzeW5jIiwgInNjcnViYmVkQWRkcmVzcyIsICJleGlzdEJldGFQbHVnaW5Jbkxpc3QiLCAiVG9hc3RNZXNzYWdlIiwgImZvcm1FbCIsICJ0ZXh0RWwiLCAidmFsdWUiLCAiZSIsICJidXR0b25Db250YWluZXJFbCIsICJuZXdEaXYiLCAiYnlUZlRoYWNrZXIiLCAicHJvbW90aW9uYWxMaW5rcyIsICJ0aXRsZUVsIiwgImltcG9ydF9vYnNpZGlhbiIsICJCZXRhUGx1Z2lucyIsICJwbHVnaW4iLCAib3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcyIsICJ1c2VGcm96ZW5WZXJzaW9uIiwgIl9fYXN5bmMiLCAiQWRkTmV3UGx1Z2luTW9kYWwiLCAicmVwb3NpdG9yeVBhdGgiLCAiZ2V0QmV0YU1hbmlmZXN0IiwgInJlcG9ydElzc3VlcyIsICJtYW5pZmVzdEpzb24iLCAiZ3JhYk1hbmlmZXN0SnNvbkZyb21SZXBvc2l0b3J5IiwgIlRvYXN0TWVzc2FnZSIsICJtYW5pZmVzdCIsICJnZXRNYW5pZmVzdCIsICJzcGVjaWZ5VmVyc2lvbiIsICJ2ZXJzaW9uIiwgInJlYWxseUdldE1hbmlmZXN0T3JOb3QiLCAiZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnkiLCAiYmV0YVBsdWdpbklEIiwgInJlbEZpbGVzIiwgInBsdWdpblRhcmdldEZvbGRlclBhdGgiLCAiYWRhcHRlciIsICJ1cGRhdGVQbHVnaW5GaWxlcyIsICJzZWVJZlVwZGF0ZWRPbmx5IiwgInJlcG9ydElmTm90VXBkdGVkIiwgIl9hIiwgInByaW1hcnlNYW5pZmVzdCIsICJ1c2luZ0JldGFNYW5pZmVzdCIsICJtc2ciLCAiZ2V0UmVsZWFzZSIsICJyRmlsZXMiLCAicmVsZWFzZUZpbGVzIiwgImFkZEJldGFQbHVnaW5Ub0xpc3QiLCAidmVyc2lvblRleHQiLCAibG9jYWxNYW5pZmVzdENvbnRlbnRzIiwgImUiLCAieCIsICJsb2NhbE1hbmlmZXN0SlNPTiIsICJwbHVnaW5OYW1lIiwgInBsdWdpbnMiLCAib25seUNoZWNrRG9udFVwZGF0ZSIsICJyZXN1bHQiLCAic2hvd0luZm8iLCAiaXNDb25uZWN0ZWRUb0ludGVybmV0IiwgIm5ld05vdGljZSIsICJtc2cxIiwgInBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uTmFtZXMiLCAiZiIsICJicCIsICJtc2cyIiwgImIiLCAiZW5hYmxlZCIsICJwbCIsICJtYW5pZmVzdHMiLCAiZW5hYmxlZFBsdWdpbnMiLCAicCIsICJpbXBvcnRfb2JzaWRpYW4iLCAiYWRkSWNvbnMiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbl9kYWlseV9ub3Rlc19pbnRlcmZhY2UiLCAibG9nZ2VyIiwgInBsdWdpbiIsICJ0ZXh0VG9Mb2ciLCAidmVyYm9zZUxvZ2dpbmdPbiIsICJmaWxlTmFtZSIsICJkYXRlT3V0cHV0IiwgIm1hY2hpbmVOYW1lIiwgIm91dHB1dCIsICJfX2FzeW5jIiwgImZpbGVDb250ZW50cyIsICJmaWxlIiwgImltcG9ydF9vYnNpZGlhbiIsICJHZW5lcmljRnV6enlTdWdnZXN0ZXIiLCAicGx1Z2luIiwgImV2dCIsICJzdWdnZXN0ZXJEYXRhIiwgImNhbGxCYWNrIiwgIl9fYXN5bmMiLCAiaXRlbSIsICJlbCIsICJzZWxlY3RlZFRleHQiLCAiaSIsICJQbHVnaW5Db21tYW5kcyIsICJwbHVnaW4iLCAiX19hc3luYyIsICJwbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbk5hbWVzIiwgImYiLCAicGx1Z2luTGlzdCIsICJtIiwgImdmcyIsICJHZW5lcmljRnV6enlTdWdnZXN0ZXIiLCAicmVzdWx0cyIsICJtc2ciLCAiVG9hc3RNZXNzYWdlIiwgIm1hbmlmZXN0IiwgImNvbW11bml0eVBsdWdpbnMiLCAiZ3JhYkNvbW1tdW5pdHlQbHVnaW5MaXN0IiwgImNvbW11bml0eVBsdWdpbkxpc3QiLCAicCIsICJicmF0TGlzdCIsICJzaSIsICJjb21tdW5pdHlUaGVtZSIsICJncmFiQ29tbW11bml0eVRoZW1lc0xpc3QiLCAiY29tbXVuaXR5VGhlbWVMaXN0IiwgInNldHRpbmdzIiwgImxpc3RPZlBsdWdpblNldHRpbmdzVGFicyIsICJ0IiwgImxpc3RPZkNvcmVTZXR0aW5nc1RhYnMiLCAiQWRkTmV3VGhlbWUiLCAidGhlbWVzQ2hlY2tBbmRVcGRhdGVzIiwgIml0ZW0iLCAiYnJhdENvbW1hbmRMaXN0IiwgImNtZCIsICJCcmF0QVBJIiwgInBsdWdpbiIsICJsb2dEZXNjcmlwdGlvbiIsICJvdXRwdXRzIiwgInNob3dJbmZvIiwgIl9fYXN5bmMiLCAidGhlbWVzQ2hlY2tBbmRVcGRhdGVzIiwgImNzc0dpdGh1YlJlcG9zaXRvcnkiLCAic2NydWJiZWRBZGRyZXNzIiwgInRoZW1lU2F2ZSIsICJ0aGVtZURlbGV0ZSIsICJyZXBvc2l0b3J5UGF0aCIsICJiZXRhVmVyc2lvbiIsICJncmFiQ29tbW11bml0eVRoZW1lQ3NzRmlsZSIsICJncmFiQ2hlY2tzdW1PZlRoZW1lQ3NzRmlsZSIsICJwYXRoIiwgImdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlIiwgIlRoZVBsdWdpbiIsICJfX2FzeW5jIiwgIkJyYXRTZXR0aW5nc1RhYiIsICJCZXRhUGx1Z2lucyIsICJQbHVnaW5Db21tYW5kcyIsICJhZGRJY29ucyIsICJ0aGVtZXNDaGVja0FuZFVwZGF0ZXMiLCAiQnJhdEFQSSIsICJ0ZXh0VG9Mb2ciLCAidmVyYm9zZSIsICJsb2dnZXIiLCAiREVGQVVMVF9TRVRUSU5HUyJdCn0K
|