UNPKG

use-fs

Version:

A React hook for integrating with the File System Access API. Enables web applications to seamlessly work with files on a user's local system.

2 lines 49.8 kB
"use strict";var oe=Object.create;var P=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var ae=Object.getPrototypeOf,ue=Object.prototype.hasOwnProperty;var de=(t,r)=>{for(var n in r)P(t,n,{get:r[n],enumerable:!0})},j=(t,r,n,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let c of le(r))!ue.call(t,c)&&c!==n&&P(t,c,{get:()=>r[c],enumerable:!(o=ce(r,c))||o.enumerable});return t};var fe=(t,r,n)=>(n=t!=null?oe(ae(t)):{},j(r||!t||!t.__esModule?P(n,"default",{value:t,enumerable:!0}):n,t)),ge=t=>j(P({},"__esModule",{value:!0}),t);var Me={};de(Me,{commonFilters:()=>K,distFilter:()=>q,gitFilter:()=>Z,miscFilter:()=>G,processDirectory:()=>W,useFileSystem:()=>Q,useFs:()=>be});module.exports=ge(Me);var J=fe(require("ignore")),s=require("react"),Z=async()=>{let t=(0,J.default)({allowRelativePaths:!0}),r=!1;return{shouldIncludeFile:async(n,o)=>{if(n.endsWith(".gitignore")&&!r&&o.kind==="file"){let i=await(await o.getFile()).text();return t.add(i),r=!0,!1}let{ignored:c}=t.test(n);return!c},shouldProcessDirectory:async(n,o)=>{let{ignored:c}=t.test(n);return n.endsWith(".git")||n.includes(".git/")?!1:!c}}},q=async()=>{let t=r=>!!(r.includes("/dist/")||r.includes("/out/")||r.includes("/build/")||r.includes("/vendor/")||r.includes("/node_modules/")||r.includes("/.next/"));return{shouldIncludeFile:async(r,n)=>!t(r),shouldProcessDirectory:async(r,n)=>!t(r)}},G=async()=>{let t=r=>!!(r.endsWith(".DS_Store")||r.endsWith(".crswap"));return{shouldIncludeFile:async(r,n)=>!t(r),shouldProcessDirectory:async(r,n)=>!t(r)}},K=[q,G,Z],W=async(t,r,n,o,c)=>{if(c.has(r))return o;for(let i of n)if(await i.shouldProcessDirectory(r,t)===!1)return c.add(r),o;let x=[];for await(let i of t.values())if(i.kind==="file"){let d=`${r}/${i.name}`;c.has(d)||x.push((async()=>{let a=!0;for(let I of n)if(await I.shouldIncludeFile(d,i)===!1){a=!1,c.add(d),o.delete(d);break}a&&o.set(d,i)})())}await Promise.all(x);let b=[];for await(let i of t.values())if(i.kind==="directory"){let d=`${r}/${i.name}`;c.has(d)||b.push(W(i,d,n,o,c))}return await Promise.all(b),o},Fe=(t,r)=>{let[n,o]=(0,s.useState)(t);return(0,s.useEffect)(()=>{let c=setTimeout(()=>{o(t)},r);return()=>{clearTimeout(c)}},[t,r]),n},me=100,we=50,ye=50,pe=5e3,Q=t=>{let{onFilesAdded:r,onFilesChanged:n,onFilesDeleted:o,batchSize:c=we,debounceInterval:x=ye}=t,b=(0,s.useRef)(new Map),i=(0,s.useRef)(new Map),d=(0,s.useRef)(new Set),a=(0,s.useRef)({}),I=(0,s.useRef)({}),H=(0,s.useRef)(null),[X,A]=(0,s.useState)(new Map),[_,$]=(0,s.useState)(!1),[Y,O]=(0,s.useState)(!1),S=(0,s.useRef)(new Map),R=t.fileCacheTtl||pe,U=(0,s.useCallback)(()=>{H.current&&(clearInterval(H.current),H.current=null),b.current.clear(),i.current.clear(),d.current.clear(),a.current={},I.current={},S.current.clear(),A(new Map),O(!1)},[]),N=(0,s.useCallback)(async()=>{let e=new Map,u=new Set,w=t.filters||K,f=[];for(let m of w)f.push(await m());let g=[];b.current.forEach((m,F)=>{g.push(W(m,F,f,e,u))}),await Promise.all(g),e.forEach((m,F)=>{u.has(F)&&e.delete(F)}),i.current=e},[t.filters]),z=(0,s.useCallback)(async()=>{I.current={...a.current||{}};let e=new Set,u=new Map,w=new Set,f=!1,g=Date.now(),m=Array.from(i.current),F={};for(let l=0;l<m.length;l+=c){let L=m.slice(l,l+c);await Promise.all(L.map(async([p,V])=>{if(V.kind==="file"){e.add(p);try{let h=S.current.get(p);if(h&&g-h.timestamp<R){F[p]=h.content,h.content!==I.current[p]&&u.set(p,h.content);return}let T=await(await V.getFile()).text();S.current.set(p,{content:T,timestamp:g}),F[p]=T,T!==I.current[p]&&u.set(p,T)}catch{i.current.delete(p),w.add(p),S.current.delete(p),f=!0}}}))}let M=Array.from(S.current.entries());for(let[l,{timestamp:L}]of M)g-L>R&&S.current.delete(l);let y=Array.from([...Array.from(d.current),...Array.from(w)]).filter(l=>!e.has(l)),v=Array.from(e).filter(l=>!d.current.has(l)),D=new Map;for(let l of v)D.set(l,a.current[l]);let E=new Map;for(let l of y)E.set(l,a.current[l]),i.current.delete(l),delete a.current[l];let B=new Map(Array.from(d.current).map(l=>[l,a.current[l]]));u.size>0&&(f=!0,n==null||n(u,B)),y.length>0&&(f=!0,o==null||o(E,B)),v.length>0&&(f=!0,r==null||r(D,B)),d.current=e,a.current=F,f&&A(new Map(Object.entries(a.current)))},[r,n,o,c,R]),ee=Fe(X,x),k=(0,s.useCallback)(()=>{let e=null;H.current||(H.current=setInterval(async()=>{_||e||($(!0),e=(async()=>{try{await N(),await z()}finally{$(!1),e=null}})())},t.pollInterval||me),O(!0))},[N,z,_,t.pollInterval]),re=(0,s.useCallback)(()=>{H.current&&(clearInterval(H.current),H.current=null,O(!1))},[]),te=(0,s.useCallback)(()=>{b.current.size>0&&k()},[k]),ne=async()=>{try{let e=await window.showDirectoryPicker();if(!e)return;let u=e.name;b.current.set(u,e),k()}catch(e){console.error("Error during directory selection:"),console.error(e)}},C=(0,s.useCallback)(async(e,u,w={})=>{if(!e||typeof e!="string")throw new Error("Invalid file path");let{create:f=!0,truncate:g=!1}=w;if(!i.current.get(e)){if(!f)throw new Error(`File not found: ${e}`);let y=e.substring(0,e.lastIndexOf("/")),v=e.substring(e.lastIndexOf("/")+1);if(!(y&&v))throw new Error("Invalid file path structure");let D=b.current.get(y);if(!D)throw new Error(`Directory not found: ${y}`);let E=await D.getFileHandle(v,{create:!0});i.current.set(e,E)}let F=i.current.get(e);if(!F)throw new Error(`File not found: ${e}`);if(F.name!==e.split("/").pop())throw new Error("File path mismatch");let M=await F.createWritable({keepExistingData:!g});try{await M.write(u),await M.close();let y=typeof u=="string"?u:await new Response(u).text();S.current.set(e,{content:y,timestamp:Date.now()});let v=new Map([[e,y]]),D=new Map(Array.from(d.current).map(E=>[E,a.current[E]]));n==null||n(v,D),a.current[e]=y,A(new Map(Object.entries(a.current)))}catch(y){throw await M.abort(),y}},[n]),se=(0,s.useCallback)(async(e,u)=>{let w=e.substring(0,e.lastIndexOf("/")),f=e.substring(e.lastIndexOf("/")+1),g=b.current.get(w);if(!g)throw new Error(`Directory not found: ${w}`);let m=await g.getFileHandle(f,{create:!0});return i.current.set(e,m),u&&await C(e,u,{truncate:!0}),m},[C]),ie=(0,s.useCallback)(async e=>{if(!i.current.get(e))throw new Error(`File not found: ${e}`);let w=e.substring(0,e.lastIndexOf("/")),f=e.substring(e.lastIndexOf("/")+1),g=b.current.get(w);if(!g)throw new Error(`Directory not found: ${w}`);await g.removeEntry(f),i.current.delete(e),S.current.delete(e);let m=new Map([[e,a.current[e]]]),F=new Map(Array.from(d.current).map(M=>[M,a.current[M]]));delete a.current[e],d.current.delete(e),o==null||o(m,F),A(new Map(Object.entries(a.current)))},[o]);return Se(()=>{U()}),{handles:i.current,onDirectorySelection:ne,onClear:U,files:ee,setFiles:A,isProcessing:_,isBrowserSupported:window!==void 0&&"showDirectoryPicker"in window,writeFile:C,createFile:se,deleteFile:ie,stopPolling:re,startPolling:te,isPolling:Y}},be=Q,He=t=>{(0,s.useEffect)(t,[])},Se=t=>{let r=(0,s.useRef)(t);r.current=t,He(()=>()=>r.current())};0&&(module.exports={commonFilters,distFilter,gitFilter,miscFilter,processDirectory,useFileSystem,useFs}); //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgaWdub3JlIGZyb20gXCJpZ25vcmVcIjtcbmltcG9ydCB7XG5cdHR5cGUgRWZmZWN0Q2FsbGJhY2ssXG5cdHVzZUNhbGxiYWNrLFxuXHR1c2VFZmZlY3QsXG5cdHVzZVJlZixcblx0dXNlU3RhdGUsXG59IGZyb20gXCJyZWFjdFwiO1xuXG5leHBvcnQgdHlwZSBGaWxlV3JpdGVPcHRpb25zID0ge1xuXHQvKiogV2hldGhlciB0byBjcmVhdGUgdGhlIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdCAqL1xuXHRjcmVhdGU/OiBib29sZWFuO1xuXHQvKiogV2hldGhlciB0byB0cnVuY2F0ZSB0aGUgZmlsZSBpZiBpdCBleGlzdHMgKi9cblx0dHJ1bmNhdGU/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgRmlsZU9wZXJhdGlvbnMgPSB7XG5cdC8qKiBXcml0ZSBkYXRhIHRvIGEgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKi9cblx0d3JpdGVGaWxlOiAoXG5cdFx0cGF0aDogc3RyaW5nLFxuXHRcdGRhdGE6IHN0cmluZyB8IEFycmF5QnVmZmVyIHwgQmxvYixcblx0XHRvcHRpb25zPzogRmlsZVdyaXRlT3B0aW9ucyxcblx0KSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKiBDcmVhdGUgYSBuZXcgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKi9cblx0Y3JlYXRlRmlsZTogKFxuXHRcdHBhdGg6IHN0cmluZyxcblx0XHRpbml0aWFsRGF0YT86IHN0cmluZyB8IEFycmF5QnVmZmVyIHwgQmxvYixcblx0KSA9PiBQcm9taXNlPEZpbGVTeXN0ZW1GaWxlSGFuZGxlPjtcblxuXHQvKiogRGVsZXRlIGEgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKi9cblx0ZGVsZXRlRmlsZTogKHBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbHRlciA9IHtcblx0c2hvdWxkSW5jbHVkZUZpbGU6IChcblx0XHRmaWxlcGF0aDogc3RyaW5nLFxuXHRcdGhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSxcblx0KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuXHRzaG91bGRQcm9jZXNzRGlyZWN0b3J5OiAoXG5cdFx0ZmlsZXBhdGg6IHN0cmluZyxcblx0XHRoYW5kbGU6IEZpbGVTeXN0ZW1IYW5kbGUsXG5cdCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbHRlckZuID0gKCkgPT4gUHJvbWlzZTxGaWx0ZXI+O1xuXG5leHBvcnQgY29uc3QgZ2l0RmlsdGVyOiBGaWx0ZXJGbiA9IGFzeW5jICgpID0+IHtcblx0Y29uc3QgaWcgPSBpZ25vcmUoe1xuXHRcdGFsbG93UmVsYXRpdmVQYXRoczogdHJ1ZSxcblx0fSk7XG5cblx0Ly8gVE9ETyBzdXBwb3J0IG11bHRpcGxlIGdpdGlnbm9yZSBmaWxlc1xuXHRsZXQgZ2l0SWdub3JlTG9hZGVkID0gZmFsc2U7XG5cblx0cmV0dXJuIHtcblx0XHRzaG91bGRJbmNsdWRlRmlsZTogYXN5bmMgKGZpbGVwYXRoOiBzdHJpbmcsIGhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSkgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRmaWxlcGF0aC5lbmRzV2l0aChcIi5naXRpZ25vcmVcIikgJiZcblx0XHRcdFx0IWdpdElnbm9yZUxvYWRlZCAmJlxuXHRcdFx0XHRoYW5kbGUua2luZCA9PT0gXCJmaWxlXCJcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBmaWxlSGFuZGxlID0gaGFuZGxlIGFzIEZpbGVTeXN0ZW1GaWxlSGFuZGxlO1xuXHRcdFx0XHRjb25zdCBmaWxlID0gYXdhaXQgZmlsZUhhbmRsZS5nZXRGaWxlKCk7XG5cdFx0XHRcdGNvbnN0IHRleHQgPSBhd2FpdCBmaWxlLnRleHQoKTtcblx0XHRcdFx0aWcuYWRkKHRleHQpO1xuXHRcdFx0XHRnaXRJZ25vcmVMb2FkZWQgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB7IGlnbm9yZWQgfSA9IGlnLnRlc3QoZmlsZXBhdGgpO1xuXG5cdFx0XHRyZXR1cm4gIWlnbm9yZWQ7XG5cdFx0fSxcblx0XHRzaG91bGRQcm9jZXNzRGlyZWN0b3J5OiBhc3luYyAoXG5cdFx0XHRmaWxlcGF0aDogc3RyaW5nLFxuXHRcdFx0X2hhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSxcblx0XHQpID0+IHtcblx0XHRcdGNvbnN0IHsgaWdub3JlZCB9ID0gaWcudGVzdChmaWxlcGF0aCk7XG5cblx0XHRcdGlmIChmaWxlcGF0aC5lbmRzV2l0aChcIi5naXRcIikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZmlsZXBhdGguaW5jbHVkZXMoXCIuZ2l0L1wiKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAhaWdub3JlZDtcblx0XHR9LFxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGRpc3RGaWx0ZXI6IEZpbHRlckZuID0gYXN5bmMgKCkgPT4ge1xuXHRjb25zdCBpc0Rpc3QgPSAoZmlsZXBhdGg6IHN0cmluZykgPT4ge1xuXHRcdGlmIChmaWxlcGF0aC5pbmNsdWRlcyhcIi9kaXN0L1wiKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmIChmaWxlcGF0aC5pbmNsdWRlcyhcIi9vdXQvXCIpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKGZpbGVwYXRoLmluY2x1ZGVzKFwiL2J1aWxkL1wiKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmIChmaWxlcGF0aC5pbmNsdWRlcyhcIi92ZW5kb3IvXCIpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKGZpbGVwYXRoLmluY2x1ZGVzKFwiL25vZGVfbW9kdWxlcy9cIikpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZiAoZmlsZXBhdGguaW5jbHVkZXMoXCIvLm5leHQvXCIpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdHNob3VsZEluY2x1ZGVGaWxlOiBhc3luYyAoZmlsZXBhdGg6IHN0cmluZywgX2hhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSkgPT4ge1xuXHRcdFx0aWYgKGlzRGlzdChmaWxlcGF0aCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblx0XHRzaG91bGRQcm9jZXNzRGlyZWN0b3J5OiBhc3luYyAoXG5cdFx0XHRmaWxlcGF0aDogc3RyaW5nLFxuXHRcdFx0X2hhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSxcblx0XHQpID0+IHtcblx0XHRcdGlmIChpc0Rpc3QoZmlsZXBhdGgpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cdH07XG59O1xuXG5leHBvcnQgY29uc3QgbWlzY0ZpbHRlcjogRmlsdGVyRm4gPSBhc3luYyAoKSA9PiB7XG5cdGNvbnN0IGlzTWlzYyA9IChmaWxlcGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0aWYgKGZpbGVwYXRoLmVuZHNXaXRoKFwiLkRTX1N0b3JlXCIpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKGZpbGVwYXRoLmVuZHNXaXRoKFwiLmNyc3dhcFwiKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRzaG91bGRJbmNsdWRlRmlsZTogYXN5bmMgKGZpbGVwYXRoOiBzdHJpbmcsIF9oYW5kbGU6IEZpbGVTeXN0ZW1IYW5kbGUpID0+IHtcblx0XHRcdGlmIChpc01pc2MoZmlsZXBhdGgpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cdFx0c2hvdWxkUHJvY2Vzc0RpcmVjdG9yeTogYXN5bmMgKFxuXHRcdFx0ZmlsZXBhdGg6IHN0cmluZyxcblx0XHRcdF9oYW5kbGU6IEZpbGVTeXN0ZW1IYW5kbGUsXG5cdFx0KSA9PiB7XG5cdFx0XHRpZiAoaXNNaXNjKGZpbGVwYXRoKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbW1vbkZpbHRlcnMgPSBbZGlzdEZpbHRlciwgbWlzY0ZpbHRlciwgZ2l0RmlsdGVyXTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzRGlyZWN0b3J5ID0gYXN5bmMgKFxuXHRkaXJlY3RvcnlIYW5kbGU6IEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUsXG5cdGRpcmVjdG9yeVBhdGg6IHN0cmluZyxcblx0ZmlsdGVyczogRmlsdGVyW10sXG5cdGluY2x1ZGVGaWxlczogTWFwPHN0cmluZywgRmlsZVN5c3RlbUZpbGVIYW5kbGU+LFxuXHRpZ25vcmVGaWxlUGF0aHM6IFNldDxzdHJpbmc+LFxuKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBGaWxlU3lzdGVtRmlsZUhhbmRsZT4+ID0+IHtcblx0Ly8gRWFybHkgZXhpdCBpZiBkaXJlY3RvcnkgaXMgYWxyZWFkeSBpZ25vcmVkXG5cdGlmIChpZ25vcmVGaWxlUGF0aHMuaGFzKGRpcmVjdG9yeVBhdGgpKSB7XG5cdFx0cmV0dXJuIGluY2x1ZGVGaWxlcztcblx0fVxuXG5cdC8vIENoZWNrIGRpcmVjdG9yeSBhZ2FpbnN0IGZpbHRlcnMgZmlyc3Rcblx0Zm9yIChjb25zdCBmaWx0ZXIgb2YgZmlsdGVycykge1xuXHRcdGlmIChcblx0XHRcdChhd2FpdCBmaWx0ZXIuc2hvdWxkUHJvY2Vzc0RpcmVjdG9yeShkaXJlY3RvcnlQYXRoLCBkaXJlY3RvcnlIYW5kbGUpKSA9PT1cblx0XHRcdGZhbHNlXG5cdFx0KSB7XG5cdFx0XHRpZ25vcmVGaWxlUGF0aHMuYWRkKGRpcmVjdG9yeVBhdGgpO1xuXHRcdFx0cmV0dXJuIGluY2x1ZGVGaWxlcztcblx0XHR9XG5cdH1cblxuXHQvLyBQcm9jZXNzIGZpbGVzIGZpcnN0XG5cdGNvbnN0IGZpbGVQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cdC8vIEB0cy1pZ25vcmVcblx0Zm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiBkaXJlY3RvcnlIYW5kbGUudmFsdWVzKCkpIHtcblx0XHRpZiAoZW50cnkua2luZCA9PT0gXCJmaWxlXCIpIHtcblx0XHRcdGNvbnN0IHBhdGggPSBgJHtkaXJlY3RvcnlQYXRofS8ke2VudHJ5Lm5hbWV9YDtcblx0XHRcdGlmICghaWdub3JlRmlsZVBhdGhzLmhhcyhwYXRoKSkge1xuXHRcdFx0XHRmaWxlUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IHNob3VsZEluY2x1ZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBmaWx0ZXIgb2YgZmlsdGVycykge1xuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0KGF3YWl0IGZpbHRlci5zaG91bGRJbmNsdWRlRmlsZShcblx0XHRcdFx0XHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRyeSBhcyBGaWxlU3lzdGVtRmlsZUhhbmRsZSxcblx0XHRcdFx0XHRcdFx0XHQpKSA9PT0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0c2hvdWxkSW5jbHVkZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGlnbm9yZUZpbGVQYXRocy5hZGQocGF0aCk7XG5cdFx0XHRcdFx0XHRcdFx0aW5jbHVkZUZpbGVzLmRlbGV0ZShwYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHNob3VsZEluY2x1ZGUpIHtcblx0XHRcdFx0XHRcdFx0aW5jbHVkZUZpbGVzLnNldChwYXRoLCBlbnRyeSBhcyBGaWxlU3lzdGVtRmlsZUhhbmRsZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkoKSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0YXdhaXQgUHJvbWlzZS5hbGwoZmlsZVByb21pc2VzKTtcblxuXHQvLyBQcm9jZXNzIGRpcmVjdG9yaWVzXG5cdGNvbnN0IGRpclByb21pc2VzOiBQcm9taXNlPE1hcDxzdHJpbmcsIEZpbGVTeXN0ZW1GaWxlSGFuZGxlPj5bXSA9IFtdO1xuXHQvLyBAdHMtaWdub3JlXG5cdGZvciBhd2FpdCAoY29uc3QgZW50cnkgb2YgZGlyZWN0b3J5SGFuZGxlLnZhbHVlcygpKSB7XG5cdFx0aWYgKGVudHJ5LmtpbmQgPT09IFwiZGlyZWN0b3J5XCIpIHtcblx0XHRcdGNvbnN0IHBhdGggPSBgJHtkaXJlY3RvcnlQYXRofS8ke2VudHJ5Lm5hbWV9YDtcblx0XHRcdGlmICghaWdub3JlRmlsZVBhdGhzLmhhcyhwYXRoKSkge1xuXHRcdFx0XHRkaXJQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRcdHByb2Nlc3NEaXJlY3RvcnkoXG5cdFx0XHRcdFx0XHRlbnRyeSBhcyBGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlLFxuXHRcdFx0XHRcdFx0cGF0aCxcblx0XHRcdFx0XHRcdGZpbHRlcnMsXG5cdFx0XHRcdFx0XHRpbmNsdWRlRmlsZXMsXG5cdFx0XHRcdFx0XHRpZ25vcmVGaWxlUGF0aHMsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0YXdhaXQgUHJvbWlzZS5hbGwoZGlyUHJvbWlzZXMpO1xuXG5cdHJldHVybiBpbmNsdWRlRmlsZXM7XG59O1xuXG5jb25zdCB1c2VEZWJvdW5jZSA9IDxUPih2YWx1ZTogVCwgZGVsYXk6IG51bWJlcik6IFQgPT4ge1xuXHRjb25zdCBbZGVib3VuY2VkVmFsdWUsIHNldERlYm91bmNlZFZhbHVlXSA9IHVzZVN0YXRlPFQ+KHZhbHVlKTtcblxuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdGNvbnN0IGhhbmRsZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHNldERlYm91bmNlZFZhbHVlKHZhbHVlKTtcblx0XHR9LCBkZWxheSk7XG5cblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KGhhbmRsZXIpO1xuXHRcdH07XG5cdH0sIFt2YWx1ZSwgZGVsYXldKTtcblxuXHRyZXR1cm4gZGVib3VuY2VkVmFsdWU7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUZpbGVIYW5kbGluZ0hvb2tQcm9wcyB7XG5cdGZpbHRlcnM/OiBGaWx0ZXJGbltdO1xuXHRvbkZpbGVzQWRkZWQ/OiAoXG5cdFx0bmV3RmlsZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG5cdFx0cHJldmlvdXNGaWxlczogTWFwPHN0cmluZywgc3RyaW5nPixcblx0KSA9PiB2b2lkO1xuXHRvbkZpbGVzQ2hhbmdlZD86IChcblx0XHRjaGFuZ2VkRmlsZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG5cdFx0cHJldmlvdXNGaWxlczogTWFwPHN0cmluZywgc3RyaW5nPixcblx0KSA9PiB2b2lkO1xuXHRvbkZpbGVzRGVsZXRlZD86IChcblx0XHRkZWxldGVkRmlsZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG5cdFx0cHJldmlvdXNGaWxlczogTWFwPHN0cmluZywgc3RyaW5nPixcblx0KSA9PiB2b2lkO1xuXHRwb2xsSW50ZXJ2YWw/OiBudW1iZXI7XG5cdGJhdGNoU2l6ZT86IG51bWJlcjtcblx0ZGVib3VuY2VJbnRlcnZhbD86IG51bWJlcjtcblx0LyoqIFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGNhY2hlIGZpbGUgY29udGVudHMgYmVmb3JlIHJlLXJlYWRpbmcgZnJvbSBkaXNrLiBEZWZhdWx0cyB0byA1MDAwbXMgKDUgc2Vjb25kcykgKi9cblx0ZmlsZUNhY2hlVHRsPzogbnVtYmVyO1xufVxuXG5jb25zdCBERUZBVUxUX1BPTExfSU5URVJWQUwgPSAxMDA7XG5jb25zdCBERUZBVUxUX0JBVENIX1NJWkUgPSA1MDtcbmNvbnN0IERFRkFVTFRfREVCT1VOQ0VfSU5URVJWQUwgPSA1MDtcbmNvbnN0IERFRkFVTFRfRklMRV9DQUNIRV9UVEwgPSA1MDAwOyAvLyA1IHNlY29uZHNcblxuZXhwb3J0IGNvbnN0IHVzZUZpbGVTeXN0ZW0gPSAocHJvcHM6IFVzZUZpbGVIYW5kbGluZ0hvb2tQcm9wcykgPT4ge1xuXHRjb25zdCB7XG5cdFx0b25GaWxlc0FkZGVkOiBvbkFkZEZpbGUsXG5cdFx0b25GaWxlc0NoYW5nZWQ6IG9uQ2hhbmdlRmlsZSxcblx0XHRvbkZpbGVzRGVsZXRlZDogb25EZWxldGVGaWxlLFxuXHRcdGJhdGNoU2l6ZSA9IERFRkFVTFRfQkFUQ0hfU0laRSxcblx0XHRkZWJvdW5jZUludGVydmFsID0gREVGQVVMVF9ERUJPVU5DRV9JTlRFUlZBTCxcblx0fSA9IHByb3BzO1xuXG5cdGNvbnN0IHdhdGNoZWREaXJlY3Rvcmllc1JlZiA9IHVzZVJlZjxNYXA8c3RyaW5nLCBGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlPj4oXG5cdFx0bmV3IE1hcCgpLFxuXHQpO1xuXHRjb25zdCBoYW5kbGVzUmVmID0gdXNlUmVmPE1hcDxzdHJpbmcsIEZpbGVTeXN0ZW1GaWxlSGFuZGxlPj4obmV3IE1hcCgpKTtcblx0Y29uc3QgcHJldmlvdXNIYW5kbGVzUmVmID0gdXNlUmVmPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuXHRjb25zdCBmaWxlc01hcFJlZiA9IHVzZVJlZjxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSk7XG5cdGNvbnN0IHByZXZpb3VzRmlsZXNNYXBSZWYgPSB1c2VSZWY8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pO1xuXHRjb25zdCBpbnRlcnZhbFJlZiA9IHVzZVJlZjxOb2RlSlMuVGltZW91dCB8IG51bGw+KG51bGwpO1xuXHRjb25zdCBbZmlsZXMsIHNldEZpbGVzXSA9IHVzZVN0YXRlPE1hcDxzdHJpbmcsIHN0cmluZz4+KG5ldyBNYXAoKSk7XG5cdGNvbnN0IFtpc1Byb2Nlc3NpbmcsIHNldElzUHJvY2Vzc2luZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG5cdGNvbnN0IFtpc1BvbGxpbmcsIHNldElzUG9sbGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG5cblx0Ly8gQWRkIGEgY2FjaGUgZm9yIGZpbGUgY29udGVudHNcblx0Y29uc3QgZmlsZUNvbnRlbnRzQ2FjaGUgPSB1c2VSZWY8XG5cdFx0TWFwPHN0cmluZywgeyBjb250ZW50OiBzdHJpbmc7IHRpbWVzdGFtcDogbnVtYmVyIH0+XG5cdD4obmV3IE1hcCgpKTtcblx0Y29uc3QgZmlsZUNhY2hlVHRsID0gcHJvcHMuZmlsZUNhY2hlVHRsIHx8IERFRkFVTFRfRklMRV9DQUNIRV9UVEw7XG5cblx0Y29uc3QgY2xlYXJXYXRjaGVkRGlyZWN0b3JpZXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG5cdFx0aWYgKGludGVydmFsUmVmLmN1cnJlbnQpIHtcblx0XHRcdGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxSZWYuY3VycmVudCk7XG5cdFx0XHRpbnRlcnZhbFJlZi5jdXJyZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR3YXRjaGVkRGlyZWN0b3JpZXNSZWYuY3VycmVudC5jbGVhcigpO1xuXHRcdGhhbmRsZXNSZWYuY3VycmVudC5jbGVhcigpO1xuXHRcdHByZXZpb3VzSGFuZGxlc1JlZi5jdXJyZW50LmNsZWFyKCk7XG5cdFx0ZmlsZXNNYXBSZWYuY3VycmVudCA9IHt9O1xuXHRcdHByZXZpb3VzRmlsZXNNYXBSZWYuY3VycmVudCA9IHt9O1xuXHRcdGZpbGVDb250ZW50c0NhY2hlLmN1cnJlbnQuY2xlYXIoKTtcblx0XHRzZXRGaWxlcyhuZXcgTWFwKCkpO1xuXHRcdHNldElzUG9sbGluZyhmYWxzZSk7XG5cdH0sIFtdKTtcblxuXHRjb25zdCBwcm9jZXNzV2F0Y2hlZERpcmVjdG9yaWVzID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuXHRcdGNvbnN0IHRlbXBvcmFyeUhhbmRsZXMgPSBuZXcgTWFwPHN0cmluZywgRmlsZVN5c3RlbUZpbGVIYW5kbGU+KCk7XG5cdFx0Y29uc3QgaWdub3JlRmlsZVBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cblx0XHRjb25zdCBmaWx0ZXJGbnM6IEZpbHRlckZuW10gPSBwcm9wcy5maWx0ZXJzIHx8IGNvbW1vbkZpbHRlcnM7XG5cdFx0Y29uc3QgZmlsdGVyczogRmlsdGVyW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgZmlsdGVyRm4gb2YgZmlsdGVyRm5zKSB7XG5cdFx0XHRmaWx0ZXJzLnB1c2goYXdhaXQgZmlsdGVyRm4oKSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGlyUHJvbWlzZXM6IFByb21pc2U8TWFwPHN0cmluZywgRmlsZVN5c3RlbUZpbGVIYW5kbGU+PltdID0gW107XG5cdFx0d2F0Y2hlZERpcmVjdG9yaWVzUmVmLmN1cnJlbnQuZm9yRWFjaCgoZGlyZWN0b3J5SGFuZGxlLCBkaXJlY3RvcnlQYXRoKSA9PiB7XG5cdFx0XHRkaXJQcm9taXNlcy5wdXNoKFxuXHRcdFx0XHRwcm9jZXNzRGlyZWN0b3J5KFxuXHRcdFx0XHRcdGRpcmVjdG9yeUhhbmRsZSxcblx0XHRcdFx0XHRkaXJlY3RvcnlQYXRoLFxuXHRcdFx0XHRcdGZpbHRlcnMsXG5cdFx0XHRcdFx0dGVtcG9yYXJ5SGFuZGxlcyxcblx0XHRcdFx0XHRpZ25vcmVGaWxlUGF0aHMsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH0pO1xuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoZGlyUHJvbWlzZXMpO1xuXG5cdFx0dGVtcG9yYXJ5SGFuZGxlcy5mb3JFYWNoKChfLCBmaWxlUGF0aCkgPT4ge1xuXHRcdFx0aWYgKGlnbm9yZUZpbGVQYXRocy5oYXMoZmlsZVBhdGgpKSB7XG5cdFx0XHRcdHRlbXBvcmFyeUhhbmRsZXMuZGVsZXRlKGZpbGVQYXRoKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGhhbmRsZXNSZWYuY3VycmVudCA9IHRlbXBvcmFyeUhhbmRsZXM7XG5cdH0sIFtwcm9wcy5maWx0ZXJzXSk7XG5cblx0Y29uc3QgcHJvY2Vzc0ZpbGVzID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuXHRcdHByZXZpb3VzRmlsZXNNYXBSZWYuY3VycmVudCA9IHtcblx0XHRcdC4uLihmaWxlc01hcFJlZi5jdXJyZW50IHx8IHt9KSxcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc2VlbkZpbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0Y29uc3QgY2hhbmdlZEZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblx0XHRjb25zdCBkZWxldGVkRmlsZXNTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRsZXQgcmVyZW5kZXIgPSBmYWxzZTtcblxuXHRcdGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cdFx0Y29uc3QgaGFuZGxlcyA9IEFycmF5LmZyb20oaGFuZGxlc1JlZi5jdXJyZW50KTtcblx0XHRjb25zdCBuZXdGaWxlc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBoYW5kbGVzLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHtcblx0XHRcdGNvbnN0IGJhdGNoID0gaGFuZGxlcy5zbGljZShpLCBpICsgYmF0Y2hTaXplKTtcblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0XHRiYXRjaC5tYXAoYXN5bmMgKFtmaWxlUGF0aCwgaGFuZGxlXSkgPT4ge1xuXHRcdFx0XHRcdGlmIChoYW5kbGUua2luZCA9PT0gXCJmaWxlXCIpIHtcblx0XHRcdFx0XHRcdHNlZW5GaWxlcy5hZGQoZmlsZVBhdGgpO1xuXG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjYWNoZWQgPSBmaWxlQ29udGVudHNDYWNoZS5jdXJyZW50LmdldChmaWxlUGF0aCk7XG5cdFx0XHRcdFx0XHRcdGlmIChjYWNoZWQgJiYgbm93IC0gY2FjaGVkLnRpbWVzdGFtcCA8IGZpbGVDYWNoZVR0bCkge1xuXHRcdFx0XHRcdFx0XHRcdG5ld0ZpbGVzTWFwW2ZpbGVQYXRoXSA9IGNhY2hlZC5jb250ZW50O1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjYWNoZWQuY29udGVudCAhPT0gcHJldmlvdXNGaWxlc01hcFJlZi5jdXJyZW50W2ZpbGVQYXRoXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y2hhbmdlZEZpbGVzLnNldChmaWxlUGF0aCwgY2FjaGVkLmNvbnRlbnQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRjb25zdCBmaWxlID0gYXdhaXQgKGhhbmRsZSBhcyBGaWxlU3lzdGVtRmlsZUhhbmRsZSkuZ2V0RmlsZSgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0ZXh0ID0gYXdhaXQgZmlsZS50ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdGZpbGVDb250ZW50c0NhY2hlLmN1cnJlbnQuc2V0KGZpbGVQYXRoLCB7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudDogdGV4dCxcblx0XHRcdFx0XHRcdFx0XHR0aW1lc3RhbXA6IG5vdyxcblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0bmV3RmlsZXNNYXBbZmlsZVBhdGhdID0gdGV4dDtcblx0XHRcdFx0XHRcdFx0aWYgKHRleHQgIT09IHByZXZpb3VzRmlsZXNNYXBSZWYuY3VycmVudFtmaWxlUGF0aF0pIHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VkRmlsZXMuc2V0KGZpbGVQYXRoLCB0ZXh0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0aGFuZGxlc1JlZi5jdXJyZW50LmRlbGV0ZShmaWxlUGF0aCk7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZWRGaWxlc1NldC5hZGQoZmlsZVBhdGgpO1xuXHRcdFx0XHRcdFx0XHRmaWxlQ29udGVudHNDYWNoZS5jdXJyZW50LmRlbGV0ZShmaWxlUGF0aCk7XG5cdFx0XHRcdFx0XHRcdHJlcmVuZGVyID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyBDbGVhbiB1cCBvbGQgY2FjaGUgZW50cmllc1xuXHRcdGNvbnN0IGNhY2hlRW50cmllcyA9IEFycmF5LmZyb20oZmlsZUNvbnRlbnRzQ2FjaGUuY3VycmVudC5lbnRyaWVzKCkpO1xuXHRcdGZvciAoY29uc3QgW3BhdGgsIHsgdGltZXN0YW1wIH1dIG9mIGNhY2hlRW50cmllcykge1xuXHRcdFx0aWYgKG5vdyAtIHRpbWVzdGFtcCA+IGZpbGVDYWNoZVR0bCkge1xuXHRcdFx0XHRmaWxlQ29udGVudHNDYWNoZS5jdXJyZW50LmRlbGV0ZShwYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBkZWxldGVkRmlsZXMgPSBBcnJheS5mcm9tKFtcblx0XHRcdC4uLkFycmF5LmZyb20ocHJldmlvdXNIYW5kbGVzUmVmLmN1cnJlbnQpLFxuXHRcdFx0Li4uQXJyYXkuZnJvbShkZWxldGVkRmlsZXNTZXQpLFxuXHRcdF0pLmZpbHRlcigoZmlsZVBhdGgpID0+ICFzZWVuRmlsZXMuaGFzKGZpbGVQYXRoKSk7XG5cblx0XHRjb25zdCBhZGRlZEZpbGVzID0gQXJyYXkuZnJvbShzZWVuRmlsZXMpLmZpbHRlcihcblx0XHRcdChmaWxlUGF0aCkgPT4gIXByZXZpb3VzSGFuZGxlc1JlZi5jdXJyZW50LmhhcyhmaWxlUGF0aCksXG5cdFx0KTtcblxuXHRcdGNvbnN0IGFkZGVkRmlsZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG5cdFx0Zm9yIChjb25zdCBhZGRlZEZpbGUgb2YgYWRkZWRGaWxlcykge1xuXHRcdFx0YWRkZWRGaWxlc01hcC5zZXQoYWRkZWRGaWxlLCBmaWxlc01hcFJlZi5jdXJyZW50W2FkZGVkRmlsZV0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGRlbGV0ZWRGaWxlc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cblx0XHRmb3IgKGNvbnN0IGRlbGV0ZWRGaWxlIG9mIGRlbGV0ZWRGaWxlcykge1xuXHRcdFx0ZGVsZXRlZEZpbGVzTWFwLnNldChkZWxldGVkRmlsZSwgZmlsZXNNYXBSZWYuY3VycmVudFtkZWxldGVkRmlsZV0pO1xuXHRcdFx0aGFuZGxlc1JlZi5jdXJyZW50LmRlbGV0ZShkZWxldGVkRmlsZSk7XG5cdFx0XHRkZWxldGUgZmlsZXNNYXBSZWYuY3VycmVudFtkZWxldGVkRmlsZV07XG5cdFx0fVxuXG5cdFx0Y29uc3QgcHJldmlvdXNGaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFxuXHRcdFx0QXJyYXkuZnJvbShwcmV2aW91c0hhbmRsZXNSZWYuY3VycmVudCkubWFwKChmaWxlUGF0aCkgPT4gW1xuXHRcdFx0XHRmaWxlUGF0aCxcblx0XHRcdFx0ZmlsZXNNYXBSZWYuY3VycmVudFtmaWxlUGF0aF0sXG5cdFx0XHRdKSxcblx0XHQpO1xuXG5cdFx0aWYgKGNoYW5nZWRGaWxlcy5zaXplID4gMCkge1xuXHRcdFx0cmVyZW5kZXIgPSB0cnVlO1xuXHRcdFx0b25DaGFuZ2VGaWxlPy4oY2hhbmdlZEZpbGVzLCBwcmV2aW91c0ZpbGVzKTtcblx0XHR9XG5cblx0XHRpZiAoZGVsZXRlZEZpbGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdHJlcmVuZGVyID0gdHJ1ZTtcblx0XHRcdG9uRGVsZXRlRmlsZT8uKGRlbGV0ZWRGaWxlc01hcCwgcHJldmlvdXNGaWxlcyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFkZGVkRmlsZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0cmVyZW5kZXIgPSB0cnVlO1xuXHRcdFx0b25BZGRGaWxlPy4oYWRkZWRGaWxlc01hcCwgcHJldmlvdXNGaWxlcyk7XG5cdFx0fVxuXG5cdFx0cHJldmlvdXNIYW5kbGVzUmVmLmN1cnJlbnQgPSBzZWVuRmlsZXM7XG5cdFx0ZmlsZXNNYXBSZWYuY3VycmVudCA9IG5ld0ZpbGVzTWFwO1xuXG5cdFx0aWYgKHJlcmVuZGVyKSB7XG5cdFx0XHRzZXRGaWxlcyhuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGZpbGVzTWFwUmVmLmN1cnJlbnQpKSk7XG5cdFx0fVxuXHR9LCBbb25BZGRGaWxlLCBvbkNoYW5nZUZpbGUsIG9uRGVsZXRlRmlsZSwgYmF0Y2hTaXplLCBmaWxlQ2FjaGVUdGxdKTtcblxuXHQvLyBEZWJvdW5jZSB0aGUgZmlsZXMgc3RhdGUgdXBkYXRlXG5cdGNvbnN0IGRlYm91bmNlZEZpbGVzID0gdXNlRGVib3VuY2UoZmlsZXMsIGRlYm91bmNlSW50ZXJ2YWwpO1xuXG5cdGNvbnN0IHN0YXJ0UG9sbGluZ1dhdGNoZWREaXJlY3RvcmllcyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcblx0XHRsZXQgcHJvY2Vzc2luZ1Byb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuXHRcdC8vIE9ubHkgc3RhcnQgYSBuZXcgaW50ZXJ2YWwgaWYgb25lIGlzbid0IGFscmVhZHkgcnVubmluZ1xuXHRcdGlmICghaW50ZXJ2YWxSZWYuY3VycmVudCkge1xuXHRcdFx0aW50ZXJ2YWxSZWYuY3VycmVudCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcblx0XHRcdFx0aWYgKGlzUHJvY2Vzc2luZyB8fCBwcm9jZXNzaW5nUHJvbWlzZSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNldElzUHJvY2Vzc2luZyh0cnVlKTtcblx0XHRcdFx0cHJvY2Vzc2luZ1Byb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBwcm9jZXNzV2F0Y2hlZERpcmVjdG9yaWVzKCk7XG5cdFx0XHRcdFx0XHRhd2FpdCBwcm9jZXNzRmlsZXMoKTtcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0c2V0SXNQcm9jZXNzaW5nKGZhbHNlKTtcblx0XHRcdFx0XHRcdHByb2Nlc3NpbmdQcm9taXNlID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pKCk7XG5cdFx0XHR9LCBwcm9wcy5wb2xsSW50ZXJ2YWwgfHwgREVGQVVMVF9QT0xMX0lOVEVSVkFMKTtcblx0XHRcdHNldElzUG9sbGluZyh0cnVlKTtcblx0XHR9XG5cdH0sIFtcblx0XHRwcm9jZXNzV2F0Y2hlZERpcmVjdG9yaWVzLFxuXHRcdHByb2Nlc3NGaWxlcyxcblx0XHRpc1Byb2Nlc3NpbmcsXG5cdFx0cHJvcHMucG9sbEludGVydmFsLFxuXHRdKTtcblxuXHRjb25zdCBzdG9wUG9sbGluZyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcblx0XHRpZiAoaW50ZXJ2YWxSZWYuY3VycmVudCkge1xuXHRcdFx0Y2xlYXJJbnRlcnZhbChpbnRlcnZhbFJlZi5jdXJyZW50KTtcblx0XHRcdGludGVydmFsUmVmLmN1cnJlbnQgPSBudWxsO1xuXHRcdFx0c2V0SXNQb2xsaW5nKGZhbHNlKTtcblx0XHR9XG5cdH0sIFtdKTtcblxuXHRjb25zdCBzdGFydFBvbGxpbmcgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG5cdFx0aWYgKHdhdGNoZWREaXJlY3Rvcmllc1JlZi5jdXJyZW50LnNpemUgPiAwKSB7XG5cdFx0XHRzdGFydFBvbGxpbmdXYXRjaGVkRGlyZWN0b3JpZXMoKTtcblx0XHR9XG5cdH0sIFtzdGFydFBvbGxpbmdXYXRjaGVkRGlyZWN0b3JpZXNdKTtcblxuXHRjb25zdCBvbkRpcmVjdG9yeVNlbGVjdGlvbiA9IGFzeW5jICgpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0Y29uc3QgZGlyZWN0b3J5SGFuZGxlID0gYXdhaXQgd2luZG93LnNob3dEaXJlY3RvcnlQaWNrZXIoKTtcblxuXHRcdFx0aWYgKCFkaXJlY3RvcnlIYW5kbGUpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBpbml0aWFsRGlyZWN0b3J5UGF0aCA9IGRpcmVjdG9yeUhhbmRsZS5uYW1lO1xuXHRcdFx0d2F0Y2hlZERpcmVjdG9yaWVzUmVmLmN1cnJlbnQuc2V0KGluaXRpYWxEaXJlY3RvcnlQYXRoLCBkaXJlY3RvcnlIYW5kbGUpO1xuXHRcdFx0c3RhcnRQb2xsaW5nV2F0Y2hlZERpcmVjdG9yaWVzKCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgZGlyZWN0b3J5IHNlbGVjdGlvbjpcIik7XG5cdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3Qgd3JpdGVGaWxlID0gdXNlQ2FsbGJhY2soXG5cdFx0YXN5bmMgKFxuXHRcdFx0cGF0aDogc3RyaW5nLFxuXHRcdFx0ZGF0YTogc3RyaW5nIHwgQXJyYXlCdWZmZXIgfCBCbG9iLFxuXHRcdFx0b3B0aW9uczogRmlsZVdyaXRlT3B0aW9ucyA9IHt9LFxuXHRcdCkgPT4ge1xuXHRcdFx0Ly8gVmFsaWRhdGUgcGF0aFxuXHRcdFx0aWYgKCFwYXRoIHx8IHR5cGVvZiBwYXRoICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZmlsZSBwYXRoXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB7IGNyZWF0ZSA9IHRydWUsIHRydW5jYXRlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdFx0XHRjb25zdCBoYW5kbGUgPSBoYW5kbGVzUmVmLmN1cnJlbnQuZ2V0KHBhdGgpO1xuXG5cdFx0XHRpZiAoIWhhbmRsZSkge1xuXHRcdFx0XHRpZiAoIWNyZWF0ZSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7cGF0aH1gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBDcmVhdGUgbmV3IGZpbGVcblx0XHRcdFx0Y29uc3QgZGlyZWN0b3J5UGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0XHRcdFx0Y29uc3QgZmlsZU5hbWUgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuXG5cdFx0XHRcdC8vIFZhbGlkYXRlIGRpcmVjdG9yeSBwYXRoXG5cdFx0XHRcdGlmICghKGRpcmVjdG9yeVBhdGggJiYgZmlsZU5hbWUpKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBmaWxlIHBhdGggc3RydWN0dXJlXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgZGlySGFuZGxlID0gd2F0Y2hlZERpcmVjdG9yaWVzUmVmLmN1cnJlbnQuZ2V0KGRpcmVjdG9yeVBhdGgpO1xuXG5cdFx0XHRcdGlmICghZGlySGFuZGxlKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBEaXJlY3Rvcnkgbm90IGZvdW5kOiAke2RpcmVjdG9yeVBhdGh9YCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgZGlySGFuZGxlLmdldEZpbGVIYW5kbGUoZmlsZU5hbWUsIHtcblx0XHRcdFx0XHRjcmVhdGU6IHRydWUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRoYW5kbGVzUmVmLmN1cnJlbnQuc2V0KHBhdGgsIGZpbGVIYW5kbGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmaWxlSGFuZGxlID0gaGFuZGxlc1JlZi5jdXJyZW50LmdldChwYXRoKTtcblx0XHRcdGlmICghZmlsZUhhbmRsZSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke3BhdGh9YCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERvdWJsZS1jaGVjayB3ZSdyZSB3cml0aW5nIHRvIHRoZSBjb3JyZWN0IGZpbGVcblx0XHRcdGlmIChmaWxlSGFuZGxlLm5hbWUgIT09IHBhdGguc3BsaXQoXCIvXCIpLnBvcCgpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZpbGUgcGF0aCBtaXNtYXRjaFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgd3JpdGFibGUgPSBhd2FpdCBmaWxlSGFuZGxlLmNyZWF0ZVdyaXRhYmxlKHtcblx0XHRcdFx0a2VlcEV4aXN0aW5nRGF0YTogIXRydW5jYXRlLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHdyaXRhYmxlLndyaXRlKGRhdGEpO1xuXHRcdFx0XHRhd2FpdCB3cml0YWJsZS5jbG9zZSgpO1xuXG5cdFx0XHRcdC8vIFVwZGF0ZSBjYWNoZSBhbmQgdHJpZ2dlciBjaGFuZ2UgZXZlbnRzXG5cdFx0XHRcdGNvbnN0IGNvbnRlbnQgPVxuXHRcdFx0XHRcdHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiID8gZGF0YSA6IGF3YWl0IG5ldyBSZXNwb25zZShkYXRhKS50ZXh0KCk7XG5cdFx0XHRcdGZpbGVDb250ZW50c0NhY2hlLmN1cnJlbnQuc2V0KHBhdGgsIHtcblx0XHRcdFx0XHRjb250ZW50LFxuXHRcdFx0XHRcdHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Y29uc3QgY2hhbmdlZEZpbGVzID0gbmV3IE1hcChbW3BhdGgsIGNvbnRlbnRdXSk7XG5cdFx0XHRcdGNvbnN0IHByZXZpb3VzRmlsZXMgPSBuZXcgTWFwKFxuXHRcdFx0XHRcdEFycmF5LmZyb20ocHJldmlvdXNIYW5kbGVzUmVmLmN1cnJlbnQpLm1hcCgoZmlsZVBhdGgpID0+IFtcblx0XHRcdFx0XHRcdGZpbGVQYXRoLFxuXHRcdFx0XHRcdFx0ZmlsZXNNYXBSZWYuY3VycmVudFtmaWxlUGF0aF0sXG5cdFx0XHRcdFx0XSksXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0b25DaGFuZ2VGaWxlPy4oY2hhbmdlZEZpbGVzLCBwcmV2aW91c0ZpbGVzKTtcblx0XHRcdFx0ZmlsZXNNYXBSZWYuY3VycmVudFtwYXRoXSA9IGNvbnRlbnQ7XG5cdFx0XHRcdHNldEZpbGVzKG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoZmlsZXNNYXBSZWYuY3VycmVudCkpKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGF3YWl0IHdyaXRhYmxlLmFib3J0KCk7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0W29uQ2hhbmdlRmlsZV0sXG5cdCk7XG5cblx0Y29uc3QgY3JlYXRlRmlsZSA9IHVzZUNhbGxiYWNrKFxuXHRcdGFzeW5jIChwYXRoOiBzdHJpbmcsIGluaXRpYWxEYXRhPzogc3RyaW5nIHwgQXJyYXlCdWZmZXIgfCBCbG9iKSA9PiB7XG5cdFx0XHRjb25zdCBkaXJlY3RvcnlQYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZihcIi9cIikpO1xuXHRcdFx0Y29uc3QgZmlsZU5hbWUgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuXHRcdFx0Y29uc3QgZGlySGFuZGxlID0gd2F0Y2hlZERpcmVjdG9yaWVzUmVmLmN1cnJlbnQuZ2V0KGRpcmVjdG9yeVBhdGgpO1xuXG5cdFx0XHRpZiAoIWRpckhhbmRsZSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYERpcmVjdG9yeSBub3QgZm91bmQ6ICR7ZGlyZWN0b3J5UGF0aH1gKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZmlsZUhhbmRsZSA9IGF3YWl0IGRpckhhbmRsZS5nZXRGaWxlSGFuZGxlKGZpbGVOYW1lLCB7XG5cdFx0XHRcdGNyZWF0ZTogdHJ1ZSxcblx0XHRcdH0pO1xuXHRcdFx0aGFuZGxlc1JlZi5jdXJyZW50LnNldChwYXRoLCBmaWxlSGFuZGxlKTtcblxuXHRcdFx0aWYgKGluaXRpYWxEYXRhKSB7XG5cdFx0XHRcdGF3YWl0IHdyaXRlRmlsZShwYXRoLCBpbml0aWFsRGF0YSwgeyB0cnVuY2F0ZTogdHJ1ZSB9KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZpbGVIYW5kbGU7XG5cdFx0fSxcblx0XHRbd3JpdGVGaWxlXSxcblx0KTtcblxuXHRjb25zdCBkZWxldGVGaWxlID0gdXNlQ2FsbGJhY2soXG5cdFx0YXN5bmMgKHBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0Y29uc3QgaGFuZGxlID0gaGFuZGxlc1JlZi5jdXJyZW50LmdldChwYXRoKTtcblx0XHRcdGlmICghaGFuZGxlKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7cGF0aH1gKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZGlyZWN0b3J5UGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0XHRcdGNvbnN0IGZpbGVOYW1lID0gcGF0aC5zdWJzdHJpbmcocGF0aC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcblx0XHRcdGNvbnN0IGRpckhhbmRsZSA9IHdhdGNoZWREaXJlY3Rvcmllc1JlZi5jdXJyZW50LmdldChkaXJlY3RvcnlQYXRoKTtcblxuXHRcdFx0aWYgKCFkaXJIYW5kbGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBEaXJlY3Rvcnkgbm90IGZvdW5kOiAke2RpcmVjdG9yeVBhdGh9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IGRpckhhbmRsZS5yZW1vdmVFbnRyeShmaWxlTmFtZSk7XG5cdFx0XHRoYW5kbGVzUmVmLmN1cnJlbnQuZGVsZXRlKHBhdGgpO1xuXHRcdFx0ZmlsZUNvbnRlbnRzQ2FjaGUuY3VycmVudC5kZWxldGUocGF0aCk7XG5cblx0XHRcdGNvbnN0IGRlbGV0ZWRGaWxlcyA9IG5ldyBNYXAoW1twYXRoLCBmaWxlc01hcFJlZi5jdXJyZW50W3BhdGhdXV0pO1xuXHRcdFx0Y29uc3QgcHJldmlvdXNGaWxlcyA9IG5ldyBNYXAoXG5cdFx0XHRcdEFycmF5LmZyb20ocHJldmlvdXNIYW5kbGVzUmVmLmN1cnJlbnQpLm1hcCgoZmlsZVBhdGgpID0+IFtcblx0XHRcdFx0XHRmaWxlUGF0aCxcblx0XHRcdFx0XHRmaWxlc01hcFJlZi5jdXJyZW50W2ZpbGVQYXRoXSxcblx0XHRcdFx0XSksXG5cdFx0XHQpO1xuXG5cdFx0XHRkZWxldGUgZmlsZXNNYXBSZWYuY3VycmVudFtwYXRoXTtcblx0XHRcdHByZXZpb3VzSGFuZGxlc1JlZi5jdXJyZW50LmRlbGV0ZShwYXRoKTtcblxuXHRcdFx0b25EZWxldGVGaWxlPy4oZGVsZXRlZEZpbGVzLCBwcmV2aW91c0ZpbGVzKTtcblx0XHRcdHNldEZpbGVzKG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoZmlsZXNNYXBSZWYuY3VycmVudCkpKTtcblx0XHR9LFxuXHRcdFtvbkRlbGV0ZUZpbGVdLFxuXHQpO1xuXG5cdHVzZVVubW91bnQoKCkgPT4ge1xuXHRcdGNsZWFyV2F0Y2hlZERpcmVjdG9yaWVzKCk7XG5cdH0pO1xuXG5cdHJldHVybiB7XG5cdFx0aGFuZGxlczogaGFuZGxlc1JlZi5jdXJyZW50LFxuXHRcdG9uRGlyZWN0b3J5U2VsZWN0aW9uLFxuXHRcdG9uQ2xlYXI6IGNsZWFyV2F0Y2hlZERpcmVjdG9yaWVzLFxuXHRcdGZpbGVzOiBkZWJvdW5jZWRGaWxlcyxcblx0XHRzZXRGaWxlcyxcblx0XHRpc1Byb2Nlc3NpbmcsXG5cdFx0aXNCcm93c2VyU3VwcG9ydGVkOiB3aW5kb3cgIT09IHVuZGVmaW5lZCAmJiBcInNob3dEaXJlY3RvcnlQaWNrZXJcIiBpbiB3aW5kb3csXG5cdFx0d3JpdGVGaWxlLFxuXHRcdGNyZWF0ZUZpbGUsXG5cdFx0ZGVsZXRlRmlsZSxcblx0XHRzdG9wUG9sbGluZyxcblx0XHRzdGFydFBvbGxpbmcsXG5cdFx0aXNQb2xsaW5nLFxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZUZzID0gdXNlRmlsZVN5c3RlbTtcblxuLy8gYmVsb3cgaXMgY29waWVkIGZyb20gdXNlaG9va3MtdHNcblxuY29uc3QgdXNlRWZmZWN0T25jZSA9IChlZmZlY3Q6IEVmZmVjdENhbGxiYWNrKSA9PiB7XG5cdHVzZUVmZmVjdChlZmZlY3QsIFtdKTtcbn07XG5cbmNvbnN0IHVzZVVubW91bnQgPSAoZm46ICgpID0+IHZvaWQpOiB2b2lkID0+IHtcblx0Y29uc3QgZm5SZWYgPSB1c2VSZWYoZm4pO1xuXG5cdGZuUmVmLmN1cnJlbnQgPSBmbjtcblxuXHR1c2VFZmZlY3RPbmNlKCgpID0+ICgpID0+IGZuUmVmLmN1cnJlbnQoKSk7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogInVrQkFBQSxJQUFBQSxHQUFBLEdBQUFDLEdBQUFELEdBQUEsbUJBQUFFLEVBQUEsZUFBQUMsRUFBQSxjQUFBQyxFQUFBLGVBQUFDLEVBQUEscUJBQUFDLEVBQUEsa0JBQUFDLEVBQUEsVUFBQUMsS0FBQSxlQUFBQyxHQUFBVCxJQUFBLElBQUFVLEVBQW1CLHNCQUNuQkMsRUFNTyxpQkF3Q01QLEVBQXNCLFNBQVksQ0FDOUMsSUFBTVEsS0FBSyxFQUFBQyxTQUFPLENBQ2pCLG1CQUFvQixFQUNyQixDQUFDLEVBR0dDLEVBQWtCLEdBRXRCLE1BQU8sQ0FDTixrQkFBbUIsTUFBT0MsRUFBa0JDLElBQTZCLENBQ3hFLEdBQ0NELEVBQVMsU0FBUyxZQUFZLEdBQzlCLENBQUNELEdBQ0RFLEVBQU8sT0FBUyxPQUNmLENBR0QsSUFBTUMsRUFBTyxNQURBLE1BRE1ELEVBQ1csUUFBUSxHQUNkLEtBQUssRUFDN0IsT0FBQUosRUFBRyxJQUFJSyxDQUFJLEVBQ1hILEVBQWtCLEdBQ1gsRUFDUixDQUNBLEdBQU0sQ0FBRSxRQUFBSSxDQUFRLEVBQUlOLEVBQUcsS0FBS0csQ0FBUSxFQUVwQyxNQUFPLENBQUNHLENBQ1QsRUFDQSx1QkFBd0IsTUFDdkJILEVBQ0FJLElBQ0ksQ0FDSixHQUFNLENBQUUsUUFBQUQsQ0FBUSxFQUFJTixFQUFHLEtBQUtHLENBQVEsRUFNcEMsT0FKSUEsRUFBUyxTQUFTLE1BQU0sR0FJeEJBLEVBQVMsU0FBUyxPQUFPLEVBQ3JCLEdBR0QsQ0FBQ0csQ0FDVCxDQUNELENBQ0QsRUFFYWYsRUFBdUIsU0FBWSxDQUMvQyxJQUFNaUIsRUFBVUwsR0FDWCxHQUFBQSxFQUFTLFNBQVMsUUFB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QyxDQUNGLEVBRUEsT0FBT2pCLEVBQVksUUFBUXRCLENBQUksRUFDL0JxQixFQUFtQixRQUFRLE9BQU9yQixDQUFJLEVBRXRDZ0IsR0FBQSxNQUFBQSxFQUFlcUMsRUFBY00sR0FDN0JqQyxFQUFTLElBQUksSUFBSSxPQUFPLFFBQVFKLEVBQVksT0FBTyxDQUFDLENBQUMsQ0FDdEQsRUFDQSxDQUFDTixDQUFZLENBQ2QsRUFFQSxPQUFBaUUsR0FBVyxJQUFNLENBQ2hCaEQsRUFBd0IsQ0FDekIsQ0FBQyxFQUVNLENBQ04sUUFBU2IsRUFBVyxRQUNwQixxQkFBQTZDLEdBQ0EsUUFBU2hDLEVBQ1QsTUFBTzJCLEdBQ1AsU0FBQWxDLEVBQ0EsYUFBQUMsRUFDQSxtQkFBb0IsU0FBVyxRQUFhLHdCQUF5QixPQUNyRSxVQUFBeUMsRUFDQSxXQUFBVSxHQUNBLFdBQUFFLEdBQ0EsWUFBQWpCLEdBQ0EsYUFBQUMsR0FDQSxVQUFBbkMsQ0FDRCxDQUNELEVBRWFuRCxHQUFRRCxFQUlmeUcsR0FBaUJDLEdBQTJCLElBQ2pELGFBQVVBLEVBQVEsQ0FBQyxDQUFDLENBQ3JCLEVBRU1GLEdBQWNHLEdBQXlCLENBQzVDLElBQU1DLEtBQVEsVUFBT0QsQ0FBRSxFQUV2QkMsRUFBTSxRQUFVRCxFQUVoQkYsR0FBYyxJQUFNLElBQU1HLEVBQU0sUUFBUSxDQUFDLENBQzFDIiwKICAibmFtZXMiOiBbImluZGV4X2V4cG9ydHMiLCAiX19leHBvcnQiLCAiY29tbW9uRmlsdGVycyIsICJkaXN0RmlsdGVyIiwgImdpdEZpbHRlciIsICJtaXNjRmlsdGVyIiwgInByb2Nlc3NEaXJlY3RvcnkiLCAidXNlRmlsZVN5c3RlbSIsICJ1c2VGcyIsICJfX3RvQ29tbW9uSlMiLCAiaW1wb3J0X2lnbm9yZSIsICJpbXBvcnRfcmVhY3QiLCAiaWciLCAiaWdub3JlIiwgImdpdElnbm9yZUxvYWRlZCIsICJmaWxlcGF0aCIsICJoYW5kbGUiLCAidGV4dCIsICJpZ25vcmVkIiwgIl9oYW5kbGUiLCAiaXNEaXN0IiwgImlzTWlzYyIsICJkaXJlY3RvcnlIYW5kbGUiLCAiZGlyZWN0b3J5UGF0aCIsICJmaWx0ZXJzIiwgImluY2x1ZGVGaWxlcyIsICJpZ25vcmVGaWxlUGF0aHMiLCAiZmlsdGVyIiwgImZpbGVQcm9taXNlcyIsICJlbnRyeSIsICJwYXRoIiwgInNob3VsZEluY2x1ZGUiLCAiZGlyUHJvbWlzZXMiLCAidXNlRGVib3VuY2UiLCAidmFsdWUiLCAiZGVsYXkiLCAiZGVib3VuY2VkVmFsdWUiLCAic2V0RGVib3VuY2VkVmFsdWUiLCAiaGFuZGxlciIsICJERUZBVUxUX1BPTExfSU5URVJWQUwiLCAiREVGQVVMVF9CQVRDSF9TSVpFIiwgIkRFRkFVTFRfREVCT1VOQ0VfSU5URVJWQUwiLCAiREVGQVVMVF9GSUxFX0NBQ0hFX1RUTCIsICJwcm9wcyIsICJvbkFkZEZpbGUiLCAib25DaGFuZ2VGaWxlIiwgIm9uRGVsZXRlRmlsZSIsICJiYXRjaFNpemUiLCAiZGVib3VuY2VJbnRlcnZhbCIsICJ3YXRjaGVkRGlyZWN0b3JpZXNSZWYiLCAiaGFuZGxlc1JlZiIsICJwcmV2aW91c0hhbmRsZXNSZWYiLCAiZmlsZXNNYXBSZWYiLCAicHJldmlvdXNGaWxlc01hcFJlZiIsICJpbnRlcnZhbFJlZiIsICJmaWxlcyIsICJzZXRGaWxlcyIsICJpc1Byb2Nlc3NpbmciLCAic2V0SXNQcm9jZXNzaW5nIiwgImlzUG9sbGluZyIsICJzZXRJc1BvbGxpbmciLCAiZmlsZUNvbnRlbnRzQ2FjaGUiLCAiZmlsZUNhY2hlVHRsIiwgImNsZWFyV2F0Y2hlZERpcmVjdG9yaWVzIiwgInByb2Nlc3NXYXRjaGVkRGlyZWN0b3JpZXMiLCAidGVtcG9yYXJ5SGFuZGxlcyIsICJmaWx0ZXJGbnMiLCAiZmlsdGVyRm4iLCAiXyIsICJmaWxlUGF0aCIsICJwcm9jZXNzRmlsZXMiLCAic2VlbkZpbGVzIiwgImNoYW5nZWRGaWxlcyIsICJkZWxldGVkRmlsZXNTZXQiLCAicmVyZW5kZXIiLCAibm93IiwgImhhbmRsZXMiLCAibmV3RmlsZXNNYXAiLCAiaSIsICJiYXRjaCIsICJjYWNoZWQiLCAiY2FjaGVFbnRyaWVzIiwgInRpbWVzdGFtcCIsICJkZWxldGVkRmlsZXMiLCAiYWRkZWRGaWxlcyIsICJhZGRlZEZpbGVzTWFwIiwgImFkZGVkRmlsZSIsICJkZWxldGVkRmlsZXNNYXAiLCAiZGVsZXRlZEZpbGUiLCAicHJldmlvdXNGaWxlcyIsICJkZWJvdW5jZWRGaWxlcyIsICJzdGFydFBvbGxpbmdXYXRjaGVkRGlyZWN0b3JpZXMiLCAicHJvY2Vzc2luZ1Byb21pc2UiLCAic3RvcFBvbGxpbmciLCAic3RhcnRQb2xsaW5nIiwgIm9uRGlyZWN0b3J5U2VsZWN0aW9uIiwgImluaXRpYWxEaXJlY3RvcnlQYXRoIiwgImVycm9yIiwgIndyaXRlRmlsZSIsICJkYXRhIiwgIm9wdGlvbnMiLCAiY3JlYXRlIiwgInRydW5jYXRlIiwgImZpbGVOYW1lIiwgImRpckhhbmRsZSIsICJmaWxlSGFuZGxlIiwgIndyaXRhYmxlIiwgImNvbnRlbnQiLCAiY3JlYXRlRmlsZSIsICJpbml0aWFsRGF0YSIsICJkZWxldGVGaWxlIiwgInVzZVVubW91bnQiLCAidXNlRWZmZWN0T25jZSIsICJlZmZlY3QiLCAiZm4iLCAiZm5SZWYiXQp9Cg==