spyne 0.20.7 → 0.20.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -17
- package/lib/spyne.esm.js +2 -2
- package/lib/spyne.esm.js.map +1 -1
- package/lib/spyne.umd.js +2 -2
- package/lib/spyne.umd.js.LICENSE.txt +2 -2
- package/package.json +3 -3
- package/src/spyne/spyne-app.js +2 -2
- package/src/tests/package-json.spec.test.js +1 -1
package/lib/spyne.umd.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/*! For license information please see spyne.umd.js.LICENSE.txt */
|
|
2
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("rxjs"),require("ramda"),require("dompurify"),require("rxjs").operators):"function"==typeof define&&define.amd?define("spyne",["rxjs","ramda","dompurify","rxjs/operators"],t):"object"==typeof exports?exports.spyne=t(require("rxjs"),require("ramda"),require("dompurify"),require("rxjs").operators):e.spyne=t(e.rxjs,e.R,e.DOMPurify,e.rxjs.operators)}(self,((e,t,r,s)=>(()=>{"use strict";var n={126:(e,t,r)=>{r.d(t,{e:()=>i});var s=r(2),n=r(9),o=r(131);class i extends s.c{constructor(e,t={}){i.validateMapMethod(t,e),void 0!==t.map&&(t.mapFn=t.map),t.extendedActionsArr=[`${e}_RESPONSE_EVENT`,[`${e}_REQUEST_EVENT`,"onFetchUpdate"]],t.sendCachedPayload=!0,super(e,t)}static validateMapMethod(e,t,r=!1){const s=(0,o.either)(o.isNil,(e=>"function"!=typeof e)),n=(0,o.all)(s),i=(0,o.allPass)([n,e=>e.length>=1]);return!(0,o.compose)(i,o.values,(0,o.pick)(["map","mapFn"]))(e)||(!1===r&&console.warn(`Spyne Warning: The map method for ChannelFetch, ${t}, appears to be invalid`),!1)}onRegistered(e=this.props){!0!==e?.pause&&this.startFetch()}addRegisteredActions(e){const t=(0,o.compose)((0,o.defaultTo)([]),(0,o.path)(["props","extendedActionsArr"]));return["CHANNEL_RESPONSE_EVENT",["CHANNEL_UPDATE_RESPONSE_EVENT","onFetchUpdate"],["CHANNEL_FETCH_REQUEST_EVENT","onFetchUpdate"]].concat(t(this))}startFetch(e={},t=this.onFetchReturned.bind(this)){const r=this.consolidateAllFetchProps(e);return new n.G(r,t,!1,this.props.name)}onFetchUpdate(e){const t=this.getPropsForFetch(e);this.startFetch(t)}onFetchReturned(e){return this.createChannelPayloadItem(e)}createChannelPayloadItem(e,t=`${this.props.name}_RESPONSE_EVENT`){const{name:r,sendCachedPayload:s,url:n}=this.props,o={name:r,sendCachedPayload:s,url:n};this.sendChannelPayload(t,e,o)}getPropsForFetch(e){const t=(0,o.path)(["viewStreamInfo","payload"],e);return(0,o.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t)}consolidateAllFetchProps(e,t=this.props){const r=(0,o.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t),s=(0,o.reject)(o.isNil);return(0,o.compose)(s,((e,t)=>(0,o.mergeDeepRight)(e,t)))(r,e)}get observer(){return this.observer$}}},980:(e,t,r)=>{r.d(t,{m:()=>i});var s=r(131),n=r(225),o=r(961);class i{constructor(e,t,r,a,c,d){const l=e;d&&console.time(d);const E={channelName:e,action:t,srcElement:a,event:c},p=i.deepFreeze(r);if(E.payload=p,!0===n.M.debug){if(Object.prototype.hasOwnProperty.call(r,"payload")){const e=JSON.stringify(r);console.warn(`Spyne Warning: the following payload contains a nested payload property which may create conflicts: Action: ${t}, ${e}`)}const e=n.M.getChannelActions(l);i.validateAction(t,l,e)}E.clone=()=>(0,s.mergeAll)([{payload:(0,o.l)(E.payload)},E.payload,{channel:(0,s.clone)(l)},{event:(0,s.clone)(c)},{srcElement:a},(0,s.clone)(E.srcElement),{action:(0,s.clone)(E.action)}]);const h={$dir:{get:()=>E._dir,set:e=>(E._dir=e,e)}};return"CHANNEL_ROUTE"===l&&(h.location={get:()=>i.getLocationData()}),E._dir=void 0,Object.defineProperties(E,h),d&&console.timeEnd(d),E}static validateAction(e,t,r){const o=(0,s.includes)(e,r);return!1===o&&!0===n.M.initialized&&console.warn(`warning: Action: '${e}' is not registered within the ${t} channel!`),o}static getLocationData(){return(0,s.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getStreamItem(){}static deepClone(e){const t=(0,s.is)(Array),r=(0,s.is)(Object);var n;return!1===t(n=e)&&!0===r(n)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}static deepFreeze(e){const t=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));try{Object.freeze(e),Object.getOwnPropertyNames(e).forEach((function(r){!Object.prototype.hasOwnProperty.call(e,r)||!1!==t(e[r])||null===e[r]||"object"!=typeof e[r]&&"function"!=typeof e[r]||Object.isFrozen(e[r])||i.deepFreeze(e[r])}))}catch(t){return e}return e}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}}},683:(e,t,r)=>{r.d(t,{w:()=>c});var s=r(2),n=r(225),o=r(968),i=r(131),a=r(64);class c extends s.c{constructor(e,t={}){t.isProxy=!0,super(e,t),this.props=t,this.subject$=new o.Subject,this.replaySub$=new o.ReplaySubject(1),this.observer$=(0,o.merge)(this.subject$,this.replaySub$),!0===n.M.debug&&this.checkIfChannelIsStillProxy(e)}getMergedSubject(e=!1){return!0===e?this.replaySub$:this.subject$}checkIfChannelIsStillProxy(e){const t=e;(0,a.Ir)((()=>{!0!==(0,i.includes)(t,n.M.listRegisteredChannels())&&console.warn(`Spyne Warning: The channel, ${t} does not appear to be registered!`)}),1e3)}get replaySubject(){return this.replaySub$}get subject(){return this.subject$}}},2:(e,t,r)=>{r.d(t,{c:()=>l});var s=r(584),n=r(980),o=r(225),i=r(521),a=r(968),c=r(531),d=r(131);class l{constructor(e,t={}){this.addRegisteredActions.bind(this),this.createChannelActionsObj(e,t.extendedActionsArr),t.name=e,t.defaultActions=void 0!==t.data?[`${t.name}_EVENT`]:[],this.props=t,this.props.isRegistered=!1,this.props.isProxy=void 0!==this.props.isProxy&&this.props.isProxy;const r=void 0!==this.props.data;void 0!==this.props.replay?this.props.sendCachedPayload=this.props.replay:this.props.sendCachedPayload=void 0===this.props.sendCachedPayload?r:this.props.sendCachedPayload,this.sendPayloadToRouteChannel=new i.g(this),this.createChannelActionMethods(),this.streamsController=o.M.channelsMap;const s=this.getMainObserver();this.checkForPersistentDataMode=l.checkForPersistentDataMode.bind(this),this.observer$=this.props.observer=s;const n=this.streamsController.getStream("DISPATCHER"),a=(0,d.propEq)(t.name,"name");n.pipe((0,c.filter)(a)).subscribe((e=>this.onReceivedObservable(e)))}getMainObserver(){return void 0===this.streamsController&&console.warn(`Spyne Warning: The following channel, ${this.props.name}, appears to be registered before Spyne has been initialized.`),!0===this.streamsController.testStream(this.props.name)?this.streamsController.getProxySubject(this.props.name,this.props.sendCachedPayload):!0===this.props.sendCachedPayload?new a.ReplaySubject(1):new a.Subject}onChannelInitialized(){}onRegistered(e=this.props){if(void 0!==e.data){const t=Object.keys(this.channelActions)[0];this.sendChannelPayload(t,e.data)}}get isProxy(){return this.props.isProxy}get channelName(){return this.props.name}get observer(){return this.observer$}checkForTraits(){void 0!==this.props.traits&&(e=>{"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>new e(this)))})(this.props.traits)}initializeStream(){this.checkForTraits(),this.onChannelInitialized(),this.checkForPersistentDataMode(),this.onRegistered(),this.props.isRegistered=!0}static checkForPersistentDataMode(e=this.props,t=this.channelActions){const r=(0,d.isEmpty)(t),s=void 0!==(0,d.prop)("data",e);return!0===r&&!0===s&&(e.sendCachedPayload=!0,t=(()=>{const{name:t}=e,r=`${t}_EVENT`;return{[r]:r}})(),void 0!==this.channelActions&&(this.channelActions=t)),{props:e,actionsObj:t}}setTrace(e){}createChannelActionsObj(e,t=[]){const r=(0,d.ifElse)((0,d.is)(String),d.identity,d.head),s=t.concat(this.addRegisteredActions(e)),n=(0,d.map)(r,s),o=(0,d.mergeAll)((0,d.chain)((e=>(0,d.objOf)(e,e)),n));this.channelActions=o}createChannelActionMethods(){const e=(0,d.ifElse)((0,d.is)(String),d.identity,d.head),t=(e,t)=>{window.setTimeout((()=>{"function"!=typeof this[e]&&console.warn(`"${this.props.name}", REQUIRES THE FOLLOWING METHOD ${e} FOR ACTION, ${t[0]}`)}),100)},r=(0,d.ifElse)((0,d.is)(String),(0,d.always)("onViewStreamInfo"),(e=>{const r=(0,d.view)((0,d.lensIndex)(1),e);return t(r,e),r}));this.channelActionMethods=(0,d.fromPairs)((0,d.map)((t=>[e(t),r(t)]),this.addRegisteredActions()))}addRegisteredActions(){let e=[];return(0,d.path)(["props","data"],this)&&(e=[`${this.props.name}_EVENT`]),e}onReceivedObservable(e){this.onIncomingObservable(e)}getActionMethodForObservable(e){e.unpacked=!0;const t=this.onViewStreamInfo.bind(this),r=(0,d.path)(["data","action"],e),s=(0,d.prop)(r,this.channelActionMethods);let n=t;return void 0!==s&&"onViewStreamInfo"!==s&&!0==("function"==typeof this[s])&&(n=this[s].bind(this)),n}onIncomingObservable(e){const t=(0,d.equals)(e.name,this.props.name),{action:r,payload:s,srcElement:n}=e.data,o=t=>({clone:()=>{return t=e.data,(0,d.mergeAll)([t,{action:(0,d.prop)("action",t)},(0,d.prop)("payload",t),(0,d.prop)("srcElement",t)]);var t},action:r,payload:s,srcElement:n,event:t});return!0===t?(e=>e.observable.pipe((0,c.map)(o)).subscribe(this.getActionMethodForObservable(e)))(e):void 0}onViewStreamInfo(e){}sendChannelPayload(e,t,r={},s={},o=this.observer$){const i=new n.m(this.props.name,e,t,r,s);o.next(i)}getChannel(e,t){return(0,d.ifElse)((e=>(0,s.ns)().includes(e)),(e=>{const r=this.streamsController.getStream(e).observer;return void 0!==t?r.pipe((0,c.filter)(t)):r}),(e=>console.warn(`channel name ${e} is not within ${s.ns}`)))(e)}mergeChannels(e,t=!0){const r=e.map((e=>{if("string"==typeof e){const r=this.getChannel(e);return t?r.pipe((0,c.take)(1)):r}return t?e.pipe((0,c.take)(1)):e}));let s;if(t)s=(0,a.forkJoin)(r);else if(0===r.length)s=a.EMPTY;else if(1===r.length)s=r[0];else{const[e,...t]=r;s=e.pipe((0,c.combineLatestWith)(...t))}return s.pipe((0,c.map)((t=>{const r={};return e.forEach(((e,s)=>{r["string"==typeof e?e:`channel_${s}`]=t[s]})),r})))}static checkForNotTrackFlag(e={}){!0===e.doNotTrack&&o.M.doNotTrackChannel(e.channelName)}}},584:(e,t,r)=>{r.d(t,{ns:()=>i});var s=r(225),n=r(131),o=r(968);const i=()=>({includes:()=>!0===s.M.initialized?s.M.listRegisteredChannels():["CHANNEL_ROUTE","CHANNEL_UI","CHANNEL_WINDOW","DISPATCHER"]}),a=["LOAD","RENDER","MOUNT","UNMOUNT","DISPOSE","GARBAGE_COLLECT","UPDATE"],c=["parent","self","child","children","view"],d=["Observable","BehaviorSubject","Subject","Observer","Subscriber","FromEventObservable"],l=["subscribe","combineLatest"];let E=[],p=[],h=null,N=null,u=null,_=null,m=null,T=null,A=null;if(void 0!==n.compose&&void 0!==o.Observable){E=[{error:`need to match a valid name within ${d}`,predicate:e=>i().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>void 0!==e.observable.subscribe},{error:"param action must be a registered action",predicate:e=>l.includes(e.action)}],p=[{error:"needs vsid number in srcElement",predicate:(0,n.compose)((0,n.is)(String),(0,n.path)(["data","srcElement","vsid"]))},{error:"needs a id in srcElement",predicate:(0,n.compose)((0,n.is)(String),(0,n.path)(["data","srcElement","id"]))}],h=function(){return[].concat(E).concat(p)};const e=[{error:`need to match a valid name within ${d}`,predicate:e=>i().includes(e.name)},{error:`needs one of the following step strings: ${a}`,predicate:e=>a.includes(e.STEP)},{error:`type needs to one of the following: ${c}`,predicate:e=>c.includes(e.type)},{error:"viewId needs to be added ",predicate:e=>void 0!==e.viewId}];u=function(){return[].concat(e)},_=function(){return[{error:"DISPOSE STEP requires a disposeItem param in the data object",predicate:e=>"DISPOSE"===e.STEP&&void 0!==e.data.disposeItems}].concat(e)},m=function(){return[{error:"UPDATE STEP requires a data object ",predicate:e=>"UPDATE"===e.STEP&&void 0!==e.data}].concat(e)},N=function(){return e.concat(E).concat(p)},T=function(){return[].concat(E).concat(p)},A=function(){const e=[{error:"param 'name' must be of a registered type",predicate:e=>i().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>d.includes((0,e.observable)().constructor.name)},{error:"param action must be a registered action",predicate:e=>l.includes(e.action)}];return{streams:[{init:{name:"DISPATCHER",observable:()=>new o.Subject,action:"subscribe"},structure:{type:String,observable:o.Observable||o.Subject,action:String},validations:e},{init:{name:"UBU",observable:()=>new o.Subject,action:"subscribe"},structure:{type:String,observable:o.Observable||o.Subject,action:String},validations:e}]}}}},470:(e,t,r)=>{r.d(t,{H:()=>E});var s=r(68),n=r(303),o=r(597),i=r(205),a=r(968),c=r(683),d=r(131);const l=new Map;class E{constructor(){this.addMixins(),l.set("DISPATCHER",new a.Subject),this.listRegisteredChannels=E.listRegisteredChannels.bind(this),this.getChannelsList=E.getChannelsList.bind(this)}get map(){return l}static getChannelsList(){return Array.from(l,((e,t)=>({key:e[0],val:e[1].constructor.name})))}static listRegisteredChannels(e=!1){const t=this.getChannelsList(),r=(0,d.reject)((0,d.propEq)("ChannelProxy","val")),s=(0,d.filter)((0,d.propEq)("ChannelProxy","val")),n=(!0===e?s:r)(t);return(0,d.pluck)(["key"],n)}listProxyChannels(){return this.listRegisteredChannels(!0)}checkForMissingChannels(){const e=this.getChannelsList(),t=(0,d.filter)((0,d.propEq)("ChannelProxy","val"))(e);if(t.length>=1){const e=`Spyne Warning: The following ${1===t.length?"Channel has":"Channels have"} not been initialized: ${(0,d.compose)((0,d.join)(", "),(0,d.map)((0,d.prop)("key")))(t)}`;console.warn(e)}}init(){this.createMainStreams()}createMainStreams(){this.routeStream=new s.e,l.set("CHANNEL_ROUTE",this.routeStream),this.uiStream=new n.z,l.set("CHANNEL_UI",this.uiStream),this.domStream=new o.x,l.set("CHANNEL_WINDOW",this.domStream),this.viewStreamLifecycle=new i.b,l.set("CHANNEL_LIFECYCLE",this.viewStreamLifecycle),this.routeStream.initializeStream(),this.domStream.initializeStream()}addKeyEvent(e){l.get("UI").addKeyEvent(e)}registerStream(e){const t=e.channelName;l.has(t)&&(0,d.compose)((0,d.pathEq)(["props","isRegistered"],!0))(l.get(t))?console.warn(`Spyne Warning: The Channel, ${t}, has already been registered!`):(l.set(t,e),e.initializeStream())}getChannelActions(e){return l.get(e).addRegisteredActions()}getProxySubject(e,t=!1){const r=!0===t?"replaySubject":"subject";return l.get(e)[r]}testStream(e){return void 0!==l.get(e)}getStream(e){return!1===this.testStream(e)&&l.set(e,new c.w(e)),l.get(e)}addMixins(){}}},205:(e,t,r)=>{r.d(t,{b:()=>n});var s=r(2);class n extends s.c{constructor(e={}){super("CHANNEL_LIFECYCLE",e)}addRegisteredActions(){return["CHANNEL_LIFECYCLE_RENDERED_EVENT","CHANNEL_LIFECYCLE_DISPOSED_EVENT"]}onViewStreamInfo(e){const{action:t,srcElement:r}=e,s=r;s.action=t,this.onSendEvent(t,s)}onSendEvent(e,t={}){const r=this.channelActions[e],s={};window.setTimeout((()=>this.sendChannelPayload(r,t,s,void 0)),0)}}},68:(e,t,r)=>{r.d(t,{e:()=>l});var s=r(2),n=r(511),o=r(167),i=r(225),a=r(968),c=r(531),d=r(131);class l extends s.c{constructor(e="CHANNEL_ROUTE",t={}){t.sendCachedPayload=!0,super("CHANNEL_ROUTE",t),this.createChannelActionsObj(),this.routeConfigJson=this.getRouteConfig(),this.bindStaticMethods(),this.navToStream$=new a.ReplaySubject(1),this.observer$=this.navToStream$.pipe((0,c.map)((e=>this.onMapNext(e)))),this.compareRouteKeywords=o.H.compareRouteKeywords()}checkConfigForHash(){!0==("hash"===i.M.config.channels.ROUTE.type)&&(i.M.config.channels.ROUTE.type="slash",i.M.config.channels.ROUTE.isHash=!0)}onRegistered(){this.checkConfigForHash(),this.initStream()}createChannelActionsObj(){const e=this.addRegisteredActions(),t=(0,d.mergeAll)((0,d.chain)((e=>(0,d.objOf)(e,e)),e));this.channelActions=t}addRegisteredActions(){return["CHANNEL_ROUTE_DEEPLINK_EVENT","CHANNEL_ROUTE_CHANGE_EVENT","CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",["CHANNEL_ROUTE_UPDATE_CONFIG_EVENT","updateRouteConfig"]]}updateRouteConfig(e){const t=(0,d.pick)(["isHash","isHidden","routes","type"],e.payload);i.M.config.channels.ROUTE=(0,d.mergeRight)(i.M.config.channels.ROUTE,t),i.M.conformRouteConfig();const r=this.getRouteConfig();r.navLinks=[...r?.routeDatasetsArr],this.routeConfigJson=r,this.bindStaticMethodsWithConfigData(),this.sendChannelPayload("CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",r,{},{},this.navToStream$)}getRouteConfig(){const e=i.M.config,t=(0,d.path)(["channels","ROUTE"],e);"query"===t.type&&(t.isHash=!1);const r=o.H.flattenConfigObject(t.routes);return t.paramsArr=r,t}initStream(){this.firstLoadStream$=new a.ReplaySubject(1),this.onIncomingDomEvent(void 0,this.routeConfigJson,"CHANNEL_ROUTE_DEEPLINK_EVENT"),o.H.createPopStateStream(this.onIncomingDomEvent.bind(this)),this.observer$=(0,a.merge)(this.firstLoadStream$,this.navToStream$)}onMapNext(e,t=!1){return e.action="CHANNEL_ROUTE_CHANGE_EVENT",e}static removeSSID(e){const t=(0,d.lensProp)(["routeData"]);return(0,d.over)(t,(0,d.omit)(["vsid"]))(e)}static onIncomingDomEvent(e,t=this.routeConfigJson,r){const s=void 0!==r?r:this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT,n=(0,d.path)(["state","routeCount"],e),o=!0===(0,d.is)(Number,n);let i=this.getDataFromString(t,o);!0===o&&(i.routeCount=n),"CHANNEL_ROUTE_DEEPLINK_EVENT"===r&&(i.navLinks=(0,d.prop)("routeDatasetsArr",t),Object.defineProperty(i,"linksData",{get(){return console.warn("get links data is deprecated in ROUTE DEEPLINK DATA, use navLinks"),this.navLinks},set(e){console.warn("set links data is deprecated in ROUTE DEEPLINK DATA, use navLinks")},enumerable:!0}));const a=this.compareRouteKeywords.compare(i.routeData,i.paths);i=(0,d.mergeRight)(i,a),this.sendChannelPayload(s,i,void 0,e,this.navToStream$)}static checkForRouteParamsOverrides(e){return e}static checkForEventMethods(e){const t=(0,d.compose)((0,d.filter)((0,d.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),d.keys,(0,d.prop)("payload"))(e);if(t.length>=1){const r=(0,d.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,d.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),n=e=>{const t=s(e);void 0!==r[t]&&r[t]()};t.forEach(n)}}return e}static checkForEndRoute(e,t=this.routeConfigJson,r){if(!0!==(0,d.compose)((0,d.equals)("true"),(0,d.path)(["payload","endRoute"]))(e))return e;const s=void 0!==r?r:!0===i.M.debug,{payload:n}=e;let o=0;const a=(e=[],t)=>{const r=t[1],{routePath:i}=r,c=(0,d.prop)("routeName",i),l=(e=>{const t=(0,d.prop)("routeName",e);if(t){const r=(0,d.compose)(d.keys,(0,d.omit)(["routeName"]))(e),s=n[t],o=e=>new RegExp(`^${e}$`).test(s);return(0,d.find)(o,r)}})(i),E=(0,d.is)(Object,r),p=(0,d.is)(Array,r);if(o+=1,!0===E&&!1===p){const t=i[l];t?(0,d.compose)(d.reverse,(0,d.reduce)(a,e),d.toPairs)({nextRoutePath:t}):1===o?s&&console.warn(`Spyne Warning: use of end route method should add start route value of "${c}".`):e.push(c)}return e},{routes:c}=t,l=(0,d.compose)(d.reverse,(0,d.reduce)(a,[]),d.toPairs)({routes:c});if(1===l.length){const t=l[0];e.payload[t]=""}return e}onViewStreamInfo(e){const t=e.action??this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT;e?.srcElement?.el?.dataset&&(e.payload=function(e){const t={};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(e?.srcElement?.el?.dataset)??e.payload),l.checkForEventMethods(e),e=this.checkForEndRoute(e);let r=this.getDataFromParams(e);const s=(0,d.prop)("srcElement",e),n=(0,d.prop)("event",e),o=!r.isHidden,i=this.compareRouteKeywords.compare(r.routeData,r.paths);r=(0,d.mergeRight)(r,i),this.sendRouteStream(r,o),r=l.removeSSID(r),this.sendChannelPayload(t,r,s,n,this.navToStream$)}static checkAndConvertStrWithRegexTokens(e,t){return(0,d.keys)(t)}sendRouteStream(e,t=!0){!0===t&&this.setWindowLocation(e)}static getRouteState(){return"CHANNEL_ROUTE_CHANGE_EVENT"}static getIsDeepLinkBool(e){return!1===e&&0===this._routeCount}static getRouteCount(e=!1){return void 0===this._routeCount?(this._routeCount=0,this._routeCount):(!1===e&&(this._routeCount+=1),this._routeCount)}static getExtraPayloadParams(e=this.routeConfigJson,t=!1){return{routeCount:this.getRouteCount(t),isDeepLink:this.getIsDeepLinkBool(t),isHash:e.isHash,isHistory:t,isHidden:e.isHidden,routeType:e.type}}static getDataFromParams(e,t=this.routeConfigJson){let r=(0,d.prop)("payload",e);const s=this.getRouteStrFromParams(r,t),o=(e,r)=>(0,d.defaultTo)(r,(0,d.prop)(e,t)),i=o("type","slash"),a=o("isHash",!1),c=n.Q.formatStrAsWindowLocation(s),l=this.getDataFromLocationStr(i,a,c),{pathInnermost:E,paths:p}=l;r=(0,d.mergeRight)(l.routeData,r);const{routeCount:h,isDeepLink:N,isHash:u,isHistory:_,isHidden:m,routeType:T}=this.getExtraPayloadParams(t);return{isDeepLink:N,routeCount:h,pathInnermost:E,paths:p,routeData:r,routeValue:s,isHash:u,isHidden:m,isHistory:_,routeType:T}}static getDataFromString(e=this.routeConfigJson,t=!1){const r=e.type,s=!0===e.isHash,o=n.Q.getLocationStrByType(r,s),{paths:i,pathInnermost:a,routeData:c,routeValue:d}=l.getParamsFromRouteStr(o,e,r),{routeCount:E,isDeepLink:p,isHash:h,routeType:N,isHidden:u}=this.getExtraPayloadParams(e,t);return{isDeepLink:p,routeCount:E,pathInnermost:a,paths:i,routeData:c,routeValue:d,isHash:h,isHidden:u,isHistory:t,routeType:N}}static getDataFromLocationStr(e="slash",t=this.routeConfigJson.isHash,r=window.location){const s=void 0!==this.routeConfigJson?this.routeConfigJson.type:e,o=n.Q.getLocationStrByType(s,t,r),{paths:i,pathInnermost:a,routeData:c,routeValue:d}=this.getParamsFromRouteStr(o,this.routeConfigJson,s);return{paths:i,pathInnermost:a,routeData:c,routeValue:d,action:this.getRouteState()}}static getLocationData(){return(0,d.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getRouteStrFromParams(e,t,r){const s=void 0!==r?r:t.type;return n.Q.convertParamsToRoute(e,t,s)}static getParamsFromRouteStr(e,t,r){const s=void 0!==r?r:t.type;return n.Q.convertRouteToParams(e,t,s)}checkEmptyRouteStr(e,t=!1){const r=(0,d.isEmpty)(e);return!0==(!0===r&&!1===t)||!0==(!0===r&&!0===t)?"/":!0==(!1===r&&!0===t)?(0,d.concat)("#",e):e}static removeLastSlash(e){return e.replace(/^(.*)(\/)$/,"$1")}setWindowLocation(e){let{isHash:t,routeValue:r,routeType:s}=e;r=this.checkEmptyRouteStr(r,t);const{routeCount:n}=e;if(!0===t||"query"===s)r=l.removeLastSlash(window.location.pathname)+r,window.history.pushState({routeCount:n},"",r);else{const e=(0,d.when)((0,d.compose)((0,d.complement)((0,d.equals)("/")),d.head),(0,d.concat)("/",d.__));window.history.pushState({routeCount:n},"",e(r))}}getWindowLocation(){return window.location.pathname}bindStaticMethods(){this.checkForEndRoute=l.checkForEndRoute.bind(this),this.getIsDeepLinkBool=l.getIsDeepLinkBool.bind(this),this.getDataFromLocationStr=l.getDataFromLocationStr.bind(this),this.onIncomingDomEvent=l.onIncomingDomEvent.bind(this),this.getDataFromString=l.getDataFromString.bind(this),this.getParamsFromRouteStr=l.getParamsFromRouteStr.bind(this),this.getLocationData=l.getLocationData.bind(this),this.getRouteState=l.getRouteState.bind(this),this.getDataFromParams=l.getDataFromParams.bind(this),this.getRouteCount=l.getRouteCount.bind(this),this.getExtraPayloadParams=l.getExtraPayloadParams.bind(this),this.bindStaticMethodsWithConfigData()}bindStaticMethodsWithConfigData(){const e=(0,d.curryN)(3,l.getRouteStrFromParams);this.getRouteStrFromParams=e(d.__,this.routeConfigJson,this.routeConfigJson.type)}}},303:(e,t,r)=>{r.d(t,{z:()=>a});var s=r(2),n=r(968),o=r(531),i=r(131);class a extends s.c{constructor(e="CHANNEL_UI",t={}){t.sendCachedPayload=!1,super(e,t),this.keyEventsLoaded=!1,this.keyCodeArr=[]}addRegisteredActions(){return["CHANNEL_UI_DOMCONTENTLOADED_EVENT","CHANNEL_UI_ABORT_EVENT","CHANNEL_UI_ACTIVATE_EVENT","CHANNEL_UI_ADDTRACK_EVENT","CHANNEL_UI_AFTERPRINT_EVENT","CHANNEL_UI_AFTERSCRIPTEXECUTE_EVENT","CHANNEL_UI_ANIMATIONCANCEL_EVENT","CHANNEL_UI_ANIMATIONEND_EVENT","CHANNEL_UI_ANIMATIONITERATION_EVENT","CHANNEL_UI_ANIMATIONSTART_EVENT","CHANNEL_UI_APPINSTALLED_EVENT","CHANNEL_UI_AUDIOEND_EVENT","CHANNEL_UI_AUDIOSTART_EVENT","CHANNEL_UI_AUXCLICK_EVENT","CHANNEL_UI_BEFOREINPUT_EVENT","CHANNEL_UI_BEFOREPRINT_EVENT","CHANNEL_UI_BEFOREUNLOAD_EVENT","CHANNEL_UI_BEGINEVENT_EVENT","CHANNEL_UI_BLOCKED_EVENT","CHANNEL_UI_BLUR_EVENT","CHANNEL_UI_BOUNDARY_EVENT","CHANNEL_UI_BUFFEREDAMOUNTLOW_EVENT","CHANNEL_UI_CANCEL_EVENT","CHANNEL_UI_CANPLAY_EVENT","CHANNEL_UI_CANPLAYTHROUGH_EVENT","CHANNEL_UI_CHANGE_EVENT","CHANNEL_UI_CLICK_EVENT","CHANNEL_UI_CLOSE_EVENT","CHANNEL_UI_CLOSING_EVENT","CHANNEL_UI_COMPLETE_EVENT","CHANNEL_UI_COMPOSITIONEND_EVENT","CHANNEL_UI_COMPOSITIONSTART_EVENT","CHANNEL_UI_COMPOSITIONUPDATE_EVENT","CHANNEL_UI_CONNECT_EVENT","CHANNEL_UI_CONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_CONTENTDELETE_EVENT","CHANNEL_UI_CONTEXTMENU_EVENT","CHANNEL_UI_COPY_EVENT","CHANNEL_UI_CUECHANGE_EVENT","CHANNEL_UI_CUT_EVENT","CHANNEL_UI_DATACHANNEL_EVENT","CHANNEL_UI_DBLCLICK_EVENT","CHANNEL_UI_DEVICECHANGE_EVENT","CHANNEL_UI_DEVICEMOTION_EVENT","CHANNEL_UI_DEVICEORIENTATION_EVENT","CHANNEL_UI_DRAG_EVENT","CHANNEL_UI_DRAGEND_EVENT","CHANNEL_UI_DRAGENTER_EVENT","CHANNEL_UI_DRAGLEAVE_EVENT","CHANNEL_UI_DRAGOVER_EVENT","CHANNEL_UI_DRAGSTART_EVENT","CHANNEL_UI_DROP_EVENT","CHANNEL_UI_DURATIONCHANGE_EVENT","CHANNEL_UI_EMPTIED_EVENT","CHANNEL_UI_END_EVENT","CHANNEL_UI_ENDEVENT_EVENT","CHANNEL_UI_ENDED_EVENT","CHANNEL_UI_ENTERPICTUREINPICTURE_EVENT","CHANNEL_UI_ERROR_EVENT","CHANNEL_UI_FOCUS_EVENT","CHANNEL_UI_FOCUSIN_EVENT","CHANNEL_UI_FOCUSOUT_EVENT","CHANNEL_UI_FORMDATA_EVENT","CHANNEL_UI_FULLSCREENCHANGE_EVENT","CHANNEL_UI_FULLSCREENERROR_EVENT","CHANNEL_UI_GAMEPADCONNECTED_EVENT","CHANNEL_UI_GAMEPADDISCONNECTED_EVENT","CHANNEL_UI_GATHERINGSTATECHANGE_EVENT","CHANNEL_UI_GESTURECHANGE_EVENT","CHANNEL_UI_GESTUREEND_EVENT","CHANNEL_UI_GESTURESTART_EVENT","CHANNEL_UI_GOTPOINTERCAPTURE_EVENT","CHANNEL_UI_HASHCHANGE_EVENT","CHANNEL_UI_ICECANDIDATE_EVENT","CHANNEL_UI_ICECANDIDATEERROR_EVENT","CHANNEL_UI_ICECONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_ICEGATHERINGSTATECHANGE_EVENT","CHANNEL_UI_INPUT_EVENT","CHANNEL_UI_INPUTSOURCESCHANGE_EVENT","CHANNEL_UI_INSTALL_EVENT","CHANNEL_UI_INVALID_EVENT","CHANNEL_UI_KEYDOWN_EVENT","CHANNEL_UI_KEYUP_EVENT","CHANNEL_UI_LANGUAGECHANGE_EVENT","CHANNEL_UI_LEAVEPICTUREINPICTURE_EVENT","CHANNEL_UI_LOAD_EVENT","CHANNEL_UI_LOADEDDATA_EVENT","CHANNEL_UI_LOADEDMETADATA_EVENT","CHANNEL_UI_LOADEND_EVENT","CHANNEL_UI_LOADSTART_EVENT","CHANNEL_UI_LOSTPOINTERCAPTURE_EVENT","CHANNEL_UI_MARK_EVENT","CHANNEL_UI_MERCHANTVALIDATION_EVENT","CHANNEL_UI_MESSAGE_EVENT","CHANNEL_UI_MESSAGEERROR_EVENT","CHANNEL_UI_MOUSEDOWN_EVENT","CHANNEL_UI_MOUSEENTER_EVENT","CHANNEL_UI_MOUSELEAVE_EVENT","CHANNEL_UI_MOUSEMOVE_EVENT","CHANNEL_UI_MOUSEOUT_EVENT","CHANNEL_UI_MOUSEOVER_EVENT","CHANNEL_UI_MOUSEUP_EVENT","CHANNEL_UI_MUTE_EVENT","CHANNEL_UI_NEGOTIATIONNEEDED_EVENT","CHANNEL_UI_NOMATCH_EVENT","CHANNEL_UI_NOTIFICATIONCLICK_EVENT","CHANNEL_UI_OFFLINE_EVENT","CHANNEL_UI_ONLINE_EVENT","CHANNEL_UI_OPEN_EVENT","CHANNEL_UI_ORIENTATIONCHANGE_EVENT","CHANNEL_UI_PAGEHIDE_EVENT","CHANNEL_UI_PAGESHOW_EVENT","CHANNEL_UI_PASTE_EVENT","CHANNEL_UI_PAUSE_EVENT","CHANNEL_UI_PAYERDETAILCHANGE_EVENT","CHANNEL_UI_PAYMENTMETHODCHANGE_EVENT","CHANNEL_UI_PLAY_EVENT","CHANNEL_UI_PLAYING_EVENT","CHANNEL_UI_POINTERCANCEL_EVENT","CHANNEL_UI_POINTERDOWN_EVENT","CHANNEL_UI_POINTERENTER_EVENT","CHANNEL_UI_POINTERLEAVE_EVENT","CHANNEL_UI_POINTERLOCKCHANGE_EVENT","CHANNEL_UI_POINTERLOCKERROR_EVENT","CHANNEL_UI_POINTERMOVE_EVENT","CHANNEL_UI_POINTEROUT_EVENT","CHANNEL_UI_POINTEROVER_EVENT","CHANNEL_UI_POINTERUP_EVENT","CHANNEL_UI_POPSTATE_EVENT","CHANNEL_UI_PROGRESS_EVENT","CHANNEL_UI_PUSH_EVENT","CHANNEL_UI_PUSHSUBSCRIPTIONCHANGE_EVENT","CHANNEL_UI_RATECHANGE_EVENT","CHANNEL_UI_READYSTATECHANGE_EVENT","CHANNEL_UI_REJECTIONHANDLED_EVENT","CHANNEL_UI_REMOVETRACK_EVENT","CHANNEL_UI_REMOVESTREAM_EVENT","CHANNEL_UI_REPEATEVENT_EVENT","CHANNEL_UI_RESET_EVENT","CHANNEL_UI_RESIZE_EVENT","CHANNEL_UI_RESOURCETIMINGBUFFERFULL_EVENT","CHANNEL_UI_RESULT_EVENT","CHANNEL_UI_RESUME_EVENT","CHANNEL_UI_SCROLL_EVENT","CHANNEL_UI_SEARCH_EVENT","CHANNEL_UI_SEEKED_EVENT","CHANNEL_UI_SEEKING_EVENT","CHANNEL_UI_SELECT_EVENT","CHANNEL_UI_SELECTEDCANDIDATEPAIRCHANGE_EVENT","CHANNEL_UI_SELECTEND_EVENT","CHANNEL_UI_SELECTIONCHANGE_EVENT","CHANNEL_UI_SELECTSTART_EVENT","CHANNEL_UI_SHIPPINGADDRESSCHANGE_EVENT","CHANNEL_UI_SHIPPINGOPTIONCHANGE_EVENT","CHANNEL_UI_SIGNALINGSTATECHANGE_EVENT","CHANNEL_UI_SLOTCHANGE_EVENT","CHANNEL_UI_SOUNDEND_EVENT","CHANNEL_UI_SOUNDSTART_EVENT","CHANNEL_UI_SPEECHEND_EVENT","CHANNEL_UI_SPEECHSTART_EVENT","CHANNEL_UI_SQUEEZE_EVENT","CHANNEL_UI_SQUEEZEEND_EVENT","CHANNEL_UI_SQUEEZESTART_EVENT","CHANNEL_UI_STALLED_EVENT","CHANNEL_UI_START_EVENT","CHANNEL_UI_STATECHANGE_EVENT","CHANNEL_UI_STORAGE_EVENT","CHANNEL_UI_SUBMIT_EVENT","CHANNEL_UI_SUCCESS_EVENT","CHANNEL_UI_SUSPEND_EVENT","CHANNEL_UI_TIMEOUT_EVENT","CHANNEL_UI_TIMEUPDATE_EVENT","CHANNEL_UI_TOGGLE_EVENT","CHANNEL_UI_TONECHANGE_EVENT","CHANNEL_UI_TOUCHCANCEL_EVENT","CHANNEL_UI_TOUCHEND_EVENT","CHANNEL_UI_TOUCHMOVE_EVENT","CHANNEL_UI_TOUCHSTART_EVENT","CHANNEL_UI_TRACK_EVENT","CHANNEL_UI_TRANSITIONCANCEL_EVENT","CHANNEL_UI_TRANSITIONEND_EVENT","CHANNEL_UI_TRANSITIONRUN_EVENT","CHANNEL_UI_TRANSITIONSTART_EVENT","CHANNEL_UI_UNHANDLEDREJECTION_EVENT","CHANNEL_UI_UNLOAD_EVENT","CHANNEL_UI_UNMUTE_EVENT","CHANNEL_UI_UPGRADENEEDED_EVENT","CHANNEL_UI_VERSIONCHANGE_EVENT","CHANNEL_UI_VISIBILITYCHANGE_EVENT","CHANNEL_UI_VOICESCHANGED_EVENT","CHANNEL_UI_VOLUMECHANGE_EVENT","CHANNEL_UI_VRDISPLAYACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYBLUR_EVENT","CHANNEL_UI_VRDISPLAYCONNECT_EVENT","CHANNEL_UI_VRDISPLAYDEACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYDISCONNECT_EVENT","CHANNEL_UI_VRDISPLAYFOCUS_EVENT","CHANNEL_UI_VRDISPLAYPOINTERRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPOINTERUNRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPRESENTCHANGE_EVENT","CHANNEL_UI_WAITING_EVENT","CHANNEL_UI_WEBGLCONTEXTCREATIONERROR_EVENT","CHANNEL_UI_WEBGLCONTEXTLOST_EVENT","CHANNEL_UI_WEBGLCONTEXTRESTORED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCECHANGED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEDOWN_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEUP_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEWILLBEGIN_EVENT","CHANNEL_UI_WHEEL_EVENT"]}loadKeyStream(){const e=n.Observable.fromEvent(document,"keyup");this.keyPresses$=e.groupBy((e=>e.keyCode)).mergeAll().filter((e=>this.keyCodeArr.indexOf(e.keyCode)>=0)).repeat().subscribe(this.onKeyPressed.bind(this))}addKeyEvent(e){!1===this.keyEventsLoaded&&this.loadKeyStream(),this.keyEventsLoaded=!0,this.registerKey(e)}registerKey(e){this.keyCodeArr.push(e)}onKeyPressed(e){}static removeSSID(e){const t=(0,i.lensProp)(["payload"]);return(0,i.over)(t,(0,i.omit)(["vsid"]))(e)}onIncomingObservable(e){const t=(0,i.equals)(e.name,this.props.name);e.data=a.removeSSID(e.data);const{payload:r,srcElement:s}=e.data,n=e=>({payload:r,srcElement:s,event:e});return!0===t?(e=>e.observable.pipe((0,o.map)(n)).subscribe(this.onUIEvent.bind(this)))(e):void 0}getActionState(e){const t=(0,i.path)(["event","type"]),r=(0,i.path)(["event","typeOverRide"]),s=(0,i.compose)(i.toUpper,(0,i.either)(r,t))(e),n="CHANNEL_UI";return void 0!==s?`${n}_${s}_EVENT`:n}static checkForEventMethods(e){const t=(0,i.compose)((0,i.filter)((0,i.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),i.keys,(0,i.prop)("payload"))(e);if(t.length>=1){const r=(0,i.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,i.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),n=e=>{const t=s(e);void 0!==r[t]&&"function"==typeof r[t]&&r[t]()};t.forEach(n)}}return e}onUIEvent(e){e.payload=function(e){const t={};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(e?.srcElement?.el?.dataset)??e.payload,a.checkForEventMethods(e),e.action=this.getActionState(e);const t=e.action,{payload:r,srcElement:s}=e,n=e.event;this.sendChannelPayload(t,r,s,n)}}},597:(e,t,r)=>{r.d(t,{x:()=>E});var s=r(2),n=r(64),o=r(225),i=r(432),a=r(968),c=r(531),d=r(131),l=r(907);class E extends s.c{constructor(e="CHANNEL_WINDOW"){super(e),this.bindStaticMethods(),this.currentScrollY=0}initializeStream(){this.domChannelConfig=o.M.config.channels.WINDOW;const e=this.getActiveObservables(),t=(0,a.merge)(...e);this.dom$=t,t.subscribe((e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n)}))}static getMouseWheelMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_WHEEL_EVENT,r=e.deltaY<=0?"up":"down",{deltaX:s,deltaY:n,deltaZ:o}=e;return{action:t,payload:{scrollDir:r,deltaX:s,deltaY:n,deltaZ:o},srcElement:e.srcElement,event:e}}static createCurriedGenericEvent(e){const t=`CHANNEL_WINDOW_${e.toUpperCase()}_EVENT`;return(0,d.curry)(E.mapGenericEvent)(t)}static mapGenericEvent(e,t){return{action:e,payload:t,srcElement:t.srcElement,event:t}}static getResizeMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_RESIZE_EVENT,payload:(0,d.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window),srcElement:e.srcElement,event:e}}static getOrientationMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_ORIENTATION_EVENT,r=window.matchMedia("(orientation: portrait)").matches,s=(0,d.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window);return s.orientation=!0===r?"portrait":"landscape",{action:t,payload:s,srcElement:e.srcElement,event:e}}getMediaQueryMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_MEDIA_QUERY_EVENT,payload:(0,d.pick)(["matches","media","mediaQueryName"],e),srcElement:e.srcElement,event:e}}createMouseWheelObservable(e){const t=e.debounceMSTimeForScroll;return i.Y.createDomObservableFromEvent("wheel",E.getMouseWheelMapFn.bind(this)).pipe((0,c.debounceTime)(t))}static getScrollData(){let e=0;return t=>{const r=e-t;return e=t,{scrollY:t,scrollDistance:r,scrollDir:r>=0?"up":"down"}}}static getScrollY(e){return void 0!==e.pageYOffset?e.pageYOffset:e.scrollTop}static getScrollMapFn(e,t,r,s,n){const o=s(E.getScrollY(n)),{scrollDistance:i}=o;return{action:r,payload:o,srcElement:e.srcElement,scrollDistance:i,event:e}}createScrollObservable(e,t=window,r=!0){const s=e.debounceMSTimeForScroll,n=t,o=t===window,a=void 0!==e.scrollElForVals?e.scrollElForVals:t,l=o?"CHANNEL_WINDOW_SCROLL_EVENT":"CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT",p=E.getScrollData(),h=(0,d.partialRight)(E.getScrollMapFn,[l,p,a,r,n]).bind(this);return i.Y.createDomObservableFromEvent("scroll",h,r,n).pipe((0,c.debounceTime)(s),(0,c.skipWhile)((e=>0===e.scrollDistance)),(0,c.map)((e=>{const t=E.getScrollY(n);return e.payload.scrollDistanceAbs=Math.abs(this.currentScrollY-t),this.currentScrollY=t,e})))}createOrientationObservable(e){return i.Y.createDomObservableFromEvent("orientationchange",E.getOrientationMapFn.bind(this))}createResizeObservable(e){const t=e.debounceMSTimeForResize;return i.Y.createDomObservableFromEvent("resize",E.getResizeMapFn.bind(this)).pipe((0,c.debounceTime)(t))}getEventsFromConfig(e=this.domChannelConfig){const t=e.events;return(0,d.map)((e=>{const t=E.createCurriedGenericEvent(e);return i.Y.createDomObservableFromEvent(e,t)}),t)}getActiveObservables(e=this.domChannelConfig){let t=[];e.listenForMediaQueries=(0,n.RK)(e.mediaQueries)||(0,n.RK)(e.mediaQueries);const r={listenForResize:this.createResizeObservable.bind(this),listenForOrientation:this.createOrientationObservable.bind(this),listenForScroll:this.createScrollObservable.bind(this),listenForWheel:this.createMouseWheelObservable.bind(this)};(0,d.mapObjIndexed)(((r,s,n)=>{e[s]&&t.push(r(e))}),r),this.checkForMediaQueries(e.listenForMediaQueries);const s=this.getEventsFromConfig(e);return t=t.concat(s),t}checkForMediaQueries(e){!0===e&&this.getMediaQueryObservable(this.domChannelConfig).subscribe((e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n,this.observer$)}))}getMediaQueryObservable(e){const t=this.createMergedObsFromObj(e);return(0,d.apply)(a.merge,t).pipe((0,c.map)(this.getMediaQueryMapFn.bind(this)))}addRegisteredActions(){return["CHANNEL_WINDOW_ABORT_EVENT","CHANNEL_WINDOW_AFTERPRINT_EVENT","CHANNEL_WINDOW_ANIMATIONEND_EVENT","CHANNEL_WINDOW_ANIMATIONITERATION_EVENT","CHANNEL_WINDOW_ANIMATIONSTART_EVENT","CHANNEL_WINDOW_APPINSTALLED_EVENT","CHANNEL_WINDOW_BEFOREPRINT_EVENT","CHANNEL_WINDOW_BEFOREUNLOAD_EVENT","CHANNEL_WINDOW_BEGINEVENT_EVENT","CHANNEL_WINDOW_BLUR_EVENT","CHANNEL_WINDOW_CACHED_EVENT","CHANNEL_WINDOW_CHANGE_EVENT","CHANNEL_WINDOW_CLICK_EVENT","CHANNEL_WINDOW_CLOSE_EVENT","CHANNEL_WINDOW_COMPOSITIONEND_EVENT","CHANNEL_WINDOW_COMPOSITIONSTART_EVENT","CHANNEL_WINDOW_COMPOSITIONUPDATE_EVENT","CHANNEL_WINDOW_COPY_EVENT","CHANNEL_WINDOW_CUT_EVENT","CHANNEL_WINDOW_DBLCLICK_EVENT","CHANNEL_WINDOW_DEVICECHANGE_EVENT","CHANNEL_WINDOW_DEVICELIGHT_EVENT","CHANNEL_WINDOW_DEVICEMOTION_EVENT","CHANNEL_WINDOW_DEVICEORIENTATION_EVENT","CHANNEL_WINDOW_DEVICEPROXIMITY_EVENT","CHANNEL_WINDOW_DOMATTRIBUTENAMECHANGED_EVENT","CHANNEL_WINDOW_DOMATTRMODIFIED_EVENT","CHANNEL_WINDOW_DOMCHARACTERDATAMODIFIED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMELEMENTNAMECHANGED_EVENT","CHANNEL_WINDOW_DRAGEND_EVENT","CHANNEL_WINDOW_DRAGENTER_EVENT","CHANNEL_WINDOW_DRAGLEAVE_EVENT","CHANNEL_WINDOW_DRAGOVER_EVENT","CHANNEL_WINDOW_DRAGSTART_EVENT","CHANNEL_WINDOW_DRAG_EVENT","CHANNEL_WINDOW_DROP_EVENT","CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT","CHANNEL_WINDOW_ERROR_EVENT","CHANNEL_WINDOW_FOCUSIN_EVENT","CHANNEL_WINDOW_FOCUS_EVENT","CHANNEL_WINDOW_FULLSCREENCHANGE_EVENT","CHANNEL_WINDOW_FULLSCREENERROR_EVENT","CHANNEL_WINDOW_HASHCHANGE_EVENT","CHANNEL_WINDOW_INPUT_EVENT","CHANNEL_WINDOW_INVALID_EVENT","CHANNEL_WINDOW_KEYDOWN_EVENT","CHANNEL_WINDOW_KEYPRESS_EVENT","CHANNEL_WINDOW_KEYUP_EVENT","CHANNEL_WINDOW_LOAD_EVENT","CHANNEL_WINDOW_MEDIA_QUERY_EVENT","CHANNEL_WINDOW_MESSAGE_EVENT","CHANNEL_WINDOW_MOUSEDOWN_EVENT","CHANNEL_WINDOW_MOUSEENTER_EVENT","CHANNEL_WINDOW_MOUSELEAVE_EVENT","CHANNEL_WINDOW_MOUSEMOVE_EVENT","CHANNEL_WINDOW_MOUSEOUT_EVENT","CHANNEL_WINDOW_MOUSEOVER_EVENT","CHANNEL_WINDOW_MOUSEUP_EVENT","CHANNEL_WINDOW_MOUSEWHEEL_EVENT","CHANNEL_WINDOW_OFFLINE_EVENT","CHANNEL_WINDOW_ONLINE_EVENT","CHANNEL_WINDOW_OPEN_EVENT","CHANNEL_WINDOW_ORIENTATION_EVENT","CHANNEL_WINDOW_PAGEHIDE_EVENT","CHANNEL_WINDOW_PAGESHOW_EVENT","CHANNEL_WINDOW_PASTE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_PROGRESSEVENTS_EVENT","CHANNEL_WINDOW_RESET_EVENT","CHANNEL_WINDOW_RESIZE_EVENT","CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT","CHANNEL_WINDOW_SCROLL_EVENT","CHANNEL_WINDOW_SCROLL_LOCK_EVENT",["CHANNEL_WINDOW_SCROLL_LOCK_EVENT","onScrollLockEvent"],["CHANNEL_WINDOW_SET_ELEMENT_TO_SCROLL_EVENT","onSetElementToScroll"],"CHANNEL_WINDOW_STORAGE_EVENT","CHANNEL_WINDOW_SUBMIT_EVENT","CHANNEL_WINDOW_TRANSITIONCANCEL_EVENT","CHANNEL_WINDOW_TRANSITIONEND_EVENT","CHANNEL_WINDOW_TRANSITIONRUN_EVENT","CHANNEL_WINDOW_TRANSITIONSTART_EVENT","CHANNEL_WINDOW_UNLOAD_EVENT","CHANNEL_WINDOW_WHEEL_EVENT"]}onScrollLockEvent(e){}onSetElementToScroll(e){let{config:t,el:r,scrollElement:s}=e.payload;t=t||{},t=(0,l.$)(this.domChannelConfig,t),s=s||r,this.sendChannelPayload("CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT",{el:r},r),this.createScrollObservable(t,s).subscribe((e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n)}))}bindStaticMethods(){this.createMediaQueryHandler=i.Y.createMediaQueryHandler.bind(this),this.createMergedObsFromObj=i.Y.createMergedObsFromObj.bind(this)}}},713:(e,t,r)=>{r.d(t,{D:()=>l});var s=r(470),n=r(173),o=r(167),i=r(225),a=r(49);const c=new s.H,d="0.20.7";let l=new class{constructor(){this.version=d}get channels(){return c}init(e={},t=!1){if(!0===i.M.initialized)return t?"The Spyne Application has already been initialized!":void console.warn("The Spyne Application has already been initialized!");let r={scrollLock:!1,scrollLockX:31,scrollLockY:0,debug:!1,strict:!1,baseHref:void 0,IMG_PATH:"undefined"!=typeof IMG_PATH?IMG_PATH:void 0,pluginMethods:{},plugins:{},tmp:{},ephemeralProps:{},tmpProps:{},channels:{WINDOW:{mediaQueries:{},events:[],listenForResize:!0,listenForOrientation:!0,listenForScroll:!1,listenForMouseWheel:!1,listenForWheel:!1,debounceMSTimeForResize:200,debounceMSTimeForScroll:150},ROUTE:{type:"slash",isHash:!1,isHidden:!1,add404s:!1,routes:{routePath:{routeName:"change"}}}}};if(void 0!==e){const t=o.H;e=i.M.initialize(r,e,c,t)}this.pluginsFn=i.M.getPluginsMethodObj(e.pluginMethods),this.getChannelActions=e=>c.getChannelActions(e),this.registerChannel=e=>c.registerStream(e),this.registerPlugin=e=>i.M.registerPlugin(e),this.registerDataChannel=e=>c.registerStream(e),this.listChannels=()=>Array.from(c.map.keys());let s=new n.A({id:"spyne-null-views"});s.appendToDom(document.body),s.props.el.style.cssText="display:none; opacity:0; pointer-events:none;",c.init(),!0===i.M.config.debug&&(window.Spyne={version:d}),(0,a.D)(i.M.config)}static listChannels(){return Array.from(c.map.keys())}static getChannelActions(e){return c.getChannelActions(e)}static registerChannel(e){if(!1!==i.M.initialized)return c.registerStream(e);console.warn("Spyne has not been initialized")}}},930:(e,t,r)=>{r.d(t,{V:()=>a});var s=r(192),n=r(225),o=r(131);let i=n.M;class a{constructor(e={}){let{name:t,config:r,parentEl:s}=e;this.props=e,void 0===r&&(r=(0,o.clone)(e)),this.name=t||"empty",this.props.name=t,r=a.mergeDefaultConfig(r,this.defaultConfig()),this.props.parentEl=s||a.createParentEl(),this.props.config=r,void 0!==this.props.traits&&this.addTraits(this.props.traits)}register(e){i=e,this.props.pluginName=this.props.name,!1!==i.initialized?(this.onBeforeRegistered(),this.props.config=(0,o.clone)(this.props.config),i.addPluginConfig(this.name,this.props.config),this.onRegistered(),this.onRender()):console.warn(`Spyne Warning: SpyneApp has not been initialized yet! Cannot register plugin "${this.name}".`)}get SpyneAppProperties(){return i}static mergeDefaultConfig(e={},t=this.defaultConfig()){return Object.assign(t,e)}static getSpyneApp(e,t){!1===i.initialized?console.warn(`Spyne Warning: Unable to install plugin, ${e}! SpyneApp has not been initialized!`):i.addPluginConfig(e,t)}static updateSpyneConfig(e,t,r){return!0===(0,o.pathSatisfies)((0,o.is)(Object),["config","plugins",t])(e)?(!0===e.config.debug&&console.warn(`Spyne Warning: The plugin, ${t}, already exists`),!1):(e.config.plugins[t]=r,e.config.plugins[t])}static createParentEl(e){return e||document.getElementById("spyne-plugins")||(()=>{const e=new s.r({id:"spyne-plugins"});document.body.appendChild(e.render());const t=document.getElementById("spyne-plugins");return t.style.cssText="position:absolute; top:0;left:0;width:100%;height:100%;min-height:100vh;z-index:1000000; pointer-events:none",t})()}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>new e(this)))}onBeforeRegistered(){this.checkForRequiredWindowEvent()}checkForRequiredWindowEvent(){const e=this.props.requiredEvents??[],t=n.M.getChannelConfig("WINDOW"),r=e.filter((e=>!t.events.includes(e)));r.length>0&&console.warn(`plugin "${this.props.name}" requires the following config.WINDOW.events, --\x3e ${r.join(", ")} <--`)}defaultConfig(){return{}}onRegistered(){}onRender(){}}},9:(e,t,r)=>{r.d(t,{G:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(e,t,r,s){this._mapFn=i.setMapFn(e),this._url=i.setUrl(e),this._responseType=i.setResponseType(e),this._serverOptions=i.setServerOptions(e),this._subscriber=void 0!==t?t:e=>console.log("FETCH RETURNED ",e),this.debug=void 0!==e.debug&&e.debug,this.channelName=s;const n={mapFn:this.mapFn,url:this.url,serverOptions:this.serverOptions,responseType:this.responseType,debug:this.debug};!0!==r&&i.startWindowFetch(n,this._subscriber,this.channelName)}static startWindowFetch(e,t,r){const{mapFn:o,url:i,serverOptions:a,responseType:c,debug:d}=e,l=!0===d?e=>console.log("DEBUG FETCH :",e,{url:i,serverOptions:a,responseType:c,channelName:r}):()=>{},E=(0,s.from)(window.fetch(i,a)).pipe((0,n.tap)(l),(0,n.flatMap)((e=>(0,s.from)(e[c]()))),(0,n.map)((e=>{const t={channelName:r,url:i,responseType:c,serverOptions:a};return r=>e(r,t)})(o)),(0,n.publish)());E.connect(),E.subscribe(t)}static setMapFn(e){return(0,o.compose)((0,o.defaultTo)((e=>e)),(0,o.prop)("mapFn"))(e)}static setUrl(e){const t=(0,o.prop)("url",e);return void 0===t&&console.warn("SPYNE WARNING: URL is undefined for data channel"),t}static setResponseType(e){return(0,o.defaultTo)("json",(0,o.prop)("responseType",e))}get mapFn(){return this._mapFn}get url(){return this._url}get serverOptions(){return this._serverOptions}get responseType(){return this._responseType}static stringifyBodyIfItExists(e){return(0,o.when)((0,o.propIs)(Object,"body"),(0,o.compose)((0,o.over)((0,o.lensProp)("body"),JSON.stringify)))(e)}static updateMethodWhenBodyExists(e){const t=(0,o.has)("body"),r=(0,o.propEq)("GET","method"),s=(0,o.allPass)([t,r]);return(0,o.when)(s,(0,o.assoc)("method","POST"))(e)}static setServerOptions(e){const t=(0,o.pick)(["method","headers","body","mode","credentials","cache","redirect","referrer","referrerPolicy","integrity","keepalive"],e);let r=(0,o.mergeDeepRight)(i.baseOptions(),t);return r=i.updateMethodWhenBodyExists(r),r=i.stringifyBodyIfItExists(r),r}static baseOptions(){return{method:"GET",headers:new Headers({Accept:"application/json, text/plain, */*"}),mode:"cors",credentials:"same-origin",cache:"default",redirect:"follow",referrer:"client",referrerPolicy:"no-referrer-when-downgrade",integrity:"",keepalive:!1}}}},589:(e,t,r)=>{r.d(t,{C:()=>E});var s=r(131),n=r(225);const o=(0,s.compose)(s.not,(0,s.is)(Array)),i=(0,s.compose)(s.not,s.isEmpty),a=(0,s.allPass)([(0,s.is)(String),i]),c=(0,s.allPass)([(0,s.is)(Array),i]),d=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)])),l=(0,s.compose)((0,s.allPass)([i,o,(0,s.is)(Object)]));class E{constructor(e,t={},r,o){d(e)&&(t=e,e=(0,s.prop)("selector",t),o=o||(0,s.prop)("testMode",t));const i=[r,(0,s.prop)("debugLabel",t)];r=(0,s.compose)((0,s.find)((0,s.is)(String)))(i);let p=(0,s.omit)(["debugLabel","label","selector","props","testMode","propFilters"],t);void 0!==t.props?p=(0,s.mergeAll)([t.props,p]):void 0!==t.propFilters&&(p=(0,s.mergeAll)([t.propFilters,p])),t.propFilters=p;const{propFilters:h}=t,N=a(e)?E.filterSelector([e],r):void 0,u=c(e)?E.filterSelector(e,r):void 0,_=l(h)?E.filterData(h,r):void 0;let m=(0,s.reject)(s.isNil,[N,u,_]);const T=(0,s.isEmpty)(m);return T&&(m=[(0,s.always)(!1)],!0===n.M.debug&&!0!==o&&console.warn(`Spyne Warning: The Channel Filter, with selector: ${e}, and propFilters:${h} appears to be empty!`)),!0===o?{selector:e,propFilters:h,debugLabel:r,filters:t,testMode:o,filtersAreEmpty:T}:(0,s.allPass)(m)}static filterData(e,t){const r=t;return(()=>{if((0,s.isEmpty)(e))return(0,s.always)(!1);e=(0,s.map)(((e,t,r)=>{let n=s.F;if((e=>(0,s.is)(String,e))(e)||(e=>(0,s.is)(Boolean,e))(e)||(e=>(0,s.is)(Number,e))(e))o=e,n=e=>e===o;else{if("function"==typeof e)return e;if((e=>(0,s.is)(Array,e))(e)||d(e))return console.warn(`ChannelPayloadFilter: Property "${e}" is an array/object, which is not allowed. This property will always return false.`),n}var o;return n}),e);const t=(0,s.where)(e);return(0,s.compose)(t,(t=>{if(void 0===r)return t;const n={};return(0,s.forEachObjIndexed)(((e,r)=>{n[r]=e((0,s.prop)(r,t))}),e),console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${r}"] - values: `,"color:orange;",{propsBooleans:n,comparedObj:t}),t}),(0,s.defaultTo)({}),(e=>{const{payload:t,srcElement:r,event:s}=e||{};return Object.assign({},e,r,s,t)}))})()}static checkPayloadSelector(e,t,r){const{payload:n,srcElement:o,event:i}=r||{},a=[o,n,(0,s.prop)("srcElement",i),r].reduce(((e,t)=>{const r=(0,s.prop)("el",t);return E.elIsDomElement(r)&&void 0===e&&(e=r),e}),void 0),c=e=>e.isEqualNode(a),d=e=>{const t=(0,s.flatten)(document.querySelectorAll(e));return(0,s.map)(c,t)};if(void 0!==t){const r=(0,s.compose)(s.flatten,(0,s.map)(d))(e),n=e;console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${t}"] - selectors: `,"color:orange;",{el:a,selectorsArr:n,nodeArrResultsDebugger:r})}if("object"!=typeof a)return!1;const l=(0,s.compose)(s.flatten,(0,s.map)(d))(e);return!0!==(0,s.isEmpty)(l)&&(0,s.any)((0,s.equals)(!0),l)}static elIsDomElement(e){return(0,s.is)(String,e)&&(e=document.querySelector(e)),(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(e)}static filterSelector(e,t){const r=(0,s.reject)(s.isEmpty,e);return(0,s.curry)(E.checkPayloadSelector)(r,t)}}},907:(e,t,r)=>{function s(e){return e&&"object"==typeof e&&"[object RegExp]"!==Object.prototype.toString.call(e)&&"[object Date]"!==Object.prototype.toString.call(e)}function n(e,t){return t&&!0===t.clone&&s(e)?i((r=e,Array.isArray(r)?[]:{}),e,t):e;var r}function o(e,t,r){const o=e.slice();return t.forEach((function(t,a){void 0===o[a]?o[a]=n(t,r):s(t)?o[a]=i(e[a],t,r):-1===e.indexOf(t)&&o.push(n(t,r))})),o}function i(e,t,r){const a=Array.isArray(t),c=(r||{arrayMerge:o}).arrayMerge||o;return a?Array.isArray(e)?c(e,t,r):n(t,r):function(e,t,r){const o={};return s(e)&&Object.keys(e).forEach((function(t){o[t]=n(e[t],r)})),Object.keys(t).forEach((function(a){s(t[a])&&e[a]?o[a]=i(e[a],t[a],r):o[a]=n(t[a],r)})),o}(e,t,r)}r.d(t,{$:()=>i}),i.all=function(e,t){if(!Array.isArray(e)||e.length<2)throw new Error("first argument should be an array with at least two elements");return e.reduce((function(e,r){return i(e,r,t)}))}},64:(e,t,r)=>{r.d(t,{FZ:()=>i,Ir:()=>n,Lx:()=>a,OZ:()=>o,RK:()=>c,V0:()=>d});var s=r(131);const n=async(e,t)=>{window.setTimeout((async()=>{await new Promise((e=>setTimeout(e,1))),window.requestAnimationFrame(e)}),t)},o=e=>{if(void 0!==e.constructor.name)return e.constructor.name;const t=e.toString();return(0,s.defaultTo)(String(t).substr(0,12),(0,s.match)(/^(function\s)(\w+)(\(.*)$/,t)[2])},i=(e,t)=>void 0!==e[t]?t:(0,s.compose)(s.head,(0,s.filter)((0,s.compose)((0,s.test)(s.__,t),(e=>new RegExp(e)))))((0,s.keys)(e)),a=e=>{const t={};for(const r in e)t[r]=e[r];return t},c=e=>{const t=(0,s.compose)((0,s.complement)(s.isEmpty),s.head,s.values),r=(0,s.compose)((0,s.complement)(s.isNil),s.head,s.values);return(0,s.allPass)([t,r])(e)};function d(e,t=[]){const r=(0,s.concat)(["length","name","prototype","constructor"],t),n=(0,s.compose)((0,s.without)(r),s.uniq),o=n(Object.getOwnPropertyNames(e.constructor.prototype)),i=n(Object.getOwnPropertyNames(e.constructor));return{methods:o,staticMethods:i,allMethods:(0,s.concat)(o,i)}}},158:(e,t,r)=>{r.d(t,{gc:()=>n});var s=r(131);function n(){setTimeout((()=>{(0,s.forEach)((e=>{}),this)}),1)}},445:(e,t,r)=>{function s(){return{createpropsMap:function(){const e=new WeakMap,t={vsid:this.props.vsid};return e.set(t,this.props),{key:t,weakMap:e}},gc:function(){for(const e in this)delete this[e]},createId:function(){return Math.random().toString(36).replace(/\d/gm,"").substring(1,8)},setTraceFunc:function(e){return!0===e?console.log:()=>{}}}}r.d(t,{z:()=>s})},643:(e,t,r)=>{r.d(t,{N:()=>n});var s=r(54);function n(){return{testFunc:function(e){console.log("stream mixin is ",e)},sendRoutePayload:function(e,t){return new s.u("CHANNEL_ROUTE",e,t,"subscribe")},sendUIPayload:function(e,t){return new s.u("CHANNEL_UI",e,t,"subscribe")}}}},521:(e,t,r)=>{r.d(t,{g:()=>o});var s=r(173),n=r(131);class o{constructor(e){const t=String(e.props.name),r=`${t}_ROUTE_UPDATER`;return(0,n.curry)(o.createTemporaryViewStreamObj)({id:r,name:t})}static createTemporaryViewStreamObj(e,t){const{name:r,id:n}=e,o=t,i=new s.A({id:n,name:r,data:t});i.onRendered=()=>{i.sendInfoToChannel("CHANNEL_ROUTE",o)},i.afterBroadcastEvents=()=>{i.disposeViewStream()},i.appendToNull()}}},961:(e,t,r)=>{r.d(t,{l:()=>o});var s=r(131),n=r(225);const o=function(e){const{__proxy__proxyName:t}=e;if(void 0!==t){const r=n.M.getProxyReviver(t);if("function"==typeof r)return((e,t)=>{const{__proxy__proxyName:r}=e;void 0===r&&console.error("object is not proxy object ",e);const n=(r,n)=>{const o=(0,s.path)(n,e),{__proxy__isProxy:i,__proxy__props:a}=o;return i?t(r,a):r},o=n((0,s.clone)(e),[]),i=(e,t)=>{const r=t||[];Object.entries(e).forEach((([t,s])=>{const o=(e=>{let t=typeof e;return["number","boolean","string"].includes(t)?t="primitive":"object"===t&&(Array.isArray(e)?t="array":null===e&&(t="undefined")),t})(s),a=[...r];a.push(t),"object"!==o&&"array"!==o||(e[t]=n(s,a),i(s,a))}))};return i(o),o})(e,r)}const r=(0,s.is)(Array),o=(0,s.is)(Object);var i;return!1===r(i=e)&&!0===o(i)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}},49:(e,t,r)=>{r.d(t,{A:()=>c,D:()=>a});var s=r(636),n=r.n(s);let o,i=!1;const a=e=>{if(i)console.warn("sanitizeHTML is already configured. Reconfiguration is not allowed.");else{if(e.strict)if(window.trustedTypes){const e=window.trustedTypes.createPolicy("default",{createHTML:e=>n().sanitize(e,{RETURN_TRUSTED_TYPE:!1})});o=t=>e.createHTML(t)}else o=e=>n().sanitize(e);else o=e=>e;i=!0}},c=e=>{if(!i)throw new Error("sanitizeHTML is not configured. Call sanitizeHTMLConfigure() with appropriate config.");return o(e)}},225:(e,t,r)=>{r.d(t,{M:()=>m});var s=r(167),n=r(519),o=r(907);let i,a,c,d,l=!0;const E=[];let p,h;const N=[],u=new Map,_=new n.O,m=new class{constructor(){d=!1}get channelsMap(){return c}get initialized(){return d}get config(){return i}get debug(){return l}static listChannels(){return Array.from(a.map.keys())}initialize(e={},t={},r,s){return a=r,i=(0,o.$)(e,t),i.channels&&i.channels.ROUTE&&(i=s.conformRouteObject(i)),h=i?.IMG_PATH,l=void 0!==i.debug?i.debug:l,this.getChannelActions=a.getChannelActions.bind(a),this.listRegisteredChannels=a.listRegisteredChannels.bind(a),d=!0,this._initialized=d,this.setChannelsMap(),t?.baseHref&&this.setHeadBaseHref(t.baseHref),i}setHeadBaseHref(e){const t=document.createElement("base");t.href=e,document.head.appendChild(t)}conformRouteConfig(e=!1){i=s.H.conformRouteObject(i,e)}setChannelsMap(){const e=a.getStream.bind(a),t=a.testStream.bind(a),r=a.getProxySubject.bind(a);c={getStream:e,testStream:t,getProxySubject:r}}setProp(e,t,r=!1){return r?(i.ephemeralProps[e]=t,t):(i.tmpProps[e]=t,e)}getProp(e){if(i.ephemeralProps.hasOwnProperty(e)){const t=i.ephemeralProps[e];return delete i.ephemeralProps[e],t}return i?.tmpProps?.[e]}createTempProp(e){const t=Math.random().toString(36).slice(2,8);return this.setProp(t,e,!0),t}setChannelConfig(e,t){return i.channels[e]=t,i.channels[e]}getChannelConfig(e,t=i){if("CHANNEL_ROUTE"===e?e="ROUTE":"CHANNEL_WINDOW"===e&&(e="WINDOW"),void 0===t||void 0===i.channels)return void console.warn("Spyne warning: Spyne config object is empty!");const r=i.channels[e];if(void 0!==r)return r;console.warn(`Spyne warning: Spyne configuration for channel, ${e} is empty!`)}registerChannel(){}addPluginConfig(e,t={}){void 0===i.plugins&&(i.plugins={}),this.addPluginMethods(t.pluginMethods),i.plugins[e]=t}getPluginsMethodObj(e){return e&&this.addPluginMethods(e),_.pluginMethodsObj}addPluginMethods(e){e&&_.addMethods(e)}doNotTrackChannel(e){N.push(e)}getUntrackedChannelsList(){return N}registerProxyReviver(e,t){u.set(e,t)}registerPlugin(e){this._initialized||console.warn("SpyneApp is not initialized yet. Plugin will not be fully registered."),e.register(this)}getProxyReviver(e){return u.get(e)}getPluginConfigByPluginName(e){return i.plugins[e]}get IMG_PATH(){return h}get excludeChannelsFromConsole(){return E}set excludeChannelsFromConsole(e){"string"==typeof e?E.includes(e)||E.push(e):Array.isArray(e)?e.forEach((e=>{"string"!=typeof e||E.includes(e)||E.push(e)})):console.warn("Invalid value provided to excludeChannelsFromConsole. Only strings or arrays are allowed.")}get linksData(){return console.warn("get links data in SpyneAppProperties is deprecated, use navLinks"),p}set linksData(e){console.warn("set links data in SpyneAppProperties is deprecated, use navLinks")}get navLinks(){return p}set navLinks(e){p=e}tempGetChannelsInstance(){}tempGetConfig(){}}},519:(e,t,r)=>{r.d(t,{O:()=>a});var s=r(131);const n=Object.create({}),o=(0,s.compose)(s.not,(0,s.is)(Array)),i=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)]));class a{constructor(){n.foo=()=>console.log("used for testing purposes.")}addMethod(e,t,r=!1){if(!0===Object.prototype.hasOwnProperty.call(n,e)){const t=`Spyne Warning: the method name, ${e}, already exists.`;if(r)return t;console.warn(t)}else n[e]=t}addMethods(e={},t=!1){let r;return!1===i(e)?(r=`Spyne Warning: the pluginMethods property, ${JSON.stringify(e)} needs to be an object.`,t?r:void console.warn(r)):(0,s.keys)(e).map((n=>{const o=(0,s.prop)(n,e);if("function"==typeof o)this.addMethod(n,o,t);else{if(r=`the value for ${n} is not a valid function.`,t)return r;console.warn(r)}})).join(",")}checkIfMethodExists(e){}get pluginMethodsObj(){return n}}},732:(e,t,r)=>{r.d(t,{g:()=>o});var s=r(64),n=r(131);class o{constructor(e,t="",r=!0){return this.parentContext=e,this.omittedMethods=["autoBinder","initAutoBinder","getEnhancerMethods","checkForMalformedMethods","caller","arguments","bindParentViewStream"],this.prefix=t,!0===r&&this.autoBinder(),this.allMethodsList}initAutoBinder(){this.autoBinder()}getEnhancerMethods(){return(0,s.V0)(this,this.omittedMethods)}checkForMalformedMethods(e){if(""===this.prefix)return void console.warn(`SPYNE WARNING: The following SpyneTrait ${this.constructor.name} needs a prefix`);const t=(0,n.reject)((e=>0===e.indexOf(this.prefix)),e);if(t.length>=1){const e=`Spyne Warning: The following method(s) in ${this.constructor.name} require the prefix, "${this.prefix}": [${t.join(", ")}];`;console.warn(e)}}bindParentViewStream(e,t){this.checkForMalformedMethods(e.allMethods);const r={},s=(e,s=!1)=>{const n=!0===s?this.constructor:this;"function"==typeof n[e]&&(r[e]=t[e]=n[e].bind(t))},o=(0,n.curryN)(2,s)(n.__,!0);return(0,n.map)(o,e.staticMethods),(0,n.map)(s,e.methods),r}autoBinder(){const e=this.getEnhancerMethods();return this.allMethodsList=this.bindParentViewStream(e,this.parentContext),this.allMethodsList}}},511:(e,t,r)=>{r.d(t,{Q:()=>o});var s=r(131),n=r(225);class o{constructor(){this.checkIfObjIsNotEmptyOrNil=o.checkIfObjIsNotEmptyOrNil.bind(this)}static checkIfObjIsNotEmptyOrNil(e){const t=(0,s.compose)((0,s.complement)(s.isEmpty),s.head,s.values),r=(0,s.compose)((0,s.complement)(s.isNil),s.head,s.values);return(0,s.allPass)([t,r])(e)}static checkIfParamValueMatchesRegex(e,t){const r=(0,s.reject)((0,s.equals)("routeName")),n=(0,s.compose)(r,s.keys),o=(0,s.compose)((0,s.find)((t=>(0,s.test)(new RegExp(t),e))),n)(t);return(0,s.is)(String,o)&&(t=(0,s.assoc)(e,(0,s.prop)(o,t),t)),t}static formatStrAsWindowLocation(e){return{hash:e,search:e,pathname:e}}static getLocationStrByType(e,t=!1,r=window.location){const n={slash:"pathname",query:"search",hash:"hash"}[!0===t?"hash":e];return(0,s.prop)(n,r).replace(/^(\/)?(#)?(\/)?(.*)$/,"$4")}static createRouteArrayFromParams(e,t,r="slash",n){const o=[],i=t=>{const r={},a=t.routeName;let c=void 0!==e[a]?e[a]:(0,s.prop)(a,n);const d=typeof t[c];"string"===d?c=t[c]:"undefined"===d&&(t=this.checkIfParamValueMatchesRegex(c,t)),r[a]=c,this.checkIfObjIsNotEmptyOrNil(r)&&o.push(r);const l=(0,s.is)(Object,t),E=(0,s.has)(c,t),p=(0,s.has)("routePath",t);if(!0===(E&&l)){const e=t[c];(0,s.has)("routePath",e)&&i(e.routePath)}else!0===p&&void 0!==c&&i(t.routePath)};return i(t),o}static createSlashString(e){const t=(0,s.reject)(s.isNil),r=(0,s.when)((0,s.complement)(s.isNil,s.__),(0,s.join)("/")),n=(0,s.replace)(/^(\^*)(.*|^\$)(\$)$/,"$2");return(0,s.compose)(n,r,t,s.flatten,(0,s.map)(s.values))(e)}static createQueryString(e){const t=(0,s.reject)(s.isNil),r=this.checkIfObjIsNotEmptyOrNil,n=(0,s.compose)((0,s.join)("="),s.flatten,s.toPairs),o=(0,s.ifElse)(r,n,(0,s.always)(void 0)),i=(0,s.map)(o),a=(0,s.when)((0,s.complement)(s.isEmpty),(0,s.concat)("?"));return(0,s.compose)(a,(0,s.join)("&"),t,i)(e)}static checkPayloadForRegexOverrides(e,t,r="Value"){const n=(0,s.compose)((e=>(0,s.prop)(`${e}${r}`,t)),s.head,s.keys);return(0,s.map)((e=>{const t=n(e);return void 0!==t?(0,s.assoc)((0,s.compose)(s.head,s.keys)(e),t,e):e}),e)}static checkForRouteValWithMultipleVals(e){return!0===Array.isArray(e)?e.map((e=>("object"==typeof e&&(e=Object.keys(e).reduce(((t,r)=>(t[r]=(e=>{const t=e.match(/^[^|]*/);return t?"^$"===t[0]?"":t[0]:e})(e[r]),t)),{})),e))):e}static checkForRouteValsPartMatch(e,t={}){return e.map((e=>{const r={...e};return Object.keys(r).forEach((e=>{var s,n;Object.prototype.hasOwnProperty.call(r,e)&&t[e]&&(r[e]=(s=t[e],(n=r[e]).split("|").some((e=>((e,t)=>{const r=e.replace(/[-/\\^$+?.()|[\]{}]/g,"\\$&").replace(/\*/g,"[\\w\\d_-]*");return new RegExp(`^${r}$`).test(t)})(e,s)))?s:n))})),r}))}static convertParamsToRoute(e,t=n.M.config.channels.ROUTE,r,s){const i=void 0!==r?r:t.type,a=t.isHash,c=t.routes.routePath,d=void 0!==s?s:this.getLocationStrByType(i,a),l=this.convertRouteToParams(d,t,i).routeData;let E=this.createRouteArrayFromParams(e,c,i,l);return E=o.checkPayloadForRegexOverrides(E,e),E=o.checkForRouteValWithMultipleVals(E),"query"===i?this.createQueryString(E):this.createSlashString(E)}static findIndexOfMatchedStringOrRegex(e,t){const r=t.includes(".+"),n=(0,s.replace)(/^$/,"^$"),o=(0,s.either)((0,s.propEq)(e,"str"),(0,s.compose)((0,s.test)(s.__,e),(0,s.prop)("re")));return(0,s.compose)((0,s.findLastIndex)((0,s.equals)(!0)),(0,s.map)(o),(0,s.map)((e=>{return{str:e,re:(t=e,r&&(t.startsWith("^")||(t="^"+t),t.endsWith("$")||(t+="$")),new RegExp(t))};var t})),(0,s.map)(n))(t)}static checkIfValueShouldMapToParam(e,t,r){const n=(0,s.compose)((0,s.map)(s.last),(0,s.map)((0,s.filter)((0,s.is)(String))),s.toPairs)(e),i=o.findIndexOfMatchedStringOrRegex(t,n);let a=t;if(i>=0){const t=n[i],r=(0,s.invert)(e),o=(0,s.compose)(s.head,(0,s.defaultTo)([]),(0,s.prop)(t))(r);!0===/^([-$\w]*)$/.test(o)&&!0===(0,s.is)(String,o)&&(a=o)}return a}static createArrFromSlashStr(e){return e.replace(/^([/])?(.*)$/,"$2").split("/")}static convertSlashRouteStrToParamsObj(e,t,r){const n=t,o=this.createArrFromSlashStr(t),i=[],a=[];let c=e;(0,s.reduce)(((e,t)=>{const n=this.checkIfValueShouldMapToParam(c,t,r);c=this.checkIfParamValueMatchesRegex(t,c);const o=(0,s.either)(s.isEmpty,s.isNil);void 0!==c&&(e=>e!==(0,s.last)(i))(c.routeName)&&!1===o(n)&&(i.push(c.routeName),a.push(n));const d=[t,"routePath"],l=(0,s.path)(d,c),E=(0,s.path)(["routePath"],c);void 0!==l?c=l:void 0!==E&&(c=E)}),0,o);const d=(0,s.zipObj)(i,a),l=this.getLastArrVal(i);return{paths:i,pathInnermost:l,routeData:d,routeValue:n}}static getLastArrVal(e){return t=e,void 0!==(0,s.last)(t)?(0,s.last)(t):"";var t}static createDefaultParamFromEmptyStr(e,t){const r={};return r[e.routeName]=this.checkIfValueShouldMapToParam(e,t),r}static convertQueryStrToParams(e,t,r){const n=t,o=t.replace(/^([?])?(.*)$/,"$2"),i=(0,s.compose)((0,s.map)((0,s.split)("=")),(0,s.split)("&"))(o);let a=(0,s.fromPairs)(i),c=(0,s.map)(s.head,i);return!0===(0,s.isEmpty)(t)&&(a=this.createDefaultParamFromEmptyStr(e,t,r),c=(0,s.keys)(a)),{paths:c,pathInnermost:this.getLastArrVal(c),routeData:a,routeValue:n}}static convertRouteToParams(e,t,r){if(void 0===t)return{};const n=void 0!==r?r:t.type,o=(0,s.defaultTo)({},(0,s.prop)("regexTokens",t)),i=t.routes.routePath;return"query"===n?this.convertQueryStrToParams(i,e):(e=e.replace(/\/$|$/,"/"),this.convertSlashRouteStrToParamsObj(i,e,o))}}},167:(e,t,r)=>{r.d(t,{H:()=>i});var s=r(968),n=r(131),o=r(511);class i{constructor(){this.createPopStateStream=i.createPopStateStream.bind(this)}static createPopStateStream(e){(0,s.fromEventPattern)((function(e){window.onpopstate=e}),(function(){window.onpopstate=function(){}})).subscribe(e)}static getLastArrVal(e){return t=e,void 0!==(0,n.last)(t)?(0,n.last)(t):"";var t}static compareRouteKeywords(e={},t){const r=(e,t)=>void 0!==t?(0,n.pick)(t,e):e;let s=r(e,t);return{pickValues:r,compare:(e={},t)=>{const o=r(e,t),i=e=>(0,n.compose)(n.keys,(0,n.filter)((0,n.propEq)(!0,e))),a=(0,n.compose)((0,n.map)((e=>{const t=(0,n.prop)(e,s),r=(0,n.prop)(e,o),i=(0,n.equals)(t,r),a=void 0!==t,c=void 0!==r,d=!i,l=!1===a&&!0===c,E=!0===a&&!1===c,p={};return p[e]={same:i,changed:d,added:l,removed:E,previousExists:a,nextExists:c},p})),n.uniq,(0,n.chain)(n.keys))([s,o]),c=(0,n.chain)(i("changed"),a),d=(0,n.chain)(i("added"),a),l=(0,n.chain)(i("removed"),a);return s=o,{pathsAdded:d,pathsRemoved:l,pathsChanged:c}},getComparer:()=>s}}static getRouteArrData(e,t){const r=(0,n.filter)((0,n.includes)(n.__,e),t);return{paths:r,pathInnermost:i.getLastArrVal(r)}}static flattenConfigObject(e){const t=e=>(0,n.chain)((([e,r])=>"object"!=typeof r||null===r||Array.isArray(r)?[[e,r]]:(0,n.map)((([t,r])=>[`${e}.${t}`,r]),t(r))),(0,n.toPairs)(e));return(0,n.values)((0,n.fromPairs)(t(e)))}static addRouteDatasets(e){const{type:t,isHash:r}=e,s=s=>("query"===t?"":!0===r?"#":"/")+o.Q.convertParamsToRoute(s,e).replace(/^(.*\/)([\w-]*\/?)(.*)$/gm,"$1$2"),i=/^([A-Za-z0-9_-])+$/m,a=(e=[],t,r={})=>{let{routeName:o}=t;return(0,n.toPairs)(t).reduce(((t,c)=>{const[d,l]=c,E=(0,n.is)(Object,l),p=e=>(0,n.test)(i,e)?(e=>String(e).replace(/([-_])/g," ").toUpperCase())(e):d;if("routeName"===d||"404"===d)return t;o=o||(0,n.prop)("routeName",l);let h=(0,n.clone)(r);if(h[o]=String(d).replace(/([^A-Za-z0-9-_])/g,""),!0===E){if(1===(0,n.keys)(h).length){const e=(0,n.path)(["routePath","routeName"],l);if(e){const o=(0,n.clone)(h);o[e]="",o.navLevel=(0,n.keys)(r).length,o.title=p(d),o.href=s(o),t.push(o)}}h=a(e,l,h)}else h.title=p(d),h.href=s(h);return h.navLevel=(0,n.keys)(r).length,t.push(h),t}),[])},c=a([],e.routes),d=(0,n.flatten)(c);return{routeDatasetsArr:d,routeNamesArr:(e=>{const t=(0,n.reject)((0,n.includes)(n.__,["title","href","navLevel"]));return(0,n.compose)(n.uniq,t,n.flatten,(0,n.map)(n.keys))(e)})(d)}}static conformRouteObject(e={},t=!1){const r=(0,n.path)(["channels","ROUTE"],e);let{add404s:s}=void 0!==r?r:e;s=s||t;const o=e=>{const t=e[1],r=(0,n.is)(Array,t);return""===t?e[1]="^$":r&&(e[1]=t.join("|")),e},a=(0,n.compose)(n.fromPairs,(0,n.map)((e=>{const[t,r]=e,i=s?{404:".+"}:{},c=(0,n.is)(Object,r),d=(0,n.is)(Array,r),l="routePath"===t;return!0===c&&!1===d&&(e[1]=a(e[1]),l&&(e[1]=(0,n.compose)((0,n.mergeDeepRight)(i),n.fromPairs,(0,n.map)(o),n.toPairs)(e[1]))),e})),n.toPairs);if(void 0!==r){e.channels.ROUTE=a(e.channels.ROUTE);const t=i.addRouteDatasets(e.channels.ROUTE);return e.channels.ROUTE=(0,n.mergeRight)(e.channels.ROUTE,t),e}return a(e)}static getLocationData(){return(0,n.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}}},432:(e,t,r)=>{r.d(t,{Y:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(){this.createDomObservableFromEvent=i.createDomObservableFromEvent.bind(this)}static createDomObservableFromEvent(e,t,r=!0,o=window){return t=void 0===t?e=>e:t,(0,s.fromEventPattern)((t=>o.addEventListener(e,t,{passive:r})),(()=>{o[e]=e=>e})).pipe((0,n.map)(t))}static createMediaQuery(e){const t=window.matchMedia(e);return this.checkIfValidMediaQuery(t,e),!1!==t&&t}static checkIfValidMediaQuery(e,t){const r=e=>e.replace(/\s+/gm,""),s=void 0!==e.matches&&r(e.media).indexOf(r(t))>=0;return!1===s&&(t=>{console.warn(`Spyne Info: the following query string, "${t}", has been optimized to "${e.media}" by the browser and may not be a valid Media Query item!`)})(t),s}static createMediaQueryHandler(e,t){const r=(e=>t=>(t.mediaQueryName=e,t))(t),o=(i=e,{addHandler:e=>{i.addListener(e)},removeHandler:e=>{i.onchange=()=>{}}});var i;return new s.fromEventPattern(o.addHandler,o.removeHandler).pipe((0,n.map)(r))}static createMergedObsFromObj(e){const t=e.mediaQueries||e.mediaQueries,r=[];return(0,o.mapObjIndexed)(((e,t,s)=>{const n=i.createMediaQuery(e);return!1!==n&&r.push(i.createMediaQueryHandler(n,t)),r}),t),r}}},393:(e,t,r)=>{r.d(t,{W:()=>n,d:()=>o});const s=(e=!1,t=1,r="ease",s=!1)=>`${!0===s?"opacity:0;":""}transition: opacity ${t}s ${r}; opacity: ${!0===e?1:0};`;function n(e,t){const r=1*window.getComputedStyle(e).opacity,n=s(!0,t,"ease",1===r);e.style.cssText+=n}function o(e,t,r){const n=s(!1,t,"ease");e.style.cssText+=n,e.addEventListener("transitionend",r,!1)}},518:(e,t,r)=>{r.d(t,{j:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(e){this.props.observableStreams=i.createDirectionalObservables()}static createDirectionalFiltersObject(){const e="internal",t="parent",r="child";return{P:[t],C:[r],PCI:[t,e,r],CI:[r,e],PI:[t,e],PC:[t,r]}}static addDefaultDir(e){return(0,o.flip)(o.mergeRight)({$dir:["internal"]},(0,o.clone)(e))}static addDownInternalDir(e,t=["internal","down"]){return(0,o.flip)(o.mergeRight)((0,o.clone)(e),{$dir:t})}static addChildAndInternalDir(e,t=["child","down"]){return(0,o.flip)(o.mergeRight)((0,o.clone)(e),{$dir:t})}static mapToDefaultDir(e){return this.addDefaultDir(e)}static createDirectionalObservables(e=new s.Subject,t,r){void 0!==t&&void 0!==r&&(e.viewName=t,e.vsid=r);const i=e=>(0,o.propSatisfies)((t=>t.includes(e)),"$dir"),a=i("parent"),c=i("child"),d=i("internal"),l=e=>(0,o.mergeRight)({from$:e}),E=l("child"),p=l("internal"),h=l("parent"),N=e.pipe((0,n.filter)((e=>void 0!==e&&void 0!==e.action))),u=e.pipe((0,n.filter)(d),(0,n.map)(p)),_=e.pipe((0,n.filter)(a),(0,n.map)(E)),m=e.pipe((0,n.filter)(c),(0,n.map)(h)),T={parent:_,internal:u,child:m};return{raw$:N,toInternal$:u,toParent$:_,toChild$:m,completeAll:()=>{(0,o.forEach)((e=>{e.complete(),e.isStopped=!0}),[N,u,_,m])},completeStream:(e=[])=>{void 0!==e&&e.length>=1&&e.forEach((e=>{var t;void 0!==T[e]&&((t=T[e]).complete(),t.isStopped=!0)}))}}}}},291:(e,t,r)=>{r.d(t,{X:()=>i});var s=r(131),n=r(49),o=r(225);class i{constructor(e,t={},r={}){this.template=this.formatTemplate(e),this.isProxyData=!0===t.__cms__isProxy,this.testMode=r?.testMode,(()=>{!0===(0,s.is)(Array,t)&&(t={spyneData:t},this.template=this.template.replace("{{/}}","{{/spyneData}}"),this.template=this.template.replace("{{#}}","{{#spyneData}}"))})(),this.templateData=t;const n=i.getStringArray(this.template);let o=this.template.match(i.findTmplLoopsRE());o=null===o?[]:o;const a=i.parseTmplLoopsRE(),c=this.parseTheTmplLoop.bind(this),d=(0,s.includes)(s.__,o),l=(0,s.ifElse)(d,((e,t)=>e.replace(a,c)),this.addParams.bind(this));this.finalArr=n.map(l)}static isPrimitiveTag(e){return/({{\.\*?}})/.test(e)}static getNestedDataReducer(e={},t=""){return/(\.)/gm.test(String(t))?String(t).split(".").reduce(((e,t)=>e[t]?e[t]:"string"==typeof e?e:""),e):e[t]??""}static getStringArray(e){const t=e.split(i.findTmplLoopsRE()),r=/^([\\n\s\W]+)$/;return(0,s.reject)((e=>e.match(r)),t)}static findTmplLoopsRE(){return/({{#[\w.]+}}[\w\n\s\W]+?{{\/[\w.]+}})/gm}static parseTmplLoopsRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static swapParamsForTagsRE(){return/({{)(.*?)(}})/gm}removeThis(){void 0!==this&&(this.finalArr=void 0,this.templateData=void 0,this.template=void 0)}renderDocFrag(){let e=i.replaceImgPath(this.finalArr.join(""));!0!==this.testMode&&(e=(0,n.A)(e));const t=/^([^>]*?)(<){1}(\b)(thead|col|colgroup|tbody|td|tfoot|tr|th)(\b)([^\0]*)$/.test(e)?e:document.createRange().createContextualFragment(e);return window.setTimeout(this.removeThis,2),t}renderToString(){let e=this.finalArr.join("");return e=i.replaceImgPath(e),window.setTimeout(this.removeThis,2),e}getTemplateString(){return this.finalArr.join("")}formatTemplate(e){return!0===["SCRIPT","TEMPLATE"].includes((0,s.prop)("nodeName",e))?e.innerHTML:e}getDataValFromPathStr(e,t){const r=String(e).split(".");return(0,s.path)(r,t)||""}addParams(e){return e.replace(i.swapParamsForTagsRE(),((e,t,r,s)=>i.getNestedDataReducer(this.templateData,r)))}static replaceImgPath(e){const{IMG_PATH:t}=o.M;return void 0!==t?(e=e.replaceAll(/src\s*=\s*(['"])imgs\//g,`src=$1${t}`)).replaceAll(/url\(\s*(['"]?)imgs\//g,`url($1${t}`):e}parseTheTmplLoop(e,t,r,n){const o=/(\.)/gm,a=n;let c=i.getNestedDataReducer(this.templateData,r);const d=(e,t,r)=>i.isPrimitiveTag(t)?l(e,t,r):E((()=>{const t=e,s=r,n=r+1;return this.isProxyData?{spyneLoopKey:t,__cms__dataId:c.__cms__dataId,origKey:c[`__cms__keyFor_${e}`],loopIndex:s,loopNum:n,d:e}:{spyneLoopKey:t,loopIndex:s,loopNum:n}})(),t,r),l=(e,t,r,s)=>t.replace(i.swapParamsForTagsRE(),e),E=(e,t,r)=>t.replace(i.swapParamsForTagsRE(),((t,s,n)=>{const i={loopIndex:r,loopNum:r+1};if(!1===o.test(n)&&void 0!==e[n])return void 0!==i[n]?i[n]:e[n];const a=this.getDataValFromPathStr(n,e);return void 0!==i[n]?i[n]:a}));return!0===(0,s.isNil)(c)||(0,s.isEmpty)(c)?"":(void 0===c.length&&(c=[c]),c=Array.isArray(c)?c:[c],c.map(((e,t)=>"string"==typeof e?d(e,a,t):E(e,a,t))).join(""))}}},192:(e,t,r)=>{r.d(t,{r:()=>a});var s=r(445),n=r(291),o=r(907),i=r(131);class a{constructor(e={},t=!1){var r;e.tagName=(r=e.tagName,(0,i.defaultTo)("div")(r)),e.attributes=void 0!==e.attributes?e.attributes:this.getDomAttributes(e),e.attrs=this.updateAttrs(e.attributes),e.fragment=document.createDocumentFragment(),this.testMode=t,this.props=e,this.addMixins()}setProp(e,t){this.props[e]=t}getProp(e){return this.props[e]}get el(){return this.props.el}setElAttrs(e,t){return this.getProp("attrs").forEach(((t,r)=>{"dataset"===r?(0,i.forEachObjIndexed)(((t,r)=>{e.dataset[r]=t}),t):e.setAttribute(r,t)})),e}updateAttrs(e,t){const r=void 0!==t?t:new Map;return(0,i.mapObjIndexed)(((e,t)=>r.set(t,e)),e),r}addTemplate(e){const t=this.getProp("template");return void 0!==t?(t=>{let r=this.getProp("data");r=(0,i.is)(Object,r)?r:{};const s=new n.X(t,r,{testMode:this?.testMode}).renderDocFrag();return(0,i.is)(String,s)?e.innerHTML=s:e.appendChild(s),e})(t):e}createElement(e="div"){return document.createElement(e)}addContent(e){const t=this.getProp("data");if(!0===(0,i.is)(String,t)){const r=document.createTextNode(t);e.appendChild(r)}return e}execute(){const e=(0,i.pipe)(this.createElement.bind(this),this.setElAttrs.bind(this),this.addTemplate.bind(this),this.addContent.bind(this))(this.getProp("tagName"));this.props.el=e}render(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el")}renderToHTMLString(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el").outerHTML}returnIfDefined(e,t){if(void 0!==t){const r=void 0===t;e[t]=!1===r?t:(0,o.$)(e[t],t)}}updateprops(e){return this.returnIfDefined(this.props,e),this}updatepropsAndRun(e){return this.updateprops(e),this.execute(),this.getProp("fragment")}unmount(){void 0!==this.props&&(this.getProp("el").remove(),this.props=void 0,this.gc())}updateTag(e="div"){this.updateprops(e)}updateAttributes(e={}){this.updateprops(e)}updateTemplate(e){this.updateprops(e)}updateData(e={}){this.updateprops(e)}addTagAndRender(e="div"){this.updatepropsAndRun(e)}addAttrsibutesAndRender(e={}){this.updatepropsAndRun(e)}addTemplateAndRender(e){this.updatepropsAndRun(e)}addDataAndRender(e={}){this.updatepropsAndRun(e)}addMixins(){const e=(0,s.z)();this.gc=e.gc.bind(this)}getDomAttributes(e){return(0,i.pick)(this.attributesArray,e)}get attributesArray(){return["accept","accept-charset","accesskey","action","align","allow","alt","async","autocapitalize","autocomplete","autofocus","autoplay","bgcolor","border","buffered","challenge","charset","checked","cite","class","code","codebase","color","cols","colspan","content","contenteditable","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","defer","dir","dirname","disabled","download","draggable","dropzone","enctype","for","form","formaction","headers","height","hidden","high","href","hreflang","http-equiv","icon","id","importance","integrity","ismap","itemprop","keytype","kind","label","lang","language","lazyload","list","loop","low","manifest","max","maxlength","minlength","media","method","min","multiple","muted","name","novalidate","open","optimum","pattern","ping","placeholder","poster","preload","radiogroup","readonly","referrerpolicy","rel","required","reversed","rows","rowspan","sandbox","scope","scoped","selected","shape","size","sizes","slot","span","spellcheck","src","srcdoc","srclang","srcset","start","step","style","summary","tabindex","target","title","translate","type","usemap","value","width","wrap"]}}},992:(e,t,r)=>{r.d(t,{e:()=>l});var s=r(643),n=r(64),o=r(225),i=r(968),a=r(531),c=r(131);const d=!0===o.M.debug;class l{constructor(e,t){this.addMixins(),this.props=e,this.broadcastFn=t,this.broadcaster(this.broadcastFn)}addDblClickEvt(e){return(0,i.fromEvent)(e,"dblclick").pipe((0,a.map)((e=>{const t=(0,c.clone)(e);return t.typeOverRide="dblclick",t})))}broadcast(e){if(e.length<=0&&!0===d)return void console.warn(`Spyne Warning: The nested array in ${this.props.name}.broadcastEvents appears to be empty --\x3e vsid:${this.props.vsid}!`);const t={UI:this.sendUIPayload,ROUTE:this.sendRoutePayload},[r,s,o]=e;let a,l=this.props.el.querySelectorAll(r);if(l.length<=0){const e=this.props.el,t=t=>{t===e&&(l=[t])};(()=>{const s=(null!==e.parentElement?e.parentElement:document).querySelectorAll(r);s.forEach=Array.prototype.forEach,s.forEach(t)})()}const E=void 0!==o;!0==(void 0===l||l.length<=0)&&!0===d?console.warn(`Spyne Warning: The item ${r}, does not appear to exist in ${this.props.name} --\x3e vsid:${this.props.vsid}!`):(l.forEach=Array.prototype.forEach,l.forEach((e=>{const r="dblClick"!==s?(0,i.fromEvent)(e,s,{preventDefault:()=>!0}):this.addDblClickEvt(e);a=e.dataset.channel;const o={};var d;o.payload=(0,n.Lx)(e.dataset),o.payload=(0,c.omit)(["channel"],o.payload),o.channel=a,o.srcElement={},o.srcElement.id=this.props.id,o.srcElement.vsid=this.props.vsid,o.srcElement.isLocalEvent=E,o.srcElement.srcEvent=s,o.srcElement.el=e,(0,t[(d=a,"ROUTE"===d||"CHANNEL_ROUTE"===d?"ROUTE":("UI"!==d&&"CHANNEL_UI"!==d&&void 0!==d&&console.warn(`SpyneJS warning: The channel, ${d}, is not allowed here, only "UI" or "ROUTE" are valid channels, defaulting to CHANNEL_UI`),"UI"))])(r,o)})))}broadcaster(e){e().forEach((e=>this.broadcast(e)))}addMixins(){const e=(0,s.N)();this.sendUIPayload=e.sendUIPayload,this.sendRoutePayload=e.sendRoutePayload}}},300:(e,t,r)=>{r.d(t,{q:()=>d});var s=r(192),n=r(393),o=r(518),i=r(907),a=r(968),c=r(131);class d{constructor(e,t={},r="",s="theName"){this.addMixins(),this._state="INIT",this.vsid=r,this.el=t.el,this.vsName=s,this.defaults={debug:!1,extendedHashMethods:{}},this.options=(0,i.$)(this.defaults,t),this.addActionListeners().forEach((e=>{const[t,r]=e;this.options.extendedHashMethods[t]=e=>this[r](e)})),this.options.hashMethods=this.setHashMethods(this.options.extendedHashMethods),this.sink$=e,this.sink$.subscribe(this.onObsSinkSubscribe.bind(this)),this.$dirs=o.j.createDirectionalFiltersObject(),this.addDefaultDir=o.j.addDefaultDir,this.sourceStreams=o.j.createDirectionalObservables(new a.Subject,this.vsName,this.vsid),this._source$=this.sourceStreams.toInternal$}addActionListeners(){return[]}setHashMethods(e={}){const t={VS_DETRITUS_COLLECT:e=>this.onGarbageCollect(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyForGC(e),EXTIRPATE:e=>this.onDispose(e),VS_SPAWN:e=>this.onRender(e),VS_SPAWN_AND_ATTACH_TO_PARENT:e=>this.onRenderAndAttachToParent(e),VS_SPAWN_AND_ATTACH_TO_DOM:e=>this.onRenderAndAttachToDom(e),ATTACH_CHILD_TO_SELF:e=>this.onAttachChildToSelf(e)};return(0,i.$)(t,e)}createDomItem(){this.props=void 0!==this.props?this.props:{};const e=(0,c.filter)((e=>void 0!==e),(0,c.pick)(["id","className"],this.props)),{tagName:t,data:r,template:n}=this.props;return new s.r(t,e,r,n)}onDisposeCompleted(e){}animateInTween(e,t){(0,n.W)(e,t)}animateOutTween(e,t,r){(0,n.d)(e,t,r)}setAnimateIn(e){if(!0===e.animateIn){const t=void 0!==e.el?e.el:this.domItem.el;this.animateInTween(t,e.animateInTime)}}disposeMethod(e){const t=void 0!==e.el.el?e.el.el:e.el,r={action:"READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.PI,el:t},s=(0,a.bindCallback)(((e,r)=>{this.animateOutTween(t,e.animateOutTime,r)})),n=e=>{this._source$.next(r)},o=!0===e.animateOut?e=>(s(e).subscribe(n),{action:"EXTIRPATING",$dir:this.$dirs.CI}):()=>({action:"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.CI});return o(e)}onDispose(e){return this.disposeMethod(e)}removeStream(){void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["internal","child"])}onReadyForGC(e){this.removeStream()}onGarbageCollect(e){void 0!==this.domItem&&this.domItem.unmount(),void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["parent"])}getSourceStream(){return this._source$}combineDomItems(e){if(void 0!==this.el)return;const t=(0,c.isNil)(e.query)?e.node:e.query;({appendChild:(e,t)=>e.appendChild(t),after:(e,t)=>e.after(t)}[e.attachType]||((e,t)=>e.insertBefore(t,e.firstChild)))(t,this.domItem.render()),this.setAnimateIn(e)}onAttachChildToSelf(e){const t=e.childRenderData;return this.combineDomItems(t),{action:"CHILD_ATTACHED",$dir:this.$dirs.PI}}onRenderAndAttachToParent(e){return this.onRender(e),this.combineDomItems(e),{action:"VS_SPAWNED_AND_ATTACHED_TO_PARENT",el:this.el||this.domItem.el,$dir:this.$dirs.PI}}renderDomItem(e){const[t,r,n,o]=e;return this.domItem=new s.r({tagName:t,attributes:r,data:n,template:o}),this.domItem}onRender(e){return{action:"VS_SPAWNED",el:this.el||(e=>this.renderDomItem(e))((0,c.props)(["tagName","domAttributes","data","template"],e)),$dir:this.$dirs.I}}extendedMethods(e){}onRenderAndAttachToDom(e){return e.attachData.el=(e=>this.renderDomItem(e))((0,c.props)(["tagName","domAttributes","data","template"],e)),this.combineDomItems(e.attachData),{action:"VS_SPAWNED_AND_ATTACHED_TO_DOM",el:this.el||e.attachData.el.el,$dir:this.$dirs.CI}}onObsSinkSubscribe(e){const t=e.action,r=(0,c.defaultTo)((e=>this.extendedMethods(e))),s=r(this.options.hashMethods[t])(e);void 0!==s&&(e=>{this._source$.next(e)})(Object.freeze(s))}addMixins(){}}},54:(e,t,r)=>{r.d(t,{u:()=>a});var s=r(225),n=r(961),o=r(158),i=r(131);class a{constructor(e,t,r,s="subscribe",n=!1){const o={name:e,observable:t,data:r,action:s};this.sendToDirectorStream(o)}sendToDirectorStream(e){const t=s.M.channelsMap.getStream("DISPATCHER"),r=(0,n.l)(e);t.next(r),e=void 0}static deepClone(e){const t=(0,i.is)(Array),r=(0,i.is)(Object);var s;return!1===t(s=e)&&!0===r(s)?(0,i.compose)(i.fromPairs,i.toPairs,i.clone)(e):(0,i.clone)(e)}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}addMixins(){this.gc=o.gc}}},707:(e,t,r)=>{r.d(t,{T:()=>l});var s=r(131),n=r(225);function o(){return!0===n.M.debug}function i(e,t,r=!1){const n=c(e,t,r);return 1===n.length?(0,s.head)(n):n}function a(e,t,r){const n=document.querySelector(e),i=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));if(null===n||!1!==i(n)){if(void 0!==t&&String(t).trim().length>0){function a(e){try{return document.querySelectorAll(e).length>0}catch(e){return!1}}const c=a(t);!0===r&&!0===o()&&!1===c&&console.warn(`Spyne Warning: the selector, ${t} does not exist in this el, ${e}`)}}else console.warn(`Spyne Warning: the el object is not a valid single element, ${n}`)}function c(e,t,r=!1){let s=!1;const n=(r=>{let n=[];try{n=document.querySelectorAll(r)}catch(e){n=[]}try{s=document.querySelector(t)===document.querySelector(e),!0===s&&(n=[document.querySelector(t)])}catch(e){}return n})(void 0!==t?`${e} ${t}`:e);return!0===r&&a(!0===s?"body":e,t,r),n}function d(e,t,r){return c(t,r).forEach((t=>{t.style.cssText=e})),this}function l(e,t){function r(t){return l(e,t)}return a(e="string"==typeof e?e:function(e){let t=`${Math.random().toString(36).replace(/\d/gm,"").substring(1,8)}`;return void 0===e.dataset.vsid?e.dataset.vsid=t:t=e.dataset.vsid,`[data-vsid='${t}']`}(e),t,!1),r.map=r=>Array.from(c(e,t)).map(r),r.forEach=r=>Array.from(c(e,t)).map(r),r.getNodeListArray=()=>c(e,t),r.addClass=r=>(c(e,t).forEach((e=>e.classList.add(r))),this),r.removeClass=r=>(c(e,t).forEach((e=>{e.classList.remove(r)})),this),r.setClass=r=>(c(e,t).forEach((e=>{const t=(0,s.compose)((0,s.reject)(s.isEmpty),(0,s.split)(" "))(e.className),n=r.split(" ");t.forEach((t=>e.classList.remove(t))),n.forEach((t=>e.classList.add(t)))})),this),r.unmount=()=>{},r.toggleClass=(r,s)=>(c(e,t).forEach((e=>{(s=void 0!==s?s:!e.classList.contains(r))?e.classList.add(r):e.classList.remove(r)})),this),r.toggle=(e,t)=>(r.toggleClass(e,t),this),r.appendChild=e=>(0!==r.el.length?r.el.appendChild(e):console.warn(`Spyne Warning: The selector, ${t} does not appear to be valid!`),r.el),r.addAnimClass=r=>{requestAnimationFrame((()=>{c(e,t).forEach((e=>{try{e.classList.add(r)}catch(e){}}))}))},r.setActiveItem=(r,n)=>{const a=c(e,t),d="string"==typeof n?i(e,n):n;var l;return!0===(l=d,(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(l))?a.forEach((e=>e.isEqualNode(d)?e.classList.add(r):e.classList.remove(r))):!0===o()&&console.warn(`Spyne Warning: The selector, ${n}, does not appear to be a valid item in setActiveItem: ${r}`),this},Object.defineProperty(r,"el",{get:()=>i(e,t,!0)}),Object.defineProperty(r,"els",{get:()=>c(e,t)}),Object.defineProperty(r,"len",{get:()=>c(e,t,!1).length}),Object.defineProperty(r,"exists",{get:()=>c(e,t,!1).length>=1}),Object.defineProperty(r,"exist",{get:()=>c(e,t,!1).length>=1}),Object.defineProperty(r,"nodeList",{get:()=>c(e,t)}),Object.defineProperty(r,"arr",{get:()=>{const r=i(e,t,!0);return void 0===r?[]:void 0===r.length?[r]:Array.from(r)}}),Object.defineProperty(r,"inline",{set:r=>d(r,e,t),get:()=>r}),Object.defineProperty(r,"inlineCss",{set:r=>d(r,e,t),get:()=>r}),r}},173:(e,t,r)=>{r.d(t,{A:()=>T});var s=r(445),n=r(225),o=r(907),i=r(961),a=r(64),c=r(300),d=r(584),l=r(992),E=r(54),p=r(589),h=r(518),N=r(707),u=r(968),_=r(531),m=r(131);class T{constructor(e={}){this.vsnum=Math.random(),this.addMixins(),this._postRenderCalled=!1,this.defaults=()=>{const t=this.createId(),r=e.id?e.id:t;return{vsid:t,id:r,tagName:"div",el:void 0,data:void 0,animateIn:!1,animateInTime:.5,animateOut:!1,animateOutTime:.5,sendLifecyleEvents:!1,hashId:`#${r}`,id$:`#${r}`,viewClass:c.q,extendedSourcesHashMethods:{},debug:!1,template:void 0,node:document.createDocumentFragment(),name:(0,a.OZ)(this)}},this._state={},this.$dirs=h.j.createDirectionalFiltersObject(),this.addDefaultDirection=h.j.addDefaultDir,this.addDownInternalDir=h.j.addDownInternalDir,this.props=(0,o.$)(this.defaults(),e),this.sendLifecycleMethod=!0===this.props.sendLifecyleEvents?this.sendLifecycleMethodActive.bind(this):this.sendLifecycleMethodInactive.bind(this);const t=this.attributesArray;this.props.domAttributes=(0,m.pick)(t,this.props),void 0!==this.props.traits&&this.addTraits(this.props.traits),this.loadAllMethods(),this.props.action="LOADED",this.sink$=new u.Subject,this.props.elIsAlreadyRenderedBool=this.elAlreadyExistsFn(this.props);const r=this.props.viewClass;this.view=new r(this.sink$,{el:this.props.el},this.props.vsid,this.props.id),this.sourceStreams=this.view.sourceStreams,this._rawSource$=this.view.getSourceStream(),this._rawSource$.viewName=this.props.name,this.sendEventsDownStream=this.sendEventsDownStreamFn,this.initViewStream(),this.isDevMode=T.isDevMode(),this.props.addedChannels=[],this.checkIfElementAlreadyExists()}get source$(){return this._source$}get attributesArray(){return["accesskey","class","contenteditable","dir","draggable","hidden","id","lang","spellcheck","style","tabindex","title","translate","aria-autocomplete","aria-checked","aria-disabled","aria-expanded","aria-haspopup","aria-hidden","aria-invalid","aria-label","aria-level","aria-multiline","aria-multiselectable","aria-orientation","aria-pressed","aria-readonly","aria-required","aria-selected","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","aria-atomic","aria-busy","aria-live","aria-relevant","aria-dropeffect","aria-grabbed","aria-activedescendant","aria-controls","aria-describedby","aria-flowto","aria-labelledby","aria-owns","aria-posinset","aria-setsize","accept","autocomplete","autofocus","checked","dirname","disabled","form","formaction","formenctype","formmethod","formnovalidate","formtarget","list","max","maxlength","min","minlength","multiple","name","pattern","placeholder","readonly","required","size","step","value","alt","srcset","sizes","usemap","ismap","href","target","download","ping","rel","hreflang","as","media","accept-charset","action","enctype","novalidate","content","charset","http-equiv","async","defer","integrity","nomodule","nonce","referrerpolicy","autocapitalize","autoplay","buffered","challenge","cite","code","codebase","color","cols","colspan","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","for","headers","high","icon","importance","itemprop","keytype","kind","label","language","lazyload","loop","low","manifest","method","muted","open","optimum","poster","preload","radiogroup","reversed","role","rows","rowspan","sandbox","scope","scoped","selected","shape","slot","span","srcdoc","src","type","srclang","start","summary","wrap","width","height"]}static isDevMode(){return n.M.debug}static checkIfActionsAreRegistered(e=[],t){if(t.length>0){const r=t=>{const r=new RegExp(t);if((0,m.findIndex)((0,m.test)(r),s)<0){const r=1===e.length?"from added channel":"from added channels";console.warn(`Spyne Warning: The action, ${t}, in ${this.props.name}, does not match any of the registered actions ${r}, ${e.join(", ")}`)}},s=(e=>{const t=e.map((e=>n.M.getChannelActions(e)));return(0,m.flatten)(t)})(e);t.forEach(r)}}static isValidNestedArr(e){const t=(0,m.equals)(!0),r=(0,m.all)(t),s=(0,m.is)(String),n=(0,m.compose)(r,(0,m.map)(s),(0,m.slice)(0,2),(0,m.defaultTo)([]));return(0,m.compose)(r,(0,m.map)(n),(0,m.defaultTo)([]))(e)}static elIsDomElement(e){return(0,m.is)(String,e)&&(e=document.querySelector(e)),(0,m.compose)((0,m.lte)(0),(0,m.defaultTo)(-1),(0,m.prop)("nodeType"))(e)}updatePropsToMatchEl(){const e=(0,m.compose)(m.toLower,(0,m.either)((0,m.prop)("tagName"),(0,m.always)("")));this.props.tagName=e(this.props.el)}elAlreadyExistsFn(e){const t=(0,m.compose)((0,m.lte)(0),(0,m.defaultTo)(-1),(0,m.prop)("nodeType"));return(0,m.propSatisfies)((0,m.allPass)([e=>document.body.contains(e),t]),"el")(e)}checkIfElementAlreadyExists(){!0===this.props.elIsAlreadyRenderedBool?(this.updatePropsToMatchEl(),this.postRender()):null===this.props.el&&console.error(`Spyne Error: The defined element for this ViewStream instance, ${this.constructor.name}, appears to not exist.`)}loadAllMethods(){const e=(0,m.curry)(this.onChannelMethodCall.bind(this));this.addActionListeners().forEach((t=>{let[r,s,n]=t;(0,m.is)(String,n)&&(n=new p.C({selector:n})),this.props.extendedSourcesHashMethods[r]=e(s,n)})),this.props.hashSourceMethods=this.setSourceHashMethods(this.props.extendedSourcesHashMethods)}addActionListeners(){return[]}onChannelMethodCall(e,t,r){if(void 0!==r.$dir&&r.$dir.includes("child")&&!0!==this.deleted){const e=(0,o.$)({},r);e.$dir=this.$dirs.C,this.sourceStreams.raw$.next(e)}!0===(0,m.defaultTo)((0,m.always)(!0),t)(r)&&(t=>{void 0===this[e]?console.warn(`Spyne Warning: The method, ${e} does not appear to exist in ${this.constructor.name}!`):this[e](t)})(r=(0,m.omit)(["$dir"],r))}setSourceHashMethods(e={}){const t={EXTIRPATING:e=>this.checkParentDispose(e),EXTIRPATE:e=>this.disposeViewStream(e),VS_SPAWNED:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_DOM:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_PARENT:e=>this.onVSRendered(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyToGC(e),VS_NULLITY:()=>({})};return o.$.all([{},t,e])}initViewStream(){this._source$=this._rawSource$.pipe((0,_.map)((e=>this.onMapViewSource(e))),(0,_.takeWhile)(this.notGCSTATE)),this.initAutoMergeSourceStreams(),this.updateSourceSubscription(this._source$,!0)}notGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}eqGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}notCOMPLETED(e){return!e.action.includes("COMPLETED")}notGCCOMPLETE(e){return!e.action.includes("GC_COMPLETE")}testVal(e){console.log("TESTING VALL IS ",e)}addParentStream(e,t){this.parent$=e.pipe((0,_.filter)((e=>void 0!==e&&void 0!==e.action)),(0,_.map)((e=>{const t=(0,o.$)({},e);return"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT"===t.action&&(this.disposeViewStream(t),t.action="READY_FOR_VS_DETRITUS_COLLECT"),t}))),this.updateSourceSubscription(this.parent$,!1,"PARENT"),this.renderAndAttachToParent(t)}addChildStream(e){const t=e.pipe((0,_.filter)((e=>void 0!==e&&void 0!==e.action)),(0,_.tap)((e=>this.tracer("addChildStraem do ",e))),(0,_.map)((e=>e)),(0,_.finalize)((e=>this.onChildCompleted(t.source))));this.updateSourceSubscription(t,!0,"CHILD")}onChildDisposed(e){}onChildCompleted(e){const t=(e=>{const t=e=>{for(;void 0!==e.destination;)e=t(e.destination);return e};return(0,m.pick)(["id","vsid"],t(e))})(e);return this.tracer("onChildCompleted ",this.vsnum,e),this.onChildDisposed(t,e),t}initAutoMergeSourceStreams(){const e={next:this.onSubscribeToSourcesNext.bind(this),error:this.onSubscribeToSourcesError.bind(this),complete:this.onSubscribeToSourcesComplete.bind(this)},t=()=>{this.props.el$=void 0,this.uberSource$.complete(),this.autoSubscriber$.complete(),this.sink$.complete(),this.props=void 0,this.deleted=!0,this.tracer("completeAll",this.deleted,this.props)},r=()=>{s-=1,0===s&&t()};let s=0;this.uberSource$=new u.Subject,this.autoMergeSubject$=this.uberSource$.pipe((0,_.mergeMap)((e=>{const t=e.observable.pipe((0,_.filter)((e=>void 0!==e&&void 0!==e.action)),(0,_.map)((e=>{const t=(0,o.$)({},e);return t.action=e.action,this.tracer("autoMergeSubject$",t),t})));return!1===e.autoClosesBool?t:(s+=1,t.pipe((0,_.finalize)(r)))}))),this.autoSubscriber$=this.autoMergeSubject$.pipe((0,_.filter)((e=>void 0!==e&&void 0!==e.action))).subscribe(e)}updateSourceSubscription(e,t=!1,r){const s={observable:e,autoClosesBool:t,rel:r};this.tracer("updateSourceSubscription ",this.vsnum,s),this.uberSource$.next(s)}onSubscribeToSourcesNext(e={}){const t=(0,m.defaultTo)((e=>this.sendExtendedStreams(e))),r=(0,a.FZ)(this.props.hashSourceMethods,e.action);t(this.props.hashSourceMethods[r])(e),this.tracer("onSubscribeToSourcesNext",{payload:e})}onSubscribeToSourcesError(e=""){console.log("ALL ERROR ",this.constructor.name,e)}onSubscribeToSourcesComplete(){this.tracer("onSubscribeToSourcesComplete","VS_DETRITUS_COLLECT"),this.openSpigot("VS_DETRITUS_COLLECT")}sendExtendedStreams(e){this.tracer("sendExtendedStreams",e),this.openSpigot(e.action,e)}renderAndAttachToParent(e){this.openSpigot("VS_SPAWN_AND_ATTACH_TO_PARENT",e)}renderView(){this.openSpigot("VS_SPAWN")}renderViewAndAttachToDom(e,t,r){const s={node:e,type:t,attachType:r};this.openSpigot("VS_SPAWN_AND_ATTACH_TO_DOM",{attachData:s})}checkParentDispose(e){"parent"===e.from$&&this.disposeViewStream(e)}onBeforeDispose(){}setTimeout(e,t=0,r=!1){window.setTimeout(((...t)=>{if(void 0!==this&&void 0!==this.props){const s=!0===r?e.bind(this):e;(0,m.apply)(s,t)}}),t)}disposeViewStream(e){this.onBeforeDispose(),this.openSpigot("EXTIRPATE")}onChildDispose(e){}onParentDisposing(e){this.openSpigot("EXTIRPATE")}onReadyToGC(e){const t=void 0!==e.from$&&"internal"===e.from$;this.tracer("onReadyToGC",t,e)}openSpigot(e,t={}){if(void 0!==this.props){this.props.action=e;const r=(0,m.mergeRight)(this.props,t);this.sink$.next(Object.freeze(r))}}setAttachData(e,t){return{node:this.props.el,type:"ViewStreamObservable",attachType:e,query:(()=>{const e=this.props.el.querySelector(t);return!0===T.isDevMode()&&(0,m.is)(String,t)&&(0,m.isNil)(e)&&console.warn(`Spyne Warning: The appendView query in ${this.props.name}, '${t}', appears to not exist!`),e})()}}getParentEls(e,t){const r=e=>e.parentElement;let s=0,n=e;for(;s<t;)n=r(n),s++;return n}setAttachParentData(e,t,r){t=""!==t?t:void 0;const s=this.getParentEls(this.props.el,r);return{node:s,type:"ViewStreamObservable",attachType:e,query:s.querySelector(t)}}onMapViewSource(e={}){return this.props=(0,m.mergeRight)(this.props,e),e}exchangeViewsWithChild(e,t){this.addChildStream(e.sourceStreams.toParent$),e.addParentStream(this.sourceStreams.toChild$,t)}appendToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","appendChild")}appendToDomAfter(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDomAfter. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","after")}prependToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be prependedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","prependChild")}appendView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("appendChild",t))}appendViewAfter(e,t){this.exchangeViewsWithChild(e,this.setAttachData("after",t))}appendViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("appendChild",t,r))}prependViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("prependChild",t,r))}prependView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("prependChild",t))}appendToNull(){const e=document.getElementById("spyne-null-views");this.renderViewAndAttachToDom(e,"dom","appendChild")}onVSRendered(e){"internal"===e.from$&&this.postRender()}postRender(){if(!0!==this._postRenderedCalled){if(this.beforeAfterRender(),this.afterRender(),this.onRendered(),requestAnimationFrame((()=>this.onAnimFrameAfterRendered())),!0===this.isDevMode){const e=this.broadcastEvents();!1===T.isValidNestedArr(e)&&console.warn(`Spyne Warning: The array returned from broadcastEvents in ${this.props.name}, '${JSON.stringify(e)}', does not appear to be properly formatted!`)}this.initializeChannels(),this.viewsStreamBroadcaster=new l.e(this.props,this.broadcastEvents.bind(this)),this.afterBroadcastEvents(),this._postRenderedCalled=!0}}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>{new e(this)}))}afterBroadcastEvents(){if(!0===this.isDevMode){const e=e=>e[0],t=this.addActionListeners(),r=t.map(e);if(!1===T.isValidNestedArr(t))console.warn(`Spyne Warning: The array returned from addActionsListeners in ${this.props.name}, '${JSON.stringify(t)}', does not appear to be properly formatted!`);else{const e=e=>{const t=(0,m.defaultTo)("",e[1]);!1===(0,m.is)(Function,this[t])&&console.warn(`Spyne Warning: The method in addActionListeners nested Array, '${JSON.stringify(e)}', in ${this.props.name}, does not appear to exist!`)};(0,m.compose)((0,m.forEach)(e),(0,m.defaultTo)([]))(t)}const s=()=>{void 0!==(0,m.path)(["props","addedChannels"],this)&&T.checkIfActionsAreRegistered.bind(this)(this.props.addedChannels,r)};this.setTimeout(s,500)}}setDataVSID(){this.props.el.dataset.vsid=this.props.vsid}beforeAfterRender(){this.setDataVSID(),this.props.el$=(0,N.T)(this.props.el)}downStream(){}onRendered(){}onAnimFrameAfterRendered(){}afterRender(){}broadcastEvents(){return[]}getChannel(e){return(0,m.ifElse)((e=>(0,d.ns)().includes(e)),(e=>n.M.channelsMap.getStream(e).observer.pipe((0,_.takeWhile)((e=>!0!==this.deleted)))),(e=>console.warn(`channel name ${e} is not within ${d.ns}`)))(e)}initializeChannels(){Array.isArray(this?.props?.channels)?this?.props?.channels?.forEach((e=>{const[t,r=!1]=Array.isArray(e)?e:[e];this?.addChannel(t,r)})):Array.isArray(this?.props?.channel)&&console.warn("props.channel is not a ViewStream property. Do you mean props.channels?")}addChannel(e,t=!1,r=!1,s=!1){const n=!0===r?this.$dirs.CI:this.$dirs.I;if(!0===this?.props?.addedChannels?.includes(e))return;const o=(0,m.path)(["srcElement","isLocalEvent"]),i=(0,m.path)(["srcElement","vsid"]),a=[(0,_.map)((e=>{const t=e;return t.$dir=n,t})),(0,_.filter)((e=>{const t=i(e);return!0!==o(e)||t===this.props.vsid}))];!0===t&&a.unshift((0,_.skip)(1));const c=this.getChannel(e).pipe(...a);this.updateSourceSubscription(c,!1),this.props.addedChannels.push(e)}checkIfChannelExists(e){const t=n.M.channelsMap.testStream(e);return!0!==t&&console.warn(`SPYNE WARNING: The ChannelPayload from ${this.props.name}, has been sent to a channel, ${e}, that has not been registered!`),t}sendInfoToChannel(e,t={},r){const s=t,n=(0,m.defaultTo)("VIEWSTREAM_EVENT"),o=(0,m.compose)(n,(0,m.prop)(e)),a={payload:s,action:r=r||o({CHANNEL_ROUTE:"CHANNEL_ROUTE_CHANGE_EVENT"})};try{if(a.srcElement=(0,m.compose)((0,m.pick)(["id","vsid","class","tagName"]),(0,m.prop)("props"))(this),!0===this.checkIfChannelExists(e)){!1===/CHANNEL_LIFECYCLE/.test(r)&&Object.defineProperties(a,{payload:{get:()=>(0,i.l)(t)}});const s=(0,u.of)(a);return new E.u(e,s,a)}}catch(e){console.warn("SPYNE WARNING ",e)}}tracer(...e){this.sendLifecycleMethod(...e)}sendLifecycleMethodInactive(){}sendLifecycleMethodActive(e,t){const r="VS_DETRITUS_COLLECT"===t;!0===(0,m.where)({from$:(0,m.equals)("internal"),action:(0,m.equals)("VS_SPAWNED_AND_ATTACHED_TO_PARENT")},t)?this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_RENDERED_EVENT"},"CHANNEL_LIFECYCLE_RENDERED_EVENT"):!0===r&&this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_DISPOSED_EVENT"},"CHANNEL_LIFECYCLE_DISPOSED_EVENT")}createActionFilter(e,t){return new p.C(e,t)}isLocalEvent(e){const t=(0,m.path)(["srcElement","el"],e),r=(0,m.path)(["props","el"],this);return T.elIsDomElement(r)&&T.elIsDomElement(t)&&r.contains(t)}addMixins(){const e=(0,s.z)();this.createId=e.createId}}},636:e=>{e.exports=r},131:e=>{e.exports=t},968:t=>{t.exports=e},531:e=>{e.exports=s}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}};return n[e](r,r.exports,i),r.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};i.r(a),i.d(a,{Channel:()=>m.c,ChannelFetch:()=>T.e,ChannelFetchUtil:()=>A.G,ChannelPayload:()=>C.m,ChannelPayloadFilter:()=>g.C,ChannelsMap:()=>c.H,DomElement:()=>d.r,DomElementTemplate:()=>l.X,SpyneApp:()=>f.D,SpyneAppProperties:()=>L.M,SpynePlugin:()=>I.V,SpyneTrait:()=>u.g,ViewStream:()=>h.A,ViewStreamBroadcaster:()=>N.e,ViewStreamElement:()=>E.q,ViewStreamPayload:()=>_.u,ViewStreamSelector:()=>p.T,deepMerge:()=>S.$,safeClone:()=>y.l});var c=i(470),d=i(192),l=i(291),E=i(300),p=i(707),h=i(173),N=i(992),u=i(732),_=i(54),m=i(2),T=i(126),A=i(9),C=i(980),g=i(589),I=i(930),S=i(907),y=i(961),L=i(225),f=i(713);return a})()));
|
|
3
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LDZCQUNBLDZCQUNBLDRCQUNBLDZCQUNBLHdCQUNBLGtDQUNBLDJCQUNBLHVCQUNBLDRCQUNBLHlCQUNBLHlDQUNBLHlCQUNBLHlCQUNBLDJCQUNBLDRCQUNBLDRCQUNBLG9DQUNBLG1DQUNBLG9DQUNBLHVDQUNBLHdDQUNBLGlDQUNBLDhCQUNBLGdDQUNBLHFDQUNBLDhCQUNBLGdDQUNBLHFDQUNBLDRDQUNBLDJDQUNBLHlCQUNBLHNDQUNBLDJCQUNBLDJCQUNBLDJCQUNBLHlCQUNBLGtDQUNBLHlDQUNBLHdCQUNBLDhCQUNBLGtDQUNBLDJCQUNBLDZCQUNBLHNDQUNBLHdCQUNBLHNDQUNBLDJCQUNBLGdDQUNBLDZCQUNBLDhCQUNBLDhCQUNBLDZCQUNBLDRCQUNBLDZCQUNBLDJCQUNBLHdCQUNBLHFDQUNBLDJCQUNBLHFDQUNBLDJCQUNBLDBCQUNBLHdCQUNBLHFDQUNBLDRCQUNBLDRCQUNBLHlCQUNBLHlCQUNBLHFDQUNBLHVDQUNBLHdCQUNBLDJCQUNBLGlDQUNBLCtCQUNBLGdDQUNBLGdDQUNBLHFDQUNBLG9DQUNBLCtCQUNBLDhCQUNBLCtCQUNBLDZCQUNBLDRCQUNBLDRCQUNBLHdCQUNBLDBDQUNBLDhCQUNBLG9DQUNBLG9DQUNBLCtCQUNBLGdDQUNBLCtCQUNBLHlCQUNBLDBCQUNBLDRDQUNBLDBCQUNBLDBCQUNBLDBCQUNBLDBCQUNBLDBCQUNBLDJCQUNBLDBCQUNBLCtDQUNBLDZCQUNBLG1DQUNBLCtCQUNBLHlDQUNBLHdDQUNBLHdDQUNBLDhCQUNBLDRCQUNBLDhCQUNBLDZCQUNBLCtCQUNBLDJCQUNBLDhCQUNBLGdDQUNBLDJCQUNBLHlCQUNBLCtCQUNBLDJCQUNBLDBCQUNBLDJCQUNBLDJCQUNBLDJCQUNBLDhCQUNBLDBCQUNBLDhCQUNBLCtCQUNBLDRCQUNBLDZCQUNBLDhCQUNBLHlCQUNBLG9DQUNBLGlDQUNBLGlDQUNBLG1DQUNBLHNDQUNBLDBCQUNBLDBCQUNBLGlDQUNBLGlDQUNBLG9DQUNBLGlDQUNBLGdDQUNBLHFDQUNBLGlDQUNBLG9DQUNBLHVDQUNBLHVDQUNBLGtDQUNB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QSxFQUFhMTZDLFFBR3JCLElBQUlDLEVBQVNzNkMsRUFBeUJFLEdBQVksQ0FHakR6NkMsUUFBUyxDQUFDLEdBT1gsT0FIQTI2QyxFQUFvQkYsR0FBVXg2QyxFQUFRQSxFQUFPRCxRQUFTdzZDLEdBRy9DdjZDLEVBQU9ELE9BQ2YsQ0NyQkF3NkMsRUFBb0JJLEVBQUszNkMsSUFDeEIsSUFBSTQ2QyxFQUFTNTZDLEdBQVVBLEVBQU82NkMsV0FDN0IsSUFBTzc2QyxFQUFpQixRQUN4QixJQUFNLEVBRVAsT0FEQXU2QyxFQUFvQnh0QyxFQUFFNnRDLEVBQVEsQ0FBRXBmLEVBQUdvZixJQUM1QkEsQ0FBTSxFQ0xkTCxFQUFvQnh0QyxFQUFJLENBQUNoTixFQUFTKzZDLEtBQ2pDLElBQUksSUFBSTlwQyxLQUFPOHBDLEVBQ1hQLEVBQW9CM3pDLEVBQUVrMEMsRUFBWTlwQyxLQUFTdXBDLEVBQW9CM3pDLEVBQUU3RyxFQUFTaVIsSUFDNUVoTSxPQUFPb1EsZUFBZXJWLEVBQVNpUixFQUFLLENBQUVzRSxZQUFZLEVBQU14UCxJQUFLZzFDLEVBQVc5cEMsSUFFMUUsRUNORHVwQyxFQUFvQjN6QyxFQUFJLENBQUM0RSxFQUFLbEUsSUFBVXRDLE9BQU9DLFVBQVVDLGVBQWVDLEtBQUtxRyxFQUFLbEUsR0NDbEZpekMsRUFBb0IzekIsRUFBSzdtQixJQUNILG9CQUFYZzdDLFFBQTBCQSxPQUFPQyxhQUMxQ2gyQyxPQUFPb1EsZUFBZXJWLEVBQVNnN0MsT0FBT0MsWUFBYSxDQUFFM2xDLE1BQU8sV0FFN0RyUSxPQUFPb1EsZUFBZXJWLEVBQVMsYUFBYyxDQUFFc1YsT0FBTyxHQUFPLDBuQjlDSzlEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWwtZmV0Y2gtY2xhc3MuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1wYXlsb2FkLWNsYXNzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWwtcHJveHkuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVscy1jb25maWcuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbHMtbWFwLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtcm91dGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC11aS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLXdpbmRvdy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9zcHluZS1hcHAuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvc3B5bmUtcGx1Z2lucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9jaGFubmVsLWZldGNoLXV0aWwuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvY2hhbm5lbC1wYXlsb2FkLWZpbHRlci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9kZWVwLW1lcmdlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2ZycC10b29scy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9nYy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9taXhpbnMvYmFzZS1zdHJlYW1zLW1peGlucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9yb3V0ZS1jaGFubmVsLXVwZGF0ZXIuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc2FmZS1jbG9uZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zYW5pdGl6ZS1odG1sLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXBsdWdpbnMtbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS10cmFpdC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtd2luZG93LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3ZpZXdzdHJlYW0tYW5pbWF0aW9ucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy92aWV3c3RyZWFtLW9ic2VydmFibGVzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL2RvbS1lbGVtZW50LXRlbXBsYXRlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL2RvbS1lbGVtZW50LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLWJyb2FkY2FzdGVyLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tcGF5bG9hZC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1zZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS5qcyIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcImRvbXB1cmlmeVwiLFwiY29tbW9uanMyXCI6XCJkb21wdXJpZnlcIixcImFtZFwiOlwiZG9tcHVyaWZ5XCIsXCJyb290XCI6XCJET01QdXJpZnlcIn0iLCJ3ZWJwYWNrOi8vc3B5bmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6XCJyYW1kYVwiLFwiY29tbW9uanMyXCI6XCJyYW1kYVwiLFwiYW1kXCI6XCJyYW1kYVwiLFwicm9vdFwiOlwiUlwifSIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcInJ4anNcIixcImNvbW1vbmpzMlwiOlwicnhqc1wiLFwiYW1kXCI6XCJyeGpzXCIsXCJyb290XCI6XCJyeGpzXCJ9Iiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOltcInJ4anNcIixcIm9wZXJhdG9yc1wiXSxcImNvbW1vbmpzMlwiOltcInJ4anNcIixcIm9wZXJhdG9yc1wiXSxcImFtZFwiOlwicnhqcy9vcGVyYXRvcnNcIixcInJvb3RcIjpbXCJyeGpzXCIsXCJvcGVyYXRvcnNcIl19Iiwid2VicGFjazovL3NweW5lL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwicnhqc1wiKSwgcmVxdWlyZShcInJhbWRhXCIpLCByZXF1aXJlKFwiZG9tcHVyaWZ5XCIpLCByZXF1aXJlKFwicnhqc1wiKVtcIm9wZXJhdG9yc1wiXSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcInNweW5lXCIsIFtcInJ4anNcIiwgXCJyYW1kYVwiLCBcImRvbXB1cmlmeVwiLCBcInJ4anMvb3BlcmF0b3JzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInNweW5lXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicnhqc1wiKSwgcmVxdWlyZShcInJhbWRhXCIpLCByZXF1aXJlKFwiZG9tcHVyaWZ5XCIpLCByZXF1aXJlKFwicnhqc1wiKVtcIm9wZXJhdG9yc1wiXSk7XG5cdGVsc2Vcblx0XHRyb290W1wic3B5bmVcIl0gPSBmYWN0b3J5KHJvb3RbXCJyeGpzXCJdLCByb290W1wiUlwiXSwgcm9vdFtcIkRPTVB1cmlmeVwiXSwgcm9vdFtcInJ4anNcIl1bXCJvcGVyYXRvcnNcIl0pO1xufSkoc2VsZiwgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xMzFfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNjM2X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUzMV9fKSA9PiB7XG5yZXR1cm4gIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IENoYW5uZWxGZXRjaFV0aWwgfSBmcm9tICcuLi91dGlscy9jaGFubmVsLWZldGNoLXV0aWwuanMnXG5pbXBvcnQgeyBwYXRoLCBwaWNrLCBtZXJnZURlZXBSaWdodCwgYWxsLCBhbGxQYXNzLCBlaXRoZXIsIHZhbHVlcywgZGVmYXVsdFRvLCByZWplY3QsIGNvbXBvc2UsIGlzTmlsIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsRmV0Y2ggZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbEZldGNoXG4gICAqIEB0eXBlIGV4dGVuZGFibGVcbiAgICogQGRlc2NcbiAgICogPHA+Q2hhbm5lbEZldGNoIGV4dGVuZHMgQ2hhbm5lbCBhbmQgaXMgZGVzaWduZWQgdG8gY3JlYXRlIGEgQ2hhbm5lbCBmcm9tIGZldGNoZWQgaHR0cCBkYXRhLjwvcD5cbiAgICogPHA+QSBDaGFubmVsRmV0Y2ggaW5zdGFuY2UgY2FuIGJlIGNyZWF0ZWQgd2l0aCBqdXN0IHRoZSBjaGFubmVsIG5hbWUgYW5kIHVybCBwcm9wZXJ0aWVzLjwvcD5cbiAgICogPHA+VGhlIGRhdGEgaXMgZmV0Y2hlZCBvbmNlLCBidXQgdGhlIENoYW5uZWxGZXRjaCdzIGRhdGEgaXMgYWx3YXlzIGF2YWlsYWJsZSB0byBvdGhlciBDaGFubmVsIGFuZCBWaWV3U3RyZWFtIGluc3RhbmNlczwvcD5cbiAgICpcbiAgICogPGgzPlRoZSBDaGFubmVsRmV0Y2ggQ2xhc3M8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5FeHRlbmRzIENoYW5uZWwgYW5kIHVzZXMgdGhlIENoYW5uZWxGZXRjaFV0aWwgdG8gbWFrZSBhbnkgdHlwZSBvZiBodHRwKHMpIHJlcXVlc3QuPC9saT5cbiAgICogPGxpPlJlcXVpcmVzIGEgdXJsIHByb3BlcnR5IGF0IGluc3RhbnRpYXRpb24uPC9saT5cbiAgICogPGxpPlRoZSByZXNwb25zZSBkYXRhIGlzIHB1Ymxpc2hlZCBhcyBhIENoYW5uZWxQYXlsb2FkLjwvbGk+XG4gICAqIDxsaT5UaGUgYWN0aW9uIGZvciB0aGUgcmV0dXJuZWQgQ2hhbm5lbEZldGNoIGRhdGEgaXMgYWx3YXlzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0LCBcIkNIQU5ORUxfTkFNRV9SRVNQT05TRV9FVkVOVFwiPC9saT5cbiAgICogPGxpPlRoZSBkZWZhdWx0IHJlcXVlc3QgdHlwZSBpcyBhIEdFVCByZXF1ZXN0IHRoYXQgcmV0dXJucyBhIEpTT04gb2JqZWN0LjwvbGk+XG4gICAqIDxsaT5Ib3dldmVyLCBhbnkgdHlwZSBvZiByZXF1ZXN0IGFuZCByZXR1cm4gdHlwZSBjYW4gYmUgY29uZmlndXJlZCBieSB1c2luZyB0aGUgYm9keSBwcm9wZXJ0eSB3aGVuIGNyZWF0aW5nIHRoZSBpbnN0YW5jZS48L2xpPlxuICAgKiA8bGk+VGhlIG1hcEZuIGdpdmVzIGFjY2VzcyB0byB0aGUgcmV0dXJuZWQgcmVzcG9uc2UgYW5kIGNhbiBiZSB1c2UgdG8gcGFyc2UgdGhlIGRhdGEgYmVmb3JlIGl0IGlzIHB1Ymxpc2hlZCB0byBvdGhlciBDaGFubmVscyBhbmQgVmlld1N0cmVhbSBpbnN0YW5jZXMuPC9saT5cbiAgICogPGxpPkNoYW5uZWwgRmV0Y2ggd2lsbCBzZW5kIHRoZSBsYXN0IHJlc3BvbnNlIHRvIGZ1dHVyZSBzdWJzY3JpYmVycywgYW5kIHdpbGwgbm90IG1ha2UgZnVydGhlciBodHRwKHMpIHJlcXVlc3RzIHVubGVzcyBkaXJlY3RlZCB0byBkbyAgc28uPC9saT5cbiAgICogPGxpPkRhdGEgY2FuIGJlIEZldGNoZWQgYWdhaW4sIGJ5IHNlbmRpbmcgYSBcIkNIQU5ORUxfTkFNRV9VUERBVEVfUkVTUE9OU0VfRVZFTlRcIiBhY3Rpb24gZnJvbSBhIFZpZXdTdHJlYW0ncyBzZW5kSW5mb1RvQ2hhbm5lbCBtZXRob2QuPC9saT5cbiAgICogPC91bD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSAtID0gdW5kZWZpbmVkOyBUaGUgcmVnaXN0ZXJlZCBuYW1lIGZvciB0aGUgY2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByb3BzLnVybCAtID0gdW5kZWZpbmVkOyBUaGUgdXJsIHRvIGJlIGZldGNoZWQuXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHByb3BzLm1hcEZuIC0gPSB1bmRlZmluZWQ7IFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmV0Y2hlZCByZXNwb25zZSBhbmQgYmVoYXZlcyBsaWtlIGFueSBtYXAgbWV0aG9kLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuYm9keSAtID0gdW5kZWZpbmVkOyBUaGlzIHdpbGwgdXBkYXRlIHRoZSBvcHRpb25zLCBpbmNsdWRpbmcgaGVhZGVyIG9wdGlvbnMsIHNlbnQgYWxvbmcgd2l0aCB0aGUgZmV0Y2ggcmVxdWVzdC4gRGVmYXVsdCBvcHRpb25zIHVzZXMgYSBHRVQgcmVxdWVzdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+QSBWaWV3U3RyZWFtIEluc3RhbmNlIFNlbmRpbmcgQSBGZXRjaCBVcGRhdGUgUmVxdWVzdDwvaDQ+XCJdXG4gICAqIGNvbnN0IGFjdGlvbiA9IFwiQ0hBTk5FTF9GRVRDSENIQU5ORUxfTkFNRV9VUERBVEVfUkVTUE9OU0VfRVZFTlRcIjtcbiAgICogY29uc3QgdXJsID0gXCIvL3NpdGUuY29tL2pzb24vXCI7XG4gICAqIGNvbnN0IGJvZHkgPSB7XG4gICAqICAgICBtZXRob2Q6IFwiUE9TVFwiXG4gICAqIH1cbiAgICpcbiAgICogdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbChcIkNIQU5ORUxfRkVUQ0hDSEFOTkVMX05BTUVcIiwge2FjdGlvbiwgdXJsLCBib2R5fSk7XG4gICAqXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUsIHByb3BzID0ge30pIHtcbiAgICAvLyBBTExPVyBGT1IgR0VORVJJQyBNQVAgUFJPUEVSVFlcblxuICAgIENoYW5uZWxGZXRjaC52YWxpZGF0ZU1hcE1ldGhvZChwcm9wcywgbmFtZSlcblxuICAgIGlmIChwcm9wcy5tYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMubWFwRm4gPSBwcm9wcy5tYXBcbiAgICB9XG4gICAgcHJvcHMuZXh0ZW5kZWRBY3Rpb25zQXJyID0gW1xuICAgICAgYCR7bmFtZX1fUkVTUE9OU0VfRVZFTlRgLFxuICAgICAgW2Ake25hbWV9X1JFUVVFU1RfRVZFTlRgLCAnb25GZXRjaFVwZGF0ZSddXG4gICAgXVxuICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gdHJ1ZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlTWFwTWV0aG9kKHByb3BzLCBuYW1lLCB0ZXN0TW9kZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgaXNOb3RFbXB0eSA9IGFyciA9PiBhcnIubGVuZ3RoID49IDFcbiAgICBjb25zdCBpc05vdEZ1bmN0aW9uID0gdmFsID0+IHR5cGVvZiAodmFsKSAhPT0gJ2Z1bmN0aW9uJ1xuICAgIGNvbnN0IGlzVW5kZWZpbmVkT3JXcm9uZ1R5cGUgPSBlaXRoZXIoaXNOaWwsIGlzTm90RnVuY3Rpb24pXG4gICAgY29uc3QgaXNVbmRlZmluZWQgPSBhbGwoaXNVbmRlZmluZWRPcldyb25nVHlwZSlcbiAgICBjb25zdCBpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHkgPSBhbGxQYXNzKFtpc1VuZGVmaW5lZCwgaXNOb3RFbXB0eV0pXG4gICAgY29uc3QgbWFwTWV0aG9kSXNJbnZhbGlkID0gY29tcG9zZShpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHksIHZhbHVlcywgcGljayhbJ21hcCcsICdtYXBGbiddKSkocHJvcHMpXG5cbiAgICBpZiAobWFwTWV0aG9kSXNJbnZhbGlkKSB7XG4gICAgICBpZiAodGVzdE1vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG1hcCBtZXRob2QgZm9yIENoYW5uZWxGZXRjaCwgJHtuYW1lfSwgYXBwZWFycyB0byBiZSBpbnZhbGlkYClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBvblJlZ2lzdGVyZWQocHJvcHMgPSB0aGlzLnByb3BzKSB7XG4gICAgaWYgKHByb3BzPy5wYXVzZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zdGFydEZldGNoKClcbiAgICB9XG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucyhuYW1lKSB7XG4gICAgY29uc3QgYXJyID0gW1xuICAgICAgJ0NIQU5ORUxfUkVTUE9OU0VfRVZFTlQnLFxuICAgICAgWydDSEFOTkVMX1VQREFURV9SRVNQT05TRV9FVkVOVCcsICdvbkZldGNoVXBkYXRlJ10sXG4gICAgICBbJ0NIQU5ORUxfRkVUQ0hfUkVRVUVTVF9FVkVOVCcsICdvbkZldGNoVXBkYXRlJ11cbiAgICBdXG5cbiAgICBjb25zdCBleHRlbmRlZEFyciA9IGNvbXBvc2UoZGVmYXVsdFRvKFtdKSwgcGF0aChbJ3Byb3BzJywgJ2V4dGVuZGVkQWN0aW9uc0FyciddKSlcbiAgICByZXR1cm4gYXJyLmNvbmNhdChleHRlbmRlZEFycih0aGlzKSlcbiAgfVxuXG4gIHN0YXJ0RmV0Y2gob3B0aW9ucyA9IHt9LCBzdWJzY3JpYmVyID0gdGhpcy5vbkZldGNoUmV0dXJuZWQuYmluZCh0aGlzKSkge1xuICAgIGNvbnN0IGZldGNoUHJvcHMgPSB0aGlzLmNvbnNvbGlkYXRlQWxsRmV0Y2hQcm9wcyhvcHRpb25zKVxuICAgIHJldHVybiBuZXcgQ2hhbm5lbEZldGNoVXRpbChmZXRjaFByb3BzLCBzdWJzY3JpYmVyLCBmYWxzZSwgdGhpcy5wcm9wcy5uYW1lKVxuICB9XG5cbiAgb25GZXRjaFVwZGF0ZShldnQpIHtcbiAgICBjb25zdCBwcm9wc09wdGlvbnMgPSB0aGlzLmdldFByb3BzRm9yRmV0Y2goZXZ0KVxuICAgIHRoaXMuc3RhcnRGZXRjaChwcm9wc09wdGlvbnMpXG4gIH1cblxuICBvbkZldGNoUmV0dXJuZWQoc3RyZWFtSXRlbSkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUNoYW5uZWxQYXlsb2FkSXRlbShzdHJlYW1JdGVtKVxuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbFBheWxvYWRJdGVtKHBheWxvYWQsIGFjdGlvbiA9IGAke3RoaXMucHJvcHMubmFtZX1fUkVTUE9OU0VfRVZFTlRgKSB7XG4gICAgY29uc3QgeyBuYW1lLCBzZW5kQ2FjaGVkUGF5bG9hZCwgdXJsIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IHsgbmFtZSwgc2VuZENhY2hlZFBheWxvYWQsIHVybCB9XG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50KVxuICB9XG5cbiAgZ2V0UHJvcHNGb3JGZXRjaChldnQpIHtcbiAgICBjb25zdCBkYXRhT2JqID0gcGF0aChbJ3ZpZXdTdHJlYW1JbmZvJywgJ3BheWxvYWQnXSwgZXZ0KVxuICAgIHJldHVybiBwaWNrKFsnbWFwRm4nLCAndXJsJywgJ2hlYWRlcicsICdib2R5JywgJ21vZGUnLCAnbWV0aG9kJywgJ3Jlc3BvbnNlVHlwZScsICdkZWJ1ZyddLCBkYXRhT2JqKVxuICB9XG5cbiAgY29uc29saWRhdGVBbGxGZXRjaFByb3BzKG9wdGlvbnMsIHByb3BzID0gdGhpcy5wcm9wcykge1xuICAgIGNvbnN0IHByb3BzT3B0aW9ucyA9IHBpY2soWydtYXBGbicsICd1cmwnLCAnaGVhZGVyJywgJ2JvZHknLCAnbW9kZScsICdtZXRob2QnLCAncmVzcG9uc2VUeXBlJywgJ2RlYnVnJ10sIHByb3BzKVxuICAgIGNvbnN0IG1lcmdlT3B0aW9ucyA9IChvMSwgbzIpID0+IG1lcmdlRGVlcFJpZ2h0KG8xLCBvMilcbiAgICBjb25zdCBmaWx0ZXJPdXRVbmRlZmluZWQgPSByZWplY3QoaXNOaWwpXG4gICAgcmV0dXJuIGNvbXBvc2UoZmlsdGVyT3V0VW5kZWZpbmVkLCBtZXJnZU9wdGlvbnMpKHByb3BzT3B0aW9ucywgb3B0aW9ucylcbiAgfVxuXG4gIGdldCBvYnNlcnZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlciRcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgbWVyZ2VBbGwsXG4gIGNsb25lLFxuICBmcm9tUGFpcnMsXG4gIHRvUGFpcnMsXG4gIGNvbXBvc2UsXG4gIGluY2x1ZGVzLFxuICBwaWNrQWxsLFxuICBsdGUsXG4gIGRlZmF1bHRUbyxcbiAgcHJvcCxcbiAgaXNcbn0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IHNhZmVDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3NhZmUtY2xvbmUuanMnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsUGF5bG9hZCB7XG4gIC8qKlxuICAgKlxuICAgKiBBbGwgQ2hhbm5lbCBkYXRhIGlzIHB1Ymxpc2hlZCB1c2luZyB0aGlzIGludGVyZmFjZS5cbiAgICogQG1vZHVsZSBDaGFubmVsUGF5bG9hZFxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBzcmNFbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjaGFubmVsTmFtZSAtID0gdW5kZWZpbmVkOyBUaGUgbmFtZSBvZiB0aGUgQ2hhbm5lbCB0aGF0IGlzIHNlbmRpbmcgdGhlIHBheWxvYWQuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhY3Rpb24gLSA9IHVuZGVmaW5lZDsgQW4gYWN0aW9uIHN0cmluZyB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aGluIHRoZSBDaGFubmVsJ3MgYWRkUmVnaXN0ZXJlZEFjdGlvbnMgbWV0aG9kLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcGF5bG9hZCAtID0gdW5kZWZpbmVkOyBUaGUgZGF0YSBvYmplY3QuXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IHNyY0VsZW1lbnQgLSA9IHt9OyBUaGlzIGlzIHBvcHVsYXRlZCB3aGVuIHRyaWdnZXJlZCBmcm9tIGEgVmlld1N0cmVhbSBpbnN0YW5jZS5cbiAgICogQHByb3BlcnR5IHtVSUV2ZW50fSBldmVudCAtID0gdW5kZWZpbmVkOyBUaGUgVUlFdmVudCwgaWYgYW55LlxuICAgKiBAcmV0dXJucyBWYWxpZGF0ZWQgQ2hhbm5lbFBheWxvYWQganNvbiBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWxOYW1lLCBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50LCB0aW1lTGFiZWwpIHtcbiAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbE5hbWVcbiAgICAvLyBwYXlsb2FkID0gQ2hhbm5lbFBheWxvYWQuZGVlcEZyZWV6ZShwYXlsb2FkKTtcblxuICAgIGlmICh0aW1lTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUudGltZSh0aW1lTGFiZWwpXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRJdGVtT2JqID0geyBjaGFubmVsTmFtZSwgYWN0aW9uLCBzcmNFbGVtZW50LCBldmVudCB9XG4gICAgLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNoYW5uZWxQYXlsb2FkSXRlbU9iaiwgJ3BheWxvYWQnLCB7Z2V0OiAoKSA9PiBjbG9uZShwYXlsb2FkKX0pO1xuICAgIGNvbnN0IGZyb3plblBheWxvYWQgPSBDaGFubmVsUGF5bG9hZC5kZWVwRnJlZXplKHBheWxvYWQpXG4gICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLnBheWxvYWQgPSBmcm96ZW5QYXlsb2FkXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGhlbHBzIHdpdGggZGVzdHJ1Y3R1cmluZyBieSBtZXJnaW5nIGFsbCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnNcbiAgICAgKiBKU09OIE9iamVjdFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVsnPGg0PkRlc3RydWN0dXJpbmcgUHJvcGVydGllcyB1c2luZyB0aGUgQ2hhbm5lbFBheWxvYWQgcHJvcHMgTWV0aG9kPC9oND4nXVxuICAgICAqIGxldCB7ZWwsIGFjdGlvbiwgbXlWYWx9ID0gcGF5bG9hZC5wcm9wcygpO1xuICAgICAqXG4gICAgICpcbiAgICAgKi9cblxuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWUpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGF5bG9hZCwgJ3BheWxvYWQnKSkge1xuICAgICAgICBjb25zdCBwYXlsb2FkU3RyID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgZm9sbG93aW5nIHBheWxvYWQgY29udGFpbnMgYSBuZXN0ZWQgcGF5bG9hZCBwcm9wZXJ0eSB3aGljaCBtYXkgY3JlYXRlIGNvbmZsaWN0czogQWN0aW9uOiAke2FjdGlvbn0sICR7cGF5bG9hZFN0cn1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGFubmVsQWN0aW9uc0FyciA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRDaGFubmVsQWN0aW9ucyhjaGFubmVsKVxuXG4gICAgICBDaGFubmVsUGF5bG9hZC52YWxpZGF0ZUFjdGlvbihhY3Rpb24sIGNoYW5uZWwsIGNoYW5uZWxBY3Rpb25zQXJyKVxuICAgIH1cblxuICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5jbG9uZSA9ICgpID0+IG1lcmdlQWxsKFtcbiAgICAgIHsgcGF5bG9hZDpzYWZlQ2xvbmUoY2hhbm5lbFBheWxvYWRJdGVtT2JqLnBheWxvYWQpIH0sXG4gICAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmoucGF5bG9hZCxcbiAgICAgIHsgY2hhbm5lbDogY2xvbmUoY2hhbm5lbCkgfSxcbiAgICAgIHsgZXZlbnQ6IGNsb25lKGV2ZW50KSB9LFxuICAgICAgeyBzcmNFbGVtZW50IH0sXG4gICAgICBjbG9uZShjaGFubmVsUGF5bG9hZEl0ZW1PYmouc3JjRWxlbWVudCksIHsgYWN0aW9uOiBjbG9uZShjaGFubmVsUGF5bG9hZEl0ZW1PYmouYWN0aW9uKSB9XG4gICAgXSlcblxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzID0ge1xuICAgICAgJGRpcjoge1xuICAgICAgICBnZXQ6ICgpID0+IGNoYW5uZWxQYXlsb2FkSXRlbU9iai5fZGlyLFxuICAgICAgICBzZXQ6ICh2YWwpID0+IHtcbiAgICAgICAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmouX2RpciA9IHZhbFxuICAgICAgICAgIHJldHVybiB2YWxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFubmVsID09PSAnQ0hBTk5FTF9ST1VURScpIHtcbiAgICAgIC8vIGNoYW5uZWxQYXlsb2FkSXRlbU9ialsnbG9jYXRpb24nXSA9IENoYW5uZWxQYXlsb2FkLmdldExvY2F0aW9uRGF0YSgpO1xuICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMubG9jYXRpb24gPSB7XG4gICAgICAgIGdldDogKCkgPT4gQ2hhbm5lbFBheWxvYWQuZ2V0TG9jYXRpb25EYXRhKClcbiAgICAgIH1cbiAgICAgIC8qIGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzWydyb3V0ZURhdGEnXSA9IHtcbiAgICAgICAgZ2V0OiAoKT0+cHJvcCgncm91dGVEYXRhJywgZnJvemVuUGF5bG9hZClcbiAgICAgIH1cbiovXG4gICAgfVxuXG4gICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLl9kaXIgPSB1bmRlZmluZWRcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNoYW5uZWxQYXlsb2FkSXRlbU9iaiwgY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMpXG5cbiAgICBpZiAodGltZUxhYmVsKSB7XG4gICAgICBjb25zb2xlLnRpbWVFbmQodGltZUxhYmVsKVxuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbFBheWxvYWRJdGVtT2JqXG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVBY3Rpb24oYWN0aW9uLCBjaGFubmVsLCBhcnIpIHtcbiAgICBjb25zdCBpc0luQXJyID0gaW5jbHVkZXMoYWN0aW9uLCBhcnIpXG4gICAgaWYgKGlzSW5BcnIgPT09IGZhbHNlICYmIFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGB3YXJuaW5nOiBBY3Rpb246ICcke2FjdGlvbn0nIGlzIG5vdCByZWdpc3RlcmVkIHdpdGhpbiB0aGUgJHtjaGFubmVsfSBjaGFubmVsIWApXG4gICAgfVxuICAgIHJldHVybiBpc0luQXJyXG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25EYXRhKCkge1xuICAgIGNvbnN0IGxvY2F0aW9uUGFyYW1zQXJyID0gW1xuICAgICAgJ2hyZWYnLFxuICAgICAgJ29yaWdpbicsXG4gICAgICAncHJvdG9jb2wnLFxuICAgICAgJ2hvc3QnLFxuICAgICAgJ2hvc3RuYW1lJyxcbiAgICAgICdwb3J0JyxcbiAgICAgICdwYXRobmFtZScsXG4gICAgICAnc2VhcmNoJyxcbiAgICAgICdoYXNoJ11cbiAgICByZXR1cm4gcGlja0FsbChsb2NhdGlvblBhcmFtc0Fyciwgd2luZG93LmxvY2F0aW9uKVxuICB9XG5cbiAgc3RhdGljIGdldFN0cmVhbUl0ZW0oKSB7XG5cbiAgfVxuXG4gIHN0YXRpYyBkZWVwQ2xvbmUobykge1xuICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXkpXG4gICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QpXG4gICAgY29uc3QgaXNJdGVyID0gb2IgPT4gaXNBcnIob2IpID09PSBmYWxzZSAmJiBpc09iaihvYikgPT09IHRydWVcbiAgICBjb25zdCBpc0l0ZXJhYmxlID0gaXNJdGVyKG8pXG4gICAgcmV0dXJuIGlzSXRlcmFibGUgPyBjb21wb3NlKGZyb21QYWlycywgdG9QYWlycywgY2xvbmUpKG8pIDogY2xvbmUobylcbiAgfVxuXG4gIHN0YXRpYyBkZWVwRnJlZXplKG8pIHtcbiAgICAvLyByZXR1cm4gbztcbiAgICAvLyByZXR1cm4gT2JqZWN0LmZyZWV6ZShvKTtcbiAgICBjb25zdCBlbElzRG9tRWxlbWVudCA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuXG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5mcmVlemUobylcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHByb3ApICYmXG4gICAgICAgICAgICBlbElzRG9tRWxlbWVudChvW3Byb3BdKSA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgIG9bcHJvcF0gIT09IG51bGwgJiZcbiAgICAgICAgICAgICh0eXBlb2Ygb1twcm9wXSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9bcHJvcF0gPT09ICdmdW5jdGlvbicpICYmXG4gICAgICAgICAgICAhT2JqZWN0LmlzRnJvemVuKG9bcHJvcF0pKSB7XG4gICAgICAgICAgQ2hhbm5lbFBheWxvYWQuZGVlcEZyZWV6ZShvW3Byb3BdKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiRlJFRVpFIEVSUiBcIix7byxlfSk7XG4gICAgICByZXR1cm4gb1xuICAgIH1cblxuICAgIHJldHVybiBvXG4gIH1cblxuICBzdGF0aWMgZ2V0TW91c2VFdmVudEtleXMoKSB7XG4gICAgcmV0dXJuIFsnYWx0S2V5JywgJ2J1YmJsZXMnLCAnY2FuY2VsQnViYmxlJywgJ2NhbmNlbGFibGUnLCAnY2xpZW50WCcsICdjbGllbnRZJywgJ2NvbXBvc2VkJywgJ2N0cmxLZXknLCAnY3VycmVudFRhcmdldCcsICdkZWZhdWx0UHJldmVudGVkJywgJ2RldGFpbCcsICdldmVudFBoYXNlJywgJ2Zyb21FbGVtZW50JywgJ2lzVHJ1c3RlZCcsICdsYXllclgnLCAnbGF5ZXJZJywgJ21ldGFLZXknLCAnbW92ZW1lbnRYJywgJ21vdmVtZW50WScsICdvZmZzZXRYJywgJ29mZnNldFknLCAncGFnZVgnLCAncGFnZVknLCAncGF0aCcsICdyZWxhdGVkVGFyZ2V0JywgJ3JldHVyblZhbHVlJywgJ3NjcmVlblgnLCAnc2NyZWVuWScsICdzaGlmdEtleScsICdzb3VyY2VDYXBhYmlsaXRpZXMnLCAnc3JjRWxlbWVudCcsICd0YXJnZXQnLCAndGltZVN0YW1wJywgJ3RvRWxlbWVudCcsICd0eXBlJywgJ3ZpZXcnLCAnd2hpY2gnLCAneCcsICd5J11cbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgU3ViamVjdCwgUmVwbGF5U3ViamVjdCwgbWVyZ2UgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgaW5jbHVkZXMgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IGRlbGF5Q2FsbCB9IGZyb20gJy4uL3V0aWxzL2ZycC10b29scy5qcydcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxQcm94eSBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsUHJveHlcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICAgKlxuICAgKiBAZGVzY1xuICAgKiBBIHByb3h5IGNoYW5uZWwgaXMgY3JlYXRlZCB3aGVuIGEgY2hhbm5lbCBpcyBzdWJzY3JpYmVkIHRvIGJlZm9yZSBpdCBpcyByZWdpc3RlcmVkLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZSwgcHJvcHMgPSB7fSkge1xuICAgIHByb3BzLmlzUHJveHkgPSB0cnVlXG4gICAgc3VwZXIobmFtZSwgcHJvcHMpXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gICAgdGhpcy5zdWJqZWN0JCA9IG5ldyBTdWJqZWN0KClcbiAgICB0aGlzLnJlcGxheVN1YiQgPSBuZXcgUmVwbGF5U3ViamVjdCgxKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gbWVyZ2UodGhpcy5zdWJqZWN0JCwgdGhpcy5yZXBsYXlTdWIkKVxuICAgIGNvbnN0IGlzRGV2TW9kZSA9IFNweW5lQXBwUHJvcGVydGllcy5kZWJ1Z1xuICAgIGlmIChpc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuY2hlY2tJZkNoYW5uZWxJc1N0aWxsUHJveHkobmFtZSlcbiAgICB9XG4gIH1cblxuICBnZXRNZXJnZWRTdWJqZWN0KHBlcmlzdERhdGEgPSBmYWxzZSkge1xuICAgIHJldHVybiBwZXJpc3REYXRhID09PSB0cnVlID8gdGhpcy5yZXBsYXlTdWIkIDogdGhpcy5zdWJqZWN0JFxuICB9XG5cbiAgY2hlY2tJZkNoYW5uZWxJc1N0aWxsUHJveHkoY2hhbm5lbE5hbWUpIHtcbiAgICBjb25zdCBuYW1lID0gY2hhbm5lbE5hbWVcblxuICAgIGNvbnN0IGNoZWNrSWZQcm94eSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGJvb2wgPSBpbmNsdWRlcyhuYW1lLCBTcHluZUFwcFByb3BlcnRpZXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscygpKVxuICAgICAgaWYgKGJvb2wgIT09IHRydWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgY2hhbm5lbCwgJHtuYW1lfSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgcmVnaXN0ZXJlZCFgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGRlbGF5Q2FsbChjaGVja0lmUHJveHksIDEwMDApXG4gIH1cblxuICBnZXQgcmVwbGF5U3ViamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsYXlTdWIkXG4gIH1cblxuICBnZXQgc3ViamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0JFxuICB9XG59XG4iLCJpbXBvcnQgeyByZWdpc3RlcmVkU3RyZWFtTmFtZXMgfSBmcm9tICcuL2NoYW5uZWxzLWNvbmZpZy5qcydcbmltcG9ydCB7IENoYW5uZWxQYXlsb2FkIH0gZnJvbSAnLi9jaGFubmVsLXBheWxvYWQtY2xhc3MuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFJvdXRlQ2hhbm5lbFVwZGF0ZXIgfSBmcm9tICcuLi91dGlscy9yb3V0ZS1jaGFubmVsLXVwZGF0ZXIuanMnXG5cbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YmplY3QsIGZvcmtKb2luLCBFTVBUWSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgdGFrZSwgY29tYmluZUxhdGVzdFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7XG4gIGlmRWxzZSxcbiAgaWRlbnRpdHksXG4gIGhlYWQsXG4gIG1lcmdlQWxsLFxuICBvYmpPZixcbiAgdmlldyxcbiAgaXMsXG4gIGNoYWluLFxuICBsZW5zSW5kZXgsXG4gIGFsd2F5cyxcbiAgZnJvbVBhaXJzLFxuICBwYXRoLFxuICBpc0VtcHR5LFxuICBlcXVhbHMsXG4gIHByb3AsXG4gIHByb3BFcVxuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGUgQ2hhbm5lbCBjb21wb25lbnQgd3JhcHMgbWV0aG9kcyBhbmQgZnVuY3Rpb25hbGl0eSBhcm91bmQgYW4gUnhKcyBTdWJqZWN0LCB0byBjcmVhdGUgYSBvbmUtd2F5IGRhdGEgZmxvdyBiZXR3ZWVuIGl0c2VsZiBhbmQgb3RoZXIgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW1zLjwvcD5cbiAgICogPHA+Q2hhbm5lbHMgZ2V0IGRhdGEgYnkgaW1wb3J0aW5nIGpzb24gb2JqZWN0cywgc3Vic2NyaWJpbmcgdG8gb3RoZXIgQ2hhbm5lbHMgYW5kIGJ5IHBhcnNpbmcgVmlld1N0cmVhbSBpbmZvLjwvcD5cbiAgICogPGgzPlRoZSBCYXNpYyBDaGFubmVsIFN0cnVjdHVyZTwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNoYW5uZWxzIHJlcXVpcmVzIGEgdW5pcXVlIG5hbWUsIGZvciBleGFtcGxlLCA8Yj5DSEFOTkVMX01ZQ0hBTk5FTDwvYj4sIHdoaWNoIGNvbXBvbmVudHMgdXNlIHRvIHNlbGVjdCBhbmQgc3Vic2NyaWJlIHRvIGFueSBjaGFubmVsLjwvbGk+XG4gICAqIDxsaT5DaGFubmVscyBhcmUgaW5zdGFudGlhdGVkIGFuZCAncmVnaXN0ZXJlZCcgd2l0aCB0aGUgTElOS1snU3B5bmVBcHAnLCAnc3B5bmUtYXBwJ10uPC9saT5cbiAgICogPGxpPkNoYW5uZWxzIHJlbWFpbiBwZXJzaXN0ZW50IGFuZCBhcmUgbm90IGRlbGV0ZWQuPC9saT5cbiAgICogPC91bD5cbiAgICogPGgzPkNvbXBvbmVudHMgdGhhdCBleHRlbmQgQ2hhbm5lbDwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPlRoZSBmb3VyIFNweW5lIENoYW5uZWxzLCBMSU5LWydTcHluZUNoYW5uZWxVSScsICdzcHluZS1jaGFubmVsLXUtaSddLCBMSU5LWydTcHluZUNoYW5uZWxXaW5kb3cnLCAnc3B5bmUtY2hhbm5lbC13aW5kb3cnXSwgTElOS1snU3B5bmVDaGFubmVsUm91dGUnLCAnc3B5bmUtY2hhbm5lbC1yb3V0ZSddIGFuZCBMSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgYWxsIGV4dGVuZCBDaGFubmVsLjwvbGk+XG4gICAqIDxsaT5DaGFubmVsRmV0Y2ggYWxzbyBleHRlbmRzIENoYW5uZWwsIGFkZHMgYSBDaGFubmVsRmV0Y2hVdGlsIGNvbXBvbmVudCB0byBpbW1lZGlhdGVseSBwdWJsaXNoIGZldGNoZWQgcmVzcG9uc2VzLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIDxoMz5TZW5kaW5nIENoYW5uZWxQYXlsb2FkczwvaDM+XG4gICAqICAgPHA+Q2hhbm5lbHMgc2VuZCBkYXRhIHVzaW5nIHRoZSA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cImNoYW5uZWwtc2VuZC1jaGFubmVsLXBheWxvYWRcIiAgaHJlZj1cIi9ndWlkZS9yZWZlcmVuY2UvY2hhbm5lbC1zZW5kLWNoYW5uZWwtcGF5bG9hZFwiID5zZW5kQ2hhbm5lbFBheWxvYWQ8L2E+XG4gICBtZXRob2QuPC9wPlxuICAgKlxuICAgKlxuICAgKiA8aDM+UmVjZWl2aW5nIERhdGEgZnJvbSBWaWV3U3RyZWFtIEluc3RhbmNlczwvaDM+XG4gICAqIDxwPlZpZXdTdHJlYW1zIGNhbiBzZW5kIGRhdGEgdG8gYW55IGN1c3RvbSBjaGFubmVsIHVzaW5nIHRoZSA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cInZpZXctc3RyZWFtLXNlbmQtaW50by10by1jaGFubmVsXCIgIGhyZWY9XCIvZ3VpZGUvcmVmZXJlbmNlL3ZpZXctc3RyZWFtLXNlbmQtaW5mby10by1jaGFubmVsXCIgPnNlbmRJbmZvVG9DaGFubmVsPC9hPlxuICAgbWV0aG9kLiBDaGFubmVscyBjYW0gbGlzdGVuIHRvIGFueSBWaWV3U3RyZWFtIGRhdGEgZGlyZWN0ZWQgdG8gaXRzZWxmIHRocm91Z2ggdGhlIGRlZmF1bHQgbWV0aG9kLCA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cImNoYW5uZWwtb24tdmlldy1zdHJlYW0taW5mb1wiICBocmVmPVwiL2d1aWRlL3JlZmVyZW5jZS9jaGFubmVsLW9uLXZpZXctc3RyZWFtLWluZm9cIiA+b25WaWV3U3RyZWFtSW5mbzwvYT4uIDwvcD5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+UmVnaXN0ZXJpbmcgYSBOZXcgQ2hhbm5lbCBJbnN0YW5jZTwvaDQ+XCJdXG4gICAqIFNweW5lQXBwLnJlZ2lzdGVyKG5ldyBDaGFubmVsKFwiQ0hBTk5FTF9NWUNIQU5ORUxcIik7XG4gICAqXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ0hBTk5FTF9OQU1FXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGlzIGpzb24gb2JqZWN0IHRha2VzIGluIHBhcmFtZXRlcnMgdG8gaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSB1bmRlZmluZWQ7IFRoaXMgd2lsbCBiZSB0aGUgcmVnaXN0ZXJlZCBuYW1lIGZvciB0aGlzIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcyAtID0ge307IFRoZSBwcm9wcyBvYmplY3RzIGFsbG93cyBmb3IgY3VzdG9tIHByb3BlcnRpZXMgZm9yIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgLSA9IGZhbHNlOyBQdWJsaXNoZXMgaXRzIG1vc3QgY3VycmVudCBwYXlsb2FkIHRvIGxhdGUgc3Vic2NyaWJlcnMsIHdoZW4gc2V0IHRvIHRydWUuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihDSEFOTkVMX05BTUUsIHByb3BzID0ge30pIHtcbiAgICB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zLmJpbmQodGhpcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKENIQU5ORUxfTkFNRSwgcHJvcHMuZXh0ZW5kZWRBY3Rpb25zQXJyKVxuXG4gICAgLy8gQmFzaWMgcHJvcHMgc2V0dXBcbiAgICBwcm9wcy5uYW1lID0gQ0hBTk5FTF9OQU1FXG4gICAgcHJvcHMuZGVmYXVsdEFjdGlvbnMgPSBwcm9wcy5kYXRhICE9PSB1bmRlZmluZWQgPyBbYCR7cHJvcHMubmFtZX1fRVZFTlRgXSA6IFtdXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG5cbiAgICB0aGlzLnByb3BzLmlzUmVnaXN0ZXJlZCA9IGZhbHNlXG4gICAgdGhpcy5wcm9wcy5pc1Byb3h5ID1cbiAgICAgIHRoaXMucHJvcHMuaXNQcm94eSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLnByb3BzLmlzUHJveHlcblxuICAgIC8vIERldGVybWluZSBhIGRlZmF1bHQgZnJvbSBwcmVzZW5jZSBvZiBwcm9wcy5kYXRhXG4gICAgY29uc3QgZGVmYXVsdENhY2hlZFBheWxvYWRCb29sID0gdGhpcy5wcm9wcy5kYXRhICE9PSB1bmRlZmluZWRcblxuICAgIC8vIElmIHByb3BzLnJlcGxheSBpcyBkZWZpbmVkLCBvdmVycmlkZSBzZW5kQ2FjaGVkUGF5bG9hZCB3aXRoIGl0LlxuICAgIC8vIE90aGVyd2lzZSwgdXNlIHRoZSBleGlzdGluZyBzZW5kQ2FjaGVkUGF5bG9hZCBwcm9wZXJ0eSBvciBkZWZhdWx0LlxuICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5yZXBsYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gdGhpcy5wcm9wcy5yZXBsYXlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9XG4gICAgICAgIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gZGVmYXVsdENhY2hlZFBheWxvYWRCb29sXG4gICAgICAgICAgOiB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsID0gbmV3IFJvdXRlQ2hhbm5lbFVwZGF0ZXIodGhpcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25NZXRob2RzKClcblxuICAgIC8vIFNldCB1cCBzdHJlYW1zXG4gICAgdGhpcy5zdHJlYW1zQ29udHJvbGxlciA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcFxuICAgIGNvbnN0IG9ic2VydmVyJCA9IHRoaXMuZ2V0TWFpbk9ic2VydmVyKClcbiAgICB0aGlzLmNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlID0gQ2hhbm5lbC5jaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5vYnNlcnZlciQgPSB0aGlzLnByb3BzLm9ic2VydmVyID0gb2JzZXJ2ZXIkXG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gRElTUEFUQ0hFUlxuICAgIGNvbnN0IGRpc3BhdGNoZXJTdHJlYW0kID0gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRTdHJlYW0oJ0RJU1BBVENIRVInKVxuICAgIGNvbnN0IHBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSA9IHByb3BFcShwcm9wcy5uYW1lLCAnbmFtZScpXG4gICAgZGlzcGF0Y2hlclN0cmVhbSRcbiAgICAgIC5waXBlKGZpbHRlcihwYXlsb2FkUHJlZEJ5Q2hhbm5lbE5hbWUpKVxuICAgICAgLnN1YnNjcmliZSgodmFsKSA9PiB0aGlzLm9uUmVjZWl2ZWRPYnNlcnZhYmxlKHZhbCkpXG4gIH1cblxuICBnZXRNYWluT2JzZXJ2ZXIoKSB7XG4gICAgaWYgKHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgZm9sbG93aW5nIGNoYW5uZWwsICR7dGhpcy5wcm9wcy5uYW1lfSwgYXBwZWFycyB0byBiZSByZWdpc3RlcmVkIGJlZm9yZSBTcHluZSBoYXMgYmVlbiBpbml0aWFsaXplZC5gKVxuICAgIH1cblxuICAgIGNvbnN0IHByb3h5RXhpc3RzID0gdGhpcy5zdHJlYW1zQ29udHJvbGxlci50ZXN0U3RyZWFtKHRoaXMucHJvcHMubmFtZSlcblxuICAgIGlmIChwcm94eUV4aXN0cyA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIuZ2V0UHJveHlTdWJqZWN0KHRoaXMucHJvcHMubmFtZSwgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPT09IHRydWUgPyBuZXcgUmVwbGF5U3ViamVjdCgxKSA6IG5ldyBTdWJqZWN0KClcbiAgICB9XG4gIH1cblxuICAvLyAgT1ZFUlJJREUgSU5JVElBTElaQVRJT04gTUVUSE9EXG4gIC8qKlxuICAgKiA8cD4oRGVwcmVjYXRlZC4gVXNlIG9uUmVnaXN0ZXJlZCkuIFRoaXMgbWV0aG9kIGlzIGVtcHR5IGFuZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgQ2hhbm5lbCBoYXMgYmVlbiByZWdpc3RlcmVkLjwvcD5cbiAgICogPHA+VGFza3Mgc3VjaCBhcyBzdWJzY3JpYmluZyB0byBvdGhlciBjaGFubmVscywgYW5kIHNlbmRpbmcgaW5pdGlhbCBwYXlsb2FkcyBjYW4gYmUgYWRkZWQgaGVyZS48L3A+XG4gICAqL1xuICBvbkNoYW5uZWxJbml0aWFsaXplZCgpIHtcblxuICB9XG5cbiAgLy8gIE9WRVJSSURFIElOSVRJQUxJWkFUSU9OIE1FVEhPRFxuICAvKipcbiAgICogPHA+VGhpcyBtZXRob2QgaXMgZW1wdHkgYW5kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBDaGFubmVsIGhhcyBiZWVuIHJlZ2lzdGVyZWQuPC9wPlxuICAgKiA8cD5UYXNrcyBzdWNoIGFzIHN1YnNjcmliaW5nIHRvIG90aGVyIGNoYW5uZWxzLCBhbmQgc2VuZGluZyBpbml0aWFsIHBheWxvYWRzIGNhbiBiZSBhZGRlZCBoZXJlLjwvcD5cbiAgICovXG4gIG9uUmVnaXN0ZXJlZChwcm9wcyA9IHRoaXMucHJvcHMpIHtcbiAgICBpZiAocHJvcHMuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBPYmplY3Qua2V5cyh0aGlzLmNoYW5uZWxBY3Rpb25zKVswXVxuICAgICAgLy8gY29uc29sZS5sb2coXCJDSEFOTkVMUyBBQ1RJT05TIElTIFwiLHRoaXMuY2hhbm5lbEFjdGlvbnMpO1xuICAgICAgLy8gT2JqZWN0KHRoaXMuY2hhbm5lbEFjdGlvbnMpLmtleXNbMF07XG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHByb3BzLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzUHJveHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaXNQcm94eVxuICB9XG5cbiAgZ2V0IGNoYW5uZWxOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLm5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKiByZXR1cm5zIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBmb3IgdGhlIGNoYW5uZWxcbiAgICovXG4gIGdldCBvYnNlcnZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlciRcbiAgfVxuXG4gIGNoZWNrRm9yVHJhaXRzKCkge1xuICAgIGNvbnN0IGFkZFRyYWl0cyA9ICh0cmFpdHMpID0+IHtcbiAgICAgIGlmICh0cmFpdHMuY29uc3RydWN0b3IubmFtZSAhPT0gJ0FycmF5Jykge1xuICAgICAgICB0cmFpdHMgPSBbdHJhaXRzXVxuICAgICAgfVxuICAgICAgY29uc3QgYWRkVHJhaXQgPSAoVHJhaXRDbGFzcykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFRyYWl0Q2xhc3ModGhpcylcbiAgICAgIH1cblxuICAgICAgdHJhaXRzLmZvckVhY2goYWRkVHJhaXQpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMudHJhaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFkZFRyYWl0cyh0aGlzLnByb3BzLnRyYWl0cylcbiAgICB9XG4gIH1cblxuICAvLyBETyBOT1QgT1ZFUlJJREUgVEhJUyBNRVRIT0RcbiAgaW5pdGlhbGl6ZVN0cmVhbSgpIHtcbiAgICB0aGlzLmNoZWNrRm9yVHJhaXRzKClcbiAgICB0aGlzLm9uQ2hhbm5lbEluaXRpYWxpemVkKClcbiAgICB0aGlzLmNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlKClcbiAgICB0aGlzLm9uUmVnaXN0ZXJlZCgpXG4gICAgdGhpcy5wcm9wcy5pc1JlZ2lzdGVyZWQgPSB0cnVlXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUocHJvcHMgPSB0aGlzLnByb3BzLCBhY3Rpb25zT2JqID0gdGhpcy5jaGFubmVsQWN0aW9ucykge1xuICAgIGNvbnN0IGFjdGlvbnNPYmpJc0VtcHR5ID0gaXNFbXB0eShhY3Rpb25zT2JqKVxuICAgIGNvbnN0IGRhdGFJc0FkZGVkID0gcHJvcCgnZGF0YScsIHByb3BzKSAhPT0gdW5kZWZpbmVkXG4gICAgY29uc3QgYXV0b1NldFRvQ2FjaGVkUGF5bG9hZCA9IGFjdGlvbnNPYmpJc0VtcHR5ID09PSB0cnVlICYmIGRhdGFJc0FkZGVkID09PSB0cnVlXG4gICAgY29uc3Qgc2V0RGVmYXVsdEFjdGlvbnNPYmogPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IG5hbWUgfSA9IHByb3BzXG4gICAgICBjb25zdCBhY3Rpb25TdHIgPSBgJHtuYW1lfV9FVkVOVGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFthY3Rpb25TdHJdIDogYWN0aW9uU3RyXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF1dG9TZXRUb0NhY2hlZFBheWxvYWQpIHtcbiAgICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gdHJ1ZVxuICAgICAgYWN0aW9uc09iaiA9IHNldERlZmF1bHRBY3Rpb25zT2JqKClcblxuICAgICAgaWYgKHRoaXMuY2hhbm5lbEFjdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNoYW5uZWxBY3Rpb25zID0gYWN0aW9uc09ialxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKFwiUFJPUFMgSVMgXCIse2FjdGlvbnNPYmpJc0VtcHR5LCBkYXRhSXNBZGRlZCwgcHJvcHMsIGFjdGlvbnNPYmp9LCB0aGlzLmNoYW5uZWxBY3Rpb25zKVxuICAgIHJldHVybiB7IHByb3BzLCBhY3Rpb25zT2JqIH1cbiAgfVxuXG4gIHNldFRyYWNlKGJvb2wpIHtcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKG5hbWUsIGV4dGVuZGVkQWN0aW9uc0FyciA9IFtdKSB7XG4gICAgY29uc3QgZ2V0QWN0aW9uVmFsID0gaWZFbHNlKGlzKFN0cmluZyksIGlkZW50aXR5LCBoZWFkKVxuICAgIGNvbnN0IG1haW5BcnIgPSBleHRlbmRlZEFjdGlvbnNBcnIuY29uY2F0KHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMobmFtZSkpXG4gICAgY29uc3QgYXJyID0gck1hcChnZXRBY3Rpb25WYWwsIG1haW5BcnIpXG4gICAgY29uc3QgY29udmVydGVyID0gc3RyID0+IG9iak9mKHN0ciwgc3RyKVxuICAgIGNvbnN0IG9iaiA9IG1lcmdlQWxsKGNoYWluKGNvbnZlcnRlciwgYXJyKSlcbiAgICB0aGlzLmNoYW5uZWxBY3Rpb25zID0gb2JqXG4gIH1cblxuICBjcmVhdGVDaGFubmVsQWN0aW9uTWV0aG9kcygpIHtcbiAgICBjb25zdCBkZWZhdWx0Rm4gPSAnb25WaWV3U3RyZWFtSW5mbydcbiAgICBjb25zdCBnZXRBY3Rpb25WYWwgPSBpZkVsc2UoaXMoU3RyaW5nKSwgaWRlbnRpdHksIGhlYWQpXG4gICAgY29uc3QgZGVsYXlDaGVja0lmVHJhaXRNZXRob2RIYXNCZWVuQWRkZWQgPSAobWV0aG9kU3RyLCB2YWwpID0+IHtcbiAgICAgIGNvbnN0IGRlbGF5ZXIgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpc1ttZXRob2RTdHJdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBcIiR7dGhpcy5wcm9wcy5uYW1lfVwiLCBSRVFVSVJFUyBUSEUgRk9MTE9XSU5HIE1FVEhPRCAke21ldGhvZFN0cn0gRk9SIEFDVElPTiwgJHt2YWxbMF19YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2luZG93LnNldFRpbWVvdXQoZGVsYXllciwgMTAwKVxuICAgIH1cblxuICAgIGNvbnN0IGdldEN1c3RvbU1ldGhvZCA9IHZhbCA9PiB7XG4gICAgICBjb25zdCBtZXRob2RTdHIgPSB2aWV3KGxlbnNJbmRleCgxKSwgdmFsKVxuICAgICAgZGVsYXlDaGVja0lmVHJhaXRNZXRob2RIYXNCZWVuQWRkZWQobWV0aG9kU3RyLCB2YWwpXG4gICAgICByZXR1cm4gbWV0aG9kU3RyXG4gICAgfVxuXG4gICAgY29uc3QgZ2V0QXJyTWV0aG9kID0gIGlmRWxzZShpcyhTdHJpbmcpLCBhbHdheXMoZGVmYXVsdEZuKSwgZ2V0Q3VzdG9tTWV0aG9kKVxuXG4gICAgY29uc3QgY3JlYXRlT2JqID0gdmFsID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGdldEFjdGlvblZhbCh2YWwpXG4gICAgICBjb25zdCBtZXRob2QgPSAgZ2V0QXJyTWV0aG9kKHZhbClcbiAgICAgIHJldHVybiBba2V5LCBtZXRob2RdXG4gICAgfVxuXG4gICAgdGhpcy5jaGFubmVsQWN0aW9uTWV0aG9kcyA9IGZyb21QYWlycyhyTWFwKGNyZWF0ZU9iaiwgdGhpcy5hZGRSZWdpc3RlcmVkQWN0aW9ucygpKSlcblxuICAgIC8vIGNvbnNvbGUubG9nKCd0aGUgY2hhbm5lbCBhY3Rpb24gbWV0aG9kcyAnLHRoaXMuY2hhbm5lbEFjdGlvbk1ldGhvZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPkNoYW5uZWxzIHNlbmQgYWxvbmcgQWN0aW9uIG5hbWVzIGFsb25nIHdpdGggaXRzIHBheWxvYWQuPC9wPlxuICAgKiA8cD5CZWZvcmUgYW55IGFjdGlvbiBjYW4gYmUgdXNlZCwgdGhhdCBhY3Rpb24gbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCB1c2luZyB0aGlzIG1ldGhvZC48L3A+XG4gICAqIDxwPlZpZXdTdHJlYW0gaW5zdGFuY2VzIGNhbiBmaWx0ZXIgQ2hhbm5lbFBheWxvYWRzIGJ5IGJpbmRpbmcgc3BlY2lmaWMgTElOS1snYWN0aW9ucyB0byBsb2NhbCBtZXRob2RzJywgJ3ZpZXctc3RyZWFtLWFkZC1hY3Rpb24tbGlzdGVuZXJzJ10uPC9wPlxuICAgKiA8cD5Gb3JjaW5nIHJlZ2lzdHJhdGlvbiBvZiBhY3Rpb25zIGFsbG93cyBTcHluZSB0byB2YWxpZGF0ZSBBY3Rpb25zLCBhbmQgaXMgYWxzbyBhIHVzZWZ1bCB3YXkgdG8ga2VlcCB0cmFjayBvZiBhbGwgQWN0aW9ucyB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkLjwvcD5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQXJyYXkgb2YgU3RyaW5nc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5SZWdpc3RlcmluZyBBY3Rpb25zIGluIHRoZSBhZGRSZWdpc3RlcmVkQWN0aW9ucyBtZXRob2Q8L2g0PlwiXVxuICAgKiAgICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICogICAgIHJldHVybiBbXG4gICAqICAgICAgICAnQ0hBTk5FTF9NWV9DSEFOTkVMX0VWRU5UJyxcbiAgICogICAgICAgICdDSEFOTkVMX01ZX0NIQU5ORUxfVVBEQVRFX0VWRU5UJ1xuICAgKiAgICAgICBdO1xuICAgKiAgICAgIH1cbiAgICpcbiAgICovXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIGxldCBhcnIgPSBbXVxuICAgIGlmIChwYXRoKFsncHJvcHMnLCAnZGF0YSddLCB0aGlzKSkge1xuICAgICAgYXJyID0gW2Ake3RoaXMucHJvcHMubmFtZX1fRVZFTlRgXVxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICBvblJlY2VpdmVkT2JzZXJ2YWJsZShvYmopIHtcbiAgICB0aGlzLm9uSW5jb21pbmdPYnNlcnZhYmxlKG9iailcbiAgfVxuXG4gIGdldEFjdGlvbk1ldGhvZEZvck9ic2VydmFibGUob2JqKSB7XG4gICAgb2JqLnVucGFja2VkID0gdHJ1ZVxuICAgIGNvbnN0IGRlZmF1bHRGbiA9IHRoaXMub25WaWV3U3RyZWFtSW5mby5iaW5kKHRoaXMpXG5cbiAgICBjb25zdCBtZXRob2RTdHIgPSBwYXRoKFsnZGF0YScsICdhY3Rpb24nXSwgb2JqKVxuICAgIGNvbnN0IG1ldGhvZFZhbCA9IHByb3AobWV0aG9kU3RyLCB0aGlzLmNoYW5uZWxBY3Rpb25NZXRob2RzKVxuXG4gICAgbGV0IGZuID0gZGVmYXVsdEZuXG5cbiAgICBpZiAobWV0aG9kVmFsICE9PSB1bmRlZmluZWQgJiYgbWV0aG9kVmFsICE9PSAnb25WaWV3U3RyZWFtSW5mbycpIHtcbiAgICAgIGNvbnN0IG1ldGhvZEV4aXN0cyA9IHR5cGVvZiAodGhpc1ttZXRob2RWYWxdKSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgaWYgKG1ldGhvZEV4aXN0cyA9PT0gdHJ1ZSkge1xuICAgICAgICBmbiA9IHRoaXNbbWV0aG9kVmFsXS5iaW5kKHRoaXMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuXG4gIH1cblxuICBvbkluY29taW5nT2JzZXJ2YWJsZShvYmopIHtcbiAgICBjb25zdCBlcXNOYW1lID0gZXF1YWxzKG9iai5uYW1lLCB0aGlzLnByb3BzLm5hbWUpXG4gICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQgfSA9IG9iai5kYXRhXG4gICAgLy8gY29uc29sZS5sb2coXCJJTkNPTUlORyBcIix7YWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50fSwge29ian0pO1xuICAgIGNvbnN0IG1lcmdlUHJvcHMgPSAoZCkgPT4gbWVyZ2VBbGwoW2QsIHsgYWN0aW9uOiBwcm9wKCdhY3Rpb24nLCBkKSB9LCBwcm9wKCdwYXlsb2FkJywgZCksIHByb3AoJ3NyY0VsZW1lbnQnLCBkKV0pXG4gICAgY29uc3QgZGF0YU9iaiA9IG9ic1ZhbCA9PiAoe1xuICAgICAgY2xvbmU6ICgpID0+IG1lcmdlUHJvcHMob2JqLmRhdGEpLFxuICAgICAgYWN0aW9uLFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHNyY0VsZW1lbnQsXG4gICAgICBldmVudDogb2JzVmFsXG4gICAgfSlcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAob2JqKSA9PiBvYmoub2JzZXJ2YWJsZS5waXBlKG1hcChkYXRhT2JqKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5nZXRBY3Rpb25NZXRob2RGb3JPYnNlcnZhYmxlKG9iaikpXG4gICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHt9XG4gICAgcmV0dXJuIGVxc05hbWUgPT09IHRydWUgPyBvblN1Y2Nlc3Mob2JqKSA6IG9uRXJyb3IoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIDxwPlZpZXdTdGVhbSBpbnN0YW5jZXMgY2FuIHNlbmQgaW5mbyB0byBjaGFubmVscyB0aHJvdWdoIGl0cyBMSU5LWydzZW5kSW5mb1RvQ2hhbm5lbCwgJ3ZpZXctc3RyZWFtLXNlbmQtaW5mby10by1jaGFubmVsJ10gbWV0aG9kLjwvcD5cbiAgICogPHA+RGF0YSByZWNlaXZlZCBmcm9tIFZpZXdTdHJlYW1zIGFyZSBkaXJlY3RlZCB0byB0aGlzIG1ldGhvZC48L3A+XG4gICAqIDxwPlZpZXdTdHJlYW1zIHNlbmQgZGF0YSB1c2luZyB0aGUgTElOS1snVmlld1N0cmVhbVBheWxvYWQnLCAndmlldy1zdHJlYW0tcGF5bG9hZCddIGZvcm1hdC48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbVBheWxvYWR9IG9ialxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5QYXJzaW5nIERhdGEgUmV0dXJuZWQgZnJvbSBhIFZpZXdTdHJlYW0gSW5zdGFuY2U8L2g0PlwiXVxuICAgKiBvblZpZXdTdHJlYW1JbmZvKG9iail7XG4gICAqICAgICBsZXQgZGF0YSA9IG9iai52aWV3U3RyZWFtSW5mbztcbiAgICogICAgIGxldCBhY3Rpb24gPSBkYXRhLmFjdGlvbjtcbiAgICogICAgIGxldCBuZXdQYXlsb2FkID0gdGhpcy5wYXJzZVZpZXdTdHJlYW1EYXRhKGRhdGEpO1xuICAgKiAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBuZXdQYXlsb2FkKTtcbiAgICogfVxuICAgKlxuICAgKlxuICAgKi9cbiAgb25WaWV3U3RyZWFtSW5mbyhvYnMpIHtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKlxuICAgKiA8cD5UaGlzIG1ldGhvZCB0YWtlcyBhbiBhY3Rpb24sIGEgZGF0YSBvYmplY3QgYW5kIG90aGVyIHByb3BlcnRpZXMgdG8gY3JlYXRlIGFuZCBwdWJsaXNoIGEgTElOS1snQ2hhbm5lbFBheWxvYWQnLCAnY2hhbm5lbC1wYXlsb2FkJ10gb2JqZWN0LjwvcD5cbiAgICogPHA+T25jZSB0aGUgYWN0aW9uIGFuZCBwYXlsb2FkIGlzIHZhbGlkYXRlZCwgdGhpcyBtZXRob2Qgd2lsbCBwdWJsaXNoIHRoZSBkYXRhIGJ5IHVzaW5nIHRoZSBjaGFubmVsJ3Mgc291cmNlIFN1YmplY3QgbmV4dCgpIG1ldGhvZC5cbiAgICogPHA+VGhpcyBjb25zaXN0ZW50IGZvcm1hdCBhbGxvd3Mgc3Vic2NyaWJlcnMgdG8gdW5kZXJzdGFuZCBob3cgdG8gcGFyc2UgYW55IGluY29taW5nIGNoYW5uZWwgZGF0YS48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc3JjRWxlbWVudFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudFxuICAgKiBAcGFyYW0ge09ic2VydmFibGV9IG9icyRcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGFjdGlvbiAtID0gdW5kZWZpbmVkOyBSZXF1aXJlZC4gQW4gYWN0aW9uIGlzIGEgc3RyaW5nLCB0eXBpY2FsbHkgaW4gdGhlIGZvcm1hdCBvZiBcIkNIQU5ORUxfTkFNRV9BQ1RJT05fTkFNRV9FVkVOVFwiLCBhbmQgdGhhdCBoYXMgYmVlbiBhZGRlZCBpbiB0aGUgYWRkUmVnaXN0ZXJlZEFjdGlvbnMgbWV0aG9kLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcGF5bG9hZCAtID0gdW5kZWZpbmVkOyBSZXF1aXJlZC4gVGhpcyBjYW4gYmUgYW55IGphdmFzY3JpcHQgb2JqZWN0IGFuZCBpcyB1c2VkIHRvIHNlbmQgYW55IGN1c3RvbSBkYXRhLlxuICAgKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50IC0gPSBOb3QgUmVxdWlyZWQuIHVuZGVmaW5lZDsgVGhpcyBjYW4gYmUgZWl0aGVyIHRoZSBlbGVtZW50IHJldHVybmVkIGZyb20gdGhlIFVJIENoYW5uZWwsIG9yIHRoZSBzcmNFbGVtZW50IGZyb20gYSBWaWV3U3RyZWFtIGluc3RhbmNlLlxuICAgKiBAcHJvcGVydHkge1VJRXZlbnR9IGV2ZW50IC0gPSB1bmRlZmluZWQ7IE5vdCBSZXF1aXJlZC4gVGhpcyB3aWxsIGJlIGRlZmluZWQgaWYgdGhlIGV2ZW50IGlzIGZyb20gdGhlIFVJIENoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7T2JzZXJ2YWJsZX0gb2JzJCAtID0gdGhpcy5vYnNlcnZlcjsgVGhpcyBkZWZhdWx0IGlzIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBmb3IgdGhpcyBjaGFubmVsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0PlB1Ymxpc2hpbmcgYSBDaGFubmVsUGF5bG9hZDwvaDQ+J11cbiAgICogbGV0IGFjdGlvbiA9IFwiQ0hBTk5FTF9NWV9DSEFOTkVMX1JFR0lTVEVSRURfQUNUSU9OX0VWRU5UXCI7XG4gICAqIGxldCBkYXRhID0ge2ZvbzpcImJhclwifTtcbiAgICogdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBkYXRhKTtcbiAgICpcbiAgICovXG4gIHNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQgPSB7fSwgZXZlbnQgPSB7fSwgb2JzJCA9IHRoaXMub2JzZXJ2ZXIkKSB7XG4gICAgLy8gTUFLRVMgQUxMIENIQU5ORUwgQkFTRSBBTkQgREFUQSBTVFJFQU1TIENPTlNJU1RFTlRcblxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkSXRlbSA9IG5ldyBDaGFubmVsUGF5bG9hZCh0aGlzLnByb3BzLm5hbWUsIGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gICAgLy8gY29uc29sZS5sb2coXCJDSEFOTkVMIFNUUkVFTSBJVEVNIFwiLGNoYW5uZWxQYXlsb2FkSXRlbSk7XG5cbiAgICAvLyBjb25zdCBvbk5leHRGcmFtZSA9ICgpPT5vYnMkLm5leHQoY2hhbm5lbFBheWxvYWRJdGVtKTtcbiAgICAvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUob25OZXh0RnJhbWUpXG5cbiAgICBvYnMkLm5leHQoY2hhbm5lbFBheWxvYWRJdGVtKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIDxwPkFsbG93cyBjaGFubmVscyB0byBzdWJzY3JpYmUgdG8gb3RoZXIgY2hhbm5lbHMuPC9wPlxuICAgKiA8cD5UaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzb3VyY2UgcnhqcyBTdWJqZWN0IGZvciB0aGUgcmVxdWVzdGVkIENoYW5uZWwsIHdoaWNoIGNhbiBiZSBsaXN0ZW5lZCB0byBieSBjYWxsaW5nIGl0cyBzdWJzY3JpYmUgbWV0aG9kLjwvcD5cbiAgICogPHA+S25vd2xlZGdlIG9mIHJ4anMgaXMgbm90IHJlcXVpcmVkIHRvIHN1YnNjcmliZSB0byBhbmQgcGFyc2UgQ2hhbm5lbCBkYXRhLjwvcD5cbiAgICogPHA+QnV0IGFjY2Vzc2luZyB0aGUgcnhqcyBTdWJqZWN0IGdpdmVzIGRldmVsb3BlcnMgdGhlIGFiaWxpdHkgdG8gdXNlIGFsbCBvZiB0aGUgYXZhaWxhYmxlIHJ4anMgbWFwcGluZyBhbmQgb2JzZXJ2YWJsZSB0b29scy48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZSBUaGUgcmVnaXN0ZXJlZCBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbC5cbiAgICogQHJldHVybnNcbiAgICogVGhlIHNvdXJjZSByeGpzIFN1YmplY3Qgb2YgdGhlIHJlcXVlc3RlZCBjaGFubmVsLlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5TdWJzY3JpYmluZyB0byBhIENoYW5uZWwgVXNpbmcgdGhlIGdldENoYW5uZWwgbWV0aG9kPC9oND5cIl1cbiAgICogbGV0IHJvdXRlJCA9IHRoaXMuZ2V0Q2hhbm5lbChcIkNIQU5ORUxfUk9VVEVcIilcbiAgICogcm91dGUkLnN1YnNjcmliZShsb2NhbE1ldGhvZCk7XG4gICAqXG4gICAqXG4gICAqL1xuICBnZXRDaGFubmVsKGNoYW5uZWxOYW1lLCBwYXlsb2FkRmlsdGVyKSB7XG4gICAgY29uc3QgaXNWYWxpZENoYW5uZWwgPSBjID0+IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcygpLmluY2x1ZGVzKGMpXG4gICAgY29uc3QgZXJyb3IgPSBjID0+IGNvbnNvbGUud2FybihcbiAgICAgICAgYGNoYW5uZWwgbmFtZSAke2N9IGlzIG5vdCB3aXRoaW4gJHtyZWdpc3RlcmVkU3RyZWFtTmFtZXN9YClcbiAgICBjb25zdCBzdGFydFN1YnNjcmliZSA9IChjKSA9PiB7XG4gICAgICBjb25zdCBvYnMkID0gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRTdHJlYW0oYykub2JzZXJ2ZXJcbiAgICAgIGlmIChwYXlsb2FkRmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9icyQucGlwZShmaWx0ZXIocGF5bG9hZEZpbHRlcikpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYnMkXG4gICAgfVxuICAgIGNvbnN0IGZuID0gaWZFbHNlKGlzVmFsaWRDaGFubmVsLCBzdGFydFN1YnNjcmliZSwgZXJyb3IpXG4gICAgcmV0dXJuIGZuKGNoYW5uZWxOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIENoYW5uZWxzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGZvcmtKb2luIENoYW5uZWwub2JzZXJ2ZXIkXG4gICAqXG4gICAqICovXG5cbiAgbWVyZ2VDaGFubmVscyhjaGFubmVsc0FyciwgZW1pdE9uY2UgPSB0cnVlKSB7XG4gICAgLy8gMSkgTm9ybWFsaXplIGlucHV0cyB0byBPYnNlcnZhYmxlc1xuICAgIGNvbnN0IGNoYW5uZWxPYnNlcnZhYmxlcyA9IGNoYW5uZWxzQXJyLm1hcChpdGVtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgY2hhbiQgPSB0aGlzLmdldENoYW5uZWwoaXRlbSlcbiAgICAgICAgcmV0dXJuIGVtaXRPbmNlID8gY2hhbiQucGlwZSh0YWtlKDEpKSA6IGNoYW4kXG4gICAgICB9XG4gICAgICByZXR1cm4gZW1pdE9uY2UgPyBpdGVtLnBpcGUodGFrZSgxKSkgOiBpdGVtXG4gICAgfSlcblxuICAgIC8vIDIpIENvbWJpbmUgdGhlbVxuICAgIGxldCBjb21iaW5lZCRcbiAgICBpZiAoZW1pdE9uY2UpIHsgLy8gb25l4oCRc2hvdDogc25hcHNob3QgdGhlbiBjb21wbGV0ZVxuICAgICAgY29tYmluZWQkID0gZm9ya0pvaW4oY2hhbm5lbE9ic2VydmFibGVzKVxuICAgIH0gZWxzZSB7IC8vIGxpdmUgdXBkYXRlczogY29tYmluZUxhdGVzdFdpdGhcbiAgICAgIGlmIChjaGFubmVsT2JzZXJ2YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbWJpbmVkJCA9IEVNUFRZXG4gICAgICB9IGVsc2UgaWYgKGNoYW5uZWxPYnNlcnZhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29tYmluZWQkID0gY2hhbm5lbE9ic2VydmFibGVzWzBdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbZmlyc3QkLCAuLi5yZXN0JF0gPSBjaGFubmVsT2JzZXJ2YWJsZXNcbiAgICAgICAgY29tYmluZWQkID0gZmlyc3QkLnBpcGUoY29tYmluZUxhdGVzdFdpdGgoLi4ucmVzdCQpKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMpIE1hcCBhcnJheSDihpIga2V5ZWQgb2JqZWN0XG4gICAgcmV0dXJuIGNvbWJpbmVkJC5waXBlKFxuICAgICAgbWFwKHJlc3VsdHNBcnIgPT4ge1xuICAgICAgICBjb25zdCBvYmogPSB7fVxuICAgICAgICBjaGFubmVsc0Fyci5mb3JFYWNoKChpdGVtLCBpZHgpID0+IHtcbiAgICAgICAgICBjb25zdCBrZXkgPSB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgPyBpdGVtIDogYGNoYW5uZWxfJHtpZHh9YFxuICAgICAgICAgIG9ialtrZXldID0gcmVzdWx0c0FycltpZHhdXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBvYmpcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yTm90VHJhY2tGbGFnKHByb3BzID0ge30pIHtcbiAgICBpZiAocHJvcHMuZG9Ob3RUcmFjayA9PT0gdHJ1ZSkge1xuICAgICAgU3B5bmVBcHBQcm9wZXJ0aWVzLmRvTm90VHJhY2tDaGFubmVsKHByb3BzLmNoYW5uZWxOYW1lKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBjb21wb3NlLCBwYXRoLCBpcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5cbi8vIGNvbnNvbGUubG9nKCdjaGFubmVscyBjb25maWcgbG9hZGVkICcsUixSeCk7XG5jb25zdCByZWdpc3RlcmVkU3RyZWFtTmFtZXMgPSAoKSA9PiAoe1xuICBpbmNsdWRlczogICgpID0+IFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSA/IFNweW5lQXBwUHJvcGVydGllcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKCkgOiBbJ0NIQU5ORUxfUk9VVEUnLCAnQ0hBTk5FTF9VSScsICdDSEFOTkVMX1dJTkRPVycsICdESVNQQVRDSEVSJ11cblxufSlcblxuLy8gZ2V0R2xvYmFsT2JqKCkuY2hhbm5lbHNMaXN0QXJyO1xuY29uc3QgcmVnaXN0ZXJlZFN0ZXBzID0gWydMT0FEJywgJ1JFTkRFUicsICdNT1VOVCcsICdVTk1PVU5UJywgJ0RJU1BPU0UnLCAnR0FSQkFHRV9DT0xMRUNUJywgJ1VQREFURSddXG5jb25zdCByZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzID0gWydwYXJlbnQnLCAnc2VsZicsICdjaGlsZCcsICdjaGlsZHJlbicsICd2aWV3J11cbmNvbnN0IHJlZ2lzdGVyZWRTdHJlYW1UeXBlcyA9IFsnT2JzZXJ2YWJsZScsICdCZWhhdmlvclN1YmplY3QnLCAnU3ViamVjdCcsICdPYnNlcnZlcicsICdTdWJzY3JpYmVyJywgJ0Zyb21FdmVudE9ic2VydmFibGUnXVxuY29uc3QgcmVnaXN0ZXJlZEFjdGlvbnMgPSBbJ3N1YnNjcmliZScsICdjb21iaW5lTGF0ZXN0J11cbmNvbnN0IGdldFJ4VHlwZSA9IChvYnMpID0+IG9icygpLmNvbnN0cnVjdG9yLm5hbWVcbi8vIGxldCBnZXRPYnNlcnZhYmxlVHlwZSA9IChvYnMpID0+IG9icy5jb25zdHJ1Y3Rvci5uYW1lO1xuY29uc3QgY29uZmlybU9ic2VydmFibGUgPSAob2JzKSA9PiBvYnMuc3Vic2NyaWJlICE9PSB1bmRlZmluZWRcbi8vIGxldCBwdWxsTWFpblJvdXRlID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oXFwvPykoLiopKFxcLykoLiopL2csICckMicpO1xubGV0IGJhc2VWYWxpZGF0aW9ucyA9IFtdOyBsZXQgdmlld0luZm9WYWxpZGF0aW9ucyA9IFtdOyBsZXQgdWlWYWxpZGF0aW9ucyA9IFtdXG5sZXQgbGlmZXN0cmVhbVZhbGlkYXRpb25zID0gW107IGxldCBzdGVwVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtdXG5sZXQgcm91dGVWYWxpZGF0aW9ucyA9IFtdOyBsZXQgU3RyZWFtc0NvbmZpZyA9IFtdXG5cbmlmIChjb21wb3NlICE9PSB1bmRlZmluZWQgJiYgT2JzZXJ2YWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4vLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFMTCBWQUxJREFUSU9OUyBBREQgVEhFIEJBU0UgVkFMSURBVElPTlMgVEhST1VHSCBDT05DQVRFTkFUSU9OXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYmFzZVZhbGlkYXRpb25zID0gW1xuICAgIHtcbiAgICAgIGVycm9yOiBgbmVlZCB0byBtYXRjaCBhIHZhbGlkIG5hbWUgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgIH0sXG5cbiAgICB7XG4gICAgICBlcnJvcjogJ3BhcmFtIFxcJ29ic2VydmFibGVcXCcgbXVzdCBjb250YWluIGEgdmFsaWQgT2JzZXJ2YWJsZScsXG4gICAgICAvLyBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbVR5cGVzLmluY2x1ZGVzKGdldE9ic2VydmFibGVUeXBlKHBheWxvYWQub2JzZXJ2YWJsZSkpXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gY29uZmlybU9ic2VydmFibGUocGF5bG9hZC5vYnNlcnZhYmxlKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6ICdwYXJhbSBhY3Rpb24gbXVzdCBiZSBhIHJlZ2lzdGVyZWQgYWN0aW9uJyxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkQWN0aW9ucy5pbmNsdWRlcyhwYXlsb2FkLmFjdGlvbilcbiAgICB9XG5cbiAgXVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRIRVNFIFZBTElEQVRJT05TIEFSRSBDT05DQVRFTkFURUQgV0hFTiBUSEUgT0JTRVJWQUJMRSBSRUZFUlMgVE8gQSBWSUVXXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmlld0luZm9WYWxpZGF0aW9ucyA9IFtcbiAgICB7XG4gICAgICBlcnJvcjogJ25lZWRzIHZzaWQgbnVtYmVyIGluIHNyY0VsZW1lbnQnLFxuICAgICAgcHJlZGljYXRlOiBjb21wb3NlKGlzKFN0cmluZyksIHBhdGgoWydkYXRhJywgJ3NyY0VsZW1lbnQnLCAndnNpZCddKSlcbiAgICB9LFxuICAgIHtcbiAgICAgIGVycm9yOiAnbmVlZHMgYSBpZCBpbiBzcmNFbGVtZW50JyxcbiAgICAgIHByZWRpY2F0ZTogY29tcG9zZShpcyhTdHJpbmcpLFxuICAgICAgICBwYXRoKFsnZGF0YScsICdzcmNFbGVtZW50JywgJ2lkJ10pKVxuICAgIH1cbiAgXVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk8gU1BFQ0lGSUMgVUkgVkFMSURBVElPTlMgQVQgVEhJUyBUSU1FIC0tIElUIEpVU1QgQUREIE9USEVSU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHVpVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCB1aVZhbGlkYXRpb25zID0gW11cbiAgICByZXR1cm4gdWlWYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKS5jb25jYXQodmlld0luZm9WYWxpZGF0aW9ucylcbiAgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5PIFNQRUNJRklDIExJRkVTVFJFQU0gVkFMSURBVElPTlMgQVQgVEhJUyBUSU1FIC0tIElUIEpVU1QgQUREIE9USEVSU1xuICBjb25zdCBsaWZlU3RyZWFtVmFsaWRhdGlvbnMgPSBbXG5cbiAgICB7XG4gICAgICBlcnJvcjogYG5lZWQgdG8gbWF0Y2ggYSB2YWxpZCBuYW1lIHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1UeXBlc31gLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcygpLmluY2x1ZGVzKHBheWxvYWQubmFtZSlcbiAgICB9LFxuXG4gICAge1xuICAgICAgZXJyb3I6IGBuZWVkcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdGVwIHN0cmluZ3M6ICR7cmVnaXN0ZXJlZFN0ZXBzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0ZXBzLmluY2x1ZGVzKHBheWxvYWQuU1RFUClcbiAgICB9LFxuICAgIHtcbiAgICAgIGVycm9yOiBgdHlwZSBuZWVkcyB0byBvbmUgb2YgdGhlIGZvbGxvd2luZzogJHtyZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZExpZmVTdHJlYW1UeXBlcy5pbmNsdWRlcyhwYXlsb2FkLnR5cGUpXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGVycm9yOiAndmlld0lkIG5lZWRzIHRvIGJlIGFkZGVkICcsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC52aWV3SWQgIT09IHVuZGVmaW5lZFxuICAgIH1cbiAgXVxuXG4gIHN0ZXBWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBWYWxpZGF0aW9ucyA9IFtdXG4gICAgcmV0dXJuIHN0ZXBWYWxpZGF0aW9ucy5jb25jYXQobGlmZVN0cmVhbVZhbGlkYXRpb25zKVxuICB9XG5cbiAgc3RlcERpc3Bvc2VWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdESVNQT1NFIFNURVAgcmVxdWlyZXMgYSBkaXNwb3NlSXRlbSBwYXJhbSBpbiB0aGUgZGF0YSBvYmplY3QnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC5TVEVQID09PSAnRElTUE9TRScgJiZcbiAgICAgICAgICAgIHBheWxvYWQuZGF0YS5kaXNwb3NlSXRlbXMgIT09IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIF1cbiAgICByZXR1cm4gc3RlcFVwZGF0ZVZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cblxuICBzdGVwVXBkYXRlVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzdGVwVXBkYXRlVmFsaWRhdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIGVycm9yOiAnVVBEQVRFIFNURVAgcmVxdWlyZXMgYSBkYXRhIG9iamVjdCAnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC5TVEVQID09PSAnVVBEQVRFJyAmJiBwYXlsb2FkLmRhdGEgIT09XG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgIH1cbiAgICBdXG4gICAgcmV0dXJuIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucy5jb25jYXQobGlmZVN0cmVhbVZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gbGlmZXN0cmVhbVZhbGlkYXRpb25zXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGlmZXN0cmVhbVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGxpZmVTdHJlYW1WYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKVxuICAgICAgLmNvbmNhdCh2aWV3SW5mb1ZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSEVSRSBJUyBUSEUgUk9VVEUgVkFMSURBVElPTlNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByb3V0ZVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgcm91dGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIC8qXG4gICAgICAqXG4gICAgICB7XG4gICAgICAgICAgZXJyb3I6IGBuZWVkcyBhIHZhbGlkIHJvdXRlIHN0cmluZyB3aXRoaW4gWyR7cmVnaXN0ZXJlZFJvdXRlc31dYCxcbiAgICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFJvdXRlcy5pbmNsdWRlcyhwdWxsTWFpblJvdXRlKHBheWxvYWQuZGF0YS5uYXZpZ2F0ZVRvKSlcbiAgICAgIH1cbiAgICAgICpcbiAgICAgICovXG5cbiAgICBdXG4gICAgcmV0dXJuIHJvdXRlVmFsaWRhdGlvbnMuY29uY2F0KGJhc2VWYWxpZGF0aW9ucykuY29uY2F0KHZpZXdJbmZvVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKlxuICAqIFRIRSBJREVBIE9GIFN0cmVhbXNDb25maWcgSVMgVE8gQ09NUExFVEVMWSBHRU5FUkFURSBBTEwgQVBQIFNUUkVBTVMgVVNJTkcgVEhJUyBPQkpFQ1RcbiAgKiBUSElTIEhBUyBOT1QgQkVFTiBJTVBMRU1FTlRFRCAtLSBNQVkgQkUgQURERUQgSU4gQSBGVVRVUkUgVkVSU0lPTlxuICAqL1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFN0cmVhbXNDb25maWcgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzdHJlYW1WYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBcXCduYW1lXFwnIG11c3QgYmUgb2YgYSByZWdpc3RlcmVkIHR5cGUnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBcXCdvYnNlcnZhYmxlXFwnIG11c3QgY29udGFpbiBhIHZhbGlkIE9ic2VydmFibGUnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbVR5cGVzLmluY2x1ZGVzKFxuICAgICAgICAgIGdldFJ4VHlwZShwYXlsb2FkLm9ic2VydmFibGUpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBhY3Rpb24gbXVzdCBiZSBhIHJlZ2lzdGVyZWQgYWN0aW9uJyxcbiAgICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRBY3Rpb25zLmluY2x1ZGVzKHBheWxvYWQuYWN0aW9uKVxuICAgICAgfVxuXG4gICAgXVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVhbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6ICdESVNQQVRDSEVSJyxcbiAgICAgICAgICAgIG9ic2VydmFibGU6ICgpID0+IG5ldyBTdWJqZWN0KCksXG4gICAgICAgICAgICBhY3Rpb246ICdzdWJzY3JpYmUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIG9ic2VydmFibGU6IE9ic2VydmFibGUgfHwgU3ViamVjdCxcbiAgICAgICAgICAgIGFjdGlvbjogU3RyaW5nXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2YWxpZGF0aW9uczogc3RyZWFtVmFsaWRhdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6ICdVQlUnLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogKCkgPT4gbmV3IFN1YmplY3QoKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ3N1YnNjcmliZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cnVjdHVyZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZSB8fCBTdWJqZWN0LFxuICAgICAgICAgICAgYWN0aW9uOiBTdHJpbmdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRpb25zOiBzdHJlYW1WYWxpZGF0aW9uc1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9XG59XG5leHBvcnQge1xuICBzdGVwRGlzcG9zZVZhbGlkYXRpb25zLCBzdGVwVXBkYXRlVmFsaWRhdGlvbnMsIHN0ZXBWYWxpZGF0aW9ucywgdWlWYWxpZGF0aW9ucywgcm91dGVWYWxpZGF0aW9ucywgbGlmZXN0cmVhbVZhbGlkYXRpb25zLCByZWdpc3RlcmVkU3RyZWFtTmFtZXMsIFN0cmVhbXNDb25maWdcbn1cbiIsImltcG9ydCB7IFNweW5lQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsVUkgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtdWkuanMnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxXaW5kb3cgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtd2luZG93LmpzJ1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsTGlmZWN5Y2xlIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLWxpZmVjeWNsZS5qcydcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBDaGFubmVsUHJveHkgfSBmcm9tICcuL2NoYW5uZWwtcHJveHkuanMnXG5pbXBvcnQgeyBwcm9wRXEsIHBsdWNrLCBwcm9wLCBmaWx0ZXIsIHBhdGhFcSwgcmVqZWN0LCBjb21wb3NlLCBqb2luLCBtYXAgYXMgck1hcCB9IGZyb20gJ3JhbWRhJ1xuXG5jb25zdCBfbWFwID0gbmV3IE1hcCgpXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsc01hcCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxzRGVsZWdhdG9yXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgb2JqZWN0IGNyZWF0ZXMgdGhlIGxvZ2ljIHNvIHRoYXQgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW1zIGNhbiBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXJcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICBfbWFwLnNldCgnRElTUEFUQ0hFUicsIG5ldyBTdWJqZWN0KCkpXG4gICAgdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzID0gQ2hhbm5lbHNNYXAubGlzdFJlZ2lzdGVyZWRDaGFubmVscy5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRDaGFubmVsc0xpc3QgPSBDaGFubmVsc01hcC5nZXRDaGFubmVsc0xpc3QuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IG1hcCgpIHtcbiAgICByZXR1cm4gX21hcFxuICB9XG5cbiAgc3RhdGljIGdldENoYW5uZWxzTGlzdCgpIHtcbiAgICBjb25zdCBwcm94eU1hcEZuID0gIChrLCB2KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBrWzBdXG4gICAgICBjb25zdCB2YWwgPSBrWzFdLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgIHJldHVybiB7IGtleSwgdmFsIH1cbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oX21hcCwgcHJveHlNYXBGbilcbiAgfVxuXG4gIHN0YXRpYyBsaXN0UmVnaXN0ZXJlZENoYW5uZWxzKHNob3dPbmx5UHJveGllcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgcHJveHlNYXAgPSB0aGlzLmdldENoYW5uZWxzTGlzdCgpXG4gICAgY29uc3QgcmVqZWN0UHJveHlGbiA9IHJlamVjdChwcm9wRXEoJ0NoYW5uZWxQcm94eScsICd2YWwnKSlcbiAgICBjb25zdCBmaWx0ZXJQcm94eUZuID0gZmlsdGVyKHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZuID0gc2hvd09ubHlQcm94aWVzID09PSB0cnVlID8gZmlsdGVyUHJveHlGbiA6IHJlamVjdFByb3h5Rm5cbiAgICBjb25zdCByZW1vdmVkUHJveHlBcnIgPSBmbihwcm94eU1hcClcbiAgICByZXR1cm4gcGx1Y2soWydrZXknXSwgcmVtb3ZlZFByb3h5QXJyKVxuICB9XG5cbiAgbGlzdFByb3h5Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscyh0cnVlKVxuICB9XG5cbiAgY2hlY2tGb3JNaXNzaW5nQ2hhbm5lbHMoKSB7XG4gICAgY29uc3QgcHJveHlNYXAgPSB0aGlzLmdldENoYW5uZWxzTGlzdCgpXG4gICAgY29uc3QgZmlsdGVyUHJveHlGbiA9IGZpbHRlcihwcm9wRXEoJ0NoYW5uZWxQcm94eScsICd2YWwnKSlcbiAgICBjb25zdCBmaWx0ZXJQcm94eUFyciA9IGZpbHRlclByb3h5Rm4ocHJveHlNYXApXG5cbiAgICBpZiAoZmlsdGVyUHJveHlBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWxTdHIgPSBmaWx0ZXJQcm94eUFyci5sZW5ndGggPT09IDEgPyAnQ2hhbm5lbCBoYXMnIDogJ0NoYW5uZWxzIGhhdmUnXG4gICAgICBjb25zdCBjaGFubmVscyA9IGNvbXBvc2Uoam9pbignLCAnKSwgck1hcChwcm9wKCdrZXknKSkpKGZpbHRlclByb3h5QXJyKVxuICAgICAgY29uc3QgZmlsdGVyUHJlZml4V2FybmluZyA9IGBTcHluZSBXYXJuaW5nOiBUaGUgZm9sbG93aW5nICR7Y2hhbm5lbFN0cn0gbm90IGJlZW4gaW5pdGlhbGl6ZWQ6ICR7Y2hhbm5lbHN9YFxuICAgICAgY29uc29sZS53YXJuKGZpbHRlclByZWZpeFdhcm5pbmcpXG4gICAgfVxuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLmNyZWF0ZU1haW5TdHJlYW1zKClcbiAgfVxuXG4gIGNyZWF0ZU1haW5TdHJlYW1zKCkge1xuICAgIHRoaXMucm91dGVTdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsUm91dGUoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX1JPVVRFJywgdGhpcy5yb3V0ZVN0cmVhbSlcblxuICAgIHRoaXMudWlTdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsVUkoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX1VJJywgdGhpcy51aVN0cmVhbSlcblxuICAgIHRoaXMuZG9tU3RyZWFtID0gbmV3IFNweW5lQ2hhbm5lbFdpbmRvdygpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfV0lORE9XJywgdGhpcy5kb21TdHJlYW0pXG5cbiAgICB0aGlzLnZpZXdTdHJlYW1MaWZlY3ljbGUgPSBuZXcgU3B5bmVDaGFubmVsTGlmZWN5Y2xlKClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9MSUZFQ1lDTEUnLCB0aGlzLnZpZXdTdHJlYW1MaWZlY3ljbGUpXG5cbiAgICB0aGlzLnJvdXRlU3RyZWFtLmluaXRpYWxpemVTdHJlYW0oKVxuICAgIHRoaXMuZG9tU3RyZWFtLmluaXRpYWxpemVTdHJlYW0oKVxuICB9XG5cbiAgYWRkS2V5RXZlbnQoa2V5KSB7XG4gICAgX21hcC5nZXQoJ1VJJykuYWRkS2V5RXZlbnQoa2V5KVxuICB9XG5cbiAgcmVnaXN0ZXJTdHJlYW0odmFsKSB7XG4gICAgY29uc3QgbmFtZSA9IHZhbC5jaGFubmVsTmFtZVxuICAgIGNvbnN0IG5hbWVFeGlzdHMgPSBfbWFwLmhhcyhuYW1lKVxuICAgIGlmIChuYW1lRXhpc3RzKSB7XG4gICAgICBjb25zdCBpc0FscmVhZHlSZWdpc3RlcmQgPSBjb21wb3NlKHBhdGhFcShbJ3Byb3BzJywgJ2lzUmVnaXN0ZXJlZCddLCB0cnVlKSkoX21hcC5nZXQobmFtZSkpXG4gICAgICBpZiAoaXNBbHJlYWR5UmVnaXN0ZXJkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIENoYW5uZWwsICR7bmFtZX0sIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCFgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbWFwLnNldChuYW1lLCB2YWwpXG4gICAgdmFsLmluaXRpYWxpemVTdHJlYW0oKVxuICB9XG5cbiAgZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKSB7XG4gICAgcmV0dXJuIF9tYXAuZ2V0KHN0cikuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKVxuICB9XG5cbiAgZ2V0UHJveHlTdWJqZWN0KG5hbWUsIGlzUmVwbGF5U3ViamVjdCA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3ViamVjdFR5cGUgPSBpc1JlcGxheVN1YmplY3QgPT09IHRydWUgPyAncmVwbGF5U3ViamVjdCcgOiAnc3ViamVjdCdcblxuICAgIHJldHVybiBfbWFwLmdldChuYW1lKVtzdWJqZWN0VHlwZV1cbiAgfVxuXG4gIHRlc3RTdHJlYW0obmFtZSkge1xuICAgIHJldHVybiBfbWFwLmdldChuYW1lKSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICBnZXRTdHJlYW0obmFtZSkge1xuICAgIGlmICh0aGlzLnRlc3RTdHJlYW0obmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICBfbWFwLnNldChuYW1lLCBuZXcgQ2hhbm5lbFByb3h5KG5hbWUpKVxuICAgIH1cblxuICAgIHJldHVybiBfbWFwLmdldChuYW1lKVxuICB9XG5cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBDT1JFIERFQ09SQVRPUlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIGxldCBjb3JlTWl4aW5zID0gIGJhc2VDb3JlTWl4aW5zKCk7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIFNUUkVBTVMgREVDT1JBVE9SU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IHN0cmVhbXNNaXhpbnMgPSBCYXNlU3RyZWFtc01peGlucygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsTGlmZWN5Y2xlIGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lQ2hhbm5lbExpZmVjeWNsZVxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIENoYW5uZWwgdGhhdCBwdWJsaXNoZXMgcmVuZGVyaW5nIGFuZCBkaXNwb3NpbmcgZXZlbnRzIG9mIGFsbCBWaWV3U3RyZWFtcyB3aG9zZSBwcm9wZXJ0eSwgcHJvcGVyLnNlbmRMaWZlY3ljbGVFdmVudHMgaXMgc2V0IHRvIHRydWUuXG4gICAqXG4gICAqIDxoMz5UaGUgdHdvIGFjdGlvbnMgdGhhdCBhcmUgcmVnc2l0ZXJlZCBmb3IgdGhpcyBjaGFubmVsIGFyZTo8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5DSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVDwvbGk+XG4gICAqIDxsaT5DSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVDwvbGk+XG4gICAqICA8L3VsPlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfTElGRUNZQ0xFJztcbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKCdDSEFOTkVMX0xJRkVDWUNMRScsIHByb3BzKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgb25WaWV3U3RyZWFtSW5mbyhvYmopIHtcbiAgICBjb25zdCB7IGFjdGlvbiwgc3JjRWxlbWVudCB9ID0gb2JqXG4gICAgY29uc3QgcGF5bG9hZCA9IHNyY0VsZW1lbnRcbiAgICBwYXlsb2FkLmFjdGlvbiA9IGFjdGlvblxuICAgIHRoaXMub25TZW5kRXZlbnQoYWN0aW9uLCBwYXlsb2FkKVxuICB9XG5cbiAgb25TZW5kRXZlbnQoYWN0aW9uU3RyLCBwYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zW2FjdGlvblN0cl1cbiAgICBjb25zdCBzcmNFbGVtZW50ID0ge31cbiAgICBjb25zdCBldmVudCA9IHVuZGVmaW5lZFxuICAgIGNvbnN0IGRlbGF5U3RyZWFtID0gKCkgPT4gdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICB3aW5kb3cuc2V0VGltZW91dChkZWxheVN0cmVhbSwgMClcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGUgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuaW1wb3J0IHtcbiAgcGljayxcbiAgZmluZCxcbiAgb21pdCxcbiAgb3ZlcixcbiAgbWVyZ2VSaWdodCxcbiAgaXMsXG4gIG9iak9mLFxuICBtZXJnZUFsbCxcbiAgcGF0aCxcbiAga2V5cyxcbiAgcHJvcCxcbiAgZXF1YWxzLFxuICBoZWFkLFxuICBjb21wb3NlLFxuICBsZW5zUHJvcCxcbiAgY2hhaW4sXG4gIHBpY2tBbGwsXG4gIGRlZmF1bHRUbyxcbiAgaXNFbXB0eSxcbiAgY29uY2F0LFxuICB3aGVuLFxuICBjb21wbGVtZW50LFxuICByZXZlcnNlLFxuICBjdXJyeU4sXG4gIF9fLFxuICB0ZXN0LFxuICByZXBsYWNlLFxuICB0b1BhaXJzLFxuICByZWR1Y2VcbiAgLCBmaWx0ZXIgYXMgcmFtZGFGaWx0ZXIsIG1lcmdlUmlnaHQgYXMgck1lcmdlXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsUm91dGUgZXh0ZW5kcyBDaGFubmVsIHtcbiAgY29uc3RydWN0b3IobmFtZSA9ICdDSEFOTkVMX1JPVVRFJywgcHJvcHMgPSB7fSkge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsUm91dGVcbiAgICAgKiBAdHlwZSBjb3JlXG4gICAgICpcbiAgICAgKiBAZGVzY1xuICAgICAqXG4gICAgICogPHA+VGhlIFNweW5lQ2hhbm5lbFJvdXRlIGhhcyB0aGUgdHdvIG1haW4gZHV0aWVzOlxuICAgICAqICA8dWw+XG4gICAgICogICA8bGk+Q29tYmluZSBkYXRhIHdpdGggdGhlIGN1cnJlbnQgd2luZG93IGxvY2F0aW9uIHRvIHVwZGF0ZSB0aGUgbG9jYXRpb24ncyBwYXRobmFtZS48L2xpPlxuICAgICAqICAgPGxpPkxpc3RlbiB0byB3aW5kb3cgbG9jYXRpb24gY2hhbmdlcyB0byB0cmFuc2xhdGUgdGhlIGxvY2F0aW9uIHBhdGhuYW1lIGludG8gYSBzZXJpZXMgb2YgbW9kZWwgcHJvcGVydGllcy48L2xpPlxuICAgICAqIDwvdWw+XG4gICAgICogPHA+SW4gYm90aCBjYXNlcywgdGhpcyBjaGFubmVsIHNlbmRzIGEgQ2hhbm5lbFBheWxvYWQgY29udGFpbmluZyB1cGRhdGVkIHJvdXRlIHByb3BlcnRpZXMuPC9wPlxuICAgICAqXG4gICAgICogPGgzPlRoZSB0d28gYWN0aW9ucyB0aGF0IGFyZSByZWdzaXRlcmVkIGZvciB0aGUgUm91dGUgY2hhbm5lbCBhcmU6PC9oMz5cbiAgICAgKiA8dWw+XG4gICAgICogPGxpPkNIQU5ORUxfUk9VVEVfREVFUExJTktfRVZFTlQ8L2xpPlxuICAgICAqIDxsaT5DSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVDwvbGk+XG4gICAgICogIDwvdWw+XG4gICAgICpcbiAgICAgKiAgICA8aDM+VGhlIFJvdXRlcyBDb25maWd1cmF0aW9uIE9iamVjdDwvaDM+XG4gICAgICogICAgPHA+VGhyIHJvdXRlcyBjb25maWd1cmF0aW9uIG9iamVjdCBpcyB1c2VkIHRvIG1hcCB0aGUgbG9jYXRpb24gc3RyaW5nIHRvIGFuZCBmcm9tIGEgcm91dGUgbW9kZWwuPC9wPlxuICAgICAqXG4gICAgICogICAgIDxwcmU+ICAgICAgICAgICB7XG4gICAgICogICAgICAgICAgICAgICAgcm91dGVQYXRoOiB7XG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU5hbWU6ICdsZXZlbE9uZVByb3AnLFxuICAgICAqICAgICAgICAgICAgICAgICAgcm91dGVPcHRpb24xOiAnYnJhbmNoaW5nLWVuZHMtaGVyZScsXG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU9wdGlvbjI6IHtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJvdXRlUGF0aDoge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZU5hbWU6ICdsZXZlbFR3b1Byb3AnLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MZXZlbDI6ICdsZXZlbC0yLWJyYW5jaC1lbmRzLWhlcmUnXG4gICAgICpcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgICAgICAgICB9XG4gICAgICogICAgICAgICAgICB9XG4gICAgICpcbiAgICAgKiAgICAgICAgICA8L3ByZT5cbiAgICAgKiAgICAgPHA+VGhpcyBjb25maWcgb2JqZWN0IGNvbnNpc3RzIG9mIG5lc3RlZCByb3V0ZVBhdGggb2JqZWN0cyB0aGF0IGNvcnJlc3BvbmRzIHRvIGFsbCBvZiB0aGUgYnJhbmNoaW5nIHBvc3NpYmxpdGllcyBmb3IgdGhlIGFwcC48L3A+XG4gICAgICogICAgPHA+VGhlIHJvdXRlTmFtZSB2YWx1ZSBpcyB0aGUgcHJvcGVydHkgbmFtZSBmb3IgZWFjaCByb3V0ZVBhdGguPC9wPlxuICAgICAqICAgIDxoMz5Sb3V0ZSBPcHRpb25zPC9oMz5cbiAgICAgKiAgICA8cD5BIHJvdXRlUGF0aCBtYXkgY29udGFpbiBzZXZlcmFsIHJvdXRlIG9wdGlvbiBrZXktdmFsdWUgcGFpcnMsIHdoaWNoIGlzIHVzZWQgdG8gbWFwIGJldHdlZW4gZGF0YSBhbmQgdGhlIHdpbmRvdyBsb2NhdGlvbi48L3A+XG4gICAgICogICAgPHVsIGNsYXNzPSdiYXNpYyc+XG4gICAgICogICAgICA8bGk+XG4gICAgICogICAgICAgICA8aDUgY2xhc3M9J2Jhc2ljJz5UaGUgUm91dGUgT3B0aW9uIEtleSAob3IgbGVmdCB2YWx1ZSk8L2g1PlxuICAgICAqICAgICAgICAgPHVsIGNsYXNzPSdkZWNpbWFsJz5cbiAgICAgKiAgICAgICAgIDxsaT5NYXBzIHRoZSB3aW5kb3cgbG9jYXRpb24gdG8gcm91dGUgZGF0YSBwcm9wZXJ0aWVzPC9saT5cbiAgICAgKiAgICAgICAgIDxsaT5UaGlzIGNoYW5uZWwgY2FuICdmaWxsIGluIHRoZSBibGFua3MnIHNvIHRoYXQgb25seSB0aGUgdXBkYXRlZCBsZXZlbCByb3V0ZU5hbWVzIGFyZSByZXF1aXJlZCB0byByZXZpc2UgdGhlIHdpbmRvdyBsb2NhdGlvbjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkNhbiBiZSBhIHJlZ2V4IHBhdHRlcm4gc28gdGhhdCBtdWx0aXBsZSBkYXRhIHByb3BlcnRpZXMgY2FuIHNoYXJlIHRoZSBzYW1lIGJyYW5jaGluZyBsb2dpYzwvbGk+XG4gICAgICogICAgICAgICAgPC91bD5cbiAgICAgKiAgICAgIDwvbGk+XG4gICAgICpcbiAgICAgKiAgICAgIDxsaT5cbiAgICAgKiAgICAgICAgICAgPGg1IGNsYXNzPSdiYXNpYyc+VGhlIFJvdXRlIE9wdGlvbiBWYWx1ZSAob3IgcmlnaHQgdmFsdWUpPC9oNT5cbiAgICAgKiAgICAgICAgICAgPHVsIGNsYXNzPSdkZWNpbWFsJz5cbiAgICAgKiAgICAgICAgICAgPGxpPk1hcHMgZGF0YSBwcm9wZXJ0aWVzIHRvIHBhcnQgb2YgYSB3aW5kb3cgbG9jYXRpb248L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5EZXRlcm1pbmVzIHRoZSBzdHJpbmcgdmFsdWUgZm9yIGl0cyBsZXZlbCBvZiB0aGUgd2luZG93IGxvY2F0aW9uPC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+VGhlIHZhbHVlIGNhbiBiZSBhIHJlZ2V4IHBhdHRlcm4gc28gdGhhdCBtdWx0aXBsZSBsb2NhdGlvbnMgY2FuIG1hcCB0byBzYW1lIHJvdXRlRGF0YSBwcm9wZXJ0eTwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkJyYW5jaGluZyBlbmRzIGZvciB0aGUgcm91dGUgb3B0aW9uIHdoZW4gdGhpcyB2YWx1ZSBpcyBhIGVpdGhlciBhIFN0cmluZyBvciBhIHJlZ2V4IHBhdHRlcm48L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5CcmFuY2hpbmcgY29udGludWVzIGZvciB0aGUgcm91dGUgb3B0aW9uIHdoZW4gdGhpcyB2YWx1ZSBpcyBhIG5lc3RlZCByb3V0ZVBhdGggb2JqZWN0PC9saT5cbiAgICAgKiAgICAgICAgICA8L3VsPlxuICAgICAqICAgICAgPC9saT5cbiAgICAgKiAgICAgIDwvdWw+XG4gICAgICpcbiAgICAgKiAgICAgIDxoMz5FbmhhbmNpbmcgVGhlIEFwcCdzIFJvdXRpbmcgTG9naWM8L2gzPlxuICAgICAqICAgICAgPHA+VGhlIGJlc3QgcHJhY3RpY2UgZm9yIGEgU3B5bmUgQXBwIGlzIHRvIGhhdmUgb25lIGNvbXBvbmVudCwgYSBjdXN0b20gY2hhbm5lbCwgbGlzdGVuIHRvIHRoZSBTcHluZVJvdXRlQ2hhbm5lbC4gQWxsIG90aGVyIGNvbXBvbmVudHMgd2lsbCB0aGVuIGxpc3RlbiB0byB0aGUgY3VzdG9tIHJvdXRlIGNoYW5uZWwuIFRoaXMgYWxsb3dzIHRoZSBjdXN0b20gcm91dGUgY2hhbm5lbCB0byBlbmhhbmNlIHJvdXRpbmcgbG9naWMgd2l0aCBtb3JlIGRhdGEgYW5kIGN1c3RvbSBhY3Rpb25zLjwvcD5cbiAgICAgKiAgICAgIDxwPllvdSBjYW4gc2VlIHRoaXMgY3VzdG9tIHJvdXRpbmcgY2hhbm5lbCBpbiBhY3Rpb24gaW4gdGhlIFNweW5lIFN0YXJ0ZXIgQXBwPC9wPlxuICAgICAqXG4gICAgICogICAgICA8aDQgY2xhc3M9J2Jhc2ljJz5FeGFtaW5pbmcgdGhpcyBTaXRlJ3MgUm91dGUgQ29uZmlndXJhdGlvbjwvaDQ+XG4gICAgICogICAgICA8YXJ0aWNsZSBjbGFzcz0nY29kZS1leGFtcGxlJyBpZD0ncm91dGVzLWNvbmZpZy1leGFtcGxlJz48L2FydGljbGU+XG4gICAgICogICAgICA8cD5Zb3UgY2FuIHNlZSB0aGlzIHNpdGUgcm91dGluZyBpbiBhY3Rpb24gYnkgb3BlbmluZyB1cCB0aGUgY29uc29sZSdzIHJvdXRlcyBwYW5lbDwvcD5cbiAgICAgKiAgICAgIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUnIGRhdGEtdHlwZT1cImNvbnNvbGVcIiBkYXRhLXZhbHVlPVwib3BlblwiIGRhdGEtY2hhbm5lbC10eXBlPVwicm91dGVcIj5DTElDSyBUTyBPUEVOIFJPVVRFIFBBTkVMPC9kaXY+XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFW1wiPGg0PkJpbmRpbmcgVUkgRUxlbWVudHMgdG8gdGhlIFJvdXRlIENoYW5uZWw8L2g0PlwiXVxuICAgICAqIC8vIFRoaXMgYWxzbyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBvdmVycmlkZSB0aGUgUm91dGVPcHRpb24gdmFsdWUgKHVzZWZ1bCB3aGVuIHRoZSB2YWx1ZSBpcyBhIHJlZ2V4IHBhdHRlcm4pXG4gICAgICogPGRpdiBjbGFzcz0nYnRuJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiIGRhdGEtcGFnZS1pZD0naG9tZScgZGF0YS1wYWdlLWlkLXZhbHVlPScnPkhPTUU8L2Rpdj5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbXCI8aDQ+VXBkYXRpbmcgdGhlIFJvdXRlIENoYW5uZWwgdXNpbmcgVmlld1N0cmVhbSZyc3F1bztzIHNlbmRJbmZvVG9DaGFubmVsPC9oND5cIl1cbiAgICAgKiBjb25zdCBkYXRhVXBkYXRlT2JqID0ge3BhZ2VJZDonZ3VpZGUnLCBzZWN0aW9uOidyZWZlcmVuY2UnLCBtZW51SXRlbTonc3B5bmUtcm91dGUtY2hhbm5lbCd9O1xuICAgICAqIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoXCJDSEFOTkVMX1JPVVRFXCIsIGRhdGFVcGRhdGVPYmopO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVtcIjxoND5VcGRhdGluZyB0aGUgUm91dGUgQ2hhbm5lbCB1c2luZyBDaGFubmVsJnJzcXVvO3Mgc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbDwvaDQ+XCJdXG4gICAgICogY29uc3QgZGF0YVVwZGF0ZU9iaiA9IHtwYWdlSWQ6J2d1aWRlJywgc2VjdGlvbjoncmVmZXJlbmNlJywgbWVudUl0ZW06J3NweW5lLXJvdXRlLWNoYW5uZWwnfTtcbiAgICAgKiB0aGlzLnNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwoZGF0YVVwZGF0ZU9iaik7XG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGNvbmZpZy50eXBlIC0gPSAnc2xhc2gnOyBUaGlzIHByb3BlcnR5IGRldGVybWluZXMgdGhlIHVybCBzdHJ1Y3R1cmUgYnkgY29uZm9ybWluZyB0aGUgd2luZG93IHBhdGhuYW1lIHRvIGVpdGhlciB0aGUgc2xhc2gsIHF1ZXJ5IG9yIGhhc2ggZm9ybWF0cy5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnLnJvdXRlcyAtID0ge3JvdXRlUGF0aDoge3JvdXRlTmFtZTonY2hhbmdlJ307IFRoaXMgbmVzdGVkIE9iamVjdCBpcyB1c2VkIHRvIGNvbnRydWN0IHRoZSB3aW5kb3cgcGF0aG5hbWUgYW5kIHRvIGV4cHJlc3MgdGhlIHdpbmRvdyBsb2NhdGlvbiBhcyBtb2RlbCB2YXJpYWJsZXMuXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfUk9VVEUnO1xuICAgICAqXG4gICAgICovXG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgc3VwZXIoJ0NIQU5ORUxfUk9VVEUnLCBwcm9wcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKClcbiAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbiA9IHRoaXMuZ2V0Um91dGVDb25maWcoKVxuICAgIHRoaXMuYmluZFN0YXRpY01ldGhvZHMoKVxuICAgIHRoaXMubmF2VG9TdHJlYW0kID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9ic2VydmVyJCA9IHRoaXMubmF2VG9TdHJlYW0kLnBpcGUobWFwKGluZm8gPT4gdGhpcy5vbk1hcE5leHQoaW5mbykpKVxuICAgIHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNvbXBhcmVSb3V0ZUtleXdvcmRzKClcbiAgfVxuXG4gIGNoZWNrQ29uZmlnRm9ySGFzaCgpIHtcbiAgICAvLyBMRUdBQ1kgQ0hFQ0sgVE8gU0lNUExJRlkgQ09ORklHIEZPUiBIQVNIO1xuICAgIGNvbnN0IGlzSGFzaFR5cGUgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLnR5cGUgPT09ICdoYXNoJ1xuICAgIGlmIChpc0hhc2hUeXBlID09PSB0cnVlKSB7XG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLnR5cGUgPSAnc2xhc2gnXG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLmlzSGFzaCA9IHRydWVcbiAgICB9XG4gIH1cblxuICBvblJlZ2lzdGVyZWQoKSB7XG4gICAgdGhpcy5jaGVja0NvbmZpZ0Zvckhhc2goKVxuICAgIHRoaXMuaW5pdFN0cmVhbSgpXG4gIH1cblxuICBjcmVhdGVDaGFubmVsQWN0aW9uc09iaigpIHtcbiAgICBjb25zdCBhcnIgPSB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKClcbiAgICBjb25zdCBjb252ZXJ0ZXIgPSBzdHIgPT4gb2JqT2Yoc3RyLCBzdHIpXG4gICAgY29uc3Qgb2JqID0gbWVyZ2VBbGwoY2hhaW4oY29udmVydGVyLCBhcnIpKVxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBvYmpcbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfUk9VVEVfQ09ORklHX1VQREFURURfRVZFTlQnLFxuICAgICAgWydDSEFOTkVMX1JPVVRFX1VQREFURV9DT05GSUdfRVZFTlQnLCAndXBkYXRlUm91dGVDb25maWcnXVxuICAgIF1cbiAgfVxuXG4gIHVwZGF0ZVJvdXRlQ29uZmlnKGUpIHtcbiAgICBjb25zdCBuZXdSb3V0ZXNPYmogID0gcGljayhbJ2lzSGFzaCcsICdpc0hpZGRlbicsICdyb3V0ZXMnLCAndHlwZSddLCBlLnBheWxvYWQpXG5cbiAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFID0gbWVyZ2VSaWdodChTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLCBuZXdSb3V0ZXNPYmopXG5cbiAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZm9ybVJvdXRlQ29uZmlnKClcblxuICAgIGNvbnN0IHJvdXRlQ29uZmlnID0gdGhpcy5nZXRSb3V0ZUNvbmZpZygpXG4gICAgY29uc3QgYWN0aW9uID0gJ0NIQU5ORUxfUk9VVEVfQ09ORklHX1VQREFURURfRVZFTlQnXG5cbiAgICAvLyByZXZlcnNlIGJlY2F1c2Ugcm91dGVEYXRhc2V0c0FyciB0dXJucyBvdXQgdGhhdCB3YXlcbiAgICByb3V0ZUNvbmZpZy5uYXZMaW5rcyA9IFsuLi5yb3V0ZUNvbmZpZz8ucm91dGVEYXRhc2V0c0Fycl1cblxuICAgIHRoaXMucm91dGVDb25maWdKc29uID0gcm91dGVDb25maWdcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKVxuXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCByb3V0ZUNvbmZpZywge30sIHt9LCB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIGdldFJvdXRlQ29uZmlnKCkge1xuICAgIGNvbnN0IHNweW5lQ29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZ1xuICAgIGNvbnN0IHJvdXRlQ29uZmlnID0gcGF0aChbJ2NoYW5uZWxzJywgJ1JPVVRFJ10sIHNweW5lQ29uZmlnKVxuICAgIGlmIChyb3V0ZUNvbmZpZy50eXBlID09PSAncXVlcnknKSB7XG4gICAgICByb3V0ZUNvbmZpZy5pc0hhc2ggPSBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuZmxhdHRlbkNvbmZpZ09iamVjdChyb3V0ZUNvbmZpZy5yb3V0ZXMpXG4gICAgcm91dGVDb25maWcucGFyYW1zQXJyID0gYXJyXG4gICAgcmV0dXJuIHJvdXRlQ29uZmlnXG4gIH1cblxuICBpbml0U3RyZWFtKCkge1xuICAgIHRoaXMuZmlyc3RMb2FkU3RyZWFtJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXG4gICAgdGhpcy5vbkluY29taW5nRG9tRXZlbnQodW5kZWZpbmVkLCB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgJycgKyAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcpXG5cbiAgICBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNyZWF0ZVBvcFN0YXRlU3RyZWFtKHRoaXMub25JbmNvbWluZ0RvbUV2ZW50LmJpbmQodGhpcykpXG5cbiAgICB0aGlzLm9ic2VydmVyJCA9IG1lcmdlKHRoaXMuZmlyc3RMb2FkU3RyZWFtJCxcbiAgICAgIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgb25NYXBOZXh0KGRhdGEsIGZpcnN0TG9hZGVkID0gZmFsc2UpIHtcbiAgICBkYXRhLmFjdGlvbiA9ICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCdcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgc3RhdGljIHJlbW92ZVNTSUQocGF5bG9hZCkge1xuICAgIGNvbnN0IHJvdXRlTGVucyA9IGxlbnNQcm9wKFsncm91dGVEYXRhJ10pXG4gICAgY29uc3Qgb21pdFNTSUQgPSBvdmVyKHJvdXRlTGVucywgb21pdChbJ3ZzaWQnXSkpXG4gICAgcmV0dXJuIG9taXRTU0lEKHBheWxvYWQpXG4gIH1cblxuICBzdGF0aWMgb25JbmNvbWluZ0RvbUV2ZW50KGV2dCwgY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGFjdG4pIHtcbiAgICBjb25zdCBhY3Rpb24gPSBhY3RuICE9PSB1bmRlZmluZWRcbiAgICAgID8gYWN0blxuICAgICAgOiB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UXG5cbiAgICAvLyBDSEVDSyBJRiBUSElTIElTIEEgSElTVE9SWSBFVkVOVCBCWSBVU0lORyBUSEUgcm91dGVDb3VudCBQUk9QRVJUWVxuICAgIGNvbnN0IGV2ZW50Q291bnQgPSBwYXRoKFsnc3RhdGUnLCAncm91dGVDb3VudCddLCBldnQpXG4gICAgY29uc3QgaXNIaXN0b3J5Q291bnQgPSBpcyhOdW1iZXIsIGV2ZW50Q291bnQpID09PSB0cnVlXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdldERhdGFGcm9tU3RyaW5nKGNvbmZpZywgaXNIaXN0b3J5Q291bnQpXG4gICAgaWYgKGlzSGlzdG9yeUNvdW50ID09PSB0cnVlKSB7XG4gICAgICBwYXlsb2FkLnJvdXRlQ291bnQgPSBldmVudENvdW50XG4gICAgfVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGlmIChhY3RuID09PSAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcpIHtcbiAgICAgIHBheWxvYWQubmF2TGlua3MgPSBwcm9wKCdyb3V0ZURhdGFzZXRzQXJyJywgY29uZmlnKVxuICAgICAgLy8gcGF5bG9hZC5saW5rc0RhdGEgPSBwYXlsb2FkLm5hdkxpbmtzXG4gICAgICAvLyBTcHluZUFwcFByb3BlcnRpZXMubGlua3NEYXRhID0gcGF5bG9hZC5uYXZMaW5rc1xuXG4gICAgICAvLyBkZWZpbmUgYW4gYWxpYXMgcHJvcGVydHkgdXNpbmcgT2JqZWN0LmRlZmluZVByb3BlcnR5XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGF5bG9hZCwgJ2xpbmtzRGF0YScsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignZ2V0IGxpbmtzIGRhdGEgaXMgZGVwcmVjYXRlZCBpbiBST1VURSBERUVQTElOSyBEQVRBLCB1c2UgbmF2TGlua3MnKVxuICAgICAgICAgIHJldHVybiB0aGlzLm5hdkxpbmtzXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgIGNvbnNvbGUud2Fybignc2V0IGxpbmtzIGRhdGEgaXMgZGVwcmVjYXRlZCBpbiBST1VURSBERUVQTElOSyBEQVRBLCB1c2UgbmF2TGlua3MnKVxuXG4gICAgICAgICAgLy8gdGhpcy5uYXZMaW5rcyA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBrZXl3b3JkQXJycyA9IHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMuY29tcGFyZShwYXlsb2FkLnJvdXRlRGF0YSwgcGF5bG9hZC5wYXRocylcbiAgICBwYXlsb2FkID0gck1lcmdlKHBheWxvYWQsIGtleXdvcmRBcnJzKVxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgdW5kZWZpbmVkLCBldnQsIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUm91dGVQYXJhbXNPdmVycmlkZXMocGF5bG9hZCkge1xuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JFdmVudE1ldGhvZHMob2JzKSB7XG4gICAgY29uc3QgcmUgPSAvXihldmVudCkoW0EtWl0uKikoW0EtWl0uKikkL2dtXG4gICAgY29uc3QgZ2V0TWV0aG9kcyA9IGNvbXBvc2UocmFtZGFGaWx0ZXIodGVzdChyZSkpLCBrZXlzLCBwcm9wKCdwYXlsb2FkJykpXG4gICAgY29uc3QgbWV0aG9kc0FyciA9IGdldE1ldGhvZHMob2JzKVxuICAgIGlmIChtZXRob2RzQXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICBjb25zdCBldnQgPSBwcm9wKCdldmVudCcsIG9icylcbiAgICAgIGlmIChldnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtZXRob2RVcGRhdGUgPSAobWF0Y2gsIHAxLCBwMiwgcDMsIHA0KSA9PiBTdHJpbmcocDIpLnRvTG93ZXJDYXNlKCkgKyBwMyArIHA0XG4gICAgICAgIGNvbnN0IG1ldGhvZFN0clJlcGxhY2UgPSByZXBsYWNlKC9eKGV2ZW50KShbQS1aXSkoLiopKFtBLVpdLiopJC9nbSwgbWV0aG9kVXBkYXRlKVxuICAgICAgICBjb25zdCBydW5NZXRob2QgPSAobWV0aG9kU3RyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbSA9IG1ldGhvZFN0clJlcGxhY2UobWV0aG9kU3RyKVxuICAgICAgICAgIGlmIChldnRbbV0gIT09IHVuZGVmaW5lZCkgeyBldnRbbV0oKSB9XG4gICAgICAgIH1cbiAgICAgICAgbWV0aG9kc0Fyci5mb3JFYWNoKHJ1bk1ldGhvZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JzXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JFbmRSb3V0ZShwbCwgcm91dGVDb25maWdKc29uID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGRlYnVnQm9vbCkge1xuICAgIGNvbnN0IGVuZFJvdXRlID0gY29tcG9zZShlcXVhbHMoJ3RydWUnKSwgcGF0aChbJ3BheWxvYWQnLCAnZW5kUm91dGUnXSkpKHBsKVxuXG4gICAgaWYgKGVuZFJvdXRlICE9PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcGxcbiAgICB9XG4gICAgY29uc3QgZGVidWcgPSBkZWJ1Z0Jvb2wgIT09IHVuZGVmaW5lZCA/IGRlYnVnQm9vbCA6IFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZVxuICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gcGxcblxuICAgIGNvbnN0IGdldFByb3BWYWwgPSAocm91dGVQYXRoKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZU5hbWUgPSBwcm9wKCdyb3V0ZU5hbWUnLCByb3V0ZVBhdGgpXG4gICAgICBpZiAocm91dGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IGtleXNBcnIgPSBjb21wb3NlKGtleXMsIG9taXQoWydyb3V0ZU5hbWUnXSkpKHJvdXRlUGF0aClcbiAgICAgICAgY29uc3Qgcm91dGVOYW1lVmFsID0gcGF5bG9hZFtyb3V0ZU5hbWVdXG4gICAgICAgIGNvbnN0IHByZWQgPSBhcnJTdHIgPT4gbmV3IFJlZ0V4cChgXiR7YXJyU3RyfSRgKS50ZXN0KHJvdXRlTmFtZVZhbClcbiAgICAgICAgY29uc3Qgcm91dGVWYWwgPSBmaW5kKHByZWQsIGtleXNBcnIpXG4gICAgICAgIHJldHVybiByb3V0ZVZhbFxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBpdGVyID0gMFxuICAgIGNvbnN0IG9uUmVkdWNlUm91dGVQYXRocyA9IChhY2MgPSBbXSwgYXJyKSA9PiB7XG4gICAgICAvLyBjb25zdCBba2V5LCB2YWxdID0gYXJyXG4gICAgICBjb25zdCB2YWwgPSBhcnJbMV1cbiAgICAgIGNvbnN0IHsgcm91dGVQYXRoIH0gPSB2YWxcbiAgICAgIGNvbnN0IHJvdXRlTmFtZSA9IHByb3AoJ3JvdXRlTmFtZScsIHJvdXRlUGF0aClcbiAgICAgIGNvbnN0IHJvdXRlTmFtZVZhbCA9IGdldFByb3BWYWwocm91dGVQYXRoKVxuICAgICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QsIHZhbClcbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGNvbnN0IGl0ZXJPYmogPSBpc09iaiA9PT0gdHJ1ZSAmJiBpc0FyciA9PT0gZmFsc2VcbiAgICAgIGl0ZXIgPSBpdGVyICsgMVxuICAgICAgaWYgKGl0ZXJPYmopIHtcbiAgICAgICAgY29uc3QgbmV4dFJvdXRlUGF0aCA9IHJvdXRlUGF0aFtyb3V0ZU5hbWVWYWxdXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdrZXkgaXMgJyx7aXRlcixhY2Msa2V5LCByb3V0ZU5hbWUsIHJvdXRlTmFtZVZhbCwgaXRlck9iaiwgbmV4dFJvdXRlUGF0aH0pO1xuICAgICAgICBpZiAobmV4dFJvdXRlUGF0aCkge1xuICAgICAgICAgIGNvbXBvc2UocmV2ZXJzZSwgcmVkdWNlKG9uUmVkdWNlUm91dGVQYXRocywgYWNjKSwgdG9QYWlycykoeyBuZXh0Um91dGVQYXRoIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJLRVkgSVMgXCIse2l0ZXIsa2V5LCByb3V0ZU5hbWUsIHJvdXRlTmFtZVZhbH0pXG4gICAgICAgICAgaWYgKGl0ZXIgPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHVzZSBvZiBlbmQgcm91dGUgbWV0aG9kIHNob3VsZCBhZGQgc3RhcnQgcm91dGUgdmFsdWUgb2YgXCIke3JvdXRlTmFtZX1cIi5gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2MucHVzaChyb3V0ZU5hbWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjXG4gICAgfVxuXG4gICAgY29uc3QgeyByb3V0ZXMgfSA9IHJvdXRlQ29uZmlnSnNvblxuXG4gICAgY29uc3QgZW5kUm91dGVWYWxBcnIgPSBjb21wb3NlKHJldmVyc2UsIHJlZHVjZShvblJlZHVjZVJvdXRlUGF0aHMsIFtdKSwgdG9QYWlycykoeyByb3V0ZXMgfSlcbiAgICAvLyBjb25zb2xlLmxvZygnZW5kIHJvdXRlIHZhbCBhcnIgJyxlbmRSb3V0ZVZhbEFycik7XG4gICAgaWYgKGVuZFJvdXRlVmFsQXJyLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZW5kUm91dGVWYWwgPSBlbmRSb3V0ZVZhbEFyclswXVxuICAgICAgcGwucGF5bG9hZFtlbmRSb3V0ZVZhbF0gPSAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgZW5kIHJvdXRlIHBhcmFtIGRpZCBub3QgeWllbGQgYW55IHJlc3VsdHMgZm9yICR7SlNPTi5zdHJpbmdpZnkocGF5bG9hZCl9IGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwbFxuICB9XG5cbiAgb25WaWV3U3RyZWFtSW5mbyhwbCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHBsLmFjdGlvbiA/PyB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UXG5cbiAgICBmdW5jdGlvbiBkb21TdHJpbmdNYXBUb09iamVjdChkb21TdHJpbmdNYXApIHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBkb21TdHJpbmdNYXApIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXTigJlzIGEgZGlyZWN0IHByb3BlcnR5ICh0aG91Z2ggZGF0YXNldCByYXJlbHkgaGFzIGFueXRoaW5nIG9uIHRoZSBwcm90b3R5cGUpOlxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvbVN0cmluZ01hcCwga2V5KSkge1xuICAgICAgICAgIG9ialtrZXldID0gZG9tU3RyaW5nTWFwW2tleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialxuICAgIH1cblxuICAgIGlmIChwbD8uc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpIHtcbiAgICAgIHBsLnBheWxvYWQgPSBkb21TdHJpbmdNYXBUb09iamVjdChwbD8uc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpID8/IHBsLnBheWxvYWRcbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZygnUk9VVEUgQ0hBTk5FTCBWU0kgJywgeyBwbCB9KVxuXG4gICAgU3B5bmVDaGFubmVsUm91dGUuY2hlY2tGb3JFdmVudE1ldGhvZHMocGwpXG4gICAgcGwgPSB0aGlzLmNoZWNrRm9yRW5kUm91dGUocGwpXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdldERhdGFGcm9tUGFyYW1zKHBsKVxuXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IHByb3AoJ3NyY0VsZW1lbnQnLCBwbClcbiAgICBjb25zdCBldmVudCA9IHByb3AoJ2V2ZW50JywgcGwpXG4gICAgY29uc3QgY2hhbmdlTG9jYXRpb25Cb29sID0gIXBheWxvYWQuaXNIaWRkZW5cbiAgICBjb25zdCBrZXl3b3JkQXJycyA9IHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMuY29tcGFyZShwYXlsb2FkLnJvdXRlRGF0YSwgcGF5bG9hZC5wYXRocylcblxuICAgIHBheWxvYWQgPSByTWVyZ2UocGF5bG9hZCwga2V5d29yZEFycnMpXG4gICAgdGhpcy5zZW5kUm91dGVTdHJlYW0ocGF5bG9hZCwgY2hhbmdlTG9jYXRpb25Cb29sKVxuXG4gICAgcGF5bG9hZCA9IFNweW5lQ2hhbm5lbFJvdXRlLnJlbW92ZVNTSUQocGF5bG9hZClcblxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsXG4gICAgICB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMocm91dGVWYWx1ZSwgcmVnZXhUb2tlbk9iaikge1xuICAgIGNvbnN0IHRva2VuS2V5c0FyciA9IGtleXMocmVnZXhUb2tlbk9iailcblxuICAgIHJldHVybiB0b2tlbktleXNBcnJcbiAgfVxuXG4gIHNlbmRSb3V0ZVN0cmVhbShwYXlsb2FkLCBjaGFuZ2VXaW5kb3dMb2MgPSB0cnVlKSB7XG4gICAgaWYgKGNoYW5nZVdpbmRvd0xvYyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZXRXaW5kb3dMb2NhdGlvbihwYXlsb2FkKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVN0YXRlKCkge1xuICAgIHJldHVybiAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gIH1cblxuICBzdGF0aWMgZ2V0SXNEZWVwTGlua0Jvb2woaXNIaXN0b3J5KSB7XG4gICAgcmV0dXJuIGlzSGlzdG9yeSA9PT0gZmFsc2UgJiYgdGhpcy5fcm91dGVDb3VudCA9PT0gMFxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlQ291bnQoaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5fcm91dGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9yb3V0ZUNvdW50ID0gMFxuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlQ291bnRcbiAgICB9XG4gICAgaWYgKGlzSGlzdG9yeSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3JvdXRlQ291bnQgKz0gMVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcm91dGVDb3VudFxuICB9XG5cbiAgc3RhdGljIGdldEV4dHJhUGF5bG9hZFBhcmFtcyhjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBjb25zdCByb3V0ZUNvdW50ID0gdGhpcy5nZXRSb3V0ZUNvdW50KGlzSGlzdG9yeSlcbiAgICBjb25zdCBpc0RlZXBMaW5rID0gdGhpcy5nZXRJc0RlZXBMaW5rQm9vbChpc0hpc3RvcnkpXG4gICAgY29uc3QgaXNIYXNoID0gY29uZmlnLmlzSGFzaFxuICAgIGNvbnN0IGlzSGlkZGVuID0gY29uZmlnLmlzSGlkZGVuXG4gICAgY29uc3Qgcm91dGVUeXBlID0gY29uZmlnLnR5cGVcbiAgICByZXR1cm4geyByb3V0ZUNvdW50LCBpc0RlZXBMaW5rLCBpc0hhc2gsIGlzSGlzdG9yeSwgaXNIaWRkZW4sIHJvdXRlVHlwZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0RGF0YUZyb21QYXJhbXMocGwsIGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uKSB7XG4gICAgbGV0IHJvdXRlRGF0YSA9IHByb3AoJ3BheWxvYWQnLCBwbClcblxuICAgIGNvbnN0IHJvdXRlVmFsdWUgPSB0aGlzLmdldFJvdXRlU3RyRnJvbVBhcmFtcyhyb3V0ZURhdGEsIGNvbmZpZylcblxuICAgIC8vIFdJTkRPVyBMT0NBVElPTiBIQVNOJ1QgQkVFTiBDSEFOR0VEIFlFVCwgU08gV0lMTCBHRVQgU1RSIFBBUkFNU1xuICAgIGNvbnN0IGdldFByb3BGcm9tQ29uZmlnID0gKHBycCwgZGVmYWx0KSA9PiBkZWZhdWx0VG8oZGVmYWx0LCBwcm9wKHBycCwgY29uZmlnKSlcbiAgICBjb25zdCB0eXBlRm9yU3RyID0gZ2V0UHJvcEZyb21Db25maWcoJ3R5cGUnLCAnc2xhc2gnKVxuICAgIGNvbnN0IGlzSGFzaEZvclN0ciA9IGdldFByb3BGcm9tQ29uZmlnKCdpc0hhc2gnLCBmYWxzZSlcbiAgICBjb25zdCBuZXh0V2luZG93TG9jID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5mb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uKHJvdXRlVmFsdWUpXG4gICAgY29uc3QgZGF0YUZyb21TdHIgPSB0aGlzLmdldERhdGFGcm9tTG9jYXRpb25TdHIodHlwZUZvclN0ciwgaXNIYXNoRm9yU3RyLCBuZXh0V2luZG93TG9jKVxuXG4gICAgY29uc3QgeyBwYXRoSW5uZXJtb3N0LCBwYXRocyB9ID0gZGF0YUZyb21TdHJcblxuICAgIHJvdXRlRGF0YSA9IHJNZXJnZShkYXRhRnJvbVN0ci5yb3V0ZURhdGEsIHJvdXRlRGF0YSlcblxuICAgIGNvbnN0IHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCBpc0hpc3RvcnksIGlzSGlkZGVuLCByb3V0ZVR5cGUgfSA9IHRoaXMuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zKFxuICAgICAgY29uZmlnKVxuICAgIHJldHVybiB7XG4gICAgICBpc0RlZXBMaW5rLFxuICAgICAgcm91dGVDb3VudCxcbiAgICAgIHBhdGhJbm5lcm1vc3QsXG4gICAgICBwYXRocyxcbiAgICAgIHJvdXRlRGF0YSxcbiAgICAgIHJvdXRlVmFsdWUsXG4gICAgICBpc0hhc2gsXG4gICAgICBpc0hpZGRlbixcbiAgICAgIGlzSGlzdG9yeSxcbiAgICAgIHJvdXRlVHlwZVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXREYXRhRnJvbVN0cmluZyhjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBjb25zdCB0eXBlID0gY29uZmlnLnR5cGVcbiAgICBjb25zdCBoYXNoSXNUcnVlID0gY29uZmlnLmlzSGFzaCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHN0ciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZ2V0TG9jYXRpb25TdHJCeVR5cGUodHlwZSwgaGFzaElzVHJ1ZSlcbiAgICBjb25zdCB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFBhcmFtc0Zyb21Sb3V0ZVN0cihcbiAgICAgIHN0ciwgY29uZmlnLCB0eXBlKVxuICAgIGNvbnN0IHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCByb3V0ZVR5cGUsIGlzSGlkZGVuIH0gPSB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyhcbiAgICAgIGNvbmZpZywgaXNIaXN0b3J5KVxuXG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgaXNEZWVwTGluayxcbiAgICAgIHJvdXRlQ291bnQsXG4gICAgICBwYXRoSW5uZXJtb3N0LFxuICAgICAgcGF0aHMsXG4gICAgICByb3V0ZURhdGEsXG4gICAgICByb3V0ZVZhbHVlLFxuICAgICAgaXNIYXNoLFxuICAgICAgaXNIaWRkZW4sXG4gICAgICBpc0hpc3RvcnksXG4gICAgICByb3V0ZVR5cGVcbiAgICB9XG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGdldERhdGFGcm9tTG9jYXRpb25TdHIodCA9ICdzbGFzaCcsIGlzSGFzaCA9IHRoaXMucm91dGVDb25maWdKc29uLmlzSGFzaCwgbG9jID0gd2luZG93LmxvY2F0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMucm91dGVDb25maWdKc29uICE9PSB1bmRlZmluZWRcbiAgICAgID8gdGhpcy5yb3V0ZUNvbmZpZ0pzb24udHlwZVxuICAgICAgOiB0XG5cbiAgICBjb25zdCBzdHIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmdldExvY2F0aW9uU3RyQnlUeXBlKHR5cGUsIGlzSGFzaCwgbG9jKVxuICAgIGNvbnN0IHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9ID0gdGhpcy5nZXRQYXJhbXNGcm9tUm91dGVTdHIoXG4gICAgICBzdHIsIHRoaXMucm91dGVDb25maWdKc29uLCB0eXBlKVxuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuZ2V0Um91dGVTdGF0ZSgpXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSwgYWN0aW9uIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvbkRhdGEoKSB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbXNBcnIgPSBbXG4gICAgICAnaHJlZicsXG4gICAgICAnb3JpZ2luJyxcbiAgICAgICdwcm90b2NvbCcsXG4gICAgICAnaG9zdCcsXG4gICAgICAnaG9zdG5hbWUnLFxuICAgICAgJ3BvcnQnLFxuICAgICAgJ3BhdGhuYW1lJyxcbiAgICAgICdzZWFyY2gnLFxuICAgICAgJ2hhc2gnXVxuICAgIHJldHVybiBwaWNrQWxsKGxvY2F0aW9uUGFyYW1zQXJyLCB3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVTdHJGcm9tUGFyYW1zKHBhcmFtc0RhdGEsIHJvdXRlQ29uZmlnLCB0KSB7XG4gICAgY29uc3QgdHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByb3V0ZUNvbmZpZy50eXBlXG4gICAgY29uc3Qgb2JqID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jb252ZXJ0UGFyYW1zVG9Sb3V0ZShwYXJhbXNEYXRhLCByb3V0ZUNvbmZpZywgdHlwZSlcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgZ2V0UGFyYW1zRnJvbVJvdXRlU3RyKHN0ciwgcm91dGVDb25maWcsIHQpIHtcbiAgICBjb25zdCB0eXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHJvdXRlQ29uZmlnLnR5cGVcbiAgICBjb25zdCBvYmogPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRSb3V0ZVRvUGFyYW1zKHN0ciwgcm91dGVDb25maWcsIHR5cGUpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgY2hlY2tFbXB0eVJvdXRlU3RyKHN0ciwgaXNIYXNoID0gZmFsc2UpIHtcbiAgICBjb25zdCBpc0VtcHR5Qm9vbCA9IGlzRW1wdHkoc3RyKVxuICAgIGNvbnN0IHBhdGhOYW1lSXNFbXB0eUJvb2wgPSBpc0VtcHR5Qm9vbCA9PT0gdHJ1ZSAmJiBpc0hhc2ggPT09IGZhbHNlXG4gICAgY29uc3QgaGFzaE5hbWVJc0VtcHR5Qm9vbCA9IGlzRW1wdHlCb29sID09PSB0cnVlICYmIGlzSGFzaCA9PT0gdHJ1ZVxuICAgIGNvbnN0IGhhc2hOYW1lQm9vbCA9IGlzRW1wdHlCb29sID09PSBmYWxzZSAmJiBpc0hhc2ggPT09IHRydWVcblxuICAgIGlmIChwYXRoTmFtZUlzRW1wdHlCb29sID09PSB0cnVlIHx8IGhhc2hOYW1lSXNFbXB0eUJvb2wgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiAnLydcbiAgICB9IGVsc2UgaWYgKGhhc2hOYW1lQm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGNvbmNhdCgnIycsIHN0cilcbiAgICB9XG4gICAgcmV0dXJuIHN0clxuICB9XG5cbiAgc3RhdGljIHJlbW92ZUxhc3RTbGFzaChzdHIpIHtcbiAgICBjb25zdCByZSA9IC9eKC4qKShcXC8pJC9cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UocmUsICckMScpXG4gIH1cblxuICBzZXRXaW5kb3dMb2NhdGlvbihjaGFubmVsUGF5bG9hZCkge1xuICAgIGxldCB7IGlzSGFzaCwgcm91dGVWYWx1ZSwgcm91dGVUeXBlIH0gPSBjaGFubmVsUGF5bG9hZFxuICAgIHJvdXRlVmFsdWUgPSB0aGlzLmNoZWNrRW1wdHlSb3V0ZVN0cihyb3V0ZVZhbHVlLCBpc0hhc2gpXG4gICAgY29uc3QgeyByb3V0ZUNvdW50IH0gPSBjaGFubmVsUGF5bG9hZFxuICAgIGlmIChpc0hhc2ggPT09IHRydWUgfHwgcm91dGVUeXBlID09PSAncXVlcnknKSB7XG4gICAgICBjb25zdCBwYXRoTmFtZSA9IFNweW5lQ2hhbm5lbFJvdXRlLnJlbW92ZUxhc3RTbGFzaCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpXG4gICAgICByb3V0ZVZhbHVlID0gcGF0aE5hbWUgKyByb3V0ZVZhbHVlXG4gICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoeyByb3V0ZUNvdW50IH0sICcnLCByb3V0ZVZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjaGVja0ZvclNsYXNoID0gd2hlbihcbiAgICAgICAgY29tcG9zZShjb21wbGVtZW50KGVxdWFscygnLycpKSwgaGVhZCksIGNvbmNhdCgnLycsIF9fKSlcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7IHJvdXRlQ291bnQgfSwgJycsIGNoZWNrRm9yU2xhc2gocm91dGVWYWx1ZSkpXG4gICAgfVxuICB9XG5cbiAgZ2V0V2luZG93TG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSAvLyBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuICB9XG5cbiAgYmluZFN0YXRpY01ldGhvZHMoKSB7XG4gICAgdGhpcy5jaGVja0ZvckVuZFJvdXRlID0gU3B5bmVDaGFubmVsUm91dGUuY2hlY2tGb3JFbmRSb3V0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRJc0RlZXBMaW5rQm9vbCA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldElzRGVlcExpbmtCb29sLmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tTG9jYXRpb25TdHIgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXREYXRhRnJvbUxvY2F0aW9uU3RyLmJpbmQoXG4gICAgICB0aGlzKVxuICAgIHRoaXMub25JbmNvbWluZ0RvbUV2ZW50ID0gU3B5bmVDaGFubmVsUm91dGUub25JbmNvbWluZ0RvbUV2ZW50LmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tU3RyaW5nID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RGF0YUZyb21TdHJpbmcuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyLmJpbmQodGhpcylcbiAgICB0aGlzLmdldExvY2F0aW9uRGF0YSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldExvY2F0aW9uRGF0YS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRSb3V0ZVN0YXRlID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0Um91dGVTdGF0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXREYXRhRnJvbVBhcmFtcyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldERhdGFGcm9tUGFyYW1zLmJpbmQodGhpcylcbiAgICB0aGlzLmdldFJvdXRlQ291bnQgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRSb3V0ZUNvdW50LmJpbmQodGhpcylcbiAgICB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldEV4dHJhUGF5bG9hZFBhcmFtcy5iaW5kKHRoaXMpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhKClcbiAgfVxuXG4gIGJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKSB7XG4gICAgY29uc3QgY3VycmllZEdldFJvdXRlID0gY3VycnlOKDMsIFNweW5lQ2hhbm5lbFJvdXRlLmdldFJvdXRlU3RyRnJvbVBhcmFtcylcbiAgICB0aGlzLmdldFJvdXRlU3RyRnJvbVBhcmFtcyA9IGN1cnJpZWRHZXRSb3V0ZShfXywgdGhpcy5yb3V0ZUNvbmZpZ0pzb24sXG4gICAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbi50eXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGVxdWFscywgcGF0aCwgY29tcG9zZSwgcHJvcCwgZmlsdGVyLCByZXBsYWNlLCBsZW5zUHJvcCwgb3Zlciwgb21pdCwgdGVzdCwga2V5cywgZWl0aGVyLCB0b1VwcGVyIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxVSSBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxVSVxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgQ2hhbm5lbCBsaXN0ZW5zIHRvIGFsbCBVc2VyIEV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzZXQgdG8gYnJvYWRjYXN0IGJ5IFZpZXdTdHJlYW0gaW5zdGFuY2VzLCB1c2luZyB0aGUgYnJvYWRDYXN0RXZlbnRzIG1ldGhvZC48L3A+XG4gICAqIDxwPkhUTUwgRWxlbWVudHMgdGhhdCBoYXZlIHRoZWlyIGRhdGEgY2hhbm5lbCBwcm9wZXJ0eSBzZXQgdG8gXCJST1VURVwiIHdpbGwgYnJvYWRjYXN0IHRoZWlyIHVpIGV2ZW50IHRvIHRoYXQgY2hhbm5lbCBpbnN0ZWFkLjwvcD5cbiAgICogPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZSBtb2RhbC1idG4nICBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS12YWx1ZT0ndWlFdmVudHMnPlZpZXcgVUkgRXZlbnRzPC9kaXY+PC9icj48L2JyPlxuICAgKiA8cD5TZWUgTElOS1snVmlld1N0cmVhbScsICd2aWV3LXN0cmVhbSddIGZvciBhbiBleGFtcGxlIG9uIGhvdyB0byBiaW5kIEhUTUwgRWxlbWVudHMgdG8gdGhlIFVJIENoYW5uZWwuPC9wPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfVUknO1xuICAgKlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihuYW1lID0gJ0NIQU5ORUxfVUknLCBwcm9wcyA9IHt9KSB7XG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSBmYWxzZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICAgIHRoaXMua2V5RXZlbnRzTG9hZGVkID0gZmFsc2VcbiAgICB0aGlzLmtleUNvZGVBcnIgPSBbXVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1VJX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUJPUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUREVFJBQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUZURVJQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BRlRFUlNDUklQVEVYRUNVVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05JVEVSQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVBQSU5TVEFMTEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVRElPRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVRElPU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVVYQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFR0lORVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkxPQ0tFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CTFVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JPVU5EQVJZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JVRkZFUkVEQU1PVU5UTE9XX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5QTEFZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NBTlBMQVlUSFJPVUdIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTE9TRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTE9TSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBMRVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09NUE9TSVRJT05VUERBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OTkVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05ORUNUSU9OU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OVEVOVERFTEVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05URVhUTUVOVV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT1BZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NVRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREFUQUNIQU5ORUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREJMQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREVWSUNFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RFVklDRU1PVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ERVZJQ0VPUklFTlRBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR0VOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJPUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EVVJBVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTVBUSUVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRFVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTlRFUlBJQ1RVUkVJTlBJQ1RVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT0NVU09VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT1JNREFUQV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GVUxMU0NSRUVOQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZVTExTQ1JFRU5FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HQU1FUEFEQ09OTkVDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dBTUVQQURESVNDT05ORUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0FUSEVSSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0VTVFVSRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HRVNUVVJFRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dFU1RVUkVTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HT1RQT0lOVEVSQ0FQVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9IQVNIQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUNBTkRJREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDQU5ESURBVEVFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDT05ORUNUSU9OU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFR0FUSEVSSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5QVVRTT1VSQ0VTQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOU1RBTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5WQUxJRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9LRVlET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0tFWVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xBTkdVQUdFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xFQVZFUElDVFVSRUlOUElDVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFRERBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BREVETUVUQURBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BREVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FEU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9TVFBPSU5URVJDQVBUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01BUktfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUVSQ0hBTlRWQUxJREFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FU1NBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUVTU0FHRUVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRUVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01VVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTkVHT1RJQVRJT05ORUVERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTk9NQVRDSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9OT1RJRklDQVRJT05DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PRkZMSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09OTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PUEVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09SSUVOVEFUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBR0VISURFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBR0VTSE9XX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBU1RFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBVVNFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBWUVSREVUQUlMQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBWU1FTlRNRVRIT0RDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUExBWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QTEFZSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJDQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkRPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTE9DS0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTE9DS0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUk9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUlVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPUFNUQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BST0dSRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BVU0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUFVTSFNVQlNDUklQVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFQURZU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVKRUNUSU9OSEFORExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRU1PVkVUUkFDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRU1PVkVTVFJFQU1fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVQRUFURVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTRVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTSVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU09VUkNFVElNSU5HQlVGRkVSRlVMTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNVTFRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTVU1FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NDUk9MTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUFSQ0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VFS0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFRUtJTkdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVEVEQ0FORElEQVRFUEFJUkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NISVBQSU5HQUREUkVTU0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSElQUElOR09QVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSUdOQUxJTkdTVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TTE9UQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NPVU5ERU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NPVU5EU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1BFRUNIRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NQRUVDSFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NRVUVFWkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1FVRUVaRUVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUVVFRVpFU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVE9SQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NVQk1JVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVUNDRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NVU1BFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVElNRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9USU1FVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPR0dMRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT05FQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNIQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNIRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNITU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OUlVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VTkhBTkRMRURSRUpFQ1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VOTVVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VUEdSQURFTkVFREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZFUlNJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVklTSUJJTElUWUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WT0lDRVNDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZPTFVNRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlBQ1RJVkFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlCTFVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUNPTk5FQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZREVBQ1RJVkFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlESVNDT05ORUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUZPQ1VTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBPSU5URVJSRVNUUklDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBPSU5URVJVTlJFU1RSSUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZUFJFU0VOVENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XQUlUSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQkdMQ09OVEVYVENSRUFUSU9ORVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCR0xDT05URVhUTE9TVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJHTENPTlRFWFRSRVNUT1JFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRVdJTExCRUdJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XSEVFTF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBsb2FkS2V5U3RyZWFtKCkge1xuICAgIGNvbnN0IGtleVVwcyA9IE9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAna2V5dXAnKVxuICAgIGNvbnN0IGZpbHRlcktleXMgPSBlID0+IHRoaXMua2V5Q29kZUFyci5pbmRleE9mKGUua2V5Q29kZSkgPj0gMFxuICAgIHRoaXMua2V5UHJlc3NlcyQgPSBrZXlVcHMuZ3JvdXBCeShlID0+IGUua2V5Q29kZSlcbiAgICAgIC5tZXJnZUFsbCgpXG4gICAgICAuZmlsdGVyKGZpbHRlcktleXMpXG4gICAgICAucmVwZWF0KClcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vbktleVByZXNzZWQuYmluZCh0aGlzKSlcbiAgfVxuXG4gIGFkZEtleUV2ZW50KG51bSkge1xuICAgIGlmICh0aGlzLmtleUV2ZW50c0xvYWRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubG9hZEtleVN0cmVhbSgpXG4gICAgfVxuICAgIHRoaXMua2V5RXZlbnRzTG9hZGVkID0gdHJ1ZVxuICAgIHRoaXMucmVnaXN0ZXJLZXkobnVtKVxuICB9XG5cbiAgcmVnaXN0ZXJLZXkoYykge1xuICAgIHRoaXMua2V5Q29kZUFyci5wdXNoKGMpXG4gIH1cblxuICBvbktleVByZXNzZWQoZXZ0KSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2tleSBpcyAnLCBldnQpO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZVNTSUQocGwpIHtcbiAgICBjb25zdCByb3V0ZUxlbnMgPSBsZW5zUHJvcChbJ3BheWxvYWQnXSlcbiAgICBjb25zdCBvbWl0U1NJRCA9IG92ZXIocm91dGVMZW5zLCBvbWl0KFsndnNpZCddKSlcbiAgICByZXR1cm4gb21pdFNTSUQocGwpXG4gIH1cblxuICBvbkluY29taW5nT2JzZXJ2YWJsZShvYmopIHtcbiAgICBjb25zdCBlcXNOYW1lID0gZXF1YWxzKG9iai5uYW1lLCB0aGlzLnByb3BzLm5hbWUpXG4gICAgb2JqLmRhdGEgPSBTcHluZUNoYW5uZWxVSS5yZW1vdmVTU0lEKG9iai5kYXRhKVxuICAgIGNvbnN0IHsgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JqLmRhdGFcbiAgICBjb25zdCBkYXRhT2JqID0gb2JzVmFsID0+ICh7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50OiBvYnNWYWwgfSlcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAob2JqKSA9PiBvYmoub2JzZXJ2YWJsZS5waXBlKG1hcChkYXRhT2JqKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vblVJRXZlbnQuYmluZCh0aGlzKSlcbiAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge31cbiAgICByZXR1cm4gZXFzTmFtZSA9PT0gdHJ1ZSA/IG9uU3VjY2VzcyhvYmopIDogb25FcnJvcigpXG4gIH1cblxuICBnZXRBY3Rpb25TdGF0ZSh2YWwpIHtcbiAgICBjb25zdCB0eXBlVmFsID0gcGF0aChbJ2V2ZW50JywgJ3R5cGUnXSlcbiAgICBjb25zdCB0eXBlT3ZlclJpZGVWYWwgPSBwYXRoKFsnZXZlbnQnLCAndHlwZU92ZXJSaWRlJ10pXG4gICAgY29uc3QgZXZlbnRUeXBlID0gY29tcG9zZSh0b1VwcGVyLCBlaXRoZXIodHlwZU92ZXJSaWRlVmFsLCB0eXBlVmFsKSlcbiAgICBjb25zdCB0eXBlID0gZXZlbnRUeXBlKHZhbClcbiAgICBjb25zdCBtYWluQWN0aW9uID0gJ0NIQU5ORUxfVUknXG4gICAgcmV0dXJuIHR5cGUgIT09IHVuZGVmaW5lZCA/IGAke21haW5BY3Rpb259XyR7dHlwZX1fRVZFTlRgIDogbWFpbkFjdGlvblxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yRXZlbnRNZXRob2RzKG9icykge1xuICAgIGNvbnN0IHJlID0gL14oZXZlbnQpKFtBLVpdLiopKFtBLVpdLiopJC9nbVxuICAgIGNvbnN0IGdldE1ldGhvZHMgPSBjb21wb3NlKGZpbHRlcih0ZXN0KHJlKSksIGtleXMsIHByb3AoJ3BheWxvYWQnKSlcbiAgICBjb25zdCBtZXRob2RzQXJyID0gZ2V0TWV0aG9kcyhvYnMpXG4gICAgaWYgKG1ldGhvZHNBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGV2dCA9IHByb3AoJ2V2ZW50Jywgb2JzKVxuICAgICAgaWYgKGV2dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZFVwZGF0ZSA9IChtYXRjaCwgcDEsIHAyLCBwMywgcDQpID0+IFN0cmluZyhwMikudG9Mb3dlckNhc2UoKSArIHAzICsgcDRcbiAgICAgICAgY29uc3QgbWV0aG9kU3RyUmVwbGFjZSA9IHJlcGxhY2UoL14oZXZlbnQpKFtBLVpdKSguKikoW0EtWl0uKikkL2dtLCBtZXRob2RVcGRhdGUpXG4gICAgICAgIGNvbnN0IHJ1bk1ldGhvZCA9IChtZXRob2RTdHIpID0+IHtcbiAgICAgICAgICBjb25zdCBtID0gbWV0aG9kU3RyUmVwbGFjZShtZXRob2RTdHIpXG4gICAgICAgICAgaWYgKGV2dFttXSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAoZXZ0W21dKSA9PT0gJ2Z1bmN0aW9uJykgeyBldnRbbV0oKSB9XG4gICAgICAgIH1cbiAgICAgICAgbWV0aG9kc0Fyci5mb3JFYWNoKHJ1bk1ldGhvZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JzXG4gIH1cblxuICBvblVJRXZlbnQob2JzKSB7XG4gICAgZnVuY3Rpb24gZG9tU3RyaW5nTWFwVG9PYmplY3QoZG9tU3RyaW5nTWFwKSB7XG4gICAgICBjb25zdCBvYmogPSB7fVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZG9tU3RyaW5nTWFwKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl04oCZcyBhIGRpcmVjdCBwcm9wZXJ0eSAodGhvdWdoIGRhdGFzZXQgcmFyZWx5IGhhcyBhbnl0aGluZyBvbiB0aGUgcHJvdG90eXBlKTpcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkb21TdHJpbmdNYXAsIGtleSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IGRvbVN0cmluZ01hcFtrZXldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpcbiAgICB9XG5cbiAgICBvYnMucGF5bG9hZCA9IGRvbVN0cmluZ01hcFRvT2JqZWN0KG9icz8uc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpID8/IG9icy5wYXlsb2FkXG5cbiAgICBTcHluZUNoYW5uZWxVSS5jaGVja0ZvckV2ZW50TWV0aG9kcyhvYnMpXG4gICAgb2JzLmFjdGlvbiA9IHRoaXMuZ2V0QWN0aW9uU3RhdGUob2JzKVxuICAgIGNvbnN0IGFjdGlvbiA9IG9icy5hY3Rpb24vLyB0aGlzLmdldEFjdGlvblN0YXRlKG9icyk7XG4gICAgLy8gY29uc3QgeyBzcmNFbGVtZW50IH0gPSBvYnNcbiAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQgfSA9IG9ic1xuXG4gICAgY29uc3QgZXZlbnQgPSBvYnMuZXZlbnRcbiAgICAvLyBjb25zdCBwYXlsb2FkID0gZG9tU3RyaW5nTWFwVG9PYmplY3Qoc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpID8/IG9icy5wYXlsb2FkXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsV2luZG93IH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC13aW5kb3cuanMnXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAsIGRlYm91bmNlVGltZSwgc2tpcFdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjdXJyeSwgcGljaywgcGFydGlhbFJpZ2h0LCBtYXBPYmpJbmRleGVkLCBhcHBseSwgbWFwIGFzIHJNYXAgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxXaW5kb3cgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsV2luZG93XG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhlIFdpbmRvdyBDaGFubmVsIHdpbGwgbGlzdGVuIHRvIHdpbmRvdyBhbmQgZG9jdW1lbnQgZXZlbnRzIHRoYXQgYXJlIHNldCBpbiBpdHMgY29uZmlndXJhdGlvbiBmaWxlXG4gICAqIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUgbW9kYWwtYnRuJyAgZGF0YS10eXBlPSdtb2RhbC13aW5kb3cnIGRhdGEtdmFsdWU9J3dpbmRvd0V2ZW50cyc+VmlldyBXaW5kb3cgRXZlbnRzPC9kaXY+PC9icj48L2JyPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IENIQU5ORUxfTkFNRVxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcgLSA9IHt9OyBUaGUgY29uZmlnIGhhcyBzZXZlcmFsIG9wdGlvbnMgdXNlZCB0byBsaXN0ZW4gdG8gd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IGNvbmZpZy5ldmVudHMgLSA9IFtdOyBBbnkgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMgY2FuIGJlIGFkZGVkIGhlcmUuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcubWVkaWFRdWVyaWVzIC0gPSB7fTsgTWVkaWEgcXVlcmllcyBhcmUgYWRkZWQgYXMga2V5LHZhbHVlIHBhaXJzOyB0aGUga2V5IGlzIHRoZSBuYW1lIG9mIHRoZSBib29sZWFuIGZvciB0aGUgcXVlcnksIHRoZSB2YWx1ZSBpcyB0aGUgcXVlcnkgaXRzZWxmLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5saXN0ZW5Gb3JSZXNpemUgLSA9IHRydWU7IFRoaXMgaXMgZGVmYXVsdCBsaXN0ZW5pbmcgZm9yIHJlc2l6ZSBldmVudC5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcubGlzdGVuRm9yT3JpZW50YXRpb24gLSA9IHRydWU7IExpc3RlbiBmb3IgaG9yaXpvbnRhbCBhbmQgbGFuZHNjYXBlIG9yaWVudGF0aW9uIGNoYW5nZXMgb24gbW9iaWxlIGRldmljZXMuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmxpc3RlbkZvck1vdXNlV2hlZWwgLSA9IGZhbHNlOyBJZiBzZXQgdG8gdHJ1ZSwgd2lsbCBsaXN0ZW4gZm9yIG1vdXNlV2hlZWwgYW5kIHdpbGwgYWRkIGRpcmVjdGlvbiBhbmQgZGlzdGFuY2UgcGFyYW1ldGVycy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JSZXNpemUgLSA9IDIwMDsgVGhlIHRpbWUgYmV0d2VlbiByZXNpemUgZXZlbnRzIGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGwgLSA9IDE1MDsgVGhlIHRpbWUgYmV0d2VlbiBzY3JvbGwgZXZlbnRzIGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfV0lORE9XJztcbiAgICpcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKENIQU5ORUxfTkFNRSA9ICdDSEFOTkVMX1dJTkRPVycpIHtcbiAgICBzdXBlcihDSEFOTkVMX05BTUUpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kcygpXG4gICAgdGhpcy5jdXJyZW50U2Nyb2xsWSA9IDBcbiAgfVxuXG4gIGluaXRpYWxpemVTdHJlYW0oKSB7XG4gICAgdGhpcy5kb21DaGFubmVsQ29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5XSU5ET1dcbiAgICBjb25zdCBvYnMkQXJyID0gdGhpcy5nZXRBY3RpdmVPYnNlcnZhYmxlcygpXG4gICAgY29uc3QgZG9tJCA9IG1lcmdlKC4uLm9icyRBcnIpXG4gICAgdGhpcy5kb20kID0gZG9tJFxuICAgIGRvbSQuc3Vic2NyaWJlKHAgPT4ge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgZ2V0TW91c2VXaGVlbE1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVFxuICAgIGNvbnN0IHNjcm9sbERpciA9IGV2ZW50LmRlbHRhWSA8PSAwID8gJ3VwJyA6ICdkb3duJ1xuICAgIGNvbnN0IHsgZGVsdGFYLCBkZWx0YVksIGRlbHRhWiB9ID0gZXZlbnRcbiAgICBjb25zdCBwYXlsb2FkID0geyBzY3JvbGxEaXIsIGRlbHRhWCwgZGVsdGFZLCBkZWx0YVogfVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQ3VycmllZEdlbmVyaWNFdmVudChhY3Rpb25TdHIpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBgQ0hBTk5FTF9XSU5ET1dfJHthY3Rpb25TdHIudG9VcHBlckNhc2UoKX1fRVZFTlRgXG4gICAgY29uc3QgY3VycnlGbiA9IGN1cnJ5KFNweW5lQ2hhbm5lbFdpbmRvdy5tYXBHZW5lcmljRXZlbnQpXG4gICAgcmV0dXJuIGN1cnJ5Rm4oYWN0aW9uKVxuICB9XG5cbiAgc3RhdGljIG1hcEdlbmVyaWNFdmVudChhY3RuLCBldmVudCkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwibWFwIGdlbmVyaWMgZXZlbnQgXCIsYWN0bik7XG4gICAgY29uc3QgYWN0aW9uID0gYWN0blxuICAgIGNvbnN0IHBheWxvYWQgPSBldmVudFxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgZ2V0UmVzaXplTWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX1JFU0laRV9FVkVOVFxuICAgIGNvbnN0IHBheWxvYWQgPSBwaWNrKFxuICAgICAgWydpbm5lcldpZHRoJywgJ2lubmVySGVpZ2h0JywgJ291dGVyV2lkdGgnLCAnb3V0ZXJIZWlnaHQnXSwgd2luZG93KVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgZ2V0T3JpZW50YXRpb25NYXBGbihldmVudCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9XSU5ET1dfT1JJRU5UQVRJT05fRVZFTlRcbiAgICBjb25zdCBvcmllbnRhdGlvblN0ciA9ICcob3JpZW50YXRpb246IHBvcnRyYWl0KSdcbiAgICBjb25zdCBpc1BvcnRyYWl0Qm9vbCA9IHdpbmRvdy5tYXRjaE1lZGlhKG9yaWVudGF0aW9uU3RyKS5tYXRjaGVzXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soXG4gICAgICBbJ2lubmVyV2lkdGgnLCAnaW5uZXJIZWlnaHQnLCAnb3V0ZXJXaWR0aCcsICdvdXRlckhlaWdodCddLCB3aW5kb3cpXG4gICAgcGF5bG9hZC5vcmllbnRhdGlvbiA9IGlzUG9ydHJhaXRCb29sID09PSB0cnVlXG4gICAgICA/ICdwb3J0cmFpdCdcbiAgICAgIDogJ2xhbmRzY2FwZSdcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgZ2V0TWVkaWFRdWVyeU1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19NRURJQV9RVUVSWV9FVkVOVFxuICAgIGNvbnN0IHBheWxvYWQgPSBwaWNrKFsnbWF0Y2hlcycsICdtZWRpYScsICdtZWRpYVF1ZXJ5TmFtZSddLCBldmVudClcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgY3JlYXRlTW91c2VXaGVlbE9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgZGVib3VuY2VUID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsXG5cbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgnd2hlZWwnLFxuICAgICAgU3B5bmVDaGFubmVsV2luZG93LmdldE1vdXNlV2hlZWxNYXBGbi5iaW5kKHRoaXMpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZShkZWJvdW5jZVQpXG4gICAgICApXG4gIH1cblxuICBzdGF0aWMgZ2V0U2Nyb2xsRGF0YSgpIHtcbiAgICBsZXQgY3VycmVudFNjcm9sbFkgPSAwXG5cbiAgICBjb25zdCBnZXRTY3JvbGxEYXRhID0gKHNjcm9sbFkpID0+IHtcbiAgICAgIGNvbnN0IHNjcm9sbERpc3RhbmNlID0gY3VycmVudFNjcm9sbFkgLSBzY3JvbGxZXG4gICAgICBjb25zdCBzY3JvbGxEaXIgPSBzY3JvbGxEaXN0YW5jZSA+PSAwID8gJ3VwJyA6ICdkb3duJ1xuICAgICAgY3VycmVudFNjcm9sbFkgPSBzY3JvbGxZXG4gICAgICByZXR1cm4geyBzY3JvbGxZLCBzY3JvbGxEaXN0YW5jZSwgc2Nyb2xsRGlyIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFNjcm9sbERhdGFcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxZKHNjcm9sbEVsZW1lbnQpIHtcbiAgICByZXR1cm4gc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldCAhPT0gdW5kZWZpbmVkID8gc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldCA6IHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wXG4gIH1cblxuICBzdGF0aWMgZ2V0U2Nyb2xsTWFwRm4oZXZlbnQsIGludGVydmFsLCBhY3Rpb24sIHNjcm9sbERhdGFGbiwgc2Nyb2xsRWxlbWVudCkge1xuICAgIGNvbnN0IHNjcm9sbFkgPSBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0U2Nyb2xsWShzY3JvbGxFbGVtZW50KVxuICAgIGNvbnN0IHBheWxvYWQgPSBzY3JvbGxEYXRhRm4oc2Nyb2xsWSlcbiAgICBjb25zdCB7IHNjcm9sbERpc3RhbmNlIH0gPSBwYXlsb2FkXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIHNjcm9sbERpc3RhbmNlLCBldmVudCB9XG4gIH1cblxuICBjcmVhdGVTY3JvbGxPYnNlcnZhYmxlKGNvbmZpZywgc2Nyb2xsRWxlbWVudCA9IHdpbmRvdywgaXNQYXNzaXZlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHNraXBXaGVuRGlySXNNaXNzaW5nID0gZXZ0ID0+IGV2dC5zY3JvbGxEaXN0YW5jZSA9PT0gMFxuICAgIGNvbnN0IGRUaW1lID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsXG5cbiAgICBjb25zdCBlbGVtZW50ID0gc2Nyb2xsRWxlbWVudFxuXG4gICAgY29uc3QgaXNXaW5kb3cgPSBzY3JvbGxFbGVtZW50ID09PSB3aW5kb3dcblxuICAgIGNvbnN0IHNjcm9sbEVsRm9yVmFscyA9IGNvbmZpZy5zY3JvbGxFbEZvclZhbHMgIT09IHVuZGVmaW5lZCA/IGNvbmZpZy5zY3JvbGxFbEZvclZhbHMgOiBzY3JvbGxFbGVtZW50XG4gICAgY29uc3QgYWN0aW9uID0gaXNXaW5kb3cgPyAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VWRU5UJyA6ICdDSEFOTkVMX1dJTkRPV19FTEVNRU5UX1NDUk9MTF9FVkVOVCdcblxuICAgIGNvbnN0IHNjcm9sbERhdGFGbiA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxEYXRhKClcbiAgICAvLyBjb25zb2xlLmxvZyhcIlNDUk9MTCBFTEVNRU5UIFwiLGFjdGlvbixzY3JvbGxFbGVtZW50LCBzY3JvbGxFbEZvclZhbHMpO1xuICAgIGNvbnN0IHNjcm9sbE1hcEZuID0gcGFydGlhbFJpZ2h0KFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxNYXBGbiwgW2FjdGlvbiwgc2Nyb2xsRGF0YUZuLCBzY3JvbGxFbEZvclZhbHMsIGlzUGFzc2l2ZSwgZWxlbWVudF0pLmJpbmQodGhpcylcblxuICAgIC8vIGNvbnNvbGUubG9nKFwiY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZSBcIiwge3Njcm9sbE1hcEZuLCBzY3JvbGxEYXRhRm4sIGFjdGlvbiwgY29uZmlnLCBzY3JvbGxFbGVtZW50LCBlbGVtZW50fSlcblxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KCdzY3JvbGwnLFxuICAgICAgc2Nyb2xsTWFwRm4sIGlzUGFzc2l2ZSwgZWxlbWVudClcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoZFRpbWUpLFxuICAgICAgICBza2lwV2hpbGUoc2tpcFdoZW5EaXJJc01pc3NpbmcpLFxuICAgICAgICBtYXAocCA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3U2Nyb2xsWSA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxZKGVsZW1lbnQpXG4gICAgICAgICAgcC5wYXlsb2FkLnNjcm9sbERpc3RhbmNlQWJzID0gTWF0aC5hYnModGhpcy5jdXJyZW50U2Nyb2xsWSAtIG5ld1Njcm9sbFkpXG4gICAgICAgICAgdGhpcy5jdXJyZW50U2Nyb2xsWSA9IG5ld1Njcm9sbFlcbiAgICAgICAgICByZXR1cm4gcFxuICAgICAgICB9KVxuICAgICAgKVxuICB9XG5cbiAgY3JlYXRlT3JpZW50YXRpb25PYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYWRkIG9yaWVudGF0aW9uXCIpO29yaWVudGF0aW9uY2hhbmdlXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ29yaWVudGF0aW9uY2hhbmdlJyxcbiAgICAgIFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRPcmllbnRhdGlvbk1hcEZuLmJpbmQodGhpcykpXG4gIH1cblxuICBjcmVhdGVSZXNpemVPYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIGNvbnN0IGRUaW1lID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yUmVzaXplXG4gICAgLy8gY29uc29sZS5sb2coJ3Jlc2l6ZSB0aGlzICcsIHRoaXMpO1xuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ3Jlc2l6ZScsXG4gICAgICBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0UmVzaXplTWFwRm4uYmluZCh0aGlzKSkucGlwZShkZWJvdW5jZVRpbWUoZFRpbWUpKVxuICB9XG5cbiAgZ2V0RXZlbnRzRnJvbUNvbmZpZyhjb25maWcgPSB0aGlzLmRvbUNoYW5uZWxDb25maWcpIHtcbiAgICBjb25zdCBvYnMkQXJyID0gY29uZmlnLmV2ZW50c1xuXG4gICAgY29uc3QgYWRkV2luZG93RXZlbnRUb0FyciA9IHN0ciA9PiB7XG4gICAgICBjb25zdCBtYXBGbiA9IFNweW5lQ2hhbm5lbFdpbmRvdy5jcmVhdGVDdXJyaWVkR2VuZXJpY0V2ZW50KHN0cilcbiAgICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KHN0ciwgbWFwRm4pXG4gICAgfVxuXG4gICAgcmV0dXJuIHJNYXAoYWRkV2luZG93RXZlbnRUb0Fyciwgb2JzJEFycilcbiAgfVxuXG4gIGdldEFjdGl2ZU9ic2VydmFibGVzKGNvbmZpZyA9IHRoaXMuZG9tQ2hhbm5lbENvbmZpZykge1xuICAgIGxldCBvYnMkQXJyID0gW11cblxuICAgIC8vIENIRUNLIFRPIEFERCBNRURJQSBRVUVSWSBPQlNFUlZBQkxFXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uZmlnLmxpc3RlbkZvck1lZGlhUXVlcmllcyA9IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwoXG4gICAgICBjb25maWcubWVkaWFRdWVyaWVzKSB8fCBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKFxuICAgICAgY29uZmlnLm1lZGlhUXVlcmllcylcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBjb25zdCBtZXRob2RzID0ge1xuICAgICAgbGlzdGVuRm9yUmVzaXplOiB0aGlzLmNyZWF0ZVJlc2l6ZU9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvck9yaWVudGF0aW9uOiB0aGlzLmNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yU2Nyb2xsOiB0aGlzLmNyZWF0ZVNjcm9sbE9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvcldoZWVsOiB0aGlzLmNyZWF0ZU1vdXNlV2hlZWxPYnNlcnZhYmxlLmJpbmQodGhpcylcbiAgICB9XG5cbiAgICBjb25zdCBhZGRPYnNlcnZhYmxlVG9BcnIgPSAobWV0aG9kLCBrZXksIGkpID0+IHtcbiAgICAgIGNvbnN0IGFkZE9ic0Jvb2wgPSBjb25maWdba2V5XVxuICAgICAgaWYgKGFkZE9ic0Jvb2wpIHtcbiAgICAgICAgb2JzJEFyci5wdXNoKG1ldGhvZChjb25maWcpKVxuICAgICAgfVxuICAgIH1cblxuICAgIG1hcE9iakluZGV4ZWQoYWRkT2JzZXJ2YWJsZVRvQXJyLCBtZXRob2RzKVxuXG4gICAgLy8gJ2xpc3RlbkZvck1lZGlhUXVlcmllcycgOiB0aGlzLmdldE1lZGlhUXVlcnlPYnNlcnZhYmxlLmJpbmQodGhpcylcbiAgICB0aGlzLmNoZWNrRm9yTWVkaWFRdWVyaWVzKGNvbmZpZy5saXN0ZW5Gb3JNZWRpYVF1ZXJpZXMpXG5cbiAgICBjb25zdCBldmVudHNBcnIgPSB0aGlzLmdldEV2ZW50c0Zyb21Db25maWcoY29uZmlnKVxuICAgIG9icyRBcnIgPSBvYnMkQXJyLmNvbmNhdChldmVudHNBcnIpXG5cbiAgICByZXR1cm4gb2JzJEFyclxuICB9XG5cbiAgY2hlY2tGb3JNZWRpYVF1ZXJpZXMoYm9vbCkge1xuICAgIGNvbnN0IHNlbmRNUVN0cmVhbSA9IHAgPT4ge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50LFxuICAgICAgICB0aGlzLm9ic2VydmVyJClcbiAgICB9XG5cbiAgICBpZiAoYm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5nZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSh0aGlzLmRvbUNoYW5uZWxDb25maWcpXG4gICAgICAgIC5zdWJzY3JpYmUoc2VuZE1RU3RyZWFtKVxuICAgIH1cbiAgfVxuXG4gIGdldE1lZGlhUXVlcnlPYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iaihjb25maWcpXG4gICAgLy8gY29uc29sZS5sb2coXCJBUlIgSVMgXCIse2Fycn0pO1xuICAgIGNvbnN0IG9icyQgPSBhcHBseShtZXJnZSwgYXJyKVxuICAgIHJldHVybiBvYnMkLnBpcGUobWFwKHRoaXMuZ2V0TWVkaWFRdWVyeU1hcEZuLmJpbmQodGhpcykpKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BQk9SVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQUZURVJQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQU5JTUFUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BTklNQVRJT05JVEVSQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FOSU1BVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BUFBJTlNUQUxMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFRk9SRVBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19CRUZPUkVVTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFR0lORVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JMVVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NBQ0hFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0xPU0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT01QT1NJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT01QT1NJVElPTlVQREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09QWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EQkxDTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VMSUdIVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFTU9USU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VPUklFTlRBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFUFJPWElNSVRZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01BVFRSSUJVVEVOQU1FQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQVRUUk1PRElGSUVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01DSEFSQUNURVJEQVRBTU9ESUZJRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUVMRU1FTlROQU1FQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR0VOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RST1BfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0VMRU1FTlRfU0NST0xMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRk9DVVNJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRk9DVVNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZVTExTQ1JFRU5DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZVTExTQ1JFRU5FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSEFTSENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0lOVkFMSURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWVBSRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19LRVlVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01FU1NBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRVdIRUVMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PRkZMSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PTkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09QRU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09SSUVOVEFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QQUdFSElERV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUEFHRVNIT1dfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BBU1RFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUE9QU1RBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BST0dSRVNTRVZFTlRTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19SRVNFVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRUxFTUVOVF9BRERFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfTE9DS19FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9MT0NLX0VWRU5UJywgJ29uU2Nyb2xsTG9ja0V2ZW50J10sXG4gICAgICBbJ0NIQU5ORUxfV0lORE9XX1NFVF9FTEVNRU5UX1RPX1NDUk9MTF9FVkVOVCcsICdvblNldEVsZW1lbnRUb1Njcm9sbCddLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NUT1JBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NVQk1JVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTlJVTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19VTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1dIRUVMX0VWRU5UJ1xuICAgIF1cbiAgfVxuXG4gIG9uU2Nyb2xsTG9ja0V2ZW50KGUpIHtcbiAgICAvLyBERVBSRUNBVEVEIC0tIE1PVkVEIFRPIHNweW5lLXBsdWdpbi1zY3JvbGwtbG9jaztcbiAgfVxuXG4gIG9uU2V0RWxlbWVudFRvU2Nyb2xsKGUpIHtcbiAgICBsZXQgeyBjb25maWcsIGVsLCBzY3JvbGxFbGVtZW50IH0gPSBlLnBheWxvYWRcbiAgICBjb25maWcgPSBjb25maWcgfHwge31cbiAgICBjb25maWcgPSBkZWVwTWVyZ2UodGhpcy5kb21DaGFubmVsQ29uZmlnLCBjb25maWcpXG5cbiAgICBzY3JvbGxFbGVtZW50ID0gc2Nyb2xsRWxlbWVudCB8fCBlbFxuXG4gICAgY29uc3QgYWN0aW9uID0gJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9FTEVNRU5UX0FEREVEX0VWRU5UJ1xuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgeyBlbCB9LCBlbClcblxuICAgIHRoaXMuY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZShjb25maWcsIHNjcm9sbEVsZW1lbnQpXG4gICAgICAuc3Vic2NyaWJlKHAgPT4ge1xuICAgICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICAgIH0pXG4gIH1cblxuICBiaW5kU3RhdGljTWV0aG9kcygpIHtcbiAgICB0aGlzLmNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVkaWFRdWVyeUhhbmRsZXIuYmluZChcbiAgICAgIHRoaXMpXG4gICAgdGhpcy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iai5iaW5kKFxuICAgICAgdGhpcylcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbHNNYXAgfSBmcm9tICcuL2NoYW5uZWxzL2NoYW5uZWxzLW1hcC5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuL3ZpZXdzL3ZpZXctc3RyZWFtLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBzYW5pdGl6ZUhUTUxDb25maWd1cmUgfSBmcm9tICcuL3V0aWxzL3Nhbml0aXplLWh0bWwuanMnXG5cbmNvbnN0IF9jaGFubmVscyA9IG5ldyBDaGFubmVsc01hcCgpXG5jb25zdCB2ZXJzaW9uID0gJzAuMjAuNydcblxuY2xhc3MgU3B5bmVBcHBsaWNhdGlvbiB7XG4gIC8qKlxuICAgKlxuICAgKiBTcHluZUFwcCBjcmVhdGVzIHRoZSBnbG9iYWwgU3B5bmUgb2JqZWN0LCBhbmQgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGl0ZW1zXG4gICAqIDx1bD5cbiAgICpcbiAgICogPGxpPkxJTktbJ0NoYW5uZWxzTWFwJywgJ2NoYW5uZWxzLWNvbnRyb2xsZXInXSB0aGF0IGRpcmVjdHMgdGhlIGZsb3cgb2YgZGF0YSB0byBhbGwgQ2hhbm5lbHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsVUknLCAnc3B5bmUtY2hhbm5lbC11LWknXSwgdGhhdCBicm9hZGNhc3QgYWxsIHVzZXIgaW50ZXJhY3Rpb24gZXZlbnRzPC9saT5cbiAgICogPGxpPkxJTktbJ1NweW5lQ2hhbm5lbFJvdXRlJywgJ3NweW5lLWNoYW5uZWwtcm91dGUnXSwgdGhhdCBicm9hZGNhc3Qgd2luZG93IGxvY2F0aW9uIGNoYW5nZXMgYW5kIGlzIHRoZSBvbmx5IG90aGVyIGNoYW5uZWwgdGhhdCBjYW4gYmUgYm91bmQgdG8gdXNlciBldmVudHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsV2luZG93JywgJ3NweW5lLWNoYW5uZWwtd2luZG93J10sIHRoYXQgYnJvYWRjYXN0IGFsbCByZXF1ZXN0ZWQgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMsIHN1Y2ggYXMgc2Nyb2xsaW5nLCByZXNpemluZyBhbmQgbWVkaWEgcXVlcmllczwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgdGhhdCBicm9hZGNhc3RzIHJlbmRlcmluZyBhbmQgcmVtb3Zpbmcgb2YgVmlld1N0cmVhbSBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBkaXJlY3RlZCB0byBicm9hZGNhc3QgdGhlaXIgbGlmZWN5Y2xlIGV2ZW50czwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqXG4gICAqIEBtb2R1bGUgU3B5bmVBcHBcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnIC0gPSB7fTsgVGhpcyBnbG9iYWwgY29uZmlnIG9iamVjdCBpcyBtYWlubHkgdXNlZCB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdHdvIFNweW5lQ2hhbm5lbHMsIENIQU5ORUxfUk9VVEUgYW5kIENIQU5ORUxfV0lORE9XLlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uXG5cbiAgICAvLyBjb25zb2xlLmxvZygnc3B5bmUgYXBwIGNyZWF0ZWQnKVxuICB9XG5cbiAgZ2V0IGNoYW5uZWxzKCkge1xuICAgIHJldHVybiBfY2hhbm5lbHNcbiAgfVxuXG4gIGluaXQoY29uZmlnID0ge30sIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICAvLyB0aGlzLmNoYW5uZWxzID0gbmV3IENoYW5uZWxzTWFwKCk7XG4gICAgLyohXG4gICAgICogU3B5bmUgMC4yMC43XG4gICAgICogaHR0cHM6Ly9zcHluZWpzLm9yZ1xuICAgICAqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgMjAxNy0yMDI1LCBGcmFuayBCYXRpc3RhLFxuICAgICAqIFJlbGV2YW50IENvbnRleHQsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICAgKiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgICogQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgaW4gdGhlIHByb2plY3Qgcm9vdCwgb3IgYXQ6XG4gICAgICogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLTMuMC5odG1sXG4gICAgICpcbiAgICAgKiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBkaXN0cmlidXRpb24uXG4gICAgICovXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cblxuXG5cblxuICAgIGlmKFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSl7XG4gICAgICBpZiAodGVzdE1vZGUpe1xuICAgICAgICByZXR1cm4gJ1RoZSBTcHluZSBBcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkISc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSBTcHluZSBBcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy9jb25zdCBpbWdQYXRoID0gSU1HX1BBVEggfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGltZ1BhdGggPSAodHlwZW9mIElNR19QQVRIICE9PSAndW5kZWZpbmVkJykgPyBJTUdfUEFUSCA6IHVuZGVmaW5lZDtcbiAgICBsZXQgZGVmYXVsdENvbmZpZyA9IHtcbiAgICAgIHNjcm9sbExvY2s6IGZhbHNlLFxuICAgICAgc2Nyb2xsTG9ja1g6IDMxLFxuICAgICAgc2Nyb2xsTG9ja1k6IDAsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgICAgYmFzZUhyZWY6IHVuZGVmaW5lZCxcbiAgICAgIElNR19QQVRIOiBpbWdQYXRoLFxuICAgICAgcGx1Z2luTWV0aG9kczp7XG5cbiAgICAgIH0sXG4gICAgICBwbHVnaW5zOntcblxuICAgICAgfSxcbiAgICAgIHRtcDoge30sXG4gICAgICBlcGhlbWVyYWxQcm9wczoge30sXG4gICAgICB0bXBQcm9wczoge30sXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICBXSU5ET1c6IHtcbiAgICAgICAgICBtZWRpYVF1ZXJpZXM6IHtcblxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgICAgICBsaXN0ZW5Gb3JSZXNpemU6IHRydWUsXG4gICAgICAgICAgbGlzdGVuRm9yT3JpZW50YXRpb246IHRydWUsXG4gICAgICAgICAgbGlzdGVuRm9yU2Nyb2xsOiBmYWxzZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JNb3VzZVdoZWVsOiBmYWxzZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JXaGVlbDogZmFsc2UsXG4gICAgICAgICAgZGVib3VuY2VNU1RpbWVGb3JSZXNpemU6IDIwMCxcbiAgICAgICAgICBkZWJvdW5jZU1TVGltZUZvclNjcm9sbDogMTUwXG4gICAgICAgIH0sXG5cbiAgICAgICAgUk9VVEU6IHtcbiAgICAgICAgICB0eXBlOiAnc2xhc2gnLFxuICAgICAgICAgIGlzSGFzaDogZmFsc2UsXG4gICAgICAgICAgaXNIaWRkZW46IGZhbHNlLFxuICAgICAgICAgIGFkZDQwNHM6IGZhbHNlLFxuICAgICAgICAgIHJvdXRlczoge1xuICAgICAgICAgICAgJ3JvdXRlUGF0aCcgOiB7XG4gICAgICAgICAgICAgICdyb3V0ZU5hbWUnIDogJ2NoYW5nZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKGNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByb3V0ZVV0aWxzID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZTtcbiAgICAgICBjb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZShkZWZhdWx0Q29uZmlnLCBjb25maWcsIF9jaGFubmVscywgcm91dGVVdGlscyk7XG4gICAgICAgLy9jb25zb2xlLmxvZyhcIlNQWU5FIEFQUCBQUk9QUyBcIixTcHluZUFwcFByb3BlcnRpZXMpO1xuICAgICAgLy93aW5kb3cuU3B5bmUgPSB0aGlzO1xuICAgICAgLy93aW5kb3cuU3B5bmVbJ2NvbmZpZyddID0gZGVlcE1lcmdlKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgICB9XG4gICAgdGhpcy5wbHVnaW5zRm4gPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0UGx1Z2luc01ldGhvZE9iaihjb25maWdbJ3BsdWdpbk1ldGhvZHMnXSk7XG4gICAgdGhpcy5nZXRDaGFubmVsQWN0aW9ucyA9IChzdHIpID0+IF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpO1xuICAgIHRoaXMucmVnaXN0ZXJDaGFubmVsID0gKHZhbCkgPT4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKHZhbCk7XG4gICAgdGhpcy5yZWdpc3RlclBsdWdpbiA9IChwbHVnaW5JbnN0YW5jZSkgPT4gU3B5bmVBcHBQcm9wZXJ0aWVzLnJlZ2lzdGVyUGx1Z2luKHBsdWdpbkluc3RhbmNlKTtcbiAgICB0aGlzLnJlZ2lzdGVyRGF0YUNoYW5uZWwgPSAob2JzJCkgPT4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKG9icyQpO1xuICAgIHRoaXMubGlzdENoYW5uZWxzID0gKCkgPT4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSk7XG4gICAgbGV0IG51bGxIb2xkZXIgPSBuZXcgVmlld1N0cmVhbSh7IGlkOidzcHluZS1udWxsLXZpZXdzJyB9KTtcbiAgICBudWxsSG9sZGVyLmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgIG51bGxIb2xkZXIucHJvcHMuZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5Om5vbmU7IG9wYWNpdHk6MDsgcG9pbnRlci1ldmVudHM6bm9uZTsnO1xuICAgIF9jaGFubmVscy5pbml0KCk7XG5cbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5kZWJ1Zz09PXRydWUpe1xuICAgICAgIHdpbmRvdy5TcHluZSA9IHt2ZXJzaW9ufTtcbiAgICB9XG5cbiAgICBzYW5pdGl6ZUhUTUxDb25maWd1cmUoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5MaXN0aW5nIHRoZSByZWdpc3RlcmVlZCBDaGFubmVscyBpbiB0aGUgYnJvd3NlciBjb25zb2xlPC9oND4nXVxuICAgKiBTcHluZUFwcC5saXN0Q2hhbm5lbHMoKTtcbiAgICpcbiAgICogQHJldHVybnMgQSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIGNoYW5uZWxzXG4gICAqL1xuICBzdGF0aWMgbGlzdENoYW5uZWxzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKF9jaGFubmVscy5tYXAua2V5cygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gY2hlY2sgaW4gdGhlIGNvbnNvbGUgb3IgaW4gdGhlIGNvZGUgd2hhdCBhY3Rpb25zIGFyZSBhdmFpbGFibGUgdG8gYmUgbGlzdGVuZWQgdG8uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiBBY3Rpb25zIHRoYXQgY2FuIGJlIGxpc3RlbmVkIHRvXG4gICAqL1xuICBzdGF0aWMgZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKSB7XG4gICAgcmV0dXJuIF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgYWRkIHRoZSBjaGFubmVsIHRvIHRoZSByZWdpc3RlcmVkIGxpc3Qgc28gdGhhdCBpdCBjYW4gc3Vic2NyaWJlZCBieSBhbGwgVmlld1N0cmVhbSBhbmQgQ2hhbm5lbCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7Q2hhbm5lbH0gY1xuICAgKlxuICAgKlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyQ2hhbm5lbChjKSB7XG4gICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3B5bmUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfY2hhbm5lbHMucmVnaXN0ZXJTdHJlYW0oYyk7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IGxldCBTcHluZUFwcCA9IG5ldyBTcHluZUFwcGxpY2F0aW9uKCk7XG4iLCJpbXBvcnQgeyBEb21FbGVtZW50IH0gZnJvbSAnLi92aWV3cy9kb20tZWxlbWVudC5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBpcywgY2xvbmUsIHBhdGhTYXRpc2ZpZXMgfSBmcm9tICdyYW1kYSdcbmxldCBfc3B5bmVBcHBQcm9wcyA9IFNweW5lQXBwUHJvcGVydGllc1xuZXhwb3J0IGNsYXNzIFNweW5lUGx1Z2luIHtcbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIGxldCB7IG5hbWUsIGNvbmZpZywgcGFyZW50RWwgfSA9IHByb3BzXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG5cbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZyA9IGNsb25lKHByb3BzKVxuICAgIH1cblxuICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgJ2VtcHR5J1xuICAgIHRoaXMucHJvcHMubmFtZSA9IG5hbWVcbiAgICBjb25maWcgPSBTcHluZVBsdWdpbi5tZXJnZURlZmF1bHRDb25maWcoY29uZmlnLCB0aGlzLmRlZmF1bHRDb25maWcoKSlcbiAgICB0aGlzLnByb3BzLnBhcmVudEVsID0gcGFyZW50RWwgfHwgU3B5bmVQbHVnaW4uY3JlYXRlUGFyZW50RWwoKVxuICAgIC8vIFNweW5lUGx1Z2luLmdldFNweW5lQXBwKG5hbWUsIGNvbmZpZylcbiAgICB0aGlzLnByb3BzLmNvbmZpZyA9IGNvbmZpZ1xuICAgIGlmICh0aGlzLnByb3BzLnRyYWl0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFkZFRyYWl0cyh0aGlzLnByb3BzLnRyYWl0cylcbiAgICB9XG5cbiAgICAvLyB0aGlzLm9uQmVmb3JlUmVnaXN0ZXJlZCgpXG4gICAgLy8gdGhpcy5vblJlZ2lzdGVyZWQoKVxuICAgIC8vIHRoaXMub25SZW5kZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdyB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBhcHAgZGVjaWRlcyB0byByZWdpc3RlciB0aGUgcGx1Z2luLlxuICAgKiBUaGlzIHdheSwgdGhlIHBsdWdpbiBubyBsb25nZXIgaGFzIHRvIGltcG9ydCBvciByZWx5IG9uIGl0cyBvd24gdmVyc2lvblxuICAgKiBvZiBTcHluZUFwcFByb3BlcnRpZXMuIEluc3RlYWQsIGl0IGlzICpwYXNzZWQqIHRoZSBhdXRob3JpdGF0aXZlIGluc3RhbmNlLlxuICAgKi9cbiAgcmVnaXN0ZXIoc3B5bmVBcHBQcm9wcykge1xuICAgIC8vIDEuIFNhdmUgYSByZWZlcmVuY2UgdG8gdGhlIHJlYWwgU3B5bmVBcHBQcm9wZXJ0aWVzXG4gICAgX3NweW5lQXBwUHJvcHMgPSBzcHluZUFwcFByb3BzXG4gICAgdGhpcy5wcm9wcy5wbHVnaW5OYW1lID0gdGhpcy5wcm9wcy5uYW1lXG5cbiAgICAvLyB0aGlzLnByb3BzLmNvbmZpZyA9IF9zcHluZUFwcFByb3BzLmdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZSh0aGlzLnByb3BzLnBsdWdpbk5hbWUpXG5cbiAgICBpZiAoX3NweW5lQXBwUHJvcHMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFNweW5lIFdhcm5pbmc6IFNweW5lQXBwIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQhIENhbm5vdCByZWdpc3RlciBwbHVnaW4gXCIke3RoaXMubmFtZX1cIi5gXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLm9uQmVmb3JlUmVnaXN0ZXJlZCgpXG5cbiAgICAvLyAyLiBBZGQgcGx1Z2luIGNvbmZpZyBpbiB0aGUgcmVhbCBTcHluZUFwcFByb3BlcnRpZXNcbiAgICB0aGlzLnByb3BzLmNvbmZpZyA9IGNsb25lKHRoaXMucHJvcHMuY29uZmlnKVxuICAgIF9zcHluZUFwcFByb3BzLmFkZFBsdWdpbkNvbmZpZyh0aGlzLm5hbWUsIHRoaXMucHJvcHMuY29uZmlnKVxuXG4gICAgLy8gSWYgeW91IGhhdmUgcGx1Z2luLWxldmVsIGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiB0aGUgcmVhbCBzcHluZUFwcCxcbiAgICAvLyB5b3UgY2FuIGFkZCBpdCBoZXJlLCBlLmcuOlxuICAgIC8vIHNweW5lQXBwUHJvcHMuYWRkUGx1Z2luTWV0aG9kcyh0aGlzLnByb3BzLmNvbmZpZy5wbHVnaW5NZXRob2RzKVxuXG4gICAgLy8gMy4gSWYgeW91IGhhdmUgb3RoZXIgcGx1Z2luIGxpZmVjeWNsZSBtZXRob2RzXG4gICAgdGhpcy5vblJlZ2lzdGVyZWQoKVxuICAgIHRoaXMub25SZW5kZXIoKVxuICB9XG5cbiAgZ2V0IFNweW5lQXBwUHJvcGVydGllcygpIHtcbiAgICByZXR1cm4gX3NweW5lQXBwUHJvcHNcbiAgfVxuXG4gIHN0YXRpYyBtZXJnZURlZmF1bHRDb25maWcoY29uZmlnID0ge30sIGRlZmF1bHRDb25maWcgPSB0aGlzLmRlZmF1bHRDb25maWcoKSkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgfVxuXG4gIHN0YXRpYyBnZXRTcHluZUFwcChuYW1lLCBjb25maWcpIHtcbiAgICBpZiAoX3NweW5lQXBwUHJvcHMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFVuYWJsZSB0byBpbnN0YWxsIHBsdWdpbiwgJHtuYW1lfSEgU3B5bmVBcHAgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIWApXG4gICAgICAvLyBTcHluZUFwcC5pbml0KClcbiAgICB9IGVsc2Uge1xuICAgICAgX3NweW5lQXBwUHJvcHMuYWRkUGx1Z2luQ29uZmlnKG5hbWUsIGNvbmZpZylcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdXBkYXRlU3B5bmVDb25maWcoc3B5bmVBcHAsIHBsdWdpbk5hbWUsIHBsdWdpbkNvbmZpZykge1xuICAgIGNvbnN0IHBhdGhFeGlzdHMgPSBwYXRoU2F0aXNmaWVzKGlzKE9iamVjdCksIFsnY29uZmlnJywgJ3BsdWdpbnMnLCBwbHVnaW5OYW1lXSkoc3B5bmVBcHApXG5cbiAgICBpZiAocGF0aEV4aXN0cyA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHNweW5lQXBwLmNvbmZpZy5kZWJ1ZyA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBwbHVnaW4sICR7cGx1Z2luTmFtZX0sIGFscmVhZHkgZXhpc3RzYClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBzcHluZUFwcC5jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXSA9IHBsdWdpbkNvbmZpZ1xuICAgIHJldHVybiBzcHluZUFwcC5jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVBhcmVudEVsKGVsKSB7XG4gICAgY29uc3QgY3JlYXRlUGx1Z2luUGFyZW50RWwgPSAoKSA9PiB7XG4gICAgICBjb25zdCBwbHVnaW5FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcHluZS1wbHVnaW5zJylcblxuICAgICAgY29uc3QgY3JlYXRlUGx1Z2luRWwgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBsdWdpbkVsID0gbmV3IERvbUVsZW1lbnQoe1xuICAgICAgICAgIGlkOiAnc3B5bmUtcGx1Z2lucydcbiAgICAgICAgfSlcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwbHVnaW5FbC5yZW5kZXIoKSlcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3B5bmUtcGx1Z2lucycpXG4gICAgICAgIGVsLnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246YWJzb2x1dGU7IHRvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO21pbi1oZWlnaHQ6MTAwdmg7ei1pbmRleDoxMDAwMDAwOyBwb2ludGVyLWV2ZW50czpub25lJ1xuICAgICAgICByZXR1cm4gZWxcbiAgICAgIH1cbiAgICAgIHJldHVybiBwbHVnaW5FbCB8fCBjcmVhdGVQbHVnaW5FbCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsIHx8IGNyZWF0ZVBsdWdpblBhcmVudEVsKClcbiAgfVxuXG4gIGFkZFRyYWl0cyh0cmFpdHMpIHtcbiAgICBpZiAodHJhaXRzLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdBcnJheScpIHtcbiAgICAgIHRyYWl0cyA9IFt0cmFpdHNdXG4gICAgfVxuICAgIGNvbnN0IGFkZFRyYWl0ID0gKFRyYWl0Q2xhc3MpID0+IHtcbiAgICAgIHJldHVybiBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgIH1cblxuICAgIHRyYWl0cy5mb3JFYWNoKGFkZFRyYWl0KVxuICB9XG5cbiAgb25CZWZvcmVSZWdpc3RlcmVkKCkge1xuICAgIC8vIHRoaXMucHJvcHMucGx1Z2luTmFtZSA9IHRoaXMucHJvcHMubmFtZVxuICAgIC8vIHRoaXMucHJvcHMuY29uZmlnID0gX3NweW5lQXBwUHJvcHMuZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lKHRoaXMucHJvcHMucGx1Z2luTmFtZSlcbiAgICB0aGlzLmNoZWNrRm9yUmVxdWlyZWRXaW5kb3dFdmVudCgpXG4gIH1cblxuICBjaGVja0ZvclJlcXVpcmVkV2luZG93RXZlbnQoKSB7XG4gICAgY29uc3QgcmVxdWlyZWRFdmVudHMgPSB0aGlzLnByb3BzLnJlcXVpcmVkRXZlbnRzID8/IFtdXG4gICAgY29uc3Qgd2luZG93Q29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldENoYW5uZWxDb25maWcoJ1dJTkRPVycpXG5cbiAgICBjb25zdCBtaXNzaW5nRXZlbnRzID0gcmVxdWlyZWRFdmVudHMuZmlsdGVyKGV2dCA9PiAhd2luZG93Q29uZmlnLmV2ZW50cy5pbmNsdWRlcyhldnQpKVxuXG4gICAgLy8gSWYgYW55IGFyZSBtaXNzaW5nLCBsb2cgYSBzaW5nbGUgd2FybmluZyBsaXN0aW5nIHRoZW1cbiAgICBpZiAobWlzc2luZ0V2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYHBsdWdpbiBcIiR7dGhpcy5wcm9wcy5uYW1lfVwiIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgY29uZmlnLldJTkRPVy5ldmVudHMsIC0tPiAke21pc3NpbmdFdmVudHMuam9pbignLCAnKX0gPC0tYFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGRlZmF1bHRDb25maWcoKSB7XG4gICAgcmV0dXJuIHtcblxuICAgIH1cbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZCgpIHtcblxuICB9XG5cbiAgb25SZW5kZXIoKSB7XG5cbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBmbGF0TWFwLCBtYXAsIHB1Ymxpc2gsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgY29tcG9zZSwgcHJvcCwgZGVmYXVsdFRvLCBvdmVyLCBsZW5zUHJvcCwgaGFzLCBwcm9wRXEsIHdoZW4sIHByb3BJcywgYWxsUGFzcywgYXNzb2MsIHBpY2ssIG1lcmdlRGVlcFJpZ2h0IH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgQ2hhbm5lbEZldGNoVXRpbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxGZXRjaFV0aWxcbiAgICogQHR5cGUgdXRpbFxuICAgKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBUaGlzIGlzIHRoZSBjb3JlIG9iamVjdCB1c2VkIGZvciBDaGFubmVsRmV0Y2guIFRoaXMgdXRpbGl0eSB3cmFwcyB0aGUgamF2YXNjcmlwdCBmZXRjaCBhcGkgaW50byBhbiBvYnNlcnZhYmxlLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgUHJvcGVydGllcyB1c2VkIHRvIGNyZWF0ZSB0aGUgZmV0Y2ggcmVxdWVzdFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdWJzY3JpYmVyIEEgbWV0aG9kIGFzc2lnbmVkIHRvIGxpc3RlbiB0byB0aGUgcmVzdWx0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdGVzdE1vZGUgQ29udHJvbHMgdGhlIGluaXRpYWxpenRpb24gZm9yIHVuaXQgdGVzdHNcbiAgICpcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMudXJsIC0gPSB1bmRlZmluZWQ7IFRoZSB1cmwgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMuc2VydmVyT3B0aW9ucyAtID0gdW5kZWZpbmVkOyBUaGUgcHJvcGVydGllcywgaGVhZGVyLCBib2R5LCBtb2RlLCBtZXRob2QsIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5tYXBGbiAtID0gdW5kZWZpbmVkOyBBIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBhcnNlIHRoZSBkYXRhIGJlZm9yZSBpdCdzIHJldHVybmVkXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLnJlc3BvbnNlVHlwZSAtID0gJ2pzb24nOyBEZWZhdWx0IGlzIGpzb25cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMuZGVidWcgLSA9IGZhbHNlOyB3aWxsIHRyYWNlIHRoZSBmZXRjaCByZXNwb25zZSB0byB0aGUgY29uc29sZSBiZWZvciB0aGUgb2JzZXJ2YWJsZSBjb21wbGV0ZXNcbiAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gU3Vic2NyaWJlciAtID0gdW5kZWZpbmVkOyB0aGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZmV0Y2ggaXMgY29tcGxldGUuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdGVzdE1vZGUgLSA9IGZhbHNlOyBVc2VkIGZvciB1bml0IHRlc3RpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBmZXRjaGVkIHJlc3BvbnNlIHBhcnNlZCBieSB0aGUgc2V0IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+VXNpbmcgQ2hhbm5lbEZldGNoVXRpbCB0byBSZXRyaWV2ZSBhbiBJbWFnZTwvaDQ+J11cbiAgICpcbiAgICogICBjb25zdCB1cmwgPSBcIi9zdGF0aWMvaW1hZ2VzL215aW1hZ2UuanBnXCI7XG4gICAqICAgY29uc3QgcmVzcG9uc2VUeXBlID0gXCJibG9iXCI7XG4gICAqICAgY29uc3Qgb25JbWdCbG9iUmV0dXJuZWQgPSAoYmxvYik9PntcbiAgICogICAgICAgIGxldCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICogICAgICAgIHRoaXMuYXBwZW5kVmlldyhcbiAgICogICAgICAgICAgICBuZXcgVmlld1N0cmVhbSh7XG4gICAqICAgICAgICAgICAgICB0YWdOYW1lOiAnaW1nJyxcbiAgICogICAgICAgICAgICAgIHNyYzogYmxvYlVybCxcbiAgICogICAgICAgICAgICAgIHdpZHRoOjMwMFxuICAgKiAgICAgICAgICAgIH0pXG4gICAqICAgICAgICAgICApfVxuICAgKlxuICAgKiAgIG5ldyBDaGFubmVsRmV0Y2hVdGlsKHt1cmwsIHJlc3BvbnNlVHlwZX0sIG9uSW1nQmxvYlJldHVybmVkKTtcbiAgICpcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucywgc3Vic2NyaWJlciwgdGVzdE1vZGUsIENIQU5ORUxfTkFNRSkge1xuICAgIGNvbnN0IHRlc3RTdWJzY3JpYmVyID0gKHApID0+IGNvbnNvbGUubG9nKCdGRVRDSCBSRVRVUk5FRCAnLCBwKVxuXG4gICAgdGhpcy5fbWFwRm4gPSBDaGFubmVsRmV0Y2hVdGlsLnNldE1hcEZuKG9wdGlvbnMpXG4gICAgdGhpcy5fdXJsID0gQ2hhbm5lbEZldGNoVXRpbC5zZXRVcmwob3B0aW9ucylcbiAgICB0aGlzLl9yZXNwb25zZVR5cGUgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFJlc3BvbnNlVHlwZShvcHRpb25zKVxuICAgIHRoaXMuX3NlcnZlck9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFNlcnZlck9wdGlvbnMob3B0aW9ucylcbiAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlciAhPT0gdW5kZWZpbmVkID8gc3Vic2NyaWJlciA6IHRlc3RTdWJzY3JpYmVyXG4gICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVidWcgOiBmYWxzZVxuICAgIHRoaXMuY2hhbm5lbE5hbWUgPSBDSEFOTkVMX05BTUVcblxuICAgIGNvbnN0IGZldGNoUHJvcHMgPSB7XG4gICAgICBtYXBGbjogdGhpcy5tYXBGbixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICBzZXJ2ZXJPcHRpb25zOiB0aGlzLnNlcnZlck9wdGlvbnMsXG4gICAgICByZXNwb25zZVR5cGU6IHRoaXMucmVzcG9uc2VUeXBlLFxuICAgICAgZGVidWc6IHRoaXMuZGVidWdcbiAgICB9XG4gICAgaWYgKHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBDaGFubmVsRmV0Y2hVdGlsLnN0YXJ0V2luZG93RmV0Y2goZmV0Y2hQcm9wcywgdGhpcy5fc3Vic2NyaWJlciwgdGhpcy5jaGFubmVsTmFtZSlcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgc3RhcnRXaW5kb3dGZXRjaChwcm9wcywgc3Vic2NyaWJlciwgY2hhbm5lbE5hbWUpIHtcbiAgICBjb25zdCB7IG1hcEZuLCB1cmwsIHNlcnZlck9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgZGVidWcgfSA9IHByb3BzXG4gICAgY29uc3QgdGFwTG9nRGVidWcgPSBwID0+IGNvbnNvbGUubG9nKCdERUJVRyBGRVRDSCA6JywgcCwgeyB1cmwsIHNlcnZlck9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgY2hhbm5lbE5hbWUgfSlcbiAgICBjb25zdCB0YXBMb2cgPSBkZWJ1ZyA9PT0gdHJ1ZSA/IHRhcExvZ0RlYnVnIDogKCkgPT4ge31cblxuICAgIGNvbnN0IG1hcFdyYXBwZXIgPSAobWFwTWV0aG9kKSA9PiB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHsgY2hhbm5lbE5hbWUsIHVybCwgcmVzcG9uc2VUeXBlLCBzZXJ2ZXJPcHRpb25zIH1cblxuICAgICAgcmV0dXJuIChkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBtYXBNZXRob2QoZGF0YSwgbWV0YWRhdGEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coJ1NFUlZFUiBPUFRJT05TICcsIHsgcHJvcHMsIHNlcnZlck9wdGlvbnMgfSlcblxuICAgIGNvbnN0IHJlc3BvbnNlJCA9IGZyb20od2luZG93LmZldGNoKHVybCwgc2VydmVyT3B0aW9ucykpXG4gICAgICAucGlwZSh0YXAodGFwTG9nKSwgZmxhdE1hcChyID0+IGZyb20ocltyZXNwb25zZVR5cGVdKCkpKSxcbiAgICAgICAgbWFwKG1hcFdyYXBwZXIobWFwRm4pKSxcbiAgICAgICAgcHVibGlzaCgpKVxuXG4gICAgcmVzcG9uc2UkLmNvbm5lY3QoKVxuXG4gICAgcmVzcG9uc2UkLnN1YnNjcmliZShzdWJzY3JpYmVyKVxuICB9XG5cbiAgc3RhdGljIHNldE1hcEZuKG9wdHMpIHtcbiAgICBjb25zdCBnZXRGbiA9IGNvbXBvc2UoZGVmYXVsdFRvKChwKSA9PiBwKSwgcHJvcCgnbWFwRm4nKSlcbiAgICByZXR1cm4gZ2V0Rm4ob3B0cylcbiAgfVxuXG4gIHN0YXRpYyBzZXRVcmwob3B0cykge1xuICAgIGNvbnN0IHVybCA9IHByb3AoJ3VybCcsIG9wdHMpXG4gICAgaWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NQWU5FIFdBUk5JTkc6IFVSTCBpcyB1bmRlZmluZWQgZm9yIGRhdGEgY2hhbm5lbCcpXG4gICAgfVxuICAgIHJldHVybiB1cmxcbiAgfVxuXG4gIHN0YXRpYyBzZXRSZXNwb25zZVR5cGUob3B0cykge1xuICAgIHJldHVybiBkZWZhdWx0VG8oJ2pzb24nLCBwcm9wKCdyZXNwb25zZVR5cGUnLCBvcHRzKSlcbiAgfVxuXG4gIGdldCBtYXBGbigpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwRm5cbiAgfVxuXG4gIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybFxuICB9XG5cbiAgZ2V0IHNlcnZlck9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlck9wdGlvbnNcbiAgfVxuXG4gIGdldCByZXNwb25zZVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlVHlwZVxuICB9XG5cbiAgc3RhdGljIHN0cmluZ2lmeUJvZHlJZkl0RXhpc3RzKG9iaikge1xuICAgIGNvbnN0IGNvbnZlcnRUb0pTT04gPSB3aGVuKHByb3BJcyhPYmplY3QsICdib2R5JyksIGNvbXBvc2Uob3ZlcihsZW5zUHJvcCgnYm9keScpLCBKU09OLnN0cmluZ2lmeSkpKVxuXG4gICAgcmV0dXJuIGNvbnZlcnRUb0pTT04ob2JqKVxuICB9XG5cbiAgc3RhdGljIHVwZGF0ZU1ldGhvZFdoZW5Cb2R5RXhpc3RzKG9wdHMpIHtcbiAgICBjb25zdCBoYXNCb2R5ID0gaGFzKCdib2R5JylcbiAgICBjb25zdCBtZXRob2RJc0dldCA9IHByb3BFcSgnR0VUJywgJ21ldGhvZCcpXG4gICAgY29uc3QgcHJlZCA9IGFsbFBhc3MoW2hhc0JvZHksIG1ldGhvZElzR2V0XSlcbiAgICByZXR1cm4gd2hlbihwcmVkLCBhc3NvYygnbWV0aG9kJywgJ1BPU1QnKSkob3B0cylcbiAgfVxuXG4gIHN0YXRpYyBzZXRTZXJ2ZXJPcHRpb25zKG9wdHMpIHtcbiAgICBjb25zdCBvcHRpb25zID0gcGljayhbXG4gICAgICAnbWV0aG9kJyxcbiAgICAgICdoZWFkZXJzJyxcbiAgICAgICdib2R5JyxcbiAgICAgICdtb2RlJyxcbiAgICAgICdjcmVkZW50aWFscycsXG4gICAgICAnY2FjaGUnLFxuICAgICAgJ3JlZGlyZWN0JyxcbiAgICAgICdyZWZlcnJlcicsXG4gICAgICAncmVmZXJyZXJQb2xpY3knLFxuICAgICAgJ2ludGVncml0eScsXG4gICAgICAna2VlcGFsaXZlJ1xuICAgIF0sIG9wdHMpXG4gICAgbGV0IG1lcmdlZE9wdGlvbnMgPSBtZXJnZURlZXBSaWdodChDaGFubmVsRmV0Y2hVdGlsLmJhc2VPcHRpb25zKCksIG9wdGlvbnMpXG4gICAgbWVyZ2VkT3B0aW9ucyA9IENoYW5uZWxGZXRjaFV0aWwudXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMobWVyZ2VkT3B0aW9ucylcbiAgICBtZXJnZWRPcHRpb25zID0gQ2hhbm5lbEZldGNoVXRpbC5zdHJpbmdpZnlCb2R5SWZJdEV4aXN0cyhtZXJnZWRPcHRpb25zKVxuICAgIHJldHVybiBtZXJnZWRPcHRpb25zXG4gIH1cblxuICBzdGF0aWMgYmFzZU9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsIC8vIERlZmF1bHQgbWV0aG9kXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKidcbiAgICAgIH0pLFxuICAgICAgbW9kZTogJ2NvcnMnLCAvLyBEZWZhdWx0IG1vZGVcbiAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLCAvLyBEZWZhdWx0IGNyZWRlbnRpYWxzIHBvbGljeVxuICAgICAgY2FjaGU6ICdkZWZhdWx0JywgLy8gRGVmYXVsdCBjYWNoZSBwb2xpY3lcbiAgICAgIHJlZGlyZWN0OiAnZm9sbG93JywgLy8gRGVmYXVsdCByZWRpcmVjdCBwb2xpY3lcbiAgICAgIHJlZmVycmVyOiAnY2xpZW50JywgLy8gRGVmYXVsdCByZWZlcnJlciBwb2xpY3lcbiAgICAgIHJlZmVycmVyUG9saWN5OiAnbm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGUnLCAvLyBEZWZhdWx0IHJlZmVycmVyIHBvbGljeVxuICAgICAgaW50ZWdyaXR5OiAnJywgLy8gRGVmYXVsdCBpbnRlZ3JpdHlcbiAgICAgIGtlZXBhbGl2ZTogZmFsc2UgLy8gRGVmYXVsdCBrZWVwYWxpdmVcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGlzLFxuICByZWplY3QsXG4gIGlzTmlsLFxuICBmaW5kLFxuICBhbGxQYXNzLFxuICBmb3JFYWNoT2JqSW5kZXhlZCxcbiAgbm90LFxuICBpc0VtcHR5LFxuICBhbHdheXMsXG4gIGNvbXBvc2UsXG4gIGVxdWFscyxcbiAgcHJvcCxcbiAgd2hlcmUsXG4gIGRlZmF1bHRUbyxcbiAgbWVyZ2VBbGwsXG4gIEYsXG4gIG9taXQsXG4gIGZsYXR0ZW4sXG4gIGFueSxcbiAgY3VycnksXG4gIGx0ZVxuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5jb25zdCBpc05vdEFyciA9IGNvbXBvc2Uobm90LCBpcyhBcnJheSkpXG5jb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShub3QsIGlzRW1wdHkpXG5jb25zdCBpc05vbkVtcHR5U3RyID0gYWxsUGFzcyhbaXMoU3RyaW5nKSwgaXNOb3RFbXB0eV0pXG5jb25zdCBpc05vbkVtcHR5QXJyID0gYWxsUGFzcyhbaXMoQXJyYXkpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzT2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5jb25zdCBpc05vbkVtcHR5T2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5cbmNvbnN0IGlzU3RyaW5nICA9ICh2YWwpID0+IGlzKFN0cmluZywgdmFsKVxuY29uc3QgaXNCb29sZWFuID0gKHZhbCkgPT4gaXMoQm9vbGVhbiwgdmFsKVxuY29uc3QgaXNOdW1iZXIgID0gKHZhbCkgPT4gaXMoTnVtYmVyLCB2YWwpXG5jb25zdCBpc0FycmF5Rm4gPSAodmFsKSA9PiBpcyhBcnJheSwgdmFsKVxuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFBheWxvYWRGaWx0ZXIge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsUGF5bG9hZEZpbHRlclxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgdXRpbGl0eSBmaWx0ZXJzIENoYW5uZWxQYXlsb2FkIG9iamVjdHMgYnkgdXNpbmcgcXVlcnkgc2VsZWN0b3JzIGFuZC9vciBieSBjb21wYXJpbmcgZGF0YSBwcm9wZXJ0aWVzPC9wPlxuICAgKiA8aDM+VGhlIENoYW5uZWxQYXlsb2FkRmlsdGVyIGZlYXR1cmVzPC9oMz5cbiAgICogPHVsPlxuICAgKiAgIDxsaT5DYW4gYmUgdXNlZCBieSBDaGFubmVscyBhbmQgVmlld1N0cmVhbXM8L2xpPlxuICAgKiAgIDxsaT5DaGFubmVsUGF5bG9hZEZpbHRlciBpbnN0YW5jZXMgY2FuIGJlIHVzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciB3aGVuIGJpbmRpbmcgYWN0aW9ucyB0byBWaWV3U3RyZWFtIG1ldGhvZHMuPC9saT5cbiAgICogICA8bGk+U2VsZWN0b3JzIGNhbiBiZSBhIHF1ZXJ5IHN0cmluZywgYW4gYXJyYXkgb2Ygc2VsZWN0b3Igc3RyaW5ncywgb3IgdGhlIHNlbGVjdG9yIGNhbiBiZSBhbiBhY3R1YWwgZG9tIGVsZW1lbnQuPC9saT5cbiAgICogICA8bGk+U2VsZWN0b3JzIGFyZSBub3QgcmVxdWlyZWQgYW5kIGNhbiBiZSBkaXNyZWdhcmRlZCBieSBhZGRpbmcgXCJcIiBvciB1bmRlZmluZWQgYXMgdGhlIHNlbGVjdG9yIHByb3BlcnR5LjwvbGk+XG4gICAqICAgPGxpPlRoZSBkYXRhIG9iamVjdCBjb21wYXJlcyB0aGUgdmFsdWVzIGZyb20gdGhlIHByb3BzKCkgbWV0aG9kIG9mIGEgQ2hhbm5lbFBheWxvYWQgb2JqZWN0PC9saT5cbiAgICogICA8bGk+SW50ZXJuYWxseSwgVGhlIGRhdGEgb2JqZWN0IGlzIGNvbmZvcm1lZCB0byBhIHNwZWMgb2JqZWN0IGZvciByYW1kYSZyc3F1bztzIEVYVFsnd2hlcmUnLCAnLy9yYW1kYWpzLmNvbS9kb2NzLyN3aGVyZSddIG1ldGhvZDwvbGk+XG4gICAqICAgPC91bD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEFycmF5fEhUTUxFbGVtZW50fSBzZWxlY3RvciBUaGUgbWF0Y2hpbmcgZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gZmlsdGVycyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0b3IsIHByb3BzLCBhbmQgZGVidWdMYWJlbCBwYXJhbXMuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wRmlsdGVycyBBIGpzb24gb2JqZWN0IGNvbnRhaW5pbmcgZmlsdGVyaW5nIG1ldGhvZHMgZm9yIGNoYW5uZWwgcHJvcHMgdmFyaWFibGVzLlxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xBcnJheXxIVE1MRWxlbWVudH0gc2VsZWN0b3IgLSA9ICcnOyBUaGUgbWF0Y2hpbmcgZWxlbWVudC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BGaWx0ZXJzIC0gPSB7fTsgQSBqc29uIG9iamVjdCBjb250YWluaW5nIGNvbXByYXRvcnMgZm9yIGFueSBleHBlY3RlZCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIEJvb2xlYW5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5GaWx0ZXJpbmcgdXNpbmcgU2VsZWN0b3JzIGFuZCBhIFByb3BlcnR5IENvbXBhcmF0b3IgV2l0aGluIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+J11cbiAgICogICAgY29uc3QgbXlTZWxlY3RvcnMgPSBbJ3VsJywgJ2xpOmZpcnN0LWNoaWxkJ107XG4gICAqICAgIGNvbnN0IHByb3BGaWx0ZXJzID0ge1xuICAgKiAgICAgIGxpbmtUeXBlOiBcImV4dGVybmFsXCJcbiAgICogICAgfTtcbiAgICogICAgY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIobXlTZWxlY3RvcnMsIHByb3BGaWx0ZXJzKTtcbiAgICpcbiAgICogICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCBteUZpbHRlcl1cbiAgICogICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICB9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+RmlsdGVyaW5nIFVzaW5nIE1ldGhvZCBhbmQgU3RyaW5nIENvbXBhcmF0b3JzIFdpdGhpbiBhIFZpZXdTdHJlYW0gSW5zdGFuY2U8L2g0PiddXG4gICAqICAgIGNvbnN0IHByb3BGaWx0ZXJzID0ge1xuICAgKiAgICAgIHR5cGU6IFwic2Nyb2xsaW5nLWVsZW1lbnRcIixcbiAgICogICAgICBzY3JvbGxOdW06ICAobik9Pm4+PTEyMDAgJiYgbjw9NTAwMDtcbiAgICogICAgfTtcbiAgICogICAgY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIoJycsIHByb3BGaWx0ZXJzKTtcbiAgICpcbiAgICogICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCBteUZpbHRlcl1cbiAgICogICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICB9XG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+QSBTaW1wbGUgUHJvcGVydHkgRmlsdGVyaW5nIEV4YW1wbGUgV2l0aGluIGEgQ2hhbm5lbCBJbnN0YW5jZTwvaDQ+J11cbiAgICogLy8gRmlsdGVyIGZvciBhIGJ1dHRvbiB3aXRoIGEgZGF0YSB0eXBlIG9mICdsaW5rJ1xuICAgKiBjb25zdCBteUZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcignJyB7dHlwZTogXCJsaW5rXCJ9KTtcbiAgICpcbiAgICogdGhpcy5nZXRDaGFubmVsKFwiQ0hBTk5FTF9VSVwiKVxuICAgKiAucGlwZShmaWx0ZXIobXlGaWx0ZXIpKVxuICAgKiAuc3Vic2NyaWJlKG15Q2hhbm5lbE1ldGhvZCk7XG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZWxlY3RvciwgZmlsdGVycyA9IHt9LCBkZWJ1Z0xhYmVsLCB0ZXN0TW9kZSkge1xuICAgIGNvbnN0IHNlbGVjdG9ySXNPYmogPSBpc09iamVjdEZuKHNlbGVjdG9yKVxuXG4gICAgaWYgKHNlbGVjdG9ySXNPYmopIHtcbiAgICAgIGZpbHRlcnMgPSBzZWxlY3RvclxuICAgICAgc2VsZWN0b3IgPSBwcm9wKCdzZWxlY3RvcicsIGZpbHRlcnMpXG4gICAgICB0ZXN0TW9kZSA9IHRlc3RNb2RlIHx8IHByb3AoJ3Rlc3RNb2RlJywgZmlsdGVycylcbiAgICB9XG5cbiAgICBjb25zdCBkZWJ1Z0xhYmVsQXJyID0gW2RlYnVnTGFiZWwsIHByb3AoJ2RlYnVnTGFiZWwnLCBmaWx0ZXJzKV1cblxuICAgIGRlYnVnTGFiZWwgPSBjb21wb3NlKGZpbmQoaXMoU3RyaW5nKSkpKGRlYnVnTGFiZWxBcnIpXG5cbiAgICBsZXQgcHJvcHMgPSBvbWl0KFsnZGVidWdMYWJlbCcsICdsYWJlbCcsICdzZWxlY3RvcicsICdwcm9wcycsICd0ZXN0TW9kZScsICdwcm9wRmlsdGVycyddLCBmaWx0ZXJzKVxuICAgIGlmIChmaWx0ZXJzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BzID0gbWVyZ2VBbGwoW2ZpbHRlcnMucHJvcHMsIHByb3BzXSlcbiAgICB9IGVsc2UgaWYgKGZpbHRlcnMucHJvcEZpbHRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMgPSBtZXJnZUFsbChbZmlsdGVycy5wcm9wRmlsdGVycywgcHJvcHNdKVxuICAgIH1cblxuICAgIGZpbHRlcnMucHJvcEZpbHRlcnMgPSBwcm9wc1xuXG4gICAgY29uc3QgeyBwcm9wRmlsdGVycyB9ID0gZmlsdGVyc1xuXG4gICAgY29uc3QgYWRkU3RyaW5nU2VsZWN0b3JGaWx0ZXIgPSAgaXNOb25FbXB0eVN0cihzZWxlY3RvcikgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJTZWxlY3Rvcihbc2VsZWN0b3JdLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGFkZEFycmF5U2VsZWN0b3JGaWx0ZXIgPSAgIGlzTm9uRW1wdHlBcnIoc2VsZWN0b3IpID8gQ2hhbm5lbFBheWxvYWRGaWx0ZXIuZmlsdGVyU2VsZWN0b3Ioc2VsZWN0b3IsIGRlYnVnTGFiZWwpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkRGF0YUZpbHRlciA9IGlzTm9uRW1wdHlPYmplY3RGbihwcm9wRmlsdGVycykgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJEYXRhKHByb3BGaWx0ZXJzLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuXG4gICAgbGV0IGZpbHRlcnNBcnIgPSByZWplY3QoaXNOaWwsIFthZGRTdHJpbmdTZWxlY3RvckZpbHRlciwgYWRkQXJyYXlTZWxlY3RvckZpbHRlciwgYWRkRGF0YUZpbHRlcl0pXG5cbiAgICAvLyBJRiBBUlJBWSBJUyBFTVBUWSBBTFdBWVMgUkVUVVJOIEZBTFNFO1xuXG4gICAgY29uc3QgZmlsdGVyc0FyZUVtcHR5ID0gaXNFbXB0eShmaWx0ZXJzQXJyKVxuXG4gICAgaWYgKGZpbHRlcnNBcmVFbXB0eSkge1xuICAgICAgZmlsdGVyc0FyciA9IFthbHdheXMoZmFsc2UpXVxuICAgICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZSAmJiB0ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBDaGFubmVsIEZpbHRlciwgd2l0aCBzZWxlY3RvcjogJHtzZWxlY3Rvcn0sIGFuZCBwcm9wRmlsdGVyczoke3Byb3BGaWx0ZXJzfSBhcHBlYXJzIHRvIGJlIGVtcHR5IWApXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ZXN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IsIHByb3BGaWx0ZXJzLCBkZWJ1Z0xhYmVsLCBmaWx0ZXJzLCB0ZXN0TW9kZSwgZmlsdGVyc0FyZUVtcHR5IH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUGFzcyhmaWx0ZXJzQXJyKVxuICB9XG5cbiAgc3RhdGljIGZpbHRlckRhdGEoZmlsdGVySnNvbiwgZmlsdGVyZGVidWdMYWJlbCkge1xuICAgIGNvbnN0IGRlYnVnTGFiZWwgPSBmaWx0ZXJkZWJ1Z0xhYmVsXG5cbiAgICBjb25zdCBjb21wYXJlRGF0YSA9ICgpID0+IHtcbiAgICAgIC8vIERPIE5PVCBBTExPVyBBTiBFTVBUWSBPQkpFQ1QgVE8gUkVUVVJOIFRSVUVzXG4gICAgICBpZiAoaXNFbXB0eShmaWx0ZXJKc29uKSkge1xuICAgICAgICByZXR1cm4gYWx3YXlzKGZhbHNlKVxuICAgICAgfVxuXG4gICAgICAvLyAgQ0hFQ0tTIEFMTCBWQUxVRVMgSU4gSlNPTiBUTyBERVRFUk1JTkUgSUYgVEhFUkUgQVJFIEZJTFRFUklORyBNRVRIT0RTXG5cbiAgICAgIGNvbnN0IGNyZWF0ZUN1cnJ5Q29tcGFyYXRvciA9IGNvbXBhcmVTdHIgPT4gKHN0cikgPT4ge1xuICAgICAgICByZXR1cm4gc3RyID09PSBjb21wYXJlU3RyXG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja1RvQ29udmVydFRvRm4gPSAodmFsLCBrZXksIG9iaikgPT4ge1xuICAgICAgICBsZXQgZm5WYWwgPSBGXG4gICAgICAgIGlmIChpc1N0cmluZyh2YWwpIHx8IGlzQm9vbGVhbih2YWwpIHx8IGlzTnVtYmVyKHZhbCkpIHtcbiAgICAgICAgICBmblZhbCA9IGNyZWF0ZUN1cnJ5Q29tcGFyYXRvcih2YWwpXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiB2YWxcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5Rm4odmFsKSB8fCBpc09iamVjdEZuKHZhbCkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBDaGFubmVsUGF5bG9hZEZpbHRlcjogUHJvcGVydHkgXCIke3ZhbH1cIiBpcyBhbiBhcnJheS9vYmplY3QsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiBgICtcbiAgICAgICAgICAgICAgJ1RoaXMgcHJvcGVydHkgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLidcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIGZuVmFsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuVmFsXG4gICAgICB9XG4gICAgICBmaWx0ZXJKc29uID0gck1hcChjaGVja1RvQ29udmVydFRvRm4sIGZpbHRlckpzb24pXG5cbiAgICAgIC8vIFRBUCBMT0dHRVJcbiAgICAgIGNvbnN0IHRhcExvZ2dlciA9IChjb21wYXJlZE9iaikgPT4ge1xuICAgICAgICBpZiAoZGVidWdMYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmVkT2JqXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvcHNCb29sZWFucyA9IHt9XG4gICAgICAgIGNvbnN0IG1hcEJvb2xzID0gKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBwcm9wc0Jvb2xlYW5zW2tleV0gPSB2YWx1ZShwcm9wKGtleSwgY29tcGFyZWRPYmopKVxuICAgICAgICB9XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKG1hcEJvb2xzLCBmaWx0ZXJKc29uKVxuICAgICAgICBjb25zb2xlLmxvZyhgJWMgQ0hBTk5FTCBQQVlMT0FEIEZJTFRFUiBERUJVR0dFUiBbXCIke2RlYnVnTGFiZWx9XCJdIC0gdmFsdWVzOiAgICBgLCAnY29sb3I6b3JhbmdlOycsIHsgcHJvcHNCb29sZWFucywgY29tcGFyZWRPYmogfSlcblxuICAgICAgICByZXR1cm4gY29tcGFyZWRPYmpcbiAgICAgIH1cblxuICAgICAgLy8gRU5EIFRBUCBMT0dHRVJcbiAgICAgIGNvbnN0IGZNZXRob2QgPSB3aGVyZShmaWx0ZXJKc29uKVxuXG4gICAgICBjb25zdCBnZXRGaWx0ZXJpbmdPYmogPSAgKHYpID0+IHtcbiAgICAgICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gdiB8fCB7fVxuICAgICAgICBjb25zdCBvID0gT2JqZWN0LmFzc2lnbih7fSwgdiwgc3JjRWxlbWVudCwgZXZlbnQsIHBheWxvYWQpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdvIGlzICcsbyk7XG4gICAgICAgIHJldHVybiBvXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wb3NlKGZNZXRob2QsIHRhcExvZ2dlciwgZGVmYXVsdFRvKHt9KSwgZ2V0RmlsdGVyaW5nT2JqKVxuICAgIH1cblxuICAgIHJldHVybiBjb21wYXJlRGF0YSgpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tQYXlsb2FkU2VsZWN0b3IoYXJyLCBkZWJ1Z0xhYmVsLCBzcmNQYXlsb2FkKSB7XG4gICAgLy8gRUxFTUVOVCBGUk9NIFBBWUxPQURzXG4gICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gc3JjUGF5bG9hZCB8fCB7fVxuXG4gICAgY29uc3QgcmVkdWNlRmluZEVsID0gKGFjYywgc3JjKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IHByb3AoJ2VsJywgc3JjKVxuICAgICAgaWYgKENoYW5uZWxQYXlsb2FkRmlsdGVyLmVsSXNEb21FbGVtZW50KGVsKSAmJiBhY2MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2MgPSBlbFxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIGNvbnN0IGVsID0gW3NyY0VsZW1lbnQsIHBheWxvYWQsIHByb3AoJ3NyY0VsZW1lbnQnLCBldmVudCksIHNyY1BheWxvYWRdLnJlZHVjZShyZWR1Y2VGaW5kRWwsIHVuZGVmaW5lZClcblxuICAgIC8vIFJFVFVSTiBCT09MRUFOIE1BVENIIFdJVEggUEFZTE9BRCBFTFxuICAgIGNvbnN0IGNvbXBhcmVFbHMgPSAoZWxDb21wYXJlKSA9PiBlbENvbXBhcmUuaXNFcXVhbE5vZGUoKGVsKSlcblxuICAgIC8vIExPT1AgVEhST1VHSCBOT0RFUyBJTiBxdWVyeVNlbGVjdG9yQWxsKClcbiAgICBjb25zdCBtYXBOb2RlQXJyV2l0aEVsID0gKHNlbCkgPT4ge1xuICAgICAgLy8gY29udmVydCBub2RlbGlzdCB0byBhcnJheSBvZiBlbHNcbiAgICAgIGNvbnN0IG5vZGVBcnIgPSBmbGF0dGVuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsKSlcbiAgICAgIC8vIGVscyBhcnJheSB0byBib29sZWFuIGFycmF5XG4gICAgICByZXR1cm4gck1hcChjb21wYXJlRWxzLCBub2RlQXJyKVxuICAgIH1cblxuICAgIGlmIChkZWJ1Z0xhYmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG5vZGVBcnJSZXN1bHRzRGVidWdnZXIgPSBjb21wb3NlKGZsYXR0ZW4sIHJNYXAobWFwTm9kZUFycldpdGhFbCkpKGFycilcbiAgICAgIGNvbnN0IHNlbGVjdG9yc0FyciA9IGFyclxuICAgICAgY29uc29sZS5sb2coYCVjIENIQU5ORUwgUEFZTE9BRCBGSUxURVIgREVCVUdHRVIgW1wiJHtkZWJ1Z0xhYmVsfVwiXSAtIHNlbGVjdG9yczogYCwgJ2NvbG9yOm9yYW5nZTsnLCB7IGVsLCBzZWxlY3RvcnNBcnIsIG5vZGVBcnJSZXN1bHRzRGVidWdnZXIgfSlcbiAgICB9XG5cbiAgICAvLyBDSEVDSyBJRiBQQVlMT0FEIEVMIEVYSVNUU1xuICAgIGlmICh0eXBlb2YgKGVsKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIExPT1AgVEhST1VHSCBBTEwgU0VMRUNUT1JTIElOIE1BSU4gQVJSQVlcbiAgICBjb25zdCBub2RlQXJyUmVzdWx0ID0gY29tcG9zZShmbGF0dGVuLCByTWFwKG1hcE5vZGVBcnJXaXRoRWwpKShhcnIpXG4gICAgaWYgKGlzRW1wdHkobm9kZUFyclJlc3VsdCkgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiBhbnkoZXF1YWxzKHRydWUpLCBub2RlQXJyUmVzdWx0KVxuICB9XG5cbiAgc3RhdGljIGVsSXNEb21FbGVtZW50KG8pIHtcbiAgICBpZiAoaXMoU3RyaW5nLCBvKSkge1xuICAgICAgbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobylcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpKG8pXG4gIH1cblxuICBzdGF0aWMgZmlsdGVyU2VsZWN0b3Ioc2VsZWN0b3JBcnIsIGRlYnVnTGFiZWwpIHtcbiAgICBjb25zdCBhcnIgPSByZWplY3QoaXNFbXB0eSwgc2VsZWN0b3JBcnIpXG4gICAgY29uc3QgcGF5bG9hZENoZWNrID0gY3VycnkoQ2hhbm5lbFBheWxvYWRGaWx0ZXIuY2hlY2tQYXlsb2FkU2VsZWN0b3IpXG4gICAgcmV0dXJuIHBheWxvYWRDaGVjayhhcnIsIGRlYnVnTGFiZWwpXG4gIH1cbn1cbiIsImZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbCkge1xuICBjb25zdCBub25OdWxsT2JqZWN0ID0gdmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnXG4gIHJldHVybiBub25OdWxsT2JqZWN0ICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpICE9PSAnW29iamVjdCBSZWdFeHBdJyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSAhPT0gJ1tvYmplY3QgRGF0ZV0nXG59XG5cbmZ1bmN0aW9uIGVtcHR5VGFyZ2V0KHZhbCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gW10gOiB7fVxufVxuXG5mdW5jdGlvbiBjbG9uZUlmTmVjZXNzYXJ5KHZhbHVlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgY2xvbmUgPSBvcHRpb25zQXJndW1lbnQgJiYgb3B0aW9uc0FyZ3VtZW50LmNsb25lID09PSB0cnVlXG4gIHJldHVybiAoY2xvbmUgJiYgaXNNZXJnZWFibGVPYmplY3QodmFsdWUpKVxuICAgID8gZGVlcE1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSxcbiAgICAgIHZhbHVlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgOiB2YWx1ZVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gdGFyZ2V0LnNsaWNlKClcbiAgc291cmNlLmZvckVhY2goZnVuY3Rpb24oZSwgaSkge1xuICAgIGlmICh0eXBlb2YgZGVzdGluYXRpb25baV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBkZXN0aW5hdGlvbltpXSA9IGNsb25lSWZOZWNlc3NhcnkoZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QoZSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gZGVlcE1lcmdlKHRhcmdldFtpXSwgZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSBpZiAodGFyZ2V0LmluZGV4T2YoZSkgPT09IC0xKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGNsb25lSWZOZWNlc3NhcnkoZSwgb3B0aW9uc0FyZ3VtZW50KSlcbiAgICB9XG4gIH0pXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBtZXJnZU9iamVjdCh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0ge31cbiAgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldCkpIHtcbiAgICBPYmplY3Qua2V5cyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gY2xvbmVJZk5lY2Vzc2FyeSh0YXJnZXRba2V5XSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0pXG4gIH1cbiAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICghaXNNZXJnZWFibGVPYmplY3Qoc291cmNlW2tleV0pIHx8ICF0YXJnZXRba2V5XSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGNsb25lSWZOZWNlc3Nhcnkoc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGRlZXBNZXJnZSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9XG4gIH0pXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudCkge1xuICBjb25zdCBhcnJheSA9IEFycmF5LmlzQXJyYXkoc291cmNlKVxuICBjb25zdCBvcHRpb25zID0gb3B0aW9uc0FyZ3VtZW50IHx8IHsgYXJyYXlNZXJnZTogZGVmYXVsdEFycmF5TWVyZ2UgfVxuICBjb25zdCBhcnJheU1lcmdlID0gb3B0aW9ucy5hcnJheU1lcmdlIHx8IGRlZmF1bHRBcnJheU1lcmdlXG5cbiAgaWYgKGFycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0KVxuICAgICAgPyBhcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgICA6IGNsb25lSWZOZWNlc3Nhcnkoc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gIH1cbn1cblxuZGVlcE1lcmdlLmFsbCA9IGZ1bmN0aW9uIGRlZXBtZXJnZUFsbChhcnJheSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkgfHwgYXJyYXkubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCB0d28gZWxlbWVudHMnKVxuICB9XG5cbiAgLy8gd2UgYXJlIHN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IDIgdmFsdWVzLCBzbyBpdCBpcyBzYWZlIHRvIGhhdmUgbm8gaW5pdGlhbCB2YWx1ZVxuICByZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gZGVlcE1lcmdlKHByZXYsIG5leHQsIG9wdGlvbnNBcmd1bWVudClcbiAgfSlcbn1cblxuZXhwb3J0IHsgZGVlcE1lcmdlIH1cbiIsImltcG9ydCB7IGRlZmF1bHRUbywgbWF0Y2gsIGZvckVhY2gsIHRlc3QsIGluY2x1ZGVzLCB3aXRob3V0LCBjb21wbGVtZW50LCBpc0VtcHR5LCB2YWx1ZXMsIGlzTmlsLCBmaWx0ZXIsIF9fLCBrZXlzLCBjb21wb3NlLCBoZWFkLCBtYXAsIGNvbmQsIFQsIGFsbFBhc3MsIGNvbmNhdCwgdW5pcSB9IGZyb20gJ3JhbWRhJ1xuY29uc3QgaXNJT1MgPSAoKSA9PiB7XG4gIGNvbnN0IHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKClcbiAgLy8gbGV0IHNhZmFyaSA9IC9zYWZhcmkvLnRlc3QodXNlckFnZW50KTtcbiAgY29uc3QgaW9zID0gL2lwaG9uZXxpcG9kfGlwYWQvLnRlc3QodXNlckFnZW50KVxuICByZXR1cm4gaW9zID09PSB0cnVlXG59XG5cbmNvbnN0IGRlbGF5Q2FsbCA9IGFzeW5jKGZuLCB0aW1lKSA9PiB7XG4gIGZ1bmN0aW9uIHNsZWVwKG1zKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG4gIH1cblxuICBjb25zdCB0aW1lb3V0SGFuZGxlciA9IGFzeW5jKCkgPT4ge1xuICAgIGF3YWl0IHNsZWVwKDEpXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbilcbiAgfVxuXG4gIHdpbmRvdy5zZXRUaW1lb3V0KHRpbWVvdXRIYW5kbGVyLCB0aW1lKVxufVxuXG5jb25zdCBnZXRDb25zdHJ1Y3Rvck5hbWUgPSAob2JqKSA9PiB7XG4gIGlmIChvYmouY29uc3RydWN0b3IubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG9iai5jb25zdHJ1Y3Rvci5uYW1lXG4gIH1cbiAgY29uc3QgcmUgPSAvXihmdW5jdGlvblxccykoXFx3KykoXFwoLiopJC9cbiAgY29uc3Qgc3RyID0gb2JqLnRvU3RyaW5nKClcbiAgcmV0dXJuIGRlZmF1bHRUbyhTdHJpbmcoc3RyKS5zdWJzdHIoMCwgMTIpLCBtYXRjaChyZSwgc3RyKVsyXSlcbn1cblxuY29uc3QgYXJyRnJvbU1hcEtleXMgPSAobWFwKSA9PiB7XG4gIGNvbnN0IGFyciA9IFtdXG4gIGNvbnN0IGFkZEtleXNUb0FyciA9ICh2LCBrLCBpKSA9PiBhcnIucHVzaChrKVxuICBmb3JFYWNoKGFkZEtleXNUb0FyciwgbWFwKVxuICByZXR1cm4gYXJyXG59XG5cbmNvbnN0IGZpbmRTdHJGcm9tUmVnZXhBcnIgPSAob2JqLCBzdHIpID0+IHtcbiAgaWYgKG9ialtzdHJdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cbiAgY29uc3QgY2hlY2tJZk1hdGNoID0gcyA9PiB0ZXN0KG5ldyBSZWdFeHAocyksIHN0cilcbiAgY29uc3QgY2hlY2tTdHJNYXRjaCA9IGluY2x1ZGVzKHN0cilcbiAgY29uc3QgY2hlY2tJZlJlZ0V4TWF0Y2ggPSBjb21wb3NlKGluY2x1ZGVzKHRydWUpLCBtYXAoY2hlY2tJZk1hdGNoKSlcbiAgY29uc3QgcnVuTWF0Y2hDaGVja3MgPSBjb25kKFtcbiAgICBbY2hlY2tTdHJNYXRjaCwgKCkgPT4gc3RyXSxcbiAgICBbY2hlY2tJZlJlZ0V4TWF0Y2gsICgpID0+IHN0cl0sXG4gICAgW1QsICgpID0+IHVuZGVmaW5lZF1cbiAgXSlcbiAgcmV0dXJuIHJ1bk1hdGNoQ2hlY2tzKG9iailcbn1cblxuY29uc3QgZmluZFN0ck9yUmVnZXhNYXRjaFN0ciA9IChvYmosIHN0cikgPT4ge1xuICBpZiAob2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdHJcbiAgfVxuICBjb25zdCBjcmVhdGVSZSA9IHMgPT4gbmV3IFJlZ0V4cChzKVxuICBjb25zdCBjaGVja2VySWZSZWdleE1hdGNoRXhpc3RzID0gY29tcG9zZShoZWFkLCBmaWx0ZXIoY29tcG9zZSh0ZXN0KF9fLCBzdHIpLCBjcmVhdGVSZSkpKVxuICByZXR1cm4gY2hlY2tlcklmUmVnZXhNYXRjaEV4aXN0cyhrZXlzKG9iaikpXG59XG5cbmNvbnN0IGNsb3Nlc3QgPSAoYXJyYXksIG51bSkgPT4ge1xuICBsZXQgaSA9IDBcbiAgbGV0IG1pbkRpZmYgPSAxMDAwXG4gIGxldCBhbnNcbiAgZm9yIChpIGluIGFycmF5KSB7XG4gICAgY29uc3QgbSA9IE1hdGguYWJzKG51bSAtIGFycmF5W2ldKVxuICAgIGlmIChtIDwgbWluRGlmZikge1xuICAgICAgbWluRGlmZiA9IG1cbiAgICAgIGFucyA9IGFycmF5W2ldXG4gICAgfVxuICB9XG4gIHJldHVybiBhbnNcbn1cblxuY29uc3QgY29udmVydERvbVN0cmluZ01hcFRvT2JqID0gKGRvbU1hcCkgPT4ge1xuICBjb25zdCBvYmogPSB7fVxuICBmb3IgKGNvbnN0IGQgaW4gZG9tTWFwKSB7XG4gICAgb2JqW2RdID0gZG9tTWFwW2RdXG4gIH1cbiAgcmV0dXJuIG9ialxufVxuXG4vLyBjb25zdCBwYXNzUGFnZURhdGEgPSBwaWNrKFsncGFyYW1zJywgJ3JvdXRlSWQnLCAnZGF0YSddLCBfXyk7XG5cbmNvbnN0IHN1YnNjcmliZUZuID0ge1xuICBuZXh0OiAgICAgeCA9PiBjb25zb2xlLmxvZyhgbmV4dCAgICAgICR7eH1gKSxcbiAgZXJyb3I6ICAgIHggPT4gY29uc29sZS5sb2coYGVycm9yICAgICAke3h9YCksXG4gIGNvbXBsZXRlOiB4ID0+IGNvbnNvbGUubG9nKGBjb21wbGV0ZSAgJHt4fWApXG59XG5cbmNvbnN0IHJpZ2h0ID0geCA9PiAoe1xuICBtYXA6IGYgPT4gcmlnaHQoZih4KSksXG4gIGZvbGQ6IChmLCBnKSA9PiBnKHgpLFxuICBpbnNwZWN0OiAoKSA9PiBgcmlnaHQoJHt4fSlgXG5cbn0pXG5cbmNvbnN0IGlmTmlsVGhlblVwZGF0ZSA9ICh2YWwsIG5ld1ZhbCkgPT4ge1xuICBjb25zdCBpc05pbEJvb2wgPSBpc05pbCh2YWwpXG4gIHJldHVybiBpc05pbEJvb2wgPyBuZXdWYWwgOiB2YWxcbn1cblxuY29uc3QgbGVmdCA9IHggPT4gKHtcbiAgbWFwOiBmID0+IGxlZnQoeCksXG4gIGZvbGQ6IChmLCBnKSA9PiBmKHgpLFxuICBpbnNwZWN0OiAoKSA9PiBgbGVmdCgke3h9KWBcbn0pXG5cbmNvbnN0IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgPSAob2JqKSA9PiB7XG4gIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNFbXB0eSksIGhlYWQsIHZhbHVlcylcbiAgY29uc3QgaXNOb3ROaWwgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNOaWwpLCBoZWFkLCB2YWx1ZXMpXG4gIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90TmlsXSlcbiAgcmV0dXJuIGlzTm90TmlsQW5kSXNOb3RFbXB0eShvYmopXG59XG5cbmNvbnN0IGZyb21OdWxsYWJsZSA9IHggPT4geCAhPT0gbnVsbCA/IHJpZ2h0KHgpIDogbGVmdChudWxsKVxuXG5jb25zdCBmaW5kSW5PYmogPSAob2JqLCB2YWwsIGVycm9yID0gbnVsbCkgPT4ge1xuICBjb25zdCBmb3VuZCA9IG9ialt2YWxdXG4gIHJldHVybiBmb3VuZCA/IHJpZ2h0KGZvdW5kKSA6IGxlZnQoZXJyb3IpXG59XG5jb25zdCBwdWxsUm91dGVJbmZvID0gKCkgPT4ge1xuICBjb25zdCBzdHIgPSBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2gpXG4gIGNvbnN0IHJvdXRlSWQgPSBwdWxsTWFpblJvdXRlKHN0cilcbiAgY29uc3QgcGFyYW1zID0gcHVsbFBhcmFtcyhzdHIpXG4gIHJldHVybiB7IHJvdXRlSWQsIHBhcmFtcyB9XG59XG5cbmZ1bmN0aW9uIGdldEFsbE1ldGhvZE5hbWVzKGluc3RhbmNlLCBvbWl0dGVkTWV0aG9kcyA9IFtdKSB7XG4gIC8vIE9wdGlvbmFsbHkgcmVuYW1lIGBpbnN0YW5jZWAgdG8gc29tZXRoaW5nIG1vcmUgZGVzY3JpcHRpdmU6XG4gIGNvbnN0IGJhc2VDbGFzc01ldGhvZHNBcnIgPSBbJ2xlbmd0aCcsICduYW1lJywgJ3Byb3RvdHlwZScsICdjb25zdHJ1Y3RvciddXG4gIGNvbnN0IGNvbWJpbmVkT21pdHRlZE1ldGhvZHMgPSBjb25jYXQoYmFzZUNsYXNzTWV0aG9kc0Fyciwgb21pdHRlZE1ldGhvZHMpXG5cbiAgLy8gRmlsdGVyIG91dCBvbWl0dGVkXG4gIGNvbnN0IG9taXRQcm9wc0Zyb21BcnIgPSBjb21wb3NlKHdpdGhvdXQoY29tYmluZWRPbWl0dGVkTWV0aG9kcyksIHVuaXEpXG5cbiAgLy8gUHVsbCBvdXQgaW5zdGFuY2UgbWV0aG9kc1xuICBjb25zdCBtZXRob2RzID0gb21pdFByb3BzRnJvbUFycihcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpXG4gIClcblxuICAvLyBQdWxsIG91dCBzdGF0aWMgbWV0aG9kc1xuICBjb25zdCBzdGF0aWNNZXRob2RzID0gb21pdFByb3BzRnJvbUFycihcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZS5jb25zdHJ1Y3RvcilcbiAgKVxuXG4gIGNvbnN0IGFsbE1ldGhvZHMgPSBjb25jYXQobWV0aG9kcywgc3RhdGljTWV0aG9kcylcblxuICByZXR1cm4geyBtZXRob2RzLCBzdGF0aWNNZXRob2RzLCBhbGxNZXRob2RzIH1cbn1cblxuLyogY29uc3QgZ2V0QWxsTWV0aG9kTmFtZXMzID0gKF90aGlzID0gdGhpcywgb21pdHRlZE1ldGhvZHMgPSBbXSkgPT4ge1xuICBjb25zdCBnZXRQcm9wTmFtZXNBcnIgPSAob2JqID0gdGhpcywgb21pdHRlZE1ldGhvZHMgPSBbXSkgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopXG4gIH1cbiAgLy8gRmlsdGVyIE1ldGhvZHNcbiAgY29uc3QgYmFzZUNsYXNzTWV0aG9kc0FyciA9IFsnbGVuZ3RoJywgJ25hbWUnLCAncHJvdG90eXBlJywgJ2NvbnN0cnVjdG9yJ11cbiAgb21pdHRlZE1ldGhvZHMgPSBjb25jYXQoYmFzZUNsYXNzTWV0aG9kc0Fyciwgb21pdHRlZE1ldGhvZHMpXG4gIGNvbnN0IG9taXRQcm9wc0Zyb21BcnIgPSBjb21wb3NlKHdpdGhvdXQob21pdHRlZE1ldGhvZHMpLCB1bmlxKVxuXG4gIC8vIFBVTEwgT1VUIE1FVEhPRCBOQU1FU1xuICBjb25zdCBtZXRob2RzID0gb21pdFByb3BzRnJvbUFycihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhfdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpKVxuICBjb25zdCBzdGF0aWNNZXRob2RzID0gb21pdFByb3BzRnJvbUFycihnZXRQcm9wTmFtZXNBcnIoX3RoaXMuY29uc3RydWN0b3IpKVxuICBjb25zdCBhbGxNZXRob2RzID0gY29uY2F0KG1ldGhvZHMsIHN0YXRpY01ldGhvZHMpXG5cbiAgcmV0dXJuIHsgbWV0aG9kcywgc3RhdGljTWV0aG9kcywgYWxsTWV0aG9kcyB9XG4gIC8vIHJldHVybiAnZm4nO1xufSAqL1xuXG4vLyBST1VURSBSRUdFWCBFWFBSRVNTSU9OU1xuY29uc3QgcmVtb3ZlU2xhc2hlcyA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihcXC8pKC4qKS9nLCAnJDInKVxuY29uc3Qgcm91dGVSRSA9IC9eKFxcLz8pKFxcdyopKFxcLz8pKC4qKS9nXG5jb25zdCBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGggPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXigjXFwvPykoLiopLywgJyQyJylcbmNvbnN0IHB1bGxTbGFzaEZyb21QYXRoID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oXFwvPykoLiopLywgJyQyJylcbmNvbnN0IHB1bGxNYWluUm91dGUgPSAoc3RyKSA9PiBzdHIucmVwbGFjZShyb3V0ZVJFLCAnJDInKVxuY29uc3QgcHVsbFBhcmFtcyA9ICAgIChzdHIpID0+IHN0ci5yZXBsYWNlKHJvdXRlUkUsICckNCcpXG5jb25zdCBwdWxsVHJhbnNsYXRlWCA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKikoLC4qKS8sICckNicpXG5jb25zdCBwdWxsVHJhbnNsYXRlWSA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKSguKikvLCAnJDcnKVxuY29uc3QgcHVsbFRyYW5zbGF0ZVlGcm9tSGVhZGVyID0gc3RyID0+IHN0ci5yZXBsYWNlKC9eKHRyYW5zZm9ybTogbWF0cml4KSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCopKFxcKS4qOykvLCAnJDYnKVxuZXhwb3J0IHsgZ2V0Q29uc3RydWN0b3JOYW1lLCBhcnJGcm9tTWFwS2V5cywgZ2V0QWxsTWV0aG9kTmFtZXMsIGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIsIGZpbmRTdHJGcm9tUmVnZXhBcnIsIGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwsIGlzSU9TLCBwdWxsUm91dGVJbmZvLCBwdWxsVHJhbnNsYXRlWUZyb21IZWFkZXIsIHB1bGxTbGFzaEZyb21QYXRoLCBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgsIGNsb3Nlc3QsIHB1bGxUcmFuc2xhdGVZLCBwdWxsVHJhbnNsYXRlWCwgcHVsbE1haW5Sb3V0ZSwgcHVsbFBhcmFtcywgcmlnaHQsIGxlZnQsIGZyb21OdWxsYWJsZSwgZmluZEluT2JqLCBpZk5pbFRoZW5VcGRhdGUsIHJlbW92ZVNsYXNoZXMsIHN1YnNjcmliZUZuLCBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmosIGRlbGF5Q2FsbCB9XG4iLCJpbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSAncmFtZGEnXG5leHBvcnQgZnVuY3Rpb24gZ2MoKSB7XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc3QgbG9vcE0gPSBtID0+IHVuZGVmaW5lZFxuICAgIGZvckVhY2gobG9vcE0sIHRoaXMpXG4gIH1cbiAgc2V0VGltZW91dChjbGVhbnVwLCAxKVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJhc2VDb3JlTWl4aW5zKCkge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZXByb3BzTWFwOiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKVxuICAgICAgY29uc3Qgb2JqS2V5ID0geyB2c2lkOiB0aGlzLnByb3BzLnZzaWQgfVxuICAgICAgd20uc2V0KG9iaktleSwgdGhpcy5wcm9wcylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogb2JqS2V5LFxuICAgICAgICB3ZWFrTWFwOiB3bVxuICAgICAgfVxuICAgIH0sXG4gICAgZ2M6IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yIChjb25zdCBtIGluIHRoaXMpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbbV1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzXG4gICAgfSxcbiAgICBjcmVhdGVJZDogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBsZXQgbnVtID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgxMDAwMDAwMCkgKiAxMDAwMDAwMCk7XG4gICAgICAvLyBjb25zdCBudW0gPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCk7O1xuICAgICAgY29uc3QgbnVtID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvXFxkL2dtLCAnJykuc3Vic3RyaW5nKDEsIDgpXG4gICAgICByZXR1cm4gbnVtKClcbiAgICAgIC8vIHJldHVybiBgdnNpZC0ke251bSgpfWA7XG4gICAgfSxcbiAgICBzZXRUcmFjZUZ1bmM6IGZ1bmN0aW9uKGRlYnVnKSB7XG4gICAgICByZXR1cm4gZGVidWcgPT09IHRydWVcbiAgICAgICAgPyBjb25zb2xlLmxvZ1xuICAgICAgICA6ICgpID0+IHtcbiAgICAgICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWaWV3U3RyZWFtUGF5bG9hZCB9IGZyb20gJy4uLy4uL3ZpZXdzL3ZpZXctc3RyZWFtLXBheWxvYWQuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlU3RyZWFtc01peGlucygpIHtcbiAgcmV0dXJuIHtcbiAgICB0ZXN0RnVuYzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICBjb25zb2xlLmxvZygnc3RyZWFtIG1peGluIGlzICcsIHN0cilcbiAgICB9LFxuICAgIHNlbmRSb3V0ZVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgLyoqIFRPRE86IEFERCBBIENIRUNLIEZPUiBFTkQgUk9VVEUgQU5EIFRSQU5TRk9STSBUTyBFTVBUWSAqL1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnQ0hBTk5FTF9ST1VURScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpXG4gICAgfSxcbiAgICBzZW5kVUlQYXlsb2FkOiBmdW5jdGlvbihvYnMsIGRhdGEpIHtcbiAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoJ0NIQU5ORUxfVUknLCBvYnMsIGRhdGEsICdzdWJzY3JpYmUnKVxuICAgIH1cbiAgICAvKlxuICAgIHNlbmRJbmZvVG9DaGFubmVsOiBmdW5jdGlvbihjaGFubmVsTmFtZSwgcGF5bG9hZCkge1xuICAgICAgY29uc3QgZ2V0UHJvcCA9IHN0ciA9PiBwcm9wKHN0ciwgdGhpcy5wcm9wcyk7XG4gICAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbE5hbWU7XG4gICAgICBsZXQgc3JjRWxlbWVudCA9IHtcbiAgICAgICAgdnNpZDogZ2V0UHJvcCgndnNpZCcpLFxuICAgICAgICBlbDogZ2V0UHJvcCgnZWwnKSxcbiAgICAgICAgdmlld05hbWU6IGdldFByb3AoJ25hbWUnKVxuICAgICAgfTtcbiAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICBwYXlsb2FkLCBjaGFubmVsLCBzcmNFbGVtZW50XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZChjaGFubmVsTmFtZSwgbmV3IG9mKCcnKSwgZGF0YSxcbiAgICAgICAgJ3N1YnNjcmliZScpO1xuICAgIH0sXG4gICAgKi9cbiAgICAvKiAgICBzZW5kTGlmZVN0cmVhbVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnTElGRVNUUkVBTScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpO1xuICAgIH0sXG5cbiAgICBjcmVhdGVMaWZlU3RyZWFtUGF5bG9hZDogZnVuY3Rpb24oU1RFUCwgZGF0YSA9IHt9LCB0eXBlID0gJ3BhcmVudCcpIHtcbiAgICAgIGxldCB2aWV3SWQgPSBgJHt0aGlzLnByb3BzLm5hbWV9OiAke3RoaXMucHJvcHMudnNpZH1gO1xuICAgICAgcmV0dXJuIG5ldyBMaWZlc3RyZWFtUGF5bG9hZCgnTElGRVNUUkVBTScsIFNURVAsIHR5cGUsIHZpZXdJZCwgZGF0YSkuZGF0YTtcbiAgICB9ICovXG4gIH1cbn1cbiIsImltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuLi92aWV3cy92aWV3LXN0cmVhbS5qcydcbmltcG9ydCB7IGN1cnJ5IH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgUm91dGVDaGFubmVsVXBkYXRlciB7XG4gIGNvbnN0cnVjdG9yKGN4dCkge1xuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcoY3h0LnByb3BzLm5hbWUpXG4gICAgY29uc3QgaWQgPSBgJHtuYW1lfV9ST1VURV9VUERBVEVSYFxuXG4gICAgY29uc3Qgc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSA9IGN1cnJ5KFJvdXRlQ2hhbm5lbFVwZGF0ZXIuY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iailcbiAgICByZXR1cm4gc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSh7IGlkLCBuYW1lIH0pXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iaihwcm9wcywgZGF0YSkge1xuICAgIGNvbnN0IHsgbmFtZSwgaWQgfSAgPSBwcm9wc1xuICAgIGNvbnN0IHBheWxvYWQgPSBkYXRhXG4gICAgY29uc3QgdnMgPSBuZXcgVmlld1N0cmVhbSh7XG4gICAgICBpZCwgbmFtZSwgZGF0YVxuICAgIH0pXG5cbiAgICB2cy5vblJlbmRlcmVkID0gKCkgPT4ge1xuICAgICAgdnMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfUk9VVEUnLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIHZzLmFmdGVyQnJvYWRjYXN0RXZlbnRzID0gKCkgPT4ge1xuICAgICAgdnMuZGlzcG9zZVZpZXdTdHJlYW0oKVxuICAgIH1cblxuICAgIHZzLmFwcGVuZFRvTnVsbCgpXG4gIH1cbn1cbiIsImltcG9ydCB7IGNsb25lLCBjb21wb3NlLCBmcm9tUGFpcnMsIGlzLCBwYXRoLCB0b1BhaXJzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5jb25zdCBnZXRQcm9wVHlwZSA9IChwcnApID0+IHtcbiAgbGV0IHR5cGUgPSB0eXBlb2YgcHJwXG4gIGlmIChbJ251bWJlcicsICdib29sZWFuJywgJ3N0cmluZyddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgdHlwZSA9ICdwcmltaXRpdmUnXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcnApKSB7XG4gICAgICB0eXBlID0gJ2FycmF5J1xuICAgIH0gZWxzZSBpZiAocHJwID09PSBudWxsKSB7XG4gICAgICB0eXBlID0gJ3VuZGVmaW5lZCdcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHR5cGVcbn1cblxuY29uc3QgY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqID0gKHByb3h5T2JqLCBwcm94eVJldml2ZXJNZXRob2QpID0+IHtcbiAgY29uc3QgeyBfX3Byb3h5X19wcm94eU5hbWUgfSA9IHByb3h5T2JqXG5cbiAgaWYgKF9fcHJveHlfX3Byb3h5TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5lcnJvcignb2JqZWN0IGlzIG5vdCBwcm94eSBvYmplY3QgJywgcHJveHlPYmopXG4gIH1cblxuICBjb25zdCBjbG9uZU5lc3RlZFByb3h5T2JqID0gKHRhcmdldCwgcGF0aEFycikgPT4ge1xuICAgIGNvbnN0IG5lc3RlZFByb3h5T2JqID0gcGF0aChwYXRoQXJyLCBwcm94eU9iailcbiAgICBjb25zdCB7IF9fcHJveHlfX2lzUHJveHksIF9fcHJveHlfX3Byb3BzIH0gPSBuZXN0ZWRQcm94eU9ialxuICAgIHJldHVybiBfX3Byb3h5X19pc1Byb3h5ID8gcHJveHlSZXZpdmVyTWV0aG9kKHRhcmdldCwgX19wcm94eV9fcHJvcHMpIDogdGFyZ2V0XG4gIH1cblxuICBjb25zdCByb290T2JqID0gY2xvbmVOZXN0ZWRQcm94eU9iaihjbG9uZShwcm94eU9iaiksIFtdKVxuXG4gIGNvbnN0IHByb3h5SXRlcmFibGUgPSAoaXRlck9iaiwgaXRlclBhdGgpID0+IHtcbiAgICBjb25zdCBkYXRhUGF0aCA9IGl0ZXJQYXRoIHx8IFtdXG4gICAgY29uc3QgbG9vcE9iaiA9IChba2V5LCBwcm9wXSkgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IGdldFByb3BUeXBlKHByb3ApXG4gICAgICBjb25zdCBjbG9uZWRQYXRoID0gWy4uLmRhdGFQYXRoXVxuICAgICAgY2xvbmVkUGF0aC5wdXNoKGtleSlcbiAgICAgIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGl0ZXJPYmpba2V5XSA9IGNsb25lTmVzdGVkUHJveHlPYmoocHJvcCwgY2xvbmVkUGF0aClcbiAgICAgICAgcHJveHlJdGVyYWJsZShwcm9wLCBjbG9uZWRQYXRoKVxuICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuZW50cmllcyhpdGVyT2JqKS5mb3JFYWNoKGxvb3BPYmopXG4gIH1cblxuICBwcm94eUl0ZXJhYmxlKHJvb3RPYmopXG4gIC8vIGNvbnNvbGUudGltZUVuZCgncHJveGlmeTInKTtcblxuICByZXR1cm4gcm9vdE9ialxufVxuXG5leHBvcnQgY29uc3Qgc2FmZUNsb25lID0gZnVuY3Rpb24obykge1xuICBjb25zdCB7IF9fcHJveHlfX3Byb3h5TmFtZSB9ID0gb1xuICBpZiAoX19wcm94eV9fcHJveHlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBwcm94eVJldml2ZXJNZXRob2QgPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0UHJveHlSZXZpdmVyKF9fcHJveHlfX3Byb3h5TmFtZSlcbiAgICBpZiAodHlwZW9mIHByb3h5UmV2aXZlck1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNtc0RhdGFSZXZpdmVOZXN0ZWRQcm94eU9iaihvLCBwcm94eVJldml2ZXJNZXRob2QpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSlcbiAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QpXG4gIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gIGNvbnN0IGlzSXRlcmFibGUgPSBpc0l0ZXIobylcbiAgcmV0dXJuIGlzSXRlcmFibGUgPyBjb21wb3NlKGZyb21QYWlycywgdG9QYWlycywgY2xvbmUpKG8pIDogY2xvbmUobylcbn1cbiIsImltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5J1xuXG5sZXQgX3Nhbml0aXplSFRNTFxubGV0IGlzQ29uZmlndXJlZCA9IGZhbHNlXG5cbmNvbnN0IHNhbml0aXplSFRNTENvbmZpZ3VyZSA9IChjb25maWcpID0+IHtcbiAgaWYgKCFpc0NvbmZpZ3VyZWQpIHtcbiAgICBpZiAoY29uZmlnLnN0cmljdCkge1xuICAgICAgaWYgKHdpbmRvdy50cnVzdGVkVHlwZXMpIHtcbiAgICAgICAgY29uc3QgcG9saWN5ID0gd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koJ2RlZmF1bHQnLCB7XG4gICAgICAgICAgY3JlYXRlSFRNTDogKHRvX2VzY2FwZSkgPT4gRE9NUHVyaWZ5LnNhbml0aXplKHRvX2VzY2FwZSwgeyBSRVRVUk5fVFJVU1RFRF9UWVBFOiBmYWxzZSB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIF9zYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4gcG9saWN5LmNyZWF0ZUhUTUwoaHRtbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9zYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4gRE9NUHVyaWZ5LnNhbml0aXplKGh0bWwpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4gaHRtbCAvLyBObyBzYW5pdGl6YXRpb24gaWYgbm90IHJlcXVpcmVkXG4gICAgfVxuICAgIGlzQ29uZmlndXJlZCA9IHRydWVcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLndhcm4oJ3Nhbml0aXplSFRNTCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQuIFJlY29uZmlndXJhdGlvbiBpcyBub3QgYWxsb3dlZC4nKVxuICB9XG59XG5cbmNvbnN0IHNhbml0aXplSFRNTCA9IChodG1sKSA9PiB7XG4gIGlmICghaXNDb25maWd1cmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzYW5pdGl6ZUhUTUwgaXMgbm90IGNvbmZpZ3VyZWQuIENhbGwgc2FuaXRpemVIVE1MQ29uZmlndXJlKCkgd2l0aCBhcHByb3ByaWF0ZSBjb25maWcuJylcbiAgfVxuICByZXR1cm4gX3Nhbml0aXplSFRNTChodG1sKVxufVxuXG5leHBvcnQgeyBzYW5pdGl6ZUhUTUxDb25maWd1cmUgfVxuZXhwb3J0IGRlZmF1bHQgc2FuaXRpemVIVE1MXG4iLCJpbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVQbHVnaW5zTWV0aG9kcyB9IGZyb20gJy4vc3B5bmUtcGx1Z2lucy1tZXRob2RzLmpzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi9kZWVwLW1lcmdlLmpzJ1xuXG5sZXQgX2NvbmZpZ1xubGV0IF9jaGFubmVsc1xubGV0IF9jaGFubmVsc01hcFxubGV0IF9pbml0aWFsaXplZFxubGV0IF9kZWJ1ZyA9IHRydWVcbmNvbnN0IF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZSA9IFtdXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xubGV0IF9saW5rc0RhdGFcbmxldCBfbmF2TGlua3NcbmxldCBfSU1HX1BBVEhcbmNvbnN0IF9kb05vdFRyYWNrQ2hhbm5lbHNBcnIgPSBbXVxuY29uc3QgX3Byb3hpZXNNYXAgPSBuZXcgTWFwKClcblxuZnVuY3Rpb24gcmFuZG9tNkNoYXJzKCkge1xuICAvLyBGb3Igc2ltcGxpY2l0eTogc2xpY2UoMiwgOCkgZ2V0cyA2IHJhbmRvbSBjaGFycyBmcm9tIHRoZSBzdWJzdHJpbmdcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpO1xufVxuXG5jb25zdCBfc3B5bmVQbHVnaW5NZXRob2RzID0gbmV3IFNweW5lUGx1Z2luc01ldGhvZHMoKVxuXG5jbGFzcyBTcHluZUFwcFByb3BlcnRpZXNDbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIF9pbml0aWFsaXplZCA9IGZhbHNlXG4gIH1cblxuICBnZXQgY2hhbm5lbHNNYXAoKSB7XG4gICAgcmV0dXJuIF9jaGFubmVsc01hcFxuICB9XG5cbiAgZ2V0IGluaXRpYWxpemVkKCkge1xuICAgIHJldHVybiBfaW5pdGlhbGl6ZWRcbiAgfVxuXG4gIGdldCBjb25maWcoKSB7XG4gICAgcmV0dXJuIF9jb25maWdcbiAgfVxuXG4gIGdldCBkZWJ1ZygpIHtcbiAgICByZXR1cm4gX2RlYnVnXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBtb3N0bHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+TGlzdGluZyB0aGUgcmVnaXN0ZXJlZWQgQ2hhbm5lbHMgaW4gdGhlIGJyb3dzZXIgY29uc29sZTwvaDQ+J11cbiAgICogU3B5bmVBcHAubGlzdENoYW5uZWxzKCk7XG4gICAqXG4gICAqIEByZXR1cm5zIEEgbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCBjaGFubmVsc1xuICAgKi9cbiAgc3RhdGljIGxpc3RDaGFubmVscygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSlcbiAgfVxuXG4gIGluaXRpYWxpemUoZGVmYXVsdENvbmZpZyA9IHt9LCBjb25maWcgPSB7fSwgY2hhbm5lbHNNYXAsIHJvdXRlVXRpbHMpIHtcbiAgICBfY2hhbm5lbHMgPSBjaGFubmVsc01hcFxuICAgIF9jb25maWcgPSBkZWVwTWVyZ2UoZGVmYXVsdENvbmZpZywgY29uZmlnKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiY29uZmlnIGlzIFwiLCB7IGRlZmF1bHRDb25maWcsY29uZmlnIH0pO1xuICAgIGlmIChfY29uZmlnLmNoYW5uZWxzICYmIF9jb25maWcuY2hhbm5lbHMuUk9VVEUpIHtcbiAgICAgIC8vIF9jb25maWcgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNvbmZvcm1Sb3V0ZU9iamVjdChfY29uZmlnKVxuICAgICAgX2NvbmZpZyA9IHJvdXRlVXRpbHMuY29uZm9ybVJvdXRlT2JqZWN0KF9jb25maWcpXG4gICAgfVxuICAgIF9JTUdfUEFUSCA9IF9jb25maWc/LklNR19QQVRIXG4gICAgX2RlYnVnID0gX2NvbmZpZy5kZWJ1ZyAhPT0gdW5kZWZpbmVkID8gX2NvbmZpZy5kZWJ1ZyA6IF9kZWJ1Z1xuICAgIHRoaXMuZ2V0Q2hhbm5lbEFjdGlvbnMgPSBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMuYmluZChfY2hhbm5lbHMpXG4gICAgdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzID0gX2NoYW5uZWxzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMuYmluZChfY2hhbm5lbHMpXG4gICAgX2luaXRpYWxpemVkID0gdHJ1ZVxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gX2luaXRpYWxpemVkXG4gICAgdGhpcy5zZXRDaGFubmVsc01hcCgpXG4gICAgaWYgKGNvbmZpZz8uYmFzZUhyZWYpIHtcbiAgICAgIHRoaXMuc2V0SGVhZEJhc2VIcmVmKGNvbmZpZy5iYXNlSHJlZilcbiAgICB9XG4gICAgcmV0dXJuIF9jb25maWdcbiAgfVxuXG4gIHNldEhlYWRCYXNlSHJlZihzdHIpIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgYmFzZSBlbGVtZW50XG4gICAgY29uc3QgYmFzZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKVxuICAgIC8vIFNldCB0aGUgaHJlZiBhdHRyaWJ1dGUgdG8gdGhlIGRlc2lyZWQgYmFzZSBVUkxcbiAgICBiYXNlVGFnLmhyZWYgPSBzdHIgLy8gWW91IGNhbiBzZXQgdGhpcyB0byBhbnkgYmFzZSBVUkxcbiAgICAvLyBBcHBlbmQgdGhlIGJhc2UgZWxlbWVudCB0byB0aGUgaGVhZCBzZWN0aW9uIG9mIHRoZSBkb2N1bWVudFxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYmFzZVRhZylcbiAgfVxuXG4gIGNvbmZvcm1Sb3V0ZUNvbmZpZyhhZGQ0MDRQcm9wcyA9IGZhbHNlKSB7XG4gICAgLyoqXG4gICAgICogVEhJUyBNRVRIT0QgSVMgUFJJTUFSSUxZIFVTRUQgRk9SIFNQQSBHRU4gU0lURSBHRU5FUkFUSU9OXG4gICAgICovXG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICBfY29uZmlnID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jb25mb3JtUm91dGVPYmplY3QoX2NvbmZpZywgYWRkNDA0UHJvcHMpXG4gIH1cblxuICBzZXRDaGFubmVsc01hcCgpIHtcbiAgICBjb25zdCBnZXRTdHJlYW0gPSBfY2hhbm5lbHMuZ2V0U3RyZWFtLmJpbmQoX2NoYW5uZWxzKVxuICAgIGNvbnN0IHRlc3RTdHJlYW0gPSAgX2NoYW5uZWxzLnRlc3RTdHJlYW0uYmluZChfY2hhbm5lbHMpXG4gICAgY29uc3QgZ2V0UHJveHlTdWJqZWN0ID0gX2NoYW5uZWxzLmdldFByb3h5U3ViamVjdC5iaW5kKF9jaGFubmVscylcblxuICAgIF9jaGFubmVsc01hcCA9IHsgZ2V0U3RyZWFtLCB0ZXN0U3RyZWFtLCBnZXRQcm94eVN1YmplY3QgfVxuICB9XG5cbiAgc2V0UHJvcChrZXksIHZhbCwgaXNUZW1wID0gZmFsc2UpIHtcbiAgICBpZiAoaXNUZW1wKSB7XG4gICAgICBfY29uZmlnLmVwaGVtZXJhbFByb3BzW2tleV0gPSB2YWw7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBfY29uZmlnLnRtcFByb3BzW2tleV0gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiAga2V5O1xuICB9XG5cbiAgZ2V0UHJvcChrZXkpIHtcbiAgICBpZiAoX2NvbmZpZy5lcGhlbWVyYWxQcm9wcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb25zdCB0ZW1wVmFsID0gX2NvbmZpZy5lcGhlbWVyYWxQcm9wc1trZXldO1xuICAgICAgZGVsZXRlIF9jb25maWcuZXBoZW1lcmFsUHJvcHNba2V5XTtcbiAgICAgIHJldHVybiB0ZW1wVmFsO1xuICAgIH1cbiAgICByZXR1cm4gX2NvbmZpZz8udG1wUHJvcHM/LltrZXldO1xuICB9XG5cbiAgY3JlYXRlVGVtcFByb3AodmFsdWUpIHtcbiAgICBjb25zdCBrZXkgPSByYW5kb202Q2hhcnMoKTtcbiAgICB0aGlzLnNldFByb3Aoa2V5LCB2YWx1ZSwgdHJ1ZSk7IC8vIGlzVGVtcCA9IHRydWVcbiAgICByZXR1cm4ga2V5O1xuICB9XG5cblxuICBzZXRDaGFubmVsQ29uZmlnKGNoYW5uZWxOYW1lLCBjb25maWcpIHtcbiAgICBfY29uZmlnLmNoYW5uZWxzW2NoYW5uZWxOYW1lXSA9IGNvbmZpZ1xuICAgIHJldHVybiBfY29uZmlnLmNoYW5uZWxzW2NoYW5uZWxOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBjaGVjayBpbiB0aGUgY29uc29sZSBvciBpbiB0aGUgY29kZSB3aGF0IGFjdGlvbnMgYXJlIGF2YWlsYWJsZSB0byBiZSBsaXN0ZW5lZCB0by5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQW4gYXJyYXkgb2YgQWN0aW9ucyB0aGF0IGNhbiBiZSBsaXN0ZW5lZCB0b1xuICAgKi9cbiAgLyogIGdldENoYW5uZWxBY3Rpb25zKGNoYW5uZWxOYW1lKSB7XG4gICAgcmV0dXJuIF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucyhjaGFubmVsTmFtZSk7XG4gIH0gKi9cblxuICBnZXRDaGFubmVsQ29uZmlnKGNoYW5uZWxOYW1lLCBjb25maWcgPSBfY29uZmlnKSB7XG4gICAgaWYgKGNoYW5uZWxOYW1lID09PSAnQ0hBTk5FTF9ST1VURScpIHtcbiAgICAgIGNoYW5uZWxOYW1lID0gJ1JPVVRFJ1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbE5hbWUgPT09ICdDSEFOTkVMX1dJTkRPVycpIHtcbiAgICAgIGNoYW5uZWxOYW1lID0gJ1dJTkRPVydcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQgfHwgX2NvbmZpZy5jaGFubmVscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NweW5lIHdhcm5pbmc6IFNweW5lIGNvbmZpZyBvYmplY3QgaXMgZW1wdHkhJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWxDb25maWcgPSBfY29uZmlnLmNoYW5uZWxzW2NoYW5uZWxOYW1lXVxuXG4gICAgaWYgKGNoYW5uZWxDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSB3YXJuaW5nOiBTcHluZSBjb25maWd1cmF0aW9uIGZvciBjaGFubmVsLCAke2NoYW5uZWxOYW1lfSBpcyBlbXB0eSFgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5uZWxDb25maWdcbiAgfVxuXG4gIHJlZ2lzdGVyQ2hhbm5lbCgpIHtcblxuICB9XG5cbiAgYWRkUGx1Z2luQ29uZmlnKHBsdWdpbk5hbWUsIHBsdWdpbkNvbmZpZyA9IHt9KSB7XG4gICAgaWYgKF9jb25maWcucGx1Z2lucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBfY29uZmlnLnBsdWdpbnMgPSB7fVxuICAgIH1cbiAgICB0aGlzLmFkZFBsdWdpbk1ldGhvZHMocGx1Z2luQ29uZmlnLnBsdWdpbk1ldGhvZHMpXG5cbiAgICBfY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV0gPSBwbHVnaW5Db25maWdcbiAgfVxuXG4gIGdldFBsdWdpbnNNZXRob2RPYmoocGx1Z2luTWV0aG9kc09iaikge1xuICAgIGlmIChwbHVnaW5NZXRob2RzT2JqKSB7XG4gICAgICB0aGlzLmFkZFBsdWdpbk1ldGhvZHMocGx1Z2luTWV0aG9kc09iailcbiAgICB9XG5cbiAgICByZXR1cm4gX3NweW5lUGx1Z2luTWV0aG9kcy5wbHVnaW5NZXRob2RzT2JqXG4gIH1cblxuICBhZGRQbHVnaW5NZXRob2RzKHBsdWdpbk1ldGhvZHMpIHtcbiAgICBpZiAocGx1Z2luTWV0aG9kcykge1xuICAgICAgX3NweW5lUGx1Z2luTWV0aG9kcy5hZGRNZXRob2RzKHBsdWdpbk1ldGhvZHMpXG4gICAgfVxuICB9XG5cbiAgZG9Ob3RUcmFja0NoYW5uZWwoY2hhbm5lbE5hbWUpIHtcbiAgICBfZG9Ob3RUcmFja0NoYW5uZWxzQXJyLnB1c2goY2hhbm5lbE5hbWUpXG4gIH1cblxuICBnZXRVbnRyYWNrZWRDaGFubmVsc0xpc3QoKSB7XG4gICAgcmV0dXJuIF9kb05vdFRyYWNrQ2hhbm5lbHNBcnJcbiAgfVxuXG4gIHJlZ2lzdGVyUHJveHlSZXZpdmVyKG5hbWUsIG1ldGhvZCkge1xuICAgIF9wcm94aWVzTWFwLnNldChuYW1lLCBtZXRob2QpXG4gICAgLy8gY29uc29sZS5sb2coXCJSRUdJU1RFUkQgUFJPWFkgUkVWSVZFUlwiLF9wcm94aWVzTWFwLCBfcHJveGllc01hcC5nZXQobmFtZSkpO1xuICB9XG5cbiAgLy8gVGhpcyBpcyB0aGUgbmV3IG1ldGhvZCB5b3UgYWRkXG4gIHJlZ2lzdGVyUGx1Z2luKHBsdWdpbkluc3RhbmNlKSB7XG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgY29uc29sZS53YXJuKCdTcHluZUFwcCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiBQbHVnaW4gd2lsbCBub3QgYmUgZnVsbHkgcmVnaXN0ZXJlZC4nKVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZyhcIklOU1RBTkNFIFwiLHRoaXMsIHBsdWdpbkluc3RhbmNlKVxuXG4gICAgcGx1Z2luSW5zdGFuY2UucmVnaXN0ZXIodGhpcylcbiAgfVxuXG4gIGdldFByb3h5UmV2aXZlcihwcm94eU5hbWUpIHtcbiAgICByZXR1cm4gX3Byb3hpZXNNYXAuZ2V0KHByb3h5TmFtZSlcbiAgfVxuXG4gIGdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZShwbHVnaW5OYW1lKSB7XG4gICAgcmV0dXJuIF9jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXVxuICB9XG5cbiAgZ2V0IElNR19QQVRIKCkge1xuICAgIHJldHVybiBfSU1HX1BBVEhcbiAgfVxuXG4gIGdldCBleGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZSgpIHtcbiAgICByZXR1cm4gX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlXG4gIH1cblxuICAvLyBTZXR0ZXIgZm9yIF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZVxuICBzZXQgZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gUHVzaCBhIHNpbmdsZSBzdHJpbmcgaW50byB0aGUgYXJyYXkgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgaWYgKCFfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgIF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS5wdXNoKHZhbHVlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIE1lcmdlIGFuIGFycmF5IGludG8gdGhlIGV4aXN0aW5nIGFycmF5LCBhdm9pZGluZyBkdXBsaWNhdGVzXG4gICAgICB2YWx1ZS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnICYmICFfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgICAgICBfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdmFsdWUgcHJvdmlkZWQgdG8gZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUuIE9ubHkgc3RyaW5ncyBvciBhcnJheXMgYXJlIGFsbG93ZWQuJylcbiAgICB9XG4gIH1cblxuICBnZXQgbGlua3NEYXRhKCkge1xuICAgIGNvbnNvbGUud2FybignZ2V0IGxpbmtzIGRhdGEgaW4gU3B5bmVBcHBQcm9wZXJ0aWVzIGlzIGRlcHJlY2F0ZWQsIHVzZSBuYXZMaW5rcycpXG4gICAgcmV0dXJuIF9uYXZMaW5rc1xuICB9XG5cbiAgc2V0IGxpbmtzRGF0YShhcnIpIHtcbiAgICBjb25zb2xlLndhcm4oJ3NldCBsaW5rcyBkYXRhIGluIFNweW5lQXBwUHJvcGVydGllcyBpcyBkZXByZWNhdGVkLCB1c2UgbmF2TGlua3MnKVxuICB9XG5cbiAgZ2V0IG5hdkxpbmtzKCkge1xuICAgIHJldHVybiBfbmF2TGlua3NcbiAgfVxuXG4gIHNldCBuYXZMaW5rcyhhcnIpIHtcbiAgICBfbmF2TGlua3MgPSBhcnJcbiAgfVxuXG4gIHRlbXBHZXRDaGFubmVsc0luc3RhbmNlKCkge1xuXG4gIH1cblxuICB0ZW1wR2V0Q29uZmlnKCkge1xuXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFNweW5lQXBwUHJvcGVydGllcyA9IG5ldyBTcHluZUFwcFByb3BlcnRpZXNDbGFzcygpXG4iLCJpbXBvcnQgeyBhbGxQYXNzLCBjb21wb3NlLCBpcywga2V5cywgbm90LCBwcm9wIH0gZnJvbSAncmFtZGEnXG5cbmNvbnN0IF9wbHVnaW5NZXRob2RzT2JqID0gT2JqZWN0LmNyZWF0ZSh7fSlcblxuY29uc3QgaXNOb3RBcnIgPSBjb21wb3NlKG5vdCwgaXMoQXJyYXkpKVxuLy8gY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBvc2Uobm90LCBpc0VtcHR5KVxuLy8gY29uc3QgaXNOb25FbXB0eVN0ciA9IGFsbFBhc3MoW2lzKFN0cmluZyksIGlzTm90RW1wdHldKVxuLy8gY29uc3QgaXNOb25FbXB0eUFyciA9IGFsbFBhc3MoW2lzKEFycmF5KSwgaXNOb3RFbXB0eV0pXG5jb25zdCBpc09iamVjdEZuID0gY29tcG9zZShhbGxQYXNzKFtpc05vdEFyciwgaXMoT2JqZWN0KV0pKVxuLy8gY29uc3QgaXNOb25FbXB0eU9iamVjdEZuID0gY29tcG9zZShhbGxQYXNzKFtpc05vdEVtcHR5LCBpc05vdEFyciwgaXMoT2JqZWN0KV0pKVxuXG5leHBvcnQgY2xhc3MgU3B5bmVQbHVnaW5zTWV0aG9kcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIF9wbHVnaW5NZXRob2RzT2JqLmZvbyA9ICgpID0+IGNvbnNvbGUubG9nKCd1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLicpXG4gIH1cblxuICBhZGRNZXRob2Qoa2V5LCBmbiwgdGVzdCA9IGZhbHNlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfcGx1Z2luTWV0aG9kc09iaiwga2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgd2FyblN0ciA9IGBTcHluZSBXYXJuaW5nOiB0aGUgbWV0aG9kIG5hbWUsICR7a2V5fSwgYWxyZWFkeSBleGlzdHMuYFxuICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgcmV0dXJuIHdhcm5TdHJcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgIH0gZWxzZSB7XG4gICAgICBfcGx1Z2luTWV0aG9kc09ialtrZXldID0gZm5cbiAgICB9XG4gIH1cblxuICBhZGRNZXRob2RzKG1ldGhvZHNPYmogPSB7fSwgdGVzdCA9IGZhbHNlKSB7XG4gICAgbGV0IHdhcm5TdHJcblxuICAgIGNvbnN0IGlzT2JqID0gaXNPYmplY3RGbihtZXRob2RzT2JqKVxuXG4gICAgaWYgKGlzT2JqID09PSBmYWxzZSkge1xuICAgICAgd2FyblN0ciA9IGBTcHluZSBXYXJuaW5nOiB0aGUgcGx1Z2luTWV0aG9kcyBwcm9wZXJ0eSwgJHtKU09OLnN0cmluZ2lmeShtZXRob2RzT2JqKX0gbmVlZHMgdG8gYmUgYW4gb2JqZWN0LmBcbiAgICAgIGlmICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiB3YXJuU3RyXG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4od2FyblN0cilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrRWFjaEtleUZvclZhbGlkTWV0aG9kID0gKGtleVN0cikgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kVmFsID0gcHJvcChrZXlTdHIsIG1ldGhvZHNPYmopXG5cbiAgICAgIGNvbnN0IGlzRnVuY3Rpb24gPSB0eXBlb2YgKG1ldGhvZFZhbCkgPT09ICdmdW5jdGlvbidcblxuICAgICAgaWYgKGlzRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5hZGRNZXRob2Qoa2V5U3RyLCBtZXRob2RWYWwsIHRlc3QpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuU3RyID0gYHRoZSB2YWx1ZSBmb3IgJHtrZXlTdHJ9IGlzIG5vdCBhIHZhbGlkIGZ1bmN0aW9uLmBcbiAgICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgICByZXR1cm4gd2FyblN0clxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kS2V5cyA9IGtleXMobWV0aG9kc09iailcblxuICAgIHJldHVybiBtZXRob2RLZXlzLm1hcChjaGVja0VhY2hLZXlGb3JWYWxpZE1ldGhvZCkuam9pbignLCcpXG4gIH1cblxuICBjaGVja0lmTWV0aG9kRXhpc3RzKGtleSkge1xuXG4gIH1cblxuICBnZXQgcGx1Z2luTWV0aG9kc09iaigpIHtcbiAgICByZXR1cm4gX3BsdWdpbk1ldGhvZHNPYmpcbiAgfVxufVxuIiwiaW1wb3J0IHsgZ2V0QWxsTWV0aG9kTmFtZXMgfSBmcm9tICcuL2ZycC10b29scy5qcydcbmltcG9ydCB7IHJlamVjdCwgY3VycnlOLCBfXywgbWFwIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVRyYWl0IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVUcmFpdFxuICAgKiBAdHlwZSBleHRlbmRhYmxlXG4gICAqIEBwYXJhbSB7dGhpc30gcGFyZW50Q29udGV4dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJlZml4XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXV0b0luaXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7dGhpc30gcGFyZW50Q29udGVudCAtID0gdW5kZWZpbmVkOyBUaGlzIGJpbmRzIGFsbCBtZXRob2RzIHdpdGhpbiBTcHluZVRyYWl0IGludG8gdGhlIHBhcmVudENvbnRleHQncyBvYmplY3RcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByZWZpeCAtID0gdW5kZWZpbmVkOyBTcHluZVRyYWl0cyBmb3JjZXMgYWxsIG1ldGhvZCBuYW1lcyB0byBiZWdpbiB3aXRoIHRoZSBzYW1lIHByZWZpeC4gVGhpcyBhbGxvd3Mgb3RoZXIgb2JqZWN0cyB0byBxdWlja2x5IHVuZGVyc3RhbmQgd2hlcmUgdGhlIG9yaWdpbmFsIG1ldGhvZCBpcyBzZXQuXG4gICAqIEBkZXNjXG4gICAqIFNweW5lVHJhaXRzIGFsbG93IHRoZSBlaGFuY2luZyBvZiBjbGFzc2VzIGFuZCBvdGhlciBvYmplY3RzIHdpdGhvdXQgaGF2aW5nIHRvIGV4dGVuZCBjbGFzc2VzIG9yIG1hbmlwdWxhdGUgZnVuY3Rpb24gcHJvdG90eXBlc1xuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihwYXJlbnRDb250ZXh0LCBwcmVmaXggPSAnJywgYXV0b0luaXQgPSB0cnVlKSB7XG4gICAgdGhpcy5wYXJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dFxuICAgIHRoaXMub21pdHRlZE1ldGhvZHMgPSBbXG4gICAgICAnYXV0b0JpbmRlcicsXG4gICAgICAnaW5pdEF1dG9CaW5kZXInLFxuICAgICAgJ2dldEVuaGFuY2VyTWV0aG9kcycsXG4gICAgICAnY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzJyxcbiAgICAgICdjYWxsZXInLFxuICAgICAgJ2FyZ3VtZW50cycsXG4gICAgICAnYmluZFBhcmVudFZpZXdTdHJlYW0nXVxuXG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXhcblxuICAgIGlmIChhdXRvSW5pdCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5hdXRvQmluZGVyKClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWxsTWV0aG9kc0xpc3RcbiAgfVxuXG4gIGluaXRBdXRvQmluZGVyKCkge1xuICAgIHRoaXMuYXV0b0JpbmRlcigpXG4gIH1cblxuICBnZXRFbmhhbmNlck1ldGhvZHMoKSB7XG4gICAgcmV0dXJuIGdldEFsbE1ldGhvZE5hbWVzKHRoaXMsIHRoaXMub21pdHRlZE1ldGhvZHMpXG4gIH1cblxuICBjaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMobWV0aG9kc0Fycikge1xuICAgIGlmICh0aGlzLnByZWZpeCA9PT0gJycpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU1BZTkUgV0FSTklORzogVGhlIGZvbGxvd2luZyBTcHluZVRyYWl0ICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBuZWVkcyBhIHByZWZpeGApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gbGV0IHJlU3RyID0gYF4oJHt0aGlzLnByZWZpeH0pKC4qKSRgO1xuICAgIC8vIGxldCByZSA9IG5ldyBSZWdFeHAocmVTdHIpO1xuICAgIGNvbnN0IGhhc1ByZWZpeCA9IChzdHIpID0+IHN0ci5pbmRleE9mKHRoaXMucHJlZml4KSA9PT0gMFxuXG4gICAgY29uc3QgbWFsZm9ybWVkTWV0aG9kc0FyciA9IHJlamVjdChoYXNQcmVmaXgsIG1ldGhvZHNBcnIpXG4gICAgaWYgKG1hbGZvcm1lZE1ldGhvZHNBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IHdhcm5pbmdTdHIgPSBgU3B5bmUgV2FybmluZzogVGhlIGZvbGxvd2luZyBtZXRob2QocykgaW4gJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IHJlcXVpcmUgdGhlIHByZWZpeCwgXCIke3RoaXMucHJlZml4fVwiOiBbJHttYWxmb3JtZWRNZXRob2RzQXJyLmpvaW4oJywgJyl9XTtgXG4gICAgICBjb25zb2xlLndhcm4od2FybmluZ1N0cilcbiAgICB9XG4gIH1cblxuICBiaW5kUGFyZW50Vmlld1N0cmVhbShtZXRob2RzT2JqLCBjb250ZXh0KSB7XG4gICAgdGhpcy5jaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMobWV0aG9kc09iai5hbGxNZXRob2RzKVxuICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgY29uc3QgYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0gPSAoc3RyLCBpc1N0YXRpYyA9IGZhbHNlKSA9PiB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvclR5cGUgPSBpc1N0YXRpYyA9PT0gdHJ1ZSA/IHRoaXMuY29uc3RydWN0b3IgOiB0aGlzXG4gICAgICBjb25zdCBwcm9wZXJ0eVR5cGUgPSB0eXBlb2YgKGNvbnN0cnVjdG9yVHlwZVtzdHJdKVxuICAgICAgaWYgKHByb3BlcnR5VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmpbc3RyXSA9IGNvbnRleHRbc3RyXSA9IGNvbnN0cnVjdG9yVHlwZVtzdHJdLmJpbmQoY29udGV4dClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBiaW5kQ3VycnkgPSBjdXJyeU4oMiwgYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0pXG4gICAgY29uc3QgYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0gPSBiaW5kQ3VycnkoX18sIHRydWUpXG4gICAgLy8gTUFQIFNUQVRJQyBNRVRIT0RTXG4gICAgbWFwKGJpbmRTdGF0aWNNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtLCBtZXRob2RzT2JqLnN0YXRpY01ldGhvZHMpXG4gICAgLy8gTUFQIE1BSU4gTUVUSE9EU1xuICAgIG1hcChiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSwgbWV0aG9kc09iai5tZXRob2RzKVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGF1dG9CaW5kZXIoKSB7XG4gICAgY29uc3QgYWxsTWV0aG9kcyA9IHRoaXMuZ2V0RW5oYW5jZXJNZXRob2RzKClcbiAgICAvLyBjb25zb2xlLmxvZygnYWxsICcsYWxsTWV0aG9kcyk7XG4gICAgdGhpcy5hbGxNZXRob2RzTGlzdCA9IHRoaXMuYmluZFBhcmVudFZpZXdTdHJlYW0oYWxsTWV0aG9kcywgdGhpcy5wYXJlbnRDb250ZXh0KVxuICAgIHJldHVybiB0aGlzLmFsbE1ldGhvZHNMaXN0XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzRW1wdHksIGhlYWQsIHZhbHVlcywgY29tcG9zZSwgcHJvcCwgY29tcGxlbWVudCwgaXNOaWwsIGFsbFBhc3MsIHJlZHVjZSwgZmlsdGVyLCBlcXVhbHMsIHRvUGFpcnMsIHJlcGxhY2UsIGVpdGhlciwgcHJvcEVxLCBfXywgaW52ZXJ0LCBwYXRoLCB6aXBPYmosIHJlamVjdCwga2V5cywgZmluZCwgYXNzb2MsIGlzLCBoYXMsIHdoZW4sIHNwbGl0LCBhbHdheXMsIGNvbmNhdCwgam9pbiwgZmxhdHRlbiwgbWFwLCBpZkVsc2UsIHRlc3QsIGZpbmRMYXN0SW5kZXgsIGxhc3QsIGRlZmF1bHRUbywgZnJvbVBhaXJzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybFxuICAgICAqIEB0eXBlIGludGVybmFsXG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAZGVzY1xuICAgICAqIEludGVybmFsIHVybCBtZXRob2RzIGZvciB0aGUgU3B5bmVSb3V0ZUNoYW5uZWxcbiAgICAgKi9cbiAgICB0aGlzLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwuYmluZCh0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwob2JqKSB7XG4gICAgY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBvc2UoY29tcGxlbWVudChpc0VtcHR5KSwgaGVhZCwgdmFsdWVzKVxuICAgIGNvbnN0IGlzTm90TmlsID0gY29tcG9zZShjb21wbGVtZW50KGlzTmlsKSwgaGVhZCwgdmFsdWVzKVxuICAgIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90TmlsXSlcbiAgICByZXR1cm4gaXNOb3ROaWxBbmRJc05vdEVtcHR5KG9iailcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmUGFyYW1WYWx1ZU1hdGNoZXNSZWdleChwYXJhbVZhbHVlLCByb3V0ZU9iaikge1xuICAgIGNvbnN0IHJlamVjdFBhcmFtS2V5ID0gcmVqZWN0KGVxdWFscygncm91dGVOYW1lJykpXG4gICAgY29uc3Qga2V5c0FyciA9IGNvbXBvc2UocmVqZWN0UGFyYW1LZXksIGtleXMpXG4gICAgY29uc3QgdGVzdEZvclJlZ2V4TWF0Y2ggPSBzdHIgPT4gdGVzdChuZXcgUmVnRXhwKHN0ciksIHBhcmFtVmFsdWUpXG4gICAgY29uc3QgY2hlY2tlciA9IGNvbXBvc2UoZmluZCh0ZXN0Rm9yUmVnZXhNYXRjaCksIGtleXNBcnIpXG4gICAgY29uc3QgcmVnZXhNYXRjaFN0ciA9IGNoZWNrZXIocm91dGVPYmopXG4gICAgaWYgKGlzKFN0cmluZywgcmVnZXhNYXRjaFN0cikpIHtcbiAgICAgIHJvdXRlT2JqID0gYXNzb2MocGFyYW1WYWx1ZSwgcHJvcChyZWdleE1hdGNoU3RyLCByb3V0ZU9iaiksIHJvdXRlT2JqKVxuICAgIH1cbiAgICByZXR1cm4gcm91dGVPYmpcbiAgfVxuXG4gIHN0YXRpYyBmb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uKHN0cikge1xuICAgIGNvbnN0IGhhc2ggPSBzdHJcbiAgICBjb25zdCBzZWFyY2ggPSBzdHJcbiAgICBjb25zdCBwYXRobmFtZSA9IHN0clxuICAgIHJldHVybiB7IGhhc2gsIHNlYXJjaCwgcGF0aG5hbWUgfVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uU3RyQnlUeXBlKHQsIGlzSGFzaCA9IGZhbHNlLCBsb2MgPSB3aW5kb3cubG9jYXRpb24pIHtcbiAgICBjb25zdCB0eXBlID0gaXNIYXNoID09PSB0cnVlID8gJ2hhc2gnIDogdFxuXG4gICAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAgIHNsYXNoOiAncGF0aG5hbWUnLFxuICAgICAgcXVlcnk6ICdzZWFyY2gnLFxuICAgICAgaGFzaDogJ2hhc2gnXG4gICAgfVxuICAgIGNvbnN0IHByb3BWYWwgPSB0eXBlTWFwW3R5cGVdXG4gICAgY29uc3Qgc3RyICA9IHByb3AocHJvcFZhbCwgbG9jKVxuICAgIGNvbnN0IGNoZWNrRm9yU2xhc2hBbmRIYXNoID0gL14oXFwvKT8oIyk/KFxcLyk/KC4qKSQvXG4gICAgLy8gY29uc29sZS5sb2coXCJEQVRBIExPQyBTVFIgXCIse3N0ciwgbG9jLCBwcm9wLCB0eXBlLGlzSGFzaH0pO1xuICAgIHJldHVybiBzdHIucmVwbGFjZShjaGVja0ZvclNsYXNoQW5kSGFzaCwgJyQ0JylcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVSb3V0ZUFycmF5RnJvbVBhcmFtcyhkYXRhLCByb3V0ZSwgdCA9ICdzbGFzaCcsIHBhcmFtc0Zyb21Mb2MpIHtcbiAgICBjb25zdCB1cmxBcnIgPSBbXVxuICAgIGNvbnN0IGxvb3BUaHJvdWdoUGFyYW0gPSAocm91dGVPYmopID0+IHtcbiAgICAgIGNvbnN0IHVybE9iaiA9IHt9XG4gICAgICBjb25zdCBrZXl3b3JkID0gcm91dGVPYmoucm91dGVOYW1lIC8vIFBBUkFNIEZPUk0gU1BZTkUgQ09ORklHXG4gICAgICBsZXQgcGFyYW1WYWxGcm9tRGF0YSA9IGRhdGFba2V5d29yZF0gIT09IHVuZGVmaW5lZCA/IGRhdGFba2V5d29yZF0gOiBwcm9wKGtleXdvcmQsIHBhcmFtc0Zyb21Mb2MpIC8vIFBVTEwgVkFMVUUgRk9SIFRISVMgUEFSQU0gRlJPTSBEQVRBXG4gICAgICBjb25zdCBwYXJhbVZhbFR5cGUgPSB0eXBlb2YgKHJvdXRlT2JqW3BhcmFtVmFsRnJvbURhdGFdKVxuXG4gICAgICBpZiAocGFyYW1WYWxUeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBwYXJhbVZhbEZyb21EYXRhID0gcm91dGVPYmpbcGFyYW1WYWxGcm9tRGF0YV1cbiAgICAgIH0gZWxzZSBpZiAocGFyYW1WYWxUeXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByb3V0ZU9iaiA9IHRoaXMuY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgocGFyYW1WYWxGcm9tRGF0YSwgcm91dGVPYmopXG4gICAgICB9XG5cbiAgICAgIHVybE9ialtrZXl3b3JkXSA9IHBhcmFtVmFsRnJvbURhdGFcblxuICAgICAgaWYgKHRoaXMuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCh1cmxPYmopKSB7XG4gICAgICAgIHVybEFyci5wdXNoKHVybE9iailcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNPYmplY3QgPSBpcyhPYmplY3QsIHJvdXRlT2JqKVxuICAgICAgY29uc3Qgb2JqZWN0UGFyYW1FeGlzdHMgPSBoYXMocGFyYW1WYWxGcm9tRGF0YSwgcm91dGVPYmopXG4gICAgICBjb25zdCBvYmplY3RDb250YWluc1JvdXRlID0gaGFzKCdyb3V0ZVBhdGgnLCByb3V0ZU9iailcbiAgICAgIGNvbnN0IHJlY3Vyc2l2ZWx5Q2FsbExvb3BCb29sID0gb2JqZWN0UGFyYW1FeGlzdHMgJiYgaXNPYmplY3RcbiAgICAgIGlmIChyZWN1cnNpdmVseUNhbGxMb29wQm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBuZXdPYmogPSByb3V0ZU9ialtwYXJhbVZhbEZyb21EYXRhXVxuICAgICAgICBpZiAoaGFzKCdyb3V0ZVBhdGgnLCBuZXdPYmopKSB7XG4gICAgICAgICAgbG9vcFRocm91Z2hQYXJhbShuZXdPYmoucm91dGVQYXRoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG9iamVjdENvbnRhaW5zUm91dGUgPT09IHRydWUgJiYgcGFyYW1WYWxGcm9tRGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvb3BUaHJvdWdoUGFyYW0ocm91dGVPYmoucm91dGVQYXRoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxvb3BUaHJvdWdoUGFyYW0ocm91dGUpXG5cbiAgICByZXR1cm4gdXJsQXJyXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlU2xhc2hTdHJpbmcoYXJyKSB7XG4gICAgY29uc3QgYXJyQ2xlYXIgPSByZWplY3QoaXNOaWwpXG4gICAgY29uc3Qgbm90VW5kZWZpbmVkID0gd2hlbihjb21wbGVtZW50KGlzTmlsLCBfXyksIGpvaW4oJy8nKSlcbiAgICBjb25zdCBzdHJpcFJlZ2V4ID0gcmVwbGFjZSgvXihcXF4qKSguKnxeXFwkKShcXCQpJC8sICckMicpXG4gICAgY29uc3Qgam9pbmVyID0gY29tcG9zZShzdHJpcFJlZ2V4LCBub3RVbmRlZmluZWQsIGFyckNsZWFyLCBmbGF0dGVuLCBtYXAodmFsdWVzKSlcbiAgICByZXR1cm4gam9pbmVyKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVRdWVyeVN0cmluZyhhcnIpIHtcbiAgICBjb25zdCBhcnJDbGVhciA9IHJlamVjdChpc05pbClcblxuICAgIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IHRoaXMuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbFxuXG4gICAgY29uc3QgY3JlYXRlUGFpciA9IGNvbXBvc2UoXG4gICAgICBqb2luKCc9JyksXG4gICAgICBmbGF0dGVuLFxuICAgICAgdG9QYWlycylcblxuICAgIGNvbnN0IGNoZWNrUGFpciA9IGlmRWxzZShcbiAgICAgIGlzTm90TmlsQW5kSXNOb3RFbXB0eSxcbiAgICAgIGNyZWF0ZVBhaXIsXG4gICAgICBhbHdheXModW5kZWZpbmVkKVxuICAgIClcblxuICAgIGNvbnN0IG1hcEFycmF5T2ZQYWlycyA9IG1hcChjaGVja1BhaXIpXG5cbiAgICBjb25zdCBjaGVja0lmU3RySXNFbXB0eSA9IHdoZW4oXG4gICAgICBjb21wbGVtZW50KGlzRW1wdHkpLFxuICAgICAgY29uY2F0KCc/JykpXG5cbiAgICBjb25zdCBjcmVhdGVRcyA9IGNvbXBvc2UoXG4gICAgICBjaGVja0lmU3RySXNFbXB0eSxcbiAgICAgIGpvaW4oJyYnKSxcbiAgICAgIGFyckNsZWFyLFxuICAgICAgbWFwQXJyYXlPZlBhaXJzKVxuXG4gICAgcmV0dXJuIGNyZWF0ZVFzKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja1BheWxvYWRGb3JSZWdleE92ZXJyaWRlcyh1cmxzQXJyLCBkYXRhLCBwYXJzZVN0cmluZyA9ICdWYWx1ZScpIHtcbiAgICAvLyBDSEVDSyBJRiBQQVlMT0FEIEhBUyBBTlkgT1ZFUlJJREVTXG4gICAgY29uc3QgZ2V0UHJvcFZhbE92ZXJyaWRlID0gKGtleSkgPT4gcHJvcChgJHtrZXl9JHtwYXJzZVN0cmluZ31gLCBkYXRhKVxuXG4gICAgLy8gR0VUIEFOWSBQT1NTSUJMRSBWQUxVRSBVU0lORyBUSEUgQ1VSUkVOVCBLRVlcbiAgICBjb25zdCBnZXRPdmVycmlkZVZhbCA9IGNvbXBvc2UoZ2V0UHJvcFZhbE92ZXJyaWRlLCBoZWFkLCBrZXlzKVxuXG4gICAgLy8gTUFQIEFMTCBPQkpFQ1QgVkFMUyBUTyBURVNUIEZPUiBPVkVSUklERVNcbiAgICBjb25zdCBtYXBVcmxQcm9wcyA9IChwcm9wKSA9PiB7XG4gICAgICBjb25zdCBvdmVycmlkZVZhbCA9IGdldE92ZXJyaWRlVmFsKHByb3ApXG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFwib3ZlcnJpZGUgdmFsIFwiLG92ZXJyaWRlVmFsLCBkYXRhKTtcbiAgICAgIC8vIGlmIHJlZ2V4IHZhbHVlIGlzIGZvdW5kXG4gICAgICBpZiAob3ZlcnJpZGVWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYXNzb2MoY29tcG9zZShoZWFkLCBrZXlzKShwcm9wKSwgb3ZlcnJpZGVWYWwsIHByb3ApXG4gICAgICB9XG4gICAgICAvLyBpZGVudGl0eVxuICAgICAgcmV0dXJuIHByb3BcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwKG1hcFVybFByb3BzLCB1cmxzQXJyKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzKHVybHNBcnIpIHtcbiAgICAvLyBEZWZpbmUgdGhlIGludGVybmFsIG1ldGhvZCB0byBleHRyYWN0IHRoZSBzdHJpbmcgYmVmb3JlIHRoZSBwaXBlXG4gICAgY29uc3QgZ2V0U3RyaW5nQmVmb3JlUGlwZSA9IChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaCgvXltefF0qLylcbiAgICAgIHJldHVybiBtYXRjaCA/IChtYXRjaFswXSA9PT0gJ14kJyA/ICcnIDogbWF0Y2hbMF0pIDogaW5wdXRcbiAgICB9XG5cbiAgICBjb25zdCBtYXBVcmxBcnJPYmogPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCBwaXBlUmVkdWNlciA9IChhY2MsIGtleSkgPT4ge1xuICAgICAgICBhY2Nba2V5XSA9IGdldFN0cmluZ0JlZm9yZVBpcGUob2JqW2tleV0pXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9iaiA9IE9iamVjdC5rZXlzKG9iaikucmVkdWNlKHBpcGVSZWR1Y2VyLCB7fSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh1cmxzQXJyKSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHVybHNBcnIubWFwKG1hcFVybEFyck9iailcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsc0FyclxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUm91dGVWYWxzUGFydE1hdGNoKHVybHNBcnIsIGRhdGEgPSB7fSkge1xuICAgIC8qKlxuICAgICAqIDEuIExvb3AgdGhyb3VnaCB1cmxzQXJyXG4gICAgICogMi4gTG9vcCB0aHJvdWdoIHByb3BlcnRpZXNcbiAgICAgKiAzLiBBcHBseSBtYXRjaEdsb2JQYXR0ZXJuIHRvIGVhY2ggcHJvcGVydHkgdmFsdWUgYW5kIGNoZWNrIGZvciBtYXRjaCB3aXRoIGRhdGEgb2JqZWN0IHByb3BlcnR5XG4gICAgICogNC4gUmV0dXJuIHRoZSB1cGRhdGVkIG9iamVjdCB3aXRoIG1hdGNoZWQgdmFsdWVzLCBvciBrZWVwIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIGlmIG5vIG1hdGNoXG4gICAgICovXG5cbiAgICBjb25zdCBtYXRjaEdsb2JQYXR0ZXJuID0gKHN0ciwgZ2xvYlBhdHRlcm4pID0+IHtcbiAgICAgIGNvbnN0IGdsb2JQYXR0ZXJuTWF0Y2ggPSAocGF0dGVybiwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgZXNjYXBlZFBhdHRlcm4gPSBwYXR0ZXJuXG4gICAgICAgICAgLnJlcGxhY2UoL1stL1xcXFxeJCs/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICAgICAgICAucmVwbGFjZSgvXFwqL2csICdbXFxcXHdcXFxcZF8tXSonKSAvLyAqIHNob3VsZCBtYXRjaCBhbnkgc2VxdWVuY2Ugb2YgYWxwaGFudW1lcmljLCB1bmRlcnNjb3Jlcywgb3IgZGFzaGVzXG5cbiAgICAgICAgY29uc3QgcmVnZXhQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZFBhdHRlcm59JGApIC8vIE1hdGNoIHRoZSBmdWxsIHN0cmluZ1xuICAgICAgICByZXR1cm4gcmVnZXhQYXR0ZXJuLnRlc3QodmFsdWUpXG4gICAgICB9XG5cbiAgICAgIC8vIFNwbGl0IHRoZSBnbG9iUGF0dGVybiBieSBwaXBlICh8KVxuICAgICAgY29uc3QgcGF0dGVybnMgPSBnbG9iUGF0dGVybi5zcGxpdCgnfCcpXG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdHJpbmcgbWF0Y2hlcyBhbnkgb2YgdGhlIHBhdHRlcm5zXG4gICAgICBjb25zdCBoYXNNYXRjaCA9IHBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGdsb2JQYXR0ZXJuTWF0Y2gocGF0dGVybiwgc3RyKSlcblxuICAgICAgLy8gUmV0dXJuIHRoZSBzdHJpbmcgaWYgdGhlcmUncyBhIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBnbG9iIHBhdHRlcm5cbiAgICAgIHJldHVybiBoYXNNYXRjaCA/IHN0ciA6IGdsb2JQYXR0ZXJuXG4gICAgfVxuXG4gICAgLy8gRnVuY3Rpb24gdG8gY2hlY2sgYW5kIHJlcGxhY2UgbWF0Y2hpbmcgcHJvcGVydGllc1xuICAgIGNvbnN0IHJlcGxhY2VNYXRjaGluZ1Byb3BlcnR5ID0gKG9iaikgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZE9iaiA9IHsgLi4ub2JqIH0gLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgb2JqZWN0IHRvIGF2b2lkIG11dGF0aW9uXG5cbiAgICAgIC8vIEZ1bmN0aW9uIHRvIGNoZWNrIGVhY2ggcHJvcGVydHkgYW5kIGFwcGx5IG1hdGNoR2xvYlBhdHRlcm5cbiAgICAgIGNvbnN0IGNoZWNrQW5kUmVwbGFjZVByb3BlcnR5ID0gKGtleSkgPT4ge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHVwZGF0ZWRPYmosIGtleSkgJiYgZGF0YVtrZXldKSB7XG4gICAgICAgICAgdXBkYXRlZE9ialtrZXldID0gbWF0Y2hHbG9iUGF0dGVybihkYXRhW2tleV0sIHVwZGF0ZWRPYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdFxuICAgICAgT2JqZWN0LmtleXModXBkYXRlZE9iaikuZm9yRWFjaChjaGVja0FuZFJlcGxhY2VQcm9wZXJ0eSlcblxuICAgICAgcmV0dXJuIHVwZGF0ZWRPYmpcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggdGhlIGFycmF5IGFuZCByZXBsYWNlIG1hdGNoaW5nIHByb3BlcnRpZXNcbiAgICByZXR1cm4gdXJsc0Fyci5tYXAocmVwbGFjZU1hdGNoaW5nUHJvcGVydHkpXG4gIH1cblxuICBzdGF0aWMgY29udmVydFBhcmFtc1RvUm91dGUoZGF0YSwgciA9IFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUsIHQsIGxvY1N0cikge1xuICAgIGNvbnN0IHVybFR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogci50eXBlXG4gICAgY29uc3QgaXNIYXNoID0gci5pc0hhc2hcbiAgICBjb25zdCByb3V0ZSA9IHIucm91dGVzLnJvdXRlUGF0aFxuICAgIGNvbnN0IGxvY2F0aW9uU3RyID0gbG9jU3RyICE9PSB1bmRlZmluZWQgPyBsb2NTdHIgOiB0aGlzLmdldExvY2F0aW9uU3RyQnlUeXBlKHVybFR5cGUsIGlzSGFzaClcbiAgICBjb25zdCBwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uID0gdGhpcy5jb252ZXJ0Um91dGVUb1BhcmFtcyhsb2NhdGlvblN0ciwgciwgdXJsVHlwZSkucm91dGVEYXRhXG4gICAgbGV0IHVybEFyciA9IHRoaXMuY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMoZGF0YSwgcm91dGUsIHVybFR5cGUsIHBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24pXG5cbiAgICB1cmxBcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzKHVybEFyciwgZGF0YSlcbiAgICB1cmxBcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzKHVybEFycilcbiAgICAvLyBUSElTIFdJTEwgTUFUQ0ggRVhBQ1RMWSBUSEUgUFJPUEVSVFkgSUQsIFNPIHBhZ2VJZD1cImRhc2hib2FyZF8xXCIgd2lsbCByZXR1cm4gdGhhdCBpbnN0ZWFkIG9mIGdsb2JQYXR0ZXJuWzBdXG4gICAgLy8gdXJsQXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja0ZvclJvdXRlVmFsc1BhcnRNYXRjaCh1cmxBcnIsIGRhdGEpXG4gICAgLy8gY29uc29sZS5sb2coJ1BBUkFNUyBUTyBST1VURSAnLCB7IGRhdGEsIHIsIHVybEFyciwgbG9jYXRpb25TdHIsIHBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24gfSlcblxuICAgIC8vIFRISVMgQ1JFQVRFUyBBIFFVRVJZIFBBVEggU1RSXG4gICAgaWYgKHVybFR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVF1ZXJ5U3RyaW5nKHVybEFycilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTbGFzaFN0cmluZyh1cmxBcnIpXG4gIH1cblxuICBzdGF0aWMgZmluZEluZGV4T2ZNYXRjaGVkU3RyaW5nT3JSZWdleChtYWluU3RyLCBwYXJhbXNBcnIpIHtcbiAgICBjb25zdCBpczQwNCA9IHBhcmFtc0Fyci5pbmNsdWRlcygnLisnKVxuXG4gICAgY29uc3QgcmVGbiA9IChzKSA9PiB7XG4gICAgICBpZiAoaXM0MDQpIHtcbiAgICAgICAgaWYgKCFzLnN0YXJ0c1dpdGgoJ14nKSkge1xuICAgICAgICAgIHMgPSAnXicgKyBzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzLmVuZHNXaXRoKCckJykpIHtcbiAgICAgICAgICBzID0gcyArICckJ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHMpXG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tGb3JFbXB0eSA9ICByZXBsYWNlKC9eJC8sICdeJCcpXG4gICAgY29uc3QgY3JlYXRlU3RyUmVnZXhUZXN0ID0gKHN0cikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RyLFxuICAgICAgICByZTogcmVGbihzdHIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2ggPSAgZWl0aGVyKFxuICAgICAgcHJvcEVxKG1haW5TdHIsICdzdHInKSwgY29tcG9zZSh0ZXN0KF9fLCBtYWluU3RyKSwgcHJvcCgncmUnKSlcbiAgICApXG5cbiAgICBjb25zdCBmaW5kTWF0Y2hJbmRleCA9IGNvbXBvc2UoZmluZExhc3RJbmRleChlcXVhbHModHJ1ZSkpLCBtYXAoY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2gpLCBtYXAoY3JlYXRlU3RyUmVnZXhUZXN0KSwgbWFwKGNoZWNrRm9yRW1wdHkpKVxuXG4gICAgcmV0dXJuIGZpbmRNYXRjaEluZGV4KHBhcmFtc0FycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKG9iaiwgc3RyLCByZWdleFRva2Vucykge1xuICAgIC8vXG4gICAgLy9cbiAgICAvLyAgICAgICBUSElTIElTIEEgVkVSWSBJTVBPUlRBTlQgTUVUSE9EXG4gICAgLy8gICAgICAgSVQgQ09NUEFSRVMgVEhFIFNUUklORyBUTyBCRSBNQVRDSEVEIFdJVEggVEhFIFJPVVRFIFBBVEggT0JKRUNUXG4gICAgLy8gICAgICAgQU5EIElUIFdJTEwgUkVUVVJOIE9ORSBPRiBUSFJFRSBUSElOR1NcbiAgICAvLyAgICAgICAxLiBUSEUgU1RSSU5HIElUU0VMRlxuICAgIC8vICAgICAgIDIuIEEgTUFUQ0hJTkcgS0VZIEZST00gVEhFIENVUlJFTlQgT0JKRUNUXG4gICAgLy8gICAgICAgMy4gVEhFIFJPVVRFTkFNRVxuICAgIC8vXG5cbiAgICAvLyBHTyBUSFJPVUdIIEtFWVMgQU5EIENIRUNLIElGIFJFR0VYIE1BVENIRVNcblxuICAgIC8vIEdPIFRIUk9VR0ggUk9VVEUgQ09ORklHIFRPIEZJR1VSRSBPVVQgSUYgVkFMIE9SIEtFWSBTSE9VTEQgQkUgQ09NUEFSRURcbiAgICAvLyBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LCBjaG9vc2UgdGhlIGtleSBvZiB0aGUgcm91dGUgcGF0aCB0byBjaGVjayBhZ2FpbnN0XG4gICAgY29uc3QgZ2V0VmFsQ29tcGFyZUFyciA9IGNvbXBvc2UobWFwKGxhc3QpLCBtYXAoZmlsdGVyKGlzKFN0cmluZykpKSwgdG9QYWlycylcblxuICAgIC8vIENSRUFURSBUSEUgQVJSQVkgT0YgRUlUSEVSIFZBTFMgT1IgS0VZU1xuICAgIGNvbnN0IHBhcmFtc0FyciA9IGdldFZhbENvbXBhcmVBcnIob2JqKVxuXG4gICAgLy8gUkVTVUxUUyBGUk9NIFBBUkFNIENIRUNLXG4gICAgLy8gbGV0IHBhcmFtSW5kZXggPSBjaGVja0ZvclBhcmFtc01hdGNoKHBhcmFtc0Fycik7XG5cbiAgICBjb25zdCBwYXJhbUluZGV4ID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5maW5kSW5kZXhPZk1hdGNoZWRTdHJpbmdPclJlZ2V4KHN0ciwgcGFyYW1zQXJyKVxuXG4gICAgLy8gREVGQVVMVCBWQUwgRk9SIFNUUklOR1xuICAgIGxldCBwYXJhbVN0ciA9IHN0clxuXG4gICAgLy8gTEVHQUNZIE1FVEhPRCAtLSBUVVJOIE9GRlxuICAgIC8vIFdIRU4gVEhFUkUgSVMgQSBNQVRDSCBGUk9NIFRIRSBDVVJSRU5UIFJPVVRFIFBBVEggT0JKRUNUXG4gICAgaWYgKHBhcmFtSW5kZXggPj0gMCkge1xuICAgICAgY29uc3QgcGFyYW0gPSBwYXJhbXNBcnJbcGFyYW1JbmRleF1cbiAgICAgIGNvbnN0IGludmVydGVkT2JqID0gaW52ZXJ0KG9iailcblxuICAgICAgLy8gUFVMTCBJTlZFUlRFRCBPQkpFQ1QgVE8gU0VFIElGIFNUUiBNQVRDSEVTXG4gICAgICBjb25zdCBnZXRQYXJhbUludmVydGVkID0gY29tcG9zZShoZWFkLCBkZWZhdWx0VG8oW10pLCBwcm9wKHBhcmFtKSlcbiAgICAgIGNvbnN0IHBhcmFtSW52ZXJ0ZWQgPSBnZXRQYXJhbUludmVydGVkKGludmVydGVkT2JqKVxuICAgICAgLy8gc3B5bmUgMTEuMC4xO1xuICAgICAgY29uc3QgcmUgPSAgL14oWy0kXFx3XSopJC9cbiAgICAgIGNvbnN0IGtleU1hdGNoID0gIHJlLnRlc3QocGFyYW1JbnZlcnRlZClcblxuICAgICAgaWYgKGtleU1hdGNoID09PSB0cnVlICYmIGlzKFN0cmluZywgcGFyYW1JbnZlcnRlZCkgPT09IHRydWUpIHtcbiAgICAgICAgcGFyYW1TdHIgPSBwYXJhbUludmVydGVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtU3RyXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQXJyRnJvbVNsYXNoU3RyKHN0cikge1xuICAgIGNvbnN0IHNsYXNoUmUgPSAvXihbL10pPyguKikkL1xuICAgIHJldHVybiBzdHIucmVwbGFjZShzbGFzaFJlLCAnJDInKS5zcGxpdCgnLycpXG4gIH1cblxuICBzdGF0aWMgY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaih0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKSB7XG4gICAgY29uc3Qgcm91dGVWYWx1ZSA9IHN0clxuICAgIGNvbnN0IHZhbHVlc0FyciA9IHRoaXMuY3JlYXRlQXJyRnJvbVNsYXNoU3RyKHN0cilcbiAgICBjb25zdCBwYXRocyA9IFtdXG4gICAgY29uc3Qgcm91dGVkVmFsdWVzQXJyID0gW11cbiAgICBsZXQgbGF0ZXN0T2JqID0gdG9wTGV2ZWxSb3V0ZVxuICAgIGNvbnN0IGNyZWF0ZVBhcmFtc0Zyb21TdHIgPSAodG90YWwsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgcm91dGVWYWx1ZVN0ciA9IHRoaXMuY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbShsYXRlc3RPYmosIGN1cnJlbnRWYWx1ZSwgcmVnZXhUb2tlbnMpXG5cbiAgICAgIGxhdGVzdE9iaiA9IHRoaXMuY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgoY3VycmVudFZhbHVlLCBsYXRlc3RPYmopXG4gICAgICBjb25zdCBwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGggPSAoc3RyKSA9PiBzdHIgIT09IGxhc3QocGF0aHMpXG5cbiAgICAgIGNvbnN0IGlzRW1wdHlPck5pbCA9IGVpdGhlcihpc0VtcHR5LCBpc05pbClcblxuICAgICAgaWYgKGxhdGVzdE9iaiAhPT0gdW5kZWZpbmVkICYmIHByZXZQYXRoTm90RXFDdXJyZW50UGF0aChsYXRlc3RPYmoucm91dGVOYW1lKSAmJiBpc0VtcHR5T3JOaWwocm91dGVWYWx1ZVN0cikgPT09IGZhbHNlKSB7XG4gICAgICAgIHBhdGhzLnB1c2gobGF0ZXN0T2JqLnJvdXRlTmFtZSlcbiAgICAgICAgcm91dGVkVmFsdWVzQXJyLnB1c2gocm91dGVWYWx1ZVN0cilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0clBhdGggPSBbY3VycmVudFZhbHVlLCAncm91dGVQYXRoJ11cbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1QYXRoID0gWydyb3V0ZVBhdGgnXVxuICAgICAgY29uc3Qgb2JqZWN0RnJvbVN0ciA9IHBhdGgoc3RyUGF0aCwgbGF0ZXN0T2JqKVxuICAgICAgY29uc3Qgb2JqZWN0RnJvbVJvdXRlUGFyYW0gPSBwYXRoKHJvdXRlUGFyYW1QYXRoLCBsYXRlc3RPYmopXG5cbiAgICAgIGlmIChvYmplY3RGcm9tU3RyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGF0ZXN0T2JqID0gb2JqZWN0RnJvbVN0clxuICAgICAgfSBlbHNlIGlmIChvYmplY3RGcm9tUm91dGVQYXJhbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxhdGVzdE9iaiA9IG9iamVjdEZyb21Sb3V0ZVBhcmFtXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVkdWNlKGNyZWF0ZVBhcmFtc0Zyb21TdHIsIDAsIHZhbHVlc0FycilcbiAgICBjb25zdCByb3V0ZURhdGEgPSB6aXBPYmoocGF0aHMsIHJvdXRlZFZhbHVlc0FycilcbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gdGhpcy5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfVxuICB9XG5cbiAgc3RhdGljIGdldExhc3RBcnJWYWwoYXJyKSB7XG4gICAgY29uc3QgZ2V0TGFzdFBhcmFtID0gKGEpID0+IGxhc3QoYSkgIT09IHVuZGVmaW5lZCA/IGxhc3QoYSkgOiAnJ1xuICAgIHJldHVybiBnZXRMYXN0UGFyYW0oYXJyKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURlZmF1bHRQYXJhbUZyb21FbXB0eVN0cih0b3BMZXZlbFJvdXRlLCBzdHIpIHtcbiAgICBjb25zdCBvYmogPSB7fVxuICAgIGNvbnN0IGtleXdvcmQgPSB0b3BMZXZlbFJvdXRlLnJvdXRlTmFtZVxuICAgIG9ialtrZXl3b3JkXSA9IHRoaXMuY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbSh0b3BMZXZlbFJvdXRlLCBzdHIpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRRdWVyeVN0clRvUGFyYW1zKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpIHtcbiAgICBjb25zdCBxdWVyeVJlID0gL14oWz9dKT8oLiopJC9cbiAgICBjb25zdCByb3V0ZVZhbHVlID0gc3RyXG4gICAgY29uc3Qgc3RyQXJyID0gc3RyLnJlcGxhY2UocXVlcnlSZSwgJyQyJylcbiAgICBjb25zdCBjb252ZXJ0VG9QYXJhbXMgPSBjb21wb3NlKG1hcChzcGxpdCgnPScpKSwgc3BsaXQoJyYnKSlcbiAgICBjb25zdCBwYXJhbXNBcnIgPSBjb252ZXJ0VG9QYXJhbXMoc3RyQXJyKVxuICAgIGxldCByb3V0ZURhdGEgPSBmcm9tUGFpcnMocGFyYW1zQXJyKVxuXG4gICAgbGV0IHBhdGhzID0gbWFwKGhlYWQsIHBhcmFtc0FycilcblxuICAgIGlmIChpc0VtcHR5KHN0cikgPT09IHRydWUpIHtcbiAgICAgIHJvdXRlRGF0YSA9IHRoaXMuY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpXG4gICAgICBwYXRocyA9IGtleXMocm91dGVEYXRhKVxuICAgIH1cbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gdGhpcy5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9XG4gIH1cblxuICBzdGF0aWMgY29udmVydFJvdXRlVG9QYXJhbXMoc3RyLCByb3V0ZUNvbmZpZywgdCkge1xuICAgIGNvbnN0IGFkZFNsYXNoID0gKHVybCkgPT4gdXJsLnJlcGxhY2UoL1xcLyR8JC8sICcvJylcbiAgICBpZiAocm91dGVDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogcm91dGVDb25maWcudHlwZVxuICAgIGNvbnN0IHJlZ2V4VG9rZW5zID0gZGVmYXVsdFRvKHt9LCBwcm9wKCdyZWdleFRva2VucycsIHJvdXRlQ29uZmlnKSlcbiAgICBjb25zdCB0b3BMZXZlbFJvdXRlID0gcm91dGVDb25maWcucm91dGVzLnJvdXRlUGF0aFxuXG4gICAgaWYgKHR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRRdWVyeVN0clRvUGFyYW1zKHRvcExldmVsUm91dGUsIHN0cilcbiAgICB9XG4gICAgc3RyID0gYWRkU2xhc2goc3RyKVxuXG4gICAgcmV0dXJuIHRoaXMuY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaih0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKVxuICB9XG59XG4iLCJpbXBvcnQgeyBmcm9tRXZlbnRQYXR0ZXJuIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGxhc3QsIGZsYXR0ZW4sIGNsb25lLCBwaWNrLCBwcm9wLCBwaWNrQWxsLCBwYXRoLCBlcXVhbHMsIGNvbXBvc2UsIGtleXMsIGZpbHRlciwgcHJvcEVxLCB1bmlxLCBtYXAsIF9fLCBjaGFpbiwgaXMsIGluY2x1ZGVzLCBmcm9tUGFpcnMsIHJlamVjdCwgbWVyZ2VEZWVwUmlnaHQsIG1lcmdlUmlnaHQsIHRlc3QsIHRvUGFpcnMsIHZhbHVlcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB9IGZyb20gJy4vc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS11cmwuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzIGZvciB0aGUgU3B5bmVSb3V0ZUNoYW5uZWxcbiAgICAgKlxuICAgICAqL1xuICAgIHRoaXMuY3JlYXRlUG9wU3RhdGVTdHJlYW0gPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNyZWF0ZVBvcFN0YXRlU3RyZWFtLmJpbmQodGhpcylcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQb3BTdGF0ZVN0cmVhbShzdWJzY3JpYmVGbikge1xuICAgIGNvbnN0IGFkZEhhbmRsZXIgPSBmdW5jdGlvbihoYW5kbGVyKSB7XG4gICAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGhhbmRsZXJcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbigpIHt9XG4gICAgfVxuICAgIGNvbnN0IHBvcHVwT2JzJCA9IGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlcilcblxuICAgIHBvcHVwT2JzJC5zdWJzY3JpYmUoc3Vic2NyaWJlRm4pXG4gIH1cblxuICBzdGF0aWMgZ2V0TGFzdEFyclZhbChhcnIpIHtcbiAgICBjb25zdCBnZXRMYXN0UGFyYW0gPSAoYSkgPT4gbGFzdChhKSAhPT0gdW5kZWZpbmVkID8gbGFzdChhKSA6ICcnXG4gICAgcmV0dXJuIGdldExhc3RQYXJhbShhcnIpXG4gIH1cblxuICBzdGF0aWMgY29tcGFyZVJvdXRlS2V5d29yZHMob2JqID0ge30sIGFycikge1xuICAgIGNvbnN0IHBpY2tWYWx1ZXMgPSAobywgYSkgPT4gYSAhPT0gdW5kZWZpbmVkID8gcGljayhhLCBvKSA6IG9cbiAgICBsZXQgb2JqMSA9IHBpY2tWYWx1ZXMob2JqLCBhcnIpXG4gICAgcmV0dXJuIHtcbiAgICAgIHBpY2tWYWx1ZXMsXG4gICAgICBjb21wYXJlOiAob2JqID0ge30sIGFycikgPT4ge1xuICAgICAgICBjb25zdCBvYmoyID0gcGlja1ZhbHVlcyhvYmosIGFycilcbiAgICAgICAgY29uc3QgY29tcGFyZVByb3BzID0gcCA9PiB7XG4gICAgICAgICAgY29uc3QgcDEgPSBwcm9wKHAsIG9iajEpXG4gICAgICAgICAgY29uc3QgcDIgPSBwcm9wKHAsIG9iajIpXG4gICAgICAgICAgY29uc3Qgc2FtZSA9IGVxdWFscyhwMSwgcDIpXG4gICAgICAgICAgY29uc3QgcHJldmlvdXNFeGlzdHMgPSBwMSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3QgbmV4dEV4aXN0cyA9IHAyICE9PSB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkID0gIXNhbWVcbiAgICAgICAgICBjb25zdCBhZGRlZCA9IHByZXZpb3VzRXhpc3RzID09PSBmYWxzZSAmJiBuZXh0RXhpc3RzID09PSB0cnVlXG4gICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHByZXZpb3VzRXhpc3RzID09PSB0cnVlICYmIG5leHRFeGlzdHMgPT09IGZhbHNlXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJQOiBcIixwLHtzYW1lLCBwcmV2aW91c0V4aXN0cywgbmV4dEV4aXN0c30pO1xuICAgICAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICAgICAgb2JqW3BdID0geyBzYW1lLCBjaGFuZ2VkLCBhZGRlZCwgcmVtb3ZlZCwgcHJldmlvdXNFeGlzdHMsIG5leHRFeGlzdHMgfVxuICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVByZWQgPSBwID0+IGNvbXBvc2Uoa2V5cywgZmlsdGVyKHByb3BFcSh0cnVlLCBwKSkpXG5cbiAgICAgICAgY29uc3QgZ2V0UHJvcHNTdGF0ZSA9IGNvbXBvc2UobWFwKGNvbXBhcmVQcm9wcyksIHVuaXEsIGNoYWluKGtleXMpKShbb2JqMSwgb2JqMl0pXG4gICAgICAgIGNvbnN0IHBhdGhzQ2hhbmdlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ2NoYW5nZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgY29uc3QgcGF0aHNBZGRlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ2FkZGVkJyksIGdldFByb3BzU3RhdGUpXG4gICAgICAgIGNvbnN0IHBhdGhzUmVtb3ZlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ3JlbW92ZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgb2JqMSA9IG9iajJcbiAgICAgICAgcmV0dXJuIHsgcGF0aHNBZGRlZCwgcGF0aHNSZW1vdmVkLCBwYXRoc0NoYW5nZWQgfVxuICAgICAgfSxcblxuICAgICAgZ2V0Q29tcGFyZXI6ICgpID0+IG9iajFcblxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZUFyckRhdGEocm91dGVBcnIsIHBhcmFtc0Fycikge1xuICAgIGNvbnN0IHBhdGhzID0gIGZpbHRlcihpbmNsdWRlcyhfXywgcm91dGVBcnIpLCBwYXJhbXNBcnIpXG4gICAgY29uc3QgcGF0aElubmVybW9zdCA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuZ2V0TGFzdEFyclZhbChwYXRocylcbiAgICAvLyBjb25zb2xlLmxvZygnYXJyIGFuZCByb3V0ZU5hbWUgJyx7cGF0aHMsIHBhdGhJbm5lcm1vc3R9KTtcbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCB9XG4gIH1cblxuICBzdGF0aWMgZmxhdHRlbkNvbmZpZ09iamVjdChvYmopIHtcbiAgICBjb25zdCBnbyA9IChvYmpfKSA9PiBjaGFpbigoW2ssIHZdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgcmV0dXJuIG1hcCgoW2tfLCB2X10pID0+IFtgJHtrfS4ke2tffWAsIHZfXSwgZ28odikpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW1trLCB2XV1cbiAgICAgIH1cbiAgICB9LCB0b1BhaXJzKG9ial8pKVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJGTEFUVEVOOiBcIiwgdmFsdWVzKGZyb21QYWlycyhnbyhvYmopKSkpO1xuICAgIHJldHVybiB2YWx1ZXMoZnJvbVBhaXJzKGdvKG9iaikpKVxuICB9XG5cbiAgc3RhdGljIGFkZFJvdXRlRGF0YXNldHMoY2hhbm5lbFJvdXRlT2JqKSB7XG4gICAgLy8gY2hhbm5lbFJvdXRlT2JqLnR5cGU9J3F1ZXJ5JztcblxuICAgIGNvbnN0IHsgdHlwZSwgaXNIYXNoIH0gPSBjaGFubmVsUm91dGVPYmpcblxuICAgIC8vIGNyZWF0ZSBocmVmIGFuZCBjaGVjayB0byBzZWUgaWYgbmVlZCB0byBjb252ZXJ0IHRvIGhhc2ggaHJlZiBsaW5rc1xuICAgIGNvbnN0IGdldEhSRUYgPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCBzYW50aXplSFJFRiA9IHN0ciA9PiB7XG4gICAgICAgIGNvbnN0IGhyZWZSRSA9IC9eKC4qXFwvKShbXFx3LV0qXFwvPykoLiopJC9nbVxuICAgICAgICAvLyBjb25zdCBocmVmUkUgPSAvXiguKlxcLykoW1xcdy1dKikoLiopJC9nbTtcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoaHJlZlJFLCAnJDEkMicpXG4gICAgICAgIC8vIHN0ciA9IFN0cmluZyhzdHIpLnJlcGxhY2UoJ14kJywgXCJcIik7XG4gICAgICAgIHJldHVybiBzdHJcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGVhZFN0clZhbCA9IHR5cGUgPT09ICdxdWVyeScgPyAnJyA6IGlzSGFzaCA9PT0gdHJ1ZSA/ICcjJyA6ICcvJ1xuICAgICAgY29uc3QgaHJlZlN0ciA9ICBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRQYXJhbXNUb1JvdXRlKG9iaiwgY2hhbm5lbFJvdXRlT2JqKVxuICAgICAgcmV0dXJuIGhlYWRTdHJWYWwgKyBzYW50aXplSFJFRihocmVmU3RyKVxuICAgIH1cblxuICAgIC8vIHJlbW92ZSBzcGVjaWFsIGNoYXJzIGZyb20gaHJlZlxuICAgIGNvbnN0IHNhbml0aXplU3RyID0gKHN0cikgPT4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFteQS1aYS16MC05LV9dKS9nLCAnJylcblxuICAgIC8vIHRlc3Qgd2hldGhlciB0byB1c2Uga2V5IG9yIHZhbFxuICAgIGNvbnN0IGlzVmFsaWRTdHJSRSA9IC9eKFtBLVphLXowLTlfLV0pKyQvbVxuXG4gICAgY29uc3QgY3JlYXRlSW5pdGlhbFZhbEZuID0gKGFjY01haW4gPSBbXSwgcm91dGVQYXRoT2JqLCBvYmpBY2MgPSB7fSkgPT4ge1xuICAgICAgbGV0IHsgcm91dGVOYW1lIH0gPSByb3V0ZVBhdGhPYmpcblxuICAgICAgY29uc3QgcHJvcHNSZWR1Y2VyID0gKGFjYywgYXJyUGFpcikgPT4ge1xuICAgICAgICBjb25zdCBba2V5LCB2YWxdID0gYXJyUGFpclxuICAgICAgICBjb25zdCBpc09iamVjdCA9IGlzKE9iamVjdCwgdmFsKVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVRpdGxlID0gKHN0cikgPT4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFstX10pL2csICcgJykudG9VcHBlckNhc2UoKVxuXG4gICAgICAgIGNvbnN0IGdldExpbmtUZXh0ID0gc3RyID0+IHRlc3QoaXNWYWxpZFN0clJFLCBzdHIpID8gY3JlYXRlVGl0bGUoc3RyKSA6IGtleVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdyb3V0ZU5hbWUnIHx8IGtleSA9PT0gJzQwNCcpIHtcbiAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgIH1cblxuICAgICAgICByb3V0ZU5hbWUgPSByb3V0ZU5hbWUgfHwgcHJvcCgncm91dGVOYW1lJywgdmFsKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRIRSBLRVkgSVMgXCIse2tleSx2YWwscm91dGVOYW1lfSlcblxuICAgICAgICBsZXQgbyA9IGNsb25lKG9iakFjYylcbiAgICAgICAgb1tyb3V0ZU5hbWVdID0gc2FuaXRpemVTdHIoa2V5KVxuXG4gICAgICAgIGlmIChpc09iamVjdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGlmIChrZXlzKG8pLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViUm91dGVOYW1lID0gcGF0aChbJ3JvdXRlUGF0aCcsICdyb3V0ZU5hbWUnXSwgdmFsKVxuICAgICAgICAgICAgaWYgKHN1YlJvdXRlTmFtZSkge1xuICAgICAgICAgICAgICBjb25zdCBvQmFzZSA9IGNsb25lKG8pXG4gICAgICAgICAgICAgIG9CYXNlW3N1YlJvdXRlTmFtZV0gPSAnJ1xuICAgICAgICAgICAgICBvQmFzZS5uYXZMZXZlbCA9IGtleXMob2JqQWNjKS5sZW5ndGhcbiAgICAgICAgICAgICAgb0Jhc2UudGl0bGUgPSBnZXRMaW5rVGV4dChrZXkpXG4gICAgICAgICAgICAgIG9CYXNlLmhyZWYgPSBnZXRIUkVGKG9CYXNlKVxuICAgICAgICAgICAgICBhY2MucHVzaChvQmFzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbyA9IGNyZWF0ZUluaXRpYWxWYWxGbihhY2NNYWluLCB2YWwsIG8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgby50aXRsZSA9IGdldExpbmtUZXh0KGtleSlcbiAgICAgICAgICBvLmhyZWYgPSBnZXRIUkVGKG8pXG4gICAgICAgIH1cbiAgICAgICAgby5uYXZMZXZlbCA9IGtleXMob2JqQWNjKS5sZW5ndGhcbiAgICAgICAgYWNjLnB1c2gobylcbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9QYWlycyhyb3V0ZVBhdGhPYmopLnJlZHVjZShwcm9wc1JlZHVjZXIsIFtdKVxuICAgIH1cblxuICAgIGNvbnN0IHJlZHVjZWRBcnIgPSBjcmVhdGVJbml0aWFsVmFsRm4oW10sIGNoYW5uZWxSb3V0ZU9iai5yb3V0ZXMpXG4gICAgY29uc3Qgcm91dGVEYXRhc2V0c0FyciA9IGZsYXR0ZW4ocmVkdWNlZEFycilcblxuICAgIGNvbnN0IGdldE5hdlByb3BzID0gKGRhdGFzZXRzQXJyKSA9PiB7XG4gICAgICBjb25zdCBleGNsdWRlID0gcmVqZWN0KGluY2x1ZGVzKF9fLCBbJ3RpdGxlJywgJ2hyZWYnLCAnbmF2TGV2ZWwnXSkpXG4gICAgICBjb25zdCBnZXRNYWluS2V5cyA9IGNvbXBvc2UodW5pcSwgZXhjbHVkZSwgZmxhdHRlbiwgbWFwKGtleXMpKVxuICAgICAgcmV0dXJuIGdldE1haW5LZXlzKGRhdGFzZXRzQXJyKVxuICAgIH1cbiAgICBjb25zdCByb3V0ZU5hbWVzQXJyID0gZ2V0TmF2UHJvcHMocm91dGVEYXRhc2V0c0FycilcblxuICAgIHJldHVybiB7IHJvdXRlRGF0YXNldHNBcnIsIHJvdXRlTmFtZXNBcnIgfVxuICB9XG5cbiAgc3RhdGljIGNvbmZvcm1Sb3V0ZU9iamVjdChjaGFubmVsUm91dGVPYmogPSB7fSwgYWRkNDA0UHJvcHMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGNoYW5uZWxzUm91dGVQYXRoID0gcGF0aChbJ2NoYW5uZWxzJywgJ1JPVVRFJ10sIGNoYW5uZWxSb3V0ZU9iailcbiAgICBsZXQgeyBhZGQ0MDRzIH0gPSBjaGFubmVsc1JvdXRlUGF0aCAhPT0gdW5kZWZpbmVkID8gY2hhbm5lbHNSb3V0ZVBhdGggOiBjaGFubmVsUm91dGVPYmpcbiAgICBhZGQ0MDRzID0gYWRkNDA0cyB8fCBhZGQ0MDRQcm9wc1xuICAgIGNvbnN0IHBhcnNlUm91dGVQYXRoID0gKGEpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IGFbMV1cbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGlmICh2YWwgPT09ICcnKSB7XG4gICAgICAgIGFbMV0gPSAnXiQnXG4gICAgICB9IGVsc2UgaWYgKGlzQXJyKSB7XG4gICAgICAgIGFbMV0gPSB2YWwuam9pbignfCcpXG4gICAgICB9XG4gICAgICByZXR1cm4gYVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zZHVjZUNvbmZpZyA9IChhcnIpID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJcbiAgICAgIGNvbnN0IG9iajQwNCA9IGFkZDQwNHMgPyB7IDQwNDogJy4rJyB9IDoge31cbiAgICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0LCB2YWwpXG4gICAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5LCB2YWwpXG4gICAgICBjb25zdCBpdGVyT2JqID0gaXNPYmogPT09IHRydWUgJiYgaXNBcnIgPT09IGZhbHNlXG4gICAgICBjb25zdCBpc1JvdXRlUGF0aCA9IGtleSA9PT0gJ3JvdXRlUGF0aCdcbiAgICAgIGlmIChpdGVyT2JqKSB7XG4gICAgICAgIGFyclsxXSA9IGNvbmZpZ01hcHBlckZuKGFyclsxXSlcbiAgICAgICAgaWYgKGlzUm91dGVQYXRoKSB7XG4gICAgICAgICAgYXJyWzFdID0gY29tcG9zZShtZXJnZURlZXBSaWdodChvYmo0MDQpLCBmcm9tUGFpcnMsIG1hcChwYXJzZVJvdXRlUGF0aCksIHRvUGFpcnMpKGFyclsxXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyclxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ01hcHBlckZuID0gY29tcG9zZShmcm9tUGFpcnMsIG1hcCh0cmFuc2R1Y2VDb25maWcpLCB0b1BhaXJzKVxuXG4gICAgaWYgKGNoYW5uZWxzUm91dGVQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSA9IGNvbmZpZ01hcHBlckZuKGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSlcbiAgICAgIGNvbnN0IGV4dHJhUm91dGVEYXRhID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5hZGRSb3V0ZURhdGFzZXRzKGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSlcbiAgICAgIGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSA9IG1lcmdlUmlnaHQoY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFLCBleHRyYVJvdXRlRGF0YSlcbiAgICAgIHJldHVybiBjaGFubmVsUm91dGVPYmpcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnTWFwcGVyRm4oY2hhbm5lbFJvdXRlT2JqKVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbUV2ZW50UGF0dGVybiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IG1hcE9iakluZGV4ZWQgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsV2luZG93IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3dcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcyBmb3IgU3B5bmVXaW5kb3dDaGFubmVsXG4gICAqXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQgPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50LmJpbmQoXG4gICAgICB0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoZXZlbnROYW1lLCBtYXBGbiwgaXNQYXNzaXZlID0gdHJ1ZSwgZWxlbWVudCA9IHdpbmRvdykge1xuICAgIGNvbnN0IGFkZEhhbmRsZXIgPSBoYW5kbGVyID0+IGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIsXG4gICAgICB7IHBhc3NpdmU6IGlzUGFzc2l2ZSB9KVxuICAgIGNvbnN0IHJlbW92ZUhhbmRsZXIgPSAoKSA9PiB7IGVsZW1lbnRbZXZlbnROYW1lXSA9IChwKSA9PiBwIH1cbiAgICBtYXBGbiA9IG1hcEZuID09PSB1bmRlZmluZWQgPyAocCkgPT4gcCA6IG1hcEZuXG4gICAgcmV0dXJuIGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlcikucGlwZShtYXAobWFwRm4pKVxuICB9XG5cbiAgLy8gTUVESUEgUVVFUklFU1xuICBzdGF0aWMgY3JlYXRlTWVkaWFRdWVyeShzdHIpIHtcbiAgICBjb25zdCBtcSA9IHdpbmRvdy5tYXRjaE1lZGlhKHN0cilcbiAgICB0aGlzLmNoZWNrSWZWYWxpZE1lZGlhUXVlcnkobXEsIHN0cilcbiAgICByZXR1cm4gbXEgIT09IGZhbHNlID8gbXEgOiBmYWxzZVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZWYWxpZE1lZGlhUXVlcnkobXEsIHN0cikge1xuICAgIGNvbnN0IG5vU3BhY2VzID0gc3RyID0+IHN0ci5yZXBsYWNlKC9cXHMrL2dtLCAnJylcbiAgICBjb25zdCBpc1ZhbGlkQm9vbCA9IG1xLm1hdGNoZXMgIT09IHVuZGVmaW5lZCAmJiBub1NwYWNlcyhtcS5tZWRpYSkuaW5kZXhPZihub1NwYWNlcyhzdHIpKSA+PSAwXG4gICAgY29uc3Qgd2Fybk1zZyA9IHN0ciA9PiBjb25zb2xlLndhcm4oYFNweW5lIEluZm86IHRoZSBmb2xsb3dpbmcgcXVlcnkgc3RyaW5nLCBcIiR7c3RyfVwiLCBoYXMgYmVlbiBvcHRpbWl6ZWQgdG8gXCIke21xLm1lZGlhfVwiIGJ5IHRoZSBicm93c2VyIGFuZCBtYXkgbm90IGJlIGEgdmFsaWQgTWVkaWEgUXVlcnkgaXRlbSFgKVxuICAgIGlmIChpc1ZhbGlkQm9vbCA9PT0gZmFsc2UpIHtcbiAgICAgIHdhcm5Nc2coc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZEJvb2xcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlcihxdWVyeSwga2V5KSB7XG4gICAgY29uc3Qga2V5Rm4gPSBrZXkgPT4gcCA9PiB7XG4gICAgICBwLm1lZGlhUXVlcnlOYW1lID0ga2V5XG4gICAgICByZXR1cm4gcFxuICAgIH1cblxuICAgIGNvbnN0IG1hcEtleSA9IGtleUZuKGtleSlcblxuICAgIGNvbnN0IGhhbmRsZXJzID0gKHEpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZEhhbmRsZXI6IChoYW5kbGVyKSA9PiB7IHEuYWRkTGlzdGVuZXIoaGFuZGxlcikgfSxcbiAgICAgICAgcmVtb3ZlSGFuZGxlcjogKGhhbmRsZXIpID0+IHsgcS5vbmNoYW5nZSA9ICgpID0+IHt9IH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbWVkaWFRdWVyeUhhbmRsZXIgPSBoYW5kbGVycyhxdWVyeSlcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG4gICAgcmV0dXJuIG5ldyBmcm9tRXZlbnRQYXR0ZXJuKFxuICAgICAgbWVkaWFRdWVyeUhhbmRsZXIuYWRkSGFuZGxlcixcbiAgICAgIG1lZGlhUXVlcnlIYW5kbGVyLnJlbW92ZUhhbmRsZXIpXG4gICAgICAucGlwZShtYXAobWFwS2V5KSlcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZXJnZWRPYnNGcm9tT2JqKGNvbmZpZykge1xuICAgIGNvbnN0IG1lZGlhUXVlcmllc09iaiA9IGNvbmZpZy5tZWRpYVF1ZXJpZXMgfHwgY29uZmlnLm1lZGlhUXVlcmllc1xuICAgIGNvbnN0IGFyciA9IFtdXG5cbiAgICBjb25zdCBsb29wUXVlcmllcyA9ICh2YWwsIGtleSwgb2JqKSA9PiB7XG4gICAgICBjb25zdCBtcSA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lZGlhUXVlcnkodmFsKVxuICAgICAgaWYgKG1xICE9PSBmYWxzZSkge1xuICAgICAgICBhcnIucHVzaChTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlcihtcSwga2V5KSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJcbiAgICB9XG5cbiAgICBtYXBPYmpJbmRleGVkKGxvb3BRdWVyaWVzLCBtZWRpYVF1ZXJpZXNPYmopXG4gICAgcmV0dXJuIGFyclxuICB9XG59XG4iLCJjb25zdCBjcmVhdGVGYWRlcklubGluZVRleHQgPSAoaXNJbkJvb2wgPSBmYWxzZSwgdCA9IDEsIGUgPSAnZWFzZScsIHN0YXJ0WmVyb0Jvb2wgPSBmYWxzZSkgPT4ge1xuICBjb25zdCBpbml0T3BhY2l0eVplcm8gPSBzdGFydFplcm9Cb29sID09PSB0cnVlID8gJ29wYWNpdHk6MDsnIDogJydcbiAgY29uc3Qgb3BhY2l0eSA9IGlzSW5Cb29sID09PSB0cnVlID8gMSA6IDBcbiAgcmV0dXJuIGAke2luaXRPcGFjaXR5WmVyb310cmFuc2l0aW9uOiBvcGFjaXR5ICR7dH1zICR7ZX07IG9wYWNpdHk6ICR7b3BhY2l0eX07YFxufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVpbihlbCwgdCkge1xuICBjb25zdCBjdXJyZW50T3BhY2l0eSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5vcGFjaXR5ICogMVxuICBjb25zdCBzdGFydEF0WmVybyA9IGN1cnJlbnRPcGFjaXR5ID09PSAxXG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dCh0cnVlLCB0LCAnZWFzZScsIHN0YXJ0QXRaZXJvKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVvdXQoZWwsIHQsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dChmYWxzZSwgdCwgJ2Vhc2UnKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xuXG4gIC8vIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCB0ICogMTAwMCk7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBjYWxsYmFjaywgZmFsc2UpXG59XG4iLCJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBmbGlwLCBtZXJnZVJpZ2h0LCBjbG9uZSwgZm9yRWFjaCwgcHJvcFNhdGlzZmllcyB9IGZyb20gJ3JhbWRhJ1xuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1PYnNlcnZhYmxlIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1PYnNlcnZhYmxlXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgb2JzZXJ2YWJsZSB0aGF0IGNyZWF0ZXMgdGhlIFZpZXdTdHJlYW0gT2JzZXJ2YWJsZSB0aGF0IGJyYW5jaGVzIG91dCB0byBwYXJlbnQsIGludGVybmFsIGFuZCBjaGlsZCBkaXJlY3Rpb25zXG4gICAgICovXG4gICAgdGhpcy5wcm9wcy5vYnNlcnZhYmxlU3RyZWFtcyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsT2JzZXJ2YWJsZXMoKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpIHtcbiAgICBjb25zdCBkaXJJbnRlcm5hbCA9ICdpbnRlcm5hbCdcbiAgICBjb25zdCBkaXJQYXJlbnQgPSAncGFyZW50J1xuICAgIGNvbnN0IGRpckNoaWxkID0gJ2NoaWxkJ1xuICAgIHJldHVybiB7XG4gICAgICBQOiBbZGlyUGFyZW50XSxcbiAgICAgIEM6IFtkaXJDaGlsZF0sXG4gICAgICBQQ0k6IFtkaXJQYXJlbnQsIGRpckludGVybmFsLCBkaXJDaGlsZF0sXG4gICAgICBDSTogW2RpckNoaWxkLCBkaXJJbnRlcm5hbF0sXG4gICAgICBQSTogW2RpclBhcmVudCwgZGlySW50ZXJuYWxdLFxuICAgICAgUEM6IFtkaXJQYXJlbnQsIGRpckNoaWxkXVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhZGREZWZhdWx0RGlyKG9iaikge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyh7ICRkaXI6WydpbnRlcm5hbCddIH0sIGNsb25lKG9iaikpXG4gIH1cblxuICBzdGF0aWMgYWRkRG93bkludGVybmFsRGlyKG9iaiwgYXJyID0gWydpbnRlcm5hbCcsICdkb3duJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IGZsaXAobWVyZ2VSaWdodClcbiAgICByZXR1cm4gZGVmYXVsdHMoY2xvbmUob2JqKSwgeyAkZGlyOmFyciB9KVxuICB9XG5cbiAgc3RhdGljIGFkZENoaWxkQW5kSW50ZXJuYWxEaXIob2JqLCBhcnIgPSBbJ2NoaWxkJywgJ2Rvd24nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyhjbG9uZShvYmopLCB7ICRkaXI6YXJyIH0pXG4gIH1cblxuICBzdGF0aWMgbWFwVG9EZWZhdWx0RGlyKHApIHtcbiAgICByZXR1cm4gdGhpcy5hZGREZWZhdWx0RGlyKHApXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyhvYnMkID0gbmV3IFN1YmplY3QoKSwgdmlld05hbWUsIHZzaWQpIHtcbiAgICBpZiAodmlld05hbWUgIT09IHVuZGVmaW5lZCAmJiB2c2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9icyQudmlld05hbWUgPSB2aWV3TmFtZVxuICAgICAgb2JzJC52c2lkID0gdnNpZFxuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlclN0cmVhbXMgPSB2YWwgPT4gcHJvcFNhdGlzZmllcyhhcnJUeXBlID0+IGFyclR5cGUuaW5jbHVkZXModmFsKSwgJyRkaXInKVxuICAgIGNvbnN0IGZpbHRlclBhcmVudCA9IGZpbHRlclN0cmVhbXMoJ3BhcmVudCcpXG4gICAgY29uc3QgZmlsdGVyQ2hpbGQgPSBmaWx0ZXJTdHJlYW1zKCdjaGlsZCcpXG4gICAgY29uc3QgZmlsdGVySW50ZXJuYWwgPSBmaWx0ZXJTdHJlYW1zKCdpbnRlcm5hbCcpXG5cbiAgICBjb25zdCBhZGRmcm9tJCA9IHJlbFN0ciA9PiBtZXJnZVJpZ2h0KHsgZnJvbSQ6cmVsU3RyIH0pXG4gICAgY29uc3QgYWRkUGFyZW50ZnJvbSQgPSBhZGRmcm9tJCgnY2hpbGQnKVxuICAgIGNvbnN0IGFkZEludGVybmFsZnJvbSQgPSBhZGRmcm9tJCgnaW50ZXJuYWwnKVxuICAgIGNvbnN0IGFkZENoaWxkZnJvbSQgPSBhZGRmcm9tJCgncGFyZW50JylcblxuICAgIGNvbnN0IHJhdyQgPSAgb2JzJFxuICAgICAgLnBpcGUoZmlsdGVyKChwYXlsb2FkKSA9PiBwYXlsb2FkICE9PSB1bmRlZmluZWQgJiYgcGF5bG9hZC5hY3Rpb24gIT09IHVuZGVmaW5lZCkpXG5cbiAgICBjb25zdCB0b0ludGVybmFsJCA9IG9icyQucGlwZShmaWx0ZXIoZmlsdGVySW50ZXJuYWwpLCBtYXAoYWRkSW50ZXJuYWxmcm9tJCkpXG4gICAgY29uc3QgdG9QYXJlbnQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJQYXJlbnQpLCBtYXAoYWRkUGFyZW50ZnJvbSQpKVxuICAgIGNvbnN0IHRvQ2hpbGQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJDaGlsZCksIG1hcChhZGRDaGlsZGZyb20kKSlcblxuICAgIGNvbnN0IHN0cmVhbU9iaiA9IHtcbiAgICAgIHBhcmVudDogdG9QYXJlbnQkLFxuICAgICAgaW50ZXJuYWw6IHRvSW50ZXJuYWwkLFxuICAgICAgY2hpbGQ6IHRvQ2hpbGQkXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSAoYXJyID0gW10pID0+IHtcbiAgICAgIGNvbnN0IGVuZFN0cmVhbSA9IG8gPT4ge1xuICAgICAgICBvLmNvbXBsZXRlKClcbiAgICAgICAgby5pc1N0b3BwZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNldENvbXBsZXRlU3RyZWFtID0gKHN0cikgPT4ge1xuICAgICAgICBpZiAoc3RyZWFtT2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IG9icyQgPSBzdHJlYW1PYmpbc3RyXVxuICAgICAgICAgIGVuZFN0cmVhbShvYnMkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhcnIgIT09IHVuZGVmaW5lZCAmJiBhcnIubGVuZ3RoID49IDEpIHtcbiAgICAgICAgYXJyLmZvckVhY2goc2V0Q29tcGxldGVTdHJlYW0pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbXBsZXRlQWxsID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSBvID0+IHtcbiAgICAgICAgby5jb21wbGV0ZSgpXG4gICAgICAgIG8uaXNTdG9wcGVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgZm9yRWFjaChjb21wbGV0ZVN0cmVhbSwgW3JhdyQsIHRvSW50ZXJuYWwkLCB0b1BhcmVudCQsIHRvQ2hpbGQkXSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmF3JCwgdG9JbnRlcm5hbCQsIHRvUGFyZW50JCwgdG9DaGlsZCQsIGNvbXBsZXRlQWxsLCBjb21wbGV0ZVN0cmVhbVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaW5jbHVkZXMsIF9fLCBpZkVsc2UsIHBhdGgsIHByb3AsIHJlamVjdCwgaXMsIGlzTmlsLCBpc0VtcHR5IH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgc2FuaXRpemVIVE1MIGZyb20gJy4uL3V0aWxzL3Nhbml0aXplLWh0bWwuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxuLyoqXG4gKiBAbW9kdWxlIERvbUVsVGVtcGxhdGVcbiAqIEB0eXBlIHV0aWxcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0ZW1wbGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqXG4gKiBAZGVzYyBEb21FbGVtZW50IHVzZXMgdGhpcyBjbGFzcyB3aGVuIHJlbmRlcmluZyB0ZW1wbGF0ZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0PkFjY2Vzc2luZyBwcm9wZXJ0aWVzIHVzaW5nIGEgZG91YmxlIGJyYWNrZXQge3smbmJzcDsmbmJzcDsmbmJzcDt9fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSB7e25hbWU6XCJXb3JsZH19O1xuICogY29uc3QgdGVtcGxhdGUgPSBgPHA+SGVsbG8ge3tuYW1lfX0hPC9wPmA7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvLyBPdXRwdXRzXG4gKiA8cD5IZWxsbyBXb3JsZCE8L3A+XG4gKlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICogVElUTEVbXCI8aDQ+TG9vcGluZyB0aHJvdWdoIGFuIGFuIGFycmF5IG9mIG9iamVjdHMgdXNpbmcgbG9vcCB7eyNsb29wUHJvcGVydHl9fSB7e3Byb3BlcnR5fX0ge3svbG9vcFByb3BlcnR5fX0gZXhwcmVzc2lvbjwvaDQ+XCJdXG4gKiBjb25zdCBkYXRhID0ge2FuaW1hbHM6IFtcbiAqICAge2FuaW1hbDogJ2NhdCcsIHNvdW5kOiAnbWVvdyd9LFxuICogICB7YW5pbWFsOiAnZG9nJywgc291bmQ6ICd3b29mJ30sXG4gKiAgIHthbmltYWw6ICdiaXJkJywgc291bmQ6IHR3ZWV0J31cbiAqIF19O1xuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gYFxuICogPHVsPlxuICoge3sjYW5pbWFsc319XG4gKiAgIDxsaT5UaGUge3thbmltYWx9fSBzYXlzICd7e3NvdW5kfX0nLjwvbGk+XG4gKiB7ey9hbmltYWxzfX1cbiAqIDwvdWw+YDtcbiAqXG4gKiB0aGlzLnByb3BzLmVsLmFwcGVuZENoaWxkKG5ld1xuICogRG9jRWxUZW1wbGF0ZSh0ZW1wbGF0ZSxkYXRhKS5yZW5kZXJEb2NGcmFnKCkpO1xuICpcbiAqIC8vIE91dHB1dHNcbiAqIDx1bD5cbiAqICAgIDxsaT5UaGUgY2F0IHNheXMgJ21lb3cnLjwvbGk+XG4gKiAgICA8bGk+VGhlIGRvZyBzYXlzICd3b29mJy48L2xpPlxuICogICAgPGxpPlRoZSBiaXJkIHNheXMgJ3R3ZWV0Jy48L2xpPlxuICogPC91bD5cbiAqXG4gKlxuICpcbiAqIEBleGFtcGxlXG4gKiBUSVRMRVtcIjxoND5Mb29waW5nIHRocm91Z2ggbGlzdCBpdGVtcyBpbiBhbiBhcnJheSBvZiB1c2luZyB7eyNhcnJOYW1lfX0gJm5ic3A7Jm5ic3A7e3sufX0mbmJzcDsmbmJzcDsge3svYXJyTmFtZX19IGV4cHJlc3Npb248L2g0PlwiXVxuICogY29uc3QgZGF0YSA9ICB7bmFtZTogJ0phbmUnLCBwZXRzOiBbJ01pbG8nLCdMdW5hJywnS2lraSddfTtcbiAqIGNvbnN0IHRlbXBsYXRlID0gXCI8YXJ0aWNsZT5cbiAqICAgICAgICAgICAgICAgICAgPGgzPldlbGNvbWUsIHt7bmFtZX19LCB5b3VyIHBldHMgYXJlOjwvaDM+XG4gKiAgICAgICAgICAgICAgICAgIDx1bD57eyNwZXRzfX1cbiAqICAgICAgICAgICAgICAgICAgICA8bGk+e3sufX0sIDwvbGk+XG4gKiAgICAgICAgICAgICAgICAgICAge3svcGV0c319XG4gKiAgICAgICAgICAgICAgICAgPC91bD48L2FydGljbGU+XCI7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvLyBPdXRwdXRzXG4gKiA8YXJ0aWNsZT5cbiAqICAgPGgzPldlbGNvbWUgSmFuZSwgeW91ciBwZXRzIGFyZTo8L2gzPlxuICogICAgPHVsPlxuICogICAgICAgPGxpPk1pbG88L2xpPlxuICogICAgICAgPGxpPkx1bmE8L2xpPlxuICogICAgICAgPGxpPktpa2k8L2xpPlxuICogICAgPC91bD5cbiAqIDwvYXJ0aWNsZT5cbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0Pkxvb3BpbmcgdGhyb3VnaCBhbiBhcnJheSB3aXRoIG5vIHByb3BlcnR5IG5hbWUgdXNpbmcge3sjfX0gJm5ic3A7Jm5ic3A7e3sgfX0mbmJzcDsmbmJzcDsge3svfX0gZXhwcmVzc2lvbjwvaDQ+XCJdXG4gKiBjb25zdCBkYXRhID0gW1xuICogICAgICB7aXRlbTogJ0Nvb2tpZScsIGNhbG9yaWVzOiAxNDJ9LFxuICogICAgICB7aXRlbTogJ0FwcGxlJywgIGNhbG9yaWVzOiA5NX0sXG4gKiAgICAgIHtpdGVtOiAnQ2hlZXNlJywgY2Fsb3JpZXM6IDExM31dO1xuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gYFxuICogPGFydGljbGU+XG4gKiA8aDM+U25hY2tzOjwvaDM+XG4gKiAgIDx1bD5cbiAqICAgICAge3sjfX1cbiAqICAgICAgPGxpPnt7aXRlbX19LCBjYWxvcmllczoge3tjYWxvcmllc319PC9saT5cbiAqICAgICAge3svfX1cbiAqICAgPC91bD5cbiAqIDwvYXJ0aWNsZT5cbiAqIGA7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvLyBPdXRwdXRzXG4gKiA8YXJ0aWNsZT5cbiAqICAgPGgzPlNuYWNrczwvaDM+XG4gKiAgICA8dWw+XG4gKiAgICAgICA8bGk+Q29va2llLCBjYWxvcmllczogMTQyPC9saT5cbiAqICAgICAgIDxsaT5BcHBsZSwgY2Fsb3JpZXM6IDk1PC9saT5cbiAqICAgICAgIDxsaT5DaGVlc2UsIGNhbG9yaWVzOiAxMTM8L2xpPlxuICogICAgPC91bD5cbiAqIDwvYXJ0aWNsZT5cbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0Pkxvb3BpbmcgdGhyb3VnaCBhbiBhcnJheSB3aXRoIG5vIHByb3BlcnR5IG5hbWUgdXNpbmcge3sjfX0gJm5ic3A7Jm5ic3A7e3sgLiB9fSZuYnNwOyZuYnNwOyB7ey99fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSBbJ1R5cmlvbicsICdBcnlhJywgJ0pvbiBTbm93JywgJ1NhbnNhJ107XG4gKiBjb25zdCB0ZW1wbGF0ZSA9IGBcbiAqIDxoMz5NYWluIEdvVCBDaGFyYWN0ZXJzPC9oMz5cbiAqIDx1bD5cbiAqICB7eyN9fVxuICogICA8bGk+e3sufX08L2xpPlxuICogIHt7L319XG4gKiAgPC91bD4nO1xuICpcbiAqIHRoaXMucHJvcHMuZWwuYXBwZW5kQ2hpbGQobmV3XG4gKiBEb2NFbFRlbXBsYXRlKHRlbXBsYXRlLGRhdGEpLnJlbmRlckRvY0ZyYWcoKSk7XG4gKlxuICogLy9PdXRwdXRzXG4gKiA8aDM+TWFpbiBHb1QgQ2hhcmFjdGVyczwvaDM+XG4gKiA8dWw+XG4gKiAgIDxsaT5UeXJpb248L2xpPlxuICogICA8bGk+QXJ5YTwvbGk+XG4gKiAgIDxsaT5Kb24gU25vdzwvbGk+XG4gKiAgIDxsaT5TYW5zYTwvbGk+XG4gKiA8L3VsPlxuICpcbiAqXG4gKi9cblxuZXhwb3J0IGNsYXNzIERvbUVsZW1lbnRUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlLCBkYXRhID0ge30sIG9wdHMgPSB7fSkge1xuICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLmZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlKVxuICAgIHRoaXMuaXNQcm94eURhdGEgPSBkYXRhLl9fY21zX19pc1Byb3h5ID09PSB0cnVlXG4gICAgdGhpcy50ZXN0TW9kZSA9IG9wdHM/LnRlc3RNb2RlXG5cbiAgICBjb25zdCBjaGVja0ZvckFycmF5RGF0YSA9ICgpID0+IHtcbiAgICAgIGlmIChpcyhBcnJheSwgZGF0YSkgPT09IHRydWUpIHtcbiAgICAgICAgZGF0YSA9IHsgc3B5bmVEYXRhOmRhdGEgfVxuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZS5yZXBsYWNlKCd7ey99fScsICd7ey9zcHluZURhdGF9fScpXG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLnJlcGxhY2UoJ3t7I319JywgJ3t7I3NweW5lRGF0YX19JylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0ZvckFycmF5RGF0YSgpXG5cbiAgICB0aGlzLnRlbXBsYXRlRGF0YSA9IGRhdGFcblxuICAgIGNvbnN0IHN0ckFyciA9IERvbUVsZW1lbnRUZW1wbGF0ZS5nZXRTdHJpbmdBcnJheSh0aGlzLnRlbXBsYXRlKVxuXG4gICAgbGV0IHN0ck1hdGNoZXMgPSB0aGlzLnRlbXBsYXRlLm1hdGNoKERvbUVsZW1lbnRUZW1wbGF0ZS5maW5kVG1wbExvb3BzUkUoKSlcbiAgICBzdHJNYXRjaGVzID0gc3RyTWF0Y2hlcyA9PT0gbnVsbCA/IFtdIDogc3RyTWF0Y2hlc1xuXG4gICAgY29uc3QgcGFyc2VUbXBsTG9vcHNSRSA9IERvbUVsZW1lbnRUZW1wbGF0ZS5wYXJzZVRtcGxMb29wc1JFKClcblxuICAgIGNvbnN0IHBhcnNlVG1wbExvb3BGbiA9ICB0aGlzLnBhcnNlVGhlVG1wbExvb3AuYmluZCh0aGlzKVxuXG4gICAgY29uc3QgbWFwVG1wbExvb3AgPSAoc3RyLCBkYXRhKSA9PiB7XG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UocGFyc2VUbXBsTG9vcHNSRSwgcGFyc2VUbXBsTG9vcEZuKVxuICAgIH1cblxuICAgIGNvbnN0IGZpbmRUbXBsTG9vcHNQcmVkID0gaW5jbHVkZXMoX18sIHN0ck1hdGNoZXMpXG4gICAgY29uc3QgY2hlY2tGb3JNYXRjaGVzID0gaWZFbHNlKFxuICAgICAgZmluZFRtcGxMb29wc1ByZWQsXG4gICAgICBtYXBUbXBsTG9vcCxcbiAgICAgIHRoaXMuYWRkUGFyYW1zLmJpbmQodGhpcykpXG5cbiAgICB0aGlzLmZpbmFsQXJyID0gc3RyQXJyLm1hcChjaGVja0Zvck1hdGNoZXMpXG4gIH1cblxuICBzdGF0aWMgaXNQcmltaXRpdmVUYWcoc3RyKSB7XG4gICAgcmV0dXJuIC8oe3tcXC5cXCo/fX0pLy50ZXN0KHN0cilcbiAgfVxuXG4gIC8vIEZJTkQgQ09SUkVDVCBORVNURUQgREFUQVxuICBzdGF0aWMgZ2V0TmVzdGVkRGF0YVJlZHVjZXIoZGF0YSA9IHt9LCBwYXJhbSA9ICcnKSB7XG4gICAgY29uc3QgZGF0YVJlZHVjZXIgPSAobmVzdGVkRGF0YSwgc3RyKSA9PiB7XG4gICAgICBpZiAobmVzdGVkRGF0YVtzdHJdKSB7XG4gICAgICAgIHJldHVybiBuZXN0ZWREYXRhW3N0cl1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgbmVzdGVkRGF0YSA9PT0gJ3N0cmluZycgPyBuZXN0ZWREYXRhIDogJydcbiAgICB9XG5cbiAgICByZXR1cm4gLyhcXC4pL2dtLnRlc3QoU3RyaW5nKHBhcmFtKSkgPyBTdHJpbmcocGFyYW0pLnNwbGl0KCcuJykucmVkdWNlKGRhdGFSZWR1Y2VyLCBkYXRhKSA6IGRhdGFbcGFyYW1dID8/ICcnXG4gIH1cblxuICBzdGF0aWMgZ2V0U3RyaW5nQXJyYXkodGVtcGxhdGUpIHtcbiAgICBjb25zdCBzdHJBcnIgPSB0ZW1wbGF0ZS5zcGxpdChEb21FbGVtZW50VGVtcGxhdGUuZmluZFRtcGxMb29wc1JFKCkpXG4gICAgY29uc3QgZW1wdHlSRSA9IC9eKFtcXFxcblxcc1xcV10rKSQvXG4gICAgY29uc3QgZmlsdGVyT3V0RW1wdHlTdHJpbmdzID0gcyA9PiBzLm1hdGNoKGVtcHR5UkUpXG4gICAgY29uc3QgZmluYWxTdHIgPSAgcmVqZWN0KGZpbHRlck91dEVtcHR5U3RyaW5ncywgc3RyQXJyKVxuXG4gICAgcmV0dXJuIGZpbmFsU3RyXG4gIH1cblxuICBzdGF0aWMgZmluZFRtcGxMb29wc1JFKCkge1xuICAgIHJldHVybiAvKHt7I1tcXHcuXSt9fVtcXHdcXG5cXHNcXFddKz97e1xcL1tcXHcuXSt9fSkvZ21cbiAgfVxuXG4gIHN0YXRpYyBwYXJzZVRtcGxMb29wc1JFKCkge1xuICAgIHJldHVybiAvKHt7IyhbXFx3Ll0rKX19KShbXFx3XFxuXFxzXFxXXSs/KSh7e1xcL1xcMn19KS9nbVxuICB9XG5cbiAgc3RhdGljIHN3YXBQYXJhbXNGb3JUYWdzUkUoKSB7XG4gICAgcmV0dXJuIC8oe3spKC4qPykofX0pL2dtXG4gIH1cblxuICByZW1vdmVUaGlzKCkge1xuICAgIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZmluYWxBcnIgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudGVtcGxhdGVEYXRhID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjIFJldHVybnMgYSBkb2N1bWVudCBmcmFnbWVudCBnZW5lcmF0ZWQgZnJvbSB0aGUgdGVtcGxhdGUgYW5kIGFueSBhZGRlZCBkYXRhLlxuICAgKi9cblxuICByZW5kZXJEb2NGcmFnKCkge1xuICAgIGxldCBodG1sID0gRG9tRWxlbWVudFRlbXBsYXRlLnJlcGxhY2VJbWdQYXRoKHRoaXMuZmluYWxBcnIuam9pbignJykpXG4gICAgLy8gaHRtbCA9IHNhbml0aXplSFRNTCh0aGlzLmZpbmFsQXJyLmpvaW4oJycpKVxuICAgIGlmICh0aGlzLnRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBodG1sID0gc2FuaXRpemVIVE1MKGh0bWwpXG4gICAgfVxuICAgIGNvbnN0IGlzVGFibGVTdWJUYWcgPSAgIC9eKFtePl0qPykoPCl7MX0oXFxiKSh0aGVhZHxjb2x8Y29sZ3JvdXB8dGJvZHl8dGR8dGZvb3R8dHJ8dGgpKFxcYikoW15cXDBdKikkLy50ZXN0KGh0bWwpXG4gICAgY29uc3QgZWwgPSBpc1RhYmxlU3ViVGFnID8gaHRtbCA6IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwpXG5cbiAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJlbW92ZVRoaXMsIDIpXG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICByZW5kZXJUb1N0cmluZygpIHtcbiAgICBsZXQgaHRtbCA9IHRoaXMuZmluYWxBcnIuam9pbignJylcbiAgICBodG1sID0gRG9tRWxlbWVudFRlbXBsYXRlLnJlcGxhY2VJbWdQYXRoKGh0bWwpXG4gICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5yZW1vdmVUaGlzLCAyKVxuICAgIHJldHVybiBodG1sXG4gIH1cblxuICBnZXRUZW1wbGF0ZVN0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbEFyci5qb2luKCcnKVxuICB9XG5cbiAgZm9ybWF0VGVtcGxhdGUodGVtcGxhdGUpIHtcbiAgICByZXR1cm4gWydTQ1JJUFQnLCAnVEVNUExBVEUnXS5pbmNsdWRlcyhwcm9wKCdub2RlTmFtZScsIHRlbXBsYXRlKSkgPT09IHRydWUgPyB0ZW1wbGF0ZS5pbm5lckhUTUwgOiB0ZW1wbGF0ZVxuICB9XG5cbiAgZ2V0RGF0YVZhbEZyb21QYXRoU3RyKHBhdGhTdHIsIGRhdGFGaWxlKSB7XG4gICAgY29uc3QgcGF0aEFyciA9IFN0cmluZyhwYXRoU3RyKS5zcGxpdCgnLicpXG4gICAgY29uc3QgcGF0aERhdGEgPSBwYXRoKHBhdGhBcnIsIGRhdGFGaWxlKVxuICAgIHJldHVybiBwYXRoRGF0YSB8fCAnJ1xuICB9XG5cbiAgYWRkUGFyYW1zKHN0cikge1xuICAgIGNvbnN0IHJlcGxhY2VUYWdzID0gKHN0ciwgcDEsIHAyLCBwMykgPT4ge1xuICAgICAgcmV0dXJuIERvbUVsZW1lbnRUZW1wbGF0ZS5nZXROZXN0ZWREYXRhUmVkdWNlcih0aGlzLnRlbXBsYXRlRGF0YSwgcDIpXG4gICAgfVxuICAgIHJldHVybiBzdHIucmVwbGFjZShEb21FbGVtZW50VGVtcGxhdGUuc3dhcFBhcmFtc0ZvclRhZ3NSRSgpLCByZXBsYWNlVGFncylcbiAgfVxuXG4gIHN0YXRpYyByZXBsYWNlSW1nUGF0aCh0ZW1wbGF0ZVN0cikge1xuICAgIGNvbnN0IHsgSU1HX1BBVEggfSA9IFNweW5lQXBwUHJvcGVydGllc1xuICAgIGlmIChJTUdfUEFUSCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZW1wbGF0ZVN0ciA9IHRlbXBsYXRlU3RyLnJlcGxhY2VBbGwoL3NyY1xccyo9XFxzKihbJ1wiXSlpbWdzXFwvL2csIGBzcmM9JDEke0lNR19QQVRIfWApXG4gICAgICByZXR1cm4gdGVtcGxhdGVTdHIucmVwbGFjZUFsbCgvdXJsXFwoXFxzKihbJ1wiXT8paW1nc1xcLy9nLCBgdXJsKCQxJHtJTUdfUEFUSH1gKVxuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGVTdHJcbiAgfVxuXG4gIHBhcnNlVGhlVG1wbExvb3Aoc3RyLCBwMSwgcDIsIHAzKSB7XG4gICAgLy8gY29uc3QgZG90Q29udmVydGVyID0gc3RyID0+IGAke3N0ci5yZXBsYWNlKC8oXFwuKS9nLCAnXVsnKX1gXG4gICAgY29uc3QgcmVEb3QgPSAvKFxcLikvZ21cbiAgICBjb25zdCBzdWJTdHIgPSBwM1xuXG4gICAgLyogICAgIGNvbnN0IGRhdGFSZWR1Y2VyID0gKGFjYywgc3RyKSA9PiB7XG4gICAgICBhY2MgPSBhY2Nbc3RyXVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0gKi9cblxuICAgIGxldCBlbERhdGEgPSBEb21FbGVtZW50VGVtcGxhdGUuZ2V0TmVzdGVkRGF0YVJlZHVjZXIodGhpcy50ZW1wbGF0ZURhdGEsIHAyKVxuXG4gICAgY29uc3QgYXJyYXlTdHJpbmdUb09iakFkYXB0ZXIgPSAoZCwgc3RyLCBpKSA9PiB7XG4gICAgICAvLyBJRiB7ey59fSBSVU4gcGFyc2VTdHJpbmdcbiAgICAgIGlmIChEb21FbGVtZW50VGVtcGxhdGUuaXNQcmltaXRpdmVUYWcoc3RyKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmcoZCwgc3RyLCBpKVxuICAgICAgfVxuXG4gICAgICAvLyBDUkVBVEUgREFUQSBPQkogLS0gQ0hFQ0sgVE8gQUREIFBST1hZIFZBTFVFU1xuICAgICAgY29uc3QgY3JlYXRlRGF0YU9iaiA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3B5bmVMb29wS2V5ID0gZFxuICAgICAgICBjb25zdCBsb29wSW5kZXggPSBpXG4gICAgICAgIGNvbnN0IGxvb3BOdW0gPSBpICsgMVxuXG4gICAgICAgIGlmICh0aGlzLmlzUHJveHlEYXRhKSB7XG4gICAgICAgICAgY29uc3QgX19jbXNfX2RhdGFJZCA9IGVsRGF0YS5fX2Ntc19fZGF0YUlkXG4gICAgICAgICAgY29uc3Qga2V5SWRTdHIgPSBgX19jbXNfX2tleUZvcl8ke2R9YFxuICAgICAgICAgIGNvbnN0IG9yaWdLZXkgPSBlbERhdGFba2V5SWRTdHJdXG4gICAgICAgICAgcmV0dXJuIHsgc3B5bmVMb29wS2V5LCBfX2Ntc19fZGF0YUlkLCBvcmlnS2V5LCBsb29wSW5kZXgsIGxvb3BOdW0sIGQgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHNweW5lTG9vcEtleSwgbG9vcEluZGV4LCBsb29wTnVtIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlT2JqZWN0KGNyZWF0ZURhdGFPYmooKSwgc3RyLCBpKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlU3RyaW5nID0gKGl0ZW0sIHN0ciwgaW5kZXgsIG9yaWdJbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKERvbUVsZW1lbnRUZW1wbGF0ZS5zd2FwUGFyYW1zRm9yVGFnc1JFKCksIGl0ZW0pXG4gICAgfVxuXG4gICAgLy8gUEFSU0lORyBBUlJBWVMgQU5EIE9CSkVDVFNcbiAgICBjb25zdCBwYXJzZU9iamVjdCA9IChvYmosIHN0ciwgaSkgPT4ge1xuICAgICAgLy8vIExPT1AgTlVNQkVSIFZBTFVFUyBBVVRPIEFEREVEXG5cbiAgICAgIC8vIGNvbnN0IGxvb3BJbmRleCA9IGk7XG4gICAgICAvLyBjb25zdCBsb29wTnVtID0gaSsxO1xuXG4gICAgICBjb25zdCBsb29wT2JqID0gKHN0ciwgcDEsIHAyKSA9PiB7XG4gICAgICAgIC8vIERPVCBTWU5UQVggQ0hFQ0tcbiAgICAgICAgY29uc3QgaGFzaCA9IHtcbiAgICAgICAgICBsb29wSW5kZXg6IGksXG4gICAgICAgICAgbG9vcE51bTogaSArIDFcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElGIHt7Ln19XG4gICAgICAgIGlmIChyZURvdC50ZXN0KHAyKSA9PT0gZmFsc2UgJiYgb2JqW3AyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGhhc2hbcDJdICE9PSB1bmRlZmluZWQgPyBoYXNoW3AyXSA6IG9ialtwMl1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGFSZWR1Y2VkVmFsICA9IHRoaXMuZ2V0RGF0YVZhbEZyb21QYXRoU3RyKHAyLCBvYmopXG4gICAgICAgIHJldHVybiBoYXNoW3AyXSAhPT0gdW5kZWZpbmVkID8gaGFzaFtwMl0gOiBkYXRhUmVkdWNlZFZhbFxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKERvbUVsZW1lbnRUZW1wbGF0ZS5zd2FwUGFyYW1zRm9yVGFnc1JFKCksIGxvb3BPYmopXG4gICAgfVxuXG4gICAgY29uc3QgbWFwU3RyaW5nRGF0YSA9IChkLCBpKSA9PiB0eXBlb2YgKGQpID09PSAnc3RyaW5nJyA/IGFycmF5U3RyaW5nVG9PYmpBZGFwdGVyKGQsIHN1YlN0ciwgaSkgOiBwYXJzZU9iamVjdChkLCBzdWJTdHIsIGkpXG5cbiAgICBpZiAoaXNOaWwoZWxEYXRhKSA9PT0gdHJ1ZSB8fCBpc0VtcHR5KGVsRGF0YSkpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIGlmIChlbERhdGEubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVsRGF0YSA9IFtlbERhdGFdXG4gICAgfVxuXG4gICAgLy8gY29udmVydCB0byBhcnJheSBpZiBpcyBzdHJpbmdcbiAgICBlbERhdGEgPSBBcnJheS5pc0FycmF5KGVsRGF0YSkgPyBlbERhdGEgOiBbZWxEYXRhXVxuXG4gICAgcmV0dXJuIGVsRGF0YS5tYXAobWFwU3RyaW5nRGF0YSkuam9pbignJylcbiAgfVxufVxuIiwiaW1wb3J0IHsgYmFzZUNvcmVNaXhpbnMgfSBmcm9tICcuLi91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucy5qcydcbmltcG9ydCB7IERvbUVsZW1lbnRUZW1wbGF0ZSB9IGZyb20gJy4vZG9tLWVsZW1lbnQtdGVtcGxhdGUuanMnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlLmpzJ1xuaW1wb3J0IHsgaXMsIGRlZmF1bHRUbywgcGljaywgbWFwT2JqSW5kZXhlZCwgZm9yRWFjaE9iakluZGV4ZWQsIHBpcGUgfSBmcm9tICdyYW1kYSdcblxuY2xhc3MgRG9tRWxlbWVudCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIERvbUVsZW1lbnRcbiAgICogQHR5cGUgdXRpbFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGlzIGlzIHRoZSBWaWV3U3RyZWFtIHJlbmRlcmluZyBlbmdpbmUuPC9wPlxuICAgKiA8cD5UaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBwcm9jZXNzIGZvciBjcmVhdGluZyBIVE1MRWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSB0aGUgbG9naWMgYW5kIG92ZXJoZWFkIG9mIGEgVmlld1N0cmVhbSBpbnN0YW5jZS48L3A+XG4gICAqIDxidXR0b24gY2xhc3M9J21vZGFsLWJ0biBidG4gYnRuLWJsdWUtcmVmJyBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS1udW09ODAwIGRhdGEtdmFsdWU9J2F0dHJpYnV0ZXMnPlZpZXcgQXR0cmlidXRlczwvYnV0dG9uPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgdGhlIHRhZ25hbWUgZm9yIHRoaXMgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIGFueSBkb21FbGVtZW50IGF0dHJpYnV0ZSAoZXhjZXB0IGZvciBjbGFzcyApXG4gICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gZGF0YSBzdHJpbmcgZm9yIHRleHQgdGFncyBhbmQganNvbiBmb3IgdGVtcGxhdGVzXG4gICAqIEBwYXJhbSB7dGVtcGxhdGV9IHRlbXBsYXRlXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcm9wcy50YWdOYW1lIC0gPSAnZGl2JzsgRGVmYXVsdCBmb3IgdGFnTmFtZS5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzLmF0dHJpYnV0ZXMgLSA9IHt9OyBUaGlzIGNhbiBiZSBhbnkgdmFsaWQgSFRNTCBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiB0YWdOYW1lLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xPYmplY3R9IHByb3BzLmRhdGEgPSB1bmRlZmluZWQ7IFRoaXMgaXMgZWl0aGVyIGEgU3RyaW5nIGZvciBhbiBlbGVtZW50IG9yIEpTT04gZGF0YSBvYmplY3QgZm9yIGEgdGVtcGxhdGUuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEhUTUx9IHByb3BzLnRlbXBsYXRlID0gdW5kZWZpbmVkOyBJZiBhIHRlbXBsYXRlIGlzIGRlZmluZWQsIHRoZSBEb21FbGVtZW50IHdpbGwgdXNlIGl0LlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9LCB0ZXN0TW9kZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgY2hlY2tEZWZhdWx0ID0gKGRmbHQsIHZhbCkgPT4gZGVmYXVsdFRvKGRmbHQpKHZhbClcblxuICAgIHByb3BzLnRhZ05hbWUgPSBjaGVja0RlZmF1bHQoJ2RpdicsIHByb3BzLnRhZ05hbWUpXG5cbiAgICBwcm9wcy5hdHRyaWJ1dGVzID0gcHJvcHMuYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkID8gcHJvcHMuYXR0cmlidXRlcyA6IHRoaXMuZ2V0RG9tQXR0cmlidXRlcyhwcm9wcylcbiAgICBwcm9wcy5hdHRycyA9IHRoaXMudXBkYXRlQXR0cnMocHJvcHMuYXR0cmlidXRlcylcblxuICAgIHByb3BzLmZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgdGhpcy50ZXN0TW9kZSA9IHRlc3RNb2RlXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG5cbiAgICB0aGlzLmFkZE1peGlucygpXG4gIH1cblxuICBzZXRQcm9wKGtleSwgdmFsKSB7XG4gICAgdGhpcy5wcm9wc1trZXldID0gdmFsXG4gIH1cblxuICBnZXRQcm9wKHZhbCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzW3ZhbF1cbiAgfVxuXG4gIGdldCBlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5lbFxuICB9XG5cbiAgc2V0RWxBdHRycyhlbCwgcGFyYW1zKSB7XG4gICAgY29uc3QgYWRkQXR0cmlidXRlcyA9ICh2YWwsIGtleSkgPT4ge1xuICAgICAgY29uc3QgYWRkVG9EYXRhc2V0ID0gKHZhbCwga2V5KSA9PiB7IGVsLmRhdGFzZXRba2V5XSA9IHZhbCB9XG4gICAgICBpZiAoa2V5ID09PSAnZGF0YXNldCcpIHtcbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoYWRkVG9EYXRhc2V0LCB2YWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWwpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZ2V0UHJvcCgnYXR0cnMnKS5mb3JFYWNoKGFkZEF0dHJpYnV0ZXMpXG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICB1cGRhdGVBdHRycyhwYXJhbXMsIG0pIHtcbiAgICBjb25zdCB0aGVNYXAgPSBtICE9PSB1bmRlZmluZWQgPyBtIDogbmV3IE1hcCgpXG4gICAgY29uc3QgYWRkQXR0cmlidXRlcyA9ICh2YWwsIGtleSkgPT4gdGhlTWFwLnNldChrZXksIHZhbClcbiAgICBtYXBPYmpJbmRleGVkKGFkZEF0dHJpYnV0ZXMsIHBhcmFtcylcbiAgICByZXR1cm4gdGhlTWFwXG4gIH1cblxuICBhZGRUZW1wbGF0ZShlbCkge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5nZXRQcm9wKCd0ZW1wbGF0ZScpXG5cbiAgICBjb25zdCBhZGRUbXBsID0gKHRlbXBsYXRlKSA9PiB7XG4gICAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0UHJvcCgnZGF0YScpXG4gICAgICBkYXRhID0gaXMoT2JqZWN0LCBkYXRhKSA/IGRhdGEgOiB7fVxuICAgICAgY29uc3QgZnJhZyA9IG5ldyBEb21FbGVtZW50VGVtcGxhdGUodGVtcGxhdGUsIGRhdGEsIHsgdGVzdE1vZGU6IHRoaXM/LnRlc3RNb2RlIH0pLnJlbmRlckRvY0ZyYWcoKVxuICAgICAgY29uc3QgZnJhZ0lzU3RyaW5nID0gaXMoU3RyaW5nLCBmcmFnKVxuICAgICAgZnJhZ0lzU3RyaW5nID8gZWwuaW5uZXJIVE1MID0gZnJhZyA6IGVsLmFwcGVuZENoaWxkKGZyYWcpXG4gICAgICByZXR1cm4gZWxcbiAgICB9XG4gICAgY29uc3QgZG9Ob3RoaW5nID0gKGVsKSA9PiBlbFxuICAgIHJldHVybiB0ZW1wbGF0ZSAhPT0gdW5kZWZpbmVkID8gYWRkVG1wbCh0ZW1wbGF0ZSkgOiBkb05vdGhpbmcoZWwpXG4gIH1cblxuICBjcmVhdGVFbGVtZW50KHRhZ05hbWUgPSAnZGl2Jykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpXG4gIH1cblxuICBhZGRDb250ZW50KGVsKSB7XG4gICAgY29uc3QgdGV4dCA9ICh0aGlzLmdldFByb3AoJ2RhdGEnKSlcbiAgICBjb25zdCBpc1RleHQgPSBpcyhTdHJpbmcsIHRleHQpXG4gICAgaWYgKGlzVGV4dCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgdHh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dClcbiAgICAgIGVsLmFwcGVuZENoaWxkKHR4dClcbiAgICB9XG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICBleGVjdXRlKCkge1xuICAgIGNvbnN0IGVsID0gcGlwZShcbiAgICAgIHRoaXMuY3JlYXRlRWxlbWVudC5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5zZXRFbEF0dHJzLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmFkZFRlbXBsYXRlLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmFkZENvbnRlbnQuYmluZCh0aGlzKVxuICAgICkodGhpcy5nZXRQcm9wKCd0YWdOYW1lJykpXG4gICAgLy8gdGhpcy5nZXRQcm9wKCdmcmFnbWVudCcpLmFwcGVuZENoaWxkKGVsKTtcbiAgICB0aGlzLnByb3BzLmVsID0gZWxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJlbmRlciB0aGUgSFRNTCBFbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gSFRNTEVsZW1lbnRcbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHRoaXMucHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmRhdGEgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmF0dHJpYnV0ZXMgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKCdlbCcpXG4gIH1cblxuICByZW5kZXJUb0hUTUxTdHJpbmcoKSB7XG4gICAgdGhpcy5leGVjdXRlKClcbiAgICB0aGlzLnByb3BzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5kYXRhID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5hdHRyaWJ1dGVzID0gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcCgnZWwnKS5vdXRlckhUTUxcbiAgfVxuXG4gIHJldHVybklmRGVmaW5lZChvYmosIHZhbCkge1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNPYmogPSB0eXBlb2YgKHZhbCkgPT09ICd1bmRlZmluZWQnXG4gICAgICBpc09iaiA9PT0gZmFsc2UgPyBvYmpbdmFsXSA9IHZhbCA6IG9ialt2YWxdID0gZGVlcE1lcmdlKG9ialt2YWxdLCB2YWwpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlcHJvcHModmFsKSB7XG4gICAgdGhpcy5yZXR1cm5JZkRlZmluZWQodGhpcy5wcm9wcywgdmFsKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB1cGRhdGVwcm9wc0FuZFJ1bih2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZXByb3BzKHZhbClcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHJldHVybiB0aGlzLmdldFByb3AoJ2ZyYWdtZW50JylcbiAgfVxuXG4gIHVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5nZXRQcm9wKCdlbCcpLnJlbW92ZSgpXG4gICAgICB0aGlzLnByb3BzID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmdjKClcbiAgICB9XG4gIH1cblxuICB1cGRhdGVUYWcodGFnTmFtZSA9ICdkaXYnKSB7IHRoaXMudXBkYXRlcHJvcHModGFnTmFtZSkgfVxuICB1cGRhdGVBdHRyaWJ1dGVzKGF0dHJzID0ge30pIHsgdGhpcy51cGRhdGVwcm9wcyhhdHRycykgfVxuICB1cGRhdGVUZW1wbGF0ZSh0ZW1wbGF0ZSkgeyB0aGlzLnVwZGF0ZXByb3BzKHRlbXBsYXRlKSB9XG4gIHVwZGF0ZURhdGEoZGF0YSA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHMoZGF0YSkgfVxuICBhZGRUYWdBbmRSZW5kZXIodGFnTmFtZSA9ICdkaXYnKSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4odGFnTmFtZSkgfVxuICBhZGRBdHRyc2lidXRlc0FuZFJlbmRlcihhdHRycyA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4oYXR0cnMpIH1cbiAgYWRkVGVtcGxhdGVBbmRSZW5kZXIodGVtcGxhdGUpIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bih0ZW1wbGF0ZSkgfVxuICBhZGREYXRhQW5kUmVuZGVyKGRhdGEgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKGRhdGEpIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQkFTRSBDT1JFIE1JWElOU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgY29uc3QgY29yZU1peGlucyA9IGJhc2VDb3JlTWl4aW5zKClcbiAgICB0aGlzLmdjID0gY29yZU1peGlucy5nYy5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXREb21BdHRyaWJ1dGVzKHByb3BzKSB7XG4gICAgcmV0dXJuIHBpY2sodGhpcy5hdHRyaWJ1dGVzQXJyYXksIHByb3BzKVxuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZXNBcnJheSgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2FjY2VwdCcsXG4gICAgICAnYWNjZXB0LWNoYXJzZXQnLFxuICAgICAgJ2FjY2Vzc2tleScsXG4gICAgICAnYWN0aW9uJyxcbiAgICAgICdhbGlnbicsXG4gICAgICAnYWxsb3cnLFxuICAgICAgJ2FsdCcsXG4gICAgICAnYXN5bmMnLFxuICAgICAgJ2F1dG9jYXBpdGFsaXplJyxcbiAgICAgICdhdXRvY29tcGxldGUnLFxuICAgICAgJ2F1dG9mb2N1cycsXG4gICAgICAnYXV0b3BsYXknLFxuICAgICAgJ2JnY29sb3InLFxuICAgICAgJ2JvcmRlcicsXG4gICAgICAnYnVmZmVyZWQnLFxuICAgICAgJ2NoYWxsZW5nZScsXG4gICAgICAnY2hhcnNldCcsXG4gICAgICAnY2hlY2tlZCcsXG4gICAgICAnY2l0ZScsXG4gICAgICAnY2xhc3MnLFxuICAgICAgJ2NvZGUnLFxuICAgICAgJ2NvZGViYXNlJyxcbiAgICAgICdjb2xvcicsXG4gICAgICAnY29scycsXG4gICAgICAnY29sc3BhbicsXG4gICAgICAnY29udGVudCcsXG4gICAgICAnY29udGVudGVkaXRhYmxlJyxcbiAgICAgICdjb250ZXh0bWVudScsXG4gICAgICAnY29udHJvbHMnLFxuICAgICAgJ2Nvb3JkcycsXG4gICAgICAnY3Jvc3NvcmlnaW4nLFxuICAgICAgJ2NzcCcsXG4gICAgICAnZGF0YXNldCcsXG4gICAgICAnZGF0ZXRpbWUnLFxuICAgICAgJ2RlY29kaW5nJyxcbiAgICAgICdkZWZhdWx0JyxcbiAgICAgICdkZWZlcicsXG4gICAgICAnZGlyJyxcbiAgICAgICdkaXJuYW1lJyxcbiAgICAgICdkaXNhYmxlZCcsXG4gICAgICAnZG93bmxvYWQnLFxuICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAnZHJvcHpvbmUnLFxuICAgICAgJ2VuY3R5cGUnLFxuICAgICAgJ2ZvcicsXG4gICAgICAnZm9ybScsXG4gICAgICAnZm9ybWFjdGlvbicsXG4gICAgICAnaGVhZGVycycsXG4gICAgICAnaGVpZ2h0JyxcbiAgICAgICdoaWRkZW4nLFxuICAgICAgJ2hpZ2gnLFxuICAgICAgJ2hyZWYnLFxuICAgICAgJ2hyZWZsYW5nJyxcbiAgICAgICdodHRwLWVxdWl2JyxcbiAgICAgICdpY29uJyxcbiAgICAgICdpZCcsXG4gICAgICAnaW1wb3J0YW5jZScsXG4gICAgICAnaW50ZWdyaXR5JyxcbiAgICAgICdpc21hcCcsXG4gICAgICAnaXRlbXByb3AnLFxuICAgICAgJ2tleXR5cGUnLFxuICAgICAgJ2tpbmQnLFxuICAgICAgJ2xhYmVsJyxcbiAgICAgICdsYW5nJyxcbiAgICAgICdsYW5ndWFnZScsXG4gICAgICAnbGF6eWxvYWQnLFxuICAgICAgJ2xpc3QnLFxuICAgICAgJ2xvb3AnLFxuICAgICAgJ2xvdycsXG4gICAgICAnbWFuaWZlc3QnLFxuICAgICAgJ21heCcsXG4gICAgICAnbWF4bGVuZ3RoJyxcbiAgICAgICdtaW5sZW5ndGgnLFxuICAgICAgJ21lZGlhJyxcbiAgICAgICdtZXRob2QnLFxuICAgICAgJ21pbicsXG4gICAgICAnbXVsdGlwbGUnLFxuICAgICAgJ211dGVkJyxcbiAgICAgICduYW1lJyxcbiAgICAgICdub3ZhbGlkYXRlJyxcbiAgICAgICdvcGVuJyxcbiAgICAgICdvcHRpbXVtJyxcbiAgICAgICdwYXR0ZXJuJyxcbiAgICAgICdwaW5nJyxcbiAgICAgICdwbGFjZWhvbGRlcicsXG4gICAgICAncG9zdGVyJyxcbiAgICAgICdwcmVsb2FkJyxcbiAgICAgICdyYWRpb2dyb3VwJyxcbiAgICAgICdyZWFkb25seScsXG4gICAgICAncmVmZXJyZXJwb2xpY3knLFxuICAgICAgJ3JlbCcsXG4gICAgICAncmVxdWlyZWQnLFxuICAgICAgJ3JldmVyc2VkJyxcbiAgICAgICdyb3dzJyxcbiAgICAgICdyb3dzcGFuJyxcbiAgICAgICdzYW5kYm94JyxcbiAgICAgICdzY29wZScsXG4gICAgICAnc2NvcGVkJyxcbiAgICAgICdzZWxlY3RlZCcsXG4gICAgICAnc2hhcGUnLFxuICAgICAgJ3NpemUnLFxuICAgICAgJ3NpemVzJyxcbiAgICAgICdzbG90JyxcbiAgICAgICdzcGFuJyxcbiAgICAgICdzcGVsbGNoZWNrJyxcbiAgICAgICdzcmMnLFxuICAgICAgJ3NyY2RvYycsXG4gICAgICAnc3JjbGFuZycsXG4gICAgICAnc3Jjc2V0JyxcbiAgICAgICdzdGFydCcsXG4gICAgICAnc3RlcCcsXG4gICAgICAnc3R5bGUnLFxuICAgICAgJ3N1bW1hcnknLFxuICAgICAgJ3RhYmluZGV4JyxcbiAgICAgICd0YXJnZXQnLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgICd0cmFuc2xhdGUnLFxuICAgICAgJ3R5cGUnLFxuICAgICAgJ3VzZW1hcCcsXG4gICAgICAndmFsdWUnLFxuICAgICAgJ3dpZHRoJyxcbiAgICAgICd3cmFwJ1xuICAgIF1cbiAgfVxufVxuY29uc3QgRG9tRWwgPSBEb21FbGVtZW50XG5leHBvcnQgeyBEb21FbGVtZW50LCBEb21FbCB9XG4iLCJpbXBvcnQgeyBiYXNlU3RyZWFtc01peGlucyB9IGZyb20gJy4uL3V0aWxzL21peGlucy9iYXNlLXN0cmVhbXMtbWl4aW5zLmpzJ1xuaW1wb3J0IHsgY29udmVydERvbVN0cmluZ01hcFRvT2JqIH0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjbG9uZSwgb21pdCB9IGZyb20gJ3JhbWRhJ1xuY29uc3QgaXNEZXZNb2RlID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtQnJvYWRjYXN0ZXIge1xuICAvKipcbiAgICogVGhlIGNsYXNzIHRha2VzIGluIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGUgJ2Jyb2FkY2FzdEV2ZW50cycgbWV0aG9kIGFuZCBkaXJlY3RzIHRoZSBldmVudHMgdG8gZWl0aGVyIHRoZSBVSSBvciBST1VURSBjaGFubmVsc1xuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1Ccm9hZGNhc3RlclxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGJyb2FkY2FzdEZuXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzLCBicm9hZGNhc3RGbikge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgICB0aGlzLmJyb2FkY2FzdEZuID0gYnJvYWRjYXN0Rm5cbiAgICB0aGlzLmJyb2FkY2FzdGVyKHRoaXMuYnJvYWRjYXN0Rm4pXG4gIH1cblxuICBhZGREYmxDbGlja0V2dChxKSB7XG4gICAgY29uc3QgZGJsY2xpY2skID0gZnJvbUV2ZW50KHEsICdkYmxjbGljaycpXG4gICAgLy8gY29uc29sZS5sb2coJ0FERElORyBEQkwgQ0xJQ0sgJywgcSk7XG4gICAgY29uc3Qgc3RyZWFtJCA9IGRibGNsaWNrJC5waXBlKFxuICAgICAgbWFwKHAgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gY2xvbmUocClcbiAgICAgICAgLy8gQUREIERPVUJMRUNMSUNLIFRPIFVJIEVWRU5UU1xuICAgICAgICBkYXRhLnR5cGVPdmVyUmlkZSA9ICdkYmxjbGljaydcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgIH0pKVxuICAgIHJldHVybiBzdHJlYW0kXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJST0FEQ0FTVCBCVVRUT04gRVZFTlRTXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYnJvYWRjYXN0KGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPD0gMCAmJiBpc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG5lc3RlZCBhcnJheSBpbiAke3RoaXMucHJvcHMubmFtZX0uYnJvYWRjYXN0RXZlbnRzIGFwcGVhcnMgdG8gYmUgZW1wdHkgLS0+IHZzaWQ6JHt0aGlzLnByb3BzLnZzaWR9IWApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gcGF5bG9hZHMgdG8gc2VuZCwgYmFzZWQgb24gZWl0aGVyIHRoZSBhcnJheSBvciB0aGUgZWxlbWVudHMgZGF0YU1hcFxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkcyA9IHtcbiAgICAgIFVJOiB0aGlzLnNlbmRVSVBheWxvYWQsXG4gICAgICBST1VURTogdGhpcy5zZW5kUm91dGVQYXlsb2FkXG4gICAgfVxuICAgIC8vIHNwcmVhZCBvcGVyYXRvciB0byBzZWxlY3QgdmFyaWFibGVzIGZyb20gYXJyYXlzXG4gICAgY29uc3QgW3NlbGVjdG9yLCBldmVudCwgbG9jYWxdID0gYXJnc1xuICAgIC8vIGJ0biBxdWVyeVxuICAgIGxldCBjaGFubmVsIC8vIGhvaXN0IGNoYW5uZWwgYW5kIGxhdGVyIGNoZWNrIGlmIGNobmwgZXhpc3RzXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5wcm9wcy5lbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuXG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA8PSAwKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMucHJvcHMuZWxcbiAgICAgIGNvbnN0IGNoZWNrUGFyZW50RWxzID0gKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT09IGVsKSB7XG4gICAgICAgICAgcXVlcnkgPSBbZWxlbWVudF1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwbHVja0VsRnJvbVBhcmVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZWxQYXJlbnQgPSBlbC5wYXJlbnRFbGVtZW50ICE9PSBudWxsID8gZWwucGFyZW50RWxlbWVudCA6IGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGVsU2VsZWN0ZWQgPSBlbFBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgICAgICBlbFNlbGVjdGVkLmZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaFxuICAgICAgICBlbFNlbGVjdGVkLmZvckVhY2goY2hlY2tQYXJlbnRFbHMpXG4gICAgICB9XG5cbiAgICAgIHBsdWNrRWxGcm9tUGFyZW50KClcbiAgICB9XG5cbiAgICBjb25zdCBpc0xvY2FsRXZlbnQgPSBsb2NhbCAhPT0gdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkT2JzZXJ2YWJsZSA9IChxKSA9PiB7XG4gICAgICAvLyB0aGUgIGJ0biBvYnNlcnZhYmxlXG4gICAgICBjb25zdCBvYnNlcnZhYmxlID0gZXZlbnQgIT09ICdkYmxDbGljaydcbiAgICAgICAgPyBmcm9tRXZlbnQocSwgZXZlbnQsIHsgcHJldmVudERlZmF1bHQ6ICgpID0+IHRydWUgfSlcbiAgICAgICAgOiB0aGlzLmFkZERibENsaWNrRXZ0KHEpXG4gICAgICAvLyBzZWxlY3QgY2hhbm5lbCBhbmQgZGF0YSB2YWx1ZXMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IG9yIHRoZSBlbGVtZW50J3MgZG9tIE1hcFxuICAgICAgY2hhbm5lbCA9IHEuZGF0YXNldC5jaGFubmVsLy8gaWZOaWxUaGVuVXBkYXRlKGNobmwsIHEuZGF0YXNldC5jaGFubmVsKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB7fS8vIGNvbnZlcnREb21TdHJpbmdNYXBUb09iaihxLmRhdGFzZXQpO1xuICAgICAgZGF0YS5wYXlsb2FkID0gY29udmVydERvbVN0cmluZ01hcFRvT2JqKHEuZGF0YXNldClcbiAgICAgIGRhdGEucGF5bG9hZCA9IG9taXQoWydjaGFubmVsJ10sIGRhdGEucGF5bG9hZClcbiAgICAgIGRhdGEuY2hhbm5lbCA9IGNoYW5uZWxcbiAgICAgIC8vIHBheWxvYWQgbmVlZHMgdnNpZCMgdG8gcGFzcyB2ZXJpZmljYXRpb25cblxuICAgICAgZGF0YS5zcmNFbGVtZW50ID0ge30vLyBwaWNrKFsndnNpZCcsJ3ZpZXdOYW1lJ10sIGRhdGEpO1xuICAgICAgZGF0YS5zcmNFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZFxuICAgICAgZGF0YS5zcmNFbGVtZW50LnZzaWQgPSB0aGlzLnByb3BzLnZzaWRcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5pc0xvY2FsRXZlbnQgPSBpc0xvY2FsRXZlbnRcbiAgICAgIC8vIGRhdGEuc3JjRWxlbWVudFsndmlld05hbWUnXSA9IHRoaXMucHJvcHMubmFtZTtcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5zcmNFdmVudCA9IGV2ZW50XG4gICAgICBkYXRhLnNyY0VsZW1lbnQuZWwgPSBxXG4gICAgICAvLyBzZWxlY3QgdGhlIGNvcnJlY3QgcGF5bG9hZFxuXG4gICAgICBmdW5jdGlvbiBnZXRWYWxpZENoYW5uZWwoY2gpIHtcbiAgICAgICAgaWYgKGNoID09PSAnUk9VVEUnIHx8IGNoID09PSAnQ0hBTk5FTF9ST1VURScpIHtcbiAgICAgICAgICByZXR1cm4gJ1JPVVRFJ1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCAhPT0gJ1VJJyAmJiBjaCAhPT0gJ0NIQU5ORUxfVUknICYmIGNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lSlMgd2FybmluZzogVGhlIGNoYW5uZWwsICR7Y2h9LCBpcyBub3QgYWxsb3dlZCBoZXJlLCBvbmx5IFwiVUlcIiBvciBcIlJPVVRFXCIgYXJlIHZhbGlkIGNoYW5uZWxzLCBkZWZhdWx0aW5nIHRvIENIQU5ORUxfVUlgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnVUknXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkID0gY2hhbm5lbFBheWxvYWRzW2dldFZhbGlkQ2hhbm5lbChjaGFubmVsKV1cbiAgICAgIC8vIHJ1biBwYXlsb2FkXG4gICAgICBjaGFubmVsUGF5bG9hZChvYnNlcnZhYmxlLCBkYXRhKVxuICAgIH1cbiAgICBjb25zdCBxdWVyeUlzTmlsID0gcXVlcnkgPT09IHVuZGVmaW5lZCB8fCBxdWVyeS5sZW5ndGggPD0gMFxuICAgIGlmIChxdWVyeUlzTmlsID09PSB0cnVlICYmIGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgaXRlbSAke3NlbGVjdG9yfSwgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IGluICR7dGhpcy5wcm9wcy5uYW1lfSAtLT4gdnNpZDoke3RoaXMucHJvcHMudnNpZH0hYClcblxuICAgICAgLy8gYWRkT2JzZXJ2YWJsZShxdWVyeSwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeS5mb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2hcbiAgICAgIHF1ZXJ5LmZvckVhY2goYWRkT2JzZXJ2YWJsZSlcbiAgICB9XG4gIH1cblxuICBicm9hZGNhc3RlcihhcnJGbikge1xuICAgIGNvbnN0IGJyb2FkY2FzdEFyciA9IGFyckZuKClcbiAgICBicm9hZGNhc3RBcnIuZm9yRWFjaChhcmdzID0+IHRoaXMuYnJvYWRjYXN0KGFyZ3MpKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGFkZE1peGlucygpIHtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgU1RSRUFNIE1JWElOU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3Qgc3RyZWFtTWl4aW5zID0gYmFzZVN0cmVhbXNNaXhpbnMoKVxuICAgIHRoaXMuc2VuZFVJUGF5bG9hZCA9IHN0cmVhbU1peGlucy5zZW5kVUlQYXlsb2FkXG4gICAgdGhpcy5zZW5kUm91dGVQYXlsb2FkID0gc3RyZWFtTWl4aW5zLnNlbmRSb3V0ZVBheWxvYWRcbiAgfVxufVxuIiwiaW1wb3J0IHsgRG9tRWxlbWVudCB9IGZyb20gJy4vZG9tLWVsZW1lbnQuanMnXG5pbXBvcnQgeyBmYWRlaW4sIGZhZGVvdXQgfSBmcm9tICcuLi91dGlscy92aWV3c3RyZWFtLWFuaW1hdGlvbnMuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtT2JzZXJ2YWJsZSB9IGZyb20gJy4uL3V0aWxzL3ZpZXdzdHJlYW0tb2JzZXJ2YWJsZXMuanMnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlLmpzJ1xuaW1wb3J0IHsgU3ViamVjdCwgYmluZENhbGxiYWNrIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgaXNOaWwsIHBpY2ssIHByb3BzLCBkZWZhdWx0VG8gfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1FbGVtZW50IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbUVsZW1lbnRcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICogQGRlc2NcbiAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBjbGFzcyB0aGF0IGlzIHBhcnQgb2YgdGhlIFZpZXdTdHJlYW0gb2JzZXJ2YWJsZSBzeXN0ZW0uXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09ic2VydmFibGV9IHNpbmskXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2aWV3UHJvcHNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZzaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZzTmFtZVxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2luayQsIHZpZXdQcm9wcyA9IHt9LCB2c2lkID0gJycsIHZzTmFtZSA9ICd0aGVOYW1lJykge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLl9zdGF0ZSA9ICdJTklUJ1xuICAgIHRoaXMudnNpZCA9IHZzaWRcbiAgICB0aGlzLmVsID0gdmlld1Byb3BzLmVsXG4gICAgdGhpcy52c05hbWUgPSB2c05hbWVcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgZGVidWc6ZmFsc2UsXG4gICAgICBleHRlbmRlZEhhc2hNZXRob2RzOiB7fVxuICAgIH1cbiAgICB0aGlzLm9wdGlvbnMgPSBkZWVwTWVyZ2UodGhpcy5kZWZhdWx0cywgdmlld1Byb3BzKVxuICAgIGNvbnN0IGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kID0gKGFycikgPT4ge1xuICAgICAgY29uc3QgW2FjdGlvbiwgZnVuY1N0cl0gPSBhcnJcbiAgICAgIHRoaXMub3B0aW9ucy5leHRlbmRlZEhhc2hNZXRob2RzW2FjdGlvbl0gPSAocCkgPT4gdGhpc1tmdW5jU3RyXShwKVxuICAgIH1cbiAgICB0aGlzLmFkZEFjdGlvbkxpc3RlbmVycygpLmZvckVhY2goY3JlYXRlRXh0cmFTdGF0ZXNNZXRob2QpXG4gICAgdGhpcy5vcHRpb25zLmhhc2hNZXRob2RzID0gdGhpcy5zZXRIYXNoTWV0aG9kcyh0aGlzLm9wdGlvbnMuZXh0ZW5kZWRIYXNoTWV0aG9kcylcbiAgICB0aGlzLnNpbmskID0gc2luayRcbiAgICB0aGlzLnNpbmskXG4gICAgICAuc3Vic2NyaWJlKHRoaXMub25PYnNTaW5rU3Vic2NyaWJlLmJpbmQodGhpcykpXG5cbiAgICB0aGlzLiRkaXJzID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0KClcbiAgICB0aGlzLmFkZERlZmF1bHREaXIgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5hZGREZWZhdWx0RGlyXG4gICAgdGhpcy5zb3VyY2VTdHJlYW1zID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyhuZXcgU3ViamVjdCgpLCB0aGlzLnZzTmFtZSwgdGhpcy52c2lkKVxuICAgIHRoaXMuX3NvdXJjZSQgPSB0aGlzLnNvdXJjZVN0cmVhbXMudG9JbnRlcm5hbCQgLy8gIG5ldyBTdWJqZWN0KCk7XG4gIH1cblxuICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBzZXRIYXNoTWV0aG9kcyhleHRlbmRlZEhhc2hNZXRob2RzT2JqID0ge30pIHtcbiAgICBjb25zdCBkZWZhdWx0SGFzaE1ldGhvZHMgPSB7XG4gICAgICBWU19ERVRSSVRVU19DT0xMRUNUICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25HYXJiYWdlQ29sbGVjdChwKSxcbiAgICAgIFJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25SZWFkeUZvckdDKHApLFxuICAgICAgRVhUSVJQQVRFICAgICAgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vbkRpc3Bvc2UocCksXG4gICAgICBWU19TUEFXTiAgICAgICAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uUmVuZGVyKHApLFxuICAgICAgVlNfU1BBV05fQU5EX0FUVEFDSF9UT19QQVJFTlQgICAgOiAocCkgPT4gdGhpcy5vblJlbmRlckFuZEF0dGFjaFRvUGFyZW50KHApLFxuICAgICAgVlNfU1BBV05fQU5EX0FUVEFDSF9UT19ET00gICAgICAgOiAocCkgPT4gdGhpcy5vblJlbmRlckFuZEF0dGFjaFRvRG9tKHApLFxuICAgICAgQVRUQUNIX0NISUxEX1RPX1NFTEYgICAgICAgICAgIDogKHApID0+IHRoaXMub25BdHRhY2hDaGlsZFRvU2VsZihwKVxuICAgIH1cbiAgICByZXR1cm4gZGVlcE1lcmdlKGRlZmF1bHRIYXNoTWV0aG9kcywgZXh0ZW5kZWRIYXNoTWV0aG9kc09iailcbiAgfVxuXG4gIGNyZWF0ZURvbUl0ZW0oKSB7XG4gICAgdGhpcy5wcm9wcyA9IHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCA/IHRoaXMucHJvcHMgOiB7fVxuICAgIGNvbnN0IHJlbW92ZUlzTmlsID0gKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhdHRycyA9IGZpbHRlcihyZW1vdmVJc05pbCwgcGljayhbJ2lkJywgJ2NsYXNzTmFtZSddLCB0aGlzLnByb3BzKSlcbiAgICBjb25zdCB7IHRhZ05hbWUsIGRhdGEsIHRlbXBsYXRlIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIG5ldyBEb21FbGVtZW50KHRhZ05hbWUsIGF0dHJzLCBkYXRhLCB0ZW1wbGF0ZSlcbiAgfVxuXG4gIG9uRGlzcG9zZUNvbXBsZXRlZChkKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2J2IHNlbGYgZGlzcG9zZWQgYWZ0ZXIgYW5pbWF0ZU91dCAnLCBkLCB0aGlzKTtcbiAgfVxuXG4gIGFuaW1hdGVJblR3ZWVuKGVsLCB0aW1lKSB7XG4gICAgZmFkZWluKGVsLCB0aW1lKVxuICB9XG5cbiAgYW5pbWF0ZU91dFR3ZWVuKGVsLCB0aW1lLCBjYWxsYmFjaykge1xuICAgIC8vIGNvbnNvbGUubG9nKCdhbmltIG91dCAnLCB7ZWwsIHRpbWUsIGNhbGxiYWNrfSk7XG4gICAgZmFkZW91dChlbCwgdGltZSwgY2FsbGJhY2spXG4gIH1cblxuICBzZXRBbmltYXRlSW4oZCkge1xuICAgIGlmIChkLmFuaW1hdGVJbiA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgZWwgPSBkLmVsICE9PSB1bmRlZmluZWQgPyBkLmVsIDogdGhpcy5kb21JdGVtLmVsXG4gICAgICB0aGlzLmFuaW1hdGVJblR3ZWVuKGVsLCBkLmFuaW1hdGVJblRpbWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkXG4gICAqIEByZXR1cm5zIHBheWxvYWQgdGhhdCBjb25maXJtcyBkaXNwb3NlXG4gICAqL1xuXG4gIGRpc3Bvc2VNZXRob2QoZCkge1xuICAgIGNvbnN0IGVsID0gZC5lbC5lbCAhPT0gdW5kZWZpbmVkID8gZC5lbC5lbCA6IGQuZWwgLy8gRE9NIElURU1TIEhBVkUgVEhFSVIgRUwgSVRFTVMgTkVTVEVEXG5cbiAgICBjb25zdCBnY0RhdGEgPSB7IGFjdGlvbjonUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnLCAkZGlyOnRoaXMuJGRpcnMuUEksIGVsIH1cblxuICAgIGNvbnN0IGFuaW1hdGVPdXQgPSAoZCwgY2FsbGJhY2spID0+IHtcbiAgICAgIHRoaXMuYW5pbWF0ZU91dFR3ZWVuKGVsLCBkLmFuaW1hdGVPdXRUaW1lLCBjYWxsYmFjaylcbiAgICB9XG5cbiAgICBjb25zdCBmYWRlT3V0T2JzID0gYmluZENhbGxiYWNrKGFuaW1hdGVPdXQpXG4gICAgY29uc3Qgb25GYWRlb3V0Q29tcGxldGVkID0gKGUpID0+IHtcbiAgICAgIHRoaXMuX3NvdXJjZSQubmV4dChnY0RhdGEpXG4gICAgfVxuXG4gICAgY29uc3Qgb25GYWRlb3V0T2JzID0gKGQpID0+IHtcbiAgICAgIGZhZGVPdXRPYnMoZClcbiAgICAgICAgLnN1YnNjcmliZShvbkZhZGVvdXRDb21wbGV0ZWQpXG4gICAgICByZXR1cm4geyBhY3Rpb246J0VYVElSUEFUSU5HJywgJGRpcjp0aGlzLiRkaXJzLkNJIH1cbiAgICB9XG4gICAgY29uc3Qgb25FbXB0eU9icyA9ICgpID0+ICh7IGFjdGlvbjonRVhUSVJQQVRFX0FORF9SRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcsICRkaXI6dGhpcy4kZGlycy5DSSB9KVxuICAgIGNvbnN0IGZuID0gZC5hbmltYXRlT3V0ID09PSB0cnVlID8gb25GYWRlb3V0T2JzIDogb25FbXB0eU9ic1xuICAgIHJldHVybiBmbihkKVxuICB9XG5cbiAgb25EaXNwb3NlKGQpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwb3NlTWV0aG9kKGQpXG4gIH1cblxuICByZW1vdmVTdHJlYW0oKSB7XG4gICAgLy8gdGhpcy5zb3VyY2VTdHJlYW1zLmNvbXBsZXRlQWxsKCk7XG4gICAgaWYgKHRoaXMuc291cmNlU3RyZWFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMuY29tcGxldGVTdHJlYW0oWydpbnRlcm5hbCcsICdjaGlsZCddKVxuICAgIH1cbiAgfVxuXG4gIG9uUmVhZHlGb3JHQyhwKSB7XG4gICAgdGhpcy5yZW1vdmVTdHJlYW0oKVxuICB9XG5cbiAgb25HYXJiYWdlQ29sbGVjdChwKSB7XG4gICAgaWYgKHRoaXMuZG9tSXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRvbUl0ZW0udW5tb3VudCgpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc291cmNlU3RyZWFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMuY29tcGxldGVTdHJlYW0oWydwYXJlbnQnXSlcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpc1xuICB9XG5cbiAgZ2V0U291cmNlU3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2UkXG4gIH1cblxuICBjb21iaW5lRG9tSXRlbXMoZCkge1xuICAgIGlmICh0aGlzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9ICBpc05pbChkLnF1ZXJ5KSA/IGQubm9kZSA6IGQucXVlcnlcbiAgICBjb25zdCBwcmVwZW5kID0gKG5vZGUsIGl0ZW0pID0+IG5vZGUuaW5zZXJ0QmVmb3JlKGl0ZW0sIG5vZGUuZmlyc3RDaGlsZClcbiAgICBjb25zdCBhcHBlbmQgPSAobm9kZSwgaXRlbSkgPT4gbm9kZS5hcHBlbmRDaGlsZChpdGVtKVxuICAgIGNvbnN0IGFmdGVyID0gKG5vZGUsIGl0ZW0pID0+IG5vZGUuYWZ0ZXIoaXRlbSlcblxuICAgIGNvbnN0IGRlZmF1bHRGbiA9IHByZXBlbmRcbiAgICBjb25zdCBhdHRhY2hUeXBlSGFzaCA9IHtcbiAgICAgIGFwcGVuZENoaWxkIDogYXBwZW5kLFxuICAgICAgYWZ0ZXJcbiAgICB9XG4gICAgLy8gREVURVJNSU5FIFdIRVRIRVIgVE8gVVNFIEFQUEVORCBPUiBQUkVQRU5EXG4gICAgLy8gT04gQ09OTkVDVElORyBET00gSVRFTVMgVE8gRUFDSCBPVEhFUlxuICAgIC8vIGxldCBhdHRhY2hGdW5jID0gZC5hdHRhY2hUeXBlID09PSAnYXBwZW5kQ2hpbGQnID8gYXBwZW5kIDogcHJlcGVuZDtcbiAgICBjb25zdCBhdHRhY2hGdW5jID0gYXR0YWNoVHlwZUhhc2hbZC5hdHRhY2hUeXBlXSB8fCBkZWZhdWx0Rm5cbiAgICBhdHRhY2hGdW5jKGNvbnRhaW5lciwgdGhpcy5kb21JdGVtLnJlbmRlcigpKVxuICAgIHRoaXMuc2V0QW5pbWF0ZUluKGQpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHBcbiAgICogQHJldHVybnMgcGF5bG9hZCB0byBhcHBlbmQgY2hpbGQgZWxlbWVudCB0byBjdXJyZW50IGVsZW1lbnRcbiAgICovXG5cbiAgb25BdHRhY2hDaGlsZFRvU2VsZihwKSB7XG4gICAgY29uc3QgZGF0YSA9IHAuY2hpbGRSZW5kZXJEYXRhXG4gICAgdGhpcy5jb21iaW5lRG9tSXRlbXMoZGF0YSlcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnQ0hJTERfQVRUQUNIRUQnLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5QSVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZFxuICAgKiBAcmV0dXJucyBwYXlsb2FkIHRoYXQgYXR0YWNoZXMgY3VycmVudCBjaGlsZCBlbGVtZW50IHRvIHBhcmVudFxuICAgKi9cbiAgb25SZW5kZXJBbmRBdHRhY2hUb1BhcmVudChkKSB7XG4gICAgdGhpcy5vblJlbmRlcihkKVxuICAgIHRoaXMuY29tYmluZURvbUl0ZW1zKGQpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ1ZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX1BBUkVOVCcsXG4gICAgICBlbDogdGhpcy5lbCB8fCB0aGlzLmRvbUl0ZW0uZWwsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLlBJXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyRG9tSXRlbShkKSB7XG4gICAgY29uc3QgW3RhZ05hbWUsIGF0dHJpYnV0ZXMsIGRhdGEsIHRlbXBsYXRlXSA9IGRcbiAgICB0aGlzLmRvbUl0ZW0gPSBuZXcgRG9tRWxlbWVudCh7IHRhZ05hbWUsIGF0dHJpYnV0ZXMsIGRhdGEsIHRlbXBsYXRlIH0pXG4gICAgcmV0dXJuIHRoaXMuZG9tSXRlbVxuICB9XG5cbiAgb25SZW5kZXIoZCkge1xuICAgIGNvbnN0IGdldEVsID0gKGRhdGEpID0+IHRoaXMucmVuZGVyRG9tSXRlbShkYXRhKVxuICAgIGNvbnN0IGVsID0gdGhpcy5lbCB8fCBnZXRFbChwcm9wcyhbJ3RhZ05hbWUnLCAnZG9tQXR0cmlidXRlcycsICdkYXRhJywgJ3RlbXBsYXRlJ10sIGQpKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdWU19TUEFXTkVEJyxcbiAgICAgIGVsLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5JXG4gICAgfVxuICB9XG5cbiAgZXh0ZW5kZWRNZXRob2RzKGRhdGEpIHtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZFxuICAgKiBAcmV0dXJuc1xuICAgKiBQYXlsb2FkIGNvbnRhaW5pbmcgdGhlIGFjdGlvbiwgaW50ZXJuYWwgb2JzZXJ2YWJsZSBhbmQgZWxlbWVudC5cbiAgICovXG4gIG9uUmVuZGVyQW5kQXR0YWNoVG9Eb20oZCkge1xuICAgIGNvbnN0IGdldEVsID0gKGRhdGEpID0+IHRoaXMucmVuZGVyRG9tSXRlbShkYXRhKVxuICAgIGQuYXR0YWNoRGF0YS5lbCA9IGdldEVsKHByb3BzKFsndGFnTmFtZScsICdkb21BdHRyaWJ1dGVzJywgJ2RhdGEnLCAndGVtcGxhdGUnXSwgZCkpXG4gICAgdGhpcy5jb21iaW5lRG9tSXRlbXMoZC5hdHRhY2hEYXRhKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19ET00nLFxuICAgICAgZWw6ICAgdGhpcy5lbCB8fCBkLmF0dGFjaERhdGEuZWwuZWwsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLkNJXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoZSBWaWV3U3RyZWFtIGRpcmVjdHMgYWxsIHJlbGV2YW50IGFjdGlvbnMgdG8gdGhlIERvbUVsZW1lbnQgdG8gcmVuZGVyIGFuZCBkaXNwb3NlIG9mIGl0c2VsZlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKi9cbiAgb25PYnNTaW5rU3Vic2NyaWJlKHBheWxvYWQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBwYXlsb2FkLmFjdGlvblxuICAgIGNvbnN0IGRlZmF1bHRUb0ZuID0gZGVmYXVsdFRvKChkYXRhKSA9PiB0aGlzLmV4dGVuZGVkTWV0aG9kcyhkYXRhKSlcbiAgICBjb25zdCBmbiA9IGRlZmF1bHRUb0ZuKHRoaXMub3B0aW9ucy5oYXNoTWV0aG9kc1thY3Rpb25dKVxuICAgIGNvbnN0IGRhdGEgPSBmbihwYXlsb2FkKVxuICAgIGNvbnN0IHNlbmREYXRhID0gKGQpID0+IHRoaXMuX3NvdXJjZSQubmV4dChkKVxuICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlbmREYXRhKE9iamVjdC5mcmVlemUoZGF0YSkpXG4gICAgfVxuICB9XG5cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBDT1JFIE1JWElOU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IGNvcmVNaXhpbnMgPSBiYXNlQ29yZU1peGlucygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IHNhZmVDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3NhZmUtY2xvbmUuanMnXG5pbXBvcnQgeyBnYyB9IGZyb20gJy4uL3V0aWxzL2djLmpzJ1xuaW1wb3J0IHtcbiAgY29tcG9zZSxcbiAgY2xvbmUsXG4gIGZyb21QYWlycyxcbiAgdG9QYWlycyxcbiAgaXNcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtUGF5bG9hZCB7XG4gIC8qKlxuICAgKlxuICAgKiBPYnNlcnZhYmxlcyBzZW50IGZyb20gVmlld1N0cmVhbXMgdG8gQ2hhbm5lbHMgYXJlIHZhbGlkYXRlZCBieSB0aGlzIGNsYXNzXG4gICAqXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbVBheWxvYWRcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gb2JzZXJ2YWJsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVidWdcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIG9ic2VydmFibGUsIGRhdGEsIGFjdGlvbiA9ICdzdWJzY3JpYmUnLCBkZWJ1ZyA9IGZhbHNlKSB7XG4gICAgLy8gdGhpcy5hZGRNaXhpbnMoKTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgbmFtZSxcbiAgICAgIG9ic2VydmFibGUsXG4gICAgICBkYXRhLFxuICAgICAgYWN0aW9uXG4gICAgfVxuICAgIHRoaXMuc2VuZFRvRGlyZWN0b3JTdHJlYW0ob3B0aW9ucylcbiAgfVxuXG4gIHNlbmRUb0RpcmVjdG9yU3RyZWFtKHBheWxvYWQpIHtcbiAgICBjb25zdCBkaXJlY3RvclN0cmVhbSQgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXAuZ2V0U3RyZWFtKCdESVNQQVRDSEVSJylcbiAgICBjb25zdCBmcm96ZW5QYXlsb2FkID0gc2FmZUNsb25lKHBheWxvYWQpXG4gICAgLy8gY29uc29sZS5sb2coXCJWUyBQQVlMT0FEIFwiLGZyb3plblBheWxvYWQpO1xuICAgIGRpcmVjdG9yU3RyZWFtJC5uZXh0KGZyb3plblBheWxvYWQpXG4gICAgcGF5bG9hZCA9IHVuZGVmaW5lZFxuXG4gICAgZGVsZXRlIHRoaXNcbiAgfVxuXG4gIHN0YXRpYyBkZWVwQ2xvbmUobykge1xuICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXkpXG4gICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QpXG4gICAgY29uc3QgaXNJdGVyID0gb2IgPT4gaXNBcnIob2IpID09PSBmYWxzZSAmJiBpc09iaihvYikgPT09IHRydWVcbiAgICBjb25zdCBpc0l0ZXJhYmxlID0gaXNJdGVyKG8pXG4gICAgcmV0dXJuIGlzSXRlcmFibGUgPyBjb21wb3NlKGZyb21QYWlycywgdG9QYWlycywgY2xvbmUpKG8pIDogY2xvbmUobylcbiAgfVxuXG4gIHN0YXRpYyBnZXRNb3VzZUV2ZW50S2V5cygpIHtcbiAgICByZXR1cm4gWydhbHRLZXknLCAnYnViYmxlcycsICdjYW5jZWxCdWJibGUnLCAnY2FuY2VsYWJsZScsICdjbGllbnRYJywgJ2NsaWVudFknLCAnY29tcG9zZWQnLCAnY3RybEtleScsICdjdXJyZW50VGFyZ2V0JywgJ2RlZmF1bHRQcmV2ZW50ZWQnLCAnZGV0YWlsJywgJ2V2ZW50UGhhc2UnLCAnZnJvbUVsZW1lbnQnLCAnaXNUcnVzdGVkJywgJ2xheWVyWCcsICdsYXllclknLCAnbWV0YUtleScsICdtb3ZlbWVudFgnLCAnbW92ZW1lbnRZJywgJ29mZnNldFgnLCAnb2Zmc2V0WScsICdwYWdlWCcsICdwYWdlWScsICdwYXRoJywgJ3JlbGF0ZWRUYXJnZXQnLCAncmV0dXJuVmFsdWUnLCAnc2NyZWVuWCcsICdzY3JlZW5ZJywgJ3NoaWZ0S2V5JywgJ3NvdXJjZUNhcGFiaWxpdGllcycsICdzcmNFbGVtZW50JywgJ3RhcmdldCcsICd0aW1lU3RhbXAnLCAndG9FbGVtZW50JywgJ3R5cGUnLCAndmlldycsICd3aGljaCcsICd4JywgJ3knXVxuICB9XG5cbiAgYWRkTWl4aW5zKCkge1xuICAgIHRoaXMuZ2MgPSBnY1xuICB9XG59XG4iLCJpbXBvcnQgeyBoZWFkLCBjb21wb3NlLCByZWplY3QsIHNwbGl0LCBpc0VtcHR5LCBsdGUsIGRlZmF1bHRUbywgcHJvcCB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmZ1bmN0aW9uIGdlbmVyYXRlU3B5bmVTZWxlY3RvcklkKGVsKSB7XG4gIGNvbnN0IG51bSA9ICgpID0+IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnJlcGxhY2UoL1xcZC9nbSwgJycpLnN1YnN0cmluZygxLCA4KVxuICBsZXQgdnNpZCA9IGAke251bSgpfWBcbiAgaWYgKGVsLmRhdGFzZXQudnNpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZWwuZGF0YXNldC52c2lkID0gdnNpZFxuICB9IGVsc2Uge1xuICAgIHZzaWQgPSBlbC5kYXRhc2V0LnZzaWRcbiAgfVxuICByZXR1cm4gYFtkYXRhLXZzaWQ9JyR7dnNpZH0nXWBcbn1cblxuZnVuY3Rpb24gaXNEZXZNb2RlKCkge1xuICByZXR1cm4gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlXG59XG5cbmZ1bmN0aW9uIGlzTm9kZUVsZW1lbnQoZWwpIHtcbiAgY29uc3Qgbm9kZUNoZWNrID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG4gIHJldHVybiBub2RlQ2hlY2soZWwpXG59XG5cbmZ1bmN0aW9uIGdldEVsT3JMaXN0KGN4dCwgc2VsLCB2ZXJib3NlQm9vbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGxpc3QgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCB2ZXJib3NlQm9vbClcbiAgcmV0dXJuIGxpc3QubGVuZ3RoID09PSAxID8gaGVhZChsaXN0KSA6IGxpc3Rcbn1cblxuZnVuY3Rpb24gdGVzdFNlbGVjdG9ycyhjeHQsIHNlbCwgdmVyYm9zZUJvb2wpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGN4dClcblxuICBjb25zdCBlbElzRG9tRWxlbWVudCA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuXG4gIGlmIChlbCAhPT0gbnVsbCAmJiBlbElzRG9tRWxlbWVudChlbCkgPT09IGZhbHNlKSB7XG4gICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgZWwgb2JqZWN0IGlzIG5vdCBhIHZhbGlkIHNpbmdsZSBlbGVtZW50LCAke2VsfWApXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoc2VsICE9PSB1bmRlZmluZWQgJiYgU3RyaW5nKHNlbCkudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICBmdW5jdGlvbiBpc1ZhbGlkU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBpcyB2YWxpZCBhbmQgc2VsZWN0cyBhdCBsZWFzdCBvbmUgZWxlbWVudFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2UgLy8gQ2F0Y2hpbmcgYW4gZXhjZXB0aW9uIG1lYW5zIHRoZSBzZWxlY3RvciBpcyBpbnZhbGlkXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNWYWxpZFNlbGVjdG9yQm9vbCA9IGlzVmFsaWRTZWxlY3RvcihzZWwpXG4gICAgaWYgKHZlcmJvc2VCb29sID09PSB0cnVlICYmIGlzRGV2TW9kZSgpID09PSB0cnVlICYmIGlzVmFsaWRTZWxlY3RvckJvb2wgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBzZWxlY3RvciwgJHtzZWx9IGRvZXMgbm90IGV4aXN0IGluIHRoaXMgZWwsICR7Y3h0fWApXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIHZlcmJvc2VCb29sID0gZmFsc2UpIHtcbiAgY29uc3Qgc2VsZWN0b3IgPSBzZWwgIT09IHVuZGVmaW5lZCA/IGAke2N4dH0gJHtzZWx9YCA6IGN4dFxuICBsZXQgaXNQYXJlbnQgPSBmYWxzZVxuXG4gIGNvbnN0IHJldHVyblNlbGVjdG9ySWZWYWxpZCA9IChzZWxlY3RvcikgPT4ge1xuICAgIGxldCBhcnIgPSBbXVxuICAgIHRyeSB7XG4gICAgICBhcnIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gY2F0Y2ggKGUpIHsgYXJyID0gW10gfVxuICAgIHRyeSB7XG4gICAgICBpc1BhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsKSA9PT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihjeHQpXG4gICAgICBpZiAoaXNQYXJlbnQgPT09IHRydWUpIHtcbiAgICAgICAgYXJyID0gW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsKV1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBhcnIvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgfVxuXG4gIGNvbnN0IGVsQXJyID0gIHJldHVyblNlbGVjdG9ySWZWYWxpZChzZWxlY3RvcilcblxuICBpZiAodmVyYm9zZUJvb2wgPT09IHRydWUpIHtcbiAgICBjb25zdCBtYWluU2VsID0gaXNQYXJlbnQgPT09IHRydWUgPyAnYm9keScgOiBjeHRcbiAgICB0ZXN0U2VsZWN0b3JzKG1haW5TZWwsIHNlbCwgdmVyYm9zZUJvb2wpXG4gIH1cblxuICByZXR1cm4gZWxBcnJcbn1cblxuZnVuY3Rpb24gc2V0SW5saW5lQ3NzKHZhbCwgY3h0LCBzZWwpIHtcbiAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgY29uc3QgYWRkSW5saW5lQ3NzID0gaXRlbSA9PiB7XG4gICAgaXRlbS5zdHlsZS5jc3NUZXh0ID0gdmFsXG4gIH1cbiAgYXJyLmZvckVhY2goYWRkSW5saW5lQ3NzKVxuICByZXR1cm4gdGhpc1xufVxuXG4vKipcbiAqXG4gKiBAbW9kdWxlIFZpZXdTdHJlYW1TZWxlY3RvclxuICogQHR5cGUgdXRpbFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEVsfSBjeHQgVGhlIG1haW4gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd8RWx9IFRoZSBzZWxlY3RvciBhcyBhIFN0cmluZ1xuICogQHJldHVybnMge2Z1bmN0aW9uKCo9KX1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIFZpZXdTdHJlYW1TZWxlY3RvcihjeHQsIHNlbCkge1xuICBjeHQgPSB0eXBlb2YgKGN4dCkgPT09ICdzdHJpbmcnID8gY3h0IDogZ2VuZXJhdGVTcHluZVNlbGVjdG9ySWQoY3h0KVxuICB0ZXN0U2VsZWN0b3JzKGN4dCwgc2VsLCBmYWxzZSlcblxuICBmdW5jdGlvbiBzZWxlY3RvcihzZWwpIHtcbiAgICByZXR1cm4gVmlld1N0cmVhbVNlbGVjdG9yKGN4dCwgc2VsKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBtYXAgdGhyb3VnaCBhIE5vZGVMaXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlbGVtZW50c1xuICAgKi9cbiAgc2VsZWN0b3IubWFwID0gKGZuKSA9PiBBcnJheS5mcm9tKGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpKS5tYXAoZm4pXG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBpdGVyYXRlIHRocm91Z2ggYSBOb2RlTGlzdFxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlbGVtZW50c1xuICAgKi9cbiAgc2VsZWN0b3IuZm9yRWFjaCA9IChmbikgPT4gQXJyYXkuZnJvbShnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSkubWFwKGZuKVxuXG4gIHNlbGVjdG9yLmdldE5vZGVMaXN0QXJyYXkgPSAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuXG4gIC8qKlxuICAgKlxuICAgKiBBZGRzIHRoZSBjbGFzcyB0byB0aGUgRWxlbWVudCBvciB0byB0aGUgTm9kZUxpc3QuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjIC0gPSB1bmRlZmluZWQ7IFRoZSBjbGFzcyB0byBiZSBhZGRlZC5cbiAgICpcbiAgICoqL1xuICBzZWxlY3Rvci5hZGRDbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCBhZGRDbGFzcyA9IGl0ZW0gPT4gaXRlbS5jbGFzc0xpc3QuYWRkKGMpXG4gICAgYXJyLmZvckVhY2goYWRkQ2xhc3MpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAZGVzYyBSZW1vdmVzIHRoZSBjbGFzcyB0byB0aGUgRWxlbWVudCBvciB0byB0aGUgTm9kZUxpc3QuXG4gICAqL1xuICBzZWxlY3Rvci5yZW1vdmVDbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCByZW1vdmVDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpXG4gICAgfVxuICAgIGFyci5mb3JFYWNoKHJlbW92ZUNsYXNzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQGRlc2MgU2V0cyB0aGUgY2xhc3MgdG8gZXF1YWwgZXhhY3RseSB0aGUgY2xhc3Mgc3RyaW5nLlxuICAgKi9cbiAgc2VsZWN0b3Iuc2V0Q2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgLyoqXG4gICAgKiBOT04gSUUgQ0xFQU5FUiBTT0xVVElPTlxuICAgICogY29uc3QgcmVtb3ZlQ2xhc3MgPSBpdGVtID0+IGl0ZW0uY2xhc3NMaXN0ID0gYztcbiAgICAqICBhcnIuZm9yRWFjaChyZW1vdmVDbGFzcyk7XG4gICAgKi9cblxuICAgIGNvbnN0IHNldFRoZUNsYXNzID0gaXRlbSA9PiB7XG4gICAgICBjb25zdCByZW1vdmVDbGFzc1N0ckFyciA9IGNvbXBvc2UocmVqZWN0KGlzRW1wdHkpLCBzcGxpdCgnICcpKShpdGVtLmNsYXNzTmFtZSlcbiAgICAgIGNvbnN0IGNsYXNzU3RyQXJyID0gYy5zcGxpdCgnICcpXG4gICAgICBjb25zdCByZW1vdmVyID0gcyA9PiBpdGVtLmNsYXNzTGlzdC5yZW1vdmUocylcbiAgICAgIGNvbnN0IGFkZGVyID0gc2VsID0+IGl0ZW0uY2xhc3NMaXN0LmFkZChzZWwpXG4gICAgICByZW1vdmVDbGFzc1N0ckFyci5mb3JFYWNoKHJlbW92ZXIpXG4gICAgICBjbGFzc1N0ckFyci5mb3JFYWNoKGFkZGVyKVxuICAgIH1cbiAgICBhcnIuZm9yRWFjaChzZXRUaGVDbGFzcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc2VsZWN0b3IudW5tb3VudCA9ICgpID0+IHtcbiAgICAvLyBjb25zb2xlLmxvZygndW5tb3VudGluZyBzZWxlY3RvciAnLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJvb2wgRGVmYXVsdCBpcyB1bmRlZmluZWQuXG4gICAqIEBkZXNjIFNldHMgdGhlIGNsYXNzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBib29sZWFuIG9yIHRoZSB0b2dnbGVzIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5wcm9wcy5lbCQudG9nZ2xlQ2xhc3MoJ215Y2xhc3MnLCB0cnVlKTtcbiAgICpcbiAgICovXG4gIHNlbGVjdG9yLnRvZ2dsZUNsYXNzID0gKGMsIGJvb2wpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IHRvZ2dsZUNsYXNzID0gaXRlbSA9PiB7XG4gICAgICBib29sID0gYm9vbCAhPT0gdW5kZWZpbmVkID8gYm9vbCA6ICFpdGVtLmNsYXNzTGlzdC5jb250YWlucyhjKVxuICAgICAgYm9vbCA/IGl0ZW0uY2xhc3NMaXN0LmFkZChjKSA6IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShjKVxuICAgIH1cbiAgICBhcnIuZm9yRWFjaCh0b2dnbGVDbGFzcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc2VsZWN0b3IudG9nZ2xlID0gKGMsIGJvb2wpID0+IHtcbiAgICBzZWxlY3Rvci50b2dnbGVDbGFzcyhjLCBib29sKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgaHRtbCB0byB0aGUgU2VsZWN0b3IncyBlbGVtZW50XG4gICAqIEBwYXJhbSBodG1sRWxlbWVudFxuICAgKi9cbiAgc2VsZWN0b3IuYXBwZW5kQ2hpbGQgPSAoaHRtbEVsZW1lbnQpID0+IHtcbiAgICBpZiAoc2VsZWN0b3IuZWwubGVuZ3RoICE9PSAwKSB7XG4gICAgICBzZWxlY3Rvci5lbC5hcHBlbmRDaGlsZChodG1sRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgc2VsZWN0b3IsICR7c2VsfSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgdmFsaWQhYClcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0b3IuZWxcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBZGRzIGNsYXNzIHdpdGggYSBkZWxheSBvZiAxbXMgdG8gYWxsb3cgY3NzIHRvIHJlZ2lzdGVyIGEgdHJhbnNpdGlvbi5cbiAgICogQHBhcmFtIGNcbiAgICovXG4gIHNlbGVjdG9yLmFkZEFuaW1DbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgZGVsYXlBZGRDbGFzcyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgICBjb25zdCBhZGRDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChjKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFyci5mb3JFYWNoKGFkZENsYXNzKVxuICAgIH1cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZGVsYXlBZGRDbGFzcylcbiAgICAvLyB3aW5kb3cuc2V0VGltZW91dChkZWxheUFkZENsYXNzLCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gZWxTZWwgVGhlIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudC5cbiAgICogQGRlc2MgU2V0cyB0aGUgY2xhc3MgYWN0aXZlIEhUTUxFbGVtZW50IGZyb20gYSBOb2RlTGlzdC5cbiAgICovXG4gIHNlbGVjdG9yLnNldEFjdGl2ZUl0ZW0gPSAoYywgZWxTZWwpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IGN1cnJlbnRFbCA9IHR5cGVvZiAoZWxTZWwpID09PSAnc3RyaW5nJyA/IGdldEVsT3JMaXN0KGN4dCwgZWxTZWwpIDogZWxTZWxcbiAgICBjb25zdCB0b2dnbGVCb29sID0gaXRlbSA9PiBpdGVtLmlzRXF1YWxOb2RlKGN1cnJlbnRFbCkgPyBpdGVtLmNsYXNzTGlzdC5hZGQoYykgOiBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoYylcbiAgICBpZiAoaXNOb2RlRWxlbWVudChjdXJyZW50RWwpID09PSB0cnVlKSB7XG4gICAgICBhcnIuZm9yRWFjaCh0b2dnbGVCb29sKVxuICAgIH0gZWxzZSBpZiAoaXNEZXZNb2RlKCkgPT09IHRydWUpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiU0VMIElTIFwiLGVsU2VsLGMpO1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgc2VsZWN0b3IsICR7ZWxTZWx9LCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB2YWxpZCBpdGVtIGluIHNldEFjdGl2ZUl0ZW06ICR7Y31gKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBmdW5jdGlvbiBlbFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBnZXR0ZXIgZm9yIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgYSBzaW5nbGUgZWxlbWVudCBvciBhIE5vZGVMaXN0IGZyb20gdGhlIHNlbGVjdG9yXG4gICAqL1xuXG4gIC8qKlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbGVuZ3RoXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIERldGVybWluZXMgdGhlIGxlbmd0aCBvZiB0aGUgTm9kZUxpc3RcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogVGhlIGxlbmd0aCBvZiB0aGUgc2VsZWN0b3IgYXMgYSBOb2RlTGlzdFxuICAgKi9cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGV4aXN0c1xuICAgKlxuICAgKiBAZGVzY1xuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gdGhlIHNlbGVjdGVkIGVsZW1lbnQgZXhpc3RzXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEJvb2xlYW5cbiAgICovXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZWwnLCB7IGdldDogKCkgPT4gZ2V0RWxPckxpc3QoY3h0LCBzZWwsIHRydWUpIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2VscycsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdsZW4nLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgZmFsc2UpLmxlbmd0aCB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdleGlzdHMnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgZmFsc2UpLmxlbmd0aCA+PSAxIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2V4aXN0JywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIGZhbHNlKS5sZW5ndGggPj0gMSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdub2RlTGlzdCcsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdhcnInLCB7XG4gICAgZ2V0OiAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGdldEVsT3JMaXN0KGN4dCwgc2VsLCB0cnVlKVxuICAgICAgaWYgKGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9IGVsc2UgaWYgKGVsLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbZWxdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlbClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnaW5saW5lJywgeyBzZXQ6ICh2YWwpID0+IHNldElubGluZUNzcyh2YWwsIGN4dCwgc2VsKSwgZ2V0OiAoKSA9PiBzZWxlY3RvciB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdpbmxpbmVDc3MnLCB7IHNldDogKHZhbCkgPT4gc2V0SW5saW5lQ3NzKHZhbCwgY3h0LCBzZWwpLCBnZXQ6ICgpID0+IHNlbGVjdG9yIH0pXG5cbiAgcmV0dXJuIHNlbGVjdG9yXG59XG5cbmV4cG9ydCB7IFZpZXdTdHJlYW1TZWxlY3RvciB9XG4iLCJpbXBvcnQgeyBiYXNlQ29yZU1peGlucyB9IGZyb20gJy4uL3V0aWxzL21peGlucy9iYXNlLWNvcmUtbWl4aW5zLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlLmpzJ1xuaW1wb3J0IHsgc2FmZUNsb25lIH0gZnJvbSAnLi4vdXRpbHMvc2FmZS1jbG9uZS5qcydcbmltcG9ydCB7XG4gIGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIsXG4gIGdldENvbnN0cnVjdG9yTmFtZVxufSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtRWxlbWVudCB9IGZyb20gJy4vdmlldy1zdHJlYW0tZWxlbWVudC5qcydcbmltcG9ydCB7IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcyB9IGZyb20gJy4uL2NoYW5uZWxzL2NoYW5uZWxzLWNvbmZpZy5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1Ccm9hZGNhc3RlciB9IGZyb20gJy4vdmlldy1zdHJlYW0tYnJvYWRjYXN0ZXIuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtUGF5bG9hZCB9IGZyb20gJy4vdmlldy1zdHJlYW0tcGF5bG9hZC5qcydcbmltcG9ydCB7IENoYW5uZWxQYXlsb2FkRmlsdGVyIH0gZnJvbSAnLi4vdXRpbHMvY2hhbm5lbC1wYXlsb2FkLWZpbHRlci5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1PYnNlcnZhYmxlIH0gZnJvbSAnLi4vdXRpbHMvdmlld3N0cmVhbS1vYnNlcnZhYmxlcy5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1TZWxlY3RvciB9IGZyb20gJy4vdmlldy1zdHJlYW0tc2VsZWN0b3IuanMnXG5pbXBvcnQgeyBTdWJqZWN0LCBvZiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtZXJnZU1hcCwgbWFwLCB0YWtlV2hpbGUsIGZpbHRlciwgdGFwLCBza2lwLCBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHtcbiAgcGljayxcbiAgY29tcG9zZSxcbiAgaXNOaWwsXG4gIGFsbCxcbiAgZm9yRWFjaCxcbiAgdG9Mb3dlcixcbiAgZWl0aGVyLFxuICBmaW5kSW5kZXgsXG4gIGFwcGx5LFxuICB0ZXN0LFxuICBmbGF0dGVuLFxuICBwcm9wLFxuICBhbHdheXMsXG4gIGx0ZSxcbiAgZGVmYXVsdFRvLFxuICBwcm9wU2F0aXNmaWVzLFxuICBhbGxQYXNzLFxuICBjdXJyeSxcbiAgaXMsXG4gIHNsaWNlLFxuICBwYXRoLFxuICBvbWl0LFxuICBpZkVsc2UsXG4gIG1lcmdlUmlnaHQsXG4gIHdoZXJlLFxuICBlcXVhbHNcbiAgLCBtYXAgYXMgck1hcFxufSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW0ge1xuICAvKipcbiAgICogQG1vZHVsZSBWaWV3U3RyZWFtXG4gICAqXG4gICAqIEBkZXNjXG4gICAqXG4gICAqIDxwPlZpZXdTdHJlYW0gaXMgdGhlIGludGVyYWN0aXZlLXZpZXcgY29tcG9uZW50LCBhbmQgaXRzIGNvcmUgZnVuY3Rpb25hbGl0eSBpcyBjb21wcmlzZWQgb2YgdHdvIGludGVybmFsIGNvbXBvbmVudHM6IDwvcD5cbiAgIDx1bCBjbGFzcz0nYmFzaWMnPlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIHRoaXMudnNudW0gPSBNYXRoLnJhbmRvbSgpXG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIHRoaXMuX3Bvc3RSZW5kZXJDYWxsZWQgPSBmYWxzZVxuICAgIHRoaXMuZGVmYXVsdHMgPSAoKSA9PiB7XG4gICAgICBjb25zdCB2c2lkID0gdGhpcy5jcmVhdGVJZCgpXG4gICAgICBjb25zdCBpZCA9IHByb3BzLmlkID8gcHJvcHMuaWQgOiB2c2lkXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2c2lkLFxuICAgICAgICBpZCxcbiAgICAgICAgdGFnTmFtZTogJ2RpdicsXG4gICAgICAgIGVsOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgYW5pbWF0ZUluOiBmYWxzZSxcbiAgICAgICAgYW5pbWF0ZUluVGltZTogMC41LFxuICAgICAgICBhbmltYXRlT3V0OiBmYWxzZSxcbiAgICAgICAgYW5pbWF0ZU91dFRpbWU6IDAuNSxcbiAgICAgICAgc2VuZExpZmVjeWxlRXZlbnRzOiBmYWxzZSxcbiAgICAgICAgaGFzaElkOiBgIyR7aWR9YCxcbiAgICAgICAgaWQkOiBgIyR7aWR9YCxcbiAgICAgICAgdmlld0NsYXNzOiBWaWV3U3RyZWFtRWxlbWVudCxcbiAgICAgICAgZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHM6IHt9LFxuICAgICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICAgIHRlbXBsYXRlOiB1bmRlZmluZWQsXG4gICAgICAgIG5vZGU6IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcbiAgICAgICAgbmFtZTogZ2V0Q29uc3RydWN0b3JOYW1lKHRoaXMpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlID0ge31cbiAgICB0aGlzLiRkaXJzID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0KClcbiAgICB0aGlzLmFkZERlZmF1bHREaXJlY3Rpb24gPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5hZGREZWZhdWx0RGlyXG4gICAgdGhpcy5hZGREb3duSW50ZXJuYWxEaXIgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5hZGREb3duSW50ZXJuYWxEaXJcbiAgICAvLyB0aGlzLnByb3BzID0gT2JqZWN0LmFzc2lnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1RuKHt9LCB0aGlzLmRlZmF1bHRzKCksIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gZGVlcE1lcmdlKHRoaXMuZGVmYXVsdHMoKSwgcHJvcHMpXG4gICAgdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kID0gdGhpcy5wcm9wcy5zZW5kTGlmZWN5bGVFdmVudHMgPT09IHRydWUgPyB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2RBY3RpdmUuYmluZCh0aGlzKSA6IHRoaXMuc2VuZExpZmVjeWNsZU1ldGhvZEluYWN0aXZlLmJpbmQodGhpcylcbiAgICBjb25zdCBhdHRyaWJ1dGVzQXJyID0gdGhpcy5hdHRyaWJ1dGVzQXJyYXlcbiAgICAvLyBsZXQgYXR0cmlidXRlc0FyciA9IFsnaWQnLCAnY2xhc3MnLCAnZGF0YXNldCddO1xuICAgIHRoaXMucHJvcHMuZG9tQXR0cmlidXRlcyA9IHBpY2soYXR0cmlidXRlc0FyciwgdGhpcy5wcm9wcylcbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hZGRUcmFpdHModGhpcy5wcm9wcy50cmFpdHMpXG4gICAgfVxuICAgIHRoaXMubG9hZEFsbE1ldGhvZHMoKVxuICAgIHRoaXMucHJvcHMuYWN0aW9uID0gJ0xPQURFRCdcbiAgICB0aGlzLnNpbmskID0gbmV3IFN1YmplY3QoKVxuICAgIHRoaXMucHJvcHMuZWxJc0FscmVhZHlSZW5kZXJlZEJvb2wgPSB0aGlzLmVsQWxyZWFkeUV4aXN0c0ZuKHRoaXMucHJvcHMpXG4gICAgY29uc3QgVmlld0NsYXNzID0gdGhpcy5wcm9wcy52aWV3Q2xhc3NcbiAgICB0aGlzLnZpZXcgPSBuZXcgVmlld0NsYXNzKHRoaXMuc2luayQsIHsgZWw6dGhpcy5wcm9wcy5lbCB9LCB0aGlzLnByb3BzLnZzaWQsIHRoaXMucHJvcHMuaWQpLy8gbmV3IHRoaXMucHJvcHMudmlld0NsYXNzKHRoaXMuc2luayQpO1xuICAgIHRoaXMuc291cmNlU3RyZWFtcyA9IHRoaXMudmlldy5zb3VyY2VTdHJlYW1zXG4gICAgdGhpcy5fcmF3U291cmNlJCA9IHRoaXMudmlldy5nZXRTb3VyY2VTdHJlYW0oKVxuICAgIHRoaXMuX3Jhd1NvdXJjZSQudmlld05hbWUgPSB0aGlzLnByb3BzLm5hbWVcbiAgICB0aGlzLnNlbmRFdmVudHNEb3duU3RyZWFtID0gdGhpcy5zZW5kRXZlbnRzRG93blN0cmVhbUZuXG4gICAgdGhpcy5pbml0Vmlld1N0cmVhbSgpXG4gICAgdGhpcy5pc0Rldk1vZGUgPSBWaWV3U3RyZWFtLmlzRGV2TW9kZSgpXG4gICAgdGhpcy5wcm9wcy5hZGRlZENoYW5uZWxzID0gW11cbiAgICB0aGlzLmNoZWNrSWZFbGVtZW50QWxyZWFkeUV4aXN0cygpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIQVNIIEtFWSBBTkQgU1BJR09UIE1FVEhPRFM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZ2V0IHNvdXJjZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZSRcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVzQXJyYXkoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIEdsb2JhbCBBdHRyaWJ1dGVzXG4gICAgICAnYWNjZXNza2V5JywgJ2NsYXNzJywgJ2NvbnRlbnRlZGl0YWJsZScsICdkaXInLCAnZHJhZ2dhYmxlJywgJ2hpZGRlbicsICdpZCcsICdsYW5nJywgJ3NwZWxsY2hlY2snLCAnc3R5bGUnLCAndGFiaW5kZXgnLCAndGl0bGUnLCAndHJhbnNsYXRlJyxcblxuICAgICAgLy8gQWNjZXNzaWJsaXR5IEF0dHJpYnV0ZXNcbiAgICAgICdhcmlhLWF1dG9jb21wbGV0ZScsICdhcmlhLWNoZWNrZWQnLCAnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWV4cGFuZGVkJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1oaWRkZW4nLCAnYXJpYS1pbnZhbGlkJywgJ2FyaWEtbGFiZWwnLCAnYXJpYS1sZXZlbCcsICdhcmlhLW11bHRpbGluZScsICdhcmlhLW11bHRpc2VsZWN0YWJsZScsICdhcmlhLW9yaWVudGF0aW9uJywgJ2FyaWEtcHJlc3NlZCcsICdhcmlhLXJlYWRvbmx5JywgJ2FyaWEtcmVxdWlyZWQnLCAnYXJpYS1zZWxlY3RlZCcsICdhcmlhLXNvcnQnLCAnYXJpYS12YWx1ZW1heCcsICdhcmlhLXZhbHVlbWluJywgJ2FyaWEtdmFsdWVub3cnLCAnYXJpYS12YWx1ZXRleHQnLCAnYXJpYS1hdG9taWMnLCAnYXJpYS1idXN5JywgJ2FyaWEtbGl2ZScsICdhcmlhLXJlbGV2YW50JywgJ2FyaWEtZHJvcGVmZmVjdCcsICdhcmlhLWdyYWJiZWQnLCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JywgJ2FyaWEtY29udHJvbHMnLCAnYXJpYS1kZXNjcmliZWRieScsICdhcmlhLWZsb3d0bycsICdhcmlhLWxhYmVsbGVkYnknLCAnYXJpYS1vd25zJywgJ2FyaWEtcG9zaW5zZXQnLCAnYXJpYS1zZXRzaXplJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgaW5wdXRcbiAgICAgICdhY2NlcHQnLCAnYXV0b2NvbXBsZXRlJywgJ2F1dG9mb2N1cycsICdjaGVja2VkJywgJ2Rpcm5hbWUnLCAnZGlzYWJsZWQnLCAnZm9ybScsICdmb3JtYWN0aW9uJyxcbiAgICAgICdmb3JtZW5jdHlwZScsICdmb3JtbWV0aG9kJywgJ2Zvcm1ub3ZhbGlkYXRlJywgJ2Zvcm10YXJnZXQnLCAnbGlzdCcsICdtYXgnLCAnbWF4bGVuZ3RoJyxcbiAgICAgICdtaW4nLCAnbWlubGVuZ3RoJywgJ211bHRpcGxlJywgJ25hbWUnLCAncGF0dGVybicsICdwbGFjZWhvbGRlcicsICdyZWFkb25seScsICdyZXF1aXJlZCcsICdzaXplJywgJ3N0ZXAnLCAndmFsdWUnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBpbWdcbiAgICAgICdhbHQnLCAnc3Jjc2V0JywgJ3NpemVzJywgJ3VzZW1hcCcsICdpc21hcCcsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGEgYW5kIGxpbmtcbiAgICAgICdocmVmJywgJ3RhcmdldCcsICdkb3dubG9hZCcsICdwaW5nJywgJ3JlbCcsICdocmVmbGFuZycsICdhcycsICdtZWRpYScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGZvcm1cbiAgICAgICdhY2NlcHQtY2hhcnNldCcsICdhY3Rpb24nLCAnZW5jdHlwZScsICdub3ZhbGlkYXRlJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgbWV0YVxuICAgICAgJ2NvbnRlbnQnLCAnY2hhcnNldCcsICdodHRwLWVxdWl2JyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3Igc2NyaXB0XG4gICAgICAnYXN5bmMnLCAnZGVmZXInLCAnaW50ZWdyaXR5JywgJ25vbW9kdWxlJywgJ25vbmNlJywgJ3JlZmVycmVycG9saWN5JyxcblxuICAgICAgLy8gT3RoZXIgRWxlbWVudC1zcGVjaWZpYyBBdHRyaWJ1dGVzXG4gICAgICAnYXV0b2NhcGl0YWxpemUnLCAnYXV0b3BsYXknLCAnYnVmZmVyZWQnLCAnY2hhbGxlbmdlJywgJ2NpdGUnLCAnY29kZScsICdjb2RlYmFzZScsICdjb2xvcicsICdjb2xzJywgJ2NvbHNwYW4nLCAnY29udGV4dG1lbnUnLCAnY29udHJvbHMnLCAnY29vcmRzJywgJ2Nyb3Nzb3JpZ2luJywgJ2NzcCcsICdkYXRhc2V0JywgJ2RhdGV0aW1lJywgJ2RlY29kaW5nJywgJ2RlZmF1bHQnLCAnZm9yJywgJ2hlYWRlcnMnLCAnaGlnaCcsICdpY29uJywgJ2ltcG9ydGFuY2UnLCAnaXRlbXByb3AnLCAna2V5dHlwZScsICdraW5kJywgJ2xhYmVsJywgJ2xhbmd1YWdlJywgJ2xhenlsb2FkJywgJ2xvb3AnLCAnbG93JywgJ21hbmlmZXN0JywgJ21ldGhvZCcsICdtdXRlZCcsICdvcGVuJywgJ29wdGltdW0nLCAncG9zdGVyJywgJ3ByZWxvYWQnLCAncmFkaW9ncm91cCcsICdyZXZlcnNlZCcsICdyb2xlJywgJ3Jvd3MnLCAncm93c3BhbicsICdzYW5kYm94JywgJ3Njb3BlJywgJ3Njb3BlZCcsICdzZWxlY3RlZCcsICdzaGFwZScsICdzbG90JywgJ3NwYW4nLCAnc3JjZG9jJywgJ3NyYycsICd0eXBlJywgJ3NyY2xhbmcnLCAnc3RhcnQnLCAnc3VtbWFyeScsICd3cmFwJywgJ3dpZHRoJywgJ2hlaWdodCdcbiAgICBdXG4gIH1cblxuICBzdGF0aWMgaXNEZXZNb2RlKCkge1xuICAgIHJldHVybiBTcHluZUFwcFByb3BlcnRpZXMuZGVidWdcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmQWN0aW9uc0FyZVJlZ2lzdGVyZWQoY2hhbm5lbHNBcnIgPSBbXSwgYWN0aW9uc0Fycikge1xuICAgIGlmIChhY3Rpb25zQXJyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdldEFsbEFjdGlvbnMgPSAoYSkgPT4ge1xuICAgICAgICBjb25zdCBnZXRSZWdpc3RlcmVkQWN0aW9uc0FyciA9IChzdHIpID0+IFNweW5lQXBwUHJvcGVydGllcy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpXG4gICAgICAgIGNvbnN0IGFyciA9ICBhLm1hcChnZXRSZWdpc3RlcmVkQWN0aW9uc0FycilcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW4oYXJyKVxuICAgICAgfVxuICAgICAgY29uc3QgY2hlY2tGb3JNYXRjaCA9IChzdHJNYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoc3RyTWF0Y2gpXG4gICAgICAgIGNvbnN0IGFjdGlvbkluZGV4ID0gZmluZEluZGV4KHRlc3QocmUpLCBnZXRBbGxBY3Rpb25zQXJyKVxuICAgICAgICBpZiAoYWN0aW9uSW5kZXggPCAwKSB7XG4gICAgICAgICAgY29uc3QgY2hhbm5lbFN5bnRheCA9IGNoYW5uZWxzQXJyLmxlbmd0aCA9PT0gMSA/ICdmcm9tIGFkZGVkIGNoYW5uZWwnIDogJ2Zyb20gYWRkZWQgY2hhbm5lbHMnXG4gICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYWN0aW9uLCAke3N0ck1hdGNofSwgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgYWN0aW9ucyAke2NoYW5uZWxTeW50YXh9LCAke2NoYW5uZWxzQXJyLmpvaW4oJywgJyl9YClcbiAgICAgICAgfVxuICAgICAgICAvLyAgY29uc3QgdnNudW0gPSAoKT0+IFIudGVzdChuZXcgUmVnRXhwKHN0ciksIFwiQ0hBTk5FTF9ST1VURV9URVNUX0VWRU5UXCIpXG4gICAgICB9XG4gICAgICBjb25zdCBnZXRBbGxBY3Rpb25zQXJyID0gZ2V0QWxsQWN0aW9ucyhjaGFubmVsc0FycilcbiAgICAgIGFjdGlvbnNBcnIuZm9yRWFjaChjaGVja0Zvck1hdGNoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBZGQgYW55IHF1ZXJ5IHdpdGhpbiB0aGUgVmlld1N0cmVhbSdzIGRvbSBhbmQgYW55IGRvbSBldmVudHMgdG8gYXV0b21hdGljYWxseSBiZSBvYnNlcnZlZCBieSB0aGUgVUkgQ2hhbm5lbC5cbiAgICogPGJyPlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgYnJvYWRjYXN0RXZlbnRzKCkge1xuICAgKiAgLy8gQUREIEJVVFRPTiBFVkVOVFMgQVMgTkVTVEVEIEFSUkFZU1xuICAgKiAgcmV0dXJuIFtcbiAgICogICAgICAgWycjbXktYnV0dG9uJywgJ21vdXNlb3ZlciddLFxuICAgKiAgICAgICBbJyNteS1pbnB1dCcsICdjaGFuZ2UnXVxuICAgKiAgICAgXVxuICAgKiAgIH1cbiAgICpcbiAgICpcbiAgICogKi9cblxuICBzdGF0aWMgaXNWYWxpZE5lc3RlZEFycihldmVudHNBcnIpIHtcbiAgICBjb25zdCBpc1RydWUgPSBlcXVhbHModHJ1ZSlcbiAgICBjb25zdCBhbGxJc1RydWUgPSBhbGwoaXNUcnVlKVxuICAgIGNvbnN0IGlzU3RyaW5nID0gaXMoU3RyaW5nKVxuICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBjb21wb3NlKGFsbElzVHJ1ZSwgck1hcChpc1N0cmluZyksIHNsaWNlKDAsIDIpLCBkZWZhdWx0VG8oW10pKVxuICAgIGNvbnN0IG1hcEV2ZW50c0FyckZuID0gY29tcG9zZShhbGxJc1RydWUsIHJNYXAoaXNWYWxpZEFyciksIGRlZmF1bHRUbyhbXSkpXG4gICAgcmV0dXJuIG1hcEV2ZW50c0FyckZuKGV2ZW50c0FycilcbiAgfVxuXG4gIHN0YXRpYyBlbElzRG9tRWxlbWVudChvKSB7XG4gICAgaWYgKGlzKFN0cmluZywgbykpIHtcbiAgICAgIG8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG8pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKShvKVxuICB9XG5cbiAgdXBkYXRlUHJvcHNUb01hdGNoRWwoKSB7XG4gICAgY29uc3QgZ2V0VGFnTmFtZSA9IGNvbXBvc2UodG9Mb3dlciwgZWl0aGVyKHByb3AoJ3RhZ05hbWUnKSwgYWx3YXlzKCcnKSkpXG4gICAgdGhpcy5wcm9wcy50YWdOYW1lID0gZ2V0VGFnTmFtZSh0aGlzLnByb3BzLmVsKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGVsQWxyZWFkeUV4aXN0c0ZuKHByb3BzKSB7XG4gICAgY29uc3QgZWxJc0RvbUVsZW1lbnQgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcbiAgICBjb25zdCBlbElzUmVuZGVyZWQgPSBlbCA9PiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKVxuICAgIHJldHVybiBwcm9wU2F0aXNmaWVzKGFsbFBhc3MoW2VsSXNSZW5kZXJlZCwgZWxJc0RvbUVsZW1lbnRdKSwgJ2VsJykocHJvcHMpXG4gIH1cblxuICBjaGVja0lmRWxlbWVudEFscmVhZHlFeGlzdHMoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZWxJc0FscmVhZHlSZW5kZXJlZEJvb2wgPT09IHRydWUpIHtcbiAgICAgIHRoaXMudXBkYXRlUHJvcHNUb01hdGNoRWwoKVxuICAgICAgdGhpcy5wb3N0UmVuZGVyKClcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuZWwgPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNweW5lIEVycm9yOiBUaGUgZGVmaW5lZCBlbGVtZW50IGZvciB0aGlzIFZpZXdTdHJlYW0gaW5zdGFuY2UsICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSwgYXBwZWFycyB0byBub3QgZXhpc3QuYClcbiAgICB9XG4gIH1cblxuICBsb2FkQWxsTWV0aG9kcygpIHtcbiAgICBjb25zdCBjaGFubmVsRm4gPSBjdXJyeSh0aGlzLm9uQ2hhbm5lbE1ldGhvZENhbGwuYmluZCh0aGlzKSlcbiAgICBjb25zdCBjcmVhdGVFeHRyYVN0YXRlc01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgIGxldCBbYWN0aW9uLCBmdW5jU3RyLCBhY3Rpb25GaWx0ZXJdID0gYXJyXG4gICAgICBpZiAoaXMoU3RyaW5nLCBhY3Rpb25GaWx0ZXIpKSB7XG4gICAgICAgIGFjdGlvbkZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcih7IHNlbGVjdG9yOmFjdGlvbkZpbHRlciB9KVxuICAgICAgfVxuICAgICAgdGhpcy5wcm9wcy5leHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kc1thY3Rpb25dID0gY2hhbm5lbEZuKGZ1bmNTdHIsXG4gICAgICAgIGFjdGlvbkZpbHRlcilcbiAgICB9XG4gICAgdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKS5mb3JFYWNoKGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kKVxuICAgIHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHMgPSB0aGlzLnNldFNvdXJjZUhhc2hNZXRob2RzKFxuICAgICAgdGhpcy5wcm9wcy5leHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcylcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBjaGFubmVsIGFjdGlvbnMgdG8gbG9jYWwgbWV0aG9kcywgZm9ybWF0dGVkIGFzIGFycmF5IHZhbHVlcy5cbiAgICogPHVsPlxuICAgKiA8bGk+PGI+Rmlyc3QgdmFsdWU6PC9iPiBBY3Rpb24gbmFtZSwgYXMgYSBzdHJpbmcgb3IgYXMgYSBiYXNpYyBSZWd1bGFyIEV4cHJlc3Npb24uXG4gICAqIDxsaT48Yj5TZWNvbmQgdmFsdWU6PC9iPiBUaGUgbWV0aG9kIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBhY3Rpb24gaXMgcHVibGlzaGVkLlxuICAgKiA8bGk+PGI+VGhpcmQgb3B0aW9uYWwgdmFsdWU6PC9iPiBUaGlzIGlzIGEgZmlsdGVyIG9wdGlvbiB0aGF0IGNhbiBiZSBhIHNlbGVjdG9yIHN0cmluZy4gb3IgYW4gaW5zdGFuY2Ugb2YgdGhlIExJTktbJ2NoYW5uZWxQYXlsb2FkRmlsdGVyJywgJ2NoYW5uZWwtcGF5bG9hZC1maWx0ZXInXS5cbiAgICogPC91bD5cbiAgICogQGV4YW1wbGVcbiAgICogICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICByZXR1cm4gW1xuICAgKiAgICAgWydDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJywgJ29uQ2xpY2tFdmVudCcsICdsaS5teWNsYXNzJ10sXG4gICAqICAgICBbJ0NIQU5ORUxfTVlfQ1VTVE9NX0VWRU5UJywgJ29uQWN0aW9uUmV0dXJuZWQnXVxuICAgKiAgICAgICAgICAgIF1cbiAgICogICAgICAgICAgIH1cbiAgICpcbiAgICogQHJldHVybnMgTmVzdGVkIEFycmF5XG4gICAqL1xuICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBvbkNoYW5uZWxNZXRob2RDYWxsKHN0ciwgYWN0aW9uRmlsdGVyLCBwKSB7XG4gICAgY29uc3QgcnVuRnVuYyA9IChwYXlsb2FkKSA9PiB7XG4gICAgICBpZiAodGhpc1tzdHJdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWV0aG9kLCAke3N0cn0gZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IGluICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSFgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tzdHJdKHBheWxvYWQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHAuJGRpciAhPT0gdW5kZWZpbmVkICYmIHAuJGRpci5pbmNsdWRlcygnY2hpbGQnKSAmJlxuICAgICAgICB0aGlzLmRlbGV0ZWQgIT09IHRydWUpIHtcbiAgICAgIGNvbnN0IG9iaiA9IGRlZXBNZXJnZSh7fSwgcCkvLyBPYmplY3QuYXNzaWduKHt9LCBwKTtcbiAgICAgIG9iai4kZGlyID0gdGhpcy4kZGlycy5DXG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMucmF3JC5uZXh0KG9iailcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyUGF5bG9hZCA9IGRlZmF1bHRUbyhhbHdheXModHJ1ZSksIGFjdGlvbkZpbHRlcilcblxuICAgIGlmIChmaWx0ZXJQYXlsb2FkKHApID09PSB0cnVlKSB7XG4gICAgICBwID0gb21pdChbJyRkaXInXSwgcClcbiAgICAgIHJ1bkZ1bmMocClcbiAgICB9XG4gIH1cblxuICBzZXRTb3VyY2VIYXNoTWV0aG9kcyhleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcyA9IHt9KSB7XG4gICAgY29uc3QgaGFzaFNvdXJjZUtleXMgPSB7XG4gICAgICBFWFRJUlBBVElORzogKHApID0+IHRoaXMuY2hlY2tQYXJlbnREaXNwb3NlKHApLFxuICAgICAgRVhUSVJQQVRFOiAocCkgPT4gdGhpcy5kaXNwb3NlVmlld1N0cmVhbShwKSxcbiAgICAgIC8vICdDSElMRF9FWFRJUlBBVEUnICAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKHApLFxuICAgICAgVlNfU1BBV05FRDogKHApID0+IHRoaXMub25WU1JlbmRlcmVkKHApLFxuICAgICAgVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NOiAocCkgPT4gdGhpcy5vblZTUmVuZGVyZWQocCksXG4gICAgICBWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQ6IChwKSA9PiB0aGlzLm9uVlNSZW5kZXJlZChwKSxcbiAgICAgIC8vICdDSElMRF9WU19TUEFXTkVEJyAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLmF0dGFjaENoaWxkVG9WaWV3KHApLFxuICAgICAgUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1Q6IChwKSA9PiB0aGlzLm9uUmVhZHlUb0dDKHApLFxuICAgICAgVlNfTlVMTElUWTogKCkgPT4gKHt9KVxuICAgIH1cbiAgICByZXR1cm4gZGVlcE1lcmdlLmFsbChbe30sIGhhc2hTb3VyY2VLZXlzLCBleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kc10pXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IE1BSU4gU1RSRUFNIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaW5pdFZpZXdTdHJlYW0oKSB7XG4gICAgdGhpcy5fc291cmNlJCA9IHRoaXMuX3Jhd1NvdXJjZSQucGlwZShtYXAoXG4gICAgICAocGF5bG9hZCkgPT4gdGhpcy5vbk1hcFZpZXdTb3VyY2UocGF5bG9hZCkpLCB0YWtlV2hpbGUodGhpcy5ub3RHQ1NUQVRFKSlcblxuICAgIHRoaXMuaW5pdEF1dG9NZXJnZVNvdXJjZVN0cmVhbXMoKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKHRoaXMuX3NvdXJjZSQsIHRydWUpXG4gIH1cblxuICBub3RHQ1NUQVRFKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpXG4gIH1cblxuICBlcUdDU1RBVEUocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJylcbiAgfVxuXG4gIG5vdENPTVBMRVRFRChwKSB7XG4gICAgcmV0dXJuICFwLmFjdGlvbi5pbmNsdWRlcygnQ09NUExFVEVEJylcbiAgfVxuXG4gIG5vdEdDQ09NUExFVEUocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ0dDX0NPTVBMRVRFJylcbiAgfVxuXG4gIHRlc3RWYWwocCkge1xuICAgIGNvbnNvbGUubG9nKCdURVNUSU5HIFZBTEwgSVMgJywgcClcbiAgfVxuXG4gIGFkZFBhcmVudFN0cmVhbShvYnMsIGF0dGFjaERhdGEpIHtcbiAgICBjb25zdCBmaWx0ZXJPdXROdWxsRGF0YSA9IChkYXRhKSA9PiBkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YS5hY3Rpb24gIT09XG4gICAgICAgIHVuZGVmaW5lZFxuICAgIGNvbnN0IGNoZWNrSWZEaXNwb3NlT3JGYWRlb3V0ID0gKGQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBkZWVwTWVyZ2Uoe30sIGQpXG5cbiAgICAgIGlmIChkYXRhLmFjdGlvbiA9PT0gJ0VYVElSUEFURV9BTkRfUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0oZGF0YSlcbiAgICAgICAgZGF0YS5hY3Rpb24gPSAnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHRoaXMucGFyZW50JCA9IG9icy5waXBlKFxuICAgICAgZmlsdGVyKGZpbHRlck91dE51bGxEYXRhKSxcbiAgICAgIG1hcChjaGVja0lmRGlzcG9zZU9yRmFkZW91dCkpXG4gICAgdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24odGhpcy5wYXJlbnQkLCBmYWxzZSwgJ1BBUkVOVCcpXG4gICAgdGhpcy5yZW5kZXJBbmRBdHRhY2hUb1BhcmVudChhdHRhY2hEYXRhKVxuICB9XG5cbiAgYWRkQ2hpbGRTdHJlYW0ob2JzJCkge1xuICAgIGNvbnN0IGZpbHRlck91dE51bGxEYXRhID0gKGRhdGEpID0+IGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhLmFjdGlvbiAhPT1cbiAgICAgICAgdW5kZWZpbmVkXG4gICAgY29uc3QgY2hpbGQkID0gb2JzJC5waXBlKFxuICAgICAgZmlsdGVyKGZpbHRlck91dE51bGxEYXRhKSxcbiAgICAgIHRhcChwID0+IHRoaXMudHJhY2VyKCdhZGRDaGlsZFN0cmFlbSBkbyAnLCBwKSksXG4gICAgICBtYXAoKHApID0+IHtcbiAgICAgICAgcmV0dXJuIHBcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUocCA9PiB0aGlzLm9uQ2hpbGRDb21wbGV0ZWQoY2hpbGQkLnNvdXJjZSkpKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKGNoaWxkJCwgdHJ1ZSwgJ0NISUxEJylcbiAgfVxuXG4gIG9uQ2hpbGREaXNwb3NlZChwKSB7XG5cbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBvbkNoaWxkQ29tcGxldGVkKHApIHtcbiAgICBjb25zdCBmaW5kTmFtZSA9ICh4KSA9PiB7XG4gICAgICBjb25zdCBmaW5hbERlc3QgPSAoeSkgPT4ge1xuICAgICAgICB3aGlsZSAoeS5kZXN0aW5hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgeSA9IGZpbmFsRGVzdCh5LmRlc3RpbmF0aW9uKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5XG4gICAgICB9XG4gICAgICByZXR1cm4gcGljayhbJ2lkJywgJ3ZzaWQnXSwgZmluYWxEZXN0KHgpKVxuICAgIH1cbiAgICBjb25zdCBjaGlsZENvbXBsZXRlZERhdGEgPSBmaW5kTmFtZShwKVxuICAgIHRoaXMudHJhY2VyKCdvbkNoaWxkQ29tcGxldGVkICcsIHRoaXMudnNudW0sIHApXG4gICAgLy8gY29uc29sZS5sb2coJ29iaiBpcyAnLGNoaWxkQ29tcGxldGVkTmFtZSxvYmosdGhpcy5wcm9wcyk7XG4gICAgdGhpcy5vbkNoaWxkRGlzcG9zZWQoY2hpbGRDb21wbGV0ZWREYXRhLCBwKVxuICAgIHJldHVybiBjaGlsZENvbXBsZXRlZERhdGFcbiAgfVxuXG4gIGluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zKCkge1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT0gU1VCU0NSSVBUSU9OIFNPVVJDRSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3Qgc3Vic2NyaWJlciA9IHtcbiAgICAgIG5leHQ6IHRoaXMub25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0LmJpbmQodGhpcyksXG4gICAgICBlcnJvcjogdGhpcy5vblN1YnNjcmliZVRvU291cmNlc0Vycm9yLmJpbmQodGhpcyksXG4gICAgICBjb21wbGV0ZTogdGhpcy5vblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlLmJpbmQodGhpcylcbiAgICB9XG4gICAgLy8gbGV0IHRha2VCZWZvcmVHQ09sZCA9ICh2YWwpID0+IHZhbC5hY3Rpb24gIT09ICdWU19ERVRSSVRVU19DT0xMRUNURUQnO1xuICAgIC8vIGxldCB0YWtlQmVmb3JlR0MgPSAocCkgPT4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpO1xuICAgIC8vIGxldCBtYXBUb1N0YXRlID0gKHZhbCkgPT4gKHthY3Rpb246dmFsfSk7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vID09PT09PT09PT0gTUVUSE9EUyBUTyBDSEVDSyBGT1IgV0hFTiBUTyBDT01QTEVURSBUSEUgU1RSRUFNID09PT09PT09PVxuICAgIGNvbnN0IGNvbXBsZXRlQWxsID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5lbCQgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudWJlclNvdXJjZSQuY29tcGxldGUoKVxuICAgICAgdGhpcy5hdXRvU3Vic2NyaWJlciQuY29tcGxldGUoKVxuICAgICAgdGhpcy5zaW5rJC5jb21wbGV0ZSgpXG4gICAgICB0aGlzLnByb3BzID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmRlbGV0ZWQgPSB0cnVlXG4gICAgICB0aGlzLnRyYWNlcignY29tcGxldGVBbGwnLCB0aGlzLmRlbGV0ZWQsIHRoaXMucHJvcHMpXG4gICAgfVxuICAgIGNvbnN0IGRlY3JlbWVudE9uT2JzZXJ2YWJsZUNsb3NlZCA9ICgpID0+IHtcbiAgICAgIG9ic0NvdW50IC09IDFcbiAgICAgIGlmIChvYnNDb3VudCA9PT0gMCkge1xuICAgICAgICBjb21wbGV0ZUFsbCgpXG4gICAgICB9XG4gICAgfVxuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gSU5JVCBTVFJFQU0gTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgb2JzQ291bnQgPSAwXG4gICAgdGhpcy51YmVyU291cmNlJCA9IG5ldyBTdWJqZWN0KClcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBDT01QT1NFRCBSWEpTIE9CU0VSVkFCTEUgPT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IGluY3JlbWVudE9ic2VydmFibGVzVGhhdENsb3NlcyA9ICgpID0+IHsgb2JzQ291bnQgKz0gMSB9XG4gICAgdGhpcy5hdXRvTWVyZ2VTdWJqZWN0JCA9IHRoaXMudWJlclNvdXJjZSQucGlwZShtZXJnZU1hcCgob2JzRGF0YSkgPT4ge1xuICAgICAgY29uc3QgYnJhbmNoT2JzZXJ2YWJsZSQgPSBvYnNEYXRhLm9ic2VydmFibGUucGlwZShmaWx0ZXIoXG4gICAgICAgIChwKSA9PiBwICE9PSB1bmRlZmluZWQgJiYgcC5hY3Rpb24gIT09IHVuZGVmaW5lZCksIG1hcChwID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1BBWUxPQUQgSVMgJywgcCwgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKVxuICAgICAgICBjb25zdCBwYXlsb2FkID0gZGVlcE1lcmdlKHt9LCBwKVxuICAgICAgICBwYXlsb2FkLmFjdGlvbiA9IHAuYWN0aW9uLy8gYWRkUmVsYXRpb25Ub1N0YXRlKG9ic0RhdGEucmVsLCBwLmFjdGlvbik7XG4gICAgICAgIHRoaXMudHJhY2VyKCdhdXRvTWVyZ2VTdWJqZWN0JCcsIHBheWxvYWQpXG4gICAgICAgIHJldHVybiBwYXlsb2FkXG4gICAgICB9KSlcblxuICAgICAgaWYgKG9ic0RhdGEuYXV0b0Nsb3Nlc0Jvb2wgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBicmFuY2hPYnNlcnZhYmxlJFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jcmVtZW50T2JzZXJ2YWJsZXNUaGF0Q2xvc2VzKClcbiAgICAgICAgcmV0dXJuIGJyYW5jaE9ic2VydmFibGUkLnBpcGUoZmluYWxpemUoZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkKSlcbiAgICAgIH1cbiAgICB9KSlcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVUJTQ1JJQkVSID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHRoaXMuYXV0b1N1YnNjcmliZXIkID0gdGhpcy5hdXRvTWVyZ2VTdWJqZWN0JFxuICAgIC8vIC5kbygocCkgPT4gY29uc29sZS5sb2coJ1NJTksgREFUQSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIHApKVxuICAgICAgLnBpcGUoZmlsdGVyKChwKSA9PiBwICE9PSB1bmRlZmluZWQgJiYgcC5hY3Rpb24gIT09IHVuZGVmaW5lZCkpXG4gICAgICAuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IE1FUkdFIFNUUkVBTVMgVE8gTUFJTiBTVUJTQ1JJQkVSID09PT09PT09PT09PT09PT09XG4gIHVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbihvYnMkLCBhdXRvQ2xvc2VzQm9vbCA9IGZhbHNlLCByZWwpIHtcbiAgICAvLyBjb25zdCBkaXJlY3Rpb25BcnIgPSBzZW5kRG93blN0cmVhbSA9PT0gdHJ1ZSA/IHRoaXMuJGRpcnMuREkgOiB0aGlzLiRkaXJzLkk7XG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgb2JzZXJ2YWJsZTogb2JzJCxcbiAgICAgIGF1dG9DbG9zZXNCb29sLFxuICAgICAgcmVsXG4gICAgfVxuICAgIHRoaXMudHJhY2VyKCd1cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24gJywgdGhpcy52c251bSwgb2JqKVxuICAgIHRoaXMudWJlclNvdXJjZSQubmV4dChvYmopXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVUJTQ1JJQkVSIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIG9uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dChwYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBkZWZhdWx0VG9GbiA9IGRlZmF1bHRUbygocCkgPT4gdGhpcy5zZW5kRXh0ZW5kZWRTdHJlYW1zKHApKVxuXG4gICAgLy8gKioqKlVTRSBSRUdFWCBBUyBQUkVESUNBVEUgQ0hFQ0sgRk9SIFBBWUxPQUQuQUNUSU9OIElOIEhBU0ggTUVUSE9EUyBPQkpcbiAgICAvLyBjb25zdCBoYXNoQWN0aW9uID0gdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kc1twYXlsb2FkLmFjdGlvbl07XG4gICAgY29uc3QgaGFzaEFjdGlvblN0ciA9IGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIodGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kcyxcbiAgICAgIHBheWxvYWQuYWN0aW9uKVxuICAgIGNvbnN0IGhhc2hBY3Rpb24gPSB0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzW2hhc2hBY3Rpb25TdHJdXG4gICAgLy8gY29uc29sZS5sb2coJ1MgUEFZTE9BRCAnLCB0aGlzLnByb3BzLm5hbWUsIHR5cGVvZiAoaGFzaEFjdGlvbiksIHBheWxvYWQpO1xuXG4gICAgY29uc3QgZm4gPSBkZWZhdWx0VG9GbihoYXNoQWN0aW9uKVxuXG4gICAgLy8gY29uc29sZS5sb2coJ2hhc2ggbWV0aG9kcyAnLCBmbiwgdGhpcy5wcm9wcy5uYW1lLCBwYXlsb2FkLmFjdGlvbiwgaGFzaEFjdGlvblN0ciwgdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kcyk7XG5cbiAgICBmbihwYXlsb2FkKVxuICAgIC8vIGNvbnNvbGUubG9nKGZuLCBwYXlsb2FkLCAnIFRIRSBQQVlMT0FEIEZST00gU1VCU0NSSUJFIElTICcsICcgLS0tLSAnLCAnIC0tLT4gJywgdGhpcy5wcm9wcyk7XG4gICAgLy8gY29uc29sZS5sb2coJ0VYVElSUEFURVIgVlMgTkVYVCcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgcGF5bG9hZCk7XG5cbiAgICB0aGlzLnRyYWNlcignb25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0JywgeyBwYXlsb2FkIH0pXG4gIH1cblxuICBvblN1YnNjcmliZVRvU291cmNlc0Vycm9yKHBheWxvYWQgPSAnJykge1xuICAgIGNvbnNvbGUubG9nKCdBTEwgRVJST1IgICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgcGF5bG9hZClcbiAgfVxuXG4gIC8qXG4gICAgYXR0YWNoQ2hpbGRUb1ZpZXcoZGF0YSkge1xuICAgICAgLy8gbGV0IGNoaWxkUmVuZGVyRGF0YSA9IGRhdGEuYXR0YWNoRGF0YTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdDSElMRCBEQVRBICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgY2hpbGRSZW5kZXJEYXRhKTtcbiAgICAgIC8vIHRoaXMub3BlblNwaWdvdCgnQVRUQUNIX0NISUxEX1RPX1NFTEYnLCB7Y2hpbGRSZW5kZXJEYXRhfSk7XG4gICAgfVxuICAqL1xuXG4gIG9uU3Vic2NyaWJlVG9Tb3VyY2VzQ29tcGxldGUoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJz09PT0gRVhUSVJQQVRFUiBBTEwgQ09NUExFVEVEID09PT0nLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMudHJhY2VyKCdvblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlJywgJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnKVxuXG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19ERVRSSVRVU19DT0xMRUNUJylcbiAgfVxuXG4gIHNlbmRFeHRlbmRlZFN0cmVhbXMocGF5bG9hZCkge1xuICAgIHRoaXMudHJhY2VyKCdzZW5kRXh0ZW5kZWRTdHJlYW1zJywgcGF5bG9hZClcbiAgICAvLyBjb25zb2xlLmxvZygnZXh0ZW5kZWQgbWV0aG9kcyAnLCBwYXlsb2FkLmFjdGlvbiwgcGF5bG9hZCk7XG4gICAgdGhpcy5vcGVuU3BpZ290KHBheWxvYWQuYWN0aW9uLCBwYXlsb2FkKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWU19TUEFXTiBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQoYXR0YWNoRGF0YSkge1xuICAgIC8vIGxldCBjaGlsZFJlbmRlckRhdGEgPSBhdHRhY2hEYXRhO1xuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfU1BBV05fQU5EX0FUVEFDSF9UT19QQVJFTlQnLCBhdHRhY2hEYXRhKVxuICB9XG5cbiAgcmVuZGVyVmlldygpIHtcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ1ZTX1NQQVdOJylcbiAgfVxuXG4gIHJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCB0eXBlLCBhdHRhY2hUeXBlKSB7XG4gICAgY29uc3QgYXR0YWNoRGF0YSA9IHsgbm9kZSwgdHlwZSwgYXR0YWNoVHlwZSB9XG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTScsIHsgYXR0YWNoRGF0YSB9KVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFWFRJUlBBVEUgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY2hlY2tQYXJlbnREaXNwb3NlKHApIHtcbiAgICBpZiAocC5mcm9tJCA9PT0gJ3BhcmVudCcpIHtcbiAgICAgIHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0ocClcbiAgICB9XG4gIH1cblxuICBvbkJlZm9yZURpc3Bvc2UoKSB7XG5cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU0lOSyQgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICpcbiAgICogV3JhcHMgd2luZG93LnNldFRpbWVvdXQgd2l0aCBhIGNoZWNrIHRvIHNlZSBpZiBcInRoaXNcIiBWaWV3U3RyZWFtIGVsZW1lbnQgYW5kIGl0cyBwcm9wcyBwcm9wZXJ0eSBzdGlsbCBleGlzdHNcbiAgICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZm4gLSA9ICdmdW5jdGlvbic7IFRoZSBsb2NhbCBtZXRob2QgdGhhdCBpcyB0byBiZSBjYWxsZWQuXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtcyAtID0gMDsgIFRoZSB0aW1lLCBpbiBtaWxsZXNlY29uZHMsIGZvciB0aGUgdGltZW91dC5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBiaW5kIC0gPSBmYWxzZTsgIFdoZW4gdHJ1ZSwgd2lsbCBiaW5kIHRoZSBtZXRob2QgdG8gJ3RoaXMnLlxuICAgKlxuICAgKi9cblxuICBzZXRUaW1lb3V0KGZuLCBtcyA9IDAsIGJpbmQgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRpbWVvdXRNZXRob2QgPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKHRoaXMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kRm4gPSBiaW5kID09PSB0cnVlID8gZm4uYmluZCh0aGlzKSA6IGZuXG4gICAgICAgIGFwcGx5KG1ldGhvZEZuLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgICB3aW5kb3cuc2V0VGltZW91dCh0aW1lb3V0TWV0aG9kLCBtcylcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBCZWdpbnMgdGhlIHJlbW92YWwgcHJvY2VzcyBvZiB0aGUgVmlld1N0cmVhbSBpbnN0YW5jZSBhbG9uZyB3aXRoIGFsbCBvZiBpdHMgY2hhaW5lZCBWaWV3U3RyZWFtIGNoaWxkcmVuLlxuICAgKi9cbiAgZGlzcG9zZVZpZXdTdHJlYW0ocCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdFWFRJUlBBVEVSIFZTIG9uRGlzcG9zZSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMub25CZWZvcmVEaXNwb3NlKClcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ0VYVElSUEFURScpXG4gIH1cblxuICBvbkNoaWxkRGlzcG9zZShwKSB7XG4gIH1cblxuICBvblBhcmVudERpc3Bvc2luZyhwKSB7XG4gICAgLy8gdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24odGhpcy5fc291cmNlJCk7XG4gICAgdGhpcy5vcGVuU3BpZ290KCdFWFRJUlBBVEUnKVxuICB9XG5cbiAgb25SZWFkeVRvR0MocCkge1xuICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBwLmZyb20kICE9PSB1bmRlZmluZWQgJiYgcC5mcm9tJCA9PT0gJ2ludGVybmFsJ1xuICAgIGlmIChpc0ludGVybmFsKSB7XG4gICAgICAvLyB0aGlzLm9wZW5TcGlnb3QoJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnKTtcbiAgICB9XG4gICAgdGhpcy50cmFjZXIoJ29uUmVhZHlUb0dDJywgaXNJbnRlcm5hbCwgcClcbiAgfVxuXG4gIG9wZW5TcGlnb3QoYWN0aW9uLCBvYmogPSB7fSkge1xuICAgIGlmICh0aGlzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucHJvcHMuYWN0aW9uID0gYWN0aW9uXG4gICAgICBjb25zdCBkYXRhID0gbWVyZ2VSaWdodCh0aGlzLnByb3BzLCBvYmopXG4gICAgICAvLyBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIG9iaik7XG5cbiAgICAgIHRoaXMuc2luayQubmV4dChPYmplY3QuZnJlZXplKGRhdGEpKVxuICAgIH1cbiAgfVxuXG4gIHNldEF0dGFjaERhdGEoYXR0YWNoVHlwZSwgcXVlcnkpIHtcbiAgICBjb25zdCBjaGVja1F1ZXJ5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgcSA9IHRoaXMucHJvcHMuZWwucXVlcnlTZWxlY3RvcihxdWVyeSlcbiAgICAgIGNvbnN0IGlzRGV2TW9kZSA9IFZpZXdTdHJlYW0uaXNEZXZNb2RlKClcbiAgICAgIGlmIChpc0Rldk1vZGUgPT09IHRydWUgJiYgaXMoU3RyaW5nLCBxdWVyeSkgJiYgaXNOaWwocSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYXBwZW5kVmlldyBxdWVyeSBpbiAke3RoaXMucHJvcHMubmFtZX0sICcke3F1ZXJ5fScsIGFwcGVhcnMgdG8gbm90IGV4aXN0IWApXG4gICAgICB9XG4gICAgICByZXR1cm4gcVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBub2RlOiB0aGlzLnByb3BzLmVsLFxuICAgICAgdHlwZTogJ1ZpZXdTdHJlYW1PYnNlcnZhYmxlJyxcbiAgICAgIGF0dGFjaFR5cGUsXG4gICAgICBxdWVyeTogY2hlY2tRdWVyeShxdWVyeSlcbiAgICB9XG4gIH1cblxuICBnZXRQYXJlbnRFbHMoZWwsIG51bSkge1xuICAgIGNvbnN0IGdldEVsZW0gPSBlbCA9PiBlbC5wYXJlbnRFbGVtZW50XG4gICAgbGV0IGl0ZXIgPSAwXG4gICAgbGV0IHBhcmVudEVsID0gZWxcbiAgICB3aGlsZSAoaXRlciA8IG51bSkge1xuICAgICAgcGFyZW50RWwgPSBnZXRFbGVtKHBhcmVudEVsKVxuICAgICAgaXRlcisrXG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRFbFxuICB9XG5cbiAgc2V0QXR0YWNoUGFyZW50RGF0YShhdHRhY2hUeXBlLCBxdWVyeSwgbGV2ZWwpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5ICE9PSAnJyA/IHF1ZXJ5IDogdW5kZWZpbmVkXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0UGFyZW50RWxzKHRoaXMucHJvcHMuZWwsIGxldmVsKVxuICAgIHJldHVybiB7XG4gICAgICBub2RlLFxuICAgICAgdHlwZTogJ1ZpZXdTdHJlYW1PYnNlcnZhYmxlJyxcbiAgICAgIGF0dGFjaFR5cGUsXG4gICAgICBxdWVyeTogbm9kZS5xdWVyeVNlbGVjdG9yKHF1ZXJ5KVxuICAgIH1cbiAgfVxuXG4gIG9uTWFwVmlld1NvdXJjZShwYXlsb2FkID0ge30pIHtcbiAgICB0aGlzLnByb3BzID0gbWVyZ2VSaWdodCh0aGlzLnByb3BzLCBwYXlsb2FkKVxuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEFUVEFDSCBTVFJFQU0gQU5EIERPTSBEQVRBIEFHR1JFR0FUT1JTPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZChjaGlsZFZpZXcsIGF0dGFjaERhdGEpIHtcbiAgICB0aGlzLmFkZENoaWxkU3RyZWFtKGNoaWxkVmlldy5zb3VyY2VTdHJlYW1zLnRvUGFyZW50JClcbiAgICBjaGlsZFZpZXcuYWRkUGFyZW50U3RyZWFtKHRoaXMuc291cmNlU3RyZWFtcy50b0NoaWxkJCwgYXR0YWNoRGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgVmlld1N0cmVhbSBvYmplY3QgdG8gYW4gZXhpc3RpbmcgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqIDwvYm9keT5cbiAgICpcbiAgICogbGV0IHZpZXdTdHJlYW0gPSBuZXcgVmlld1N0cmVhbSgnaDInLCAnSGVsbG8gV29ybGQnKTtcbiAgICogdmlld1N0cmVhbS5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICovXG4gIGFwcGVuZFRvRG9tKG5vZGUpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcImFwcGVuZCB0byBkb20gXCIsdGhpcy5wcm9wcy52c2lkLCB0aGlzLnByb3BzLmVsKTtcbiAgICBpZiAodGhpcy5wcm9wcy5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBWaWV3U3RyZWFtLCAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBhbiBlbGVtZW50LCAke3RoaXMucHJvcHMuZWx9LCB0aGF0IGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgYXBwZW5kZWRUb0RvbS4gVGhpcyBtYXkgY3JlYXRlIHVuc3VzdWFsIHNpZGUgZWZmZWN0cyFgKVxuICAgIH1cbiAgICB0aGlzLnJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCAnZG9tJywgJ2FwcGVuZENoaWxkJylcbiAgfVxuXG4gIGFwcGVuZFRvRG9tQWZ0ZXIobm9kZSkge1xuICAgIGlmICh0aGlzLnByb3BzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIFZpZXdTdHJlYW0sICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGFuIGVsZW1lbnQsICR7dGhpcy5wcm9wcy5lbH0sIHRoYXQgaXMgYWxyZWFkeSByZW5kZXJlZCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBhcHBlbmRlZFRvRG9tQWZ0ZXIuIFRoaXMgbWF5IGNyZWF0ZSB1bnN1c3VhbCBzaWRlIGVmZmVjdHMhYClcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhZnRlcicpXG4gIH1cblxuICAvKipcbiAgICogUHJlcGVuZHMgdGhlIGN1cnJlbnQgVmlld1N0cmVhbSBvYmplY3QgdG8gYW4gZXhpc3RpbmcgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5wcmVwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqL1xuXG4gIHByZXBlbmRUb0RvbShub2RlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgVmlld1N0cmVhbSwgJHt0aGlzLnByb3BzLm5hbWV9LCBoYXMgYW4gZWxlbWVudCwgJHt0aGlzLnByb3BzLmVsfSwgdGhhdCBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHByZXBlbmRlZFRvRG9tLiBUaGlzIG1heSBjcmVhdGUgdW5zdXN1YWwgc2lkZSBlZmZlY3RzIWApXG4gICAgfVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAncHJlcGVuZENoaWxkJylcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QuIDxicj5BZnRlciB0aGUgYXR0YWNobWVudCwgcnhqcyBvYnNlcnZhYmxlcyBhcmUgZXhjaGFuZ2VkIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgVmlld1N0cmVhbSBvYmplY3RzLjxicj48YnI+XG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBjaGlsZCB0aGF0IGlzIHRvIGJlIGF0dGFjaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8bWFpbj5cbiAgICogICAgICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqICAgIDwvbWFpbj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKlxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBwYXJlbnRWaWV3LmFwcGVuZFZpZXcoY2hpbGRWaWV3KVxuICAgKlxuICAgKiAqL1xuICBhcHBlbmRWaWV3KHYsIHF1ZXJ5KSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsIHRoaXMuc2V0QXR0YWNoRGF0YSgnYXBwZW5kQ2hpbGQnLCBxdWVyeSkpXG4gIH1cblxuICBhcHBlbmRWaWV3QWZ0ZXIodiwgcXVlcnkpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodiwgdGhpcy5zZXRBdHRhY2hEYXRhKCdhZnRlcicsIHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gYSBwYXJlbnQgVmlld1N0cmVhbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBwYXJlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICogQHBhcmFtIHtsZXZlbH0gdGhpcyBwYXJhbWV0ZXJzIGNhbiBhdHRhY2ggdGhlIHZpZXdTdHJlYW0ncyBkb20gZWxlbWVudCB1cCB0aGUgZG9tIHRyZWUgd2hpbGUgc3RpbGwgbWFpbnRhaW5pbmcgdGhlIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAgb2YgdGhlIFZpZXdTdHJlYW0gb2JqZWN0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxtYWluPlxuICAgKiAgICAgICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogICAgPC9tYWluPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIGNoaWxkVmlldy5hcHBlbmRUb1BhcmVudChwYXJlbnRWaWV3KVxuICAgKlxuICAgKiAqL1xuXG4gIGFwcGVuZFZpZXdUb1BhcmVudEVsKHYsIHF1ZXJ5LCBsZXZlbCA9IDEpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodixcbiAgICAgIHRoaXMuc2V0QXR0YWNoUGFyZW50RGF0YSgnYXBwZW5kQ2hpbGQnLCBxdWVyeSwgbGV2ZWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHByZXBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gYSBwYXJlbnQgVmlld1N0cmVhbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxldmVsXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7Vmlld1N0cmVhbX0gdiAtID0gdW5kZWZpbmVkOyB0aGUgVmlld1N0cmVhbSBwYXJlbnQuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeSAtID0gdW5kZWZpbmVkOyBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGxldmVsIC0gPSAxOyB0aGlzIHBhcmFtZXRlciBjYW4gYXR0YWNoIHRoZSB2aWV3U3RyZWFtJ3MgZG9tIGVsZW1lbnQgdXAgdGhlIGRvbSB0cmVlIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIHRoZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIG9mIHRoZSBWaWV3U3RyZWFtIG9iamVjdHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5wcmVwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBjaGlsZFZpZXcucHJlcGVuZFZpZXdUb1BhcmVudEVsKHBhcmVudFZpZXcpXG4gICAqXG4gICAqICovXG4gIHByZXBlbmRWaWV3VG9QYXJlbnRFbCh2LCBxdWVyeSwgbGV2ZWwgPSAxKSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsXG4gICAgICB0aGlzLnNldEF0dGFjaFBhcmVudERhdGEoJ3ByZXBlbmRDaGlsZCcsIHF1ZXJ5LCBsZXZlbCkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogVGhpcyBtZXRob2QgcHJlcGVuZHMgYSBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdCB0byB0aGUgY3VycmVudCBWaWV3U3RyZWFtIG9iamVjdC4gPGJyPkFmdGVyIHRoZSBhdHRhY2htZW50LCByeGpzIG9ic2VydmFibGVzIGFyZSBleGNoYW5nZWQgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdHMuPGJyPjxicj5cbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtfSB2IHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxtYWluPlxuICAgKiAgICAgICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogICAgPC9tYWluPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIHBhcmVudFZpZXcucHJlcGVuZFZpZXcoY2hpbGRWaWV3KTtcbiAgICpcbiAgICogKi9cblxuICBwcmVwZW5kVmlldyh2LCBxdWVyeSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LCB0aGlzLnNldEF0dGFjaERhdGEoJ3ByZXBlbmRDaGlsZCcsIHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiAgQXBwZW5kcyBhIFZpZXdTdHJlYW0gb2JqZWN0IHRoYXQgYXJlIG5vdCByZW5kZXJlZCB0byB0aGUgI3NweW5lLW51bGwtdmlld3MgZGl2LlxuICAgKi9cbiAgYXBwZW5kVG9OdWxsKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3B5bmUtbnVsbC12aWV3cycpXG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhcHBlbmRDaGlsZCcpXG4gIH1cblxuICBvblZTUmVuZGVyZWQocGF5bG9hZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdWU19TUEFXTjogJywgdGhpcy5wcm9wcy5uYW1lLCBwYXlsb2FkKTtcbiAgICBpZiAocGF5bG9hZC5mcm9tJCA9PT0gJ2ludGVybmFsJykge1xuICAgICAgLy8gdGhpcy5wcm9wc1snZWwnXSA9IHBheWxvYWQuZWwuZWw7XG5cbiAgICAgIHRoaXMucG9zdFJlbmRlcigpXG4gICAgICAvLyB0aGlzLmJyb2FkY2FzdGVyID0gbmV3IFNweW5lLlZpZXdTdHJlYW1Ccm9hZGNhc3Rlcih0aGlzLnByb3BzLCB0aGlzLmJyb2FkY2FzdEV2ZW50cyk7XG4gICAgfVxuICB9XG5cbiAgcG9zdFJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5fcG9zdFJlbmRlcmVkQ2FsbGVkID09PSB0cnVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmJlZm9yZUFmdGVyUmVuZGVyKClcbiAgICB0aGlzLmFmdGVyUmVuZGVyKClcblxuICAgIHRoaXMub25SZW5kZXJlZCgpXG4gICAgY29uc3Qgc3RhcnRBbmltRnJhbWVBZnRlclJlbmRlcmVkID0gKCkgPT4gdGhpcy5vbkFuaW1GcmFtZUFmdGVyUmVuZGVyZWQoKVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGFydEFuaW1GcmFtZUFmdGVyUmVuZGVyZWQpXG5cbiAgICBpZiAodGhpcy5pc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGV2ZW50c0FyciA9IHRoaXMuYnJvYWRjYXN0RXZlbnRzKClcbiAgICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBWaWV3U3RyZWFtLmlzVmFsaWROZXN0ZWRBcnIoZXZlbnRzQXJyKVxuICAgICAgaWYgKGlzVmFsaWRBcnIgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFycmF5IHJldHVybmVkIGZyb20gYnJvYWRjYXN0RXZlbnRzIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgJyR7SlNPTi5zdHJpbmdpZnkoZXZlbnRzQXJyKX0nLCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgcHJvcGVybHkgZm9ybWF0dGVkIWApXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZUNoYW5uZWxzKClcbiAgICB0aGlzLnZpZXdzU3RyZWFtQnJvYWRjYXN0ZXIgPSBuZXcgVmlld1N0cmVhbUJyb2FkY2FzdGVyKHRoaXMucHJvcHMsIHRoaXMuYnJvYWRjYXN0RXZlbnRzLmJpbmQodGhpcykpXG4gICAgdGhpcy5hZnRlckJyb2FkY2FzdEV2ZW50cygpXG5cbiAgICB0aGlzLl9wb3N0UmVuZGVyZWRDYWxsZWQgPSB0cnVlXG4gIH1cblxuICBhZGRUcmFpdHModHJhaXRzKSB7XG4gICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICB0cmFpdHMgPSBbdHJhaXRzXVxuICAgIH1cbiAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgIH1cblxuICAgIHRyYWl0cy5mb3JFYWNoKGFkZFRyYWl0KVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1FVEhPRFMgVE8gQkUgRVhURU5ERUQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgYWZ0ZXJCcm9hZGNhc3RFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBwdWxsQWN0aW9uc0Zyb21MaXN0ID0gKGFycikgPT4gYXJyWzBdXG4gICAgICBjb25zdCBuZXN0ZWRBY3Rpb25zQXJyID0gdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKVxuXG4gICAgICBjb25zdCBhY3Rpb25zQXJyID0gbmVzdGVkQWN0aW9uc0Fyci5tYXAocHVsbEFjdGlvbnNGcm9tTGlzdClcblxuICAgICAgY29uc3QgaXNWYWxpZEFyciA9IFZpZXdTdHJlYW0uaXNWYWxpZE5lc3RlZEFycihuZXN0ZWRBY3Rpb25zQXJyKVxuXG4gICAgICBpZiAoaXNWYWxpZEFyciA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYXJyYXkgcmV0dXJuZWQgZnJvbSBhZGRBY3Rpb25zTGlzdGVuZXJzIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgJyR7SlNPTi5zdHJpbmdpZnkobmVzdGVkQWN0aW9uc0Fycil9JywgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHByb3Blcmx5IGZvcm1hdHRlZCFgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2hlY2tGb3JFeGlzdGluZ01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgICAgICBjb25zdCBtZXRob2QgPSBkZWZhdWx0VG8oJycsIGFyclsxXSlcbiAgICAgICAgICBjb25zdCBpc01ldGhvZCA9IGlzKEZ1bmN0aW9uLCB0aGlzW21ldGhvZF0pXG4gICAgICAgICAgaWYgKGlzTWV0aG9kID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWV0aG9kIGluIGFkZEFjdGlvbkxpc3RlbmVycyBuZXN0ZWQgQXJyYXksICcke0pTT04uc3RyaW5naWZ5KGFycil9JywgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QhYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9zZShmb3JFYWNoKGNoZWNrRm9yRXhpc3RpbmdNZXRob2QpLCBkZWZhdWx0VG8oW10pKShuZXN0ZWRBY3Rpb25zQXJyKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWxheUZvclByb3h5Q2hhbm5lbFJlc2V0cyA9ICgpID0+IHtcbiAgICAgICAgaWYgKHBhdGgoWydwcm9wcycsICdhZGRlZENoYW5uZWxzJ10sIHRoaXMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBWaWV3U3RyZWFtLmNoZWNrSWZBY3Rpb25zQXJlUmVnaXN0ZXJlZC5iaW5kKHRoaXMpKHRoaXMucHJvcHMuYWRkZWRDaGFubmVscywgYWN0aW9uc0FycilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRUaW1lb3V0KGRlbGF5Rm9yUHJveHlDaGFubmVsUmVzZXRzLCA1MDApXG4gICAgfVxuICB9XG5cbiAgc2V0RGF0YVZTSUQoKSB7XG4gICAgdGhpcy5wcm9wcy5lbC5kYXRhc2V0LnZzaWQgPSB0aGlzLnByb3BzLnZzaWQvLyBTdHJpbmcodGhpcy5wcm9wcy52c2lkKS5yZXBsYWNlKC9eKHZzaWQtKSguKikkLywgJyQyJyk7XG4gIH1cblxuICBiZWZvcmVBZnRlclJlbmRlcigpIHtcbiAgICAvKiAgICBsZXQgZG0yID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RyID0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRG9tSXRlbVNlbGVjdG9ycyhlbCwgc3RyKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9OyAqL1xuXG4gICAgLy8gdGhpcy5wcm9wcy5lbCQgPSBkbTIodGhpcy5wcm9wcy5lbCk7XG4gICAgdGhpcy5zZXREYXRhVlNJRCgpXG4gICAgdGhpcy5wcm9wcy5lbCQgPSBWaWV3U3RyZWFtU2VsZWN0b3IodGhpcy5wcm9wcy5lbClcbiAgICAvLyBjb25zb2xlLmxvZygnRUwgSVMgJywgdGhpcy5wcm9wcy5lbCQuZWxBcnIpO1xuICAgIC8vIHdpbmRvdy50aGVFbCQgPSB0aGlzLnByb3BzLmVsJDtcbiAgfVxuXG4gIC8vIFRISVMgSVMgQU4gRVZFTlQgSE9MREVSIE1FVEhPRCBCRUNBVVNFIFNFTkRJTkcgRE9XTlNUUkVBTSBSRVFVSVJFIFRIRSBQQVJFTlQgVE8gSEFWRSBBIE1FVEhPRFxuICBkb3duU3RyZWFtKCkge1xuXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqXG4gICAqL1xuXG4gIG9uUmVuZGVyZWQoKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGFkZCBhbmltYXRpb24gY2xhc3NlcyB0byBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVuZGVyaW5nLlxuICAgKlxuICAgKi9cblxuICBvbkFuaW1GcmFtZUFmdGVyUmVuZGVyZWQoKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogKERlcHJlY2F0ZWQuIFVzZSBvblJlbmRlcmVkKS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqXG4gICAqL1xuXG4gIGFmdGVyUmVuZGVyKCkge1xuICB9XG5cbiAgYnJvYWRjYXN0RXZlbnRzKCkge1xuICAgIC8vIEFERCBCVVRUT04gRVZFTlRTIEFTIE5FU1RFRCBBUlJBWVNcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGNvbm5lY3QgdG8gYW4gaW5zdGFuY2Ugb2YgcmVnaXN0ZXJlZCBjaGFubmVscywgc3VjaCBhcyAnRE9NJywgJ1VJJywgYW5kICdST1VURScgY2hhbm5lbHMuXG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGxldCB1aUNoYW5uZWwgPSB0aGlzLmdldENoYW5uZWwoJ1VJJyk7XG4gICAqXG4gICAqIHVpQ2hhbm5lbFxuICAgKiAgICAuZmlsdGVyKChwKSA9PiBwLmRhdGEuaWQ9PT0nI215LWJ1dHRvbicpXG4gICAqICAgIC5zdWJzY3JpYmUoKHApID0+IGNvbnNvbGUubG9nKCdteSBidXR0b24gd2FzIGNsaWNrZWQgJywgcCkpO1xuICAgKlxuICAgKiAqL1xuXG4gIGdldENoYW5uZWwoY2hhbm5lbCkge1xuICAgIGNvbnN0IGlzVmFsaWRDaGFubmVsID0gYyA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhjKVxuICAgIGNvbnN0IGVycm9yID0gYyA9PiBjb25zb2xlLndhcm4oXG4gICAgICAgIGBjaGFubmVsIG5hbWUgJHtjfSBpcyBub3Qgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbU5hbWVzfWApXG4gICAgY29uc3Qgc3RhcnRTdWJzY3JpYmUgPSAoYykgPT4ge1xuICAgICAgY29uc3Qgb2JzJCA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC5nZXRTdHJlYW0oYykub2JzZXJ2ZXJcblxuICAgICAgcmV0dXJuIG9icyQucGlwZSh0YWtlV2hpbGUocCA9PiB0aGlzLmRlbGV0ZWQgIT09IHRydWUpKVxuICAgIH0vLyBnZXRHbG9iYWxQYXJhbSgnc3RyZWFtc0NvbnRyb2xsZXInKS5nZXRTdHJlYW0oYykub2JzZXJ2ZXI7XG5cbiAgICBjb25zdCBmbiA9IGlmRWxzZShpc1ZhbGlkQ2hhbm5lbCwgc3RhcnRTdWJzY3JpYmUsIGVycm9yKVxuXG4gICAgcmV0dXJuIGZuKGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogQ0hFQ0tTIFRPIFNFRSBJRiBDSEFOTkVMUyBIQVZFIEJFRU4gQURERUQgVE8gcHJvcHMuY2hhbm5lbHMgb2JqZWN0O1xuICAgKi9cbiAgaW5pdGlhbGl6ZUNoYW5uZWxzKCkge1xuICAgIGNvbnN0IGFkZENoYW5uZWwgPSAoY2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3QgW2NoYW5uZWxOYW1lLCBza2lwRmlyc3QgPSBmYWxzZV0gPSBBcnJheS5pc0FycmF5KGNoYW5uZWwpID8gY2hhbm5lbCA6IFtjaGFubmVsXVxuICAgICAgdGhpcz8uYWRkQ2hhbm5lbChjaGFubmVsTmFtZSwgc2tpcEZpcnN0KVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzPy5wcm9wcz8uY2hhbm5lbHMpKSB7XG4gICAgICB0aGlzPy5wcm9wcz8uY2hhbm5lbHM/LmZvckVhY2goYWRkQ2hhbm5lbClcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcz8ucHJvcHM/LmNoYW5uZWwpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3Byb3BzLmNoYW5uZWwgaXMgbm90IGEgVmlld1N0cmVhbSBwcm9wZXJ0eS4gRG8geW91IG1lYW4gcHJvcHMuY2hhbm5lbHM/JylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogUHJlZmVycmVkIG1ldGhvZCB0byBjb25uZWN0IHRvIGluc3RhbmNlcyBvZiByZWdpc3RlcmVkIGNoYW5uZWxzLCBzdWNoIGFzICdET00nLCAnVUknLCBhbmQgJ1JPVVRFJyBjaGFubmVscy5cbiAgICpcbiAgICogQWRkIENoYW5uZWwgd2lsbCBhdXRvbWF0aWNhbGx5IHVuc3Vic2NyaWJlIHRvIHRoZSBjaGFubmVsLCB3aGVyZWFzIHRoZSBnZXRDaGFubmVsIG1ldGhvZCByZXF1aXJlcyB0aGUgZGV2ZWxvcGVyIHRvIG1hbnVhbGx5IHVuc3Vic2NyaWJlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBuYW1lIG9mIHRoZSByZWdpc3RlcmVkIENoYW5uZWwgdGhhdCB3YXMgYWRkZWQgdG8gdGhlIENoYW5uZWxzIENvbnRyb2xsZXIuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYm9vbCBmYWxzZSwgYWRkIHRydWUgaWYgdGhlIFZpZXcgc2hvdWxkIHdhaXQgZm9yIHRoaXMgY2hhbm5lbCB0byB1bnN1YnNjcmliZSBiZWZvcmUgcmVtb3ZpbmcgaXRzZWxmLlxuICAgKiBAcGFyYW0ge3NlbmREb3duU3RyZWFtfSBib29sIFRoZSBkaXJlY3Rpb24gd2hlcmUgdGhlIHN0cmVhbSBpcyBhbGxvd2VkIHRvIHRyYXZlbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogbGV0IHJvdXRlQ2hhbm5lbCA9IHRoaXMuYWRkQ2hhbm5lbCgnUk9VVEUnKTtcbiAgICpcbiAgICogICAgICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICAgICAgICByZXR1cm4gW1xuICAgKiAgICAgICAgICAgICBbJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJywgJ29uTWFwUm91dGVFdmVudCddXG4gICAqICAgICAgICAgICBdXG4gICAqICAgICAgIH1cbiAgICpcbiAgICogICAgICAgb25NYXBSb3V0ZUV2ZW50KHApIHtcbiAgICogICAgICAgICAgY29uc29sZS5sb2coJ3RoZSByb3V0ZSB2YWx1ZSBpcyAnLCBwKTtcbiAgICogICAgICAgfVxuICAgKlxuICAgKlxuICAgKiAqL1xuXG4gIGFkZENoYW5uZWwoY2hhbm5lbE5hbWUsIHNraXBGaXJzdCA9IGZhbHNlLCBzZW5kRG93blN0cmVhbSA9IGZhbHNlLCBib29sID0gZmFsc2UpIHtcbiAgICBjb25zdCBkaXJlY3Rpb25BcnIgPSBzZW5kRG93blN0cmVhbSA9PT0gdHJ1ZSA/IHRoaXMuJGRpcnMuQ0kgOiB0aGlzLiRkaXJzLklcbiAgICBjb25zdCBtYXBEaXJlY3Rpb24gPSBwID0+IHtcbiAgICAgIC8vIGV0IHAyID0gZGVmYXVsdFRvKHt9LCBjbG9uZShwKSk7XG4gICAgICBjb25zdCBwbCA9IHAvLyB8fCB7fTtcbiAgICAgIHBsLiRkaXIgPSBkaXJlY3Rpb25BcnJcbiAgICAgIHJldHVybiBwbFxuICAgICAgLy8gcmV0dXJuIGRlZXBNZXJnZShkaXJPYmosIHAyKTtcbiAgICAgIC8vIE9iamVjdC5hc3NpZ24oeyRkaXI6IGRpcmVjdGlvbkFycn0sIGNsb25lKHApKVxuICAgIH1cbiAgICBpZiAodGhpcz8ucHJvcHM/LmFkZGVkQ2hhbm5lbHM/LmluY2x1ZGVzKGNoYW5uZWxOYW1lKSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gQ0hFQ0tTIElGIENIQU5ORUwgSEFTIEFMUkVBRFkgQkVFTiBBRERFRFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGlzTG9jYWxFdmVudENoZWNrID0gcGF0aChbJ3NyY0VsZW1lbnQnLCAnaXNMb2NhbEV2ZW50J10pXG4gICAgY29uc3QgY2lkQ2hlY2sgPSBwYXRoKFsnc3JjRWxlbWVudCcsICd2c2lkJ10pXG4gICAgY29uc3QgY2lkTWF0Y2hlcyA9IHAgPT4ge1xuICAgICAgY29uc3QgdnNpZCA9IGNpZENoZWNrKHApXG4gICAgICBjb25zdCBpc0xvY2FsRXZlbnQgPSBpc0xvY2FsRXZlbnRDaGVjayhwKVxuICAgICAgY29uc3QgZmlsdGVyRXZlbnQgPSBpc0xvY2FsRXZlbnQgIT09IHRydWUgfHwgdnNpZCA9PT0gdGhpcy5wcm9wcy52c2lkXG4gICAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNrcyBcIix2c2lkLHRoaXMucHJvcHMudnNpZCwgaXNMb2NhbEV2ZW50LGZpbHRlckV2ZW50KTtcbiAgICAgIHJldHVybiBmaWx0ZXJFdmVudFxuICAgIH1cblxuICAgIGNvbnN0IHBpcGVBcnIgPSBbbWFwKG1hcERpcmVjdGlvbiksIGZpbHRlcihjaWRNYXRjaGVzKV1cbiAgICBpZiAoc2tpcEZpcnN0ID09PSB0cnVlKSB7XG4gICAgICBwaXBlQXJyLnVuc2hpZnQoc2tpcCgxKSlcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsJCA9IHRoaXMuZ2V0Q2hhbm5lbChjaGFubmVsTmFtZSkucGlwZSguLi5waXBlQXJyKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKGNoYW5uZWwkLCBmYWxzZSlcbiAgICB0aGlzLnByb3BzLmFkZGVkQ2hhbm5lbHMucHVzaChjaGFubmVsTmFtZSlcbiAgfVxuXG4gIGNoZWNrSWZDaGFubmVsRXhpc3RzKGNoYW5uZWxOYW1lKSB7XG4gICAgY29uc3QgY2hhbm5lbEV4aXN0cyA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC50ZXN0U3RyZWFtKGNoYW5uZWxOYW1lKVxuICAgIGlmIChjaGFubmVsRXhpc3RzICE9PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNQWU5FIFdBUk5JTkc6IFRoZSBDaGFubmVsUGF5bG9hZCBmcm9tICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGJlZW4gc2VudCB0byBhIGNoYW5uZWwsICR7Y2hhbm5lbE5hbWV9LCB0aGF0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIWApXG4gICAgfVxuICAgIHJldHVybiBjaGFubmVsRXhpc3RzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNoYW5uZWxOYW1lIC0gPSB1bmRlZmluZWQ7IFRoZSBuYW1lIG9mIHRoZSByZWdpc3RlcmVkIENoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwYXlsb2FkIC0gPSB7fTsgVGhlIG1haW4gZGF0YSB0byBzZW5kIHRvIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIC0gPSBcIlZJRVdTVFJFQU1fRVZFTlRcIjsgVGhlIGFjdGlvbiBzZW50IHRvIHRoZSBjaGFubmVsLlxuICAgKiBAZGVzY1xuICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgdmVyc2F0aWxlIGFuZCBjb25zaXN0ZW50IG1ldGhvZCB0byBjb21tdW5pY2F0ZSB3aXRoIGFsbCBjaGFubmVscy5cbiAgICpcbiAgICpcbiAgICovXG5cbiAgc2VuZEluZm9Ub0NoYW5uZWwoY2hhbm5lbE5hbWUsIHBsID0ge30sIGFjdGlvbikge1xuICAgIGNvbnN0IHBheWxvYWQgPSBwbFxuXG4gICAgY29uc3QgZGVmYXVsdFRvQWN0aW9uID0gZGVmYXVsdFRvKCdWSUVXU1RSRUFNX0VWRU5UJylcbiAgICBjb25zdCBjaGFubmVsRGVmYXVsdEFjdGlvbkhhc2ggPSB7XG4gICAgICBDSEFOTkVMX1JPVVRFOiAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gICAgfVxuICAgIGNvbnN0IGdldEFjdGlvbkZuID0gY29tcG9zZShkZWZhdWx0VG9BY3Rpb24sIHByb3AoY2hhbm5lbE5hbWUpKVxuXG4gICAgYWN0aW9uID0gYWN0aW9uIHx8IGdldEFjdGlvbkZuKGNoYW5uZWxEZWZhdWx0QWN0aW9uSGFzaClcblxuICAgIGNvbnN0IGRhdGEgPSB7IHBheWxvYWQsIGFjdGlvbiB9XG5cbiAgICB0cnkge1xuICAgICAgZGF0YS5zcmNFbGVtZW50ID0gY29tcG9zZShwaWNrKFsnaWQnLCAndnNpZCcsICdjbGFzcycsICd0YWdOYW1lJ10pLCBwcm9wKCdwcm9wcycpKSh0aGlzKVxuICAgICAgaWYgKHRoaXMuY2hlY2tJZkNoYW5uZWxFeGlzdHMoY2hhbm5lbE5hbWUpID09PSB0cnVlKSB7XG4gICAgICAgIGlmICgvQ0hBTk5FTF9MSUZFQ1lDTEUvLnRlc3QoYWN0aW9uKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkYXRhLCB7XG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIGdldDogKCkgPT4gc2FmZUNsb25lKHBsKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JzJCA9IG9mKGRhdGEpXG4gICAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoY2hhbm5lbE5hbWUsIG9icyQsIGRhdGEpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdTUFlORSBXQVJOSU5HICcsIGUpXG4gICAgfVxuICB9XG5cbiAgdHJhY2VyKC4uLmFyZ3MpIHtcbiAgICB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2QoLi4uYXJncylcbiAgfVxuXG4gIHNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZSgpIHtcblxuICB9XG5cbiAgc2VuZExpZmVjeWNsZU1ldGhvZEFjdGl2ZSh2YWwsIHApIHtcbiAgICBjb25zdCBpc1JlbmRlcmVkID0gd2hlcmUoe1xuICAgICAgZnJvbSQ6IGVxdWFscygnaW50ZXJuYWwnKSxcbiAgICAgIGFjdGlvbjogZXF1YWxzKCdWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQnKVxuICAgIH0sIHApXG4gICAgY29uc3QgaXNEaXNwb3NlZCA9IHAgPT09ICdWU19ERVRSSVRVU19DT0xMRUNUJ1xuICAgIGlmIChpc1JlbmRlcmVkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNlbmRJbmZvVG9DaGFubmVsKCdDSEFOTkVMX0xJRkVDWUNMRScsIHsgYWN0aW9uOidDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcgfSwgJ0NIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UJylcbiAgICB9IGVsc2UgaWYgKGlzRGlzcG9zZWQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfTElGRUNZQ0xFJywgeyBhY3Rpb246J0NIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UJyB9LCAnQ0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQnKVxuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUFjdGlvbkZpbHRlcihzZWxlY3RvcnMsIGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IENoYW5uZWxQYXlsb2FkRmlsdGVyKHNlbGVjdG9ycywgZGF0YSlcbiAgfVxuXG4gIGlzTG9jYWxFdmVudChjaGFubmVsUGF5bG9hZEl0ZW0pIHtcbiAgICBjb25zdCBpdGVtRWwgPSBwYXRoKFsnc3JjRWxlbWVudCcsICdlbCddLCBjaGFubmVsUGF5bG9hZEl0ZW0pXG4gICAgY29uc3QgdGhpc0VsID0gcGF0aChbJ3Byb3BzJywgJ2VsJ10sIHRoaXMpXG4gICAgLy8gY29uc29sZS5sb2coJ3RoaXMgZWwgaXMgJyx7dGhpc0VsLCBpdGVtRWx9KTtcbiAgICByZXR1cm4gVmlld1N0cmVhbS5lbElzRG9tRWxlbWVudCh0aGlzRWwpICYmIFZpZXdTdHJlYW0uZWxJc0RvbUVsZW1lbnQoaXRlbUVsKSAmJiB0aGlzRWwuY29udGFpbnMoaXRlbUVsKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgTUlYSU5TXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBjb3JlTWl4aW5zID0gYmFzZUNvcmVNaXhpbnMoKVxuICAgIHRoaXMuY3JlYXRlSWQgPSBjb3JlTWl4aW5zLmNyZWF0ZUlkXG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNjM2X187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xMzFfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTMxX187IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJyZXF1aXJlIiwiZGVmaW5lIiwiYW1kIiwic2VsZiIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTMxX18iLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX182MzZfXyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUzMV9fIiwiQ2hhbm5lbEZldGNoIiwiY29uc3RydWN0b3IiLCJuYW1lIiwicHJvcHMiLCJ2YWxpZGF0ZU1hcE1ldGhvZCIsInVuZGVmaW5lZCIsIm1hcCIsIm1hcEZuIiwiZXh0ZW5kZWRBY3Rpb25zQXJyIiwic2VuZENhY2hlZFBheWxvYWQiLCJzdXBlciIsInRlc3RNb2RlIiwiaXNVbmRlZmluZWRPcldyb25nVHlwZSIsImVpdGhlciIsImlzTmlsIiwidmFsIiwiaXNVbmRlZmluZWQiLCJhbGwiLCJpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHkiLCJhbGxQYXNzIiwiYXJyIiwibGVuZ3RoIiwiY29tcG9zZSIsInZhbHVlcyIsInBpY2siLCJjb25zb2xlIiwid2FybiIsIm9uUmVnaXN0ZXJlZCIsInRoaXMiLCJwYXVzZSIsInN0YXJ0RmV0Y2giLCJhZGRSZWdpc3RlcmVkQWN0aW9ucyIsImV4dGVuZGVkQXJyIiwiZGVmYXVsdFRvIiwicGF0aCIsImNvbmNhdCIsIm9wdGlvbnMiLCJzdWJzY3JpYmVyIiwib25GZXRjaFJldHVybmVkIiwiYmluZCIsImZldGNoUHJvcHMiLCJjb25zb2xpZGF0ZUFsbEZldGNoUHJvcHMiLCJvbkZldGNoVXBkYXRlIiwiZXZ0IiwicHJvcHNPcHRpb25zIiwiZ2V0UHJvcHNGb3JGZXRjaCIsInN0cmVhbUl0ZW0iLCJjcmVhdGVDaGFubmVsUGF5bG9hZEl0ZW0iLCJwYXlsb2FkIiwiYWN0aW9uIiwidXJsIiwic3JjRWxlbWVudCIsInNlbmRDaGFubmVsUGF5bG9hZCIsImRhdGFPYmoiLCJmaWx0ZXJPdXRVbmRlZmluZWQiLCJyZWplY3QiLCJvMSIsIm8yIiwibWVyZ2VEZWVwUmlnaHQiLCJvYnNlcnZlciIsIm9ic2VydmVyJCIsIkNoYW5uZWxQYXlsb2FkIiwiY2hhbm5lbE5hbWUiLCJldmVudCIsInRpbWVMYWJlbCIsImNoYW5uZWwiLCJ0aW1lIiwiY2hhbm5lbFBheWxvYWRJdGVtT2JqIiwiZnJvemVuUGF5bG9hZCIsImRlZXBGcmVlemUiLCJkZWJ1ZyIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInBheWxvYWRTdHIiLCJKU09OIiwic3RyaW5naWZ5IiwiY2hhbm5lbEFjdGlvbnNBcnIiLCJnZXRDaGFubmVsQWN0aW9ucyIsInZhbGlkYXRlQWN0aW9uIiwiY2xvbmUiLCJtZXJnZUFsbCIsImNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzIiwiJGRpciIsImdldCIsIl9kaXIiLCJzZXQiLCJsb2NhdGlvbiIsImdldExvY2F0aW9uRGF0YSIsImRlZmluZVByb3BlcnRpZXMiLCJ0aW1lRW5kIiwiaXNJbkFyciIsImluY2x1ZGVzIiwiaW5pdGlhbGl6ZWQiLCJwaWNrQWxsIiwid2luZG93IiwiZ2V0U3RyZWFtSXRlbSIsImRlZXBDbG9uZSIsIm8iLCJpc0FyciIsImlzIiwiQXJyYXkiLCJpc09iaiIsIm9iIiwiZnJvbVBhaXJzIiwidG9QYWlycyIsImVsSXNEb21FbGVtZW50IiwibHRlIiwicHJvcCIsImZyZWV6ZSIsImdldE93blByb3BlcnR5TmFtZXMiLCJmb3JFYWNoIiwiaXNGcm96ZW4iLCJlIiwiZ2V0TW91c2VFdmVudEtleXMiLCJDaGFubmVsUHJveHkiLCJpc1Byb3h5Iiwic3ViamVjdCQiLCJTdWJqZWN0IiwicmVwbGF5U3ViJCIsIlJlcGxheVN1YmplY3QiLCJtZXJnZSIsImNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5IiwiZ2V0TWVyZ2VkU3ViamVjdCIsInBlcmlzdERhdGEiLCJsaXN0UmVnaXN0ZXJlZENoYW5uZWxzIiwicmVwbGF5U3ViamVjdCIsInN1YmplY3QiLCJDaGFubmVsIiwiQ0hBTk5FTF9OQU1FIiwiY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmoiLCJkZWZhdWx0QWN0aW9ucyIsImRhdGEiLCJpc1JlZ2lzdGVyZWQiLCJkZWZhdWx0Q2FjaGVkUGF5bG9hZEJvb2wiLCJyZXBsYXkiLCJzZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsIiwiY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMiLCJzdHJlYW1zQ29udHJvbGxlciIsImNoYW5uZWxzTWFwIiwiZ2V0TWFpbk9ic2VydmVyIiwiY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUiLCJkaXNwYXRjaGVyU3RyZWFtJCIsImdldFN0cmVhbSIsInBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSIsInByb3BFcSIsInBpcGUiLCJmaWx0ZXIiLCJzdWJzY3JpYmUiLCJvblJlY2VpdmVkT2JzZXJ2YWJsZSIsInRlc3RTdHJlYW0iLCJnZXRQcm94eVN1YmplY3QiLCJvbkNoYW5uZWxJbml0aWFsaXplZCIsImtleXMiLCJjaGFubmVsQWN0aW9ucyIsImNoZWNrRm9yVHJhaXRzIiwidHJhaXRzIiwiVHJhaXRDbGFzcyIsImFkZFRyYWl0cyIsImluaXRpYWxpemVTdHJlYW0iLCJhY3Rpb25zT2JqIiwiYWN0aW9uc09iaklzRW1wdHkiLCJpc0VtcHR5IiwiZGF0YUlzQWRkZWQiLCJhY3Rpb25TdHIiLCJzZXREZWZhdWx0QWN0aW9uc09iaiIsInNldFRyYWNlIiwiYm9vbCIsImdldEFjdGlvblZhbCIsImlmRWxzZSIsIlN0cmluZyIsImlkZW50aXR5IiwiaGVhZCIsIm1haW5BcnIiLCJvYmoiLCJjaGFpbiIsInN0ciIsIm9iak9mIiwiZGVsYXlDaGVja0lmVHJhaXRNZXRob2RIYXNCZWVuQWRkZWQiLCJtZXRob2RTdHIiLCJzZXRUaW1lb3V0IiwiZ2V0QXJyTWV0aG9kIiwiYWx3YXlzIiwidmlldyIsImxlbnNJbmRleCIsImNoYW5uZWxBY3Rpb25NZXRob2RzIiwib25JbmNvbWluZ09ic2VydmFibGUiLCJnZXRBY3Rpb25NZXRob2RGb3JPYnNlcnZhYmxlIiwidW5wYWNrZWQiLCJkZWZhdWx0Rm4iLCJvblZpZXdTdHJlYW1JbmZvIiwibWV0aG9kVmFsIiwiZm4iLCJlcXNOYW1lIiwiZXF1YWxzIiwib2JzVmFsIiwibWVyZ2VQcm9wcyIsImQiLCJvYnNlcnZhYmxlIiwib25TdWNjZXNzIiwib25FcnJvciIsIm9icyIsIm9icyQiLCJjaGFubmVsUGF5bG9hZEl0ZW0iLCJuZXh0IiwiZ2V0Q2hhbm5lbCIsInBheWxvYWRGaWx0ZXIiLCJjIiwibWVyZ2VDaGFubmVscyIsImNoYW5uZWxzQXJyIiwiZW1pdE9uY2UiLCJjaGFubmVsT2JzZXJ2YWJsZXMiLCJpdGVtIiwiY2hhbiQiLCJ0YWtlIiwiY29tYmluZWQkIiwiZm9ya0pvaW4iLCJFTVBUWSIsImZpcnN0JCIsInJlc3QkIiwiY29tYmluZUxhdGVzdFdpdGgiLCJyZXN1bHRzQXJyIiwiaWR4IiwiY2hlY2tGb3JOb3RUcmFja0ZsYWciLCJkb05vdFRyYWNrIiwiZG9Ob3RUcmFja0NoYW5uZWwiLCJyZWdpc3RlcmVkU3RyZWFtTmFtZXMiLCJyZWdpc3RlcmVkU3RlcHMiLCJyZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzIiwicmVnaXN0ZXJlZFN0cmVhbVR5cGVzIiwicmVnaXN0ZXJlZEFjdGlvbnMiLCJiYXNlVmFsaWRhdGlvbnMiLCJ2aWV3SW5mb1ZhbGlkYXRpb25zIiwidWlWYWxpZGF0aW9ucyIsImxpZmVzdHJlYW1WYWxpZGF0aW9ucyIsInN0ZXBWYWxpZGF0aW9ucyIsInN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMiLCJzdGVwVXBkYXRlVmFsaWRhdGlvbnMiLCJyb3V0ZVZhbGlkYXRpb25zIiwiU3RyZWFtc0NvbmZpZyIsIk9ic2VydmFibGUiLCJlcnJvciIsInByZWRpY2F0ZSIsImxpZmVTdHJlYW1WYWxpZGF0aW9ucyIsIlNURVAiLCJ0eXBlIiwidmlld0lkIiwiZGlzcG9zZUl0ZW1zIiwic3RyZWFtVmFsaWRhdGlvbnMiLCJnZXRSeFR5cGUiLCJzdHJlYW1zIiwiaW5pdCIsInN0cnVjdHVyZSIsInZhbGlkYXRpb25zIiwiX21hcCIsIk1hcCIsIkNoYW5uZWxzTWFwIiwiYWRkTWl4aW5zIiwiZ2V0Q2hhbm5lbHNMaXN0IiwiZnJvbSIsImsiLCJ2Iiwia2V5Iiwic2hvd09ubHlQcm94aWVzIiwicHJveHlNYXAiLCJyZWplY3RQcm94eUZuIiwiZmlsdGVyUHJveHlGbiIsInJlbW92ZWRQcm94eUFyciIsInBsdWNrIiwibGlzdFByb3h5Q2hhbm5lbHMiLCJjaGVja0Zvck1pc3NpbmdDaGFubmVscyIsImZpbHRlclByb3h5QXJyIiwiZmlsdGVyUHJlZml4V2FybmluZyIsImpvaW4iLCJjcmVhdGVNYWluU3RyZWFtcyIsInJvdXRlU3RyZWFtIiwidWlTdHJlYW0iLCJkb21TdHJlYW0iLCJ2aWV3U3RyZWFtTGlmZWN5Y2xlIiwiYWRkS2V5RXZlbnQiLCJyZWdpc3RlclN0cmVhbSIsImhhcyIsInBhdGhFcSIsImlzUmVwbGF5U3ViamVjdCIsInN1YmplY3RUeXBlIiwiU3B5bmVDaGFubmVsTGlmZWN5Y2xlIiwib25TZW5kRXZlbnQiLCJTcHluZUNoYW5uZWxSb3V0ZSIsInJvdXRlQ29uZmlnSnNvbiIsImdldFJvdXRlQ29uZmlnIiwiYmluZFN0YXRpY01ldGhvZHMiLCJuYXZUb1N0cmVhbSQiLCJpbmZvIiwib25NYXBOZXh0IiwiY29tcGFyZVJvdXRlS2V5d29yZHMiLCJjaGVja0NvbmZpZ0Zvckhhc2giLCJjb25maWciLCJjaGFubmVscyIsIlJPVVRFIiwiaXNIYXNoIiwiaW5pdFN0cmVhbSIsInVwZGF0ZVJvdXRlQ29uZmlnIiwibmV3Um91dGVzT2JqIiwibWVyZ2VSaWdodCIsImNvbmZvcm1Sb3V0ZUNvbmZpZyIsInJvdXRlQ29uZmlnIiwibmF2TGlua3MiLCJyb3V0ZURhdGFzZXRzQXJyIiwiYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSIsInNweW5lQ29uZmlnIiwiZmxhdHRlbkNvbmZpZ09iamVjdCIsInJvdXRlcyIsInBhcmFtc0FyciIsImZpcnN0TG9hZFN0cmVhbSQiLCJvbkluY29taW5nRG9tRXZlbnQiLCJjcmVhdGVQb3BTdGF0ZVN0cmVhbSIsImZpcnN0TG9hZGVkIiwicmVtb3ZlU1NJRCIsInJvdXRlTGVucyIsImxlbnNQcm9wIiwib3ZlciIsIm9taXQiLCJvbWl0U1NJRCIsImFjdG4iLCJDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCIsImV2ZW50Q291bnQiLCJpc0hpc3RvcnlDb3VudCIsIk51bWJlciIsImdldERhdGFGcm9tU3RyaW5nIiwicm91dGVDb3VudCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJlbnVtZXJhYmxlIiwia2V5d29yZEFycnMiLCJjb21wYXJlIiwicm91dGVEYXRhIiwicGF0aHMiLCJjaGVja0ZvclJvdXRlUGFyYW1zT3ZlcnJpZGVzIiwiY2hlY2tGb3JFdmVudE1ldGhvZHMiLCJtZXRob2RzQXJyIiwidGVzdCIsImdldE1ldGhvZHMiLCJtZXRob2RVcGRhdGUiLCJtYXRjaCIsInAxIiwicDIiLCJwMyIsInA0IiwidG9Mb3dlckNhc2UiLCJtZXRob2RTdHJSZXBsYWNlIiwicmVwbGFjZSIsInJ1bk1ldGhvZCIsIm0iLCJjaGVja0ZvckVuZFJvdXRlIiwicGwiLCJkZWJ1Z0Jvb2wiLCJpdGVyIiwib25SZWR1Y2VSb3V0ZVBhdGhzIiwiYWNjIiwicm91dGVQYXRoIiwicm91dGVOYW1lIiwicm91dGVOYW1lVmFsIiwia2V5c0FyciIsInByZWQiLCJhcnJTdHIiLCJSZWdFeHAiLCJmaW5kIiwiZ2V0UHJvcFZhbCIsIm5leHRSb3V0ZVBhdGgiLCJyZXZlcnNlIiwicmVkdWNlIiwicHVzaCIsImVuZFJvdXRlVmFsQXJyIiwiZW5kUm91dGVWYWwiLCJlbCIsImRhdGFzZXQiLCJkb21TdHJpbmdNYXAiLCJkb21TdHJpbmdNYXBUb09iamVjdCIsImdldERhdGFGcm9tUGFyYW1zIiwiY2hhbmdlTG9jYXRpb25Cb29sIiwiaXNIaWRkZW4iLCJzZW5kUm91dGVTdHJlYW0iLCJjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMiLCJyb3V0ZVZhbHVlIiwicmVnZXhUb2tlbk9iaiIsImNoYW5nZVdpbmRvd0xvYyIsInNldFdpbmRvd0xvY2F0aW9uIiwiZ2V0Um91dGVTdGF0ZSIsImdldElzRGVlcExpbmtCb29sIiwiaXNIaXN0b3J5IiwiX3JvdXRlQ291bnQiLCJnZXRSb3V0ZUNvdW50IiwiZ2V0RXh0cmFQYXlsb2FkUGFyYW1zIiwiaXNEZWVwTGluayIsInJvdXRlVHlwZSIsImdldFJvdXRlU3RyRnJvbVBhcmFtcyIsImdldFByb3BGcm9tQ29uZmlnIiwicHJwIiwiZGVmYWx0IiwidHlwZUZvclN0ciIsImlzSGFzaEZvclN0ciIsIm5leHRXaW5kb3dMb2MiLCJmb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uIiwiZGF0YUZyb21TdHIiLCJnZXREYXRhRnJvbUxvY2F0aW9uU3RyIiwicGF0aElubmVybW9zdCIsImhhc2hJc1RydWUiLCJnZXRMb2NhdGlvblN0ckJ5VHlwZSIsImdldFBhcmFtc0Zyb21Sb3V0ZVN0ciIsInQiLCJsb2MiLCJwYXJhbXNEYXRhIiwiY29udmVydFBhcmFtc1RvUm91dGUiLCJjb252ZXJ0Um91dGVUb1BhcmFtcyIsImNoZWNrRW1wdHlSb3V0ZVN0ciIsImlzRW1wdHlCb29sIiwicmVtb3ZlTGFzdFNsYXNoIiwiY2hhbm5lbFBheWxvYWQiLCJwYXRobmFtZSIsImhpc3RvcnkiLCJwdXNoU3RhdGUiLCJjaGVja0ZvclNsYXNoIiwid2hlbiIsImNvbXBsZW1lbnQiLCJfXyIsImdldFdpbmRvd0xvY2F0aW9uIiwiY3VycmllZEdldFJvdXRlIiwiY3VycnlOIiwiU3B5bmVDaGFubmVsVUkiLCJrZXlFdmVudHNMb2FkZWQiLCJrZXlDb2RlQXJyIiwibG9hZEtleVN0cmVhbSIsImtleVVwcyIsImZyb21FdmVudCIsImRvY3VtZW50Iiwia2V5UHJlc3NlcyQiLCJncm91cEJ5Iiwia2V5Q29kZSIsImluZGV4T2YiLCJyZXBlYXQiLCJvbktleVByZXNzZWQiLCJudW0iLCJyZWdpc3RlcktleSIsIm9uVUlFdmVudCIsImdldEFjdGlvblN0YXRlIiwidHlwZVZhbCIsInR5cGVPdmVyUmlkZVZhbCIsInRvVXBwZXIiLCJldmVudFR5cGUiLCJtYWluQWN0aW9uIiwiU3B5bmVDaGFubmVsV2luZG93IiwiY3VycmVudFNjcm9sbFkiLCJkb21DaGFubmVsQ29uZmlnIiwiV0lORE9XIiwib2JzJEFyciIsImdldEFjdGl2ZU9ic2VydmFibGVzIiwiZG9tJCIsInAiLCJnZXRNb3VzZVdoZWVsTWFwRm4iLCJDSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVCIsInNjcm9sbERpciIsImRlbHRhWSIsImRlbHRhWCIsImRlbHRhWiIsImNyZWF0ZUN1cnJpZWRHZW5lcmljRXZlbnQiLCJ0b1VwcGVyQ2FzZSIsImN1cnJ5IiwibWFwR2VuZXJpY0V2ZW50IiwiY3VycnlGbiIsImdldFJlc2l6ZU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UIiwiZ2V0T3JpZW50YXRpb25NYXBGbiIsIkNIQU5ORUxfV0lORE9XX09SSUVOVEFUSU9OX0VWRU5UIiwiaXNQb3J0cmFpdEJvb2wiLCJtYXRjaE1lZGlhIiwibWF0Y2hlcyIsIm9yaWVudGF0aW9uIiwiZ2V0TWVkaWFRdWVyeU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlQiLCJjcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZSIsImRlYm91bmNlVCIsImRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsIiwiY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCIsImRlYm91bmNlVGltZSIsImdldFNjcm9sbERhdGEiLCJzY3JvbGxZIiwic2Nyb2xsRGlzdGFuY2UiLCJnZXRTY3JvbGxZIiwic2Nyb2xsRWxlbWVudCIsInBhZ2VZT2Zmc2V0Iiwic2Nyb2xsVG9wIiwiZ2V0U2Nyb2xsTWFwRm4iLCJpbnRlcnZhbCIsInNjcm9sbERhdGFGbiIsImNyZWF0ZVNjcm9sbE9ic2VydmFibGUiLCJpc1Bhc3NpdmUiLCJkVGltZSIsImVsZW1lbnQiLCJpc1dpbmRvdyIsInNjcm9sbEVsRm9yVmFscyIsInNjcm9sbE1hcEZuIiwicGFydGlhbFJpZ2h0Iiwic2tpcFdoaWxlIiwibmV3U2Nyb2xsWSIsInNjcm9sbERpc3RhbmNlQWJzIiwiTWF0aCIsImFicyIsImNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZSIsImNyZWF0ZVJlc2l6ZU9ic2VydmFibGUiLCJkZWJvdW5jZU1TVGltZUZvclJlc2l6ZSIsImdldEV2ZW50c0Zyb21Db25maWciLCJldmVudHMiLCJsaXN0ZW5Gb3JNZWRpYVF1ZXJpZXMiLCJtZWRpYVF1ZXJpZXMiLCJtZXRob2RzIiwibGlzdGVuRm9yUmVzaXplIiwibGlzdGVuRm9yT3JpZW50YXRpb24iLCJsaXN0ZW5Gb3JTY3JvbGwiLCJsaXN0ZW5Gb3JXaGVlbCIsIm1hcE9iakluZGV4ZWQiLCJtZXRob2QiLCJpIiwiY2hlY2tGb3JNZWRpYVF1ZXJpZXMiLCJldmVudHNBcnIiLCJnZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSIsImNyZWF0ZU1lcmdlZE9ic0Zyb21PYmoiLCJhcHBseSIsIm9uU2Nyb2xsTG9ja0V2ZW50Iiwib25TZXRFbGVtZW50VG9TY3JvbGwiLCJjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlciIsIl9jaGFubmVscyIsInZlcnNpb24iLCJTcHluZUFwcCIsImRlZmF1bHRDb25maWciLCJzY3JvbGxMb2NrIiwic2Nyb2xsTG9ja1giLCJzY3JvbGxMb2NrWSIsInN0cmljdCIsImJhc2VIcmVmIiwiSU1HX1BBVEgiLCJwbHVnaW5NZXRob2RzIiwicGx1Z2lucyIsInRtcCIsImVwaGVtZXJhbFByb3BzIiwidG1wUHJvcHMiLCJsaXN0ZW5Gb3JNb3VzZVdoZWVsIiwiYWRkNDA0cyIsInJvdXRlVXRpbHMiLCJpbml0aWFsaXplIiwicGx1Z2luc0ZuIiwiZ2V0UGx1Z2luc01ldGhvZE9iaiIsInJlZ2lzdGVyQ2hhbm5lbCIsInJlZ2lzdGVyUGx1Z2luIiwicGx1Z2luSW5zdGFuY2UiLCJyZWdpc3RlckRhdGFDaGFubmVsIiwibGlzdENoYW5uZWxzIiwibnVsbEhvbGRlciIsImlkIiwiYXBwZW5kVG9Eb20iLCJib2R5Iiwic3R5bGUiLCJjc3NUZXh0IiwiU3B5bmUiLCJfc3B5bmVBcHBQcm9wcyIsIlNweW5lUGx1Z2luIiwicGFyZW50RWwiLCJtZXJnZURlZmF1bHRDb25maWciLCJjcmVhdGVQYXJlbnRFbCIsInJlZ2lzdGVyIiwic3B5bmVBcHBQcm9wcyIsInBsdWdpbk5hbWUiLCJvbkJlZm9yZVJlZ2lzdGVyZWQiLCJhZGRQbHVnaW5Db25maWciLCJvblJlbmRlciIsIlNweW5lQXBwUHJvcGVydGllcyIsImFzc2lnbiIsImdldFNweW5lQXBwIiwidXBkYXRlU3B5bmVDb25maWciLCJzcHluZUFwcCIsInBsdWdpbkNvbmZpZyIsInBhdGhTYXRpc2ZpZXMiLCJnZXRFbGVtZW50QnlJZCIsInBsdWdpbkVsIiwiYXBwZW5kQ2hpbGQiLCJyZW5kZXIiLCJjcmVhdGVQbHVnaW5FbCIsImNoZWNrRm9yUmVxdWlyZWRXaW5kb3dFdmVudCIsInJlcXVpcmVkRXZlbnRzIiwid2luZG93Q29uZmlnIiwiZ2V0Q2hhbm5lbENvbmZpZyIsIm1pc3NpbmdFdmVudHMiLCJDaGFubmVsRmV0Y2hVdGlsIiwiX21hcEZuIiwic2V0TWFwRm4iLCJfdXJsIiwic2V0VXJsIiwiX3Jlc3BvbnNlVHlwZSIsInNldFJlc3BvbnNlVHlwZSIsIl9zZXJ2ZXJPcHRpb25zIiwic2V0U2VydmVyT3B0aW9ucyIsIl9zdWJzY3JpYmVyIiwibG9nIiwic2VydmVyT3B0aW9ucyIsInJlc3BvbnNlVHlwZSIsInN0YXJ0V2luZG93RmV0Y2giLCJ0YXBMb2ciLCJyZXNwb25zZSQiLCJmZXRjaCIsInRhcCIsImZsYXRNYXAiLCJyIiwibWFwTWV0aG9kIiwibWV0YWRhdGEiLCJtYXBXcmFwcGVyIiwicHVibGlzaCIsImNvbm5lY3QiLCJvcHRzIiwiZ2V0Rm4iLCJzdHJpbmdpZnlCb2R5SWZJdEV4aXN0cyIsInByb3BJcyIsImNvbnZlcnRUb0pTT04iLCJ1cGRhdGVNZXRob2RXaGVuQm9keUV4aXN0cyIsImhhc0JvZHkiLCJtZXRob2RJc0dldCIsImFzc29jIiwibWVyZ2VkT3B0aW9ucyIsImJhc2VPcHRpb25zIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJBY2NlcHQiLCJtb2RlIiwiY3JlZGVudGlhbHMiLCJjYWNoZSIsInJlZGlyZWN0IiwicmVmZXJyZXIiLCJyZWZlcnJlclBvbGljeSIsImludGVncml0eSIsImtlZXBhbGl2ZSIsImlzTm90QXJyIiwibm90IiwiaXNOb3RFbXB0eSIsImlzTm9uRW1wdHlTdHIiLCJpc05vbkVtcHR5QXJyIiwiaXNPYmplY3RGbiIsImlzTm9uRW1wdHlPYmplY3RGbiIsIkNoYW5uZWxQYXlsb2FkRmlsdGVyIiwic2VsZWN0b3IiLCJmaWx0ZXJzIiwiZGVidWdMYWJlbCIsImRlYnVnTGFiZWxBcnIiLCJwcm9wRmlsdGVycyIsImFkZFN0cmluZ1NlbGVjdG9yRmlsdGVyIiwiZmlsdGVyU2VsZWN0b3IiLCJhZGRBcnJheVNlbGVjdG9yRmlsdGVyIiwiYWRkRGF0YUZpbHRlciIsImZpbHRlckRhdGEiLCJmaWx0ZXJzQXJyIiwiZmlsdGVyc0FyZUVtcHR5IiwiZmlsdGVySnNvbiIsImZpbHRlcmRlYnVnTGFiZWwiLCJmblZhbCIsIkYiLCJpc1N0cmluZyIsIkJvb2xlYW4iLCJpc0Jvb2xlYW4iLCJpc051bWJlciIsImNvbXBhcmVTdHIiLCJpc0FycmF5Rm4iLCJmTWV0aG9kIiwid2hlcmUiLCJjb21wYXJlZE9iaiIsInByb3BzQm9vbGVhbnMiLCJmb3JFYWNoT2JqSW5kZXhlZCIsImNvbXBhcmVEYXRhIiwiY2hlY2tQYXlsb2FkU2VsZWN0b3IiLCJzcmNQYXlsb2FkIiwic3JjIiwiY29tcGFyZUVscyIsImVsQ29tcGFyZSIsImlzRXF1YWxOb2RlIiwibWFwTm9kZUFycldpdGhFbCIsInNlbCIsIm5vZGVBcnIiLCJmbGF0dGVuIiwicXVlcnlTZWxlY3RvckFsbCIsIm5vZGVBcnJSZXN1bHRzRGVidWdnZXIiLCJzZWxlY3RvcnNBcnIiLCJub2RlQXJyUmVzdWx0IiwiYW55IiwicXVlcnlTZWxlY3RvciIsInNlbGVjdG9yQXJyIiwicGF5bG9hZENoZWNrIiwiaXNNZXJnZWFibGVPYmplY3QiLCJ0b1N0cmluZyIsImNsb25lSWZOZWNlc3NhcnkiLCJvcHRpb25zQXJndW1lbnQiLCJkZWVwTWVyZ2UiLCJpc0FycmF5IiwiZGVmYXVsdEFycmF5TWVyZ2UiLCJ0YXJnZXQiLCJzb3VyY2UiLCJkZXN0aW5hdGlvbiIsInNsaWNlIiwiYXJyYXkiLCJhcnJheU1lcmdlIiwibWVyZ2VPYmplY3QiLCJFcnJvciIsInByZXYiLCJkZWxheUNhbGwiLCJhc3luYyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiZ2V0Q29uc3RydWN0b3JOYW1lIiwic3Vic3RyIiwiZmluZFN0ck9yUmVnZXhNYXRjaFN0ciIsInMiLCJjaGVja2VySWZSZWdleE1hdGNoRXhpc3RzIiwiY29udmVydERvbVN0cmluZ01hcFRvT2JqIiwiZG9tTWFwIiwiY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCIsImlzTm90TmlsIiwiaXNOb3ROaWxBbmRJc05vdEVtcHR5IiwiZ2V0QWxsTWV0aG9kTmFtZXMiLCJpbnN0YW5jZSIsIm9taXR0ZWRNZXRob2RzIiwiY29tYmluZWRPbWl0dGVkTWV0aG9kcyIsIm9taXRQcm9wc0Zyb21BcnIiLCJ3aXRob3V0IiwidW5pcSIsInN0YXRpY01ldGhvZHMiLCJhbGxNZXRob2RzIiwiZ2MiLCJiYXNlQ29yZU1peGlucyIsImNyZWF0ZXByb3BzTWFwIiwid20iLCJXZWFrTWFwIiwib2JqS2V5IiwidnNpZCIsIndlYWtNYXAiLCJjcmVhdGVJZCIsInJhbmRvbSIsInN1YnN0cmluZyIsInNldFRyYWNlRnVuYyIsImJhc2VTdHJlYW1zTWl4aW5zIiwidGVzdEZ1bmMiLCJzZW5kUm91dGVQYXlsb2FkIiwic2VuZFVJUGF5bG9hZCIsIlJvdXRlQ2hhbm5lbFVwZGF0ZXIiLCJjeHQiLCJjcmVhdGVUZW1wb3JhcnlWaWV3U3RyZWFtT2JqIiwic2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSIsInZzIiwib25SZW5kZXJlZCIsInNlbmRJbmZvVG9DaGFubmVsIiwiYWZ0ZXJCcm9hZGNhc3RFdmVudHMiLCJkaXNwb3NlVmlld1N0cmVhbSIsImFwcGVuZFRvTnVsbCIsInNhZmVDbG9uZSIsIl9fcHJveHlfX3Byb3h5TmFtZSIsInByb3h5UmV2aXZlck1ldGhvZCIsImdldFByb3h5UmV2aXZlciIsInByb3h5T2JqIiwiY2xvbmVOZXN0ZWRQcm94eU9iaiIsInBhdGhBcnIiLCJuZXN0ZWRQcm94eU9iaiIsIl9fcHJveHlfX2lzUHJveHkiLCJfX3Byb3h5X19wcm9wcyIsInJvb3RPYmoiLCJwcm94eUl0ZXJhYmxlIiwiaXRlck9iaiIsIml0ZXJQYXRoIiwiZGF0YVBhdGgiLCJlbnRyaWVzIiwiZ2V0UHJvcFR5cGUiLCJjbG9uZWRQYXRoIiwiY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqIiwiX3Nhbml0aXplSFRNTCIsImlzQ29uZmlndXJlZCIsInNhbml0aXplSFRNTENvbmZpZ3VyZSIsInRydXN0ZWRUeXBlcyIsInBvbGljeSIsImNyZWF0ZVBvbGljeSIsImNyZWF0ZUhUTUwiLCJ0b19lc2NhcGUiLCJSRVRVUk5fVFJVU1RFRF9UWVBFIiwiaHRtbCIsIl9jb25maWciLCJfY2hhbm5lbHNNYXAiLCJfaW5pdGlhbGl6ZWQiLCJfZGVidWciLCJfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUiLCJfbmF2TGlua3MiLCJfSU1HX1BBVEgiLCJfZG9Ob3RUcmFja0NoYW5uZWxzQXJyIiwiX3Byb3hpZXNNYXAiLCJfc3B5bmVQbHVnaW5NZXRob2RzIiwiY29uZm9ybVJvdXRlT2JqZWN0Iiwic2V0Q2hhbm5lbHNNYXAiLCJzZXRIZWFkQmFzZUhyZWYiLCJiYXNlVGFnIiwiY3JlYXRlRWxlbWVudCIsImhyZWYiLCJhZGQ0MDRQcm9wcyIsInNldFByb3AiLCJpc1RlbXAiLCJnZXRQcm9wIiwidGVtcFZhbCIsImNyZWF0ZVRlbXBQcm9wIiwic2V0Q2hhbm5lbENvbmZpZyIsImNoYW5uZWxDb25maWciLCJhZGRQbHVnaW5NZXRob2RzIiwicGx1Z2luTWV0aG9kc09iaiIsImFkZE1ldGhvZHMiLCJnZXRVbnRyYWNrZWRDaGFubmVsc0xpc3QiLCJyZWdpc3RlclByb3h5UmV2aXZlciIsInByb3h5TmFtZSIsImdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZSIsImV4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlIiwibGlua3NEYXRhIiwidGVtcEdldENoYW5uZWxzSW5zdGFuY2UiLCJ0ZW1wR2V0Q29uZmlnIiwiX3BsdWdpbk1ldGhvZHNPYmoiLCJjcmVhdGUiLCJTcHluZVBsdWdpbnNNZXRob2RzIiwiZm9vIiwiYWRkTWV0aG9kIiwid2FyblN0ciIsIm1ldGhvZHNPYmoiLCJrZXlTdHIiLCJjaGVja0lmTWV0aG9kRXhpc3RzIiwiU3B5bmVUcmFpdCIsInBhcmVudENvbnRleHQiLCJwcmVmaXgiLCJhdXRvSW5pdCIsImF1dG9CaW5kZXIiLCJhbGxNZXRob2RzTGlzdCIsImluaXRBdXRvQmluZGVyIiwiZ2V0RW5oYW5jZXJNZXRob2RzIiwiY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzIiwibWFsZm9ybWVkTWV0aG9kc0FyciIsIndhcm5pbmdTdHIiLCJiaW5kUGFyZW50Vmlld1N0cmVhbSIsImNvbnRleHQiLCJiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSIsImlzU3RhdGljIiwiY29uc3RydWN0b3JUeXBlIiwiYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0iLCJiaW5kQ3VycnkiLCJTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIiwiY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgiLCJwYXJhbVZhbHVlIiwicm91dGVPYmoiLCJyZWplY3RQYXJhbUtleSIsInJlZ2V4TWF0Y2hTdHIiLCJjaGVja2VyIiwiaGFzaCIsInNlYXJjaCIsInByb3BWYWwiLCJzbGFzaCIsInF1ZXJ5IiwiY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMiLCJyb3V0ZSIsInBhcmFtc0Zyb21Mb2MiLCJ1cmxBcnIiLCJsb29wVGhyb3VnaFBhcmFtIiwidXJsT2JqIiwia2V5d29yZCIsInBhcmFtVmFsRnJvbURhdGEiLCJwYXJhbVZhbFR5cGUiLCJpc09iamVjdCIsIm9iamVjdFBhcmFtRXhpc3RzIiwib2JqZWN0Q29udGFpbnNSb3V0ZSIsIm5ld09iaiIsImNyZWF0ZVNsYXNoU3RyaW5nIiwiYXJyQ2xlYXIiLCJub3RVbmRlZmluZWQiLCJzdHJpcFJlZ2V4Iiwiam9pbmVyIiwiY3JlYXRlUXVlcnlTdHJpbmciLCJjcmVhdGVQYWlyIiwiY2hlY2tQYWlyIiwibWFwQXJyYXlPZlBhaXJzIiwiY2hlY2tJZlN0cklzRW1wdHkiLCJjcmVhdGVRcyIsImNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzIiwidXJsc0FyciIsInBhcnNlU3RyaW5nIiwiZ2V0T3ZlcnJpZGVWYWwiLCJvdmVycmlkZVZhbCIsImNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzIiwiaW5wdXQiLCJnZXRTdHJpbmdCZWZvcmVQaXBlIiwiY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2giLCJ1cGRhdGVkT2JqIiwiZ2xvYlBhdHRlcm4iLCJzcGxpdCIsInNvbWUiLCJwYXR0ZXJuIiwiZXNjYXBlZFBhdHRlcm4iLCJnbG9iUGF0dGVybk1hdGNoIiwibG9jU3RyIiwidXJsVHlwZSIsImxvY2F0aW9uU3RyIiwicGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiIsImZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgiLCJtYWluU3RyIiwiaXM0MDQiLCJjaGVja0ZvckVtcHR5IiwiY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2giLCJmaW5kTGFzdEluZGV4IiwicmUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJmaW5kTWF0Y2hJbmRleCIsImNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0iLCJyZWdleFRva2VucyIsImxhc3QiLCJnZXRWYWxDb21wYXJlQXJyIiwicGFyYW1JbmRleCIsInBhcmFtU3RyIiwicGFyYW0iLCJpbnZlcnRlZE9iaiIsImludmVydCIsInBhcmFtSW52ZXJ0ZWQiLCJnZXRQYXJhbUludmVydGVkIiwiY3JlYXRlQXJyRnJvbVNsYXNoU3RyIiwiY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaiIsInRvcExldmVsUm91dGUiLCJ2YWx1ZXNBcnIiLCJyb3V0ZWRWYWx1ZXNBcnIiLCJsYXRlc3RPYmoiLCJ0b3RhbCIsImN1cnJlbnRWYWx1ZSIsInJvdXRlVmFsdWVTdHIiLCJpc0VtcHR5T3JOaWwiLCJwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGgiLCJzdHJQYXRoIiwib2JqZWN0RnJvbVN0ciIsIm9iamVjdEZyb21Sb3V0ZVBhcmFtIiwiemlwT2JqIiwiZ2V0TGFzdEFyclZhbCIsImEiLCJjcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIiLCJjb252ZXJ0UXVlcnlTdHJUb1BhcmFtcyIsInN0ckFyciIsImNvbnZlcnRUb1BhcmFtcyIsIlNweW5lVXRpbHNDaGFubmVsUm91dGUiLCJzdWJzY3JpYmVGbiIsImZyb21FdmVudFBhdHRlcm4iLCJoYW5kbGVyIiwib25wb3BzdGF0ZSIsInBpY2tWYWx1ZXMiLCJvYmoxIiwib2JqMiIsImNyZWF0ZVByZWQiLCJnZXRQcm9wc1N0YXRlIiwic2FtZSIsInByZXZpb3VzRXhpc3RzIiwibmV4dEV4aXN0cyIsImNoYW5nZWQiLCJhZGRlZCIsInJlbW92ZWQiLCJwYXRoc0NoYW5nZWQiLCJwYXRoc0FkZGVkIiwicGF0aHNSZW1vdmVkIiwiZ2V0Q29tcGFyZXIiLCJnZXRSb3V0ZUFyckRhdGEiLCJyb3V0ZUFyciIsImdvIiwib2JqXyIsImtfIiwidl8iLCJhZGRSb3V0ZURhdGFzZXRzIiwiY2hhbm5lbFJvdXRlT2JqIiwiZ2V0SFJFRiIsImlzVmFsaWRTdHJSRSIsImNyZWF0ZUluaXRpYWxWYWxGbiIsImFjY01haW4iLCJyb3V0ZVBhdGhPYmoiLCJvYmpBY2MiLCJhcnJQYWlyIiwiZ2V0TGlua1RleHQiLCJjcmVhdGVUaXRsZSIsInN1YlJvdXRlTmFtZSIsIm9CYXNlIiwibmF2TGV2ZWwiLCJ0aXRsZSIsInJlZHVjZWRBcnIiLCJyb3V0ZU5hbWVzQXJyIiwiZGF0YXNldHNBcnIiLCJleGNsdWRlIiwiZ2V0TWFpbktleXMiLCJnZXROYXZQcm9wcyIsImNoYW5uZWxzUm91dGVQYXRoIiwicGFyc2VSb3V0ZVBhdGgiLCJjb25maWdNYXBwZXJGbiIsIm9iajQwNCIsImlzUm91dGVQYXRoIiwiZXh0cmFSb3V0ZURhdGEiLCJTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdyIsImV2ZW50TmFtZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXNzaXZlIiwiY3JlYXRlTWVkaWFRdWVyeSIsIm1xIiwiY2hlY2tJZlZhbGlkTWVkaWFRdWVyeSIsIm5vU3BhY2VzIiwiaXNWYWxpZEJvb2wiLCJtZWRpYSIsIndhcm5Nc2ciLCJtYXBLZXkiLCJtZWRpYVF1ZXJ5TmFtZSIsImtleUZuIiwibWVkaWFRdWVyeUhhbmRsZXIiLCJxIiwiYWRkSGFuZGxlciIsImFkZExpc3RlbmVyIiwicmVtb3ZlSGFuZGxlciIsIm9uY2hhbmdlIiwibWVkaWFRdWVyaWVzT2JqIiwiY3JlYXRlRmFkZXJJbmxpbmVUZXh0IiwiaXNJbkJvb2wiLCJzdGFydFplcm9Cb29sIiwiZmFkZWluIiwiY3VycmVudE9wYWNpdHkiLCJnZXRDb21wdXRlZFN0eWxlIiwib3BhY2l0eSIsImlubGluZUNzcyIsImZhZGVvdXQiLCJjYWxsYmFjayIsIlZpZXdTdHJlYW1PYnNlcnZhYmxlIiwib2JzZXJ2YWJsZVN0cmVhbXMiLCJjcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzIiwiY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0IiwiZGlySW50ZXJuYWwiLCJkaXJQYXJlbnQiLCJkaXJDaGlsZCIsIlAiLCJDIiwiUENJIiwiQ0kiLCJQSSIsIlBDIiwiYWRkRGVmYXVsdERpciIsImZsaXAiLCJkZWZhdWx0cyIsImFkZERvd25JbnRlcm5hbERpciIsImFkZENoaWxkQW5kSW50ZXJuYWxEaXIiLCJtYXBUb0RlZmF1bHREaXIiLCJ2aWV3TmFtZSIsImZpbHRlclN0cmVhbXMiLCJwcm9wU2F0aXNmaWVzIiwiYXJyVHlwZSIsImZpbHRlclBhcmVudCIsImZpbHRlckNoaWxkIiwiZmlsdGVySW50ZXJuYWwiLCJhZGRmcm9tJCIsInJlbFN0ciIsImZyb20kIiwiYWRkUGFyZW50ZnJvbSQiLCJhZGRJbnRlcm5hbGZyb20kIiwiYWRkQ2hpbGRmcm9tJCIsInJhdyQiLCJ0b0ludGVybmFsJCIsInRvUGFyZW50JCIsInRvQ2hpbGQkIiwic3RyZWFtT2JqIiwicGFyZW50IiwiaW50ZXJuYWwiLCJjaGlsZCIsImNvbXBsZXRlQWxsIiwiY29tcGxldGUiLCJpc1N0b3BwZWQiLCJjb21wbGV0ZVN0cmVhbSIsIkRvbUVsZW1lbnRUZW1wbGF0ZSIsInRlbXBsYXRlIiwiZm9ybWF0VGVtcGxhdGUiLCJpc1Byb3h5RGF0YSIsIl9fY21zX19pc1Byb3h5Iiwic3B5bmVEYXRhIiwiY2hlY2tGb3JBcnJheURhdGEiLCJ0ZW1wbGF0ZURhdGEiLCJnZXRTdHJpbmdBcnJheSIsInN0ck1hdGNoZXMiLCJmaW5kVG1wbExvb3BzUkUiLCJwYXJzZVRtcGxMb29wc1JFIiwicGFyc2VUbXBsTG9vcEZuIiwicGFyc2VUaGVUbXBsTG9vcCIsImZpbmRUbXBsTG9vcHNQcmVkIiwiY2hlY2tGb3JNYXRjaGVzIiwiYWRkUGFyYW1zIiwiZmluYWxBcnIiLCJpc1ByaW1pdGl2ZVRhZyIsImdldE5lc3RlZERhdGFSZWR1Y2VyIiwibmVzdGVkRGF0YSIsImVtcHR5UkUiLCJzd2FwUGFyYW1zRm9yVGFnc1JFIiwicmVtb3ZlVGhpcyIsInJlbmRlckRvY0ZyYWciLCJyZXBsYWNlSW1nUGF0aCIsImNyZWF0ZVJhbmdlIiwiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiwicmVuZGVyVG9TdHJpbmciLCJnZXRUZW1wbGF0ZVN0cmluZyIsImlubmVySFRNTCIsImdldERhdGFWYWxGcm9tUGF0aFN0ciIsInBhdGhTdHIiLCJkYXRhRmlsZSIsInRlbXBsYXRlU3RyIiwicmVwbGFjZUFsbCIsInJlRG90Iiwic3ViU3RyIiwiZWxEYXRhIiwiYXJyYXlTdHJpbmdUb09iakFkYXB0ZXIiLCJwYXJzZU9iamVjdCIsInNweW5lTG9vcEtleSIsImxvb3BJbmRleCIsImxvb3BOdW0iLCJfX2Ntc19fZGF0YUlkIiwib3JpZ0tleSIsImNyZWF0ZURhdGFPYmoiLCJpbmRleCIsIm9yaWdJbmRleCIsImRhdGFSZWR1Y2VkVmFsIiwiRG9tRWxlbWVudCIsInRhZ05hbWUiLCJhdHRyaWJ1dGVzIiwiZ2V0RG9tQXR0cmlidXRlcyIsImF0dHJzIiwidXBkYXRlQXR0cnMiLCJmcmFnbWVudCIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJzZXRFbEF0dHJzIiwicGFyYW1zIiwic2V0QXR0cmlidXRlIiwidGhlTWFwIiwiYWRkVGVtcGxhdGUiLCJmcmFnIiwiYWRkVG1wbCIsImFkZENvbnRlbnQiLCJ0ZXh0IiwidHh0IiwiY3JlYXRlVGV4dE5vZGUiLCJleGVjdXRlIiwicmVuZGVyVG9IVE1MU3RyaW5nIiwib3V0ZXJIVE1MIiwicmV0dXJuSWZEZWZpbmVkIiwidXBkYXRlcHJvcHMiLCJ1cGRhdGVwcm9wc0FuZFJ1biIsInVubW91bnQiLCJyZW1vdmUiLCJ1cGRhdGVUYWciLCJ1cGRhdGVBdHRyaWJ1dGVzIiwidXBkYXRlVGVtcGxhdGUiLCJ1cGRhdGVEYXRhIiwiYWRkVGFnQW5kUmVuZGVyIiwiYWRkQXR0cnNpYnV0ZXNBbmRSZW5kZXIiLCJhZGRUZW1wbGF0ZUFuZFJlbmRlciIsImFkZERhdGFBbmRSZW5kZXIiLCJjb3JlTWl4aW5zIiwiYXR0cmlidXRlc0FycmF5IiwiaXNEZXZNb2RlIiwiVmlld1N0cmVhbUJyb2FkY2FzdGVyIiwiYnJvYWRjYXN0Rm4iLCJicm9hZGNhc3RlciIsImFkZERibENsaWNrRXZ0IiwidHlwZU92ZXJSaWRlIiwiYnJvYWRjYXN0IiwiYXJncyIsImNoYW5uZWxQYXlsb2FkcyIsIlVJIiwibG9jYWwiLCJjaGVja1BhcmVudEVscyIsImVsU2VsZWN0ZWQiLCJwYXJlbnRFbGVtZW50IiwicGx1Y2tFbEZyb21QYXJlbnQiLCJpc0xvY2FsRXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsImNoIiwic3JjRXZlbnQiLCJhcnJGbiIsInN0cmVhbU1peGlucyIsIlZpZXdTdHJlYW1FbGVtZW50Iiwic2luayQiLCJ2aWV3UHJvcHMiLCJ2c05hbWUiLCJfc3RhdGUiLCJleHRlbmRlZEhhc2hNZXRob2RzIiwiYWRkQWN0aW9uTGlzdGVuZXJzIiwiZnVuY1N0ciIsImhhc2hNZXRob2RzIiwic2V0SGFzaE1ldGhvZHMiLCJvbk9ic1NpbmtTdWJzY3JpYmUiLCIkZGlycyIsInNvdXJjZVN0cmVhbXMiLCJfc291cmNlJCIsImV4dGVuZGVkSGFzaE1ldGhvZHNPYmoiLCJkZWZhdWx0SGFzaE1ldGhvZHMiLCJWU19ERVRSSVRVU19DT0xMRUNUIiwib25HYXJiYWdlQ29sbGVjdCIsIlJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUIiwib25SZWFkeUZvckdDIiwiRVhUSVJQQVRFIiwib25EaXNwb3NlIiwiVlNfU1BBV04iLCJWU19TUEFXTl9BTkRfQVRUQUNIX1RPX1BBUkVOVCIsIm9uUmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQiLCJWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTSIsIm9uUmVuZGVyQW5kQXR0YWNoVG9Eb20iLCJBVFRBQ0hfQ0hJTERfVE9fU0VMRiIsIm9uQXR0YWNoQ2hpbGRUb1NlbGYiLCJjcmVhdGVEb21JdGVtIiwib25EaXNwb3NlQ29tcGxldGVkIiwiYW5pbWF0ZUluVHdlZW4iLCJhbmltYXRlT3V0VHdlZW4iLCJzZXRBbmltYXRlSW4iLCJhbmltYXRlSW4iLCJkb21JdGVtIiwiYW5pbWF0ZUluVGltZSIsImRpc3Bvc2VNZXRob2QiLCJnY0RhdGEiLCJmYWRlT3V0T2JzIiwiYmluZENhbGxiYWNrIiwiYW5pbWF0ZU91dFRpbWUiLCJvbkZhZGVvdXRDb21wbGV0ZWQiLCJhbmltYXRlT3V0IiwicmVtb3ZlU3RyZWFtIiwiZ2V0U291cmNlU3RyZWFtIiwiY29tYmluZURvbUl0ZW1zIiwiY29udGFpbmVyIiwibm9kZSIsImFmdGVyIiwiYXR0YWNoVHlwZSIsImluc2VydEJlZm9yZSIsImZpcnN0Q2hpbGQiLCJjaGlsZFJlbmRlckRhdGEiLCJyZW5kZXJEb21JdGVtIiwiZ2V0RWwiLCJJIiwiZXh0ZW5kZWRNZXRob2RzIiwiYXR0YWNoRGF0YSIsImRlZmF1bHRUb0ZuIiwic2VuZERhdGEiLCJWaWV3U3RyZWFtUGF5bG9hZCIsInNlbmRUb0RpcmVjdG9yU3RyZWFtIiwiZGlyZWN0b3JTdHJlYW0kIiwiZ2V0RWxPckxpc3QiLCJ2ZXJib3NlQm9vbCIsImxpc3QiLCJnZXROb2RlTGlzdEFycmF5IiwidGVzdFNlbGVjdG9ycyIsInRyaW0iLCJpc1ZhbGlkU2VsZWN0b3IiLCJpc1ZhbGlkU2VsZWN0b3JCb29sIiwiaXNQYXJlbnQiLCJlbEFyciIsInJldHVyblNlbGVjdG9ySWZWYWxpZCIsInNldElubGluZUNzcyIsIlZpZXdTdHJlYW1TZWxlY3RvciIsImdlbmVyYXRlU3B5bmVTZWxlY3RvcklkIiwiYWRkQ2xhc3MiLCJjbGFzc0xpc3QiLCJhZGQiLCJyZW1vdmVDbGFzcyIsInNldENsYXNzIiwicmVtb3ZlQ2xhc3NTdHJBcnIiLCJjbGFzc05hbWUiLCJjbGFzc1N0ckFyciIsInRvZ2dsZUNsYXNzIiwiY29udGFpbnMiLCJ0b2dnbGUiLCJodG1sRWxlbWVudCIsImFkZEFuaW1DbGFzcyIsInNldEFjdGl2ZUl0ZW0iLCJlbFNlbCIsImN1cnJlbnRFbCIsIm5vZGVDaGVjayIsIlZpZXdTdHJlYW0iLCJ2c251bSIsIl9wb3N0UmVuZGVyQ2FsbGVkIiwic2VuZExpZmVjeWxlRXZlbnRzIiwiaGFzaElkIiwiaWQkIiwidmlld0NsYXNzIiwiZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHMiLCJhZGREZWZhdWx0RGlyZWN0aW9uIiwic2VuZExpZmVjeWNsZU1ldGhvZCIsInNlbmRMaWZlY3ljbGVNZXRob2RBY3RpdmUiLCJzZW5kTGlmZWN5Y2xlTWV0aG9kSW5hY3RpdmUiLCJhdHRyaWJ1dGVzQXJyIiwiZG9tQXR0cmlidXRlcyIsImxvYWRBbGxNZXRob2RzIiwiZWxJc0FscmVhZHlSZW5kZXJlZEJvb2wiLCJlbEFscmVhZHlFeGlzdHNGbiIsIlZpZXdDbGFzcyIsIl9yYXdTb3VyY2UkIiwic2VuZEV2ZW50c0Rvd25TdHJlYW0iLCJzZW5kRXZlbnRzRG93blN0cmVhbUZuIiwiaW5pdFZpZXdTdHJlYW0iLCJhZGRlZENoYW5uZWxzIiwiY2hlY2tJZkVsZW1lbnRBbHJlYWR5RXhpc3RzIiwic291cmNlJCIsImNoZWNrSWZBY3Rpb25zQXJlUmVnaXN0ZXJlZCIsImFjdGlvbnNBcnIiLCJjaGVja0Zvck1hdGNoIiwic3RyTWF0Y2giLCJmaW5kSW5kZXgiLCJnZXRBbGxBY3Rpb25zQXJyIiwiY2hhbm5lbFN5bnRheCIsImdldEFsbEFjdGlvbnMiLCJpc1ZhbGlkTmVzdGVkQXJyIiwiaXNUcnVlIiwiYWxsSXNUcnVlIiwiaXNWYWxpZEFyciIsIm1hcEV2ZW50c0FyckZuIiwidXBkYXRlUHJvcHNUb01hdGNoRWwiLCJnZXRUYWdOYW1lIiwidG9Mb3dlciIsInBvc3RSZW5kZXIiLCJjaGFubmVsRm4iLCJvbkNoYW5uZWxNZXRob2RDYWxsIiwiYWN0aW9uRmlsdGVyIiwiaGFzaFNvdXJjZU1ldGhvZHMiLCJzZXRTb3VyY2VIYXNoTWV0aG9kcyIsImRlbGV0ZWQiLCJmaWx0ZXJQYXlsb2FkIiwicnVuRnVuYyIsImhhc2hTb3VyY2VLZXlzIiwiRVhUSVJQQVRJTkciLCJjaGVja1BhcmVudERpc3Bvc2UiLCJWU19TUEFXTkVEIiwib25WU1JlbmRlcmVkIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UIiwib25SZWFkeVRvR0MiLCJWU19OVUxMSVRZIiwib25NYXBWaWV3U291cmNlIiwidGFrZVdoaWxlIiwibm90R0NTVEFURSIsImluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zIiwidXBkYXRlU291cmNlU3Vic2NyaXB0aW9uIiwiZXFHQ1NUQVRFIiwibm90Q09NUExFVEVEIiwibm90R0NDT01QTEVURSIsInRlc3RWYWwiLCJhZGRQYXJlbnRTdHJlYW0iLCJwYXJlbnQkIiwicmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQiLCJhZGRDaGlsZFN0cmVhbSIsImNoaWxkJCIsInRyYWNlciIsImZpbmFsaXplIiwib25DaGlsZENvbXBsZXRlZCIsIm9uQ2hpbGREaXNwb3NlZCIsImNoaWxkQ29tcGxldGVkRGF0YSIsIngiLCJmaW5hbERlc3QiLCJ5IiwiZmluZE5hbWUiLCJvblN1YnNjcmliZVRvU291cmNlc05leHQiLCJvblN1YnNjcmliZVRvU291cmNlc0Vycm9yIiwib25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZSIsImVsJCIsInViZXJTb3VyY2UkIiwiYXV0b1N1YnNjcmliZXIkIiwiZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkIiwib2JzQ291bnQiLCJhdXRvTWVyZ2VTdWJqZWN0JCIsIm1lcmdlTWFwIiwib2JzRGF0YSIsImJyYW5jaE9ic2VydmFibGUkIiwiYXV0b0Nsb3Nlc0Jvb2wiLCJyZWwiLCJzZW5kRXh0ZW5kZWRTdHJlYW1zIiwiaGFzaEFjdGlvblN0ciIsIm9wZW5TcGlnb3QiLCJyZW5kZXJWaWV3IiwicmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tIiwib25CZWZvcmVEaXNwb3NlIiwibXMiLCJtZXRob2RGbiIsIm9uQ2hpbGREaXNwb3NlIiwib25QYXJlbnREaXNwb3NpbmciLCJpc0ludGVybmFsIiwic2V0QXR0YWNoRGF0YSIsImNoZWNrUXVlcnkiLCJnZXRQYXJlbnRFbHMiLCJnZXRFbGVtIiwic2V0QXR0YWNoUGFyZW50RGF0YSIsImxldmVsIiwiZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCIsImNoaWxkVmlldyIsImFwcGVuZFRvRG9tQWZ0ZXIiLCJwcmVwZW5kVG9Eb20iLCJhcHBlbmRWaWV3IiwiYXBwZW5kVmlld0FmdGVyIiwiYXBwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlldyIsIl9wb3N0UmVuZGVyZWRDYWxsZWQiLCJiZWZvcmVBZnRlclJlbmRlciIsImFmdGVyUmVuZGVyIiwib25BbmltRnJhbWVBZnRlclJlbmRlcmVkIiwiYnJvYWRjYXN0RXZlbnRzIiwiaW5pdGlhbGl6ZUNoYW5uZWxzIiwidmlld3NTdHJlYW1Ccm9hZGNhc3RlciIsInB1bGxBY3Rpb25zRnJvbUxpc3QiLCJuZXN0ZWRBY3Rpb25zQXJyIiwiY2hlY2tGb3JFeGlzdGluZ01ldGhvZCIsIkZ1bmN0aW9uIiwiZGVsYXlGb3JQcm94eUNoYW5uZWxSZXNldHMiLCJzZXREYXRhVlNJRCIsImRvd25TdHJlYW0iLCJza2lwRmlyc3QiLCJhZGRDaGFubmVsIiwic2VuZERvd25TdHJlYW0iLCJkaXJlY3Rpb25BcnIiLCJpc0xvY2FsRXZlbnRDaGVjayIsImNpZENoZWNrIiwicGlwZUFyciIsImZpbHRlckV2ZW50IiwidW5zaGlmdCIsInNraXAiLCJjaGFubmVsJCIsImNoZWNrSWZDaGFubmVsRXhpc3RzIiwiY2hhbm5lbEV4aXN0cyIsImRlZmF1bHRUb0FjdGlvbiIsImdldEFjdGlvbkZuIiwiQ0hBTk5FTF9ST1VURSIsIm9mIiwiaXNEaXNwb3NlZCIsImNyZWF0ZUFjdGlvbkZpbHRlciIsInNlbGVjdG9ycyIsIml0ZW1FbCIsInRoaXNFbCIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJuIiwiZ2V0dGVyIiwiX19lc01vZHVsZSIsImRlZmluaXRpb24iLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyJdLCJzb3VyY2VSb290IjoiIn0=
|
|
2
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("rxjs"),require("ramda"),require("dompurify"),require("rxjs").operators):"function"==typeof define&&define.amd?define("spyne",["rxjs","ramda","dompurify","rxjs/operators"],t):"object"==typeof exports?exports.spyne=t(require("rxjs"),require("ramda"),require("dompurify"),require("rxjs").operators):e.spyne=t(e.rxjs,e.R,e.DOMPurify,e.rxjs.operators)}(self,((e,t,r,s)=>(()=>{"use strict";var n={126:(e,t,r)=>{r.d(t,{e:()=>i});var s=r(2),n=r(9),o=r(131);class i extends s.c{constructor(e,t={}){i.validateMapMethod(t,e),void 0!==t.map&&(t.mapFn=t.map),t.extendedActionsArr=[`${e}_RESPONSE_EVENT`,[`${e}_REQUEST_EVENT`,"onFetchUpdate"]],t.sendCachedPayload=!0,super(e,t)}static validateMapMethod(e,t,r=!1){const s=(0,o.either)(o.isNil,(e=>"function"!=typeof e)),n=(0,o.all)(s),i=(0,o.allPass)([n,e=>e.length>=1]);return!(0,o.compose)(i,o.values,(0,o.pick)(["map","mapFn"]))(e)||(!1===r&&console.warn(`Spyne Warning: The map method for ChannelFetch, ${t}, appears to be invalid`),!1)}onRegistered(e=this.props){!0!==e?.pause&&this.startFetch()}addRegisteredActions(e){const t=(0,o.compose)((0,o.defaultTo)([]),(0,o.path)(["props","extendedActionsArr"]));return["CHANNEL_RESPONSE_EVENT",["CHANNEL_UPDATE_RESPONSE_EVENT","onFetchUpdate"],["CHANNEL_FETCH_REQUEST_EVENT","onFetchUpdate"]].concat(t(this))}startFetch(e={},t=this.onFetchReturned.bind(this)){const r=this.consolidateAllFetchProps(e);return new n.G(r,t,!1,this.props.name)}onFetchUpdate(e){const t=this.getPropsForFetch(e);this.startFetch(t)}onFetchReturned(e){return this.createChannelPayloadItem(e)}createChannelPayloadItem(e,t=`${this.props.name}_RESPONSE_EVENT`){const{name:r,sendCachedPayload:s,url:n}=this.props,o={name:r,sendCachedPayload:s,url:n};this.sendChannelPayload(t,e,o)}getPropsForFetch(e){const t=(0,o.path)(["viewStreamInfo","payload"],e);return(0,o.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t)}consolidateAllFetchProps(e,t=this.props){const r=(0,o.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t),s=(0,o.reject)(o.isNil);return(0,o.compose)(s,((e,t)=>(0,o.mergeDeepRight)(e,t)))(r,e)}get observer(){return this.observer$}}},980:(e,t,r)=>{r.d(t,{m:()=>i});var s=r(131),n=r(225),o=r(961);class i{constructor(e,t,r,a,c,d){const l=e;d&&console.time(d);const E={channelName:e,action:t,srcElement:a,event:c},p=i.deepFreeze(r);if(E.payload=p,!0===n.M.debug){if(Object.prototype.hasOwnProperty.call(r,"payload")){const e=JSON.stringify(r);console.warn(`Spyne Warning: the following payload contains a nested payload property which may create conflicts: Action: ${t}, ${e}`)}const e=n.M.getChannelActions(l);i.validateAction(t,l,e)}E.clone=()=>(0,s.mergeAll)([{payload:(0,o.l)(E.payload)},E.payload,{channel:(0,s.clone)(l)},{event:(0,s.clone)(c)},{srcElement:a},(0,s.clone)(E.srcElement),{action:(0,s.clone)(E.action)}]);const h={$dir:{get:()=>E._dir,set:e=>(E._dir=e,e)}};return"CHANNEL_ROUTE"===l&&(h.location={get:()=>i.getLocationData()}),E._dir=void 0,Object.defineProperties(E,h),d&&console.timeEnd(d),E}static validateAction(e,t,r){const o=(0,s.includes)(e,r);return!1===o&&!0===n.M.initialized&&console.warn(`warning: Action: '${e}' is not registered within the ${t} channel!`),o}static getLocationData(){return(0,s.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getStreamItem(){}static deepClone(e){const t=(0,s.is)(Array),r=(0,s.is)(Object);var n;return!1===t(n=e)&&!0===r(n)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}static deepFreeze(e){const t=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));try{Object.freeze(e),Object.getOwnPropertyNames(e).forEach((function(r){!Object.prototype.hasOwnProperty.call(e,r)||!1!==t(e[r])||null===e[r]||"object"!=typeof e[r]&&"function"!=typeof e[r]||Object.isFrozen(e[r])||i.deepFreeze(e[r])}))}catch(t){return e}return e}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}}},683:(e,t,r)=>{r.d(t,{w:()=>c});var s=r(2),n=r(225),o=r(968),i=r(131),a=r(64);class c extends s.c{constructor(e,t={}){t.isProxy=!0,super(e,t),this.props=t,this.subject$=new o.Subject,this.replaySub$=new o.ReplaySubject(1),this.observer$=(0,o.merge)(this.subject$,this.replaySub$),!0===n.M.debug&&this.checkIfChannelIsStillProxy(e)}getMergedSubject(e=!1){return!0===e?this.replaySub$:this.subject$}checkIfChannelIsStillProxy(e){const t=e;(0,a.Ir)((()=>{!0!==(0,i.includes)(t,n.M.listRegisteredChannels())&&console.warn(`Spyne Warning: The channel, ${t} does not appear to be registered!`)}),1e3)}get replaySubject(){return this.replaySub$}get subject(){return this.subject$}}},2:(e,t,r)=>{r.d(t,{c:()=>l});var s=r(584),n=r(980),o=r(225),i=r(521),a=r(968),c=r(531),d=r(131);class l{constructor(e,t={}){this.addRegisteredActions.bind(this),this.createChannelActionsObj(e,t.extendedActionsArr),t.name=e,t.defaultActions=void 0!==t.data?[`${t.name}_EVENT`]:[],this.props=t,this.props.isRegistered=!1,this.props.isProxy=void 0!==this.props.isProxy&&this.props.isProxy;const r=void 0!==this.props.data;void 0!==this.props.replay?this.props.sendCachedPayload=this.props.replay:this.props.sendCachedPayload=void 0===this.props.sendCachedPayload?r:this.props.sendCachedPayload,this.sendPayloadToRouteChannel=new i.g(this),this.createChannelActionMethods(),this.streamsController=o.M.channelsMap;const s=this.getMainObserver();this.checkForPersistentDataMode=l.checkForPersistentDataMode.bind(this),this.observer$=this.props.observer=s;const n=this.streamsController.getStream("DISPATCHER"),a=(0,d.propEq)(t.name,"name");n.pipe((0,c.filter)(a)).subscribe((e=>this.onReceivedObservable(e)))}getMainObserver(){return void 0===this.streamsController&&console.warn(`Spyne Warning: The following channel, ${this.props.name}, appears to be registered before Spyne has been initialized.`),!0===this.streamsController.testStream(this.props.name)?this.streamsController.getProxySubject(this.props.name,this.props.sendCachedPayload):!0===this.props.sendCachedPayload?new a.ReplaySubject(1):new a.Subject}onChannelInitialized(){}onRegistered(e=this.props){if(void 0!==e.data){const t=Object.keys(this.channelActions)[0];this.sendChannelPayload(t,e.data)}}get isProxy(){return this.props.isProxy}get channelName(){return this.props.name}get observer(){return this.observer$}checkForTraits(){void 0!==this.props.traits&&(e=>{"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>new e(this)))})(this.props.traits)}initializeStream(){this.checkForTraits(),this.onChannelInitialized(),this.checkForPersistentDataMode(),this.onRegistered(),this.props.isRegistered=!0}static checkForPersistentDataMode(e=this.props,t=this.channelActions){const r=(0,d.isEmpty)(t),s=void 0!==(0,d.prop)("data",e);return!0===r&&!0===s&&(e.sendCachedPayload=!0,t=(()=>{const{name:t}=e,r=`${t}_EVENT`;return{[r]:r}})(),void 0!==this.channelActions&&(this.channelActions=t)),{props:e,actionsObj:t}}setTrace(e){}createChannelActionsObj(e,t=[]){const r=(0,d.ifElse)((0,d.is)(String),d.identity,d.head),s=t.concat(this.addRegisteredActions(e)),n=(0,d.map)(r,s),o=(0,d.mergeAll)((0,d.chain)((e=>(0,d.objOf)(e,e)),n));this.channelActions=o}createChannelActionMethods(){const e=(0,d.ifElse)((0,d.is)(String),d.identity,d.head),t=(e,t)=>{window.setTimeout((()=>{"function"!=typeof this[e]&&console.warn(`"${this.props.name}", REQUIRES THE FOLLOWING METHOD ${e} FOR ACTION, ${t[0]}`)}),100)},r=(0,d.ifElse)((0,d.is)(String),(0,d.always)("onViewStreamInfo"),(e=>{const r=(0,d.view)((0,d.lensIndex)(1),e);return t(r,e),r}));this.channelActionMethods=(0,d.fromPairs)((0,d.map)((t=>[e(t),r(t)]),this.addRegisteredActions()))}addRegisteredActions(){let e=[];return(0,d.path)(["props","data"],this)&&(e=[`${this.props.name}_EVENT`]),e}onReceivedObservable(e){this.onIncomingObservable(e)}getActionMethodForObservable(e){e.unpacked=!0;const t=this.onViewStreamInfo.bind(this),r=(0,d.path)(["data","action"],e),s=(0,d.prop)(r,this.channelActionMethods);let n=t;return void 0!==s&&"onViewStreamInfo"!==s&&!0==("function"==typeof this[s])&&(n=this[s].bind(this)),n}onIncomingObservable(e){const t=(0,d.equals)(e.name,this.props.name),{action:r,payload:s,srcElement:n}=e.data,o=t=>({clone:()=>{return t=e.data,(0,d.mergeAll)([t,{action:(0,d.prop)("action",t)},(0,d.prop)("payload",t),(0,d.prop)("srcElement",t)]);var t},action:r,payload:s,srcElement:n,event:t});return!0===t?(e=>e.observable.pipe((0,c.map)(o)).subscribe(this.getActionMethodForObservable(e)))(e):void 0}onViewStreamInfo(e){}sendChannelPayload(e,t,r={},s={},o=this.observer$){const i=new n.m(this.props.name,e,t,r,s);o.next(i)}getChannel(e,t){return(0,d.ifElse)((e=>(0,s.ns)().includes(e)),(e=>{const r=this.streamsController.getStream(e).observer;return void 0!==t?r.pipe((0,c.filter)(t)):r}),(e=>console.warn(`channel name ${e} is not within ${s.ns}`)))(e)}mergeChannels(e,t=!0){const r=e.map((e=>{if("string"==typeof e){const r=this.getChannel(e);return t?r.pipe((0,c.take)(1)):r}return t?e.pipe((0,c.take)(1)):e}));let s;if(t)s=(0,a.forkJoin)(r);else if(0===r.length)s=a.EMPTY;else if(1===r.length)s=r[0];else{const[e,...t]=r;s=e.pipe((0,c.combineLatestWith)(...t))}return s.pipe((0,c.map)((t=>{const r={};return e.forEach(((e,s)=>{r["string"==typeof e?e:`channel_${s}`]=t[s]})),r})))}static checkForNotTrackFlag(e={}){!0===e.doNotTrack&&o.M.doNotTrackChannel(e.channelName)}}},584:(e,t,r)=>{r.d(t,{ns:()=>i});var s=r(225),n=r(131),o=r(968);const i=()=>({includes:()=>!0===s.M.initialized?s.M.listRegisteredChannels():["CHANNEL_ROUTE","CHANNEL_UI","CHANNEL_WINDOW","DISPATCHER"]}),a=["LOAD","RENDER","MOUNT","UNMOUNT","DISPOSE","GARBAGE_COLLECT","UPDATE"],c=["parent","self","child","children","view"],d=["Observable","BehaviorSubject","Subject","Observer","Subscriber","FromEventObservable"],l=["subscribe","combineLatest"];let E=[],p=[],h=null,N=null,u=null,_=null,m=null,T=null,A=null;if(void 0!==n.compose&&void 0!==o.Observable){E=[{error:`need to match a valid name within ${d}`,predicate:e=>i().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>void 0!==e.observable.subscribe},{error:"param action must be a registered action",predicate:e=>l.includes(e.action)}],p=[{error:"needs vsid number in srcElement",predicate:(0,n.compose)((0,n.is)(String),(0,n.path)(["data","srcElement","vsid"]))},{error:"needs a id in srcElement",predicate:(0,n.compose)((0,n.is)(String),(0,n.path)(["data","srcElement","id"]))}],h=function(){return[].concat(E).concat(p)};const e=[{error:`need to match a valid name within ${d}`,predicate:e=>i().includes(e.name)},{error:`needs one of the following step strings: ${a}`,predicate:e=>a.includes(e.STEP)},{error:`type needs to one of the following: ${c}`,predicate:e=>c.includes(e.type)},{error:"viewId needs to be added ",predicate:e=>void 0!==e.viewId}];u=function(){return[].concat(e)},_=function(){return[{error:"DISPOSE STEP requires a disposeItem param in the data object",predicate:e=>"DISPOSE"===e.STEP&&void 0!==e.data.disposeItems}].concat(e)},m=function(){return[{error:"UPDATE STEP requires a data object ",predicate:e=>"UPDATE"===e.STEP&&void 0!==e.data}].concat(e)},N=function(){return e.concat(E).concat(p)},T=function(){return[].concat(E).concat(p)},A=function(){const e=[{error:"param 'name' must be of a registered type",predicate:e=>i().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>d.includes((0,e.observable)().constructor.name)},{error:"param action must be a registered action",predicate:e=>l.includes(e.action)}];return{streams:[{init:{name:"DISPATCHER",observable:()=>new o.Subject,action:"subscribe"},structure:{type:String,observable:o.Observable||o.Subject,action:String},validations:e},{init:{name:"UBU",observable:()=>new o.Subject,action:"subscribe"},structure:{type:String,observable:o.Observable||o.Subject,action:String},validations:e}]}}}},470:(e,t,r)=>{r.d(t,{H:()=>E});var s=r(68),n=r(303),o=r(597),i=r(205),a=r(968),c=r(683),d=r(131);const l=new Map;class E{constructor(){this.addMixins(),l.set("DISPATCHER",new a.Subject),this.listRegisteredChannels=E.listRegisteredChannels.bind(this),this.getChannelsList=E.getChannelsList.bind(this)}get map(){return l}static getChannelsList(){return Array.from(l,((e,t)=>({key:e[0],val:e[1].constructor.name})))}static listRegisteredChannels(e=!1){const t=this.getChannelsList(),r=(0,d.reject)((0,d.propEq)("ChannelProxy","val")),s=(0,d.filter)((0,d.propEq)("ChannelProxy","val")),n=(!0===e?s:r)(t);return(0,d.pluck)(["key"],n)}listProxyChannels(){return this.listRegisteredChannels(!0)}checkForMissingChannels(){const e=this.getChannelsList(),t=(0,d.filter)((0,d.propEq)("ChannelProxy","val"))(e);if(t.length>=1){const e=`Spyne Warning: The following ${1===t.length?"Channel has":"Channels have"} not been initialized: ${(0,d.compose)((0,d.join)(", "),(0,d.map)((0,d.prop)("key")))(t)}`;console.warn(e)}}init(){this.createMainStreams()}createMainStreams(){this.routeStream=new s.e,l.set("CHANNEL_ROUTE",this.routeStream),this.uiStream=new n.z,l.set("CHANNEL_UI",this.uiStream),this.domStream=new o.x,l.set("CHANNEL_WINDOW",this.domStream),this.viewStreamLifecycle=new i.b,l.set("CHANNEL_LIFECYCLE",this.viewStreamLifecycle),this.routeStream.initializeStream(),this.domStream.initializeStream()}addKeyEvent(e){l.get("UI").addKeyEvent(e)}registerStream(e){const t=e.channelName;l.has(t)&&(0,d.compose)((0,d.pathEq)(["props","isRegistered"],!0))(l.get(t))?console.warn(`Spyne Warning: The Channel, ${t}, has already been registered!`):(l.set(t,e),e.initializeStream())}getChannelActions(e){return l.get(e).addRegisteredActions()}getProxySubject(e,t=!1){const r=!0===t?"replaySubject":"subject";return l.get(e)[r]}testStream(e){return void 0!==l.get(e)}getStream(e){return!1===this.testStream(e)&&l.set(e,new c.w(e)),l.get(e)}addMixins(){}}},205:(e,t,r)=>{r.d(t,{b:()=>n});var s=r(2);class n extends s.c{constructor(e={}){super("CHANNEL_LIFECYCLE",e)}addRegisteredActions(){return["CHANNEL_LIFECYCLE_RENDERED_EVENT","CHANNEL_LIFECYCLE_DISPOSED_EVENT"]}onViewStreamInfo(e){const{action:t,srcElement:r}=e,s=r;s.action=t,this.onSendEvent(t,s)}onSendEvent(e,t={}){const r=this.channelActions[e],s={};window.setTimeout((()=>this.sendChannelPayload(r,t,s,void 0)),0)}}},68:(e,t,r)=>{r.d(t,{e:()=>l});var s=r(2),n=r(511),o=r(167),i=r(225),a=r(968),c=r(531),d=r(131);class l extends s.c{constructor(e="CHANNEL_ROUTE",t={}){t.sendCachedPayload=!0,super("CHANNEL_ROUTE",t),this.createChannelActionsObj(),this.routeConfigJson=this.getRouteConfig(),this.bindStaticMethods(),this.navToStream$=new a.ReplaySubject(1),this.observer$=this.navToStream$.pipe((0,c.map)((e=>this.onMapNext(e)))),this.compareRouteKeywords=o.H.compareRouteKeywords()}checkConfigForHash(){!0==("hash"===i.M.config.channels.ROUTE.type)&&(i.M.config.channels.ROUTE.type="slash",i.M.config.channels.ROUTE.isHash=!0)}onRegistered(){this.checkConfigForHash(),this.initStream()}createChannelActionsObj(){const e=this.addRegisteredActions(),t=(0,d.mergeAll)((0,d.chain)((e=>(0,d.objOf)(e,e)),e));this.channelActions=t}addRegisteredActions(){return["CHANNEL_ROUTE_DEEPLINK_EVENT","CHANNEL_ROUTE_CHANGE_EVENT","CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",["CHANNEL_ROUTE_UPDATE_CONFIG_EVENT","updateRouteConfig"]]}updateRouteConfig(e){const t=(0,d.pick)(["isHash","isHidden","routes","type"],e.payload);i.M.config.channels.ROUTE=(0,d.mergeRight)(i.M.config.channels.ROUTE,t),i.M.conformRouteConfig();const r=this.getRouteConfig();r.navLinks=[...r?.routeDatasetsArr],this.routeConfigJson=r,this.bindStaticMethodsWithConfigData(),this.sendChannelPayload("CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",r,{},{},this.navToStream$)}getRouteConfig(){const e=i.M.config,t=(0,d.path)(["channels","ROUTE"],e);"query"===t.type&&(t.isHash=!1);const r=o.H.flattenConfigObject(t.routes);return t.paramsArr=r,t}initStream(){this.firstLoadStream$=new a.ReplaySubject(1),this.onIncomingDomEvent(void 0,this.routeConfigJson,"CHANNEL_ROUTE_DEEPLINK_EVENT"),o.H.createPopStateStream(this.onIncomingDomEvent.bind(this)),this.observer$=(0,a.merge)(this.firstLoadStream$,this.navToStream$)}onMapNext(e,t=!1){return e.action="CHANNEL_ROUTE_CHANGE_EVENT",e}static removeSSID(e){const t=(0,d.lensProp)(["routeData"]);return(0,d.over)(t,(0,d.omit)(["vsid"]))(e)}static onIncomingDomEvent(e,t=this.routeConfigJson,r){const s=void 0!==r?r:this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT,n=(0,d.path)(["state","routeCount"],e),o=!0===(0,d.is)(Number,n);let i=this.getDataFromString(t,o);!0===o&&(i.routeCount=n),"CHANNEL_ROUTE_DEEPLINK_EVENT"===r&&(i.navLinks=(0,d.prop)("routeDatasetsArr",t),Object.defineProperty(i,"linksData",{get(){return console.warn("get links data is deprecated in ROUTE DEEPLINK DATA, use navLinks"),this.navLinks},set(e){console.warn("set links data is deprecated in ROUTE DEEPLINK DATA, use navLinks")},enumerable:!0}));const a=this.compareRouteKeywords.compare(i.routeData,i.paths);i=(0,d.mergeRight)(i,a),this.sendChannelPayload(s,i,void 0,e,this.navToStream$)}static checkForRouteParamsOverrides(e){return e}static checkForEventMethods(e){const t=(0,d.compose)((0,d.filter)((0,d.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),d.keys,(0,d.prop)("payload"))(e);if(t.length>=1){const r=(0,d.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,d.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),n=e=>{const t=s(e);void 0!==r[t]&&r[t]()};t.forEach(n)}}return e}static checkForEndRoute(e,t=this.routeConfigJson,r){if(!0!==(0,d.compose)((0,d.equals)("true"),(0,d.path)(["payload","endRoute"]))(e))return e;const s=void 0!==r?r:!0===i.M.debug,{payload:n}=e;let o=0;const a=(e=[],t)=>{const r=t[1],{routePath:i}=r,c=(0,d.prop)("routeName",i),l=(e=>{const t=(0,d.prop)("routeName",e);if(t){const r=(0,d.compose)(d.keys,(0,d.omit)(["routeName"]))(e),s=n[t],o=e=>new RegExp(`^${e}$`).test(s);return(0,d.find)(o,r)}})(i),E=(0,d.is)(Object,r),p=(0,d.is)(Array,r);if(o+=1,!0===E&&!1===p){const t=i[l];t?(0,d.compose)(d.reverse,(0,d.reduce)(a,e),d.toPairs)({nextRoutePath:t}):1===o?s&&console.warn(`Spyne Warning: use of end route method should add start route value of "${c}".`):e.push(c)}return e},{routes:c}=t,l=(0,d.compose)(d.reverse,(0,d.reduce)(a,[]),d.toPairs)({routes:c});if(1===l.length){const t=l[0];e.payload[t]=""}return e}onViewStreamInfo(e){const t=e.action??this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT;e?.srcElement?.el?.dataset&&(e.payload=function(e){const t={};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(e?.srcElement?.el?.dataset)??e.payload),l.checkForEventMethods(e),e=this.checkForEndRoute(e);let r=this.getDataFromParams(e);const s=(0,d.prop)("srcElement",e),n=(0,d.prop)("event",e),o=!r.isHidden,i=this.compareRouteKeywords.compare(r.routeData,r.paths);r=(0,d.mergeRight)(r,i),this.sendRouteStream(r,o),r=l.removeSSID(r),this.sendChannelPayload(t,r,s,n,this.navToStream$)}static checkAndConvertStrWithRegexTokens(e,t){return(0,d.keys)(t)}sendRouteStream(e,t=!0){!0===t&&this.setWindowLocation(e)}static getRouteState(){return"CHANNEL_ROUTE_CHANGE_EVENT"}static getIsDeepLinkBool(e){return!1===e&&0===this._routeCount}static getRouteCount(e=!1){return void 0===this._routeCount?(this._routeCount=0,this._routeCount):(!1===e&&(this._routeCount+=1),this._routeCount)}static getExtraPayloadParams(e=this.routeConfigJson,t=!1){return{routeCount:this.getRouteCount(t),isDeepLink:this.getIsDeepLinkBool(t),isHash:e.isHash,isHistory:t,isHidden:e.isHidden,routeType:e.type}}static getDataFromParams(e,t=this.routeConfigJson){let r=(0,d.prop)("payload",e);const s=this.getRouteStrFromParams(r,t),o=(e,r)=>(0,d.defaultTo)(r,(0,d.prop)(e,t)),i=o("type","slash"),a=o("isHash",!1),c=n.Q.formatStrAsWindowLocation(s),l=this.getDataFromLocationStr(i,a,c),{pathInnermost:E,paths:p}=l;r=(0,d.mergeRight)(l.routeData,r);const{routeCount:h,isDeepLink:N,isHash:u,isHistory:_,isHidden:m,routeType:T}=this.getExtraPayloadParams(t);return{isDeepLink:N,routeCount:h,pathInnermost:E,paths:p,routeData:r,routeValue:s,isHash:u,isHidden:m,isHistory:_,routeType:T}}static getDataFromString(e=this.routeConfigJson,t=!1){const r=e.type,s=!0===e.isHash,o=n.Q.getLocationStrByType(r,s),{paths:i,pathInnermost:a,routeData:c,routeValue:d}=l.getParamsFromRouteStr(o,e,r),{routeCount:E,isDeepLink:p,isHash:h,routeType:N,isHidden:u}=this.getExtraPayloadParams(e,t);return{isDeepLink:p,routeCount:E,pathInnermost:a,paths:i,routeData:c,routeValue:d,isHash:h,isHidden:u,isHistory:t,routeType:N}}static getDataFromLocationStr(e="slash",t=this.routeConfigJson.isHash,r=window.location){const s=void 0!==this.routeConfigJson?this.routeConfigJson.type:e,o=n.Q.getLocationStrByType(s,t,r),{paths:i,pathInnermost:a,routeData:c,routeValue:d}=this.getParamsFromRouteStr(o,this.routeConfigJson,s);return{paths:i,pathInnermost:a,routeData:c,routeValue:d,action:this.getRouteState()}}static getLocationData(){return(0,d.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getRouteStrFromParams(e,t,r){const s=void 0!==r?r:t.type;return n.Q.convertParamsToRoute(e,t,s)}static getParamsFromRouteStr(e,t,r){const s=void 0!==r?r:t.type;return n.Q.convertRouteToParams(e,t,s)}checkEmptyRouteStr(e,t=!1){const r=(0,d.isEmpty)(e);return!0==(!0===r&&!1===t)||!0==(!0===r&&!0===t)?"/":!0==(!1===r&&!0===t)?(0,d.concat)("#",e):e}static removeLastSlash(e){return e.replace(/^(.*)(\/)$/,"$1")}setWindowLocation(e){let{isHash:t,routeValue:r,routeType:s}=e;r=this.checkEmptyRouteStr(r,t);const{routeCount:n}=e;if(!0===t||"query"===s)r=l.removeLastSlash(window.location.pathname)+r,window.history.pushState({routeCount:n},"",r);else{const e=(0,d.when)((0,d.compose)((0,d.complement)((0,d.equals)("/")),d.head),(0,d.concat)("/",d.__));window.history.pushState({routeCount:n},"",e(r))}}getWindowLocation(){return window.location.pathname}bindStaticMethods(){this.checkForEndRoute=l.checkForEndRoute.bind(this),this.getIsDeepLinkBool=l.getIsDeepLinkBool.bind(this),this.getDataFromLocationStr=l.getDataFromLocationStr.bind(this),this.onIncomingDomEvent=l.onIncomingDomEvent.bind(this),this.getDataFromString=l.getDataFromString.bind(this),this.getParamsFromRouteStr=l.getParamsFromRouteStr.bind(this),this.getLocationData=l.getLocationData.bind(this),this.getRouteState=l.getRouteState.bind(this),this.getDataFromParams=l.getDataFromParams.bind(this),this.getRouteCount=l.getRouteCount.bind(this),this.getExtraPayloadParams=l.getExtraPayloadParams.bind(this),this.bindStaticMethodsWithConfigData()}bindStaticMethodsWithConfigData(){const e=(0,d.curryN)(3,l.getRouteStrFromParams);this.getRouteStrFromParams=e(d.__,this.routeConfigJson,this.routeConfigJson.type)}}},303:(e,t,r)=>{r.d(t,{z:()=>a});var s=r(2),n=r(968),o=r(531),i=r(131);class a extends s.c{constructor(e="CHANNEL_UI",t={}){t.sendCachedPayload=!1,super(e,t),this.keyEventsLoaded=!1,this.keyCodeArr=[]}addRegisteredActions(){return["CHANNEL_UI_DOMCONTENTLOADED_EVENT","CHANNEL_UI_ABORT_EVENT","CHANNEL_UI_ACTIVATE_EVENT","CHANNEL_UI_ADDTRACK_EVENT","CHANNEL_UI_AFTERPRINT_EVENT","CHANNEL_UI_AFTERSCRIPTEXECUTE_EVENT","CHANNEL_UI_ANIMATIONCANCEL_EVENT","CHANNEL_UI_ANIMATIONEND_EVENT","CHANNEL_UI_ANIMATIONITERATION_EVENT","CHANNEL_UI_ANIMATIONSTART_EVENT","CHANNEL_UI_APPINSTALLED_EVENT","CHANNEL_UI_AUDIOEND_EVENT","CHANNEL_UI_AUDIOSTART_EVENT","CHANNEL_UI_AUXCLICK_EVENT","CHANNEL_UI_BEFOREINPUT_EVENT","CHANNEL_UI_BEFOREPRINT_EVENT","CHANNEL_UI_BEFOREUNLOAD_EVENT","CHANNEL_UI_BEGINEVENT_EVENT","CHANNEL_UI_BLOCKED_EVENT","CHANNEL_UI_BLUR_EVENT","CHANNEL_UI_BOUNDARY_EVENT","CHANNEL_UI_BUFFEREDAMOUNTLOW_EVENT","CHANNEL_UI_CANCEL_EVENT","CHANNEL_UI_CANPLAY_EVENT","CHANNEL_UI_CANPLAYTHROUGH_EVENT","CHANNEL_UI_CHANGE_EVENT","CHANNEL_UI_CLICK_EVENT","CHANNEL_UI_CLOSE_EVENT","CHANNEL_UI_CLOSING_EVENT","CHANNEL_UI_COMPLETE_EVENT","CHANNEL_UI_COMPOSITIONEND_EVENT","CHANNEL_UI_COMPOSITIONSTART_EVENT","CHANNEL_UI_COMPOSITIONUPDATE_EVENT","CHANNEL_UI_CONNECT_EVENT","CHANNEL_UI_CONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_CONTENTDELETE_EVENT","CHANNEL_UI_CONTEXTMENU_EVENT","CHANNEL_UI_COPY_EVENT","CHANNEL_UI_CUECHANGE_EVENT","CHANNEL_UI_CUT_EVENT","CHANNEL_UI_DATACHANNEL_EVENT","CHANNEL_UI_DBLCLICK_EVENT","CHANNEL_UI_DEVICECHANGE_EVENT","CHANNEL_UI_DEVICEMOTION_EVENT","CHANNEL_UI_DEVICEORIENTATION_EVENT","CHANNEL_UI_DRAG_EVENT","CHANNEL_UI_DRAGEND_EVENT","CHANNEL_UI_DRAGENTER_EVENT","CHANNEL_UI_DRAGLEAVE_EVENT","CHANNEL_UI_DRAGOVER_EVENT","CHANNEL_UI_DRAGSTART_EVENT","CHANNEL_UI_DROP_EVENT","CHANNEL_UI_DURATIONCHANGE_EVENT","CHANNEL_UI_EMPTIED_EVENT","CHANNEL_UI_END_EVENT","CHANNEL_UI_ENDEVENT_EVENT","CHANNEL_UI_ENDED_EVENT","CHANNEL_UI_ENTERPICTUREINPICTURE_EVENT","CHANNEL_UI_ERROR_EVENT","CHANNEL_UI_FOCUS_EVENT","CHANNEL_UI_FOCUSIN_EVENT","CHANNEL_UI_FOCUSOUT_EVENT","CHANNEL_UI_FORMDATA_EVENT","CHANNEL_UI_FULLSCREENCHANGE_EVENT","CHANNEL_UI_FULLSCREENERROR_EVENT","CHANNEL_UI_GAMEPADCONNECTED_EVENT","CHANNEL_UI_GAMEPADDISCONNECTED_EVENT","CHANNEL_UI_GATHERINGSTATECHANGE_EVENT","CHANNEL_UI_GESTURECHANGE_EVENT","CHANNEL_UI_GESTUREEND_EVENT","CHANNEL_UI_GESTURESTART_EVENT","CHANNEL_UI_GOTPOINTERCAPTURE_EVENT","CHANNEL_UI_HASHCHANGE_EVENT","CHANNEL_UI_ICECANDIDATE_EVENT","CHANNEL_UI_ICECANDIDATEERROR_EVENT","CHANNEL_UI_ICECONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_ICEGATHERINGSTATECHANGE_EVENT","CHANNEL_UI_INPUT_EVENT","CHANNEL_UI_INPUTSOURCESCHANGE_EVENT","CHANNEL_UI_INSTALL_EVENT","CHANNEL_UI_INVALID_EVENT","CHANNEL_UI_KEYDOWN_EVENT","CHANNEL_UI_KEYUP_EVENT","CHANNEL_UI_LANGUAGECHANGE_EVENT","CHANNEL_UI_LEAVEPICTUREINPICTURE_EVENT","CHANNEL_UI_LOAD_EVENT","CHANNEL_UI_LOADEDDATA_EVENT","CHANNEL_UI_LOADEDMETADATA_EVENT","CHANNEL_UI_LOADEND_EVENT","CHANNEL_UI_LOADSTART_EVENT","CHANNEL_UI_LOSTPOINTERCAPTURE_EVENT","CHANNEL_UI_MARK_EVENT","CHANNEL_UI_MERCHANTVALIDATION_EVENT","CHANNEL_UI_MESSAGE_EVENT","CHANNEL_UI_MESSAGEERROR_EVENT","CHANNEL_UI_MOUSEDOWN_EVENT","CHANNEL_UI_MOUSEENTER_EVENT","CHANNEL_UI_MOUSELEAVE_EVENT","CHANNEL_UI_MOUSEMOVE_EVENT","CHANNEL_UI_MOUSEOUT_EVENT","CHANNEL_UI_MOUSEOVER_EVENT","CHANNEL_UI_MOUSEUP_EVENT","CHANNEL_UI_MUTE_EVENT","CHANNEL_UI_NEGOTIATIONNEEDED_EVENT","CHANNEL_UI_NOMATCH_EVENT","CHANNEL_UI_NOTIFICATIONCLICK_EVENT","CHANNEL_UI_OFFLINE_EVENT","CHANNEL_UI_ONLINE_EVENT","CHANNEL_UI_OPEN_EVENT","CHANNEL_UI_ORIENTATIONCHANGE_EVENT","CHANNEL_UI_PAGEHIDE_EVENT","CHANNEL_UI_PAGESHOW_EVENT","CHANNEL_UI_PASTE_EVENT","CHANNEL_UI_PAUSE_EVENT","CHANNEL_UI_PAYERDETAILCHANGE_EVENT","CHANNEL_UI_PAYMENTMETHODCHANGE_EVENT","CHANNEL_UI_PLAY_EVENT","CHANNEL_UI_PLAYING_EVENT","CHANNEL_UI_POINTERCANCEL_EVENT","CHANNEL_UI_POINTERDOWN_EVENT","CHANNEL_UI_POINTERENTER_EVENT","CHANNEL_UI_POINTERLEAVE_EVENT","CHANNEL_UI_POINTERLOCKCHANGE_EVENT","CHANNEL_UI_POINTERLOCKERROR_EVENT","CHANNEL_UI_POINTERMOVE_EVENT","CHANNEL_UI_POINTEROUT_EVENT","CHANNEL_UI_POINTEROVER_EVENT","CHANNEL_UI_POINTERUP_EVENT","CHANNEL_UI_POPSTATE_EVENT","CHANNEL_UI_PROGRESS_EVENT","CHANNEL_UI_PUSH_EVENT","CHANNEL_UI_PUSHSUBSCRIPTIONCHANGE_EVENT","CHANNEL_UI_RATECHANGE_EVENT","CHANNEL_UI_READYSTATECHANGE_EVENT","CHANNEL_UI_REJECTIONHANDLED_EVENT","CHANNEL_UI_REMOVETRACK_EVENT","CHANNEL_UI_REMOVESTREAM_EVENT","CHANNEL_UI_REPEATEVENT_EVENT","CHANNEL_UI_RESET_EVENT","CHANNEL_UI_RESIZE_EVENT","CHANNEL_UI_RESOURCETIMINGBUFFERFULL_EVENT","CHANNEL_UI_RESULT_EVENT","CHANNEL_UI_RESUME_EVENT","CHANNEL_UI_SCROLL_EVENT","CHANNEL_UI_SEARCH_EVENT","CHANNEL_UI_SEEKED_EVENT","CHANNEL_UI_SEEKING_EVENT","CHANNEL_UI_SELECT_EVENT","CHANNEL_UI_SELECTEDCANDIDATEPAIRCHANGE_EVENT","CHANNEL_UI_SELECTEND_EVENT","CHANNEL_UI_SELECTIONCHANGE_EVENT","CHANNEL_UI_SELECTSTART_EVENT","CHANNEL_UI_SHIPPINGADDRESSCHANGE_EVENT","CHANNEL_UI_SHIPPINGOPTIONCHANGE_EVENT","CHANNEL_UI_SIGNALINGSTATECHANGE_EVENT","CHANNEL_UI_SLOTCHANGE_EVENT","CHANNEL_UI_SOUNDEND_EVENT","CHANNEL_UI_SOUNDSTART_EVENT","CHANNEL_UI_SPEECHEND_EVENT","CHANNEL_UI_SPEECHSTART_EVENT","CHANNEL_UI_SQUEEZE_EVENT","CHANNEL_UI_SQUEEZEEND_EVENT","CHANNEL_UI_SQUEEZESTART_EVENT","CHANNEL_UI_STALLED_EVENT","CHANNEL_UI_START_EVENT","CHANNEL_UI_STATECHANGE_EVENT","CHANNEL_UI_STORAGE_EVENT","CHANNEL_UI_SUBMIT_EVENT","CHANNEL_UI_SUCCESS_EVENT","CHANNEL_UI_SUSPEND_EVENT","CHANNEL_UI_TIMEOUT_EVENT","CHANNEL_UI_TIMEUPDATE_EVENT","CHANNEL_UI_TOGGLE_EVENT","CHANNEL_UI_TONECHANGE_EVENT","CHANNEL_UI_TOUCHCANCEL_EVENT","CHANNEL_UI_TOUCHEND_EVENT","CHANNEL_UI_TOUCHMOVE_EVENT","CHANNEL_UI_TOUCHSTART_EVENT","CHANNEL_UI_TRACK_EVENT","CHANNEL_UI_TRANSITIONCANCEL_EVENT","CHANNEL_UI_TRANSITIONEND_EVENT","CHANNEL_UI_TRANSITIONRUN_EVENT","CHANNEL_UI_TRANSITIONSTART_EVENT","CHANNEL_UI_UNHANDLEDREJECTION_EVENT","CHANNEL_UI_UNLOAD_EVENT","CHANNEL_UI_UNMUTE_EVENT","CHANNEL_UI_UPGRADENEEDED_EVENT","CHANNEL_UI_VERSIONCHANGE_EVENT","CHANNEL_UI_VISIBILITYCHANGE_EVENT","CHANNEL_UI_VOICESCHANGED_EVENT","CHANNEL_UI_VOLUMECHANGE_EVENT","CHANNEL_UI_VRDISPLAYACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYBLUR_EVENT","CHANNEL_UI_VRDISPLAYCONNECT_EVENT","CHANNEL_UI_VRDISPLAYDEACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYDISCONNECT_EVENT","CHANNEL_UI_VRDISPLAYFOCUS_EVENT","CHANNEL_UI_VRDISPLAYPOINTERRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPOINTERUNRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPRESENTCHANGE_EVENT","CHANNEL_UI_WAITING_EVENT","CHANNEL_UI_WEBGLCONTEXTCREATIONERROR_EVENT","CHANNEL_UI_WEBGLCONTEXTLOST_EVENT","CHANNEL_UI_WEBGLCONTEXTRESTORED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCECHANGED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEDOWN_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEUP_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEWILLBEGIN_EVENT","CHANNEL_UI_WHEEL_EVENT"]}loadKeyStream(){const e=n.Observable.fromEvent(document,"keyup");this.keyPresses$=e.groupBy((e=>e.keyCode)).mergeAll().filter((e=>this.keyCodeArr.indexOf(e.keyCode)>=0)).repeat().subscribe(this.onKeyPressed.bind(this))}addKeyEvent(e){!1===this.keyEventsLoaded&&this.loadKeyStream(),this.keyEventsLoaded=!0,this.registerKey(e)}registerKey(e){this.keyCodeArr.push(e)}onKeyPressed(e){}static removeSSID(e){const t=(0,i.lensProp)(["payload"]);return(0,i.over)(t,(0,i.omit)(["vsid"]))(e)}onIncomingObservable(e){const t=(0,i.equals)(e.name,this.props.name);e.data=a.removeSSID(e.data);const{payload:r,srcElement:s}=e.data,n=e=>({payload:r,srcElement:s,event:e});return!0===t?(e=>e.observable.pipe((0,o.map)(n)).subscribe(this.onUIEvent.bind(this)))(e):void 0}getActionState(e){const t=(0,i.path)(["event","type"]),r=(0,i.path)(["event","typeOverRide"]),s=(0,i.compose)(i.toUpper,(0,i.either)(r,t))(e),n="CHANNEL_UI";return void 0!==s?`${n}_${s}_EVENT`:n}static checkForEventMethods(e){const t=(0,i.compose)((0,i.filter)((0,i.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),i.keys,(0,i.prop)("payload"))(e);if(t.length>=1){const r=(0,i.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,i.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),n=e=>{const t=s(e);void 0!==r[t]&&"function"==typeof r[t]&&r[t]()};t.forEach(n)}}return e}onUIEvent(e){e.payload=function(e){const t={};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(e?.srcElement?.el?.dataset)??e.payload,a.checkForEventMethods(e),e.action=this.getActionState(e);const t=e.action,{payload:r,srcElement:s}=e,n=e.event;this.sendChannelPayload(t,r,s,n)}}},597:(e,t,r)=>{r.d(t,{x:()=>E});var s=r(2),n=r(64),o=r(225),i=r(432),a=r(968),c=r(531),d=r(131),l=r(907);class E extends s.c{constructor(e="CHANNEL_WINDOW"){super(e),this.bindStaticMethods(),this.currentScrollY=0}initializeStream(){this.domChannelConfig=o.M.config.channels.WINDOW;const e=this.getActiveObservables(),t=(0,a.merge)(...e);this.dom$=t,t.subscribe((e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n)}))}static getMouseWheelMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_WHEEL_EVENT,r=e.deltaY<=0?"up":"down",{deltaX:s,deltaY:n,deltaZ:o}=e;return{action:t,payload:{scrollDir:r,deltaX:s,deltaY:n,deltaZ:o},srcElement:e.srcElement,event:e}}static createCurriedGenericEvent(e){const t=`CHANNEL_WINDOW_${e.toUpperCase()}_EVENT`;return(0,d.curry)(E.mapGenericEvent)(t)}static mapGenericEvent(e,t){return{action:e,payload:t,srcElement:t.srcElement,event:t}}static getResizeMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_RESIZE_EVENT,payload:(0,d.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window),srcElement:e.srcElement,event:e}}static getOrientationMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_ORIENTATION_EVENT,r=window.matchMedia("(orientation: portrait)").matches,s=(0,d.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window);return s.orientation=!0===r?"portrait":"landscape",{action:t,payload:s,srcElement:e.srcElement,event:e}}getMediaQueryMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_MEDIA_QUERY_EVENT,payload:(0,d.pick)(["matches","media","mediaQueryName"],e),srcElement:e.srcElement,event:e}}createMouseWheelObservable(e){const t=e.debounceMSTimeForScroll;return i.Y.createDomObservableFromEvent("wheel",E.getMouseWheelMapFn.bind(this)).pipe((0,c.debounceTime)(t))}static getScrollData(){let e=0;return t=>{const r=e-t;return e=t,{scrollY:t,scrollDistance:r,scrollDir:r>=0?"up":"down"}}}static getScrollY(e){return void 0!==e.pageYOffset?e.pageYOffset:e.scrollTop}static getScrollMapFn(e,t,r,s,n){const o=s(E.getScrollY(n)),{scrollDistance:i}=o;return{action:r,payload:o,srcElement:e.srcElement,scrollDistance:i,event:e}}createScrollObservable(e,t=window,r=!0){const s=e.debounceMSTimeForScroll,n=t,o=t===window,a=void 0!==e.scrollElForVals?e.scrollElForVals:t,l=o?"CHANNEL_WINDOW_SCROLL_EVENT":"CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT",p=E.getScrollData(),h=(0,d.partialRight)(E.getScrollMapFn,[l,p,a,r,n]).bind(this);return i.Y.createDomObservableFromEvent("scroll",h,r,n).pipe((0,c.debounceTime)(s),(0,c.skipWhile)((e=>0===e.scrollDistance)),(0,c.map)((e=>{const t=E.getScrollY(n);return e.payload.scrollDistanceAbs=Math.abs(this.currentScrollY-t),this.currentScrollY=t,e})))}createOrientationObservable(e){return i.Y.createDomObservableFromEvent("orientationchange",E.getOrientationMapFn.bind(this))}createResizeObservable(e){const t=e.debounceMSTimeForResize;return i.Y.createDomObservableFromEvent("resize",E.getResizeMapFn.bind(this)).pipe((0,c.debounceTime)(t))}getEventsFromConfig(e=this.domChannelConfig){const t=e.events;return(0,d.map)((e=>{const t=E.createCurriedGenericEvent(e);return i.Y.createDomObservableFromEvent(e,t)}),t)}getActiveObservables(e=this.domChannelConfig){let t=[];e.listenForMediaQueries=(0,n.RK)(e.mediaQueries)||(0,n.RK)(e.mediaQueries);const r={listenForResize:this.createResizeObservable.bind(this),listenForOrientation:this.createOrientationObservable.bind(this),listenForScroll:this.createScrollObservable.bind(this),listenForWheel:this.createMouseWheelObservable.bind(this)};(0,d.mapObjIndexed)(((r,s,n)=>{e[s]&&t.push(r(e))}),r),this.checkForMediaQueries(e.listenForMediaQueries);const s=this.getEventsFromConfig(e);return t=t.concat(s),t}checkForMediaQueries(e){!0===e&&this.getMediaQueryObservable(this.domChannelConfig).subscribe((e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n,this.observer$)}))}getMediaQueryObservable(e){const t=this.createMergedObsFromObj(e);return(0,d.apply)(a.merge,t).pipe((0,c.map)(this.getMediaQueryMapFn.bind(this)))}addRegisteredActions(){return["CHANNEL_WINDOW_ABORT_EVENT","CHANNEL_WINDOW_AFTERPRINT_EVENT","CHANNEL_WINDOW_ANIMATIONEND_EVENT","CHANNEL_WINDOW_ANIMATIONITERATION_EVENT","CHANNEL_WINDOW_ANIMATIONSTART_EVENT","CHANNEL_WINDOW_APPINSTALLED_EVENT","CHANNEL_WINDOW_BEFOREPRINT_EVENT","CHANNEL_WINDOW_BEFOREUNLOAD_EVENT","CHANNEL_WINDOW_BEGINEVENT_EVENT","CHANNEL_WINDOW_BLUR_EVENT","CHANNEL_WINDOW_CACHED_EVENT","CHANNEL_WINDOW_CHANGE_EVENT","CHANNEL_WINDOW_CLICK_EVENT","CHANNEL_WINDOW_CLOSE_EVENT","CHANNEL_WINDOW_COMPOSITIONEND_EVENT","CHANNEL_WINDOW_COMPOSITIONSTART_EVENT","CHANNEL_WINDOW_COMPOSITIONUPDATE_EVENT","CHANNEL_WINDOW_COPY_EVENT","CHANNEL_WINDOW_CUT_EVENT","CHANNEL_WINDOW_DBLCLICK_EVENT","CHANNEL_WINDOW_DEVICECHANGE_EVENT","CHANNEL_WINDOW_DEVICELIGHT_EVENT","CHANNEL_WINDOW_DEVICEMOTION_EVENT","CHANNEL_WINDOW_DEVICEORIENTATION_EVENT","CHANNEL_WINDOW_DEVICEPROXIMITY_EVENT","CHANNEL_WINDOW_DOMATTRIBUTENAMECHANGED_EVENT","CHANNEL_WINDOW_DOMATTRMODIFIED_EVENT","CHANNEL_WINDOW_DOMCHARACTERDATAMODIFIED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMELEMENTNAMECHANGED_EVENT","CHANNEL_WINDOW_DRAGEND_EVENT","CHANNEL_WINDOW_DRAGENTER_EVENT","CHANNEL_WINDOW_DRAGLEAVE_EVENT","CHANNEL_WINDOW_DRAGOVER_EVENT","CHANNEL_WINDOW_DRAGSTART_EVENT","CHANNEL_WINDOW_DRAG_EVENT","CHANNEL_WINDOW_DROP_EVENT","CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT","CHANNEL_WINDOW_ERROR_EVENT","CHANNEL_WINDOW_FOCUSIN_EVENT","CHANNEL_WINDOW_FOCUS_EVENT","CHANNEL_WINDOW_FULLSCREENCHANGE_EVENT","CHANNEL_WINDOW_FULLSCREENERROR_EVENT","CHANNEL_WINDOW_HASHCHANGE_EVENT","CHANNEL_WINDOW_INPUT_EVENT","CHANNEL_WINDOW_INVALID_EVENT","CHANNEL_WINDOW_KEYDOWN_EVENT","CHANNEL_WINDOW_KEYPRESS_EVENT","CHANNEL_WINDOW_KEYUP_EVENT","CHANNEL_WINDOW_LOAD_EVENT","CHANNEL_WINDOW_MEDIA_QUERY_EVENT","CHANNEL_WINDOW_MESSAGE_EVENT","CHANNEL_WINDOW_MOUSEDOWN_EVENT","CHANNEL_WINDOW_MOUSEENTER_EVENT","CHANNEL_WINDOW_MOUSELEAVE_EVENT","CHANNEL_WINDOW_MOUSEMOVE_EVENT","CHANNEL_WINDOW_MOUSEOUT_EVENT","CHANNEL_WINDOW_MOUSEOVER_EVENT","CHANNEL_WINDOW_MOUSEUP_EVENT","CHANNEL_WINDOW_MOUSEWHEEL_EVENT","CHANNEL_WINDOW_OFFLINE_EVENT","CHANNEL_WINDOW_ONLINE_EVENT","CHANNEL_WINDOW_OPEN_EVENT","CHANNEL_WINDOW_ORIENTATION_EVENT","CHANNEL_WINDOW_PAGEHIDE_EVENT","CHANNEL_WINDOW_PAGESHOW_EVENT","CHANNEL_WINDOW_PASTE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_PROGRESSEVENTS_EVENT","CHANNEL_WINDOW_RESET_EVENT","CHANNEL_WINDOW_RESIZE_EVENT","CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT","CHANNEL_WINDOW_SCROLL_EVENT","CHANNEL_WINDOW_SCROLL_LOCK_EVENT",["CHANNEL_WINDOW_SCROLL_LOCK_EVENT","onScrollLockEvent"],["CHANNEL_WINDOW_SET_ELEMENT_TO_SCROLL_EVENT","onSetElementToScroll"],"CHANNEL_WINDOW_STORAGE_EVENT","CHANNEL_WINDOW_SUBMIT_EVENT","CHANNEL_WINDOW_TRANSITIONCANCEL_EVENT","CHANNEL_WINDOW_TRANSITIONEND_EVENT","CHANNEL_WINDOW_TRANSITIONRUN_EVENT","CHANNEL_WINDOW_TRANSITIONSTART_EVENT","CHANNEL_WINDOW_UNLOAD_EVENT","CHANNEL_WINDOW_WHEEL_EVENT"]}onScrollLockEvent(e){}onSetElementToScroll(e){let{config:t,el:r,scrollElement:s}=e.payload;t=t||{},t=(0,l.$)(this.domChannelConfig,t),s=s||r,this.sendChannelPayload("CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT",{el:r},r),this.createScrollObservable(t,s).subscribe((e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n)}))}bindStaticMethods(){this.createMediaQueryHandler=i.Y.createMediaQueryHandler.bind(this),this.createMergedObsFromObj=i.Y.createMergedObsFromObj.bind(this)}}},713:(e,t,r)=>{r.d(t,{D:()=>l});var s=r(470),n=r(173),o=r(167),i=r(225),a=r(49);const c=new s.H,d="0.20.8";let l=new class{constructor(){this.version=d}get channels(){return c}init(e={},t=!1){if(!0===i.M.initialized)return t?"The Spyne Application has already been initialized!":void console.warn("The Spyne Application has already been initialized!");let r={scrollLock:!1,scrollLockX:31,scrollLockY:0,debug:!1,strict:!1,baseHref:void 0,IMG_PATH:"undefined"!=typeof IMG_PATH?IMG_PATH:void 0,pluginMethods:{},plugins:{},tmp:{},ephemeralProps:{},tmpProps:{},channels:{WINDOW:{mediaQueries:{},events:[],listenForResize:!0,listenForOrientation:!0,listenForScroll:!1,listenForMouseWheel:!1,listenForWheel:!1,debounceMSTimeForResize:200,debounceMSTimeForScroll:150},ROUTE:{type:"slash",isHash:!1,isHidden:!1,add404s:!1,routes:{routePath:{routeName:"change"}}}}};if(void 0!==e){const t=o.H;e=i.M.initialize(r,e,c,t)}this.pluginsFn=i.M.getPluginsMethodObj(e.pluginMethods),this.getChannelActions=e=>c.getChannelActions(e),this.registerChannel=e=>c.registerStream(e),this.registerPlugin=e=>i.M.registerPlugin(e),this.registerDataChannel=e=>c.registerStream(e),this.listChannels=()=>Array.from(c.map.keys());let s=new n.A({id:"spyne-null-views"});s.appendToDom(document.body),s.props.el.style.cssText="display:none; opacity:0; pointer-events:none;",c.init(),!0===i.M.config.debug&&(window.Spyne={version:d}),(0,a.D)(i.M.config)}static listChannels(){return Array.from(c.map.keys())}static getChannelActions(e){return c.getChannelActions(e)}static registerChannel(e){if(!1!==i.M.initialized)return c.registerStream(e);console.warn("Spyne has not been initialized")}}},930:(e,t,r)=>{r.d(t,{V:()=>a});var s=r(192),n=r(225),o=r(131);let i=n.M;class a{constructor(e={}){let{name:t,config:r,parentEl:s}=e;this.props=e,void 0===r&&(r=(0,o.clone)(e)),this.name=t||"empty",this.props.name=t,r=a.mergeDefaultConfig(r,this.defaultConfig()),this.props.parentEl=s||a.createParentEl(),this.props.config=r,void 0!==this.props.traits&&this.addTraits(this.props.traits)}register(e){i=e,this.props.pluginName=this.props.name,!1!==i.initialized?(this.onBeforeRegistered(),this.props.config=(0,o.clone)(this.props.config),i.addPluginConfig(this.name,this.props.config),this.onRegistered(),this.onRender()):console.warn(`Spyne Warning: SpyneApp has not been initialized yet! Cannot register plugin "${this.name}".`)}get SpyneAppProperties(){return i}static mergeDefaultConfig(e={},t=this.defaultConfig()){return Object.assign(t,e)}static getSpyneApp(e,t){!1===i.initialized?console.warn(`Spyne Warning: Unable to install plugin, ${e}! SpyneApp has not been initialized!`):i.addPluginConfig(e,t)}static updateSpyneConfig(e,t,r){return!0===(0,o.pathSatisfies)((0,o.is)(Object),["config","plugins",t])(e)?(!0===e.config.debug&&console.warn(`Spyne Warning: The plugin, ${t}, already exists`),!1):(e.config.plugins[t]=r,e.config.plugins[t])}static createParentEl(e){return e||document.getElementById("spyne-plugins")||(()=>{const e=new s.r({id:"spyne-plugins"});document.body.appendChild(e.render());const t=document.getElementById("spyne-plugins");return t.style.cssText="position:absolute; top:0;left:0;width:100%;height:100%;min-height:100vh;z-index:1000000; pointer-events:none",t})()}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>new e(this)))}onBeforeRegistered(){this.checkForRequiredWindowEvent()}checkForRequiredWindowEvent(){const e=this.props.requiredEvents??[],t=n.M.getChannelConfig("WINDOW"),r=e.filter((e=>!t.events.includes(e)));r.length>0&&console.warn(`plugin "${this.props.name}" requires the following config.WINDOW.events, --\x3e ${r.join(", ")} <--`)}defaultConfig(){return{}}onRegistered(){}onRender(){}}},9:(e,t,r)=>{r.d(t,{G:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(e,t,r,s){this._mapFn=i.setMapFn(e),this._url=i.setUrl(e),this._responseType=i.setResponseType(e),this._serverOptions=i.setServerOptions(e),this._subscriber=void 0!==t?t:e=>console.log("FETCH RETURNED ",e),this.debug=void 0!==e.debug&&e.debug,this.channelName=s;const n={mapFn:this.mapFn,url:this.url,serverOptions:this.serverOptions,responseType:this.responseType,debug:this.debug};!0!==r&&i.startWindowFetch(n,this._subscriber,this.channelName)}static startWindowFetch(e,t,r){const{mapFn:o,url:i,serverOptions:a,responseType:c,debug:d}=e,l=!0===d?e=>console.log("DEBUG FETCH :",e,{url:i,serverOptions:a,responseType:c,channelName:r}):()=>{},E=(0,s.from)(window.fetch(i,a)).pipe((0,n.tap)(l),(0,n.flatMap)((e=>(0,s.from)(e[c]()))),(0,n.map)((e=>{const t={channelName:r,url:i,responseType:c,serverOptions:a};return r=>e(r,t)})(o)),(0,n.publish)());E.connect(),E.subscribe(t)}static setMapFn(e){return(0,o.compose)((0,o.defaultTo)((e=>e)),(0,o.prop)("mapFn"))(e)}static setUrl(e){const t=(0,o.prop)("url",e);return void 0===t&&console.warn("SPYNE WARNING: URL is undefined for data channel"),t}static setResponseType(e){return(0,o.defaultTo)("json",(0,o.prop)("responseType",e))}get mapFn(){return this._mapFn}get url(){return this._url}get serverOptions(){return this._serverOptions}get responseType(){return this._responseType}static stringifyBodyIfItExists(e){return(0,o.when)((0,o.propIs)(Object,"body"),(0,o.compose)((0,o.over)((0,o.lensProp)("body"),JSON.stringify)))(e)}static updateMethodWhenBodyExists(e){const t=(0,o.has)("body"),r=(0,o.propEq)("GET","method"),s=(0,o.allPass)([t,r]);return(0,o.when)(s,(0,o.assoc)("method","POST"))(e)}static setServerOptions(e){const t=(0,o.pick)(["method","headers","body","mode","credentials","cache","redirect","referrer","referrerPolicy","integrity","keepalive"],e);let r=(0,o.mergeDeepRight)(i.baseOptions(),t);return r=i.updateMethodWhenBodyExists(r),r=i.stringifyBodyIfItExists(r),r}static baseOptions(){return{method:"GET",headers:new Headers({Accept:"application/json, text/plain, */*"}),mode:"cors",credentials:"same-origin",cache:"default",redirect:"follow",referrer:"client",referrerPolicy:"no-referrer-when-downgrade",integrity:"",keepalive:!1}}}},589:(e,t,r)=>{r.d(t,{C:()=>E});var s=r(131),n=r(225);const o=(0,s.compose)(s.not,(0,s.is)(Array)),i=(0,s.compose)(s.not,s.isEmpty),a=(0,s.allPass)([(0,s.is)(String),i]),c=(0,s.allPass)([(0,s.is)(Array),i]),d=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)])),l=(0,s.compose)((0,s.allPass)([i,o,(0,s.is)(Object)]));class E{constructor(e,t={},r,o){d(e)&&(t=e,e=(0,s.prop)("selector",t),o=o||(0,s.prop)("testMode",t));const i=[r,(0,s.prop)("debugLabel",t)];r=(0,s.compose)((0,s.find)((0,s.is)(String)))(i);let p=(0,s.omit)(["debugLabel","label","selector","props","testMode","propFilters"],t);void 0!==t.props?p=(0,s.mergeAll)([t.props,p]):void 0!==t.propFilters&&(p=(0,s.mergeAll)([t.propFilters,p])),t.propFilters=p;const{propFilters:h}=t,N=a(e)?E.filterSelector([e],r):void 0,u=c(e)?E.filterSelector(e,r):void 0,_=l(h)?E.filterData(h,r):void 0;let m=(0,s.reject)(s.isNil,[N,u,_]);const T=(0,s.isEmpty)(m);return T&&(m=[(0,s.always)(!1)],!0===n.M.debug&&!0!==o&&console.warn(`Spyne Warning: The Channel Filter, with selector: ${e}, and propFilters:${h} appears to be empty!`)),!0===o?{selector:e,propFilters:h,debugLabel:r,filters:t,testMode:o,filtersAreEmpty:T}:(0,s.allPass)(m)}static filterData(e,t){const r=t;return(()=>{if((0,s.isEmpty)(e))return(0,s.always)(!1);e=(0,s.map)(((e,t,r)=>{let n=s.F;if((e=>(0,s.is)(String,e))(e)||(e=>(0,s.is)(Boolean,e))(e)||(e=>(0,s.is)(Number,e))(e))o=e,n=e=>e===o;else{if("function"==typeof e)return e;if((e=>(0,s.is)(Array,e))(e)||d(e))return console.warn(`ChannelPayloadFilter: Property "${e}" is an array/object, which is not allowed. This property will always return false.`),n}var o;return n}),e);const t=(0,s.where)(e);return(0,s.compose)(t,(t=>{if(void 0===r)return t;const n={};return(0,s.forEachObjIndexed)(((e,r)=>{n[r]=e((0,s.prop)(r,t))}),e),console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${r}"] - values: `,"color:orange;",{propsBooleans:n,comparedObj:t}),t}),(0,s.defaultTo)({}),(e=>{const{payload:t,srcElement:r,event:s}=e||{};return Object.assign({},e,r,s,t)}))})()}static checkPayloadSelector(e,t,r){const{payload:n,srcElement:o,event:i}=r||{},a=[o,n,(0,s.prop)("srcElement",i),r].reduce(((e,t)=>{const r=(0,s.prop)("el",t);return E.elIsDomElement(r)&&void 0===e&&(e=r),e}),void 0),c=e=>e.isEqualNode(a),d=e=>{const t=(0,s.flatten)(document.querySelectorAll(e));return(0,s.map)(c,t)};if(void 0!==t){const r=(0,s.compose)(s.flatten,(0,s.map)(d))(e),n=e;console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${t}"] - selectors: `,"color:orange;",{el:a,selectorsArr:n,nodeArrResultsDebugger:r})}if("object"!=typeof a)return!1;const l=(0,s.compose)(s.flatten,(0,s.map)(d))(e);return!0!==(0,s.isEmpty)(l)&&(0,s.any)((0,s.equals)(!0),l)}static elIsDomElement(e){return(0,s.is)(String,e)&&(e=document.querySelector(e)),(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(e)}static filterSelector(e,t){const r=(0,s.reject)(s.isEmpty,e);return(0,s.curry)(E.checkPayloadSelector)(r,t)}}},907:(e,t,r)=>{function s(e){return e&&"object"==typeof e&&"[object RegExp]"!==Object.prototype.toString.call(e)&&"[object Date]"!==Object.prototype.toString.call(e)}function n(e,t){return t&&!0===t.clone&&s(e)?i((r=e,Array.isArray(r)?[]:{}),e,t):e;var r}function o(e,t,r){const o=e.slice();return t.forEach((function(t,a){void 0===o[a]?o[a]=n(t,r):s(t)?o[a]=i(e[a],t,r):-1===e.indexOf(t)&&o.push(n(t,r))})),o}function i(e,t,r){const a=Array.isArray(t),c=(r||{arrayMerge:o}).arrayMerge||o;return a?Array.isArray(e)?c(e,t,r):n(t,r):function(e,t,r){const o={};return s(e)&&Object.keys(e).forEach((function(t){o[t]=n(e[t],r)})),Object.keys(t).forEach((function(a){s(t[a])&&e[a]?o[a]=i(e[a],t[a],r):o[a]=n(t[a],r)})),o}(e,t,r)}r.d(t,{$:()=>i}),i.all=function(e,t){if(!Array.isArray(e)||e.length<2)throw new Error("first argument should be an array with at least two elements");return e.reduce((function(e,r){return i(e,r,t)}))}},64:(e,t,r)=>{r.d(t,{FZ:()=>i,Ir:()=>n,Lx:()=>a,OZ:()=>o,RK:()=>c,V0:()=>d});var s=r(131);const n=async(e,t)=>{window.setTimeout((async()=>{await new Promise((e=>setTimeout(e,1))),window.requestAnimationFrame(e)}),t)},o=e=>{if(void 0!==e.constructor.name)return e.constructor.name;const t=e.toString();return(0,s.defaultTo)(String(t).substr(0,12),(0,s.match)(/^(function\s)(\w+)(\(.*)$/,t)[2])},i=(e,t)=>void 0!==e[t]?t:(0,s.compose)(s.head,(0,s.filter)((0,s.compose)((0,s.test)(s.__,t),(e=>new RegExp(e)))))((0,s.keys)(e)),a=e=>{const t={};for(const r in e)t[r]=e[r];return t},c=e=>{const t=(0,s.compose)((0,s.complement)(s.isEmpty),s.head,s.values),r=(0,s.compose)((0,s.complement)(s.isNil),s.head,s.values);return(0,s.allPass)([t,r])(e)};function d(e,t=[]){const r=(0,s.concat)(["length","name","prototype","constructor"],t),n=(0,s.compose)((0,s.without)(r),s.uniq),o=n(Object.getOwnPropertyNames(e.constructor.prototype)),i=n(Object.getOwnPropertyNames(e.constructor));return{methods:o,staticMethods:i,allMethods:(0,s.concat)(o,i)}}},158:(e,t,r)=>{r.d(t,{gc:()=>n});var s=r(131);function n(){setTimeout((()=>{(0,s.forEach)((e=>{}),this)}),1)}},445:(e,t,r)=>{function s(){return{createpropsMap:function(){const e=new WeakMap,t={vsid:this.props.vsid};return e.set(t,this.props),{key:t,weakMap:e}},gc:function(){for(const e in this)delete this[e]},createId:function(){return Math.random().toString(36).replace(/\d/gm,"").substring(1,8)},setTraceFunc:function(e){return!0===e?console.log:()=>{}}}}r.d(t,{z:()=>s})},643:(e,t,r)=>{r.d(t,{N:()=>n});var s=r(54);function n(){return{testFunc:function(e){console.log("stream mixin is ",e)},sendRoutePayload:function(e,t){return new s.u("CHANNEL_ROUTE",e,t,"subscribe")},sendUIPayload:function(e,t){return new s.u("CHANNEL_UI",e,t,"subscribe")}}}},521:(e,t,r)=>{r.d(t,{g:()=>o});var s=r(173),n=r(131);class o{constructor(e){const t=String(e.props.name),r=`${t}_ROUTE_UPDATER`;return(0,n.curry)(o.createTemporaryViewStreamObj)({id:r,name:t})}static createTemporaryViewStreamObj(e,t){const{name:r,id:n}=e,o=t,i=new s.A({id:n,name:r,data:t});i.onRendered=()=>{i.sendInfoToChannel("CHANNEL_ROUTE",o)},i.afterBroadcastEvents=()=>{i.disposeViewStream()},i.appendToNull()}}},961:(e,t,r)=>{r.d(t,{l:()=>o});var s=r(131),n=r(225);const o=function(e){const{__proxy__proxyName:t}=e;if(void 0!==t){const r=n.M.getProxyReviver(t);if("function"==typeof r)return((e,t)=>{const{__proxy__proxyName:r}=e;void 0===r&&console.error("object is not proxy object ",e);const n=(r,n)=>{const o=(0,s.path)(n,e),{__proxy__isProxy:i,__proxy__props:a}=o;return i?t(r,a):r},o=n((0,s.clone)(e),[]),i=(e,t)=>{const r=t||[];Object.entries(e).forEach((([t,s])=>{const o=(e=>{let t=typeof e;return["number","boolean","string"].includes(t)?t="primitive":"object"===t&&(Array.isArray(e)?t="array":null===e&&(t="undefined")),t})(s),a=[...r];a.push(t),"object"!==o&&"array"!==o||(e[t]=n(s,a),i(s,a))}))};return i(o),o})(e,r)}const r=(0,s.is)(Array),o=(0,s.is)(Object);var i;return!1===r(i=e)&&!0===o(i)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}},49:(e,t,r)=>{r.d(t,{A:()=>c,D:()=>a});var s=r(636),n=r.n(s);let o,i=!1;const a=e=>{if(i)console.warn("sanitizeHTML is already configured. Reconfiguration is not allowed.");else{if(e.strict)if(window.trustedTypes){const e=window.trustedTypes.createPolicy("default",{createHTML:e=>n().sanitize(e,{RETURN_TRUSTED_TYPE:!1})});o=t=>e.createHTML(t)}else o=e=>n().sanitize(e);else o=e=>e;i=!0}},c=e=>{if(!i)throw new Error("sanitizeHTML is not configured. Call sanitizeHTMLConfigure() with appropriate config.");return o(e)}},225:(e,t,r)=>{r.d(t,{M:()=>m});var s=r(167),n=r(519),o=r(907);let i,a,c,d,l=!0;const E=[];let p,h;const N=[],u=new Map,_=new n.O,m=new class{constructor(){d=!1}get channelsMap(){return c}get initialized(){return d}get config(){return i}get debug(){return l}static listChannels(){return Array.from(a.map.keys())}initialize(e={},t={},r,s){return a=r,i=(0,o.$)(e,t),i.channels&&i.channels.ROUTE&&(i=s.conformRouteObject(i)),h=i?.IMG_PATH,l=void 0!==i.debug?i.debug:l,this.getChannelActions=a.getChannelActions.bind(a),this.listRegisteredChannels=a.listRegisteredChannels.bind(a),d=!0,this._initialized=d,this.setChannelsMap(),t?.baseHref&&this.setHeadBaseHref(t.baseHref),i}setHeadBaseHref(e){const t=document.createElement("base");t.href=e,document.head.appendChild(t)}conformRouteConfig(e=!1){i=s.H.conformRouteObject(i,e)}setChannelsMap(){const e=a.getStream.bind(a),t=a.testStream.bind(a),r=a.getProxySubject.bind(a);c={getStream:e,testStream:t,getProxySubject:r}}setProp(e,t,r=!1){return r?(i.ephemeralProps[e]=t,t):(i.tmpProps[e]=t,e)}getProp(e){if(i.ephemeralProps.hasOwnProperty(e)){const t=i.ephemeralProps[e];return delete i.ephemeralProps[e],t}return i?.tmpProps?.[e]}createTempProp(e){const t=Math.random().toString(36).slice(2,8);return this.setProp(t,e,!0),t}setChannelConfig(e,t){return i.channels[e]=t,i.channels[e]}getChannelConfig(e,t=i){if("CHANNEL_ROUTE"===e?e="ROUTE":"CHANNEL_WINDOW"===e&&(e="WINDOW"),void 0===t||void 0===i.channels)return void console.warn("Spyne warning: Spyne config object is empty!");const r=i.channels[e];if(void 0!==r)return r;console.warn(`Spyne warning: Spyne configuration for channel, ${e} is empty!`)}registerChannel(){}addPluginConfig(e,t={}){void 0===i.plugins&&(i.plugins={}),this.addPluginMethods(t.pluginMethods),i.plugins[e]=t}getPluginsMethodObj(e){return e&&this.addPluginMethods(e),_.pluginMethodsObj}addPluginMethods(e){e&&_.addMethods(e)}doNotTrackChannel(e){N.push(e)}getUntrackedChannelsList(){return N}registerProxyReviver(e,t){u.set(e,t)}registerPlugin(e){this._initialized||console.warn("SpyneApp is not initialized yet. Plugin will not be fully registered."),e.register(this)}getProxyReviver(e){return u.get(e)}getPluginConfigByPluginName(e){return i.plugins[e]}get IMG_PATH(){return h}get excludeChannelsFromConsole(){return E}set excludeChannelsFromConsole(e){"string"==typeof e?E.includes(e)||E.push(e):Array.isArray(e)?e.forEach((e=>{"string"!=typeof e||E.includes(e)||E.push(e)})):console.warn("Invalid value provided to excludeChannelsFromConsole. Only strings or arrays are allowed.")}get linksData(){return console.warn("get links data in SpyneAppProperties is deprecated, use navLinks"),p}set linksData(e){console.warn("set links data in SpyneAppProperties is deprecated, use navLinks")}get navLinks(){return p}set navLinks(e){p=e}tempGetChannelsInstance(){}tempGetConfig(){}}},519:(e,t,r)=>{r.d(t,{O:()=>a});var s=r(131);const n=Object.create({}),o=(0,s.compose)(s.not,(0,s.is)(Array)),i=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)]));class a{constructor(){n.foo=()=>console.log("used for testing purposes.")}addMethod(e,t,r=!1){if(!0===Object.prototype.hasOwnProperty.call(n,e)){const t=`Spyne Warning: the method name, ${e}, already exists.`;if(r)return t;console.warn(t)}else n[e]=t}addMethods(e={},t=!1){let r;return!1===i(e)?(r=`Spyne Warning: the pluginMethods property, ${JSON.stringify(e)} needs to be an object.`,t?r:void console.warn(r)):(0,s.keys)(e).map((n=>{const o=(0,s.prop)(n,e);if("function"==typeof o)this.addMethod(n,o,t);else{if(r=`the value for ${n} is not a valid function.`,t)return r;console.warn(r)}})).join(",")}checkIfMethodExists(e){}get pluginMethodsObj(){return n}}},732:(e,t,r)=>{r.d(t,{g:()=>o});var s=r(64),n=r(131);class o{constructor(e,t="",r=!0){return this.parentContext=e,this.omittedMethods=["autoBinder","initAutoBinder","getEnhancerMethods","checkForMalformedMethods","caller","arguments","bindParentViewStream"],this.prefix=t,!0===r&&this.autoBinder(),this.allMethodsList}initAutoBinder(){this.autoBinder()}getEnhancerMethods(){return(0,s.V0)(this,this.omittedMethods)}checkForMalformedMethods(e){if(""===this.prefix)return void console.warn(`SPYNE WARNING: The following SpyneTrait ${this.constructor.name} needs a prefix`);const t=(0,n.reject)((e=>0===e.indexOf(this.prefix)),e);if(t.length>=1){const e=`Spyne Warning: The following method(s) in ${this.constructor.name} require the prefix, "${this.prefix}": [${t.join(", ")}];`;console.warn(e)}}bindParentViewStream(e,t){this.checkForMalformedMethods(e.allMethods);const r={},s=(e,s=!1)=>{const n=!0===s?this.constructor:this;"function"==typeof n[e]&&(r[e]=t[e]=n[e].bind(t))},o=(0,n.curryN)(2,s)(n.__,!0);return(0,n.map)(o,e.staticMethods),(0,n.map)(s,e.methods),r}autoBinder(){const e=this.getEnhancerMethods();return this.allMethodsList=this.bindParentViewStream(e,this.parentContext),this.allMethodsList}}},511:(e,t,r)=>{r.d(t,{Q:()=>o});var s=r(131),n=r(225);class o{constructor(){this.checkIfObjIsNotEmptyOrNil=o.checkIfObjIsNotEmptyOrNil.bind(this)}static checkIfObjIsNotEmptyOrNil(e){const t=(0,s.compose)((0,s.complement)(s.isEmpty),s.head,s.values),r=(0,s.compose)((0,s.complement)(s.isNil),s.head,s.values);return(0,s.allPass)([t,r])(e)}static checkIfParamValueMatchesRegex(e,t){const r=(0,s.reject)((0,s.equals)("routeName")),n=(0,s.compose)(r,s.keys),o=(0,s.compose)((0,s.find)((t=>(0,s.test)(new RegExp(t),e))),n)(t);return(0,s.is)(String,o)&&(t=(0,s.assoc)(e,(0,s.prop)(o,t),t)),t}static formatStrAsWindowLocation(e){return{hash:e,search:e,pathname:e}}static getLocationStrByType(e,t=!1,r=window.location){const n={slash:"pathname",query:"search",hash:"hash"}[!0===t?"hash":e];return(0,s.prop)(n,r).replace(/^(\/)?(#)?(\/)?(.*)$/,"$4")}static createRouteArrayFromParams(e,t,r="slash",n){const o=[],i=t=>{const r={},a=t.routeName;let c=void 0!==e[a]?e[a]:(0,s.prop)(a,n);const d=typeof t[c];"string"===d?c=t[c]:"undefined"===d&&(t=this.checkIfParamValueMatchesRegex(c,t)),r[a]=c,this.checkIfObjIsNotEmptyOrNil(r)&&o.push(r);const l=(0,s.is)(Object,t),E=(0,s.has)(c,t),p=(0,s.has)("routePath",t);if(!0===(E&&l)){const e=t[c];(0,s.has)("routePath",e)&&i(e.routePath)}else!0===p&&void 0!==c&&i(t.routePath)};return i(t),o}static createSlashString(e){const t=(0,s.reject)(s.isNil),r=(0,s.when)((0,s.complement)(s.isNil,s.__),(0,s.join)("/")),n=(0,s.replace)(/^(\^*)(.*|^\$)(\$)$/,"$2");return(0,s.compose)(n,r,t,s.flatten,(0,s.map)(s.values))(e)}static createQueryString(e){const t=(0,s.reject)(s.isNil),r=this.checkIfObjIsNotEmptyOrNil,n=(0,s.compose)((0,s.join)("="),s.flatten,s.toPairs),o=(0,s.ifElse)(r,n,(0,s.always)(void 0)),i=(0,s.map)(o),a=(0,s.when)((0,s.complement)(s.isEmpty),(0,s.concat)("?"));return(0,s.compose)(a,(0,s.join)("&"),t,i)(e)}static checkPayloadForRegexOverrides(e,t,r="Value"){const n=(0,s.compose)((e=>(0,s.prop)(`${e}${r}`,t)),s.head,s.keys);return(0,s.map)((e=>{const t=n(e);return void 0!==t?(0,s.assoc)((0,s.compose)(s.head,s.keys)(e),t,e):e}),e)}static checkForRouteValWithMultipleVals(e){return!0===Array.isArray(e)?e.map((e=>("object"==typeof e&&(e=Object.keys(e).reduce(((t,r)=>(t[r]=(e=>{const t=e.match(/^[^|]*/);return t?"^$"===t[0]?"":t[0]:e})(e[r]),t)),{})),e))):e}static checkForRouteValsPartMatch(e,t={}){return e.map((e=>{const r={...e};return Object.keys(r).forEach((e=>{var s,n;Object.prototype.hasOwnProperty.call(r,e)&&t[e]&&(r[e]=(s=t[e],(n=r[e]).split("|").some((e=>((e,t)=>{const r=e.replace(/[-/\\^$+?.()|[\]{}]/g,"\\$&").replace(/\*/g,"[\\w\\d_-]*");return new RegExp(`^${r}$`).test(t)})(e,s)))?s:n))})),r}))}static convertParamsToRoute(e,t=n.M.config.channels.ROUTE,r,s){const i=void 0!==r?r:t.type,a=t.isHash,c=t.routes.routePath,d=void 0!==s?s:this.getLocationStrByType(i,a),l=this.convertRouteToParams(d,t,i).routeData;let E=this.createRouteArrayFromParams(e,c,i,l);return E=o.checkPayloadForRegexOverrides(E,e),E=o.checkForRouteValWithMultipleVals(E),"query"===i?this.createQueryString(E):this.createSlashString(E)}static findIndexOfMatchedStringOrRegex(e,t){const r=t.includes(".+"),n=(0,s.replace)(/^$/,"^$"),o=(0,s.either)((0,s.propEq)(e,"str"),(0,s.compose)((0,s.test)(s.__,e),(0,s.prop)("re")));return(0,s.compose)((0,s.findLastIndex)((0,s.equals)(!0)),(0,s.map)(o),(0,s.map)((e=>{return{str:e,re:(t=e,r&&(t.startsWith("^")||(t="^"+t),t.endsWith("$")||(t+="$")),new RegExp(t))};var t})),(0,s.map)(n))(t)}static checkIfValueShouldMapToParam(e,t,r){const n=(0,s.compose)((0,s.map)(s.last),(0,s.map)((0,s.filter)((0,s.is)(String))),s.toPairs)(e),i=o.findIndexOfMatchedStringOrRegex(t,n);let a=t;if(i>=0){const t=n[i],r=(0,s.invert)(e),o=(0,s.compose)(s.head,(0,s.defaultTo)([]),(0,s.prop)(t))(r);!0===/^([-$\w]*)$/.test(o)&&!0===(0,s.is)(String,o)&&(a=o)}return a}static createArrFromSlashStr(e){return e.replace(/^([/])?(.*)$/,"$2").split("/")}static convertSlashRouteStrToParamsObj(e,t,r){const n=t,o=this.createArrFromSlashStr(t),i=[],a=[];let c=e;(0,s.reduce)(((e,t)=>{const n=this.checkIfValueShouldMapToParam(c,t,r);c=this.checkIfParamValueMatchesRegex(t,c);const o=(0,s.either)(s.isEmpty,s.isNil);void 0!==c&&(e=>e!==(0,s.last)(i))(c.routeName)&&!1===o(n)&&(i.push(c.routeName),a.push(n));const d=[t,"routePath"],l=(0,s.path)(d,c),E=(0,s.path)(["routePath"],c);void 0!==l?c=l:void 0!==E&&(c=E)}),0,o);const d=(0,s.zipObj)(i,a),l=this.getLastArrVal(i);return{paths:i,pathInnermost:l,routeData:d,routeValue:n}}static getLastArrVal(e){return t=e,void 0!==(0,s.last)(t)?(0,s.last)(t):"";var t}static createDefaultParamFromEmptyStr(e,t){const r={};return r[e.routeName]=this.checkIfValueShouldMapToParam(e,t),r}static convertQueryStrToParams(e,t,r){const n=t,o=t.replace(/^([?])?(.*)$/,"$2"),i=(0,s.compose)((0,s.map)((0,s.split)("=")),(0,s.split)("&"))(o);let a=(0,s.fromPairs)(i),c=(0,s.map)(s.head,i);return!0===(0,s.isEmpty)(t)&&(a=this.createDefaultParamFromEmptyStr(e,t,r),c=(0,s.keys)(a)),{paths:c,pathInnermost:this.getLastArrVal(c),routeData:a,routeValue:n}}static convertRouteToParams(e,t,r){if(void 0===t)return{};const n=void 0!==r?r:t.type,o=(0,s.defaultTo)({},(0,s.prop)("regexTokens",t)),i=t.routes.routePath;return"query"===n?this.convertQueryStrToParams(i,e):(e=e.replace(/\/$|$/,"/"),this.convertSlashRouteStrToParamsObj(i,e,o))}}},167:(e,t,r)=>{r.d(t,{H:()=>i});var s=r(968),n=r(131),o=r(511);class i{constructor(){this.createPopStateStream=i.createPopStateStream.bind(this)}static createPopStateStream(e){(0,s.fromEventPattern)((function(e){window.onpopstate=e}),(function(){window.onpopstate=function(){}})).subscribe(e)}static getLastArrVal(e){return t=e,void 0!==(0,n.last)(t)?(0,n.last)(t):"";var t}static compareRouteKeywords(e={},t){const r=(e,t)=>void 0!==t?(0,n.pick)(t,e):e;let s=r(e,t);return{pickValues:r,compare:(e={},t)=>{const o=r(e,t),i=e=>(0,n.compose)(n.keys,(0,n.filter)((0,n.propEq)(!0,e))),a=(0,n.compose)((0,n.map)((e=>{const t=(0,n.prop)(e,s),r=(0,n.prop)(e,o),i=(0,n.equals)(t,r),a=void 0!==t,c=void 0!==r,d=!i,l=!1===a&&!0===c,E=!0===a&&!1===c,p={};return p[e]={same:i,changed:d,added:l,removed:E,previousExists:a,nextExists:c},p})),n.uniq,(0,n.chain)(n.keys))([s,o]),c=(0,n.chain)(i("changed"),a),d=(0,n.chain)(i("added"),a),l=(0,n.chain)(i("removed"),a);return s=o,{pathsAdded:d,pathsRemoved:l,pathsChanged:c}},getComparer:()=>s}}static getRouteArrData(e,t){const r=(0,n.filter)((0,n.includes)(n.__,e),t);return{paths:r,pathInnermost:i.getLastArrVal(r)}}static flattenConfigObject(e){const t=e=>(0,n.chain)((([e,r])=>"object"!=typeof r||null===r||Array.isArray(r)?[[e,r]]:(0,n.map)((([t,r])=>[`${e}.${t}`,r]),t(r))),(0,n.toPairs)(e));return(0,n.values)((0,n.fromPairs)(t(e)))}static addRouteDatasets(e){const{type:t,isHash:r}=e,s=s=>("query"===t?"":!0===r?"#":"/")+o.Q.convertParamsToRoute(s,e).replace(/^(.*\/)([\w-]*\/?)(.*)$/gm,"$1$2"),i=/^([A-Za-z0-9_-])+$/m,a=(e=[],t,r={})=>{let{routeName:o}=t;return(0,n.toPairs)(t).reduce(((t,c)=>{const[d,l]=c,E=(0,n.is)(Object,l),p=e=>(0,n.test)(i,e)?(e=>String(e).replace(/([-_])/g," ").toUpperCase())(e):d;if("routeName"===d||"404"===d)return t;o=o||(0,n.prop)("routeName",l);let h=(0,n.clone)(r);if(h[o]=String(d).replace(/([^A-Za-z0-9-_])/g,""),!0===E){if(1===(0,n.keys)(h).length){const e=(0,n.path)(["routePath","routeName"],l);if(e){const o=(0,n.clone)(h);o[e]="",o.navLevel=(0,n.keys)(r).length,o.title=p(d),o.href=s(o),t.push(o)}}h=a(e,l,h)}else h.title=p(d),h.href=s(h);return h.navLevel=(0,n.keys)(r).length,t.push(h),t}),[])},c=a([],e.routes),d=(0,n.flatten)(c);return{routeDatasetsArr:d,routeNamesArr:(e=>{const t=(0,n.reject)((0,n.includes)(n.__,["title","href","navLevel"]));return(0,n.compose)(n.uniq,t,n.flatten,(0,n.map)(n.keys))(e)})(d)}}static conformRouteObject(e={},t=!1){const r=(0,n.path)(["channels","ROUTE"],e);let{add404s:s}=void 0!==r?r:e;s=s||t;const o=e=>{const t=e[1],r=(0,n.is)(Array,t);return""===t?e[1]="^$":r&&(e[1]=t.join("|")),e},a=(0,n.compose)(n.fromPairs,(0,n.map)((e=>{const[t,r]=e,i=s?{404:".+"}:{},c=(0,n.is)(Object,r),d=(0,n.is)(Array,r),l="routePath"===t;return!0===c&&!1===d&&(e[1]=a(e[1]),l&&(e[1]=(0,n.compose)((0,n.mergeDeepRight)(i),n.fromPairs,(0,n.map)(o),n.toPairs)(e[1]))),e})),n.toPairs);if(void 0!==r){e.channels.ROUTE=a(e.channels.ROUTE);const t=i.addRouteDatasets(e.channels.ROUTE);return e.channels.ROUTE=(0,n.mergeRight)(e.channels.ROUTE,t),e}return a(e)}static getLocationData(){return(0,n.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}}},432:(e,t,r)=>{r.d(t,{Y:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(){this.createDomObservableFromEvent=i.createDomObservableFromEvent.bind(this)}static createDomObservableFromEvent(e,t,r=!0,o=window){return t=void 0===t?e=>e:t,(0,s.fromEventPattern)((t=>o.addEventListener(e,t,{passive:r})),(()=>{o[e]=e=>e})).pipe((0,n.map)(t))}static createMediaQuery(e){const t=window.matchMedia(e);return this.checkIfValidMediaQuery(t,e),!1!==t&&t}static checkIfValidMediaQuery(e,t){const r=e=>e.replace(/\s+/gm,""),s=void 0!==e.matches&&r(e.media).indexOf(r(t))>=0;return!1===s&&(t=>{console.warn(`Spyne Info: the following query string, "${t}", has been optimized to "${e.media}" by the browser and may not be a valid Media Query item!`)})(t),s}static createMediaQueryHandler(e,t){const r=(e=>t=>(t.mediaQueryName=e,t))(t),o=(i=e,{addHandler:e=>{i.addListener(e)},removeHandler:e=>{i.onchange=()=>{}}});var i;return new s.fromEventPattern(o.addHandler,o.removeHandler).pipe((0,n.map)(r))}static createMergedObsFromObj(e){const t=e.mediaQueries||e.mediaQueries,r=[];return(0,o.mapObjIndexed)(((e,t,s)=>{const n=i.createMediaQuery(e);return!1!==n&&r.push(i.createMediaQueryHandler(n,t)),r}),t),r}}},393:(e,t,r)=>{r.d(t,{W:()=>n,d:()=>o});const s=(e=!1,t=1,r="ease",s=!1)=>`${!0===s?"opacity:0;":""}transition: opacity ${t}s ${r}; opacity: ${!0===e?1:0};`;function n(e,t){const r=1*window.getComputedStyle(e).opacity,n=s(!0,t,"ease",1===r);e.style.cssText+=n}function o(e,t,r){const n=s(!1,t,"ease");e.style.cssText+=n,e.addEventListener("transitionend",r,!1)}},518:(e,t,r)=>{r.d(t,{j:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(e){this.props.observableStreams=i.createDirectionalObservables()}static createDirectionalFiltersObject(){const e="internal",t="parent",r="child";return{P:[t],C:[r],PCI:[t,e,r],CI:[r,e],PI:[t,e],PC:[t,r]}}static addDefaultDir(e){return(0,o.flip)(o.mergeRight)({$dir:["internal"]},(0,o.clone)(e))}static addDownInternalDir(e,t=["internal","down"]){return(0,o.flip)(o.mergeRight)((0,o.clone)(e),{$dir:t})}static addChildAndInternalDir(e,t=["child","down"]){return(0,o.flip)(o.mergeRight)((0,o.clone)(e),{$dir:t})}static mapToDefaultDir(e){return this.addDefaultDir(e)}static createDirectionalObservables(e=new s.Subject,t,r){void 0!==t&&void 0!==r&&(e.viewName=t,e.vsid=r);const i=e=>(0,o.propSatisfies)((t=>t.includes(e)),"$dir"),a=i("parent"),c=i("child"),d=i("internal"),l=e=>(0,o.mergeRight)({from$:e}),E=l("child"),p=l("internal"),h=l("parent"),N=e.pipe((0,n.filter)((e=>void 0!==e&&void 0!==e.action))),u=e.pipe((0,n.filter)(d),(0,n.map)(p)),_=e.pipe((0,n.filter)(a),(0,n.map)(E)),m=e.pipe((0,n.filter)(c),(0,n.map)(h)),T={parent:_,internal:u,child:m};return{raw$:N,toInternal$:u,toParent$:_,toChild$:m,completeAll:()=>{(0,o.forEach)((e=>{e.complete(),e.isStopped=!0}),[N,u,_,m])},completeStream:(e=[])=>{void 0!==e&&e.length>=1&&e.forEach((e=>{var t;void 0!==T[e]&&((t=T[e]).complete(),t.isStopped=!0)}))}}}}},291:(e,t,r)=>{r.d(t,{X:()=>i});var s=r(131),n=r(49),o=r(225);class i{constructor(e,t={},r={}){this.template=this.formatTemplate(e),this.isProxyData=!0===t.__cms__isProxy,this.testMode=r?.testMode,(()=>{!0===(0,s.is)(Array,t)&&(t={spyneData:t},this.template=this.template.replace("{{/}}","{{/spyneData}}"),this.template=this.template.replace("{{#}}","{{#spyneData}}"))})(),this.templateData=t;const n=i.getStringArray(this.template);let o=this.template.match(i.findTmplLoopsRE());o=null===o?[]:o;const a=i.parseTmplLoopsRE(),c=this.parseTheTmplLoop.bind(this),d=(0,s.includes)(s.__,o),l=(0,s.ifElse)(d,((e,t)=>e.replace(a,c)),this.addParams.bind(this));this.finalArr=n.map(l)}static isPrimitiveTag(e){return/({{\.\*?}})/.test(e)}static getNestedDataReducer(e={},t=""){return/(\.)/gm.test(String(t))?String(t).split(".").reduce(((e,t)=>e[t]?e[t]:"string"==typeof e?e:""),e):e[t]??""}static getStringArray(e){const t=e.split(i.findTmplLoopsRE()),r=/^([\\n\s\W]+)$/;return(0,s.reject)((e=>e.match(r)),t)}static findTmplLoopsRE(){return/({{#[\w.]+}}[\w\n\s\W]+?{{\/[\w.]+}})/gm}static parseTmplLoopsRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static swapParamsForTagsRE(){return/({{)(.*?)(}})/gm}removeThis(){void 0!==this&&(this.finalArr=void 0,this.templateData=void 0,this.template=void 0)}renderDocFrag(){let e=i.replaceImgPath(this.finalArr.join(""));!0!==this.testMode&&(e=(0,n.A)(e));const t=/^([^>]*?)(<){1}(\b)(thead|col|colgroup|tbody|td|tfoot|tr|th)(\b)([^\0]*)$/.test(e)?e:document.createRange().createContextualFragment(e);return window.setTimeout(this.removeThis,2),t}renderToString(){let e=this.finalArr.join("");return e=i.replaceImgPath(e),window.setTimeout(this.removeThis,2),e}getTemplateString(){return this.finalArr.join("")}formatTemplate(e){return!0===["SCRIPT","TEMPLATE"].includes((0,s.prop)("nodeName",e))?e.innerHTML:e}getDataValFromPathStr(e,t){const r=String(e).split(".");return(0,s.path)(r,t)||""}addParams(e){return e.replace(i.swapParamsForTagsRE(),((e,t,r,s)=>i.getNestedDataReducer(this.templateData,r)))}static replaceImgPath(e){const{IMG_PATH:t}=o.M;return void 0!==t?(e=e.replaceAll(/src\s*=\s*(['"])imgs\//g,`src=$1${t}`)).replaceAll(/url\(\s*(['"]?)imgs\//g,`url($1${t}`):e}parseTheTmplLoop(e,t,r,n){const o=/(\.)/gm,a=n;let c=i.getNestedDataReducer(this.templateData,r);const d=(e,t,r)=>i.isPrimitiveTag(t)?l(e,t,r):E((()=>{const t=e,s=r,n=r+1;return this.isProxyData?{spyneLoopKey:t,__cms__dataId:c.__cms__dataId,origKey:c[`__cms__keyFor_${e}`],loopIndex:s,loopNum:n,d:e}:{spyneLoopKey:t,loopIndex:s,loopNum:n}})(),t,r),l=(e,t,r,s)=>t.replace(i.swapParamsForTagsRE(),e),E=(e,t,r)=>t.replace(i.swapParamsForTagsRE(),((t,s,n)=>{const i={loopIndex:r,loopNum:r+1};if(!1===o.test(n)&&void 0!==e[n])return void 0!==i[n]?i[n]:e[n];const a=this.getDataValFromPathStr(n,e);return void 0!==i[n]?i[n]:a}));return!0===(0,s.isNil)(c)||(0,s.isEmpty)(c)?"":(void 0===c.length&&(c=[c]),c=Array.isArray(c)?c:[c],c.map(((e,t)=>"string"==typeof e?d(e,a,t):E(e,a,t))).join(""))}}},192:(e,t,r)=>{r.d(t,{r:()=>a});var s=r(445),n=r(291),o=r(907),i=r(131);class a{constructor(e={},t=!1){var r;e.tagName=(r=e.tagName,(0,i.defaultTo)("div")(r)),e.attributes=void 0!==e.attributes?e.attributes:this.getDomAttributes(e),e.attrs=this.updateAttrs(e.attributes),e.fragment=document.createDocumentFragment(),this.testMode=t,this.props=e,this.addMixins()}setProp(e,t){this.props[e]=t}getProp(e){return this.props[e]}get el(){return this.props.el}setElAttrs(e,t){return this.getProp("attrs").forEach(((t,r)=>{"dataset"===r?(0,i.forEachObjIndexed)(((t,r)=>{e.dataset[r]=t}),t):e.setAttribute(r,t)})),e}updateAttrs(e,t){const r=void 0!==t?t:new Map;return(0,i.mapObjIndexed)(((e,t)=>r.set(t,e)),e),r}addTemplate(e){const t=this.getProp("template");return void 0!==t?(t=>{let r=this.getProp("data");r=(0,i.is)(Object,r)?r:{};const s=new n.X(t,r,{testMode:this?.testMode}).renderDocFrag();return(0,i.is)(String,s)?e.innerHTML=s:e.appendChild(s),e})(t):e}createElement(e="div"){return document.createElement(e)}addContent(e){const t=this.getProp("data");if(!0===(0,i.is)(String,t)){const r=document.createTextNode(t);e.appendChild(r)}return e}execute(){const e=(0,i.pipe)(this.createElement.bind(this),this.setElAttrs.bind(this),this.addTemplate.bind(this),this.addContent.bind(this))(this.getProp("tagName"));this.props.el=e}render(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el")}renderToHTMLString(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el").outerHTML}returnIfDefined(e,t){if(void 0!==t){const r=void 0===t;e[t]=!1===r?t:(0,o.$)(e[t],t)}}updateprops(e){return this.returnIfDefined(this.props,e),this}updatepropsAndRun(e){return this.updateprops(e),this.execute(),this.getProp("fragment")}unmount(){void 0!==this.props&&(this.getProp("el").remove(),this.props=void 0,this.gc())}updateTag(e="div"){this.updateprops(e)}updateAttributes(e={}){this.updateprops(e)}updateTemplate(e){this.updateprops(e)}updateData(e={}){this.updateprops(e)}addTagAndRender(e="div"){this.updatepropsAndRun(e)}addAttrsibutesAndRender(e={}){this.updatepropsAndRun(e)}addTemplateAndRender(e){this.updatepropsAndRun(e)}addDataAndRender(e={}){this.updatepropsAndRun(e)}addMixins(){const e=(0,s.z)();this.gc=e.gc.bind(this)}getDomAttributes(e){return(0,i.pick)(this.attributesArray,e)}get attributesArray(){return["accept","accept-charset","accesskey","action","align","allow","alt","async","autocapitalize","autocomplete","autofocus","autoplay","bgcolor","border","buffered","challenge","charset","checked","cite","class","code","codebase","color","cols","colspan","content","contenteditable","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","defer","dir","dirname","disabled","download","draggable","dropzone","enctype","for","form","formaction","headers","height","hidden","high","href","hreflang","http-equiv","icon","id","importance","integrity","ismap","itemprop","keytype","kind","label","lang","language","lazyload","list","loop","low","manifest","max","maxlength","minlength","media","method","min","multiple","muted","name","novalidate","open","optimum","pattern","ping","placeholder","poster","preload","radiogroup","readonly","referrerpolicy","rel","required","reversed","rows","rowspan","sandbox","scope","scoped","selected","shape","size","sizes","slot","span","spellcheck","src","srcdoc","srclang","srcset","start","step","style","summary","tabindex","target","title","translate","type","usemap","value","width","wrap"]}}},992:(e,t,r)=>{r.d(t,{e:()=>l});var s=r(643),n=r(64),o=r(225),i=r(968),a=r(531),c=r(131);const d=!0===o.M.debug;class l{constructor(e,t){this.addMixins(),this.props=e,this.broadcastFn=t,this.broadcaster(this.broadcastFn)}addDblClickEvt(e){return(0,i.fromEvent)(e,"dblclick").pipe((0,a.map)((e=>{const t=(0,c.clone)(e);return t.typeOverRide="dblclick",t})))}broadcast(e){if(e.length<=0&&!0===d)return void console.warn(`Spyne Warning: The nested array in ${this.props.name}.broadcastEvents appears to be empty --\x3e vsid:${this.props.vsid}!`);const t={UI:this.sendUIPayload,ROUTE:this.sendRoutePayload},[r,s,o]=e;let a,l=this.props.el.querySelectorAll(r);if(l.length<=0){const e=this.props.el,t=t=>{t===e&&(l=[t])};(()=>{const s=(null!==e.parentElement?e.parentElement:document).querySelectorAll(r);s.forEach=Array.prototype.forEach,s.forEach(t)})()}const E=void 0!==o;!0==(void 0===l||l.length<=0)&&!0===d?console.warn(`Spyne Warning: The item ${r}, does not appear to exist in ${this.props.name} --\x3e vsid:${this.props.vsid}!`):(l.forEach=Array.prototype.forEach,l.forEach((e=>{const r="dblClick"!==s?(0,i.fromEvent)(e,s,{preventDefault:()=>!0}):this.addDblClickEvt(e);a=e.dataset.channel;const o={};var d;o.payload=(0,n.Lx)(e.dataset),o.payload=(0,c.omit)(["channel"],o.payload),o.channel=a,o.srcElement={},o.srcElement.id=this.props.id,o.srcElement.vsid=this.props.vsid,o.srcElement.isLocalEvent=E,o.srcElement.srcEvent=s,o.srcElement.el=e,(0,t[(d=a,"ROUTE"===d||"CHANNEL_ROUTE"===d?"ROUTE":("UI"!==d&&"CHANNEL_UI"!==d&&void 0!==d&&console.warn(`SpyneJS warning: The channel, ${d}, is not allowed here, only "UI" or "ROUTE" are valid channels, defaulting to CHANNEL_UI`),"UI"))])(r,o)})))}broadcaster(e){e().forEach((e=>this.broadcast(e)))}addMixins(){const e=(0,s.N)();this.sendUIPayload=e.sendUIPayload,this.sendRoutePayload=e.sendRoutePayload}}},300:(e,t,r)=>{r.d(t,{q:()=>d});var s=r(192),n=r(393),o=r(518),i=r(907),a=r(968),c=r(131);class d{constructor(e,t={},r="",s="theName"){this.addMixins(),this._state="INIT",this.vsid=r,this.el=t.el,this.vsName=s,this.defaults={debug:!1,extendedHashMethods:{}},this.options=(0,i.$)(this.defaults,t),this.addActionListeners().forEach((e=>{const[t,r]=e;this.options.extendedHashMethods[t]=e=>this[r](e)})),this.options.hashMethods=this.setHashMethods(this.options.extendedHashMethods),this.sink$=e,this.sink$.subscribe(this.onObsSinkSubscribe.bind(this)),this.$dirs=o.j.createDirectionalFiltersObject(),this.addDefaultDir=o.j.addDefaultDir,this.sourceStreams=o.j.createDirectionalObservables(new a.Subject,this.vsName,this.vsid),this._source$=this.sourceStreams.toInternal$}addActionListeners(){return[]}setHashMethods(e={}){const t={VS_DETRITUS_COLLECT:e=>this.onGarbageCollect(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyForGC(e),EXTIRPATE:e=>this.onDispose(e),VS_SPAWN:e=>this.onRender(e),VS_SPAWN_AND_ATTACH_TO_PARENT:e=>this.onRenderAndAttachToParent(e),VS_SPAWN_AND_ATTACH_TO_DOM:e=>this.onRenderAndAttachToDom(e),ATTACH_CHILD_TO_SELF:e=>this.onAttachChildToSelf(e)};return(0,i.$)(t,e)}createDomItem(){this.props=void 0!==this.props?this.props:{};const e=(0,c.filter)((e=>void 0!==e),(0,c.pick)(["id","className"],this.props)),{tagName:t,data:r,template:n}=this.props;return new s.r(t,e,r,n)}onDisposeCompleted(e){}animateInTween(e,t){(0,n.W)(e,t)}animateOutTween(e,t,r){(0,n.d)(e,t,r)}setAnimateIn(e){if(!0===e.animateIn){const t=void 0!==e.el?e.el:this.domItem.el;this.animateInTween(t,e.animateInTime)}}disposeMethod(e){const t=void 0!==e.el.el?e.el.el:e.el,r={action:"READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.PI,el:t},s=(0,a.bindCallback)(((e,r)=>{this.animateOutTween(t,e.animateOutTime,r)})),n=e=>{this._source$.next(r)},o=!0===e.animateOut?e=>(s(e).subscribe(n),{action:"EXTIRPATING",$dir:this.$dirs.CI}):()=>({action:"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.CI});return o(e)}onDispose(e){return this.disposeMethod(e)}removeStream(){void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["internal","child"])}onReadyForGC(e){this.removeStream()}onGarbageCollect(e){void 0!==this.domItem&&this.domItem.unmount(),void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["parent"])}getSourceStream(){return this._source$}combineDomItems(e){if(void 0!==this.el)return;const t=(0,c.isNil)(e.query)?e.node:e.query;({appendChild:(e,t)=>e.appendChild(t),after:(e,t)=>e.after(t)}[e.attachType]||((e,t)=>e.insertBefore(t,e.firstChild)))(t,this.domItem.render()),this.setAnimateIn(e)}onAttachChildToSelf(e){const t=e.childRenderData;return this.combineDomItems(t),{action:"CHILD_ATTACHED",$dir:this.$dirs.PI}}onRenderAndAttachToParent(e){return this.onRender(e),this.combineDomItems(e),{action:"VS_SPAWNED_AND_ATTACHED_TO_PARENT",el:this.el||this.domItem.el,$dir:this.$dirs.PI}}renderDomItem(e){const[t,r,n,o]=e;return this.domItem=new s.r({tagName:t,attributes:r,data:n,template:o}),this.domItem}onRender(e){return{action:"VS_SPAWNED",el:this.el||(e=>this.renderDomItem(e))((0,c.props)(["tagName","domAttributes","data","template"],e)),$dir:this.$dirs.I}}extendedMethods(e){}onRenderAndAttachToDom(e){return e.attachData.el=(e=>this.renderDomItem(e))((0,c.props)(["tagName","domAttributes","data","template"],e)),this.combineDomItems(e.attachData),{action:"VS_SPAWNED_AND_ATTACHED_TO_DOM",el:this.el||e.attachData.el.el,$dir:this.$dirs.CI}}onObsSinkSubscribe(e){const t=e.action,r=(0,c.defaultTo)((e=>this.extendedMethods(e))),s=r(this.options.hashMethods[t])(e);void 0!==s&&(e=>{this._source$.next(e)})(Object.freeze(s))}addMixins(){}}},54:(e,t,r)=>{r.d(t,{u:()=>a});var s=r(225),n=r(961),o=r(158),i=r(131);class a{constructor(e,t,r,s="subscribe",n=!1){const o={name:e,observable:t,data:r,action:s};this.sendToDirectorStream(o)}sendToDirectorStream(e){const t=s.M.channelsMap.getStream("DISPATCHER"),r=(0,n.l)(e);t.next(r),e=void 0}static deepClone(e){const t=(0,i.is)(Array),r=(0,i.is)(Object);var s;return!1===t(s=e)&&!0===r(s)?(0,i.compose)(i.fromPairs,i.toPairs,i.clone)(e):(0,i.clone)(e)}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}addMixins(){this.gc=o.gc}}},707:(e,t,r)=>{r.d(t,{T:()=>l});var s=r(131),n=r(225);function o(){return!0===n.M.debug}function i(e,t,r=!1){const n=c(e,t,r);return 1===n.length?(0,s.head)(n):n}function a(e,t,r){const n=document.querySelector(e),i=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));if(null===n||!1!==i(n)){if(void 0!==t&&String(t).trim().length>0){function a(e){try{return document.querySelectorAll(e).length>0}catch(e){return!1}}const c=a(t);!0===r&&!0===o()&&!1===c&&console.warn(`Spyne Warning: the selector, ${t} does not exist in this el, ${e}`)}}else console.warn(`Spyne Warning: the el object is not a valid single element, ${n}`)}function c(e,t,r=!1){let s=!1;const n=(r=>{let n=[];try{n=document.querySelectorAll(r)}catch(e){n=[]}try{s=document.querySelector(t)===document.querySelector(e),!0===s&&(n=[document.querySelector(t)])}catch(e){}return n})(void 0!==t?`${e} ${t}`:e);return!0===r&&a(!0===s?"body":e,t,r),n}function d(e,t,r){return c(t,r).forEach((t=>{t.style.cssText=e})),this}function l(e,t){function r(t){return l(e,t)}return a(e="string"==typeof e?e:function(e){let t=`${Math.random().toString(36).replace(/\d/gm,"").substring(1,8)}`;return void 0===e.dataset.vsid?e.dataset.vsid=t:t=e.dataset.vsid,`[data-vsid='${t}']`}(e),t,!1),r.map=r=>Array.from(c(e,t)).map(r),r.forEach=r=>Array.from(c(e,t)).map(r),r.getNodeListArray=()=>c(e,t),r.addClass=r=>(c(e,t).forEach((e=>e.classList.add(r))),this),r.removeClass=r=>(c(e,t).forEach((e=>{e.classList.remove(r)})),this),r.setClass=r=>(c(e,t).forEach((e=>{const t=(0,s.compose)((0,s.reject)(s.isEmpty),(0,s.split)(" "))(e.className),n=r.split(" ");t.forEach((t=>e.classList.remove(t))),n.forEach((t=>e.classList.add(t)))})),this),r.unmount=()=>{},r.toggleClass=(r,s)=>(c(e,t).forEach((e=>{(s=void 0!==s?s:!e.classList.contains(r))?e.classList.add(r):e.classList.remove(r)})),this),r.toggle=(e,t)=>(r.toggleClass(e,t),this),r.appendChild=e=>(0!==r.el.length?r.el.appendChild(e):console.warn(`Spyne Warning: The selector, ${t} does not appear to be valid!`),r.el),r.addAnimClass=r=>{requestAnimationFrame((()=>{c(e,t).forEach((e=>{try{e.classList.add(r)}catch(e){}}))}))},r.setActiveItem=(r,n)=>{const a=c(e,t),d="string"==typeof n?i(e,n):n;var l;return!0===(l=d,(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(l))?a.forEach((e=>e.isEqualNode(d)?e.classList.add(r):e.classList.remove(r))):!0===o()&&console.warn(`Spyne Warning: The selector, ${n}, does not appear to be a valid item in setActiveItem: ${r}`),this},Object.defineProperty(r,"el",{get:()=>i(e,t,!0)}),Object.defineProperty(r,"els",{get:()=>c(e,t)}),Object.defineProperty(r,"len",{get:()=>c(e,t,!1).length}),Object.defineProperty(r,"exists",{get:()=>c(e,t,!1).length>=1}),Object.defineProperty(r,"exist",{get:()=>c(e,t,!1).length>=1}),Object.defineProperty(r,"nodeList",{get:()=>c(e,t)}),Object.defineProperty(r,"arr",{get:()=>{const r=i(e,t,!0);return void 0===r?[]:void 0===r.length?[r]:Array.from(r)}}),Object.defineProperty(r,"inline",{set:r=>d(r,e,t),get:()=>r}),Object.defineProperty(r,"inlineCss",{set:r=>d(r,e,t),get:()=>r}),r}},173:(e,t,r)=>{r.d(t,{A:()=>T});var s=r(445),n=r(225),o=r(907),i=r(961),a=r(64),c=r(300),d=r(584),l=r(992),E=r(54),p=r(589),h=r(518),N=r(707),u=r(968),_=r(531),m=r(131);class T{constructor(e={}){this.vsnum=Math.random(),this.addMixins(),this._postRenderCalled=!1,this.defaults=()=>{const t=this.createId(),r=e.id?e.id:t;return{vsid:t,id:r,tagName:"div",el:void 0,data:void 0,animateIn:!1,animateInTime:.5,animateOut:!1,animateOutTime:.5,sendLifecyleEvents:!1,hashId:`#${r}`,id$:`#${r}`,viewClass:c.q,extendedSourcesHashMethods:{},debug:!1,template:void 0,node:document.createDocumentFragment(),name:(0,a.OZ)(this)}},this._state={},this.$dirs=h.j.createDirectionalFiltersObject(),this.addDefaultDirection=h.j.addDefaultDir,this.addDownInternalDir=h.j.addDownInternalDir,this.props=(0,o.$)(this.defaults(),e),this.sendLifecycleMethod=!0===this.props.sendLifecyleEvents?this.sendLifecycleMethodActive.bind(this):this.sendLifecycleMethodInactive.bind(this);const t=this.attributesArray;this.props.domAttributes=(0,m.pick)(t,this.props),void 0!==this.props.traits&&this.addTraits(this.props.traits),this.loadAllMethods(),this.props.action="LOADED",this.sink$=new u.Subject,this.props.elIsAlreadyRenderedBool=this.elAlreadyExistsFn(this.props);const r=this.props.viewClass;this.view=new r(this.sink$,{el:this.props.el},this.props.vsid,this.props.id),this.sourceStreams=this.view.sourceStreams,this._rawSource$=this.view.getSourceStream(),this._rawSource$.viewName=this.props.name,this.sendEventsDownStream=this.sendEventsDownStreamFn,this.initViewStream(),this.isDevMode=T.isDevMode(),this.props.addedChannels=[],this.checkIfElementAlreadyExists()}get source$(){return this._source$}get attributesArray(){return["accesskey","class","contenteditable","dir","draggable","hidden","id","lang","spellcheck","style","tabindex","title","translate","aria-autocomplete","aria-checked","aria-disabled","aria-expanded","aria-haspopup","aria-hidden","aria-invalid","aria-label","aria-level","aria-multiline","aria-multiselectable","aria-orientation","aria-pressed","aria-readonly","aria-required","aria-selected","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","aria-atomic","aria-busy","aria-live","aria-relevant","aria-dropeffect","aria-grabbed","aria-activedescendant","aria-controls","aria-describedby","aria-flowto","aria-labelledby","aria-owns","aria-posinset","aria-setsize","accept","autocomplete","autofocus","checked","dirname","disabled","form","formaction","formenctype","formmethod","formnovalidate","formtarget","list","max","maxlength","min","minlength","multiple","name","pattern","placeholder","readonly","required","size","step","value","alt","srcset","sizes","usemap","ismap","href","target","download","ping","rel","hreflang","as","media","accept-charset","action","enctype","novalidate","content","charset","http-equiv","async","defer","integrity","nomodule","nonce","referrerpolicy","autocapitalize","autoplay","buffered","challenge","cite","code","codebase","color","cols","colspan","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","for","headers","high","icon","importance","itemprop","keytype","kind","label","language","lazyload","loop","low","manifest","method","muted","open","optimum","poster","preload","radiogroup","reversed","role","rows","rowspan","sandbox","scope","scoped","selected","shape","slot","span","srcdoc","src","type","srclang","start","summary","wrap","width","height"]}static isDevMode(){return n.M.debug}static checkIfActionsAreRegistered(e=[],t){if(t.length>0){const r=t=>{const r=new RegExp(t);if((0,m.findIndex)((0,m.test)(r),s)<0){const r=1===e.length?"from added channel":"from added channels";console.warn(`Spyne Warning: The action, ${t}, in ${this.props.name}, does not match any of the registered actions ${r}, ${e.join(", ")}`)}},s=(e=>{const t=e.map((e=>n.M.getChannelActions(e)));return(0,m.flatten)(t)})(e);t.forEach(r)}}static isValidNestedArr(e){const t=(0,m.equals)(!0),r=(0,m.all)(t),s=(0,m.is)(String),n=(0,m.compose)(r,(0,m.map)(s),(0,m.slice)(0,2),(0,m.defaultTo)([]));return(0,m.compose)(r,(0,m.map)(n),(0,m.defaultTo)([]))(e)}static elIsDomElement(e){return(0,m.is)(String,e)&&(e=document.querySelector(e)),(0,m.compose)((0,m.lte)(0),(0,m.defaultTo)(-1),(0,m.prop)("nodeType"))(e)}updatePropsToMatchEl(){const e=(0,m.compose)(m.toLower,(0,m.either)((0,m.prop)("tagName"),(0,m.always)("")));this.props.tagName=e(this.props.el)}elAlreadyExistsFn(e){const t=(0,m.compose)((0,m.lte)(0),(0,m.defaultTo)(-1),(0,m.prop)("nodeType"));return(0,m.propSatisfies)((0,m.allPass)([e=>document.body.contains(e),t]),"el")(e)}checkIfElementAlreadyExists(){!0===this.props.elIsAlreadyRenderedBool?(this.updatePropsToMatchEl(),this.postRender()):null===this.props.el&&console.error(`Spyne Error: The defined element for this ViewStream instance, ${this.constructor.name}, appears to not exist.`)}loadAllMethods(){const e=(0,m.curry)(this.onChannelMethodCall.bind(this));this.addActionListeners().forEach((t=>{let[r,s,n]=t;(0,m.is)(String,n)&&(n=new p.C({selector:n})),this.props.extendedSourcesHashMethods[r]=e(s,n)})),this.props.hashSourceMethods=this.setSourceHashMethods(this.props.extendedSourcesHashMethods)}addActionListeners(){return[]}onChannelMethodCall(e,t,r){if(void 0!==r.$dir&&r.$dir.includes("child")&&!0!==this.deleted){const e=(0,o.$)({},r);e.$dir=this.$dirs.C,this.sourceStreams.raw$.next(e)}!0===(0,m.defaultTo)((0,m.always)(!0),t)(r)&&(t=>{void 0===this[e]?console.warn(`Spyne Warning: The method, ${e} does not appear to exist in ${this.constructor.name}!`):this[e](t)})(r=(0,m.omit)(["$dir"],r))}setSourceHashMethods(e={}){const t={EXTIRPATING:e=>this.checkParentDispose(e),EXTIRPATE:e=>this.disposeViewStream(e),VS_SPAWNED:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_DOM:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_PARENT:e=>this.onVSRendered(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyToGC(e),VS_NULLITY:()=>({})};return o.$.all([{},t,e])}initViewStream(){this._source$=this._rawSource$.pipe((0,_.map)((e=>this.onMapViewSource(e))),(0,_.takeWhile)(this.notGCSTATE)),this.initAutoMergeSourceStreams(),this.updateSourceSubscription(this._source$,!0)}notGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}eqGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}notCOMPLETED(e){return!e.action.includes("COMPLETED")}notGCCOMPLETE(e){return!e.action.includes("GC_COMPLETE")}testVal(e){console.log("TESTING VALL IS ",e)}addParentStream(e,t){this.parent$=e.pipe((0,_.filter)((e=>void 0!==e&&void 0!==e.action)),(0,_.map)((e=>{const t=(0,o.$)({},e);return"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT"===t.action&&(this.disposeViewStream(t),t.action="READY_FOR_VS_DETRITUS_COLLECT"),t}))),this.updateSourceSubscription(this.parent$,!1,"PARENT"),this.renderAndAttachToParent(t)}addChildStream(e){const t=e.pipe((0,_.filter)((e=>void 0!==e&&void 0!==e.action)),(0,_.tap)((e=>this.tracer("addChildStraem do ",e))),(0,_.map)((e=>e)),(0,_.finalize)((e=>this.onChildCompleted(t.source))));this.updateSourceSubscription(t,!0,"CHILD")}onChildDisposed(e){}onChildCompleted(e){const t=(e=>{const t=e=>{for(;void 0!==e.destination;)e=t(e.destination);return e};return(0,m.pick)(["id","vsid"],t(e))})(e);return this.tracer("onChildCompleted ",this.vsnum,e),this.onChildDisposed(t,e),t}initAutoMergeSourceStreams(){const e={next:this.onSubscribeToSourcesNext.bind(this),error:this.onSubscribeToSourcesError.bind(this),complete:this.onSubscribeToSourcesComplete.bind(this)},t=()=>{this.props.el$=void 0,this.uberSource$.complete(),this.autoSubscriber$.complete(),this.sink$.complete(),this.props=void 0,this.deleted=!0,this.tracer("completeAll",this.deleted,this.props)},r=()=>{s-=1,0===s&&t()};let s=0;this.uberSource$=new u.Subject,this.autoMergeSubject$=this.uberSource$.pipe((0,_.mergeMap)((e=>{const t=e.observable.pipe((0,_.filter)((e=>void 0!==e&&void 0!==e.action)),(0,_.map)((e=>{const t=(0,o.$)({},e);return t.action=e.action,this.tracer("autoMergeSubject$",t),t})));return!1===e.autoClosesBool?t:(s+=1,t.pipe((0,_.finalize)(r)))}))),this.autoSubscriber$=this.autoMergeSubject$.pipe((0,_.filter)((e=>void 0!==e&&void 0!==e.action))).subscribe(e)}updateSourceSubscription(e,t=!1,r){const s={observable:e,autoClosesBool:t,rel:r};this.tracer("updateSourceSubscription ",this.vsnum,s),this.uberSource$.next(s)}onSubscribeToSourcesNext(e={}){const t=(0,m.defaultTo)((e=>this.sendExtendedStreams(e))),r=(0,a.FZ)(this.props.hashSourceMethods,e.action);t(this.props.hashSourceMethods[r])(e),this.tracer("onSubscribeToSourcesNext",{payload:e})}onSubscribeToSourcesError(e=""){console.log("ALL ERROR ",this.constructor.name,e)}onSubscribeToSourcesComplete(){this.tracer("onSubscribeToSourcesComplete","VS_DETRITUS_COLLECT"),this.openSpigot("VS_DETRITUS_COLLECT")}sendExtendedStreams(e){this.tracer("sendExtendedStreams",e),this.openSpigot(e.action,e)}renderAndAttachToParent(e){this.openSpigot("VS_SPAWN_AND_ATTACH_TO_PARENT",e)}renderView(){this.openSpigot("VS_SPAWN")}renderViewAndAttachToDom(e,t,r){const s={node:e,type:t,attachType:r};this.openSpigot("VS_SPAWN_AND_ATTACH_TO_DOM",{attachData:s})}checkParentDispose(e){"parent"===e.from$&&this.disposeViewStream(e)}onBeforeDispose(){}setTimeout(e,t=0,r=!1){window.setTimeout(((...t)=>{if(void 0!==this&&void 0!==this.props){const s=!0===r?e.bind(this):e;(0,m.apply)(s,t)}}),t)}disposeViewStream(e){this.onBeforeDispose(),this.openSpigot("EXTIRPATE")}onChildDispose(e){}onParentDisposing(e){this.openSpigot("EXTIRPATE")}onReadyToGC(e){const t=void 0!==e.from$&&"internal"===e.from$;this.tracer("onReadyToGC",t,e)}openSpigot(e,t={}){if(void 0!==this.props){this.props.action=e;const r=(0,m.mergeRight)(this.props,t);this.sink$.next(Object.freeze(r))}}setAttachData(e,t){return{node:this.props.el,type:"ViewStreamObservable",attachType:e,query:(()=>{const e=this.props.el.querySelector(t);return!0===T.isDevMode()&&(0,m.is)(String,t)&&(0,m.isNil)(e)&&console.warn(`Spyne Warning: The appendView query in ${this.props.name}, '${t}', appears to not exist!`),e})()}}getParentEls(e,t){const r=e=>e.parentElement;let s=0,n=e;for(;s<t;)n=r(n),s++;return n}setAttachParentData(e,t,r){t=""!==t?t:void 0;const s=this.getParentEls(this.props.el,r);return{node:s,type:"ViewStreamObservable",attachType:e,query:s.querySelector(t)}}onMapViewSource(e={}){return this.props=(0,m.mergeRight)(this.props,e),e}exchangeViewsWithChild(e,t){this.addChildStream(e.sourceStreams.toParent$),e.addParentStream(this.sourceStreams.toChild$,t)}appendToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","appendChild")}appendToDomAfter(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDomAfter. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","after")}prependToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be prependedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","prependChild")}appendView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("appendChild",t))}appendViewAfter(e,t){this.exchangeViewsWithChild(e,this.setAttachData("after",t))}appendViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("appendChild",t,r))}prependViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("prependChild",t,r))}prependView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("prependChild",t))}appendToNull(){const e=document.getElementById("spyne-null-views");this.renderViewAndAttachToDom(e,"dom","appendChild")}onVSRendered(e){"internal"===e.from$&&this.postRender()}postRender(){if(!0!==this._postRenderedCalled){if(this.beforeAfterRender(),this.afterRender(),this.onRendered(),requestAnimationFrame((()=>this.onAnimFrameAfterRendered())),!0===this.isDevMode){const e=this.broadcastEvents();!1===T.isValidNestedArr(e)&&console.warn(`Spyne Warning: The array returned from broadcastEvents in ${this.props.name}, '${JSON.stringify(e)}', does not appear to be properly formatted!`)}this.initializeChannels(),this.viewsStreamBroadcaster=new l.e(this.props,this.broadcastEvents.bind(this)),this.afterBroadcastEvents(),this._postRenderedCalled=!0}}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>{new e(this)}))}afterBroadcastEvents(){if(!0===this.isDevMode){const e=e=>e[0],t=this.addActionListeners(),r=t.map(e);if(!1===T.isValidNestedArr(t))console.warn(`Spyne Warning: The array returned from addActionsListeners in ${this.props.name}, '${JSON.stringify(t)}', does not appear to be properly formatted!`);else{const e=e=>{const t=(0,m.defaultTo)("",e[1]);!1===(0,m.is)(Function,this[t])&&console.warn(`Spyne Warning: The method in addActionListeners nested Array, '${JSON.stringify(e)}', in ${this.props.name}, does not appear to exist!`)};(0,m.compose)((0,m.forEach)(e),(0,m.defaultTo)([]))(t)}const s=()=>{void 0!==(0,m.path)(["props","addedChannels"],this)&&T.checkIfActionsAreRegistered.bind(this)(this.props.addedChannels,r)};this.setTimeout(s,500)}}setDataVSID(){this.props.el.dataset.vsid=this.props.vsid}beforeAfterRender(){this.setDataVSID(),this.props.el$=(0,N.T)(this.props.el)}downStream(){}onRendered(){}onAnimFrameAfterRendered(){}afterRender(){}broadcastEvents(){return[]}getChannel(e){return(0,m.ifElse)((e=>(0,d.ns)().includes(e)),(e=>n.M.channelsMap.getStream(e).observer.pipe((0,_.takeWhile)((e=>!0!==this.deleted)))),(e=>console.warn(`channel name ${e} is not within ${d.ns}`)))(e)}initializeChannels(){Array.isArray(this?.props?.channels)?this?.props?.channels?.forEach((e=>{const[t,r=!1]=Array.isArray(e)?e:[e];this?.addChannel(t,r)})):Array.isArray(this?.props?.channel)&&console.warn("props.channel is not a ViewStream property. Do you mean props.channels?")}addChannel(e,t=!1,r=!1,s=!1){const n=!0===r?this.$dirs.CI:this.$dirs.I;if(!0===this?.props?.addedChannels?.includes(e))return;const o=(0,m.path)(["srcElement","isLocalEvent"]),i=(0,m.path)(["srcElement","vsid"]),a=[(0,_.map)((e=>{const t=e;return t.$dir=n,t})),(0,_.filter)((e=>{const t=i(e);return!0!==o(e)||t===this.props.vsid}))];!0===t&&a.unshift((0,_.skip)(1));const c=this.getChannel(e).pipe(...a);this.updateSourceSubscription(c,!1),this.props.addedChannels.push(e)}checkIfChannelExists(e){const t=n.M.channelsMap.testStream(e);return!0!==t&&console.warn(`SPYNE WARNING: The ChannelPayload from ${this.props.name}, has been sent to a channel, ${e}, that has not been registered!`),t}sendInfoToChannel(e,t={},r){const s=t,n=(0,m.defaultTo)("VIEWSTREAM_EVENT"),o=(0,m.compose)(n,(0,m.prop)(e)),a={payload:s,action:r=r||o({CHANNEL_ROUTE:"CHANNEL_ROUTE_CHANGE_EVENT"})};try{if(a.srcElement=(0,m.compose)((0,m.pick)(["id","vsid","class","tagName"]),(0,m.prop)("props"))(this),!0===this.checkIfChannelExists(e)){!1===/CHANNEL_LIFECYCLE/.test(r)&&Object.defineProperties(a,{payload:{get:()=>(0,i.l)(t)}});const s=(0,u.of)(a);return new E.u(e,s,a)}}catch(e){console.warn("SPYNE WARNING ",e)}}tracer(...e){this.sendLifecycleMethod(...e)}sendLifecycleMethodInactive(){}sendLifecycleMethodActive(e,t){const r="VS_DETRITUS_COLLECT"===t;!0===(0,m.where)({from$:(0,m.equals)("internal"),action:(0,m.equals)("VS_SPAWNED_AND_ATTACHED_TO_PARENT")},t)?this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_RENDERED_EVENT"},"CHANNEL_LIFECYCLE_RENDERED_EVENT"):!0===r&&this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_DISPOSED_EVENT"},"CHANNEL_LIFECYCLE_DISPOSED_EVENT")}createActionFilter(e,t){return new p.C(e,t)}isLocalEvent(e){const t=(0,m.path)(["srcElement","el"],e),r=(0,m.path)(["props","el"],this);return T.elIsDomElement(r)&&T.elIsDomElement(t)&&r.contains(t)}addMixins(){const e=(0,s.z)();this.createId=e.createId}}},636:e=>{e.exports=r},131:e=>{e.exports=t},968:t=>{t.exports=e},531:e=>{e.exports=s}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}};return n[e](r,r.exports,i),r.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};i.r(a),i.d(a,{Channel:()=>m.c,ChannelFetch:()=>T.e,ChannelFetchUtil:()=>A.G,ChannelPayload:()=>C.m,ChannelPayloadFilter:()=>g.C,ChannelsMap:()=>c.H,DomElement:()=>d.r,DomElementTemplate:()=>l.X,SpyneApp:()=>f.D,SpyneAppProperties:()=>L.M,SpynePlugin:()=>I.V,SpyneTrait:()=>u.g,ViewStream:()=>h.A,ViewStreamBroadcaster:()=>N.e,ViewStreamElement:()=>E.q,ViewStreamPayload:()=>_.u,ViewStreamSelector:()=>p.T,deepMerge:()=>S.$,safeClone:()=>y.l});var c=i(470),d=i(192),l=i(291),E=i(300),p=i(707),h=i(173),N=i(992),u=i(732),_=i(54),m=i(2),T=i(126),A=i(9),C=i(980),g=i(589),I=i(930),S=i(907),y=i(961),L=i(225),f=i(713);return a})()));
|
|
3
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LDZCQUNBLDZCQUNBLDRCQUNBLDZCQUNBLHdCQUNBLGtDQUNBLDJCQUNBLHVCQUNBLDRCQUNBLHlCQUNBLHlDQUNBLHlCQUNBLHlCQUNBLDJCQUNBLDRCQUNBLDRCQUNBLG9DQUNBLG1DQUNBLG9DQUNBLHVDQUNBLHdDQUNBLGlDQUNBLDhCQUNBLGdDQUNBLHFDQUNBLDhCQUNBLGdDQUNBLHFDQUNBLDRDQUNBLDJDQUNBLHlCQUNBLHNDQUNBLDJCQUNBLDJCQUNBLDJCQUNBLHlCQUNBLGtDQUNBLHlDQUNBLHdCQUNBLDhCQUNBLGtDQUNBLDJCQUNBLDZCQUNBLHNDQUNBLHdCQUNBLHNDQUNBLDJCQUNBLGdDQUNBLDZCQUNBLDhCQUNBLDhCQUNBLDZCQUNBLDRCQUNBLDZCQUNBLDJCQUNBLHdCQUNBLHFDQUNBLDJCQUNBLHFDQUNBLDJCQUNBLDBCQUNBLHdCQUNBLHFDQUNBLDRCQUNBLDRCQUNBLHlCQUNBLHlCQUNBLHFDQUNBLHVDQUNBLHdCQUNBLDJCQUNBLGlDQUNBLCtCQUNBLGdDQUNBLGdDQUNBLHFDQUNBLG9DQUNBLCtCQUNBLDhCQUNBLCtCQUNBLDZCQUNBLDRCQUNBLDRCQUNBLHdCQUNBLDBDQUNBLDhCQUNBLG9DQUNBLG9DQUNBLCtCQUNBLGdDQUNBLCtCQUNBLHlCQUNBLDBCQUNBLDRDQUNBLDBCQUNBLDBCQUNBLDBCQUNBLDBCQUNBLDBCQUNBLDJCQUNBLDBCQUNBLCtDQUNBLDZCQUNBLG1DQUNBLCtCQUNBLHlDQUNBLHdDQUNBLHdDQUNBLDhCQUNBLDRCQUNBLDhCQUNBLDZCQUNBLCtCQUNBLDJCQUNBLDhCQUNBLGdDQUNBLDJCQUNBLHlCQUNBLCtCQUNBLDJCQUNBLDBCQUNBLDJCQUNBLDJCQUNBLDJCQUNBLDhCQUNBLDBCQUNBLDhCQUNBLCtCQUNBLDRCQUNBLDZCQUNBLDhCQUNBLHlCQUNBLG9DQUNBLGlDQUNBLGlDQUNBLG1DQUNBLHNDQUNBLDBCQUNBLDBCQUNBLGlDQUNBLGlDQUNBLG9DQUNBLGlDQUNBLGdDQUNBLHFDQUNBLGlDQUNBLG9DQUNBLHVDQUNBLHVDQUNBLGtDQUNB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QSxFQUFhMTZDLFFBR3JCLElBQUlDLEVBQVNzNkMsRUFBeUJFLEdBQVksQ0FHakR6NkMsUUFBUyxDQUFDLEdBT1gsT0FIQTI2QyxFQUFvQkYsR0FBVXg2QyxFQUFRQSxFQUFPRCxRQUFTdzZDLEdBRy9DdjZDLEVBQU9ELE9BQ2YsQ0NyQkF3NkMsRUFBb0JJLEVBQUszNkMsSUFDeEIsSUFBSTQ2QyxFQUFTNTZDLEdBQVVBLEVBQU82NkMsV0FDN0IsSUFBTzc2QyxFQUFpQixRQUN4QixJQUFNLEVBRVAsT0FEQXU2QyxFQUFvQnh0QyxFQUFFNnRDLEVBQVEsQ0FBRXBmLEVBQUdvZixJQUM1QkEsQ0FBTSxFQ0xkTCxFQUFvQnh0QyxFQUFJLENBQUNoTixFQUFTKzZDLEtBQ2pDLElBQUksSUFBSTlwQyxLQUFPOHBDLEVBQ1hQLEVBQW9CM3pDLEVBQUVrMEMsRUFBWTlwQyxLQUFTdXBDLEVBQW9CM3pDLEVBQUU3RyxFQUFTaVIsSUFDNUVoTSxPQUFPb1EsZUFBZXJWLEVBQVNpUixFQUFLLENBQUVzRSxZQUFZLEVBQU14UCxJQUFLZzFDLEVBQVc5cEMsSUFFMUUsRUNORHVwQyxFQUFvQjN6QyxFQUFJLENBQUM0RSxFQUFLbEUsSUFBVXRDLE9BQU9DLFVBQVVDLGVBQWVDLEtBQUtxRyxFQUFLbEUsR0NDbEZpekMsRUFBb0IzekIsRUFBSzdtQixJQUNILG9CQUFYZzdDLFFBQTBCQSxPQUFPQyxhQUMxQ2gyQyxPQUFPb1EsZUFBZXJWLEVBQVNnN0MsT0FBT0MsWUFBYSxDQUFFM2xDLE1BQU8sV0FFN0RyUSxPQUFPb1EsZUFBZXJWLEVBQVMsYUFBYyxDQUFFc1YsT0FBTyxHQUFPLDBuQjlDSzlEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWwtZmV0Y2gtY2xhc3MuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1wYXlsb2FkLWNsYXNzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWwtcHJveHkuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVscy1jb25maWcuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbHMtbWFwLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtcm91dGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC11aS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLXdpbmRvdy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9zcHluZS1hcHAuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvc3B5bmUtcGx1Z2lucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9jaGFubmVsLWZldGNoLXV0aWwuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvY2hhbm5lbC1wYXlsb2FkLWZpbHRlci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9kZWVwLW1lcmdlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2ZycC10b29scy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9nYy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9taXhpbnMvYmFzZS1zdHJlYW1zLW1peGlucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9yb3V0ZS1jaGFubmVsLXVwZGF0ZXIuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc2FmZS1jbG9uZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zYW5pdGl6ZS1odG1sLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXBsdWdpbnMtbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS10cmFpdC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtd2luZG93LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3ZpZXdzdHJlYW0tYW5pbWF0aW9ucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy92aWV3c3RyZWFtLW9ic2VydmFibGVzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL2RvbS1lbGVtZW50LXRlbXBsYXRlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL2RvbS1lbGVtZW50LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLWJyb2FkY2FzdGVyLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tcGF5bG9hZC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1zZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS5qcyIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcImRvbXB1cmlmeVwiLFwiY29tbW9uanMyXCI6XCJkb21wdXJpZnlcIixcImFtZFwiOlwiZG9tcHVyaWZ5XCIsXCJyb290XCI6XCJET01QdXJpZnlcIn0iLCJ3ZWJwYWNrOi8vc3B5bmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6XCJyYW1kYVwiLFwiY29tbW9uanMyXCI6XCJyYW1kYVwiLFwiYW1kXCI6XCJyYW1kYVwiLFwicm9vdFwiOlwiUlwifSIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcInJ4anNcIixcImNvbW1vbmpzMlwiOlwicnhqc1wiLFwiYW1kXCI6XCJyeGpzXCIsXCJyb290XCI6XCJyeGpzXCJ9Iiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOltcInJ4anNcIixcIm9wZXJhdG9yc1wiXSxcImNvbW1vbmpzMlwiOltcInJ4anNcIixcIm9wZXJhdG9yc1wiXSxcImFtZFwiOlwicnhqcy9vcGVyYXRvcnNcIixcInJvb3RcIjpbXCJyeGpzXCIsXCJvcGVyYXRvcnNcIl19Iiwid2VicGFjazovL3NweW5lL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwicnhqc1wiKSwgcmVxdWlyZShcInJhbWRhXCIpLCByZXF1aXJlKFwiZG9tcHVyaWZ5XCIpLCByZXF1aXJlKFwicnhqc1wiKVtcIm9wZXJhdG9yc1wiXSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcInNweW5lXCIsIFtcInJ4anNcIiwgXCJyYW1kYVwiLCBcImRvbXB1cmlmeVwiLCBcInJ4anMvb3BlcmF0b3JzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInNweW5lXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicnhqc1wiKSwgcmVxdWlyZShcInJhbWRhXCIpLCByZXF1aXJlKFwiZG9tcHVyaWZ5XCIpLCByZXF1aXJlKFwicnhqc1wiKVtcIm9wZXJhdG9yc1wiXSk7XG5cdGVsc2Vcblx0XHRyb290W1wic3B5bmVcIl0gPSBmYWN0b3J5KHJvb3RbXCJyeGpzXCJdLCByb290W1wiUlwiXSwgcm9vdFtcIkRPTVB1cmlmeVwiXSwgcm9vdFtcInJ4anNcIl1bXCJvcGVyYXRvcnNcIl0pO1xufSkoc2VsZiwgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xMzFfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNjM2X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUzMV9fKSA9PiB7XG5yZXR1cm4gIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IENoYW5uZWxGZXRjaFV0aWwgfSBmcm9tICcuLi91dGlscy9jaGFubmVsLWZldGNoLXV0aWwuanMnXG5pbXBvcnQgeyBwYXRoLCBwaWNrLCBtZXJnZURlZXBSaWdodCwgYWxsLCBhbGxQYXNzLCBlaXRoZXIsIHZhbHVlcywgZGVmYXVsdFRvLCByZWplY3QsIGNvbXBvc2UsIGlzTmlsIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsRmV0Y2ggZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbEZldGNoXG4gICAqIEB0eXBlIGV4dGVuZGFibGVcbiAgICogQGRlc2NcbiAgICogPHA+Q2hhbm5lbEZldGNoIGV4dGVuZHMgQ2hhbm5lbCBhbmQgaXMgZGVzaWduZWQgdG8gY3JlYXRlIGEgQ2hhbm5lbCBmcm9tIGZldGNoZWQgaHR0cCBkYXRhLjwvcD5cbiAgICogPHA+QSBDaGFubmVsRmV0Y2ggaW5zdGFuY2UgY2FuIGJlIGNyZWF0ZWQgd2l0aCBqdXN0IHRoZSBjaGFubmVsIG5hbWUgYW5kIHVybCBwcm9wZXJ0aWVzLjwvcD5cbiAgICogPHA+VGhlIGRhdGEgaXMgZmV0Y2hlZCBvbmNlLCBidXQgdGhlIENoYW5uZWxGZXRjaCdzIGRhdGEgaXMgYWx3YXlzIGF2YWlsYWJsZSB0byBvdGhlciBDaGFubmVsIGFuZCBWaWV3U3RyZWFtIGluc3RhbmNlczwvcD5cbiAgICpcbiAgICogPGgzPlRoZSBDaGFubmVsRmV0Y2ggQ2xhc3M8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5FeHRlbmRzIENoYW5uZWwgYW5kIHVzZXMgdGhlIENoYW5uZWxGZXRjaFV0aWwgdG8gbWFrZSBhbnkgdHlwZSBvZiBodHRwKHMpIHJlcXVlc3QuPC9saT5cbiAgICogPGxpPlJlcXVpcmVzIGEgdXJsIHByb3BlcnR5IGF0IGluc3RhbnRpYXRpb24uPC9saT5cbiAgICogPGxpPlRoZSByZXNwb25zZSBkYXRhIGlzIHB1Ymxpc2hlZCBhcyBhIENoYW5uZWxQYXlsb2FkLjwvbGk+XG4gICAqIDxsaT5UaGUgYWN0aW9uIGZvciB0aGUgcmV0dXJuZWQgQ2hhbm5lbEZldGNoIGRhdGEgaXMgYWx3YXlzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0LCBcIkNIQU5ORUxfTkFNRV9SRVNQT05TRV9FVkVOVFwiPC9saT5cbiAgICogPGxpPlRoZSBkZWZhdWx0IHJlcXVlc3QgdHlwZSBpcyBhIEdFVCByZXF1ZXN0IHRoYXQgcmV0dXJucyBhIEpTT04gb2JqZWN0LjwvbGk+XG4gICAqIDxsaT5Ib3dldmVyLCBhbnkgdHlwZSBvZiByZXF1ZXN0IGFuZCByZXR1cm4gdHlwZSBjYW4gYmUgY29uZmlndXJlZCBieSB1c2luZyB0aGUgYm9keSBwcm9wZXJ0eSB3aGVuIGNyZWF0aW5nIHRoZSBpbnN0YW5jZS48L2xpPlxuICAgKiA8bGk+VGhlIG1hcEZuIGdpdmVzIGFjY2VzcyB0byB0aGUgcmV0dXJuZWQgcmVzcG9uc2UgYW5kIGNhbiBiZSB1c2UgdG8gcGFyc2UgdGhlIGRhdGEgYmVmb3JlIGl0IGlzIHB1Ymxpc2hlZCB0byBvdGhlciBDaGFubmVscyBhbmQgVmlld1N0cmVhbSBpbnN0YW5jZXMuPC9saT5cbiAgICogPGxpPkNoYW5uZWwgRmV0Y2ggd2lsbCBzZW5kIHRoZSBsYXN0IHJlc3BvbnNlIHRvIGZ1dHVyZSBzdWJzY3JpYmVycywgYW5kIHdpbGwgbm90IG1ha2UgZnVydGhlciBodHRwKHMpIHJlcXVlc3RzIHVubGVzcyBkaXJlY3RlZCB0byBkbyAgc28uPC9saT5cbiAgICogPGxpPkRhdGEgY2FuIGJlIEZldGNoZWQgYWdhaW4sIGJ5IHNlbmRpbmcgYSBcIkNIQU5ORUxfTkFNRV9VUERBVEVfUkVTUE9OU0VfRVZFTlRcIiBhY3Rpb24gZnJvbSBhIFZpZXdTdHJlYW0ncyBzZW5kSW5mb1RvQ2hhbm5lbCBtZXRob2QuPC9saT5cbiAgICogPC91bD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSAtID0gdW5kZWZpbmVkOyBUaGUgcmVnaXN0ZXJlZCBuYW1lIGZvciB0aGUgY2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByb3BzLnVybCAtID0gdW5kZWZpbmVkOyBUaGUgdXJsIHRvIGJlIGZldGNoZWQuXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHByb3BzLm1hcEZuIC0gPSB1bmRlZmluZWQ7IFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmV0Y2hlZCByZXNwb25zZSBhbmQgYmVoYXZlcyBsaWtlIGFueSBtYXAgbWV0aG9kLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuYm9keSAtID0gdW5kZWZpbmVkOyBUaGlzIHdpbGwgdXBkYXRlIHRoZSBvcHRpb25zLCBpbmNsdWRpbmcgaGVhZGVyIG9wdGlvbnMsIHNlbnQgYWxvbmcgd2l0aCB0aGUgZmV0Y2ggcmVxdWVzdC4gRGVmYXVsdCBvcHRpb25zIHVzZXMgYSBHRVQgcmVxdWVzdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+QSBWaWV3U3RyZWFtIEluc3RhbmNlIFNlbmRpbmcgQSBGZXRjaCBVcGRhdGUgUmVxdWVzdDwvaDQ+XCJdXG4gICAqIGNvbnN0IGFjdGlvbiA9IFwiQ0hBTk5FTF9GRVRDSENIQU5ORUxfTkFNRV9VUERBVEVfUkVTUE9OU0VfRVZFTlRcIjtcbiAgICogY29uc3QgdXJsID0gXCIvL3NpdGUuY29tL2pzb24vXCI7XG4gICAqIGNvbnN0IGJvZHkgPSB7XG4gICAqICAgICBtZXRob2Q6IFwiUE9TVFwiXG4gICAqIH1cbiAgICpcbiAgICogdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbChcIkNIQU5ORUxfRkVUQ0hDSEFOTkVMX05BTUVcIiwge2FjdGlvbiwgdXJsLCBib2R5fSk7XG4gICAqXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUsIHByb3BzID0ge30pIHtcbiAgICAvLyBBTExPVyBGT1IgR0VORVJJQyBNQVAgUFJPUEVSVFlcblxuICAgIENoYW5uZWxGZXRjaC52YWxpZGF0ZU1hcE1ldGhvZChwcm9wcywgbmFtZSlcblxuICAgIGlmIChwcm9wcy5tYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMubWFwRm4gPSBwcm9wcy5tYXBcbiAgICB9XG4gICAgcHJvcHMuZXh0ZW5kZWRBY3Rpb25zQXJyID0gW1xuICAgICAgYCR7bmFtZX1fUkVTUE9OU0VfRVZFTlRgLFxuICAgICAgW2Ake25hbWV9X1JFUVVFU1RfRVZFTlRgLCAnb25GZXRjaFVwZGF0ZSddXG4gICAgXVxuICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gdHJ1ZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlTWFwTWV0aG9kKHByb3BzLCBuYW1lLCB0ZXN0TW9kZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgaXNOb3RFbXB0eSA9IGFyciA9PiBhcnIubGVuZ3RoID49IDFcbiAgICBjb25zdCBpc05vdEZ1bmN0aW9uID0gdmFsID0+IHR5cGVvZiAodmFsKSAhPT0gJ2Z1bmN0aW9uJ1xuICAgIGNvbnN0IGlzVW5kZWZpbmVkT3JXcm9uZ1R5cGUgPSBlaXRoZXIoaXNOaWwsIGlzTm90RnVuY3Rpb24pXG4gICAgY29uc3QgaXNVbmRlZmluZWQgPSBhbGwoaXNVbmRlZmluZWRPcldyb25nVHlwZSlcbiAgICBjb25zdCBpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHkgPSBhbGxQYXNzKFtpc1VuZGVmaW5lZCwgaXNOb3RFbXB0eV0pXG4gICAgY29uc3QgbWFwTWV0aG9kSXNJbnZhbGlkID0gY29tcG9zZShpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHksIHZhbHVlcywgcGljayhbJ21hcCcsICdtYXBGbiddKSkocHJvcHMpXG5cbiAgICBpZiAobWFwTWV0aG9kSXNJbnZhbGlkKSB7XG4gICAgICBpZiAodGVzdE1vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG1hcCBtZXRob2QgZm9yIENoYW5uZWxGZXRjaCwgJHtuYW1lfSwgYXBwZWFycyB0byBiZSBpbnZhbGlkYClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBvblJlZ2lzdGVyZWQocHJvcHMgPSB0aGlzLnByb3BzKSB7XG4gICAgaWYgKHByb3BzPy5wYXVzZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zdGFydEZldGNoKClcbiAgICB9XG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucyhuYW1lKSB7XG4gICAgY29uc3QgYXJyID0gW1xuICAgICAgJ0NIQU5ORUxfUkVTUE9OU0VfRVZFTlQnLFxuICAgICAgWydDSEFOTkVMX1VQREFURV9SRVNQT05TRV9FVkVOVCcsICdvbkZldGNoVXBkYXRlJ10sXG4gICAgICBbJ0NIQU5ORUxfRkVUQ0hfUkVRVUVTVF9FVkVOVCcsICdvbkZldGNoVXBkYXRlJ11cbiAgICBdXG5cbiAgICBjb25zdCBleHRlbmRlZEFyciA9IGNvbXBvc2UoZGVmYXVsdFRvKFtdKSwgcGF0aChbJ3Byb3BzJywgJ2V4dGVuZGVkQWN0aW9uc0FyciddKSlcbiAgICByZXR1cm4gYXJyLmNvbmNhdChleHRlbmRlZEFycih0aGlzKSlcbiAgfVxuXG4gIHN0YXJ0RmV0Y2gob3B0aW9ucyA9IHt9LCBzdWJzY3JpYmVyID0gdGhpcy5vbkZldGNoUmV0dXJuZWQuYmluZCh0aGlzKSkge1xuICAgIGNvbnN0IGZldGNoUHJvcHMgPSB0aGlzLmNvbnNvbGlkYXRlQWxsRmV0Y2hQcm9wcyhvcHRpb25zKVxuICAgIHJldHVybiBuZXcgQ2hhbm5lbEZldGNoVXRpbChmZXRjaFByb3BzLCBzdWJzY3JpYmVyLCBmYWxzZSwgdGhpcy5wcm9wcy5uYW1lKVxuICB9XG5cbiAgb25GZXRjaFVwZGF0ZShldnQpIHtcbiAgICBjb25zdCBwcm9wc09wdGlvbnMgPSB0aGlzLmdldFByb3BzRm9yRmV0Y2goZXZ0KVxuICAgIHRoaXMuc3RhcnRGZXRjaChwcm9wc09wdGlvbnMpXG4gIH1cblxuICBvbkZldGNoUmV0dXJuZWQoc3RyZWFtSXRlbSkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUNoYW5uZWxQYXlsb2FkSXRlbShzdHJlYW1JdGVtKVxuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbFBheWxvYWRJdGVtKHBheWxvYWQsIGFjdGlvbiA9IGAke3RoaXMucHJvcHMubmFtZX1fUkVTUE9OU0VfRVZFTlRgKSB7XG4gICAgY29uc3QgeyBuYW1lLCBzZW5kQ2FjaGVkUGF5bG9hZCwgdXJsIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IHsgbmFtZSwgc2VuZENhY2hlZFBheWxvYWQsIHVybCB9XG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50KVxuICB9XG5cbiAgZ2V0UHJvcHNGb3JGZXRjaChldnQpIHtcbiAgICBjb25zdCBkYXRhT2JqID0gcGF0aChbJ3ZpZXdTdHJlYW1JbmZvJywgJ3BheWxvYWQnXSwgZXZ0KVxuICAgIHJldHVybiBwaWNrKFsnbWFwRm4nLCAndXJsJywgJ2hlYWRlcicsICdib2R5JywgJ21vZGUnLCAnbWV0aG9kJywgJ3Jlc3BvbnNlVHlwZScsICdkZWJ1ZyddLCBkYXRhT2JqKVxuICB9XG5cbiAgY29uc29saWRhdGVBbGxGZXRjaFByb3BzKG9wdGlvbnMsIHByb3BzID0gdGhpcy5wcm9wcykge1xuICAgIGNvbnN0IHByb3BzT3B0aW9ucyA9IHBpY2soWydtYXBGbicsICd1cmwnLCAnaGVhZGVyJywgJ2JvZHknLCAnbW9kZScsICdtZXRob2QnLCAncmVzcG9uc2VUeXBlJywgJ2RlYnVnJ10sIHByb3BzKVxuICAgIGNvbnN0IG1lcmdlT3B0aW9ucyA9IChvMSwgbzIpID0+IG1lcmdlRGVlcFJpZ2h0KG8xLCBvMilcbiAgICBjb25zdCBmaWx0ZXJPdXRVbmRlZmluZWQgPSByZWplY3QoaXNOaWwpXG4gICAgcmV0dXJuIGNvbXBvc2UoZmlsdGVyT3V0VW5kZWZpbmVkLCBtZXJnZU9wdGlvbnMpKHByb3BzT3B0aW9ucywgb3B0aW9ucylcbiAgfVxuXG4gIGdldCBvYnNlcnZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlciRcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgbWVyZ2VBbGwsXG4gIGNsb25lLFxuICBmcm9tUGFpcnMsXG4gIHRvUGFpcnMsXG4gIGNvbXBvc2UsXG4gIGluY2x1ZGVzLFxuICBwaWNrQWxsLFxuICBsdGUsXG4gIGRlZmF1bHRUbyxcbiAgcHJvcCxcbiAgaXNcbn0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IHNhZmVDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3NhZmUtY2xvbmUuanMnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsUGF5bG9hZCB7XG4gIC8qKlxuICAgKlxuICAgKiBBbGwgQ2hhbm5lbCBkYXRhIGlzIHB1Ymxpc2hlZCB1c2luZyB0aGlzIGludGVyZmFjZS5cbiAgICogQG1vZHVsZSBDaGFubmVsUGF5bG9hZFxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBzcmNFbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjaGFubmVsTmFtZSAtID0gdW5kZWZpbmVkOyBUaGUgbmFtZSBvZiB0aGUgQ2hhbm5lbCB0aGF0IGlzIHNlbmRpbmcgdGhlIHBheWxvYWQuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhY3Rpb24gLSA9IHVuZGVmaW5lZDsgQW4gYWN0aW9uIHN0cmluZyB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aGluIHRoZSBDaGFubmVsJ3MgYWRkUmVnaXN0ZXJlZEFjdGlvbnMgbWV0aG9kLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcGF5bG9hZCAtID0gdW5kZWZpbmVkOyBUaGUgZGF0YSBvYmplY3QuXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IHNyY0VsZW1lbnQgLSA9IHt9OyBUaGlzIGlzIHBvcHVsYXRlZCB3aGVuIHRyaWdnZXJlZCBmcm9tIGEgVmlld1N0cmVhbSBpbnN0YW5jZS5cbiAgICogQHByb3BlcnR5IHtVSUV2ZW50fSBldmVudCAtID0gdW5kZWZpbmVkOyBUaGUgVUlFdmVudCwgaWYgYW55LlxuICAgKiBAcmV0dXJucyBWYWxpZGF0ZWQgQ2hhbm5lbFBheWxvYWQganNvbiBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWxOYW1lLCBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50LCB0aW1lTGFiZWwpIHtcbiAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbE5hbWVcbiAgICAvLyBwYXlsb2FkID0gQ2hhbm5lbFBheWxvYWQuZGVlcEZyZWV6ZShwYXlsb2FkKTtcblxuICAgIGlmICh0aW1lTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUudGltZSh0aW1lTGFiZWwpXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRJdGVtT2JqID0geyBjaGFubmVsTmFtZSwgYWN0aW9uLCBzcmNFbGVtZW50LCBldmVudCB9XG4gICAgLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNoYW5uZWxQYXlsb2FkSXRlbU9iaiwgJ3BheWxvYWQnLCB7Z2V0OiAoKSA9PiBjbG9uZShwYXlsb2FkKX0pO1xuICAgIGNvbnN0IGZyb3plblBheWxvYWQgPSBDaGFubmVsUGF5bG9hZC5kZWVwRnJlZXplKHBheWxvYWQpXG4gICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLnBheWxvYWQgPSBmcm96ZW5QYXlsb2FkXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGhlbHBzIHdpdGggZGVzdHJ1Y3R1cmluZyBieSBtZXJnaW5nIGFsbCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnNcbiAgICAgKiBKU09OIE9iamVjdFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVsnPGg0PkRlc3RydWN0dXJpbmcgUHJvcGVydGllcyB1c2luZyB0aGUgQ2hhbm5lbFBheWxvYWQgcHJvcHMgTWV0aG9kPC9oND4nXVxuICAgICAqIGxldCB7ZWwsIGFjdGlvbiwgbXlWYWx9ID0gcGF5bG9hZC5wcm9wcygpO1xuICAgICAqXG4gICAgICpcbiAgICAgKi9cblxuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWUpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGF5bG9hZCwgJ3BheWxvYWQnKSkge1xuICAgICAgICBjb25zdCBwYXlsb2FkU3RyID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgZm9sbG93aW5nIHBheWxvYWQgY29udGFpbnMgYSBuZXN0ZWQgcGF5bG9hZCBwcm9wZXJ0eSB3aGljaCBtYXkgY3JlYXRlIGNvbmZsaWN0czogQWN0aW9uOiAke2FjdGlvbn0sICR7cGF5bG9hZFN0cn1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGFubmVsQWN0aW9uc0FyciA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRDaGFubmVsQWN0aW9ucyhjaGFubmVsKVxuXG4gICAgICBDaGFubmVsUGF5bG9hZC52YWxpZGF0ZUFjdGlvbihhY3Rpb24sIGNoYW5uZWwsIGNoYW5uZWxBY3Rpb25zQXJyKVxuICAgIH1cblxuICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5jbG9uZSA9ICgpID0+IG1lcmdlQWxsKFtcbiAgICAgIHsgcGF5bG9hZDpzYWZlQ2xvbmUoY2hhbm5lbFBheWxvYWRJdGVtT2JqLnBheWxvYWQpIH0sXG4gICAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmoucGF5bG9hZCxcbiAgICAgIHsgY2hhbm5lbDogY2xvbmUoY2hhbm5lbCkgfSxcbiAgICAgIHsgZXZlbnQ6IGNsb25lKGV2ZW50KSB9LFxuICAgICAgeyBzcmNFbGVtZW50IH0sXG4gICAgICBjbG9uZShjaGFubmVsUGF5bG9hZEl0ZW1PYmouc3JjRWxlbWVudCksIHsgYWN0aW9uOiBjbG9uZShjaGFubmVsUGF5bG9hZEl0ZW1PYmouYWN0aW9uKSB9XG4gICAgXSlcblxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzID0ge1xuICAgICAgJGRpcjoge1xuICAgICAgICBnZXQ6ICgpID0+IGNoYW5uZWxQYXlsb2FkSXRlbU9iai5fZGlyLFxuICAgICAgICBzZXQ6ICh2YWwpID0+IHtcbiAgICAgICAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmouX2RpciA9IHZhbFxuICAgICAgICAgIHJldHVybiB2YWxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFubmVsID09PSAnQ0hBTk5FTF9ST1VURScpIHtcbiAgICAgIC8vIGNoYW5uZWxQYXlsb2FkSXRlbU9ialsnbG9jYXRpb24nXSA9IENoYW5uZWxQYXlsb2FkLmdldExvY2F0aW9uRGF0YSgpO1xuICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMubG9jYXRpb24gPSB7XG4gICAgICAgIGdldDogKCkgPT4gQ2hhbm5lbFBheWxvYWQuZ2V0TG9jYXRpb25EYXRhKClcbiAgICAgIH1cbiAgICAgIC8qIGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzWydyb3V0ZURhdGEnXSA9IHtcbiAgICAgICAgZ2V0OiAoKT0+cHJvcCgncm91dGVEYXRhJywgZnJvemVuUGF5bG9hZClcbiAgICAgIH1cbiovXG4gICAgfVxuXG4gICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLl9kaXIgPSB1bmRlZmluZWRcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNoYW5uZWxQYXlsb2FkSXRlbU9iaiwgY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMpXG5cbiAgICBpZiAodGltZUxhYmVsKSB7XG4gICAgICBjb25zb2xlLnRpbWVFbmQodGltZUxhYmVsKVxuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbFBheWxvYWRJdGVtT2JqXG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVBY3Rpb24oYWN0aW9uLCBjaGFubmVsLCBhcnIpIHtcbiAgICBjb25zdCBpc0luQXJyID0gaW5jbHVkZXMoYWN0aW9uLCBhcnIpXG4gICAgaWYgKGlzSW5BcnIgPT09IGZhbHNlICYmIFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGB3YXJuaW5nOiBBY3Rpb246ICcke2FjdGlvbn0nIGlzIG5vdCByZWdpc3RlcmVkIHdpdGhpbiB0aGUgJHtjaGFubmVsfSBjaGFubmVsIWApXG4gICAgfVxuICAgIHJldHVybiBpc0luQXJyXG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25EYXRhKCkge1xuICAgIGNvbnN0IGxvY2F0aW9uUGFyYW1zQXJyID0gW1xuICAgICAgJ2hyZWYnLFxuICAgICAgJ29yaWdpbicsXG4gICAgICAncHJvdG9jb2wnLFxuICAgICAgJ2hvc3QnLFxuICAgICAgJ2hvc3RuYW1lJyxcbiAgICAgICdwb3J0JyxcbiAgICAgICdwYXRobmFtZScsXG4gICAgICAnc2VhcmNoJyxcbiAgICAgICdoYXNoJ11cbiAgICByZXR1cm4gcGlja0FsbChsb2NhdGlvblBhcmFtc0Fyciwgd2luZG93LmxvY2F0aW9uKVxuICB9XG5cbiAgc3RhdGljIGdldFN0cmVhbUl0ZW0oKSB7XG5cbiAgfVxuXG4gIHN0YXRpYyBkZWVwQ2xvbmUobykge1xuICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXkpXG4gICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QpXG4gICAgY29uc3QgaXNJdGVyID0gb2IgPT4gaXNBcnIob2IpID09PSBmYWxzZSAmJiBpc09iaihvYikgPT09IHRydWVcbiAgICBjb25zdCBpc0l0ZXJhYmxlID0gaXNJdGVyKG8pXG4gICAgcmV0dXJuIGlzSXRlcmFibGUgPyBjb21wb3NlKGZyb21QYWlycywgdG9QYWlycywgY2xvbmUpKG8pIDogY2xvbmUobylcbiAgfVxuXG4gIHN0YXRpYyBkZWVwRnJlZXplKG8pIHtcbiAgICAvLyByZXR1cm4gbztcbiAgICAvLyByZXR1cm4gT2JqZWN0LmZyZWV6ZShvKTtcbiAgICBjb25zdCBlbElzRG9tRWxlbWVudCA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuXG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5mcmVlemUobylcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHByb3ApICYmXG4gICAgICAgICAgICBlbElzRG9tRWxlbWVudChvW3Byb3BdKSA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgIG9bcHJvcF0gIT09IG51bGwgJiZcbiAgICAgICAgICAgICh0eXBlb2Ygb1twcm9wXSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9bcHJvcF0gPT09ICdmdW5jdGlvbicpICYmXG4gICAgICAgICAgICAhT2JqZWN0LmlzRnJvemVuKG9bcHJvcF0pKSB7XG4gICAgICAgICAgQ2hhbm5lbFBheWxvYWQuZGVlcEZyZWV6ZShvW3Byb3BdKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiRlJFRVpFIEVSUiBcIix7byxlfSk7XG4gICAgICByZXR1cm4gb1xuICAgIH1cblxuICAgIHJldHVybiBvXG4gIH1cblxuICBzdGF0aWMgZ2V0TW91c2VFdmVudEtleXMoKSB7XG4gICAgcmV0dXJuIFsnYWx0S2V5JywgJ2J1YmJsZXMnLCAnY2FuY2VsQnViYmxlJywgJ2NhbmNlbGFibGUnLCAnY2xpZW50WCcsICdjbGllbnRZJywgJ2NvbXBvc2VkJywgJ2N0cmxLZXknLCAnY3VycmVudFRhcmdldCcsICdkZWZhdWx0UHJldmVudGVkJywgJ2RldGFpbCcsICdldmVudFBoYXNlJywgJ2Zyb21FbGVtZW50JywgJ2lzVHJ1c3RlZCcsICdsYXllclgnLCAnbGF5ZXJZJywgJ21ldGFLZXknLCAnbW92ZW1lbnRYJywgJ21vdmVtZW50WScsICdvZmZzZXRYJywgJ29mZnNldFknLCAncGFnZVgnLCAncGFnZVknLCAncGF0aCcsICdyZWxhdGVkVGFyZ2V0JywgJ3JldHVyblZhbHVlJywgJ3NjcmVlblgnLCAnc2NyZWVuWScsICdzaGlmdEtleScsICdzb3VyY2VDYXBhYmlsaXRpZXMnLCAnc3JjRWxlbWVudCcsICd0YXJnZXQnLCAndGltZVN0YW1wJywgJ3RvRWxlbWVudCcsICd0eXBlJywgJ3ZpZXcnLCAnd2hpY2gnLCAneCcsICd5J11cbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgU3ViamVjdCwgUmVwbGF5U3ViamVjdCwgbWVyZ2UgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgaW5jbHVkZXMgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IGRlbGF5Q2FsbCB9IGZyb20gJy4uL3V0aWxzL2ZycC10b29scy5qcydcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxQcm94eSBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsUHJveHlcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICAgKlxuICAgKiBAZGVzY1xuICAgKiBBIHByb3h5IGNoYW5uZWwgaXMgY3JlYXRlZCB3aGVuIGEgY2hhbm5lbCBpcyBzdWJzY3JpYmVkIHRvIGJlZm9yZSBpdCBpcyByZWdpc3RlcmVkLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZSwgcHJvcHMgPSB7fSkge1xuICAgIHByb3BzLmlzUHJveHkgPSB0cnVlXG4gICAgc3VwZXIobmFtZSwgcHJvcHMpXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gICAgdGhpcy5zdWJqZWN0JCA9IG5ldyBTdWJqZWN0KClcbiAgICB0aGlzLnJlcGxheVN1YiQgPSBuZXcgUmVwbGF5U3ViamVjdCgxKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gbWVyZ2UodGhpcy5zdWJqZWN0JCwgdGhpcy5yZXBsYXlTdWIkKVxuICAgIGNvbnN0IGlzRGV2TW9kZSA9IFNweW5lQXBwUHJvcGVydGllcy5kZWJ1Z1xuICAgIGlmIChpc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuY2hlY2tJZkNoYW5uZWxJc1N0aWxsUHJveHkobmFtZSlcbiAgICB9XG4gIH1cblxuICBnZXRNZXJnZWRTdWJqZWN0KHBlcmlzdERhdGEgPSBmYWxzZSkge1xuICAgIHJldHVybiBwZXJpc3REYXRhID09PSB0cnVlID8gdGhpcy5yZXBsYXlTdWIkIDogdGhpcy5zdWJqZWN0JFxuICB9XG5cbiAgY2hlY2tJZkNoYW5uZWxJc1N0aWxsUHJveHkoY2hhbm5lbE5hbWUpIHtcbiAgICBjb25zdCBuYW1lID0gY2hhbm5lbE5hbWVcblxuICAgIGNvbnN0IGNoZWNrSWZQcm94eSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGJvb2wgPSBpbmNsdWRlcyhuYW1lLCBTcHluZUFwcFByb3BlcnRpZXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscygpKVxuICAgICAgaWYgKGJvb2wgIT09IHRydWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgY2hhbm5lbCwgJHtuYW1lfSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgcmVnaXN0ZXJlZCFgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGRlbGF5Q2FsbChjaGVja0lmUHJveHksIDEwMDApXG4gIH1cblxuICBnZXQgcmVwbGF5U3ViamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsYXlTdWIkXG4gIH1cblxuICBnZXQgc3ViamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0JFxuICB9XG59XG4iLCJpbXBvcnQgeyByZWdpc3RlcmVkU3RyZWFtTmFtZXMgfSBmcm9tICcuL2NoYW5uZWxzLWNvbmZpZy5qcydcbmltcG9ydCB7IENoYW5uZWxQYXlsb2FkIH0gZnJvbSAnLi9jaGFubmVsLXBheWxvYWQtY2xhc3MuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFJvdXRlQ2hhbm5lbFVwZGF0ZXIgfSBmcm9tICcuLi91dGlscy9yb3V0ZS1jaGFubmVsLXVwZGF0ZXIuanMnXG5cbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YmplY3QsIGZvcmtKb2luLCBFTVBUWSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgdGFrZSwgY29tYmluZUxhdGVzdFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7XG4gIGlmRWxzZSxcbiAgaWRlbnRpdHksXG4gIGhlYWQsXG4gIG1lcmdlQWxsLFxuICBvYmpPZixcbiAgdmlldyxcbiAgaXMsXG4gIGNoYWluLFxuICBsZW5zSW5kZXgsXG4gIGFsd2F5cyxcbiAgZnJvbVBhaXJzLFxuICBwYXRoLFxuICBpc0VtcHR5LFxuICBlcXVhbHMsXG4gIHByb3AsXG4gIHByb3BFcVxuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGUgQ2hhbm5lbCBjb21wb25lbnQgd3JhcHMgbWV0aG9kcyBhbmQgZnVuY3Rpb25hbGl0eSBhcm91bmQgYW4gUnhKcyBTdWJqZWN0LCB0byBjcmVhdGUgYSBvbmUtd2F5IGRhdGEgZmxvdyBiZXR3ZWVuIGl0c2VsZiBhbmQgb3RoZXIgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW1zLjwvcD5cbiAgICogPHA+Q2hhbm5lbHMgZ2V0IGRhdGEgYnkgaW1wb3J0aW5nIGpzb24gb2JqZWN0cywgc3Vic2NyaWJpbmcgdG8gb3RoZXIgQ2hhbm5lbHMgYW5kIGJ5IHBhcnNpbmcgVmlld1N0cmVhbSBpbmZvLjwvcD5cbiAgICogPGgzPlRoZSBCYXNpYyBDaGFubmVsIFN0cnVjdHVyZTwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNoYW5uZWxzIHJlcXVpcmVzIGEgdW5pcXVlIG5hbWUsIGZvciBleGFtcGxlLCA8Yj5DSEFOTkVMX01ZQ0hBTk5FTDwvYj4sIHdoaWNoIGNvbXBvbmVudHMgdXNlIHRvIHNlbGVjdCBhbmQgc3Vic2NyaWJlIHRvIGFueSBjaGFubmVsLjwvbGk+XG4gICAqIDxsaT5DaGFubmVscyBhcmUgaW5zdGFudGlhdGVkIGFuZCAncmVnaXN0ZXJlZCcgd2l0aCB0aGUgTElOS1snU3B5bmVBcHAnLCAnc3B5bmUtYXBwJ10uPC9saT5cbiAgICogPGxpPkNoYW5uZWxzIHJlbWFpbiBwZXJzaXN0ZW50IGFuZCBhcmUgbm90IGRlbGV0ZWQuPC9saT5cbiAgICogPC91bD5cbiAgICogPGgzPkNvbXBvbmVudHMgdGhhdCBleHRlbmQgQ2hhbm5lbDwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPlRoZSBmb3VyIFNweW5lIENoYW5uZWxzLCBMSU5LWydTcHluZUNoYW5uZWxVSScsICdzcHluZS1jaGFubmVsLXUtaSddLCBMSU5LWydTcHluZUNoYW5uZWxXaW5kb3cnLCAnc3B5bmUtY2hhbm5lbC13aW5kb3cnXSwgTElOS1snU3B5bmVDaGFubmVsUm91dGUnLCAnc3B5bmUtY2hhbm5lbC1yb3V0ZSddIGFuZCBMSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgYWxsIGV4dGVuZCBDaGFubmVsLjwvbGk+XG4gICAqIDxsaT5DaGFubmVsRmV0Y2ggYWxzbyBleHRlbmRzIENoYW5uZWwsIGFkZHMgYSBDaGFubmVsRmV0Y2hVdGlsIGNvbXBvbmVudCB0byBpbW1lZGlhdGVseSBwdWJsaXNoIGZldGNoZWQgcmVzcG9uc2VzLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIDxoMz5TZW5kaW5nIENoYW5uZWxQYXlsb2FkczwvaDM+XG4gICAqICAgPHA+Q2hhbm5lbHMgc2VuZCBkYXRhIHVzaW5nIHRoZSA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cImNoYW5uZWwtc2VuZC1jaGFubmVsLXBheWxvYWRcIiAgaHJlZj1cIi9ndWlkZS9yZWZlcmVuY2UvY2hhbm5lbC1zZW5kLWNoYW5uZWwtcGF5bG9hZFwiID5zZW5kQ2hhbm5lbFBheWxvYWQ8L2E+XG4gICBtZXRob2QuPC9wPlxuICAgKlxuICAgKlxuICAgKiA8aDM+UmVjZWl2aW5nIERhdGEgZnJvbSBWaWV3U3RyZWFtIEluc3RhbmNlczwvaDM+XG4gICAqIDxwPlZpZXdTdHJlYW1zIGNhbiBzZW5kIGRhdGEgdG8gYW55IGN1c3RvbSBjaGFubmVsIHVzaW5nIHRoZSA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cInZpZXctc3RyZWFtLXNlbmQtaW50by10by1jaGFubmVsXCIgIGhyZWY9XCIvZ3VpZGUvcmVmZXJlbmNlL3ZpZXctc3RyZWFtLXNlbmQtaW5mby10by1jaGFubmVsXCIgPnNlbmRJbmZvVG9DaGFubmVsPC9hPlxuICAgbWV0aG9kLiBDaGFubmVscyBjYW0gbGlzdGVuIHRvIGFueSBWaWV3U3RyZWFtIGRhdGEgZGlyZWN0ZWQgdG8gaXRzZWxmIHRocm91Z2ggdGhlIGRlZmF1bHQgbWV0aG9kLCA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cImNoYW5uZWwtb24tdmlldy1zdHJlYW0taW5mb1wiICBocmVmPVwiL2d1aWRlL3JlZmVyZW5jZS9jaGFubmVsLW9uLXZpZXctc3RyZWFtLWluZm9cIiA+b25WaWV3U3RyZWFtSW5mbzwvYT4uIDwvcD5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+UmVnaXN0ZXJpbmcgYSBOZXcgQ2hhbm5lbCBJbnN0YW5jZTwvaDQ+XCJdXG4gICAqIFNweW5lQXBwLnJlZ2lzdGVyKG5ldyBDaGFubmVsKFwiQ0hBTk5FTF9NWUNIQU5ORUxcIik7XG4gICAqXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ0hBTk5FTF9OQU1FXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGlzIGpzb24gb2JqZWN0IHRha2VzIGluIHBhcmFtZXRlcnMgdG8gaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSB1bmRlZmluZWQ7IFRoaXMgd2lsbCBiZSB0aGUgcmVnaXN0ZXJlZCBuYW1lIGZvciB0aGlzIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcyAtID0ge307IFRoZSBwcm9wcyBvYmplY3RzIGFsbG93cyBmb3IgY3VzdG9tIHByb3BlcnRpZXMgZm9yIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgLSA9IGZhbHNlOyBQdWJsaXNoZXMgaXRzIG1vc3QgY3VycmVudCBwYXlsb2FkIHRvIGxhdGUgc3Vic2NyaWJlcnMsIHdoZW4gc2V0IHRvIHRydWUuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihDSEFOTkVMX05BTUUsIHByb3BzID0ge30pIHtcbiAgICB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zLmJpbmQodGhpcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKENIQU5ORUxfTkFNRSwgcHJvcHMuZXh0ZW5kZWRBY3Rpb25zQXJyKVxuXG4gICAgLy8gQmFzaWMgcHJvcHMgc2V0dXBcbiAgICBwcm9wcy5uYW1lID0gQ0hBTk5FTF9OQU1FXG4gICAgcHJvcHMuZGVmYXVsdEFjdGlvbnMgPSBwcm9wcy5kYXRhICE9PSB1bmRlZmluZWQgPyBbYCR7cHJvcHMubmFtZX1fRVZFTlRgXSA6IFtdXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG5cbiAgICB0aGlzLnByb3BzLmlzUmVnaXN0ZXJlZCA9IGZhbHNlXG4gICAgdGhpcy5wcm9wcy5pc1Byb3h5ID1cbiAgICAgIHRoaXMucHJvcHMuaXNQcm94eSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLnByb3BzLmlzUHJveHlcblxuICAgIC8vIERldGVybWluZSBhIGRlZmF1bHQgZnJvbSBwcmVzZW5jZSBvZiBwcm9wcy5kYXRhXG4gICAgY29uc3QgZGVmYXVsdENhY2hlZFBheWxvYWRCb29sID0gdGhpcy5wcm9wcy5kYXRhICE9PSB1bmRlZmluZWRcblxuICAgIC8vIElmIHByb3BzLnJlcGxheSBpcyBkZWZpbmVkLCBvdmVycmlkZSBzZW5kQ2FjaGVkUGF5bG9hZCB3aXRoIGl0LlxuICAgIC8vIE90aGVyd2lzZSwgdXNlIHRoZSBleGlzdGluZyBzZW5kQ2FjaGVkUGF5bG9hZCBwcm9wZXJ0eSBvciBkZWZhdWx0LlxuICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5yZXBsYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gdGhpcy5wcm9wcy5yZXBsYXlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9XG4gICAgICAgIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gZGVmYXVsdENhY2hlZFBheWxvYWRCb29sXG4gICAgICAgICAgOiB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsID0gbmV3IFJvdXRlQ2hhbm5lbFVwZGF0ZXIodGhpcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25NZXRob2RzKClcblxuICAgIC8vIFNldCB1cCBzdHJlYW1zXG4gICAgdGhpcy5zdHJlYW1zQ29udHJvbGxlciA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcFxuICAgIGNvbnN0IG9ic2VydmVyJCA9IHRoaXMuZ2V0TWFpbk9ic2VydmVyKClcbiAgICB0aGlzLmNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlID0gQ2hhbm5lbC5jaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5vYnNlcnZlciQgPSB0aGlzLnByb3BzLm9ic2VydmVyID0gb2JzZXJ2ZXIkXG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gRElTUEFUQ0hFUlxuICAgIGNvbnN0IGRpc3BhdGNoZXJTdHJlYW0kID0gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRTdHJlYW0oJ0RJU1BBVENIRVInKVxuICAgIGNvbnN0IHBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSA9IHByb3BFcShwcm9wcy5uYW1lLCAnbmFtZScpXG4gICAgZGlzcGF0Y2hlclN0cmVhbSRcbiAgICAgIC5waXBlKGZpbHRlcihwYXlsb2FkUHJlZEJ5Q2hhbm5lbE5hbWUpKVxuICAgICAgLnN1YnNjcmliZSgodmFsKSA9PiB0aGlzLm9uUmVjZWl2ZWRPYnNlcnZhYmxlKHZhbCkpXG4gIH1cblxuICBnZXRNYWluT2JzZXJ2ZXIoKSB7XG4gICAgaWYgKHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgZm9sbG93aW5nIGNoYW5uZWwsICR7dGhpcy5wcm9wcy5uYW1lfSwgYXBwZWFycyB0byBiZSByZWdpc3RlcmVkIGJlZm9yZSBTcHluZSBoYXMgYmVlbiBpbml0aWFsaXplZC5gKVxuICAgIH1cblxuICAgIGNvbnN0IHByb3h5RXhpc3RzID0gdGhpcy5zdHJlYW1zQ29udHJvbGxlci50ZXN0U3RyZWFtKHRoaXMucHJvcHMubmFtZSlcblxuICAgIGlmIChwcm94eUV4aXN0cyA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIuZ2V0UHJveHlTdWJqZWN0KHRoaXMucHJvcHMubmFtZSwgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPT09IHRydWUgPyBuZXcgUmVwbGF5U3ViamVjdCgxKSA6IG5ldyBTdWJqZWN0KClcbiAgICB9XG4gIH1cblxuICAvLyAgT1ZFUlJJREUgSU5JVElBTElaQVRJT04gTUVUSE9EXG4gIC8qKlxuICAgKiA8cD4oRGVwcmVjYXRlZC4gVXNlIG9uUmVnaXN0ZXJlZCkuIFRoaXMgbWV0aG9kIGlzIGVtcHR5IGFuZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgQ2hhbm5lbCBoYXMgYmVlbiByZWdpc3RlcmVkLjwvcD5cbiAgICogPHA+VGFza3Mgc3VjaCBhcyBzdWJzY3JpYmluZyB0byBvdGhlciBjaGFubmVscywgYW5kIHNlbmRpbmcgaW5pdGlhbCBwYXlsb2FkcyBjYW4gYmUgYWRkZWQgaGVyZS48L3A+XG4gICAqL1xuICBvbkNoYW5uZWxJbml0aWFsaXplZCgpIHtcblxuICB9XG5cbiAgLy8gIE9WRVJSSURFIElOSVRJQUxJWkFUSU9OIE1FVEhPRFxuICAvKipcbiAgICogPHA+VGhpcyBtZXRob2QgaXMgZW1wdHkgYW5kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBDaGFubmVsIGhhcyBiZWVuIHJlZ2lzdGVyZWQuPC9wPlxuICAgKiA8cD5UYXNrcyBzdWNoIGFzIHN1YnNjcmliaW5nIHRvIG90aGVyIGNoYW5uZWxzLCBhbmQgc2VuZGluZyBpbml0aWFsIHBheWxvYWRzIGNhbiBiZSBhZGRlZCBoZXJlLjwvcD5cbiAgICovXG4gIG9uUmVnaXN0ZXJlZChwcm9wcyA9IHRoaXMucHJvcHMpIHtcbiAgICBpZiAocHJvcHMuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBPYmplY3Qua2V5cyh0aGlzLmNoYW5uZWxBY3Rpb25zKVswXVxuICAgICAgLy8gY29uc29sZS5sb2coXCJDSEFOTkVMUyBBQ1RJT05TIElTIFwiLHRoaXMuY2hhbm5lbEFjdGlvbnMpO1xuICAgICAgLy8gT2JqZWN0KHRoaXMuY2hhbm5lbEFjdGlvbnMpLmtleXNbMF07XG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHByb3BzLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzUHJveHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaXNQcm94eVxuICB9XG5cbiAgZ2V0IGNoYW5uZWxOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLm5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKiByZXR1cm5zIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBmb3IgdGhlIGNoYW5uZWxcbiAgICovXG4gIGdldCBvYnNlcnZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlciRcbiAgfVxuXG4gIGNoZWNrRm9yVHJhaXRzKCkge1xuICAgIGNvbnN0IGFkZFRyYWl0cyA9ICh0cmFpdHMpID0+IHtcbiAgICAgIGlmICh0cmFpdHMuY29uc3RydWN0b3IubmFtZSAhPT0gJ0FycmF5Jykge1xuICAgICAgICB0cmFpdHMgPSBbdHJhaXRzXVxuICAgICAgfVxuICAgICAgY29uc3QgYWRkVHJhaXQgPSAoVHJhaXRDbGFzcykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFRyYWl0Q2xhc3ModGhpcylcbiAgICAgIH1cblxuICAgICAgdHJhaXRzLmZvckVhY2goYWRkVHJhaXQpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMudHJhaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFkZFRyYWl0cyh0aGlzLnByb3BzLnRyYWl0cylcbiAgICB9XG4gIH1cblxuICAvLyBETyBOT1QgT1ZFUlJJREUgVEhJUyBNRVRIT0RcbiAgaW5pdGlhbGl6ZVN0cmVhbSgpIHtcbiAgICB0aGlzLmNoZWNrRm9yVHJhaXRzKClcbiAgICB0aGlzLm9uQ2hhbm5lbEluaXRpYWxpemVkKClcbiAgICB0aGlzLmNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlKClcbiAgICB0aGlzLm9uUmVnaXN0ZXJlZCgpXG4gICAgdGhpcy5wcm9wcy5pc1JlZ2lzdGVyZWQgPSB0cnVlXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUocHJvcHMgPSB0aGlzLnByb3BzLCBhY3Rpb25zT2JqID0gdGhpcy5jaGFubmVsQWN0aW9ucykge1xuICAgIGNvbnN0IGFjdGlvbnNPYmpJc0VtcHR5ID0gaXNFbXB0eShhY3Rpb25zT2JqKVxuICAgIGNvbnN0IGRhdGFJc0FkZGVkID0gcHJvcCgnZGF0YScsIHByb3BzKSAhPT0gdW5kZWZpbmVkXG4gICAgY29uc3QgYXV0b1NldFRvQ2FjaGVkUGF5bG9hZCA9IGFjdGlvbnNPYmpJc0VtcHR5ID09PSB0cnVlICYmIGRhdGFJc0FkZGVkID09PSB0cnVlXG4gICAgY29uc3Qgc2V0RGVmYXVsdEFjdGlvbnNPYmogPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IG5hbWUgfSA9IHByb3BzXG4gICAgICBjb25zdCBhY3Rpb25TdHIgPSBgJHtuYW1lfV9FVkVOVGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFthY3Rpb25TdHJdIDogYWN0aW9uU3RyXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF1dG9TZXRUb0NhY2hlZFBheWxvYWQpIHtcbiAgICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gdHJ1ZVxuICAgICAgYWN0aW9uc09iaiA9IHNldERlZmF1bHRBY3Rpb25zT2JqKClcblxuICAgICAgaWYgKHRoaXMuY2hhbm5lbEFjdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNoYW5uZWxBY3Rpb25zID0gYWN0aW9uc09ialxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKFwiUFJPUFMgSVMgXCIse2FjdGlvbnNPYmpJc0VtcHR5LCBkYXRhSXNBZGRlZCwgcHJvcHMsIGFjdGlvbnNPYmp9LCB0aGlzLmNoYW5uZWxBY3Rpb25zKVxuICAgIHJldHVybiB7IHByb3BzLCBhY3Rpb25zT2JqIH1cbiAgfVxuXG4gIHNldFRyYWNlKGJvb2wpIHtcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKG5hbWUsIGV4dGVuZGVkQWN0aW9uc0FyciA9IFtdKSB7XG4gICAgY29uc3QgZ2V0QWN0aW9uVmFsID0gaWZFbHNlKGlzKFN0cmluZyksIGlkZW50aXR5LCBoZWFkKVxuICAgIGNvbnN0IG1haW5BcnIgPSBleHRlbmRlZEFjdGlvbnNBcnIuY29uY2F0KHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMobmFtZSkpXG4gICAgY29uc3QgYXJyID0gck1hcChnZXRBY3Rpb25WYWwsIG1haW5BcnIpXG4gICAgY29uc3QgY29udmVydGVyID0gc3RyID0+IG9iak9mKHN0ciwgc3RyKVxuICAgIGNvbnN0IG9iaiA9IG1lcmdlQWxsKGNoYWluKGNvbnZlcnRlciwgYXJyKSlcbiAgICB0aGlzLmNoYW5uZWxBY3Rpb25zID0gb2JqXG4gIH1cblxuICBjcmVhdGVDaGFubmVsQWN0aW9uTWV0aG9kcygpIHtcbiAgICBjb25zdCBkZWZhdWx0Rm4gPSAnb25WaWV3U3RyZWFtSW5mbydcbiAgICBjb25zdCBnZXRBY3Rpb25WYWwgPSBpZkVsc2UoaXMoU3RyaW5nKSwgaWRlbnRpdHksIGhlYWQpXG4gICAgY29uc3QgZGVsYXlDaGVja0lmVHJhaXRNZXRob2RIYXNCZWVuQWRkZWQgPSAobWV0aG9kU3RyLCB2YWwpID0+IHtcbiAgICAgIGNvbnN0IGRlbGF5ZXIgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpc1ttZXRob2RTdHJdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBcIiR7dGhpcy5wcm9wcy5uYW1lfVwiLCBSRVFVSVJFUyBUSEUgRk9MTE9XSU5HIE1FVEhPRCAke21ldGhvZFN0cn0gRk9SIEFDVElPTiwgJHt2YWxbMF19YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2luZG93LnNldFRpbWVvdXQoZGVsYXllciwgMTAwKVxuICAgIH1cblxuICAgIGNvbnN0IGdldEN1c3RvbU1ldGhvZCA9IHZhbCA9PiB7XG4gICAgICBjb25zdCBtZXRob2RTdHIgPSB2aWV3KGxlbnNJbmRleCgxKSwgdmFsKVxuICAgICAgZGVsYXlDaGVja0lmVHJhaXRNZXRob2RIYXNCZWVuQWRkZWQobWV0aG9kU3RyLCB2YWwpXG4gICAgICByZXR1cm4gbWV0aG9kU3RyXG4gICAgfVxuXG4gICAgY29uc3QgZ2V0QXJyTWV0aG9kID0gIGlmRWxzZShpcyhTdHJpbmcpLCBhbHdheXMoZGVmYXVsdEZuKSwgZ2V0Q3VzdG9tTWV0aG9kKVxuXG4gICAgY29uc3QgY3JlYXRlT2JqID0gdmFsID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGdldEFjdGlvblZhbCh2YWwpXG4gICAgICBjb25zdCBtZXRob2QgPSAgZ2V0QXJyTWV0aG9kKHZhbClcbiAgICAgIHJldHVybiBba2V5LCBtZXRob2RdXG4gICAgfVxuXG4gICAgdGhpcy5jaGFubmVsQWN0aW9uTWV0aG9kcyA9IGZyb21QYWlycyhyTWFwKGNyZWF0ZU9iaiwgdGhpcy5hZGRSZWdpc3RlcmVkQWN0aW9ucygpKSlcblxuICAgIC8vIGNvbnNvbGUubG9nKCd0aGUgY2hhbm5lbCBhY3Rpb24gbWV0aG9kcyAnLHRoaXMuY2hhbm5lbEFjdGlvbk1ldGhvZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPkNoYW5uZWxzIHNlbmQgYWxvbmcgQWN0aW9uIG5hbWVzIGFsb25nIHdpdGggaXRzIHBheWxvYWQuPC9wPlxuICAgKiA8cD5CZWZvcmUgYW55IGFjdGlvbiBjYW4gYmUgdXNlZCwgdGhhdCBhY3Rpb24gbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCB1c2luZyB0aGlzIG1ldGhvZC48L3A+XG4gICAqIDxwPlZpZXdTdHJlYW0gaW5zdGFuY2VzIGNhbiBmaWx0ZXIgQ2hhbm5lbFBheWxvYWRzIGJ5IGJpbmRpbmcgc3BlY2lmaWMgTElOS1snYWN0aW9ucyB0byBsb2NhbCBtZXRob2RzJywgJ3ZpZXctc3RyZWFtLWFkZC1hY3Rpb24tbGlzdGVuZXJzJ10uPC9wPlxuICAgKiA8cD5Gb3JjaW5nIHJlZ2lzdHJhdGlvbiBvZiBhY3Rpb25zIGFsbG93cyBTcHluZSB0byB2YWxpZGF0ZSBBY3Rpb25zLCBhbmQgaXMgYWxzbyBhIHVzZWZ1bCB3YXkgdG8ga2VlcCB0cmFjayBvZiBhbGwgQWN0aW9ucyB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkLjwvcD5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQXJyYXkgb2YgU3RyaW5nc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5SZWdpc3RlcmluZyBBY3Rpb25zIGluIHRoZSBhZGRSZWdpc3RlcmVkQWN0aW9ucyBtZXRob2Q8L2g0PlwiXVxuICAgKiAgICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICogICAgIHJldHVybiBbXG4gICAqICAgICAgICAnQ0hBTk5FTF9NWV9DSEFOTkVMX0VWRU5UJyxcbiAgICogICAgICAgICdDSEFOTkVMX01ZX0NIQU5ORUxfVVBEQVRFX0VWRU5UJ1xuICAgKiAgICAgICBdO1xuICAgKiAgICAgIH1cbiAgICpcbiAgICovXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIGxldCBhcnIgPSBbXVxuICAgIGlmIChwYXRoKFsncHJvcHMnLCAnZGF0YSddLCB0aGlzKSkge1xuICAgICAgYXJyID0gW2Ake3RoaXMucHJvcHMubmFtZX1fRVZFTlRgXVxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICBvblJlY2VpdmVkT2JzZXJ2YWJsZShvYmopIHtcbiAgICB0aGlzLm9uSW5jb21pbmdPYnNlcnZhYmxlKG9iailcbiAgfVxuXG4gIGdldEFjdGlvbk1ldGhvZEZvck9ic2VydmFibGUob2JqKSB7XG4gICAgb2JqLnVucGFja2VkID0gdHJ1ZVxuICAgIGNvbnN0IGRlZmF1bHRGbiA9IHRoaXMub25WaWV3U3RyZWFtSW5mby5iaW5kKHRoaXMpXG5cbiAgICBjb25zdCBtZXRob2RTdHIgPSBwYXRoKFsnZGF0YScsICdhY3Rpb24nXSwgb2JqKVxuICAgIGNvbnN0IG1ldGhvZFZhbCA9IHByb3AobWV0aG9kU3RyLCB0aGlzLmNoYW5uZWxBY3Rpb25NZXRob2RzKVxuXG4gICAgbGV0IGZuID0gZGVmYXVsdEZuXG5cbiAgICBpZiAobWV0aG9kVmFsICE9PSB1bmRlZmluZWQgJiYgbWV0aG9kVmFsICE9PSAnb25WaWV3U3RyZWFtSW5mbycpIHtcbiAgICAgIGNvbnN0IG1ldGhvZEV4aXN0cyA9IHR5cGVvZiAodGhpc1ttZXRob2RWYWxdKSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgaWYgKG1ldGhvZEV4aXN0cyA9PT0gdHJ1ZSkge1xuICAgICAgICBmbiA9IHRoaXNbbWV0aG9kVmFsXS5iaW5kKHRoaXMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuXG4gIH1cblxuICBvbkluY29taW5nT2JzZXJ2YWJsZShvYmopIHtcbiAgICBjb25zdCBlcXNOYW1lID0gZXF1YWxzKG9iai5uYW1lLCB0aGlzLnByb3BzLm5hbWUpXG4gICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQgfSA9IG9iai5kYXRhXG4gICAgLy8gY29uc29sZS5sb2coXCJJTkNPTUlORyBcIix7YWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50fSwge29ian0pO1xuICAgIGNvbnN0IG1lcmdlUHJvcHMgPSAoZCkgPT4gbWVyZ2VBbGwoW2QsIHsgYWN0aW9uOiBwcm9wKCdhY3Rpb24nLCBkKSB9LCBwcm9wKCdwYXlsb2FkJywgZCksIHByb3AoJ3NyY0VsZW1lbnQnLCBkKV0pXG4gICAgY29uc3QgZGF0YU9iaiA9IG9ic1ZhbCA9PiAoe1xuICAgICAgY2xvbmU6ICgpID0+IG1lcmdlUHJvcHMob2JqLmRhdGEpLFxuICAgICAgYWN0aW9uLFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHNyY0VsZW1lbnQsXG4gICAgICBldmVudDogb2JzVmFsXG4gICAgfSlcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAob2JqKSA9PiBvYmoub2JzZXJ2YWJsZS5waXBlKG1hcChkYXRhT2JqKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5nZXRBY3Rpb25NZXRob2RGb3JPYnNlcnZhYmxlKG9iaikpXG4gICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHt9XG4gICAgcmV0dXJuIGVxc05hbWUgPT09IHRydWUgPyBvblN1Y2Nlc3Mob2JqKSA6IG9uRXJyb3IoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIDxwPlZpZXdTdGVhbSBpbnN0YW5jZXMgY2FuIHNlbmQgaW5mbyB0byBjaGFubmVscyB0aHJvdWdoIGl0cyBMSU5LWydzZW5kSW5mb1RvQ2hhbm5lbCwgJ3ZpZXctc3RyZWFtLXNlbmQtaW5mby10by1jaGFubmVsJ10gbWV0aG9kLjwvcD5cbiAgICogPHA+RGF0YSByZWNlaXZlZCBmcm9tIFZpZXdTdHJlYW1zIGFyZSBkaXJlY3RlZCB0byB0aGlzIG1ldGhvZC48L3A+XG4gICAqIDxwPlZpZXdTdHJlYW1zIHNlbmQgZGF0YSB1c2luZyB0aGUgTElOS1snVmlld1N0cmVhbVBheWxvYWQnLCAndmlldy1zdHJlYW0tcGF5bG9hZCddIGZvcm1hdC48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbVBheWxvYWR9IG9ialxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5QYXJzaW5nIERhdGEgUmV0dXJuZWQgZnJvbSBhIFZpZXdTdHJlYW0gSW5zdGFuY2U8L2g0PlwiXVxuICAgKiBvblZpZXdTdHJlYW1JbmZvKG9iail7XG4gICAqICAgICBsZXQgZGF0YSA9IG9iai52aWV3U3RyZWFtSW5mbztcbiAgICogICAgIGxldCBhY3Rpb24gPSBkYXRhLmFjdGlvbjtcbiAgICogICAgIGxldCBuZXdQYXlsb2FkID0gdGhpcy5wYXJzZVZpZXdTdHJlYW1EYXRhKGRhdGEpO1xuICAgKiAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBuZXdQYXlsb2FkKTtcbiAgICogfVxuICAgKlxuICAgKlxuICAgKi9cbiAgb25WaWV3U3RyZWFtSW5mbyhvYnMpIHtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKlxuICAgKiA8cD5UaGlzIG1ldGhvZCB0YWtlcyBhbiBhY3Rpb24sIGEgZGF0YSBvYmplY3QgYW5kIG90aGVyIHByb3BlcnRpZXMgdG8gY3JlYXRlIGFuZCBwdWJsaXNoIGEgTElOS1snQ2hhbm5lbFBheWxvYWQnLCAnY2hhbm5lbC1wYXlsb2FkJ10gb2JqZWN0LjwvcD5cbiAgICogPHA+T25jZSB0aGUgYWN0aW9uIGFuZCBwYXlsb2FkIGlzIHZhbGlkYXRlZCwgdGhpcyBtZXRob2Qgd2lsbCBwdWJsaXNoIHRoZSBkYXRhIGJ5IHVzaW5nIHRoZSBjaGFubmVsJ3Mgc291cmNlIFN1YmplY3QgbmV4dCgpIG1ldGhvZC5cbiAgICogPHA+VGhpcyBjb25zaXN0ZW50IGZvcm1hdCBhbGxvd3Mgc3Vic2NyaWJlcnMgdG8gdW5kZXJzdGFuZCBob3cgdG8gcGFyc2UgYW55IGluY29taW5nIGNoYW5uZWwgZGF0YS48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc3JjRWxlbWVudFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudFxuICAgKiBAcGFyYW0ge09ic2VydmFibGV9IG9icyRcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGFjdGlvbiAtID0gdW5kZWZpbmVkOyBSZXF1aXJlZC4gQW4gYWN0aW9uIGlzIGEgc3RyaW5nLCB0eXBpY2FsbHkgaW4gdGhlIGZvcm1hdCBvZiBcIkNIQU5ORUxfTkFNRV9BQ1RJT05fTkFNRV9FVkVOVFwiLCBhbmQgdGhhdCBoYXMgYmVlbiBhZGRlZCBpbiB0aGUgYWRkUmVnaXN0ZXJlZEFjdGlvbnMgbWV0aG9kLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcGF5bG9hZCAtID0gdW5kZWZpbmVkOyBSZXF1aXJlZC4gVGhpcyBjYW4gYmUgYW55IGphdmFzY3JpcHQgb2JqZWN0IGFuZCBpcyB1c2VkIHRvIHNlbmQgYW55IGN1c3RvbSBkYXRhLlxuICAgKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50IC0gPSBOb3QgUmVxdWlyZWQuIHVuZGVmaW5lZDsgVGhpcyBjYW4gYmUgZWl0aGVyIHRoZSBlbGVtZW50IHJldHVybmVkIGZyb20gdGhlIFVJIENoYW5uZWwsIG9yIHRoZSBzcmNFbGVtZW50IGZyb20gYSBWaWV3U3RyZWFtIGluc3RhbmNlLlxuICAgKiBAcHJvcGVydHkge1VJRXZlbnR9IGV2ZW50IC0gPSB1bmRlZmluZWQ7IE5vdCBSZXF1aXJlZC4gVGhpcyB3aWxsIGJlIGRlZmluZWQgaWYgdGhlIGV2ZW50IGlzIGZyb20gdGhlIFVJIENoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7T2JzZXJ2YWJsZX0gb2JzJCAtID0gdGhpcy5vYnNlcnZlcjsgVGhpcyBkZWZhdWx0IGlzIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBmb3IgdGhpcyBjaGFubmVsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0PlB1Ymxpc2hpbmcgYSBDaGFubmVsUGF5bG9hZDwvaDQ+J11cbiAgICogbGV0IGFjdGlvbiA9IFwiQ0hBTk5FTF9NWV9DSEFOTkVMX1JFR0lTVEVSRURfQUNUSU9OX0VWRU5UXCI7XG4gICAqIGxldCBkYXRhID0ge2ZvbzpcImJhclwifTtcbiAgICogdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBkYXRhKTtcbiAgICpcbiAgICovXG4gIHNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQgPSB7fSwgZXZlbnQgPSB7fSwgb2JzJCA9IHRoaXMub2JzZXJ2ZXIkKSB7XG4gICAgLy8gTUFLRVMgQUxMIENIQU5ORUwgQkFTRSBBTkQgREFUQSBTVFJFQU1TIENPTlNJU1RFTlRcblxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkSXRlbSA9IG5ldyBDaGFubmVsUGF5bG9hZCh0aGlzLnByb3BzLm5hbWUsIGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gICAgLy8gY29uc29sZS5sb2coXCJDSEFOTkVMIFNUUkVFTSBJVEVNIFwiLGNoYW5uZWxQYXlsb2FkSXRlbSk7XG5cbiAgICAvLyBjb25zdCBvbk5leHRGcmFtZSA9ICgpPT5vYnMkLm5leHQoY2hhbm5lbFBheWxvYWRJdGVtKTtcbiAgICAvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUob25OZXh0RnJhbWUpXG5cbiAgICBvYnMkLm5leHQoY2hhbm5lbFBheWxvYWRJdGVtKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIDxwPkFsbG93cyBjaGFubmVscyB0byBzdWJzY3JpYmUgdG8gb3RoZXIgY2hhbm5lbHMuPC9wPlxuICAgKiA8cD5UaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzb3VyY2UgcnhqcyBTdWJqZWN0IGZvciB0aGUgcmVxdWVzdGVkIENoYW5uZWwsIHdoaWNoIGNhbiBiZSBsaXN0ZW5lZCB0byBieSBjYWxsaW5nIGl0cyBzdWJzY3JpYmUgbWV0aG9kLjwvcD5cbiAgICogPHA+S25vd2xlZGdlIG9mIHJ4anMgaXMgbm90IHJlcXVpcmVkIHRvIHN1YnNjcmliZSB0byBhbmQgcGFyc2UgQ2hhbm5lbCBkYXRhLjwvcD5cbiAgICogPHA+QnV0IGFjY2Vzc2luZyB0aGUgcnhqcyBTdWJqZWN0IGdpdmVzIGRldmVsb3BlcnMgdGhlIGFiaWxpdHkgdG8gdXNlIGFsbCBvZiB0aGUgYXZhaWxhYmxlIHJ4anMgbWFwcGluZyBhbmQgb2JzZXJ2YWJsZSB0b29scy48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZSBUaGUgcmVnaXN0ZXJlZCBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbC5cbiAgICogQHJldHVybnNcbiAgICogVGhlIHNvdXJjZSByeGpzIFN1YmplY3Qgb2YgdGhlIHJlcXVlc3RlZCBjaGFubmVsLlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5TdWJzY3JpYmluZyB0byBhIENoYW5uZWwgVXNpbmcgdGhlIGdldENoYW5uZWwgbWV0aG9kPC9oND5cIl1cbiAgICogbGV0IHJvdXRlJCA9IHRoaXMuZ2V0Q2hhbm5lbChcIkNIQU5ORUxfUk9VVEVcIilcbiAgICogcm91dGUkLnN1YnNjcmliZShsb2NhbE1ldGhvZCk7XG4gICAqXG4gICAqXG4gICAqL1xuICBnZXRDaGFubmVsKGNoYW5uZWxOYW1lLCBwYXlsb2FkRmlsdGVyKSB7XG4gICAgY29uc3QgaXNWYWxpZENoYW5uZWwgPSBjID0+IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcygpLmluY2x1ZGVzKGMpXG4gICAgY29uc3QgZXJyb3IgPSBjID0+IGNvbnNvbGUud2FybihcbiAgICAgICAgYGNoYW5uZWwgbmFtZSAke2N9IGlzIG5vdCB3aXRoaW4gJHtyZWdpc3RlcmVkU3RyZWFtTmFtZXN9YClcbiAgICBjb25zdCBzdGFydFN1YnNjcmliZSA9IChjKSA9PiB7XG4gICAgICBjb25zdCBvYnMkID0gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRTdHJlYW0oYykub2JzZXJ2ZXJcbiAgICAgIGlmIChwYXlsb2FkRmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9icyQucGlwZShmaWx0ZXIocGF5bG9hZEZpbHRlcikpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYnMkXG4gICAgfVxuICAgIGNvbnN0IGZuID0gaWZFbHNlKGlzVmFsaWRDaGFubmVsLCBzdGFydFN1YnNjcmliZSwgZXJyb3IpXG4gICAgcmV0dXJuIGZuKGNoYW5uZWxOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIENoYW5uZWxzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGZvcmtKb2luIENoYW5uZWwub2JzZXJ2ZXIkXG4gICAqXG4gICAqICovXG5cbiAgbWVyZ2VDaGFubmVscyhjaGFubmVsc0FyciwgZW1pdE9uY2UgPSB0cnVlKSB7XG4gICAgLy8gMSkgTm9ybWFsaXplIGlucHV0cyB0byBPYnNlcnZhYmxlc1xuICAgIGNvbnN0IGNoYW5uZWxPYnNlcnZhYmxlcyA9IGNoYW5uZWxzQXJyLm1hcChpdGVtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgY2hhbiQgPSB0aGlzLmdldENoYW5uZWwoaXRlbSlcbiAgICAgICAgcmV0dXJuIGVtaXRPbmNlID8gY2hhbiQucGlwZSh0YWtlKDEpKSA6IGNoYW4kXG4gICAgICB9XG4gICAgICByZXR1cm4gZW1pdE9uY2UgPyBpdGVtLnBpcGUodGFrZSgxKSkgOiBpdGVtXG4gICAgfSlcblxuICAgIC8vIDIpIENvbWJpbmUgdGhlbVxuICAgIGxldCBjb21iaW5lZCRcbiAgICBpZiAoZW1pdE9uY2UpIHsgLy8gb25l4oCRc2hvdDogc25hcHNob3QgdGhlbiBjb21wbGV0ZVxuICAgICAgY29tYmluZWQkID0gZm9ya0pvaW4oY2hhbm5lbE9ic2VydmFibGVzKVxuICAgIH0gZWxzZSB7IC8vIGxpdmUgdXBkYXRlczogY29tYmluZUxhdGVzdFdpdGhcbiAgICAgIGlmIChjaGFubmVsT2JzZXJ2YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbWJpbmVkJCA9IEVNUFRZXG4gICAgICB9IGVsc2UgaWYgKGNoYW5uZWxPYnNlcnZhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29tYmluZWQkID0gY2hhbm5lbE9ic2VydmFibGVzWzBdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbZmlyc3QkLCAuLi5yZXN0JF0gPSBjaGFubmVsT2JzZXJ2YWJsZXNcbiAgICAgICAgY29tYmluZWQkID0gZmlyc3QkLnBpcGUoY29tYmluZUxhdGVzdFdpdGgoLi4ucmVzdCQpKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMpIE1hcCBhcnJheSDihpIga2V5ZWQgb2JqZWN0XG4gICAgcmV0dXJuIGNvbWJpbmVkJC5waXBlKFxuICAgICAgbWFwKHJlc3VsdHNBcnIgPT4ge1xuICAgICAgICBjb25zdCBvYmogPSB7fVxuICAgICAgICBjaGFubmVsc0Fyci5mb3JFYWNoKChpdGVtLCBpZHgpID0+IHtcbiAgICAgICAgICBjb25zdCBrZXkgPSB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgPyBpdGVtIDogYGNoYW5uZWxfJHtpZHh9YFxuICAgICAgICAgIG9ialtrZXldID0gcmVzdWx0c0FycltpZHhdXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBvYmpcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yTm90VHJhY2tGbGFnKHByb3BzID0ge30pIHtcbiAgICBpZiAocHJvcHMuZG9Ob3RUcmFjayA9PT0gdHJ1ZSkge1xuICAgICAgU3B5bmVBcHBQcm9wZXJ0aWVzLmRvTm90VHJhY2tDaGFubmVsKHByb3BzLmNoYW5uZWxOYW1lKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBjb21wb3NlLCBwYXRoLCBpcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5cbi8vIGNvbnNvbGUubG9nKCdjaGFubmVscyBjb25maWcgbG9hZGVkICcsUixSeCk7XG5jb25zdCByZWdpc3RlcmVkU3RyZWFtTmFtZXMgPSAoKSA9PiAoe1xuICBpbmNsdWRlczogICgpID0+IFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSA/IFNweW5lQXBwUHJvcGVydGllcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKCkgOiBbJ0NIQU5ORUxfUk9VVEUnLCAnQ0hBTk5FTF9VSScsICdDSEFOTkVMX1dJTkRPVycsICdESVNQQVRDSEVSJ11cblxufSlcblxuLy8gZ2V0R2xvYmFsT2JqKCkuY2hhbm5lbHNMaXN0QXJyO1xuY29uc3QgcmVnaXN0ZXJlZFN0ZXBzID0gWydMT0FEJywgJ1JFTkRFUicsICdNT1VOVCcsICdVTk1PVU5UJywgJ0RJU1BPU0UnLCAnR0FSQkFHRV9DT0xMRUNUJywgJ1VQREFURSddXG5jb25zdCByZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzID0gWydwYXJlbnQnLCAnc2VsZicsICdjaGlsZCcsICdjaGlsZHJlbicsICd2aWV3J11cbmNvbnN0IHJlZ2lzdGVyZWRTdHJlYW1UeXBlcyA9IFsnT2JzZXJ2YWJsZScsICdCZWhhdmlvclN1YmplY3QnLCAnU3ViamVjdCcsICdPYnNlcnZlcicsICdTdWJzY3JpYmVyJywgJ0Zyb21FdmVudE9ic2VydmFibGUnXVxuY29uc3QgcmVnaXN0ZXJlZEFjdGlvbnMgPSBbJ3N1YnNjcmliZScsICdjb21iaW5lTGF0ZXN0J11cbmNvbnN0IGdldFJ4VHlwZSA9IChvYnMpID0+IG9icygpLmNvbnN0cnVjdG9yLm5hbWVcbi8vIGxldCBnZXRPYnNlcnZhYmxlVHlwZSA9IChvYnMpID0+IG9icy5jb25zdHJ1Y3Rvci5uYW1lO1xuY29uc3QgY29uZmlybU9ic2VydmFibGUgPSAob2JzKSA9PiBvYnMuc3Vic2NyaWJlICE9PSB1bmRlZmluZWRcbi8vIGxldCBwdWxsTWFpblJvdXRlID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oXFwvPykoLiopKFxcLykoLiopL2csICckMicpO1xubGV0IGJhc2VWYWxpZGF0aW9ucyA9IFtdOyBsZXQgdmlld0luZm9WYWxpZGF0aW9ucyA9IFtdOyBsZXQgdWlWYWxpZGF0aW9ucyA9IFtdXG5sZXQgbGlmZXN0cmVhbVZhbGlkYXRpb25zID0gW107IGxldCBzdGVwVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtdXG5sZXQgcm91dGVWYWxpZGF0aW9ucyA9IFtdOyBsZXQgU3RyZWFtc0NvbmZpZyA9IFtdXG5cbmlmIChjb21wb3NlICE9PSB1bmRlZmluZWQgJiYgT2JzZXJ2YWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4vLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFMTCBWQUxJREFUSU9OUyBBREQgVEhFIEJBU0UgVkFMSURBVElPTlMgVEhST1VHSCBDT05DQVRFTkFUSU9OXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYmFzZVZhbGlkYXRpb25zID0gW1xuICAgIHtcbiAgICAgIGVycm9yOiBgbmVlZCB0byBtYXRjaCBhIHZhbGlkIG5hbWUgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgIH0sXG5cbiAgICB7XG4gICAgICBlcnJvcjogJ3BhcmFtIFxcJ29ic2VydmFibGVcXCcgbXVzdCBjb250YWluIGEgdmFsaWQgT2JzZXJ2YWJsZScsXG4gICAgICAvLyBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbVR5cGVzLmluY2x1ZGVzKGdldE9ic2VydmFibGVUeXBlKHBheWxvYWQub2JzZXJ2YWJsZSkpXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gY29uZmlybU9ic2VydmFibGUocGF5bG9hZC5vYnNlcnZhYmxlKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6ICdwYXJhbSBhY3Rpb24gbXVzdCBiZSBhIHJlZ2lzdGVyZWQgYWN0aW9uJyxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkQWN0aW9ucy5pbmNsdWRlcyhwYXlsb2FkLmFjdGlvbilcbiAgICB9XG5cbiAgXVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRIRVNFIFZBTElEQVRJT05TIEFSRSBDT05DQVRFTkFURUQgV0hFTiBUSEUgT0JTRVJWQUJMRSBSRUZFUlMgVE8gQSBWSUVXXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmlld0luZm9WYWxpZGF0aW9ucyA9IFtcbiAgICB7XG4gICAgICBlcnJvcjogJ25lZWRzIHZzaWQgbnVtYmVyIGluIHNyY0VsZW1lbnQnLFxuICAgICAgcHJlZGljYXRlOiBjb21wb3NlKGlzKFN0cmluZyksIHBhdGgoWydkYXRhJywgJ3NyY0VsZW1lbnQnLCAndnNpZCddKSlcbiAgICB9LFxuICAgIHtcbiAgICAgIGVycm9yOiAnbmVlZHMgYSBpZCBpbiBzcmNFbGVtZW50JyxcbiAgICAgIHByZWRpY2F0ZTogY29tcG9zZShpcyhTdHJpbmcpLFxuICAgICAgICBwYXRoKFsnZGF0YScsICdzcmNFbGVtZW50JywgJ2lkJ10pKVxuICAgIH1cbiAgXVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk8gU1BFQ0lGSUMgVUkgVkFMSURBVElPTlMgQVQgVEhJUyBUSU1FIC0tIElUIEpVU1QgQUREIE9USEVSU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHVpVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCB1aVZhbGlkYXRpb25zID0gW11cbiAgICByZXR1cm4gdWlWYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKS5jb25jYXQodmlld0luZm9WYWxpZGF0aW9ucylcbiAgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5PIFNQRUNJRklDIExJRkVTVFJFQU0gVkFMSURBVElPTlMgQVQgVEhJUyBUSU1FIC0tIElUIEpVU1QgQUREIE9USEVSU1xuICBjb25zdCBsaWZlU3RyZWFtVmFsaWRhdGlvbnMgPSBbXG5cbiAgICB7XG4gICAgICBlcnJvcjogYG5lZWQgdG8gbWF0Y2ggYSB2YWxpZCBuYW1lIHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1UeXBlc31gLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcygpLmluY2x1ZGVzKHBheWxvYWQubmFtZSlcbiAgICB9LFxuXG4gICAge1xuICAgICAgZXJyb3I6IGBuZWVkcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdGVwIHN0cmluZ3M6ICR7cmVnaXN0ZXJlZFN0ZXBzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0ZXBzLmluY2x1ZGVzKHBheWxvYWQuU1RFUClcbiAgICB9LFxuICAgIHtcbiAgICAgIGVycm9yOiBgdHlwZSBuZWVkcyB0byBvbmUgb2YgdGhlIGZvbGxvd2luZzogJHtyZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZExpZmVTdHJlYW1UeXBlcy5pbmNsdWRlcyhwYXlsb2FkLnR5cGUpXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGVycm9yOiAndmlld0lkIG5lZWRzIHRvIGJlIGFkZGVkICcsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC52aWV3SWQgIT09IHVuZGVmaW5lZFxuICAgIH1cbiAgXVxuXG4gIHN0ZXBWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBWYWxpZGF0aW9ucyA9IFtdXG4gICAgcmV0dXJuIHN0ZXBWYWxpZGF0aW9ucy5jb25jYXQobGlmZVN0cmVhbVZhbGlkYXRpb25zKVxuICB9XG5cbiAgc3RlcERpc3Bvc2VWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdESVNQT1NFIFNURVAgcmVxdWlyZXMgYSBkaXNwb3NlSXRlbSBwYXJhbSBpbiB0aGUgZGF0YSBvYmplY3QnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC5TVEVQID09PSAnRElTUE9TRScgJiZcbiAgICAgICAgICAgIHBheWxvYWQuZGF0YS5kaXNwb3NlSXRlbXMgIT09IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIF1cbiAgICByZXR1cm4gc3RlcFVwZGF0ZVZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cblxuICBzdGVwVXBkYXRlVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzdGVwVXBkYXRlVmFsaWRhdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIGVycm9yOiAnVVBEQVRFIFNURVAgcmVxdWlyZXMgYSBkYXRhIG9iamVjdCAnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC5TVEVQID09PSAnVVBEQVRFJyAmJiBwYXlsb2FkLmRhdGEgIT09XG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgIH1cbiAgICBdXG4gICAgcmV0dXJuIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucy5jb25jYXQobGlmZVN0cmVhbVZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gbGlmZXN0cmVhbVZhbGlkYXRpb25zXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGlmZXN0cmVhbVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGxpZmVTdHJlYW1WYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKVxuICAgICAgLmNvbmNhdCh2aWV3SW5mb1ZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSEVSRSBJUyBUSEUgUk9VVEUgVkFMSURBVElPTlNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByb3V0ZVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgcm91dGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIC8qXG4gICAgICAqXG4gICAgICB7XG4gICAgICAgICAgZXJyb3I6IGBuZWVkcyBhIHZhbGlkIHJvdXRlIHN0cmluZyB3aXRoaW4gWyR7cmVnaXN0ZXJlZFJvdXRlc31dYCxcbiAgICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFJvdXRlcy5pbmNsdWRlcyhwdWxsTWFpblJvdXRlKHBheWxvYWQuZGF0YS5uYXZpZ2F0ZVRvKSlcbiAgICAgIH1cbiAgICAgICpcbiAgICAgICovXG5cbiAgICBdXG4gICAgcmV0dXJuIHJvdXRlVmFsaWRhdGlvbnMuY29uY2F0KGJhc2VWYWxpZGF0aW9ucykuY29uY2F0KHZpZXdJbmZvVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKlxuICAqIFRIRSBJREVBIE9GIFN0cmVhbXNDb25maWcgSVMgVE8gQ09NUExFVEVMWSBHRU5FUkFURSBBTEwgQVBQIFNUUkVBTVMgVVNJTkcgVEhJUyBPQkpFQ1RcbiAgKiBUSElTIEhBUyBOT1QgQkVFTiBJTVBMRU1FTlRFRCAtLSBNQVkgQkUgQURERUQgSU4gQSBGVVRVUkUgVkVSU0lPTlxuICAqL1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFN0cmVhbXNDb25maWcgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzdHJlYW1WYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBcXCduYW1lXFwnIG11c3QgYmUgb2YgYSByZWdpc3RlcmVkIHR5cGUnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBcXCdvYnNlcnZhYmxlXFwnIG11c3QgY29udGFpbiBhIHZhbGlkIE9ic2VydmFibGUnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbVR5cGVzLmluY2x1ZGVzKFxuICAgICAgICAgIGdldFJ4VHlwZShwYXlsb2FkLm9ic2VydmFibGUpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBhY3Rpb24gbXVzdCBiZSBhIHJlZ2lzdGVyZWQgYWN0aW9uJyxcbiAgICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRBY3Rpb25zLmluY2x1ZGVzKHBheWxvYWQuYWN0aW9uKVxuICAgICAgfVxuXG4gICAgXVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVhbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6ICdESVNQQVRDSEVSJyxcbiAgICAgICAgICAgIG9ic2VydmFibGU6ICgpID0+IG5ldyBTdWJqZWN0KCksXG4gICAgICAgICAgICBhY3Rpb246ICdzdWJzY3JpYmUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIG9ic2VydmFibGU6IE9ic2VydmFibGUgfHwgU3ViamVjdCxcbiAgICAgICAgICAgIGFjdGlvbjogU3RyaW5nXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2YWxpZGF0aW9uczogc3RyZWFtVmFsaWRhdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6ICdVQlUnLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogKCkgPT4gbmV3IFN1YmplY3QoKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ3N1YnNjcmliZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cnVjdHVyZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZSB8fCBTdWJqZWN0LFxuICAgICAgICAgICAgYWN0aW9uOiBTdHJpbmdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRpb25zOiBzdHJlYW1WYWxpZGF0aW9uc1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9XG59XG5leHBvcnQge1xuICBzdGVwRGlzcG9zZVZhbGlkYXRpb25zLCBzdGVwVXBkYXRlVmFsaWRhdGlvbnMsIHN0ZXBWYWxpZGF0aW9ucywgdWlWYWxpZGF0aW9ucywgcm91dGVWYWxpZGF0aW9ucywgbGlmZXN0cmVhbVZhbGlkYXRpb25zLCByZWdpc3RlcmVkU3RyZWFtTmFtZXMsIFN0cmVhbXNDb25maWdcbn1cbiIsImltcG9ydCB7IFNweW5lQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsVUkgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtdWkuanMnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxXaW5kb3cgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtd2luZG93LmpzJ1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsTGlmZWN5Y2xlIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLWxpZmVjeWNsZS5qcydcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBDaGFubmVsUHJveHkgfSBmcm9tICcuL2NoYW5uZWwtcHJveHkuanMnXG5pbXBvcnQgeyBwcm9wRXEsIHBsdWNrLCBwcm9wLCBmaWx0ZXIsIHBhdGhFcSwgcmVqZWN0LCBjb21wb3NlLCBqb2luLCBtYXAgYXMgck1hcCB9IGZyb20gJ3JhbWRhJ1xuXG5jb25zdCBfbWFwID0gbmV3IE1hcCgpXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsc01hcCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxzRGVsZWdhdG9yXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgb2JqZWN0IGNyZWF0ZXMgdGhlIGxvZ2ljIHNvIHRoYXQgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW1zIGNhbiBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXJcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICBfbWFwLnNldCgnRElTUEFUQ0hFUicsIG5ldyBTdWJqZWN0KCkpXG4gICAgdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzID0gQ2hhbm5lbHNNYXAubGlzdFJlZ2lzdGVyZWRDaGFubmVscy5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRDaGFubmVsc0xpc3QgPSBDaGFubmVsc01hcC5nZXRDaGFubmVsc0xpc3QuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IG1hcCgpIHtcbiAgICByZXR1cm4gX21hcFxuICB9XG5cbiAgc3RhdGljIGdldENoYW5uZWxzTGlzdCgpIHtcbiAgICBjb25zdCBwcm94eU1hcEZuID0gIChrLCB2KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBrWzBdXG4gICAgICBjb25zdCB2YWwgPSBrWzFdLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgIHJldHVybiB7IGtleSwgdmFsIH1cbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oX21hcCwgcHJveHlNYXBGbilcbiAgfVxuXG4gIHN0YXRpYyBsaXN0UmVnaXN0ZXJlZENoYW5uZWxzKHNob3dPbmx5UHJveGllcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgcHJveHlNYXAgPSB0aGlzLmdldENoYW5uZWxzTGlzdCgpXG4gICAgY29uc3QgcmVqZWN0UHJveHlGbiA9IHJlamVjdChwcm9wRXEoJ0NoYW5uZWxQcm94eScsICd2YWwnKSlcbiAgICBjb25zdCBmaWx0ZXJQcm94eUZuID0gZmlsdGVyKHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZuID0gc2hvd09ubHlQcm94aWVzID09PSB0cnVlID8gZmlsdGVyUHJveHlGbiA6IHJlamVjdFByb3h5Rm5cbiAgICBjb25zdCByZW1vdmVkUHJveHlBcnIgPSBmbihwcm94eU1hcClcbiAgICByZXR1cm4gcGx1Y2soWydrZXknXSwgcmVtb3ZlZFByb3h5QXJyKVxuICB9XG5cbiAgbGlzdFByb3h5Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscyh0cnVlKVxuICB9XG5cbiAgY2hlY2tGb3JNaXNzaW5nQ2hhbm5lbHMoKSB7XG4gICAgY29uc3QgcHJveHlNYXAgPSB0aGlzLmdldENoYW5uZWxzTGlzdCgpXG4gICAgY29uc3QgZmlsdGVyUHJveHlGbiA9IGZpbHRlcihwcm9wRXEoJ0NoYW5uZWxQcm94eScsICd2YWwnKSlcbiAgICBjb25zdCBmaWx0ZXJQcm94eUFyciA9IGZpbHRlclByb3h5Rm4ocHJveHlNYXApXG5cbiAgICBpZiAoZmlsdGVyUHJveHlBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWxTdHIgPSBmaWx0ZXJQcm94eUFyci5sZW5ndGggPT09IDEgPyAnQ2hhbm5lbCBoYXMnIDogJ0NoYW5uZWxzIGhhdmUnXG4gICAgICBjb25zdCBjaGFubmVscyA9IGNvbXBvc2Uoam9pbignLCAnKSwgck1hcChwcm9wKCdrZXknKSkpKGZpbHRlclByb3h5QXJyKVxuICAgICAgY29uc3QgZmlsdGVyUHJlZml4V2FybmluZyA9IGBTcHluZSBXYXJuaW5nOiBUaGUgZm9sbG93aW5nICR7Y2hhbm5lbFN0cn0gbm90IGJlZW4gaW5pdGlhbGl6ZWQ6ICR7Y2hhbm5lbHN9YFxuICAgICAgY29uc29sZS53YXJuKGZpbHRlclByZWZpeFdhcm5pbmcpXG4gICAgfVxuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLmNyZWF0ZU1haW5TdHJlYW1zKClcbiAgfVxuXG4gIGNyZWF0ZU1haW5TdHJlYW1zKCkge1xuICAgIHRoaXMucm91dGVTdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsUm91dGUoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX1JPVVRFJywgdGhpcy5yb3V0ZVN0cmVhbSlcblxuICAgIHRoaXMudWlTdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsVUkoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX1VJJywgdGhpcy51aVN0cmVhbSlcblxuICAgIHRoaXMuZG9tU3RyZWFtID0gbmV3IFNweW5lQ2hhbm5lbFdpbmRvdygpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfV0lORE9XJywgdGhpcy5kb21TdHJlYW0pXG5cbiAgICB0aGlzLnZpZXdTdHJlYW1MaWZlY3ljbGUgPSBuZXcgU3B5bmVDaGFubmVsTGlmZWN5Y2xlKClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9MSUZFQ1lDTEUnLCB0aGlzLnZpZXdTdHJlYW1MaWZlY3ljbGUpXG5cbiAgICB0aGlzLnJvdXRlU3RyZWFtLmluaXRpYWxpemVTdHJlYW0oKVxuICAgIHRoaXMuZG9tU3RyZWFtLmluaXRpYWxpemVTdHJlYW0oKVxuICB9XG5cbiAgYWRkS2V5RXZlbnQoa2V5KSB7XG4gICAgX21hcC5nZXQoJ1VJJykuYWRkS2V5RXZlbnQoa2V5KVxuICB9XG5cbiAgcmVnaXN0ZXJTdHJlYW0odmFsKSB7XG4gICAgY29uc3QgbmFtZSA9IHZhbC5jaGFubmVsTmFtZVxuICAgIGNvbnN0IG5hbWVFeGlzdHMgPSBfbWFwLmhhcyhuYW1lKVxuICAgIGlmIChuYW1lRXhpc3RzKSB7XG4gICAgICBjb25zdCBpc0FscmVhZHlSZWdpc3RlcmQgPSBjb21wb3NlKHBhdGhFcShbJ3Byb3BzJywgJ2lzUmVnaXN0ZXJlZCddLCB0cnVlKSkoX21hcC5nZXQobmFtZSkpXG4gICAgICBpZiAoaXNBbHJlYWR5UmVnaXN0ZXJkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIENoYW5uZWwsICR7bmFtZX0sIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCFgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbWFwLnNldChuYW1lLCB2YWwpXG4gICAgdmFsLmluaXRpYWxpemVTdHJlYW0oKVxuICB9XG5cbiAgZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKSB7XG4gICAgcmV0dXJuIF9tYXAuZ2V0KHN0cikuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKVxuICB9XG5cbiAgZ2V0UHJveHlTdWJqZWN0KG5hbWUsIGlzUmVwbGF5U3ViamVjdCA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3ViamVjdFR5cGUgPSBpc1JlcGxheVN1YmplY3QgPT09IHRydWUgPyAncmVwbGF5U3ViamVjdCcgOiAnc3ViamVjdCdcblxuICAgIHJldHVybiBfbWFwLmdldChuYW1lKVtzdWJqZWN0VHlwZV1cbiAgfVxuXG4gIHRlc3RTdHJlYW0obmFtZSkge1xuICAgIHJldHVybiBfbWFwLmdldChuYW1lKSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICBnZXRTdHJlYW0obmFtZSkge1xuICAgIGlmICh0aGlzLnRlc3RTdHJlYW0obmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICBfbWFwLnNldChuYW1lLCBuZXcgQ2hhbm5lbFByb3h5KG5hbWUpKVxuICAgIH1cblxuICAgIHJldHVybiBfbWFwLmdldChuYW1lKVxuICB9XG5cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBDT1JFIERFQ09SQVRPUlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIGxldCBjb3JlTWl4aW5zID0gIGJhc2VDb3JlTWl4aW5zKCk7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIFNUUkVBTVMgREVDT1JBVE9SU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IHN0cmVhbXNNaXhpbnMgPSBCYXNlU3RyZWFtc01peGlucygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsTGlmZWN5Y2xlIGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lQ2hhbm5lbExpZmVjeWNsZVxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIENoYW5uZWwgdGhhdCBwdWJsaXNoZXMgcmVuZGVyaW5nIGFuZCBkaXNwb3NpbmcgZXZlbnRzIG9mIGFsbCBWaWV3U3RyZWFtcyB3aG9zZSBwcm9wZXJ0eSwgcHJvcGVyLnNlbmRMaWZlY3ljbGVFdmVudHMgaXMgc2V0IHRvIHRydWUuXG4gICAqXG4gICAqIDxoMz5UaGUgdHdvIGFjdGlvbnMgdGhhdCBhcmUgcmVnc2l0ZXJlZCBmb3IgdGhpcyBjaGFubmVsIGFyZTo8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5DSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVDwvbGk+XG4gICAqIDxsaT5DSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVDwvbGk+XG4gICAqICA8L3VsPlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfTElGRUNZQ0xFJztcbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKCdDSEFOTkVMX0xJRkVDWUNMRScsIHByb3BzKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgb25WaWV3U3RyZWFtSW5mbyhvYmopIHtcbiAgICBjb25zdCB7IGFjdGlvbiwgc3JjRWxlbWVudCB9ID0gb2JqXG4gICAgY29uc3QgcGF5bG9hZCA9IHNyY0VsZW1lbnRcbiAgICBwYXlsb2FkLmFjdGlvbiA9IGFjdGlvblxuICAgIHRoaXMub25TZW5kRXZlbnQoYWN0aW9uLCBwYXlsb2FkKVxuICB9XG5cbiAgb25TZW5kRXZlbnQoYWN0aW9uU3RyLCBwYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zW2FjdGlvblN0cl1cbiAgICBjb25zdCBzcmNFbGVtZW50ID0ge31cbiAgICBjb25zdCBldmVudCA9IHVuZGVmaW5lZFxuICAgIGNvbnN0IGRlbGF5U3RyZWFtID0gKCkgPT4gdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICB3aW5kb3cuc2V0VGltZW91dChkZWxheVN0cmVhbSwgMClcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGUgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuaW1wb3J0IHtcbiAgcGljayxcbiAgZmluZCxcbiAgb21pdCxcbiAgb3ZlcixcbiAgbWVyZ2VSaWdodCxcbiAgaXMsXG4gIG9iak9mLFxuICBtZXJnZUFsbCxcbiAgcGF0aCxcbiAga2V5cyxcbiAgcHJvcCxcbiAgZXF1YWxzLFxuICBoZWFkLFxuICBjb21wb3NlLFxuICBsZW5zUHJvcCxcbiAgY2hhaW4sXG4gIHBpY2tBbGwsXG4gIGRlZmF1bHRUbyxcbiAgaXNFbXB0eSxcbiAgY29uY2F0LFxuICB3aGVuLFxuICBjb21wbGVtZW50LFxuICByZXZlcnNlLFxuICBjdXJyeU4sXG4gIF9fLFxuICB0ZXN0LFxuICByZXBsYWNlLFxuICB0b1BhaXJzLFxuICByZWR1Y2VcbiAgLCBmaWx0ZXIgYXMgcmFtZGFGaWx0ZXIsIG1lcmdlUmlnaHQgYXMgck1lcmdlXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsUm91dGUgZXh0ZW5kcyBDaGFubmVsIHtcbiAgY29uc3RydWN0b3IobmFtZSA9ICdDSEFOTkVMX1JPVVRFJywgcHJvcHMgPSB7fSkge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsUm91dGVcbiAgICAgKiBAdHlwZSBjb3JlXG4gICAgICpcbiAgICAgKiBAZGVzY1xuICAgICAqXG4gICAgICogPHA+VGhlIFNweW5lQ2hhbm5lbFJvdXRlIGhhcyB0aGUgdHdvIG1haW4gZHV0aWVzOlxuICAgICAqICA8dWw+XG4gICAgICogICA8bGk+Q29tYmluZSBkYXRhIHdpdGggdGhlIGN1cnJlbnQgd2luZG93IGxvY2F0aW9uIHRvIHVwZGF0ZSB0aGUgbG9jYXRpb24ncyBwYXRobmFtZS48L2xpPlxuICAgICAqICAgPGxpPkxpc3RlbiB0byB3aW5kb3cgbG9jYXRpb24gY2hhbmdlcyB0byB0cmFuc2xhdGUgdGhlIGxvY2F0aW9uIHBhdGhuYW1lIGludG8gYSBzZXJpZXMgb2YgbW9kZWwgcHJvcGVydGllcy48L2xpPlxuICAgICAqIDwvdWw+XG4gICAgICogPHA+SW4gYm90aCBjYXNlcywgdGhpcyBjaGFubmVsIHNlbmRzIGEgQ2hhbm5lbFBheWxvYWQgY29udGFpbmluZyB1cGRhdGVkIHJvdXRlIHByb3BlcnRpZXMuPC9wPlxuICAgICAqXG4gICAgICogPGgzPlRoZSB0d28gYWN0aW9ucyB0aGF0IGFyZSByZWdzaXRlcmVkIGZvciB0aGUgUm91dGUgY2hhbm5lbCBhcmU6PC9oMz5cbiAgICAgKiA8dWw+XG4gICAgICogPGxpPkNIQU5ORUxfUk9VVEVfREVFUExJTktfRVZFTlQ8L2xpPlxuICAgICAqIDxsaT5DSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVDwvbGk+XG4gICAgICogIDwvdWw+XG4gICAgICpcbiAgICAgKiAgICA8aDM+VGhlIFJvdXRlcyBDb25maWd1cmF0aW9uIE9iamVjdDwvaDM+XG4gICAgICogICAgPHA+VGhyIHJvdXRlcyBjb25maWd1cmF0aW9uIG9iamVjdCBpcyB1c2VkIHRvIG1hcCB0aGUgbG9jYXRpb24gc3RyaW5nIHRvIGFuZCBmcm9tIGEgcm91dGUgbW9kZWwuPC9wPlxuICAgICAqXG4gICAgICogICAgIDxwcmU+ICAgICAgICAgICB7XG4gICAgICogICAgICAgICAgICAgICAgcm91dGVQYXRoOiB7XG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU5hbWU6ICdsZXZlbE9uZVByb3AnLFxuICAgICAqICAgICAgICAgICAgICAgICAgcm91dGVPcHRpb24xOiAnYnJhbmNoaW5nLWVuZHMtaGVyZScsXG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU9wdGlvbjI6IHtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJvdXRlUGF0aDoge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZU5hbWU6ICdsZXZlbFR3b1Byb3AnLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MZXZlbDI6ICdsZXZlbC0yLWJyYW5jaC1lbmRzLWhlcmUnXG4gICAgICpcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgICAgICAgICB9XG4gICAgICogICAgICAgICAgICB9XG4gICAgICpcbiAgICAgKiAgICAgICAgICA8L3ByZT5cbiAgICAgKiAgICAgPHA+VGhpcyBjb25maWcgb2JqZWN0IGNvbnNpc3RzIG9mIG5lc3RlZCByb3V0ZVBhdGggb2JqZWN0cyB0aGF0IGNvcnJlc3BvbmRzIHRvIGFsbCBvZiB0aGUgYnJhbmNoaW5nIHBvc3NpYmxpdGllcyBmb3IgdGhlIGFwcC48L3A+XG4gICAgICogICAgPHA+VGhlIHJvdXRlTmFtZSB2YWx1ZSBpcyB0aGUgcHJvcGVydHkgbmFtZSBmb3IgZWFjaCByb3V0ZVBhdGguPC9wPlxuICAgICAqICAgIDxoMz5Sb3V0ZSBPcHRpb25zPC9oMz5cbiAgICAgKiAgICA8cD5BIHJvdXRlUGF0aCBtYXkgY29udGFpbiBzZXZlcmFsIHJvdXRlIG9wdGlvbiBrZXktdmFsdWUgcGFpcnMsIHdoaWNoIGlzIHVzZWQgdG8gbWFwIGJldHdlZW4gZGF0YSBhbmQgdGhlIHdpbmRvdyBsb2NhdGlvbi48L3A+XG4gICAgICogICAgPHVsIGNsYXNzPSdiYXNpYyc+XG4gICAgICogICAgICA8bGk+XG4gICAgICogICAgICAgICA8aDUgY2xhc3M9J2Jhc2ljJz5UaGUgUm91dGUgT3B0aW9uIEtleSAob3IgbGVmdCB2YWx1ZSk8L2g1PlxuICAgICAqICAgICAgICAgPHVsIGNsYXNzPSdkZWNpbWFsJz5cbiAgICAgKiAgICAgICAgIDxsaT5NYXBzIHRoZSB3aW5kb3cgbG9jYXRpb24gdG8gcm91dGUgZGF0YSBwcm9wZXJ0aWVzPC9saT5cbiAgICAgKiAgICAgICAgIDxsaT5UaGlzIGNoYW5uZWwgY2FuICdmaWxsIGluIHRoZSBibGFua3MnIHNvIHRoYXQgb25seSB0aGUgdXBkYXRlZCBsZXZlbCByb3V0ZU5hbWVzIGFyZSByZXF1aXJlZCB0byByZXZpc2UgdGhlIHdpbmRvdyBsb2NhdGlvbjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkNhbiBiZSBhIHJlZ2V4IHBhdHRlcm4gc28gdGhhdCBtdWx0aXBsZSBkYXRhIHByb3BlcnRpZXMgY2FuIHNoYXJlIHRoZSBzYW1lIGJyYW5jaGluZyBsb2dpYzwvbGk+XG4gICAgICogICAgICAgICAgPC91bD5cbiAgICAgKiAgICAgIDwvbGk+XG4gICAgICpcbiAgICAgKiAgICAgIDxsaT5cbiAgICAgKiAgICAgICAgICAgPGg1IGNsYXNzPSdiYXNpYyc+VGhlIFJvdXRlIE9wdGlvbiBWYWx1ZSAob3IgcmlnaHQgdmFsdWUpPC9oNT5cbiAgICAgKiAgICAgICAgICAgPHVsIGNsYXNzPSdkZWNpbWFsJz5cbiAgICAgKiAgICAgICAgICAgPGxpPk1hcHMgZGF0YSBwcm9wZXJ0aWVzIHRvIHBhcnQgb2YgYSB3aW5kb3cgbG9jYXRpb248L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5EZXRlcm1pbmVzIHRoZSBzdHJpbmcgdmFsdWUgZm9yIGl0cyBsZXZlbCBvZiB0aGUgd2luZG93IGxvY2F0aW9uPC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+VGhlIHZhbHVlIGNhbiBiZSBhIHJlZ2V4IHBhdHRlcm4gc28gdGhhdCBtdWx0aXBsZSBsb2NhdGlvbnMgY2FuIG1hcCB0byBzYW1lIHJvdXRlRGF0YSBwcm9wZXJ0eTwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkJyYW5jaGluZyBlbmRzIGZvciB0aGUgcm91dGUgb3B0aW9uIHdoZW4gdGhpcyB2YWx1ZSBpcyBhIGVpdGhlciBhIFN0cmluZyBvciBhIHJlZ2V4IHBhdHRlcm48L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5CcmFuY2hpbmcgY29udGludWVzIGZvciB0aGUgcm91dGUgb3B0aW9uIHdoZW4gdGhpcyB2YWx1ZSBpcyBhIG5lc3RlZCByb3V0ZVBhdGggb2JqZWN0PC9saT5cbiAgICAgKiAgICAgICAgICA8L3VsPlxuICAgICAqICAgICAgPC9saT5cbiAgICAgKiAgICAgIDwvdWw+XG4gICAgICpcbiAgICAgKiAgICAgIDxoMz5FbmhhbmNpbmcgVGhlIEFwcCdzIFJvdXRpbmcgTG9naWM8L2gzPlxuICAgICAqICAgICAgPHA+VGhlIGJlc3QgcHJhY3RpY2UgZm9yIGEgU3B5bmUgQXBwIGlzIHRvIGhhdmUgb25lIGNvbXBvbmVudCwgYSBjdXN0b20gY2hhbm5lbCwgbGlzdGVuIHRvIHRoZSBTcHluZVJvdXRlQ2hhbm5lbC4gQWxsIG90aGVyIGNvbXBvbmVudHMgd2lsbCB0aGVuIGxpc3RlbiB0byB0aGUgY3VzdG9tIHJvdXRlIGNoYW5uZWwuIFRoaXMgYWxsb3dzIHRoZSBjdXN0b20gcm91dGUgY2hhbm5lbCB0byBlbmhhbmNlIHJvdXRpbmcgbG9naWMgd2l0aCBtb3JlIGRhdGEgYW5kIGN1c3RvbSBhY3Rpb25zLjwvcD5cbiAgICAgKiAgICAgIDxwPllvdSBjYW4gc2VlIHRoaXMgY3VzdG9tIHJvdXRpbmcgY2hhbm5lbCBpbiBhY3Rpb24gaW4gdGhlIFNweW5lIFN0YXJ0ZXIgQXBwPC9wPlxuICAgICAqXG4gICAgICogICAgICA8aDQgY2xhc3M9J2Jhc2ljJz5FeGFtaW5pbmcgdGhpcyBTaXRlJ3MgUm91dGUgQ29uZmlndXJhdGlvbjwvaDQ+XG4gICAgICogICAgICA8YXJ0aWNsZSBjbGFzcz0nY29kZS1leGFtcGxlJyBpZD0ncm91dGVzLWNvbmZpZy1leGFtcGxlJz48L2FydGljbGU+XG4gICAgICogICAgICA8cD5Zb3UgY2FuIHNlZSB0aGlzIHNpdGUgcm91dGluZyBpbiBhY3Rpb24gYnkgb3BlbmluZyB1cCB0aGUgY29uc29sZSdzIHJvdXRlcyBwYW5lbDwvcD5cbiAgICAgKiAgICAgIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUnIGRhdGEtdHlwZT1cImNvbnNvbGVcIiBkYXRhLXZhbHVlPVwib3BlblwiIGRhdGEtY2hhbm5lbC10eXBlPVwicm91dGVcIj5DTElDSyBUTyBPUEVOIFJPVVRFIFBBTkVMPC9kaXY+XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFW1wiPGg0PkJpbmRpbmcgVUkgRUxlbWVudHMgdG8gdGhlIFJvdXRlIENoYW5uZWw8L2g0PlwiXVxuICAgICAqIC8vIFRoaXMgYWxzbyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBvdmVycmlkZSB0aGUgUm91dGVPcHRpb24gdmFsdWUgKHVzZWZ1bCB3aGVuIHRoZSB2YWx1ZSBpcyBhIHJlZ2V4IHBhdHRlcm4pXG4gICAgICogPGRpdiBjbGFzcz0nYnRuJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiIGRhdGEtcGFnZS1pZD0naG9tZScgZGF0YS1wYWdlLWlkLXZhbHVlPScnPkhPTUU8L2Rpdj5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbXCI8aDQ+VXBkYXRpbmcgdGhlIFJvdXRlIENoYW5uZWwgdXNpbmcgVmlld1N0cmVhbSZyc3F1bztzIHNlbmRJbmZvVG9DaGFubmVsPC9oND5cIl1cbiAgICAgKiBjb25zdCBkYXRhVXBkYXRlT2JqID0ge3BhZ2VJZDonZ3VpZGUnLCBzZWN0aW9uOidyZWZlcmVuY2UnLCBtZW51SXRlbTonc3B5bmUtcm91dGUtY2hhbm5lbCd9O1xuICAgICAqIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoXCJDSEFOTkVMX1JPVVRFXCIsIGRhdGFVcGRhdGVPYmopO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVtcIjxoND5VcGRhdGluZyB0aGUgUm91dGUgQ2hhbm5lbCB1c2luZyBDaGFubmVsJnJzcXVvO3Mgc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbDwvaDQ+XCJdXG4gICAgICogY29uc3QgZGF0YVVwZGF0ZU9iaiA9IHtwYWdlSWQ6J2d1aWRlJywgc2VjdGlvbjoncmVmZXJlbmNlJywgbWVudUl0ZW06J3NweW5lLXJvdXRlLWNoYW5uZWwnfTtcbiAgICAgKiB0aGlzLnNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwoZGF0YVVwZGF0ZU9iaik7XG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGNvbmZpZy50eXBlIC0gPSAnc2xhc2gnOyBUaGlzIHByb3BlcnR5IGRldGVybWluZXMgdGhlIHVybCBzdHJ1Y3R1cmUgYnkgY29uZm9ybWluZyB0aGUgd2luZG93IHBhdGhuYW1lIHRvIGVpdGhlciB0aGUgc2xhc2gsIHF1ZXJ5IG9yIGhhc2ggZm9ybWF0cy5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnLnJvdXRlcyAtID0ge3JvdXRlUGF0aDoge3JvdXRlTmFtZTonY2hhbmdlJ307IFRoaXMgbmVzdGVkIE9iamVjdCBpcyB1c2VkIHRvIGNvbnRydWN0IHRoZSB3aW5kb3cgcGF0aG5hbWUgYW5kIHRvIGV4cHJlc3MgdGhlIHdpbmRvdyBsb2NhdGlvbiBhcyBtb2RlbCB2YXJpYWJsZXMuXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfUk9VVEUnO1xuICAgICAqXG4gICAgICovXG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgc3VwZXIoJ0NIQU5ORUxfUk9VVEUnLCBwcm9wcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKClcbiAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbiA9IHRoaXMuZ2V0Um91dGVDb25maWcoKVxuICAgIHRoaXMuYmluZFN0YXRpY01ldGhvZHMoKVxuICAgIHRoaXMubmF2VG9TdHJlYW0kID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9ic2VydmVyJCA9IHRoaXMubmF2VG9TdHJlYW0kLnBpcGUobWFwKGluZm8gPT4gdGhpcy5vbk1hcE5leHQoaW5mbykpKVxuICAgIHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNvbXBhcmVSb3V0ZUtleXdvcmRzKClcbiAgfVxuXG4gIGNoZWNrQ29uZmlnRm9ySGFzaCgpIHtcbiAgICAvLyBMRUdBQ1kgQ0hFQ0sgVE8gU0lNUExJRlkgQ09ORklHIEZPUiBIQVNIO1xuICAgIGNvbnN0IGlzSGFzaFR5cGUgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLnR5cGUgPT09ICdoYXNoJ1xuICAgIGlmIChpc0hhc2hUeXBlID09PSB0cnVlKSB7XG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLnR5cGUgPSAnc2xhc2gnXG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLmlzSGFzaCA9IHRydWVcbiAgICB9XG4gIH1cblxuICBvblJlZ2lzdGVyZWQoKSB7XG4gICAgdGhpcy5jaGVja0NvbmZpZ0Zvckhhc2goKVxuICAgIHRoaXMuaW5pdFN0cmVhbSgpXG4gIH1cblxuICBjcmVhdGVDaGFubmVsQWN0aW9uc09iaigpIHtcbiAgICBjb25zdCBhcnIgPSB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKClcbiAgICBjb25zdCBjb252ZXJ0ZXIgPSBzdHIgPT4gb2JqT2Yoc3RyLCBzdHIpXG4gICAgY29uc3Qgb2JqID0gbWVyZ2VBbGwoY2hhaW4oY29udmVydGVyLCBhcnIpKVxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBvYmpcbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfUk9VVEVfQ09ORklHX1VQREFURURfRVZFTlQnLFxuICAgICAgWydDSEFOTkVMX1JPVVRFX1VQREFURV9DT05GSUdfRVZFTlQnLCAndXBkYXRlUm91dGVDb25maWcnXVxuICAgIF1cbiAgfVxuXG4gIHVwZGF0ZVJvdXRlQ29uZmlnKGUpIHtcbiAgICBjb25zdCBuZXdSb3V0ZXNPYmogID0gcGljayhbJ2lzSGFzaCcsICdpc0hpZGRlbicsICdyb3V0ZXMnLCAndHlwZSddLCBlLnBheWxvYWQpXG5cbiAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFID0gbWVyZ2VSaWdodChTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLCBuZXdSb3V0ZXNPYmopXG5cbiAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZm9ybVJvdXRlQ29uZmlnKClcblxuICAgIGNvbnN0IHJvdXRlQ29uZmlnID0gdGhpcy5nZXRSb3V0ZUNvbmZpZygpXG4gICAgY29uc3QgYWN0aW9uID0gJ0NIQU5ORUxfUk9VVEVfQ09ORklHX1VQREFURURfRVZFTlQnXG5cbiAgICAvLyByZXZlcnNlIGJlY2F1c2Ugcm91dGVEYXRhc2V0c0FyciB0dXJucyBvdXQgdGhhdCB3YXlcbiAgICByb3V0ZUNvbmZpZy5uYXZMaW5rcyA9IFsuLi5yb3V0ZUNvbmZpZz8ucm91dGVEYXRhc2V0c0Fycl1cblxuICAgIHRoaXMucm91dGVDb25maWdKc29uID0gcm91dGVDb25maWdcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKVxuXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCByb3V0ZUNvbmZpZywge30sIHt9LCB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIGdldFJvdXRlQ29uZmlnKCkge1xuICAgIGNvbnN0IHNweW5lQ29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZ1xuICAgIGNvbnN0IHJvdXRlQ29uZmlnID0gcGF0aChbJ2NoYW5uZWxzJywgJ1JPVVRFJ10sIHNweW5lQ29uZmlnKVxuICAgIGlmIChyb3V0ZUNvbmZpZy50eXBlID09PSAncXVlcnknKSB7XG4gICAgICByb3V0ZUNvbmZpZy5pc0hhc2ggPSBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuZmxhdHRlbkNvbmZpZ09iamVjdChyb3V0ZUNvbmZpZy5yb3V0ZXMpXG4gICAgcm91dGVDb25maWcucGFyYW1zQXJyID0gYXJyXG4gICAgcmV0dXJuIHJvdXRlQ29uZmlnXG4gIH1cblxuICBpbml0U3RyZWFtKCkge1xuICAgIHRoaXMuZmlyc3RMb2FkU3RyZWFtJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXG4gICAgdGhpcy5vbkluY29taW5nRG9tRXZlbnQodW5kZWZpbmVkLCB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgJycgKyAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcpXG5cbiAgICBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNyZWF0ZVBvcFN0YXRlU3RyZWFtKHRoaXMub25JbmNvbWluZ0RvbUV2ZW50LmJpbmQodGhpcykpXG5cbiAgICB0aGlzLm9ic2VydmVyJCA9IG1lcmdlKHRoaXMuZmlyc3RMb2FkU3RyZWFtJCxcbiAgICAgIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgb25NYXBOZXh0KGRhdGEsIGZpcnN0TG9hZGVkID0gZmFsc2UpIHtcbiAgICBkYXRhLmFjdGlvbiA9ICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCdcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgc3RhdGljIHJlbW92ZVNTSUQocGF5bG9hZCkge1xuICAgIGNvbnN0IHJvdXRlTGVucyA9IGxlbnNQcm9wKFsncm91dGVEYXRhJ10pXG4gICAgY29uc3Qgb21pdFNTSUQgPSBvdmVyKHJvdXRlTGVucywgb21pdChbJ3ZzaWQnXSkpXG4gICAgcmV0dXJuIG9taXRTU0lEKHBheWxvYWQpXG4gIH1cblxuICBzdGF0aWMgb25JbmNvbWluZ0RvbUV2ZW50KGV2dCwgY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGFjdG4pIHtcbiAgICBjb25zdCBhY3Rpb24gPSBhY3RuICE9PSB1bmRlZmluZWRcbiAgICAgID8gYWN0blxuICAgICAgOiB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UXG5cbiAgICAvLyBDSEVDSyBJRiBUSElTIElTIEEgSElTVE9SWSBFVkVOVCBCWSBVU0lORyBUSEUgcm91dGVDb3VudCBQUk9QRVJUWVxuICAgIGNvbnN0IGV2ZW50Q291bnQgPSBwYXRoKFsnc3RhdGUnLCAncm91dGVDb3VudCddLCBldnQpXG4gICAgY29uc3QgaXNIaXN0b3J5Q291bnQgPSBpcyhOdW1iZXIsIGV2ZW50Q291bnQpID09PSB0cnVlXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdldERhdGFGcm9tU3RyaW5nKGNvbmZpZywgaXNIaXN0b3J5Q291bnQpXG4gICAgaWYgKGlzSGlzdG9yeUNvdW50ID09PSB0cnVlKSB7XG4gICAgICBwYXlsb2FkLnJvdXRlQ291bnQgPSBldmVudENvdW50XG4gICAgfVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGlmIChhY3RuID09PSAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcpIHtcbiAgICAgIHBheWxvYWQubmF2TGlua3MgPSBwcm9wKCdyb3V0ZURhdGFzZXRzQXJyJywgY29uZmlnKVxuICAgICAgLy8gcGF5bG9hZC5saW5rc0RhdGEgPSBwYXlsb2FkLm5hdkxpbmtzXG4gICAgICAvLyBTcHluZUFwcFByb3BlcnRpZXMubGlua3NEYXRhID0gcGF5bG9hZC5uYXZMaW5rc1xuXG4gICAgICAvLyBkZWZpbmUgYW4gYWxpYXMgcHJvcGVydHkgdXNpbmcgT2JqZWN0LmRlZmluZVByb3BlcnR5XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGF5bG9hZCwgJ2xpbmtzRGF0YScsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignZ2V0IGxpbmtzIGRhdGEgaXMgZGVwcmVjYXRlZCBpbiBST1VURSBERUVQTElOSyBEQVRBLCB1c2UgbmF2TGlua3MnKVxuICAgICAgICAgIHJldHVybiB0aGlzLm5hdkxpbmtzXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgIGNvbnNvbGUud2Fybignc2V0IGxpbmtzIGRhdGEgaXMgZGVwcmVjYXRlZCBpbiBST1VURSBERUVQTElOSyBEQVRBLCB1c2UgbmF2TGlua3MnKVxuXG4gICAgICAgICAgLy8gdGhpcy5uYXZMaW5rcyA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBrZXl3b3JkQXJycyA9IHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMuY29tcGFyZShwYXlsb2FkLnJvdXRlRGF0YSwgcGF5bG9hZC5wYXRocylcbiAgICBwYXlsb2FkID0gck1lcmdlKHBheWxvYWQsIGtleXdvcmRBcnJzKVxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgdW5kZWZpbmVkLCBldnQsIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUm91dGVQYXJhbXNPdmVycmlkZXMocGF5bG9hZCkge1xuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JFdmVudE1ldGhvZHMob2JzKSB7XG4gICAgY29uc3QgcmUgPSAvXihldmVudCkoW0EtWl0uKikoW0EtWl0uKikkL2dtXG4gICAgY29uc3QgZ2V0TWV0aG9kcyA9IGNvbXBvc2UocmFtZGFGaWx0ZXIodGVzdChyZSkpLCBrZXlzLCBwcm9wKCdwYXlsb2FkJykpXG4gICAgY29uc3QgbWV0aG9kc0FyciA9IGdldE1ldGhvZHMob2JzKVxuICAgIGlmIChtZXRob2RzQXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICBjb25zdCBldnQgPSBwcm9wKCdldmVudCcsIG9icylcbiAgICAgIGlmIChldnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtZXRob2RVcGRhdGUgPSAobWF0Y2gsIHAxLCBwMiwgcDMsIHA0KSA9PiBTdHJpbmcocDIpLnRvTG93ZXJDYXNlKCkgKyBwMyArIHA0XG4gICAgICAgIGNvbnN0IG1ldGhvZFN0clJlcGxhY2UgPSByZXBsYWNlKC9eKGV2ZW50KShbQS1aXSkoLiopKFtBLVpdLiopJC9nbSwgbWV0aG9kVXBkYXRlKVxuICAgICAgICBjb25zdCBydW5NZXRob2QgPSAobWV0aG9kU3RyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbSA9IG1ldGhvZFN0clJlcGxhY2UobWV0aG9kU3RyKVxuICAgICAgICAgIGlmIChldnRbbV0gIT09IHVuZGVmaW5lZCkgeyBldnRbbV0oKSB9XG4gICAgICAgIH1cbiAgICAgICAgbWV0aG9kc0Fyci5mb3JFYWNoKHJ1bk1ldGhvZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JzXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JFbmRSb3V0ZShwbCwgcm91dGVDb25maWdKc29uID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGRlYnVnQm9vbCkge1xuICAgIGNvbnN0IGVuZFJvdXRlID0gY29tcG9zZShlcXVhbHMoJ3RydWUnKSwgcGF0aChbJ3BheWxvYWQnLCAnZW5kUm91dGUnXSkpKHBsKVxuXG4gICAgaWYgKGVuZFJvdXRlICE9PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcGxcbiAgICB9XG4gICAgY29uc3QgZGVidWcgPSBkZWJ1Z0Jvb2wgIT09IHVuZGVmaW5lZCA/IGRlYnVnQm9vbCA6IFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZVxuICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gcGxcblxuICAgIGNvbnN0IGdldFByb3BWYWwgPSAocm91dGVQYXRoKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZU5hbWUgPSBwcm9wKCdyb3V0ZU5hbWUnLCByb3V0ZVBhdGgpXG4gICAgICBpZiAocm91dGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IGtleXNBcnIgPSBjb21wb3NlKGtleXMsIG9taXQoWydyb3V0ZU5hbWUnXSkpKHJvdXRlUGF0aClcbiAgICAgICAgY29uc3Qgcm91dGVOYW1lVmFsID0gcGF5bG9hZFtyb3V0ZU5hbWVdXG4gICAgICAgIGNvbnN0IHByZWQgPSBhcnJTdHIgPT4gbmV3IFJlZ0V4cChgXiR7YXJyU3RyfSRgKS50ZXN0KHJvdXRlTmFtZVZhbClcbiAgICAgICAgY29uc3Qgcm91dGVWYWwgPSBmaW5kKHByZWQsIGtleXNBcnIpXG4gICAgICAgIHJldHVybiByb3V0ZVZhbFxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBpdGVyID0gMFxuICAgIGNvbnN0IG9uUmVkdWNlUm91dGVQYXRocyA9IChhY2MgPSBbXSwgYXJyKSA9PiB7XG4gICAgICAvLyBjb25zdCBba2V5LCB2YWxdID0gYXJyXG4gICAgICBjb25zdCB2YWwgPSBhcnJbMV1cbiAgICAgIGNvbnN0IHsgcm91dGVQYXRoIH0gPSB2YWxcbiAgICAgIGNvbnN0IHJvdXRlTmFtZSA9IHByb3AoJ3JvdXRlTmFtZScsIHJvdXRlUGF0aClcbiAgICAgIGNvbnN0IHJvdXRlTmFtZVZhbCA9IGdldFByb3BWYWwocm91dGVQYXRoKVxuICAgICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QsIHZhbClcbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGNvbnN0IGl0ZXJPYmogPSBpc09iaiA9PT0gdHJ1ZSAmJiBpc0FyciA9PT0gZmFsc2VcbiAgICAgIGl0ZXIgPSBpdGVyICsgMVxuICAgICAgaWYgKGl0ZXJPYmopIHtcbiAgICAgICAgY29uc3QgbmV4dFJvdXRlUGF0aCA9IHJvdXRlUGF0aFtyb3V0ZU5hbWVWYWxdXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdrZXkgaXMgJyx7aXRlcixhY2Msa2V5LCByb3V0ZU5hbWUsIHJvdXRlTmFtZVZhbCwgaXRlck9iaiwgbmV4dFJvdXRlUGF0aH0pO1xuICAgICAgICBpZiAobmV4dFJvdXRlUGF0aCkge1xuICAgICAgICAgIGNvbXBvc2UocmV2ZXJzZSwgcmVkdWNlKG9uUmVkdWNlUm91dGVQYXRocywgYWNjKSwgdG9QYWlycykoeyBuZXh0Um91dGVQYXRoIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJLRVkgSVMgXCIse2l0ZXIsa2V5LCByb3V0ZU5hbWUsIHJvdXRlTmFtZVZhbH0pXG4gICAgICAgICAgaWYgKGl0ZXIgPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHVzZSBvZiBlbmQgcm91dGUgbWV0aG9kIHNob3VsZCBhZGQgc3RhcnQgcm91dGUgdmFsdWUgb2YgXCIke3JvdXRlTmFtZX1cIi5gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2MucHVzaChyb3V0ZU5hbWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjXG4gICAgfVxuXG4gICAgY29uc3QgeyByb3V0ZXMgfSA9IHJvdXRlQ29uZmlnSnNvblxuXG4gICAgY29uc3QgZW5kUm91dGVWYWxBcnIgPSBjb21wb3NlKHJldmVyc2UsIHJlZHVjZShvblJlZHVjZVJvdXRlUGF0aHMsIFtdKSwgdG9QYWlycykoeyByb3V0ZXMgfSlcbiAgICAvLyBjb25zb2xlLmxvZygnZW5kIHJvdXRlIHZhbCBhcnIgJyxlbmRSb3V0ZVZhbEFycik7XG4gICAgaWYgKGVuZFJvdXRlVmFsQXJyLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZW5kUm91dGVWYWwgPSBlbmRSb3V0ZVZhbEFyclswXVxuICAgICAgcGwucGF5bG9hZFtlbmRSb3V0ZVZhbF0gPSAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgZW5kIHJvdXRlIHBhcmFtIGRpZCBub3QgeWllbGQgYW55IHJlc3VsdHMgZm9yICR7SlNPTi5zdHJpbmdpZnkocGF5bG9hZCl9IGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwbFxuICB9XG5cbiAgb25WaWV3U3RyZWFtSW5mbyhwbCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHBsLmFjdGlvbiA/PyB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UXG5cbiAgICBmdW5jdGlvbiBkb21TdHJpbmdNYXBUb09iamVjdChkb21TdHJpbmdNYXApIHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBkb21TdHJpbmdNYXApIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXTigJlzIGEgZGlyZWN0IHByb3BlcnR5ICh0aG91Z2ggZGF0YXNldCByYXJlbHkgaGFzIGFueXRoaW5nIG9uIHRoZSBwcm90b3R5cGUpOlxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvbVN0cmluZ01hcCwga2V5KSkge1xuICAgICAgICAgIG9ialtrZXldID0gZG9tU3RyaW5nTWFwW2tleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialxuICAgIH1cblxuICAgIGlmIChwbD8uc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpIHtcbiAgICAgIHBsLnBheWxvYWQgPSBkb21TdHJpbmdNYXBUb09iamVjdChwbD8uc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpID8/IHBsLnBheWxvYWRcbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZygnUk9VVEUgQ0hBTk5FTCBWU0kgJywgeyBwbCB9KVxuXG4gICAgU3B5bmVDaGFubmVsUm91dGUuY2hlY2tGb3JFdmVudE1ldGhvZHMocGwpXG4gICAgcGwgPSB0aGlzLmNoZWNrRm9yRW5kUm91dGUocGwpXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdldERhdGFGcm9tUGFyYW1zKHBsKVxuXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IHByb3AoJ3NyY0VsZW1lbnQnLCBwbClcbiAgICBjb25zdCBldmVudCA9IHByb3AoJ2V2ZW50JywgcGwpXG4gICAgY29uc3QgY2hhbmdlTG9jYXRpb25Cb29sID0gIXBheWxvYWQuaXNIaWRkZW5cbiAgICBjb25zdCBrZXl3b3JkQXJycyA9IHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMuY29tcGFyZShwYXlsb2FkLnJvdXRlRGF0YSwgcGF5bG9hZC5wYXRocylcblxuICAgIHBheWxvYWQgPSByTWVyZ2UocGF5bG9hZCwga2V5d29yZEFycnMpXG4gICAgdGhpcy5zZW5kUm91dGVTdHJlYW0ocGF5bG9hZCwgY2hhbmdlTG9jYXRpb25Cb29sKVxuXG4gICAgcGF5bG9hZCA9IFNweW5lQ2hhbm5lbFJvdXRlLnJlbW92ZVNTSUQocGF5bG9hZClcblxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsXG4gICAgICB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMocm91dGVWYWx1ZSwgcmVnZXhUb2tlbk9iaikge1xuICAgIGNvbnN0IHRva2VuS2V5c0FyciA9IGtleXMocmVnZXhUb2tlbk9iailcblxuICAgIHJldHVybiB0b2tlbktleXNBcnJcbiAgfVxuXG4gIHNlbmRSb3V0ZVN0cmVhbShwYXlsb2FkLCBjaGFuZ2VXaW5kb3dMb2MgPSB0cnVlKSB7XG4gICAgaWYgKGNoYW5nZVdpbmRvd0xvYyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZXRXaW5kb3dMb2NhdGlvbihwYXlsb2FkKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVN0YXRlKCkge1xuICAgIHJldHVybiAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gIH1cblxuICBzdGF0aWMgZ2V0SXNEZWVwTGlua0Jvb2woaXNIaXN0b3J5KSB7XG4gICAgcmV0dXJuIGlzSGlzdG9yeSA9PT0gZmFsc2UgJiYgdGhpcy5fcm91dGVDb3VudCA9PT0gMFxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlQ291bnQoaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5fcm91dGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9yb3V0ZUNvdW50ID0gMFxuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlQ291bnRcbiAgICB9XG4gICAgaWYgKGlzSGlzdG9yeSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3JvdXRlQ291bnQgKz0gMVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcm91dGVDb3VudFxuICB9XG5cbiAgc3RhdGljIGdldEV4dHJhUGF5bG9hZFBhcmFtcyhjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBjb25zdCByb3V0ZUNvdW50ID0gdGhpcy5nZXRSb3V0ZUNvdW50KGlzSGlzdG9yeSlcbiAgICBjb25zdCBpc0RlZXBMaW5rID0gdGhpcy5nZXRJc0RlZXBMaW5rQm9vbChpc0hpc3RvcnkpXG4gICAgY29uc3QgaXNIYXNoID0gY29uZmlnLmlzSGFzaFxuICAgIGNvbnN0IGlzSGlkZGVuID0gY29uZmlnLmlzSGlkZGVuXG4gICAgY29uc3Qgcm91dGVUeXBlID0gY29uZmlnLnR5cGVcbiAgICByZXR1cm4geyByb3V0ZUNvdW50LCBpc0RlZXBMaW5rLCBpc0hhc2gsIGlzSGlzdG9yeSwgaXNIaWRkZW4sIHJvdXRlVHlwZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0RGF0YUZyb21QYXJhbXMocGwsIGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uKSB7XG4gICAgbGV0IHJvdXRlRGF0YSA9IHByb3AoJ3BheWxvYWQnLCBwbClcblxuICAgIGNvbnN0IHJvdXRlVmFsdWUgPSB0aGlzLmdldFJvdXRlU3RyRnJvbVBhcmFtcyhyb3V0ZURhdGEsIGNvbmZpZylcblxuICAgIC8vIFdJTkRPVyBMT0NBVElPTiBIQVNOJ1QgQkVFTiBDSEFOR0VEIFlFVCwgU08gV0lMTCBHRVQgU1RSIFBBUkFNU1xuICAgIGNvbnN0IGdldFByb3BGcm9tQ29uZmlnID0gKHBycCwgZGVmYWx0KSA9PiBkZWZhdWx0VG8oZGVmYWx0LCBwcm9wKHBycCwgY29uZmlnKSlcbiAgICBjb25zdCB0eXBlRm9yU3RyID0gZ2V0UHJvcEZyb21Db25maWcoJ3R5cGUnLCAnc2xhc2gnKVxuICAgIGNvbnN0IGlzSGFzaEZvclN0ciA9IGdldFByb3BGcm9tQ29uZmlnKCdpc0hhc2gnLCBmYWxzZSlcbiAgICBjb25zdCBuZXh0V2luZG93TG9jID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5mb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uKHJvdXRlVmFsdWUpXG4gICAgY29uc3QgZGF0YUZyb21TdHIgPSB0aGlzLmdldERhdGFGcm9tTG9jYXRpb25TdHIodHlwZUZvclN0ciwgaXNIYXNoRm9yU3RyLCBuZXh0V2luZG93TG9jKVxuXG4gICAgY29uc3QgeyBwYXRoSW5uZXJtb3N0LCBwYXRocyB9ID0gZGF0YUZyb21TdHJcblxuICAgIHJvdXRlRGF0YSA9IHJNZXJnZShkYXRhRnJvbVN0ci5yb3V0ZURhdGEsIHJvdXRlRGF0YSlcblxuICAgIGNvbnN0IHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCBpc0hpc3RvcnksIGlzSGlkZGVuLCByb3V0ZVR5cGUgfSA9IHRoaXMuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zKFxuICAgICAgY29uZmlnKVxuICAgIHJldHVybiB7XG4gICAgICBpc0RlZXBMaW5rLFxuICAgICAgcm91dGVDb3VudCxcbiAgICAgIHBhdGhJbm5lcm1vc3QsXG4gICAgICBwYXRocyxcbiAgICAgIHJvdXRlRGF0YSxcbiAgICAgIHJvdXRlVmFsdWUsXG4gICAgICBpc0hhc2gsXG4gICAgICBpc0hpZGRlbixcbiAgICAgIGlzSGlzdG9yeSxcbiAgICAgIHJvdXRlVHlwZVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXREYXRhRnJvbVN0cmluZyhjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBjb25zdCB0eXBlID0gY29uZmlnLnR5cGVcbiAgICBjb25zdCBoYXNoSXNUcnVlID0gY29uZmlnLmlzSGFzaCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHN0ciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZ2V0TG9jYXRpb25TdHJCeVR5cGUodHlwZSwgaGFzaElzVHJ1ZSlcbiAgICBjb25zdCB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFBhcmFtc0Zyb21Sb3V0ZVN0cihcbiAgICAgIHN0ciwgY29uZmlnLCB0eXBlKVxuICAgIGNvbnN0IHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCByb3V0ZVR5cGUsIGlzSGlkZGVuIH0gPSB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyhcbiAgICAgIGNvbmZpZywgaXNIaXN0b3J5KVxuXG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgaXNEZWVwTGluayxcbiAgICAgIHJvdXRlQ291bnQsXG4gICAgICBwYXRoSW5uZXJtb3N0LFxuICAgICAgcGF0aHMsXG4gICAgICByb3V0ZURhdGEsXG4gICAgICByb3V0ZVZhbHVlLFxuICAgICAgaXNIYXNoLFxuICAgICAgaXNIaWRkZW4sXG4gICAgICBpc0hpc3RvcnksXG4gICAgICByb3V0ZVR5cGVcbiAgICB9XG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGdldERhdGFGcm9tTG9jYXRpb25TdHIodCA9ICdzbGFzaCcsIGlzSGFzaCA9IHRoaXMucm91dGVDb25maWdKc29uLmlzSGFzaCwgbG9jID0gd2luZG93LmxvY2F0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMucm91dGVDb25maWdKc29uICE9PSB1bmRlZmluZWRcbiAgICAgID8gdGhpcy5yb3V0ZUNvbmZpZ0pzb24udHlwZVxuICAgICAgOiB0XG5cbiAgICBjb25zdCBzdHIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmdldExvY2F0aW9uU3RyQnlUeXBlKHR5cGUsIGlzSGFzaCwgbG9jKVxuICAgIGNvbnN0IHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9ID0gdGhpcy5nZXRQYXJhbXNGcm9tUm91dGVTdHIoXG4gICAgICBzdHIsIHRoaXMucm91dGVDb25maWdKc29uLCB0eXBlKVxuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuZ2V0Um91dGVTdGF0ZSgpXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSwgYWN0aW9uIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvbkRhdGEoKSB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbXNBcnIgPSBbXG4gICAgICAnaHJlZicsXG4gICAgICAnb3JpZ2luJyxcbiAgICAgICdwcm90b2NvbCcsXG4gICAgICAnaG9zdCcsXG4gICAgICAnaG9zdG5hbWUnLFxuICAgICAgJ3BvcnQnLFxuICAgICAgJ3BhdGhuYW1lJyxcbiAgICAgICdzZWFyY2gnLFxuICAgICAgJ2hhc2gnXVxuICAgIHJldHVybiBwaWNrQWxsKGxvY2F0aW9uUGFyYW1zQXJyLCB3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVTdHJGcm9tUGFyYW1zKHBhcmFtc0RhdGEsIHJvdXRlQ29uZmlnLCB0KSB7XG4gICAgY29uc3QgdHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByb3V0ZUNvbmZpZy50eXBlXG4gICAgY29uc3Qgb2JqID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jb252ZXJ0UGFyYW1zVG9Sb3V0ZShwYXJhbXNEYXRhLCByb3V0ZUNvbmZpZywgdHlwZSlcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgZ2V0UGFyYW1zRnJvbVJvdXRlU3RyKHN0ciwgcm91dGVDb25maWcsIHQpIHtcbiAgICBjb25zdCB0eXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHJvdXRlQ29uZmlnLnR5cGVcbiAgICBjb25zdCBvYmogPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRSb3V0ZVRvUGFyYW1zKHN0ciwgcm91dGVDb25maWcsIHR5cGUpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgY2hlY2tFbXB0eVJvdXRlU3RyKHN0ciwgaXNIYXNoID0gZmFsc2UpIHtcbiAgICBjb25zdCBpc0VtcHR5Qm9vbCA9IGlzRW1wdHkoc3RyKVxuICAgIGNvbnN0IHBhdGhOYW1lSXNFbXB0eUJvb2wgPSBpc0VtcHR5Qm9vbCA9PT0gdHJ1ZSAmJiBpc0hhc2ggPT09IGZhbHNlXG4gICAgY29uc3QgaGFzaE5hbWVJc0VtcHR5Qm9vbCA9IGlzRW1wdHlCb29sID09PSB0cnVlICYmIGlzSGFzaCA9PT0gdHJ1ZVxuICAgIGNvbnN0IGhhc2hOYW1lQm9vbCA9IGlzRW1wdHlCb29sID09PSBmYWxzZSAmJiBpc0hhc2ggPT09IHRydWVcblxuICAgIGlmIChwYXRoTmFtZUlzRW1wdHlCb29sID09PSB0cnVlIHx8IGhhc2hOYW1lSXNFbXB0eUJvb2wgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiAnLydcbiAgICB9IGVsc2UgaWYgKGhhc2hOYW1lQm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGNvbmNhdCgnIycsIHN0cilcbiAgICB9XG4gICAgcmV0dXJuIHN0clxuICB9XG5cbiAgc3RhdGljIHJlbW92ZUxhc3RTbGFzaChzdHIpIHtcbiAgICBjb25zdCByZSA9IC9eKC4qKShcXC8pJC9cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UocmUsICckMScpXG4gIH1cblxuICBzZXRXaW5kb3dMb2NhdGlvbihjaGFubmVsUGF5bG9hZCkge1xuICAgIGxldCB7IGlzSGFzaCwgcm91dGVWYWx1ZSwgcm91dGVUeXBlIH0gPSBjaGFubmVsUGF5bG9hZFxuICAgIHJvdXRlVmFsdWUgPSB0aGlzLmNoZWNrRW1wdHlSb3V0ZVN0cihyb3V0ZVZhbHVlLCBpc0hhc2gpXG4gICAgY29uc3QgeyByb3V0ZUNvdW50IH0gPSBjaGFubmVsUGF5bG9hZFxuICAgIGlmIChpc0hhc2ggPT09IHRydWUgfHwgcm91dGVUeXBlID09PSAncXVlcnknKSB7XG4gICAgICBjb25zdCBwYXRoTmFtZSA9IFNweW5lQ2hhbm5lbFJvdXRlLnJlbW92ZUxhc3RTbGFzaCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpXG4gICAgICByb3V0ZVZhbHVlID0gcGF0aE5hbWUgKyByb3V0ZVZhbHVlXG4gICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoeyByb3V0ZUNvdW50IH0sICcnLCByb3V0ZVZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjaGVja0ZvclNsYXNoID0gd2hlbihcbiAgICAgICAgY29tcG9zZShjb21wbGVtZW50KGVxdWFscygnLycpKSwgaGVhZCksIGNvbmNhdCgnLycsIF9fKSlcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7IHJvdXRlQ291bnQgfSwgJycsIGNoZWNrRm9yU2xhc2gocm91dGVWYWx1ZSkpXG4gICAgfVxuICB9XG5cbiAgZ2V0V2luZG93TG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSAvLyBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuICB9XG5cbiAgYmluZFN0YXRpY01ldGhvZHMoKSB7XG4gICAgdGhpcy5jaGVja0ZvckVuZFJvdXRlID0gU3B5bmVDaGFubmVsUm91dGUuY2hlY2tGb3JFbmRSb3V0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRJc0RlZXBMaW5rQm9vbCA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldElzRGVlcExpbmtCb29sLmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tTG9jYXRpb25TdHIgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXREYXRhRnJvbUxvY2F0aW9uU3RyLmJpbmQoXG4gICAgICB0aGlzKVxuICAgIHRoaXMub25JbmNvbWluZ0RvbUV2ZW50ID0gU3B5bmVDaGFubmVsUm91dGUub25JbmNvbWluZ0RvbUV2ZW50LmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tU3RyaW5nID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RGF0YUZyb21TdHJpbmcuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyLmJpbmQodGhpcylcbiAgICB0aGlzLmdldExvY2F0aW9uRGF0YSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldExvY2F0aW9uRGF0YS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRSb3V0ZVN0YXRlID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0Um91dGVTdGF0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXREYXRhRnJvbVBhcmFtcyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldERhdGFGcm9tUGFyYW1zLmJpbmQodGhpcylcbiAgICB0aGlzLmdldFJvdXRlQ291bnQgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRSb3V0ZUNvdW50LmJpbmQodGhpcylcbiAgICB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldEV4dHJhUGF5bG9hZFBhcmFtcy5iaW5kKHRoaXMpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhKClcbiAgfVxuXG4gIGJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKSB7XG4gICAgY29uc3QgY3VycmllZEdldFJvdXRlID0gY3VycnlOKDMsIFNweW5lQ2hhbm5lbFJvdXRlLmdldFJvdXRlU3RyRnJvbVBhcmFtcylcbiAgICB0aGlzLmdldFJvdXRlU3RyRnJvbVBhcmFtcyA9IGN1cnJpZWRHZXRSb3V0ZShfXywgdGhpcy5yb3V0ZUNvbmZpZ0pzb24sXG4gICAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbi50eXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGVxdWFscywgcGF0aCwgY29tcG9zZSwgcHJvcCwgZmlsdGVyLCByZXBsYWNlLCBsZW5zUHJvcCwgb3Zlciwgb21pdCwgdGVzdCwga2V5cywgZWl0aGVyLCB0b1VwcGVyIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxVSSBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxVSVxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgQ2hhbm5lbCBsaXN0ZW5zIHRvIGFsbCBVc2VyIEV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzZXQgdG8gYnJvYWRjYXN0IGJ5IFZpZXdTdHJlYW0gaW5zdGFuY2VzLCB1c2luZyB0aGUgYnJvYWRDYXN0RXZlbnRzIG1ldGhvZC48L3A+XG4gICAqIDxwPkhUTUwgRWxlbWVudHMgdGhhdCBoYXZlIHRoZWlyIGRhdGEgY2hhbm5lbCBwcm9wZXJ0eSBzZXQgdG8gXCJST1VURVwiIHdpbGwgYnJvYWRjYXN0IHRoZWlyIHVpIGV2ZW50IHRvIHRoYXQgY2hhbm5lbCBpbnN0ZWFkLjwvcD5cbiAgICogPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZSBtb2RhbC1idG4nICBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS12YWx1ZT0ndWlFdmVudHMnPlZpZXcgVUkgRXZlbnRzPC9kaXY+PC9icj48L2JyPlxuICAgKiA8cD5TZWUgTElOS1snVmlld1N0cmVhbScsICd2aWV3LXN0cmVhbSddIGZvciBhbiBleGFtcGxlIG9uIGhvdyB0byBiaW5kIEhUTUwgRWxlbWVudHMgdG8gdGhlIFVJIENoYW5uZWwuPC9wPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfVUknO1xuICAgKlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihuYW1lID0gJ0NIQU5ORUxfVUknLCBwcm9wcyA9IHt9KSB7XG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSBmYWxzZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICAgIHRoaXMua2V5RXZlbnRzTG9hZGVkID0gZmFsc2VcbiAgICB0aGlzLmtleUNvZGVBcnIgPSBbXVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1VJX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUJPUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUREVFJBQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUZURVJQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BRlRFUlNDUklQVEVYRUNVVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05JVEVSQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVBQSU5TVEFMTEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVRElPRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVRElPU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVVYQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFR0lORVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkxPQ0tFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CTFVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JPVU5EQVJZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JVRkZFUkVEQU1PVU5UTE9XX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5QTEFZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NBTlBMQVlUSFJPVUdIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTE9TRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTE9TSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBMRVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09NUE9TSVRJT05VUERBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OTkVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05ORUNUSU9OU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OVEVOVERFTEVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05URVhUTUVOVV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT1BZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NVRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREFUQUNIQU5ORUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREJMQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREVWSUNFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RFVklDRU1PVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ERVZJQ0VPUklFTlRBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR0VOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJPUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EVVJBVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTVBUSUVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRFVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTlRFUlBJQ1RVUkVJTlBJQ1RVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT0NVU09VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT1JNREFUQV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GVUxMU0NSRUVOQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZVTExTQ1JFRU5FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HQU1FUEFEQ09OTkVDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dBTUVQQURESVNDT05ORUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0FUSEVSSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0VTVFVSRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HRVNUVVJFRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dFU1RVUkVTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HT1RQT0lOVEVSQ0FQVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9IQVNIQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUNBTkRJREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDQU5ESURBVEVFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDT05ORUNUSU9OU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFR0FUSEVSSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5QVVRTT1VSQ0VTQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOU1RBTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5WQUxJRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9LRVlET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0tFWVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xBTkdVQUdFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xFQVZFUElDVFVSRUlOUElDVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFRERBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BREVETUVUQURBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BREVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FEU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9TVFBPSU5URVJDQVBUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01BUktfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUVSQ0hBTlRWQUxJREFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FU1NBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUVTU0FHRUVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRUVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01VVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTkVHT1RJQVRJT05ORUVERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTk9NQVRDSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9OT1RJRklDQVRJT05DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PRkZMSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09OTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PUEVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09SSUVOVEFUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBR0VISURFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBR0VTSE9XX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBU1RFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBVVNFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBWUVSREVUQUlMQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBWU1FTlRNRVRIT0RDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUExBWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QTEFZSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJDQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkRPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTE9DS0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTE9DS0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUk9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUlVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPUFNUQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BST0dSRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BVU0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUFVTSFNVQlNDUklQVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFQURZU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVKRUNUSU9OSEFORExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRU1PVkVUUkFDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRU1PVkVTVFJFQU1fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVQRUFURVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTRVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTSVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU09VUkNFVElNSU5HQlVGRkVSRlVMTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNVTFRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTVU1FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NDUk9MTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUFSQ0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VFS0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFRUtJTkdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVEVEQ0FORElEQVRFUEFJUkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NISVBQSU5HQUREUkVTU0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSElQUElOR09QVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSUdOQUxJTkdTVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TTE9UQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NPVU5ERU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NPVU5EU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1BFRUNIRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NQRUVDSFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NRVUVFWkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1FVRUVaRUVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUVVFRVpFU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVE9SQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NVQk1JVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVUNDRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NVU1BFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVElNRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9USU1FVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPR0dMRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT05FQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNIQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNIRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNITU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OUlVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VTkhBTkRMRURSRUpFQ1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VOTVVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VUEdSQURFTkVFREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZFUlNJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVklTSUJJTElUWUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WT0lDRVNDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZPTFVNRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlBQ1RJVkFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlCTFVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUNPTk5FQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZREVBQ1RJVkFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlESVNDT05ORUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUZPQ1VTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBPSU5URVJSRVNUUklDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBPSU5URVJVTlJFU1RSSUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZUFJFU0VOVENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XQUlUSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQkdMQ09OVEVYVENSRUFUSU9ORVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCR0xDT05URVhUTE9TVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJHTENPTlRFWFRSRVNUT1JFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRVdJTExCRUdJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XSEVFTF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBsb2FkS2V5U3RyZWFtKCkge1xuICAgIGNvbnN0IGtleVVwcyA9IE9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAna2V5dXAnKVxuICAgIGNvbnN0IGZpbHRlcktleXMgPSBlID0+IHRoaXMua2V5Q29kZUFyci5pbmRleE9mKGUua2V5Q29kZSkgPj0gMFxuICAgIHRoaXMua2V5UHJlc3NlcyQgPSBrZXlVcHMuZ3JvdXBCeShlID0+IGUua2V5Q29kZSlcbiAgICAgIC5tZXJnZUFsbCgpXG4gICAgICAuZmlsdGVyKGZpbHRlcktleXMpXG4gICAgICAucmVwZWF0KClcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vbktleVByZXNzZWQuYmluZCh0aGlzKSlcbiAgfVxuXG4gIGFkZEtleUV2ZW50KG51bSkge1xuICAgIGlmICh0aGlzLmtleUV2ZW50c0xvYWRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubG9hZEtleVN0cmVhbSgpXG4gICAgfVxuICAgIHRoaXMua2V5RXZlbnRzTG9hZGVkID0gdHJ1ZVxuICAgIHRoaXMucmVnaXN0ZXJLZXkobnVtKVxuICB9XG5cbiAgcmVnaXN0ZXJLZXkoYykge1xuICAgIHRoaXMua2V5Q29kZUFyci5wdXNoKGMpXG4gIH1cblxuICBvbktleVByZXNzZWQoZXZ0KSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2tleSBpcyAnLCBldnQpO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZVNTSUQocGwpIHtcbiAgICBjb25zdCByb3V0ZUxlbnMgPSBsZW5zUHJvcChbJ3BheWxvYWQnXSlcbiAgICBjb25zdCBvbWl0U1NJRCA9IG92ZXIocm91dGVMZW5zLCBvbWl0KFsndnNpZCddKSlcbiAgICByZXR1cm4gb21pdFNTSUQocGwpXG4gIH1cblxuICBvbkluY29taW5nT2JzZXJ2YWJsZShvYmopIHtcbiAgICBjb25zdCBlcXNOYW1lID0gZXF1YWxzKG9iai5uYW1lLCB0aGlzLnByb3BzLm5hbWUpXG4gICAgb2JqLmRhdGEgPSBTcHluZUNoYW5uZWxVSS5yZW1vdmVTU0lEKG9iai5kYXRhKVxuICAgIGNvbnN0IHsgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JqLmRhdGFcbiAgICBjb25zdCBkYXRhT2JqID0gb2JzVmFsID0+ICh7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50OiBvYnNWYWwgfSlcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAob2JqKSA9PiBvYmoub2JzZXJ2YWJsZS5waXBlKG1hcChkYXRhT2JqKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vblVJRXZlbnQuYmluZCh0aGlzKSlcbiAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge31cbiAgICByZXR1cm4gZXFzTmFtZSA9PT0gdHJ1ZSA/IG9uU3VjY2VzcyhvYmopIDogb25FcnJvcigpXG4gIH1cblxuICBnZXRBY3Rpb25TdGF0ZSh2YWwpIHtcbiAgICBjb25zdCB0eXBlVmFsID0gcGF0aChbJ2V2ZW50JywgJ3R5cGUnXSlcbiAgICBjb25zdCB0eXBlT3ZlclJpZGVWYWwgPSBwYXRoKFsnZXZlbnQnLCAndHlwZU92ZXJSaWRlJ10pXG4gICAgY29uc3QgZXZlbnRUeXBlID0gY29tcG9zZSh0b1VwcGVyLCBlaXRoZXIodHlwZU92ZXJSaWRlVmFsLCB0eXBlVmFsKSlcbiAgICBjb25zdCB0eXBlID0gZXZlbnRUeXBlKHZhbClcbiAgICBjb25zdCBtYWluQWN0aW9uID0gJ0NIQU5ORUxfVUknXG4gICAgcmV0dXJuIHR5cGUgIT09IHVuZGVmaW5lZCA/IGAke21haW5BY3Rpb259XyR7dHlwZX1fRVZFTlRgIDogbWFpbkFjdGlvblxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yRXZlbnRNZXRob2RzKG9icykge1xuICAgIGNvbnN0IHJlID0gL14oZXZlbnQpKFtBLVpdLiopKFtBLVpdLiopJC9nbVxuICAgIGNvbnN0IGdldE1ldGhvZHMgPSBjb21wb3NlKGZpbHRlcih0ZXN0KHJlKSksIGtleXMsIHByb3AoJ3BheWxvYWQnKSlcbiAgICBjb25zdCBtZXRob2RzQXJyID0gZ2V0TWV0aG9kcyhvYnMpXG4gICAgaWYgKG1ldGhvZHNBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGV2dCA9IHByb3AoJ2V2ZW50Jywgb2JzKVxuICAgICAgaWYgKGV2dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZFVwZGF0ZSA9IChtYXRjaCwgcDEsIHAyLCBwMywgcDQpID0+IFN0cmluZyhwMikudG9Mb3dlckNhc2UoKSArIHAzICsgcDRcbiAgICAgICAgY29uc3QgbWV0aG9kU3RyUmVwbGFjZSA9IHJlcGxhY2UoL14oZXZlbnQpKFtBLVpdKSguKikoW0EtWl0uKikkL2dtLCBtZXRob2RVcGRhdGUpXG4gICAgICAgIGNvbnN0IHJ1bk1ldGhvZCA9IChtZXRob2RTdHIpID0+IHtcbiAgICAgICAgICBjb25zdCBtID0gbWV0aG9kU3RyUmVwbGFjZShtZXRob2RTdHIpXG4gICAgICAgICAgaWYgKGV2dFttXSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAoZXZ0W21dKSA9PT0gJ2Z1bmN0aW9uJykgeyBldnRbbV0oKSB9XG4gICAgICAgIH1cbiAgICAgICAgbWV0aG9kc0Fyci5mb3JFYWNoKHJ1bk1ldGhvZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JzXG4gIH1cblxuICBvblVJRXZlbnQob2JzKSB7XG4gICAgZnVuY3Rpb24gZG9tU3RyaW5nTWFwVG9PYmplY3QoZG9tU3RyaW5nTWFwKSB7XG4gICAgICBjb25zdCBvYmogPSB7fVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZG9tU3RyaW5nTWFwKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl04oCZcyBhIGRpcmVjdCBwcm9wZXJ0eSAodGhvdWdoIGRhdGFzZXQgcmFyZWx5IGhhcyBhbnl0aGluZyBvbiB0aGUgcHJvdG90eXBlKTpcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkb21TdHJpbmdNYXAsIGtleSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IGRvbVN0cmluZ01hcFtrZXldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpcbiAgICB9XG5cbiAgICBvYnMucGF5bG9hZCA9IGRvbVN0cmluZ01hcFRvT2JqZWN0KG9icz8uc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpID8/IG9icy5wYXlsb2FkXG5cbiAgICBTcHluZUNoYW5uZWxVSS5jaGVja0ZvckV2ZW50TWV0aG9kcyhvYnMpXG4gICAgb2JzLmFjdGlvbiA9IHRoaXMuZ2V0QWN0aW9uU3RhdGUob2JzKVxuICAgIGNvbnN0IGFjdGlvbiA9IG9icy5hY3Rpb24vLyB0aGlzLmdldEFjdGlvblN0YXRlKG9icyk7XG4gICAgLy8gY29uc3QgeyBzcmNFbGVtZW50IH0gPSBvYnNcbiAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQgfSA9IG9ic1xuXG4gICAgY29uc3QgZXZlbnQgPSBvYnMuZXZlbnRcbiAgICAvLyBjb25zdCBwYXlsb2FkID0gZG9tU3RyaW5nTWFwVG9PYmplY3Qoc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpID8/IG9icy5wYXlsb2FkXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsV2luZG93IH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC13aW5kb3cuanMnXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAsIGRlYm91bmNlVGltZSwgc2tpcFdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjdXJyeSwgcGljaywgcGFydGlhbFJpZ2h0LCBtYXBPYmpJbmRleGVkLCBhcHBseSwgbWFwIGFzIHJNYXAgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxXaW5kb3cgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsV2luZG93XG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhlIFdpbmRvdyBDaGFubmVsIHdpbGwgbGlzdGVuIHRvIHdpbmRvdyBhbmQgZG9jdW1lbnQgZXZlbnRzIHRoYXQgYXJlIHNldCBpbiBpdHMgY29uZmlndXJhdGlvbiBmaWxlXG4gICAqIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUgbW9kYWwtYnRuJyAgZGF0YS10eXBlPSdtb2RhbC13aW5kb3cnIGRhdGEtdmFsdWU9J3dpbmRvd0V2ZW50cyc+VmlldyBXaW5kb3cgRXZlbnRzPC9kaXY+PC9icj48L2JyPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IENIQU5ORUxfTkFNRVxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcgLSA9IHt9OyBUaGUgY29uZmlnIGhhcyBzZXZlcmFsIG9wdGlvbnMgdXNlZCB0byBsaXN0ZW4gdG8gd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IGNvbmZpZy5ldmVudHMgLSA9IFtdOyBBbnkgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMgY2FuIGJlIGFkZGVkIGhlcmUuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcubWVkaWFRdWVyaWVzIC0gPSB7fTsgTWVkaWEgcXVlcmllcyBhcmUgYWRkZWQgYXMga2V5LHZhbHVlIHBhaXJzOyB0aGUga2V5IGlzIHRoZSBuYW1lIG9mIHRoZSBib29sZWFuIGZvciB0aGUgcXVlcnksIHRoZSB2YWx1ZSBpcyB0aGUgcXVlcnkgaXRzZWxmLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5saXN0ZW5Gb3JSZXNpemUgLSA9IHRydWU7IFRoaXMgaXMgZGVmYXVsdCBsaXN0ZW5pbmcgZm9yIHJlc2l6ZSBldmVudC5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcubGlzdGVuRm9yT3JpZW50YXRpb24gLSA9IHRydWU7IExpc3RlbiBmb3IgaG9yaXpvbnRhbCBhbmQgbGFuZHNjYXBlIG9yaWVudGF0aW9uIGNoYW5nZXMgb24gbW9iaWxlIGRldmljZXMuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmxpc3RlbkZvck1vdXNlV2hlZWwgLSA9IGZhbHNlOyBJZiBzZXQgdG8gdHJ1ZSwgd2lsbCBsaXN0ZW4gZm9yIG1vdXNlV2hlZWwgYW5kIHdpbGwgYWRkIGRpcmVjdGlvbiBhbmQgZGlzdGFuY2UgcGFyYW1ldGVycy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JSZXNpemUgLSA9IDIwMDsgVGhlIHRpbWUgYmV0d2VlbiByZXNpemUgZXZlbnRzIGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGwgLSA9IDE1MDsgVGhlIHRpbWUgYmV0d2VlbiBzY3JvbGwgZXZlbnRzIGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfV0lORE9XJztcbiAgICpcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKENIQU5ORUxfTkFNRSA9ICdDSEFOTkVMX1dJTkRPVycpIHtcbiAgICBzdXBlcihDSEFOTkVMX05BTUUpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kcygpXG4gICAgdGhpcy5jdXJyZW50U2Nyb2xsWSA9IDBcbiAgfVxuXG4gIGluaXRpYWxpemVTdHJlYW0oKSB7XG4gICAgdGhpcy5kb21DaGFubmVsQ29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5XSU5ET1dcbiAgICBjb25zdCBvYnMkQXJyID0gdGhpcy5nZXRBY3RpdmVPYnNlcnZhYmxlcygpXG4gICAgY29uc3QgZG9tJCA9IG1lcmdlKC4uLm9icyRBcnIpXG4gICAgdGhpcy5kb20kID0gZG9tJFxuICAgIGRvbSQuc3Vic2NyaWJlKHAgPT4ge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgZ2V0TW91c2VXaGVlbE1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVFxuICAgIGNvbnN0IHNjcm9sbERpciA9IGV2ZW50LmRlbHRhWSA8PSAwID8gJ3VwJyA6ICdkb3duJ1xuICAgIGNvbnN0IHsgZGVsdGFYLCBkZWx0YVksIGRlbHRhWiB9ID0gZXZlbnRcbiAgICBjb25zdCBwYXlsb2FkID0geyBzY3JvbGxEaXIsIGRlbHRhWCwgZGVsdGFZLCBkZWx0YVogfVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQ3VycmllZEdlbmVyaWNFdmVudChhY3Rpb25TdHIpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBgQ0hBTk5FTF9XSU5ET1dfJHthY3Rpb25TdHIudG9VcHBlckNhc2UoKX1fRVZFTlRgXG4gICAgY29uc3QgY3VycnlGbiA9IGN1cnJ5KFNweW5lQ2hhbm5lbFdpbmRvdy5tYXBHZW5lcmljRXZlbnQpXG4gICAgcmV0dXJuIGN1cnJ5Rm4oYWN0aW9uKVxuICB9XG5cbiAgc3RhdGljIG1hcEdlbmVyaWNFdmVudChhY3RuLCBldmVudCkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwibWFwIGdlbmVyaWMgZXZlbnQgXCIsYWN0bik7XG4gICAgY29uc3QgYWN0aW9uID0gYWN0blxuICAgIGNvbnN0IHBheWxvYWQgPSBldmVudFxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgZ2V0UmVzaXplTWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX1JFU0laRV9FVkVOVFxuICAgIGNvbnN0IHBheWxvYWQgPSBwaWNrKFxuICAgICAgWydpbm5lcldpZHRoJywgJ2lubmVySGVpZ2h0JywgJ291dGVyV2lkdGgnLCAnb3V0ZXJIZWlnaHQnXSwgd2luZG93KVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgZ2V0T3JpZW50YXRpb25NYXBGbihldmVudCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9XSU5ET1dfT1JJRU5UQVRJT05fRVZFTlRcbiAgICBjb25zdCBvcmllbnRhdGlvblN0ciA9ICcob3JpZW50YXRpb246IHBvcnRyYWl0KSdcbiAgICBjb25zdCBpc1BvcnRyYWl0Qm9vbCA9IHdpbmRvdy5tYXRjaE1lZGlhKG9yaWVudGF0aW9uU3RyKS5tYXRjaGVzXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soXG4gICAgICBbJ2lubmVyV2lkdGgnLCAnaW5uZXJIZWlnaHQnLCAnb3V0ZXJXaWR0aCcsICdvdXRlckhlaWdodCddLCB3aW5kb3cpXG4gICAgcGF5bG9hZC5vcmllbnRhdGlvbiA9IGlzUG9ydHJhaXRCb29sID09PSB0cnVlXG4gICAgICA/ICdwb3J0cmFpdCdcbiAgICAgIDogJ2xhbmRzY2FwZSdcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgZ2V0TWVkaWFRdWVyeU1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19NRURJQV9RVUVSWV9FVkVOVFxuICAgIGNvbnN0IHBheWxvYWQgPSBwaWNrKFsnbWF0Y2hlcycsICdtZWRpYScsICdtZWRpYVF1ZXJ5TmFtZSddLCBldmVudClcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgY3JlYXRlTW91c2VXaGVlbE9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgZGVib3VuY2VUID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsXG5cbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgnd2hlZWwnLFxuICAgICAgU3B5bmVDaGFubmVsV2luZG93LmdldE1vdXNlV2hlZWxNYXBGbi5iaW5kKHRoaXMpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZShkZWJvdW5jZVQpXG4gICAgICApXG4gIH1cblxuICBzdGF0aWMgZ2V0U2Nyb2xsRGF0YSgpIHtcbiAgICBsZXQgY3VycmVudFNjcm9sbFkgPSAwXG5cbiAgICBjb25zdCBnZXRTY3JvbGxEYXRhID0gKHNjcm9sbFkpID0+IHtcbiAgICAgIGNvbnN0IHNjcm9sbERpc3RhbmNlID0gY3VycmVudFNjcm9sbFkgLSBzY3JvbGxZXG4gICAgICBjb25zdCBzY3JvbGxEaXIgPSBzY3JvbGxEaXN0YW5jZSA+PSAwID8gJ3VwJyA6ICdkb3duJ1xuICAgICAgY3VycmVudFNjcm9sbFkgPSBzY3JvbGxZXG4gICAgICByZXR1cm4geyBzY3JvbGxZLCBzY3JvbGxEaXN0YW5jZSwgc2Nyb2xsRGlyIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFNjcm9sbERhdGFcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxZKHNjcm9sbEVsZW1lbnQpIHtcbiAgICByZXR1cm4gc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldCAhPT0gdW5kZWZpbmVkID8gc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldCA6IHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wXG4gIH1cblxuICBzdGF0aWMgZ2V0U2Nyb2xsTWFwRm4oZXZlbnQsIGludGVydmFsLCBhY3Rpb24sIHNjcm9sbERhdGFGbiwgc2Nyb2xsRWxlbWVudCkge1xuICAgIGNvbnN0IHNjcm9sbFkgPSBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0U2Nyb2xsWShzY3JvbGxFbGVtZW50KVxuICAgIGNvbnN0IHBheWxvYWQgPSBzY3JvbGxEYXRhRm4oc2Nyb2xsWSlcbiAgICBjb25zdCB7IHNjcm9sbERpc3RhbmNlIH0gPSBwYXlsb2FkXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIHNjcm9sbERpc3RhbmNlLCBldmVudCB9XG4gIH1cblxuICBjcmVhdGVTY3JvbGxPYnNlcnZhYmxlKGNvbmZpZywgc2Nyb2xsRWxlbWVudCA9IHdpbmRvdywgaXNQYXNzaXZlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHNraXBXaGVuRGlySXNNaXNzaW5nID0gZXZ0ID0+IGV2dC5zY3JvbGxEaXN0YW5jZSA9PT0gMFxuICAgIGNvbnN0IGRUaW1lID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsXG5cbiAgICBjb25zdCBlbGVtZW50ID0gc2Nyb2xsRWxlbWVudFxuXG4gICAgY29uc3QgaXNXaW5kb3cgPSBzY3JvbGxFbGVtZW50ID09PSB3aW5kb3dcblxuICAgIGNvbnN0IHNjcm9sbEVsRm9yVmFscyA9IGNvbmZpZy5zY3JvbGxFbEZvclZhbHMgIT09IHVuZGVmaW5lZCA/IGNvbmZpZy5zY3JvbGxFbEZvclZhbHMgOiBzY3JvbGxFbGVtZW50XG4gICAgY29uc3QgYWN0aW9uID0gaXNXaW5kb3cgPyAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VWRU5UJyA6ICdDSEFOTkVMX1dJTkRPV19FTEVNRU5UX1NDUk9MTF9FVkVOVCdcblxuICAgIGNvbnN0IHNjcm9sbERhdGFGbiA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxEYXRhKClcbiAgICAvLyBjb25zb2xlLmxvZyhcIlNDUk9MTCBFTEVNRU5UIFwiLGFjdGlvbixzY3JvbGxFbGVtZW50LCBzY3JvbGxFbEZvclZhbHMpO1xuICAgIGNvbnN0IHNjcm9sbE1hcEZuID0gcGFydGlhbFJpZ2h0KFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxNYXBGbiwgW2FjdGlvbiwgc2Nyb2xsRGF0YUZuLCBzY3JvbGxFbEZvclZhbHMsIGlzUGFzc2l2ZSwgZWxlbWVudF0pLmJpbmQodGhpcylcblxuICAgIC8vIGNvbnNvbGUubG9nKFwiY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZSBcIiwge3Njcm9sbE1hcEZuLCBzY3JvbGxEYXRhRm4sIGFjdGlvbiwgY29uZmlnLCBzY3JvbGxFbGVtZW50LCBlbGVtZW50fSlcblxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KCdzY3JvbGwnLFxuICAgICAgc2Nyb2xsTWFwRm4sIGlzUGFzc2l2ZSwgZWxlbWVudClcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoZFRpbWUpLFxuICAgICAgICBza2lwV2hpbGUoc2tpcFdoZW5EaXJJc01pc3NpbmcpLFxuICAgICAgICBtYXAocCA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3U2Nyb2xsWSA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxZKGVsZW1lbnQpXG4gICAgICAgICAgcC5wYXlsb2FkLnNjcm9sbERpc3RhbmNlQWJzID0gTWF0aC5hYnModGhpcy5jdXJyZW50U2Nyb2xsWSAtIG5ld1Njcm9sbFkpXG4gICAgICAgICAgdGhpcy5jdXJyZW50U2Nyb2xsWSA9IG5ld1Njcm9sbFlcbiAgICAgICAgICByZXR1cm4gcFxuICAgICAgICB9KVxuICAgICAgKVxuICB9XG5cbiAgY3JlYXRlT3JpZW50YXRpb25PYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYWRkIG9yaWVudGF0aW9uXCIpO29yaWVudGF0aW9uY2hhbmdlXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ29yaWVudGF0aW9uY2hhbmdlJyxcbiAgICAgIFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRPcmllbnRhdGlvbk1hcEZuLmJpbmQodGhpcykpXG4gIH1cblxuICBjcmVhdGVSZXNpemVPYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIGNvbnN0IGRUaW1lID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yUmVzaXplXG4gICAgLy8gY29uc29sZS5sb2coJ3Jlc2l6ZSB0aGlzICcsIHRoaXMpO1xuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ3Jlc2l6ZScsXG4gICAgICBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0UmVzaXplTWFwRm4uYmluZCh0aGlzKSkucGlwZShkZWJvdW5jZVRpbWUoZFRpbWUpKVxuICB9XG5cbiAgZ2V0RXZlbnRzRnJvbUNvbmZpZyhjb25maWcgPSB0aGlzLmRvbUNoYW5uZWxDb25maWcpIHtcbiAgICBjb25zdCBvYnMkQXJyID0gY29uZmlnLmV2ZW50c1xuXG4gICAgY29uc3QgYWRkV2luZG93RXZlbnRUb0FyciA9IHN0ciA9PiB7XG4gICAgICBjb25zdCBtYXBGbiA9IFNweW5lQ2hhbm5lbFdpbmRvdy5jcmVhdGVDdXJyaWVkR2VuZXJpY0V2ZW50KHN0cilcbiAgICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KHN0ciwgbWFwRm4pXG4gICAgfVxuXG4gICAgcmV0dXJuIHJNYXAoYWRkV2luZG93RXZlbnRUb0Fyciwgb2JzJEFycilcbiAgfVxuXG4gIGdldEFjdGl2ZU9ic2VydmFibGVzKGNvbmZpZyA9IHRoaXMuZG9tQ2hhbm5lbENvbmZpZykge1xuICAgIGxldCBvYnMkQXJyID0gW11cblxuICAgIC8vIENIRUNLIFRPIEFERCBNRURJQSBRVUVSWSBPQlNFUlZBQkxFXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uZmlnLmxpc3RlbkZvck1lZGlhUXVlcmllcyA9IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwoXG4gICAgICBjb25maWcubWVkaWFRdWVyaWVzKSB8fCBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKFxuICAgICAgY29uZmlnLm1lZGlhUXVlcmllcylcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBjb25zdCBtZXRob2RzID0ge1xuICAgICAgbGlzdGVuRm9yUmVzaXplOiB0aGlzLmNyZWF0ZVJlc2l6ZU9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvck9yaWVudGF0aW9uOiB0aGlzLmNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yU2Nyb2xsOiB0aGlzLmNyZWF0ZVNjcm9sbE9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvcldoZWVsOiB0aGlzLmNyZWF0ZU1vdXNlV2hlZWxPYnNlcnZhYmxlLmJpbmQodGhpcylcbiAgICB9XG5cbiAgICBjb25zdCBhZGRPYnNlcnZhYmxlVG9BcnIgPSAobWV0aG9kLCBrZXksIGkpID0+IHtcbiAgICAgIGNvbnN0IGFkZE9ic0Jvb2wgPSBjb25maWdba2V5XVxuICAgICAgaWYgKGFkZE9ic0Jvb2wpIHtcbiAgICAgICAgb2JzJEFyci5wdXNoKG1ldGhvZChjb25maWcpKVxuICAgICAgfVxuICAgIH1cblxuICAgIG1hcE9iakluZGV4ZWQoYWRkT2JzZXJ2YWJsZVRvQXJyLCBtZXRob2RzKVxuXG4gICAgLy8gJ2xpc3RlbkZvck1lZGlhUXVlcmllcycgOiB0aGlzLmdldE1lZGlhUXVlcnlPYnNlcnZhYmxlLmJpbmQodGhpcylcbiAgICB0aGlzLmNoZWNrRm9yTWVkaWFRdWVyaWVzKGNvbmZpZy5saXN0ZW5Gb3JNZWRpYVF1ZXJpZXMpXG5cbiAgICBjb25zdCBldmVudHNBcnIgPSB0aGlzLmdldEV2ZW50c0Zyb21Db25maWcoY29uZmlnKVxuICAgIG9icyRBcnIgPSBvYnMkQXJyLmNvbmNhdChldmVudHNBcnIpXG5cbiAgICByZXR1cm4gb2JzJEFyclxuICB9XG5cbiAgY2hlY2tGb3JNZWRpYVF1ZXJpZXMoYm9vbCkge1xuICAgIGNvbnN0IHNlbmRNUVN0cmVhbSA9IHAgPT4ge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50LFxuICAgICAgICB0aGlzLm9ic2VydmVyJClcbiAgICB9XG5cbiAgICBpZiAoYm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5nZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSh0aGlzLmRvbUNoYW5uZWxDb25maWcpXG4gICAgICAgIC5zdWJzY3JpYmUoc2VuZE1RU3RyZWFtKVxuICAgIH1cbiAgfVxuXG4gIGdldE1lZGlhUXVlcnlPYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iaihjb25maWcpXG4gICAgLy8gY29uc29sZS5sb2coXCJBUlIgSVMgXCIse2Fycn0pO1xuICAgIGNvbnN0IG9icyQgPSBhcHBseShtZXJnZSwgYXJyKVxuICAgIHJldHVybiBvYnMkLnBpcGUobWFwKHRoaXMuZ2V0TWVkaWFRdWVyeU1hcEZuLmJpbmQodGhpcykpKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BQk9SVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQUZURVJQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQU5JTUFUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BTklNQVRJT05JVEVSQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FOSU1BVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BUFBJTlNUQUxMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFRk9SRVBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19CRUZPUkVVTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFR0lORVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JMVVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NBQ0hFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0xPU0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT01QT1NJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT01QT1NJVElPTlVQREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09QWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EQkxDTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VMSUdIVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFTU9USU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VPUklFTlRBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFUFJPWElNSVRZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01BVFRSSUJVVEVOQU1FQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQVRUUk1PRElGSUVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01DSEFSQUNURVJEQVRBTU9ESUZJRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUVMRU1FTlROQU1FQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR0VOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RST1BfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0VMRU1FTlRfU0NST0xMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRk9DVVNJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRk9DVVNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZVTExTQ1JFRU5DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZVTExTQ1JFRU5FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSEFTSENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0lOVkFMSURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWVBSRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19LRVlVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01FU1NBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRVdIRUVMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PRkZMSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PTkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09QRU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09SSUVOVEFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QQUdFSElERV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUEFHRVNIT1dfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BBU1RFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUE9QU1RBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BST0dSRVNTRVZFTlRTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19SRVNFVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRUxFTUVOVF9BRERFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfTE9DS19FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9MT0NLX0VWRU5UJywgJ29uU2Nyb2xsTG9ja0V2ZW50J10sXG4gICAgICBbJ0NIQU5ORUxfV0lORE9XX1NFVF9FTEVNRU5UX1RPX1NDUk9MTF9FVkVOVCcsICdvblNldEVsZW1lbnRUb1Njcm9sbCddLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NUT1JBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NVQk1JVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTlJVTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19VTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1dIRUVMX0VWRU5UJ1xuICAgIF1cbiAgfVxuXG4gIG9uU2Nyb2xsTG9ja0V2ZW50KGUpIHtcbiAgICAvLyBERVBSRUNBVEVEIC0tIE1PVkVEIFRPIHNweW5lLXBsdWdpbi1zY3JvbGwtbG9jaztcbiAgfVxuXG4gIG9uU2V0RWxlbWVudFRvU2Nyb2xsKGUpIHtcbiAgICBsZXQgeyBjb25maWcsIGVsLCBzY3JvbGxFbGVtZW50IH0gPSBlLnBheWxvYWRcbiAgICBjb25maWcgPSBjb25maWcgfHwge31cbiAgICBjb25maWcgPSBkZWVwTWVyZ2UodGhpcy5kb21DaGFubmVsQ29uZmlnLCBjb25maWcpXG5cbiAgICBzY3JvbGxFbGVtZW50ID0gc2Nyb2xsRWxlbWVudCB8fCBlbFxuXG4gICAgY29uc3QgYWN0aW9uID0gJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9FTEVNRU5UX0FEREVEX0VWRU5UJ1xuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgeyBlbCB9LCBlbClcblxuICAgIHRoaXMuY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZShjb25maWcsIHNjcm9sbEVsZW1lbnQpXG4gICAgICAuc3Vic2NyaWJlKHAgPT4ge1xuICAgICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICAgIH0pXG4gIH1cblxuICBiaW5kU3RhdGljTWV0aG9kcygpIHtcbiAgICB0aGlzLmNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVkaWFRdWVyeUhhbmRsZXIuYmluZChcbiAgICAgIHRoaXMpXG4gICAgdGhpcy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iai5iaW5kKFxuICAgICAgdGhpcylcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbHNNYXAgfSBmcm9tICcuL2NoYW5uZWxzL2NoYW5uZWxzLW1hcC5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuL3ZpZXdzL3ZpZXctc3RyZWFtLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBzYW5pdGl6ZUhUTUxDb25maWd1cmUgfSBmcm9tICcuL3V0aWxzL3Nhbml0aXplLWh0bWwuanMnXG5cbmNvbnN0IF9jaGFubmVscyA9IG5ldyBDaGFubmVsc01hcCgpXG5jb25zdCB2ZXJzaW9uID0gJzAuMjAuOCdcblxuY2xhc3MgU3B5bmVBcHBsaWNhdGlvbiB7XG4gIC8qKlxuICAgKlxuICAgKiBTcHluZUFwcCBjcmVhdGVzIHRoZSBnbG9iYWwgU3B5bmUgb2JqZWN0LCBhbmQgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGl0ZW1zXG4gICAqIDx1bD5cbiAgICpcbiAgICogPGxpPkxJTktbJ0NoYW5uZWxzTWFwJywgJ2NoYW5uZWxzLWNvbnRyb2xsZXInXSB0aGF0IGRpcmVjdHMgdGhlIGZsb3cgb2YgZGF0YSB0byBhbGwgQ2hhbm5lbHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsVUknLCAnc3B5bmUtY2hhbm5lbC11LWknXSwgdGhhdCBicm9hZGNhc3QgYWxsIHVzZXIgaW50ZXJhY3Rpb24gZXZlbnRzPC9saT5cbiAgICogPGxpPkxJTktbJ1NweW5lQ2hhbm5lbFJvdXRlJywgJ3NweW5lLWNoYW5uZWwtcm91dGUnXSwgdGhhdCBicm9hZGNhc3Qgd2luZG93IGxvY2F0aW9uIGNoYW5nZXMgYW5kIGlzIHRoZSBvbmx5IG90aGVyIGNoYW5uZWwgdGhhdCBjYW4gYmUgYm91bmQgdG8gdXNlciBldmVudHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsV2luZG93JywgJ3NweW5lLWNoYW5uZWwtd2luZG93J10sIHRoYXQgYnJvYWRjYXN0IGFsbCByZXF1ZXN0ZWQgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMsIHN1Y2ggYXMgc2Nyb2xsaW5nLCByZXNpemluZyBhbmQgbWVkaWEgcXVlcmllczwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgdGhhdCBicm9hZGNhc3RzIHJlbmRlcmluZyBhbmQgcmVtb3Zpbmcgb2YgVmlld1N0cmVhbSBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBkaXJlY3RlZCB0byBicm9hZGNhc3QgdGhlaXIgbGlmZWN5Y2xlIGV2ZW50czwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqXG4gICAqIEBtb2R1bGUgU3B5bmVBcHBcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnIC0gPSB7fTsgVGhpcyBnbG9iYWwgY29uZmlnIG9iamVjdCBpcyBtYWlubHkgdXNlZCB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdHdvIFNweW5lQ2hhbm5lbHMsIENIQU5ORUxfUk9VVEUgYW5kIENIQU5ORUxfV0lORE9XLlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uXG5cbiAgICAvLyBjb25zb2xlLmxvZygnc3B5bmUgYXBwIGNyZWF0ZWQnKVxuICB9XG5cbiAgZ2V0IGNoYW5uZWxzKCkge1xuICAgIHJldHVybiBfY2hhbm5lbHNcbiAgfVxuXG4gIGluaXQoY29uZmlnID0ge30sIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICAvLyB0aGlzLmNoYW5uZWxzID0gbmV3IENoYW5uZWxzTWFwKCk7XG4gICAgLyohXG4gICAgICogU3B5bmUgMC4yMC44XG4gICAgICogaHR0cHM6Ly9zcHluZWpzLm9yZ1xuICAgICAqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgMjAxNy0yMDI1LCBGcmFuayBCYXRpc3RhLFxuICAgICAqIFJlbGV2YW50IENvbnRleHQsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICAgKiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgICogQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgaW4gdGhlIHByb2plY3Qgcm9vdCwgb3IgYXQ6XG4gICAgICogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLTMuMC5odG1sXG4gICAgICpcbiAgICAgKiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBkaXN0cmlidXRpb24uXG4gICAgICovXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cblxuXG5cblxuICAgIGlmKFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSl7XG4gICAgICBpZiAodGVzdE1vZGUpe1xuICAgICAgICByZXR1cm4gJ1RoZSBTcHluZSBBcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkISc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSBTcHluZSBBcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy9jb25zdCBpbWdQYXRoID0gSU1HX1BBVEggfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGltZ1BhdGggPSAodHlwZW9mIElNR19QQVRIICE9PSAndW5kZWZpbmVkJykgPyBJTUdfUEFUSCA6IHVuZGVmaW5lZDtcbiAgICBsZXQgZGVmYXVsdENvbmZpZyA9IHtcbiAgICAgIHNjcm9sbExvY2s6IGZhbHNlLFxuICAgICAgc2Nyb2xsTG9ja1g6IDMxLFxuICAgICAgc2Nyb2xsTG9ja1k6IDAsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgICAgYmFzZUhyZWY6IHVuZGVmaW5lZCxcbiAgICAgIElNR19QQVRIOiBpbWdQYXRoLFxuICAgICAgcGx1Z2luTWV0aG9kczp7XG5cbiAgICAgIH0sXG4gICAgICBwbHVnaW5zOntcblxuICAgICAgfSxcbiAgICAgIHRtcDoge30sXG4gICAgICBlcGhlbWVyYWxQcm9wczoge30sXG4gICAgICB0bXBQcm9wczoge30sXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICBXSU5ET1c6IHtcbiAgICAgICAgICBtZWRpYVF1ZXJpZXM6IHtcblxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgICAgICBsaXN0ZW5Gb3JSZXNpemU6IHRydWUsXG4gICAgICAgICAgbGlzdGVuRm9yT3JpZW50YXRpb246IHRydWUsXG4gICAgICAgICAgbGlzdGVuRm9yU2Nyb2xsOiBmYWxzZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JNb3VzZVdoZWVsOiBmYWxzZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JXaGVlbDogZmFsc2UsXG4gICAgICAgICAgZGVib3VuY2VNU1RpbWVGb3JSZXNpemU6IDIwMCxcbiAgICAgICAgICBkZWJvdW5jZU1TVGltZUZvclNjcm9sbDogMTUwXG4gICAgICAgIH0sXG5cbiAgICAgICAgUk9VVEU6IHtcbiAgICAgICAgICB0eXBlOiAnc2xhc2gnLFxuICAgICAgICAgIGlzSGFzaDogZmFsc2UsXG4gICAgICAgICAgaXNIaWRkZW46IGZhbHNlLFxuICAgICAgICAgIGFkZDQwNHM6IGZhbHNlLFxuICAgICAgICAgIHJvdXRlczoge1xuICAgICAgICAgICAgJ3JvdXRlUGF0aCcgOiB7XG4gICAgICAgICAgICAgICdyb3V0ZU5hbWUnIDogJ2NoYW5nZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKGNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByb3V0ZVV0aWxzID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZTtcbiAgICAgICBjb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZShkZWZhdWx0Q29uZmlnLCBjb25maWcsIF9jaGFubmVscywgcm91dGVVdGlscyk7XG4gICAgICAgLy9jb25zb2xlLmxvZyhcIlNQWU5FIEFQUCBQUk9QUyBcIixTcHluZUFwcFByb3BlcnRpZXMpO1xuICAgICAgLy93aW5kb3cuU3B5bmUgPSB0aGlzO1xuICAgICAgLy93aW5kb3cuU3B5bmVbJ2NvbmZpZyddID0gZGVlcE1lcmdlKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgICB9XG4gICAgdGhpcy5wbHVnaW5zRm4gPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0UGx1Z2luc01ldGhvZE9iaihjb25maWdbJ3BsdWdpbk1ldGhvZHMnXSk7XG4gICAgdGhpcy5nZXRDaGFubmVsQWN0aW9ucyA9IChzdHIpID0+IF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpO1xuICAgIHRoaXMucmVnaXN0ZXJDaGFubmVsID0gKHZhbCkgPT4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKHZhbCk7XG4gICAgdGhpcy5yZWdpc3RlclBsdWdpbiA9IChwbHVnaW5JbnN0YW5jZSkgPT4gU3B5bmVBcHBQcm9wZXJ0aWVzLnJlZ2lzdGVyUGx1Z2luKHBsdWdpbkluc3RhbmNlKTtcbiAgICB0aGlzLnJlZ2lzdGVyRGF0YUNoYW5uZWwgPSAob2JzJCkgPT4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKG9icyQpO1xuICAgIHRoaXMubGlzdENoYW5uZWxzID0gKCkgPT4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSk7XG4gICAgbGV0IG51bGxIb2xkZXIgPSBuZXcgVmlld1N0cmVhbSh7IGlkOidzcHluZS1udWxsLXZpZXdzJyB9KTtcbiAgICBudWxsSG9sZGVyLmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgIG51bGxIb2xkZXIucHJvcHMuZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5Om5vbmU7IG9wYWNpdHk6MDsgcG9pbnRlci1ldmVudHM6bm9uZTsnO1xuICAgIF9jaGFubmVscy5pbml0KCk7XG5cbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5kZWJ1Zz09PXRydWUpe1xuICAgICAgIHdpbmRvdy5TcHluZSA9IHt2ZXJzaW9ufTtcbiAgICB9XG5cbiAgICBzYW5pdGl6ZUhUTUxDb25maWd1cmUoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5MaXN0aW5nIHRoZSByZWdpc3RlcmVlZCBDaGFubmVscyBpbiB0aGUgYnJvd3NlciBjb25zb2xlPC9oND4nXVxuICAgKiBTcHluZUFwcC5saXN0Q2hhbm5lbHMoKTtcbiAgICpcbiAgICogQHJldHVybnMgQSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIGNoYW5uZWxzXG4gICAqL1xuICBzdGF0aWMgbGlzdENoYW5uZWxzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKF9jaGFubmVscy5tYXAua2V5cygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gY2hlY2sgaW4gdGhlIGNvbnNvbGUgb3IgaW4gdGhlIGNvZGUgd2hhdCBhY3Rpb25zIGFyZSBhdmFpbGFibGUgdG8gYmUgbGlzdGVuZWQgdG8uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiBBY3Rpb25zIHRoYXQgY2FuIGJlIGxpc3RlbmVkIHRvXG4gICAqL1xuICBzdGF0aWMgZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKSB7XG4gICAgcmV0dXJuIF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgYWRkIHRoZSBjaGFubmVsIHRvIHRoZSByZWdpc3RlcmVkIGxpc3Qgc28gdGhhdCBpdCBjYW4gc3Vic2NyaWJlZCBieSBhbGwgVmlld1N0cmVhbSBhbmQgQ2hhbm5lbCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7Q2hhbm5lbH0gY1xuICAgKlxuICAgKlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyQ2hhbm5lbChjKSB7XG4gICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3B5bmUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfY2hhbm5lbHMucmVnaXN0ZXJTdHJlYW0oYyk7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IGxldCBTcHluZUFwcCA9IG5ldyBTcHluZUFwcGxpY2F0aW9uKCk7XG4iLCJpbXBvcnQgeyBEb21FbGVtZW50IH0gZnJvbSAnLi92aWV3cy9kb20tZWxlbWVudC5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBpcywgY2xvbmUsIHBhdGhTYXRpc2ZpZXMgfSBmcm9tICdyYW1kYSdcbmxldCBfc3B5bmVBcHBQcm9wcyA9IFNweW5lQXBwUHJvcGVydGllc1xuZXhwb3J0IGNsYXNzIFNweW5lUGx1Z2luIHtcbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIGxldCB7IG5hbWUsIGNvbmZpZywgcGFyZW50RWwgfSA9IHByb3BzXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG5cbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZyA9IGNsb25lKHByb3BzKVxuICAgIH1cblxuICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgJ2VtcHR5J1xuICAgIHRoaXMucHJvcHMubmFtZSA9IG5hbWVcbiAgICBjb25maWcgPSBTcHluZVBsdWdpbi5tZXJnZURlZmF1bHRDb25maWcoY29uZmlnLCB0aGlzLmRlZmF1bHRDb25maWcoKSlcbiAgICB0aGlzLnByb3BzLnBhcmVudEVsID0gcGFyZW50RWwgfHwgU3B5bmVQbHVnaW4uY3JlYXRlUGFyZW50RWwoKVxuICAgIC8vIFNweW5lUGx1Z2luLmdldFNweW5lQXBwKG5hbWUsIGNvbmZpZylcbiAgICB0aGlzLnByb3BzLmNvbmZpZyA9IGNvbmZpZ1xuICAgIGlmICh0aGlzLnByb3BzLnRyYWl0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFkZFRyYWl0cyh0aGlzLnByb3BzLnRyYWl0cylcbiAgICB9XG5cbiAgICAvLyB0aGlzLm9uQmVmb3JlUmVnaXN0ZXJlZCgpXG4gICAgLy8gdGhpcy5vblJlZ2lzdGVyZWQoKVxuICAgIC8vIHRoaXMub25SZW5kZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdyB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBhcHAgZGVjaWRlcyB0byByZWdpc3RlciB0aGUgcGx1Z2luLlxuICAgKiBUaGlzIHdheSwgdGhlIHBsdWdpbiBubyBsb25nZXIgaGFzIHRvIGltcG9ydCBvciByZWx5IG9uIGl0cyBvd24gdmVyc2lvblxuICAgKiBvZiBTcHluZUFwcFByb3BlcnRpZXMuIEluc3RlYWQsIGl0IGlzICpwYXNzZWQqIHRoZSBhdXRob3JpdGF0aXZlIGluc3RhbmNlLlxuICAgKi9cbiAgcmVnaXN0ZXIoc3B5bmVBcHBQcm9wcykge1xuICAgIC8vIDEuIFNhdmUgYSByZWZlcmVuY2UgdG8gdGhlIHJlYWwgU3B5bmVBcHBQcm9wZXJ0aWVzXG4gICAgX3NweW5lQXBwUHJvcHMgPSBzcHluZUFwcFByb3BzXG4gICAgdGhpcy5wcm9wcy5wbHVnaW5OYW1lID0gdGhpcy5wcm9wcy5uYW1lXG5cbiAgICAvLyB0aGlzLnByb3BzLmNvbmZpZyA9IF9zcHluZUFwcFByb3BzLmdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZSh0aGlzLnByb3BzLnBsdWdpbk5hbWUpXG5cbiAgICBpZiAoX3NweW5lQXBwUHJvcHMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFNweW5lIFdhcm5pbmc6IFNweW5lQXBwIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQhIENhbm5vdCByZWdpc3RlciBwbHVnaW4gXCIke3RoaXMubmFtZX1cIi5gXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLm9uQmVmb3JlUmVnaXN0ZXJlZCgpXG5cbiAgICAvLyAyLiBBZGQgcGx1Z2luIGNvbmZpZyBpbiB0aGUgcmVhbCBTcHluZUFwcFByb3BlcnRpZXNcbiAgICB0aGlzLnByb3BzLmNvbmZpZyA9IGNsb25lKHRoaXMucHJvcHMuY29uZmlnKVxuICAgIF9zcHluZUFwcFByb3BzLmFkZFBsdWdpbkNvbmZpZyh0aGlzLm5hbWUsIHRoaXMucHJvcHMuY29uZmlnKVxuXG4gICAgLy8gSWYgeW91IGhhdmUgcGx1Z2luLWxldmVsIGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiB0aGUgcmVhbCBzcHluZUFwcCxcbiAgICAvLyB5b3UgY2FuIGFkZCBpdCBoZXJlLCBlLmcuOlxuICAgIC8vIHNweW5lQXBwUHJvcHMuYWRkUGx1Z2luTWV0aG9kcyh0aGlzLnByb3BzLmNvbmZpZy5wbHVnaW5NZXRob2RzKVxuXG4gICAgLy8gMy4gSWYgeW91IGhhdmUgb3RoZXIgcGx1Z2luIGxpZmVjeWNsZSBtZXRob2RzXG4gICAgdGhpcy5vblJlZ2lzdGVyZWQoKVxuICAgIHRoaXMub25SZW5kZXIoKVxuICB9XG5cbiAgZ2V0IFNweW5lQXBwUHJvcGVydGllcygpIHtcbiAgICByZXR1cm4gX3NweW5lQXBwUHJvcHNcbiAgfVxuXG4gIHN0YXRpYyBtZXJnZURlZmF1bHRDb25maWcoY29uZmlnID0ge30sIGRlZmF1bHRDb25maWcgPSB0aGlzLmRlZmF1bHRDb25maWcoKSkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgfVxuXG4gIHN0YXRpYyBnZXRTcHluZUFwcChuYW1lLCBjb25maWcpIHtcbiAgICBpZiAoX3NweW5lQXBwUHJvcHMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFVuYWJsZSB0byBpbnN0YWxsIHBsdWdpbiwgJHtuYW1lfSEgU3B5bmVBcHAgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIWApXG4gICAgICAvLyBTcHluZUFwcC5pbml0KClcbiAgICB9IGVsc2Uge1xuICAgICAgX3NweW5lQXBwUHJvcHMuYWRkUGx1Z2luQ29uZmlnKG5hbWUsIGNvbmZpZylcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdXBkYXRlU3B5bmVDb25maWcoc3B5bmVBcHAsIHBsdWdpbk5hbWUsIHBsdWdpbkNvbmZpZykge1xuICAgIGNvbnN0IHBhdGhFeGlzdHMgPSBwYXRoU2F0aXNmaWVzKGlzKE9iamVjdCksIFsnY29uZmlnJywgJ3BsdWdpbnMnLCBwbHVnaW5OYW1lXSkoc3B5bmVBcHApXG5cbiAgICBpZiAocGF0aEV4aXN0cyA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHNweW5lQXBwLmNvbmZpZy5kZWJ1ZyA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBwbHVnaW4sICR7cGx1Z2luTmFtZX0sIGFscmVhZHkgZXhpc3RzYClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBzcHluZUFwcC5jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXSA9IHBsdWdpbkNvbmZpZ1xuICAgIHJldHVybiBzcHluZUFwcC5jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVBhcmVudEVsKGVsKSB7XG4gICAgY29uc3QgY3JlYXRlUGx1Z2luUGFyZW50RWwgPSAoKSA9PiB7XG4gICAgICBjb25zdCBwbHVnaW5FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcHluZS1wbHVnaW5zJylcblxuICAgICAgY29uc3QgY3JlYXRlUGx1Z2luRWwgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBsdWdpbkVsID0gbmV3IERvbUVsZW1lbnQoe1xuICAgICAgICAgIGlkOiAnc3B5bmUtcGx1Z2lucydcbiAgICAgICAgfSlcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwbHVnaW5FbC5yZW5kZXIoKSlcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3B5bmUtcGx1Z2lucycpXG4gICAgICAgIGVsLnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246YWJzb2x1dGU7IHRvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO21pbi1oZWlnaHQ6MTAwdmg7ei1pbmRleDoxMDAwMDAwOyBwb2ludGVyLWV2ZW50czpub25lJ1xuICAgICAgICByZXR1cm4gZWxcbiAgICAgIH1cbiAgICAgIHJldHVybiBwbHVnaW5FbCB8fCBjcmVhdGVQbHVnaW5FbCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsIHx8IGNyZWF0ZVBsdWdpblBhcmVudEVsKClcbiAgfVxuXG4gIGFkZFRyYWl0cyh0cmFpdHMpIHtcbiAgICBpZiAodHJhaXRzLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdBcnJheScpIHtcbiAgICAgIHRyYWl0cyA9IFt0cmFpdHNdXG4gICAgfVxuICAgIGNvbnN0IGFkZFRyYWl0ID0gKFRyYWl0Q2xhc3MpID0+IHtcbiAgICAgIHJldHVybiBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgIH1cblxuICAgIHRyYWl0cy5mb3JFYWNoKGFkZFRyYWl0KVxuICB9XG5cbiAgb25CZWZvcmVSZWdpc3RlcmVkKCkge1xuICAgIC8vIHRoaXMucHJvcHMucGx1Z2luTmFtZSA9IHRoaXMucHJvcHMubmFtZVxuICAgIC8vIHRoaXMucHJvcHMuY29uZmlnID0gX3NweW5lQXBwUHJvcHMuZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lKHRoaXMucHJvcHMucGx1Z2luTmFtZSlcbiAgICB0aGlzLmNoZWNrRm9yUmVxdWlyZWRXaW5kb3dFdmVudCgpXG4gIH1cblxuICBjaGVja0ZvclJlcXVpcmVkV2luZG93RXZlbnQoKSB7XG4gICAgY29uc3QgcmVxdWlyZWRFdmVudHMgPSB0aGlzLnByb3BzLnJlcXVpcmVkRXZlbnRzID8/IFtdXG4gICAgY29uc3Qgd2luZG93Q29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldENoYW5uZWxDb25maWcoJ1dJTkRPVycpXG5cbiAgICBjb25zdCBtaXNzaW5nRXZlbnRzID0gcmVxdWlyZWRFdmVudHMuZmlsdGVyKGV2dCA9PiAhd2luZG93Q29uZmlnLmV2ZW50cy5pbmNsdWRlcyhldnQpKVxuXG4gICAgLy8gSWYgYW55IGFyZSBtaXNzaW5nLCBsb2cgYSBzaW5nbGUgd2FybmluZyBsaXN0aW5nIHRoZW1cbiAgICBpZiAobWlzc2luZ0V2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYHBsdWdpbiBcIiR7dGhpcy5wcm9wcy5uYW1lfVwiIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgY29uZmlnLldJTkRPVy5ldmVudHMsIC0tPiAke21pc3NpbmdFdmVudHMuam9pbignLCAnKX0gPC0tYFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGRlZmF1bHRDb25maWcoKSB7XG4gICAgcmV0dXJuIHtcblxuICAgIH1cbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZCgpIHtcblxuICB9XG5cbiAgb25SZW5kZXIoKSB7XG5cbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBmbGF0TWFwLCBtYXAsIHB1Ymxpc2gsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgY29tcG9zZSwgcHJvcCwgZGVmYXVsdFRvLCBvdmVyLCBsZW5zUHJvcCwgaGFzLCBwcm9wRXEsIHdoZW4sIHByb3BJcywgYWxsUGFzcywgYXNzb2MsIHBpY2ssIG1lcmdlRGVlcFJpZ2h0IH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgQ2hhbm5lbEZldGNoVXRpbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxGZXRjaFV0aWxcbiAgICogQHR5cGUgdXRpbFxuICAgKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBUaGlzIGlzIHRoZSBjb3JlIG9iamVjdCB1c2VkIGZvciBDaGFubmVsRmV0Y2guIFRoaXMgdXRpbGl0eSB3cmFwcyB0aGUgamF2YXNjcmlwdCBmZXRjaCBhcGkgaW50byBhbiBvYnNlcnZhYmxlLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgUHJvcGVydGllcyB1c2VkIHRvIGNyZWF0ZSB0aGUgZmV0Y2ggcmVxdWVzdFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdWJzY3JpYmVyIEEgbWV0aG9kIGFzc2lnbmVkIHRvIGxpc3RlbiB0byB0aGUgcmVzdWx0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdGVzdE1vZGUgQ29udHJvbHMgdGhlIGluaXRpYWxpenRpb24gZm9yIHVuaXQgdGVzdHNcbiAgICpcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMudXJsIC0gPSB1bmRlZmluZWQ7IFRoZSB1cmwgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMuc2VydmVyT3B0aW9ucyAtID0gdW5kZWZpbmVkOyBUaGUgcHJvcGVydGllcywgaGVhZGVyLCBib2R5LCBtb2RlLCBtZXRob2QsIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5tYXBGbiAtID0gdW5kZWZpbmVkOyBBIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBhcnNlIHRoZSBkYXRhIGJlZm9yZSBpdCdzIHJldHVybmVkXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLnJlc3BvbnNlVHlwZSAtID0gJ2pzb24nOyBEZWZhdWx0IGlzIGpzb25cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMuZGVidWcgLSA9IGZhbHNlOyB3aWxsIHRyYWNlIHRoZSBmZXRjaCByZXNwb25zZSB0byB0aGUgY29uc29sZSBiZWZvciB0aGUgb2JzZXJ2YWJsZSBjb21wbGV0ZXNcbiAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gU3Vic2NyaWJlciAtID0gdW5kZWZpbmVkOyB0aGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZmV0Y2ggaXMgY29tcGxldGUuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdGVzdE1vZGUgLSA9IGZhbHNlOyBVc2VkIGZvciB1bml0IHRlc3RpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBmZXRjaGVkIHJlc3BvbnNlIHBhcnNlZCBieSB0aGUgc2V0IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+VXNpbmcgQ2hhbm5lbEZldGNoVXRpbCB0byBSZXRyaWV2ZSBhbiBJbWFnZTwvaDQ+J11cbiAgICpcbiAgICogICBjb25zdCB1cmwgPSBcIi9zdGF0aWMvaW1hZ2VzL215aW1hZ2UuanBnXCI7XG4gICAqICAgY29uc3QgcmVzcG9uc2VUeXBlID0gXCJibG9iXCI7XG4gICAqICAgY29uc3Qgb25JbWdCbG9iUmV0dXJuZWQgPSAoYmxvYik9PntcbiAgICogICAgICAgIGxldCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICogICAgICAgIHRoaXMuYXBwZW5kVmlldyhcbiAgICogICAgICAgICAgICBuZXcgVmlld1N0cmVhbSh7XG4gICAqICAgICAgICAgICAgICB0YWdOYW1lOiAnaW1nJyxcbiAgICogICAgICAgICAgICAgIHNyYzogYmxvYlVybCxcbiAgICogICAgICAgICAgICAgIHdpZHRoOjMwMFxuICAgKiAgICAgICAgICAgIH0pXG4gICAqICAgICAgICAgICApfVxuICAgKlxuICAgKiAgIG5ldyBDaGFubmVsRmV0Y2hVdGlsKHt1cmwsIHJlc3BvbnNlVHlwZX0sIG9uSW1nQmxvYlJldHVybmVkKTtcbiAgICpcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucywgc3Vic2NyaWJlciwgdGVzdE1vZGUsIENIQU5ORUxfTkFNRSkge1xuICAgIGNvbnN0IHRlc3RTdWJzY3JpYmVyID0gKHApID0+IGNvbnNvbGUubG9nKCdGRVRDSCBSRVRVUk5FRCAnLCBwKVxuXG4gICAgdGhpcy5fbWFwRm4gPSBDaGFubmVsRmV0Y2hVdGlsLnNldE1hcEZuKG9wdGlvbnMpXG4gICAgdGhpcy5fdXJsID0gQ2hhbm5lbEZldGNoVXRpbC5zZXRVcmwob3B0aW9ucylcbiAgICB0aGlzLl9yZXNwb25zZVR5cGUgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFJlc3BvbnNlVHlwZShvcHRpb25zKVxuICAgIHRoaXMuX3NlcnZlck9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFNlcnZlck9wdGlvbnMob3B0aW9ucylcbiAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlciAhPT0gdW5kZWZpbmVkID8gc3Vic2NyaWJlciA6IHRlc3RTdWJzY3JpYmVyXG4gICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVidWcgOiBmYWxzZVxuICAgIHRoaXMuY2hhbm5lbE5hbWUgPSBDSEFOTkVMX05BTUVcblxuICAgIGNvbnN0IGZldGNoUHJvcHMgPSB7XG4gICAgICBtYXBGbjogdGhpcy5tYXBGbixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICBzZXJ2ZXJPcHRpb25zOiB0aGlzLnNlcnZlck9wdGlvbnMsXG4gICAgICByZXNwb25zZVR5cGU6IHRoaXMucmVzcG9uc2VUeXBlLFxuICAgICAgZGVidWc6IHRoaXMuZGVidWdcbiAgICB9XG4gICAgaWYgKHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBDaGFubmVsRmV0Y2hVdGlsLnN0YXJ0V2luZG93RmV0Y2goZmV0Y2hQcm9wcywgdGhpcy5fc3Vic2NyaWJlciwgdGhpcy5jaGFubmVsTmFtZSlcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgc3RhcnRXaW5kb3dGZXRjaChwcm9wcywgc3Vic2NyaWJlciwgY2hhbm5lbE5hbWUpIHtcbiAgICBjb25zdCB7IG1hcEZuLCB1cmwsIHNlcnZlck9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgZGVidWcgfSA9IHByb3BzXG4gICAgY29uc3QgdGFwTG9nRGVidWcgPSBwID0+IGNvbnNvbGUubG9nKCdERUJVRyBGRVRDSCA6JywgcCwgeyB1cmwsIHNlcnZlck9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgY2hhbm5lbE5hbWUgfSlcbiAgICBjb25zdCB0YXBMb2cgPSBkZWJ1ZyA9PT0gdHJ1ZSA/IHRhcExvZ0RlYnVnIDogKCkgPT4ge31cblxuICAgIGNvbnN0IG1hcFdyYXBwZXIgPSAobWFwTWV0aG9kKSA9PiB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHsgY2hhbm5lbE5hbWUsIHVybCwgcmVzcG9uc2VUeXBlLCBzZXJ2ZXJPcHRpb25zIH1cblxuICAgICAgcmV0dXJuIChkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBtYXBNZXRob2QoZGF0YSwgbWV0YWRhdGEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coJ1NFUlZFUiBPUFRJT05TICcsIHsgcHJvcHMsIHNlcnZlck9wdGlvbnMgfSlcblxuICAgIGNvbnN0IHJlc3BvbnNlJCA9IGZyb20od2luZG93LmZldGNoKHVybCwgc2VydmVyT3B0aW9ucykpXG4gICAgICAucGlwZSh0YXAodGFwTG9nKSwgZmxhdE1hcChyID0+IGZyb20ocltyZXNwb25zZVR5cGVdKCkpKSxcbiAgICAgICAgbWFwKG1hcFdyYXBwZXIobWFwRm4pKSxcbiAgICAgICAgcHVibGlzaCgpKVxuXG4gICAgcmVzcG9uc2UkLmNvbm5lY3QoKVxuXG4gICAgcmVzcG9uc2UkLnN1YnNjcmliZShzdWJzY3JpYmVyKVxuICB9XG5cbiAgc3RhdGljIHNldE1hcEZuKG9wdHMpIHtcbiAgICBjb25zdCBnZXRGbiA9IGNvbXBvc2UoZGVmYXVsdFRvKChwKSA9PiBwKSwgcHJvcCgnbWFwRm4nKSlcbiAgICByZXR1cm4gZ2V0Rm4ob3B0cylcbiAgfVxuXG4gIHN0YXRpYyBzZXRVcmwob3B0cykge1xuICAgIGNvbnN0IHVybCA9IHByb3AoJ3VybCcsIG9wdHMpXG4gICAgaWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NQWU5FIFdBUk5JTkc6IFVSTCBpcyB1bmRlZmluZWQgZm9yIGRhdGEgY2hhbm5lbCcpXG4gICAgfVxuICAgIHJldHVybiB1cmxcbiAgfVxuXG4gIHN0YXRpYyBzZXRSZXNwb25zZVR5cGUob3B0cykge1xuICAgIHJldHVybiBkZWZhdWx0VG8oJ2pzb24nLCBwcm9wKCdyZXNwb25zZVR5cGUnLCBvcHRzKSlcbiAgfVxuXG4gIGdldCBtYXBGbigpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwRm5cbiAgfVxuXG4gIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybFxuICB9XG5cbiAgZ2V0IHNlcnZlck9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlck9wdGlvbnNcbiAgfVxuXG4gIGdldCByZXNwb25zZVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlVHlwZVxuICB9XG5cbiAgc3RhdGljIHN0cmluZ2lmeUJvZHlJZkl0RXhpc3RzKG9iaikge1xuICAgIGNvbnN0IGNvbnZlcnRUb0pTT04gPSB3aGVuKHByb3BJcyhPYmplY3QsICdib2R5JyksIGNvbXBvc2Uob3ZlcihsZW5zUHJvcCgnYm9keScpLCBKU09OLnN0cmluZ2lmeSkpKVxuXG4gICAgcmV0dXJuIGNvbnZlcnRUb0pTT04ob2JqKVxuICB9XG5cbiAgc3RhdGljIHVwZGF0ZU1ldGhvZFdoZW5Cb2R5RXhpc3RzKG9wdHMpIHtcbiAgICBjb25zdCBoYXNCb2R5ID0gaGFzKCdib2R5JylcbiAgICBjb25zdCBtZXRob2RJc0dldCA9IHByb3BFcSgnR0VUJywgJ21ldGhvZCcpXG4gICAgY29uc3QgcHJlZCA9IGFsbFBhc3MoW2hhc0JvZHksIG1ldGhvZElzR2V0XSlcbiAgICByZXR1cm4gd2hlbihwcmVkLCBhc3NvYygnbWV0aG9kJywgJ1BPU1QnKSkob3B0cylcbiAgfVxuXG4gIHN0YXRpYyBzZXRTZXJ2ZXJPcHRpb25zKG9wdHMpIHtcbiAgICBjb25zdCBvcHRpb25zID0gcGljayhbXG4gICAgICAnbWV0aG9kJyxcbiAgICAgICdoZWFkZXJzJyxcbiAgICAgICdib2R5JyxcbiAgICAgICdtb2RlJyxcbiAgICAgICdjcmVkZW50aWFscycsXG4gICAgICAnY2FjaGUnLFxuICAgICAgJ3JlZGlyZWN0JyxcbiAgICAgICdyZWZlcnJlcicsXG4gICAgICAncmVmZXJyZXJQb2xpY3knLFxuICAgICAgJ2ludGVncml0eScsXG4gICAgICAna2VlcGFsaXZlJ1xuICAgIF0sIG9wdHMpXG4gICAgbGV0IG1lcmdlZE9wdGlvbnMgPSBtZXJnZURlZXBSaWdodChDaGFubmVsRmV0Y2hVdGlsLmJhc2VPcHRpb25zKCksIG9wdGlvbnMpXG4gICAgbWVyZ2VkT3B0aW9ucyA9IENoYW5uZWxGZXRjaFV0aWwudXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMobWVyZ2VkT3B0aW9ucylcbiAgICBtZXJnZWRPcHRpb25zID0gQ2hhbm5lbEZldGNoVXRpbC5zdHJpbmdpZnlCb2R5SWZJdEV4aXN0cyhtZXJnZWRPcHRpb25zKVxuICAgIHJldHVybiBtZXJnZWRPcHRpb25zXG4gIH1cblxuICBzdGF0aWMgYmFzZU9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsIC8vIERlZmF1bHQgbWV0aG9kXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKidcbiAgICAgIH0pLFxuICAgICAgbW9kZTogJ2NvcnMnLCAvLyBEZWZhdWx0IG1vZGVcbiAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLCAvLyBEZWZhdWx0IGNyZWRlbnRpYWxzIHBvbGljeVxuICAgICAgY2FjaGU6ICdkZWZhdWx0JywgLy8gRGVmYXVsdCBjYWNoZSBwb2xpY3lcbiAgICAgIHJlZGlyZWN0OiAnZm9sbG93JywgLy8gRGVmYXVsdCByZWRpcmVjdCBwb2xpY3lcbiAgICAgIHJlZmVycmVyOiAnY2xpZW50JywgLy8gRGVmYXVsdCByZWZlcnJlciBwb2xpY3lcbiAgICAgIHJlZmVycmVyUG9saWN5OiAnbm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGUnLCAvLyBEZWZhdWx0IHJlZmVycmVyIHBvbGljeVxuICAgICAgaW50ZWdyaXR5OiAnJywgLy8gRGVmYXVsdCBpbnRlZ3JpdHlcbiAgICAgIGtlZXBhbGl2ZTogZmFsc2UgLy8gRGVmYXVsdCBrZWVwYWxpdmVcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGlzLFxuICByZWplY3QsXG4gIGlzTmlsLFxuICBmaW5kLFxuICBhbGxQYXNzLFxuICBmb3JFYWNoT2JqSW5kZXhlZCxcbiAgbm90LFxuICBpc0VtcHR5LFxuICBhbHdheXMsXG4gIGNvbXBvc2UsXG4gIGVxdWFscyxcbiAgcHJvcCxcbiAgd2hlcmUsXG4gIGRlZmF1bHRUbyxcbiAgbWVyZ2VBbGwsXG4gIEYsXG4gIG9taXQsXG4gIGZsYXR0ZW4sXG4gIGFueSxcbiAgY3VycnksXG4gIGx0ZVxuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5jb25zdCBpc05vdEFyciA9IGNvbXBvc2Uobm90LCBpcyhBcnJheSkpXG5jb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShub3QsIGlzRW1wdHkpXG5jb25zdCBpc05vbkVtcHR5U3RyID0gYWxsUGFzcyhbaXMoU3RyaW5nKSwgaXNOb3RFbXB0eV0pXG5jb25zdCBpc05vbkVtcHR5QXJyID0gYWxsUGFzcyhbaXMoQXJyYXkpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzT2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5jb25zdCBpc05vbkVtcHR5T2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5cbmNvbnN0IGlzU3RyaW5nICA9ICh2YWwpID0+IGlzKFN0cmluZywgdmFsKVxuY29uc3QgaXNCb29sZWFuID0gKHZhbCkgPT4gaXMoQm9vbGVhbiwgdmFsKVxuY29uc3QgaXNOdW1iZXIgID0gKHZhbCkgPT4gaXMoTnVtYmVyLCB2YWwpXG5jb25zdCBpc0FycmF5Rm4gPSAodmFsKSA9PiBpcyhBcnJheSwgdmFsKVxuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFBheWxvYWRGaWx0ZXIge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsUGF5bG9hZEZpbHRlclxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgdXRpbGl0eSBmaWx0ZXJzIENoYW5uZWxQYXlsb2FkIG9iamVjdHMgYnkgdXNpbmcgcXVlcnkgc2VsZWN0b3JzIGFuZC9vciBieSBjb21wYXJpbmcgZGF0YSBwcm9wZXJ0aWVzPC9wPlxuICAgKiA8aDM+VGhlIENoYW5uZWxQYXlsb2FkRmlsdGVyIGZlYXR1cmVzPC9oMz5cbiAgICogPHVsPlxuICAgKiAgIDxsaT5DYW4gYmUgdXNlZCBieSBDaGFubmVscyBhbmQgVmlld1N0cmVhbXM8L2xpPlxuICAgKiAgIDxsaT5DaGFubmVsUGF5bG9hZEZpbHRlciBpbnN0YW5jZXMgY2FuIGJlIHVzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciB3aGVuIGJpbmRpbmcgYWN0aW9ucyB0byBWaWV3U3RyZWFtIG1ldGhvZHMuPC9saT5cbiAgICogICA8bGk+U2VsZWN0b3JzIGNhbiBiZSBhIHF1ZXJ5IHN0cmluZywgYW4gYXJyYXkgb2Ygc2VsZWN0b3Igc3RyaW5ncywgb3IgdGhlIHNlbGVjdG9yIGNhbiBiZSBhbiBhY3R1YWwgZG9tIGVsZW1lbnQuPC9saT5cbiAgICogICA8bGk+U2VsZWN0b3JzIGFyZSBub3QgcmVxdWlyZWQgYW5kIGNhbiBiZSBkaXNyZWdhcmRlZCBieSBhZGRpbmcgXCJcIiBvciB1bmRlZmluZWQgYXMgdGhlIHNlbGVjdG9yIHByb3BlcnR5LjwvbGk+XG4gICAqICAgPGxpPlRoZSBkYXRhIG9iamVjdCBjb21wYXJlcyB0aGUgdmFsdWVzIGZyb20gdGhlIHByb3BzKCkgbWV0aG9kIG9mIGEgQ2hhbm5lbFBheWxvYWQgb2JqZWN0PC9saT5cbiAgICogICA8bGk+SW50ZXJuYWxseSwgVGhlIGRhdGEgb2JqZWN0IGlzIGNvbmZvcm1lZCB0byBhIHNwZWMgb2JqZWN0IGZvciByYW1kYSZyc3F1bztzIEVYVFsnd2hlcmUnLCAnLy9yYW1kYWpzLmNvbS9kb2NzLyN3aGVyZSddIG1ldGhvZDwvbGk+XG4gICAqICAgPC91bD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEFycmF5fEhUTUxFbGVtZW50fSBzZWxlY3RvciBUaGUgbWF0Y2hpbmcgZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gZmlsdGVycyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0b3IsIHByb3BzLCBhbmQgZGVidWdMYWJlbCBwYXJhbXMuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wRmlsdGVycyBBIGpzb24gb2JqZWN0IGNvbnRhaW5pbmcgZmlsdGVyaW5nIG1ldGhvZHMgZm9yIGNoYW5uZWwgcHJvcHMgdmFyaWFibGVzLlxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xBcnJheXxIVE1MRWxlbWVudH0gc2VsZWN0b3IgLSA9ICcnOyBUaGUgbWF0Y2hpbmcgZWxlbWVudC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BGaWx0ZXJzIC0gPSB7fTsgQSBqc29uIG9iamVjdCBjb250YWluaW5nIGNvbXByYXRvcnMgZm9yIGFueSBleHBlY3RlZCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIEJvb2xlYW5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5GaWx0ZXJpbmcgdXNpbmcgU2VsZWN0b3JzIGFuZCBhIFByb3BlcnR5IENvbXBhcmF0b3IgV2l0aGluIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+J11cbiAgICogICAgY29uc3QgbXlTZWxlY3RvcnMgPSBbJ3VsJywgJ2xpOmZpcnN0LWNoaWxkJ107XG4gICAqICAgIGNvbnN0IHByb3BGaWx0ZXJzID0ge1xuICAgKiAgICAgIGxpbmtUeXBlOiBcImV4dGVybmFsXCJcbiAgICogICAgfTtcbiAgICogICAgY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIobXlTZWxlY3RvcnMsIHByb3BGaWx0ZXJzKTtcbiAgICpcbiAgICogICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCBteUZpbHRlcl1cbiAgICogICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICB9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+RmlsdGVyaW5nIFVzaW5nIE1ldGhvZCBhbmQgU3RyaW5nIENvbXBhcmF0b3JzIFdpdGhpbiBhIFZpZXdTdHJlYW0gSW5zdGFuY2U8L2g0PiddXG4gICAqICAgIGNvbnN0IHByb3BGaWx0ZXJzID0ge1xuICAgKiAgICAgIHR5cGU6IFwic2Nyb2xsaW5nLWVsZW1lbnRcIixcbiAgICogICAgICBzY3JvbGxOdW06ICAobik9Pm4+PTEyMDAgJiYgbjw9NTAwMDtcbiAgICogICAgfTtcbiAgICogICAgY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIoJycsIHByb3BGaWx0ZXJzKTtcbiAgICpcbiAgICogICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCBteUZpbHRlcl1cbiAgICogICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICB9XG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+QSBTaW1wbGUgUHJvcGVydHkgRmlsdGVyaW5nIEV4YW1wbGUgV2l0aGluIGEgQ2hhbm5lbCBJbnN0YW5jZTwvaDQ+J11cbiAgICogLy8gRmlsdGVyIGZvciBhIGJ1dHRvbiB3aXRoIGEgZGF0YSB0eXBlIG9mICdsaW5rJ1xuICAgKiBjb25zdCBteUZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcignJyB7dHlwZTogXCJsaW5rXCJ9KTtcbiAgICpcbiAgICogdGhpcy5nZXRDaGFubmVsKFwiQ0hBTk5FTF9VSVwiKVxuICAgKiAucGlwZShmaWx0ZXIobXlGaWx0ZXIpKVxuICAgKiAuc3Vic2NyaWJlKG15Q2hhbm5lbE1ldGhvZCk7XG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZWxlY3RvciwgZmlsdGVycyA9IHt9LCBkZWJ1Z0xhYmVsLCB0ZXN0TW9kZSkge1xuICAgIGNvbnN0IHNlbGVjdG9ySXNPYmogPSBpc09iamVjdEZuKHNlbGVjdG9yKVxuXG4gICAgaWYgKHNlbGVjdG9ySXNPYmopIHtcbiAgICAgIGZpbHRlcnMgPSBzZWxlY3RvclxuICAgICAgc2VsZWN0b3IgPSBwcm9wKCdzZWxlY3RvcicsIGZpbHRlcnMpXG4gICAgICB0ZXN0TW9kZSA9IHRlc3RNb2RlIHx8IHByb3AoJ3Rlc3RNb2RlJywgZmlsdGVycylcbiAgICB9XG5cbiAgICBjb25zdCBkZWJ1Z0xhYmVsQXJyID0gW2RlYnVnTGFiZWwsIHByb3AoJ2RlYnVnTGFiZWwnLCBmaWx0ZXJzKV1cblxuICAgIGRlYnVnTGFiZWwgPSBjb21wb3NlKGZpbmQoaXMoU3RyaW5nKSkpKGRlYnVnTGFiZWxBcnIpXG5cbiAgICBsZXQgcHJvcHMgPSBvbWl0KFsnZGVidWdMYWJlbCcsICdsYWJlbCcsICdzZWxlY3RvcicsICdwcm9wcycsICd0ZXN0TW9kZScsICdwcm9wRmlsdGVycyddLCBmaWx0ZXJzKVxuICAgIGlmIChmaWx0ZXJzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BzID0gbWVyZ2VBbGwoW2ZpbHRlcnMucHJvcHMsIHByb3BzXSlcbiAgICB9IGVsc2UgaWYgKGZpbHRlcnMucHJvcEZpbHRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMgPSBtZXJnZUFsbChbZmlsdGVycy5wcm9wRmlsdGVycywgcHJvcHNdKVxuICAgIH1cblxuICAgIGZpbHRlcnMucHJvcEZpbHRlcnMgPSBwcm9wc1xuXG4gICAgY29uc3QgeyBwcm9wRmlsdGVycyB9ID0gZmlsdGVyc1xuXG4gICAgY29uc3QgYWRkU3RyaW5nU2VsZWN0b3JGaWx0ZXIgPSAgaXNOb25FbXB0eVN0cihzZWxlY3RvcikgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJTZWxlY3Rvcihbc2VsZWN0b3JdLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGFkZEFycmF5U2VsZWN0b3JGaWx0ZXIgPSAgIGlzTm9uRW1wdHlBcnIoc2VsZWN0b3IpID8gQ2hhbm5lbFBheWxvYWRGaWx0ZXIuZmlsdGVyU2VsZWN0b3Ioc2VsZWN0b3IsIGRlYnVnTGFiZWwpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkRGF0YUZpbHRlciA9IGlzTm9uRW1wdHlPYmplY3RGbihwcm9wRmlsdGVycykgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJEYXRhKHByb3BGaWx0ZXJzLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuXG4gICAgbGV0IGZpbHRlcnNBcnIgPSByZWplY3QoaXNOaWwsIFthZGRTdHJpbmdTZWxlY3RvckZpbHRlciwgYWRkQXJyYXlTZWxlY3RvckZpbHRlciwgYWRkRGF0YUZpbHRlcl0pXG5cbiAgICAvLyBJRiBBUlJBWSBJUyBFTVBUWSBBTFdBWVMgUkVUVVJOIEZBTFNFO1xuXG4gICAgY29uc3QgZmlsdGVyc0FyZUVtcHR5ID0gaXNFbXB0eShmaWx0ZXJzQXJyKVxuXG4gICAgaWYgKGZpbHRlcnNBcmVFbXB0eSkge1xuICAgICAgZmlsdGVyc0FyciA9IFthbHdheXMoZmFsc2UpXVxuICAgICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZSAmJiB0ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBDaGFubmVsIEZpbHRlciwgd2l0aCBzZWxlY3RvcjogJHtzZWxlY3Rvcn0sIGFuZCBwcm9wRmlsdGVyczoke3Byb3BGaWx0ZXJzfSBhcHBlYXJzIHRvIGJlIGVtcHR5IWApXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ZXN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IsIHByb3BGaWx0ZXJzLCBkZWJ1Z0xhYmVsLCBmaWx0ZXJzLCB0ZXN0TW9kZSwgZmlsdGVyc0FyZUVtcHR5IH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUGFzcyhmaWx0ZXJzQXJyKVxuICB9XG5cbiAgc3RhdGljIGZpbHRlckRhdGEoZmlsdGVySnNvbiwgZmlsdGVyZGVidWdMYWJlbCkge1xuICAgIGNvbnN0IGRlYnVnTGFiZWwgPSBmaWx0ZXJkZWJ1Z0xhYmVsXG5cbiAgICBjb25zdCBjb21wYXJlRGF0YSA9ICgpID0+IHtcbiAgICAgIC8vIERPIE5PVCBBTExPVyBBTiBFTVBUWSBPQkpFQ1QgVE8gUkVUVVJOIFRSVUVzXG4gICAgICBpZiAoaXNFbXB0eShmaWx0ZXJKc29uKSkge1xuICAgICAgICByZXR1cm4gYWx3YXlzKGZhbHNlKVxuICAgICAgfVxuXG4gICAgICAvLyAgQ0hFQ0tTIEFMTCBWQUxVRVMgSU4gSlNPTiBUTyBERVRFUk1JTkUgSUYgVEhFUkUgQVJFIEZJTFRFUklORyBNRVRIT0RTXG5cbiAgICAgIGNvbnN0IGNyZWF0ZUN1cnJ5Q29tcGFyYXRvciA9IGNvbXBhcmVTdHIgPT4gKHN0cikgPT4ge1xuICAgICAgICByZXR1cm4gc3RyID09PSBjb21wYXJlU3RyXG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja1RvQ29udmVydFRvRm4gPSAodmFsLCBrZXksIG9iaikgPT4ge1xuICAgICAgICBsZXQgZm5WYWwgPSBGXG4gICAgICAgIGlmIChpc1N0cmluZyh2YWwpIHx8IGlzQm9vbGVhbih2YWwpIHx8IGlzTnVtYmVyKHZhbCkpIHtcbiAgICAgICAgICBmblZhbCA9IGNyZWF0ZUN1cnJ5Q29tcGFyYXRvcih2YWwpXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiB2YWxcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5Rm4odmFsKSB8fCBpc09iamVjdEZuKHZhbCkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBDaGFubmVsUGF5bG9hZEZpbHRlcjogUHJvcGVydHkgXCIke3ZhbH1cIiBpcyBhbiBhcnJheS9vYmplY3QsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiBgICtcbiAgICAgICAgICAgICAgJ1RoaXMgcHJvcGVydHkgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLidcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIGZuVmFsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuVmFsXG4gICAgICB9XG4gICAgICBmaWx0ZXJKc29uID0gck1hcChjaGVja1RvQ29udmVydFRvRm4sIGZpbHRlckpzb24pXG5cbiAgICAgIC8vIFRBUCBMT0dHRVJcbiAgICAgIGNvbnN0IHRhcExvZ2dlciA9IChjb21wYXJlZE9iaikgPT4ge1xuICAgICAgICBpZiAoZGVidWdMYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmVkT2JqXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvcHNCb29sZWFucyA9IHt9XG4gICAgICAgIGNvbnN0IG1hcEJvb2xzID0gKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBwcm9wc0Jvb2xlYW5zW2tleV0gPSB2YWx1ZShwcm9wKGtleSwgY29tcGFyZWRPYmopKVxuICAgICAgICB9XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKG1hcEJvb2xzLCBmaWx0ZXJKc29uKVxuICAgICAgICBjb25zb2xlLmxvZyhgJWMgQ0hBTk5FTCBQQVlMT0FEIEZJTFRFUiBERUJVR0dFUiBbXCIke2RlYnVnTGFiZWx9XCJdIC0gdmFsdWVzOiAgICBgLCAnY29sb3I6b3JhbmdlOycsIHsgcHJvcHNCb29sZWFucywgY29tcGFyZWRPYmogfSlcblxuICAgICAgICByZXR1cm4gY29tcGFyZWRPYmpcbiAgICAgIH1cblxuICAgICAgLy8gRU5EIFRBUCBMT0dHRVJcbiAgICAgIGNvbnN0IGZNZXRob2QgPSB3aGVyZShmaWx0ZXJKc29uKVxuXG4gICAgICBjb25zdCBnZXRGaWx0ZXJpbmdPYmogPSAgKHYpID0+IHtcbiAgICAgICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gdiB8fCB7fVxuICAgICAgICBjb25zdCBvID0gT2JqZWN0LmFzc2lnbih7fSwgdiwgc3JjRWxlbWVudCwgZXZlbnQsIHBheWxvYWQpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdvIGlzICcsbyk7XG4gICAgICAgIHJldHVybiBvXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wb3NlKGZNZXRob2QsIHRhcExvZ2dlciwgZGVmYXVsdFRvKHt9KSwgZ2V0RmlsdGVyaW5nT2JqKVxuICAgIH1cblxuICAgIHJldHVybiBjb21wYXJlRGF0YSgpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tQYXlsb2FkU2VsZWN0b3IoYXJyLCBkZWJ1Z0xhYmVsLCBzcmNQYXlsb2FkKSB7XG4gICAgLy8gRUxFTUVOVCBGUk9NIFBBWUxPQURzXG4gICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gc3JjUGF5bG9hZCB8fCB7fVxuXG4gICAgY29uc3QgcmVkdWNlRmluZEVsID0gKGFjYywgc3JjKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IHByb3AoJ2VsJywgc3JjKVxuICAgICAgaWYgKENoYW5uZWxQYXlsb2FkRmlsdGVyLmVsSXNEb21FbGVtZW50KGVsKSAmJiBhY2MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2MgPSBlbFxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIGNvbnN0IGVsID0gW3NyY0VsZW1lbnQsIHBheWxvYWQsIHByb3AoJ3NyY0VsZW1lbnQnLCBldmVudCksIHNyY1BheWxvYWRdLnJlZHVjZShyZWR1Y2VGaW5kRWwsIHVuZGVmaW5lZClcblxuICAgIC8vIFJFVFVSTiBCT09MRUFOIE1BVENIIFdJVEggUEFZTE9BRCBFTFxuICAgIGNvbnN0IGNvbXBhcmVFbHMgPSAoZWxDb21wYXJlKSA9PiBlbENvbXBhcmUuaXNFcXVhbE5vZGUoKGVsKSlcblxuICAgIC8vIExPT1AgVEhST1VHSCBOT0RFUyBJTiBxdWVyeVNlbGVjdG9yQWxsKClcbiAgICBjb25zdCBtYXBOb2RlQXJyV2l0aEVsID0gKHNlbCkgPT4ge1xuICAgICAgLy8gY29udmVydCBub2RlbGlzdCB0byBhcnJheSBvZiBlbHNcbiAgICAgIGNvbnN0IG5vZGVBcnIgPSBmbGF0dGVuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsKSlcbiAgICAgIC8vIGVscyBhcnJheSB0byBib29sZWFuIGFycmF5XG4gICAgICByZXR1cm4gck1hcChjb21wYXJlRWxzLCBub2RlQXJyKVxuICAgIH1cblxuICAgIGlmIChkZWJ1Z0xhYmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG5vZGVBcnJSZXN1bHRzRGVidWdnZXIgPSBjb21wb3NlKGZsYXR0ZW4sIHJNYXAobWFwTm9kZUFycldpdGhFbCkpKGFycilcbiAgICAgIGNvbnN0IHNlbGVjdG9yc0FyciA9IGFyclxuICAgICAgY29uc29sZS5sb2coYCVjIENIQU5ORUwgUEFZTE9BRCBGSUxURVIgREVCVUdHRVIgW1wiJHtkZWJ1Z0xhYmVsfVwiXSAtIHNlbGVjdG9yczogYCwgJ2NvbG9yOm9yYW5nZTsnLCB7IGVsLCBzZWxlY3RvcnNBcnIsIG5vZGVBcnJSZXN1bHRzRGVidWdnZXIgfSlcbiAgICB9XG5cbiAgICAvLyBDSEVDSyBJRiBQQVlMT0FEIEVMIEVYSVNUU1xuICAgIGlmICh0eXBlb2YgKGVsKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIExPT1AgVEhST1VHSCBBTEwgU0VMRUNUT1JTIElOIE1BSU4gQVJSQVlcbiAgICBjb25zdCBub2RlQXJyUmVzdWx0ID0gY29tcG9zZShmbGF0dGVuLCByTWFwKG1hcE5vZGVBcnJXaXRoRWwpKShhcnIpXG4gICAgaWYgKGlzRW1wdHkobm9kZUFyclJlc3VsdCkgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiBhbnkoZXF1YWxzKHRydWUpLCBub2RlQXJyUmVzdWx0KVxuICB9XG5cbiAgc3RhdGljIGVsSXNEb21FbGVtZW50KG8pIHtcbiAgICBpZiAoaXMoU3RyaW5nLCBvKSkge1xuICAgICAgbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobylcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpKG8pXG4gIH1cblxuICBzdGF0aWMgZmlsdGVyU2VsZWN0b3Ioc2VsZWN0b3JBcnIsIGRlYnVnTGFiZWwpIHtcbiAgICBjb25zdCBhcnIgPSByZWplY3QoaXNFbXB0eSwgc2VsZWN0b3JBcnIpXG4gICAgY29uc3QgcGF5bG9hZENoZWNrID0gY3VycnkoQ2hhbm5lbFBheWxvYWRGaWx0ZXIuY2hlY2tQYXlsb2FkU2VsZWN0b3IpXG4gICAgcmV0dXJuIHBheWxvYWRDaGVjayhhcnIsIGRlYnVnTGFiZWwpXG4gIH1cbn1cbiIsImZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbCkge1xuICBjb25zdCBub25OdWxsT2JqZWN0ID0gdmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnXG4gIHJldHVybiBub25OdWxsT2JqZWN0ICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpICE9PSAnW29iamVjdCBSZWdFeHBdJyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSAhPT0gJ1tvYmplY3QgRGF0ZV0nXG59XG5cbmZ1bmN0aW9uIGVtcHR5VGFyZ2V0KHZhbCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gW10gOiB7fVxufVxuXG5mdW5jdGlvbiBjbG9uZUlmTmVjZXNzYXJ5KHZhbHVlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgY2xvbmUgPSBvcHRpb25zQXJndW1lbnQgJiYgb3B0aW9uc0FyZ3VtZW50LmNsb25lID09PSB0cnVlXG4gIHJldHVybiAoY2xvbmUgJiYgaXNNZXJnZWFibGVPYmplY3QodmFsdWUpKVxuICAgID8gZGVlcE1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSxcbiAgICAgIHZhbHVlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgOiB2YWx1ZVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gdGFyZ2V0LnNsaWNlKClcbiAgc291cmNlLmZvckVhY2goZnVuY3Rpb24oZSwgaSkge1xuICAgIGlmICh0eXBlb2YgZGVzdGluYXRpb25baV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBkZXN0aW5hdGlvbltpXSA9IGNsb25lSWZOZWNlc3NhcnkoZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QoZSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gZGVlcE1lcmdlKHRhcmdldFtpXSwgZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSBpZiAodGFyZ2V0LmluZGV4T2YoZSkgPT09IC0xKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGNsb25lSWZOZWNlc3NhcnkoZSwgb3B0aW9uc0FyZ3VtZW50KSlcbiAgICB9XG4gIH0pXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBtZXJnZU9iamVjdCh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0ge31cbiAgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldCkpIHtcbiAgICBPYmplY3Qua2V5cyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gY2xvbmVJZk5lY2Vzc2FyeSh0YXJnZXRba2V5XSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0pXG4gIH1cbiAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICghaXNNZXJnZWFibGVPYmplY3Qoc291cmNlW2tleV0pIHx8ICF0YXJnZXRba2V5XSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGNsb25lSWZOZWNlc3Nhcnkoc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGRlZXBNZXJnZSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9XG4gIH0pXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudCkge1xuICBjb25zdCBhcnJheSA9IEFycmF5LmlzQXJyYXkoc291cmNlKVxuICBjb25zdCBvcHRpb25zID0gb3B0aW9uc0FyZ3VtZW50IHx8IHsgYXJyYXlNZXJnZTogZGVmYXVsdEFycmF5TWVyZ2UgfVxuICBjb25zdCBhcnJheU1lcmdlID0gb3B0aW9ucy5hcnJheU1lcmdlIHx8IGRlZmF1bHRBcnJheU1lcmdlXG5cbiAgaWYgKGFycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0KVxuICAgICAgPyBhcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgICA6IGNsb25lSWZOZWNlc3Nhcnkoc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gIH1cbn1cblxuZGVlcE1lcmdlLmFsbCA9IGZ1bmN0aW9uIGRlZXBtZXJnZUFsbChhcnJheSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkgfHwgYXJyYXkubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCB0d28gZWxlbWVudHMnKVxuICB9XG5cbiAgLy8gd2UgYXJlIHN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IDIgdmFsdWVzLCBzbyBpdCBpcyBzYWZlIHRvIGhhdmUgbm8gaW5pdGlhbCB2YWx1ZVxuICByZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gZGVlcE1lcmdlKHByZXYsIG5leHQsIG9wdGlvbnNBcmd1bWVudClcbiAgfSlcbn1cblxuZXhwb3J0IHsgZGVlcE1lcmdlIH1cbiIsImltcG9ydCB7IGRlZmF1bHRUbywgbWF0Y2gsIGZvckVhY2gsIHRlc3QsIGluY2x1ZGVzLCB3aXRob3V0LCBjb21wbGVtZW50LCBpc0VtcHR5LCB2YWx1ZXMsIGlzTmlsLCBmaWx0ZXIsIF9fLCBrZXlzLCBjb21wb3NlLCBoZWFkLCBtYXAsIGNvbmQsIFQsIGFsbFBhc3MsIGNvbmNhdCwgdW5pcSB9IGZyb20gJ3JhbWRhJ1xuY29uc3QgaXNJT1MgPSAoKSA9PiB7XG4gIGNvbnN0IHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKClcbiAgLy8gbGV0IHNhZmFyaSA9IC9zYWZhcmkvLnRlc3QodXNlckFnZW50KTtcbiAgY29uc3QgaW9zID0gL2lwaG9uZXxpcG9kfGlwYWQvLnRlc3QodXNlckFnZW50KVxuICByZXR1cm4gaW9zID09PSB0cnVlXG59XG5cbmNvbnN0IGRlbGF5Q2FsbCA9IGFzeW5jKGZuLCB0aW1lKSA9PiB7XG4gIGZ1bmN0aW9uIHNsZWVwKG1zKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG4gIH1cblxuICBjb25zdCB0aW1lb3V0SGFuZGxlciA9IGFzeW5jKCkgPT4ge1xuICAgIGF3YWl0IHNsZWVwKDEpXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbilcbiAgfVxuXG4gIHdpbmRvdy5zZXRUaW1lb3V0KHRpbWVvdXRIYW5kbGVyLCB0aW1lKVxufVxuXG5jb25zdCBnZXRDb25zdHJ1Y3Rvck5hbWUgPSAob2JqKSA9PiB7XG4gIGlmIChvYmouY29uc3RydWN0b3IubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG9iai5jb25zdHJ1Y3Rvci5uYW1lXG4gIH1cbiAgY29uc3QgcmUgPSAvXihmdW5jdGlvblxccykoXFx3KykoXFwoLiopJC9cbiAgY29uc3Qgc3RyID0gb2JqLnRvU3RyaW5nKClcbiAgcmV0dXJuIGRlZmF1bHRUbyhTdHJpbmcoc3RyKS5zdWJzdHIoMCwgMTIpLCBtYXRjaChyZSwgc3RyKVsyXSlcbn1cblxuY29uc3QgYXJyRnJvbU1hcEtleXMgPSAobWFwKSA9PiB7XG4gIGNvbnN0IGFyciA9IFtdXG4gIGNvbnN0IGFkZEtleXNUb0FyciA9ICh2LCBrLCBpKSA9PiBhcnIucHVzaChrKVxuICBmb3JFYWNoKGFkZEtleXNUb0FyciwgbWFwKVxuICByZXR1cm4gYXJyXG59XG5cbmNvbnN0IGZpbmRTdHJGcm9tUmVnZXhBcnIgPSAob2JqLCBzdHIpID0+IHtcbiAgaWYgKG9ialtzdHJdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cbiAgY29uc3QgY2hlY2tJZk1hdGNoID0gcyA9PiB0ZXN0KG5ldyBSZWdFeHAocyksIHN0cilcbiAgY29uc3QgY2hlY2tTdHJNYXRjaCA9IGluY2x1ZGVzKHN0cilcbiAgY29uc3QgY2hlY2tJZlJlZ0V4TWF0Y2ggPSBjb21wb3NlKGluY2x1ZGVzKHRydWUpLCBtYXAoY2hlY2tJZk1hdGNoKSlcbiAgY29uc3QgcnVuTWF0Y2hDaGVja3MgPSBjb25kKFtcbiAgICBbY2hlY2tTdHJNYXRjaCwgKCkgPT4gc3RyXSxcbiAgICBbY2hlY2tJZlJlZ0V4TWF0Y2gsICgpID0+IHN0cl0sXG4gICAgW1QsICgpID0+IHVuZGVmaW5lZF1cbiAgXSlcbiAgcmV0dXJuIHJ1bk1hdGNoQ2hlY2tzKG9iailcbn1cblxuY29uc3QgZmluZFN0ck9yUmVnZXhNYXRjaFN0ciA9IChvYmosIHN0cikgPT4ge1xuICBpZiAob2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdHJcbiAgfVxuICBjb25zdCBjcmVhdGVSZSA9IHMgPT4gbmV3IFJlZ0V4cChzKVxuICBjb25zdCBjaGVja2VySWZSZWdleE1hdGNoRXhpc3RzID0gY29tcG9zZShoZWFkLCBmaWx0ZXIoY29tcG9zZSh0ZXN0KF9fLCBzdHIpLCBjcmVhdGVSZSkpKVxuICByZXR1cm4gY2hlY2tlcklmUmVnZXhNYXRjaEV4aXN0cyhrZXlzKG9iaikpXG59XG5cbmNvbnN0IGNsb3Nlc3QgPSAoYXJyYXksIG51bSkgPT4ge1xuICBsZXQgaSA9IDBcbiAgbGV0IG1pbkRpZmYgPSAxMDAwXG4gIGxldCBhbnNcbiAgZm9yIChpIGluIGFycmF5KSB7XG4gICAgY29uc3QgbSA9IE1hdGguYWJzKG51bSAtIGFycmF5W2ldKVxuICAgIGlmIChtIDwgbWluRGlmZikge1xuICAgICAgbWluRGlmZiA9IG1cbiAgICAgIGFucyA9IGFycmF5W2ldXG4gICAgfVxuICB9XG4gIHJldHVybiBhbnNcbn1cblxuY29uc3QgY29udmVydERvbVN0cmluZ01hcFRvT2JqID0gKGRvbU1hcCkgPT4ge1xuICBjb25zdCBvYmogPSB7fVxuICBmb3IgKGNvbnN0IGQgaW4gZG9tTWFwKSB7XG4gICAgb2JqW2RdID0gZG9tTWFwW2RdXG4gIH1cbiAgcmV0dXJuIG9ialxufVxuXG4vLyBjb25zdCBwYXNzUGFnZURhdGEgPSBwaWNrKFsncGFyYW1zJywgJ3JvdXRlSWQnLCAnZGF0YSddLCBfXyk7XG5cbmNvbnN0IHN1YnNjcmliZUZuID0ge1xuICBuZXh0OiAgICAgeCA9PiBjb25zb2xlLmxvZyhgbmV4dCAgICAgICR7eH1gKSxcbiAgZXJyb3I6ICAgIHggPT4gY29uc29sZS5sb2coYGVycm9yICAgICAke3h9YCksXG4gIGNvbXBsZXRlOiB4ID0+IGNvbnNvbGUubG9nKGBjb21wbGV0ZSAgJHt4fWApXG59XG5cbmNvbnN0IHJpZ2h0ID0geCA9PiAoe1xuICBtYXA6IGYgPT4gcmlnaHQoZih4KSksXG4gIGZvbGQ6IChmLCBnKSA9PiBnKHgpLFxuICBpbnNwZWN0OiAoKSA9PiBgcmlnaHQoJHt4fSlgXG5cbn0pXG5cbmNvbnN0IGlmTmlsVGhlblVwZGF0ZSA9ICh2YWwsIG5ld1ZhbCkgPT4ge1xuICBjb25zdCBpc05pbEJvb2wgPSBpc05pbCh2YWwpXG4gIHJldHVybiBpc05pbEJvb2wgPyBuZXdWYWwgOiB2YWxcbn1cblxuY29uc3QgbGVmdCA9IHggPT4gKHtcbiAgbWFwOiBmID0+IGxlZnQoeCksXG4gIGZvbGQ6IChmLCBnKSA9PiBmKHgpLFxuICBpbnNwZWN0OiAoKSA9PiBgbGVmdCgke3h9KWBcbn0pXG5cbmNvbnN0IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgPSAob2JqKSA9PiB7XG4gIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNFbXB0eSksIGhlYWQsIHZhbHVlcylcbiAgY29uc3QgaXNOb3ROaWwgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNOaWwpLCBoZWFkLCB2YWx1ZXMpXG4gIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90TmlsXSlcbiAgcmV0dXJuIGlzTm90TmlsQW5kSXNOb3RFbXB0eShvYmopXG59XG5cbmNvbnN0IGZyb21OdWxsYWJsZSA9IHggPT4geCAhPT0gbnVsbCA/IHJpZ2h0KHgpIDogbGVmdChudWxsKVxuXG5jb25zdCBmaW5kSW5PYmogPSAob2JqLCB2YWwsIGVycm9yID0gbnVsbCkgPT4ge1xuICBjb25zdCBmb3VuZCA9IG9ialt2YWxdXG4gIHJldHVybiBmb3VuZCA/IHJpZ2h0KGZvdW5kKSA6IGxlZnQoZXJyb3IpXG59XG5jb25zdCBwdWxsUm91dGVJbmZvID0gKCkgPT4ge1xuICBjb25zdCBzdHIgPSBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2gpXG4gIGNvbnN0IHJvdXRlSWQgPSBwdWxsTWFpblJvdXRlKHN0cilcbiAgY29uc3QgcGFyYW1zID0gcHVsbFBhcmFtcyhzdHIpXG4gIHJldHVybiB7IHJvdXRlSWQsIHBhcmFtcyB9XG59XG5cbmZ1bmN0aW9uIGdldEFsbE1ldGhvZE5hbWVzKGluc3RhbmNlLCBvbWl0dGVkTWV0aG9kcyA9IFtdKSB7XG4gIC8vIE9wdGlvbmFsbHkgcmVuYW1lIGBpbnN0YW5jZWAgdG8gc29tZXRoaW5nIG1vcmUgZGVzY3JpcHRpdmU6XG4gIGNvbnN0IGJhc2VDbGFzc01ldGhvZHNBcnIgPSBbJ2xlbmd0aCcsICduYW1lJywgJ3Byb3RvdHlwZScsICdjb25zdHJ1Y3RvciddXG4gIGNvbnN0IGNvbWJpbmVkT21pdHRlZE1ldGhvZHMgPSBjb25jYXQoYmFzZUNsYXNzTWV0aG9kc0Fyciwgb21pdHRlZE1ldGhvZHMpXG5cbiAgLy8gRmlsdGVyIG91dCBvbWl0dGVkXG4gIGNvbnN0IG9taXRQcm9wc0Zyb21BcnIgPSBjb21wb3NlKHdpdGhvdXQoY29tYmluZWRPbWl0dGVkTWV0aG9kcyksIHVuaXEpXG5cbiAgLy8gUHVsbCBvdXQgaW5zdGFuY2UgbWV0aG9kc1xuICBjb25zdCBtZXRob2RzID0gb21pdFByb3BzRnJvbUFycihcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpXG4gIClcblxuICAvLyBQdWxsIG91dCBzdGF0aWMgbWV0aG9kc1xuICBjb25zdCBzdGF0aWNNZXRob2RzID0gb21pdFByb3BzRnJvbUFycihcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZS5jb25zdHJ1Y3RvcilcbiAgKVxuXG4gIGNvbnN0IGFsbE1ldGhvZHMgPSBjb25jYXQobWV0aG9kcywgc3RhdGljTWV0aG9kcylcblxuICByZXR1cm4geyBtZXRob2RzLCBzdGF0aWNNZXRob2RzLCBhbGxNZXRob2RzIH1cbn1cblxuLyogY29uc3QgZ2V0QWxsTWV0aG9kTmFtZXMzID0gKF90aGlzID0gdGhpcywgb21pdHRlZE1ldGhvZHMgPSBbXSkgPT4ge1xuICBjb25zdCBnZXRQcm9wTmFtZXNBcnIgPSAob2JqID0gdGhpcywgb21pdHRlZE1ldGhvZHMgPSBbXSkgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopXG4gIH1cbiAgLy8gRmlsdGVyIE1ldGhvZHNcbiAgY29uc3QgYmFzZUNsYXNzTWV0aG9kc0FyciA9IFsnbGVuZ3RoJywgJ25hbWUnLCAncHJvdG90eXBlJywgJ2NvbnN0cnVjdG9yJ11cbiAgb21pdHRlZE1ldGhvZHMgPSBjb25jYXQoYmFzZUNsYXNzTWV0aG9kc0Fyciwgb21pdHRlZE1ldGhvZHMpXG4gIGNvbnN0IG9taXRQcm9wc0Zyb21BcnIgPSBjb21wb3NlKHdpdGhvdXQob21pdHRlZE1ldGhvZHMpLCB1bmlxKVxuXG4gIC8vIFBVTEwgT1VUIE1FVEhPRCBOQU1FU1xuICBjb25zdCBtZXRob2RzID0gb21pdFByb3BzRnJvbUFycihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhfdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpKVxuICBjb25zdCBzdGF0aWNNZXRob2RzID0gb21pdFByb3BzRnJvbUFycihnZXRQcm9wTmFtZXNBcnIoX3RoaXMuY29uc3RydWN0b3IpKVxuICBjb25zdCBhbGxNZXRob2RzID0gY29uY2F0KG1ldGhvZHMsIHN0YXRpY01ldGhvZHMpXG5cbiAgcmV0dXJuIHsgbWV0aG9kcywgc3RhdGljTWV0aG9kcywgYWxsTWV0aG9kcyB9XG4gIC8vIHJldHVybiAnZm4nO1xufSAqL1xuXG4vLyBST1VURSBSRUdFWCBFWFBSRVNTSU9OU1xuY29uc3QgcmVtb3ZlU2xhc2hlcyA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihcXC8pKC4qKS9nLCAnJDInKVxuY29uc3Qgcm91dGVSRSA9IC9eKFxcLz8pKFxcdyopKFxcLz8pKC4qKS9nXG5jb25zdCBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGggPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXigjXFwvPykoLiopLywgJyQyJylcbmNvbnN0IHB1bGxTbGFzaEZyb21QYXRoID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oXFwvPykoLiopLywgJyQyJylcbmNvbnN0IHB1bGxNYWluUm91dGUgPSAoc3RyKSA9PiBzdHIucmVwbGFjZShyb3V0ZVJFLCAnJDInKVxuY29uc3QgcHVsbFBhcmFtcyA9ICAgIChzdHIpID0+IHN0ci5yZXBsYWNlKHJvdXRlUkUsICckNCcpXG5jb25zdCBwdWxsVHJhbnNsYXRlWCA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKikoLC4qKS8sICckNicpXG5jb25zdCBwdWxsVHJhbnNsYXRlWSA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKSguKikvLCAnJDcnKVxuY29uc3QgcHVsbFRyYW5zbGF0ZVlGcm9tSGVhZGVyID0gc3RyID0+IHN0ci5yZXBsYWNlKC9eKHRyYW5zZm9ybTogbWF0cml4KSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCopKFxcKS4qOykvLCAnJDYnKVxuZXhwb3J0IHsgZ2V0Q29uc3RydWN0b3JOYW1lLCBhcnJGcm9tTWFwS2V5cywgZ2V0QWxsTWV0aG9kTmFtZXMsIGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIsIGZpbmRTdHJGcm9tUmVnZXhBcnIsIGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwsIGlzSU9TLCBwdWxsUm91dGVJbmZvLCBwdWxsVHJhbnNsYXRlWUZyb21IZWFkZXIsIHB1bGxTbGFzaEZyb21QYXRoLCBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgsIGNsb3Nlc3QsIHB1bGxUcmFuc2xhdGVZLCBwdWxsVHJhbnNsYXRlWCwgcHVsbE1haW5Sb3V0ZSwgcHVsbFBhcmFtcywgcmlnaHQsIGxlZnQsIGZyb21OdWxsYWJsZSwgZmluZEluT2JqLCBpZk5pbFRoZW5VcGRhdGUsIHJlbW92ZVNsYXNoZXMsIHN1YnNjcmliZUZuLCBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmosIGRlbGF5Q2FsbCB9XG4iLCJpbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSAncmFtZGEnXG5leHBvcnQgZnVuY3Rpb24gZ2MoKSB7XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc3QgbG9vcE0gPSBtID0+IHVuZGVmaW5lZFxuICAgIGZvckVhY2gobG9vcE0sIHRoaXMpXG4gIH1cbiAgc2V0VGltZW91dChjbGVhbnVwLCAxKVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJhc2VDb3JlTWl4aW5zKCkge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZXByb3BzTWFwOiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKVxuICAgICAgY29uc3Qgb2JqS2V5ID0geyB2c2lkOiB0aGlzLnByb3BzLnZzaWQgfVxuICAgICAgd20uc2V0KG9iaktleSwgdGhpcy5wcm9wcylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogb2JqS2V5LFxuICAgICAgICB3ZWFrTWFwOiB3bVxuICAgICAgfVxuICAgIH0sXG4gICAgZ2M6IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yIChjb25zdCBtIGluIHRoaXMpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbbV1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzXG4gICAgfSxcbiAgICBjcmVhdGVJZDogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBsZXQgbnVtID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgxMDAwMDAwMCkgKiAxMDAwMDAwMCk7XG4gICAgICAvLyBjb25zdCBudW0gPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCk7O1xuICAgICAgY29uc3QgbnVtID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvXFxkL2dtLCAnJykuc3Vic3RyaW5nKDEsIDgpXG4gICAgICByZXR1cm4gbnVtKClcbiAgICAgIC8vIHJldHVybiBgdnNpZC0ke251bSgpfWA7XG4gICAgfSxcbiAgICBzZXRUcmFjZUZ1bmM6IGZ1bmN0aW9uKGRlYnVnKSB7XG4gICAgICByZXR1cm4gZGVidWcgPT09IHRydWVcbiAgICAgICAgPyBjb25zb2xlLmxvZ1xuICAgICAgICA6ICgpID0+IHtcbiAgICAgICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWaWV3U3RyZWFtUGF5bG9hZCB9IGZyb20gJy4uLy4uL3ZpZXdzL3ZpZXctc3RyZWFtLXBheWxvYWQuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlU3RyZWFtc01peGlucygpIHtcbiAgcmV0dXJuIHtcbiAgICB0ZXN0RnVuYzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICBjb25zb2xlLmxvZygnc3RyZWFtIG1peGluIGlzICcsIHN0cilcbiAgICB9LFxuICAgIHNlbmRSb3V0ZVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgLyoqIFRPRE86IEFERCBBIENIRUNLIEZPUiBFTkQgUk9VVEUgQU5EIFRSQU5TRk9STSBUTyBFTVBUWSAqL1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnQ0hBTk5FTF9ST1VURScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpXG4gICAgfSxcbiAgICBzZW5kVUlQYXlsb2FkOiBmdW5jdGlvbihvYnMsIGRhdGEpIHtcbiAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoJ0NIQU5ORUxfVUknLCBvYnMsIGRhdGEsICdzdWJzY3JpYmUnKVxuICAgIH1cbiAgICAvKlxuICAgIHNlbmRJbmZvVG9DaGFubmVsOiBmdW5jdGlvbihjaGFubmVsTmFtZSwgcGF5bG9hZCkge1xuICAgICAgY29uc3QgZ2V0UHJvcCA9IHN0ciA9PiBwcm9wKHN0ciwgdGhpcy5wcm9wcyk7XG4gICAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbE5hbWU7XG4gICAgICBsZXQgc3JjRWxlbWVudCA9IHtcbiAgICAgICAgdnNpZDogZ2V0UHJvcCgndnNpZCcpLFxuICAgICAgICBlbDogZ2V0UHJvcCgnZWwnKSxcbiAgICAgICAgdmlld05hbWU6IGdldFByb3AoJ25hbWUnKVxuICAgICAgfTtcbiAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICBwYXlsb2FkLCBjaGFubmVsLCBzcmNFbGVtZW50XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZChjaGFubmVsTmFtZSwgbmV3IG9mKCcnKSwgZGF0YSxcbiAgICAgICAgJ3N1YnNjcmliZScpO1xuICAgIH0sXG4gICAgKi9cbiAgICAvKiAgICBzZW5kTGlmZVN0cmVhbVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnTElGRVNUUkVBTScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpO1xuICAgIH0sXG5cbiAgICBjcmVhdGVMaWZlU3RyZWFtUGF5bG9hZDogZnVuY3Rpb24oU1RFUCwgZGF0YSA9IHt9LCB0eXBlID0gJ3BhcmVudCcpIHtcbiAgICAgIGxldCB2aWV3SWQgPSBgJHt0aGlzLnByb3BzLm5hbWV9OiAke3RoaXMucHJvcHMudnNpZH1gO1xuICAgICAgcmV0dXJuIG5ldyBMaWZlc3RyZWFtUGF5bG9hZCgnTElGRVNUUkVBTScsIFNURVAsIHR5cGUsIHZpZXdJZCwgZGF0YSkuZGF0YTtcbiAgICB9ICovXG4gIH1cbn1cbiIsImltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuLi92aWV3cy92aWV3LXN0cmVhbS5qcydcbmltcG9ydCB7IGN1cnJ5IH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgUm91dGVDaGFubmVsVXBkYXRlciB7XG4gIGNvbnN0cnVjdG9yKGN4dCkge1xuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcoY3h0LnByb3BzLm5hbWUpXG4gICAgY29uc3QgaWQgPSBgJHtuYW1lfV9ST1VURV9VUERBVEVSYFxuXG4gICAgY29uc3Qgc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSA9IGN1cnJ5KFJvdXRlQ2hhbm5lbFVwZGF0ZXIuY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iailcbiAgICByZXR1cm4gc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSh7IGlkLCBuYW1lIH0pXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iaihwcm9wcywgZGF0YSkge1xuICAgIGNvbnN0IHsgbmFtZSwgaWQgfSAgPSBwcm9wc1xuICAgIGNvbnN0IHBheWxvYWQgPSBkYXRhXG4gICAgY29uc3QgdnMgPSBuZXcgVmlld1N0cmVhbSh7XG4gICAgICBpZCwgbmFtZSwgZGF0YVxuICAgIH0pXG5cbiAgICB2cy5vblJlbmRlcmVkID0gKCkgPT4ge1xuICAgICAgdnMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfUk9VVEUnLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIHZzLmFmdGVyQnJvYWRjYXN0RXZlbnRzID0gKCkgPT4ge1xuICAgICAgdnMuZGlzcG9zZVZpZXdTdHJlYW0oKVxuICAgIH1cblxuICAgIHZzLmFwcGVuZFRvTnVsbCgpXG4gIH1cbn1cbiIsImltcG9ydCB7IGNsb25lLCBjb21wb3NlLCBmcm9tUGFpcnMsIGlzLCBwYXRoLCB0b1BhaXJzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5jb25zdCBnZXRQcm9wVHlwZSA9IChwcnApID0+IHtcbiAgbGV0IHR5cGUgPSB0eXBlb2YgcHJwXG4gIGlmIChbJ251bWJlcicsICdib29sZWFuJywgJ3N0cmluZyddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgdHlwZSA9ICdwcmltaXRpdmUnXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcnApKSB7XG4gICAgICB0eXBlID0gJ2FycmF5J1xuICAgIH0gZWxzZSBpZiAocHJwID09PSBudWxsKSB7XG4gICAgICB0eXBlID0gJ3VuZGVmaW5lZCdcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHR5cGVcbn1cblxuY29uc3QgY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqID0gKHByb3h5T2JqLCBwcm94eVJldml2ZXJNZXRob2QpID0+IHtcbiAgY29uc3QgeyBfX3Byb3h5X19wcm94eU5hbWUgfSA9IHByb3h5T2JqXG5cbiAgaWYgKF9fcHJveHlfX3Byb3h5TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5lcnJvcignb2JqZWN0IGlzIG5vdCBwcm94eSBvYmplY3QgJywgcHJveHlPYmopXG4gIH1cblxuICBjb25zdCBjbG9uZU5lc3RlZFByb3h5T2JqID0gKHRhcmdldCwgcGF0aEFycikgPT4ge1xuICAgIGNvbnN0IG5lc3RlZFByb3h5T2JqID0gcGF0aChwYXRoQXJyLCBwcm94eU9iailcbiAgICBjb25zdCB7IF9fcHJveHlfX2lzUHJveHksIF9fcHJveHlfX3Byb3BzIH0gPSBuZXN0ZWRQcm94eU9ialxuICAgIHJldHVybiBfX3Byb3h5X19pc1Byb3h5ID8gcHJveHlSZXZpdmVyTWV0aG9kKHRhcmdldCwgX19wcm94eV9fcHJvcHMpIDogdGFyZ2V0XG4gIH1cblxuICBjb25zdCByb290T2JqID0gY2xvbmVOZXN0ZWRQcm94eU9iaihjbG9uZShwcm94eU9iaiksIFtdKVxuXG4gIGNvbnN0IHByb3h5SXRlcmFibGUgPSAoaXRlck9iaiwgaXRlclBhdGgpID0+IHtcbiAgICBjb25zdCBkYXRhUGF0aCA9IGl0ZXJQYXRoIHx8IFtdXG4gICAgY29uc3QgbG9vcE9iaiA9IChba2V5LCBwcm9wXSkgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IGdldFByb3BUeXBlKHByb3ApXG4gICAgICBjb25zdCBjbG9uZWRQYXRoID0gWy4uLmRhdGFQYXRoXVxuICAgICAgY2xvbmVkUGF0aC5wdXNoKGtleSlcbiAgICAgIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGl0ZXJPYmpba2V5XSA9IGNsb25lTmVzdGVkUHJveHlPYmoocHJvcCwgY2xvbmVkUGF0aClcbiAgICAgICAgcHJveHlJdGVyYWJsZShwcm9wLCBjbG9uZWRQYXRoKVxuICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuZW50cmllcyhpdGVyT2JqKS5mb3JFYWNoKGxvb3BPYmopXG4gIH1cblxuICBwcm94eUl0ZXJhYmxlKHJvb3RPYmopXG4gIC8vIGNvbnNvbGUudGltZUVuZCgncHJveGlmeTInKTtcblxuICByZXR1cm4gcm9vdE9ialxufVxuXG5leHBvcnQgY29uc3Qgc2FmZUNsb25lID0gZnVuY3Rpb24obykge1xuICBjb25zdCB7IF9fcHJveHlfX3Byb3h5TmFtZSB9ID0gb1xuICBpZiAoX19wcm94eV9fcHJveHlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBwcm94eVJldml2ZXJNZXRob2QgPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0UHJveHlSZXZpdmVyKF9fcHJveHlfX3Byb3h5TmFtZSlcbiAgICBpZiAodHlwZW9mIHByb3h5UmV2aXZlck1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNtc0RhdGFSZXZpdmVOZXN0ZWRQcm94eU9iaihvLCBwcm94eVJldml2ZXJNZXRob2QpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSlcbiAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QpXG4gIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gIGNvbnN0IGlzSXRlcmFibGUgPSBpc0l0ZXIobylcbiAgcmV0dXJuIGlzSXRlcmFibGUgPyBjb21wb3NlKGZyb21QYWlycywgdG9QYWlycywgY2xvbmUpKG8pIDogY2xvbmUobylcbn1cbiIsImltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5J1xuXG5sZXQgX3Nhbml0aXplSFRNTFxubGV0IGlzQ29uZmlndXJlZCA9IGZhbHNlXG5cbmNvbnN0IHNhbml0aXplSFRNTENvbmZpZ3VyZSA9IChjb25maWcpID0+IHtcbiAgaWYgKCFpc0NvbmZpZ3VyZWQpIHtcbiAgICBpZiAoY29uZmlnLnN0cmljdCkge1xuICAgICAgaWYgKHdpbmRvdy50cnVzdGVkVHlwZXMpIHtcbiAgICAgICAgY29uc3QgcG9saWN5ID0gd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koJ2RlZmF1bHQnLCB7XG4gICAgICAgICAgY3JlYXRlSFRNTDogKHRvX2VzY2FwZSkgPT4gRE9NUHVyaWZ5LnNhbml0aXplKHRvX2VzY2FwZSwgeyBSRVRVUk5fVFJVU1RFRF9UWVBFOiBmYWxzZSB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIF9zYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4gcG9saWN5LmNyZWF0ZUhUTUwoaHRtbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9zYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4gRE9NUHVyaWZ5LnNhbml0aXplKGh0bWwpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4gaHRtbCAvLyBObyBzYW5pdGl6YXRpb24gaWYgbm90IHJlcXVpcmVkXG4gICAgfVxuICAgIGlzQ29uZmlndXJlZCA9IHRydWVcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLndhcm4oJ3Nhbml0aXplSFRNTCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQuIFJlY29uZmlndXJhdGlvbiBpcyBub3QgYWxsb3dlZC4nKVxuICB9XG59XG5cbmNvbnN0IHNhbml0aXplSFRNTCA9IChodG1sKSA9PiB7XG4gIGlmICghaXNDb25maWd1cmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzYW5pdGl6ZUhUTUwgaXMgbm90IGNvbmZpZ3VyZWQuIENhbGwgc2FuaXRpemVIVE1MQ29uZmlndXJlKCkgd2l0aCBhcHByb3ByaWF0ZSBjb25maWcuJylcbiAgfVxuICByZXR1cm4gX3Nhbml0aXplSFRNTChodG1sKVxufVxuXG5leHBvcnQgeyBzYW5pdGl6ZUhUTUxDb25maWd1cmUgfVxuZXhwb3J0IGRlZmF1bHQgc2FuaXRpemVIVE1MXG4iLCJpbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVQbHVnaW5zTWV0aG9kcyB9IGZyb20gJy4vc3B5bmUtcGx1Z2lucy1tZXRob2RzLmpzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi9kZWVwLW1lcmdlLmpzJ1xuXG5sZXQgX2NvbmZpZ1xubGV0IF9jaGFubmVsc1xubGV0IF9jaGFubmVsc01hcFxubGV0IF9pbml0aWFsaXplZFxubGV0IF9kZWJ1ZyA9IHRydWVcbmNvbnN0IF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZSA9IFtdXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xubGV0IF9saW5rc0RhdGFcbmxldCBfbmF2TGlua3NcbmxldCBfSU1HX1BBVEhcbmNvbnN0IF9kb05vdFRyYWNrQ2hhbm5lbHNBcnIgPSBbXVxuY29uc3QgX3Byb3hpZXNNYXAgPSBuZXcgTWFwKClcblxuZnVuY3Rpb24gcmFuZG9tNkNoYXJzKCkge1xuICAvLyBGb3Igc2ltcGxpY2l0eTogc2xpY2UoMiwgOCkgZ2V0cyA2IHJhbmRvbSBjaGFycyBmcm9tIHRoZSBzdWJzdHJpbmdcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpO1xufVxuXG5jb25zdCBfc3B5bmVQbHVnaW5NZXRob2RzID0gbmV3IFNweW5lUGx1Z2luc01ldGhvZHMoKVxuXG5jbGFzcyBTcHluZUFwcFByb3BlcnRpZXNDbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIF9pbml0aWFsaXplZCA9IGZhbHNlXG4gIH1cblxuICBnZXQgY2hhbm5lbHNNYXAoKSB7XG4gICAgcmV0dXJuIF9jaGFubmVsc01hcFxuICB9XG5cbiAgZ2V0IGluaXRpYWxpemVkKCkge1xuICAgIHJldHVybiBfaW5pdGlhbGl6ZWRcbiAgfVxuXG4gIGdldCBjb25maWcoKSB7XG4gICAgcmV0dXJuIF9jb25maWdcbiAgfVxuXG4gIGdldCBkZWJ1ZygpIHtcbiAgICByZXR1cm4gX2RlYnVnXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBtb3N0bHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+TGlzdGluZyB0aGUgcmVnaXN0ZXJlZWQgQ2hhbm5lbHMgaW4gdGhlIGJyb3dzZXIgY29uc29sZTwvaDQ+J11cbiAgICogU3B5bmVBcHAubGlzdENoYW5uZWxzKCk7XG4gICAqXG4gICAqIEByZXR1cm5zIEEgbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCBjaGFubmVsc1xuICAgKi9cbiAgc3RhdGljIGxpc3RDaGFubmVscygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSlcbiAgfVxuXG4gIGluaXRpYWxpemUoZGVmYXVsdENvbmZpZyA9IHt9LCBjb25maWcgPSB7fSwgY2hhbm5lbHNNYXAsIHJvdXRlVXRpbHMpIHtcbiAgICBfY2hhbm5lbHMgPSBjaGFubmVsc01hcFxuICAgIF9jb25maWcgPSBkZWVwTWVyZ2UoZGVmYXVsdENvbmZpZywgY29uZmlnKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiY29uZmlnIGlzIFwiLCB7IGRlZmF1bHRDb25maWcsY29uZmlnIH0pO1xuICAgIGlmIChfY29uZmlnLmNoYW5uZWxzICYmIF9jb25maWcuY2hhbm5lbHMuUk9VVEUpIHtcbiAgICAgIC8vIF9jb25maWcgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNvbmZvcm1Sb3V0ZU9iamVjdChfY29uZmlnKVxuICAgICAgX2NvbmZpZyA9IHJvdXRlVXRpbHMuY29uZm9ybVJvdXRlT2JqZWN0KF9jb25maWcpXG4gICAgfVxuICAgIF9JTUdfUEFUSCA9IF9jb25maWc/LklNR19QQVRIXG4gICAgX2RlYnVnID0gX2NvbmZpZy5kZWJ1ZyAhPT0gdW5kZWZpbmVkID8gX2NvbmZpZy5kZWJ1ZyA6IF9kZWJ1Z1xuICAgIHRoaXMuZ2V0Q2hhbm5lbEFjdGlvbnMgPSBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMuYmluZChfY2hhbm5lbHMpXG4gICAgdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzID0gX2NoYW5uZWxzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMuYmluZChfY2hhbm5lbHMpXG4gICAgX2luaXRpYWxpemVkID0gdHJ1ZVxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gX2luaXRpYWxpemVkXG4gICAgdGhpcy5zZXRDaGFubmVsc01hcCgpXG4gICAgaWYgKGNvbmZpZz8uYmFzZUhyZWYpIHtcbiAgICAgIHRoaXMuc2V0SGVhZEJhc2VIcmVmKGNvbmZpZy5iYXNlSHJlZilcbiAgICB9XG4gICAgcmV0dXJuIF9jb25maWdcbiAgfVxuXG4gIHNldEhlYWRCYXNlSHJlZihzdHIpIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgYmFzZSBlbGVtZW50XG4gICAgY29uc3QgYmFzZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKVxuICAgIC8vIFNldCB0aGUgaHJlZiBhdHRyaWJ1dGUgdG8gdGhlIGRlc2lyZWQgYmFzZSBVUkxcbiAgICBiYXNlVGFnLmhyZWYgPSBzdHIgLy8gWW91IGNhbiBzZXQgdGhpcyB0byBhbnkgYmFzZSBVUkxcbiAgICAvLyBBcHBlbmQgdGhlIGJhc2UgZWxlbWVudCB0byB0aGUgaGVhZCBzZWN0aW9uIG9mIHRoZSBkb2N1bWVudFxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYmFzZVRhZylcbiAgfVxuXG4gIGNvbmZvcm1Sb3V0ZUNvbmZpZyhhZGQ0MDRQcm9wcyA9IGZhbHNlKSB7XG4gICAgLyoqXG4gICAgICogVEhJUyBNRVRIT0QgSVMgUFJJTUFSSUxZIFVTRUQgRk9SIFNQQSBHRU4gU0lURSBHRU5FUkFUSU9OXG4gICAgICovXG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICBfY29uZmlnID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jb25mb3JtUm91dGVPYmplY3QoX2NvbmZpZywgYWRkNDA0UHJvcHMpXG4gIH1cblxuICBzZXRDaGFubmVsc01hcCgpIHtcbiAgICBjb25zdCBnZXRTdHJlYW0gPSBfY2hhbm5lbHMuZ2V0U3RyZWFtLmJpbmQoX2NoYW5uZWxzKVxuICAgIGNvbnN0IHRlc3RTdHJlYW0gPSAgX2NoYW5uZWxzLnRlc3RTdHJlYW0uYmluZChfY2hhbm5lbHMpXG4gICAgY29uc3QgZ2V0UHJveHlTdWJqZWN0ID0gX2NoYW5uZWxzLmdldFByb3h5U3ViamVjdC5iaW5kKF9jaGFubmVscylcblxuICAgIF9jaGFubmVsc01hcCA9IHsgZ2V0U3RyZWFtLCB0ZXN0U3RyZWFtLCBnZXRQcm94eVN1YmplY3QgfVxuICB9XG5cbiAgc2V0UHJvcChrZXksIHZhbCwgaXNUZW1wID0gZmFsc2UpIHtcbiAgICBpZiAoaXNUZW1wKSB7XG4gICAgICBfY29uZmlnLmVwaGVtZXJhbFByb3BzW2tleV0gPSB2YWw7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBfY29uZmlnLnRtcFByb3BzW2tleV0gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiAga2V5O1xuICB9XG5cbiAgZ2V0UHJvcChrZXkpIHtcbiAgICBpZiAoX2NvbmZpZy5lcGhlbWVyYWxQcm9wcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb25zdCB0ZW1wVmFsID0gX2NvbmZpZy5lcGhlbWVyYWxQcm9wc1trZXldO1xuICAgICAgZGVsZXRlIF9jb25maWcuZXBoZW1lcmFsUHJvcHNba2V5XTtcbiAgICAgIHJldHVybiB0ZW1wVmFsO1xuICAgIH1cbiAgICByZXR1cm4gX2NvbmZpZz8udG1wUHJvcHM/LltrZXldO1xuICB9XG5cbiAgY3JlYXRlVGVtcFByb3AodmFsdWUpIHtcbiAgICBjb25zdCBrZXkgPSByYW5kb202Q2hhcnMoKTtcbiAgICB0aGlzLnNldFByb3Aoa2V5LCB2YWx1ZSwgdHJ1ZSk7IC8vIGlzVGVtcCA9IHRydWVcbiAgICByZXR1cm4ga2V5O1xuICB9XG5cblxuICBzZXRDaGFubmVsQ29uZmlnKGNoYW5uZWxOYW1lLCBjb25maWcpIHtcbiAgICBfY29uZmlnLmNoYW5uZWxzW2NoYW5uZWxOYW1lXSA9IGNvbmZpZ1xuICAgIHJldHVybiBfY29uZmlnLmNoYW5uZWxzW2NoYW5uZWxOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBjaGVjayBpbiB0aGUgY29uc29sZSBvciBpbiB0aGUgY29kZSB3aGF0IGFjdGlvbnMgYXJlIGF2YWlsYWJsZSB0byBiZSBsaXN0ZW5lZCB0by5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQW4gYXJyYXkgb2YgQWN0aW9ucyB0aGF0IGNhbiBiZSBsaXN0ZW5lZCB0b1xuICAgKi9cbiAgLyogIGdldENoYW5uZWxBY3Rpb25zKGNoYW5uZWxOYW1lKSB7XG4gICAgcmV0dXJuIF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucyhjaGFubmVsTmFtZSk7XG4gIH0gKi9cblxuICBnZXRDaGFubmVsQ29uZmlnKGNoYW5uZWxOYW1lLCBjb25maWcgPSBfY29uZmlnKSB7XG4gICAgaWYgKGNoYW5uZWxOYW1lID09PSAnQ0hBTk5FTF9ST1VURScpIHtcbiAgICAgIGNoYW5uZWxOYW1lID0gJ1JPVVRFJ1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbE5hbWUgPT09ICdDSEFOTkVMX1dJTkRPVycpIHtcbiAgICAgIGNoYW5uZWxOYW1lID0gJ1dJTkRPVydcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQgfHwgX2NvbmZpZy5jaGFubmVscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NweW5lIHdhcm5pbmc6IFNweW5lIGNvbmZpZyBvYmplY3QgaXMgZW1wdHkhJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWxDb25maWcgPSBfY29uZmlnLmNoYW5uZWxzW2NoYW5uZWxOYW1lXVxuXG4gICAgaWYgKGNoYW5uZWxDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSB3YXJuaW5nOiBTcHluZSBjb25maWd1cmF0aW9uIGZvciBjaGFubmVsLCAke2NoYW5uZWxOYW1lfSBpcyBlbXB0eSFgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5uZWxDb25maWdcbiAgfVxuXG4gIHJlZ2lzdGVyQ2hhbm5lbCgpIHtcblxuICB9XG5cbiAgYWRkUGx1Z2luQ29uZmlnKHBsdWdpbk5hbWUsIHBsdWdpbkNvbmZpZyA9IHt9KSB7XG4gICAgaWYgKF9jb25maWcucGx1Z2lucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBfY29uZmlnLnBsdWdpbnMgPSB7fVxuICAgIH1cbiAgICB0aGlzLmFkZFBsdWdpbk1ldGhvZHMocGx1Z2luQ29uZmlnLnBsdWdpbk1ldGhvZHMpXG5cbiAgICBfY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV0gPSBwbHVnaW5Db25maWdcbiAgfVxuXG4gIGdldFBsdWdpbnNNZXRob2RPYmoocGx1Z2luTWV0aG9kc09iaikge1xuICAgIGlmIChwbHVnaW5NZXRob2RzT2JqKSB7XG4gICAgICB0aGlzLmFkZFBsdWdpbk1ldGhvZHMocGx1Z2luTWV0aG9kc09iailcbiAgICB9XG5cbiAgICByZXR1cm4gX3NweW5lUGx1Z2luTWV0aG9kcy5wbHVnaW5NZXRob2RzT2JqXG4gIH1cblxuICBhZGRQbHVnaW5NZXRob2RzKHBsdWdpbk1ldGhvZHMpIHtcbiAgICBpZiAocGx1Z2luTWV0aG9kcykge1xuICAgICAgX3NweW5lUGx1Z2luTWV0aG9kcy5hZGRNZXRob2RzKHBsdWdpbk1ldGhvZHMpXG4gICAgfVxuICB9XG5cbiAgZG9Ob3RUcmFja0NoYW5uZWwoY2hhbm5lbE5hbWUpIHtcbiAgICBfZG9Ob3RUcmFja0NoYW5uZWxzQXJyLnB1c2goY2hhbm5lbE5hbWUpXG4gIH1cblxuICBnZXRVbnRyYWNrZWRDaGFubmVsc0xpc3QoKSB7XG4gICAgcmV0dXJuIF9kb05vdFRyYWNrQ2hhbm5lbHNBcnJcbiAgfVxuXG4gIHJlZ2lzdGVyUHJveHlSZXZpdmVyKG5hbWUsIG1ldGhvZCkge1xuICAgIF9wcm94aWVzTWFwLnNldChuYW1lLCBtZXRob2QpXG4gICAgLy8gY29uc29sZS5sb2coXCJSRUdJU1RFUkQgUFJPWFkgUkVWSVZFUlwiLF9wcm94aWVzTWFwLCBfcHJveGllc01hcC5nZXQobmFtZSkpO1xuICB9XG5cbiAgLy8gVGhpcyBpcyB0aGUgbmV3IG1ldGhvZCB5b3UgYWRkXG4gIHJlZ2lzdGVyUGx1Z2luKHBsdWdpbkluc3RhbmNlKSB7XG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgY29uc29sZS53YXJuKCdTcHluZUFwcCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiBQbHVnaW4gd2lsbCBub3QgYmUgZnVsbHkgcmVnaXN0ZXJlZC4nKVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZyhcIklOU1RBTkNFIFwiLHRoaXMsIHBsdWdpbkluc3RhbmNlKVxuXG4gICAgcGx1Z2luSW5zdGFuY2UucmVnaXN0ZXIodGhpcylcbiAgfVxuXG4gIGdldFByb3h5UmV2aXZlcihwcm94eU5hbWUpIHtcbiAgICByZXR1cm4gX3Byb3hpZXNNYXAuZ2V0KHByb3h5TmFtZSlcbiAgfVxuXG4gIGdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZShwbHVnaW5OYW1lKSB7XG4gICAgcmV0dXJuIF9jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXVxuICB9XG5cbiAgZ2V0IElNR19QQVRIKCkge1xuICAgIHJldHVybiBfSU1HX1BBVEhcbiAgfVxuXG4gIGdldCBleGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZSgpIHtcbiAgICByZXR1cm4gX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlXG4gIH1cblxuICAvLyBTZXR0ZXIgZm9yIF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZVxuICBzZXQgZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gUHVzaCBhIHNpbmdsZSBzdHJpbmcgaW50byB0aGUgYXJyYXkgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgaWYgKCFfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgIF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS5wdXNoKHZhbHVlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIE1lcmdlIGFuIGFycmF5IGludG8gdGhlIGV4aXN0aW5nIGFycmF5LCBhdm9pZGluZyBkdXBsaWNhdGVzXG4gICAgICB2YWx1ZS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnICYmICFfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgICAgICBfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdmFsdWUgcHJvdmlkZWQgdG8gZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUuIE9ubHkgc3RyaW5ncyBvciBhcnJheXMgYXJlIGFsbG93ZWQuJylcbiAgICB9XG4gIH1cblxuICBnZXQgbGlua3NEYXRhKCkge1xuICAgIGNvbnNvbGUud2FybignZ2V0IGxpbmtzIGRhdGEgaW4gU3B5bmVBcHBQcm9wZXJ0aWVzIGlzIGRlcHJlY2F0ZWQsIHVzZSBuYXZMaW5rcycpXG4gICAgcmV0dXJuIF9uYXZMaW5rc1xuICB9XG5cbiAgc2V0IGxpbmtzRGF0YShhcnIpIHtcbiAgICBjb25zb2xlLndhcm4oJ3NldCBsaW5rcyBkYXRhIGluIFNweW5lQXBwUHJvcGVydGllcyBpcyBkZXByZWNhdGVkLCB1c2UgbmF2TGlua3MnKVxuICB9XG5cbiAgZ2V0IG5hdkxpbmtzKCkge1xuICAgIHJldHVybiBfbmF2TGlua3NcbiAgfVxuXG4gIHNldCBuYXZMaW5rcyhhcnIpIHtcbiAgICBfbmF2TGlua3MgPSBhcnJcbiAgfVxuXG4gIHRlbXBHZXRDaGFubmVsc0luc3RhbmNlKCkge1xuXG4gIH1cblxuICB0ZW1wR2V0Q29uZmlnKCkge1xuXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFNweW5lQXBwUHJvcGVydGllcyA9IG5ldyBTcHluZUFwcFByb3BlcnRpZXNDbGFzcygpXG4iLCJpbXBvcnQgeyBhbGxQYXNzLCBjb21wb3NlLCBpcywga2V5cywgbm90LCBwcm9wIH0gZnJvbSAncmFtZGEnXG5cbmNvbnN0IF9wbHVnaW5NZXRob2RzT2JqID0gT2JqZWN0LmNyZWF0ZSh7fSlcblxuY29uc3QgaXNOb3RBcnIgPSBjb21wb3NlKG5vdCwgaXMoQXJyYXkpKVxuLy8gY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBvc2Uobm90LCBpc0VtcHR5KVxuLy8gY29uc3QgaXNOb25FbXB0eVN0ciA9IGFsbFBhc3MoW2lzKFN0cmluZyksIGlzTm90RW1wdHldKVxuLy8gY29uc3QgaXNOb25FbXB0eUFyciA9IGFsbFBhc3MoW2lzKEFycmF5KSwgaXNOb3RFbXB0eV0pXG5jb25zdCBpc09iamVjdEZuID0gY29tcG9zZShhbGxQYXNzKFtpc05vdEFyciwgaXMoT2JqZWN0KV0pKVxuLy8gY29uc3QgaXNOb25FbXB0eU9iamVjdEZuID0gY29tcG9zZShhbGxQYXNzKFtpc05vdEVtcHR5LCBpc05vdEFyciwgaXMoT2JqZWN0KV0pKVxuXG5leHBvcnQgY2xhc3MgU3B5bmVQbHVnaW5zTWV0aG9kcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIF9wbHVnaW5NZXRob2RzT2JqLmZvbyA9ICgpID0+IGNvbnNvbGUubG9nKCd1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLicpXG4gIH1cblxuICBhZGRNZXRob2Qoa2V5LCBmbiwgdGVzdCA9IGZhbHNlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfcGx1Z2luTWV0aG9kc09iaiwga2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgd2FyblN0ciA9IGBTcHluZSBXYXJuaW5nOiB0aGUgbWV0aG9kIG5hbWUsICR7a2V5fSwgYWxyZWFkeSBleGlzdHMuYFxuICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgcmV0dXJuIHdhcm5TdHJcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgIH0gZWxzZSB7XG4gICAgICBfcGx1Z2luTWV0aG9kc09ialtrZXldID0gZm5cbiAgICB9XG4gIH1cblxuICBhZGRNZXRob2RzKG1ldGhvZHNPYmogPSB7fSwgdGVzdCA9IGZhbHNlKSB7XG4gICAgbGV0IHdhcm5TdHJcblxuICAgIGNvbnN0IGlzT2JqID0gaXNPYmplY3RGbihtZXRob2RzT2JqKVxuXG4gICAgaWYgKGlzT2JqID09PSBmYWxzZSkge1xuICAgICAgd2FyblN0ciA9IGBTcHluZSBXYXJuaW5nOiB0aGUgcGx1Z2luTWV0aG9kcyBwcm9wZXJ0eSwgJHtKU09OLnN0cmluZ2lmeShtZXRob2RzT2JqKX0gbmVlZHMgdG8gYmUgYW4gb2JqZWN0LmBcbiAgICAgIGlmICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiB3YXJuU3RyXG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4od2FyblN0cilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrRWFjaEtleUZvclZhbGlkTWV0aG9kID0gKGtleVN0cikgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kVmFsID0gcHJvcChrZXlTdHIsIG1ldGhvZHNPYmopXG5cbiAgICAgIGNvbnN0IGlzRnVuY3Rpb24gPSB0eXBlb2YgKG1ldGhvZFZhbCkgPT09ICdmdW5jdGlvbidcblxuICAgICAgaWYgKGlzRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5hZGRNZXRob2Qoa2V5U3RyLCBtZXRob2RWYWwsIHRlc3QpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuU3RyID0gYHRoZSB2YWx1ZSBmb3IgJHtrZXlTdHJ9IGlzIG5vdCBhIHZhbGlkIGZ1bmN0aW9uLmBcbiAgICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgICByZXR1cm4gd2FyblN0clxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kS2V5cyA9IGtleXMobWV0aG9kc09iailcblxuICAgIHJldHVybiBtZXRob2RLZXlzLm1hcChjaGVja0VhY2hLZXlGb3JWYWxpZE1ldGhvZCkuam9pbignLCcpXG4gIH1cblxuICBjaGVja0lmTWV0aG9kRXhpc3RzKGtleSkge1xuXG4gIH1cblxuICBnZXQgcGx1Z2luTWV0aG9kc09iaigpIHtcbiAgICByZXR1cm4gX3BsdWdpbk1ldGhvZHNPYmpcbiAgfVxufVxuIiwiaW1wb3J0IHsgZ2V0QWxsTWV0aG9kTmFtZXMgfSBmcm9tICcuL2ZycC10b29scy5qcydcbmltcG9ydCB7IHJlamVjdCwgY3VycnlOLCBfXywgbWFwIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVRyYWl0IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVUcmFpdFxuICAgKiBAdHlwZSBleHRlbmRhYmxlXG4gICAqIEBwYXJhbSB7dGhpc30gcGFyZW50Q29udGV4dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJlZml4XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXV0b0luaXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7dGhpc30gcGFyZW50Q29udGVudCAtID0gdW5kZWZpbmVkOyBUaGlzIGJpbmRzIGFsbCBtZXRob2RzIHdpdGhpbiBTcHluZVRyYWl0IGludG8gdGhlIHBhcmVudENvbnRleHQncyBvYmplY3RcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByZWZpeCAtID0gdW5kZWZpbmVkOyBTcHluZVRyYWl0cyBmb3JjZXMgYWxsIG1ldGhvZCBuYW1lcyB0byBiZWdpbiB3aXRoIHRoZSBzYW1lIHByZWZpeC4gVGhpcyBhbGxvd3Mgb3RoZXIgb2JqZWN0cyB0byBxdWlja2x5IHVuZGVyc3RhbmQgd2hlcmUgdGhlIG9yaWdpbmFsIG1ldGhvZCBpcyBzZXQuXG4gICAqIEBkZXNjXG4gICAqIFNweW5lVHJhaXRzIGFsbG93IHRoZSBlaGFuY2luZyBvZiBjbGFzc2VzIGFuZCBvdGhlciBvYmplY3RzIHdpdGhvdXQgaGF2aW5nIHRvIGV4dGVuZCBjbGFzc2VzIG9yIG1hbmlwdWxhdGUgZnVuY3Rpb24gcHJvdG90eXBlc1xuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihwYXJlbnRDb250ZXh0LCBwcmVmaXggPSAnJywgYXV0b0luaXQgPSB0cnVlKSB7XG4gICAgdGhpcy5wYXJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dFxuICAgIHRoaXMub21pdHRlZE1ldGhvZHMgPSBbXG4gICAgICAnYXV0b0JpbmRlcicsXG4gICAgICAnaW5pdEF1dG9CaW5kZXInLFxuICAgICAgJ2dldEVuaGFuY2VyTWV0aG9kcycsXG4gICAgICAnY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzJyxcbiAgICAgICdjYWxsZXInLFxuICAgICAgJ2FyZ3VtZW50cycsXG4gICAgICAnYmluZFBhcmVudFZpZXdTdHJlYW0nXVxuXG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXhcblxuICAgIGlmIChhdXRvSW5pdCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5hdXRvQmluZGVyKClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWxsTWV0aG9kc0xpc3RcbiAgfVxuXG4gIGluaXRBdXRvQmluZGVyKCkge1xuICAgIHRoaXMuYXV0b0JpbmRlcigpXG4gIH1cblxuICBnZXRFbmhhbmNlck1ldGhvZHMoKSB7XG4gICAgcmV0dXJuIGdldEFsbE1ldGhvZE5hbWVzKHRoaXMsIHRoaXMub21pdHRlZE1ldGhvZHMpXG4gIH1cblxuICBjaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMobWV0aG9kc0Fycikge1xuICAgIGlmICh0aGlzLnByZWZpeCA9PT0gJycpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU1BZTkUgV0FSTklORzogVGhlIGZvbGxvd2luZyBTcHluZVRyYWl0ICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBuZWVkcyBhIHByZWZpeGApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gbGV0IHJlU3RyID0gYF4oJHt0aGlzLnByZWZpeH0pKC4qKSRgO1xuICAgIC8vIGxldCByZSA9IG5ldyBSZWdFeHAocmVTdHIpO1xuICAgIGNvbnN0IGhhc1ByZWZpeCA9IChzdHIpID0+IHN0ci5pbmRleE9mKHRoaXMucHJlZml4KSA9PT0gMFxuXG4gICAgY29uc3QgbWFsZm9ybWVkTWV0aG9kc0FyciA9IHJlamVjdChoYXNQcmVmaXgsIG1ldGhvZHNBcnIpXG4gICAgaWYgKG1hbGZvcm1lZE1ldGhvZHNBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IHdhcm5pbmdTdHIgPSBgU3B5bmUgV2FybmluZzogVGhlIGZvbGxvd2luZyBtZXRob2QocykgaW4gJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IHJlcXVpcmUgdGhlIHByZWZpeCwgXCIke3RoaXMucHJlZml4fVwiOiBbJHttYWxmb3JtZWRNZXRob2RzQXJyLmpvaW4oJywgJyl9XTtgXG4gICAgICBjb25zb2xlLndhcm4od2FybmluZ1N0cilcbiAgICB9XG4gIH1cblxuICBiaW5kUGFyZW50Vmlld1N0cmVhbShtZXRob2RzT2JqLCBjb250ZXh0KSB7XG4gICAgdGhpcy5jaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMobWV0aG9kc09iai5hbGxNZXRob2RzKVxuICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgY29uc3QgYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0gPSAoc3RyLCBpc1N0YXRpYyA9IGZhbHNlKSA9PiB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvclR5cGUgPSBpc1N0YXRpYyA9PT0gdHJ1ZSA/IHRoaXMuY29uc3RydWN0b3IgOiB0aGlzXG4gICAgICBjb25zdCBwcm9wZXJ0eVR5cGUgPSB0eXBlb2YgKGNvbnN0cnVjdG9yVHlwZVtzdHJdKVxuICAgICAgaWYgKHByb3BlcnR5VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmpbc3RyXSA9IGNvbnRleHRbc3RyXSA9IGNvbnN0cnVjdG9yVHlwZVtzdHJdLmJpbmQoY29udGV4dClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBiaW5kQ3VycnkgPSBjdXJyeU4oMiwgYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0pXG4gICAgY29uc3QgYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0gPSBiaW5kQ3VycnkoX18sIHRydWUpXG4gICAgLy8gTUFQIFNUQVRJQyBNRVRIT0RTXG4gICAgbWFwKGJpbmRTdGF0aWNNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtLCBtZXRob2RzT2JqLnN0YXRpY01ldGhvZHMpXG4gICAgLy8gTUFQIE1BSU4gTUVUSE9EU1xuICAgIG1hcChiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSwgbWV0aG9kc09iai5tZXRob2RzKVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGF1dG9CaW5kZXIoKSB7XG4gICAgY29uc3QgYWxsTWV0aG9kcyA9IHRoaXMuZ2V0RW5oYW5jZXJNZXRob2RzKClcbiAgICAvLyBjb25zb2xlLmxvZygnYWxsICcsYWxsTWV0aG9kcyk7XG4gICAgdGhpcy5hbGxNZXRob2RzTGlzdCA9IHRoaXMuYmluZFBhcmVudFZpZXdTdHJlYW0oYWxsTWV0aG9kcywgdGhpcy5wYXJlbnRDb250ZXh0KVxuICAgIHJldHVybiB0aGlzLmFsbE1ldGhvZHNMaXN0XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzRW1wdHksIGhlYWQsIHZhbHVlcywgY29tcG9zZSwgcHJvcCwgY29tcGxlbWVudCwgaXNOaWwsIGFsbFBhc3MsIHJlZHVjZSwgZmlsdGVyLCBlcXVhbHMsIHRvUGFpcnMsIHJlcGxhY2UsIGVpdGhlciwgcHJvcEVxLCBfXywgaW52ZXJ0LCBwYXRoLCB6aXBPYmosIHJlamVjdCwga2V5cywgZmluZCwgYXNzb2MsIGlzLCBoYXMsIHdoZW4sIHNwbGl0LCBhbHdheXMsIGNvbmNhdCwgam9pbiwgZmxhdHRlbiwgbWFwLCBpZkVsc2UsIHRlc3QsIGZpbmRMYXN0SW5kZXgsIGxhc3QsIGRlZmF1bHRUbywgZnJvbVBhaXJzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybFxuICAgICAqIEB0eXBlIGludGVybmFsXG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAZGVzY1xuICAgICAqIEludGVybmFsIHVybCBtZXRob2RzIGZvciB0aGUgU3B5bmVSb3V0ZUNoYW5uZWxcbiAgICAgKi9cbiAgICB0aGlzLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwuYmluZCh0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwob2JqKSB7XG4gICAgY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBvc2UoY29tcGxlbWVudChpc0VtcHR5KSwgaGVhZCwgdmFsdWVzKVxuICAgIGNvbnN0IGlzTm90TmlsID0gY29tcG9zZShjb21wbGVtZW50KGlzTmlsKSwgaGVhZCwgdmFsdWVzKVxuICAgIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90TmlsXSlcbiAgICByZXR1cm4gaXNOb3ROaWxBbmRJc05vdEVtcHR5KG9iailcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmUGFyYW1WYWx1ZU1hdGNoZXNSZWdleChwYXJhbVZhbHVlLCByb3V0ZU9iaikge1xuICAgIGNvbnN0IHJlamVjdFBhcmFtS2V5ID0gcmVqZWN0KGVxdWFscygncm91dGVOYW1lJykpXG4gICAgY29uc3Qga2V5c0FyciA9IGNvbXBvc2UocmVqZWN0UGFyYW1LZXksIGtleXMpXG4gICAgY29uc3QgdGVzdEZvclJlZ2V4TWF0Y2ggPSBzdHIgPT4gdGVzdChuZXcgUmVnRXhwKHN0ciksIHBhcmFtVmFsdWUpXG4gICAgY29uc3QgY2hlY2tlciA9IGNvbXBvc2UoZmluZCh0ZXN0Rm9yUmVnZXhNYXRjaCksIGtleXNBcnIpXG4gICAgY29uc3QgcmVnZXhNYXRjaFN0ciA9IGNoZWNrZXIocm91dGVPYmopXG4gICAgaWYgKGlzKFN0cmluZywgcmVnZXhNYXRjaFN0cikpIHtcbiAgICAgIHJvdXRlT2JqID0gYXNzb2MocGFyYW1WYWx1ZSwgcHJvcChyZWdleE1hdGNoU3RyLCByb3V0ZU9iaiksIHJvdXRlT2JqKVxuICAgIH1cbiAgICByZXR1cm4gcm91dGVPYmpcbiAgfVxuXG4gIHN0YXRpYyBmb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uKHN0cikge1xuICAgIGNvbnN0IGhhc2ggPSBzdHJcbiAgICBjb25zdCBzZWFyY2ggPSBzdHJcbiAgICBjb25zdCBwYXRobmFtZSA9IHN0clxuICAgIHJldHVybiB7IGhhc2gsIHNlYXJjaCwgcGF0aG5hbWUgfVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uU3RyQnlUeXBlKHQsIGlzSGFzaCA9IGZhbHNlLCBsb2MgPSB3aW5kb3cubG9jYXRpb24pIHtcbiAgICBjb25zdCB0eXBlID0gaXNIYXNoID09PSB0cnVlID8gJ2hhc2gnIDogdFxuXG4gICAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAgIHNsYXNoOiAncGF0aG5hbWUnLFxuICAgICAgcXVlcnk6ICdzZWFyY2gnLFxuICAgICAgaGFzaDogJ2hhc2gnXG4gICAgfVxuICAgIGNvbnN0IHByb3BWYWwgPSB0eXBlTWFwW3R5cGVdXG4gICAgY29uc3Qgc3RyICA9IHByb3AocHJvcFZhbCwgbG9jKVxuICAgIGNvbnN0IGNoZWNrRm9yU2xhc2hBbmRIYXNoID0gL14oXFwvKT8oIyk/KFxcLyk/KC4qKSQvXG4gICAgLy8gY29uc29sZS5sb2coXCJEQVRBIExPQyBTVFIgXCIse3N0ciwgbG9jLCBwcm9wLCB0eXBlLGlzSGFzaH0pO1xuICAgIHJldHVybiBzdHIucmVwbGFjZShjaGVja0ZvclNsYXNoQW5kSGFzaCwgJyQ0JylcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVSb3V0ZUFycmF5RnJvbVBhcmFtcyhkYXRhLCByb3V0ZSwgdCA9ICdzbGFzaCcsIHBhcmFtc0Zyb21Mb2MpIHtcbiAgICBjb25zdCB1cmxBcnIgPSBbXVxuICAgIGNvbnN0IGxvb3BUaHJvdWdoUGFyYW0gPSAocm91dGVPYmopID0+IHtcbiAgICAgIGNvbnN0IHVybE9iaiA9IHt9XG4gICAgICBjb25zdCBrZXl3b3JkID0gcm91dGVPYmoucm91dGVOYW1lIC8vIFBBUkFNIEZPUk0gU1BZTkUgQ09ORklHXG4gICAgICBsZXQgcGFyYW1WYWxGcm9tRGF0YSA9IGRhdGFba2V5d29yZF0gIT09IHVuZGVmaW5lZCA/IGRhdGFba2V5d29yZF0gOiBwcm9wKGtleXdvcmQsIHBhcmFtc0Zyb21Mb2MpIC8vIFBVTEwgVkFMVUUgRk9SIFRISVMgUEFSQU0gRlJPTSBEQVRBXG4gICAgICBjb25zdCBwYXJhbVZhbFR5cGUgPSB0eXBlb2YgKHJvdXRlT2JqW3BhcmFtVmFsRnJvbURhdGFdKVxuXG4gICAgICBpZiAocGFyYW1WYWxUeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBwYXJhbVZhbEZyb21EYXRhID0gcm91dGVPYmpbcGFyYW1WYWxGcm9tRGF0YV1cbiAgICAgIH0gZWxzZSBpZiAocGFyYW1WYWxUeXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByb3V0ZU9iaiA9IHRoaXMuY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgocGFyYW1WYWxGcm9tRGF0YSwgcm91dGVPYmopXG4gICAgICB9XG5cbiAgICAgIHVybE9ialtrZXl3b3JkXSA9IHBhcmFtVmFsRnJvbURhdGFcblxuICAgICAgaWYgKHRoaXMuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCh1cmxPYmopKSB7XG4gICAgICAgIHVybEFyci5wdXNoKHVybE9iailcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNPYmplY3QgPSBpcyhPYmplY3QsIHJvdXRlT2JqKVxuICAgICAgY29uc3Qgb2JqZWN0UGFyYW1FeGlzdHMgPSBoYXMocGFyYW1WYWxGcm9tRGF0YSwgcm91dGVPYmopXG4gICAgICBjb25zdCBvYmplY3RDb250YWluc1JvdXRlID0gaGFzKCdyb3V0ZVBhdGgnLCByb3V0ZU9iailcbiAgICAgIGNvbnN0IHJlY3Vyc2l2ZWx5Q2FsbExvb3BCb29sID0gb2JqZWN0UGFyYW1FeGlzdHMgJiYgaXNPYmplY3RcbiAgICAgIGlmIChyZWN1cnNpdmVseUNhbGxMb29wQm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBuZXdPYmogPSByb3V0ZU9ialtwYXJhbVZhbEZyb21EYXRhXVxuICAgICAgICBpZiAoaGFzKCdyb3V0ZVBhdGgnLCBuZXdPYmopKSB7XG4gICAgICAgICAgbG9vcFRocm91Z2hQYXJhbShuZXdPYmoucm91dGVQYXRoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG9iamVjdENvbnRhaW5zUm91dGUgPT09IHRydWUgJiYgcGFyYW1WYWxGcm9tRGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvb3BUaHJvdWdoUGFyYW0ocm91dGVPYmoucm91dGVQYXRoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxvb3BUaHJvdWdoUGFyYW0ocm91dGUpXG5cbiAgICByZXR1cm4gdXJsQXJyXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlU2xhc2hTdHJpbmcoYXJyKSB7XG4gICAgY29uc3QgYXJyQ2xlYXIgPSByZWplY3QoaXNOaWwpXG4gICAgY29uc3Qgbm90VW5kZWZpbmVkID0gd2hlbihjb21wbGVtZW50KGlzTmlsLCBfXyksIGpvaW4oJy8nKSlcbiAgICBjb25zdCBzdHJpcFJlZ2V4ID0gcmVwbGFjZSgvXihcXF4qKSguKnxeXFwkKShcXCQpJC8sICckMicpXG4gICAgY29uc3Qgam9pbmVyID0gY29tcG9zZShzdHJpcFJlZ2V4LCBub3RVbmRlZmluZWQsIGFyckNsZWFyLCBmbGF0dGVuLCBtYXAodmFsdWVzKSlcbiAgICByZXR1cm4gam9pbmVyKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVRdWVyeVN0cmluZyhhcnIpIHtcbiAgICBjb25zdCBhcnJDbGVhciA9IHJlamVjdChpc05pbClcblxuICAgIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IHRoaXMuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbFxuXG4gICAgY29uc3QgY3JlYXRlUGFpciA9IGNvbXBvc2UoXG4gICAgICBqb2luKCc9JyksXG4gICAgICBmbGF0dGVuLFxuICAgICAgdG9QYWlycylcblxuICAgIGNvbnN0IGNoZWNrUGFpciA9IGlmRWxzZShcbiAgICAgIGlzTm90TmlsQW5kSXNOb3RFbXB0eSxcbiAgICAgIGNyZWF0ZVBhaXIsXG4gICAgICBhbHdheXModW5kZWZpbmVkKVxuICAgIClcblxuICAgIGNvbnN0IG1hcEFycmF5T2ZQYWlycyA9IG1hcChjaGVja1BhaXIpXG5cbiAgICBjb25zdCBjaGVja0lmU3RySXNFbXB0eSA9IHdoZW4oXG4gICAgICBjb21wbGVtZW50KGlzRW1wdHkpLFxuICAgICAgY29uY2F0KCc/JykpXG5cbiAgICBjb25zdCBjcmVhdGVRcyA9IGNvbXBvc2UoXG4gICAgICBjaGVja0lmU3RySXNFbXB0eSxcbiAgICAgIGpvaW4oJyYnKSxcbiAgICAgIGFyckNsZWFyLFxuICAgICAgbWFwQXJyYXlPZlBhaXJzKVxuXG4gICAgcmV0dXJuIGNyZWF0ZVFzKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja1BheWxvYWRGb3JSZWdleE92ZXJyaWRlcyh1cmxzQXJyLCBkYXRhLCBwYXJzZVN0cmluZyA9ICdWYWx1ZScpIHtcbiAgICAvLyBDSEVDSyBJRiBQQVlMT0FEIEhBUyBBTlkgT1ZFUlJJREVTXG4gICAgY29uc3QgZ2V0UHJvcFZhbE92ZXJyaWRlID0gKGtleSkgPT4gcHJvcChgJHtrZXl9JHtwYXJzZVN0cmluZ31gLCBkYXRhKVxuXG4gICAgLy8gR0VUIEFOWSBQT1NTSUJMRSBWQUxVRSBVU0lORyBUSEUgQ1VSUkVOVCBLRVlcbiAgICBjb25zdCBnZXRPdmVycmlkZVZhbCA9IGNvbXBvc2UoZ2V0UHJvcFZhbE92ZXJyaWRlLCBoZWFkLCBrZXlzKVxuXG4gICAgLy8gTUFQIEFMTCBPQkpFQ1QgVkFMUyBUTyBURVNUIEZPUiBPVkVSUklERVNcbiAgICBjb25zdCBtYXBVcmxQcm9wcyA9IChwcm9wKSA9PiB7XG4gICAgICBjb25zdCBvdmVycmlkZVZhbCA9IGdldE92ZXJyaWRlVmFsKHByb3ApXG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFwib3ZlcnJpZGUgdmFsIFwiLG92ZXJyaWRlVmFsLCBkYXRhKTtcbiAgICAgIC8vIGlmIHJlZ2V4IHZhbHVlIGlzIGZvdW5kXG4gICAgICBpZiAob3ZlcnJpZGVWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYXNzb2MoY29tcG9zZShoZWFkLCBrZXlzKShwcm9wKSwgb3ZlcnJpZGVWYWwsIHByb3ApXG4gICAgICB9XG4gICAgICAvLyBpZGVudGl0eVxuICAgICAgcmV0dXJuIHByb3BcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwKG1hcFVybFByb3BzLCB1cmxzQXJyKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzKHVybHNBcnIpIHtcbiAgICAvLyBEZWZpbmUgdGhlIGludGVybmFsIG1ldGhvZCB0byBleHRyYWN0IHRoZSBzdHJpbmcgYmVmb3JlIHRoZSBwaXBlXG4gICAgY29uc3QgZ2V0U3RyaW5nQmVmb3JlUGlwZSA9IChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaCgvXltefF0qLylcbiAgICAgIHJldHVybiBtYXRjaCA/IChtYXRjaFswXSA9PT0gJ14kJyA/ICcnIDogbWF0Y2hbMF0pIDogaW5wdXRcbiAgICB9XG5cbiAgICBjb25zdCBtYXBVcmxBcnJPYmogPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCBwaXBlUmVkdWNlciA9IChhY2MsIGtleSkgPT4ge1xuICAgICAgICBhY2Nba2V5XSA9IGdldFN0cmluZ0JlZm9yZVBpcGUob2JqW2tleV0pXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9iaiA9IE9iamVjdC5rZXlzKG9iaikucmVkdWNlKHBpcGVSZWR1Y2VyLCB7fSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh1cmxzQXJyKSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHVybHNBcnIubWFwKG1hcFVybEFyck9iailcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsc0FyclxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUm91dGVWYWxzUGFydE1hdGNoKHVybHNBcnIsIGRhdGEgPSB7fSkge1xuICAgIC8qKlxuICAgICAqIDEuIExvb3AgdGhyb3VnaCB1cmxzQXJyXG4gICAgICogMi4gTG9vcCB0aHJvdWdoIHByb3BlcnRpZXNcbiAgICAgKiAzLiBBcHBseSBtYXRjaEdsb2JQYXR0ZXJuIHRvIGVhY2ggcHJvcGVydHkgdmFsdWUgYW5kIGNoZWNrIGZvciBtYXRjaCB3aXRoIGRhdGEgb2JqZWN0IHByb3BlcnR5XG4gICAgICogNC4gUmV0dXJuIHRoZSB1cGRhdGVkIG9iamVjdCB3aXRoIG1hdGNoZWQgdmFsdWVzLCBvciBrZWVwIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIGlmIG5vIG1hdGNoXG4gICAgICovXG5cbiAgICBjb25zdCBtYXRjaEdsb2JQYXR0ZXJuID0gKHN0ciwgZ2xvYlBhdHRlcm4pID0+IHtcbiAgICAgIGNvbnN0IGdsb2JQYXR0ZXJuTWF0Y2ggPSAocGF0dGVybiwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgZXNjYXBlZFBhdHRlcm4gPSBwYXR0ZXJuXG4gICAgICAgICAgLnJlcGxhY2UoL1stL1xcXFxeJCs/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICAgICAgICAucmVwbGFjZSgvXFwqL2csICdbXFxcXHdcXFxcZF8tXSonKSAvLyAqIHNob3VsZCBtYXRjaCBhbnkgc2VxdWVuY2Ugb2YgYWxwaGFudW1lcmljLCB1bmRlcnNjb3Jlcywgb3IgZGFzaGVzXG5cbiAgICAgICAgY29uc3QgcmVnZXhQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZFBhdHRlcm59JGApIC8vIE1hdGNoIHRoZSBmdWxsIHN0cmluZ1xuICAgICAgICByZXR1cm4gcmVnZXhQYXR0ZXJuLnRlc3QodmFsdWUpXG4gICAgICB9XG5cbiAgICAgIC8vIFNwbGl0IHRoZSBnbG9iUGF0dGVybiBieSBwaXBlICh8KVxuICAgICAgY29uc3QgcGF0dGVybnMgPSBnbG9iUGF0dGVybi5zcGxpdCgnfCcpXG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdHJpbmcgbWF0Y2hlcyBhbnkgb2YgdGhlIHBhdHRlcm5zXG4gICAgICBjb25zdCBoYXNNYXRjaCA9IHBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGdsb2JQYXR0ZXJuTWF0Y2gocGF0dGVybiwgc3RyKSlcblxuICAgICAgLy8gUmV0dXJuIHRoZSBzdHJpbmcgaWYgdGhlcmUncyBhIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBnbG9iIHBhdHRlcm5cbiAgICAgIHJldHVybiBoYXNNYXRjaCA/IHN0ciA6IGdsb2JQYXR0ZXJuXG4gICAgfVxuXG4gICAgLy8gRnVuY3Rpb24gdG8gY2hlY2sgYW5kIHJlcGxhY2UgbWF0Y2hpbmcgcHJvcGVydGllc1xuICAgIGNvbnN0IHJlcGxhY2VNYXRjaGluZ1Byb3BlcnR5ID0gKG9iaikgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZE9iaiA9IHsgLi4ub2JqIH0gLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgb2JqZWN0IHRvIGF2b2lkIG11dGF0aW9uXG5cbiAgICAgIC8vIEZ1bmN0aW9uIHRvIGNoZWNrIGVhY2ggcHJvcGVydHkgYW5kIGFwcGx5IG1hdGNoR2xvYlBhdHRlcm5cbiAgICAgIGNvbnN0IGNoZWNrQW5kUmVwbGFjZVByb3BlcnR5ID0gKGtleSkgPT4ge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHVwZGF0ZWRPYmosIGtleSkgJiYgZGF0YVtrZXldKSB7XG4gICAgICAgICAgdXBkYXRlZE9ialtrZXldID0gbWF0Y2hHbG9iUGF0dGVybihkYXRhW2tleV0sIHVwZGF0ZWRPYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdFxuICAgICAgT2JqZWN0LmtleXModXBkYXRlZE9iaikuZm9yRWFjaChjaGVja0FuZFJlcGxhY2VQcm9wZXJ0eSlcblxuICAgICAgcmV0dXJuIHVwZGF0ZWRPYmpcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggdGhlIGFycmF5IGFuZCByZXBsYWNlIG1hdGNoaW5nIHByb3BlcnRpZXNcbiAgICByZXR1cm4gdXJsc0Fyci5tYXAocmVwbGFjZU1hdGNoaW5nUHJvcGVydHkpXG4gIH1cblxuICBzdGF0aWMgY29udmVydFBhcmFtc1RvUm91dGUoZGF0YSwgciA9IFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUsIHQsIGxvY1N0cikge1xuICAgIGNvbnN0IHVybFR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogci50eXBlXG4gICAgY29uc3QgaXNIYXNoID0gci5pc0hhc2hcbiAgICBjb25zdCByb3V0ZSA9IHIucm91dGVzLnJvdXRlUGF0aFxuICAgIGNvbnN0IGxvY2F0aW9uU3RyID0gbG9jU3RyICE9PSB1bmRlZmluZWQgPyBsb2NTdHIgOiB0aGlzLmdldExvY2F0aW9uU3RyQnlUeXBlKHVybFR5cGUsIGlzSGFzaClcbiAgICBjb25zdCBwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uID0gdGhpcy5jb252ZXJ0Um91dGVUb1BhcmFtcyhsb2NhdGlvblN0ciwgciwgdXJsVHlwZSkucm91dGVEYXRhXG4gICAgbGV0IHVybEFyciA9IHRoaXMuY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMoZGF0YSwgcm91dGUsIHVybFR5cGUsIHBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24pXG5cbiAgICB1cmxBcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzKHVybEFyciwgZGF0YSlcbiAgICB1cmxBcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzKHVybEFycilcbiAgICAvLyBUSElTIFdJTEwgTUFUQ0ggRVhBQ1RMWSBUSEUgUFJPUEVSVFkgSUQsIFNPIHBhZ2VJZD1cImRhc2hib2FyZF8xXCIgd2lsbCByZXR1cm4gdGhhdCBpbnN0ZWFkIG9mIGdsb2JQYXR0ZXJuWzBdXG4gICAgLy8gdXJsQXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja0ZvclJvdXRlVmFsc1BhcnRNYXRjaCh1cmxBcnIsIGRhdGEpXG4gICAgLy8gY29uc29sZS5sb2coJ1BBUkFNUyBUTyBST1VURSAnLCB7IGRhdGEsIHIsIHVybEFyciwgbG9jYXRpb25TdHIsIHBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24gfSlcblxuICAgIC8vIFRISVMgQ1JFQVRFUyBBIFFVRVJZIFBBVEggU1RSXG4gICAgaWYgKHVybFR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVF1ZXJ5U3RyaW5nKHVybEFycilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTbGFzaFN0cmluZyh1cmxBcnIpXG4gIH1cblxuICBzdGF0aWMgZmluZEluZGV4T2ZNYXRjaGVkU3RyaW5nT3JSZWdleChtYWluU3RyLCBwYXJhbXNBcnIpIHtcbiAgICBjb25zdCBpczQwNCA9IHBhcmFtc0Fyci5pbmNsdWRlcygnLisnKVxuXG4gICAgY29uc3QgcmVGbiA9IChzKSA9PiB7XG4gICAgICBpZiAoaXM0MDQpIHtcbiAgICAgICAgaWYgKCFzLnN0YXJ0c1dpdGgoJ14nKSkge1xuICAgICAgICAgIHMgPSAnXicgKyBzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzLmVuZHNXaXRoKCckJykpIHtcbiAgICAgICAgICBzID0gcyArICckJ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHMpXG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tGb3JFbXB0eSA9ICByZXBsYWNlKC9eJC8sICdeJCcpXG4gICAgY29uc3QgY3JlYXRlU3RyUmVnZXhUZXN0ID0gKHN0cikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RyLFxuICAgICAgICByZTogcmVGbihzdHIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2ggPSAgZWl0aGVyKFxuICAgICAgcHJvcEVxKG1haW5TdHIsICdzdHInKSwgY29tcG9zZSh0ZXN0KF9fLCBtYWluU3RyKSwgcHJvcCgncmUnKSlcbiAgICApXG5cbiAgICBjb25zdCBmaW5kTWF0Y2hJbmRleCA9IGNvbXBvc2UoZmluZExhc3RJbmRleChlcXVhbHModHJ1ZSkpLCBtYXAoY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2gpLCBtYXAoY3JlYXRlU3RyUmVnZXhUZXN0KSwgbWFwKGNoZWNrRm9yRW1wdHkpKVxuXG4gICAgcmV0dXJuIGZpbmRNYXRjaEluZGV4KHBhcmFtc0FycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKG9iaiwgc3RyLCByZWdleFRva2Vucykge1xuICAgIC8vXG4gICAgLy9cbiAgICAvLyAgICAgICBUSElTIElTIEEgVkVSWSBJTVBPUlRBTlQgTUVUSE9EXG4gICAgLy8gICAgICAgSVQgQ09NUEFSRVMgVEhFIFNUUklORyBUTyBCRSBNQVRDSEVEIFdJVEggVEhFIFJPVVRFIFBBVEggT0JKRUNUXG4gICAgLy8gICAgICAgQU5EIElUIFdJTEwgUkVUVVJOIE9ORSBPRiBUSFJFRSBUSElOR1NcbiAgICAvLyAgICAgICAxLiBUSEUgU1RSSU5HIElUU0VMRlxuICAgIC8vICAgICAgIDIuIEEgTUFUQ0hJTkcgS0VZIEZST00gVEhFIENVUlJFTlQgT0JKRUNUXG4gICAgLy8gICAgICAgMy4gVEhFIFJPVVRFTkFNRVxuICAgIC8vXG5cbiAgICAvLyBHTyBUSFJPVUdIIEtFWVMgQU5EIENIRUNLIElGIFJFR0VYIE1BVENIRVNcblxuICAgIC8vIEdPIFRIUk9VR0ggUk9VVEUgQ09ORklHIFRPIEZJR1VSRSBPVVQgSUYgVkFMIE9SIEtFWSBTSE9VTEQgQkUgQ09NUEFSRURcbiAgICAvLyBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LCBjaG9vc2UgdGhlIGtleSBvZiB0aGUgcm91dGUgcGF0aCB0byBjaGVjayBhZ2FpbnN0XG4gICAgY29uc3QgZ2V0VmFsQ29tcGFyZUFyciA9IGNvbXBvc2UobWFwKGxhc3QpLCBtYXAoZmlsdGVyKGlzKFN0cmluZykpKSwgdG9QYWlycylcblxuICAgIC8vIENSRUFURSBUSEUgQVJSQVkgT0YgRUlUSEVSIFZBTFMgT1IgS0VZU1xuICAgIGNvbnN0IHBhcmFtc0FyciA9IGdldFZhbENvbXBhcmVBcnIob2JqKVxuXG4gICAgLy8gUkVTVUxUUyBGUk9NIFBBUkFNIENIRUNLXG4gICAgLy8gbGV0IHBhcmFtSW5kZXggPSBjaGVja0ZvclBhcmFtc01hdGNoKHBhcmFtc0Fycik7XG5cbiAgICBjb25zdCBwYXJhbUluZGV4ID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5maW5kSW5kZXhPZk1hdGNoZWRTdHJpbmdPclJlZ2V4KHN0ciwgcGFyYW1zQXJyKVxuXG4gICAgLy8gREVGQVVMVCBWQUwgRk9SIFNUUklOR1xuICAgIGxldCBwYXJhbVN0ciA9IHN0clxuXG4gICAgLy8gTEVHQUNZIE1FVEhPRCAtLSBUVVJOIE9GRlxuICAgIC8vIFdIRU4gVEhFUkUgSVMgQSBNQVRDSCBGUk9NIFRIRSBDVVJSRU5UIFJPVVRFIFBBVEggT0JKRUNUXG4gICAgaWYgKHBhcmFtSW5kZXggPj0gMCkge1xuICAgICAgY29uc3QgcGFyYW0gPSBwYXJhbXNBcnJbcGFyYW1JbmRleF1cbiAgICAgIGNvbnN0IGludmVydGVkT2JqID0gaW52ZXJ0KG9iailcblxuICAgICAgLy8gUFVMTCBJTlZFUlRFRCBPQkpFQ1QgVE8gU0VFIElGIFNUUiBNQVRDSEVTXG4gICAgICBjb25zdCBnZXRQYXJhbUludmVydGVkID0gY29tcG9zZShoZWFkLCBkZWZhdWx0VG8oW10pLCBwcm9wKHBhcmFtKSlcbiAgICAgIGNvbnN0IHBhcmFtSW52ZXJ0ZWQgPSBnZXRQYXJhbUludmVydGVkKGludmVydGVkT2JqKVxuICAgICAgLy8gc3B5bmUgMTEuMC4xO1xuICAgICAgY29uc3QgcmUgPSAgL14oWy0kXFx3XSopJC9cbiAgICAgIGNvbnN0IGtleU1hdGNoID0gIHJlLnRlc3QocGFyYW1JbnZlcnRlZClcblxuICAgICAgaWYgKGtleU1hdGNoID09PSB0cnVlICYmIGlzKFN0cmluZywgcGFyYW1JbnZlcnRlZCkgPT09IHRydWUpIHtcbiAgICAgICAgcGFyYW1TdHIgPSBwYXJhbUludmVydGVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtU3RyXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQXJyRnJvbVNsYXNoU3RyKHN0cikge1xuICAgIGNvbnN0IHNsYXNoUmUgPSAvXihbL10pPyguKikkL1xuICAgIHJldHVybiBzdHIucmVwbGFjZShzbGFzaFJlLCAnJDInKS5zcGxpdCgnLycpXG4gIH1cblxuICBzdGF0aWMgY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaih0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKSB7XG4gICAgY29uc3Qgcm91dGVWYWx1ZSA9IHN0clxuICAgIGNvbnN0IHZhbHVlc0FyciA9IHRoaXMuY3JlYXRlQXJyRnJvbVNsYXNoU3RyKHN0cilcbiAgICBjb25zdCBwYXRocyA9IFtdXG4gICAgY29uc3Qgcm91dGVkVmFsdWVzQXJyID0gW11cbiAgICBsZXQgbGF0ZXN0T2JqID0gdG9wTGV2ZWxSb3V0ZVxuICAgIGNvbnN0IGNyZWF0ZVBhcmFtc0Zyb21TdHIgPSAodG90YWwsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgcm91dGVWYWx1ZVN0ciA9IHRoaXMuY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbShsYXRlc3RPYmosIGN1cnJlbnRWYWx1ZSwgcmVnZXhUb2tlbnMpXG5cbiAgICAgIGxhdGVzdE9iaiA9IHRoaXMuY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgoY3VycmVudFZhbHVlLCBsYXRlc3RPYmopXG4gICAgICBjb25zdCBwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGggPSAoc3RyKSA9PiBzdHIgIT09IGxhc3QocGF0aHMpXG5cbiAgICAgIGNvbnN0IGlzRW1wdHlPck5pbCA9IGVpdGhlcihpc0VtcHR5LCBpc05pbClcblxuICAgICAgaWYgKGxhdGVzdE9iaiAhPT0gdW5kZWZpbmVkICYmIHByZXZQYXRoTm90RXFDdXJyZW50UGF0aChsYXRlc3RPYmoucm91dGVOYW1lKSAmJiBpc0VtcHR5T3JOaWwocm91dGVWYWx1ZVN0cikgPT09IGZhbHNlKSB7XG4gICAgICAgIHBhdGhzLnB1c2gobGF0ZXN0T2JqLnJvdXRlTmFtZSlcbiAgICAgICAgcm91dGVkVmFsdWVzQXJyLnB1c2gocm91dGVWYWx1ZVN0cilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0clBhdGggPSBbY3VycmVudFZhbHVlLCAncm91dGVQYXRoJ11cbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1QYXRoID0gWydyb3V0ZVBhdGgnXVxuICAgICAgY29uc3Qgb2JqZWN0RnJvbVN0ciA9IHBhdGgoc3RyUGF0aCwgbGF0ZXN0T2JqKVxuICAgICAgY29uc3Qgb2JqZWN0RnJvbVJvdXRlUGFyYW0gPSBwYXRoKHJvdXRlUGFyYW1QYXRoLCBsYXRlc3RPYmopXG5cbiAgICAgIGlmIChvYmplY3RGcm9tU3RyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGF0ZXN0T2JqID0gb2JqZWN0RnJvbVN0clxuICAgICAgfSBlbHNlIGlmIChvYmplY3RGcm9tUm91dGVQYXJhbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxhdGVzdE9iaiA9IG9iamVjdEZyb21Sb3V0ZVBhcmFtXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVkdWNlKGNyZWF0ZVBhcmFtc0Zyb21TdHIsIDAsIHZhbHVlc0FycilcbiAgICBjb25zdCByb3V0ZURhdGEgPSB6aXBPYmoocGF0aHMsIHJvdXRlZFZhbHVlc0FycilcbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gdGhpcy5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfVxuICB9XG5cbiAgc3RhdGljIGdldExhc3RBcnJWYWwoYXJyKSB7XG4gICAgY29uc3QgZ2V0TGFzdFBhcmFtID0gKGEpID0+IGxhc3QoYSkgIT09IHVuZGVmaW5lZCA/IGxhc3QoYSkgOiAnJ1xuICAgIHJldHVybiBnZXRMYXN0UGFyYW0oYXJyKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURlZmF1bHRQYXJhbUZyb21FbXB0eVN0cih0b3BMZXZlbFJvdXRlLCBzdHIpIHtcbiAgICBjb25zdCBvYmogPSB7fVxuICAgIGNvbnN0IGtleXdvcmQgPSB0b3BMZXZlbFJvdXRlLnJvdXRlTmFtZVxuICAgIG9ialtrZXl3b3JkXSA9IHRoaXMuY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbSh0b3BMZXZlbFJvdXRlLCBzdHIpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRRdWVyeVN0clRvUGFyYW1zKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpIHtcbiAgICBjb25zdCBxdWVyeVJlID0gL14oWz9dKT8oLiopJC9cbiAgICBjb25zdCByb3V0ZVZhbHVlID0gc3RyXG4gICAgY29uc3Qgc3RyQXJyID0gc3RyLnJlcGxhY2UocXVlcnlSZSwgJyQyJylcbiAgICBjb25zdCBjb252ZXJ0VG9QYXJhbXMgPSBjb21wb3NlKG1hcChzcGxpdCgnPScpKSwgc3BsaXQoJyYnKSlcbiAgICBjb25zdCBwYXJhbXNBcnIgPSBjb252ZXJ0VG9QYXJhbXMoc3RyQXJyKVxuICAgIGxldCByb3V0ZURhdGEgPSBmcm9tUGFpcnMocGFyYW1zQXJyKVxuXG4gICAgbGV0IHBhdGhzID0gbWFwKGhlYWQsIHBhcmFtc0FycilcblxuICAgIGlmIChpc0VtcHR5KHN0cikgPT09IHRydWUpIHtcbiAgICAgIHJvdXRlRGF0YSA9IHRoaXMuY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpXG4gICAgICBwYXRocyA9IGtleXMocm91dGVEYXRhKVxuICAgIH1cbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gdGhpcy5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9XG4gIH1cblxuICBzdGF0aWMgY29udmVydFJvdXRlVG9QYXJhbXMoc3RyLCByb3V0ZUNvbmZpZywgdCkge1xuICAgIGNvbnN0IGFkZFNsYXNoID0gKHVybCkgPT4gdXJsLnJlcGxhY2UoL1xcLyR8JC8sICcvJylcbiAgICBpZiAocm91dGVDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogcm91dGVDb25maWcudHlwZVxuICAgIGNvbnN0IHJlZ2V4VG9rZW5zID0gZGVmYXVsdFRvKHt9LCBwcm9wKCdyZWdleFRva2VucycsIHJvdXRlQ29uZmlnKSlcbiAgICBjb25zdCB0b3BMZXZlbFJvdXRlID0gcm91dGVDb25maWcucm91dGVzLnJvdXRlUGF0aFxuXG4gICAgaWYgKHR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRRdWVyeVN0clRvUGFyYW1zKHRvcExldmVsUm91dGUsIHN0cilcbiAgICB9XG4gICAgc3RyID0gYWRkU2xhc2goc3RyKVxuXG4gICAgcmV0dXJuIHRoaXMuY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaih0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKVxuICB9XG59XG4iLCJpbXBvcnQgeyBmcm9tRXZlbnRQYXR0ZXJuIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGxhc3QsIGZsYXR0ZW4sIGNsb25lLCBwaWNrLCBwcm9wLCBwaWNrQWxsLCBwYXRoLCBlcXVhbHMsIGNvbXBvc2UsIGtleXMsIGZpbHRlciwgcHJvcEVxLCB1bmlxLCBtYXAsIF9fLCBjaGFpbiwgaXMsIGluY2x1ZGVzLCBmcm9tUGFpcnMsIHJlamVjdCwgbWVyZ2VEZWVwUmlnaHQsIG1lcmdlUmlnaHQsIHRlc3QsIHRvUGFpcnMsIHZhbHVlcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB9IGZyb20gJy4vc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS11cmwuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzIGZvciB0aGUgU3B5bmVSb3V0ZUNoYW5uZWxcbiAgICAgKlxuICAgICAqL1xuICAgIHRoaXMuY3JlYXRlUG9wU3RhdGVTdHJlYW0gPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNyZWF0ZVBvcFN0YXRlU3RyZWFtLmJpbmQodGhpcylcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQb3BTdGF0ZVN0cmVhbShzdWJzY3JpYmVGbikge1xuICAgIGNvbnN0IGFkZEhhbmRsZXIgPSBmdW5jdGlvbihoYW5kbGVyKSB7XG4gICAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGhhbmRsZXJcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbigpIHt9XG4gICAgfVxuICAgIGNvbnN0IHBvcHVwT2JzJCA9IGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlcilcblxuICAgIHBvcHVwT2JzJC5zdWJzY3JpYmUoc3Vic2NyaWJlRm4pXG4gIH1cblxuICBzdGF0aWMgZ2V0TGFzdEFyclZhbChhcnIpIHtcbiAgICBjb25zdCBnZXRMYXN0UGFyYW0gPSAoYSkgPT4gbGFzdChhKSAhPT0gdW5kZWZpbmVkID8gbGFzdChhKSA6ICcnXG4gICAgcmV0dXJuIGdldExhc3RQYXJhbShhcnIpXG4gIH1cblxuICBzdGF0aWMgY29tcGFyZVJvdXRlS2V5d29yZHMob2JqID0ge30sIGFycikge1xuICAgIGNvbnN0IHBpY2tWYWx1ZXMgPSAobywgYSkgPT4gYSAhPT0gdW5kZWZpbmVkID8gcGljayhhLCBvKSA6IG9cbiAgICBsZXQgb2JqMSA9IHBpY2tWYWx1ZXMob2JqLCBhcnIpXG4gICAgcmV0dXJuIHtcbiAgICAgIHBpY2tWYWx1ZXMsXG4gICAgICBjb21wYXJlOiAob2JqID0ge30sIGFycikgPT4ge1xuICAgICAgICBjb25zdCBvYmoyID0gcGlja1ZhbHVlcyhvYmosIGFycilcbiAgICAgICAgY29uc3QgY29tcGFyZVByb3BzID0gcCA9PiB7XG4gICAgICAgICAgY29uc3QgcDEgPSBwcm9wKHAsIG9iajEpXG4gICAgICAgICAgY29uc3QgcDIgPSBwcm9wKHAsIG9iajIpXG4gICAgICAgICAgY29uc3Qgc2FtZSA9IGVxdWFscyhwMSwgcDIpXG4gICAgICAgICAgY29uc3QgcHJldmlvdXNFeGlzdHMgPSBwMSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3QgbmV4dEV4aXN0cyA9IHAyICE9PSB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkID0gIXNhbWVcbiAgICAgICAgICBjb25zdCBhZGRlZCA9IHByZXZpb3VzRXhpc3RzID09PSBmYWxzZSAmJiBuZXh0RXhpc3RzID09PSB0cnVlXG4gICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHByZXZpb3VzRXhpc3RzID09PSB0cnVlICYmIG5leHRFeGlzdHMgPT09IGZhbHNlXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJQOiBcIixwLHtzYW1lLCBwcmV2aW91c0V4aXN0cywgbmV4dEV4aXN0c30pO1xuICAgICAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICAgICAgb2JqW3BdID0geyBzYW1lLCBjaGFuZ2VkLCBhZGRlZCwgcmVtb3ZlZCwgcHJldmlvdXNFeGlzdHMsIG5leHRFeGlzdHMgfVxuICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVByZWQgPSBwID0+IGNvbXBvc2Uoa2V5cywgZmlsdGVyKHByb3BFcSh0cnVlLCBwKSkpXG5cbiAgICAgICAgY29uc3QgZ2V0UHJvcHNTdGF0ZSA9IGNvbXBvc2UobWFwKGNvbXBhcmVQcm9wcyksIHVuaXEsIGNoYWluKGtleXMpKShbb2JqMSwgb2JqMl0pXG4gICAgICAgIGNvbnN0IHBhdGhzQ2hhbmdlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ2NoYW5nZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgY29uc3QgcGF0aHNBZGRlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ2FkZGVkJyksIGdldFByb3BzU3RhdGUpXG4gICAgICAgIGNvbnN0IHBhdGhzUmVtb3ZlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ3JlbW92ZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgb2JqMSA9IG9iajJcbiAgICAgICAgcmV0dXJuIHsgcGF0aHNBZGRlZCwgcGF0aHNSZW1vdmVkLCBwYXRoc0NoYW5nZWQgfVxuICAgICAgfSxcblxuICAgICAgZ2V0Q29tcGFyZXI6ICgpID0+IG9iajFcblxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZUFyckRhdGEocm91dGVBcnIsIHBhcmFtc0Fycikge1xuICAgIGNvbnN0IHBhdGhzID0gIGZpbHRlcihpbmNsdWRlcyhfXywgcm91dGVBcnIpLCBwYXJhbXNBcnIpXG4gICAgY29uc3QgcGF0aElubmVybW9zdCA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuZ2V0TGFzdEFyclZhbChwYXRocylcbiAgICAvLyBjb25zb2xlLmxvZygnYXJyIGFuZCByb3V0ZU5hbWUgJyx7cGF0aHMsIHBhdGhJbm5lcm1vc3R9KTtcbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCB9XG4gIH1cblxuICBzdGF0aWMgZmxhdHRlbkNvbmZpZ09iamVjdChvYmopIHtcbiAgICBjb25zdCBnbyA9IChvYmpfKSA9PiBjaGFpbigoW2ssIHZdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgcmV0dXJuIG1hcCgoW2tfLCB2X10pID0+IFtgJHtrfS4ke2tffWAsIHZfXSwgZ28odikpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW1trLCB2XV1cbiAgICAgIH1cbiAgICB9LCB0b1BhaXJzKG9ial8pKVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJGTEFUVEVOOiBcIiwgdmFsdWVzKGZyb21QYWlycyhnbyhvYmopKSkpO1xuICAgIHJldHVybiB2YWx1ZXMoZnJvbVBhaXJzKGdvKG9iaikpKVxuICB9XG5cbiAgc3RhdGljIGFkZFJvdXRlRGF0YXNldHMoY2hhbm5lbFJvdXRlT2JqKSB7XG4gICAgLy8gY2hhbm5lbFJvdXRlT2JqLnR5cGU9J3F1ZXJ5JztcblxuICAgIGNvbnN0IHsgdHlwZSwgaXNIYXNoIH0gPSBjaGFubmVsUm91dGVPYmpcblxuICAgIC8vIGNyZWF0ZSBocmVmIGFuZCBjaGVjayB0byBzZWUgaWYgbmVlZCB0byBjb252ZXJ0IHRvIGhhc2ggaHJlZiBsaW5rc1xuICAgIGNvbnN0IGdldEhSRUYgPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCBzYW50aXplSFJFRiA9IHN0ciA9PiB7XG4gICAgICAgIGNvbnN0IGhyZWZSRSA9IC9eKC4qXFwvKShbXFx3LV0qXFwvPykoLiopJC9nbVxuICAgICAgICAvLyBjb25zdCBocmVmUkUgPSAvXiguKlxcLykoW1xcdy1dKikoLiopJC9nbTtcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoaHJlZlJFLCAnJDEkMicpXG4gICAgICAgIC8vIHN0ciA9IFN0cmluZyhzdHIpLnJlcGxhY2UoJ14kJywgXCJcIik7XG4gICAgICAgIHJldHVybiBzdHJcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGVhZFN0clZhbCA9IHR5cGUgPT09ICdxdWVyeScgPyAnJyA6IGlzSGFzaCA9PT0gdHJ1ZSA/ICcjJyA6ICcvJ1xuICAgICAgY29uc3QgaHJlZlN0ciA9ICBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRQYXJhbXNUb1JvdXRlKG9iaiwgY2hhbm5lbFJvdXRlT2JqKVxuICAgICAgcmV0dXJuIGhlYWRTdHJWYWwgKyBzYW50aXplSFJFRihocmVmU3RyKVxuICAgIH1cblxuICAgIC8vIHJlbW92ZSBzcGVjaWFsIGNoYXJzIGZyb20gaHJlZlxuICAgIGNvbnN0IHNhbml0aXplU3RyID0gKHN0cikgPT4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFteQS1aYS16MC05LV9dKS9nLCAnJylcblxuICAgIC8vIHRlc3Qgd2hldGhlciB0byB1c2Uga2V5IG9yIHZhbFxuICAgIGNvbnN0IGlzVmFsaWRTdHJSRSA9IC9eKFtBLVphLXowLTlfLV0pKyQvbVxuXG4gICAgY29uc3QgY3JlYXRlSW5pdGlhbFZhbEZuID0gKGFjY01haW4gPSBbXSwgcm91dGVQYXRoT2JqLCBvYmpBY2MgPSB7fSkgPT4ge1xuICAgICAgbGV0IHsgcm91dGVOYW1lIH0gPSByb3V0ZVBhdGhPYmpcblxuICAgICAgY29uc3QgcHJvcHNSZWR1Y2VyID0gKGFjYywgYXJyUGFpcikgPT4ge1xuICAgICAgICBjb25zdCBba2V5LCB2YWxdID0gYXJyUGFpclxuICAgICAgICBjb25zdCBpc09iamVjdCA9IGlzKE9iamVjdCwgdmFsKVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVRpdGxlID0gKHN0cikgPT4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFstX10pL2csICcgJykudG9VcHBlckNhc2UoKVxuXG4gICAgICAgIGNvbnN0IGdldExpbmtUZXh0ID0gc3RyID0+IHRlc3QoaXNWYWxpZFN0clJFLCBzdHIpID8gY3JlYXRlVGl0bGUoc3RyKSA6IGtleVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdyb3V0ZU5hbWUnIHx8IGtleSA9PT0gJzQwNCcpIHtcbiAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgIH1cblxuICAgICAgICByb3V0ZU5hbWUgPSByb3V0ZU5hbWUgfHwgcHJvcCgncm91dGVOYW1lJywgdmFsKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRIRSBLRVkgSVMgXCIse2tleSx2YWwscm91dGVOYW1lfSlcblxuICAgICAgICBsZXQgbyA9IGNsb25lKG9iakFjYylcbiAgICAgICAgb1tyb3V0ZU5hbWVdID0gc2FuaXRpemVTdHIoa2V5KVxuXG4gICAgICAgIGlmIChpc09iamVjdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGlmIChrZXlzKG8pLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViUm91dGVOYW1lID0gcGF0aChbJ3JvdXRlUGF0aCcsICdyb3V0ZU5hbWUnXSwgdmFsKVxuICAgICAgICAgICAgaWYgKHN1YlJvdXRlTmFtZSkge1xuICAgICAgICAgICAgICBjb25zdCBvQmFzZSA9IGNsb25lKG8pXG4gICAgICAgICAgICAgIG9CYXNlW3N1YlJvdXRlTmFtZV0gPSAnJ1xuICAgICAgICAgICAgICBvQmFzZS5uYXZMZXZlbCA9IGtleXMob2JqQWNjKS5sZW5ndGhcbiAgICAgICAgICAgICAgb0Jhc2UudGl0bGUgPSBnZXRMaW5rVGV4dChrZXkpXG4gICAgICAgICAgICAgIG9CYXNlLmhyZWYgPSBnZXRIUkVGKG9CYXNlKVxuICAgICAgICAgICAgICBhY2MucHVzaChvQmFzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbyA9IGNyZWF0ZUluaXRpYWxWYWxGbihhY2NNYWluLCB2YWwsIG8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgby50aXRsZSA9IGdldExpbmtUZXh0KGtleSlcbiAgICAgICAgICBvLmhyZWYgPSBnZXRIUkVGKG8pXG4gICAgICAgIH1cbiAgICAgICAgby5uYXZMZXZlbCA9IGtleXMob2JqQWNjKS5sZW5ndGhcbiAgICAgICAgYWNjLnB1c2gobylcbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9QYWlycyhyb3V0ZVBhdGhPYmopLnJlZHVjZShwcm9wc1JlZHVjZXIsIFtdKVxuICAgIH1cblxuICAgIGNvbnN0IHJlZHVjZWRBcnIgPSBjcmVhdGVJbml0aWFsVmFsRm4oW10sIGNoYW5uZWxSb3V0ZU9iai5yb3V0ZXMpXG4gICAgY29uc3Qgcm91dGVEYXRhc2V0c0FyciA9IGZsYXR0ZW4ocmVkdWNlZEFycilcblxuICAgIGNvbnN0IGdldE5hdlByb3BzID0gKGRhdGFzZXRzQXJyKSA9PiB7XG4gICAgICBjb25zdCBleGNsdWRlID0gcmVqZWN0KGluY2x1ZGVzKF9fLCBbJ3RpdGxlJywgJ2hyZWYnLCAnbmF2TGV2ZWwnXSkpXG4gICAgICBjb25zdCBnZXRNYWluS2V5cyA9IGNvbXBvc2UodW5pcSwgZXhjbHVkZSwgZmxhdHRlbiwgbWFwKGtleXMpKVxuICAgICAgcmV0dXJuIGdldE1haW5LZXlzKGRhdGFzZXRzQXJyKVxuICAgIH1cbiAgICBjb25zdCByb3V0ZU5hbWVzQXJyID0gZ2V0TmF2UHJvcHMocm91dGVEYXRhc2V0c0FycilcblxuICAgIHJldHVybiB7IHJvdXRlRGF0YXNldHNBcnIsIHJvdXRlTmFtZXNBcnIgfVxuICB9XG5cbiAgc3RhdGljIGNvbmZvcm1Sb3V0ZU9iamVjdChjaGFubmVsUm91dGVPYmogPSB7fSwgYWRkNDA0UHJvcHMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGNoYW5uZWxzUm91dGVQYXRoID0gcGF0aChbJ2NoYW5uZWxzJywgJ1JPVVRFJ10sIGNoYW5uZWxSb3V0ZU9iailcbiAgICBsZXQgeyBhZGQ0MDRzIH0gPSBjaGFubmVsc1JvdXRlUGF0aCAhPT0gdW5kZWZpbmVkID8gY2hhbm5lbHNSb3V0ZVBhdGggOiBjaGFubmVsUm91dGVPYmpcbiAgICBhZGQ0MDRzID0gYWRkNDA0cyB8fCBhZGQ0MDRQcm9wc1xuICAgIGNvbnN0IHBhcnNlUm91dGVQYXRoID0gKGEpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IGFbMV1cbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGlmICh2YWwgPT09ICcnKSB7XG4gICAgICAgIGFbMV0gPSAnXiQnXG4gICAgICB9IGVsc2UgaWYgKGlzQXJyKSB7XG4gICAgICAgIGFbMV0gPSB2YWwuam9pbignfCcpXG4gICAgICB9XG4gICAgICByZXR1cm4gYVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zZHVjZUNvbmZpZyA9IChhcnIpID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJcbiAgICAgIGNvbnN0IG9iajQwNCA9IGFkZDQwNHMgPyB7IDQwNDogJy4rJyB9IDoge31cbiAgICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0LCB2YWwpXG4gICAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5LCB2YWwpXG4gICAgICBjb25zdCBpdGVyT2JqID0gaXNPYmogPT09IHRydWUgJiYgaXNBcnIgPT09IGZhbHNlXG4gICAgICBjb25zdCBpc1JvdXRlUGF0aCA9IGtleSA9PT0gJ3JvdXRlUGF0aCdcbiAgICAgIGlmIChpdGVyT2JqKSB7XG4gICAgICAgIGFyclsxXSA9IGNvbmZpZ01hcHBlckZuKGFyclsxXSlcbiAgICAgICAgaWYgKGlzUm91dGVQYXRoKSB7XG4gICAgICAgICAgYXJyWzFdID0gY29tcG9zZShtZXJnZURlZXBSaWdodChvYmo0MDQpLCBmcm9tUGFpcnMsIG1hcChwYXJzZVJvdXRlUGF0aCksIHRvUGFpcnMpKGFyclsxXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyclxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ01hcHBlckZuID0gY29tcG9zZShmcm9tUGFpcnMsIG1hcCh0cmFuc2R1Y2VDb25maWcpLCB0b1BhaXJzKVxuXG4gICAgaWYgKGNoYW5uZWxzUm91dGVQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSA9IGNvbmZpZ01hcHBlckZuKGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSlcbiAgICAgIGNvbnN0IGV4dHJhUm91dGVEYXRhID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5hZGRSb3V0ZURhdGFzZXRzKGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSlcbiAgICAgIGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSA9IG1lcmdlUmlnaHQoY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFLCBleHRyYVJvdXRlRGF0YSlcbiAgICAgIHJldHVybiBjaGFubmVsUm91dGVPYmpcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnTWFwcGVyRm4oY2hhbm5lbFJvdXRlT2JqKVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbUV2ZW50UGF0dGVybiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IG1hcE9iakluZGV4ZWQgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsV2luZG93IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3dcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcyBmb3IgU3B5bmVXaW5kb3dDaGFubmVsXG4gICAqXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQgPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50LmJpbmQoXG4gICAgICB0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoZXZlbnROYW1lLCBtYXBGbiwgaXNQYXNzaXZlID0gdHJ1ZSwgZWxlbWVudCA9IHdpbmRvdykge1xuICAgIGNvbnN0IGFkZEhhbmRsZXIgPSBoYW5kbGVyID0+IGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIsXG4gICAgICB7IHBhc3NpdmU6IGlzUGFzc2l2ZSB9KVxuICAgIGNvbnN0IHJlbW92ZUhhbmRsZXIgPSAoKSA9PiB7IGVsZW1lbnRbZXZlbnROYW1lXSA9IChwKSA9PiBwIH1cbiAgICBtYXBGbiA9IG1hcEZuID09PSB1bmRlZmluZWQgPyAocCkgPT4gcCA6IG1hcEZuXG4gICAgcmV0dXJuIGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlcikucGlwZShtYXAobWFwRm4pKVxuICB9XG5cbiAgLy8gTUVESUEgUVVFUklFU1xuICBzdGF0aWMgY3JlYXRlTWVkaWFRdWVyeShzdHIpIHtcbiAgICBjb25zdCBtcSA9IHdpbmRvdy5tYXRjaE1lZGlhKHN0cilcbiAgICB0aGlzLmNoZWNrSWZWYWxpZE1lZGlhUXVlcnkobXEsIHN0cilcbiAgICByZXR1cm4gbXEgIT09IGZhbHNlID8gbXEgOiBmYWxzZVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZWYWxpZE1lZGlhUXVlcnkobXEsIHN0cikge1xuICAgIGNvbnN0IG5vU3BhY2VzID0gc3RyID0+IHN0ci5yZXBsYWNlKC9cXHMrL2dtLCAnJylcbiAgICBjb25zdCBpc1ZhbGlkQm9vbCA9IG1xLm1hdGNoZXMgIT09IHVuZGVmaW5lZCAmJiBub1NwYWNlcyhtcS5tZWRpYSkuaW5kZXhPZihub1NwYWNlcyhzdHIpKSA+PSAwXG4gICAgY29uc3Qgd2Fybk1zZyA9IHN0ciA9PiBjb25zb2xlLndhcm4oYFNweW5lIEluZm86IHRoZSBmb2xsb3dpbmcgcXVlcnkgc3RyaW5nLCBcIiR7c3RyfVwiLCBoYXMgYmVlbiBvcHRpbWl6ZWQgdG8gXCIke21xLm1lZGlhfVwiIGJ5IHRoZSBicm93c2VyIGFuZCBtYXkgbm90IGJlIGEgdmFsaWQgTWVkaWEgUXVlcnkgaXRlbSFgKVxuICAgIGlmIChpc1ZhbGlkQm9vbCA9PT0gZmFsc2UpIHtcbiAgICAgIHdhcm5Nc2coc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZEJvb2xcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlcihxdWVyeSwga2V5KSB7XG4gICAgY29uc3Qga2V5Rm4gPSBrZXkgPT4gcCA9PiB7XG4gICAgICBwLm1lZGlhUXVlcnlOYW1lID0ga2V5XG4gICAgICByZXR1cm4gcFxuICAgIH1cblxuICAgIGNvbnN0IG1hcEtleSA9IGtleUZuKGtleSlcblxuICAgIGNvbnN0IGhhbmRsZXJzID0gKHEpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZEhhbmRsZXI6IChoYW5kbGVyKSA9PiB7IHEuYWRkTGlzdGVuZXIoaGFuZGxlcikgfSxcbiAgICAgICAgcmVtb3ZlSGFuZGxlcjogKGhhbmRsZXIpID0+IHsgcS5vbmNoYW5nZSA9ICgpID0+IHt9IH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbWVkaWFRdWVyeUhhbmRsZXIgPSBoYW5kbGVycyhxdWVyeSlcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG4gICAgcmV0dXJuIG5ldyBmcm9tRXZlbnRQYXR0ZXJuKFxuICAgICAgbWVkaWFRdWVyeUhhbmRsZXIuYWRkSGFuZGxlcixcbiAgICAgIG1lZGlhUXVlcnlIYW5kbGVyLnJlbW92ZUhhbmRsZXIpXG4gICAgICAucGlwZShtYXAobWFwS2V5KSlcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZXJnZWRPYnNGcm9tT2JqKGNvbmZpZykge1xuICAgIGNvbnN0IG1lZGlhUXVlcmllc09iaiA9IGNvbmZpZy5tZWRpYVF1ZXJpZXMgfHwgY29uZmlnLm1lZGlhUXVlcmllc1xuICAgIGNvbnN0IGFyciA9IFtdXG5cbiAgICBjb25zdCBsb29wUXVlcmllcyA9ICh2YWwsIGtleSwgb2JqKSA9PiB7XG4gICAgICBjb25zdCBtcSA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lZGlhUXVlcnkodmFsKVxuICAgICAgaWYgKG1xICE9PSBmYWxzZSkge1xuICAgICAgICBhcnIucHVzaChTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlcihtcSwga2V5KSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJcbiAgICB9XG5cbiAgICBtYXBPYmpJbmRleGVkKGxvb3BRdWVyaWVzLCBtZWRpYVF1ZXJpZXNPYmopXG4gICAgcmV0dXJuIGFyclxuICB9XG59XG4iLCJjb25zdCBjcmVhdGVGYWRlcklubGluZVRleHQgPSAoaXNJbkJvb2wgPSBmYWxzZSwgdCA9IDEsIGUgPSAnZWFzZScsIHN0YXJ0WmVyb0Jvb2wgPSBmYWxzZSkgPT4ge1xuICBjb25zdCBpbml0T3BhY2l0eVplcm8gPSBzdGFydFplcm9Cb29sID09PSB0cnVlID8gJ29wYWNpdHk6MDsnIDogJydcbiAgY29uc3Qgb3BhY2l0eSA9IGlzSW5Cb29sID09PSB0cnVlID8gMSA6IDBcbiAgcmV0dXJuIGAke2luaXRPcGFjaXR5WmVyb310cmFuc2l0aW9uOiBvcGFjaXR5ICR7dH1zICR7ZX07IG9wYWNpdHk6ICR7b3BhY2l0eX07YFxufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVpbihlbCwgdCkge1xuICBjb25zdCBjdXJyZW50T3BhY2l0eSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5vcGFjaXR5ICogMVxuICBjb25zdCBzdGFydEF0WmVybyA9IGN1cnJlbnRPcGFjaXR5ID09PSAxXG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dCh0cnVlLCB0LCAnZWFzZScsIHN0YXJ0QXRaZXJvKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVvdXQoZWwsIHQsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dChmYWxzZSwgdCwgJ2Vhc2UnKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xuXG4gIC8vIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCB0ICogMTAwMCk7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBjYWxsYmFjaywgZmFsc2UpXG59XG4iLCJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBmbGlwLCBtZXJnZVJpZ2h0LCBjbG9uZSwgZm9yRWFjaCwgcHJvcFNhdGlzZmllcyB9IGZyb20gJ3JhbWRhJ1xuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1PYnNlcnZhYmxlIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1PYnNlcnZhYmxlXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgb2JzZXJ2YWJsZSB0aGF0IGNyZWF0ZXMgdGhlIFZpZXdTdHJlYW0gT2JzZXJ2YWJsZSB0aGF0IGJyYW5jaGVzIG91dCB0byBwYXJlbnQsIGludGVybmFsIGFuZCBjaGlsZCBkaXJlY3Rpb25zXG4gICAgICovXG4gICAgdGhpcy5wcm9wcy5vYnNlcnZhYmxlU3RyZWFtcyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsT2JzZXJ2YWJsZXMoKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpIHtcbiAgICBjb25zdCBkaXJJbnRlcm5hbCA9ICdpbnRlcm5hbCdcbiAgICBjb25zdCBkaXJQYXJlbnQgPSAncGFyZW50J1xuICAgIGNvbnN0IGRpckNoaWxkID0gJ2NoaWxkJ1xuICAgIHJldHVybiB7XG4gICAgICBQOiBbZGlyUGFyZW50XSxcbiAgICAgIEM6IFtkaXJDaGlsZF0sXG4gICAgICBQQ0k6IFtkaXJQYXJlbnQsIGRpckludGVybmFsLCBkaXJDaGlsZF0sXG4gICAgICBDSTogW2RpckNoaWxkLCBkaXJJbnRlcm5hbF0sXG4gICAgICBQSTogW2RpclBhcmVudCwgZGlySW50ZXJuYWxdLFxuICAgICAgUEM6IFtkaXJQYXJlbnQsIGRpckNoaWxkXVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhZGREZWZhdWx0RGlyKG9iaikge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyh7ICRkaXI6WydpbnRlcm5hbCddIH0sIGNsb25lKG9iaikpXG4gIH1cblxuICBzdGF0aWMgYWRkRG93bkludGVybmFsRGlyKG9iaiwgYXJyID0gWydpbnRlcm5hbCcsICdkb3duJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IGZsaXAobWVyZ2VSaWdodClcbiAgICByZXR1cm4gZGVmYXVsdHMoY2xvbmUob2JqKSwgeyAkZGlyOmFyciB9KVxuICB9XG5cbiAgc3RhdGljIGFkZENoaWxkQW5kSW50ZXJuYWxEaXIob2JqLCBhcnIgPSBbJ2NoaWxkJywgJ2Rvd24nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyhjbG9uZShvYmopLCB7ICRkaXI6YXJyIH0pXG4gIH1cblxuICBzdGF0aWMgbWFwVG9EZWZhdWx0RGlyKHApIHtcbiAgICByZXR1cm4gdGhpcy5hZGREZWZhdWx0RGlyKHApXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyhvYnMkID0gbmV3IFN1YmplY3QoKSwgdmlld05hbWUsIHZzaWQpIHtcbiAgICBpZiAodmlld05hbWUgIT09IHVuZGVmaW5lZCAmJiB2c2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9icyQudmlld05hbWUgPSB2aWV3TmFtZVxuICAgICAgb2JzJC52c2lkID0gdnNpZFxuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlclN0cmVhbXMgPSB2YWwgPT4gcHJvcFNhdGlzZmllcyhhcnJUeXBlID0+IGFyclR5cGUuaW5jbHVkZXModmFsKSwgJyRkaXInKVxuICAgIGNvbnN0IGZpbHRlclBhcmVudCA9IGZpbHRlclN0cmVhbXMoJ3BhcmVudCcpXG4gICAgY29uc3QgZmlsdGVyQ2hpbGQgPSBmaWx0ZXJTdHJlYW1zKCdjaGlsZCcpXG4gICAgY29uc3QgZmlsdGVySW50ZXJuYWwgPSBmaWx0ZXJTdHJlYW1zKCdpbnRlcm5hbCcpXG5cbiAgICBjb25zdCBhZGRmcm9tJCA9IHJlbFN0ciA9PiBtZXJnZVJpZ2h0KHsgZnJvbSQ6cmVsU3RyIH0pXG4gICAgY29uc3QgYWRkUGFyZW50ZnJvbSQgPSBhZGRmcm9tJCgnY2hpbGQnKVxuICAgIGNvbnN0IGFkZEludGVybmFsZnJvbSQgPSBhZGRmcm9tJCgnaW50ZXJuYWwnKVxuICAgIGNvbnN0IGFkZENoaWxkZnJvbSQgPSBhZGRmcm9tJCgncGFyZW50JylcblxuICAgIGNvbnN0IHJhdyQgPSAgb2JzJFxuICAgICAgLnBpcGUoZmlsdGVyKChwYXlsb2FkKSA9PiBwYXlsb2FkICE9PSB1bmRlZmluZWQgJiYgcGF5bG9hZC5hY3Rpb24gIT09IHVuZGVmaW5lZCkpXG5cbiAgICBjb25zdCB0b0ludGVybmFsJCA9IG9icyQucGlwZShmaWx0ZXIoZmlsdGVySW50ZXJuYWwpLCBtYXAoYWRkSW50ZXJuYWxmcm9tJCkpXG4gICAgY29uc3QgdG9QYXJlbnQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJQYXJlbnQpLCBtYXAoYWRkUGFyZW50ZnJvbSQpKVxuICAgIGNvbnN0IHRvQ2hpbGQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJDaGlsZCksIG1hcChhZGRDaGlsZGZyb20kKSlcblxuICAgIGNvbnN0IHN0cmVhbU9iaiA9IHtcbiAgICAgIHBhcmVudDogdG9QYXJlbnQkLFxuICAgICAgaW50ZXJuYWw6IHRvSW50ZXJuYWwkLFxuICAgICAgY2hpbGQ6IHRvQ2hpbGQkXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSAoYXJyID0gW10pID0+IHtcbiAgICAgIGNvbnN0IGVuZFN0cmVhbSA9IG8gPT4ge1xuICAgICAgICBvLmNvbXBsZXRlKClcbiAgICAgICAgby5pc1N0b3BwZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNldENvbXBsZXRlU3RyZWFtID0gKHN0cikgPT4ge1xuICAgICAgICBpZiAoc3RyZWFtT2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IG9icyQgPSBzdHJlYW1PYmpbc3RyXVxuICAgICAgICAgIGVuZFN0cmVhbShvYnMkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhcnIgIT09IHVuZGVmaW5lZCAmJiBhcnIubGVuZ3RoID49IDEpIHtcbiAgICAgICAgYXJyLmZvckVhY2goc2V0Q29tcGxldGVTdHJlYW0pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbXBsZXRlQWxsID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSBvID0+IHtcbiAgICAgICAgby5jb21wbGV0ZSgpXG4gICAgICAgIG8uaXNTdG9wcGVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgZm9yRWFjaChjb21wbGV0ZVN0cmVhbSwgW3JhdyQsIHRvSW50ZXJuYWwkLCB0b1BhcmVudCQsIHRvQ2hpbGQkXSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmF3JCwgdG9JbnRlcm5hbCQsIHRvUGFyZW50JCwgdG9DaGlsZCQsIGNvbXBsZXRlQWxsLCBjb21wbGV0ZVN0cmVhbVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaW5jbHVkZXMsIF9fLCBpZkVsc2UsIHBhdGgsIHByb3AsIHJlamVjdCwgaXMsIGlzTmlsLCBpc0VtcHR5IH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgc2FuaXRpemVIVE1MIGZyb20gJy4uL3V0aWxzL3Nhbml0aXplLWh0bWwuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxuLyoqXG4gKiBAbW9kdWxlIERvbUVsVGVtcGxhdGVcbiAqIEB0eXBlIHV0aWxcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0ZW1wbGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqXG4gKiBAZGVzYyBEb21FbGVtZW50IHVzZXMgdGhpcyBjbGFzcyB3aGVuIHJlbmRlcmluZyB0ZW1wbGF0ZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0PkFjY2Vzc2luZyBwcm9wZXJ0aWVzIHVzaW5nIGEgZG91YmxlIGJyYWNrZXQge3smbmJzcDsmbmJzcDsmbmJzcDt9fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSB7e25hbWU6XCJXb3JsZH19O1xuICogY29uc3QgdGVtcGxhdGUgPSBgPHA+SGVsbG8ge3tuYW1lfX0hPC9wPmA7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvLyBPdXRwdXRzXG4gKiA8cD5IZWxsbyBXb3JsZCE8L3A+XG4gKlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICogVElUTEVbXCI8aDQ+TG9vcGluZyB0aHJvdWdoIGFuIGFuIGFycmF5IG9mIG9iamVjdHMgdXNpbmcgbG9vcCB7eyNsb29wUHJvcGVydHl9fSB7e3Byb3BlcnR5fX0ge3svbG9vcFByb3BlcnR5fX0gZXhwcmVzc2lvbjwvaDQ+XCJdXG4gKiBjb25zdCBkYXRhID0ge2FuaW1hbHM6IFtcbiAqICAge2FuaW1hbDogJ2NhdCcsIHNvdW5kOiAnbWVvdyd9LFxuICogICB7YW5pbWFsOiAnZG9nJywgc291bmQ6ICd3b29mJ30sXG4gKiAgIHthbmltYWw6ICdiaXJkJywgc291bmQ6IHR3ZWV0J31cbiAqIF19O1xuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gYFxuICogPHVsPlxuICoge3sjYW5pbWFsc319XG4gKiAgIDxsaT5UaGUge3thbmltYWx9fSBzYXlzICd7e3NvdW5kfX0nLjwvbGk+XG4gKiB7ey9hbmltYWxzfX1cbiAqIDwvdWw+YDtcbiAqXG4gKiB0aGlzLnByb3BzLmVsLmFwcGVuZENoaWxkKG5ld1xuICogRG9jRWxUZW1wbGF0ZSh0ZW1wbGF0ZSxkYXRhKS5yZW5kZXJEb2NGcmFnKCkpO1xuICpcbiAqIC8vIE91dHB1dHNcbiAqIDx1bD5cbiAqICAgIDxsaT5UaGUgY2F0IHNheXMgJ21lb3cnLjwvbGk+XG4gKiAgICA8bGk+VGhlIGRvZyBzYXlzICd3b29mJy48L2xpPlxuICogICAgPGxpPlRoZSBiaXJkIHNheXMgJ3R3ZWV0Jy48L2xpPlxuICogPC91bD5cbiAqXG4gKlxuICpcbiAqIEBleGFtcGxlXG4gKiBUSVRMRVtcIjxoND5Mb29waW5nIHRocm91Z2ggbGlzdCBpdGVtcyBpbiBhbiBhcnJheSBvZiB1c2luZyB7eyNhcnJOYW1lfX0gJm5ic3A7Jm5ic3A7e3sufX0mbmJzcDsmbmJzcDsge3svYXJyTmFtZX19IGV4cHJlc3Npb248L2g0PlwiXVxuICogY29uc3QgZGF0YSA9ICB7bmFtZTogJ0phbmUnLCBwZXRzOiBbJ01pbG8nLCdMdW5hJywnS2lraSddfTtcbiAqIGNvbnN0IHRlbXBsYXRlID0gXCI8YXJ0aWNsZT5cbiAqICAgICAgICAgICAgICAgICAgPGgzPldlbGNvbWUsIHt7bmFtZX19LCB5b3VyIHBldHMgYXJlOjwvaDM+XG4gKiAgICAgICAgICAgICAgICAgIDx1bD57eyNwZXRzfX1cbiAqICAgICAgICAgICAgICAgICAgICA8bGk+e3sufX0sIDwvbGk+XG4gKiAgICAgICAgICAgICAgICAgICAge3svcGV0c319XG4gKiAgICAgICAgICAgICAgICAgPC91bD48L2FydGljbGU+XCI7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvLyBPdXRwdXRzXG4gKiA8YXJ0aWNsZT5cbiAqICAgPGgzPldlbGNvbWUgSmFuZSwgeW91ciBwZXRzIGFyZTo8L2gzPlxuICogICAgPHVsPlxuICogICAgICAgPGxpPk1pbG88L2xpPlxuICogICAgICAgPGxpPkx1bmE8L2xpPlxuICogICAgICAgPGxpPktpa2k8L2xpPlxuICogICAgPC91bD5cbiAqIDwvYXJ0aWNsZT5cbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0Pkxvb3BpbmcgdGhyb3VnaCBhbiBhcnJheSB3aXRoIG5vIHByb3BlcnR5IG5hbWUgdXNpbmcge3sjfX0gJm5ic3A7Jm5ic3A7e3sgfX0mbmJzcDsmbmJzcDsge3svfX0gZXhwcmVzc2lvbjwvaDQ+XCJdXG4gKiBjb25zdCBkYXRhID0gW1xuICogICAgICB7aXRlbTogJ0Nvb2tpZScsIGNhbG9yaWVzOiAxNDJ9LFxuICogICAgICB7aXRlbTogJ0FwcGxlJywgIGNhbG9yaWVzOiA5NX0sXG4gKiAgICAgIHtpdGVtOiAnQ2hlZXNlJywgY2Fsb3JpZXM6IDExM31dO1xuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gYFxuICogPGFydGljbGU+XG4gKiA8aDM+U25hY2tzOjwvaDM+XG4gKiAgIDx1bD5cbiAqICAgICAge3sjfX1cbiAqICAgICAgPGxpPnt7aXRlbX19LCBjYWxvcmllczoge3tjYWxvcmllc319PC9saT5cbiAqICAgICAge3svfX1cbiAqICAgPC91bD5cbiAqIDwvYXJ0aWNsZT5cbiAqIGA7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvLyBPdXRwdXRzXG4gKiA8YXJ0aWNsZT5cbiAqICAgPGgzPlNuYWNrczwvaDM+XG4gKiAgICA8dWw+XG4gKiAgICAgICA8bGk+Q29va2llLCBjYWxvcmllczogMTQyPC9saT5cbiAqICAgICAgIDxsaT5BcHBsZSwgY2Fsb3JpZXM6IDk1PC9saT5cbiAqICAgICAgIDxsaT5DaGVlc2UsIGNhbG9yaWVzOiAxMTM8L2xpPlxuICogICAgPC91bD5cbiAqIDwvYXJ0aWNsZT5cbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0Pkxvb3BpbmcgdGhyb3VnaCBhbiBhcnJheSB3aXRoIG5vIHByb3BlcnR5IG5hbWUgdXNpbmcge3sjfX0gJm5ic3A7Jm5ic3A7e3sgLiB9fSZuYnNwOyZuYnNwOyB7ey99fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSBbJ1R5cmlvbicsICdBcnlhJywgJ0pvbiBTbm93JywgJ1NhbnNhJ107XG4gKiBjb25zdCB0ZW1wbGF0ZSA9IGBcbiAqIDxoMz5NYWluIEdvVCBDaGFyYWN0ZXJzPC9oMz5cbiAqIDx1bD5cbiAqICB7eyN9fVxuICogICA8bGk+e3sufX08L2xpPlxuICogIHt7L319XG4gKiAgPC91bD4nO1xuICpcbiAqIHRoaXMucHJvcHMuZWwuYXBwZW5kQ2hpbGQobmV3XG4gKiBEb2NFbFRlbXBsYXRlKHRlbXBsYXRlLGRhdGEpLnJlbmRlckRvY0ZyYWcoKSk7XG4gKlxuICogLy9PdXRwdXRzXG4gKiA8aDM+TWFpbiBHb1QgQ2hhcmFjdGVyczwvaDM+XG4gKiA8dWw+XG4gKiAgIDxsaT5UeXJpb248L2xpPlxuICogICA8bGk+QXJ5YTwvbGk+XG4gKiAgIDxsaT5Kb24gU25vdzwvbGk+XG4gKiAgIDxsaT5TYW5zYTwvbGk+XG4gKiA8L3VsPlxuICpcbiAqXG4gKi9cblxuZXhwb3J0IGNsYXNzIERvbUVsZW1lbnRUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlLCBkYXRhID0ge30sIG9wdHMgPSB7fSkge1xuICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLmZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlKVxuICAgIHRoaXMuaXNQcm94eURhdGEgPSBkYXRhLl9fY21zX19pc1Byb3h5ID09PSB0cnVlXG4gICAgdGhpcy50ZXN0TW9kZSA9IG9wdHM/LnRlc3RNb2RlXG5cbiAgICBjb25zdCBjaGVja0ZvckFycmF5RGF0YSA9ICgpID0+IHtcbiAgICAgIGlmIChpcyhBcnJheSwgZGF0YSkgPT09IHRydWUpIHtcbiAgICAgICAgZGF0YSA9IHsgc3B5bmVEYXRhOmRhdGEgfVxuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZS5yZXBsYWNlKCd7ey99fScsICd7ey9zcHluZURhdGF9fScpXG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLnJlcGxhY2UoJ3t7I319JywgJ3t7I3NweW5lRGF0YX19JylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0ZvckFycmF5RGF0YSgpXG5cbiAgICB0aGlzLnRlbXBsYXRlRGF0YSA9IGRhdGFcblxuICAgIGNvbnN0IHN0ckFyciA9IERvbUVsZW1lbnRUZW1wbGF0ZS5nZXRTdHJpbmdBcnJheSh0aGlzLnRlbXBsYXRlKVxuXG4gICAgbGV0IHN0ck1hdGNoZXMgPSB0aGlzLnRlbXBsYXRlLm1hdGNoKERvbUVsZW1lbnRUZW1wbGF0ZS5maW5kVG1wbExvb3BzUkUoKSlcbiAgICBzdHJNYXRjaGVzID0gc3RyTWF0Y2hlcyA9PT0gbnVsbCA/IFtdIDogc3RyTWF0Y2hlc1xuXG4gICAgY29uc3QgcGFyc2VUbXBsTG9vcHNSRSA9IERvbUVsZW1lbnRUZW1wbGF0ZS5wYXJzZVRtcGxMb29wc1JFKClcblxuICAgIGNvbnN0IHBhcnNlVG1wbExvb3BGbiA9ICB0aGlzLnBhcnNlVGhlVG1wbExvb3AuYmluZCh0aGlzKVxuXG4gICAgY29uc3QgbWFwVG1wbExvb3AgPSAoc3RyLCBkYXRhKSA9PiB7XG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UocGFyc2VUbXBsTG9vcHNSRSwgcGFyc2VUbXBsTG9vcEZuKVxuICAgIH1cblxuICAgIGNvbnN0IGZpbmRUbXBsTG9vcHNQcmVkID0gaW5jbHVkZXMoX18sIHN0ck1hdGNoZXMpXG4gICAgY29uc3QgY2hlY2tGb3JNYXRjaGVzID0gaWZFbHNlKFxuICAgICAgZmluZFRtcGxMb29wc1ByZWQsXG4gICAgICBtYXBUbXBsTG9vcCxcbiAgICAgIHRoaXMuYWRkUGFyYW1zLmJpbmQodGhpcykpXG5cbiAgICB0aGlzLmZpbmFsQXJyID0gc3RyQXJyLm1hcChjaGVja0Zvck1hdGNoZXMpXG4gIH1cblxuICBzdGF0aWMgaXNQcmltaXRpdmVUYWcoc3RyKSB7XG4gICAgcmV0dXJuIC8oe3tcXC5cXCo/fX0pLy50ZXN0KHN0cilcbiAgfVxuXG4gIC8vIEZJTkQgQ09SUkVDVCBORVNURUQgREFUQVxuICBzdGF0aWMgZ2V0TmVzdGVkRGF0YVJlZHVjZXIoZGF0YSA9IHt9LCBwYXJhbSA9ICcnKSB7XG4gICAgY29uc3QgZGF0YVJlZHVjZXIgPSAobmVzdGVkRGF0YSwgc3RyKSA9PiB7XG4gICAgICBpZiAobmVzdGVkRGF0YVtzdHJdKSB7XG4gICAgICAgIHJldHVybiBuZXN0ZWREYXRhW3N0cl1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgbmVzdGVkRGF0YSA9PT0gJ3N0cmluZycgPyBuZXN0ZWREYXRhIDogJydcbiAgICB9XG5cbiAgICByZXR1cm4gLyhcXC4pL2dtLnRlc3QoU3RyaW5nKHBhcmFtKSkgPyBTdHJpbmcocGFyYW0pLnNwbGl0KCcuJykucmVkdWNlKGRhdGFSZWR1Y2VyLCBkYXRhKSA6IGRhdGFbcGFyYW1dID8/ICcnXG4gIH1cblxuICBzdGF0aWMgZ2V0U3RyaW5nQXJyYXkodGVtcGxhdGUpIHtcbiAgICBjb25zdCBzdHJBcnIgPSB0ZW1wbGF0ZS5zcGxpdChEb21FbGVtZW50VGVtcGxhdGUuZmluZFRtcGxMb29wc1JFKCkpXG4gICAgY29uc3QgZW1wdHlSRSA9IC9eKFtcXFxcblxcc1xcV10rKSQvXG4gICAgY29uc3QgZmlsdGVyT3V0RW1wdHlTdHJpbmdzID0gcyA9PiBzLm1hdGNoKGVtcHR5UkUpXG4gICAgY29uc3QgZmluYWxTdHIgPSAgcmVqZWN0KGZpbHRlck91dEVtcHR5U3RyaW5ncywgc3RyQXJyKVxuXG4gICAgcmV0dXJuIGZpbmFsU3RyXG4gIH1cblxuICBzdGF0aWMgZmluZFRtcGxMb29wc1JFKCkge1xuICAgIHJldHVybiAvKHt7I1tcXHcuXSt9fVtcXHdcXG5cXHNcXFddKz97e1xcL1tcXHcuXSt9fSkvZ21cbiAgfVxuXG4gIHN0YXRpYyBwYXJzZVRtcGxMb29wc1JFKCkge1xuICAgIHJldHVybiAvKHt7IyhbXFx3Ll0rKX19KShbXFx3XFxuXFxzXFxXXSs/KSh7e1xcL1xcMn19KS9nbVxuICB9XG5cbiAgc3RhdGljIHN3YXBQYXJhbXNGb3JUYWdzUkUoKSB7XG4gICAgcmV0dXJuIC8oe3spKC4qPykofX0pL2dtXG4gIH1cblxuICByZW1vdmVUaGlzKCkge1xuICAgIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZmluYWxBcnIgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudGVtcGxhdGVEYXRhID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjIFJldHVybnMgYSBkb2N1bWVudCBmcmFnbWVudCBnZW5lcmF0ZWQgZnJvbSB0aGUgdGVtcGxhdGUgYW5kIGFueSBhZGRlZCBkYXRhLlxuICAgKi9cblxuICByZW5kZXJEb2NGcmFnKCkge1xuICAgIGxldCBodG1sID0gRG9tRWxlbWVudFRlbXBsYXRlLnJlcGxhY2VJbWdQYXRoKHRoaXMuZmluYWxBcnIuam9pbignJykpXG4gICAgLy8gaHRtbCA9IHNhbml0aXplSFRNTCh0aGlzLmZpbmFsQXJyLmpvaW4oJycpKVxuICAgIGlmICh0aGlzLnRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBodG1sID0gc2FuaXRpemVIVE1MKGh0bWwpXG4gICAgfVxuICAgIGNvbnN0IGlzVGFibGVTdWJUYWcgPSAgIC9eKFtePl0qPykoPCl7MX0oXFxiKSh0aGVhZHxjb2x8Y29sZ3JvdXB8dGJvZHl8dGR8dGZvb3R8dHJ8dGgpKFxcYikoW15cXDBdKikkLy50ZXN0KGh0bWwpXG4gICAgY29uc3QgZWwgPSBpc1RhYmxlU3ViVGFnID8gaHRtbCA6IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwpXG5cbiAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJlbW92ZVRoaXMsIDIpXG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICByZW5kZXJUb1N0cmluZygpIHtcbiAgICBsZXQgaHRtbCA9IHRoaXMuZmluYWxBcnIuam9pbignJylcbiAgICBodG1sID0gRG9tRWxlbWVudFRlbXBsYXRlLnJlcGxhY2VJbWdQYXRoKGh0bWwpXG4gICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5yZW1vdmVUaGlzLCAyKVxuICAgIHJldHVybiBodG1sXG4gIH1cblxuICBnZXRUZW1wbGF0ZVN0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbEFyci5qb2luKCcnKVxuICB9XG5cbiAgZm9ybWF0VGVtcGxhdGUodGVtcGxhdGUpIHtcbiAgICByZXR1cm4gWydTQ1JJUFQnLCAnVEVNUExBVEUnXS5pbmNsdWRlcyhwcm9wKCdub2RlTmFtZScsIHRlbXBsYXRlKSkgPT09IHRydWUgPyB0ZW1wbGF0ZS5pbm5lckhUTUwgOiB0ZW1wbGF0ZVxuICB9XG5cbiAgZ2V0RGF0YVZhbEZyb21QYXRoU3RyKHBhdGhTdHIsIGRhdGFGaWxlKSB7XG4gICAgY29uc3QgcGF0aEFyciA9IFN0cmluZyhwYXRoU3RyKS5zcGxpdCgnLicpXG4gICAgY29uc3QgcGF0aERhdGEgPSBwYXRoKHBhdGhBcnIsIGRhdGFGaWxlKVxuICAgIHJldHVybiBwYXRoRGF0YSB8fCAnJ1xuICB9XG5cbiAgYWRkUGFyYW1zKHN0cikge1xuICAgIGNvbnN0IHJlcGxhY2VUYWdzID0gKHN0ciwgcDEsIHAyLCBwMykgPT4ge1xuICAgICAgcmV0dXJuIERvbUVsZW1lbnRUZW1wbGF0ZS5nZXROZXN0ZWREYXRhUmVkdWNlcih0aGlzLnRlbXBsYXRlRGF0YSwgcDIpXG4gICAgfVxuICAgIHJldHVybiBzdHIucmVwbGFjZShEb21FbGVtZW50VGVtcGxhdGUuc3dhcFBhcmFtc0ZvclRhZ3NSRSgpLCByZXBsYWNlVGFncylcbiAgfVxuXG4gIHN0YXRpYyByZXBsYWNlSW1nUGF0aCh0ZW1wbGF0ZVN0cikge1xuICAgIGNvbnN0IHsgSU1HX1BBVEggfSA9IFNweW5lQXBwUHJvcGVydGllc1xuICAgIGlmIChJTUdfUEFUSCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZW1wbGF0ZVN0ciA9IHRlbXBsYXRlU3RyLnJlcGxhY2VBbGwoL3NyY1xccyo9XFxzKihbJ1wiXSlpbWdzXFwvL2csIGBzcmM9JDEke0lNR19QQVRIfWApXG4gICAgICByZXR1cm4gdGVtcGxhdGVTdHIucmVwbGFjZUFsbCgvdXJsXFwoXFxzKihbJ1wiXT8paW1nc1xcLy9nLCBgdXJsKCQxJHtJTUdfUEFUSH1gKVxuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGVTdHJcbiAgfVxuXG4gIHBhcnNlVGhlVG1wbExvb3Aoc3RyLCBwMSwgcDIsIHAzKSB7XG4gICAgLy8gY29uc3QgZG90Q29udmVydGVyID0gc3RyID0+IGAke3N0ci5yZXBsYWNlKC8oXFwuKS9nLCAnXVsnKX1gXG4gICAgY29uc3QgcmVEb3QgPSAvKFxcLikvZ21cbiAgICBjb25zdCBzdWJTdHIgPSBwM1xuXG4gICAgLyogICAgIGNvbnN0IGRhdGFSZWR1Y2VyID0gKGFjYywgc3RyKSA9PiB7XG4gICAgICBhY2MgPSBhY2Nbc3RyXVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0gKi9cblxuICAgIGxldCBlbERhdGEgPSBEb21FbGVtZW50VGVtcGxhdGUuZ2V0TmVzdGVkRGF0YVJlZHVjZXIodGhpcy50ZW1wbGF0ZURhdGEsIHAyKVxuXG4gICAgY29uc3QgYXJyYXlTdHJpbmdUb09iakFkYXB0ZXIgPSAoZCwgc3RyLCBpKSA9PiB7XG4gICAgICAvLyBJRiB7ey59fSBSVU4gcGFyc2VTdHJpbmdcbiAgICAgIGlmIChEb21FbGVtZW50VGVtcGxhdGUuaXNQcmltaXRpdmVUYWcoc3RyKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmcoZCwgc3RyLCBpKVxuICAgICAgfVxuXG4gICAgICAvLyBDUkVBVEUgREFUQSBPQkogLS0gQ0hFQ0sgVE8gQUREIFBST1hZIFZBTFVFU1xuICAgICAgY29uc3QgY3JlYXRlRGF0YU9iaiA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3B5bmVMb29wS2V5ID0gZFxuICAgICAgICBjb25zdCBsb29wSW5kZXggPSBpXG4gICAgICAgIGNvbnN0IGxvb3BOdW0gPSBpICsgMVxuXG4gICAgICAgIGlmICh0aGlzLmlzUHJveHlEYXRhKSB7XG4gICAgICAgICAgY29uc3QgX19jbXNfX2RhdGFJZCA9IGVsRGF0YS5fX2Ntc19fZGF0YUlkXG4gICAgICAgICAgY29uc3Qga2V5SWRTdHIgPSBgX19jbXNfX2tleUZvcl8ke2R9YFxuICAgICAgICAgIGNvbnN0IG9yaWdLZXkgPSBlbERhdGFba2V5SWRTdHJdXG4gICAgICAgICAgcmV0dXJuIHsgc3B5bmVMb29wS2V5LCBfX2Ntc19fZGF0YUlkLCBvcmlnS2V5LCBsb29wSW5kZXgsIGxvb3BOdW0sIGQgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHNweW5lTG9vcEtleSwgbG9vcEluZGV4LCBsb29wTnVtIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlT2JqZWN0KGNyZWF0ZURhdGFPYmooKSwgc3RyLCBpKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlU3RyaW5nID0gKGl0ZW0sIHN0ciwgaW5kZXgsIG9yaWdJbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKERvbUVsZW1lbnRUZW1wbGF0ZS5zd2FwUGFyYW1zRm9yVGFnc1JFKCksIGl0ZW0pXG4gICAgfVxuXG4gICAgLy8gUEFSU0lORyBBUlJBWVMgQU5EIE9CSkVDVFNcbiAgICBjb25zdCBwYXJzZU9iamVjdCA9IChvYmosIHN0ciwgaSkgPT4ge1xuICAgICAgLy8vIExPT1AgTlVNQkVSIFZBTFVFUyBBVVRPIEFEREVEXG5cbiAgICAgIC8vIGNvbnN0IGxvb3BJbmRleCA9IGk7XG4gICAgICAvLyBjb25zdCBsb29wTnVtID0gaSsxO1xuXG4gICAgICBjb25zdCBsb29wT2JqID0gKHN0ciwgcDEsIHAyKSA9PiB7XG4gICAgICAgIC8vIERPVCBTWU5UQVggQ0hFQ0tcbiAgICAgICAgY29uc3QgaGFzaCA9IHtcbiAgICAgICAgICBsb29wSW5kZXg6IGksXG4gICAgICAgICAgbG9vcE51bTogaSArIDFcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElGIHt7Ln19XG4gICAgICAgIGlmIChyZURvdC50ZXN0KHAyKSA9PT0gZmFsc2UgJiYgb2JqW3AyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGhhc2hbcDJdICE9PSB1bmRlZmluZWQgPyBoYXNoW3AyXSA6IG9ialtwMl1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGFSZWR1Y2VkVmFsICA9IHRoaXMuZ2V0RGF0YVZhbEZyb21QYXRoU3RyKHAyLCBvYmopXG4gICAgICAgIHJldHVybiBoYXNoW3AyXSAhPT0gdW5kZWZpbmVkID8gaGFzaFtwMl0gOiBkYXRhUmVkdWNlZFZhbFxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKERvbUVsZW1lbnRUZW1wbGF0ZS5zd2FwUGFyYW1zRm9yVGFnc1JFKCksIGxvb3BPYmopXG4gICAgfVxuXG4gICAgY29uc3QgbWFwU3RyaW5nRGF0YSA9IChkLCBpKSA9PiB0eXBlb2YgKGQpID09PSAnc3RyaW5nJyA/IGFycmF5U3RyaW5nVG9PYmpBZGFwdGVyKGQsIHN1YlN0ciwgaSkgOiBwYXJzZU9iamVjdChkLCBzdWJTdHIsIGkpXG5cbiAgICBpZiAoaXNOaWwoZWxEYXRhKSA9PT0gdHJ1ZSB8fCBpc0VtcHR5KGVsRGF0YSkpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIGlmIChlbERhdGEubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVsRGF0YSA9IFtlbERhdGFdXG4gICAgfVxuXG4gICAgLy8gY29udmVydCB0byBhcnJheSBpZiBpcyBzdHJpbmdcbiAgICBlbERhdGEgPSBBcnJheS5pc0FycmF5KGVsRGF0YSkgPyBlbERhdGEgOiBbZWxEYXRhXVxuXG4gICAgcmV0dXJuIGVsRGF0YS5tYXAobWFwU3RyaW5nRGF0YSkuam9pbignJylcbiAgfVxufVxuIiwiaW1wb3J0IHsgYmFzZUNvcmVNaXhpbnMgfSBmcm9tICcuLi91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucy5qcydcbmltcG9ydCB7IERvbUVsZW1lbnRUZW1wbGF0ZSB9IGZyb20gJy4vZG9tLWVsZW1lbnQtdGVtcGxhdGUuanMnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlLmpzJ1xuaW1wb3J0IHsgaXMsIGRlZmF1bHRUbywgcGljaywgbWFwT2JqSW5kZXhlZCwgZm9yRWFjaE9iakluZGV4ZWQsIHBpcGUgfSBmcm9tICdyYW1kYSdcblxuY2xhc3MgRG9tRWxlbWVudCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIERvbUVsZW1lbnRcbiAgICogQHR5cGUgdXRpbFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGlzIGlzIHRoZSBWaWV3U3RyZWFtIHJlbmRlcmluZyBlbmdpbmUuPC9wPlxuICAgKiA8cD5UaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBwcm9jZXNzIGZvciBjcmVhdGluZyBIVE1MRWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSB0aGUgbG9naWMgYW5kIG92ZXJoZWFkIG9mIGEgVmlld1N0cmVhbSBpbnN0YW5jZS48L3A+XG4gICAqIDxidXR0b24gY2xhc3M9J21vZGFsLWJ0biBidG4gYnRuLWJsdWUtcmVmJyBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS1udW09ODAwIGRhdGEtdmFsdWU9J2F0dHJpYnV0ZXMnPlZpZXcgQXR0cmlidXRlczwvYnV0dG9uPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgdGhlIHRhZ25hbWUgZm9yIHRoaXMgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIGFueSBkb21FbGVtZW50IGF0dHJpYnV0ZSAoZXhjZXB0IGZvciBjbGFzcyApXG4gICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gZGF0YSBzdHJpbmcgZm9yIHRleHQgdGFncyBhbmQganNvbiBmb3IgdGVtcGxhdGVzXG4gICAqIEBwYXJhbSB7dGVtcGxhdGV9IHRlbXBsYXRlXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcm9wcy50YWdOYW1lIC0gPSAnZGl2JzsgRGVmYXVsdCBmb3IgdGFnTmFtZS5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzLmF0dHJpYnV0ZXMgLSA9IHt9OyBUaGlzIGNhbiBiZSBhbnkgdmFsaWQgSFRNTCBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiB0YWdOYW1lLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xPYmplY3R9IHByb3BzLmRhdGEgPSB1bmRlZmluZWQ7IFRoaXMgaXMgZWl0aGVyIGEgU3RyaW5nIGZvciBhbiBlbGVtZW50IG9yIEpTT04gZGF0YSBvYmplY3QgZm9yIGEgdGVtcGxhdGUuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEhUTUx9IHByb3BzLnRlbXBsYXRlID0gdW5kZWZpbmVkOyBJZiBhIHRlbXBsYXRlIGlzIGRlZmluZWQsIHRoZSBEb21FbGVtZW50IHdpbGwgdXNlIGl0LlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9LCB0ZXN0TW9kZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgY2hlY2tEZWZhdWx0ID0gKGRmbHQsIHZhbCkgPT4gZGVmYXVsdFRvKGRmbHQpKHZhbClcblxuICAgIHByb3BzLnRhZ05hbWUgPSBjaGVja0RlZmF1bHQoJ2RpdicsIHByb3BzLnRhZ05hbWUpXG5cbiAgICBwcm9wcy5hdHRyaWJ1dGVzID0gcHJvcHMuYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkID8gcHJvcHMuYXR0cmlidXRlcyA6IHRoaXMuZ2V0RG9tQXR0cmlidXRlcyhwcm9wcylcbiAgICBwcm9wcy5hdHRycyA9IHRoaXMudXBkYXRlQXR0cnMocHJvcHMuYXR0cmlidXRlcylcblxuICAgIHByb3BzLmZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgdGhpcy50ZXN0TW9kZSA9IHRlc3RNb2RlXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG5cbiAgICB0aGlzLmFkZE1peGlucygpXG4gIH1cblxuICBzZXRQcm9wKGtleSwgdmFsKSB7XG4gICAgdGhpcy5wcm9wc1trZXldID0gdmFsXG4gIH1cblxuICBnZXRQcm9wKHZhbCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzW3ZhbF1cbiAgfVxuXG4gIGdldCBlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5lbFxuICB9XG5cbiAgc2V0RWxBdHRycyhlbCwgcGFyYW1zKSB7XG4gICAgY29uc3QgYWRkQXR0cmlidXRlcyA9ICh2YWwsIGtleSkgPT4ge1xuICAgICAgY29uc3QgYWRkVG9EYXRhc2V0ID0gKHZhbCwga2V5KSA9PiB7IGVsLmRhdGFzZXRba2V5XSA9IHZhbCB9XG4gICAgICBpZiAoa2V5ID09PSAnZGF0YXNldCcpIHtcbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoYWRkVG9EYXRhc2V0LCB2YWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWwpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZ2V0UHJvcCgnYXR0cnMnKS5mb3JFYWNoKGFkZEF0dHJpYnV0ZXMpXG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICB1cGRhdGVBdHRycyhwYXJhbXMsIG0pIHtcbiAgICBjb25zdCB0aGVNYXAgPSBtICE9PSB1bmRlZmluZWQgPyBtIDogbmV3IE1hcCgpXG4gICAgY29uc3QgYWRkQXR0cmlidXRlcyA9ICh2YWwsIGtleSkgPT4gdGhlTWFwLnNldChrZXksIHZhbClcbiAgICBtYXBPYmpJbmRleGVkKGFkZEF0dHJpYnV0ZXMsIHBhcmFtcylcbiAgICByZXR1cm4gdGhlTWFwXG4gIH1cblxuICBhZGRUZW1wbGF0ZShlbCkge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5nZXRQcm9wKCd0ZW1wbGF0ZScpXG5cbiAgICBjb25zdCBhZGRUbXBsID0gKHRlbXBsYXRlKSA9PiB7XG4gICAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0UHJvcCgnZGF0YScpXG4gICAgICBkYXRhID0gaXMoT2JqZWN0LCBkYXRhKSA/IGRhdGEgOiB7fVxuICAgICAgY29uc3QgZnJhZyA9IG5ldyBEb21FbGVtZW50VGVtcGxhdGUodGVtcGxhdGUsIGRhdGEsIHsgdGVzdE1vZGU6IHRoaXM/LnRlc3RNb2RlIH0pLnJlbmRlckRvY0ZyYWcoKVxuICAgICAgY29uc3QgZnJhZ0lzU3RyaW5nID0gaXMoU3RyaW5nLCBmcmFnKVxuICAgICAgZnJhZ0lzU3RyaW5nID8gZWwuaW5uZXJIVE1MID0gZnJhZyA6IGVsLmFwcGVuZENoaWxkKGZyYWcpXG4gICAgICByZXR1cm4gZWxcbiAgICB9XG4gICAgY29uc3QgZG9Ob3RoaW5nID0gKGVsKSA9PiBlbFxuICAgIHJldHVybiB0ZW1wbGF0ZSAhPT0gdW5kZWZpbmVkID8gYWRkVG1wbCh0ZW1wbGF0ZSkgOiBkb05vdGhpbmcoZWwpXG4gIH1cblxuICBjcmVhdGVFbGVtZW50KHRhZ05hbWUgPSAnZGl2Jykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpXG4gIH1cblxuICBhZGRDb250ZW50KGVsKSB7XG4gICAgY29uc3QgdGV4dCA9ICh0aGlzLmdldFByb3AoJ2RhdGEnKSlcbiAgICBjb25zdCBpc1RleHQgPSBpcyhTdHJpbmcsIHRleHQpXG4gICAgaWYgKGlzVGV4dCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgdHh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dClcbiAgICAgIGVsLmFwcGVuZENoaWxkKHR4dClcbiAgICB9XG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICBleGVjdXRlKCkge1xuICAgIGNvbnN0IGVsID0gcGlwZShcbiAgICAgIHRoaXMuY3JlYXRlRWxlbWVudC5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5zZXRFbEF0dHJzLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmFkZFRlbXBsYXRlLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmFkZENvbnRlbnQuYmluZCh0aGlzKVxuICAgICkodGhpcy5nZXRQcm9wKCd0YWdOYW1lJykpXG4gICAgLy8gdGhpcy5nZXRQcm9wKCdmcmFnbWVudCcpLmFwcGVuZENoaWxkKGVsKTtcbiAgICB0aGlzLnByb3BzLmVsID0gZWxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJlbmRlciB0aGUgSFRNTCBFbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gSFRNTEVsZW1lbnRcbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHRoaXMucHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmRhdGEgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmF0dHJpYnV0ZXMgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKCdlbCcpXG4gIH1cblxuICByZW5kZXJUb0hUTUxTdHJpbmcoKSB7XG4gICAgdGhpcy5leGVjdXRlKClcbiAgICB0aGlzLnByb3BzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5kYXRhID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5hdHRyaWJ1dGVzID0gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcCgnZWwnKS5vdXRlckhUTUxcbiAgfVxuXG4gIHJldHVybklmRGVmaW5lZChvYmosIHZhbCkge1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNPYmogPSB0eXBlb2YgKHZhbCkgPT09ICd1bmRlZmluZWQnXG4gICAgICBpc09iaiA9PT0gZmFsc2UgPyBvYmpbdmFsXSA9IHZhbCA6IG9ialt2YWxdID0gZGVlcE1lcmdlKG9ialt2YWxdLCB2YWwpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlcHJvcHModmFsKSB7XG4gICAgdGhpcy5yZXR1cm5JZkRlZmluZWQodGhpcy5wcm9wcywgdmFsKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB1cGRhdGVwcm9wc0FuZFJ1bih2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZXByb3BzKHZhbClcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHJldHVybiB0aGlzLmdldFByb3AoJ2ZyYWdtZW50JylcbiAgfVxuXG4gIHVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5nZXRQcm9wKCdlbCcpLnJlbW92ZSgpXG4gICAgICB0aGlzLnByb3BzID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmdjKClcbiAgICB9XG4gIH1cblxuICB1cGRhdGVUYWcodGFnTmFtZSA9ICdkaXYnKSB7IHRoaXMudXBkYXRlcHJvcHModGFnTmFtZSkgfVxuICB1cGRhdGVBdHRyaWJ1dGVzKGF0dHJzID0ge30pIHsgdGhpcy51cGRhdGVwcm9wcyhhdHRycykgfVxuICB1cGRhdGVUZW1wbGF0ZSh0ZW1wbGF0ZSkgeyB0aGlzLnVwZGF0ZXByb3BzKHRlbXBsYXRlKSB9XG4gIHVwZGF0ZURhdGEoZGF0YSA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHMoZGF0YSkgfVxuICBhZGRUYWdBbmRSZW5kZXIodGFnTmFtZSA9ICdkaXYnKSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4odGFnTmFtZSkgfVxuICBhZGRBdHRyc2lidXRlc0FuZFJlbmRlcihhdHRycyA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4oYXR0cnMpIH1cbiAgYWRkVGVtcGxhdGVBbmRSZW5kZXIodGVtcGxhdGUpIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bih0ZW1wbGF0ZSkgfVxuICBhZGREYXRhQW5kUmVuZGVyKGRhdGEgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKGRhdGEpIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQkFTRSBDT1JFIE1JWElOU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgY29uc3QgY29yZU1peGlucyA9IGJhc2VDb3JlTWl4aW5zKClcbiAgICB0aGlzLmdjID0gY29yZU1peGlucy5nYy5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXREb21BdHRyaWJ1dGVzKHByb3BzKSB7XG4gICAgcmV0dXJuIHBpY2sodGhpcy5hdHRyaWJ1dGVzQXJyYXksIHByb3BzKVxuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZXNBcnJheSgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2FjY2VwdCcsXG4gICAgICAnYWNjZXB0LWNoYXJzZXQnLFxuICAgICAgJ2FjY2Vzc2tleScsXG4gICAgICAnYWN0aW9uJyxcbiAgICAgICdhbGlnbicsXG4gICAgICAnYWxsb3cnLFxuICAgICAgJ2FsdCcsXG4gICAgICAnYXN5bmMnLFxuICAgICAgJ2F1dG9jYXBpdGFsaXplJyxcbiAgICAgICdhdXRvY29tcGxldGUnLFxuICAgICAgJ2F1dG9mb2N1cycsXG4gICAgICAnYXV0b3BsYXknLFxuICAgICAgJ2JnY29sb3InLFxuICAgICAgJ2JvcmRlcicsXG4gICAgICAnYnVmZmVyZWQnLFxuICAgICAgJ2NoYWxsZW5nZScsXG4gICAgICAnY2hhcnNldCcsXG4gICAgICAnY2hlY2tlZCcsXG4gICAgICAnY2l0ZScsXG4gICAgICAnY2xhc3MnLFxuICAgICAgJ2NvZGUnLFxuICAgICAgJ2NvZGViYXNlJyxcbiAgICAgICdjb2xvcicsXG4gICAgICAnY29scycsXG4gICAgICAnY29sc3BhbicsXG4gICAgICAnY29udGVudCcsXG4gICAgICAnY29udGVudGVkaXRhYmxlJyxcbiAgICAgICdjb250ZXh0bWVudScsXG4gICAgICAnY29udHJvbHMnLFxuICAgICAgJ2Nvb3JkcycsXG4gICAgICAnY3Jvc3NvcmlnaW4nLFxuICAgICAgJ2NzcCcsXG4gICAgICAnZGF0YXNldCcsXG4gICAgICAnZGF0ZXRpbWUnLFxuICAgICAgJ2RlY29kaW5nJyxcbiAgICAgICdkZWZhdWx0JyxcbiAgICAgICdkZWZlcicsXG4gICAgICAnZGlyJyxcbiAgICAgICdkaXJuYW1lJyxcbiAgICAgICdkaXNhYmxlZCcsXG4gICAgICAnZG93bmxvYWQnLFxuICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAnZHJvcHpvbmUnLFxuICAgICAgJ2VuY3R5cGUnLFxuICAgICAgJ2ZvcicsXG4gICAgICAnZm9ybScsXG4gICAgICAnZm9ybWFjdGlvbicsXG4gICAgICAnaGVhZGVycycsXG4gICAgICAnaGVpZ2h0JyxcbiAgICAgICdoaWRkZW4nLFxuICAgICAgJ2hpZ2gnLFxuICAgICAgJ2hyZWYnLFxuICAgICAgJ2hyZWZsYW5nJyxcbiAgICAgICdodHRwLWVxdWl2JyxcbiAgICAgICdpY29uJyxcbiAgICAgICdpZCcsXG4gICAgICAnaW1wb3J0YW5jZScsXG4gICAgICAnaW50ZWdyaXR5JyxcbiAgICAgICdpc21hcCcsXG4gICAgICAnaXRlbXByb3AnLFxuICAgICAgJ2tleXR5cGUnLFxuICAgICAgJ2tpbmQnLFxuICAgICAgJ2xhYmVsJyxcbiAgICAgICdsYW5nJyxcbiAgICAgICdsYW5ndWFnZScsXG4gICAgICAnbGF6eWxvYWQnLFxuICAgICAgJ2xpc3QnLFxuICAgICAgJ2xvb3AnLFxuICAgICAgJ2xvdycsXG4gICAgICAnbWFuaWZlc3QnLFxuICAgICAgJ21heCcsXG4gICAgICAnbWF4bGVuZ3RoJyxcbiAgICAgICdtaW5sZW5ndGgnLFxuICAgICAgJ21lZGlhJyxcbiAgICAgICdtZXRob2QnLFxuICAgICAgJ21pbicsXG4gICAgICAnbXVsdGlwbGUnLFxuICAgICAgJ211dGVkJyxcbiAgICAgICduYW1lJyxcbiAgICAgICdub3ZhbGlkYXRlJyxcbiAgICAgICdvcGVuJyxcbiAgICAgICdvcHRpbXVtJyxcbiAgICAgICdwYXR0ZXJuJyxcbiAgICAgICdwaW5nJyxcbiAgICAgICdwbGFjZWhvbGRlcicsXG4gICAgICAncG9zdGVyJyxcbiAgICAgICdwcmVsb2FkJyxcbiAgICAgICdyYWRpb2dyb3VwJyxcbiAgICAgICdyZWFkb25seScsXG4gICAgICAncmVmZXJyZXJwb2xpY3knLFxuICAgICAgJ3JlbCcsXG4gICAgICAncmVxdWlyZWQnLFxuICAgICAgJ3JldmVyc2VkJyxcbiAgICAgICdyb3dzJyxcbiAgICAgICdyb3dzcGFuJyxcbiAgICAgICdzYW5kYm94JyxcbiAgICAgICdzY29wZScsXG4gICAgICAnc2NvcGVkJyxcbiAgICAgICdzZWxlY3RlZCcsXG4gICAgICAnc2hhcGUnLFxuICAgICAgJ3NpemUnLFxuICAgICAgJ3NpemVzJyxcbiAgICAgICdzbG90JyxcbiAgICAgICdzcGFuJyxcbiAgICAgICdzcGVsbGNoZWNrJyxcbiAgICAgICdzcmMnLFxuICAgICAgJ3NyY2RvYycsXG4gICAgICAnc3JjbGFuZycsXG4gICAgICAnc3Jjc2V0JyxcbiAgICAgICdzdGFydCcsXG4gICAgICAnc3RlcCcsXG4gICAgICAnc3R5bGUnLFxuICAgICAgJ3N1bW1hcnknLFxuICAgICAgJ3RhYmluZGV4JyxcbiAgICAgICd0YXJnZXQnLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgICd0cmFuc2xhdGUnLFxuICAgICAgJ3R5cGUnLFxuICAgICAgJ3VzZW1hcCcsXG4gICAgICAndmFsdWUnLFxuICAgICAgJ3dpZHRoJyxcbiAgICAgICd3cmFwJ1xuICAgIF1cbiAgfVxufVxuY29uc3QgRG9tRWwgPSBEb21FbGVtZW50XG5leHBvcnQgeyBEb21FbGVtZW50LCBEb21FbCB9XG4iLCJpbXBvcnQgeyBiYXNlU3RyZWFtc01peGlucyB9IGZyb20gJy4uL3V0aWxzL21peGlucy9iYXNlLXN0cmVhbXMtbWl4aW5zLmpzJ1xuaW1wb3J0IHsgY29udmVydERvbVN0cmluZ01hcFRvT2JqIH0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjbG9uZSwgb21pdCB9IGZyb20gJ3JhbWRhJ1xuY29uc3QgaXNEZXZNb2RlID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtQnJvYWRjYXN0ZXIge1xuICAvKipcbiAgICogVGhlIGNsYXNzIHRha2VzIGluIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGUgJ2Jyb2FkY2FzdEV2ZW50cycgbWV0aG9kIGFuZCBkaXJlY3RzIHRoZSBldmVudHMgdG8gZWl0aGVyIHRoZSBVSSBvciBST1VURSBjaGFubmVsc1xuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1Ccm9hZGNhc3RlclxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGJyb2FkY2FzdEZuXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzLCBicm9hZGNhc3RGbikge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgICB0aGlzLmJyb2FkY2FzdEZuID0gYnJvYWRjYXN0Rm5cbiAgICB0aGlzLmJyb2FkY2FzdGVyKHRoaXMuYnJvYWRjYXN0Rm4pXG4gIH1cblxuICBhZGREYmxDbGlja0V2dChxKSB7XG4gICAgY29uc3QgZGJsY2xpY2skID0gZnJvbUV2ZW50KHEsICdkYmxjbGljaycpXG4gICAgLy8gY29uc29sZS5sb2coJ0FERElORyBEQkwgQ0xJQ0sgJywgcSk7XG4gICAgY29uc3Qgc3RyZWFtJCA9IGRibGNsaWNrJC5waXBlKFxuICAgICAgbWFwKHAgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gY2xvbmUocClcbiAgICAgICAgLy8gQUREIERPVUJMRUNMSUNLIFRPIFVJIEVWRU5UU1xuICAgICAgICBkYXRhLnR5cGVPdmVyUmlkZSA9ICdkYmxjbGljaydcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgIH0pKVxuICAgIHJldHVybiBzdHJlYW0kXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJST0FEQ0FTVCBCVVRUT04gRVZFTlRTXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYnJvYWRjYXN0KGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPD0gMCAmJiBpc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG5lc3RlZCBhcnJheSBpbiAke3RoaXMucHJvcHMubmFtZX0uYnJvYWRjYXN0RXZlbnRzIGFwcGVhcnMgdG8gYmUgZW1wdHkgLS0+IHZzaWQ6JHt0aGlzLnByb3BzLnZzaWR9IWApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gcGF5bG9hZHMgdG8gc2VuZCwgYmFzZWQgb24gZWl0aGVyIHRoZSBhcnJheSBvciB0aGUgZWxlbWVudHMgZGF0YU1hcFxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkcyA9IHtcbiAgICAgIFVJOiB0aGlzLnNlbmRVSVBheWxvYWQsXG4gICAgICBST1VURTogdGhpcy5zZW5kUm91dGVQYXlsb2FkXG4gICAgfVxuICAgIC8vIHNwcmVhZCBvcGVyYXRvciB0byBzZWxlY3QgdmFyaWFibGVzIGZyb20gYXJyYXlzXG4gICAgY29uc3QgW3NlbGVjdG9yLCBldmVudCwgbG9jYWxdID0gYXJnc1xuICAgIC8vIGJ0biBxdWVyeVxuICAgIGxldCBjaGFubmVsIC8vIGhvaXN0IGNoYW5uZWwgYW5kIGxhdGVyIGNoZWNrIGlmIGNobmwgZXhpc3RzXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5wcm9wcy5lbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuXG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA8PSAwKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMucHJvcHMuZWxcbiAgICAgIGNvbnN0IGNoZWNrUGFyZW50RWxzID0gKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT09IGVsKSB7XG4gICAgICAgICAgcXVlcnkgPSBbZWxlbWVudF1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwbHVja0VsRnJvbVBhcmVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZWxQYXJlbnQgPSBlbC5wYXJlbnRFbGVtZW50ICE9PSBudWxsID8gZWwucGFyZW50RWxlbWVudCA6IGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGVsU2VsZWN0ZWQgPSBlbFBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgICAgICBlbFNlbGVjdGVkLmZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaFxuICAgICAgICBlbFNlbGVjdGVkLmZvckVhY2goY2hlY2tQYXJlbnRFbHMpXG4gICAgICB9XG5cbiAgICAgIHBsdWNrRWxGcm9tUGFyZW50KClcbiAgICB9XG5cbiAgICBjb25zdCBpc0xvY2FsRXZlbnQgPSBsb2NhbCAhPT0gdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkT2JzZXJ2YWJsZSA9IChxKSA9PiB7XG4gICAgICAvLyB0aGUgIGJ0biBvYnNlcnZhYmxlXG4gICAgICBjb25zdCBvYnNlcnZhYmxlID0gZXZlbnQgIT09ICdkYmxDbGljaydcbiAgICAgICAgPyBmcm9tRXZlbnQocSwgZXZlbnQsIHsgcHJldmVudERlZmF1bHQ6ICgpID0+IHRydWUgfSlcbiAgICAgICAgOiB0aGlzLmFkZERibENsaWNrRXZ0KHEpXG4gICAgICAvLyBzZWxlY3QgY2hhbm5lbCBhbmQgZGF0YSB2YWx1ZXMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IG9yIHRoZSBlbGVtZW50J3MgZG9tIE1hcFxuICAgICAgY2hhbm5lbCA9IHEuZGF0YXNldC5jaGFubmVsLy8gaWZOaWxUaGVuVXBkYXRlKGNobmwsIHEuZGF0YXNldC5jaGFubmVsKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB7fS8vIGNvbnZlcnREb21TdHJpbmdNYXBUb09iaihxLmRhdGFzZXQpO1xuICAgICAgZGF0YS5wYXlsb2FkID0gY29udmVydERvbVN0cmluZ01hcFRvT2JqKHEuZGF0YXNldClcbiAgICAgIGRhdGEucGF5bG9hZCA9IG9taXQoWydjaGFubmVsJ10sIGRhdGEucGF5bG9hZClcbiAgICAgIGRhdGEuY2hhbm5lbCA9IGNoYW5uZWxcbiAgICAgIC8vIHBheWxvYWQgbmVlZHMgdnNpZCMgdG8gcGFzcyB2ZXJpZmljYXRpb25cblxuICAgICAgZGF0YS5zcmNFbGVtZW50ID0ge30vLyBwaWNrKFsndnNpZCcsJ3ZpZXdOYW1lJ10sIGRhdGEpO1xuICAgICAgZGF0YS5zcmNFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZFxuICAgICAgZGF0YS5zcmNFbGVtZW50LnZzaWQgPSB0aGlzLnByb3BzLnZzaWRcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5pc0xvY2FsRXZlbnQgPSBpc0xvY2FsRXZlbnRcbiAgICAgIC8vIGRhdGEuc3JjRWxlbWVudFsndmlld05hbWUnXSA9IHRoaXMucHJvcHMubmFtZTtcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5zcmNFdmVudCA9IGV2ZW50XG4gICAgICBkYXRhLnNyY0VsZW1lbnQuZWwgPSBxXG4gICAgICAvLyBzZWxlY3QgdGhlIGNvcnJlY3QgcGF5bG9hZFxuXG4gICAgICBmdW5jdGlvbiBnZXRWYWxpZENoYW5uZWwoY2gpIHtcbiAgICAgICAgaWYgKGNoID09PSAnUk9VVEUnIHx8IGNoID09PSAnQ0hBTk5FTF9ST1VURScpIHtcbiAgICAgICAgICByZXR1cm4gJ1JPVVRFJ1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCAhPT0gJ1VJJyAmJiBjaCAhPT0gJ0NIQU5ORUxfVUknICYmIGNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lSlMgd2FybmluZzogVGhlIGNoYW5uZWwsICR7Y2h9LCBpcyBub3QgYWxsb3dlZCBoZXJlLCBvbmx5IFwiVUlcIiBvciBcIlJPVVRFXCIgYXJlIHZhbGlkIGNoYW5uZWxzLCBkZWZhdWx0aW5nIHRvIENIQU5ORUxfVUlgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnVUknXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkID0gY2hhbm5lbFBheWxvYWRzW2dldFZhbGlkQ2hhbm5lbChjaGFubmVsKV1cbiAgICAgIC8vIHJ1biBwYXlsb2FkXG4gICAgICBjaGFubmVsUGF5bG9hZChvYnNlcnZhYmxlLCBkYXRhKVxuICAgIH1cbiAgICBjb25zdCBxdWVyeUlzTmlsID0gcXVlcnkgPT09IHVuZGVmaW5lZCB8fCBxdWVyeS5sZW5ndGggPD0gMFxuICAgIGlmIChxdWVyeUlzTmlsID09PSB0cnVlICYmIGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgaXRlbSAke3NlbGVjdG9yfSwgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IGluICR7dGhpcy5wcm9wcy5uYW1lfSAtLT4gdnNpZDoke3RoaXMucHJvcHMudnNpZH0hYClcblxuICAgICAgLy8gYWRkT2JzZXJ2YWJsZShxdWVyeSwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeS5mb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2hcbiAgICAgIHF1ZXJ5LmZvckVhY2goYWRkT2JzZXJ2YWJsZSlcbiAgICB9XG4gIH1cblxuICBicm9hZGNhc3RlcihhcnJGbikge1xuICAgIGNvbnN0IGJyb2FkY2FzdEFyciA9IGFyckZuKClcbiAgICBicm9hZGNhc3RBcnIuZm9yRWFjaChhcmdzID0+IHRoaXMuYnJvYWRjYXN0KGFyZ3MpKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGFkZE1peGlucygpIHtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgU1RSRUFNIE1JWElOU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3Qgc3RyZWFtTWl4aW5zID0gYmFzZVN0cmVhbXNNaXhpbnMoKVxuICAgIHRoaXMuc2VuZFVJUGF5bG9hZCA9IHN0cmVhbU1peGlucy5zZW5kVUlQYXlsb2FkXG4gICAgdGhpcy5zZW5kUm91dGVQYXlsb2FkID0gc3RyZWFtTWl4aW5zLnNlbmRSb3V0ZVBheWxvYWRcbiAgfVxufVxuIiwiaW1wb3J0IHsgRG9tRWxlbWVudCB9IGZyb20gJy4vZG9tLWVsZW1lbnQuanMnXG5pbXBvcnQgeyBmYWRlaW4sIGZhZGVvdXQgfSBmcm9tICcuLi91dGlscy92aWV3c3RyZWFtLWFuaW1hdGlvbnMuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtT2JzZXJ2YWJsZSB9IGZyb20gJy4uL3V0aWxzL3ZpZXdzdHJlYW0tb2JzZXJ2YWJsZXMuanMnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlLmpzJ1xuaW1wb3J0IHsgU3ViamVjdCwgYmluZENhbGxiYWNrIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgaXNOaWwsIHBpY2ssIHByb3BzLCBkZWZhdWx0VG8gfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1FbGVtZW50IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbUVsZW1lbnRcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICogQGRlc2NcbiAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBjbGFzcyB0aGF0IGlzIHBhcnQgb2YgdGhlIFZpZXdTdHJlYW0gb2JzZXJ2YWJsZSBzeXN0ZW0uXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09ic2VydmFibGV9IHNpbmskXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2aWV3UHJvcHNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZzaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZzTmFtZVxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2luayQsIHZpZXdQcm9wcyA9IHt9LCB2c2lkID0gJycsIHZzTmFtZSA9ICd0aGVOYW1lJykge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLl9zdGF0ZSA9ICdJTklUJ1xuICAgIHRoaXMudnNpZCA9IHZzaWRcbiAgICB0aGlzLmVsID0gdmlld1Byb3BzLmVsXG4gICAgdGhpcy52c05hbWUgPSB2c05hbWVcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgZGVidWc6ZmFsc2UsXG4gICAgICBleHRlbmRlZEhhc2hNZXRob2RzOiB7fVxuICAgIH1cbiAgICB0aGlzLm9wdGlvbnMgPSBkZWVwTWVyZ2UodGhpcy5kZWZhdWx0cywgdmlld1Byb3BzKVxuICAgIGNvbnN0IGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kID0gKGFycikgPT4ge1xuICAgICAgY29uc3QgW2FjdGlvbiwgZnVuY1N0cl0gPSBhcnJcbiAgICAgIHRoaXMub3B0aW9ucy5leHRlbmRlZEhhc2hNZXRob2RzW2FjdGlvbl0gPSAocCkgPT4gdGhpc1tmdW5jU3RyXShwKVxuICAgIH1cbiAgICB0aGlzLmFkZEFjdGlvbkxpc3RlbmVycygpLmZvckVhY2goY3JlYXRlRXh0cmFTdGF0ZXNNZXRob2QpXG4gICAgdGhpcy5vcHRpb25zLmhhc2hNZXRob2RzID0gdGhpcy5zZXRIYXNoTWV0aG9kcyh0aGlzLm9wdGlvbnMuZXh0ZW5kZWRIYXNoTWV0aG9kcylcbiAgICB0aGlzLnNpbmskID0gc2luayRcbiAgICB0aGlzLnNpbmskXG4gICAgICAuc3Vic2NyaWJlKHRoaXMub25PYnNTaW5rU3Vic2NyaWJlLmJpbmQodGhpcykpXG5cbiAgICB0aGlzLiRkaXJzID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0KClcbiAgICB0aGlzLmFkZERlZmF1bHREaXIgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5hZGREZWZhdWx0RGlyXG4gICAgdGhpcy5zb3VyY2VTdHJlYW1zID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyhuZXcgU3ViamVjdCgpLCB0aGlzLnZzTmFtZSwgdGhpcy52c2lkKVxuICAgIHRoaXMuX3NvdXJjZSQgPSB0aGlzLnNvdXJjZVN0cmVhbXMudG9JbnRlcm5hbCQgLy8gIG5ldyBTdWJqZWN0KCk7XG4gIH1cblxuICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBzZXRIYXNoTWV0aG9kcyhleHRlbmRlZEhhc2hNZXRob2RzT2JqID0ge30pIHtcbiAgICBjb25zdCBkZWZhdWx0SGFzaE1ldGhvZHMgPSB7XG4gICAgICBWU19ERVRSSVRVU19DT0xMRUNUICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25HYXJiYWdlQ29sbGVjdChwKSxcbiAgICAgIFJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25SZWFkeUZvckdDKHApLFxuICAgICAgRVhUSVJQQVRFICAgICAgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vbkRpc3Bvc2UocCksXG4gICAgICBWU19TUEFXTiAgICAgICAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uUmVuZGVyKHApLFxuICAgICAgVlNfU1BBV05fQU5EX0FUVEFDSF9UT19QQVJFTlQgICAgOiAocCkgPT4gdGhpcy5vblJlbmRlckFuZEF0dGFjaFRvUGFyZW50KHApLFxuICAgICAgVlNfU1BBV05fQU5EX0FUVEFDSF9UT19ET00gICAgICAgOiAocCkgPT4gdGhpcy5vblJlbmRlckFuZEF0dGFjaFRvRG9tKHApLFxuICAgICAgQVRUQUNIX0NISUxEX1RPX1NFTEYgICAgICAgICAgIDogKHApID0+IHRoaXMub25BdHRhY2hDaGlsZFRvU2VsZihwKVxuICAgIH1cbiAgICByZXR1cm4gZGVlcE1lcmdlKGRlZmF1bHRIYXNoTWV0aG9kcywgZXh0ZW5kZWRIYXNoTWV0aG9kc09iailcbiAgfVxuXG4gIGNyZWF0ZURvbUl0ZW0oKSB7XG4gICAgdGhpcy5wcm9wcyA9IHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCA/IHRoaXMucHJvcHMgOiB7fVxuICAgIGNvbnN0IHJlbW92ZUlzTmlsID0gKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhdHRycyA9IGZpbHRlcihyZW1vdmVJc05pbCwgcGljayhbJ2lkJywgJ2NsYXNzTmFtZSddLCB0aGlzLnByb3BzKSlcbiAgICBjb25zdCB7IHRhZ05hbWUsIGRhdGEsIHRlbXBsYXRlIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIG5ldyBEb21FbGVtZW50KHRhZ05hbWUsIGF0dHJzLCBkYXRhLCB0ZW1wbGF0ZSlcbiAgfVxuXG4gIG9uRGlzcG9zZUNvbXBsZXRlZChkKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2J2IHNlbGYgZGlzcG9zZWQgYWZ0ZXIgYW5pbWF0ZU91dCAnLCBkLCB0aGlzKTtcbiAgfVxuXG4gIGFuaW1hdGVJblR3ZWVuKGVsLCB0aW1lKSB7XG4gICAgZmFkZWluKGVsLCB0aW1lKVxuICB9XG5cbiAgYW5pbWF0ZU91dFR3ZWVuKGVsLCB0aW1lLCBjYWxsYmFjaykge1xuICAgIC8vIGNvbnNvbGUubG9nKCdhbmltIG91dCAnLCB7ZWwsIHRpbWUsIGNhbGxiYWNrfSk7XG4gICAgZmFkZW91dChlbCwgdGltZSwgY2FsbGJhY2spXG4gIH1cblxuICBzZXRBbmltYXRlSW4oZCkge1xuICAgIGlmIChkLmFuaW1hdGVJbiA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgZWwgPSBkLmVsICE9PSB1bmRlZmluZWQgPyBkLmVsIDogdGhpcy5kb21JdGVtLmVsXG4gICAgICB0aGlzLmFuaW1hdGVJblR3ZWVuKGVsLCBkLmFuaW1hdGVJblRpbWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkXG4gICAqIEByZXR1cm5zIHBheWxvYWQgdGhhdCBjb25maXJtcyBkaXNwb3NlXG4gICAqL1xuXG4gIGRpc3Bvc2VNZXRob2QoZCkge1xuICAgIGNvbnN0IGVsID0gZC5lbC5lbCAhPT0gdW5kZWZpbmVkID8gZC5lbC5lbCA6IGQuZWwgLy8gRE9NIElURU1TIEhBVkUgVEhFSVIgRUwgSVRFTVMgTkVTVEVEXG5cbiAgICBjb25zdCBnY0RhdGEgPSB7IGFjdGlvbjonUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnLCAkZGlyOnRoaXMuJGRpcnMuUEksIGVsIH1cblxuICAgIGNvbnN0IGFuaW1hdGVPdXQgPSAoZCwgY2FsbGJhY2spID0+IHtcbiAgICAgIHRoaXMuYW5pbWF0ZU91dFR3ZWVuKGVsLCBkLmFuaW1hdGVPdXRUaW1lLCBjYWxsYmFjaylcbiAgICB9XG5cbiAgICBjb25zdCBmYWRlT3V0T2JzID0gYmluZENhbGxiYWNrKGFuaW1hdGVPdXQpXG4gICAgY29uc3Qgb25GYWRlb3V0Q29tcGxldGVkID0gKGUpID0+IHtcbiAgICAgIHRoaXMuX3NvdXJjZSQubmV4dChnY0RhdGEpXG4gICAgfVxuXG4gICAgY29uc3Qgb25GYWRlb3V0T2JzID0gKGQpID0+IHtcbiAgICAgIGZhZGVPdXRPYnMoZClcbiAgICAgICAgLnN1YnNjcmliZShvbkZhZGVvdXRDb21wbGV0ZWQpXG4gICAgICByZXR1cm4geyBhY3Rpb246J0VYVElSUEFUSU5HJywgJGRpcjp0aGlzLiRkaXJzLkNJIH1cbiAgICB9XG4gICAgY29uc3Qgb25FbXB0eU9icyA9ICgpID0+ICh7IGFjdGlvbjonRVhUSVJQQVRFX0FORF9SRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcsICRkaXI6dGhpcy4kZGlycy5DSSB9KVxuICAgIGNvbnN0IGZuID0gZC5hbmltYXRlT3V0ID09PSB0cnVlID8gb25GYWRlb3V0T2JzIDogb25FbXB0eU9ic1xuICAgIHJldHVybiBmbihkKVxuICB9XG5cbiAgb25EaXNwb3NlKGQpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwb3NlTWV0aG9kKGQpXG4gIH1cblxuICByZW1vdmVTdHJlYW0oKSB7XG4gICAgLy8gdGhpcy5zb3VyY2VTdHJlYW1zLmNvbXBsZXRlQWxsKCk7XG4gICAgaWYgKHRoaXMuc291cmNlU3RyZWFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMuY29tcGxldGVTdHJlYW0oWydpbnRlcm5hbCcsICdjaGlsZCddKVxuICAgIH1cbiAgfVxuXG4gIG9uUmVhZHlGb3JHQyhwKSB7XG4gICAgdGhpcy5yZW1vdmVTdHJlYW0oKVxuICB9XG5cbiAgb25HYXJiYWdlQ29sbGVjdChwKSB7XG4gICAgaWYgKHRoaXMuZG9tSXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRvbUl0ZW0udW5tb3VudCgpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc291cmNlU3RyZWFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMuY29tcGxldGVTdHJlYW0oWydwYXJlbnQnXSlcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpc1xuICB9XG5cbiAgZ2V0U291cmNlU3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2UkXG4gIH1cblxuICBjb21iaW5lRG9tSXRlbXMoZCkge1xuICAgIGlmICh0aGlzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9ICBpc05pbChkLnF1ZXJ5KSA/IGQubm9kZSA6IGQucXVlcnlcbiAgICBjb25zdCBwcmVwZW5kID0gKG5vZGUsIGl0ZW0pID0+IG5vZGUuaW5zZXJ0QmVmb3JlKGl0ZW0sIG5vZGUuZmlyc3RDaGlsZClcbiAgICBjb25zdCBhcHBlbmQgPSAobm9kZSwgaXRlbSkgPT4gbm9kZS5hcHBlbmRDaGlsZChpdGVtKVxuICAgIGNvbnN0IGFmdGVyID0gKG5vZGUsIGl0ZW0pID0+IG5vZGUuYWZ0ZXIoaXRlbSlcblxuICAgIGNvbnN0IGRlZmF1bHRGbiA9IHByZXBlbmRcbiAgICBjb25zdCBhdHRhY2hUeXBlSGFzaCA9IHtcbiAgICAgIGFwcGVuZENoaWxkIDogYXBwZW5kLFxuICAgICAgYWZ0ZXJcbiAgICB9XG4gICAgLy8gREVURVJNSU5FIFdIRVRIRVIgVE8gVVNFIEFQUEVORCBPUiBQUkVQRU5EXG4gICAgLy8gT04gQ09OTkVDVElORyBET00gSVRFTVMgVE8gRUFDSCBPVEhFUlxuICAgIC8vIGxldCBhdHRhY2hGdW5jID0gZC5hdHRhY2hUeXBlID09PSAnYXBwZW5kQ2hpbGQnID8gYXBwZW5kIDogcHJlcGVuZDtcbiAgICBjb25zdCBhdHRhY2hGdW5jID0gYXR0YWNoVHlwZUhhc2hbZC5hdHRhY2hUeXBlXSB8fCBkZWZhdWx0Rm5cbiAgICBhdHRhY2hGdW5jKGNvbnRhaW5lciwgdGhpcy5kb21JdGVtLnJlbmRlcigpKVxuICAgIHRoaXMuc2V0QW5pbWF0ZUluKGQpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHBcbiAgICogQHJldHVybnMgcGF5bG9hZCB0byBhcHBlbmQgY2hpbGQgZWxlbWVudCB0byBjdXJyZW50IGVsZW1lbnRcbiAgICovXG5cbiAgb25BdHRhY2hDaGlsZFRvU2VsZihwKSB7XG4gICAgY29uc3QgZGF0YSA9IHAuY2hpbGRSZW5kZXJEYXRhXG4gICAgdGhpcy5jb21iaW5lRG9tSXRlbXMoZGF0YSlcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnQ0hJTERfQVRUQUNIRUQnLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5QSVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZFxuICAgKiBAcmV0dXJucyBwYXlsb2FkIHRoYXQgYXR0YWNoZXMgY3VycmVudCBjaGlsZCBlbGVtZW50IHRvIHBhcmVudFxuICAgKi9cbiAgb25SZW5kZXJBbmRBdHRhY2hUb1BhcmVudChkKSB7XG4gICAgdGhpcy5vblJlbmRlcihkKVxuICAgIHRoaXMuY29tYmluZURvbUl0ZW1zKGQpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ1ZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX1BBUkVOVCcsXG4gICAgICBlbDogdGhpcy5lbCB8fCB0aGlzLmRvbUl0ZW0uZWwsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLlBJXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyRG9tSXRlbShkKSB7XG4gICAgY29uc3QgW3RhZ05hbWUsIGF0dHJpYnV0ZXMsIGRhdGEsIHRlbXBsYXRlXSA9IGRcbiAgICB0aGlzLmRvbUl0ZW0gPSBuZXcgRG9tRWxlbWVudCh7IHRhZ05hbWUsIGF0dHJpYnV0ZXMsIGRhdGEsIHRlbXBsYXRlIH0pXG4gICAgcmV0dXJuIHRoaXMuZG9tSXRlbVxuICB9XG5cbiAgb25SZW5kZXIoZCkge1xuICAgIGNvbnN0IGdldEVsID0gKGRhdGEpID0+IHRoaXMucmVuZGVyRG9tSXRlbShkYXRhKVxuICAgIGNvbnN0IGVsID0gdGhpcy5lbCB8fCBnZXRFbChwcm9wcyhbJ3RhZ05hbWUnLCAnZG9tQXR0cmlidXRlcycsICdkYXRhJywgJ3RlbXBsYXRlJ10sIGQpKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdWU19TUEFXTkVEJyxcbiAgICAgIGVsLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5JXG4gICAgfVxuICB9XG5cbiAgZXh0ZW5kZWRNZXRob2RzKGRhdGEpIHtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZFxuICAgKiBAcmV0dXJuc1xuICAgKiBQYXlsb2FkIGNvbnRhaW5pbmcgdGhlIGFjdGlvbiwgaW50ZXJuYWwgb2JzZXJ2YWJsZSBhbmQgZWxlbWVudC5cbiAgICovXG4gIG9uUmVuZGVyQW5kQXR0YWNoVG9Eb20oZCkge1xuICAgIGNvbnN0IGdldEVsID0gKGRhdGEpID0+IHRoaXMucmVuZGVyRG9tSXRlbShkYXRhKVxuICAgIGQuYXR0YWNoRGF0YS5lbCA9IGdldEVsKHByb3BzKFsndGFnTmFtZScsICdkb21BdHRyaWJ1dGVzJywgJ2RhdGEnLCAndGVtcGxhdGUnXSwgZCkpXG4gICAgdGhpcy5jb21iaW5lRG9tSXRlbXMoZC5hdHRhY2hEYXRhKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19ET00nLFxuICAgICAgZWw6ICAgdGhpcy5lbCB8fCBkLmF0dGFjaERhdGEuZWwuZWwsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLkNJXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoZSBWaWV3U3RyZWFtIGRpcmVjdHMgYWxsIHJlbGV2YW50IGFjdGlvbnMgdG8gdGhlIERvbUVsZW1lbnQgdG8gcmVuZGVyIGFuZCBkaXNwb3NlIG9mIGl0c2VsZlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKi9cbiAgb25PYnNTaW5rU3Vic2NyaWJlKHBheWxvYWQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBwYXlsb2FkLmFjdGlvblxuICAgIGNvbnN0IGRlZmF1bHRUb0ZuID0gZGVmYXVsdFRvKChkYXRhKSA9PiB0aGlzLmV4dGVuZGVkTWV0aG9kcyhkYXRhKSlcbiAgICBjb25zdCBmbiA9IGRlZmF1bHRUb0ZuKHRoaXMub3B0aW9ucy5oYXNoTWV0aG9kc1thY3Rpb25dKVxuICAgIGNvbnN0IGRhdGEgPSBmbihwYXlsb2FkKVxuICAgIGNvbnN0IHNlbmREYXRhID0gKGQpID0+IHRoaXMuX3NvdXJjZSQubmV4dChkKVxuICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlbmREYXRhKE9iamVjdC5mcmVlemUoZGF0YSkpXG4gICAgfVxuICB9XG5cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBDT1JFIE1JWElOU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IGNvcmVNaXhpbnMgPSBiYXNlQ29yZU1peGlucygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IHNhZmVDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3NhZmUtY2xvbmUuanMnXG5pbXBvcnQgeyBnYyB9IGZyb20gJy4uL3V0aWxzL2djLmpzJ1xuaW1wb3J0IHtcbiAgY29tcG9zZSxcbiAgY2xvbmUsXG4gIGZyb21QYWlycyxcbiAgdG9QYWlycyxcbiAgaXNcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtUGF5bG9hZCB7XG4gIC8qKlxuICAgKlxuICAgKiBPYnNlcnZhYmxlcyBzZW50IGZyb20gVmlld1N0cmVhbXMgdG8gQ2hhbm5lbHMgYXJlIHZhbGlkYXRlZCBieSB0aGlzIGNsYXNzXG4gICAqXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbVBheWxvYWRcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gb2JzZXJ2YWJsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVidWdcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIG9ic2VydmFibGUsIGRhdGEsIGFjdGlvbiA9ICdzdWJzY3JpYmUnLCBkZWJ1ZyA9IGZhbHNlKSB7XG4gICAgLy8gdGhpcy5hZGRNaXhpbnMoKTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgbmFtZSxcbiAgICAgIG9ic2VydmFibGUsXG4gICAgICBkYXRhLFxuICAgICAgYWN0aW9uXG4gICAgfVxuICAgIHRoaXMuc2VuZFRvRGlyZWN0b3JTdHJlYW0ob3B0aW9ucylcbiAgfVxuXG4gIHNlbmRUb0RpcmVjdG9yU3RyZWFtKHBheWxvYWQpIHtcbiAgICBjb25zdCBkaXJlY3RvclN0cmVhbSQgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXAuZ2V0U3RyZWFtKCdESVNQQVRDSEVSJylcbiAgICBjb25zdCBmcm96ZW5QYXlsb2FkID0gc2FmZUNsb25lKHBheWxvYWQpXG4gICAgLy8gY29uc29sZS5sb2coXCJWUyBQQVlMT0FEIFwiLGZyb3plblBheWxvYWQpO1xuICAgIGRpcmVjdG9yU3RyZWFtJC5uZXh0KGZyb3plblBheWxvYWQpXG4gICAgcGF5bG9hZCA9IHVuZGVmaW5lZFxuXG4gICAgZGVsZXRlIHRoaXNcbiAgfVxuXG4gIHN0YXRpYyBkZWVwQ2xvbmUobykge1xuICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXkpXG4gICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QpXG4gICAgY29uc3QgaXNJdGVyID0gb2IgPT4gaXNBcnIob2IpID09PSBmYWxzZSAmJiBpc09iaihvYikgPT09IHRydWVcbiAgICBjb25zdCBpc0l0ZXJhYmxlID0gaXNJdGVyKG8pXG4gICAgcmV0dXJuIGlzSXRlcmFibGUgPyBjb21wb3NlKGZyb21QYWlycywgdG9QYWlycywgY2xvbmUpKG8pIDogY2xvbmUobylcbiAgfVxuXG4gIHN0YXRpYyBnZXRNb3VzZUV2ZW50S2V5cygpIHtcbiAgICByZXR1cm4gWydhbHRLZXknLCAnYnViYmxlcycsICdjYW5jZWxCdWJibGUnLCAnY2FuY2VsYWJsZScsICdjbGllbnRYJywgJ2NsaWVudFknLCAnY29tcG9zZWQnLCAnY3RybEtleScsICdjdXJyZW50VGFyZ2V0JywgJ2RlZmF1bHRQcmV2ZW50ZWQnLCAnZGV0YWlsJywgJ2V2ZW50UGhhc2UnLCAnZnJvbUVsZW1lbnQnLCAnaXNUcnVzdGVkJywgJ2xheWVyWCcsICdsYXllclknLCAnbWV0YUtleScsICdtb3ZlbWVudFgnLCAnbW92ZW1lbnRZJywgJ29mZnNldFgnLCAnb2Zmc2V0WScsICdwYWdlWCcsICdwYWdlWScsICdwYXRoJywgJ3JlbGF0ZWRUYXJnZXQnLCAncmV0dXJuVmFsdWUnLCAnc2NyZWVuWCcsICdzY3JlZW5ZJywgJ3NoaWZ0S2V5JywgJ3NvdXJjZUNhcGFiaWxpdGllcycsICdzcmNFbGVtZW50JywgJ3RhcmdldCcsICd0aW1lU3RhbXAnLCAndG9FbGVtZW50JywgJ3R5cGUnLCAndmlldycsICd3aGljaCcsICd4JywgJ3knXVxuICB9XG5cbiAgYWRkTWl4aW5zKCkge1xuICAgIHRoaXMuZ2MgPSBnY1xuICB9XG59XG4iLCJpbXBvcnQgeyBoZWFkLCBjb21wb3NlLCByZWplY3QsIHNwbGl0LCBpc0VtcHR5LCBsdGUsIGRlZmF1bHRUbywgcHJvcCB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmZ1bmN0aW9uIGdlbmVyYXRlU3B5bmVTZWxlY3RvcklkKGVsKSB7XG4gIGNvbnN0IG51bSA9ICgpID0+IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnJlcGxhY2UoL1xcZC9nbSwgJycpLnN1YnN0cmluZygxLCA4KVxuICBsZXQgdnNpZCA9IGAke251bSgpfWBcbiAgaWYgKGVsLmRhdGFzZXQudnNpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZWwuZGF0YXNldC52c2lkID0gdnNpZFxuICB9IGVsc2Uge1xuICAgIHZzaWQgPSBlbC5kYXRhc2V0LnZzaWRcbiAgfVxuICByZXR1cm4gYFtkYXRhLXZzaWQ9JyR7dnNpZH0nXWBcbn1cblxuZnVuY3Rpb24gaXNEZXZNb2RlKCkge1xuICByZXR1cm4gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlXG59XG5cbmZ1bmN0aW9uIGlzTm9kZUVsZW1lbnQoZWwpIHtcbiAgY29uc3Qgbm9kZUNoZWNrID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG4gIHJldHVybiBub2RlQ2hlY2soZWwpXG59XG5cbmZ1bmN0aW9uIGdldEVsT3JMaXN0KGN4dCwgc2VsLCB2ZXJib3NlQm9vbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGxpc3QgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCB2ZXJib3NlQm9vbClcbiAgcmV0dXJuIGxpc3QubGVuZ3RoID09PSAxID8gaGVhZChsaXN0KSA6IGxpc3Rcbn1cblxuZnVuY3Rpb24gdGVzdFNlbGVjdG9ycyhjeHQsIHNlbCwgdmVyYm9zZUJvb2wpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGN4dClcblxuICBjb25zdCBlbElzRG9tRWxlbWVudCA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuXG4gIGlmIChlbCAhPT0gbnVsbCAmJiBlbElzRG9tRWxlbWVudChlbCkgPT09IGZhbHNlKSB7XG4gICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgZWwgb2JqZWN0IGlzIG5vdCBhIHZhbGlkIHNpbmdsZSBlbGVtZW50LCAke2VsfWApXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoc2VsICE9PSB1bmRlZmluZWQgJiYgU3RyaW5nKHNlbCkudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICBmdW5jdGlvbiBpc1ZhbGlkU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBpcyB2YWxpZCBhbmQgc2VsZWN0cyBhdCBsZWFzdCBvbmUgZWxlbWVudFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2UgLy8gQ2F0Y2hpbmcgYW4gZXhjZXB0aW9uIG1lYW5zIHRoZSBzZWxlY3RvciBpcyBpbnZhbGlkXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNWYWxpZFNlbGVjdG9yQm9vbCA9IGlzVmFsaWRTZWxlY3RvcihzZWwpXG4gICAgaWYgKHZlcmJvc2VCb29sID09PSB0cnVlICYmIGlzRGV2TW9kZSgpID09PSB0cnVlICYmIGlzVmFsaWRTZWxlY3RvckJvb2wgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBzZWxlY3RvciwgJHtzZWx9IGRvZXMgbm90IGV4aXN0IGluIHRoaXMgZWwsICR7Y3h0fWApXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIHZlcmJvc2VCb29sID0gZmFsc2UpIHtcbiAgY29uc3Qgc2VsZWN0b3IgPSBzZWwgIT09IHVuZGVmaW5lZCA/IGAke2N4dH0gJHtzZWx9YCA6IGN4dFxuICBsZXQgaXNQYXJlbnQgPSBmYWxzZVxuXG4gIGNvbnN0IHJldHVyblNlbGVjdG9ySWZWYWxpZCA9IChzZWxlY3RvcikgPT4ge1xuICAgIGxldCBhcnIgPSBbXVxuICAgIHRyeSB7XG4gICAgICBhcnIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gY2F0Y2ggKGUpIHsgYXJyID0gW10gfVxuICAgIHRyeSB7XG4gICAgICBpc1BhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsKSA9PT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihjeHQpXG4gICAgICBpZiAoaXNQYXJlbnQgPT09IHRydWUpIHtcbiAgICAgICAgYXJyID0gW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsKV1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBhcnIvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgfVxuXG4gIGNvbnN0IGVsQXJyID0gIHJldHVyblNlbGVjdG9ySWZWYWxpZChzZWxlY3RvcilcblxuICBpZiAodmVyYm9zZUJvb2wgPT09IHRydWUpIHtcbiAgICBjb25zdCBtYWluU2VsID0gaXNQYXJlbnQgPT09IHRydWUgPyAnYm9keScgOiBjeHRcbiAgICB0ZXN0U2VsZWN0b3JzKG1haW5TZWwsIHNlbCwgdmVyYm9zZUJvb2wpXG4gIH1cblxuICByZXR1cm4gZWxBcnJcbn1cblxuZnVuY3Rpb24gc2V0SW5saW5lQ3NzKHZhbCwgY3h0LCBzZWwpIHtcbiAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgY29uc3QgYWRkSW5saW5lQ3NzID0gaXRlbSA9PiB7XG4gICAgaXRlbS5zdHlsZS5jc3NUZXh0ID0gdmFsXG4gIH1cbiAgYXJyLmZvckVhY2goYWRkSW5saW5lQ3NzKVxuICByZXR1cm4gdGhpc1xufVxuXG4vKipcbiAqXG4gKiBAbW9kdWxlIFZpZXdTdHJlYW1TZWxlY3RvclxuICogQHR5cGUgdXRpbFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEVsfSBjeHQgVGhlIG1haW4gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd8RWx9IFRoZSBzZWxlY3RvciBhcyBhIFN0cmluZ1xuICogQHJldHVybnMge2Z1bmN0aW9uKCo9KX1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIFZpZXdTdHJlYW1TZWxlY3RvcihjeHQsIHNlbCkge1xuICBjeHQgPSB0eXBlb2YgKGN4dCkgPT09ICdzdHJpbmcnID8gY3h0IDogZ2VuZXJhdGVTcHluZVNlbGVjdG9ySWQoY3h0KVxuICB0ZXN0U2VsZWN0b3JzKGN4dCwgc2VsLCBmYWxzZSlcblxuICBmdW5jdGlvbiBzZWxlY3RvcihzZWwpIHtcbiAgICByZXR1cm4gVmlld1N0cmVhbVNlbGVjdG9yKGN4dCwgc2VsKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBtYXAgdGhyb3VnaCBhIE5vZGVMaXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlbGVtZW50c1xuICAgKi9cbiAgc2VsZWN0b3IubWFwID0gKGZuKSA9PiBBcnJheS5mcm9tKGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpKS5tYXAoZm4pXG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBpdGVyYXRlIHRocm91Z2ggYSBOb2RlTGlzdFxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlbGVtZW50c1xuICAgKi9cbiAgc2VsZWN0b3IuZm9yRWFjaCA9IChmbikgPT4gQXJyYXkuZnJvbShnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSkubWFwKGZuKVxuXG4gIHNlbGVjdG9yLmdldE5vZGVMaXN0QXJyYXkgPSAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuXG4gIC8qKlxuICAgKlxuICAgKiBBZGRzIHRoZSBjbGFzcyB0byB0aGUgRWxlbWVudCBvciB0byB0aGUgTm9kZUxpc3QuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjIC0gPSB1bmRlZmluZWQ7IFRoZSBjbGFzcyB0byBiZSBhZGRlZC5cbiAgICpcbiAgICoqL1xuICBzZWxlY3Rvci5hZGRDbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCBhZGRDbGFzcyA9IGl0ZW0gPT4gaXRlbS5jbGFzc0xpc3QuYWRkKGMpXG4gICAgYXJyLmZvckVhY2goYWRkQ2xhc3MpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAZGVzYyBSZW1vdmVzIHRoZSBjbGFzcyB0byB0aGUgRWxlbWVudCBvciB0byB0aGUgTm9kZUxpc3QuXG4gICAqL1xuICBzZWxlY3Rvci5yZW1vdmVDbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCByZW1vdmVDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpXG4gICAgfVxuICAgIGFyci5mb3JFYWNoKHJlbW92ZUNsYXNzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQGRlc2MgU2V0cyB0aGUgY2xhc3MgdG8gZXF1YWwgZXhhY3RseSB0aGUgY2xhc3Mgc3RyaW5nLlxuICAgKi9cbiAgc2VsZWN0b3Iuc2V0Q2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgLyoqXG4gICAgKiBOT04gSUUgQ0xFQU5FUiBTT0xVVElPTlxuICAgICogY29uc3QgcmVtb3ZlQ2xhc3MgPSBpdGVtID0+IGl0ZW0uY2xhc3NMaXN0ID0gYztcbiAgICAqICBhcnIuZm9yRWFjaChyZW1vdmVDbGFzcyk7XG4gICAgKi9cblxuICAgIGNvbnN0IHNldFRoZUNsYXNzID0gaXRlbSA9PiB7XG4gICAgICBjb25zdCByZW1vdmVDbGFzc1N0ckFyciA9IGNvbXBvc2UocmVqZWN0KGlzRW1wdHkpLCBzcGxpdCgnICcpKShpdGVtLmNsYXNzTmFtZSlcbiAgICAgIGNvbnN0IGNsYXNzU3RyQXJyID0gYy5zcGxpdCgnICcpXG4gICAgICBjb25zdCByZW1vdmVyID0gcyA9PiBpdGVtLmNsYXNzTGlzdC5yZW1vdmUocylcbiAgICAgIGNvbnN0IGFkZGVyID0gc2VsID0+IGl0ZW0uY2xhc3NMaXN0LmFkZChzZWwpXG4gICAgICByZW1vdmVDbGFzc1N0ckFyci5mb3JFYWNoKHJlbW92ZXIpXG4gICAgICBjbGFzc1N0ckFyci5mb3JFYWNoKGFkZGVyKVxuICAgIH1cbiAgICBhcnIuZm9yRWFjaChzZXRUaGVDbGFzcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc2VsZWN0b3IudW5tb3VudCA9ICgpID0+IHtcbiAgICAvLyBjb25zb2xlLmxvZygndW5tb3VudGluZyBzZWxlY3RvciAnLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJvb2wgRGVmYXVsdCBpcyB1bmRlZmluZWQuXG4gICAqIEBkZXNjIFNldHMgdGhlIGNsYXNzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBib29sZWFuIG9yIHRoZSB0b2dnbGVzIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5wcm9wcy5lbCQudG9nZ2xlQ2xhc3MoJ215Y2xhc3MnLCB0cnVlKTtcbiAgICpcbiAgICovXG4gIHNlbGVjdG9yLnRvZ2dsZUNsYXNzID0gKGMsIGJvb2wpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IHRvZ2dsZUNsYXNzID0gaXRlbSA9PiB7XG4gICAgICBib29sID0gYm9vbCAhPT0gdW5kZWZpbmVkID8gYm9vbCA6ICFpdGVtLmNsYXNzTGlzdC5jb250YWlucyhjKVxuICAgICAgYm9vbCA/IGl0ZW0uY2xhc3NMaXN0LmFkZChjKSA6IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShjKVxuICAgIH1cbiAgICBhcnIuZm9yRWFjaCh0b2dnbGVDbGFzcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc2VsZWN0b3IudG9nZ2xlID0gKGMsIGJvb2wpID0+IHtcbiAgICBzZWxlY3Rvci50b2dnbGVDbGFzcyhjLCBib29sKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgaHRtbCB0byB0aGUgU2VsZWN0b3IncyBlbGVtZW50XG4gICAqIEBwYXJhbSBodG1sRWxlbWVudFxuICAgKi9cbiAgc2VsZWN0b3IuYXBwZW5kQ2hpbGQgPSAoaHRtbEVsZW1lbnQpID0+IHtcbiAgICBpZiAoc2VsZWN0b3IuZWwubGVuZ3RoICE9PSAwKSB7XG4gICAgICBzZWxlY3Rvci5lbC5hcHBlbmRDaGlsZChodG1sRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgc2VsZWN0b3IsICR7c2VsfSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgdmFsaWQhYClcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0b3IuZWxcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBZGRzIGNsYXNzIHdpdGggYSBkZWxheSBvZiAxbXMgdG8gYWxsb3cgY3NzIHRvIHJlZ2lzdGVyIGEgdHJhbnNpdGlvbi5cbiAgICogQHBhcmFtIGNcbiAgICovXG4gIHNlbGVjdG9yLmFkZEFuaW1DbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgZGVsYXlBZGRDbGFzcyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgICBjb25zdCBhZGRDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChjKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFyci5mb3JFYWNoKGFkZENsYXNzKVxuICAgIH1cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZGVsYXlBZGRDbGFzcylcbiAgICAvLyB3aW5kb3cuc2V0VGltZW91dChkZWxheUFkZENsYXNzLCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gZWxTZWwgVGhlIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudC5cbiAgICogQGRlc2MgU2V0cyB0aGUgY2xhc3MgYWN0aXZlIEhUTUxFbGVtZW50IGZyb20gYSBOb2RlTGlzdC5cbiAgICovXG4gIHNlbGVjdG9yLnNldEFjdGl2ZUl0ZW0gPSAoYywgZWxTZWwpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IGN1cnJlbnRFbCA9IHR5cGVvZiAoZWxTZWwpID09PSAnc3RyaW5nJyA/IGdldEVsT3JMaXN0KGN4dCwgZWxTZWwpIDogZWxTZWxcbiAgICBjb25zdCB0b2dnbGVCb29sID0gaXRlbSA9PiBpdGVtLmlzRXF1YWxOb2RlKGN1cnJlbnRFbCkgPyBpdGVtLmNsYXNzTGlzdC5hZGQoYykgOiBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoYylcbiAgICBpZiAoaXNOb2RlRWxlbWVudChjdXJyZW50RWwpID09PSB0cnVlKSB7XG4gICAgICBhcnIuZm9yRWFjaCh0b2dnbGVCb29sKVxuICAgIH0gZWxzZSBpZiAoaXNEZXZNb2RlKCkgPT09IHRydWUpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiU0VMIElTIFwiLGVsU2VsLGMpO1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgc2VsZWN0b3IsICR7ZWxTZWx9LCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB2YWxpZCBpdGVtIGluIHNldEFjdGl2ZUl0ZW06ICR7Y31gKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBmdW5jdGlvbiBlbFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBnZXR0ZXIgZm9yIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgYSBzaW5nbGUgZWxlbWVudCBvciBhIE5vZGVMaXN0IGZyb20gdGhlIHNlbGVjdG9yXG4gICAqL1xuXG4gIC8qKlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbGVuZ3RoXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIERldGVybWluZXMgdGhlIGxlbmd0aCBvZiB0aGUgTm9kZUxpc3RcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogVGhlIGxlbmd0aCBvZiB0aGUgc2VsZWN0b3IgYXMgYSBOb2RlTGlzdFxuICAgKi9cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGV4aXN0c1xuICAgKlxuICAgKiBAZGVzY1xuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gdGhlIHNlbGVjdGVkIGVsZW1lbnQgZXhpc3RzXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEJvb2xlYW5cbiAgICovXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZWwnLCB7IGdldDogKCkgPT4gZ2V0RWxPckxpc3QoY3h0LCBzZWwsIHRydWUpIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2VscycsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdsZW4nLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgZmFsc2UpLmxlbmd0aCB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdleGlzdHMnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgZmFsc2UpLmxlbmd0aCA+PSAxIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2V4aXN0JywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIGZhbHNlKS5sZW5ndGggPj0gMSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdub2RlTGlzdCcsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdhcnInLCB7XG4gICAgZ2V0OiAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGdldEVsT3JMaXN0KGN4dCwgc2VsLCB0cnVlKVxuICAgICAgaWYgKGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9IGVsc2UgaWYgKGVsLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbZWxdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlbClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnaW5saW5lJywgeyBzZXQ6ICh2YWwpID0+IHNldElubGluZUNzcyh2YWwsIGN4dCwgc2VsKSwgZ2V0OiAoKSA9PiBzZWxlY3RvciB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdpbmxpbmVDc3MnLCB7IHNldDogKHZhbCkgPT4gc2V0SW5saW5lQ3NzKHZhbCwgY3h0LCBzZWwpLCBnZXQ6ICgpID0+IHNlbGVjdG9yIH0pXG5cbiAgcmV0dXJuIHNlbGVjdG9yXG59XG5cbmV4cG9ydCB7IFZpZXdTdHJlYW1TZWxlY3RvciB9XG4iLCJpbXBvcnQgeyBiYXNlQ29yZU1peGlucyB9IGZyb20gJy4uL3V0aWxzL21peGlucy9iYXNlLWNvcmUtbWl4aW5zLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlLmpzJ1xuaW1wb3J0IHsgc2FmZUNsb25lIH0gZnJvbSAnLi4vdXRpbHMvc2FmZS1jbG9uZS5qcydcbmltcG9ydCB7XG4gIGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIsXG4gIGdldENvbnN0cnVjdG9yTmFtZVxufSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtRWxlbWVudCB9IGZyb20gJy4vdmlldy1zdHJlYW0tZWxlbWVudC5qcydcbmltcG9ydCB7IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcyB9IGZyb20gJy4uL2NoYW5uZWxzL2NoYW5uZWxzLWNvbmZpZy5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1Ccm9hZGNhc3RlciB9IGZyb20gJy4vdmlldy1zdHJlYW0tYnJvYWRjYXN0ZXIuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtUGF5bG9hZCB9IGZyb20gJy4vdmlldy1zdHJlYW0tcGF5bG9hZC5qcydcbmltcG9ydCB7IENoYW5uZWxQYXlsb2FkRmlsdGVyIH0gZnJvbSAnLi4vdXRpbHMvY2hhbm5lbC1wYXlsb2FkLWZpbHRlci5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1PYnNlcnZhYmxlIH0gZnJvbSAnLi4vdXRpbHMvdmlld3N0cmVhbS1vYnNlcnZhYmxlcy5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1TZWxlY3RvciB9IGZyb20gJy4vdmlldy1zdHJlYW0tc2VsZWN0b3IuanMnXG5pbXBvcnQgeyBTdWJqZWN0LCBvZiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtZXJnZU1hcCwgbWFwLCB0YWtlV2hpbGUsIGZpbHRlciwgdGFwLCBza2lwLCBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHtcbiAgcGljayxcbiAgY29tcG9zZSxcbiAgaXNOaWwsXG4gIGFsbCxcbiAgZm9yRWFjaCxcbiAgdG9Mb3dlcixcbiAgZWl0aGVyLFxuICBmaW5kSW5kZXgsXG4gIGFwcGx5LFxuICB0ZXN0LFxuICBmbGF0dGVuLFxuICBwcm9wLFxuICBhbHdheXMsXG4gIGx0ZSxcbiAgZGVmYXVsdFRvLFxuICBwcm9wU2F0aXNmaWVzLFxuICBhbGxQYXNzLFxuICBjdXJyeSxcbiAgaXMsXG4gIHNsaWNlLFxuICBwYXRoLFxuICBvbWl0LFxuICBpZkVsc2UsXG4gIG1lcmdlUmlnaHQsXG4gIHdoZXJlLFxuICBlcXVhbHNcbiAgLCBtYXAgYXMgck1hcFxufSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW0ge1xuICAvKipcbiAgICogQG1vZHVsZSBWaWV3U3RyZWFtXG4gICAqXG4gICAqIEBkZXNjXG4gICAqXG4gICAqIDxwPlZpZXdTdHJlYW0gaXMgdGhlIGludGVyYWN0aXZlLXZpZXcgY29tcG9uZW50LCBhbmQgaXRzIGNvcmUgZnVuY3Rpb25hbGl0eSBpcyBjb21wcmlzZWQgb2YgdHdvIGludGVybmFsIGNvbXBvbmVudHM6IDwvcD5cbiAgIDx1bCBjbGFzcz0nYmFzaWMnPlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIHRoaXMudnNudW0gPSBNYXRoLnJhbmRvbSgpXG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIHRoaXMuX3Bvc3RSZW5kZXJDYWxsZWQgPSBmYWxzZVxuICAgIHRoaXMuZGVmYXVsdHMgPSAoKSA9PiB7XG4gICAgICBjb25zdCB2c2lkID0gdGhpcy5jcmVhdGVJZCgpXG4gICAgICBjb25zdCBpZCA9IHByb3BzLmlkID8gcHJvcHMuaWQgOiB2c2lkXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2c2lkLFxuICAgICAgICBpZCxcbiAgICAgICAgdGFnTmFtZTogJ2RpdicsXG4gICAgICAgIGVsOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgYW5pbWF0ZUluOiBmYWxzZSxcbiAgICAgICAgYW5pbWF0ZUluVGltZTogMC41LFxuICAgICAgICBhbmltYXRlT3V0OiBmYWxzZSxcbiAgICAgICAgYW5pbWF0ZU91dFRpbWU6IDAuNSxcbiAgICAgICAgc2VuZExpZmVjeWxlRXZlbnRzOiBmYWxzZSxcbiAgICAgICAgaGFzaElkOiBgIyR7aWR9YCxcbiAgICAgICAgaWQkOiBgIyR7aWR9YCxcbiAgICAgICAgdmlld0NsYXNzOiBWaWV3U3RyZWFtRWxlbWVudCxcbiAgICAgICAgZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHM6IHt9LFxuICAgICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICAgIHRlbXBsYXRlOiB1bmRlZmluZWQsXG4gICAgICAgIG5vZGU6IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcbiAgICAgICAgbmFtZTogZ2V0Q29uc3RydWN0b3JOYW1lKHRoaXMpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlID0ge31cbiAgICB0aGlzLiRkaXJzID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0KClcbiAgICB0aGlzLmFkZERlZmF1bHREaXJlY3Rpb24gPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5hZGREZWZhdWx0RGlyXG4gICAgdGhpcy5hZGREb3duSW50ZXJuYWxEaXIgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5hZGREb3duSW50ZXJuYWxEaXJcbiAgICAvLyB0aGlzLnByb3BzID0gT2JqZWN0LmFzc2lnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1RuKHt9LCB0aGlzLmRlZmF1bHRzKCksIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gZGVlcE1lcmdlKHRoaXMuZGVmYXVsdHMoKSwgcHJvcHMpXG4gICAgdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kID0gdGhpcy5wcm9wcy5zZW5kTGlmZWN5bGVFdmVudHMgPT09IHRydWUgPyB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2RBY3RpdmUuYmluZCh0aGlzKSA6IHRoaXMuc2VuZExpZmVjeWNsZU1ldGhvZEluYWN0aXZlLmJpbmQodGhpcylcbiAgICBjb25zdCBhdHRyaWJ1dGVzQXJyID0gdGhpcy5hdHRyaWJ1dGVzQXJyYXlcbiAgICAvLyBsZXQgYXR0cmlidXRlc0FyciA9IFsnaWQnLCAnY2xhc3MnLCAnZGF0YXNldCddO1xuICAgIHRoaXMucHJvcHMuZG9tQXR0cmlidXRlcyA9IHBpY2soYXR0cmlidXRlc0FyciwgdGhpcy5wcm9wcylcbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hZGRUcmFpdHModGhpcy5wcm9wcy50cmFpdHMpXG4gICAgfVxuICAgIHRoaXMubG9hZEFsbE1ldGhvZHMoKVxuICAgIHRoaXMucHJvcHMuYWN0aW9uID0gJ0xPQURFRCdcbiAgICB0aGlzLnNpbmskID0gbmV3IFN1YmplY3QoKVxuICAgIHRoaXMucHJvcHMuZWxJc0FscmVhZHlSZW5kZXJlZEJvb2wgPSB0aGlzLmVsQWxyZWFkeUV4aXN0c0ZuKHRoaXMucHJvcHMpXG4gICAgY29uc3QgVmlld0NsYXNzID0gdGhpcy5wcm9wcy52aWV3Q2xhc3NcbiAgICB0aGlzLnZpZXcgPSBuZXcgVmlld0NsYXNzKHRoaXMuc2luayQsIHsgZWw6dGhpcy5wcm9wcy5lbCB9LCB0aGlzLnByb3BzLnZzaWQsIHRoaXMucHJvcHMuaWQpLy8gbmV3IHRoaXMucHJvcHMudmlld0NsYXNzKHRoaXMuc2luayQpO1xuICAgIHRoaXMuc291cmNlU3RyZWFtcyA9IHRoaXMudmlldy5zb3VyY2VTdHJlYW1zXG4gICAgdGhpcy5fcmF3U291cmNlJCA9IHRoaXMudmlldy5nZXRTb3VyY2VTdHJlYW0oKVxuICAgIHRoaXMuX3Jhd1NvdXJjZSQudmlld05hbWUgPSB0aGlzLnByb3BzLm5hbWVcbiAgICB0aGlzLnNlbmRFdmVudHNEb3duU3RyZWFtID0gdGhpcy5zZW5kRXZlbnRzRG93blN0cmVhbUZuXG4gICAgdGhpcy5pbml0Vmlld1N0cmVhbSgpXG4gICAgdGhpcy5pc0Rldk1vZGUgPSBWaWV3U3RyZWFtLmlzRGV2TW9kZSgpXG4gICAgdGhpcy5wcm9wcy5hZGRlZENoYW5uZWxzID0gW11cbiAgICB0aGlzLmNoZWNrSWZFbGVtZW50QWxyZWFkeUV4aXN0cygpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIQVNIIEtFWSBBTkQgU1BJR09UIE1FVEhPRFM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZ2V0IHNvdXJjZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZSRcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVzQXJyYXkoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIEdsb2JhbCBBdHRyaWJ1dGVzXG4gICAgICAnYWNjZXNza2V5JywgJ2NsYXNzJywgJ2NvbnRlbnRlZGl0YWJsZScsICdkaXInLCAnZHJhZ2dhYmxlJywgJ2hpZGRlbicsICdpZCcsICdsYW5nJywgJ3NwZWxsY2hlY2snLCAnc3R5bGUnLCAndGFiaW5kZXgnLCAndGl0bGUnLCAndHJhbnNsYXRlJyxcblxuICAgICAgLy8gQWNjZXNzaWJsaXR5IEF0dHJpYnV0ZXNcbiAgICAgICdhcmlhLWF1dG9jb21wbGV0ZScsICdhcmlhLWNoZWNrZWQnLCAnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWV4cGFuZGVkJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1oaWRkZW4nLCAnYXJpYS1pbnZhbGlkJywgJ2FyaWEtbGFiZWwnLCAnYXJpYS1sZXZlbCcsICdhcmlhLW11bHRpbGluZScsICdhcmlhLW11bHRpc2VsZWN0YWJsZScsICdhcmlhLW9yaWVudGF0aW9uJywgJ2FyaWEtcHJlc3NlZCcsICdhcmlhLXJlYWRvbmx5JywgJ2FyaWEtcmVxdWlyZWQnLCAnYXJpYS1zZWxlY3RlZCcsICdhcmlhLXNvcnQnLCAnYXJpYS12YWx1ZW1heCcsICdhcmlhLXZhbHVlbWluJywgJ2FyaWEtdmFsdWVub3cnLCAnYXJpYS12YWx1ZXRleHQnLCAnYXJpYS1hdG9taWMnLCAnYXJpYS1idXN5JywgJ2FyaWEtbGl2ZScsICdhcmlhLXJlbGV2YW50JywgJ2FyaWEtZHJvcGVmZmVjdCcsICdhcmlhLWdyYWJiZWQnLCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JywgJ2FyaWEtY29udHJvbHMnLCAnYXJpYS1kZXNjcmliZWRieScsICdhcmlhLWZsb3d0bycsICdhcmlhLWxhYmVsbGVkYnknLCAnYXJpYS1vd25zJywgJ2FyaWEtcG9zaW5zZXQnLCAnYXJpYS1zZXRzaXplJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgaW5wdXRcbiAgICAgICdhY2NlcHQnLCAnYXV0b2NvbXBsZXRlJywgJ2F1dG9mb2N1cycsICdjaGVja2VkJywgJ2Rpcm5hbWUnLCAnZGlzYWJsZWQnLCAnZm9ybScsICdmb3JtYWN0aW9uJyxcbiAgICAgICdmb3JtZW5jdHlwZScsICdmb3JtbWV0aG9kJywgJ2Zvcm1ub3ZhbGlkYXRlJywgJ2Zvcm10YXJnZXQnLCAnbGlzdCcsICdtYXgnLCAnbWF4bGVuZ3RoJyxcbiAgICAgICdtaW4nLCAnbWlubGVuZ3RoJywgJ211bHRpcGxlJywgJ25hbWUnLCAncGF0dGVybicsICdwbGFjZWhvbGRlcicsICdyZWFkb25seScsICdyZXF1aXJlZCcsICdzaXplJywgJ3N0ZXAnLCAndmFsdWUnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBpbWdcbiAgICAgICdhbHQnLCAnc3Jjc2V0JywgJ3NpemVzJywgJ3VzZW1hcCcsICdpc21hcCcsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGEgYW5kIGxpbmtcbiAgICAgICdocmVmJywgJ3RhcmdldCcsICdkb3dubG9hZCcsICdwaW5nJywgJ3JlbCcsICdocmVmbGFuZycsICdhcycsICdtZWRpYScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGZvcm1cbiAgICAgICdhY2NlcHQtY2hhcnNldCcsICdhY3Rpb24nLCAnZW5jdHlwZScsICdub3ZhbGlkYXRlJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgbWV0YVxuICAgICAgJ2NvbnRlbnQnLCAnY2hhcnNldCcsICdodHRwLWVxdWl2JyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3Igc2NyaXB0XG4gICAgICAnYXN5bmMnLCAnZGVmZXInLCAnaW50ZWdyaXR5JywgJ25vbW9kdWxlJywgJ25vbmNlJywgJ3JlZmVycmVycG9saWN5JyxcblxuICAgICAgLy8gT3RoZXIgRWxlbWVudC1zcGVjaWZpYyBBdHRyaWJ1dGVzXG4gICAgICAnYXV0b2NhcGl0YWxpemUnLCAnYXV0b3BsYXknLCAnYnVmZmVyZWQnLCAnY2hhbGxlbmdlJywgJ2NpdGUnLCAnY29kZScsICdjb2RlYmFzZScsICdjb2xvcicsICdjb2xzJywgJ2NvbHNwYW4nLCAnY29udGV4dG1lbnUnLCAnY29udHJvbHMnLCAnY29vcmRzJywgJ2Nyb3Nzb3JpZ2luJywgJ2NzcCcsICdkYXRhc2V0JywgJ2RhdGV0aW1lJywgJ2RlY29kaW5nJywgJ2RlZmF1bHQnLCAnZm9yJywgJ2hlYWRlcnMnLCAnaGlnaCcsICdpY29uJywgJ2ltcG9ydGFuY2UnLCAnaXRlbXByb3AnLCAna2V5dHlwZScsICdraW5kJywgJ2xhYmVsJywgJ2xhbmd1YWdlJywgJ2xhenlsb2FkJywgJ2xvb3AnLCAnbG93JywgJ21hbmlmZXN0JywgJ21ldGhvZCcsICdtdXRlZCcsICdvcGVuJywgJ29wdGltdW0nLCAncG9zdGVyJywgJ3ByZWxvYWQnLCAncmFkaW9ncm91cCcsICdyZXZlcnNlZCcsICdyb2xlJywgJ3Jvd3MnLCAncm93c3BhbicsICdzYW5kYm94JywgJ3Njb3BlJywgJ3Njb3BlZCcsICdzZWxlY3RlZCcsICdzaGFwZScsICdzbG90JywgJ3NwYW4nLCAnc3JjZG9jJywgJ3NyYycsICd0eXBlJywgJ3NyY2xhbmcnLCAnc3RhcnQnLCAnc3VtbWFyeScsICd3cmFwJywgJ3dpZHRoJywgJ2hlaWdodCdcbiAgICBdXG4gIH1cblxuICBzdGF0aWMgaXNEZXZNb2RlKCkge1xuICAgIHJldHVybiBTcHluZUFwcFByb3BlcnRpZXMuZGVidWdcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmQWN0aW9uc0FyZVJlZ2lzdGVyZWQoY2hhbm5lbHNBcnIgPSBbXSwgYWN0aW9uc0Fycikge1xuICAgIGlmIChhY3Rpb25zQXJyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdldEFsbEFjdGlvbnMgPSAoYSkgPT4ge1xuICAgICAgICBjb25zdCBnZXRSZWdpc3RlcmVkQWN0aW9uc0FyciA9IChzdHIpID0+IFNweW5lQXBwUHJvcGVydGllcy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpXG4gICAgICAgIGNvbnN0IGFyciA9ICBhLm1hcChnZXRSZWdpc3RlcmVkQWN0aW9uc0FycilcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW4oYXJyKVxuICAgICAgfVxuICAgICAgY29uc3QgY2hlY2tGb3JNYXRjaCA9IChzdHJNYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoc3RyTWF0Y2gpXG4gICAgICAgIGNvbnN0IGFjdGlvbkluZGV4ID0gZmluZEluZGV4KHRlc3QocmUpLCBnZXRBbGxBY3Rpb25zQXJyKVxuICAgICAgICBpZiAoYWN0aW9uSW5kZXggPCAwKSB7XG4gICAgICAgICAgY29uc3QgY2hhbm5lbFN5bnRheCA9IGNoYW5uZWxzQXJyLmxlbmd0aCA9PT0gMSA/ICdmcm9tIGFkZGVkIGNoYW5uZWwnIDogJ2Zyb20gYWRkZWQgY2hhbm5lbHMnXG4gICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYWN0aW9uLCAke3N0ck1hdGNofSwgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgYWN0aW9ucyAke2NoYW5uZWxTeW50YXh9LCAke2NoYW5uZWxzQXJyLmpvaW4oJywgJyl9YClcbiAgICAgICAgfVxuICAgICAgICAvLyAgY29uc3QgdnNudW0gPSAoKT0+IFIudGVzdChuZXcgUmVnRXhwKHN0ciksIFwiQ0hBTk5FTF9ST1VURV9URVNUX0VWRU5UXCIpXG4gICAgICB9XG4gICAgICBjb25zdCBnZXRBbGxBY3Rpb25zQXJyID0gZ2V0QWxsQWN0aW9ucyhjaGFubmVsc0FycilcbiAgICAgIGFjdGlvbnNBcnIuZm9yRWFjaChjaGVja0Zvck1hdGNoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBZGQgYW55IHF1ZXJ5IHdpdGhpbiB0aGUgVmlld1N0cmVhbSdzIGRvbSBhbmQgYW55IGRvbSBldmVudHMgdG8gYXV0b21hdGljYWxseSBiZSBvYnNlcnZlZCBieSB0aGUgVUkgQ2hhbm5lbC5cbiAgICogPGJyPlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgYnJvYWRjYXN0RXZlbnRzKCkge1xuICAgKiAgLy8gQUREIEJVVFRPTiBFVkVOVFMgQVMgTkVTVEVEIEFSUkFZU1xuICAgKiAgcmV0dXJuIFtcbiAgICogICAgICAgWycjbXktYnV0dG9uJywgJ21vdXNlb3ZlciddLFxuICAgKiAgICAgICBbJyNteS1pbnB1dCcsICdjaGFuZ2UnXVxuICAgKiAgICAgXVxuICAgKiAgIH1cbiAgICpcbiAgICpcbiAgICogKi9cblxuICBzdGF0aWMgaXNWYWxpZE5lc3RlZEFycihldmVudHNBcnIpIHtcbiAgICBjb25zdCBpc1RydWUgPSBlcXVhbHModHJ1ZSlcbiAgICBjb25zdCBhbGxJc1RydWUgPSBhbGwoaXNUcnVlKVxuICAgIGNvbnN0IGlzU3RyaW5nID0gaXMoU3RyaW5nKVxuICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBjb21wb3NlKGFsbElzVHJ1ZSwgck1hcChpc1N0cmluZyksIHNsaWNlKDAsIDIpLCBkZWZhdWx0VG8oW10pKVxuICAgIGNvbnN0IG1hcEV2ZW50c0FyckZuID0gY29tcG9zZShhbGxJc1RydWUsIHJNYXAoaXNWYWxpZEFyciksIGRlZmF1bHRUbyhbXSkpXG4gICAgcmV0dXJuIG1hcEV2ZW50c0FyckZuKGV2ZW50c0FycilcbiAgfVxuXG4gIHN0YXRpYyBlbElzRG9tRWxlbWVudChvKSB7XG4gICAgaWYgKGlzKFN0cmluZywgbykpIHtcbiAgICAgIG8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG8pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKShvKVxuICB9XG5cbiAgdXBkYXRlUHJvcHNUb01hdGNoRWwoKSB7XG4gICAgY29uc3QgZ2V0VGFnTmFtZSA9IGNvbXBvc2UodG9Mb3dlciwgZWl0aGVyKHByb3AoJ3RhZ05hbWUnKSwgYWx3YXlzKCcnKSkpXG4gICAgdGhpcy5wcm9wcy50YWdOYW1lID0gZ2V0VGFnTmFtZSh0aGlzLnByb3BzLmVsKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGVsQWxyZWFkeUV4aXN0c0ZuKHByb3BzKSB7XG4gICAgY29uc3QgZWxJc0RvbUVsZW1lbnQgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcbiAgICBjb25zdCBlbElzUmVuZGVyZWQgPSBlbCA9PiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKVxuICAgIHJldHVybiBwcm9wU2F0aXNmaWVzKGFsbFBhc3MoW2VsSXNSZW5kZXJlZCwgZWxJc0RvbUVsZW1lbnRdKSwgJ2VsJykocHJvcHMpXG4gIH1cblxuICBjaGVja0lmRWxlbWVudEFscmVhZHlFeGlzdHMoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZWxJc0FscmVhZHlSZW5kZXJlZEJvb2wgPT09IHRydWUpIHtcbiAgICAgIHRoaXMudXBkYXRlUHJvcHNUb01hdGNoRWwoKVxuICAgICAgdGhpcy5wb3N0UmVuZGVyKClcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuZWwgPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNweW5lIEVycm9yOiBUaGUgZGVmaW5lZCBlbGVtZW50IGZvciB0aGlzIFZpZXdTdHJlYW0gaW5zdGFuY2UsICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSwgYXBwZWFycyB0byBub3QgZXhpc3QuYClcbiAgICB9XG4gIH1cblxuICBsb2FkQWxsTWV0aG9kcygpIHtcbiAgICBjb25zdCBjaGFubmVsRm4gPSBjdXJyeSh0aGlzLm9uQ2hhbm5lbE1ldGhvZENhbGwuYmluZCh0aGlzKSlcbiAgICBjb25zdCBjcmVhdGVFeHRyYVN0YXRlc01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgIGxldCBbYWN0aW9uLCBmdW5jU3RyLCBhY3Rpb25GaWx0ZXJdID0gYXJyXG4gICAgICBpZiAoaXMoU3RyaW5nLCBhY3Rpb25GaWx0ZXIpKSB7XG4gICAgICAgIGFjdGlvbkZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcih7IHNlbGVjdG9yOmFjdGlvbkZpbHRlciB9KVxuICAgICAgfVxuICAgICAgdGhpcy5wcm9wcy5leHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kc1thY3Rpb25dID0gY2hhbm5lbEZuKGZ1bmNTdHIsXG4gICAgICAgIGFjdGlvbkZpbHRlcilcbiAgICB9XG4gICAgdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKS5mb3JFYWNoKGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kKVxuICAgIHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHMgPSB0aGlzLnNldFNvdXJjZUhhc2hNZXRob2RzKFxuICAgICAgdGhpcy5wcm9wcy5leHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcylcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBjaGFubmVsIGFjdGlvbnMgdG8gbG9jYWwgbWV0aG9kcywgZm9ybWF0dGVkIGFzIGFycmF5IHZhbHVlcy5cbiAgICogPHVsPlxuICAgKiA8bGk+PGI+Rmlyc3QgdmFsdWU6PC9iPiBBY3Rpb24gbmFtZSwgYXMgYSBzdHJpbmcgb3IgYXMgYSBiYXNpYyBSZWd1bGFyIEV4cHJlc3Npb24uXG4gICAqIDxsaT48Yj5TZWNvbmQgdmFsdWU6PC9iPiBUaGUgbWV0aG9kIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBhY3Rpb24gaXMgcHVibGlzaGVkLlxuICAgKiA8bGk+PGI+VGhpcmQgb3B0aW9uYWwgdmFsdWU6PC9iPiBUaGlzIGlzIGEgZmlsdGVyIG9wdGlvbiB0aGF0IGNhbiBiZSBhIHNlbGVjdG9yIHN0cmluZy4gb3IgYW4gaW5zdGFuY2Ugb2YgdGhlIExJTktbJ2NoYW5uZWxQYXlsb2FkRmlsdGVyJywgJ2NoYW5uZWwtcGF5bG9hZC1maWx0ZXInXS5cbiAgICogPC91bD5cbiAgICogQGV4YW1wbGVcbiAgICogICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICByZXR1cm4gW1xuICAgKiAgICAgWydDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJywgJ29uQ2xpY2tFdmVudCcsICdsaS5teWNsYXNzJ10sXG4gICAqICAgICBbJ0NIQU5ORUxfTVlfQ1VTVE9NX0VWRU5UJywgJ29uQWN0aW9uUmV0dXJuZWQnXVxuICAgKiAgICAgICAgICAgIF1cbiAgICogICAgICAgICAgIH1cbiAgICpcbiAgICogQHJldHVybnMgTmVzdGVkIEFycmF5XG4gICAqL1xuICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBvbkNoYW5uZWxNZXRob2RDYWxsKHN0ciwgYWN0aW9uRmlsdGVyLCBwKSB7XG4gICAgY29uc3QgcnVuRnVuYyA9IChwYXlsb2FkKSA9PiB7XG4gICAgICBpZiAodGhpc1tzdHJdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWV0aG9kLCAke3N0cn0gZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IGluICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSFgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tzdHJdKHBheWxvYWQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHAuJGRpciAhPT0gdW5kZWZpbmVkICYmIHAuJGRpci5pbmNsdWRlcygnY2hpbGQnKSAmJlxuICAgICAgICB0aGlzLmRlbGV0ZWQgIT09IHRydWUpIHtcbiAgICAgIGNvbnN0IG9iaiA9IGRlZXBNZXJnZSh7fSwgcCkvLyBPYmplY3QuYXNzaWduKHt9LCBwKTtcbiAgICAgIG9iai4kZGlyID0gdGhpcy4kZGlycy5DXG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMucmF3JC5uZXh0KG9iailcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyUGF5bG9hZCA9IGRlZmF1bHRUbyhhbHdheXModHJ1ZSksIGFjdGlvbkZpbHRlcilcblxuICAgIGlmIChmaWx0ZXJQYXlsb2FkKHApID09PSB0cnVlKSB7XG4gICAgICBwID0gb21pdChbJyRkaXInXSwgcClcbiAgICAgIHJ1bkZ1bmMocClcbiAgICB9XG4gIH1cblxuICBzZXRTb3VyY2VIYXNoTWV0aG9kcyhleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcyA9IHt9KSB7XG4gICAgY29uc3QgaGFzaFNvdXJjZUtleXMgPSB7XG4gICAgICBFWFRJUlBBVElORzogKHApID0+IHRoaXMuY2hlY2tQYXJlbnREaXNwb3NlKHApLFxuICAgICAgRVhUSVJQQVRFOiAocCkgPT4gdGhpcy5kaXNwb3NlVmlld1N0cmVhbShwKSxcbiAgICAgIC8vICdDSElMRF9FWFRJUlBBVEUnICAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKHApLFxuICAgICAgVlNfU1BBV05FRDogKHApID0+IHRoaXMub25WU1JlbmRlcmVkKHApLFxuICAgICAgVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NOiAocCkgPT4gdGhpcy5vblZTUmVuZGVyZWQocCksXG4gICAgICBWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQ6IChwKSA9PiB0aGlzLm9uVlNSZW5kZXJlZChwKSxcbiAgICAgIC8vICdDSElMRF9WU19TUEFXTkVEJyAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLmF0dGFjaENoaWxkVG9WaWV3KHApLFxuICAgICAgUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1Q6IChwKSA9PiB0aGlzLm9uUmVhZHlUb0dDKHApLFxuICAgICAgVlNfTlVMTElUWTogKCkgPT4gKHt9KVxuICAgIH1cbiAgICByZXR1cm4gZGVlcE1lcmdlLmFsbChbe30sIGhhc2hTb3VyY2VLZXlzLCBleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kc10pXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IE1BSU4gU1RSRUFNIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaW5pdFZpZXdTdHJlYW0oKSB7XG4gICAgdGhpcy5fc291cmNlJCA9IHRoaXMuX3Jhd1NvdXJjZSQucGlwZShtYXAoXG4gICAgICAocGF5bG9hZCkgPT4gdGhpcy5vbk1hcFZpZXdTb3VyY2UocGF5bG9hZCkpLCB0YWtlV2hpbGUodGhpcy5ub3RHQ1NUQVRFKSlcblxuICAgIHRoaXMuaW5pdEF1dG9NZXJnZVNvdXJjZVN0cmVhbXMoKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKHRoaXMuX3NvdXJjZSQsIHRydWUpXG4gIH1cblxuICBub3RHQ1NUQVRFKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpXG4gIH1cblxuICBlcUdDU1RBVEUocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJylcbiAgfVxuXG4gIG5vdENPTVBMRVRFRChwKSB7XG4gICAgcmV0dXJuICFwLmFjdGlvbi5pbmNsdWRlcygnQ09NUExFVEVEJylcbiAgfVxuXG4gIG5vdEdDQ09NUExFVEUocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ0dDX0NPTVBMRVRFJylcbiAgfVxuXG4gIHRlc3RWYWwocCkge1xuICAgIGNvbnNvbGUubG9nKCdURVNUSU5HIFZBTEwgSVMgJywgcClcbiAgfVxuXG4gIGFkZFBhcmVudFN0cmVhbShvYnMsIGF0dGFjaERhdGEpIHtcbiAgICBjb25zdCBmaWx0ZXJPdXROdWxsRGF0YSA9IChkYXRhKSA9PiBkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YS5hY3Rpb24gIT09XG4gICAgICAgIHVuZGVmaW5lZFxuICAgIGNvbnN0IGNoZWNrSWZEaXNwb3NlT3JGYWRlb3V0ID0gKGQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBkZWVwTWVyZ2Uoe30sIGQpXG5cbiAgICAgIGlmIChkYXRhLmFjdGlvbiA9PT0gJ0VYVElSUEFURV9BTkRfUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0oZGF0YSlcbiAgICAgICAgZGF0YS5hY3Rpb24gPSAnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHRoaXMucGFyZW50JCA9IG9icy5waXBlKFxuICAgICAgZmlsdGVyKGZpbHRlck91dE51bGxEYXRhKSxcbiAgICAgIG1hcChjaGVja0lmRGlzcG9zZU9yRmFkZW91dCkpXG4gICAgdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24odGhpcy5wYXJlbnQkLCBmYWxzZSwgJ1BBUkVOVCcpXG4gICAgdGhpcy5yZW5kZXJBbmRBdHRhY2hUb1BhcmVudChhdHRhY2hEYXRhKVxuICB9XG5cbiAgYWRkQ2hpbGRTdHJlYW0ob2JzJCkge1xuICAgIGNvbnN0IGZpbHRlck91dE51bGxEYXRhID0gKGRhdGEpID0+IGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhLmFjdGlvbiAhPT1cbiAgICAgICAgdW5kZWZpbmVkXG4gICAgY29uc3QgY2hpbGQkID0gb2JzJC5waXBlKFxuICAgICAgZmlsdGVyKGZpbHRlck91dE51bGxEYXRhKSxcbiAgICAgIHRhcChwID0+IHRoaXMudHJhY2VyKCdhZGRDaGlsZFN0cmFlbSBkbyAnLCBwKSksXG4gICAgICBtYXAoKHApID0+IHtcbiAgICAgICAgcmV0dXJuIHBcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUocCA9PiB0aGlzLm9uQ2hpbGRDb21wbGV0ZWQoY2hpbGQkLnNvdXJjZSkpKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKGNoaWxkJCwgdHJ1ZSwgJ0NISUxEJylcbiAgfVxuXG4gIG9uQ2hpbGREaXNwb3NlZChwKSB7XG5cbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBvbkNoaWxkQ29tcGxldGVkKHApIHtcbiAgICBjb25zdCBmaW5kTmFtZSA9ICh4KSA9PiB7XG4gICAgICBjb25zdCBmaW5hbERlc3QgPSAoeSkgPT4ge1xuICAgICAgICB3aGlsZSAoeS5kZXN0aW5hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgeSA9IGZpbmFsRGVzdCh5LmRlc3RpbmF0aW9uKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5XG4gICAgICB9XG4gICAgICByZXR1cm4gcGljayhbJ2lkJywgJ3ZzaWQnXSwgZmluYWxEZXN0KHgpKVxuICAgIH1cbiAgICBjb25zdCBjaGlsZENvbXBsZXRlZERhdGEgPSBmaW5kTmFtZShwKVxuICAgIHRoaXMudHJhY2VyKCdvbkNoaWxkQ29tcGxldGVkICcsIHRoaXMudnNudW0sIHApXG4gICAgLy8gY29uc29sZS5sb2coJ29iaiBpcyAnLGNoaWxkQ29tcGxldGVkTmFtZSxvYmosdGhpcy5wcm9wcyk7XG4gICAgdGhpcy5vbkNoaWxkRGlzcG9zZWQoY2hpbGRDb21wbGV0ZWREYXRhLCBwKVxuICAgIHJldHVybiBjaGlsZENvbXBsZXRlZERhdGFcbiAgfVxuXG4gIGluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zKCkge1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT0gU1VCU0NSSVBUSU9OIFNPVVJDRSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3Qgc3Vic2NyaWJlciA9IHtcbiAgICAgIG5leHQ6IHRoaXMub25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0LmJpbmQodGhpcyksXG4gICAgICBlcnJvcjogdGhpcy5vblN1YnNjcmliZVRvU291cmNlc0Vycm9yLmJpbmQodGhpcyksXG4gICAgICBjb21wbGV0ZTogdGhpcy5vblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlLmJpbmQodGhpcylcbiAgICB9XG4gICAgLy8gbGV0IHRha2VCZWZvcmVHQ09sZCA9ICh2YWwpID0+IHZhbC5hY3Rpb24gIT09ICdWU19ERVRSSVRVU19DT0xMRUNURUQnO1xuICAgIC8vIGxldCB0YWtlQmVmb3JlR0MgPSAocCkgPT4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpO1xuICAgIC8vIGxldCBtYXBUb1N0YXRlID0gKHZhbCkgPT4gKHthY3Rpb246dmFsfSk7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vID09PT09PT09PT0gTUVUSE9EUyBUTyBDSEVDSyBGT1IgV0hFTiBUTyBDT01QTEVURSBUSEUgU1RSRUFNID09PT09PT09PVxuICAgIGNvbnN0IGNvbXBsZXRlQWxsID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5lbCQgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudWJlclNvdXJjZSQuY29tcGxldGUoKVxuICAgICAgdGhpcy5hdXRvU3Vic2NyaWJlciQuY29tcGxldGUoKVxuICAgICAgdGhpcy5zaW5rJC5jb21wbGV0ZSgpXG4gICAgICB0aGlzLnByb3BzID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmRlbGV0ZWQgPSB0cnVlXG4gICAgICB0aGlzLnRyYWNlcignY29tcGxldGVBbGwnLCB0aGlzLmRlbGV0ZWQsIHRoaXMucHJvcHMpXG4gICAgfVxuICAgIGNvbnN0IGRlY3JlbWVudE9uT2JzZXJ2YWJsZUNsb3NlZCA9ICgpID0+IHtcbiAgICAgIG9ic0NvdW50IC09IDFcbiAgICAgIGlmIChvYnNDb3VudCA9PT0gMCkge1xuICAgICAgICBjb21wbGV0ZUFsbCgpXG4gICAgICB9XG4gICAgfVxuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gSU5JVCBTVFJFQU0gTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgb2JzQ291bnQgPSAwXG4gICAgdGhpcy51YmVyU291cmNlJCA9IG5ldyBTdWJqZWN0KClcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBDT01QT1NFRCBSWEpTIE9CU0VSVkFCTEUgPT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IGluY3JlbWVudE9ic2VydmFibGVzVGhhdENsb3NlcyA9ICgpID0+IHsgb2JzQ291bnQgKz0gMSB9XG4gICAgdGhpcy5hdXRvTWVyZ2VTdWJqZWN0JCA9IHRoaXMudWJlclNvdXJjZSQucGlwZShtZXJnZU1hcCgob2JzRGF0YSkgPT4ge1xuICAgICAgY29uc3QgYnJhbmNoT2JzZXJ2YWJsZSQgPSBvYnNEYXRhLm9ic2VydmFibGUucGlwZShmaWx0ZXIoXG4gICAgICAgIChwKSA9PiBwICE9PSB1bmRlZmluZWQgJiYgcC5hY3Rpb24gIT09IHVuZGVmaW5lZCksIG1hcChwID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1BBWUxPQUQgSVMgJywgcCwgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKVxuICAgICAgICBjb25zdCBwYXlsb2FkID0gZGVlcE1lcmdlKHt9LCBwKVxuICAgICAgICBwYXlsb2FkLmFjdGlvbiA9IHAuYWN0aW9uLy8gYWRkUmVsYXRpb25Ub1N0YXRlKG9ic0RhdGEucmVsLCBwLmFjdGlvbik7XG4gICAgICAgIHRoaXMudHJhY2VyKCdhdXRvTWVyZ2VTdWJqZWN0JCcsIHBheWxvYWQpXG4gICAgICAgIHJldHVybiBwYXlsb2FkXG4gICAgICB9KSlcblxuICAgICAgaWYgKG9ic0RhdGEuYXV0b0Nsb3Nlc0Jvb2wgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBicmFuY2hPYnNlcnZhYmxlJFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jcmVtZW50T2JzZXJ2YWJsZXNUaGF0Q2xvc2VzKClcbiAgICAgICAgcmV0dXJuIGJyYW5jaE9ic2VydmFibGUkLnBpcGUoZmluYWxpemUoZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkKSlcbiAgICAgIH1cbiAgICB9KSlcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVUJTQ1JJQkVSID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHRoaXMuYXV0b1N1YnNjcmliZXIkID0gdGhpcy5hdXRvTWVyZ2VTdWJqZWN0JFxuICAgIC8vIC5kbygocCkgPT4gY29uc29sZS5sb2coJ1NJTksgREFUQSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIHApKVxuICAgICAgLnBpcGUoZmlsdGVyKChwKSA9PiBwICE9PSB1bmRlZmluZWQgJiYgcC5hY3Rpb24gIT09IHVuZGVmaW5lZCkpXG4gICAgICAuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IE1FUkdFIFNUUkVBTVMgVE8gTUFJTiBTVUJTQ1JJQkVSID09PT09PT09PT09PT09PT09XG4gIHVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbihvYnMkLCBhdXRvQ2xvc2VzQm9vbCA9IGZhbHNlLCByZWwpIHtcbiAgICAvLyBjb25zdCBkaXJlY3Rpb25BcnIgPSBzZW5kRG93blN0cmVhbSA9PT0gdHJ1ZSA/IHRoaXMuJGRpcnMuREkgOiB0aGlzLiRkaXJzLkk7XG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgb2JzZXJ2YWJsZTogb2JzJCxcbiAgICAgIGF1dG9DbG9zZXNCb29sLFxuICAgICAgcmVsXG4gICAgfVxuICAgIHRoaXMudHJhY2VyKCd1cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24gJywgdGhpcy52c251bSwgb2JqKVxuICAgIHRoaXMudWJlclNvdXJjZSQubmV4dChvYmopXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVUJTQ1JJQkVSIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIG9uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dChwYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBkZWZhdWx0VG9GbiA9IGRlZmF1bHRUbygocCkgPT4gdGhpcy5zZW5kRXh0ZW5kZWRTdHJlYW1zKHApKVxuXG4gICAgLy8gKioqKlVTRSBSRUdFWCBBUyBQUkVESUNBVEUgQ0hFQ0sgRk9SIFBBWUxPQUQuQUNUSU9OIElOIEhBU0ggTUVUSE9EUyBPQkpcbiAgICAvLyBjb25zdCBoYXNoQWN0aW9uID0gdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kc1twYXlsb2FkLmFjdGlvbl07XG4gICAgY29uc3QgaGFzaEFjdGlvblN0ciA9IGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIodGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kcyxcbiAgICAgIHBheWxvYWQuYWN0aW9uKVxuICAgIGNvbnN0IGhhc2hBY3Rpb24gPSB0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzW2hhc2hBY3Rpb25TdHJdXG4gICAgLy8gY29uc29sZS5sb2coJ1MgUEFZTE9BRCAnLCB0aGlzLnByb3BzLm5hbWUsIHR5cGVvZiAoaGFzaEFjdGlvbiksIHBheWxvYWQpO1xuXG4gICAgY29uc3QgZm4gPSBkZWZhdWx0VG9GbihoYXNoQWN0aW9uKVxuXG4gICAgLy8gY29uc29sZS5sb2coJ2hhc2ggbWV0aG9kcyAnLCBmbiwgdGhpcy5wcm9wcy5uYW1lLCBwYXlsb2FkLmFjdGlvbiwgaGFzaEFjdGlvblN0ciwgdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kcyk7XG5cbiAgICBmbihwYXlsb2FkKVxuICAgIC8vIGNvbnNvbGUubG9nKGZuLCBwYXlsb2FkLCAnIFRIRSBQQVlMT0FEIEZST00gU1VCU0NSSUJFIElTICcsICcgLS0tLSAnLCAnIC0tLT4gJywgdGhpcy5wcm9wcyk7XG4gICAgLy8gY29uc29sZS5sb2coJ0VYVElSUEFURVIgVlMgTkVYVCcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgcGF5bG9hZCk7XG5cbiAgICB0aGlzLnRyYWNlcignb25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0JywgeyBwYXlsb2FkIH0pXG4gIH1cblxuICBvblN1YnNjcmliZVRvU291cmNlc0Vycm9yKHBheWxvYWQgPSAnJykge1xuICAgIGNvbnNvbGUubG9nKCdBTEwgRVJST1IgICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgcGF5bG9hZClcbiAgfVxuXG4gIC8qXG4gICAgYXR0YWNoQ2hpbGRUb1ZpZXcoZGF0YSkge1xuICAgICAgLy8gbGV0IGNoaWxkUmVuZGVyRGF0YSA9IGRhdGEuYXR0YWNoRGF0YTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdDSElMRCBEQVRBICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgY2hpbGRSZW5kZXJEYXRhKTtcbiAgICAgIC8vIHRoaXMub3BlblNwaWdvdCgnQVRUQUNIX0NISUxEX1RPX1NFTEYnLCB7Y2hpbGRSZW5kZXJEYXRhfSk7XG4gICAgfVxuICAqL1xuXG4gIG9uU3Vic2NyaWJlVG9Tb3VyY2VzQ29tcGxldGUoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJz09PT0gRVhUSVJQQVRFUiBBTEwgQ09NUExFVEVEID09PT0nLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMudHJhY2VyKCdvblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlJywgJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnKVxuXG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19ERVRSSVRVU19DT0xMRUNUJylcbiAgfVxuXG4gIHNlbmRFeHRlbmRlZFN0cmVhbXMocGF5bG9hZCkge1xuICAgIHRoaXMudHJhY2VyKCdzZW5kRXh0ZW5kZWRTdHJlYW1zJywgcGF5bG9hZClcbiAgICAvLyBjb25zb2xlLmxvZygnZXh0ZW5kZWQgbWV0aG9kcyAnLCBwYXlsb2FkLmFjdGlvbiwgcGF5bG9hZCk7XG4gICAgdGhpcy5vcGVuU3BpZ290KHBheWxvYWQuYWN0aW9uLCBwYXlsb2FkKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWU19TUEFXTiBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQoYXR0YWNoRGF0YSkge1xuICAgIC8vIGxldCBjaGlsZFJlbmRlckRhdGEgPSBhdHRhY2hEYXRhO1xuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfU1BBV05fQU5EX0FUVEFDSF9UT19QQVJFTlQnLCBhdHRhY2hEYXRhKVxuICB9XG5cbiAgcmVuZGVyVmlldygpIHtcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ1ZTX1NQQVdOJylcbiAgfVxuXG4gIHJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCB0eXBlLCBhdHRhY2hUeXBlKSB7XG4gICAgY29uc3QgYXR0YWNoRGF0YSA9IHsgbm9kZSwgdHlwZSwgYXR0YWNoVHlwZSB9XG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTScsIHsgYXR0YWNoRGF0YSB9KVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFWFRJUlBBVEUgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY2hlY2tQYXJlbnREaXNwb3NlKHApIHtcbiAgICBpZiAocC5mcm9tJCA9PT0gJ3BhcmVudCcpIHtcbiAgICAgIHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0ocClcbiAgICB9XG4gIH1cblxuICBvbkJlZm9yZURpc3Bvc2UoKSB7XG5cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU0lOSyQgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICpcbiAgICogV3JhcHMgd2luZG93LnNldFRpbWVvdXQgd2l0aCBhIGNoZWNrIHRvIHNlZSBpZiBcInRoaXNcIiBWaWV3U3RyZWFtIGVsZW1lbnQgYW5kIGl0cyBwcm9wcyBwcm9wZXJ0eSBzdGlsbCBleGlzdHNcbiAgICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZm4gLSA9ICdmdW5jdGlvbic7IFRoZSBsb2NhbCBtZXRob2QgdGhhdCBpcyB0byBiZSBjYWxsZWQuXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtcyAtID0gMDsgIFRoZSB0aW1lLCBpbiBtaWxsZXNlY29uZHMsIGZvciB0aGUgdGltZW91dC5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBiaW5kIC0gPSBmYWxzZTsgIFdoZW4gdHJ1ZSwgd2lsbCBiaW5kIHRoZSBtZXRob2QgdG8gJ3RoaXMnLlxuICAgKlxuICAgKi9cblxuICBzZXRUaW1lb3V0KGZuLCBtcyA9IDAsIGJpbmQgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRpbWVvdXRNZXRob2QgPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKHRoaXMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kRm4gPSBiaW5kID09PSB0cnVlID8gZm4uYmluZCh0aGlzKSA6IGZuXG4gICAgICAgIGFwcGx5KG1ldGhvZEZuLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgICB3aW5kb3cuc2V0VGltZW91dCh0aW1lb3V0TWV0aG9kLCBtcylcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBCZWdpbnMgdGhlIHJlbW92YWwgcHJvY2VzcyBvZiB0aGUgVmlld1N0cmVhbSBpbnN0YW5jZSBhbG9uZyB3aXRoIGFsbCBvZiBpdHMgY2hhaW5lZCBWaWV3U3RyZWFtIGNoaWxkcmVuLlxuICAgKi9cbiAgZGlzcG9zZVZpZXdTdHJlYW0ocCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdFWFRJUlBBVEVSIFZTIG9uRGlzcG9zZSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMub25CZWZvcmVEaXNwb3NlKClcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ0VYVElSUEFURScpXG4gIH1cblxuICBvbkNoaWxkRGlzcG9zZShwKSB7XG4gIH1cblxuICBvblBhcmVudERpc3Bvc2luZyhwKSB7XG4gICAgLy8gdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24odGhpcy5fc291cmNlJCk7XG4gICAgdGhpcy5vcGVuU3BpZ290KCdFWFRJUlBBVEUnKVxuICB9XG5cbiAgb25SZWFkeVRvR0MocCkge1xuICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBwLmZyb20kICE9PSB1bmRlZmluZWQgJiYgcC5mcm9tJCA9PT0gJ2ludGVybmFsJ1xuICAgIGlmIChpc0ludGVybmFsKSB7XG4gICAgICAvLyB0aGlzLm9wZW5TcGlnb3QoJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnKTtcbiAgICB9XG4gICAgdGhpcy50cmFjZXIoJ29uUmVhZHlUb0dDJywgaXNJbnRlcm5hbCwgcClcbiAgfVxuXG4gIG9wZW5TcGlnb3QoYWN0aW9uLCBvYmogPSB7fSkge1xuICAgIGlmICh0aGlzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucHJvcHMuYWN0aW9uID0gYWN0aW9uXG4gICAgICBjb25zdCBkYXRhID0gbWVyZ2VSaWdodCh0aGlzLnByb3BzLCBvYmopXG4gICAgICAvLyBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIG9iaik7XG5cbiAgICAgIHRoaXMuc2luayQubmV4dChPYmplY3QuZnJlZXplKGRhdGEpKVxuICAgIH1cbiAgfVxuXG4gIHNldEF0dGFjaERhdGEoYXR0YWNoVHlwZSwgcXVlcnkpIHtcbiAgICBjb25zdCBjaGVja1F1ZXJ5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgcSA9IHRoaXMucHJvcHMuZWwucXVlcnlTZWxlY3RvcihxdWVyeSlcbiAgICAgIGNvbnN0IGlzRGV2TW9kZSA9IFZpZXdTdHJlYW0uaXNEZXZNb2RlKClcbiAgICAgIGlmIChpc0Rldk1vZGUgPT09IHRydWUgJiYgaXMoU3RyaW5nLCBxdWVyeSkgJiYgaXNOaWwocSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYXBwZW5kVmlldyBxdWVyeSBpbiAke3RoaXMucHJvcHMubmFtZX0sICcke3F1ZXJ5fScsIGFwcGVhcnMgdG8gbm90IGV4aXN0IWApXG4gICAgICB9XG4gICAgICByZXR1cm4gcVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBub2RlOiB0aGlzLnByb3BzLmVsLFxuICAgICAgdHlwZTogJ1ZpZXdTdHJlYW1PYnNlcnZhYmxlJyxcbiAgICAgIGF0dGFjaFR5cGUsXG4gICAgICBxdWVyeTogY2hlY2tRdWVyeShxdWVyeSlcbiAgICB9XG4gIH1cblxuICBnZXRQYXJlbnRFbHMoZWwsIG51bSkge1xuICAgIGNvbnN0IGdldEVsZW0gPSBlbCA9PiBlbC5wYXJlbnRFbGVtZW50XG4gICAgbGV0IGl0ZXIgPSAwXG4gICAgbGV0IHBhcmVudEVsID0gZWxcbiAgICB3aGlsZSAoaXRlciA8IG51bSkge1xuICAgICAgcGFyZW50RWwgPSBnZXRFbGVtKHBhcmVudEVsKVxuICAgICAgaXRlcisrXG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRFbFxuICB9XG5cbiAgc2V0QXR0YWNoUGFyZW50RGF0YShhdHRhY2hUeXBlLCBxdWVyeSwgbGV2ZWwpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5ICE9PSAnJyA/IHF1ZXJ5IDogdW5kZWZpbmVkXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0UGFyZW50RWxzKHRoaXMucHJvcHMuZWwsIGxldmVsKVxuICAgIHJldHVybiB7XG4gICAgICBub2RlLFxuICAgICAgdHlwZTogJ1ZpZXdTdHJlYW1PYnNlcnZhYmxlJyxcbiAgICAgIGF0dGFjaFR5cGUsXG4gICAgICBxdWVyeTogbm9kZS5xdWVyeVNlbGVjdG9yKHF1ZXJ5KVxuICAgIH1cbiAgfVxuXG4gIG9uTWFwVmlld1NvdXJjZShwYXlsb2FkID0ge30pIHtcbiAgICB0aGlzLnByb3BzID0gbWVyZ2VSaWdodCh0aGlzLnByb3BzLCBwYXlsb2FkKVxuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEFUVEFDSCBTVFJFQU0gQU5EIERPTSBEQVRBIEFHR1JFR0FUT1JTPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZChjaGlsZFZpZXcsIGF0dGFjaERhdGEpIHtcbiAgICB0aGlzLmFkZENoaWxkU3RyZWFtKGNoaWxkVmlldy5zb3VyY2VTdHJlYW1zLnRvUGFyZW50JClcbiAgICBjaGlsZFZpZXcuYWRkUGFyZW50U3RyZWFtKHRoaXMuc291cmNlU3RyZWFtcy50b0NoaWxkJCwgYXR0YWNoRGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgVmlld1N0cmVhbSBvYmplY3QgdG8gYW4gZXhpc3RpbmcgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqIDwvYm9keT5cbiAgICpcbiAgICogbGV0IHZpZXdTdHJlYW0gPSBuZXcgVmlld1N0cmVhbSgnaDInLCAnSGVsbG8gV29ybGQnKTtcbiAgICogdmlld1N0cmVhbS5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICovXG4gIGFwcGVuZFRvRG9tKG5vZGUpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcImFwcGVuZCB0byBkb20gXCIsdGhpcy5wcm9wcy52c2lkLCB0aGlzLnByb3BzLmVsKTtcbiAgICBpZiAodGhpcy5wcm9wcy5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBWaWV3U3RyZWFtLCAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBhbiBlbGVtZW50LCAke3RoaXMucHJvcHMuZWx9LCB0aGF0IGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgYXBwZW5kZWRUb0RvbS4gVGhpcyBtYXkgY3JlYXRlIHVuc3VzdWFsIHNpZGUgZWZmZWN0cyFgKVxuICAgIH1cbiAgICB0aGlzLnJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCAnZG9tJywgJ2FwcGVuZENoaWxkJylcbiAgfVxuXG4gIGFwcGVuZFRvRG9tQWZ0ZXIobm9kZSkge1xuICAgIGlmICh0aGlzLnByb3BzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIFZpZXdTdHJlYW0sICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGFuIGVsZW1lbnQsICR7dGhpcy5wcm9wcy5lbH0sIHRoYXQgaXMgYWxyZWFkeSByZW5kZXJlZCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBhcHBlbmRlZFRvRG9tQWZ0ZXIuIFRoaXMgbWF5IGNyZWF0ZSB1bnN1c3VhbCBzaWRlIGVmZmVjdHMhYClcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhZnRlcicpXG4gIH1cblxuICAvKipcbiAgICogUHJlcGVuZHMgdGhlIGN1cnJlbnQgVmlld1N0cmVhbSBvYmplY3QgdG8gYW4gZXhpc3RpbmcgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5wcmVwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqL1xuXG4gIHByZXBlbmRUb0RvbShub2RlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgVmlld1N0cmVhbSwgJHt0aGlzLnByb3BzLm5hbWV9LCBoYXMgYW4gZWxlbWVudCwgJHt0aGlzLnByb3BzLmVsfSwgdGhhdCBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHByZXBlbmRlZFRvRG9tLiBUaGlzIG1heSBjcmVhdGUgdW5zdXN1YWwgc2lkZSBlZmZlY3RzIWApXG4gICAgfVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAncHJlcGVuZENoaWxkJylcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QuIDxicj5BZnRlciB0aGUgYXR0YWNobWVudCwgcnhqcyBvYnNlcnZhYmxlcyBhcmUgZXhjaGFuZ2VkIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgVmlld1N0cmVhbSBvYmplY3RzLjxicj48YnI+XG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBjaGlsZCB0aGF0IGlzIHRvIGJlIGF0dGFjaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8bWFpbj5cbiAgICogICAgICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqICAgIDwvbWFpbj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKlxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBwYXJlbnRWaWV3LmFwcGVuZFZpZXcoY2hpbGRWaWV3KVxuICAgKlxuICAgKiAqL1xuICBhcHBlbmRWaWV3KHYsIHF1ZXJ5KSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsIHRoaXMuc2V0QXR0YWNoRGF0YSgnYXBwZW5kQ2hpbGQnLCBxdWVyeSkpXG4gIH1cblxuICBhcHBlbmRWaWV3QWZ0ZXIodiwgcXVlcnkpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodiwgdGhpcy5zZXRBdHRhY2hEYXRhKCdhZnRlcicsIHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gYSBwYXJlbnQgVmlld1N0cmVhbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBwYXJlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICogQHBhcmFtIHtsZXZlbH0gdGhpcyBwYXJhbWV0ZXJzIGNhbiBhdHRhY2ggdGhlIHZpZXdTdHJlYW0ncyBkb20gZWxlbWVudCB1cCB0aGUgZG9tIHRyZWUgd2hpbGUgc3RpbGwgbWFpbnRhaW5pbmcgdGhlIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAgb2YgdGhlIFZpZXdTdHJlYW0gb2JqZWN0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxtYWluPlxuICAgKiAgICAgICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogICAgPC9tYWluPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIGNoaWxkVmlldy5hcHBlbmRUb1BhcmVudChwYXJlbnRWaWV3KVxuICAgKlxuICAgKiAqL1xuXG4gIGFwcGVuZFZpZXdUb1BhcmVudEVsKHYsIHF1ZXJ5LCBsZXZlbCA9IDEpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodixcbiAgICAgIHRoaXMuc2V0QXR0YWNoUGFyZW50RGF0YSgnYXBwZW5kQ2hpbGQnLCBxdWVyeSwgbGV2ZWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHByZXBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gYSBwYXJlbnQgVmlld1N0cmVhbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxldmVsXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7Vmlld1N0cmVhbX0gdiAtID0gdW5kZWZpbmVkOyB0aGUgVmlld1N0cmVhbSBwYXJlbnQuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeSAtID0gdW5kZWZpbmVkOyBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGxldmVsIC0gPSAxOyB0aGlzIHBhcmFtZXRlciBjYW4gYXR0YWNoIHRoZSB2aWV3U3RyZWFtJ3MgZG9tIGVsZW1lbnQgdXAgdGhlIGRvbSB0cmVlIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIHRoZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIG9mIHRoZSBWaWV3U3RyZWFtIG9iamVjdHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5wcmVwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBjaGlsZFZpZXcucHJlcGVuZFZpZXdUb1BhcmVudEVsKHBhcmVudFZpZXcpXG4gICAqXG4gICAqICovXG4gIHByZXBlbmRWaWV3VG9QYXJlbnRFbCh2LCBxdWVyeSwgbGV2ZWwgPSAxKSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsXG4gICAgICB0aGlzLnNldEF0dGFjaFBhcmVudERhdGEoJ3ByZXBlbmRDaGlsZCcsIHF1ZXJ5LCBsZXZlbCkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogVGhpcyBtZXRob2QgcHJlcGVuZHMgYSBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdCB0byB0aGUgY3VycmVudCBWaWV3U3RyZWFtIG9iamVjdC4gPGJyPkFmdGVyIHRoZSBhdHRhY2htZW50LCByeGpzIG9ic2VydmFibGVzIGFyZSBleGNoYW5nZWQgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdHMuPGJyPjxicj5cbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtfSB2IHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxtYWluPlxuICAgKiAgICAgICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogICAgPC9tYWluPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIHBhcmVudFZpZXcucHJlcGVuZFZpZXcoY2hpbGRWaWV3KTtcbiAgICpcbiAgICogKi9cblxuICBwcmVwZW5kVmlldyh2LCBxdWVyeSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LCB0aGlzLnNldEF0dGFjaERhdGEoJ3ByZXBlbmRDaGlsZCcsIHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiAgQXBwZW5kcyBhIFZpZXdTdHJlYW0gb2JqZWN0IHRoYXQgYXJlIG5vdCByZW5kZXJlZCB0byB0aGUgI3NweW5lLW51bGwtdmlld3MgZGl2LlxuICAgKi9cbiAgYXBwZW5kVG9OdWxsKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3B5bmUtbnVsbC12aWV3cycpXG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhcHBlbmRDaGlsZCcpXG4gIH1cblxuICBvblZTUmVuZGVyZWQocGF5bG9hZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdWU19TUEFXTjogJywgdGhpcy5wcm9wcy5uYW1lLCBwYXlsb2FkKTtcbiAgICBpZiAocGF5bG9hZC5mcm9tJCA9PT0gJ2ludGVybmFsJykge1xuICAgICAgLy8gdGhpcy5wcm9wc1snZWwnXSA9IHBheWxvYWQuZWwuZWw7XG5cbiAgICAgIHRoaXMucG9zdFJlbmRlcigpXG4gICAgICAvLyB0aGlzLmJyb2FkY2FzdGVyID0gbmV3IFNweW5lLlZpZXdTdHJlYW1Ccm9hZGNhc3Rlcih0aGlzLnByb3BzLCB0aGlzLmJyb2FkY2FzdEV2ZW50cyk7XG4gICAgfVxuICB9XG5cbiAgcG9zdFJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5fcG9zdFJlbmRlcmVkQ2FsbGVkID09PSB0cnVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmJlZm9yZUFmdGVyUmVuZGVyKClcbiAgICB0aGlzLmFmdGVyUmVuZGVyKClcblxuICAgIHRoaXMub25SZW5kZXJlZCgpXG4gICAgY29uc3Qgc3RhcnRBbmltRnJhbWVBZnRlclJlbmRlcmVkID0gKCkgPT4gdGhpcy5vbkFuaW1GcmFtZUFmdGVyUmVuZGVyZWQoKVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGFydEFuaW1GcmFtZUFmdGVyUmVuZGVyZWQpXG5cbiAgICBpZiAodGhpcy5pc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGV2ZW50c0FyciA9IHRoaXMuYnJvYWRjYXN0RXZlbnRzKClcbiAgICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBWaWV3U3RyZWFtLmlzVmFsaWROZXN0ZWRBcnIoZXZlbnRzQXJyKVxuICAgICAgaWYgKGlzVmFsaWRBcnIgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFycmF5IHJldHVybmVkIGZyb20gYnJvYWRjYXN0RXZlbnRzIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgJyR7SlNPTi5zdHJpbmdpZnkoZXZlbnRzQXJyKX0nLCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgcHJvcGVybHkgZm9ybWF0dGVkIWApXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZUNoYW5uZWxzKClcbiAgICB0aGlzLnZpZXdzU3RyZWFtQnJvYWRjYXN0ZXIgPSBuZXcgVmlld1N0cmVhbUJyb2FkY2FzdGVyKHRoaXMucHJvcHMsIHRoaXMuYnJvYWRjYXN0RXZlbnRzLmJpbmQodGhpcykpXG4gICAgdGhpcy5hZnRlckJyb2FkY2FzdEV2ZW50cygpXG5cbiAgICB0aGlzLl9wb3N0UmVuZGVyZWRDYWxsZWQgPSB0cnVlXG4gIH1cblxuICBhZGRUcmFpdHModHJhaXRzKSB7XG4gICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICB0cmFpdHMgPSBbdHJhaXRzXVxuICAgIH1cbiAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgIH1cblxuICAgIHRyYWl0cy5mb3JFYWNoKGFkZFRyYWl0KVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1FVEhPRFMgVE8gQkUgRVhURU5ERUQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgYWZ0ZXJCcm9hZGNhc3RFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBwdWxsQWN0aW9uc0Zyb21MaXN0ID0gKGFycikgPT4gYXJyWzBdXG4gICAgICBjb25zdCBuZXN0ZWRBY3Rpb25zQXJyID0gdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKVxuXG4gICAgICBjb25zdCBhY3Rpb25zQXJyID0gbmVzdGVkQWN0aW9uc0Fyci5tYXAocHVsbEFjdGlvbnNGcm9tTGlzdClcblxuICAgICAgY29uc3QgaXNWYWxpZEFyciA9IFZpZXdTdHJlYW0uaXNWYWxpZE5lc3RlZEFycihuZXN0ZWRBY3Rpb25zQXJyKVxuXG4gICAgICBpZiAoaXNWYWxpZEFyciA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYXJyYXkgcmV0dXJuZWQgZnJvbSBhZGRBY3Rpb25zTGlzdGVuZXJzIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgJyR7SlNPTi5zdHJpbmdpZnkobmVzdGVkQWN0aW9uc0Fycil9JywgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHByb3Blcmx5IGZvcm1hdHRlZCFgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2hlY2tGb3JFeGlzdGluZ01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgICAgICBjb25zdCBtZXRob2QgPSBkZWZhdWx0VG8oJycsIGFyclsxXSlcbiAgICAgICAgICBjb25zdCBpc01ldGhvZCA9IGlzKEZ1bmN0aW9uLCB0aGlzW21ldGhvZF0pXG4gICAgICAgICAgaWYgKGlzTWV0aG9kID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWV0aG9kIGluIGFkZEFjdGlvbkxpc3RlbmVycyBuZXN0ZWQgQXJyYXksICcke0pTT04uc3RyaW5naWZ5KGFycil9JywgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QhYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9zZShmb3JFYWNoKGNoZWNrRm9yRXhpc3RpbmdNZXRob2QpLCBkZWZhdWx0VG8oW10pKShuZXN0ZWRBY3Rpb25zQXJyKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWxheUZvclByb3h5Q2hhbm5lbFJlc2V0cyA9ICgpID0+IHtcbiAgICAgICAgaWYgKHBhdGgoWydwcm9wcycsICdhZGRlZENoYW5uZWxzJ10sIHRoaXMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBWaWV3U3RyZWFtLmNoZWNrSWZBY3Rpb25zQXJlUmVnaXN0ZXJlZC5iaW5kKHRoaXMpKHRoaXMucHJvcHMuYWRkZWRDaGFubmVscywgYWN0aW9uc0FycilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRUaW1lb3V0KGRlbGF5Rm9yUHJveHlDaGFubmVsUmVzZXRzLCA1MDApXG4gICAgfVxuICB9XG5cbiAgc2V0RGF0YVZTSUQoKSB7XG4gICAgdGhpcy5wcm9wcy5lbC5kYXRhc2V0LnZzaWQgPSB0aGlzLnByb3BzLnZzaWQvLyBTdHJpbmcodGhpcy5wcm9wcy52c2lkKS5yZXBsYWNlKC9eKHZzaWQtKSguKikkLywgJyQyJyk7XG4gIH1cblxuICBiZWZvcmVBZnRlclJlbmRlcigpIHtcbiAgICAvKiAgICBsZXQgZG0yID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RyID0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRG9tSXRlbVNlbGVjdG9ycyhlbCwgc3RyKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9OyAqL1xuXG4gICAgLy8gdGhpcy5wcm9wcy5lbCQgPSBkbTIodGhpcy5wcm9wcy5lbCk7XG4gICAgdGhpcy5zZXREYXRhVlNJRCgpXG4gICAgdGhpcy5wcm9wcy5lbCQgPSBWaWV3U3RyZWFtU2VsZWN0b3IodGhpcy5wcm9wcy5lbClcbiAgICAvLyBjb25zb2xlLmxvZygnRUwgSVMgJywgdGhpcy5wcm9wcy5lbCQuZWxBcnIpO1xuICAgIC8vIHdpbmRvdy50aGVFbCQgPSB0aGlzLnByb3BzLmVsJDtcbiAgfVxuXG4gIC8vIFRISVMgSVMgQU4gRVZFTlQgSE9MREVSIE1FVEhPRCBCRUNBVVNFIFNFTkRJTkcgRE9XTlNUUkVBTSBSRVFVSVJFIFRIRSBQQVJFTlQgVE8gSEFWRSBBIE1FVEhPRFxuICBkb3duU3RyZWFtKCkge1xuXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqXG4gICAqL1xuXG4gIG9uUmVuZGVyZWQoKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGFkZCBhbmltYXRpb24gY2xhc3NlcyB0byBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVuZGVyaW5nLlxuICAgKlxuICAgKi9cblxuICBvbkFuaW1GcmFtZUFmdGVyUmVuZGVyZWQoKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogKERlcHJlY2F0ZWQuIFVzZSBvblJlbmRlcmVkKS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqXG4gICAqL1xuXG4gIGFmdGVyUmVuZGVyKCkge1xuICB9XG5cbiAgYnJvYWRjYXN0RXZlbnRzKCkge1xuICAgIC8vIEFERCBCVVRUT04gRVZFTlRTIEFTIE5FU1RFRCBBUlJBWVNcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGNvbm5lY3QgdG8gYW4gaW5zdGFuY2Ugb2YgcmVnaXN0ZXJlZCBjaGFubmVscywgc3VjaCBhcyAnRE9NJywgJ1VJJywgYW5kICdST1VURScgY2hhbm5lbHMuXG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGxldCB1aUNoYW5uZWwgPSB0aGlzLmdldENoYW5uZWwoJ1VJJyk7XG4gICAqXG4gICAqIHVpQ2hhbm5lbFxuICAgKiAgICAuZmlsdGVyKChwKSA9PiBwLmRhdGEuaWQ9PT0nI215LWJ1dHRvbicpXG4gICAqICAgIC5zdWJzY3JpYmUoKHApID0+IGNvbnNvbGUubG9nKCdteSBidXR0b24gd2FzIGNsaWNrZWQgJywgcCkpO1xuICAgKlxuICAgKiAqL1xuXG4gIGdldENoYW5uZWwoY2hhbm5lbCkge1xuICAgIGNvbnN0IGlzVmFsaWRDaGFubmVsID0gYyA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhjKVxuICAgIGNvbnN0IGVycm9yID0gYyA9PiBjb25zb2xlLndhcm4oXG4gICAgICAgIGBjaGFubmVsIG5hbWUgJHtjfSBpcyBub3Qgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbU5hbWVzfWApXG4gICAgY29uc3Qgc3RhcnRTdWJzY3JpYmUgPSAoYykgPT4ge1xuICAgICAgY29uc3Qgb2JzJCA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC5nZXRTdHJlYW0oYykub2JzZXJ2ZXJcblxuICAgICAgcmV0dXJuIG9icyQucGlwZSh0YWtlV2hpbGUocCA9PiB0aGlzLmRlbGV0ZWQgIT09IHRydWUpKVxuICAgIH0vLyBnZXRHbG9iYWxQYXJhbSgnc3RyZWFtc0NvbnRyb2xsZXInKS5nZXRTdHJlYW0oYykub2JzZXJ2ZXI7XG5cbiAgICBjb25zdCBmbiA9IGlmRWxzZShpc1ZhbGlkQ2hhbm5lbCwgc3RhcnRTdWJzY3JpYmUsIGVycm9yKVxuXG4gICAgcmV0dXJuIGZuKGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogQ0hFQ0tTIFRPIFNFRSBJRiBDSEFOTkVMUyBIQVZFIEJFRU4gQURERUQgVE8gcHJvcHMuY2hhbm5lbHMgb2JqZWN0O1xuICAgKi9cbiAgaW5pdGlhbGl6ZUNoYW5uZWxzKCkge1xuICAgIGNvbnN0IGFkZENoYW5uZWwgPSAoY2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3QgW2NoYW5uZWxOYW1lLCBza2lwRmlyc3QgPSBmYWxzZV0gPSBBcnJheS5pc0FycmF5KGNoYW5uZWwpID8gY2hhbm5lbCA6IFtjaGFubmVsXVxuICAgICAgdGhpcz8uYWRkQ2hhbm5lbChjaGFubmVsTmFtZSwgc2tpcEZpcnN0KVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzPy5wcm9wcz8uY2hhbm5lbHMpKSB7XG4gICAgICB0aGlzPy5wcm9wcz8uY2hhbm5lbHM/LmZvckVhY2goYWRkQ2hhbm5lbClcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcz8ucHJvcHM/LmNoYW5uZWwpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3Byb3BzLmNoYW5uZWwgaXMgbm90IGEgVmlld1N0cmVhbSBwcm9wZXJ0eS4gRG8geW91IG1lYW4gcHJvcHMuY2hhbm5lbHM/JylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogUHJlZmVycmVkIG1ldGhvZCB0byBjb25uZWN0IHRvIGluc3RhbmNlcyBvZiByZWdpc3RlcmVkIGNoYW5uZWxzLCBzdWNoIGFzICdET00nLCAnVUknLCBhbmQgJ1JPVVRFJyBjaGFubmVscy5cbiAgICpcbiAgICogQWRkIENoYW5uZWwgd2lsbCBhdXRvbWF0aWNhbGx5IHVuc3Vic2NyaWJlIHRvIHRoZSBjaGFubmVsLCB3aGVyZWFzIHRoZSBnZXRDaGFubmVsIG1ldGhvZCByZXF1aXJlcyB0aGUgZGV2ZWxvcGVyIHRvIG1hbnVhbGx5IHVuc3Vic2NyaWJlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBuYW1lIG9mIHRoZSByZWdpc3RlcmVkIENoYW5uZWwgdGhhdCB3YXMgYWRkZWQgdG8gdGhlIENoYW5uZWxzIENvbnRyb2xsZXIuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYm9vbCBmYWxzZSwgYWRkIHRydWUgaWYgdGhlIFZpZXcgc2hvdWxkIHdhaXQgZm9yIHRoaXMgY2hhbm5lbCB0byB1bnN1YnNjcmliZSBiZWZvcmUgcmVtb3ZpbmcgaXRzZWxmLlxuICAgKiBAcGFyYW0ge3NlbmREb3duU3RyZWFtfSBib29sIFRoZSBkaXJlY3Rpb24gd2hlcmUgdGhlIHN0cmVhbSBpcyBhbGxvd2VkIHRvIHRyYXZlbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogbGV0IHJvdXRlQ2hhbm5lbCA9IHRoaXMuYWRkQ2hhbm5lbCgnUk9VVEUnKTtcbiAgICpcbiAgICogICAgICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICAgICAgICByZXR1cm4gW1xuICAgKiAgICAgICAgICAgICBbJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJywgJ29uTWFwUm91dGVFdmVudCddXG4gICAqICAgICAgICAgICBdXG4gICAqICAgICAgIH1cbiAgICpcbiAgICogICAgICAgb25NYXBSb3V0ZUV2ZW50KHApIHtcbiAgICogICAgICAgICAgY29uc29sZS5sb2coJ3RoZSByb3V0ZSB2YWx1ZSBpcyAnLCBwKTtcbiAgICogICAgICAgfVxuICAgKlxuICAgKlxuICAgKiAqL1xuXG4gIGFkZENoYW5uZWwoY2hhbm5lbE5hbWUsIHNraXBGaXJzdCA9IGZhbHNlLCBzZW5kRG93blN0cmVhbSA9IGZhbHNlLCBib29sID0gZmFsc2UpIHtcbiAgICBjb25zdCBkaXJlY3Rpb25BcnIgPSBzZW5kRG93blN0cmVhbSA9PT0gdHJ1ZSA/IHRoaXMuJGRpcnMuQ0kgOiB0aGlzLiRkaXJzLklcbiAgICBjb25zdCBtYXBEaXJlY3Rpb24gPSBwID0+IHtcbiAgICAgIC8vIGV0IHAyID0gZGVmYXVsdFRvKHt9LCBjbG9uZShwKSk7XG4gICAgICBjb25zdCBwbCA9IHAvLyB8fCB7fTtcbiAgICAgIHBsLiRkaXIgPSBkaXJlY3Rpb25BcnJcbiAgICAgIHJldHVybiBwbFxuICAgICAgLy8gcmV0dXJuIGRlZXBNZXJnZShkaXJPYmosIHAyKTtcbiAgICAgIC8vIE9iamVjdC5hc3NpZ24oeyRkaXI6IGRpcmVjdGlvbkFycn0sIGNsb25lKHApKVxuICAgIH1cbiAgICBpZiAodGhpcz8ucHJvcHM/LmFkZGVkQ2hhbm5lbHM/LmluY2x1ZGVzKGNoYW5uZWxOYW1lKSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gQ0hFQ0tTIElGIENIQU5ORUwgSEFTIEFMUkVBRFkgQkVFTiBBRERFRFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGlzTG9jYWxFdmVudENoZWNrID0gcGF0aChbJ3NyY0VsZW1lbnQnLCAnaXNMb2NhbEV2ZW50J10pXG4gICAgY29uc3QgY2lkQ2hlY2sgPSBwYXRoKFsnc3JjRWxlbWVudCcsICd2c2lkJ10pXG4gICAgY29uc3QgY2lkTWF0Y2hlcyA9IHAgPT4ge1xuICAgICAgY29uc3QgdnNpZCA9IGNpZENoZWNrKHApXG4gICAgICBjb25zdCBpc0xvY2FsRXZlbnQgPSBpc0xvY2FsRXZlbnRDaGVjayhwKVxuICAgICAgY29uc3QgZmlsdGVyRXZlbnQgPSBpc0xvY2FsRXZlbnQgIT09IHRydWUgfHwgdnNpZCA9PT0gdGhpcy5wcm9wcy52c2lkXG4gICAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNrcyBcIix2c2lkLHRoaXMucHJvcHMudnNpZCwgaXNMb2NhbEV2ZW50LGZpbHRlckV2ZW50KTtcbiAgICAgIHJldHVybiBmaWx0ZXJFdmVudFxuICAgIH1cblxuICAgIGNvbnN0IHBpcGVBcnIgPSBbbWFwKG1hcERpcmVjdGlvbiksIGZpbHRlcihjaWRNYXRjaGVzKV1cbiAgICBpZiAoc2tpcEZpcnN0ID09PSB0cnVlKSB7XG4gICAgICBwaXBlQXJyLnVuc2hpZnQoc2tpcCgxKSlcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsJCA9IHRoaXMuZ2V0Q2hhbm5lbChjaGFubmVsTmFtZSkucGlwZSguLi5waXBlQXJyKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKGNoYW5uZWwkLCBmYWxzZSlcbiAgICB0aGlzLnByb3BzLmFkZGVkQ2hhbm5lbHMucHVzaChjaGFubmVsTmFtZSlcbiAgfVxuXG4gIGNoZWNrSWZDaGFubmVsRXhpc3RzKGNoYW5uZWxOYW1lKSB7XG4gICAgY29uc3QgY2hhbm5lbEV4aXN0cyA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC50ZXN0U3RyZWFtKGNoYW5uZWxOYW1lKVxuICAgIGlmIChjaGFubmVsRXhpc3RzICE9PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNQWU5FIFdBUk5JTkc6IFRoZSBDaGFubmVsUGF5bG9hZCBmcm9tICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGJlZW4gc2VudCB0byBhIGNoYW5uZWwsICR7Y2hhbm5lbE5hbWV9LCB0aGF0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIWApXG4gICAgfVxuICAgIHJldHVybiBjaGFubmVsRXhpc3RzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNoYW5uZWxOYW1lIC0gPSB1bmRlZmluZWQ7IFRoZSBuYW1lIG9mIHRoZSByZWdpc3RlcmVkIENoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwYXlsb2FkIC0gPSB7fTsgVGhlIG1haW4gZGF0YSB0byBzZW5kIHRvIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIC0gPSBcIlZJRVdTVFJFQU1fRVZFTlRcIjsgVGhlIGFjdGlvbiBzZW50IHRvIHRoZSBjaGFubmVsLlxuICAgKiBAZGVzY1xuICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgdmVyc2F0aWxlIGFuZCBjb25zaXN0ZW50IG1ldGhvZCB0byBjb21tdW5pY2F0ZSB3aXRoIGFsbCBjaGFubmVscy5cbiAgICpcbiAgICpcbiAgICovXG5cbiAgc2VuZEluZm9Ub0NoYW5uZWwoY2hhbm5lbE5hbWUsIHBsID0ge30sIGFjdGlvbikge1xuICAgIGNvbnN0IHBheWxvYWQgPSBwbFxuXG4gICAgY29uc3QgZGVmYXVsdFRvQWN0aW9uID0gZGVmYXVsdFRvKCdWSUVXU1RSRUFNX0VWRU5UJylcbiAgICBjb25zdCBjaGFubmVsRGVmYXVsdEFjdGlvbkhhc2ggPSB7XG4gICAgICBDSEFOTkVMX1JPVVRFOiAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gICAgfVxuICAgIGNvbnN0IGdldEFjdGlvbkZuID0gY29tcG9zZShkZWZhdWx0VG9BY3Rpb24sIHByb3AoY2hhbm5lbE5hbWUpKVxuXG4gICAgYWN0aW9uID0gYWN0aW9uIHx8IGdldEFjdGlvbkZuKGNoYW5uZWxEZWZhdWx0QWN0aW9uSGFzaClcblxuICAgIGNvbnN0IGRhdGEgPSB7IHBheWxvYWQsIGFjdGlvbiB9XG5cbiAgICB0cnkge1xuICAgICAgZGF0YS5zcmNFbGVtZW50ID0gY29tcG9zZShwaWNrKFsnaWQnLCAndnNpZCcsICdjbGFzcycsICd0YWdOYW1lJ10pLCBwcm9wKCdwcm9wcycpKSh0aGlzKVxuICAgICAgaWYgKHRoaXMuY2hlY2tJZkNoYW5uZWxFeGlzdHMoY2hhbm5lbE5hbWUpID09PSB0cnVlKSB7XG4gICAgICAgIGlmICgvQ0hBTk5FTF9MSUZFQ1lDTEUvLnRlc3QoYWN0aW9uKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkYXRhLCB7XG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIGdldDogKCkgPT4gc2FmZUNsb25lKHBsKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JzJCA9IG9mKGRhdGEpXG4gICAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoY2hhbm5lbE5hbWUsIG9icyQsIGRhdGEpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdTUFlORSBXQVJOSU5HICcsIGUpXG4gICAgfVxuICB9XG5cbiAgdHJhY2VyKC4uLmFyZ3MpIHtcbiAgICB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2QoLi4uYXJncylcbiAgfVxuXG4gIHNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZSgpIHtcblxuICB9XG5cbiAgc2VuZExpZmVjeWNsZU1ldGhvZEFjdGl2ZSh2YWwsIHApIHtcbiAgICBjb25zdCBpc1JlbmRlcmVkID0gd2hlcmUoe1xuICAgICAgZnJvbSQ6IGVxdWFscygnaW50ZXJuYWwnKSxcbiAgICAgIGFjdGlvbjogZXF1YWxzKCdWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQnKVxuICAgIH0sIHApXG4gICAgY29uc3QgaXNEaXNwb3NlZCA9IHAgPT09ICdWU19ERVRSSVRVU19DT0xMRUNUJ1xuICAgIGlmIChpc1JlbmRlcmVkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNlbmRJbmZvVG9DaGFubmVsKCdDSEFOTkVMX0xJRkVDWUNMRScsIHsgYWN0aW9uOidDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcgfSwgJ0NIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UJylcbiAgICB9IGVsc2UgaWYgKGlzRGlzcG9zZWQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfTElGRUNZQ0xFJywgeyBhY3Rpb246J0NIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UJyB9LCAnQ0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQnKVxuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUFjdGlvbkZpbHRlcihzZWxlY3RvcnMsIGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IENoYW5uZWxQYXlsb2FkRmlsdGVyKHNlbGVjdG9ycywgZGF0YSlcbiAgfVxuXG4gIGlzTG9jYWxFdmVudChjaGFubmVsUGF5bG9hZEl0ZW0pIHtcbiAgICBjb25zdCBpdGVtRWwgPSBwYXRoKFsnc3JjRWxlbWVudCcsICdlbCddLCBjaGFubmVsUGF5bG9hZEl0ZW0pXG4gICAgY29uc3QgdGhpc0VsID0gcGF0aChbJ3Byb3BzJywgJ2VsJ10sIHRoaXMpXG4gICAgLy8gY29uc29sZS5sb2coJ3RoaXMgZWwgaXMgJyx7dGhpc0VsLCBpdGVtRWx9KTtcbiAgICByZXR1cm4gVmlld1N0cmVhbS5lbElzRG9tRWxlbWVudCh0aGlzRWwpICYmIFZpZXdTdHJlYW0uZWxJc0RvbUVsZW1lbnQoaXRlbUVsKSAmJiB0aGlzRWwuY29udGFpbnMoaXRlbUVsKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgTUlYSU5TXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBjb3JlTWl4aW5zID0gYmFzZUNvcmVNaXhpbnMoKVxuICAgIHRoaXMuY3JlYXRlSWQgPSBjb3JlTWl4aW5zLmNyZWF0ZUlkXG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNjM2X187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xMzFfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTMxX187IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJyZXF1aXJlIiwiZGVmaW5lIiwiYW1kIiwic2VsZiIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTMxX18iLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX182MzZfXyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUzMV9fIiwiQ2hhbm5lbEZldGNoIiwiY29uc3RydWN0b3IiLCJuYW1lIiwicHJvcHMiLCJ2YWxpZGF0ZU1hcE1ldGhvZCIsInVuZGVmaW5lZCIsIm1hcCIsIm1hcEZuIiwiZXh0ZW5kZWRBY3Rpb25zQXJyIiwic2VuZENhY2hlZFBheWxvYWQiLCJzdXBlciIsInRlc3RNb2RlIiwiaXNVbmRlZmluZWRPcldyb25nVHlwZSIsImVpdGhlciIsImlzTmlsIiwidmFsIiwiaXNVbmRlZmluZWQiLCJhbGwiLCJpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHkiLCJhbGxQYXNzIiwiYXJyIiwibGVuZ3RoIiwiY29tcG9zZSIsInZhbHVlcyIsInBpY2siLCJjb25zb2xlIiwid2FybiIsIm9uUmVnaXN0ZXJlZCIsInRoaXMiLCJwYXVzZSIsInN0YXJ0RmV0Y2giLCJhZGRSZWdpc3RlcmVkQWN0aW9ucyIsImV4dGVuZGVkQXJyIiwiZGVmYXVsdFRvIiwicGF0aCIsImNvbmNhdCIsIm9wdGlvbnMiLCJzdWJzY3JpYmVyIiwib25GZXRjaFJldHVybmVkIiwiYmluZCIsImZldGNoUHJvcHMiLCJjb25zb2xpZGF0ZUFsbEZldGNoUHJvcHMiLCJvbkZldGNoVXBkYXRlIiwiZXZ0IiwicHJvcHNPcHRpb25zIiwiZ2V0UHJvcHNGb3JGZXRjaCIsInN0cmVhbUl0ZW0iLCJjcmVhdGVDaGFubmVsUGF5bG9hZEl0ZW0iLCJwYXlsb2FkIiwiYWN0aW9uIiwidXJsIiwic3JjRWxlbWVudCIsInNlbmRDaGFubmVsUGF5bG9hZCIsImRhdGFPYmoiLCJmaWx0ZXJPdXRVbmRlZmluZWQiLCJyZWplY3QiLCJvMSIsIm8yIiwibWVyZ2VEZWVwUmlnaHQiLCJvYnNlcnZlciIsIm9ic2VydmVyJCIsIkNoYW5uZWxQYXlsb2FkIiwiY2hhbm5lbE5hbWUiLCJldmVudCIsInRpbWVMYWJlbCIsImNoYW5uZWwiLCJ0aW1lIiwiY2hhbm5lbFBheWxvYWRJdGVtT2JqIiwiZnJvemVuUGF5bG9hZCIsImRlZXBGcmVlemUiLCJkZWJ1ZyIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInBheWxvYWRTdHIiLCJKU09OIiwic3RyaW5naWZ5IiwiY2hhbm5lbEFjdGlvbnNBcnIiLCJnZXRDaGFubmVsQWN0aW9ucyIsInZhbGlkYXRlQWN0aW9uIiwiY2xvbmUiLCJtZXJnZUFsbCIsImNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzIiwiJGRpciIsImdldCIsIl9kaXIiLCJzZXQiLCJsb2NhdGlvbiIsImdldExvY2F0aW9uRGF0YSIsImRlZmluZVByb3BlcnRpZXMiLCJ0aW1lRW5kIiwiaXNJbkFyciIsImluY2x1ZGVzIiwiaW5pdGlhbGl6ZWQiLCJwaWNrQWxsIiwid2luZG93IiwiZ2V0U3RyZWFtSXRlbSIsImRlZXBDbG9uZSIsIm8iLCJpc0FyciIsImlzIiwiQXJyYXkiLCJpc09iaiIsIm9iIiwiZnJvbVBhaXJzIiwidG9QYWlycyIsImVsSXNEb21FbGVtZW50IiwibHRlIiwicHJvcCIsImZyZWV6ZSIsImdldE93blByb3BlcnR5TmFtZXMiLCJmb3JFYWNoIiwiaXNGcm96ZW4iLCJlIiwiZ2V0TW91c2VFdmVudEtleXMiLCJDaGFubmVsUHJveHkiLCJpc1Byb3h5Iiwic3ViamVjdCQiLCJTdWJqZWN0IiwicmVwbGF5U3ViJCIsIlJlcGxheVN1YmplY3QiLCJtZXJnZSIsImNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5IiwiZ2V0TWVyZ2VkU3ViamVjdCIsInBlcmlzdERhdGEiLCJsaXN0UmVnaXN0ZXJlZENoYW5uZWxzIiwicmVwbGF5U3ViamVjdCIsInN1YmplY3QiLCJDaGFubmVsIiwiQ0hBTk5FTF9OQU1FIiwiY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmoiLCJkZWZhdWx0QWN0aW9ucyIsImRhdGEiLCJpc1JlZ2lzdGVyZWQiLCJkZWZhdWx0Q2FjaGVkUGF5bG9hZEJvb2wiLCJyZXBsYXkiLCJzZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsIiwiY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMiLCJzdHJlYW1zQ29udHJvbGxlciIsImNoYW5uZWxzTWFwIiwiZ2V0TWFpbk9ic2VydmVyIiwiY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUiLCJkaXNwYXRjaGVyU3RyZWFtJCIsImdldFN0cmVhbSIsInBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSIsInByb3BFcSIsInBpcGUiLCJmaWx0ZXIiLCJzdWJzY3JpYmUiLCJvblJlY2VpdmVkT2JzZXJ2YWJsZSIsInRlc3RTdHJlYW0iLCJnZXRQcm94eVN1YmplY3QiLCJvbkNoYW5uZWxJbml0aWFsaXplZCIsImtleXMiLCJjaGFubmVsQWN0aW9ucyIsImNoZWNrRm9yVHJhaXRzIiwidHJhaXRzIiwiVHJhaXRDbGFzcyIsImFkZFRyYWl0cyIsImluaXRpYWxpemVTdHJlYW0iLCJhY3Rpb25zT2JqIiwiYWN0aW9uc09iaklzRW1wdHkiLCJpc0VtcHR5IiwiZGF0YUlzQWRkZWQiLCJhY3Rpb25TdHIiLCJzZXREZWZhdWx0QWN0aW9uc09iaiIsInNldFRyYWNlIiwiYm9vbCIsImdldEFjdGlvblZhbCIsImlmRWxzZSIsIlN0cmluZyIsImlkZW50aXR5IiwiaGVhZCIsIm1haW5BcnIiLCJvYmoiLCJjaGFpbiIsInN0ciIsIm9iak9mIiwiZGVsYXlDaGVja0lmVHJhaXRNZXRob2RIYXNCZWVuQWRkZWQiLCJtZXRob2RTdHIiLCJzZXRUaW1lb3V0IiwiZ2V0QXJyTWV0aG9kIiwiYWx3YXlzIiwidmlldyIsImxlbnNJbmRleCIsImNoYW5uZWxBY3Rpb25NZXRob2RzIiwib25JbmNvbWluZ09ic2VydmFibGUiLCJnZXRBY3Rpb25NZXRob2RGb3JPYnNlcnZhYmxlIiwidW5wYWNrZWQiLCJkZWZhdWx0Rm4iLCJvblZpZXdTdHJlYW1JbmZvIiwibWV0aG9kVmFsIiwiZm4iLCJlcXNOYW1lIiwiZXF1YWxzIiwib2JzVmFsIiwibWVyZ2VQcm9wcyIsImQiLCJvYnNlcnZhYmxlIiwib25TdWNjZXNzIiwib25FcnJvciIsIm9icyIsIm9icyQiLCJjaGFubmVsUGF5bG9hZEl0ZW0iLCJuZXh0IiwiZ2V0Q2hhbm5lbCIsInBheWxvYWRGaWx0ZXIiLCJjIiwibWVyZ2VDaGFubmVscyIsImNoYW5uZWxzQXJyIiwiZW1pdE9uY2UiLCJjaGFubmVsT2JzZXJ2YWJsZXMiLCJpdGVtIiwiY2hhbiQiLCJ0YWtlIiwiY29tYmluZWQkIiwiZm9ya0pvaW4iLCJFTVBUWSIsImZpcnN0JCIsInJlc3QkIiwiY29tYmluZUxhdGVzdFdpdGgiLCJyZXN1bHRzQXJyIiwiaWR4IiwiY2hlY2tGb3JOb3RUcmFja0ZsYWciLCJkb05vdFRyYWNrIiwiZG9Ob3RUcmFja0NoYW5uZWwiLCJyZWdpc3RlcmVkU3RyZWFtTmFtZXMiLCJyZWdpc3RlcmVkU3RlcHMiLCJyZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzIiwicmVnaXN0ZXJlZFN0cmVhbVR5cGVzIiwicmVnaXN0ZXJlZEFjdGlvbnMiLCJiYXNlVmFsaWRhdGlvbnMiLCJ2aWV3SW5mb1ZhbGlkYXRpb25zIiwidWlWYWxpZGF0aW9ucyIsImxpZmVzdHJlYW1WYWxpZGF0aW9ucyIsInN0ZXBWYWxpZGF0aW9ucyIsInN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMiLCJzdGVwVXBkYXRlVmFsaWRhdGlvbnMiLCJyb3V0ZVZhbGlkYXRpb25zIiwiU3RyZWFtc0NvbmZpZyIsIk9ic2VydmFibGUiLCJlcnJvciIsInByZWRpY2F0ZSIsImxpZmVTdHJlYW1WYWxpZGF0aW9ucyIsIlNURVAiLCJ0eXBlIiwidmlld0lkIiwiZGlzcG9zZUl0ZW1zIiwic3RyZWFtVmFsaWRhdGlvbnMiLCJnZXRSeFR5cGUiLCJzdHJlYW1zIiwiaW5pdCIsInN0cnVjdHVyZSIsInZhbGlkYXRpb25zIiwiX21hcCIsIk1hcCIsIkNoYW5uZWxzTWFwIiwiYWRkTWl4aW5zIiwiZ2V0Q2hhbm5lbHNMaXN0IiwiZnJvbSIsImsiLCJ2Iiwia2V5Iiwic2hvd09ubHlQcm94aWVzIiwicHJveHlNYXAiLCJyZWplY3RQcm94eUZuIiwiZmlsdGVyUHJveHlGbiIsInJlbW92ZWRQcm94eUFyciIsInBsdWNrIiwibGlzdFByb3h5Q2hhbm5lbHMiLCJjaGVja0Zvck1pc3NpbmdDaGFubmVscyIsImZpbHRlclByb3h5QXJyIiwiZmlsdGVyUHJlZml4V2FybmluZyIsImpvaW4iLCJjcmVhdGVNYWluU3RyZWFtcyIsInJvdXRlU3RyZWFtIiwidWlTdHJlYW0iLCJkb21TdHJlYW0iLCJ2aWV3U3RyZWFtTGlmZWN5Y2xlIiwiYWRkS2V5RXZlbnQiLCJyZWdpc3RlclN0cmVhbSIsImhhcyIsInBhdGhFcSIsImlzUmVwbGF5U3ViamVjdCIsInN1YmplY3RUeXBlIiwiU3B5bmVDaGFubmVsTGlmZWN5Y2xlIiwib25TZW5kRXZlbnQiLCJTcHluZUNoYW5uZWxSb3V0ZSIsInJvdXRlQ29uZmlnSnNvbiIsImdldFJvdXRlQ29uZmlnIiwiYmluZFN0YXRpY01ldGhvZHMiLCJuYXZUb1N0cmVhbSQiLCJpbmZvIiwib25NYXBOZXh0IiwiY29tcGFyZVJvdXRlS2V5d29yZHMiLCJjaGVja0NvbmZpZ0Zvckhhc2giLCJjb25maWciLCJjaGFubmVscyIsIlJPVVRFIiwiaXNIYXNoIiwiaW5pdFN0cmVhbSIsInVwZGF0ZVJvdXRlQ29uZmlnIiwibmV3Um91dGVzT2JqIiwibWVyZ2VSaWdodCIsImNvbmZvcm1Sb3V0ZUNvbmZpZyIsInJvdXRlQ29uZmlnIiwibmF2TGlua3MiLCJyb3V0ZURhdGFzZXRzQXJyIiwiYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSIsInNweW5lQ29uZmlnIiwiZmxhdHRlbkNvbmZpZ09iamVjdCIsInJvdXRlcyIsInBhcmFtc0FyciIsImZpcnN0TG9hZFN0cmVhbSQiLCJvbkluY29taW5nRG9tRXZlbnQiLCJjcmVhdGVQb3BTdGF0ZVN0cmVhbSIsImZpcnN0TG9hZGVkIiwicmVtb3ZlU1NJRCIsInJvdXRlTGVucyIsImxlbnNQcm9wIiwib3ZlciIsIm9taXQiLCJvbWl0U1NJRCIsImFjdG4iLCJDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCIsImV2ZW50Q291bnQiLCJpc0hpc3RvcnlDb3VudCIsIk51bWJlciIsImdldERhdGFGcm9tU3RyaW5nIiwicm91dGVDb3VudCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJlbnVtZXJhYmxlIiwia2V5d29yZEFycnMiLCJjb21wYXJlIiwicm91dGVEYXRhIiwicGF0aHMiLCJjaGVja0ZvclJvdXRlUGFyYW1zT3ZlcnJpZGVzIiwiY2hlY2tGb3JFdmVudE1ldGhvZHMiLCJtZXRob2RzQXJyIiwidGVzdCIsImdldE1ldGhvZHMiLCJtZXRob2RVcGRhdGUiLCJtYXRjaCIsInAxIiwicDIiLCJwMyIsInA0IiwidG9Mb3dlckNhc2UiLCJtZXRob2RTdHJSZXBsYWNlIiwicmVwbGFjZSIsInJ1bk1ldGhvZCIsIm0iLCJjaGVja0ZvckVuZFJvdXRlIiwicGwiLCJkZWJ1Z0Jvb2wiLCJpdGVyIiwib25SZWR1Y2VSb3V0ZVBhdGhzIiwiYWNjIiwicm91dGVQYXRoIiwicm91dGVOYW1lIiwicm91dGVOYW1lVmFsIiwia2V5c0FyciIsInByZWQiLCJhcnJTdHIiLCJSZWdFeHAiLCJmaW5kIiwiZ2V0UHJvcFZhbCIsIm5leHRSb3V0ZVBhdGgiLCJyZXZlcnNlIiwicmVkdWNlIiwicHVzaCIsImVuZFJvdXRlVmFsQXJyIiwiZW5kUm91dGVWYWwiLCJlbCIsImRhdGFzZXQiLCJkb21TdHJpbmdNYXAiLCJkb21TdHJpbmdNYXBUb09iamVjdCIsImdldERhdGFGcm9tUGFyYW1zIiwiY2hhbmdlTG9jYXRpb25Cb29sIiwiaXNIaWRkZW4iLCJzZW5kUm91dGVTdHJlYW0iLCJjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMiLCJyb3V0ZVZhbHVlIiwicmVnZXhUb2tlbk9iaiIsImNoYW5nZVdpbmRvd0xvYyIsInNldFdpbmRvd0xvY2F0aW9uIiwiZ2V0Um91dGVTdGF0ZSIsImdldElzRGVlcExpbmtCb29sIiwiaXNIaXN0b3J5IiwiX3JvdXRlQ291bnQiLCJnZXRSb3V0ZUNvdW50IiwiZ2V0RXh0cmFQYXlsb2FkUGFyYW1zIiwiaXNEZWVwTGluayIsInJvdXRlVHlwZSIsImdldFJvdXRlU3RyRnJvbVBhcmFtcyIsImdldFByb3BGcm9tQ29uZmlnIiwicHJwIiwiZGVmYWx0IiwidHlwZUZvclN0ciIsImlzSGFzaEZvclN0ciIsIm5leHRXaW5kb3dMb2MiLCJmb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uIiwiZGF0YUZyb21TdHIiLCJnZXREYXRhRnJvbUxvY2F0aW9uU3RyIiwicGF0aElubmVybW9zdCIsImhhc2hJc1RydWUiLCJnZXRMb2NhdGlvblN0ckJ5VHlwZSIsImdldFBhcmFtc0Zyb21Sb3V0ZVN0ciIsInQiLCJsb2MiLCJwYXJhbXNEYXRhIiwiY29udmVydFBhcmFtc1RvUm91dGUiLCJjb252ZXJ0Um91dGVUb1BhcmFtcyIsImNoZWNrRW1wdHlSb3V0ZVN0ciIsImlzRW1wdHlCb29sIiwicmVtb3ZlTGFzdFNsYXNoIiwiY2hhbm5lbFBheWxvYWQiLCJwYXRobmFtZSIsImhpc3RvcnkiLCJwdXNoU3RhdGUiLCJjaGVja0ZvclNsYXNoIiwid2hlbiIsImNvbXBsZW1lbnQiLCJfXyIsImdldFdpbmRvd0xvY2F0aW9uIiwiY3VycmllZEdldFJvdXRlIiwiY3VycnlOIiwiU3B5bmVDaGFubmVsVUkiLCJrZXlFdmVudHNMb2FkZWQiLCJrZXlDb2RlQXJyIiwibG9hZEtleVN0cmVhbSIsImtleVVwcyIsImZyb21FdmVudCIsImRvY3VtZW50Iiwia2V5UHJlc3NlcyQiLCJncm91cEJ5Iiwia2V5Q29kZSIsImluZGV4T2YiLCJyZXBlYXQiLCJvbktleVByZXNzZWQiLCJudW0iLCJyZWdpc3RlcktleSIsIm9uVUlFdmVudCIsImdldEFjdGlvblN0YXRlIiwidHlwZVZhbCIsInR5cGVPdmVyUmlkZVZhbCIsInRvVXBwZXIiLCJldmVudFR5cGUiLCJtYWluQWN0aW9uIiwiU3B5bmVDaGFubmVsV2luZG93IiwiY3VycmVudFNjcm9sbFkiLCJkb21DaGFubmVsQ29uZmlnIiwiV0lORE9XIiwib2JzJEFyciIsImdldEFjdGl2ZU9ic2VydmFibGVzIiwiZG9tJCIsInAiLCJnZXRNb3VzZVdoZWVsTWFwRm4iLCJDSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVCIsInNjcm9sbERpciIsImRlbHRhWSIsImRlbHRhWCIsImRlbHRhWiIsImNyZWF0ZUN1cnJpZWRHZW5lcmljRXZlbnQiLCJ0b1VwcGVyQ2FzZSIsImN1cnJ5IiwibWFwR2VuZXJpY0V2ZW50IiwiY3VycnlGbiIsImdldFJlc2l6ZU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UIiwiZ2V0T3JpZW50YXRpb25NYXBGbiIsIkNIQU5ORUxfV0lORE9XX09SSUVOVEFUSU9OX0VWRU5UIiwiaXNQb3J0cmFpdEJvb2wiLCJtYXRjaE1lZGlhIiwibWF0Y2hlcyIsIm9yaWVudGF0aW9uIiwiZ2V0TWVkaWFRdWVyeU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlQiLCJjcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZSIsImRlYm91bmNlVCIsImRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsIiwiY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCIsImRlYm91bmNlVGltZSIsImdldFNjcm9sbERhdGEiLCJzY3JvbGxZIiwic2Nyb2xsRGlzdGFuY2UiLCJnZXRTY3JvbGxZIiwic2Nyb2xsRWxlbWVudCIsInBhZ2VZT2Zmc2V0Iiwic2Nyb2xsVG9wIiwiZ2V0U2Nyb2xsTWFwRm4iLCJpbnRlcnZhbCIsInNjcm9sbERhdGFGbiIsImNyZWF0ZVNjcm9sbE9ic2VydmFibGUiLCJpc1Bhc3NpdmUiLCJkVGltZSIsImVsZW1lbnQiLCJpc1dpbmRvdyIsInNjcm9sbEVsRm9yVmFscyIsInNjcm9sbE1hcEZuIiwicGFydGlhbFJpZ2h0Iiwic2tpcFdoaWxlIiwibmV3U2Nyb2xsWSIsInNjcm9sbERpc3RhbmNlQWJzIiwiTWF0aCIsImFicyIsImNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZSIsImNyZWF0ZVJlc2l6ZU9ic2VydmFibGUiLCJkZWJvdW5jZU1TVGltZUZvclJlc2l6ZSIsImdldEV2ZW50c0Zyb21Db25maWciLCJldmVudHMiLCJsaXN0ZW5Gb3JNZWRpYVF1ZXJpZXMiLCJtZWRpYVF1ZXJpZXMiLCJtZXRob2RzIiwibGlzdGVuRm9yUmVzaXplIiwibGlzdGVuRm9yT3JpZW50YXRpb24iLCJsaXN0ZW5Gb3JTY3JvbGwiLCJsaXN0ZW5Gb3JXaGVlbCIsIm1hcE9iakluZGV4ZWQiLCJtZXRob2QiLCJpIiwiY2hlY2tGb3JNZWRpYVF1ZXJpZXMiLCJldmVudHNBcnIiLCJnZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSIsImNyZWF0ZU1lcmdlZE9ic0Zyb21PYmoiLCJhcHBseSIsIm9uU2Nyb2xsTG9ja0V2ZW50Iiwib25TZXRFbGVtZW50VG9TY3JvbGwiLCJjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlciIsIl9jaGFubmVscyIsInZlcnNpb24iLCJTcHluZUFwcCIsImRlZmF1bHRDb25maWciLCJzY3JvbGxMb2NrIiwic2Nyb2xsTG9ja1giLCJzY3JvbGxMb2NrWSIsInN0cmljdCIsImJhc2VIcmVmIiwiSU1HX1BBVEgiLCJwbHVnaW5NZXRob2RzIiwicGx1Z2lucyIsInRtcCIsImVwaGVtZXJhbFByb3BzIiwidG1wUHJvcHMiLCJsaXN0ZW5Gb3JNb3VzZVdoZWVsIiwiYWRkNDA0cyIsInJvdXRlVXRpbHMiLCJpbml0aWFsaXplIiwicGx1Z2luc0ZuIiwiZ2V0UGx1Z2luc01ldGhvZE9iaiIsInJlZ2lzdGVyQ2hhbm5lbCIsInJlZ2lzdGVyUGx1Z2luIiwicGx1Z2luSW5zdGFuY2UiLCJyZWdpc3RlckRhdGFDaGFubmVsIiwibGlzdENoYW5uZWxzIiwibnVsbEhvbGRlciIsImlkIiwiYXBwZW5kVG9Eb20iLCJib2R5Iiwic3R5bGUiLCJjc3NUZXh0IiwiU3B5bmUiLCJfc3B5bmVBcHBQcm9wcyIsIlNweW5lUGx1Z2luIiwicGFyZW50RWwiLCJtZXJnZURlZmF1bHRDb25maWciLCJjcmVhdGVQYXJlbnRFbCIsInJlZ2lzdGVyIiwic3B5bmVBcHBQcm9wcyIsInBsdWdpbk5hbWUiLCJvbkJlZm9yZVJlZ2lzdGVyZWQiLCJhZGRQbHVnaW5Db25maWciLCJvblJlbmRlciIsIlNweW5lQXBwUHJvcGVydGllcyIsImFzc2lnbiIsImdldFNweW5lQXBwIiwidXBkYXRlU3B5bmVDb25maWciLCJzcHluZUFwcCIsInBsdWdpbkNvbmZpZyIsInBhdGhTYXRpc2ZpZXMiLCJnZXRFbGVtZW50QnlJZCIsInBsdWdpbkVsIiwiYXBwZW5kQ2hpbGQiLCJyZW5kZXIiLCJjcmVhdGVQbHVnaW5FbCIsImNoZWNrRm9yUmVxdWlyZWRXaW5kb3dFdmVudCIsInJlcXVpcmVkRXZlbnRzIiwid2luZG93Q29uZmlnIiwiZ2V0Q2hhbm5lbENvbmZpZyIsIm1pc3NpbmdFdmVudHMiLCJDaGFubmVsRmV0Y2hVdGlsIiwiX21hcEZuIiwic2V0TWFwRm4iLCJfdXJsIiwic2V0VXJsIiwiX3Jlc3BvbnNlVHlwZSIsInNldFJlc3BvbnNlVHlwZSIsIl9zZXJ2ZXJPcHRpb25zIiwic2V0U2VydmVyT3B0aW9ucyIsIl9zdWJzY3JpYmVyIiwibG9nIiwic2VydmVyT3B0aW9ucyIsInJlc3BvbnNlVHlwZSIsInN0YXJ0V2luZG93RmV0Y2giLCJ0YXBMb2ciLCJyZXNwb25zZSQiLCJmZXRjaCIsInRhcCIsImZsYXRNYXAiLCJyIiwibWFwTWV0aG9kIiwibWV0YWRhdGEiLCJtYXBXcmFwcGVyIiwicHVibGlzaCIsImNvbm5lY3QiLCJvcHRzIiwiZ2V0Rm4iLCJzdHJpbmdpZnlCb2R5SWZJdEV4aXN0cyIsInByb3BJcyIsImNvbnZlcnRUb0pTT04iLCJ1cGRhdGVNZXRob2RXaGVuQm9keUV4aXN0cyIsImhhc0JvZHkiLCJtZXRob2RJc0dldCIsImFzc29jIiwibWVyZ2VkT3B0aW9ucyIsImJhc2VPcHRpb25zIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJBY2NlcHQiLCJtb2RlIiwiY3JlZGVudGlhbHMiLCJjYWNoZSIsInJlZGlyZWN0IiwicmVmZXJyZXIiLCJyZWZlcnJlclBvbGljeSIsImludGVncml0eSIsImtlZXBhbGl2ZSIsImlzTm90QXJyIiwibm90IiwiaXNOb3RFbXB0eSIsImlzTm9uRW1wdHlTdHIiLCJpc05vbkVtcHR5QXJyIiwiaXNPYmplY3RGbiIsImlzTm9uRW1wdHlPYmplY3RGbiIsIkNoYW5uZWxQYXlsb2FkRmlsdGVyIiwic2VsZWN0b3IiLCJmaWx0ZXJzIiwiZGVidWdMYWJlbCIsImRlYnVnTGFiZWxBcnIiLCJwcm9wRmlsdGVycyIsImFkZFN0cmluZ1NlbGVjdG9yRmlsdGVyIiwiZmlsdGVyU2VsZWN0b3IiLCJhZGRBcnJheVNlbGVjdG9yRmlsdGVyIiwiYWRkRGF0YUZpbHRlciIsImZpbHRlckRhdGEiLCJmaWx0ZXJzQXJyIiwiZmlsdGVyc0FyZUVtcHR5IiwiZmlsdGVySnNvbiIsImZpbHRlcmRlYnVnTGFiZWwiLCJmblZhbCIsIkYiLCJpc1N0cmluZyIsIkJvb2xlYW4iLCJpc0Jvb2xlYW4iLCJpc051bWJlciIsImNvbXBhcmVTdHIiLCJpc0FycmF5Rm4iLCJmTWV0aG9kIiwid2hlcmUiLCJjb21wYXJlZE9iaiIsInByb3BzQm9vbGVhbnMiLCJmb3JFYWNoT2JqSW5kZXhlZCIsImNvbXBhcmVEYXRhIiwiY2hlY2tQYXlsb2FkU2VsZWN0b3IiLCJzcmNQYXlsb2FkIiwic3JjIiwiY29tcGFyZUVscyIsImVsQ29tcGFyZSIsImlzRXF1YWxOb2RlIiwibWFwTm9kZUFycldpdGhFbCIsInNlbCIsIm5vZGVBcnIiLCJmbGF0dGVuIiwicXVlcnlTZWxlY3RvckFsbCIsIm5vZGVBcnJSZXN1bHRzRGVidWdnZXIiLCJzZWxlY3RvcnNBcnIiLCJub2RlQXJyUmVzdWx0IiwiYW55IiwicXVlcnlTZWxlY3RvciIsInNlbGVjdG9yQXJyIiwicGF5bG9hZENoZWNrIiwiaXNNZXJnZWFibGVPYmplY3QiLCJ0b1N0cmluZyIsImNsb25lSWZOZWNlc3NhcnkiLCJvcHRpb25zQXJndW1lbnQiLCJkZWVwTWVyZ2UiLCJpc0FycmF5IiwiZGVmYXVsdEFycmF5TWVyZ2UiLCJ0YXJnZXQiLCJzb3VyY2UiLCJkZXN0aW5hdGlvbiIsInNsaWNlIiwiYXJyYXkiLCJhcnJheU1lcmdlIiwibWVyZ2VPYmplY3QiLCJFcnJvciIsInByZXYiLCJkZWxheUNhbGwiLCJhc3luYyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiZ2V0Q29uc3RydWN0b3JOYW1lIiwic3Vic3RyIiwiZmluZFN0ck9yUmVnZXhNYXRjaFN0ciIsInMiLCJjaGVja2VySWZSZWdleE1hdGNoRXhpc3RzIiwiY29udmVydERvbVN0cmluZ01hcFRvT2JqIiwiZG9tTWFwIiwiY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCIsImlzTm90TmlsIiwiaXNOb3ROaWxBbmRJc05vdEVtcHR5IiwiZ2V0QWxsTWV0aG9kTmFtZXMiLCJpbnN0YW5jZSIsIm9taXR0ZWRNZXRob2RzIiwiY29tYmluZWRPbWl0dGVkTWV0aG9kcyIsIm9taXRQcm9wc0Zyb21BcnIiLCJ3aXRob3V0IiwidW5pcSIsInN0YXRpY01ldGhvZHMiLCJhbGxNZXRob2RzIiwiZ2MiLCJiYXNlQ29yZU1peGlucyIsImNyZWF0ZXByb3BzTWFwIiwid20iLCJXZWFrTWFwIiwib2JqS2V5IiwidnNpZCIsIndlYWtNYXAiLCJjcmVhdGVJZCIsInJhbmRvbSIsInN1YnN0cmluZyIsInNldFRyYWNlRnVuYyIsImJhc2VTdHJlYW1zTWl4aW5zIiwidGVzdEZ1bmMiLCJzZW5kUm91dGVQYXlsb2FkIiwic2VuZFVJUGF5bG9hZCIsIlJvdXRlQ2hhbm5lbFVwZGF0ZXIiLCJjeHQiLCJjcmVhdGVUZW1wb3JhcnlWaWV3U3RyZWFtT2JqIiwic2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSIsInZzIiwib25SZW5kZXJlZCIsInNlbmRJbmZvVG9DaGFubmVsIiwiYWZ0ZXJCcm9hZGNhc3RFdmVudHMiLCJkaXNwb3NlVmlld1N0cmVhbSIsImFwcGVuZFRvTnVsbCIsInNhZmVDbG9uZSIsIl9fcHJveHlfX3Byb3h5TmFtZSIsInByb3h5UmV2aXZlck1ldGhvZCIsImdldFByb3h5UmV2aXZlciIsInByb3h5T2JqIiwiY2xvbmVOZXN0ZWRQcm94eU9iaiIsInBhdGhBcnIiLCJuZXN0ZWRQcm94eU9iaiIsIl9fcHJveHlfX2lzUHJveHkiLCJfX3Byb3h5X19wcm9wcyIsInJvb3RPYmoiLCJwcm94eUl0ZXJhYmxlIiwiaXRlck9iaiIsIml0ZXJQYXRoIiwiZGF0YVBhdGgiLCJlbnRyaWVzIiwiZ2V0UHJvcFR5cGUiLCJjbG9uZWRQYXRoIiwiY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqIiwiX3Nhbml0aXplSFRNTCIsImlzQ29uZmlndXJlZCIsInNhbml0aXplSFRNTENvbmZpZ3VyZSIsInRydXN0ZWRUeXBlcyIsInBvbGljeSIsImNyZWF0ZVBvbGljeSIsImNyZWF0ZUhUTUwiLCJ0b19lc2NhcGUiLCJSRVRVUk5fVFJVU1RFRF9UWVBFIiwiaHRtbCIsIl9jb25maWciLCJfY2hhbm5lbHNNYXAiLCJfaW5pdGlhbGl6ZWQiLCJfZGVidWciLCJfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUiLCJfbmF2TGlua3MiLCJfSU1HX1BBVEgiLCJfZG9Ob3RUcmFja0NoYW5uZWxzQXJyIiwiX3Byb3hpZXNNYXAiLCJfc3B5bmVQbHVnaW5NZXRob2RzIiwiY29uZm9ybVJvdXRlT2JqZWN0Iiwic2V0Q2hhbm5lbHNNYXAiLCJzZXRIZWFkQmFzZUhyZWYiLCJiYXNlVGFnIiwiY3JlYXRlRWxlbWVudCIsImhyZWYiLCJhZGQ0MDRQcm9wcyIsInNldFByb3AiLCJpc1RlbXAiLCJnZXRQcm9wIiwidGVtcFZhbCIsImNyZWF0ZVRlbXBQcm9wIiwic2V0Q2hhbm5lbENvbmZpZyIsImNoYW5uZWxDb25maWciLCJhZGRQbHVnaW5NZXRob2RzIiwicGx1Z2luTWV0aG9kc09iaiIsImFkZE1ldGhvZHMiLCJnZXRVbnRyYWNrZWRDaGFubmVsc0xpc3QiLCJyZWdpc3RlclByb3h5UmV2aXZlciIsInByb3h5TmFtZSIsImdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZSIsImV4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlIiwibGlua3NEYXRhIiwidGVtcEdldENoYW5uZWxzSW5zdGFuY2UiLCJ0ZW1wR2V0Q29uZmlnIiwiX3BsdWdpbk1ldGhvZHNPYmoiLCJjcmVhdGUiLCJTcHluZVBsdWdpbnNNZXRob2RzIiwiZm9vIiwiYWRkTWV0aG9kIiwid2FyblN0ciIsIm1ldGhvZHNPYmoiLCJrZXlTdHIiLCJjaGVja0lmTWV0aG9kRXhpc3RzIiwiU3B5bmVUcmFpdCIsInBhcmVudENvbnRleHQiLCJwcmVmaXgiLCJhdXRvSW5pdCIsImF1dG9CaW5kZXIiLCJhbGxNZXRob2RzTGlzdCIsImluaXRBdXRvQmluZGVyIiwiZ2V0RW5oYW5jZXJNZXRob2RzIiwiY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzIiwibWFsZm9ybWVkTWV0aG9kc0FyciIsIndhcm5pbmdTdHIiLCJiaW5kUGFyZW50Vmlld1N0cmVhbSIsImNvbnRleHQiLCJiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSIsImlzU3RhdGljIiwiY29uc3RydWN0b3JUeXBlIiwiYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0iLCJiaW5kQ3VycnkiLCJTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIiwiY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgiLCJwYXJhbVZhbHVlIiwicm91dGVPYmoiLCJyZWplY3RQYXJhbUtleSIsInJlZ2V4TWF0Y2hTdHIiLCJjaGVja2VyIiwiaGFzaCIsInNlYXJjaCIsInByb3BWYWwiLCJzbGFzaCIsInF1ZXJ5IiwiY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMiLCJyb3V0ZSIsInBhcmFtc0Zyb21Mb2MiLCJ1cmxBcnIiLCJsb29wVGhyb3VnaFBhcmFtIiwidXJsT2JqIiwia2V5d29yZCIsInBhcmFtVmFsRnJvbURhdGEiLCJwYXJhbVZhbFR5cGUiLCJpc09iamVjdCIsIm9iamVjdFBhcmFtRXhpc3RzIiwib2JqZWN0Q29udGFpbnNSb3V0ZSIsIm5ld09iaiIsImNyZWF0ZVNsYXNoU3RyaW5nIiwiYXJyQ2xlYXIiLCJub3RVbmRlZmluZWQiLCJzdHJpcFJlZ2V4Iiwiam9pbmVyIiwiY3JlYXRlUXVlcnlTdHJpbmciLCJjcmVhdGVQYWlyIiwiY2hlY2tQYWlyIiwibWFwQXJyYXlPZlBhaXJzIiwiY2hlY2tJZlN0cklzRW1wdHkiLCJjcmVhdGVRcyIsImNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzIiwidXJsc0FyciIsInBhcnNlU3RyaW5nIiwiZ2V0T3ZlcnJpZGVWYWwiLCJvdmVycmlkZVZhbCIsImNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzIiwiaW5wdXQiLCJnZXRTdHJpbmdCZWZvcmVQaXBlIiwiY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2giLCJ1cGRhdGVkT2JqIiwiZ2xvYlBhdHRlcm4iLCJzcGxpdCIsInNvbWUiLCJwYXR0ZXJuIiwiZXNjYXBlZFBhdHRlcm4iLCJnbG9iUGF0dGVybk1hdGNoIiwibG9jU3RyIiwidXJsVHlwZSIsImxvY2F0aW9uU3RyIiwicGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiIsImZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgiLCJtYWluU3RyIiwiaXM0MDQiLCJjaGVja0ZvckVtcHR5IiwiY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2giLCJmaW5kTGFzdEluZGV4IiwicmUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJmaW5kTWF0Y2hJbmRleCIsImNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0iLCJyZWdleFRva2VucyIsImxhc3QiLCJnZXRWYWxDb21wYXJlQXJyIiwicGFyYW1JbmRleCIsInBhcmFtU3RyIiwicGFyYW0iLCJpbnZlcnRlZE9iaiIsImludmVydCIsInBhcmFtSW52ZXJ0ZWQiLCJnZXRQYXJhbUludmVydGVkIiwiY3JlYXRlQXJyRnJvbVNsYXNoU3RyIiwiY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaiIsInRvcExldmVsUm91dGUiLCJ2YWx1ZXNBcnIiLCJyb3V0ZWRWYWx1ZXNBcnIiLCJsYXRlc3RPYmoiLCJ0b3RhbCIsImN1cnJlbnRWYWx1ZSIsInJvdXRlVmFsdWVTdHIiLCJpc0VtcHR5T3JOaWwiLCJwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGgiLCJzdHJQYXRoIiwib2JqZWN0RnJvbVN0ciIsIm9iamVjdEZyb21Sb3V0ZVBhcmFtIiwiemlwT2JqIiwiZ2V0TGFzdEFyclZhbCIsImEiLCJjcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIiLCJjb252ZXJ0UXVlcnlTdHJUb1BhcmFtcyIsInN0ckFyciIsImNvbnZlcnRUb1BhcmFtcyIsIlNweW5lVXRpbHNDaGFubmVsUm91dGUiLCJzdWJzY3JpYmVGbiIsImZyb21FdmVudFBhdHRlcm4iLCJoYW5kbGVyIiwib25wb3BzdGF0ZSIsInBpY2tWYWx1ZXMiLCJvYmoxIiwib2JqMiIsImNyZWF0ZVByZWQiLCJnZXRQcm9wc1N0YXRlIiwic2FtZSIsInByZXZpb3VzRXhpc3RzIiwibmV4dEV4aXN0cyIsImNoYW5nZWQiLCJhZGRlZCIsInJlbW92ZWQiLCJwYXRoc0NoYW5nZWQiLCJwYXRoc0FkZGVkIiwicGF0aHNSZW1vdmVkIiwiZ2V0Q29tcGFyZXIiLCJnZXRSb3V0ZUFyckRhdGEiLCJyb3V0ZUFyciIsImdvIiwib2JqXyIsImtfIiwidl8iLCJhZGRSb3V0ZURhdGFzZXRzIiwiY2hhbm5lbFJvdXRlT2JqIiwiZ2V0SFJFRiIsImlzVmFsaWRTdHJSRSIsImNyZWF0ZUluaXRpYWxWYWxGbiIsImFjY01haW4iLCJyb3V0ZVBhdGhPYmoiLCJvYmpBY2MiLCJhcnJQYWlyIiwiZ2V0TGlua1RleHQiLCJjcmVhdGVUaXRsZSIsInN1YlJvdXRlTmFtZSIsIm9CYXNlIiwibmF2TGV2ZWwiLCJ0aXRsZSIsInJlZHVjZWRBcnIiLCJyb3V0ZU5hbWVzQXJyIiwiZGF0YXNldHNBcnIiLCJleGNsdWRlIiwiZ2V0TWFpbktleXMiLCJnZXROYXZQcm9wcyIsImNoYW5uZWxzUm91dGVQYXRoIiwicGFyc2VSb3V0ZVBhdGgiLCJjb25maWdNYXBwZXJGbiIsIm9iajQwNCIsImlzUm91dGVQYXRoIiwiZXh0cmFSb3V0ZURhdGEiLCJTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdyIsImV2ZW50TmFtZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXNzaXZlIiwiY3JlYXRlTWVkaWFRdWVyeSIsIm1xIiwiY2hlY2tJZlZhbGlkTWVkaWFRdWVyeSIsIm5vU3BhY2VzIiwiaXNWYWxpZEJvb2wiLCJtZWRpYSIsIndhcm5Nc2ciLCJtYXBLZXkiLCJtZWRpYVF1ZXJ5TmFtZSIsImtleUZuIiwibWVkaWFRdWVyeUhhbmRsZXIiLCJxIiwiYWRkSGFuZGxlciIsImFkZExpc3RlbmVyIiwicmVtb3ZlSGFuZGxlciIsIm9uY2hhbmdlIiwibWVkaWFRdWVyaWVzT2JqIiwiY3JlYXRlRmFkZXJJbmxpbmVUZXh0IiwiaXNJbkJvb2wiLCJzdGFydFplcm9Cb29sIiwiZmFkZWluIiwiY3VycmVudE9wYWNpdHkiLCJnZXRDb21wdXRlZFN0eWxlIiwib3BhY2l0eSIsImlubGluZUNzcyIsImZhZGVvdXQiLCJjYWxsYmFjayIsIlZpZXdTdHJlYW1PYnNlcnZhYmxlIiwib2JzZXJ2YWJsZVN0cmVhbXMiLCJjcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzIiwiY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0IiwiZGlySW50ZXJuYWwiLCJkaXJQYXJlbnQiLCJkaXJDaGlsZCIsIlAiLCJDIiwiUENJIiwiQ0kiLCJQSSIsIlBDIiwiYWRkRGVmYXVsdERpciIsImZsaXAiLCJkZWZhdWx0cyIsImFkZERvd25JbnRlcm5hbERpciIsImFkZENoaWxkQW5kSW50ZXJuYWxEaXIiLCJtYXBUb0RlZmF1bHREaXIiLCJ2aWV3TmFtZSIsImZpbHRlclN0cmVhbXMiLCJwcm9wU2F0aXNmaWVzIiwiYXJyVHlwZSIsImZpbHRlclBhcmVudCIsImZpbHRlckNoaWxkIiwiZmlsdGVySW50ZXJuYWwiLCJhZGRmcm9tJCIsInJlbFN0ciIsImZyb20kIiwiYWRkUGFyZW50ZnJvbSQiLCJhZGRJbnRlcm5hbGZyb20kIiwiYWRkQ2hpbGRmcm9tJCIsInJhdyQiLCJ0b0ludGVybmFsJCIsInRvUGFyZW50JCIsInRvQ2hpbGQkIiwic3RyZWFtT2JqIiwicGFyZW50IiwiaW50ZXJuYWwiLCJjaGlsZCIsImNvbXBsZXRlQWxsIiwiY29tcGxldGUiLCJpc1N0b3BwZWQiLCJjb21wbGV0ZVN0cmVhbSIsIkRvbUVsZW1lbnRUZW1wbGF0ZSIsInRlbXBsYXRlIiwiZm9ybWF0VGVtcGxhdGUiLCJpc1Byb3h5RGF0YSIsIl9fY21zX19pc1Byb3h5Iiwic3B5bmVEYXRhIiwiY2hlY2tGb3JBcnJheURhdGEiLCJ0ZW1wbGF0ZURhdGEiLCJnZXRTdHJpbmdBcnJheSIsInN0ck1hdGNoZXMiLCJmaW5kVG1wbExvb3BzUkUiLCJwYXJzZVRtcGxMb29wc1JFIiwicGFyc2VUbXBsTG9vcEZuIiwicGFyc2VUaGVUbXBsTG9vcCIsImZpbmRUbXBsTG9vcHNQcmVkIiwiY2hlY2tGb3JNYXRjaGVzIiwiYWRkUGFyYW1zIiwiZmluYWxBcnIiLCJpc1ByaW1pdGl2ZVRhZyIsImdldE5lc3RlZERhdGFSZWR1Y2VyIiwibmVzdGVkRGF0YSIsImVtcHR5UkUiLCJzd2FwUGFyYW1zRm9yVGFnc1JFIiwicmVtb3ZlVGhpcyIsInJlbmRlckRvY0ZyYWciLCJyZXBsYWNlSW1nUGF0aCIsImNyZWF0ZVJhbmdlIiwiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiwicmVuZGVyVG9TdHJpbmciLCJnZXRUZW1wbGF0ZVN0cmluZyIsImlubmVySFRNTCIsImdldERhdGFWYWxGcm9tUGF0aFN0ciIsInBhdGhTdHIiLCJkYXRhRmlsZSIsInRlbXBsYXRlU3RyIiwicmVwbGFjZUFsbCIsInJlRG90Iiwic3ViU3RyIiwiZWxEYXRhIiwiYXJyYXlTdHJpbmdUb09iakFkYXB0ZXIiLCJwYXJzZU9iamVjdCIsInNweW5lTG9vcEtleSIsImxvb3BJbmRleCIsImxvb3BOdW0iLCJfX2Ntc19fZGF0YUlkIiwib3JpZ0tleSIsImNyZWF0ZURhdGFPYmoiLCJpbmRleCIsIm9yaWdJbmRleCIsImRhdGFSZWR1Y2VkVmFsIiwiRG9tRWxlbWVudCIsInRhZ05hbWUiLCJhdHRyaWJ1dGVzIiwiZ2V0RG9tQXR0cmlidXRlcyIsImF0dHJzIiwidXBkYXRlQXR0cnMiLCJmcmFnbWVudCIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJzZXRFbEF0dHJzIiwicGFyYW1zIiwic2V0QXR0cmlidXRlIiwidGhlTWFwIiwiYWRkVGVtcGxhdGUiLCJmcmFnIiwiYWRkVG1wbCIsImFkZENvbnRlbnQiLCJ0ZXh0IiwidHh0IiwiY3JlYXRlVGV4dE5vZGUiLCJleGVjdXRlIiwicmVuZGVyVG9IVE1MU3RyaW5nIiwib3V0ZXJIVE1MIiwicmV0dXJuSWZEZWZpbmVkIiwidXBkYXRlcHJvcHMiLCJ1cGRhdGVwcm9wc0FuZFJ1biIsInVubW91bnQiLCJyZW1vdmUiLCJ1cGRhdGVUYWciLCJ1cGRhdGVBdHRyaWJ1dGVzIiwidXBkYXRlVGVtcGxhdGUiLCJ1cGRhdGVEYXRhIiwiYWRkVGFnQW5kUmVuZGVyIiwiYWRkQXR0cnNpYnV0ZXNBbmRSZW5kZXIiLCJhZGRUZW1wbGF0ZUFuZFJlbmRlciIsImFkZERhdGFBbmRSZW5kZXIiLCJjb3JlTWl4aW5zIiwiYXR0cmlidXRlc0FycmF5IiwiaXNEZXZNb2RlIiwiVmlld1N0cmVhbUJyb2FkY2FzdGVyIiwiYnJvYWRjYXN0Rm4iLCJicm9hZGNhc3RlciIsImFkZERibENsaWNrRXZ0IiwidHlwZU92ZXJSaWRlIiwiYnJvYWRjYXN0IiwiYXJncyIsImNoYW5uZWxQYXlsb2FkcyIsIlVJIiwibG9jYWwiLCJjaGVja1BhcmVudEVscyIsImVsU2VsZWN0ZWQiLCJwYXJlbnRFbGVtZW50IiwicGx1Y2tFbEZyb21QYXJlbnQiLCJpc0xvY2FsRXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsImNoIiwic3JjRXZlbnQiLCJhcnJGbiIsInN0cmVhbU1peGlucyIsIlZpZXdTdHJlYW1FbGVtZW50Iiwic2luayQiLCJ2aWV3UHJvcHMiLCJ2c05hbWUiLCJfc3RhdGUiLCJleHRlbmRlZEhhc2hNZXRob2RzIiwiYWRkQWN0aW9uTGlzdGVuZXJzIiwiZnVuY1N0ciIsImhhc2hNZXRob2RzIiwic2V0SGFzaE1ldGhvZHMiLCJvbk9ic1NpbmtTdWJzY3JpYmUiLCIkZGlycyIsInNvdXJjZVN0cmVhbXMiLCJfc291cmNlJCIsImV4dGVuZGVkSGFzaE1ldGhvZHNPYmoiLCJkZWZhdWx0SGFzaE1ldGhvZHMiLCJWU19ERVRSSVRVU19DT0xMRUNUIiwib25HYXJiYWdlQ29sbGVjdCIsIlJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUIiwib25SZWFkeUZvckdDIiwiRVhUSVJQQVRFIiwib25EaXNwb3NlIiwiVlNfU1BBV04iLCJWU19TUEFXTl9BTkRfQVRUQUNIX1RPX1BBUkVOVCIsIm9uUmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQiLCJWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTSIsIm9uUmVuZGVyQW5kQXR0YWNoVG9Eb20iLCJBVFRBQ0hfQ0hJTERfVE9fU0VMRiIsIm9uQXR0YWNoQ2hpbGRUb1NlbGYiLCJjcmVhdGVEb21JdGVtIiwib25EaXNwb3NlQ29tcGxldGVkIiwiYW5pbWF0ZUluVHdlZW4iLCJhbmltYXRlT3V0VHdlZW4iLCJzZXRBbmltYXRlSW4iLCJhbmltYXRlSW4iLCJkb21JdGVtIiwiYW5pbWF0ZUluVGltZSIsImRpc3Bvc2VNZXRob2QiLCJnY0RhdGEiLCJmYWRlT3V0T2JzIiwiYmluZENhbGxiYWNrIiwiYW5pbWF0ZU91dFRpbWUiLCJvbkZhZGVvdXRDb21wbGV0ZWQiLCJhbmltYXRlT3V0IiwicmVtb3ZlU3RyZWFtIiwiZ2V0U291cmNlU3RyZWFtIiwiY29tYmluZURvbUl0ZW1zIiwiY29udGFpbmVyIiwibm9kZSIsImFmdGVyIiwiYXR0YWNoVHlwZSIsImluc2VydEJlZm9yZSIsImZpcnN0Q2hpbGQiLCJjaGlsZFJlbmRlckRhdGEiLCJyZW5kZXJEb21JdGVtIiwiZ2V0RWwiLCJJIiwiZXh0ZW5kZWRNZXRob2RzIiwiYXR0YWNoRGF0YSIsImRlZmF1bHRUb0ZuIiwic2VuZERhdGEiLCJWaWV3U3RyZWFtUGF5bG9hZCIsInNlbmRUb0RpcmVjdG9yU3RyZWFtIiwiZGlyZWN0b3JTdHJlYW0kIiwiZ2V0RWxPckxpc3QiLCJ2ZXJib3NlQm9vbCIsImxpc3QiLCJnZXROb2RlTGlzdEFycmF5IiwidGVzdFNlbGVjdG9ycyIsInRyaW0iLCJpc1ZhbGlkU2VsZWN0b3IiLCJpc1ZhbGlkU2VsZWN0b3JCb29sIiwiaXNQYXJlbnQiLCJlbEFyciIsInJldHVyblNlbGVjdG9ySWZWYWxpZCIsInNldElubGluZUNzcyIsIlZpZXdTdHJlYW1TZWxlY3RvciIsImdlbmVyYXRlU3B5bmVTZWxlY3RvcklkIiwiYWRkQ2xhc3MiLCJjbGFzc0xpc3QiLCJhZGQiLCJyZW1vdmVDbGFzcyIsInNldENsYXNzIiwicmVtb3ZlQ2xhc3NTdHJBcnIiLCJjbGFzc05hbWUiLCJjbGFzc1N0ckFyciIsInRvZ2dsZUNsYXNzIiwiY29udGFpbnMiLCJ0b2dnbGUiLCJodG1sRWxlbWVudCIsImFkZEFuaW1DbGFzcyIsInNldEFjdGl2ZUl0ZW0iLCJlbFNlbCIsImN1cnJlbnRFbCIsIm5vZGVDaGVjayIsIlZpZXdTdHJlYW0iLCJ2c251bSIsIl9wb3N0UmVuZGVyQ2FsbGVkIiwic2VuZExpZmVjeWxlRXZlbnRzIiwiaGFzaElkIiwiaWQkIiwidmlld0NsYXNzIiwiZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHMiLCJhZGREZWZhdWx0RGlyZWN0aW9uIiwic2VuZExpZmVjeWNsZU1ldGhvZCIsInNlbmRMaWZlY3ljbGVNZXRob2RBY3RpdmUiLCJzZW5kTGlmZWN5Y2xlTWV0aG9kSW5hY3RpdmUiLCJhdHRyaWJ1dGVzQXJyIiwiZG9tQXR0cmlidXRlcyIsImxvYWRBbGxNZXRob2RzIiwiZWxJc0FscmVhZHlSZW5kZXJlZEJvb2wiLCJlbEFscmVhZHlFeGlzdHNGbiIsIlZpZXdDbGFzcyIsIl9yYXdTb3VyY2UkIiwic2VuZEV2ZW50c0Rvd25TdHJlYW0iLCJzZW5kRXZlbnRzRG93blN0cmVhbUZuIiwiaW5pdFZpZXdTdHJlYW0iLCJhZGRlZENoYW5uZWxzIiwiY2hlY2tJZkVsZW1lbnRBbHJlYWR5RXhpc3RzIiwic291cmNlJCIsImNoZWNrSWZBY3Rpb25zQXJlUmVnaXN0ZXJlZCIsImFjdGlvbnNBcnIiLCJjaGVja0Zvck1hdGNoIiwic3RyTWF0Y2giLCJmaW5kSW5kZXgiLCJnZXRBbGxBY3Rpb25zQXJyIiwiY2hhbm5lbFN5bnRheCIsImdldEFsbEFjdGlvbnMiLCJpc1ZhbGlkTmVzdGVkQXJyIiwiaXNUcnVlIiwiYWxsSXNUcnVlIiwiaXNWYWxpZEFyciIsIm1hcEV2ZW50c0FyckZuIiwidXBkYXRlUHJvcHNUb01hdGNoRWwiLCJnZXRUYWdOYW1lIiwidG9Mb3dlciIsInBvc3RSZW5kZXIiLCJjaGFubmVsRm4iLCJvbkNoYW5uZWxNZXRob2RDYWxsIiwiYWN0aW9uRmlsdGVyIiwiaGFzaFNvdXJjZU1ldGhvZHMiLCJzZXRTb3VyY2VIYXNoTWV0aG9kcyIsImRlbGV0ZWQiLCJmaWx0ZXJQYXlsb2FkIiwicnVuRnVuYyIsImhhc2hTb3VyY2VLZXlzIiwiRVhUSVJQQVRJTkciLCJjaGVja1BhcmVudERpc3Bvc2UiLCJWU19TUEFXTkVEIiwib25WU1JlbmRlcmVkIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UIiwib25SZWFkeVRvR0MiLCJWU19OVUxMSVRZIiwib25NYXBWaWV3U291cmNlIiwidGFrZVdoaWxlIiwibm90R0NTVEFURSIsImluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zIiwidXBkYXRlU291cmNlU3Vic2NyaXB0aW9uIiwiZXFHQ1NUQVRFIiwibm90Q09NUExFVEVEIiwibm90R0NDT01QTEVURSIsInRlc3RWYWwiLCJhZGRQYXJlbnRTdHJlYW0iLCJwYXJlbnQkIiwicmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQiLCJhZGRDaGlsZFN0cmVhbSIsImNoaWxkJCIsInRyYWNlciIsImZpbmFsaXplIiwib25DaGlsZENvbXBsZXRlZCIsIm9uQ2hpbGREaXNwb3NlZCIsImNoaWxkQ29tcGxldGVkRGF0YSIsIngiLCJmaW5hbERlc3QiLCJ5IiwiZmluZE5hbWUiLCJvblN1YnNjcmliZVRvU291cmNlc05leHQiLCJvblN1YnNjcmliZVRvU291cmNlc0Vycm9yIiwib25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZSIsImVsJCIsInViZXJTb3VyY2UkIiwiYXV0b1N1YnNjcmliZXIkIiwiZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkIiwib2JzQ291bnQiLCJhdXRvTWVyZ2VTdWJqZWN0JCIsIm1lcmdlTWFwIiwib2JzRGF0YSIsImJyYW5jaE9ic2VydmFibGUkIiwiYXV0b0Nsb3Nlc0Jvb2wiLCJyZWwiLCJzZW5kRXh0ZW5kZWRTdHJlYW1zIiwiaGFzaEFjdGlvblN0ciIsIm9wZW5TcGlnb3QiLCJyZW5kZXJWaWV3IiwicmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tIiwib25CZWZvcmVEaXNwb3NlIiwibXMiLCJtZXRob2RGbiIsIm9uQ2hpbGREaXNwb3NlIiwib25QYXJlbnREaXNwb3NpbmciLCJpc0ludGVybmFsIiwic2V0QXR0YWNoRGF0YSIsImNoZWNrUXVlcnkiLCJnZXRQYXJlbnRFbHMiLCJnZXRFbGVtIiwic2V0QXR0YWNoUGFyZW50RGF0YSIsImxldmVsIiwiZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCIsImNoaWxkVmlldyIsImFwcGVuZFRvRG9tQWZ0ZXIiLCJwcmVwZW5kVG9Eb20iLCJhcHBlbmRWaWV3IiwiYXBwZW5kVmlld0FmdGVyIiwiYXBwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlldyIsIl9wb3N0UmVuZGVyZWRDYWxsZWQiLCJiZWZvcmVBZnRlclJlbmRlciIsImFmdGVyUmVuZGVyIiwib25BbmltRnJhbWVBZnRlclJlbmRlcmVkIiwiYnJvYWRjYXN0RXZlbnRzIiwiaW5pdGlhbGl6ZUNoYW5uZWxzIiwidmlld3NTdHJlYW1Ccm9hZGNhc3RlciIsInB1bGxBY3Rpb25zRnJvbUxpc3QiLCJuZXN0ZWRBY3Rpb25zQXJyIiwiY2hlY2tGb3JFeGlzdGluZ01ldGhvZCIsIkZ1bmN0aW9uIiwiZGVsYXlGb3JQcm94eUNoYW5uZWxSZXNldHMiLCJzZXREYXRhVlNJRCIsImRvd25TdHJlYW0iLCJza2lwRmlyc3QiLCJhZGRDaGFubmVsIiwic2VuZERvd25TdHJlYW0iLCJkaXJlY3Rpb25BcnIiLCJpc0xvY2FsRXZlbnRDaGVjayIsImNpZENoZWNrIiwicGlwZUFyciIsImZpbHRlckV2ZW50IiwidW5zaGlmdCIsInNraXAiLCJjaGFubmVsJCIsImNoZWNrSWZDaGFubmVsRXhpc3RzIiwiY2hhbm5lbEV4aXN0cyIsImRlZmF1bHRUb0FjdGlvbiIsImdldEFjdGlvbkZuIiwiQ0hBTk5FTF9ST1VURSIsIm9mIiwiaXNEaXNwb3NlZCIsImNyZWF0ZUFjdGlvbkZpbHRlciIsInNlbGVjdG9ycyIsIml0ZW1FbCIsInRoaXNFbCIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJuIiwiZ2V0dGVyIiwiX19lc01vZHVsZSIsImRlZmluaXRpb24iLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyJdLCJzb3VyY2VSb290IjoiIn0=
|