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 • 48.7 kB
JavaScript
import re from"ignore";import{useCallback as b,useEffect as j,useRef as v,useState as _}from"react";var te=async()=>{let t=re({allowRelativePaths:!0}),r=!1;return{shouldIncludeFile:async(n,i)=>{if(n.endsWith(".gitignore")&&!r&&i.kind==="file"){let s=await(await i.getFile()).text();return t.add(s),r=!0,!1}let{ignored:u}=t.test(n);return!u},shouldProcessDirectory:async(n,i)=>{let{ignored:u}=t.test(n);return n.endsWith(".git")||n.includes(".git/")?!1:!u}}},ne=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)}},se=async()=>{let t=r=>!!(r.endsWith(".DS_Store")||r.endsWith(".crswap"));return{shouldIncludeFile:async(r,n)=>!t(r),shouldProcessDirectory:async(r,n)=>!t(r)}},ie=[ne,se,te],J=async(t,r,n,i,u)=>{if(u.has(r))return i;for(let s of n)if(await s.shouldProcessDirectory(r,t)===!1)return u.add(r),i;let A=[];for await(let s of t.values())if(s.kind==="file"){let a=`${r}/${s.name}`;u.has(a)||A.push((async()=>{let c=!0;for(let h of n)if(await h.shouldIncludeFile(a,s)===!1){c=!1,u.add(a),i.delete(a);break}c&&i.set(a,s)})())}await Promise.all(A);let p=[];for await(let s of t.values())if(s.kind==="directory"){let a=`${r}/${s.name}`;u.has(a)||p.push(J(s,a,n,i,u))}return await Promise.all(p),i},oe=(t,r)=>{let[n,i]=_(t);return j(()=>{let u=setTimeout(()=>{i(t)},r);return()=>{clearTimeout(u)}},[t,r]),n},ce=100,le=50,ae=50,ue=5e3,de=t=>{let{onFilesAdded:r,onFilesChanged:n,onFilesDeleted:i,batchSize:u=le,debounceInterval:A=ae}=t,p=v(new Map),s=v(new Map),a=v(new Set),c=v({}),h=v({}),H=v(null),[Z,T]=_(new Map),[O,$]=_(!1),[q,R]=_(!1),S=v(new Map),k=t.fileCacheTtl||ue,U=b(()=>{H.current&&(clearInterval(H.current),H.current=null),p.current.clear(),s.current.clear(),a.current.clear(),c.current={},h.current={},S.current.clear(),T(new Map),R(!1)},[]),N=b(async()=>{let e=new Map,l=new Set,m=t.filters||ie,d=[];for(let F of m)d.push(await F());let f=[];p.current.forEach((F,g)=>{f.push(J(F,g,d,e,l))}),await Promise.all(f),e.forEach((F,g)=>{l.has(g)&&e.delete(g)}),s.current=e},[t.filters]),z=b(async()=>{h.current={...c.current||{}};let e=new Set,l=new Map,m=new Set,d=!1,f=Date.now(),F=Array.from(s.current),g={};for(let o=0;o<F.length;o+=u){let W=F.slice(o,o+u);await Promise.all(W.map(async([y,V])=>{if(V.kind==="file"){e.add(y);try{let x=S.current.get(y);if(x&&f-x.timestamp<k){g[y]=x.content,x.content!==h.current[y]&&l.set(y,x.content);return}let P=await(await V.getFile()).text();S.current.set(y,{content:P,timestamp:f}),g[y]=P,P!==h.current[y]&&l.set(y,P)}catch{s.current.delete(y),m.add(y),S.current.delete(y),d=!0}}}))}let M=Array.from(S.current.entries());for(let[o,{timestamp:W}]of M)f-W>k&&S.current.delete(o);let w=Array.from([...Array.from(a.current),...Array.from(m)]).filter(o=>!e.has(o)),D=Array.from(e).filter(o=>!a.current.has(o)),E=new Map;for(let o of D)E.set(o,c.current[o]);let I=new Map;for(let o of w)I.set(o,c.current[o]),s.current.delete(o),delete c.current[o];let L=new Map(Array.from(a.current).map(o=>[o,c.current[o]]));l.size>0&&(d=!0,n==null||n(l,L)),w.length>0&&(d=!0,i==null||i(I,L)),D.length>0&&(d=!0,r==null||r(E,L)),a.current=e,c.current=g,d&&T(new Map(Object.entries(c.current)))},[r,n,i,u,k]),G=oe(Z,A),C=b(()=>{let e=null;H.current||(H.current=setInterval(async()=>{O||e||($(!0),e=(async()=>{try{await N(),await z()}finally{$(!1),e=null}})())},t.pollInterval||ce),R(!0))},[N,z,O,t.pollInterval]),K=b(()=>{H.current&&(clearInterval(H.current),H.current=null,R(!1))},[]),Q=b(()=>{p.current.size>0&&C()},[C]),X=async()=>{try{let e=await window.showDirectoryPicker();if(!e)return;let l=e.name;p.current.set(l,e),C()}catch(e){console.error("Error during directory selection:"),console.error(e)}},B=b(async(e,l,m={})=>{if(!e||typeof e!="string")throw new Error("Invalid file path");let{create:d=!0,truncate:f=!1}=m;if(!s.current.get(e)){if(!d)throw new Error(`File not found: ${e}`);let w=e.substring(0,e.lastIndexOf("/")),D=e.substring(e.lastIndexOf("/")+1);if(!(w&&D))throw new Error("Invalid file path structure");let E=p.current.get(w);if(!E)throw new Error(`Directory not found: ${w}`);let I=await E.getFileHandle(D,{create:!0});s.current.set(e,I)}let g=s.current.get(e);if(!g)throw new Error(`File not found: ${e}`);if(g.name!==e.split("/").pop())throw new Error("File path mismatch");let M=await g.createWritable({keepExistingData:!f});try{await M.write(l),await M.close();let w=typeof l=="string"?l:await new Response(l).text();S.current.set(e,{content:w,timestamp:Date.now()});let D=new Map([[e,w]]),E=new Map(Array.from(a.current).map(I=>[I,c.current[I]]));n==null||n(D,E),c.current[e]=w,T(new Map(Object.entries(c.current)))}catch(w){throw await M.abort(),w}},[n]),Y=b(async(e,l)=>{let m=e.substring(0,e.lastIndexOf("/")),d=e.substring(e.lastIndexOf("/")+1),f=p.current.get(m);if(!f)throw new Error(`Directory not found: ${m}`);let F=await f.getFileHandle(d,{create:!0});return s.current.set(e,F),l&&await B(e,l,{truncate:!0}),F},[B]),ee=b(async e=>{if(!s.current.get(e))throw new Error(`File not found: ${e}`);let m=e.substring(0,e.lastIndexOf("/")),d=e.substring(e.lastIndexOf("/")+1),f=p.current.get(m);if(!f)throw new Error(`Directory not found: ${m}`);await f.removeEntry(d),s.current.delete(e),S.current.delete(e);let F=new Map([[e,c.current[e]]]),g=new Map(Array.from(a.current).map(M=>[M,c.current[M]]));delete c.current[e],a.current.delete(e),i==null||i(F,g),T(new Map(Object.entries(c.current)))},[i]);return ge(()=>{U()}),{handles:s.current,onDirectorySelection:X,onClear:U,files:G,setFiles:T,isProcessing:O,isBrowserSupported:window!==void 0&&"showDirectoryPicker"in window,writeFile:B,createFile:Y,deleteFile:ee,stopPolling:K,startPolling:Q,isPolling:q}},ye=de,fe=t=>{j(t,[])},ge=t=>{let r=v(t);r.current=t,fe(()=>()=>r.current())};export{ie as commonFilters,ne as distFilter,te as gitFilter,se as miscFilter,J as processDirectory,de as useFileSystem,ye as 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+IGZuUmVmLmN1cnJlbnQoKSk7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBQUEsT0FBT0EsT0FBWSxTQUNuQixPQUVDLGVBQUFDLEVBQ0EsYUFBQUMsRUFDQSxVQUFBQyxFQUNBLFlBQUFDLE1BQ00sUUF3Q0EsSUFBTUMsR0FBc0IsU0FBWSxDQUM5QyxJQUFNQyxFQUFLTixHQUFPLENBQ2pCLG1CQUFvQixFQUNyQixDQUFDLEVBR0dPLEVBQWtCLEdBRXRCLE1BQU8sQ0FDTixrQkFBbUIsTUFBT0MsRUFBa0JDLElBQTZCLENBQ3hFLEdBQ0NELEVBQVMsU0FBUyxZQUFZLEdBQzlCLENBQUNELEdBQ0RFLEVBQU8sT0FBUyxPQUNmLENBR0QsSUFBTUMsRUFBTyxNQURBLE1BRE1ELEVBQ1csUUFBUSxHQUNkLEtBQUssRUFDN0IsT0FBQUgsRUFBRyxJQUFJSSxDQUFJLEVBQ1hILEVBQWtCLEdBQ1gsRUFDUixDQUNBLEdBQU0sQ0FBRSxRQUFBSSxDQUFRLEVBQUlMLEVBQUcsS0FBS0UsQ0FBUSxFQUVwQyxNQUFPLENBQUNHLENBQ1QsRUFDQSx1QkFBd0IsTUFDdkJILEVBQ0FJLElBQ0ksQ0FDSixHQUFNLENBQUUsUUFBQUQsQ0FBUSxFQUFJTCxFQUFHLEtBQUtFLENBQVEsRUFNcEMsT0FKSUEsRUFBUyxTQUFTLE1BQU0sR0FJeEJBLEVBQVMsU0FBUyxPQUFPLEVBQ3JCLEdBR0QsQ0FBQ0csQ0FDVCxDQUNELENBQ0QsRUFFYUUsR0FBdUIsU0FBWSxDQUMvQyxJQUFNQyxFQUFVTixHQUNYLEdBQUFBLEVBQVMsU0FBUyxRQUFRLEdBRzFCQSxFQUFTLFNBQVMsT0FBTyxHQUd6QkEsRUFBUyxTQUFTLFNBQVMsR0FHM0JBLEVBQVMsU0FBUyxVQUFVLEdBRzVCQSxFQUFTLFNBQVMsZ0JB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RUFDL0JzQixFQUFtQixRQUFRLE9BQU90QixDQUFJLEVBRXRDaUIsR0FBQSxNQUFBQSxFQUFlcUMsRUFBY00sR0FDN0JqQyxFQUFTLElBQUksSUFBSSxPQUFPLFFBQVFKLEVBQVksT0FBTyxDQUFDLENBQUMsQ0FDdEQsRUFDQSxDQUFDTixDQUFZLENBQ2QsRUFFQSxPQUFBaUUsR0FBVyxJQUFNLENBQ2hCaEQsRUFBd0IsQ0FDekIsQ0FBQyxFQUVNLENBQ04sUUFBU2IsRUFBVyxRQUNwQixxQkFBQTZDLEVBQ0EsUUFBU2hDLEVBQ1QsTUFBTzJCLEVBQ1AsU0FBQWxDLEVBQ0EsYUFBQUMsRUFDQSxtQkFBb0IsU0FBVyxRQUFhLHdCQUF5QixPQUNyRSxVQUFBeUMsRUFDQSxXQUFBVSxFQUNBLFdBQUFFLEdBQ0EsWUFBQWpCLEVBQ0EsYUFBQUMsRUFDQSxVQUFBbkMsQ0FDRCxDQUNELEVBRWFxRCxHQUFRdEUsR0FJZnVFLEdBQWlCQyxHQUEyQixDQUNqRDlHLEVBQVU4RyxFQUFRLENBQUMsQ0FBQyxDQUNyQixFQUVNSCxHQUFjSSxHQUF5QixDQUM1QyxJQUFNQyxFQUFRL0csRUFBTzhHLENBQUUsRUFFdkJDLEVBQU0sUUFBVUQsRUFFaEJGLEdBQWMsSUFBTSxJQUFNRyxFQUFNLFFBQVEsQ0FBQyxDQUMxQyIsCiAgIm5hbWVzIjogWyJpZ25vcmUiLCAidXNlQ2FsbGJhY2siLCAidXNlRWZmZWN0IiwgInVzZVJlZiIsICJ1c2VTdGF0ZSIsICJnaXRGaWx0ZXIiLCAiaWciLCAiZ2l0SWdub3JlTG9hZGVkIiwgImZpbGVwYXRoIiwgImhhbmRsZSIsICJ0ZXh0IiwgImlnbm9yZWQiLCAiX2hhbmRsZSIsICJkaXN0RmlsdGVyIiwgImlzRGlzdCIsICJtaXNjRmlsdGVyIiwgImlzTWlzYyIsICJjb21tb25GaWx0ZXJzIiwgInByb2Nlc3NEaXJlY3RvcnkiLCAiZGlyZWN0b3J5SGFuZGxlIiwgImRpcmVjdG9yeVBhdGgiLCAiZmlsdGVycyIsICJpbmNsdWRlRmlsZXMiLCAiaWdub3JlRmlsZVBhdGhzIiwgImZpbHRlciIsICJmaWxlUHJvbWlzZXMiLCAiZW50cnkiLCAicGF0aCIsICJzaG91bGRJbmNsdWRlIiwgImRpclByb21pc2VzIiwgInVzZURlYm91bmNlIiwgInZhbHVlIiwgImRlbGF5IiwgImRlYm91bmNlZFZhbHVlIiwgInNldERlYm91bmNlZFZhbHVlIiwgImhhbmRsZXIiLCAiREVGQVVMVF9QT0xMX0lOVEVSVkFMIiwgIkRFRkFVTFRfQkFUQ0hfU0laRSIsICJERUZBVUxUX0RFQk9VTkNFX0lOVEVSVkFMIiwgIkRFRkFVTFRfRklMRV9DQUNIRV9UVEwiLCAidXNlRmlsZVN5c3RlbSIsICJwcm9wcyIsICJvbkFkZEZpbGUiLCAib25DaGFuZ2VGaWxlIiwgIm9uRGVsZXRlRmlsZSIsICJiYXRjaFNpemUiLCAiZGVib3VuY2VJbnRlcnZhbCIsICJ3YXRjaGVkRGlyZWN0b3JpZXNSZWYiLCAiaGFuZGxlc1JlZiIsICJwcmV2aW91c0hhbmRsZXNSZWYiLCAiZmlsZXNNYXBSZWYiLCAicHJldmlvdXNGaWxlc01hcFJlZiIsICJpbnRlcnZhbFJlZiIsICJmaWxlcyIsICJzZXRGaWxlcyIsICJpc1Byb2Nlc3NpbmciLCAic2V0SXNQcm9jZXNzaW5nIiwgImlzUG9sbGluZyIsICJzZXRJc1BvbGxpbmciLCAiZmlsZUNvbnRlbnRzQ2FjaGUiLCAiZmlsZUNhY2hlVHRsIiwgImNsZWFyV2F0Y2hlZERpcmVjdG9yaWVzIiwgInByb2Nlc3NXYXRjaGVkRGlyZWN0b3JpZXMiLCAidGVtcG9yYXJ5SGFuZGxlcyIsICJmaWx0ZXJGbnMiLCAiZmlsdGVyRm4iLCAiXyIsICJmaWxlUGF0aCIsICJwcm9jZXNzRmlsZXMiLCAic2VlbkZpbGVzIiwgImNoYW5nZWRGaWxlcyIsICJkZWxldGVkRmlsZXNTZXQiLCAicmVyZW5kZXIiLCAibm93IiwgImhhbmRsZXMiLCAibmV3RmlsZXNNYXAiLCAiaSIsICJiYXRjaCIsICJjYWNoZWQiLCAiY2FjaGVFbnRyaWVzIiwgInRpbWVzdGFtcCIsICJkZWxldGVkRmlsZXMiLCAiYWRkZWRGaWxlcyIsICJhZGRlZEZpbGVzTWFwIiwgImFkZGVkRmlsZSIsICJkZWxldGVkRmlsZXNNYXAiLCAiZGVsZXRlZEZpbGUiLCAicHJldmlvdXNGaWxlcyIsICJkZWJvdW5jZWRGaWxlcyIsICJzdGFydFBvbGxpbmdXYXRjaGVkRGlyZWN0b3JpZXMiLCAicHJvY2Vzc2luZ1Byb21pc2UiLCAic3RvcFBvbGxpbmciLCAic3RhcnRQb2xsaW5nIiwgIm9uRGlyZWN0b3J5U2VsZWN0aW9uIiwgImluaXRpYWxEaXJlY3RvcnlQYXRoIiwgImVycm9yIiwgIndyaXRlRmlsZSIsICJkYXRhIiwgIm9wdGlvbnMiLCAiY3JlYXRlIiwgInRydW5jYXRlIiwgImZpbGVOYW1lIiwgImRpckhhbmRsZSIsICJmaWxlSGFuZGxlIiwgIndyaXRhYmxlIiwgImNvbnRlbnQiLCAiY3JlYXRlRmlsZSIsICJpbml0aWFsRGF0YSIsICJkZWxldGVGaWxlIiwgInVzZVVubW91bnQiLCAidXNlRnMiLCAidXNlRWZmZWN0T25jZSIsICJlZmZlY3QiLCAiZm4iLCAiZm5SZWYiXQp9Cg==