summaryrefslogtreecommitdiff
path: root/priv/static/assets/site.js
blob: 85f8cdfb6caf8e37d65363970df8d700f7779ff4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
(()=>{var zo=Object.create;var Ht=Object.defineProperty;var Zo=Object.getOwnPropertyDescriptor;var Jo=Object.getOwnPropertyNames;var Ko=Object.getPrototypeOf,Go=Object.prototype.hasOwnProperty;var Yo=(t,e,r)=>e in t?Ht(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var Xo=t=>Ht(t,"__esModule",{value:!0});var Qo=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var ea=(t,e,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Jo(e))!Go.call(t,i)&&i!=="default"&&Ht(t,i,{get:()=>e[i],enumerable:!(r=Zo(e,i))||r.enumerable});return t},ki=t=>ea(Xo(Ht(t!=null?zo(Ko(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var Ai=(t,e,r)=>(Yo(t,typeof e!="symbol"?e+"":e,r),r);var ii=Qo(U=>{"use strict";Object.defineProperty(U,"__esModule",{value:!0});function Vn(t,e){for(var r=0;r<e.length;r++){var i=e[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function oe(t,e,r){return e&&Vn(t.prototype,e),r&&Vn(t,r),t}function k(){return k=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(t[i]=r[i])}return t},k.apply(this,arguments)}function W(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,mt(t,e)}function xr(t){return xr=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},xr(t)}function mt(t,e){return mt=Object.setPrototypeOf||function(i,n){return i.__proto__=n,i},mt(t,e)}function kl(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(t){return!1}}function Zt(t,e,r){return kl()?Zt=Reflect.construct:Zt=function(n,s,o){var a=[null];a.push.apply(a,s);var l=Function.bind.apply(n,a),u=new l;return o&&mt(u,o.prototype),u},Zt.apply(null,arguments)}function Al(t){return Function.toString.call(t).indexOf("[native code]")!==-1}function Nr(t){var e=typeof Map=="function"?new Map:void 0;return Nr=function(i){if(i===null||!Al(i))return i;if(typeof i!="function")throw new TypeError("Super expression must either be null or a function");if(typeof e!="undefined"){if(e.has(i))return e.get(i);e.set(i,n)}function n(){return Zt(i,arguments,xr(this).constructor)}return n.prototype=Object.create(i.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),mt(n,i)},Nr(t)}function Ol(t,e){if(t==null)return{};var r={},i=Object.keys(t),n,s;for(s=0;s<i.length;s++)n=i[s],!(e.indexOf(n)>=0)&&(r[n]=t[n]);return r}function Cl(t,e){if(!!t){if(typeof t=="string")return Bn(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);if(r==="Object"&&t.constructor&&(r=t.constructor.name),r==="Map"||r==="Set")return Array.from(t);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Bn(t,e)}}function Bn(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,i=new Array(e);r<e;r++)i[r]=t[r];return i}function Ce(t,e){var r=typeof Symbol!="undefined"&&t[Symbol.iterator]||t["@@iterator"];if(r)return(r=r.call(t)).next.bind(r);if(Array.isArray(t)||(r=Cl(t))||e&&t&&typeof t.length=="number"){r&&(t=r);var i=0;return function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var Ne=function(t){W(e,t);function e(){return t.apply(this,arguments)||this}return e}(Nr(Error)),Ll=function(t){W(e,t);function e(r){return t.call(this,"Invalid DateTime: "+r.toMessage())||this}return e}(Ne),Il=function(t){W(e,t);function e(r){return t.call(this,"Invalid Interval: "+r.toMessage())||this}return e}(Ne),Pl=function(t){W(e,t);function e(r){return t.call(this,"Invalid Duration: "+r.toMessage())||this}return e}(Ne),pt=function(t){W(e,t);function e(){return t.apply(this,arguments)||this}return e}(Ne),jn=function(t){W(e,t);function e(r){return t.call(this,"Invalid unit "+r)||this}return e}(Ne),z=function(t){W(e,t);function e(){return t.apply(this,arguments)||this}return e}(Ne),Le=function(t){W(e,t);function e(){return t.call(this,"Zone is an abstract class")||this}return e}(Ne),v="numeric",Q="short",j="long",_r={year:v,month:v,day:v},Un={year:v,month:Q,day:v},Ml={year:v,month:Q,day:v,weekday:Q},qn={year:v,month:j,day:v},$n={year:v,month:j,day:v,weekday:j},Wn={hour:v,minute:v},zn={hour:v,minute:v,second:v},Zn={hour:v,minute:v,second:v,timeZoneName:Q},Jn={hour:v,minute:v,second:v,timeZoneName:j},Kn={hour:v,minute:v,hourCycle:"h23"},Gn={hour:v,minute:v,second:v,hourCycle:"h23"},Yn={hour:v,minute:v,second:v,hourCycle:"h23",timeZoneName:Q},Xn={hour:v,minute:v,second:v,hourCycle:"h23",timeZoneName:j},Qn={year:v,month:v,day:v,hour:v,minute:v},es={year:v,month:v,day:v,hour:v,minute:v,second:v},ts={year:v,month:Q,day:v,hour:v,minute:v},rs={year:v,month:Q,day:v,hour:v,minute:v,second:v},Rl={year:v,month:Q,day:v,weekday:Q,hour:v,minute:v},is={year:v,month:j,day:v,hour:v,minute:v,timeZoneName:Q},ns={year:v,month:j,day:v,hour:v,minute:v,second:v,timeZoneName:Q},ss={year:v,month:j,day:v,weekday:j,hour:v,minute:v,timeZoneName:j},os={year:v,month:j,day:v,weekday:j,hour:v,minute:v,second:v,timeZoneName:j};function A(t){return typeof t=="undefined"}function _e(t){return typeof t=="number"}function Jt(t){return typeof t=="number"&&t%1==0}function Dl(t){return typeof t=="string"}function xl(t){return Object.prototype.toString.call(t)==="[object Date]"}function as(){try{return typeof Intl!="undefined"&&!!Intl.RelativeTimeFormat}catch(t){return!1}}function Nl(t){return Array.isArray(t)?t:[t]}function ls(t,e,r){if(t.length!==0)return t.reduce(function(i,n){var s=[e(n),n];return i&&r(i[0],s[0])===i[0]?i:s},null)[1]}function _l(t,e){return e.reduce(function(r,i){return r[i]=t[i],r},{})}function Xe(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function ge(t,e,r){return Jt(t)&&t>=e&&t<=r}function Fl(t,e){return t-e*Math.floor(t/e)}function Qe(t,e){e===void 0&&(e=2);var r=t<0?"-":"",i=r?t*-1:t,n;return i.toString().length<e?n=("0".repeat(e)+i).slice(-e):n=i.toString(),""+r+n}function x(t){if(!(A(t)||t===null||t===""))return parseInt(t,10)}function Fr(t){if(!(A(t)||t===null||t==="")){var e=parseFloat("0."+t)*1e3;return Math.floor(e)}}function Hr(t,e,r){r===void 0&&(r=!1);var i=Math.pow(10,e),n=r?Math.trunc:Math.round;return n(t*i)/i}function gt(t){return t%4==0&&(t%100!=0||t%400==0)}function vt(t){return gt(t)?366:365}function Kt(t,e){var r=Fl(e-1,12)+1,i=t+(e-r)/12;return r===2?gt(i)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][r-1]}function Vr(t){var e=Date.UTC(t.year,t.month-1,t.day,t.hour,t.minute,t.second,t.millisecond);return t.year<100&&t.year>=0&&(e=new Date(e),e.setUTCFullYear(e.getUTCFullYear()-1900)),+e}function Gt(t){var e=(t+Math.floor(t/4)-Math.floor(t/100)+Math.floor(t/400))%7,r=t-1,i=(r+Math.floor(r/4)-Math.floor(r/100)+Math.floor(r/400))%7;return e===4||i===3?53:52}function Br(t){return t>99?t:t>60?1900+t:2e3+t}function us(t,e,r,i){i===void 0&&(i=null);var n=new Date(t),s={hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"};i&&(s.timeZone=i);var o=k({timeZoneName:e},s),a=new Intl.DateTimeFormat(r,o).formatToParts(n).find(function(l){return l.type.toLowerCase()==="timezonename"});return a?a.value:null}function Yt(t,e){var r=parseInt(t,10);Number.isNaN(r)&&(r=0);var i=parseInt(e,10)||0,n=r<0||Object.is(r,-0)?-i:i;return r*60+n}function cs(t){var e=Number(t);if(typeof t=="boolean"||t===""||Number.isNaN(e))throw new z("Invalid unit value "+t);return e}function Xt(t,e){var r={};for(var i in t)if(Xe(t,i)){var n=t[i];if(n==null)continue;r[e(i)]=cs(n)}return r}function Qt(t,e){var r=Math.trunc(Math.abs(t/60)),i=Math.trunc(Math.abs(t%60)),n=t>=0?"+":"-";switch(e){case"short":return""+n+Qe(r,2)+":"+Qe(i,2);case"narrow":return""+n+r+(i>0?":"+i:"");case"techie":return""+n+Qe(r,2)+Qe(i,2);default:throw new RangeError("Value format "+e+" is out of range for property format")}}function er(t){return _l(t,["hour","minute","second","millisecond"])}var hs=/[A-Za-z_+-]{1,256}(:?\/[A-Za-z_+-]{1,256}(\/[A-Za-z_+-]{1,256})?)?/,Hl=["January","February","March","April","May","June","July","August","September","October","November","December"],ds=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Vl=["J","F","M","A","M","J","J","A","S","O","N","D"];function fs(t){switch(t){case"narrow":return[].concat(Vl);case"short":return[].concat(ds);case"long":return[].concat(Hl);case"numeric":return["1","2","3","4","5","6","7","8","9","10","11","12"];case"2-digit":return["01","02","03","04","05","06","07","08","09","10","11","12"];default:return null}}var ms=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],ps=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],Bl=["M","T","W","T","F","S","S"];function gs(t){switch(t){case"narrow":return[].concat(Bl);case"short":return[].concat(ps);case"long":return[].concat(ms);case"numeric":return["1","2","3","4","5","6","7"];default:return null}}var vs=["AM","PM"],jl=["Before Christ","Anno Domini"],Ul=["BC","AD"],ql=["B","A"];function ys(t){switch(t){case"narrow":return[].concat(ql);case"short":return[].concat(Ul);case"long":return[].concat(jl);default:return null}}function $l(t){return vs[t.hour<12?0:1]}function Wl(t,e){return gs(e)[t.weekday-1]}function zl(t,e){return fs(e)[t.month-1]}function Zl(t,e){return ys(e)[t.year<0?0:1]}function Jl(t,e,r,i){r===void 0&&(r="always"),i===void 0&&(i=!1);var n={years:["year","yr."],quarters:["quarter","qtr."],months:["month","mo."],weeks:["week","wk."],days:["day","day","days"],hours:["hour","hr."],minutes:["minute","min."],seconds:["second","sec."]},s=["hours","minutes","seconds"].indexOf(t)===-1;if(r==="auto"&&s){var o=t==="days";switch(e){case 1:return o?"tomorrow":"next "+n[t][0];case-1:return o?"yesterday":"last "+n[t][0];case 0:return o?"today":"this "+n[t][0]}}var a=Object.is(e,-0)||e<0,l=Math.abs(e),u=l===1,c=n[t],h=i?u?c[1]:c[2]||c[1]:u?n[t][0]:t;return a?l+" "+h+" ago":"in "+l+" "+h}function bs(t,e){for(var r="",i=Ce(t),n;!(n=i()).done;){var s=n.value;s.literal?r+=s.val:r+=e(s.val)}return r}var Kl={D:_r,DD:Un,DDD:qn,DDDD:$n,t:Wn,tt:zn,ttt:Zn,tttt:Jn,T:Kn,TT:Gn,TTT:Yn,TTTT:Xn,f:Qn,ff:ts,fff:is,ffff:ss,F:es,FF:rs,FFF:ns,FFFF:os},ve=function(){t.create=function(i,n){return n===void 0&&(n={}),new t(i,n)},t.parseFormat=function(i){for(var n=null,s="",o=!1,a=[],l=0;l<i.length;l++){var u=i.charAt(l);u==="'"?(s.length>0&&a.push({literal:o,val:s}),n=null,s="",o=!o):o||u===n?s+=u:(s.length>0&&a.push({literal:!1,val:s}),s=u,n=u)}return s.length>0&&a.push({literal:o,val:s}),a},t.macroTokenToFormatOpts=function(i){return Kl[i]};function t(r,i){this.opts=i,this.loc=r,this.systemLoc=null}var e=t.prototype;return e.formatWithSystemDefault=function(i,n){this.systemLoc===null&&(this.systemLoc=this.loc.redefaultToSystem());var s=this.systemLoc.dtFormatter(i,k({},this.opts,n));return s.format()},e.formatDateTime=function(i,n){n===void 0&&(n={});var s=this.loc.dtFormatter(i,k({},this.opts,n));return s.format()},e.formatDateTimeParts=function(i,n){n===void 0&&(n={});var s=this.loc.dtFormatter(i,k({},this.opts,n));return s.formatToParts()},e.resolvedOptions=function(i,n){n===void 0&&(n={});var s=this.loc.dtFormatter(i,k({},this.opts,n));return s.resolvedOptions()},e.num=function(i,n){if(n===void 0&&(n=0),this.opts.forceSimple)return Qe(i,n);var s=k({},this.opts);return n>0&&(s.padTo=n),this.loc.numberFormatter(s).format(i)},e.formatDateTimeFromString=function(i,n){var s=this,o=this.loc.listingMode()==="en",a=this.loc.outputCalendar&&this.loc.outputCalendar!=="gregory",l=function(f,S){return s.loc.extract(i,f,S)},u=function(f){return i.isOffsetFixed&&i.offset===0&&f.allowZ?"Z":i.isValid?i.zone.formatOffset(i.ts,f.format):""},c=function(){return o?$l(i):l({hour:"numeric",hourCycle:"h12"},"dayperiod")},h=function(f,S){return o?zl(i,f):l(S?{month:f}:{month:f,day:"numeric"},"month")},d=function(f,S){return o?Wl(i,f):l(S?{weekday:f}:{weekday:f,month:"long",day:"numeric"},"weekday")},m=function(f){var S=t.macroTokenToFormatOpts(f);return S?s.formatWithSystemDefault(i,S):f},p=function(f){return o?Zl(i,f):l({era:f},"era")},y=function(f){switch(f){case"S":return s.num(i.millisecond);case"u":case"SSS":return s.num(i.millisecond,3);case"s":return s.num(i.second);case"ss":return s.num(i.second,2);case"m":return s.num(i.minute);case"mm":return s.num(i.minute,2);case"h":return s.num(i.hour%12==0?12:i.hour%12);case"hh":return s.num(i.hour%12==0?12:i.hour%12,2);case"H":return s.num(i.hour);case"HH":return s.num(i.hour,2);case"Z":return u({format:"narrow",allowZ:s.opts.allowZ});case"ZZ":return u({format:"short",allowZ:s.opts.allowZ});case"ZZZ":return u({format:"techie",allowZ:s.opts.allowZ});case"ZZZZ":return i.zone.offsetName(i.ts,{format:"short",locale:s.loc.locale});case"ZZZZZ":return i.zone.offsetName(i.ts,{format:"long",locale:s.loc.locale});case"z":return i.zoneName;case"a":return c();case"d":return a?l({day:"numeric"},"day"):s.num(i.day);case"dd":return a?l({day:"2-digit"},"day"):s.num(i.day,2);case"c":return s.num(i.weekday);case"ccc":return d("short",!0);case"cccc":return d("long",!0);case"ccccc":return d("narrow",!0);case"E":return s.num(i.weekday);case"EEE":return d("short",!1);case"EEEE":return d("long",!1);case"EEEEE":return d("narrow",!1);case"L":return a?l({month:"numeric",day:"numeric"},"month"):s.num(i.month);case"LL":return a?l({month:"2-digit",day:"numeric"},"month"):s.num(i.month,2);case"LLL":return h("short",!0);case"LLLL":return h("long",!0);case"LLLLL":return h("narrow",!0);case"M":return a?l({month:"numeric"},"month"):s.num(i.month);case"MM":return a?l({month:"2-digit"},"month"):s.num(i.month,2);case"MMM":return h("short",!1);case"MMMM":return h("long",!1);case"MMMMM":return h("narrow",!1);case"y":return a?l({year:"numeric"},"year"):s.num(i.year);case"yy":return a?l({year:"2-digit"},"year"):s.num(i.year.toString().slice(-2),2);case"yyyy":return a?l({year:"numeric"},"year"):s.num(i.year,4);case"yyyyyy":return a?l({year:"numeric"},"year"):s.num(i.year,6);case"G":return p("short");case"GG":return p("long");case"GGGGG":return p("narrow");case"kk":return s.num(i.weekYear.toString().slice(-2),2);case"kkkk":return s.num(i.weekYear,4);case"W":return s.num(i.weekNumber);case"WW":return s.num(i.weekNumber,2);case"o":return s.num(i.ordinal);case"ooo":return s.num(i.ordinal,3);case"q":return s.num(i.quarter);case"qq":return s.num(i.quarter,2);case"X":return s.num(Math.floor(i.ts/1e3));case"x":return s.num(i.ts);default:return m(f)}};return bs(t.parseFormat(n),y)},e.formatDurationFromString=function(i,n){var s=this,o=function(d){switch(d[0]){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":return"hour";case"d":return"day";case"M":return"month";case"y":return"year";default:return null}},a=function(d){return function(m){var p=o(m);return p?s.num(d.get(p),m.length):m}},l=t.parseFormat(n),u=l.reduce(function(h,d){var m=d.literal,p=d.val;return m?h:h.concat(p)},[]),c=i.shiftTo.apply(i,u.map(o).filter(function(h){return h}));return bs(l,a(c))},t}(),ee=function(){function t(r,i){this.reason=r,this.explanation=i}var e=t.prototype;return e.toMessage=function(){return this.explanation?this.reason+": "+this.explanation:this.reason},t}(),et=function(){function t(){}var e=t.prototype;return e.offsetName=function(i,n){throw new Le},e.formatOffset=function(i,n){throw new Le},e.offset=function(i){throw new Le},e.equals=function(i){throw new Le},oe(t,[{key:"type",get:function(){throw new Le}},{key:"name",get:function(){throw new Le}},{key:"isUniversal",get:function(){throw new Le}},{key:"isValid",get:function(){throw new Le}}]),t}(),jr=null,ws=function(t){W(e,t);function e(){return t.apply(this,arguments)||this}var r=e.prototype;return r.offsetName=function(n,s){var o=s.format,a=s.locale;return us(n,o,a)},r.formatOffset=function(n,s){return Qt(this.offset(n),s)},r.offset=function(n){return-new Date(n).getTimezoneOffset()},r.equals=function(n){return n.type==="system"},oe(e,[{key:"type",get:function(){return"system"}},{key:"name",get:function(){return new Intl.DateTimeFormat().resolvedOptions().timeZone}},{key:"isUniversal",get:function(){return!1}},{key:"isValid",get:function(){return!0}}],[{key:"instance",get:function(){return jr===null&&(jr=new e),jr}}]),e}(et),Gl=RegExp("^"+hs.source+"$"),tr={};function Yl(t){return tr[t]||(tr[t]=new Intl.DateTimeFormat("en-US",{hourCycle:"h23",timeZone:t,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})),tr[t]}var Xl={year:0,month:1,day:2,hour:3,minute:4,second:5};function Ql(t,e){var r=t.format(e).replace(/\u200E/g,""),i=/(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/.exec(r),n=i[1],s=i[2],o=i[3],a=i[4],l=i[5],u=i[6];return[o,n,s,a,l,u]}function eu(t,e){for(var r=t.formatToParts(e),i=[],n=0;n<r.length;n++){var s=r[n],o=s.type,a=s.value,l=Xl[o];A(l)||(i[l]=parseInt(a,10))}return i}var rr={},ae=function(t){W(e,t),e.create=function(n){return rr[n]||(rr[n]=new e(n)),rr[n]},e.resetCache=function(){rr={},tr={}},e.isValidSpecifier=function(n){return!!(n&&n.match(Gl))},e.isValidZone=function(n){try{return new Intl.DateTimeFormat("en-US",{timeZone:n}).format(),!0}catch(s){return!1}},e.parseGMTOffset=function(n){if(n){var s=n.match(/^Etc\/GMT(0|[+-]\d{1,2})$/i);if(s)return-60*parseInt(s[1])}return null};function e(i){var n;return n=t.call(this)||this,n.zoneName=i,n.valid=e.isValidZone(i),n}var r=e.prototype;return r.offsetName=function(n,s){var o=s.format,a=s.locale;return us(n,o,a,this.name)},r.formatOffset=function(n,s){return Qt(this.offset(n),s)},r.offset=function(n){var s=new Date(n);if(isNaN(s))return NaN;var o=Yl(this.name),a=o.formatToParts?eu(o,s):Ql(o,s),l=a[0],u=a[1],c=a[2],h=a[3],d=a[4],m=a[5],p=Vr({year:l,month:u,day:c,hour:h,minute:d,second:m,millisecond:0}),y=+s,b=y%1e3;return y-=b>=0?b:1e3+b,(p-y)/(60*1e3)},r.equals=function(n){return n.type==="iana"&&n.name===this.name},oe(e,[{key:"type",get:function(){return"iana"}},{key:"name",get:function(){return this.zoneName}},{key:"isUniversal",get:function(){return!1}},{key:"isValid",get:function(){return this.valid}}]),e}(et),Ur=null,Z=function(t){W(e,t),e.instance=function(n){return n===0?e.utcInstance:new e(n)},e.parseSpecifier=function(n){if(n){var s=n.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);if(s)return new e(Yt(s[1],s[2]))}return null};function e(i){var n;return n=t.call(this)||this,n.fixed=i,n}var r=e.prototype;return r.offsetName=function(){return this.name},r.formatOffset=function(n,s){return Qt(this.fixed,s)},r.offset=function(){return this.fixed},r.equals=function(n){return n.type==="fixed"&&n.fixed===this.fixed},oe(e,[{key:"type",get:function(){return"fixed"}},{key:"name",get:function(){return this.fixed===0?"UTC":"UTC"+Qt(this.fixed,"narrow")}},{key:"isUniversal",get:function(){return!0}},{key:"isValid",get:function(){return!0}}],[{key:"utcInstance",get:function(){return Ur===null&&(Ur=new e(0)),Ur}}]),e}(et),qr=function(t){W(e,t);function e(i){var n;return n=t.call(this)||this,n.zoneName=i,n}var r=e.prototype;return r.offsetName=function(){return null},r.formatOffset=function(){return""},r.offset=function(){return NaN},r.equals=function(){return!1},oe(e,[{key:"type",get:function(){return"invalid"}},{key:"name",get:function(){return this.zoneName}},{key:"isUniversal",get:function(){return!1}},{key:"isValid",get:function(){return!1}}]),e}(et);function Ie(t,e){var r;if(A(t)||t===null)return e;if(t instanceof et)return t;if(Dl(t)){var i=t.toLowerCase();return i==="local"||i==="system"?e:i==="utc"||i==="gmt"?Z.utcInstance:(r=ae.parseGMTOffset(t))!=null?Z.instance(r):ae.isValidSpecifier(i)?ae.create(t):Z.parseSpecifier(i)||new qr(t)}else return _e(t)?Z.instance(t):typeof t=="object"&&t.offset&&typeof t.offset=="number"?t:new qr(t)}var Ss=function(){return Date.now()},Es="system",Ts=null,ks=null,As=null,Os,L=function(){function t(){}return t.resetCaches=function(){M.resetCache(),ae.resetCache()},oe(t,null,[{key:"now",get:function(){return Ss},set:function(r){Ss=r}},{key:"defaultZone",get:function(){return Ie(Es,ws.instance)},set:function(r){Es=r}},{key:"defaultLocale",get:function(){return Ts},set:function(r){Ts=r}},{key:"defaultNumberingSystem",get:function(){return ks},set:function(r){ks=r}},{key:"defaultOutputCalendar",get:function(){return As},set:function(r){As=r}},{key:"throwOnInvalid",get:function(){return Os},set:function(r){Os=r}}]),t}(),tu=["base"],$r={};function Wr(t,e){e===void 0&&(e={});var r=JSON.stringify([t,e]),i=$r[r];return i||(i=new Intl.DateTimeFormat(t,e),$r[r]=i),i}var zr={};function ru(t,e){e===void 0&&(e={});var r=JSON.stringify([t,e]),i=zr[r];return i||(i=new Intl.NumberFormat(t,e),zr[r]=i),i}var Zr={};function iu(t,e){e===void 0&&(e={});var r=e;r.base;var i=Ol(r,tu),n=JSON.stringify([t,i]),s=Zr[n];return s||(s=new Intl.RelativeTimeFormat(t,e),Zr[n]=s),s}var yt=null;function nu(){return yt||(yt=new Intl.DateTimeFormat().resolvedOptions().locale,yt)}function su(t){var e=t.indexOf("-u-");if(e===-1)return[t];var r,i=t.substring(0,e);try{r=Wr(t).resolvedOptions()}catch(a){r=Wr(i).resolvedOptions()}var n=r,s=n.numberingSystem,o=n.calendar;return[i,s,o]}function ou(t,e,r){return(r||e)&&(t+="-u",r&&(t+="-ca-"+r),e&&(t+="-nu-"+e)),t}function au(t){for(var e=[],r=1;r<=12;r++){var i=I.utc(2016,r,1);e.push(t(i))}return e}function lu(t){for(var e=[],r=1;r<=7;r++){var i=I.utc(2016,11,13+r);e.push(t(i))}return e}function ir(t,e,r,i,n){var s=t.listingMode(r);return s==="error"?null:s==="en"?i(e):n(e)}function uu(t){return t.numberingSystem&&t.numberingSystem!=="latn"?!1:t.numberingSystem==="latn"||!t.locale||t.locale.startsWith("en")||new Intl.DateTimeFormat(t.intl).resolvedOptions().numberingSystem==="latn"}var cu=function(){function t(r,i,n){if(this.padTo=n.padTo||0,this.floor=n.floor||!1,!i){var s={useGrouping:!1};n.padTo>0&&(s.minimumIntegerDigits=n.padTo),this.inf=ru(r,s)}}var e=t.prototype;return e.format=function(i){if(this.inf){var n=this.floor?Math.floor(i):i;return this.inf.format(n)}else{var s=this.floor?Math.floor(i):Hr(i,3);return Qe(s,this.padTo)}},t}(),hu=function(){function t(r,i,n){this.opts=n;var s;if(r.zone.isUniversal){var o=-1*(r.offset/60),a=o>=0?"Etc/GMT+"+o:"Etc/GMT"+o,l=ae.isValidZone(a);r.offset!==0&&l?(s=a,this.dt=r):(s="UTC",n.timeZoneName?this.dt=r:this.dt=r.offset===0?r:I.fromMillis(r.ts+r.offset*60*1e3))}else r.zone.type==="system"?this.dt=r:(this.dt=r,s=r.zone.name);var u=k({},this.opts);s&&(u.timeZone=s),this.dtf=Wr(i,u)}var e=t.prototype;return e.format=function(){return this.dtf.format(this.dt.toJSDate())},e.formatToParts=function(){return this.dtf.formatToParts(this.dt.toJSDate())},e.resolvedOptions=function(){return this.dtf.resolvedOptions()},t}(),du=function(){function t(r,i,n){this.opts=k({style:"long"},n),!i&&as()&&(this.rtf=iu(r,n))}var e=t.prototype;return e.format=function(i,n){return this.rtf?this.rtf.format(i,n):Jl(n,i,this.opts.numeric,this.opts.style!=="long")},e.formatToParts=function(i,n){return this.rtf?this.rtf.formatToParts(i,n):[]},t}(),M=function(){t.fromOpts=function(i){return t.create(i.locale,i.numberingSystem,i.outputCalendar,i.defaultToEN)},t.create=function(i,n,s,o){o===void 0&&(o=!1);var a=i||L.defaultLocale,l=a||(o?"en-US":nu()),u=n||L.defaultNumberingSystem,c=s||L.defaultOutputCalendar;return new t(l,u,c,a)},t.resetCache=function(){yt=null,$r={},zr={},Zr={}},t.fromObject=function(i){var n=i===void 0?{}:i,s=n.locale,o=n.numberingSystem,a=n.outputCalendar;return t.create(s,o,a)};function t(r,i,n,s){var o=su(r),a=o[0],l=o[1],u=o[2];this.locale=a,this.numberingSystem=i||l||null,this.outputCalendar=n||u||null,this.intl=ou(this.locale,this.numberingSystem,this.outputCalendar),this.weekdaysCache={format:{},standalone:{}},this.monthsCache={format:{},standalone:{}},this.meridiemCache=null,this.eraCache={},this.specifiedLocale=s,this.fastNumbersCached=null}var e=t.prototype;return e.listingMode=function(i){var n=this.isEnglish(),s=(this.numberingSystem===null||this.numberingSystem==="latn")&&(this.outputCalendar===null||this.outputCalendar==="gregory");return n&&s?"en":"intl"},e.clone=function(i){return!i||Object.getOwnPropertyNames(i).length===0?this:t.create(i.locale||this.specifiedLocale,i.numberingSystem||this.numberingSystem,i.outputCalendar||this.outputCalendar,i.defaultToEN||!1)},e.redefaultToEN=function(i){return i===void 0&&(i={}),this.clone(k({},i,{defaultToEN:!0}))},e.redefaultToSystem=function(i){return i===void 0&&(i={}),this.clone(k({},i,{defaultToEN:!1}))},e.months=function(i,n,s){var o=this;return n===void 0&&(n=!1),s===void 0&&(s=!0),ir(this,i,s,fs,function(){var a=n?{month:i,day:"numeric"}:{month:i},l=n?"format":"standalone";return o.monthsCache[l][i]||(o.monthsCache[l][i]=au(function(u){return o.extract(u,a,"month")})),o.monthsCache[l][i]})},e.weekdays=function(i,n,s){var o=this;return n===void 0&&(n=!1),s===void 0&&(s=!0),ir(this,i,s,gs,function(){var a=n?{weekday:i,year:"numeric",month:"long",day:"numeric"}:{weekday:i},l=n?"format":"standalone";return o.weekdaysCache[l][i]||(o.weekdaysCache[l][i]=lu(function(u){return o.extract(u,a,"weekday")})),o.weekdaysCache[l][i]})},e.meridiems=function(i){var n=this;return i===void 0&&(i=!0),ir(this,void 0,i,function(){return vs},function(){if(!n.meridiemCache){var s={hour:"numeric",hourCycle:"h12"};n.meridiemCache=[I.utc(2016,11,13,9),I.utc(2016,11,13,19)].map(function(o){return n.extract(o,s,"dayperiod")})}return n.meridiemCache})},e.eras=function(i,n){var s=this;return n===void 0&&(n=!0),ir(this,i,n,ys,function(){var o={era:i};return s.eraCache[i]||(s.eraCache[i]=[I.utc(-40,1,1),I.utc(2017,1,1)].map(function(a){return s.extract(a,o,"era")})),s.eraCache[i]})},e.extract=function(i,n,s){var o=this.dtFormatter(i,n),a=o.formatToParts(),l=a.find(function(u){return u.type.toLowerCase()===s});return l?l.value:null},e.numberFormatter=function(i){return i===void 0&&(i={}),new cu(this.intl,i.forceSimple||this.fastNumbers,i)},e.dtFormatter=function(i,n){return n===void 0&&(n={}),new hu(i,this.intl,n)},e.relFormatter=function(i){return i===void 0&&(i={}),new du(this.intl,this.isEnglish(),i)},e.isEnglish=function(){return this.locale==="en"||this.locale.toLowerCase()==="en-us"||new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us")},e.equals=function(i){return this.locale===i.locale&&this.numberingSystem===i.numberingSystem&&this.outputCalendar===i.outputCalendar},oe(t,[{key:"fastNumbers",get:function(){return this.fastNumbersCached==null&&(this.fastNumbersCached=uu(this)),this.fastNumbersCached}}]),t}();function tt(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];var i=e.reduce(function(n,s){return n+s.source},"");return RegExp("^"+i+"$")}function Fe(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];return function(i){return e.reduce(function(n,s){var o=n[0],a=n[1],l=n[2],u=s(i,l),c=u[0],h=u[1],d=u[2];return[k({},o,c),a||h,d]},[{},null,1]).slice(0,2)}}function rt(t){if(t==null)return[null,null];for(var e=arguments.length,r=new Array(e>1?e-1:0),i=1;i<e;i++)r[i-1]=arguments[i];for(var n=0,s=r;n<s.length;n++){var o=s[n],a=o[0],l=o[1],u=a.exec(t);if(u)return l(u)}return[null,null]}function Cs(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];return function(i,n){var s={},o;for(o=0;o<e.length;o++)s[e[o]]=x(i[n+o]);return[s,null,n+o]}}var Ls=/(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/,Jr=/(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/,Is=RegExp(""+Jr.source+Ls.source+"?"),Kr=RegExp("(?:T"+Is.source+")?"),fu=/([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/,mu=/(\d{4})-?W(\d\d)(?:-?(\d))?/,pu=/(\d{4})-?(\d{3})/,gu=Cs("weekYear","weekNumber","weekDay"),vu=Cs("year","ordinal"),yu=/(\d{4})-(\d\d)-(\d\d)/,Ps=RegExp(Jr.source+" ?(?:"+Ls.source+"|("+hs.source+"))?"),bu=RegExp("(?: "+Ps.source+")?");function it(t,e,r){var i=t[e];return A(i)?r:x(i)}function Ms(t,e){var r={year:it(t,e),month:it(t,e+1,1),day:it(t,e+2,1)};return[r,null,e+3]}function He(t,e){var r={hours:it(t,e,0),minutes:it(t,e+1,0),seconds:it(t,e+2,0),milliseconds:Fr(t[e+3])};return[r,null,e+4]}function nt(t,e){var r=!t[e]&&!t[e+1],i=Yt(t[e+1],t[e+2]),n=r?null:Z.instance(i);return[{},n,e+3]}function Rs(t,e){var r=t[e]?ae.create(t[e]):null;return[{},r,e+1]}var wu=RegExp("^T?"+Jr.source+"$"),Su=/^-?P(?:(?:(-?\d{1,9})Y)?(?:(-?\d{1,9})M)?(?:(-?\d{1,9})W)?(?:(-?\d{1,9})D)?(?:T(?:(-?\d{1,9})H)?(?:(-?\d{1,9})M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,9}))?S)?)?)$/;function Eu(t){var e=t[0],r=t[1],i=t[2],n=t[3],s=t[4],o=t[5],a=t[6],l=t[7],u=t[8],c=e[0]==="-",h=l&&l[0]==="-",d=function(p,y){return y===void 0&&(y=!1),p!==void 0&&(y||p&&c)?-p:p};return[{years:d(x(r)),months:d(x(i)),weeks:d(x(n)),days:d(x(s)),hours:d(x(o)),minutes:d(x(a)),seconds:d(x(l),l==="-0"),milliseconds:d(Fr(u),h)}]}var Tu={GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function Gr(t,e,r,i,n,s,o){var a={year:e.length===2?Br(x(e)):x(e),month:ds.indexOf(r)+1,day:x(i),hour:x(n),minute:x(s)};return o&&(a.second=x(o)),t&&(a.weekday=t.length>3?ms.indexOf(t)+1:ps.indexOf(t)+1),a}var ku=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;function Au(t){var e=t[1],r=t[2],i=t[3],n=t[4],s=t[5],o=t[6],a=t[7],l=t[8],u=t[9],c=t[10],h=t[11],d=Gr(e,n,i,r,s,o,a),m;return l?m=Tu[l]:u?m=0:m=Yt(c,h),[d,new Z(m)]}function Ou(t){return t.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim()}var Cu=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,Lu=/^(Monday|Tuesday|Wedsday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,Iu=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;function Ds(t){var e=t[1],r=t[2],i=t[3],n=t[4],s=t[5],o=t[6],a=t[7],l=Gr(e,n,i,r,s,o,a);return[l,Z.utcInstance]}function Pu(t){var e=t[1],r=t[2],i=t[3],n=t[4],s=t[5],o=t[6],a=t[7],l=Gr(e,a,r,i,n,s,o);return[l,Z.utcInstance]}var Mu=tt(fu,Kr),Ru=tt(mu,Kr),Du=tt(pu,Kr),xu=tt(Is),Nu=Fe(Ms,He,nt),_u=Fe(gu,He,nt),Fu=Fe(vu,He,nt),Hu=Fe(He,nt);function Vu(t){return rt(t,[Mu,Nu],[Ru,_u],[Du,Fu],[xu,Hu])}function Bu(t){return rt(Ou(t),[ku,Au])}function ju(t){return rt(t,[Cu,Ds],[Lu,Ds],[Iu,Pu])}function Uu(t){return rt(t,[Su,Eu])}var qu=Fe(He);function $u(t){return rt(t,[wu,qu])}var Wu=tt(yu,bu),zu=tt(Ps),Zu=Fe(Ms,He,nt,Rs),Ju=Fe(He,nt,Rs);function Ku(t){return rt(t,[Wu,Zu],[zu,Ju])}var Gu="Invalid Duration",xs={weeks:{days:7,hours:7*24,minutes:7*24*60,seconds:7*24*60*60,milliseconds:7*24*60*60*1e3},days:{hours:24,minutes:24*60,seconds:24*60*60,milliseconds:24*60*60*1e3},hours:{minutes:60,seconds:60*60,milliseconds:60*60*1e3},minutes:{seconds:60,milliseconds:60*1e3},seconds:{milliseconds:1e3}},Yu=k({years:{quarters:4,months:12,weeks:52,days:365,hours:365*24,minutes:365*24*60,seconds:365*24*60*60,milliseconds:365*24*60*60*1e3},quarters:{months:3,weeks:13,days:91,hours:91*24,minutes:91*24*60,seconds:91*24*60*60,milliseconds:91*24*60*60*1e3},months:{weeks:4,days:30,hours:30*24,minutes:30*24*60,seconds:30*24*60*60,milliseconds:30*24*60*60*1e3}},xs),J=146097/400,st=146097/4800,Xu=k({years:{quarters:4,months:12,weeks:J/7,days:J,hours:J*24,minutes:J*24*60,seconds:J*24*60*60,milliseconds:J*24*60*60*1e3},quarters:{months:3,weeks:J/28,days:J/4,hours:J*24/4,minutes:J*24*60/4,seconds:J*24*60*60/4,milliseconds:J*24*60*60*1e3/4},months:{weeks:st/7,days:st,hours:st*24,minutes:st*24*60,seconds:st*24*60*60,milliseconds:st*24*60*60*1e3}},xs),ot=["years","quarters","months","weeks","days","hours","minutes","seconds","milliseconds"],Qu=ot.slice(0).reverse();function Ve(t,e,r){r===void 0&&(r=!1);var i={values:r?e.values:k({},t.values,e.values||{}),loc:t.loc.clone(e.loc),conversionAccuracy:e.conversionAccuracy||t.conversionAccuracy};return new N(i)}function ec(t){return t<0?Math.floor(t):Math.ceil(t)}function Ns(t,e,r,i,n){var s=t[n][r],o=e[r]/s,a=Math.sign(o)===Math.sign(i[n]),l=!a&&i[n]!==0&&Math.abs(o)<=1?ec(o):Math.trunc(o);i[n]+=l,e[r]-=l*s}function tc(t,e){Qu.reduce(function(r,i){return A(e[i])?r:(r&&Ns(t,e,r,e,i),i)},null)}var N=function(){function t(r){var i=r.conversionAccuracy==="longterm"||!1;this.values=r.values,this.loc=r.loc||M.create(),this.conversionAccuracy=i?"longterm":"casual",this.invalid=r.invalid||null,this.matrix=i?Xu:Yu,this.isLuxonDuration=!0}t.fromMillis=function(i,n){return t.fromObject({milliseconds:i},n)},t.fromObject=function(i,n){if(n===void 0&&(n={}),i==null||typeof i!="object")throw new z("Duration.fromObject: argument expected to be an object, got "+(i===null?"null":typeof i));return new t({values:Xt(i,t.normalizeUnit),loc:M.fromObject(n),conversionAccuracy:n.conversionAccuracy})},t.fromISO=function(i,n){var s=Uu(i),o=s[0];return o?t.fromObject(o,n):t.invalid("unparsable",'the input "'+i+`" can't be parsed as ISO 8601`)},t.fromISOTime=function(i,n){var s=$u(i),o=s[0];return o?t.fromObject(o,n):t.invalid("unparsable",'the input "'+i+`" can't be parsed as ISO 8601`)},t.invalid=function(i,n){if(n===void 0&&(n=null),!i)throw new z("need to specify a reason the Duration is invalid");var s=i instanceof ee?i:new ee(i,n);if(L.throwOnInvalid)throw new Pl(s);return new t({invalid:s})},t.normalizeUnit=function(i){var n={year:"years",years:"years",quarter:"quarters",quarters:"quarters",month:"months",months:"months",week:"weeks",weeks:"weeks",day:"days",days:"days",hour:"hours",hours:"hours",minute:"minutes",minutes:"minutes",second:"seconds",seconds:"seconds",millisecond:"milliseconds",milliseconds:"milliseconds"}[i&&i.toLowerCase()];if(!n)throw new jn(i);return n},t.isDuration=function(i){return i&&i.isLuxonDuration||!1};var e=t.prototype;return e.toFormat=function(i,n){n===void 0&&(n={});var s=k({},n,{floor:n.round!==!1&&n.floor!==!1});return this.isValid?ve.create(this.loc,s).formatDurationFromString(this,i):Gu},e.toObject=function(){return this.isValid?k({},this.values):{}},e.toISO=function(){if(!this.isValid)return null;var i="P";return this.years!==0&&(i+=this.years+"Y"),(this.months!==0||this.quarters!==0)&&(i+=this.months+this.quarters*3+"M"),this.weeks!==0&&(i+=this.weeks+"W"),this.days!==0&&(i+=this.days+"D"),(this.hours!==0||this.minutes!==0||this.seconds!==0||this.milliseconds!==0)&&(i+="T"),this.hours!==0&&(i+=this.hours+"H"),this.minutes!==0&&(i+=this.minutes+"M"),(this.seconds!==0||this.milliseconds!==0)&&(i+=Hr(this.seconds+this.milliseconds/1e3,3)+"S"),i==="P"&&(i+="T0S"),i},e.toISOTime=function(i){if(i===void 0&&(i={}),!this.isValid)return null;var n=this.toMillis();if(n<0||n>=864e5)return null;i=k({suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:"extended"},i);var s=this.shiftTo("hours","minutes","seconds","milliseconds"),o=i.format==="basic"?"hhmm":"hh:mm";(!i.suppressSeconds||s.seconds!==0||s.milliseconds!==0)&&(o+=i.format==="basic"?"ss":":ss",(!i.suppressMilliseconds||s.milliseconds!==0)&&(o+=".SSS"));var a=s.toFormat(o);return i.includePrefix&&(a="T"+a),a},e.toJSON=function(){return this.toISO()},e.toString=function(){return this.toISO()},e.toMillis=function(){return this.as("milliseconds")},e.valueOf=function(){return this.toMillis()},e.plus=function(i){if(!this.isValid)return this;for(var n=Be(i),s={},o=Ce(ot),a;!(a=o()).done;){var l=a.value;(Xe(n.values,l)||Xe(this.values,l))&&(s[l]=n.get(l)+this.get(l))}return Ve(this,{values:s},!0)},e.minus=function(i){if(!this.isValid)return this;var n=Be(i);return this.plus(n.negate())},e.mapUnits=function(i){if(!this.isValid)return this;for(var n={},s=0,o=Object.keys(this.values);s<o.length;s++){var a=o[s];n[a]=cs(i(this.values[a],a))}return Ve(this,{values:n},!0)},e.get=function(i){return this[t.normalizeUnit(i)]},e.set=function(i){if(!this.isValid)return this;var n=k({},this.values,Xt(i,t.normalizeUnit));return Ve(this,{values:n})},e.reconfigure=function(i){var n=i===void 0?{}:i,s=n.locale,o=n.numberingSystem,a=n.conversionAccuracy,l=this.loc.clone({locale:s,numberingSystem:o}),u={loc:l};return a&&(u.conversionAccuracy=a),Ve(this,u)},e.as=function(i){return this.isValid?this.shiftTo(i).get(i):NaN},e.normalize=function(){if(!this.isValid)return this;var i=this.toObject();return tc(this.matrix,i),Ve(this,{values:i},!0)},e.shiftTo=function(){for(var i=arguments.length,n=new Array(i),s=0;s<i;s++)n[s]=arguments[s];if(!this.isValid)return this;if(n.length===0)return this;n=n.map(function(S){return t.normalizeUnit(S)});for(var o={},a={},l=this.toObject(),u,c=Ce(ot),h;!(h=c()).done;){var d=h.value;if(n.indexOf(d)>=0){u=d;var m=0;for(var p in a)m+=this.matrix[p][d]*a[p],a[p]=0;_e(l[d])&&(m+=l[d]);var y=Math.trunc(m);o[d]=y,a[d]=m-y;for(var b in l)ot.indexOf(b)>ot.indexOf(d)&&Ns(this.matrix,l,b,o,d)}else _e(l[d])&&(a[d]=l[d])}for(var f in a)a[f]!==0&&(o[u]+=f===u?a[f]:a[f]/this.matrix[u][f]);return Ve(this,{values:o},!0).normalize()},e.negate=function(){if(!this.isValid)return this;for(var i={},n=0,s=Object.keys(this.values);n<s.length;n++){var o=s[n];i[o]=-this.values[o]}return Ve(this,{values:i},!0)},e.equals=function(i){if(!this.isValid||!i.isValid||!this.loc.equals(i.loc))return!1;function n(l,u){return l===void 0||l===0?u===void 0||u===0:l===u}for(var s=Ce(ot),o;!(o=s()).done;){var a=o.value;if(!n(this.values[a],i.values[a]))return!1}return!0},oe(t,[{key:"locale",get:function(){return this.isValid?this.loc.locale:null}},{key:"numberingSystem",get:function(){return this.isValid?this.loc.numberingSystem:null}},{key:"years",get:function(){return this.isValid?this.values.years||0:NaN}},{key:"quarters",get:function(){return this.isValid?this.values.quarters||0:NaN}},{key:"months",get:function(){return this.isValid?this.values.months||0:NaN}},{key:"weeks",get:function(){return this.isValid?this.values.weeks||0:NaN}},{key:"days",get:function(){return this.isValid?this.values.days||0:NaN}},{key:"hours",get:function(){return this.isValid?this.values.hours||0:NaN}},{key:"minutes",get:function(){return this.isValid?this.values.minutes||0:NaN}},{key:"seconds",get:function(){return this.isValid?this.values.seconds||0:NaN}},{key:"milliseconds",get:function(){return this.isValid?this.values.milliseconds||0:NaN}},{key:"isValid",get:function(){return this.invalid===null}},{key:"invalidReason",get:function(){return this.invalid?this.invalid.reason:null}},{key:"invalidExplanation",get:function(){return this.invalid?this.invalid.explanation:null}}]),t}();function Be(t){if(_e(t))return N.fromMillis(t);if(N.isDuration(t))return t;if(typeof t=="object")return N.fromObject(t);throw new z("Unknown duration argument "+t+" of type "+typeof t)}var bt="Invalid Interval";function rc(t,e){return!t||!t.isValid?wt.invalid("missing or invalid start"):!e||!e.isValid?wt.invalid("missing or invalid end"):e<t?wt.invalid("end before start","The end of an interval must be after its start, but you had start="+t.toISO()+" and end="+e.toISO()):null}var wt=function(){function t(r){this.s=r.start,this.e=r.end,this.invalid=r.invalid||null,this.isLuxonInterval=!0}t.invalid=function(i,n){if(n===void 0&&(n=null),!i)throw new z("need to specify a reason the Interval is invalid");var s=i instanceof ee?i:new ee(i,n);if(L.throwOnInvalid)throw new Il(s);return new t({invalid:s})},t.fromDateTimes=function(i,n){var s=kt(i),o=kt(n),a=rc(s,o);return a??new t({start:s,end:o})},t.after=function(i,n){var s=Be(n),o=kt(i);return t.fromDateTimes(o,o.plus(s))},t.before=function(i,n){var s=Be(n),o=kt(i);return t.fromDateTimes(o.minus(s),o)},t.fromISO=function(i,n){var s=(i||"").split("/",2),o=s[0],a=s[1];if(o&&a){var l,u;try{l=I.fromISO(o,n),u=l.isValid}catch(p){u=!1}var c,h;try{c=I.fromISO(a,n),h=c.isValid}catch(p){h=!1}if(u&&h)return t.fromDateTimes(l,c);if(u){var d=N.fromISO(a,n);if(d.isValid)return t.after(l,d)}else if(h){var m=N.fromISO(o,n);if(m.isValid)return t.before(c,m)}}return t.invalid("unparsable",'the input "'+i+`" can't be parsed as ISO 8601`)},t.isInterval=function(i){return i&&i.isLuxonInterval||!1};var e=t.prototype;return e.length=function(i){return i===void 0&&(i="milliseconds"),this.isValid?this.toDuration.apply(this,[i]).get(i):NaN},e.count=function(i){if(i===void 0&&(i="milliseconds"),!this.isValid)return NaN;var n=this.start.startOf(i),s=this.end.startOf(i);return Math.floor(s.diff(n,i).get(i))+1},e.hasSame=function(i){return this.isValid?this.isEmpty()||this.e.minus(1).hasSame(this.s,i):!1},e.isEmpty=function(){return this.s.valueOf()===this.e.valueOf()},e.isAfter=function(i){return this.isValid?this.s>i:!1},e.isBefore=function(i){return this.isValid?this.e<=i:!1},e.contains=function(i){return this.isValid?this.s<=i&&this.e>i:!1},e.set=function(i){var n=i===void 0?{}:i,s=n.start,o=n.end;return this.isValid?t.fromDateTimes(s||this.s,o||this.e):this},e.splitAt=function(){var i=this;if(!this.isValid)return[];for(var n=arguments.length,s=new Array(n),o=0;o<n;o++)s[o]=arguments[o];for(var a=s.map(kt).filter(function(m){return i.contains(m)}).sort(),l=[],u=this.s,c=0;u<this.e;){var h=a[c]||this.e,d=+h>+this.e?this.e:h;l.push(t.fromDateTimes(u,d)),u=d,c+=1}return l},e.splitBy=function(i){var n=Be(i);if(!this.isValid||!n.isValid||n.as("milliseconds")===0)return[];for(var s=this.s,o=1,a,l=[];s<this.e;){var u=this.start.plus(n.mapUnits(function(c){return c*o}));a=+u>+this.e?this.e:u,l.push(t.fromDateTimes(s,a)),s=a,o+=1}return l},e.divideEqually=function(i){return this.isValid?this.splitBy(this.length()/i).slice(0,i):[]},e.overlaps=function(i){return this.e>i.s&&this.s<i.e},e.abutsStart=function(i){return this.isValid?+this.e==+i.s:!1},e.abutsEnd=function(i){return this.isValid?+i.e==+this.s:!1},e.engulfs=function(i){return this.isValid?this.s<=i.s&&this.e>=i.e:!1},e.equals=function(i){return!this.isValid||!i.isValid?!1:this.s.equals(i.s)&&this.e.equals(i.e)},e.intersection=function(i){if(!this.isValid)return this;var n=this.s>i.s?this.s:i.s,s=this.e<i.e?this.e:i.e;return n>=s?null:t.fromDateTimes(n,s)},e.union=function(i){if(!this.isValid)return this;var n=this.s<i.s?this.s:i.s,s=this.e>i.e?this.e:i.e;return t.fromDateTimes(n,s)},t.merge=function(i){var n=i.sort(function(a,l){return a.s-l.s}).reduce(function(a,l){var u=a[0],c=a[1];return c?c.overlaps(l)||c.abutsStart(l)?[u,c.union(l)]:[u.concat([c]),l]:[u,l]},[[],null]),s=n[0],o=n[1];return o&&s.push(o),s},t.xor=function(i){for(var n,s=null,o=0,a=[],l=i.map(function(p){return[{time:p.s,type:"s"},{time:p.e,type:"e"}]}),u=(n=Array.prototype).concat.apply(n,l),c=u.sort(function(p,y){return p.time-y.time}),h=Ce(c),d;!(d=h()).done;){var m=d.value;o+=m.type==="s"?1:-1,o===1?s=m.time:(s&&+s!=+m.time&&a.push(t.fromDateTimes(s,m.time)),s=null)}return t.merge(a)},e.difference=function(){for(var i=this,n=arguments.length,s=new Array(n),o=0;o<n;o++)s[o]=arguments[o];return t.xor([this].concat(s)).map(function(a){return i.intersection(a)}).filter(function(a){return a&&!a.isEmpty()})},e.toString=function(){return this.isValid?"["+this.s.toISO()+" \u2013 "+this.e.toISO()+")":bt},e.toISO=function(i){return this.isValid?this.s.toISO(i)+"/"+this.e.toISO(i):bt},e.toISODate=function(){return this.isValid?this.s.toISODate()+"/"+this.e.toISODate():bt},e.toISOTime=function(i){return this.isValid?this.s.toISOTime(i)+"/"+this.e.toISOTime(i):bt},e.toFormat=function(i,n){var s=n===void 0?{}:n,o=s.separator,a=o===void 0?" \u2013 ":o;return this.isValid?""+this.s.toFormat(i)+a+this.e.toFormat(i):bt},e.toDuration=function(i,n){return this.isValid?this.e.diff(this.s,i,n):N.invalid(this.invalidReason)},e.mapEndpoints=function(i){return t.fromDateTimes(i(this.s),i(this.e))},oe(t,[{key:"start",get:function(){return this.isValid?this.s:null}},{key:"end",get:function(){return this.isValid?this.e:null}},{key:"isValid",get:function(){return this.invalidReason===null}},{key:"invalidReason",get:function(){return this.invalid?this.invalid.reason:null}},{key:"invalidExplanation",get:function(){return this.invalid?this.invalid.explanation:null}}]),t}(),St=function(){function t(){}return t.hasDST=function(r){r===void 0&&(r=L.defaultZone);var i=I.now().setZone(r).set({month:12});return!r.isUniversal&&i.offset!==i.set({month:6}).offset},t.isValidIANAZone=function(r){return ae.isValidSpecifier(r)&&ae.isValidZone(r)},t.normalizeZone=function(r){return Ie(r,L.defaultZone)},t.months=function(r,i){r===void 0&&(r="long");var n=i===void 0?{}:i,s=n.locale,o=s===void 0?null:s,a=n.numberingSystem,l=a===void 0?null:a,u=n.locObj,c=u===void 0?null:u,h=n.outputCalendar,d=h===void 0?"gregory":h;return(c||M.create(o,l,d)).months(r)},t.monthsFormat=function(r,i){r===void 0&&(r="long");var n=i===void 0?{}:i,s=n.locale,o=s===void 0?null:s,a=n.numberingSystem,l=a===void 0?null:a,u=n.locObj,c=u===void 0?null:u,h=n.outputCalendar,d=h===void 0?"gregory":h;return(c||M.create(o,l,d)).months(r,!0)},t.weekdays=function(r,i){r===void 0&&(r="long");var n=i===void 0?{}:i,s=n.locale,o=s===void 0?null:s,a=n.numberingSystem,l=a===void 0?null:a,u=n.locObj,c=u===void 0?null:u;return(c||M.create(o,l,null)).weekdays(r)},t.weekdaysFormat=function(r,i){r===void 0&&(r="long");var n=i===void 0?{}:i,s=n.locale,o=s===void 0?null:s,a=n.numberingSystem,l=a===void 0?null:a,u=n.locObj,c=u===void 0?null:u;return(c||M.create(o,l,null)).weekdays(r,!0)},t.meridiems=function(r){var i=r===void 0?{}:r,n=i.locale,s=n===void 0?null:n;return M.create(s).meridiems()},t.eras=function(r,i){r===void 0&&(r="short");var n=i===void 0?{}:i,s=n.locale,o=s===void 0?null:s;return M.create(o,null,"gregory").eras(r)},t.features=function(){return{relative:as()}},t}();function _s(t,e){var r=function(s){return s.toUTC(0,{keepLocalTime:!0}).startOf("day").valueOf()},i=r(e)-r(t);return Math.floor(N.fromMillis(i).as("days"))}function ic(t,e,r){for(var i=[["years",function(y,b){return b.year-y.year}],["quarters",function(y,b){return b.quarter-y.quarter}],["months",function(y,b){return b.month-y.month+(b.year-y.year)*12}],["weeks",function(y,b){var f=_s(y,b);return(f-f%7)/7}],["days",_s]],n={},s,o,a=0,l=i;a<l.length;a++){var u=l[a],c=u[0],h=u[1];if(r.indexOf(c)>=0){var d;s=c;var m=h(t,e);if(o=t.plus((d={},d[c]=m,d)),o>e){var p;t=t.plus((p={},p[c]=m-1,p)),m-=1}else t=o;n[c]=m}}return[t,n,o,s]}function nc(t,e,r,i){var n=ic(t,e,r),s=n[0],o=n[1],a=n[2],l=n[3],u=e-s,c=r.filter(function(p){return["hours","minutes","seconds","milliseconds"].indexOf(p)>=0});if(c.length===0){if(a<e){var h;a=s.plus((h={},h[l]=1,h))}a!==s&&(o[l]=(o[l]||0)+u/(a-s))}var d=N.fromObject(o,i);if(c.length>0){var m;return(m=N.fromMillis(u,i)).shiftTo.apply(m,c).plus(d)}else return d}var Yr={arab:"[\u0660-\u0669]",arabext:"[\u06F0-\u06F9]",bali:"[\u1B50-\u1B59]",beng:"[\u09E6-\u09EF]",deva:"[\u0966-\u096F]",fullwide:"[\uFF10-\uFF19]",gujr:"[\u0AE6-\u0AEF]",hanidec:"[\u3007|\u4E00|\u4E8C|\u4E09|\u56DB|\u4E94|\u516D|\u4E03|\u516B|\u4E5D]",khmr:"[\u17E0-\u17E9]",knda:"[\u0CE6-\u0CEF]",laoo:"[\u0ED0-\u0ED9]",limb:"[\u1946-\u194F]",mlym:"[\u0D66-\u0D6F]",mong:"[\u1810-\u1819]",mymr:"[\u1040-\u1049]",orya:"[\u0B66-\u0B6F]",tamldec:"[\u0BE6-\u0BEF]",telu:"[\u0C66-\u0C6F]",thai:"[\u0E50-\u0E59]",tibt:"[\u0F20-\u0F29]",latn:"\\d"},Fs={arab:[1632,1641],arabext:[1776,1785],bali:[6992,7001],beng:[2534,2543],deva:[2406,2415],fullwide:[65296,65303],gujr:[2790,2799],khmr:[6112,6121],knda:[3302,3311],laoo:[3792,3801],limb:[6470,6479],mlym:[3430,3439],mong:[6160,6169],mymr:[4160,4169],orya:[2918,2927],tamldec:[3046,3055],telu:[3174,3183],thai:[3664,3673],tibt:[3872,3881]},sc=Yr.hanidec.replace(/[\[|\]]/g,"").split("");function oc(t){var e=parseInt(t,10);if(isNaN(e)){e="";for(var r=0;r<t.length;r++){var i=t.charCodeAt(r);if(t[r].search(Yr.hanidec)!==-1)e+=sc.indexOf(t[r]);else for(var n in Fs){var s=Fs[n],o=s[0],a=s[1];i>=o&&i<=a&&(e+=i-o)}}return parseInt(e,10)}else return e}function te(t,e){var r=t.numberingSystem;return e===void 0&&(e=""),new RegExp(""+Yr[r||"latn"]+e)}var ac="missing Intl.DateTimeFormat.formatToParts support";function O(t,e){return e===void 0&&(e=function(i){return i}),{regex:t,deser:function(i){var n=i[0];return e(oc(n))}}}var lc=String.fromCharCode(160),Hs="( |"+lc+")",Vs=new RegExp(Hs,"g");function uc(t){return t.replace(/\./g,"\\.?").replace(Vs,Hs)}function Bs(t){return t.replace(/\./g,"").replace(Vs," ").toLowerCase()}function re(t,e){return t===null?null:{regex:RegExp(t.map(uc).join("|")),deser:function(i){var n=i[0];return t.findIndex(function(s){return Bs(n)===Bs(s)})+e}}}function js(t,e){return{regex:t,deser:function(i){var n=i[1],s=i[2];return Yt(n,s)},groups:e}}function Us(t){return{regex:t,deser:function(r){var i=r[0];return i}}}function cc(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function hc(t,e){var r=te(e),i=te(e,"{2}"),n=te(e,"{3}"),s=te(e,"{4}"),o=te(e,"{6}"),a=te(e,"{1,2}"),l=te(e,"{1,3}"),u=te(e,"{1,6}"),c=te(e,"{1,9}"),h=te(e,"{2,4}"),d=te(e,"{4,6}"),m=function(f){return{regex:RegExp(cc(f.val)),deser:function(ie){var de=ie[0];return de},literal:!0}},p=function(f){if(t.literal)return m(f);switch(f.val){case"G":return re(e.eras("short",!1),0);case"GG":return re(e.eras("long",!1),0);case"y":return O(u);case"yy":return O(h,Br);case"yyyy":return O(s);case"yyyyy":return O(d);case"yyyyyy":return O(o);case"M":return O(a);case"MM":return O(i);case"MMM":return re(e.months("short",!0,!1),1);case"MMMM":return re(e.months("long",!0,!1),1);case"L":return O(a);case"LL":return O(i);case"LLL":return re(e.months("short",!1,!1),1);case"LLLL":return re(e.months("long",!1,!1),1);case"d":return O(a);case"dd":return O(i);case"o":return O(l);case"ooo":return O(n);case"HH":return O(i);case"H":return O(a);case"hh":return O(i);case"h":return O(a);case"mm":return O(i);case"m":return O(a);case"q":return O(a);case"qq":return O(i);case"s":return O(a);case"ss":return O(i);case"S":return O(l);case"SSS":return O(n);case"u":return Us(c);case"a":return re(e.meridiems(),0);case"kkkk":return O(s);case"kk":return O(h,Br);case"W":return O(a);case"WW":return O(i);case"E":case"c":return O(r);case"EEE":return re(e.weekdays("short",!1,!1),1);case"EEEE":return re(e.weekdays("long",!1,!1),1);case"ccc":return re(e.weekdays("short",!0,!1),1);case"cccc":return re(e.weekdays("long",!0,!1),1);case"Z":case"ZZ":return js(new RegExp("([+-]"+a.source+")(?::("+i.source+"))?"),2);case"ZZZ":return js(new RegExp("([+-]"+a.source+")("+i.source+")?"),2);case"z":return Us(/[a-z_+-/]{1,256}?/i);default:return m(f)}},y=p(t)||{invalidReason:ac};return y.token=t,y}var dc={year:{"2-digit":"yy",numeric:"yyyyy"},month:{numeric:"M","2-digit":"MM",short:"MMM",long:"MMMM"},day:{numeric:"d","2-digit":"dd"},weekday:{short:"EEE",long:"EEEE"},dayperiod:"a",dayPeriod:"a",hour:{numeric:"h","2-digit":"hh"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"}};function fc(t,e,r){var i=t.type,n=t.value;if(i==="literal")return{literal:!0,val:n};var s=r[i],o=dc[i];if(typeof o=="object"&&(o=o[s]),o)return{literal:!1,val:o}}function mc(t){var e=t.map(function(r){return r.regex}).reduce(function(r,i){return r+"("+i.source+")"},"");return["^"+e+"$",t]}function pc(t,e,r){var i=t.match(e);if(i){var n={},s=1;for(var o in r)if(Xe(r,o)){var a=r[o],l=a.groups?a.groups+1:1;!a.literal&&a.token&&(n[a.token.val[0]]=a.deser(i.slice(s,s+l))),s+=l}return[i,n]}else return[i,{}]}function gc(t){var e=function(s){switch(s){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":case"H":return"hour";case"d":return"day";case"o":return"ordinal";case"L":case"M":return"month";case"y":return"year";case"E":case"c":return"weekday";case"W":return"weekNumber";case"k":return"weekYear";case"q":return"quarter";default:return null}},r;A(t.Z)?A(t.z)?r=null:r=ae.create(t.z):r=new Z(t.Z),A(t.q)||(t.M=(t.q-1)*3+1),A(t.h)||(t.h<12&&t.a===1?t.h+=12:t.h===12&&t.a===0&&(t.h=0)),t.G===0&&t.y&&(t.y=-t.y),A(t.u)||(t.S=Fr(t.u));var i=Object.keys(t).reduce(function(n,s){var o=e(s);return o&&(n[o]=t[s]),n},{});return[i,r]}var Xr=null;function vc(){return Xr||(Xr=I.fromMillis(1555555555555)),Xr}function yc(t,e){if(t.literal)return t;var r=ve.macroTokenToFormatOpts(t.val);if(!r)return t;var i=ve.create(e,r),n=i.formatDateTimeParts(vc()),s=n.map(function(o){return fc(o,e,r)});return s.includes(void 0)?t:s}function bc(t,e){var r;return(r=Array.prototype).concat.apply(r,t.map(function(i){return yc(i,e)}))}function qs(t,e,r){var i=bc(ve.parseFormat(r),t),n=i.map(function(b){return hc(b,t)}),s=n.find(function(b){return b.invalidReason});if(s)return{input:e,tokens:i,invalidReason:s.invalidReason};var o=mc(n),a=o[0],l=o[1],u=RegExp(a,"i"),c=pc(e,u,l),h=c[0],d=c[1],m=d?gc(d):[null,null],p=m[0],y=m[1];if(Xe(d,"a")&&Xe(d,"H"))throw new pt("Can't include meridiem when specifying 24-hour format");return{input:e,tokens:i,regex:u,rawMatches:h,matches:d,result:p,zone:y}}function wc(t,e,r){var i=qs(t,e,r),n=i.result,s=i.zone,o=i.invalidReason;return[n,s,o]}var $s=[0,31,59,90,120,151,181,212,243,273,304,334],Ws=[0,31,60,91,121,152,182,213,244,274,305,335];function K(t,e){return new ee("unit out of range","you specified "+e+" (of type "+typeof e+") as a "+t+", which is invalid")}function zs(t,e,r){var i=new Date(Date.UTC(t,e-1,r)).getUTCDay();return i===0?7:i}function Zs(t,e,r){return r+(gt(t)?Ws:$s)[e-1]}function Js(t,e){var r=gt(t)?Ws:$s,i=r.findIndex(function(s){return s<e}),n=e-r[i];return{month:i+1,day:n}}function Qr(t){var e=t.year,r=t.month,i=t.day,n=Zs(e,r,i),s=zs(e,r,i),o=Math.floor((n-s+10)/7),a;return o<1?(a=e-1,o=Gt(a)):o>Gt(e)?(a=e+1,o=1):a=e,k({weekYear:a,weekNumber:o,weekday:s},er(t))}function Ks(t){var e=t.weekYear,r=t.weekNumber,i=t.weekday,n=zs(e,1,4),s=vt(e),o=r*7+i-n-3,a;o<1?(a=e-1,o+=vt(a)):o>s?(a=e+1,o-=vt(e)):a=e;var l=Js(a,o),u=l.month,c=l.day;return k({year:a,month:u,day:c},er(t))}function ei(t){var e=t.year,r=t.month,i=t.day,n=Zs(e,r,i);return k({year:e,ordinal:n},er(t))}function Gs(t){var e=t.year,r=t.ordinal,i=Js(e,r),n=i.month,s=i.day;return k({year:e,month:n,day:s},er(t))}function Sc(t){var e=Jt(t.weekYear),r=ge(t.weekNumber,1,Gt(t.weekYear)),i=ge(t.weekday,1,7);return e?r?i?!1:K("weekday",t.weekday):K("week",t.week):K("weekYear",t.weekYear)}function Ec(t){var e=Jt(t.year),r=ge(t.ordinal,1,vt(t.year));return e?r?!1:K("ordinal",t.ordinal):K("year",t.year)}function Ys(t){var e=Jt(t.year),r=ge(t.month,1,12),i=ge(t.day,1,Kt(t.year,t.month));return e?r?i?!1:K("day",t.day):K("month",t.month):K("year",t.year)}function Xs(t){var e=t.hour,r=t.minute,i=t.second,n=t.millisecond,s=ge(e,0,23)||e===24&&r===0&&i===0&&n===0,o=ge(r,0,59),a=ge(i,0,59),l=ge(n,0,999);return s?o?a?l?!1:K("millisecond",n):K("second",i):K("minute",r):K("hour",e)}var ti="Invalid DateTime",Qs=864e13;function nr(t){return new ee("unsupported zone",'the zone "'+t.name+'" is not supported')}function ri(t){return t.weekData===null&&(t.weekData=Qr(t.c)),t.weekData}function Et(t,e){var r={ts:t.ts,zone:t.zone,c:t.c,o:t.o,loc:t.loc,invalid:t.invalid};return new I(k({},r,e,{old:r}))}function eo(t,e,r){var i=t-e*60*1e3,n=r.offset(i);if(e===n)return[i,e];i-=(n-e)*60*1e3;var s=r.offset(i);return n===s?[i,n]:[t-Math.min(n,s)*60*1e3,Math.max(n,s)]}function to(t,e){t+=e*60*1e3;var r=new Date(t);return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate(),hour:r.getUTCHours(),minute:r.getUTCMinutes(),second:r.getUTCSeconds(),millisecond:r.getUTCMilliseconds()}}function sr(t,e,r){return eo(Vr(t),e,r)}function ro(t,e){var r=t.o,i=t.c.year+Math.trunc(e.years),n=t.c.month+Math.trunc(e.months)+Math.trunc(e.quarters)*3,s=k({},t.c,{year:i,month:n,day:Math.min(t.c.day,Kt(i,n))+Math.trunc(e.days)+Math.trunc(e.weeks)*7}),o=N.fromObject({years:e.years-Math.trunc(e.years),quarters:e.quarters-Math.trunc(e.quarters),months:e.months-Math.trunc(e.months),weeks:e.weeks-Math.trunc(e.weeks),days:e.days-Math.trunc(e.days),hours:e.hours,minutes:e.minutes,seconds:e.seconds,milliseconds:e.milliseconds}).as("milliseconds"),a=Vr(s),l=eo(a,r,t.zone),u=l[0],c=l[1];return o!==0&&(u+=o,c=t.zone.offset(u)),{ts:u,o:c}}function Tt(t,e,r,i,n){var s=r.setZone,o=r.zone;if(t&&Object.keys(t).length!==0){var a=e||o,l=I.fromObject(t,k({},r,{zone:a}));return s?l:l.setZone(o)}else return I.invalid(new ee("unparsable",'the input "'+n+`" can't be parsed as `+i))}function at(t,e,r){return r===void 0&&(r=!0),t.isValid?ve.create(M.create("en-US"),{allowZ:r,forceSimple:!0}).formatDateTimeFromString(t,e):null}function io(t,e){var r=e.suppressSeconds,i=r===void 0?!1:r,n=e.suppressMilliseconds,s=n===void 0?!1:n,o=e.includeOffset,a=e.includePrefix,l=a===void 0?!1:a,u=e.includeZone,c=u===void 0?!1:u,h=e.spaceZone,d=h===void 0?!1:h,m=e.format,p=m===void 0?"extended":m,y=p==="basic"?"HHmm":"HH:mm";(!i||t.second!==0||t.millisecond!==0)&&(y+=p==="basic"?"ss":":ss",(!s||t.millisecond!==0)&&(y+=".SSS")),(c||o)&&d&&(y+=" "),c?y+="z":o&&(y+=p==="basic"?"ZZZ":"ZZ");var b=at(t,y);return l&&(b="T"+b),b}var no={month:1,day:1,hour:0,minute:0,second:0,millisecond:0},Tc={weekNumber:1,weekday:1,hour:0,minute:0,second:0,millisecond:0},kc={ordinal:1,hour:0,minute:0,second:0,millisecond:0},so=["year","month","day","hour","minute","second","millisecond"],Ac=["weekYear","weekNumber","weekday","hour","minute","second","millisecond"],Oc=["year","ordinal","hour","minute","second","millisecond"];function oo(t){var e={year:"year",years:"year",month:"month",months:"month",day:"day",days:"day",hour:"hour",hours:"hour",minute:"minute",minutes:"minute",quarter:"quarter",quarters:"quarter",second:"second",seconds:"second",millisecond:"millisecond",milliseconds:"millisecond",weekday:"weekday",weekdays:"weekday",weeknumber:"weekNumber",weeksnumber:"weekNumber",weeknumbers:"weekNumber",weekyear:"weekYear",weekyears:"weekYear",ordinal:"ordinal"}[t.toLowerCase()];if(!e)throw new jn(t);return e}function ao(t,e){var r=Ie(e.zone,L.defaultZone),i=M.fromObject(e),n=L.now(),s,o;if(A(t.year))s=n;else{for(var a=Ce(so),l;!(l=a()).done;){var u=l.value;A(t[u])&&(t[u]=no[u])}var c=Ys(t)||Xs(t);if(c)return I.invalid(c);var h=r.offset(n),d=sr(t,h,r);s=d[0],o=d[1]}return new I({ts:s,zone:r,loc:i,o})}function lo(t,e,r){var i=A(r.round)?!0:r.round,n=function(h,d){h=Hr(h,i||r.calendary?0:2,!0);var m=e.loc.clone(r).relFormatter(r);return m.format(h,d)},s=function(h){return r.calendary?e.hasSame(t,h)?0:e.startOf(h).diff(t.startOf(h),h).get(h):e.diff(t,h).get(h)};if(r.unit)return n(s(r.unit),r.unit);for(var o=Ce(r.units),a;!(a=o()).done;){var l=a.value,u=s(l);if(Math.abs(u)>=1)return n(u,l)}return n(t>e?-0:0,r.units[r.units.length-1])}function uo(t){var e={},r;return t.length>0&&typeof t[t.length-1]=="object"?(e=t[t.length-1],r=Array.from(t).slice(0,t.length-1)):r=Array.from(t),[e,r]}var I=function(){function t(r){var i=r.zone||L.defaultZone,n=r.invalid||(Number.isNaN(r.ts)?new ee("invalid input"):null)||(i.isValid?null:nr(i));this.ts=A(r.ts)?L.now():r.ts;var s=null,o=null;if(!n){var a=r.old&&r.old.ts===this.ts&&r.old.zone.equals(i);if(a){var l=[r.old.c,r.old.o];s=l[0],o=l[1]}else{var u=i.offset(this.ts);s=to(this.ts,u),n=Number.isNaN(s.year)?new ee("invalid input"):null,s=n?null:s,o=n?null:u}}this._zone=i,this.loc=r.loc||M.create(),this.invalid=n,this.weekData=null,this.c=s,this.o=o,this.isLuxonDateTime=!0}t.now=function(){return new t({})},t.local=function(){var i=uo(arguments),n=i[0],s=i[1],o=s[0],a=s[1],l=s[2],u=s[3],c=s[4],h=s[5],d=s[6];return ao({year:o,month:a,day:l,hour:u,minute:c,second:h,millisecond:d},n)},t.utc=function(){var i=uo(arguments),n=i[0],s=i[1],o=s[0],a=s[1],l=s[2],u=s[3],c=s[4],h=s[5],d=s[6];return n.zone=Z.utcInstance,ao({year:o,month:a,day:l,hour:u,minute:c,second:h,millisecond:d},n)},t.fromJSDate=function(i,n){n===void 0&&(n={});var s=xl(i)?i.valueOf():NaN;if(Number.isNaN(s))return t.invalid("invalid input");var o=Ie(n.zone,L.defaultZone);return o.isValid?new t({ts:s,zone:o,loc:M.fromObject(n)}):t.invalid(nr(o))},t.fromMillis=function(i,n){if(n===void 0&&(n={}),_e(i))return i<-Qs||i>Qs?t.invalid("Timestamp out of range"):new t({ts:i,zone:Ie(n.zone,L.defaultZone),loc:M.fromObject(n)});throw new z("fromMillis requires a numerical input, but received a "+typeof i+" with value "+i)},t.fromSeconds=function(i,n){if(n===void 0&&(n={}),_e(i))return new t({ts:i*1e3,zone:Ie(n.zone,L.defaultZone),loc:M.fromObject(n)});throw new z("fromSeconds requires a numerical input")},t.fromObject=function(i,n){n===void 0&&(n={}),i=i||{};var s=Ie(n.zone,L.defaultZone);if(!s.isValid)return t.invalid(nr(s));var o=L.now(),a=s.offset(o),l=Xt(i,oo),u=!A(l.ordinal),c=!A(l.year),h=!A(l.month)||!A(l.day),d=c||h,m=l.weekYear||l.weekNumber,p=M.fromObject(n);if((d||u)&&m)throw new pt("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(h&&u)throw new pt("Can't mix ordinal dates with month/day");var y=m||l.weekday&&!d,b,f,S=to(o,a);y?(b=Ac,f=Tc,S=Qr(S)):u?(b=Oc,f=kc,S=ei(S)):(b=so,f=no);for(var ie=!1,de=Ce(b),qe;!(qe=de()).done;){var Re=qe.value,$e=l[Re];A($e)?ie?l[Re]=f[Re]:l[Re]=S[Re]:ie=!0}var br=y?Sc(l):u?Ec(l):Ys(l),P=br||Xs(l);if(P)return t.invalid(P);var We=y?Ks(l):u?Gs(l):l,ut=sr(We,a,s),ct=ut[0],wr=ut[1],De=new t({ts:ct,zone:s,o:wr,loc:p});return l.weekday&&d&&i.weekday!==De.weekday?t.invalid("mismatched weekday","you can't specify both a weekday of "+l.weekday+" and a date of "+De.toISO()):De},t.fromISO=function(i,n){n===void 0&&(n={});var s=Vu(i),o=s[0],a=s[1];return Tt(o,a,n,"ISO 8601",i)},t.fromRFC2822=function(i,n){n===void 0&&(n={});var s=Bu(i),o=s[0],a=s[1];return Tt(o,a,n,"RFC 2822",i)},t.fromHTTP=function(i,n){n===void 0&&(n={});var s=ju(i),o=s[0],a=s[1];return Tt(o,a,n,"HTTP",n)},t.fromFormat=function(i,n,s){if(s===void 0&&(s={}),A(i)||A(n))throw new z("fromFormat requires an input string and a format");var o=s,a=o.locale,l=a===void 0?null:a,u=o.numberingSystem,c=u===void 0?null:u,h=M.fromOpts({locale:l,numberingSystem:c,defaultToEN:!0}),d=wc(h,i,n),m=d[0],p=d[1],y=d[2];return y?t.invalid(y):Tt(m,p,s,"format "+n,i)},t.fromString=function(i,n,s){return s===void 0&&(s={}),t.fromFormat(i,n,s)},t.fromSQL=function(i,n){n===void 0&&(n={});var s=Ku(i),o=s[0],a=s[1];return Tt(o,a,n,"SQL",i)},t.invalid=function(i,n){if(n===void 0&&(n=null),!i)throw new z("need to specify a reason the DateTime is invalid");var s=i instanceof ee?i:new ee(i,n);if(L.throwOnInvalid)throw new Ll(s);return new t({invalid:s})},t.isDateTime=function(i){return i&&i.isLuxonDateTime||!1};var e=t.prototype;return e.get=function(i){return this[i]},e.resolvedLocaleOptions=function(i){i===void 0&&(i={});var n=ve.create(this.loc.clone(i),i).resolvedOptions(this),s=n.locale,o=n.numberingSystem,a=n.calendar;return{locale:s,numberingSystem:o,outputCalendar:a}},e.toUTC=function(i,n){return i===void 0&&(i=0),n===void 0&&(n={}),this.setZone(Z.instance(i),n)},e.toLocal=function(){return this.setZone(L.defaultZone)},e.setZone=function(i,n){var s=n===void 0?{}:n,o=s.keepLocalTime,a=o===void 0?!1:o,l=s.keepCalendarTime,u=l===void 0?!1:l;if(i=Ie(i,L.defaultZone),i.equals(this.zone))return this;if(i.isValid){var c=this.ts;if(a||u){var h=i.offset(this.ts),d=this.toObject(),m=sr(d,h,i);c=m[0]}return Et(this,{ts:c,zone:i})}else return t.invalid(nr(i))},e.reconfigure=function(i){var n=i===void 0?{}:i,s=n.locale,o=n.numberingSystem,a=n.outputCalendar,l=this.loc.clone({locale:s,numberingSystem:o,outputCalendar:a});return Et(this,{loc:l})},e.setLocale=function(i){return this.reconfigure({locale:i})},e.set=function(i){if(!this.isValid)return this;var n=Xt(i,oo),s=!A(n.weekYear)||!A(n.weekNumber)||!A(n.weekday),o=!A(n.ordinal),a=!A(n.year),l=!A(n.month)||!A(n.day),u=a||l,c=n.weekYear||n.weekNumber;if((u||o)&&c)throw new pt("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(l&&o)throw new pt("Can't mix ordinal dates with month/day");var h;s?h=Ks(k({},Qr(this.c),n)):A(n.ordinal)?(h=k({},this.toObject(),n),A(n.day)&&(h.day=Math.min(Kt(h.year,h.month),h.day))):h=Gs(k({},ei(this.c),n));var d=sr(h,this.o,this.zone),m=d[0],p=d[1];return Et(this,{ts:m,o:p})},e.plus=function(i){if(!this.isValid)return this;var n=Be(i);return Et(this,ro(this,n))},e.minus=function(i){if(!this.isValid)return this;var n=Be(i).negate();return Et(this,ro(this,n))},e.startOf=function(i){if(!this.isValid)return this;var n={},s=N.normalizeUnit(i);switch(s){case"years":n.month=1;case"quarters":case"months":n.day=1;case"weeks":case"days":n.hour=0;case"hours":n.minute=0;case"minutes":n.second=0;case"seconds":n.millisecond=0;break}if(s==="weeks"&&(n.weekday=1),s==="quarters"){var o=Math.ceil(this.month/3);n.month=(o-1)*3+1}return this.set(n)},e.endOf=function(i){var n;return this.isValid?this.plus((n={},n[i]=1,n)).startOf(i).minus(1):this},e.toFormat=function(i,n){return n===void 0&&(n={}),this.isValid?ve.create(this.loc.redefaultToEN(n)).formatDateTimeFromString(this,i):ti},e.toLocaleString=function(i,n){return i===void 0&&(i=_r),n===void 0&&(n={}),this.isValid?ve.create(this.loc.clone(n),i).formatDateTime(this):ti},e.toLocaleParts=function(i){return i===void 0&&(i={}),this.isValid?ve.create(this.loc.clone(i),i).formatDateTimeParts(this):[]},e.toISO=function(i){return i===void 0&&(i={}),this.isValid?this.toISODate(i)+"T"+this.toISOTime(i):null},e.toISODate=function(i){var n=i===void 0?{}:i,s=n.format,o=s===void 0?"extended":s,a=o==="basic"?"yyyyMMdd":"yyyy-MM-dd";return this.year>9999&&(a="+"+a),at(this,a)},e.toISOWeekDate=function(){return at(this,"kkkk-'W'WW-c")},e.toISOTime=function(i){var n=i===void 0?{}:i,s=n.suppressMilliseconds,o=s===void 0?!1:s,a=n.suppressSeconds,l=a===void 0?!1:a,u=n.includeOffset,c=u===void 0?!0:u,h=n.includePrefix,d=h===void 0?!1:h,m=n.format,p=m===void 0?"extended":m;return io(this,{suppressSeconds:l,suppressMilliseconds:o,includeOffset:c,includePrefix:d,format:p})},e.toRFC2822=function(){return at(this,"EEE, dd LLL yyyy HH:mm:ss ZZZ",!1)},e.toHTTP=function(){return at(this.toUTC(),"EEE, dd LLL yyyy HH:mm:ss 'GMT'")},e.toSQLDate=function(){return at(this,"yyyy-MM-dd")},e.toSQLTime=function(i){var n=i===void 0?{}:i,s=n.includeOffset,o=s===void 0?!0:s,a=n.includeZone,l=a===void 0?!1:a;return io(this,{includeOffset:o,includeZone:l,spaceZone:!0})},e.toSQL=function(i){return i===void 0&&(i={}),this.isValid?this.toSQLDate()+" "+this.toSQLTime(i):null},e.toString=function(){return this.isValid?this.toISO():ti},e.valueOf=function(){return this.toMillis()},e.toMillis=function(){return this.isValid?this.ts:NaN},e.toSeconds=function(){return this.isValid?this.ts/1e3:NaN},e.toJSON=function(){return this.toISO()},e.toBSON=function(){return this.toJSDate()},e.toObject=function(i){if(i===void 0&&(i={}),!this.isValid)return{};var n=k({},this.c);return i.includeConfig&&(n.outputCalendar=this.outputCalendar,n.numberingSystem=this.loc.numberingSystem,n.locale=this.loc.locale),n},e.toJSDate=function(){return new Date(this.isValid?this.ts:NaN)},e.diff=function(i,n,s){if(n===void 0&&(n="milliseconds"),s===void 0&&(s={}),!this.isValid||!i.isValid)return N.invalid("created by diffing an invalid DateTime");var o=k({locale:this.locale,numberingSystem:this.numberingSystem},s),a=Nl(n).map(N.normalizeUnit),l=i.valueOf()>this.valueOf(),u=l?this:i,c=l?i:this,h=nc(u,c,a,o);return l?h.negate():h},e.diffNow=function(i,n){return i===void 0&&(i="milliseconds"),n===void 0&&(n={}),this.diff(t.now(),i,n)},e.until=function(i){return this.isValid?wt.fromDateTimes(this,i):this},e.hasSame=function(i,n){if(!this.isValid)return!1;var s=i.valueOf(),o=this.setZone(i.zone,{keepLocalTime:!0});return o.startOf(n)<=s&&s<=o.endOf(n)},e.equals=function(i){return this.isValid&&i.isValid&&this.valueOf()===i.valueOf()&&this.zone.equals(i.zone)&&this.loc.equals(i.loc)},e.toRelative=function(i){if(i===void 0&&(i={}),!this.isValid)return null;var n=i.base||t.fromObject({},{zone:this.zone}),s=i.padding?this<n?-i.padding:i.padding:0,o=["years","months","days","hours","minutes","seconds"],a=i.unit;return Array.isArray(i.unit)&&(o=i.unit,a=void 0),lo(n,this.plus(s),k({},i,{numeric:"always",units:o,unit:a}))},e.toRelativeCalendar=function(i){return i===void 0&&(i={}),this.isValid?lo(i.base||t.fromObject({},{zone:this.zone}),this,k({},i,{numeric:"auto",units:["years","months","days"],calendary:!0})):null},t.min=function(){for(var i=arguments.length,n=new Array(i),s=0;s<i;s++)n[s]=arguments[s];if(!n.every(t.isDateTime))throw new z("min requires all arguments be DateTimes");return ls(n,function(o){return o.valueOf()},Math.min)},t.max=function(){for(var i=arguments.length,n=new Array(i),s=0;s<i;s++)n[s]=arguments[s];if(!n.every(t.isDateTime))throw new z("max requires all arguments be DateTimes");return ls(n,function(o){return o.valueOf()},Math.max)},t.fromFormatExplain=function(i,n,s){s===void 0&&(s={});var o=s,a=o.locale,l=a===void 0?null:a,u=o.numberingSystem,c=u===void 0?null:u,h=M.fromOpts({locale:l,numberingSystem:c,defaultToEN:!0});return qs(h,i,n)},t.fromStringExplain=function(i,n,s){return s===void 0&&(s={}),t.fromFormatExplain(i,n,s)},oe(t,[{key:"isValid",get:function(){return this.invalid===null}},{key:"invalidReason",get:function(){return this.invalid?this.invalid.reason:null}},{key:"invalidExplanation",get:function(){return this.invalid?this.invalid.explanation:null}},{key:"locale",get:function(){return this.isValid?this.loc.locale:null}},{key:"numberingSystem",get:function(){return this.isValid?this.loc.numberingSystem:null}},{key:"outputCalendar",get:function(){return this.isValid?this.loc.outputCalendar:null}},{key:"zone",get:function(){return this._zone}},{key:"zoneName",get:function(){return this.isValid?this.zone.name:null}},{key:"year",get:function(){return this.isValid?this.c.year:NaN}},{key:"quarter",get:function(){return this.isValid?Math.ceil(this.c.month/3):NaN}},{key:"month",get:function(){return this.isValid?this.c.month:NaN}},{key:"day",get:function(){return this.isValid?this.c.day:NaN}},{key:"hour",get:function(){return this.isValid?this.c.hour:NaN}},{key:"minute",get:function(){return this.isValid?this.c.minute:NaN}},{key:"second",get:function(){return this.isValid?this.c.second:NaN}},{key:"millisecond",get:function(){return this.isValid?this.c.millisecond:NaN}},{key:"weekYear",get:function(){return this.isValid?ri(this).weekYear:NaN}},{key:"weekNumber",get:function(){return this.isValid?ri(this).weekNumber:NaN}},{key:"weekday",get:function(){return this.isValid?ri(this).weekday:NaN}},{key:"ordinal",get:function(){return this.isValid?ei(this.c).ordinal:NaN}},{key:"monthShort",get:function(){return this.isValid?St.months("short",{locObj:this.loc})[this.month-1]:null}},{key:"monthLong",get:function(){return this.isValid?St.months("long",{locObj:this.loc})[this.month-1]:null}},{key:"weekdayShort",get:function(){return this.isValid?St.weekdays("short",{locObj:this.loc})[this.weekday-1]:null}},{key:"weekdayLong",get:function(){return this.isValid?St.weekdays("long",{locObj:this.loc})[this.weekday-1]:null}},{key:"offset",get:function(){return this.isValid?+this.o:NaN}},{key:"offsetNameShort",get:function(){return this.isValid?this.zone.offsetName(this.ts,{format:"short",locale:this.locale}):null}},{key:"offsetNameLong",get:function(){return this.isValid?this.zone.offsetName(this.ts,{format:"long",locale:this.locale}):null}},{key:"isOffsetFixed",get:function(){return this.isValid?this.zone.isUniversal:null}},{key:"isInDST",get:function(){return this.isOffsetFixed?!1:this.offset>this.set({month:1}).offset||this.offset>this.set({month:5}).offset}},{key:"isInLeapYear",get:function(){return gt(this.year)}},{key:"daysInMonth",get:function(){return Kt(this.year,this.month)}},{key:"daysInYear",get:function(){return this.isValid?vt(this.year):NaN}},{key:"weeksInWeekYear",get:function(){return this.isValid?Gt(this.weekYear):NaN}}],[{key:"DATE_SHORT",get:function(){return _r}},{key:"DATE_MED",get:function(){return Un}},{key:"DATE_MED_WITH_WEEKDAY",get:function(){return Ml}},{key:"DATE_FULL",get:function(){return qn}},{key:"DATE_HUGE",get:function(){return $n}},{key:"TIME_SIMPLE",get:function(){return Wn}},{key:"TIME_WITH_SECONDS",get:function(){return zn}},{key:"TIME_WITH_SHORT_OFFSET",get:function(){return Zn}},{key:"TIME_WITH_LONG_OFFSET",get:function(){return Jn}},{key:"TIME_24_SIMPLE",get:function(){return Kn}},{key:"TIME_24_WITH_SECONDS",get:function(){return Gn}},{key:"TIME_24_WITH_SHORT_OFFSET",get:function(){return Yn}},{key:"TIME_24_WITH_LONG_OFFSET",get:function(){return Xn}},{key:"DATETIME_SHORT",get:function(){return Qn}},{key:"DATETIME_SHORT_WITH_SECONDS",get:function(){return es}},{key:"DATETIME_MED",get:function(){return ts}},{key:"DATETIME_MED_WITH_SECONDS",get:function(){return rs}},{key:"DATETIME_MED_WITH_WEEKDAY",get:function(){return Rl}},{key:"DATETIME_FULL",get:function(){return is}},{key:"DATETIME_FULL_WITH_SECONDS",get:function(){return ns}},{key:"DATETIME_HUGE",get:function(){return ss}},{key:"DATETIME_HUGE_WITH_SECONDS",get:function(){return os}}]),t}();function kt(t){if(I.isDateTime(t))return t;if(t&&t.valueOf&&_e(t.valueOf()))return I.fromJSDate(t);if(t&&typeof t=="object")return I.fromObject(t);throw new z("Unknown datetime argument: "+t+", of type "+typeof t)}var Cc="2.0.2";U.DateTime=I;U.Duration=N;U.FixedOffsetZone=Z;U.IANAZone=ae;U.Info=St;U.Interval=wt;U.InvalidZone=qr;U.Settings=L;U.SystemZone=ws;U.VERSION=Cc;U.Zone=et});(function(){if(window.Reflect===void 0||window.customElements===void 0||window.customElements.polyfillWrapFlushCallback)return;let t=HTMLElement,e={HTMLElement:function(){return Reflect.construct(t,[],this.constructor)}};window.HTMLElement=e.HTMLElement,HTMLElement.prototype=t.prototype,HTMLElement.prototype.constructor=HTMLElement,Object.setPrototypeOf(HTMLElement,t)})();var Oi=new WeakMap;function ta(t){let e=t instanceof Element?t:t instanceof Node?t.parentElement:null,r=e?e.closest("input, button"):null;return(r==null?void 0:r.type)=="submit"?r:null}function ra(t){let e=ta(t.target);e&&e.form&&Oi.set(e.form,e)}(function(){"SubmitEvent"in window||(addEventListener("click",ra,!0),Object.defineProperty(Event.prototype,"submitter",{get(){if(this.type=="submit"&&this.target instanceof HTMLFormElement)return Oi.get(this.target)}}))})();var Te;(function(t){t.eager="eager",t.lazy="lazy"})(Te||(Te={}));var fe=class extends HTMLElement{constructor(){super();this.loaded=Promise.resolve(),this.delegate=new fe.delegateConstructor(this)}static get observedAttributes(){return["disabled","loading","src"]}connectedCallback(){this.delegate.connect()}disconnectedCallback(){this.delegate.disconnect()}reload(){let{src:e}=this;this.src=null,this.src=e}attributeChangedCallback(e){e=="loading"?this.delegate.loadingStyleChanged():e=="src"?this.delegate.sourceURLChanged():this.delegate.disabledChanged()}get src(){return this.getAttribute("src")}set src(e){e?this.setAttribute("src",e):this.removeAttribute("src")}get loading(){return ia(this.getAttribute("loading")||"")}set loading(e){e?this.setAttribute("loading",e):this.removeAttribute("loading")}get disabled(){return this.hasAttribute("disabled")}set disabled(e){e?this.setAttribute("disabled",""):this.removeAttribute("disabled")}get autoscroll(){return this.hasAttribute("autoscroll")}set autoscroll(e){e?this.setAttribute("autoscroll",""):this.removeAttribute("autoscroll")}get complete(){return!this.delegate.isLoading}get isActive(){return this.ownerDocument===document&&!this.isPreview}get isPreview(){var e,r;return(r=(e=this.ownerDocument)===null||e===void 0?void 0:e.documentElement)===null||r===void 0?void 0:r.hasAttribute("data-turbo-preview")}};function ia(t){switch(t.toLowerCase()){case"lazy":return Te.lazy;default:return Te.eager}}function ne(t){return new URL(t.toString(),document.baseURI)}function xe(t){let e;if(t.hash)return t.hash.slice(1);if(e=t.href.match(/#(.*)$/))return e[1]}function na(t){return(ua(t).match(/\.[^.]*$/)||[])[0]||""}function sa(t){return!!na(t).match(/^(?:|\.(?:htm|html|xhtml))$/)}function oa(t,e){let r=ca(e);return t.href===ne(r).href||t.href.startsWith(r)}function Er(t){let e=xe(t);return e!=null?t.href.slice(0,-(e.length+1)):t.href}function Vt(t){return Er(t)}function aa(t,e){return ne(t).href==ne(e).href}function la(t){return t.pathname.split("/").slice(1)}function ua(t){return la(t).slice(-1)[0]}function ca(t){return ha(t.origin+t.pathname)}function ha(t){return t.endsWith("/")?t:t+"/"}var Tr=class{constructor(e){this.response=e}get succeeded(){return this.response.ok}get failed(){return!this.succeeded}get clientError(){return this.statusCode>=400&&this.statusCode<=499}get serverError(){return this.statusCode>=500&&this.statusCode<=599}get redirected(){return this.response.redirected}get location(){return ne(this.response.url)}get isHTML(){return this.contentType&&this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/)}get statusCode(){return this.response.status}get contentType(){return this.header("Content-Type")}get responseText(){return this.response.text()}get responseHTML(){return this.isHTML?this.response.text():Promise.resolve(void 0)}header(e){return this.response.headers.get(e)}};function _(t,{target:e,cancelable:r,detail:i}={}){let n=new CustomEvent(t,{cancelable:r,bubbles:!0,detail:i});return(e||document.documentElement).dispatchEvent(n),n}function Bt(){return new Promise(t=>requestAnimationFrame(()=>t()))}function da(){return new Promise(t=>setTimeout(()=>t(),0))}function fa(){return Promise.resolve()}function Ci(t=""){return new DOMParser().parseFromString(t,"text/html")}function Li(t,...e){let r=ma(t,e).replace(/^\n/,"").split(`
`),i=r[0].match(/^\s+/),n=i?i[0].length:0;return r.map(s=>s.slice(n)).join(`
`)}function ma(t,e){return t.reduce((r,i,n)=>{let s=e[n]==null?"":e[n];return r+i+s},"")}function ht(){return Array.apply(null,{length:36}).map((t,e)=>e==8||e==13||e==18||e==23?"-":e==14?"4":e==19?(Math.floor(Math.random()*4)+8).toString(16):Math.floor(Math.random()*15).toString(16)).join("")}var F;(function(t){t[t.get=0]="get",t[t.post=1]="post",t[t.put=2]="put",t[t.patch=3]="patch",t[t.delete=4]="delete"})(F||(F={}));function pa(t){switch(t.toLowerCase()){case"get":return F.get;case"post":return F.post;case"put":return F.put;case"patch":return F.patch;case"delete":return F.delete}}var jt=class{constructor(e,r,i,n=new URLSearchParams){this.abortController=new AbortController,this.resolveRequestPromise=s=>{},this.delegate=e,this.method=r,this.headers=this.defaultHeaders,this.isIdempotent?this.url=ga(i,[...n.entries()]):(this.body=n,this.url=i)}get location(){return this.url}get params(){return this.url.searchParams}get entries(){return this.body?Array.from(this.body.entries()):[]}cancel(){this.abortController.abort()}async perform(){var e,r;let{fetchOptions:i}=this;(r=(e=this.delegate).prepareHeadersForRequest)===null||r===void 0||r.call(e,this.headers,this),await this.allowRequestToBeIntercepted(i);try{this.delegate.requestStarted(this);let n=await fetch(this.url.href,i);return await this.receive(n)}catch(n){if(n.name!=="AbortError")throw this.delegate.requestErrored(this,n),n}finally{this.delegate.requestFinished(this)}}async receive(e){let r=new Tr(e);return _("turbo:before-fetch-response",{cancelable:!0,detail:{fetchResponse:r}}).defaultPrevented?this.delegate.requestPreventedHandlingResponse(this,r):r.succeeded?this.delegate.requestSucceededWithResponse(this,r):this.delegate.requestFailedWithResponse(this,r),r}get fetchOptions(){var e;return{method:F[this.method].toUpperCase(),credentials:"same-origin",headers:this.headers,redirect:"follow",body:this.body,signal:this.abortSignal,referrer:(e=this.delegate.referrer)===null||e===void 0?void 0:e.href}}get defaultHeaders(){return{Accept:"text/html, application/xhtml+xml"}}get isIdempotent(){return this.method==F.get}get abortSignal(){return this.abortController.signal}async allowRequestToBeIntercepted(e){let r=new Promise(n=>this.resolveRequestPromise=n);_("turbo:before-fetch-request",{cancelable:!0,detail:{fetchOptions:e,url:this.url.href,resume:this.resolveRequestPromise}}).defaultPrevented&&await r}};function ga(t,e){let r=new URLSearchParams(t.search);for(let[i,n]of e)n instanceof File||(r.has(i)?(r.delete(i),t.searchParams.set(i,n)):t.searchParams.append(i,n));return t}var Ii=class{constructor(e,r){this.started=!1,this.intersect=i=>{let n=i.slice(-1)[0];(n==null?void 0:n.isIntersecting)&&this.delegate.elementAppearedInViewport(this.element)},this.delegate=e,this.element=r,this.intersectionObserver=new IntersectionObserver(this.intersect)}start(){this.started||(this.started=!0,this.intersectionObserver.observe(this.element))}stop(){this.started&&(this.started=!1,this.intersectionObserver.unobserve(this.element))}},Ze=class{constructor(e){this.templateElement=document.createElement("template"),this.templateElement.innerHTML=e}static wrap(e){return typeof e=="string"?new this(e):e}get fragment(){let e=document.createDocumentFragment();for(let r of this.foreignElements)e.appendChild(document.importNode(r,!0));return e}get foreignElements(){return this.templateChildren.reduce((e,r)=>r.tagName.toLowerCase()=="turbo-stream"?[...e,r]:e,[])}get templateChildren(){return Array.from(this.templateElement.content.children)}};Ze.contentType="text/vnd.turbo-stream.html";var ke;(function(t){t[t.initialized=0]="initialized",t[t.requesting=1]="requesting",t[t.waiting=2]="waiting",t[t.receiving=3]="receiving",t[t.stopping=4]="stopping",t[t.stopped=5]="stopped"})(ke||(ke={}));var Ae;(function(t){t.urlEncoded="application/x-www-form-urlencoded",t.multipart="multipart/form-data",t.plain="text/plain"})(Ae||(Ae={}));function va(t){switch(t.toLowerCase()){case Ae.multipart:return Ae.multipart;case Ae.plain:return Ae.plain;default:return Ae.urlEncoded}}var kr=class{constructor(e,r,i,n=!1){this.state=ke.initialized,this.delegate=e,this.formElement=r,this.submitter=i,this.formData=ya(r,i),this.fetchRequest=new jt(this,this.method,this.location,this.body),this.mustRedirect=n}get method(){var e;let r=((e=this.submitter)===null||e===void 0?void 0:e.getAttribute("formmethod"))||this.formElement.getAttribute("method")||"";return pa(r.toLowerCase())||F.get}get action(){var e;let r=typeof this.formElement.action=="string"?this.formElement.action:null;return((e=this.submitter)===null||e===void 0?void 0:e.getAttribute("formaction"))||this.formElement.getAttribute("action")||r||""}get location(){return ne(this.action)}get body(){return this.enctype==Ae.urlEncoded||this.method==F.get?new URLSearchParams(this.stringFormData):this.formData}get enctype(){var e;return va(((e=this.submitter)===null||e===void 0?void 0:e.getAttribute("formenctype"))||this.formElement.enctype)}get isIdempotent(){return this.fetchRequest.isIdempotent}get stringFormData(){return[...this.formData].reduce((e,[r,i])=>e.concat(typeof i=="string"?[[r,i]]:[]),[])}async start(){let{initialized:e,requesting:r}=ke;if(this.state==e)return this.state=r,this.fetchRequest.perform()}stop(){let{stopping:e,stopped:r}=ke;if(this.state!=e&&this.state!=r)return this.state=e,this.fetchRequest.cancel(),!0}prepareHeadersForRequest(e,r){if(!r.isIdempotent){let i=ba(Pi("csrf-param"))||Pi("csrf-token");i&&(e["X-CSRF-Token"]=i),e.Accept=[Ze.contentType,e.Accept].join(", ")}}requestStarted(e){this.state=ke.waiting,_("turbo:submit-start",{target:this.formElement,detail:{formSubmission:this}}),this.delegate.formSubmissionStarted(this)}requestPreventedHandlingResponse(e,r){this.result={success:r.succeeded,fetchResponse:r}}requestSucceededWithResponse(e,r){if(r.clientError||r.serverError)this.delegate.formSubmissionFailedWithResponse(this,r);else if(this.requestMustRedirect(e)&&wa(r)){let i=new Error("Form responses must redirect to another location");this.delegate.formSubmissionErrored(this,i)}else this.state=ke.receiving,this.result={success:!0,fetchResponse:r},this.delegate.formSubmissionSucceededWithResponse(this,r)}requestFailedWithResponse(e,r){this.result={success:!1,fetchResponse:r},this.delegate.formSubmissionFailedWithResponse(this,r)}requestErrored(e,r){this.result={success:!1,error:r},this.delegate.formSubmissionErrored(this,r)}requestFinished(e){this.state=ke.stopped,_("turbo:submit-end",{target:this.formElement,detail:Object.assign({formSubmission:this},this.result)}),this.delegate.formSubmissionFinished(this)}requestMustRedirect(e){return!e.isIdempotent&&this.mustRedirect}};function ya(t,e){let r=new FormData(t),i=e==null?void 0:e.getAttribute("name"),n=e==null?void 0:e.getAttribute("value");return i&&n!=null&&r.get(i)!=n&&r.append(i,n),r}function ba(t){if(t!=null){let r=(document.cookie?document.cookie.split("; "):[]).find(i=>i.startsWith(t));if(r){let i=r.split("=").slice(1).join("=");return i?decodeURIComponent(i):void 0}}}function Pi(t){let e=document.querySelector(`meta[name="${t}"]`);return e&&e.content}function wa(t){return t.statusCode==200&&!t.redirected}var dt=class{constructor(e){this.element=e}get children(){return[...this.element.children]}hasAnchor(e){return this.getElementForAnchor(e)!=null}getElementForAnchor(e){return e?this.element.querySelector(`[id='${e}'], a[name='${e}']`):null}get isConnected(){return this.element.isConnected}get firstAutofocusableElement(){return this.element.querySelector("[autofocus]")}get permanentElements(){return[...this.element.querySelectorAll("[id][data-turbo-permanent]")]}getPermanentElementById(e){return this.element.querySelector(`#${e}[data-turbo-permanent]`)}getPermanentElementMapForSnapshot(e){let r={};for(let i of this.permanentElements){let{id:n}=i,s=e.getPermanentElementById(n);s&&(r[n]=[i,s])}return r}},Ar=class{constructor(e,r){this.submitBubbled=i=>{if(i.target instanceof HTMLFormElement){let n=i.target,s=i.submitter||void 0;this.delegate.shouldInterceptFormSubmission(n,s)&&(i.preventDefault(),i.stopImmediatePropagation(),this.delegate.formSubmissionIntercepted(n,s))}},this.delegate=e,this.element=r}start(){this.element.addEventListener("submit",this.submitBubbled)}stop(){this.element.removeEventListener("submit",this.submitBubbled)}},Or=class{constructor(e,r){this.resolveRenderPromise=i=>{},this.resolveInterceptionPromise=i=>{},this.delegate=e,this.element=r}scrollToAnchor(e){let r=this.snapshot.getElementForAnchor(e);r?(this.scrollToElement(r),this.focusElement(r)):this.scrollToPosition({x:0,y:0})}scrollToAnchorFromLocation(e){this.scrollToAnchor(xe(e))}scrollToElement(e){e.scrollIntoView()}focusElement(e){e instanceof HTMLElement&&(e.hasAttribute("tabindex")?e.focus():(e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")))}scrollToPosition({x:e,y:r}){this.scrollRoot.scrollTo(e,r)}scrollToTop(){this.scrollToPosition({x:0,y:0})}get scrollRoot(){return window}async render(e){let{isPreview:r,shouldRender:i,newSnapshot:n}=e;if(i)try{this.renderPromise=new Promise(a=>this.resolveRenderPromise=a),this.renderer=e,this.prepareToRenderSnapshot(e);let s=new Promise(a=>this.resolveInterceptionPromise=a);this.delegate.allowsImmediateRender(n,this.resolveInterceptionPromise)||await s,await this.renderSnapshot(e),this.delegate.viewRenderedSnapshot(n,r),this.finishRenderingSnapshot(e)}finally{delete this.renderer,this.resolveRenderPromise(void 0),delete this.renderPromise}else this.invalidate()}invalidate(){this.delegate.viewInvalidated()}prepareToRenderSnapshot(e){this.markAsPreview(e.isPreview),e.prepareToRender()}markAsPreview(e){e?this.element.setAttribute("data-turbo-preview",""):this.element.removeAttribute("data-turbo-preview")}async renderSnapshot(e){await e.render()}finishRenderingSnapshot(e){e.finishRendering()}},Mi=class extends Or{invalidate(){this.element.innerHTML=""}get snapshot(){return new dt(this.element)}},Cr=class{constructor(e,r){this.clickBubbled=i=>{this.respondsToEventTarget(i.target)?this.clickEvent=i:delete this.clickEvent},this.linkClicked=i=>{this.clickEvent&&this.respondsToEventTarget(i.target)&&i.target instanceof Element&&this.delegate.shouldInterceptLinkClick(i.target,i.detail.url)&&(this.clickEvent.preventDefault(),i.preventDefault(),this.delegate.linkClickIntercepted(i.target,i.detail.url)),delete this.clickEvent},this.willVisit=()=>{delete this.clickEvent},this.delegate=e,this.element=r}start(){this.element.addEventListener("click",this.clickBubbled),document.addEventListener("turbo:click",this.linkClicked),document.addEventListener("turbo:before-visit",this.willVisit)}stop(){this.element.removeEventListener("click",this.clickBubbled),document.removeEventListener("turbo:click",this.linkClicked),document.removeEventListener("turbo:before-visit",this.willVisit)}respondsToEventTarget(e){let r=e instanceof Element?e:e instanceof Node?e.parentElement:null;return r&&r.closest("turbo-frame, html")==this.element}},Ri=class{constructor(e){this.permanentElementMap=e}static preservingPermanentElements(e,r){let i=new this(e);i.enter(),r(),i.leave()}enter(){for(let e in this.permanentElementMap){let[,r]=this.permanentElementMap[e];this.replaceNewPermanentElementWithPlaceholder(r)}}leave(){for(let e in this.permanentElementMap){let[r]=this.permanentElementMap[e];this.replaceCurrentPermanentElementWithClone(r),this.replacePlaceholderWithPermanentElement(r)}}replaceNewPermanentElementWithPlaceholder(e){let r=Sa(e);e.replaceWith(r)}replaceCurrentPermanentElementWithClone(e){let r=e.cloneNode(!0);e.replaceWith(r)}replacePlaceholderWithPermanentElement(e){let r=this.getPlaceholderById(e.id);r==null||r.replaceWith(e)}getPlaceholderById(e){return this.placeholders.find(r=>r.content==e)}get placeholders(){return[...document.querySelectorAll("meta[name=turbo-permanent-placeholder][content]")]}};function Sa(t){let e=document.createElement("meta");return e.setAttribute("name","turbo-permanent-placeholder"),e.setAttribute("content",t.id),e}var Ut=class{constructor(e,r,i){this.currentSnapshot=e,this.newSnapshot=r,this.isPreview=i,this.promise=new Promise((n,s)=>this.resolvingFunctions={resolve:n,reject:s})}get shouldRender(){return!0}prepareToRender(){}finishRendering(){this.resolvingFunctions&&(this.resolvingFunctions.resolve(),delete this.resolvingFunctions)}createScriptElement(e){if(e.getAttribute("data-turbo-eval")=="false")return e;{let r=document.createElement("script");return this.cspNonce&&(r.nonce=this.cspNonce),r.textContent=e.textContent,r.async=!1,Ea(r,e),r}}preservingPermanentElements(e){Ri.preservingPermanentElements(this.permanentElementMap,e)}focusFirstAutofocusableElement(){let e=this.connectedSnapshot.firstAutofocusableElement;Ta(e)&&e.focus()}get connectedSnapshot(){return this.newSnapshot.isConnected?this.newSnapshot:this.currentSnapshot}get currentElement(){return this.currentSnapshot.element}get newElement(){return this.newSnapshot.element}get permanentElementMap(){return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)}get cspNonce(){var e;return(e=document.head.querySelector('meta[name="csp-nonce"]'))===null||e===void 0?void 0:e.getAttribute("content")}};function Ea(t,e){for(let{name:r,value:i}of[...e.attributes])t.setAttribute(r,i)}function Ta(t){return t&&typeof t.focus=="function"}var Di=class extends Ut{get shouldRender(){return!0}async render(){await Bt(),this.preservingPermanentElements(()=>{this.loadFrameElement()}),this.scrollFrameIntoView(),await Bt(),this.focusFirstAutofocusableElement(),await Bt(),this.activateScriptElements()}loadFrameElement(){var e;let r=document.createRange();r.selectNodeContents(this.currentElement),r.deleteContents();let i=this.newElement,n=(e=i.ownerDocument)===null||e===void 0?void 0:e.createRange();n&&(n.selectNodeContents(i),this.currentElement.appendChild(n.extractContents()))}scrollFrameIntoView(){if(this.currentElement.autoscroll||this.newElement.autoscroll){let e=this.currentElement.firstElementChild,r=ka(this.currentElement.getAttribute("data-autoscroll-block"),"end");if(e)return e.scrollIntoView({block:r}),!0}return!1}activateScriptElements(){for(let e of this.newScriptElements){let r=this.createScriptElement(e);e.replaceWith(r)}}get newScriptElements(){return this.currentElement.querySelectorAll("script")}};function ka(t,e){return t=="end"||t=="start"||t=="center"||t=="nearest"?t:e}var se=class{constructor(){this.hiding=!1,this.value=0,this.visible=!1,this.trickle=()=>{this.setValue(this.value+Math.random()/100)},this.stylesheetElement=this.createStylesheetElement(),this.progressElement=this.createProgressElement(),this.installStylesheetElement(),this.setValue(0)}static get defaultCSS(){return Li`
      .turbo-progress-bar {
        position: fixed;
        display: block;
        top: 0;
        left: 0;
        height: 3px;
        background: #0076ff;
        z-index: 9999;
        transition:
          width ${se.animationDuration}ms ease-out,
          opacity ${se.animationDuration/2}ms ${se.animationDuration/2}ms ease-in;
        transform: translate3d(0, 0, 0);
      }
    `}show(){this.visible||(this.visible=!0,this.installProgressElement(),this.startTrickling())}hide(){this.visible&&!this.hiding&&(this.hiding=!0,this.fadeProgressElement(()=>{this.uninstallProgressElement(),this.stopTrickling(),this.visible=!1,this.hiding=!1}))}setValue(e){this.value=e,this.refresh()}installStylesheetElement(){document.head.insertBefore(this.stylesheetElement,document.head.firstChild)}installProgressElement(){this.progressElement.style.width="0",this.progressElement.style.opacity="1",document.documentElement.insertBefore(this.progressElement,document.body),this.refresh()}fadeProgressElement(e){this.progressElement.style.opacity="0",setTimeout(e,se.animationDuration*1.5)}uninstallProgressElement(){this.progressElement.parentNode&&document.documentElement.removeChild(this.progressElement)}startTrickling(){this.trickleInterval||(this.trickleInterval=window.setInterval(this.trickle,se.animationDuration))}stopTrickling(){window.clearInterval(this.trickleInterval),delete this.trickleInterval}refresh(){requestAnimationFrame(()=>{this.progressElement.style.width=`${10+this.value*90}%`})}createStylesheetElement(){let e=document.createElement("style");return e.type="text/css",e.textContent=se.defaultCSS,e}createProgressElement(){let e=document.createElement("div");return e.className="turbo-progress-bar",e}};se.animationDuration=300;var xi=class extends dt{constructor(){super(...arguments);this.detailsByOuterHTML=this.children.filter(e=>!La(e)).reduce((e,r)=>{let{outerHTML:i}=r,n=i in e?e[i]:{type:Aa(r),tracked:Oa(r),elements:[]};return Object.assign(Object.assign({},e),{[i]:Object.assign(Object.assign({},n),{elements:[...n.elements,r]})})},{})}get trackedElementSignature(){return Object.keys(this.detailsByOuterHTML).filter(e=>this.detailsByOuterHTML[e].tracked).join("")}getScriptElementsNotInSnapshot(e){return this.getElementsMatchingTypeNotInSnapshot("script",e)}getStylesheetElementsNotInSnapshot(e){return this.getElementsMatchingTypeNotInSnapshot("stylesheet",e)}getElementsMatchingTypeNotInSnapshot(e,r){return Object.keys(this.detailsByOuterHTML).filter(i=>!(i in r.detailsByOuterHTML)).map(i=>this.detailsByOuterHTML[i]).filter(({type:i})=>i==e).map(({elements:[i]})=>i)}get provisionalElements(){return Object.keys(this.detailsByOuterHTML).reduce((e,r)=>{let{type:i,tracked:n,elements:s}=this.detailsByOuterHTML[r];return i==null&&!n?[...e,...s]:s.length>1?[...e,...s.slice(1)]:e},[])}getMetaValue(e){let r=this.findMetaElementByName(e);return r?r.getAttribute("content"):null}findMetaElementByName(e){return Object.keys(this.detailsByOuterHTML).reduce((r,i)=>{let{elements:[n]}=this.detailsByOuterHTML[i];return Pa(n,e)?n:r},void 0)}};function Aa(t){if(Ca(t))return"script";if(Ia(t))return"stylesheet"}function Oa(t){return t.getAttribute("data-turbo-track")=="reload"}function Ca(t){return t.tagName.toLowerCase()=="script"}function La(t){return t.tagName.toLowerCase()=="noscript"}function Ia(t){let e=t.tagName.toLowerCase();return e=="style"||e=="link"&&t.getAttribute("rel")=="stylesheet"}function Pa(t,e){return t.tagName.toLowerCase()=="meta"&&t.getAttribute("name")==e}var me=class extends dt{constructor(e,r){super(e);this.headSnapshot=r}static fromHTMLString(e=""){return this.fromDocument(Ci(e))}static fromElement(e){return this.fromDocument(e.ownerDocument)}static fromDocument({head:e,body:r}){return new this(r,new xi(e))}clone(){return new me(this.element.cloneNode(!0),this.headSnapshot)}get headElement(){return this.headSnapshot.element}get rootLocation(){var e;let r=(e=this.getSetting("root"))!==null&&e!==void 0?e:"/";return ne(r)}get cacheControlValue(){return this.getSetting("cache-control")}get isPreviewable(){return this.cacheControlValue!="no-preview"}get isCacheable(){return this.cacheControlValue!="no-cache"}get isVisitable(){return this.getSetting("visit-control")!="reload"}getSetting(e){return this.headSnapshot.getMetaValue(`turbo-${e}`)}},Je;(function(t){t.visitStart="visitStart",t.requestStart="requestStart",t.requestEnd="requestEnd",t.visitEnd="visitEnd"})(Je||(Je={}));var X;(function(t){t.initialized="initialized",t.started="started",t.canceled="canceled",t.failed="failed",t.completed="completed"})(X||(X={}));var Ma={action:"advance",historyChanged:!1},Oe;(function(t){t[t.networkFailure=0]="networkFailure",t[t.timeoutFailure=-1]="timeoutFailure",t[t.contentTypeMismatch=-2]="contentTypeMismatch"})(Oe||(Oe={}));var Ni=class{constructor(e,r,i,n={}){this.identifier=ht(),this.timingMetrics={},this.followedRedirect=!1,this.historyChanged=!1,this.scrolled=!1,this.snapshotCached=!1,this.state=X.initialized,this.delegate=e,this.location=r,this.restorationIdentifier=i||ht();let{action:s,historyChanged:o,referrer:a,snapshotHTML:l,response:u}=Object.assign(Object.assign({},Ma),n);this.action=s,this.historyChanged=o,this.referrer=a,this.snapshotHTML=l,this.response=u,this.isSamePage=this.delegate.locationWithActionIsSamePage(this.location,this.action)}get adapter(){return this.delegate.adapter}get view(){return this.delegate.view}get history(){return this.delegate.history}get restorationData(){return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)}get silent(){return this.isSamePage}start(){this.state==X.initialized&&(this.recordTimingMetric(Je.visitStart),this.state=X.started,this.adapter.visitStarted(this),this.delegate.visitStarted(this))}cancel(){this.state==X.started&&(this.request&&this.request.cancel(),this.cancelRender(),this.state=X.canceled)}complete(){this.state==X.started&&(this.recordTimingMetric(Je.visitEnd),this.state=X.completed,this.adapter.visitCompleted(this),this.delegate.visitCompleted(this),this.followRedirect())}fail(){this.state==X.started&&(this.state=X.failed,this.adapter.visitFailed(this))}changeHistory(){var e;if(!this.historyChanged){let r=this.location.href===((e=this.referrer)===null||e===void 0?void 0:e.href)?"replace":this.action,i=this.getHistoryMethodForAction(r);this.history.update(i,this.location,this.restorationIdentifier),this.historyChanged=!0}}issueRequest(){this.hasPreloadedResponse()?this.simulateRequest():this.shouldIssueRequest()&&!this.request&&(this.request=new jt(this,F.get,this.location),this.request.perform())}simulateRequest(){this.response&&(this.startRequest(),this.recordResponse(),this.finishRequest())}startRequest(){this.recordTimingMetric(Je.requestStart),this.adapter.visitRequestStarted(this)}recordResponse(e=this.response){if(this.response=e,e){let{statusCode:r}=e;_i(r)?this.adapter.visitRequestCompleted(this):this.adapter.visitRequestFailedWithStatusCode(this,r)}}finishRequest(){this.recordTimingMetric(Je.requestEnd),this.adapter.visitRequestFinished(this)}loadResponse(){if(this.response){let{statusCode:e,responseHTML:r}=this.response;this.render(async()=>{this.cacheSnapshot(),this.view.renderPromise&&await this.view.renderPromise,_i(e)&&r!=null?(await this.view.renderPage(me.fromHTMLString(r)),this.adapter.visitRendered(this),this.complete()):(await this.view.renderError(me.fromHTMLString(r)),this.adapter.visitRendered(this),this.fail())})}}getCachedSnapshot(){let e=this.view.getCachedSnapshotForLocation(this.location)||this.getPreloadedSnapshot();if(e&&(!xe(this.location)||e.hasAnchor(xe(this.location)))&&(this.action=="restore"||e.isPreviewable))return e}getPreloadedSnapshot(){if(this.snapshotHTML)return me.fromHTMLString(this.snapshotHTML)}hasCachedSnapshot(){return this.getCachedSnapshot()!=null}loadCachedSnapshot(){let e=this.getCachedSnapshot();if(e){let r=this.shouldIssueRequest();this.render(async()=>{this.cacheSnapshot(),this.isSamePage?this.adapter.visitRendered(this):(this.view.renderPromise&&await this.view.renderPromise,await this.view.renderPage(e,r),this.adapter.visitRendered(this),r||this.complete())})}}followRedirect(){this.redirectedToLocation&&!this.followedRedirect&&(this.adapter.visitProposedToLocation(this.redirectedToLocation,{action:"replace",response:this.response}),this.followedRedirect=!0)}goToSamePageAnchor(){this.isSamePage&&this.render(async()=>{this.cacheSnapshot(),this.adapter.visitRendered(this)})}requestStarted(){this.startRequest()}requestPreventedHandlingResponse(e,r){}async requestSucceededWithResponse(e,r){let i=await r.responseHTML;i==null?this.recordResponse({statusCode:Oe.contentTypeMismatch}):(this.redirectedToLocation=r.redirected?r.location:void 0,this.recordResponse({statusCode:r.statusCode,responseHTML:i}))}async requestFailedWithResponse(e,r){let i=await r.responseHTML;i==null?this.recordResponse({statusCode:Oe.contentTypeMismatch}):this.recordResponse({statusCode:r.statusCode,responseHTML:i})}requestErrored(e,r){this.recordResponse({statusCode:Oe.networkFailure})}requestFinished(){this.finishRequest()}performScroll(){this.scrolled||(this.action=="restore"?this.scrollToRestoredPosition()||this.scrollToAnchor()||this.view.scrollToTop():this.scrollToAnchor()||this.view.scrollToTop(),this.isSamePage&&this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation,this.location),this.scrolled=!0)}scrollToRestoredPosition(){let{scrollPosition:e}=this.restorationData;if(e)return this.view.scrollToPosition(e),!0}scrollToAnchor(){let e=xe(this.location);if(e!=null)return this.view.scrollToAnchor(e),!0}recordTimingMetric(e){this.timingMetrics[e]=new Date().getTime()}getTimingMetrics(){return Object.assign({},this.timingMetrics)}getHistoryMethodForAction(e){switch(e){case"replace":return history.replaceState;case"advance":case"restore":return history.pushState}}hasPreloadedResponse(){return typeof this.response=="object"}shouldIssueRequest(){return this.isSamePage?!1:this.action=="restore"?!this.hasCachedSnapshot():!0}cacheSnapshot(){this.snapshotCached||(this.view.cacheSnapshot(),this.snapshotCached=!0)}async render(e){this.cancelRender(),await new Promise(r=>{this.frame=requestAnimationFrame(()=>r())}),await e(),delete this.frame,this.performScroll()}cancelRender(){this.frame&&(cancelAnimationFrame(this.frame),delete this.frame)}};function _i(t){return t>=200&&t<300}var Fi=class{constructor(e){this.progressBar=new se,this.showProgressBar=()=>{this.progressBar.show()},this.session=e}visitProposedToLocation(e,r){this.navigator.startVisit(e,ht(),r)}visitStarted(e){e.issueRequest(),e.changeHistory(),e.goToSamePageAnchor(),e.loadCachedSnapshot()}visitRequestStarted(e){this.progressBar.setValue(0),e.hasCachedSnapshot()||e.action!="restore"?this.showVisitProgressBarAfterDelay():this.showProgressBar()}visitRequestCompleted(e){e.loadResponse()}visitRequestFailedWithStatusCode(e,r){switch(r){case Oe.networkFailure:case Oe.timeoutFailure:case Oe.contentTypeMismatch:return this.reload();default:return e.loadResponse()}}visitRequestFinished(e){this.progressBar.setValue(1),this.hideVisitProgressBar()}visitCompleted(e){}pageInvalidated(){this.reload()}visitFailed(e){}visitRendered(e){}formSubmissionStarted(e){this.progressBar.setValue(0),this.showFormProgressBarAfterDelay()}formSubmissionFinished(e){this.progressBar.setValue(1),this.hideFormProgressBar()}showVisitProgressBarAfterDelay(){this.visitProgressBarTimeout=window.setTimeout(this.showProgressBar,this.session.progressBarDelay)}hideVisitProgressBar(){this.progressBar.hide(),this.visitProgressBarTimeout!=null&&(window.clearTimeout(this.visitProgressBarTimeout),delete this.visitProgressBarTimeout)}showFormProgressBarAfterDelay(){this.formProgressBarTimeout==null&&(this.formProgressBarTimeout=window.setTimeout(this.showProgressBar,this.session.progressBarDelay))}hideFormProgressBar(){this.progressBar.hide(),this.formProgressBarTimeout!=null&&(window.clearTimeout(this.formProgressBarTimeout),delete this.formProgressBarTimeout)}reload(){window.location.reload()}get navigator(){return this.session.navigator}},Hi=class{constructor(){this.started=!1}start(){this.started||(this.started=!0,addEventListener("turbo:before-cache",this.removeStaleElements,!1))}stop(){this.started&&(this.started=!1,removeEventListener("turbo:before-cache",this.removeStaleElements,!1))}removeStaleElements(){let e=[...document.querySelectorAll('[data-turbo-cache="false"]')];for(let r of e)r.remove()}},Vi=class{constructor(e){this.started=!1,this.submitCaptured=()=>{removeEventListener("submit",this.submitBubbled,!1),addEventListener("submit",this.submitBubbled,!1)},this.submitBubbled=r=>{if(!r.defaultPrevented){let i=r.target instanceof HTMLFormElement?r.target:void 0,n=r.submitter||void 0;i&&((n==null?void 0:n.getAttribute("formmethod"))||i.method)!="dialog"&&this.delegate.willSubmitForm(i,n)&&(r.preventDefault(),this.delegate.formSubmitted(i,n))}},this.delegate=e}start(){this.started||(addEventListener("submit",this.submitCaptured,!0),this.started=!0)}stop(){this.started&&(removeEventListener("submit",this.submitCaptured,!0),this.started=!1)}},Bi=class{constructor(e){this.element=e,this.linkInterceptor=new Cr(this,e),this.formInterceptor=new Ar(this,e)}start(){this.linkInterceptor.start(),this.formInterceptor.start()}stop(){this.linkInterceptor.stop(),this.formInterceptor.stop()}shouldInterceptLinkClick(e,r){return this.shouldRedirect(e)}linkClickIntercepted(e,r){let i=this.findFrameElement(e);i&&(i.setAttribute("reloadable",""),i.src=r)}shouldInterceptFormSubmission(e,r){return this.shouldRedirect(e,r)}formSubmissionIntercepted(e,r){let i=this.findFrameElement(e);i&&(i.removeAttribute("reloadable"),i.delegate.formSubmissionIntercepted(e,r))}shouldRedirect(e,r){let i=this.findFrameElement(e);return i?i!=e.closest("turbo-frame"):!1}findFrameElement(e){let r=e.getAttribute("data-turbo-frame");if(r&&r!="_top"){let i=this.element.querySelector(`#${r}:not([disabled])`);if(i instanceof fe)return i}}},ji=class{constructor(e){this.restorationIdentifier=ht(),this.restorationData={},this.started=!1,this.pageLoaded=!1,this.onPopState=r=>{if(this.shouldHandlePopState()){let{turbo:i}=r.state||{};if(i){this.location=new URL(window.location.href);let{restorationIdentifier:n}=i;this.restorationIdentifier=n,this.delegate.historyPoppedToLocationWithRestorationIdentifier(this.location,n)}}},this.onPageLoad=async r=>{await fa(),this.pageLoaded=!0},this.delegate=e}start(){this.started||(addEventListener("popstate",this.onPopState,!1),addEventListener("load",this.onPageLoad,!1),this.started=!0,this.replace(new URL(window.location.href)))}stop(){this.started&&(removeEventListener("popstate",this.onPopState,!1),removeEventListener("load",this.onPageLoad,!1),this.started=!1)}push(e,r){this.update(history.pushState,e,r)}replace(e,r){this.update(history.replaceState,e,r)}update(e,r,i=ht()){let n={turbo:{restorationIdentifier:i}};e.call(history,n,"",r.href),this.location=r,this.restorationIdentifier=i}getRestorationDataForIdentifier(e){return this.restorationData[e]||{}}updateRestorationData(e){let{restorationIdentifier:r}=this,i=this.restorationData[r];this.restorationData[r]=Object.assign(Object.assign({},i),e)}assumeControlOfScrollRestoration(){var e;this.previousScrollRestoration||(this.previousScrollRestoration=(e=history.scrollRestoration)!==null&&e!==void 0?e:"auto",history.scrollRestoration="manual")}relinquishControlOfScrollRestoration(){this.previousScrollRestoration&&(history.scrollRestoration=this.previousScrollRestoration,delete this.previousScrollRestoration)}shouldHandlePopState(){return this.pageIsLoaded()}pageIsLoaded(){return this.pageLoaded||document.readyState=="complete"}},Ui=class{constructor(e){this.started=!1,this.clickCaptured=()=>{removeEventListener("click",this.clickBubbled,!1),addEventListener("click",this.clickBubbled,!1)},this.clickBubbled=r=>{if(this.clickEventIsSignificant(r)){let i=r.composedPath&&r.composedPath()[0]||r.target,n=this.findLinkFromClickTarget(i);if(n){let s=this.getLocationForLink(n);this.delegate.willFollowLinkToLocation(n,s)&&(r.preventDefault(),this.delegate.followedLinkToLocation(n,s))}}},this.delegate=e}start(){this.started||(addEventListener("click",this.clickCaptured,!0),this.started=!0)}stop(){this.started&&(removeEventListener("click",this.clickCaptured,!0),this.started=!1)}clickEventIsSignificant(e){return!(e.target&&e.target.isContentEditable||e.defaultPrevented||e.which>1||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)}findLinkFromClickTarget(e){if(e instanceof Element)return e.closest("a[href]:not([target^=_]):not([download])")}getLocationForLink(e){return ne(e.getAttribute("href")||"")}};function qi(t){return t=="advance"||t=="replace"||t=="restore"}var $i=class{constructor(e){this.delegate=e}proposeVisit(e,r={}){this.delegate.allowsVisitingLocationWithAction(e,r.action)&&this.delegate.visitProposedToLocation(e,r)}startVisit(e,r,i={}){this.stop(),this.currentVisit=new Ni(this,ne(e),r,Object.assign({referrer:this.location},i)),this.currentVisit.start()}submitForm(e,r){this.stop(),this.formSubmission=new kr(this,e,r,!0),this.formSubmission.isIdempotent?this.proposeVisit(this.formSubmission.fetchRequest.url,{action:this.getActionForFormSubmission(this.formSubmission)}):this.formSubmission.start()}stop(){this.formSubmission&&(this.formSubmission.stop(),delete this.formSubmission),this.currentVisit&&(this.currentVisit.cancel(),delete this.currentVisit)}get adapter(){return this.delegate.adapter}get view(){return this.delegate.view}get history(){return this.delegate.history}formSubmissionStarted(e){typeof this.adapter.formSubmissionStarted=="function"&&this.adapter.formSubmissionStarted(e)}async formSubmissionSucceededWithResponse(e,r){if(e==this.formSubmission){let i=await r.responseHTML;if(i){e.method!=F.get&&this.view.clearSnapshotCache();let{statusCode:n}=r,s={response:{statusCode:n,responseHTML:i}};this.proposeVisit(r.location,s)}}}async formSubmissionFailedWithResponse(e,r){let i=await r.responseHTML;if(i){let n=me.fromHTMLString(i);r.serverError?await this.view.renderError(n):await this.view.renderPage(n),this.view.scrollToTop(),this.view.clearSnapshotCache()}}formSubmissionErrored(e,r){console.error(r)}formSubmissionFinished(e){typeof this.adapter.formSubmissionFinished=="function"&&this.adapter.formSubmissionFinished(e)}visitStarted(e){this.delegate.visitStarted(e)}visitCompleted(e){this.delegate.visitCompleted(e)}locationWithActionIsSamePage(e,r){let i=xe(e),n=xe(this.view.lastRenderedLocation),s=r==="restore"&&typeof i=="undefined";return r!=="replace"&&Er(e)===Er(this.view.lastRenderedLocation)&&(s||i!=null&&i!==n)}visitScrolledToSamePageLocation(e,r){this.delegate.visitScrolledToSamePageLocation(e,r)}get location(){return this.history.location}get restorationIdentifier(){return this.history.restorationIdentifier}getActionForFormSubmission(e){let{formElement:r,submitter:i}=e,n=(i==null?void 0:i.getAttribute("data-turbo-action"))||r.getAttribute("data-turbo-action");return qi(n)?n:"advance"}},pe;(function(t){t[t.initial=0]="initial",t[t.loading=1]="loading",t[t.interactive=2]="interactive",t[t.complete=3]="complete"})(pe||(pe={}));var Wi=class{constructor(e){this.stage=pe.initial,this.started=!1,this.interpretReadyState=()=>{let{readyState:r}=this;r=="interactive"?this.pageIsInteractive():r=="complete"&&this.pageIsComplete()},this.pageWillUnload=()=>{this.delegate.pageWillUnload()},this.delegate=e}start(){this.started||(this.stage==pe.initial&&(this.stage=pe.loading),document.addEventListener("readystatechange",this.interpretReadyState,!1),addEventListener("pagehide",this.pageWillUnload,!1),this.started=!0)}stop(){this.started&&(document.removeEventListener("readystatechange",this.interpretReadyState,!1),removeEventListener("pagehide",this.pageWillUnload,!1),this.started=!1)}pageIsInteractive(){this.stage==pe.loading&&(this.stage=pe.interactive,this.delegate.pageBecameInteractive())}pageIsComplete(){this.pageIsInteractive(),this.stage==pe.interactive&&(this.stage=pe.complete,this.delegate.pageLoaded())}get readyState(){return document.readyState}},zi=class{constructor(e){this.started=!1,this.onScroll=()=>{this.updatePosition({x:window.pageXOffset,y:window.pageYOffset})},this.delegate=e}start(){this.started||(addEventListener("scroll",this.onScroll,!1),this.onScroll(),this.started=!0)}stop(){this.started&&(removeEventListener("scroll",this.onScroll,!1),this.started=!1)}updatePosition(e){this.delegate.scrollPositionChanged(e)}},Zi=class{constructor(e){this.sources=new Set,this.started=!1,this.inspectFetchResponse=r=>{let i=Ra(r);i&&Da(i)&&(r.preventDefault(),this.receiveMessageResponse(i))},this.receiveMessageEvent=r=>{this.started&&typeof r.data=="string"&&this.receiveMessageHTML(r.data)},this.delegate=e}start(){this.started||(this.started=!0,addEventListener("turbo:before-fetch-response",this.inspectFetchResponse,!1))}stop(){this.started&&(this.started=!1,removeEventListener("turbo:before-fetch-response",this.inspectFetchResponse,!1))}connectStreamSource(e){this.streamSourceIsConnected(e)||(this.sources.add(e),e.addEventListener("message",this.receiveMessageEvent,!1))}disconnectStreamSource(e){this.streamSourceIsConnected(e)&&(this.sources.delete(e),e.removeEventListener("message",this.receiveMessageEvent,!1))}streamSourceIsConnected(e){return this.sources.has(e)}async receiveMessageResponse(e){let r=await e.responseHTML;r&&this.receiveMessageHTML(r)}receiveMessageHTML(e){this.delegate.receivedMessageFromStream(new Ze(e))}};function Ra(t){var e;let r=(e=t.detail)===null||e===void 0?void 0:e.fetchResponse;if(r instanceof Tr)return r}function Da(t){var e;return((e=t.contentType)!==null&&e!==void 0?e:"").startsWith(Ze.contentType)}var Ji=class extends Ut{async render(){this.replaceHeadAndBody(),this.activateScriptElements()}replaceHeadAndBody(){let{documentElement:e,head:r,body:i}=document;e.replaceChild(this.newHead,r),e.replaceChild(this.newElement,i)}activateScriptElements(){for(let e of this.scriptElements){let r=e.parentNode;if(r){let i=this.createScriptElement(e);r.replaceChild(i,e)}}}get newHead(){return this.newSnapshot.headSnapshot.element}get scriptElements(){return[...document.documentElement.querySelectorAll("script")]}},Lr=class extends Ut{get shouldRender(){return this.newSnapshot.isVisitable&&this.trackedElementsAreIdentical}prepareToRender(){this.mergeHead()}async render(){this.replaceBody()}finishRendering(){super.finishRendering(),this.isPreview||this.focusFirstAutofocusableElement()}get currentHeadSnapshot(){return this.currentSnapshot.headSnapshot}get newHeadSnapshot(){return this.newSnapshot.headSnapshot}get newElement(){return this.newSnapshot.element}mergeHead(){this.copyNewHeadStylesheetElements(),this.copyNewHeadScriptElements(),this.removeCurrentHeadProvisionalElements(),this.copyNewHeadProvisionalElements()}replaceBody(){this.preservingPermanentElements(()=>{this.activateNewBody(),this.assignNewBody()})}get trackedElementsAreIdentical(){return this.currentHeadSnapshot.trackedElementSignature==this.newHeadSnapshot.trackedElementSignature}copyNewHeadStylesheetElements(){for(let e of this.newHeadStylesheetElements)document.head.appendChild(e)}copyNewHeadScriptElements(){for(let e of this.newHeadScriptElements)document.head.appendChild(this.createScriptElement(e))}removeCurrentHeadProvisionalElements(){for(let e of this.currentHeadProvisionalElements)document.head.removeChild(e)}copyNewHeadProvisionalElements(){for(let e of this.newHeadProvisionalElements)document.head.appendChild(e)}activateNewBody(){document.adoptNode(this.newElement),this.activateNewBodyScriptElements()}activateNewBodyScriptElements(){for(let e of this.newBodyScriptElements){let r=this.createScriptElement(e);e.replaceWith(r)}}assignNewBody(){document.body&&this.newElement instanceof HTMLBodyElement?document.body.replaceWith(this.newElement):document.documentElement.appendChild(this.newElement)}get newHeadStylesheetElements(){return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)}get newHeadScriptElements(){return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)}get currentHeadProvisionalElements(){return this.currentHeadSnapshot.provisionalElements}get newHeadProvisionalElements(){return this.newHeadSnapshot.provisionalElements}get newBodyScriptElements(){return this.newElement.querySelectorAll("script")}},Ki=class{constructor(e){this.keys=[],this.snapshots={},this.size=e}has(e){return Vt(e)in this.snapshots}get(e){if(this.has(e)){let r=this.read(e);return this.touch(e),r}}put(e,r){return this.write(e,r),this.touch(e),r}clear(){this.snapshots={}}read(e){return this.snapshots[Vt(e)]}write(e,r){this.snapshots[Vt(e)]=r}touch(e){let r=Vt(e),i=this.keys.indexOf(r);i>-1&&this.keys.splice(i,1),this.keys.unshift(r),this.trim()}trim(){for(let e of this.keys.splice(this.size))delete this.snapshots[e]}},Gi=class extends Or{constructor(){super(...arguments);this.snapshotCache=new Ki(10),this.lastRenderedLocation=new URL(location.href)}renderPage(e,r=!1){let i=new Lr(this.snapshot,e,r);return this.render(i)}renderError(e){let r=new Ji(this.snapshot,e,!1);return this.render(r)}clearSnapshotCache(){this.snapshotCache.clear()}async cacheSnapshot(){if(this.shouldCacheSnapshot){this.delegate.viewWillCacheSnapshot();let{snapshot:e,lastRenderedLocation:r}=this;await da(),this.snapshotCache.put(r,e.clone())}}getCachedSnapshotForLocation(e){return this.snapshotCache.get(e)}get snapshot(){return me.fromElement(this.element)}get shouldCacheSnapshot(){return this.snapshot.isCacheable}},Yi=class{constructor(){this.navigator=new $i(this),this.history=new ji(this),this.view=new Gi(this,document.documentElement),this.adapter=new Fi(this),this.pageObserver=new Wi(this),this.cacheObserver=new Hi,this.linkClickObserver=new Ui(this),this.formSubmitObserver=new Vi(this),this.scrollObserver=new zi(this),this.streamObserver=new Zi(this),this.frameRedirector=new Bi(document.documentElement),this.drive=!0,this.enabled=!0,this.progressBarDelay=500,this.started=!1}start(){this.started||(this.pageObserver.start(),this.cacheObserver.start(),this.linkClickObserver.start(),this.formSubmitObserver.start(),this.scrollObserver.start(),this.streamObserver.start(),this.frameRedirector.start(),this.history.start(),this.started=!0,this.enabled=!0)}disable(){this.enabled=!1}stop(){this.started&&(this.pageObserver.stop(),this.cacheObserver.stop(),this.linkClickObserver.stop(),this.formSubmitObserver.stop(),this.scrollObserver.stop(),this.streamObserver.stop(),this.frameRedirector.stop(),this.history.stop(),this.started=!1)}registerAdapter(e){this.adapter=e}visit(e,r={}){this.navigator.proposeVisit(ne(e),r)}connectStreamSource(e){this.streamObserver.connectStreamSource(e)}disconnectStreamSource(e){this.streamObserver.disconnectStreamSource(e)}renderStreamMessage(e){document.documentElement.appendChild(Ze.wrap(e).fragment)}clearCache(){this.view.clearSnapshotCache()}setProgressBarDelay(e){this.progressBarDelay=e}get location(){return this.history.location}get restorationIdentifier(){return this.history.restorationIdentifier}historyPoppedToLocationWithRestorationIdentifier(e,r){this.enabled?this.navigator.startVisit(e,r,{action:"restore",historyChanged:!0}):this.adapter.pageInvalidated()}scrollPositionChanged(e){this.history.updateRestorationData({scrollPosition:e})}willFollowLinkToLocation(e,r){return this.elementDriveEnabled(e)&&this.locationIsVisitable(r)&&this.applicationAllowsFollowingLinkToLocation(e,r)}followedLinkToLocation(e,r){let i=this.getActionForLink(e);this.convertLinkWithMethodClickToFormSubmission(e)||this.visit(r.href,{action:i})}convertLinkWithMethodClickToFormSubmission(e){let r=e.getAttribute("data-turbo-method");if(r){let i=document.createElement("form");return i.method=r,i.action=e.getAttribute("href")||"undefined",document.body.appendChild(i),_("submit",{cancelable:!0,target:i})}else return!1}allowsVisitingLocationWithAction(e,r){return this.locationWithActionIsSamePage(e,r)||this.applicationAllowsVisitingLocation(e)}visitProposedToLocation(e,r){Xi(e),this.adapter.visitProposedToLocation(e,r)}visitStarted(e){Xi(e.location),e.silent||this.notifyApplicationAfterVisitingLocation(e.location,e.action)}visitCompleted(e){this.notifyApplicationAfterPageLoad(e.getTimingMetrics())}locationWithActionIsSamePage(e,r){return this.navigator.locationWithActionIsSamePage(e,r)}visitScrolledToSamePageLocation(e,r){this.notifyApplicationAfterVisitingSamePageLocation(e,r)}willSubmitForm(e,r){return this.elementDriveEnabled(e)&&this.elementDriveEnabled(r)}formSubmitted(e,r){this.navigator.submitForm(e,r)}pageBecameInteractive(){this.view.lastRenderedLocation=this.location,this.notifyApplicationAfterPageLoad()}pageLoaded(){this.history.assumeControlOfScrollRestoration()}pageWillUnload(){this.history.relinquishControlOfScrollRestoration()}receivedMessageFromStream(e){this.renderStreamMessage(e)}viewWillCacheSnapshot(){var e;((e=this.navigator.currentVisit)===null||e===void 0?void 0:e.silent)||this.notifyApplicationBeforeCachingSnapshot()}allowsImmediateRender({element:e},r){return!this.notifyApplicationBeforeRender(e,r).defaultPrevented}viewRenderedSnapshot(e,r){this.view.lastRenderedLocation=this.history.location,this.notifyApplicationAfterRender()}viewInvalidated(){this.adapter.pageInvalidated()}frameLoaded(e){this.notifyApplicationAfterFrameLoad(e)}frameRendered(e,r){this.notifyApplicationAfterFrameRender(e,r)}applicationAllowsFollowingLinkToLocation(e,r){return!this.notifyApplicationAfterClickingLinkToLocation(e,r).defaultPrevented}applicationAllowsVisitingLocation(e){return!this.notifyApplicationBeforeVisitingLocation(e).defaultPrevented}notifyApplicationAfterClickingLinkToLocation(e,r){return _("turbo:click",{target:e,detail:{url:r.href},cancelable:!0})}notifyApplicationBeforeVisitingLocation(e){return _("turbo:before-visit",{detail:{url:e.href},cancelable:!0})}notifyApplicationAfterVisitingLocation(e,r){return _("turbo:visit",{detail:{url:e.href,action:r}})}notifyApplicationBeforeCachingSnapshot(){return _("turbo:before-cache")}notifyApplicationBeforeRender(e,r){return _("turbo:before-render",{detail:{newBody:e,resume:r},cancelable:!0})}notifyApplicationAfterRender(){return _("turbo:render")}notifyApplicationAfterPageLoad(e={}){return _("turbo:load",{detail:{url:this.location.href,timing:e}})}notifyApplicationAfterVisitingSamePageLocation(e,r){dispatchEvent(new HashChangeEvent("hashchange",{oldURL:e.toString(),newURL:r.toString()}))}notifyApplicationAfterFrameLoad(e){return _("turbo:frame-load",{target:e})}notifyApplicationAfterFrameRender(e,r){return _("turbo:frame-render",{detail:{fetchResponse:e},target:r,cancelable:!0})}elementDriveEnabled(e){let r=e==null?void 0:e.closest("[data-turbo]");return this.drive?r?r.getAttribute("data-turbo")!="false":!0:r?r.getAttribute("data-turbo")=="true":!1}getActionForLink(e){let r=e.getAttribute("data-turbo-action");return qi(r)?r:"advance"}locationIsVisitable(e){return oa(e,this.snapshot.rootLocation)&&sa(e)}get snapshot(){return this.view.snapshot}};function Xi(t){Object.defineProperties(t,xa)}var xa={absoluteURL:{get(){return this.toString()}}},H=new Yi,{navigator:Na}=H;function Qi(){H.start()}function _a(t){H.registerAdapter(t)}function Fa(t,e){H.visit(t,e)}function Ha(t){H.connectStreamSource(t)}function Va(t){H.disconnectStreamSource(t)}function Ba(t){H.renderStreamMessage(t)}function ja(){H.clearCache()}function Ua(t){H.setProgressBarDelay(t)}var qa=Object.freeze({__proto__:null,navigator:Na,session:H,PageRenderer:Lr,PageSnapshot:me,start:Qi,registerAdapter:_a,visit:Fa,connectStreamSource:Ha,disconnectStreamSource:Va,renderStreamMessage:Ba,clearCache:ja,setProgressBarDelay:Ua}),en=class{constructor(e){this.resolveVisitPromise=()=>{},this.connected=!1,this.hasBeenLoaded=!1,this.settingSourceURL=!1,this.element=e,this.view=new Mi(this,this.element),this.appearanceObserver=new Ii(this,this.element),this.linkInterceptor=new Cr(this,this.element),this.formInterceptor=new Ar(this,this.element)}connect(){this.connected||(this.connected=!0,this.reloadable=!1,this.loadingStyle==Te.lazy&&this.appearanceObserver.start(),this.linkInterceptor.start(),this.formInterceptor.start(),this.sourceURLChanged())}disconnect(){this.connected&&(this.connected=!1,this.appearanceObserver.stop(),this.linkInterceptor.stop(),this.formInterceptor.stop())}disabledChanged(){this.loadingStyle==Te.eager&&this.loadSourceURL()}sourceURLChanged(){(this.loadingStyle==Te.eager||this.hasBeenLoaded)&&this.loadSourceURL()}loadingStyleChanged(){this.loadingStyle==Te.lazy?this.appearanceObserver.start():(this.appearanceObserver.stop(),this.loadSourceURL())}async loadSourceURL(){if(!this.settingSourceURL&&this.enabled&&this.isActive&&(this.reloadable||this.sourceURL!=this.currentURL)){let e=this.currentURL;if(this.currentURL=this.sourceURL,this.sourceURL)try{this.element.loaded=this.visit(this.sourceURL),this.appearanceObserver.stop(),await this.element.loaded,this.hasBeenLoaded=!0,H.frameLoaded(this.element)}catch(r){throw this.currentURL=e,r}}}async loadResponse(e){e.redirected&&(this.sourceURL=e.response.url);try{let r=await e.responseHTML;if(r){let{body:i}=Ci(r),n=new dt(await this.extractForeignFrameElement(i)),s=new Di(this.view.snapshot,n,!1);this.view.renderPromise&&await this.view.renderPromise,await this.view.render(s),H.frameRendered(e,this.element)}}catch(r){console.error(r),this.view.invalidate()}}elementAppearedInViewport(e){this.loadSourceURL()}shouldInterceptLinkClick(e,r){return e.hasAttribute("data-turbo-method")?!1:this.shouldInterceptNavigation(e)}linkClickIntercepted(e,r){this.reloadable=!0,this.navigateFrame(e,r)}shouldInterceptFormSubmission(e,r){return this.shouldInterceptNavigation(e,r)}formSubmissionIntercepted(e,r){if(this.formSubmission&&this.formSubmission.stop(),this.reloadable=!1,this.formSubmission=new kr(this,e,r),this.formSubmission.fetchRequest.isIdempotent)this.navigateFrame(e,this.formSubmission.fetchRequest.url.href);else{let{fetchRequest:i}=this.formSubmission;this.prepareHeadersForRequest(i.headers,i),this.formSubmission.start()}}prepareHeadersForRequest(e,r){e["Turbo-Frame"]=this.id}requestStarted(e){this.element.setAttribute("busy","")}requestPreventedHandlingResponse(e,r){this.resolveVisitPromise()}async requestSucceededWithResponse(e,r){await this.loadResponse(r),this.resolveVisitPromise()}requestFailedWithResponse(e,r){console.error(r),this.resolveVisitPromise()}requestErrored(e,r){console.error(r),this.resolveVisitPromise()}requestFinished(e){this.element.removeAttribute("busy")}formSubmissionStarted(e){this.findFrameElement(e.formElement).setAttribute("busy","")}formSubmissionSucceededWithResponse(e,r){this.findFrameElement(e.formElement).delegate.loadResponse(r)}formSubmissionFailedWithResponse(e,r){this.element.delegate.loadResponse(r)}formSubmissionErrored(e,r){console.error(r)}formSubmissionFinished(e){this.findFrameElement(e.formElement).removeAttribute("busy")}allowsImmediateRender(e,r){return!0}viewRenderedSnapshot(e,r){}viewInvalidated(){}async visit(e){let r=new jt(this,F.get,ne(e));return new Promise(i=>{this.resolveVisitPromise=()=>{this.resolveVisitPromise=()=>{},i()},r.perform()})}navigateFrame(e,r){let i=this.findFrameElement(e);i.src=r}findFrameElement(e){var r;let i=e.getAttribute("data-turbo-frame")||this.element.getAttribute("target");return(r=tn(i))!==null&&r!==void 0?r:this.element}async extractForeignFrameElement(e){let r,i=CSS.escape(this.id);try{if(r=rn(e.querySelector(`turbo-frame#${i}`),this.currentURL))return r;if(r=rn(e.querySelector(`turbo-frame[src][recurse~=${i}]`),this.currentURL))return await r.loaded,await this.extractForeignFrameElement(r);console.error(`Response has no matching <turbo-frame id="${i}"> element`)}catch(n){console.error(n)}return new fe}shouldInterceptNavigation(e,r){let i=e.getAttribute("data-turbo-frame")||this.element.getAttribute("target");if(!this.enabled||i=="_top")return!1;if(i){let n=tn(i);if(n)return!n.disabled}return!(!H.elementDriveEnabled(e)||r&&!H.elementDriveEnabled(r))}get id(){return this.element.id}get enabled(){return!this.element.disabled}get sourceURL(){if(this.element.src)return this.element.src}get reloadable(){return this.findFrameElement(this.element).hasAttribute("reloadable")}set reloadable(e){let r=this.findFrameElement(this.element);e?r.setAttribute("reloadable",""):r.removeAttribute("reloadable")}set sourceURL(e){this.settingSourceURL=!0,this.element.src=e??null,this.currentURL=this.element.src,this.settingSourceURL=!1}get loadingStyle(){return this.element.loading}get isLoading(){return this.formSubmission!==void 0||this.resolveVisitPromise()!==void 0}get isActive(){return this.element.isActive&&this.connected}};function tn(t){if(t!=null){let e=document.getElementById(t);if(e instanceof fe)return e}}function rn(t,e){if(t){let r=t.getAttribute("src");if(r!=null&&e!=null&&aa(r,e))throw new Error(`Matching <turbo-frame id="${t.id}"> element has a source URL which references itself`);if(t.ownerDocument!==document&&(t=document.importNode(t,!0)),t instanceof fe)return t.connectedCallback(),t}}var $a={after(){this.targetElements.forEach(t=>{var e;return(e=t.parentElement)===null||e===void 0?void 0:e.insertBefore(this.templateContent,t.nextSibling)})},append(){this.removeDuplicateTargetChildren(),this.targetElements.forEach(t=>t.append(this.templateContent))},before(){this.targetElements.forEach(t=>{var e;return(e=t.parentElement)===null||e===void 0?void 0:e.insertBefore(this.templateContent,t)})},prepend(){this.removeDuplicateTargetChildren(),this.targetElements.forEach(t=>t.prepend(this.templateContent))},remove(){this.targetElements.forEach(t=>t.remove())},replace(){this.targetElements.forEach(t=>t.replaceWith(this.templateContent))},update(){this.targetElements.forEach(t=>{t.innerHTML="",t.append(this.templateContent)})}},nn=class extends HTMLElement{async connectedCallback(){try{await this.render()}catch(e){console.error(e)}finally{this.disconnect()}}async render(){var e;return(e=this.renderPromise)!==null&&e!==void 0?e:this.renderPromise=(async()=>{this.dispatchEvent(this.beforeRenderEvent)&&(await Bt(),this.performAction())})()}disconnect(){try{this.remove()}catch(e){}}removeDuplicateTargetChildren(){this.duplicateChildren.forEach(e=>e.remove())}get duplicateChildren(){var e;let r=this.targetElements.flatMap(n=>[...n.children]).filter(n=>!!n.id),i=[...(e=this.templateContent)===null||e===void 0?void 0:e.children].filter(n=>!!n.id).map(n=>n.id);return r.filter(n=>i.includes(n.id))}get performAction(){if(this.action){let e=$a[this.action];if(e)return e;this.raise("unknown action")}this.raise("action attribute is missing")}get targetElements(){if(this.target)return this.targetElementsById;if(this.targets)return this.targetElementsByQuery;this.raise("target or targets attribute is missing")}get templateContent(){return this.templateElement.content.cloneNode(!0)}get templateElement(){if(this.firstElementChild instanceof HTMLTemplateElement)return this.firstElementChild;this.raise("first child element must be a <template> element")}get action(){return this.getAttribute("action")}get target(){return this.getAttribute("target")}get targets(){return this.getAttribute("targets")}raise(e){throw new Error(`${this.description}: ${e}`)}get description(){var e,r;return(r=((e=this.outerHTML.match(/<[^>]+>/))!==null&&e!==void 0?e:[])[0])!==null&&r!==void 0?r:"<turbo-stream>"}get beforeRenderEvent(){return new CustomEvent("turbo:before-stream-render",{bubbles:!0,cancelable:!0})}get targetElementsById(){var e;let r=(e=this.ownerDocument)===null||e===void 0?void 0:e.getElementById(this.target);return r!==null?[r]:[]}get targetElementsByQuery(){var e;let r=(e=this.ownerDocument)===null||e===void 0?void 0:e.querySelectorAll(this.targets);return r.length!==0?Array.prototype.slice.call(r):[]}};fe.delegateConstructor=en;customElements.define("turbo-frame",fe);customElements.define("turbo-stream",nn);(()=>{let t=document.currentScript;if(!!t&&!t.hasAttribute("data-turbo-suppress-warning")){for(;t=t.parentElement;)if(t==document.body)return console.warn(Li`
        You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do!

        Load your application’s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.

        For more information, see: https://turbo.hotwired.dev/handbook/building#working-with-script-elements

        ——
        Suppress this warning by adding a "data-turbo-suppress-warning" attribute to: %s
      `,t.outerHTML)}})();window.Turbo=qa;Qi();var sn=function(){function t(e,r,i){this.eventTarget=e,this.eventName=r,this.eventOptions=i,this.unorderedBindings=new Set}return t.prototype.connect=function(){this.eventTarget.addEventListener(this.eventName,this,this.eventOptions)},t.prototype.disconnect=function(){this.eventTarget.removeEventListener(this.eventName,this,this.eventOptions)},t.prototype.bindingConnected=function(e){this.unorderedBindings.add(e)},t.prototype.bindingDisconnected=function(e){this.unorderedBindings.delete(e)},t.prototype.handleEvent=function(e){for(var r=Wa(e),i=0,n=this.bindings;i<n.length;i++){var s=n[i];if(r.immediatePropagationStopped)break;s.handleEvent(r)}},Object.defineProperty(t.prototype,"bindings",{get:function(){return Array.from(this.unorderedBindings).sort(function(e,r){var i=e.index,n=r.index;return i<n?-1:i>n?1:0})},enumerable:!1,configurable:!0}),t}();function Wa(t){if("immediatePropagationStopped"in t)return t;var e=t.stopImmediatePropagation;return Object.assign(t,{immediatePropagationStopped:!1,stopImmediatePropagation:function(){this.immediatePropagationStopped=!0,e.call(this)}})}var on=function(){function t(e){this.application=e,this.eventListenerMaps=new Map,this.started=!1}return t.prototype.start=function(){this.started||(this.started=!0,this.eventListeners.forEach(function(e){return e.connect()}))},t.prototype.stop=function(){this.started&&(this.started=!1,this.eventListeners.forEach(function(e){return e.disconnect()}))},Object.defineProperty(t.prototype,"eventListeners",{get:function(){return Array.from(this.eventListenerMaps.values()).reduce(function(e,r){return e.concat(Array.from(r.values()))},[])},enumerable:!1,configurable:!0}),t.prototype.bindingConnected=function(e){this.fetchEventListenerForBinding(e).bindingConnected(e)},t.prototype.bindingDisconnected=function(e){this.fetchEventListenerForBinding(e).bindingDisconnected(e)},t.prototype.handleError=function(e,r,i){i===void 0&&(i={}),this.application.handleError(e,"Error "+r,i)},t.prototype.fetchEventListenerForBinding=function(e){var r=e.eventTarget,i=e.eventName,n=e.eventOptions;return this.fetchEventListener(r,i,n)},t.prototype.fetchEventListener=function(e,r,i){var n=this.fetchEventListenerMapForEventTarget(e),s=this.cacheKey(r,i),o=n.get(s);return o||(o=this.createEventListener(e,r,i),n.set(s,o)),o},t.prototype.createEventListener=function(e,r,i){var n=new sn(e,r,i);return this.started&&n.connect(),n},t.prototype.fetchEventListenerMapForEventTarget=function(e){var r=this.eventListenerMaps.get(e);return r||(r=new Map,this.eventListenerMaps.set(e,r)),r},t.prototype.cacheKey=function(e,r){var i=[e];return Object.keys(r).sort().forEach(function(n){i.push(""+(r[n]?"":"!")+n)}),i.join(":")},t}();var za=/^((.+?)(@(window|document))?->)?(.+?)(#([^:]+?))(:(.+))?$/;function an(t){var e=t.trim(),r=e.match(za)||[];return{eventTarget:Za(r[4]),eventName:r[2],eventOptions:r[9]?Ja(r[9]):{},identifier:r[5],methodName:r[7]}}function Za(t){if(t=="window")return window;if(t=="document")return document}function Ja(t){return t.split(":").reduce(function(e,r){var i;return Object.assign(e,(i={},i[r.replace(/^!/,"")]=!/^!/.test(r),i))},{})}function ln(t){if(t==window)return"window";if(t==document)return"document"}var un=function(){function t(e,r,i){this.element=e,this.index=r,this.eventTarget=i.eventTarget||e,this.eventName=i.eventName||Ka(e)||Ir("missing event name"),this.eventOptions=i.eventOptions||{},this.identifier=i.identifier||Ir("missing identifier"),this.methodName=i.methodName||Ir("missing method name")}return t.forToken=function(e){return new this(e.element,e.index,an(e.content))},t.prototype.toString=function(){var e=this.eventTargetName?"@"+this.eventTargetName:"";return""+this.eventName+e+"->"+this.identifier+"#"+this.methodName},Object.defineProperty(t.prototype,"eventTargetName",{get:function(){return ln(this.eventTarget)},enumerable:!1,configurable:!0}),t}();var cn={a:function(t){return"click"},button:function(t){return"click"},form:function(t){return"submit"},input:function(t){return t.getAttribute("type")=="submit"?"click":"input"},select:function(t){return"change"},textarea:function(t){return"input"}};function Ka(t){var e=t.tagName.toLowerCase();if(e in cn)return cn[e](t)}function Ir(t){throw new Error(t)}var hn=function(){function t(e,r){this.context=e,this.action=r}return Object.defineProperty(t.prototype,"index",{get:function(){return this.action.index},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"eventTarget",{get:function(){return this.action.eventTarget},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"eventOptions",{get:function(){return this.action.eventOptions},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"identifier",{get:function(){return this.context.identifier},enumerable:!1,configurable:!0}),t.prototype.handleEvent=function(e){this.willBeInvokedByEvent(e)&&this.invokeWithEvent(e)},Object.defineProperty(t.prototype,"eventName",{get:function(){return this.action.eventName},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"method",{get:function(){var e=this.controller[this.methodName];if(typeof e=="function")return e;throw new Error('Action "'+this.action+'" references undefined method "'+this.methodName+'"')},enumerable:!1,configurable:!0}),t.prototype.invokeWithEvent=function(e){try{this.method.call(this.controller,e)}catch(l){var r=this,i=r.identifier,n=r.controller,s=r.element,o=r.index,a={identifier:i,controller:n,element:s,index:o,event:e};this.context.handleError(l,'invoking action "'+this.action+'"',a)}},t.prototype.willBeInvokedByEvent=function(e){var r=e.target;return this.element===r?!0:r instanceof Element&&this.element.contains(r)?this.scope.containsElement(r):this.scope.containsElement(this.action.element)},Object.defineProperty(t.prototype,"controller",{get:function(){return this.context.controller},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"methodName",{get:function(){return this.action.methodName},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"element",{get:function(){return this.scope.element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"scope",{get:function(){return this.context.scope},enumerable:!1,configurable:!0}),t}();var dn=function(){function t(e,r){var i=this;this.element=e,this.started=!1,this.delegate=r,this.elements=new Set,this.mutationObserver=new MutationObserver(function(n){return i.processMutations(n)})}return t.prototype.start=function(){this.started||(this.started=!0,this.mutationObserver.observe(this.element,{attributes:!0,childList:!0,subtree:!0}),this.refresh())},t.prototype.stop=function(){this.started&&(this.mutationObserver.takeRecords(),this.mutationObserver.disconnect(),this.started=!1)},t.prototype.refresh=function(){if(this.started){for(var e=new Set(this.matchElementsInTree()),r=0,i=Array.from(this.elements);r<i.length;r++){var n=i[r];e.has(n)||this.removeElement(n)}for(var s=0,o=Array.from(e);s<o.length;s++){var n=o[s];this.addElement(n)}}},t.prototype.processMutations=function(e){if(this.started)for(var r=0,i=e;r<i.length;r++){var n=i[r];this.processMutation(n)}},t.prototype.processMutation=function(e){e.type=="attributes"?this.processAttributeChange(e.target,e.attributeName):e.type=="childList"&&(this.processRemovedNodes(e.removedNodes),this.processAddedNodes(e.addedNodes))},t.prototype.processAttributeChange=function(e,r){var i=e;this.elements.has(i)?this.delegate.elementAttributeChanged&&this.matchElement(i)?this.delegate.elementAttributeChanged(i,r):this.removeElement(i):this.matchElement(i)&&this.addElement(i)},t.prototype.processRemovedNodes=function(e){for(var r=0,i=Array.from(e);r<i.length;r++){var n=i[r],s=this.elementFromNode(n);s&&this.processTree(s,this.removeElement)}},t.prototype.processAddedNodes=function(e){for(var r=0,i=Array.from(e);r<i.length;r++){var n=i[r],s=this.elementFromNode(n);s&&this.elementIsActive(s)&&this.processTree(s,this.addElement)}},t.prototype.matchElement=function(e){return this.delegate.matchElement(e)},t.prototype.matchElementsInTree=function(e){return e===void 0&&(e=this.element),this.delegate.matchElementsInTree(e)},t.prototype.processTree=function(e,r){for(var i=0,n=this.matchElementsInTree(e);i<n.length;i++){var s=n[i];r.call(this,s)}},t.prototype.elementFromNode=function(e){if(e.nodeType==Node.ELEMENT_NODE)return e},t.prototype.elementIsActive=function(e){return e.isConnected!=this.element.isConnected?!1:this.element.contains(e)},t.prototype.addElement=function(e){this.elements.has(e)||this.elementIsActive(e)&&(this.elements.add(e),this.delegate.elementMatched&&this.delegate.elementMatched(e))},t.prototype.removeElement=function(e){this.elements.has(e)&&(this.elements.delete(e),this.delegate.elementUnmatched&&this.delegate.elementUnmatched(e))},t}();var fn=function(){function t(e,r,i){this.attributeName=r,this.delegate=i,this.elementObserver=new dn(e,this)}return Object.defineProperty(t.prototype,"element",{get:function(){return this.elementObserver.element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"selector",{get:function(){return"["+this.attributeName+"]"},enumerable:!1,configurable:!0}),t.prototype.start=function(){this.elementObserver.start()},t.prototype.stop=function(){this.elementObserver.stop()},t.prototype.refresh=function(){this.elementObserver.refresh()},Object.defineProperty(t.prototype,"started",{get:function(){return this.elementObserver.started},enumerable:!1,configurable:!0}),t.prototype.matchElement=function(e){return e.hasAttribute(this.attributeName)},t.prototype.matchElementsInTree=function(e){var r=this.matchElement(e)?[e]:[],i=Array.from(e.querySelectorAll(this.selector));return r.concat(i)},t.prototype.elementMatched=function(e){this.delegate.elementMatchedAttribute&&this.delegate.elementMatchedAttribute(e,this.attributeName)},t.prototype.elementUnmatched=function(e){this.delegate.elementUnmatchedAttribute&&this.delegate.elementUnmatchedAttribute(e,this.attributeName)},t.prototype.elementAttributeChanged=function(e,r){this.delegate.elementAttributeValueChanged&&this.attributeName==r&&this.delegate.elementAttributeValueChanged(e,r)},t}();var mn=function(){function t(e,r){var i=this;this.element=e,this.delegate=r,this.started=!1,this.stringMap=new Map,this.mutationObserver=new MutationObserver(function(n){return i.processMutations(n)})}return t.prototype.start=function(){this.started||(this.started=!0,this.mutationObserver.observe(this.element,{attributes:!0}),this.refresh())},t.prototype.stop=function(){this.started&&(this.mutationObserver.takeRecords(),this.mutationObserver.disconnect(),this.started=!1)},t.prototype.refresh=function(){if(this.started)for(var e=0,r=this.knownAttributeNames;e<r.length;e++){var i=r[e];this.refreshAttribute(i)}},t.prototype.processMutations=function(e){if(this.started)for(var r=0,i=e;r<i.length;r++){var n=i[r];this.processMutation(n)}},t.prototype.processMutation=function(e){var r=e.attributeName;r&&this.refreshAttribute(r)},t.prototype.refreshAttribute=function(e){var r=this.delegate.getStringMapKeyForAttribute(e);if(r!=null){this.stringMap.has(e)||this.stringMapKeyAdded(r,e);var i=this.element.getAttribute(e);this.stringMap.get(e)!=i&&this.stringMapValueChanged(i,r),i==null?(this.stringMap.delete(e),this.stringMapKeyRemoved(r,e)):this.stringMap.set(e,i)}},t.prototype.stringMapKeyAdded=function(e,r){this.delegate.stringMapKeyAdded&&this.delegate.stringMapKeyAdded(e,r)},t.prototype.stringMapValueChanged=function(e,r){this.delegate.stringMapValueChanged&&this.delegate.stringMapValueChanged(e,r)},t.prototype.stringMapKeyRemoved=function(e,r){this.delegate.stringMapKeyRemoved&&this.delegate.stringMapKeyRemoved(e,r)},Object.defineProperty(t.prototype,"knownAttributeNames",{get:function(){return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)))},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"currentAttributeNames",{get:function(){return Array.from(this.element.attributes).map(function(e){return e.name})},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"recordedAttributeNames",{get:function(){return Array.from(this.stringMap.keys())},enumerable:!1,configurable:!0}),t}();function qt(t,e,r){pn(t,e).add(r)}function $t(t,e,r){pn(t,e).delete(r),Ga(t,e)}function pn(t,e){var r=t.get(e);return r||(r=new Set,t.set(e,r)),r}function Ga(t,e){var r=t.get(e);r!=null&&r.size==0&&t.delete(e)}var Ke=function(){function t(){this.valuesByKey=new Map}return Object.defineProperty(t.prototype,"values",{get:function(){var e=Array.from(this.valuesByKey.values());return e.reduce(function(r,i){return r.concat(Array.from(i))},[])},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"size",{get:function(){var e=Array.from(this.valuesByKey.values());return e.reduce(function(r,i){return r+i.size},0)},enumerable:!1,configurable:!0}),t.prototype.add=function(e,r){qt(this.valuesByKey,e,r)},t.prototype.delete=function(e,r){$t(this.valuesByKey,e,r)},t.prototype.has=function(e,r){var i=this.valuesByKey.get(e);return i!=null&&i.has(r)},t.prototype.hasKey=function(e){return this.valuesByKey.has(e)},t.prototype.hasValue=function(e){var r=Array.from(this.valuesByKey.values());return r.some(function(i){return i.has(e)})},t.prototype.getValuesForKey=function(e){var r=this.valuesByKey.get(e);return r?Array.from(r):[]},t.prototype.getKeysForValue=function(e){return Array.from(this.valuesByKey).filter(function(r){var i=r[0],n=r[1];return n.has(e)}).map(function(r){var i=r[0],n=r[1];return i})},t}();var Ya=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s])},t(e,r)};return function(e,r){t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}(),jh=function(t){Ya(e,t);function e(){var r=t.call(this)||this;return r.keysByValue=new Map,r}return Object.defineProperty(e.prototype,"values",{get:function(){return Array.from(this.keysByValue.keys())},enumerable:!1,configurable:!0}),e.prototype.add=function(r,i){t.prototype.add.call(this,r,i),qt(this.keysByValue,i,r)},e.prototype.delete=function(r,i){t.prototype.delete.call(this,r,i),$t(this.keysByValue,i,r)},e.prototype.hasValue=function(r){return this.keysByValue.has(r)},e.prototype.getKeysForValue=function(r){var i=this.keysByValue.get(r);return i?Array.from(i):[]},e}(Ke);var gn=function(){function t(e,r,i){this.attributeObserver=new fn(e,r,this),this.delegate=i,this.tokensByElement=new Ke}return Object.defineProperty(t.prototype,"started",{get:function(){return this.attributeObserver.started},enumerable:!1,configurable:!0}),t.prototype.start=function(){this.attributeObserver.start()},t.prototype.stop=function(){this.attributeObserver.stop()},t.prototype.refresh=function(){this.attributeObserver.refresh()},Object.defineProperty(t.prototype,"element",{get:function(){return this.attributeObserver.element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"attributeName",{get:function(){return this.attributeObserver.attributeName},enumerable:!1,configurable:!0}),t.prototype.elementMatchedAttribute=function(e){this.tokensMatched(this.readTokensForElement(e))},t.prototype.elementAttributeValueChanged=function(e){var r=this.refreshTokensForElement(e),i=r[0],n=r[1];this.tokensUnmatched(i),this.tokensMatched(n)},t.prototype.elementUnmatchedAttribute=function(e){this.tokensUnmatched(this.tokensByElement.getValuesForKey(e))},t.prototype.tokensMatched=function(e){var r=this;e.forEach(function(i){return r.tokenMatched(i)})},t.prototype.tokensUnmatched=function(e){var r=this;e.forEach(function(i){return r.tokenUnmatched(i)})},t.prototype.tokenMatched=function(e){this.delegate.tokenMatched(e),this.tokensByElement.add(e.element,e)},t.prototype.tokenUnmatched=function(e){this.delegate.tokenUnmatched(e),this.tokensByElement.delete(e.element,e)},t.prototype.refreshTokensForElement=function(e){var r=this.tokensByElement.getValuesForKey(e),i=this.readTokensForElement(e),n=Qa(r,i).findIndex(function(s){var o=s[0],a=s[1];return!el(o,a)});return n==-1?[[],[]]:[r.slice(n),i.slice(n)]},t.prototype.readTokensForElement=function(e){var r=this.attributeName,i=e.getAttribute(r)||"";return Xa(i,e,r)},t}();function Xa(t,e,r){return t.trim().split(/\s+/).filter(function(i){return i.length}).map(function(i,n){return{element:e,attributeName:r,content:i,index:n}})}function Qa(t,e){var r=Math.max(t.length,e.length);return Array.from({length:r},function(i,n){return[t[n],e[n]]})}function el(t,e){return t&&e&&t.index==e.index&&t.content==e.content}var Wt=function(){function t(e,r,i){this.tokenListObserver=new gn(e,r,this),this.delegate=i,this.parseResultsByToken=new WeakMap,this.valuesByTokenByElement=new WeakMap}return Object.defineProperty(t.prototype,"started",{get:function(){return this.tokenListObserver.started},enumerable:!1,configurable:!0}),t.prototype.start=function(){this.tokenListObserver.start()},t.prototype.stop=function(){this.tokenListObserver.stop()},t.prototype.refresh=function(){this.tokenListObserver.refresh()},Object.defineProperty(t.prototype,"element",{get:function(){return this.tokenListObserver.element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"attributeName",{get:function(){return this.tokenListObserver.attributeName},enumerable:!1,configurable:!0}),t.prototype.tokenMatched=function(e){var r=e.element,i=this.fetchParseResultForToken(e).value;i&&(this.fetchValuesByTokenForElement(r).set(e,i),this.delegate.elementMatchedValue(r,i))},t.prototype.tokenUnmatched=function(e){var r=e.element,i=this.fetchParseResultForToken(e).value;i&&(this.fetchValuesByTokenForElement(r).delete(e),this.delegate.elementUnmatchedValue(r,i))},t.prototype.fetchParseResultForToken=function(e){var r=this.parseResultsByToken.get(e);return r||(r=this.parseToken(e),this.parseResultsByToken.set(e,r)),r},t.prototype.fetchValuesByTokenForElement=function(e){var r=this.valuesByTokenByElement.get(e);return r||(r=new Map,this.valuesByTokenByElement.set(e,r)),r},t.prototype.parseToken=function(e){try{var r=this.delegate.parseValueForToken(e);return{value:r}}catch(i){return{error:i}}},t}();var vn=function(){function t(e,r){this.context=e,this.delegate=r,this.bindingsByAction=new Map}return t.prototype.start=function(){this.valueListObserver||(this.valueListObserver=new Wt(this.element,this.actionAttribute,this),this.valueListObserver.start())},t.prototype.stop=function(){this.valueListObserver&&(this.valueListObserver.stop(),delete this.valueListObserver,this.disconnectAllActions())},Object.defineProperty(t.prototype,"element",{get:function(){return this.context.element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"identifier",{get:function(){return this.context.identifier},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"actionAttribute",{get:function(){return this.schema.actionAttribute},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"schema",{get:function(){return this.context.schema},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"bindings",{get:function(){return Array.from(this.bindingsByAction.values())},enumerable:!1,configurable:!0}),t.prototype.connectAction=function(e){var r=new hn(this.context,e);this.bindingsByAction.set(e,r),this.delegate.bindingConnected(r)},t.prototype.disconnectAction=function(e){var r=this.bindingsByAction.get(e);r&&(this.bindingsByAction.delete(e),this.delegate.bindingDisconnected(r))},t.prototype.disconnectAllActions=function(){var e=this;this.bindings.forEach(function(r){return e.delegate.bindingDisconnected(r)}),this.bindingsByAction.clear()},t.prototype.parseValueForToken=function(e){var r=un.forToken(e);if(r.identifier==this.identifier)return r},t.prototype.elementMatchedValue=function(e,r){this.connectAction(r)},t.prototype.elementUnmatchedValue=function(e,r){this.disconnectAction(r)},t}();var yn=function(){function t(e,r){this.context=e,this.receiver=r,this.stringMapObserver=new mn(this.element,this),this.valueDescriptorMap=this.controller.valueDescriptorMap,this.invokeChangedCallbacksForDefaultValues()}return t.prototype.start=function(){this.stringMapObserver.start()},t.prototype.stop=function(){this.stringMapObserver.stop()},Object.defineProperty(t.prototype,"element",{get:function(){return this.context.element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"controller",{get:function(){return this.context.controller},enumerable:!1,configurable:!0}),t.prototype.getStringMapKeyForAttribute=function(e){if(e in this.valueDescriptorMap)return this.valueDescriptorMap[e].name},t.prototype.stringMapValueChanged=function(e,r){this.invokeChangedCallbackForValue(r)},t.prototype.invokeChangedCallbacksForDefaultValues=function(){for(var e=0,r=this.valueDescriptors;e<r.length;e++){var i=r[e],n=i.key,s=i.name,o=i.defaultValue;o!=null&&!this.controller.data.has(n)&&this.invokeChangedCallbackForValue(s)}},t.prototype.invokeChangedCallbackForValue=function(e){var r=e+"Changed",i=this.receiver[r];if(typeof i=="function"){var n=this.receiver[e];i.call(this.receiver,n)}},Object.defineProperty(t.prototype,"valueDescriptors",{get:function(){var e=this.valueDescriptorMap;return Object.keys(e).map(function(r){return e[r]})},enumerable:!1,configurable:!0}),t}();var Pr=function(){function t(e,r){this.module=e,this.scope=r,this.controller=new e.controllerConstructor(this),this.bindingObserver=new vn(this,this.dispatcher),this.valueObserver=new yn(this,this.controller);try{this.controller.initialize()}catch(i){this.handleError(i,"initializing controller")}}return t.prototype.connect=function(){this.bindingObserver.start(),this.valueObserver.start();try{this.controller.connect()}catch(e){this.handleError(e,"connecting controller")}},t.prototype.disconnect=function(){try{this.controller.disconnect()}catch(e){this.handleError(e,"disconnecting controller")}this.valueObserver.stop(),this.bindingObserver.stop()},Object.defineProperty(t.prototype,"application",{get:function(){return this.module.application},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"identifier",{get:function(){return this.module.identifier},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"schema",{get:function(){return this.application.schema},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"dispatcher",{get:function(){return this.application.dispatcher},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"element",{get:function(){return this.scope.element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"parentElement",{get:function(){return this.element.parentElement},enumerable:!1,configurable:!0}),t.prototype.handleError=function(e,r,i){i===void 0&&(i={});var n=this,s=n.identifier,o=n.controller,a=n.element;i=Object.assign({identifier:s,controller:o,element:a},i),this.application.handleError(e,"Error "+r,i)},t}();function Ge(t,e){var r=wn(t);return Array.from(r.reduce(function(i,n){return tl(n,e).forEach(function(s){return i.add(s)}),i},new Set))}function bn(t,e){var r=wn(t);return r.reduce(function(i,n){return i.push.apply(i,rl(n,e)),i},[])}function wn(t){for(var e=[];t;)e.push(t),t=Object.getPrototypeOf(t);return e.reverse()}function tl(t,e){var r=t[e];return Array.isArray(r)?r:[]}function rl(t,e){var r=t[e];return r?Object.keys(r).map(function(i){return[i,r[i]]}):[]}var il=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s])},t(e,r)};return function(e,r){t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}(),nl=function(){for(var t=0,e=0,r=arguments.length;e<r;e++)t+=arguments[e].length;for(var i=Array(t),n=0,e=0;e<r;e++)for(var s=arguments[e],o=0,a=s.length;o<a;o++,n++)i[n]=s[o];return i};function Sn(t){return sl(t,ol(t))}function sl(t,e){var r=cl(t),i=al(t.prototype,e);return Object.defineProperties(r.prototype,i),r}function ol(t){var e=Ge(t,"blessings");return e.reduce(function(r,i){var n=i(t);for(var s in n){var o=r[s]||{};r[s]=Object.assign(o,n[s])}return r},{})}function al(t,e){return ul(e).reduce(function(r,i){var n,s=ll(t,e,i);return s&&Object.assign(r,(n={},n[i]=s,n)),r},{})}function ll(t,e,r){var i=Object.getOwnPropertyDescriptor(t,r),n=i&&"value"in i;if(!n){var s=Object.getOwnPropertyDescriptor(e,r).value;return i&&(s.get=i.get||s.get,s.set=i.set||s.set),s}}var ul=function(){return typeof Object.getOwnPropertySymbols=="function"?function(t){return nl(Object.getOwnPropertyNames(t),Object.getOwnPropertySymbols(t))}:Object.getOwnPropertyNames}(),cl=function(){function t(r){function i(){var n=this&&this instanceof i?this.constructor:void 0;return Reflect.construct(r,arguments,n)}return i.prototype=Object.create(r.prototype,{constructor:{value:i}}),Reflect.setPrototypeOf(i,r),i}function e(){var r=function(){this.a.call(this)},i=t(r);return i.prototype.a=function(){},new i}try{return e(),t}catch(r){return function(i){return function(n){il(s,n);function s(){return n!==null&&n.apply(this,arguments)||this}return s}(i)}}}();function En(t){return{identifier:t.identifier,controllerConstructor:Sn(t.controllerConstructor)}}var Tn=function(){function t(e,r){this.application=e,this.definition=En(r),this.contextsByScope=new WeakMap,this.connectedContexts=new Set}return Object.defineProperty(t.prototype,"identifier",{get:function(){return this.definition.identifier},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"controllerConstructor",{get:function(){return this.definition.controllerConstructor},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"contexts",{get:function(){return Array.from(this.connectedContexts)},enumerable:!1,configurable:!0}),t.prototype.connectContextForScope=function(e){var r=this.fetchContextForScope(e);this.connectedContexts.add(r),r.connect()},t.prototype.disconnectContextForScope=function(e){var r=this.contextsByScope.get(e);r&&(this.connectedContexts.delete(r),r.disconnect())},t.prototype.fetchContextForScope=function(e){var r=this.contextsByScope.get(e);return r||(r=new Pr(this,e),this.contextsByScope.set(e,r)),r},t}();var kn=function(){function t(e){this.scope=e}return t.prototype.has=function(e){return this.data.has(this.getDataKey(e))},t.prototype.get=function(e){return this.data.get(this.getDataKey(e))},t.prototype.getAttributeName=function(e){return this.data.getAttributeNameForKey(this.getDataKey(e))},t.prototype.getDataKey=function(e){return e+"-class"},Object.defineProperty(t.prototype,"data",{get:function(){return this.scope.data},enumerable:!1,configurable:!0}),t}();function An(t){return t.replace(/(?:[_-])([a-z0-9])/g,function(e,r){return r.toUpperCase()})}function Ye(t){return t.charAt(0).toUpperCase()+t.slice(1)}function zt(t){return t.replace(/([A-Z])/g,function(e,r){return"-"+r.toLowerCase()})}var On=function(){function t(e){this.scope=e}return Object.defineProperty(t.prototype,"element",{get:function(){return this.scope.element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"identifier",{get:function(){return this.scope.identifier},enumerable:!1,configurable:!0}),t.prototype.get=function(e){var r=this.getAttributeNameForKey(e);return this.element.getAttribute(r)},t.prototype.set=function(e,r){var i=this.getAttributeNameForKey(e);return this.element.setAttribute(i,r),this.get(e)},t.prototype.has=function(e){var r=this.getAttributeNameForKey(e);return this.element.hasAttribute(r)},t.prototype.delete=function(e){if(this.has(e)){var r=this.getAttributeNameForKey(e);return this.element.removeAttribute(r),!0}else return!1},t.prototype.getAttributeNameForKey=function(e){return"data-"+this.identifier+"-"+zt(e)},t}();var Cn=function(){function t(e){this.warnedKeysByObject=new WeakMap,this.logger=e}return t.prototype.warn=function(e,r,i){var n=this.warnedKeysByObject.get(e);n||(n=new Set,this.warnedKeysByObject.set(e,n)),n.has(r)||(n.add(r),this.logger.warn(i,e))},t}();function ft(t,e){return"["+t+'~="'+e+'"]'}var hl=function(){for(var t=0,e=0,r=arguments.length;e<r;e++)t+=arguments[e].length;for(var i=Array(t),n=0,e=0;e<r;e++)for(var s=arguments[e],o=0,a=s.length;o<a;o++,n++)i[n]=s[o];return i},Ln=function(){function t(e){this.scope=e}return Object.defineProperty(t.prototype,"element",{get:function(){return this.scope.element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"identifier",{get:function(){return this.scope.identifier},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"schema",{get:function(){return this.scope.schema},enumerable:!1,configurable:!0}),t.prototype.has=function(e){return this.find(e)!=null},t.prototype.find=function(){for(var e=this,r=[],i=0;i<arguments.length;i++)r[i]=arguments[i];return r.reduce(function(n,s){return n||e.findTarget(s)||e.findLegacyTarget(s)},void 0)},t.prototype.findAll=function(){for(var e=this,r=[],i=0;i<arguments.length;i++)r[i]=arguments[i];return r.reduce(function(n,s){return hl(n,e.findAllTargets(s),e.findAllLegacyTargets(s))},[])},t.prototype.findTarget=function(e){var r=this.getSelectorForTargetName(e);return this.scope.findElement(r)},t.prototype.findAllTargets=function(e){var r=this.getSelectorForTargetName(e);return this.scope.findAllElements(r)},t.prototype.getSelectorForTargetName=function(e){var r="data-"+this.identifier+"-target";return ft(r,e)},t.prototype.findLegacyTarget=function(e){var r=this.getLegacySelectorForTargetName(e);return this.deprecate(this.scope.findElement(r),e)},t.prototype.findAllLegacyTargets=function(e){var r=this,i=this.getLegacySelectorForTargetName(e);return this.scope.findAllElements(i).map(function(n){return r.deprecate(n,e)})},t.prototype.getLegacySelectorForTargetName=function(e){var r=this.identifier+"."+e;return ft(this.schema.targetAttribute,r)},t.prototype.deprecate=function(e,r){if(e){var i=this.identifier,n=this.schema.targetAttribute;this.guide.warn(e,"target:"+r,"Please replace "+n+'="'+i+"."+r+'" with data-'+i+'-target="'+r+'". '+("The "+n+" attribute is deprecated and will be removed in a future version of Stimulus."))}return e},Object.defineProperty(t.prototype,"guide",{get:function(){return this.scope.guide},enumerable:!1,configurable:!0}),t}();var dl=function(){for(var t=0,e=0,r=arguments.length;e<r;e++)t+=arguments[e].length;for(var i=Array(t),n=0,e=0;e<r;e++)for(var s=arguments[e],o=0,a=s.length;o<a;o++,n++)i[n]=s[o];return i},In=function(){function t(e,r,i,n){var s=this;this.targets=new Ln(this),this.classes=new kn(this),this.data=new On(this),this.containsElement=function(o){return o.closest(s.controllerSelector)===s.element},this.schema=e,this.element=r,this.identifier=i,this.guide=new Cn(n)}return t.prototype.findElement=function(e){return this.element.matches(e)?this.element:this.queryElements(e).find(this.containsElement)},t.prototype.findAllElements=function(e){return dl(this.element.matches(e)?[this.element]:[],this.queryElements(e).filter(this.containsElement))},t.prototype.queryElements=function(e){return Array.from(this.element.querySelectorAll(e))},Object.defineProperty(t.prototype,"controllerSelector",{get:function(){return ft(this.schema.controllerAttribute,this.identifier)},enumerable:!1,configurable:!0}),t}();var Pn=function(){function t(e,r,i){this.element=e,this.schema=r,this.delegate=i,this.valueListObserver=new Wt(this.element,this.controllerAttribute,this),this.scopesByIdentifierByElement=new WeakMap,this.scopeReferenceCounts=new WeakMap}return t.prototype.start=function(){this.valueListObserver.start()},t.prototype.stop=function(){this.valueListObserver.stop()},Object.defineProperty(t.prototype,"controllerAttribute",{get:function(){return this.schema.controllerAttribute},enumerable:!1,configurable:!0}),t.prototype.parseValueForToken=function(e){var r=e.element,i=e.content,n=this.fetchScopesByIdentifierForElement(r),s=n.get(i);return s||(s=this.delegate.createScopeForElementAndIdentifier(r,i),n.set(i,s)),s},t.prototype.elementMatchedValue=function(e,r){var i=(this.scopeReferenceCounts.get(r)||0)+1;this.scopeReferenceCounts.set(r,i),i==1&&this.delegate.scopeConnected(r)},t.prototype.elementUnmatchedValue=function(e,r){var i=this.scopeReferenceCounts.get(r);i&&(this.scopeReferenceCounts.set(r,i-1),i==1&&this.delegate.scopeDisconnected(r))},t.prototype.fetchScopesByIdentifierForElement=function(e){var r=this.scopesByIdentifierByElement.get(e);return r||(r=new Map,this.scopesByIdentifierByElement.set(e,r)),r},t}();var Mn=function(){function t(e){this.application=e,this.scopeObserver=new Pn(this.element,this.schema,this),this.scopesByIdentifier=new Ke,this.modulesByIdentifier=new Map}return Object.defineProperty(t.prototype,"element",{get:function(){return this.application.element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"schema",{get:function(){return this.application.schema},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"logger",{get:function(){return this.application.logger},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"controllerAttribute",{get:function(){return this.schema.controllerAttribute},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"modules",{get:function(){return Array.from(this.modulesByIdentifier.values())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"contexts",{get:function(){return this.modules.reduce(function(e,r){return e.concat(r.contexts)},[])},enumerable:!1,configurable:!0}),t.prototype.start=function(){this.scopeObserver.start()},t.prototype.stop=function(){this.scopeObserver.stop()},t.prototype.loadDefinition=function(e){this.unloadIdentifier(e.identifier);var r=new Tn(this.application,e);this.connectModule(r)},t.prototype.unloadIdentifier=function(e){var r=this.modulesByIdentifier.get(e);r&&this.disconnectModule(r)},t.prototype.getContextForElementAndIdentifier=function(e,r){var i=this.modulesByIdentifier.get(r);if(i)return i.contexts.find(function(n){return n.element==e})},t.prototype.handleError=function(e,r,i){this.application.handleError(e,r,i)},t.prototype.createScopeForElementAndIdentifier=function(e,r){return new In(this.schema,e,r,this.logger)},t.prototype.scopeConnected=function(e){this.scopesByIdentifier.add(e.identifier,e);var r=this.modulesByIdentifier.get(e.identifier);r&&r.connectContextForScope(e)},t.prototype.scopeDisconnected=function(e){this.scopesByIdentifier.delete(e.identifier,e);var r=this.modulesByIdentifier.get(e.identifier);r&&r.disconnectContextForScope(e)},t.prototype.connectModule=function(e){this.modulesByIdentifier.set(e.identifier,e);var r=this.scopesByIdentifier.getValuesForKey(e.identifier);r.forEach(function(i){return e.connectContextForScope(i)})},t.prototype.disconnectModule=function(e){this.modulesByIdentifier.delete(e.identifier);var r=this.scopesByIdentifier.getValuesForKey(e.identifier);r.forEach(function(i){return e.disconnectContextForScope(i)})},t}();var Mr={controllerAttribute:"data-controller",actionAttribute:"data-action",targetAttribute:"data-target"};var fl=function(t,e,r,i){function n(s){return s instanceof r?s:new r(function(o){o(s)})}return new(r||(r=Promise))(function(s,o){function a(c){try{u(i.next(c))}catch(h){o(h)}}function l(c){try{u(i.throw(c))}catch(h){o(h)}}function u(c){c.done?s(c.value):n(c.value).then(a,l)}u((i=i.apply(t,e||[])).next())})},ml=function(t,e){var r={label:0,sent:function(){if(s[0]&1)throw s[1];return s[1]},trys:[],ops:[]},i,n,s,o;return o={next:a(0),throw:a(1),return:a(2)},typeof Symbol=="function"&&(o[Symbol.iterator]=function(){return this}),o;function a(u){return function(c){return l([u,c])}}function l(u){if(i)throw new TypeError("Generator is already executing.");for(;r;)try{if(i=1,n&&(s=u[0]&2?n.return:u[0]?n.throw||((s=n.return)&&s.call(n),0):n.next)&&!(s=s.call(n,u[1])).done)return s;switch(n=0,s&&(u=[u[0]&2,s.value]),u[0]){case 0:case 1:s=u;break;case 4:return r.label++,{value:u[1],done:!1};case 5:r.label++,n=u[1],u=[0];continue;case 7:u=r.ops.pop(),r.trys.pop();continue;default:if(s=r.trys,!(s=s.length>0&&s[s.length-1])&&(u[0]===6||u[0]===2)){r=0;continue}if(u[0]===3&&(!s||u[1]>s[0]&&u[1]<s[3])){r.label=u[1];break}if(u[0]===6&&r.label<s[1]){r.label=s[1],s=u;break}if(s&&r.label<s[2]){r.label=s[2],r.ops.push(u);break}s[2]&&r.ops.pop(),r.trys.pop();continue}u=e.call(t,r)}catch(c){u=[6,c],n=0}finally{i=s=0}if(u[0]&5)throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}},Rn=function(){for(var t=0,e=0,r=arguments.length;e<r;e++)t+=arguments[e].length;for(var i=Array(t),n=0,e=0;e<r;e++)for(var s=arguments[e],o=0,a=s.length;o<a;o++,n++)i[n]=s[o];return i},Rr=function(){function t(e,r){e===void 0&&(e=document.documentElement),r===void 0&&(r=Mr),this.logger=console,this.element=e,this.schema=r,this.dispatcher=new on(this),this.router=new Mn(this)}return t.start=function(e,r){var i=new t(e,r);return i.start(),i},t.prototype.start=function(){return fl(this,void 0,void 0,function(){return ml(this,function(e){switch(e.label){case 0:return[4,pl()];case 1:return e.sent(),this.dispatcher.start(),this.router.start(),[2]}})})},t.prototype.stop=function(){this.dispatcher.stop(),this.router.stop()},t.prototype.register=function(e,r){this.load({identifier:e,controllerConstructor:r})},t.prototype.load=function(e){for(var r=this,i=[],n=1;n<arguments.length;n++)i[n-1]=arguments[n];var s=Array.isArray(e)?e:Rn([e],i);s.forEach(function(o){return r.router.loadDefinition(o)})},t.prototype.unload=function(e){for(var r=this,i=[],n=1;n<arguments.length;n++)i[n-1]=arguments[n];var s=Array.isArray(e)?e:Rn([e],i);s.forEach(function(o){return r.router.unloadIdentifier(o)})},Object.defineProperty(t.prototype,"controllers",{get:function(){return this.router.contexts.map(function(e){return e.controller})},enumerable:!1,configurable:!0}),t.prototype.getControllerForElementAndIdentifier=function(e,r){var i=this.router.getContextForElementAndIdentifier(e,r);return i?i.controller:null},t.prototype.handleError=function(e,r,i){this.logger.error(`%s

%o

%o`,r,e,i)},t}();function pl(){return new Promise(function(t){document.readyState=="loading"?document.addEventListener("DOMContentLoaded",t):t()})}function Dn(t){var e=Ge(t,"classes");return e.reduce(function(r,i){return Object.assign(r,gl(i))},{})}function gl(t){var e,r=t+"Class";return e={},e[r]={get:function(){var i=this.classes;if(i.has(t))return i.get(t);var n=i.getAttributeName(t);throw new Error('Missing attribute "'+n+'"')}},e["has"+Ye(r)]={get:function(){return this.classes.has(t)}},e}function xn(t){var e=Ge(t,"targets");return e.reduce(function(r,i){return Object.assign(r,vl(i))},{})}function vl(t){var e;return e={},e[t+"Target"]={get:function(){var r=this.targets.find(t);if(r)return r;throw new Error('Missing target element "'+this.identifier+"."+t+'"')}},e[t+"Targets"]={get:function(){return this.targets.findAll(t)}},e["has"+Ye(t)+"Target"]={get:function(){return this.targets.has(t)}},e}function Nn(t){var e=bn(t,"values"),r={valueDescriptorMap:{get:function(){var i=this;return e.reduce(function(n,s){var o,a=_n(s),l=i.data.getAttributeNameForKey(a.key);return Object.assign(n,(o={},o[l]=a,o))},{})}}};return e.reduce(function(i,n){return Object.assign(i,yl(n))},r)}function yl(t){var e,r=_n(t),i=r.type,n=r.key,s=r.name,o=El[i],a=Fn[i]||Fn.default;return e={},e[s]={get:function(){var l=this.data.get(n);return l!==null?o(l):r.defaultValue},set:function(l){l===void 0?this.data.delete(n):this.data.set(n,a(l))}},e["has"+Ye(s)]={get:function(){return this.data.has(n)}},e}function _n(t){var e=t[0],r=t[1],i=bl(r);return wl(e,i)}function bl(t){switch(t){case Array:return"array";case Boolean:return"boolean";case Number:return"number";case Object:return"object";case String:return"string"}throw new Error('Unknown value type constant "'+t+'"')}function wl(t,e){var r=zt(t)+"-value";return{type:e,key:r,name:An(r),get defaultValue(){return Sl[e]}}}var Sl={get array(){return[]},boolean:!1,number:0,get object(){return{}},string:""},El={array:function(t){var e=JSON.parse(t);if(!Array.isArray(e))throw new TypeError("Expected array");return e},boolean:function(t){return!(t=="0"||t=="false")},number:function(t){return parseFloat(t)},object:function(t){var e=JSON.parse(t);if(e===null||typeof e!="object"||Array.isArray(e))throw new TypeError("Expected object");return e},string:function(t){return t}},Fn={default:Tl,array:Hn,object:Hn};function Hn(t){return JSON.stringify(t)}function Tl(t){return""+t}var Dr=function(){function t(e){this.context=e}return Object.defineProperty(t.prototype,"application",{get:function(){return this.context.application},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"scope",{get:function(){return this.context.scope},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"element",{get:function(){return this.scope.element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"identifier",{get:function(){return this.scope.identifier},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"targets",{get:function(){return this.scope.targets},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"classes",{get:function(){return this.scope.classes},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"data",{get:function(){return this.scope.data},enumerable:!1,configurable:!0}),t.prototype.initialize=function(){},t.prototype.connect=function(){},t.prototype.disconnect=function(){},t.blessings=[Dn,xn,Nn],t.targets=[],t.values={},t}();var ni=ki(ii()),or=class extends Dr{connect(){var t=Intl.DateTimeFormat().resolvedOptions().timeZone,e=Intl.DateTimeFormat().resolvedOptions().locale,r=document.body.dataset.locale||e||"en",i=document.body.dataset.tz||t||"UTC",n=ni.DateTime[this.formatValue];console.log(r,i,n),this.date=ni.DateTime.fromISO(this.element.dateTime).setZone(i).setLocale(r),this.element.innerText=this.date.toLocaleString(n)}};Ai(or,"values",{format:String});var co=[{identifier:"time",controllerConstructor:or}];var At=t=>typeof t=="function"?t:function(){return t},Lc=typeof self!="undefined"?self:null,Ot=typeof window!="undefined"?window:null,ar=Lc||Ot||void 0,Ic="2.0.0",le={connecting:0,open:1,closing:2,closed:3},Pc=1e4,Mc=1e3,q={closed:"closed",errored:"errored",joined:"joined",joining:"joining",leaving:"leaving"},V={close:"phx_close",error:"phx_error",join:"phx_join",reply:"phx_reply",leave:"phx_leave"},Rc=[V.close,V.error,V.join,V.reply,V.leave],si={longpoll:"longpoll",websocket:"websocket"},lr=class{constructor(t,e,r,i){this.channel=t,this.event=e,this.payload=r||function(){return{}},this.receivedResp=null,this.timeout=i,this.timeoutTimer=null,this.recHooks=[],this.sent=!1}resend(t){this.timeout=t,this.reset(),this.send()}send(){this.hasReceived("timeout")||(this.startTimeout(),this.sent=!0,this.channel.socket.push({topic:this.channel.topic,event:this.event,payload:this.payload(),ref:this.ref,join_ref:this.channel.joinRef()}))}receive(t,e){return this.hasReceived(t)&&e(this.receivedResp.response),this.recHooks.push({status:t,callback:e}),this}reset(){this.cancelRefEvent(),this.ref=null,this.refEvent=null,this.receivedResp=null,this.sent=!1}matchReceive({status:t,response:e,_ref:r}){this.recHooks.filter(i=>i.status===t).forEach(i=>i.callback(e))}cancelRefEvent(){!this.refEvent||this.channel.off(this.refEvent)}cancelTimeout(){clearTimeout(this.timeoutTimer),this.timeoutTimer=null}startTimeout(){this.timeoutTimer&&this.cancelTimeout(),this.ref=this.channel.socket.makeRef(),this.refEvent=this.channel.replyEventName(this.ref),this.channel.on(this.refEvent,t=>{this.cancelRefEvent(),this.cancelTimeout(),this.receivedResp=t,this.matchReceive(t)}),this.timeoutTimer=setTimeout(()=>{this.trigger("timeout",{})},this.timeout)}hasReceived(t){return this.receivedResp&&this.receivedResp.status===t}trigger(t,e){this.channel.trigger(this.refEvent,{status:t,response:e})}},ho=class{constructor(t,e){this.callback=t,this.timerCalc=e,this.timer=null,this.tries=0}reset(){this.tries=0,clearTimeout(this.timer)}scheduleTimeout(){clearTimeout(this.timer),this.timer=setTimeout(()=>{this.tries=this.tries+1,this.callback()},this.timerCalc(this.tries+1))}},Dc=class{constructor(t,e,r){this.state=q.closed,this.topic=t,this.params=At(e||{}),this.socket=r,this.bindings=[],this.bindingRef=0,this.timeout=this.socket.timeout,this.joinedOnce=!1,this.joinPush=new lr(this,V.join,this.params,this.timeout),this.pushBuffer=[],this.stateChangeRefs=[],this.rejoinTimer=new ho(()=>{this.socket.isConnected()&&this.rejoin()},this.socket.rejoinAfterMs),this.stateChangeRefs.push(this.socket.onError(()=>this.rejoinTimer.reset())),this.stateChangeRefs.push(this.socket.onOpen(()=>{this.rejoinTimer.reset(),this.isErrored()&&this.rejoin()})),this.joinPush.receive("ok",()=>{this.state=q.joined,this.rejoinTimer.reset(),this.pushBuffer.forEach(i=>i.send()),this.pushBuffer=[]}),this.joinPush.receive("error",()=>{this.state=q.errored,this.socket.isConnected()&&this.rejoinTimer.scheduleTimeout()}),this.onClose(()=>{this.rejoinTimer.reset(),this.socket.hasLogger()&&this.socket.log("channel",`close ${this.topic} ${this.joinRef()}`),this.state=q.closed,this.socket.remove(this)}),this.onError(i=>{this.socket.hasLogger()&&this.socket.log("channel",`error ${this.topic}`,i),this.isJoining()&&this.joinPush.reset(),this.state=q.errored,this.socket.isConnected()&&this.rejoinTimer.scheduleTimeout()}),this.joinPush.receive("timeout",()=>{this.socket.hasLogger()&&this.socket.log("channel",`timeout ${this.topic} (${this.joinRef()})`,this.joinPush.timeout),new lr(this,V.leave,At({}),this.timeout).send(),this.state=q.errored,this.joinPush.reset(),this.socket.isConnected()&&this.rejoinTimer.scheduleTimeout()}),this.on(V.reply,(i,n)=>{this.trigger(this.replyEventName(n),i)})}join(t=this.timeout){if(this.joinedOnce)throw new Error("tried to join multiple times. 'join' can only be called a single time per channel instance");return this.timeout=t,this.joinedOnce=!0,this.rejoin(),this.joinPush}onClose(t){this.on(V.close,t)}onError(t){return this.on(V.error,e=>t(e))}on(t,e){let r=this.bindingRef++;return this.bindings.push({event:t,ref:r,callback:e}),r}off(t,e){this.bindings=this.bindings.filter(r=>!(r.event===t&&(typeof e=="undefined"||e===r.ref)))}canPush(){return this.socket.isConnected()&&this.isJoined()}push(t,e,r=this.timeout){if(e=e||{},!this.joinedOnce)throw new Error(`tried to push '${t}' to '${this.topic}' before joining. Use channel.join() before pushing events`);let i=new lr(this,t,function(){return e},r);return this.canPush()?i.send():(i.startTimeout(),this.pushBuffer.push(i)),i}leave(t=this.timeout){this.rejoinTimer.reset(),this.joinPush.cancelTimeout(),this.state=q.leaving;let e=()=>{this.socket.hasLogger()&&this.socket.log("channel",`leave ${this.topic}`),this.trigger(V.close,"leave")},r=new lr(this,V.leave,At({}),t);return r.receive("ok",()=>e()).receive("timeout",()=>e()),r.send(),this.canPush()||r.trigger("ok",{}),r}onMessage(t,e,r){return e}isLifecycleEvent(t){return Rc.indexOf(t)>=0}isMember(t,e,r,i){return this.topic!==t?!1:i&&i!==this.joinRef()&&this.isLifecycleEvent(e)?(this.socket.hasLogger()&&this.socket.log("channel","dropping outdated message",{topic:t,event:e,payload:r,joinRef:i}),!1):!0}joinRef(){return this.joinPush.ref}rejoin(t=this.timeout){this.isLeaving()||(this.socket.leaveOpenTopic(this.topic),this.state=q.joining,this.joinPush.resend(t))}trigger(t,e,r,i){let n=this.onMessage(t,e,r,i);if(e&&!n)throw new Error("channel onMessage callbacks must return the payload, modified or unmodified");let s=this.bindings.filter(o=>o.event===t);for(let o=0;o<s.length;o++)s[o].callback(n,r,i||this.joinRef())}replyEventName(t){return`chan_reply_${t}`}isClosed(){return this.state===q.closed}isErrored(){return this.state===q.errored}isJoined(){return this.state===q.joined}isJoining(){return this.state===q.joining}isLeaving(){return this.state===q.leaving}},Ct=class{constructor(){this.states={complete:4}}static request(t,e,r,i,n,s,o){if(ar.XDomainRequest){let a=new ar.XDomainRequest;this.xdomainRequest(a,t,e,i,n,s,o)}else{let a=new ar.XMLHttpRequest;this.xhrRequest(a,t,e,r,i,n,s,o)}}static xdomainRequest(t,e,r,i,n,s,o){t.timeout=n,t.open(e,r),t.onload=()=>{let a=this.parseJSON(t.responseText);o&&o(a)},s&&(t.ontimeout=s),t.onprogress=()=>{},t.send(i)}static xhrRequest(t,e,r,i,n,s,o,a){t.open(e,r,!0),t.timeout=s,t.setRequestHeader("Content-Type",i),t.onerror=()=>{a&&a(null)},t.onreadystatechange=()=>{if(t.readyState===this.states.complete&&a){let l=this.parseJSON(t.responseText);a(l)}},o&&(t.ontimeout=o),t.send(n)}static parseJSON(t){if(!t||t==="")return null;try{return JSON.parse(t)}catch(e){return console&&console.log("failed to parse JSON response",t),null}}static serialize(t,e){let r=[];for(var i in t){if(!Object.prototype.hasOwnProperty.call(t,i))continue;let n=e?`${e}[${i}]`:i,s=t[i];typeof s=="object"?r.push(this.serialize(s,n)):r.push(encodeURIComponent(n)+"="+encodeURIComponent(s))}return r.join("&")}static appendParams(t,e){if(Object.keys(e).length===0)return t;let r=t.match(/\?/)?"&":"?";return`${t}${r}${this.serialize(e)}`}},fo=class{constructor(t){this.endPoint=null,this.token=null,this.skipHeartbeat=!0,this.onopen=function(){},this.onerror=function(){},this.onmessage=function(){},this.onclose=function(){},this.pollEndpoint=this.normalizeEndpoint(t),this.readyState=le.connecting,this.poll()}normalizeEndpoint(t){return t.replace("ws://","http://").replace("wss://","https://").replace(new RegExp("(.*)/"+si.websocket),"$1/"+si.longpoll)}endpointURL(){return Ct.appendParams(this.pollEndpoint,{token:this.token})}closeAndRetry(){this.close(),this.readyState=le.connecting}ontimeout(){this.onerror("timeout"),this.closeAndRetry()}poll(){(this.readyState===le.open||this.readyState===le.connecting)&&Ct.request("GET",this.endpointURL(),"application/json",null,this.timeout,this.ontimeout.bind(this),t=>{if(t){var{status:e,token:r,messages:i}=t;this.token=r}else e=0;switch(e){case 200:i.forEach(n=>{setTimeout(()=>{this.onmessage({data:n})},0)}),this.poll();break;case 204:this.poll();break;case 410:this.readyState=le.open,this.onopen(),this.poll();break;case 403:this.onerror(),this.close();break;case 0:case 500:this.onerror(),this.closeAndRetry();break;default:throw new Error(`unhandled poll status ${e}`)}})}send(t){Ct.request("POST",this.endpointURL(),"application/json",t,this.timeout,this.onerror.bind(this,"timeout"),e=>{(!e||e.status!==200)&&(this.onerror(e&&e.status),this.closeAndRetry())})}close(t,e){this.readyState=le.closed,this.onclose()}};var ur={HEADER_LENGTH:1,META_LENGTH:4,KINDS:{push:0,reply:1,broadcast:2},encode(t,e){if(t.payload.constructor===ArrayBuffer)return e(this.binaryEncode(t));{let r=[t.join_ref,t.ref,t.topic,t.event,t.payload];return e(JSON.stringify(r))}},decode(t,e){if(t.constructor===ArrayBuffer)return e(this.binaryDecode(t));{let[r,i,n,s,o]=JSON.parse(t);return e({join_ref:r,ref:i,topic:n,event:s,payload:o})}},binaryEncode(t){let{join_ref:e,ref:r,event:i,topic:n,payload:s}=t,o=this.META_LENGTH+e.length+r.length+n.length+i.length,a=new ArrayBuffer(this.HEADER_LENGTH+o),l=new DataView(a),u=0;l.setUint8(u++,this.KINDS.push),l.setUint8(u++,e.length),l.setUint8(u++,r.length),l.setUint8(u++,n.length),l.setUint8(u++,i.length),Array.from(e,h=>l.setUint8(u++,h.charCodeAt(0))),Array.from(r,h=>l.setUint8(u++,h.charCodeAt(0))),Array.from(n,h=>l.setUint8(u++,h.charCodeAt(0))),Array.from(i,h=>l.setUint8(u++,h.charCodeAt(0)));var c=new Uint8Array(a.byteLength+s.byteLength);return c.set(new Uint8Array(a),0),c.set(new Uint8Array(s),a.byteLength),c.buffer},binaryDecode(t){let e=new DataView(t),r=e.getUint8(0),i=new TextDecoder;switch(r){case this.KINDS.push:return this.decodePush(t,e,i);case this.KINDS.reply:return this.decodeReply(t,e,i);case this.KINDS.broadcast:return this.decodeBroadcast(t,e,i)}},decodePush(t,e,r){let i=e.getUint8(1),n=e.getUint8(2),s=e.getUint8(3),o=this.HEADER_LENGTH+this.META_LENGTH-1,a=r.decode(t.slice(o,o+i));o=o+i;let l=r.decode(t.slice(o,o+n));o=o+n;let u=r.decode(t.slice(o,o+s));o=o+s;let c=t.slice(o,t.byteLength);return{join_ref:a,ref:null,topic:l,event:u,payload:c}},decodeReply(t,e,r){let i=e.getUint8(1),n=e.getUint8(2),s=e.getUint8(3),o=e.getUint8(4),a=this.HEADER_LENGTH+this.META_LENGTH,l=r.decode(t.slice(a,a+i));a=a+i;let u=r.decode(t.slice(a,a+n));a=a+n;let c=r.decode(t.slice(a,a+s));a=a+s;let h=r.decode(t.slice(a,a+o));a=a+o;let d=t.slice(a,t.byteLength),m={status:h,response:d};return{join_ref:l,ref:u,topic:c,event:V.reply,payload:m}},decodeBroadcast(t,e,r){let i=e.getUint8(1),n=e.getUint8(2),s=this.HEADER_LENGTH+2,o=r.decode(t.slice(s,s+i));s=s+i;let a=r.decode(t.slice(s,s+n));s=s+n;let l=t.slice(s,t.byteLength);return{join_ref:null,ref:null,topic:o,event:a,payload:l}}},mo=class{constructor(t,e={}){this.stateChangeCallbacks={open:[],close:[],error:[],message:[]},this.channels=[],this.sendBuffer=[],this.ref=0,this.timeout=e.timeout||Pc,this.transport=e.transport||ar.WebSocket||fo,this.establishedConnections=0,this.defaultEncoder=ur.encode.bind(ur),this.defaultDecoder=ur.decode.bind(ur),this.closeWasClean=!1,this.binaryType=e.binaryType||"arraybuffer",this.connectClock=1,this.transport!==fo?(this.encode=e.encode||this.defaultEncoder,this.decode=e.decode||this.defaultDecoder):(this.encode=this.defaultEncoder,this.decode=this.defaultDecoder);let r=null;Ot&&Ot.addEventListener&&(Ot.addEventListener("pagehide",i=>{this.conn&&(this.disconnect(),r=this.connectClock)}),Ot.addEventListener("pageshow",i=>{r===this.connectClock&&(r=null,this.connect())})),this.heartbeatIntervalMs=e.heartbeatIntervalMs||3e4,this.rejoinAfterMs=i=>e.rejoinAfterMs?e.rejoinAfterMs(i):[1e3,2e3,5e3][i-1]||1e4,this.reconnectAfterMs=i=>e.reconnectAfterMs?e.reconnectAfterMs(i):[10,50,100,150,200,250,500,1e3,2e3][i-1]||5e3,this.logger=e.logger||null,this.longpollerTimeout=e.longpollerTimeout||2e4,this.params=At(e.params||{}),this.endPoint=`${t}/${si.websocket}`,this.vsn=e.vsn||Ic,this.heartbeatTimer=null,this.pendingHeartbeatRef=null,this.reconnectTimer=new ho(()=>{this.teardown(()=>this.connect())},this.reconnectAfterMs)}replaceTransport(t){this.disconnect(),this.transport=t}protocol(){return location.protocol.match(/^https/)?"wss":"ws"}endPointURL(){let t=Ct.appendParams(Ct.appendParams(this.endPoint,this.params()),{vsn:this.vsn});return t.charAt(0)!=="/"?t:t.charAt(1)==="/"?`${this.protocol()}:${t}`:`${this.protocol()}://${location.host}${t}`}disconnect(t,e,r){this.connectClock++,this.closeWasClean=!0,this.reconnectTimer.reset(),this.teardown(t,e,r)}connect(t){this.connectClock++,t&&(console&&console.log("passing params to connect is deprecated. Instead pass :params to the Socket constructor"),this.params=At(t)),!this.conn&&(this.closeWasClean=!1,this.conn=new this.transport(this.endPointURL()),this.conn.binaryType=this.binaryType,this.conn.timeout=this.longpollerTimeout,this.conn.onopen=()=>this.onConnOpen(),this.conn.onerror=e=>this.onConnError(e),this.conn.onmessage=e=>this.onConnMessage(e),this.conn.onclose=e=>this.onConnClose(e))}log(t,e,r){this.logger(t,e,r)}hasLogger(){return this.logger!==null}onOpen(t){let e=this.makeRef();return this.stateChangeCallbacks.open.push([e,t]),e}onClose(t){let e=this.makeRef();return this.stateChangeCallbacks.close.push([e,t]),e}onError(t){let e=this.makeRef();return this.stateChangeCallbacks.error.push([e,t]),e}onMessage(t){let e=this.makeRef();return this.stateChangeCallbacks.message.push([e,t]),e}onConnOpen(){this.hasLogger()&&this.log("transport",`connected to ${this.endPointURL()}`),this.closeWasClean=!1,this.establishedConnections++,this.flushSendBuffer(),this.reconnectTimer.reset(),this.resetHeartbeat(),this.stateChangeCallbacks.open.forEach(([,t])=>t())}heartbeatTimeout(){this.pendingHeartbeatRef&&(this.pendingHeartbeatRef=null,this.hasLogger()&&this.log("transport","heartbeat timeout. Attempting to re-establish connection"),this.abnormalClose("heartbeat timeout"))}resetHeartbeat(){this.conn&&this.conn.skipHeartbeat||(this.pendingHeartbeatRef=null,clearTimeout(this.heartbeatTimer),setTimeout(()=>this.sendHeartbeat(),this.heartbeatIntervalMs))}teardown(t,e,r){if(!this.conn)return t&&t();this.waitForBufferDone(()=>{this.conn&&(e?this.conn.close(e,r||""):this.conn.close()),this.waitForSocketClosed(()=>{this.conn&&(this.conn.onclose=function(){},this.conn=null),t&&t()})})}waitForBufferDone(t,e=1){if(e===5||!this.conn||!this.conn.bufferedAmount){t();return}setTimeout(()=>{this.waitForBufferDone(t,e+1)},150*e)}waitForSocketClosed(t,e=1){if(e===5||!this.conn||this.conn.readyState===le.closed){t();return}setTimeout(()=>{this.waitForSocketClosed(t,e+1)},150*e)}onConnClose(t){this.hasLogger()&&this.log("transport","close",t),this.triggerChanError(),clearTimeout(this.heartbeatTimer),this.closeWasClean||this.reconnectTimer.scheduleTimeout(),this.stateChangeCallbacks.close.forEach(([,e])=>e(t))}onConnError(t){this.hasLogger()&&this.log("transport",t);let e=this.transport,r=this.establishedConnections;this.stateChangeCallbacks.error.forEach(([,i])=>{i(t,e,r)}),(e===this.transport||r>0)&&this.triggerChanError()}triggerChanError(){this.channels.forEach(t=>{t.isErrored()||t.isLeaving()||t.isClosed()||t.trigger(V.error)})}connectionState(){switch(this.conn&&this.conn.readyState){case le.connecting:return"connecting";case le.open:return"open";case le.closing:return"closing";default:return"closed"}}isConnected(){return this.connectionState()==="open"}remove(t){this.off(t.stateChangeRefs),this.channels=this.channels.filter(e=>e.joinRef()!==t.joinRef())}off(t){for(let e in this.stateChangeCallbacks)this.stateChangeCallbacks[e]=this.stateChangeCallbacks[e].filter(([r])=>t.indexOf(r)===-1)}channel(t,e={}){let r=new Dc(t,e,this);return this.channels.push(r),r}push(t){if(this.hasLogger()){let{topic:e,event:r,payload:i,ref:n,join_ref:s}=t;this.log("push",`${e} ${r} (${s}, ${n})`,i)}this.isConnected()?this.encode(t,e=>this.conn.send(e)):this.sendBuffer.push(()=>this.encode(t,e=>this.conn.send(e)))}makeRef(){let t=this.ref+1;return t===this.ref?this.ref=0:this.ref=t,this.ref.toString()}sendHeartbeat(){this.pendingHeartbeatRef&&!this.isConnected()||(this.pendingHeartbeatRef=this.makeRef(),this.push({topic:"phoenix",event:"heartbeat",payload:{},ref:this.pendingHeartbeatRef}),this.heartbeatTimer=setTimeout(()=>this.heartbeatTimeout(),this.heartbeatIntervalMs))}abnormalClose(t){this.closeWasClean=!1,this.isConnected()&&this.conn.close(Mc,t)}flushSendBuffer(){this.isConnected()&&this.sendBuffer.length>0&&(this.sendBuffer.forEach(t=>t()),this.sendBuffer=[])}onConnMessage(t){this.decode(t.data,e=>{let{topic:r,event:i,payload:n,ref:s,join_ref:o}=e;s&&s===this.pendingHeartbeatRef&&(clearTimeout(this.heartbeatTimer),this.pendingHeartbeatRef=null,setTimeout(()=>this.sendHeartbeat(),this.heartbeatIntervalMs)),this.hasLogger()&&this.log("receive",`${n.status||""} ${r} ${i} ${s&&"("+s+")"||""}`,n);for(let a=0;a<this.channels.length;a++){let l=this.channels[a];!l.isMember(r,i,n,o)||l.trigger(i,n,s,o)}for(let a=0;a<this.stateChangeCallbacks.message.length;a++){let[,l]=this.stateChangeCallbacks.message[a];l(e)}})}leaveOpenTopic(t){let e=this.channels.find(r=>r.topic===t&&(r.isJoined()||r.isJoining()));e&&(this.hasLogger()&&this.log("transport",`leaving duplicate topic "${t}"`),e.leave())}};var po="consecutive-reloads",go=10,xc=[1e3,3e3],Nc=3e4,vo=["phx-click-loading","phx-change-loading","phx-submit-loading","phx-keydown-loading","phx-keyup-loading","phx-blur-loading","phx-focus-loading"],G="data-phx-component",oi="data-phx-link",_c="track-static",Fc="data-phx-link-state",ue="data-phx-ref",yo="track-uploads",je="data-phx-upload-ref",ai="data-phx-preflighted-refs",Hc="data-phx-done-refs",bo="drop-target",li="data-phx-active-refs",ui="phx:live-file:updated",ci="data-phx-skip",wo="data-phx-remove",So="page-loading",Eo="phx-connected",cr="phx-disconnected",To="phx-no-feedback",ko="phx-error",Lt="data-phx-parent-id",Ao="data-phx-main",hr="data-phx-root-id",Vc="trigger-action",Oo="feedback-for",Co="phx-has-focused",Bc=["text","textarea","number","email","password","search","tel","url","date","time"],Lo=["checkbox","radio"],Io="phx-has-submitted",Pe="data-phx-session",lt=`[${Pe}]`,It="data-phx-static",hi="data-phx-readonly",dr="data-phx-disabled",di="disable-with",fr="data-phx-disable-with-restore",mr="hook",jc="debounce",Uc="throttle",fi="update",qc="key",ce="phxPrivate",Po="auto-recover",mi="phx:live-socket:debug",pi="phx:live-socket:profiling",gi="phx:live-socket:latency-sim",$c="progress",Wc=1,zc=200,Zc="phx-",Jc=3e4,Pt="debounce-trigger",pr="throttled",Mo="debounce-prev-key",Kc={debounce:300,throttle:300},Ro="d",he="s",$="c",Do="e",xo="r",No="t",Gc=class{constructor(t,e,r){this.liveSocket=r,this.entry=t,this.offset=0,this.chunkSize=e,this.chunkTimer=null,this.uploadChannel=r.channel(`lvu:${t.ref}`,{token:t.metadata()})}error(t){clearTimeout(this.chunkTimer),this.uploadChannel.leave(),this.entry.error(t)}upload(){this.uploadChannel.onError(t=>this.error(t)),this.uploadChannel.join().receive("ok",t=>this.readNextChunk()).receive("error",t=>this.error(t))}isDone(){return this.offset>=this.entry.file.size}readNextChunk(){let t=new window.FileReader,e=this.entry.file.slice(this.offset,this.chunkSize+this.offset);t.onload=r=>{if(r.target.error===null)this.offset+=r.target.result.byteLength,this.pushChunk(r.target.result);else return R("Read error: "+r.target.error)},t.readAsArrayBuffer(e)}pushChunk(t){!this.uploadChannel.isJoined()||this.uploadChannel.push("chunk",t).receive("ok",()=>{this.entry.progress(this.offset/this.entry.file.size*100),this.isDone()||(this.chunkTimer=setTimeout(()=>this.readNextChunk(),this.liveSocket.getLatencySim()||0))})}},R=(t,e)=>console.error&&console.error(t,e);function Yc(){let t=new Set,e=document.querySelectorAll("*[id]");for(let r=0,i=e.length;r<i;r++)t.has(e[r].id)?console.error(`Multiple IDs detected: ${e[r].id}. Ensure unique element ids.`):t.add(e[r].id)}var Xc=(t,e,r,i)=>{t.liveSocket.isDebugEnabled()&&console.log(`${t.id} ${e}: ${r} - `,i)},vi=t=>typeof t=="function"?t:function(){return t},Mt=t=>JSON.parse(JSON.stringify(t)),Rt=(t,e,r)=>{do{if(t.matches(`[${e}]`))return t;t=t.parentElement||t.parentNode}while(t!==null&&t.nodeType===1&&!(r&&r.isSameNode(t)||t.matches(lt)));return null},Dt=t=>t!==null&&typeof t=="object"&&!(t instanceof Array),Qc=(t,e)=>JSON.stringify(t)===JSON.stringify(e),_o=t=>{for(let e in t)return!1;return!0},ye=(t,e)=>t&&e(t),eh=function(t,e,r,i){t.forEach(n=>{new Gc(n,r.config.chunk_size,i).upload()})},Fo={canPushState(){return typeof history.pushState!="undefined"},dropLocal(t,e,r){return t.removeItem(this.localKey(e,r))},updateLocal(t,e,r,i,n){let s=this.getLocal(t,e,r),o=this.localKey(e,r),a=s===null?i:n(s);return t.setItem(o,JSON.stringify(a)),a},getLocal(t,e,r){return JSON.parse(t.getItem(this.localKey(e,r)))},updateCurrentState(t){!this.canPushState()||history.replaceState(t(history.state||{}),"",window.location.href)},pushState(t,e,r){if(this.canPushState()){if(r!==window.location.href){if(e.type=="redirect"&&e.scroll){let n=history.state||{};n.scroll=e.scroll,history.replaceState(n,"",window.location.href)}delete e.scroll,history[t+"State"](e,"",r||null);let i=this.getHashTargetEl(window.location.hash);i?i.scrollIntoView():e.type==="redirect"&&window.scroll(0,0)}}else this.redirect(r)},setCookie(t,e){document.cookie=`${t}=${e}`},getCookie(t){return document.cookie.replace(new RegExp(`(?:(?:^|.*;s*)${t}s*=s*([^;]*).*$)|^.*$`),"$1")},redirect(t,e){e&&Fo.setCookie("__phoenix_flash__",e+"; max-age=60000; path=/"),window.location=t},localKey(t,e){return`${t}-${e}`},getHashTargetEl(t){let e=t.toString().substring(1);if(e!=="")return document.getElementById(e)||document.querySelector(`a[name="${e}"]`)}},Me=Fo,be={byId(t){return document.getElementById(t)||R(`no id found for ${t}`)},removeClass(t,e){t.classList.remove(e),t.classList.length===0&&t.removeAttribute("class")},all(t,e,r){if(!t)return[];let i=Array.from(t.querySelectorAll(e));return r?i.forEach(r):i},childNodeLength(t){let e=document.createElement("template");return e.innerHTML=t,e.content.childElementCount},isUploadInput(t){return t.type==="file"&&t.getAttribute(je)!==null},findUploadInputs(t){return this.all(t,`input[type="file"][${je}]`)},findComponentNodeList(t,e){return this.filterWithinSameLiveView(this.all(t,`[${G}="${e}"]`),t)},isPhxDestroyed(t){return!!(t.id&&be.private(t,"destroyed"))},markPhxChildDestroyed(t){t.setAttribute(Pe,""),this.putPrivate(t,"destroyed",!0)},findPhxChildrenInFragment(t,e){let r=document.createElement("template");return r.innerHTML=t,this.findPhxChildren(r.content,e)},isIgnored(t,e){return(t.getAttribute(e)||t.getAttribute("data-phx-update"))==="ignore"},isPhxUpdate(t,e,r){return t.getAttribute&&r.indexOf(t.getAttribute(e))>=0},findPhxChildren(t,e){return this.all(t,`${lt}[${Lt}="${e}"]`)},findParentCIDs(t,e){let r=new Set(e);return e.reduce((i,n)=>{let s=`[${G}="${n}"] [${G}]`;return this.filterWithinSameLiveView(this.all(t,s),t).map(o=>parseInt(o.getAttribute(G))).forEach(o=>i.delete(o)),i},r)},filterWithinSameLiveView(t,e){return e.querySelector(lt)?t.filter(r=>this.withinSameLiveView(r,e)):t},withinSameLiveView(t,e){for(;t=t.parentNode;){if(t.isSameNode(e))return!0;if(t.getAttribute(Pe)!==null)return!1}},private(t,e){return t[ce]&&t[ce][e]},deletePrivate(t,e){t[ce]&&delete t[ce][e]},putPrivate(t,e,r){t[ce]||(t[ce]={}),t[ce][e]=r},copyPrivates(t,e){e[ce]&&(t[ce]=Mt(e[ce]))},putTitle(t){let e=document.querySelector("title"),{prefix:r,suffix:i}=e.dataset;document.title=`${r||""}${t}${i||""}`},debounce(t,e,r,i,n,s,o){let a=t.getAttribute(r),l=t.getAttribute(n);a===""&&(a=i),l===""&&(l=s);let u=a||l;switch(u){case null:return o();case"blur":this.once(t,"debounce-blur")&&t.addEventListener("blur",()=>o());return;default:let c=parseInt(u),h=()=>l?this.deletePrivate(t,pr):o(),d=this.incCycle(t,Pt,h);if(isNaN(c))return R(`invalid throttle/debounce value: ${u}`);if(l){let p=!1;if(e.type==="keydown"){let y=this.private(t,Mo);this.putPrivate(t,Mo,e.key),p=y!==e.key}if(!p&&this.private(t,pr))return!1;o(),this.putPrivate(t,pr,!0),setTimeout(()=>this.triggerCycle(t,Pt),c)}else setTimeout(()=>this.triggerCycle(t,Pt,d),c);let m=t.form;m&&this.once(m,"bind-debounce")&&m.addEventListener("submit",()=>{Array.from(new FormData(m).entries(),([p])=>{let y=m.querySelector(`[name="${p}"]`);this.incCycle(y,Pt),this.deletePrivate(y,pr)})}),this.once(t,"bind-debounce")&&t.addEventListener("blur",()=>this.triggerCycle(t,Pt))}},triggerCycle(t,e,r){let[i,n]=this.private(t,e);r||(r=i),r===i&&(this.incCycle(t,e),n())},once(t,e){return this.private(t,e)===!0?!1:(this.putPrivate(t,e,!0),!0)},incCycle(t,e,r=function(){}){let[i]=this.private(t,e)||[0,r];return i++,this.putPrivate(t,e,[i,r]),i},discardError(t,e,r){let i=e.getAttribute&&e.getAttribute(r),n=i&&t.querySelector(`[id="${i}"], [name="${i}"]`);!n||this.private(n,Co)||this.private(n.form,Io)||e.classList.add(To)},showError(t,e){(t.id||t.name)&&this.all(t.form,`[${e}="${t.id}"], [${e}="${t.name}"]`,r=>{this.removeClass(r,To)})},isPhxChild(t){return t.getAttribute&&t.getAttribute(Lt)},dispatchEvent(t,e,r={}){let i=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:r});t.dispatchEvent(i)},cloneNode(t,e){if(typeof e=="undefined")return t.cloneNode(!0);{let r=t.cloneNode(!1);return r.innerHTML=e,r}},mergeAttrs(t,e,r={}){let i=r.exclude||[],n=r.isIgnored,s=e.attributes;for(let a=s.length-1;a>=0;a--){let l=s[a].name;i.indexOf(l)<0&&t.setAttribute(l,e.getAttribute(l))}let o=t.attributes;for(let a=o.length-1;a>=0;a--){let l=o[a].name;n?l.startsWith("data-")&&!e.hasAttribute(l)&&t.removeAttribute(l):e.hasAttribute(l)||t.removeAttribute(l)}},mergeFocusedInput(t,e){t instanceof HTMLSelectElement||be.mergeAttrs(t,e,{except:["value"]}),e.readOnly?t.setAttribute("readonly",!0):t.removeAttribute("readonly")},hasSelectionRange(t){return t.setSelectionRange&&(t.type==="text"||t.type==="textarea")},restoreFocus(t,e,r){if(!be.isTextualInput(t))return;let i=t.matches(":focus");t.readOnly&&t.blur(),i||t.focus(),this.hasSelectionRange(t)&&t.setSelectionRange(e,r)},isFormInput(t){return/^(?:input|select|textarea)$/i.test(t.tagName)&&t.type!=="button"},syncAttrsToProps(t){t instanceof HTMLInputElement&&Lo.indexOf(t.type.toLocaleLowerCase())>=0&&(t.checked=t.getAttribute("checked")!==null)},syncPropsToAttrs(t){if(t instanceof HTMLSelectElement){let e=t.options.item(t.selectedIndex);e&&e.getAttribute("selected")===null&&e.setAttribute("selected","")}},isTextualInput(t){return Bc.indexOf(t.type)>=0},isNowTriggerFormExternal(t,e){return t.getAttribute&&t.getAttribute(e)!==null},syncPendingRef(t,e,r){let i=t.getAttribute(ue);return i===null?!0:be.isFormInput(t)||t.getAttribute(r)!==null?(be.isUploadInput(t)&&be.mergeAttrs(t,e,{isIgnored:!0}),be.putPrivate(t,ue,e),!1):(vo.forEach(n=>{t.classList.contains(n)&&e.classList.add(n)}),e.setAttribute(ue,i),!0)},cleanChildNodes(t,e){if(be.isPhxUpdate(t,e,["append","prepend"])){let r=[];t.childNodes.forEach(i=>{i.id||(i.nodeType===Node.TEXT_NODE&&i.nodeValue.trim()===""||R(`only HTML element tags with an id are allowed inside containers with phx-update.

removing illegal node: "${(i.outerHTML||i.nodeValue).trim()}"

`),r.push(i))}),r.forEach(i=>i.remove())}},replaceRootContainer(t,e,r){let i=new Set(["id",Pe,It,Ao]);if(t.tagName.toLowerCase()===e.toLowerCase())return Array.from(t.attributes).filter(n=>!i.has(n.name.toLowerCase())).forEach(n=>t.removeAttribute(n.name)),Object.keys(r).filter(n=>!i.has(n.toLowerCase())).forEach(n=>t.setAttribute(n,r[n])),t;{let n=document.createElement(e);return Object.keys(r).forEach(s=>n.setAttribute(s,r[s])),i.forEach(s=>n.setAttribute(s,t.getAttribute(s))),n.innerHTML=t.innerHTML,t.replaceWith(n),n}}},g=be,yi=class{static isActive(t,e){let r=e._phxRef===void 0,n=t.getAttribute(li).split(",").indexOf(D.genFileRef(e))>=0;return e.size>0&&(r||n)}static isPreflighted(t,e){return t.getAttribute(ai).split(",").indexOf(D.genFileRef(e))>=0&&this.isActive(t,e)}constructor(t,e,r){this.ref=D.genFileRef(e),this.fileEl=t,this.file=e,this.view=r,this.meta=null,this._isCancelled=!1,this._isDone=!1,this._progress=0,this._lastProgressSent=-1,this._onDone=function(){},this._onElUpdated=this.onElUpdated.bind(this),this.fileEl.addEventListener(ui,this._onElUpdated)}metadata(){return this.meta}progress(t){this._progress=Math.floor(t),this._progress>this._lastProgressSent&&(this._progress>=100?(this._progress=100,this._lastProgressSent=100,this._isDone=!0,this.view.pushFileProgress(this.fileEl,this.ref,100,()=>{D.untrackFile(this.fileEl,this.file),this._onDone()})):(this._lastProgressSent=this._progress,this.view.pushFileProgress(this.fileEl,this.ref,this._progress)))}cancel(){this._isCancelled=!0,this._isDone=!0,this._onDone()}isDone(){return this._isDone}error(t="failed"){this.view.pushFileProgress(this.fileEl,this.ref,{error:t}),D.clearFiles(this.fileEl)}onDone(t){this._onDone=()=>{this.fileEl.removeEventListener(ui,this._onElUpdated),t()}}onElUpdated(){this.fileEl.getAttribute(li).split(",").indexOf(this.ref)===-1&&this.cancel()}toPreflightPayload(){return{last_modified:this.file.lastModified,name:this.file.name,size:this.file.size,type:this.file.type,ref:this.ref}}uploader(t){if(this.meta.uploader){let e=t[this.meta.uploader]||R(`no uploader configured for ${this.meta.uploader}`);return{name:this.meta.uploader,callback:e}}else return{name:"channel",callback:eh}}zipPostFlight(t){this.meta=t.entries[this.ref],this.meta||R(`no preflight upload response returned with ref ${this.ref}`,{input:this.fileEl,response:t})}},th=0,D=class{static genFileRef(t){let e=t._phxRef;return e!==void 0?e:(t._phxRef=(th++).toString(),t._phxRef)}static getEntryDataURL(t,e,r){let i=this.activeFiles(t).find(n=>this.genFileRef(n)===e);r(URL.createObjectURL(i))}static hasUploadsInProgress(t){let e=0;return g.findUploadInputs(t).forEach(r=>{r.getAttribute(ai)!==r.getAttribute(Hc)&&e++}),e>0}static serializeUploads(t){let e=this.activeFiles(t),r={};return e.forEach(i=>{let n={path:t.name},s=t.getAttribute(je);r[s]=r[s]||[],n.ref=this.genFileRef(i),n.name=i.name||n.ref,n.type=i.type,n.size=i.size,r[s].push(n)}),r}static clearFiles(t){t.value=null,t.removeAttribute(je),g.putPrivate(t,"files",[])}static untrackFile(t,e){g.putPrivate(t,"files",g.private(t,"files").filter(r=>!Object.is(r,e)))}static trackFiles(t,e){if(t.getAttribute("multiple")!==null){let r=e.filter(i=>!this.activeFiles(t).find(n=>Object.is(n,i)));g.putPrivate(t,"files",this.activeFiles(t).concat(r)),t.value=null}else g.putPrivate(t,"files",e)}static activeFileInputs(t){let e=g.findUploadInputs(t);return Array.from(e).filter(r=>r.files&&this.activeFiles(r).length>0)}static activeFiles(t){return(g.private(t,"files")||[]).filter(e=>yi.isActive(t,e))}static inputsAwaitingPreflight(t){let e=g.findUploadInputs(t);return Array.from(e).filter(r=>this.filesAwaitingPreflight(r).length>0)}static filesAwaitingPreflight(t){return this.activeFiles(t).filter(e=>!yi.isPreflighted(t,e))}constructor(t,e,r){this.view=e,this.onComplete=r,this._entries=Array.from(D.filesAwaitingPreflight(t)||[]).map(i=>new yi(t,i,e)),this.numEntriesInProgress=this._entries.length}entries(){return this._entries}initAdapterUpload(t,e,r){this._entries=this._entries.map(n=>(n.zipPostFlight(t),n.onDone(()=>{this.numEntriesInProgress--,this.numEntriesInProgress===0&&this.onComplete()}),n));let i=this._entries.reduce((n,s)=>{let{name:o,callback:a}=s.uploader(r.uploaders);return n[o]=n[o]||{callback:a,entries:[]},n[o].entries.push(s),n},{});for(let n in i){let{callback:s,entries:o}=i[n];s(o,e,t,r)}}},rh={LiveFileUpload:{activeRefs(){return this.el.getAttribute(li)},preflightedRefs(){return this.el.getAttribute(ai)},mounted(){this.preflightedWas=this.preflightedRefs()},updated(){let t=this.preflightedRefs();this.preflightedWas!==t&&(this.preflightedWas=t,t===""&&this.__view.cancelSubmit(this.el.form)),this.activeRefs()===""&&(this.el.value=null),this.el.dispatchEvent(new CustomEvent(ui))}},LiveImgPreview:{mounted(){this.ref=this.el.getAttribute("data-phx-entry-ref"),this.inputEl=document.getElementById(this.el.getAttribute(je)),D.getEntryDataURL(this.inputEl,this.ref,t=>{this.url=t,this.el.src=t})},destroyed(){URL.revokeObjectURL(this.url)}}},ih=rh,nh=class{constructor(t,e,r){let i=new Set,n=new Set([...e.children].map(o=>o.id)),s=[];Array.from(t.children).forEach(o=>{if(o.id&&(i.add(o.id),n.has(o.id))){let a=o.previousElementSibling&&o.previousElementSibling.id;s.push({elementId:o.id,previousElementId:a})}}),this.containerId=e.id,this.updateType=r,this.elementsToModify=s,this.elementIdsToAdd=[...n].filter(o=>!i.has(o))}perform(){let t=g.byId(this.containerId);this.elementsToModify.forEach(e=>{e.previousElementId?ye(document.getElementById(e.previousElementId),r=>{ye(document.getElementById(e.elementId),i=>{i.previousElementSibling&&i.previousElementSibling.id==r.id||r.insertAdjacentElement("afterend",i)})}):ye(document.getElementById(e.elementId),r=>{r.previousElementSibling==null||t.insertAdjacentElement("afterbegin",r)})}),this.updateType=="prepend"&&this.elementIdsToAdd.reverse().forEach(e=>{ye(document.getElementById(e),r=>t.insertAdjacentElement("afterbegin",r))})}},Ho=11;function sh(t,e){var r=e.attributes,i,n,s,o,a;if(!(e.nodeType===Ho||t.nodeType===Ho)){for(var l=r.length-1;l>=0;l--)i=r[l],n=i.name,s=i.namespaceURI,o=i.value,s?(n=i.localName||n,a=t.getAttributeNS(s,n),a!==o&&(i.prefix==="xmlns"&&(n=i.name),t.setAttributeNS(s,n,o))):(a=t.getAttribute(n),a!==o&&t.setAttribute(n,o));for(var u=t.attributes,c=u.length-1;c>=0;c--)i=u[c],n=i.name,s=i.namespaceURI,s?(n=i.localName||n,e.hasAttributeNS(s,n)||t.removeAttributeNS(s,n)):e.hasAttribute(n)||t.removeAttribute(n)}}var gr,oh="http://www.w3.org/1999/xhtml",B=typeof document=="undefined"?void 0:document,ah=!!B&&"content"in B.createElement("template"),lh=!!B&&B.createRange&&"createContextualFragment"in B.createRange();function uh(t){var e=B.createElement("template");return e.innerHTML=t,e.content.childNodes[0]}function ch(t){gr||(gr=B.createRange(),gr.selectNode(B.body));var e=gr.createContextualFragment(t);return e.childNodes[0]}function hh(t){var e=B.createElement("body");return e.innerHTML=t,e.childNodes[0]}function dh(t){return t=t.trim(),ah?uh(t):lh?ch(t):hh(t)}function vr(t,e){var r=t.nodeName,i=e.nodeName,n,s;return r===i?!0:(n=r.charCodeAt(0),s=i.charCodeAt(0),n<=90&&s>=97?r===i.toUpperCase():s<=90&&n>=97?i===r.toUpperCase():!1)}function fh(t,e){return!e||e===oh?B.createElement(t):B.createElementNS(e,t)}function mh(t,e){for(var r=t.firstChild;r;){var i=r.nextSibling;e.appendChild(r),r=i}return e}function bi(t,e,r){t[r]!==e[r]&&(t[r]=e[r],t[r]?t.setAttribute(r,""):t.removeAttribute(r))}var Vo={OPTION:function(t,e){var r=t.parentNode;if(r){var i=r.nodeName.toUpperCase();i==="OPTGROUP"&&(r=r.parentNode,i=r&&r.nodeName.toUpperCase()),i==="SELECT"&&!r.hasAttribute("multiple")&&(t.hasAttribute("selected")&&!e.selected&&(t.setAttribute("selected","selected"),t.removeAttribute("selected")),r.selectedIndex=-1)}bi(t,e,"selected")},INPUT:function(t,e){bi(t,e,"checked"),bi(t,e,"disabled"),t.value!==e.value&&(t.value=e.value),e.hasAttribute("value")||t.removeAttribute("value")},TEXTAREA:function(t,e){var r=e.value;t.value!==r&&(t.value=r);var i=t.firstChild;if(i){var n=i.nodeValue;if(n==r||!r&&n==t.placeholder)return;i.nodeValue=r}},SELECT:function(t,e){if(!e.hasAttribute("multiple")){for(var r=-1,i=0,n=t.firstChild,s,o;n;)if(o=n.nodeName&&n.nodeName.toUpperCase(),o==="OPTGROUP")s=n,n=s.firstChild;else{if(o==="OPTION"){if(n.hasAttribute("selected")){r=i;break}i++}n=n.nextSibling,!n&&s&&(n=s.nextSibling,s=null)}t.selectedIndex=r}}},xt=1,ph=11,Bo=3,jo=8;function Ue(){}function gh(t){if(t)return t.getAttribute&&t.getAttribute("id")||t.id}function vh(t){return function(r,i,n){if(n||(n={}),typeof i=="string")if(r.nodeName==="#document"||r.nodeName==="HTML"||r.nodeName==="BODY"){var s=i;i=B.createElement("html"),i.innerHTML=s}else i=dh(i);var o=n.getNodeKey||gh,a=n.onBeforeNodeAdded||Ue,l=n.onNodeAdded||Ue,u=n.onBeforeElUpdated||Ue,c=n.onElUpdated||Ue,h=n.onBeforeNodeDiscarded||Ue,d=n.onNodeDiscarded||Ue,m=n.onBeforeElChildrenUpdated||Ue,p=n.childrenOnly===!0,y=Object.create(null),b=[];function f(T){b.push(T)}function S(T,E){if(T.nodeType===xt)for(var w=T.firstChild;w;){var C=void 0;E&&(C=o(w))?f(C):(d(w),w.firstChild&&S(w,E)),w=w.nextSibling}}function ie(T,E,w){h(T)!==!1&&(E&&E.removeChild(T),d(T),S(T,w))}function de(T){if(T.nodeType===xt||T.nodeType===ph)for(var E=T.firstChild;E;){var w=o(E);w&&(y[w]=E),de(E),E=E.nextSibling}}de(r);function qe(T){l(T);for(var E=T.firstChild;E;){var w=E.nextSibling,C=o(E);if(C){var Y=y[C];Y&&vr(E,Y)?(E.parentNode.replaceChild(Y,E),$e(Y,E)):qe(E)}else qe(E);E=w}}function Re(T,E,w){for(;E;){var C=E.nextSibling;(w=o(E))?f(w):ie(E,T,!0),E=C}}function $e(T,E,w){var C=o(E);C&&delete y[C],!(!w&&(u(T,E)===!1||(t(T,E),c(T),m(T,E)===!1)))&&(T.nodeName!=="TEXTAREA"?br(T,E):Vo.TEXTAREA(T,E))}function br(T,E){var w=E.firstChild,C=T.firstChild,Y,we,ze,_t,Se;e:for(;w;){for(_t=w.nextSibling,Y=o(w);C;){if(ze=C.nextSibling,w.isSameNode&&w.isSameNode(C)){w=_t,C=ze;continue e}we=o(C);var Ft=C.nodeType,Ee=void 0;if(Ft===w.nodeType&&(Ft===xt?(Y?Y!==we&&((Se=y[Y])?ze===Se?Ee=!1:(T.insertBefore(Se,C),we?f(we):ie(C,T,!0),C=Se):Ee=!1):we&&(Ee=!1),Ee=Ee!==!1&&vr(C,w),Ee&&$e(C,w)):(Ft===Bo||Ft==jo)&&(Ee=!0,C.nodeValue!==w.nodeValue&&(C.nodeValue=w.nodeValue))),Ee){w=_t,C=ze;continue e}we?f(we):ie(C,T,!0),C=ze}if(Y&&(Se=y[Y])&&vr(Se,w))T.appendChild(Se),$e(Se,w);else{var Sr=a(w);Sr!==!1&&(Sr&&(w=Sr),w.actualize&&(w=w.actualize(T.ownerDocument||B)),T.appendChild(w),qe(w))}w=_t,C=ze}Re(T,C,we);var Ti=Vo[T.nodeName];Ti&&Ti(T,E)}var P=r,We=P.nodeType,ut=i.nodeType;if(!p){if(We===xt)ut===xt?vr(r,i)||(d(r),P=mh(r,fh(i.nodeName,i.namespaceURI))):P=i;else if(We===Bo||We===jo){if(ut===We)return P.nodeValue!==i.nodeValue&&(P.nodeValue=i.nodeValue),P;P=i}}if(P===i)d(r);else{if(i.isSameNode&&i.isSameNode(P))return;if($e(P,i,p),b)for(var ct=0,wr=b.length;ct<wr;ct++){var De=y[b[ct]];De&&ie(De,De.parentNode,!1)}}return!p&&P!==r&&r.parentNode&&(P.actualize&&(P=P.actualize(r.ownerDocument||B)),r.parentNode.replaceChild(P,r)),P}}var yh=vh(sh),Uo=yh,yr=class{static patchEl(t,e,r){Uo(t,e,{childrenOnly:!1,onBeforeElUpdated:(i,n)=>{if(r&&r.isSameNode(i)&&g.isFormInput(i))return g.mergeFocusedInput(i,n),!1}})}constructor(t,e,r,i,n){this.view=t,this.liveSocket=t.liveSocket,this.container=e,this.id=r,this.rootID=t.root.id,this.html=i,this.targetCID=n,this.cidPatch=typeof this.targetCID=="number",this.callbacks={beforeadded:[],beforeupdated:[],beforephxChildAdded:[],afteradded:[],afterupdated:[],afterdiscarded:[],afterphxChildAdded:[]}}before(t,e){this.callbacks[`before${t}`].push(e)}after(t,e){this.callbacks[`after${t}`].push(e)}trackBefore(t,...e){this.callbacks[`before${t}`].forEach(r=>r(...e))}trackAfter(t,...e){this.callbacks[`after${t}`].forEach(r=>r(...e))}markPrunableContentForRemoval(){g.all(this.container,"[phx-update=append] > *, [phx-update=prepend] > *",t=>{t.setAttribute(wo,"")})}perform(){let{view:t,liveSocket:e,container:r,html:i}=this,n=this.isCIDPatch()?this.targetCIDContainer(i):r;if(this.isCIDPatch()&&!n)return;let s=e.getActiveElement(),{selectionStart:o,selectionEnd:a}=s&&g.hasSelectionRange(s)?s:{},l=e.binding(fi),u=e.binding(Oo),c=e.binding(di),h=e.binding(Vc),d=[],m=[],p=[],y=null,b=e.time("premorph container prep",()=>this.buildDiffHTML(r,i,l,n));return this.trackBefore("added",r),this.trackBefore("updated",r,r),e.time("morphdom",()=>{Uo(n,b,{childrenOnly:n.getAttribute(G)===null,getNodeKey:f=>g.isPhxDestroyed(f)?null:f.id,onBeforeNodeAdded:f=>(this.trackBefore("added",f),f),onNodeAdded:f=>{g.isNowTriggerFormExternal(f,h)&&(y=f),g.discardError(n,f,u),g.isPhxChild(f)&&t.ownsElement(f)&&this.trackAfter("phxChildAdded",f),d.push(f)},onNodeDiscarded:f=>{g.isPhxChild(f)&&e.destroyViewByEl(f),this.trackAfter("discarded",f)},onBeforeNodeDiscarded:f=>f.getAttribute&&f.getAttribute(wo)!==null?!0:!(f.parentNode!==null&&g.isPhxUpdate(f.parentNode,l,["append","prepend"])&&f.id||this.skipCIDSibling(f)),onElUpdated:f=>{g.isNowTriggerFormExternal(f,h)&&(y=f),m.push(f)},onBeforeElUpdated:(f,S)=>{if(g.cleanChildNodes(S,l),this.skipCIDSibling(S))return!1;if(g.isIgnored(f,l))return this.trackBefore("updated",f,S),g.mergeAttrs(f,S,{isIgnored:!0}),m.push(f),!1;if(f.type==="number"&&f.validity&&f.validity.badInput)return!1;if(!g.syncPendingRef(f,S,c))return g.isUploadInput(f)&&(this.trackBefore("updated",f,S),m.push(f)),!1;if(g.isPhxChild(S)){let de=f.getAttribute(Pe);return g.mergeAttrs(f,S,{exclude:[It]}),de!==""&&f.setAttribute(Pe,de),f.setAttribute(hr,this.rootID),!1}return g.copyPrivates(S,f),g.discardError(n,S,u),g.syncPropsToAttrs(S),s&&f.isSameNode(s)&&g.isFormInput(f)&&!this.forceFocusedSelectUpdate(f,S)?(this.trackBefore("updated",f,S),g.mergeFocusedInput(f,S),g.syncAttrsToProps(f),m.push(f),!1):(g.isPhxUpdate(S,l,["append","prepend"])&&p.push(new nh(f,S,S.getAttribute(l))),g.syncAttrsToProps(S),this.trackBefore("updated",f,S),!0)}})}),e.isDebugEnabled()&&Yc(),p.length>0&&e.time("post-morph append/prepend restoration",()=>{p.forEach(f=>f.perform())}),e.silenceEvents(()=>g.restoreFocus(s,o,a)),g.dispatchEvent(document,"phx:update"),d.forEach(f=>this.trackAfter("added",f)),m.forEach(f=>this.trackAfter("updated",f)),y&&(e.disconnect(),y.submit()),!0}forceFocusedSelectUpdate(t,e){let r=["select","select-one","select-multiple"].find(i=>i===t.type);return t.multiple===!0||r&&t.innerHTML!=e.innerHTML}isCIDPatch(){return this.cidPatch}skipCIDSibling(t){return t.nodeType===Node.ELEMENT_NODE&&t.getAttribute(ci)!==null}targetCIDContainer(t){if(!this.isCIDPatch())return;let[e,...r]=g.findComponentNodeList(this.container,this.targetCID);return r.length===0&&g.childNodeLength(t)===1?e:e&&e.parentNode}buildDiffHTML(t,e,r,i){let n=this.isCIDPatch(),s=n&&i.getAttribute(G)===this.targetCID.toString();if(!n||s)return e;{let o=null,a=document.createElement("template");o=g.cloneNode(i);let[l,...u]=g.findComponentNodeList(o,this.targetCID);return a.innerHTML=e,u.forEach(c=>c.remove()),Array.from(o.childNodes).forEach(c=>{c.id&&c.nodeType===Node.ELEMENT_NODE&&c.getAttribute(G)!==this.targetCID.toString()&&(c.setAttribute(ci,""),c.innerHTML="")}),Array.from(a.content.childNodes).forEach(c=>o.insertBefore(c,l)),l.remove(),o.outerHTML}}},qo=class{static extract(t){let{[xo]:e,[Do]:r,[No]:i}=t;return delete t[xo],delete t[Do],delete t[No],{diff:t,title:i,reply:e||null,events:r||[]}}constructor(t,e){this.viewId=t,this.rendered={},this.mergeDiff(e)}parentViewId(){return this.viewId}toString(t){return this.recursiveToString(this.rendered,this.rendered[$],t)}recursiveToString(t,e=t[$],r){r=r?new Set(r):null;let i={buffer:"",components:e,onlyCids:r};return this.toOutputBuffer(t,i),i.buffer}componentCIDs(t){return Object.keys(t[$]||{}).map(e=>parseInt(e))}isComponentOnlyDiff(t){return t[$]?Object.keys(t).length===1:!1}getComponent(t,e){return t[$][e]}mergeDiff(t){let e=t[$],r={};if(delete t[$],this.rendered=this.mutableMerge(this.rendered,t),this.rendered[$]=this.rendered[$]||{},e){let n=this.rendered[$];for(let s in e)e[s]=this.cachedFindComponent(s,e[s],n,e,r);for(var i in e)n[i]=e[i];t[$]=e}}cachedFindComponent(t,e,r,i,n){if(n[t])return n[t];{let s,o,a=e[he];if(typeof a=="number"){let l;a>0?l=this.cachedFindComponent(a,i[a],r,i,n):l=r[-a],o=l[he],s=this.cloneMerge(l,e),s[he]=o}else s=e[he]!==void 0?e:this.cloneMerge(r[t]||{},e);return n[t]=s,s}}mutableMerge(t,e){return e[he]!==void 0?e:(this.doMutableMerge(t,e),t)}doMutableMerge(t,e){for(let r in e){let i=e[r],n=t[r];Dt(i)&&i[he]===void 0&&Dt(n)?this.doMutableMerge(n,i):t[r]=i}}cloneMerge(t,e){let r={...t,...e};for(let i in r){let n=e[i],s=t[i];Dt(n)&&n[he]===void 0&&Dt(s)&&(r[i]=this.cloneMerge(s,n))}return r}componentToString(t){return this.recursiveCIDToString(this.rendered[$],t)}pruneCIDs(t){t.forEach(e=>delete this.rendered[$][e])}get(){return this.rendered}isNewFingerprint(t={}){return!!t[he]}toOutputBuffer(t,e){if(t[Ro])return this.comprehensionToBuffer(t,e);let{[he]:r}=t;e.buffer+=r[0];for(let i=1;i<r.length;i++)this.dynamicToBuffer(t[i-1],e),e.buffer+=r[i]}comprehensionToBuffer(t,e){let{[Ro]:r,[he]:i}=t;for(let n=0;n<r.length;n++){let s=r[n];e.buffer+=i[0];for(let o=1;o<i.length;o++)this.dynamicToBuffer(s[o-1],e),e.buffer+=i[o]}}dynamicToBuffer(t,e){typeof t=="number"?e.buffer+=this.recursiveCIDToString(e.components,t,e.onlyCids):Dt(t)?this.toOutputBuffer(t,e):e.buffer+=t}recursiveCIDToString(t,e,r){let i=t[e]||R(`no component for CID ${e}`,t),n=document.createElement("template");n.innerHTML=this.recursiveToString(i,t,r);let s=n.content,o=r&&!r.has(e),[a,l]=Array.from(s.childNodes).reduce(([u,c],h,d)=>h.nodeType===Node.ELEMENT_NODE?h.getAttribute(G)?[u,!0]:(h.setAttribute(G,e),h.id||(h.id=`${this.parentViewId()}-${e}-${d}`),o&&(h.setAttribute(ci,""),h.innerHTML=""),[!0,c]):h.nodeValue.trim()!==""?(R(`only HTML element tags are allowed at the root of components.

got: "${h.nodeValue.trim()}"

within:
`,n.innerHTML.trim()),h.replaceWith(this.createSpan(h.nodeValue,e)),[!0,c]):(h.remove(),[u,c]),[!1,!1]);return!a&&!l?(R(`expected at least one HTML element tag inside a component, but the component is empty:
`,n.innerHTML.trim()),this.createSpan("",e).outerHTML):(!a&&l&&R("expected at least one HTML element tag directly inside a component, but only subcomponents were found. A component must render at least one HTML tag directly inside itself.",n.innerHTML.trim()),n.innerHTML)}createSpan(t,e){let r=document.createElement("span");return r.innerText=t,r.setAttribute(G,e),r}},bh=1,Nt=class{static makeID(){return bh++}static elementID(t){return t.phxHookId}constructor(t,e,r){this.__view=t,this.__liveSocket=t.liveSocket,this.__callbacks=r,this.__listeners=new Set,this.__isDisconnected=!1,this.el=e,this.el.phxHookId=this.constructor.makeID();for(let i in this.__callbacks)this[i]=this.__callbacks[i]}__mounted(){this.mounted&&this.mounted()}__updated(){this.updated&&this.updated()}__beforeUpdate(){this.beforeUpdate&&this.beforeUpdate()}__destroyed(){this.destroyed&&this.destroyed()}__reconnected(){this.__isDisconnected&&(this.__isDisconnected=!1,this.reconnected&&this.reconnected())}__disconnected(){this.__isDisconnected=!0,this.disconnected&&this.disconnected()}pushEvent(t,e={},r=function(){}){return this.__view.pushHookEvent(null,t,e,r)}pushEventTo(t,e,r={},i=function(){}){return this.__view.withinTargets(t,(n,s)=>n.pushHookEvent(s,e,r,i))}handleEvent(t,e){let r=(i,n)=>n?t:e(i.detail);return window.addEventListener(`phx:hook:${t}`,r),this.__listeners.add(r),r}removeHandleEvent(t){let e=t(null,!0);window.removeEventListener(`phx:hook:${e}`,t),this.__listeners.delete(t)}upload(t,e){return this.__view.dispatchUploads(t,e)}uploadTo(t,e,r){return this.__view.withinTargets(t,i=>i.dispatchUploads(e,r))}__cleanup__(){this.__listeners.forEach(t=>this.removeHandleEvent(t))}},wi=(t,e={})=>{let r=new FormData(t),i=[];r.forEach((s,o,a)=>{s instanceof File&&i.push(o)}),i.forEach(s=>r.delete(s));let n=new URLSearchParams;for(let[s,o]of r.entries())n.append(s,o);for(let s in e)n.append(s,e[s]);return n.toString()},$o=class{constructor(t,e,r,i){this.liveSocket=e,this.flash=i,this.parent=r,this.root=r?r.root:this,this.el=t,this.id=this.el.id,this.ref=0,this.childJoins=0,this.loaderTimer=null,this.pendingDiffs=[],this.pruningCIDs=[],this.redirect=!1,this.href=null,this.joinCount=this.parent?this.parent.joinCount-1:0,this.joinPending=!0,this.destroyed=!1,this.joinCallback=function(){},this.stopCallback=function(){},this.pendingJoinOps=this.parent?null:[],this.viewHooks={},this.uploaders={},this.formSubmits=[],this.children=this.parent?null:{},this.root.children[this.id]={},this.channel=this.liveSocket.channel(`lv:${this.id}`,()=>({redirect:this.redirect?this.href:void 0,url:this.redirect?void 0:this.href||void 0,params:this.connectParams(),session:this.getSession(),static:this.getStatic(),flash:this.flash})),this.showLoader(this.liveSocket.loaderTimeout),this.bindChannel()}setHref(t){this.href=t}setRedirect(t){this.redirect=!0,this.href=t}isMain(){return this.liveSocket.main===this}connectParams(){let t=this.liveSocket.params(this.el),e=g.all(document,`[${this.binding(_c)}]`).map(r=>r.src||r.href).filter(r=>typeof r=="string");return e.length>0&&(t._track_static=e),t._mounts=this.joinCount,t}isConnected(){return this.channel.canPush()}getSession(){return this.el.getAttribute(Pe)}getStatic(){let t=this.el.getAttribute(It);return t===""?null:t}destroy(t=function(){}){this.destroyAllChildren(),this.destroyed=!0,delete this.root.children[this.id],this.parent&&delete this.root.children[this.parent.id][this.id],clearTimeout(this.loaderTimer);let e=()=>{t();for(let r in this.viewHooks)this.destroyHook(this.viewHooks[r])};g.markPhxChildDestroyed(this.el),this.log("destroyed",()=>["the child has been removed from the parent"]),this.channel.leave().receive("ok",e).receive("error",e).receive("timeout",e)}setContainerClasses(...t){this.el.classList.remove(Eo,cr,ko),this.el.classList.add(...t)}isLoading(){return this.el.classList.contains(cr)}showLoader(t){if(clearTimeout(this.loaderTimer),t)this.loaderTimer=setTimeout(()=>this.showLoader(),t);else{for(let e in this.viewHooks)this.viewHooks[e].__disconnected();this.setContainerClasses(cr)}}hideLoader(){clearTimeout(this.loaderTimer),this.setContainerClasses(Eo)}triggerReconnected(){for(let t in this.viewHooks)this.viewHooks[t].__reconnected()}log(t,e){this.liveSocket.log(this,t,e)}withinTargets(t,e){if(t instanceof HTMLElement)return this.liveSocket.owner(t,r=>e(r,t));if(/^(0|[1-9]\d*)$/.test(t)){let r=g.findComponentNodeList(this.el,t);r.length===0?R(`no component found matching phx-target of ${t}`):e(this,r[0])}else{let r=Array.from(document.querySelectorAll(t));r.length===0&&R(`nothing found matching the phx-target selector "${t}"`),r.forEach(i=>this.liveSocket.owner(i,n=>e(n,i)))}}applyDiff(t,e,r){this.log(t,()=>["",Mt(e)]);let{diff:i,reply:n,events:s,title:o}=qo.extract(e);return o&&g.putTitle(o),r({diff:i,reply:n,events:s}),n}onJoin(t){let{rendered:e,container:r}=t;if(r){let[i,n]=r;this.el=g.replaceRootContainer(this.el,i,n)}this.childJoins=0,this.joinPending=!0,this.flash=null,Me.dropLocal(this.liveSocket.localStorage,window.location.pathname,po),this.applyDiff("mount",e,({diff:i,events:n})=>{this.rendered=new qo(this.id,i);let s=this.renderContainer(null,"join");this.dropPendingRefs();let o=this.formsForRecovery(s);this.joinCount++,o.length>0?o.forEach((a,l)=>{this.pushFormRecovery(a,u=>{l===o.length-1&&this.onJoinComplete(u,s,n)})}):this.onJoinComplete(t,s,n)})}dropPendingRefs(){g.all(this.el,`[${ue}]`,t=>t.removeAttribute(ue))}onJoinComplete({live_patch:t},e,r){if(this.joinCount>1||this.parent&&!this.parent.isJoinPending())return this.applyJoinPatch(t,e,r);g.findPhxChildrenInFragment(e,this.id).filter(n=>{let s=n.id&&this.el.querySelector(`[id="${n.id}"]`),o=s&&s.getAttribute(It);return o&&n.setAttribute(It,o),this.joinChild(n)}).length===0?this.parent?(this.root.pendingJoinOps.push([this,()=>this.applyJoinPatch(t,e,r)]),this.parent.ackJoin(this)):(this.onAllChildJoinsComplete(),this.applyJoinPatch(t,e,r)):this.root.pendingJoinOps.push([this,()=>this.applyJoinPatch(t,e,r)])}attachTrueDocEl(){this.el=g.byId(this.id),this.el.setAttribute(hr,this.root.id)}dispatchEvents(t){t.forEach(([e,r])=>{window.dispatchEvent(new CustomEvent(`phx:hook:${e}`,{detail:r}))})}applyJoinPatch(t,e,r){this.attachTrueDocEl();let i=new yr(this,this.el,this.id,e,null);if(i.markPrunableContentForRemoval(),this.performPatch(i,!1),this.joinNewChildren(),g.all(this.el,`[${this.binding(mr)}], [data-phx-${mr}]`,n=>{let s=this.addHook(n);s&&s.__mounted()}),this.joinPending=!1,this.dispatchEvents(r),this.applyPendingUpdates(),t){let{kind:n,to:s}=t;this.liveSocket.historyPatch(s,n)}this.hideLoader(),this.joinCount>1&&this.triggerReconnected(),this.stopCallback()}triggerBeforeUpdateHook(t,e){this.liveSocket.triggerDOM("onBeforeElUpdated",[t,e]);let r=this.getHook(t),i=r&&g.isIgnored(t,this.binding(fi));if(r&&!t.isEqualNode(e)&&!(i&&Qc(t.dataset,e.dataset)))return r.__beforeUpdate(),r}performPatch(t,e){let r=[],i=!1,n=new Set;return t.after("added",s=>{this.liveSocket.triggerDOM("onNodeAdded",[s]);let o=this.addHook(s);o&&o.__mounted()}),t.after("phxChildAdded",s=>i=!0),t.before("updated",(s,o)=>{this.triggerBeforeUpdateHook(s,o)&&n.add(s.id)}),t.after("updated",s=>{n.has(s.id)&&this.getHook(s).__updated()}),t.after("discarded",s=>{let o=this.componentID(s);typeof o=="number"&&r.indexOf(o)===-1&&r.push(o);let a=this.getHook(s);a&&this.destroyHook(a)}),t.perform(),e&&this.maybePushComponentsDestroyed(r),i}joinNewChildren(){g.findPhxChildren(this.el,this.id).forEach(t=>this.joinChild(t))}getChildById(t){return this.root.children[this.id][t]}getDescendentByEl(t){return t.id===this.id?this:this.children[t.getAttribute(Lt)][t.id]}destroyDescendent(t){for(let e in this.root.children)for(let r in this.root.children[e])if(r===t)return this.root.children[e][r].destroy()}joinChild(t){if(!this.getChildById(t.id)){let r=new $o(t,this.liveSocket,this);return this.root.children[this.id][r.id]=r,r.join(),this.childJoins++,!0}}isJoinPending(){return this.joinPending}ackJoin(t){this.childJoins--,this.childJoins===0&&(this.parent?this.parent.ackJoin(this):this.onAllChildJoinsComplete())}onAllChildJoinsComplete(){this.joinCallback(),this.pendingJoinOps.forEach(([t,e])=>{t.isDestroyed()||e()}),this.pendingJoinOps=[]}update(t,e){if(this.isJoinPending()||this.liveSocket.hasPendingLink())return this.pendingDiffs.push({diff:t,events:e});this.rendered.mergeDiff(t);let r=!1;this.rendered.isComponentOnlyDiff(t)?this.liveSocket.time("component patch complete",()=>{g.findParentCIDs(this.el,this.rendered.componentCIDs(t)).forEach(n=>{this.componentPatch(this.rendered.getComponent(t,n),n)&&(r=!0)})}):_o(t)||this.liveSocket.time("full patch complete",()=>{let i=this.renderContainer(t,"update"),n=new yr(this,this.el,this.id,i,null);r=this.performPatch(n,!0)}),this.dispatchEvents(e),r&&this.joinNewChildren()}renderContainer(t,e){return this.liveSocket.time(`toString diff (${e})`,()=>{let r=this.el.tagName,i=t?this.rendered.componentCIDs(t).concat(this.pruningCIDs):null,n=this.rendered.toString(i);return`<${r}>${n}</${r}>`})}componentPatch(t,e){if(_o(t))return!1;let r=this.rendered.componentToString(e),i=new yr(this,this.el,this.id,r,e);return this.performPatch(i,!0)}getHook(t){return this.viewHooks[Nt.elementID(t)]}addHook(t){if(Nt.elementID(t)||!t.getAttribute)return;let e=t.getAttribute(`data-phx-${mr}`)||t.getAttribute(this.binding(mr));if(e&&!this.ownsElement(t))return;let r=this.liveSocket.getHookCallbacks(e);if(r){t.id||R(`no DOM ID for hook "${e}". Hooks require a unique ID on each element.`,t);let i=new Nt(this,t,r);return this.viewHooks[Nt.elementID(i.el)]=i,i}else e!==null&&R(`unknown hook found for "${e}"`,t)}destroyHook(t){t.__destroyed(),t.__cleanup__(),delete this.viewHooks[Nt.elementID(t.el)]}applyPendingUpdates(){this.pendingDiffs.forEach(({diff:t,events:e})=>this.update(t,e)),this.pendingDiffs=[]}onChannel(t,e){this.liveSocket.onChannel(this.channel,t,r=>{this.isJoinPending()?this.root.pendingJoinOps.push([this,()=>e(r)]):e(r)})}bindChannel(){this.liveSocket.onChannel(this.channel,"diff",t=>{this.applyDiff("update",t,({diff:e,events:r})=>this.update(e,r))}),this.onChannel("redirect",({to:t,flash:e})=>this.onRedirect({to:t,flash:e})),this.onChannel("live_patch",t=>this.onLivePatch(t)),this.onChannel("live_redirect",t=>this.onLiveRedirect(t)),this.channel.onError(t=>this.onError(t)),this.channel.onClose(t=>this.onClose(t))}destroyAllChildren(){for(let t in this.root.children[this.id])this.getChildById(t).destroy()}onLiveRedirect(t){let{to:e,kind:r,flash:i}=t,n=this.expandURL(e);this.liveSocket.historyRedirect(n,r,i)}onLivePatch(t){let{to:e,kind:r}=t;this.href=this.expandURL(e),this.liveSocket.historyPatch(e,r)}expandURL(t){return t.startsWith("/")?`${window.location.protocol}//${window.location.host}${t}`:t}onRedirect({to:t,flash:e}){this.liveSocket.redirect(t,e)}isDestroyed(){return this.destroyed}join(t){this.parent||(this.stopCallback=this.liveSocket.withPageLoading({to:this.href,kind:"initial"})),this.joinCallback=()=>t&&t(this.joinCount),this.liveSocket.wrapPush(this,{timeout:!1},()=>this.channel.join().receive("ok",e=>!this.isDestroyed()&&this.onJoin(e)).receive("error",e=>!this.isDestroyed()&&this.onJoinError(e)).receive("timeout",()=>!this.isDestroyed()&&this.onJoinError({reason:"timeout"})))}onJoinError(t){return t.reason==="unauthorized"||t.reason==="stale"?(this.log("error",()=>["unauthorized live_redirect. Falling back to page request",t]),this.onRedirect({to:this.href})):((t.redirect||t.live_redirect)&&(this.joinPending=!1,this.channel.leave()),t.redirect?this.onRedirect(t.redirect):t.live_redirect?this.onLiveRedirect(t.live_redirect):(this.log("error",()=>["unable to join",t]),this.liveSocket.reloadWithJitter(this)))}onClose(t){if(!this.isDestroyed()){if(this.isJoinPending()&&document.visibilityState!=="hidden"||this.liveSocket.hasPendingLink()&&t!=="leave")return this.liveSocket.reloadWithJitter(this);this.destroyAllChildren(),this.liveSocket.dropActiveElement(this),document.activeElement&&document.activeElement.blur(),this.liveSocket.isUnloaded()&&this.showLoader(zc)}}onError(t){this.onClose(t),this.log("error",()=>["view crashed",t]),this.liveSocket.isUnloaded()||this.displayError()}displayError(){this.isMain()&&g.dispatchEvent(window,"phx:page-loading-start",{to:this.href,kind:"error"}),this.showLoader(),this.setContainerClasses(cr,ko)}pushWithReply(t,e,r,i=function(){}){if(!this.isConnected())return;let[n,[s]]=t?t():[null,[]],o=function(){};return s&&s.getAttribute(this.binding(So))!==null&&(o=this.liveSocket.withPageLoading({kind:"element",target:s})),typeof r.cid!="number"&&delete r.cid,this.liveSocket.wrapPush(this,{timeout:!0},()=>this.channel.push(e,r,Jc).receive("ok",a=>{let l=null;n!==null&&this.undoRefs(n),a.diff&&(l=this.applyDiff("update",a.diff,({diff:u,events:c})=>{this.update(u,c)})),a.redirect&&this.onRedirect(a.redirect),a.live_patch&&this.onLivePatch(a.live_patch),a.live_redirect&&this.onLiveRedirect(a.live_redirect),o(),i(a,l)}))}undoRefs(t){g.all(this.el,`[${ue}="${t}"]`,e=>{let r=e.getAttribute(dr);e.removeAttribute(ue),e.getAttribute(hi)!==null&&(e.readOnly=!1,e.removeAttribute(hi)),r!==null&&(e.disabled=r==="true",e.removeAttribute(dr)),vo.forEach(s=>g.removeClass(e,s));let i=e.getAttribute(fr);i!==null&&(e.innerText=i,e.removeAttribute(fr));let n=g.private(e,ue);if(n){let s=this.triggerBeforeUpdateHook(e,n);yr.patchEl(e,n,this.liveSocket.getActiveElement()),s&&s.__updated(),g.deletePrivate(e,ue)}})}putRef(t,e){let r=this.ref++,i=this.binding(di);return t.forEach(n=>{n.classList.add(`phx-${e}-loading`),n.setAttribute(ue,r);let s=n.getAttribute(i);s!==null&&(n.getAttribute(fr)||n.setAttribute(fr,n.innerText),n.innerText=s)}),[r,t]}componentID(t){let e=t.getAttribute&&t.getAttribute(G);return e?parseInt(e):null}targetComponentID(t,e){return t.getAttribute(this.binding("target"))?this.closestComponentID(e):null}closestComponentID(t){return t?ye(t.closest(`[${G}]`),e=>this.ownsElement(e)&&this.componentID(e)):null}pushHookEvent(t,e,r,i){if(!this.isConnected())return this.log("hook",()=>["unable to push hook event. LiveView not connected",e,r]),!1;let[n,s]=this.putRef([],"hook");return this.pushWithReply(()=>[n,s],"event",{type:"hook",event:e,value:r,cid:this.closestComponentID(t)},(o,a)=>i(a,n)),n}extractMeta(t,e){let r=this.binding("value-");for(let i=0;i<t.attributes.length;i++){let n=t.attributes[i].name;n.startsWith(r)&&(e[n.replace(r,"")]=t.getAttribute(n))}return t.value!==void 0&&(e.value=t.value,t.tagName==="INPUT"&&Lo.indexOf(t.type)>=0&&!t.checked&&delete e.value),e}pushEvent(t,e,r,i,n){this.pushWithReply(()=>this.putRef([e],t),"event",{type:t,event:i,value:this.extractMeta(e,n),cid:this.targetComponentID(e,r)})}pushKey(t,e,r,i,n){this.pushWithReply(()=>this.putRef([t],r),"event",{type:r,event:i,value:this.extractMeta(t,n),cid:this.targetComponentID(t,e)})}pushFileProgress(t,e,r,i=function(){}){this.liveSocket.withinOwners(t.form,(n,s)=>{n.pushWithReply(null,"progress",{event:t.getAttribute(n.binding($c)),ref:t.getAttribute(je),entry_ref:e,progress:r,cid:n.targetComponentID(t.form,s)},i)})}pushInput(t,e,r,i,n){let s,o=this.targetComponentID(t.form,e),a=()=>this.putRef([t,t.form],"change"),l=wi(t.form,{_target:i.name});t.files&&t.files.length>0&&D.trackFiles(t,Array.from(t.files)),s=D.serializeUploads(t);let u={type:"form",event:r,value:l,uploads:s,cid:o};this.pushWithReply(a,"event",u,c=>{if(g.showError(t,this.liveSocket.binding(Oo)),g.isUploadInput(t)&&t.getAttribute("data-phx-auto-upload")!==null){if(D.filesAwaitingPreflight(t).length>0){let[h,d]=a();this.uploadFiles(t.form,e,h,o,m=>{n&&n(c),this.triggerAwaitingSubmit(t.form)})}}else n&&n(c)})}triggerAwaitingSubmit(t){let e=this.getScheduledSubmit(t);if(e){let[r,i,n]=e;this.cancelSubmit(t),n()}}getScheduledSubmit(t){return this.formSubmits.find(([e,r])=>e.isSameNode(t))}scheduleSubmit(t,e,r){if(this.getScheduledSubmit(t))return!0;this.formSubmits.push([t,e,r])}cancelSubmit(t){this.formSubmits=this.formSubmits.filter(([e,r,i])=>e.isSameNode(t)?(this.undoRefs(r),!1):!0)}pushFormSubmit(t,e,r,i){let n=c=>!(Rt(c,`${this.binding(fi)}=ignore`,c.form)||Rt(c,"data-phx-update=ignore",c.form)),s=c=>c.hasAttribute(this.binding(di)),o=c=>c.tagName=="BUTTON",a=c=>["INPUT","TEXTAREA","SELECT"].includes(c.tagName),l=()=>{let c=Array.from(t.elements),h=c.filter(s),d=c.filter(o).filter(n),m=c.filter(a).filter(n);return d.forEach(p=>{p.setAttribute(dr,p.disabled),p.disabled=!0}),m.forEach(p=>{p.setAttribute(hi,p.readOnly),p.readOnly=!0,p.files&&(p.setAttribute(dr,p.disabled),p.disabled=!0)}),t.setAttribute(this.binding(So),""),this.putRef([t].concat(h).concat(d).concat(m),"submit")},u=this.targetComponentID(t,e);if(D.hasUploadsInProgress(t)){let[c,h]=l();return this.scheduleSubmit(t,c,()=>this.pushFormSubmit(t,e,r,i))}else if(D.inputsAwaitingPreflight(t).length>0){let[c,h]=l(),d=()=>[c,h];this.uploadFiles(t,e,c,u,m=>{let p=wi(t,{});this.pushWithReply(d,"event",{type:"form",event:r,value:p,cid:u},i)})}else{let c=wi(t);this.pushWithReply(l,"event",{type:"form",event:r,value:c,cid:u},i)}}uploadFiles(t,e,r,i,n){let s=this.joinCount,o=D.activeFileInputs(t),a=o.length;o.forEach(l=>{let u=new D(l,this,()=>{a--,a===0&&n()});this.uploaders[l]=u;let c=u.entries().map(d=>d.toPreflightPayload()),h={ref:l.getAttribute(je),entries:c,cid:this.targetComponentID(l.form,e)};this.log("upload",()=>["sending preflight request",h]),this.pushWithReply(null,"allow_upload",h,d=>{if(this.log("upload",()=>["got preflight response",d]),d.error){this.undoRefs(r);let[m,p]=d.error;this.log("upload",()=>[`error for entry ${m}`,p])}else{let m=p=>{this.channel.onError(()=>{this.joinCount===s&&p()})};u.initAdapterUpload(d,m,this.liveSocket)}})})}dispatchUploads(t,e){let r=g.findUploadInputs(this.el).filter(i=>i.name===t);r.length===0?R(`no live file inputs found matching the name "${t}"`):r.length>1?R(`duplicate live file inputs found matching the name "${t}"`):g.dispatchEvent(r[0],yo,{files:e})}pushFormRecovery(t,e){this.liveSocket.withinOwners(t,(r,i)=>{let n=t.elements[0],s=t.getAttribute(this.binding(Po))||t.getAttribute(this.binding("change"));r.pushInput(n,i,s,n,e)})}pushLinkPatch(t,e,r){let i=this.liveSocket.setPendingLink(t),n=e?()=>this.putRef([e],"click"):null;this.pushWithReply(n,"live_patch",{url:t},s=>{s.link_redirect?this.liveSocket.replaceMain(t,null,r,i):(this.liveSocket.commitPendingLink(i)&&(this.href=t),this.applyPendingUpdates(),r&&r(i))}).receive("timeout",()=>this.liveSocket.redirect(window.location.href))}formsForRecovery(t){if(this.joinCount===0)return[];let e=this.binding("change"),r=document.createElement("template");return r.innerHTML=t,g.all(this.el,`form[${e}]`).filter(i=>this.ownsElement(i)).filter(i=>i.elements.length>0).filter(i=>i.getAttribute(this.binding(Po))!=="ignore").filter(i=>r.content.querySelector(`form[${e}="${i.getAttribute(e)}"]`))}maybePushComponentsDestroyed(t){let e=t.filter(r=>g.findComponentNodeList(this.el,r).length===0);e.length>0&&(this.pruningCIDs.push(...e),this.pushWithReply(null,"cids_will_destroy",{cids:e},()=>{this.pruningCIDs=this.pruningCIDs.filter(i=>e.indexOf(i)!==-1);let r=e.filter(i=>g.findComponentNodeList(this.el,i).length===0);r.length>0&&this.pushWithReply(null,"cids_destroyed",{cids:r},i=>{this.rendered.pruneCIDs(i.cids)})}))}ownsElement(t){return t.getAttribute(Lt)===this.id||ye(t.closest(lt),e=>e.id)===this.id}submitForm(t,e,r){g.putPrivate(t,Io,!0),this.liveSocket.blurActiveElement(this),this.pushFormSubmit(t,e,r,()=>{this.liveSocket.restorePreviouslyActiveFocus()})}binding(t){return this.liveSocket.binding(t)}},Wo=class{constructor(t,e,r={}){if(this.unloaded=!1,!e||e.constructor.name==="Object")throw new Error(`
      a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:

          import {Socket} from "phoenix"
          import LiveSocket from "phoenix_live_view"
          let liveSocket = new LiveSocket("/live", Socket, {...})
      `);this.socket=new e(t,r),this.bindingPrefix=r.bindingPrefix||Zc,this.opts=r,this.params=vi(r.params||{}),this.viewLogger=r.viewLogger,this.metadataCallbacks=r.metadata||{},this.defaults=Object.assign(Mt(Kc),r.defaults||{}),this.activeElement=null,this.prevActive=null,this.silenced=!1,this.main=null,this.linkRef=1,this.roots={},this.href=window.location.href,this.pendingLink=null,this.currentLocation=Mt(window.location),this.hooks=r.hooks||{},this.uploaders=r.uploaders||{},this.loaderTimeout=r.loaderTimeout||Wc,this.localStorage=r.localStorage||window.localStorage,this.sessionStorage=r.sessionStorage||window.sessionStorage,this.boundTopLevelEvents=!1,this.domCallbacks=Object.assign({onNodeAdded:vi(),onBeforeElUpdated:vi()},r.dom||{}),window.addEventListener("pagehide",i=>{this.unloaded=!0}),this.socket.onOpen(()=>{this.isUnloaded()&&window.location.reload()})}isProfileEnabled(){return this.sessionStorage.getItem(pi)==="true"}isDebugEnabled(){return this.sessionStorage.getItem(mi)==="true"}enableDebug(){this.sessionStorage.setItem(mi,"true")}enableProfiling(){this.sessionStorage.setItem(pi,"true")}disableDebug(){this.sessionStorage.removeItem(mi)}disableProfiling(){this.sessionStorage.removeItem(pi)}enableLatencySim(t){this.enableDebug(),console.log("latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable"),this.sessionStorage.setItem(gi,t)}disableLatencySim(){this.sessionStorage.removeItem(gi)}getLatencySim(){let t=this.sessionStorage.getItem(gi);return t?parseInt(t):null}getSocket(){return this.socket}connect(){let t=()=>{this.joinRootViews()&&(this.bindTopLevelEvents(),this.socket.connect())};["complete","loaded","interactive"].indexOf(document.readyState)>=0?t():document.addEventListener("DOMContentLoaded",()=>t())}disconnect(t){this.socket.disconnect(t)}triggerDOM(t,e){this.domCallbacks[t](...e)}time(t,e){if(!this.isProfileEnabled()||!console.time)return e();console.time(t);let r=e();return console.timeEnd(t),r}log(t,e,r){if(this.viewLogger){let[i,n]=r();this.viewLogger(t,e,i,n)}else if(this.isDebugEnabled()){let[i,n]=r();Xc(t,e,i,n)}}onChannel(t,e,r){t.on(e,i=>{let n=this.getLatencySim();n?(console.log(`simulating ${n}ms of latency from server to client`),setTimeout(()=>r(i),n)):r(i)})}wrapPush(t,e,r){let i=this.getLatencySim(),n=t.joinCount;if(!i)return e.timeout?r().receive("timeout",()=>{t.joinCount===n&&!t.isDestroyed()&&this.reloadWithJitter(t,()=>{this.log(t,"timeout",()=>["received timeout while communicating with server. Falling back to hard refresh for recovery"])})}):r();console.log(`simulating ${i}ms of latency from client to server`);let s={receives:[],receive(o,a){this.receives.push([o,a])}};return setTimeout(()=>{t.isDestroyed()||s.receives.reduce((o,[a,l])=>o.receive(a,l),r())},i),s}reloadWithJitter(t,e){t.destroy(),this.disconnect();let[r,i]=xc,n=Math.floor(Math.random()*(i-r+1))+r,s=Me.updateLocal(this.localStorage,window.location.pathname,po,0,o=>o+1);e?e():this.log(t,"join",()=>[`encountered ${s} consecutive reloads`]),s>go&&(this.log(t,"join",()=>[`exceeded ${go} consecutive reloads. Entering failsafe mode`]),n=Nc),setTimeout(()=>{this.hasPendingLink()?window.location=this.pendingLink:window.location.reload()},n)}getHookCallbacks(t){return t&&t.startsWith("Phoenix.")?ih[t.split(".")[1]]:this.hooks[t]}isUnloaded(){return this.unloaded}isConnected(){return this.socket.isConnected()}getBindingPrefix(){return this.bindingPrefix}binding(t){return`${this.getBindingPrefix()}${t}`}channel(t,e){return this.socket.channel(t,e)}joinRootViews(){let t=!1;return g.all(document,`${lt}:not([${Lt}])`,e=>{if(!this.getRootById(e.id)){let r=this.newRootView(e);r.setHref(this.getHref()),r.join(),e.getAttribute(Ao)&&(this.main=r)}t=!0}),t}redirect(t,e){this.disconnect(),Me.redirect(t,e)}replaceMain(t,e,r=null,i=this.setPendingLink(t)){let n=this.main.el,s=g.cloneNode(n,"");this.main.showLoader(this.loaderTimeout),this.main.destroy(),this.main=this.newRootView(s,e),this.main.setRedirect(t),this.main.join(o=>{o===1&&this.commitPendingLink(i)&&(n.replaceWith(s),r&&r())})}isPhxView(t){return t.getAttribute&&t.getAttribute(Pe)!==null}newRootView(t,e){let r=new $o(t,this,null,e);return this.roots[r.id]=r,r}owner(t,e){let r=ye(t.closest(lt),i=>this.getViewByEl(i));r&&e(r)}withinOwners(t,e){this.owner(t,r=>{let i=t.getAttribute(this.binding("target"));i===null?e(r,t):r.withinTargets(i,e)})}getViewByEl(t){let e=t.getAttribute(hr);return ye(this.getRootById(e),r=>r.getDescendentByEl(t))}getRootById(t){return this.roots[t]}destroyAllViews(){for(let t in this.roots)this.roots[t].destroy(),delete this.roots[t]}destroyViewByEl(t){let e=this.getRootById(t.getAttribute(hr));e&&e.destroyDescendent(t.id)}setActiveElement(t){if(this.activeElement===t)return;this.activeElement=t;let e=()=>{t===this.activeElement&&(this.activeElement=null),t.removeEventListener("mouseup",this),t.removeEventListener("touchend",this)};t.addEventListener("mouseup",e),t.addEventListener("touchend",e)}getActiveElement(){return document.activeElement===document.body?this.activeElement||document.activeElement:document.activeElement||document.body}dropActiveElement(t){this.prevActive&&t.ownsElement(this.prevActive)&&(this.prevActive=null)}restorePreviouslyActiveFocus(){this.prevActive&&this.prevActive!==document.body&&this.prevActive.focus()}blurActiveElement(){this.prevActive=this.getActiveElement(),this.prevActive!==document.body&&this.prevActive.blur()}bindTopLevelEvents(){this.boundTopLevelEvents||(this.boundTopLevelEvents=!0,document.body.addEventListener("click",function(){}),window.addEventListener("pageshow",t=>{t.persisted&&(this.getSocket().disconnect(),this.withPageLoading({to:window.location.href,kind:"redirect"}),window.location.reload())},!0),this.bindNav(),this.bindClicks(),this.bindForms(),this.bind({keyup:"keyup",keydown:"keydown"},(t,e,r,i,n,s,o)=>{let a=i.getAttribute(this.binding(qc)),l=t.key&&t.key.toLowerCase();a&&a.toLowerCase()!==l||r.pushKey(i,n,e,s,{key:t.key,...this.eventMeta(e,t,i)})}),this.bind({blur:"focusout",focus:"focusin"},(t,e,r,i,n,s,o)=>{o||r.pushEvent(e,i,n,s,this.eventMeta(e,t,i))}),this.bind({blur:"blur",focus:"focus"},(t,e,r,i,n,s,o)=>{o&&!o!=="window"&&r.pushEvent(e,i,n,s,this.eventMeta(e,t,i))}),window.addEventListener("dragover",t=>t.preventDefault()),window.addEventListener("drop",t=>{t.preventDefault();let e=ye(Rt(t.target,this.binding(bo)),n=>n.getAttribute(this.binding(bo))),r=e&&document.getElementById(e),i=Array.from(t.dataTransfer.files||[]);!r||r.disabled||i.length===0||!(r.files instanceof FileList)||(D.trackFiles(r,i),r.dispatchEvent(new Event("input",{bubbles:!0})))}),this.on(yo,t=>{let e=t.target;if(!g.isUploadInput(e))return;let r=Array.from(t.detail.files||[]).filter(i=>i instanceof File||i instanceof Blob);D.trackFiles(e,r),e.dispatchEvent(new Event("input",{bubbles:!0}))}))}eventMeta(t,e,r){let i=this.metadataCallbacks[t];return i?i(e,r):{}}setPendingLink(t){return this.linkRef++,this.pendingLink=t,this.linkRef}commitPendingLink(t){return this.linkRef!==t?!1:(this.href=this.pendingLink,this.pendingLink=null,!0)}getHref(){return this.href}hasPendingLink(){return!!this.pendingLink}bind(t,e){for(let r in t){let i=t[r];this.on(i,n=>{let s=this.binding(r),o=this.binding(`window-${r}`),a=n.target.getAttribute&&n.target.getAttribute(s);a?this.debounce(n.target,n,()=>{this.withinOwners(n.target,(l,u)=>{e(n,r,l,n.target,u,a,null)})}):g.all(document,`[${o}]`,l=>{let u=l.getAttribute(o);this.debounce(l,n,()=>{this.withinOwners(l,(c,h)=>{e(n,r,c,l,h,u,"window")})})})})}}bindClicks(){this.bindClick("click","click",!1),this.bindClick("mousedown","capture-click",!0)}bindClick(t,e,r){let i=this.binding(e);window.addEventListener(t,n=>{if(!this.isConnected())return;let s=null;r?s=n.target.matches(`[${i}]`)?n.target:n.target.querySelector(`[${i}]`):s=Rt(n.target,i);let o=s&&s.getAttribute(i);!o||(s.getAttribute("href")==="#"&&n.preventDefault(),this.debounce(s,n,()=>{this.withinOwners(s,(a,l)=>{a.pushEvent("click",s,l,o,this.eventMeta("click",n,s))})}))},r)}bindNav(){if(!Me.canPushState())return;history.scrollRestoration&&(history.scrollRestoration="manual");let t=null;window.addEventListener("scroll",e=>{clearTimeout(t),t=setTimeout(()=>{Me.updateCurrentState(r=>Object.assign(r,{scroll:window.scrollY}))},100)}),window.addEventListener("popstate",e=>{if(!this.registerNewLocation(window.location))return;let{type:r,id:i,root:n,scroll:s}=e.state||{},o=window.location.href;this.main.isConnected()&&r==="patch"&&i===this.main.id?this.main.pushLinkPatch(o,null):this.replaceMain(o,null,()=>{n&&this.replaceRootHistory(),typeof s=="number"&&setTimeout(()=>{window.scrollTo(0,s)},0)})},!1),window.addEventListener("click",e=>{let r=Rt(e.target,oi),i=r&&r.getAttribute(oi),n=e.metaKey||e.ctrlKey||e.button===1;if(!i||!this.isConnected()||!this.main||n)return;let s=r.href,o=r.getAttribute(Fc);if(e.preventDefault(),this.pendingLink!==s)if(i==="patch")this.pushHistoryPatch(s,o,r);else if(i==="redirect")this.historyRedirect(s,o);else throw new Error(`expected ${oi} to be "patch" or "redirect", got: ${i}`)},!1)}withPageLoading(t,e){g.dispatchEvent(window,"phx:page-loading-start",t);let r=()=>g.dispatchEvent(window,"phx:page-loading-stop",t);return e?e(r):r}pushHistoryPatch(t,e,r){this.withPageLoading({to:t,kind:"patch"},i=>{this.main.pushLinkPatch(t,r,n=>{this.historyPatch(t,e,n),i()})})}historyPatch(t,e,r=this.setPendingLink(t)){!this.commitPendingLink(r)||(Me.pushState(e,{type:"patch",id:this.main.id},t),this.registerNewLocation(window.location))}historyRedirect(t,e,r){let i=window.scrollY;this.withPageLoading({to:t,kind:"redirect"},n=>{this.replaceMain(t,r,()=>{Me.pushState(e,{type:"redirect",id:this.main.id,scroll:i},t),this.registerNewLocation(window.location),n()})})}replaceRootHistory(){Me.pushState("replace",{root:!0,type:"patch",id:this.main.id})}registerNewLocation(t){let{pathname:e,search:r}=this.currentLocation;return e+r===t.pathname+t.search?!1:(this.currentLocation=Mt(t),!0)}bindForms(){let t=0;this.on("submit",e=>{let r=e.target.getAttribute(this.binding("submit"));!r||(e.preventDefault(),e.target.disabled=!0,this.withinOwners(e.target,(i,n)=>i.submitForm(e.target,n,r)))},!1);for(let e of["change","input"])this.on(e,r=>{let i=r.target,n=i.form&&i.form.getAttribute(this.binding("change"));if(!n||i.type==="number"&&i.validity&&i.validity.badInput)return;let s=t;t++;let{at:o,type:a}=g.private(i,"prev-iteration")||{};o===s-1&&e!==a||(g.putPrivate(i,"prev-iteration",{at:s,type:e}),this.debounce(i,r,()=>{this.withinOwners(i.form,(l,u)=>{g.putPrivate(i,Co,!0),g.isTextualInput(i)||this.setActiveElement(i),l.pushInput(i,u,n,r.target)})}))},!1)}debounce(t,e,r){let i=this.binding(jc),n=this.binding(Uc),s=this.defaults.debounce.toString(),o=this.defaults.throttle.toString();g.debounce(t,e,i,s,n,o,r)}silenceEvents(t){this.silenced=!0,t(),this.silenced=!1}on(t,e){window.addEventListener(t,r=>{this.silenced||e(r)})}};var Si=ki(ii()),wh=Rr.start();wh.load(co);var Ei={};Ei.AutoFocus={mounted(){this.el.focus()}};Ei.NaiveDateTimeUTC={mounted(){var t=Intl.DateTimeFormat().resolvedOptions(),e=document.body.dataset.tz||t.timeZone||"UTC",r=document.body.dataset.locale||t.locale||"en",i=Si.DateTime[this.el.dataset.timeFormat],n=Si.DateTime.fromISO(this.el.dateTime,{zone:"utc"}).setZone(e).setLocale(r);this.el.innerText=n.toLocaleString(i)}};var Sh=document.querySelector("meta[name='csrf-token']").getAttribute("content"),Eh=new Wo("/live",mo,{hooks:Ei,params:{_csrf_token:Sh}});Eh.connect();})();
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvZXJyb3JzLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvZm9ybWF0cy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL3V0aWwuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9lbmdsaXNoLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvZm9ybWF0dGVyLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvaW52YWxpZC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL3pvbmVzL3N5c3RlbVpvbmUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvem9uZXMvSUFOQVpvbmUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvem9uZXMvZml4ZWRPZmZzZXRab25lLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL3pvbmVzL2ludmFsaWRab25lLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvem9uZVV0aWwuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvc2V0dGluZ3MuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9sb2NhbGUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9yZWdleFBhcnNlci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9kdXJhdGlvbi5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbnRlcnZhbC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbmZvLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvZGlmZi5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2RpZ2l0cy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL3Rva2VuUGFyc2VyLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvY29udmVyc2lvbnMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvZGF0ZXRpbWUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvbHV4b24uanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AaG90d2lyZWQvdHVyYm8vZGlzdC90dXJiby5lczIwMTctZXNtLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2V2ZW50X2xpc3RlbmVyLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2Rpc3BhdGNoZXIudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvYWN0aW9uX2Rlc2NyaXB0b3IudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvYWN0aW9uLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2JpbmRpbmcudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvbXV0YXRpb24tb2JzZXJ2ZXJzL3NyYy9lbGVtZW50X29ic2VydmVyLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL211dGF0aW9uLW9ic2VydmVycy9zcmMvYXR0cmlidXRlX29ic2VydmVyLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL211dGF0aW9uLW9ic2VydmVycy9zcmMvc3RyaW5nX21hcF9vYnNlcnZlci50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9tdWx0aW1hcC9zcmMvc2V0X29wZXJhdGlvbnMudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvbXVsdGltYXAvc3JjL211bHRpbWFwLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL211bHRpbWFwL3NyYy9pbmRleGVkX211bHRpbWFwLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL211dGF0aW9uLW9ic2VydmVycy9zcmMvdG9rZW5fbGlzdF9vYnNlcnZlci50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9tdXRhdGlvbi1vYnNlcnZlcnMvc3JjL3ZhbHVlX2xpc3Rfb2JzZXJ2ZXIudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvYmluZGluZ19vYnNlcnZlci50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy92YWx1ZV9vYnNlcnZlci50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy9jb250ZXh0LnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2luaGVyaXRhYmxlX3N0YXRpY3MudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvYmxlc3NpbmcudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvZGVmaW5pdGlvbi50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy9tb2R1bGUudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvY2xhc3NfbWFwLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL3N0cmluZ19oZWxwZXJzLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2RhdGFfbWFwLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2d1aWRlLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL3NlbGVjdG9ycy50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy90YXJnZXRfc2V0LnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL3Njb3BlLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL3Njb3BlX29ic2VydmVyLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL3JvdXRlci50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy9zY2hlbWEudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvYXBwbGljYXRpb24udHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvY2xhc3NfcHJvcGVydGllcy50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy90YXJnZXRfcHJvcGVydGllcy50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy92YWx1ZV9wcm9wZXJ0aWVzLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2NvbnRyb2xsZXIudHMiLCAiLi4vLi4vLi4vYXNzZXRzL2NvbnRyb2xsZXJzL3RpbWVfY29udHJvbGxlci5qcyIsICJzdGltdWx1c19uczovVXNlcnMvaHJlZi9kZXYvbm9sYS9hc3NldHMvY29udHJvbGxlcnMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3V0aWxzLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3B1c2guanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3RpbWVyLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jaGFubmVsLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9hamF4LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9sb25ncG9sbC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvcHJlc2VuY2UuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NlcmlhbGl6ZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NvY2tldC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZW50cnlfdXBsb2FkZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXRpbHMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYnJvd3Nlci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb20uanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXBsb2FkX2VudHJ5LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2xpdmVfdXBsb2FkZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvaG9va3MuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZG9tX3Bvc3RfbW9ycGhfcmVzdG9yZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvbm9kZV9tb2R1bGVzL21vcnBoZG9tL2Rpc3QvbW9ycGhkb20tZXNtLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2RvbV9wYXRjaC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9yZW5kZXJlZC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy92aWV3X2hvb2suanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdmlldy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9saXZlX3NvY2tldC5qcyIsICIuLi8uLi8uLi9hc3NldHMvc2l0ZS5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gdGhlc2UgYXJlbid0IHJlYWxseSBwcml2YXRlLCBidXQgbm9yIGFyZSB0aGV5IHJlYWxseSB1c2VmdWwgdG8gZG9jdW1lbnRcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBMdXhvbkVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZERhdGVUaW1lRXJyb3IgZXh0ZW5kcyBMdXhvbkVycm9yIHtcbiAgY29uc3RydWN0b3IocmVhc29uKSB7XG4gICAgc3VwZXIoYEludmFsaWQgRGF0ZVRpbWU6ICR7cmVhc29uLnRvTWVzc2FnZSgpfWApO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRJbnRlcnZhbEVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlYXNvbikge1xuICAgIHN1cGVyKGBJbnZhbGlkIEludGVydmFsOiAke3JlYXNvbi50b01lc3NhZ2UoKX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkRHVyYXRpb25FcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZWFzb24pIHtcbiAgICBzdXBlcihgSW52YWxpZCBEdXJhdGlvbjogJHtyZWFzb24udG9NZXNzYWdlKCl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IgZXh0ZW5kcyBMdXhvbkVycm9yIHt9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRVbml0RXJyb3IgZXh0ZW5kcyBMdXhvbkVycm9yIHtcbiAgY29uc3RydWN0b3IodW5pdCkge1xuICAgIHN1cGVyKGBJbnZhbGlkIHVuaXQgJHt1bml0fWApO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7fVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBab25lSXNBYnN0cmFjdEVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiWm9uZSBpcyBhbiBhYnN0cmFjdCBjbGFzc1wiKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5jb25zdCBuID0gXCJudW1lcmljXCIsXG4gIHMgPSBcInNob3J0XCIsXG4gIGwgPSBcImxvbmdcIjtcblxuZXhwb3J0IGNvbnN0IERBVEVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURV9NRUQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURV9NRURfV0lUSF9XRUVLREFZID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBzLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVfRlVMTCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFX0hVR0UgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IGwsXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV9TSU1QTEUgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FX1dJVEhfU0VDT05EUyA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV9XSVRIX1NIT1JUX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FX1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICB0aW1lWm9uZU5hbWU6IGwsXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV8yNF9TSU1QTEUgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgaG91ckN5Y2xlOiBcImgyM1wiLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfMjRfV0lUSF9TRUNPTkRTID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91ckN5Y2xlOiBcImgyM1wiLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICBob3VyQ3ljbGU6IFwiaDIzXCIsXG4gIHRpbWVab25lTmFtZTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICBob3VyQ3ljbGU6IFwiaDIzXCIsXG4gIHRpbWVab25lTmFtZTogbCxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9TSE9SVCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURVRJTUVfTUVEID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURVRJTUVfTUVEX1dJVEhfV0VFS0RBWSA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgd2Vla2RheTogcyxcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgdGltZVpvbmVOYW1lOiBzLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgdGltZVpvbmVOYW1lOiBzLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX0hVR0UgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IGwsXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgdGltZVpvbmVOYW1lOiBsLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgdGltZVpvbmVOYW1lOiBsLFxufTtcbiIsICIvKlxuICBUaGlzIGlzIGp1c3QgYSBqdW5rIGRyYXdlciwgY29udGFpbmluZyBhbnl0aGluZyB1c2VkIGFjcm9zcyBtdWx0aXBsZSBjbGFzc2VzLlxuICBCZWNhdXNlIEx1eG9uIGlzIHNtYWxsKGlzaCksIHRoaXMgc2hvdWxkIHN0YXkgc21hbGwgYW5kIHdlIHdvbid0IHdvcnJ5IGFib3V0IHNwbGl0dGluZ1xuICBpdCB1cCBpbnRvLCBzYXksIHBhcnNpbmdVdGlsLmpzIGFuZCBiYXNpY1V0aWwuanMgYW5kIHNvIG9uLiBCdXQgdGhleSBhcmUgZGl2aWRlZCB1cCBieSBmZWF0dXJlIGFyZWEuXG4qL1xuXG5pbXBvcnQgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8vIFRZUEVTXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZChvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJ1bmRlZmluZWRcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcIm51bWJlclwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcIm51bWJlclwiICYmIG8gJSAxID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwic3RyaW5nXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSBcIltvYmplY3QgRGF0ZV1cIjtcbn1cblxuLy8gQ0FQQUJJTElUSUVTXG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNSZWxhdGl2ZSgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdHlwZW9mIEludGwgIT09IFwidW5kZWZpbmVkXCIgJiYgISFJbnRsLlJlbGF0aXZlVGltZUZvcm1hdDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyBPQkpFQ1RTIEFORCBBUlJBWVNcblxuZXhwb3J0IGZ1bmN0aW9uIG1heWJlQXJyYXkodGhpbmcpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpbmcpID8gdGhpbmcgOiBbdGhpbmddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmVzdEJ5KGFyciwgYnksIGNvbXBhcmUpIHtcbiAgaWYgKGFyci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBhcnIucmVkdWNlKChiZXN0LCBuZXh0KSA9PiB7XG4gICAgY29uc3QgcGFpciA9IFtieShuZXh0KSwgbmV4dF07XG4gICAgaWYgKCFiZXN0KSB7XG4gICAgICByZXR1cm4gcGFpcjtcbiAgICB9IGVsc2UgaWYgKGNvbXBhcmUoYmVzdFswXSwgcGFpclswXSkgPT09IGJlc3RbMF0pIHtcbiAgICAgIHJldHVybiBiZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFpcjtcbiAgICB9XG4gIH0sIG51bGwpWzFdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGljayhvYmosIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKChhLCBrKSA9PiB7XG4gICAgYVtrXSA9IG9ialtrXTtcbiAgICByZXR1cm4gYTtcbiAgfSwge30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxuLy8gTlVNQkVSUyBBTkQgU1RSSU5HU1xuXG5leHBvcnQgZnVuY3Rpb24gaW50ZWdlckJldHdlZW4odGhpbmcsIGJvdHRvbSwgdG9wKSB7XG4gIHJldHVybiBpc0ludGVnZXIodGhpbmcpICYmIHRoaW5nID49IGJvdHRvbSAmJiB0aGluZyA8PSB0b3A7XG59XG5cbi8vIHggJSBuIGJ1dCB0YWtlcyB0aGUgc2lnbiBvZiBuIGluc3RlYWQgb2YgeFxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yTW9kKHgsIG4pIHtcbiAgcmV0dXJuIHggLSBuICogTWF0aC5mbG9vcih4IC8gbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWRTdGFydChpbnB1dCwgbiA9IDIpIHtcbiAgY29uc3QgbWludXMgPSBpbnB1dCA8IDAgPyBcIi1cIiA6IFwiXCI7XG4gIGNvbnN0IHRhcmdldCA9IG1pbnVzID8gaW5wdXQgKiAtMSA6IGlucHV0O1xuICBsZXQgcmVzdWx0O1xuXG4gIGlmICh0YXJnZXQudG9TdHJpbmcoKS5sZW5ndGggPCBuKSB7XG4gICAgcmVzdWx0ID0gKFwiMFwiLnJlcGVhdChuKSArIHRhcmdldCkuc2xpY2UoLW4pO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHRhcmdldC50b1N0cmluZygpO1xuICB9XG5cbiAgcmV0dXJuIGAke21pbnVzfSR7cmVzdWx0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUludGVnZXIoc3RyaW5nKSB7XG4gIGlmIChpc1VuZGVmaW5lZChzdHJpbmcpIHx8IHN0cmluZyA9PT0gbnVsbCB8fCBzdHJpbmcgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUludChzdHJpbmcsIDEwKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNaWxsaXMoZnJhY3Rpb24pIHtcbiAgLy8gUmV0dXJuIHVuZGVmaW5lZCAoaW5zdGVhZCBvZiAwKSBpbiB0aGVzZSBjYXNlcywgd2hlcmUgZnJhY3Rpb24gaXMgbm90IHNldFxuICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb24pIHx8IGZyYWN0aW9uID09PSBudWxsIHx8IGZyYWN0aW9uID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmID0gcGFyc2VGbG9hdChcIjAuXCIgKyBmcmFjdGlvbikgKiAxMDAwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGYpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZFRvKG51bWJlciwgZGlnaXRzLCB0b3dhcmRaZXJvID0gZmFsc2UpIHtcbiAgY29uc3QgZmFjdG9yID0gMTAgKiogZGlnaXRzLFxuICAgIHJvdW5kZXIgPSB0b3dhcmRaZXJvID8gTWF0aC50cnVuYyA6IE1hdGgucm91bmQ7XG4gIHJldHVybiByb3VuZGVyKG51bWJlciAqIGZhY3RvcikgLyBmYWN0b3I7XG59XG5cbi8vIERBVEUgQkFTSUNTXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgcmV0dXJuIHllYXIgJSA0ID09PSAwICYmICh5ZWFyICUgMTAwICE9PSAwIHx8IHllYXIgJSA0MDAgPT09IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF5c0luWWVhcih5ZWFyKSB7XG4gIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgY29uc3QgbW9kTW9udGggPSBmbG9vck1vZChtb250aCAtIDEsIDEyKSArIDEsXG4gICAgbW9kWWVhciA9IHllYXIgKyAobW9udGggLSBtb2RNb250aCkgLyAxMjtcblxuICBpZiAobW9kTW9udGggPT09IDIpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcihtb2RZZWFyKSA/IDI5IDogMjg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdW21vZE1vbnRoIC0gMV07XG4gIH1cbn1cblxuLy8gY292ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgbG9jYWwgdGltZXN0YW1wIChlcG9jaCwgYnV0IHdpdGggdGhlIG9mZnNldCBiYWtlZCBpbilcbmV4cG9ydCBmdW5jdGlvbiBvYmpUb0xvY2FsVFMob2JqKSB7XG4gIGxldCBkID0gRGF0ZS5VVEMoXG4gICAgb2JqLnllYXIsXG4gICAgb2JqLm1vbnRoIC0gMSxcbiAgICBvYmouZGF5LFxuICAgIG9iai5ob3VyLFxuICAgIG9iai5taW51dGUsXG4gICAgb2JqLnNlY29uZCxcbiAgICBvYmoubWlsbGlzZWNvbmRcbiAgKTtcblxuICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMsIHllYXJzIGJldHdlZW4gMCBhbmQgOTkgYXJlIGludGVycHJldGVkIGFzIDE5WFg7IHJldmVydCB0aGF0XG4gIGlmIChvYmoueWVhciA8IDEwMCAmJiBvYmoueWVhciA+PSAwKSB7XG4gICAgZCA9IG5ldyBEYXRlKGQpO1xuICAgIGQuc2V0VVRDRnVsbFllYXIoZC5nZXRVVENGdWxsWWVhcigpIC0gMTkwMCk7XG4gIH1cbiAgcmV0dXJuICtkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKSB7XG4gIGNvbnN0IHAxID1cbiAgICAgICh3ZWVrWWVhciArXG4gICAgICAgIE1hdGguZmxvb3Iod2Vla1llYXIgLyA0KSAtXG4gICAgICAgIE1hdGguZmxvb3Iod2Vla1llYXIgLyAxMDApICtcbiAgICAgICAgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQwMCkpICVcbiAgICAgIDcsXG4gICAgbGFzdCA9IHdlZWtZZWFyIC0gMSxcbiAgICBwMiA9IChsYXN0ICsgTWF0aC5mbG9vcihsYXN0IC8gNCkgLSBNYXRoLmZsb29yKGxhc3QgLyAxMDApICsgTWF0aC5mbG9vcihsYXN0IC8gNDAwKSkgJSA3O1xuICByZXR1cm4gcDEgPT09IDQgfHwgcDIgPT09IDMgPyA1MyA6IDUyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhcikge1xuICBpZiAoeWVhciA+IDk5KSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSByZXR1cm4geWVhciA+IDYwID8gMTkwMCArIHllYXIgOiAyMDAwICsgeWVhcjtcbn1cblxuLy8gUEFSU0lOR1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2Vab25lSW5mbyh0cywgb2Zmc2V0Rm9ybWF0LCBsb2NhbGUsIHRpbWVab25lID0gbnVsbCkge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgIGludGxPcHRzID0ge1xuICAgICAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVkID0geyB0aW1lWm9uZU5hbWU6IG9mZnNldEZvcm1hdCwgLi4uaW50bE9wdHMgfTtcblxuICBjb25zdCBwYXJzZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKVxuICAgIC5mb3JtYXRUb1BhcnRzKGRhdGUpXG4gICAgLmZpbmQoKG0pID0+IG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBcInRpbWV6b25lbmFtZVwiKTtcbiAgcmV0dXJuIHBhcnNlZCA/IHBhcnNlZC52YWx1ZSA6IG51bGw7XG59XG5cbi8vIHNpZ25lZE9mZnNldCgnLTUnLCAnMzAnKSAtPiAtMzMwXG5leHBvcnQgZnVuY3Rpb24gc2lnbmVkT2Zmc2V0KG9mZkhvdXJTdHIsIG9mZk1pbnV0ZVN0cikge1xuICBsZXQgb2ZmSG91ciA9IHBhcnNlSW50KG9mZkhvdXJTdHIsIDEwKTtcblxuICAvLyBkb24ndCB8fCB0aGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBwcmVzZXJ2ZSAtMFxuICBpZiAoTnVtYmVyLmlzTmFOKG9mZkhvdXIpKSB7XG4gICAgb2ZmSG91ciA9IDA7XG4gIH1cblxuICBjb25zdCBvZmZNaW4gPSBwYXJzZUludChvZmZNaW51dGVTdHIsIDEwKSB8fCAwLFxuICAgIG9mZk1pblNpZ25lZCA9IG9mZkhvdXIgPCAwIHx8IE9iamVjdC5pcyhvZmZIb3VyLCAtMCkgPyAtb2ZmTWluIDogb2ZmTWluO1xuICByZXR1cm4gb2ZmSG91ciAqIDYwICsgb2ZmTWluU2lnbmVkO1xufVxuXG4vLyBDT0VSQ0lPTlxuXG5leHBvcnQgZnVuY3Rpb24gYXNOdW1iZXIodmFsdWUpIHtcbiAgY29uc3QgbnVtZXJpY1ZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgfHwgdmFsdWUgPT09IFwiXCIgfHwgTnVtYmVyLmlzTmFOKG51bWVyaWNWYWx1ZSkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHVuaXQgdmFsdWUgJHt2YWx1ZX1gKTtcbiAgcmV0dXJuIG51bWVyaWNWYWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZXIpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9O1xuICBmb3IgKGNvbnN0IHUgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwgdSkpIHtcbiAgICAgIGNvbnN0IHYgPSBvYmpbdV07XG4gICAgICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVyKHUpXSA9IGFzTnVtYmVyKHYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE9mZnNldChvZmZzZXQsIGZvcm1hdCkge1xuICBjb25zdCBob3VycyA9IE1hdGgudHJ1bmMoTWF0aC5hYnMob2Zmc2V0IC8gNjApKSxcbiAgICBtaW51dGVzID0gTWF0aC50cnVuYyhNYXRoLmFicyhvZmZzZXQgJSA2MCkpLFxuICAgIHNpZ24gPSBvZmZzZXQgPj0gMCA/IFwiK1wiIDogXCItXCI7XG5cbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBgJHtzaWdufSR7cGFkU3RhcnQoaG91cnMsIDIpfToke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG4gICAgY2FzZSBcIm5hcnJvd1wiOlxuICAgICAgcmV0dXJuIGAke3NpZ259JHtob3Vyc30ke21pbnV0ZXMgPiAwID8gYDoke21pbnV0ZXN9YCA6IFwiXCJ9YDtcbiAgICBjYXNlIFwidGVjaGllXCI6XG4gICAgICByZXR1cm4gYCR7c2lnbn0ke3BhZFN0YXJ0KGhvdXJzLCAyKX0ke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtmb3JtYXR9IGlzIG91dCBvZiByYW5nZSBmb3IgcHJvcGVydHkgZm9ybWF0YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVPYmplY3Qob2JqKSB7XG4gIHJldHVybiBwaWNrKG9iaiwgW1wiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlhbmFSZWdleCA9IC9bQS1aYS16XystXXsxLDI1Nn0oOj9cXC9bQS1aYS16XystXXsxLDI1Nn0oXFwvW0EtWmEtel8rLV17MSwyNTZ9KT8pPy87XG4iLCAiaW1wb3J0ICogYXMgRm9ybWF0cyBmcm9tIFwiLi9mb3JtYXRzLmpzXCI7XG5pbXBvcnQgeyBwaWNrIH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIE9iamVjdC5rZXlzKG9iaikuc29ydCgpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBjb25zdCBtb250aHNMb25nID0gW1xuICBcIkphbnVhcnlcIixcbiAgXCJGZWJydWFyeVwiLFxuICBcIk1hcmNoXCIsXG4gIFwiQXByaWxcIixcbiAgXCJNYXlcIixcbiAgXCJKdW5lXCIsXG4gIFwiSnVseVwiLFxuICBcIkF1Z3VzdFwiLFxuICBcIlNlcHRlbWJlclwiLFxuICBcIk9jdG9iZXJcIixcbiAgXCJOb3ZlbWJlclwiLFxuICBcIkRlY2VtYmVyXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgbW9udGhzU2hvcnQgPSBbXG4gIFwiSmFuXCIsXG4gIFwiRmViXCIsXG4gIFwiTWFyXCIsXG4gIFwiQXByXCIsXG4gIFwiTWF5XCIsXG4gIFwiSnVuXCIsXG4gIFwiSnVsXCIsXG4gIFwiQXVnXCIsXG4gIFwiU2VwXCIsXG4gIFwiT2N0XCIsXG4gIFwiTm92XCIsXG4gIFwiRGVjXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgbW9udGhzTmFycm93ID0gW1wiSlwiLCBcIkZcIiwgXCJNXCIsIFwiQVwiLCBcIk1cIiwgXCJKXCIsIFwiSlwiLCBcIkFcIiwgXCJTXCIsIFwiT1wiLCBcIk5cIiwgXCJEXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gbW9udGhzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4ubW9udGhzTmFycm93XTtcbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBbLi4ubW9udGhzU2hvcnRdO1xuICAgIGNhc2UgXCJsb25nXCI6XG4gICAgICByZXR1cm4gWy4uLm1vbnRoc0xvbmddO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiLCBcIjhcIiwgXCI5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuICAgIGNhc2UgXCIyLWRpZ2l0XCI6XG4gICAgICByZXR1cm4gW1wiMDFcIiwgXCIwMlwiLCBcIjAzXCIsIFwiMDRcIiwgXCIwNVwiLCBcIjA2XCIsIFwiMDdcIiwgXCIwOFwiLCBcIjA5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd2Vla2RheXNMb25nID0gW1xuICBcIk1vbmRheVwiLFxuICBcIlR1ZXNkYXlcIixcbiAgXCJXZWRuZXNkYXlcIixcbiAgXCJUaHVyc2RheVwiLFxuICBcIkZyaWRheVwiLFxuICBcIlNhdHVyZGF5XCIsXG4gIFwiU3VuZGF5XCIsXG5dO1xuXG5leHBvcnQgY29uc3Qgd2Vla2RheXNTaG9ydCA9IFtcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiLCBcIlN1blwiXTtcblxuZXhwb3J0IGNvbnN0IHdlZWtkYXlzTmFycm93ID0gW1wiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCIsIFwiU1wiXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtkYXlzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4ud2Vla2RheXNOYXJyb3ddO1xuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIFsuLi53ZWVrZGF5c1Nob3J0XTtcbiAgICBjYXNlIFwibG9uZ1wiOlxuICAgICAgcmV0dXJuIFsuLi53ZWVrZGF5c0xvbmddO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiXTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1lcmlkaWVtcyA9IFtcIkFNXCIsIFwiUE1cIl07XG5cbmV4cG9ydCBjb25zdCBlcmFzTG9uZyA9IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXTtcblxuZXhwb3J0IGNvbnN0IGVyYXNTaG9ydCA9IFtcIkJDXCIsIFwiQURcIl07XG5cbmV4cG9ydCBjb25zdCBlcmFzTmFycm93ID0gW1wiQlwiLCBcIkFcIl07XG5cbmV4cG9ydCBmdW5jdGlvbiBlcmFzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4uZXJhc05hcnJvd107XG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gWy4uLmVyYXNTaG9ydF07XG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiBbLi4uZXJhc0xvbmddO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyaWRpZW1Gb3JEYXRlVGltZShkdCkge1xuICByZXR1cm4gbWVyaWRpZW1zW2R0LmhvdXIgPCAxMiA/IDAgOiAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiB3ZWVrZGF5cyhsZW5ndGgpW2R0LndlZWtkYXkgLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gbW9udGhzKGxlbmd0aClbZHQubW9udGggLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGVyYXMobGVuZ3RoKVtkdC55ZWFyIDwgMCA/IDAgOiAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlVGltZSh1bml0LCBjb3VudCwgbnVtZXJpYyA9IFwiYWx3YXlzXCIsIG5hcnJvdyA9IGZhbHNlKSB7XG4gIGNvbnN0IHVuaXRzID0ge1xuICAgIHllYXJzOiBbXCJ5ZWFyXCIsIFwieXIuXCJdLFxuICAgIHF1YXJ0ZXJzOiBbXCJxdWFydGVyXCIsIFwicXRyLlwiXSxcbiAgICBtb250aHM6IFtcIm1vbnRoXCIsIFwibW8uXCJdLFxuICAgIHdlZWtzOiBbXCJ3ZWVrXCIsIFwid2suXCJdLFxuICAgIGRheXM6IFtcImRheVwiLCBcImRheVwiLCBcImRheXNcIl0sXG4gICAgaG91cnM6IFtcImhvdXJcIiwgXCJoci5cIl0sXG4gICAgbWludXRlczogW1wibWludXRlXCIsIFwibWluLlwiXSxcbiAgICBzZWNvbmRzOiBbXCJzZWNvbmRcIiwgXCJzZWMuXCJdLFxuICB9O1xuXG4gIGNvbnN0IGxhc3RhYmxlID0gW1wiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXS5pbmRleE9mKHVuaXQpID09PSAtMTtcblxuICBpZiAobnVtZXJpYyA9PT0gXCJhdXRvXCIgJiYgbGFzdGFibGUpIHtcbiAgICBjb25zdCBpc0RheSA9IHVuaXQgPT09IFwiZGF5c1wiO1xuICAgIHN3aXRjaCAoY291bnQpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b21vcnJvd1wiIDogYG5leHQgJHt1bml0c1t1bml0XVswXX1gO1xuICAgICAgY2FzZSAtMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ5ZXN0ZXJkYXlcIiA6IGBsYXN0ICR7dW5pdHNbdW5pdF1bMF19YDtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b2RheVwiIDogYHRoaXMgJHt1bml0c1t1bml0XVswXX1gO1xuICAgICAgZGVmYXVsdDogLy8gZmFsbCB0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNJblBhc3QgPSBPYmplY3QuaXMoY291bnQsIC0wKSB8fCBjb3VudCA8IDAsXG4gICAgZm10VmFsdWUgPSBNYXRoLmFicyhjb3VudCksXG4gICAgc2luZ3VsYXIgPSBmbXRWYWx1ZSA9PT0gMSxcbiAgICBsaWxVbml0cyA9IHVuaXRzW3VuaXRdLFxuICAgIGZtdFVuaXQgPSBuYXJyb3dcbiAgICAgID8gc2luZ3VsYXJcbiAgICAgICAgPyBsaWxVbml0c1sxXVxuICAgICAgICA6IGxpbFVuaXRzWzJdIHx8IGxpbFVuaXRzWzFdXG4gICAgICA6IHNpbmd1bGFyXG4gICAgICA/IHVuaXRzW3VuaXRdWzBdXG4gICAgICA6IHVuaXQ7XG4gIHJldHVybiBpc0luUGFzdCA/IGAke2ZtdFZhbHVlfSAke2ZtdFVuaXR9IGFnb2AgOiBgaW4gJHtmbXRWYWx1ZX0gJHtmbXRVbml0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICBjb25zdCBmaWx0ZXJlZCA9IHBpY2soa25vd25Gb3JtYXQsIFtcbiAgICAgIFwid2Vla2RheVwiLFxuICAgICAgXCJlcmFcIixcbiAgICAgIFwieWVhclwiLFxuICAgICAgXCJtb250aFwiLFxuICAgICAgXCJkYXlcIixcbiAgICAgIFwiaG91clwiLFxuICAgICAgXCJtaW51dGVcIixcbiAgICAgIFwic2Vjb25kXCIsXG4gICAgICBcInRpbWVab25lTmFtZVwiLFxuICAgICAgXCJob3VyQ3ljbGVcIixcbiAgICBdKSxcbiAgICBrZXkgPSBzdHJpbmdpZnkoZmlsdGVyZWQpLFxuICAgIGRhdGVUaW1lSHVnZSA9IFwiRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXlcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5XCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFX01FRF9XSVRIX1dFRUtEQVkpOlxuICAgICAgcmV0dXJuIFwiRUVFLCBMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURV9GVUxMKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURV9IVUdFKTpcbiAgICAgIHJldHVybiBcIkVFRUUsIExMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuVElNRV9TSU1QTEUpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJoOm1tOnNzIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FXzI0X1NJTVBMRSk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuVElNRV8yNF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiSEg6bW06c3NcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURVRJTUVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXksIGg6bW0gYVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURVRJTUVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0ZVTEwpOlxuICAgICAgcmV0dXJuIFwiTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0hVR0UpOlxuICAgICAgcmV0dXJuIGRhdGVUaW1lSHVnZTtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJNL2QveXl5eSwgaDptbTpzcyBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5LCBoOm1tOnNzIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkpOlxuICAgICAgcmV0dXJuIFwiRUVFLCBkIExMTCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eSwgaDptbTpzcyBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJFRUVFLCBMTExMIGQsIHl5eXksIGg6bW06c3MgYVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgRW5nbGlzaCBmcm9tIFwiLi9lbmdsaXNoLmpzXCI7XG5pbXBvcnQgKiBhcyBGb3JtYXRzIGZyb20gXCIuL2Zvcm1hdHMuanNcIjtcbmltcG9ydCB7IHBhZFN0YXJ0IH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbnMoc3BsaXRzLCB0b2tlblRvU3RyaW5nKSB7XG4gIGxldCBzID0gXCJcIjtcbiAgZm9yIChjb25zdCB0b2tlbiBvZiBzcGxpdHMpIHtcbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcyArPSB0b2tlbi52YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMgKz0gdG9rZW5Ub1N0cmluZyh0b2tlbi52YWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcztcbn1cblxuY29uc3QgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyA9IHtcbiAgRDogRm9ybWF0cy5EQVRFX1NIT1JULFxuICBERDogRm9ybWF0cy5EQVRFX01FRCxcbiAgREREOiBGb3JtYXRzLkRBVEVfRlVMTCxcbiAgRERERDogRm9ybWF0cy5EQVRFX0hVR0UsXG4gIHQ6IEZvcm1hdHMuVElNRV9TSU1QTEUsXG4gIHR0OiBGb3JtYXRzLlRJTUVfV0lUSF9TRUNPTkRTLFxuICB0dHQ6IEZvcm1hdHMuVElNRV9XSVRIX1NIT1JUX09GRlNFVCxcbiAgdHR0dDogRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQsXG4gIFQ6IEZvcm1hdHMuVElNRV8yNF9TSU1QTEUsXG4gIFRUOiBGb3JtYXRzLlRJTUVfMjRfV0lUSF9TRUNPTkRTLFxuICBUVFQ6IEZvcm1hdHMuVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCxcbiAgVFRUVDogRm9ybWF0cy5USU1FXzI0X1dJVEhfTE9OR19PRkZTRVQsXG4gIGY6IEZvcm1hdHMuREFURVRJTUVfU0hPUlQsXG4gIGZmOiBGb3JtYXRzLkRBVEVUSU1FX01FRCxcbiAgZmZmOiBGb3JtYXRzLkRBVEVUSU1FX0ZVTEwsXG4gIGZmZmY6IEZvcm1hdHMuREFURVRJTUVfSFVHRSxcbiAgRjogRm9ybWF0cy5EQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMsXG4gIEZGOiBGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMsXG4gIEZGRjogRm9ybWF0cy5EQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyxcbiAgRkZGRjogRm9ybWF0cy5EQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyxcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtYXR0ZXIge1xuICBzdGF0aWMgY3JlYXRlKGxvY2FsZSwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBGb3JtYXR0ZXIobG9jYWxlLCBvcHRzKTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUZvcm1hdChmbXQpIHtcbiAgICBsZXQgY3VycmVudCA9IG51bGwsXG4gICAgICBjdXJyZW50RnVsbCA9IFwiXCIsXG4gICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBzcGxpdHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZtdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYyA9IGZtdC5jaGFyQXQoaSk7XG4gICAgICBpZiAoYyA9PT0gXCInXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGJyYWNrZXRlZCwgdmFsOiBjdXJyZW50RnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGZhbHNlLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogYnJhY2tldGVkLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzcGxpdHM7XG4gIH1cblxuICBzdGF0aWMgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyh0b2tlbikge1xuICAgIHJldHVybiBtYWNyb1Rva2VuVG9Gb3JtYXRPcHRzW3Rva2VuXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgZm9ybWF0T3B0cykge1xuICAgIHRoaXMub3B0cyA9IGZvcm1hdE9wdHM7XG4gICAgdGhpcy5sb2MgPSBsb2NhbGU7XG4gICAgdGhpcy5zeXN0ZW1Mb2MgPSBudWxsO1xuICB9XG5cbiAgZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQoZHQsIG9wdHMpIHtcbiAgICBpZiAodGhpcy5zeXN0ZW1Mb2MgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc3lzdGVtTG9jID0gdGhpcy5sb2MucmVkZWZhdWx0VG9TeXN0ZW0oKTtcbiAgICB9XG4gICAgY29uc3QgZGYgPSB0aGlzLnN5c3RlbUxvYy5kdEZvcm1hdHRlcihkdCwgeyAuLi50aGlzLm9wdHMsIC4uLm9wdHMgfSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZVRpbWUoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5mb3JtYXQoKTtcbiAgfVxuXG4gIGZvcm1hdERhdGVUaW1lUGFydHMoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5mb3JtYXRUb1BhcnRzKCk7XG4gIH1cblxuICByZXNvbHZlZE9wdGlvbnMoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgfVxuXG4gIG51bShuLCBwID0gMCkge1xuICAgIC8vIHdlIGdldCBzb21lIHBlcmYgb3V0IG9mIGRvaW5nIHRoaXMgaGVyZSwgYW5ub3lpbmdseVxuICAgIGlmICh0aGlzLm9wdHMuZm9yY2VTaW1wbGUpIHtcbiAgICAgIHJldHVybiBwYWRTdGFydChuLCBwKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRzID0geyAuLi50aGlzLm9wdHMgfTtcblxuICAgIGlmIChwID4gMCkge1xuICAgICAgb3B0cy5wYWRUbyA9IHA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihvcHRzKS5mb3JtYXQobik7XG4gIH1cblxuICBmb3JtYXREYXRlVGltZUZyb21TdHJpbmcoZHQsIGZtdCkge1xuICAgIGNvbnN0IGtub3duRW5nbGlzaCA9IHRoaXMubG9jLmxpc3RpbmdNb2RlKCkgPT09IFwiZW5cIixcbiAgICAgIHVzZURhdGVUaW1lRm9ybWF0dGVyID0gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgJiYgdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgIT09IFwiZ3JlZ29yeVwiLFxuICAgICAgc3RyaW5nID0gKG9wdHMsIGV4dHJhY3QpID0+IHRoaXMubG9jLmV4dHJhY3QoZHQsIG9wdHMsIGV4dHJhY3QpLFxuICAgICAgZm9ybWF0T2Zmc2V0ID0gKG9wdHMpID0+IHtcbiAgICAgICAgaWYgKGR0LmlzT2Zmc2V0Rml4ZWQgJiYgZHQub2Zmc2V0ID09PSAwICYmIG9wdHMuYWxsb3daKSB7XG4gICAgICAgICAgcmV0dXJuIFwiWlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGR0LmlzVmFsaWQgPyBkdC56b25lLmZvcm1hdE9mZnNldChkdC50cywgb3B0cy5mb3JtYXQpIDogXCJcIjtcbiAgICAgIH0sXG4gICAgICBtZXJpZGllbSA9ICgpID0+XG4gICAgICAgIGtub3duRW5nbGlzaFxuICAgICAgICAgID8gRW5nbGlzaC5tZXJpZGllbUZvckRhdGVUaW1lKGR0KVxuICAgICAgICAgIDogc3RyaW5nKHsgaG91cjogXCJudW1lcmljXCIsIGhvdXJDeWNsZTogXCJoMTJcIiB9LCBcImRheXBlcmlvZFwiKSxcbiAgICAgIG1vbnRoID0gKGxlbmd0aCwgc3RhbmRhbG9uZSkgPT5cbiAgICAgICAga25vd25FbmdsaXNoXG4gICAgICAgICAgPyBFbmdsaXNoLm1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aClcbiAgICAgICAgICA6IHN0cmluZyhzdGFuZGFsb25lID8geyBtb250aDogbGVuZ3RoIH0gOiB7IG1vbnRoOiBsZW5ndGgsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKSxcbiAgICAgIHdlZWtkYXkgPSAobGVuZ3RoLCBzdGFuZGFsb25lKSA9PlxuICAgICAgICBrbm93bkVuZ2xpc2hcbiAgICAgICAgICA/IEVuZ2xpc2gud2Vla2RheUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpXG4gICAgICAgICAgOiBzdHJpbmcoXG4gICAgICAgICAgICAgIHN0YW5kYWxvbmUgPyB7IHdlZWtkYXk6IGxlbmd0aCB9IDogeyB3ZWVrZGF5OiBsZW5ndGgsIG1vbnRoOiBcImxvbmdcIiwgZGF5OiBcIm51bWVyaWNcIiB9LFxuICAgICAgICAgICAgICBcIndlZWtkYXlcIlxuICAgICAgICAgICAgKSxcbiAgICAgIG1heWJlTWFjcm8gPSAodG9rZW4pID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0T3B0cyA9IEZvcm1hdHRlci5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHRva2VuKTtcbiAgICAgICAgaWYgKGZvcm1hdE9wdHMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChkdCwgZm9ybWF0T3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJhID0gKGxlbmd0aCkgPT5cbiAgICAgICAga25vd25FbmdsaXNoID8gRW5nbGlzaC5lcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyh7IGVyYTogbGVuZ3RoIH0sIFwiZXJhXCIpLFxuICAgICAgdG9rZW5Ub1N0cmluZyA9ICh0b2tlbikgPT4ge1xuICAgICAgICAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lLTEvZGF0ZS10aW1lI1RPQy1TdGFuZGFsb25lLXZzLi1Gb3JtYXQtU3R5bGVzXG4gICAgICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgICAgICAvLyBtc1xuICAgICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWlsbGlzZWNvbmQpO1xuICAgICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5taWxsaXNlY29uZCwgMyk7XG4gICAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuc2Vjb25kKTtcbiAgICAgICAgICBjYXNlIFwic3NcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5zZWNvbmQsIDIpO1xuICAgICAgICAgIC8vIG1pbnV0ZXNcbiAgICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0Lm1pbnV0ZSk7XG4gICAgICAgICAgY2FzZSBcIm1tXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWludXRlLCAyKTtcbiAgICAgICAgICAvLyBob3Vyc1xuICAgICAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIpO1xuICAgICAgICAgIGNhc2UgXCJoaFwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LmhvdXIgJSAxMiA9PT0gMCA/IDEyIDogZHQuaG91ciAlIDEyLCAyKTtcbiAgICAgICAgICBjYXNlIFwiSFwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LmhvdXIpO1xuICAgICAgICAgIGNhc2UgXCJISFwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LmhvdXIsIDIpO1xuICAgICAgICAgIC8vIG9mZnNldFxuICAgICAgICAgIGNhc2UgXCJaXCI6XG4gICAgICAgICAgICAvLyBsaWtlICs2XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiBcIm5hcnJvd1wiLCBhbGxvd1o6IHRoaXMub3B0cy5hbGxvd1ogfSk7XG4gICAgICAgICAgY2FzZSBcIlpaXCI6XG4gICAgICAgICAgICAvLyBsaWtlICswNjowMFxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE9mZnNldCh7IGZvcm1hdDogXCJzaG9ydFwiLCBhbGxvd1o6IHRoaXMub3B0cy5hbGxvd1ogfSk7XG4gICAgICAgICAgY2FzZSBcIlpaWlwiOlxuICAgICAgICAgICAgLy8gbGlrZSArMDYwMFxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE9mZnNldCh7IGZvcm1hdDogXCJ0ZWNoaWVcIiwgYWxsb3daOiB0aGlzLm9wdHMuYWxsb3daIH0pO1xuICAgICAgICAgIGNhc2UgXCJaWlpaXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEVTVFxuICAgICAgICAgICAgcmV0dXJuIGR0LnpvbmUub2Zmc2V0TmFtZShkdC50cywgeyBmb3JtYXQ6IFwic2hvcnRcIiwgbG9jYWxlOiB0aGlzLmxvYy5sb2NhbGUgfSk7XG4gICAgICAgICAgY2FzZSBcIlpaWlpaXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEVhc3Rlcm4gU3RhbmRhcmQgVGltZVxuICAgICAgICAgICAgcmV0dXJuIGR0LnpvbmUub2Zmc2V0TmFtZShkdC50cywgeyBmb3JtYXQ6IFwibG9uZ1wiLCBsb2NhbGU6IHRoaXMubG9jLmxvY2FsZSB9KTtcbiAgICAgICAgICAvLyB6b25lXG4gICAgICAgICAgY2FzZSBcInpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgQW1lcmljYS9OZXdfWW9ya1xuICAgICAgICAgICAgcmV0dXJuIGR0LnpvbmVOYW1lO1xuICAgICAgICAgIC8vIG1lcmlkaWVtc1xuICAgICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgICByZXR1cm4gbWVyaWRpZW0oKTtcbiAgICAgICAgICAvLyBkYXRlc1xuICAgICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXIgPyBzdHJpbmcoeyBkYXk6IFwibnVtZXJpY1wiIH0sIFwiZGF5XCIpIDogdGhpcy5udW0oZHQuZGF5KTtcbiAgICAgICAgICBjYXNlIFwiZGRcIjpcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7IGRheTogXCIyLWRpZ2l0XCIgfSwgXCJkYXlcIikgOiB0aGlzLm51bShkdC5kYXksIDIpO1xuICAgICAgICAgIC8vIHdlZWtkYXlzIC0gc3RhbmRhbG9uZVxuICAgICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrZGF5KTtcbiAgICAgICAgICBjYXNlIFwiY2NjXCI6XG4gICAgICAgICAgICAvLyBsaWtlICdUdWVzJ1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJzaG9ydFwiLCB0cnVlKTtcbiAgICAgICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgICAgICAgLy8gbGlrZSAnVHVlc2RheSdcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibG9uZ1wiLCB0cnVlKTtcbiAgICAgICAgICBjYXNlIFwiY2NjY2NcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgJ1QnXG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheShcIm5hcnJvd1wiLCB0cnVlKTtcbiAgICAgICAgICAvLyB3ZWVrZGF5cyAtIGZvcm1hdFxuICAgICAgICAgIGNhc2UgXCJFXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrZGF5KTtcbiAgICAgICAgICBjYXNlIFwiRUVFXCI6XG4gICAgICAgICAgICAvLyBsaWtlICdUdWVzJ1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJzaG9ydFwiLCBmYWxzZSk7XG4gICAgICAgICAgY2FzZSBcIkVFRUVcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgJ1R1ZXNkYXknXG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheShcImxvbmdcIiwgZmFsc2UpO1xuICAgICAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAnVCdcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibmFycm93XCIsIGZhbHNlKTtcbiAgICAgICAgICAvLyBtb250aHMgLSBzdGFuZGFsb25lXG4gICAgICAgICAgY2FzZSBcIkxcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgbW9udGg6IFwibnVtZXJpY1wiLCBkYXk6IFwibnVtZXJpY1wiIH0sIFwibW9udGhcIilcbiAgICAgICAgICAgICAgOiB0aGlzLm51bShkdC5tb250aCk7XG4gICAgICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDAxLCBkb2Vzbid0IHNlZW0gdG8gd29ya1xuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgbW9udGg6IFwiMi1kaWdpdFwiLCBkYXk6IFwibnVtZXJpY1wiIH0sIFwibW9udGhcIilcbiAgICAgICAgICAgICAgOiB0aGlzLm51bShkdC5tb250aCwgMik7XG4gICAgICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICAgIHJldHVybiBtb250aChcInNob3J0XCIsIHRydWUpO1xuICAgICAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEphbnVhcnlcbiAgICAgICAgICAgIHJldHVybiBtb250aChcImxvbmdcIiwgdHJ1ZSk7XG4gICAgICAgICAgY2FzZSBcIkxMTExMXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICAgIHJldHVybiBtb250aChcIm5hcnJvd1wiLCB0cnVlKTtcbiAgICAgICAgICAvLyBtb250aHMgLSBmb3JtYXRcbiAgICAgICAgICBjYXNlIFwiTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgPyBzdHJpbmcoeyBtb250aDogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0Lm1vbnRoKTtcbiAgICAgICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDFcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IG1vbnRoOiBcIjItZGlnaXRcIiB9LCBcIm1vbnRoXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQubW9udGgsIDIpO1xuICAgICAgICAgIGNhc2UgXCJNTU1cIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSmFuXG4gICAgICAgICAgICByZXR1cm4gbW9udGgoXCJzaG9ydFwiLCBmYWxzZSk7XG4gICAgICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSmFudWFyeVxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibG9uZ1wiLCBmYWxzZSk7XG4gICAgICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICAgIHJldHVybiBtb250aChcIm5hcnJvd1wiLCBmYWxzZSk7XG4gICAgICAgICAgLy8geWVhcnNcbiAgICAgICAgICBjYXNlIFwieVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAyMDE0XG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXIgPyBzdHJpbmcoeyB5ZWFyOiBcIm51bWVyaWNcIiB9LCBcInllYXJcIikgOiB0aGlzLm51bShkdC55ZWFyKTtcbiAgICAgICAgICBjYXNlIFwieXlcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMTRcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IHllYXI6IFwiMi1kaWdpdFwiIH0sIFwieWVhclwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0LnllYXIudG9TdHJpbmcoKS5zbGljZSgtMiksIDIpO1xuICAgICAgICAgIGNhc2UgXCJ5eXl5XCI6XG4gICAgICAgICAgICAvLyBsaWtlIDAwMTJcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IHllYXI6IFwibnVtZXJpY1wiIH0sIFwieWVhclwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0LnllYXIsIDQpO1xuICAgICAgICAgIGNhc2UgXCJ5eXl5eXlcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDAwMDEyXG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgPyBzdHJpbmcoeyB5ZWFyOiBcIm51bWVyaWNcIiB9LCBcInllYXJcIilcbiAgICAgICAgICAgICAgOiB0aGlzLm51bShkdC55ZWFyLCA2KTtcbiAgICAgICAgICAvLyBlcmFzXG4gICAgICAgICAgY2FzZSBcIkdcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgQURcbiAgICAgICAgICAgIHJldHVybiBlcmEoXCJzaG9ydFwiKTtcbiAgICAgICAgICBjYXNlIFwiR0dcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgQW5ubyBEb21pbmlcbiAgICAgICAgICAgIHJldHVybiBlcmEoXCJsb25nXCIpO1xuICAgICAgICAgIGNhc2UgXCJHR0dHR1wiOlxuICAgICAgICAgICAgcmV0dXJuIGVyYShcIm5hcnJvd1wiKTtcbiAgICAgICAgICBjYXNlIFwia2tcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG4gICAgICAgICAgY2FzZSBcImtra2tcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrWWVhciwgNCk7XG4gICAgICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrTnVtYmVyKTtcbiAgICAgICAgICBjYXNlIFwiV1dcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrTnVtYmVyLCAyKTtcbiAgICAgICAgICBjYXNlIFwib1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0Lm9yZGluYWwpO1xuICAgICAgICAgIGNhc2UgXCJvb29cIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5vcmRpbmFsLCAzKTtcbiAgICAgICAgICBjYXNlIFwicVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQucXVhcnRlcik7XG4gICAgICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDAxXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQucXVhcnRlciwgMik7XG4gICAgICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGR0LnRzIC8gMTAwMCkpO1xuICAgICAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQudHMpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWF5YmVNYWNybyh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKEZvcm1hdHRlci5wYXJzZUZvcm1hdChmbXQpLCB0b2tlblRvU3RyaW5nKTtcbiAgfVxuXG4gIGZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyhkdXIsIGZtdCkge1xuICAgIGNvbnN0IHRva2VuVG9GaWVsZCA9ICh0b2tlbikgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRva2VuWzBdKSB7XG4gICAgICAgICAgY2FzZSBcIlNcIjpcbiAgICAgICAgICAgIHJldHVybiBcIm1pbGxpc2Vjb25kXCI7XG4gICAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICAgIHJldHVybiBcInNlY29uZFwiO1xuICAgICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJtaW51dGVcIjtcbiAgICAgICAgICBjYXNlIFwiaFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiaG91clwiO1xuICAgICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJkYXlcIjtcbiAgICAgICAgICBjYXNlIFwiTVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwibW9udGhcIjtcbiAgICAgICAgICBjYXNlIFwieVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwieWVhclwiO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRva2VuVG9TdHJpbmcgPSAobGlsZHVyKSA9PiAodG9rZW4pID0+IHtcbiAgICAgICAgY29uc3QgbWFwcGVkID0gdG9rZW5Ub0ZpZWxkKHRva2VuKTtcbiAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm51bShsaWxkdXIuZ2V0KG1hcHBlZCksIHRva2VuLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdG9rZW5zID0gRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZtdCksXG4gICAgICByZWFsVG9rZW5zID0gdG9rZW5zLnJlZHVjZShcbiAgICAgICAgKGZvdW5kLCB7IGxpdGVyYWwsIHZhbCB9KSA9PiAobGl0ZXJhbCA/IGZvdW5kIDogZm91bmQuY29uY2F0KHZhbCkpLFxuICAgICAgICBbXVxuICAgICAgKSxcbiAgICAgIGNvbGxhcHNlZCA9IGR1ci5zaGlmdFRvKC4uLnJlYWxUb2tlbnMubWFwKHRva2VuVG9GaWVsZCkuZmlsdGVyKCh0KSA9PiB0KSk7XG4gICAgcmV0dXJuIHN0cmluZ2lmeVRva2Vucyh0b2tlbnMsIHRva2VuVG9TdHJpbmcoY29sbGFwc2VkKSk7XG4gIH1cbn1cbiIsICJleHBvcnQgZGVmYXVsdCBjbGFzcyBJbnZhbGlkIHtcbiAgY29uc3RydWN0b3IocmVhc29uLCBleHBsYW5hdGlvbikge1xuICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICAgIHRoaXMuZXhwbGFuYXRpb24gPSBleHBsYW5hdGlvbjtcbiAgfVxuXG4gIHRvTWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5leHBsYW5hdGlvbikge1xuICAgICAgcmV0dXJuIGAke3RoaXMucmVhc29ufTogJHt0aGlzLmV4cGxhbmF0aW9ufWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYXNvbjtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBab25lSXNBYnN0cmFjdEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5cbi8qKlxuICogQGludGVyZmFjZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBab25lIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHpvbmVcbiAgICogQGFic3RyYWN0XG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdHlwZSgpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgem9uZS5cbiAgICogQGFic3RyYWN0XG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbmFtZSgpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgb2Zmc2V0IGlzIGtub3duIHRvIGJlIGZpeGVkIGZvciB0aGUgd2hvbGUgeWVhci5cbiAgICogQGFic3RyYWN0XG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2Zmc2V0J3MgY29tbW9uIG5hbWUgKHN1Y2ggYXMgRVNUKSBhdCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcFxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRzIC0gRXBvY2ggbWlsbGlzZWNvbmRzIGZvciB3aGljaCB0byBnZXQgdGhlIG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBPcHRpb25zIHRvIGFmZmVjdCB0aGUgZm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZvcm1hdCAtIFdoYXQgc3R5bGUgb2Ygb2Zmc2V0IHRvIHJldHVybi4gQWNjZXB0cyAnbG9uZycgb3IgJ3Nob3J0Jy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubG9jYWxlIC0gV2hhdCBsb2NhbGUgdG8gcmV0dXJuIHRoZSBvZmZzZXQgbmFtZSBpbi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgb2Zmc2V0TmFtZSh0cywgb3B0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2Zmc2V0J3MgdmFsdWUgYXMgYSBzdHJpbmdcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cyAtIEVwb2NoIG1pbGxpc2Vjb25kcyBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBvZmZzZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFdoYXQgc3R5bGUgb2Ygb2Zmc2V0IHRvIHJldHVybi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdHMgJ25hcnJvdycsICdzaG9ydCcsIG9yICd0ZWNoaWUnLiBSZXR1cm5pbmcgJys2JywgJyswNjowMCcsIG9yICcrMDYwMCcgcmVzcGVjdGl2ZWx5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZvcm1hdE9mZnNldCh0cywgZm9ybWF0KSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9mZnNldCBpbiBtaW51dGVzIGZvciB0aGlzIHpvbmUgYXQgdGhlIHNwZWNpZmllZCB0aW1lc3RhbXAuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGNvbXB1dGUgdGhlIG9mZnNldFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBvZmZzZXQodHMpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgWm9uZSBpcyBlcXVhbCB0byBhbm90aGVyIHpvbmVcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7Wm9uZX0gb3RoZXJab25lIC0gdGhlIHpvbmUgdG8gY29tcGFyZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIHZhbGlkLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZm9ybWF0T2Zmc2V0LCBwYXJzZVpvbmVJbmZvIH0gZnJvbSBcIi4uL2ltcGwvdXRpbC5qc1wiO1xuaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcblxubGV0IHNpbmdsZXRvbiA9IG51bGw7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgbG9jYWwgem9uZSBmb3IgdGhpcyBKYXZhU2NyaXB0IGVudmlyb25tZW50LlxuICogQGltcGxlbWVudHMge1pvbmV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5c3RlbVpvbmUgZXh0ZW5kcyBab25lIHtcbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgbG9jYWwgem9uZVxuICAgKiBAcmV0dXJuIHtTeXN0ZW1ab25lfVxuICAgKi9cbiAgc3RhdGljIGdldCBpbnN0YW5jZSgpIHtcbiAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICBzaW5nbGV0b24gPSBuZXcgU3lzdGVtWm9uZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc2luZ2xldG9uO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwic3lzdGVtXCI7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBpc1VuaXZlcnNhbCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBvZmZzZXROYW1lKHRzLCB7IGZvcm1hdCwgbG9jYWxlIH0pIHtcbiAgICByZXR1cm4gcGFyc2Vab25lSW5mbyh0cywgZm9ybWF0LCBsb2NhbGUpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHRoaXMub2Zmc2V0KHRzKSwgZm9ybWF0KTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldCh0cykge1xuICAgIHJldHVybiAtbmV3IERhdGUodHMpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSBcInN5c3RlbVwiO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBmb3JtYXRPZmZzZXQsIHBhcnNlWm9uZUluZm8sIGlzVW5kZWZpbmVkLCBpYW5hUmVnZXgsIG9ialRvTG9jYWxUUyB9IGZyb20gXCIuLi9pbXBsL3V0aWwuanNcIjtcbmltcG9ydCBab25lIGZyb20gXCIuLi96b25lLmpzXCI7XG5cbmNvbnN0IG1hdGNoaW5nUmVnZXggPSBSZWdFeHAoYF4ke2lhbmFSZWdleC5zb3VyY2V9JGApO1xuXG5sZXQgZHRmQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIG1ha2VEVEYoem9uZSkge1xuICBpZiAoIWR0ZkNhY2hlW3pvbmVdKSB7XG4gICAgZHRmQ2FjaGVbem9uZV0gPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuLVVTXCIsIHtcbiAgICAgIGhvdXJDeWNsZTogXCJoMjNcIixcbiAgICAgIHRpbWVab25lOiB6b25lLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgICAgc2Vjb25kOiBcIjItZGlnaXRcIixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZHRmQ2FjaGVbem9uZV07XG59XG5cbmNvbnN0IHR5cGVUb1BvcyA9IHtcbiAgeWVhcjogMCxcbiAgbW9udGg6IDEsXG4gIGRheTogMixcbiAgaG91cjogMyxcbiAgbWludXRlOiA0LFxuICBzZWNvbmQ6IDUsXG59O1xuXG5mdW5jdGlvbiBoYWNreU9mZnNldChkdGYsIGRhdGUpIHtcbiAgY29uc3QgZm9ybWF0dGVkID0gZHRmLmZvcm1hdChkYXRlKS5yZXBsYWNlKC9cXHUyMDBFL2csIFwiXCIpLFxuICAgIHBhcnNlZCA9IC8oXFxkKylcXC8oXFxkKylcXC8oXFxkKyksPyAoXFxkKyk6KFxcZCspOihcXGQrKS8uZXhlYyhmb3JtYXR0ZWQpLFxuICAgIFssIGZNb250aCwgZkRheSwgZlllYXIsIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kXSA9IHBhcnNlZDtcbiAgcmV0dXJuIFtmWWVhciwgZk1vbnRoLCBmRGF5LCBmSG91ciwgZk1pbnV0ZSwgZlNlY29uZF07XG59XG5cbmZ1bmN0aW9uIHBhcnRzT2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICBjb25zdCBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0VG9QYXJ0cyhkYXRlKSxcbiAgICBmaWxsZWQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXR0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7IHR5cGUsIHZhbHVlIH0gPSBmb3JtYXR0ZWRbaV0sXG4gICAgICBwb3MgPSB0eXBlVG9Qb3NbdHlwZV07XG5cbiAgICBpZiAoIWlzVW5kZWZpbmVkKHBvcykpIHtcbiAgICAgIGZpbGxlZFtwb3NdID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxubGV0IGlhbmFab25lQ2FjaGUgPSB7fTtcbi8qKlxuICogQSB6b25lIGlkZW50aWZpZWQgYnkgYW4gSUFOQSBpZGVudGlmaWVyLCBsaWtlIEFtZXJpY2EvTmV3X1lvcmtcbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJQU5BWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBab25lIG5hbWVcbiAgICogQHJldHVybiB7SUFOQVpvbmV9XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlKG5hbWUpIHtcbiAgICBpZiAoIWlhbmFab25lQ2FjaGVbbmFtZV0pIHtcbiAgICAgIGlhbmFab25lQ2FjaGVbbmFtZV0gPSBuZXcgSUFOQVpvbmUobmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBpYW5hWm9uZUNhY2hlW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGxvY2FsIGNhY2hlcy4gU2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IGluIHRlc3Rpbmcgc2NlbmFyaW9zLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlc2V0Q2FjaGUoKSB7XG4gICAgaWFuYVpvbmVDYWNoZSA9IHt9O1xuICAgIGR0ZkNhY2hlID0ge307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBwcm92aWRlZCBzdHJpbmcgaXMgYSB2YWxpZCBzcGVjaWZpZXIuIFRoaXMgb25seSBjaGVja3MgdGhlIHN0cmluZydzIGZvcm1hdCwgbm90IHRoYXQgdGhlIHNwZWNpZmllciBpZGVudGlmaWVzIGEga25vd24gem9uZTsgc2VlIGlzVmFsaWRab25lIGZvciB0aGF0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcyAtIFRoZSBzdHJpbmcgdG8gY2hlY2sgdmFsaWRpdHkgb25cbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllcihcIkFtZXJpY2EvTmV3X1lvcmtcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJTcG9ydH5+YmxvcnBcIikgLy89PiBmYWxzZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzVmFsaWRTcGVjaWZpZXIocykge1xuICAgIHJldHVybiAhIShzICYmIHMubWF0Y2gobWF0Y2hpbmdSZWdleCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgc3RyaW5nIGlkZW50aWZpZXMgYSByZWFsIHpvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHpvbmUgLSBUaGUgc3RyaW5nIHRvIGNoZWNrXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRab25lKFwiQW1lcmljYS9OZXdfWW9ya1wiKSAvLz0+IHRydWVcbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFpvbmUoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiBmYWxzZVxuICAgKiBAZXhhbXBsZSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShcIlNwb3J0fn5ibG9ycFwiKSAvLz0+IGZhbHNlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNWYWxpZFpvbmUoem9uZSkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuLVVTXCIsIHsgdGltZVpvbmU6IHpvbmUgfSkuZm9ybWF0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gRXRjL0dNVCs4IC0+IC00ODBcbiAgLyoqIEBpZ25vcmUgKi9cbiAgc3RhdGljIHBhcnNlR01UT2Zmc2V0KHNwZWNpZmllcikge1xuICAgIGlmIChzcGVjaWZpZXIpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc3BlY2lmaWVyLm1hdGNoKC9eRXRjXFwvR01UKDB8WystXVxcZHsxLDJ9KSQvaSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIC02MCAqIHBhcnNlSW50KG1hdGNoWzFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiogQHByaXZhdGUgKiovXG4gICAgdGhpcy56b25lTmFtZSA9IG5hbWU7XG4gICAgLyoqIEBwcml2YXRlICoqL1xuICAgIHRoaXMudmFsaWQgPSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShuYW1lKTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBcImlhbmFcIjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnpvbmVOYW1lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldE5hbWUodHMsIHsgZm9ybWF0LCBsb2NhbGUgfSkge1xuICAgIHJldHVybiBwYXJzZVpvbmVJbmZvKHRzLCBmb3JtYXQsIGxvY2FsZSwgdGhpcy5uYW1lKTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGZvcm1hdE9mZnNldCh0cywgZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdE9mZnNldCh0aGlzLm9mZnNldCh0cyksIGZvcm1hdCk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBvZmZzZXQodHMpIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodHMpO1xuXG4gICAgaWYgKGlzTmFOKGRhdGUpKSByZXR1cm4gTmFOO1xuXG4gICAgY29uc3QgZHRmID0gbWFrZURURih0aGlzLm5hbWUpLFxuICAgICAgW3llYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kXSA9IGR0Zi5mb3JtYXRUb1BhcnRzXG4gICAgICAgID8gcGFydHNPZmZzZXQoZHRmLCBkYXRlKVxuICAgICAgICA6IGhhY2t5T2Zmc2V0KGR0ZiwgZGF0ZSk7XG5cbiAgICBjb25zdCBhc1VUQyA9IG9ialRvTG9jYWxUUyh7XG4gICAgICB5ZWFyLFxuICAgICAgbW9udGgsXG4gICAgICBkYXksXG4gICAgICBob3VyLFxuICAgICAgbWludXRlLFxuICAgICAgc2Vjb25kLFxuICAgICAgbWlsbGlzZWNvbmQ6IDAsXG4gICAgfSk7XG5cbiAgICBsZXQgYXNUUyA9ICtkYXRlO1xuICAgIGNvbnN0IG92ZXIgPSBhc1RTICUgMTAwMDtcbiAgICBhc1RTIC09IG92ZXIgPj0gMCA/IG92ZXIgOiAxMDAwICsgb3ZlcjtcbiAgICByZXR1cm4gKGFzVVRDIC0gYXNUUykgLyAoNjAgKiAxMDAwKTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwiaWFuYVwiICYmIG90aGVyWm9uZS5uYW1lID09PSB0aGlzLm5hbWU7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy52YWxpZDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGZvcm1hdE9mZnNldCwgc2lnbmVkT2Zmc2V0IH0gZnJvbSBcIi4uL2ltcGwvdXRpbC5qc1wiO1xuaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcblxubGV0IHNpbmdsZXRvbiA9IG51bGw7XG5cbi8qKlxuICogQSB6b25lIHdpdGggYSBmaXhlZCBvZmZzZXQgKG1lYW5pbmcgbm8gRFNUKVxuICogQGltcGxlbWVudHMge1pvbmV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpeGVkT2Zmc2V0Wm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogR2V0IGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIFVUQ1xuICAgKiBAcmV0dXJuIHtGaXhlZE9mZnNldFpvbmV9XG4gICAqL1xuICBzdGF0aWMgZ2V0IHV0Y0luc3RhbmNlKCkge1xuICAgIGlmIChzaW5nbGV0b24gPT09IG51bGwpIHtcbiAgICAgIHNpbmdsZXRvbiA9IG5ldyBGaXhlZE9mZnNldFpvbmUoMCk7XG4gICAgfVxuICAgIHJldHVybiBzaW5nbGV0b247XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGluc3RhbmNlIHdpdGggYSBzcGVjaWZpZWQgb2Zmc2V0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgLSBUaGUgb2Zmc2V0IGluIG1pbnV0ZXNcbiAgICogQHJldHVybiB7Rml4ZWRPZmZzZXRab25lfVxuICAgKi9cbiAgc3RhdGljIGluc3RhbmNlKG9mZnNldCkge1xuICAgIHJldHVybiBvZmZzZXQgPT09IDAgPyBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2UgOiBuZXcgRml4ZWRPZmZzZXRab25lKG9mZnNldCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGluc3RhbmNlIG9mIEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIGEgVVRDIG9mZnNldCBzdHJpbmcsIGxpa2UgXCJVVEMrNlwiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzIC0gVGhlIG9mZnNldCBzdHJpbmcgdG8gcGFyc2VcbiAgICogQGV4YW1wbGUgRml4ZWRPZmZzZXRab25lLnBhcnNlU3BlY2lmaWVyKFwiVVRDKzZcIilcbiAgICogQGV4YW1wbGUgRml4ZWRPZmZzZXRab25lLnBhcnNlU3BlY2lmaWVyKFwiVVRDKzA2XCIpXG4gICAqIEBleGFtcGxlIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihcIlVUQy02OjAwXCIpXG4gICAqIEByZXR1cm4ge0ZpeGVkT2Zmc2V0Wm9uZX1cbiAgICovXG4gIHN0YXRpYyBwYXJzZVNwZWNpZmllcihzKSB7XG4gICAgaWYgKHMpIHtcbiAgICAgIGNvbnN0IHIgPSBzLm1hdGNoKC9edXRjKD86KFsrLV1cXGR7MSwyfSkoPzo6KFxcZHsyfSkpPyk/JC9pKTtcbiAgICAgIGlmIChyKSB7XG4gICAgICAgIHJldHVybiBuZXcgRml4ZWRPZmZzZXRab25lKHNpZ25lZE9mZnNldChyWzFdLCByWzJdKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3Iob2Zmc2V0KSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiogQHByaXZhdGUgKiovXG4gICAgdGhpcy5maXhlZCA9IG9mZnNldDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBcImZpeGVkXCI7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maXhlZCA9PT0gMCA/IFwiVVRDXCIgOiBgVVRDJHtmb3JtYXRPZmZzZXQodGhpcy5maXhlZCwgXCJuYXJyb3dcIil9YDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGZvcm1hdE9mZnNldCh0cywgZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdE9mZnNldCh0aGlzLmZpeGVkLCBmb3JtYXQpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgb2Zmc2V0KCkge1xuICAgIHJldHVybiB0aGlzLmZpeGVkO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHJldHVybiBvdGhlclpvbmUudHlwZSA9PT0gXCJmaXhlZFwiICYmIG90aGVyWm9uZS5maXhlZCA9PT0gdGhpcy5maXhlZDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCAiaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcblxuLyoqXG4gKiBBIHpvbmUgdGhhdCBmYWlsZWQgdG8gcGFyc2UuIFlvdSBzaG91bGQgbmV2ZXIgbmVlZCB0byBpbnN0YW50aWF0ZSB0aGlzLlxuICogQGltcGxlbWVudHMge1pvbmV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWRab25lIGV4dGVuZHMgWm9uZSB7XG4gIGNvbnN0cnVjdG9yKHpvbmVOYW1lKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiogIEBwcml2YXRlICovXG4gICAgdGhpcy56b25lTmFtZSA9IHpvbmVOYW1lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwiaW52YWxpZFwiO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuem9uZU5hbWU7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNVbml2ZXJzYWwoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgb2Zmc2V0TmFtZSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGZvcm1hdE9mZnNldCgpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldCgpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZXF1YWxzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgIi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5pbXBvcnQgWm9uZSBmcm9tIFwiLi4vem9uZS5qc1wiO1xuaW1wb3J0IElBTkFab25lIGZyb20gXCIuLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIFwiLi4vem9uZXMvZml4ZWRPZmZzZXRab25lLmpzXCI7XG5pbXBvcnQgSW52YWxpZFpvbmUgZnJvbSBcIi4uL3pvbmVzL2ludmFsaWRab25lLmpzXCI7XG5cbmltcG9ydCB7IGlzVW5kZWZpbmVkLCBpc1N0cmluZywgaXNOdW1iZXIgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVab25lKGlucHV0LCBkZWZhdWx0Wm9uZSkge1xuICBsZXQgb2Zmc2V0O1xuICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpIHx8IGlucHV0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRab25lO1xuICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWm9uZSkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfSBlbHNlIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICBjb25zdCBsb3dlcmVkID0gaW5wdXQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXJlZCA9PT0gXCJsb2NhbFwiIHx8IGxvd2VyZWQgPT09IFwic3lzdGVtXCIpIHJldHVybiBkZWZhdWx0Wm9uZTtcbiAgICBlbHNlIGlmIChsb3dlcmVkID09PSBcInV0Y1wiIHx8IGxvd2VyZWQgPT09IFwiZ210XCIpIHJldHVybiBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2U7XG4gICAgZWxzZSBpZiAoKG9mZnNldCA9IElBTkFab25lLnBhcnNlR01UT2Zmc2V0KGlucHV0KSkgIT0gbnVsbCkge1xuICAgICAgLy8gaGFuZGxlIEV0Yy9HTVQtNCwgd2hpY2ggVjggY2hva2VzIG9uXG4gICAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCk7XG4gICAgfSBlbHNlIGlmIChJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKGxvd2VyZWQpKSByZXR1cm4gSUFOQVpvbmUuY3JlYXRlKGlucHV0KTtcbiAgICBlbHNlIHJldHVybiBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIobG93ZXJlZCkgfHwgbmV3IEludmFsaWRab25lKGlucHV0KTtcbiAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGlucHV0KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgaW5wdXQub2Zmc2V0ICYmIHR5cGVvZiBpbnB1dC5vZmZzZXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAvLyBUaGlzIGlzIGR1bWIsIGJ1dCB0aGUgaW5zdGFuY2VvZiBjaGVjayBhYm92ZSBkb2Vzbid0IHNlZW0gdG8gcmVhbGx5IHdvcmtcbiAgICAvLyBzbyB3ZSdyZSBkdWNrIGNoZWNraW5nIGl0XG4gICAgcmV0dXJuIGlucHV0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgSW52YWxpZFpvbmUoaW5wdXQpO1xuICB9XG59XG4iLCAiaW1wb3J0IFN5c3RlbVpvbmUgZnJvbSBcIi4vem9uZXMvc3lzdGVtWm9uZS5qc1wiO1xuaW1wb3J0IElBTkFab25lIGZyb20gXCIuL3pvbmVzL0lBTkFab25lLmpzXCI7XG5pbXBvcnQgTG9jYWxlIGZyb20gXCIuL2ltcGwvbG9jYWxlLmpzXCI7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZVpvbmUgfSBmcm9tIFwiLi9pbXBsL3pvbmVVdGlsLmpzXCI7XG5cbmxldCBub3cgPSAoKSA9PiBEYXRlLm5vdygpLFxuICBkZWZhdWx0Wm9uZSA9IFwic3lzdGVtXCIsXG4gIGRlZmF1bHRMb2NhbGUgPSBudWxsLFxuICBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtID0gbnVsbCxcbiAgZGVmYXVsdE91dHB1dENhbGVuZGFyID0gbnVsbCxcbiAgdGhyb3dPbkludmFsaWQ7XG5cbi8qKlxuICogU2V0dGluZ3MgY29udGFpbnMgc3RhdGljIGdldHRlcnMgYW5kIHNldHRlcnMgdGhhdCBjb250cm9sIEx1eG9uJ3Mgb3ZlcmFsbCBiZWhhdmlvci4gTHV4b24gaXMgYSBzaW1wbGUgbGlicmFyeSB3aXRoIGZldyBvcHRpb25zLCBidXQgdGhlIG9uZXMgaXQgZG9lcyBoYXZlIGxpdmUgaGVyZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2V0dGluZ3Mge1xuICAvKipcbiAgICogR2V0IHRoZSBjYWxsYmFjayBmb3IgcmV0dXJuaW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcC5cbiAgICogQHR5cGUge2Z1bmN0aW9ufVxuICAgKi9cbiAgc3RhdGljIGdldCBub3coKSB7XG4gICAgcmV0dXJuIG5vdztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxuICAgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhIG51bWJlciwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBFcG9jaCBtaWxsaXNlY29uZCBjb3VudFxuICAgKiBAdHlwZSB7ZnVuY3Rpb259XG4gICAqIEBleGFtcGxlIFNldHRpbmdzLm5vdyA9ICgpID0+IERhdGUubm93KCkgKyAzMDAwIC8vIHByZXRlbmQgaXQgaXMgMyBzZWNvbmRzIGluIHRoZSBmdXR1cmVcbiAgICogQGV4YW1wbGUgU2V0dGluZ3Mubm93ID0gKCkgPT4gMCAvLyBhbHdheXMgcHJldGVuZCBpdCdzIEphbiAxLCAxOTcwIGF0IG1pZG5pZ2h0IGluIFVUQyB0aW1lXG4gICAqL1xuICBzdGF0aWMgc2V0IG5vdyhuKSB7XG4gICAgbm93ID0gbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIFVzZSB0aGUgdmFsdWUgXCJzeXN0ZW1cIiB0byByZXNldCB0aGlzIHZhbHVlIHRvIHRoZSBzeXN0ZW0ncyB0aW1lIHpvbmUuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc2V0IGRlZmF1bHRab25lKHpvbmUpIHtcbiAgICBkZWZhdWx0Wm9uZSA9IHpvbmU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IHRpbWUgem9uZSBvYmplY3QgY3VycmVudGx5IHVzZWQgdG8gY3JlYXRlIERhdGVUaW1lcy4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIHN5c3RlbSdzIHRpbWUgem9uZSAodGhlIG9uZSBzZXQgb24gdGhlIG1hY2hpbmUgdGhhdCBydW5zIHRoaXMgY29kZSkuXG4gICAqIEB0eXBlIHtab25lfVxuICAgKi9cbiAgc3RhdGljIGdldCBkZWZhdWx0Wm9uZSgpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplWm9uZShkZWZhdWx0Wm9uZSwgU3lzdGVtWm9uZS5pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IGxvY2FsZSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGRlZmF1bHRMb2NhbGUoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRMb2NhbGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IGxvY2FsZSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc2V0IGRlZmF1bHRMb2NhbGUobG9jYWxlKSB7XG4gICAgZGVmYXVsdExvY2FsZSA9IGxvY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgbnVtYmVyaW5nIHN5c3RlbSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW07XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIHNldCBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtKG51bWJlcmluZ1N5c3RlbSkge1xuICAgIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmdTeXN0ZW07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IG91dHB1dCBjYWxlbmRhciB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGRlZmF1bHRPdXRwdXRDYWxlbmRhcigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCBvdXRwdXQgY2FsZW5kYXIgdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIHNldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIob3V0cHV0Q2FsZW5kYXIpIHtcbiAgICBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIgPSBvdXRwdXRDYWxlbmRhcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgZ2V0IHRocm93T25JbnZhbGlkKCkge1xuICAgIHJldHVybiB0aHJvd09uSW52YWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgc2V0IHRocm93T25JbnZhbGlkKHQpIHtcbiAgICB0aHJvd09uSW52YWxpZCA9IHQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgTHV4b24ncyBnbG9iYWwgY2FjaGVzLiBTaG91bGQgb25seSBiZSBuZWNlc3NhcnkgaW4gdGVzdGluZyBzY2VuYXJpb3MuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVzZXRDYWNoZXMoKSB7XG4gICAgTG9jYWxlLnJlc2V0Q2FjaGUoKTtcbiAgICBJQU5BWm9uZS5yZXNldENhY2hlKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwYWRTdGFydCwgcm91bmRUbywgaGFzUmVsYXRpdmUgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5pbXBvcnQgKiBhcyBFbmdsaXNoIGZyb20gXCIuL2VuZ2xpc2guanNcIjtcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCBEYXRlVGltZSBmcm9tIFwiLi4vZGF0ZXRpbWUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi4vem9uZXMvSUFOQVpvbmUuanNcIjtcblxubGV0IGludGxEVENhY2hlID0ge307XG5mdW5jdGlvbiBnZXRDYWNoZWREVEYobG9jU3RyaW5nLCBvcHRzID0ge30pIHtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW2xvY1N0cmluZywgb3B0c10pO1xuICBsZXQgZHRmID0gaW50bERUQ2FjaGVba2V5XTtcbiAgaWYgKCFkdGYpIHtcbiAgICBkdGYgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxEVENhY2hlW2tleV0gPSBkdGY7XG4gIH1cbiAgcmV0dXJuIGR0Zjtcbn1cblxubGV0IGludGxOdW1DYWNoZSA9IHt9O1xuZnVuY3Rpb24gZ2V0Q2FjaGVkSU5GKGxvY1N0cmluZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxOdW1DYWNoZVtrZXldO1xuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxOdW1DYWNoZVtrZXldID0gaW5mO1xuICB9XG4gIHJldHVybiBpbmY7XG59XG5cbmxldCBpbnRsUmVsQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGdldENhY2hlZFJURihsb2NTdHJpbmcsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGJhc2UsIC4uLmNhY2hlS2V5T3B0cyB9ID0gb3B0czsgLy8gZXhjbHVkZSBgYmFzZWAgZnJvbSB0aGUgb3B0aW9uc1xuICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbbG9jU3RyaW5nLCBjYWNoZUtleU9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxSZWxDYWNoZVtrZXldO1xuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxSZWxDYWNoZVtrZXldID0gaW5mO1xuICB9XG4gIHJldHVybiBpbmY7XG59XG5cbmxldCBzeXNMb2NhbGVDYWNoZSA9IG51bGw7XG5mdW5jdGlvbiBzeXN0ZW1Mb2NhbGUoKSB7XG4gIGlmIChzeXNMb2NhbGVDYWNoZSkge1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGVTdHIpIHtcbiAgLy8gSSByZWFsbHkgd2FudCB0byBhdm9pZCB3cml0aW5nIGEgQkNQIDQ3IHBhcnNlclxuICAvLyBzZWUsIGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL3dvb29ybS9iY3AtNDdcbiAgLy8gSW5zdGVhZCwgd2UnbGwgZG8gdGhpczpcblxuICAvLyBhKSBpZiB0aGUgc3RyaW5nIGhhcyBubyAtdSBleHRlbnNpb25zLCBqdXN0IGxlYXZlIGl0IGFsb25lXG4gIC8vIGIpIGlmIGl0IGRvZXMsIHVzZSBJbnRsIHRvIHJlc29sdmUgZXZlcnl0aGluZ1xuICAvLyBjKSBpZiBJbnRsIGZhaWxzLCB0cnkgYWdhaW4gd2l0aG91dCB0aGUgLXVcblxuICBjb25zdCB1SW5kZXggPSBsb2NhbGVTdHIuaW5kZXhPZihcIi11LVwiKTtcbiAgaWYgKHVJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gW2xvY2FsZVN0cl07XG4gIH0gZWxzZSB7XG4gICAgbGV0IG9wdGlvbnM7XG4gICAgY29uc3Qgc21hbGxlciA9IGxvY2FsZVN0ci5zdWJzdHJpbmcoMCwgdUluZGV4KTtcbiAgICB0cnkge1xuICAgICAgb3B0aW9ucyA9IGdldENhY2hlZERURihsb2NhbGVTdHIpLnJlc29sdmVkT3B0aW9ucygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9wdGlvbnMgPSBnZXRDYWNoZWREVEYoc21hbGxlcikucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyIH0gPSBvcHRpb25zO1xuICAgIC8vIHJldHVybiB0aGUgc21hbGxlciBvbmUgc28gdGhhdCB3ZSBjYW4gYXBwZW5kIHRoZSBjYWxlbmRhciBhbmQgbnVtYmVyaW5nIG92ZXJyaWRlcyB0byBpdFxuICAgIHJldHVybiBbc21hbGxlciwgbnVtYmVyaW5nU3lzdGVtLCBjYWxlbmRhcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50bENvbmZpZ1N0cmluZyhsb2NhbGVTdHIsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgaWYgKG91dHB1dENhbGVuZGFyIHx8IG51bWJlcmluZ1N5c3RlbSkge1xuICAgIGxvY2FsZVN0ciArPSBcIi11XCI7XG5cbiAgICBpZiAob3V0cHV0Q2FsZW5kYXIpIHtcbiAgICAgIGxvY2FsZVN0ciArPSBgLWNhLSR7b3V0cHV0Q2FsZW5kYXJ9YDtcbiAgICB9XG5cbiAgICBpZiAobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICBsb2NhbGVTdHIgKz0gYC1udS0ke251bWJlcmluZ1N5c3RlbX1gO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxlU3RyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsb2NhbGVTdHI7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9udGhzKGYpIHtcbiAgY29uc3QgbXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWUudXRjKDIwMTYsIGksIDEpO1xuICAgIG1zLnB1c2goZihkdCkpO1xuICB9XG4gIHJldHVybiBtcztcbn1cblxuZnVuY3Rpb24gbWFwV2Vla2RheXMoZikge1xuICBjb25zdCBtcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSA3OyBpKyspIHtcbiAgICBjb25zdCBkdCA9IERhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMgKyBpKTtcbiAgICBtcy5wdXNoKGYoZHQpKTtcbiAgfVxuICByZXR1cm4gbXM7XG59XG5cbmZ1bmN0aW9uIGxpc3RTdHVmZihsb2MsIGxlbmd0aCwgZGVmYXVsdE9LLCBlbmdsaXNoRm4sIGludGxGbikge1xuICBjb25zdCBtb2RlID0gbG9jLmxpc3RpbmdNb2RlKGRlZmF1bHRPSyk7XG5cbiAgaWYgKG1vZGUgPT09IFwiZXJyb3JcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiZW5cIikge1xuICAgIHJldHVybiBlbmdsaXNoRm4obGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW50bEZuKGxlbmd0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNGYXN0TnVtYmVycyhsb2MpIHtcbiAgaWYgKGxvYy5udW1iZXJpbmdTeXN0ZW0gJiYgbG9jLm51bWJlcmluZ1N5c3RlbSAhPT0gXCJsYXRuXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGxvYy5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiIHx8XG4gICAgICAhbG9jLmxvY2FsZSB8fFxuICAgICAgbG9jLmxvY2FsZS5zdGFydHNXaXRoKFwiZW5cIikgfHxcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvYy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY2xhc3MgUG9seU51bWJlckZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKGludGwsIGZvcmNlU2ltcGxlLCBvcHRzKSB7XG4gICAgdGhpcy5wYWRUbyA9IG9wdHMucGFkVG8gfHwgMDtcbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vciB8fCBmYWxzZTtcblxuICAgIGlmICghZm9yY2VTaW1wbGUpIHtcbiAgICAgIGNvbnN0IGludGxPcHRzID0geyB1c2VHcm91cGluZzogZmFsc2UgfTtcbiAgICAgIGlmIChvcHRzLnBhZFRvID4gMCkgaW50bE9wdHMubWluaW11bUludGVnZXJEaWdpdHMgPSBvcHRzLnBhZFRvO1xuICAgICAgdGhpcy5pbmYgPSBnZXRDYWNoZWRJTkYoaW50bCwgaW50bE9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdChpKSB7XG4gICAgaWYgKHRoaXMuaW5mKSB7XG4gICAgICBjb25zdCBmaXhlZCA9IHRoaXMuZmxvb3IgPyBNYXRoLmZsb29yKGkpIDogaTtcbiAgICAgIHJldHVybiB0aGlzLmluZi5mb3JtYXQoZml4ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0byBtYXRjaCB0aGUgYnJvd3NlcidzIG51bWJlcmZvcm1hdHRlciBkZWZhdWx0c1xuICAgICAgY29uc3QgZml4ZWQgPSB0aGlzLmZsb29yID8gTWF0aC5mbG9vcihpKSA6IHJvdW5kVG8oaSwgMyk7XG4gICAgICByZXR1cm4gcGFkU3RhcnQoZml4ZWQsIHRoaXMucGFkVG8pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY2xhc3MgUG9seURhdGVGb3JtYXR0ZXIge1xuICBjb25zdHJ1Y3RvcihkdCwgaW50bCwgb3B0cykge1xuICAgIHRoaXMub3B0cyA9IG9wdHM7XG5cbiAgICBsZXQgejtcbiAgICBpZiAoZHQuem9uZS5pc1VuaXZlcnNhbCkge1xuICAgICAgLy8gVVRDLTggb3IgRXRjL1VUQy04IGFyZSBub3QgcGFydCBvZiB0emRhdGEsIG9ubHkgRXRjL0dNVCs4IGFuZCB0aGUgbGlrZS5cbiAgICAgIC8vIFRoYXQgaXMgd2h5IGZpeGVkLW9mZnNldCBUWiBpcyBzZXQgdG8gdGhhdCB1bmxlc3MgaXQgaXM6XG4gICAgICAvLyAxLiBSZXByZXNlbnRpbmcgb2Zmc2V0IDAgd2hlbiBVVEMgaXMgdXNlZCB0byBtYWludGFpbiBwcmV2aW91cyBiZWhhdmlvciBhbmQgZG9lcyBub3QgYmVjb21lIEdNVC5cbiAgICAgIC8vIDIuIFVuc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyOlxuICAgICAgLy8gICAgLSBzb21lIGRvIG5vdCBzdXBwb3J0IEV0Yy9cbiAgICAgIC8vICAgIC0gPCBFdGMvR01ULTE0LCA+IEV0Yy9HTVQrMTIsIGFuZCAzMC1taW51dGUgb3IgNDUtbWludXRlIG9mZnNldHMgYXJlIG5vdCBwYXJ0IG9mIHR6ZGF0YVxuICAgICAgY29uc3QgZ210T2Zmc2V0ID0gLTEgKiAoZHQub2Zmc2V0IC8gNjApO1xuICAgICAgY29uc3Qgb2Zmc2V0WiA9IGdtdE9mZnNldCA+PSAwID8gYEV0Yy9HTVQrJHtnbXRPZmZzZXR9YCA6IGBFdGMvR01UJHtnbXRPZmZzZXR9YDtcbiAgICAgIGNvbnN0IGlzT2Zmc2V0Wm9uZVN1cHBvcnRlZCA9IElBTkFab25lLmlzVmFsaWRab25lKG9mZnNldFopO1xuICAgICAgaWYgKGR0Lm9mZnNldCAhPT0gMCAmJiBpc09mZnNldFpvbmVTdXBwb3J0ZWQpIHtcbiAgICAgICAgeiA9IG9mZnNldFo7XG4gICAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBhbGwgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjLys0OjMwIGFyZSBwcmVzZW50IGluIHR6ZGF0YS5cbiAgICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAgIC8vIDEuIFRoZSBmb3JtYXQgb3B0aW9ucyB0ZWxsIHVzIHRvIHNob3cgdGhlIHpvbmUuIFdlIGNhbid0IGRvIHRoYXQsIHNvIHRoZSBiZXN0XG4gICAgICAgIC8vIHdlIGNhbiBkbyBpcyBmb3JtYXQgdGhlIGRhdGUgaW4gVVRDLlxuICAgICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgICAvLyB0aGUgdGltZSBhbmQgdGVsbCB0aGUgZm9ybWF0dGVyIHRvIHNob3cgaXQgdG8gdXMgaW4gVVRDLCBzbyB0aGF0IHRoZSB0aW1lIGlzIHJpZ2h0XG4gICAgICAgIC8vIGFuZCB0aGUgYmFkIHpvbmUgZG9lc24ndCBzaG93IHVwLlxuICAgICAgICB6ID0gXCJVVENcIjtcbiAgICAgICAgaWYgKG9wdHMudGltZVpvbmVOYW1lKSB7XG4gICAgICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZHQgPSBkdC5vZmZzZXQgPT09IDAgPyBkdCA6IERhdGVUaW1lLmZyb21NaWxsaXMoZHQudHMgKyBkdC5vZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkdC56b25lLnR5cGUgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgeiA9IGR0LnpvbmUubmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRsT3B0cyA9IHsgLi4udGhpcy5vcHRzIH07XG4gICAgaWYgKHopIHtcbiAgICAgIGludGxPcHRzLnRpbWVab25lID0gejtcbiAgICB9XG4gICAgdGhpcy5kdGYgPSBnZXRDYWNoZWREVEYoaW50bCwgaW50bE9wdHMpO1xuICB9XG5cbiAgZm9ybWF0KCkge1xuICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgfVxuXG4gIGZvcm1hdFRvUGFydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHRmLmZvcm1hdFRvUGFydHModGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgfVxuXG4gIHJlc29sdmVkT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5kdGYucmVzb2x2ZWRPcHRpb25zKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQb2x5UmVsRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IoaW50bCwgaXNFbmdsaXNoLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0geyBzdHlsZTogXCJsb25nXCIsIC4uLm9wdHMgfTtcbiAgICBpZiAoIWlzRW5nbGlzaCAmJiBoYXNSZWxhdGl2ZSgpKSB7XG4gICAgICB0aGlzLnJ0ZiA9IGdldENhY2hlZFJURihpbnRsLCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXQoY291bnQsIHVuaXQpIHtcbiAgICBpZiAodGhpcy5ydGYpIHtcbiAgICAgIHJldHVybiB0aGlzLnJ0Zi5mb3JtYXQoY291bnQsIHVuaXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRW5nbGlzaC5mb3JtYXRSZWxhdGl2ZVRpbWUodW5pdCwgY291bnQsIHRoaXMub3B0cy5udW1lcmljLCB0aGlzLm9wdHMuc3R5bGUgIT09IFwibG9uZ1wiKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUb1BhcnRzKGNvdW50LCB1bml0KSB7XG4gICAgaWYgKHRoaXMucnRmKSB7XG4gICAgICByZXR1cm4gdGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhjb3VudCwgdW5pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvY2FsZSB7XG4gIHN0YXRpYyBmcm9tT3B0cyhvcHRzKSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUob3B0cy5sb2NhbGUsIG9wdHMubnVtYmVyaW5nU3lzdGVtLCBvcHRzLm91dHB1dENhbGVuZGFyLCBvcHRzLmRlZmF1bHRUb0VOKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyLCBkZWZhdWx0VG9FTiA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3BlY2lmaWVkTG9jYWxlID0gbG9jYWxlIHx8IFNldHRpbmdzLmRlZmF1bHRMb2NhbGU7XG4gICAgLy8gdGhlIHN5c3RlbSBsb2NhbGUgaXMgdXNlZnVsIGZvciBodW1hbiByZWFkYWJsZSBzdHJpbmdzIGJ1dCBhbm5veWluZyBmb3IgcGFyc2luZy9mb3JtYXR0aW5nIGtub3duIGZvcm1hdHNcbiAgICBjb25zdCBsb2NhbGVSID0gc3BlY2lmaWVkTG9jYWxlIHx8IChkZWZhdWx0VG9FTiA/IFwiZW4tVVNcIiA6IHN5c3RlbUxvY2FsZSgpKTtcbiAgICBjb25zdCBudW1iZXJpbmdTeXN0ZW1SID0gbnVtYmVyaW5nU3lzdGVtIHx8IFNldHRpbmdzLmRlZmF1bHROdW1iZXJpbmdTeXN0ZW07XG4gICAgY29uc3Qgb3V0cHV0Q2FsZW5kYXJSID0gb3V0cHV0Q2FsZW5kYXIgfHwgU2V0dGluZ3MuZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVIsIG51bWJlcmluZ1N5c3RlbVIsIG91dHB1dENhbGVuZGFyUiwgc3BlY2lmaWVkTG9jYWxlKTtcbiAgfVxuXG4gIHN0YXRpYyByZXNldENhY2hlKCkge1xuICAgIHN5c0xvY2FsZUNhY2hlID0gbnVsbDtcbiAgICBpbnRsRFRDYWNoZSA9IHt9O1xuICAgIGludGxOdW1DYWNoZSA9IHt9O1xuICAgIGludGxSZWxDYWNoZSA9IHt9O1xuICB9XG5cbiAgc3RhdGljIGZyb21PYmplY3QoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSA9IHt9KSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgbnVtYmVyaW5nLCBvdXRwdXRDYWxlbmRhciwgc3BlY2lmaWVkTG9jYWxlKSB7XG4gICAgY29uc3QgW3BhcnNlZExvY2FsZSwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtLCBwYXJzZWRPdXRwdXRDYWxlbmRhcl0gPSBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGUpO1xuXG4gICAgdGhpcy5sb2NhbGUgPSBwYXJzZWRMb2NhbGU7XG4gICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmcgfHwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtIHx8IG51bGw7XG4gICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyIHx8IHBhcnNlZE91dHB1dENhbGVuZGFyIHx8IG51bGw7XG4gICAgdGhpcy5pbnRsID0gaW50bENvbmZpZ1N0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIHRoaXMub3V0cHV0Q2FsZW5kYXIpO1xuXG4gICAgdGhpcy53ZWVrZGF5c0NhY2hlID0geyBmb3JtYXQ6IHt9LCBzdGFuZGFsb25lOiB7fSB9O1xuICAgIHRoaXMubW9udGhzQ2FjaGUgPSB7IGZvcm1hdDoge30sIHN0YW5kYWxvbmU6IHt9IH07XG4gICAgdGhpcy5tZXJpZGllbUNhY2hlID0gbnVsbDtcbiAgICB0aGlzLmVyYUNhY2hlID0ge307XG5cbiAgICB0aGlzLnNwZWNpZmllZExvY2FsZSA9IHNwZWNpZmllZExvY2FsZTtcbiAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gbnVsbDtcbiAgfVxuXG4gIGdldCBmYXN0TnVtYmVycygpIHtcbiAgICBpZiAodGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gc3VwcG9ydHNGYXN0TnVtYmVycyh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mYXN0TnVtYmVyc0NhY2hlZDtcbiAgfVxuXG4gIGxpc3RpbmdNb2RlKGRlZmF1bHRPSyA9IHRydWUpIHtcbiAgICBjb25zdCBpc0FjdHVhbGx5RW4gPSB0aGlzLmlzRW5nbGlzaCgpO1xuICAgIGNvbnN0IGhhc05vV2VpcmRuZXNzID1cbiAgICAgICh0aGlzLm51bWJlcmluZ1N5c3RlbSA9PT0gbnVsbCB8fCB0aGlzLm51bWJlcmluZ1N5c3RlbSA9PT0gXCJsYXRuXCIpICYmXG4gICAgICAodGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gbnVsbCB8fCB0aGlzLm91dHB1dENhbGVuZGFyID09PSBcImdyZWdvcnlcIik7XG4gICAgcmV0dXJuIGlzQWN0dWFsbHlFbiAmJiBoYXNOb1dlaXJkbmVzcyA/IFwiZW5cIiA6IFwiaW50bFwiO1xuICB9XG5cbiAgY2xvbmUoYWx0cykge1xuICAgIGlmICghYWx0cyB8fCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhbHRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShcbiAgICAgICAgYWx0cy5sb2NhbGUgfHwgdGhpcy5zcGVjaWZpZWRMb2NhbGUsXG4gICAgICAgIGFsdHMubnVtYmVyaW5nU3lzdGVtIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBhbHRzLm91dHB1dENhbGVuZGFyIHx8IHRoaXMub3V0cHV0Q2FsZW5kYXIsXG4gICAgICAgIGFsdHMuZGVmYXVsdFRvRU4gfHwgZmFsc2VcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmVkZWZhdWx0VG9FTihhbHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSh7IC4uLmFsdHMsIGRlZmF1bHRUb0VOOiB0cnVlIH0pO1xuICB9XG5cbiAgcmVkZWZhdWx0VG9TeXN0ZW0oYWx0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoeyAuLi5hbHRzLCBkZWZhdWx0VG9FTjogZmFsc2UgfSk7XG4gIH1cblxuICBtb250aHMobGVuZ3RoLCBmb3JtYXQgPSBmYWxzZSwgZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIEVuZ2xpc2gubW9udGhzLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnRsID0gZm9ybWF0ID8geyBtb250aDogbGVuZ3RoLCBkYXk6IFwibnVtZXJpY1wiIH0gOiB7IG1vbnRoOiBsZW5ndGggfSxcbiAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gXCJmb3JtYXRcIiA6IFwic3RhbmRhbG9uZVwiO1xuICAgICAgaWYgKCF0aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSkge1xuICAgICAgICB0aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSA9IG1hcE1vbnRocygoZHQpID0+IHRoaXMuZXh0cmFjdChkdCwgaW50bCwgXCJtb250aFwiKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH1cblxuICB3ZWVrZGF5cyhsZW5ndGgsIGZvcm1hdCA9IGZhbHNlLCBkZWZhdWx0T0sgPSB0cnVlKSB7XG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgRW5nbGlzaC53ZWVrZGF5cywgKCkgPT4ge1xuICAgICAgY29uc3QgaW50bCA9IGZvcm1hdFxuICAgICAgICAgID8geyB3ZWVrZGF5OiBsZW5ndGgsIHllYXI6IFwibnVtZXJpY1wiLCBtb250aDogXCJsb25nXCIsIGRheTogXCJudW1lcmljXCIgfVxuICAgICAgICAgIDogeyB3ZWVrZGF5OiBsZW5ndGggfSxcbiAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gXCJmb3JtYXRcIiA6IFwic3RhbmRhbG9uZVwiO1xuICAgICAgaWYgKCF0aGlzLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdKSB7XG4gICAgICAgIHRoaXMud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0gPSBtYXBXZWVrZGF5cygoZHQpID0+XG4gICAgICAgICAgdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcIndlZWtkYXlcIilcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdO1xuICAgIH0pO1xuICB9XG5cbiAgbWVyaWRpZW1zKGRlZmF1bHRPSyA9IHRydWUpIHtcbiAgICByZXR1cm4gbGlzdFN0dWZmKFxuICAgICAgdGhpcyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGRlZmF1bHRPSyxcbiAgICAgICgpID0+IEVuZ2xpc2gubWVyaWRpZW1zLFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyBJbiB0aGVvcnkgdGhlcmUgY291bGQgYmUgYXJpYml0cmFyeSBkYXkgcGVyaW9kcy4gV2UncmUgZ29ubmEgYXNzdW1lIHRoZXJlIGFyZSBleGFjdGx5IHR3b1xuICAgICAgICAvLyBmb3IgQU0gYW5kIFBNLiBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBidXQgaXQncyBtYWtlcyBwYXJzaW5nIHdheSBlYXNpZXIuXG4gICAgICAgIGlmICghdGhpcy5tZXJpZGllbUNhY2hlKSB7XG4gICAgICAgICAgY29uc3QgaW50bCA9IHsgaG91cjogXCJudW1lcmljXCIsIGhvdXJDeWNsZTogXCJoMTJcIiB9O1xuICAgICAgICAgIHRoaXMubWVyaWRpZW1DYWNoZSA9IFtEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCA5KSwgRGF0ZVRpbWUudXRjKDIwMTYsIDExLCAxMywgMTkpXS5tYXAoXG4gICAgICAgICAgICAoZHQpID0+IHRoaXMuZXh0cmFjdChkdCwgaW50bCwgXCJkYXlwZXJpb2RcIilcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubWVyaWRpZW1DYWNoZTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZXJhcyhsZW5ndGgsIGRlZmF1bHRPSyA9IHRydWUpIHtcbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBFbmdsaXNoLmVyYXMsICgpID0+IHtcbiAgICAgIGNvbnN0IGludGwgPSB7IGVyYTogbGVuZ3RoIH07XG5cbiAgICAgIC8vIFRoaXMgaXMgcHJvYmxlbWF0aWMuIERpZmZlcmVudCBjYWxlbmRhcnMgYXJlIGdvaW5nIHRvIGRlZmluZSBlcmFzIHRvdGFsbHkgZGlmZmVyZW50bHkuIFdoYXQgSSBuZWVkIGlzIHRoZSBtaW5pbXVtIHNldCBvZiBkYXRlc1xuICAgICAgLy8gdG8gZGVmaW5pdGVseSBlbnVtZXJhdGUgdGhlbS5cbiAgICAgIGlmICghdGhpcy5lcmFDYWNoZVtsZW5ndGhdKSB7XG4gICAgICAgIHRoaXMuZXJhQ2FjaGVbbGVuZ3RoXSA9IFtEYXRlVGltZS51dGMoLTQwLCAxLCAxKSwgRGF0ZVRpbWUudXRjKDIwMTcsIDEsIDEpXS5tYXAoKGR0KSA9PlxuICAgICAgICAgIHRoaXMuZXh0cmFjdChkdCwgaW50bCwgXCJlcmFcIilcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZXJhQ2FjaGVbbGVuZ3RoXTtcbiAgICB9KTtcbiAgfVxuXG4gIGV4dHJhY3QoZHQsIGludGxPcHRzLCBmaWVsZCkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5kdEZvcm1hdHRlcihkdCwgaW50bE9wdHMpLFxuICAgICAgcmVzdWx0cyA9IGRmLmZvcm1hdFRvUGFydHMoKSxcbiAgICAgIG1hdGNoaW5nID0gcmVzdWx0cy5maW5kKChtKSA9PiBtLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gZmllbGQpO1xuICAgIHJldHVybiBtYXRjaGluZyA/IG1hdGNoaW5nLnZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIG51bWJlckZvcm1hdHRlcihvcHRzID0ge30pIHtcbiAgICAvLyB0aGlzIGZvcmNlc2ltcGxlIG9wdGlvbiBpcyBuZXZlciB1c2VkICh0aGUgb25seSBjYWxsZXIgc2hvcnQtY2lyY3VpdHMgb24gaXQsIGJ1dCBpdCBzZWVtcyBzYWZlciB0byBsZWF2ZSlcbiAgICAvLyAoaW4gY29udHJhc3QsIHRoZSByZXN0IG9mIHRoZSBjb25kaXRpb24gaXMgdXNlZCBoZWF2aWx5KVxuICAgIHJldHVybiBuZXcgUG9seU51bWJlckZvcm1hdHRlcih0aGlzLmludGwsIG9wdHMuZm9yY2VTaW1wbGUgfHwgdGhpcy5mYXN0TnVtYmVycywgb3B0cyk7XG4gIH1cblxuICBkdEZvcm1hdHRlcihkdCwgaW50bE9wdHMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgUG9seURhdGVGb3JtYXR0ZXIoZHQsIHRoaXMuaW50bCwgaW50bE9wdHMpO1xuICB9XG5cbiAgcmVsRm9ybWF0dGVyKG9wdHMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgUG9seVJlbEZvcm1hdHRlcih0aGlzLmludGwsIHRoaXMuaXNFbmdsaXNoKCksIG9wdHMpO1xuICB9XG5cbiAgaXNFbmdsaXNoKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmxvY2FsZSA9PT0gXCJlblwiIHx8XG4gICAgICB0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSBcImVuLXVzXCIgfHxcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlLnN0YXJ0c1dpdGgoXCJlbi11c1wiKVxuICAgICk7XG4gIH1cblxuICBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sb2NhbGUgPT09IG90aGVyLmxvY2FsZSAmJlxuICAgICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG90aGVyLm51bWJlcmluZ1N5c3RlbSAmJlxuICAgICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gb3RoZXIub3V0cHV0Q2FsZW5kYXJcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgdW50cnVuY2F0ZVllYXIsXG4gIHNpZ25lZE9mZnNldCxcbiAgcGFyc2VJbnRlZ2VyLFxuICBwYXJzZU1pbGxpcyxcbiAgaWFuYVJlZ2V4LFxuICBpc1VuZGVmaW5lZCxcbn0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0ICogYXMgRW5nbGlzaCBmcm9tIFwiLi9lbmdsaXNoLmpzXCI7XG5pbXBvcnQgRml4ZWRPZmZzZXRab25lIGZyb20gXCIuLi96b25lcy9maXhlZE9mZnNldFpvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi4vem9uZXMvSUFOQVpvbmUuanNcIjtcblxuLypcbiAqIFRoaXMgZmlsZSBoYW5kbGVzIHBhcnNpbmcgZm9yIHdlbGwtc3BlY2lmaWVkIGZvcm1hdHMuIEhlcmUncyBob3cgaXQgd29ya3M6XG4gKiBUd28gdGhpbmdzIGdvIGludG8gcGFyc2luZzogYSByZWdleCB0byBtYXRjaCB3aXRoIGFuZCBhbiBleHRyYWN0b3IgdG8gdGFrZSBhcGFydCB0aGUgZ3JvdXBzIGluIHRoZSBtYXRjaC5cbiAqIEFuIGV4dHJhY3RvciBpcyBqdXN0IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHJlZ2V4IG1hdGNoIGFycmF5IGFuZCByZXR1cm5zIGEgeyB5ZWFyOiAuLi4sIG1vbnRoOiAuLi4gfSBvYmplY3RcbiAqIHBhcnNlKCkgZG9lcyB0aGUgd29yayBvZiBleGVjdXRpbmcgdGhlIHJlZ2V4IGFuZCBhcHBseWluZyB0aGUgZXh0cmFjdG9yLiBJdCB0YWtlcyBtdWx0aXBsZSByZWdleC9leHRyYWN0b3IgcGFpcnMgdG8gdHJ5IGluIHNlcXVlbmNlLlxuICogRXh0cmFjdG9ycyBjYW4gdGFrZSBhIFwiY3Vyc29yXCIgcmVwcmVzZW50aW5nIHRoZSBvZmZzZXQgaW4gdGhlIG1hdGNoIHRvIGxvb2sgYXQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBjb21iaW5lIGV4dHJhY3RvcnMuXG4gKiBjb21iaW5lRXh0cmFjdG9ycygpIGRvZXMgdGhlIHdvcmsgb2YgY29tYmluaW5nIHRoZW0sIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGN1cnNvciB0aHJvdWdoIG11bHRpcGxlIGV4dHJhY3Rpb25zLlxuICogU29tZSBleHRyYWN0aW9ucyBhcmUgc3VwZXIgZHVtYiBhbmQgc2ltcGxlUGFyc2UgYW5kIGZyb21TdHJpbmdzIGhlbHAgRFJZIHRoZW0uXG4gKi9cblxuZnVuY3Rpb24gY29tYmluZVJlZ2V4ZXMoLi4ucmVnZXhlcykge1xuICBjb25zdCBmdWxsID0gcmVnZXhlcy5yZWR1Y2UoKGYsIHIpID0+IGYgKyByLnNvdXJjZSwgXCJcIik7XG4gIHJldHVybiBSZWdFeHAoYF4ke2Z1bGx9JGApO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lRXh0cmFjdG9ycyguLi5leHRyYWN0b3JzKSB7XG4gIHJldHVybiAobSkgPT5cbiAgICBleHRyYWN0b3JzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoW21lcmdlZFZhbHMsIG1lcmdlZFpvbmUsIGN1cnNvcl0sIGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgW3ZhbCwgem9uZSwgbmV4dF0gPSBleChtLCBjdXJzb3IpO1xuICAgICAgICAgIHJldHVybiBbeyAuLi5tZXJnZWRWYWxzLCAuLi52YWwgfSwgbWVyZ2VkWm9uZSB8fCB6b25lLCBuZXh0XTtcbiAgICAgICAgfSxcbiAgICAgICAgW3t9LCBudWxsLCAxXVxuICAgICAgKVxuICAgICAgLnNsaWNlKDAsIDIpO1xufVxuXG5mdW5jdGlvbiBwYXJzZShzLCAuLi5wYXR0ZXJucykge1xuICBpZiAocyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3JlZ2V4LCBleHRyYWN0b3JdIG9mIHBhdHRlcm5zKSB7XG4gICAgY29uc3QgbSA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgaWYgKG0pIHtcbiAgICAgIHJldHVybiBleHRyYWN0b3IobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKC4uLmtleXMpIHtcbiAgcmV0dXJuIChtYXRjaCwgY3Vyc29yKSA9PiB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2tleXNbaV1dID0gcGFyc2VJbnRlZ2VyKG1hdGNoW2N1cnNvciArIGldKTtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXQsIG51bGwsIGN1cnNvciArIGldO1xuICB9O1xufVxuXG4vLyBJU08gYW5kIFNRTCBwYXJzaW5nXG5jb25zdCBvZmZzZXRSZWdleCA9IC8oPzooWil8KFsrLV1cXGRcXGQpKD86Oj8oXFxkXFxkKSk/KS8sXG4gIGlzb1RpbWVCYXNlUmVnZXggPSAvKFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/OlsuLF0oXFxkezEsMzB9KSk/KT8pPy8sXG4gIGlzb1RpbWVSZWdleCA9IFJlZ0V4cChgJHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0ke29mZnNldFJlZ2V4LnNvdXJjZX0/YCksXG4gIGlzb1RpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChgKD86VCR7aXNvVGltZVJlZ2V4LnNvdXJjZX0pP2ApLFxuICBpc29ZbWRSZWdleCA9IC8oWystXVxcZHs2fXxcXGR7NH0pKD86LT8oXFxkXFxkKSg/Oi0/KFxcZFxcZCkpPyk/LyxcbiAgaXNvV2Vla1JlZ2V4ID0gLyhcXGR7NH0pLT9XKFxcZFxcZCkoPzotPyhcXGQpKT8vLFxuICBpc29PcmRpbmFsUmVnZXggPSAvKFxcZHs0fSktPyhcXGR7M30pLyxcbiAgZXh0cmFjdElTT1dlZWtEYXRhID0gc2ltcGxlUGFyc2UoXCJ3ZWVrWWVhclwiLCBcIndlZWtOdW1iZXJcIiwgXCJ3ZWVrRGF5XCIpLFxuICBleHRyYWN0SVNPT3JkaW5hbERhdGEgPSBzaW1wbGVQYXJzZShcInllYXJcIiwgXCJvcmRpbmFsXCIpLFxuICBzcWxZbWRSZWdleCA9IC8oXFxkezR9KS0oXFxkXFxkKS0oXFxkXFxkKS8sIC8vIGR1bWJlZC1kb3duIHZlcnNpb24gb2YgdGhlIElTTyBvbmVcbiAgc3FsVGltZVJlZ2V4ID0gUmVnRXhwKFxuICAgIGAke2lzb1RpbWVCYXNlUmVnZXguc291cmNlfSA/KD86JHtvZmZzZXRSZWdleC5zb3VyY2V9fCgke2lhbmFSZWdleC5zb3VyY2V9KSk/YFxuICApLFxuICBzcWxUaW1lRXh0ZW5zaW9uUmVnZXggPSBSZWdFeHAoYCg/OiAke3NxbFRpbWVSZWdleC5zb3VyY2V9KT9gKTtcblxuZnVuY3Rpb24gaW50KG1hdGNoLCBwb3MsIGZhbGxiYWNrKSB7XG4gIGNvbnN0IG0gPSBtYXRjaFtwb3NdO1xuICByZXR1cm4gaXNVbmRlZmluZWQobSkgPyBmYWxsYmFjayA6IHBhcnNlSW50ZWdlcihtKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1ltZChtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgeWVhcjogaW50KG1hdGNoLCBjdXJzb3IpLFxuICAgIG1vbnRoOiBpbnQobWF0Y2gsIGN1cnNvciArIDEsIDEpLFxuICAgIGRheTogaW50KG1hdGNoLCBjdXJzb3IgKyAyLCAxKSxcbiAgfTtcblxuICByZXR1cm4gW2l0ZW0sIG51bGwsIGN1cnNvciArIDNdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SVNPVGltZShtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgaG91cnM6IGludChtYXRjaCwgY3Vyc29yLCAwKSxcbiAgICBtaW51dGVzOiBpbnQobWF0Y2gsIGN1cnNvciArIDEsIDApLFxuICAgIHNlY29uZHM6IGludChtYXRjaCwgY3Vyc29yICsgMiwgMCksXG4gICAgbWlsbGlzZWNvbmRzOiBwYXJzZU1pbGxpcyhtYXRjaFtjdXJzb3IgKyAzXSksXG4gIH07XG5cbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyA0XTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT09mZnNldChtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGxvY2FsID0gIW1hdGNoW2N1cnNvcl0gJiYgIW1hdGNoW2N1cnNvciArIDFdLFxuICAgIGZ1bGxPZmZzZXQgPSBzaWduZWRPZmZzZXQobWF0Y2hbY3Vyc29yICsgMV0sIG1hdGNoW2N1cnNvciArIDJdKSxcbiAgICB6b25lID0gbG9jYWwgPyBudWxsIDogRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGZ1bGxPZmZzZXQpO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElBTkFab25lKG1hdGNoLCBjdXJzb3IpIHtcbiAgY29uc3Qgem9uZSA9IG1hdGNoW2N1cnNvcl0gPyBJQU5BWm9uZS5jcmVhdGUobWF0Y2hbY3Vyc29yXSkgOiBudWxsO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAxXTtcbn1cblxuLy8gSVNPIHRpbWUgcGFyc2luZ1xuXG5jb25zdCBpc29UaW1lT25seSA9IFJlZ0V4cChgXlQ/JHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0kYCk7XG5cbi8vIElTTyBkdXJhdGlvbiBwYXJzaW5nXG5cbmNvbnN0IGlzb0R1cmF0aW9uID1cbiAgL14tP1AoPzooPzooLT9cXGR7MSw5fSlZKT8oPzooLT9cXGR7MSw5fSlNKT8oPzooLT9cXGR7MSw5fSlXKT8oPzooLT9cXGR7MSw5fSlEKT8oPzpUKD86KC0/XFxkezEsOX0pSCk/KD86KC0/XFxkezEsOX0pTSk/KD86KC0/XFxkezEsMjB9KSg/OlsuLF0oLT9cXGR7MSw5fSkpP1MpPyk/KSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPRHVyYXRpb24obWF0Y2gpIHtcbiAgY29uc3QgW3MsIHllYXJTdHIsIG1vbnRoU3RyLCB3ZWVrU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyLCBtaWxsaXNlY29uZHNTdHJdID1cbiAgICBtYXRjaDtcblxuICBjb25zdCBoYXNOZWdhdGl2ZVByZWZpeCA9IHNbMF0gPT09IFwiLVwiO1xuICBjb25zdCBuZWdhdGl2ZVNlY29uZHMgPSBzZWNvbmRTdHIgJiYgc2Vjb25kU3RyWzBdID09PSBcIi1cIjtcblxuICBjb25zdCBtYXliZU5lZ2F0ZSA9IChudW0sIGZvcmNlID0gZmFsc2UpID0+XG4gICAgbnVtICE9PSB1bmRlZmluZWQgJiYgKGZvcmNlIHx8IChudW0gJiYgaGFzTmVnYXRpdmVQcmVmaXgpKSA/IC1udW0gOiBudW07XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB5ZWFyczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKHllYXJTdHIpKSxcbiAgICAgIG1vbnRoczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKG1vbnRoU3RyKSksXG4gICAgICB3ZWVrczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKHdlZWtTdHIpKSxcbiAgICAgIGRheXM6IG1heWJlTmVnYXRlKHBhcnNlSW50ZWdlcihkYXlTdHIpKSxcbiAgICAgIGhvdXJzOiBtYXliZU5lZ2F0ZShwYXJzZUludGVnZXIoaG91clN0cikpLFxuICAgICAgbWludXRlczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKG1pbnV0ZVN0cikpLFxuICAgICAgc2Vjb25kczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKHNlY29uZFN0ciksIHNlY29uZFN0ciA9PT0gXCItMFwiKSxcbiAgICAgIG1pbGxpc2Vjb25kczogbWF5YmVOZWdhdGUocGFyc2VNaWxsaXMobWlsbGlzZWNvbmRzU3RyKSwgbmVnYXRpdmVTZWNvbmRzKSxcbiAgICB9LFxuICBdO1xufVxuXG4vLyBUaGVzZSBhcmUgYSBsaXR0bGUgYnJhaW5kZWFkLiBFRFQgKnNob3VsZCogdGVsbCB1cyB0aGF0IHdlJ3JlIGluLCBzYXksIEFtZXJpY2EvTmV3X1lvcmtcbi8vIGFuZCBub3QganVzdCB0aGF0IHdlJ3JlIGluIC0yNDAgKnJpZ2h0IG5vdyouIEJ1dCBzaW5jZSBJIGRvbid0IHRoaW5rIHRoZXNlIGFyZSB1c2VkIHRoYXQgb2Z0ZW5cbi8vIEknbSBqdXN0IGdvaW5nIHRvIGlnbm9yZSB0aGF0XG5jb25zdCBvYnNPZmZzZXRzID0ge1xuICBHTVQ6IDAsXG4gIEVEVDogLTQgKiA2MCxcbiAgRVNUOiAtNSAqIDYwLFxuICBDRFQ6IC01ICogNjAsXG4gIENTVDogLTYgKiA2MCxcbiAgTURUOiAtNiAqIDYwLFxuICBNU1Q6IC03ICogNjAsXG4gIFBEVDogLTcgKiA2MCxcbiAgUFNUOiAtOCAqIDYwLFxufTtcblxuZnVuY3Rpb24gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHllYXI6IHllYXJTdHIubGVuZ3RoID09PSAyID8gdW50cnVuY2F0ZVllYXIocGFyc2VJbnRlZ2VyKHllYXJTdHIpKSA6IHBhcnNlSW50ZWdlcih5ZWFyU3RyKSxcbiAgICBtb250aDogRW5nbGlzaC5tb250aHNTaG9ydC5pbmRleE9mKG1vbnRoU3RyKSArIDEsXG4gICAgZGF5OiBwYXJzZUludGVnZXIoZGF5U3RyKSxcbiAgICBob3VyOiBwYXJzZUludGVnZXIoaG91clN0ciksXG4gICAgbWludXRlOiBwYXJzZUludGVnZXIobWludXRlU3RyKSxcbiAgfTtcblxuICBpZiAoc2Vjb25kU3RyKSByZXN1bHQuc2Vjb25kID0gcGFyc2VJbnRlZ2VyKHNlY29uZFN0cik7XG4gIGlmICh3ZWVrZGF5U3RyKSB7XG4gICAgcmVzdWx0LndlZWtkYXkgPVxuICAgICAgd2Vla2RheVN0ci5sZW5ndGggPiAzXG4gICAgICAgID8gRW5nbGlzaC53ZWVrZGF5c0xvbmcuaW5kZXhPZih3ZWVrZGF5U3RyKSArIDFcbiAgICAgICAgOiBFbmdsaXNoLndlZWtkYXlzU2hvcnQuaW5kZXhPZih3ZWVrZGF5U3RyKSArIDE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBSRkMgMjgyMi81MzIyXG5jb25zdCByZmMyODIyID1cbiAgL14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSxcXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cXGRcXGQpKFxcZFxcZCkpKSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0UkZDMjgyMihtYXRjaCkge1xuICBjb25zdCBbXG4gICAgICAsXG4gICAgICB3ZWVrZGF5U3RyLFxuICAgICAgZGF5U3RyLFxuICAgICAgbW9udGhTdHIsXG4gICAgICB5ZWFyU3RyLFxuICAgICAgaG91clN0cixcbiAgICAgIG1pbnV0ZVN0cixcbiAgICAgIHNlY29uZFN0cixcbiAgICAgIG9ic09mZnNldCxcbiAgICAgIG1pbE9mZnNldCxcbiAgICAgIG9mZkhvdXJTdHIsXG4gICAgICBvZmZNaW51dGVTdHIsXG4gICAgXSA9IG1hdGNoLFxuICAgIHJlc3VsdCA9IGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKTtcblxuICBsZXQgb2Zmc2V0O1xuICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgb2Zmc2V0ID0gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICB9IGVsc2UgaWYgKG1pbE9mZnNldCkge1xuICAgIG9mZnNldCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgb2Zmc2V0ID0gc2lnbmVkT2Zmc2V0KG9mZkhvdXJTdHIsIG9mZk1pbnV0ZVN0cik7XG4gIH1cblxuICByZXR1cm4gW3Jlc3VsdCwgbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpXTtcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICByZXR1cm4gc1xuICAgIC5yZXBsYWNlKC9cXChbXildKlxcKXxbXFxuXFx0XS9nLCBcIiBcIilcbiAgICAucmVwbGFjZSgvKFxcc1xccyspL2csIFwiIFwiKVxuICAgIC50cmltKCk7XG59XG5cbi8vIGh0dHAgZGF0ZVxuXG5jb25zdCByZmMxMTIzID1cbiAgICAvXihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLCAoXFxkXFxkKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpIChcXGR7NH0pIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIEdNVCQvLFxuICByZmM4NTAgPVxuICAgIC9eKE1vbmRheXxUdWVzZGF5fFdlZHNkYXl8VGh1cnNkYXl8RnJpZGF5fFNhdHVyZGF5fFN1bmRheSksIChcXGRcXGQpLShKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYyktKFxcZFxcZCkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgR01UJC8sXG4gIGFzY2lpID1cbiAgICAvXihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pIChKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYykgKCBcXGR8XFxkXFxkKSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSAoXFxkezR9KSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0UkZDMTEyM09yODUwKG1hdGNoKSB7XG4gIGNvbnN0IFssIHdlZWtkYXlTdHIsIGRheVN0ciwgbW9udGhTdHIsIHllYXJTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyXSA9IG1hdGNoLFxuICAgIHJlc3VsdCA9IGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKTtcbiAgcmV0dXJuIFtyZXN1bHQsIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZV07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBU0NJSShtYXRjaCkge1xuICBjb25zdCBbLCB3ZWVrZGF5U3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0ciwgeWVhclN0cl0gPSBtYXRjaCxcbiAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuXG5jb25zdCBpc29ZbWRXaXRoVGltZUV4dGVuc2lvblJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoaXNvWW1kUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCk7XG5jb25zdCBpc29XZWVrV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKGlzb1dlZWtSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KTtcbmNvbnN0IGlzb09yZGluYWxXaXRoVGltZUV4dGVuc2lvblJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoaXNvT3JkaW5hbFJlZ2V4LCBpc29UaW1lRXh0ZW5zaW9uUmVnZXgpO1xuY29uc3QgaXNvVGltZUNvbWJpbmVkUmVnZXggPSBjb21iaW5lUmVnZXhlcyhpc29UaW1lUmVnZXgpO1xuXG5jb25zdCBleHRyYWN0SVNPWW1kVGltZUFuZE9mZnNldCA9IGNvbWJpbmVFeHRyYWN0b3JzKFxuICBleHRyYWN0SVNPWW1kLFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldFxuKTtcbmNvbnN0IGV4dHJhY3RJU09XZWVrVGltZUFuZE9mZnNldCA9IGNvbWJpbmVFeHRyYWN0b3JzKFxuICBleHRyYWN0SVNPV2Vla0RhdGEsXG4gIGV4dHJhY3RJU09UaW1lLFxuICBleHRyYWN0SVNPT2Zmc2V0XG4pO1xuY29uc3QgZXh0cmFjdElTT09yZGluYWxEYXRlQW5kVGltZSA9IGNvbWJpbmVFeHRyYWN0b3JzKFxuICBleHRyYWN0SVNPT3JkaW5hbERhdGEsXG4gIGV4dHJhY3RJU09UaW1lLFxuICBleHRyYWN0SVNPT2Zmc2V0XG4pO1xuY29uc3QgZXh0cmFjdElTT1RpbWVBbmRPZmZzZXQgPSBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPVGltZSwgZXh0cmFjdElTT09mZnNldCk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJU09EYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKFxuICAgIHMsXG4gICAgW2lzb1ltZFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09ZbWRUaW1lQW5kT2Zmc2V0XSxcbiAgICBbaXNvV2Vla1dpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09XZWVrVGltZUFuZE9mZnNldF0sXG4gICAgW2lzb09yZGluYWxXaXRoVGltZUV4dGVuc2lvblJlZ2V4LCBleHRyYWN0SVNPT3JkaW5hbERhdGVBbmRUaW1lXSxcbiAgICBbaXNvVGltZUNvbWJpbmVkUmVnZXgsIGV4dHJhY3RJU09UaW1lQW5kT2Zmc2V0XVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSRkMyODIyRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShwcmVwcm9jZXNzUkZDMjgyMihzKSwgW3JmYzI4MjIsIGV4dHJhY3RSRkMyODIyXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUhUVFBEYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKFxuICAgIHMsXG4gICAgW3JmYzExMjMsIGV4dHJhY3RSRkMxMTIzT3I4NTBdLFxuICAgIFtyZmM4NTAsIGV4dHJhY3RSRkMxMTIzT3I4NTBdLFxuICAgIFthc2NpaSwgZXh0cmFjdEFTQ0lJXVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJU09EdXJhdGlvbihzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbaXNvRHVyYXRpb24sIGV4dHJhY3RJU09EdXJhdGlvbl0pO1xufVxuXG5jb25zdCBleHRyYWN0SVNPVGltZU9ubHkgPSBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPVGltZSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUlTT1RpbWVPbmx5KHMpIHtcbiAgcmV0dXJuIHBhcnNlKHMsIFtpc29UaW1lT25seSwgZXh0cmFjdElTT1RpbWVPbmx5XSk7XG59XG5cbmNvbnN0IHNxbFltZFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXggPSBjb21iaW5lUmVnZXhlcyhzcWxZbWRSZWdleCwgc3FsVGltZUV4dGVuc2lvblJlZ2V4KTtcbmNvbnN0IHNxbFRpbWVDb21iaW5lZFJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoc3FsVGltZVJlZ2V4KTtcblxuY29uc3QgZXh0cmFjdElTT1ltZFRpbWVPZmZzZXRBbmRJQU5BWm9uZSA9IGNvbWJpbmVFeHRyYWN0b3JzKFxuICBleHRyYWN0SVNPWW1kLFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldCxcbiAgZXh0cmFjdElBTkFab25lXG4pO1xuY29uc3QgZXh0cmFjdElTT1RpbWVPZmZzZXRBbmRJQU5BWm9uZSA9IGNvbWJpbmVFeHRyYWN0b3JzKFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldCxcbiAgZXh0cmFjdElBTkFab25lXG4pO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTUUwocykge1xuICByZXR1cm4gcGFyc2UoXG4gICAgcyxcbiAgICBbc3FsWW1kV2l0aFRpbWVFeHRlbnNpb25SZWdleCwgZXh0cmFjdElTT1ltZFRpbWVPZmZzZXRBbmRJQU5BWm9uZV0sXG4gICAgW3NxbFRpbWVDb21iaW5lZFJlZ2V4LCBleHRyYWN0SVNPVGltZU9mZnNldEFuZElBTkFab25lXVxuICApO1xufVxuIiwgImltcG9ydCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBJbnZhbGlkRHVyYXRpb25FcnJvciwgSW52YWxpZFVuaXRFcnJvciB9IGZyb20gXCIuL2Vycm9ycy5qc1wiO1xuaW1wb3J0IEZvcm1hdHRlciBmcm9tIFwiLi9pbXBsL2Zvcm1hdHRlci5qc1wiO1xuaW1wb3J0IEludmFsaWQgZnJvbSBcIi4vaW1wbC9pbnZhbGlkLmpzXCI7XG5pbXBvcnQgTG9jYWxlIGZyb20gXCIuL2ltcGwvbG9jYWxlLmpzXCI7XG5pbXBvcnQgeyBwYXJzZUlTT0R1cmF0aW9uLCBwYXJzZUlTT1RpbWVPbmx5IH0gZnJvbSBcIi4vaW1wbC9yZWdleFBhcnNlci5qc1wiO1xuaW1wb3J0IHtcbiAgYXNOdW1iZXIsXG4gIGhhc093blByb3BlcnR5LFxuICBpc051bWJlcixcbiAgaXNVbmRlZmluZWQsXG4gIG5vcm1hbGl6ZU9iamVjdCxcbiAgcm91bmRUbyxcbn0gZnJvbSBcIi4vaW1wbC91dGlsLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBEdXJhdGlvblwiO1xuXG4vLyB1bml0IGNvbnZlcnNpb24gY29uc3RhbnRzXG5jb25zdCBsb3dPcmRlck1hdHJpeCA9IHtcbiAgICB3ZWVrczoge1xuICAgICAgZGF5czogNyxcbiAgICAgIGhvdXJzOiA3ICogMjQsXG4gICAgICBtaW51dGVzOiA3ICogMjQgKiA2MCxcbiAgICAgIHNlY29uZHM6IDcgKiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG4gICAgZGF5czoge1xuICAgICAgaG91cnM6IDI0LFxuICAgICAgbWludXRlczogMjQgKiA2MCxcbiAgICAgIHNlY29uZHM6IDI0ICogNjAgKiA2MCxcbiAgICAgIG1pbGxpc2Vjb25kczogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICB9LFxuICAgIGhvdXJzOiB7IG1pbnV0ZXM6IDYwLCBzZWNvbmRzOiA2MCAqIDYwLCBtaWxsaXNlY29uZHM6IDYwICogNjAgKiAxMDAwIH0sXG4gICAgbWludXRlczogeyBzZWNvbmRzOiA2MCwgbWlsbGlzZWNvbmRzOiA2MCAqIDEwMDAgfSxcbiAgICBzZWNvbmRzOiB7IG1pbGxpc2Vjb25kczogMTAwMCB9LFxuICB9LFxuICBjYXN1YWxNYXRyaXggPSB7XG4gICAgeWVhcnM6IHtcbiAgICAgIHF1YXJ0ZXJzOiA0LFxuICAgICAgbW9udGhzOiAxMixcbiAgICAgIHdlZWtzOiA1MixcbiAgICAgIGRheXM6IDM2NSxcbiAgICAgIGhvdXJzOiAzNjUgKiAyNCxcbiAgICAgIG1pbnV0ZXM6IDM2NSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IDM2NSAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcbiAgICBxdWFydGVyczoge1xuICAgICAgbW9udGhzOiAzLFxuICAgICAgd2Vla3M6IDEzLFxuICAgICAgZGF5czogOTEsXG4gICAgICBob3VyczogOTEgKiAyNCxcbiAgICAgIG1pbnV0ZXM6IDkxICogMjQgKiA2MCxcbiAgICAgIHNlY29uZHM6IDkxICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcbiAgICBtb250aHM6IHtcbiAgICAgIHdlZWtzOiA0LFxuICAgICAgZGF5czogMzAsXG4gICAgICBob3VyczogMzAgKiAyNCxcbiAgICAgIG1pbnV0ZXM6IDMwICogMjQgKiA2MCxcbiAgICAgIHNlY29uZHM6IDMwICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcblxuICAgIC4uLmxvd09yZGVyTWF0cml4LFxuICB9LFxuICBkYXlzSW5ZZWFyQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQwMCxcbiAgZGF5c0luTW9udGhBY2N1cmF0ZSA9IDE0NjA5Ny4wIC8gNDgwMCxcbiAgYWNjdXJhdGVNYXRyaXggPSB7XG4gICAgeWVhcnM6IHtcbiAgICAgIHF1YXJ0ZXJzOiA0LFxuICAgICAgbW9udGhzOiAxMixcbiAgICAgIHdlZWtzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgLyA3LFxuICAgICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlLFxuICAgICAgaG91cnM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0LFxuICAgICAgbWludXRlczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCxcbiAgICAgIHNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCxcbiAgICAgIG1pbGxpc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICB9LFxuICAgIHF1YXJ0ZXJzOiB7XG4gICAgICBtb250aHM6IDMsXG4gICAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gMjgsXG4gICAgICBkYXlzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgLyA0LFxuICAgICAgaG91cnM6IChkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCkgLyA0LFxuICAgICAgbWludXRlczogKGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjApIC8gNCxcbiAgICAgIHNlY29uZHM6IChkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjApIC8gNCxcbiAgICAgIG1pbGxpc2Vjb25kczogKGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAqIDEwMDApIC8gNCxcbiAgICB9LFxuICAgIG1vbnRoczoge1xuICAgICAgd2Vla3M6IGRheXNJbk1vbnRoQWNjdXJhdGUgLyA3LFxuICAgICAgZGF5czogZGF5c0luTW9udGhBY2N1cmF0ZSxcbiAgICAgIGhvdXJzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQsXG4gICAgICBtaW51dGVzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCxcbiAgICAgIHNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG4gICAgLi4ubG93T3JkZXJNYXRyaXgsXG4gIH07XG5cbi8vIHVuaXRzIG9yZGVyZWQgYnkgc2l6ZVxuY29uc3Qgb3JkZXJlZFVuaXRzID0gW1xuICBcInllYXJzXCIsXG4gIFwicXVhcnRlcnNcIixcbiAgXCJtb250aHNcIixcbiAgXCJ3ZWVrc1wiLFxuICBcImRheXNcIixcbiAgXCJob3Vyc1wiLFxuICBcIm1pbnV0ZXNcIixcbiAgXCJzZWNvbmRzXCIsXG4gIFwibWlsbGlzZWNvbmRzXCIsXG5dO1xuXG5jb25zdCByZXZlcnNlVW5pdHMgPSBvcmRlcmVkVW5pdHMuc2xpY2UoMCkucmV2ZXJzZSgpO1xuXG4vLyBjbG9uZSByZWFsbHkgbWVhbnMgXCJjcmVhdGUgYW5vdGhlciBpbnN0YW5jZSBqdXN0IGxpa2UgdGhpcyBvbmUsIGJ1dCB3aXRoIHRoZXNlIGNoYW5nZXNcIlxuZnVuY3Rpb24gY2xvbmUoZHVyLCBhbHRzLCBjbGVhciA9IGZhbHNlKSB7XG4gIC8vIGRlZXAgbWVyZ2UgZm9yIHZhbHNcbiAgY29uc3QgY29uZiA9IHtcbiAgICB2YWx1ZXM6IGNsZWFyID8gYWx0cy52YWx1ZXMgOiB7IC4uLmR1ci52YWx1ZXMsIC4uLihhbHRzLnZhbHVlcyB8fCB7fSkgfSxcbiAgICBsb2M6IGR1ci5sb2MuY2xvbmUoYWx0cy5sb2MpLFxuICAgIGNvbnZlcnNpb25BY2N1cmFjeTogYWx0cy5jb252ZXJzaW9uQWNjdXJhY3kgfHwgZHVyLmNvbnZlcnNpb25BY2N1cmFjeSxcbiAgfTtcbiAgcmV0dXJuIG5ldyBEdXJhdGlvbihjb25mKTtcbn1cblxuZnVuY3Rpb24gYW50aVRydW5jKG4pIHtcbiAgcmV0dXJuIG4gPCAwID8gTWF0aC5mbG9vcihuKSA6IE1hdGguY2VpbChuKTtcbn1cblxuLy8gTkI6IG11dGF0ZXMgcGFyYW1ldGVyc1xuZnVuY3Rpb24gY29udmVydChtYXRyaXgsIGZyb21NYXAsIGZyb21Vbml0LCB0b01hcCwgdG9Vbml0KSB7XG4gIGNvbnN0IGNvbnYgPSBtYXRyaXhbdG9Vbml0XVtmcm9tVW5pdF0sXG4gICAgcmF3ID0gZnJvbU1hcFtmcm9tVW5pdF0gLyBjb252LFxuICAgIHNhbWVTaWduID0gTWF0aC5zaWduKHJhdykgPT09IE1hdGguc2lnbih0b01hcFt0b1VuaXRdKSxcbiAgICAvLyBvaywgc28gdGhpcyBpcyB3aWxkLCBidXQgc2VlIHRoZSBtYXRyaXggaW4gdGhlIHRlc3RzXG4gICAgYWRkZWQgPVxuICAgICAgIXNhbWVTaWduICYmIHRvTWFwW3RvVW5pdF0gIT09IDAgJiYgTWF0aC5hYnMocmF3KSA8PSAxID8gYW50aVRydW5jKHJhdykgOiBNYXRoLnRydW5jKHJhdyk7XG4gIHRvTWFwW3RvVW5pdF0gKz0gYWRkZWQ7XG4gIGZyb21NYXBbZnJvbVVuaXRdIC09IGFkZGVkICogY29udjtcbn1cblxuLy8gTkI6IG11dGF0ZXMgcGFyYW1ldGVyc1xuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWVzKG1hdHJpeCwgdmFscykge1xuICByZXZlcnNlVW5pdHMucmVkdWNlKChwcmV2aW91cywgY3VycmVudCkgPT4ge1xuICAgIGlmICghaXNVbmRlZmluZWQodmFsc1tjdXJyZW50XSkpIHtcbiAgICAgIGlmIChwcmV2aW91cykge1xuICAgICAgICBjb252ZXJ0KG1hdHJpeCwgdmFscywgcHJldmlvdXMsIHZhbHMsIGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9XG4gIH0sIG51bGwpO1xufVxuXG4vKipcbiAqIEEgRHVyYXRpb24gb2JqZWN0IHJlcHJlc2VudHMgYSBwZXJpb2Qgb2YgdGltZSwgbGlrZSBcIjIgbW9udGhzXCIgb3IgXCIxIGRheSwgMSBob3VyXCIuIENvbmNlcHR1YWxseSwgaXQncyBqdXN0IGEgbWFwIG9mIHVuaXRzIHRvIHRoZWlyIHF1YW50aXRpZXMsIGFjY29tcGFuaWVkIGJ5IHNvbWUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGFuZCBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgdHJhbnNmb3JtaW5nLCBhbmQgZm9ybWF0dGluZyB0aGVtLiBUaGV5IGNhbiBiZSB1c2VkIG9uIHRoZWlyIG93biBvciBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIEx1eG9uIHR5cGVzOyBmb3IgZXhhbXBsZSwgeW91IGNhbiB1c2Uge0BsaW5rIERhdGVUaW1lLnBsdXN9IHRvIGFkZCBhIER1cmF0aW9uIG9iamVjdCB0byBhIERhdGVUaW1lLCBwcm9kdWNpbmcgYW5vdGhlciBEYXRlVGltZS5cbiAqXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgY29tbW9ubHkgdXNlZCBtZXRob2RzIGFuZCBnZXR0ZXJzIGluIER1cmF0aW9uOlxuICpcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhIER1cmF0aW9uLCB1c2Uge0BsaW5rIER1cmF0aW9uLmZyb21NaWxsaXN9LCB7QGxpbmsgRHVyYXRpb24uZnJvbU9iamVjdH0sIG9yIHtAbGluayBEdXJhdGlvbi5mcm9tSVNPfS5cbiAqICogKipVbml0IHZhbHVlcyoqIFNlZSB0aGUge0BsaW5rIER1cmF0aW9uI3llYXJzfSwge0BsaW5rIER1cmF0aW9uLm1vbnRoc30sIHtAbGluayBEdXJhdGlvbiN3ZWVrc30sIHtAbGluayBEdXJhdGlvbiNkYXlzfSwge0BsaW5rIER1cmF0aW9uI2hvdXJzfSwge0BsaW5rIER1cmF0aW9uI21pbnV0ZXN9LCB7QGxpbmsgRHVyYXRpb24jc2Vjb25kc30sIHtAbGluayBEdXJhdGlvbiNtaWxsaXNlY29uZHN9IGFjY2Vzc29ycy5cbiAqICogKipDb25maWd1cmF0aW9uKiogU2VlICB7QGxpbmsgRHVyYXRpb24jbG9jYWxlfSBhbmQge0BsaW5rIER1cmF0aW9uI251bWJlcmluZ1N5c3RlbX0gYWNjZXNzb3JzLlxuICogKiAqKlRyYW5zZm9ybWF0aW9uKiogVG8gY3JlYXRlIG5ldyBEdXJhdGlvbnMgb3V0IG9mIG9sZCBvbmVzIHVzZSB7QGxpbmsgRHVyYXRpb24jcGx1c30sIHtAbGluayBEdXJhdGlvbiNtaW51c30sIHtAbGluayBEdXJhdGlvbiNub3JtYWxpemV9LCB7QGxpbmsgRHVyYXRpb24jc2V0fSwge0BsaW5rIER1cmF0aW9uI3JlY29uZmlndXJlfSwge0BsaW5rIER1cmF0aW9uI3NoaWZ0VG99LCBhbmQge0BsaW5rIER1cmF0aW9uI25lZ2F0ZX0uXG4gKiAqICoqT3V0cHV0KiogVG8gY29udmVydCB0aGUgRHVyYXRpb24gaW50byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHNlZSB7QGxpbmsgRHVyYXRpb24jYXN9LCB7QGxpbmsgRHVyYXRpb24jdG9JU099LCB7QGxpbmsgRHVyYXRpb24jdG9Gb3JtYXR9LCBhbmQge0BsaW5rIER1cmF0aW9uI3RvSlNPTn1cbiAqXG4gKiBUaGVyZSdzIGFyZSBtb3JlIG1ldGhvZHMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIHZhbGlkaXR5LCBzZWUgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBjb25zdCBhY2N1cmF0ZSA9IGNvbmZpZy5jb252ZXJzaW9uQWNjdXJhY3kgPT09IFwibG9uZ3Rlcm1cIiB8fCBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnZhbHVlcyA9IGNvbmZpZy52YWx1ZXM7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5sb2MgPSBjb25maWcubG9jIHx8IExvY2FsZS5jcmVhdGUoKTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeSA9IGFjY3VyYXRlID8gXCJsb25ndGVybVwiIDogXCJjYXN1YWxcIjtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmludmFsaWQgPSBjb25maWcuaW52YWxpZCB8fCBudWxsO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubWF0cml4ID0gYWNjdXJhdGUgPyBhY2N1cmF0ZU1hdHJpeCA6IGNhc3VhbE1hdHJpeDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmlzTHV4b25EdXJhdGlvbiA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIER1cmF0aW9uIGZyb20gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgb2YgbWlsbGlzZWNvbmRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyBmb3IgcGFyc2luZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBmcm9tTWlsbGlzKGNvdW50LCBvcHRzKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaWxsaXNlY29uZHM6IGNvdW50IH0sIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYSBKYXZhU2NyaXB0IG9iamVjdCB3aXRoIGtleXMgbGlrZSAneWVhcnMnIGFuZCAnaG91cnMnLlxuICAgKiBJZiB0aGlzIG9iamVjdCBpcyBlbXB0eSB0aGVuIGEgemVybyBtaWxsaXNlY29uZHMgZHVyYXRpb24gaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgRGF0ZVRpbWUgZnJvbVxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnllYXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoucXVhcnRlcnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmRheXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5ob3Vyc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbnV0ZXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5zZWNvbmRzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cz1bXV0gLSBvcHRpb25zIGZvciBjcmVhdGluZyB0aGlzIER1cmF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgc3RhdGljIGZyb21PYmplY3Qob2JqLCBvcHRzID0ge30pIHtcbiAgICBpZiAob2JqID09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICBgRHVyYXRpb24uZnJvbU9iamVjdDogYXJndW1lbnQgZXhwZWN0ZWQgdG8gYmUgYW4gb2JqZWN0LCBnb3QgJHtcbiAgICAgICAgICBvYmogPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBvYmpcbiAgICAgICAgfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRHVyYXRpb24oe1xuICAgICAgdmFsdWVzOiBub3JtYWxpemVPYmplY3Qob2JqLCBEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0cyksXG4gICAgICBjb252ZXJzaW9uQWNjdXJhY3k6IG9wdHMuY29udmVyc2lvbkFjY3VyYWN5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgZHVyYXRpb24gc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRleHQgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjRHVyYXRpb25zXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU08oJ1AzWTZNMVc0RFQxMkgzME01UycpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAzLCBtb250aHM6IDYsIHdlZWtzOiAxLCBkYXlzOiA0LCBob3VyczogMTIsIG1pbnV0ZXM6IDMwLCBzZWNvbmRzOiA1IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUFQyM0gnKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjMgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQNVkzTScpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiA1LCBtb250aHM6IDMgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcGFyc2VkXSA9IHBhcnNlSVNPRHVyYXRpb24odGV4dCk7XG4gICAgaWYgKHBhcnNlZCkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QocGFyc2VkLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmludmFsaWQoXCJ1bnBhcnNhYmxlXCIsIGB0aGUgaW5wdXQgXCIke3RleHR9XCIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGV4dCB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lc1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPVGltZSgnMTE6MjI6MzMuNDQ0JykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAyMiwgc2Vjb25kczogMzMsIG1pbGxpc2Vjb25kczogNDQ0IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJzExOjAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTowMCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMCwgc2Vjb25kczogMCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU09UaW1lKCcxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbUlTT1RpbWUodGV4dCwgb3B0cykge1xuICAgIGNvbnN0IFtwYXJzZWRdID0gcGFyc2VJU09UaW1lT25seSh0ZXh0KTtcbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChwYXJzZWQsIG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBzaW1wbGUgc3RyaW5nIG9mIHdoeSB0aGlzIGRhdGV0aW1lIGlzIGludmFsaWQuIFNob3VsZCBub3QgY29udGFpbiBwYXJhbWV0ZXJzIG9yIGFueXRoaW5nIGVsc2UgZGF0YS1kZXBlbmRlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBpbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24gPSBudWxsKSB7XG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnZhbGlkID0gcmVhc29uIGluc3RhbmNlb2YgSW52YWxpZCA/IHJlYXNvbiA6IG5ldyBJbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pO1xuXG4gICAgaWYgKFNldHRpbmdzLnRocm93T25JbnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZER1cmF0aW9uRXJyb3IoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRHVyYXRpb24oeyBpbnZhbGlkIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgICB5ZWFyOiBcInllYXJzXCIsXG4gICAgICB5ZWFyczogXCJ5ZWFyc1wiLFxuICAgICAgcXVhcnRlcjogXCJxdWFydGVyc1wiLFxuICAgICAgcXVhcnRlcnM6IFwicXVhcnRlcnNcIixcbiAgICAgIG1vbnRoOiBcIm1vbnRoc1wiLFxuICAgICAgbW9udGhzOiBcIm1vbnRoc1wiLFxuICAgICAgd2VlazogXCJ3ZWVrc1wiLFxuICAgICAgd2Vla3M6IFwid2Vla3NcIixcbiAgICAgIGRheTogXCJkYXlzXCIsXG4gICAgICBkYXlzOiBcImRheXNcIixcbiAgICAgIGhvdXI6IFwiaG91cnNcIixcbiAgICAgIGhvdXJzOiBcImhvdXJzXCIsXG4gICAgICBtaW51dGU6IFwibWludXRlc1wiLFxuICAgICAgbWludXRlczogXCJtaW51dGVzXCIsXG4gICAgICBzZWNvbmQ6IFwic2Vjb25kc1wiLFxuICAgICAgc2Vjb25kczogXCJzZWNvbmRzXCIsXG4gICAgICBtaWxsaXNlY29uZDogXCJtaWxsaXNlY29uZHNcIixcbiAgICAgIG1pbGxpc2Vjb25kczogXCJtaWxsaXNlY29uZHNcIixcbiAgICB9W3VuaXQgPyB1bml0LnRvTG93ZXJDYXNlKCkgOiB1bml0XTtcblxuICAgIGlmICghbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBEdXJhdGlvbi4gV29ya3MgYWNyb3NzIGNvbnRleHQgYm91bmRhcmllc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzRHVyYXRpb24obykge1xuICAgIHJldHVybiAobyAmJiBvLmlzTHV4b25EdXJhdGlvbikgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0ICB0aGUgbG9jYWxlIG9mIGEgRHVyYXRpb24sIHN1Y2ggJ2VuLUdCJ1xuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEdXJhdGlvbiwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEdXJhdGlvblxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuIFlvdSBtYXkgdXNlIHRoZXNlIHRva2VuczpcbiAgICogKiBgU2AgZm9yIG1pbGxpc2Vjb25kc1xuICAgKiAqIGBzYCBmb3Igc2Vjb25kc1xuICAgKiAqIGBtYCBmb3IgbWludXRlc1xuICAgKiAqIGBoYCBmb3IgaG91cnNcbiAgICogKiBgZGAgZm9yIGRheXNcbiAgICogKiBgTWAgZm9yIG1vbnRoc1xuICAgKiAqIGB5YCBmb3IgeWVhcnNcbiAgICogTm90ZXM6XG4gICAqICogQWRkIHBhZGRpbmcgYnkgcmVwZWF0aW5nIHRoZSB0b2tlbiwgZS5nLiBcInl5XCIgcGFkcyB0aGUgeWVhcnMgdG8gdHdvIGRpZ2l0cywgXCJoaGhoXCIgcGFkcyB0aGUgaG91cnMgb3V0IHRvIGZvdXIgZGlnaXRzXG4gICAqICogVGhlIGR1cmF0aW9uIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBzZXQgb2YgdW5pdHMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgdXNpbmcge0BsaW5rIER1cmF0aW9uLnNoaWZ0VG99IGFuZCB0aGUgRHVyYXRpb25zJ3MgY29udmVyc2lvbiBhY2N1cmFjeSBzZXR0aW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxvb3I9dHJ1ZV0gLSBmbG9vciBudW1lcmljYWwgdmFsdWVzXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInkgZCBzXCIpIC8vPT4gXCIxIDYgMlwiXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInl5IGRkIHNzc1wiKSAvLz0+IFwiMDEgMDYgMDAyXCJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwiTSBTXCIpIC8vPT4gXCIxMiA1MTg0MDIwMDBcIlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChmbXQsIG9wdHMgPSB7fSkge1xuICAgIC8vIHJldmVyc2UtY29tcGF0IHNpbmNlIDEuMjsgd2UgYWx3YXlzIHJvdW5kIGRvd24gbm93LCBuZXZlciB1cCwgYW5kIHdlIGRvIGl0IGJ5IGRlZmF1bHRcbiAgICBjb25zdCBmbXRPcHRzID0ge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGZsb29yOiBvcHRzLnJvdW5kICE9PSBmYWxzZSAmJiBvcHRzLmZsb29yICE9PSBmYWxzZSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYywgZm10T3B0cykuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsIGZtdClcbiAgICAgIDogSU5WQUxJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCB0aGlzIER1cmF0aW9uJ3MgdmFsdWVzLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDEsIGRheXM6IDYsIHNlY29uZHM6IDIgfSkudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDEsIGRheXM6IDYsIHNlY29uZHM6IDIgfVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICB0b09iamVjdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuICAgIHJldHVybiB7IC4uLnRoaXMudmFsdWVzIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24uXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjRHVyYXRpb25zXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMywgc2Vjb25kczogNDUgfSkudG9JU08oKSAvLz0+ICdQM1lUNDVTJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbW9udGhzOiA0LCBzZWNvbmRzOiA0NSB9KS50b0lTTygpIC8vPT4gJ1A0TVQ0NVMnXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtb250aHM6IDUgfSkudG9JU08oKSAvLz0+ICdQNU0nXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaW51dGVzOiA1IH0pLnRvSVNPKCkgLy89PiAnUFQ1TSdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1pbGxpc2Vjb25kczogNiB9KS50b0lTTygpIC8vPT4gJ1BUMC4wMDZTJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTTygpIHtcbiAgICAvLyB3ZSBjb3VsZCB1c2UgdGhlIGZvcm1hdHRlciwgYnV0IHRoaXMgaXMgYW4gZWFzaWVyIHdheSB0byBnZXQgdGhlIG1pbmltdW0gc3RyaW5nXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuXG4gICAgbGV0IHMgPSBcIlBcIjtcbiAgICBpZiAodGhpcy55ZWFycyAhPT0gMCkgcyArPSB0aGlzLnllYXJzICsgXCJZXCI7XG4gICAgaWYgKHRoaXMubW9udGhzICE9PSAwIHx8IHRoaXMucXVhcnRlcnMgIT09IDApIHMgKz0gdGhpcy5tb250aHMgKyB0aGlzLnF1YXJ0ZXJzICogMyArIFwiTVwiO1xuICAgIGlmICh0aGlzLndlZWtzICE9PSAwKSBzICs9IHRoaXMud2Vla3MgKyBcIldcIjtcbiAgICBpZiAodGhpcy5kYXlzICE9PSAwKSBzICs9IHRoaXMuZGF5cyArIFwiRFwiO1xuICAgIGlmICh0aGlzLmhvdXJzICE9PSAwIHx8IHRoaXMubWludXRlcyAhPT0gMCB8fCB0aGlzLnNlY29uZHMgIT09IDAgfHwgdGhpcy5taWxsaXNlY29uZHMgIT09IDApXG4gICAgICBzICs9IFwiVFwiO1xuICAgIGlmICh0aGlzLmhvdXJzICE9PSAwKSBzICs9IHRoaXMuaG91cnMgKyBcIkhcIjtcbiAgICBpZiAodGhpcy5taW51dGVzICE9PSAwKSBzICs9IHRoaXMubWludXRlcyArIFwiTVwiO1xuICAgIGlmICh0aGlzLnNlY29uZHMgIT09IDAgfHwgdGhpcy5taWxsaXNlY29uZHMgIT09IDApXG4gICAgICAvLyB0aGlzIHdpbGwgaGFuZGxlIFwiZmxvYXRpbmcgcG9pbnQgbWFkbmVzc1wiIGJ5IHJlbW92aW5nIGV4dHJhIGRlY2ltYWwgcGxhY2VzXG4gICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81ODgwMDQvaXMtZmxvYXRpbmctcG9pbnQtbWF0aC1icm9rZW5cbiAgICAgIHMgKz0gcm91bmRUbyh0aGlzLnNlY29uZHMgKyB0aGlzLm1pbGxpc2Vjb25kcyAvIDEwMDAsIDMpICsgXCJTXCI7XG4gICAgaWYgKHMgPT09IFwiUFwiKSBzICs9IFwiVDBTXCI7XG4gICAgcmV0dXJuIHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24sIGZvcm1hdHRlZCBhcyBhIHRpbWUgb2YgZGF5LlxuICAgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBudWxsIGlmIHRoZSBkdXJhdGlvbiBpcyBpbnZhbGlkLCBuZWdhdGl2ZSwgb3IgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIDI0IGhvdXJzLlxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI1RpbWVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlUHJlZml4PWZhbHNlXSAtIGluY2x1ZGUgdGhlIGBUYCBwcmVmaXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmZvcm1hdD0nZXh0ZW5kZWQnXSAtIGNob29zZSBiZXR3ZWVuIHRoZSBiYXNpYyBhbmQgZXh0ZW5kZWQgZm9ybWF0XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTEgfSkudG9JU09UaW1lKCkgLy89PiAnMTE6MDA6MDAuMDAwJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSh7IHN1cHByZXNzTWlsbGlzZWNvbmRzOiB0cnVlIH0pIC8vPT4gJzExOjAwOjAwJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSh7IHN1cHByZXNzU2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcxMTowMCdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMSB9KS50b0lTT1RpbWUoeyBpbmNsdWRlUHJlZml4OiB0cnVlIH0pIC8vPT4gJ1QxMTowMDowMC4wMDAnXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTEgfSkudG9JU09UaW1lKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzExMDAwMC4wMDAnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSVNPVGltZShvcHRzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBtaWxsaXMgPSB0aGlzLnRvTWlsbGlzKCk7XG4gICAgaWYgKG1pbGxpcyA8IDAgfHwgbWlsbGlzID49IDg2NDAwMDAwKSByZXR1cm4gbnVsbDtcblxuICAgIG9wdHMgPSB7XG4gICAgICBzdXBwcmVzc01pbGxpc2Vjb25kczogZmFsc2UsXG4gICAgICBzdXBwcmVzc1NlY29uZHM6IGZhbHNlLFxuICAgICAgaW5jbHVkZVByZWZpeDogZmFsc2UsXG4gICAgICBmb3JtYXQ6IFwiZXh0ZW5kZWRcIixcbiAgICAgIC4uLm9wdHMsXG4gICAgfTtcblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zaGlmdFRvKFwiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiLCBcIm1pbGxpc2Vjb25kc1wiKTtcblxuICAgIGxldCBmbXQgPSBvcHRzLmZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJoaG1tXCIgOiBcImhoOm1tXCI7XG5cbiAgICBpZiAoIW9wdHMuc3VwcHJlc3NTZWNvbmRzIHx8IHZhbHVlLnNlY29uZHMgIT09IDAgfHwgdmFsdWUubWlsbGlzZWNvbmRzICE9PSAwKSB7XG4gICAgICBmbXQgKz0gb3B0cy5mb3JtYXQgPT09IFwiYmFzaWNcIiA/IFwic3NcIiA6IFwiOnNzXCI7XG4gICAgICBpZiAoIW9wdHMuc3VwcHJlc3NNaWxsaXNlY29uZHMgfHwgdmFsdWUubWlsbGlzZWNvbmRzICE9PSAwKSB7XG4gICAgICAgIGZtdCArPSBcIi5TU1NcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3RyID0gdmFsdWUudG9Gb3JtYXQoZm10KTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVQcmVmaXgpIHtcbiAgICAgIHN0ciA9IFwiVFwiICsgc3RyO1xuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gZGVidWdnaW5nLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gbWlsbGlzZWNvbmRzIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24uXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHRvTWlsbGlzKCkge1xuICAgIHJldHVybiB0aGlzLmFzKFwibWlsbGlzZWNvbmRzXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gbWlsbGlzZWNvbmRzIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24uIEFsaWFzIG9mIHtAbGluayB0b01pbGxpc31cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy50b01pbGxpcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgdGhpcyBEdXJhdGlvbiBsb25nZXIgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBhZGQuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgcGx1cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pLFxuICAgICAgcmVzdWx0ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGsgb2Ygb3JkZXJlZFVuaXRzKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkoZHVyLnZhbHVlcywgaykgfHwgaGFzT3duUHJvcGVydHkodGhpcy52YWx1ZXMsIGspKSB7XG4gICAgICAgIHJlc3VsdFtrXSA9IGR1ci5nZXQoaykgKyB0aGlzLmdldChrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IHJlc3VsdCB9LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gc2hvcnRlciBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIHN1YnRyYWN0LiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIG1pbnVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgY29uc3QgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIHRoaXMucGx1cyhkdXIubmVnYXRlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlIHRoaXMgRHVyYXRpb24gYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIHVuaXQuIEFyaXR5IGlzIDEgb3IgMjogdGhlIHZhbHVlIG9mIHRoZSB1bml0IGFuZCwgb3B0aW9uYWxseSwgdGhlIHVuaXQgbmFtZS4gTXVzdCByZXR1cm4gYSBudW1iZXIuXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgbWludXRlczogMzAgfSkubWFwVW5pdHMoeCA9PiB4ICogMikgLy89PiB7IGhvdXJzOiAyLCBtaW51dGVzOiA2MCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgbWludXRlczogMzAgfSkubWFwVW5pdHMoKHgsIHUpID0+IHUgPT09IFwiaG91clwiID8geCAqIDIgOiB4KSAvLz0+IHsgaG91cnM6IDIsIG1pbnV0ZXM6IDMwIH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBtYXBVbml0cyhmbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZXMpKSB7XG4gICAgICByZXN1bHRba10gPSBhc051bWJlcihmbih0aGlzLnZhbHVlc1trXSwgaykpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IHJlc3VsdCB9LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5nZXQoJ3llYXJzJykgLy89PiAyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZ2V0KCdtb250aHMnKSAvLz0+IDBcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5nZXQoJ2RheXMnKSAvLz0+IDNcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0KHVuaXQpIHtcbiAgICByZXR1cm4gdGhpc1tEdXJhdGlvbi5ub3JtYWxpemVVbml0KHVuaXQpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIGEgbWFwcGluZyBvZiB1bml0cyB0byBudW1iZXJzXG4gICAqIEBleGFtcGxlIGR1ci5zZXQoeyB5ZWFyczogMjAxNyB9KVxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgaG91cnM6IDgsIG1pbnV0ZXM6IDMwIH0pXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgc2V0KHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IG1peGVkID0geyAuLi50aGlzLnZhbHVlcywgLi4ubm9ybWFsaXplT2JqZWN0KHZhbHVlcywgRHVyYXRpb24ubm9ybWFsaXplVW5pdCkgfTtcbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IG1peGVkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZSBhbmQvb3IgbnVtYmVyaW5nU3lzdGVtLiAgUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxuICAgKiBAZXhhbXBsZSBkdXIucmVjb25maWd1cmUoeyBsb2NhbGU6ICdlbi1HQicgfSlcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICByZWNvbmZpZ3VyZSh7IGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBjb252ZXJzaW9uQWNjdXJhY3kgfSA9IHt9KSB7XG4gICAgY29uc3QgbG9jID0gdGhpcy5sb2MuY2xvbmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSB9KSxcbiAgICAgIG9wdHMgPSB7IGxvYyB9O1xuXG4gICAgaWYgKGNvbnZlcnNpb25BY2N1cmFjeSkge1xuICAgICAgb3B0cy5jb252ZXJzaW9uQWNjdXJhY3kgPSBjb252ZXJzaW9uQWNjdXJhY3k7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBkdXJhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZXMnIG9yICdkYXlzJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHt5ZWFyczogMX0pLmFzKCdkYXlzJykgLy89PiAzNjVcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnbW9udGhzJykgLy89PiAxMlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtob3VyczogNjB9KS5hcygnZGF5cycpIC8vPT4gMi41XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGFzKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zaGlmdFRvKHVuaXQpLmdldCh1bml0KSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWR1Y2UgdGhpcyBEdXJhdGlvbiB0byBpdHMgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGluIGl0cyBjdXJyZW50IHVuaXRzLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDIsIGRheXM6IDUwMDAgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDE1LCBkYXlzOiAyNTUgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEyLCBtaW51dGVzOiAtNDUgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAxNSB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgbm9ybWFsaXplKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCB2YWxzID0gdGhpcy50b09iamVjdCgpO1xuICAgIG5vcm1hbGl6ZVZhbHVlcyh0aGlzLm1hdHJpeCwgdmFscyk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiB2YWxzIH0sIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhpcyBEdXJhdGlvbiBpbnRvIGl0cyByZXByZXNlbnRhdGlvbiBpbiBhIGRpZmZlcmVudCBzZXQgb2YgdW5pdHMuXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgc2Vjb25kczogMzAgfSkuc2hpZnRUbygnbWludXRlcycsICdtaWxsaXNlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBtaW51dGVzOiA2MCwgbWlsbGlzZWNvbmRzOiAzMDAwMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgc2hpZnRUbyguLi51bml0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGlmICh1bml0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHVuaXRzID0gdW5pdHMubWFwKCh1KSA9PiBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHUpKTtcblxuICAgIGNvbnN0IGJ1aWx0ID0ge30sXG4gICAgICBhY2N1bXVsYXRlZCA9IHt9LFxuICAgICAgdmFscyA9IHRoaXMudG9PYmplY3QoKTtcbiAgICBsZXQgbGFzdFVuaXQ7XG5cbiAgICBmb3IgKGNvbnN0IGsgb2Ygb3JkZXJlZFVuaXRzKSB7XG4gICAgICBpZiAodW5pdHMuaW5kZXhPZihrKSA+PSAwKSB7XG4gICAgICAgIGxhc3RVbml0ID0gaztcblxuICAgICAgICBsZXQgb3duID0gMDtcblxuICAgICAgICAvLyBhbnl0aGluZyB3ZSBoYXZlbid0IGJvaWxlZCBkb3duIHlldCBzaG91bGQgZ2V0IGJvaWxlZCB0byB0aGlzIHVuaXRcbiAgICAgICAgZm9yIChjb25zdCBhayBpbiBhY2N1bXVsYXRlZCkge1xuICAgICAgICAgIG93biArPSB0aGlzLm1hdHJpeFtha11ba10gKiBhY2N1bXVsYXRlZFtha107XG4gICAgICAgICAgYWNjdW11bGF0ZWRbYWtdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBsdXMgYW55dGhpbmcgdGhhdCdzIGFscmVhZHkgaW4gdGhpcyB1bml0XG4gICAgICAgIGlmIChpc051bWJlcih2YWxzW2tdKSkge1xuICAgICAgICAgIG93biArPSB2YWxzW2tdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaSA9IE1hdGgudHJ1bmMob3duKTtcbiAgICAgICAgYnVpbHRba10gPSBpO1xuICAgICAgICBhY2N1bXVsYXRlZFtrXSA9IG93biAtIGk7IC8vIHdlJ2QgbGlrZSB0byBhYnNvcmIgdGhlc2UgZnJhY3Rpb25zIGluIGFub3RoZXIgdW5pdFxuXG4gICAgICAgIC8vIHBsdXMgYW55dGhpbmcgZnVydGhlciBkb3duIHRoZSBjaGFpbiB0aGF0IHNob3VsZCBiZSByb2xsZWQgdXAgaW4gdG8gdGhpc1xuICAgICAgICBmb3IgKGNvbnN0IGRvd24gaW4gdmFscykge1xuICAgICAgICAgIGlmIChvcmRlcmVkVW5pdHMuaW5kZXhPZihkb3duKSA+IG9yZGVyZWRVbml0cy5pbmRleE9mKGspKSB7XG4gICAgICAgICAgICBjb252ZXJ0KHRoaXMubWF0cml4LCB2YWxzLCBkb3duLCBidWlsdCwgayk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG90aGVyd2lzZSwga2VlcCBpdCBpbiB0aGUgd2luZ3MgdG8gYm9pbCBpdCBsYXRlclxuICAgICAgfSBlbHNlIGlmIChpc051bWJlcih2YWxzW2tdKSkge1xuICAgICAgICBhY2N1bXVsYXRlZFtrXSA9IHZhbHNba107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYW55dGhpbmcgbGVmdG92ZXIgYmVjb21lcyB0aGUgZGVjaW1hbCBmb3IgdGhlIGxhc3QgdW5pdFxuICAgIC8vIGxhc3RVbml0IG11c3QgYmUgZGVmaW5lZCBzaW5jZSB1bml0cyBpcyBub3QgZW1wdHlcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhY2N1bXVsYXRlZCkge1xuICAgICAgaWYgKGFjY3VtdWxhdGVkW2tleV0gIT09IDApIHtcbiAgICAgICAgYnVpbHRbbGFzdFVuaXRdICs9XG4gICAgICAgICAga2V5ID09PSBsYXN0VW5pdCA/IGFjY3VtdWxhdGVkW2tleV0gOiBhY2N1bXVsYXRlZFtrZXldIC8gdGhpcy5tYXRyaXhbbGFzdFVuaXRdW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBidWlsdCB9LCB0cnVlKS5ub3JtYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5lZ2F0aXZlIG9mIHRoaXMgRHVyYXRpb24uXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgc2Vjb25kczogMzAgfSkubmVnYXRlKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IC0xLCBzZWNvbmRzOiAtMzAgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIG5lZ2F0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgbmVnYXRlZCA9IHt9O1xuICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykpIHtcbiAgICAgIG5lZ2F0ZWRba10gPSAtdGhpcy52YWx1ZXNba107XG4gICAgfVxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHZhbHVlczogbmVnYXRlZCB9LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHllYXJzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHllYXJzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy55ZWFycyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcXVhcnRlcnMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgcXVhcnRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnF1YXJ0ZXJzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtb250aHMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbW9udGhzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5tb250aHMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdlZWtzXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgd2Vla3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLndlZWtzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkYXlzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGRheXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmRheXMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGhvdXJzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGhvdXJzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5ob3VycyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWludXRlcy5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtaW51dGVzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taW51dGVzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzZWNvbmRzLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgc2Vjb25kcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuc2Vjb25kcyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWlsbGlzZWNvbmRzLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbWlsbGlzZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taWxsaXNlY29uZHMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIER1cmF0aW9uIGlzIGludmFsaWQuIEludmFsaWQgZHVyYXRpb25zIGFyZSByZXR1cm5lZCBieSBkaWZmIG9wZXJhdGlvbnNcbiAgICogb24gaW52YWxpZCBEYXRlVGltZXMgb3IgSW50ZXJ2YWxzLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA9PT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgaWYgdGhpcyBEdXJhdGlvbiBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRHVyYXRpb24gaXMgdmFsaWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGludmFsaWRSZWFzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5yZWFzb24gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgRHVyYXRpb24gYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIER1cmF0aW9uIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZEV4cGxhbmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQuZXhwbGFuYXRpb24gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEVxdWFsaXR5IGNoZWNrXG4gICAqIFR3byBEdXJhdGlvbnMgYXJlIGVxdWFsIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgdW5pdHMgYW5kIHRoZSBzYW1lIHZhbHVlcyBmb3IgZWFjaCB1bml0LlxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufSBvdGhlclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubG9jLmVxdWFscyhvdGhlci5sb2MpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXEodjEsIHYyKSB7XG4gICAgICAvLyBDb25zaWRlciAwIGFuZCB1bmRlZmluZWQgYXMgZXF1YWxcbiAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkIHx8IHYxID09PSAwKSByZXR1cm4gdjIgPT09IHVuZGVmaW5lZCB8fCB2MiA9PT0gMDtcbiAgICAgIHJldHVybiB2MSA9PT0gdjI7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB1IG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKCFlcSh0aGlzLnZhbHVlc1t1XSwgb3RoZXIudmFsdWVzW3VdKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb25pc2gpIHtcbiAgaWYgKGlzTnVtYmVyKGR1cmF0aW9uaXNoKSkge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tTWlsbGlzKGR1cmF0aW9uaXNoKTtcbiAgfSBlbHNlIGlmIChEdXJhdGlvbi5pc0R1cmF0aW9uKGR1cmF0aW9uaXNoKSkge1xuICAgIHJldHVybiBkdXJhdGlvbmlzaDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZHVyYXRpb25pc2ggPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChkdXJhdGlvbmlzaCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYFVua25vd24gZHVyYXRpb24gYXJndW1lbnQgJHtkdXJhdGlvbmlzaH0gb2YgdHlwZSAke3R5cGVvZiBkdXJhdGlvbmlzaH1gXG4gICAgKTtcbiAgfVxufVxuIiwgImltcG9ydCBEYXRlVGltZSwgeyBmcmllbmRseURhdGVUaW1lIH0gZnJvbSBcIi4vZGF0ZXRpbWUuanNcIjtcbmltcG9ydCBEdXJhdGlvbiwgeyBmcmllbmRseUR1cmF0aW9uIH0gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIEludmFsaWRJbnRlcnZhbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgSW52YWxpZCBmcm9tIFwiLi9pbXBsL2ludmFsaWQuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBJbnRlcnZhbFwiO1xuXG4vLyBjaGVja3MgaWYgdGhlIHN0YXJ0IGlzIGVxdWFsIHRvIG9yIGJlZm9yZSB0aGUgZW5kXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCB8fCAhc3RhcnQuaXNWYWxpZCkge1xuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKFwibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0XCIpO1xuICB9IGVsc2UgaWYgKCFlbmQgfHwgIWVuZC5pc1ZhbGlkKSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXCJtaXNzaW5nIG9yIGludmFsaWQgZW5kXCIpO1xuICB9IGVsc2UgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXG4gICAgICBcImVuZCBiZWZvcmUgc3RhcnRcIixcbiAgICAgIGBUaGUgZW5kIG9mIGFuIGludGVydmFsIG11c3QgYmUgYWZ0ZXIgaXRzIHN0YXJ0LCBidXQgeW91IGhhZCBzdGFydD0ke3N0YXJ0LnRvSVNPKCl9IGFuZCBlbmQ9JHtlbmQudG9JU08oKX1gXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEFuIEludGVydmFsIG9iamVjdCByZXByZXNlbnRzIGEgaGFsZi1vcGVuIGludGVydmFsIG9mIHRpbWUsIHdoZXJlIGVhY2ggZW5kcG9pbnQgaXMgYSB7QGxpbmsgRGF0ZVRpbWV9LiBDb25jZXB0dWFsbHksIGl0J3MgYSBjb250YWluZXIgZm9yIHRob3NlIHR3byBlbmRwb2ludHMsIGFjY29tcGFuaWVkIGJ5IG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCBjb21wYXJpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cbiAqXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBtZXRob2RzIGFuZCBnZXR0ZXJzIGluIEludGVydmFsOlxuICpcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhbiBJbnRlcnZhbCwgdXNlIHtAbGluayBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzfSwge0BsaW5rIEludGVydmFsLmFmdGVyfSwge0BsaW5rIEludGVydmFsLmJlZm9yZX0sIG9yIHtAbGluayBJbnRlcnZhbC5mcm9tSVNPfS5cbiAqICogKipBY2Nlc3NvcnMqKiBVc2Uge0BsaW5rIEludGVydmFsI3N0YXJ0fSBhbmQge0BsaW5rIEludGVydmFsI2VuZH0gdG8gZ2V0IHRoZSBzdGFydCBhbmQgZW5kLlxuICogKiAqKkludGVycm9nYXRpb24qKiBUbyBhbmFseXplIHRoZSBJbnRlcnZhbCwgdXNlIHtAbGluayBJbnRlcnZhbCNjb3VudH0sIHtAbGluayBJbnRlcnZhbCNsZW5ndGh9LCB7QGxpbmsgSW50ZXJ2YWwjaGFzU2FtZX0sIHtAbGluayBJbnRlcnZhbCNjb250YWluc30sIHtAbGluayBJbnRlcnZhbCNpc0FmdGVyfSwgb3Ige0BsaW5rIEludGVydmFsI2lzQmVmb3JlfS5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBvdGhlciBJbnRlcnZhbHMgb3V0IG9mIHRoaXMgb25lLCB1c2Uge0BsaW5rIEludGVydmFsI3NldH0sIHtAbGluayBJbnRlcnZhbCNzcGxpdEF0fSwge0BsaW5rIEludGVydmFsI3NwbGl0Qnl9LCB7QGxpbmsgSW50ZXJ2YWwjZGl2aWRlRXF1YWxseX0sIHtAbGluayBJbnRlcnZhbCNtZXJnZX0sIHtAbGluayBJbnRlcnZhbCN4b3J9LCB7QGxpbmsgSW50ZXJ2YWwjdW5pb259LCB7QGxpbmsgSW50ZXJ2YWwjaW50ZXJzZWN0aW9ufSwgb3Ige0BsaW5rIEludGVydmFsI2RpZmZlcmVuY2V9LlxuICogKiAqKkNvbXBhcmlzb24qKiBUbyBjb21wYXJlIHRoaXMgSW50ZXJ2YWwgdG8gYW5vdGhlciBvbmUsIHVzZSB7QGxpbmsgSW50ZXJ2YWwjZXF1YWxzfSwge0BsaW5rIEludGVydmFsI292ZXJsYXBzfSwge0BsaW5rIEludGVydmFsI2FidXRzU3RhcnR9LCB7QGxpbmsgSW50ZXJ2YWwjYWJ1dHNFbmR9LCB7QGxpbmsgSW50ZXJ2YWwjZW5ndWxmc31cbiAqICogKipPdXRwdXQqKiBUbyBjb252ZXJ0IHRoZSBJbnRlcnZhbCBpbnRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgc2VlIHtAbGluayBJbnRlcnZhbCN0b1N0cmluZ30sIHtAbGluayBJbnRlcnZhbCN0b0lTT30sIHtAbGluayBJbnRlcnZhbCN0b0lTT0RhdGV9LCB7QGxpbmsgSW50ZXJ2YWwjdG9JU09UaW1lfSwge0BsaW5rIEludGVydmFsI3RvRm9ybWF0fSwgYW5kIHtAbGluayBJbnRlcnZhbCN0b0R1cmF0aW9ufS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW50ZXJ2YWwge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMucyA9IGNvbmZpZy5zdGFydDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmUgPSBjb25maWcuZW5kO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW52YWxpZCA9IGNvbmZpZy5pbnZhbGlkIHx8IG51bGw7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pc0x1eG9uSW50ZXJ2YWwgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBJbnRlcnZhbCBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICBzdGF0aWMgaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uID0gbnVsbCkge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIEludGVydmFsIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRJbnRlcnZhbEVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEludGVydmFsKHsgaW52YWxpZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYW4gZW5kIERhdGVUaW1lLiBJbmNsdXNpdmUgb2YgdGhlIHN0YXJ0IGJ1dCBub3QgdGhlIGVuZC5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgc3RhdGljIGZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IGJ1aWx0U3RhcnQgPSBmcmllbmRseURhdGVUaW1lKHN0YXJ0KSxcbiAgICAgIGJ1aWx0RW5kID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuXG4gICAgY29uc3QgdmFsaWRhdGVFcnJvciA9IHZhbGlkYXRlU3RhcnRFbmQoYnVpbHRTdGFydCwgYnVpbHRFbmQpO1xuXG4gICAgaWYgKHZhbGlkYXRlRXJyb3IgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh7XG4gICAgICAgIHN0YXJ0OiBidWlsdFN0YXJ0LFxuICAgICAgICBlbmQ6IGJ1aWx0RW5kLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWxpZGF0ZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhIHN0YXJ0IERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCB0by5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHN0YXRpYyBhZnRlcihzdGFydCwgZHVyYXRpb24pIHtcbiAgICBjb25zdCBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKSxcbiAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQsIGR0LnBsdXMoZHVyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gZW5kIERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCBiYWNrd2FyZHMgdG8uXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IGVuZFxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gdGhlIGxlbmd0aCBvZiB0aGUgSW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgc3RhdGljIGJlZm9yZShlbmQsIGR1cmF0aW9uKSB7XG4gICAgY29uc3QgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICBkdCA9IGZyaWVuZGx5RGF0ZVRpbWUoZW5kKTtcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdC5taW51cyhkdXIpLCBkdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nLlxuICAgKiBBY2NlcHRzIGA8c3RhcnQ+LzxlbmQ+YCwgYDxzdGFydD4vPGR1cmF0aW9uPmAsIGFuZCBgPGR1cmF0aW9uPi88ZW5kPmAgZm9ybWF0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSVNPIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gb3B0aW9ucyB0byBwYXNzIHtAbGluayBEYXRlVGltZS5mcm9tSVNPfSBhbmQgb3B0aW9uYWxseSB7QGxpbmsgRHVyYXRpb24uZnJvbUlTT31cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lX2ludGVydmFsc1xuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcywgZV0gPSAodGV4dCB8fCBcIlwiKS5zcGxpdChcIi9cIiwgMik7XG4gICAgaWYgKHMgJiYgZSkge1xuICAgICAgbGV0IHN0YXJ0LCBzdGFydElzVmFsaWQ7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFydCA9IERhdGVUaW1lLmZyb21JU08ocywgb3B0cyk7XG4gICAgICAgIHN0YXJ0SXNWYWxpZCA9IHN0YXJ0LmlzVmFsaWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHN0YXJ0SXNWYWxpZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgZW5kLCBlbmRJc1ZhbGlkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5kID0gRGF0ZVRpbWUuZnJvbUlTTyhlLCBvcHRzKTtcbiAgICAgICAgZW5kSXNWYWxpZCA9IGVuZC5pc1ZhbGlkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlbmRJc1ZhbGlkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydElzVmFsaWQgJiYgZW5kSXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCwgZW5kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0SXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKGUsIG9wdHMpO1xuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYWZ0ZXIoc3RhcnQsIGR1cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZW5kSXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKHMsIG9wdHMpO1xuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYmVmb3JlKGVuZCwgZHVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYW4gSW50ZXJ2YWwuIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0ludGVydmFsKG8pIHtcbiAgICByZXR1cm4gKG8gJiYgby5pc0x1eG9uSW50ZXJ2YWwpIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YXJ0IG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgc3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMucyA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZW5kIG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgZW5kKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmUgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGF0IGxlYXN0IGl0cyBzdGFydCwgbWVhbmluZyB0aGF0IHRoZSBJbnRlcnZhbCBpc24ndCAnYmFja3dhcmRzJy5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkUmVhc29uID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIEludGVydmFsIGlzIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIEludGVydmFsIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBJbnRlcnZhbCBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgSW50ZXJ2YWwgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbCBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIHJldHVybiB0aGUgbGVuZ3RoIGluLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBsZW5ndGgodW5pdCA9IFwibWlsbGlzZWNvbmRzXCIpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0R1cmF0aW9uKC4uLlt1bml0XSkuZ2V0KHVuaXQpIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvdW50IG9mIG1pbnV0ZXMsIGhvdXJzLCBkYXlzLCBtb250aHMsIG9yIHllYXJzIGluY2x1ZGVkIGluIHRoZSBJbnRlcnZhbCwgZXZlbiBpbiBwYXJ0LlxuICAgKiBVbmxpa2Uge0BsaW5rIEludGVydmFsI2xlbmd0aH0gdGhpcyBjb3VudHMgc2VjdGlvbnMgb2YgdGhlIGNhbGVuZGFyLCBub3QgcGVyaW9kcyBvZiB0aW1lLCBlLmcuIHNwZWNpZnlpbmcgJ2RheSdcbiAgICogYXNrcyAnd2hhdCBkYXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBpbnRlcnZhbD8nLCBub3QgJ2hvdyBtYW55IGRheXMgbG9uZyBpcyB0aGlzIGludGVydmFsPydcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt1bml0PSdtaWxsaXNlY29uZHMnXSAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGNvdW50KHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBOYU47XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXJ0LnN0YXJ0T2YodW5pdCksXG4gICAgICBlbmQgPSB0aGlzLmVuZC5zdGFydE9mKHVuaXQpO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGVuZC5kaWZmKHN0YXJ0LCB1bml0KS5nZXQodW5pdCkpICsgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGFuZCBlbmQgYXJlIGJvdGggaW4gdGhlIHNhbWUgdW5pdCBvZiB0aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzU2FtZSh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuaXNFbXB0eSgpIHx8IHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucywgdW5pdCkgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGhhcyB0aGUgc2FtZSBzdGFydCBhbmQgZW5kIERhdGVUaW1lcy5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucy52YWx1ZU9mKCkgPT09IHRoaXMuZS52YWx1ZU9mKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc0FmdGVyKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zID4gZGF0ZVRpbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQmVmb3JlKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5lIDw9IGRhdGVUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGNvbnRhaW5zKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IGRhdGVUaW1lICYmIHRoaXMuZSA+IGRhdGVUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0c1wiIHRoZSBzdGFydCBhbmQvb3IgZW5kIGRhdGVzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSB0aGUgdmFsdWVzIHRvIHNldFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuc3RhcnQgLSB0aGUgc3RhcnRpbmcgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gdmFsdWVzLmVuZCAtIHRoZSBlbmRpbmcgRGF0ZVRpbWVcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICBzZXQoeyBzdGFydCwgZW5kIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCB8fCB0aGlzLnMsIGVuZCB8fCB0aGlzLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgYXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIERhdGVUaW1lc1xuICAgKiBAcGFyYW0gey4uLkRhdGVUaW1lfSBkYXRlVGltZXMgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNvdW50LlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHNwbGl0QXQoLi4uZGF0ZVRpbWVzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBbXTtcbiAgICBjb25zdCBzb3J0ZWQgPSBkYXRlVGltZXNcbiAgICAgICAgLm1hcChmcmllbmRseURhdGVUaW1lKVxuICAgICAgICAuZmlsdGVyKChkKSA9PiB0aGlzLmNvbnRhaW5zKGQpKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgcmVzdWx0cyA9IFtdO1xuICAgIGxldCB7IHMgfSA9IHRoaXMsXG4gICAgICBpID0gMDtcblxuICAgIHdoaWxlIChzIDwgdGhpcy5lKSB7XG4gICAgICBjb25zdCBhZGRlZCA9IHNvcnRlZFtpXSB8fCB0aGlzLmUsXG4gICAgICAgIG5leHQgPSArYWRkZWQgPiArdGhpcy5lID8gdGhpcy5lIDogYWRkZWQ7XG4gICAgICByZXN1bHRzLnB1c2goSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBuZXh0KSk7XG4gICAgICBzID0gbmV4dDtcbiAgICAgIGkgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gc21hbGxlciBJbnRlcnZhbHMsIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBsZW5ndGguXG4gICAqIExlZnQgb3ZlciB0aW1lIGlzIGdyb3VwZWQgaW50byBhIHNtYWxsZXIgaW50ZXJ2YWxcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3BsaXRCeShkdXJhdGlvbikge1xuICAgIGNvbnN0IGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIWR1ci5pc1ZhbGlkIHx8IGR1ci5hcyhcIm1pbGxpc2Vjb25kc1wiKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGxldCB7IHMgfSA9IHRoaXMsXG4gICAgICBpZHggPSAxLFxuICAgICAgbmV4dDtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgY29uc3QgYWRkZWQgPSB0aGlzLnN0YXJ0LnBsdXMoZHVyLm1hcFVuaXRzKCh4KSA9PiB4ICogaWR4KSk7XG4gICAgICBuZXh0ID0gK2FkZGVkID4gK3RoaXMuZSA/IHRoaXMuZSA6IGFkZGVkO1xuICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMocywgbmV4dCkpO1xuICAgICAgcyA9IG5leHQ7XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc21hbGxlciBpbnRlcnZhbHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZlBhcnRzIC0gVGhlIG51bWJlciBvZiBJbnRlcnZhbHMgdG8gZGl2aWRlIHRoZSBJbnRlcnZhbCBpbnRvLlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIGRpdmlkZUVxdWFsbHkobnVtYmVyT2ZQYXJ0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpIC8gbnVtYmVyT2ZQYXJ0cykuc2xpY2UoMCwgbnVtYmVyT2ZQYXJ0cyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBvdmVybGFwcyB3aXRoIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIG92ZXJsYXBzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZSA+IG90aGVyLnMgJiYgdGhpcy5zIDwgb3RoZXIuZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGFkamFjZW50IHRvIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwncyBzdGFydC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGFidXRzU3RhcnQob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiArdGhpcy5lID09PSArb3RoZXIucztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIGVuZC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGFidXRzRW5kKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gK290aGVyLmUgPT09ICt0aGlzLnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBlbmd1bGZzIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlbmd1bGZzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IG90aGVyLnMgJiYgdGhpcy5lID49IG90aGVyLmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zLmVxdWFscyhvdGhlci5zKSAmJiB0aGlzLmUuZXF1YWxzKG90aGVyLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIEludGVydmFsIGFuZCB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtYXhpbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtaW5pbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSwgbWVhbmluZywgdGhlIGludGVydmFscyBkb24ndCBpbnRlcnNlY3QuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgaW50ZXJzZWN0aW9uKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IHMgPSB0aGlzLnMgPiBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgIGUgPSB0aGlzLmUgPCBvdGhlci5lID8gdGhpcy5lIDogb3RoZXIuZTtcblxuICAgIGlmIChzID49IGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWluaW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWF4aW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICB1bmlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBzID0gdGhpcy5zIDwgb3RoZXIucyA/IHRoaXMucyA6IG90aGVyLnMsXG4gICAgICBlID0gdGhpcy5lID4gb3RoZXIuZSA/IHRoaXMuZSA6IG90aGVyLmU7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgYW4gYXJyYXkgb2YgSW50ZXJ2YWxzIGludG8gYSBlcXVpdmFsZW50IG1pbmltYWwgc2V0IG9mIEludGVydmFscy5cbiAgICogQ29tYmluZXMgb3ZlcmxhcHBpbmcgYW5kIGFkamFjZW50IEludGVydmFscy5cbiAgICogQHBhcmFtIHtBcnJheX0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3RhdGljIG1lcmdlKGludGVydmFscykge1xuICAgIGNvbnN0IFtmb3VuZCwgZmluYWxdID0gaW50ZXJ2YWxzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5zIC0gYi5zKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKFtzb2ZhciwgY3VycmVudF0sIGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbc29mYXIsIGl0ZW1dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5vdmVybGFwcyhpdGVtKSB8fCBjdXJyZW50LmFidXRzU3RhcnQoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbc29mYXIsIGN1cnJlbnQudW5pb24oaXRlbSldO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3NvZmFyLmNvbmNhdChbY3VycmVudF0pLCBpdGVtXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtbXSwgbnVsbF1cbiAgICAgICk7XG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxuICAgKiBAcGFyYW0ge0FycmF5fSBpbnRlcnZhbHNcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgeG9yKGludGVydmFscykge1xuICAgIGxldCBzdGFydCA9IG51bGwsXG4gICAgICBjdXJyZW50Q291bnQgPSAwO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXSxcbiAgICAgIGVuZHMgPSBpbnRlcnZhbHMubWFwKChpKSA9PiBbXG4gICAgICAgIHsgdGltZTogaS5zLCB0eXBlOiBcInNcIiB9LFxuICAgICAgICB7IHRpbWU6IGkuZSwgdHlwZTogXCJlXCIgfSxcbiAgICAgIF0pLFxuICAgICAgZmxhdHRlbmVkID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi5lbmRzKSxcbiAgICAgIGFyciA9IGZsYXR0ZW5lZC5zb3J0KChhLCBiKSA9PiBhLnRpbWUgLSBiLnRpbWUpO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIGFycikge1xuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gXCJzXCIgPyAxIDogLTE7XG5cbiAgICAgIGlmIChjdXJyZW50Q291bnQgPT09IDEpIHtcbiAgICAgICAgc3RhcnQgPSBpLnRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnQgJiYgK3N0YXJ0ICE9PSAraS50aW1lKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGkudGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5tZXJnZShyZXN1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgcmVwcmVzZW50aW5nIHRoZSBzcGFuIG9mIHRpbWUgaW4gdGhpcyBJbnRlcnZhbCB0aGF0IGRvZXNuJ3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgc3BlY2lmaWVkIEludGVydmFscy5cbiAgICogQHBhcmFtIHsuLi5JbnRlcnZhbH0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgZGlmZmVyZW5jZSguLi5pbnRlcnZhbHMpIHtcbiAgICByZXR1cm4gSW50ZXJ2YWwueG9yKFt0aGlzXS5jb25jYXQoaW50ZXJ2YWxzKSlcbiAgICAgIC5tYXAoKGkpID0+IHRoaXMuaW50ZXJzZWN0aW9uKGkpKVxuICAgICAgLmZpbHRlcigoaSkgPT4gaSAmJiAhaS5pc0VtcHR5KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGBbJHt0aGlzLnMudG9JU08oKX0gXHUyMDEzICR7dGhpcy5lLnRvSVNPKCl9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZSN0b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU08ob3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRDtcbiAgICByZXR1cm4gYCR7dGhpcy5zLnRvSVNPKG9wdHMpfS8ke3RoaXMuZS50b0lTTyhvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBkYXRlIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSB0aW1lIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09EYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRDtcbiAgICByZXR1cm4gYCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aW1lIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSBkYXRlIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZS50b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09UaW1lKG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0lTT1RpbWUob3B0cyl9LyR7dGhpcy5lLnRvSVNPVGltZShvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGVGb3JtYXQgLSB0aGUgZm9ybWF0IHN0cmluZy4gVGhpcyBzdHJpbmcgZm9ybWF0cyB0aGUgc3RhcnQgYW5kIGVuZCB0aW1lLiBTZWUge0BsaW5rIERhdGVUaW1lLnRvRm9ybWF0fSBmb3IgZGV0YWlscy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5zZXBhcmF0b3IgPSAgJyBcdTIwMTMgJ10gLSBhIHNlcGFyYXRvciB0byBwbGFjZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHJlcHJlc2VudGF0aW9uc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChkYXRlRm9ybWF0LCB7IHNlcGFyYXRvciA9IFwiIFx1MjAxMyBcIiB9ID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KX0ke3NlcGFyYXRvcn0ke3RoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIER1cmF0aW9uIHJlcHJlc2VudGluZyB0aGUgdGltZSBzcGFubmVkIGJ5IHRoaXMgaW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDg4NDg5MjU3IH1cbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignZGF5cycpLnRvT2JqZWN0KCkgLy89PiB7IGRheXM6IDEuMDI0MTgxMjE1Mjc3Nzc3OCB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oWydob3VycycsICdtaW51dGVzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQuODIwOTUgfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQsIHNlY29uZHM6IDQ5LjI1NyB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oJ3NlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBzZWNvbmRzOiA4ODQ4OS4yNTcgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHRvRHVyYXRpb24odW5pdCwgb3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWRSZWFzb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lLmRpZmYodGhpcy5zLCB1bml0LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gbWFwRm4gb24gdGhlIGludGVydmFsIHN0YXJ0IGFuZCBlbmQsIHJldHVybmluZyBhIG5ldyBJbnRlcnZhbCBmcm9tIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1hcEZuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS5tYXBFbmRwb2ludHMoZW5kcG9pbnQgPT4gZW5kcG9pbnQudG9VVEMoKSlcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikubWFwRW5kcG9pbnRzKGVuZHBvaW50ID0+IGVuZHBvaW50LnBsdXMoeyBob3VyczogMiB9KSlcbiAgICovXG4gIG1hcEVuZHBvaW50cyhtYXBGbikge1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKG1hcEZuKHRoaXMucyksIG1hcEZuKHRoaXMuZSkpO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcIi4vaW1wbC9sb2NhbGUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcblxuaW1wb3J0IHsgaGFzUmVsYXRpdmUgfSBmcm9tIFwiLi9pbXBsL3V0aWwuanNcIjtcblxuLyoqXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmZvIHtcbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBjb250YWlucyBhIERTVC5cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBab25lIHRvIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnQncyBsb2NhbCB6b25lLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGhhc0RTVCh6b25lID0gU2V0dGluZ3MuZGVmYXVsdFpvbmUpIHtcbiAgICBjb25zdCBwcm90byA9IERhdGVUaW1lLm5vdygpLnNldFpvbmUoem9uZSkuc2V0KHsgbW9udGg6IDEyIH0pO1xuXG4gICAgcmV0dXJuICF6b25lLmlzVW5pdmVyc2FsICYmIHByb3RvLm9mZnNldCAhPT0gcHJvdG8uc2V0KHsgbW9udGg6IDYgfSkub2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBpcyBhIHZhbGlkIElBTkEgc3BlY2lmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gem9uZSAtIFpvbmUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc1ZhbGlkSUFOQVpvbmUoem9uZSkge1xuICAgIHJldHVybiBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKHpvbmUpICYmIElBTkFab25lLmlzVmFsaWRab25lKHpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBpbnB1dCBpbnRvIGEge0BsaW5rIFpvbmV9IGluc3RhbmNlLlxuICAgKlxuICAgKiAqIElmIGBpbnB1dGAgaXMgYWxyZWFkeSBhIFpvbmUgaW5zdGFuY2UsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAgICogKiBJZiBgaW5wdXRgIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB2YWxpZCB0aW1lIHpvbmUgbmFtZSwgYSBab25lIGluc3RhbmNlXG4gICAqICAgd2l0aCB0aGF0IG5hbWUgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBhIHN0cmluZyB0aGF0IGRvZXNuJ3QgcmVmZXIgdG8gYSBrbm93biB0aW1lIHpvbmUsIGEgWm9uZVxuICAgKiAgIGluc3RhbmNlIHdpdGgge0BsaW5rIFpvbmUuaXNWYWxpZH0gPT0gZmFsc2UgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0IGlzIGEgbnVtYmVyLCBhIFpvbmUgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGZpeGVkIG9mZnNldFxuICAgKiAgIGluIG1pbnV0ZXMgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHRoZSBkZWZhdWx0IHpvbmUgaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV8bnVtYmVyfSBbaW5wdXRdIC0gdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZFxuICAgKiBAcmV0dXJuIHtab25lfVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVpvbmUoaW5wdXQpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplWm9uZShpbnB1dCwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIG1vbnRoIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoKVswXSAvLz0+ICdKYW51YXJ5J1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnKVswXSAvLz0+ICdKYW4nXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdudW1lcmljJylbMF0gLy89PiAnMSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ3Nob3J0JywgeyBsb2NhbGU6ICdmci1DQScgfSApWzBdIC8vPT4gJ2phbnYuJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycsIHsgbG9jYWxlOiAnYXInIH0pWzBdIC8vPT4gJ1x1MDY2MSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ2xvbmcnLCB7IG91dHB1dENhbGVuZGFyOiAnaXNsYW1pYycgfSlbMF0gLy89PiAnUmFiaVx1MDJCQiBJJ1xuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyBtb250aHMoXG4gICAgbGVuZ3RoID0gXCJsb25nXCIsXG4gICAgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLCBsb2NPYmogPSBudWxsLCBvdXRwdXRDYWxlbmRhciA9IFwiZ3JlZ29yeVwiIH0gPSB7fVxuICApIHtcbiAgICByZXR1cm4gKGxvY09iaiB8fCBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikpLm1vbnRocyhsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgbW9udGggbmFtZXMuXG4gICAqIEZvcm1hdCBtb250aHMgZGlmZmVyIGZyb20gc3RhbmRhbG9uZSBtb250aHMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIHRoZSBkYXkgb2YgdGhlIG1vbnRoLiBJbiBzb21lIGxhbmd1YWdlcywgdGhhdFxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXG4gICAqIFNlZSB7QGxpbmsgSW5mbyNtb250aHN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgbW9udGhzRm9ybWF0KFxuICAgIGxlbmd0aCA9IFwibG9uZ1wiLFxuICAgIHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCwgbG9jT2JqID0gbnVsbCwgb3V0cHV0Q2FsZW5kYXIgPSBcImdyZWdvcnlcIiB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpKS5tb250aHMobGVuZ3RoLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygc3RhbmRhbG9uZSB3ZWVrIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSB3ZWVrZGF5IHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoKVswXSAvLz0+ICdNb25kYXknXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JylbMF0gLy89PiAnTW9uJ1xuICAgKiBAZXhhbXBsZSBJbmZvLndlZWtkYXlzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0pWzBdIC8vPT4gJ2x1bi4nXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdhcicgfSlbMF0gLy89PiAnXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjJCXHUwNjQ2XHUwNjRBXHUwNjQ2J1xuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyB3ZWVrZGF5cyhsZW5ndGggPSBcImxvbmdcIiwgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLCBsb2NPYmogPSBudWxsIH0gPSB7fSkge1xuICAgIHJldHVybiAobG9jT2JqIHx8IExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG51bGwpKS53ZWVrZGF5cyhsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgd2VlayBuYW1lcy5cbiAgICogRm9ybWF0IHdlZWtkYXlzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgd2Vla2RheXMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIG1vcmUgZGF0ZSBpbmZvcm1hdGlvbi4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcbiAgICogY2hhbmdlcyB0aGUgc3RyaW5nLlxuICAgKiBTZWUge0BsaW5rIEluZm8jd2Vla2RheXN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT1udWxsXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3RhdGljIHdlZWtkYXlzRm9ybWF0KFxuICAgIGxlbmd0aCA9IFwibG9uZ1wiLFxuICAgIHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCwgbG9jT2JqID0gbnVsbCB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgbnVsbCkpLndlZWtkYXlzKGxlbmd0aCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIG1lcmlkaWVtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBleGFtcGxlIEluZm8ubWVyaWRpZW1zKCkgLy89PiBbICdBTScsICdQTScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLm1lcmlkaWVtcyh7IGxvY2FsZTogJ215JyB9KSAvLz0+IFsgJ1x1MTAxNFx1MTAzNlx1MTAxNFx1MTAwMFx1MTAzQScsICdcdTEwMEFcdTEwMTRcdTEwMzEnIF1cbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgbWVyaWRpZW1zKHsgbG9jYWxlID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUpLm1lcmlkaWVtcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBlcmFzLCBzdWNoIGFzIFsnQkMnLCAnQUQnXS4gVGhlIGxvY2FsZSBjYW4gYmUgc3BlY2lmaWVkLCBidXQgdGhlIGNhbGVuZGFyIHN5c3RlbSBpcyBhbHdheXMgR3JlZ29yaWFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nc2hvcnQnXSAtIHRoZSBsZW5ndGggb2YgdGhlIGVyYSByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcInNob3J0XCIgb3IgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoKSAvLz0+IFsgJ0JDJywgJ0FEJyBdXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygnbG9uZycpIC8vPT4gWyAnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnLCB7IGxvY2FsZTogJ2ZyJyB9KSAvLz0+IFsgJ2F2YW50IEpcdTAwRTlzdXMtQ2hyaXN0JywgJ2Fwclx1MDBFOHMgSlx1MDBFOXN1cy1DaHJpc3QnIF1cbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgZXJhcyhsZW5ndGggPSBcInNob3J0XCIsIHsgbG9jYWxlID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bGwsIFwiZ3JlZ29yeVwiKS5lcmFzKGxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXG4gICAqIFNvbWUgZmVhdHVyZXMgb2YgTHV4b24gYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGVudmlyb25tZW50cy4gRm9yIGV4YW1wbGUsIG9uIG9sZGVyIGJyb3dzZXJzLCB0aW1lem9uZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgaWYgdGhhdCdzIHRoZSBjYXNlLlxuICAgKiBLZXlzOlxuICAgKiAqIGByZWxhdGl2ZWA6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyByZWxhdGl2ZSB0aW1lIGZvcm1hdHRpbmdcbiAgICogQGV4YW1wbGUgSW5mby5mZWF0dXJlcygpIC8vPT4geyBpbnRsOiB0cnVlLCBpbnRsVG9rZW5zOiBmYWxzZSwgem9uZXM6IHRydWUsIHJlbGF0aXZlOiBmYWxzZSB9XG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBmZWF0dXJlcygpIHtcbiAgICByZXR1cm4geyByZWxhdGl2ZTogaGFzUmVsYXRpdmUoKSB9O1xuICB9XG59XG4iLCAiaW1wb3J0IER1cmF0aW9uIGZyb20gXCIuLi9kdXJhdGlvbi5qc1wiO1xuXG5mdW5jdGlvbiBkYXlEaWZmKGVhcmxpZXIsIGxhdGVyKSB7XG4gIGNvbnN0IHV0Y0RheVN0YXJ0ID0gKGR0KSA9PiBkdC50b1VUQygwLCB7IGtlZXBMb2NhbFRpbWU6IHRydWUgfSkuc3RhcnRPZihcImRheVwiKS52YWx1ZU9mKCksXG4gICAgbXMgPSB1dGNEYXlTdGFydChsYXRlcikgLSB1dGNEYXlTdGFydChlYXJsaWVyKTtcbiAgcmV0dXJuIE1hdGguZmxvb3IoRHVyYXRpb24uZnJvbU1pbGxpcyhtcykuYXMoXCJkYXlzXCIpKTtcbn1cblxuZnVuY3Rpb24gaGlnaE9yZGVyRGlmZnMoY3Vyc29yLCBsYXRlciwgdW5pdHMpIHtcbiAgY29uc3QgZGlmZmVycyA9IFtcbiAgICBbXCJ5ZWFyc1wiLCAoYSwgYikgPT4gYi55ZWFyIC0gYS55ZWFyXSxcbiAgICBbXCJxdWFydGVyc1wiLCAoYSwgYikgPT4gYi5xdWFydGVyIC0gYS5xdWFydGVyXSxcbiAgICBbXCJtb250aHNcIiwgKGEsIGIpID0+IGIubW9udGggLSBhLm1vbnRoICsgKGIueWVhciAtIGEueWVhcikgKiAxMl0sXG4gICAgW1xuICAgICAgXCJ3ZWVrc1wiLFxuICAgICAgKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgZGF5cyA9IGRheURpZmYoYSwgYik7XG4gICAgICAgIHJldHVybiAoZGF5cyAtIChkYXlzICUgNykpIC8gNztcbiAgICAgIH0sXG4gICAgXSxcbiAgICBbXCJkYXlzXCIsIGRheURpZmZdLFxuICBdO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSB7fTtcbiAgbGV0IGxvd2VzdE9yZGVyLCBoaWdoV2F0ZXI7XG5cbiAgZm9yIChjb25zdCBbdW5pdCwgZGlmZmVyXSBvZiBkaWZmZXJzKSB7XG4gICAgaWYgKHVuaXRzLmluZGV4T2YodW5pdCkgPj0gMCkge1xuICAgICAgbG93ZXN0T3JkZXIgPSB1bml0O1xuXG4gICAgICBsZXQgZGVsdGEgPSBkaWZmZXIoY3Vyc29yLCBsYXRlcik7XG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cyh7IFt1bml0XTogZGVsdGEgfSk7XG5cbiAgICAgIGlmIChoaWdoV2F0ZXIgPiBsYXRlcikge1xuICAgICAgICBjdXJzb3IgPSBjdXJzb3IucGx1cyh7IFt1bml0XTogZGVsdGEgLSAxIH0pO1xuICAgICAgICBkZWx0YSAtPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3Vyc29yID0gaGlnaFdhdGVyO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRzW3VuaXRdID0gZGVsdGE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBvcHRzKSB7XG4gIGxldCBbY3Vyc29yLCByZXN1bHRzLCBoaWdoV2F0ZXIsIGxvd2VzdE9yZGVyXSA9IGhpZ2hPcmRlckRpZmZzKGVhcmxpZXIsIGxhdGVyLCB1bml0cyk7XG5cbiAgY29uc3QgcmVtYWluaW5nTWlsbGlzID0gbGF0ZXIgLSBjdXJzb3I7XG5cbiAgY29uc3QgbG93ZXJPcmRlclVuaXRzID0gdW5pdHMuZmlsdGVyKFxuICAgICh1KSA9PiBbXCJob3Vyc1wiLCBcIm1pbnV0ZXNcIiwgXCJzZWNvbmRzXCIsIFwibWlsbGlzZWNvbmRzXCJdLmluZGV4T2YodSkgPj0gMFxuICApO1xuXG4gIGlmIChsb3dlck9yZGVyVW5pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGhpZ2hXYXRlciA8IGxhdGVyKSB7XG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cyh7IFtsb3dlc3RPcmRlcl06IDEgfSk7XG4gICAgfVxuXG4gICAgaWYgKGhpZ2hXYXRlciAhPT0gY3Vyc29yKSB7XG4gICAgICByZXN1bHRzW2xvd2VzdE9yZGVyXSA9IChyZXN1bHRzW2xvd2VzdE9yZGVyXSB8fCAwKSArIHJlbWFpbmluZ01pbGxpcyAvIChoaWdoV2F0ZXIgLSBjdXJzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbU9iamVjdChyZXN1bHRzLCBvcHRzKTtcblxuICBpZiAobG93ZXJPcmRlclVuaXRzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU1pbGxpcyhyZW1haW5pbmdNaWxsaXMsIG9wdHMpXG4gICAgICAuc2hpZnRUbyguLi5sb3dlck9yZGVyVW5pdHMpXG4gICAgICAucGx1cyhkdXJhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGR1cmF0aW9uO1xuICB9XG59XG4iLCAiY29uc3QgbnVtYmVyaW5nU3lzdGVtcyA9IHtcbiAgYXJhYjogXCJbXFx1MDY2MC1cXHUwNjY5XVwiLFxuICBhcmFiZXh0OiBcIltcXHUwNkYwLVxcdTA2RjldXCIsXG4gIGJhbGk6IFwiW1xcdTFCNTAtXFx1MUI1OV1cIixcbiAgYmVuZzogXCJbXFx1MDlFNi1cXHUwOUVGXVwiLFxuICBkZXZhOiBcIltcXHUwOTY2LVxcdTA5NkZdXCIsXG4gIGZ1bGx3aWRlOiBcIltcXHVGRjEwLVxcdUZGMTldXCIsXG4gIGd1anI6IFwiW1xcdTBBRTYtXFx1MEFFRl1cIixcbiAgaGFuaWRlYzogXCJbXHUzMDA3fFx1NEUwMHxcdTRFOEN8XHU0RTA5fFx1NTZEQnxcdTRFOTR8XHU1MTZEfFx1NEUwM3xcdTUxNkJ8XHU0RTVEXVwiLFxuICBraG1yOiBcIltcXHUxN0UwLVxcdTE3RTldXCIsXG4gIGtuZGE6IFwiW1xcdTBDRTYtXFx1MENFRl1cIixcbiAgbGFvbzogXCJbXFx1MEVEMC1cXHUwRUQ5XVwiLFxuICBsaW1iOiBcIltcXHUxOTQ2LVxcdTE5NEZdXCIsXG4gIG1seW06IFwiW1xcdTBENjYtXFx1MEQ2Rl1cIixcbiAgbW9uZzogXCJbXFx1MTgxMC1cXHUxODE5XVwiLFxuICBteW1yOiBcIltcXHUxMDQwLVxcdTEwNDldXCIsXG4gIG9yeWE6IFwiW1xcdTBCNjYtXFx1MEI2Rl1cIixcbiAgdGFtbGRlYzogXCJbXFx1MEJFNi1cXHUwQkVGXVwiLFxuICB0ZWx1OiBcIltcXHUwQzY2LVxcdTBDNkZdXCIsXG4gIHRoYWk6IFwiW1xcdTBFNTAtXFx1MEU1OV1cIixcbiAgdGlidDogXCJbXFx1MEYyMC1cXHUwRjI5XVwiLFxuICBsYXRuOiBcIlxcXFxkXCIsXG59O1xuXG5jb25zdCBudW1iZXJpbmdTeXN0ZW1zVVRGMTYgPSB7XG4gIGFyYWI6IFsxNjMyLCAxNjQxXSxcbiAgYXJhYmV4dDogWzE3NzYsIDE3ODVdLFxuICBiYWxpOiBbNjk5MiwgNzAwMV0sXG4gIGJlbmc6IFsyNTM0LCAyNTQzXSxcbiAgZGV2YTogWzI0MDYsIDI0MTVdLFxuICBmdWxsd2lkZTogWzY1Mjk2LCA2NTMwM10sXG4gIGd1anI6IFsyNzkwLCAyNzk5XSxcbiAga2htcjogWzYxMTIsIDYxMjFdLFxuICBrbmRhOiBbMzMwMiwgMzMxMV0sXG4gIGxhb286IFszNzkyLCAzODAxXSxcbiAgbGltYjogWzY0NzAsIDY0NzldLFxuICBtbHltOiBbMzQzMCwgMzQzOV0sXG4gIG1vbmc6IFs2MTYwLCA2MTY5XSxcbiAgbXltcjogWzQxNjAsIDQxNjldLFxuICBvcnlhOiBbMjkxOCwgMjkyN10sXG4gIHRhbWxkZWM6IFszMDQ2LCAzMDU1XSxcbiAgdGVsdTogWzMxNzQsIDMxODNdLFxuICB0aGFpOiBbMzY2NCwgMzY3M10sXG4gIHRpYnQ6IFszODcyLCAzODgxXSxcbn07XG5cbmNvbnN0IGhhbmlkZWNDaGFycyA9IG51bWJlcmluZ1N5c3RlbXMuaGFuaWRlYy5yZXBsYWNlKC9bXFxbfFxcXV0vZywgXCJcIikuc3BsaXQoXCJcIik7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURpZ2l0cyhzdHIpIHtcbiAgbGV0IHZhbHVlID0gcGFyc2VJbnQoc3RyLCAxMCk7XG4gIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IFwiXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcblxuICAgICAgaWYgKHN0cltpXS5zZWFyY2gobnVtYmVyaW5nU3lzdGVtcy5oYW5pZGVjKSAhPT0gLTEpIHtcbiAgICAgICAgdmFsdWUgKz0gaGFuaWRlY0NoYXJzLmluZGV4T2Yoc3RyW2ldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG51bWJlcmluZ1N5c3RlbXNVVEYxNikge1xuICAgICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBudW1iZXJpbmdTeXN0ZW1zVVRGMTZba2V5XTtcbiAgICAgICAgICBpZiAoY29kZSA+PSBtaW4gJiYgY29kZSA8PSBtYXgpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IGNvZGUgLSBtaW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlnaXRSZWdleCh7IG51bWJlcmluZ1N5c3RlbSB9LCBhcHBlbmQgPSBcIlwiKSB7XG4gIHJldHVybiBuZXcgUmVnRXhwKGAke251bWJlcmluZ1N5c3RlbXNbbnVtYmVyaW5nU3lzdGVtIHx8IFwibGF0blwiXX0ke2FwcGVuZH1gKTtcbn1cbiIsICJpbXBvcnQgeyBwYXJzZU1pbGxpcywgaXNVbmRlZmluZWQsIHVudHJ1bmNhdGVZZWFyLCBzaWduZWRPZmZzZXQsIGhhc093blByb3BlcnR5IH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0IEZvcm1hdHRlciBmcm9tIFwiLi9mb3JtYXR0ZXIuanNcIjtcbmltcG9ydCBGaXhlZE9mZnNldFpvbmUgZnJvbSBcIi4uL3pvbmVzL2ZpeGVkT2Zmc2V0Wm9uZS5qc1wiO1xuaW1wb3J0IElBTkFab25lIGZyb20gXCIuLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuLi9kYXRldGltZS5qc1wiO1xuaW1wb3J0IHsgZGlnaXRSZWdleCwgcGFyc2VEaWdpdHMgfSBmcm9tIFwiLi9kaWdpdHMuanNcIjtcbmltcG9ydCB7IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuXG5jb25zdCBNSVNTSU5HX0ZUUCA9IFwibWlzc2luZyBJbnRsLkRhdGVUaW1lRm9ybWF0LmZvcm1hdFRvUGFydHMgc3VwcG9ydFwiO1xuXG5mdW5jdGlvbiBpbnRVbml0KHJlZ2V4LCBwb3N0ID0gKGkpID0+IGkpIHtcbiAgcmV0dXJuIHsgcmVnZXgsIGRlc2VyOiAoW3NdKSA9PiBwb3N0KHBhcnNlRGlnaXRzKHMpKSB9O1xufVxuXG5jb25zdCBOQlNQID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApO1xuY29uc3Qgc3BhY2VPck5CU1AgPSBgKCB8JHtOQlNQfSlgO1xuY29uc3Qgc3BhY2VPck5CU1BSZWdFeHAgPSBuZXcgUmVnRXhwKHNwYWNlT3JOQlNQLCBcImdcIik7XG5cbmZ1bmN0aW9uIGZpeExpc3RSZWdleChzKSB7XG4gIC8vIG1ha2UgZG90cyBvcHRpb25hbCBhbmQgYWxzbyBtYWtlIHRoZW0gbGl0ZXJhbFxuICAvLyBtYWtlIHNwYWNlIGFuZCBub24gYnJlYWthYmxlIHNwYWNlIGNoYXJhY3RlcnMgaW50ZXJjaGFuZ2VhYmxlXG4gIHJldHVybiBzLnJlcGxhY2UoL1xcLi9nLCBcIlxcXFwuP1wiKS5yZXBsYWNlKHNwYWNlT3JOQlNQUmVnRXhwLCBzcGFjZU9yTkJTUCk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwSW5zZW5zaXRpdml0aWVzKHMpIHtcbiAgcmV0dXJuIHNcbiAgICAucmVwbGFjZSgvXFwuL2csIFwiXCIpIC8vIGlnbm9yZSBkb3RzIHRoYXQgd2VyZSBtYWRlIG9wdGlvbmFsXG4gICAgLnJlcGxhY2Uoc3BhY2VPck5CU1BSZWdFeHAsIFwiIFwiKSAvLyBpbnRlcmNoYW5nZSBzcGFjZSBhbmQgbmJzcFxuICAgIC50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBvbmVPZihzdHJpbmdzLCBzdGFydEluZGV4KSB7XG4gIGlmIChzdHJpbmdzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZ2V4OiBSZWdFeHAoc3RyaW5ncy5tYXAoZml4TGlzdFJlZ2V4KS5qb2luKFwifFwiKSksXG4gICAgICBkZXNlcjogKFtzXSkgPT5cbiAgICAgICAgc3RyaW5ncy5maW5kSW5kZXgoKGkpID0+IHN0cmlwSW5zZW5zaXRpdml0aWVzKHMpID09PSBzdHJpcEluc2Vuc2l0aXZpdGllcyhpKSkgKyBzdGFydEluZGV4LFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gb2Zmc2V0KHJlZ2V4LCBncm91cHMpIHtcbiAgcmV0dXJuIHsgcmVnZXgsIGRlc2VyOiAoWywgaCwgbV0pID0+IHNpZ25lZE9mZnNldChoLCBtKSwgZ3JvdXBzIH07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZShyZWdleCkge1xuICByZXR1cm4geyByZWdleCwgZGVzZXI6IChbc10pID0+IHMgfTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlVG9rZW4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tcXC1cXFtcXF17fSgpKis/LixcXFxcXFxeJHwjXFxzXS9nLCBcIlxcXFwkJlwiKTtcbn1cblxuZnVuY3Rpb24gdW5pdEZvclRva2VuKHRva2VuLCBsb2MpIHtcbiAgY29uc3Qgb25lID0gZGlnaXRSZWdleChsb2MpLFxuICAgIHR3byA9IGRpZ2l0UmVnZXgobG9jLCBcInsyfVwiKSxcbiAgICB0aHJlZSA9IGRpZ2l0UmVnZXgobG9jLCBcInszfVwiKSxcbiAgICBmb3VyID0gZGlnaXRSZWdleChsb2MsIFwiezR9XCIpLFxuICAgIHNpeCA9IGRpZ2l0UmVnZXgobG9jLCBcIns2fVwiKSxcbiAgICBvbmVPclR3byA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDJ9XCIpLFxuICAgIG9uZVRvVGhyZWUgPSBkaWdpdFJlZ2V4KGxvYywgXCJ7MSwzfVwiKSxcbiAgICBvbmVUb1NpeCA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDZ9XCIpLFxuICAgIG9uZVRvTmluZSA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDl9XCIpLFxuICAgIHR3b1RvRm91ciA9IGRpZ2l0UmVnZXgobG9jLCBcInsyLDR9XCIpLFxuICAgIGZvdXJUb1NpeCA9IGRpZ2l0UmVnZXgobG9jLCBcIns0LDZ9XCIpLFxuICAgIGxpdGVyYWwgPSAodCkgPT4gKHsgcmVnZXg6IFJlZ0V4cChlc2NhcGVUb2tlbih0LnZhbCkpLCBkZXNlcjogKFtzXSkgPT4gcywgbGl0ZXJhbDogdHJ1ZSB9KSxcbiAgICB1bml0YXRlID0gKHQpID0+IHtcbiAgICAgIGlmICh0b2tlbi5saXRlcmFsKSB7XG4gICAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh0LnZhbCkge1xuICAgICAgICAvLyBlcmFcbiAgICAgICAgY2FzZSBcIkdcIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLmVyYXMoXCJzaG9ydFwiLCBmYWxzZSksIDApO1xuICAgICAgICBjYXNlIFwiR0dcIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLmVyYXMoXCJsb25nXCIsIGZhbHNlKSwgMCk7XG4gICAgICAgIC8vIHllYXJzXG4gICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9TaXgpO1xuICAgICAgICBjYXNlIFwieXlcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d29Ub0ZvdXIsIHVudHJ1bmNhdGVZZWFyKTtcbiAgICAgICAgY2FzZSBcInl5eXlcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChmb3VyKTtcbiAgICAgICAgY2FzZSBcInl5eXl5XCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQoZm91clRvU2l4KTtcbiAgICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHNpeCk7XG4gICAgICAgIC8vIG1vbnRoc1xuICAgICAgICBjYXNlIFwiTVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwic2hvcnRcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcImxvbmdcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgY2FzZSBcIkxcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJMTExcIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcInNob3J0XCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwibG9uZ1wiLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgLy8gZGF0ZXNcbiAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJkZFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIC8vIG9yZGluYWxzXG4gICAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9UaHJlZSk7XG4gICAgICAgIGNhc2UgXCJvb29cIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAgIC8vIHRpbWVcbiAgICAgICAgY2FzZSBcIkhIXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcIkhcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJoaFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgICBjYXNlIFwibW1cIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcInFcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJxcVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgICBjYXNlIFwic3NcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgICBjYXNlIFwiU1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZVRvVGhyZWUpO1xuICAgICAgICBjYXNlIFwiU1NTXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodGhyZWUpO1xuICAgICAgICBjYXNlIFwidVwiOlxuICAgICAgICAgIHJldHVybiBzaW1wbGUob25lVG9OaW5lKTtcbiAgICAgICAgLy8gbWVyaWRpZW1cbiAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLm1lcmlkaWVtcygpLCAwKTtcbiAgICAgICAgLy8gd2Vla1llYXIgKGspXG4gICAgICAgIGNhc2UgXCJra2trXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQoZm91cik7XG4gICAgICAgIGNhc2UgXCJra1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgICAvLyB3ZWVrTnVtYmVyIChXKVxuICAgICAgICBjYXNlIFwiV1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcIldXXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgLy8gd2Vla2RheXNcbiAgICAgICAgY2FzZSBcIkVcIjpcbiAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmUpO1xuICAgICAgICBjYXNlIFwiRUVFXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcInNob3J0XCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJsb25nXCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiY2NjXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcInNob3J0XCIsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcImxvbmdcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgLy8gb2Zmc2V0L3pvbmVcbiAgICAgICAgY2FzZSBcIlpcIjpcbiAgICAgICAgY2FzZSBcIlpaXCI6XG4gICAgICAgICAgcmV0dXJuIG9mZnNldChuZXcgUmVnRXhwKGAoWystXSR7b25lT3JUd28uc291cmNlfSkoPzo6KCR7dHdvLnNvdXJjZX0pKT9gKSwgMik7XG4gICAgICAgIGNhc2UgXCJaWlpcIjpcbiAgICAgICAgICByZXR1cm4gb2Zmc2V0KG5ldyBSZWdFeHAoYChbKy1dJHtvbmVPclR3by5zb3VyY2V9KSgke3R3by5zb3VyY2V9KT9gKSwgMik7XG4gICAgICAgIC8vIHdlIGRvbid0IHN1cHBvcnQgWlpaWiAoUFNUKSBvciBaWlpaWiAoUGFjaWZpYyBTdGFuZGFyZCBUaW1lKSBpbiBwYXJzaW5nXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgd2F5IHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGV5IGFyZVxuICAgICAgICBjYXNlIFwielwiOlxuICAgICAgICAgIHJldHVybiBzaW1wbGUoL1thLXpfKy0vXXsxLDI1Nn0/L2kpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgY29uc3QgdW5pdCA9IHVuaXRhdGUodG9rZW4pIHx8IHtcbiAgICBpbnZhbGlkUmVhc29uOiBNSVNTSU5HX0ZUUCxcbiAgfTtcblxuICB1bml0LnRva2VuID0gdG9rZW47XG5cbiAgcmV0dXJuIHVuaXQ7XG59XG5cbmNvbnN0IHBhcnRUeXBlU3R5bGVUb1Rva2VuVmFsID0ge1xuICB5ZWFyOiB7XG4gICAgXCIyLWRpZ2l0XCI6IFwieXlcIixcbiAgICBudW1lcmljOiBcInl5eXl5XCIsXG4gIH0sXG4gIG1vbnRoOiB7XG4gICAgbnVtZXJpYzogXCJNXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwiTU1cIixcbiAgICBzaG9ydDogXCJNTU1cIixcbiAgICBsb25nOiBcIk1NTU1cIixcbiAgfSxcbiAgZGF5OiB7XG4gICAgbnVtZXJpYzogXCJkXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwiZGRcIixcbiAgfSxcbiAgd2Vla2RheToge1xuICAgIHNob3J0OiBcIkVFRVwiLFxuICAgIGxvbmc6IFwiRUVFRVwiLFxuICB9LFxuICBkYXlwZXJpb2Q6IFwiYVwiLFxuICBkYXlQZXJpb2Q6IFwiYVwiLFxuICBob3VyOiB7XG4gICAgbnVtZXJpYzogXCJoXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwiaGhcIixcbiAgfSxcbiAgbWludXRlOiB7XG4gICAgbnVtZXJpYzogXCJtXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwibW1cIixcbiAgfSxcbiAgc2Vjb25kOiB7XG4gICAgbnVtZXJpYzogXCJzXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwic3NcIixcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHRva2VuRm9yUGFydChwYXJ0LCBsb2NhbGUsIGZvcm1hdE9wdHMpIHtcbiAgY29uc3QgeyB0eXBlLCB2YWx1ZSB9ID0gcGFydDtcblxuICBpZiAodHlwZSA9PT0gXCJsaXRlcmFsXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGl0ZXJhbDogdHJ1ZSxcbiAgICAgIHZhbDogdmFsdWUsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHN0eWxlID0gZm9ybWF0T3B0c1t0eXBlXTtcblxuICBsZXQgdmFsID0gcGFydFR5cGVTdHlsZVRvVG9rZW5WYWxbdHlwZV07XG4gIGlmICh0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiKSB7XG4gICAgdmFsID0gdmFsW3N0eWxlXTtcbiAgfVxuXG4gIGlmICh2YWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGl0ZXJhbDogZmFsc2UsXG4gICAgICB2YWwsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVnZXgodW5pdHMpIHtcbiAgY29uc3QgcmUgPSB1bml0cy5tYXAoKHUpID0+IHUucmVnZXgpLnJlZHVjZSgoZiwgcikgPT4gYCR7Zn0oJHtyLnNvdXJjZX0pYCwgXCJcIik7XG4gIHJldHVybiBbYF4ke3JlfSRgLCB1bml0c107XG59XG5cbmZ1bmN0aW9uIG1hdGNoKGlucHV0LCByZWdleCwgaGFuZGxlcnMpIHtcbiAgY29uc3QgbWF0Y2hlcyA9IGlucHV0Lm1hdGNoKHJlZ2V4KTtcblxuICBpZiAobWF0Y2hlcykge1xuICAgIGNvbnN0IGFsbCA9IHt9O1xuICAgIGxldCBtYXRjaEluZGV4ID0gMTtcbiAgICBmb3IgKGNvbnN0IGkgaW4gaGFuZGxlcnMpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShoYW5kbGVycywgaSkpIHtcbiAgICAgICAgY29uc3QgaCA9IGhhbmRsZXJzW2ldLFxuICAgICAgICAgIGdyb3VwcyA9IGguZ3JvdXBzID8gaC5ncm91cHMgKyAxIDogMTtcbiAgICAgICAgaWYgKCFoLmxpdGVyYWwgJiYgaC50b2tlbikge1xuICAgICAgICAgIGFsbFtoLnRva2VuLnZhbFswXV0gPSBoLmRlc2VyKG1hdGNoZXMuc2xpY2UobWF0Y2hJbmRleCwgbWF0Y2hJbmRleCArIGdyb3VwcykpO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoSW5kZXggKz0gZ3JvdXBzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW21hdGNoZXMsIGFsbF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFttYXRjaGVzLCB7fV07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSB7XG4gIGNvbnN0IHRvRmllbGQgPSAodG9rZW4pID0+IHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiU1wiOlxuICAgICAgICByZXR1cm4gXCJtaWxsaXNlY29uZFwiO1xuICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgcmV0dXJuIFwic2Vjb25kXCI7XG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gXCJtaW51dGVcIjtcbiAgICAgIGNhc2UgXCJoXCI6XG4gICAgICBjYXNlIFwiSFwiOlxuICAgICAgICByZXR1cm4gXCJob3VyXCI7XG4gICAgICBjYXNlIFwiZFwiOlxuICAgICAgICByZXR1cm4gXCJkYXlcIjtcbiAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgIHJldHVybiBcIm9yZGluYWxcIjtcbiAgICAgIGNhc2UgXCJMXCI6XG4gICAgICBjYXNlIFwiTVwiOlxuICAgICAgICByZXR1cm4gXCJtb250aFwiO1xuICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgcmV0dXJuIFwieWVhclwiO1xuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBcIndlZWtkYXlcIjtcbiAgICAgIGNhc2UgXCJXXCI6XG4gICAgICAgIHJldHVybiBcIndlZWtOdW1iZXJcIjtcbiAgICAgIGNhc2UgXCJrXCI6XG4gICAgICAgIHJldHVybiBcIndlZWtZZWFyXCI7XG4gICAgICBjYXNlIFwicVwiOlxuICAgICAgICByZXR1cm4gXCJxdWFydGVyXCI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgbGV0IHpvbmU7XG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy5aKSkge1xuICAgIHpvbmUgPSBuZXcgRml4ZWRPZmZzZXRab25lKG1hdGNoZXMuWik7XG4gIH0gZWxzZSBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMueikpIHtcbiAgICB6b25lID0gSUFOQVpvbmUuY3JlYXRlKG1hdGNoZXMueik7XG4gIH0gZWxzZSB7XG4gICAgem9uZSA9IG51bGw7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMucSkpIHtcbiAgICBtYXRjaGVzLk0gPSAobWF0Y2hlcy5xIC0gMSkgKiAzICsgMTtcbiAgfVxuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy5oKSkge1xuICAgIGlmIChtYXRjaGVzLmggPCAxMiAmJiBtYXRjaGVzLmEgPT09IDEpIHtcbiAgICAgIG1hdGNoZXMuaCArPSAxMjtcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMuaCA9PT0gMTIgJiYgbWF0Y2hlcy5hID09PSAwKSB7XG4gICAgICBtYXRjaGVzLmggPSAwO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaGVzLkcgPT09IDAgJiYgbWF0Y2hlcy55KSB7XG4gICAgbWF0Y2hlcy55ID0gLW1hdGNoZXMueTtcbiAgfVxuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy51KSkge1xuICAgIG1hdGNoZXMuUyA9IHBhcnNlTWlsbGlzKG1hdGNoZXMudSk7XG4gIH1cblxuICBjb25zdCB2YWxzID0gT2JqZWN0LmtleXMobWF0Y2hlcykucmVkdWNlKChyLCBrKSA9PiB7XG4gICAgY29uc3QgZiA9IHRvRmllbGQoayk7XG4gICAgaWYgKGYpIHtcbiAgICAgIHJbZl0gPSBtYXRjaGVzW2tdO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIFt2YWxzLCB6b25lXTtcbn1cblxubGV0IGR1bW15RGF0ZVRpbWVDYWNoZSA9IG51bGw7XG5cbmZ1bmN0aW9uIGdldER1bW15RGF0ZVRpbWUoKSB7XG4gIGlmICghZHVtbXlEYXRlVGltZUNhY2hlKSB7XG4gICAgZHVtbXlEYXRlVGltZUNhY2hlID0gRGF0ZVRpbWUuZnJvbU1pbGxpcygxNTU1NTU1NTU1NTU1KTtcbiAgfVxuXG4gIHJldHVybiBkdW1teURhdGVUaW1lQ2FjaGU7XG59XG5cbmZ1bmN0aW9uIG1heWJlRXhwYW5kTWFjcm9Ub2tlbih0b2tlbiwgbG9jYWxlKSB7XG4gIGlmICh0b2tlbi5saXRlcmFsKSB7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0T3B0cyA9IEZvcm1hdHRlci5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHRva2VuLnZhbCk7XG5cbiAgaWYgKCFmb3JtYXRPcHRzKSB7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyID0gRm9ybWF0dGVyLmNyZWF0ZShsb2NhbGUsIGZvcm1hdE9wdHMpO1xuICBjb25zdCBwYXJ0cyA9IGZvcm1hdHRlci5mb3JtYXREYXRlVGltZVBhcnRzKGdldER1bW15RGF0ZVRpbWUoKSk7XG5cbiAgY29uc3QgdG9rZW5zID0gcGFydHMubWFwKChwKSA9PiB0b2tlbkZvclBhcnQocCwgbG9jYWxlLCBmb3JtYXRPcHRzKSk7XG5cbiAgaWYgKHRva2Vucy5pbmNsdWRlcyh1bmRlZmluZWQpKSB7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gZXhwYW5kTWFjcm9Ub2tlbnModG9rZW5zLCBsb2NhbGUpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQoLi4udG9rZW5zLm1hcCgodCkgPT4gbWF5YmVFeHBhbmRNYWNyb1Rva2VuKHQsIGxvY2FsZSkpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleHBsYWluRnJvbVRva2Vucyhsb2NhbGUsIGlucHV0LCBmb3JtYXQpIHtcbiAgY29uc3QgdG9rZW5zID0gZXhwYW5kTWFjcm9Ub2tlbnMoRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZvcm1hdCksIGxvY2FsZSksXG4gICAgdW5pdHMgPSB0b2tlbnMubWFwKCh0KSA9PiB1bml0Rm9yVG9rZW4odCwgbG9jYWxlKSksXG4gICAgZGlzcXVhbGlmeWluZ1VuaXQgPSB1bml0cy5maW5kKCh0KSA9PiB0LmludmFsaWRSZWFzb24pO1xuXG4gIGlmIChkaXNxdWFsaWZ5aW5nVW5pdCkge1xuICAgIHJldHVybiB7IGlucHV0LCB0b2tlbnMsIGludmFsaWRSZWFzb246IGRpc3F1YWxpZnlpbmdVbml0LmludmFsaWRSZWFzb24gfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbcmVnZXhTdHJpbmcsIGhhbmRsZXJzXSA9IGJ1aWxkUmVnZXgodW5pdHMpLFxuICAgICAgcmVnZXggPSBSZWdFeHAocmVnZXhTdHJpbmcsIFwiaVwiKSxcbiAgICAgIFtyYXdNYXRjaGVzLCBtYXRjaGVzXSA9IG1hdGNoKGlucHV0LCByZWdleCwgaGFuZGxlcnMpLFxuICAgICAgW3Jlc3VsdCwgem9uZV0gPSBtYXRjaGVzID8gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSA6IFtudWxsLCBudWxsXTtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkobWF0Y2hlcywgXCJhXCIpICYmIGhhc093blByb3BlcnR5KG1hdGNoZXMsIFwiSFwiKSkge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbid0IGluY2x1ZGUgbWVyaWRpZW0gd2hlbiBzcGVjaWZ5aW5nIDI0LWhvdXIgZm9ybWF0XCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7IGlucHV0LCB0b2tlbnMsIHJlZ2V4LCByYXdNYXRjaGVzLCBtYXRjaGVzLCByZXN1bHQsIHpvbmUgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICBjb25zdCB7IHJlc3VsdCwgem9uZSwgaW52YWxpZFJlYXNvbiB9ID0gZXhwbGFpbkZyb21Ub2tlbnMobG9jYWxlLCBpbnB1dCwgZm9ybWF0KTtcbiAgcmV0dXJuIFtyZXN1bHQsIHpvbmUsIGludmFsaWRSZWFzb25dO1xufVxuIiwgImltcG9ydCB7XG4gIGludGVnZXJCZXR3ZWVuLFxuICBpc0xlYXBZZWFyLFxuICB0aW1lT2JqZWN0LFxuICBkYXlzSW5ZZWFyLFxuICBkYXlzSW5Nb250aCxcbiAgd2Vla3NJbldlZWtZZWFyLFxuICBpc0ludGVnZXIsXG59IGZyb20gXCIuL3V0aWwuanNcIjtcbmltcG9ydCBJbnZhbGlkIGZyb20gXCIuL2ludmFsaWQuanNcIjtcblxuY29uc3Qgbm9uTGVhcExhZGRlciA9IFswLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNF0sXG4gIGxlYXBMYWRkZXIgPSBbMCwgMzEsIDYwLCA5MSwgMTIxLCAxNTIsIDE4MiwgMjEzLCAyNDQsIDI3NCwgMzA1LCAzMzVdO1xuXG5mdW5jdGlvbiB1bml0T3V0T2ZSYW5nZSh1bml0LCB2YWx1ZSkge1xuICByZXR1cm4gbmV3IEludmFsaWQoXG4gICAgXCJ1bml0IG91dCBvZiByYW5nZVwiLFxuICAgIGB5b3Ugc3BlY2lmaWVkICR7dmFsdWV9IChvZiB0eXBlICR7dHlwZW9mIHZhbHVlfSkgYXMgYSAke3VuaXR9LCB3aGljaCBpcyBpbnZhbGlkYFxuICApO1xufVxuXG5mdW5jdGlvbiBkYXlPZldlZWsoeWVhciwgbW9udGgsIGRheSkge1xuICBjb25zdCBqcyA9IG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoIC0gMSwgZGF5KSkuZ2V0VVRDRGF5KCk7XG4gIHJldHVybiBqcyA9PT0gMCA/IDcgOiBqcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSkge1xuICByZXR1cm4gZGF5ICsgKGlzTGVhcFllYXIoeWVhcikgPyBsZWFwTGFkZGVyIDogbm9uTGVhcExhZGRlcilbbW9udGggLSAxXTtcbn1cblxuZnVuY3Rpb24gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSB7XG4gIGNvbnN0IHRhYmxlID0gaXNMZWFwWWVhcih5ZWFyKSA/IGxlYXBMYWRkZXIgOiBub25MZWFwTGFkZGVyLFxuICAgIG1vbnRoMCA9IHRhYmxlLmZpbmRJbmRleCgoaSkgPT4gaSA8IG9yZGluYWwpLFxuICAgIGRheSA9IG9yZGluYWwgLSB0YWJsZVttb250aDBdO1xuICByZXR1cm4geyBtb250aDogbW9udGgwICsgMSwgZGF5IH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ3JlZ29yaWFuVG9XZWVrKGdyZWdPYmopIHtcbiAgY29uc3QgeyB5ZWFyLCBtb250aCwgZGF5IH0gPSBncmVnT2JqLFxuICAgIG9yZGluYWwgPSBjb21wdXRlT3JkaW5hbCh5ZWFyLCBtb250aCwgZGF5KSxcbiAgICB3ZWVrZGF5ID0gZGF5T2ZXZWVrKHllYXIsIG1vbnRoLCBkYXkpO1xuXG4gIGxldCB3ZWVrTnVtYmVyID0gTWF0aC5mbG9vcigob3JkaW5hbCAtIHdlZWtkYXkgKyAxMCkgLyA3KSxcbiAgICB3ZWVrWWVhcjtcblxuICBpZiAod2Vla051bWJlciA8IDEpIHtcbiAgICB3ZWVrWWVhciA9IHllYXIgLSAxO1xuICAgIHdlZWtOdW1iZXIgPSB3ZWVrc0luV2Vla1llYXIod2Vla1llYXIpO1xuICB9IGVsc2UgaWYgKHdlZWtOdW1iZXIgPiB3ZWVrc0luV2Vla1llYXIoeWVhcikpIHtcbiAgICB3ZWVrWWVhciA9IHllYXIgKyAxO1xuICAgIHdlZWtOdW1iZXIgPSAxO1xuICB9IGVsc2Uge1xuICAgIHdlZWtZZWFyID0geWVhcjtcbiAgfVxuXG4gIHJldHVybiB7IHdlZWtZZWFyLCB3ZWVrTnVtYmVyLCB3ZWVrZGF5LCAuLi50aW1lT2JqZWN0KGdyZWdPYmopIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3ZWVrVG9HcmVnb3JpYW4od2Vla0RhdGEpIHtcbiAgY29uc3QgeyB3ZWVrWWVhciwgd2Vla051bWJlciwgd2Vla2RheSB9ID0gd2Vla0RhdGEsXG4gICAgd2Vla2RheU9mSmFuNCA9IGRheU9mV2Vlayh3ZWVrWWVhciwgMSwgNCksXG4gICAgeWVhckluRGF5cyA9IGRheXNJblllYXIod2Vla1llYXIpO1xuXG4gIGxldCBvcmRpbmFsID0gd2Vla051bWJlciAqIDcgKyB3ZWVrZGF5IC0gd2Vla2RheU9mSmFuNCAtIDMsXG4gICAgeWVhcjtcblxuICBpZiAob3JkaW5hbCA8IDEpIHtcbiAgICB5ZWFyID0gd2Vla1llYXIgLSAxO1xuICAgIG9yZGluYWwgKz0gZGF5c0luWWVhcih5ZWFyKTtcbiAgfSBlbHNlIGlmIChvcmRpbmFsID4geWVhckluRGF5cykge1xuICAgIHllYXIgPSB3ZWVrWWVhciArIDE7XG4gICAgb3JkaW5hbCAtPSBkYXlzSW5ZZWFyKHdlZWtZZWFyKTtcbiAgfSBlbHNlIHtcbiAgICB5ZWFyID0gd2Vla1llYXI7XG4gIH1cblxuICBjb25zdCB7IG1vbnRoLCBkYXkgfSA9IHVuY29tcHV0ZU9yZGluYWwoeWVhciwgb3JkaW5hbCk7XG4gIHJldHVybiB7IHllYXIsIG1vbnRoLCBkYXksIC4uLnRpbWVPYmplY3Qod2Vla0RhdGEpIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmVnb3JpYW5Ub09yZGluYWwoZ3JlZ0RhdGEpIHtcbiAgY29uc3QgeyB5ZWFyLCBtb250aCwgZGF5IH0gPSBncmVnRGF0YTtcbiAgY29uc3Qgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpO1xuICByZXR1cm4geyB5ZWFyLCBvcmRpbmFsLCAuLi50aW1lT2JqZWN0KGdyZWdEYXRhKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3JkaW5hbFRvR3JlZ29yaWFuKG9yZGluYWxEYXRhKSB7XG4gIGNvbnN0IHsgeWVhciwgb3JkaW5hbCB9ID0gb3JkaW5hbERhdGE7XG4gIGNvbnN0IHsgbW9udGgsIGRheSB9ID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKTtcbiAgcmV0dXJuIHsgeWVhciwgbW9udGgsIGRheSwgLi4udGltZU9iamVjdChvcmRpbmFsRGF0YSkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludmFsaWRXZWVrRGF0YShvYmopIHtcbiAgY29uc3QgdmFsaWRZZWFyID0gaXNJbnRlZ2VyKG9iai53ZWVrWWVhciksXG4gICAgdmFsaWRXZWVrID0gaW50ZWdlckJldHdlZW4ob2JqLndlZWtOdW1iZXIsIDEsIHdlZWtzSW5XZWVrWWVhcihvYmoud2Vla1llYXIpKSxcbiAgICB2YWxpZFdlZWtkYXkgPSBpbnRlZ2VyQmV0d2VlbihvYmoud2Vla2RheSwgMSwgNyk7XG5cbiAgaWYgKCF2YWxpZFllYXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ3ZWVrWWVhclwiLCBvYmoud2Vla1llYXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZFdlZWspIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ3ZWVrXCIsIG9iai53ZWVrKTtcbiAgfSBlbHNlIGlmICghdmFsaWRXZWVrZGF5KSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwid2Vla2RheVwiLCBvYmoud2Vla2RheSk7XG4gIH0gZWxzZSByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNJbnZhbGlkT3JkaW5hbERhdGEob2JqKSB7XG4gIGNvbnN0IHZhbGlkWWVhciA9IGlzSW50ZWdlcihvYmoueWVhciksXG4gICAgdmFsaWRPcmRpbmFsID0gaW50ZWdlckJldHdlZW4ob2JqLm9yZGluYWwsIDEsIGRheXNJblllYXIob2JqLnllYXIpKTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcInllYXJcIiwgb2JqLnllYXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE9yZGluYWwpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJvcmRpbmFsXCIsIG9iai5vcmRpbmFsKTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG9iaikge1xuICBjb25zdCB2YWxpZFllYXIgPSBpc0ludGVnZXIob2JqLnllYXIpLFxuICAgIHZhbGlkTW9udGggPSBpbnRlZ2VyQmV0d2VlbihvYmoubW9udGgsIDEsIDEyKSxcbiAgICB2YWxpZERheSA9IGludGVnZXJCZXR3ZWVuKG9iai5kYXksIDEsIGRheXNJbk1vbnRoKG9iai55ZWFyLCBvYmoubW9udGgpKTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcInllYXJcIiwgb2JqLnllYXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1vbnRoKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwibW9udGhcIiwgb2JqLm1vbnRoKTtcbiAgfSBlbHNlIGlmICghdmFsaWREYXkpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJkYXlcIiwgb2JqLmRheSk7XG4gIH0gZWxzZSByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNJbnZhbGlkVGltZURhdGEob2JqKSB7XG4gIGNvbnN0IHsgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kIH0gPSBvYmo7XG4gIGNvbnN0IHZhbGlkSG91ciA9XG4gICAgICBpbnRlZ2VyQmV0d2Vlbihob3VyLCAwLCAyMykgfHxcbiAgICAgIChob3VyID09PSAyNCAmJiBtaW51dGUgPT09IDAgJiYgc2Vjb25kID09PSAwICYmIG1pbGxpc2Vjb25kID09PSAwKSxcbiAgICB2YWxpZE1pbnV0ZSA9IGludGVnZXJCZXR3ZWVuKG1pbnV0ZSwgMCwgNTkpLFxuICAgIHZhbGlkU2Vjb25kID0gaW50ZWdlckJldHdlZW4oc2Vjb25kLCAwLCA1OSksXG4gICAgdmFsaWRNaWxsaXNlY29uZCA9IGludGVnZXJCZXR3ZWVuKG1pbGxpc2Vjb25kLCAwLCA5OTkpO1xuXG4gIGlmICghdmFsaWRIb3VyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwiaG91clwiLCBob3VyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNaW51dGUpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtaW51dGVcIiwgbWludXRlKTtcbiAgfSBlbHNlIGlmICghdmFsaWRTZWNvbmQpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJzZWNvbmRcIiwgc2Vjb25kKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNaWxsaXNlY29uZCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm1pbGxpc2Vjb25kXCIsIG1pbGxpc2Vjb25kKTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cbiIsICJpbXBvcnQgRHVyYXRpb24sIHsgZnJpZW5kbHlEdXJhdGlvbiB9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgSW50ZXJ2YWwgZnJvbSBcIi4vaW50ZXJ2YWwuanNcIjtcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IEluZm8gZnJvbSBcIi4vaW5mby5qc1wiO1xuaW1wb3J0IEZvcm1hdHRlciBmcm9tIFwiLi9pbXBsL2Zvcm1hdHRlci5qc1wiO1xuaW1wb3J0IEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIFwiLi96b25lcy9maXhlZE9mZnNldFpvbmUuanNcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcIi4vaW1wbC9sb2NhbGUuanNcIjtcbmltcG9ydCB7XG4gIGlzVW5kZWZpbmVkLFxuICBtYXliZUFycmF5LFxuICBpc0RhdGUsXG4gIGlzTnVtYmVyLFxuICBiZXN0QnksXG4gIGRheXNJbk1vbnRoLFxuICBkYXlzSW5ZZWFyLFxuICBpc0xlYXBZZWFyLFxuICB3ZWVrc0luV2Vla1llYXIsXG4gIG5vcm1hbGl6ZU9iamVjdCxcbiAgcm91bmRUbyxcbiAgb2JqVG9Mb2NhbFRTLFxufSBmcm9tIFwiLi9pbXBsL3V0aWwuanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZVpvbmUgfSBmcm9tIFwiLi9pbXBsL3pvbmVVdGlsLmpzXCI7XG5pbXBvcnQgZGlmZiBmcm9tIFwiLi9pbXBsL2RpZmYuanNcIjtcbmltcG9ydCB7IHBhcnNlUkZDMjgyMkRhdGUsIHBhcnNlSVNPRGF0ZSwgcGFyc2VIVFRQRGF0ZSwgcGFyc2VTUUwgfSBmcm9tIFwiLi9pbXBsL3JlZ2V4UGFyc2VyLmpzXCI7XG5pbXBvcnQgeyBwYXJzZUZyb21Ub2tlbnMsIGV4cGxhaW5Gcm9tVG9rZW5zIH0gZnJvbSBcIi4vaW1wbC90b2tlblBhcnNlci5qc1wiO1xuaW1wb3J0IHtcbiAgZ3JlZ29yaWFuVG9XZWVrLFxuICB3ZWVrVG9HcmVnb3JpYW4sXG4gIGdyZWdvcmlhblRvT3JkaW5hbCxcbiAgb3JkaW5hbFRvR3JlZ29yaWFuLFxuICBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YSxcbiAgaGFzSW52YWxpZFdlZWtEYXRhLFxuICBoYXNJbnZhbGlkT3JkaW5hbERhdGEsXG4gIGhhc0ludmFsaWRUaW1lRGF0YSxcbn0gZnJvbSBcIi4vaW1wbC9jb252ZXJzaW9ucy5qc1wiO1xuaW1wb3J0ICogYXMgRm9ybWF0cyBmcm9tIFwiLi9pbXBsL2Zvcm1hdHMuanNcIjtcbmltcG9ydCB7XG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcixcbiAgSW52YWxpZFVuaXRFcnJvcixcbiAgSW52YWxpZERhdGVUaW1lRXJyb3IsXG59IGZyb20gXCIuL2Vycm9ycy5qc1wiO1xuaW1wb3J0IEludmFsaWQgZnJvbSBcIi4vaW1wbC9pbnZhbGlkLmpzXCI7XG5cbmNvbnN0IElOVkFMSUQgPSBcIkludmFsaWQgRGF0ZVRpbWVcIjtcbmNvbnN0IE1BWF9EQVRFID0gOC42NGUxNTtcblxuZnVuY3Rpb24gdW5zdXBwb3J0ZWRab25lKHpvbmUpIHtcbiAgcmV0dXJuIG5ldyBJbnZhbGlkKFwidW5zdXBwb3J0ZWQgem9uZVwiLCBgdGhlIHpvbmUgXCIke3pvbmUubmFtZX1cIiBpcyBub3Qgc3VwcG9ydGVkYCk7XG59XG5cbi8vIHdlIGNhY2hlIHdlZWsgZGF0YSBvbiB0aGUgRFQgb2JqZWN0IGFuZCB0aGlzIGludGVybWVkaWF0ZXMgdGhlIGNhY2hlXG5mdW5jdGlvbiBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKGR0KSB7XG4gIGlmIChkdC53ZWVrRGF0YSA9PT0gbnVsbCkge1xuICAgIGR0LndlZWtEYXRhID0gZ3JlZ29yaWFuVG9XZWVrKGR0LmMpO1xuICB9XG4gIHJldHVybiBkdC53ZWVrRGF0YTtcbn1cblxuLy8gY2xvbmUgcmVhbGx5IG1lYW5zLCBcIm1ha2UgYSBuZXcgb2JqZWN0IHdpdGggdGhlc2UgbW9kaWZpY2F0aW9uc1wiLiBhbGwgXCJzZXR0ZXJzXCIgcmVhbGx5IHVzZSB0aGlzXG4vLyB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IHdoaWxlIG9ubHkgY2hhbmdpbmcgc29tZSBvZiB0aGUgcHJvcGVydGllc1xuZnVuY3Rpb24gY2xvbmUoaW5zdCwgYWx0cykge1xuICBjb25zdCBjdXJyZW50ID0ge1xuICAgIHRzOiBpbnN0LnRzLFxuICAgIHpvbmU6IGluc3Quem9uZSxcbiAgICBjOiBpbnN0LmMsXG4gICAgbzogaW5zdC5vLFxuICAgIGxvYzogaW5zdC5sb2MsXG4gICAgaW52YWxpZDogaW5zdC5pbnZhbGlkLFxuICB9O1xuICByZXR1cm4gbmV3IERhdGVUaW1lKHsgLi4uY3VycmVudCwgLi4uYWx0cywgb2xkOiBjdXJyZW50IH0pO1xufVxuXG4vLyBmaW5kIHRoZSByaWdodCBvZmZzZXQgYSBnaXZlbiBsb2NhbCB0aW1lLiBUaGUgbyBpbnB1dCBpcyBvdXIgZ3Vlc3MsIHdoaWNoIGRldGVybWluZXMgd2hpY2hcbi8vIG9mZnNldCB3ZSdsbCBwaWNrIGluIGFtYmlndW91cyBjYXNlcyAoZS5nLiB0aGVyZSBhcmUgdHdvIDMgQU1zIGIvYyBGYWxsYmFjayBEU1QpXG5mdW5jdGlvbiBmaXhPZmZzZXQobG9jYWxUUywgbywgdHopIHtcbiAgLy8gT3VyIFVUQyB0aW1lIGlzIGp1c3QgYSBndWVzcyBiZWNhdXNlIG91ciBvZmZzZXQgaXMganVzdCBhIGd1ZXNzXG4gIGxldCB1dGNHdWVzcyA9IGxvY2FsVFMgLSBvICogNjAgKiAxMDAwO1xuXG4gIC8vIFRlc3Qgd2hldGhlciB0aGUgem9uZSBtYXRjaGVzIHRoZSBvZmZzZXQgZm9yIHRoaXMgdHNcbiAgY29uc3QgbzIgPSB0ei5vZmZzZXQodXRjR3Vlc3MpO1xuXG4gIC8vIElmIHNvLCBvZmZzZXQgZGlkbid0IGNoYW5nZSBhbmQgd2UncmUgZG9uZVxuICBpZiAobyA9PT0gbzIpIHtcbiAgICByZXR1cm4gW3V0Y0d1ZXNzLCBvXTtcbiAgfVxuXG4gIC8vIElmIG5vdCwgY2hhbmdlIHRoZSB0cyBieSB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgb2Zmc2V0XG4gIHV0Y0d1ZXNzIC09IChvMiAtIG8pICogNjAgKiAxMDAwO1xuXG4gIC8vIElmIHRoYXQgZ2l2ZXMgdXMgdGhlIGxvY2FsIHRpbWUgd2Ugd2FudCwgd2UncmUgZG9uZVxuICBjb25zdCBvMyA9IHR6Lm9mZnNldCh1dGNHdWVzcyk7XG4gIGlmIChvMiA9PT0gbzMpIHtcbiAgICByZXR1cm4gW3V0Y0d1ZXNzLCBvMl07XG4gIH1cblxuICAvLyBJZiBpdCdzIGRpZmZlcmVudCwgd2UncmUgaW4gYSBob2xlIHRpbWUuIFRoZSBvZmZzZXQgaGFzIGNoYW5nZWQsIGJ1dCB0aGUgd2UgZG9uJ3QgYWRqdXN0IHRoZSB0aW1lXG4gIHJldHVybiBbbG9jYWxUUyAtIE1hdGgubWluKG8yLCBvMykgKiA2MCAqIDEwMDAsIE1hdGgubWF4KG8yLCBvMyldO1xufVxuXG4vLyBjb252ZXJ0IGFuIGVwb2NoIHRpbWVzdGFtcCBpbnRvIGEgY2FsZW5kYXIgb2JqZWN0IHdpdGggdGhlIGdpdmVuIG9mZnNldFxuZnVuY3Rpb24gdHNUb09iaih0cywgb2Zmc2V0KSB7XG4gIHRzICs9IG9mZnNldCAqIDYwICogMTAwMDtcblxuICBjb25zdCBkID0gbmV3IERhdGUodHMpO1xuXG4gIHJldHVybiB7XG4gICAgeWVhcjogZC5nZXRVVENGdWxsWWVhcigpLFxuICAgIG1vbnRoOiBkLmdldFVUQ01vbnRoKCkgKyAxLFxuICAgIGRheTogZC5nZXRVVENEYXRlKCksXG4gICAgaG91cjogZC5nZXRVVENIb3VycygpLFxuICAgIG1pbnV0ZTogZC5nZXRVVENNaW51dGVzKCksXG4gICAgc2Vjb25kOiBkLmdldFVUQ1NlY29uZHMoKSxcbiAgICBtaWxsaXNlY29uZDogZC5nZXRVVENNaWxsaXNlY29uZHMoKSxcbiAgfTtcbn1cblxuLy8gY29udmVydCBhIGNhbGVuZGFyIG9iamVjdCB0byBhIGVwb2NoIHRpbWVzdGFtcFxuZnVuY3Rpb24gb2JqVG9UUyhvYmosIG9mZnNldCwgem9uZSkge1xuICByZXR1cm4gZml4T2Zmc2V0KG9ialRvTG9jYWxUUyhvYmopLCBvZmZzZXQsIHpvbmUpO1xufVxuXG4vLyBjcmVhdGUgYSBuZXcgRFQgaW5zdGFuY2UgYnkgYWRkaW5nIGEgZHVyYXRpb24sIGFkanVzdGluZyBmb3IgRFNUc1xuZnVuY3Rpb24gYWRqdXN0VGltZShpbnN0LCBkdXIpIHtcbiAgY29uc3Qgb1ByZSA9IGluc3QubyxcbiAgICB5ZWFyID0gaW5zdC5jLnllYXIgKyBNYXRoLnRydW5jKGR1ci55ZWFycyksXG4gICAgbW9udGggPSBpbnN0LmMubW9udGggKyBNYXRoLnRydW5jKGR1ci5tb250aHMpICsgTWF0aC50cnVuYyhkdXIucXVhcnRlcnMpICogMyxcbiAgICBjID0ge1xuICAgICAgLi4uaW5zdC5jLFxuICAgICAgeWVhcixcbiAgICAgIG1vbnRoLFxuICAgICAgZGF5OlxuICAgICAgICBNYXRoLm1pbihpbnN0LmMuZGF5LCBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpICtcbiAgICAgICAgTWF0aC50cnVuYyhkdXIuZGF5cykgK1xuICAgICAgICBNYXRoLnRydW5jKGR1ci53ZWVrcykgKiA3LFxuICAgIH0sXG4gICAgbWlsbGlzVG9BZGQgPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtcbiAgICAgIHllYXJzOiBkdXIueWVhcnMgLSBNYXRoLnRydW5jKGR1ci55ZWFycyksXG4gICAgICBxdWFydGVyczogZHVyLnF1YXJ0ZXJzIC0gTWF0aC50cnVuYyhkdXIucXVhcnRlcnMpLFxuICAgICAgbW9udGhzOiBkdXIubW9udGhzIC0gTWF0aC50cnVuYyhkdXIubW9udGhzKSxcbiAgICAgIHdlZWtzOiBkdXIud2Vla3MgLSBNYXRoLnRydW5jKGR1ci53ZWVrcyksXG4gICAgICBkYXlzOiBkdXIuZGF5cyAtIE1hdGgudHJ1bmMoZHVyLmRheXMpLFxuICAgICAgaG91cnM6IGR1ci5ob3VycyxcbiAgICAgIG1pbnV0ZXM6IGR1ci5taW51dGVzLFxuICAgICAgc2Vjb25kczogZHVyLnNlY29uZHMsXG4gICAgICBtaWxsaXNlY29uZHM6IGR1ci5taWxsaXNlY29uZHMsXG4gICAgfSkuYXMoXCJtaWxsaXNlY29uZHNcIiksXG4gICAgbG9jYWxUUyA9IG9ialRvTG9jYWxUUyhjKTtcblxuICBsZXQgW3RzLCBvXSA9IGZpeE9mZnNldChsb2NhbFRTLCBvUHJlLCBpbnN0LnpvbmUpO1xuXG4gIGlmIChtaWxsaXNUb0FkZCAhPT0gMCkge1xuICAgIHRzICs9IG1pbGxpc1RvQWRkO1xuICAgIC8vIHRoYXQgY291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBvZmZzZXQgYnkgZ29pbmcgb3ZlciBhIERTVCwgYnV0IHdlIHdhbnQgdG8ga2VlcCB0aGUgdHMgdGhlIHNhbWVcbiAgICBvID0gaW5zdC56b25lLm9mZnNldCh0cyk7XG4gIH1cblxuICByZXR1cm4geyB0cywgbyB9O1xufVxuXG4vLyBoZWxwZXIgdXNlZnVsIGluIHR1cm5pbmcgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnRvIHJlYWwgZGF0ZXNcbi8vIGJ5IGhhbmRsaW5nIHRoZSB6b25lIG9wdGlvbnNcbmZ1bmN0aW9uIHBhcnNlRGF0YVRvRGF0ZVRpbWUocGFyc2VkLCBwYXJzZWRab25lLCBvcHRzLCBmb3JtYXQsIHRleHQpIHtcbiAgY29uc3QgeyBzZXRab25lLCB6b25lIH0gPSBvcHRzO1xuICBpZiAocGFyc2VkICYmIE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoICE9PSAwKSB7XG4gICAgY29uc3QgaW50ZXJwcmV0YXRpb25ab25lID0gcGFyc2VkWm9uZSB8fCB6b25lLFxuICAgICAgaW5zdCA9IERhdGVUaW1lLmZyb21PYmplY3QocGFyc2VkLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHpvbmU6IGludGVycHJldGF0aW9uWm9uZSxcbiAgICAgIH0pO1xuICAgIHJldHVybiBzZXRab25lID8gaW5zdCA6IGluc3Quc2V0Wm9uZSh6b25lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChcbiAgICAgIG5ldyBJbnZhbGlkKFwidW5wYXJzYWJsZVwiLCBgdGhlIGlucHV0IFwiJHt0ZXh0fVwiIGNhbid0IGJlIHBhcnNlZCBhcyAke2Zvcm1hdH1gKVxuICAgICk7XG4gIH1cbn1cblxuLy8gaWYgeW91IHdhbnQgdG8gb3V0cHV0IGEgdGVjaG5pY2FsIGZvcm1hdCAoZS5nLiBSRkMgMjgyMiksIHRoaXMgaGVscGVyXG4vLyBoZWxwcyBoYW5kbGUgdGhlIGRldGFpbHNcbmZ1bmN0aW9uIHRvVGVjaEZvcm1hdChkdCwgZm9ybWF0LCBhbGxvd1ogPSB0cnVlKSB7XG4gIHJldHVybiBkdC5pc1ZhbGlkXG4gICAgPyBGb3JtYXR0ZXIuY3JlYXRlKExvY2FsZS5jcmVhdGUoXCJlbi1VU1wiKSwge1xuICAgICAgICBhbGxvd1osXG4gICAgICAgIGZvcmNlU2ltcGxlOiB0cnVlLFxuICAgICAgfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGR0LCBmb3JtYXQpXG4gICAgOiBudWxsO1xufVxuXG4vLyB0ZWNobmljYWwgdGltZSBmb3JtYXRzIChlLmcuIHRoZSB0aW1lIHBhcnQgb2YgSVNPIDg2MDEpLCB0YWtlIHNvbWUgb3B0aW9uc1xuLy8gYW5kIHRoaXMgY29tbW9uaXplcyB0aGVpciBoYW5kbGluZ1xuZnVuY3Rpb24gdG9UZWNoVGltZUZvcm1hdChcbiAgZHQsXG4gIHtcbiAgICBzdXBwcmVzc1NlY29uZHMgPSBmYWxzZSxcbiAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IGZhbHNlLFxuICAgIGluY2x1ZGVPZmZzZXQsXG4gICAgaW5jbHVkZVByZWZpeCA9IGZhbHNlLFxuICAgIGluY2x1ZGVab25lID0gZmFsc2UsXG4gICAgc3BhY2Vab25lID0gZmFsc2UsXG4gICAgZm9ybWF0ID0gXCJleHRlbmRlZFwiLFxuICB9XG4pIHtcbiAgbGV0IGZtdCA9IGZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJISG1tXCIgOiBcIkhIOm1tXCI7XG5cbiAgaWYgKCFzdXBwcmVzc1NlY29uZHMgfHwgZHQuc2Vjb25kICE9PSAwIHx8IGR0Lm1pbGxpc2Vjb25kICE9PSAwKSB7XG4gICAgZm10ICs9IGZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJzc1wiIDogXCI6c3NcIjtcbiAgICBpZiAoIXN1cHByZXNzTWlsbGlzZWNvbmRzIHx8IGR0Lm1pbGxpc2Vjb25kICE9PSAwKSB7XG4gICAgICBmbXQgKz0gXCIuU1NTXCI7XG4gICAgfVxuICB9XG5cbiAgaWYgKChpbmNsdWRlWm9uZSB8fCBpbmNsdWRlT2Zmc2V0KSAmJiBzcGFjZVpvbmUpIHtcbiAgICBmbXQgKz0gXCIgXCI7XG4gIH1cblxuICBpZiAoaW5jbHVkZVpvbmUpIHtcbiAgICBmbXQgKz0gXCJ6XCI7XG4gIH0gZWxzZSBpZiAoaW5jbHVkZU9mZnNldCkge1xuICAgIGZtdCArPSBmb3JtYXQgPT09IFwiYmFzaWNcIiA/IFwiWlpaXCIgOiBcIlpaXCI7XG4gIH1cblxuICBsZXQgc3RyID0gdG9UZWNoRm9ybWF0KGR0LCBmbXQpO1xuXG4gIGlmIChpbmNsdWRlUHJlZml4KSB7XG4gICAgc3RyID0gXCJUXCIgKyBzdHI7XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG4vLyBkZWZhdWx0cyBmb3IgdW5zcGVjaWZpZWQgdW5pdHMgaW4gdGhlIHN1cHBvcnRlZCBjYWxlbmRhcnNcbmNvbnN0IGRlZmF1bHRVbml0VmFsdWVzID0ge1xuICAgIG1vbnRoOiAxLFxuICAgIGRheTogMSxcbiAgICBob3VyOiAwLFxuICAgIG1pbnV0ZTogMCxcbiAgICBzZWNvbmQ6IDAsXG4gICAgbWlsbGlzZWNvbmQ6IDAsXG4gIH0sXG4gIGRlZmF1bHRXZWVrVW5pdFZhbHVlcyA9IHtcbiAgICB3ZWVrTnVtYmVyOiAxLFxuICAgIHdlZWtkYXk6IDEsXG4gICAgaG91cjogMCxcbiAgICBtaW51dGU6IDAsXG4gICAgc2Vjb25kOiAwLFxuICAgIG1pbGxpc2Vjb25kOiAwLFxuICB9LFxuICBkZWZhdWx0T3JkaW5hbFVuaXRWYWx1ZXMgPSB7XG4gICAgb3JkaW5hbDogMSxcbiAgICBob3VyOiAwLFxuICAgIG1pbnV0ZTogMCxcbiAgICBzZWNvbmQ6IDAsXG4gICAgbWlsbGlzZWNvbmQ6IDAsXG4gIH07XG5cbi8vIFVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzLCBzb3J0ZWQgYnkgYmlnbmVzc1xuY29uc3Qgb3JkZXJlZFVuaXRzID0gW1wieWVhclwiLCBcIm1vbnRoXCIsIFwiZGF5XCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdLFxuICBvcmRlcmVkV2Vla1VuaXRzID0gW1xuICAgIFwid2Vla1llYXJcIixcbiAgICBcIndlZWtOdW1iZXJcIixcbiAgICBcIndlZWtkYXlcIixcbiAgICBcImhvdXJcIixcbiAgICBcIm1pbnV0ZVwiLFxuICAgIFwic2Vjb25kXCIsXG4gICAgXCJtaWxsaXNlY29uZFwiLFxuICBdLFxuICBvcmRlcmVkT3JkaW5hbFVuaXRzID0gW1wieWVhclwiLCBcIm9yZGluYWxcIiwgXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwibWlsbGlzZWNvbmRcIl07XG5cbi8vIHN0YW5kYXJkaXplIGNhc2UgYW5kIHBsdXJhbGl0eSBpbiB1bml0c1xuZnVuY3Rpb24gbm9ybWFsaXplVW5pdCh1bml0KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgeWVhcjogXCJ5ZWFyXCIsXG4gICAgeWVhcnM6IFwieWVhclwiLFxuICAgIG1vbnRoOiBcIm1vbnRoXCIsXG4gICAgbW9udGhzOiBcIm1vbnRoXCIsXG4gICAgZGF5OiBcImRheVwiLFxuICAgIGRheXM6IFwiZGF5XCIsXG4gICAgaG91cjogXCJob3VyXCIsXG4gICAgaG91cnM6IFwiaG91clwiLFxuICAgIG1pbnV0ZTogXCJtaW51dGVcIixcbiAgICBtaW51dGVzOiBcIm1pbnV0ZVwiLFxuICAgIHF1YXJ0ZXI6IFwicXVhcnRlclwiLFxuICAgIHF1YXJ0ZXJzOiBcInF1YXJ0ZXJcIixcbiAgICBzZWNvbmQ6IFwic2Vjb25kXCIsXG4gICAgc2Vjb25kczogXCJzZWNvbmRcIixcbiAgICBtaWxsaXNlY29uZDogXCJtaWxsaXNlY29uZFwiLFxuICAgIG1pbGxpc2Vjb25kczogXCJtaWxsaXNlY29uZFwiLFxuICAgIHdlZWtkYXk6IFwid2Vla2RheVwiLFxuICAgIHdlZWtkYXlzOiBcIndlZWtkYXlcIixcbiAgICB3ZWVrbnVtYmVyOiBcIndlZWtOdW1iZXJcIixcbiAgICB3ZWVrc251bWJlcjogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgd2Vla251bWJlcnM6IFwid2Vla051bWJlclwiLFxuICAgIHdlZWt5ZWFyOiBcIndlZWtZZWFyXCIsXG4gICAgd2Vla3llYXJzOiBcIndlZWtZZWFyXCIsXG4gICAgb3JkaW5hbDogXCJvcmRpbmFsXCIsXG4gIH1bdW5pdC50b0xvd2VyQ2FzZSgpXTtcblxuICBpZiAoIW5vcm1hbGl6ZWQpIHRocm93IG5ldyBJbnZhbGlkVW5pdEVycm9yKHVuaXQpO1xuXG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vLyB0aGlzIGlzIGEgZHVtYmVkIGRvd24gdmVyc2lvbiBvZiBmcm9tT2JqZWN0KCkgdGhhdCBydW5zIGFib3V0IDYwJSBmYXN0ZXJcbi8vIGJ1dCBkb2Vzbid0IGRvIGFueSB2YWxpZGF0aW9uLCBtYWtlcyBhIGJ1bmNoIG9mIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgdW5pdHNcbi8vIGFyZSBwcmVzZW50LCBhbmQgc28gb24uXG5cbi8vIHRoaXMgaXMgYSBkdW1iZWQgZG93biB2ZXJzaW9uIG9mIGZyb21PYmplY3QoKSB0aGF0IHJ1bnMgYWJvdXQgNjAlIGZhc3RlclxuLy8gYnV0IGRvZXNuJ3QgZG8gYW55IHZhbGlkYXRpb24sIG1ha2VzIGEgYnVuY2ggb2YgYXNzdW1wdGlvbnMgYWJvdXQgd2hhdCB1bml0c1xuLy8gYXJlIHByZXNlbnQsIGFuZCBzbyBvbi5cbmZ1bmN0aW9uIHF1aWNrRFQob2JqLCBvcHRzKSB7XG4gIGNvbnN0IHpvbmUgPSBub3JtYWxpemVab25lKG9wdHMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgIGxvYyA9IExvY2FsZS5mcm9tT2JqZWN0KG9wdHMpLFxuICAgIHRzTm93ID0gU2V0dGluZ3Mubm93KCk7XG5cbiAgbGV0IHRzLCBvO1xuXG4gIC8vIGFzc3VtZSB3ZSBoYXZlIHRoZSBoaWdoZXItb3JkZXIgdW5pdHNcbiAgaWYgKCFpc1VuZGVmaW5lZChvYmoueWVhcikpIHtcbiAgICBmb3IgKGNvbnN0IHUgb2Ygb3JkZXJlZFVuaXRzKSB7XG4gICAgICBpZiAoaXNVbmRlZmluZWQob2JqW3VdKSkge1xuICAgICAgICBvYmpbdV0gPSBkZWZhdWx0VW5pdFZhbHVlc1t1XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpbnZhbGlkID0gaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEob2JqKSB8fCBoYXNJbnZhbGlkVGltZURhdGEob2JqKTtcbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb2Zmc2V0UHJvdmlzID0gem9uZS5vZmZzZXQodHNOb3cpO1xuICAgIFt0cywgb10gPSBvYmpUb1RTKG9iaiwgb2Zmc2V0UHJvdmlzLCB6b25lKTtcbiAgfSBlbHNlIHtcbiAgICB0cyA9IHRzTm93O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBEYXRlVGltZSh7IHRzLCB6b25lLCBsb2MsIG8gfSk7XG59XG5cbmZ1bmN0aW9uIGRpZmZSZWxhdGl2ZShzdGFydCwgZW5kLCBvcHRzKSB7XG4gIGNvbnN0IHJvdW5kID0gaXNVbmRlZmluZWQob3B0cy5yb3VuZCkgPyB0cnVlIDogb3B0cy5yb3VuZCxcbiAgICBmb3JtYXQgPSAoYywgdW5pdCkgPT4ge1xuICAgICAgYyA9IHJvdW5kVG8oYywgcm91bmQgfHwgb3B0cy5jYWxlbmRhcnkgPyAwIDogMiwgdHJ1ZSk7XG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSBlbmQubG9jLmNsb25lKG9wdHMpLnJlbEZvcm1hdHRlcihvcHRzKTtcbiAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGMsIHVuaXQpO1xuICAgIH0sXG4gICAgZGlmZmVyID0gKHVuaXQpID0+IHtcbiAgICAgIGlmIChvcHRzLmNhbGVuZGFyeSkge1xuICAgICAgICBpZiAoIWVuZC5oYXNTYW1lKHN0YXJ0LCB1bml0KSkge1xuICAgICAgICAgIHJldHVybiBlbmQuc3RhcnRPZih1bml0KS5kaWZmKHN0YXJ0LnN0YXJ0T2YodW5pdCksIHVuaXQpLmdldCh1bml0KTtcbiAgICAgICAgfSBlbHNlIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVuZC5kaWZmKHN0YXJ0LCB1bml0KS5nZXQodW5pdCk7XG4gICAgICB9XG4gICAgfTtcblxuICBpZiAob3B0cy51bml0KSB7XG4gICAgcmV0dXJuIGZvcm1hdChkaWZmZXIob3B0cy51bml0KSwgb3B0cy51bml0KTtcbiAgfVxuXG4gIGZvciAoY29uc3QgdW5pdCBvZiBvcHRzLnVuaXRzKSB7XG4gICAgY29uc3QgY291bnQgPSBkaWZmZXIodW5pdCk7XG4gICAgaWYgKE1hdGguYWJzKGNvdW50KSA+PSAxKSB7XG4gICAgICByZXR1cm4gZm9ybWF0KGNvdW50LCB1bml0KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZvcm1hdChzdGFydCA+IGVuZCA/IC0wIDogMCwgb3B0cy51bml0c1tvcHRzLnVuaXRzLmxlbmd0aCAtIDFdKTtcbn1cblxuZnVuY3Rpb24gbGFzdE9wdHMoYXJnTGlzdCkge1xuICBsZXQgb3B0cyA9IHt9LFxuICAgIGFyZ3M7XG4gIGlmIChhcmdMaXN0Lmxlbmd0aCA+IDAgJiYgdHlwZW9mIGFyZ0xpc3RbYXJnTGlzdC5sZW5ndGggLSAxXSA9PT0gXCJvYmplY3RcIikge1xuICAgIG9wdHMgPSBhcmdMaXN0W2FyZ0xpc3QubGVuZ3RoIC0gMV07XG4gICAgYXJncyA9IEFycmF5LmZyb20oYXJnTGlzdCkuc2xpY2UoMCwgYXJnTGlzdC5sZW5ndGggLSAxKTtcbiAgfSBlbHNlIHtcbiAgICBhcmdzID0gQXJyYXkuZnJvbShhcmdMaXN0KTtcbiAgfVxuICByZXR1cm4gW29wdHMsIGFyZ3NdO1xufVxuXG4vKipcbiAqIEEgRGF0ZVRpbWUgaXMgYW4gaW1tdXRhYmxlIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIGRhdGUgYW5kIHRpbWUgYW5kIGFjY29tcGFueWluZyBtZXRob2RzLiBJdCBjb250YWlucyBjbGFzcyBhbmQgaW5zdGFuY2UgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHBhcnNpbmcsIGludGVycm9nYXRpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cbiAqXG4gKiBBIERhdGVUaW1lIGNvbXByaXNlcyBvZjpcbiAqICogQSB0aW1lc3RhbXAuIEVhY2ggRGF0ZVRpbWUgaW5zdGFuY2UgcmVmZXJzIHRvIGEgc3BlY2lmaWMgbWlsbGlzZWNvbmQgb2YgdGhlIFVuaXggZXBvY2guXG4gKiAqIEEgdGltZSB6b25lLiBFYWNoIGluc3RhbmNlIGlzIGNvbnNpZGVyZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBzcGVjaWZpYyB6b25lIChieSBkZWZhdWx0IHRoZSBsb2NhbCBzeXN0ZW0ncyB6b25lKS5cbiAqICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHRoYXQgZWZmZWN0IGhvdyBvdXRwdXQgc3RyaW5ncyBhcmUgZm9ybWF0dGVkLCBzdWNoIGFzIGBsb2NhbGVgLCBgbnVtYmVyaW5nU3lzdGVtYCwgYW5kIGBvdXRwdXRDYWxlbmRhcmAuXG4gKlxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZnVuY3Rpb25hbGl0eSBpdCBwcm92aWRlczpcbiAqXG4gKiAqICoqQ3JlYXRpb24qKjogVG8gY3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBpdHMgY29tcG9uZW50cywgdXNlIG9uZSBvZiBpdHMgZmFjdG9yeSBjbGFzcyBtZXRob2RzOiB7QGxpbmsgRGF0ZVRpbWUubG9jYWx9LCB7QGxpbmsgRGF0ZVRpbWUudXRjfSwgYW5kIChtb3N0IGZsZXhpYmx5KSB7QGxpbmsgRGF0ZVRpbWUuZnJvbU9iamVjdH0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIHN0YW5kYXJkIHN0cmluZyBmb3JtYXQsIHVzZSB7QGxpbmsgRGF0ZVRpbWUuZnJvbUlTT30sIHtAbGluayBEYXRlVGltZS5mcm9tSFRUUH0sIGFuZCB7QGxpbmsgRGF0ZVRpbWUuZnJvbVJGQzI4MjJ9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBjdXN0b20gc3RyaW5nIGZvcm1hdCwgdXNlIHtAbGluayBEYXRlVGltZS5mcm9tRm9ybWF0fS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgbmF0aXZlIEpTIGRhdGUsIHVzZSB7QGxpbmsgRGF0ZVRpbWUuZnJvbUpTRGF0ZX0uXG4gKiAqICoqR3JlZ29yaWFuIGNhbGVuZGFyIGFuZCB0aW1lKio6IFRvIGV4YW1pbmUgdGhlIEdyZWdvcmlhbiBwcm9wZXJ0aWVzIG9mIGEgRGF0ZVRpbWUgaW5kaXZpZHVhbGx5IChpLmUgYXMgb3Bwb3NlZCB0byBjb2xsZWN0aXZlbHkgdGhyb3VnaCB7QGxpbmsgRGF0ZVRpbWUjdG9PYmplY3R9KSwgdXNlIHRoZSB7QGxpbmsgRGF0ZVRpbWUjeWVhcn0sIHtAbGluayBEYXRlVGltZSNtb250aH0sXG4gKiB7QGxpbmsgRGF0ZVRpbWUjZGF5fSwge0BsaW5rIERhdGVUaW1lI2hvdXJ9LCB7QGxpbmsgRGF0ZVRpbWUjbWludXRlfSwge0BsaW5rIERhdGVUaW1lI3NlY29uZH0sIHtAbGluayBEYXRlVGltZSNtaWxsaXNlY29uZH0gYWNjZXNzb3JzLlxuICogKiAqKldlZWsgY2FsZW5kYXIqKjogRm9yIElTTyB3ZWVrIGNhbGVuZGFyIGF0dHJpYnV0ZXMsIHNlZSB0aGUge0BsaW5rIERhdGVUaW1lI3dlZWtZZWFyfSwge0BsaW5rIERhdGVUaW1lI3dlZWtOdW1iZXJ9LCBhbmQge0BsaW5rIERhdGVUaW1lI3dlZWtkYXl9IGFjY2Vzc29ycy5cbiAqICogKipDb25maWd1cmF0aW9uKiogU2VlIHRoZSB7QGxpbmsgRGF0ZVRpbWUjbG9jYWxlfSBhbmQge0BsaW5rIERhdGVUaW1lI251bWJlcmluZ1N5c3RlbX0gYWNjZXNzb3JzLlxuICogKiAqKlRyYW5zZm9ybWF0aW9uKio6IFRvIHRyYW5zZm9ybSB0aGUgRGF0ZVRpbWUgaW50byBvdGhlciBEYXRlVGltZXMsIHVzZSB7QGxpbmsgRGF0ZVRpbWUjc2V0fSwge0BsaW5rIERhdGVUaW1lI3JlY29uZmlndXJlfSwge0BsaW5rIERhdGVUaW1lI3NldFpvbmV9LCB7QGxpbmsgRGF0ZVRpbWUjc2V0TG9jYWxlfSwge0BsaW5rIERhdGVUaW1lLnBsdXN9LCB7QGxpbmsgRGF0ZVRpbWUjbWludXN9LCB7QGxpbmsgRGF0ZVRpbWUjZW5kT2Z9LCB7QGxpbmsgRGF0ZVRpbWUjc3RhcnRPZn0sIHtAbGluayBEYXRlVGltZSN0b1VUQ30sIGFuZCB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbH0uXG4gKiAqICoqT3V0cHV0Kio6IFRvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgdXNlIHRoZSB7QGxpbmsgRGF0ZVRpbWUjdG9SZWxhdGl2ZX0sIHtAbGluayBEYXRlVGltZSN0b1JlbGF0aXZlQ2FsZW5kYXJ9LCB7QGxpbmsgRGF0ZVRpbWUjdG9KU09OfSwge0BsaW5rIERhdGVUaW1lI3RvSVNPfSwge0BsaW5rIERhdGVUaW1lI3RvSFRUUH0sIHtAbGluayBEYXRlVGltZSN0b09iamVjdH0sIHtAbGluayBEYXRlVGltZSN0b1JGQzI4MjJ9LCB7QGxpbmsgRGF0ZVRpbWUjdG9TdHJpbmd9LCB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9LCB7QGxpbmsgRGF0ZVRpbWUjdG9Gb3JtYXR9LCB7QGxpbmsgRGF0ZVRpbWUjdG9NaWxsaXN9IGFuZCB7QGxpbmsgRGF0ZVRpbWUjdG9KU0RhdGV9LlxuICpcbiAqIFRoZXJlJ3MgcGxlbnR5IG90aGVycyBkb2N1bWVudGVkIGJlbG93LiBJbiBhZGRpdGlvbiwgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3VidGxlciB0b3BpY3MgbGlrZSBpbnRlcm5hdGlvbmFsaXphdGlvbiwgdGltZSB6b25lcywgYWx0ZXJuYXRpdmUgY2FsZW5kYXJzLCB2YWxpZGl0eSwgYW5kIHNvIG9uLCBzZWUgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGVUaW1lIHtcbiAgLyoqXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgY29uc3Qgem9uZSA9IGNvbmZpZy56b25lIHx8IFNldHRpbmdzLmRlZmF1bHRab25lO1xuXG4gICAgbGV0IGludmFsaWQgPVxuICAgICAgY29uZmlnLmludmFsaWQgfHxcbiAgICAgIChOdW1iZXIuaXNOYU4oY29uZmlnLnRzKSA/IG5ldyBJbnZhbGlkKFwiaW52YWxpZCBpbnB1dFwiKSA6IG51bGwpIHx8XG4gICAgICAoIXpvbmUuaXNWYWxpZCA/IHVuc3VwcG9ydGVkWm9uZSh6b25lKSA6IG51bGwpO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMudHMgPSBpc1VuZGVmaW5lZChjb25maWcudHMpID8gU2V0dGluZ3Mubm93KCkgOiBjb25maWcudHM7XG5cbiAgICBsZXQgYyA9IG51bGwsXG4gICAgICBvID0gbnVsbDtcbiAgICBpZiAoIWludmFsaWQpIHtcbiAgICAgIGNvbnN0IHVuY2hhbmdlZCA9IGNvbmZpZy5vbGQgJiYgY29uZmlnLm9sZC50cyA9PT0gdGhpcy50cyAmJiBjb25maWcub2xkLnpvbmUuZXF1YWxzKHpvbmUpO1xuXG4gICAgICBpZiAodW5jaGFuZ2VkKSB7XG4gICAgICAgIFtjLCBvXSA9IFtjb25maWcub2xkLmMsIGNvbmZpZy5vbGQub107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBvdCA9IHpvbmUub2Zmc2V0KHRoaXMudHMpO1xuICAgICAgICBjID0gdHNUb09iaih0aGlzLnRzLCBvdCk7XG4gICAgICAgIGludmFsaWQgPSBOdW1iZXIuaXNOYU4oYy55ZWFyKSA/IG5ldyBJbnZhbGlkKFwiaW52YWxpZCBpbnB1dFwiKSA6IG51bGw7XG4gICAgICAgIGMgPSBpbnZhbGlkID8gbnVsbCA6IGM7XG4gICAgICAgIG8gPSBpbnZhbGlkID8gbnVsbCA6IG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3pvbmUgPSB6b25lO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubG9jID0gY29uZmlnLmxvYyB8fCBMb2NhbGUuY3JlYXRlKCk7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pbnZhbGlkID0gaW52YWxpZDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLndlZWtEYXRhID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmMgPSBjO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubyA9IG87XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pc0x1eG9uRGF0ZVRpbWUgPSB0cnVlO1xuICB9XG5cbiAgLy8gQ09OU1RSVUNUXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZvciB0aGUgY3VycmVudCBpbnN0YW50LCBpbiB0aGUgc3lzdGVtJ3MgdGltZSB6b25lLlxuICAgKlxuICAgKiBVc2UgU2V0dGluZ3MgdG8gb3ZlcnJpZGUgdGhlc2UgZGVmYXVsdCB2YWx1ZXMgaWYgbmVlZGVkLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0lTTygpIC8vfj4gbm93IGluIHRoZSBJU08gZm9ybWF0XG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIG5vdygpIHtcbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBsb2NhbCBEYXRlVGltZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW3llYXJdIC0gVGhlIGNhbGVuZGFyIHllYXIuIElmIG9taXR0ZWQgKGFzIGluLCBjYWxsIGBsb2NhbCgpYCB3aXRoIG5vIGFyZ3VtZW50cyksIHRoZSBjdXJyZW50IHRpbWUgd2lsbCBiZSB1c2VkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbW9udGg9MV0gLSBUaGUgbW9udGgsIDEtaW5kZXhlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoLCAxLWluZGV4ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWludXRlPTBdIC0gVGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2Vjb25kPTBdIC0gVGhlIHNlY29uZCBvZiB0aGUgbWludXRlLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiBub3dcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoeyB6b25lOiBcIkFtZXJpY2EvTmV3X1lvcmtcIiB9KSAgICAgIC8vfj4gbm93LCBpbiBVUyBlYXN0IGNvYXN0IHRpbWVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDEtMDFUMDA6MDA6MDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMDFUMDA6MDA6MDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIHsgbG9jYWxlOiBcImZyXCIgfSkgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMCwgd2l0aCBhIEZyZW5jaCBsb2NhbGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUpICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIHsgem9uZTogXCJ1dGNcIiB9KSAgIC8vfj4gMjAxNy0wMy0xMlQwNTowMDowMCwgaW4gVVRDXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSkgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTApICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTAsIDc2NSkgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBsb2NhbCgpIHtcbiAgICBjb25zdCBbb3B0cywgYXJnc10gPSBsYXN0T3B0cyhhcmd1bWVudHMpLFxuICAgICAgW3llYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF0gPSBhcmdzO1xuICAgIHJldHVybiBxdWlja0RUKHsgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kIH0sIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGluIFVUQ1xuICAgKiBAcGFyYW0ge251bWJlcn0gW3llYXJdIC0gVGhlIGNhbGVuZGFyIHllYXIuIElmIG9taXR0ZWQgKGFzIGluLCBjYWxsIGB1dGMoKWAgd2l0aCBubyBhcmd1bWVudHMpLCB0aGUgY3VycmVudCB0aW1lIHdpbGwgYmUgdXNlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXk9MV0gLSBUaGUgZGF5IG9mIHRoZSBtb250aFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2hvdXI9MF0gLSBUaGUgaG91ciBvZiB0aGUgZGF5LCBpbiAyNC1ob3VyIHRpbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtzZWNvbmQ9MF0gLSBUaGUgc2Vjb25kIG9mIHRoZSBtaW51dGUsIG1lYW5pbmcgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbGxpc2Vjb25kPTBdIC0gVGhlIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQsIG1lYW5pbmcgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA5OTlcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5vdXRwdXRDYWxlbmRhcl0gLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW1dIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiBub3dcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMDFUMDA6MDA6MDBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MDBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUsIHsgbG9jYWxlOiBcImZyXCIgfSkgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwWiB3aXRoIGEgRnJlbmNoIGxvY2FsZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCkgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUsIDEwLCA3NjUsIHsgbG9jYWxlOiBcImZyXCIgfSkgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVogd2l0aCBhIEZyZW5jaCBsb2NhbGVcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgdXRjKCkge1xuICAgIGNvbnN0IFtvcHRzLCBhcmdzXSA9IGxhc3RPcHRzKGFyZ3VtZW50cyksXG4gICAgICBbeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kXSA9IGFyZ3M7XG5cbiAgICBvcHRzLnpvbmUgPSBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2U7XG4gICAgcmV0dXJuIHF1aWNrRFQoeyB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQgfSwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIEphdmFTY3JpcHQgRGF0ZSBvYmplY3QuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cbiAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gYSBKYXZhU2NyaXB0IERhdGUgb2JqZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGZyb21KU0RhdGUoZGF0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgdHMgPSBpc0RhdGUoZGF0ZSkgPyBkYXRlLnZhbHVlT2YoKSA6IE5hTjtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHRzKSkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoXCJpbnZhbGlkIGlucHV0XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHpvbmVUb1VzZSA9IG5vcm1hbGl6ZVpvbmUob3B0aW9ucy56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gICAgaWYgKCF6b25lVG9Vc2UuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQodW5zdXBwb3J0ZWRab25lKHpvbmVUb1VzZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgdHM6IHRzLFxuICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKG1lYW5pbmcgc2luY2UgMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIC0gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIDE5NzAgVVRDXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2NhbGVdIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGZyb21NaWxsaXMobWlsbGlzZWNvbmRzLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIWlzTnVtYmVyKG1pbGxpc2Vjb25kcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYGZyb21NaWxsaXMgcmVxdWlyZXMgYSBudW1lcmljYWwgaW5wdXQsIGJ1dCByZWNlaXZlZCBhICR7dHlwZW9mIG1pbGxpc2Vjb25kc30gd2l0aCB2YWx1ZSAke21pbGxpc2Vjb25kc31gXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobWlsbGlzZWNvbmRzIDwgLU1BWF9EQVRFIHx8IG1pbGxpc2Vjb25kcyA+IE1BWF9EQVRFKSB7XG4gICAgICAvLyB0aGlzIGlzbid0IHBlcmZlY3QgYmVjYXVzZSBiZWNhdXNlIHdlIGNhbiBzdGlsbCBlbmQgdXAgb3V0IG9mIHJhbmdlIGJlY2F1c2Ugb2YgYWRkaXRpb25hbCBzaGlmdGluZywgYnV0IGl0J3MgYSBzdGFydFxuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoXCJUaW1lc3RhbXAgb3V0IG9mIHJhbmdlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgdHM6IG1pbGxpc2Vjb25kcyxcbiAgICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoIChtZWFuaW5nIHNpbmNlIDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNlY29uZHMgLSBhIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIDE5NzAgVVRDXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2NhbGVdIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGZyb21TZWNvbmRzKHNlY29uZHMsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghaXNOdW1iZXIoc2Vjb25kcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcImZyb21TZWNvbmRzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgdHM6IHNlY29uZHMgKiAxMDAwLFxuICAgICAgICB6b25lOiBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9wdGlvbnMpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhU2NyaXB0IG9iamVjdCB3aXRoIGtleXMgbGlrZSAneWVhcicgYW5kICdob3VyJyB3aXRoIHJlYXNvbmFibGUgZGVmYXVsdHMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgRGF0ZVRpbWUgZnJvbVxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnllYXIgLSBhIHllYXIsIHN1Y2ggYXMgMTk4N1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1vbnRoIC0gYSBtb250aCwgMS0xMlxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmRheSAtIGEgZGF5IG9mIHRoZSBtb250aCwgMS0zMSwgZGVwZW5kaW5nIG9uIHRoZSBtb250aFxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm9yZGluYWwgLSBkYXkgb2YgdGhlIHllYXIsIDEtMzY1IG9yIDM2NlxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtZZWFyIC0gYW4gSVNPIHdlZWsgeWVhclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtOdW1iZXIgLSBhbiBJU08gd2VlayBudW1iZXIsIGJldHdlZW4gMSBhbmQgNTIgb3IgNTMsIGRlcGVuZGluZyBvbiB0aGUgeWVhclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtkYXkgLSBhbiBJU08gd2Vla2RheSwgMS03LCB3aGVyZSAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5ob3VyIC0gaG91ciBvZiB0aGUgZGF5LCAwLTIzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWludXRlIC0gbWludXRlIG9mIHRoZSBob3VyLCAwLTU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouc2Vjb25kIC0gc2Vjb25kIG9mIHRoZSBtaW51dGUsIDAtNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taWxsaXNlY29uZCAtIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQsIDAtOTk5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhpcyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gaW50ZXJwcmV0IHRoZSBudW1iZXJzIGluIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhciB6b25lLiBDYW4gdGFrZSBhbnkgdmFsdWUgdGFrZW4gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHNldFpvbmUoKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdzeXN0ZW0ncyBsb2NhbGUnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgeWVhcjogMTk4MiwgbW9udGg6IDUsIGRheTogMjV9KS50b0lTT0RhdGUoKSAvLz0+ICcxOTgyLTA1LTI1J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgeWVhcjogMTk4MiB9KS50b0lTT0RhdGUoKSAvLz0+ICcxOTgyLTAxLTAxJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9KSAvL34+IHRvZGF5IGF0IDEwOjI2OjA2XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2IH0sIHsgem9uZTogJ3V0YycgfSksXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2IH0sIHsgem9uZTogJ2xvY2FsJyB9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9LCB7IHpvbmU6ICdBbWVyaWNhL05ld19Zb3JrJyB9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgd2Vla1llYXI6IDIwMTYsIHdlZWtOdW1iZXI6IDIsIHdlZWtkYXk6IDMgfSkudG9JU09EYXRlKCkgLy89PiAnMjAxNi0wMS0xMydcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbU9iamVjdChvYmosIG9wdHMgPSB7fSkge1xuICAgIG9iaiA9IG9iaiB8fCB7fTtcbiAgICBjb25zdCB6b25lVG9Vc2UgPSBub3JtYWxpemVab25lKG9wdHMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lVG9Vc2UpKTtcbiAgICB9XG5cbiAgICBjb25zdCB0c05vdyA9IFNldHRpbmdzLm5vdygpLFxuICAgICAgb2Zmc2V0UHJvdmlzID0gem9uZVRvVXNlLm9mZnNldCh0c05vdyksXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplT2JqZWN0KG9iaiwgbm9ybWFsaXplVW5pdCksXG4gICAgICBjb250YWluc09yZGluYWwgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSxcbiAgICAgIGNvbnRhaW5zR3JlZ29yWWVhciA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLnllYXIpLFxuICAgICAgY29udGFpbnNHcmVnb3JNRCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm1vbnRoKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpLFxuICAgICAgY29udGFpbnNHcmVnb3IgPSBjb250YWluc0dyZWdvclllYXIgfHwgY29udGFpbnNHcmVnb3JNRCxcbiAgICAgIGRlZmluaXRlV2Vla0RlZiA9IG5vcm1hbGl6ZWQud2Vla1llYXIgfHwgbm9ybWFsaXplZC53ZWVrTnVtYmVyLFxuICAgICAgbG9jID0gTG9jYWxlLmZyb21PYmplY3Qob3B0cyk7XG5cbiAgICAvLyBjYXNlczpcbiAgICAvLyBqdXN0IGEgd2Vla2RheSAtPiB0aGlzIHdlZWsncyBpbnN0YW5jZSBvZiB0aGF0IHdlZWtkYXksIG5vIHdvcnJpZXNcbiAgICAvLyAoZ3JlZ29yaWFuIGRhdGEgb3Igb3JkaW5hbCkgKyAod2Vla1llYXIgb3Igd2Vla051bWJlcikgLT4gZXJyb3JcbiAgICAvLyAoZ3JlZ29yaWFuIG1vbnRoIG9yIGRheSkgKyBvcmRpbmFsIC0+IGVycm9yXG4gICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIHdlZWtzIG9yIG9yZGluYWxzIG9yIGdyZWdvcmlhbiwgZGVwZW5kaW5nIG9uIHdoYXQncyBzcGVjaWZpZWRcblxuICAgIGlmICgoY29udGFpbnNHcmVnb3IgfHwgY29udGFpbnNPcmRpbmFsKSAmJiBkZWZpbml0ZVdlZWtEZWYpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcbiAgICAgICAgXCJDYW4ndCBtaXggd2Vla1llYXIvd2Vla051bWJlciB1bml0cyB3aXRoIHllYXIvbW9udGgvZGF5IG9yIG9yZGluYWxzXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5zR3JlZ29yTUQgJiYgY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXCJDYW4ndCBtaXggb3JkaW5hbCBkYXRlcyB3aXRoIG1vbnRoL2RheVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VXZWVrRGF0YSA9IGRlZmluaXRlV2Vla0RlZiB8fCAobm9ybWFsaXplZC53ZWVrZGF5ICYmICFjb250YWluc0dyZWdvcik7XG5cbiAgICAvLyBjb25maWd1cmUgb3Vyc2VsdmVzIHRvIGRlYWwgd2l0aCBncmVnb3JpYW4gZGF0ZXMgb3Igd2VlayBzdHVmZlxuICAgIGxldCB1bml0cyxcbiAgICAgIGRlZmF1bHRWYWx1ZXMsXG4gICAgICBvYmpOb3cgPSB0c1RvT2JqKHRzTm93LCBvZmZzZXRQcm92aXMpO1xuICAgIGlmICh1c2VXZWVrRGF0YSkge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkV2Vla1VuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRXZWVrVW5pdFZhbHVlcztcbiAgICAgIG9iak5vdyA9IGdyZWdvcmlhblRvV2VlayhvYmpOb3cpO1xuICAgIH0gZWxzZSBpZiAoY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRPcmRpbmFsVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9PcmRpbmFsKG9iak5vdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZFVuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRVbml0VmFsdWVzO1xuICAgIH1cblxuICAgIC8vIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgbWlzc2luZyBzdHVmZlxuICAgIGxldCBmb3VuZEZpcnN0ID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB1IG9mIHVuaXRzKSB7XG4gICAgICBjb25zdCB2ID0gbm9ybWFsaXplZFt1XTtcbiAgICAgIGlmICghaXNVbmRlZmluZWQodikpIHtcbiAgICAgICAgZm91bmRGaXJzdCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGZvdW5kRmlyc3QpIHtcbiAgICAgICAgbm9ybWFsaXplZFt1XSA9IGRlZmF1bHRWYWx1ZXNbdV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub3JtYWxpemVkW3VdID0gb2JqTm93W3VdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIHdlIGhhdmUgYXJlIGluIHJhbmdlXG4gICAgY29uc3QgaGlnaGVyT3JkZXJJbnZhbGlkID0gdXNlV2Vla0RhdGFcbiAgICAgICAgPyBoYXNJbnZhbGlkV2Vla0RhdGEobm9ybWFsaXplZClcbiAgICAgICAgOiBjb250YWluc09yZGluYWxcbiAgICAgICAgPyBoYXNJbnZhbGlkT3JkaW5hbERhdGEobm9ybWFsaXplZClcbiAgICAgICAgOiBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShub3JtYWxpemVkKSxcbiAgICAgIGludmFsaWQgPSBoaWdoZXJPcmRlckludmFsaWQgfHwgaGFzSW52YWxpZFRpbWVEYXRhKG5vcm1hbGl6ZWQpO1xuXG4gICAgaWYgKGludmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWQpO1xuICAgIH1cblxuICAgIC8vIGNvbXB1dGUgdGhlIGFjdHVhbCB0aW1lXG4gICAgY29uc3QgZ3JlZ29yaWFuID0gdXNlV2Vla0RhdGFcbiAgICAgICAgPyB3ZWVrVG9HcmVnb3JpYW4obm9ybWFsaXplZClcbiAgICAgICAgOiBjb250YWluc09yZGluYWxcbiAgICAgICAgPyBvcmRpbmFsVG9HcmVnb3JpYW4obm9ybWFsaXplZClcbiAgICAgICAgOiBub3JtYWxpemVkLFxuICAgICAgW3RzRmluYWwsIG9mZnNldEZpbmFsXSA9IG9ialRvVFMoZ3JlZ29yaWFuLCBvZmZzZXRQcm92aXMsIHpvbmVUb1VzZSksXG4gICAgICBpbnN0ID0gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgdHM6IHRzRmluYWwsXG4gICAgICAgIHpvbmU6IHpvbmVUb1VzZSxcbiAgICAgICAgbzogb2Zmc2V0RmluYWwsXG4gICAgICAgIGxvYyxcbiAgICAgIH0pO1xuXG4gICAgLy8gZ3JlZ29yaWFuIGRhdGEgKyB3ZWVrZGF5IHNlcnZlcyBvbmx5IHRvIHZhbGlkYXRlXG4gICAgaWYgKG5vcm1hbGl6ZWQud2Vla2RheSAmJiBjb250YWluc0dyZWdvciAmJiBvYmoud2Vla2RheSAhPT0gaW5zdC53ZWVrZGF5KSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChcbiAgICAgICAgXCJtaXNtYXRjaGVkIHdlZWtkYXlcIixcbiAgICAgICAgYHlvdSBjYW4ndCBzcGVjaWZ5IGJvdGggYSB3ZWVrZGF5IG9mICR7bm9ybWFsaXplZC53ZWVrZGF5fSBhbmQgYSBkYXRlIG9mICR7aW5zdC50b0lTTygpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBJU08gODYwMSBzdHJpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSVNPIHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmVcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSBmaXhlZC1vZmZzZXQgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMub3V0cHV0Q2FsZW5kYXJdIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMrMDY6MDAnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcsIHtzZXRab25lOiB0cnVlfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnLCB7em9uZTogJ3V0Yyd9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LVcwNS00JylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbUlTTyh0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZUlTT0RhdGUodGV4dCk7XG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cywgXCJJU08gODYwMVwiLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIFJGQyAyODIyIHN0cmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBSRkMgMjgyMiBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lLiBTaW5jZSB0aGUgb2Zmc2V0IGlzIGFsd2F5cyBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaW5nLCBtZXJlbHkgdGhlIHpvbmUgdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpcyBleHByZXNzZWQgaW4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J3N5c3RlbSdzIGxvY2FsZSddIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCcyNSBOb3YgMjAxNiAxMzoyMzoxMiBHTVQnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tUkZDMjgyMignRnJpLCAyNSBOb3YgMjAxNiAxMzoyMzoxMiArMDYwMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCcyNSBOb3YgMjAxNiAxMzoyMyBaJylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbVJGQzI4MjIodGV4dCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgW3ZhbHMsIHBhcnNlZFpvbmVdID0gcGFyc2VSRkMyODIyRGF0ZSh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIlJGQyAyODIyXCIsIHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gSFRUUCBoZWFkZXIgZGF0ZVxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzMuaHRtbCNzZWMzLjMuMVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBIVFRQIGhlYWRlciBkYXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZS4gU2luY2UgSFRUUCBkYXRlcyBhcmUgYWx3YXlzIGluIFVUQywgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzdHJpbmcsIG1lcmVseSB0aGUgem9uZSB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGlzIGV4cHJlc3NlZCBpbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggdGhlIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nLiBGb3IgSFRUUCBkYXRlcywgdGhpcyBpcyBhbHdheXMgVVRDLCBzbyB0aGlzIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIGB6b25lYCBvcHRpb24gdG8gJ3V0YycsIGJ1dCB0aGlzIG9wdGlvbiBpcyBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBzaW1pbGFyIG1ldGhvZHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J3N5c3RlbSdzIGxvY2FsZSddIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4sIDA2IE5vdiAxOTk0IDA4OjQ5OjM3IEdNVCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW5kYXksIDA2LU5vdi05NCAwODo0OTozNyBHTVQnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSFRUUCgnU3VuIE5vdiAgNiAwODo0OTozNyAxOTk0JylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbUhUVFAodGV4dCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgW3ZhbHMsIHBhcnNlZFpvbmVdID0gcGFyc2VIVFRQRGF0ZSh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIkhUVFBcIiwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBpbnB1dCBzdHJpbmcgYW5kIGZvcm1hdCBzdHJpbmcuXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZS4gRm9yIGEgdGFibGUgb2YgdG9rZW5zIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbnMsIHNlZSBbaGVyZV0oaHR0cHM6Ly9tb21lbnQuZ2l0aHViLmlvL2x1eG9uLyMvcGFyc2luZz9pZD10YWJsZS1vZi10b2tlbnMpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZtdCAtIHRoZSBmb3JtYXQgdGhlIHN0cmluZyBpcyBleHBlY3RlZCB0byBiZSBpbiAoc2VlIHRoZSBsaW5rIGJlbG93IGZvciB0aGUgZm9ybWF0cylcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIHRoaXMgem9uZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSBzdHJpbmcgdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyBsb2NhbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIHRvIHRoaXMgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbUZvcm1hdCh0ZXh0LCBmbXQsIG9wdHMgPSB7fSkge1xuICAgIGlmIChpc1VuZGVmaW5lZCh0ZXh0KSB8fCBpc1VuZGVmaW5lZChmbXQpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJmcm9tRm9ybWF0IHJlcXVpcmVzIGFuIGlucHV0IHN0cmluZyBhbmQgYSBmb3JtYXRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsIH0gPSBvcHRzLFxuICAgICAgbG9jYWxlVG9Vc2UgPSBMb2NhbGUuZnJvbU9wdHMoe1xuICAgICAgICBsb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgZGVmYXVsdFRvRU46IHRydWUsXG4gICAgICB9KSxcbiAgICAgIFt2YWxzLCBwYXJzZWRab25lLCBpbnZhbGlkXSA9IHBhcnNlRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIGBmb3JtYXQgJHtmbXR9YCwgdGV4dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmcm9tRm9ybWF0IGluc3RlYWRcbiAgICovXG4gIHN0YXRpYyBmcm9tU3RyaW5nKHRleHQsIGZtdCwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXQodGV4dCwgZm10LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgU1FMIGRhdGUsIHRpbWUsIG9yIGRhdGV0aW1lXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIHRoaXMgem9uZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSBzdHJpbmcgdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyBsb2NhbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIHRvIHRoaXMgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNScpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MicpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyKzA2OjAwJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDIgQW1lcmljYS9Mb3NfQW5nZWxlcycpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnLCB7IHNldFpvbmU6IHRydWUgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInLCB7IHpvbmU6ICdBbWVyaWNhL0xvc19BbmdlbGVzJyB9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcwOToxMjozNC4zNDInKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tU1FMKHRleHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IFt2YWxzLCBwYXJzZWRab25lXSA9IHBhcnNlU1FMKHRleHQpO1xuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiU1FMXCIsIHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIERhdGVUaW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBEYXRlVGltZSBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uID0gbnVsbCkge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIERhdGVUaW1lIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREYXRlVGltZUVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHsgaW52YWxpZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgRGF0ZVRpbWUuIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0RhdGVUaW1lKG8pIHtcbiAgICByZXR1cm4gKG8gJiYgby5pc0x1eG9uRGF0ZVRpbWUpIHx8IGZhbHNlO1xuICB9XG5cbiAgLy8gSU5GT1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNywgNCkuZ2V0KCdtb250aCcpOyAvLz0+IDdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNywgNCkuZ2V0KCdkYXknKTsgLy89PiA0XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXNbdW5pdF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyB2YWxpZC4gSW52YWxpZCBEYXRlVGltZXMgb2NjdXIgd2hlbjpcbiAgICogKiBUaGUgRGF0ZVRpbWUgd2FzIGNyZWF0ZWQgZnJvbSBpbnZhbGlkIGNhbGVuZGFyIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSAxM3RoIG1vbnRoIG9yIEZlYnJ1YXJ5IDMwXG4gICAqICogVGhlIERhdGVUaW1lIHdhcyBjcmVhdGVkIGJ5IGFuIG9wZXJhdGlvbiBvbiBhbm90aGVyIGludmFsaWQgZGF0ZVxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLmludmFsaWQgPT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHRoaXMgRGF0ZVRpbWUgaXMgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRGF0ZVRpbWUgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkUmVhc29uKCkge1xuICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQucmVhc29uIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIERhdGVUaW1lIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEYXRlVGltZSBpcyB2YWxpZFxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGludmFsaWRFeHBsYW5hdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvY2FsZSBvZiBhIERhdGVUaW1lLCBzdWNoICdlbi1HQicuIFRoZSBsb2NhbGUgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5sb2NhbGUgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyaW5nIHN5c3RlbSBvZiBhIERhdGVUaW1lLCBzdWNoICdiZW5nJy4gVGhlIG51bWJlcmluZyBzeXN0ZW0gaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbnVtYmVyaW5nU3lzdGVtKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3V0cHV0IGNhbGVuZGFyIG9mIGEgRGF0ZVRpbWUsIHN1Y2ggJ2lzbGFtaWMnLiBUaGUgb3V0cHV0IGNhbGVuZGFyIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG91dHB1dENhbGVuZGFyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0aW1lIHpvbmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEB0eXBlIHtab25lfVxuICAgKi9cbiAgZ2V0IHpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3pvbmU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSB0aW1lIHpvbmUuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgem9uZU5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuem9uZS5uYW1lIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHllYXJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnllYXIgLy89PiAyMDE3XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgeWVhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnllYXIgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBxdWFydGVyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5xdWFydGVyIC8vPT4gMlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHF1YXJ0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IE1hdGguY2VpbCh0aGlzLmMubW9udGggLyAzKSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1vbnRoICgxLTEyKS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLm1vbnRoIC8vPT4gNVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG1vbnRoKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMubW9udGggOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkYXkgb2YgdGhlIG1vbnRoICgxLTMwaXNoKS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLmRheSAvLz0+IDI1XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuZGF5IDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaG91ciBvZiB0aGUgZGF5ICgwLTIzKS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDkpLmhvdXIgLy89PiA5XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgaG91cigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLmhvdXIgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaW51dGUgb2YgdGhlIGhvdXIgKDAtNTkpLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSwgMzApLm1pbnV0ZSAvLz0+IDMwXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbWludXRlKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMubWludXRlIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2Vjb25kIG9mIHRoZSBtaW51dGUgKDAtNTkpLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSwgMzAsIDUyKS5zZWNvbmQgLy89PiA1MlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHNlY29uZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnNlY29uZCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQgKDAtOTk5KS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1MiwgNjU0KS5taWxsaXNlY29uZCAvLz0+IDY1NFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG1pbGxpc2Vjb25kKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMubWlsbGlzZWNvbmQgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB3ZWVrIHllYXJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDEyLCAzMSkud2Vla1llYXIgLy89PiAyMDE1XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgd2Vla1llYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla1llYXIgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB3ZWVrIG51bWJlciBvZiB0aGUgd2VlayB5ZWFyICgxLTUyaXNoKS5cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS53ZWVrTnVtYmVyIC8vPT4gMjFcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrTnVtYmVyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtOdW1iZXIgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkYXkgb2YgdGhlIHdlZWsuXG4gICAqIDEgaXMgTW9uZGF5IGFuZCA3IGlzIFN1bmRheVxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMTEsIDMxKS53ZWVrZGF5IC8vPT4gNFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHdlZWtkYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla2RheSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG9yZGluYWwgKG1lYW5pbmcgdGhlIGRheSBvZiB0aGUgeWVhcilcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLm9yZGluYWwgLy89PiAxNDVcbiAgICogQHR5cGUge251bWJlcnxEYXRlVGltZX1cbiAgICovXG4gIGdldCBvcmRpbmFsKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKS5vcmRpbmFsIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgc2hvcnQgbW9udGggbmFtZSwgc3VjaCBhcyAnT2N0Jy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhTaG9ydCAvLz0+IE9jdFxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1vbnRoU2hvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ubW9udGhzKFwic2hvcnRcIiwgeyBsb2NPYmo6IHRoaXMubG9jIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBsb25nIG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdG9iZXInLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS5tb250aExvbmcgLy89PiBPY3RvYmVyXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbW9udGhMb25nKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLm1vbnRocyhcImxvbmdcIiwgeyBsb2NPYmo6IHRoaXMubG9jIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBzaG9ydCB3ZWVrZGF5LCBzdWNoIGFzICdNb24nLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS53ZWVrZGF5U2hvcnQgLy89PiBNb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCB3ZWVrZGF5U2hvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ud2Vla2RheXMoXCJzaG9ydFwiLCB7IGxvY09iajogdGhpcy5sb2MgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgbG9uZyB3ZWVrZGF5LCBzdWNoIGFzICdNb25kYXknLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS53ZWVrZGF5TG9uZyAvLz0+IE1vbmRheVxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHdlZWtkYXlMb25nKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLndlZWtkYXlzKFwibG9uZ1wiLCB7IGxvY09iajogdGhpcy5sb2MgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgVVRDIG9mZnNldCBvZiB0aGlzIERhdGVUaW1lIGluIG1pbnV0ZXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkub2Zmc2V0IC8vPT4gLTI0MFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5vZmZzZXQgLy89PiAwXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgb2Zmc2V0KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyArdGhpcy5vIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2hvcnQgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFU1RcIiBvciBcIkVEVFwiLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBvZmZzZXROYW1lU2hvcnQoKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuem9uZS5vZmZzZXROYW1lKHRoaXMudHMsIHtcbiAgICAgICAgZm9ybWF0OiBcInNob3J0XCIsXG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZyBodW1hbiBuYW1lIGZvciB0aGUgem9uZSdzIGN1cnJlbnQgb2Zmc2V0LCBmb3IgZXhhbXBsZSBcIkVhc3Rlcm4gU3RhbmRhcmQgVGltZVwiIG9yIFwiRWFzdGVybiBEYXlsaWdodCBUaW1lXCIuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG9mZnNldE5hbWVMb25nKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgIGZvcm1hdDogXCJsb25nXCIsXG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIHRoaXMgem9uZSdzIG9mZnNldCBldmVyIGNoYW5nZXMsIGFzIGluIGEgRFNULlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpc09mZnNldEZpeGVkKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUuaXNVbml2ZXJzYWwgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyBpbiBhIERTVC5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNJbkRTVCgpIHtcbiAgICBpZiAodGhpcy5pc09mZnNldEZpeGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMub2Zmc2V0ID4gdGhpcy5zZXQoeyBtb250aDogMSB9KS5vZmZzZXQgfHwgdGhpcy5vZmZzZXQgPiB0aGlzLnNldCh7IG1vbnRoOiA1IH0pLm9mZnNldFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgRGF0ZVRpbWUgaXMgaW4gYSBsZWFwIHllYXIsIGZhbHNlIG90aGVyd2lzZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2KS5pc0luTGVhcFllYXIgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLmlzSW5MZWFwWWVhciAvLz0+IGZhbHNlXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGlzSW5MZWFwWWVhcigpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcih0aGlzLnllYXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyBtb250aFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2LCAyKS5kYXlzSW5Nb250aCAvLz0+IDI5XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYsIDMpLmRheXNJbk1vbnRoIC8vPT4gMzFcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBkYXlzSW5Nb250aCgpIHtcbiAgICByZXR1cm4gZGF5c0luTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2KS5kYXlzSW5ZZWFyIC8vPT4gMzY2XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLmRheXNJblllYXIgLy89PiAzNjVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBkYXlzSW5ZZWFyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBkYXlzSW5ZZWFyKHRoaXMueWVhcikgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHdlZWtzIGluIHRoaXMgRGF0ZVRpbWUncyB5ZWFyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDA0KS53ZWVrc0luV2Vla1llYXIgLy89PiA1M1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS53ZWVrc0luV2Vla1llYXIgLy89PiA1MlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHdlZWtzSW5XZWVrWWVhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gd2Vla3NJbldlZWtZZWFyKHRoaXMud2Vla1llYXIpIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlc29sdmVkIEludGwgb3B0aW9ucyBmb3IgdGhpcyBEYXRlVGltZS5cbiAgICogVGhpcyBpcyB1c2VmdWwgaW4gdW5kZXJzdGFuZGluZyB0aGUgYmVoYXZpb3Igb2YgZm9ybWF0dGluZyBtZXRob2RzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gdGhlIHNhbWUgb3B0aW9ucyBhcyB0b0xvY2FsZVN0cmluZ1xuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICByZXNvbHZlZExvY2FsZU9wdGlvbnMob3B0cyA9IHt9KSB7XG4gICAgY29uc3QgeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgY2FsZW5kYXIgfSA9IEZvcm1hdHRlci5jcmVhdGUoXG4gICAgICB0aGlzLmxvYy5jbG9uZShvcHRzKSxcbiAgICAgIG9wdHNcbiAgICApLnJlc29sdmVkT3B0aW9ucyh0aGlzKTtcbiAgICByZXR1cm4geyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXI6IGNhbGVuZGFyIH07XG4gIH1cblxuICAvLyBUUkFOU0ZPUk1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgRGF0ZVRpbWUncyB6b25lIHRvIFVUQy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKlxuICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayBEYXRlVGltZS5zZXRab25lfSgndXRjJylcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBvcHRpb25hbGx5LCBhbiBvZmZzZXQgZnJvbSBVVEMgaW4gbWludXRlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHM9e31dIC0gb3B0aW9ucyB0byBwYXNzIHRvIGBzZXRab25lKClgXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgdG9VVEMob2Zmc2V0ID0gMCwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2Uob2Zmc2V0KSwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgRGF0ZVRpbWUncyB6b25lIHRvIHRoZSBob3N0J3MgbG9jYWwgem9uZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKlxuICAgKiBFcXVpdmFsZW50IHRvIGBzZXRab25lKCdsb2NhbCcpYFxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHRvTG9jYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgRGF0ZVRpbWUncyB6b25lIHRvIHNwZWNpZmllZCB6b25lLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBzZXR0ZXIga2VlcHMgdGhlIHVuZGVybHlpbmcgdGltZSB0aGUgc2FtZSAoYXMgaW4sIHRoZSBzYW1lIHRpbWVzdGFtcCksIGJ1dCB0aGUgbmV3IGluc3RhbmNlIHdpbGwgcmVwb3J0IGRpZmZlcmVudCBsb2NhbCB0aW1lcyBhbmQgY29uc2lkZXIgRFNUcyB3aGVuIG1ha2luZyBjb21wdXRhdGlvbnMsIGFzIHdpdGgge0BsaW5rIERhdGVUaW1lLnBsdXN9LiBZb3UgbWF5IHdpc2ggdG8gdXNlIHtAbGluayBEYXRlVGltZS50b0xvY2FsfSBhbmQge0BsaW5rIERhdGVUaW1lLnRvVVRDfSB3aGljaCBwcm92aWRlIHNpbXBsZSBjb252ZW5pZW5jZSB3cmFwcGVycyBmb3IgY29tbW9ubHkgdXNlZCB6b25lcy5cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBhIHpvbmUgaWRlbnRpZmllci4gQXMgYSBzdHJpbmcsIHRoYXQgY2FuIGJlIGFueSBJQU5BIHpvbmUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IGVudmlyb25tZW50LCBvciBhIGZpeGVkLW9mZnNldCBuYW1lIG9mIHRoZSBmb3JtICdVVEMrMycsIG9yIHRoZSBzdHJpbmdzICdsb2NhbCcgb3IgJ3V0YycuIFlvdSBtYXkgYWxzbyBzdXBwbHkgYW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgRGF0ZVRpbWUuWm9uZX0gY2xhc3MuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmtlZXBMb2NhbFRpbWU9ZmFsc2VdIC0gSWYgdHJ1ZSwgYWRqdXN0IHRoZSB1bmRlcmx5aW5nIHRpbWUgc28gdGhhdCB0aGUgbG9jYWwgdGltZSBzdGF5cyB0aGUgc2FtZSwgYnV0IGluIHRoZSB0YXJnZXQgem9uZS4gWW91IHNob3VsZCByYXJlbHkgbmVlZCB0aGlzLlxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHNldFpvbmUoem9uZSwgeyBrZWVwTG9jYWxUaW1lID0gZmFsc2UsIGtlZXBDYWxlbmRhclRpbWUgPSBmYWxzZSB9ID0ge30pIHtcbiAgICB6b25lID0gbm9ybWFsaXplWm9uZSh6b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gICAgaWYgKHpvbmUuZXF1YWxzKHRoaXMuem9uZSkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAoIXpvbmUuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQodW5zdXBwb3J0ZWRab25lKHpvbmUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG5ld1RTID0gdGhpcy50cztcbiAgICAgIGlmIChrZWVwTG9jYWxUaW1lIHx8IGtlZXBDYWxlbmRhclRpbWUpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0R3Vlc3MgPSB6b25lLm9mZnNldCh0aGlzLnRzKTtcbiAgICAgICAgY29uc3QgYXNPYmogPSB0aGlzLnRvT2JqZWN0KCk7XG4gICAgICAgIFtuZXdUU10gPSBvYmpUb1RTKGFzT2JqLCBvZmZzZXRHdWVzcywgem9uZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmUodGhpcywgeyB0czogbmV3VFMsIHpvbmUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvciBvdXRwdXRDYWxlbmRhci4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyAtIHRoZSBwcm9wZXJ0aWVzIHRvIHNldFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkucmVjb25maWd1cmUoeyBsb2NhbGU6ICdlbi1HQicgfSlcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICByZWNvbmZpZ3VyZSh7IGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhciB9ID0ge30pIHtcbiAgICBjb25zdCBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7IGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhciB9KTtcbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyBsb2MgfSk7XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgbG9jYWxlLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXG4gICAqIEp1c3QgYSBjb252ZW5pZW50IGFsaWFzIGZvciByZWNvbmZpZ3VyZSh7IGxvY2FsZSB9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkuc2V0TG9jYWxlKCdlbi1HQicpXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc2V0TG9jYWxlKGxvY2FsZSkge1xuICAgIHJldHVybiB0aGlzLnJlY29uZmlndXJlKHsgbG9jYWxlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIHZhbHVlcyBvZiBzcGVjaWZpZWQgdW5pdHMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICogWW91IGNhbiBvbmx5IHNldCB1bml0cyB3aXRoIHRoaXMgbWV0aG9kOyBmb3IgXCJzZXR0aW5nXCIgbWV0YWRhdGEsIHNlZSB7QGxpbmsgRGF0ZVRpbWUucmVjb25maWd1cmV9IGFuZCB7QGxpbmsgRGF0ZVRpbWUuc2V0Wm9uZX0uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSBhIG1hcHBpbmcgb2YgdW5pdHMgdG8gbnVtYmVyc1xuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB5ZWFyOiAyMDE3IH0pXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IGhvdXI6IDgsIG1pbnV0ZTogMzAgfSlcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgd2Vla2RheTogNSB9KVxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB5ZWFyOiAyMDA1LCBvcmRpbmFsOiAyMzQgfSlcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzZXQodmFsdWVzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIG5vcm1hbGl6ZVVuaXQpLFxuICAgICAgc2V0dGluZ1dlZWtTdHVmZiA9XG4gICAgICAgICFpc1VuZGVmaW5lZChub3JtYWxpemVkLndlZWtZZWFyKSB8fFxuICAgICAgICAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrTnVtYmVyKSB8fFxuICAgICAgICAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrZGF5KSxcbiAgICAgIGNvbnRhaW5zT3JkaW5hbCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpLFxuICAgICAgY29udGFpbnNHcmVnb3JZZWFyID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQueWVhciksXG4gICAgICBjb250YWluc0dyZWdvck1EID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQubW9udGgpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSksXG4gICAgICBjb250YWluc0dyZWdvciA9IGNvbnRhaW5zR3JlZ29yWWVhciB8fCBjb250YWluc0dyZWdvck1ELFxuICAgICAgZGVmaW5pdGVXZWVrRGVmID0gbm9ybWFsaXplZC53ZWVrWWVhciB8fCBub3JtYWxpemVkLndlZWtOdW1iZXI7XG5cbiAgICBpZiAoKGNvbnRhaW5zR3JlZ29yIHx8IGNvbnRhaW5zT3JkaW5hbCkgJiYgZGVmaW5pdGVXZWVrRGVmKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgIFwiQ2FuJ3QgbWl4IHdlZWtZZWFyL3dlZWtOdW1iZXIgdW5pdHMgd2l0aCB5ZWFyL21vbnRoL2RheSBvciBvcmRpbmFsc1wiXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjb250YWluc0dyZWdvck1EICYmIGNvbnRhaW5zT3JkaW5hbCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFwiQ2FuJ3QgbWl4IG9yZGluYWwgZGF0ZXMgd2l0aCBtb250aC9kYXlcIik7XG4gICAgfVxuXG4gICAgbGV0IG1peGVkO1xuICAgIGlmIChzZXR0aW5nV2Vla1N0dWZmKSB7XG4gICAgICBtaXhlZCA9IHdlZWtUb0dyZWdvcmlhbih7IC4uLmdyZWdvcmlhblRvV2Vlayh0aGlzLmMpLCAuLi5ub3JtYWxpemVkIH0pO1xuICAgIH0gZWxzZSBpZiAoIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQub3JkaW5hbCkpIHtcbiAgICAgIG1peGVkID0gb3JkaW5hbFRvR3JlZ29yaWFuKHsgLi4uZ3JlZ29yaWFuVG9PcmRpbmFsKHRoaXMuYyksIC4uLm5vcm1hbGl6ZWQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1peGVkID0geyAuLi50aGlzLnRvT2JqZWN0KCksIC4uLm5vcm1hbGl6ZWQgfTtcblxuICAgICAgLy8gaWYgd2UgZGlkbid0IHNldCB0aGUgZGF5IGJ1dCB3ZSBlbmRlZCB1cCBvbiBhbiBvdmVyZmxvdyBkYXRlLFxuICAgICAgLy8gdXNlIHRoZSBsYXN0IGRheSBvZiB0aGUgcmlnaHQgbW9udGhcbiAgICAgIGlmIChpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSkpIHtcbiAgICAgICAgbWl4ZWQuZGF5ID0gTWF0aC5taW4oZGF5c0luTW9udGgobWl4ZWQueWVhciwgbWl4ZWQubW9udGgpLCBtaXhlZC5kYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IFt0cywgb10gPSBvYmpUb1RTKG1peGVkLCB0aGlzLm8sIHRoaXMuem9uZSk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdHMsIG8gfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcGVyaW9kIG9mIHRpbWUgdG8gdGhpcyBEYXRlVGltZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVcbiAgICpcbiAgICogQWRkaW5nIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBvciBtaWxsaXNlY29uZHMgaW5jcmVhc2VzIHRoZSB0aW1lc3RhbXAgYnkgdGhlIHJpZ2h0IG51bWJlciBvZiBtaWxsaXNlY29uZHMuIEFkZGluZyBkYXlzLCBtb250aHMsIG9yIHllYXJzIHNoaWZ0cyB0aGUgY2FsZW5kYXIsIGFjY291bnRpbmcgZm9yIERTVHMgYW5kIGxlYXAgeWVhcnMgYWxvbmcgdGhlIHdheS4gVGh1cywgYGR0LnBsdXMoeyBob3VyczogMjQgfSlgIG1heSByZXN1bHQgaW4gYSBkaWZmZXJlbnQgdGltZSB0aGFuIGBkdC5wbHVzKHsgZGF5czogMSB9KWAgaWYgdGhlcmUncyBhIERTVCBzaGlmdCBpbiBiZXR3ZWVuLlxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBhZGQuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoMTIzKSAvL34+IGluIDEyMyBtaWxsaXNlY29uZHNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IG1pbnV0ZXM6IDE1IH0pIC8vfj4gaW4gMTUgbWludXRlc1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgZGF5czogMSB9KSAvL34+IHRoaXMgdGltZSB0b21vcnJvd1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgZGF5czogLTEgfSkgLy9+PiB0aGlzIHRpbWUgeWVzdGVyZGF5XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBob3VyczogMywgbWludXRlczogMTMgfSkgLy9+PiBpbiAzIGhyLCAxMyBtaW5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyhEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDMsIG1pbnV0ZXM6IDEzIH0pKSAvL34+IGluIDMgaHIsIDEzIG1pblxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIGFkanVzdFRpbWUodGhpcywgZHVyKSk7XG4gIH1cblxuICAvKipcbiAgICogU3VidHJhY3QgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxuICAgKiBTZWUge0BsaW5rIERhdGVUaW1lLnBsdXN9XG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIHN1YnRyYWN0LiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgQHJldHVybiB7RGF0ZVRpbWV9XG4gICovXG4gIG1pbnVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pLm5lZ2F0ZSgpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhpcyBEYXRlVGltZSB0byB0aGUgYmVnaW5uaW5nIG9mIGEgdW5pdCBvZiB0aW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIFRoZSB1bml0IHRvIGdvIHRvIHRoZSBiZWdpbm5pbmcgb2YuIENhbiBiZSAneWVhcicsICdxdWFydGVyJywgJ21vbnRoJywgJ3dlZWsnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsIG9yICdtaWxsaXNlY29uZCcuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLnN0YXJ0T2YoJ21vbnRoJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDMtMDEnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLnN0YXJ0T2YoJ3llYXInKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMS0wMSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZignd2VlaycpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAzLTAzJywgd2Vla3MgYWx3YXlzIHN0YXJ0IG9uIE1vbmRheXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLnN0YXJ0T2YoJ2RheScpLnRvSVNPVGltZSgpOyAvLz0+ICcwMDowMC4wMDAtMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5zdGFydE9mKCdob3VyJykudG9JU09UaW1lKCk7IC8vPT4gJzA1OjAwOjAwLjAwMC0wNTowMCdcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGFydE9mKHVuaXQpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgbyA9IHt9LFxuICAgICAgbm9ybWFsaXplZFVuaXQgPSBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHVuaXQpO1xuICAgIHN3aXRjaCAobm9ybWFsaXplZFVuaXQpIHtcbiAgICAgIGNhc2UgXCJ5ZWFyc1wiOlxuICAgICAgICBvLm1vbnRoID0gMTtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgXCJxdWFydGVyc1wiOlxuICAgICAgY2FzZSBcIm1vbnRoc1wiOlxuICAgICAgICBvLmRheSA9IDE7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIFwid2Vla3NcIjpcbiAgICAgIGNhc2UgXCJkYXlzXCI6XG4gICAgICAgIG8uaG91ciA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIFwiaG91cnNcIjpcbiAgICAgICAgby5taW51dGUgPSAwO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSBcIm1pbnV0ZXNcIjpcbiAgICAgICAgby5zZWNvbmQgPSAwO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSBcInNlY29uZHNcIjpcbiAgICAgICAgby5taWxsaXNlY29uZCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1pbGxpc2Vjb25kc1wiOlxuICAgICAgICBicmVhaztcbiAgICAgIC8vIG5vIGRlZmF1bHQsIGludmFsaWQgdW5pdHMgdGhyb3cgaW4gbm9ybWFsaXplVW5pdCgpXG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRVbml0ID09PSBcIndlZWtzXCIpIHtcbiAgICAgIG8ud2Vla2RheSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRVbml0ID09PSBcInF1YXJ0ZXJzXCIpIHtcbiAgICAgIGNvbnN0IHEgPSBNYXRoLmNlaWwodGhpcy5tb250aCAvIDMpO1xuICAgICAgby5tb250aCA9IChxIC0gMSkgKiAzICsgMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXQobyk7XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGlzIERhdGVUaW1lIHRvIHRoZSBlbmQgKG1lYW5pbmcgdGhlIGxhc3QgbWlsbGlzZWNvbmQpIG9mIGEgdW5pdCBvZiB0aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gVGhlIHVuaXQgdG8gZ28gdG8gdGhlIGVuZCBvZi4gQ2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ21vbnRoJykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0zMVQyMzo1OTo1OS45OTktMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLmVuZE9mKCd5ZWFyJykudG9JU08oKTsgLy89PiAnMjAxNC0xMi0zMVQyMzo1OTo1OS45OTktMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLmVuZE9mKCd3ZWVrJykudG9JU08oKTsgLy8gPT4gJzIwMTQtMDMtMDlUMjM6NTk6NTkuOTk5LTA1OjAwJywgd2Vla3Mgc3RhcnQgb24gTW9uZGF5c1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuZW5kT2YoJ2RheScpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMjM6NTk6NTkuOTk5LTA1OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuZW5kT2YoJ2hvdXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTAzVDA1OjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBlbmRPZih1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZFxuICAgICAgPyB0aGlzLnBsdXMoeyBbdW5pdF06IDEgfSlcbiAgICAgICAgICAuc3RhcnRPZih1bml0KVxuICAgICAgICAgIC5taW51cygxKVxuICAgICAgOiB0aGlzO1xuICB9XG5cbiAgLy8gT1VUUFVUXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cbiAgICogKipZb3UgbWF5IG5vdCB3YW50IHRoaXMuKiogU2VlIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9yIGEgbW9yZSBmbGV4aWJsZSBmb3JtYXR0aW5nIHRvb2wuIEZvciBhIHRhYmxlIG9mIHRva2VucyBhbmQgdGhlaXIgaW50ZXJwcmV0YXRpb25zLCBzZWUgW2hlcmVdKGh0dHBzOi8vbW9tZW50LmdpdGh1Yi5pby9sdXhvbi8jL2Zvcm1hdHRpbmc/aWQ9dGFibGUtb2YtdG9rZW5zKS5cbiAgICogRGVmYXVsdHMgdG8gZW4tVVMgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgbG9jYWxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRzIHRvIG92ZXJyaWRlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gdGhpcyBEYXRlVGltZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnKSAvLz0+ICcyMDE3IEFwciAyMidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkuc2V0TG9jYWxlKCdmcicpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgYXZyLiAyMidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Gb3JtYXQoJ3l5eXkgTExMIGRkJywgeyBsb2NhbGU6IFwiZnJcIiB9KSAvLz0+ICcyMDE3IGF2ci4gMjInXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvRm9ybWF0KFwiSEggJ2hvdXJzIGFuZCcgbW0gJ21pbnV0ZXMnXCIpIC8vPT4gJzIwIGhvdXJzIGFuZCA1NSBtaW51dGVzJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChmbXQsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5yZWRlZmF1bHRUb0VOKG9wdHMpKS5mb3JtYXREYXRlVGltZUZyb21TdHJpbmcodGhpcywgZm10KVxuICAgICAgOiBJTlZBTElEO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsb2NhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGRhdGUuIEFjY2VwdHMgdGhlIHNhbWUgb3B0aW9ucyBhcyB0aGUgSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBhbmQgYW55IHByZXNldHMgZGVmaW5lZCBieSBMdXhvbiwgc3VjaCBhcyBgRGF0ZVRpbWUuREFURV9GVUxMYCBvciBgRGF0ZVRpbWUuVElNRV9TSU1QTEVgLlxuICAgKiBUaGUgZXhhY3QgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgYnJvd3Nlci1zcGVjaWZpYywgYnV0IGluIGdlbmVyYWwgaXQgd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgcmVwcmVzZW50YXRpb25cbiAgICogb2YgdGhlIERhdGVUaW1lIGluIHRoZSBhc3NpZ25lZCBsb2NhbGUuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSBmb3JtYXRPcHRzIHtPYmplY3R9IC0gSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBvcHRpb25zIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRzIHRvIG92ZXJyaWRlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gdGhpcyBEYXRlVGltZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZygpOyAvLz0+IDQvMjAvMjAxN1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoJ2VuLWdiJykudG9Mb2NhbGVTdHJpbmcoKTsgLy89PiAnMjAvMDQvMjAxNydcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoeyBsb2NhbGU6ICdlbi1nYicgfSk7IC8vPT4gJzIwLzA0LzIwMTcnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfRlVMTCk7IC8vPT4gJ0FwcmlsIDIwLCAyMDE3J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5USU1FX1NJTVBMRSk7IC8vPT4gJzExOjMyIEFNJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFVElNRV9TSE9SVCk7IC8vPT4gJzQvMjAvMjAxNywgMTE6MzIgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgd2Vla2RheTogJ2xvbmcnLCBtb250aDogJ2xvbmcnLCBkYXk6ICcyLWRpZ2l0JyB9KTsgLy89PiAnVGh1cnNkYXksIEFwcmlsIDIwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyh7IHdlZWtkYXk6ICdzaG9ydCcsIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICcyLWRpZ2l0JywgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KTsgLy89PiAnVGh1LCBBcHIgMjAsIDExOjI3IEFNJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyh7IGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcsIGhvdXJDeWNsZTogJ2gyMycgfSk7IC8vPT4gJzExOjMyJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0xvY2FsZVN0cmluZyhmb3JtYXRPcHRzID0gRm9ybWF0cy5EQVRFX1NIT1JULCBvcHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkXG4gICAgICA/IEZvcm1hdHRlci5jcmVhdGUodGhpcy5sb2MuY2xvbmUob3B0cyksIGZvcm1hdE9wdHMpLmZvcm1hdERhdGVUaW1lKHRoaXMpXG4gICAgICA6IElOVkFMSUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBmb3JtYXQgXCJwYXJ0c1wiLCBtZWFuaW5nIGluZGl2aWR1YWwgdG9rZW5zIGFsb25nIHdpdGggbWV0YWRhdGEuIFRoaXMgaXMgYWxsb3dzIGNhbGxlcnMgdG8gcG9zdC1wcm9jZXNzIGluZGl2aWR1YWwgc2VjdGlvbnMgb2YgdGhlIGZvcm1hdHRlZCBvdXRwdXQuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0L2Zvcm1hdFRvUGFydHNcbiAgICogQHBhcmFtIG9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnMsIHNhbWUgYXMgYHRvTG9jYWxlU3RyaW5nYC5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVQYXJ0cygpOyAvLz0+IFtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdkYXknLCB2YWx1ZTogJzI1JyB9LFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2xpdGVyYWwnLCB2YWx1ZTogJy8nIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbW9udGgnLCB2YWx1ZTogJzA1JyB9LFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2xpdGVyYWwnLCB2YWx1ZTogJy8nIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAneWVhcicsIHZhbHVlOiAnMTk4MicgfVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiBdXG4gICAqL1xuICB0b0xvY2FsZVBhcnRzKG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKVxuICAgICAgOiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmZvcm1hdD0nZXh0ZW5kZWQnXSAtIGNob29zZSBiZXR3ZWVuIHRoZSBiYXNpYyBhbmQgZXh0ZW5kZWQgZm9ybWF0XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU08oKSAvLz0+ICcxOTgyLTA1LTI1VDAwOjAwOjAwLjAwMFonXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvSVNPKCkgLy89PiAnMjAxNy0wNC0yMlQyMDo0NzowNS4zMzUtMDQ6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvSVNPKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkgLy89PiAnMjAxNy0wNC0yMlQyMDo0NzowNS4zMzUnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvSVNPKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzIwMTcwNDIyVDIwNDcwNS4zMzUtMDQwMCdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU08ob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLnRvSVNPRGF0ZShvcHRzKX1UJHt0aGlzLnRvSVNPVGltZShvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09EYXRlKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzE5ODIwNTI1J1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTT0RhdGUoeyBmb3JtYXQgPSBcImV4dGVuZGVkXCIgfSA9IHt9KSB7XG4gICAgbGV0IGZtdCA9IGZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJ5eXl5TU1kZFwiIDogXCJ5eXl5LU1NLWRkXCI7XG4gICAgaWYgKHRoaXMueWVhciA+IDk5OTkpIHtcbiAgICAgIGZtdCA9IFwiK1wiICsgZm10O1xuICAgIH1cblxuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgZm10KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHdlZWsgZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPV2Vla0RhdGUoKSAvLz0+ICcxOTgyLVcyMS0yJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTT1dlZWtEYXRlKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgXCJra2trLSdXJ1dXLWNcIik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUncyB0aW1lIGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlUHJlZml4PWZhbHNlXSAtIGluY2x1ZGUgdGhlIGBUYCBwcmVmaXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmZvcm1hdD0nZXh0ZW5kZWQnXSAtIGNob29zZSBiZXR3ZWVuIHRoZSBiYXNpYyBhbmQgZXh0ZW5kZWQgZm9ybWF0XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnNldCh7IGhvdXI6IDcsIG1pbnV0ZTogMzQgfSkudG9JU09UaW1lKCkgLy89PiAnMDc6MzQ6MTkuMzYxWidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCwgc2Vjb25kczogMCwgbWlsbGlzZWNvbmRzOiAwIH0pLnRvSVNPVGltZSh7IHN1cHByZXNzU2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcwNzozNFonXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnNldCh7IGhvdXI6IDcsIG1pbnV0ZTogMzQgfSkudG9JU09UaW1lKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzA3MzQxOS4zNjFaJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5zZXQoeyBob3VyOiA3LCBtaW51dGU6IDM0IH0pLnRvSVNPVGltZSh7IGluY2x1ZGVQcmVmaXg6IHRydWUgfSkgLy89PiAnVDA3OjM0OjE5LjM2MVonXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSVNPVGltZSh7XG4gICAgc3VwcHJlc3NNaWxsaXNlY29uZHMgPSBmYWxzZSxcbiAgICBzdXBwcmVzc1NlY29uZHMgPSBmYWxzZSxcbiAgICBpbmNsdWRlT2Zmc2V0ID0gdHJ1ZSxcbiAgICBpbmNsdWRlUHJlZml4ID0gZmFsc2UsXG4gICAgZm9ybWF0ID0gXCJleHRlbmRlZFwiLFxuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdG9UZWNoVGltZUZvcm1hdCh0aGlzLCB7XG4gICAgICBzdXBwcmVzc1NlY29uZHMsXG4gICAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyxcbiAgICAgIGluY2x1ZGVPZmZzZXQsXG4gICAgICBpbmNsdWRlUHJlZml4LFxuICAgICAgZm9ybWF0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gUkZDIDI4MjItY29tcGF0aWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSwgYWx3YXlzIGluIFVUQ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgKzAwMDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1JGQzI4MjIoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwIC0wNDAwJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1JGQzI4MjIoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgWlpaXCIsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBIVFRQIGhlYWRlcnMuXG4gICAqIFNwZWNpZmljYWxseSwgdGhlIHN0cmluZyBjb25mb3JtcyB0byBSRkMgMTEyMy5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwIEdNVCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzLCAxOSkudG9IVFRQKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAxOTowMDowMCBHTVQnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSFRUUCgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMudG9VVEMoKSwgXCJFRUUsIGRkIExMTCB5eXl5IEhIOm1tOnNzICdHTVQnXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUxEYXRlKCkgLy89PiAnMjAxNC0wNy0xMydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TUUxEYXRlKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgXCJ5eXl5LU1NLWRkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVab25lPWZhbHNlXSAtIGluY2x1ZGUgdGhlIHpvbmUsIHN1Y2ggYXMgJ0FtZXJpY2EvTmV3X1lvcmsnLiBPdmVycmlkZXMgaW5jbHVkZU9mZnNldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS50b1NRTCgpIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUgLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoeyBpbmNsdWRlWm9uZTogZmFsc2UgfSkgLy89PiAnMDU6MTU6MTYuMzQ1IEFtZXJpY2EvTmV3X1lvcmsnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvU1FMVGltZSh7IGluY2x1ZGVPZmZzZXQgPSB0cnVlLCBpbmNsdWRlWm9uZSA9IGZhbHNlIH0gPSB7fSkge1xuICAgIHJldHVybiB0b1RlY2hUaW1lRm9ybWF0KHRoaXMsIHtcbiAgICAgIGluY2x1ZGVPZmZzZXQsXG4gICAgICBpbmNsdWRlWm9uZSxcbiAgICAgIHNwYWNlWm9uZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBTUUwgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVpvbmU9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgem9uZSwgc3VjaCBhcyAnQW1lcmljYS9OZXdfWW9yaycuIE92ZXJyaWRlcyBpbmNsdWRlT2Zmc2V0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUwoKSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCBaJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoKSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCAtMDQ6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzIwMTQtMDctMTMgMDA6MDA6MDAuMDAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlWm9uZTogdHJ1ZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCBBbWVyaWNhL05ld19Zb3JrJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1NRTChvcHRzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMudG9TUUxEYXRlKCl9ICR7dGhpcy50b1NRTFRpbWUob3B0cyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0lTTygpIDogSU5WQUxJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBtaWxsaXNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS4gQWxpYXMgb2Yge0BsaW5rIERhdGVUaW1lLnRvTWlsbGlzfVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICB2YWx1ZU9mKCkge1xuICAgIHJldHVybiB0aGlzLnRvTWlsbGlzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHRvTWlsbGlzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRzIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVwb2NoIHNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS5cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgdG9TZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRzIC8gMTAwMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBKU09OLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgQlNPTiBzZXJpYWxpemFibGUgZXF1aXZhbGVudCB0byB0aGlzIERhdGVUaW1lLlxuICAgKiBAcmV0dXJuIHtEYXRlfVxuICAgKi9cbiAgdG9CU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSlNEYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEYXRlVGltZSdzIHllYXIsIG1vbnRoLCBkYXksIGFuZCBzbyBvbi5cbiAgICogQHBhcmFtIG9wdHMgLSBvcHRpb25zIGZvciBnZW5lcmF0aW5nIHRoZSBvYmplY3RcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlQ29uZmlnPWZhbHNlXSAtIGluY2x1ZGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIGluIHRoZSBvdXRwdXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9PYmplY3QoKSAvLz0+IHsgeWVhcjogMjAxNywgbW9udGg6IDQsIGRheTogMjIsIGhvdXI6IDIwLCBtaW51dGU6IDQ5LCBzZWNvbmQ6IDQyLCBtaWxsaXNlY29uZDogMjY4IH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgdG9PYmplY3Qob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB7fTtcblxuICAgIGNvbnN0IGJhc2UgPSB7IC4uLnRoaXMuYyB9O1xuXG4gICAgaWYgKG9wdHMuaW5jbHVkZUNvbmZpZykge1xuICAgICAgYmFzZS5vdXRwdXRDYWxlbmRhciA9IHRoaXMub3V0cHV0Q2FsZW5kYXI7XG4gICAgICBiYXNlLm51bWJlcmluZ1N5c3RlbSA9IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbTtcbiAgICAgIGJhc2UubG9jYWxlID0gdGhpcy5sb2MubG9jYWxlO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSmF2YVNjcmlwdCBEYXRlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cbiAgICogQHJldHVybiB7RGF0ZX1cbiAgICovXG4gIHRvSlNEYXRlKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmlzVmFsaWQgPyB0aGlzLnRzIDogTmFOKTtcbiAgfVxuXG4gIC8vIENPTVBBUkVcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIERhdGVUaW1lcyBhcyBhIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlckRhdGVUaW1lIC0gdGhlIERhdGVUaW1lIHRvIGNvbXBhcmUgdGhpcyBvbmUgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgYXJyYXkgb2YgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIHRoZSBEdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQGV4YW1wbGVcbiAgICogdmFyIGkxID0gRGF0ZVRpbWUuZnJvbUlTTygnMTk4Mi0wNS0yNVQwOTo0NScpLFxuICAgKiAgICAgaTIgPSBEYXRlVGltZS5mcm9tSVNPKCcxOTgzLTEwLTE0VDEwOjMwJyk7XG4gICAqIGkyLmRpZmYoaTEpLnRvT2JqZWN0KCkgLy89PiB7IG1pbGxpc2Vjb25kczogNDM4MDc1MDAwMDAgfVxuICAgKiBpMi5kaWZmKGkxLCAnaG91cnMnKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMTIxNjguNzUgfVxuICAgKiBpMi5kaWZmKGkxLCBbJ21vbnRocycsICdkYXlzJ10pLnRvT2JqZWN0KCkgLy89PiB7IG1vbnRoczogMTYsIGRheXM6IDE5LjAzMTI1IH1cbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cycsICdob3VycyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOSwgaG91cnM6IDAuNzUgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIGRpZmYob3RoZXJEYXRlVGltZSwgdW5pdCA9IFwibWlsbGlzZWNvbmRzXCIsIG9wdHMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFvdGhlckRhdGVUaW1lLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5pbnZhbGlkKFwiY3JlYXRlZCBieSBkaWZmaW5nIGFuIGludmFsaWQgRGF0ZVRpbWVcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyT3B0cyA9IHsgbG9jYWxlOiB0aGlzLmxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtOiB0aGlzLm51bWJlcmluZ1N5c3RlbSwgLi4ub3B0cyB9O1xuXG4gICAgY29uc3QgdW5pdHMgPSBtYXliZUFycmF5KHVuaXQpLm1hcChEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgIG90aGVySXNMYXRlciA9IG90aGVyRGF0ZVRpbWUudmFsdWVPZigpID4gdGhpcy52YWx1ZU9mKCksXG4gICAgICBlYXJsaWVyID0gb3RoZXJJc0xhdGVyID8gdGhpcyA6IG90aGVyRGF0ZVRpbWUsXG4gICAgICBsYXRlciA9IG90aGVySXNMYXRlciA/IG90aGVyRGF0ZVRpbWUgOiB0aGlzLFxuICAgICAgZGlmZmVkID0gZGlmZihlYXJsaWVyLCBsYXRlciwgdW5pdHMsIGR1ck9wdHMpO1xuXG4gICAgcmV0dXJuIG90aGVySXNMYXRlciA/IGRpZmZlZC5uZWdhdGUoKSA6IGRpZmZlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCByaWdodCBub3cuXG4gICAqIFNlZSB7QGxpbmsgRGF0ZVRpbWUuZGlmZn1cbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgdW5pdHMgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIGRpZmZOb3codW5pdCA9IFwibWlsbGlzZWNvbmRzXCIsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmRpZmYoRGF0ZVRpbWUubm93KCksIHVuaXQsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCBzcGFubmluZyBiZXR3ZWVuIHRoaXMgRGF0ZVRpbWUgYW5kIGFub3RoZXIgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBlbmQgcG9pbnQgb2YgdGhlIEludGVydmFsXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgdW50aWwob3RoZXJEYXRlVGltZSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHRoaXMsIG90aGVyRGF0ZVRpbWUpIDogdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIERhdGVUaW1lIGlzIGluIHRoZSBzYW1lIHVuaXQgb2YgdGltZSBhcyBhbm90aGVyIERhdGVUaW1lLlxuICAgKiBIaWdoZXItb3JkZXIgdW5pdHMgbXVzdCBhbHNvIGJlIGlkZW50aWNhbCBmb3IgdGhpcyBmdW5jdGlvbiB0byByZXR1cm4gYHRydWVgLlxuICAgKiBOb3RlIHRoYXQgdGltZSB6b25lcyBhcmUgKippZ25vcmVkKiogaW4gdGhpcyBjb21wYXJpc29uLCB3aGljaCBjb21wYXJlcyB0aGUgKipsb2NhbCoqIGNhbGVuZGFyIHRpbWUuIFVzZSB7QGxpbmsgRGF0ZVRpbWUuc2V0Wm9uZX0gdG8gY29udmVydCBvbmUgb2YgdGhlIGRhdGVzIGlmIG5lZWRlZC5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY2hlY2sgc2FtZW5lc3Mgb25cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkuaGFzU2FtZShvdGhlckRULCAnZGF5Jyk7IC8vfj4gdHJ1ZSBpZiBvdGhlckRUIGlzIGluIHRoZSBzYW1lIGN1cnJlbnQgY2FsZW5kYXIgZGF5XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBoYXNTYW1lKG90aGVyRGF0ZVRpbWUsIHVuaXQpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgaW5wdXRNcyA9IG90aGVyRGF0ZVRpbWUudmFsdWVPZigpO1xuICAgIGNvbnN0IG90aGVyWm9uZURhdGVUaW1lID0gdGhpcy5zZXRab25lKG90aGVyRGF0ZVRpbWUuem9uZSwgeyBrZWVwTG9jYWxUaW1lOiB0cnVlIH0pO1xuICAgIHJldHVybiBvdGhlclpvbmVEYXRlVGltZS5zdGFydE9mKHVuaXQpIDw9IGlucHV0TXMgJiYgaW5wdXRNcyA8PSBvdGhlclpvbmVEYXRlVGltZS5lbmRPZih1bml0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFcXVhbGl0eSBjaGVja1xuICAgKiBUd28gRGF0ZVRpbWVzIGFyZSBlcXVhbCBpZmYgdGhleSByZXByZXNlbnQgdGhlIHNhbWUgbWlsbGlzZWNvbmQsIGhhdmUgdGhlIHNhbWUgem9uZSBhbmQgbG9jYXRpb24sIGFuZCBhcmUgYm90aCB2YWxpZC5cbiAgICogVG8gY29tcGFyZSBqdXN0IHRoZSBtaWxsaXNlY29uZCB2YWx1ZXMsIHVzZSBgK2R0MSA9PT0gK2R0MmAuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyIC0gdGhlIG90aGVyIERhdGVUaW1lXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc1ZhbGlkICYmXG4gICAgICBvdGhlci5pc1ZhbGlkICYmXG4gICAgICB0aGlzLnZhbHVlT2YoKSA9PT0gb3RoZXIudmFsdWVPZigpICYmXG4gICAgICB0aGlzLnpvbmUuZXF1YWxzKG90aGVyLnpvbmUpICYmXG4gICAgICB0aGlzLmxvYy5lcXVhbHMob3RoZXIubG9jKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHRoaXMgdGltZSByZWxhdGl2ZSB0byBub3csIHN1Y2ggYXMgXCJpbiB0d28gZGF5c1wiLiBDYW4gb25seSBpbnRlcm5hdGlvbmFsaXplIGlmIHlvdXJcbiAgICogcGxhdGZvcm0gc3VwcG9ydHMgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQuIFJvdW5kcyBkb3duIGJ5IGRlZmF1bHQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgb3V0cHV0XG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IFtvcHRpb25zLmJhc2U9RGF0ZVRpbWUubm93KCldIC0gdGhlIERhdGVUaW1lIHRvIHVzZSBhcyB0aGUgYmFzaXMgdG8gd2hpY2ggdGhpcyB0aW1lIGlzIGNvbXBhcmVkLiBEZWZhdWx0cyB0byBub3cuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdHlsZT1cImxvbmdcIl0gLSB0aGUgc3R5bGUgb2YgdW5pdHMsIG11c3QgYmUgXCJsb25nXCIsIFwic2hvcnRcIiwgb3IgXCJuYXJyb3dcIlxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gb3B0aW9ucy51bml0IC0gdXNlIGEgc3BlY2lmaWMgdW5pdCBvciBhcnJheSBvZiB1bml0czsgaWYgb21pdHRlZCwgb3IgYW4gYXJyYXksIHRoZSBtZXRob2Qgd2lsbCBwaWNrIHRoZSBiZXN0IHVuaXQuIFVzZSBhbiBhcnJheSBvciBvbmUgb2YgXCJ5ZWFyc1wiLCBcInF1YXJ0ZXJzXCIsIFwibW9udGhzXCIsIFwid2Vla3NcIiwgXCJkYXlzXCIsIFwiaG91cnNcIiwgXCJtaW51dGVzXCIsIG9yIFwic2Vjb25kc1wiXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucm91bmQ9dHJ1ZV0gLSB3aGV0aGVyIHRvIHJvdW5kIHRoZSBudW1iZXJzIGluIHRoZSBvdXRwdXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5wYWRkaW5nPTBdIC0gcGFkZGluZyBpbiBtaWxsaXNlY29uZHMuIFRoaXMgYWxsb3dzIHlvdSB0byByb3VuZCB1cCB0aGUgcmVzdWx0IGlmIGl0IGZpdHMgaW5zaWRlIHRoZSB0aHJlc2hvbGQuIERvbid0IHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIHtyb3VuZDogZmFsc2V9IGJlY2F1c2UgdGhlIGRlY2ltYWwgb3V0cHV0IHdpbGwgaW5jbHVkZSB0aGUgcGFkZGluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubG9jYWxlIC0gb3ZlcnJpZGUgdGhlIGxvY2FsZSBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIG92ZXJyaWRlIHRoZSBudW1iZXJpbmdTeXN0ZW0gb2YgdGhpcyBEYXRlVGltZS4gVGhlIEludGwgc3lzdGVtIG1heSBjaG9vc2Ugbm90IHRvIGhvbm9yIHRoaXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZSgpIC8vPT4gXCJpbiAxIGRheVwiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnNldExvY2FsZShcImVzXCIpLnRvUmVsYXRpdmUoeyBkYXlzOiAxIH0pIC8vPT4gXCJkZW50cm8gZGUgMSBkXHUwMEVEYVwiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBkYXlzOiAxIH0pLnRvUmVsYXRpdmUoeyBsb2NhbGU6IFwiZnJcIiB9KSAvLz0+IFwiZGFucyAyMyBoZXVyZXNcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5taW51cyh7IGRheXM6IDIgfSkudG9SZWxhdGl2ZSgpIC8vPT4gXCIyIGRheXMgYWdvXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkubWludXMoeyBkYXlzOiAyIH0pLnRvUmVsYXRpdmUoeyB1bml0OiBcImhvdXJzXCIgfSkgLy89PiBcIjQ4IGhvdXJzIGFnb1wiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgaG91cnM6IDM2IH0pLnRvUmVsYXRpdmUoeyByb3VuZDogZmFsc2UgfSkgLy89PiBcIjEuNSBkYXlzIGFnb1wiXG4gICAqL1xuICB0b1JlbGF0aXZlKG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBiYXNlID0gb3B0aW9ucy5iYXNlIHx8IERhdGVUaW1lLmZyb21PYmplY3Qoe30sIHsgem9uZTogdGhpcy56b25lIH0pLFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyA/ICh0aGlzIDwgYmFzZSA/IC1vcHRpb25zLnBhZGRpbmcgOiBvcHRpb25zLnBhZGRpbmcpIDogMDtcbiAgICBsZXQgdW5pdHMgPSBbXCJ5ZWFyc1wiLCBcIm1vbnRoc1wiLCBcImRheXNcIiwgXCJob3Vyc1wiLCBcIm1pbnV0ZXNcIiwgXCJzZWNvbmRzXCJdO1xuICAgIGxldCB1bml0ID0gb3B0aW9ucy51bml0O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudW5pdCkpIHtcbiAgICAgIHVuaXRzID0gb3B0aW9ucy51bml0O1xuICAgICAgdW5pdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGRpZmZSZWxhdGl2ZShiYXNlLCB0aGlzLnBsdXMocGFkZGluZyksIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBudW1lcmljOiBcImFsd2F5c1wiLFxuICAgICAgdW5pdHMsXG4gICAgICB1bml0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBkYXRlIHJlbGF0aXZlIHRvIHRvZGF5LCBzdWNoIGFzIFwieWVzdGVyZGF5XCIgb3IgXCJuZXh0IG1vbnRoXCIuXG4gICAqIE9ubHkgaW50ZXJuYXRpb25hbGl6ZXMgb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydHMgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgb3V0cHV0XG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IFtvcHRpb25zLmJhc2U9RGF0ZVRpbWUubm93KCldIC0gdGhlIERhdGVUaW1lIHRvIHVzZSBhcyB0aGUgYmFzaXMgdG8gd2hpY2ggdGhpcyB0aW1lIGlzIGNvbXBhcmVkLiBEZWZhdWx0cyB0byBub3cuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmxvY2FsZSAtIG92ZXJyaWRlIHRoZSBsb2NhbGUgb2YgdGhpcyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy51bml0IC0gdXNlIGEgc3BlY2lmaWMgdW5pdDsgaWYgb21pdHRlZCwgdGhlIG1ldGhvZCB3aWxsIHBpY2sgdGhlIHVuaXQuIFVzZSBvbmUgb2YgXCJ5ZWFyc1wiLCBcInF1YXJ0ZXJzXCIsIFwibW9udGhzXCIsIFwid2Vla3NcIiwgb3IgXCJkYXlzXCJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gb3ZlcnJpZGUgdGhlIG51bWJlcmluZ1N5c3RlbSBvZiB0aGlzIERhdGVUaW1lLiBUaGUgSW50bCBzeXN0ZW0gbWF5IGNob29zZSBub3QgdG8gaG9ub3IgdGhpc1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgZGF5czogMSB9KS50b1JlbGF0aXZlQ2FsZW5kYXIoKSAvLz0+IFwidG9tb3Jyb3dcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoXCJlc1wiKS5wbHVzKHsgZGF5czogMSB9KS50b1JlbGF0aXZlKCkgLy89PiBcIlwibWFcdTAwRjFhbmFcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgZGF5czogMSB9KS50b1JlbGF0aXZlQ2FsZW5kYXIoeyBsb2NhbGU6IFwiZnJcIiB9KSAvLz0+IFwiZGVtYWluXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkubWludXMoeyBkYXlzOiAyIH0pLnRvUmVsYXRpdmVDYWxlbmRhcigpIC8vPT4gXCIyIGRheXMgYWdvXCJcbiAgICovXG4gIHRvUmVsYXRpdmVDYWxlbmRhcihvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gZGlmZlJlbGF0aXZlKG9wdGlvbnMuYmFzZSB8fCBEYXRlVGltZS5mcm9tT2JqZWN0KHt9LCB7IHpvbmU6IHRoaXMuem9uZSB9KSwgdGhpcywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG51bWVyaWM6IFwiYXV0b1wiLFxuICAgICAgdW5pdHM6IFtcInllYXJzXCIsIFwibW9udGhzXCIsIFwiZGF5c1wiXSxcbiAgICAgIGNhbGVuZGFyeTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG1pbiBvZiBzZXZlcmFsIGRhdGUgdGltZXNcbiAgICogQHBhcmFtIHsuLi5EYXRlVGltZX0gZGF0ZVRpbWVzIC0gdGhlIERhdGVUaW1lcyBmcm9tIHdoaWNoIHRvIGNob29zZSB0aGUgbWluaW11bVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1pbiBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XG4gICAqL1xuICBzdGF0aWMgbWluKC4uLmRhdGVUaW1lcykge1xuICAgIGlmICghZGF0ZVRpbWVzLmV2ZXJ5KERhdGVUaW1lLmlzRGF0ZVRpbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJtaW4gcmVxdWlyZXMgYWxsIGFyZ3VtZW50cyBiZSBEYXRlVGltZXNcIik7XG4gICAgfVxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCAoaSkgPT4gaS52YWx1ZU9mKCksIE1hdGgubWluKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG1heCBvZiBzZXZlcmFsIGRhdGUgdGltZXNcbiAgICogQHBhcmFtIHsuLi5EYXRlVGltZX0gZGF0ZVRpbWVzIC0gdGhlIERhdGVUaW1lcyBmcm9tIHdoaWNoIHRvIGNob29zZSB0aGUgbWF4aW11bVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1heCBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XG4gICAqL1xuICBzdGF0aWMgbWF4KC4uLmRhdGVUaW1lcykge1xuICAgIGlmICghZGF0ZVRpbWVzLmV2ZXJ5KERhdGVUaW1lLmlzRGF0ZVRpbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJtYXggcmVxdWlyZXMgYWxsIGFyZ3VtZW50cyBiZSBEYXRlVGltZXNcIik7XG4gICAgfVxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCAoaSkgPT4gaS52YWx1ZU9mKCksIE1hdGgubWF4KTtcbiAgfVxuXG4gIC8vIE1JU0NcblxuICAvKipcbiAgICogRXhwbGFpbiBob3cgYSBzdHJpbmcgd291bGQgYmUgcGFyc2VkIGJ5IGZyb21Gb3JtYXQoKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZtdCAtIHRoZSBmb3JtYXQgdGhlIHN0cmluZyBpcyBleHBlY3RlZCB0byBiZSBpbiAoc2VlIGRlc2NyaXB0aW9uKVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGFrZW4gYnkgZnJvbUZvcm1hdCgpXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBmcm9tRm9ybWF0RXhwbGFpbih0ZXh0LCBmbXQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCB9ID0gb3B0aW9ucyxcbiAgICAgIGxvY2FsZVRvVXNlID0gTG9jYWxlLmZyb21PcHRzKHtcbiAgICAgICAgbG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGRlZmF1bHRUb0VOOiB0cnVlLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZVRvVXNlLCB0ZXh0LCBmbXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmcm9tRm9ybWF0RXhwbGFpbiBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgZnJvbVN0cmluZ0V4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdEV4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIEZPUk1BVCBQUkVTRVRTXG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgMTAvMTQvMTk4M1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFX1NIT1JUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVfU0hPUlQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzJ1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFX01FRCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFX01FRDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUudG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmksIE9jdCAxNCwgMTk4MydcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9NRURfV0lUSF9XRUVLREFZKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVfTUVEX1dJVEhfV0VFS0RBWTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUudG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzJ1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFX0ZVTEwoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURV9GVUxMO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ1R1ZXNkYXksIE9jdG9iZXIgMTQsIDE5ODMnXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVfSFVHRSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFX0hVR0U7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV9TSU1QTEUoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV9TSU1QTEU7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV9XSVRIX1NFQ09ORFM7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV9XSVRIX1NIT1JUX09GRlNFVDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUudG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV9XSVRIX0xPTkdfT0ZGU0VUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfV0lUSF9MT05HX09GRlNFVDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUudG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMCcsIGFsd2F5cyAyNC1ob3VyLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBUSU1FXzI0X1NJTVBMRSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5USU1FXzI0X1NJTVBMRTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUudG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMycsIGFsd2F5cyAyNC1ob3VyLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBUSU1FXzI0X1dJVEhfU0VDT05EUygpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5USU1FXzI0X1dJVEhfU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUudG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFRFQnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5USU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScsIGFsd2F5cyAyNC1ob3VyLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfU0hPUlQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfU0hPUlQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFVElNRV9NRUQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfTUVEO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFM7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpLCAxNCBPY3QgMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFVElNRV9NRURfV0lUSF9XRUVLREFZKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVk7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MywgOTozMCBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfRlVMTCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9GVUxMO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMsIDk6MzA6MzMgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaWRheSwgT2N0b2JlciAxNCwgMTk4MywgOTozMCBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfSFVHRSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9IVUdFO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaWRheSwgT2N0b2JlciAxNCwgMTk4MywgOTozMDozMyBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFM7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJpZW5kbHlEYXRlVGltZShkYXRlVGltZWlzaCkge1xuICBpZiAoRGF0ZVRpbWUuaXNEYXRlVGltZShkYXRlVGltZWlzaCkpIHtcbiAgICByZXR1cm4gZGF0ZVRpbWVpc2g7XG4gIH0gZWxzZSBpZiAoZGF0ZVRpbWVpc2ggJiYgZGF0ZVRpbWVpc2gudmFsdWVPZiAmJiBpc051bWJlcihkYXRlVGltZWlzaC52YWx1ZU9mKCkpKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21KU0RhdGUoZGF0ZVRpbWVpc2gpO1xuICB9IGVsc2UgaWYgKGRhdGVUaW1laXNoICYmIHR5cGVvZiBkYXRlVGltZWlzaCA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tT2JqZWN0KGRhdGVUaW1laXNoKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICBgVW5rbm93biBkYXRldGltZSBhcmd1bWVudDogJHtkYXRlVGltZWlzaH0sIG9mIHR5cGUgJHt0eXBlb2YgZGF0ZVRpbWVpc2h9YFxuICAgICk7XG4gIH1cbn1cbiIsICJpbXBvcnQgRGF0ZVRpbWUgZnJvbSBcIi4vZGF0ZXRpbWUuanNcIjtcbmltcG9ydCBEdXJhdGlvbiBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuaW1wb3J0IEludGVydmFsIGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5pbXBvcnQgSW5mbyBmcm9tIFwiLi9pbmZvLmpzXCI7XG5pbXBvcnQgWm9uZSBmcm9tIFwiLi96b25lLmpzXCI7XG5pbXBvcnQgRml4ZWRPZmZzZXRab25lIGZyb20gXCIuL3pvbmVzL2ZpeGVkT2Zmc2V0Wm9uZS5qc1wiO1xuaW1wb3J0IElBTkFab25lIGZyb20gXCIuL3pvbmVzL0lBTkFab25lLmpzXCI7XG5pbXBvcnQgSW52YWxpZFpvbmUgZnJvbSBcIi4vem9uZXMvaW52YWxpZFpvbmUuanNcIjtcbmltcG9ydCBTeXN0ZW1ab25lIGZyb20gXCIuL3pvbmVzL3N5c3RlbVpvbmUuanNcIjtcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi9zZXR0aW5ncy5qc1wiO1xuXG5jb25zdCBWRVJTSU9OID0gXCIyLjAuMlwiO1xuXG5leHBvcnQge1xuICBWRVJTSU9OLFxuICBEYXRlVGltZSxcbiAgRHVyYXRpb24sXG4gIEludGVydmFsLFxuICBJbmZvLFxuICBab25lLFxuICBGaXhlZE9mZnNldFpvbmUsXG4gIElBTkFab25lLFxuICBJbnZhbGlkWm9uZSxcbiAgU3lzdGVtWm9uZSxcbiAgU2V0dGluZ3MsXG59O1xuIiwgIi8qXG5UdXJibyA3LjAuMC1yYy4yXG5Db3B5cmlnaHQgXHUwMEE5IDIwMjEgQmFzZWNhbXAsIExMQ1xuICovXG4oZnVuY3Rpb24gKCkge1xuICAgIGlmICh3aW5kb3cuUmVmbGVjdCA9PT0gdW5kZWZpbmVkIHx8IHdpbmRvdy5jdXN0b21FbGVtZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgQnVpbHRJbkhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qgd3JhcHBlckZvclRoZU5hbWUgPSB7XG4gICAgICAgICdIVE1MRWxlbWVudCc6IGZ1bmN0aW9uIEhUTUxFbGVtZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuY29uc3RydWN0KEJ1aWx0SW5IVE1MRWxlbWVudCwgW10sIHRoaXMuY29uc3RydWN0b3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cuSFRNTEVsZW1lbnQgPVxuICAgICAgICB3cmFwcGVyRm9yVGhlTmFtZVsnSFRNTEVsZW1lbnQnXTtcbiAgICBIVE1MRWxlbWVudC5wcm90b3R5cGUgPSBCdWlsdEluSFRNTEVsZW1lbnQucHJvdG90eXBlO1xuICAgIEhUTUxFbGVtZW50LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEhUTUxFbGVtZW50O1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihIVE1MRWxlbWVudCwgQnVpbHRJbkhUTUxFbGVtZW50KTtcbn0pKCk7XG5cbmNvbnN0IHN1Ym1pdHRlcnNCeUZvcm0gPSBuZXcgV2Vha01hcDtcbmZ1bmN0aW9uIGZpbmRTdWJtaXR0ZXJGcm9tQ2xpY2tUYXJnZXQodGFyZ2V0KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgPyB0YXJnZXQgOiB0YXJnZXQgaW5zdGFuY2VvZiBOb2RlID8gdGFyZ2V0LnBhcmVudEVsZW1lbnQgOiBudWxsO1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGVsZW1lbnQgPyBlbGVtZW50LmNsb3Nlc3QoXCJpbnB1dCwgYnV0dG9uXCIpIDogbnVsbDtcbiAgICByZXR1cm4gKGNhbmRpZGF0ZSA9PT0gbnVsbCB8fCBjYW5kaWRhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhbmRpZGF0ZS50eXBlKSA9PSBcInN1Ym1pdFwiID8gY2FuZGlkYXRlIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGNsaWNrQ2FwdHVyZWQoZXZlbnQpIHtcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBmaW5kU3VibWl0dGVyRnJvbUNsaWNrVGFyZ2V0KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKHN1Ym1pdHRlciAmJiBzdWJtaXR0ZXIuZm9ybSkge1xuICAgICAgICBzdWJtaXR0ZXJzQnlGb3JtLnNldChzdWJtaXR0ZXIuZm9ybSwgc3VibWl0dGVyKTtcbiAgICB9XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIGlmIChcIlN1Ym1pdEV2ZW50XCIgaW4gd2luZG93KVxuICAgICAgICByZXR1cm47XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGNsaWNrQ2FwdHVyZWQsIHRydWUpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudC5wcm90b3R5cGUsIFwic3VibWl0dGVyXCIsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBcInN1Ym1pdFwiICYmIHRoaXMudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1Ym1pdHRlcnNCeUZvcm0uZ2V0KHRoaXMudGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufSkoKTtcblxudmFyIEZyYW1lTG9hZGluZ1N0eWxlO1xuKGZ1bmN0aW9uIChGcmFtZUxvYWRpbmdTdHlsZSkge1xuICAgIEZyYW1lTG9hZGluZ1N0eWxlW1wiZWFnZXJcIl0gPSBcImVhZ2VyXCI7XG4gICAgRnJhbWVMb2FkaW5nU3R5bGVbXCJsYXp5XCJdID0gXCJsYXp5XCI7XG59KShGcmFtZUxvYWRpbmdTdHlsZSB8fCAoRnJhbWVMb2FkaW5nU3R5bGUgPSB7fSkpO1xuY2xhc3MgRnJhbWVFbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxvYWRlZCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gbmV3IEZyYW1lRWxlbWVudC5kZWxlZ2F0ZUNvbnN0cnVjdG9yKHRoaXMpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIFtcImRpc2FibGVkXCIsIFwibG9hZGluZ1wiLCBcInNyY1wiXTtcbiAgICB9XG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgIHRoaXMuZGVsZWdhdGUuY29ubmVjdCgpO1xuICAgIH1cbiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIHJlbG9hZCgpIHtcbiAgICAgICAgY29uc3QgeyBzcmMgfSA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3JjID0gbnVsbDtcbiAgICAgICAgdGhpcy5zcmMgPSBzcmM7XG4gICAgfVxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lID09IFwibG9hZGluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmxvYWRpbmdTdHlsZUNoYW5nZWQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lID09IFwic3JjXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuc291cmNlVVJMQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5kaXNhYmxlZENoYW5nZWQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc3JjKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7XG4gICAgfVxuICAgIHNldCBzcmModmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShcInNyY1wiLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbG9hZGluZygpIHtcbiAgICAgICAgcmV0dXJuIGZyYW1lTG9hZGluZ1N0eWxlRnJvbVN0cmluZyh0aGlzLmdldEF0dHJpYnV0ZShcImxvYWRpbmdcIikgfHwgXCJcIik7XG4gICAgfVxuICAgIHNldCBsb2FkaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoXCJsb2FkaW5nXCIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKFwibG9hZGluZ1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgIH1cbiAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgYXV0b3Njcm9sbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKFwiYXV0b3Njcm9sbFwiKTtcbiAgICB9XG4gICAgc2V0IGF1dG9zY3JvbGwodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShcImF1dG9zY3JvbGxcIiwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImF1dG9zY3JvbGxcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGNvbXBsZXRlKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZGVsZWdhdGUuaXNMb2FkaW5nO1xuICAgIH1cbiAgICBnZXQgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQgPT09IGRvY3VtZW50ICYmICF0aGlzLmlzUHJldmlldztcbiAgICB9XG4gICAgZ2V0IGlzUHJldmlldygpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMub3duZXJEb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRvY3VtZW50RWxlbWVudCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmhhc0F0dHJpYnV0ZShcImRhdGEtdHVyYm8tcHJldmlld1wiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmcmFtZUxvYWRpbmdTdHlsZUZyb21TdHJpbmcoc3R5bGUpIHtcbiAgICBzd2l0Y2ggKHN0eWxlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSBcImxhenlcIjogcmV0dXJuIEZyYW1lTG9hZGluZ1N0eWxlLmxhenk7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBGcmFtZUxvYWRpbmdTdHlsZS5lYWdlcjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFVSTChsb2NhdGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFVSTChsb2NhdGFibGUudG9TdHJpbmcoKSwgZG9jdW1lbnQuYmFzZVVSSSk7XG59XG5mdW5jdGlvbiBnZXRBbmNob3IodXJsKSB7XG4gICAgbGV0IGFuY2hvck1hdGNoO1xuICAgIGlmICh1cmwuaGFzaCkge1xuICAgICAgICByZXR1cm4gdXJsLmhhc2guc2xpY2UoMSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFuY2hvck1hdGNoID0gdXJsLmhyZWYubWF0Y2goLyMoLiopJC8pKSB7XG4gICAgICAgIHJldHVybiBhbmNob3JNYXRjaFsxXTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRFeHRlbnNpb24odXJsKSB7XG4gICAgcmV0dXJuIChnZXRMYXN0UGF0aENvbXBvbmVudCh1cmwpLm1hdGNoKC9cXC5bXi5dKiQvKSB8fCBbXSlbMF0gfHwgXCJcIjtcbn1cbmZ1bmN0aW9uIGlzSFRNTCh1cmwpIHtcbiAgICByZXR1cm4gISFnZXRFeHRlbnNpb24odXJsKS5tYXRjaCgvXig/OnxcXC4oPzpodG18aHRtbHx4aHRtbCkpJC8pO1xufVxuZnVuY3Rpb24gaXNQcmVmaXhlZEJ5KGJhc2VVUkwsIHVybCkge1xuICAgIGNvbnN0IHByZWZpeCA9IGdldFByZWZpeCh1cmwpO1xuICAgIHJldHVybiBiYXNlVVJMLmhyZWYgPT09IGV4cGFuZFVSTChwcmVmaXgpLmhyZWYgfHwgYmFzZVVSTC5ocmVmLnN0YXJ0c1dpdGgocHJlZml4KTtcbn1cbmZ1bmN0aW9uIGdldFJlcXVlc3RVUkwodXJsKSB7XG4gICAgY29uc3QgYW5jaG9yID0gZ2V0QW5jaG9yKHVybCk7XG4gICAgcmV0dXJuIGFuY2hvciAhPSBudWxsXG4gICAgICAgID8gdXJsLmhyZWYuc2xpY2UoMCwgLShhbmNob3IubGVuZ3RoICsgMSkpXG4gICAgICAgIDogdXJsLmhyZWY7XG59XG5mdW5jdGlvbiB0b0NhY2hlS2V5KHVybCkge1xuICAgIHJldHVybiBnZXRSZXF1ZXN0VVJMKHVybCk7XG59XG5mdW5jdGlvbiB1cmxzQXJlRXF1YWwobGVmdCwgcmlnaHQpIHtcbiAgICByZXR1cm4gZXhwYW5kVVJMKGxlZnQpLmhyZWYgPT0gZXhwYW5kVVJMKHJpZ2h0KS5ocmVmO1xufVxuZnVuY3Rpb24gZ2V0UGF0aENvbXBvbmVudHModXJsKSB7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMSk7XG59XG5mdW5jdGlvbiBnZXRMYXN0UGF0aENvbXBvbmVudCh1cmwpIHtcbiAgICByZXR1cm4gZ2V0UGF0aENvbXBvbmVudHModXJsKS5zbGljZSgtMSlbMF07XG59XG5mdW5jdGlvbiBnZXRQcmVmaXgodXJsKSB7XG4gICAgcmV0dXJuIGFkZFRyYWlsaW5nU2xhc2godXJsLm9yaWdpbiArIHVybC5wYXRobmFtZSk7XG59XG5mdW5jdGlvbiBhZGRUcmFpbGluZ1NsYXNoKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmVuZHNXaXRoKFwiL1wiKSA/IHZhbHVlIDogdmFsdWUgKyBcIi9cIjtcbn1cblxuY2xhc3MgRmV0Y2hSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IocmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIH1cbiAgICBnZXQgc3VjY2VlZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZS5vaztcbiAgICB9XG4gICAgZ2V0IGZhaWxlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnN1Y2NlZWRlZDtcbiAgICB9XG4gICAgZ2V0IGNsaWVudEVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXNDb2RlID49IDQwMCAmJiB0aGlzLnN0YXR1c0NvZGUgPD0gNDk5O1xuICAgIH1cbiAgICBnZXQgc2VydmVyRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXR1c0NvZGUgPj0gNTAwICYmIHRoaXMuc3RhdHVzQ29kZSA8PSA1OTk7XG4gICAgfVxuICAgIGdldCByZWRpcmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZS5yZWRpcmVjdGVkO1xuICAgIH1cbiAgICBnZXQgbG9jYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBleHBhbmRVUkwodGhpcy5yZXNwb25zZS51cmwpO1xuICAgIH1cbiAgICBnZXQgaXNIVE1MKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50VHlwZSAmJiB0aGlzLmNvbnRlbnRUeXBlLm1hdGNoKC9eKD86dGV4dFxcLyhbXlxcczssXStcXGIpP2h0bWx8YXBwbGljYXRpb25cXC94aHRtbFxcK3htbClcXGIvKTtcbiAgICB9XG4gICAgZ2V0IHN0YXR1c0NvZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLnN0YXR1cztcbiAgICB9XG4gICAgZ2V0IGNvbnRlbnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXIoXCJDb250ZW50LVR5cGVcIik7XG4gICAgfVxuICAgIGdldCByZXNwb25zZVRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLnRleHQoKTtcbiAgICB9XG4gICAgZ2V0IHJlc3BvbnNlSFRNTCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNIVE1MKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGVhZGVyKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2UuaGVhZGVycy5nZXQobmFtZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaChldmVudE5hbWUsIHsgdGFyZ2V0LCBjYW5jZWxhYmxlLCBkZXRhaWwgfSA9IHt9KSB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGNhbmNlbGFibGUsIGJ1YmJsZXM6IHRydWUsIGRldGFpbCB9KTtcbiAgICB2b2lkICh0YXJnZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICByZXR1cm4gZXZlbnQ7XG59XG5mdW5jdGlvbiBuZXh0QW5pbWF0aW9uRnJhbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlc29sdmUoKSkpO1xufVxuZnVuY3Rpb24gbmV4dEV2ZW50TG9vcFRpY2soKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDApKTtcbn1cbmZ1bmN0aW9uIG5leHRNaWNyb3Rhc2soKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuZnVuY3Rpb24gcGFyc2VIVE1MRG9jdW1lbnQoaHRtbCA9IFwiXCIpIHtcbiAgICByZXR1cm4gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCBcInRleHQvaHRtbFwiKTtcbn1cbmZ1bmN0aW9uIHVuaW5kZW50KHN0cmluZ3MsIC4uLnZhbHVlcykge1xuICAgIGNvbnN0IGxpbmVzID0gaW50ZXJwb2xhdGUoc3RyaW5ncywgdmFsdWVzKS5yZXBsYWNlKC9eXFxuLywgXCJcIikuc3BsaXQoXCJcXG5cIik7XG4gICAgY29uc3QgbWF0Y2ggPSBsaW5lc1swXS5tYXRjaCgvXlxccysvKTtcbiAgICBjb25zdCBpbmRlbnQgPSBtYXRjaCA/IG1hdGNoWzBdLmxlbmd0aCA6IDA7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChsaW5lID0+IGxpbmUuc2xpY2UoaW5kZW50KSkuam9pbihcIlxcblwiKTtcbn1cbmZ1bmN0aW9uIGludGVycG9sYXRlKHN0cmluZ3MsIHZhbHVlcykge1xuICAgIHJldHVybiBzdHJpbmdzLnJlZHVjZSgocmVzdWx0LCBzdHJpbmcsIGkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV0gPT0gdW5kZWZpbmVkID8gXCJcIiA6IHZhbHVlc1tpXTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIHN0cmluZyArIHZhbHVlO1xuICAgIH0sIFwiXCIpO1xufVxuZnVuY3Rpb24gdXVpZCgpIHtcbiAgICByZXR1cm4gQXJyYXkuYXBwbHkobnVsbCwgeyBsZW5ndGg6IDM2IH0pLm1hcCgoXywgaSkgPT4ge1xuICAgICAgICBpZiAoaSA9PSA4IHx8IGkgPT0gMTMgfHwgaSA9PSAxOCB8fCBpID09IDIzKSB7XG4gICAgICAgICAgICByZXR1cm4gXCItXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaSA9PSAxNCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiNFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGkgPT0gMTkpIHtcbiAgICAgICAgICAgIHJldHVybiAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNCkgKyA4KS50b1N0cmluZygxNik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTUpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgfVxuICAgIH0pLmpvaW4oXCJcIik7XG59XG5cbnZhciBGZXRjaE1ldGhvZDtcbihmdW5jdGlvbiAoRmV0Y2hNZXRob2QpIHtcbiAgICBGZXRjaE1ldGhvZFtGZXRjaE1ldGhvZFtcImdldFwiXSA9IDBdID0gXCJnZXRcIjtcbiAgICBGZXRjaE1ldGhvZFtGZXRjaE1ldGhvZFtcInBvc3RcIl0gPSAxXSA9IFwicG9zdFwiO1xuICAgIEZldGNoTWV0aG9kW0ZldGNoTWV0aG9kW1wicHV0XCJdID0gMl0gPSBcInB1dFwiO1xuICAgIEZldGNoTWV0aG9kW0ZldGNoTWV0aG9kW1wicGF0Y2hcIl0gPSAzXSA9IFwicGF0Y2hcIjtcbiAgICBGZXRjaE1ldGhvZFtGZXRjaE1ldGhvZFtcImRlbGV0ZVwiXSA9IDRdID0gXCJkZWxldGVcIjtcbn0pKEZldGNoTWV0aG9kIHx8IChGZXRjaE1ldGhvZCA9IHt9KSk7XG5mdW5jdGlvbiBmZXRjaE1ldGhvZEZyb21TdHJpbmcobWV0aG9kKSB7XG4gICAgc3dpdGNoIChtZXRob2QudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlIFwiZ2V0XCI6IHJldHVybiBGZXRjaE1ldGhvZC5nZXQ7XG4gICAgICAgIGNhc2UgXCJwb3N0XCI6IHJldHVybiBGZXRjaE1ldGhvZC5wb3N0O1xuICAgICAgICBjYXNlIFwicHV0XCI6IHJldHVybiBGZXRjaE1ldGhvZC5wdXQ7XG4gICAgICAgIGNhc2UgXCJwYXRjaFwiOiByZXR1cm4gRmV0Y2hNZXRob2QucGF0Y2g7XG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjogcmV0dXJuIEZldGNoTWV0aG9kLmRlbGV0ZTtcbiAgICB9XG59XG5jbGFzcyBGZXRjaFJlcXVlc3Qge1xuICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlLCBtZXRob2QsIGxvY2F0aW9uLCBib2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcykge1xuICAgICAgICB0aGlzLmFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMucmVzb2x2ZVJlcXVlc3RQcm9taXNlID0gKHZhbHVlKSA9PiB7IH07XG4gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmICh0aGlzLmlzSWRlbXBvdGVudCkge1xuICAgICAgICAgICAgdGhpcy51cmwgPSBtZXJnZUZvcm1EYXRhRW50cmllcyhsb2NhdGlvbiwgWy4uLmJvZHkuZW50cmllcygpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuICAgICAgICAgICAgdGhpcy51cmwgPSBsb2NhdGlvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbG9jYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVybDtcbiAgICB9XG4gICAgZ2V0IHBhcmFtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXJsLnNlYXJjaFBhcmFtcztcbiAgICB9XG4gICAgZ2V0IGVudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvZHkgPyBBcnJheS5mcm9tKHRoaXMuYm9keS5lbnRyaWVzKCkpIDogW107XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9XG4gICAgYXN5bmMgcGVyZm9ybSgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgeyBmZXRjaE9wdGlvbnMgfSA9IHRoaXM7XG4gICAgICAgIChfYiA9IChfYSA9IHRoaXMuZGVsZWdhdGUpLnByZXBhcmVIZWFkZXJzRm9yUmVxdWVzdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIHRoaXMuaGVhZGVycywgdGhpcyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWxsb3dSZXF1ZXN0VG9CZUludGVyY2VwdGVkKGZldGNoT3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnJlcXVlc3RTdGFydGVkKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLnVybC5ocmVmLCBmZXRjaE9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVjZWl2ZShyZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IubmFtZSAhPT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZXF1ZXN0RXJyb3JlZCh0aGlzLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnJlcXVlc3RGaW5pc2hlZCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyByZWNlaXZlKHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGZldGNoUmVzcG9uc2UgPSBuZXcgRmV0Y2hSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gZGlzcGF0Y2goXCJ0dXJibzpiZWZvcmUtZmV0Y2gtcmVzcG9uc2VcIiwgeyBjYW5jZWxhYmxlOiB0cnVlLCBkZXRhaWw6IHsgZmV0Y2hSZXNwb25zZSB9IH0pO1xuICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZXF1ZXN0UHJldmVudGVkSGFuZGxpbmdSZXNwb25zZSh0aGlzLCBmZXRjaFJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmZXRjaFJlc3BvbnNlLnN1Y2NlZWRlZCkge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZXF1ZXN0U3VjY2VlZGVkV2l0aFJlc3BvbnNlKHRoaXMsIGZldGNoUmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZXF1ZXN0RmFpbGVkV2l0aFJlc3BvbnNlKHRoaXMsIGZldGNoUmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmZXRjaFJlc3BvbnNlO1xuICAgIH1cbiAgICBnZXQgZmV0Y2hPcHRpb25zKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXRob2Q6IEZldGNoTWV0aG9kW3RoaXMubWV0aG9kXS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwic2FtZS1vcmlnaW5cIixcbiAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgIHJlZGlyZWN0OiBcImZvbGxvd1wiLFxuICAgICAgICAgICAgYm9keTogdGhpcy5ib2R5LFxuICAgICAgICAgICAgc2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgcmVmZXJyZXI6IChfYSA9IHRoaXMuZGVsZWdhdGUucmVmZXJyZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ocmVmXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldCBkZWZhdWx0SGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9odG1sLCBhcHBsaWNhdGlvbi94aHRtbCt4bWxcIlxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXQgaXNJZGVtcG90ZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRob2QgPT0gRmV0Y2hNZXRob2QuZ2V0O1xuICAgIH1cbiAgICBnZXQgYWJvcnRTaWduYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gICAgfVxuICAgIGFzeW5jIGFsbG93UmVxdWVzdFRvQmVJbnRlcmNlcHRlZChmZXRjaE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdEludGVyY2VwdGlvbiA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gdGhpcy5yZXNvbHZlUmVxdWVzdFByb21pc2UgPSByZXNvbHZlKTtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBkaXNwYXRjaChcInR1cmJvOmJlZm9yZS1mZXRjaC1yZXF1ZXN0XCIsIHsgY2FuY2VsYWJsZTogdHJ1ZSwgZGV0YWlsOiB7IGZldGNoT3B0aW9ucywgdXJsOiB0aGlzLnVybC5ocmVmLCByZXN1bWU6IHRoaXMucmVzb2x2ZVJlcXVlc3RQcm9taXNlIH0gfSk7XG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgICAgICAgICAgYXdhaXQgcmVxdWVzdEludGVyY2VwdGlvbjtcbiAgICB9XG59XG5mdW5jdGlvbiBtZXJnZUZvcm1EYXRhRW50cmllcyh1cmwsIGVudHJpZXMpIHtcbiAgICBjb25zdCBjdXJyZW50U2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNoKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChjdXJyZW50U2VhcmNoUGFyYW1zLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgY3VycmVudFNlYXJjaFBhcmFtcy5kZWxldGUobmFtZSk7XG4gICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbn1cblxuY2xhc3MgQXBwZWFyYW5jZU9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSwgZWxlbWVudCkge1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3QgPSBlbnRyaWVzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RFbnRyeSA9IGVudHJpZXMuc2xpY2UoLTEpWzBdO1xuICAgICAgICAgICAgaWYgKGxhc3RFbnRyeSA9PT0gbnVsbCB8fCBsYXN0RW50cnkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhc3RFbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuZWxlbWVudEFwcGVhcmVkSW5WaWV3cG9ydCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodGhpcy5pbnRlcnNlY3QpO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIudW5vYnNlcnZlKHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFN0cmVhbU1lc3NhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKGh0bWwpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgICAgIHRoaXMudGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgfVxuICAgIHN0YXRpYyB3cmFwKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBmcmFnbWVudCgpIHtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmZvcmVpZ25FbGVtZW50cykge1xuICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuaW1wb3J0Tm9kZShlbGVtZW50LCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgIH1cbiAgICBnZXQgZm9yZWlnbkVsZW1lbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZUNoaWxkcmVuLnJlZHVjZSgoc3RyZWFtRWxlbWVudHMsIGNoaWxkKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IFwidHVyYm8tc3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWy4uLnN0cmVhbUVsZW1lbnRzLCBjaGlsZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtRWxlbWVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFtdKTtcbiAgICB9XG4gICAgZ2V0IHRlbXBsYXRlQ2hpbGRyZW4oKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudGVtcGxhdGVFbGVtZW50LmNvbnRlbnQuY2hpbGRyZW4pO1xuICAgIH1cbn1cblN0cmVhbU1lc3NhZ2UuY29udGVudFR5cGUgPSBcInRleHQvdm5kLnR1cmJvLXN0cmVhbS5odG1sXCI7XG5cbnZhciBGb3JtU3VibWlzc2lvblN0YXRlO1xuKGZ1bmN0aW9uIChGb3JtU3VibWlzc2lvblN0YXRlKSB7XG4gICAgRm9ybVN1Ym1pc3Npb25TdGF0ZVtGb3JtU3VibWlzc2lvblN0YXRlW1wiaW5pdGlhbGl6ZWRcIl0gPSAwXSA9IFwiaW5pdGlhbGl6ZWRcIjtcbiAgICBGb3JtU3VibWlzc2lvblN0YXRlW0Zvcm1TdWJtaXNzaW9uU3RhdGVbXCJyZXF1ZXN0aW5nXCJdID0gMV0gPSBcInJlcXVlc3RpbmdcIjtcbiAgICBGb3JtU3VibWlzc2lvblN0YXRlW0Zvcm1TdWJtaXNzaW9uU3RhdGVbXCJ3YWl0aW5nXCJdID0gMl0gPSBcIndhaXRpbmdcIjtcbiAgICBGb3JtU3VibWlzc2lvblN0YXRlW0Zvcm1TdWJtaXNzaW9uU3RhdGVbXCJyZWNlaXZpbmdcIl0gPSAzXSA9IFwicmVjZWl2aW5nXCI7XG4gICAgRm9ybVN1Ym1pc3Npb25TdGF0ZVtGb3JtU3VibWlzc2lvblN0YXRlW1wic3RvcHBpbmdcIl0gPSA0XSA9IFwic3RvcHBpbmdcIjtcbiAgICBGb3JtU3VibWlzc2lvblN0YXRlW0Zvcm1TdWJtaXNzaW9uU3RhdGVbXCJzdG9wcGVkXCJdID0gNV0gPSBcInN0b3BwZWRcIjtcbn0pKEZvcm1TdWJtaXNzaW9uU3RhdGUgfHwgKEZvcm1TdWJtaXNzaW9uU3RhdGUgPSB7fSkpO1xudmFyIEZvcm1FbmN0eXBlO1xuKGZ1bmN0aW9uIChGb3JtRW5jdHlwZSkge1xuICAgIEZvcm1FbmN0eXBlW1widXJsRW5jb2RlZFwiXSA9IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCI7XG4gICAgRm9ybUVuY3R5cGVbXCJtdWx0aXBhcnRcIl0gPSBcIm11bHRpcGFydC9mb3JtLWRhdGFcIjtcbiAgICBGb3JtRW5jdHlwZVtcInBsYWluXCJdID0gXCJ0ZXh0L3BsYWluXCI7XG59KShGb3JtRW5jdHlwZSB8fCAoRm9ybUVuY3R5cGUgPSB7fSkpO1xuZnVuY3Rpb24gZm9ybUVuY3R5cGVGcm9tU3RyaW5nKGVuY29kaW5nKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgRm9ybUVuY3R5cGUubXVsdGlwYXJ0OiByZXR1cm4gRm9ybUVuY3R5cGUubXVsdGlwYXJ0O1xuICAgICAgICBjYXNlIEZvcm1FbmN0eXBlLnBsYWluOiByZXR1cm4gRm9ybUVuY3R5cGUucGxhaW47XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBGb3JtRW5jdHlwZS51cmxFbmNvZGVkO1xuICAgIH1cbn1cbmNsYXNzIEZvcm1TdWJtaXNzaW9uIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSwgZm9ybUVsZW1lbnQsIHN1Ym1pdHRlciwgbXVzdFJlZGlyZWN0ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEZvcm1TdWJtaXNzaW9uU3RhdGUuaW5pdGlhbGl6ZWQ7XG4gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICAgICAgdGhpcy5mb3JtRWxlbWVudCA9IGZvcm1FbGVtZW50O1xuICAgICAgICB0aGlzLnN1Ym1pdHRlciA9IHN1Ym1pdHRlcjtcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IGJ1aWxkRm9ybURhdGEoZm9ybUVsZW1lbnQsIHN1Ym1pdHRlcik7XG4gICAgICAgIHRoaXMuZmV0Y2hSZXF1ZXN0ID0gbmV3IEZldGNoUmVxdWVzdCh0aGlzLCB0aGlzLm1ldGhvZCwgdGhpcy5sb2NhdGlvbiwgdGhpcy5ib2R5KTtcbiAgICAgICAgdGhpcy5tdXN0UmVkaXJlY3QgPSBtdXN0UmVkaXJlY3Q7XG4gICAgfVxuICAgIGdldCBtZXRob2QoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKChfYSA9IHRoaXMuc3VibWl0dGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0QXR0cmlidXRlKFwiZm9ybW1ldGhvZFwiKSkgfHwgdGhpcy5mb3JtRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJtZXRob2RcIikgfHwgXCJcIjtcbiAgICAgICAgcmV0dXJuIGZldGNoTWV0aG9kRnJvbVN0cmluZyhtZXRob2QudG9Mb3dlckNhc2UoKSkgfHwgRmV0Y2hNZXRob2QuZ2V0O1xuICAgIH1cbiAgICBnZXQgYWN0aW9uKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGZvcm1FbGVtZW50QWN0aW9uID0gdHlwZW9mIHRoaXMuZm9ybUVsZW1lbnQuYWN0aW9uID09PSAnc3RyaW5nJyA/IHRoaXMuZm9ybUVsZW1lbnQuYWN0aW9uIDogbnVsbDtcbiAgICAgICAgcmV0dXJuICgoX2EgPSB0aGlzLnN1Ym1pdHRlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldEF0dHJpYnV0ZShcImZvcm1hY3Rpb25cIikpIHx8IHRoaXMuZm9ybUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiYWN0aW9uXCIpIHx8IGZvcm1FbGVtZW50QWN0aW9uIHx8IFwiXCI7XG4gICAgfVxuICAgIGdldCBsb2NhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGV4cGFuZFVSTCh0aGlzLmFjdGlvbik7XG4gICAgfVxuICAgIGdldCBib2R5KCkge1xuICAgICAgICBpZiAodGhpcy5lbmN0eXBlID09IEZvcm1FbmN0eXBlLnVybEVuY29kZWQgfHwgdGhpcy5tZXRob2QgPT0gRmV0Y2hNZXRob2QuZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyh0aGlzLnN0cmluZ0Zvcm1EYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1EYXRhO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBlbmN0eXBlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiBmb3JtRW5jdHlwZUZyb21TdHJpbmcoKChfYSA9IHRoaXMuc3VibWl0dGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0QXR0cmlidXRlKFwiZm9ybWVuY3R5cGVcIikpIHx8IHRoaXMuZm9ybUVsZW1lbnQuZW5jdHlwZSk7XG4gICAgfVxuICAgIGdldCBpc0lkZW1wb3RlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoUmVxdWVzdC5pc0lkZW1wb3RlbnQ7XG4gICAgfVxuICAgIGdldCBzdHJpbmdGb3JtRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmZvcm1EYXRhXS5yZWR1Y2UoKGVudHJpZXMsIFtuYW1lLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyaWVzLmNvbmNhdCh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IFtbbmFtZSwgdmFsdWVdXSA6IFtdKTtcbiAgICAgICAgfSwgW10pO1xuICAgIH1cbiAgICBhc3luYyBzdGFydCgpIHtcbiAgICAgICAgY29uc3QgeyBpbml0aWFsaXplZCwgcmVxdWVzdGluZyB9ID0gRm9ybVN1Ym1pc3Npb25TdGF0ZTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT0gaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSByZXF1ZXN0aW5nO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hSZXF1ZXN0LnBlcmZvcm0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBjb25zdCB7IHN0b3BwaW5nLCBzdG9wcGVkIH0gPSBGb3JtU3VibWlzc2lvblN0YXRlO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPSBzdG9wcGluZyAmJiB0aGlzLnN0YXRlICE9IHN0b3BwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdG9wcGluZztcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hSZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJlcGFyZUhlYWRlcnNGb3JSZXF1ZXN0KGhlYWRlcnMsIHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmlzSWRlbXBvdGVudCkge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBnZXRDb29raWVWYWx1ZShnZXRNZXRhQ29udGVudChcImNzcmYtcGFyYW1cIikpIHx8IGdldE1ldGFDb250ZW50KFwiY3NyZi10b2tlblwiKTtcbiAgICAgICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNTUkYtVG9rZW5cIl0gPSB0b2tlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhlYWRlcnNbXCJBY2NlcHRcIl0gPSBbU3RyZWFtTWVzc2FnZS5jb250ZW50VHlwZSwgaGVhZGVyc1tcIkFjY2VwdFwiXV0uam9pbihcIiwgXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3RTdGFydGVkKHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEZvcm1TdWJtaXNzaW9uU3RhdGUud2FpdGluZztcbiAgICAgICAgZGlzcGF0Y2goXCJ0dXJibzpzdWJtaXQtc3RhcnRcIiwgeyB0YXJnZXQ6IHRoaXMuZm9ybUVsZW1lbnQsIGRldGFpbDogeyBmb3JtU3VibWlzc2lvbjogdGhpcyB9IH0pO1xuICAgICAgICB0aGlzLmRlbGVnYXRlLmZvcm1TdWJtaXNzaW9uU3RhcnRlZCh0aGlzKTtcbiAgICB9XG4gICAgcmVxdWVzdFByZXZlbnRlZEhhbmRsaW5nUmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSB7IHN1Y2Nlc3M6IHJlc3BvbnNlLnN1Y2NlZWRlZCwgZmV0Y2hSZXNwb25zZTogcmVzcG9uc2UgfTtcbiAgICB9XG4gICAgcmVxdWVzdFN1Y2NlZWRlZFdpdGhSZXNwb25zZShyZXF1ZXN0LCByZXNwb25zZSkge1xuICAgICAgICBpZiAocmVzcG9uc2UuY2xpZW50RXJyb3IgfHwgcmVzcG9uc2Uuc2VydmVyRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuZm9ybVN1Ym1pc3Npb25GYWlsZWRXaXRoUmVzcG9uc2UodGhpcywgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucmVxdWVzdE11c3RSZWRpcmVjdChyZXF1ZXN0KSAmJiByZXNwb25zZVN1Y2NlZWRlZFdpdGhvdXRSZWRpcmVjdChyZXNwb25zZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFwiRm9ybSByZXNwb25zZXMgbXVzdCByZWRpcmVjdCB0byBhbm90aGVyIGxvY2F0aW9uXCIpO1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5mb3JtU3VibWlzc2lvbkVycm9yZWQodGhpcywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEZvcm1TdWJtaXNzaW9uU3RhdGUucmVjZWl2aW5nO1xuICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSB7IHN1Y2Nlc3M6IHRydWUsIGZldGNoUmVzcG9uc2U6IHJlc3BvbnNlIH07XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmZvcm1TdWJtaXNzaW9uU3VjY2VlZGVkV2l0aFJlc3BvbnNlKHRoaXMsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0RmFpbGVkV2l0aFJlc3BvbnNlKHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgZmV0Y2hSZXNwb25zZTogcmVzcG9uc2UgfTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5mb3JtU3VibWlzc2lvbkZhaWxlZFdpdGhSZXNwb25zZSh0aGlzLCByZXNwb25zZSk7XG4gICAgfVxuICAgIHJlcXVlc3RFcnJvcmVkKHJlcXVlc3QsIGVycm9yKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3IgfTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5mb3JtU3VibWlzc2lvbkVycm9yZWQodGhpcywgZXJyb3IpO1xuICAgIH1cbiAgICByZXF1ZXN0RmluaXNoZWQocmVxdWVzdCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gRm9ybVN1Ym1pc3Npb25TdGF0ZS5zdG9wcGVkO1xuICAgICAgICBkaXNwYXRjaChcInR1cmJvOnN1Ym1pdC1lbmRcIiwgeyB0YXJnZXQ6IHRoaXMuZm9ybUVsZW1lbnQsIGRldGFpbDogT2JqZWN0LmFzc2lnbih7IGZvcm1TdWJtaXNzaW9uOiB0aGlzIH0sIHRoaXMucmVzdWx0KSB9KTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5mb3JtU3VibWlzc2lvbkZpbmlzaGVkKHRoaXMpO1xuICAgIH1cbiAgICByZXF1ZXN0TXVzdFJlZGlyZWN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuICFyZXF1ZXN0LmlzSWRlbXBvdGVudCAmJiB0aGlzLm11c3RSZWRpcmVjdDtcbiAgICB9XG59XG5mdW5jdGlvbiBidWlsZEZvcm1EYXRhKGZvcm1FbGVtZW50LCBzdWJtaXR0ZXIpIHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtRWxlbWVudCk7XG4gICAgY29uc3QgbmFtZSA9IHN1Ym1pdHRlciA9PT0gbnVsbCB8fCBzdWJtaXR0ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpO1xuICAgIGNvbnN0IHZhbHVlID0gc3VibWl0dGVyID09PSBudWxsIHx8IHN1Ym1pdHRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3VibWl0dGVyLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpO1xuICAgIGlmIChuYW1lICYmIHZhbHVlICE9IG51bGwgJiYgZm9ybURhdGEuZ2V0KG5hbWUpICE9IHZhbHVlKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YTtcbn1cbmZ1bmN0aW9uIGdldENvb2tpZVZhbHVlKGNvb2tpZU5hbWUpIHtcbiAgICBpZiAoY29va2llTmFtZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUgPyBkb2N1bWVudC5jb29raWUuc3BsaXQoXCI7IFwiKSA6IFtdO1xuICAgICAgICBjb25zdCBjb29raWUgPSBjb29raWVzLmZpbmQoKGNvb2tpZSkgPT4gY29va2llLnN0YXJ0c1dpdGgoY29va2llTmFtZSkpO1xuICAgICAgICBpZiAoY29va2llKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvb2tpZS5zcGxpdChcIj1cIikuc2xpY2UoMSkuam9pbihcIj1cIik7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPyBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0TWV0YUNvbnRlbnQobmFtZSkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBtZXRhW25hbWU9XCIke25hbWV9XCJdYCk7XG4gICAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jb250ZW50O1xufVxuZnVuY3Rpb24gcmVzcG9uc2VTdWNjZWVkZWRXaXRob3V0UmVkaXJlY3QocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSAyMDAgJiYgIXJlc3BvbnNlLnJlZGlyZWN0ZWQ7XG59XG5cbmNsYXNzIFNuYXBzaG90IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBjaGlsZHJlbigpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmVsZW1lbnQuY2hpbGRyZW5dO1xuICAgIH1cbiAgICBoYXNBbmNob3IoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVsZW1lbnRGb3JBbmNob3IoYW5jaG9yKSAhPSBudWxsO1xuICAgIH1cbiAgICBnZXRFbGVtZW50Rm9yQW5jaG9yKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gYW5jaG9yID8gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYFtpZD0nJHthbmNob3J9J10sIGFbbmFtZT0nJHthbmNob3J9J11gKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5pc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgZ2V0IGZpcnN0QXV0b2ZvY3VzYWJsZUVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihcIlthdXRvZm9jdXNdXCIpO1xuICAgIH1cbiAgICBnZXQgcGVybWFuZW50RWxlbWVudHMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaWRdW2RhdGEtdHVyYm8tcGVybWFuZW50XVwiKV07XG4gICAgfVxuICAgIGdldFBlcm1hbmVudEVsZW1lbnRCeUlkKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihgIyR7aWR9W2RhdGEtdHVyYm8tcGVybWFuZW50XWApO1xuICAgIH1cbiAgICBnZXRQZXJtYW5lbnRFbGVtZW50TWFwRm9yU25hcHNob3Qoc25hcHNob3QpIHtcbiAgICAgICAgY29uc3QgcGVybWFuZW50RWxlbWVudE1hcCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRQZXJtYW5lbnRFbGVtZW50IG9mIHRoaXMucGVybWFuZW50RWxlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGN1cnJlbnRQZXJtYW5lbnRFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgbmV3UGVybWFuZW50RWxlbWVudCA9IHNuYXBzaG90LmdldFBlcm1hbmVudEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgICAgIGlmIChuZXdQZXJtYW5lbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcGVybWFuZW50RWxlbWVudE1hcFtpZF0gPSBbY3VycmVudFBlcm1hbmVudEVsZW1lbnQsIG5ld1Blcm1hbmVudEVsZW1lbnRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwZXJtYW5lbnRFbGVtZW50TWFwO1xuICAgIH1cbn1cblxuY2xhc3MgRm9ybUludGVyY2VwdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSwgZWxlbWVudCkge1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1YmJsZWQgPSAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybSA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJtaXR0ZXIgPSBldmVudC5zdWJtaXR0ZXIgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlbGVnYXRlLnNob3VsZEludGVyY2VwdEZvcm1TdWJtaXNzaW9uKGZvcm0sIHN1Ym1pdHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuZm9ybVN1Ym1pc3Npb25JbnRlcmNlcHRlZChmb3JtLCBzdWJtaXR0ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIHRoaXMuc3VibWl0QnViYmxlZCk7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIHRoaXMuc3VibWl0QnViYmxlZCk7XG4gICAgfVxufVxuXG5jbGFzcyBWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSwgZWxlbWVudCkge1xuICAgICAgICB0aGlzLnJlc29sdmVSZW5kZXJQcm9taXNlID0gKHZhbHVlKSA9PiB7IH07XG4gICAgICAgIHRoaXMucmVzb2x2ZUludGVyY2VwdGlvblByb21pc2UgPSAodmFsdWUpID0+IHsgfTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cbiAgICBzY3JvbGxUb0FuY2hvcihhbmNob3IpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuc25hcHNob3QuZ2V0RWxlbWVudEZvckFuY2hvcihhbmNob3IpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Qb3NpdGlvbih7IHg6IDAsIHk6IDAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2Nyb2xsVG9BbmNob3JGcm9tTG9jYXRpb24obG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0FuY2hvcihnZXRBbmNob3IobG9jYXRpb24pKTtcbiAgICB9XG4gICAgc2Nyb2xsVG9FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldygpO1xuICAgIH1cbiAgICBmb2N1c0VsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCItMVwiKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzY3JvbGxUb1Bvc2l0aW9uKHsgeCwgeSB9KSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsUm9vdC5zY3JvbGxUbyh4LCB5KTtcbiAgICB9XG4gICAgc2Nyb2xsVG9Ub3AoKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Qb3NpdGlvbih7IHg6IDAsIHk6IDAgfSk7XG4gICAgfVxuICAgIGdldCBzY3JvbGxSb290KCkge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBhc3luYyByZW5kZXIocmVuZGVyZXIpIHtcbiAgICAgICAgY29uc3QgeyBpc1ByZXZpZXcsIHNob3VsZFJlbmRlciwgbmV3U25hcHNob3Q6IHNuYXBzaG90IH0gPSByZW5kZXJlcjtcbiAgICAgICAgaWYgKHNob3VsZFJlbmRlcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHRoaXMucmVzb2x2ZVJlbmRlclByb21pc2UgPSByZXNvbHZlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlVG9SZW5kZXJTbmFwc2hvdChyZW5kZXJlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVuZGVySW50ZXJjZXB0aW9uID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB0aGlzLnJlc29sdmVJbnRlcmNlcHRpb25Qcm9taXNlID0gcmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1tZWRpYXRlUmVuZGVyID0gdGhpcy5kZWxlZ2F0ZS5hbGxvd3NJbW1lZGlhdGVSZW5kZXIoc25hcHNob3QsIHRoaXMucmVzb2x2ZUludGVyY2VwdGlvblByb21pc2UpO1xuICAgICAgICAgICAgICAgIGlmICghaW1tZWRpYXRlUmVuZGVyKVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZW5kZXJJbnRlcmNlcHRpb247XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJTbmFwc2hvdChyZW5kZXJlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS52aWV3UmVuZGVyZWRTbmFwc2hvdChzbmFwc2hvdCwgaXNQcmV2aWV3KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaFJlbmRlcmluZ1NuYXBzaG90KHJlbmRlcmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJlbmRlcmVyO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVJlbmRlclByb21pc2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5yZW5kZXJQcm9taXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS52aWV3SW52YWxpZGF0ZWQoKTtcbiAgICB9XG4gICAgcHJlcGFyZVRvUmVuZGVyU25hcHNob3QocmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNQcmV2aWV3KHJlbmRlcmVyLmlzUHJldmlldyk7XG4gICAgICAgIHJlbmRlcmVyLnByZXBhcmVUb1JlbmRlcigpO1xuICAgIH1cbiAgICBtYXJrQXNQcmV2aWV3KGlzUHJldmlldykge1xuICAgICAgICBpZiAoaXNQcmV2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS10dXJiby1wcmV2aWV3XCIsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtdHVyYm8tcHJldmlld1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyByZW5kZXJTbmFwc2hvdChyZW5kZXJlcikge1xuICAgICAgICBhd2FpdCByZW5kZXJlci5yZW5kZXIoKTtcbiAgICB9XG4gICAgZmluaXNoUmVuZGVyaW5nU25hcHNob3QocmVuZGVyZXIpIHtcbiAgICAgICAgcmVuZGVyZXIuZmluaXNoUmVuZGVyaW5nKCk7XG4gICAgfVxufVxuXG5jbGFzcyBGcmFtZVZpZXcgZXh0ZW5kcyBWaWV3IHtcbiAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9XG4gICAgZ2V0IHNuYXBzaG90KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNuYXBzaG90KHRoaXMuZWxlbWVudCk7XG4gICAgfVxufVxuXG5jbGFzcyBMaW5rSW50ZXJjZXB0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlLCBlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuY2xpY2tCdWJibGVkID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNwb25kc1RvRXZlbnRUYXJnZXQoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tFdmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2xpY2tFdmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5saW5rQ2xpY2tlZCA9ICgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsaWNrRXZlbnQgJiYgdGhpcy5yZXNwb25kc1RvRXZlbnRUYXJnZXQoZXZlbnQudGFyZ2V0KSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVsZWdhdGUuc2hvdWxkSW50ZXJjZXB0TGlua0NsaWNrKGV2ZW50LnRhcmdldCwgZXZlbnQuZGV0YWlsLnVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUubGlua0NsaWNrSW50ZXJjZXB0ZWQoZXZlbnQudGFyZ2V0LCBldmVudC5kZXRhaWwudXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jbGlja0V2ZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy53aWxsVmlzaXQgPSAoKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jbGlja0V2ZW50O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuY2xpY2tCdWJibGVkKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInR1cmJvOmNsaWNrXCIsIHRoaXMubGlua0NsaWNrZWQpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidHVyYm86YmVmb3JlLXZpc2l0XCIsIHRoaXMud2lsbFZpc2l0KTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmNsaWNrQnViYmxlZCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0dXJibzpjbGlja1wiLCB0aGlzLmxpbmtDbGlja2VkKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInR1cmJvOmJlZm9yZS12aXNpdFwiLCB0aGlzLndpbGxWaXNpdCk7XG4gICAgfVxuICAgIHJlc3BvbmRzVG9FdmVudFRhcmdldCh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRcbiAgICAgICAgICAgID8gdGFyZ2V0XG4gICAgICAgICAgICA6IHRhcmdldCBpbnN0YW5jZW9mIE5vZGVcbiAgICAgICAgICAgICAgICA/IHRhcmdldC5wYXJlbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICByZXR1cm4gZWxlbWVudCAmJiBlbGVtZW50LmNsb3Nlc3QoXCJ0dXJiby1mcmFtZSwgaHRtbFwiKSA9PSB0aGlzLmVsZW1lbnQ7XG4gICAgfVxufVxuXG5jbGFzcyBCYXJkbyB7XG4gICAgY29uc3RydWN0b3IocGVybWFuZW50RWxlbWVudE1hcCkge1xuICAgICAgICB0aGlzLnBlcm1hbmVudEVsZW1lbnRNYXAgPSBwZXJtYW5lbnRFbGVtZW50TWFwO1xuICAgIH1cbiAgICBzdGF0aWMgcHJlc2VydmluZ1Blcm1hbmVudEVsZW1lbnRzKHBlcm1hbmVudEVsZW1lbnRNYXAsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGJhcmRvID0gbmV3IHRoaXMocGVybWFuZW50RWxlbWVudE1hcCk7XG4gICAgICAgIGJhcmRvLmVudGVyKCk7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIGJhcmRvLmxlYXZlKCk7XG4gICAgfVxuICAgIGVudGVyKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMucGVybWFuZW50RWxlbWVudE1hcCkge1xuICAgICAgICAgICAgY29uc3QgWywgbmV3UGVybWFuZW50RWxlbWVudF0gPSB0aGlzLnBlcm1hbmVudEVsZW1lbnRNYXBbaWRdO1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlTmV3UGVybWFuZW50RWxlbWVudFdpdGhQbGFjZWhvbGRlcihuZXdQZXJtYW5lbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZWF2ZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnBlcm1hbmVudEVsZW1lbnRNYXApIHtcbiAgICAgICAgICAgIGNvbnN0IFtjdXJyZW50UGVybWFuZW50RWxlbWVudF0gPSB0aGlzLnBlcm1hbmVudEVsZW1lbnRNYXBbaWRdO1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlQ3VycmVudFBlcm1hbmVudEVsZW1lbnRXaXRoQ2xvbmUoY3VycmVudFBlcm1hbmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlUGxhY2Vob2xkZXJXaXRoUGVybWFuZW50RWxlbWVudChjdXJyZW50UGVybWFuZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZU5ld1Blcm1hbmVudEVsZW1lbnRXaXRoUGxhY2Vob2xkZXIocGVybWFuZW50RWxlbWVudCkge1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGNyZWF0ZVBsYWNlaG9sZGVyRm9yUGVybWFuZW50RWxlbWVudChwZXJtYW5lbnRFbGVtZW50KTtcbiAgICAgICAgcGVybWFuZW50RWxlbWVudC5yZXBsYWNlV2l0aChwbGFjZWhvbGRlcik7XG4gICAgfVxuICAgIHJlcGxhY2VDdXJyZW50UGVybWFuZW50RWxlbWVudFdpdGhDbG9uZShwZXJtYW5lbnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNsb25lID0gcGVybWFuZW50RWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgIHBlcm1hbmVudEVsZW1lbnQucmVwbGFjZVdpdGgoY2xvbmUpO1xuICAgIH1cbiAgICByZXBsYWNlUGxhY2Vob2xkZXJXaXRoUGVybWFuZW50RWxlbWVudChwZXJtYW5lbnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5nZXRQbGFjZWhvbGRlckJ5SWQocGVybWFuZW50RWxlbWVudC5pZCk7XG4gICAgICAgIHBsYWNlaG9sZGVyID09PSBudWxsIHx8IHBsYWNlaG9sZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwbGFjZWhvbGRlci5yZXBsYWNlV2l0aChwZXJtYW5lbnRFbGVtZW50KTtcbiAgICB9XG4gICAgZ2V0UGxhY2Vob2xkZXJCeUlkKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVycy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5jb250ZW50ID09IGlkKTtcbiAgICB9XG4gICAgZ2V0IHBsYWNlaG9sZGVycygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwibWV0YVtuYW1lPXR1cmJvLXBlcm1hbmVudC1wbGFjZWhvbGRlcl1bY29udGVudF1cIildO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVBsYWNlaG9sZGVyRm9yUGVybWFuZW50RWxlbWVudChwZXJtYW5lbnRFbGVtZW50KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJtZXRhXCIpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwibmFtZVwiLCBcInR1cmJvLXBlcm1hbmVudC1wbGFjZWhvbGRlclwiKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImNvbnRlbnRcIiwgcGVybWFuZW50RWxlbWVudC5pZCk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbmNsYXNzIFJlbmRlcmVyIHtcbiAgICBjb25zdHJ1Y3RvcihjdXJyZW50U25hcHNob3QsIG5ld1NuYXBzaG90LCBpc1ByZXZpZXcpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U25hcHNob3QgPSBjdXJyZW50U25hcHNob3Q7XG4gICAgICAgIHRoaXMubmV3U25hcHNob3QgPSBuZXdTbmFwc2hvdDtcbiAgICAgICAgdGhpcy5pc1ByZXZpZXcgPSBpc1ByZXZpZXc7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHRoaXMucmVzb2x2aW5nRnVuY3Rpb25zID0geyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgfVxuICAgIGdldCBzaG91bGRSZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBwcmVwYXJlVG9SZW5kZXIoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZmluaXNoUmVuZGVyaW5nKCkge1xuICAgICAgICBpZiAodGhpcy5yZXNvbHZpbmdGdW5jdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2aW5nRnVuY3Rpb25zLnJlc29sdmUoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJlc29sdmluZ0Z1bmN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVTY3JpcHRFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS10dXJiby1ldmFsXCIpID09IFwiZmFsc2VcIikge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkU2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5jc3BOb25jZSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZWRTY3JpcHRFbGVtZW50Lm5vbmNlID0gdGhpcy5jc3BOb25jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNyZWF0ZWRTY3JpcHRFbGVtZW50LnRleHRDb250ZW50ID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIGNyZWF0ZWRTY3JpcHRFbGVtZW50LmFzeW5jID0gZmFsc2U7XG4gICAgICAgICAgICBjb3B5RWxlbWVudEF0dHJpYnV0ZXMoY3JlYXRlZFNjcmlwdEVsZW1lbnQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRTY3JpcHRFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIHByZXNlcnZpbmdQZXJtYW5lbnRFbGVtZW50cyhjYWxsYmFjaykge1xuICAgICAgICBCYXJkby5wcmVzZXJ2aW5nUGVybWFuZW50RWxlbWVudHModGhpcy5wZXJtYW5lbnRFbGVtZW50TWFwLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGZvY3VzRmlyc3RBdXRvZm9jdXNhYmxlRWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY29ubmVjdGVkU25hcHNob3QuZmlyc3RBdXRvZm9jdXNhYmxlRWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnRJc0ZvY3VzYWJsZShlbGVtZW50KSkge1xuICAgICAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjb25uZWN0ZWRTbmFwc2hvdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3U25hcHNob3QuaXNDb25uZWN0ZWQgPyB0aGlzLm5ld1NuYXBzaG90IDogdGhpcy5jdXJyZW50U25hcHNob3Q7XG4gICAgfVxuICAgIGdldCBjdXJyZW50RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFNuYXBzaG90LmVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBuZXdFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXdTbmFwc2hvdC5lbGVtZW50O1xuICAgIH1cbiAgICBnZXQgcGVybWFuZW50RWxlbWVudE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFNuYXBzaG90LmdldFBlcm1hbmVudEVsZW1lbnRNYXBGb3JTbmFwc2hvdCh0aGlzLm5ld1NuYXBzaG90KTtcbiAgICB9XG4gICAgZ2V0IGNzcE5vbmNlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcC1ub25jZVwiXScpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb3B5RWxlbWVudEF0dHJpYnV0ZXMoZGVzdGluYXRpb25FbGVtZW50LCBzb3VyY2VFbGVtZW50KSB7XG4gICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgWy4uLnNvdXJjZUVsZW1lbnQuYXR0cmlidXRlc10pIHtcbiAgICAgICAgZGVzdGluYXRpb25FbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gZWxlbWVudElzRm9jdXNhYmxlKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudC5mb2N1cyA9PSBcImZ1bmN0aW9uXCI7XG59XG5cbmNsYXNzIEZyYW1lUmVuZGVyZXIgZXh0ZW5kcyBSZW5kZXJlciB7XG4gICAgZ2V0IHNob3VsZFJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFzeW5jIHJlbmRlcigpIHtcbiAgICAgICAgYXdhaXQgbmV4dEFuaW1hdGlvbkZyYW1lKCk7XG4gICAgICAgIHRoaXMucHJlc2VydmluZ1Blcm1hbmVudEVsZW1lbnRzKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZEZyYW1lRWxlbWVudCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zY3JvbGxGcmFtZUludG9WaWV3KCk7XG4gICAgICAgIGF3YWl0IG5leHRBbmltYXRpb25GcmFtZSgpO1xuICAgICAgICB0aGlzLmZvY3VzRmlyc3RBdXRvZm9jdXNhYmxlRWxlbWVudCgpO1xuICAgICAgICBhd2FpdCBuZXh0QW5pbWF0aW9uRnJhbWUoKTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVNjcmlwdEVsZW1lbnRzKCk7XG4gICAgfVxuICAgIGxvYWRGcmFtZUVsZW1lbnQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25SYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIGRlc3RpbmF0aW9uUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRoaXMuY3VycmVudEVsZW1lbnQpO1xuICAgICAgICBkZXN0aW5hdGlvblJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgICAgIGNvbnN0IGZyYW1lRWxlbWVudCA9IHRoaXMubmV3RWxlbWVudDtcbiAgICAgICAgY29uc3Qgc291cmNlUmFuZ2UgPSAoX2EgPSBmcmFtZUVsZW1lbnQub3duZXJEb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIGlmIChzb3VyY2VSYW5nZSkge1xuICAgICAgICAgICAgc291cmNlUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHNvdXJjZVJhbmdlLmV4dHJhY3RDb250ZW50cygpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY3JvbGxGcmFtZUludG9WaWV3KCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50RWxlbWVudC5hdXRvc2Nyb2xsIHx8IHRoaXMubmV3RWxlbWVudC5hdXRvc2Nyb2xsKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gcmVhZFNjcm9sbExvZ2ljYWxQb3NpdGlvbih0aGlzLmN1cnJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtYXV0b3Njcm9sbC1ibG9ja1wiKSwgXCJlbmRcIik7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jayB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGFjdGl2YXRlU2NyaXB0RWxlbWVudHMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaW5lcnRTY3JpcHRFbGVtZW50IG9mIHRoaXMubmV3U2NyaXB0RWxlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2YXRlZFNjcmlwdEVsZW1lbnQgPSB0aGlzLmNyZWF0ZVNjcmlwdEVsZW1lbnQoaW5lcnRTY3JpcHRFbGVtZW50KTtcbiAgICAgICAgICAgIGluZXJ0U2NyaXB0RWxlbWVudC5yZXBsYWNlV2l0aChhY3RpdmF0ZWRTY3JpcHRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbmV3U2NyaXB0RWxlbWVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzY3JpcHRcIik7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVhZFNjcm9sbExvZ2ljYWxQb3NpdGlvbih2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiZW5kXCIgfHwgdmFsdWUgPT0gXCJzdGFydFwiIHx8IHZhbHVlID09IFwiY2VudGVyXCIgfHwgdmFsdWUgPT0gXCJuZWFyZXN0XCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG59XG5cbmNsYXNzIFByb2dyZXNzQmFyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5oaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IDA7XG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRyaWNrbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMudmFsdWUgKyBNYXRoLnJhbmRvbSgpIC8gMTAwKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdHlsZXNoZWV0RWxlbWVudCA9IHRoaXMuY3JlYXRlU3R5bGVzaGVldEVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0VsZW1lbnQgPSB0aGlzLmNyZWF0ZVByb2dyZXNzRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmluc3RhbGxTdHlsZXNoZWV0RWxlbWVudCgpO1xuICAgICAgICB0aGlzLnNldFZhbHVlKDApO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IGRlZmF1bHRDU1MoKSB7XG4gICAgICAgIHJldHVybiB1bmluZGVudCBgXG4gICAgICAudHVyYm8tcHJvZ3Jlc3MtYmFyIHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICBoZWlnaHQ6IDNweDtcbiAgICAgICAgYmFja2dyb3VuZDogIzAwNzZmZjtcbiAgICAgICAgei1pbmRleDogOTk5OTtcbiAgICAgICAgdHJhbnNpdGlvbjpcbiAgICAgICAgICB3aWR0aCAke1Byb2dyZXNzQmFyLmFuaW1hdGlvbkR1cmF0aW9ufW1zIGVhc2Utb3V0LFxuICAgICAgICAgIG9wYWNpdHkgJHtQcm9ncmVzc0Jhci5hbmltYXRpb25EdXJhdGlvbiAvIDJ9bXMgJHtQcm9ncmVzc0Jhci5hbmltYXRpb25EdXJhdGlvbiAvIDJ9bXMgZWFzZS1pbjtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICBzaG93KCkge1xuICAgICAgICBpZiAoIXRoaXMudmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFsbFByb2dyZXNzRWxlbWVudCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFydFRyaWNrbGluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhpZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpc2libGUgJiYgIXRoaXMuaGlkaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmZhZGVQcm9ncmVzc0VsZW1lbnQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudW5pbnN0YWxsUHJvZ3Jlc3NFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wVHJpY2tsaW5nKCk7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICAgIGluc3RhbGxTdHlsZXNoZWV0RWxlbWVudCgpIHtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUodGhpcy5zdHlsZXNoZWV0RWxlbWVudCwgZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgaW5zdGFsbFByb2dyZXNzRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0VsZW1lbnQuc3R5bGUud2lkdGggPSBcIjBcIjtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0VsZW1lbnQuc3R5bGUub3BhY2l0eSA9IFwiMVwiO1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMucHJvZ3Jlc3NFbGVtZW50LCBkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICAgIGZhZGVQcm9ncmVzc0VsZW1lbnQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0VsZW1lbnQuc3R5bGUub3BhY2l0eSA9IFwiMFwiO1xuICAgICAgICBzZXRUaW1lb3V0KGNhbGxiYWNrLCBQcm9ncmVzc0Jhci5hbmltYXRpb25EdXJhdGlvbiAqIDEuNSk7XG4gICAgfVxuICAgIHVuaW5zdGFsbFByb2dyZXNzRWxlbWVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvZ3Jlc3NFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLnByb2dyZXNzRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhcnRUcmlja2xpbmcoKSB7XG4gICAgICAgIGlmICghdGhpcy50cmlja2xlSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIHRoaXMudHJpY2tsZUludGVydmFsID0gd2luZG93LnNldEludGVydmFsKHRoaXMudHJpY2tsZSwgUHJvZ3Jlc3NCYXIuYW5pbWF0aW9uRHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3BUcmlja2xpbmcoKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMudHJpY2tsZUludGVydmFsKTtcbiAgICAgICAgZGVsZXRlIHRoaXMudHJpY2tsZUludGVydmFsO1xuICAgIH1cbiAgICByZWZyZXNoKCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHsxMCArICh0aGlzLnZhbHVlICogOTApfSVgO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY3JlYXRlU3R5bGVzaGVldEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgICAgIGVsZW1lbnQudHlwZSA9IFwidGV4dC9jc3NcIjtcbiAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IFByb2dyZXNzQmFyLmRlZmF1bHRDU1M7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICBjcmVhdGVQcm9ncmVzc0VsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwidHVyYm8tcHJvZ3Jlc3MtYmFyXCI7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbn1cblByb2dyZXNzQmFyLmFuaW1hdGlvbkR1cmF0aW9uID0gMzAwO1xuXG5jbGFzcyBIZWFkU25hcHNob3QgZXh0ZW5kcyBTbmFwc2hvdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuZGV0YWlsc0J5T3V0ZXJIVE1MID0gdGhpcy5jaGlsZHJlblxuICAgICAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gIWVsZW1lbnRJc05vc2NyaXB0KGVsZW1lbnQpKVxuICAgICAgICAgICAgLnJlZHVjZSgocmVzdWx0LCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG91dGVySFRNTCB9ID0gZWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBvdXRlckhUTUwgaW4gcmVzdWx0XG4gICAgICAgICAgICAgICAgPyByZXN1bHRbb3V0ZXJIVE1MXVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tlZDogZWxlbWVudElzVHJhY2tlZChlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3VsdCksIHsgW291dGVySFRNTF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGV0YWlscyksIHsgZWxlbWVudHM6IFsuLi5kZXRhaWxzLmVsZW1lbnRzLCBlbGVtZW50XSB9KSB9KTtcbiAgICAgICAgfSwge30pO1xuICAgIH1cbiAgICBnZXQgdHJhY2tlZEVsZW1lbnRTaWduYXR1cmUoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmRldGFpbHNCeU91dGVySFRNTClcbiAgICAgICAgICAgIC5maWx0ZXIob3V0ZXJIVE1MID0+IHRoaXMuZGV0YWlsc0J5T3V0ZXJIVE1MW291dGVySFRNTF0udHJhY2tlZClcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuICAgIH1cbiAgICBnZXRTY3JpcHRFbGVtZW50c05vdEluU25hcHNob3Qoc25hcHNob3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RWxlbWVudHNNYXRjaGluZ1R5cGVOb3RJblNuYXBzaG90KFwic2NyaXB0XCIsIHNuYXBzaG90KTtcbiAgICB9XG4gICAgZ2V0U3R5bGVzaGVldEVsZW1lbnRzTm90SW5TbmFwc2hvdChzbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50c01hdGNoaW5nVHlwZU5vdEluU25hcHNob3QoXCJzdHlsZXNoZWV0XCIsIHNuYXBzaG90KTtcbiAgICB9XG4gICAgZ2V0RWxlbWVudHNNYXRjaGluZ1R5cGVOb3RJblNuYXBzaG90KG1hdGNoZWRUeXBlLCBzbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5kZXRhaWxzQnlPdXRlckhUTUwpXG4gICAgICAgICAgICAuZmlsdGVyKG91dGVySFRNTCA9PiAhKG91dGVySFRNTCBpbiBzbmFwc2hvdC5kZXRhaWxzQnlPdXRlckhUTUwpKVxuICAgICAgICAgICAgLm1hcChvdXRlckhUTUwgPT4gdGhpcy5kZXRhaWxzQnlPdXRlckhUTUxbb3V0ZXJIVE1MXSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgdHlwZSB9KSA9PiB0eXBlID09IG1hdGNoZWRUeXBlKVxuICAgICAgICAgICAgLm1hcCgoeyBlbGVtZW50czogW2VsZW1lbnRdIH0pID0+IGVsZW1lbnQpO1xuICAgIH1cbiAgICBnZXQgcHJvdmlzaW9uYWxFbGVtZW50cygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZGV0YWlsc0J5T3V0ZXJIVE1MKS5yZWR1Y2UoKHJlc3VsdCwgb3V0ZXJIVE1MKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHR5cGUsIHRyYWNrZWQsIGVsZW1lbnRzIH0gPSB0aGlzLmRldGFpbHNCeU91dGVySFRNTFtvdXRlckhUTUxdO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCAmJiAhdHJhY2tlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbLi4ucmVzdWx0LCAuLi5lbGVtZW50c107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5yZXN1bHQsIC4uLmVsZW1lbnRzLnNsaWNlKDEpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFtdKTtcbiAgICB9XG4gICAgZ2V0TWV0YVZhbHVlKG5hbWUpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZmluZE1ldGFFbGVtZW50QnlOYW1lKG5hbWUpO1xuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgICAgICAgPyBlbGVtZW50LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIilcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgZmluZE1ldGFFbGVtZW50QnlOYW1lKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZGV0YWlsc0J5T3V0ZXJIVE1MKS5yZWR1Y2UoKHJlc3VsdCwgb3V0ZXJIVE1MKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGVsZW1lbnRzOiBbZWxlbWVudF0gfSA9IHRoaXMuZGV0YWlsc0J5T3V0ZXJIVE1MW291dGVySFRNTF07XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudElzTWV0YUVsZW1lbnRXaXRoTmFtZShlbGVtZW50LCBuYW1lKSA/IGVsZW1lbnQgOiByZXN1bHQ7XG4gICAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZWxlbWVudFR5cGUoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50SXNTY3JpcHQoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIFwic2NyaXB0XCI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVsZW1lbnRJc1N0eWxlc2hlZXQoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIFwic3R5bGVzaGVldFwiO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVsZW1lbnRJc1RyYWNrZWQoZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdHVyYm8tdHJhY2tcIikgPT0gXCJyZWxvYWRcIjtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRJc1NjcmlwdChlbGVtZW50KSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0YWdOYW1lID09IFwic2NyaXB0XCI7XG59XG5mdW5jdGlvbiBlbGVtZW50SXNOb3NjcmlwdChlbGVtZW50KSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0YWdOYW1lID09IFwibm9zY3JpcHRcIjtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRJc1N0eWxlc2hlZXQoZWxlbWVudCkge1xuICAgIGNvbnN0IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGFnTmFtZSA9PSBcInN0eWxlXCIgfHwgKHRhZ05hbWUgPT0gXCJsaW5rXCIgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikgPT0gXCJzdHlsZXNoZWV0XCIpO1xufVxuZnVuY3Rpb24gZWxlbWVudElzTWV0YUVsZW1lbnRXaXRoTmFtZShlbGVtZW50LCBuYW1lKSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0YWdOYW1lID09IFwibWV0YVwiICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSA9PSBuYW1lO1xufVxuXG5jbGFzcyBQYWdlU25hcHNob3QgZXh0ZW5kcyBTbmFwc2hvdCB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgaGVhZFNuYXBzaG90KSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnQpO1xuICAgICAgICB0aGlzLmhlYWRTbmFwc2hvdCA9IGhlYWRTbmFwc2hvdDtcbiAgICB9XG4gICAgc3RhdGljIGZyb21IVE1MU3RyaW5nKGh0bWwgPSBcIlwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb21Eb2N1bWVudChwYXJzZUhUTUxEb2N1bWVudChodG1sKSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb21Eb2N1bWVudChlbGVtZW50Lm93bmVyRG9jdW1lbnQpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbURvY3VtZW50KHsgaGVhZCwgYm9keSB9KSB7XG4gICAgICAgIHJldHVybiBuZXcgdGhpcyhib2R5LCBuZXcgSGVhZFNuYXBzaG90KGhlYWQpKTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGFnZVNuYXBzaG90KHRoaXMuZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSksIHRoaXMuaGVhZFNuYXBzaG90KTtcbiAgICB9XG4gICAgZ2V0IGhlYWRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkU25hcHNob3QuZWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IHJvb3RMb2NhdGlvbigpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCByb290ID0gKF9hID0gdGhpcy5nZXRTZXR0aW5nKFwicm9vdFwiKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCIvXCI7XG4gICAgICAgIHJldHVybiBleHBhbmRVUkwocm9vdCk7XG4gICAgfVxuICAgIGdldCBjYWNoZUNvbnRyb2xWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZyhcImNhY2hlLWNvbnRyb2xcIik7XG4gICAgfVxuICAgIGdldCBpc1ByZXZpZXdhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZUNvbnRyb2xWYWx1ZSAhPSBcIm5vLXByZXZpZXdcIjtcbiAgICB9XG4gICAgZ2V0IGlzQ2FjaGVhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZUNvbnRyb2xWYWx1ZSAhPSBcIm5vLWNhY2hlXCI7XG4gICAgfVxuICAgIGdldCBpc1Zpc2l0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZyhcInZpc2l0LWNvbnRyb2xcIikgIT0gXCJyZWxvYWRcIjtcbiAgICB9XG4gICAgZ2V0U2V0dGluZyhuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYWRTbmFwc2hvdC5nZXRNZXRhVmFsdWUoYHR1cmJvLSR7bmFtZX1gKTtcbiAgICB9XG59XG5cbnZhciBUaW1pbmdNZXRyaWM7XG4oZnVuY3Rpb24gKFRpbWluZ01ldHJpYykge1xuICAgIFRpbWluZ01ldHJpY1tcInZpc2l0U3RhcnRcIl0gPSBcInZpc2l0U3RhcnRcIjtcbiAgICBUaW1pbmdNZXRyaWNbXCJyZXF1ZXN0U3RhcnRcIl0gPSBcInJlcXVlc3RTdGFydFwiO1xuICAgIFRpbWluZ01ldHJpY1tcInJlcXVlc3RFbmRcIl0gPSBcInJlcXVlc3RFbmRcIjtcbiAgICBUaW1pbmdNZXRyaWNbXCJ2aXNpdEVuZFwiXSA9IFwidmlzaXRFbmRcIjtcbn0pKFRpbWluZ01ldHJpYyB8fCAoVGltaW5nTWV0cmljID0ge30pKTtcbnZhciBWaXNpdFN0YXRlO1xuKGZ1bmN0aW9uIChWaXNpdFN0YXRlKSB7XG4gICAgVmlzaXRTdGF0ZVtcImluaXRpYWxpemVkXCJdID0gXCJpbml0aWFsaXplZFwiO1xuICAgIFZpc2l0U3RhdGVbXCJzdGFydGVkXCJdID0gXCJzdGFydGVkXCI7XG4gICAgVmlzaXRTdGF0ZVtcImNhbmNlbGVkXCJdID0gXCJjYW5jZWxlZFwiO1xuICAgIFZpc2l0U3RhdGVbXCJmYWlsZWRcIl0gPSBcImZhaWxlZFwiO1xuICAgIFZpc2l0U3RhdGVbXCJjb21wbGV0ZWRcIl0gPSBcImNvbXBsZXRlZFwiO1xufSkoVmlzaXRTdGF0ZSB8fCAoVmlzaXRTdGF0ZSA9IHt9KSk7XG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBhY3Rpb246IFwiYWR2YW5jZVwiLFxuICAgIGhpc3RvcnlDaGFuZ2VkOiBmYWxzZVxufTtcbnZhciBTeXN0ZW1TdGF0dXNDb2RlO1xuKGZ1bmN0aW9uIChTeXN0ZW1TdGF0dXNDb2RlKSB7XG4gICAgU3lzdGVtU3RhdHVzQ29kZVtTeXN0ZW1TdGF0dXNDb2RlW1wibmV0d29ya0ZhaWx1cmVcIl0gPSAwXSA9IFwibmV0d29ya0ZhaWx1cmVcIjtcbiAgICBTeXN0ZW1TdGF0dXNDb2RlW1N5c3RlbVN0YXR1c0NvZGVbXCJ0aW1lb3V0RmFpbHVyZVwiXSA9IC0xXSA9IFwidGltZW91dEZhaWx1cmVcIjtcbiAgICBTeXN0ZW1TdGF0dXNDb2RlW1N5c3RlbVN0YXR1c0NvZGVbXCJjb250ZW50VHlwZU1pc21hdGNoXCJdID0gLTJdID0gXCJjb250ZW50VHlwZU1pc21hdGNoXCI7XG59KShTeXN0ZW1TdGF0dXNDb2RlIHx8IChTeXN0ZW1TdGF0dXNDb2RlID0ge30pKTtcbmNsYXNzIFZpc2l0IHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSwgbG9jYXRpb24sIHJlc3RvcmF0aW9uSWRlbnRpZmllciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuaWRlbnRpZmllciA9IHV1aWQoKTtcbiAgICAgICAgdGhpcy50aW1pbmdNZXRyaWNzID0ge307XG4gICAgICAgIHRoaXMuZm9sbG93ZWRSZWRpcmVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhpc3RvcnlDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2Nyb2xsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zbmFwc2hvdENhY2hlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN0YXRlID0gVmlzaXRTdGF0ZS5pbml0aWFsaXplZDtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247XG4gICAgICAgIHRoaXMucmVzdG9yYXRpb25JZGVudGlmaWVyID0gcmVzdG9yYXRpb25JZGVudGlmaWVyIHx8IHV1aWQoKTtcbiAgICAgICAgY29uc3QgeyBhY3Rpb24sIGhpc3RvcnlDaGFuZ2VkLCByZWZlcnJlciwgc25hcHNob3RIVE1MLCByZXNwb25zZSB9ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICAgICAgdGhpcy5oaXN0b3J5Q2hhbmdlZCA9IGhpc3RvcnlDaGFuZ2VkO1xuICAgICAgICB0aGlzLnJlZmVycmVyID0gcmVmZXJyZXI7XG4gICAgICAgIHRoaXMuc25hcHNob3RIVE1MID0gc25hcHNob3RIVE1MO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuaXNTYW1lUGFnZSA9IHRoaXMuZGVsZWdhdGUubG9jYXRpb25XaXRoQWN0aW9uSXNTYW1lUGFnZSh0aGlzLmxvY2F0aW9uLCB0aGlzLmFjdGlvbik7XG4gICAgfVxuICAgIGdldCBhZGFwdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5hZGFwdGVyO1xuICAgIH1cbiAgICBnZXQgdmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUudmlldztcbiAgICB9XG4gICAgZ2V0IGhpc3RvcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmhpc3Rvcnk7XG4gICAgfVxuICAgIGdldCByZXN0b3JhdGlvbkRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhpc3RvcnkuZ2V0UmVzdG9yYXRpb25EYXRhRm9ySWRlbnRpZmllcih0aGlzLnJlc3RvcmF0aW9uSWRlbnRpZmllcik7XG4gICAgfVxuICAgIGdldCBzaWxlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZVBhZ2U7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PSBWaXNpdFN0YXRlLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlY29yZFRpbWluZ01ldHJpYyhUaW1pbmdNZXRyaWMudmlzaXRTdGFydCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gVmlzaXRTdGF0ZS5zdGFydGVkO1xuICAgICAgICAgICAgdGhpcy5hZGFwdGVyLnZpc2l0U3RhcnRlZCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUudmlzaXRTdGFydGVkKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT0gVmlzaXRTdGF0ZS5zdGFydGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYW5jZWxSZW5kZXIoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBWaXNpdFN0YXRlLmNhbmNlbGVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PSBWaXNpdFN0YXRlLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkVGltaW5nTWV0cmljKFRpbWluZ01ldHJpYy52aXNpdEVuZCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gVmlzaXRTdGF0ZS5jb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aGlzLmFkYXB0ZXIudmlzaXRDb21wbGV0ZWQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnZpc2l0Q29tcGxldGVkKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5mb2xsb3dSZWRpcmVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZhaWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09IFZpc2l0U3RhdGUuc3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFZpc2l0U3RhdGUuZmFpbGVkO1xuICAgICAgICAgICAgdGhpcy5hZGFwdGVyLnZpc2l0RmFpbGVkKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoYW5nZUhpc3RvcnkoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmhpc3RvcnlDaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Gb3JIaXN0b3J5ID0gdGhpcy5sb2NhdGlvbi5ocmVmID09PSAoKF9hID0gdGhpcy5yZWZlcnJlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhyZWYpID8gXCJyZXBsYWNlXCIgOiB0aGlzLmFjdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0SGlzdG9yeU1ldGhvZEZvckFjdGlvbihhY3Rpb25Gb3JIaXN0b3J5KTtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS51cGRhdGUobWV0aG9kLCB0aGlzLmxvY2F0aW9uLCB0aGlzLnJlc3RvcmF0aW9uSWRlbnRpZmllcik7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnlDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc3N1ZVJlcXVlc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1ByZWxvYWRlZFJlc3BvbnNlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2ltdWxhdGVSZXF1ZXN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zaG91bGRJc3N1ZVJlcXVlc3QoKSAmJiAhdGhpcy5yZXF1ZXN0KSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSBuZXcgRmV0Y2hSZXF1ZXN0KHRoaXMsIEZldGNoTWV0aG9kLmdldCwgdGhpcy5sb2NhdGlvbik7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3QucGVyZm9ybSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNpbXVsYXRlUmVxdWVzdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRSZXF1ZXN0KCk7XG4gICAgICAgICAgICB0aGlzLnJlY29yZFJlc3BvbnNlKCk7XG4gICAgICAgICAgICB0aGlzLmZpbmlzaFJlcXVlc3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGFydFJlcXVlc3QoKSB7XG4gICAgICAgIHRoaXMucmVjb3JkVGltaW5nTWV0cmljKFRpbWluZ01ldHJpYy5yZXF1ZXN0U3RhcnQpO1xuICAgICAgICB0aGlzLmFkYXB0ZXIudmlzaXRSZXF1ZXN0U3RhcnRlZCh0aGlzKTtcbiAgICB9XG4gICAgcmVjb3JkUmVzcG9uc2UocmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXR1c0NvZGUgfSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKGlzU3VjY2Vzc2Z1bChzdGF0dXNDb2RlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlci52aXNpdFJlcXVlc3RDb21wbGV0ZWQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXIudmlzaXRSZXF1ZXN0RmFpbGVkV2l0aFN0YXR1c0NvZGUodGhpcywgc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluaXNoUmVxdWVzdCgpIHtcbiAgICAgICAgdGhpcy5yZWNvcmRUaW1pbmdNZXRyaWMoVGltaW5nTWV0cmljLnJlcXVlc3RFbmQpO1xuICAgICAgICB0aGlzLmFkYXB0ZXIudmlzaXRSZXF1ZXN0RmluaXNoZWQodGhpcyk7XG4gICAgfVxuICAgIGxvYWRSZXNwb25zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RhdHVzQ29kZSwgcmVzcG9uc2VIVE1MIH0gPSB0aGlzLnJlc3BvbnNlO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTbmFwc2hvdCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcucmVuZGVyUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy52aWV3LnJlbmRlclByb21pc2U7XG4gICAgICAgICAgICAgICAgaWYgKGlzU3VjY2Vzc2Z1bChzdGF0dXNDb2RlKSAmJiByZXNwb25zZUhUTUwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyUGFnZShQYWdlU25hcHNob3QuZnJvbUhUTUxTdHJpbmcocmVzcG9uc2VIVE1MKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlci52aXNpdFJlbmRlcmVkKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyRXJyb3IoUGFnZVNuYXBzaG90LmZyb21IVE1MU3RyaW5nKHJlc3BvbnNlSFRNTCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXIudmlzaXRSZW5kZXJlZCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0Q2FjaGVkU25hcHNob3QoKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy52aWV3LmdldENhY2hlZFNuYXBzaG90Rm9yTG9jYXRpb24odGhpcy5sb2NhdGlvbikgfHwgdGhpcy5nZXRQcmVsb2FkZWRTbmFwc2hvdCgpO1xuICAgICAgICBpZiAoc25hcHNob3QgJiYgKCFnZXRBbmNob3IodGhpcy5sb2NhdGlvbikgfHwgc25hcHNob3QuaGFzQW5jaG9yKGdldEFuY2hvcih0aGlzLmxvY2F0aW9uKSkpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3Rpb24gPT0gXCJyZXN0b3JlXCIgfHwgc25hcHNob3QuaXNQcmV2aWV3YWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRQcmVsb2FkZWRTbmFwc2hvdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc25hcHNob3RIVE1MKSB7XG4gICAgICAgICAgICByZXR1cm4gUGFnZVNuYXBzaG90LmZyb21IVE1MU3RyaW5nKHRoaXMuc25hcHNob3RIVE1MKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNDYWNoZWRTbmFwc2hvdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVkU25hcHNob3QoKSAhPSBudWxsO1xuICAgIH1cbiAgICBsb2FkQ2FjaGVkU25hcHNob3QoKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5nZXRDYWNoZWRTbmFwc2hvdCgpO1xuICAgICAgICBpZiAoc25hcHNob3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUHJldmlldyA9IHRoaXMuc2hvdWxkSXNzdWVSZXF1ZXN0KCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVNuYXBzaG90KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTYW1lUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXIudmlzaXRSZW5kZXJlZCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcucmVuZGVyUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudmlldy5yZW5kZXJQcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyUGFnZShzbmFwc2hvdCwgaXNQcmV2aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGFwdGVyLnZpc2l0UmVuZGVyZWQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb2xsb3dSZWRpcmVjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVkaXJlY3RlZFRvTG9jYXRpb24gJiYgIXRoaXMuZm9sbG93ZWRSZWRpcmVjdCkge1xuICAgICAgICAgICAgdGhpcy5hZGFwdGVyLnZpc2l0UHJvcG9zZWRUb0xvY2F0aW9uKHRoaXMucmVkaXJlY3RlZFRvTG9jYXRpb24sIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdyZXBsYWNlJyxcbiAgICAgICAgICAgICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmZvbGxvd2VkUmVkaXJlY3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdvVG9TYW1lUGFnZUFuY2hvcigpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTYW1lUGFnZSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTbmFwc2hvdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlci52aXNpdFJlbmRlcmVkKHRoaXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdFN0YXJ0ZWQoKSB7XG4gICAgICAgIHRoaXMuc3RhcnRSZXF1ZXN0KCk7XG4gICAgfVxuICAgIHJlcXVlc3RQcmV2ZW50ZWRIYW5kbGluZ1Jlc3BvbnNlKHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gICAgfVxuICAgIGFzeW5jIHJlcXVlc3RTdWNjZWVkZWRXaXRoUmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VIVE1MID0gYXdhaXQgcmVzcG9uc2UucmVzcG9uc2VIVE1MO1xuICAgICAgICBpZiAocmVzcG9uc2VIVE1MID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRSZXNwb25zZSh7IHN0YXR1c0NvZGU6IFN5c3RlbVN0YXR1c0NvZGUuY29udGVudFR5cGVNaXNtYXRjaCB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RlZFRvTG9jYXRpb24gPSByZXNwb25zZS5yZWRpcmVjdGVkID8gcmVzcG9uc2UubG9jYXRpb24gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnJlY29yZFJlc3BvbnNlKHsgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSwgcmVzcG9uc2VIVE1MIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlcXVlc3RGYWlsZWRXaXRoUmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VIVE1MID0gYXdhaXQgcmVzcG9uc2UucmVzcG9uc2VIVE1MO1xuICAgICAgICBpZiAocmVzcG9uc2VIVE1MID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRSZXNwb25zZSh7IHN0YXR1c0NvZGU6IFN5c3RlbVN0YXR1c0NvZGUuY29udGVudFR5cGVNaXNtYXRjaCB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkUmVzcG9uc2UoeyBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLCByZXNwb25zZUhUTUwgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdEVycm9yZWQocmVxdWVzdCwgZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZWNvcmRSZXNwb25zZSh7IHN0YXR1c0NvZGU6IFN5c3RlbVN0YXR1c0NvZGUubmV0d29ya0ZhaWx1cmUgfSk7XG4gICAgfVxuICAgIHJlcXVlc3RGaW5pc2hlZCgpIHtcbiAgICAgICAgdGhpcy5maW5pc2hSZXF1ZXN0KCk7XG4gICAgfVxuICAgIHBlcmZvcm1TY3JvbGwoKSB7XG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9uID09IFwicmVzdG9yZVwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1Jlc3RvcmVkUG9zaXRpb24oKSB8fCB0aGlzLnNjcm9sbFRvQW5jaG9yKCkgfHwgdGhpcy52aWV3LnNjcm9sbFRvVG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvQW5jaG9yKCkgfHwgdGhpcy52aWV3LnNjcm9sbFRvVG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pc1NhbWVQYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS52aXNpdFNjcm9sbGVkVG9TYW1lUGFnZUxvY2F0aW9uKHRoaXMudmlldy5sYXN0UmVuZGVyZWRMb2NhdGlvbiwgdGhpcy5sb2NhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNjcm9sbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY3JvbGxUb1Jlc3RvcmVkUG9zaXRpb24oKSB7XG4gICAgICAgIGNvbnN0IHsgc2Nyb2xsUG9zaXRpb24gfSA9IHRoaXMucmVzdG9yYXRpb25EYXRhO1xuICAgICAgICBpZiAoc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxUb1Bvc2l0aW9uKHNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNjcm9sbFRvQW5jaG9yKCkge1xuICAgICAgICBjb25zdCBhbmNob3IgPSBnZXRBbmNob3IodGhpcy5sb2NhdGlvbik7XG4gICAgICAgIGlmIChhbmNob3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy52aWV3LnNjcm9sbFRvQW5jaG9yKGFuY2hvcik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWNvcmRUaW1pbmdNZXRyaWMobWV0cmljKSB7XG4gICAgICAgIHRoaXMudGltaW5nTWV0cmljc1ttZXRyaWNdID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgfVxuICAgIGdldFRpbWluZ01ldHJpY3MoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnRpbWluZ01ldHJpY3MpO1xuICAgIH1cbiAgICBnZXRIaXN0b3J5TWV0aG9kRm9yQWN0aW9uKGFjdGlvbikge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBcInJlcGxhY2VcIjogcmV0dXJuIGhpc3RvcnkucmVwbGFjZVN0YXRlO1xuICAgICAgICAgICAgY2FzZSBcImFkdmFuY2VcIjpcbiAgICAgICAgICAgIGNhc2UgXCJyZXN0b3JlXCI6IHJldHVybiBoaXN0b3J5LnB1c2hTdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNQcmVsb2FkZWRSZXNwb25zZSgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnJlc3BvbnNlID09IFwib2JqZWN0XCI7XG4gICAgfVxuICAgIHNob3VsZElzc3VlUmVxdWVzdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTYW1lUGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWN0aW9uID09IFwicmVzdG9yZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuaGFzQ2FjaGVkU25hcHNob3QoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhY2hlU25hcHNob3QoKSB7XG4gICAgICAgIGlmICghdGhpcy5zbmFwc2hvdENhY2hlZCkge1xuICAgICAgICAgICAgdGhpcy52aWV3LmNhY2hlU25hcHNob3QoKTtcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3RDYWNoZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlbmRlcihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmNhbmNlbFJlbmRlcigpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuZnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IGNhbGxiYWNrKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmZyYW1lO1xuICAgICAgICB0aGlzLnBlcmZvcm1TY3JvbGwoKTtcbiAgICB9XG4gICAgY2FuY2VsUmVuZGVyKCkge1xuICAgICAgICBpZiAodGhpcy5mcmFtZSkge1xuICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5mcmFtZSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5mcmFtZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGlzU3VjY2Vzc2Z1bChzdGF0dXNDb2RlKSB7XG4gICAgcmV0dXJuIHN0YXR1c0NvZGUgPj0gMjAwICYmIHN0YXR1c0NvZGUgPCAzMDA7XG59XG5cbmNsYXNzIEJyb3dzZXJBZGFwdGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzZXNzaW9uKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXI7XG4gICAgICAgIHRoaXMuc2hvd1Byb2dyZXNzQmFyID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0Jhci5zaG93KCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgfVxuICAgIHZpc2l0UHJvcG9zZWRUb0xvY2F0aW9uKGxvY2F0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdG9yLnN0YXJ0VmlzaXQobG9jYXRpb24sIHV1aWQoKSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHZpc2l0U3RhcnRlZCh2aXNpdCkge1xuICAgICAgICB2aXNpdC5pc3N1ZVJlcXVlc3QoKTtcbiAgICAgICAgdmlzaXQuY2hhbmdlSGlzdG9yeSgpO1xuICAgICAgICB2aXNpdC5nb1RvU2FtZVBhZ2VBbmNob3IoKTtcbiAgICAgICAgdmlzaXQubG9hZENhY2hlZFNuYXBzaG90KCk7XG4gICAgfVxuICAgIHZpc2l0UmVxdWVzdFN0YXJ0ZWQodmlzaXQpIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0Jhci5zZXRWYWx1ZSgwKTtcbiAgICAgICAgaWYgKHZpc2l0Lmhhc0NhY2hlZFNuYXBzaG90KCkgfHwgdmlzaXQuYWN0aW9uICE9IFwicmVzdG9yZVwiKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dWaXNpdFByb2dyZXNzQmFyQWZ0ZXJEZWxheSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93UHJvZ3Jlc3NCYXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFJlcXVlc3RDb21wbGV0ZWQodmlzaXQpIHtcbiAgICAgICAgdmlzaXQubG9hZFJlc3BvbnNlKCk7XG4gICAgfVxuICAgIHZpc2l0UmVxdWVzdEZhaWxlZFdpdGhTdGF0dXNDb2RlKHZpc2l0LCBzdGF0dXNDb2RlKSB7XG4gICAgICAgIHN3aXRjaCAoc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgY2FzZSBTeXN0ZW1TdGF0dXNDb2RlLm5ldHdvcmtGYWlsdXJlOlxuICAgICAgICAgICAgY2FzZSBTeXN0ZW1TdGF0dXNDb2RlLnRpbWVvdXRGYWlsdXJlOlxuICAgICAgICAgICAgY2FzZSBTeXN0ZW1TdGF0dXNDb2RlLmNvbnRlbnRUeXBlTWlzbWF0Y2g6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdC5sb2FkUmVzcG9uc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFJlcXVlc3RGaW5pc2hlZCh2aXNpdCkge1xuICAgICAgICB0aGlzLnByb2dyZXNzQmFyLnNldFZhbHVlKDEpO1xuICAgICAgICB0aGlzLmhpZGVWaXNpdFByb2dyZXNzQmFyKCk7XG4gICAgfVxuICAgIHZpc2l0Q29tcGxldGVkKHZpc2l0KSB7XG4gICAgfVxuICAgIHBhZ2VJbnZhbGlkYXRlZCgpIHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gICAgdmlzaXRGYWlsZWQodmlzaXQpIHtcbiAgICB9XG4gICAgdmlzaXRSZW5kZXJlZCh2aXNpdCkge1xuICAgIH1cbiAgICBmb3JtU3VibWlzc2lvblN0YXJ0ZWQoZm9ybVN1Ym1pc3Npb24pIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0Jhci5zZXRWYWx1ZSgwKTtcbiAgICAgICAgdGhpcy5zaG93Rm9ybVByb2dyZXNzQmFyQWZ0ZXJEZWxheSgpO1xuICAgIH1cbiAgICBmb3JtU3VibWlzc2lvbkZpbmlzaGVkKGZvcm1TdWJtaXNzaW9uKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXIuc2V0VmFsdWUoMSk7XG4gICAgICAgIHRoaXMuaGlkZUZvcm1Qcm9ncmVzc0JhcigpO1xuICAgIH1cbiAgICBzaG93VmlzaXRQcm9ncmVzc0JhckFmdGVyRGVsYXkoKSB7XG4gICAgICAgIHRoaXMudmlzaXRQcm9ncmVzc0JhclRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNob3dQcm9ncmVzc0JhciwgdGhpcy5zZXNzaW9uLnByb2dyZXNzQmFyRGVsYXkpO1xuICAgIH1cbiAgICBoaWRlVmlzaXRQcm9ncmVzc0JhcigpIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0Jhci5oaWRlKCk7XG4gICAgICAgIGlmICh0aGlzLnZpc2l0UHJvZ3Jlc3NCYXJUaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52aXNpdFByb2dyZXNzQmFyVGltZW91dCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy52aXNpdFByb2dyZXNzQmFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzaG93Rm9ybVByb2dyZXNzQmFyQWZ0ZXJEZWxheSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybVByb2dyZXNzQmFyVGltZW91dCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Qcm9ncmVzc0JhclRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNob3dQcm9ncmVzc0JhciwgdGhpcy5zZXNzaW9uLnByb2dyZXNzQmFyRGVsYXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhpZGVGb3JtUHJvZ3Jlc3NCYXIoKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXIuaGlkZSgpO1xuICAgICAgICBpZiAodGhpcy5mb3JtUHJvZ3Jlc3NCYXJUaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5mb3JtUHJvZ3Jlc3NCYXJUaW1lb3V0KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZvcm1Qcm9ncmVzc0JhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVsb2FkKCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfVxuICAgIGdldCBuYXZpZ2F0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24ubmF2aWdhdG9yO1xuICAgIH1cbn1cblxuY2xhc3MgQ2FjaGVPYnNlcnZlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKFwidHVyYm86YmVmb3JlLWNhY2hlXCIsIHRoaXMucmVtb3ZlU3RhbGVFbGVtZW50cywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihcInR1cmJvOmJlZm9yZS1jYWNoZVwiLCB0aGlzLnJlbW92ZVN0YWxlRWxlbWVudHMsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVTdGFsZUVsZW1lbnRzKCkge1xuICAgICAgICBjb25zdCBzdGFsZUVsZW1lbnRzID0gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXR1cmJvLWNhY2hlPVwiZmFsc2VcIl0nKV07XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBzdGFsZUVsZW1lbnRzKSB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBGb3JtU3VibWl0T2JzZXJ2ZXIge1xuICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlKSB7XG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1Ym1pdENhcHR1cmVkID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCB0aGlzLnN1Ym1pdEJ1YmJsZWQsIGZhbHNlKTtcbiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgdGhpcy5zdWJtaXRCdWJibGVkLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3VibWl0QnViYmxlZCA9ICgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgPyBldmVudC50YXJnZXQgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VibWl0dGVyID0gZXZlbnQuc3VibWl0dGVyIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoZm9ybSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRob2QgPSAoc3VibWl0dGVyID09PSBudWxsIHx8IHN1Ym1pdHRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3VibWl0dGVyLmdldEF0dHJpYnV0ZShcImZvcm1tZXRob2RcIikpIHx8IGZvcm0ubWV0aG9kO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9IFwiZGlhbG9nXCIgJiYgdGhpcy5kZWxlZ2F0ZS53aWxsU3VibWl0Rm9ybShmb3JtLCBzdWJtaXR0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5mb3JtU3VibWl0dGVkKGZvcm0sIHN1Ym1pdHRlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCB0aGlzLnN1Ym1pdENhcHR1cmVkLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCB0aGlzLnN1Ym1pdENhcHR1cmVkLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBGcmFtZVJlZGlyZWN0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5saW5rSW50ZXJjZXB0b3IgPSBuZXcgTGlua0ludGVyY2VwdG9yKHRoaXMsIGVsZW1lbnQpO1xuICAgICAgICB0aGlzLmZvcm1JbnRlcmNlcHRvciA9IG5ldyBGb3JtSW50ZXJjZXB0b3IodGhpcywgZWxlbWVudCk7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICB0aGlzLmxpbmtJbnRlcmNlcHRvci5zdGFydCgpO1xuICAgICAgICB0aGlzLmZvcm1JbnRlcmNlcHRvci5zdGFydCgpO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICB0aGlzLmxpbmtJbnRlcmNlcHRvci5zdG9wKCk7XG4gICAgICAgIHRoaXMuZm9ybUludGVyY2VwdG9yLnN0b3AoKTtcbiAgICB9XG4gICAgc2hvdWxkSW50ZXJjZXB0TGlua0NsaWNrKGVsZW1lbnQsIHVybCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaG91bGRSZWRpcmVjdChlbGVtZW50KTtcbiAgICB9XG4gICAgbGlua0NsaWNrSW50ZXJjZXB0ZWQoZWxlbWVudCwgdXJsKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5maW5kRnJhbWVFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIGZyYW1lLnNldEF0dHJpYnV0ZShcInJlbG9hZGFibGVcIiwgXCJcIik7XG4gICAgICAgICAgICBmcmFtZS5zcmMgPSB1cmw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2hvdWxkSW50ZXJjZXB0Rm9ybVN1Ym1pc3Npb24oZWxlbWVudCwgc3VibWl0dGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3VsZFJlZGlyZWN0KGVsZW1lbnQsIHN1Ym1pdHRlcik7XG4gICAgfVxuICAgIGZvcm1TdWJtaXNzaW9uSW50ZXJjZXB0ZWQoZWxlbWVudCwgc3VibWl0dGVyKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5maW5kRnJhbWVFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIGZyYW1lLnJlbW92ZUF0dHJpYnV0ZShcInJlbG9hZGFibGVcIik7XG4gICAgICAgICAgICBmcmFtZS5kZWxlZ2F0ZS5mb3JtU3VibWlzc2lvbkludGVyY2VwdGVkKGVsZW1lbnQsIHN1Ym1pdHRlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2hvdWxkUmVkaXJlY3QoZWxlbWVudCwgc3VibWl0dGVyKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5maW5kRnJhbWVFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gZnJhbWUgPyBmcmFtZSAhPSBlbGVtZW50LmNsb3Nlc3QoXCJ0dXJiby1mcmFtZVwiKSA6IGZhbHNlO1xuICAgIH1cbiAgICBmaW5kRnJhbWVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdHVyYm8tZnJhbWVcIik7XG4gICAgICAgIGlmIChpZCAmJiBpZCAhPSBcIl90b3BcIikge1xuICAgICAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihgIyR7aWR9Om5vdChbZGlzYWJsZWRdKWApO1xuICAgICAgICAgICAgaWYgKGZyYW1lIGluc3RhbmNlb2YgRnJhbWVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBIaXN0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICB0aGlzLnJlc3RvcmF0aW9uSWRlbnRpZmllciA9IHV1aWQoKTtcbiAgICAgICAgdGhpcy5yZXN0b3JhdGlvbkRhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGFnZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uUG9wU3RhdGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZEhhbmRsZVBvcFN0YXRlKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHR1cmJvIH0gPSBldmVudC5zdGF0ZSB8fCB7fTtcbiAgICAgICAgICAgICAgICBpZiAodHVyYm8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHJlc3RvcmF0aW9uSWRlbnRpZmllciB9ID0gdHVyYm87XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yYXRpb25JZGVudGlmaWVyID0gcmVzdG9yYXRpb25JZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmhpc3RvcnlQb3BwZWRUb0xvY2F0aW9uV2l0aFJlc3RvcmF0aW9uSWRlbnRpZmllcih0aGlzLmxvY2F0aW9uLCByZXN0b3JhdGlvbklkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vblBhZ2VMb2FkID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBuZXh0TWljcm90YXNrKCk7XG4gICAgICAgICAgICB0aGlzLnBhZ2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHRoaXMub25Qb3BTdGF0ZSwgZmFsc2UpO1xuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgdGhpcy5vblBhZ2VMb2FkLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlKG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5vblBvcFN0YXRlLCBmYWxzZSk7XG4gICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLCB0aGlzLm9uUGFnZUxvYWQsIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1c2gobG9jYXRpb24sIHJlc3RvcmF0aW9uSWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLnVwZGF0ZShoaXN0b3J5LnB1c2hTdGF0ZSwgbG9jYXRpb24sIHJlc3RvcmF0aW9uSWRlbnRpZmllcik7XG4gICAgfVxuICAgIHJlcGxhY2UobG9jYXRpb24sIHJlc3RvcmF0aW9uSWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLnVwZGF0ZShoaXN0b3J5LnJlcGxhY2VTdGF0ZSwgbG9jYXRpb24sIHJlc3RvcmF0aW9uSWRlbnRpZmllcik7XG4gICAgfVxuICAgIHVwZGF0ZShtZXRob2QsIGxvY2F0aW9uLCByZXN0b3JhdGlvbklkZW50aWZpZXIgPSB1dWlkKCkpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7IHR1cmJvOiB7IHJlc3RvcmF0aW9uSWRlbnRpZmllciB9IH07XG4gICAgICAgIG1ldGhvZC5jYWxsKGhpc3RvcnksIHN0YXRlLCBcIlwiLCBsb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgICB0aGlzLnJlc3RvcmF0aW9uSWRlbnRpZmllciA9IHJlc3RvcmF0aW9uSWRlbnRpZmllcjtcbiAgICB9XG4gICAgZ2V0UmVzdG9yYXRpb25EYXRhRm9ySWRlbnRpZmllcihyZXN0b3JhdGlvbklkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdG9yYXRpb25EYXRhW3Jlc3RvcmF0aW9uSWRlbnRpZmllcl0gfHwge307XG4gICAgfVxuICAgIHVwZGF0ZVJlc3RvcmF0aW9uRGF0YShhZGRpdGlvbmFsRGF0YSkge1xuICAgICAgICBjb25zdCB7IHJlc3RvcmF0aW9uSWRlbnRpZmllciB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgcmVzdG9yYXRpb25EYXRhID0gdGhpcy5yZXN0b3JhdGlvbkRhdGFbcmVzdG9yYXRpb25JZGVudGlmaWVyXTtcbiAgICAgICAgdGhpcy5yZXN0b3JhdGlvbkRhdGFbcmVzdG9yYXRpb25JZGVudGlmaWVyXSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdG9yYXRpb25EYXRhKSwgYWRkaXRpb25hbERhdGEpO1xuICAgIH1cbiAgICBhc3N1bWVDb250cm9sT2ZTY3JvbGxSZXN0b3JhdGlvbigpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMucHJldmlvdXNTY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c1Njcm9sbFJlc3RvcmF0aW9uID0gKF9hID0gaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJhdXRvXCI7XG4gICAgICAgICAgICBoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gXCJtYW51YWxcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWxpbnF1aXNoQ29udHJvbE9mU2Nyb2xsUmVzdG9yYXRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzU2Nyb2xsUmVzdG9yYXRpb24pIHtcbiAgICAgICAgICAgIGhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24gPSB0aGlzLnByZXZpb3VzU2Nyb2xsUmVzdG9yYXRpb247XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5wcmV2aW91c1Njcm9sbFJlc3RvcmF0aW9uO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNob3VsZEhhbmRsZVBvcFN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlSXNMb2FkZWQoKTtcbiAgICB9XG4gICAgcGFnZUlzTG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlTG9hZGVkIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gXCJjb21wbGV0ZVwiO1xuICAgIH1cbn1cblxuY2xhc3MgTGlua0NsaWNrT2JzZXJ2ZXIge1xuICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlKSB7XG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNsaWNrQ2FwdHVyZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5jbGlja0J1YmJsZWQsIGZhbHNlKTtcbiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmNsaWNrQnViYmxlZCwgZmFsc2UpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNsaWNrQnViYmxlZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2xpY2tFdmVudElzU2lnbmlmaWNhbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gKGV2ZW50LmNvbXBvc2VkUGF0aCAmJiBldmVudC5jb21wb3NlZFBhdGgoKVswXSkgfHwgZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSB0aGlzLmZpbmRMaW5rRnJvbUNsaWNrVGFyZ2V0KHRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmdldExvY2F0aW9uRm9yTGluayhsaW5rKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVsZWdhdGUud2lsbEZvbGxvd0xpbmtUb0xvY2F0aW9uKGxpbmssIGxvY2F0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuZm9sbG93ZWRMaW5rVG9Mb2NhdGlvbihsaW5rLCBsb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5jbGlja0NhcHR1cmVkLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuY2xpY2tDYXB0dXJlZCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjbGlja0V2ZW50SXNTaWduaWZpY2FudChldmVudCkge1xuICAgICAgICByZXR1cm4gISgoZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSlcbiAgICAgICAgICAgIHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWRcbiAgICAgICAgICAgIHx8IGV2ZW50LndoaWNoID4gMVxuICAgICAgICAgICAgfHwgZXZlbnQuYWx0S2V5XG4gICAgICAgICAgICB8fCBldmVudC5jdHJsS2V5XG4gICAgICAgICAgICB8fCBldmVudC5tZXRhS2V5XG4gICAgICAgICAgICB8fCBldmVudC5zaGlmdEtleSk7XG4gICAgfVxuICAgIGZpbmRMaW5rRnJvbUNsaWNrVGFyZ2V0KHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5jbG9zZXN0KFwiYVtocmVmXTpub3QoW3RhcmdldF49X10pOm5vdChbZG93bmxvYWRdKVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRMb2NhdGlvbkZvckxpbmsobGluaykge1xuICAgICAgICByZXR1cm4gZXhwYW5kVVJMKGxpbmsuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSB8fCBcIlwiKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzQWN0aW9uKGFjdGlvbikge1xuICAgIHJldHVybiBhY3Rpb24gPT0gXCJhZHZhbmNlXCIgfHwgYWN0aW9uID09IFwicmVwbGFjZVwiIHx8IGFjdGlvbiA9PSBcInJlc3RvcmVcIjtcbn1cblxuY2xhc3MgTmF2aWdhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgfVxuICAgIHByb3Bvc2VWaXNpdChsb2NhdGlvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLmRlbGVnYXRlLmFsbG93c1Zpc2l0aW5nTG9jYXRpb25XaXRoQWN0aW9uKGxvY2F0aW9uLCBvcHRpb25zLmFjdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUudmlzaXRQcm9wb3NlZFRvTG9jYXRpb24obG9jYXRpb24sIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXJ0VmlzaXQobG9jYXRhYmxlLCByZXN0b3JhdGlvbklkZW50aWZpZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlzaXQgPSBuZXcgVmlzaXQodGhpcywgZXhwYW5kVVJMKGxvY2F0YWJsZSksIHJlc3RvcmF0aW9uSWRlbnRpZmllciwgT2JqZWN0LmFzc2lnbih7IHJlZmVycmVyOiB0aGlzLmxvY2F0aW9uIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlzaXQuc3RhcnQoKTtcbiAgICB9XG4gICAgc3VibWl0Rm9ybShmb3JtLCBzdWJtaXR0ZXIpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIHRoaXMuZm9ybVN1Ym1pc3Npb24gPSBuZXcgRm9ybVN1Ym1pc3Npb24odGhpcywgZm9ybSwgc3VibWl0dGVyLCB0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybVN1Ym1pc3Npb24uaXNJZGVtcG90ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnByb3Bvc2VWaXNpdCh0aGlzLmZvcm1TdWJtaXNzaW9uLmZldGNoUmVxdWVzdC51cmwsIHsgYWN0aW9uOiB0aGlzLmdldEFjdGlvbkZvckZvcm1TdWJtaXNzaW9uKHRoaXMuZm9ybVN1Ym1pc3Npb24pIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb3JtU3VibWlzc2lvbi5zdGFydCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1TdWJtaXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1TdWJtaXNzaW9uLnN0b3AoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZvcm1TdWJtaXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWaXNpdCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlzaXQuY2FuY2VsKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50VmlzaXQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmFkYXB0ZXI7XG4gICAgfVxuICAgIGdldCB2aWV3KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS52aWV3O1xuICAgIH1cbiAgICBnZXQgaGlzdG9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUuaGlzdG9yeTtcbiAgICB9XG4gICAgZm9ybVN1Ym1pc3Npb25TdGFydGVkKGZvcm1TdWJtaXNzaW9uKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hZGFwdGVyLmZvcm1TdWJtaXNzaW9uU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5hZGFwdGVyLmZvcm1TdWJtaXNzaW9uU3RhcnRlZChmb3JtU3VibWlzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZm9ybVN1Ym1pc3Npb25TdWNjZWVkZWRXaXRoUmVzcG9uc2UoZm9ybVN1Ym1pc3Npb24sIGZldGNoUmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGZvcm1TdWJtaXNzaW9uID09IHRoaXMuZm9ybVN1Ym1pc3Npb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSFRNTCA9IGF3YWl0IGZldGNoUmVzcG9uc2UucmVzcG9uc2VIVE1MO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlSFRNTCkge1xuICAgICAgICAgICAgICAgIGlmIChmb3JtU3VibWlzc2lvbi5tZXRob2QgIT0gRmV0Y2hNZXRob2QuZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlldy5jbGVhclNuYXBzaG90Q2FjaGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzdGF0dXNDb2RlIH0gPSBmZXRjaFJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0T3B0aW9ucyA9IHsgcmVzcG9uc2U6IHsgc3RhdHVzQ29kZSwgcmVzcG9uc2VIVE1MIH0gfTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3Bvc2VWaXNpdChmZXRjaFJlc3BvbnNlLmxvY2F0aW9uLCB2aXNpdE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGZvcm1TdWJtaXNzaW9uRmFpbGVkV2l0aFJlc3BvbnNlKGZvcm1TdWJtaXNzaW9uLCBmZXRjaFJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlSFRNTCA9IGF3YWl0IGZldGNoUmVzcG9uc2UucmVzcG9uc2VIVE1MO1xuICAgICAgICBpZiAocmVzcG9uc2VIVE1MKSB7XG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IFBhZ2VTbmFwc2hvdC5mcm9tSFRNTFN0cmluZyhyZXNwb25zZUhUTUwpO1xuICAgICAgICAgICAgaWYgKGZldGNoUmVzcG9uc2Uuc2VydmVyRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyRXJyb3Ioc25hcHNob3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy52aWV3LnJlbmRlclBhZ2Uoc25hcHNob3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aWV3LnNjcm9sbFRvVG9wKCk7XG4gICAgICAgICAgICB0aGlzLnZpZXcuY2xlYXJTbmFwc2hvdENhY2hlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9ybVN1Ym1pc3Npb25FcnJvcmVkKGZvcm1TdWJtaXNzaW9uLCBlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgZm9ybVN1Ym1pc3Npb25GaW5pc2hlZChmb3JtU3VibWlzc2lvbikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYWRhcHRlci5mb3JtU3VibWlzc2lvbkZpbmlzaGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmFkYXB0ZXIuZm9ybVN1Ym1pc3Npb25GaW5pc2hlZChmb3JtU3VibWlzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRTdGFydGVkKHZpc2l0KSB7XG4gICAgICAgIHRoaXMuZGVsZWdhdGUudmlzaXRTdGFydGVkKHZpc2l0KTtcbiAgICB9XG4gICAgdmlzaXRDb21wbGV0ZWQodmlzaXQpIHtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS52aXNpdENvbXBsZXRlZCh2aXNpdCk7XG4gICAgfVxuICAgIGxvY2F0aW9uV2l0aEFjdGlvbklzU2FtZVBhZ2UobG9jYXRpb24sIGFjdGlvbikge1xuICAgICAgICBjb25zdCBhbmNob3IgPSBnZXRBbmNob3IobG9jYXRpb24pO1xuICAgICAgICBjb25zdCBjdXJyZW50QW5jaG9yID0gZ2V0QW5jaG9yKHRoaXMudmlldy5sYXN0UmVuZGVyZWRMb2NhdGlvbik7XG4gICAgICAgIGNvbnN0IGlzUmVzdG9yYXRpb25Ub1RvcCA9IGFjdGlvbiA9PT0gJ3Jlc3RvcmUnICYmIHR5cGVvZiBhbmNob3IgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICByZXR1cm4gYWN0aW9uICE9PSBcInJlcGxhY2VcIiAmJlxuICAgICAgICAgICAgZ2V0UmVxdWVzdFVSTChsb2NhdGlvbikgPT09IGdldFJlcXVlc3RVUkwodGhpcy52aWV3Lmxhc3RSZW5kZXJlZExvY2F0aW9uKSAmJlxuICAgICAgICAgICAgKGlzUmVzdG9yYXRpb25Ub1RvcCB8fCAoYW5jaG9yICE9IG51bGwgJiYgYW5jaG9yICE9PSBjdXJyZW50QW5jaG9yKSk7XG4gICAgfVxuICAgIHZpc2l0U2Nyb2xsZWRUb1NhbWVQYWdlTG9jYXRpb24ob2xkVVJMLCBuZXdVUkwpIHtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS52aXNpdFNjcm9sbGVkVG9TYW1lUGFnZUxvY2F0aW9uKG9sZFVSTCwgbmV3VVJMKTtcbiAgICB9XG4gICAgZ2V0IGxvY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oaXN0b3J5LmxvY2F0aW9uO1xuICAgIH1cbiAgICBnZXQgcmVzdG9yYXRpb25JZGVudGlmaWVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oaXN0b3J5LnJlc3RvcmF0aW9uSWRlbnRpZmllcjtcbiAgICB9XG4gICAgZ2V0QWN0aW9uRm9yRm9ybVN1Ym1pc3Npb24oZm9ybVN1Ym1pc3Npb24pIHtcbiAgICAgICAgY29uc3QgeyBmb3JtRWxlbWVudCwgc3VibWl0dGVyIH0gPSBmb3JtU3VibWlzc2lvbjtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gKHN1Ym1pdHRlciA9PT0gbnVsbCB8fCBzdWJtaXR0ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJkYXRhLXR1cmJvLWFjdGlvblwiKSkgfHwgZm9ybUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS10dXJiby1hY3Rpb25cIik7XG4gICAgICAgIHJldHVybiBpc0FjdGlvbihhY3Rpb24pID8gYWN0aW9uIDogXCJhZHZhbmNlXCI7XG4gICAgfVxufVxuXG52YXIgUGFnZVN0YWdlO1xuKGZ1bmN0aW9uIChQYWdlU3RhZ2UpIHtcbiAgICBQYWdlU3RhZ2VbUGFnZVN0YWdlW1wiaW5pdGlhbFwiXSA9IDBdID0gXCJpbml0aWFsXCI7XG4gICAgUGFnZVN0YWdlW1BhZ2VTdGFnZVtcImxvYWRpbmdcIl0gPSAxXSA9IFwibG9hZGluZ1wiO1xuICAgIFBhZ2VTdGFnZVtQYWdlU3RhZ2VbXCJpbnRlcmFjdGl2ZVwiXSA9IDJdID0gXCJpbnRlcmFjdGl2ZVwiO1xuICAgIFBhZ2VTdGFnZVtQYWdlU3RhZ2VbXCJjb21wbGV0ZVwiXSA9IDNdID0gXCJjb21wbGV0ZVwiO1xufSkoUGFnZVN0YWdlIHx8IChQYWdlU3RhZ2UgPSB7fSkpO1xuY2xhc3MgUGFnZU9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICB0aGlzLnN0YWdlID0gUGFnZVN0YWdlLmluaXRpYWw7XG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmludGVycHJldFJlYWR5U3RhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHJlYWR5U3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgICBpZiAocmVhZHlTdGF0ZSA9PSBcImludGVyYWN0aXZlXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VJc0ludGVyYWN0aXZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWFkeVN0YXRlID09IFwiY29tcGxldGVcIikge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZUlzQ29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wYWdlV2lsbFVubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUucGFnZVdpbGxVbmxvYWQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YWdlID09IFBhZ2VTdGFnZS5pbml0aWFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFnZSA9IFBhZ2VTdGFnZS5sb2FkaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInJlYWR5c3RhdGVjaGFuZ2VcIiwgdGhpcy5pbnRlcnByZXRSZWFkeVN0YXRlLCBmYWxzZSk7XG4gICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgdGhpcy5wYWdlV2lsbFVubG9hZCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVhZHlzdGF0ZWNoYW5nZVwiLCB0aGlzLmludGVycHJldFJlYWR5U3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCB0aGlzLnBhZ2VXaWxsVW5sb2FkLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYWdlSXNJbnRlcmFjdGl2ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhZ2UgPT0gUGFnZVN0YWdlLmxvYWRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhZ2UgPSBQYWdlU3RhZ2UuaW50ZXJhY3RpdmU7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnBhZ2VCZWNhbWVJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBhZ2VJc0NvbXBsZXRlKCkge1xuICAgICAgICB0aGlzLnBhZ2VJc0ludGVyYWN0aXZlKCk7XG4gICAgICAgIGlmICh0aGlzLnN0YWdlID09IFBhZ2VTdGFnZS5pbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5zdGFnZSA9IFBhZ2VTdGFnZS5jb21wbGV0ZTtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUucGFnZUxvYWRlZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCByZWFkeVN0YXRlKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucmVhZHlTdGF0ZTtcbiAgICB9XG59XG5cbmNsYXNzIFNjcm9sbE9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vblNjcm9sbCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oeyB4OiB3aW5kb3cucGFnZVhPZmZzZXQsIHk6IHdpbmRvdy5wYWdlWU9mZnNldCB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5vblNjcm9sbCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwsIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZVBvc2l0aW9uKHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuZGVsZWdhdGUuc2Nyb2xsUG9zaXRpb25DaGFuZ2VkKHBvc2l0aW9uKTtcbiAgICB9XG59XG5cbmNsYXNzIFN0cmVhbU9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICB0aGlzLnNvdXJjZXMgPSBuZXcgU2V0O1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnNwZWN0RmV0Y2hSZXNwb25zZSA9ICgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZmV0Y2hSZXNwb25zZUZyb21FdmVudChldmVudCk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgZmV0Y2hSZXNwb25zZUlzU3RyZWFtKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNlaXZlTWVzc2FnZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVjZWl2ZU1lc3NhZ2VFdmVudCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCAmJiB0eXBlb2YgZXZlbnQuZGF0YSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNlaXZlTWVzc2FnZUhUTUwoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihcInR1cmJvOmJlZm9yZS1mZXRjaC1yZXNwb25zZVwiLCB0aGlzLmluc3BlY3RGZXRjaFJlc3BvbnNlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwidHVyYm86YmVmb3JlLWZldGNoLXJlc3BvbnNlXCIsIHRoaXMuaW5zcGVjdEZldGNoUmVzcG9uc2UsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25uZWN0U3RyZWFtU291cmNlKHNvdXJjZSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RyZWFtU291cmNlSXNDb25uZWN0ZWQoc291cmNlKSkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VzLmFkZChzb3VyY2UpO1xuICAgICAgICAgICAgc291cmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMucmVjZWl2ZU1lc3NhZ2VFdmVudCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc2Nvbm5lY3RTdHJlYW1Tb3VyY2Uoc291cmNlKSB7XG4gICAgICAgIGlmICh0aGlzLnN0cmVhbVNvdXJjZUlzQ29ubmVjdGVkKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5kZWxldGUoc291cmNlKTtcbiAgICAgICAgICAgIHNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLnJlY2VpdmVNZXNzYWdlRXZlbnQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdHJlYW1Tb3VyY2VJc0Nvbm5lY3RlZChzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlcy5oYXMoc291cmNlKTtcbiAgICB9XG4gICAgYXN5bmMgcmVjZWl2ZU1lc3NhZ2VSZXNwb25zZShyZXNwb25zZSkge1xuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UucmVzcG9uc2VIVE1MO1xuICAgICAgICBpZiAoaHRtbCkge1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlTWVzc2FnZUhUTUwoaHRtbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVjZWl2ZU1lc3NhZ2VIVE1MKGh0bWwpIHtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZWNlaXZlZE1lc3NhZ2VGcm9tU3RyZWFtKG5ldyBTdHJlYW1NZXNzYWdlKGh0bWwpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmZXRjaFJlc3BvbnNlRnJvbUV2ZW50KGV2ZW50KSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IGZldGNoUmVzcG9uc2UgPSAoX2EgPSBldmVudC5kZXRhaWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mZXRjaFJlc3BvbnNlO1xuICAgIGlmIChmZXRjaFJlc3BvbnNlIGluc3RhbmNlb2YgRmV0Y2hSZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gZmV0Y2hSZXNwb25zZTtcbiAgICB9XG59XG5mdW5jdGlvbiBmZXRjaFJlc3BvbnNlSXNTdHJlYW0ocmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSAoX2EgPSByZXNwb25zZS5jb250ZW50VHlwZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIjtcbiAgICByZXR1cm4gY29udGVudFR5cGUuc3RhcnRzV2l0aChTdHJlYW1NZXNzYWdlLmNvbnRlbnRUeXBlKTtcbn1cblxuY2xhc3MgRXJyb3JSZW5kZXJlciBleHRlbmRzIFJlbmRlcmVyIHtcbiAgICBhc3luYyByZW5kZXIoKSB7XG4gICAgICAgIHRoaXMucmVwbGFjZUhlYWRBbmRCb2R5KCk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVTY3JpcHRFbGVtZW50cygpO1xuICAgIH1cbiAgICByZXBsYWNlSGVhZEFuZEJvZHkoKSB7XG4gICAgICAgIGNvbnN0IHsgZG9jdW1lbnRFbGVtZW50LCBoZWFkLCBib2R5IH0gPSBkb2N1bWVudDtcbiAgICAgICAgZG9jdW1lbnRFbGVtZW50LnJlcGxhY2VDaGlsZCh0aGlzLm5ld0hlYWQsIGhlYWQpO1xuICAgICAgICBkb2N1bWVudEVsZW1lbnQucmVwbGFjZUNoaWxkKHRoaXMubmV3RWxlbWVudCwgYm9keSk7XG4gICAgfVxuICAgIGFjdGl2YXRlU2NyaXB0RWxlbWVudHMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVwbGFjZWFibGVFbGVtZW50IG9mIHRoaXMuc2NyaXB0RWxlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSByZXBsYWNlYWJsZUVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY3JlYXRlU2NyaXB0RWxlbWVudChyZXBsYWNlYWJsZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVsZW1lbnQsIHJlcGxhY2VhYmxlRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG5ld0hlYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ld1NuYXBzaG90LmhlYWRTbmFwc2hvdC5lbGVtZW50O1xuICAgIH1cbiAgICBnZXQgc2NyaXB0RWxlbWVudHMoKSB7XG4gICAgICAgIHJldHVybiBbLi4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzY3JpcHRcIildO1xuICAgIH1cbn1cblxuY2xhc3MgUGFnZVJlbmRlcmVyIGV4dGVuZHMgUmVuZGVyZXIge1xuICAgIGdldCBzaG91bGRSZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ld1NuYXBzaG90LmlzVmlzaXRhYmxlICYmIHRoaXMudHJhY2tlZEVsZW1lbnRzQXJlSWRlbnRpY2FsO1xuICAgIH1cbiAgICBwcmVwYXJlVG9SZW5kZXIoKSB7XG4gICAgICAgIHRoaXMubWVyZ2VIZWFkKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlbmRlcigpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlQm9keSgpO1xuICAgIH1cbiAgICBmaW5pc2hSZW5kZXJpbmcoKSB7XG4gICAgICAgIHN1cGVyLmZpbmlzaFJlbmRlcmluZygpO1xuICAgICAgICBpZiAoIXRoaXMuaXNQcmV2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRmlyc3RBdXRvZm9jdXNhYmxlRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjdXJyZW50SGVhZFNuYXBzaG90KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50U25hcHNob3QuaGVhZFNuYXBzaG90O1xuICAgIH1cbiAgICBnZXQgbmV3SGVhZFNuYXBzaG90KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXdTbmFwc2hvdC5oZWFkU25hcHNob3Q7XG4gICAgfVxuICAgIGdldCBuZXdFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXdTbmFwc2hvdC5lbGVtZW50O1xuICAgIH1cbiAgICBtZXJnZUhlYWQoKSB7XG4gICAgICAgIHRoaXMuY29weU5ld0hlYWRTdHlsZXNoZWV0RWxlbWVudHMoKTtcbiAgICAgICAgdGhpcy5jb3B5TmV3SGVhZFNjcmlwdEVsZW1lbnRzKCk7XG4gICAgICAgIHRoaXMucmVtb3ZlQ3VycmVudEhlYWRQcm92aXNpb25hbEVsZW1lbnRzKCk7XG4gICAgICAgIHRoaXMuY29weU5ld0hlYWRQcm92aXNpb25hbEVsZW1lbnRzKCk7XG4gICAgfVxuICAgIHJlcGxhY2VCb2R5KCkge1xuICAgICAgICB0aGlzLnByZXNlcnZpbmdQZXJtYW5lbnRFbGVtZW50cygoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlTmV3Qm9keSgpO1xuICAgICAgICAgICAgdGhpcy5hc3NpZ25OZXdCb2R5KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgdHJhY2tlZEVsZW1lbnRzQXJlSWRlbnRpY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SGVhZFNuYXBzaG90LnRyYWNrZWRFbGVtZW50U2lnbmF0dXJlID09IHRoaXMubmV3SGVhZFNuYXBzaG90LnRyYWNrZWRFbGVtZW50U2lnbmF0dXJlO1xuICAgIH1cbiAgICBjb3B5TmV3SGVhZFN0eWxlc2hlZXRFbGVtZW50cygpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMubmV3SGVhZFN0eWxlc2hlZXRFbGVtZW50cykge1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3B5TmV3SGVhZFNjcmlwdEVsZW1lbnRzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5uZXdIZWFkU2NyaXB0RWxlbWVudHMpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVTY3JpcHRFbGVtZW50KGVsZW1lbnQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVDdXJyZW50SGVhZFByb3Zpc2lvbmFsRWxlbWVudHMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmN1cnJlbnRIZWFkUHJvdmlzaW9uYWxFbGVtZW50cykge1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3B5TmV3SGVhZFByb3Zpc2lvbmFsRWxlbWVudHMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLm5ld0hlYWRQcm92aXNpb25hbEVsZW1lbnRzKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFjdGl2YXRlTmV3Qm9keSgpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRvcHROb2RlKHRoaXMubmV3RWxlbWVudCk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVOZXdCb2R5U2NyaXB0RWxlbWVudHMoKTtcbiAgICB9XG4gICAgYWN0aXZhdGVOZXdCb2R5U2NyaXB0RWxlbWVudHMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaW5lcnRTY3JpcHRFbGVtZW50IG9mIHRoaXMubmV3Qm9keVNjcmlwdEVsZW1lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmF0ZWRTY3JpcHRFbGVtZW50ID0gdGhpcy5jcmVhdGVTY3JpcHRFbGVtZW50KGluZXJ0U2NyaXB0RWxlbWVudCk7XG4gICAgICAgICAgICBpbmVydFNjcmlwdEVsZW1lbnQucmVwbGFjZVdpdGgoYWN0aXZhdGVkU2NyaXB0RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNzaWduTmV3Qm9keSgpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkgJiYgdGhpcy5uZXdFbGVtZW50IGluc3RhbmNlb2YgSFRNTEJvZHlFbGVtZW50KSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlcGxhY2VXaXRoKHRoaXMubmV3RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5uZXdFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbmV3SGVhZFN0eWxlc2hlZXRFbGVtZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3SGVhZFNuYXBzaG90LmdldFN0eWxlc2hlZXRFbGVtZW50c05vdEluU25hcHNob3QodGhpcy5jdXJyZW50SGVhZFNuYXBzaG90KTtcbiAgICB9XG4gICAgZ2V0IG5ld0hlYWRTY3JpcHRFbGVtZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3SGVhZFNuYXBzaG90LmdldFNjcmlwdEVsZW1lbnRzTm90SW5TbmFwc2hvdCh0aGlzLmN1cnJlbnRIZWFkU25hcHNob3QpO1xuICAgIH1cbiAgICBnZXQgY3VycmVudEhlYWRQcm92aXNpb25hbEVsZW1lbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SGVhZFNuYXBzaG90LnByb3Zpc2lvbmFsRWxlbWVudHM7XG4gICAgfVxuICAgIGdldCBuZXdIZWFkUHJvdmlzaW9uYWxFbGVtZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3SGVhZFNuYXBzaG90LnByb3Zpc2lvbmFsRWxlbWVudHM7XG4gICAgfVxuICAgIGdldCBuZXdCb2R5U2NyaXB0RWxlbWVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ld0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcInNjcmlwdFwiKTtcbiAgICB9XG59XG5cbmNsYXNzIFNuYXBzaG90Q2FjaGUge1xuICAgIGNvbnN0cnVjdG9yKHNpemUpIHtcbiAgICAgICAgdGhpcy5rZXlzID0gW107XG4gICAgICAgIHRoaXMuc25hcHNob3RzID0ge307XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgfVxuICAgIGhhcyhsb2NhdGlvbikge1xuICAgICAgICByZXR1cm4gdG9DYWNoZUtleShsb2NhdGlvbikgaW4gdGhpcy5zbmFwc2hvdHM7XG4gICAgfVxuICAgIGdldChsb2NhdGlvbikge1xuICAgICAgICBpZiAodGhpcy5oYXMobG9jYXRpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMucmVhZChsb2NhdGlvbik7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGxvY2F0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdXQobG9jYXRpb24sIHNuYXBzaG90KSB7XG4gICAgICAgIHRoaXMud3JpdGUobG9jYXRpb24sIHNuYXBzaG90KTtcbiAgICAgICAgdGhpcy50b3VjaChsb2NhdGlvbik7XG4gICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuc25hcHNob3RzID0ge307XG4gICAgfVxuICAgIHJlYWQobG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc25hcHNob3RzW3RvQ2FjaGVLZXkobG9jYXRpb24pXTtcbiAgICB9XG4gICAgd3JpdGUobG9jYXRpb24sIHNuYXBzaG90KSB7XG4gICAgICAgIHRoaXMuc25hcHNob3RzW3RvQ2FjaGVLZXkobG9jYXRpb24pXSA9IHNuYXBzaG90O1xuICAgIH1cbiAgICB0b3VjaChsb2NhdGlvbikge1xuICAgICAgICBjb25zdCBrZXkgPSB0b0NhY2hlS2V5KGxvY2F0aW9uKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmtleXMuaW5kZXhPZihrZXkpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgIHRoaXMua2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLmtleXMudW5zaGlmdChrZXkpO1xuICAgICAgICB0aGlzLnRyaW0oKTtcbiAgICB9XG4gICAgdHJpbSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5rZXlzLnNwbGljZSh0aGlzLnNpemUpKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zbmFwc2hvdHNba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgUGFnZVZpZXcgZXh0ZW5kcyBWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5zbmFwc2hvdENhY2hlID0gbmV3IFNuYXBzaG90Q2FjaGUoMTApO1xuICAgICAgICB0aGlzLmxhc3RSZW5kZXJlZExvY2F0aW9uID0gbmV3IFVSTChsb2NhdGlvbi5ocmVmKTtcbiAgICB9XG4gICAgcmVuZGVyUGFnZShzbmFwc2hvdCwgaXNQcmV2aWV3ID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBuZXcgUGFnZVJlbmRlcmVyKHRoaXMuc25hcHNob3QsIHNuYXBzaG90LCBpc1ByZXZpZXcpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIocmVuZGVyZXIpO1xuICAgIH1cbiAgICByZW5kZXJFcnJvcihzbmFwc2hvdCkge1xuICAgICAgICBjb25zdCByZW5kZXJlciA9IG5ldyBFcnJvclJlbmRlcmVyKHRoaXMuc25hcHNob3QsIHNuYXBzaG90LCBmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcihyZW5kZXJlcik7XG4gICAgfVxuICAgIGNsZWFyU25hcHNob3RDYWNoZSgpIHtcbiAgICAgICAgdGhpcy5zbmFwc2hvdENhY2hlLmNsZWFyKCk7XG4gICAgfVxuICAgIGFzeW5jIGNhY2hlU25hcHNob3QoKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZENhY2hlU25hcHNob3QpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUudmlld1dpbGxDYWNoZVNuYXBzaG90KCk7XG4gICAgICAgICAgICBjb25zdCB7IHNuYXBzaG90LCBsYXN0UmVuZGVyZWRMb2NhdGlvbjogbG9jYXRpb24gfSA9IHRoaXM7XG4gICAgICAgICAgICBhd2FpdCBuZXh0RXZlbnRMb29wVGljaygpO1xuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdENhY2hlLnB1dChsb2NhdGlvbiwgc25hcHNob3QuY2xvbmUoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0Q2FjaGVkU25hcHNob3RGb3JMb2NhdGlvbihsb2NhdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zbmFwc2hvdENhY2hlLmdldChsb2NhdGlvbik7XG4gICAgfVxuICAgIGdldCBzbmFwc2hvdCgpIHtcbiAgICAgICAgcmV0dXJuIFBhZ2VTbmFwc2hvdC5mcm9tRWxlbWVudCh0aGlzLmVsZW1lbnQpO1xuICAgIH1cbiAgICBnZXQgc2hvdWxkQ2FjaGVTbmFwc2hvdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc25hcHNob3QuaXNDYWNoZWFibGU7XG4gICAgfVxufVxuXG5jbGFzcyBTZXNzaW9uIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3IgPSBuZXcgTmF2aWdhdG9yKHRoaXMpO1xuICAgICAgICB0aGlzLmhpc3RvcnkgPSBuZXcgSGlzdG9yeSh0aGlzKTtcbiAgICAgICAgdGhpcy52aWV3ID0gbmV3IFBhZ2VWaWV3KHRoaXMsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIHRoaXMuYWRhcHRlciA9IG5ldyBCcm93c2VyQWRhcHRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5wYWdlT2JzZXJ2ZXIgPSBuZXcgUGFnZU9ic2VydmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmNhY2hlT2JzZXJ2ZXIgPSBuZXcgQ2FjaGVPYnNlcnZlcigpO1xuICAgICAgICB0aGlzLmxpbmtDbGlja09ic2VydmVyID0gbmV3IExpbmtDbGlja09ic2VydmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmZvcm1TdWJtaXRPYnNlcnZlciA9IG5ldyBGb3JtU3VibWl0T2JzZXJ2ZXIodGhpcyk7XG4gICAgICAgIHRoaXMuc2Nyb2xsT2JzZXJ2ZXIgPSBuZXcgU2Nyb2xsT2JzZXJ2ZXIodGhpcyk7XG4gICAgICAgIHRoaXMuc3RyZWFtT2JzZXJ2ZXIgPSBuZXcgU3RyZWFtT2JzZXJ2ZXIodGhpcyk7XG4gICAgICAgIHRoaXMuZnJhbWVSZWRpcmVjdG9yID0gbmV3IEZyYW1lUmVkaXJlY3Rvcihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICB0aGlzLmRyaXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0JhckRlbGF5ID0gNTAwO1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VPYnNlcnZlci5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgICAgICB0aGlzLmxpbmtDbGlja09ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgICAgICB0aGlzLmZvcm1TdWJtaXRPYnNlcnZlci5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxPYnNlcnZlci5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5mcmFtZVJlZGlyZWN0b3Iuc3RhcnQoKTtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVPYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmxpbmtDbGlja09ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybVN1Ym1pdE9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1PYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmZyYW1lUmVkaXJlY3Rvci5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmhpc3Rvcnkuc3RvcCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVnaXN0ZXJBZGFwdGVyKGFkYXB0ZXIpIHtcbiAgICAgICAgdGhpcy5hZGFwdGVyID0gYWRhcHRlcjtcbiAgICB9XG4gICAgdmlzaXQobG9jYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLm5hdmlnYXRvci5wcm9wb3NlVmlzaXQoZXhwYW5kVVJMKGxvY2F0aW9uKSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbm5lY3RTdHJlYW1Tb3VyY2Uoc291cmNlKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtT2JzZXJ2ZXIuY29ubmVjdFN0cmVhbVNvdXJjZShzb3VyY2UpO1xuICAgIH1cbiAgICBkaXNjb25uZWN0U3RyZWFtU291cmNlKHNvdXJjZSkge1xuICAgICAgICB0aGlzLnN0cmVhbU9ic2VydmVyLmRpc2Nvbm5lY3RTdHJlYW1Tb3VyY2Uoc291cmNlKTtcbiAgICB9XG4gICAgcmVuZGVyU3RyZWFtTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChTdHJlYW1NZXNzYWdlLndyYXAobWVzc2FnZSkuZnJhZ21lbnQpO1xuICAgIH1cbiAgICBjbGVhckNhY2hlKCkge1xuICAgICAgICB0aGlzLnZpZXcuY2xlYXJTbmFwc2hvdENhY2hlKCk7XG4gICAgfVxuICAgIHNldFByb2dyZXNzQmFyRGVsYXkoZGVsYXkpIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0JhckRlbGF5ID0gZGVsYXk7XG4gICAgfVxuICAgIGdldCBsb2NhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5sb2NhdGlvbjtcbiAgICB9XG4gICAgZ2V0IHJlc3RvcmF0aW9uSWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5yZXN0b3JhdGlvbklkZW50aWZpZXI7XG4gICAgfVxuICAgIGhpc3RvcnlQb3BwZWRUb0xvY2F0aW9uV2l0aFJlc3RvcmF0aW9uSWRlbnRpZmllcihsb2NhdGlvbiwgcmVzdG9yYXRpb25JZGVudGlmaWVyKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdG9yLnN0YXJ0VmlzaXQobG9jYXRpb24sIHJlc3RvcmF0aW9uSWRlbnRpZmllciwgeyBhY3Rpb246IFwicmVzdG9yZVwiLCBoaXN0b3J5Q2hhbmdlZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRhcHRlci5wYWdlSW52YWxpZGF0ZWQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY3JvbGxQb3NpdGlvbkNoYW5nZWQocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnVwZGF0ZVJlc3RvcmF0aW9uRGF0YSh7IHNjcm9sbFBvc2l0aW9uOiBwb3NpdGlvbiB9KTtcbiAgICB9XG4gICAgd2lsbEZvbGxvd0xpbmtUb0xvY2F0aW9uKGxpbmssIGxvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnREcml2ZUVuYWJsZWQobGluaylcbiAgICAgICAgICAgICYmIHRoaXMubG9jYXRpb25Jc1Zpc2l0YWJsZShsb2NhdGlvbilcbiAgICAgICAgICAgICYmIHRoaXMuYXBwbGljYXRpb25BbGxvd3NGb2xsb3dpbmdMaW5rVG9Mb2NhdGlvbihsaW5rLCBsb2NhdGlvbik7XG4gICAgfVxuICAgIGZvbGxvd2VkTGlua1RvTG9jYXRpb24obGluaywgbG9jYXRpb24pIHtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5nZXRBY3Rpb25Gb3JMaW5rKGxpbmspO1xuICAgICAgICB0aGlzLmNvbnZlcnRMaW5rV2l0aE1ldGhvZENsaWNrVG9Gb3JtU3VibWlzc2lvbihsaW5rKSB8fCB0aGlzLnZpc2l0KGxvY2F0aW9uLmhyZWYsIHsgYWN0aW9uIH0pO1xuICAgIH1cbiAgICBjb252ZXJ0TGlua1dpdGhNZXRob2RDbGlja1RvRm9ybVN1Ym1pc3Npb24obGluaykge1xuICAgICAgICBjb25zdCBsaW5rTWV0aG9kID0gbGluay5nZXRBdHRyaWJ1dGUoXCJkYXRhLXR1cmJvLW1ldGhvZFwiKTtcbiAgICAgICAgaWYgKGxpbmtNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKTtcbiAgICAgICAgICAgIGZvcm0ubWV0aG9kID0gbGlua01ldGhvZDtcbiAgICAgICAgICAgIGZvcm0uYWN0aW9uID0gbGluay5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpIHx8IFwidW5kZWZpbmVkXCI7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZvcm0pO1xuICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoKFwic3VibWl0XCIsIHsgY2FuY2VsYWJsZTogdHJ1ZSwgdGFyZ2V0OiBmb3JtIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG93c1Zpc2l0aW5nTG9jYXRpb25XaXRoQWN0aW9uKGxvY2F0aW9uLCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb25XaXRoQWN0aW9uSXNTYW1lUGFnZShsb2NhdGlvbiwgYWN0aW9uKSB8fCB0aGlzLmFwcGxpY2F0aW9uQWxsb3dzVmlzaXRpbmdMb2NhdGlvbihsb2NhdGlvbik7XG4gICAgfVxuICAgIHZpc2l0UHJvcG9zZWRUb0xvY2F0aW9uKGxvY2F0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIGV4dGVuZFVSTFdpdGhEZXByZWNhdGVkUHJvcGVydGllcyhsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuYWRhcHRlci52aXNpdFByb3Bvc2VkVG9Mb2NhdGlvbihsb2NhdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHZpc2l0U3RhcnRlZCh2aXNpdCkge1xuICAgICAgICBleHRlbmRVUkxXaXRoRGVwcmVjYXRlZFByb3BlcnRpZXModmlzaXQubG9jYXRpb24pO1xuICAgICAgICBpZiAoIXZpc2l0LnNpbGVudCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlBcHBsaWNhdGlvbkFmdGVyVmlzaXRpbmdMb2NhdGlvbih2aXNpdC5sb2NhdGlvbiwgdmlzaXQuYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdENvbXBsZXRlZCh2aXNpdCkge1xuICAgICAgICB0aGlzLm5vdGlmeUFwcGxpY2F0aW9uQWZ0ZXJQYWdlTG9hZCh2aXNpdC5nZXRUaW1pbmdNZXRyaWNzKCkpO1xuICAgIH1cbiAgICBsb2NhdGlvbldpdGhBY3Rpb25Jc1NhbWVQYWdlKGxvY2F0aW9uLCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdG9yLmxvY2F0aW9uV2l0aEFjdGlvbklzU2FtZVBhZ2UobG9jYXRpb24sIGFjdGlvbik7XG4gICAgfVxuICAgIHZpc2l0U2Nyb2xsZWRUb1NhbWVQYWdlTG9jYXRpb24ob2xkVVJMLCBuZXdVUkwpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlBcHBsaWNhdGlvbkFmdGVyVmlzaXRpbmdTYW1lUGFnZUxvY2F0aW9uKG9sZFVSTCwgbmV3VVJMKTtcbiAgICB9XG4gICAgd2lsbFN1Ym1pdEZvcm0oZm9ybSwgc3VibWl0dGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnREcml2ZUVuYWJsZWQoZm9ybSkgJiYgdGhpcy5lbGVtZW50RHJpdmVFbmFibGVkKHN1Ym1pdHRlcik7XG4gICAgfVxuICAgIGZvcm1TdWJtaXR0ZWQoZm9ybSwgc3VibWl0dGVyKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdG9yLnN1Ym1pdEZvcm0oZm9ybSwgc3VibWl0dGVyKTtcbiAgICB9XG4gICAgcGFnZUJlY2FtZUludGVyYWN0aXZlKCkge1xuICAgICAgICB0aGlzLnZpZXcubGFzdFJlbmRlcmVkTG9jYXRpb24gPSB0aGlzLmxvY2F0aW9uO1xuICAgICAgICB0aGlzLm5vdGlmeUFwcGxpY2F0aW9uQWZ0ZXJQYWdlTG9hZCgpO1xuICAgIH1cbiAgICBwYWdlTG9hZGVkKCkge1xuICAgICAgICB0aGlzLmhpc3RvcnkuYXNzdW1lQ29udHJvbE9mU2Nyb2xsUmVzdG9yYXRpb24oKTtcbiAgICB9XG4gICAgcGFnZVdpbGxVbmxvYWQoKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZWxpbnF1aXNoQ29udHJvbE9mU2Nyb2xsUmVzdG9yYXRpb24oKTtcbiAgICB9XG4gICAgcmVjZWl2ZWRNZXNzYWdlRnJvbVN0cmVhbShtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyU3RyZWFtTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG4gICAgdmlld1dpbGxDYWNoZVNuYXBzaG90KCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghKChfYSA9IHRoaXMubmF2aWdhdG9yLmN1cnJlbnRWaXNpdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNpbGVudCkpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5QXBwbGljYXRpb25CZWZvcmVDYWNoaW5nU25hcHNob3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhbGxvd3NJbW1lZGlhdGVSZW5kZXIoeyBlbGVtZW50IH0sIHJlc3VtZSkge1xuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMubm90aWZ5QXBwbGljYXRpb25CZWZvcmVSZW5kZXIoZWxlbWVudCwgcmVzdW1lKTtcbiAgICAgICAgcmV0dXJuICFldmVudC5kZWZhdWx0UHJldmVudGVkO1xuICAgIH1cbiAgICB2aWV3UmVuZGVyZWRTbmFwc2hvdChzbmFwc2hvdCwgaXNQcmV2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldy5sYXN0UmVuZGVyZWRMb2NhdGlvbiA9IHRoaXMuaGlzdG9yeS5sb2NhdGlvbjtcbiAgICAgICAgdGhpcy5ub3RpZnlBcHBsaWNhdGlvbkFmdGVyUmVuZGVyKCk7XG4gICAgfVxuICAgIHZpZXdJbnZhbGlkYXRlZCgpIHtcbiAgICAgICAgdGhpcy5hZGFwdGVyLnBhZ2VJbnZhbGlkYXRlZCgpO1xuICAgIH1cbiAgICBmcmFtZUxvYWRlZChmcmFtZSkge1xuICAgICAgICB0aGlzLm5vdGlmeUFwcGxpY2F0aW9uQWZ0ZXJGcmFtZUxvYWQoZnJhbWUpO1xuICAgIH1cbiAgICBmcmFtZVJlbmRlcmVkKGZldGNoUmVzcG9uc2UsIGZyYW1lKSB7XG4gICAgICAgIHRoaXMubm90aWZ5QXBwbGljYXRpb25BZnRlckZyYW1lUmVuZGVyKGZldGNoUmVzcG9uc2UsIGZyYW1lKTtcbiAgICB9XG4gICAgYXBwbGljYXRpb25BbGxvd3NGb2xsb3dpbmdMaW5rVG9Mb2NhdGlvbihsaW5rLCBsb2NhdGlvbikge1xuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMubm90aWZ5QXBwbGljYXRpb25BZnRlckNsaWNraW5nTGlua1RvTG9jYXRpb24obGluaywgbG9jYXRpb24pO1xuICAgICAgICByZXR1cm4gIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgfVxuICAgIGFwcGxpY2F0aW9uQWxsb3dzVmlzaXRpbmdMb2NhdGlvbihsb2NhdGlvbikge1xuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMubm90aWZ5QXBwbGljYXRpb25CZWZvcmVWaXNpdGluZ0xvY2F0aW9uKGxvY2F0aW9uKTtcbiAgICAgICAgcmV0dXJuICFldmVudC5kZWZhdWx0UHJldmVudGVkO1xuICAgIH1cbiAgICBub3RpZnlBcHBsaWNhdGlvbkFmdGVyQ2xpY2tpbmdMaW5rVG9Mb2NhdGlvbihsaW5rLCBsb2NhdGlvbikge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goXCJ0dXJibzpjbGlja1wiLCB7IHRhcmdldDogbGluaywgZGV0YWlsOiB7IHVybDogbG9jYXRpb24uaHJlZiB9LCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBub3RpZnlBcHBsaWNhdGlvbkJlZm9yZVZpc2l0aW5nTG9jYXRpb24obG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoKFwidHVyYm86YmVmb3JlLXZpc2l0XCIsIHsgZGV0YWlsOiB7IHVybDogbG9jYXRpb24uaHJlZiB9LCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBub3RpZnlBcHBsaWNhdGlvbkFmdGVyVmlzaXRpbmdMb2NhdGlvbihsb2NhdGlvbiwgYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaChcInR1cmJvOnZpc2l0XCIsIHsgZGV0YWlsOiB7IHVybDogbG9jYXRpb24uaHJlZiwgYWN0aW9uIH0gfSk7XG4gICAgfVxuICAgIG5vdGlmeUFwcGxpY2F0aW9uQmVmb3JlQ2FjaGluZ1NuYXBzaG90KCkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goXCJ0dXJibzpiZWZvcmUtY2FjaGVcIik7XG4gICAgfVxuICAgIG5vdGlmeUFwcGxpY2F0aW9uQmVmb3JlUmVuZGVyKG5ld0JvZHksIHJlc3VtZSkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goXCJ0dXJibzpiZWZvcmUtcmVuZGVyXCIsIHsgZGV0YWlsOiB7IG5ld0JvZHksIHJlc3VtZSB9LCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBub3RpZnlBcHBsaWNhdGlvbkFmdGVyUmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goXCJ0dXJibzpyZW5kZXJcIik7XG4gICAgfVxuICAgIG5vdGlmeUFwcGxpY2F0aW9uQWZ0ZXJQYWdlTG9hZCh0aW1pbmcgPSB7fSkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goXCJ0dXJibzpsb2FkXCIsIHsgZGV0YWlsOiB7IHVybDogdGhpcy5sb2NhdGlvbi5ocmVmLCB0aW1pbmcgfSB9KTtcbiAgICB9XG4gICAgbm90aWZ5QXBwbGljYXRpb25BZnRlclZpc2l0aW5nU2FtZVBhZ2VMb2NhdGlvbihvbGRVUkwsIG5ld1VSTCkge1xuICAgICAgICBkaXNwYXRjaEV2ZW50KG5ldyBIYXNoQ2hhbmdlRXZlbnQoXCJoYXNoY2hhbmdlXCIsIHsgb2xkVVJMOiBvbGRVUkwudG9TdHJpbmcoKSwgbmV3VVJMOiBuZXdVUkwudG9TdHJpbmcoKSB9KSk7XG4gICAgfVxuICAgIG5vdGlmeUFwcGxpY2F0aW9uQWZ0ZXJGcmFtZUxvYWQoZnJhbWUpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoKFwidHVyYm86ZnJhbWUtbG9hZFwiLCB7IHRhcmdldDogZnJhbWUgfSk7XG4gICAgfVxuICAgIG5vdGlmeUFwcGxpY2F0aW9uQWZ0ZXJGcmFtZVJlbmRlcihmZXRjaFJlc3BvbnNlLCBmcmFtZSkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goXCJ0dXJibzpmcmFtZS1yZW5kZXJcIiwgeyBkZXRhaWw6IHsgZmV0Y2hSZXNwb25zZSB9LCB0YXJnZXQ6IGZyYW1lLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBlbGVtZW50RHJpdmVFbmFibGVkKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbGVtZW50LmNsb3Nlc3QoXCJbZGF0YS10dXJib11cIik7XG4gICAgICAgIGlmICh0aGlzLmRyaXZlKSB7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoXCJkYXRhLXR1cmJvXCIpICE9IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuZ2V0QXR0cmlidXRlKFwiZGF0YS10dXJib1wiKSA9PSBcInRydWVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRBY3Rpb25Gb3JMaW5rKGxpbmspIHtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gbGluay5nZXRBdHRyaWJ1dGUoXCJkYXRhLXR1cmJvLWFjdGlvblwiKTtcbiAgICAgICAgcmV0dXJuIGlzQWN0aW9uKGFjdGlvbikgPyBhY3Rpb24gOiBcImFkdmFuY2VcIjtcbiAgICB9XG4gICAgbG9jYXRpb25Jc1Zpc2l0YWJsZShsb2NhdGlvbikge1xuICAgICAgICByZXR1cm4gaXNQcmVmaXhlZEJ5KGxvY2F0aW9uLCB0aGlzLnNuYXBzaG90LnJvb3RMb2NhdGlvbikgJiYgaXNIVE1MKGxvY2F0aW9uKTtcbiAgICB9XG4gICAgZ2V0IHNuYXBzaG90KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LnNuYXBzaG90O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGV4dGVuZFVSTFdpdGhEZXByZWNhdGVkUHJvcGVydGllcyh1cmwpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1cmwsIGRlcHJlY2F0ZWRMb2NhdGlvblByb3BlcnR5RGVzY3JpcHRvcnMpO1xufVxuY29uc3QgZGVwcmVjYXRlZExvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9ycyA9IHtcbiAgICBhYnNvbHV0ZVVSTDoge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuY29uc3Qgc2Vzc2lvbiA9IG5ldyBTZXNzaW9uO1xuY29uc3QgeyBuYXZpZ2F0b3IgfSA9IHNlc3Npb247XG5mdW5jdGlvbiBzdGFydCgpIHtcbiAgICBzZXNzaW9uLnN0YXJ0KCk7XG59XG5mdW5jdGlvbiByZWdpc3RlckFkYXB0ZXIoYWRhcHRlcikge1xuICAgIHNlc3Npb24ucmVnaXN0ZXJBZGFwdGVyKGFkYXB0ZXIpO1xufVxuZnVuY3Rpb24gdmlzaXQobG9jYXRpb24sIG9wdGlvbnMpIHtcbiAgICBzZXNzaW9uLnZpc2l0KGxvY2F0aW9uLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGNvbm5lY3RTdHJlYW1Tb3VyY2Uoc291cmNlKSB7XG4gICAgc2Vzc2lvbi5jb25uZWN0U3RyZWFtU291cmNlKHNvdXJjZSk7XG59XG5mdW5jdGlvbiBkaXNjb25uZWN0U3RyZWFtU291cmNlKHNvdXJjZSkge1xuICAgIHNlc3Npb24uZGlzY29ubmVjdFN0cmVhbVNvdXJjZShzb3VyY2UpO1xufVxuZnVuY3Rpb24gcmVuZGVyU3RyZWFtTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgc2Vzc2lvbi5yZW5kZXJTdHJlYW1NZXNzYWdlKG1lc3NhZ2UpO1xufVxuZnVuY3Rpb24gY2xlYXJDYWNoZSgpIHtcbiAgICBzZXNzaW9uLmNsZWFyQ2FjaGUoKTtcbn1cbmZ1bmN0aW9uIHNldFByb2dyZXNzQmFyRGVsYXkoZGVsYXkpIHtcbiAgICBzZXNzaW9uLnNldFByb2dyZXNzQmFyRGVsYXkoZGVsYXkpO1xufVxuXG52YXIgVHVyYm8gPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIG5hdmlnYXRvcjogbmF2aWdhdG9yLFxuICAgIHNlc3Npb246IHNlc3Npb24sXG4gICAgUGFnZVJlbmRlcmVyOiBQYWdlUmVuZGVyZXIsXG4gICAgUGFnZVNuYXBzaG90OiBQYWdlU25hcHNob3QsXG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIHJlZ2lzdGVyQWRhcHRlcjogcmVnaXN0ZXJBZGFwdGVyLFxuICAgIHZpc2l0OiB2aXNpdCxcbiAgICBjb25uZWN0U3RyZWFtU291cmNlOiBjb25uZWN0U3RyZWFtU291cmNlLFxuICAgIGRpc2Nvbm5lY3RTdHJlYW1Tb3VyY2U6IGRpc2Nvbm5lY3RTdHJlYW1Tb3VyY2UsXG4gICAgcmVuZGVyU3RyZWFtTWVzc2FnZTogcmVuZGVyU3RyZWFtTWVzc2FnZSxcbiAgICBjbGVhckNhY2hlOiBjbGVhckNhY2hlLFxuICAgIHNldFByb2dyZXNzQmFyRGVsYXk6IHNldFByb2dyZXNzQmFyRGVsYXlcbn0pO1xuXG5jbGFzcyBGcmFtZUNvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlVmlzaXRQcm9taXNlID0gKCkgPT4geyB9O1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhhc0JlZW5Mb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXR0aW5nU291cmNlVVJMID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMudmlldyA9IG5ldyBGcmFtZVZpZXcodGhpcywgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlT2JzZXJ2ZXIgPSBuZXcgQXBwZWFyYW5jZU9ic2VydmVyKHRoaXMsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIHRoaXMubGlua0ludGVyY2VwdG9yID0gbmV3IExpbmtJbnRlcmNlcHRvcih0aGlzLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLmZvcm1JbnRlcmNlcHRvciA9IG5ldyBGb3JtSW50ZXJjZXB0b3IodGhpcywgdGhpcy5lbGVtZW50KTtcbiAgICB9XG4gICAgY29ubmVjdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2FkaW5nU3R5bGUgPT0gRnJhbWVMb2FkaW5nU3R5bGUubGF6eSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZWFyYW5jZU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxpbmtJbnRlcmNlcHRvci5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtSW50ZXJjZXB0b3Iuc3RhcnQoKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlVVJMQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXBwZWFyYW5jZU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMubGlua0ludGVyY2VwdG9yLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUludGVyY2VwdG9yLnN0b3AoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkaXNhYmxlZENoYW5nZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdHlsZSA9PSBGcmFtZUxvYWRpbmdTdHlsZS5lYWdlcikge1xuICAgICAgICAgICAgdGhpcy5sb2FkU291cmNlVVJMKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc291cmNlVVJMQ2hhbmdlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1N0eWxlID09IEZyYW1lTG9hZGluZ1N0eWxlLmVhZ2VyIHx8IHRoaXMuaGFzQmVlbkxvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkU291cmNlVVJMKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbG9hZGluZ1N0eWxlQ2hhbmdlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1N0eWxlID09IEZyYW1lTG9hZGluZ1N0eWxlLmxhenkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZWFyYW5jZU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVhcmFuY2VPYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRTb3VyY2VVUkwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBsb2FkU291cmNlVVJMKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ1NvdXJjZVVSTCAmJiB0aGlzLmVuYWJsZWQgJiYgdGhpcy5pc0FjdGl2ZSAmJiAodGhpcy5yZWxvYWRhYmxlIHx8IHRoaXMuc291cmNlVVJMICE9IHRoaXMuY3VycmVudFVSTCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVVJMID0gdGhpcy5jdXJyZW50VVJMO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VVJMID0gdGhpcy5zb3VyY2VVUkw7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VVUkwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQubG9hZGVkID0gdGhpcy52aXNpdCh0aGlzLnNvdXJjZVVSTCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZWFyYW5jZU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbGVtZW50LmxvYWRlZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNCZWVuTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5mcmFtZUxvYWRlZCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VVJMID0gcHJldmlvdXNVUkw7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBsb2FkUmVzcG9uc2UoZmV0Y2hSZXNwb25zZSkge1xuICAgICAgICBpZiAoZmV0Y2hSZXNwb25zZS5yZWRpcmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZVVSTCA9IGZldGNoUmVzcG9uc2UucmVzcG9uc2UudXJsO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgZmV0Y2hSZXNwb25zZS5yZXNwb25zZUhUTUw7XG4gICAgICAgICAgICBpZiAoaHRtbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYm9keSB9ID0gcGFyc2VIVE1MRG9jdW1lbnQoaHRtbCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBuZXcgU25hcHNob3QoYXdhaXQgdGhpcy5leHRyYWN0Rm9yZWlnbkZyYW1lRWxlbWVudChib2R5KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBuZXcgRnJhbWVSZW5kZXJlcih0aGlzLnZpZXcuc25hcHNob3QsIHNuYXBzaG90LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy5yZW5kZXJQcm9taXNlKVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyUHJvbWlzZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyKHJlbmRlcmVyKTtcbiAgICAgICAgICAgICAgICBzZXNzaW9uLmZyYW1lUmVuZGVyZWQoZmV0Y2hSZXNwb25zZSwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy52aWV3LmludmFsaWRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbGVtZW50QXBwZWFyZWRJblZpZXdwb3J0KGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5sb2FkU291cmNlVVJMKCk7XG4gICAgfVxuICAgIHNob3VsZEludGVyY2VwdExpbmtDbGljayhlbGVtZW50LCB1cmwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGF0YS10dXJiby1tZXRob2RcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNob3VsZEludGVyY2VwdE5hdmlnYXRpb24oZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGlua0NsaWNrSW50ZXJjZXB0ZWQoZWxlbWVudCwgdXJsKSB7XG4gICAgICAgIHRoaXMucmVsb2FkYWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMubmF2aWdhdGVGcmFtZShlbGVtZW50LCB1cmwpO1xuICAgIH1cbiAgICBzaG91bGRJbnRlcmNlcHRGb3JtU3VibWlzc2lvbihlbGVtZW50LCBzdWJtaXR0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdWxkSW50ZXJjZXB0TmF2aWdhdGlvbihlbGVtZW50LCBzdWJtaXR0ZXIpO1xuICAgIH1cbiAgICBmb3JtU3VibWlzc2lvbkludGVyY2VwdGVkKGVsZW1lbnQsIHN1Ym1pdHRlcikge1xuICAgICAgICBpZiAodGhpcy5mb3JtU3VibWlzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5mb3JtU3VibWlzc2lvbi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWxvYWRhYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9ybVN1Ym1pc3Npb24gPSBuZXcgRm9ybVN1Ym1pc3Npb24odGhpcywgZWxlbWVudCwgc3VibWl0dGVyKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybVN1Ym1pc3Npb24uZmV0Y2hSZXF1ZXN0LmlzSWRlbXBvdGVudCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZUZyYW1lKGVsZW1lbnQsIHRoaXMuZm9ybVN1Ym1pc3Npb24uZmV0Y2hSZXF1ZXN0LnVybC5ocmVmKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZmV0Y2hSZXF1ZXN0IH0gPSB0aGlzLmZvcm1TdWJtaXNzaW9uO1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlSGVhZGVyc0ZvclJlcXVlc3QoZmV0Y2hSZXF1ZXN0LmhlYWRlcnMsIGZldGNoUmVxdWVzdCk7XG4gICAgICAgICAgICB0aGlzLmZvcm1TdWJtaXNzaW9uLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJlcGFyZUhlYWRlcnNGb3JSZXF1ZXN0KGhlYWRlcnMsIHJlcXVlc3QpIHtcbiAgICAgICAgaGVhZGVyc1tcIlR1cmJvLUZyYW1lXCJdID0gdGhpcy5pZDtcbiAgICB9XG4gICAgcmVxdWVzdFN0YXJ0ZWQocmVxdWVzdCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYnVzeVwiLCBcIlwiKTtcbiAgICB9XG4gICAgcmVxdWVzdFByZXZlbnRlZEhhbmRsaW5nUmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlVmlzaXRQcm9taXNlKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlcXVlc3RTdWNjZWVkZWRXaXRoUmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnJlc29sdmVWaXNpdFByb21pc2UoKTtcbiAgICB9XG4gICAgcmVxdWVzdEZhaWxlZFdpdGhSZXNwb25zZShyZXF1ZXN0LCByZXNwb25zZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlVmlzaXRQcm9taXNlKCk7XG4gICAgfVxuICAgIHJlcXVlc3RFcnJvcmVkKHJlcXVlc3QsIGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB0aGlzLnJlc29sdmVWaXNpdFByb21pc2UoKTtcbiAgICB9XG4gICAgcmVxdWVzdEZpbmlzaGVkKHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcImJ1c3lcIik7XG4gICAgfVxuICAgIGZvcm1TdWJtaXNzaW9uU3RhcnRlZChmb3JtU3VibWlzc2lvbikge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZmluZEZyYW1lRWxlbWVudChmb3JtU3VibWlzc2lvbi5mb3JtRWxlbWVudCk7XG4gICAgICAgIGZyYW1lLnNldEF0dHJpYnV0ZShcImJ1c3lcIiwgXCJcIik7XG4gICAgfVxuICAgIGZvcm1TdWJtaXNzaW9uU3VjY2VlZGVkV2l0aFJlc3BvbnNlKGZvcm1TdWJtaXNzaW9uLCByZXNwb25zZSkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZmluZEZyYW1lRWxlbWVudChmb3JtU3VibWlzc2lvbi5mb3JtRWxlbWVudCk7XG4gICAgICAgIGZyYW1lLmRlbGVnYXRlLmxvYWRSZXNwb25zZShyZXNwb25zZSk7XG4gICAgfVxuICAgIGZvcm1TdWJtaXNzaW9uRmFpbGVkV2l0aFJlc3BvbnNlKGZvcm1TdWJtaXNzaW9uLCBmZXRjaFJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5kZWxlZ2F0ZS5sb2FkUmVzcG9uc2UoZmV0Y2hSZXNwb25zZSk7XG4gICAgfVxuICAgIGZvcm1TdWJtaXNzaW9uRXJyb3JlZChmb3JtU3VibWlzc2lvbiwgZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICAgIGZvcm1TdWJtaXNzaW9uRmluaXNoZWQoZm9ybVN1Ym1pc3Npb24pIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmZpbmRGcmFtZUVsZW1lbnQoZm9ybVN1Ym1pc3Npb24uZm9ybUVsZW1lbnQpO1xuICAgICAgICBmcmFtZS5yZW1vdmVBdHRyaWJ1dGUoXCJidXN5XCIpO1xuICAgIH1cbiAgICBhbGxvd3NJbW1lZGlhdGVSZW5kZXIoc25hcHNob3QsIHJlc3VtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmlld1JlbmRlcmVkU25hcHNob3Qoc25hcHNob3QsIGlzUHJldmlldykge1xuICAgIH1cbiAgICB2aWV3SW52YWxpZGF0ZWQoKSB7XG4gICAgfVxuICAgIGFzeW5jIHZpc2l0KHVybCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IEZldGNoUmVxdWVzdCh0aGlzLCBGZXRjaE1ldGhvZC5nZXQsIGV4cGFuZFVSTCh1cmwpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVmlzaXRQcm9taXNlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVZpc2l0UHJvbWlzZSA9ICgpID0+IHsgfTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxdWVzdC5wZXJmb3JtKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuYXZpZ2F0ZUZyYW1lKGVsZW1lbnQsIHVybCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZmluZEZyYW1lRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgZnJhbWUuc3JjID0gdXJsO1xuICAgIH1cbiAgICBmaW5kRnJhbWVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS10dXJiby1mcmFtZVwiKSB8fCB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICByZXR1cm4gKF9hID0gZ2V0RnJhbWVFbGVtZW50QnlJZChpZCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuZWxlbWVudDtcbiAgICB9XG4gICAgYXN5bmMgZXh0cmFjdEZvcmVpZ25GcmFtZUVsZW1lbnQoY29udGFpbmVyKSB7XG4gICAgICAgIGxldCBlbGVtZW50O1xuICAgICAgICBjb25zdCBpZCA9IENTUy5lc2NhcGUodGhpcy5pZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCA9IGFjdGl2YXRlRWxlbWVudChjb250YWluZXIucXVlcnlTZWxlY3RvcihgdHVyYm8tZnJhbWUjJHtpZH1gKSwgdGhpcy5jdXJyZW50VVJMKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgPSBhY3RpdmF0ZUVsZW1lbnQoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYHR1cmJvLWZyYW1lW3NyY11bcmVjdXJzZX49JHtpZH1dYCksIHRoaXMuY3VycmVudFVSTCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBlbGVtZW50LmxvYWRlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRyYWN0Rm9yZWlnbkZyYW1lRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlc3BvbnNlIGhhcyBubyBtYXRjaGluZyA8dHVyYm8tZnJhbWUgaWQ9XCIke2lkfVwiPiBlbGVtZW50YCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZyYW1lRWxlbWVudCgpO1xuICAgIH1cbiAgICBzaG91bGRJbnRlcmNlcHROYXZpZ2F0aW9uKGVsZW1lbnQsIHN1Ym1pdHRlcikge1xuICAgICAgICBjb25zdCBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS10dXJiby1mcmFtZVwiKSB8fCB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCBpZCA9PSBcIl90b3BcIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgY29uc3QgZnJhbWVFbGVtZW50ID0gZ2V0RnJhbWVFbGVtZW50QnlJZChpZCk7XG4gICAgICAgICAgICBpZiAoZnJhbWVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFmcmFtZUVsZW1lbnQuZGlzYWJsZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZXNzaW9uLmVsZW1lbnREcml2ZUVuYWJsZWQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VibWl0dGVyICYmICFzZXNzaW9uLmVsZW1lbnREcml2ZUVuYWJsZWQoc3VibWl0dGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuaWQ7XG4gICAgfVxuICAgIGdldCBlbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZWxlbWVudC5kaXNhYmxlZDtcbiAgICB9XG4gICAgZ2V0IHNvdXJjZVVSTCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5zcmMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuc3JjO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCByZWxvYWRhYmxlKCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZmluZEZyYW1lRWxlbWVudCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gZnJhbWUuaGFzQXR0cmlidXRlKFwicmVsb2FkYWJsZVwiKTtcbiAgICB9XG4gICAgc2V0IHJlbG9hZGFibGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmZpbmRGcmFtZUVsZW1lbnQodGhpcy5lbGVtZW50KTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBmcmFtZS5zZXRBdHRyaWJ1dGUoXCJyZWxvYWRhYmxlXCIsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZnJhbWUucmVtb3ZlQXR0cmlidXRlKFwicmVsb2FkYWJsZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXQgc291cmNlVVJMKHNvdXJjZVVSTCkge1xuICAgICAgICB0aGlzLnNldHRpbmdTb3VyY2VVUkwgPSB0cnVlO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3JjID0gc291cmNlVVJMICE9PSBudWxsICYmIHNvdXJjZVVSTCAhPT0gdm9pZCAwID8gc291cmNlVVJMIDogbnVsbDtcbiAgICAgICAgdGhpcy5jdXJyZW50VVJMID0gdGhpcy5lbGVtZW50LnNyYztcbiAgICAgICAgdGhpcy5zZXR0aW5nU291cmNlVVJMID0gZmFsc2U7XG4gICAgfVxuICAgIGdldCBsb2FkaW5nU3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubG9hZGluZztcbiAgICB9XG4gICAgZ2V0IGlzTG9hZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybVN1Ym1pc3Npb24gIT09IHVuZGVmaW5lZCB8fCB0aGlzLnJlc29sdmVWaXNpdFByb21pc2UoKSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuaXNBY3RpdmUgJiYgdGhpcy5jb25uZWN0ZWQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0RnJhbWVFbGVtZW50QnlJZChpZCkge1xuICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRnJhbWVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGFjdGl2YXRlRWxlbWVudChlbGVtZW50LCBjdXJyZW50VVJMKSB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qgc3JjID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7XG4gICAgICAgIGlmIChzcmMgIT0gbnVsbCAmJiBjdXJyZW50VVJMICE9IG51bGwgJiYgdXJsc0FyZUVxdWFsKHNyYywgY3VycmVudFVSTCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWF0Y2hpbmcgPHR1cmJvLWZyYW1lIGlkPVwiJHtlbGVtZW50LmlkfVwiPiBlbGVtZW50IGhhcyBhIHNvdXJjZSBVUkwgd2hpY2ggcmVmZXJlbmNlcyBpdHNlbGZgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC5vd25lckRvY3VtZW50ICE9PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmltcG9ydE5vZGUoZWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGcmFtZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBTdHJlYW1BY3Rpb25zID0ge1xuICAgIGFmdGVyKCkge1xuICAgICAgICB0aGlzLnRhcmdldEVsZW1lbnRzLmZvckVhY2goZSA9PiB7IHZhciBfYTsgcmV0dXJuIChfYSA9IGUucGFyZW50RWxlbWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmluc2VydEJlZm9yZSh0aGlzLnRlbXBsYXRlQ29udGVudCwgZS5uZXh0U2libGluZyk7IH0pO1xuICAgIH0sXG4gICAgYXBwZW5kKCkge1xuICAgICAgICB0aGlzLnJlbW92ZUR1cGxpY2F0ZVRhcmdldENoaWxkcmVuKCk7XG4gICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudHMuZm9yRWFjaChlID0+IGUuYXBwZW5kKHRoaXMudGVtcGxhdGVDb250ZW50KSk7XG4gICAgfSxcbiAgICBiZWZvcmUoKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudHMuZm9yRWFjaChlID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gZS5wYXJlbnRFbGVtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5zZXJ0QmVmb3JlKHRoaXMudGVtcGxhdGVDb250ZW50LCBlKTsgfSk7XG4gICAgfSxcbiAgICBwcmVwZW5kKCkge1xuICAgICAgICB0aGlzLnJlbW92ZUR1cGxpY2F0ZVRhcmdldENoaWxkcmVuKCk7XG4gICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudHMuZm9yRWFjaChlID0+IGUucHJlcGVuZCh0aGlzLnRlbXBsYXRlQ29udGVudCkpO1xuICAgIH0sXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLnRhcmdldEVsZW1lbnRzLmZvckVhY2goZSA9PiBlLnJlbW92ZSgpKTtcbiAgICB9LFxuICAgIHJlcGxhY2UoKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudHMuZm9yRWFjaChlID0+IGUucmVwbGFjZVdpdGgodGhpcy50ZW1wbGF0ZUNvbnRlbnQpKTtcbiAgICB9LFxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy50YXJnZXRFbGVtZW50cy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgZS5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICAgICAgZS5hcHBlbmQodGhpcy50ZW1wbGF0ZUNvbnRlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5jbGFzcyBTdHJlYW1FbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcmVuZGVyKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLnJlbmRlclByb21pc2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICh0aGlzLnJlbmRlclByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLmJlZm9yZVJlbmRlckV2ZW50KSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5leHRBbmltYXRpb25GcmFtZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybUFjdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpKTtcbiAgICB9XG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7IH1cbiAgICB9XG4gICAgcmVtb3ZlRHVwbGljYXRlVGFyZ2V0Q2hpbGRyZW4oKSB7XG4gICAgICAgIHRoaXMuZHVwbGljYXRlQ2hpbGRyZW4uZm9yRWFjaChjID0+IGMucmVtb3ZlKCkpO1xuICAgIH1cbiAgICBnZXQgZHVwbGljYXRlQ2hpbGRyZW4oKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDaGlsZHJlbiA9IHRoaXMudGFyZ2V0RWxlbWVudHMuZmxhdE1hcChlID0+IFsuLi5lLmNoaWxkcmVuXSkuZmlsdGVyKGMgPT4gISFjLmlkKTtcbiAgICAgICAgY29uc3QgbmV3Q2hpbGRyZW5JZHMgPSBbLi4uKF9hID0gdGhpcy50ZW1wbGF0ZUNvbnRlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGlsZHJlbl0uZmlsdGVyKGMgPT4gISFjLmlkKS5tYXAoYyA9PiBjLmlkKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW4uZmlsdGVyKGMgPT4gbmV3Q2hpbGRyZW5JZHMuaW5jbHVkZXMoYy5pZCkpO1xuICAgIH1cbiAgICBnZXQgcGVyZm9ybUFjdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25GdW5jdGlvbiA9IFN0cmVhbUFjdGlvbnNbdGhpcy5hY3Rpb25dO1xuICAgICAgICAgICAgaWYgKGFjdGlvbkZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbkZ1bmN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yYWlzZShcInVua25vd24gYWN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmFpc2UoXCJhY3Rpb24gYXR0cmlidXRlIGlzIG1pc3NpbmdcIik7XG4gICAgfVxuICAgIGdldCB0YXJnZXRFbGVtZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRFbGVtZW50c0J5SWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy50YXJnZXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRFbGVtZW50c0J5UXVlcnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKFwidGFyZ2V0IG9yIHRhcmdldHMgYXR0cmlidXRlIGlzIG1pc3NpbmdcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRlbXBsYXRlQ29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVFbGVtZW50LmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpO1xuICAgIH1cbiAgICBnZXQgdGVtcGxhdGVFbGVtZW50KCkge1xuICAgICAgICBpZiAodGhpcy5maXJzdEVsZW1lbnRDaGlsZCBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmFpc2UoXCJmaXJzdCBjaGlsZCBlbGVtZW50IG11c3QgYmUgYSA8dGVtcGxhdGU+IGVsZW1lbnRcIik7XG4gICAgfVxuICAgIGdldCBhY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZShcImFjdGlvblwiKTtcbiAgICB9XG4gICAgZ2V0IHRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgIH1cbiAgICBnZXQgdGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKFwidGFyZ2V0c1wiKTtcbiAgICB9XG4gICAgcmFpc2UobWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5kZXNjcmlwdGlvbn06ICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gICAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKChfYSA9IHRoaXMub3V0ZXJIVE1MLm1hdGNoKC88W14+XSs+LykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKVswXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCI8dHVyYm8tc3RyZWFtPlwiO1xuICAgIH1cbiAgICBnZXQgYmVmb3JlUmVuZGVyRXZlbnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQoXCJ0dXJibzpiZWZvcmUtc3RyZWFtLXJlbmRlclwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgfVxuICAgIGdldCB0YXJnZXRFbGVtZW50c0J5SWQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IChfYSA9IHRoaXMub3duZXJEb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldEVsZW1lbnRCeUlkKHRoaXMudGFyZ2V0KTtcbiAgICAgICAgaWYgKGVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbZWxlbWVudF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRhcmdldEVsZW1lbnRzQnlRdWVyeSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IChfYSA9IHRoaXMub3duZXJEb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy50YXJnZXRzKTtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGVsZW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuRnJhbWVFbGVtZW50LmRlbGVnYXRlQ29uc3RydWN0b3IgPSBGcmFtZUNvbnRyb2xsZXI7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXCJ0dXJiby1mcmFtZVwiLCBGcmFtZUVsZW1lbnQpO1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFwidHVyYm8tc3RyZWFtXCIsIFN0cmVhbUVsZW1lbnQpO1xuXG4oKCkgPT4ge1xuICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdDtcbiAgICBpZiAoIWVsZW1lbnQpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJkYXRhLXR1cmJvLXN1cHByZXNzLXdhcm5pbmdcIikpXG4gICAgICAgIHJldHVybjtcbiAgICB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICBpZiAoZWxlbWVudCA9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKHVuaW5kZW50IGBcbiAgICAgICAgWW91IGFyZSBsb2FkaW5nIFR1cmJvIGZyb20gYSA8c2NyaXB0PiBlbGVtZW50IGluc2lkZSB0aGUgPGJvZHk+IGVsZW1lbnQuIFRoaXMgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91IG1lYW50IHRvIGRvIVxuXG4gICAgICAgIExvYWQgeW91ciBhcHBsaWNhdGlvblx1MjAxOXMgSmF2YVNjcmlwdCBidW5kbGUgaW5zaWRlIHRoZSA8aGVhZD4gZWxlbWVudCBpbnN0ZWFkLiA8c2NyaXB0PiBlbGVtZW50cyBpbiA8Ym9keT4gYXJlIGV2YWx1YXRlZCB3aXRoIGVhY2ggcGFnZSBjaGFuZ2UuXG5cbiAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZTogaHR0cHM6Ly90dXJiby5ob3R3aXJlZC5kZXYvaGFuZGJvb2svYnVpbGRpbmcjd29ya2luZy13aXRoLXNjcmlwdC1lbGVtZW50c1xuXG4gICAgICAgIFx1MjAxNFx1MjAxNFxuICAgICAgICBTdXBwcmVzcyB0aGlzIHdhcm5pbmcgYnkgYWRkaW5nIGEgXCJkYXRhLXR1cmJvLXN1cHByZXNzLXdhcm5pbmdcIiBhdHRyaWJ1dGUgdG86ICVzXG4gICAgICBgLCBlbGVtZW50Lm91dGVySFRNTCk7XG4gICAgICAgIH1cbiAgICB9XG59KSgpO1xuXG53aW5kb3cuVHVyYm8gPSBUdXJibztcbnN0YXJ0KCk7XG5cbmV4cG9ydCB7IFBhZ2VSZW5kZXJlciwgUGFnZVNuYXBzaG90LCBjbGVhckNhY2hlLCBjb25uZWN0U3RyZWFtU291cmNlLCBkaXNjb25uZWN0U3RyZWFtU291cmNlLCBuYXZpZ2F0b3IsIHJlZ2lzdGVyQWRhcHRlciwgcmVuZGVyU3RyZWFtTWVzc2FnZSwgc2Vzc2lvbiwgc2V0UHJvZ3Jlc3NCYXJEZWxheSwgc3RhcnQsIHZpc2l0IH07XG4iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gXCJzdGltdWx1c1wiO1xuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tIFwibHV4b25cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBDb250cm9sbGVyIHtcbiAgc3RhdGljIHZhbHVlcyA9IHsgZm9ybWF0OiBTdHJpbmcgfTtcblxuICBjb25uZWN0KCkge1xuICAgIHZhciBicm93c2VyVHogPSBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmU7XG4gICAgdmFyIGJyb3dzZXJMb2NhbGUgPSBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlO1xuICAgIHZhciBsb2NhbGUgPSBkb2N1bWVudC5ib2R5LmRhdGFzZXQubG9jYWxlIHx8IGJyb3dzZXJMb2NhbGUgfHwgXCJlblwiO1xuICAgIHZhciB0eiA9IGRvY3VtZW50LmJvZHkuZGF0YXNldC50eiB8fCBicm93c2VyVHogfHwgXCJVVENcIjtcbiAgICB2YXIgc3R5bGUgPSBEYXRlVGltZVt0aGlzLmZvcm1hdFZhbHVlXTtcbiAgICBjb25zb2xlLmxvZyhsb2NhbGUsdHosc3R5bGUpO1xuICAgIHRoaXMuZGF0ZSA9IERhdGVUaW1lLmZyb21JU08odGhpcy5lbGVtZW50LmRhdGVUaW1lKS5zZXRab25lKHR6KS5zZXRMb2NhbGUobG9jYWxlKTtcbiAgICB0aGlzLmVsZW1lbnQuaW5uZXJUZXh0ID0gdGhpcy5kYXRlLnRvTG9jYWxlU3RyaW5nKHN0eWxlKTtcbiAgfVxuXG59XG5cbiIsICJpbXBvcnQgYzAgZnJvbSAnLi90aW1lX2NvbnRyb2xsZXInO1xuZXhwb3J0IGNvbnN0IGRlZmluaXRpb25zID0gW1xuXHR7aWRlbnRpZmllcjogJ3RpbWUnLCBjb250cm9sbGVyQ29uc3RydWN0b3I6IGMwfSxcbl07XG4iLCAiLy8gd3JhcHMgdmFsdWUgaW4gY2xvc3VyZSBvciByZXR1cm5zIGNsb3N1cmVcbmV4cG9ydCBsZXQgY2xvc3VyZSA9ICh2YWx1ZSkgPT4ge1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0gZWxzZSB7XG4gICAgbGV0IGNsb3N1cmUgPSBmdW5jdGlvbiAoKXsgcmV0dXJuIHZhbHVlIH1cbiAgICByZXR1cm4gY2xvc3VyZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGdsb2JhbFNlbGYgPSB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiBudWxsXG5leHBvcnQgY29uc3QgcGh4V2luZG93ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG51bGxcbmV4cG9ydCBjb25zdCBnbG9iYWwgPSBnbG9iYWxTZWxmIHx8IHBoeFdpbmRvdyB8fCB0aGlzXG5leHBvcnQgY29uc3QgREVGQVVMVF9WU04gPSBcIjIuMC4wXCJcbmV4cG9ydCBjb25zdCBTT0NLRVRfU1RBVEVTID0ge2Nvbm5lY3Rpbmc6IDAsIG9wZW46IDEsIGNsb3Npbmc6IDIsIGNsb3NlZDogM31cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFdTX0NMT1NFX05PUk1BTCA9IDEwMDBcbmV4cG9ydCBjb25zdCBDSEFOTkVMX1NUQVRFUyA9IHtcbiAgY2xvc2VkOiBcImNsb3NlZFwiLFxuICBlcnJvcmVkOiBcImVycm9yZWRcIixcbiAgam9pbmVkOiBcImpvaW5lZFwiLFxuICBqb2luaW5nOiBcImpvaW5pbmdcIixcbiAgbGVhdmluZzogXCJsZWF2aW5nXCIsXG59XG5leHBvcnQgY29uc3QgQ0hBTk5FTF9FVkVOVFMgPSB7XG4gIGNsb3NlOiBcInBoeF9jbG9zZVwiLFxuICBlcnJvcjogXCJwaHhfZXJyb3JcIixcbiAgam9pbjogXCJwaHhfam9pblwiLFxuICByZXBseTogXCJwaHhfcmVwbHlcIixcbiAgbGVhdmU6IFwicGh4X2xlYXZlXCJcbn1cbmV4cG9ydCBjb25zdCBDSEFOTkVMX0xJRkVDWUNMRV9FVkVOVFMgPSBbXG4gIENIQU5ORUxfRVZFTlRTLmNsb3NlLFxuICBDSEFOTkVMX0VWRU5UUy5lcnJvcixcbiAgQ0hBTk5FTF9FVkVOVFMuam9pbixcbiAgQ0hBTk5FTF9FVkVOVFMucmVwbHksXG4gIENIQU5ORUxfRVZFTlRTLmxlYXZlXG5dXG5leHBvcnQgY29uc3QgVFJBTlNQT1JUUyA9IHtcbiAgbG9uZ3BvbGw6IFwibG9uZ3BvbGxcIixcbiAgd2Vic29ja2V0OiBcIndlYnNvY2tldFwiXG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHVzaFxuICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIENoYW5uZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBldmVudCwgZm9yIGV4YW1wbGUgYFwicGh4X2pvaW5cImBcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkIC0gVGhlIHBheWxvYWQsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogMTIzfWBcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IC0gVGhlIHB1c2ggdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVzaCB7XG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0KXtcbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgdGhpcy5ldmVudCA9IGV2ZW50XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZCB8fCBmdW5jdGlvbiAoKXsgcmV0dXJuIHt9IH1cbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gICAgdGhpcy5yZWNIb29rcyA9IFtdXG4gICAgdGhpcy5zZW50ID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgKi9cbiAgcmVzZW5kKHRpbWVvdXQpe1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICB0aGlzLnJlc2V0KClcbiAgICB0aGlzLnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBzZW5kKCl7XG4gICAgaWYodGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIikpeyByZXR1cm4gfVxuICAgIHRoaXMuc3RhcnRUaW1lb3V0KClcbiAgICB0aGlzLnNlbnQgPSB0cnVlXG4gICAgdGhpcy5jaGFubmVsLnNvY2tldC5wdXNoKHtcbiAgICAgIHRvcGljOiB0aGlzLmNoYW5uZWwudG9waWMsXG4gICAgICBldmVudDogdGhpcy5ldmVudCxcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZCgpLFxuICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgIGpvaW5fcmVmOiB0aGlzLmNoYW5uZWwuam9pblJlZigpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHN0YXR1c1xuICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrXG4gICAqL1xuICByZWNlaXZlKHN0YXR1cywgY2FsbGJhY2spe1xuICAgIGlmKHRoaXMuaGFzUmVjZWl2ZWQoc3RhdHVzKSl7XG4gICAgICBjYWxsYmFjayh0aGlzLnJlY2VpdmVkUmVzcC5yZXNwb25zZSlcbiAgICB9XG5cbiAgICB0aGlzLnJlY0hvb2tzLnB1c2goe3N0YXR1cywgY2FsbGJhY2t9KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlc2V0KCl7XG4gICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgdGhpcy5yZWYgPSBudWxsXG4gICAgdGhpcy5yZWZFdmVudCA9IG51bGxcbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnNlbnQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYXRjaFJlY2VpdmUoe3N0YXR1cywgcmVzcG9uc2UsIF9yZWZ9KXtcbiAgICB0aGlzLnJlY0hvb2tzLmZpbHRlcihoID0+IGguc3RhdHVzID09PSBzdGF0dXMpXG4gICAgICAuZm9yRWFjaChoID0+IGguY2FsbGJhY2socmVzcG9uc2UpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxSZWZFdmVudCgpe1xuICAgIGlmKCF0aGlzLnJlZkV2ZW50KXsgcmV0dXJuIH1cbiAgICB0aGlzLmNoYW5uZWwub2ZmKHRoaXMucmVmRXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFRpbWVvdXQoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpXG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0VGltZW91dCgpe1xuICAgIGlmKHRoaXMudGltZW91dFRpbWVyKXsgdGhpcy5jYW5jZWxUaW1lb3V0KCkgfVxuICAgIHRoaXMucmVmID0gdGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKClcbiAgICB0aGlzLnJlZkV2ZW50ID0gdGhpcy5jaGFubmVsLnJlcGx5RXZlbnROYW1lKHRoaXMucmVmKVxuXG4gICAgdGhpcy5jaGFubmVsLm9uKHRoaXMucmVmRXZlbnQsIHBheWxvYWQgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgICB0aGlzLmNhbmNlbFRpbWVvdXQoKVxuICAgICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBwYXlsb2FkXG4gICAgICB0aGlzLm1hdGNoUmVjZWl2ZShwYXlsb2FkKVxuICAgIH0pXG5cbiAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKFwidGltZW91dFwiLCB7fSlcbiAgICB9LCB0aGlzLnRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhhc1JlY2VpdmVkKHN0YXR1cyl7XG4gICAgcmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwICYmIHRoaXMucmVjZWl2ZWRSZXNwLnN0YXR1cyA9PT0gc3RhdHVzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyaWdnZXIoc3RhdHVzLCByZXNwb25zZSl7XG4gICAgdGhpcy5jaGFubmVsLnRyaWdnZXIodGhpcy5yZWZFdmVudCwge3N0YXR1cywgcmVzcG9uc2V9KVxuICB9XG59XG4iLCAiLyoqXG4gKlxuICogQ3JlYXRlcyBhIHRpbWVyIHRoYXQgYWNjZXB0cyBhIGB0aW1lckNhbGNgIGZ1bmN0aW9uIHRvIHBlcmZvcm1cbiAqIGNhbGN1bGF0ZWQgdGltZW91dCByZXRyaWVzLCBzdWNoIGFzIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCByZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB0aGlzLmNvbm5lY3QoKSwgZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDUwMDAsIDEwMDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiB9KVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgNTAwMFxuICogcmVjb25uZWN0VGltZXIucmVzZXQoKVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lckNhbGNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIge1xuICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZXJDYWxjKXtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnRpbWVyQ2FsYyA9IHRpbWVyQ2FsY1xuICAgIHRoaXMudGltZXIgPSBudWxsXG4gICAgdGhpcy50cmllcyA9IDBcbiAgfVxuXG4gIHJlc2V0KCl7XG4gICAgdGhpcy50cmllcyA9IDBcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGFueSBwcmV2aW91cyBzY2hlZHVsZVRpbWVvdXQgYW5kIHNjaGVkdWxlcyBjYWxsYmFja1xuICAgKi9cbiAgc2NoZWR1bGVUaW1lb3V0KCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpXG5cbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyaWVzID0gdGhpcy50cmllcyArIDFcbiAgICAgIHRoaXMuY2FsbGJhY2soKVxuICAgIH0sIHRoaXMudGltZXJDYWxjKHRoaXMudHJpZXMgKyAxKSlcbiAgfVxufVxuIiwgImltcG9ydCB7Y2xvc3VyZX0gZnJvbSBcIi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgQ0hBTk5FTF9FVkVOVFMsXG4gIENIQU5ORUxfTElGRUNZQ0xFX0VWRU5UUyxcbiAgQ0hBTk5FTF9TVEFURVMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCBQdXNoIGZyb20gXCIuL3B1c2hcIlxuaW1wb3J0IFRpbWVyIGZyb20gXCIuL3RpbWVyXCJcblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcGljXG4gKiBAcGFyYW0geyhPYmplY3R8ZnVuY3Rpb24pfSBwYXJhbXNcbiAqIEBwYXJhbSB7U29ja2V0fSBzb2NrZXRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hhbm5lbCB7XG4gIGNvbnN0cnVjdG9yKHRvcGljLCBwYXJhbXMsIHNvY2tldCl7XG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmNsb3NlZFxuICAgIHRoaXMudG9waWMgPSB0b3BpY1xuICAgIHRoaXMucGFyYW1zID0gY2xvc3VyZShwYXJhbXMgfHwge30pXG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXRcbiAgICB0aGlzLmJpbmRpbmdzID0gW11cbiAgICB0aGlzLmJpbmRpbmdSZWYgPSAwXG4gICAgdGhpcy50aW1lb3V0ID0gdGhpcy5zb2NrZXQudGltZW91dFxuICAgIHRoaXMuam9pbmVkT25jZSA9IGZhbHNlXG4gICAgdGhpcy5qb2luUHVzaCA9IG5ldyBQdXNoKHRoaXMsIENIQU5ORUxfRVZFTlRTLmpvaW4sIHRoaXMucGFyYW1zLCB0aGlzLnRpbWVvdXQpXG4gICAgdGhpcy5wdXNoQnVmZmVyID0gW11cbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcyA9IFtdXG5cbiAgICB0aGlzLnJlam9pblRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pbigpIH1cbiAgICB9LCB0aGlzLnNvY2tldC5yZWpvaW5BZnRlck1zKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VSZWZzLnB1c2godGhpcy5zb2NrZXQub25FcnJvcigoKSA9PiB0aGlzLnJlam9pblRpbWVyLnJlc2V0KCkpKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VSZWZzLnB1c2godGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgICAgaWYodGhpcy5pc0Vycm9yZWQoKSl7IHRoaXMucmVqb2luKCkgfVxuICAgIH0pXG4gICAgKVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcIm9rXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5qb2luZWRcbiAgICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyLmZvckVhY2gocHVzaEV2ZW50ID0+IHB1c2hFdmVudC5zZW5kKCkpXG4gICAgICB0aGlzLnB1c2hCdWZmZXIgPSBbXVxuICAgIH0pXG4gICAgdGhpcy5qb2luUHVzaC5yZWNlaXZlKFwiZXJyb3JcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWRcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMub25DbG9zZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGBjbG9zZSAke3RoaXMudG9waWN9ICR7dGhpcy5qb2luUmVmKCl9YClcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWRcbiAgICAgIHRoaXMuc29ja2V0LnJlbW92ZSh0aGlzKVxuICAgIH0pXG4gICAgdGhpcy5vbkVycm9yKHJlYXNvbiA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgZXJyb3IgJHt0aGlzLnRvcGljfWAsIHJlYXNvbilcbiAgICAgIGlmKHRoaXMuaXNKb2luaW5nKCkpeyB0aGlzLmpvaW5QdXNoLnJlc2V0KCkgfVxuICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWRcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYHRpbWVvdXQgJHt0aGlzLnRvcGljfSAoJHt0aGlzLmpvaW5SZWYoKX0pYCwgdGhpcy5qb2luUHVzaC50aW1lb3V0KVxuICAgICAgbGV0IGxlYXZlUHVzaCA9IG5ldyBQdXNoKHRoaXMsIENIQU5ORUxfRVZFTlRTLmxlYXZlLCBjbG9zdXJlKHt9KSwgdGhpcy50aW1lb3V0KVxuICAgICAgbGVhdmVQdXNoLnNlbmQoKVxuICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWRcbiAgICAgIHRoaXMuam9pblB1c2gucmVzZXQoKVxuICAgICAgaWYodGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSl7IHRoaXMucmVqb2luVGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgfVxuICAgIH0pXG4gICAgdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5yZXBseSwgKHBheWxvYWQsIHJlZikgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKHRoaXMucmVwbHlFdmVudE5hbWUocmVmKSwgcGF5bG9hZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEpvaW4gdGhlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aW1lb3V0XG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgam9pbih0aW1lb3V0ID0gdGhpcy50aW1lb3V0KXtcbiAgICBpZih0aGlzLmpvaW5lZE9uY2Upe1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJpZWQgdG8gam9pbiBtdWx0aXBsZSB0aW1lcy4gJ2pvaW4nIGNhbiBvbmx5IGJlIGNhbGxlZCBhIHNpbmdsZSB0aW1lIHBlciBjaGFubmVsIGluc3RhbmNlXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICAgIHRoaXMuam9pbmVkT25jZSA9IHRydWVcbiAgICAgIHRoaXMucmVqb2luKClcbiAgICAgIHJldHVybiB0aGlzLmpvaW5QdXNoXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhvb2sgaW50byBjaGFubmVsIGNsb3NlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkNsb3NlKGNhbGxiYWNrKXtcbiAgICB0aGlzLm9uKENIQU5ORUxfRVZFTlRTLmNsb3NlLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rIGludG8gY2hhbm5lbCBlcnJvcnNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uRXJyb3IoY2FsbGJhY2spe1xuICAgIHJldHVybiB0aGlzLm9uKENIQU5ORUxfRVZFTlRTLmVycm9yLCByZWFzb24gPT4gY2FsbGJhY2socmVhc29uKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIG9uIGNoYW5uZWwgZXZlbnRzXG4gICAqXG4gICAqIFN1YnNjcmlwdGlvbiByZXR1cm5zIGEgcmVmIGNvdW50ZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGxhdGVyIHRvXG4gICAqIHVuc3Vic2NyaWJlIHRoZSBleGFjdCBldmVudCBsaXN0ZW5lclxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCByZWYxID0gY2hhbm5lbC5vbihcImV2ZW50XCIsIGRvX3N0dWZmKVxuICAgKiBjb25zdCByZWYyID0gY2hhbm5lbC5vbihcImV2ZW50XCIsIGRvX290aGVyX3N0dWZmKVxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIsIHJlZjEpXG4gICAqIC8vIFNpbmNlIHVuc3Vic2NyaXB0aW9uLCBkb19zdHVmZiB3b24ndCBmaXJlLFxuICAgKiAvLyB3aGlsZSBkb19vdGhlcl9zdHVmZiB3aWxsIGtlZXAgZmlyaW5nIG9uIHRoZSBcImV2ZW50XCJcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtpbnRlZ2VyfSByZWZcbiAgICovXG4gIG9uKGV2ZW50LCBjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMuYmluZGluZ1JlZisrXG4gICAgdGhpcy5iaW5kaW5ncy5wdXNoKHtldmVudCwgcmVmLCBjYWxsYmFja30pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlcyBvZmYgb2YgY2hhbm5lbCBldmVudHNcbiAgICpcbiAgICogVXNlIHRoZSByZWYgcmV0dXJuZWQgZnJvbSBhIGNoYW5uZWwub24oKSB0byB1bnN1YnNjcmliZSBvbmVcbiAgICogaGFuZGxlciwgb3IgcGFzcyBub3RoaW5nIGZvciB0aGUgcmVmIHRvIHVuc3Vic2NyaWJlIGFsbFxuICAgKiBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIGV2ZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBVbnN1YnNjcmliZSB0aGUgZG9fc3R1ZmYgaGFuZGxlclxuICAgKiBjb25zdCByZWYxID0gY2hhbm5lbC5vbihcImV2ZW50XCIsIGRvX3N0dWZmKVxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIsIHJlZjEpXG4gICAqXG4gICAqIC8vIFVuc3Vic2NyaWJlIGFsbCBoYW5kbGVycyBmcm9tIGV2ZW50XG4gICAqIGNoYW5uZWwub2ZmKFwiZXZlbnRcIilcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gcmVmXG4gICAqL1xuICBvZmYoZXZlbnQsIHJlZil7XG4gICAgdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuZmlsdGVyKChiaW5kKSA9PiB7XG4gICAgICByZXR1cm4gIShiaW5kLmV2ZW50ID09PSBldmVudCAmJiAodHlwZW9mIHJlZiA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWYgPT09IGJpbmQucmVmKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5QdXNoKCl7IHJldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuaXNKb2luZWQoKSB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbWVzc2FnZSBgZXZlbnRgIHRvIHBob2VuaXggd2l0aCB0aGUgcGF5bG9hZCBgcGF5bG9hZGAuXG4gICAqIFBob2VuaXggcmVjZWl2ZXMgdGhpcyBpbiB0aGUgYGhhbmRsZV9pbihldmVudCwgcGF5bG9hZCwgc29ja2V0KWBcbiAgICogZnVuY3Rpb24uIGlmIHBob2VuaXggcmVwbGllcyBvciBpdCB0aW1lcyBvdXQgKGRlZmF1bHQgMTAwMDBtcyksXG4gICAqIHRoZW4gb3B0aW9uYWxseSB0aGUgcmVwbHkgY2FuIGJlIHJlY2VpdmVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjaGFubmVsLnB1c2goXCJldmVudFwiKVxuICAgKiAgIC5yZWNlaXZlKFwib2tcIiwgcGF5bG9hZCA9PiBjb25zb2xlLmxvZyhcInBob2VuaXggcmVwbGllZDpcIiwgcGF5bG9hZCkpXG4gICAqICAgLnJlY2VpdmUoXCJlcnJvclwiLCBlcnIgPT4gY29uc29sZS5sb2coXCJwaG9lbml4IGVycm9yZWRcIiwgZXJyKSlcbiAgICogICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gY29uc29sZS5sb2coXCJ0aW1lZCBvdXQgcHVzaGluZ1wiKSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHJldHVybnMge1B1c2h9XG4gICAqL1xuICBwdXNoKGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0ID0gdGhpcy50aW1lb3V0KXtcbiAgICBwYXlsb2FkID0gcGF5bG9hZCB8fCB7fVxuICAgIGlmKCF0aGlzLmpvaW5lZE9uY2Upe1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0cmllZCB0byBwdXNoICcke2V2ZW50fScgdG8gJyR7dGhpcy50b3BpY30nIGJlZm9yZSBqb2luaW5nLiBVc2UgY2hhbm5lbC5qb2luKCkgYmVmb3JlIHB1c2hpbmcgZXZlbnRzYClcbiAgICB9XG4gICAgbGV0IHB1c2hFdmVudCA9IG5ldyBQdXNoKHRoaXMsIGV2ZW50LCBmdW5jdGlvbiAoKXsgcmV0dXJuIHBheWxvYWQgfSwgdGltZW91dClcbiAgICBpZih0aGlzLmNhblB1c2goKSl7XG4gICAgICBwdXNoRXZlbnQuc2VuZCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHB1c2hFdmVudC5zdGFydFRpbWVvdXQoKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyLnB1c2gocHVzaEV2ZW50KVxuICAgIH1cblxuICAgIHJldHVybiBwdXNoRXZlbnRcbiAgfVxuXG4gIC8qKiBMZWF2ZXMgdGhlIGNoYW5uZWxcbiAgICpcbiAgICogVW5zdWJzY3JpYmVzIGZyb20gc2VydmVyIGV2ZW50cywgYW5kXG4gICAqIGluc3RydWN0cyBjaGFubmVsIHRvIHRlcm1pbmF0ZSBvbiBzZXJ2ZXJcbiAgICpcbiAgICogVHJpZ2dlcnMgb25DbG9zZSgpIGhvb2tzXG4gICAqXG4gICAqIFRvIHJlY2VpdmUgbGVhdmUgYWNrbm93bGVkZ2VtZW50cywgdXNlIHRoZSBgcmVjZWl2ZWBcbiAgICogaG9vayB0byBiaW5kIHRvIHRoZSBzZXJ2ZXIgYWNrLCBpZTpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY2hhbm5lbC5sZWF2ZSgpLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBhbGVydChcImxlZnQhXCIpIClcbiAgICpcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aW1lb3V0XG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgbGVhdmUodGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgdGhpcy5qb2luUHVzaC5jYW5jZWxUaW1lb3V0KClcblxuICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5sZWF2aW5nXG4gICAgbGV0IG9uQ2xvc2UgPSAoKSA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgbGVhdmUgJHt0aGlzLnRvcGljfWApXG4gICAgICB0aGlzLnRyaWdnZXIoQ0hBTk5FTF9FVkVOVFMuY2xvc2UsIFwibGVhdmVcIilcbiAgICB9XG4gICAgbGV0IGxlYXZlUHVzaCA9IG5ldyBQdXNoKHRoaXMsIENIQU5ORUxfRVZFTlRTLmxlYXZlLCBjbG9zdXJlKHt9KSwgdGltZW91dClcbiAgICBsZWF2ZVB1c2gucmVjZWl2ZShcIm9rXCIsICgpID0+IG9uQ2xvc2UoKSlcbiAgICAgIC5yZWNlaXZlKFwidGltZW91dFwiLCAoKSA9PiBvbkNsb3NlKCkpXG4gICAgbGVhdmVQdXNoLnNlbmQoKVxuICAgIGlmKCF0aGlzLmNhblB1c2goKSl7IGxlYXZlUHVzaC50cmlnZ2VyKFwib2tcIiwge30pIH1cblxuICAgIHJldHVybiBsZWF2ZVB1c2hcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkYWJsZSBtZXNzYWdlIGhvb2tcbiAgICpcbiAgICogUmVjZWl2ZXMgYWxsIGV2ZW50cyBmb3Igc3BlY2lhbGl6ZWQgbWVzc2FnZSBoYW5kbGluZ1xuICAgKiBiZWZvcmUgZGlzcGF0Y2hpbmcgdG8gdGhlIGNoYW5uZWwgY2FsbGJhY2tzLlxuICAgKlxuICAgKiBNdXN0IHJldHVybiB0aGUgcGF5bG9hZCwgbW9kaWZpZWQgb3IgdW5tb2RpZmllZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSByZWZcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIG9uTWVzc2FnZShfZXZlbnQsIHBheWxvYWQsIF9yZWYpeyByZXR1cm4gcGF5bG9hZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0xpZmVjeWNsZUV2ZW50KGV2ZW50KXsgcmV0dXJuIENIQU5ORUxfTElGRUNZQ0xFX0VWRU5UUy5pbmRleE9mKGV2ZW50KSA+PSAwIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzTWVtYmVyKHRvcGljLCBldmVudCwgcGF5bG9hZCwgam9pblJlZil7XG4gICAgaWYodGhpcy50b3BpYyAhPT0gdG9waWMpeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgaWYoam9pblJlZiAmJiBqb2luUmVmICE9PSB0aGlzLmpvaW5SZWYoKSAmJiB0aGlzLmlzTGlmZWN5Y2xlRXZlbnQoZXZlbnQpKXtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLCB7dG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmfSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgam9pblJlZigpeyByZXR1cm4gdGhpcy5qb2luUHVzaC5yZWYgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVqb2luKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIGlmKHRoaXMuaXNMZWF2aW5nKCkpeyByZXR1cm4gfVxuICAgIHRoaXMuc29ja2V0LmxlYXZlT3BlblRvcGljKHRoaXMudG9waWMpXG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5pbmdcbiAgICB0aGlzLmpvaW5QdXNoLnJlc2VuZCh0aW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpe1xuICAgIGxldCBoYW5kbGVkUGF5bG9hZCA9IHRoaXMub25NZXNzYWdlKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpXG4gICAgaWYocGF5bG9hZCAmJiAhaGFuZGxlZFBheWxvYWQpeyB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIG9uTWVzc2FnZSBjYWxsYmFja3MgbXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcIikgfVxuXG4gICAgbGV0IGV2ZW50QmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcihiaW5kID0+IGJpbmQuZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGV2ZW50QmluZGluZ3MubGVuZ3RoOyBpKyspe1xuICAgICAgbGV0IGJpbmQgPSBldmVudEJpbmRpbmdzW2ldXG4gICAgICBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYsIGpvaW5SZWYgfHwgdGhpcy5qb2luUmVmKCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXBseUV2ZW50TmFtZShyZWYpeyByZXR1cm4gYGNoYW5fcmVwbHlfJHtyZWZ9YCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0Nsb3NlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzRXJyb3JlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0pvaW5lZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmVkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzSm9pbmluZygpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmluZyB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0xlYXZpbmcoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmxlYXZpbmcgfVxufVxuIiwgImltcG9ydCB7XG4gIGdsb2JhbFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBamF4IHtcbiAgY29uc3RydWN0b3IoKXtcbiAgICB0aGlzLnN0YXRlcyA9IHtjb21wbGV0ZTogNH1cbiAgfVxuXG4gIHN0YXRpYyByZXF1ZXN0KG1ldGhvZCwgZW5kUG9pbnQsIGFjY2VwdCwgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjayl7XG4gICAgaWYoZ2xvYmFsLlhEb21haW5SZXF1ZXN0KXtcbiAgICAgIGxldCByZXEgPSBuZXcgZ2xvYmFsLlhEb21haW5SZXF1ZXN0KCkgLy8gSUU4LCBJRTlcbiAgICAgIHRoaXMueGRvbWFpblJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcmVxID0gbmV3IGdsb2JhbC5YTUxIdHRwUmVxdWVzdCgpIC8vIElFNyssIEZpcmVmb3gsIENocm9tZSwgT3BlcmEsIFNhZmFyaVxuICAgICAgdGhpcy54aHJSZXF1ZXN0KHJlcSwgbWV0aG9kLCBlbmRQb2ludCwgYWNjZXB0LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB4ZG9tYWluUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIHJlcS5vcGVuKG1ldGhvZCwgZW5kUG9pbnQpXG4gICAgcmVxLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IHRoaXMucGFyc2VKU09OKHJlcS5yZXNwb25zZVRleHQpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSlcbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICAvLyBXb3JrIGFyb3VuZCBidWcgaW4gSUU5IHRoYXQgcmVxdWlyZXMgYW4gYXR0YWNoZWQgb25wcm9ncmVzcyBoYW5kbGVyXG4gICAgcmVxLm9ucHJvZ3Jlc3MgPSAoKSA9PiB7IH1cblxuICAgIHJlcS5zZW5kKGJvZHkpXG4gIH1cblxuICBzdGF0aWMgeGhyUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGFjY2VwdCwgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjayl7XG4gICAgcmVxLm9wZW4obWV0aG9kLCBlbmRQb2ludCwgdHJ1ZSlcbiAgICByZXEudGltZW91dCA9IHRpbWVvdXRcbiAgICByZXEuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBhY2NlcHQpXG4gICAgcmVxLm9uZXJyb3IgPSAoKSA9PiB7IGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwpIH1cbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYocmVxLnJlYWR5U3RhdGUgPT09IHRoaXMuc3RhdGVzLmNvbXBsZXRlICYmIGNhbGxiYWNrKXtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gdGhpcy5wYXJzZUpTT04ocmVxLnJlc3BvbnNlVGV4dClcbiAgICAgICAgY2FsbGJhY2socmVzcG9uc2UpXG4gICAgICB9XG4gICAgfVxuICAgIGlmKG9udGltZW91dCl7IHJlcS5vbnRpbWVvdXQgPSBvbnRpbWVvdXQgfVxuXG4gICAgcmVxLnNlbmQoYm9keSlcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUpTT04ocmVzcCl7XG4gICAgaWYoIXJlc3AgfHwgcmVzcCA9PT0gXCJcIil7IHJldHVybiBudWxsIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwKVxuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcImZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlXCIsIHJlc3ApXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqLCBwYXJlbnRLZXkpe1xuICAgIGxldCBxdWVyeVN0ciA9IFtdXG4gICAgZm9yKHZhciBrZXkgaW4gb2JqKXtcbiAgICAgIGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKXsgY29udGludWUgfVxuICAgICAgbGV0IHBhcmFtS2V5ID0gcGFyZW50S2V5ID8gYCR7cGFyZW50S2V5fVske2tleX1dYCA6IGtleVxuICAgICAgbGV0IHBhcmFtVmFsID0gb2JqW2tleV1cbiAgICAgIGlmKHR5cGVvZiBwYXJhbVZhbCA9PT0gXCJvYmplY3RcIil7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2godGhpcy5zZXJpYWxpemUocGFyYW1WYWwsIHBhcmFtS2V5KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtS2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtVmFsKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5U3RyLmpvaW4oXCImXCIpXG4gIH1cblxuICBzdGF0aWMgYXBwZW5kUGFyYW1zKHVybCwgcGFyYW1zKXtcbiAgICBpZihPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCl7IHJldHVybiB1cmwgfVxuXG4gICAgbGV0IHByZWZpeCA9IHVybC5tYXRjaCgvXFw/LykgPyBcIiZcIiA6IFwiP1wiXG4gICAgcmV0dXJuIGAke3VybH0ke3ByZWZpeH0ke3RoaXMuc2VyaWFsaXplKHBhcmFtcyl9YFxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9uZ1BvbGwge1xuXG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50KXtcbiAgICB0aGlzLmVuZFBvaW50ID0gbnVsbFxuICAgIHRoaXMudG9rZW4gPSBudWxsXG4gICAgdGhpcy5za2lwSGVhcnRiZWF0ID0gdHJ1ZVxuICAgIHRoaXMub25vcGVuID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMub25lcnJvciA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5wb2xsRW5kcG9pbnQgPSB0aGlzLm5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuXG4gICAgdGhpcy5wb2xsKClcbiAgfVxuXG4gIG5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KXtcbiAgICByZXR1cm4gKGVuZFBvaW50XG4gICAgICAucmVwbGFjZShcIndzOi8vXCIsIFwiaHR0cDovL1wiKVxuICAgICAgLnJlcGxhY2UoXCJ3c3M6Ly9cIiwgXCJodHRwczovL1wiKVxuICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChcIiguKilcXC9cIiArIFRSQU5TUE9SVFMud2Vic29ja2V0KSwgXCIkMS9cIiArIFRSQU5TUE9SVFMubG9uZ3BvbGwpKVxuICB9XG5cbiAgZW5kcG9pbnRVUkwoKXtcbiAgICByZXR1cm4gQWpheC5hcHBlbmRQYXJhbXModGhpcy5wb2xsRW5kcG9pbnQsIHt0b2tlbjogdGhpcy50b2tlbn0pXG4gIH1cblxuICBjbG9zZUFuZFJldHJ5KCl7XG4gICAgdGhpcy5jbG9zZSgpXG4gICAgdGhpcy5yZWFkeVN0YXRlID0gU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nXG4gIH1cblxuICBvbnRpbWVvdXQoKXtcbiAgICB0aGlzLm9uZXJyb3IoXCJ0aW1lb3V0XCIpXG4gICAgdGhpcy5jbG9zZUFuZFJldHJ5KClcbiAgfVxuXG4gIHBvbGwoKXtcbiAgICBpZighKHRoaXMucmVhZHlTdGF0ZSA9PT0gU09DS0VUX1NUQVRFUy5vcGVuIHx8IHRoaXMucmVhZHlTdGF0ZSA9PT0gU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nKSl7IHJldHVybiB9XG5cbiAgICBBamF4LnJlcXVlc3QoXCJHRVRcIiwgdGhpcy5lbmRwb2ludFVSTCgpLCBcImFwcGxpY2F0aW9uL2pzb25cIiwgbnVsbCwgdGhpcy50aW1lb3V0LCB0aGlzLm9udGltZW91dC5iaW5kKHRoaXMpLCAocmVzcCkgPT4ge1xuICAgICAgaWYocmVzcCl7XG4gICAgICAgIHZhciB7c3RhdHVzLCB0b2tlbiwgbWVzc2FnZXN9ID0gcmVzcFxuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1cyA9IDBcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKHN0YXR1cyl7XG4gICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICAgIC8vIFRhc2tzIGFyZSB3aGF0IHRoaW5ncyBsaWtlIGV2ZW50IGhhbmRsZXJzLCBzZXRUaW1lb3V0IGNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIHByb21pc2UgcmVzb2x2ZXMgYW5kIG1vcmUgYXJlIHJ1biB3aXRoaW4uXG4gICAgICAgICAgICAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIHRhc2tzLFxuICAgICAgICAgICAgLy8gbWljcm90YXNrcyBhbmQgbWFjcm90YXNrcy5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYXJlIG1haW5seSB1c2VkIGZvciBQcm9taXNlcywgd2hpbGUgbWFjcm90YXNrcyBhcmVcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciBtYWNyb3Rhc2tzLiBJZiB0aGUgSlMgZW5naW5lXG4gICAgICAgICAgICAvLyBpcyBsb29raW5nIGZvciBhIHRhc2sgdG8gcnVuLCBpdCB3aWxsIGFsd2F5cyB0cnkgdG8gZW1wdHkgdGhlXG4gICAgICAgICAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcnVuIGFueXRoaW5nIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBtYWNyb3Rhc2sgcXVldWUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LCBtZXNzYWdlcyBhbHdheXMgYXJyaXZlIGluIHRoZWlyIG93blxuICAgICAgICAgICAgLy8gZXZlbnQuIFRoaXMgbWVhbnMgdGhhdCBpZiBhbnkgcHJvbWlzZXMgYXJlIHJlc29sdmVkIGZyb20gd2l0aGluLFxuICAgICAgICAgICAgLy8gdGhlaXIgY2FsbGJhY2tzIHdpbGwgYWx3YXlzIGZpbmlzaCBleGVjdXRpb24gYnkgdGhlIHRpbWUgdGhlXG4gICAgICAgICAgICAvLyBuZXh0IG1lc3NhZ2UgZXZlbnQgaGFuZGxlciBpcyBydW4uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gZW11bGF0ZSB0aGlzIGJlaGF2aW91ciwgd2UgbmVlZCB0byBtYWtlIHN1cmUgZWFjaFxuICAgICAgICAgICAgLy8gb25tZXNzYWdlIGhhbmRsZXIgaXMgcnVuIHdpdGhpbiBpdCdzIG93biBtYWNyb3Rhc2suXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2Uoe2RhdGE6IG1zZ30pXG4gICAgICAgICAgICB9LCAwKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5wb2xsKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDEwOlxuICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMub3BlblxuICAgICAgICAgIHRoaXMub25vcGVuKClcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgIHRoaXMub25lcnJvcigpXG4gICAgICAgICAgdGhpcy5jbG9zZSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICB0aGlzLm9uZXJyb3IoKVxuICAgICAgICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgcG9sbCBzdGF0dXMgJHtzdGF0dXN9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc2VuZChib2R5KXtcbiAgICBBamF4LnJlcXVlc3QoXCJQT1NUXCIsIHRoaXMuZW5kcG9pbnRVUkwoKSwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIGJvZHksIHRoaXMudGltZW91dCwgdGhpcy5vbmVycm9yLmJpbmQodGhpcywgXCJ0aW1lb3V0XCIpLCAocmVzcCkgPT4ge1xuICAgICAgaWYoIXJlc3AgfHwgcmVzcC5zdGF0dXMgIT09IDIwMCl7XG4gICAgICAgIHRoaXMub25lcnJvcihyZXNwICYmIHJlc3Auc3RhdHVzKVxuICAgICAgICB0aGlzLmNsb3NlQW5kUmV0cnkoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjbG9zZShfY29kZSwgX3JlYXNvbil7XG4gICAgdGhpcy5yZWFkeVN0YXRlID0gU09DS0VUX1NUQVRFUy5jbG9zZWRcbiAgICB0aGlzLm9uY2xvc2UoKVxuICB9XG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHJlc2VuY2VcbiAqIEBwYXJhbSB7Q2hhbm5lbH0gY2hhbm5lbCAtIFRoZSBDaGFubmVsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBvcHRpb25zLFxuICogICAgICAgIGZvciBleGFtcGxlIGB7ZXZlbnRzOiB7c3RhdGU6IFwic3RhdGVcIiwgZGlmZjogXCJkaWZmXCJ9fWBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJlc2VuY2Uge1xuXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIG9wdHMgPSB7fSl7XG4gICAgbGV0IGV2ZW50cyA9IG9wdHMuZXZlbnRzIHx8IHtzdGF0ZTogXCJwcmVzZW5jZV9zdGF0ZVwiLCBkaWZmOiBcInByZXNlbmNlX2RpZmZcIn1cbiAgICB0aGlzLnN0YXRlID0ge31cbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbFxuICAgIHRoaXMuam9pblJlZiA9IG51bGxcbiAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgIG9uSm9pbjogZnVuY3Rpb24gKCl7IH0sXG4gICAgICBvbkxlYXZlOiBmdW5jdGlvbiAoKXsgfSxcbiAgICAgIG9uU3luYzogZnVuY3Rpb24gKCl7IH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLnN0YXRlLCBuZXdTdGF0ZSA9PiB7XG4gICAgICBsZXQge29uSm9pbiwgb25MZWF2ZSwgb25TeW5jfSA9IHRoaXMuY2FsbGVyXG5cbiAgICAgIHRoaXMuam9pblJlZiA9IHRoaXMuY2hhbm5lbC5qb2luUmVmKClcbiAgICAgIHRoaXMuc3RhdGUgPSBQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSlcblxuICAgICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaChkaWZmID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgICBvblN5bmMoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLmRpZmYsIGRpZmYgPT4ge1xuICAgICAgbGV0IHtvbkpvaW4sIG9uTGVhdmUsIG9uU3luY30gPSB0aGlzLmNhbGxlclxuXG4gICAgICBpZih0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKXtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgICAgb25TeW5jKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25Kb2luKGNhbGxiYWNrKXsgdGhpcy5jYWxsZXIub25Kb2luID0gY2FsbGJhY2sgfVxuXG4gIG9uTGVhdmUoY2FsbGJhY2speyB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2sgfVxuXG4gIG9uU3luYyhjYWxsYmFjayl7IHRoaXMuY2FsbGVyLm9uU3luYyA9IGNhbGxiYWNrIH1cblxuICBsaXN0KGJ5KXsgcmV0dXJuIFByZXNlbmNlLmxpc3QodGhpcy5zdGF0ZSwgYnkpIH1cblxuICBpblBlbmRpbmdTeW5jU3RhdGUoKXtcbiAgICByZXR1cm4gIXRoaXMuam9pblJlZiB8fCAodGhpcy5qb2luUmVmICE9PSB0aGlzLmNoYW5uZWwuam9pblJlZigpKVxuICB9XG5cbiAgLy8gbG93ZXItbGV2ZWwgcHVibGljIHN0YXRpYyBBUElcblxuICAvKipcbiAgICogVXNlZCB0byBzeW5jIHRoZSBsaXN0IG9mIHByZXNlbmNlcyBvbiB0aGUgc2VydmVyXG4gICAqIHdpdGggdGhlIGNsaWVudCdzIHN0YXRlLiBBbiBvcHRpb25hbCBgb25Kb2luYCBhbmQgYG9uTGVhdmVgIGNhbGxiYWNrIGNhblxuICAgKiBiZSBwcm92aWRlZCB0byByZWFjdCB0byBjaGFuZ2VzIGluIHRoZSBjbGllbnQncyBsb2NhbCBwcmVzZW5jZXMgYWNyb3NzXG4gICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNTdGF0ZShjdXJyZW50U3RhdGUsIG5ld1N0YXRlLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2xvbmUoY3VycmVudFN0YXRlKVxuICAgIGxldCBqb2lucyA9IHt9XG4gICAgbGV0IGxlYXZlcyA9IHt9XG5cbiAgICB0aGlzLm1hcChzdGF0ZSwgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIGlmKCFuZXdTdGF0ZVtrZXldKXtcbiAgICAgICAgbGVhdmVzW2tleV0gPSBwcmVzZW5jZVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5tYXAobmV3U3RhdGUsIChrZXksIG5ld1ByZXNlbmNlKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByZXNlbmNlID0gc3RhdGVba2V5XVxuICAgICAgaWYoY3VycmVudFByZXNlbmNlKXtcbiAgICAgICAgbGV0IG5ld1JlZnMgPSBuZXdQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJSZWZzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgICAgbGV0IGpvaW5lZE1ldGFzID0gbmV3UHJlc2VuY2UubWV0YXMuZmlsdGVyKG0gPT4gY3VyUmVmcy5pbmRleE9mKG0ucGh4X3JlZikgPCAwKVxuICAgICAgICBsZXQgbGVmdE1ldGFzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLmZpbHRlcihtID0+IG5ld1JlZnMuaW5kZXhPZihtLnBoeF9yZWYpIDwgMClcbiAgICAgICAgaWYoam9pbmVkTWV0YXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICAgICAgam9pbnNba2V5XS5tZXRhcyA9IGpvaW5lZE1ldGFzXG4gICAgICAgIH1cbiAgICAgICAgaWYobGVmdE1ldGFzLmxlbmd0aCA+IDApe1xuICAgICAgICAgIGxlYXZlc1trZXldID0gdGhpcy5jbG9uZShjdXJyZW50UHJlc2VuY2UpXG4gICAgICAgICAgbGVhdmVzW2tleV0ubWV0YXMgPSBsZWZ0TWV0YXNcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwge2pvaW5zOiBqb2lucywgbGVhdmVzOiBsZWF2ZXN9LCBvbkpvaW4sIG9uTGVhdmUpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVXNlZCB0byBzeW5jIGEgZGlmZiBvZiBwcmVzZW5jZSBqb2luIGFuZCBsZWF2ZVxuICAgKiBldmVudHMgZnJvbSB0aGUgc2VydmVyLCBhcyB0aGV5IGhhcHBlbi4gTGlrZSBgc3luY1N0YXRlYCwgYHN5bmNEaWZmYFxuICAgKiBhY2NlcHRzIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlclxuICAgKiBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCB7am9pbnMsIGxlYXZlc30gPSB0aGlzLmNsb25lKGRpZmYpXG4gICAgaWYoIW9uSm9pbil7IG9uSm9pbiA9IGZ1bmN0aW9uICgpeyB9IH1cbiAgICBpZighb25MZWF2ZSl7IG9uTGVhdmUgPSBmdW5jdGlvbiAoKXsgfSB9XG5cbiAgICB0aGlzLm1hcChqb2lucywgKGtleSwgbmV3UHJlc2VuY2UpID0+IHtcbiAgICAgIGxldCBjdXJyZW50UHJlc2VuY2UgPSBzdGF0ZVtrZXldXG4gICAgICBzdGF0ZVtrZXldID0gdGhpcy5jbG9uZShuZXdQcmVzZW5jZSlcbiAgICAgIGlmKGN1cnJlbnRQcmVzZW5jZSl7XG4gICAgICAgIGxldCBqb2luZWRSZWZzID0gc3RhdGVba2V5XS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJNZXRhcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5maWx0ZXIobSA9PiBqb2luZWRSZWZzLmluZGV4T2YobS5waHhfcmVmKSA8IDApXG4gICAgICAgIHN0YXRlW2tleV0ubWV0YXMudW5zaGlmdCguLi5jdXJNZXRhcylcbiAgICAgIH1cbiAgICAgIG9uSm9pbihrZXksIGN1cnJlbnRQcmVzZW5jZSwgbmV3UHJlc2VuY2UpXG4gICAgfSlcbiAgICB0aGlzLm1hcChsZWF2ZXMsIChrZXksIGxlZnRQcmVzZW5jZSkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZSA9IHN0YXRlW2tleV1cbiAgICAgIGlmKCFjdXJyZW50UHJlc2VuY2UpeyByZXR1cm4gfVxuICAgICAgbGV0IHJlZnNUb1JlbW92ZSA9IGxlZnRQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICBjdXJyZW50UHJlc2VuY2UubWV0YXMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMuZmlsdGVyKHAgPT4ge1xuICAgICAgICByZXR1cm4gcmVmc1RvUmVtb3ZlLmluZGV4T2YocC5waHhfcmVmKSA8IDBcbiAgICAgIH0pXG4gICAgICBvbkxlYXZlKGtleSwgY3VycmVudFByZXNlbmNlLCBsZWZ0UHJlc2VuY2UpXG4gICAgICBpZihjdXJyZW50UHJlc2VuY2UubWV0YXMubGVuZ3RoID09PSAwKXtcbiAgICAgICAgZGVsZXRlIHN0YXRlW2tleV1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHByZXNlbmNlcywgd2l0aCBzZWxlY3RlZCBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHByZXNlbmNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaG9vc2VyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcmVzZW5jZX1cbiAgICovXG4gIHN0YXRpYyBsaXN0KHByZXNlbmNlcywgY2hvb3Nlcil7XG4gICAgaWYoIWNob29zZXIpeyBjaG9vc2VyID0gZnVuY3Rpb24gKGtleSwgcHJlcyl7IHJldHVybiBwcmVzIH0gfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwKHByZXNlbmNlcywgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIHJldHVybiBjaG9vc2VyKGtleSwgcHJlc2VuY2UpXG4gICAgfSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBzdGF0aWMgbWFwKG9iaiwgZnVuYyl7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKGtleSA9PiBmdW5jKGtleSwgb2JqW2tleV0pKVxuICB9XG5cbiAgc3RhdGljIGNsb25lKG9iail7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpIH1cbn1cbiIsICIvKiBUaGUgZGVmYXVsdCBzZXJpYWxpemVyIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgbWVzc2FnZXMgKi9cbmltcG9ydCB7XG4gIENIQU5ORUxfRVZFTlRTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgSEVBREVSX0xFTkdUSDogMSxcbiAgTUVUQV9MRU5HVEg6IDQsXG4gIEtJTkRTOiB7cHVzaDogMCwgcmVwbHk6IDEsIGJyb2FkY2FzdDogMn0sXG5cbiAgZW5jb2RlKG1zZywgY2FsbGJhY2spe1xuICAgIGlmKG1zZy5wYXlsb2FkLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5iaW5hcnlFbmNvZGUobXNnKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBheWxvYWQgPSBbbXNnLmpvaW5fcmVmLCBtc2cucmVmLCBtc2cudG9waWMsIG1zZy5ldmVudCwgbXNnLnBheWxvYWRdXG4gICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG4gICAgfVxuICB9LFxuXG4gIGRlY29kZShyYXdQYXlsb2FkLCBjYWxsYmFjayl7XG4gICAgaWYocmF3UGF5bG9hZC5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuYmluYXJ5RGVjb2RlKHJhd1BheWxvYWQpKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgW2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZF0gPSBKU09OLnBhcnNlKHJhd1BheWxvYWQpXG4gICAgICByZXR1cm4gY2FsbGJhY2soe2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZH0pXG4gICAgfVxuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICBiaW5hcnlFbmNvZGUobWVzc2FnZSl7XG4gICAgbGV0IHtqb2luX3JlZiwgcmVmLCBldmVudCwgdG9waWMsIHBheWxvYWR9ID0gbWVzc2FnZVxuICAgIGxldCBtZXRhTGVuZ3RoID0gdGhpcy5NRVRBX0xFTkdUSCArIGpvaW5fcmVmLmxlbmd0aCArIHJlZi5sZW5ndGggKyB0b3BpYy5sZW5ndGggKyBldmVudC5sZW5ndGhcbiAgICBsZXQgaGVhZGVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuSEVBREVSX0xFTkdUSCArIG1ldGFMZW5ndGgpXG4gICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0aGlzLktJTkRTLnB1c2gpIC8vIGtpbmRcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBqb2luX3JlZi5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgcmVmLmxlbmd0aClcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0b3BpYy5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgZXZlbnQubGVuZ3RoKVxuICAgIEFycmF5LmZyb20oam9pbl9yZWYsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKHJlZiwgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuICAgIEFycmF5LmZyb20odG9waWMsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKGV2ZW50LCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG5cbiAgICB2YXIgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShoZWFkZXIuYnl0ZUxlbmd0aCArIHBheWxvYWQuYnl0ZUxlbmd0aClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkoaGVhZGVyKSwgMClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkocGF5bG9hZCksIGhlYWRlci5ieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIGNvbWJpbmVkLmJ1ZmZlclxuICB9LFxuXG4gIGJpbmFyeURlY29kZShidWZmZXIpe1xuICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICBsZXQga2luZCA9IHZpZXcuZ2V0VWludDgoMClcbiAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSB0aGlzLktJTkRTLnB1c2g6IHJldHVybiB0aGlzLmRlY29kZVB1c2goYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgICAgY2FzZSB0aGlzLktJTkRTLnJlcGx5OiByZXR1cm4gdGhpcy5kZWNvZGVSZXBseShidWZmZXIsIHZpZXcsIGRlY29kZXIpXG4gICAgICBjYXNlIHRoaXMuS0lORFMuYnJvYWRjYXN0OiByZXR1cm4gdGhpcy5kZWNvZGVCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgIH1cbiAgfSxcblxuICBkZWNvZGVQdXNoKGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDIpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMylcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSCAtIDEgLy8gcHVzaGVzIGhhdmUgbm8gcmVmXG4gICAgbGV0IGpvaW5SZWYgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBqb2luUmVmU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgam9pblJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9LFxuXG4gIGRlY29kZVJlcGx5KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCByZWZTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDMpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoNClcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSFxuICAgIGxldCBqb2luUmVmID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgam9pblJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGpvaW5SZWZTaXplXG4gICAgbGV0IHJlZiA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICBsZXQgcGF5bG9hZCA9IHtzdGF0dXM6IGV2ZW50LCByZXNwb25zZTogZGF0YX1cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IHJlZiwgdG9waWM6IHRvcGljLCBldmVudDogQ0hBTk5FTF9FVkVOVFMucmVwbHksIHBheWxvYWQ6IHBheWxvYWR9XG4gIH0sXG5cbiAgZGVjb2RlQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IHRvcGljU2l6ZSA9IHZpZXcuZ2V0VWludDgoMSlcbiAgICBsZXQgZXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyAyXG4gICAgbGV0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemVcbiAgICBsZXQgZXZlbnQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBldmVudFNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGV2ZW50U2l6ZVxuICAgIGxldCBkYXRhID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG5cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBudWxsLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9XG59XG4iLCAiLyoqIEluaXRpYWxpemVzIHRoZSBTb2NrZXQgKlxuICpcbiAqIEZvciBJRTggc3VwcG9ydCB1c2UgYW4gRVM1LXNoaW0gKGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kUG9pbnQgLSBUaGUgc3RyaW5nIFdlYlNvY2tldCBlbmRwb2ludCwgaWUsIGBcIndzOi8vZXhhbXBsZS5jb20vc29ja2V0XCJgLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIndzczovL2V4YW1wbGUuY29tXCJgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiL3NvY2tldFwiYCAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy50cmFuc3BvcnRdIC0gVGhlIFdlYnNvY2tldCBUcmFuc3BvcnQsIGZvciBleGFtcGxlIFdlYlNvY2tldCBvciBQaG9lbml4LkxvbmdQb2xsLlxuICpcbiAqIERlZmF1bHRzIHRvIFdlYlNvY2tldCB3aXRoIGF1dG9tYXRpYyBMb25nUG9sbCBmYWxsYmFjay5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmVuY29kZV0gLSBUaGUgZnVuY3Rpb24gdG8gZW5jb2RlIG91dGdvaW5nIG1lc3NhZ2VzLlxuICpcbiAqIERlZmF1bHRzIHRvIEpTT04gZW5jb2Rlci5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5kZWNvZGVdIC0gVGhlIGZ1bmN0aW9uIHRvIGRlY29kZSBpbmNvbWluZyBtZXNzYWdlcy5cbiAqXG4gKiBEZWZhdWx0cyB0byBKU09OOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIChwYXlsb2FkLCBjYWxsYmFjaykgPT4gY2FsbGJhY2soSlNPTi5wYXJzZShwYXlsb2FkKSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy50aW1lb3V0XSAtIFRoZSBkZWZhdWx0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHRyaWdnZXIgcHVzaCB0aW1lb3V0cy5cbiAqXG4gKiBEZWZhdWx0cyBgREVGQVVMVF9USU1FT1VUYFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmhlYXJ0YmVhdEludGVydmFsTXNdIC0gVGhlIG1pbGxpc2VjIGludGVydmFsIHRvIHNlbmQgYSBoZWFydGJlYXQgbWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnJlY29ubmVjdEFmdGVyTXNdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWlsbHNlY1xuICogc29ja2V0IHJlY29ubmVjdCBpbnRlcnZhbC5cbiAqXG4gKiBEZWZhdWx0cyB0byBzdGVwcGVkIGJhY2tvZmYgb2Y6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwLCA1MCwgMTAwLCAxNTAsIDIwMCwgMjUwLCA1MDAsIDEwMDAsIDIwMDBdW3RyaWVzIC0gMV0gfHwgNTAwMFxuICogfVxuICogYGBgYFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5yZWpvaW5BZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbGxzZWNcbiAqIHJlam9pbiBpbnRlcnZhbCBmb3IgaW5kaXZpZHVhbCBjaGFubmVscy5cbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbih0cmllcyl7XG4gKiAgIHJldHVybiBbMTAwMCwgMjAwMCwgNTAwMF1bdHJpZXMgLSAxXSB8fCAxMDAwMFxuICogfVxuICogYGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmxvZ2dlcl0gLSBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gZm9yIHNwZWNpYWxpemVkIGxvZ2dpbmcsIGllOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKGtpbmQsIG1zZywgZGF0YSkge1xuICogICBjb25zb2xlLmxvZyhgJHtraW5kfTogJHttc2d9YCwgZGF0YSlcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5sb25ncG9sbGVyVGltZW91dF0gLSBUaGUgbWF4aW11bSB0aW1lb3V0IG9mIGEgbG9uZyBwb2xsIEFKQVggcmVxdWVzdC5cbiAqXG4gKiBEZWZhdWx0cyB0byAyMHMgKGRvdWJsZSB0aGUgc2VydmVyIGxvbmcgcG9sbCB0aW1lcikuXG4gKlxuICogQHBhcmFtIHt7T2JqZWN0fGZ1bmN0aW9uKX0gW29wdHMucGFyYW1zXSAtIFRoZSBvcHRpb25hbCBwYXJhbXMgdG8gcGFzcyB3aGVuIGNvbm5lY3RpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5iaW5hcnlUeXBlXSAtIFRoZSBiaW5hcnkgdHlwZSB0byB1c2UgZm9yIGJpbmFyeSBXZWJTb2NrZXQgZnJhbWVzLlxuICpcbiAqIERlZmF1bHRzIHRvIFwiYXJyYXlidWZmZXJcIlxuICpcbiAqIEBwYXJhbSB7dnNufSBbb3B0cy52c25dIC0gVGhlIHNlcmlhbGl6ZXIncyBwcm90b2NvbCB2ZXJzaW9uIHRvIHNlbmQgb24gY29ubmVjdC5cbiAqXG4gKiBEZWZhdWx0cyB0byBERUZBVUxUX1ZTTi5cbiovXG5cbmltcG9ydCB7XG4gIGdsb2JhbCxcbiAgcGh4V2luZG93LFxuICBDSEFOTkVMX0VWRU5UUyxcbiAgREVGQVVMVF9USU1FT1VULFxuICBERUZBVUxUX1ZTTixcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUUyxcbiAgV1NfQ0xPU0VfTk9STUFMXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb3N1cmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcbmltcG9ydCBDaGFubmVsIGZyb20gXCIuL2NoYW5uZWxcIlxuaW1wb3J0IExvbmdQb2xsIGZyb20gXCIuL2xvbmdwb2xsXCJcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCIuL3NlcmlhbGl6ZXJcIlxuaW1wb3J0IFRpbWVyIGZyb20gXCIuL3RpbWVyXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU29ja2V0IHtcbiAgY29uc3RydWN0b3IoZW5kUG9pbnQsIG9wdHMgPSB7fSl7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcyA9IHtvcGVuOiBbXSwgY2xvc2U6IFtdLCBlcnJvcjogW10sIG1lc3NhZ2U6IFtdfVxuICAgIHRoaXMuY2hhbm5lbHMgPSBbXVxuICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdXG4gICAgdGhpcy5yZWYgPSAwXG4gICAgdGhpcy50aW1lb3V0ID0gb3B0cy50aW1lb3V0IHx8IERFRkFVTFRfVElNRU9VVFxuICAgIHRoaXMudHJhbnNwb3J0ID0gb3B0cy50cmFuc3BvcnQgfHwgZ2xvYmFsLldlYlNvY2tldCB8fCBMb25nUG9sbFxuICAgIHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9ucyA9IDBcbiAgICB0aGlzLmRlZmF1bHRFbmNvZGVyID0gU2VyaWFsaXplci5lbmNvZGUuYmluZChTZXJpYWxpemVyKVxuICAgIHRoaXMuZGVmYXVsdERlY29kZXIgPSBTZXJpYWxpemVyLmRlY29kZS5iaW5kKFNlcmlhbGl6ZXIpXG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gZmFsc2VcbiAgICB0aGlzLmJpbmFyeVR5cGUgPSBvcHRzLmJpbmFyeVR5cGUgfHwgXCJhcnJheWJ1ZmZlclwiXG4gICAgdGhpcy5jb25uZWN0Q2xvY2sgPSAxXG4gICAgaWYodGhpcy50cmFuc3BvcnQgIT09IExvbmdQb2xsKXtcbiAgICAgIHRoaXMuZW5jb2RlID0gb3B0cy5lbmNvZGUgfHwgdGhpcy5kZWZhdWx0RW5jb2RlclxuICAgICAgdGhpcy5kZWNvZGUgPSBvcHRzLmRlY29kZSB8fCB0aGlzLmRlZmF1bHREZWNvZGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5jb2RlID0gdGhpcy5kZWZhdWx0RW5jb2RlclxuICAgICAgdGhpcy5kZWNvZGUgPSB0aGlzLmRlZmF1bHREZWNvZGVyXG4gICAgfVxuICAgIGxldCBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gbnVsbFxuICAgIGlmKHBoeFdpbmRvdyAmJiBwaHhXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcil7XG4gICAgICBwaHhXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIF9lID0+IHtcbiAgICAgICAgaWYodGhpcy5jb25uKXtcbiAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKVxuICAgICAgICAgIGF3YWl0aW5nQ29ubmVjdGlvbk9uUGFnZVNob3cgPSB0aGlzLmNvbm5lY3RDbG9ja1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlc2hvd1wiLCBfZSA9PiB7XG4gICAgICAgIGlmKGF3YWl0aW5nQ29ubmVjdGlvbk9uUGFnZVNob3cgPT09IHRoaXMuY29ubmVjdENsb2NrKXtcbiAgICAgICAgICBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gbnVsbFxuICAgICAgICAgIHRoaXMuY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcyA9IG9wdHMuaGVhcnRiZWF0SW50ZXJ2YWxNcyB8fCAzMDAwMFxuICAgIHRoaXMucmVqb2luQWZ0ZXJNcyA9ICh0cmllcykgPT4ge1xuICAgICAgaWYob3B0cy5yZWpvaW5BZnRlck1zKXtcbiAgICAgICAgcmV0dXJuIG9wdHMucmVqb2luQWZ0ZXJNcyh0cmllcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbMTAwMCwgMjAwMCwgNTAwMF1bdHJpZXMgLSAxXSB8fCAxMDAwMFxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlY29ubmVjdEFmdGVyTXMgPSAodHJpZXMpID0+IHtcbiAgICAgIGlmKG9wdHMucmVjb25uZWN0QWZ0ZXJNcyl7XG4gICAgICAgIHJldHVybiBvcHRzLnJlY29ubmVjdEFmdGVyTXModHJpZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzEwLCA1MCwgMTAwLCAxNTAsIDIwMCwgMjUwLCA1MDAsIDEwMDAsIDIwMDBdW3RyaWVzIC0gMV0gfHwgNTAwMFxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvZ2dlciA9IG9wdHMubG9nZ2VyIHx8IG51bGxcbiAgICB0aGlzLmxvbmdwb2xsZXJUaW1lb3V0ID0gb3B0cy5sb25ncG9sbGVyVGltZW91dCB8fCAyMDAwMFxuICAgIHRoaXMucGFyYW1zID0gY2xvc3VyZShvcHRzLnBhcmFtcyB8fCB7fSlcbiAgICB0aGlzLmVuZFBvaW50ID0gYCR7ZW5kUG9pbnR9LyR7VFJBTlNQT1JUUy53ZWJzb2NrZXR9YFxuICAgIHRoaXMudnNuID0gb3B0cy52c24gfHwgREVGQVVMVF9WU05cbiAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gbnVsbFxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgIHRoaXMudGVhcmRvd24oKCkgPT4gdGhpcy5jb25uZWN0KCkpXG4gICAgfSwgdGhpcy5yZWNvbm5lY3RBZnRlck1zKVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGFuZCByZXBsYWNlcyB0aGUgYWN0aXZlIHRyYW5zcG9ydFxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXdUcmFuc3BvcnQgLSBUaGUgbmV3IHRyYW5zcG9ydCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgKlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydChuZXdUcmFuc3BvcnQpe1xuICAgIHRoaXMuZGlzY29ubmVjdCgpXG4gICAgdGhpcy50cmFuc3BvcnQgPSBuZXdUcmFuc3BvcnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzb2NrZXQgcHJvdG9jb2xcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHByb3RvY29sKCl7IHJldHVybiBsb2NhdGlvbi5wcm90b2NvbC5tYXRjaCgvXmh0dHBzLykgPyBcIndzc1wiIDogXCJ3c1wiIH1cblxuICAvKipcbiAgICogVGhlIGZ1bGx5IHF1YWxpZmVkIHNvY2tldCB1cmxcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGVuZFBvaW50VVJMKCl7XG4gICAgbGV0IHVyaSA9IEFqYXguYXBwZW5kUGFyYW1zKFxuICAgICAgQWpheC5hcHBlbmRQYXJhbXModGhpcy5lbmRQb2ludCwgdGhpcy5wYXJhbXMoKSksIHt2c246IHRoaXMudnNufSlcbiAgICBpZih1cmkuY2hhckF0KDApICE9PSBcIi9cIil7IHJldHVybiB1cmkgfVxuICAgIGlmKHVyaS5jaGFyQXQoMSkgPT09IFwiL1wiKXsgcmV0dXJuIGAke3RoaXMucHJvdG9jb2woKX06JHt1cml9YCB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5wcm90b2NvbCgpfTovLyR7bG9jYXRpb24uaG9zdH0ke3VyaX1gXG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgdGhlIHNvY2tldFxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Nsb3NlRXZlbnQjU3RhdHVzX2NvZGVzIGZvciB2YWxpZCBzdGF0dXMgY29kZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gT3B0aW9uYWwgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFmdGVyIHNvY2tldCBpcyBkaXNjb25uZWN0ZWQuXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gY29kZSAtIEEgc3RhdHVzIGNvZGUgZm9yIGRpc2Nvbm5lY3Rpb24gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIEEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIHRvIGRpc2Nvbm5lY3QuIChPcHRpb25hbClcbiAgICovXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2ssIGNvZGUsIHJlYXNvbil7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IHRydWVcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyLnJlc2V0KClcbiAgICB0aGlzLnRlYXJkb3duKGNhbGxiYWNrLCBjb2RlLCByZWFzb24pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIFRoZSBwYXJhbXMgdG8gc2VuZCB3aGVuIGNvbm5lY3RpbmcsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogdXNlclRva2VufWBcbiAgICpcbiAgICogUGFzc2luZyBwYXJhbXMgdG8gY29ubmVjdCBpcyBkZXByZWNhdGVkOyBwYXNzIHRoZW0gaW4gdGhlIFNvY2tldCBjb25zdHJ1Y3RvciBpbnN0ZWFkOlxuICAgKiBgbmV3IFNvY2tldChcIi9zb2NrZXRcIiwge3BhcmFtczoge3VzZXJfaWQ6IHVzZXJUb2tlbn19KWAuXG4gICAqL1xuICBjb25uZWN0KHBhcmFtcyl7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIGlmKHBhcmFtcyl7XG4gICAgICBjb25zb2xlICYmIGNvbnNvbGUubG9nKFwicGFzc2luZyBwYXJhbXMgdG8gY29ubmVjdCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIHBhc3MgOnBhcmFtcyB0byB0aGUgU29ja2V0IGNvbnN0cnVjdG9yXCIpXG4gICAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUocGFyYW1zKVxuICAgIH1cbiAgICBpZih0aGlzLmNvbm4peyByZXR1cm4gfVxuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgdGhpcy5jb25uID0gbmV3IHRoaXMudHJhbnNwb3J0KHRoaXMuZW5kUG9pbnRVUkwoKSlcbiAgICB0aGlzLmNvbm4uYmluYXJ5VHlwZSA9IHRoaXMuYmluYXJ5VHlwZVxuICAgIHRoaXMuY29ubi50aW1lb3V0ID0gdGhpcy5sb25ncG9sbGVyVGltZW91dFxuICAgIHRoaXMuY29ubi5vbm9wZW4gPSAoKSA9PiB0aGlzLm9uQ29ubk9wZW4oKVxuICAgIHRoaXMuY29ubi5vbmVycm9yID0gZXJyb3IgPT4gdGhpcy5vbkNvbm5FcnJvcihlcnJvcilcbiAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5NZXNzYWdlKGV2ZW50KVxuICAgIHRoaXMuY29ubi5vbmNsb3NlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5DbG9zZShldmVudClcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSBtZXNzYWdlLiBPdmVycmlkZSBgdGhpcy5sb2dnZXJgIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLiBub29wcyBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtc2dcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIGxvZyhraW5kLCBtc2csIGRhdGEpeyB0aGlzLmxvZ2dlcihraW5kLCBtc2csIGRhdGEpIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgbG9nZ2VyIGhhcyBiZWVuIHNldCBvbiB0aGlzIHNvY2tldC5cbiAgICovXG4gIGhhc0xvZ2dlcigpeyByZXR1cm4gdGhpcy5sb2dnZXIgIT09IG51bGwgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIG9wZW4gZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbk9wZW4oZnVuY3Rpb24oKXsgY29uc29sZS5pbmZvKFwidGhlIHNvY2tldCB3YXMgb3BlbmVkXCIpIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbk9wZW4oY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBjbG9zZSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uQ2xvc2UoY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuY2xvc2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gZXJyb3IgZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbkVycm9yKGZ1bmN0aW9uKGVycm9yKXsgYWxlcnQoXCJBbiBlcnJvciBvY2N1cnJlZFwiKSB9KVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25FcnJvcihjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBtZXNzYWdlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25NZXNzYWdlKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbkNvbm5PcGVuKCl7XG4gICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgYGNvbm5lY3RlZCB0byAke3RoaXMuZW5kUG9pbnRVUkwoKX1gKVxuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zKytcbiAgICB0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy5yZXNldEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5vcGVuLmZvckVhY2goKFssIGNhbGxiYWNrXSkgPT4gY2FsbGJhY2soKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBoZWFydGJlYXRUaW1lb3V0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmKXtcbiAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpeyB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImhlYXJ0YmVhdCB0aW1lb3V0LiBBdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uXCIpIH1cbiAgICAgIHRoaXMuYWJub3JtYWxDbG9zZShcImhlYXJ0YmVhdCB0aW1lb3V0XCIpXG4gICAgfVxuICB9XG5cbiAgcmVzZXRIZWFydGJlYXQoKXtcbiAgICBpZih0aGlzLmNvbm4gJiYgdGhpcy5jb25uLnNraXBIZWFydGJlYXQpeyByZXR1cm4gfVxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lcilcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VuZEhlYXJ0YmVhdCgpLCB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMpXG4gIH1cblxuICB0ZWFyZG93bihjYWxsYmFjaywgY29kZSwgcmVhc29uKXtcbiAgICBpZighdGhpcy5jb25uKXtcbiAgICAgIHJldHVybiBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgfVxuXG4gICAgdGhpcy53YWl0Rm9yQnVmZmVyRG9uZSgoKSA9PiB7XG4gICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICBpZihjb2RlKXsgdGhpcy5jb25uLmNsb3NlKGNvZGUsIHJlYXNvbiB8fCBcIlwiKSB9IGVsc2UgeyB0aGlzLmNvbm4uY2xvc2UoKSB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZCgoKSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5jb25uLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uID0gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgd2FpdEZvckJ1ZmZlckRvbmUoY2FsbGJhY2ssIHRyaWVzID0gMSl7XG4gICAgaWYodHJpZXMgPT09IDUgfHwgIXRoaXMuY29ubiB8fCAhdGhpcy5jb25uLmJ1ZmZlcmVkQW1vdW50KXtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YWl0Rm9yQnVmZmVyRG9uZShjYWxsYmFjaywgdHJpZXMgKyAxKVxuICAgIH0sIDE1MCAqIHRyaWVzKVxuICB9XG5cbiAgd2FpdEZvclNvY2tldENsb3NlZChjYWxsYmFjaywgdHJpZXMgPSAxKXtcbiAgICBpZih0cmllcyA9PT0gNSB8fCAhdGhpcy5jb25uIHx8IHRoaXMuY29ubi5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNsb3NlZCl7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZChjYWxsYmFjaywgdHJpZXMgKyAxKVxuICAgIH0sIDE1MCAqIHRyaWVzKVxuICB9XG5cbiAgb25Db25uQ2xvc2UoZXZlbnQpe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIFwiY2xvc2VcIiwgZXZlbnQpXG4gICAgdGhpcy50cmlnZ2VyQ2hhbkVycm9yKClcbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lcilcbiAgICBpZighdGhpcy5jbG9zZVdhc0NsZWFuKXtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KClcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5mb3JFYWNoKChbLCBjYWxsYmFja10pID0+IGNhbGxiYWNrKGV2ZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Db25uRXJyb3IoZXJyb3Ipe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGVycm9yKVxuICAgIGxldCB0cmFuc3BvcnRCZWZvcmUgPSB0aGlzLnRyYW5zcG9ydFxuICAgIGxldCBlc3RhYmxpc2hlZEJlZm9yZSA9IHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9uc1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuZXJyb3IuZm9yRWFjaCgoWywgY2FsbGJhY2tdKSA9PiB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgdHJhbnNwb3J0QmVmb3JlLCBlc3RhYmxpc2hlZEJlZm9yZSlcbiAgICB9KVxuICAgIGlmKHRyYW5zcG9ydEJlZm9yZSA9PT0gdGhpcy50cmFuc3BvcnQgfHwgZXN0YWJsaXNoZWRCZWZvcmUgPiAwKXtcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyQ2hhbkVycm9yKCl7XG4gICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgaWYoIShjaGFubmVsLmlzRXJyb3JlZCgpIHx8IGNoYW5uZWwuaXNMZWF2aW5nKCkgfHwgY2hhbm5lbC5pc0Nsb3NlZCgpKSl7XG4gICAgICAgIGNoYW5uZWwudHJpZ2dlcihDSEFOTkVMX0VWRU5UUy5lcnJvcilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBjb25uZWN0aW9uU3RhdGUoKXtcbiAgICBzd2l0Y2godGhpcy5jb25uICYmIHRoaXMuY29ubi5yZWFkeVN0YXRlKXtcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nOiByZXR1cm4gXCJjb25uZWN0aW5nXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5vcGVuOiByZXR1cm4gXCJvcGVuXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jbG9zaW5nOiByZXR1cm4gXCJjbG9zaW5nXCJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBcImNsb3NlZFwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXRlKCkgPT09IFwib3BlblwiIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICpcbiAgICogQHBhcmFtIHtDaGFubmVsfVxuICAgKi9cbiAgcmVtb3ZlKGNoYW5uZWwpe1xuICAgIHRoaXMub2ZmKGNoYW5uZWwuc3RhdGVDaGFuZ2VSZWZzKVxuICAgIHRoaXMuY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcihjID0+IGMuam9pblJlZigpICE9PSBjaGFubmVsLmpvaW5SZWYoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGBvbk9wZW5gLCBgb25DbG9zZWAsIGBvbkVycm9yLGAgYW5kIGBvbk1lc3NhZ2VgIHJlZ2lzdHJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7cmVmc30gLSBsaXN0IG9mIHJlZnMgcmV0dXJuZWQgYnkgY2FsbHMgdG9cbiAgICogICAgICAgICAgICAgICAgIGBvbk9wZW5gLCBgb25DbG9zZWAsIGBvbkVycm9yLGAgYW5kIGBvbk1lc3NhZ2VgXG4gICAqL1xuICBvZmYocmVmcyl7XG4gICAgZm9yKGxldCBrZXkgaW4gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcyl7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzW2tleV0gPSB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzW2tleV0uZmlsdGVyKChbcmVmXSkgPT4ge1xuICAgICAgICByZXR1cm4gcmVmcy5pbmRleE9mKHJlZikgPT09IC0xXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgYSBuZXcgY2hhbm5lbCBmb3IgdGhlIGdpdmVuIHRvcGljXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICAgKiBAcGFyYW0ge09iamVjdH0gY2hhblBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtDaGFubmVsfVxuICAgKi9cbiAgY2hhbm5lbCh0b3BpYywgY2hhblBhcmFtcyA9IHt9KXtcbiAgICBsZXQgY2hhbiA9IG5ldyBDaGFubmVsKHRvcGljLCBjaGFuUGFyYW1zLCB0aGlzKVxuICAgIHRoaXMuY2hhbm5lbHMucHVzaChjaGFuKVxuICAgIHJldHVybiBjaGFuXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIHB1c2goZGF0YSl7XG4gICAgaWYodGhpcy5oYXNMb2dnZXIoKSl7XG4gICAgICBsZXQge3RvcGljLCBldmVudCwgcGF5bG9hZCwgcmVmLCBqb2luX3JlZn0gPSBkYXRhXG4gICAgICB0aGlzLmxvZyhcInB1c2hcIiwgYCR7dG9waWN9ICR7ZXZlbnR9ICgke2pvaW5fcmVmfSwgJHtyZWZ9KWAsIHBheWxvYWQpXG4gICAgfVxuXG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpKXtcbiAgICAgIHRoaXMuZW5jb2RlKGRhdGEsIHJlc3VsdCA9PiB0aGlzLmNvbm4uc2VuZChyZXN1bHQpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbmRCdWZmZXIucHVzaCgoKSA9PiB0aGlzLmVuY29kZShkYXRhLCByZXN1bHQgPT4gdGhpcy5jb25uLnNlbmQocmVzdWx0KSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbmV4dCBtZXNzYWdlIHJlZiwgYWNjb3VudGluZyBmb3Igb3ZlcmZsb3dzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBtYWtlUmVmKCl7XG4gICAgbGV0IG5ld1JlZiA9IHRoaXMucmVmICsgMVxuICAgIGlmKG5ld1JlZiA9PT0gdGhpcy5yZWYpeyB0aGlzLnJlZiA9IDAgfSBlbHNlIHsgdGhpcy5yZWYgPSBuZXdSZWYgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVmLnRvU3RyaW5nKClcbiAgfVxuXG4gIHNlbmRIZWFydGJlYXQoKXtcbiAgICBpZih0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgJiYgIXRoaXMuaXNDb25uZWN0ZWQoKSl7IHJldHVybiB9XG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnB1c2goe3RvcGljOiBcInBob2VuaXhcIiwgZXZlbnQ6IFwiaGVhcnRiZWF0XCIsIHBheWxvYWQ6IHt9LCByZWY6IHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZn0pXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oZWFydGJlYXRUaW1lb3V0KCksIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcylcbiAgfVxuXG4gIGFibm9ybWFsQ2xvc2UocmVhc29uKXtcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIGlmKHRoaXMuaXNDb25uZWN0ZWQoKSl7IHRoaXMuY29ubi5jbG9zZShXU19DTE9TRV9OT1JNQUwsIHJlYXNvbikgfVxuICB9XG5cbiAgZmx1c2hTZW5kQnVmZmVyKCl7XG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuc2VuZEJ1ZmZlci5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpXG4gICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubk1lc3NhZ2UocmF3TWVzc2FnZSl7XG4gICAgdGhpcy5kZWNvZGUocmF3TWVzc2FnZS5kYXRhLCBtc2cgPT4ge1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gbXNnXG4gICAgICBpZihyZWYgJiYgcmVmID09PSB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpe1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lcilcbiAgICAgICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VuZEhlYXJ0YmVhdCgpLCB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMpXG4gICAgICB9XG5cbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwicmVjZWl2ZVwiLCBgJHtwYXlsb2FkLnN0YXR1cyB8fCBcIlwifSAke3RvcGljfSAke2V2ZW50fSAke3JlZiAmJiBcIihcIiArIHJlZiArIFwiKVwiIHx8IFwiXCJ9YCwgcGF5bG9hZClcblxuICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRoaXMuY2hhbm5lbHMubGVuZ3RoOyBpKyspe1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGFubmVsc1tpXVxuICAgICAgICBpZighY2hhbm5lbC5pc01lbWJlcih0b3BpYywgZXZlbnQsIHBheWxvYWQsIGpvaW5fcmVmKSl7IGNvbnRpbnVlIH1cbiAgICAgICAgY2hhbm5lbC50cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5fcmVmKVxuICAgICAgfVxuXG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgbGV0IFssIGNhbGxiYWNrXSA9IHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MubWVzc2FnZVtpXVxuICAgICAgICBjYWxsYmFjayhtc2cpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGxlYXZlT3BlblRvcGljKHRvcGljKXtcbiAgICBsZXQgZHVwQ2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZmluZChjID0+IGMudG9waWMgPT09IHRvcGljICYmIChjLmlzSm9pbmVkKCkgfHwgYy5pc0pvaW5pbmcoKSkpXG4gICAgaWYoZHVwQ2hhbm5lbCl7XG4gICAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBgbGVhdmluZyBkdXBsaWNhdGUgdG9waWMgXCIke3RvcGljfVwiYClcbiAgICAgIGR1cENoYW5uZWwubGVhdmUoKVxuICAgIH1cbiAgfVxufVxuIiwgIlxuZXhwb3J0IGNvbnN0IENPTlNFQ1VUSVZFX1JFTE9BRFMgPSBcImNvbnNlY3V0aXZlLXJlbG9hZHNcIlxuZXhwb3J0IGNvbnN0IE1BWF9SRUxPQURTID0gMTBcbmV4cG9ydCBjb25zdCBSRUxPQURfSklUVEVSID0gWzEwMDAsIDMwMDBdXG5leHBvcnQgY29uc3QgRkFJTFNBRkVfSklUVEVSID0gMzAwMDBcbmV4cG9ydCBjb25zdCBQSFhfRVZFTlRfQ0xBU1NFUyA9IFtcbiAgXCJwaHgtY2xpY2stbG9hZGluZ1wiLCBcInBoeC1jaGFuZ2UtbG9hZGluZ1wiLCBcInBoeC1zdWJtaXQtbG9hZGluZ1wiLFxuICBcInBoeC1rZXlkb3duLWxvYWRpbmdcIiwgXCJwaHgta2V5dXAtbG9hZGluZ1wiLCBcInBoeC1ibHVyLWxvYWRpbmdcIiwgXCJwaHgtZm9jdXMtbG9hZGluZ1wiXG5dXG5leHBvcnQgY29uc3QgUEhYX0NPTVBPTkVOVCA9IFwiZGF0YS1waHgtY29tcG9uZW50XCJcbmV4cG9ydCBjb25zdCBQSFhfTElWRV9MSU5LID0gXCJkYXRhLXBoeC1saW5rXCJcbmV4cG9ydCBjb25zdCBQSFhfVFJBQ0tfU1RBVElDID0gXCJ0cmFjay1zdGF0aWNcIlxuZXhwb3J0IGNvbnN0IFBIWF9MSU5LX1NUQVRFID0gXCJkYXRhLXBoeC1saW5rLXN0YXRlXCJcbmV4cG9ydCBjb25zdCBQSFhfUkVGID0gXCJkYXRhLXBoeC1yZWZcIlxuZXhwb3J0IGNvbnN0IFBIWF9UUkFDS19VUExPQURTID0gXCJ0cmFjay11cGxvYWRzXCJcbmV4cG9ydCBjb25zdCBQSFhfVVBMT0FEX1JFRiA9IFwiZGF0YS1waHgtdXBsb2FkLXJlZlwiXG5leHBvcnQgY29uc3QgUEhYX1BSRUZMSUdIVEVEX1JFRlMgPSBcImRhdGEtcGh4LXByZWZsaWdodGVkLXJlZnNcIlxuZXhwb3J0IGNvbnN0IFBIWF9ET05FX1JFRlMgPSBcImRhdGEtcGh4LWRvbmUtcmVmc1wiXG5leHBvcnQgY29uc3QgUEhYX0RST1BfVEFSR0VUID0gXCJkcm9wLXRhcmdldFwiXG5leHBvcnQgY29uc3QgUEhYX0FDVElWRV9FTlRSWV9SRUZTID0gXCJkYXRhLXBoeC1hY3RpdmUtcmVmc1wiXG5leHBvcnQgY29uc3QgUEhYX0xJVkVfRklMRV9VUERBVEVEID0gXCJwaHg6bGl2ZS1maWxlOnVwZGF0ZWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9TS0lQID0gXCJkYXRhLXBoeC1za2lwXCJcbmV4cG9ydCBjb25zdCBQSFhfUkVNT1ZFID0gXCJkYXRhLXBoeC1yZW1vdmVcIlxuZXhwb3J0IGNvbnN0IFBIWF9QQUdFX0xPQURJTkcgPSBcInBhZ2UtbG9hZGluZ1wiXG5leHBvcnQgY29uc3QgUEhYX0NPTk5FQ1RFRF9DTEFTUyA9IFwicGh4LWNvbm5lY3RlZFwiXG5leHBvcnQgY29uc3QgUEhYX0RJU0NPTk5FQ1RFRF9DTEFTUyA9IFwicGh4LWRpc2Nvbm5lY3RlZFwiXG5leHBvcnQgY29uc3QgUEhYX05PX0ZFRURCQUNLX0NMQVNTID0gXCJwaHgtbm8tZmVlZGJhY2tcIlxuZXhwb3J0IGNvbnN0IFBIWF9FUlJPUl9DTEFTUyA9IFwicGh4LWVycm9yXCJcbmV4cG9ydCBjb25zdCBQSFhfUEFSRU5UX0lEID0gXCJkYXRhLXBoeC1wYXJlbnQtaWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9NQUlOID0gXCJkYXRhLXBoeC1tYWluXCJcbmV4cG9ydCBjb25zdCBQSFhfUk9PVF9JRCA9IFwiZGF0YS1waHgtcm9vdC1pZFwiXG5leHBvcnQgY29uc3QgUEhYX1RSSUdHRVJfQUNUSU9OID0gXCJ0cmlnZ2VyLWFjdGlvblwiXG5leHBvcnQgY29uc3QgUEhYX0ZFRURCQUNLX0ZPUiA9IFwiZmVlZGJhY2stZm9yXCJcbmV4cG9ydCBjb25zdCBQSFhfSEFTX0ZPQ1VTRUQgPSBcInBoeC1oYXMtZm9jdXNlZFwiXG5leHBvcnQgY29uc3QgRk9DVVNBQkxFX0lOUFVUUyA9IFtcInRleHRcIiwgXCJ0ZXh0YXJlYVwiLCBcIm51bWJlclwiLCBcImVtYWlsXCIsIFwicGFzc3dvcmRcIiwgXCJzZWFyY2hcIiwgXCJ0ZWxcIiwgXCJ1cmxcIiwgXCJkYXRlXCIsIFwidGltZVwiXVxuZXhwb3J0IGNvbnN0IENIRUNLQUJMRV9JTlBVVFMgPSBbXCJjaGVja2JveFwiLCBcInJhZGlvXCJdXG5leHBvcnQgY29uc3QgUEhYX0hBU19TVUJNSVRURUQgPSBcInBoeC1oYXMtc3VibWl0dGVkXCJcbmV4cG9ydCBjb25zdCBQSFhfU0VTU0lPTiA9IFwiZGF0YS1waHgtc2Vzc2lvblwiXG5leHBvcnQgY29uc3QgUEhYX1ZJRVdfU0VMRUNUT1IgPSBgWyR7UEhYX1NFU1NJT059XWBcbmV4cG9ydCBjb25zdCBQSFhfU1RBVElDID0gXCJkYXRhLXBoeC1zdGF0aWNcIlxuZXhwb3J0IGNvbnN0IFBIWF9SRUFET05MWSA9IFwiZGF0YS1waHgtcmVhZG9ubHlcIlxuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFRCA9IFwiZGF0YS1waHgtZGlzYWJsZWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEggPSBcImRpc2FibGUtd2l0aFwiXG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFID0gXCJkYXRhLXBoeC1kaXNhYmxlLXdpdGgtcmVzdG9yZVwiXG5leHBvcnQgY29uc3QgUEhYX0hPT0sgPSBcImhvb2tcIlxuZXhwb3J0IGNvbnN0IFBIWF9ERUJPVU5DRSA9IFwiZGVib3VuY2VcIlxuZXhwb3J0IGNvbnN0IFBIWF9USFJPVFRMRSA9IFwidGhyb3R0bGVcIlxuZXhwb3J0IGNvbnN0IFBIWF9VUERBVEUgPSBcInVwZGF0ZVwiXG5leHBvcnQgY29uc3QgUEhYX0tFWSA9IFwia2V5XCJcbmV4cG9ydCBjb25zdCBQSFhfUFJJVkFURSA9IFwicGh4UHJpdmF0ZVwiXG5leHBvcnQgY29uc3QgUEhYX0FVVE9fUkVDT1ZFUiA9IFwiYXV0by1yZWNvdmVyXCJcbmV4cG9ydCBjb25zdCBQSFhfTFZfREVCVUcgPSBcInBoeDpsaXZlLXNvY2tldDpkZWJ1Z1wiXG5leHBvcnQgY29uc3QgUEhYX0xWX1BST0ZJTEUgPSBcInBoeDpsaXZlLXNvY2tldDpwcm9maWxpbmdcIlxuZXhwb3J0IGNvbnN0IFBIWF9MVl9MQVRFTkNZX1NJTSA9IFwicGh4OmxpdmUtc29ja2V0OmxhdGVuY3ktc2ltXCJcbmV4cG9ydCBjb25zdCBQSFhfUFJPR1JFU1MgPSBcInByb2dyZXNzXCJcbmV4cG9ydCBjb25zdCBMT0FERVJfVElNRU9VVCA9IDFcbmV4cG9ydCBjb25zdCBCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VUID0gMjAwXG5leHBvcnQgY29uc3QgQklORElOR19QUkVGSVggPSBcInBoeC1cIlxuZXhwb3J0IGNvbnN0IFBVU0hfVElNRU9VVCA9IDMwMDAwXG5leHBvcnQgY29uc3QgTElOS19IRUFERVIgPSBcIngtcmVxdWVzdGVkLXdpdGhcIlxuZXhwb3J0IGNvbnN0IFJFU1BPTlNFX1VSTF9IRUFERVIgPSBcIngtcmVzcG9uc2UtdXJsXCJcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9UUklHR0VSID0gXCJkZWJvdW5jZS10cmlnZ2VyXCJcbmV4cG9ydCBjb25zdCBUSFJPVFRMRUQgPSBcInRocm90dGxlZFwiXG5leHBvcnQgY29uc3QgREVCT1VOQ0VfUFJFVl9LRVkgPSBcImRlYm91bmNlLXByZXYta2V5XCJcbmV4cG9ydCBjb25zdCBERUZBVUxUUyA9IHtcbiAgZGVib3VuY2U6IDMwMCxcbiAgdGhyb3R0bGU6IDMwMFxufVxuXG4vLyBSZW5kZXJlZFxuZXhwb3J0IGNvbnN0IERZTkFNSUNTID0gXCJkXCJcbmV4cG9ydCBjb25zdCBTVEFUSUMgPSBcInNcIlxuZXhwb3J0IGNvbnN0IENPTVBPTkVOVFMgPSBcImNcIlxuZXhwb3J0IGNvbnN0IEVWRU5UUyA9IFwiZVwiXG5leHBvcnQgY29uc3QgUkVQTFkgPSBcInJcIlxuZXhwb3J0IGNvbnN0IFRJVExFID0gXCJ0XCJcbiIsICJpbXBvcnQge1xuICBsb2dFcnJvclxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVudHJ5VXBsb2FkZXIge1xuICBjb25zdHJ1Y3RvcihlbnRyeSwgY2h1bmtTaXplLCBsaXZlU29ja2V0KXtcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0XG4gICAgdGhpcy5lbnRyeSA9IGVudHJ5XG4gICAgdGhpcy5vZmZzZXQgPSAwXG4gICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemVcbiAgICB0aGlzLmNodW5rVGltZXIgPSBudWxsXG4gICAgdGhpcy51cGxvYWRDaGFubmVsID0gbGl2ZVNvY2tldC5jaGFubmVsKGBsdnU6JHtlbnRyeS5yZWZ9YCwge3Rva2VuOiBlbnRyeS5tZXRhZGF0YSgpfSlcbiAgfVxuXG4gIGVycm9yKHJlYXNvbil7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY2h1bmtUaW1lcilcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwubGVhdmUoKVxuICAgIHRoaXMuZW50cnkuZXJyb3IocmVhc29uKVxuICB9XG5cbiAgdXBsb2FkKCl7XG4gICAgdGhpcy51cGxvYWRDaGFubmVsLm9uRXJyb3IocmVhc29uID0+IHRoaXMuZXJyb3IocmVhc29uKSlcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwuam9pbigpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIF9kYXRhID0+IHRoaXMucmVhZE5leHRDaHVuaygpKVxuICAgICAgLnJlY2VpdmUoXCJlcnJvclwiLCByZWFzb24gPT4gdGhpcy5lcnJvcihyZWFzb24pKVxuICB9XG5cbiAgaXNEb25lKCl7IHJldHVybiB0aGlzLm9mZnNldCA+PSB0aGlzLmVudHJ5LmZpbGUuc2l6ZSB9XG5cbiAgcmVhZE5leHRDaHVuaygpe1xuICAgIGxldCByZWFkZXIgPSBuZXcgd2luZG93LkZpbGVSZWFkZXIoKVxuICAgIGxldCBibG9iID0gdGhpcy5lbnRyeS5maWxlLnNsaWNlKHRoaXMub2Zmc2V0LCB0aGlzLmNodW5rU2l6ZSArIHRoaXMub2Zmc2V0KVxuICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgaWYoZS50YXJnZXQuZXJyb3IgPT09IG51bGwpe1xuICAgICAgICB0aGlzLm9mZnNldCArPSBlLnRhcmdldC5yZXN1bHQuYnl0ZUxlbmd0aFxuICAgICAgICB0aGlzLnB1c2hDaHVuayhlLnRhcmdldC5yZXN1bHQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbG9nRXJyb3IoXCJSZWFkIGVycm9yOiBcIiArIGUudGFyZ2V0LmVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgfVxuXG4gIHB1c2hDaHVuayhjaHVuayl7XG4gICAgaWYoIXRoaXMudXBsb2FkQ2hhbm5lbC5pc0pvaW5lZCgpKXsgcmV0dXJuIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWwucHVzaChcImNodW5rXCIsIGNodW5rKVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW50cnkucHJvZ3Jlc3MoKHRoaXMub2Zmc2V0IC8gdGhpcy5lbnRyeS5maWxlLnNpemUpICogMTAwKVxuICAgICAgICBpZighdGhpcy5pc0RvbmUoKSl7XG4gICAgICAgICAgdGhpcy5jaHVua1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlYWROZXh0Q2h1bmsoKSwgdGhpcy5saXZlU29ja2V0LmdldExhdGVuY3lTaW0oKSB8fCAwKVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgUEhYX1ZJRVdfU0VMRUNUT1Jcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IEVudHJ5VXBsb2FkZXIgZnJvbSBcIi4vZW50cnlfdXBsb2FkZXJcIlxuXG5leHBvcnQgbGV0IGxvZ0Vycm9yID0gKG1zZywgb2JqKSA9PiBjb25zb2xlLmVycm9yICYmIGNvbnNvbGUuZXJyb3IobXNnLCBvYmopXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3REdXBsaWNhdGVJZHMoKXtcbiAgbGV0IGlkcyA9IG5ldyBTZXQoKVxuICBsZXQgZWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiKltpZF1cIilcbiAgZm9yKGxldCBpID0gMCwgbGVuID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspe1xuICAgIGlmKGlkcy5oYXMoZWxlbXNbaV0uaWQpKXtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYE11bHRpcGxlIElEcyBkZXRlY3RlZDogJHtlbGVtc1tpXS5pZH0uIEVuc3VyZSB1bmlxdWUgZWxlbWVudCBpZHMuYClcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzLmFkZChlbGVtc1tpXS5pZClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGxldCBkZWJ1ZyA9ICh2aWV3LCBraW5kLCBtc2csIG9iaikgPT4ge1xuICBpZih2aWV3LmxpdmVTb2NrZXQuaXNEZWJ1Z0VuYWJsZWQoKSl7XG4gICAgY29uc29sZS5sb2coYCR7dmlldy5pZH0gJHtraW5kfTogJHttc2d9IC0gYCwgb2JqKVxuICB9XG59XG5cbi8vIHdyYXBzIHZhbHVlIGluIGNsb3N1cmUgb3IgcmV0dXJucyBjbG9zdXJlXG5leHBvcnQgbGV0IGNsb3N1cmUgPSAodmFsKSA9PiB0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCIgPyB2YWwgOiBmdW5jdGlvbiAoKXsgcmV0dXJuIHZhbCB9XG5cbmV4cG9ydCBsZXQgY2xvbmUgPSAob2JqKSA9PiB7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpIH1cblxuZXhwb3J0IGxldCBjbG9zZXN0UGh4QmluZGluZyA9IChlbCwgYmluZGluZywgYm9yZGVyRWwpID0+IHtcbiAgZG8ge1xuICAgIGlmKGVsLm1hdGNoZXMoYFske2JpbmRpbmd9XWApKXsgcmV0dXJuIGVsIH1cbiAgICBlbCA9IGVsLnBhcmVudEVsZW1lbnQgfHwgZWwucGFyZW50Tm9kZVxuICB9IHdoaWxlKGVsICE9PSBudWxsICYmIGVsLm5vZGVUeXBlID09PSAxICYmICEoKGJvcmRlckVsICYmIGJvcmRlckVsLmlzU2FtZU5vZGUoZWwpKSB8fCBlbC5tYXRjaGVzKFBIWF9WSUVXX1NFTEVDVE9SKSkpXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBsZXQgaXNPYmplY3QgPSAob2JqKSA9PiB7XG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiAhKG9iaiBpbnN0YW5jZW9mIEFycmF5KVxufVxuXG5leHBvcnQgbGV0IGlzRXF1YWxPYmogPSAob2JqMSwgb2JqMikgPT4gSlNPTi5zdHJpbmdpZnkob2JqMSkgPT09IEpTT04uc3RyaW5naWZ5KG9iajIpXG5cbmV4cG9ydCBsZXQgaXNFbXB0eSA9IChvYmopID0+IHtcbiAgZm9yKGxldCB4IGluIG9iail7IHJldHVybiBmYWxzZSB9XG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBsZXQgbWF5YmUgPSAoZWwsIGNhbGxiYWNrKSA9PiBlbCAmJiBjYWxsYmFjayhlbClcblxuZXhwb3J0IGxldCBjaGFubmVsVXBsb2FkZXIgPSBmdW5jdGlvbiAoZW50cmllcywgb25FcnJvciwgcmVzcCwgbGl2ZVNvY2tldCl7XG4gIGVudHJpZXMuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgbGV0IGVudHJ5VXBsb2FkZXIgPSBuZXcgRW50cnlVcGxvYWRlcihlbnRyeSwgcmVzcC5jb25maWcuY2h1bmtfc2l6ZSwgbGl2ZVNvY2tldClcbiAgICBlbnRyeVVwbG9hZGVyLnVwbG9hZCgpXG4gIH0pXG59XG4iLCAibGV0IEJyb3dzZXIgPSB7XG4gIGNhblB1c2hTdGF0ZSgpeyByZXR1cm4gKHR5cGVvZiAoaGlzdG9yeS5wdXNoU3RhdGUpICE9PSBcInVuZGVmaW5lZFwiKSB9LFxuXG4gIGRyb3BMb2NhbChsb2NhbFN0b3JhZ2UsIG5hbWVzcGFjZSwgc3Via2V5KXtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbEtleShuYW1lc3BhY2UsIHN1YmtleSkpXG4gIH0sXG5cbiAgdXBkYXRlTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSwgaW5pdGlhbCwgZnVuYyl7XG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzLmdldExvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXkpXG4gICAgbGV0IGtleSA9IHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpXG4gICAgbGV0IG5ld1ZhbCA9IGN1cnJlbnQgPT09IG51bGwgPyBpbml0aWFsIDogZnVuYyhjdXJyZW50KVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobmV3VmFsKSlcbiAgICByZXR1cm4gbmV3VmFsXG4gIH0sXG5cbiAgZ2V0TG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSl7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbEtleShuYW1lc3BhY2UsIHN1YmtleSkpKVxuICB9LFxuXG4gIHVwZGF0ZUN1cnJlbnRTdGF0ZShjYWxsYmFjayl7XG4gICAgaWYoIXRoaXMuY2FuUHVzaFN0YXRlKCkpeyByZXR1cm4gfVxuICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKGNhbGxiYWNrKGhpc3Rvcnkuc3RhdGUgfHwge30pLCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfSxcblxuICBwdXNoU3RhdGUoa2luZCwgbWV0YSwgdG8pe1xuICAgIGlmKHRoaXMuY2FuUHVzaFN0YXRlKCkpe1xuICAgICAgaWYodG8gIT09IHdpbmRvdy5sb2NhdGlvbi5ocmVmKXtcbiAgICAgICAgaWYobWV0YS50eXBlID09IFwicmVkaXJlY3RcIiAmJiBtZXRhLnNjcm9sbCl7XG4gICAgICAgICAgLy8gSWYgd2UncmUgcmVkaXJlY3Rpbmcgc3RvcmUgdGhlIGN1cnJlbnQgc2Nyb2xsWSBmb3IgdGhlIGN1cnJlbnQgaGlzdG9yeSBzdGF0ZS5cbiAgICAgICAgICBsZXQgY3VycmVudFN0YXRlID0gaGlzdG9yeS5zdGF0ZSB8fCB7fVxuICAgICAgICAgIGN1cnJlbnRTdGF0ZS5zY3JvbGwgPSBtZXRhLnNjcm9sbFxuICAgICAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKGN1cnJlbnRTdGF0ZSwgXCJcIiwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgbWV0YS5zY3JvbGwgLy8gT25seSBzdG9yZSB0aGUgc2Nyb2xsIGluIHRoZSByZWRpcmVjdCBjYXNlLlxuICAgICAgICBoaXN0b3J5W2tpbmQgKyBcIlN0YXRlXCJdKG1ldGEsIFwiXCIsIHRvIHx8IG51bGwpIC8vIElFIHdpbGwgY29lcmNlIHVuZGVmaW5lZCB0byBzdHJpbmdcbiAgICAgICAgbGV0IGhhc2hFbCA9IHRoaXMuZ2V0SGFzaFRhcmdldEVsKHdpbmRvdy5sb2NhdGlvbi5oYXNoKVxuXG4gICAgICAgIGlmKGhhc2hFbCl7XG4gICAgICAgICAgaGFzaEVsLnNjcm9sbEludG9WaWV3KClcbiAgICAgICAgfSBlbHNlIGlmKG1ldGEudHlwZSA9PT0gXCJyZWRpcmVjdFwiKXtcbiAgICAgICAgICB3aW5kb3cuc2Nyb2xsKDAsIDApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWRpcmVjdCh0bylcbiAgICB9XG4gIH0sXG5cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlKXtcbiAgICBkb2N1bWVudC5jb29raWUgPSBgJHtuYW1lfT0ke3ZhbHVlfWBcbiAgfSxcblxuICBnZXRDb29raWUobmFtZSl7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNvb2tpZS5yZXBsYWNlKG5ldyBSZWdFeHAoYCg/Oig/Ol58Lio7XFxzKikke25hbWV9XFxzKlxcPVxccyooW147XSopLiokKXxeLiokYCksIFwiJDFcIilcbiAgfSxcblxuICByZWRpcmVjdCh0b1VSTCwgZmxhc2gpe1xuICAgIGlmKGZsYXNoKXsgQnJvd3Nlci5zZXRDb29raWUoXCJfX3Bob2VuaXhfZmxhc2hfX1wiLCBmbGFzaCArIFwiOyBtYXgtYWdlPTYwMDAwOyBwYXRoPS9cIikgfVxuICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRvVVJMXG4gIH0sXG5cbiAgbG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpeyByZXR1cm4gYCR7bmFtZXNwYWNlfS0ke3N1YmtleX1gIH0sXG5cbiAgZ2V0SGFzaFRhcmdldEVsKG1heWJlSGFzaCl7XG4gICAgbGV0IGhhc2ggPSBtYXliZUhhc2gudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSlcbiAgICBpZihoYXNoID09PSBcIlwiKXsgcmV0dXJuIH1cbiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaGFzaCkgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgYVtuYW1lPVwiJHtoYXNofVwiXWApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQnJvd3NlclxuIiwgImltcG9ydCB7XG4gIENIRUNLQUJMRV9JTlBVVFMsXG4gIERFQk9VTkNFX1BSRVZfS0VZLFxuICBERUJPVU5DRV9UUklHR0VSLFxuICBGT0NVU0FCTEVfSU5QVVRTLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfRVZFTlRfQ0xBU1NFUyxcbiAgUEhYX0hBU19GT0NVU0VELFxuICBQSFhfSEFTX1NVQk1JVFRFRCxcbiAgUEhYX01BSU4sXG4gIFBIWF9OT19GRUVEQkFDS19DTEFTUyxcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BSSVZBVEUsXG4gIFBIWF9SRUYsXG4gIFBIWF9TRVNTSU9OLFxuICBQSFhfU1RBVElDLFxuICBQSFhfVVBMT0FEX1JFRixcbiAgUEhYX1ZJRVdfU0VMRUNUT1IsXG4gIFRIUk9UVExFRFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xuICBjbG9uZSxcbiAgbG9nRXJyb3Jcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5sZXQgRE9NID0ge1xuICBieUlkKGlkKXsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSB8fCBsb2dFcnJvcihgbm8gaWQgZm91bmQgZm9yICR7aWR9YCkgfSxcblxuICByZW1vdmVDbGFzcyhlbCwgY2xhc3NOYW1lKXtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSlcbiAgICBpZihlbC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKXsgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIikgfVxuICB9LFxuXG4gIGFsbChub2RlLCBxdWVyeSwgY2FsbGJhY2spe1xuICAgIGlmKCFub2RlKXsgcmV0dXJuIFtdIH1cbiAgICBsZXQgYXJyYXkgPSBBcnJheS5mcm9tKG5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpXG4gICAgcmV0dXJuIGNhbGxiYWNrID8gYXJyYXkuZm9yRWFjaChjYWxsYmFjaykgOiBhcnJheVxuICB9LFxuXG4gIGNoaWxkTm9kZUxlbmd0aChodG1sKXtcbiAgICBsZXQgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIilcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sXG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnRcbiAgfSxcblxuICBpc1VwbG9hZElucHV0KGVsKXsgcmV0dXJuIGVsLnR5cGUgPT09IFwiZmlsZVwiICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRikgIT09IG51bGwgfSxcblxuICBmaW5kVXBsb2FkSW5wdXRzKG5vZGUpeyByZXR1cm4gdGhpcy5hbGwobm9kZSwgYGlucHV0W3R5cGU9XCJmaWxlXCJdWyR7UEhYX1VQTE9BRF9SRUZ9XWApIH0sXG5cbiAgZmluZENvbXBvbmVudE5vZGVMaXN0KG5vZGUsIGNpZCl7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KHRoaXMuYWxsKG5vZGUsIGBbJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXWApLCBub2RlKVxuICB9LFxuXG4gIGlzUGh4RGVzdHJveWVkKG5vZGUpe1xuICAgIHJldHVybiBub2RlLmlkICYmIERPTS5wcml2YXRlKG5vZGUsIFwiZGVzdHJveWVkXCIpID8gdHJ1ZSA6IGZhbHNlXG4gIH0sXG5cbiAgbWFya1BoeENoaWxkRGVzdHJveWVkKGVsKXtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIFwiXCIpXG4gICAgdGhpcy5wdXRQcml2YXRlKGVsLCBcImRlc3Ryb3llZFwiLCB0cnVlKVxuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgcGFyZW50SWQpe1xuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWxcbiAgICByZXR1cm4gdGhpcy5maW5kUGh4Q2hpbGRyZW4odGVtcGxhdGUuY29udGVudCwgcGFyZW50SWQpXG4gIH0sXG5cbiAgaXNJZ25vcmVkKGVsLCBwaHhVcGRhdGUpe1xuICAgIHJldHVybiAoZWwuZ2V0QXR0cmlidXRlKHBoeFVwZGF0ZSkgfHwgZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtdXBkYXRlXCIpKSA9PT0gXCJpZ25vcmVcIlxuICB9LFxuXG4gIGlzUGh4VXBkYXRlKGVsLCBwaHhVcGRhdGUsIHVwZGF0ZVR5cGVzKXtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIHVwZGF0ZVR5cGVzLmluZGV4T2YoZWwuZ2V0QXR0cmlidXRlKHBoeFVwZGF0ZSkpID49IDBcbiAgfSxcblxuICBmaW5kUGh4Q2hpbGRyZW4oZWwsIHBhcmVudElkKXtcbiAgICByZXR1cm4gdGhpcy5hbGwoZWwsIGAke1BIWF9WSUVXX1NFTEVDVE9SfVske1BIWF9QQVJFTlRfSUR9PVwiJHtwYXJlbnRJZH1cIl1gKVxuICB9LFxuXG4gIGZpbmRQYXJlbnRDSURzKG5vZGUsIGNpZHMpe1xuICAgIGxldCBpbml0aWFsID0gbmV3IFNldChjaWRzKVxuICAgIHJldHVybiBjaWRzLnJlZHVjZSgoYWNjLCBjaWQpID0+IHtcbiAgICAgIGxldCBzZWxlY3RvciA9IGBbJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXSBbJHtQSFhfQ09NUE9ORU5UfV1gXG5cbiAgICAgIHRoaXMuZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KHRoaXMuYWxsKG5vZGUsIHNlbGVjdG9yKSwgbm9kZSlcbiAgICAgICAgLm1hcChlbCA9PiBwYXJzZUludChlbC5nZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVCkpKVxuICAgICAgICAuZm9yRWFjaChjaGlsZENJRCA9PiBhY2MuZGVsZXRlKGNoaWxkQ0lEKSlcblxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sIGluaXRpYWwpXG4gIH0sXG5cbiAgZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KG5vZGVzLCBwYXJlbnQpe1xuICAgIGlmKHBhcmVudC5xdWVyeVNlbGVjdG9yKFBIWF9WSUVXX1NFTEVDVE9SKSl7XG4gICAgICByZXR1cm4gbm9kZXMuZmlsdGVyKGVsID0+IHRoaXMud2l0aGluU2FtZUxpdmVWaWV3KGVsLCBwYXJlbnQpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbm9kZXNcbiAgICB9XG4gIH0sXG5cbiAgd2l0aGluU2FtZUxpdmVWaWV3KG5vZGUsIHBhcmVudCl7XG4gICAgd2hpbGUobm9kZSA9IG5vZGUucGFyZW50Tm9kZSl7XG4gICAgICBpZihub2RlLmlzU2FtZU5vZGUocGFyZW50KSl7IHJldHVybiB0cnVlIH1cbiAgICAgIGlmKG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OKSAhPT0gbnVsbCl7IHJldHVybiBmYWxzZSB9XG4gICAgfVxuICB9LFxuXG4gIHByaXZhdGUoZWwsIGtleSl7IHJldHVybiBlbFtQSFhfUFJJVkFURV0gJiYgZWxbUEhYX1BSSVZBVEVdW2tleV0gfSxcblxuICBkZWxldGVQcml2YXRlKGVsLCBrZXkpeyBlbFtQSFhfUFJJVkFURV0gJiYgZGVsZXRlIChlbFtQSFhfUFJJVkFURV1ba2V5XSkgfSxcblxuICBwdXRQcml2YXRlKGVsLCBrZXksIHZhbHVlKXtcbiAgICBpZighZWxbUEhYX1BSSVZBVEVdKXsgZWxbUEhYX1BSSVZBVEVdID0ge30gfVxuICAgIGVsW1BIWF9QUklWQVRFXVtrZXldID0gdmFsdWVcbiAgfSxcblxuICBjb3B5UHJpdmF0ZXModGFyZ2V0LCBzb3VyY2Upe1xuICAgIGlmKHNvdXJjZVtQSFhfUFJJVkFURV0pe1xuICAgICAgdGFyZ2V0W1BIWF9QUklWQVRFXSA9IGNsb25lKHNvdXJjZVtQSFhfUFJJVkFURV0pXG4gICAgfVxuICB9LFxuXG4gIHB1dFRpdGxlKHN0cil7XG4gICAgbGV0IHRpdGxlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIilcbiAgICBsZXQge3ByZWZpeCwgc3VmZml4fSA9IHRpdGxlRWwuZGF0YXNldFxuICAgIGRvY3VtZW50LnRpdGxlID0gYCR7cHJlZml4IHx8IFwiXCJ9JHtzdHJ9JHtzdWZmaXggfHwgXCJcIn1gXG4gIH0sXG5cbiAgZGVib3VuY2UoZWwsIGV2ZW50LCBwaHhEZWJvdW5jZSwgZGVmYXVsdERlYm91bmNlLCBwaHhUaHJvdHRsZSwgZGVmYXVsdFRocm90dGxlLCBjYWxsYmFjayl7XG4gICAgbGV0IGRlYm91bmNlID0gZWwuZ2V0QXR0cmlidXRlKHBoeERlYm91bmNlKVxuICAgIGxldCB0aHJvdHRsZSA9IGVsLmdldEF0dHJpYnV0ZShwaHhUaHJvdHRsZSlcbiAgICBpZihkZWJvdW5jZSA9PT0gXCJcIil7IGRlYm91bmNlID0gZGVmYXVsdERlYm91bmNlIH1cbiAgICBpZih0aHJvdHRsZSA9PT0gXCJcIil7IHRocm90dGxlID0gZGVmYXVsdFRocm90dGxlIH1cbiAgICBsZXQgdmFsdWUgPSBkZWJvdW5jZSB8fCB0aHJvdHRsZVxuICAgIHN3aXRjaCh2YWx1ZSl7XG4gICAgICBjYXNlIG51bGw6IHJldHVybiBjYWxsYmFjaygpXG5cbiAgICAgIGNhc2UgXCJibHVyXCI6XG4gICAgICAgIGlmKHRoaXMub25jZShlbCwgXCJkZWJvdW5jZS1ibHVyXCIpKXtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiBjYWxsYmFjaygpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsZXQgdGltZW91dCA9IHBhcnNlSW50KHZhbHVlKVxuICAgICAgICBsZXQgdHJpZ2dlciA9ICgpID0+IHRocm90dGxlID8gdGhpcy5kZWxldGVQcml2YXRlKGVsLCBUSFJPVFRMRUQpIDogY2FsbGJhY2soKVxuICAgICAgICBsZXQgY3VycmVudEN5Y2xlID0gdGhpcy5pbmNDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiwgdHJpZ2dlcilcbiAgICAgICAgaWYoaXNOYU4odGltZW91dCkpeyByZXR1cm4gbG9nRXJyb3IoYGludmFsaWQgdGhyb3R0bGUvZGVib3VuY2UgdmFsdWU6ICR7dmFsdWV9YCkgfVxuICAgICAgICBpZih0aHJvdHRsZSl7XG4gICAgICAgICAgbGV0IG5ld0tleURvd24gPSBmYWxzZVxuICAgICAgICAgIGlmKGV2ZW50LnR5cGUgPT09IFwia2V5ZG93blwiKXtcbiAgICAgICAgICAgIGxldCBwcmV2S2V5ID0gdGhpcy5wcml2YXRlKGVsLCBERUJPVU5DRV9QUkVWX0tFWSlcbiAgICAgICAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgREVCT1VOQ0VfUFJFVl9LRVksIGV2ZW50LmtleSlcbiAgICAgICAgICAgIG5ld0tleURvd24gPSBwcmV2S2V5ICE9PSBldmVudC5rZXlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZighbmV3S2V5RG93biAmJiB0aGlzLnByaXZhdGUoZWwsIFRIUk9UVExFRCkpe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgVEhST1RUTEVELCB0cnVlKVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiksIHRpbWVvdXQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIsIGN1cnJlbnRDeWNsZSksIHRpbWVvdXQpXG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBmb3JtID0gZWwuZm9ybVxuICAgICAgICBpZihmb3JtICYmIHRoaXMub25jZShmb3JtLCBcImJpbmQtZGVib3VuY2VcIikpe1xuICAgICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCAoKSA9PiB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKChuZXcgRm9ybURhdGEoZm9ybSkpLmVudHJpZXMoKSwgKFtuYW1lXSkgPT4ge1xuICAgICAgICAgICAgICBsZXQgaW5wdXQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoYFtuYW1lPVwiJHtuYW1lfVwiXWApXG4gICAgICAgICAgICAgIHRoaXMuaW5jQ3ljbGUoaW5wdXQsIERFQk9VTkNFX1RSSUdHRVIpXG4gICAgICAgICAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgVEhST1RUTEVEKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMub25jZShlbCwgXCJiaW5kLWRlYm91bmNlXCIpKXtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUikpXG4gICAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJpZ2dlckN5Y2xlKGVsLCBrZXksIGN1cnJlbnRDeWNsZSl7XG4gICAgbGV0IFtjeWNsZSwgdHJpZ2dlcl0gPSB0aGlzLnByaXZhdGUoZWwsIGtleSlcbiAgICBpZighY3VycmVudEN5Y2xlKXsgY3VycmVudEN5Y2xlID0gY3ljbGUgfVxuICAgIGlmKGN1cnJlbnRDeWNsZSA9PT0gY3ljbGUpe1xuICAgICAgdGhpcy5pbmNDeWNsZShlbCwga2V5KVxuICAgICAgdHJpZ2dlcigpXG4gICAgfVxuICB9LFxuXG4gIG9uY2UoZWwsIGtleSl7XG4gICAgaWYodGhpcy5wcml2YXRlKGVsLCBrZXkpID09PSB0cnVlKXsgcmV0dXJuIGZhbHNlIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgdHJ1ZSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9LFxuXG4gIGluY0N5Y2xlKGVsLCBrZXksIHRyaWdnZXIgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgbGV0IFtjdXJyZW50Q3ljbGVdID0gdGhpcy5wcml2YXRlKGVsLCBrZXkpIHx8IFswLCB0cmlnZ2VyXVxuICAgIGN1cnJlbnRDeWNsZSsrXG4gICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIFtjdXJyZW50Q3ljbGUsIHRyaWdnZXJdKVxuICAgIHJldHVybiBjdXJyZW50Q3ljbGVcbiAgfSxcblxuICBkaXNjYXJkRXJyb3IoY29udGFpbmVyLCBlbCwgcGh4RmVlZGJhY2tGb3Ipe1xuICAgIGxldCBmaWVsZCA9IGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUocGh4RmVlZGJhY2tGb3IpXG4gICAgLy8gVE9ETzogUmVtb3ZlIGlkIGxvb2t1cCBhZnRlciB3ZSB1cGRhdGUgUGhvZW5peCB0byB1c2UgaW5wdXRfbmFtZSBpbnN0ZWFkIG9mIGlucHV0X2lkXG4gICAgbGV0IGlucHV0ID0gZmllbGQgJiYgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYFtpZD1cIiR7ZmllbGR9XCJdLCBbbmFtZT1cIiR7ZmllbGR9XCJdYClcbiAgICBpZighaW5wdXQpeyByZXR1cm4gfVxuXG4gICAgaWYoISh0aGlzLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCkgfHwgdGhpcy5wcml2YXRlKGlucHV0LmZvcm0sIFBIWF9IQVNfU1VCTUlUVEVEKSkpe1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZChQSFhfTk9fRkVFREJBQ0tfQ0xBU1MpXG4gICAgfVxuICB9LFxuXG4gIHNob3dFcnJvcihpbnB1dEVsLCBwaHhGZWVkYmFja0Zvcil7XG4gICAgaWYoaW5wdXRFbC5pZCB8fCBpbnB1dEVsLm5hbWUpe1xuICAgICAgdGhpcy5hbGwoaW5wdXRFbC5mb3JtLCBgWyR7cGh4RmVlZGJhY2tGb3J9PVwiJHtpbnB1dEVsLmlkfVwiXSwgWyR7cGh4RmVlZGJhY2tGb3J9PVwiJHtpbnB1dEVsLm5hbWV9XCJdYCwgKGVsKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoZWwsIFBIWF9OT19GRUVEQkFDS19DTEFTUylcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuXG4gIGlzUGh4Q2hpbGQobm9kZSl7XG4gICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9QQVJFTlRfSUQpXG4gIH0sXG5cbiAgZGlzcGF0Y2hFdmVudCh0YXJnZXQsIGV2ZW50U3RyaW5nLCBkZXRhaWwgPSB7fSl7XG4gICAgbGV0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50U3RyaW5nLCB7YnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgZGV0YWlsOiBkZXRhaWx9KVxuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICB9LFxuXG4gIGNsb25lTm9kZShub2RlLCBodG1sKXtcbiAgICBpZih0eXBlb2YgKGh0bWwpID09PSBcInVuZGVmaW5lZFwiKXtcbiAgICAgIHJldHVybiBub2RlLmNsb25lTm9kZSh0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2xvbmVkID0gbm9kZS5jbG9uZU5vZGUoZmFsc2UpXG4gICAgICBjbG9uZWQuaW5uZXJIVE1MID0gaHRtbFxuICAgICAgcmV0dXJuIGNsb25lZFxuICAgIH1cbiAgfSxcblxuICBtZXJnZUF0dHJzKHRhcmdldCwgc291cmNlLCBvcHRzID0ge30pe1xuICAgIGxldCBleGNsdWRlID0gb3B0cy5leGNsdWRlIHx8IFtdXG4gICAgbGV0IGlzSWdub3JlZCA9IG9wdHMuaXNJZ25vcmVkXG4gICAgbGV0IHNvdXJjZUF0dHJzID0gc291cmNlLmF0dHJpYnV0ZXNcbiAgICBmb3IobGV0IGkgPSBzb3VyY2VBdHRycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG4gICAgICBsZXQgbmFtZSA9IHNvdXJjZUF0dHJzW2ldLm5hbWVcbiAgICAgIGlmKGV4Y2x1ZGUuaW5kZXhPZihuYW1lKSA8IDApeyB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSkpIH1cbiAgICB9XG5cbiAgICBsZXQgdGFyZ2V0QXR0cnMgPSB0YXJnZXQuYXR0cmlidXRlc1xuICAgIGZvcihsZXQgaSA9IHRhcmdldEF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcbiAgICAgIGxldCBuYW1lID0gdGFyZ2V0QXR0cnNbaV0ubmFtZVxuICAgICAgaWYoaXNJZ25vcmVkKXtcbiAgICAgICAgaWYobmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikgJiYgIXNvdXJjZS5oYXNBdHRyaWJ1dGUobmFtZSkpeyB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmKCFzb3VyY2UuaGFzQXR0cmlidXRlKG5hbWUpKXsgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShuYW1lKSB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1lcmdlRm9jdXNlZElucHV0KHRhcmdldCwgc291cmNlKXtcbiAgICAvLyBza2lwIHNlbGVjdHMgYmVjYXVzZSBGRiB3aWxsIHJlc2V0IGhpZ2hsaWdodGVkIGluZGV4IGZvciBhbnkgc2V0QXR0cmlidXRlXG4gICAgaWYoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkpeyBET00ubWVyZ2VBdHRycyh0YXJnZXQsIHNvdXJjZSwge2V4Y2VwdDogW1widmFsdWVcIl19KSB9XG4gICAgaWYoc291cmNlLnJlYWRPbmx5KXtcbiAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJyZWFkb25seVwiLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwicmVhZG9ubHlcIilcbiAgICB9XG4gIH0sXG5cbiAgaGFzU2VsZWN0aW9uUmFuZ2UoZWwpe1xuICAgIHJldHVybiBlbC5zZXRTZWxlY3Rpb25SYW5nZSAmJiAoZWwudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgZWwudHlwZSA9PT0gXCJ0ZXh0YXJlYVwiKVxuICB9LFxuXG4gIHJlc3RvcmVGb2N1cyhmb2N1c2VkLCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKXtcbiAgICBpZighRE9NLmlzVGV4dHVhbElucHV0KGZvY3VzZWQpKXsgcmV0dXJuIH1cbiAgICBsZXQgd2FzRm9jdXNlZCA9IGZvY3VzZWQubWF0Y2hlcyhcIjpmb2N1c1wiKVxuICAgIGlmKGZvY3VzZWQucmVhZE9ubHkpeyBmb2N1c2VkLmJsdXIoKSB9XG4gICAgaWYoIXdhc0ZvY3VzZWQpeyBmb2N1c2VkLmZvY3VzKCkgfVxuICAgIGlmKHRoaXMuaGFzU2VsZWN0aW9uUmFuZ2UoZm9jdXNlZCkpe1xuICAgICAgZm9jdXNlZC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKVxuICAgIH1cbiAgfSxcblxuICBpc0Zvcm1JbnB1dChlbCl7IHJldHVybiAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdChlbC50YWdOYW1lKSAmJiBlbC50eXBlICE9PSBcImJ1dHRvblwiIH0sXG5cbiAgc3luY0F0dHJzVG9Qcm9wcyhlbCl7XG4gICAgaWYoZWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIENIRUNLQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkpID49IDApe1xuICAgICAgZWwuY2hlY2tlZCA9IGVsLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIikgIT09IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgc3luY1Byb3BzVG9BdHRycyhlbCl7XG4gICAgaWYoZWwgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCl7XG4gICAgICBsZXQgc2VsZWN0ZWRJdGVtID0gZWwub3B0aW9ucy5pdGVtKGVsLnNlbGVjdGVkSW5kZXgpXG4gICAgICBpZihzZWxlY3RlZEl0ZW0gJiYgc2VsZWN0ZWRJdGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpID09PSBudWxsKXtcbiAgICAgICAgc2VsZWN0ZWRJdGVtLnNldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIsIFwiXCIpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGlzVGV4dHVhbElucHV0KGVsKXsgcmV0dXJuIEZPQ1VTQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlKSA+PSAwIH0sXG5cbiAgaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGVsLCBwaHhUcmlnZ2VyRXh0ZXJuYWwpe1xuICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUgJiYgZWwuZ2V0QXR0cmlidXRlKHBoeFRyaWdnZXJFeHRlcm5hbCkgIT09IG51bGxcbiAgfSxcblxuICBzeW5jUGVuZGluZ1JlZihmcm9tRWwsIHRvRWwsIGRpc2FibGVXaXRoKXtcbiAgICBsZXQgcmVmID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfUkVGKVxuICAgIGlmKHJlZiA9PT0gbnVsbCl7IHJldHVybiB0cnVlIH1cblxuICAgIGlmKERPTS5pc0Zvcm1JbnB1dChmcm9tRWwpIHx8IGZyb21FbC5nZXRBdHRyaWJ1dGUoZGlzYWJsZVdpdGgpICE9PSBudWxsKXtcbiAgICAgIGlmKERPTS5pc1VwbG9hZElucHV0KGZyb21FbCkpeyBET00ubWVyZ2VBdHRycyhmcm9tRWwsIHRvRWwsIHtpc0lnbm9yZWQ6IHRydWV9KSB9XG4gICAgICBET00ucHV0UHJpdmF0ZShmcm9tRWwsIFBIWF9SRUYsIHRvRWwpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgUEhYX0VWRU5UX0NMQVNTRVMuZm9yRWFjaChjbGFzc05hbWUgPT4ge1xuICAgICAgICBmcm9tRWwuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkgJiYgdG9FbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSlcbiAgICAgIH0pXG4gICAgICB0b0VsLnNldEF0dHJpYnV0ZShQSFhfUkVGLCByZWYpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjbGVhbkNoaWxkTm9kZXMoY29udGFpbmVyLCBwaHhVcGRhdGUpe1xuICAgIGlmKERPTS5pc1BoeFVwZGF0ZShjb250YWluZXIsIHBoeFVwZGF0ZSwgW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiXSkpe1xuICAgICAgbGV0IHRvUmVtb3ZlID0gW11cbiAgICAgIGNvbnRhaW5lci5jaGlsZE5vZGVzLmZvckVhY2goY2hpbGROb2RlID0+IHtcbiAgICAgICAgaWYoIWNoaWxkTm9kZS5pZCl7XG4gICAgICAgICAgLy8gU2tpcCB3YXJuaW5nIGlmIGl0J3MgYW4gZW1wdHkgdGV4dCBub2RlIChlLmcuIGEgbmV3LWxpbmUpXG4gICAgICAgICAgbGV0IGlzRW1wdHlUZXh0Tm9kZSA9IGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGROb2RlLm5vZGVWYWx1ZS50cmltKCkgPT09IFwiXCJcbiAgICAgICAgICBpZighaXNFbXB0eVRleHROb2RlKXtcbiAgICAgICAgICAgIGxvZ0Vycm9yKFwib25seSBIVE1MIGVsZW1lbnQgdGFncyB3aXRoIGFuIGlkIGFyZSBhbGxvd2VkIGluc2lkZSBjb250YWluZXJzIHdpdGggcGh4LXVwZGF0ZS5cXG5cXG5cIiArXG4gICAgICAgICAgICAgIGByZW1vdmluZyBpbGxlZ2FsIG5vZGU6IFwiJHsoY2hpbGROb2RlLm91dGVySFRNTCB8fCBjaGlsZE5vZGUubm9kZVZhbHVlKS50cmltKCl9XCJcXG5cXG5gKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKGNoaWxkTm9kZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHRvUmVtb3ZlLmZvckVhY2goY2hpbGROb2RlID0+IGNoaWxkTm9kZS5yZW1vdmUoKSlcbiAgICB9XG4gIH0sXG5cbiAgcmVwbGFjZVJvb3RDb250YWluZXIoY29udGFpbmVyLCB0YWdOYW1lLCBhdHRycyl7XG4gICAgbGV0IHJldGFpbmVkQXR0cnMgPSBuZXcgU2V0KFtcImlkXCIsIFBIWF9TRVNTSU9OLCBQSFhfU1RBVElDLCBQSFhfTUFJTl0pXG4gICAgaWYoY29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpKXtcbiAgICAgIEFycmF5LmZyb20oY29udGFpbmVyLmF0dHJpYnV0ZXMpXG4gICAgICAgIC5maWx0ZXIoYXR0ciA9PiAhcmV0YWluZWRBdHRycy5oYXMoYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaChhdHRyID0+IGNvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKSlcblxuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpXG4gICAgICAgIC5maWx0ZXIobmFtZSA9PiAhcmV0YWluZWRBdHRycy5oYXMobmFtZS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgLmZvckVhY2goYXR0ciA9PiBjb250YWluZXIuc2V0QXR0cmlidXRlKGF0dHIsIGF0dHJzW2F0dHJdKSlcblxuICAgICAgcmV0dXJuIGNvbnRhaW5lclxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpXG4gICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChhdHRyID0+IG5ld0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pKVxuICAgICAgcmV0YWluZWRBdHRycy5mb3JFYWNoKGF0dHIgPT4gbmV3Q29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBjb250YWluZXIuZ2V0QXR0cmlidXRlKGF0dHIpKSlcbiAgICAgIG5ld0NvbnRhaW5lci5pbm5lckhUTUwgPSBjb250YWluZXIuaW5uZXJIVE1MXG4gICAgICBjb250YWluZXIucmVwbGFjZVdpdGgobmV3Q29udGFpbmVyKVxuICAgICAgcmV0dXJuIG5ld0NvbnRhaW5lclxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBET01cbiIsICJpbXBvcnQge1xuICBQSFhfQUNUSVZFX0VOVFJZX1JFRlMsXG4gIFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCxcbiAgUEhYX1BSRUZMSUdIVEVEX1JFRlNcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgY2hhbm5lbFVwbG9hZGVyLFxuICBsb2dFcnJvclxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwbG9hZEVudHJ5IHtcbiAgc3RhdGljIGlzQWN0aXZlKGZpbGVFbCwgZmlsZSl7XG4gICAgbGV0IGlzTmV3ID0gZmlsZS5fcGh4UmVmID09PSB1bmRlZmluZWRcbiAgICBsZXQgYWN0aXZlUmVmcyA9IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX0FDVElWRV9FTlRSWV9SRUZTKS5zcGxpdChcIixcIilcbiAgICBsZXQgaXNBY3RpdmUgPSBhY3RpdmVSZWZzLmluZGV4T2YoTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSkpID49IDBcbiAgICByZXR1cm4gZmlsZS5zaXplID4gMCAmJiAoaXNOZXcgfHwgaXNBY3RpdmUpXG4gIH1cblxuICBzdGF0aWMgaXNQcmVmbGlnaHRlZChmaWxlRWwsIGZpbGUpe1xuICAgIGxldCBwcmVmbGlnaHRlZFJlZnMgPSBmaWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKS5zcGxpdChcIixcIilcbiAgICBsZXQgaXNQcmVmbGlnaHRlZCA9IHByZWZsaWdodGVkUmVmcy5pbmRleE9mKExpdmVVcGxvYWRlci5nZW5GaWxlUmVmKGZpbGUpKSA+PSAwXG4gICAgcmV0dXJuIGlzUHJlZmxpZ2h0ZWQgJiYgdGhpcy5pc0FjdGl2ZShmaWxlRWwsIGZpbGUpXG4gIH1cblxuICBjb25zdHJ1Y3RvcihmaWxlRWwsIGZpbGUsIHZpZXcpe1xuICAgIHRoaXMucmVmID0gTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSlcbiAgICB0aGlzLmZpbGVFbCA9IGZpbGVFbFxuICAgIHRoaXMuZmlsZSA9IGZpbGVcbiAgICB0aGlzLnZpZXcgPSB2aWV3XG4gICAgdGhpcy5tZXRhID0gbnVsbFxuICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2VcbiAgICB0aGlzLl9pc0RvbmUgPSBmYWxzZVxuICAgIHRoaXMuX3Byb2dyZXNzID0gMFxuICAgIHRoaXMuX2xhc3RQcm9ncmVzc1NlbnQgPSAtMVxuICAgIHRoaXMuX29uRG9uZSA9IGZ1bmN0aW9uICgpeyB9XG4gICAgdGhpcy5fb25FbFVwZGF0ZWQgPSB0aGlzLm9uRWxVcGRhdGVkLmJpbmQodGhpcylcbiAgICB0aGlzLmZpbGVFbC5hZGRFdmVudExpc3RlbmVyKFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCwgdGhpcy5fb25FbFVwZGF0ZWQpXG4gIH1cblxuICBtZXRhZGF0YSgpeyByZXR1cm4gdGhpcy5tZXRhIH1cblxuICBwcm9ncmVzcyhwcm9ncmVzcyl7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSBNYXRoLmZsb29yKHByb2dyZXNzKVxuICAgIGlmKHRoaXMuX3Byb2dyZXNzID4gdGhpcy5fbGFzdFByb2dyZXNzU2VudCl7XG4gICAgICBpZih0aGlzLl9wcm9ncmVzcyA+PSAxMDApe1xuICAgICAgICB0aGlzLl9wcm9ncmVzcyA9IDEwMFxuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gMTAwXG4gICAgICAgIHRoaXMuX2lzRG9uZSA9IHRydWVcbiAgICAgICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCAxMDAsICgpID0+IHtcbiAgICAgICAgICBMaXZlVXBsb2FkZXIudW50cmFja0ZpbGUodGhpcy5maWxlRWwsIHRoaXMuZmlsZSlcbiAgICAgICAgICB0aGlzLl9vbkRvbmUoKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzU2VudCA9IHRoaXMuX3Byb2dyZXNzXG4gICAgICAgIHRoaXMudmlldy5wdXNoRmlsZVByb2dyZXNzKHRoaXMuZmlsZUVsLCB0aGlzLnJlZiwgdGhpcy5fcHJvZ3Jlc3MpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FuY2VsKCl7XG4gICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlXG4gICAgdGhpcy5faXNEb25lID0gdHJ1ZVxuICAgIHRoaXMuX29uRG9uZSgpXG4gIH1cblxuICBpc0RvbmUoKXsgcmV0dXJuIHRoaXMuX2lzRG9uZSB9XG5cbiAgZXJyb3IocmVhc29uID0gXCJmYWlsZWRcIil7XG4gICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCB7ZXJyb3I6IHJlYXNvbn0pXG4gICAgTGl2ZVVwbG9hZGVyLmNsZWFyRmlsZXModGhpcy5maWxlRWwpXG4gIH1cblxuICAvL3ByaXZhdGVcblxuICBvbkRvbmUoY2FsbGJhY2spe1xuICAgIHRoaXMuX29uRG9uZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuZmlsZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoUEhYX0xJVkVfRklMRV9VUERBVEVELCB0aGlzLl9vbkVsVXBkYXRlZClcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9XG4gIH1cblxuICBvbkVsVXBkYXRlZCgpe1xuICAgIGxldCBhY3RpdmVSZWZzID0gdGhpcy5maWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUykuc3BsaXQoXCIsXCIpXG4gICAgaWYoYWN0aXZlUmVmcy5pbmRleE9mKHRoaXMucmVmKSA9PT0gLTEpeyB0aGlzLmNhbmNlbCgpIH1cbiAgfVxuXG4gIHRvUHJlZmxpZ2h0UGF5bG9hZCgpe1xuICAgIHJldHVybiB7XG4gICAgICBsYXN0X21vZGlmaWVkOiB0aGlzLmZpbGUubGFzdE1vZGlmaWVkLFxuICAgICAgbmFtZTogdGhpcy5maWxlLm5hbWUsXG4gICAgICBzaXplOiB0aGlzLmZpbGUuc2l6ZSxcbiAgICAgIHR5cGU6IHRoaXMuZmlsZS50eXBlLFxuICAgICAgcmVmOiB0aGlzLnJlZlxuICAgIH1cbiAgfVxuXG4gIHVwbG9hZGVyKHVwbG9hZGVycyl7XG4gICAgaWYodGhpcy5tZXRhLnVwbG9hZGVyKXtcbiAgICAgIGxldCBjYWxsYmFjayA9IHVwbG9hZGVyc1t0aGlzLm1ldGEudXBsb2FkZXJdIHx8IGxvZ0Vycm9yKGBubyB1cGxvYWRlciBjb25maWd1cmVkIGZvciAke3RoaXMubWV0YS51cGxvYWRlcn1gKVxuICAgICAgcmV0dXJuIHtuYW1lOiB0aGlzLm1ldGEudXBsb2FkZXIsIGNhbGxiYWNrOiBjYWxsYmFja31cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtuYW1lOiBcImNoYW5uZWxcIiwgY2FsbGJhY2s6IGNoYW5uZWxVcGxvYWRlcn1cbiAgICB9XG4gIH1cblxuICB6aXBQb3N0RmxpZ2h0KHJlc3Ape1xuICAgIHRoaXMubWV0YSA9IHJlc3AuZW50cmllc1t0aGlzLnJlZl1cbiAgICBpZighdGhpcy5tZXRhKXsgbG9nRXJyb3IoYG5vIHByZWZsaWdodCB1cGxvYWQgcmVzcG9uc2UgcmV0dXJuZWQgd2l0aCByZWYgJHt0aGlzLnJlZn1gLCB7aW5wdXQ6IHRoaXMuZmlsZUVsLCByZXNwb25zZTogcmVzcH0pIH1cbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIFBIWF9ET05FX1JFRlMsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxuICBQSFhfVVBMT0FEX1JFRlxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcbmltcG9ydCBVcGxvYWRFbnRyeSBmcm9tIFwiLi91cGxvYWRfZW50cnlcIlxuXG5sZXQgbGl2ZVVwbG9hZGVyRmlsZVJlZiA9IDBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVVwbG9hZGVyIHtcbiAgc3RhdGljIGdlbkZpbGVSZWYoZmlsZSl7XG4gICAgbGV0IHJlZiA9IGZpbGUuX3BoeFJlZlxuICAgIGlmKHJlZiAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIHJldHVybiByZWZcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZS5fcGh4UmVmID0gKGxpdmVVcGxvYWRlckZpbGVSZWYrKykudG9TdHJpbmcoKVxuICAgICAgcmV0dXJuIGZpbGUuX3BoeFJlZlxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRFbnRyeURhdGFVUkwoaW5wdXRFbCwgcmVmLCBjYWxsYmFjayl7XG4gICAgbGV0IGZpbGUgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoZmlsZSA9PiB0aGlzLmdlbkZpbGVSZWYoZmlsZSkgPT09IHJlZilcbiAgICBjYWxsYmFjayhVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpKVxuICB9XG5cbiAgc3RhdGljIGhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCl7XG4gICAgbGV0IGFjdGl2ZSA9IDBcbiAgICBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgaWYoaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSAhPT0gaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9ET05FX1JFRlMpKXtcbiAgICAgICAgYWN0aXZlKytcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBhY3RpdmUgPiAwXG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKXtcbiAgICBsZXQgZmlsZXMgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpXG4gICAgbGV0IGZpbGVEYXRhID0ge31cbiAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgbGV0IGVudHJ5ID0ge3BhdGg6IGlucHV0RWwubmFtZX1cbiAgICAgIGxldCB1cGxvYWRSZWYgPSBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRilcbiAgICAgIGZpbGVEYXRhW3VwbG9hZFJlZl0gPSBmaWxlRGF0YVt1cGxvYWRSZWZdIHx8IFtdXG4gICAgICBlbnRyeS5yZWYgPSB0aGlzLmdlbkZpbGVSZWYoZmlsZSlcbiAgICAgIGVudHJ5Lm5hbWUgPSBmaWxlLm5hbWUgfHwgZW50cnkucmVmXG4gICAgICBlbnRyeS50eXBlID0gZmlsZS50eXBlXG4gICAgICBlbnRyeS5zaXplID0gZmlsZS5zaXplXG4gICAgICBmaWxlRGF0YVt1cGxvYWRSZWZdLnB1c2goZW50cnkpXG4gICAgfSlcbiAgICByZXR1cm4gZmlsZURhdGFcbiAgfVxuXG4gIHN0YXRpYyBjbGVhckZpbGVzKGlucHV0RWwpe1xuICAgIGlucHV0RWwudmFsdWUgPSBudWxsXG4gICAgaW5wdXRFbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpXG4gICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSlcbiAgfVxuXG4gIHN0YXRpYyB1bnRyYWNrRmlsZShpbnB1dEVsLCBmaWxlKXtcbiAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIERPTS5wcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIikuZmlsdGVyKGYgPT4gIU9iamVjdC5pcyhmLCBmaWxlKSkpXG4gIH1cblxuICBzdGF0aWMgdHJhY2tGaWxlcyhpbnB1dEVsLCBmaWxlcyl7XG4gICAgaWYoaW5wdXRFbC5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSAhPT0gbnVsbCl7XG4gICAgICBsZXQgbmV3RmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhdGhpcy5hY3RpdmVGaWxlcyhpbnB1dEVsKS5maW5kKGYgPT4gT2JqZWN0LmlzKGYsIGZpbGUpKSlcbiAgICAgIERPTS5wdXRQcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIiwgdGhpcy5hY3RpdmVGaWxlcyhpbnB1dEVsKS5jb25jYXQobmV3RmlsZXMpKVxuICAgICAgaW5wdXRFbC52YWx1ZSA9IG51bGxcbiAgICB9IGVsc2Uge1xuICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBmaWxlcylcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYWN0aXZlRmlsZUlucHV0cyhmb3JtRWwpe1xuICAgIGxldCBmaWxlSW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHMoZm9ybUVsKVxuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dHMpLmZpbHRlcihlbCA9PiBlbC5maWxlcyAmJiB0aGlzLmFjdGl2ZUZpbGVzKGVsKS5sZW5ndGggPiAwKVxuICB9XG5cbiAgc3RhdGljIGFjdGl2ZUZpbGVzKGlucHV0KXtcbiAgICByZXR1cm4gKERPTS5wcml2YXRlKGlucHV0LCBcImZpbGVzXCIpIHx8IFtdKS5maWx0ZXIoZiA9PiBVcGxvYWRFbnRyeS5pc0FjdGl2ZShpbnB1dCwgZikpXG4gIH1cblxuICBzdGF0aWMgaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKXtcbiAgICBsZXQgZmlsZUlucHV0cyA9IERPTS5maW5kVXBsb2FkSW5wdXRzKGZvcm1FbClcbiAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlSW5wdXRzKS5maWx0ZXIoaW5wdXQgPT4gdGhpcy5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGlucHV0KS5sZW5ndGggPiAwKVxuICB9XG5cbiAgc3RhdGljIGZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXQpe1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0KS5maWx0ZXIoZiA9PiAhVXBsb2FkRW50cnkuaXNQcmVmbGlnaHRlZChpbnB1dCwgZikpXG4gIH1cblxuICBjb25zdHJ1Y3RvcihpbnB1dEVsLCB2aWV3LCBvbkNvbXBsZXRlKXtcbiAgICB0aGlzLnZpZXcgPSB2aWV3XG4gICAgdGhpcy5vbkNvbXBsZXRlID0gb25Db21wbGV0ZVxuICAgIHRoaXMuX2VudHJpZXMgPVxuICAgICAgQXJyYXkuZnJvbShMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKSB8fCBbXSlcbiAgICAgICAgLm1hcChmaWxlID0+IG5ldyBVcGxvYWRFbnRyeShpbnB1dEVsLCBmaWxlLCB2aWV3KSlcblxuICAgIHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPSB0aGlzLl9lbnRyaWVzLmxlbmd0aFxuICB9XG5cbiAgZW50cmllcygpeyByZXR1cm4gdGhpcy5fZW50cmllcyB9XG5cbiAgaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgbGl2ZVNvY2tldCl7XG4gICAgdGhpcy5fZW50cmllcyA9XG4gICAgICB0aGlzLl9lbnRyaWVzLm1hcChlbnRyeSA9PiB7XG4gICAgICAgIGVudHJ5LnppcFBvc3RGbGlnaHQocmVzcClcbiAgICAgICAgZW50cnkub25Eb25lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm51bUVudHJpZXNJblByb2dyZXNzLS1cbiAgICAgICAgICBpZih0aGlzLm51bUVudHJpZXNJblByb2dyZXNzID09PSAwKXsgdGhpcy5vbkNvbXBsZXRlKCkgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZW50cnlcbiAgICAgIH0pXG5cbiAgICBsZXQgZ3JvdXBlZEVudHJpZXMgPSB0aGlzLl9lbnRyaWVzLnJlZHVjZSgoYWNjLCBlbnRyeSkgPT4ge1xuICAgICAgbGV0IHtuYW1lLCBjYWxsYmFja30gPSBlbnRyeS51cGxvYWRlcihsaXZlU29ja2V0LnVwbG9hZGVycylcbiAgICAgIGFjY1tuYW1lXSA9IGFjY1tuYW1lXSB8fCB7Y2FsbGJhY2s6IGNhbGxiYWNrLCBlbnRyaWVzOiBbXX1cbiAgICAgIGFjY1tuYW1lXS5lbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwge30pXG5cbiAgICBmb3IobGV0IG5hbWUgaW4gZ3JvdXBlZEVudHJpZXMpe1xuICAgICAgbGV0IHtjYWxsYmFjaywgZW50cmllc30gPSBncm91cGVkRW50cmllc1tuYW1lXVxuICAgICAgY2FsbGJhY2soZW50cmllcywgb25FcnJvciwgcmVzcCwgbGl2ZVNvY2tldClcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBQSFhfQUNUSVZFX0VOVFJZX1JFRlMsXG4gIFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCxcbiAgUEhYX1BSRUZMSUdIVEVEX1JFRlMsXG4gIFBIWF9VUExPQURfUkVGXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiXG5cbmxldCBIb29rcyA9IHtcbiAgTGl2ZUZpbGVVcGxvYWQ6IHtcbiAgICBhY3RpdmVSZWZzKCl7IHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfQUNUSVZFX0VOVFJZX1JFRlMpIH0sXG5cbiAgICBwcmVmbGlnaHRlZFJlZnMoKXsgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSB9LFxuXG4gICAgbW91bnRlZCgpeyB0aGlzLnByZWZsaWdodGVkV2FzID0gdGhpcy5wcmVmbGlnaHRlZFJlZnMoKSB9LFxuXG4gICAgdXBkYXRlZCgpe1xuICAgICAgbGV0IG5ld1ByZWZsaWdodHMgPSB0aGlzLnByZWZsaWdodGVkUmVmcygpXG4gICAgICBpZih0aGlzLnByZWZsaWdodGVkV2FzICE9PSBuZXdQcmVmbGlnaHRzKXtcbiAgICAgICAgdGhpcy5wcmVmbGlnaHRlZFdhcyA9IG5ld1ByZWZsaWdodHNcbiAgICAgICAgaWYobmV3UHJlZmxpZ2h0cyA9PT0gXCJcIil7XG4gICAgICAgICAgdGhpcy5fX3ZpZXcuY2FuY2VsU3VibWl0KHRoaXMuZWwuZm9ybSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZih0aGlzLmFjdGl2ZVJlZnMoKSA9PT0gXCJcIil7IHRoaXMuZWwudmFsdWUgPSBudWxsIH1cbiAgICAgIHRoaXMuZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoUEhYX0xJVkVfRklMRV9VUERBVEVEKSlcbiAgICB9XG4gIH0sXG5cbiAgTGl2ZUltZ1ByZXZpZXc6IHtcbiAgICBtb3VudGVkKCl7XG4gICAgICB0aGlzLnJlZiA9IHRoaXMuZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtZW50cnktcmVmXCIpXG4gICAgICB0aGlzLmlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRikpXG4gICAgICBMaXZlVXBsb2FkZXIuZ2V0RW50cnlEYXRhVVJMKHRoaXMuaW5wdXRFbCwgdGhpcy5yZWYsIHVybCA9PiB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsXG4gICAgICAgIHRoaXMuZWwuc3JjID0gdXJsXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGVzdHJveWVkKCl7XG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMudXJsKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIb29rc1xuIiwgImltcG9ydCB7XG4gIG1heWJlXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01Qb3N0TW9ycGhSZXN0b3JlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lckJlZm9yZSwgY29udGFpbmVyQWZ0ZXIsIHVwZGF0ZVR5cGUpe1xuICAgIGxldCBpZHNCZWZvcmUgPSBuZXcgU2V0KClcbiAgICBsZXQgaWRzQWZ0ZXIgPSBuZXcgU2V0KFsuLi5jb250YWluZXJBZnRlci5jaGlsZHJlbl0ubWFwKGNoaWxkID0+IGNoaWxkLmlkKSlcblxuICAgIGxldCBlbGVtZW50c1RvTW9kaWZ5ID0gW11cblxuICAgIEFycmF5LmZyb20oY29udGFpbmVyQmVmb3JlLmNoaWxkcmVuKS5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmKGNoaWxkLmlkKXsgLy8gYWxsIG9mIG91ciBjaGlsZHJlbiBzaG91bGQgYmUgZWxlbWVudHMgd2l0aCBpZHNcbiAgICAgICAgaWRzQmVmb3JlLmFkZChjaGlsZC5pZClcbiAgICAgICAgaWYoaWRzQWZ0ZXIuaGFzKGNoaWxkLmlkKSl7XG4gICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudElkID0gY2hpbGQucHJldmlvdXNFbGVtZW50U2libGluZyAmJiBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlkXG4gICAgICAgICAgZWxlbWVudHNUb01vZGlmeS5wdXNoKHtlbGVtZW50SWQ6IGNoaWxkLmlkLCBwcmV2aW91c0VsZW1lbnRJZDogcHJldmlvdXNFbGVtZW50SWR9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuY29udGFpbmVySWQgPSBjb250YWluZXJBZnRlci5pZFxuICAgIHRoaXMudXBkYXRlVHlwZSA9IHVwZGF0ZVR5cGVcbiAgICB0aGlzLmVsZW1lbnRzVG9Nb2RpZnkgPSBlbGVtZW50c1RvTW9kaWZ5XG4gICAgdGhpcy5lbGVtZW50SWRzVG9BZGQgPSBbLi4uaWRzQWZ0ZXJdLmZpbHRlcihpZCA9PiAhaWRzQmVmb3JlLmhhcyhpZCkpXG4gIH1cblxuICAvLyBXZSBkbyB0aGUgZm9sbG93aW5nIHRvIG9wdGltaXplIGFwcGVuZC9wcmVwZW5kIG9wZXJhdGlvbnM6XG4gIC8vICAgMSkgVHJhY2sgaWRzIG9mIG1vZGlmaWVkIGVsZW1lbnRzICYgb2YgbmV3IGVsZW1lbnRzXG4gIC8vICAgMikgQWxsIHRoZSBtb2RpZmllZCBlbGVtZW50cyBhcmUgcHV0IGJhY2sgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIERPTSB0cmVlXG4gIC8vICAgICAgYnkgc3RvcmluZyB0aGUgaWQgb2YgdGhlaXIgcHJldmlvdXMgc2libGluZ1xuICAvLyAgIDMpIE5ldyBlbGVtZW50cyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSBieSBtb3JwaGRvbSBkdXJpbmcgYXBwZW5kLlxuICAvLyAgICAgIEZvciBwcmVwZW5kLCB3ZSBtb3ZlIHRoZW0gdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBjb250YWluZXJcbiAgcGVyZm9ybSgpe1xuICAgIGxldCBjb250YWluZXIgPSBET00uYnlJZCh0aGlzLmNvbnRhaW5lcklkKVxuICAgIHRoaXMuZWxlbWVudHNUb01vZGlmeS5mb3JFYWNoKGVsZW1lbnRUb01vZGlmeSA9PiB7XG4gICAgICBpZihlbGVtZW50VG9Nb2RpZnkucHJldmlvdXNFbGVtZW50SWQpe1xuICAgICAgICBtYXliZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50VG9Nb2RpZnkucHJldmlvdXNFbGVtZW50SWQpLCBwcmV2aW91c0VsZW0gPT4ge1xuICAgICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCBlbGVtID0+IHtcbiAgICAgICAgICAgIGxldCBpc0luUmlnaHRQbGFjZSA9IGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZyAmJiBlbGVtLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWQgPT0gcHJldmlvdXNFbGVtLmlkXG4gICAgICAgICAgICBpZighaXNJblJpZ2h0UGxhY2Upe1xuICAgICAgICAgICAgICBwcmV2aW91c0VsZW0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJlbmRcIiwgZWxlbSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCBlbGVtID0+IHtcbiAgICAgICAgICBsZXQgaXNJblJpZ2h0UGxhY2UgPSBlbGVtLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgPT0gbnVsbFxuICAgICAgICAgIGlmKCFpc0luUmlnaHRQbGFjZSl7XG4gICAgICAgICAgICBjb250YWluZXIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBlbGVtKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYodGhpcy51cGRhdGVUeXBlID09IFwicHJlcGVuZFwiKXtcbiAgICAgIHRoaXMuZWxlbWVudElkc1RvQWRkLnJldmVyc2UoKS5mb3JFYWNoKGVsZW1JZCA9PiB7XG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1JZCksIGVsZW0gPT4gY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSkpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIiwgInZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFID0gMTE7XG5cbmZ1bmN0aW9uIG1vcnBoQXR0cnMoZnJvbU5vZGUsIHRvTm9kZSkge1xuICAgIHZhciB0b05vZGVBdHRycyA9IHRvTm9kZS5hdHRyaWJ1dGVzO1xuICAgIHZhciBhdHRyO1xuICAgIHZhciBhdHRyTmFtZTtcbiAgICB2YXIgYXR0ck5hbWVzcGFjZVVSSTtcbiAgICB2YXIgYXR0clZhbHVlO1xuICAgIHZhciBmcm9tVmFsdWU7XG5cbiAgICAvLyBkb2N1bWVudC1mcmFnbWVudHMgZG9udCBoYXZlIGF0dHJpYnV0ZXMgc28gbGV0cyBub3QgZG8gYW55dGhpbmdcbiAgICBpZiAodG9Ob2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IGZyb21Ob2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGF0dHJpYnV0ZXMgb24gb3JpZ2luYWwgRE9NIGVsZW1lbnRcbiAgICBmb3IgKHZhciBpID0gdG9Ob2RlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgYXR0ciA9IHRvTm9kZUF0dHJzW2ldO1xuICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTtcbiAgICAgICAgYXR0ck5hbWVzcGFjZVVSSSA9IGF0dHIubmFtZXNwYWNlVVJJO1xuICAgICAgICBhdHRyVmFsdWUgPSBhdHRyLnZhbHVlO1xuXG4gICAgICAgIGlmIChhdHRyTmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubG9jYWxOYW1lIHx8IGF0dHJOYW1lO1xuICAgICAgICAgICAgZnJvbVZhbHVlID0gZnJvbU5vZGUuZ2V0QXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoZnJvbVZhbHVlICE9PSBhdHRyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0ci5wcmVmaXggPT09ICd4bWxucycpe1xuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTsgLy8gSXQncyBub3QgYWxsb3dlZCB0byBzZXQgYW4gYXR0cmlidXRlIHdpdGggdGhlIFhNTE5TIG5hbWVzcGFjZSB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGB4bWxuc2AgcHJlZml4XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnNldEF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJvbVZhbHVlID0gZnJvbU5vZGUuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGZyb21WYWx1ZSAhPT0gYXR0clZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSBleHRyYSBhdHRyaWJ1dGVzIGZvdW5kIG9uIHRoZSBvcmlnaW5hbCBET00gZWxlbWVudCB0aGF0XG4gICAgLy8gd2VyZW4ndCBmb3VuZCBvbiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gICAgdmFyIGZyb21Ob2RlQXR0cnMgPSBmcm9tTm9kZS5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgZCA9IGZyb21Ob2RlQXR0cnMubGVuZ3RoIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgYXR0ciA9IGZyb21Ob2RlQXR0cnNbZF07XG4gICAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lO1xuICAgICAgICBhdHRyTmFtZXNwYWNlVVJJID0gYXR0ci5uYW1lc3BhY2VVUkk7XG5cbiAgICAgICAgaWYgKGF0dHJOYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5sb2NhbE5hbWUgfHwgYXR0ck5hbWU7XG5cbiAgICAgICAgICAgIGlmICghdG9Ob2RlLmhhc0F0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdG9Ob2RlLmhhc0F0dHJpYnV0ZShhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG52YXIgcmFuZ2U7IC8vIENyZWF0ZSBhIHJhbmdlIG9iamVjdCBmb3IgZWZmaWNlbnRseSByZW5kZXJpbmcgc3RyaW5ncyB0byBlbGVtZW50cy5cbnZhciBOU19YSFRNTCA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcblxudmFyIGRvYyA9IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBkb2N1bWVudDtcbnZhciBIQVNfVEVNUExBVEVfU1VQUE9SVCA9ICEhZG9jICYmICdjb250ZW50JyBpbiBkb2MuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbnZhciBIQVNfUkFOR0VfU1VQUE9SVCA9ICEhZG9jICYmIGRvYy5jcmVhdGVSYW5nZSAmJiAnY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50JyBpbiBkb2MuY3JlYXRlUmFuZ2UoKTtcblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRGcm9tVGVtcGxhdGUoc3RyKSB7XG4gICAgdmFyIHRlbXBsYXRlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc3RyO1xuICAgIHJldHVybiB0ZW1wbGF0ZS5jb250ZW50LmNoaWxkTm9kZXNbMF07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVJhbmdlKHN0cikge1xuICAgIGlmICghcmFuZ2UpIHtcbiAgICAgICAgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZShkb2MuYm9keSk7XG4gICAgfVxuXG4gICAgdmFyIGZyYWdtZW50ID0gcmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHN0cik7XG4gICAgcmV0dXJuIGZyYWdtZW50LmNoaWxkTm9kZXNbMF07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVdyYXAoc3RyKSB7XG4gICAgdmFyIGZyYWdtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2JvZHknKTtcbiAgICBmcmFnbWVudC5pbm5lckhUTUwgPSBzdHI7XG4gICAgcmV0dXJuIGZyYWdtZW50LmNoaWxkTm9kZXNbMF07XG59XG5cbi8qKlxuICogVGhpcyBpcyBhYm91dCB0aGUgc2FtZVxuICogdmFyIGh0bWwgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHN0ciwgJ3RleHQvaHRtbCcpO1xuICogcmV0dXJuIGh0bWwuYm9keS5maXJzdENoaWxkO1xuICpcbiAqIEBtZXRob2QgdG9FbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKi9cbmZ1bmN0aW9uIHRvRWxlbWVudChzdHIpIHtcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgIGlmIChIQVNfVEVNUExBVEVfU1VQUE9SVCkge1xuICAgICAgLy8gYXZvaWQgcmVzdHJpY3Rpb25zIG9uIGNvbnRlbnQgZm9yIHRoaW5ncyBsaWtlIGA8dHI+PHRoPkhpPC90aD48L3RyPmAgd2hpY2hcbiAgICAgIC8vIGNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCBkb2Vzbid0IHN1cHBvcnRcbiAgICAgIC8vIDx0ZW1wbGF0ZT4gc3VwcG9ydCBub3QgYXZhaWxhYmxlIGluIElFXG4gICAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tVGVtcGxhdGUoc3RyKTtcbiAgICB9IGVsc2UgaWYgKEhBU19SQU5HRV9TVVBQT1JUKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tUmFuZ2Uoc3RyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tV3JhcChzdHIpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0d28gbm9kZSdzIG5hbWVzIGFyZSB0aGUgc2FtZS5cbiAqXG4gKiBOT1RFOiBXZSBkb24ndCBib3RoZXIgY2hlY2tpbmcgYG5hbWVzcGFjZVVSSWAgYmVjYXVzZSB5b3Ugd2lsbCBuZXZlciBmaW5kIHR3byBIVE1MIGVsZW1lbnRzIHdpdGggdGhlIHNhbWVcbiAqICAgICAgIG5vZGVOYW1lIGFuZCBkaWZmZXJlbnQgbmFtZXNwYWNlIFVSSXMuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGIgVGhlIHRhcmdldCBlbGVtZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjb21wYXJlTm9kZU5hbWVzKGZyb21FbCwgdG9FbCkge1xuICAgIHZhciBmcm9tTm9kZU5hbWUgPSBmcm9tRWwubm9kZU5hbWU7XG4gICAgdmFyIHRvTm9kZU5hbWUgPSB0b0VsLm5vZGVOYW1lO1xuICAgIHZhciBmcm9tQ29kZVN0YXJ0LCB0b0NvZGVTdGFydDtcblxuICAgIGlmIChmcm9tTm9kZU5hbWUgPT09IHRvTm9kZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnJvbUNvZGVTdGFydCA9IGZyb21Ob2RlTmFtZS5jaGFyQ29kZUF0KDApO1xuICAgIHRvQ29kZVN0YXJ0ID0gdG9Ob2RlTmFtZS5jaGFyQ29kZUF0KDApO1xuXG4gICAgLy8gSWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIGEgdmlydHVhbCBET00gbm9kZSBvciBTVkcgbm9kZSB0aGVuIHdlIG1heVxuICAgIC8vIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB0YWcgbmFtZSBiZWZvcmUgY29tcGFyaW5nLiBOb3JtYWwgSFRNTCBlbGVtZW50cyB0aGF0IGFyZVxuICAgIC8vIGluIHRoZSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIlxuICAgIC8vIGFyZSBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZVxuICAgIGlmIChmcm9tQ29kZVN0YXJ0IDw9IDkwICYmIHRvQ29kZVN0YXJ0ID49IDk3KSB7IC8vIGZyb20gaXMgdXBwZXIgYW5kIHRvIGlzIGxvd2VyXG4gICAgICAgIHJldHVybiBmcm9tTm9kZU5hbWUgPT09IHRvTm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2UgaWYgKHRvQ29kZVN0YXJ0IDw9IDkwICYmIGZyb21Db2RlU3RhcnQgPj0gOTcpIHsgLy8gdG8gaXMgdXBwZXIgYW5kIGZyb20gaXMgbG93ZXJcbiAgICAgICAgcmV0dXJuIHRvTm9kZU5hbWUgPT09IGZyb21Ob2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGVsZW1lbnQsIG9wdGlvbmFsbHkgd2l0aCBhIGtub3duIG5hbWVzcGFjZSBVUkkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGVsZW1lbnQgbmFtZSwgZS5nLiAnZGl2JyBvciAnc3ZnJ1xuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lc3BhY2VVUkldIHRoZSBlbGVtZW50J3MgbmFtZXNwYWNlIFVSSSwgaS5lLiB0aGUgdmFsdWUgb2ZcbiAqIGl0cyBgeG1sbnNgIGF0dHJpYnV0ZSBvciBpdHMgaW5mZXJyZWQgbmFtZXNwYWNlLlxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnROUyhuYW1lLCBuYW1lc3BhY2VVUkkpIHtcbiAgICByZXR1cm4gIW5hbWVzcGFjZVVSSSB8fCBuYW1lc3BhY2VVUkkgPT09IE5TX1hIVE1MID9cbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnQobmFtZSkgOlxuICAgICAgICBkb2MuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgbmFtZSk7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSBjaGlsZHJlbiBvZiBvbmUgRE9NIGVsZW1lbnQgdG8gYW5vdGhlciBET00gZWxlbWVudFxuICovXG5mdW5jdGlvbiBtb3ZlQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKSB7XG4gICAgdmFyIGN1ckNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgIHZhciBuZXh0Q2hpbGQgPSBjdXJDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgdG9FbC5hcHBlbmRDaGlsZChjdXJDaGlsZCk7XG4gICAgICAgIGN1ckNoaWxkID0gbmV4dENoaWxkO1xuICAgIH1cbiAgICByZXR1cm4gdG9FbDtcbn1cblxuZnVuY3Rpb24gc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsIG5hbWUpIHtcbiAgICBpZiAoZnJvbUVsW25hbWVdICE9PSB0b0VsW25hbWVdKSB7XG4gICAgICAgIGZyb21FbFtuYW1lXSA9IHRvRWxbbmFtZV07XG4gICAgICAgIGlmIChmcm9tRWxbbmFtZV0pIHtcbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUobmFtZSwgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJvbUVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxudmFyIHNwZWNpYWxFbEhhbmRsZXJzID0ge1xuICAgIE9QVElPTjogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIHZhciBwYXJlbnROb2RlID0gZnJvbUVsLnBhcmVudE5vZGU7XG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnROYW1lID09PSAnT1BUR1JPVVAnKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICBwYXJlbnROYW1lID0gcGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ1NFTEVDVCcgJiYgIXBhcmVudE5vZGUuaGFzQXR0cmlidXRlKCdtdWx0aXBsZScpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21FbC5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykgJiYgIXRvRWwuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgTVMgRWRnZSBidWcgd2hlcmUgdGhlICdzZWxlY3RlZCcgYXR0cmlidXRlIGNhbiBvbmx5IGJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZWQgaWYgc2V0IHRvIGEgbm9uLWVtcHR5IHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMjA4NzY3OS9cbiAgICAgICAgICAgICAgICAgICAgZnJvbUVsLnNldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCAnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbUVsLnJlbW92ZUF0dHJpYnV0ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byByZXNldCBzZWxlY3QgZWxlbWVudCdzIHNlbGVjdGVkSW5kZXggdG8gLTEsIG90aGVyd2lzZSBzZXR0aW5nXG4gICAgICAgICAgICAgICAgLy8gZnJvbUVsLnNlbGVjdGVkIHVzaW5nIHRoZSBzeW5jQm9vbGVhbkF0dHJQcm9wIGJlbG93IGhhcyBubyBlZmZlY3QuXG4gICAgICAgICAgICAgICAgLy8gVGhlIGNvcnJlY3Qgc2VsZWN0ZWRJbmRleCB3aWxsIGJlIHNldCBpbiB0aGUgU0VMRUNUIHNwZWNpYWwgaGFuZGxlciBiZWxvdy5cbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ3NlbGVjdGVkJyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBUaGUgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSBpcyBzcGVjaWFsIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IHNpbmNlIGl0IHNldHNcbiAgICAgKiB0aGUgaW5pdGlhbCB2YWx1ZS4gQ2hhbmdpbmcgdGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgd2l0aG91dCBjaGFuZ2luZyB0aGVcbiAgICAgKiBcInZhbHVlXCIgcHJvcGVydHkgd2lsbCBoYXZlIG5vIGVmZmVjdCBzaW5jZSBpdCBpcyBvbmx5IHVzZWQgdG8gdGhlIHNldCB0aGVcbiAgICAgKiBpbml0aWFsIHZhbHVlLiAgU2ltaWxhciBmb3IgdGhlIFwiY2hlY2tlZFwiIGF0dHJpYnV0ZSwgYW5kIFwiZGlzYWJsZWRcIi5cbiAgICAgKi9cbiAgICBJTlBVVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCAnY2hlY2tlZCcpO1xuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ2Rpc2FibGVkJyk7XG5cbiAgICAgICAgaWYgKGZyb21FbC52YWx1ZSAhPT0gdG9FbC52YWx1ZSkge1xuICAgICAgICAgICAgZnJvbUVsLnZhbHVlID0gdG9FbC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdG9FbC5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgVEVYVEFSRUE6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSB0b0VsLnZhbHVlO1xuICAgICAgICBpZiAoZnJvbUVsLnZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgZnJvbUVsLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmlyc3RDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgICAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgLy8gTmVlZGVkIGZvciBJRS4gQXBwYXJlbnRseSBJRSBzZXRzIHRoZSBwbGFjZWhvbGRlciBhcyB0aGVcbiAgICAgICAgICAgIC8vIG5vZGUgdmFsdWUgYW5kIHZpc2UgdmVyc2EuIFRoaXMgaWdub3JlcyBhbiBlbXB0eSB1cGRhdGUuXG4gICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBmaXJzdENoaWxkLm5vZGVWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlIHx8ICghbmV3VmFsdWUgJiYgb2xkVmFsdWUgPT0gZnJvbUVsLnBsYWNlaG9sZGVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgU0VMRUNUOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgaWYgKCF0b0VsLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGVkSW5kZXggPSAtMTtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbG9vcCB0aHJvdWdoIGNoaWxkcmVuIG9mIGZyb21FbCwgbm90IHRvRWwgc2luY2Ugbm9kZXMgY2FuIGJlIG1vdmVkXG4gICAgICAgICAgICAvLyBmcm9tIHRvRWwgdG8gZnJvbUVsIGRpcmVjdGx5IHdoZW4gbW9ycGhpbmcuXG4gICAgICAgICAgICAvLyBBdCB0aGUgdGltZSB0aGlzIHNwZWNpYWwgaGFuZGxlciBpcyBpbnZva2VkLCBhbGwgY2hpbGRyZW4gaGF2ZSBhbHJlYWR5IGJlZW4gbW9ycGhlZFxuICAgICAgICAgICAgLy8gYW5kIGFwcGVuZGVkIHRvIC8gcmVtb3ZlZCBmcm9tIGZyb21FbCwgc28gdXNpbmcgZnJvbUVsIGhlcmUgaXMgc2FmZSBhbmQgY29ycmVjdC5cbiAgICAgICAgICAgIHZhciBjdXJDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgdmFyIG9wdGdyb3VwO1xuICAgICAgICAgICAgdmFyIG5vZGVOYW1lO1xuICAgICAgICAgICAgd2hpbGUoY3VyQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICBub2RlTmFtZSA9IGN1ckNoaWxkLm5vZGVOYW1lICYmIGN1ckNoaWxkLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnT1BUR1JPVVAnKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gb3B0Z3JvdXAuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdPUFRJT04nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hpbGQuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBjdXJDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJDaGlsZCAmJiBvcHRncm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBvcHRncm91cC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnJvbUVsLnNlbGVjdGVkSW5kZXggPSBzZWxlY3RlZEluZGV4O1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIEVMRU1FTlRfTk9ERSA9IDE7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxID0gMTE7XG52YXIgVEVYVF9OT0RFID0gMztcbnZhciBDT01NRU5UX05PREUgPSA4O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gZGVmYXVsdEdldE5vZGVLZXkobm9kZSkge1xuICBpZiAobm9kZSkge1xuICAgICAgcmV0dXJuIChub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkgfHwgbm9kZS5pZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycykge1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1vcnBoZG9tKGZyb21Ob2RlLCB0b05vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRvTm9kZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChmcm9tTm9kZS5ub2RlTmFtZSA9PT0gJyNkb2N1bWVudCcgfHwgZnJvbU5vZGUubm9kZU5hbWUgPT09ICdIVE1MJyB8fCBmcm9tTm9kZS5ub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvTm9kZUh0bWwgPSB0b05vZGU7XG4gICAgICAgICAgICAgICAgdG9Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnKTtcbiAgICAgICAgICAgICAgICB0b05vZGUuaW5uZXJIVE1MID0gdG9Ob2RlSHRtbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9Ob2RlID0gdG9FbGVtZW50KHRvTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZ2V0Tm9kZUtleSA9IG9wdGlvbnMuZ2V0Tm9kZUtleSB8fCBkZWZhdWx0R2V0Tm9kZUtleTtcbiAgICAgICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVBZGRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25Ob2RlQWRkZWQgPSBvcHRpb25zLm9uTm9kZUFkZGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbkJlZm9yZUVsVXBkYXRlZCA9IG9wdGlvbnMub25CZWZvcmVFbFVwZGF0ZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uRWxVcGRhdGVkID0gb3B0aW9ucy5vbkVsVXBkYXRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25CZWZvcmVOb2RlRGlzY2FyZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVEaXNjYXJkZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uTm9kZURpc2NhcmRlZCA9IG9wdGlvbnMub25Ob2RlRGlzY2FyZGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBjaGlsZHJlbk9ubHkgPSBvcHRpb25zLmNoaWxkcmVuT25seSA9PT0gdHJ1ZTtcblxuICAgICAgICAvLyBUaGlzIG9iamVjdCBpcyB1c2VkIGFzIGEgbG9va3VwIHRvIHF1aWNrbHkgZmluZCBhbGwga2V5ZWQgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgICAgICB2YXIgZnJvbU5vZGVzTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdmFyIGtleWVkUmVtb3ZhbExpc3QgPSBbXTtcblxuICAgICAgICBmdW5jdGlvbiBhZGRLZXllZFJlbW92YWwoa2V5KSB7XG4gICAgICAgICAgICBrZXllZFJlbW92YWxMaXN0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHdhbGtEaXNjYXJkZWRDaGlsZE5vZGVzKG5vZGUsIHNraXBLZXllZE5vZGVzKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBLZXllZE5vZGVzICYmIChrZXkgPSBnZXROb2RlS2V5KGN1ckNoaWxkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBza2lwcGluZyBrZXllZCBub2RlcyB0aGVuIHdlIGFkZCB0aGUga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIGxpc3Qgc28gdGhhdCBpdCBjYW4gYmUgaGFuZGxlZCBhdCB0aGUgdmVyeSBlbmQuXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRLZXllZFJlbW92YWwoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHRoZSBub2RlIGFzIGRpc2NhcmRlZCBpZiBpdCBpcyBub3Qga2V5ZWQuIFdlIGRvIHRoaXMgYmVjYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCB3ZSBsb29wIHRocm91Z2ggYWxsIGtleWVkIGVsZW1lbnRzIHRoYXQgd2VyZSB1bm1hdGNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSBpbiBvbmUgZmluYWwgcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hpbGQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtEaXNjYXJkZWRDaGlsZE5vZGVzKGN1ckNoaWxkLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW1vdmVzIGEgRE9NIG5vZGUgb3V0IG9mIHRoZSBvcmlnaW5hbCBET01cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtICB7Tm9kZX0gbm9kZSBUaGUgbm9kZSB0byByZW1vdmVcbiAgICAgICAgICogQHBhcmFtICB7Tm9kZX0gcGFyZW50Tm9kZSBUaGUgbm9kZXMgcGFyZW50XG4gICAgICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IHNraXBLZXllZE5vZGVzIElmIHRydWUgdGhlbiBlbGVtZW50cyB3aXRoIGtleXMgd2lsbCBiZSBza2lwcGVkIGFuZCBub3QgZGlzY2FyZGVkLlxuICAgICAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUsIHBhcmVudE5vZGUsIHNraXBLZXllZE5vZGVzKSB7XG4gICAgICAgICAgICBpZiAob25CZWZvcmVOb2RlRGlzY2FyZGVkKG5vZGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvbk5vZGVEaXNjYXJkZWQobm9kZSk7XG4gICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAvLyBUcmVlV2Fsa2VyIGltcGxlbWVudGF0aW9uIGlzIG5vIGZhc3RlciwgYnV0IGtlZXBpbmcgdGhpcyBhcm91bmQgaW4gY2FzZSB0aGlzIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZVxuICAgICAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUocm9vdCkge1xuICAgICAgICAvLyAgICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxuICAgICAgICAvLyAgICAgICAgIHJvb3QsXG4gICAgICAgIC8vICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgdmFyIGVsO1xuICAgICAgICAvLyAgICAgd2hpbGUoKGVsID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpKSkge1xuICAgICAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAgICAgLy8gICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gLy8gTm9kZUl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIGlzIG5vIGZhc3RlciwgYnV0IGtlZXBpbmcgdGhpcyBhcm91bmQgaW4gY2FzZSB0aGlzIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZVxuICAgICAgICAvL1xuICAgICAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUobm9kZSkge1xuICAgICAgICAvLyAgICAgdmFyIG5vZGVJdGVyYXRvciA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcihub2RlLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG4gICAgICAgIC8vICAgICB2YXIgZWw7XG4gICAgICAgIC8vICAgICB3aGlsZSgoZWwgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAgICAgLy8gICAgICAgICB2YXIga2V5ID0gZ2V0Tm9kZUtleShlbCk7XG4gICAgICAgIC8vICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAvLyAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGVsO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGZ1bmN0aW9uIGluZGV4VHJlZShub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUkMSkge1xuICAgICAgICAgICAgICAgIHZhciBjdXJDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VyQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGN1ckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2FsayByZWN1cnNpdmVseVxuICAgICAgICAgICAgICAgICAgICBpbmRleFRyZWUoY3VyQ2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXhUcmVlKGZyb21Ob2RlKTtcblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVOb2RlQWRkZWQoZWwpIHtcbiAgICAgICAgICAgIG9uTm9kZUFkZGVkKGVsKTtcblxuICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gZWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXh0U2libGluZyA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVubWF0Y2hlZEZyb21FbCA9IGZyb21Ob2Rlc0xvb2t1cFtrZXldO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgZHVwbGljYXRlICNpZCBub2RlIGluIGNhY2hlLCByZXBsYWNlIGBlbGAgd2l0aCBjYWNoZSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbW9ycGggaXQgdG8gdGhlIGNoaWxkIG5vZGUuXG4gICAgICAgICAgICAgICAgICAgIGlmICh1bm1hdGNoZWRGcm9tRWwgJiYgY29tcGFyZU5vZGVOYW1lcyhjdXJDaGlsZCwgdW5tYXRjaGVkRnJvbUVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodW5tYXRjaGVkRnJvbUVsLCBjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JwaEVsKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vZGVBZGRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBmb3IgY3VyQ2hpbGQgYW5kIGl0J3MgY2hpbGRyZW4gdG8gc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nIGluXG4gICAgICAgICAgICAgICAgICAvLyBmcm9tTm9kZXNMb29rdXBcbiAgICAgICAgICAgICAgICAgIGhhbmRsZU5vZGVBZGRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBuZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG9mIHRoZSBcInRvIG5vZGVzXCIuIElmIGN1ckZyb21Ob2RlQ2hpbGQgaXNcbiAgICAgICAgICAgIC8vIG5vbi1udWxsIHRoZW4gd2Ugc3RpbGwgaGF2ZSBzb21lIGZyb20gbm9kZXMgbGVmdCBvdmVyIHRoYXQgbmVlZFxuICAgICAgICAgICAgLy8gdG8gYmUgcmVtb3ZlZFxuICAgICAgICAgICAgd2hpbGUgKGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBpZiAoKGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBza2lwIG5lc3RlZCBrZXllZCBub2RlcyBmcm9tIGJlaW5nIHJlbW92ZWQgc2luY2UgdGhlcmUgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtb3JwaEVsKGZyb21FbCwgdG9FbCwgY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgICAgICB2YXIgdG9FbEtleSA9IGdldE5vZGVLZXkodG9FbCk7XG5cbiAgICAgICAgICAgIGlmICh0b0VsS2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gZWxlbWVudCB3aXRoIGFuIElEIGlzIGJlaW5nIG1vcnBoZWQgdGhlbiBpdCB3aWxsIGJlIGluIHRoZSBmaW5hbFxuICAgICAgICAgICAgICAgIC8vIERPTSBzbyBjbGVhciBpdCBvdXQgb2YgdGhlIHNhdmVkIGVsZW1lbnRzIGNvbGxlY3Rpb25cbiAgICAgICAgICAgICAgICBkZWxldGUgZnJvbU5vZGVzTG9va3VwW3RvRWxLZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgICAgICAgICAgaWYgKG9uQmVmb3JlRWxVcGRhdGVkKGZyb21FbCwgdG9FbCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYXR0cmlidXRlcyBvbiBvcmlnaW5hbCBET00gZWxlbWVudCBmaXJzdFxuICAgICAgICAgICAgICAgIG1vcnBoQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25hbFxuICAgICAgICAgICAgICAgIG9uRWxVcGRhdGVkKGZyb21FbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVFbENoaWxkcmVuVXBkYXRlZChmcm9tRWwsIHRvRWwpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZnJvbUVsLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgICAgICAgIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNwZWNpYWxFbEhhbmRsZXJzLlRFWFRBUkVBKGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtb3JwaENoaWxkcmVuKGZyb21FbCwgdG9FbCkge1xuICAgICAgICAgICAgdmFyIGN1clRvTm9kZUNoaWxkID0gdG9FbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgdmFyIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBjdXJUb05vZGVLZXk7XG4gICAgICAgICAgICB2YXIgY3VyRnJvbU5vZGVLZXk7XG5cbiAgICAgICAgICAgIHZhciBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB2YXIgdG9OZXh0U2libGluZztcbiAgICAgICAgICAgIHZhciBtYXRjaGluZ0Zyb21FbDtcblxuICAgICAgICAgICAgLy8gd2FsayB0aGUgY2hpbGRyZW5cbiAgICAgICAgICAgIG91dGVyOiB3aGlsZSAoY3VyVG9Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0b05leHRTaWJsaW5nID0gY3VyVG9Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgY3VyVG9Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJUb05vZGVDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBmcm9tTm9kZSBjaGlsZHJlbiBhbGwgdGhlIHdheSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVG9Ob2RlQ2hpbGQuaXNTYW1lTm9kZSAmJiBjdXJUb05vZGVDaGlsZC5pc1NhbWVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUtleSA9IGdldE5vZGVLZXkoY3VyRnJvbU5vZGVDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGN1ckZyb21Ob2RlVHlwZSA9IGN1ckZyb21Ob2RlQ2hpbGQubm9kZVR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtZWFucyBpZiB0aGUgY3VyRnJvbU5vZGVDaGlsZCBkb2VzbnQgaGF2ZSBhIG1hdGNoIHdpdGggdGhlIGN1clRvTm9kZUNoaWxkXG4gICAgICAgICAgICAgICAgICAgIHZhciBpc0NvbXBhdGlibGUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlVHlwZSA9PT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgYmVpbmcgY29tcGFyZWQgYXJlIEVsZW1lbnQgbm9kZXNcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBub2RlIGhhcyBhIGtleSBzbyB3ZSB3YW50IHRvIG1hdGNoIGl0IHVwIHdpdGggdGhlIGNvcnJlY3QgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAhPT0gY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBrZXkgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGNoZWNrIG91ciBsb29rdXAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21OZXh0U2libGluZyA9PT0gbWF0Y2hpbmdGcm9tRWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzaW5nbGUgZWxlbWVudCByZW1vdmFscy4gVG8gYXZvaWQgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERPTSBub2RlIG91dCBvZiB0aGUgdHJlZSAoc2luY2UgdGhhdCBjYW4gYnJlYWsgQ1NTIHRyYW5zaXRpb25zLCBldGMuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBpbnN0ZWFkIGRpc2NhcmQgdGhlIGN1cnJlbnQgbm9kZSBhbmQgd2FpdCB1bnRpbCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gdG8gcHJvcGVybHkgbWF0Y2ggdXAgdGhlIGtleWVkIHRhcmdldCBlbGVtZW50IHdpdGggaXRzIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIHRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBtYXRjaGluZyBrZXllZCBlbGVtZW50IHNvbWV3aGVyZSBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIG1vdmUgdGhlIG9yaWdpbmFsIERPTSBub2RlIGludG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIG1vcnBoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0LlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IFdlIHVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiByZXBsYWNlQ2hpbGQgYmVjYXVzZSB3ZSB3YW50IHRvIGdvIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGByZW1vdmVOb2RlKClgIGZ1bmN0aW9uIGZvciB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nIGRpc2NhcmRlZCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBsaWZlY3ljbGUgaG9va3MgYXJlIGNvcnJlY3RseSBpbnZva2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21FbC5pbnNlcnRCZWZvcmUobWF0Y2hpbmdGcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb21OZXh0U2libGluZyA9IGN1ckZyb21Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBza2lwIG5lc3RlZCBrZXllZCBub2RlcyBmcm9tIGJlaW5nIHJlbW92ZWQgc2luY2UgdGhlcmUgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHN0aWxsIGEgY2hhbmNlIHRoZXkgd2lsbCBiZSBtYXRjaGVkIHVwIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBtYXRjaGluZ0Zyb21FbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlcyBhcmUgbm90IGNvbXBhdGlibGUgc2luY2UgdGhlIFwidG9cIiBub2RlIGhhcyBhIGtleSBhbmQgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyBtYXRjaGluZyBrZXllZCBub2RlIGluIHRoZSBzb3VyY2UgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaGFzIGEga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGlzQ29tcGF0aWJsZSAhPT0gZmFsc2UgJiYgY29tcGFyZU5vZGVOYW1lcyhjdXJGcm9tTm9kZUNoaWxkLCBjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBjb21wYXRpYmxlIERPTSBlbGVtZW50cyBzbyB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgXCJmcm9tXCIgbm9kZSB0byBtYXRjaCB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgRE9NIG5vZGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1PUlBIXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoRWwoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IFRFWFRfTk9ERSB8fCBjdXJGcm9tTm9kZVR5cGUgPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgVGV4dCBvciBDb21tZW50IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbHkgdXBkYXRlIG5vZGVWYWx1ZSBvbiB0aGUgb3JpZ2luYWwgbm9kZSB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgdGV4dCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUNoaWxkLm5vZGVWYWx1ZSAhPT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQubm9kZVZhbHVlID0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBib3RoIHRoZSBcInRvXCIgY2hpbGQgYW5kIHRoZSBcImZyb21cIiBjaGlsZCBzaW5jZSB3ZSBmb3VuZCBhIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGVsc2UgdG8gZG8gYXMgd2UgYWxyZWFkeSByZWN1cnNpdmVseSBjYWxsZWQgbW9ycGhDaGlsZHJlbiBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8gY29tcGF0aWJsZSBtYXRjaCBzbyByZW1vdmUgdGhlIG9sZCBub2RlIGZyb20gdGhlIERPTSBhbmQgY29udGludWUgdHJ5aW5nIHRvIGZpbmQgYVxuICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCBpbiB0aGUgb3JpZ2luYWwgRE9NLiBIb3dldmVyLCB3ZSBvbmx5IGRvIHRoaXMgaWYgdGhlIGZyb20gbm9kZSBpcyBub3Qga2V5ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgaXMgcG9zc2libGUgdGhhdCBhIGtleWVkIG5vZGUgbWlnaHQgbWF0Y2ggdXAgd2l0aCBhIG5vZGUgc29tZXdoZXJlIGVsc2UgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldCB0cmVlIGFuZCB3ZSBkb24ndCB3YW50IHRvIGRpc2NhcmQgaXQganVzdCB5ZXQgc2luY2UgaXQgc3RpbGwgbWlnaHQgZmluZCBhXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvbWUgaW4gdGhlIGZpbmFsIERPTSB0cmVlLiBBZnRlciBldmVyeXRoaW5nIGlzIGRvbmUgd2Ugd2lsbCByZW1vdmUgYW55IGtleWVkIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgZGlkbid0IGZpbmQgYSBob21lXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCByZW1vdmFsIHRvIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRLZXllZFJlbW92YWwoY3VyRnJvbU5vZGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH0gLy8gRU5EOiB3aGlsZShjdXJGcm9tTm9kZUNoaWxkKSB7fVxuXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gd2UgZGlkIG5vdCBmaW5kIGEgY2FuZGlkYXRlIG1hdGNoIGZvclxuICAgICAgICAgICAgICAgIC8vIG91ciBcInRvIG5vZGVcIiBhbmQgd2UgZXhoYXVzdGVkIGFsbCBvZiB0aGUgY2hpbGRyZW4gXCJmcm9tXCJcbiAgICAgICAgICAgICAgICAvLyBub2Rlcy4gVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3QgYXBwZW5kIHRoZSBjdXJyZW50IFwidG9cIiBub2RlXG4gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGVuZFxuICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkgJiYgKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pICYmIGNvbXBhcmVOb2RlTmFtZXMobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tRWwuYXBwZW5kQ2hpbGQobWF0Y2hpbmdGcm9tRWwpO1xuICAgICAgICAgICAgICAgICAgICAvLyBNT1JQSFxuICAgICAgICAgICAgICAgICAgICBtb3JwaEVsKG1hdGNoaW5nRnJvbUVsLCBjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0ID0gb25CZWZvcmVOb2RlQWRkZWQoY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVOb2RlQWRkZWRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVG9Ob2RlQ2hpbGQuYWN0dWFsaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSBjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUoZnJvbUVsLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21FbC5hcHBlbmRDaGlsZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb2RlQWRkZWQoY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSk7XG5cbiAgICAgICAgICAgIHZhciBzcGVjaWFsRWxIYW5kbGVyID0gc3BlY2lhbEVsSGFuZGxlcnNbZnJvbUVsLm5vZGVOYW1lXTtcbiAgICAgICAgICAgIGlmIChzcGVjaWFsRWxIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgc3BlY2lhbEVsSGFuZGxlcihmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IC8vIEVORDogbW9ycGhDaGlsZHJlbiguLi4pXG5cbiAgICAgICAgdmFyIG1vcnBoZWROb2RlID0gZnJvbU5vZGU7XG4gICAgICAgIHZhciBtb3JwaGVkTm9kZVR5cGUgPSBtb3JwaGVkTm9kZS5ub2RlVHlwZTtcbiAgICAgICAgdmFyIHRvTm9kZVR5cGUgPSB0b05vZGUubm9kZVR5cGU7XG5cbiAgICAgICAgaWYgKCFjaGlsZHJlbk9ubHkpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBhcmUgZ2l2ZW4gdHdvIERPTSBub2RlcyB0aGF0IGFyZSBub3RcbiAgICAgICAgICAgIC8vIGNvbXBhdGlibGUgKGUuZy4gPGRpdj4gLS0+IDxzcGFuPiBvciA8ZGl2PiAtLT4gVEVYVClcbiAgICAgICAgICAgIGlmIChtb3JwaGVkTm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGlmICh0b05vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlTm9kZU5hbWVzKGZyb21Ob2RlLCB0b05vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk5vZGVEaXNjYXJkZWQoZnJvbU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSBtb3ZlQ2hpbGRyZW4oZnJvbU5vZGUsIGNyZWF0ZUVsZW1lbnROUyh0b05vZGUubm9kZU5hbWUsIHRvTm9kZS5uYW1lc3BhY2VVUkkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdvaW5nIGZyb20gYW4gZWxlbWVudCBub2RlIHRvIGEgdGV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9ycGhlZE5vZGVUeXBlID09PSBURVhUX05PREUgfHwgbW9ycGhlZE5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHsgLy8gVGV4dCBvciBjb21tZW50IG5vZGVcbiAgICAgICAgICAgICAgICBpZiAodG9Ob2RlVHlwZSA9PT0gbW9ycGhlZE5vZGVUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3JwaGVkTm9kZS5ub2RlVmFsdWUgIT09IHRvTm9kZS5ub2RlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlLm5vZGVWYWx1ZSA9IHRvTm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9ycGhlZE5vZGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dCBub2RlIHRvIHNvbWV0aGluZyBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb3JwaGVkTm9kZSA9PT0gdG9Ob2RlKSB7XG4gICAgICAgICAgICAvLyBUaGUgXCJ0byBub2RlXCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwiZnJvbSBub2RlXCIgc28gd2UgaGFkIHRvXG4gICAgICAgICAgICAvLyB0b3NzIG91dCB0aGUgXCJmcm9tIG5vZGVcIiBhbmQgdXNlIHRoZSBcInRvIG5vZGVcIlxuICAgICAgICAgICAgb25Ob2RlRGlzY2FyZGVkKGZyb21Ob2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0b05vZGUuaXNTYW1lTm9kZSAmJiB0b05vZGUuaXNTYW1lTm9kZShtb3JwaGVkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vcnBoRWwobW9ycGhlZE5vZGUsIHRvTm9kZSwgY2hpbGRyZW5Pbmx5KTtcblxuICAgICAgICAgICAgLy8gV2Ugbm93IG5lZWQgdG8gbG9vcCBvdmVyIGFueSBrZXllZCBub2RlcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmVcbiAgICAgICAgICAgIC8vIHJlbW92ZWQuIFdlIG9ubHkgZG8gdGhlIHJlbW92YWwgaWYgd2Uga25vdyB0aGF0IHRoZSBrZXllZCBub2RlXG4gICAgICAgICAgICAvLyBuZXZlciBmb3VuZCBhIG1hdGNoLiBXaGVuIGEga2V5ZWQgbm9kZSBpcyBtYXRjaGVkIHVwIHdlIHJlbW92ZVxuICAgICAgICAgICAgLy8gaXQgb3V0IG9mIGZyb21Ob2Rlc0xvb2t1cCBhbmQgd2UgdXNlIGZyb21Ob2Rlc0xvb2t1cCB0byBkZXRlcm1pbmVcbiAgICAgICAgICAgIC8vIGlmIGEga2V5ZWQgbm9kZSBoYXMgYmVlbiBtYXRjaGVkIHVwIG9yIG5vdFxuICAgICAgICAgICAgaWYgKGtleWVkUmVtb3ZhbExpc3QpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTAsIGxlbj1rZXllZFJlbW92YWxMaXN0Lmxlbmd0aDsgaTxsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZWxUb1JlbW92ZSA9IGZyb21Ob2Rlc0xvb2t1cFtrZXllZFJlbW92YWxMaXN0W2ldXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsVG9SZW1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUoZWxUb1JlbW92ZSwgZWxUb1JlbW92ZS5wYXJlbnROb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNoaWxkcmVuT25seSAmJiBtb3JwaGVkTm9kZSAhPT0gZnJvbU5vZGUgJiYgZnJvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKG1vcnBoZWROb2RlLmFjdHVhbGl6ZSkge1xuICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlID0gbW9ycGhlZE5vZGUuYWN0dWFsaXplKGZyb21Ob2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHdlIGhhZCB0byBzd2FwIG91dCB0aGUgZnJvbSBub2RlIHdpdGggYSBuZXcgbm9kZSBiZWNhdXNlIHRoZSBvbGRcbiAgICAgICAgICAgIC8vIG5vZGUgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldCBub2RlIHRoZW4gd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgb2xkIERPTSBub2RlIGluIHRoZSBvcmlnaW5hbCBET00gdHJlZS4gVGhpcyBpcyBvbmx5XG4gICAgICAgICAgICAvLyBwb3NzaWJsZSBpZiB0aGUgb3JpZ2luYWwgRE9NIG5vZGUgd2FzIHBhcnQgb2YgYSBET00gdHJlZSB3aGljaFxuICAgICAgICAgICAgLy8gd2Uga25vdyBpcyB0aGUgY2FzZSBpZiBpdCBoYXMgYSBwYXJlbnQgbm9kZS5cbiAgICAgICAgICAgIGZyb21Ob2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG1vcnBoZWROb2RlLCBmcm9tTm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbW9ycGhlZE5vZGU7XG4gICAgfTtcbn1cblxudmFyIG1vcnBoZG9tID0gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpO1xuXG5leHBvcnQgZGVmYXVsdCBtb3JwaGRvbTtcbiIsICJpbXBvcnQge1xuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfRElTQUJMRV9XSVRILFxuICBQSFhfRkVFREJBQ0tfRk9SLFxuICBQSFhfUkVNT1ZFLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1NFU1NJT04sXG4gIFBIWF9TS0lQLFxuICBQSFhfU1RBVElDLFxuICBQSFhfVFJJR0dFUl9BQ1RJT04sXG4gIFBIWF9VUERBVEVcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgZGV0ZWN0RHVwbGljYXRlSWRzXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuaW1wb3J0IERPTVBvc3RNb3JwaFJlc3RvcmVyIGZyb20gXCIuL2RvbV9wb3N0X21vcnBoX3Jlc3RvcmVyXCJcbmltcG9ydCBtb3JwaGRvbSBmcm9tIFwibW9ycGhkb21cIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01QYXRjaCB7XG4gIHN0YXRpYyBwYXRjaEVsKGZyb21FbCwgdG9FbCwgYWN0aXZlRWxlbWVudCl7XG4gICAgbW9ycGhkb20oZnJvbUVsLCB0b0VsLCB7XG4gICAgICBjaGlsZHJlbk9ubHk6IGZhbHNlLFxuICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgaWYoYWN0aXZlRWxlbWVudCAmJiBhY3RpdmVFbGVtZW50LmlzU2FtZU5vZGUoZnJvbUVsKSAmJiBET00uaXNGb3JtSW5wdXQoZnJvbUVsKSl7XG4gICAgICAgICAgRE9NLm1lcmdlRm9jdXNlZElucHV0KGZyb21FbCwgdG9FbClcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3LCBjb250YWluZXIsIGlkLCBodG1sLCB0YXJnZXRDSUQpe1xuICAgIHRoaXMudmlldyA9IHZpZXdcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXRcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lclxuICAgIHRoaXMuaWQgPSBpZFxuICAgIHRoaXMucm9vdElEID0gdmlldy5yb290LmlkXG4gICAgdGhpcy5odG1sID0gaHRtbFxuICAgIHRoaXMudGFyZ2V0Q0lEID0gdGFyZ2V0Q0lEXG4gICAgdGhpcy5jaWRQYXRjaCA9IHR5cGVvZiAodGhpcy50YXJnZXRDSUQpID09PSBcIm51bWJlclwiXG4gICAgdGhpcy5jYWxsYmFja3MgPSB7XG4gICAgICBiZWZvcmVhZGRlZDogW10sIGJlZm9yZXVwZGF0ZWQ6IFtdLCBiZWZvcmVwaHhDaGlsZEFkZGVkOiBbXSxcbiAgICAgIGFmdGVyYWRkZWQ6IFtdLCBhZnRlcnVwZGF0ZWQ6IFtdLCBhZnRlcmRpc2NhcmRlZDogW10sIGFmdGVycGh4Q2hpbGRBZGRlZDogW11cbiAgICB9XG4gIH1cblxuICBiZWZvcmUoa2luZCwgY2FsbGJhY2speyB0aGlzLmNhbGxiYWNrc1tgYmVmb3JlJHtraW5kfWBdLnB1c2goY2FsbGJhY2spIH1cbiAgYWZ0ZXIoa2luZCwgY2FsbGJhY2speyB0aGlzLmNhbGxiYWNrc1tgYWZ0ZXIke2tpbmR9YF0ucHVzaChjYWxsYmFjaykgfVxuXG4gIHRyYWNrQmVmb3JlKGtpbmQsIC4uLmFyZ3Mpe1xuICAgIHRoaXMuY2FsbGJhY2tzW2BiZWZvcmUke2tpbmR9YF0uZm9yRWFjaChjYWxsYmFjayA9PiBjYWxsYmFjayguLi5hcmdzKSlcbiAgfVxuXG4gIHRyYWNrQWZ0ZXIoa2luZCwgLi4uYXJncyl7XG4gICAgdGhpcy5jYWxsYmFja3NbYGFmdGVyJHtraW5kfWBdLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2soLi4uYXJncykpXG4gIH1cblxuICBtYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpe1xuICAgIERPTS5hbGwodGhpcy5jb250YWluZXIsIFwiW3BoeC11cGRhdGU9YXBwZW5kXSA+ICosIFtwaHgtdXBkYXRlPXByZXBlbmRdID4gKlwiLCBlbCA9PiB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1JFTU9WRSwgXCJcIilcbiAgICB9KVxuICB9XG5cbiAgcGVyZm9ybSgpe1xuICAgIGxldCB7dmlldywgbGl2ZVNvY2tldCwgY29udGFpbmVyLCBodG1sfSA9IHRoaXNcbiAgICBsZXQgdGFyZ2V0Q29udGFpbmVyID0gdGhpcy5pc0NJRFBhdGNoKCkgPyB0aGlzLnRhcmdldENJRENvbnRhaW5lcihodG1sKSA6IGNvbnRhaW5lclxuICAgIGlmKHRoaXMuaXNDSURQYXRjaCgpICYmICF0YXJnZXRDb250YWluZXIpeyByZXR1cm4gfVxuXG4gICAgbGV0IGZvY3VzZWQgPSBsaXZlU29ja2V0LmdldEFjdGl2ZUVsZW1lbnQoKVxuICAgIGxldCB7c2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZH0gPSBmb2N1c2VkICYmIERPTS5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSA/IGZvY3VzZWQgOiB7fVxuICAgIGxldCBwaHhVcGRhdGUgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1VQREFURSlcbiAgICBsZXQgcGh4RmVlZGJhY2tGb3IgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX0ZFRURCQUNLX0ZPUilcbiAgICBsZXQgZGlzYWJsZVdpdGggPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX0RJU0FCTEVfV0lUSClcbiAgICBsZXQgcGh4VHJpZ2dlckV4dGVybmFsID0gbGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9UUklHR0VSX0FDVElPTilcbiAgICBsZXQgYWRkZWQgPSBbXVxuICAgIGxldCB1cGRhdGVzID0gW11cbiAgICBsZXQgYXBwZW5kUHJlcGVuZFVwZGF0ZXMgPSBbXVxuICAgIGxldCBleHRlcm5hbEZvcm1UcmlnZ2VyZWQgPSBudWxsXG5cbiAgICBsZXQgZGlmZkhUTUwgPSBsaXZlU29ja2V0LnRpbWUoXCJwcmVtb3JwaCBjb250YWluZXIgcHJlcFwiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZERpZmZIVE1MKGNvbnRhaW5lciwgaHRtbCwgcGh4VXBkYXRlLCB0YXJnZXRDb250YWluZXIpXG4gICAgfSlcblxuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLCBjb250YWluZXIpXG4gICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgY29udGFpbmVyLCBjb250YWluZXIpXG5cbiAgICBsaXZlU29ja2V0LnRpbWUoXCJtb3JwaGRvbVwiLCAoKSA9PiB7XG4gICAgICBtb3JwaGRvbSh0YXJnZXRDb250YWluZXIsIGRpZmZIVE1MLCB7XG4gICAgICAgIGNoaWxkcmVuT25seTogdGFyZ2V0Q29udGFpbmVyLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSA9PT0gbnVsbCxcbiAgICAgICAgZ2V0Tm9kZUtleTogKG5vZGUpID0+IHtcbiAgICAgICAgICByZXR1cm4gRE9NLmlzUGh4RGVzdHJveWVkKG5vZGUpID8gbnVsbCA6IG5vZGUuaWRcbiAgICAgICAgfSxcbiAgICAgICAgb25CZWZvcmVOb2RlQWRkZWQ6IChlbCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLCBlbClcbiAgICAgICAgICByZXR1cm4gZWxcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob2RlQWRkZWQ6IChlbCkgPT4ge1xuICAgICAgICAgIGlmKERPTS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZWwsIHBoeFRyaWdnZXJFeHRlcm5hbCkpe1xuICAgICAgICAgICAgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gZWxcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9pbnB1dCBoYW5kbGluZ1xuICAgICAgICAgIERPTS5kaXNjYXJkRXJyb3IodGFyZ2V0Q29udGFpbmVyLCBlbCwgcGh4RmVlZGJhY2tGb3IpXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZihET00uaXNQaHhDaGlsZChlbCkgJiYgdmlldy5vd25zRWxlbWVudChlbCkpe1xuICAgICAgICAgICAgdGhpcy50cmFja0FmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLCBlbClcbiAgICAgICAgICB9XG4gICAgICAgICAgYWRkZWQucHVzaChlbClcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob2RlRGlzY2FyZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICAvLyBuZXN0ZWQgdmlldyBoYW5kbGluZ1xuICAgICAgICAgIGlmKERPTS5pc1BoeENoaWxkKGVsKSl7IGxpdmVTb2NrZXQuZGVzdHJveVZpZXdCeUVsKGVsKSB9XG4gICAgICAgICAgdGhpcy50cmFja0FmdGVyKFwiZGlzY2FyZGVkXCIsIGVsKVxuICAgICAgICB9LFxuICAgICAgICBvbkJlZm9yZU5vZGVEaXNjYXJkZWQ6IChlbCkgPT4ge1xuICAgICAgICAgIGlmKGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1JFTU9WRSkgIT09IG51bGwpeyByZXR1cm4gdHJ1ZSB9XG4gICAgICAgICAgaWYoZWwucGFyZW50Tm9kZSAhPT0gbnVsbCAmJiBET00uaXNQaHhVcGRhdGUoZWwucGFyZW50Tm9kZSwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSAmJiBlbC5pZCl7IHJldHVybiBmYWxzZSB9XG4gICAgICAgICAgaWYodGhpcy5za2lwQ0lEU2libGluZyhlbCkpeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIG9uRWxVcGRhdGVkOiAoZWwpID0+IHtcbiAgICAgICAgICBpZihET00uaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGVsLCBwaHhUcmlnZ2VyRXh0ZXJuYWwpKXtcbiAgICAgICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IGVsXG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZXMucHVzaChlbClcbiAgICAgICAgfSxcbiAgICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgICBET00uY2xlYW5DaGlsZE5vZGVzKHRvRWwsIHBoeFVwZGF0ZSlcbiAgICAgICAgICBpZih0aGlzLnNraXBDSURTaWJsaW5nKHRvRWwpKXsgcmV0dXJuIGZhbHNlIH1cbiAgICAgICAgICBpZihET00uaXNJZ25vcmVkKGZyb21FbCwgcGh4VXBkYXRlKSl7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICBET00ubWVyZ2VBdHRycyhmcm9tRWwsIHRvRWwsIHtpc0lnbm9yZWQ6IHRydWV9KVxuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihmcm9tRWwudHlwZSA9PT0gXCJudW1iZXJcIiAmJiAoZnJvbUVsLnZhbGlkaXR5ICYmIGZyb21FbC52YWxpZGl0eS5iYWRJbnB1dCkpeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICAgIGlmKCFET00uc3luY1BlbmRpbmdSZWYoZnJvbUVsLCB0b0VsLCBkaXNhYmxlV2l0aCkpe1xuICAgICAgICAgICAgaWYoRE9NLmlzVXBsb2FkSW5wdXQoZnJvbUVsKSl7XG4gICAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbClcbiAgICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG5lc3RlZCB2aWV3IGhhbmRsaW5nXG4gICAgICAgICAgaWYoRE9NLmlzUGh4Q2hpbGQodG9FbCkpe1xuICAgICAgICAgICAgbGV0IHByZXZTZXNzaW9uID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTilcbiAgICAgICAgICAgIERPTS5tZXJnZUF0dHJzKGZyb21FbCwgdG9FbCwge2V4Y2x1ZGU6IFtQSFhfU1RBVElDXX0pXG4gICAgICAgICAgICBpZihwcmV2U2Vzc2lvbiAhPT0gXCJcIil7IGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIHByZXZTZXNzaW9uKSB9XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKFBIWF9ST09UX0lELCB0aGlzLnJvb3RJRClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlucHV0IGhhbmRsaW5nXG4gICAgICAgICAgRE9NLmNvcHlQcml2YXRlcyh0b0VsLCBmcm9tRWwpXG4gICAgICAgICAgRE9NLmRpc2NhcmRFcnJvcih0YXJnZXRDb250YWluZXIsIHRvRWwsIHBoeEZlZWRiYWNrRm9yKVxuICAgICAgICAgIERPTS5zeW5jUHJvcHNUb0F0dHJzKHRvRWwpXG5cbiAgICAgICAgICBsZXQgaXNGb2N1c2VkRm9ybUVsID0gZm9jdXNlZCAmJiBmcm9tRWwuaXNTYW1lTm9kZShmb2N1c2VkKSAmJiBET00uaXNGb3JtSW5wdXQoZnJvbUVsKVxuICAgICAgICAgIGlmKGlzRm9jdXNlZEZvcm1FbCAmJiAhdGhpcy5mb3JjZUZvY3VzZWRTZWxlY3RVcGRhdGUoZnJvbUVsLCB0b0VsKSl7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICBET00ubWVyZ2VGb2N1c2VkSW5wdXQoZnJvbUVsLCB0b0VsKVxuICAgICAgICAgICAgRE9NLnN5bmNBdHRyc1RvUHJvcHMoZnJvbUVsKVxuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZihET00uaXNQaHhVcGRhdGUodG9FbCwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSl7XG4gICAgICAgICAgICAgIGFwcGVuZFByZXBlbmRVcGRhdGVzLnB1c2gobmV3IERPTVBvc3RNb3JwaFJlc3RvcmVyKGZyb21FbCwgdG9FbCwgdG9FbC5nZXRBdHRyaWJ1dGUocGh4VXBkYXRlKSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBET00uc3luY0F0dHJzVG9Qcm9wcyh0b0VsKVxuICAgICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgZnJvbUVsLCB0b0VsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGlmKGxpdmVTb2NrZXQuaXNEZWJ1Z0VuYWJsZWQoKSl7IGRldGVjdER1cGxpY2F0ZUlkcygpIH1cblxuICAgIGlmKGFwcGVuZFByZXBlbmRVcGRhdGVzLmxlbmd0aCA+IDApe1xuICAgICAgbGl2ZVNvY2tldC50aW1lKFwicG9zdC1tb3JwaCBhcHBlbmQvcHJlcGVuZCByZXN0b3JhdGlvblwiLCAoKSA9PiB7XG4gICAgICAgIGFwcGVuZFByZXBlbmRVcGRhdGVzLmZvckVhY2godXBkYXRlID0+IHVwZGF0ZS5wZXJmb3JtKCkpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGxpdmVTb2NrZXQuc2lsZW5jZUV2ZW50cygoKSA9PiBET00ucmVzdG9yZUZvY3VzKGZvY3VzZWQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpKVxuICAgIERPTS5kaXNwYXRjaEV2ZW50KGRvY3VtZW50LCBcInBoeDp1cGRhdGVcIilcbiAgICBhZGRlZC5mb3JFYWNoKGVsID0+IHRoaXMudHJhY2tBZnRlcihcImFkZGVkXCIsIGVsKSlcbiAgICB1cGRhdGVzLmZvckVhY2goZWwgPT4gdGhpcy50cmFja0FmdGVyKFwidXBkYXRlZFwiLCBlbCkpXG5cbiAgICBpZihleHRlcm5hbEZvcm1UcmlnZ2VyZWQpe1xuICAgICAgbGl2ZVNvY2tldC5kaXNjb25uZWN0KClcbiAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZC5zdWJtaXQoKVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZm9yY2VGb2N1c2VkU2VsZWN0VXBkYXRlKGZyb21FbCwgdG9FbCl7XG4gICAgbGV0IGlzU2VsZWN0ID0gW1wic2VsZWN0XCIsIFwic2VsZWN0LW9uZVwiLCBcInNlbGVjdC1tdWx0aXBsZVwiXS5maW5kKCh0KSA9PiB0ID09PSBmcm9tRWwudHlwZSlcbiAgICByZXR1cm4gZnJvbUVsLm11bHRpcGxlID09PSB0cnVlIHx8IChpc1NlbGVjdCAmJiBmcm9tRWwuaW5uZXJIVE1MICE9IHRvRWwuaW5uZXJIVE1MKVxuICB9XG5cbiAgaXNDSURQYXRjaCgpeyByZXR1cm4gdGhpcy5jaWRQYXRjaCB9XG5cbiAgc2tpcENJRFNpYmxpbmcoZWwpe1xuICAgIHJldHVybiBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgZWwuZ2V0QXR0cmlidXRlKFBIWF9TS0lQKSAhPT0gbnVsbFxuICB9XG5cbiAgdGFyZ2V0Q0lEQ29udGFpbmVyKGh0bWwpe1xuICAgIGlmKCF0aGlzLmlzQ0lEUGF0Y2goKSl7IHJldHVybiB9XG4gICAgbGV0IFtmaXJzdCwgLi4ucmVzdF0gPSBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHRoaXMuY29udGFpbmVyLCB0aGlzLnRhcmdldENJRClcbiAgICBpZihyZXN0Lmxlbmd0aCA9PT0gMCAmJiBET00uY2hpbGROb2RlTGVuZ3RoKGh0bWwpID09PSAxKXtcbiAgICAgIHJldHVybiBmaXJzdFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmlyc3QgJiYgZmlyc3QucGFyZW50Tm9kZVxuICAgIH1cbiAgfVxuXG4gIC8vIGJ1aWxkcyBIVE1MIGZvciBtb3JwaGRvbSBwYXRjaFxuICAvLyAtIGZvciBmdWxsIHBhdGNoZXMgb2YgTGl2ZVZpZXcgb3IgYSBjb21wb25lbnQgd2l0aCBhIHNpbmdsZVxuICAvLyAgIHJvb3Qgbm9kZSwgc2ltcGx5IHJldHVybnMgdGhlIEhUTUxcbiAgLy8gLSBmb3IgcGF0Y2hlcyBvZiBhIGNvbXBvbmVudCB3aXRoIG11bHRpcGxlIHJvb3Qgbm9kZXMsIHRoZVxuICAvLyAgIHBhcmVudCBub2RlIGJlY29tZXMgdGhlIHRhcmdldCBjb250YWluZXIgYW5kIG5vbi1jb21wb25lbnRcbiAgLy8gICBzaWJsaW5ncyBhcmUgbWFya2VkIGFzIHNraXAuXG4gIGJ1aWxkRGlmZkhUTUwoY29udGFpbmVyLCBodG1sLCBwaHhVcGRhdGUsIHRhcmdldENvbnRhaW5lcil7XG4gICAgbGV0IGlzQ0lEUGF0Y2ggPSB0aGlzLmlzQ0lEUGF0Y2goKVxuICAgIGxldCBpc0NJRFdpdGhTaW5nbGVSb290ID0gaXNDSURQYXRjaCAmJiB0YXJnZXRDb250YWluZXIuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpID09PSB0aGlzLnRhcmdldENJRC50b1N0cmluZygpXG4gICAgaWYoIWlzQ0lEUGF0Y2ggfHwgaXNDSURXaXRoU2luZ2xlUm9vdCl7XG4gICAgICByZXR1cm4gaHRtbFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wb25lbnQgcGF0Y2ggd2l0aCBtdWx0aXBsZSBDSUQgcm9vdHNcbiAgICAgIGxldCBkaWZmQ29udGFpbmVyID0gbnVsbFxuICAgICAgbGV0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpXG4gICAgICBkaWZmQ29udGFpbmVyID0gRE9NLmNsb25lTm9kZSh0YXJnZXRDb250YWluZXIpXG4gICAgICBsZXQgW2ZpcnN0Q29tcG9uZW50LCAuLi5yZXN0XSA9IERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QoZGlmZkNvbnRhaW5lciwgdGhpcy50YXJnZXRDSUQpXG4gICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sXG4gICAgICByZXN0LmZvckVhY2goZWwgPT4gZWwucmVtb3ZlKCkpXG4gICAgICBBcnJheS5mcm9tKGRpZmZDb250YWluZXIuY2hpbGROb2RlcykuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIC8vIHdlIGNhbiBvbmx5IHNraXAgdHJhY2thYmxlIG5vZGVzIHdpdGggYW4gSURcbiAgICAgICAgaWYoY2hpbGQuaWQgJiYgY2hpbGQubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSAhPT0gdGhpcy50YXJnZXRDSUQudG9TdHJpbmcoKSl7XG4gICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKFBIWF9TS0lQLCBcIlwiKVxuICAgICAgICAgIGNoaWxkLmlubmVySFRNTCA9IFwiXCJcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIEFycmF5LmZyb20odGVtcGxhdGUuY29udGVudC5jaGlsZE5vZGVzKS5mb3JFYWNoKGVsID0+IGRpZmZDb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsLCBmaXJzdENvbXBvbmVudCkpXG4gICAgICBmaXJzdENvbXBvbmVudC5yZW1vdmUoKVxuICAgICAgcmV0dXJuIGRpZmZDb250YWluZXIub3V0ZXJIVE1MXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgQ09NUE9ORU5UUyxcbiAgRFlOQU1JQ1MsXG4gIEVWRU5UUyxcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX1NLSVAsXG4gIFJFUExZLFxuICBTVEFUSUMsXG4gIFRJVExFXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBsb2dFcnJvclxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlbmRlcmVkIHtcbiAgc3RhdGljIGV4dHJhY3QoZGlmZil7XG4gICAgbGV0IHtbUkVQTFldOiByZXBseSwgW0VWRU5UU106IGV2ZW50cywgW1RJVExFXTogdGl0bGV9ID0gZGlmZlxuICAgIGRlbGV0ZSBkaWZmW1JFUExZXVxuICAgIGRlbGV0ZSBkaWZmW0VWRU5UU11cbiAgICBkZWxldGUgZGlmZltUSVRMRV1cbiAgICByZXR1cm4ge2RpZmYsIHRpdGxlLCByZXBseTogcmVwbHkgfHwgbnVsbCwgZXZlbnRzOiBldmVudHMgfHwgW119XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3SWQsIHJlbmRlcmVkKXtcbiAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZFxuICAgIHRoaXMucmVuZGVyZWQgPSB7fVxuICAgIHRoaXMubWVyZ2VEaWZmKHJlbmRlcmVkKVxuICB9XG5cbiAgcGFyZW50Vmlld0lkKCl7IHJldHVybiB0aGlzLnZpZXdJZCB9XG5cbiAgdG9TdHJpbmcob25seUNpZHMpe1xuICAgIHJldHVybiB0aGlzLnJlY3Vyc2l2ZVRvU3RyaW5nKHRoaXMucmVuZGVyZWQsIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU10sIG9ubHlDaWRzKVxuICB9XG5cbiAgcmVjdXJzaXZlVG9TdHJpbmcocmVuZGVyZWQsIGNvbXBvbmVudHMgPSByZW5kZXJlZFtDT01QT05FTlRTXSwgb25seUNpZHMpe1xuICAgIG9ubHlDaWRzID0gb25seUNpZHMgPyBuZXcgU2V0KG9ubHlDaWRzKSA6IG51bGxcbiAgICBsZXQgb3V0cHV0ID0ge2J1ZmZlcjogXCJcIiwgY29tcG9uZW50czogY29tcG9uZW50cywgb25seUNpZHM6IG9ubHlDaWRzfVxuICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIG91dHB1dClcbiAgICByZXR1cm4gb3V0cHV0LmJ1ZmZlclxuICB9XG5cbiAgY29tcG9uZW50Q0lEcyhkaWZmKXsgcmV0dXJuIE9iamVjdC5rZXlzKGRpZmZbQ09NUE9ORU5UU10gfHwge30pLm1hcChpID0+IHBhcnNlSW50KGkpKSB9XG5cbiAgaXNDb21wb25lbnRPbmx5RGlmZihkaWZmKXtcbiAgICBpZighZGlmZltDT01QT05FTlRTXSl7IHJldHVybiBmYWxzZSB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGRpZmYpLmxlbmd0aCA9PT0gMVxuICB9XG5cbiAgZ2V0Q29tcG9uZW50KGRpZmYsIGNpZCl7IHJldHVybiBkaWZmW0NPTVBPTkVOVFNdW2NpZF0gfVxuXG4gIG1lcmdlRGlmZihkaWZmKXtcbiAgICBsZXQgbmV3YyA9IGRpZmZbQ09NUE9ORU5UU11cbiAgICBsZXQgY2FjaGUgPSB7fVxuICAgIGRlbGV0ZSBkaWZmW0NPTVBPTkVOVFNdXG4gICAgdGhpcy5yZW5kZXJlZCA9IHRoaXMubXV0YWJsZU1lcmdlKHRoaXMucmVuZGVyZWQsIGRpZmYpXG4gICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSA9IHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU10gfHwge31cblxuICAgIGlmKG5ld2Mpe1xuICAgICAgbGV0IG9sZGMgPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdXG5cbiAgICAgIGZvcihsZXQgY2lkIGluIG5ld2Mpe1xuICAgICAgICBuZXdjW2NpZF0gPSB0aGlzLmNhY2hlZEZpbmRDb21wb25lbnQoY2lkLCBuZXdjW2NpZF0sIG9sZGMsIG5ld2MsIGNhY2hlKVxuICAgICAgfVxuXG4gICAgICBmb3IodmFyIGtleSBpbiBuZXdjKXsgb2xkY1trZXldID0gbmV3Y1trZXldIH1cbiAgICAgIGRpZmZbQ09NUE9ORU5UU10gPSBuZXdjXG4gICAgfVxuICB9XG5cbiAgY2FjaGVkRmluZENvbXBvbmVudChjaWQsIGNkaWZmLCBvbGRjLCBuZXdjLCBjYWNoZSl7XG4gICAgaWYoY2FjaGVbY2lkXSl7XG4gICAgICByZXR1cm4gY2FjaGVbY2lkXVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbmRpZmYsIHN0YXQsIHNjaWQgPSBjZGlmZltTVEFUSUNdXG5cbiAgICAgIGlmKHR5cGVvZiAoc2NpZCkgPT09IFwibnVtYmVyXCIpe1xuICAgICAgICBsZXQgdGRpZmZcblxuICAgICAgICBpZihzY2lkID4gMCl7XG4gICAgICAgICAgdGRpZmYgPSB0aGlzLmNhY2hlZEZpbmRDb21wb25lbnQoc2NpZCwgbmV3Y1tzY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGRpZmYgPSBvbGRjWy1zY2lkXVxuICAgICAgICB9XG5cbiAgICAgICAgc3RhdCA9IHRkaWZmW1NUQVRJQ11cbiAgICAgICAgbmRpZmYgPSB0aGlzLmNsb25lTWVyZ2UodGRpZmYsIGNkaWZmKVxuICAgICAgICBuZGlmZltTVEFUSUNdID0gc3RhdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmRpZmYgPSBjZGlmZltTVEFUSUNdICE9PSB1bmRlZmluZWQgPyBjZGlmZiA6IHRoaXMuY2xvbmVNZXJnZShvbGRjW2NpZF0gfHwge30sIGNkaWZmKVxuICAgICAgfVxuXG4gICAgICBjYWNoZVtjaWRdID0gbmRpZmZcbiAgICAgIHJldHVybiBuZGlmZlxuICAgIH1cbiAgfVxuXG4gIG11dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSl7XG4gICAgaWYoc291cmNlW1NUQVRJQ10gIT09IHVuZGVmaW5lZCl7XG4gICAgICByZXR1cm4gc291cmNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9NdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2UpXG4gICAgICByZXR1cm4gdGFyZ2V0XG4gICAgfVxuICB9XG5cbiAgZG9NdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2Upe1xuICAgIGZvcihsZXQga2V5IGluIHNvdXJjZSl7XG4gICAgICBsZXQgdmFsID0gc291cmNlW2tleV1cbiAgICAgIGxldCB0YXJnZXRWYWwgPSB0YXJnZXRba2V5XVxuICAgICAgaWYoaXNPYmplY3QodmFsKSAmJiB2YWxbU1RBVElDXSA9PT0gdW5kZWZpbmVkICYmIGlzT2JqZWN0KHRhcmdldFZhbCkpe1xuICAgICAgICB0aGlzLmRvTXV0YWJsZU1lcmdlKHRhcmdldFZhbCwgdmFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbG9uZU1lcmdlKHRhcmdldCwgc291cmNlKXtcbiAgICBsZXQgbWVyZ2VkID0gey4uLnRhcmdldCwgLi4uc291cmNlfVxuICAgIGZvcihsZXQga2V5IGluIG1lcmdlZCl7XG4gICAgICBsZXQgdmFsID0gc291cmNlW2tleV1cbiAgICAgIGxldCB0YXJnZXRWYWwgPSB0YXJnZXRba2V5XVxuICAgICAgaWYoaXNPYmplY3QodmFsKSAmJiB2YWxbU1RBVElDXSA9PT0gdW5kZWZpbmVkICYmIGlzT2JqZWN0KHRhcmdldFZhbCkpe1xuICAgICAgICBtZXJnZWRba2V5XSA9IHRoaXMuY2xvbmVNZXJnZSh0YXJnZXRWYWwsIHZhbClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFxuICB9XG5cbiAgY29tcG9uZW50VG9TdHJpbmcoY2lkKXsgcmV0dXJuIHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcodGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSwgY2lkKSB9XG5cbiAgcHJ1bmVDSURzKGNpZHMpe1xuICAgIGNpZHMuZm9yRWFjaChjaWQgPT4gZGVsZXRlIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11bY2lkXSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBnZXQoKXsgcmV0dXJuIHRoaXMucmVuZGVyZWQgfVxuXG4gIGlzTmV3RmluZ2VycHJpbnQoZGlmZiA9IHt9KXsgcmV0dXJuICEhZGlmZltTVEFUSUNdIH1cblxuICB0b091dHB1dEJ1ZmZlcihyZW5kZXJlZCwgb3V0cHV0KXtcbiAgICBpZihyZW5kZXJlZFtEWU5BTUlDU10peyByZXR1cm4gdGhpcy5jb21wcmVoZW5zaW9uVG9CdWZmZXIocmVuZGVyZWQsIG91dHB1dCkgfVxuICAgIGxldCB7W1NUQVRJQ106IHN0YXRpY3N9ID0gcmVuZGVyZWRcblxuICAgIG91dHB1dC5idWZmZXIgKz0gc3RhdGljc1swXVxuICAgIGZvcihsZXQgaSA9IDE7IGkgPCBzdGF0aWNzLmxlbmd0aDsgaSsrKXtcbiAgICAgIHRoaXMuZHluYW1pY1RvQnVmZmVyKHJlbmRlcmVkW2kgLSAxXSwgb3V0cHV0KVxuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzW2ldXG4gICAgfVxuICB9XG5cbiAgY29tcHJlaGVuc2lvblRvQnVmZmVyKHJlbmRlcmVkLCBvdXRwdXQpe1xuICAgIGxldCB7W0RZTkFNSUNTXTogZHluYW1pY3MsIFtTVEFUSUNdOiBzdGF0aWNzfSA9IHJlbmRlcmVkXG5cbiAgICBmb3IobGV0IGQgPSAwOyBkIDwgZHluYW1pY3MubGVuZ3RoOyBkKyspe1xuICAgICAgbGV0IGR5bmFtaWMgPSBkeW5hbWljc1tkXVxuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzWzBdXG4gICAgICBmb3IobGV0IGkgPSAxOyBpIDwgc3RhdGljcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHRoaXMuZHluYW1pY1RvQnVmZmVyKGR5bmFtaWNbaSAtIDFdLCBvdXRwdXQpXG4gICAgICAgIG91dHB1dC5idWZmZXIgKz0gc3RhdGljc1tpXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZCwgb3V0cHV0KXtcbiAgICBpZih0eXBlb2YgKHJlbmRlcmVkKSA9PT0gXCJudW1iZXJcIil7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcob3V0cHV0LmNvbXBvbmVudHMsIHJlbmRlcmVkLCBvdXRwdXQub25seUNpZHMpXG4gICAgfSBlbHNlIGlmKGlzT2JqZWN0KHJlbmRlcmVkKSl7XG4gICAgICB0aGlzLnRvT3V0cHV0QnVmZmVyKHJlbmRlcmVkLCBvdXRwdXQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5idWZmZXIgKz0gcmVuZGVyZWRcbiAgICB9XG4gIH1cblxuICByZWN1cnNpdmVDSURUb1N0cmluZyhjb21wb25lbnRzLCBjaWQsIG9ubHlDaWRzKXtcbiAgICBsZXQgY29tcG9uZW50ID0gY29tcG9uZW50c1tjaWRdIHx8IGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm9yIENJRCAke2NpZH1gLCBjb21wb25lbnRzKVxuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHRoaXMucmVjdXJzaXZlVG9TdHJpbmcoY29tcG9uZW50LCBjb21wb25lbnRzLCBvbmx5Q2lkcylcbiAgICBsZXQgY29udGFpbmVyID0gdGVtcGxhdGUuY29udGVudFxuICAgIGxldCBza2lwID0gb25seUNpZHMgJiYgIW9ubHlDaWRzLmhhcyhjaWQpXG5cbiAgICBsZXQgW2hhc0NoaWxkTm9kZXMsIGhhc0NoaWxkQ29tcG9uZW50c10gPVxuICAgICAgQXJyYXkuZnJvbShjb250YWluZXIuY2hpbGROb2RlcykucmVkdWNlKChbaGFzTm9kZXMsIGhhc0NvbXBvbmVudHNdLCBjaGlsZCwgaSkgPT4ge1xuICAgICAgICBpZihjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpe1xuICAgICAgICAgIGlmKGNoaWxkLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSl7XG4gICAgICAgICAgICByZXR1cm4gW2hhc05vZGVzLCB0cnVlXVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVCwgY2lkKVxuICAgICAgICAgIGlmKCFjaGlsZC5pZCl7IGNoaWxkLmlkID0gYCR7dGhpcy5wYXJlbnRWaWV3SWQoKX0tJHtjaWR9LSR7aX1gIH1cbiAgICAgICAgICBpZihza2lwKXtcbiAgICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShQSFhfU0tJUCwgXCJcIilcbiAgICAgICAgICAgIGNoaWxkLmlubmVySFRNTCA9IFwiXCJcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFt0cnVlLCBoYXNDb21wb25lbnRzXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmKGNoaWxkLm5vZGVWYWx1ZS50cmltKCkgIT09IFwiXCIpe1xuICAgICAgICAgICAgbG9nRXJyb3IoXCJvbmx5IEhUTUwgZWxlbWVudCB0YWdzIGFyZSBhbGxvd2VkIGF0IHRoZSByb290IG9mIGNvbXBvbmVudHMuXFxuXFxuXCIgK1xuICAgICAgICAgICAgICBgZ290OiBcIiR7Y2hpbGQubm9kZVZhbHVlLnRyaW0oKX1cIlxcblxcbmAgK1xuICAgICAgICAgICAgICBcIndpdGhpbjpcXG5cIiwgdGVtcGxhdGUuaW5uZXJIVE1MLnRyaW0oKSlcbiAgICAgICAgICAgIGNoaWxkLnJlcGxhY2VXaXRoKHRoaXMuY3JlYXRlU3BhbihjaGlsZC5ub2RlVmFsdWUsIGNpZCkpXG4gICAgICAgICAgICByZXR1cm4gW3RydWUsIGhhc0NvbXBvbmVudHNdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoaWxkLnJlbW92ZSgpXG4gICAgICAgICAgICByZXR1cm4gW2hhc05vZGVzLCBoYXNDb21wb25lbnRzXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgW2ZhbHNlLCBmYWxzZV0pXG5cbiAgICBpZighaGFzQ2hpbGROb2RlcyAmJiAhaGFzQ2hpbGRDb21wb25lbnRzKXtcbiAgICAgIGxvZ0Vycm9yKFwiZXhwZWN0ZWQgYXQgbGVhc3Qgb25lIEhUTUwgZWxlbWVudCB0YWcgaW5zaWRlIGEgY29tcG9uZW50LCBidXQgdGhlIGNvbXBvbmVudCBpcyBlbXB0eTpcXG5cIixcbiAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MLnRyaW0oKSlcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNwYW4oXCJcIiwgY2lkKS5vdXRlckhUTUxcbiAgICB9IGVsc2UgaWYoIWhhc0NoaWxkTm9kZXMgJiYgaGFzQ2hpbGRDb21wb25lbnRzKXtcbiAgICAgIGxvZ0Vycm9yKFwiZXhwZWN0ZWQgYXQgbGVhc3Qgb25lIEhUTUwgZWxlbWVudCB0YWcgZGlyZWN0bHkgaW5zaWRlIGEgY29tcG9uZW50LCBidXQgb25seSBzdWJjb21wb25lbnRzIHdlcmUgZm91bmQuIEEgY29tcG9uZW50IG11c3QgcmVuZGVyIGF0IGxlYXN0IG9uZSBIVE1MIHRhZyBkaXJlY3RseSBpbnNpZGUgaXRzZWxmLlwiLFxuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwudHJpbSgpKVxuICAgICAgcmV0dXJuIHRlbXBsYXRlLmlubmVySFRNTFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGVtcGxhdGUuaW5uZXJIVE1MXG4gICAgfVxuICB9XG5cbiAgY3JlYXRlU3Bhbih0ZXh0LCBjaWQpe1xuICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIilcbiAgICBzcGFuLmlubmVyVGV4dCA9IHRleHRcbiAgICBzcGFuLnNldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5ULCBjaWQpXG4gICAgcmV0dXJuIHNwYW5cbiAgfVxufVxuIiwgImxldCB2aWV3SG9va0lEID0gMVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld0hvb2sge1xuICBzdGF0aWMgbWFrZUlEKCl7IHJldHVybiB2aWV3SG9va0lEKysgfVxuICBzdGF0aWMgZWxlbWVudElEKGVsKXsgcmV0dXJuIGVsLnBoeEhvb2tJZCB9XG5cbiAgY29uc3RydWN0b3IodmlldywgZWwsIGNhbGxiYWNrcyl7XG4gICAgdGhpcy5fX3ZpZXcgPSB2aWV3XG4gICAgdGhpcy5fX2xpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXRcbiAgICB0aGlzLl9fY2FsbGJhY2tzID0gY2FsbGJhY2tzXG4gICAgdGhpcy5fX2xpc3RlbmVycyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuX19pc0Rpc2Nvbm5lY3RlZCA9IGZhbHNlXG4gICAgdGhpcy5lbCA9IGVsXG4gICAgdGhpcy5lbC5waHhIb29rSWQgPSB0aGlzLmNvbnN0cnVjdG9yLm1ha2VJRCgpXG4gICAgZm9yKGxldCBrZXkgaW4gdGhpcy5fX2NhbGxiYWNrcyl7IHRoaXNba2V5XSA9IHRoaXMuX19jYWxsYmFja3Nba2V5XSB9XG4gIH1cblxuICBfX21vdW50ZWQoKXsgdGhpcy5tb3VudGVkICYmIHRoaXMubW91bnRlZCgpIH1cbiAgX191cGRhdGVkKCl7IHRoaXMudXBkYXRlZCAmJiB0aGlzLnVwZGF0ZWQoKSB9XG4gIF9fYmVmb3JlVXBkYXRlKCl7IHRoaXMuYmVmb3JlVXBkYXRlICYmIHRoaXMuYmVmb3JlVXBkYXRlKCkgfVxuICBfX2Rlc3Ryb3llZCgpeyB0aGlzLmRlc3Ryb3llZCAmJiB0aGlzLmRlc3Ryb3llZCgpIH1cbiAgX19yZWNvbm5lY3RlZCgpe1xuICAgIGlmKHRoaXMuX19pc0Rpc2Nvbm5lY3RlZCl7XG4gICAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZVxuICAgICAgdGhpcy5yZWNvbm5lY3RlZCAmJiB0aGlzLnJlY29ubmVjdGVkKClcbiAgICB9XG4gIH1cbiAgX19kaXNjb25uZWN0ZWQoKXtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSB0cnVlXG4gICAgdGhpcy5kaXNjb25uZWN0ZWQgJiYgdGhpcy5kaXNjb25uZWN0ZWQoKVxuICB9XG5cbiAgcHVzaEV2ZW50KGV2ZW50LCBwYXlsb2FkID0ge30sIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3LnB1c2hIb29rRXZlbnQobnVsbCwgZXZlbnQsIHBheWxvYWQsIG9uUmVwbHkpXG4gIH1cblxuICBwdXNoRXZlbnRUbyhwaHhUYXJnZXQsIGV2ZW50LCBwYXlsb2FkID0ge30sIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3LndpdGhpblRhcmdldHMocGh4VGFyZ2V0LCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICByZXR1cm4gdmlldy5wdXNoSG9va0V2ZW50KHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQsIG9uUmVwbHkpXG4gICAgfSlcbiAgfVxuXG4gIGhhbmRsZUV2ZW50KGV2ZW50LCBjYWxsYmFjayl7XG4gICAgbGV0IGNhbGxiYWNrUmVmID0gKGN1c3RvbUV2ZW50LCBieXBhc3MpID0+IGJ5cGFzcyA/IGV2ZW50IDogY2FsbGJhY2soY3VzdG9tRXZlbnQuZGV0YWlsKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGBwaHg6aG9vazoke2V2ZW50fWAsIGNhbGxiYWNrUmVmKVxuICAgIHRoaXMuX19saXN0ZW5lcnMuYWRkKGNhbGxiYWNrUmVmKVxuICAgIHJldHVybiBjYWxsYmFja1JlZlxuICB9XG5cbiAgcmVtb3ZlSGFuZGxlRXZlbnQoY2FsbGJhY2tSZWYpe1xuICAgIGxldCBldmVudCA9IGNhbGxiYWNrUmVmKG51bGwsIHRydWUpXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHBoeDpob29rOiR7ZXZlbnR9YCwgY2FsbGJhY2tSZWYpXG4gICAgdGhpcy5fX2xpc3RlbmVycy5kZWxldGUoY2FsbGJhY2tSZWYpXG4gIH1cblxuICB1cGxvYWQobmFtZSwgZmlsZXMpe1xuICAgIHJldHVybiB0aGlzLl9fdmlldy5kaXNwYXRjaFVwbG9hZHMobmFtZSwgZmlsZXMpXG4gIH1cblxuICB1cGxvYWRUbyhwaHhUYXJnZXQsIG5hbWUsIGZpbGVzKXtcbiAgICByZXR1cm4gdGhpcy5fX3ZpZXcud2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIHZpZXcgPT4gdmlldy5kaXNwYXRjaFVwbG9hZHMobmFtZSwgZmlsZXMpKVxuICB9XG5cbiAgX19jbGVhbnVwX18oKXtcbiAgICB0aGlzLl9fbGlzdGVuZXJzLmZvckVhY2goY2FsbGJhY2tSZWYgPT4gdGhpcy5yZW1vdmVIYW5kbGVFdmVudChjYWxsYmFja1JlZikpXG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VULFxuICBDSEVDS0FCTEVfSU5QVVRTLFxuICBDT05TRUNVVElWRV9SRUxPQURTLFxuICBQSFhfQVVUT19SRUNPVkVSLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfQ09OTkVDVEVEX0NMQVNTLFxuICBQSFhfRElTQUJMRV9XSVRILFxuICBQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsXG4gIFBIWF9ESVNBQkxFRCxcbiAgUEhYX0RJU0NPTk5FQ1RFRF9DTEFTUyxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFBIWF9FUlJPUl9DTEFTUyxcbiAgUEhYX0ZFRURCQUNLX0ZPUixcbiAgUEhYX0hBU19TVUJNSVRURUQsXG4gIFBIWF9IT09LLFxuICBQSFhfUEFHRV9MT0FESU5HLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfUFJPR1JFU1MsXG4gIFBIWF9SRUFET05MWSxcbiAgUEhYX1JFRixcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9TRVNTSU9OLFxuICBQSFhfU1RBVElDLFxuICBQSFhfVFJBQ0tfU1RBVElDLFxuICBQSFhfVFJBQ0tfVVBMT0FEUyxcbiAgUEhYX1VQREFURSxcbiAgUEhYX1VQTE9BRF9SRUYsXG4gIFBIWF9WSUVXX1NFTEVDVE9SLFxuICBQVVNIX1RJTUVPVVQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgaXNFbXB0eSxcbiAgaXNFcXVhbE9iaixcbiAgbG9nRXJyb3IsXG4gIG1heWJlXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiXG5pbXBvcnQgRE9NUGF0Y2ggZnJvbSBcIi4vZG9tX3BhdGNoXCJcbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiXG5pbXBvcnQgUmVuZGVyZWQgZnJvbSBcIi4vcmVuZGVyZWRcIlxuaW1wb3J0IFZpZXdIb29rIGZyb20gXCIuL3ZpZXdfaG9va1wiXG5cbmxldCBzZXJpYWxpemVGb3JtID0gKGZvcm0sIG1ldGEgPSB7fSkgPT4ge1xuICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSlcbiAgbGV0IHRvUmVtb3ZlID0gW11cblxuICBmb3JtRGF0YS5mb3JFYWNoKCh2YWwsIGtleSwgX2luZGV4KSA9PiB7XG4gICAgaWYodmFsIGluc3RhbmNlb2YgRmlsZSl7IHRvUmVtb3ZlLnB1c2goa2V5KSB9XG4gIH0pXG5cbiAgLy8gQ2xlYW51cCBhZnRlciBidWlsZGluZyBmaWxlRGF0YVxuICB0b1JlbW92ZS5mb3JFYWNoKGtleSA9PiBmb3JtRGF0YS5kZWxldGUoa2V5KSlcblxuICBsZXQgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gIGZvcihsZXQgW2tleSwgdmFsXSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpeyBwYXJhbXMuYXBwZW5kKGtleSwgdmFsKSB9XG4gIGZvcihsZXQgbWV0YUtleSBpbiBtZXRhKXsgcGFyYW1zLmFwcGVuZChtZXRhS2V5LCBtZXRhW21ldGFLZXldKSB9XG5cbiAgcmV0dXJuIHBhcmFtcy50b1N0cmluZygpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuICBjb25zdHJ1Y3RvcihlbCwgbGl2ZVNvY2tldCwgcGFyZW50VmlldywgZmxhc2gpe1xuICAgIHRoaXMubGl2ZVNvY2tldCA9IGxpdmVTb2NrZXRcbiAgICB0aGlzLmZsYXNoID0gZmxhc2hcbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudFZpZXdcbiAgICB0aGlzLnJvb3QgPSBwYXJlbnRWaWV3ID8gcGFyZW50Vmlldy5yb290IDogdGhpc1xuICAgIHRoaXMuZWwgPSBlbFxuICAgIHRoaXMuaWQgPSB0aGlzLmVsLmlkXG4gICAgdGhpcy5yZWYgPSAwXG4gICAgdGhpcy5jaGlsZEpvaW5zID0gMFxuICAgIHRoaXMubG9hZGVyVGltZXIgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXVxuICAgIHRoaXMucHJ1bmluZ0NJRHMgPSBbXVxuICAgIHRoaXMucmVkaXJlY3QgPSBmYWxzZVxuICAgIHRoaXMuaHJlZiA9IG51bGxcbiAgICB0aGlzLmpvaW5Db3VudCA9IHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQuam9pbkNvdW50IC0gMSA6IDBcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZVxuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2VcbiAgICB0aGlzLmpvaW5DYWxsYmFjayA9IGZ1bmN0aW9uICgpeyB9XG4gICAgdGhpcy5zdG9wQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKXsgfVxuICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSB0aGlzLnBhcmVudCA/IG51bGwgOiBbXVxuICAgIHRoaXMudmlld0hvb2tzID0ge31cbiAgICB0aGlzLnVwbG9hZGVycyA9IHt9XG4gICAgdGhpcy5mb3JtU3VibWl0cyA9IFtdXG4gICAgdGhpcy5jaGlsZHJlbiA9IHRoaXMucGFyZW50ID8gbnVsbCA6IHt9XG4gICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdID0ge31cbiAgICB0aGlzLmNoYW5uZWwgPSB0aGlzLmxpdmVTb2NrZXQuY2hhbm5lbChgbHY6JHt0aGlzLmlkfWAsICgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZGlyZWN0OiB0aGlzLnJlZGlyZWN0ID8gdGhpcy5ocmVmIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmw6IHRoaXMucmVkaXJlY3QgPyB1bmRlZmluZWQgOiB0aGlzLmhyZWYgfHwgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXM6IHRoaXMuY29ubmVjdFBhcmFtcygpLFxuICAgICAgICBzZXNzaW9uOiB0aGlzLmdldFNlc3Npb24oKSxcbiAgICAgICAgc3RhdGljOiB0aGlzLmdldFN0YXRpYygpLFxuICAgICAgICBmbGFzaDogdGhpcy5mbGFzaFxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5zaG93TG9hZGVyKHRoaXMubGl2ZVNvY2tldC5sb2FkZXJUaW1lb3V0KVxuICAgIHRoaXMuYmluZENoYW5uZWwoKVxuICB9XG5cbiAgc2V0SHJlZihocmVmKXsgdGhpcy5ocmVmID0gaHJlZiB9XG5cbiAgc2V0UmVkaXJlY3QoaHJlZil7XG4gICAgdGhpcy5yZWRpcmVjdCA9IHRydWVcbiAgICB0aGlzLmhyZWYgPSBocmVmXG4gIH1cblxuICBpc01haW4oKXsgcmV0dXJuIHRoaXMubGl2ZVNvY2tldC5tYWluID09PSB0aGlzIH1cblxuICBjb25uZWN0UGFyYW1zKCl7XG4gICAgbGV0IHBhcmFtcyA9IHRoaXMubGl2ZVNvY2tldC5wYXJhbXModGhpcy5lbClcbiAgICBsZXQgbWFuaWZlc3QgPVxuICAgICAgRE9NLmFsbChkb2N1bWVudCwgYFske3RoaXMuYmluZGluZyhQSFhfVFJBQ0tfU1RBVElDKX1dYClcbiAgICAgICAgLm1hcChub2RlID0+IG5vZGUuc3JjIHx8IG5vZGUuaHJlZikuZmlsdGVyKHVybCA9PiB0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cbiAgICBpZihtYW5pZmVzdC5sZW5ndGggPiAwKXsgcGFyYW1zW1wiX3RyYWNrX3N0YXRpY1wiXSA9IG1hbmlmZXN0IH1cbiAgICBwYXJhbXNbXCJfbW91bnRzXCJdID0gdGhpcy5qb2luQ291bnRcblxuICAgIHJldHVybiBwYXJhbXNcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCl7IHJldHVybiB0aGlzLmNoYW5uZWwuY2FuUHVzaCgpIH1cblxuICBnZXRTZXNzaW9uKCl7IHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTikgfVxuXG4gIGdldFN0YXRpYygpe1xuICAgIGxldCB2YWwgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU1RBVElDKVxuICAgIHJldHVybiB2YWwgPT09IFwiXCIgPyBudWxsIDogdmFsXG4gIH1cblxuICBkZXN0cm95KGNhbGxiYWNrID0gZnVuY3Rpb24gKCl7IH0pe1xuICAgIHRoaXMuZGVzdHJveUFsbENoaWxkcmVuKClcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWVcbiAgICBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdXG4gICAgaWYodGhpcy5wYXJlbnQpeyBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucGFyZW50LmlkXVt0aGlzLmlkXSB9XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGVyVGltZXIpXG4gICAgbGV0IG9uRmluaXNoZWQgPSAoKSA9PiB7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICBmb3IobGV0IGlkIGluIHRoaXMudmlld0hvb2tzKXtcbiAgICAgICAgdGhpcy5kZXN0cm95SG9vayh0aGlzLnZpZXdIb29rc1tpZF0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgRE9NLm1hcmtQaHhDaGlsZERlc3Ryb3llZCh0aGlzLmVsKVxuXG4gICAgdGhpcy5sb2coXCJkZXN0cm95ZWRcIiwgKCkgPT4gW1widGhlIGNoaWxkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50XCJdKVxuICAgIHRoaXMuY2hhbm5lbC5sZWF2ZSgpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgb25GaW5pc2hlZClcbiAgfVxuXG4gIHNldENvbnRhaW5lckNsYXNzZXMoLi4uY2xhc3Nlcyl7XG4gICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgUEhYX0NPTk5FQ1RFRF9DTEFTUyxcbiAgICAgIFBIWF9ESVNDT05ORUNURURfQ0xBU1MsXG4gICAgICBQSFhfRVJST1JfQ0xBU1NcbiAgICApXG4gICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzZXMpXG4gIH1cblxuICBpc0xvYWRpbmcoKXsgcmV0dXJuIHRoaXMuZWwuY2xhc3NMaXN0LmNvbnRhaW5zKFBIWF9ESVNDT05ORUNURURfQ0xBU1MpIH1cblxuICBzaG93TG9hZGVyKHRpbWVvdXQpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKVxuICAgIGlmKHRpbWVvdXQpe1xuICAgICAgdGhpcy5sb2FkZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zaG93TG9hZGVyKCksIHRpbWVvdXQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcihsZXQgaWQgaW4gdGhpcy52aWV3SG9va3MpeyB0aGlzLnZpZXdIb29rc1tpZF0uX19kaXNjb25uZWN0ZWQoKSB9XG4gICAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoUEhYX0RJU0NPTk5FQ1RFRF9DTEFTUylcbiAgICB9XG4gIH1cblxuICBoaWRlTG9hZGVyKCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGVyVGltZXIpXG4gICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9DT05ORUNURURfQ0xBU1MpXG4gIH1cblxuICB0cmlnZ2VyUmVjb25uZWN0ZWQoKXtcbiAgICBmb3IobGV0IGlkIGluIHRoaXMudmlld0hvb2tzKXsgdGhpcy52aWV3SG9va3NbaWRdLl9fcmVjb25uZWN0ZWQoKSB9XG4gIH1cblxuICBsb2coa2luZCwgbXNnQ2FsbGJhY2spe1xuICAgIHRoaXMubGl2ZVNvY2tldC5sb2codGhpcywga2luZCwgbXNnQ2FsbGJhY2spXG4gIH1cblxuICB3aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgY2FsbGJhY2spe1xuICAgIGlmKHBoeFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KXtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQub3duZXIocGh4VGFyZ2V0LCB2aWV3ID0+IGNhbGxiYWNrKHZpZXcsIHBoeFRhcmdldCkpXG4gICAgfVxuXG4gICAgaWYoL14oMHxbMS05XVxcZCopJC8udGVzdChwaHhUYXJnZXQpKXtcbiAgICAgIGxldCB0YXJnZXRzID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmVsLCBwaHhUYXJnZXQpXG4gICAgICBpZih0YXJnZXRzLmxlbmd0aCA9PT0gMCl7XG4gICAgICAgIGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm91bmQgbWF0Y2hpbmcgcGh4LXRhcmdldCBvZiAke3BoeFRhcmdldH1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sodGhpcywgdGFyZ2V0c1swXSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRhcmdldHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGh4VGFyZ2V0KSlcbiAgICAgIGlmKHRhcmdldHMubGVuZ3RoID09PSAwKXsgbG9nRXJyb3IoYG5vdGhpbmcgZm91bmQgbWF0Y2hpbmcgdGhlIHBoeC10YXJnZXQgc2VsZWN0b3IgXCIke3BoeFRhcmdldH1cImApIH1cbiAgICAgIHRhcmdldHMuZm9yRWFjaCh0YXJnZXQgPT4gdGhpcy5saXZlU29ja2V0Lm93bmVyKHRhcmdldCwgdmlldyA9PiBjYWxsYmFjayh2aWV3LCB0YXJnZXQpKSlcbiAgICB9XG4gIH1cblxuICBhcHBseURpZmYodHlwZSwgcmF3RGlmZiwgY2FsbGJhY2spe1xuICAgIHRoaXMubG9nKHR5cGUsICgpID0+IFtcIlwiLCBjbG9uZShyYXdEaWZmKV0pXG4gICAgbGV0IHtkaWZmLCByZXBseSwgZXZlbnRzLCB0aXRsZX0gPSBSZW5kZXJlZC5leHRyYWN0KHJhd0RpZmYpXG4gICAgaWYodGl0bGUpeyBET00ucHV0VGl0bGUodGl0bGUpIH1cblxuICAgIGNhbGxiYWNrKHtkaWZmLCByZXBseSwgZXZlbnRzfSlcbiAgICByZXR1cm4gcmVwbHlcbiAgfVxuXG4gIG9uSm9pbihyZXNwKXtcbiAgICBsZXQge3JlbmRlcmVkLCBjb250YWluZXJ9ID0gcmVzcFxuICAgIGlmKGNvbnRhaW5lcil7XG4gICAgICBsZXQgW3RhZywgYXR0cnNdID0gY29udGFpbmVyXG4gICAgICB0aGlzLmVsID0gRE9NLnJlcGxhY2VSb290Q29udGFpbmVyKHRoaXMuZWwsIHRhZywgYXR0cnMpXG4gICAgfVxuICAgIHRoaXMuY2hpbGRKb2lucyA9IDBcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZVxuICAgIHRoaXMuZmxhc2ggPSBudWxsXG5cbiAgICBCcm93c2VyLmRyb3BMb2NhbCh0aGlzLmxpdmVTb2NrZXQubG9jYWxTdG9yYWdlLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsIENPTlNFQ1VUSVZFX1JFTE9BRFMpXG4gICAgdGhpcy5hcHBseURpZmYoXCJtb3VudFwiLCByZW5kZXJlZCwgKHtkaWZmLCBldmVudHN9KSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVkID0gbmV3IFJlbmRlcmVkKHRoaXMuaWQsIGRpZmYpXG4gICAgICBsZXQgaHRtbCA9IHRoaXMucmVuZGVyQ29udGFpbmVyKG51bGwsIFwiam9pblwiKVxuICAgICAgdGhpcy5kcm9wUGVuZGluZ1JlZnMoKVxuICAgICAgbGV0IGZvcm1zID0gdGhpcy5mb3Jtc0ZvclJlY292ZXJ5KGh0bWwpXG4gICAgICB0aGlzLmpvaW5Db3VudCsrXG5cbiAgICAgIGlmKGZvcm1zLmxlbmd0aCA+IDApe1xuICAgICAgICBmb3Jtcy5mb3JFYWNoKChmb3JtLCBpKSA9PiB7XG4gICAgICAgICAgdGhpcy5wdXNoRm9ybVJlY292ZXJ5KGZvcm0sIHJlc3AgPT4ge1xuICAgICAgICAgICAgaWYoaSA9PT0gZm9ybXMubGVuZ3RoIC0gMSl7XG4gICAgICAgICAgICAgIHRoaXMub25Kb2luQ29tcGxldGUocmVzcCwgaHRtbCwgZXZlbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uSm9pbkNvbXBsZXRlKHJlc3AsIGh0bWwsIGV2ZW50cylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZHJvcFBlbmRpbmdSZWZzKCl7IERPTS5hbGwodGhpcy5lbCwgYFske1BIWF9SRUZ9XWAsIGVsID0+IGVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGKSkgfVxuXG4gIG9uSm9pbkNvbXBsZXRlKHtsaXZlX3BhdGNofSwgaHRtbCwgZXZlbnRzKXtcbiAgICAvLyBJbiBvcmRlciB0byBwcm92aWRlIGEgYmV0dGVyIGV4cGVyaWVuY2UsIHdlIHdhbnQgdG8gam9pblxuICAgIC8vIGFsbCBMaXZlVmlld3MgZmlyc3QgYW5kIG9ubHkgdGhlbiBhcHBseSB0aGVpciBwYXRjaGVzLlxuICAgIGlmKHRoaXMuam9pbkNvdW50ID4gMSB8fCAodGhpcy5wYXJlbnQgJiYgIXRoaXMucGFyZW50LmlzSm9pblBlbmRpbmcoKSkpe1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgZXZlbnRzKVxuICAgIH1cblxuICAgIC8vIE9uZSBkb3duc2lkZSBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgd2UgbmVlZCB0byBmaW5kIHBoeENoaWxkcmVuXG4gICAgLy8gaW4gdGhlIGh0bWwgZnJhZ21lbnQsIGluc3RlYWQgb2YgZGlyZWN0bHkgb24gdGhlIERPTS4gVGhlIGZyYWdtZW50XG4gICAgLy8gYWxzbyBkb2VzIG5vdCBpbmNsdWRlIFBIWF9TVEFUSUMsIHNvIHdlIG5lZWQgdG8gY29weSBpdCBvdmVyIGZyb21cbiAgICAvLyB0aGUgRE9NLlxuICAgIGxldCBuZXdDaGlsZHJlbiA9IERPTS5maW5kUGh4Q2hpbGRyZW5JbkZyYWdtZW50KGh0bWwsIHRoaXMuaWQpLmZpbHRlcih0b0VsID0+IHtcbiAgICAgIGxldCBmcm9tRWwgPSB0b0VsLmlkICYmIHRoaXMuZWwucXVlcnlTZWxlY3RvcihgW2lkPVwiJHt0b0VsLmlkfVwiXWApXG4gICAgICBsZXQgcGh4U3RhdGljID0gZnJvbUVsICYmIGZyb21FbC5nZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQylcbiAgICAgIGlmKHBoeFN0YXRpYyl7IHRvRWwuc2V0QXR0cmlidXRlKFBIWF9TVEFUSUMsIHBoeFN0YXRpYykgfVxuICAgICAgcmV0dXJuIHRoaXMuam9pbkNoaWxkKHRvRWwpXG4gICAgfSlcblxuICAgIGlmKG5ld0NoaWxkcmVuLmxlbmd0aCA9PT0gMCl7XG4gICAgICBpZih0aGlzLnBhcmVudCl7XG4gICAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiB0aGlzLmFwcGx5Sm9pblBhdGNoKGxpdmVfcGF0Y2gsIGh0bWwsIGV2ZW50cyldKVxuICAgICAgICB0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKClcbiAgICAgICAgdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBldmVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiB0aGlzLmFwcGx5Sm9pblBhdGNoKGxpdmVfcGF0Y2gsIGh0bWwsIGV2ZW50cyldKVxuICAgIH1cbiAgfVxuXG4gIGF0dGFjaFRydWVEb2NFbCgpe1xuICAgIHRoaXMuZWwgPSBET00uYnlJZCh0aGlzLmlkKVxuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKFBIWF9ST09UX0lELCB0aGlzLnJvb3QuaWQpXG4gIH1cblxuICBkaXNwYXRjaEV2ZW50cyhldmVudHMpe1xuICAgIGV2ZW50cy5mb3JFYWNoKChbZXZlbnQsIHBheWxvYWRdKSA9PiB7XG4gICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoYHBoeDpob29rOiR7ZXZlbnR9YCwge2RldGFpbDogcGF5bG9hZH0pKVxuICAgIH0pXG4gIH1cblxuICBhcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBldmVudHMpe1xuICAgIHRoaXMuYXR0YWNoVHJ1ZURvY0VsKClcbiAgICBsZXQgcGF0Y2ggPSBuZXcgRE9NUGF0Y2godGhpcywgdGhpcy5lbCwgdGhpcy5pZCwgaHRtbCwgbnVsbClcbiAgICBwYXRjaC5tYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpXG4gICAgdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIGZhbHNlKVxuICAgIHRoaXMuam9pbk5ld0NoaWxkcmVuKClcbiAgICBET00uYWxsKHRoaXMuZWwsIGBbJHt0aGlzLmJpbmRpbmcoUEhYX0hPT0spfV0sIFtkYXRhLXBoeC0ke1BIWF9IT09LfV1gLCBob29rRWwgPT4ge1xuICAgICAgbGV0IGhvb2sgPSB0aGlzLmFkZEhvb2soaG9va0VsKVxuICAgICAgaWYoaG9vayl7IGhvb2suX19tb3VudGVkKCkgfVxuICAgIH0pXG5cbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2VcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnRzKGV2ZW50cylcbiAgICB0aGlzLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKVxuXG4gICAgaWYobGl2ZV9wYXRjaCl7XG4gICAgICBsZXQge2tpbmQsIHRvfSA9IGxpdmVfcGF0Y2hcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godG8sIGtpbmQpXG4gICAgfVxuICAgIHRoaXMuaGlkZUxvYWRlcigpXG4gICAgaWYodGhpcy5qb2luQ291bnQgPiAxKXsgdGhpcy50cmlnZ2VyUmVjb25uZWN0ZWQoKSB9XG4gICAgdGhpcy5zdG9wQ2FsbGJhY2soKVxuICB9XG5cbiAgdHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKXtcbiAgICB0aGlzLmxpdmVTb2NrZXQudHJpZ2dlckRPTShcIm9uQmVmb3JlRWxVcGRhdGVkXCIsIFtmcm9tRWwsIHRvRWxdKVxuICAgIGxldCBob29rID0gdGhpcy5nZXRIb29rKGZyb21FbClcbiAgICBsZXQgaXNJZ25vcmVkID0gaG9vayAmJiBET00uaXNJZ25vcmVkKGZyb21FbCwgdGhpcy5iaW5kaW5nKFBIWF9VUERBVEUpKVxuICAgIGlmKGhvb2sgJiYgIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKSAmJiAhKGlzSWdub3JlZCAmJiBpc0VxdWFsT2JqKGZyb21FbC5kYXRhc2V0LCB0b0VsLmRhdGFzZXQpKSl7XG4gICAgICBob29rLl9fYmVmb3JlVXBkYXRlKClcbiAgICAgIHJldHVybiBob29rXG4gICAgfVxuICB9XG5cbiAgcGVyZm9ybVBhdGNoKHBhdGNoLCBwcnVuZUNpZHMpe1xuICAgIGxldCBkZXN0cm95ZWRDSURzID0gW11cbiAgICBsZXQgcGh4Q2hpbGRyZW5BZGRlZCA9IGZhbHNlXG4gICAgbGV0IHVwZGF0ZWRIb29rSWRzID0gbmV3IFNldCgpXG5cbiAgICBwYXRjaC5hZnRlcihcImFkZGVkXCIsIGVsID0+IHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25Ob2RlQWRkZWRcIiwgW2VsXSlcblxuICAgICAgbGV0IG5ld0hvb2sgPSB0aGlzLmFkZEhvb2soZWwpXG4gICAgICBpZihuZXdIb29rKXsgbmV3SG9vay5fX21vdW50ZWQoKSB9XG4gICAgfSlcblxuICAgIHBhdGNoLmFmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLCBfZWwgPT4gcGh4Q2hpbGRyZW5BZGRlZCA9IHRydWUpXG5cbiAgICBwYXRjaC5iZWZvcmUoXCJ1cGRhdGVkXCIsIChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgIGxldCBob29rID0gdGhpcy50cmlnZ2VyQmVmb3JlVXBkYXRlSG9vayhmcm9tRWwsIHRvRWwpXG4gICAgICBpZihob29rKXsgdXBkYXRlZEhvb2tJZHMuYWRkKGZyb21FbC5pZCkgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5hZnRlcihcInVwZGF0ZWRcIiwgZWwgPT4ge1xuICAgICAgaWYodXBkYXRlZEhvb2tJZHMuaGFzKGVsLmlkKSl7IHRoaXMuZ2V0SG9vayhlbCkuX191cGRhdGVkKCkgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5hZnRlcihcImRpc2NhcmRlZFwiLCAoZWwpID0+IHtcbiAgICAgIGxldCBjaWQgPSB0aGlzLmNvbXBvbmVudElEKGVsKVxuICAgICAgaWYodHlwZW9mIChjaWQpID09PSBcIm51bWJlclwiICYmIGRlc3Ryb3llZENJRHMuaW5kZXhPZihjaWQpID09PSAtMSl7IGRlc3Ryb3llZENJRHMucHVzaChjaWQpIH1cbiAgICAgIGxldCBob29rID0gdGhpcy5nZXRIb29rKGVsKVxuICAgICAgaG9vayAmJiB0aGlzLmRlc3Ryb3lIb29rKGhvb2spXG4gICAgfSlcblxuICAgIHBhdGNoLnBlcmZvcm0oKVxuXG4gICAgLy8gV2Ugc2hvdWxkIG5vdCBwcnVuZUNpZHMgb24gam9pbnMuIE90aGVyd2lzZSwgaW4gY2FzZSBvZlxuICAgIC8vIHJlam9pbnMsIHdlIG1heSBub3RpZnkgY2lkcyB0aGF0IG5vIGxvbmdlciBiZWxvbmcgdG8gdGhlXG4gICAgLy8gY3VycmVudCBMaXZlVmlldyB0byBiZSByZW1vdmVkLlxuICAgIGlmKHBydW5lQ2lkcyl7XG4gICAgICB0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcylcbiAgICB9XG5cbiAgICByZXR1cm4gcGh4Q2hpbGRyZW5BZGRlZFxuICB9XG5cbiAgam9pbk5ld0NoaWxkcmVuKCl7XG4gICAgRE9NLmZpbmRQaHhDaGlsZHJlbih0aGlzLmVsLCB0aGlzLmlkKS5mb3JFYWNoKGVsID0+IHRoaXMuam9pbkNoaWxkKGVsKSlcbiAgfVxuXG4gIGdldENoaWxkQnlJZChpZCl7IHJldHVybiB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF1baWRdIH1cblxuICBnZXREZXNjZW5kZW50QnlFbChlbCl7XG4gICAgaWYoZWwuaWQgPT09IHRoaXMuaWQpe1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5bZWwuZ2V0QXR0cmlidXRlKFBIWF9QQVJFTlRfSUQpXVtlbC5pZF1cbiAgICB9XG4gIH1cblxuICBkZXN0cm95RGVzY2VuZGVudChpZCl7XG4gICAgZm9yKGxldCBwYXJlbnRJZCBpbiB0aGlzLnJvb3QuY2hpbGRyZW4pe1xuICAgICAgZm9yKGxldCBjaGlsZElkIGluIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF0pe1xuICAgICAgICBpZihjaGlsZElkID09PSBpZCl7IHJldHVybiB0aGlzLnJvb3QuY2hpbGRyZW5bcGFyZW50SWRdW2NoaWxkSWRdLmRlc3Ryb3koKSB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgam9pbkNoaWxkKGVsKXtcbiAgICBsZXQgY2hpbGQgPSB0aGlzLmdldENoaWxkQnlJZChlbC5pZClcbiAgICBpZighY2hpbGQpe1xuICAgICAgbGV0IHZpZXcgPSBuZXcgVmlldyhlbCwgdGhpcy5saXZlU29ja2V0LCB0aGlzKVxuICAgICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW3ZpZXcuaWRdID0gdmlld1xuICAgICAgdmlldy5qb2luKClcbiAgICAgIHRoaXMuY2hpbGRKb2lucysrXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGlzSm9pblBlbmRpbmcoKXsgcmV0dXJuIHRoaXMuam9pblBlbmRpbmcgfVxuXG4gIGFja0pvaW4oX2NoaWxkKXtcbiAgICB0aGlzLmNoaWxkSm9pbnMtLVxuXG4gICAgaWYodGhpcy5jaGlsZEpvaW5zID09PSAwKXtcbiAgICAgIGlmKHRoaXMucGFyZW50KXtcbiAgICAgICAgdGhpcy5wYXJlbnQuYWNrSm9pbih0aGlzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25BbGxDaGlsZEpvaW5zQ29tcGxldGUoKXtcbiAgICB0aGlzLmpvaW5DYWxsYmFjaygpXG4gICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChbdmlldywgb3BdKSA9PiB7XG4gICAgICBpZighdmlldy5pc0Rlc3Ryb3llZCgpKXsgb3AoKSB9XG4gICAgfSlcbiAgICB0aGlzLnBlbmRpbmdKb2luT3BzID0gW11cbiAgfVxuXG4gIHVwZGF0ZShkaWZmLCBldmVudHMpe1xuICAgIGlmKHRoaXMuaXNKb2luUGVuZGluZygpIHx8IHRoaXMubGl2ZVNvY2tldC5oYXNQZW5kaW5nTGluaygpKXtcbiAgICAgIHJldHVybiB0aGlzLnBlbmRpbmdEaWZmcy5wdXNoKHtkaWZmLCBldmVudHN9KVxuICAgIH1cblxuICAgIHRoaXMucmVuZGVyZWQubWVyZ2VEaWZmKGRpZmYpXG4gICAgbGV0IHBoeENoaWxkcmVuQWRkZWQgPSBmYWxzZVxuXG4gICAgLy8gV2hlbiB0aGUgZGlmZiBvbmx5IGNvbnRhaW5zIGNvbXBvbmVudCBkaWZmcywgdGhlbiB3YWxrIGNvbXBvbmVudHNcbiAgICAvLyBhbmQgcGF0Y2ggb25seSB0aGUgcGFyZW50IGNvbXBvbmVudCBjb250YWluZXJzIGZvdW5kIGluIHRoZSBkaWZmLlxuICAgIC8vIE90aGVyd2lzZSwgcGF0Y2ggZW50aXJlIExWIGNvbnRhaW5lci5cbiAgICBpZih0aGlzLnJlbmRlcmVkLmlzQ29tcG9uZW50T25seURpZmYoZGlmZikpe1xuICAgICAgdGhpcy5saXZlU29ja2V0LnRpbWUoXCJjb21wb25lbnQgcGF0Y2ggY29tcGxldGVcIiwgKCkgPT4ge1xuICAgICAgICBsZXQgcGFyZW50Q2lkcyA9IERPTS5maW5kUGFyZW50Q0lEcyh0aGlzLmVsLCB0aGlzLnJlbmRlcmVkLmNvbXBvbmVudENJRHMoZGlmZikpXG4gICAgICAgIHBhcmVudENpZHMuZm9yRWFjaChwYXJlbnRDSUQgPT4ge1xuICAgICAgICAgIGlmKHRoaXMuY29tcG9uZW50UGF0Y2godGhpcy5yZW5kZXJlZC5nZXRDb21wb25lbnQoZGlmZiwgcGFyZW50Q0lEKSwgcGFyZW50Q0lEKSl7IHBoeENoaWxkcmVuQWRkZWQgPSB0cnVlIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmKCFpc0VtcHR5KGRpZmYpKXtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC50aW1lKFwiZnVsbCBwYXRjaCBjb21wbGV0ZVwiLCAoKSA9PiB7XG4gICAgICAgIGxldCBodG1sID0gdGhpcy5yZW5kZXJDb250YWluZXIoZGlmZiwgXCJ1cGRhdGVcIilcbiAgICAgICAgbGV0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIG51bGwpXG4gICAgICAgIHBoeENoaWxkcmVuQWRkZWQgPSB0aGlzLnBlcmZvcm1QYXRjaChwYXRjaCwgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50cyhldmVudHMpXG4gICAgaWYocGh4Q2hpbGRyZW5BZGRlZCl7IHRoaXMuam9pbk5ld0NoaWxkcmVuKCkgfVxuICB9XG5cbiAgcmVuZGVyQ29udGFpbmVyKGRpZmYsIGtpbmQpe1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQudGltZShgdG9TdHJpbmcgZGlmZiAoJHtraW5kfSlgLCAoKSA9PiB7XG4gICAgICBsZXQgdGFnID0gdGhpcy5lbC50YWdOYW1lXG4gICAgICAvLyBEb24ndCBza2lwIGFueSBjb21wb25lbnQgaW4gdGhlIGRpZmYgbm9yIGFueSBtYXJrZWQgYXMgcHJ1bmVkXG4gICAgICAvLyAoYXMgdGhleSBtYXkgaGF2ZSBiZWVuIGFkZGVkIGJhY2spXG4gICAgICBsZXQgY2lkcyA9IGRpZmYgPyB0aGlzLnJlbmRlcmVkLmNvbXBvbmVudENJRHMoZGlmZikuY29uY2F0KHRoaXMucHJ1bmluZ0NJRHMpIDogbnVsbFxuICAgICAgbGV0IGh0bWwgPSB0aGlzLnJlbmRlcmVkLnRvU3RyaW5nKGNpZHMpXG4gICAgICByZXR1cm4gYDwke3RhZ30+JHtodG1sfTwvJHt0YWd9PmBcbiAgICB9KVxuICB9XG5cbiAgY29tcG9uZW50UGF0Y2goZGlmZiwgY2lkKXtcbiAgICBpZihpc0VtcHR5KGRpZmYpKSByZXR1cm4gZmFsc2VcbiAgICBsZXQgaHRtbCA9IHRoaXMucmVuZGVyZWQuY29tcG9uZW50VG9TdHJpbmcoY2lkKVxuICAgIGxldCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBjaWQpXG4gICAgbGV0IGNoaWxkcmVuQWRkZWQgPSB0aGlzLnBlcmZvcm1QYXRjaChwYXRjaCwgdHJ1ZSlcbiAgICByZXR1cm4gY2hpbGRyZW5BZGRlZFxuICB9XG5cbiAgZ2V0SG9vayhlbCl7IHJldHVybiB0aGlzLnZpZXdIb29rc1tWaWV3SG9vay5lbGVtZW50SUQoZWwpXSB9XG5cbiAgYWRkSG9vayhlbCl7XG4gICAgaWYoVmlld0hvb2suZWxlbWVudElEKGVsKSB8fCAhZWwuZ2V0QXR0cmlidXRlKXsgcmV0dXJuIH1cbiAgICBsZXQgaG9va05hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoYGRhdGEtcGh4LSR7UEhYX0hPT0t9YCkgfHwgZWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfSE9PSykpXG4gICAgaWYoaG9va05hbWUgJiYgIXRoaXMub3duc0VsZW1lbnQoZWwpKXsgcmV0dXJuIH1cbiAgICBsZXQgY2FsbGJhY2tzID0gdGhpcy5saXZlU29ja2V0LmdldEhvb2tDYWxsYmFja3MoaG9va05hbWUpXG5cbiAgICBpZihjYWxsYmFja3Mpe1xuICAgICAgaWYoIWVsLmlkKXsgbG9nRXJyb3IoYG5vIERPTSBJRCBmb3IgaG9vayBcIiR7aG9va05hbWV9XCIuIEhvb2tzIHJlcXVpcmUgYSB1bmlxdWUgSUQgb24gZWFjaCBlbGVtZW50LmAsIGVsKSB9XG4gICAgICBsZXQgaG9vayA9IG5ldyBWaWV3SG9vayh0aGlzLCBlbCwgY2FsbGJhY2tzKVxuICAgICAgdGhpcy52aWV3SG9va3NbVmlld0hvb2suZWxlbWVudElEKGhvb2suZWwpXSA9IGhvb2tcbiAgICAgIHJldHVybiBob29rXG4gICAgfSBlbHNlIGlmKGhvb2tOYW1lICE9PSBudWxsKXtcbiAgICAgIGxvZ0Vycm9yKGB1bmtub3duIGhvb2sgZm91bmQgZm9yIFwiJHtob29rTmFtZX1cImAsIGVsKVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lIb29rKGhvb2spe1xuICAgIGhvb2suX19kZXN0cm95ZWQoKVxuICAgIGhvb2suX19jbGVhbnVwX18oKVxuICAgIGRlbGV0ZSB0aGlzLnZpZXdIb29rc1tWaWV3SG9vay5lbGVtZW50SUQoaG9vay5lbCldXG4gIH1cblxuICBhcHBseVBlbmRpbmdVcGRhdGVzKCl7XG4gICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaCgoe2RpZmYsIGV2ZW50c30pID0+IHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cykpXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXVxuICB9XG5cbiAgb25DaGFubmVsKGV2ZW50LCBjYil7XG4gICAgdGhpcy5saXZlU29ja2V0Lm9uQ2hhbm5lbCh0aGlzLmNoYW5uZWwsIGV2ZW50LCByZXNwID0+IHtcbiAgICAgIGlmKHRoaXMuaXNKb2luUGVuZGluZygpKXtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW3RoaXMsICgpID0+IGNiKHJlc3ApXSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNiKHJlc3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGJpbmRDaGFubmVsKCl7XG4gICAgLy8gVGhlIGRpZmYgZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIHJlZ3VsYXIgdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAgLy8gQWxsIG90aGVyIG9wZXJhdGlvbnMgYXJlIHF1ZXVlZCB0byBiZSBhcHBsaWVkIG9ubHkgYWZ0ZXIgam9pbi5cbiAgICB0aGlzLmxpdmVTb2NrZXQub25DaGFubmVsKHRoaXMuY2hhbm5lbCwgXCJkaWZmXCIsIChyYXdEaWZmKSA9PiB7XG4gICAgICB0aGlzLmFwcGx5RGlmZihcInVwZGF0ZVwiLCByYXdEaWZmLCAoe2RpZmYsIGV2ZW50c30pID0+IHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cykpXG4gICAgfSlcbiAgICB0aGlzLm9uQ2hhbm5lbChcInJlZGlyZWN0XCIsICh7dG8sIGZsYXNofSkgPT4gdGhpcy5vblJlZGlyZWN0KHt0bywgZmxhc2h9KSlcbiAgICB0aGlzLm9uQ2hhbm5lbChcImxpdmVfcGF0Y2hcIiwgKHJlZGlyKSA9PiB0aGlzLm9uTGl2ZVBhdGNoKHJlZGlyKSlcbiAgICB0aGlzLm9uQ2hhbm5lbChcImxpdmVfcmVkaXJlY3RcIiwgKHJlZGlyKSA9PiB0aGlzLm9uTGl2ZVJlZGlyZWN0KHJlZGlyKSlcbiAgICB0aGlzLmNoYW5uZWwub25FcnJvcihyZWFzb24gPT4gdGhpcy5vbkVycm9yKHJlYXNvbikpXG4gICAgdGhpcy5jaGFubmVsLm9uQ2xvc2UocmVhc29uID0+IHRoaXMub25DbG9zZShyZWFzb24pKVxuICB9XG5cbiAgZGVzdHJveUFsbENoaWxkcmVuKCl7XG4gICAgZm9yKGxldCBpZCBpbiB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF0pe1xuICAgICAgdGhpcy5nZXRDaGlsZEJ5SWQoaWQpLmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuXG4gIG9uTGl2ZVJlZGlyZWN0KHJlZGlyKXtcbiAgICBsZXQge3RvLCBraW5kLCBmbGFzaH0gPSByZWRpclxuICAgIGxldCB1cmwgPSB0aGlzLmV4cGFuZFVSTCh0bylcbiAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVJlZGlyZWN0KHVybCwga2luZCwgZmxhc2gpXG4gIH1cblxuICBvbkxpdmVQYXRjaChyZWRpcil7XG4gICAgbGV0IHt0bywga2luZH0gPSByZWRpclxuICAgIHRoaXMuaHJlZiA9IHRoaXMuZXhwYW5kVVJMKHRvKVxuICAgIHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godG8sIGtpbmQpXG4gIH1cblxuICBleHBhbmRVUkwodG8pe1xuICAgIHJldHVybiB0by5zdGFydHNXaXRoKFwiL1wiKSA/IGAke3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH0vLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9JHt0b31gIDogdG9cbiAgfVxuXG4gIG9uUmVkaXJlY3Qoe3RvLCBmbGFzaH0peyB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3QodG8sIGZsYXNoKSB9XG5cbiAgaXNEZXN0cm95ZWQoKXsgcmV0dXJuIHRoaXMuZGVzdHJveWVkIH1cblxuICBqb2luKGNhbGxiYWNrKXtcbiAgICBpZighdGhpcy5wYXJlbnQpe1xuICAgICAgdGhpcy5zdG9wQ2FsbGJhY2sgPSB0aGlzLmxpdmVTb2NrZXQud2l0aFBhZ2VMb2FkaW5nKHt0bzogdGhpcy5ocmVmLCBraW5kOiBcImluaXRpYWxcIn0pXG4gICAgfVxuICAgIHRoaXMuam9pbkNhbGxiYWNrID0gKCkgPT4gY2FsbGJhY2sgJiYgY2FsbGJhY2sodGhpcy5qb2luQ291bnQpXG4gICAgdGhpcy5saXZlU29ja2V0LndyYXBQdXNoKHRoaXMsIHt0aW1lb3V0OiBmYWxzZX0sICgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5uZWwuam9pbigpXG4gICAgICAgIC5yZWNlaXZlKFwib2tcIiwgZGF0YSA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIHRoaXMub25Kb2luKGRhdGEpKVxuICAgICAgICAucmVjZWl2ZShcImVycm9yXCIsIHJlc3AgPT4gIXRoaXMuaXNEZXN0cm95ZWQoKSAmJiB0aGlzLm9uSm9pbkVycm9yKHJlc3ApKVxuICAgICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gIXRoaXMuaXNEZXN0cm95ZWQoKSAmJiB0aGlzLm9uSm9pbkVycm9yKHtyZWFzb246IFwidGltZW91dFwifSkpXG4gICAgfSlcbiAgfVxuXG4gIG9uSm9pbkVycm9yKHJlc3Ape1xuICAgIGlmKHJlc3AucmVhc29uID09PSBcInVuYXV0aG9yaXplZFwiIHx8IHJlc3AucmVhc29uID09PSBcInN0YWxlXCIpe1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ1bmF1dGhvcml6ZWQgbGl2ZV9yZWRpcmVjdC4gRmFsbGluZyBiYWNrIHRvIHBhZ2UgcmVxdWVzdFwiLCByZXNwXSlcbiAgICAgIHJldHVybiB0aGlzLm9uUmVkaXJlY3Qoe3RvOiB0aGlzLmhyZWZ9KVxuICAgIH1cbiAgICBpZihyZXNwLnJlZGlyZWN0IHx8IHJlc3AubGl2ZV9yZWRpcmVjdCl7XG4gICAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2VcbiAgICAgIHRoaXMuY2hhbm5lbC5sZWF2ZSgpXG4gICAgfVxuICAgIGlmKHJlc3AucmVkaXJlY3QpeyByZXR1cm4gdGhpcy5vblJlZGlyZWN0KHJlc3AucmVkaXJlY3QpIH1cbiAgICBpZihyZXNwLmxpdmVfcmVkaXJlY3QpeyByZXR1cm4gdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpIH1cbiAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtcInVuYWJsZSB0byBqb2luXCIsIHJlc3BdKVxuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKVxuICB9XG5cbiAgb25DbG9zZShyZWFzb24pe1xuICAgIGlmKHRoaXMuaXNEZXN0cm95ZWQoKSl7IHJldHVybiB9XG4gICAgaWYoKHRoaXMuaXNKb2luUGVuZGluZygpICYmIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSAhPT0gXCJoaWRkZW5cIikgfHxcbiAgICAgICh0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSAmJiByZWFzb24gIT09IFwibGVhdmVcIikpe1xuXG4gICAgICByZXR1cm4gdGhpcy5saXZlU29ja2V0LnJlbG9hZFdpdGhKaXR0ZXIodGhpcylcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95QWxsQ2hpbGRyZW4oKVxuICAgIHRoaXMubGl2ZVNvY2tldC5kcm9wQWN0aXZlRWxlbWVudCh0aGlzKVxuICAgIC8vIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgY2FuIGJlIG51bGwgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTFcbiAgICBpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KXsgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCkgfVxuICAgIGlmKHRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCkpe1xuICAgICAgdGhpcy5zaG93TG9hZGVyKEJFRk9SRV9VTkxPQURfTE9BREVSX1RJTUVPVVQpXG4gICAgfVxuICB9XG5cbiAgb25FcnJvcihyZWFzb24pe1xuICAgIHRoaXMub25DbG9zZShyZWFzb24pXG4gICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ2aWV3IGNyYXNoZWRcIiwgcmVhc29uXSlcbiAgICBpZighdGhpcy5saXZlU29ja2V0LmlzVW5sb2FkZWQoKSl7IHRoaXMuZGlzcGxheUVycm9yKCkgfVxuICB9XG5cbiAgZGlzcGxheUVycm9yKCl7XG4gICAgaWYodGhpcy5pc01haW4oKSl7IERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0YXJ0XCIsIHt0bzogdGhpcy5ocmVmLCBraW5kOiBcImVycm9yXCJ9KSB9XG4gICAgdGhpcy5zaG93TG9hZGVyKClcbiAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoUEhYX0RJU0NPTk5FQ1RFRF9DTEFTUywgUEhYX0VSUk9SX0NMQVNTKVxuICB9XG5cbiAgcHVzaFdpdGhSZXBseShyZWZHZW5lcmF0b3IsIGV2ZW50LCBwYXlsb2FkLCBvblJlcGx5ID0gZnVuY3Rpb24gKCl7IH0pe1xuICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuXG4gICAgbGV0IFtyZWYsIFtlbF1dID0gcmVmR2VuZXJhdG9yID8gcmVmR2VuZXJhdG9yKCkgOiBbbnVsbCwgW11dXG4gICAgbGV0IG9uTG9hZGluZ0RvbmUgPSBmdW5jdGlvbiAoKXsgfVxuICAgIGlmKGVsICYmIChlbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9QQUdFX0xPQURJTkcpKSAhPT0gbnVsbCkpe1xuICAgICAgb25Mb2FkaW5nRG9uZSA9IHRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe2tpbmQ6IFwiZWxlbWVudFwiLCB0YXJnZXQ6IGVsfSlcbiAgICB9XG5cbiAgICBpZih0eXBlb2YgKHBheWxvYWQuY2lkKSAhPT0gXCJudW1iZXJcIil7IGRlbGV0ZSBwYXlsb2FkLmNpZCB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubGl2ZVNvY2tldC53cmFwUHVzaCh0aGlzLCB7dGltZW91dDogdHJ1ZX0sICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbC5wdXNoKGV2ZW50LCBwYXlsb2FkLCBQVVNIX1RJTUVPVVQpLnJlY2VpdmUoXCJva1wiLCByZXNwID0+IHtcbiAgICAgICAgICBsZXQgaG9va1JlcGx5ID0gbnVsbFxuICAgICAgICAgIGlmKHJlZiAhPT0gbnVsbCl7IHRoaXMudW5kb1JlZnMocmVmKSB9XG4gICAgICAgICAgaWYocmVzcC5kaWZmKXtcbiAgICAgICAgICAgIGhvb2tSZXBseSA9IHRoaXMuYXBwbHlEaWZmKFwidXBkYXRlXCIsIHJlc3AuZGlmZiwgKHtkaWZmLCBldmVudHN9KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlc3AucmVkaXJlY3QpeyB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCkgfVxuICAgICAgICAgIGlmKHJlc3AubGl2ZV9wYXRjaCl7IHRoaXMub25MaXZlUGF0Y2gocmVzcC5saXZlX3BhdGNoKSB9XG4gICAgICAgICAgaWYocmVzcC5saXZlX3JlZGlyZWN0KXsgdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpIH1cbiAgICAgICAgICBvbkxvYWRpbmdEb25lKClcbiAgICAgICAgICBvblJlcGx5KHJlc3AsIGhvb2tSZXBseSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgdW5kb1JlZnMocmVmKXtcbiAgICBET00uYWxsKHRoaXMuZWwsIGBbJHtQSFhfUkVGfT1cIiR7cmVmfVwiXWAsIGVsID0+IHtcbiAgICAgIGxldCBkaXNhYmxlZFZhbCA9IGVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRUQpXG4gICAgICAvLyByZW1vdmUgcmVmc1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUYpXG4gICAgICAvLyByZXN0b3JlIGlucHV0c1xuICAgICAgaWYoZWwuZ2V0QXR0cmlidXRlKFBIWF9SRUFET05MWSkgIT09IG51bGwpe1xuICAgICAgICBlbC5yZWFkT25seSA9IGZhbHNlXG4gICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVBRE9OTFkpXG4gICAgICB9XG4gICAgICBpZihkaXNhYmxlZFZhbCAhPT0gbnVsbCl7XG4gICAgICAgIGVsLmRpc2FibGVkID0gZGlzYWJsZWRWYWwgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfRElTQUJMRUQpXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgY2xhc3Nlc1xuICAgICAgUEhYX0VWRU5UX0NMQVNTRVMuZm9yRWFjaChjbGFzc05hbWUgPT4gRE9NLnJlbW92ZUNsYXNzKGVsLCBjbGFzc05hbWUpKVxuICAgICAgLy8gcmVzdG9yZSBkaXNhYmxlc1xuICAgICAgbGV0IGRpc2FibGVSZXN0b3JlID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSlcbiAgICAgIGlmKGRpc2FibGVSZXN0b3JlICE9PSBudWxsKXtcbiAgICAgICAgZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVJlc3RvcmVcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSlcbiAgICAgIH1cbiAgICAgIGxldCB0b0VsID0gRE9NLnByaXZhdGUoZWwsIFBIWF9SRUYpXG4gICAgICBpZih0b0VsKXtcbiAgICAgICAgbGV0IGhvb2sgPSB0aGlzLnRyaWdnZXJCZWZvcmVVcGRhdGVIb29rKGVsLCB0b0VsKVxuICAgICAgICBET01QYXRjaC5wYXRjaEVsKGVsLCB0b0VsLCB0aGlzLmxpdmVTb2NrZXQuZ2V0QWN0aXZlRWxlbWVudCgpKVxuICAgICAgICBpZihob29rKXsgaG9vay5fX3VwZGF0ZWQoKSB9XG4gICAgICAgIERPTS5kZWxldGVQcml2YXRlKGVsLCBQSFhfUkVGKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdXRSZWYoZWxlbWVudHMsIGV2ZW50KXtcbiAgICBsZXQgbmV3UmVmID0gdGhpcy5yZWYrK1xuICAgIGxldCBkaXNhYmxlV2l0aCA9IHRoaXMuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKVxuXG4gICAgZWxlbWVudHMuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKGBwaHgtJHtldmVudH0tbG9hZGluZ2ApXG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRiwgbmV3UmVmKVxuICAgICAgbGV0IGRpc2FibGVUZXh0ID0gZWwuZ2V0QXR0cmlidXRlKGRpc2FibGVXaXRoKVxuICAgICAgaWYoZGlzYWJsZVRleHQgIT09IG51bGwpe1xuICAgICAgICBpZighZWwuZ2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSkpe1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsIGVsLmlubmVyVGV4dClcbiAgICAgICAgfVxuICAgICAgICBlbC5pbm5lclRleHQgPSBkaXNhYmxlVGV4dFxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIFtuZXdSZWYsIGVsZW1lbnRzXVxuICB9XG5cbiAgY29tcG9uZW50SUQoZWwpe1xuICAgIGxldCBjaWQgPSBlbC5nZXRBdHRyaWJ1dGUgJiYgZWwuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpXG4gICAgcmV0dXJuIGNpZCA/IHBhcnNlSW50KGNpZCkgOiBudWxsXG4gIH1cblxuICB0YXJnZXRDb21wb25lbnRJRCh0YXJnZXQsIHRhcmdldEN0eCl7XG4gICAgaWYodGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpKXtcbiAgICAgIHJldHVybiB0aGlzLmNsb3Nlc3RDb21wb25lbnRJRCh0YXJnZXRDdHgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgY2xvc2VzdENvbXBvbmVudElEKHRhcmdldEN0eCl7XG4gICAgaWYodGFyZ2V0Q3R4KXtcbiAgICAgIHJldHVybiBtYXliZSh0YXJnZXRDdHguY2xvc2VzdChgWyR7UEhYX0NPTVBPTkVOVH1dYCksIGVsID0+IHRoaXMub3duc0VsZW1lbnQoZWwpICYmIHRoaXMuY29tcG9uZW50SUQoZWwpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHB1c2hIb29rRXZlbnQodGFyZ2V0Q3R4LCBldmVudCwgcGF5bG9hZCwgb25SZXBseSl7XG4gICAgaWYoIXRoaXMuaXNDb25uZWN0ZWQoKSl7XG4gICAgICB0aGlzLmxvZyhcImhvb2tcIiwgKCkgPT4gW1widW5hYmxlIHRvIHB1c2ggaG9vayBldmVudC4gTGl2ZVZpZXcgbm90IGNvbm5lY3RlZFwiLCBldmVudCwgcGF5bG9hZF0pXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgbGV0IFtyZWYsIGVsc10gPSB0aGlzLnB1dFJlZihbXSwgXCJob29rXCIpXG4gICAgdGhpcy5wdXNoV2l0aFJlcGx5KCgpID0+IFtyZWYsIGVsc10sIFwiZXZlbnRcIiwge1xuICAgICAgdHlwZTogXCJob29rXCIsXG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICB2YWx1ZTogcGF5bG9hZCxcbiAgICAgIGNpZDogdGhpcy5jbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KVxuICAgIH0sIChyZXNwLCByZXBseSkgPT4gb25SZXBseShyZXBseSwgcmVmKSlcblxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIGV4dHJhY3RNZXRhKGVsLCBtZXRhKXtcbiAgICBsZXQgcHJlZml4ID0gdGhpcy5iaW5kaW5nKFwidmFsdWUtXCIpXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGVsLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspe1xuICAgICAgbGV0IG5hbWUgPSBlbC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGlmKG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKXsgbWV0YVtuYW1lLnJlcGxhY2UocHJlZml4LCBcIlwiKV0gPSBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgfVxuICAgIH1cbiAgICBpZihlbC52YWx1ZSAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIG1ldGEudmFsdWUgPSBlbC52YWx1ZVxuXG4gICAgICBpZihlbC50YWdOYW1lID09PSBcIklOUFVUXCIgJiYgQ0hFQ0tBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUpID49IDAgJiYgIWVsLmNoZWNrZWQpe1xuICAgICAgICBkZWxldGUgbWV0YS52YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWV0YVxuICB9XG5cbiAgcHVzaEV2ZW50KHR5cGUsIGVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBtZXRhKXtcbiAgICB0aGlzLnB1c2hXaXRoUmVwbHkoKCkgPT4gdGhpcy5wdXRSZWYoW2VsXSwgdHlwZSksIFwiZXZlbnRcIiwge1xuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgIHZhbHVlOiB0aGlzLmV4dHJhY3RNZXRhKGVsLCBtZXRhKSxcbiAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChlbCwgdGFyZ2V0Q3R4KVxuICAgIH0pXG4gIH1cblxuICBwdXNoS2V5KGtleUVsZW1lbnQsIHRhcmdldEN0eCwga2luZCwgcGh4RXZlbnQsIG1ldGEpe1xuICAgIHRoaXMucHVzaFdpdGhSZXBseSgoKSA9PiB0aGlzLnB1dFJlZihba2V5RWxlbWVudF0sIGtpbmQpLCBcImV2ZW50XCIsIHtcbiAgICAgIHR5cGU6IGtpbmQsXG4gICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICB2YWx1ZTogdGhpcy5leHRyYWN0TWV0YShrZXlFbGVtZW50LCBtZXRhKSxcbiAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChrZXlFbGVtZW50LCB0YXJnZXRDdHgpXG4gICAgfSlcbiAgfVxuXG4gIHB1c2hGaWxlUHJvZ3Jlc3MoZmlsZUVsLCBlbnRyeVJlZiwgcHJvZ3Jlc3MsIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgdGhpcy5saXZlU29ja2V0LndpdGhpbk93bmVycyhmaWxlRWwuZm9ybSwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgdmlldy5wdXNoV2l0aFJlcGx5KG51bGwsIFwicHJvZ3Jlc3NcIiwge1xuICAgICAgICBldmVudDogZmlsZUVsLmdldEF0dHJpYnV0ZSh2aWV3LmJpbmRpbmcoUEhYX1BST0dSRVNTKSksXG4gICAgICAgIHJlZjogZmlsZUVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICAgIGVudHJ5X3JlZjogZW50cnlSZWYsXG4gICAgICAgIHByb2dyZXNzOiBwcm9ncmVzcyxcbiAgICAgICAgY2lkOiB2aWV3LnRhcmdldENvbXBvbmVudElEKGZpbGVFbC5mb3JtLCB0YXJnZXRDdHgpXG4gICAgICB9LCBvblJlcGx5KVxuICAgIH0pXG4gIH1cblxuICBwdXNoSW5wdXQoaW5wdXRFbCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgZXZlbnRUYXJnZXQsIGNhbGxiYWNrKXtcbiAgICBsZXQgdXBsb2Fkc1xuICAgIGxldCBjaWQgPSB0aGlzLnRhcmdldENvbXBvbmVudElEKGlucHV0RWwuZm9ybSwgdGFyZ2V0Q3R4KVxuICAgIGxldCByZWZHZW5lcmF0b3IgPSAoKSA9PiB0aGlzLnB1dFJlZihbaW5wdXRFbCwgaW5wdXRFbC5mb3JtXSwgXCJjaGFuZ2VcIilcbiAgICBsZXQgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGlucHV0RWwuZm9ybSwge190YXJnZXQ6IGV2ZW50VGFyZ2V0Lm5hbWV9KVxuICAgIGlmKGlucHV0RWwuZmlsZXMgJiYgaW5wdXRFbC5maWxlcy5sZW5ndGggPiAwKXtcbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGlucHV0RWwsIEFycmF5LmZyb20oaW5wdXRFbC5maWxlcykpXG4gICAgfVxuICAgIHVwbG9hZHMgPSBMaXZlVXBsb2FkZXIuc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKVxuICAgIGxldCBldmVudCA9IHtcbiAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgZXZlbnQ6IHBoeEV2ZW50LFxuICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgdXBsb2FkczogdXBsb2FkcyxcbiAgICAgIGNpZDogY2lkXG4gICAgfVxuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW5lcmF0b3IsIFwiZXZlbnRcIiwgZXZlbnQsIHJlc3AgPT4ge1xuICAgICAgRE9NLnNob3dFcnJvcihpbnB1dEVsLCB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhQSFhfRkVFREJBQ0tfRk9SKSlcbiAgICAgIGlmKERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmIGlucHV0RWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtYXV0by11cGxvYWRcIikgIT09IG51bGwpe1xuICAgICAgICBpZihMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKS5sZW5ndGggPiAwKXtcbiAgICAgICAgICBsZXQgW3JlZiwgX2Vsc10gPSByZWZHZW5lcmF0b3IoKVxuICAgICAgICAgIHRoaXMudXBsb2FkRmlsZXMoaW5wdXRFbC5mb3JtLCB0YXJnZXRDdHgsIHJlZiwgY2lkLCAoX3VwbG9hZHMpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHJlc3ApXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJBd2FpdGluZ1N1Ym1pdChpbnB1dEVsLmZvcm0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdHJpZ2dlckF3YWl0aW5nU3VibWl0KGZvcm1FbCl7XG4gICAgbGV0IGF3YWl0aW5nU3VibWl0ID0gdGhpcy5nZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKVxuICAgIGlmKGF3YWl0aW5nU3VibWl0KXtcbiAgICAgIGxldCBbX2VsLCBfcmVmLCBjYWxsYmFja10gPSBhd2FpdGluZ1N1Ym1pdFxuICAgICAgdGhpcy5jYW5jZWxTdWJtaXQoZm9ybUVsKVxuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfVxuXG4gIGdldFNjaGVkdWxlZFN1Ym1pdChmb3JtRWwpe1xuICAgIHJldHVybiB0aGlzLmZvcm1TdWJtaXRzLmZpbmQoKFtlbCwgX2NhbGxiYWNrXSkgPT4gZWwuaXNTYW1lTm9kZShmb3JtRWwpKVxuICB9XG5cbiAgc2NoZWR1bGVTdWJtaXQoZm9ybUVsLCByZWYsIGNhbGxiYWNrKXtcbiAgICBpZih0aGlzLmdldFNjaGVkdWxlZFN1Ym1pdChmb3JtRWwpKXsgcmV0dXJuIHRydWUgfVxuICAgIHRoaXMuZm9ybVN1Ym1pdHMucHVzaChbZm9ybUVsLCByZWYsIGNhbGxiYWNrXSlcbiAgfVxuXG4gIGNhbmNlbFN1Ym1pdChmb3JtRWwpe1xuICAgIHRoaXMuZm9ybVN1Ym1pdHMgPSB0aGlzLmZvcm1TdWJtaXRzLmZpbHRlcigoW2VsLCByZWYsIF9jYWxsYmFja10pID0+IHtcbiAgICAgIGlmKGVsLmlzU2FtZU5vZGUoZm9ybUVsKSl7XG4gICAgICAgIHRoaXMudW5kb1JlZnMocmVmKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHB1c2hGb3JtU3VibWl0KGZvcm1FbCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgb25SZXBseSl7XG4gICAgbGV0IGZpbHRlcklnbm9yZWQgPSBlbCA9PiB7XG4gICAgICBsZXQgdXNlcklnbm9yZWQgPSBjbG9zZXN0UGh4QmluZGluZyhlbCwgYCR7dGhpcy5iaW5kaW5nKFBIWF9VUERBVEUpfT1pZ25vcmVgLCBlbC5mb3JtKVxuICAgICAgcmV0dXJuICEodXNlcklnbm9yZWQgfHwgY2xvc2VzdFBoeEJpbmRpbmcoZWwsIFwiZGF0YS1waHgtdXBkYXRlPWlnbm9yZVwiLCBlbC5mb3JtKSlcbiAgICB9XG4gICAgbGV0IGZpbHRlckRpc2FibGVzID0gZWwgPT4ge1xuICAgICAgcmV0dXJuIGVsLmhhc0F0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0RJU0FCTEVfV0lUSCkpXG4gICAgfVxuICAgIGxldCBmaWx0ZXJCdXR0b24gPSBlbCA9PiBlbC50YWdOYW1lID09IFwiQlVUVE9OXCJcblxuICAgIGxldCBmaWx0ZXJJbnB1dCA9IGVsID0+IFtcIklOUFVUXCIsIFwiVEVYVEFSRUFcIiwgXCJTRUxFQ1RcIl0uaW5jbHVkZXMoZWwudGFnTmFtZSlcblxuICAgIGxldCByZWZHZW5lcmF0b3IgPSAoKSA9PiB7XG4gICAgICBsZXQgZm9ybUVsZW1lbnRzID0gQXJyYXkuZnJvbShmb3JtRWwuZWxlbWVudHMpXG4gICAgICBsZXQgZGlzYWJsZXMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckRpc2FibGVzKVxuICAgICAgbGV0IGJ1dHRvbnMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckJ1dHRvbikuZmlsdGVyKGZpbHRlcklnbm9yZWQpXG4gICAgICBsZXQgaW5wdXRzID0gZm9ybUVsZW1lbnRzLmZpbHRlcihmaWx0ZXJJbnB1dCkuZmlsdGVyKGZpbHRlcklnbm9yZWQpXG5cbiAgICAgIGJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xuICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgYnV0dG9uLmRpc2FibGVkKVxuICAgICAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlXG4gICAgICB9KVxuICAgICAgaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZLCBpbnB1dC5yZWFkT25seSlcbiAgICAgICAgaW5wdXQucmVhZE9ubHkgPSB0cnVlXG4gICAgICAgIGlmKGlucHV0LmZpbGVzKXtcbiAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVELCBpbnB1dC5kaXNhYmxlZClcbiAgICAgICAgICBpbnB1dC5kaXNhYmxlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGZvcm1FbC5zZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9QQUdFX0xPQURJTkcpLCBcIlwiKVxuICAgICAgcmV0dXJuIHRoaXMucHV0UmVmKFtmb3JtRWxdLmNvbmNhdChkaXNhYmxlcykuY29uY2F0KGJ1dHRvbnMpLmNvbmNhdChpbnB1dHMpLCBcInN1Ym1pdFwiKVxuICAgIH1cblxuICAgIGxldCBjaWQgPSB0aGlzLnRhcmdldENvbXBvbmVudElEKGZvcm1FbCwgdGFyZ2V0Q3R4KVxuICAgIGlmKExpdmVVcGxvYWRlci5oYXNVcGxvYWRzSW5Qcm9ncmVzcyhmb3JtRWwpKXtcbiAgICAgIGxldCBbcmVmLCBfZWxzXSA9IHJlZkdlbmVyYXRvcigpXG4gICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVN1Ym1pdChmb3JtRWwsIHJlZiwgKCkgPT4gdGhpcy5wdXNoRm9ybVN1Ym1pdChmb3JtRWwsIHRhcmdldEN0eCwgcGh4RXZlbnQsIG9uUmVwbHkpKVxuICAgIH0gZWxzZSBpZihMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKXtcbiAgICAgIGxldCBbcmVmLCBlbHNdID0gcmVmR2VuZXJhdG9yKClcbiAgICAgIGxldCBwcm94eVJlZkdlbiA9ICgpID0+IFtyZWYsIGVsc11cbiAgICAgIHRoaXMudXBsb2FkRmlsZXMoZm9ybUVsLCB0YXJnZXRDdHgsIHJlZiwgY2lkLCAoX3VwbG9hZHMpID0+IHtcbiAgICAgICAgbGV0IGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShmb3JtRWwsIHt9KVxuICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocHJveHlSZWZHZW4sIFwiZXZlbnRcIiwge1xuICAgICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgICB2YWx1ZTogZm9ybURhdGEsXG4gICAgICAgICAgY2lkOiBjaWRcbiAgICAgICAgfSwgb25SZXBseSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmb3JtRGF0YSA9IHNlcmlhbGl6ZUZvcm0oZm9ybUVsKVxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgXCJldmVudFwiLCB7XG4gICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICAgIHZhbHVlOiBmb3JtRGF0YSxcbiAgICAgICAgY2lkOiBjaWRcbiAgICAgIH0sIG9uUmVwbHkpXG4gICAgfVxuICB9XG5cbiAgdXBsb2FkRmlsZXMoZm9ybUVsLCB0YXJnZXRDdHgsIHJlZiwgY2lkLCBvbkNvbXBsZXRlKXtcbiAgICBsZXQgam9pbkNvdW50QXRVcGxvYWQgPSB0aGlzLmpvaW5Db3VudFxuICAgIGxldCBpbnB1dEVscyA9IExpdmVVcGxvYWRlci5hY3RpdmVGaWxlSW5wdXRzKGZvcm1FbClcbiAgICBsZXQgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPSBpbnB1dEVscy5sZW5ndGhcblxuICAgIC8vIGdldCBlYWNoIGZpbGUgaW5wdXRcbiAgICBpbnB1dEVscy5mb3JFYWNoKGlucHV0RWwgPT4ge1xuICAgICAgbGV0IHVwbG9hZGVyID0gbmV3IExpdmVVcGxvYWRlcihpbnB1dEVsLCB0aGlzLCAoKSA9PiB7XG4gICAgICAgIG51bUZpbGVJbnB1dHNJblByb2dyZXNzLS1cbiAgICAgICAgaWYobnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPT09IDApeyBvbkNvbXBsZXRlKCkgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMudXBsb2FkZXJzW2lucHV0RWxdID0gdXBsb2FkZXJcbiAgICAgIGxldCBlbnRyaWVzID0gdXBsb2FkZXIuZW50cmllcygpLm1hcChlbnRyeSA9PiBlbnRyeS50b1ByZWZsaWdodFBheWxvYWQoKSlcblxuICAgICAgbGV0IHBheWxvYWQgPSB7XG4gICAgICAgIHJlZjogaW5wdXRFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpLFxuICAgICAgICBlbnRyaWVzOiBlbnRyaWVzLFxuICAgICAgICBjaWQ6IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQoaW5wdXRFbC5mb3JtLCB0YXJnZXRDdHgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtcInNlbmRpbmcgcHJlZmxpZ2h0IHJlcXVlc3RcIiwgcGF5bG9hZF0pXG5cbiAgICAgIHRoaXMucHVzaFdpdGhSZXBseShudWxsLCBcImFsbG93X3VwbG9hZFwiLCBwYXlsb2FkLCByZXNwID0+IHtcbiAgICAgICAgdGhpcy5sb2coXCJ1cGxvYWRcIiwgKCkgPT4gW1wiZ290IHByZWZsaWdodCByZXNwb25zZVwiLCByZXNwXSlcbiAgICAgICAgaWYocmVzcC5lcnJvcil7XG4gICAgICAgICAgdGhpcy51bmRvUmVmcyhyZWYpXG4gICAgICAgICAgbGV0IFtlbnRyeV9yZWYsIHJlYXNvbl0gPSByZXNwLmVycm9yXG4gICAgICAgICAgdGhpcy5sb2coXCJ1cGxvYWRcIiwgKCkgPT4gW2BlcnJvciBmb3IgZW50cnkgJHtlbnRyeV9yZWZ9YCwgcmVhc29uXSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgb25FcnJvciA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGFubmVsLm9uRXJyb3IoKCkgPT4ge1xuICAgICAgICAgICAgICBpZih0aGlzLmpvaW5Db3VudCA9PT0gam9pbkNvdW50QXRVcGxvYWQpeyBjYWxsYmFjaygpIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHVwbG9hZGVyLmluaXRBZGFwdGVyVXBsb2FkKHJlc3AsIG9uRXJyb3IsIHRoaXMubGl2ZVNvY2tldClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgZGlzcGF0Y2hVcGxvYWRzKG5hbWUsIGZpbGVzT3JCbG9icyl7XG4gICAgbGV0IGlucHV0cyA9IERPTS5maW5kVXBsb2FkSW5wdXRzKHRoaXMuZWwpLmZpbHRlcihlbCA9PiBlbC5uYW1lID09PSBuYW1lKVxuICAgIGlmKGlucHV0cy5sZW5ndGggPT09IDApeyBsb2dFcnJvcihgbm8gbGl2ZSBmaWxlIGlucHV0cyBmb3VuZCBtYXRjaGluZyB0aGUgbmFtZSBcIiR7bmFtZX1cImApIH1cbiAgICBlbHNlIGlmKGlucHV0cy5sZW5ndGggPiAxKXsgbG9nRXJyb3IoYGR1cGxpY2F0ZSBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCkgfVxuICAgIGVsc2UgeyBET00uZGlzcGF0Y2hFdmVudChpbnB1dHNbMF0sIFBIWF9UUkFDS19VUExPQURTLCB7ZmlsZXM6IGZpbGVzT3JCbG9ic30pIH1cbiAgfVxuXG4gIHB1c2hGb3JtUmVjb3ZlcnkoZm9ybSwgY2FsbGJhY2spe1xuICAgIHRoaXMubGl2ZVNvY2tldC53aXRoaW5Pd25lcnMoZm9ybSwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgbGV0IGlucHV0ID0gZm9ybS5lbGVtZW50c1swXVxuICAgICAgbGV0IHBoeEV2ZW50ID0gZm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9BVVRPX1JFQ09WRVIpKSB8fCBmb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIikpXG4gICAgICB2aWV3LnB1c2hJbnB1dChpbnB1dCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgaW5wdXQsIGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cblxuICBwdXNoTGlua1BhdGNoKGhyZWYsIHRhcmdldEVsLCBjYWxsYmFjayl7XG4gICAgbGV0IGxpbmtSZWYgPSB0aGlzLmxpdmVTb2NrZXQuc2V0UGVuZGluZ0xpbmsoaHJlZilcbiAgICBsZXQgcmVmR2VuID0gdGFyZ2V0RWwgPyAoKSA9PiB0aGlzLnB1dFJlZihbdGFyZ2V0RWxdLCBcImNsaWNrXCIpIDogbnVsbFxuXG4gICAgdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbiwgXCJsaXZlX3BhdGNoXCIsIHt1cmw6IGhyZWZ9LCByZXNwID0+IHtcbiAgICAgIGlmKHJlc3AubGlua19yZWRpcmVjdCl7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXBsYWNlTWFpbihocmVmLCBudWxsLCBjYWxsYmFjaywgbGlua1JlZilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmKHRoaXMubGl2ZVNvY2tldC5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSl7XG4gICAgICAgICAgdGhpcy5ocmVmID0gaHJlZlxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwbHlQZW5kaW5nVXBkYXRlcygpXG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGxpbmtSZWYpXG4gICAgICB9XG4gICAgfSkucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gdGhpcy5saXZlU29ja2V0LnJlZGlyZWN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSlcbiAgfVxuXG4gIGZvcm1zRm9yUmVjb3ZlcnkoaHRtbCl7XG4gICAgaWYodGhpcy5qb2luQ291bnQgPT09IDApeyByZXR1cm4gW10gfVxuXG4gICAgbGV0IHBoeENoYW5nZSA9IHRoaXMuYmluZGluZyhcImNoYW5nZVwiKVxuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWxcblxuICAgIHJldHVybiAoXG4gICAgICBET00uYWxsKHRoaXMuZWwsIGBmb3JtWyR7cGh4Q2hhbmdlfV1gKVxuICAgICAgICAuZmlsdGVyKGZvcm0gPT4gdGhpcy5vd25zRWxlbWVudChmb3JtKSlcbiAgICAgICAgLmZpbHRlcihmb3JtID0+IGZvcm0uZWxlbWVudHMubGVuZ3RoID4gMClcbiAgICAgICAgLmZpbHRlcihmb3JtID0+IGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfQVVUT19SRUNPVkVSKSkgIT09IFwiaWdub3JlXCIpXG4gICAgICAgIC5maWx0ZXIoZm9ybSA9PiB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3IoYGZvcm1bJHtwaHhDaGFuZ2V9PVwiJHtmb3JtLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpfVwiXWApKVxuICAgIClcbiAgfVxuXG4gIG1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcyl7XG4gICAgbGV0IHdpbGxEZXN0cm95Q0lEcyA9IGRlc3Ryb3llZENJRHMuZmlsdGVyKGNpZCA9PiB7XG4gICAgICByZXR1cm4gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmVsLCBjaWQpLmxlbmd0aCA9PT0gMFxuICAgIH0pXG4gICAgaWYod2lsbERlc3Ryb3lDSURzLmxlbmd0aCA+IDApe1xuICAgICAgdGhpcy5wcnVuaW5nQ0lEcy5wdXNoKC4uLndpbGxEZXN0cm95Q0lEcylcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiY2lkc193aWxsX2Rlc3Ryb3lcIiwge2NpZHM6IHdpbGxEZXN0cm95Q0lEc30sICgpID0+IHtcbiAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGVpdGhlciBiYWNrIG9uIHRoZSBwYWdlIG9yIHRoZXkgd2lsbCBiZSBmdWxseSByZW1vdmVkLFxuICAgICAgICAvLyBzbyB3ZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgcHJ1bmluZ0NJRHMuXG4gICAgICAgIHRoaXMucHJ1bmluZ0NJRHMgPSB0aGlzLnBydW5pbmdDSURzLmZpbHRlcihjaWQgPT4gd2lsbERlc3Ryb3lDSURzLmluZGV4T2YoY2lkKSAhPT0gLTEpXG5cbiAgICAgICAgLy8gU2VlIGlmIGFueSBvZiB0aGUgY2lkcyB3ZSB3YW50ZWQgdG8gZGVzdHJveSB3ZXJlIGFkZGVkIGJhY2ssXG4gICAgICAgIC8vIGlmIHRoZXkgd2VyZSBhZGRlZCBiYWNrLCB3ZSBkb24ndCBhY3R1YWxseSBkZXN0cm95IHRoZW0uXG4gICAgICAgIGxldCBjb21wbGV0ZWx5RGVzdHJveUNJRHMgPSB3aWxsRGVzdHJveUNJRHMuZmlsdGVyKGNpZCA9PiB7XG4gICAgICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5lbCwgY2lkKS5sZW5ndGggPT09IDBcbiAgICAgICAgfSlcblxuICAgICAgICBpZihjb21wbGV0ZWx5RGVzdHJveUNJRHMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiY2lkc19kZXN0cm95ZWRcIiwge2NpZHM6IGNvbXBsZXRlbHlEZXN0cm95Q0lEc30sIChyZXNwKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkLnBydW5lQ0lEcyhyZXNwLmNpZHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBvd25zRWxlbWVudChlbCl7XG4gICAgcmV0dXJuIGVsLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKSA9PT0gdGhpcy5pZCB8fFxuICAgICAgbWF5YmUoZWwuY2xvc2VzdChQSFhfVklFV19TRUxFQ1RPUiksIG5vZGUgPT4gbm9kZS5pZCkgPT09IHRoaXMuaWRcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybSwgdGFyZ2V0Q3R4LCBwaHhFdmVudCl7XG4gICAgRE9NLnB1dFByaXZhdGUoZm9ybSwgUEhYX0hBU19TVUJNSVRURUQsIHRydWUpXG4gICAgdGhpcy5saXZlU29ja2V0LmJsdXJBY3RpdmVFbGVtZW50KHRoaXMpXG4gICAgdGhpcy5wdXNoRm9ybVN1Ym1pdChmb3JtLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCAoKSA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQucmVzdG9yZVByZXZpb3VzbHlBY3RpdmVGb2N1cygpXG4gICAgfSlcbiAgfVxuXG4gIGJpbmRpbmcoa2luZCl7IHJldHVybiB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhraW5kKSB9XG59XG4iLCAiLyoqIEluaXRpYWxpemVzIHRoZSBMaXZlU29ja2V0XG4gKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmRQb2ludCAtIFRoZSBzdHJpbmcgV2ViU29ja2V0IGVuZHBvaW50LCBpZSwgYFwid3NzOi8vZXhhbXBsZS5jb20vbGl2ZVwiYCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXCIvbGl2ZVwiYCAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAqIEBwYXJhbSB7UGhvZW5peC5Tb2NrZXR9IHNvY2tldCAtIHRoZSByZXF1aXJlZCBQaG9lbml4IFNvY2tldCBjbGFzcyBpbXBvcnRlZCBmcm9tIFwicGhvZW5peFwiLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcbiAqICAgICBpbXBvcnQge0xpdmVTb2NrZXR9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiXG4gKiAgICAgbGV0IGxpdmVTb2NrZXQgPSBuZXcgTGl2ZVNvY2tldChcIi9saXZlXCIsIFNvY2tldCwgey4uLn0pXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24uIE91dHNpZGUgb2Yga2V5cyBsaXN0ZWQgYmVsb3csIGFsbFxuICogY29uZmlndXJhdGlvbiBpcyBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIFBob2VuaXggU29ja2V0IGNvbnN0cnVjdG9yLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLmRlZmF1bHRzXSAtIFRoZSBvcHRpb25hbCBkZWZhdWx0cyB0byB1c2UgZm9yIHZhcmlvdXMgYmluZGluZ3MsXG4gKiBzdWNoIGFzIGBwaHgtZGVib3VuY2VgLiBTdXBwb3J0cyB0aGUgZm9sbG93aW5nIGtleXM6XG4gKlxuICogICAtIGRlYm91bmNlIC0gdGhlIG1pbGxpc2Vjb25kIHBoeC1kZWJvdW5jZSB0aW1lLiBEZWZhdWx0cyAzMDBcbiAqICAgLSB0aHJvdHRsZSAtIHRoZSBtaWxsaXNlY29uZCBwaHgtdGhyb3R0bGUgdGltZS4gRGVmYXVsdHMgMzAwXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMucGFyYW1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiBmb3IgcGFzc2luZyBjb25uZWN0IHBhcmFtcy5cbiAqIFRoZSBmdW5jdGlvbiByZWNlaXZlcyB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBMaXZlVmlldy4gRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIChlbCkgPT4ge3ZpZXc6IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtbXktdmlldy1uYW1lXCIsIHRva2VuOiB3aW5kb3cubXlUb2tlbn1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmluZGluZ1ByZWZpeF0gLSBUaGUgb3B0aW9uYWwgcHJlZml4IHRvIHVzZSBmb3IgYWxsIHBoeCBET00gYW5ub3RhdGlvbnMuXG4gKiBEZWZhdWx0cyB0byBcInBoeC1cIi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy5ob29rc10gLSBUaGUgb3B0aW9uYWwgb2JqZWN0IGZvciByZWZlcmVuY2luZyBMaXZlVmlldyBob29rIGNhbGxiYWNrcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy51cGxvYWRlcnNdIC0gVGhlIG9wdGlvbmFsIG9iamVjdCBmb3IgcmVmZXJlbmNpbmcgTGl2ZVZpZXcgdXBsb2FkZXIgY2FsbGJhY2tzLlxuICogQHBhcmFtIHtpbnRlZ2VyfSBbb3B0cy5sb2FkZXJUaW1lb3V0XSAtIFRoZSBvcHRpb25hbCBkZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgYXBwbHlcbiAqIGxvYWRpbmcgc3RhdGVzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMudmlld0xvZ2dlcl0gLSBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gdG8gbG9nIGRlYnVnIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgKHZpZXcsIGtpbmQsIG1zZywgb2JqKSA9PiBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLm1ldGFkYXRhXSAtIFRoZSBvcHRpb25hbCBvYmplY3QgbWFwcGluZyBldmVudCBuYW1lcyB0byBmdW5jdGlvbnMgZm9yXG4gKiBwb3B1bGF0aW5nIGV2ZW50IG1ldGFkYXRhLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgbWV0YWRhdGE6IHtcbiAqICAgICAgIGNsaWNrOiAoZSwgZWwpID0+IHtcbiAqICAgICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gKiAgICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICogICAgICAgICAgIGRldGFpbDogZS5kZXRhaWwgfHwgMSxcbiAqICAgICAgICAgfVxuICogICAgICAgfSxcbiAqICAgICAgIGtleWRvd246IChlLCBlbCkgPT4ge1xuICogICAgICAgICByZXR1cm4ge1xuICogICAgICAgICAgIGtleTogZS5rZXksXG4gKiAgICAgICAgICAgY3RybEtleTogZS5jdHJsS2V5LFxuICogICAgICAgICAgIG1ldGFLZXk6IGUubWV0YUtleSxcbiAqICAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleVxuICogICAgICAgICB9XG4gKiAgICAgICB9XG4gKiAgICAgfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLnNlc3Npb25TdG9yYWdlXSAtIEFuIG9wdGlvbmFsIFN0b3JhZ2UgY29tcGF0aWJsZSBvYmplY3RcbiAqIFVzZWZ1bCB3aGVuIExpdmVWaWV3IHdvbid0IGhhdmUgYWNjZXNzIHRvIGBzZXNzaW9uU3RvcmFnZWAuICBGb3IgZXhhbXBsZSwgVGhpcyBjb3VsZFxuICogaGFwcGVuIGlmIGEgc2l0ZSBsb2FkcyBhIGNyb3NzLWRvbWFpbiBMaXZlVmlldyBpbiBhbiBpZnJhbWUuICBFeGFtcGxlIHVzYWdlOlxuICpcbiAqICAgICBjbGFzcyBJbk1lbW9yeVN0b3JhZ2Uge1xuICogICAgICAgY29uc3RydWN0b3IoKSB7IHRoaXMuc3RvcmFnZSA9IHt9IH1cbiAqICAgICAgIGdldEl0ZW0oa2V5TmFtZSkgeyByZXR1cm4gdGhpcy5zdG9yYWdlW2tleU5hbWVdIH1cbiAqICAgICAgIHJlbW92ZUl0ZW0oa2V5TmFtZSkgeyBkZWxldGUgdGhpcy5zdG9yYWdlW2tleU5hbWVdIH1cbiAqICAgICAgIHNldEl0ZW0oa2V5TmFtZSwga2V5VmFsdWUpIHsgdGhpcy5zdG9yYWdlW2tleU5hbWVdID0ga2V5VmFsdWUgfVxuICogICAgIH1cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMubG9jYWxTdG9yYWdlXSAtIEFuIG9wdGlvbmFsIFN0b3JhZ2UgY29tcGF0aWJsZSBvYmplY3RcbiAqIFVzZWZ1bCBmb3Igd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgbG9jYWxTdG9yYWdlYC5cbiAqIFNlZSBgb3B0cy5zZXNzaW9uU3RvcmFnZWAgZm9yIGV4YW1wbGVzLlxuKi9cblxuaW1wb3J0IHtcbiAgQklORElOR19QUkVGSVgsXG4gIENPTlNFQ1VUSVZFX1JFTE9BRFMsXG4gIERFRkFVTFRTLFxuICBGQUlMU0FGRV9KSVRURVIsXG4gIExPQURFUl9USU1FT1VULFxuICBNQVhfUkVMT0FEUyxcbiAgUEhYX0RFQk9VTkNFLFxuICBQSFhfRFJPUF9UQVJHRVQsXG4gIFBIWF9IQVNfRk9DVVNFRCxcbiAgUEhYX0tFWSxcbiAgUEhYX0xJTktfU1RBVEUsXG4gIFBIWF9MSVZFX0xJTkssXG4gIFBIWF9MVl9ERUJVRyxcbiAgUEhYX0xWX0xBVEVOQ1lfU0lNLFxuICBQSFhfTFZfUFJPRklMRSxcbiAgUEhYX01BSU4sXG4gIFBIWF9QQVJFTlRfSUQsXG4gIFBIWF9WSUVXX1NFTEVDVE9SLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1RIUk9UVExFLFxuICBQSFhfVFJBQ0tfVVBMT0FEUyxcbiAgUkVMT0FEX0pJVFRFUlxuXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgY2xvc3VyZSxcbiAgZGVidWcsXG4gIG1heWJlXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiXG5pbXBvcnQgSG9va3MgZnJvbSBcIi4vaG9va3NcIlxuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCJcbmltcG9ydCBWaWV3IGZyb20gXCIuL3ZpZXdcIlxuaW1wb3J0IHtQSFhfU0VTU0lPTn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKHVybCwgcGh4U29ja2V0LCBvcHRzID0ge30pe1xuICAgIHRoaXMudW5sb2FkZWQgPSBmYWxzZVxuICAgIGlmKCFwaHhTb2NrZXQgfHwgcGh4U29ja2V0LmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiT2JqZWN0XCIpe1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcbiAgICAgIGEgcGhvZW5peCBTb2NrZXQgbXVzdCBiZSBwcm92aWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBMaXZlU29ja2V0IGNvbnN0cnVjdG9yLiBGb3IgZXhhbXBsZTpcblxuICAgICAgICAgIGltcG9ydCB7U29ja2V0fSBmcm9tIFwicGhvZW5peFwiXG4gICAgICAgICAgaW1wb3J0IExpdmVTb2NrZXQgZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICAgICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcbiAgICAgIGApXG4gICAgfVxuICAgIHRoaXMuc29ja2V0ID0gbmV3IHBoeFNvY2tldCh1cmwsIG9wdHMpXG4gICAgdGhpcy5iaW5kaW5nUHJlZml4ID0gb3B0cy5iaW5kaW5nUHJlZml4IHx8IEJJTkRJTkdfUFJFRklYXG4gICAgdGhpcy5vcHRzID0gb3B0c1xuICAgIHRoaXMucGFyYW1zID0gY2xvc3VyZShvcHRzLnBhcmFtcyB8fCB7fSlcbiAgICB0aGlzLnZpZXdMb2dnZXIgPSBvcHRzLnZpZXdMb2dnZXJcbiAgICB0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzID0gb3B0cy5tZXRhZGF0YSB8fCB7fVxuICAgIHRoaXMuZGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKGNsb25lKERFRkFVTFRTKSwgb3B0cy5kZWZhdWx0cyB8fCB7fSlcbiAgICB0aGlzLmFjdGl2ZUVsZW1lbnQgPSBudWxsXG4gICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbFxuICAgIHRoaXMuc2lsZW5jZWQgPSBmYWxzZVxuICAgIHRoaXMubWFpbiA9IG51bGxcbiAgICB0aGlzLmxpbmtSZWYgPSAxXG4gICAgdGhpcy5yb290cyA9IHt9XG4gICAgdGhpcy5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICB0aGlzLnBlbmRpbmdMaW5rID0gbnVsbFxuICAgIHRoaXMuY3VycmVudExvY2F0aW9uID0gY2xvbmUod2luZG93LmxvY2F0aW9uKVxuICAgIHRoaXMuaG9va3MgPSBvcHRzLmhvb2tzIHx8IHt9XG4gICAgdGhpcy51cGxvYWRlcnMgPSBvcHRzLnVwbG9hZGVycyB8fCB7fVxuICAgIHRoaXMubG9hZGVyVGltZW91dCA9IG9wdHMubG9hZGVyVGltZW91dCB8fCBMT0FERVJfVElNRU9VVFxuICAgIHRoaXMubG9jYWxTdG9yYWdlID0gb3B0cy5sb2NhbFN0b3JhZ2UgfHwgd2luZG93LmxvY2FsU3RvcmFnZVxuICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2UgPSBvcHRzLnNlc3Npb25TdG9yYWdlIHx8IHdpbmRvdy5zZXNzaW9uU3RvcmFnZVxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IGZhbHNlXG4gICAgdGhpcy5kb21DYWxsYmFja3MgPSBPYmplY3QuYXNzaWduKHtvbk5vZGVBZGRlZDogY2xvc3VyZSgpLCBvbkJlZm9yZUVsVXBkYXRlZDogY2xvc3VyZSgpfSwgb3B0cy5kb20gfHwge30pXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZVxuICAgIH0pXG4gICAgdGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIGlmKHRoaXMuaXNVbmxvYWRlZCgpKXtcbiAgICAgICAgLy8gcmVsb2FkIHBhZ2UgaWYgYmVpbmcgcmVzdG9yZWQgZnJvbSBiYWNrL2ZvcndhcmQgY2FjaGUgYW5kIGJyb3dzZXIgZG9lcyBub3QgZW1pdCBcInBhZ2VzaG93XCJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIHB1YmxpY1xuXG4gIGlzUHJvZmlsZUVuYWJsZWQoKXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfUFJPRklMRSkgPT09IFwidHJ1ZVwiIH1cblxuICBpc0RlYnVnRW5hYmxlZCgpeyByZXR1cm4gdGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9ERUJVRykgPT09IFwidHJ1ZVwiIH1cblxuICBlbmFibGVEZWJ1ZygpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0RFQlVHLCBcInRydWVcIikgfVxuXG4gIGVuYWJsZVByb2ZpbGluZygpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX1BST0ZJTEUsIFwidHJ1ZVwiKSB9XG5cbiAgZGlzYWJsZURlYnVnKCl7IHRoaXMuc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShQSFhfTFZfREVCVUcpIH1cblxuICBkaXNhYmxlUHJvZmlsaW5nKCl7IHRoaXMuc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShQSFhfTFZfUFJPRklMRSkgfVxuXG4gIGVuYWJsZUxhdGVuY3lTaW0odXBwZXJCb3VuZE1zKXtcbiAgICB0aGlzLmVuYWJsZURlYnVnKClcbiAgICBjb25zb2xlLmxvZyhcImxhdGVuY3kgc2ltdWxhdG9yIGVuYWJsZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIGJyb3dzZXIgc2Vzc2lvbi4gQ2FsbCBkaXNhYmxlTGF0ZW5jeVNpbSgpIHRvIGRpc2FibGVcIilcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNLCB1cHBlckJvdW5kTXMpXG4gIH1cblxuICBkaXNhYmxlTGF0ZW5jeVNpbSgpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNKSB9XG5cbiAgZ2V0TGF0ZW5jeVNpbSgpe1xuICAgIGxldCBzdHIgPSB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNKVxuICAgIHJldHVybiBzdHIgPyBwYXJzZUludChzdHIpIDogbnVsbFxuICB9XG5cbiAgZ2V0U29ja2V0KCl7IHJldHVybiB0aGlzLnNvY2tldCB9XG5cbiAgY29ubmVjdCgpe1xuICAgIGxldCBkb0Nvbm5lY3QgPSAoKSA9PiB7XG4gICAgICBpZih0aGlzLmpvaW5Sb290Vmlld3MoKSl7XG4gICAgICAgIHRoaXMuYmluZFRvcExldmVsRXZlbnRzKClcbiAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmKFtcImNvbXBsZXRlXCIsIFwibG9hZGVkXCIsIFwiaW50ZXJhY3RpdmVcIl0uaW5kZXhPZihkb2N1bWVudC5yZWFkeVN0YXRlKSA+PSAwKXtcbiAgICAgIGRvQ29ubmVjdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IGRvQ29ubmVjdCgpKVxuICAgIH1cbiAgfVxuXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2speyB0aGlzLnNvY2tldC5kaXNjb25uZWN0KGNhbGxiYWNrKSB9XG5cbiAgLy8gcHJpdmF0ZVxuXG4gIHRyaWdnZXJET00oa2luZCwgYXJncyl7IHRoaXMuZG9tQ2FsbGJhY2tzW2tpbmRdKC4uLmFyZ3MpIH1cblxuICB0aW1lKG5hbWUsIGZ1bmMpe1xuICAgIGlmKCF0aGlzLmlzUHJvZmlsZUVuYWJsZWQoKSB8fCAhY29uc29sZS50aW1lKXsgcmV0dXJuIGZ1bmMoKSB9XG4gICAgY29uc29sZS50aW1lKG5hbWUpXG4gICAgbGV0IHJlc3VsdCA9IGZ1bmMoKVxuICAgIGNvbnNvbGUudGltZUVuZChuYW1lKVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGxvZyh2aWV3LCBraW5kLCBtc2dDYWxsYmFjayl7XG4gICAgaWYodGhpcy52aWV3TG9nZ2VyKXtcbiAgICAgIGxldCBbbXNnLCBvYmpdID0gbXNnQ2FsbGJhY2soKVxuICAgICAgdGhpcy52aWV3TG9nZ2VyKHZpZXcsIGtpbmQsIG1zZywgb2JqKVxuICAgIH0gZWxzZSBpZih0aGlzLmlzRGVidWdFbmFibGVkKCkpe1xuICAgICAgbGV0IFttc2csIG9ial0gPSBtc2dDYWxsYmFjaygpXG4gICAgICBkZWJ1Zyh2aWV3LCBraW5kLCBtc2csIG9iailcbiAgICB9XG4gIH1cblxuICBvbkNoYW5uZWwoY2hhbm5lbCwgZXZlbnQsIGNiKXtcbiAgICBjaGFubmVsLm9uKGV2ZW50LCBkYXRhID0+IHtcbiAgICAgIGxldCBsYXRlbmN5ID0gdGhpcy5nZXRMYXRlbmN5U2ltKClcbiAgICAgIGlmKCFsYXRlbmN5KXtcbiAgICAgICAgY2IoZGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBzaW11bGF0aW5nICR7bGF0ZW5jeX1tcyBvZiBsYXRlbmN5IGZyb20gc2VydmVyIHRvIGNsaWVudGApXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2IoZGF0YSksIGxhdGVuY3kpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHdyYXBQdXNoKHZpZXcsIG9wdHMsIHB1c2gpe1xuICAgIGxldCBsYXRlbmN5ID0gdGhpcy5nZXRMYXRlbmN5U2ltKClcbiAgICBsZXQgb2xkSm9pbkNvdW50ID0gdmlldy5qb2luQ291bnRcbiAgICBpZighbGF0ZW5jeSl7XG4gICAgICBpZihvcHRzLnRpbWVvdXQpe1xuICAgICAgICByZXR1cm4gcHVzaCgpLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IHtcbiAgICAgICAgICBpZih2aWV3LmpvaW5Db3VudCA9PT0gb2xkSm9pbkNvdW50ICYmICF2aWV3LmlzRGVzdHJveWVkKCkpe1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRXaXRoSml0dGVyKHZpZXcsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2codmlldywgXCJ0aW1lb3V0XCIsICgpID0+IFtcInJlY2VpdmVkIHRpbWVvdXQgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlci4gRmFsbGluZyBiYWNrIHRvIGhhcmQgcmVmcmVzaCBmb3IgcmVjb3ZlcnlcIl0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwdXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgc2ltdWxhdGluZyAke2xhdGVuY3l9bXMgb2YgbGF0ZW5jeSBmcm9tIGNsaWVudCB0byBzZXJ2ZXJgKVxuICAgIGxldCBmYWtlUHVzaCA9IHtcbiAgICAgIHJlY2VpdmVzOiBbXSxcbiAgICAgIHJlY2VpdmUoa2luZCwgY2IpeyB0aGlzLnJlY2VpdmVzLnB1c2goW2tpbmQsIGNiXSkgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmKHZpZXcuaXNEZXN0cm95ZWQoKSl7IHJldHVybiB9XG4gICAgICBmYWtlUHVzaC5yZWNlaXZlcy5yZWR1Y2UoKGFjYywgW2tpbmQsIGNiXSkgPT4gYWNjLnJlY2VpdmUoa2luZCwgY2IpLCBwdXNoKCkpXG4gICAgfSwgbGF0ZW5jeSlcbiAgICByZXR1cm4gZmFrZVB1c2hcbiAgfVxuXG4gIHJlbG9hZFdpdGhKaXR0ZXIodmlldywgbG9nKXtcbiAgICB2aWV3LmRlc3Ryb3koKVxuICAgIHRoaXMuZGlzY29ubmVjdCgpXG4gICAgbGV0IFttaW5NcywgbWF4TXNdID0gUkVMT0FEX0pJVFRFUlxuICAgIGxldCBhZnRlck1zID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heE1zIC0gbWluTXMgKyAxKSkgKyBtaW5Nc1xuICAgIGxldCB0cmllcyA9IEJyb3dzZXIudXBkYXRlTG9jYWwodGhpcy5sb2NhbFN0b3JhZ2UsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwgQ09OU0VDVVRJVkVfUkVMT0FEUywgMCwgY291bnQgPT4gY291bnQgKyAxKVxuICAgIGxvZyA/IGxvZygpIDogdGhpcy5sb2codmlldywgXCJqb2luXCIsICgpID0+IFtgZW5jb3VudGVyZWQgJHt0cmllc30gY29uc2VjdXRpdmUgcmVsb2Fkc2BdKVxuICAgIGlmKHRyaWVzID4gTUFYX1JFTE9BRFMpe1xuICAgICAgdGhpcy5sb2codmlldywgXCJqb2luXCIsICgpID0+IFtgZXhjZWVkZWQgJHtNQVhfUkVMT0FEU30gY29uc2VjdXRpdmUgcmVsb2Fkcy4gRW50ZXJpbmcgZmFpbHNhZmUgbW9kZWBdKVxuICAgICAgYWZ0ZXJNcyA9IEZBSUxTQUZFX0pJVFRFUlxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmKHRoaXMuaGFzUGVuZGluZ0xpbmsoKSl7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMucGVuZGluZ0xpbmtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgfVxuICAgIH0sIGFmdGVyTXMpXG4gIH1cblxuICBnZXRIb29rQ2FsbGJhY2tzKG5hbWUpe1xuICAgIHJldHVybiBuYW1lICYmIG5hbWUuc3RhcnRzV2l0aChcIlBob2VuaXguXCIpID8gSG9va3NbbmFtZS5zcGxpdChcIi5cIilbMV1dIDogdGhpcy5ob29rc1tuYW1lXVxuICB9XG5cbiAgaXNVbmxvYWRlZCgpeyByZXR1cm4gdGhpcy51bmxvYWRlZCB9XG5cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkgfVxuXG4gIGdldEJpbmRpbmdQcmVmaXgoKXsgcmV0dXJuIHRoaXMuYmluZGluZ1ByZWZpeCB9XG5cbiAgYmluZGluZyhraW5kKXsgcmV0dXJuIGAke3RoaXMuZ2V0QmluZGluZ1ByZWZpeCgpfSR7a2luZH1gIH1cblxuICBjaGFubmVsKHRvcGljLCBwYXJhbXMpeyByZXR1cm4gdGhpcy5zb2NrZXQuY2hhbm5lbCh0b3BpYywgcGFyYW1zKSB9XG5cbiAgam9pblJvb3RWaWV3cygpe1xuICAgIGxldCByb290c0ZvdW5kID0gZmFsc2VcbiAgICBET00uYWxsKGRvY3VtZW50LCBgJHtQSFhfVklFV19TRUxFQ1RPUn06bm90KFske1BIWF9QQVJFTlRfSUR9XSlgLCByb290RWwgPT4ge1xuICAgICAgaWYoIXRoaXMuZ2V0Um9vdEJ5SWQocm9vdEVsLmlkKSl7XG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5uZXdSb290Vmlldyhyb290RWwpXG4gICAgICAgIHZpZXcuc2V0SHJlZih0aGlzLmdldEhyZWYoKSlcbiAgICAgICAgdmlldy5qb2luKClcbiAgICAgICAgaWYocm9vdEVsLmdldEF0dHJpYnV0ZShQSFhfTUFJTikpeyB0aGlzLm1haW4gPSB2aWV3IH1cbiAgICAgIH1cbiAgICAgIHJvb3RzRm91bmQgPSB0cnVlXG4gICAgfSlcbiAgICByZXR1cm4gcm9vdHNGb3VuZFxuICB9XG5cbiAgcmVkaXJlY3QodG8sIGZsYXNoKXtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKVxuICAgIEJyb3dzZXIucmVkaXJlY3QodG8sIGZsYXNoKVxuICB9XG5cbiAgcmVwbGFjZU1haW4oaHJlZiwgZmxhc2gsIGNhbGxiYWNrID0gbnVsbCwgbGlua1JlZiA9IHRoaXMuc2V0UGVuZGluZ0xpbmsoaHJlZikpe1xuICAgIGxldCBvbGRNYWluRWwgPSB0aGlzLm1haW4uZWxcbiAgICBsZXQgbmV3TWFpbkVsID0gRE9NLmNsb25lTm9kZShvbGRNYWluRWwsIFwiXCIpXG4gICAgdGhpcy5tYWluLnNob3dMb2FkZXIodGhpcy5sb2FkZXJUaW1lb3V0KVxuICAgIHRoaXMubWFpbi5kZXN0cm95KClcblxuICAgIHRoaXMubWFpbiA9IHRoaXMubmV3Um9vdFZpZXcobmV3TWFpbkVsLCBmbGFzaClcbiAgICB0aGlzLm1haW4uc2V0UmVkaXJlY3QoaHJlZilcbiAgICB0aGlzLm1haW4uam9pbihqb2luQ291bnQgPT4ge1xuICAgICAgaWYoam9pbkNvdW50ID09PSAxICYmIHRoaXMuY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZikpe1xuICAgICAgICBvbGRNYWluRWwucmVwbGFjZVdpdGgobmV3TWFpbkVsKVxuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGlzUGh4VmlldyhlbCl7IHJldHVybiBlbC5nZXRBdHRyaWJ1dGUgJiYgZWwuZ2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OKSAhPT0gbnVsbCB9XG5cbiAgbmV3Um9vdFZpZXcoZWwsIGZsYXNoKXtcbiAgICBsZXQgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLCBudWxsLCBmbGFzaClcbiAgICB0aGlzLnJvb3RzW3ZpZXcuaWRdID0gdmlld1xuICAgIHJldHVybiB2aWV3XG4gIH1cblxuICBvd25lcihjaGlsZEVsLCBjYWxsYmFjayl7XG4gICAgbGV0IHZpZXcgPSBtYXliZShjaGlsZEVsLmNsb3Nlc3QoUEhYX1ZJRVdfU0VMRUNUT1IpLCBlbCA9PiB0aGlzLmdldFZpZXdCeUVsKGVsKSlcbiAgICBpZih2aWV3KXsgY2FsbGJhY2sodmlldykgfVxuICB9XG5cbiAgd2l0aGluT3duZXJzKGNoaWxkRWwsIGNhbGxiYWNrKXtcbiAgICB0aGlzLm93bmVyKGNoaWxkRWwsIHZpZXcgPT4ge1xuICAgICAgbGV0IHBoeFRhcmdldCA9IGNoaWxkRWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInRhcmdldFwiKSlcbiAgICAgIGlmKHBoeFRhcmdldCA9PT0gbnVsbCl7XG4gICAgICAgIGNhbGxiYWNrKHZpZXcsIGNoaWxkRWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2aWV3LndpdGhpblRhcmdldHMocGh4VGFyZ2V0LCBjYWxsYmFjaylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0Vmlld0J5RWwoZWwpe1xuICAgIGxldCByb290SWQgPSBlbC5nZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQpXG4gICAgcmV0dXJuIG1heWJlKHRoaXMuZ2V0Um9vdEJ5SWQocm9vdElkKSwgcm9vdCA9PiByb290LmdldERlc2NlbmRlbnRCeUVsKGVsKSlcbiAgfVxuXG4gIGdldFJvb3RCeUlkKGlkKXsgcmV0dXJuIHRoaXMucm9vdHNbaWRdIH1cblxuICBkZXN0cm95QWxsVmlld3MoKXtcbiAgICBmb3IobGV0IGlkIGluIHRoaXMucm9vdHMpe1xuICAgICAgdGhpcy5yb290c1tpZF0uZGVzdHJveSgpXG4gICAgICBkZWxldGUgdGhpcy5yb290c1tpZF1cbiAgICB9XG4gIH1cblxuICBkZXN0cm95Vmlld0J5RWwoZWwpe1xuICAgIGxldCByb290ID0gdGhpcy5nZXRSb290QnlJZChlbC5nZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQpKVxuICAgIGlmKHJvb3QpeyByb290LmRlc3Ryb3lEZXNjZW5kZW50KGVsLmlkKSB9XG4gIH1cblxuICBzZXRBY3RpdmVFbGVtZW50KHRhcmdldCl7XG4gICAgaWYodGhpcy5hY3RpdmVFbGVtZW50ID09PSB0YXJnZXQpeyByZXR1cm4gfVxuICAgIHRoaXMuYWN0aXZlRWxlbWVudCA9IHRhcmdldFxuICAgIGxldCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICBpZih0YXJnZXQgPT09IHRoaXMuYWN0aXZlRWxlbWVudCl7IHRoaXMuYWN0aXZlRWxlbWVudCA9IG51bGwgfVxuICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMpXG4gICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIHRoaXMpXG4gICAgfVxuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBjYW5jZWwpXG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCBjYW5jZWwpXG4gIH1cblxuICBnZXRBY3RpdmVFbGVtZW50KCl7XG4gICAgaWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSl7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVFbGVtZW50IHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBjYW4gYmUgbnVsbCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMVxuICAgICAgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keVxuICAgIH1cbiAgfVxuXG4gIGRyb3BBY3RpdmVFbGVtZW50KHZpZXcpe1xuICAgIGlmKHRoaXMucHJldkFjdGl2ZSAmJiB2aWV3Lm93bnNFbGVtZW50KHRoaXMucHJldkFjdGl2ZSkpe1xuICAgICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKXtcbiAgICBpZih0aGlzLnByZXZBY3RpdmUgJiYgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5KXtcbiAgICAgIHRoaXMucHJldkFjdGl2ZS5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgYmx1ckFjdGl2ZUVsZW1lbnQoKXtcbiAgICB0aGlzLnByZXZBY3RpdmUgPSB0aGlzLmdldEFjdGl2ZUVsZW1lbnQoKVxuICAgIGlmKHRoaXMucHJldkFjdGl2ZSAhPT0gZG9jdW1lbnQuYm9keSl7IHRoaXMucHJldkFjdGl2ZS5ibHVyKCkgfVxuICB9XG5cbiAgYmluZFRvcExldmVsRXZlbnRzKCl7XG4gICAgaWYodGhpcy5ib3VuZFRvcExldmVsRXZlbnRzKXsgcmV0dXJuIH1cblxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IHRydWVcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoKXsgfSkgLy8gZW5zdXJlIGFsbCBjbGljayBldmVudHMgYnViYmxlIGZvciBtb2JpbGUgU2FmYXJpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlc2hvd1wiLCBlID0+IHtcbiAgICAgIGlmKGUucGVyc2lzdGVkKXsgLy8gcmVsb2FkIHBhZ2UgaWYgYmVpbmcgcmVzdG9yZWQgZnJvbSBiYWNrL2ZvcndhcmQgY2FjaGVcbiAgICAgICAgdGhpcy5nZXRTb2NrZXQoKS5kaXNjb25uZWN0KClcbiAgICAgICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoe3RvOiB3aW5kb3cubG9jYXRpb24uaHJlZiwga2luZDogXCJyZWRpcmVjdFwifSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICB9XG4gICAgfSwgdHJ1ZSlcbiAgICB0aGlzLmJpbmROYXYoKVxuICAgIHRoaXMuYmluZENsaWNrcygpXG4gICAgdGhpcy5iaW5kRm9ybXMoKVxuICAgIHRoaXMuYmluZCh7a2V5dXA6IFwia2V5dXBcIiwga2V5ZG93bjogXCJrZXlkb3duXCJ9LCAoZSwgdHlwZSwgdmlldywgdGFyZ2V0LCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBfcGh4VGFyZ2V0KSA9PiB7XG4gICAgICBsZXQgbWF0Y2hLZXkgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfS0VZKSlcbiAgICAgIGxldCBwcmVzc2VkS2V5ID0gZS5rZXkgJiYgZS5rZXkudG9Mb3dlckNhc2UoKSAvLyBjaHJvbWUgY2xpY2tlZCBhdXRvY29tcGxldGVzIHNlbmQgYSBrZXlkb3duIHdpdGhvdXQga2V5XG4gICAgICBpZihtYXRjaEtleSAmJiBtYXRjaEtleS50b0xvd2VyQ2FzZSgpICE9PSBwcmVzc2VkS2V5KXsgcmV0dXJuIH1cblxuICAgICAgdmlldy5wdXNoS2V5KHRhcmdldCwgdGFyZ2V0Q3R4LCB0eXBlLCBwaHhFdmVudCwge2tleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldCl9KVxuICAgIH0pXG4gICAgdGhpcy5iaW5kKHtibHVyOiBcImZvY3Vzb3V0XCIsIGZvY3VzOiBcImZvY3VzaW5cIn0sIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgcGh4VGFyZ2V0KSA9PiB7XG4gICAgICBpZighcGh4VGFyZ2V0KXtcbiAgICAgICAgdmlldy5wdXNoRXZlbnQodHlwZSwgdGFyZ2V0RWwsIHRhcmdldEN0eCwgcGh4RXZlbnQsIHRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuYmluZCh7Ymx1cjogXCJibHVyXCIsIGZvY3VzOiBcImZvY3VzXCJ9LCAoZSwgdHlwZSwgdmlldywgdGFyZ2V0RWwsIHRhcmdldEN0eCwgcGh4RXZlbnQsIHBoeFRhcmdldCkgPT4ge1xuICAgICAgLy8gYmx1ciBhbmQgZm9jdXMgYXJlIHRyaWdnZXJlZCBvbiBkb2N1bWVudCBhbmQgd2luZG93LiBEaXNjYXJkIG9uZSB0byBhdm9pZCBkdXBzXG4gICAgICBpZihwaHhUYXJnZXQgJiYgIXBoeFRhcmdldCAhPT0gXCJ3aW5kb3dcIil7XG4gICAgICAgIHZpZXcucHVzaEV2ZW50KHR5cGUsIHRhcmdldEVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCB0aGlzLmV2ZW50TWV0YSh0eXBlLCBlLCB0YXJnZXRFbCkpXG4gICAgICB9XG4gICAgfSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIGUgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZHJvcFwiLCBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgbGV0IGRyb3BUYXJnZXRJZCA9IG1heWJlKGNsb3Nlc3RQaHhCaW5kaW5nKGUudGFyZ2V0LCB0aGlzLmJpbmRpbmcoUEhYX0RST1BfVEFSR0VUKSksIHRydWVUYXJnZXQgPT4ge1xuICAgICAgICByZXR1cm4gdHJ1ZVRhcmdldC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9EUk9QX1RBUkdFVCkpXG4gICAgICB9KVxuICAgICAgbGV0IGRyb3BUYXJnZXQgPSBkcm9wVGFyZ2V0SWQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZHJvcFRhcmdldElkKVxuICAgICAgbGV0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRhdGFUcmFuc2Zlci5maWxlcyB8fCBbXSlcbiAgICAgIGlmKCFkcm9wVGFyZ2V0IHx8IGRyb3BUYXJnZXQuZGlzYWJsZWQgfHwgZmlsZXMubGVuZ3RoID09PSAwIHx8ICEoZHJvcFRhcmdldC5maWxlcyBpbnN0YW5jZW9mIEZpbGVMaXN0KSl7IHJldHVybiB9XG5cbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGRyb3BUYXJnZXQsIGZpbGVzKVxuICAgICAgZHJvcFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgfSlcbiAgICB0aGlzLm9uKFBIWF9UUkFDS19VUExPQURTLCBlID0+IHtcbiAgICAgIGxldCB1cGxvYWRUYXJnZXQgPSBlLnRhcmdldFxuICAgICAgaWYoIURPTS5pc1VwbG9hZElucHV0KHVwbG9hZFRhcmdldCkpeyByZXR1cm4gfVxuICAgICAgbGV0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRldGFpbC5maWxlcyB8fCBbXSkuZmlsdGVyKGYgPT4gZiBpbnN0YW5jZW9mIEZpbGUgfHwgZiBpbnN0YW5jZW9mIEJsb2IpXG4gICAgICBMaXZlVXBsb2FkZXIudHJhY2tGaWxlcyh1cGxvYWRUYXJnZXQsIGZpbGVzKVxuICAgICAgdXBsb2FkVGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIiwge2J1YmJsZXM6IHRydWV9KSlcbiAgICB9KVxuICB9XG5cbiAgZXZlbnRNZXRhKGV2ZW50TmFtZSwgZSwgdGFyZ2V0RWwpe1xuICAgIGxldCBjYWxsYmFjayA9IHRoaXMubWV0YWRhdGFDYWxsYmFja3NbZXZlbnROYW1lXVxuICAgIHJldHVybiBjYWxsYmFjayA/IGNhbGxiYWNrKGUsIHRhcmdldEVsKSA6IHt9XG4gIH1cblxuICBzZXRQZW5kaW5nTGluayhocmVmKXtcbiAgICB0aGlzLmxpbmtSZWYrK1xuICAgIHRoaXMucGVuZGluZ0xpbmsgPSBocmVmXG4gICAgcmV0dXJuIHRoaXMubGlua1JlZlxuICB9XG5cbiAgY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZil7XG4gICAgaWYodGhpcy5saW5rUmVmICE9PSBsaW5rUmVmKXtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhyZWYgPSB0aGlzLnBlbmRpbmdMaW5rXG4gICAgICB0aGlzLnBlbmRpbmdMaW5rID0gbnVsbFxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICBnZXRIcmVmKCl7IHJldHVybiB0aGlzLmhyZWYgfVxuXG4gIGhhc1BlbmRpbmdMaW5rKCl7IHJldHVybiAhIXRoaXMucGVuZGluZ0xpbmsgfVxuXG4gIGJpbmQoZXZlbnRzLCBjYWxsYmFjayl7XG4gICAgZm9yKGxldCBldmVudCBpbiBldmVudHMpe1xuICAgICAgbGV0IGJyb3dzZXJFdmVudE5hbWUgPSBldmVudHNbZXZlbnRdXG5cbiAgICAgIHRoaXMub24oYnJvd3NlckV2ZW50TmFtZSwgZSA9PiB7XG4gICAgICAgIGxldCBiaW5kaW5nID0gdGhpcy5iaW5kaW5nKGV2ZW50KVxuICAgICAgICBsZXQgd2luZG93QmluZGluZyA9IHRoaXMuYmluZGluZyhgd2luZG93LSR7ZXZlbnR9YClcbiAgICAgICAgbGV0IHRhcmdldFBoeEV2ZW50ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZShiaW5kaW5nKVxuICAgICAgICBpZih0YXJnZXRQaHhFdmVudCl7XG4gICAgICAgICAgdGhpcy5kZWJvdW5jZShlLnRhcmdldCwgZSwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZSwgZXZlbnQsIHZpZXcsIGUudGFyZ2V0LCB0YXJnZXRDdHgsIHRhcmdldFBoeEV2ZW50LCBudWxsKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHt3aW5kb3dCaW5kaW5nfV1gLCBlbCA9PiB7XG4gICAgICAgICAgICBsZXQgcGh4RXZlbnQgPSBlbC5nZXRBdHRyaWJ1dGUod2luZG93QmluZGluZylcbiAgICAgICAgICAgIHRoaXMuZGVib3VuY2UoZWwsIGUsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZWwsICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZWwsIHRhcmdldEN0eCwgcGh4RXZlbnQsIFwid2luZG93XCIpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgYmluZENsaWNrcygpe1xuICAgIHRoaXMuYmluZENsaWNrKFwiY2xpY2tcIiwgXCJjbGlja1wiLCBmYWxzZSlcbiAgICB0aGlzLmJpbmRDbGljayhcIm1vdXNlZG93blwiLCBcImNhcHR1cmUtY2xpY2tcIiwgdHJ1ZSlcbiAgfVxuXG4gIGJpbmRDbGljayhldmVudE5hbWUsIGJpbmRpbmdOYW1lLCBjYXB0dXJlKXtcbiAgICBsZXQgY2xpY2sgPSB0aGlzLmJpbmRpbmcoYmluZGluZ05hbWUpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBlID0+IHtcbiAgICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuICAgICAgbGV0IHRhcmdldCA9IG51bGxcbiAgICAgIGlmKGNhcHR1cmUpe1xuICAgICAgICB0YXJnZXQgPSBlLnRhcmdldC5tYXRjaGVzKGBbJHtjbGlja31dYCkgPyBlLnRhcmdldCA6IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoYFske2NsaWNrfV1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0ID0gY2xvc2VzdFBoeEJpbmRpbmcoZS50YXJnZXQsIGNsaWNrKVxuICAgICAgfVxuICAgICAgbGV0IHBoeEV2ZW50ID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoY2xpY2spXG4gICAgICBpZighcGh4RXZlbnQpeyByZXR1cm4gfVxuICAgICAgaWYodGFyZ2V0LmdldEF0dHJpYnV0ZShcImhyZWZcIikgPT09IFwiI1wiKXsgZS5wcmV2ZW50RGVmYXVsdCgpIH1cblxuICAgICAgdGhpcy5kZWJvdW5jZSh0YXJnZXQsIGUsICgpID0+IHtcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnModGFyZ2V0LCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgICAgdmlldy5wdXNoRXZlbnQoXCJjbGlja1wiLCB0YXJnZXQsIHRhcmdldEN0eCwgcGh4RXZlbnQsIHRoaXMuZXZlbnRNZXRhKFwiY2xpY2tcIiwgZSwgdGFyZ2V0KSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSwgY2FwdHVyZSlcbiAgfVxuXG4gIGJpbmROYXYoKXtcbiAgICBpZighQnJvd3Nlci5jYW5QdXNoU3RhdGUoKSl7IHJldHVybiB9XG4gICAgaWYoaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbil7IGhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24gPSBcIm1hbnVhbFwiIH1cbiAgICBsZXQgc2Nyb2xsVGltZXIgPSBudWxsXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgX2UgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHNjcm9sbFRpbWVyKVxuICAgICAgc2Nyb2xsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoc3RhdGUgPT4gT2JqZWN0LmFzc2lnbihzdGF0ZSwge3Njcm9sbDogd2luZG93LnNjcm9sbFl9KSlcbiAgICAgIH0sIDEwMClcbiAgICB9KVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgZXZlbnQgPT4ge1xuICAgICAgaWYoIXRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pKXsgcmV0dXJuIH1cbiAgICAgIGxldCB7dHlwZSwgaWQsIHJvb3QsIHNjcm9sbH0gPSBldmVudC5zdGF0ZSB8fCB7fVxuICAgICAgbGV0IGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZlxuXG4gICAgICBpZih0aGlzLm1haW4uaXNDb25uZWN0ZWQoKSAmJiAodHlwZSA9PT0gXCJwYXRjaFwiICYmIGlkID09PSB0aGlzLm1haW4uaWQpKXtcbiAgICAgICAgdGhpcy5tYWluLnB1c2hMaW5rUGF0Y2goaHJlZiwgbnVsbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVwbGFjZU1haW4oaHJlZiwgbnVsbCwgKCkgPT4ge1xuICAgICAgICAgIGlmKHJvb3QpeyB0aGlzLnJlcGxhY2VSb290SGlzdG9yeSgpIH1cbiAgICAgICAgICBpZih0eXBlb2YgKHNjcm9sbCkgPT09IFwibnVtYmVyXCIpe1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBzY3JvbGwpXG4gICAgICAgICAgICB9LCAwKSAvLyB0aGUgYm9keSBuZWVkcyB0byByZW5kZXIgYmVmb3JlIHdlIHNjcm9sbC5cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSwgZmFsc2UpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBlID0+IHtcbiAgICAgIGxldCB0YXJnZXQgPSBjbG9zZXN0UGh4QmluZGluZyhlLnRhcmdldCwgUEhYX0xJVkVfTElOSylcbiAgICAgIGxldCB0eXBlID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJVkVfTElOSylcbiAgICAgIGxldCB3YW50c05ld1RhYiA9IGUubWV0YUtleSB8fCBlLmN0cmxLZXkgfHwgZS5idXR0b24gPT09IDFcbiAgICAgIGlmKCF0eXBlIHx8ICF0aGlzLmlzQ29ubmVjdGVkKCkgfHwgIXRoaXMubWFpbiB8fCB3YW50c05ld1RhYil7IHJldHVybiB9XG4gICAgICBsZXQgaHJlZiA9IHRhcmdldC5ocmVmXG4gICAgICBsZXQgbGlua1N0YXRlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShQSFhfTElOS19TVEFURSlcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgaWYodGhpcy5wZW5kaW5nTGluayA9PT0gaHJlZil7IHJldHVybiB9XG5cbiAgICAgIGlmKHR5cGUgPT09IFwicGF0Y2hcIil7XG4gICAgICAgIHRoaXMucHVzaEhpc3RvcnlQYXRjaChocmVmLCBsaW5rU3RhdGUsIHRhcmdldClcbiAgICAgIH0gZWxzZSBpZih0eXBlID09PSBcInJlZGlyZWN0XCIpe1xuICAgICAgICB0aGlzLmhpc3RvcnlSZWRpcmVjdChocmVmLCBsaW5rU3RhdGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkICR7UEhYX0xJVkVfTElOS30gdG8gYmUgXCJwYXRjaFwiIG9yIFwicmVkaXJlY3RcIiwgZ290OiAke3R5cGV9YClcbiAgICAgIH1cbiAgICB9LCBmYWxzZSlcbiAgfVxuXG4gIHdpdGhQYWdlTG9hZGluZyhpbmZvLCBjYWxsYmFjayl7XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBcInBoeDpwYWdlLWxvYWRpbmctc3RhcnRcIiwgaW5mbylcbiAgICBsZXQgZG9uZSA9ICgpID0+IERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIiwgaW5mbylcbiAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhkb25lKSA6IGRvbmVcbiAgfVxuXG4gIHB1c2hIaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCB0YXJnZXRFbCl7XG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoe3RvOiBocmVmLCBraW5kOiBcInBhdGNoXCJ9LCBkb25lID0+IHtcbiAgICAgIHRoaXMubWFpbi5wdXNoTGlua1BhdGNoKGhyZWYsIHRhcmdldEVsLCBsaW5rUmVmID0+IHtcbiAgICAgICAgdGhpcy5oaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmKVxuICAgICAgICBkb25lKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGhpc3RvcnlQYXRjaChocmVmLCBsaW5rU3RhdGUsIGxpbmtSZWYgPSB0aGlzLnNldFBlbmRpbmdMaW5rKGhyZWYpKXtcbiAgICBpZighdGhpcy5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSl7IHJldHVybiB9XG5cbiAgICBCcm93c2VyLnB1c2hTdGF0ZShsaW5rU3RhdGUsIHt0eXBlOiBcInBhdGNoXCIsIGlkOiB0aGlzLm1haW4uaWR9LCBocmVmKVxuICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBoaXN0b3J5UmVkaXJlY3QoaHJlZiwgbGlua1N0YXRlLCBmbGFzaCl7XG4gICAgbGV0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoe3RvOiBocmVmLCBraW5kOiBcInJlZGlyZWN0XCJ9LCBkb25lID0+IHtcbiAgICAgIHRoaXMucmVwbGFjZU1haW4oaHJlZiwgZmxhc2gsICgpID0+IHtcbiAgICAgICAgQnJvd3Nlci5wdXNoU3RhdGUobGlua1N0YXRlLCB7dHlwZTogXCJyZWRpcmVjdFwiLCBpZDogdGhpcy5tYWluLmlkLCBzY3JvbGw6IHNjcm9sbH0sIGhyZWYpXG4gICAgICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pXG4gICAgICAgIGRvbmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcmVwbGFjZVJvb3RIaXN0b3J5KCl7XG4gICAgQnJvd3Nlci5wdXNoU3RhdGUoXCJyZXBsYWNlXCIsIHtyb290OiB0cnVlLCB0eXBlOiBcInBhdGNoXCIsIGlkOiB0aGlzLm1haW4uaWR9KVxuICB9XG5cbiAgcmVnaXN0ZXJOZXdMb2NhdGlvbihuZXdMb2NhdGlvbil7XG4gICAgbGV0IHtwYXRobmFtZSwgc2VhcmNofSA9IHRoaXMuY3VycmVudExvY2F0aW9uXG4gICAgaWYocGF0aG5hbWUgKyBzZWFyY2ggPT09IG5ld0xvY2F0aW9uLnBhdGhuYW1lICsgbmV3TG9jYXRpb24uc2VhcmNoKXtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbiA9IGNsb25lKG5ld0xvY2F0aW9uKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICBiaW5kRm9ybXMoKXtcbiAgICBsZXQgaXRlcmF0aW9ucyA9IDBcbiAgICB0aGlzLm9uKFwic3VibWl0XCIsIGUgPT4ge1xuICAgICAgbGV0IHBoeEV2ZW50ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInN1Ym1pdFwiKSlcbiAgICAgIGlmKCFwaHhFdmVudCl7IHJldHVybiB9XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZVxuICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsICh2aWV3LCB0YXJnZXRDdHgpID0+IHZpZXcuc3VibWl0Rm9ybShlLnRhcmdldCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCkpXG4gICAgfSwgZmFsc2UpXG5cbiAgICBmb3IobGV0IHR5cGUgb2YgW1wiY2hhbmdlXCIsIFwiaW5wdXRcIl0pe1xuICAgICAgdGhpcy5vbih0eXBlLCBlID0+IHtcbiAgICAgICAgbGV0IGlucHV0ID0gZS50YXJnZXRcbiAgICAgICAgbGV0IHBoeEV2ZW50ID0gaW5wdXQuZm9ybSAmJiBpbnB1dC5mb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIikpXG4gICAgICAgIGlmKCFwaHhFdmVudCl7IHJldHVybiB9XG4gICAgICAgIGlmKGlucHV0LnR5cGUgPT09IFwibnVtYmVyXCIgJiYgaW5wdXQudmFsaWRpdHkgJiYgaW5wdXQudmFsaWRpdHkuYmFkSW5wdXQpeyByZXR1cm4gfVxuICAgICAgICBsZXQgY3VycmVudEl0ZXJhdGlvbnMgPSBpdGVyYXRpb25zXG4gICAgICAgIGl0ZXJhdGlvbnMrK1xuICAgICAgICBsZXQge2F0OiBhdCwgdHlwZTogbGFzdFR5cGV9ID0gRE9NLnByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIikgfHwge31cbiAgICAgICAgLy8gZGV0ZWN0IGR1cCBiZWNhdXNlIHNvbWUgYnJvd3NlcnMgZGlzcGF0Y2ggYm90aCBcImlucHV0XCIgYW5kIFwiY2hhbmdlXCJcbiAgICAgICAgaWYoYXQgPT09IGN1cnJlbnRJdGVyYXRpb25zIC0gMSAmJiB0eXBlICE9PSBsYXN0VHlwZSl7IHJldHVybiB9XG5cbiAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIiwge2F0OiBjdXJyZW50SXRlcmF0aW9ucywgdHlwZTogdHlwZX0pXG5cbiAgICAgICAgdGhpcy5kZWJvdW5jZShpbnB1dCwgZSwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGlucHV0LmZvcm0sICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgICAgICAgIERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX0ZPQ1VTRUQsIHRydWUpXG4gICAgICAgICAgICBpZighRE9NLmlzVGV4dHVhbElucHV0KGlucHV0KSl7XG4gICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlRWxlbWVudChpbnB1dClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcucHVzaElucHV0KGlucHV0LCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBlLnRhcmdldClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSwgZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgZGVib3VuY2UoZWwsIGV2ZW50LCBjYWxsYmFjayl7XG4gICAgbGV0IHBoeERlYm91bmNlID0gdGhpcy5iaW5kaW5nKFBIWF9ERUJPVU5DRSlcbiAgICBsZXQgcGh4VGhyb3R0bGUgPSB0aGlzLmJpbmRpbmcoUEhYX1RIUk9UVExFKVxuICAgIGxldCBkZWZhdWx0RGVib3VuY2UgPSB0aGlzLmRlZmF1bHRzLmRlYm91bmNlLnRvU3RyaW5nKClcbiAgICBsZXQgZGVmYXVsdFRocm90dGxlID0gdGhpcy5kZWZhdWx0cy50aHJvdHRsZS50b1N0cmluZygpXG4gICAgRE9NLmRlYm91bmNlKGVsLCBldmVudCwgcGh4RGVib3VuY2UsIGRlZmF1bHREZWJvdW5jZSwgcGh4VGhyb3R0bGUsIGRlZmF1bHRUaHJvdHRsZSwgY2FsbGJhY2spXG4gIH1cblxuICBzaWxlbmNlRXZlbnRzKGNhbGxiYWNrKXtcbiAgICB0aGlzLnNpbGVuY2VkID0gdHJ1ZVxuICAgIGNhbGxiYWNrKClcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2VcbiAgfVxuXG4gIG9uKGV2ZW50LCBjYWxsYmFjayl7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGUgPT4ge1xuICAgICAgaWYoIXRoaXMuc2lsZW5jZWQpeyBjYWxsYmFjayhlKSB9XG4gICAgfSlcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIFR1cmJvIGZyb20gXCJAaG90d2lyZWQvdHVyYm9cIlxuaW1wb3J0IHsgQXBwbGljYXRpb24gfSBmcm9tIFwic3RpbXVsdXNcIlxuaW1wb3J0IHsgZGVmaW5pdGlvbnMgfSBmcm9tICdzdGltdWx1czouL2NvbnRyb2xsZXJzJztcbmltcG9ydCB7U29ja2V0fSBmcm9tIFwicGhvZW5peFwiXG5pbXBvcnQge0xpdmVTb2NrZXR9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gXCJsdXhvblwiO1xuXG5jb25zdCBhcHAgPSBBcHBsaWNhdGlvbi5zdGFydCgpO1xuYXBwLmxvYWQoZGVmaW5pdGlvbnMpO1xuXG5sZXQgSG9va3MgPSB7fVxuXG5Ib29rcy5BdXRvRm9jdXMgPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5lbC5mb2N1cygpO1xuICB9XG59XG5cbkhvb2tzLk5haXZlRGF0ZVRpbWVVVEMgPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgICB2YXIgaW50bCA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgICAgIHZhciB0eiA9IGRvY3VtZW50LmJvZHkuZGF0YXNldC50eiB8fCBpbnRsLnRpbWVab25lIHx8IFwiVVRDXCI7XG4gICAgICB2YXIgbG9jYWxlID0gZG9jdW1lbnQuYm9keS5kYXRhc2V0LmxvY2FsZSB8fCBpbnRsLmxvY2FsZSB8fCBcImVuXCI7XG5cbiAgICAgIHZhciBzdHlsZSA9IERhdGVUaW1lW3RoaXMuZWwuZGF0YXNldC50aW1lRm9ybWF0XTtcbiAgICAgIHZhciBkYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyh0aGlzLmVsLmRhdGVUaW1lLCB7IHpvbmU6ICd1dGMnIH0pLnNldFpvbmUodHopLnNldExvY2FsZShsb2NhbGUpO1xuICAgICAgdGhpcy5lbC5pbm5lclRleHQgPSBkYXRlLnRvTG9jYWxlU3RyaW5nKHN0eWxlKTtcbiAgfVxufVxuXG5sZXQgY3NyZlRva2VuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nY3NyZi10b2tlbiddXCIpLmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIilcbmxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHtob29rczogSG9va3MsIHBhcmFtczoge19jc3JmX3Rva2VuOiBjc3JmVG9rZW59fSlcblxuLy8gQ29ubmVjdCBpZiB0aGVyZSBhcmUgYW55IExpdmVWaWV3cyBvbiB0aGUgcGFnZVxubGl2ZVNvY2tldC5jb25uZWN0KClcblxuIl0sCiAgIm1hcHBpbmdzIjogIjt3RkFLTSxJQUFB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QUVuQyxJQUNILE1BQU8sR0FBUSxPQUNaLEtBQ0gsTUFBTyxHQUFRLEVBQVcsUUFDdkIsT0FDSCxNQUFPLEdBQVEsT0FDWixRQUNILE1BQU8sR0FBUSxPQUNaLFNBQ0gsTUFBTyxHQUFRLE9BRVosSUFDSCxNQUFPLEdBQVEsT0FDWixLQUNILE1BQU8sR0FBUSxPQUNaLE1BQ0gsTUFBTyxJQUFNLEVBQUksT0FBTyxRQUFTLEdBQU0sSUFBUSxPQUM1QyxPQUNILE1BQU8sSUFBTSxFQUFJLE9BQU8sT0FBUSxHQUFNLElBQVEsT0FDM0MsSUFDSCxNQUFPLEdBQVEsT0FDWixLQUNILE1BQU8sR0FBUSxPQUNaLE1BQ0gsTUFBTyxJQUFNLEVBQUksT0FBTyxRQUFTLEdBQU8sSUFBUSxPQUM3QyxPQUNILE1BQU8sSUFBTSxFQUFJLE9BQU8sT0FBUSxHQUFPLElBQVEsT0FFNUMsSUFDSCxNQUFPLEdBQVEsT0FDWixLQUNILE1BQU8sR0FBUSxPQUVaLElBQ0gsTUFBTyxHQUFRLE9BQ1osTUFDSCxNQUFPLEdBQVEsT0FFWixLQUNILE1BQU8sR0FBUSxPQUNaLElBQ0gsTUFBTyxHQUFRLE9BQ1osS0FDSCxNQUFPLEdBQVEsT0FDWixJQUNILE1BQU8sR0FBUSxPQUNaLEtBQ0gsTUFBTyxHQUFRLE9BQ1osSUFDSCxNQUFPLEdBQVEsT0FDWixJQUNILE1BQU8sR0FBUSxPQUNaLEtBQ0gsTUFBTyxHQUFRLE9BQ1osSUFDSCxNQUFPLEdBQVEsT0FDWixLQUNILE1BQU8sR0FBUSxPQUNaLElBQ0gsTUFBTyxHQUFRLE9BQ1osTUFDSCxNQUFPLEdBQVEsT0FDWixJQUNILE1BQU8sSUFBTyxPQUVYLElBQ0gsTUFBTyxJQUFNLEVBQUksWUFBYSxPQUUzQixPQUNILE1BQU8sR0FBUSxPQUNaLEtBQ0gsTUFBTyxHQUFRLEVBQVcsUUFFdkIsSUFDSCxNQUFPLEdBQVEsT0FDWixLQUNILE1BQU8sR0FBUSxPQUVaLFFBQ0EsSUFDSCxNQUFPLEdBQVEsT0FDWixNQUNILE1BQU8sSUFBTSxFQUFJLFNBQVMsUUFBUyxHQUFPLElBQVEsT0FD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