spyne 0.24.0 → 0.26.0
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/lib/spyne.esm.js +3 -3
- package/lib/spyne.esm.js.LICENSE.txt +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 +1 -1
- package/src/spyne/channels/channel-payload-class.js +112 -17
- package/src/spyne/channels/channel.js +13 -0
- package/src/spyne/channels/spyne-channel-window.js +95 -3
- package/src/spyne/spyne-app.js +5 -2
- package/src/spyne/spyne-plugins.js +17 -0
- package/src/spyne/spyne.js +11 -3
- package/src/spyne/utils/channel-fetch-util.js +3 -2
- package/src/spyne/utils/channel-payload-filter.js +26 -22
- package/src/spyne/utils/safe-clone.js +128 -2
- package/src/spyne/utils/sanitize-data.js +244 -23
- package/src/spyne/utils/sanitize-html.js +17 -40
- package/src/spyne/utils/spyne-app-properties.js +30 -0
- package/src/spyne/utils/spyne-warn.js +26 -0
- package/src/spyne/views/dom-element-template.js +93 -0
- package/src/spyne/views/dom-element.js +4 -3
- package/src/spyne/views/view-stream-selector.js +52 -47
- package/src/tests/channels/channel-payload-filter.test.js +26 -0
- package/src/tests/channels/channel-window-custom-events.test.js +130 -0
- package/src/tests/index.test.js +5 -0
- package/src/tests/utils/safe-clone.test.js +193 -0
- package/src/tests/utils/security.test.js +153 -1
- package/src/tests/views/dom-el-selectors.test.js +7 -7
- package/src/tests/views/view-stream-selector.test.js +178 -0
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:()=>a});var s=r(2),n=r(9),o=r(131);class a extends s.c{constructor(e,t={disableSanitize:!1}){a.validateMapMethod(t,e),void 0!==t.map&&(t.mapFn=t.map),t.extendedActionsArr=[`${e}_RESPONSE_EVENT`,`${e}_ERROR_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),a=(0,o.allPass)([n,e=>e.length>=1]);return!(0,o.compose)(a,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_ERROR_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){const t=!0===e?.isChannelFetchError?`${this.props.name}_ERROR_EVENT`:`${this.props.name}_RESPONSE_EVENT`;return this.createChannelPayloadItem(e,t)}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=e?.payload??e?.viewStreamInfo?.payload??{};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","disableSanitize","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:()=>a});var s=r(131),n=r(225),o=r(961);class a{constructor(e,t,r,i,c,l){const d=e;l&&console.time(l);const E={channelName:e,action:t,srcElement:i,event:c},p=a.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(d);a.validateAction(t,d,e)}E.clone=()=>(0,s.mergeAll)([{payload:(0,o.l)(E.payload)},E.payload,{channel:(0,s.clone)(d)},{event:(0,s.clone)(c)},{srcElement:i},(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"===d&&(h.location={get:()=>a.getLocationData()}),E._dir=void 0,Object.defineProperties(E,h),l&&console.timeEnd(l),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])||a.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),a=r(131),i=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,i.Ir)(()=>{!0!==(0,a.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:()=>d});var s=r(584),n=r(980),o=r(225),a=r(521),i=r(968),c=r(531),l=r(131);class d{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 a.g(this),this.createChannelActionMethods(),this.streamsController=o.M.channelsMap;const s=this.getMainObserver();this.checkForPersistentDataMode=d.checkForPersistentDataMode.bind(this),this.observer$=this.props.observer=s;const n=this.streamsController.getStream("DISPATCHER"),i=(0,l.propEq)(t.name,"name");n.pipe((0,c.filter)(i)).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 i.ReplaySubject(1):new i.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,l.isEmpty)(t),s=void 0!==(0,l.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,l.ifElse)((0,l.is)(String),l.identity,l.head),s=t.concat(this.addRegisteredActions(e)),n=(0,l.map)(r,s),o=(0,l.mergeAll)((0,l.chain)(e=>(0,l.objOf)(e,e),n));this.channelActions=o}createChannelActionMethods(){const e=(0,l.ifElse)((0,l.is)(String),l.identity,l.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,l.ifElse)((0,l.is)(String),(0,l.always)("onViewStreamInfo"),e=>{const r=(0,l.view)((0,l.lensIndex)(1),e);return t(r,e),r});this.channelActionMethods=(0,l.fromPairs)((0,l.map)(t=>[e(t),r(t)],this.addRegisteredActions()))}addRegisteredActions(){let e=[];return(0,l.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,l.path)(["data","action"],e),s=(0,l.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,l.equals)(e.name,this.props.name),{action:r,payload:s,srcElement:n}=e.data,o=t=>({clone:()=>{return t=e.data,(0,l.mergeAll)([t,{action:(0,l.prop)("action",t)},(0,l.prop)("payload",t),(0,l.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 a=new n.m(this.props.name,e,t,r,s);o.next(a)}getChannel(e,t){return(0,l.ifElse)(e=>(0,s.ns)().includes(e),r=>{const s=this.streamsController.getStream(r).observer;return s.source?s.source.channelName=e:s.channelName=e,void 0!==t?s.pipe((0,c.filter)(t)):s},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,i.forkJoin)(r);else if(0===r.length)s=i.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)=>{const n="string"==typeof e?e:`channel_${s}`;r[e?.source?.channelName||e?.source?.source?.channelName||n]=t[s]}),r}))}static checkForNotTrackFlag(e={}){!0===e.doNotTrack&&o.M.doNotTrackChannel(e.channelName)}}},584(e,t,r){r.d(t,{ns:()=>a});var s=r(225),n=r(131),o=r(968);const a=()=>({includes:()=>!0===s.M.initialized?s.M.listRegisteredChannels():["CHANNEL_ROUTE","CHANNEL_UI","CHANNEL_WINDOW","DISPATCHER"]}),i=["LOAD","RENDER","MOUNT","UNMOUNT","DISPOSE","GARBAGE_COLLECT","UPDATE"],c=["parent","self","child","children","view"],l=["Observable","BehaviorSubject","Subject","Observer","Subscriber","FromEventObservable"],d=["subscribe","combineLatest"];let E=[],p=[],h=null,N=null,u=null,m=null,_=null,T=null,A=null;if(void 0!==n.compose&&void 0!==o.Observable){E=[{error:`need to match a valid name within ${l}`,predicate:e=>a().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=>d.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 ${l}`,predicate:e=>a().includes(e.name)},{error:`needs one of the following step strings: ${i}`,predicate:e=>i.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)},m=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)},_=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=>a().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>l.includes((0,e.observable)().constructor.name)},{error:"param action must be a registered action",predicate:e=>d.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:()=>p});var s=r(68),n=r(303),o=r(597),a=r(205),i=r(59),c=r(968),l=r(683),d=r(131);const E=new Map;class p{constructor(){this.addMixins(),E.set("DISPATCHER",new c.Subject),this.listRegisteredChannels=p.listRegisteredChannels.bind(this),this.getChannelsList=p.getChannelsList.bind(this)}get map(){return E}static getChannelsList(){return Array.from(E,(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,E.set("CHANNEL_ROUTE",this.routeStream),this.uiStream=new n.z,E.set("CHANNEL_UI",this.uiStream),this.domStream=new o.x,E.set("CHANNEL_WINDOW",this.domStream),this.viewStreamLifecycle=new a.b,E.set("CHANNEL_LIFECYCLE",this.viewStreamLifecycle),this.aiStream=new i.$,E.set("CHANNEL_AI",this.aiStream),this.routeStream.initializeStream(),this.domStream.initializeStream()}addKeyEvent(e){E.get("UI").addKeyEvent(e)}registerStream(e){const t=e.channelName;E.has(t)&&(0,d.compose)((0,d.pathEq)(["props","isRegistered"],!0))(E.get(t))?console.warn(`Spyne Warning: The Channel, ${t}, has already been registered!`):(E.set(t,e),e.initializeStream())}getChannelActions(e){return E.get(e).addRegisteredActions()}getProxySubject(e,t=!1){const r=!0===t?"replaySubject":"subject";return E.get(e)[r]}testStream(e){return void 0!==E.get(e)}getStream(e){return!1===this.testStream(e)&&E.set(e,new l.w(e)),E.get(e)}addMixins(){}}},59(e,t,r){r.d(t,{$:()=>n});var s=r(2);class n extends s.c{constructor(e={}){super("CHANNEL_AI",e)}addRegisteredActions(){return["CHANNEL_AI_RENDERED_EVENT","CHANNEL_AI_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)}}},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:()=>d});var s=r(2),n=r(511),o=r(167),a=r(225),i=r(968),c=r(531),l=r(131);class d 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 i.ReplaySubject(1),this.observer$=this.navToStream$.pipe((0,c.map)(e=>this.onMapNext(e))),this.compareRouteKeywords=o.H.compareRouteKeywords()}checkConfigForHash(){!0==("hash"===a.M.config.channels.ROUTE.type)&&(a.M.config.channels.ROUTE.type="slash",a.M.config.channels.ROUTE.isHash=!0)}onRegistered(){this.checkConfigForHash(),this.initStream()}createChannelActionsObj(){const e=this.addRegisteredActions(),t=(0,l.mergeAll)((0,l.chain)(e=>(0,l.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,l.pick)(["isHash","isHidden","routes","type"],e.payload);a.M.config.channels.ROUTE=(0,l.mergeRight)(a.M.config.channels.ROUTE,t),a.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=a.M.config,t=(0,l.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 i.ReplaySubject(1),this.onIncomingDomEvent(void 0,this.routeConfigJson,"CHANNEL_ROUTE_DEEPLINK_EVENT"),o.H.createPopStateStream(this.onIncomingDomEvent.bind(this)),this.observer$=(0,i.merge)(this.firstLoadStream$,this.navToStream$)}onMapNext(e,t=!1){return e.action="CHANNEL_ROUTE_CHANGE_EVENT",e}static removeSSID(e){const t=(0,l.lensProp)(["routeData"]);return(0,l.over)(t,(0,l.omit)(["vsid"]))(e)}static onIncomingDomEvent(e,t=this.routeConfigJson,r){const s=void 0!==r?r:this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT,n=(0,l.path)(["state","routeCount"],e),o=!0===(0,l.is)(Number,n);let a=this.getDataFromString(t,o);!0===o&&(a.routeCount=n),"CHANNEL_ROUTE_DEEPLINK_EVENT"===r&&(a.navLinks=(0,l.prop)("routeDatasetsArr",t),Object.defineProperty(a,"linksData",{get(){return this.navLinks},set(e){console.warn("set links data is deprecated in ROUTE DEEPLINK DATA, use navLinks")},enumerable:!0}));const i=this.compareRouteKeywords.compare(a.routeData,a.paths);a=(0,l.mergeRight)(a,i),this.sendChannelPayload(s,a,void 0,e,this.navToStream$)}static checkForRouteParamsOverrides(e){return e}static checkForEventMethods(e){const t=(0,l.compose)((0,l.filter)((0,l.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),l.keys,(0,l.prop)("payload"))(e);if(t.length>=1){const r=(0,l.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,l.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,l.compose)((0,l.equals)("true"),(0,l.path)(["payload","endRoute"]))(e))return e;const s=void 0!==r?r:!0===a.M.debug,{payload:n}=e;let o=0;const i=(e=[],t)=>{const r=t[1],{routePath:a}=r,c=(0,l.prop)("routeName",a),d=(e=>{const t=(0,l.prop)("routeName",e);if(t){const r=(0,l.compose)(l.keys,(0,l.omit)(["routeName"]))(e),s=n[t],o=e=>new RegExp(`^${e}$`).test(s);return(0,l.find)(o,r)}})(a),E=(0,l.is)(Object,r),p=(0,l.is)(Array,r);if(o+=1,!0===E&&!1===p){const t=a[d];t?(0,l.compose)(l.reverse,(0,l.reduce)(i,e),l.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,d=(0,l.compose)(l.reverse,(0,l.reduce)(i,[]),l.toPairs)({routes:c});if(1===d.length){const t=d[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),d.checkForEventMethods(e),e=this.checkForEndRoute(e);let r=this.getDataFromParams(e);const s=(0,l.prop)("srcElement",e),n=(0,l.prop)("event",e),o=!r.isHidden,a=this.compareRouteKeywords.compare(r.routeData,r.paths);r=(0,l.mergeRight)(r,a),this.sendRouteStream(r,o),r=d.removeSSID(r),this.sendChannelPayload(t,r,s,n,this.navToStream$)}static checkAndConvertStrWithRegexTokens(e,t){return(0,l.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,l.prop)("payload",e);const s=this.getRouteStrFromParams(r,t),o=(e,r)=>(0,l.defaultTo)(r,(0,l.prop)(e,t)),a=o("type","slash"),i=o("isHash",!1),c=n.Q.formatStrAsWindowLocation(s),d=this.getDataFromLocationStr(a,i,c),{pathInnermost:E,paths:p}=d;r=(0,l.mergeRight)(d.routeData,r);const{routeCount:h,isDeepLink:N,isHash:u,isHistory:m,isHidden:_,routeType:T}=this.getExtraPayloadParams(t);return{isDeepLink:N,routeCount:h,pathInnermost:E,paths:p,routeData:r,routeValue:s,isHash:u,isHidden:_,isHistory:m,routeType:T}}static getDataFromString(e=this.routeConfigJson,t=!1){const r=e.type,s=!0===e.isHash,o=n.Q.getLocationStrByType(r,s),{paths:a,pathInnermost:i,routeData:c,routeValue:l}=d.getParamsFromRouteStr(o,e,r),{routeCount:E,isDeepLink:p,isHash:h,routeType:N,isHidden:u}=this.getExtraPayloadParams(e,t);return{isDeepLink:p,routeCount:E,pathInnermost:i,paths:a,routeData:c,routeValue:l,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:a,pathInnermost:i,routeData:c,routeValue:l}=this.getParamsFromRouteStr(o,this.routeConfigJson,s);return{paths:a,pathInnermost:i,routeData:c,routeValue:l,action:this.getRouteState()}}static getLocationData(){return(0,l.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,l.isEmpty)(e);return!0==(!0===r&&!1===t)||!0==(!0===r&&!0===t)?"/":!0==(!1===r&&!0===t)?(0,l.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=d.removeLastSlash(window.location.pathname)+r,window.history.pushState({routeCount:n},"",r);else{const e=(0,l.when)((0,l.compose)((0,l.complement)((0,l.equals)("/")),l.head),(0,l.concat)("/",l.__));window.history.pushState({routeCount:n},"",e(r))}}getWindowLocation(){return window.location.pathname}bindStaticMethods(){this.checkForEndRoute=d.checkForEndRoute.bind(this),this.getIsDeepLinkBool=d.getIsDeepLinkBool.bind(this),this.getDataFromLocationStr=d.getDataFromLocationStr.bind(this),this.onIncomingDomEvent=d.onIncomingDomEvent.bind(this),this.getDataFromString=d.getDataFromString.bind(this),this.getParamsFromRouteStr=d.getParamsFromRouteStr.bind(this),this.getLocationData=d.getLocationData.bind(this),this.getRouteState=d.getRouteState.bind(this),this.getDataFromParams=d.getDataFromParams.bind(this),this.getRouteCount=d.getRouteCount.bind(this),this.getExtraPayloadParams=d.getExtraPayloadParams.bind(this),this.bindStaticMethodsWithConfigData()}bindStaticMethodsWithConfigData(){const e=(0,l.curryN)(3,d.getRouteStrFromParams);this.getRouteStrFromParams=e(l.__,this.routeConfigJson,this.routeConfigJson.type)}}},303(e,t,r){r.d(t,{z:()=>c});var s=r(2),n=r(968),o=r(531),a=r(131),i=r(672);class c 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,a.lensProp)(["payload"]);return(0,a.over)(t,(0,a.omit)(["vsid"]))(e)}onIncomingObservable(e){const t=(0,a.equals)(e.name,this.props.name);e.data=c.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,a.path)(["event","type"]),r=(0,a.path)(["event","typeOverRide"]),s=(0,a.compose)(a.toUpper,(0,a.either)(r,t))(e),n="CHANNEL_UI";return void 0!==s?`${n}_${s}_EVENT`:n}static checkForEventMethods(e){const t=(0,a.compose)((0,a.filter)((0,a.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),a.keys,(0,a.prop)("payload"))(e);if(t.length>=1){const r=(0,a.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,a.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,c.checkForEventMethods(e),e.action=this.getActionState(e);const t=e.action,{payload:r,srcElement:s}=e,n=e.event;(0,i.v8)(n?.target),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),a=r(432),i=r(968),c=r(531),l=r(131),d=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,i.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,l.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,l.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,l.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,l.pick)(["matches","media","mediaQueryName"],e),srcElement:e.srcElement,event:e}}createMouseWheelObservable(e){const t=e.debounceMSTimeForScroll;return a.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:a}=o;return{action:r,payload:o,srcElement:e.srcElement,scrollDistance:a,event:e}}createScrollObservable(e,t=window,r=!0){const s=e.debounceMSTimeForScroll,n=t,o=t===window,i=void 0!==e.scrollElForVals?e.scrollElForVals:t,d=o?"CHANNEL_WINDOW_SCROLL_EVENT":"CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT",p=E.getScrollData(),h=(0,l.partialRight)(E.getScrollMapFn,[d,p,i,r,n]).bind(this);return a.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 a.Y.createDomObservableFromEvent("orientationchange",E.getOrientationMapFn.bind(this))}createResizeObservable(e){const t=e.debounceMSTimeForResize;return a.Y.createDomObservableFromEvent("resize",E.getResizeMapFn.bind(this)).pipe((0,c.debounceTime)(t))}getEventsFromConfig(e=this.domChannelConfig){const t=e.events;return(0,l.map)(e=>{const t=E.createCurriedGenericEvent(e);return a.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,l.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,l.apply)(i.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,d.$)(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=a.Y.createMediaQueryHandler.bind(this),this.createMergedObsFromObj=a.Y.createMergedObsFromObj.bind(this)}}},713(e,t,r){r.d(t,{D:()=>E});var s=r(470),n=r(173),o=r(167),a=r(225),i=r(49),c=r(672);const l=new s.H,d="0.24.0";let E=new class{constructor(){this.version=d}get channels(){return l}init(e={},t=!1){if(!0===a.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,mode:"app",disableSanitize:!1,iframes:{},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=a.M.initialize(r,e,l,t)}this.pluginsFn=a.M.getPluginsMethodObj(e.pluginMethods),this.getChannelActions=e=>l.getChannelActions(e),this.registerChannel=e=>l.registerStream(e),this.registerPlugin=e=>a.M.registerPlugin(e),this.registerDataChannel=e=>l.registerStream(e),this.listChannels=()=>Array.from(l.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;",l.init(),!0===a.M.config.debug&&(window.Spyne={version:d}),(0,i.D)(a.M.config),(0,c.oG)(a.M.config)}static listChannels(){return Array.from(l.map.keys())}static getChannelActions(e){return l.getChannelActions(e)}static registerChannel(e){if(!1!==a.M.initialized)return l.registerStream(e);console.warn("Spyne has not been initialized")}}},930(e,t,r){r.d(t,{V:()=>i});var s=r(192),n=r(225),o=r(131);let a=n.M;class i{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=i.mergeDefaultConfig(r,this.defaultConfig()),this.props.parentEl=s||i.createParentEl(),this.props.config=r,void 0!==this.props.traits&&this.addTraits(this.props.traits)}register(e){a=e,this.props.pluginName=this.props.name,!1!==a.initialized?(this.onBeforeRegistered(),this.props.config=(0,o.clone)(this.props.config),a.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 a}static mergeDefaultConfig(e={},t=this.defaultConfig()){return Object.assign(t,e)}static getSpyneApp(e,t){!1===a.initialized?console.warn(`Spyne Warning: Unable to install plugin, ${e}! SpyneApp has not been initialized!`):a.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),a=r(672);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=!0===e?.debug,this.disableSanitize=!0===e?.disableSanitize,this.channelName=s;const n={mapFn:this.mapFn,url:this.url,serverOptions:this.serverOptions,responseType:this.responseType,disableSanitize:this.disableSanitize,debug:this.debug};!0!==r&&i.startWindowFetch(n,this._subscriber,this.channelName)}static startWindowFetch(e,t,r){const{mapFn:o,url:c,serverOptions:l,responseType:d,debug:E}=e,p={channelName:r,url:c,responseType:d,serverOptions:l},h=!0===E?(0,n.tap)(e=>{console.log("DEBUG FETCH :",e,p)}):(0,n.tap)(()=>{});var N;(0,s.from)(window.fetch(c,l)).pipe((0,n.mergeMap)(e=>(0,s.from)(i.parseResponse(e,p))),h,(0,n.map)((N=o,t=>{const r=!0===e?.disableSanitize?t:(0,a.Ay)(t,{mode:"app"});return N(r,p)})),(0,n.catchError)(e=>(0,s.of)(i.createFetchErrorPayload(e,p))),(0,n.share)()).subscribe(t)}static async parseResponse(e,t){const{responseType:r}=t,s=e.status,n=e.statusText,o=e.headers?.get?.("content-type")||"",a={...t,status:s,statusText:n,contentType:o,ok:e.ok};if(!0!==e.ok){const t=await i.safeReadText(e);throw i.createFetchError({errorType:"FETCH_HTTP_ERROR",message:`Fetch request failed with status ${s} ${n}`,metadata:a,rawBody:t})}if("json"===r)return i.parseJsonResponse(e,a);if("text"===r)return e.text();if("blob"===r)return e.blob();if("arrayBuffer"===r)return e.arrayBuffer();if("formData"===r)return e.formData();throw i.createFetchError({errorType:"FETCH_UNSUPPORTED_RESPONSE_TYPE",message:`Unsupported fetch responseType "${r}"`,metadata:a})}static async parseJsonResponse(e,t){const r=await e.text(),s=r.trim();if(""===s)return null;try{return JSON.parse(s)}catch(e){throw i.createFetchError({errorType:"FETCH_RESPONSE_PARSE_ERROR",message:"Expected JSON but could not parse response body.",metadata:t,rawBody:r,originalError:e})}}static createFetchError({errorType:e,message:t,metadata:r,rawBody:s="",originalError:n}){const o=new Error(t);return o.isChannelFetchError=!0,o.errorType=e,o.metadata=r,o.rawBody=s,o.originalError=n,o}static createFetchErrorPayload(e,t){const r=e?.metadata||t||{};return{isChannelFetchError:!0,isError:!0,error:!0,errorType:e?.errorType||"FETCH_UNKNOWN_ERROR",message:e?.message||"Unknown ChannelFetchUtil error",channelName:r.channelName,url:r.url,responseType:r.responseType,status:r.status,statusText:r.statusText,contentType:r.contentType,ok:r.ok,rawBodyPreview:i.truncateBody(e?.rawBody),originalErrorMessage:e?.originalError?.message}}static truncateBody(e="",t=500){return"string"!=typeof e?"":e.length>t?`${e.slice(0,t)}...`:e}static async safeReadText(e){try{return await e.text()}catch(e){return""}}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){const t=e?.body;if(!0!=(null!==t&&"object"==typeof t&&t.constructor===Object))return e;const r=new Headers(e.headers||{});return!0!==r.has("Content-Type")&&r.set("Content-Type","application/json"),{...e,headers:r,body:JSON.stringify(t)}}static updateMethodWhenBodyExists(e){return void 0!==e?.body&&"GET"===(e?.method||"GET").toUpperCase()?(console.warn("SPYNE WARNING: Fetch body was provided with method GET. Changing method to POST.",e),{...e,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",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)),a=(0,s.compose)(s.not,s.isEmpty),i=(0,s.allPass)([(0,s.is)(String),a]),c=(0,s.allPass)([(0,s.is)(Array),a]),l=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)])),d=(0,s.compose)((0,s.allPass)([a,o,(0,s.is)(Object)]));class E{constructor(e,t={},r,o){l(e)&&(t=e,e=(0,s.prop)("selector",t),o=o||(0,s.prop)("testMode",t));const a=[r,(0,s.prop)("debugLabel",t)];r=(0,s.compose)((0,s.find)((0,s.is)(String)))(a);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=i(e)?E.filterSelector([e],r):void 0,u=c(e)?E.filterSelector(e,r):void 0,m=d(h)?E.filterData(h,r):void 0;let _=(0,s.reject)(s.isNil,[N,u,m]);const T=(0,s.isEmpty)(_);return T&&(_=[(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)(_)}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)||l(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:a}=r||{},i=[o,n,(0,s.prop)("srcElement",a),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(i),l=e=>{const t=Array.from(document.querySelectorAll(e));return(0,s.map)(c,t)};if(void 0!==t){const r=(0,s.compose)(s.flatten,(0,s.map)(l))(e),n=e;console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${t}"] - selectors: `,"color:orange;",{el:i,selectorsArr:n,nodeArrResultsDebugger:r})}if("object"!=typeof i)return!1;const d=(0,s.compose)(s.flatten,(0,s.map)(l))(e);return!0!==(0,s.isEmpty)(d)&&(0,s.any)((0,s.equals)(!0),d)}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)?a((r=e,Array.isArray(r)?[]:{}),e,t):e;var r}function o(e,t,r){const o=e.slice();return t.forEach(function(t,i){void 0===o[i]?o[i]=n(t,r):s(t)?o[i]=a(e[i],t,r):-1===e.indexOf(t)&&o.push(n(t,r))}),o}function a(e,t,r){const i=Array.isArray(t),c=(r||{arrayMerge:o}).arrayMerge||o;return i?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(i){s(t[i])&&e[i]?o[i]=a(e[i],t[i],r):o[i]=n(t[i],r)}),o}(e,t,r)}r.d(t,{$:()=>a}),a.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 a(e,r,t)})}},64(e,t,r){r.d(t,{FZ:()=>a,Ir:()=>n,Lx:()=>i,OZ:()=>o,RK:()=>c,V0:()=>l});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])},a=(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)),i=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 l(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)),a=n(Object.getOwnPropertyNames(e.constructor));return{methods:o,staticMethods:a,allMethods:(0,s.concat)(o,a)}}},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,a=new s.A({id:n,name:r,data:t});a.onRendered=()=>{a.sendInfoToChannel("CHANNEL_ROUTE",o)},a.afterBroadcastEvents=()=>{a.disposeViewStream()},a.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:a,__proxy__props:i}=o;return a?t(r,i):r},o=n((0,s.clone)(e),[]),a=(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),i=[...r];i.push(t),"object"!==o&&"array"!==o||(e[t]=n(s,i),a(s,i))})};return a(o),o})(e,r)}const r=(0,s.is)(Array),o=(0,s.is)(Object);var a;return!1===r(a=e)&&!0===o(a)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}},672(e,t,r){r.d(t,{Ay:()=>b,Wh:()=>I,j2:()=>y,oG:()=>f,v8:()=>L});var s=r(636),n=r.n(s),o=r(225);let a,i=!1,c=!1;const l=/^(?:(?:https?|mailto|tel):|data:image\/|(?![a-z][a-z0-9+.-]*:)[\s\S]*$)/i,d=e=>String(e).replace(/[\u0000-\u0020]/g,""),E={ALLOWED_TAGS:["a","b","i","em","strong","u","p","br","ul","dl","dt","dd","ol","li","hr","blockquote","pre","code","span","div","section","article","aside","header","footer","h1","h2","h3","h4","h5","h6","table","thead","tbody","tr","td","th","img","figure","figcaption","video","source","iframe","input","button","label","link"],ADD_TAGS:["iframe","input","button","link"],ALLOWED_ATTR:["href","src","alt","class","title","width","height","style","target","rel","controls","poster","type","rows","cols","sandbox"],ALLOW_DATA_ATTR:!0,FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","onchange"],FORBID_TAGS:["script","object","embed","meta"],ALLOWED_URI_REGEXP:l},p={FORBID_TAGS:["script","iframe","object","embed","form","input","button","link","meta"],FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","onchange"],ALLOW_DATA_ATTR:!1,ALLOWED_URI_REGEXP:l};let h={allow:void 0,allowedOrigins:[],sandbox:"allow-scripts allow-same-origin allow-popups"},N=h;const u=e=>e?{allow:void 0!==e.allow?e.allow:h.allow,allowedOrigins:void 0!==e.allowedOrigins?e.allowedOrigins:h.allowedOrigins,sandbox:void 0!==e.sandbox?e.sandbox:h.sandbox}:h,m=(e,t=N)=>{const r=d(e);let s;try{s=new URL(r,window.location.href)}catch(e){return!1}if(s.origin===window.location.origin&&"null"!==s.origin)return!0;var n;if(!0!==("https:"===s.protocol||"http:"===s.protocol&&("localhost"===(n=s.hostname)||"127.0.0.1"===n||"[::1]"===n||n.endsWith(".localhost"))))return!1;const o=t.allowedOrigins;return!Array.isArray(o)||0===o.length||o.some(e=>{try{return new URL(e).origin===s.origin}catch(e){return!1}})};let _=!1;const T=["richtext","authoring","development"],A=()=>{const e=o.M?.mode;return T.includes(e)?"richtext":"app"},C=e=>{const t="richtext"===e?E:p,r=((e,t=N)=>void 0===t.allow?"richtext"===e:!0===t.allow)(e);return"richtext"===e&&!0!==r?{...t,ALLOWED_TAGS:t.ALLOWED_TAGS.filter(e=>"iframe"!==e),ADD_TAGS:t.ADD_TAGS.filter(e=>"iframe"!==e),FORBID_TAGS:[...t.FORBID_TAGS,"iframe"]}:"app"===e&&!0===r?{...t,FORBID_TAGS:t.FORBID_TAGS.filter(e=>"iframe"!==e),ADD_TAGS:["iframe"],ADD_ATTR:["sandbox"]}:t};function g(e="app"){const t=C(e);return e=>n().sanitize(e,t)}const f=(e={})=>{if(i)return void console.warn("sanitizeData is already configured. Reconfiguration is not allowed.");const{strict:t=!1,disableSanitize:r=!1,iframes:s}=e;c=!0===r,s&&"object"==typeof s&&(h=u(s),N=h),c?console.warn("SPYNE SECURITY WARNING: All data sanitization is DISABLED via config.disableSanitize. Do not use this setting in production."):_||(_=!0,n().addHook("afterSanitizeAttributes",e=>{if(!e||"IFRAME"!==e.tagName)return;const t=e.getAttribute("src")||"";""!==t&&!0!==m(t)&&(console.warn(`SPYNE WARNING: iframe src "${t}" was removed by the iframe policy (same-origin, https, or an allowed origin is required).`),e.removeAttribute("src"));const{sandbox:r}=N;!1!==r&&!0!==e.hasAttribute("sandbox")&&e.setAttribute("sandbox",r)}));const o=e=>{const t=g(e),r=e=>{if(Array.isArray(e))return e.map(r);if(e&&"object"==typeof e){const s={};for(const[n,o]of Object.entries(e))s[n]="string"==typeof o?t(o):r(o);return s}return"string"==typeof e?t(e):e};return r};a=(e,r={})=>{const{disableSanitize:s=!1,mode:n,iframes:a}=r;if(c||s)return e;const i=n||(t?"app":A());N=u(a);try{return o(i)(e)}finally{N=h}},f.sanitizeDataForce=(e,t)=>{if(c)return e;const r=t||A();return o(r)(e)},i=!0},S=["href","src","action","formaction","ping","poster","cite","codebase","manifest","icon","background"],I=(e,t,r)=>{if(c)return{allowed:!0,value:t};const s=String(e).toLowerCase(),o=String(r||"").toUpperCase();if(s.startsWith("on"))return{allowed:!1,value:t};if("srcdoc"===s){const e=C(A());return{allowed:!0,value:n().sanitize(String(t),e)}}return"IFRAME"===o&&"src"===s?{allowed:m(t,h),value:t}:S.includes(s)&&!0!==(a=t,l.test(d(a)))?{allowed:!1,value:t}:{allowed:!0,value:t};var a},y=e=>{if(c||!e||"IFRAME"!==e.tagName)return e;const{sandbox:t}=h;return!1!==t&&!0!==e.hasAttribute("sandbox")&&e.setAttribute("sandbox",t),e},L=(e,t)=>{if(!e||c)return;const r=g(t||A()),s=/<(?:script|object|embed|form|input|button|link|meta)[^>]*>|on\w+=|javascript:/i;if("string"==typeof e.value&&s.test(e.value)){const t=r(e.value);t!==e.value&&(e.value=t)}if(e.isContentEditable&&"string"==typeof e.innerHTML&&s.test(e.innerHTML)){const t=r(e.innerHTML);t!==e.innerHTML&&(e.innerHTML=t)}},b=(e,t={})=>{if(!i)throw new Error("sanitizeData is not configured. Call sanitizeDataConfigure() first.");return a(e,t)}},49(e,t,r){r.d(t,{A:()=>c,D:()=>i});var s=r(636),n=r.n(s);let o,a=!1;const i=(e={})=>{if(a)return void console.warn("sanitizeHTML is already configured. Reconfiguration is not allowed.");const{strict:t=!1,mode:r="app",disableSanitize:s=!1,allowTargetAttr:i=!0,addNoopener:c=!0,debug:l=!1,iframes:d={}}=e;if(!0===s)return console.warn("SPYNE SECURITY WARNING: All HTML sanitization is DISABLED via config.disableSanitize. Do not use this setting in production."),o=e=>e,void(a=!0);const E=["richtext","authoring","development"].includes(r),p=void 0!==d.allow?!0===d.allow:E,h={RETURN_TRUSTED_TYPE:!1,ADD_TAGS:[...p?["iframe"]:[],...E?["link"]:[]],ADD_ATTR:[...i?["target"]:[],...p?["sandbox"]:[]],...!0!==p&&E?{FORBID_TAGS:["iframe"]}:{}},N=e=>n().sanitize(e,h);if(i&&n().addHook("afterSanitizeAttributes",e=>{if(!e||"function"!=typeof e.getAttribute)return;if("A"!==e.tagName)return;const t=e.getAttribute("href"),r=e.getAttribute("target");if(t||!r){if(r)if(["_blank","_self","_parent","_top"].includes(r)){if("_blank"===r&&c){const t=(e.getAttribute("rel")||"").split(/\s+/).filter(Boolean),r=new Set(t);r.add("noopener"),r.add("noreferrer"),e.setAttribute("rel",Array.from(r).join(" "))}}else e.removeAttribute("target")}else e.removeAttribute("target")}),o=N,!0===t&&window.trustedTypes)try{const e=window.trustedTypes.createPolicy("default",{createHTML:e=>N(e)});o=t=>e.createHTML(t),!0===l&&console.log("SPYNE: Trusted Types default policy registered. Note that browser enforcement additionally requires the CSP header: require-trusted-types-for 'script'.")}catch(e){console.warn('SPYNE WARNING: A Trusted Types "default" policy already exists on this page. Falling back to direct sanitization.',e)}a=!0},c=e=>{if(!a)throw new Error("sanitizeHTML is not configured. Call sanitizeHTMLConfigure() with appropriate config.");return o(e)}},225(e,t,r){r.d(t,{M:()=>A});var s=r(167),n=r(511),o=r(519),a=r(907);let i,c,l,d,E=!0,p=!1;const h=[];let N,u;const m=[],_=new Map,T=new o.O,A=new class{constructor(){d=!1}get channelsMap(){return l}get initialized(){return d}get config(){return i}get debug(){return E}get mode(){return void 0!==i?.mode?i.mode:"app"}static listChannels(){return Array.from(c.map.keys())}initialize(e={},t={},r,s){return c=r,i=(0,a.$)(e,t),i.channels&&i.channels.ROUTE&&(i=s.conformRouteObject(i)),u=i?.IMG_PATH,E=void 0!==i.debug?i.debug:E,this.getChannelActions=c.getChannelActions.bind(c),this.listRegisteredChannels=c.listRegisteredChannels.bind(c),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=c.getStream.bind(c),t=c.testStream.bind(c),r=c.getProxySubject.bind(c);l={getStream:e,testStream:t,getProxySubject:r}}setProp(e,t,r=!1){return r?i.ephemeralProps[e]=t:i.tmpProps[e]=t,t}getProp(e){if(i?.tmpProps&&Object.prototype.hasOwnProperty.call(i.tmpProps,e))return i.tmpProps[e];if(i?.ephemeralProps&&Object.prototype.hasOwnProperty.call(i.ephemeralProps,e)){const t=i.ephemeralProps[e];return delete i.ephemeralProps[e],t}}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),T.pluginMethodsObj}addPluginMethods(e){e&&T.addMethods(e)}doNotTrackChannel(e){m.push(e)}getUntrackedChannelsList(){return m}registerProxyReviver(e,t){_.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 _.get(e)}getPluginConfigByPluginName(e){return i.plugins[e]}get IMG_PATH(){return u}get excludeChannelsFromConsole(){return h}set excludeChannelsFromConsole(e){"string"==typeof e?h.includes(e)||h.push(e):Array.isArray(e)?e.forEach(e=>{"string"!=typeof e||h.includes(e)||h.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"),N}set linksData(e){console.warn("set links data in SpyneAppProperties is deprecated, use navLinks")}get navLinks(){return N}set navLinks(e){N=e}get enableCMSProxies(){return p}getHrefFromData(e={}){return n.Q.convertParamsToRoute(e)}set enableCMSProxies(e=!0){p=Boolean(e)}setCMSProxyMethod(e){this.enableCMSProxies=!0,this.formatTemplateForProxyData=e}tempGetChannelsInstance(){}tempGetConfig(){}}},519(e,t,r){r.d(t,{O:()=>i});var s=r(131);const n=Object.create({}),o=(0,s.compose)(s.not,(0,s.is)(Array)),a=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)]));class i{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===a(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:()=>a});var s=r(64),n=r(131),o=r(225);class a{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){const t=o.M?.debug||!1;if(""===this.prefix&&t)return void console.warn(`SPYNE WARNING: The following SpyneTrait ${this.constructor.name} needs a prefix`);const r=(0,n.reject)(e=>0===e.indexOf(this.prefix),e);if(r.length>=1&&t){const e=`Spyne Warning: The following method(s) in ${this.constructor.name} require the prefix, "${this.prefix}": [${r.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=[],a=t=>{const r={},i=t.routeName;let c=void 0!==e[i]?e[i]:(0,s.prop)(i,n);const l=typeof t[c];"string"===l?c=t[c]:"undefined"===l&&(t=this.checkIfParamValueMatchesRegex(c,t)),r[i]=c,this.checkIfObjIsNotEmptyOrNil(r)&&o.push(r);const d=(0,s.is)(Object,t),E=(0,s.has)(c,t),p=(0,s.has)("routePath",t);if(!0===(E&&d)){const e=t[c];(0,s.has)("routePath",e)&&a(e.routePath)}else!0===p&&void 0!==c&&a(t.routePath)};return a(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)),a=(0,s.map)(o),i=(0,s.when)((0,s.complement)(s.isEmpty),(0,s.concat)("?"));return(0,s.compose)(i,(0,s.join)("&"),t,a)(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 a=void 0!==r?r:t.type,i=t.isHash,c=t.routes.routePath,l=void 0!==s?s:this.getLocationStrByType(a,i),d=this.convertRouteToParams(l,t,a).routeData;let E=this.createRouteArrayFromParams(e,c,a,d);return E=o.checkPayloadForRegexOverrides(E,e),E=o.checkForRouteValWithMultipleVals(E),"query"===a?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),a=o.findIndexOfMatchedStringOrRegex(t,n);let i=t;if(a>=0){const t=n[a],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)&&(i=o)}return i}static createArrFromSlashStr(e){return e.replace(/^([/])?(.*)$/,"$2").split("/")}static convertSlashRouteStrToParamsObj(e,t,r){const n=t,o=this.createArrFromSlashStr(t),a=[],i=[];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)(a))(c.routeName)&&!1===o(n)&&(a.push(c.routeName),i.push(n));const l=[t,"routePath"],d=(0,s.path)(l,c),E=(0,s.path)(["routePath"],c);void 0!==d?c=d:void 0!==E&&(c=E)},0,o);const l=(0,s.zipObj)(a,i),d=this.getLastArrVal(a);return{paths:a,pathInnermost:d,routeData:l,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"),a=(0,s.compose)((0,s.map)((0,s.split)("=")),(0,s.split)("&"))(o);let i=(0,s.fromPairs)(a),c=(0,s.map)(s.head,a);return!0===(0,s.isEmpty)(t)&&(i=this.createDefaultParamFromEmptyStr(e,t,r),c=(0,s.keys)(i)),{paths:c,pathInnermost:this.getLastArrVal(c),routeData:i,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)),a=t.routes.routePath;return"query"===n?this.convertQueryStrToParams(a,e):(e=e.replace(/\/$|$/,"/"),this.convertSlashRouteStrToParamsObj(a,e,o))}}},167(e,t,r){r.d(t,{H:()=>a});var s=r(968),n=r(131),o=r(511);class a{constructor(){this.createPopStateStream=a.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),a=e=>(0,n.compose)(n.keys,(0,n.filter)((0,n.propEq)(!0,e))),i=(0,n.compose)((0,n.map)(e=>{const t=(0,n.prop)(e,s),r=(0,n.prop)(e,o),a=(0,n.equals)(t,r),i=void 0!==t,c=void 0!==r,l=!a,d=!1===i&&!0===c,E=!0===i&&!1===c,p={};return p[e]={same:a,changed:l,added:d,removed:E,previousExists:i,nextExists:c},p}),n.uniq,(0,n.chain)(n.keys))([s,o]),c=(0,n.chain)(a("changed"),i),l=(0,n.chain)(a("added"),i),d=(0,n.chain)(a("removed"),i);return s=o,{pathsAdded:l,pathsRemoved:d,pathsChanged:c}},getComparer:()=>s}}static getRouteArrData(e,t){const r=(0,n.filter)((0,n.includes)(n.__,e),t);return{paths:r,pathInnermost:a.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"),a=/^([A-Za-z0-9_-])+$/m,i=(e=[],t,r={})=>{let{routeName:o}=t;return(0,n.toPairs)(t).reduce((t,c)=>{const[l,d]=c,E=(0,n.is)(Object,d),p=e=>(0,n.test)(a,e)?(e=>String(e).replace(/([-_])/g," ").toUpperCase())(e):l;if("routeName"===l||"404"===l)return t;o=o||(0,n.prop)("routeName",d);let h=(0,n.clone)(r);if(h[o]=String(l).replace(/([^A-Za-z0-9-_])/g,""),!0===E){if(1===(0,n.keys)(h).length){const e=(0,n.path)(["routePath","routeName"],d);if(e){const o=(0,n.clone)(h);o[e]="",o.navLevel=(0,n.keys)(r).length,o.title=p(l),o.href=s(o),t.push(o)}}h=i(e,d,h)}else h.title=p(l),h.href=s(h);return h.navLevel=(0,n.keys)(r).length,t.push(h),t},[])},c=i([],e.routes);let l=(0,n.flatten)(c);return l=function e(t){return t.map(t=>{for(const r in t)void 0===r||"undefined"===r||void 0===t[r]?delete t[r]:t[r]&&"object"==typeof t[r]&&!Array.isArray(t[r])&&(t[r]=e([t[r]])[0]);return t})}(l),{routeDatasetsArr:l,routeNamesArr:(e=>{const t=(0,n.reject)((0,n.includes)(n.__,["title","href","navLevel","undefined"]));return(0,n.compose)(n.uniq,t,n.flatten,(0,n.map)(n.keys))(e)})(l)}}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},i=(0,n.compose)(n.fromPairs,(0,n.map)(e=>{const[t,r]=e,a=s?{404:".+"}:{},c=(0,n.is)(Object,r),l=(0,n.is)(Array,r),d="routePath"===t;return!0===c&&!1===l&&(e[1]=i(e[1]),d&&(e[1]=(0,n.compose)((0,n.mergeDeepRight)(a),n.fromPairs,(0,n.map)(o),n.toPairs)(e[1]))),e}),n.toPairs);if(void 0!==r){e.channels.ROUTE=i(e.channels.ROUTE);const t=a.addRouteDatasets(e.channels.ROUTE);return e.channels.ROUTE=(0,n.mergeRight)(e.channels.ROUTE,t),e}return i(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:()=>a});var s=r(968),n=r(531),o=r(131);class a{constructor(){this.createDomObservableFromEvent=a.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=(a=e,{addHandler:e=>{a.addListener(e)},removeHandler:e=>{a.onchange=()=>{}}});var a;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=a.createMediaQuery(e);return!1!==n&&r.push(a.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:()=>a});var s=r(968),n=r(531),o=r(131);class a{constructor(e){this.props.observableStreams=a.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 a=e=>(0,o.propSatisfies)(t=>t.includes(e),"$dir"),i=a("parent"),c=a("child"),l=a("internal"),d=e=>(0,o.mergeRight)({from$:e}),E=d("child"),p=d("internal"),h=d("parent"),N=e.pipe((0,n.filter)(e=>void 0!==e&&void 0!==e.action)),u=e.pipe((0,n.filter)(l),(0,n.map)(p)),m=e.pipe((0,n.filter)(i),(0,n.map)(E)),_=e.pipe((0,n.filter)(c),(0,n.map)(h)),T={parent:m,internal:u,child:_};return{raw$:N,toInternal$:u,toParent$:m,toChild$:_,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:()=>a});var s=r(131),n=r(49),o=r(225);class a{constructor(e,t={},r={}){if(this.template=this.formatTemplate(e),this.isProxyData=!0===t.__cms__isProxy,this.testMode=r?.testMode,this.template=a.normalizeTripleBrackets(this.template),!0===this.isProxyData){const e=!0===o.M.enableCMSProxies?o.M.formatTemplateForProxyData:a.formatTemplateForProxyData;"function"==typeof e&&(this.template=e(this.template))}(()=>{!0===(0,s.is)(Array,t)&&(t={spyneData:t},this.template=this.template.replace("{{/}}","{{/spyneData}}"),this.template=this.template.replace("{{#}}","{{#spyneData}}"))})(),this.templateData=t,this.currentOuterLoopData=null;const n=a.getStringArray(this.template);let i=this.template.match(a.findTmplLoopsRE());i=null===i?[]:i;const c=a.parseTmplLoopsRE(),l=this.parseTheTmplLoop.bind(this),d=(0,s.includes)(s.__,i),E=(0,s.ifElse)(d,e=>e.replace(c,l),this.addParams.bind(this));this.finalArr=n.map(E)}static isPrimitiveTag(e){return/({{\.\*?}})/.test(e)}static normalizeTripleBrackets(e){return"string"!=typeof e||-1===e.indexOf("{{{")?e:e.replace(/\{\{\{([^{}]+?)\}\}\}/g,"{{$1}}")}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(a.findTmplLoopsRE()),r=/^([\\n\s\W]+)$/,n=t.filter((e,t)=>!(t>=2&&(t-2)%3==0));return(0,s.reject)(e=>e.match(r),n)}static findTmplLoopsRE(){return/({{#([\w.]+)}}[\w\n\s\W]+?{{\/\2}})/gm}static parseTmplLoopsRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static innerLoopRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static swapParamsForTagsRE(){return/({{)(.*?)(}})/gm}static hasLoop(e){return a.innerLoopRE().test(e)}removeThis(){void 0!==this&&(this.finalArr=void 0,this.templateData=void 0,this.template=void 0)}renderDocFrag(){let e=a.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=a.replaceImgPath(e),!0!==this.testMode&&(e=String((0,n.A)(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(a.swapParamsForTagsRE(),(e,t,r,s)=>a.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}processInnerLoop(e,t){const r=a.innerLoopRE();return e.replace(r,(e,r,n,i)=>{!0===a.hasLoop(i)&&(!0===o.M.debug&&!0!==this.testMode&&console.warn(`Spyne Warning: DomElementTemplate supports one level of nested array loops. A deeper nested loop was detected inside "{{#${n}}}". Consider restructuring via nested ViewStreams instead.`),i=i.replace(/{{[#/][\w.]+}}/g,""));const c=a.getNestedDataReducer(t,n);if(!0===(0,s.isNil)(c)||(0,s.isEmpty)(c))return"";const l=Array.isArray(c)?c:[c],d=this.currentOuterLoopData;this.currentOuterLoopData=c;const E=l.map((e,t)=>this.substituteForItem(i,e,t)).join("");return this.currentOuterLoopData=d,E})}substituteForItem(e,t,r){if("string"==typeof t){if(a.isPrimitiveTag(e)){const r=t.replace(/\$/g,"$$$$");return e.replace(a.swapParamsForTagsRE(),r)}const s=this.buildStringItemContext(t,r);return this.substituteObject(e,s)}const s=this.buildItemContext(t,r);return this.substituteObject(e,s)}buildStringItemContext(e,t){const r={spyneLoopKey:e,loopIndex:t,loopNum:t+1};if(!0===this.isProxyData){const t=this.currentOuterLoopData;if(t&&"object"==typeof t){r.__cms__dataId=t.__cms__dataId||"";const s=`__cms__keyFor_${e}`;r.origKey=void 0!==t[s]?t[s]:""}else r.__cms__dataId="",r.origKey=""}return r}buildItemContext(e,t){const r=Object.assign({},e,{loopIndex:t,loopNum:t+1});return!0===this.isProxyData&&(r.__cms__dataId=e.__cms__dataId,r.spyneLoopKey=e,r.loopIndex=t,r.loopNum=t+1),r}substituteObject(e,t){const r=/(\.)/gm,s={loopIndex:t.loopIndex,loopNum:t.loopNum};return e.replace(a.swapParamsForTagsRE(),(e,n,o)=>void 0!==s[o]?s[o]:!1===r.test(o)&&void 0!==t[o]?t[o]:this.getDataValFromPathStr(o,t))}parseTheTmplLoop(e,t,r,n){const o=n,i=a.getNestedDataReducer(this.templateData,r);if(!0===(0,s.isNil)(i)||(0,s.isEmpty)(i))return"";const c=this.currentOuterLoopData;this.currentOuterLoopData=i;const l=Array.isArray(i)?i:[i],d=a.hasLoop(o),E=l.map((e,t)=>{const r=d?this.processInnerLoop(o,e):o;return this.substituteForItem(r,e,t)}).join("");return this.currentOuterLoopData=c,E}}},192(e,t,r){r.d(t,{r:()=>c});var s=r(445),n=r(291),o=r(907),a=r(672),i=r(131);class c{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){const r=!0===this.testMode;return this.getProp("attrs").forEach((t,s)=>{if("dataset"!==s){if(!0!==r){const{allowed:r,value:n}=(0,a.Wh)(s,t,e.tagName);if(!0!==r)return void console.warn(`SPYNE WARNING: The attribute "${s}" was removed during sanitization.`,e);t=n}e.setAttribute(s,t)}else(0,i.forEachObjIndexed)((t,r)=>{e.dataset[r]=t},t)}),!0!==r&&(0,a.j2)(e),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:()=>d});var s=r(643),n=r(64),o=r(225),a=r(968),i=r(531),c=r(131);const l=!0===o.M.debug;class d{constructor(e,t){this.addMixins(),this.props=e,this.broadcastFn=t,this.broadcaster(this.broadcastFn)}addDblClickEvt(e){return(0,a.fromEvent)(e,"dblclick").pipe((0,i.map)(e=>{const t=(0,c.clone)(e);return t.typeOverRide="dblclick",t}))}broadcast(e){if(e.length<=0&&!0===l)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 i,d=this.props.el.querySelectorAll(r);if(d.length<=0){const e=this.props.el,t=t=>{t===e&&(d=[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===d||d.length<=0)&&!0===l?console.warn(`Spyne Warning: The item ${r}, does not appear to exist in ${this.props.name} --\x3e vsid:${this.props.vsid}!`):(d.forEach=Array.prototype.forEach,d.forEach(e=>{const r="dblClick"!==s?(0,a.fromEvent)(e,s,{preventDefault:()=>!0}):this.addDblClickEvt(e);i=e.dataset.channel;const o={};var l;o.payload=(0,n.Lx)(e.dataset),o.payload=(0,c.omit)(["channel"],o.payload),"ROUTE"===o.channel&&(o.payload.endPreventDefault=!0),o.channel=i,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[l=i,"ROUTE"===l||"CHANNEL_ROUTE"===l?"ROUTE":("UI"!==l&&"CHANNEL_UI"!==l&&void 0!==l&&console.warn(`SpyneJS warning: The channel, ${l}, 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:()=>l});var s=r(192),n=r(393),o=r(518),a=r(907),i=r(968),c=r(131);class l{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,a.$)(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 i.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,a.$)(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,i.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:()=>i});var s=r(225),n=r(961),o=r(158),a=r(131);class i{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,a.is)(Array),r=(0,a.is)(Object);var s;return!1===t(s=e)&&!0===r(s)?(0,a.compose)(a.fromPairs,a.toPairs,a.clone)(e):(0,a.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:()=>E});var s=r(131),n=r(225);function o(){return!0===n.M.debug}function a(e){return(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(e)}function i(e,t,r=!1){const n=l(e,t,r);return 1===n.length?(0,s.head)(n):n}function c(e,t,r){const n=document.querySelector(e),a=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));if(null===n||!1!==a(n)){if(void 0!==t&&String(t).trim().length>0){function i(e){try{return document.querySelectorAll(e).length>0}catch(e){return!1}}const c=i(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 l(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&&c(!0===s?"body":e,t,r),n}function d(e,t,r){return l(t,r).forEach(t=>{t.style.cssText=e}),this}function E(e,t){function r(t){return E(e,t)}return c(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(l(e,t)).map(r),r.forEach=r=>Array.from(l(e,t)).map(r),r.getNodeListArray=()=>l(e,t),r.addClass=r=>(l(e,t).forEach(e=>e.classList.add(r)),this),r.removeClass=r=>(l(e,t).forEach(e=>{e.classList.remove(r)}),this),r.setClass=r=>(l(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)=>(l(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(()=>{l(e,t).forEach(e=>{try{e.classList.add(r)}catch(e){}})})},r.setActiveItem2=(r,s)=>{const n=l(e,t),c="string"==typeof s?i(e,s):s;return!0===a(c)?n.forEach(e=>e.isEqualNode(c)?e.classList.add(r):e.classList.remove(r)):!0===o()&&console.warn(`Spyne Warning: The selector, ${s}, does not appear to be a valid item in setActiveItem: ${r}`),this},r.setActiveItem=(r,s)=>{const n=l(e,t),c="string"==typeof s?i(e,s):s;if(n.forEach(e=>e.classList.remove(r)),!0===a(c)){const e=Array.from(n).find(e=>e===c);e?e.classList.add(r):!0===o()&&console.warn(`Spyne Warning: The selector, ${s}, is valid but does not match any item in setActiveItem: ${r}`)}else!0===o()&&console.warn(`Spyne Warning: The selector, ${s}, does not appear to be a valid item in setActiveItem: ${r}`);return this},Object.defineProperty(r,"el",{get:()=>i(e,t,!0)}),Object.defineProperty(r,"els",{get:()=>l(e,t)}),Object.defineProperty(r,"len",{get:()=>l(e,t,!1).length}),Object.defineProperty(r,"exists",{get:()=>l(e,t,!1).length>=1}),Object.defineProperty(r,"exist",{get:()=>l(e,t,!1).length>=1}),Object.defineProperty(r,"nodeList",{get:()=>l(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),a=r(961),i=r(64),c=r(300),l=r(584),d=r(992),E=r(54),p=r(589),h=r(518),N=r(707),u=r(968),m=r(531),_=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,i.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,_.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,_.findIndex)((0,_.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,_.flatten)(t)})(e);t.forEach(r)}}static isValidNestedArr(e){const t=(0,_.equals)(!0),r=(0,_.all)(t),s=(0,_.is)(String),n=(0,_.compose)(r,(0,_.map)(s),(0,_.slice)(0,2),(0,_.defaultTo)([]));return(0,_.compose)(r,(0,_.map)(n),(0,_.defaultTo)([]))(e)}static elIsDomElement(e){return(0,_.is)(String,e)&&(e=document.querySelector(e)),(0,_.compose)((0,_.lte)(0),(0,_.defaultTo)(-1),(0,_.prop)("nodeType"))(e)}updatePropsToMatchEl(){const e=(0,_.compose)(_.toLower,(0,_.either)((0,_.prop)("tagName"),(0,_.always)("")));this.props.tagName=e(this.props.el)}elAlreadyExistsFn(e){const t=(0,_.compose)((0,_.lte)(0),(0,_.defaultTo)(-1),(0,_.prop)("nodeType"));return(0,_.propSatisfies)((0,_.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,_.curry)(this.onChannelMethodCall.bind(this));this.addActionListeners().forEach(t=>{let[r,s,n]=t;(0,_.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,_.defaultTo)((0,_.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,_.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,m.map)(e=>this.onMapViewSource(e)),(0,m.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,m.filter)(e=>void 0!==e&&void 0!==e.action),(0,m.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,m.filter)(e=>void 0!==e&&void 0!==e.action),(0,m.tap)(e=>this.tracer("addChildStraem do ",e)),(0,m.map)(e=>e),(0,m.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,_.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,m.mergeMap)(e=>{const t=e.observable.pipe((0,m.filter)(e=>void 0!==e&&void 0!==e.action),(0,m.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,m.finalize)(r)))})),this.autoSubscriber$=this.autoMergeSubject$.pipe((0,m.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,_.defaultTo)(e=>this.sendExtendedStreams(e)),r=(0,i.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,_.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,_.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,_.is)(String,t)&&(0,_.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,_.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 d.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,_.defaultTo)("",e[1]);!1===(0,_.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,_.compose)((0,_.forEach)(e),(0,_.defaultTo)([]))(t)}const s=()=>{void 0!==(0,_.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,_.ifElse)(e=>(0,l.ns)().includes(e),e=>n.M.channelsMap.getStream(e).observer.pipe((0,m.takeWhile)(e=>!0!==this.deleted)),e=>console.warn(`channel name ${e} is not within ${l.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,_.path)(["srcElement","isLocalEvent"]),a=(0,_.path)(["srcElement","vsid"]),i=[(0,m.map)(e=>{const t=e;return t.$dir=n,t}),(0,m.filter)(e=>{const t=a(e);return!0!==o(e)||t===this.props.vsid})];!0===t&&i.unshift((0,m.skip)(1));const c=this.getChannel(e).pipe(...i);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,_.defaultTo)("VIEWSTREAM_EVENT"),o=(0,_.compose)(n,(0,_.prop)(e)),i={payload:s,action:r=r||o({CHANNEL_ROUTE:"CHANNEL_ROUTE_CHANGE_EVENT"})};try{if(i.srcElement=(0,_.compose)((0,_.pick)(["id","vsid","class","tagName"]),(0,_.prop)("props"))(this),!0===this.checkIfChannelExists(e)){!1===/CHANNEL_LIFECYCLE/.test(r)&&Object.defineProperties(i,{payload:{get:()=>(0,a.l)(t)}});const s=(0,u.of)(i);return new E.u(e,s,i)}}catch(e){console.warn("SPYNE WARNING ",e)}}tracer(...e){this.sendLifecycleMethod(...e)}sendLifecycleMethodInactive(){}sendLifecycleMethodActive(e,t){const r="VS_DETRITUS_COLLECT"===t;!0===(0,_.where)({from$:(0,_.equals)("internal"),action:(0,_.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,_.path)(["srcElement","el"],e),r=(0,_.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 a(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}};return n[e](r,r.exports,a),r.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};a.r(i),a.d(i,{Channel:()=>_.c,ChannelFetch:()=>T.e,ChannelFetchUtil:()=>A.G,ChannelPayload:()=>C.m,ChannelPayloadFilter:()=>g.C,ChannelsMap:()=>c.H,DomElement:()=>l.r,DomElementTemplate:()=>d.X,SpyneApp:()=>L.D,SpyneAppProperties:()=>y.M,SpynePlugin:()=>f.V,SpyneTrait:()=>u.g,ViewStream:()=>h.A,ViewStreamBroadcaster:()=>N.e,ViewStreamElement:()=>E.q,ViewStreamPayload:()=>m.u,ViewStreamSelector:()=>p.T,deepMerge:()=>S.$,safeClone:()=>I.l,sanitizeData:()=>b.Ay,sanitizeEventTarget:()=>b.v8});var c=a(470),l=a(192),d=a(291),E=a(300),p=a(707),h=a(173),N=a(992),u=a(732),m=a(54),_=a(2),T=a(126),A=a(9),C=a(980),g=a(589),f=a(930),S=a(907),I=a(961),y=a(225),L=a(713),b=a(672);return i})());
|
|
3
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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UyxhQUFjLENBQUU2VixPQUFPLEsiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1mZXRjaC1jbGFzcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLXBheWxvYWQtY2xhc3MuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1wcm94eS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWxzLWNvbmZpZy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVscy1tYXAuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC1haS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLWxpZmVjeWNsZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLXJvdXRlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtdWkuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC13aW5kb3cuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvc3B5bmUtYXBwLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3NweW5lLXBsdWdpbnMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvY2hhbm5lbC1mZXRjaC11dGlsLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2NoYW5uZWwtcGF5bG9hZC1maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvZGVlcC1tZXJnZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9mcnAtdG9vbHMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvZ2MuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvbWl4aW5zL2Jhc2UtY29yZS1taXhpbnMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvbWl4aW5zL2Jhc2Utc3RyZWFtcy1taXhpbnMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvcm91dGUtY2hhbm5lbC11cGRhdGVyLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NhZmUtY2xvbmUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc2FuaXRpemUtZGF0YS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zYW5pdGl6ZS1odG1sLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXBsdWdpbnMtbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS10cmFpdC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtd2luZG93LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3ZpZXdzdHJlYW0tYW5pbWF0aW9ucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy92aWV3c3RyZWFtLW9ic2VydmFibGVzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL2RvbS1lbGVtZW50LXRlbXBsYXRlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL2RvbS1lbGVtZW50LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLWJyb2FkY2FzdGVyLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tcGF5bG9hZC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1zZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS5qcyIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcImRvbXB1cmlmeVwiLFwiY29tbW9uanMyXCI6XCJkb21wdXJpZnlcIixcImFtZFwiOlwiZG9tcHVyaWZ5XCIsXCJyb290XCI6XCJET01QdXJpZnlcIn0iLCJ3ZWJwYWNrOi8vc3B5bmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6XCJyYW1kYVwiLFwiY29tbW9uanMyXCI6XCJyYW1kYVwiLFwiYW1kXCI6XCJyYW1kYVwiLFwicm9vdFwiOlwiUlwifSIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcInJ4anNcIixcImNvbW1vbmpzMlwiOlwicnhqc1wiLFwiYW1kXCI6XCJyeGpzXCIsXCJyb290XCI6XCJyeGpzXCJ9Iiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOltcInJ4anNcIixcIm9wZXJhdG9yc1wiXSxcImNvbW1vbmpzMlwiOltcInJ4anNcIixcIm9wZXJhdG9yc1wiXSxcImFtZFwiOlwicnhqcy9vcGVyYXRvcnNcIixcInJvb3RcIjpbXCJyeGpzXCIsXCJvcGVyYXRvcnNcIl19Iiwid2VicGFjazovL3NweW5lL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwicnhqc1wiKSwgcmVxdWlyZShcInJhbWRhXCIpLCByZXF1aXJlKFwiZG9tcHVyaWZ5XCIpLCByZXF1aXJlKFwicnhqc1wiKVtcIm9wZXJhdG9yc1wiXSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcInNweW5lXCIsIFtcInJ4anNcIiwgXCJyYW1kYVwiLCBcImRvbXB1cmlmeVwiLCBcInJ4anMvb3BlcmF0b3JzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInNweW5lXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicnhqc1wiKSwgcmVxdWlyZShcInJhbWRhXCIpLCByZXF1aXJlKFwiZG9tcHVyaWZ5XCIpLCByZXF1aXJlKFwicnhqc1wiKVtcIm9wZXJhdG9yc1wiXSk7XG5cdGVsc2Vcblx0XHRyb290W1wic3B5bmVcIl0gPSBmYWN0b3J5KHJvb3RbXCJyeGpzXCJdLCByb290W1wiUlwiXSwgcm9vdFtcIkRPTVB1cmlmeVwiXSwgcm9vdFtcInJ4anNcIl1bXCJvcGVyYXRvcnNcIl0pO1xufSkoc2VsZiwgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xMzFfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNjM2X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUzMV9fKSA9PiB7XG5yZXR1cm4gIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IENoYW5uZWxGZXRjaFV0aWwgfSBmcm9tICcuLi91dGlscy9jaGFubmVsLWZldGNoLXV0aWwuanMnXG5pbXBvcnQgeyBwYXRoLCBwaWNrLCBtZXJnZURlZXBSaWdodCwgYWxsLCBhbGxQYXNzLCBlaXRoZXIsIHZhbHVlcywgZGVmYXVsdFRvLCByZWplY3QsIGNvbXBvc2UsIGlzTmlsIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsRmV0Y2ggZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbEZldGNoXG4gICAqIEB0eXBlIGV4dGVuZGFibGVcbiAgICogQGRlc2NcbiAgICogPHA+Q2hhbm5lbEZldGNoIGV4dGVuZHMgQ2hhbm5lbCBhbmQgaXMgZGVzaWduZWQgdG8gY3JlYXRlIGEgQ2hhbm5lbCBmcm9tIGZldGNoZWQgaHR0cCBkYXRhLjwvcD5cbiAgICogPHA+QSBDaGFubmVsRmV0Y2ggaW5zdGFuY2UgY2FuIGJlIGNyZWF0ZWQgd2l0aCBqdXN0IHRoZSBjaGFubmVsIG5hbWUgYW5kIHVybCBwcm9wZXJ0aWVzLjwvcD5cbiAgICogPHA+VGhlIGRhdGEgaXMgZmV0Y2hlZCBvbmNlLCBidXQgdGhlIENoYW5uZWxGZXRjaCdzIGRhdGEgaXMgYWx3YXlzIGF2YWlsYWJsZSB0byBvdGhlciBDaGFubmVsIGFuZCBWaWV3U3RyZWFtIGluc3RhbmNlczwvcD5cbiAgICpcbiAgICogPGgzPlRoZSBDaGFubmVsRmV0Y2ggQ2xhc3M8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5FeHRlbmRzIENoYW5uZWwgYW5kIHVzZXMgdGhlIENoYW5uZWxGZXRjaFV0aWwgdG8gbWFrZSBhbnkgdHlwZSBvZiBodHRwKHMpIHJlcXVlc3QuPC9saT5cbiAgICogPGxpPlJlcXVpcmVzIGEgdXJsIHByb3BlcnR5IGF0IGluc3RhbnRpYXRpb24uPC9saT5cbiAgICogPGxpPlRoZSByZXNwb25zZSBkYXRhIGlzIHB1Ymxpc2hlZCBhcyBhIENoYW5uZWxQYXlsb2FkLjwvbGk+XG4gICAqIDxsaT5UaGUgYWN0aW9uIGZvciB0aGUgcmV0dXJuZWQgQ2hhbm5lbEZldGNoIGRhdGEgaXMgYWx3YXlzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0LCBcIkNIQU5ORUxfTkFNRV9SRVNQT05TRV9FVkVOVFwiPC9saT5cbiAgICogPGxpPkZldGNoIGZhaWx1cmVzIChuZXR3b3JrIGVycm9ycywgbm9uLU9LIEhUVFAgc3RhdHVzZXMsIHVucGFyc2VhYmxlIHJlc3BvbnNlcykgYXJlIHB1Ymxpc2hlZCBhcyBhIGNvbmZvcm1lZCBlcnJvciBDaGFubmVsUGF5bG9hZCB3aXRoIHRoZSBhY3Rpb24gZm9ybWF0LCBcIkNIQU5ORUxfTkFNRV9FUlJPUl9FVkVOVFwiPC9saT5cbiAgICogPGxpPlRoZSBlcnJvciBwYXlsb2FkIGNvbnRhaW5zIGZpbHRlcmFibGUgcHJvcGVydGllcyBzdWNoIGFzIGVycm9yVHlwZSwgc3RhdHVzLCBzdGF0dXNUZXh0LCB1cmwgYW5kIG1lc3NhZ2UuPC9saT5cbiAgICogPGxpPlRoZSBkZWZhdWx0IHJlcXVlc3QgdHlwZSBpcyBhIEdFVCByZXF1ZXN0IHRoYXQgcmV0dXJucyBhIEpTT04gb2JqZWN0LjwvbGk+XG4gICAqIDxsaT5Ib3dldmVyLCBhbnkgdHlwZSBvZiByZXF1ZXN0IGFuZCByZXR1cm4gdHlwZSBjYW4gYmUgY29uZmlndXJlZCBieSB1c2luZyB0aGUgYm9keSBwcm9wZXJ0eSB3aGVuIGNyZWF0aW5nIHRoZSBpbnN0YW5jZS48L2xpPlxuICAgKiA8bGk+VGhlIG1hcEZuIGdpdmVzIGFjY2VzcyB0byB0aGUgcmV0dXJuZWQgcmVzcG9uc2UgYW5kIGNhbiBiZSB1c2UgdG8gcGFyc2UgdGhlIGRhdGEgYmVmb3JlIGl0IGlzIHB1Ymxpc2hlZCB0byBvdGhlciBDaGFubmVscyBhbmQgVmlld1N0cmVhbSBpbnN0YW5jZXMuIFRoZSBtYXBGbiBpcyBub3QgY2FsbGVkIGZvciBlcnJvciBwYXlsb2Fkcy48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbCBGZXRjaCB3aWxsIHNlbmQgdGhlIGxhc3QgcmVzcG9uc2UgdG8gZnV0dXJlIHN1YnNjcmliZXJzLCBhbmQgd2lsbCBub3QgbWFrZSBmdXJ0aGVyIGh0dHAocykgcmVxdWVzdHMgdW5sZXNzIGRpcmVjdGVkIHRvIGRvICBzby48L2xpPlxuICAgKiA8bGk+RGF0YSBjYW4gYmUgRmV0Y2hlZCBhZ2FpbiwgYnkgc2VuZGluZyBhIFwiQ0hBTk5FTF9OQU1FX1JFUVVFU1RfRVZFTlRcIiBhY3Rpb24gZnJvbSBhIFZpZXdTdHJlYW0ncyBzZW5kSW5mb1RvQ2hhbm5lbCBtZXRob2QuPC9saT5cbiAgICogPC91bD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSAtID0gdW5kZWZpbmVkOyBUaGUgcmVnaXN0ZXJlZCBuYW1lIGZvciB0aGUgY2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByb3BzLnVybCAtID0gdW5kZWZpbmVkOyBUaGUgdXJsIHRvIGJlIGZldGNoZWQuXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHByb3BzLm1hcEZuIC0gPSB1bmRlZmluZWQ7IFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmV0Y2hlZCByZXNwb25zZSBhbmQgYmVoYXZlcyBsaWtlIGFueSBtYXAgbWV0aG9kLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuYm9keSAtID0gdW5kZWZpbmVkOyBUaGlzIHdpbGwgdXBkYXRlIHRoZSBvcHRpb25zLCBpbmNsdWRpbmcgaGVhZGVyIG9wdGlvbnMsIHNlbnQgYWxvbmcgd2l0aCB0aGUgZmV0Y2ggcmVxdWVzdC4gRGVmYXVsdCBvcHRpb25zIHVzZXMgYSBHRVQgcmVxdWVzdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+QSBWaWV3U3RyZWFtIEluc3RhbmNlIFNlbmRpbmcgQSBGZXRjaCBVcGRhdGUgUmVxdWVzdDwvaDQ+XCJdXG4gICAqIGNvbnN0IGFjdGlvbiA9IFwiQ0hBTk5FTF9GRVRDSENIQU5ORUxfTkFNRV9SRVFVRVNUX0VWRU5UXCI7XG4gICAqIGNvbnN0IHVybCA9IFwiLy9zaXRlLmNvbS9qc29uL1wiO1xuICAgKiBjb25zdCBib2R5ID0ge1xuICAgKiAgICAgbWV0aG9kOiBcIlBPU1RcIlxuICAgKiB9XG4gICAqXG4gICAqIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoXCJDSEFOTkVMX0ZFVENIQ0hBTk5FTF9OQU1FXCIsIHthY3Rpb24sIHVybCwgYm9keX0pO1xuICAgKlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihuYW1lLCBwcm9wcyA9IHsgZGlzYWJsZVNhbml0aXplOmZhbHNlIH0pIHtcbiAgICAvLyBBTExPVyBGT1IgR0VORVJJQyBNQVAgUFJPUEVSVFlcblxuICAgIENoYW5uZWxGZXRjaC52YWxpZGF0ZU1hcE1ldGhvZChwcm9wcywgbmFtZSlcblxuICAgIGlmIChwcm9wcy5tYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMubWFwRm4gPSBwcm9wcy5tYXBcbiAgICB9XG4gICAgcHJvcHMuZXh0ZW5kZWRBY3Rpb25zQXJyID0gW1xuICAgICAgYCR7bmFtZX1fUkVTUE9OU0VfRVZFTlRgLFxuICAgICAgYCR7bmFtZX1fRVJST1JfRVZFTlRgLFxuICAgICAgW2Ake25hbWV9X1JFUVVFU1RfRVZFTlRgLCAnb25GZXRjaFVwZGF0ZSddXG4gICAgXVxuICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gdHJ1ZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlTWFwTWV0aG9kKHByb3BzLCBuYW1lLCB0ZXN0TW9kZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgaXNOb3RFbXB0eSA9IGFyciA9PiBhcnIubGVuZ3RoID49IDFcbiAgICBjb25zdCBpc05vdEZ1bmN0aW9uID0gdmFsID0+IHR5cGVvZiAodmFsKSAhPT0gJ2Z1bmN0aW9uJ1xuICAgIGNvbnN0IGlzVW5kZWZpbmVkT3JXcm9uZ1R5cGUgPSBlaXRoZXIoaXNOaWwsIGlzTm90RnVuY3Rpb24pXG4gICAgY29uc3QgaXNVbmRlZmluZWQgPSBhbGwoaXNVbmRlZmluZWRPcldyb25nVHlwZSlcbiAgICBjb25zdCBpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHkgPSBhbGxQYXNzKFtpc1VuZGVmaW5lZCwgaXNOb3RFbXB0eV0pXG4gICAgY29uc3QgbWFwTWV0aG9kSXNJbnZhbGlkID0gY29tcG9zZShpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHksIHZhbHVlcywgcGljayhbJ21hcCcsICdtYXBGbiddKSkocHJvcHMpXG5cbiAgICBpZiAobWFwTWV0aG9kSXNJbnZhbGlkKSB7XG4gICAgICBpZiAodGVzdE1vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG1hcCBtZXRob2QgZm9yIENoYW5uZWxGZXRjaCwgJHtuYW1lfSwgYXBwZWFycyB0byBiZSBpbnZhbGlkYClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBvblJlZ2lzdGVyZWQocHJvcHMgPSB0aGlzLnByb3BzKSB7XG4gICAgaWYgKHByb3BzPy5wYXVzZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zdGFydEZldGNoKClcbiAgICB9XG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucyhuYW1lKSB7XG4gICAgY29uc3QgYXJyID0gW1xuICAgICAgJ0NIQU5ORUxfUkVTUE9OU0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfRVJST1JfRVZFTlQnLFxuICAgICAgWydDSEFOTkVMX1VQREFURV9SRVNQT05TRV9FVkVOVCcsICdvbkZldGNoVXBkYXRlJ10sXG4gICAgICBbJ0NIQU5ORUxfRkVUQ0hfUkVRVUVTVF9FVkVOVCcsICdvbkZldGNoVXBkYXRlJ11cbiAgICBdXG5cbiAgICBjb25zdCBleHRlbmRlZEFyciA9IGNvbXBvc2UoZGVmYXVsdFRvKFtdKSwgcGF0aChbJ3Byb3BzJywgJ2V4dGVuZGVkQWN0aW9uc0FyciddKSlcbiAgICByZXR1cm4gYXJyLmNvbmNhdChleHRlbmRlZEFycih0aGlzKSlcbiAgfVxuXG4gIHN0YXJ0RmV0Y2gob3B0aW9ucyA9IHt9LCBzdWJzY3JpYmVyID0gdGhpcy5vbkZldGNoUmV0dXJuZWQuYmluZCh0aGlzKSkge1xuICAgIGNvbnN0IGZldGNoUHJvcHMgPSB0aGlzLmNvbnNvbGlkYXRlQWxsRmV0Y2hQcm9wcyhvcHRpb25zKVxuICAgIHJldHVybiBuZXcgQ2hhbm5lbEZldGNoVXRpbChmZXRjaFByb3BzLCBzdWJzY3JpYmVyLCBmYWxzZSwgdGhpcy5wcm9wcy5uYW1lKVxuICB9XG5cbiAgb25GZXRjaFVwZGF0ZShldnQpIHtcbiAgICBjb25zdCBwcm9wc09wdGlvbnMgPSB0aGlzLmdldFByb3BzRm9yRmV0Y2goZXZ0KVxuICAgIHRoaXMuc3RhcnRGZXRjaChwcm9wc09wdGlvbnMpXG4gIH1cblxuICBvbkZldGNoUmV0dXJuZWQoc3RyZWFtSXRlbSkge1xuICAgIGNvbnN0IGlzRmV0Y2hFcnJvciA9IHN0cmVhbUl0ZW0/LmlzQ2hhbm5lbEZldGNoRXJyb3IgPT09IHRydWVcbiAgICBjb25zdCBhY3Rpb24gPSBpc0ZldGNoRXJyb3JcbiAgICAgID8gYCR7dGhpcy5wcm9wcy5uYW1lfV9FUlJPUl9FVkVOVGBcbiAgICAgIDogYCR7dGhpcy5wcm9wcy5uYW1lfV9SRVNQT05TRV9FVkVOVGBcblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUNoYW5uZWxQYXlsb2FkSXRlbShzdHJlYW1JdGVtLCBhY3Rpb24pXG4gIH1cblxuICBjcmVhdGVDaGFubmVsUGF5bG9hZEl0ZW0ocGF5bG9hZCwgYWN0aW9uID0gYCR7dGhpcy5wcm9wcy5uYW1lfV9SRVNQT05TRV9FVkVOVGApIHtcbiAgICBjb25zdCB7IG5hbWUsIHNlbmRDYWNoZWRQYXlsb2FkLCB1cmwgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCBzcmNFbGVtZW50ID0geyBuYW1lLCBzZW5kQ2FjaGVkUGF5bG9hZCwgdXJsIH1cbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQpXG4gIH1cblxuICBnZXRQcm9wc0ZvckZldGNoKGV2dCkge1xuICAgIGNvbnN0IGRhdGFPYmogPSBldnQ/LnBheWxvYWQgPz8gZXZ0Py52aWV3U3RyZWFtSW5mbz8ucGF5bG9hZCA/PyB7fVxuICAgIHJldHVybiBwaWNrKFsnbWFwRm4nLCAndXJsJywgJ2hlYWRlcicsICdib2R5JywgJ21vZGUnLCAnbWV0aG9kJywgJ3Jlc3BvbnNlVHlwZScsICdkZWJ1ZyddLCBkYXRhT2JqKVxuICB9XG5cbiAgY29uc29saWRhdGVBbGxGZXRjaFByb3BzKG9wdGlvbnMsIHByb3BzID0gdGhpcy5wcm9wcykge1xuICAgIGNvbnN0IHByb3BzT3B0aW9ucyA9IHBpY2soWydtYXBGbicsICd1cmwnLCAnaGVhZGVyJywgJ2JvZHknLCAnbW9kZScsICdkaXNhYmxlU2FuaXRpemUnLCAnbWV0aG9kJywgJ3Jlc3BvbnNlVHlwZScsICdkZWJ1ZyddLCBwcm9wcylcbiAgICBjb25zdCBtZXJnZU9wdGlvbnMgPSAobzEsIG8yKSA9PiBtZXJnZURlZXBSaWdodChvMSwgbzIpXG4gICAgY29uc3QgZmlsdGVyT3V0VW5kZWZpbmVkID0gcmVqZWN0KGlzTmlsKVxuICAgIHJldHVybiBjb21wb3NlKGZpbHRlck91dFVuZGVmaW5lZCwgbWVyZ2VPcHRpb25zKShwcm9wc09wdGlvbnMsIG9wdGlvbnMpXG4gIH1cblxuICBnZXQgb2JzZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXIkXG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIG1lcmdlQWxsLFxuICBjbG9uZSxcbiAgZnJvbVBhaXJzLFxuICB0b1BhaXJzLFxuICBjb21wb3NlLFxuICBpbmNsdWRlcyxcbiAgcGlja0FsbCxcbiAgbHRlLFxuICBkZWZhdWx0VG8sXG4gIHByb3AsXG4gIGlzXG59IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBzYWZlQ2xvbmUgfSBmcm9tICcuLi91dGlscy9zYWZlLWNsb25lLmpzJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFBheWxvYWQge1xuICAvKipcbiAgICpcbiAgICogQWxsIENoYW5uZWwgZGF0YSBpcyBwdWJsaXNoZWQgdXNpbmcgdGhpcyBpbnRlcmZhY2UuXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFBheWxvYWRcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gc3JjRWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gY2hhbm5lbE5hbWUgLSA9IHVuZGVmaW5lZDsgVGhlIG5hbWUgb2YgdGhlIENoYW5uZWwgdGhhdCBpcyBzZW5kaW5nIHRoZSBwYXlsb2FkLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYWN0aW9uIC0gPSB1bmRlZmluZWQ7IEFuIGFjdGlvbiBzdHJpbmcgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGhpbiB0aGUgQ2hhbm5lbCdzIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHBheWxvYWQgLSA9IHVuZGVmaW5lZDsgVGhlIGRhdGEgb2JqZWN0LlxuICAgKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50IC0gPSB7fTsgVGhpcyBpcyBwb3B1bGF0ZWQgd2hlbiB0cmlnZ2VyZWQgZnJvbSBhIFZpZXdTdHJlYW0gaW5zdGFuY2UuXG4gICAqIEBwcm9wZXJ0eSB7VUlFdmVudH0gZXZlbnQgLSA9IHVuZGVmaW5lZDsgVGhlIFVJRXZlbnQsIGlmIGFueS5cbiAgICogQHJldHVybnMgVmFsaWRhdGVkIENoYW5uZWxQYXlsb2FkIGpzb24gb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihjaGFubmVsTmFtZSwgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCwgdGltZUxhYmVsKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IGNoYW5uZWxOYW1lXG4gICAgLy8gcGF5bG9hZCA9IENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUocGF5bG9hZCk7XG5cbiAgICBpZiAodGltZUxhYmVsKSB7XG4gICAgICBjb25zb2xlLnRpbWUodGltZUxhYmVsKVxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkSXRlbU9iaiA9IHsgY2hhbm5lbE5hbWUsIGFjdGlvbiwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICAgIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaGFubmVsUGF5bG9hZEl0ZW1PYmosICdwYXlsb2FkJywge2dldDogKCkgPT4gY2xvbmUocGF5bG9hZCl9KTtcbiAgICBjb25zdCBmcm96ZW5QYXlsb2FkID0gQ2hhbm5lbFBheWxvYWQuZGVlcEZyZWV6ZShwYXlsb2FkKVxuICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5wYXlsb2FkID0gZnJvemVuUGF5bG9hZFxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBoZWxwcyB3aXRoIGRlc3RydWN0dXJpbmcgYnkgbWVyZ2luZyBhbGwgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zXG4gICAgICogSlNPTiBPYmplY3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbJzxoND5EZXN0cnVjdHVyaW5nIFByb3BlcnRpZXMgdXNpbmcgdGhlIENoYW5uZWxQYXlsb2FkIHByb3BzIE1ldGhvZDwvaDQ+J11cbiAgICAgKiBsZXQge2VsLCBhY3Rpb24sIG15VmFsfSA9IHBheWxvYWQucHJvcHMoKTtcbiAgICAgKlxuICAgICAqXG4gICAgICovXG5cbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBheWxvYWQsICdwYXlsb2FkJykpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZFN0ciA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIGZvbGxvd2luZyBwYXlsb2FkIGNvbnRhaW5zIGEgbmVzdGVkIHBheWxvYWQgcHJvcGVydHkgd2hpY2ggbWF5IGNyZWF0ZSBjb25mbGljdHM6IEFjdGlvbjogJHthY3Rpb259LCAke3BheWxvYWRTdHJ9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhbm5lbEFjdGlvbnNBcnIgPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0Q2hhbm5lbEFjdGlvbnMoY2hhbm5lbClcblxuICAgICAgQ2hhbm5lbFBheWxvYWQudmFsaWRhdGVBY3Rpb24oYWN0aW9uLCBjaGFubmVsLCBjaGFubmVsQWN0aW9uc0FycilcbiAgICB9XG5cbiAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmouY2xvbmUgPSAoKSA9PiBtZXJnZUFsbChbXG4gICAgICB7IHBheWxvYWQ6c2FmZUNsb25lKGNoYW5uZWxQYXlsb2FkSXRlbU9iai5wYXlsb2FkKSB9LFxuICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLnBheWxvYWQsXG4gICAgICB7IGNoYW5uZWw6IGNsb25lKGNoYW5uZWwpIH0sXG4gICAgICB7IGV2ZW50OiBjbG9uZShldmVudCkgfSxcbiAgICAgIHsgc3JjRWxlbWVudCB9LFxuICAgICAgY2xvbmUoY2hhbm5lbFBheWxvYWRJdGVtT2JqLnNyY0VsZW1lbnQpLCB7IGFjdGlvbjogY2xvbmUoY2hhbm5lbFBheWxvYWRJdGVtT2JqLmFjdGlvbikgfVxuICAgIF0pXG5cbiAgICBjb25zdCBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcyA9IHtcbiAgICAgICRkaXI6IHtcbiAgICAgICAgZ2V0OiAoKSA9PiBjaGFubmVsUGF5bG9hZEl0ZW1PYmouX2RpcixcbiAgICAgICAgc2V0OiAodmFsKSA9PiB7XG4gICAgICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLl9kaXIgPSB2YWxcbiAgICAgICAgICByZXR1cm4gdmFsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbm5lbCA9PT0gJ0NIQU5ORUxfUk9VVEUnKSB7XG4gICAgICAvLyBjaGFubmVsUGF5bG9hZEl0ZW1PYmpbJ2xvY2F0aW9uJ10gPSBDaGFubmVsUGF5bG9hZC5nZXRMb2NhdGlvbkRhdGEoKTtcbiAgICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzLmxvY2F0aW9uID0ge1xuICAgICAgICBnZXQ6ICgpID0+IENoYW5uZWxQYXlsb2FkLmdldExvY2F0aW9uRGF0YSgpXG4gICAgICB9XG4gICAgICAvKiBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wc1sncm91dGVEYXRhJ10gPSB7XG4gICAgICAgIGdldDogKCk9PnByb3AoJ3JvdXRlRGF0YScsIGZyb3plblBheWxvYWQpXG4gICAgICB9XG4qL1xuICAgIH1cblxuICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5fZGlyID0gdW5kZWZpbmVkXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjaGFubmVsUGF5bG9hZEl0ZW1PYmosIGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzKVxuXG4gICAgaWYgKHRpbWVMYWJlbCkge1xuICAgICAgY29uc29sZS50aW1lRW5kKHRpbWVMYWJlbClcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxQYXlsb2FkSXRlbU9ialxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlQWN0aW9uKGFjdGlvbiwgY2hhbm5lbCwgYXJyKSB7XG4gICAgY29uc3QgaXNJbkFyciA9IGluY2x1ZGVzKGFjdGlvbiwgYXJyKVxuICAgIGlmIChpc0luQXJyID09PSBmYWxzZSAmJiBTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2Fybihgd2FybmluZzogQWN0aW9uOiAnJHthY3Rpb259JyBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoaW4gdGhlICR7Y2hhbm5lbH0gY2hhbm5lbCFgKVxuICAgIH1cbiAgICByZXR1cm4gaXNJbkFyclxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxuXG4gIHN0YXRpYyBnZXRTdHJlYW1JdGVtKCkge1xuXG4gIH1cblxuICBzdGF0aWMgZGVlcENsb25lKG8pIHtcbiAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0KVxuICAgIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gICAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICAgIHJldHVybiBpc0l0ZXJhYmxlID8gY29tcG9zZShmcm9tUGFpcnMsIHRvUGFpcnMsIGNsb25lKShvKSA6IGNsb25lKG8pXG4gIH1cblxuICBzdGF0aWMgZGVlcEZyZWV6ZShvKSB7XG4gICAgLy8gcmV0dXJuIG87XG4gICAgLy8gcmV0dXJuIE9iamVjdC5mcmVlemUobyk7XG4gICAgY29uc3QgZWxJc0RvbUVsZW1lbnQgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcblxuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZnJlZXplKG8pXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwcm9wKSAmJlxuICAgICAgICAgICAgZWxJc0RvbUVsZW1lbnQob1twcm9wXSkgPT09IGZhbHNlICYmXG4gICAgICAgICAgICBvW3Byb3BdICE9PSBudWxsICYmXG4gICAgICAgICAgICAodHlwZW9mIG9bcHJvcF0gPT09ICdvYmplY3QnIHx8IHR5cGVvZiBvW3Byb3BdID09PSAnZnVuY3Rpb24nKSAmJlxuICAgICAgICAgICAgIU9iamVjdC5pc0Zyb3plbihvW3Byb3BdKSkge1xuICAgICAgICAgIENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUob1twcm9wXSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkZSRUVaRSBFUlIgXCIse28sZX0pO1xuICAgICAgcmV0dXJuIG9cbiAgICB9XG5cbiAgICByZXR1cm4gb1xuICB9XG5cbiAgc3RhdGljIGdldE1vdXNlRXZlbnRLZXlzKCkge1xuICAgIHJldHVybiBbJ2FsdEtleScsICdidWJibGVzJywgJ2NhbmNlbEJ1YmJsZScsICdjYW5jZWxhYmxlJywgJ2NsaWVudFgnLCAnY2xpZW50WScsICdjb21wb3NlZCcsICdjdHJsS2V5JywgJ2N1cnJlbnRUYXJnZXQnLCAnZGVmYXVsdFByZXZlbnRlZCcsICdkZXRhaWwnLCAnZXZlbnRQaGFzZScsICdmcm9tRWxlbWVudCcsICdpc1RydXN0ZWQnLCAnbGF5ZXJYJywgJ2xheWVyWScsICdtZXRhS2V5JywgJ21vdmVtZW50WCcsICdtb3ZlbWVudFknLCAnb2Zmc2V0WCcsICdvZmZzZXRZJywgJ3BhZ2VYJywgJ3BhZ2VZJywgJ3BhdGgnLCAncmVsYXRlZFRhcmdldCcsICdyZXR1cm5WYWx1ZScsICdzY3JlZW5YJywgJ3NjcmVlblknLCAnc2hpZnRLZXknLCAnc291cmNlQ2FwYWJpbGl0aWVzJywgJ3NyY0VsZW1lbnQnLCAndGFyZ2V0JywgJ3RpbWVTdGFtcCcsICd0b0VsZW1lbnQnLCAndHlwZScsICd2aWV3JywgJ3doaWNoJywgJ3gnLCAneSddXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFN1YmplY3QsIFJlcGxheVN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGluY2x1ZGVzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBkZWxheUNhbGwgfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsUHJveHkgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFByb3h5XG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICpcbiAgICogQGRlc2NcbiAgICogQSBwcm94eSBjaGFubmVsIGlzIGNyZWF0ZWQgd2hlbiBhIGNoYW5uZWwgaXMgc3Vic2NyaWJlZCB0byBiZWZvcmUgaXQgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIHByb3BzID0ge30pIHtcbiAgICBwcm9wcy5pc1Byb3h5ID0gdHJ1ZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICAgIHRoaXMuc3ViamVjdCQgPSBuZXcgU3ViamVjdCgpXG4gICAgdGhpcy5yZXBsYXlTdWIkID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9ic2VydmVyJCA9IG1lcmdlKHRoaXMuc3ViamVjdCQsIHRoaXMucmVwbGF5U3ViJClcbiAgICBjb25zdCBpc0Rldk1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXMuZGVidWdcbiAgICBpZiAoaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5KG5hbWUpXG4gICAgfVxuICB9XG5cbiAgZ2V0TWVyZ2VkU3ViamVjdChwZXJpc3REYXRhID0gZmFsc2UpIHtcbiAgICByZXR1cm4gcGVyaXN0RGF0YSA9PT0gdHJ1ZSA/IHRoaXMucmVwbGF5U3ViJCA6IHRoaXMuc3ViamVjdCRcbiAgfVxuXG4gIGNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5KGNoYW5uZWxOYW1lKSB7XG4gICAgY29uc3QgbmFtZSA9IGNoYW5uZWxOYW1lXG5cbiAgICBjb25zdCBjaGVja0lmUHJveHkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBib29sID0gaW5jbHVkZXMobmFtZSwgU3B5bmVBcHBQcm9wZXJ0aWVzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoKSlcbiAgICAgIGlmIChib29sICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGNoYW5uZWwsICR7bmFtZX0gZG9lcyBub3QgYXBwZWFyIHRvIGJlIHJlZ2lzdGVyZWQhYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWxheUNhbGwoY2hlY2tJZlByb3h5LCAxMDAwKVxuICB9XG5cbiAgZ2V0IHJlcGxheVN1YmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGF5U3ViJFxuICB9XG5cbiAgZ2V0IHN1YmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdCRcbiAgfVxufVxuIiwiaW1wb3J0IHsgcmVnaXN0ZXJlZFN0cmVhbU5hbWVzIH0gZnJvbSAnLi9jaGFubmVscy1jb25maWcuanMnXG5pbXBvcnQgeyBDaGFubmVsUGF5bG9hZCB9IGZyb20gJy4vY2hhbm5lbC1wYXlsb2FkLWNsYXNzLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBSb3V0ZUNoYW5uZWxVcGRhdGVyIH0gZnJvbSAnLi4vdXRpbHMvcm91dGUtY2hhbm5lbC11cGRhdGVyLmpzJ1xuXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBmb3JrSm9pbiwgRU1QVFkgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHRha2UsIGNvbWJpbmVMYXRlc3RXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQge1xuICBpZkVsc2UsXG4gIGlkZW50aXR5LFxuICBoZWFkLFxuICBtZXJnZUFsbCxcbiAgb2JqT2YsXG4gIHZpZXcsXG4gIGlzLFxuICBjaGFpbixcbiAgbGVuc0luZGV4LFxuICBhbHdheXMsXG4gIGZyb21QYWlycyxcbiAgcGF0aCxcbiAgaXNFbXB0eSxcbiAgZXF1YWxzLFxuICBwcm9wLFxuICBwcm9wRXFcbiAgLCBtYXAgYXMgck1hcFxufSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsXG4gICAqIEB0eXBlIGV4dGVuZGFibGVcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+VGhlIENoYW5uZWwgY29tcG9uZW50IHdyYXBzIG1ldGhvZHMgYW5kIGZ1bmN0aW9uYWxpdHkgYXJvdW5kIGFuIFJ4SnMgU3ViamVjdCwgdG8gY3JlYXRlIGEgb25lLXdheSBkYXRhIGZsb3cgYmV0d2VlbiBpdHNlbGYgYW5kIG90aGVyIENoYW5uZWxzIGFuZCBWaWV3U3RyZWFtcy48L3A+XG4gICAqIDxwPkNoYW5uZWxzIGdldCBkYXRhIGJ5IGltcG9ydGluZyBqc29uIG9iamVjdHMsIHN1YnNjcmliaW5nIHRvIG90aGVyIENoYW5uZWxzIGFuZCBieSBwYXJzaW5nIFZpZXdTdHJlYW0gaW5mby48L3A+XG4gICAqIDxoMz5UaGUgQmFzaWMgQ2hhbm5lbCBTdHJ1Y3R1cmU8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5DaGFubmVscyByZXF1aXJlcyBhIHVuaXF1ZSBuYW1lLCBmb3IgZXhhbXBsZSwgPGI+Q0hBTk5FTF9NWUNIQU5ORUw8L2I+LCB3aGljaCBjb21wb25lbnRzIHVzZSB0byBzZWxlY3QgYW5kIHN1YnNjcmliZSB0byBhbnkgY2hhbm5lbC48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbHMgYXJlIGluc3RhbnRpYXRlZCBhbmQgJ3JlZ2lzdGVyZWQnIHdpdGggdGhlIExJTktbJ1NweW5lQXBwJywgJ3NweW5lLWFwcCddLjwvbGk+XG4gICAqIDxsaT5DaGFubmVscyByZW1haW4gcGVyc2lzdGVudCBhbmQgYXJlIG5vdCBkZWxldGVkLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIDxoMz5Db21wb25lbnRzIHRoYXQgZXh0ZW5kIENoYW5uZWw8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5UaGUgZm91ciBTcHluZSBDaGFubmVscywgTElOS1snU3B5bmVDaGFubmVsVUknLCAnc3B5bmUtY2hhbm5lbC11LWknXSwgTElOS1snU3B5bmVDaGFubmVsV2luZG93JywgJ3NweW5lLWNoYW5uZWwtd2luZG93J10sIExJTktbJ1NweW5lQ2hhbm5lbFJvdXRlJywgJ3NweW5lLWNoYW5uZWwtcm91dGUnXSBhbmQgTElOS1snU3B5bmVDaGFubmVsTGlmZWN5Y2xlJywgJ3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlJ10sIGFsbCBleHRlbmQgQ2hhbm5lbC48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbEZldGNoIGFsc28gZXh0ZW5kcyBDaGFubmVsLCBhZGRzIGEgQ2hhbm5lbEZldGNoVXRpbCBjb21wb25lbnQgdG8gaW1tZWRpYXRlbHkgcHVibGlzaCBmZXRjaGVkIHJlc3BvbnNlcy48L2xpPlxuICAgKiA8L3VsPlxuICAgKiA8aDM+U2VuZGluZyBDaGFubmVsUGF5bG9hZHM8L2gzPlxuICAgKiAgIDxwPkNoYW5uZWxzIHNlbmQgZGF0YSB1c2luZyB0aGUgPGEgY2xhc3M9J2xpbmtlcicgZGF0YS1jaGFubmVsPVwiUk9VVEVcIiAgZGF0YS1ldmVudC1wcmV2ZW50LWRlZmF1bHQ9XCJ0cnVlXCIgZGF0YS1tZW51LWl0ZW09XCJjaGFubmVsLXNlbmQtY2hhbm5lbC1wYXlsb2FkXCIgIGhyZWY9XCIvZ3VpZGUvcmVmZXJlbmNlL2NoYW5uZWwtc2VuZC1jaGFubmVsLXBheWxvYWRcIiA+c2VuZENoYW5uZWxQYXlsb2FkPC9hPlxuICAgbWV0aG9kLjwvcD5cbiAgICpcbiAgICpcbiAgICogPGgzPlJlY2VpdmluZyBEYXRhIGZyb20gVmlld1N0cmVhbSBJbnN0YW5jZXM8L2gzPlxuICAgKiA8cD5WaWV3U3RyZWFtcyBjYW4gc2VuZCBkYXRhIHRvIGFueSBjdXN0b20gY2hhbm5lbCB1c2luZyB0aGUgPGEgY2xhc3M9J2xpbmtlcicgZGF0YS1jaGFubmVsPVwiUk9VVEVcIiAgZGF0YS1ldmVudC1wcmV2ZW50LWRlZmF1bHQ9XCJ0cnVlXCIgZGF0YS1tZW51LWl0ZW09XCJ2aWV3LXN0cmVhbS1zZW5kLWludG8tdG8tY2hhbm5lbFwiICBocmVmPVwiL2d1aWRlL3JlZmVyZW5jZS92aWV3LXN0cmVhbS1zZW5kLWluZm8tdG8tY2hhbm5lbFwiID5zZW5kSW5mb1RvQ2hhbm5lbDwvYT5cbiAgIG1ldGhvZC4gQ2hhbm5lbHMgY2FtIGxpc3RlbiB0byBhbnkgVmlld1N0cmVhbSBkYXRhIGRpcmVjdGVkIHRvIGl0c2VsZiB0aHJvdWdoIHRoZSBkZWZhdWx0IG1ldGhvZCwgPGEgY2xhc3M9J2xpbmtlcicgZGF0YS1jaGFubmVsPVwiUk9VVEVcIiAgZGF0YS1ldmVudC1wcmV2ZW50LWRlZmF1bHQ9XCJ0cnVlXCIgZGF0YS1tZW51LWl0ZW09XCJjaGFubmVsLW9uLXZpZXctc3RyZWFtLWluZm9cIiAgaHJlZj1cIi9ndWlkZS9yZWZlcmVuY2UvY2hhbm5lbC1vbi12aWV3LXN0cmVhbS1pbmZvXCIgPm9uVmlld1N0cmVhbUluZm88L2E+LiA8L3A+XG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlJlZ2lzdGVyaW5nIGEgTmV3IENoYW5uZWwgSW5zdGFuY2U8L2g0PlwiXVxuICAgKiBTcHluZUFwcC5yZWdpc3RlcihuZXcgQ2hhbm5lbChcIkNIQU5ORUxfTVlDSEFOTkVMXCIpO1xuICAgKlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IENIQU5ORUxfTkFNRVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhpcyBqc29uIG9iamVjdCB0YWtlcyBpbiBwYXJhbWV0ZXJzIHRvIGluaXRpYWxpemUgdGhlIGNoYW5uZWxcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gdW5kZWZpbmVkOyBUaGlzIHdpbGwgYmUgdGhlIHJlZ2lzdGVyZWQgbmFtZSBmb3IgdGhpcyBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMgLSA9IHt9OyBUaGUgcHJvcHMgb2JqZWN0cyBhbGxvd3MgZm9yIGN1c3RvbSBwcm9wZXJ0aWVzIGZvciB0aGUgY2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkIC0gPSBmYWxzZTsgUHVibGlzaGVzIGl0cyBtb3N0IGN1cnJlbnQgcGF5bG9hZCB0byBsYXRlIHN1YnNjcmliZXJzLCB3aGVuIHNldCB0byB0cnVlLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoQ0hBTk5FTF9OQU1FLCBwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5hZGRSZWdpc3RlcmVkQWN0aW9ucy5iaW5kKHRoaXMpXG4gICAgdGhpcy5jcmVhdGVDaGFubmVsQWN0aW9uc09iaihDSEFOTkVMX05BTUUsIHByb3BzLmV4dGVuZGVkQWN0aW9uc0FycilcblxuICAgIC8vIEJhc2ljIHByb3BzIHNldHVwXG4gICAgcHJvcHMubmFtZSA9IENIQU5ORUxfTkFNRVxuICAgIHByb3BzLmRlZmF1bHRBY3Rpb25zID0gcHJvcHMuZGF0YSAhPT0gdW5kZWZpbmVkID8gW2Ake3Byb3BzLm5hbWV9X0VWRU5UYF0gOiBbXVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgdGhpcy5wcm9wcy5pc1JlZ2lzdGVyZWQgPSBmYWxzZVxuICAgIHRoaXMucHJvcHMuaXNQcm94eSA9XG4gICAgICB0aGlzLnByb3BzLmlzUHJveHkgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdGhpcy5wcm9wcy5pc1Byb3h5XG5cbiAgICAvLyBEZXRlcm1pbmUgYSBkZWZhdWx0IGZyb20gcHJlc2VuY2Ugb2YgcHJvcHMuZGF0YVxuICAgIGNvbnN0IGRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCA9IHRoaXMucHJvcHMuZGF0YSAhPT0gdW5kZWZpbmVkXG5cbiAgICAvLyBJZiBwcm9wcy5yZXBsYXkgaXMgZGVmaW5lZCwgb3ZlcnJpZGUgc2VuZENhY2hlZFBheWxvYWQgd2l0aCBpdC5cbiAgICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgZXhpc3Rpbmcgc2VuZENhY2hlZFBheWxvYWQgcHJvcGVydHkgb3IgZGVmYXVsdC5cbiAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMucmVwbGF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRoaXMucHJvcHMucmVwbGF5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPVxuICAgICAgICB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbFxuICAgICAgICAgIDogdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZFxuICAgIH1cblxuICAgIHRoaXMuc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbCA9IG5ldyBSb3V0ZUNoYW5uZWxVcGRhdGVyKHRoaXMpXG4gICAgdGhpcy5jcmVhdGVDaGFubmVsQWN0aW9uTWV0aG9kcygpXG5cbiAgICAvLyBTZXQgdXAgc3RyZWFtc1xuICAgIHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXBcbiAgICBjb25zdCBvYnNlcnZlciQgPSB0aGlzLmdldE1haW5PYnNlcnZlcigpXG4gICAgdGhpcy5jaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSA9IENoYW5uZWwuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUuYmluZCh0aGlzKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gdGhpcy5wcm9wcy5vYnNlcnZlciA9IG9ic2VydmVyJFxuXG4gICAgLy8gU3Vic2NyaWJlIHRvIERJU1BBVENIRVJcbiAgICBjb25zdCBkaXNwYXRjaGVyU3RyZWFtJCA9IHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIuZ2V0U3RyZWFtKCdESVNQQVRDSEVSJylcbiAgICBjb25zdCBwYXlsb2FkUHJlZEJ5Q2hhbm5lbE5hbWUgPSBwcm9wRXEocHJvcHMubmFtZSwgJ25hbWUnKVxuICAgIGRpc3BhdGNoZXJTdHJlYW0kXG4gICAgICAucGlwZShmaWx0ZXIocGF5bG9hZFByZWRCeUNoYW5uZWxOYW1lKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZhbCkgPT4gdGhpcy5vblJlY2VpdmVkT2JzZXJ2YWJsZSh2YWwpKVxuICB9XG5cbiAgZ2V0TWFpbk9ic2VydmVyKCkge1xuICAgIGlmICh0aGlzLnN0cmVhbXNDb250cm9sbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGZvbGxvd2luZyBjaGFubmVsLCAke3RoaXMucHJvcHMubmFtZX0sIGFwcGVhcnMgdG8gYmUgcmVnaXN0ZXJlZCBiZWZvcmUgU3B5bmUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuYClcbiAgICB9XG5cbiAgICBjb25zdCBwcm94eUV4aXN0cyA9IHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIudGVzdFN0cmVhbSh0aGlzLnByb3BzLm5hbWUpXG5cbiAgICBpZiAocHJveHlFeGlzdHMgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbXNDb250cm9sbGVyLmdldFByb3h5U3ViamVjdCh0aGlzLnByb3BzLm5hbWUsIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID09PSB0cnVlID8gbmV3IFJlcGxheVN1YmplY3QoMSkgOiBuZXcgU3ViamVjdCgpXG4gICAgfVxuICB9XG5cbiAgLy8gIE9WRVJSSURFIElOSVRJQUxJWkFUSU9OIE1FVEhPRFxuICAvKipcbiAgICogPHA+KERlcHJlY2F0ZWQuIFVzZSBvblJlZ2lzdGVyZWQpLiBUaGlzIG1ldGhvZCBpcyBlbXB0eSBhbmQgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIENoYW5uZWwgaGFzIGJlZW4gcmVnaXN0ZXJlZC48L3A+XG4gICAqIDxwPlRhc2tzIHN1Y2ggYXMgc3Vic2NyaWJpbmcgdG8gb3RoZXIgY2hhbm5lbHMsIGFuZCBzZW5kaW5nIGluaXRpYWwgcGF5bG9hZHMgY2FuIGJlIGFkZGVkIGhlcmUuPC9wPlxuICAgKi9cbiAgb25DaGFubmVsSW5pdGlhbGl6ZWQoKSB7XG5cbiAgfVxuXG4gIC8vICBPVkVSUklERSBJTklUSUFMSVpBVElPTiBNRVRIT0RcbiAgLyoqXG4gICAqIDxwPlRoaXMgbWV0aG9kIGlzIGVtcHR5IGFuZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgQ2hhbm5lbCBoYXMgYmVlbiByZWdpc3RlcmVkLjwvcD5cbiAgICogPHA+VGFza3Mgc3VjaCBhcyBzdWJzY3JpYmluZyB0byBvdGhlciBjaGFubmVscywgYW5kIHNlbmRpbmcgaW5pdGlhbCBwYXlsb2FkcyBjYW4gYmUgYWRkZWQgaGVyZS48L3A+XG4gICAqL1xuICBvblJlZ2lzdGVyZWQocHJvcHMgPSB0aGlzLnByb3BzKSB7XG4gICAgaWYgKHByb3BzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYWN0aW9uID0gT2JqZWN0LmtleXModGhpcy5jaGFubmVsQWN0aW9ucylbMF1cbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiQ0hBTk5FTFMgQUNUSU9OUyBJUyBcIix0aGlzLmNoYW5uZWxBY3Rpb25zKTtcbiAgICAgIC8vIE9iamVjdCh0aGlzLmNoYW5uZWxBY3Rpb25zKS5rZXlzWzBdO1xuICAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwcm9wcy5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIGdldCBpc1Byb3h5KCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmlzUHJveHlcbiAgfVxuXG4gIGdldCBjaGFubmVsTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5uYW1lXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NcbiAgICogcmV0dXJucyB0aGUgc291cmNlIG9ic2VydmFibGUgZm9yIHRoZSBjaGFubmVsXG4gICAqL1xuICBnZXQgb2JzZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXIkXG4gIH1cblxuICBjaGVja0ZvclRyYWl0cygpIHtcbiAgICBjb25zdCBhZGRUcmFpdHMgPSAodHJhaXRzKSA9PiB7XG4gICAgICBpZiAodHJhaXRzLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdBcnJheScpIHtcbiAgICAgICAgdHJhaXRzID0gW3RyYWl0c11cbiAgICAgIH1cbiAgICAgIGNvbnN0IGFkZFRyYWl0ID0gKFRyYWl0Q2xhc3MpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFpdENsYXNzKHRoaXMpXG4gICAgICB9XG5cbiAgICAgIHRyYWl0cy5mb3JFYWNoKGFkZFRyYWl0KVxuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLnRyYWl0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZGRUcmFpdHModGhpcy5wcm9wcy50cmFpdHMpXG4gICAgfVxuICB9XG5cbiAgLy8gRE8gTk9UIE9WRVJSSURFIFRISVMgTUVUSE9EXG4gIGluaXRpYWxpemVTdHJlYW0oKSB7XG4gICAgdGhpcy5jaGVja0ZvclRyYWl0cygpXG4gICAgdGhpcy5vbkNoYW5uZWxJbml0aWFsaXplZCgpXG4gICAgdGhpcy5jaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSgpXG4gICAgdGhpcy5vblJlZ2lzdGVyZWQoKVxuICAgIHRoaXMucHJvcHMuaXNSZWdpc3RlcmVkID0gdHJ1ZVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlKHByb3BzID0gdGhpcy5wcm9wcywgYWN0aW9uc09iaiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMpIHtcbiAgICBjb25zdCBhY3Rpb25zT2JqSXNFbXB0eSA9IGlzRW1wdHkoYWN0aW9uc09iailcbiAgICBjb25zdCBkYXRhSXNBZGRlZCA9IHByb3AoJ2RhdGEnLCBwcm9wcykgIT09IHVuZGVmaW5lZFxuICAgIGNvbnN0IGF1dG9TZXRUb0NhY2hlZFBheWxvYWQgPSBhY3Rpb25zT2JqSXNFbXB0eSA9PT0gdHJ1ZSAmJiBkYXRhSXNBZGRlZCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHNldERlZmF1bHRBY3Rpb25zT2JqID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBuYW1lIH0gPSBwcm9wc1xuICAgICAgY29uc3QgYWN0aW9uU3RyID0gYCR7bmFtZX1fRVZFTlRgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBbYWN0aW9uU3RyXSA6IGFjdGlvblN0clxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhdXRvU2V0VG9DYWNoZWRQYXlsb2FkKSB7XG4gICAgICBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRydWVcbiAgICAgIGFjdGlvbnNPYmogPSBzZXREZWZhdWx0QWN0aW9uc09iaigpXG5cbiAgICAgIGlmICh0aGlzLmNoYW5uZWxBY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jaGFubmVsQWN0aW9ucyA9IGFjdGlvbnNPYmpcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIlBST1BTIElTIFwiLHthY3Rpb25zT2JqSXNFbXB0eSwgZGF0YUlzQWRkZWQsIHByb3BzLCBhY3Rpb25zT2JqfSwgdGhpcy5jaGFubmVsQWN0aW9ucylcbiAgICByZXR1cm4geyBwcm9wcywgYWN0aW9uc09iaiB9XG4gIH1cblxuICBzZXRUcmFjZShib29sKSB7XG4gIH1cblxuICBjcmVhdGVDaGFubmVsQWN0aW9uc09iaihuYW1lLCBleHRlbmRlZEFjdGlvbnNBcnIgPSBbXSkge1xuICAgIGNvbnN0IGdldEFjdGlvblZhbCA9IGlmRWxzZShpcyhTdHJpbmcpLCBpZGVudGl0eSwgaGVhZClcbiAgICBjb25zdCBtYWluQXJyID0gZXh0ZW5kZWRBY3Rpb25zQXJyLmNvbmNhdCh0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKG5hbWUpKVxuICAgIGNvbnN0IGFyciA9IHJNYXAoZ2V0QWN0aW9uVmFsLCBtYWluQXJyKVxuICAgIGNvbnN0IGNvbnZlcnRlciA9IHN0ciA9PiBvYmpPZihzdHIsIHN0cilcbiAgICBjb25zdCBvYmogPSBtZXJnZUFsbChjaGFpbihjb252ZXJ0ZXIsIGFycikpXG4gICAgdGhpcy5jaGFubmVsQWN0aW9ucyA9IG9ialxuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMoKSB7XG4gICAgY29uc3QgZGVmYXVsdEZuID0gJ29uVmlld1N0cmVhbUluZm8nXG4gICAgY29uc3QgZ2V0QWN0aW9uVmFsID0gaWZFbHNlKGlzKFN0cmluZyksIGlkZW50aXR5LCBoZWFkKVxuICAgIGNvbnN0IGRlbGF5Q2hlY2tJZlRyYWl0TWV0aG9kSGFzQmVlbkFkZGVkID0gKG1ldGhvZFN0ciwgdmFsKSA9PiB7XG4gICAgICBjb25zdCBkZWxheWVyID0gKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXNbbWV0aG9kU3RyXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgXCIke3RoaXMucHJvcHMubmFtZX1cIiwgUkVRVUlSRVMgVEhFIEZPTExPV0lORyBNRVRIT0QgJHttZXRob2RTdHJ9IEZPUiBBQ1RJT04sICR7dmFsWzBdfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5ZXIsIDEwMClcbiAgICB9XG5cbiAgICBjb25zdCBnZXRDdXN0b21NZXRob2QgPSB2YWwgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kU3RyID0gdmlldyhsZW5zSW5kZXgoMSksIHZhbClcbiAgICAgIGRlbGF5Q2hlY2tJZlRyYWl0TWV0aG9kSGFzQmVlbkFkZGVkKG1ldGhvZFN0ciwgdmFsKVxuICAgICAgcmV0dXJuIG1ldGhvZFN0clxuICAgIH1cblxuICAgIGNvbnN0IGdldEFyck1ldGhvZCA9ICBpZkVsc2UoaXMoU3RyaW5nKSwgYWx3YXlzKGRlZmF1bHRGbiksIGdldEN1c3RvbU1ldGhvZClcblxuICAgIGNvbnN0IGNyZWF0ZU9iaiA9IHZhbCA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBnZXRBY3Rpb25WYWwodmFsKVxuICAgICAgY29uc3QgbWV0aG9kID0gIGdldEFyck1ldGhvZCh2YWwpXG4gICAgICByZXR1cm4gW2tleSwgbWV0aG9kXVxuICAgIH1cblxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbk1ldGhvZHMgPSBmcm9tUGFpcnMock1hcChjcmVhdGVPYmosIHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSkpXG5cbiAgICAvLyBjb25zb2xlLmxvZygndGhlIGNoYW5uZWwgYWN0aW9uIG1ldGhvZHMgJyx0aGlzLmNoYW5uZWxBY3Rpb25NZXRob2RzKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5DaGFubmVscyBzZW5kIGFsb25nIEFjdGlvbiBuYW1lcyBhbG9uZyB3aXRoIGl0cyBwYXlsb2FkLjwvcD5cbiAgICogPHA+QmVmb3JlIGFueSBhY3Rpb24gY2FuIGJlIHVzZWQsIHRoYXQgYWN0aW9uIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgdXNpbmcgdGhpcyBtZXRob2QuPC9wPlxuICAgKiA8cD5WaWV3U3RyZWFtIGluc3RhbmNlcyBjYW4gZmlsdGVyIENoYW5uZWxQYXlsb2FkcyBieSBiaW5kaW5nIHNwZWNpZmljIExJTktbJ2FjdGlvbnMgdG8gbG9jYWwgbWV0aG9kcycsICd2aWV3LXN0cmVhbS1hZGQtYWN0aW9uLWxpc3RlbmVycyddLjwvcD5cbiAgICogPHA+Rm9yY2luZyByZWdpc3RyYXRpb24gb2YgYWN0aW9ucyBhbGxvd3MgU3B5bmUgdG8gdmFsaWRhdGUgQWN0aW9ucywgYW5kIGlzIGFsc28gYSB1c2VmdWwgd2F5IHRvIGtlZXAgdHJhY2sgb2YgYWxsIEFjdGlvbnMgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZC48L3A+XG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEFycmF5IG9mIFN0cmluZ3NcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+UmVnaXN0ZXJpbmcgQWN0aW9ucyBpbiB0aGUgYWRkUmVnaXN0ZXJlZEFjdGlvbnMgbWV0aG9kPC9oND5cIl1cbiAgICogICAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAqICAgICByZXR1cm4gW1xuICAgKiAgICAgICAgJ0NIQU5ORUxfTVlfQ0hBTk5FTF9FVkVOVCcsXG4gICAqICAgICAgICAnQ0hBTk5FTF9NWV9DSEFOTkVMX1VQREFURV9FVkVOVCdcbiAgICogICAgICAgXTtcbiAgICogICAgICB9XG4gICAqXG4gICAqL1xuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICBsZXQgYXJyID0gW11cbiAgICBpZiAocGF0aChbJ3Byb3BzJywgJ2RhdGEnXSwgdGhpcykpIHtcbiAgICAgIGFyciA9IFtgJHt0aGlzLnByb3BzLm5hbWV9X0VWRU5UYF1cbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgb25SZWNlaXZlZE9ic2VydmFibGUob2JqKSB7XG4gICAgdGhpcy5vbkluY29taW5nT2JzZXJ2YWJsZShvYmopXG4gIH1cblxuICBnZXRBY3Rpb25NZXRob2RGb3JPYnNlcnZhYmxlKG9iaikge1xuICAgIG9iai51bnBhY2tlZCA9IHRydWVcbiAgICBjb25zdCBkZWZhdWx0Rm4gPSB0aGlzLm9uVmlld1N0cmVhbUluZm8uYmluZCh0aGlzKVxuXG4gICAgY29uc3QgbWV0aG9kU3RyID0gcGF0aChbJ2RhdGEnLCAnYWN0aW9uJ10sIG9iailcbiAgICBjb25zdCBtZXRob2RWYWwgPSBwcm9wKG1ldGhvZFN0ciwgdGhpcy5jaGFubmVsQWN0aW9uTWV0aG9kcylcblxuICAgIGxldCBmbiA9IGRlZmF1bHRGblxuXG4gICAgaWYgKG1ldGhvZFZhbCAhPT0gdW5kZWZpbmVkICYmIG1ldGhvZFZhbCAhPT0gJ29uVmlld1N0cmVhbUluZm8nKSB7XG4gICAgICBjb25zdCBtZXRob2RFeGlzdHMgPSB0eXBlb2YgKHRoaXNbbWV0aG9kVmFsXSkgPT09ICdmdW5jdGlvbidcbiAgICAgIGlmIChtZXRob2RFeGlzdHMgPT09IHRydWUpIHtcbiAgICAgICAgZm4gPSB0aGlzW21ldGhvZFZhbF0uYmluZCh0aGlzKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmblxuICB9XG5cbiAgb25JbmNvbWluZ09ic2VydmFibGUob2JqKSB7XG4gICAgY29uc3QgZXFzTmFtZSA9IGVxdWFscyhvYmoubmFtZSwgdGhpcy5wcm9wcy5uYW1lKVxuICAgIGNvbnN0IHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50IH0gPSBvYmouZGF0YVxuICAgIC8vIGNvbnNvbGUubG9nKFwiSU5DT01JTkcgXCIse2FjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudH0sIHtvYmp9KTtcbiAgICBjb25zdCBtZXJnZVByb3BzID0gKGQpID0+IG1lcmdlQWxsKFtkLCB7IGFjdGlvbjogcHJvcCgnYWN0aW9uJywgZCkgfSwgcHJvcCgncGF5bG9hZCcsIGQpLCBwcm9wKCdzcmNFbGVtZW50JywgZCldKVxuICAgIGNvbnN0IGRhdGFPYmogPSBvYnNWYWwgPT4gKHtcbiAgICAgIGNsb25lOiAoKSA9PiBtZXJnZVByb3BzKG9iai5kYXRhKSxcbiAgICAgIGFjdGlvbixcbiAgICAgIHBheWxvYWQsXG4gICAgICBzcmNFbGVtZW50LFxuICAgICAgZXZlbnQ6IG9ic1ZhbFxuICAgIH0pXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKG9iaikgPT4gb2JqLm9ic2VydmFibGUucGlwZShtYXAoZGF0YU9iaikpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuZ2V0QWN0aW9uTWV0aG9kRm9yT2JzZXJ2YWJsZShvYmopKVxuICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7fVxuICAgIHJldHVybiBlcXNOYW1lID09PSB0cnVlID8gb25TdWNjZXNzKG9iaikgOiBvbkVycm9yKClcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiA8cD5WaWV3U3RlYW0gaW5zdGFuY2VzIGNhbiBzZW5kIGluZm8gdG8gY2hhbm5lbHMgdGhyb3VnaCBpdHMgTElOS1snc2VuZEluZm9Ub0NoYW5uZWwsICd2aWV3LXN0cmVhbS1zZW5kLWluZm8tdG8tY2hhbm5lbCddIG1ldGhvZC48L3A+XG4gICAqIDxwPkRhdGEgcmVjZWl2ZWQgZnJvbSBWaWV3U3RyZWFtcyBhcmUgZGlyZWN0ZWQgdG8gdGhpcyBtZXRob2QuPC9wPlxuICAgKiA8cD5WaWV3U3RyZWFtcyBzZW5kIGRhdGEgdXNpbmcgdGhlIExJTktbJ1ZpZXdTdHJlYW1QYXlsb2FkJywgJ3ZpZXctc3RyZWFtLXBheWxvYWQnXSBmb3JtYXQuPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW1QYXlsb2FkfSBvYmpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+UGFyc2luZyBEYXRhIFJldHVybmVkIGZyb20gYSBWaWV3U3RyZWFtIEluc3RhbmNlPC9oND5cIl1cbiAgICogb25WaWV3U3RyZWFtSW5mbyhvYmope1xuICAgKiAgICAgbGV0IGRhdGEgPSBvYmoudmlld1N0cmVhbUluZm87XG4gICAqICAgICBsZXQgYWN0aW9uID0gZGF0YS5hY3Rpb247XG4gICAqICAgICBsZXQgbmV3UGF5bG9hZCA9IHRoaXMucGFyc2VWaWV3U3RyZWFtRGF0YShkYXRhKTtcbiAgICogICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgbmV3UGF5bG9hZCk7XG4gICAqIH1cbiAgICpcbiAgICpcbiAgICovXG4gIG9uVmlld1N0cmVhbUluZm8ob2JzKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NcbiAgICpcbiAgICogPHA+VGhpcyBtZXRob2QgdGFrZXMgYW4gYWN0aW9uLCBhIGRhdGEgb2JqZWN0IGFuZCBvdGhlciBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhbmQgcHVibGlzaCBhIExJTktbJ0NoYW5uZWxQYXlsb2FkJywgJ2NoYW5uZWwtcGF5bG9hZCddIG9iamVjdC48L3A+XG4gICAqIDxwPk9uY2UgdGhlIGFjdGlvbiBhbmQgcGF5bG9hZCBpcyB2YWxpZGF0ZWQsIHRoaXMgbWV0aG9kIHdpbGwgcHVibGlzaCB0aGUgZGF0YSBieSB1c2luZyB0aGUgY2hhbm5lbCdzIHNvdXJjZSBTdWJqZWN0IG5leHQoKSBtZXRob2QuXG4gICAqIDxwPlRoaXMgY29uc2lzdGVudCBmb3JtYXQgYWxsb3dzIHN1YnNjcmliZXJzIHRvIHVuZGVyc3RhbmQgaG93IHRvIHBhcnNlIGFueSBpbmNvbWluZyBjaGFubmVsIGRhdGEuPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNyY0VsZW1lbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBvYnMkXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhY3Rpb24gLSA9IHVuZGVmaW5lZDsgUmVxdWlyZWQuIEFuIGFjdGlvbiBpcyBhIHN0cmluZywgdHlwaWNhbGx5IGluIHRoZSBmb3JtYXQgb2YgXCJDSEFOTkVMX05BTUVfQUNUSU9OX05BTUVfRVZFTlRcIiwgYW5kIHRoYXQgaGFzIGJlZW4gYWRkZWQgaW4gdGhlIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHBheWxvYWQgLSA9IHVuZGVmaW5lZDsgUmVxdWlyZWQuIFRoaXMgY2FuIGJlIGFueSBqYXZhc2NyaXB0IG9iamVjdCBhbmQgaXMgdXNlZCB0byBzZW5kIGFueSBjdXN0b20gZGF0YS5cbiAgICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gc3JjRWxlbWVudCAtID0gTm90IFJlcXVpcmVkLiB1bmRlZmluZWQ7IFRoaXMgY2FuIGJlIGVpdGhlciB0aGUgZWxlbWVudCByZXR1cm5lZCBmcm9tIHRoZSBVSSBDaGFubmVsLCBvciB0aGUgc3JjRWxlbWVudCBmcm9tIGEgVmlld1N0cmVhbSBpbnN0YW5jZS5cbiAgICogQHByb3BlcnR5IHtVSUV2ZW50fSBldmVudCAtID0gdW5kZWZpbmVkOyBOb3QgUmVxdWlyZWQuIFRoaXMgd2lsbCBiZSBkZWZpbmVkIGlmIHRoZSBldmVudCBpcyBmcm9tIHRoZSBVSSBDaGFubmVsLlxuICAgKiBAcHJvcGVydHkge09ic2VydmFibGV9IG9icyQgLSA9IHRoaXMub2JzZXJ2ZXI7IFRoaXMgZGVmYXVsdCBpcyB0aGUgc291cmNlIG9ic2VydmFibGUgZm9yIHRoaXMgY2hhbm5lbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5QdWJsaXNoaW5nIGEgQ2hhbm5lbFBheWxvYWQ8L2g0PiddXG4gICAqIGxldCBhY3Rpb24gPSBcIkNIQU5ORUxfTVlfQ0hBTk5FTF9SRUdJU1RFUkVEX0FDVElPTl9FVkVOVFwiO1xuICAgKiBsZXQgZGF0YSA9IHtmb286XCJiYXJcIn07XG4gICAqIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgZGF0YSk7XG4gICAqXG4gICAqL1xuICBzZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50ID0ge30sIGV2ZW50ID0ge30sIG9icyQgPSB0aGlzLm9ic2VydmVyJCkge1xuICAgIC8vIE1BS0VTIEFMTCBDSEFOTkVMIEJBU0UgQU5EIERBVEEgU1RSRUFNUyBDT05TSVNURU5UXG5cbiAgICBjb25zdCBjaGFubmVsUGF5bG9hZEl0ZW0gPSBuZXcgQ2hhbm5lbFBheWxvYWQodGhpcy5wcm9wcy5uYW1lLCBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIC8vIGNvbnNvbGUubG9nKFwiQ0hBTk5FTCBTVFJFRU0gSVRFTSBcIixjaGFubmVsUGF5bG9hZEl0ZW0pO1xuXG4gICAgLy8gY29uc3Qgb25OZXh0RnJhbWUgPSAoKT0+b2JzJC5uZXh0KGNoYW5uZWxQYXlsb2FkSXRlbSk7XG4gICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9uTmV4dEZyYW1lKVxuXG4gICAgb2JzJC5uZXh0KGNoYW5uZWxQYXlsb2FkSXRlbSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiA8cD5BbGxvd3MgY2hhbm5lbHMgdG8gc3Vic2NyaWJlIHRvIG90aGVyIGNoYW5uZWxzLjwvcD5cbiAgICogPHA+VGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc291cmNlIHJ4anMgU3ViamVjdCBmb3IgdGhlIHJlcXVlc3RlZCBDaGFubmVsLCB3aGljaCBjYW4gYmUgbGlzdGVuZWQgdG8gYnkgY2FsbGluZyBpdHMgc3Vic2NyaWJlIG1ldGhvZC48L3A+XG4gICAqIDxwPktub3dsZWRnZSBvZiByeGpzIGlzIG5vdCByZXF1aXJlZCB0byBzdWJzY3JpYmUgdG8gYW5kIHBhcnNlIENoYW5uZWwgZGF0YS48L3A+XG4gICAqIDxwPkJ1dCBhY2Nlc3NpbmcgdGhlIHJ4anMgU3ViamVjdCBnaXZlcyBkZXZlbG9wZXJzIHRoZSBhYmlsaXR5IHRvIHVzZSBhbGwgb2YgdGhlIGF2YWlsYWJsZSByeGpzIG1hcHBpbmcgYW5kIG9ic2VydmFibGUgdG9vbHMuPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbm5lbE5hbWUgVGhlIHJlZ2lzdGVyZWQgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuXG4gICAqIEByZXR1cm5zXG4gICAqIFRoZSBzb3VyY2UgcnhqcyBTdWJqZWN0IG9mIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbC5cbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+U3Vic2NyaWJpbmcgdG8gYSBDaGFubmVsIFVzaW5nIHRoZSBnZXRDaGFubmVsIG1ldGhvZDwvaDQ+XCJdXG4gICAqIGxldCByb3V0ZSQgPSB0aGlzLmdldENoYW5uZWwoXCJDSEFOTkVMX1JPVVRFXCIpXG4gICAqIHJvdXRlJC5zdWJzY3JpYmUobG9jYWxNZXRob2QpO1xuICAgKlxuICAgKlxuICAgKi9cbiAgZ2V0Q2hhbm5lbChjaGFubmVsTmFtZSwgcGF5bG9hZEZpbHRlcikge1xuICAgIGNvbnN0IGlzVmFsaWRDaGFubmVsID0gYyA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhjKVxuICAgIGNvbnN0IGVycm9yID0gYyA9PiBjb25zb2xlLndhcm4oXG4gICAgICAgIGBjaGFubmVsIG5hbWUgJHtjfSBpcyBub3Qgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbU5hbWVzfWApXG4gICAgY29uc3Qgc3RhcnRTdWJzY3JpYmUgPSAoYykgPT4ge1xuICAgICAgY29uc3Qgb2JzJCA9IHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIuZ2V0U3RyZWFtKGMpLm9ic2VydmVyXG4gICAgICBpZiAob2JzJC5zb3VyY2UpIHtcbiAgICAgICAgb2JzJC5zb3VyY2UuY2hhbm5lbE5hbWUgPSBjaGFubmVsTmFtZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzJC5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lXG4gICAgICB9XG5cbiAgICAgIGlmIChwYXlsb2FkRmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9icyQucGlwZShmaWx0ZXIocGF5bG9hZEZpbHRlcikpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYnMkXG4gICAgfVxuICAgIGNvbnN0IGZuID0gaWZFbHNlKGlzVmFsaWRDaGFubmVsLCBzdGFydFN1YnNjcmliZSwgZXJyb3IpXG4gICAgcmV0dXJuIGZuKGNoYW5uZWxOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIENoYW5uZWxzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGZvcmtKb2luIENoYW5uZWwub2JzZXJ2ZXIkXG4gICAqXG4gICAqICovXG5cbiAgbWVyZ2VDaGFubmVscyhjaGFubmVsc0FyciwgZW1pdE9uY2UgPSB0cnVlKSB7XG4gICAgLy8gMSkgTm9ybWFsaXplIGlucHV0cyB0byBPYnNlcnZhYmxlc1xuICAgIGNvbnN0IGNoYW5uZWxPYnNlcnZhYmxlcyA9IGNoYW5uZWxzQXJyLm1hcChpdGVtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgY2hhbiQgPSB0aGlzLmdldENoYW5uZWwoaXRlbSlcbiAgICAgICAgcmV0dXJuIGVtaXRPbmNlID8gY2hhbiQucGlwZSh0YWtlKDEpKSA6IGNoYW4kXG4gICAgICB9XG4gICAgICByZXR1cm4gZW1pdE9uY2UgPyBpdGVtLnBpcGUodGFrZSgxKSkgOiBpdGVtXG4gICAgfSlcblxuICAgIC8vIDIpIENvbWJpbmUgdGhlbVxuICAgIGxldCBjb21iaW5lZCRcbiAgICBpZiAoZW1pdE9uY2UpIHsgLy8gb25l4oCRc2hvdDogc25hcHNob3QgdGhlbiBjb21wbGV0ZVxuICAgICAgY29tYmluZWQkID0gZm9ya0pvaW4oY2hhbm5lbE9ic2VydmFibGVzKVxuICAgIH0gZWxzZSB7IC8vIGxpdmUgdXBkYXRlczogY29tYmluZUxhdGVzdFdpdGhcbiAgICAgIGlmIChjaGFubmVsT2JzZXJ2YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbWJpbmVkJCA9IEVNUFRZXG4gICAgICB9IGVsc2UgaWYgKGNoYW5uZWxPYnNlcnZhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29tYmluZWQkID0gY2hhbm5lbE9ic2VydmFibGVzWzBdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbZmlyc3QkLCAuLi5yZXN0JF0gPSBjaGFubmVsT2JzZXJ2YWJsZXNcbiAgICAgICAgY29tYmluZWQkID0gZmlyc3QkLnBpcGUoY29tYmluZUxhdGVzdFdpdGgoLi4ucmVzdCQpKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMpIE1hcCBhcnJheSDihpIga2V5ZWQgb2JqZWN0XG4gICAgLy8gcmV0dXJuIGNvbWJpbmVkJDtcbiAgICByZXR1cm4gY29tYmluZWQkLnBpcGUoXG4gICAgICBtYXAocmVzdWx0c0FyciA9PiB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICAgIGNoYW5uZWxzQXJyLmZvckVhY2goKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZXJLZXkgPSB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgPyBpdGVtIDogYGNoYW5uZWxfJHtpZHh9YFxuICAgICAgICAgIGNvbnN0IGNuS2V5ID0gaXRlbT8uc291cmNlPy5jaGFubmVsTmFtZSB8fCBpdGVtPy5zb3VyY2U/LnNvdXJjZT8uY2hhbm5lbE5hbWVcbiAgICAgICAgICBjb25zdCBrZXkgPSBjbktleSB8fCBpdGVyS2V5XG4gICAgICAgICAgb2JqW2tleV0gPSByZXN1bHRzQXJyW2lkeF1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG9ialxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JOb3RUcmFja0ZsYWcocHJvcHMgPSB7fSkge1xuICAgIGlmIChwcm9wcy5kb05vdFRyYWNrID09PSB0cnVlKSB7XG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuZG9Ob3RUcmFja0NoYW5uZWwocHJvcHMuY2hhbm5lbE5hbWUpXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IGNvbXBvc2UsIHBhdGgsIGlzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcydcblxuLy8gY29uc29sZS5sb2coJ2NoYW5uZWxzIGNvbmZpZyBsb2FkZWQgJyxSLFJ4KTtcbmNvbnN0IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcyA9ICgpID0+ICh7XG4gIGluY2x1ZGVzOiAgKCkgPT4gU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSB0cnVlID8gU3B5bmVBcHBQcm9wZXJ0aWVzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoKSA6IFsnQ0hBTk5FTF9ST1VURScsICdDSEFOTkVMX1VJJywgJ0NIQU5ORUxfV0lORE9XJywgJ0RJU1BBVENIRVInXVxuXG59KVxuXG4vLyBnZXRHbG9iYWxPYmooKS5jaGFubmVsc0xpc3RBcnI7XG5jb25zdCByZWdpc3RlcmVkU3RlcHMgPSBbJ0xPQUQnLCAnUkVOREVSJywgJ01PVU5UJywgJ1VOTU9VTlQnLCAnRElTUE9TRScsICdHQVJCQUdFX0NPTExFQ1QnLCAnVVBEQVRFJ11cbmNvbnN0IHJlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXMgPSBbJ3BhcmVudCcsICdzZWxmJywgJ2NoaWxkJywgJ2NoaWxkcmVuJywgJ3ZpZXcnXVxuY29uc3QgcmVnaXN0ZXJlZFN0cmVhbVR5cGVzID0gWydPYnNlcnZhYmxlJywgJ0JlaGF2aW9yU3ViamVjdCcsICdTdWJqZWN0JywgJ09ic2VydmVyJywgJ1N1YnNjcmliZXInLCAnRnJvbUV2ZW50T2JzZXJ2YWJsZSddXG5jb25zdCByZWdpc3RlcmVkQWN0aW9ucyA9IFsnc3Vic2NyaWJlJywgJ2NvbWJpbmVMYXRlc3QnXVxuY29uc3QgZ2V0UnhUeXBlID0gKG9icykgPT4gb2JzKCkuY29uc3RydWN0b3IubmFtZVxuLy8gbGV0IGdldE9ic2VydmFibGVUeXBlID0gKG9icykgPT4gb2JzLmNvbnN0cnVjdG9yLm5hbWU7XG5jb25zdCBjb25maXJtT2JzZXJ2YWJsZSA9IChvYnMpID0+IG9icy5zdWJzY3JpYmUgIT09IHVuZGVmaW5lZFxuLy8gbGV0IHB1bGxNYWluUm91dGUgPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXihcXC8/KSguKikoXFwvKSguKikvZywgJyQyJyk7XG5sZXQgYmFzZVZhbGlkYXRpb25zID0gW107IGxldCB2aWV3SW5mb1ZhbGlkYXRpb25zID0gW107IGxldCB1aVZhbGlkYXRpb25zID0gW11cbmxldCBsaWZlc3RyZWFtVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBWYWxpZGF0aW9ucyA9IFtdOyBsZXQgc3RlcERpc3Bvc2VWYWxpZGF0aW9ucyA9IFtdOyBsZXQgc3RlcFVwZGF0ZVZhbGlkYXRpb25zID0gW11cbmxldCByb3V0ZVZhbGlkYXRpb25zID0gW107IGxldCBTdHJlYW1zQ29uZmlnID0gW11cblxuaWYgKGNvbXBvc2UgIT09IHVuZGVmaW5lZCAmJiBPYnNlcnZhYmxlICE9PSB1bmRlZmluZWQpIHtcbi8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQUxMIFZBTElEQVRJT05TIEFERCBUSEUgQkFTRSBWQUxJREFUSU9OUyBUSFJPVUdIIENPTkNBVEVOQVRJT05cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBiYXNlVmFsaWRhdGlvbnMgPSBbXG4gICAge1xuICAgICAgZXJyb3I6IGBuZWVkIHRvIG1hdGNoIGEgdmFsaWQgbmFtZSB3aXRoaW4gJHtyZWdpc3RlcmVkU3RyZWFtVHlwZXN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhwYXlsb2FkLm5hbWUpXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGVycm9yOiAncGFyYW0gXFwnb2JzZXJ2YWJsZVxcJyBtdXN0IGNvbnRhaW4gYSB2YWxpZCBPYnNlcnZhYmxlJyxcbiAgICAgIC8vIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtVHlwZXMuaW5jbHVkZXMoZ2V0T2JzZXJ2YWJsZVR5cGUocGF5bG9hZC5vYnNlcnZhYmxlKSlcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBjb25maXJtT2JzZXJ2YWJsZShwYXlsb2FkLm9ic2VydmFibGUpXG4gICAgfSxcbiAgICB7XG4gICAgICBlcnJvcjogJ3BhcmFtIGFjdGlvbiBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBhY3Rpb24nLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRBY3Rpb25zLmluY2x1ZGVzKHBheWxvYWQuYWN0aW9uKVxuICAgIH1cblxuICBdXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVEhFU0UgVkFMSURBVElPTlMgQVJFIENPTkNBVEVOQVRFRCBXSEVOIFRIRSBPQlNFUlZBQkxFIFJFRkVSUyBUTyBBIFZJRVdcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2aWV3SW5mb1ZhbGlkYXRpb25zID0gW1xuICAgIHtcbiAgICAgIGVycm9yOiAnbmVlZHMgdnNpZCBudW1iZXIgaW4gc3JjRWxlbWVudCcsXG4gICAgICBwcmVkaWNhdGU6IGNvbXBvc2UoaXMoU3RyaW5nKSwgcGF0aChbJ2RhdGEnLCAnc3JjRWxlbWVudCcsICd2c2lkJ10pKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6ICduZWVkcyBhIGlkIGluIHNyY0VsZW1lbnQnLFxuICAgICAgcHJlZGljYXRlOiBjb21wb3NlKGlzKFN0cmluZyksXG4gICAgICAgIHBhdGgoWydkYXRhJywgJ3NyY0VsZW1lbnQnLCAnaWQnXSkpXG4gICAgfVxuICBdXG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOTyBTUEVDSUZJQyBVSSBWQUxJREFUSU9OUyBBVCBUSElTIFRJTUUgLS0gSVQgSlVTVCBBREQgT1RIRVJTXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdWlWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHVpVmFsaWRhdGlvbnMgPSBbXVxuICAgIHJldHVybiB1aVZhbGlkYXRpb25zLmNvbmNhdChiYXNlVmFsaWRhdGlvbnMpLmNvbmNhdCh2aWV3SW5mb1ZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk8gU1BFQ0lGSUMgTElGRVNUUkVBTSBWQUxJREFUSU9OUyBBVCBUSElTIFRJTUUgLS0gSVQgSlVTVCBBREQgT1RIRVJTXG4gIGNvbnN0IGxpZmVTdHJlYW1WYWxpZGF0aW9ucyA9IFtcblxuICAgIHtcbiAgICAgIGVycm9yOiBgbmVlZCB0byBtYXRjaCBhIHZhbGlkIG5hbWUgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgIH0sXG5cbiAgICB7XG4gICAgICBlcnJvcjogYG5lZWRzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0ZXAgc3RyaW5nczogJHtyZWdpc3RlcmVkU3RlcHN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RlcHMuaW5jbHVkZXMocGF5bG9hZC5TVEVQKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6IGB0eXBlIG5lZWRzIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAke3JlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzLmluY2x1ZGVzKHBheWxvYWQudHlwZSlcbiAgICB9LFxuXG4gICAge1xuICAgICAgZXJyb3I6ICd2aWV3SWQgbmVlZHMgdG8gYmUgYWRkZWQgJyxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLnZpZXdJZCAhPT0gdW5kZWZpbmVkXG4gICAgfVxuICBdXG5cbiAgc3RlcFZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RlcFZhbGlkYXRpb25zID0gW11cbiAgICByZXR1cm4gc3RlcFZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cblxuICBzdGVwRGlzcG9zZVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RlcFVwZGF0ZVZhbGlkYXRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlcnJvcjogJ0RJU1BPU0UgU1RFUCByZXF1aXJlcyBhIGRpc3Bvc2VJdGVtIHBhcmFtIGluIHRoZSBkYXRhIG9iamVjdCcsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLlNURVAgPT09ICdESVNQT1NFJyAmJlxuICAgICAgICAgICAgcGF5bG9hZC5kYXRhLmRpc3Bvc2VJdGVtcyAhPT0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgXVxuICAgIHJldHVybiBzdGVwVXBkYXRlVmFsaWRhdGlvbnMuY29uY2F0KGxpZmVTdHJlYW1WYWxpZGF0aW9ucylcbiAgfVxuXG4gIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdVUERBVEUgU1RFUCByZXF1aXJlcyBhIGRhdGEgb2JqZWN0ICcsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLlNURVAgPT09ICdVUERBVEUnICYmIHBheWxvYWQuZGF0YSAhPT1cbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIF1cbiAgICByZXR1cm4gc3RlcFVwZGF0ZVZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBsaWZlc3RyZWFtVmFsaWRhdGlvbnNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsaWZlc3RyZWFtVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbGlmZVN0cmVhbVZhbGlkYXRpb25zLmNvbmNhdChiYXNlVmFsaWRhdGlvbnMpXG4gICAgICAuY29uY2F0KHZpZXdJbmZvVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIRVJFIElTIFRIRSBST1VURSBWQUxJREFUSU9OU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJvdXRlVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCByb3V0ZVZhbGlkYXRpb25zID0gW1xuICAgICAgLypcbiAgICAgICpcbiAgICAgIHtcbiAgICAgICAgICBlcnJvcjogYG5lZWRzIGEgdmFsaWQgcm91dGUgc3RyaW5nIHdpdGhpbiBbJHtyZWdpc3RlcmVkUm91dGVzfV1gLFxuICAgICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkUm91dGVzLmluY2x1ZGVzKHB1bGxNYWluUm91dGUocGF5bG9hZC5kYXRhLm5hdmlnYXRlVG8pKVxuICAgICAgfVxuICAgICAgKlxuICAgICAgKi9cblxuICAgIF1cbiAgICByZXR1cm4gcm91dGVWYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKS5jb25jYXQodmlld0luZm9WYWxpZGF0aW9ucylcbiAgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qXG4gICogVEhFIElERUEgT0YgU3RyZWFtc0NvbmZpZyBJUyBUTyBDT01QTEVURUxZIEdFTkVSQVRFIEFMTCBBUFAgU1RSRUFNUyBVU0lORyBUSElTIE9CSkVDVFxuICAqIFRISVMgSEFTIE5PVCBCRUVOIElNUExFTUVOVEVEIC0tIE1BWSBCRSBBRERFRCBJTiBBIEZVVFVSRSBWRVJTSU9OXG4gICovXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgU3RyZWFtc0NvbmZpZyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0cmVhbVZhbGlkYXRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIFxcJ25hbWVcXCcgbXVzdCBiZSBvZiBhIHJlZ2lzdGVyZWQgdHlwZScsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhwYXlsb2FkLm5hbWUpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIFxcJ29ic2VydmFibGVcXCcgbXVzdCBjb250YWluIGEgdmFsaWQgT2JzZXJ2YWJsZScsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtVHlwZXMuaW5jbHVkZXMoXG4gICAgICAgICAgZ2V0UnhUeXBlKHBheWxvYWQub2JzZXJ2YWJsZSkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIGFjdGlvbiBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBhY3Rpb24nLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZEFjdGlvbnMuaW5jbHVkZXMocGF5bG9hZC5hY3Rpb24pXG4gICAgICB9XG5cbiAgICBdXG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RyZWFtczogW1xuICAgICAgICB7XG4gICAgICAgICAgaW5pdDoge1xuICAgICAgICAgICAgbmFtZTogJ0RJU1BBVENIRVInLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogKCkgPT4gbmV3IFN1YmplY3QoKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ3N1YnNjcmliZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cnVjdHVyZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZSB8fCBTdWJqZWN0LFxuICAgICAgICAgICAgYWN0aW9uOiBTdHJpbmdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRpb25zOiBzdHJlYW1WYWxpZGF0aW9uc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaW5pdDoge1xuICAgICAgICAgICAgbmFtZTogJ1VCVScsXG4gICAgICAgICAgICBvYnNlcnZhYmxlOiAoKSA9PiBuZXcgU3ViamVjdCgpLFxuICAgICAgICAgICAgYWN0aW9uOiAnc3Vic2NyaWJlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RydWN0dXJlOiB7XG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICBvYnNlcnZhYmxlOiBPYnNlcnZhYmxlIHx8IFN1YmplY3QsXG4gICAgICAgICAgICBhY3Rpb246IFN0cmluZ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsaWRhdGlvbnM6IHN0cmVhbVZhbGlkYXRpb25zXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMsIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucywgc3RlcFZhbGlkYXRpb25zLCB1aVZhbGlkYXRpb25zLCByb3V0ZVZhbGlkYXRpb25zLCBsaWZlc3RyZWFtVmFsaWRhdGlvbnMsIHJlZ2lzdGVyZWRTdHJlYW1OYW1lcywgU3RyZWFtc0NvbmZpZ1xufVxuIiwiaW1wb3J0IHsgU3B5bmVDaGFubmVsUm91dGUgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtcm91dGUuanMnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxVSSB9IGZyb20gJy4vc3B5bmUtY2hhbm5lbC11aS5qcydcbmltcG9ydCB7IFNweW5lQ2hhbm5lbFdpbmRvdyB9IGZyb20gJy4vc3B5bmUtY2hhbm5lbC13aW5kb3cuanMnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxMaWZlY3ljbGUgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlLmpzJ1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsQUkgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtYWkuanMnXG5cbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgQ2hhbm5lbFByb3h5IH0gZnJvbSAnLi9jaGFubmVsLXByb3h5LmpzJ1xuaW1wb3J0IHsgcHJvcEVxLCBwbHVjaywgcHJvcCwgZmlsdGVyLCBwYXRoRXEsIHJlamVjdCwgY29tcG9zZSwgam9pbiwgbWFwIGFzIHJNYXAgfSBmcm9tICdyYW1kYSdcblxuY29uc3QgX21hcCA9IG5ldyBNYXAoKVxuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbHNNYXAge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsc0RlbGVnYXRvclxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBUaGlzIG9iamVjdCBjcmVhdGVzIHRoZSBsb2dpYyBzbyB0aGF0IENoYW5uZWxzIGFuZCBWaWV3U3RyZWFtcyBjYW4gY29tbXVuaWNhdGUgd2l0aCBlYWNoIG90aGVyXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmFkZE1peGlucygpXG4gICAgX21hcC5zZXQoJ0RJU1BBVENIRVInLCBuZXcgU3ViamVjdCgpKVxuICAgIHRoaXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscyA9IENoYW5uZWxzTWFwLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0Q2hhbm5lbHNMaXN0ID0gQ2hhbm5lbHNNYXAuZ2V0Q2hhbm5lbHNMaXN0LmJpbmQodGhpcylcbiAgfVxuXG4gIGdldCBtYXAoKSB7XG4gICAgcmV0dXJuIF9tYXBcbiAgfVxuXG4gIHN0YXRpYyBnZXRDaGFubmVsc0xpc3QoKSB7XG4gICAgY29uc3QgcHJveHlNYXBGbiA9ICAoaywgdikgPT4ge1xuICAgICAgY29uc3Qga2V5ID0ga1swXVxuICAgICAgY29uc3QgdmFsID0ga1sxXS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICByZXR1cm4geyBrZXksIHZhbCB9XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKF9tYXAsIHByb3h5TWFwRm4pXG4gIH1cblxuICBzdGF0aWMgbGlzdFJlZ2lzdGVyZWRDaGFubmVscyhzaG93T25seVByb3hpZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IHByb3h5TWFwID0gdGhpcy5nZXRDaGFubmVsc0xpc3QoKVxuICAgIGNvbnN0IHJlamVjdFByb3h5Rm4gPSByZWplY3QocHJvcEVxKCdDaGFubmVsUHJveHknLCAndmFsJykpXG4gICAgY29uc3QgZmlsdGVyUHJveHlGbiA9IGZpbHRlcihwcm9wRXEoJ0NoYW5uZWxQcm94eScsICd2YWwnKSlcbiAgICBjb25zdCBmbiA9IHNob3dPbmx5UHJveGllcyA9PT0gdHJ1ZSA/IGZpbHRlclByb3h5Rm4gOiByZWplY3RQcm94eUZuXG4gICAgY29uc3QgcmVtb3ZlZFByb3h5QXJyID0gZm4ocHJveHlNYXApXG4gICAgcmV0dXJuIHBsdWNrKFsna2V5J10sIHJlbW92ZWRQcm94eUFycilcbiAgfVxuXG4gIGxpc3RQcm94eUNoYW5uZWxzKCkge1xuICAgIHJldHVybiB0aGlzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHModHJ1ZSlcbiAgfVxuXG4gIGNoZWNrRm9yTWlzc2luZ0NoYW5uZWxzKCkge1xuICAgIGNvbnN0IHByb3h5TWFwID0gdGhpcy5nZXRDaGFubmVsc0xpc3QoKVxuICAgIGNvbnN0IGZpbHRlclByb3h5Rm4gPSBmaWx0ZXIocHJvcEVxKCdDaGFubmVsUHJveHknLCAndmFsJykpXG4gICAgY29uc3QgZmlsdGVyUHJveHlBcnIgPSBmaWx0ZXJQcm94eUZuKHByb3h5TWFwKVxuXG4gICAgaWYgKGZpbHRlclByb3h5QXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICBjb25zdCBjaGFubmVsU3RyID0gZmlsdGVyUHJveHlBcnIubGVuZ3RoID09PSAxID8gJ0NoYW5uZWwgaGFzJyA6ICdDaGFubmVscyBoYXZlJ1xuICAgICAgY29uc3QgY2hhbm5lbHMgPSBjb21wb3NlKGpvaW4oJywgJyksIHJNYXAocHJvcCgna2V5JykpKShmaWx0ZXJQcm94eUFycilcbiAgICAgIGNvbnN0IGZpbHRlclByZWZpeFdhcm5pbmcgPSBgU3B5bmUgV2FybmluZzogVGhlIGZvbGxvd2luZyAke2NoYW5uZWxTdHJ9IG5vdCBiZWVuIGluaXRpYWxpemVkOiAke2NoYW5uZWxzfWBcbiAgICAgIGNvbnNvbGUud2FybihmaWx0ZXJQcmVmaXhXYXJuaW5nKVxuICAgIH1cbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgdGhpcy5jcmVhdGVNYWluU3RyZWFtcygpXG4gIH1cblxuICBjcmVhdGVNYWluU3RyZWFtcygpIHtcbiAgICB0aGlzLnJvdXRlU3RyZWFtID0gbmV3IFNweW5lQ2hhbm5lbFJvdXRlKClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9ST1VURScsIHRoaXMucm91dGVTdHJlYW0pXG5cbiAgICB0aGlzLnVpU3RyZWFtID0gbmV3IFNweW5lQ2hhbm5lbFVJKClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9VSScsIHRoaXMudWlTdHJlYW0pXG5cbiAgICB0aGlzLmRvbVN0cmVhbSA9IG5ldyBTcHluZUNoYW5uZWxXaW5kb3coKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX1dJTkRPVycsIHRoaXMuZG9tU3RyZWFtKVxuXG4gICAgdGhpcy52aWV3U3RyZWFtTGlmZWN5Y2xlID0gbmV3IFNweW5lQ2hhbm5lbExpZmVjeWNsZSgpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfTElGRUNZQ0xFJywgdGhpcy52aWV3U3RyZWFtTGlmZWN5Y2xlKVxuXG4gICAgdGhpcy5haVN0cmVhbSA9IG5ldyBTcHluZUNoYW5uZWxBSSgpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfQUknLCB0aGlzLmFpU3RyZWFtKVxuXG4gICAgdGhpcy5yb3V0ZVN0cmVhbS5pbml0aWFsaXplU3RyZWFtKClcbiAgICB0aGlzLmRvbVN0cmVhbS5pbml0aWFsaXplU3RyZWFtKClcbiAgfVxuXG4gIGFkZEtleUV2ZW50KGtleSkge1xuICAgIF9tYXAuZ2V0KCdVSScpLmFkZEtleUV2ZW50KGtleSlcbiAgfVxuXG4gIHJlZ2lzdGVyU3RyZWFtKHZhbCkge1xuICAgIGNvbnN0IG5hbWUgPSB2YWwuY2hhbm5lbE5hbWVcbiAgICBjb25zdCBuYW1lRXhpc3RzID0gX21hcC5oYXMobmFtZSlcbiAgICBpZiAobmFtZUV4aXN0cykge1xuICAgICAgY29uc3QgaXNBbHJlYWR5UmVnaXN0ZXJkID0gY29tcG9zZShwYXRoRXEoWydwcm9wcycsICdpc1JlZ2lzdGVyZWQnXSwgdHJ1ZSkpKF9tYXAuZ2V0KG5hbWUpKVxuICAgICAgaWYgKGlzQWxyZWFkeVJlZ2lzdGVyZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBDaGFubmVsLCAke25hbWV9LCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQhYClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgX21hcC5zZXQobmFtZSwgdmFsKVxuICAgIHZhbC5pbml0aWFsaXplU3RyZWFtKClcbiAgfVxuXG4gIGdldENoYW5uZWxBY3Rpb25zKHN0cikge1xuICAgIHJldHVybiBfbWFwLmdldChzdHIpLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKClcbiAgfVxuXG4gIGdldFByb3h5U3ViamVjdChuYW1lLCBpc1JlcGxheVN1YmplY3QgPSBmYWxzZSkge1xuICAgIGNvbnN0IHN1YmplY3RUeXBlID0gaXNSZXBsYXlTdWJqZWN0ID09PSB0cnVlID8gJ3JlcGxheVN1YmplY3QnIDogJ3N1YmplY3QnXG5cbiAgICByZXR1cm4gX21hcC5nZXQobmFtZSlbc3ViamVjdFR5cGVdXG4gIH1cblxuICB0ZXN0U3RyZWFtKG5hbWUpIHtcbiAgICByZXR1cm4gX21hcC5nZXQobmFtZSkgIT09IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0U3RyZWFtKG5hbWUpIHtcbiAgICBpZiAodGhpcy50ZXN0U3RyZWFtKG5hbWUpID09PSBmYWxzZSkge1xuICAgICAgX21hcC5zZXQobmFtZSwgbmV3IENoYW5uZWxQcm94eShuYW1lKSlcbiAgICB9XG5cbiAgICByZXR1cm4gX21hcC5nZXQobmFtZSlcbiAgfVxuXG4gIGFkZE1peGlucygpIHtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgQ09SRSBERUNPUkFUT1JTXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBsZXQgY29yZU1peGlucyA9ICBiYXNlQ29yZU1peGlucygpO1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBTVFJFQU1TIERFQ09SQVRPUlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIGxldCBzdHJlYW1zTWl4aW5zID0gQmFzZVN0cmVhbXNNaXhpbnMoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcblxuZXhwb3J0IGNsYXNzIFNweW5lQ2hhbm5lbEFJIGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lQ2hhbm5lbEFJXG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogSW50ZXJuYWwgQ2hhbm5lbCB0aGF0IHB1Ymxpc2hlcyByZW5kZXJpbmcgYW5kIGRpc3Bvc2luZyBldmVudHMgb2YgYWxsIFZpZXdTdHJlYW1zIHdob3NlIHByb3BlcnR5LCBwcm9wZXIuc2VuZEFJRXZlbnRzIGlzIHNldCB0byB0cnVlLlxuICAgKlxuICAgKiA8aDM+VGhlIHR3byBhY3Rpb25zIHRoYXQgYXJlIHJlZ3NpdGVyZWQgZm9yIHRoaXMgY2hhbm5lbCBhcmU6PC9oMz5cbiAgICogPHVsPlxuICAgKiA8bGk+Q0hBTk5FTF9BSV9SRU5ERVJFRF9FVkVOVDwvbGk+XG4gICAqIDxsaT5DSEFOTkVMX0FJX0RJU1BPU0VEX0VWRU5UPC9saT5cbiAgICogIDwvdWw+XG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9BSSc7XG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30pIHtcbiAgICBzdXBlcignQ0hBTk5FTF9BSScsIHByb3BzKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX0FJX1JFTkRFUkVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX0FJX0RJU1BPU0VEX0VWRU5UJ1xuICAgIF1cbiAgfVxuXG4gIG9uVmlld1N0cmVhbUluZm8ob2JqKSB7XG4gICAgY29uc3QgeyBhY3Rpb24sIHNyY0VsZW1lbnQgfSA9IG9ialxuICAgIGNvbnN0IHBheWxvYWQgPSBzcmNFbGVtZW50XG4gICAgcGF5bG9hZC5hY3Rpb24gPSBhY3Rpb25cbiAgICB0aGlzLm9uU2VuZEV2ZW50KGFjdGlvbiwgcGF5bG9hZClcbiAgfVxuXG4gIG9uU2VuZEV2ZW50KGFjdGlvblN0ciwgcGF5bG9hZCA9IHt9KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9uc1thY3Rpb25TdHJdXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IHt9XG4gICAgY29uc3QgZXZlbnQgPSB1bmRlZmluZWRcbiAgICBjb25zdCBkZWxheVN0cmVhbSA9ICgpID0+IHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gICAgd2luZG93LnNldFRpbWVvdXQoZGVsYXlTdHJlYW0sIDApXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxMaWZlY3ljbGUgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsTGlmZWN5Y2xlXG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogSW50ZXJuYWwgQ2hhbm5lbCB0aGF0IHB1Ymxpc2hlcyByZW5kZXJpbmcgYW5kIGRpc3Bvc2luZyBldmVudHMgb2YgYWxsIFZpZXdTdHJlYW1zIHdob3NlIHByb3BlcnR5LCBwcm9wZXIuc2VuZExpZmVjeWNsZUV2ZW50cyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogPGgzPlRoZSB0d28gYWN0aW9ucyB0aGF0IGFyZSByZWdzaXRlcmVkIGZvciB0aGlzIGNoYW5uZWwgYXJlOjwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UPC9saT5cbiAgICogPGxpPkNIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UPC9saT5cbiAgICogIDwvdWw+XG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9MSUZFQ1lDTEUnO1xuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoJ0NIQU5ORUxfTElGRUNZQ0xFJywgcHJvcHMpXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBvblZpZXdTdHJlYW1JbmZvKG9iaikge1xuICAgIGNvbnN0IHsgYWN0aW9uLCBzcmNFbGVtZW50IH0gPSBvYmpcbiAgICBjb25zdCBwYXlsb2FkID0gc3JjRWxlbWVudFxuICAgIHBheWxvYWQuYWN0aW9uID0gYWN0aW9uXG4gICAgdGhpcy5vblNlbmRFdmVudChhY3Rpb24sIHBheWxvYWQpXG4gIH1cblxuICBvblNlbmRFdmVudChhY3Rpb25TdHIsIHBheWxvYWQgPSB7fSkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnNbYWN0aW9uU3RyXVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSB7fVxuICAgIGNvbnN0IGV2ZW50ID0gdW5kZWZpbmVkXG4gICAgY29uc3QgZGVsYXlTdHJlYW0gPSAoKSA9PiB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5U3RyZWFtLCAwKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5pbXBvcnQge1xuICBwaWNrLFxuICBmaW5kLFxuICBvbWl0LFxuICBvdmVyLFxuICBtZXJnZVJpZ2h0LFxuICBpcyxcbiAgb2JqT2YsXG4gIG1lcmdlQWxsLFxuICBwYXRoLFxuICBrZXlzLFxuICBwcm9wLFxuICBlcXVhbHMsXG4gIGhlYWQsXG4gIGNvbXBvc2UsXG4gIGxlbnNQcm9wLFxuICBjaGFpbixcbiAgcGlja0FsbCxcbiAgZGVmYXVsdFRvLFxuICBpc0VtcHR5LFxuICBjb25jYXQsXG4gIHdoZW4sXG4gIGNvbXBsZW1lbnQsXG4gIHJldmVyc2UsXG4gIGN1cnJ5TixcbiAgX18sXG4gIHRlc3QsXG4gIHJlcGxhY2UsXG4gIHRvUGFpcnMsXG4gIHJlZHVjZVxuICAsIGZpbHRlciBhcyByYW1kYUZpbHRlciwgbWVyZ2VSaWdodCBhcyByTWVyZ2Vcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxSb3V0ZSBleHRlbmRzIENoYW5uZWwge1xuICBjb25zdHJ1Y3RvcihuYW1lID0gJ0NIQU5ORUxfUk9VVEUnLCBwcm9wcyA9IHt9KSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxSb3V0ZVxuICAgICAqIEB0eXBlIGNvcmVcbiAgICAgKlxuICAgICAqIEBkZXNjXG4gICAgICpcbiAgICAgKiA8cD5UaGUgU3B5bmVDaGFubmVsUm91dGUgaGFzIHRoZSB0d28gbWFpbiBkdXRpZXM6XG4gICAgICogIDx1bD5cbiAgICAgKiAgIDxsaT5Db21iaW5lIGRhdGEgd2l0aCB0aGUgY3VycmVudCB3aW5kb3cgbG9jYXRpb24gdG8gdXBkYXRlIHRoZSBsb2NhdGlvbidzIHBhdGhuYW1lLjwvbGk+XG4gICAgICogICA8bGk+TGlzdGVuIHRvIHdpbmRvdyBsb2NhdGlvbiBjaGFuZ2VzIHRvIHRyYW5zbGF0ZSB0aGUgbG9jYXRpb24gcGF0aG5hbWUgaW50byBhIHNlcmllcyBvZiBtb2RlbCBwcm9wZXJ0aWVzLjwvbGk+XG4gICAgICogPC91bD5cbiAgICAgKiA8cD5JbiBib3RoIGNhc2VzLCB0aGlzIGNoYW5uZWwgc2VuZHMgYSBDaGFubmVsUGF5bG9hZCBjb250YWluaW5nIHVwZGF0ZWQgcm91dGUgcHJvcGVydGllcy48L3A+XG4gICAgICpcbiAgICAgKiA8aDM+VGhlIHR3byBhY3Rpb25zIHRoYXQgYXJlIHJlZ3NpdGVyZWQgZm9yIHRoZSBSb3V0ZSBjaGFubmVsIGFyZTo8L2gzPlxuICAgICAqIDx1bD5cbiAgICAgKiA8bGk+Q0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVDwvbGk+XG4gICAgICogPGxpPkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UPC9saT5cbiAgICAgKiAgPC91bD5cbiAgICAgKlxuICAgICAqICAgIDxoMz5UaGUgUm91dGVzIENvbmZpZ3VyYXRpb24gT2JqZWN0PC9oMz5cbiAgICAgKiAgICA8cD5UaHIgcm91dGVzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlzIHVzZWQgdG8gbWFwIHRoZSBsb2NhdGlvbiBzdHJpbmcgdG8gYW5kIGZyb20gYSByb3V0ZSBtb2RlbC48L3A+XG4gICAgICpcbiAgICAgKiAgICAgPHByZT4gICAgICAgICAgIHtcbiAgICAgKiAgICAgICAgICAgICAgICByb3V0ZVBhdGg6IHtcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdXRlTmFtZTogJ2xldmVsT25lUHJvcCcsXG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU9wdGlvbjE6ICdicmFuY2hpbmctZW5kcy1oZXJlJyxcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdXRlT3B0aW9uMjoge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgcm91dGVQYXRoOiB7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlTmFtZTogJ2xldmVsVHdvUHJvcCcsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxldmVsMjogJ2xldmVsLTItYnJhbmNoLWVuZHMtaGVyZSdcbiAgICAgKlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgICAgIH1cbiAgICAgKlxuICAgICAqICAgICAgICAgIDwvcHJlPlxuICAgICAqICAgICA8cD5UaGlzIGNvbmZpZyBvYmplY3QgY29uc2lzdHMgb2YgbmVzdGVkIHJvdXRlUGF0aCBvYmplY3RzIHRoYXQgY29ycmVzcG9uZHMgdG8gYWxsIG9mIHRoZSBicmFuY2hpbmcgcG9zc2libGl0aWVzIGZvciB0aGUgYXBwLjwvcD5cbiAgICAgKiAgICA8cD5UaGUgcm91dGVOYW1lIHZhbHVlIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIGZvciBlYWNoIHJvdXRlUGF0aC48L3A+XG4gICAgICogICAgPGgzPlJvdXRlIE9wdGlvbnM8L2gzPlxuICAgICAqICAgIDxwPkEgcm91dGVQYXRoIG1heSBjb250YWluIHNldmVyYWwgcm91dGUgb3B0aW9uIGtleS12YWx1ZSBwYWlycywgd2hpY2ggaXMgdXNlZCB0byBtYXAgYmV0d2VlbiBkYXRhIGFuZCB0aGUgd2luZG93IGxvY2F0aW9uLjwvcD5cbiAgICAgKiAgICA8dWwgY2xhc3M9J2Jhc2ljJz5cbiAgICAgKiAgICAgIDxsaT5cbiAgICAgKiAgICAgICAgIDxoNSBjbGFzcz0nYmFzaWMnPlRoZSBSb3V0ZSBPcHRpb24gS2V5IChvciBsZWZ0IHZhbHVlKTwvaDU+XG4gICAgICogICAgICAgICA8dWwgY2xhc3M9J2RlY2ltYWwnPlxuICAgICAqICAgICAgICAgPGxpPk1hcHMgdGhlIHdpbmRvdyBsb2NhdGlvbiB0byByb3V0ZSBkYXRhIHByb3BlcnRpZXM8L2xpPlxuICAgICAqICAgICAgICAgPGxpPlRoaXMgY2hhbm5lbCBjYW4gJ2ZpbGwgaW4gdGhlIGJsYW5rcycgc28gdGhhdCBvbmx5IHRoZSB1cGRhdGVkIGxldmVsIHJvdXRlTmFtZXMgYXJlIHJlcXVpcmVkIHRvIHJldmlzZSB0aGUgd2luZG93IGxvY2F0aW9uPC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+Q2FuIGJlIGEgcmVnZXggcGF0dGVybiBzbyB0aGF0IG11bHRpcGxlIGRhdGEgcHJvcGVydGllcyBjYW4gc2hhcmUgdGhlIHNhbWUgYnJhbmNoaW5nIGxvZ2ljPC9saT5cbiAgICAgKiAgICAgICAgICA8L3VsPlxuICAgICAqICAgICAgPC9saT5cbiAgICAgKlxuICAgICAqICAgICAgPGxpPlxuICAgICAqICAgICAgICAgICA8aDUgY2xhc3M9J2Jhc2ljJz5UaGUgUm91dGUgT3B0aW9uIFZhbHVlIChvciByaWdodCB2YWx1ZSk8L2g1PlxuICAgICAqICAgICAgICAgICA8dWwgY2xhc3M9J2RlY2ltYWwnPlxuICAgICAqICAgICAgICAgICA8bGk+TWFwcyBkYXRhIHByb3BlcnRpZXMgdG8gcGFydCBvZiBhIHdpbmRvdyBsb2NhdGlvbjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkRldGVybWluZXMgdGhlIHN0cmluZyB2YWx1ZSBmb3IgaXRzIGxldmVsIG9mIHRoZSB3aW5kb3cgbG9jYXRpb248L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5UaGUgdmFsdWUgY2FuIGJlIGEgcmVnZXggcGF0dGVybiBzbyB0aGF0IG11bHRpcGxlIGxvY2F0aW9ucyBjYW4gbWFwIHRvIHNhbWUgcm91dGVEYXRhIHByb3BlcnR5PC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+QnJhbmNoaW5nIGVuZHMgZm9yIHRoZSByb3V0ZSBvcHRpb24gd2hlbiB0aGlzIHZhbHVlIGlzIGEgZWl0aGVyIGEgU3RyaW5nIG9yIGEgcmVnZXggcGF0dGVybjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkJyYW5jaGluZyBjb250aW51ZXMgZm9yIHRoZSByb3V0ZSBvcHRpb24gd2hlbiB0aGlzIHZhbHVlIGlzIGEgbmVzdGVkIHJvdXRlUGF0aCBvYmplY3Q8L2xpPlxuICAgICAqICAgICAgICAgIDwvdWw+XG4gICAgICogICAgICA8L2xpPlxuICAgICAqICAgICAgPC91bD5cbiAgICAgKlxuICAgICAqICAgICAgPGgzPkVuaGFuY2luZyBUaGUgQXBwJ3MgUm91dGluZyBMb2dpYzwvaDM+XG4gICAgICogICAgICA8cD5UaGUgYmVzdCBwcmFjdGljZSBmb3IgYSBTcHluZSBBcHAgaXMgdG8gaGF2ZSBvbmUgY29tcG9uZW50LCBhIGN1c3RvbSBjaGFubmVsLCBsaXN0ZW4gdG8gdGhlIFNweW5lUm91dGVDaGFubmVsLiBBbGwgb3RoZXIgY29tcG9uZW50cyB3aWxsIHRoZW4gbGlzdGVuIHRvIHRoZSBjdXN0b20gcm91dGUgY2hhbm5lbC4gVGhpcyBhbGxvd3MgdGhlIGN1c3RvbSByb3V0ZSBjaGFubmVsIHRvIGVuaGFuY2Ugcm91dGluZyBsb2dpYyB3aXRoIG1vcmUgZGF0YSBhbmQgY3VzdG9tIGFjdGlvbnMuPC9wPlxuICAgICAqICAgICAgPHA+WW91IGNhbiBzZWUgdGhpcyBjdXN0b20gcm91dGluZyBjaGFubmVsIGluIGFjdGlvbiBpbiB0aGUgU3B5bmUgU3RhcnRlciBBcHA8L3A+XG4gICAgICpcbiAgICAgKiAgICAgIDxoNCBjbGFzcz0nYmFzaWMnPkV4YW1pbmluZyB0aGlzIFNpdGUncyBSb3V0ZSBDb25maWd1cmF0aW9uPC9oND5cbiAgICAgKiAgICAgIDxhcnRpY2xlIGNsYXNzPSdjb2RlLWV4YW1wbGUnIGlkPSdyb3V0ZXMtY29uZmlnLWV4YW1wbGUnPjwvYXJ0aWNsZT5cbiAgICAgKiAgICAgIDxwPllvdSBjYW4gc2VlIHRoaXMgc2l0ZSByb3V0aW5nIGluIGFjdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBjb25zb2xlJ3Mgcm91dGVzIHBhbmVsPC9wPlxuICAgICAqICAgICAgPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZScgZGF0YS10eXBlPVwiY29uc29sZVwiIGRhdGEtdmFsdWU9XCJvcGVuXCIgZGF0YS1jaGFubmVsLXR5cGU9XCJyb3V0ZVwiPkNMSUNLIFRPIE9QRU4gUk9VVEUgUEFORUw8L2Rpdj5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbXCI8aDQ+QmluZGluZyBVSSBFTGVtZW50cyB0byB0aGUgUm91dGUgQ2hhbm5lbDwvaDQ+XCJdXG4gICAgICogLy8gVGhpcyBhbHNvIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIG92ZXJyaWRlIHRoZSBSb3V0ZU9wdGlvbiB2YWx1ZSAodXNlZnVsIHdoZW4gdGhlIHZhbHVlIGlzIGEgcmVnZXggcGF0dGVybilcbiAgICAgKiA8ZGl2IGNsYXNzPSdidG4nIGRhdGEtY2hhbm5lbD1cIlJPVVRFXCIgZGF0YS1wYWdlLWlkPSdob21lJyBkYXRhLXBhZ2UtaWQtdmFsdWU9Jyc+SE9NRTwvZGl2PlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVtcIjxoND5VcGRhdGluZyB0aGUgUm91dGUgQ2hhbm5lbCB1c2luZyBWaWV3U3RyZWFtJnJzcXVvO3Mgc2VuZEluZm9Ub0NoYW5uZWw8L2g0PlwiXVxuICAgICAqIGNvbnN0IGRhdGFVcGRhdGVPYmogPSB7cGFnZUlkOidndWlkZScsIHNlY3Rpb246J3JlZmVyZW5jZScsIG1lbnVJdGVtOidzcHluZS1yb3V0ZS1jaGFubmVsJ307XG4gICAgICogdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbChcIkNIQU5ORUxfUk9VVEVcIiwgZGF0YVVwZGF0ZU9iaik7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFW1wiPGg0PlVwZGF0aW5nIHRoZSBSb3V0ZSBDaGFubmVsIHVzaW5nIENoYW5uZWwmcnNxdW87cyBzZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsPC9oND5cIl1cbiAgICAgKiBjb25zdCBkYXRhVXBkYXRlT2JqID0ge3BhZ2VJZDonZ3VpZGUnLCBzZWN0aW9uOidyZWZlcmVuY2UnLCBtZW51SXRlbTonc3B5bmUtcm91dGUtY2hhbm5lbCd9O1xuICAgICAqIHRoaXMuc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbChkYXRhVXBkYXRlT2JqKTtcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gY29uZmlnLnR5cGUgLSA9ICdzbGFzaCc7IFRoaXMgcHJvcGVydHkgZGV0ZXJtaW5lcyB0aGUgdXJsIHN0cnVjdHVyZSBieSBjb25mb3JtaW5nIHRoZSB3aW5kb3cgcGF0aG5hbWUgdG8gZWl0aGVyIHRoZSBzbGFzaCwgcXVlcnkgb3IgaGFzaCBmb3JtYXRzLlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcucm91dGVzIC0gPSB7cm91dGVQYXRoOiB7cm91dGVOYW1lOidjaGFuZ2UnfTsgVGhpcyBuZXN0ZWQgT2JqZWN0IGlzIHVzZWQgdG8gY29udHJ1Y3QgdGhlIHdpbmRvdyBwYXRobmFtZSBhbmQgdG8gZXhwcmVzcyB0aGUgd2luZG93IGxvY2F0aW9uIGFzIG1vZGVsIHZhcmlhYmxlcy5cbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9ST1VURSc7XG4gICAgICpcbiAgICAgKi9cbiAgICBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRydWVcbiAgICBzdXBlcignQ0hBTk5FTF9ST1VURScsIHByb3BzKVxuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmooKVxuICAgIHRoaXMucm91dGVDb25maWdKc29uID0gdGhpcy5nZXRSb3V0ZUNvbmZpZygpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kcygpXG4gICAgdGhpcy5uYXZUb1N0cmVhbSQgPSBuZXcgUmVwbGF5U3ViamVjdCgxKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gdGhpcy5uYXZUb1N0cmVhbSQucGlwZShtYXAoaW5mbyA9PiB0aGlzLm9uTWFwTmV4dChpbmZvKSkpXG4gICAgdGhpcy5jb21wYXJlUm91dGVLZXl3b3JkcyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29tcGFyZVJvdXRlS2V5d29yZHMoKVxuICB9XG5cbiAgY2hlY2tDb25maWdGb3JIYXNoKCkge1xuICAgIC8vIExFR0FDWSBDSEVDSyBUTyBTSU1QTElGWSBDT05GSUcgRk9SIEhBU0g7XG4gICAgY29uc3QgaXNIYXNoVHlwZSA9IFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUudHlwZSA9PT0gJ2hhc2gnXG4gICAgaWYgKGlzSGFzaFR5cGUgPT09IHRydWUpIHtcbiAgICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUudHlwZSA9ICdzbGFzaCdcbiAgICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUuaXNIYXNoID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZCgpIHtcbiAgICB0aGlzLmNoZWNrQ29uZmlnRm9ySGFzaCgpXG4gICAgdGhpcy5pbml0U3RyZWFtKClcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKCkge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKVxuICAgIGNvbnN0IGNvbnZlcnRlciA9IHN0ciA9PiBvYmpPZihzdHIsIHN0cilcbiAgICBjb25zdCBvYmogPSBtZXJnZUFsbChjaGFpbihjb252ZXJ0ZXIsIGFycikpXG4gICAgdGhpcy5jaGFubmVsQWN0aW9ucyA9IG9ialxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1JPVVRFX0RFRVBMSU5LX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9ST1VURV9DT05GSUdfVVBEQVRFRF9FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfUk9VVEVfVVBEQVRFX0NPTkZJR19FVkVOVCcsICd1cGRhdGVSb3V0ZUNvbmZpZyddXG4gICAgXVxuICB9XG5cbiAgdXBkYXRlUm91dGVDb25maWcoZSkge1xuICAgIGNvbnN0IG5ld1JvdXRlc09iaiAgPSBwaWNrKFsnaXNIYXNoJywgJ2lzSGlkZGVuJywgJ3JvdXRlcycsICd0eXBlJ10sIGUucGF5bG9hZClcblxuICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUgPSBtZXJnZVJpZ2h0KFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUsIG5ld1JvdXRlc09iailcblxuICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25mb3JtUm91dGVDb25maWcoKVxuXG4gICAgY29uc3Qgcm91dGVDb25maWcgPSB0aGlzLmdldFJvdXRlQ29uZmlnKClcbiAgICBjb25zdCBhY3Rpb24gPSAnQ0hBTk5FTF9ST1VURV9DT05GSUdfVVBEQVRFRF9FVkVOVCdcblxuICAgIC8vIHJldmVyc2UgYmVjYXVzZSByb3V0ZURhdGFzZXRzQXJyIHR1cm5zIG91dCB0aGF0IHdheVxuICAgIHJvdXRlQ29uZmlnLm5hdkxpbmtzID0gWy4uLnJvdXRlQ29uZmlnPy5yb3V0ZURhdGFzZXRzQXJyXVxuXG4gICAgdGhpcy5yb3V0ZUNvbmZpZ0pzb24gPSByb3V0ZUNvbmZpZ1xuICAgIHRoaXMuYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSgpXG5cbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHJvdXRlQ29uZmlnLCB7fSwge30sIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgZ2V0Um91dGVDb25maWcoKSB7XG4gICAgY29uc3Qgc3B5bmVDb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnXG4gICAgY29uc3Qgcm91dGVDb25maWcgPSBwYXRoKFsnY2hhbm5lbHMnLCAnUk9VVEUnXSwgc3B5bmVDb25maWcpXG4gICAgaWYgKHJvdXRlQ29uZmlnLnR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIHJvdXRlQ29uZmlnLmlzSGFzaCA9IGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgYXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5mbGF0dGVuQ29uZmlnT2JqZWN0KHJvdXRlQ29uZmlnLnJvdXRlcylcbiAgICByb3V0ZUNvbmZpZy5wYXJhbXNBcnIgPSBhcnJcbiAgICByZXR1cm4gcm91dGVDb25maWdcbiAgfVxuXG4gIGluaXRTdHJlYW0oKSB7XG4gICAgdGhpcy5maXJzdExvYWRTdHJlYW0kID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9uSW5jb21pbmdEb21FdmVudCh1bmRlZmluZWQsIHRoaXMucm91dGVDb25maWdKc29uLCAnJyArICdDSEFOTkVMX1JPVVRFX0RFRVBMSU5LX0VWRU5UJylcblxuICAgIFNweW5lVXRpbHNDaGFubmVsUm91dGUuY3JlYXRlUG9wU3RhdGVTdHJlYW0odGhpcy5vbkluY29taW5nRG9tRXZlbnQuYmluZCh0aGlzKSlcblxuICAgIHRoaXMub2JzZXJ2ZXIkID0gbWVyZ2UodGhpcy5maXJzdExvYWRTdHJlYW0kLFxuICAgICAgdGhpcy5uYXZUb1N0cmVhbSQpXG4gIH1cblxuICBvbk1hcE5leHQoZGF0YSwgZmlyc3RMb2FkZWQgPSBmYWxzZSkge1xuICAgIGRhdGEuYWN0aW9uID0gJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJ1xuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICBzdGF0aWMgcmVtb3ZlU1NJRChwYXlsb2FkKSB7XG4gICAgY29uc3Qgcm91dGVMZW5zID0gbGVuc1Byb3AoWydyb3V0ZURhdGEnXSlcbiAgICBjb25zdCBvbWl0U1NJRCA9IG92ZXIocm91dGVMZW5zLCBvbWl0KFsndnNpZCddKSlcbiAgICByZXR1cm4gb21pdFNTSUQocGF5bG9hZClcbiAgfVxuXG4gIHN0YXRpYyBvbkluY29taW5nRG9tRXZlbnQoZXZ0LCBjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgYWN0bikge1xuICAgIGNvbnN0IGFjdGlvbiA9IGFjdG4gIT09IHVuZGVmaW5lZFxuICAgICAgPyBhY3RuXG4gICAgICA6IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlRcblxuICAgIC8vIENIRUNLIElGIFRISVMgSVMgQSBISVNUT1JZIEVWRU5UIEJZIFVTSU5HIFRIRSByb3V0ZUNvdW50IFBST1BFUlRZXG4gICAgY29uc3QgZXZlbnRDb3VudCA9IHBhdGgoWydzdGF0ZScsICdyb3V0ZUNvdW50J10sIGV2dClcbiAgICBjb25zdCBpc0hpc3RvcnlDb3VudCA9IGlzKE51bWJlciwgZXZlbnRDb3VudCkgPT09IHRydWVcbiAgICBsZXQgcGF5bG9hZCA9IHRoaXMuZ2V0RGF0YUZyb21TdHJpbmcoY29uZmlnLCBpc0hpc3RvcnlDb3VudClcbiAgICBpZiAoaXNIaXN0b3J5Q291bnQgPT09IHRydWUpIHtcbiAgICAgIHBheWxvYWQucm91dGVDb3VudCA9IGV2ZW50Q291bnRcbiAgICB9XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgaWYgKGFjdG4gPT09ICdDSEFOTkVMX1JPVVRFX0RFRVBMSU5LX0VWRU5UJykge1xuICAgICAgcGF5bG9hZC5uYXZMaW5rcyA9IHByb3AoJ3JvdXRlRGF0YXNldHNBcnInLCBjb25maWcpXG4gICAgICAvLyBwYXlsb2FkLmxpbmtzRGF0YSA9IHBheWxvYWQubmF2TGlua3NcbiAgICAgIC8vIFNweW5lQXBwUHJvcGVydGllcy5saW5rc0RhdGEgPSBwYXlsb2FkLm5hdkxpbmtzXG5cbiAgICAgIC8vIGRlZmluZSBhbiBhbGlhcyBwcm9wZXJ0eSB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHlcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXlsb2FkLCAnbGlua3NEYXRhJywge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgLy8gY29uc29sZS53YXJuKCdnZXQgbGlua3MgZGF0YSBpcyBkZXByZWNhdGVkIGluIFJPVVRFIERFRVBMSU5LIERBVEEsIHVzZSBuYXZMaW5rcycpXG4gICAgICAgICAgcmV0dXJuIHRoaXMubmF2TGlua3NcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdzZXQgbGlua3MgZGF0YSBpcyBkZXByZWNhdGVkIGluIFJPVVRFIERFRVBMSU5LIERBVEEsIHVzZSBuYXZMaW5rcycpXG5cbiAgICAgICAgICAvLyB0aGlzLm5hdkxpbmtzID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IGtleXdvcmRBcnJzID0gdGhpcy5jb21wYXJlUm91dGVLZXl3b3Jkcy5jb21wYXJlKHBheWxvYWQucm91dGVEYXRhLCBwYXlsb2FkLnBhdGhzKVxuICAgIHBheWxvYWQgPSByTWVyZ2UocGF5bG9hZCwga2V5d29yZEFycnMpXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCB1bmRlZmluZWQsIGV2dCwgdGhpcy5uYXZUb1N0cmVhbSQpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JSb3V0ZVBhcmFtc092ZXJyaWRlcyhwYXlsb2FkKSB7XG4gICAgcmV0dXJuIHBheWxvYWRcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvckV2ZW50TWV0aG9kcyhvYnMpIHtcbiAgICBjb25zdCByZSA9IC9eKGV2ZW50KShbQS1aXS4qKShbQS1aXS4qKSQvZ21cbiAgICBjb25zdCBnZXRNZXRob2RzID0gY29tcG9zZShyYW1kYUZpbHRlcih0ZXN0KHJlKSksIGtleXMsIHByb3AoJ3BheWxvYWQnKSlcbiAgICBjb25zdCBtZXRob2RzQXJyID0gZ2V0TWV0aG9kcyhvYnMpXG4gICAgaWYgKG1ldGhvZHNBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGV2dCA9IHByb3AoJ2V2ZW50Jywgb2JzKVxuICAgICAgaWYgKGV2dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZFVwZGF0ZSA9IChtYXRjaCwgcDEsIHAyLCBwMywgcDQpID0+IFN0cmluZyhwMikudG9Mb3dlckNhc2UoKSArIHAzICsgcDRcbiAgICAgICAgY29uc3QgbWV0aG9kU3RyUmVwbGFjZSA9IHJlcGxhY2UoL14oZXZlbnQpKFtBLVpdKSguKikoW0EtWl0uKikkL2dtLCBtZXRob2RVcGRhdGUpXG4gICAgICAgIGNvbnN0IHJ1bk1ldGhvZCA9IChtZXRob2RTdHIpID0+IHtcbiAgICAgICAgICBjb25zdCBtID0gbWV0aG9kU3RyUmVwbGFjZShtZXRob2RTdHIpXG4gICAgICAgICAgaWYgKGV2dFttXSAhPT0gdW5kZWZpbmVkKSB7IGV2dFttXSgpIH1cbiAgICAgICAgfVxuICAgICAgICBtZXRob2RzQXJyLmZvckVhY2gocnVuTWV0aG9kKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYnNcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvckVuZFJvdXRlKHBsLCByb3V0ZUNvbmZpZ0pzb24gPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgZGVidWdCb29sKSB7XG4gICAgY29uc3QgZW5kUm91dGUgPSBjb21wb3NlKGVxdWFscygndHJ1ZScpLCBwYXRoKFsncGF5bG9hZCcsICdlbmRSb3V0ZSddKSkocGwpXG5cbiAgICBpZiAoZW5kUm91dGUgIT09IHRydWUpIHtcbiAgICAgIHJldHVybiBwbFxuICAgIH1cbiAgICBjb25zdCBkZWJ1ZyA9IGRlYnVnQm9vbCAhPT0gdW5kZWZpbmVkID8gZGVidWdCb29sIDogU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlXG4gICAgY29uc3QgeyBwYXlsb2FkIH0gPSBwbFxuXG4gICAgY29uc3QgZ2V0UHJvcFZhbCA9IChyb3V0ZVBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHJvdXRlTmFtZSA9IHByb3AoJ3JvdXRlTmFtZScsIHJvdXRlUGF0aClcbiAgICAgIGlmIChyb3V0ZU5hbWUpIHtcbiAgICAgICAgY29uc3Qga2V5c0FyciA9IGNvbXBvc2Uoa2V5cywgb21pdChbJ3JvdXRlTmFtZSddKSkocm91dGVQYXRoKVxuICAgICAgICBjb25zdCByb3V0ZU5hbWVWYWwgPSBwYXlsb2FkW3JvdXRlTmFtZV1cbiAgICAgICAgY29uc3QgcHJlZCA9IGFyclN0ciA9PiBuZXcgUmVnRXhwKGBeJHthcnJTdHJ9JGApLnRlc3Qocm91dGVOYW1lVmFsKVxuICAgICAgICBjb25zdCByb3V0ZVZhbCA9IGZpbmQocHJlZCwga2V5c0FycilcbiAgICAgICAgcmV0dXJuIHJvdXRlVmFsXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGl0ZXIgPSAwXG4gICAgY29uc3Qgb25SZWR1Y2VSb3V0ZVBhdGhzID0gKGFjYyA9IFtdLCBhcnIpID0+IHtcbiAgICAgIC8vIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJcbiAgICAgIGNvbnN0IHZhbCA9IGFyclsxXVxuICAgICAgY29uc3QgeyByb3V0ZVBhdGggfSA9IHZhbFxuICAgICAgY29uc3Qgcm91dGVOYW1lID0gcHJvcCgncm91dGVOYW1lJywgcm91dGVQYXRoKVxuICAgICAgY29uc3Qgcm91dGVOYW1lVmFsID0gZ2V0UHJvcFZhbChyb3V0ZVBhdGgpXG4gICAgICBjb25zdCBpc09iaiA9IGlzKE9iamVjdCwgdmFsKVxuICAgICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSwgdmFsKVxuICAgICAgY29uc3QgaXRlck9iaiA9IGlzT2JqID09PSB0cnVlICYmIGlzQXJyID09PSBmYWxzZVxuICAgICAgaXRlciA9IGl0ZXIgKyAxXG4gICAgICBpZiAoaXRlck9iaikge1xuICAgICAgICBjb25zdCBuZXh0Um91dGVQYXRoID0gcm91dGVQYXRoW3JvdXRlTmFtZVZhbF1cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2tleSBpcyAnLHtpdGVyLGFjYyxrZXksIHJvdXRlTmFtZSwgcm91dGVOYW1lVmFsLCBpdGVyT2JqLCBuZXh0Um91dGVQYXRofSk7XG4gICAgICAgIGlmIChuZXh0Um91dGVQYXRoKSB7XG4gICAgICAgICAgY29tcG9zZShyZXZlcnNlLCByZWR1Y2Uob25SZWR1Y2VSb3V0ZVBhdGhzLCBhY2MpLCB0b1BhaXJzKSh7IG5leHRSb3V0ZVBhdGggfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIktFWSBJUyBcIix7aXRlcixrZXksIHJvdXRlTmFtZSwgcm91dGVOYW1lVmFsfSlcbiAgICAgICAgICBpZiAoaXRlciA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdXNlIG9mIGVuZCByb3V0ZSBtZXRob2Qgc2hvdWxkIGFkZCBzdGFydCByb3V0ZSB2YWx1ZSBvZiBcIiR7cm91dGVOYW1lfVwiLmApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKHJvdXRlTmFtZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2NcbiAgICB9XG5cbiAgICBjb25zdCB7IHJvdXRlcyB9ID0gcm91dGVDb25maWdKc29uXG5cbiAgICBjb25zdCBlbmRSb3V0ZVZhbEFyciA9IGNvbXBvc2UocmV2ZXJzZSwgcmVkdWNlKG9uUmVkdWNlUm91dGVQYXRocywgW10pLCB0b1BhaXJzKSh7IHJvdXRlcyB9KVxuICAgIC8vIGNvbnNvbGUubG9nKCdlbmQgcm91dGUgdmFsIGFyciAnLGVuZFJvdXRlVmFsQXJyKTtcbiAgICBpZiAoZW5kUm91dGVWYWxBcnIubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBlbmRSb3V0ZVZhbCA9IGVuZFJvdXRlVmFsQXJyWzBdXG4gICAgICBwbC5wYXlsb2FkW2VuZFJvdXRlVmFsXSA9ICcnXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBlbmQgcm91dGUgcGFyYW0gZGlkIG5vdCB5aWVsZCBhbnkgcmVzdWx0cyBmb3IgJHtKU09OLnN0cmluZ2lmeShwYXlsb2FkKX0gYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBsXG4gIH1cblxuICBvblZpZXdTdHJlYW1JbmZvKHBsKSB7XG4gICAgY29uc3QgYWN0aW9uID0gcGwuYWN0aW9uID8/IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlRcblxuICAgIGZ1bmN0aW9uIGRvbVN0cmluZ01hcFRvT2JqZWN0KGRvbVN0cmluZ01hcCkge1xuICAgICAgY29uc3Qgb2JqID0ge31cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGRvbVN0cmluZ01hcCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdOKAmXMgYSBkaXJlY3QgcHJvcGVydHkgKHRob3VnaCBkYXRhc2V0IHJhcmVseSBoYXMgYW55dGhpbmcgb24gdGhlIHByb3RvdHlwZSk6XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZG9tU3RyaW5nTWFwLCBrZXkpKSB7XG4gICAgICAgICAgb2JqW2tleV0gPSBkb21TdHJpbmdNYXBba2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqXG4gICAgfVxuXG4gICAgaWYgKHBsPy5zcmNFbGVtZW50Py5lbD8uZGF0YXNldCkge1xuICAgICAgcGwucGF5bG9hZCA9IGRvbVN0cmluZ01hcFRvT2JqZWN0KHBsPy5zcmNFbGVtZW50Py5lbD8uZGF0YXNldCkgPz8gcGwucGF5bG9hZFxuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKCdST1VURSBDSEFOTkVMIFZTSSAnLCB7IHBsIH0pXG5cbiAgICBTcHluZUNoYW5uZWxSb3V0ZS5jaGVja0ZvckV2ZW50TWV0aG9kcyhwbClcbiAgICBwbCA9IHRoaXMuY2hlY2tGb3JFbmRSb3V0ZShwbClcbiAgICBsZXQgcGF5bG9hZCA9IHRoaXMuZ2V0RGF0YUZyb21QYXJhbXMocGwpXG5cbiAgICBjb25zdCBzcmNFbGVtZW50ID0gcHJvcCgnc3JjRWxlbWVudCcsIHBsKVxuICAgIGNvbnN0IGV2ZW50ID0gcHJvcCgnZXZlbnQnLCBwbClcbiAgICBjb25zdCBjaGFuZ2VMb2NhdGlvbkJvb2wgPSAhcGF5bG9hZC5pc0hpZGRlblxuICAgIGNvbnN0IGtleXdvcmRBcnJzID0gdGhpcy5jb21wYXJlUm91dGVLZXl3b3Jkcy5jb21wYXJlKHBheWxvYWQucm91dGVEYXRhLCBwYXlsb2FkLnBhdGhzKVxuXG4gICAgcGF5bG9hZCA9IHJNZXJnZShwYXlsb2FkLCBrZXl3b3JkQXJycylcbiAgICB0aGlzLnNlbmRSb3V0ZVN0cmVhbShwYXlsb2FkLCBjaGFuZ2VMb2NhdGlvbkJvb2wpXG5cbiAgICBwYXlsb2FkID0gU3B5bmVDaGFubmVsUm91dGUucmVtb3ZlU1NJRChwYXlsb2FkKVxuXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCxcbiAgICAgIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrQW5kQ29udmVydFN0cldpdGhSZWdleFRva2Vucyhyb3V0ZVZhbHVlLCByZWdleFRva2VuT2JqKSB7XG4gICAgY29uc3QgdG9rZW5LZXlzQXJyID0ga2V5cyhyZWdleFRva2VuT2JqKVxuXG4gICAgcmV0dXJuIHRva2VuS2V5c0FyclxuICB9XG5cbiAgc2VuZFJvdXRlU3RyZWFtKHBheWxvYWQsIGNoYW5nZVdpbmRvd0xvYyA9IHRydWUpIHtcbiAgICBpZiAoY2hhbmdlV2luZG93TG9jID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNldFdpbmRvd0xvY2F0aW9uKHBheWxvYWQpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlU3RhdGUoKSB7XG4gICAgcmV0dXJuICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCdcbiAgfVxuXG4gIHN0YXRpYyBnZXRJc0RlZXBMaW5rQm9vbChpc0hpc3RvcnkpIHtcbiAgICByZXR1cm4gaXNIaXN0b3J5ID09PSBmYWxzZSAmJiB0aGlzLl9yb3V0ZUNvdW50ID09PSAwXG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVDb3VudChpc0hpc3RvcnkgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLl9yb3V0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3JvdXRlQ291bnQgPSAwXG4gICAgICByZXR1cm4gdGhpcy5fcm91dGVDb3VudFxuICAgIH1cbiAgICBpZiAoaXNIaXN0b3J5ID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcm91dGVDb3VudCArPSAxXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yb3V0ZUNvdW50XG4gIH1cblxuICBzdGF0aWMgZ2V0RXh0cmFQYXlsb2FkUGFyYW1zKGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uLCBpc0hpc3RvcnkgPSBmYWxzZSkge1xuICAgIGNvbnN0IHJvdXRlQ291bnQgPSB0aGlzLmdldFJvdXRlQ291bnQoaXNIaXN0b3J5KVxuICAgIGNvbnN0IGlzRGVlcExpbmsgPSB0aGlzLmdldElzRGVlcExpbmtCb29sKGlzSGlzdG9yeSlcbiAgICBjb25zdCBpc0hhc2ggPSBjb25maWcuaXNIYXNoXG4gICAgY29uc3QgaXNIaWRkZW4gPSBjb25maWcuaXNIaWRkZW5cbiAgICBjb25zdCByb3V0ZVR5cGUgPSBjb25maWcudHlwZVxuICAgIHJldHVybiB7IHJvdXRlQ291bnQsIGlzRGVlcExpbmssIGlzSGFzaCwgaXNIaXN0b3J5LCBpc0hpZGRlbiwgcm91dGVUeXBlIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXREYXRhRnJvbVBhcmFtcyhwbCwgY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24pIHtcbiAgICBsZXQgcm91dGVEYXRhID0gcHJvcCgncGF5bG9hZCcsIHBsKVxuXG4gICAgY29uc3Qgcm91dGVWYWx1ZSA9IHRoaXMuZ2V0Um91dGVTdHJGcm9tUGFyYW1zKHJvdXRlRGF0YSwgY29uZmlnKVxuXG4gICAgLy8gV0lORE9XIExPQ0FUSU9OIEhBU04nVCBCRUVOIENIQU5HRUQgWUVULCBTTyBXSUxMIEdFVCBTVFIgUEFSQU1TXG4gICAgY29uc3QgZ2V0UHJvcEZyb21Db25maWcgPSAocHJwLCBkZWZhbHQpID0+IGRlZmF1bHRUbyhkZWZhbHQsIHByb3AocHJwLCBjb25maWcpKVxuICAgIGNvbnN0IHR5cGVGb3JTdHIgPSBnZXRQcm9wRnJvbUNvbmZpZygndHlwZScsICdzbGFzaCcpXG4gICAgY29uc3QgaXNIYXNoRm9yU3RyID0gZ2V0UHJvcEZyb21Db25maWcoJ2lzSGFzaCcsIGZhbHNlKVxuICAgIGNvbnN0IG5leHRXaW5kb3dMb2MgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmZvcm1hdFN0ckFzV2luZG93TG9jYXRpb24ocm91dGVWYWx1ZSlcbiAgICBjb25zdCBkYXRhRnJvbVN0ciA9IHRoaXMuZ2V0RGF0YUZyb21Mb2NhdGlvblN0cih0eXBlRm9yU3RyLCBpc0hhc2hGb3JTdHIsIG5leHRXaW5kb3dMb2MpXG5cbiAgICBjb25zdCB7IHBhdGhJbm5lcm1vc3QsIHBhdGhzIH0gPSBkYXRhRnJvbVN0clxuXG4gICAgcm91dGVEYXRhID0gck1lcmdlKGRhdGFGcm9tU3RyLnJvdXRlRGF0YSwgcm91dGVEYXRhKVxuXG4gICAgY29uc3QgeyByb3V0ZUNvdW50LCBpc0RlZXBMaW5rLCBpc0hhc2gsIGlzSGlzdG9yeSwgaXNIaWRkZW4sIHJvdXRlVHlwZSB9ID0gdGhpcy5nZXRFeHRyYVBheWxvYWRQYXJhbXMoXG4gICAgICBjb25maWcpXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzRGVlcExpbmssXG4gICAgICByb3V0ZUNvdW50LFxuICAgICAgcGF0aElubmVybW9zdCxcbiAgICAgIHBhdGhzLFxuICAgICAgcm91dGVEYXRhLFxuICAgICAgcm91dGVWYWx1ZSxcbiAgICAgIGlzSGFzaCxcbiAgICAgIGlzSGlkZGVuLFxuICAgICAgaXNIaXN0b3J5LFxuICAgICAgcm91dGVUeXBlXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldERhdGFGcm9tU3RyaW5nKGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uLCBpc0hpc3RvcnkgPSBmYWxzZSkge1xuICAgIGNvbnN0IHR5cGUgPSBjb25maWcudHlwZVxuICAgIGNvbnN0IGhhc2hJc1RydWUgPSBjb25maWcuaXNIYXNoID09PSB0cnVlXG4gICAgY29uc3Qgc3RyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5nZXRMb2NhdGlvblN0ckJ5VHlwZSh0eXBlLCBoYXNoSXNUcnVlKVxuICAgIGNvbnN0IHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9ID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyKFxuICAgICAgc3RyLCBjb25maWcsIHR5cGUpXG4gICAgY29uc3QgeyByb3V0ZUNvdW50LCBpc0RlZXBMaW5rLCBpc0hhc2gsIHJvdXRlVHlwZSwgaXNIaWRkZW4gfSA9IHRoaXMuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zKFxuICAgICAgY29uZmlnLCBpc0hpc3RvcnkpXG5cbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBpc0RlZXBMaW5rLFxuICAgICAgcm91dGVDb3VudCxcbiAgICAgIHBhdGhJbm5lcm1vc3QsXG4gICAgICBwYXRocyxcbiAgICAgIHJvdXRlRGF0YSxcbiAgICAgIHJvdXRlVmFsdWUsXG4gICAgICBpc0hhc2gsXG4gICAgICBpc0hpZGRlbixcbiAgICAgIGlzSGlzdG9yeSxcbiAgICAgIHJvdXRlVHlwZVxuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgZ2V0RGF0YUZyb21Mb2NhdGlvblN0cih0ID0gJ3NsYXNoJywgaXNIYXNoID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24uaXNIYXNoLCBsb2MgPSB3aW5kb3cubG9jYXRpb24pIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24gIT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzLnJvdXRlQ29uZmlnSnNvbi50eXBlXG4gICAgICA6IHRcblxuICAgIGNvbnN0IHN0ciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZ2V0TG9jYXRpb25TdHJCeVR5cGUodHlwZSwgaXNIYXNoLCBsb2MpXG4gICAgY29uc3QgeyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlIH0gPSB0aGlzLmdldFBhcmFtc0Zyb21Sb3V0ZVN0cihcbiAgICAgIHN0ciwgdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIHR5cGUpXG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5nZXRSb3V0ZVN0YXRlKClcbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlLCBhY3Rpb24gfVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVN0ckZyb21QYXJhbXMocGFyYW1zRGF0YSwgcm91dGVDb25maWcsIHQpIHtcbiAgICBjb25zdCB0eXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHJvdXRlQ29uZmlnLnR5cGVcbiAgICBjb25zdCBvYmogPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRQYXJhbXNUb1JvdXRlKHBhcmFtc0RhdGEsIHJvdXRlQ29uZmlnLCB0eXBlKVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIHN0YXRpYyBnZXRQYXJhbXNGcm9tUm91dGVTdHIoc3RyLCByb3V0ZUNvbmZpZywgdCkge1xuICAgIGNvbnN0IHR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogcm91dGVDb25maWcudHlwZVxuICAgIGNvbnN0IG9iaiA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY29udmVydFJvdXRlVG9QYXJhbXMoc3RyLCByb3V0ZUNvbmZpZywgdHlwZSlcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBjaGVja0VtcHR5Um91dGVTdHIoc3RyLCBpc0hhc2ggPSBmYWxzZSkge1xuICAgIGNvbnN0IGlzRW1wdHlCb29sID0gaXNFbXB0eShzdHIpXG4gICAgY29uc3QgcGF0aE5hbWVJc0VtcHR5Qm9vbCA9IGlzRW1wdHlCb29sID09PSB0cnVlICYmIGlzSGFzaCA9PT0gZmFsc2VcbiAgICBjb25zdCBoYXNoTmFtZUlzRW1wdHlCb29sID0gaXNFbXB0eUJvb2wgPT09IHRydWUgJiYgaXNIYXNoID09PSB0cnVlXG4gICAgY29uc3QgaGFzaE5hbWVCb29sID0gaXNFbXB0eUJvb2wgPT09IGZhbHNlICYmIGlzSGFzaCA9PT0gdHJ1ZVxuXG4gICAgaWYgKHBhdGhOYW1lSXNFbXB0eUJvb2wgPT09IHRydWUgfHwgaGFzaE5hbWVJc0VtcHR5Qm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuICcvJ1xuICAgIH0gZWxzZSBpZiAoaGFzaE5hbWVCb29sID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gY29uY2F0KCcjJywgc3RyKVxuICAgIH1cbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBzdGF0aWMgcmVtb3ZlTGFzdFNsYXNoKHN0cikge1xuICAgIGNvbnN0IHJlID0gL14oLiopKFxcLykkL1xuICAgIHJldHVybiBzdHIucmVwbGFjZShyZSwgJyQxJylcbiAgfVxuXG4gIHNldFdpbmRvd0xvY2F0aW9uKGNoYW5uZWxQYXlsb2FkKSB7XG4gICAgbGV0IHsgaXNIYXNoLCByb3V0ZVZhbHVlLCByb3V0ZVR5cGUgfSA9IGNoYW5uZWxQYXlsb2FkXG4gICAgcm91dGVWYWx1ZSA9IHRoaXMuY2hlY2tFbXB0eVJvdXRlU3RyKHJvdXRlVmFsdWUsIGlzSGFzaClcbiAgICBjb25zdCB7IHJvdXRlQ291bnQgfSA9IGNoYW5uZWxQYXlsb2FkXG4gICAgaWYgKGlzSGFzaCA9PT0gdHJ1ZSB8fCByb3V0ZVR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIGNvbnN0IHBhdGhOYW1lID0gU3B5bmVDaGFubmVsUm91dGUucmVtb3ZlTGFzdFNsYXNoKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSlcbiAgICAgIHJvdXRlVmFsdWUgPSBwYXRoTmFtZSArIHJvdXRlVmFsdWVcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7IHJvdXRlQ291bnQgfSwgJycsIHJvdXRlVmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNoZWNrRm9yU2xhc2ggPSB3aGVuKFxuICAgICAgICBjb21wb3NlKGNvbXBsZW1lbnQoZXF1YWxzKCcvJykpLCBoZWFkKSwgY29uY2F0KCcvJywgX18pKVxuICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHsgcm91dGVDb3VudCB9LCAnJywgY2hlY2tGb3JTbGFzaChyb3V0ZVZhbHVlKSlcbiAgICB9XG4gIH1cblxuICBnZXRXaW5kb3dMb2NhdGlvbigpIHtcbiAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lIC8vIHB1bGxIYXNoQW5kU2xhc2hGcm9tUGF0aCh3aW5kb3cubG9jYXRpb24uaGFzaCk7XG4gIH1cblxuICBiaW5kU3RhdGljTWV0aG9kcygpIHtcbiAgICB0aGlzLmNoZWNrRm9yRW5kUm91dGUgPSBTcHluZUNoYW5uZWxSb3V0ZS5jaGVja0ZvckVuZFJvdXRlLmJpbmQodGhpcylcbiAgICB0aGlzLmdldElzRGVlcExpbmtCb29sID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0SXNEZWVwTGlua0Jvb2wuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0RGF0YUZyb21Mb2NhdGlvblN0ciA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldERhdGFGcm9tTG9jYXRpb25TdHIuYmluZChcbiAgICAgIHRoaXMpXG4gICAgdGhpcy5vbkluY29taW5nRG9tRXZlbnQgPSBTcHluZUNoYW5uZWxSb3V0ZS5vbkluY29taW5nRG9tRXZlbnQuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0RGF0YUZyb21TdHJpbmcgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXREYXRhRnJvbVN0cmluZy5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRQYXJhbXNGcm9tUm91dGVTdHIgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRQYXJhbXNGcm9tUm91dGVTdHIuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0TG9jYXRpb25EYXRhID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0TG9jYXRpb25EYXRhLmJpbmQodGhpcylcbiAgICB0aGlzLmdldFJvdXRlU3RhdGUgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRSb3V0ZVN0YXRlLmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tUGFyYW1zID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RGF0YUZyb21QYXJhbXMuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0Um91dGVDb3VudCA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFJvdXRlQ291bnQuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zLmJpbmQodGhpcylcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKVxuICB9XG5cbiAgYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSgpIHtcbiAgICBjb25zdCBjdXJyaWVkR2V0Um91dGUgPSBjdXJyeU4oMywgU3B5bmVDaGFubmVsUm91dGUuZ2V0Um91dGVTdHJGcm9tUGFyYW1zKVxuICAgIHRoaXMuZ2V0Um91dGVTdHJGcm9tUGFyYW1zID0gY3VycmllZEdldFJvdXRlKF9fLCB0aGlzLnJvdXRlQ29uZmlnSnNvbixcbiAgICAgIHRoaXMucm91dGVDb25maWdKc29uLnR5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgZXF1YWxzLCBwYXRoLCBjb21wb3NlLCBwcm9wLCBmaWx0ZXIsIHJlcGxhY2UsIGxlbnNQcm9wLCBvdmVyLCBvbWl0LCB0ZXN0LCBrZXlzLCBlaXRoZXIsIHRvVXBwZXIgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IHNhbml0aXplRXZlbnRUYXJnZXQgfSBmcm9tICcuLi91dGlscy9zYW5pdGl6ZS1kYXRhLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsVUkgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsVUlcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGlzIENoYW5uZWwgbGlzdGVucyB0byBhbGwgVXNlciBFdmVudHMgdGhhdCBoYXZlIGJlZW4gc2V0IHRvIGJyb2FkY2FzdCBieSBWaWV3U3RyZWFtIGluc3RhbmNlcywgdXNpbmcgdGhlIGJyb2FkQ2FzdEV2ZW50cyBtZXRob2QuPC9wPlxuICAgKiA8cD5IVE1MIEVsZW1lbnRzIHRoYXQgaGF2ZSB0aGVpciBkYXRhIGNoYW5uZWwgcHJvcGVydHkgc2V0IHRvIFwiUk9VVEVcIiB3aWxsIGJyb2FkY2FzdCB0aGVpciB1aSBldmVudCB0byB0aGF0IGNoYW5uZWwgaW5zdGVhZC48L3A+XG4gICAqIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUgbW9kYWwtYnRuJyAgZGF0YS10eXBlPSdtb2RhbC13aW5kb3cnIGRhdGEtdmFsdWU9J3VpRXZlbnRzJz5WaWV3IFVJIEV2ZW50czwvZGl2PjwvYnI+PC9icj5cbiAgICogPHA+U2VlIExJTktbJ1ZpZXdTdHJlYW0nLCAndmlldy1zdHJlYW0nXSBmb3IgYW4gZXhhbXBsZSBvbiBob3cgdG8gYmluZCBIVE1MIEVsZW1lbnRzIHRvIHRoZSBVSSBDaGFubmVsLjwvcD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBDSEFOTkVMX05BTUUgLSA9ICdDSEFOTkVMX1VJJztcbiAgICpcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IobmFtZSA9ICdDSEFOTkVMX1VJJywgcHJvcHMgPSB7fSkge1xuICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gZmFsc2VcbiAgICBzdXBlcihuYW1lLCBwcm9wcylcbiAgICB0aGlzLmtleUV2ZW50c0xvYWRlZCA9IGZhbHNlXG4gICAgdGhpcy5rZXlDb2RlQXJyID0gW11cbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9VSV9ET01DT05URU5UTE9BREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FCT1JUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FDVElWQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FERFRSQUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FGVEVSUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUZURVJTQ1JJUFRFWEVDVVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OSVRFUkFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FQUElOU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BVURJT0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BVURJT1NUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVWENMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFRk9SRUlOUFVUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFRk9SRVBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFRk9SRVVOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CRUdJTkVWRU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JMT0NLRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkxVUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CT1VOREFSWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CVUZGRVJFREFNT1VOVExPV19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0FOUExBWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5QTEFZVEhST1VHSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0xPU0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0xPU0lOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QTEVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QT1NJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QT1NJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9OVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTk5FQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OTkVDVElPTlNUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTlRFTlRERUxFVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OVEVYVE1FTlVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09QWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DVUVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RBVEFDSEFOTkVMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RCTENMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RFVklDRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ERVZJQ0VNT1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREVWSUNFT1JJRU5UQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR09WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR1NUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RST1BfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFVSQVRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU1QVElFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5ERVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5ERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5URVJQSUNUVVJFSU5QSUNUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZPQ1VTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZPQ1VTSU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9STURBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRlVMTFNDUkVFTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GVUxMU0NSRUVORVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0FNRVBBRENPTk5FQ1RFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HQU1FUEFERElTQ09OTkVDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dBVEhFUklOR1NUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dFU1RVUkVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0VTVFVSRUVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HRVNUVVJFU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR09UUE9JTlRFUkNBUFRVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSEFTSENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDQU5ESURBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFQ0FORElEQVRFRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFQ09OTkVDVElPTlNUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUdBVEhFUklOR1NUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOUFVUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOUFVUU09VUkNFU0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JTlNUQUxMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOVkFMSURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfS0VZRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9LRVlVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MQU5HVUFHRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MRUFWRVBJQ1RVUkVJTlBJQ1RVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FERUREQVRBX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFRE1FVEFEQVRBX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BRFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPU1RQT0lOVEVSQ0FQVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NQVJLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FUkNIQU5UVkFMSURBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NRVNTQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FU1NBR0VFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRUxFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFTU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRU9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NVVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX05FR09USUFUSU9OTkVFREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX05PTUFUQ0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTk9USUZJQ0FUSU9OQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfT0ZGTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PTkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfT1BFTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PUklFTlRBVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQUdFSElERV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQUdFU0hPV19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVNURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVVTRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVlFUkRFVEFJTENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVlNRU5UTUVUSE9EQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BMQVlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUExBWUlOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkxPQ0tDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkxPQ0tFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVST1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QUk9HUkVTU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QVVNIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BVU0hTVUJTQ1JJUFRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRUFEWVNUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFSkVDVElPTkhBTkRMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVNT1ZFVFJBQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVNT1ZFU1RSRUFNX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFUEVBVEVWRU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU0VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU0laRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNPVVJDRVRJTUlOR0JVRkZFUkZVTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTVUxUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU1VNRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TQ1JPTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VBUkNIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFRUtFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUVLSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RFRENBTkRJREFURVBBSVJDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNURU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSElQUElOR0FERFJFU1NDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0hJUFBJTkdPUFRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0lHTkFMSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0xPVENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TT1VOREVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TT1VORFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NQRUVDSEVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUEVFQ0hTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUVVFRVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NRVUVFWkVFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1FVRUVaRVNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NUQUxMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RPUkFHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVUJNSVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1VDQ0VTU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVVNQRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RJTUVPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVElNRVVQREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT0dHTEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9ORUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSENBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSEVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSE1PVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9VQ0hTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTlJVTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVU5IQU5ETEVEUkVKRUNUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VTk1VVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVVBHUkFERU5FRURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WRVJTSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZJU0lCSUxJVFlDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVk9JQ0VTQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WT0xVTUVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZQkxVUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlDT05ORUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWURFQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZRElTQ09OTkVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlGT0NVU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlQT0lOVEVSUkVTVFJJQ1RFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlQT0lOVEVSVU5SRVNUUklDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBSRVNFTlRDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0FJVElOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJHTENPTlRFWFRDUkVBVElPTkVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQkdMQ09OVEVYVExPU1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCR0xDT05URVhUUkVTVE9SRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRUNIQU5HRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQktJVE1PVVNFRk9SQ0VXSUxMQkVHSU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0hFRUxfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgbG9hZEtleVN0cmVhbSgpIHtcbiAgICBjb25zdCBrZXlVcHMgPSBPYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2tleXVwJylcbiAgICBjb25zdCBmaWx0ZXJLZXlzID0gZSA9PiB0aGlzLmtleUNvZGVBcnIuaW5kZXhPZihlLmtleUNvZGUpID49IDBcbiAgICB0aGlzLmtleVByZXNzZXMkID0ga2V5VXBzLmdyb3VwQnkoZSA9PiBlLmtleUNvZGUpXG4gICAgICAubWVyZ2VBbGwoKVxuICAgICAgLmZpbHRlcihmaWx0ZXJLZXlzKVxuICAgICAgLnJlcGVhdCgpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMub25LZXlQcmVzc2VkLmJpbmQodGhpcykpXG4gIH1cblxuICBhZGRLZXlFdmVudChudW0pIHtcbiAgICBpZiAodGhpcy5rZXlFdmVudHNMb2FkZWQgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmxvYWRLZXlTdHJlYW0oKVxuICAgIH1cbiAgICB0aGlzLmtleUV2ZW50c0xvYWRlZCA9IHRydWVcbiAgICB0aGlzLnJlZ2lzdGVyS2V5KG51bSlcbiAgfVxuXG4gIHJlZ2lzdGVyS2V5KGMpIHtcbiAgICB0aGlzLmtleUNvZGVBcnIucHVzaChjKVxuICB9XG5cbiAgb25LZXlQcmVzc2VkKGV2dCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdrZXkgaXMgJywgZXZ0KTtcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVTU0lEKHBsKSB7XG4gICAgY29uc3Qgcm91dGVMZW5zID0gbGVuc1Byb3AoWydwYXlsb2FkJ10pXG4gICAgY29uc3Qgb21pdFNTSUQgPSBvdmVyKHJvdXRlTGVucywgb21pdChbJ3ZzaWQnXSkpXG4gICAgcmV0dXJuIG9taXRTU0lEKHBsKVxuICB9XG5cbiAgb25JbmNvbWluZ09ic2VydmFibGUob2JqKSB7XG4gICAgY29uc3QgZXFzTmFtZSA9IGVxdWFscyhvYmoubmFtZSwgdGhpcy5wcm9wcy5uYW1lKVxuICAgIG9iai5kYXRhID0gU3B5bmVDaGFubmVsVUkucmVtb3ZlU1NJRChvYmouZGF0YSlcbiAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQgfSA9IG9iai5kYXRhXG4gICAgY29uc3QgZGF0YU9iaiA9IG9ic1ZhbCA9PiAoeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudDogb2JzVmFsIH0pXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKG9iaikgPT4gb2JqLm9ic2VydmFibGUucGlwZShtYXAoZGF0YU9iaikpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMub25VSUV2ZW50LmJpbmQodGhpcykpXG4gICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHt9XG4gICAgcmV0dXJuIGVxc05hbWUgPT09IHRydWUgPyBvblN1Y2Nlc3Mob2JqKSA6IG9uRXJyb3IoKVxuICB9XG5cbiAgZ2V0QWN0aW9uU3RhdGUodmFsKSB7XG4gICAgY29uc3QgdHlwZVZhbCA9IHBhdGgoWydldmVudCcsICd0eXBlJ10pXG4gICAgY29uc3QgdHlwZU92ZXJSaWRlVmFsID0gcGF0aChbJ2V2ZW50JywgJ3R5cGVPdmVyUmlkZSddKVxuICAgIGNvbnN0IGV2ZW50VHlwZSA9IGNvbXBvc2UodG9VcHBlciwgZWl0aGVyKHR5cGVPdmVyUmlkZVZhbCwgdHlwZVZhbCkpXG4gICAgY29uc3QgdHlwZSA9IGV2ZW50VHlwZSh2YWwpXG4gICAgY29uc3QgbWFpbkFjdGlvbiA9ICdDSEFOTkVMX1VJJ1xuICAgIHJldHVybiB0eXBlICE9PSB1bmRlZmluZWQgPyBgJHttYWluQWN0aW9ufV8ke3R5cGV9X0VWRU5UYCA6IG1haW5BY3Rpb25cbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvckV2ZW50TWV0aG9kcyhvYnMpIHtcbiAgICBjb25zdCByZSA9IC9eKGV2ZW50KShbQS1aXS4qKShbQS1aXS4qKSQvZ21cbiAgICBjb25zdCBnZXRNZXRob2RzID0gY29tcG9zZShmaWx0ZXIodGVzdChyZSkpLCBrZXlzLCBwcm9wKCdwYXlsb2FkJykpXG4gICAgY29uc3QgbWV0aG9kc0FyciA9IGdldE1ldGhvZHMob2JzKVxuICAgIGlmIChtZXRob2RzQXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICBjb25zdCBldnQgPSBwcm9wKCdldmVudCcsIG9icylcbiAgICAgIGlmIChldnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtZXRob2RVcGRhdGUgPSAobWF0Y2gsIHAxLCBwMiwgcDMsIHA0KSA9PiBTdHJpbmcocDIpLnRvTG93ZXJDYXNlKCkgKyBwMyArIHA0XG4gICAgICAgIGNvbnN0IG1ldGhvZFN0clJlcGxhY2UgPSByZXBsYWNlKC9eKGV2ZW50KShbQS1aXSkoLiopKFtBLVpdLiopJC9nbSwgbWV0aG9kVXBkYXRlKVxuICAgICAgICBjb25zdCBydW5NZXRob2QgPSAobWV0aG9kU3RyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbSA9IG1ldGhvZFN0clJlcGxhY2UobWV0aG9kU3RyKVxuICAgICAgICAgIGlmIChldnRbbV0gIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgKGV2dFttXSkgPT09ICdmdW5jdGlvbicpIHsgZXZ0W21dKCkgfVxuICAgICAgICB9XG4gICAgICAgIG1ldGhvZHNBcnIuZm9yRWFjaChydW5NZXRob2QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ic1xuICB9XG5cbiAgb25VSUV2ZW50KG9icykge1xuICAgIGZ1bmN0aW9uIGRvbVN0cmluZ01hcFRvT2JqZWN0KGRvbVN0cmluZ01hcCkge1xuICAgICAgY29uc3Qgb2JqID0ge31cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGRvbVN0cmluZ01hcCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdOKAmXMgYSBkaXJlY3QgcHJvcGVydHkgKHRob3VnaCBkYXRhc2V0IHJhcmVseSBoYXMgYW55dGhpbmcgb24gdGhlIHByb3RvdHlwZSk6XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZG9tU3RyaW5nTWFwLCBrZXkpKSB7XG4gICAgICAgICAgb2JqW2tleV0gPSBkb21TdHJpbmdNYXBba2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqXG4gICAgfVxuXG4gICAgb2JzLnBheWxvYWQgPSBkb21TdHJpbmdNYXBUb09iamVjdChvYnM/LnNyY0VsZW1lbnQ/LmVsPy5kYXRhc2V0KSA/PyBvYnMucGF5bG9hZFxuXG4gICAgU3B5bmVDaGFubmVsVUkuY2hlY2tGb3JFdmVudE1ldGhvZHMob2JzKVxuICAgIG9icy5hY3Rpb24gPSB0aGlzLmdldEFjdGlvblN0YXRlKG9icylcbiAgICBjb25zdCBhY3Rpb24gPSBvYnMuYWN0aW9uLy8gdGhpcy5nZXRBY3Rpb25TdGF0ZShvYnMpO1xuICAgIC8vIGNvbnN0IHsgc3JjRWxlbWVudCB9ID0gb2JzXG4gICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50IH0gPSBvYnNcblxuICAgIGNvbnN0IGV2ZW50ID0gb2JzLmV2ZW50XG4gICAgc2FuaXRpemVFdmVudFRhcmdldChldmVudD8udGFyZ2V0KVxuICAgIC8vIGNvbnN0IHBheWxvYWQgPSBkb21TdHJpbmdNYXBUb09iamVjdChzcmNFbGVtZW50Py5lbD8uZGF0YXNldCkgPz8gb2JzLnBheWxvYWRcbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCB9IGZyb20gJy4uL3V0aWxzL2ZycC10b29scy5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXdpbmRvdy5qcydcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCwgZGVib3VuY2VUaW1lLCBza2lwV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGN1cnJ5LCBwaWNrLCBwYXJ0aWFsUmlnaHQsIG1hcE9iakluZGV4ZWQsIGFwcGx5LCBtYXAgYXMgck1hcCB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZS5qcydcblxuZXhwb3J0IGNsYXNzIFNweW5lQ2hhbm5lbFdpbmRvdyBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxXaW5kb3dcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBUaGUgV2luZG93IENoYW5uZWwgd2lsbCBsaXN0ZW4gdG8gd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMgdGhhdCBhcmUgc2V0IGluIGl0cyBjb25maWd1cmF0aW9uIGZpbGVcbiAgICogPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZSBtb2RhbC1idG4nICBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS12YWx1ZT0nd2luZG93RXZlbnRzJz5WaWV3IFdpbmRvdyBFdmVudHM8L2Rpdj48L2JyPjwvYnI+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gQ0hBTk5FTF9OQU1FXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbmZpZyAtID0ge307IFRoZSBjb25maWcgaGFzIHNldmVyYWwgb3B0aW9ucyB1c2VkIHRvIGxpc3RlbiB0byB3aW5kb3cgYW5kIGRvY3VtZW50IGV2ZW50cy5cbiAgICogQHByb3BlcnR5IHtBcnJheX0gY29uZmlnLmV2ZW50cyAtID0gW107IEFueSB3aW5kb3cgYW5kIGRvY3VtZW50IGV2ZW50cyBjYW4gYmUgYWRkZWQgaGVyZS5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbmZpZy5tZWRpYVF1ZXJpZXMgLSA9IHt9OyBNZWRpYSBxdWVyaWVzIGFyZSBhZGRlZCBhcyBrZXksdmFsdWUgcGFpcnM7IHRoZSBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIGJvb2xlYW4gZm9yIHRoZSBxdWVyeSwgdGhlIHZhbHVlIGlzIHRoZSBxdWVyeSBpdHNlbGYuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmxpc3RlbkZvclJlc2l6ZSAtID0gdHJ1ZTsgVGhpcyBpcyBkZWZhdWx0IGxpc3RlbmluZyBmb3IgcmVzaXplIGV2ZW50LlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5saXN0ZW5Gb3JPcmllbnRhdGlvbiAtID0gdHJ1ZTsgTGlzdGVuIGZvciBob3Jpem9udGFsIGFuZCBsYW5kc2NhcGUgb3JpZW50YXRpb24gY2hhbmdlcyBvbiBtb2JpbGUgZGV2aWNlcy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcubGlzdGVuRm9yTW91c2VXaGVlbCAtID0gZmFsc2U7IElmIHNldCB0byB0cnVlLCB3aWxsIGxpc3RlbiBmb3IgbW91c2VXaGVlbCBhbmQgd2lsbCBhZGQgZGlyZWN0aW9uIGFuZCBkaXN0YW5jZSBwYXJhbWV0ZXJzLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclJlc2l6ZSAtID0gMjAwOyBUaGUgdGltZSBiZXR3ZWVuIHJlc2l6ZSBldmVudHMgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclNjcm9sbCAtID0gMTUwOyBUaGUgdGltZSBiZXR3ZWVuIHNjcm9sbCBldmVudHMgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9XSU5ET1cnO1xuICAgKlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoQ0hBTk5FTF9OQU1FID0gJ0NIQU5ORUxfV0lORE9XJykge1xuICAgIHN1cGVyKENIQU5ORUxfTkFNRSlcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzKClcbiAgICB0aGlzLmN1cnJlbnRTY3JvbGxZID0gMFxuICB9XG5cbiAgaW5pdGlhbGl6ZVN0cmVhbSgpIHtcbiAgICB0aGlzLmRvbUNoYW5uZWxDb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLldJTkRPV1xuICAgIGNvbnN0IG9icyRBcnIgPSB0aGlzLmdldEFjdGl2ZU9ic2VydmFibGVzKClcbiAgICBjb25zdCBkb20kID0gbWVyZ2UoLi4ub2JzJEFycilcbiAgICB0aGlzLmRvbSQgPSBkb20kXG4gICAgZG9tJC5zdWJzY3JpYmUocCA9PiB7XG4gICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyBnZXRNb3VzZVdoZWVsTWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX1dIRUVMX0VWRU5UXG4gICAgY29uc3Qgc2Nyb2xsRGlyID0gZXZlbnQuZGVsdGFZIDw9IDAgPyAndXAnIDogJ2Rvd24nXG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSwgZGVsdGFaIH0gPSBldmVudFxuICAgIGNvbnN0IHBheWxvYWQgPSB7IHNjcm9sbERpciwgZGVsdGFYLCBkZWx0YVksIGRlbHRhWiB9XG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVDdXJyaWVkR2VuZXJpY0V2ZW50KGFjdGlvblN0cikge1xuICAgIGNvbnN0IGFjdGlvbiA9IGBDSEFOTkVMX1dJTkRPV18ke2FjdGlvblN0ci50b1VwcGVyQ2FzZSgpfV9FVkVOVGBcbiAgICBjb25zdCBjdXJyeUZuID0gY3VycnkoU3B5bmVDaGFubmVsV2luZG93Lm1hcEdlbmVyaWNFdmVudClcbiAgICByZXR1cm4gY3VycnlGbihhY3Rpb24pXG4gIH1cblxuICBzdGF0aWMgbWFwR2VuZXJpY0V2ZW50KGFjdG4sIGV2ZW50KSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJtYXAgZ2VuZXJpYyBldmVudCBcIixhY3RuKTtcbiAgICBjb25zdCBhY3Rpb24gPSBhY3RuXG4gICAgY29uc3QgcGF5bG9hZCA9IGV2ZW50XG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSZXNpemVNYXBGbihldmVudCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soXG4gICAgICBbJ2lubmVyV2lkdGgnLCAnaW5uZXJIZWlnaHQnLCAnb3V0ZXJXaWR0aCcsICdvdXRlckhlaWdodCddLCB3aW5kb3cpXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRPcmllbnRhdGlvbk1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19PUklFTlRBVElPTl9FVkVOVFxuICAgIGNvbnN0IG9yaWVudGF0aW9uU3RyID0gJyhvcmllbnRhdGlvbjogcG9ydHJhaXQpJ1xuICAgIGNvbnN0IGlzUG9ydHJhaXRCb29sID0gd2luZG93Lm1hdGNoTWVkaWEob3JpZW50YXRpb25TdHIpLm1hdGNoZXNcbiAgICBjb25zdCBwYXlsb2FkID0gcGljayhcbiAgICAgIFsnaW5uZXJXaWR0aCcsICdpbm5lckhlaWdodCcsICdvdXRlcldpZHRoJywgJ291dGVySGVpZ2h0J10sIHdpbmRvdylcbiAgICBwYXlsb2FkLm9yaWVudGF0aW9uID0gaXNQb3J0cmFpdEJvb2wgPT09IHRydWVcbiAgICAgID8gJ3BvcnRyYWl0J1xuICAgICAgOiAnbGFuZHNjYXBlJ1xuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBnZXRNZWRpYVF1ZXJ5TWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX01FRElBX1FVRVJZX0VWRU5UXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soWydtYXRjaGVzJywgJ21lZGlhJywgJ21lZGlhUXVlcnlOYW1lJ10sIGV2ZW50KVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBjcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZShjb25maWcpIHtcbiAgICBjb25zdCBkZWJvdW5jZVQgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGxcblxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KCd3aGVlbCcsXG4gICAgICBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0TW91c2VXaGVlbE1hcEZuLmJpbmQodGhpcykpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKGRlYm91bmNlVClcbiAgICAgIClcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxEYXRhKCkge1xuICAgIGxldCBjdXJyZW50U2Nyb2xsWSA9IDBcblxuICAgIGNvbnN0IGdldFNjcm9sbERhdGEgPSAoc2Nyb2xsWSkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsRGlzdGFuY2UgPSBjdXJyZW50U2Nyb2xsWSAtIHNjcm9sbFlcbiAgICAgIGNvbnN0IHNjcm9sbERpciA9IHNjcm9sbERpc3RhbmNlID49IDAgPyAndXAnIDogJ2Rvd24nXG4gICAgICBjdXJyZW50U2Nyb2xsWSA9IHNjcm9sbFlcbiAgICAgIHJldHVybiB7IHNjcm9sbFksIHNjcm9sbERpc3RhbmNlLCBzY3JvbGxEaXIgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0U2Nyb2xsRGF0YVxuICB9XG5cbiAgc3RhdGljIGdldFNjcm9sbFkoc2Nyb2xsRWxlbWVudCkge1xuICAgIHJldHVybiBzY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0ICE9PSB1bmRlZmluZWQgPyBzY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0IDogc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3BcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxNYXBGbihldmVudCwgaW50ZXJ2YWwsIGFjdGlvbiwgc2Nyb2xsRGF0YUZuLCBzY3JvbGxFbGVtZW50KSB7XG4gICAgY29uc3Qgc2Nyb2xsWSA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxZKHNjcm9sbEVsZW1lbnQpXG4gICAgY29uc3QgcGF5bG9hZCA9IHNjcm9sbERhdGFGbihzY3JvbGxZKVxuICAgIGNvbnN0IHsgc2Nyb2xsRGlzdGFuY2UgfSA9IHBheWxvYWRcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgc2Nyb2xsRGlzdGFuY2UsIGV2ZW50IH1cbiAgfVxuXG4gIGNyZWF0ZVNjcm9sbE9ic2VydmFibGUoY29uZmlnLCBzY3JvbGxFbGVtZW50ID0gd2luZG93LCBpc1Bhc3NpdmUgPSB0cnVlKSB7XG4gICAgY29uc3Qgc2tpcFdoZW5EaXJJc01pc3NpbmcgPSBldnQgPT4gZXZ0LnNjcm9sbERpc3RhbmNlID09PSAwXG4gICAgY29uc3QgZFRpbWUgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGxcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBzY3JvbGxFbGVtZW50XG5cbiAgICBjb25zdCBpc1dpbmRvdyA9IHNjcm9sbEVsZW1lbnQgPT09IHdpbmRvd1xuXG4gICAgY29uc3Qgc2Nyb2xsRWxGb3JWYWxzID0gY29uZmlnLnNjcm9sbEVsRm9yVmFscyAhPT0gdW5kZWZpbmVkID8gY29uZmlnLnNjcm9sbEVsRm9yVmFscyA6IHNjcm9sbEVsZW1lbnRcbiAgICBjb25zdCBhY3Rpb24gPSBpc1dpbmRvdyA/ICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRVZFTlQnIDogJ0NIQU5ORUxfV0lORE9XX0VMRU1FTlRfU0NST0xMX0VWRU5UJ1xuXG4gICAgY29uc3Qgc2Nyb2xsRGF0YUZuID0gU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbERhdGEoKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiU0NST0xMIEVMRU1FTlQgXCIsYWN0aW9uLHNjcm9sbEVsZW1lbnQsIHNjcm9sbEVsRm9yVmFscyk7XG4gICAgY29uc3Qgc2Nyb2xsTWFwRm4gPSBwYXJ0aWFsUmlnaHQoU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbE1hcEZuLCBbYWN0aW9uLCBzY3JvbGxEYXRhRm4sIHNjcm9sbEVsRm9yVmFscywgaXNQYXNzaXZlLCBlbGVtZW50XSkuYmluZCh0aGlzKVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJjcmVhdGVTY3JvbGxPYnNlcnZhYmxlIFwiLCB7c2Nyb2xsTWFwRm4sIHNjcm9sbERhdGFGbiwgYWN0aW9uLCBjb25maWcsIHNjcm9sbEVsZW1lbnQsIGVsZW1lbnR9KVxuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ3Njcm9sbCcsXG4gICAgICBzY3JvbGxNYXBGbiwgaXNQYXNzaXZlLCBlbGVtZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZShkVGltZSksXG4gICAgICAgIHNraXBXaGlsZShza2lwV2hlbkRpcklzTWlzc2luZyksXG4gICAgICAgIG1hcChwID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdTY3JvbGxZID0gU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbFkoZWxlbWVudClcbiAgICAgICAgICBwLnBheWxvYWQuc2Nyb2xsRGlzdGFuY2VBYnMgPSBNYXRoLmFicyh0aGlzLmN1cnJlbnRTY3JvbGxZIC0gbmV3U2Nyb2xsWSlcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTY3JvbGxZID0gbmV3U2Nyb2xsWVxuICAgICAgICAgIHJldHVybiBwXG4gICAgICAgIH0pXG4gICAgICApXG4gIH1cblxuICBjcmVhdGVPcmllbnRhdGlvbk9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJhZGQgb3JpZW50YXRpb25cIik7b3JpZW50YXRpb25jaGFuZ2VcbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgnb3JpZW50YXRpb25jaGFuZ2UnLFxuICAgICAgU3B5bmVDaGFubmVsV2luZG93LmdldE9yaWVudGF0aW9uTWFwRm4uYmluZCh0aGlzKSlcbiAgfVxuXG4gIGNyZWF0ZVJlc2l6ZU9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgZFRpbWUgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JSZXNpemVcbiAgICAvLyBjb25zb2xlLmxvZygncmVzaXplIHRoaXMgJywgdGhpcyk7XG5cbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgncmVzaXplJyxcbiAgICAgIFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRSZXNpemVNYXBGbi5iaW5kKHRoaXMpKS5waXBlKGRlYm91bmNlVGltZShkVGltZSkpXG4gIH1cblxuICBnZXRFdmVudHNGcm9tQ29uZmlnKGNvbmZpZyA9IHRoaXMuZG9tQ2hhbm5lbENvbmZpZykge1xuICAgIGNvbnN0IG9icyRBcnIgPSBjb25maWcuZXZlbnRzXG5cbiAgICBjb25zdCBhZGRXaW5kb3dFdmVudFRvQXJyID0gc3RyID0+IHtcbiAgICAgIGNvbnN0IG1hcEZuID0gU3B5bmVDaGFubmVsV2luZG93LmNyZWF0ZUN1cnJpZWRHZW5lcmljRXZlbnQoc3RyKVxuICAgICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoc3RyLCBtYXBGbilcbiAgICB9XG5cbiAgICByZXR1cm4gck1hcChhZGRXaW5kb3dFdmVudFRvQXJyLCBvYnMkQXJyKVxuICB9XG5cbiAgZ2V0QWN0aXZlT2JzZXJ2YWJsZXMoY29uZmlnID0gdGhpcy5kb21DaGFubmVsQ29uZmlnKSB7XG4gICAgbGV0IG9icyRBcnIgPSBbXVxuXG4gICAgLy8gQ0hFQ0sgVE8gQUREIE1FRElBIFFVRVJZIE9CU0VSVkFCTEVcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25maWcubGlzdGVuRm9yTWVkaWFRdWVyaWVzID0gY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbChcbiAgICAgIGNvbmZpZy5tZWRpYVF1ZXJpZXMpIHx8IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwoXG4gICAgICBjb25maWcubWVkaWFRdWVyaWVzKVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIGNvbnN0IG1ldGhvZHMgPSB7XG4gICAgICBsaXN0ZW5Gb3JSZXNpemU6IHRoaXMuY3JlYXRlUmVzaXplT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yT3JpZW50YXRpb246IHRoaXMuY3JlYXRlT3JpZW50YXRpb25PYnNlcnZhYmxlLmJpbmQodGhpcyksXG4gICAgICBsaXN0ZW5Gb3JTY3JvbGw6IHRoaXMuY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yV2hlZWw6IHRoaXMuY3JlYXRlTW91c2VXaGVlbE9ic2VydmFibGUuYmluZCh0aGlzKVxuICAgIH1cblxuICAgIGNvbnN0IGFkZE9ic2VydmFibGVUb0FyciA9IChtZXRob2QsIGtleSwgaSkgPT4ge1xuICAgICAgY29uc3QgYWRkT2JzQm9vbCA9IGNvbmZpZ1trZXldXG4gICAgICBpZiAoYWRkT2JzQm9vbCkge1xuICAgICAgICBvYnMkQXJyLnB1c2gobWV0aG9kKGNvbmZpZykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgbWFwT2JqSW5kZXhlZChhZGRPYnNlcnZhYmxlVG9BcnIsIG1ldGhvZHMpXG5cbiAgICAvLyAnbGlzdGVuRm9yTWVkaWFRdWVyaWVzJyA6IHRoaXMuZ2V0TWVkaWFRdWVyeU9ic2VydmFibGUuYmluZCh0aGlzKVxuICAgIHRoaXMuY2hlY2tGb3JNZWRpYVF1ZXJpZXMoY29uZmlnLmxpc3RlbkZvck1lZGlhUXVlcmllcylcblxuICAgIGNvbnN0IGV2ZW50c0FyciA9IHRoaXMuZ2V0RXZlbnRzRnJvbUNvbmZpZyhjb25maWcpXG4gICAgb2JzJEFyciA9IG9icyRBcnIuY29uY2F0KGV2ZW50c0FycilcblxuICAgIHJldHVybiBvYnMkQXJyXG4gIH1cblxuICBjaGVja0Zvck1lZGlhUXVlcmllcyhib29sKSB7XG4gICAgY29uc3Qgc2VuZE1RU3RyZWFtID0gcCA9PiB7XG4gICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIkKVxuICAgIH1cblxuICAgIGlmIChib29sID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmdldE1lZGlhUXVlcnlPYnNlcnZhYmxlKHRoaXMuZG9tQ2hhbm5lbENvbmZpZylcbiAgICAgICAgLnN1YnNjcmliZShzZW5kTVFTdHJlYW0pXG4gICAgfVxuICB9XG5cbiAgZ2V0TWVkaWFRdWVyeU9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgYXJyID0gdGhpcy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqKGNvbmZpZylcbiAgICAvLyBjb25zb2xlLmxvZyhcIkFSUiBJUyBcIix7YXJyfSk7XG4gICAgY29uc3Qgb2JzJCA9IGFwcGx5KG1lcmdlLCBhcnIpXG4gICAgcmV0dXJuIG9icyQucGlwZShtYXAodGhpcy5nZXRNZWRpYVF1ZXJ5TWFwRm4uYmluZCh0aGlzKSkpXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FCT1JUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BRlRFUlBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BTklNQVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FOSU1BVElPTklURVJBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQU5JTUFUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FQUElOU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkVGT1JFUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFRk9SRVVOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkVHSU5FVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkxVUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0FDSEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DTE9TRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09NUE9TSVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9OVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT1BZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RCTENMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRUxJR0hUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VNT1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRU9SSUVOVEFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VQUk9YSU1JVFlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUFUVFJJQlVURU5BTUVDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01BVFRSTU9ESUZJRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNIQVJBQ1RFUkRBVEFNT0RJRklFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQ09OVEVOVExPQURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQ09OVEVOVExPQURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NRUxFTUVOVE5BTUVDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHRU5URVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR09WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJPUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRUxFTUVOVF9TQ1JPTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19GT0NVU0lOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19GT0NVU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRlVMTFNDUkVFTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRlVMTFNDUkVFTkVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19IQVNIQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19JTlBVVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSU5WQUxJRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfS0VZRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfS0VZUFJFU1NfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NRURJQV9RVUVSWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTUVTU0FHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRUVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRUxFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU1PVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFV0hFRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09GRkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09OTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfT1BFTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfT1JJRU5UQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BBR0VISURFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QQUdFU0hPV19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUEFTVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BPUFNUQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUFJPR1JFU1NFVkVOVFNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1JFU0VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19SRVNJWkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9FTEVNRU5UX0FEREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9MT0NLX0VWRU5UJyxcbiAgICAgIFsnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0xPQ0tfRVZFTlQnLCAnb25TY3JvbGxMb2NrRXZlbnQnXSxcbiAgICAgIFsnQ0hBTk5FTF9XSU5ET1dfU0VUX0VMRU1FTlRfVE9fU0NST0xMX0VWRU5UJywgJ29uU2V0RWxlbWVudFRvU2Nyb2xsJ10sXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU1RPUkFHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU1VCTUlUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9OUlVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1VOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfV0hFRUxfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgb25TY3JvbGxMb2NrRXZlbnQoZSkge1xuICAgIC8vIERFUFJFQ0FURUQgLS0gTU9WRUQgVE8gc3B5bmUtcGx1Z2luLXNjcm9sbC1sb2NrO1xuICB9XG5cbiAgb25TZXRFbGVtZW50VG9TY3JvbGwoZSkge1xuICAgIGxldCB7IGNvbmZpZywgZWwsIHNjcm9sbEVsZW1lbnQgfSA9IGUucGF5bG9hZFxuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fVxuICAgIGNvbmZpZyA9IGRlZXBNZXJnZSh0aGlzLmRvbUNoYW5uZWxDb25maWcsIGNvbmZpZylcblxuICAgIHNjcm9sbEVsZW1lbnQgPSBzY3JvbGxFbGVtZW50IHx8IGVsXG5cbiAgICBjb25zdCBhY3Rpb24gPSAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VMRU1FTlRfQURERURfRVZFTlQnXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCB7IGVsIH0sIGVsKVxuXG4gICAgdGhpcy5jcmVhdGVTY3JvbGxPYnNlcnZhYmxlKGNvbmZpZywgc2Nyb2xsRWxlbWVudClcbiAgICAgIC5zdWJzY3JpYmUocCA9PiB7XG4gICAgICAgIGNvbnN0IHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gcFxuICAgICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgICAgfSlcbiAgfVxuXG4gIGJpbmRTdGF0aWNNZXRob2RzKCkge1xuICAgIHRoaXMuY3JlYXRlTWVkaWFRdWVyeUhhbmRsZXIgPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlci5iaW5kKFxuICAgICAgdGhpcylcbiAgICB0aGlzLmNyZWF0ZU1lcmdlZE9ic0Zyb21PYmogPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqLmJpbmQoXG4gICAgICB0aGlzKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsc01hcCB9IGZyb20gJy4vY2hhbm5lbHMvY2hhbm5lbHMtbWFwLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbSB9IGZyb20gJy4vdmlld3Mvdmlldy1zdHJlYW0uanMnXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IHNhbml0aXplSFRNTENvbmZpZ3VyZSB9IGZyb20gJy4vdXRpbHMvc2FuaXRpemUtaHRtbC5qcydcbmltcG9ydCB7IHNhbml0aXplRGF0YUNvbmZpZ3VyZSB9IGZyb20gJy4vdXRpbHMvc2FuaXRpemUtZGF0YS5qcydcblxuY29uc3QgX2NoYW5uZWxzID0gbmV3IENoYW5uZWxzTWFwKClcbmNvbnN0IHZlcnNpb24gPSAnMC4yNC4wJ1xuXG5jbGFzcyBTcHluZUFwcGxpY2F0aW9uIHtcbiAgLyoqXG4gICAqXG4gICAqIFNweW5lQXBwIGNyZWF0ZXMgdGhlIGdsb2JhbCBTcHluZSBvYmplY3QsIGFuZCBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgaXRlbXNcbiAgICogPHVsPlxuICAgKlxuICAgKiA8bGk+TElOS1snQ2hhbm5lbHNNYXAnLCAnY2hhbm5lbHMtY29udHJvbGxlciddIHRoYXQgZGlyZWN0cyB0aGUgZmxvdyBvZiBkYXRhIHRvIGFsbCBDaGFubmVsczwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxVSScsICdzcHluZS1jaGFubmVsLXUtaSddLCB0aGF0IGJyb2FkY2FzdCBhbGwgdXNlciBpbnRlcmFjdGlvbiBldmVudHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsUm91dGUnLCAnc3B5bmUtY2hhbm5lbC1yb3V0ZSddLCB0aGF0IGJyb2FkY2FzdCB3aW5kb3cgbG9jYXRpb24gY2hhbmdlcyBhbmQgaXMgdGhlIG9ubHkgb3RoZXIgY2hhbm5lbCB0aGF0IGNhbiBiZSBib3VuZCB0byB1c2VyIGV2ZW50czwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxXaW5kb3cnLCAnc3B5bmUtY2hhbm5lbC13aW5kb3cnXSwgdGhhdCBicm9hZGNhc3QgYWxsIHJlcXVlc3RlZCB3aW5kb3cgYW5kIGRvY3VtZW50IGV2ZW50cywgc3VjaCBhcyBzY3JvbGxpbmcsIHJlc2l6aW5nIGFuZCBtZWRpYSBxdWVyaWVzPC9saT5cbiAgICogPGxpPkxJTktbJ1NweW5lQ2hhbm5lbExpZmVjeWNsZScsICdzcHluZS1jaGFubmVsLWxpZmVjeWNsZSddLCB0aGF0IGJyb2FkY2FzdHMgcmVuZGVyaW5nIGFuZCByZW1vdmluZyBvZiBWaWV3U3RyZWFtIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGRpcmVjdGVkIHRvIGJyb2FkY2FzdCB0aGVpciBsaWZlY3ljbGUgZXZlbnRzPC9saT5cbiAgICogPC91bD5cbiAgICpcbiAgICpcbiAgICogQG1vZHVsZSBTcHluZUFwcFxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcgLSA9IHt9OyBUaGlzIGdsb2JhbCBjb25maWcgb2JqZWN0IGlzIG1haW5seSB1c2VkIHRvIHByb3ZpZGUgY29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciB0d28gU3B5bmVDaGFubmVscywgQ0hBTk5FTF9ST1VURSBhbmQgQ0hBTk5FTF9XSU5ET1cuXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb25cbiAgfVxuXG4gIGdldCBjaGFubmVscygpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzXG4gIH1cblxuICBpbml0KGNvbmZpZyA9IHt9LCB0ZXN0TW9kZSA9IGZhbHNlKSB7XG4gICAgLy8gdGhpcy5jaGFubmVscyA9IG5ldyBDaGFubmVsc01hcCgpO1xuICAgIC8qIVxuICAgICAqIFNweW5lIDAuMjQuMFxuICAgICAqIGh0dHBzOi8vc3B5bmVqcy5vcmdcbiAgICAgKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IDIwMTctMjAyNSwgRnJhbmsgQmF0aXN0YSxcbiAgICAgKiBSZWxldmFudCBDb250ZXh0LCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgICogWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgICAqIEEgY29weSBvZiB0aGUgTGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSBwcm9qZWN0IHJvb3QsIG9yIGF0OlxuICAgICAqIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGdwbC0zLjAuaHRtbFxuICAgICAqXG4gICAgICogVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgZGlzdHJpYnV0aW9uLlxuICAgICAqL1xuICAgIC8qIGVzbGludC1kaXNhYmxlICovXG5cbiAgICBpZihTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IHRydWUpe1xuICAgICAgaWYgKHRlc3RNb2RlKXtcbiAgICAgICAgcmV0dXJuICdUaGUgU3B5bmUgQXBwbGljYXRpb24gaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCEnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdUaGUgU3B5bmUgQXBwbGljYXRpb24gaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCEnKTtcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vY29uc3QgaW1nUGF0aCA9IElNR19QQVRIIHx8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbWdQYXRoID0gKHR5cGVvZiBJTUdfUEFUSCAhPT0gJ3VuZGVmaW5lZCcpID8gSU1HX1BBVEggOiB1bmRlZmluZWQ7XG4gICAgbGV0IGRlZmF1bHRDb25maWcgPSB7XG4gICAgICBzY3JvbGxMb2NrOiBmYWxzZSxcbiAgICAgIHNjcm9sbExvY2tYOiAzMSxcbiAgICAgIHNjcm9sbExvY2tZOiAwLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgc3RyaWN0OiBmYWxzZSxcbiAgICAgIG1vZGU6ICdhcHAnLFxuICAgICAgZGlzYWJsZVNhbml0aXplOiBmYWxzZSxcbiAgICAgIGlmcmFtZXM6IHt9LFxuICAgICAgYmFzZUhyZWY6IHVuZGVmaW5lZCxcbiAgICAgIElNR19QQVRIOiBpbWdQYXRoLFxuICAgICAgcGx1Z2luTWV0aG9kczp7XG5cbiAgICAgIH0sXG4gICAgICBwbHVnaW5zOntcblxuICAgICAgfSxcbiAgICAgIHRtcDoge30sXG4gICAgICBlcGhlbWVyYWxQcm9wczoge30sXG4gICAgICB0bXBQcm9wczoge30sXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICBXSU5ET1c6IHtcbiAgICAgICAgICBtZWRpYVF1ZXJpZXM6IHtcblxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgICAgICBsaXN0ZW5Gb3JSZXNpemU6IHRydWUsXG4gICAgICAgICAgbGlzdGVuRm9yT3JpZW50YXRpb246IHRydWUsXG4gICAgICAgICAgbGlzdGVuRm9yU2Nyb2xsOiBmYWxzZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JNb3VzZVdoZWVsOiBmYWxzZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JXaGVlbDogZmFsc2UsXG4gICAgICAgICAgZGVib3VuY2VNU1RpbWVGb3JSZXNpemU6IDIwMCxcbiAgICAgICAgICBkZWJvdW5jZU1TVGltZUZvclNjcm9sbDogMTUwXG4gICAgICAgIH0sXG5cbiAgICAgICAgUk9VVEU6IHtcbiAgICAgICAgICB0eXBlOiAnc2xhc2gnLFxuICAgICAgICAgIGlzSGFzaDogZmFsc2UsXG4gICAgICAgICAgaXNIaWRkZW46IGZhbHNlLFxuICAgICAgICAgIGFkZDQwNHM6IGZhbHNlLFxuICAgICAgICAgIHJvdXRlczoge1xuICAgICAgICAgICAgJ3JvdXRlUGF0aCcgOiB7XG4gICAgICAgICAgICAgICdyb3V0ZU5hbWUnIDogJ2NoYW5nZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKGNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByb3V0ZVV0aWxzID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZTtcbiAgICAgICBjb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZShkZWZhdWx0Q29uZmlnLCBjb25maWcsIF9jaGFubmVscywgcm91dGVVdGlscyk7XG4gICAgICAgLy9jb25zb2xlLmxvZyhcIlNQWU5FIEFQUCBQUk9QUyBcIixTcHluZUFwcFByb3BlcnRpZXMpO1xuICAgICAgLy93aW5kb3cuU3B5bmUgPSB0aGlzO1xuICAgICAgLy93aW5kb3cuU3B5bmVbJ2NvbmZpZyddID0gZGVlcE1lcmdlKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgICB9XG4gICAgdGhpcy5wbHVnaW5zRm4gPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0UGx1Z2luc01ldGhvZE9iaihjb25maWdbJ3BsdWdpbk1ldGhvZHMnXSk7XG4gICAgdGhpcy5nZXRDaGFubmVsQWN0aW9ucyA9IChzdHIpID0+IF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpO1xuICAgIHRoaXMucmVnaXN0ZXJDaGFubmVsID0gKHZhbCkgPT4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKHZhbCk7XG4gICAgdGhpcy5yZWdpc3RlclBsdWdpbiA9IChwbHVnaW5JbnN0YW5jZSkgPT4gU3B5bmVBcHBQcm9wZXJ0aWVzLnJlZ2lzdGVyUGx1Z2luKHBsdWdpbkluc3RhbmNlKTtcbiAgICB0aGlzLnJlZ2lzdGVyRGF0YUNoYW5uZWwgPSAob2JzJCkgPT4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKG9icyQpO1xuICAgIHRoaXMubGlzdENoYW5uZWxzID0gKCkgPT4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSk7XG4gICAgbGV0IG51bGxIb2xkZXIgPSBuZXcgVmlld1N0cmVhbSh7IGlkOidzcHluZS1udWxsLXZpZXdzJyB9KTtcbiAgICBudWxsSG9sZGVyLmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgIG51bGxIb2xkZXIucHJvcHMuZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5Om5vbmU7IG9wYWNpdHk6MDsgcG9pbnRlci1ldmVudHM6bm9uZTsnO1xuICAgIF9jaGFubmVscy5pbml0KCk7XG5cbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5kZWJ1Zz09PXRydWUpe1xuICAgICAgIHdpbmRvdy5TcHluZSA9IHt2ZXJzaW9ufTtcbiAgICB9XG5cbiAgICBzYW5pdGl6ZUhUTUxDb25maWd1cmUoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZyk7XG4gICAgc2FuaXRpemVEYXRhQ29uZmlndXJlKFNweW5lQXBwUHJvcGVydGllcy5jb25maWcpO1xuXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBtb3N0bHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+TGlzdGluZyB0aGUgcmVnaXN0ZXJlZWQgQ2hhbm5lbHMgaW4gdGhlIGJyb3dzZXIgY29uc29sZTwvaDQ+J11cbiAgICogU3B5bmVBcHAubGlzdENoYW5uZWxzKCk7XG4gICAqXG4gICAqIEByZXR1cm5zIEEgbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCBjaGFubmVsc1xuICAgKi9cbiAgc3RhdGljIGxpc3RDaGFubmVscygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGNoZWNrIGluIHRoZSBjb25zb2xlIG9yIGluIHRoZSBjb2RlIHdoYXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGJlIGxpc3RlbmVkIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQW4gYXJyYXkgb2YgQWN0aW9ucyB0aGF0IGNhbiBiZSBsaXN0ZW5lZCB0b1xuICAgKi9cbiAgc3RhdGljIGdldENoYW5uZWxBY3Rpb25zKHN0cikge1xuICAgIHJldHVybiBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFkZCB0aGUgY2hhbm5lbCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0IHNvIHRoYXQgaXQgY2FuIHN1YnNjcmliZWQgYnkgYWxsIFZpZXdTdHJlYW0gYW5kIENoYW5uZWwgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0ge0NoYW5uZWx9IGNcbiAgICpcbiAgICpcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckNoYW5uZWwoYykge1xuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NweW5lIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKGMpO1xuICAgIH1cbiAgfVxufVxuXG5cbmV4cG9ydCBsZXQgU3B5bmVBcHAgPSBuZXcgU3B5bmVBcHBsaWNhdGlvbigpO1xuIiwiaW1wb3J0IHsgRG9tRWxlbWVudCB9IGZyb20gJy4vdmlld3MvZG9tLWVsZW1lbnQuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgaXMsIGNsb25lLCBwYXRoU2F0aXNmaWVzIH0gZnJvbSAncmFtZGEnXG5sZXQgX3NweW5lQXBwUHJvcHMgPSBTcHluZUFwcFByb3BlcnRpZXNcbmV4cG9ydCBjbGFzcyBTcHluZVBsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30pIHtcbiAgICBsZXQgeyBuYW1lLCBjb25maWcsIHBhcmVudEVsIH0gPSBwcm9wc1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcgPSBjbG9uZShwcm9wcylcbiAgICB9XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lIHx8ICdlbXB0eSdcbiAgICB0aGlzLnByb3BzLm5hbWUgPSBuYW1lXG4gICAgY29uZmlnID0gU3B5bmVQbHVnaW4ubWVyZ2VEZWZhdWx0Q29uZmlnKGNvbmZpZywgdGhpcy5kZWZhdWx0Q29uZmlnKCkpXG4gICAgdGhpcy5wcm9wcy5wYXJlbnRFbCA9IHBhcmVudEVsIHx8IFNweW5lUGx1Z2luLmNyZWF0ZVBhcmVudEVsKClcbiAgICAvLyBTcHluZVBsdWdpbi5nZXRTcHluZUFwcChuYW1lLCBjb25maWcpXG4gICAgdGhpcy5wcm9wcy5jb25maWcgPSBjb25maWdcbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hZGRUcmFpdHModGhpcy5wcm9wcy50cmFpdHMpXG4gICAgfVxuXG4gICAgLy8gdGhpcy5vbkJlZm9yZVJlZ2lzdGVyZWQoKVxuICAgIC8vIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICAvLyB0aGlzLm9uUmVuZGVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3cgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYXBwIGRlY2lkZXMgdG8gcmVnaXN0ZXIgdGhlIHBsdWdpbi5cbiAgICogVGhpcyB3YXksIHRoZSBwbHVnaW4gbm8gbG9uZ2VyIGhhcyB0byBpbXBvcnQgb3IgcmVseSBvbiBpdHMgb3duIHZlcnNpb25cbiAgICogb2YgU3B5bmVBcHBQcm9wZXJ0aWVzLiBJbnN0ZWFkLCBpdCBpcyAqcGFzc2VkKiB0aGUgYXV0aG9yaXRhdGl2ZSBpbnN0YW5jZS5cbiAgICovXG4gIHJlZ2lzdGVyKHNweW5lQXBwUHJvcHMpIHtcbiAgICAvLyAxLiBTYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSByZWFsIFNweW5lQXBwUHJvcGVydGllc1xuICAgIF9zcHluZUFwcFByb3BzID0gc3B5bmVBcHBQcm9wc1xuICAgIHRoaXMucHJvcHMucGx1Z2luTmFtZSA9IHRoaXMucHJvcHMubmFtZVxuXG4gICAgLy8gdGhpcy5wcm9wcy5jb25maWcgPSBfc3B5bmVBcHBQcm9wcy5nZXRQbHVnaW5Db25maWdCeVBsdWdpbk5hbWUodGhpcy5wcm9wcy5wbHVnaW5OYW1lKVxuXG4gICAgaWYgKF9zcHluZUFwcFByb3BzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBTcHluZSBXYXJuaW5nOiBTcHluZUFwcCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0ISBDYW5ub3QgcmVnaXN0ZXIgcGx1Z2luIFwiJHt0aGlzLm5hbWV9XCIuYFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5vbkJlZm9yZVJlZ2lzdGVyZWQoKVxuXG4gICAgLy8gMi4gQWRkIHBsdWdpbiBjb25maWcgaW4gdGhlIHJlYWwgU3B5bmVBcHBQcm9wZXJ0aWVzXG4gICAgdGhpcy5wcm9wcy5jb25maWcgPSBjbG9uZSh0aGlzLnByb3BzLmNvbmZpZylcbiAgICBfc3B5bmVBcHBQcm9wcy5hZGRQbHVnaW5Db25maWcodGhpcy5uYW1lLCB0aGlzLnByb3BzLmNvbmZpZylcblxuICAgIC8vIElmIHlvdSBoYXZlIHBsdWdpbi1sZXZlbCBsb2dpYyB0aGF0IGRlcGVuZHMgb24gdGhlIHJlYWwgc3B5bmVBcHAsXG4gICAgLy8geW91IGNhbiBhZGQgaXQgaGVyZSwgZS5nLjpcbiAgICAvLyBzcHluZUFwcFByb3BzLmFkZFBsdWdpbk1ldGhvZHModGhpcy5wcm9wcy5jb25maWcucGx1Z2luTWV0aG9kcylcblxuICAgIC8vIDMuIElmIHlvdSBoYXZlIG90aGVyIHBsdWdpbiBsaWZlY3ljbGUgbWV0aG9kc1xuICAgIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICB0aGlzLm9uUmVuZGVyKClcbiAgfVxuXG4gIGdldCBTcHluZUFwcFByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIF9zcHluZUFwcFByb3BzXG4gIH1cblxuICBzdGF0aWMgbWVyZ2VEZWZhdWx0Q29uZmlnKGNvbmZpZyA9IHt9LCBkZWZhdWx0Q29uZmlnID0gdGhpcy5kZWZhdWx0Q29uZmlnKCkpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gIH1cblxuICBzdGF0aWMgZ2V0U3B5bmVBcHAobmFtZSwgY29uZmlnKSB7XG4gICAgaWYgKF9zcHluZUFwcFByb3BzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBVbmFibGUgdG8gaW5zdGFsbCBwbHVnaW4sICR7bmFtZX0hIFNweW5lQXBwIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCFgKVxuICAgICAgLy8gU3B5bmVBcHAuaW5pdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIF9zcHluZUFwcFByb3BzLmFkZFBsdWdpbkNvbmZpZyhuYW1lLCBjb25maWcpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHVwZGF0ZVNweW5lQ29uZmlnKHNweW5lQXBwLCBwbHVnaW5OYW1lLCBwbHVnaW5Db25maWcpIHtcbiAgICBjb25zdCBwYXRoRXhpc3RzID0gcGF0aFNhdGlzZmllcyhpcyhPYmplY3QpLCBbJ2NvbmZpZycsICdwbHVnaW5zJywgcGx1Z2luTmFtZV0pKHNweW5lQXBwKVxuXG4gICAgaWYgKHBhdGhFeGlzdHMgPT09IHRydWUpIHtcbiAgICAgIGlmIChzcHluZUFwcC5jb25maWcuZGVidWcgPT09IHRydWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgcGx1Z2luLCAke3BsdWdpbk5hbWV9LCBhbHJlYWR5IGV4aXN0c2ApXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgc3B5bmVBcHAuY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV0gPSBwbHVnaW5Db25maWdcbiAgICByZXR1cm4gc3B5bmVBcHAuY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQYXJlbnRFbChlbCkge1xuICAgIGNvbnN0IGNyZWF0ZVBsdWdpblBhcmVudEVsID0gKCkgPT4ge1xuICAgICAgY29uc3QgcGx1Z2luRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3B5bmUtcGx1Z2lucycpXG5cbiAgICAgIGNvbnN0IGNyZWF0ZVBsdWdpbkVsID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBwbHVnaW5FbCA9IG5ldyBEb21FbGVtZW50KHtcbiAgICAgICAgICBpZDogJ3NweW5lLXBsdWdpbnMnXG4gICAgICAgIH0pXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGx1Z2luRWwucmVuZGVyKCkpXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NweW5lLXBsdWdpbnMnKVxuICAgICAgICBlbC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmFic29sdXRlOyB0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTttaW4taGVpZ2h0OjEwMHZoO3otaW5kZXg6MTAwMDAwMDsgcG9pbnRlci1ldmVudHM6bm9uZSdcbiAgICAgICAgcmV0dXJuIGVsXG4gICAgICB9XG4gICAgICByZXR1cm4gcGx1Z2luRWwgfHwgY3JlYXRlUGx1Z2luRWwoKVxuICAgIH1cblxuICAgIHJldHVybiBlbCB8fCBjcmVhdGVQbHVnaW5QYXJlbnRFbCgpXG4gIH1cblxuICBhZGRUcmFpdHModHJhaXRzKSB7XG4gICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICB0cmFpdHMgPSBbdHJhaXRzXVxuICAgIH1cbiAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFRyYWl0Q2xhc3ModGhpcylcbiAgICB9XG5cbiAgICB0cmFpdHMuZm9yRWFjaChhZGRUcmFpdClcbiAgfVxuXG4gIG9uQmVmb3JlUmVnaXN0ZXJlZCgpIHtcbiAgICAvLyB0aGlzLnByb3BzLnBsdWdpbk5hbWUgPSB0aGlzLnByb3BzLm5hbWVcbiAgICAvLyB0aGlzLnByb3BzLmNvbmZpZyA9IF9zcHluZUFwcFByb3BzLmdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZSh0aGlzLnByb3BzLnBsdWdpbk5hbWUpXG4gICAgdGhpcy5jaGVja0ZvclJlcXVpcmVkV2luZG93RXZlbnQoKVxuICB9XG5cbiAgY2hlY2tGb3JSZXF1aXJlZFdpbmRvd0V2ZW50KCkge1xuICAgIGNvbnN0IHJlcXVpcmVkRXZlbnRzID0gdGhpcy5wcm9wcy5yZXF1aXJlZEV2ZW50cyA/PyBbXVxuICAgIGNvbnN0IHdpbmRvd0NvbmZpZyA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRDaGFubmVsQ29uZmlnKCdXSU5ET1cnKVxuXG4gICAgY29uc3QgbWlzc2luZ0V2ZW50cyA9IHJlcXVpcmVkRXZlbnRzLmZpbHRlcihldnQgPT4gIXdpbmRvd0NvbmZpZy5ldmVudHMuaW5jbHVkZXMoZXZ0KSlcblxuICAgIC8vIElmIGFueSBhcmUgbWlzc2luZywgbG9nIGEgc2luZ2xlIHdhcm5pbmcgbGlzdGluZyB0aGVtXG4gICAgaWYgKG1pc3NpbmdFdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBwbHVnaW4gXCIke3RoaXMucHJvcHMubmFtZX1cIiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGNvbmZpZy5XSU5ET1cuZXZlbnRzLCAtLT4gJHttaXNzaW5nRXZlbnRzLmpvaW4oJywgJyl9IDwtLWBcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBkZWZhdWx0Q29uZmlnKCkge1xuICAgIHJldHVybiB7XG5cbiAgICB9XG4gIH1cblxuICBvblJlZ2lzdGVyZWQoKSB7XG5cbiAgfVxuXG4gIG9uUmVuZGVyKCkge1xuXG4gIH1cbn1cbiIsImltcG9ydCB7IGZyb20sIG9mIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgbWVyZ2VNYXAsIHNoYXJlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGNvbXBvc2UsIHByb3AsIGRlZmF1bHRUbywgcGljaywgbWVyZ2VEZWVwUmlnaHQgfSBmcm9tICdyYW1kYSdcbmltcG9ydCBzYW5pdGl6ZURhdGEgZnJvbSAnLi9zYW5pdGl6ZS1kYXRhLmpzJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbEZldGNoVXRpbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxGZXRjaFV0aWxcbiAgICogQHR5cGUgdXRpbFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBUaGlzIGlzIHRoZSBjb3JlIG9iamVjdCB1c2VkIGZvciBDaGFubmVsRmV0Y2guIFRoaXMgdXRpbGl0eSB3cmFwcyB0aGUgSmF2YVNjcmlwdFxuICAgKiBmZXRjaCBBUEkgaW50byBhbiBvYnNlcnZhYmxlLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgUHJvcGVydGllcyB1c2VkIHRvIGNyZWF0ZSB0aGUgZmV0Y2ggcmVxdWVzdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWJzY3JpYmVyIEEgbWV0aG9kIGFzc2lnbmVkIHRvIGxpc3RlbiB0byB0aGUgcmVzdWx0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdGVzdE1vZGUgQ29udHJvbHMgaW5pdGlhbGl6YXRpb24gZm9yIHVuaXQgdGVzdHNcbiAgICogQHBhcmFtIHtTdHJpbmd9IENIQU5ORUxfTkFNRSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCB1c2luZyB0aGlzIGZldGNoIHV0aWxcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG9wdGlvbnMudXJsIC0gVGhlIFVSTCB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5zZXJ2ZXJPcHRpb25zIC0gVGhlIHByb3BlcnRpZXMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IG9wdGlvbnMubWFwRm4gLSBBIG1ldGhvZCB0aGF0IGNhbiBwYXJzZSB0aGUgZGF0YSBiZWZvcmUgaXQgaXMgcmV0dXJuZWRcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG9wdGlvbnMucmVzcG9uc2VUeXBlIC0gRGVmYXVsdCBpcyBqc29uXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gb3B0aW9ucy5kZWJ1ZyAtIExvZ3MgZmV0Y2ggcmVzcG9uc2UgZGV0YWlscyBiZWZvcmUgb2JzZXJ2YWJsZSBjb21wbGV0ZXNcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBvcHRpb25zLmRpc2FibGVTYW5pdGl6ZSAtIEFsbG93cyB0cnVzdGVkIGZldGNoIGRhdGEgdG8gc2tpcCBzYW5pdGl6YXRpb25cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGZldGNoZWQgcmVzcG9uc2UgcGFyc2VkIGJ5IHRoZSBjb25maWd1cmVkIHBhcmFtZXRlcnMuXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSwgc3Vic2NyaWJlciwgdGVzdE1vZGUsIENIQU5ORUxfTkFNRSkge1xuICAgIGNvbnN0IHRlc3RTdWJzY3JpYmVyID0gcCA9PiBjb25zb2xlLmxvZygnRkVUQ0ggUkVUVVJORUQgJywgcClcblxuICAgIHRoaXMuX21hcEZuID0gQ2hhbm5lbEZldGNoVXRpbC5zZXRNYXBGbihvcHRpb25zKVxuICAgIHRoaXMuX3VybCA9IENoYW5uZWxGZXRjaFV0aWwuc2V0VXJsKG9wdGlvbnMpXG4gICAgdGhpcy5fcmVzcG9uc2VUeXBlID0gQ2hhbm5lbEZldGNoVXRpbC5zZXRSZXNwb25zZVR5cGUob3B0aW9ucylcbiAgICB0aGlzLl9zZXJ2ZXJPcHRpb25zID0gQ2hhbm5lbEZldGNoVXRpbC5zZXRTZXJ2ZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgdGhpcy5fc3Vic2NyaWJlciA9IHN1YnNjcmliZXIgIT09IHVuZGVmaW5lZCA/IHN1YnNjcmliZXIgOiB0ZXN0U3Vic2NyaWJlclxuICAgIHRoaXMuZGVidWcgPSBvcHRpb25zPy5kZWJ1ZyA9PT0gdHJ1ZVxuICAgIHRoaXMuZGlzYWJsZVNhbml0aXplID0gb3B0aW9ucz8uZGlzYWJsZVNhbml0aXplID09PSB0cnVlXG4gICAgdGhpcy5jaGFubmVsTmFtZSA9IENIQU5ORUxfTkFNRVxuXG4gICAgY29uc3QgZmV0Y2hQcm9wcyA9IHtcbiAgICAgIG1hcEZuOiB0aGlzLm1hcEZuLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIHNlcnZlck9wdGlvbnM6IHRoaXMuc2VydmVyT3B0aW9ucyxcbiAgICAgIHJlc3BvbnNlVHlwZTogdGhpcy5yZXNwb25zZVR5cGUsXG4gICAgICBkaXNhYmxlU2FuaXRpemU6IHRoaXMuZGlzYWJsZVNhbml0aXplLFxuICAgICAgZGVidWc6IHRoaXMuZGVidWdcbiAgICB9XG5cbiAgICBpZiAodGVzdE1vZGUgIT09IHRydWUpIHtcbiAgICAgIENoYW5uZWxGZXRjaFV0aWwuc3RhcnRXaW5kb3dGZXRjaChmZXRjaFByb3BzLCB0aGlzLl9zdWJzY3JpYmVyLCB0aGlzLmNoYW5uZWxOYW1lKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzdGFydFdpbmRvd0ZldGNoKHByb3BzLCBzdWJzY3JpYmVyLCBjaGFubmVsTmFtZSkge1xuICAgIGNvbnN0IHsgbWFwRm4sIHVybCwgc2VydmVyT3B0aW9ucywgcmVzcG9uc2VUeXBlLCBkZWJ1ZyB9ID0gcHJvcHNcblxuICAgIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgICAgY2hhbm5lbE5hbWUsXG4gICAgICB1cmwsXG4gICAgICByZXNwb25zZVR5cGUsXG4gICAgICBzZXJ2ZXJPcHRpb25zXG4gICAgfVxuXG4gICAgY29uc3QgdGFwTG9nRGVidWcgPSBwID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdERUJVRyBGRVRDSCA6JywgcCwgbWV0YWRhdGEpXG4gICAgfVxuXG4gICAgY29uc3QgdGFwTG9nID0gZGVidWcgPT09IHRydWUgPyB0YXAodGFwTG9nRGVidWcpIDogdGFwKCgpID0+IHt9KVxuXG4gICAgY29uc3QgbWFwV3JhcHBlciA9IG1hcE1ldGhvZCA9PiBkYXRhID0+IHtcbiAgICAgIGNvbnN0IGRpc2FibGVTYW5pdGl6ZSA9IHByb3BzPy5kaXNhYmxlU2FuaXRpemUgPT09IHRydWVcblxuICAgICAgLy8gRmV0Y2hlZCBkYXRhIGlzIHJlbW90ZSBhbmQgdW50cnVzdGVkOiBhbHdheXMgc2FuaXRpemUgaW4gJ2FwcCcgbW9kZSxcbiAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIGFwcGxpY2F0aW9uJ3MgYXV0aG9yaW5nL3JpY2h0ZXh0IHBvc3R1cmUuXG4gICAgICBjb25zdCBzYW5pdGl6ZWREYXRhID0gZGlzYWJsZVNhbml0aXplID8gZGF0YSA6IHNhbml0aXplRGF0YShkYXRhLCB7IG1vZGU6ICdhcHAnIH0pXG5cbiAgICAgIHJldHVybiBtYXBNZXRob2Qoc2FuaXRpemVkRGF0YSwgbWV0YWRhdGEpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UkID0gZnJvbSh3aW5kb3cuZmV0Y2godXJsLCBzZXJ2ZXJPcHRpb25zKSkucGlwZShcbiAgICAgIG1lcmdlTWFwKHJlc3BvbnNlID0+XG4gICAgICAgIGZyb20oQ2hhbm5lbEZldGNoVXRpbC5wYXJzZVJlc3BvbnNlKHJlc3BvbnNlLCBtZXRhZGF0YSkpXG4gICAgICApLFxuXG4gICAgICB0YXBMb2csXG5cbiAgICAgIG1hcChtYXBXcmFwcGVyKG1hcEZuKSksXG5cbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT5cbiAgICAgICAgb2YoQ2hhbm5lbEZldGNoVXRpbC5jcmVhdGVGZXRjaEVycm9yUGF5bG9hZChlcnJvciwgbWV0YWRhdGEpKVxuICAgICAgKSxcblxuICAgICAgc2hhcmUoKVxuICAgIClcblxuICAgIHJlc3BvbnNlJC5zdWJzY3JpYmUoc3Vic2NyaWJlcilcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBwYXJzZVJlc3BvbnNlKHJlc3BvbnNlLCBtZXRhZGF0YSkge1xuICAgIGNvbnN0IHsgcmVzcG9uc2VUeXBlIH0gPSBtZXRhZGF0YVxuXG4gICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzXG4gICAgY29uc3Qgc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXR1c1RleHRcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnM/LmdldD8uKCdjb250ZW50LXR5cGUnKSB8fCAnJ1xuXG4gICAgY29uc3QgcmVzcG9uc2VNZXRhZGF0YSA9IHtcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgc3RhdHVzLFxuICAgICAgc3RhdHVzVGV4dCxcbiAgICAgIGNvbnRlbnRUeXBlLFxuICAgICAgb2s6IHJlc3BvbnNlLm9rXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm9rICE9PSB0cnVlKSB7XG4gICAgICBjb25zdCByYXdCb2R5ID0gYXdhaXQgQ2hhbm5lbEZldGNoVXRpbC5zYWZlUmVhZFRleHQocmVzcG9uc2UpXG5cbiAgICAgIHRocm93IENoYW5uZWxGZXRjaFV0aWwuY3JlYXRlRmV0Y2hFcnJvcih7XG4gICAgICAgIGVycm9yVHlwZTogJ0ZFVENIX0hUVFBfRVJST1InLFxuICAgICAgICBtZXNzYWdlOiBgRmV0Y2ggcmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9ICR7c3RhdHVzVGV4dH1gLFxuICAgICAgICBtZXRhZGF0YTogcmVzcG9uc2VNZXRhZGF0YSxcbiAgICAgICAgcmF3Qm9keVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2VUeXBlID09PSAnanNvbicpIHtcbiAgICAgIHJldHVybiBDaGFubmVsRmV0Y2hVdGlsLnBhcnNlSnNvblJlc3BvbnNlKHJlc3BvbnNlLCByZXNwb25zZU1ldGFkYXRhKVxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKVxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICdibG9iJykge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmJsb2IoKVxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICdhcnJheUJ1ZmZlcicpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJ2Zvcm1EYXRhJykge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmZvcm1EYXRhKClcbiAgICB9XG5cbiAgICB0aHJvdyBDaGFubmVsRmV0Y2hVdGlsLmNyZWF0ZUZldGNoRXJyb3Ioe1xuICAgICAgZXJyb3JUeXBlOiAnRkVUQ0hfVU5TVVBQT1JURURfUkVTUE9OU0VfVFlQRScsXG4gICAgICBtZXNzYWdlOiBgVW5zdXBwb3J0ZWQgZmV0Y2ggcmVzcG9uc2VUeXBlIFwiJHtyZXNwb25zZVR5cGV9XCJgLFxuICAgICAgbWV0YWRhdGE6IHJlc3BvbnNlTWV0YWRhdGFcbiAgICB9KVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIHBhcnNlSnNvblJlc3BvbnNlKHJlc3BvbnNlLCBtZXRhZGF0YSkge1xuICAgIGNvbnN0IHJhd0JvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcbiAgICBjb25zdCB0cmltbWVkQm9keSA9IHJhd0JvZHkudHJpbSgpXG5cbiAgICBpZiAodHJpbW1lZEJvZHkgPT09ICcnKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh0cmltbWVkQm9keSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgQ2hhbm5lbEZldGNoVXRpbC5jcmVhdGVGZXRjaEVycm9yKHtcbiAgICAgICAgZXJyb3JUeXBlOiAnRkVUQ0hfUkVTUE9OU0VfUEFSU0VfRVJST1InLFxuICAgICAgICBtZXNzYWdlOiAnRXhwZWN0ZWQgSlNPTiBidXQgY291bGQgbm90IHBhcnNlIHJlc3BvbnNlIGJvZHkuJyxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIHJhd0JvZHksXG4gICAgICAgIG9yaWdpbmFsRXJyb3I6IGVycm9yXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVGZXRjaEVycm9yKHsgZXJyb3JUeXBlLCBtZXNzYWdlLCBtZXRhZGF0YSwgcmF3Qm9keSA9ICcnLCBvcmlnaW5hbEVycm9yIH0pIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKVxuXG4gICAgZXJyb3IuaXNDaGFubmVsRmV0Y2hFcnJvciA9IHRydWVcbiAgICBlcnJvci5lcnJvclR5cGUgPSBlcnJvclR5cGVcbiAgICBlcnJvci5tZXRhZGF0YSA9IG1ldGFkYXRhXG4gICAgZXJyb3IucmF3Qm9keSA9IHJhd0JvZHlcbiAgICBlcnJvci5vcmlnaW5hbEVycm9yID0gb3JpZ2luYWxFcnJvclxuXG4gICAgcmV0dXJuIGVycm9yXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRmV0Y2hFcnJvclBheWxvYWQoZXJyb3IsIG1ldGFkYXRhKSB7XG4gICAgY29uc3QgZmV0Y2hNZXRhZGF0YSA9IGVycm9yPy5tZXRhZGF0YSB8fCBtZXRhZGF0YSB8fCB7fVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQ2hhbm5lbEZldGNoRXJyb3I6IHRydWUsXG4gICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgZXJyb3I6IHRydWUsXG4gICAgICBlcnJvclR5cGU6IGVycm9yPy5lcnJvclR5cGUgfHwgJ0ZFVENIX1VOS05PV05fRVJST1InLFxuICAgICAgbWVzc2FnZTogZXJyb3I/Lm1lc3NhZ2UgfHwgJ1Vua25vd24gQ2hhbm5lbEZldGNoVXRpbCBlcnJvcicsXG5cbiAgICAgIGNoYW5uZWxOYW1lOiBmZXRjaE1ldGFkYXRhLmNoYW5uZWxOYW1lLFxuICAgICAgdXJsOiBmZXRjaE1ldGFkYXRhLnVybCxcbiAgICAgIHJlc3BvbnNlVHlwZTogZmV0Y2hNZXRhZGF0YS5yZXNwb25zZVR5cGUsXG4gICAgICBzdGF0dXM6IGZldGNoTWV0YWRhdGEuc3RhdHVzLFxuICAgICAgc3RhdHVzVGV4dDogZmV0Y2hNZXRhZGF0YS5zdGF0dXNUZXh0LFxuICAgICAgY29udGVudFR5cGU6IGZldGNoTWV0YWRhdGEuY29udGVudFR5cGUsXG4gICAgICBvazogZmV0Y2hNZXRhZGF0YS5vayxcblxuICAgICAgcmF3Qm9keVByZXZpZXc6IENoYW5uZWxGZXRjaFV0aWwudHJ1bmNhdGVCb2R5KGVycm9yPy5yYXdCb2R5KSxcblxuICAgICAgb3JpZ2luYWxFcnJvck1lc3NhZ2U6IGVycm9yPy5vcmlnaW5hbEVycm9yPy5tZXNzYWdlXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHRydW5jYXRlQm9keShib2R5ID0gJycsIG1heExlbmd0aCA9IDUwMCkge1xuICAgIGlmICh0eXBlb2YgYm9keSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIHJldHVybiBib2R5Lmxlbmd0aCA+IG1heExlbmd0aFxuICAgICAgPyBgJHtib2R5LnNsaWNlKDAsIG1heExlbmd0aCl9Li4uYFxuICAgICAgOiBib2R5XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgc2FmZVJlYWRUZXh0KHJlc3BvbnNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXNwb25zZS50ZXh0KClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHNldE1hcEZuKG9wdHMpIHtcbiAgICBjb25zdCBnZXRGbiA9IGNvbXBvc2UoZGVmYXVsdFRvKHAgPT4gcCksIHByb3AoJ21hcEZuJykpXG4gICAgcmV0dXJuIGdldEZuKG9wdHMpXG4gIH1cblxuICBzdGF0aWMgc2V0VXJsKG9wdHMpIHtcbiAgICBjb25zdCB1cmwgPSBwcm9wKCd1cmwnLCBvcHRzKVxuXG4gICAgaWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NQWU5FIFdBUk5JTkc6IFVSTCBpcyB1bmRlZmluZWQgZm9yIGRhdGEgY2hhbm5lbCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIHVybFxuICB9XG5cbiAgc3RhdGljIHNldFJlc3BvbnNlVHlwZShvcHRzKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRUbygnanNvbicsIHByb3AoJ3Jlc3BvbnNlVHlwZScsIG9wdHMpKVxuICB9XG5cbiAgZ2V0IG1hcEZuKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXBGblxuICB9XG5cbiAgZ2V0IHVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsXG4gIH1cblxuICBnZXQgc2VydmVyT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VydmVyT3B0aW9uc1xuICB9XG5cbiAgZ2V0IHJlc3BvbnNlVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VUeXBlXG4gIH1cblxuICBzdGF0aWMgc3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMob2JqKSB7XG4gICAgY29uc3QgYm9keSA9IG9iaj8uYm9keVxuXG4gICAgY29uc3Qgc2hvdWxkU3RyaW5naWZ5Qm9keSA9XG4gICAgICBib2R5ICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgYm9keSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIGJvZHkuY29uc3RydWN0b3IgPT09IE9iamVjdFxuXG4gICAgaWYgKHNob3VsZFN0cmluZ2lmeUJvZHkgIT09IHRydWUpIHtcbiAgICAgIHJldHVybiBvYmpcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMob2JqLmhlYWRlcnMgfHwge30pXG5cbiAgICBpZiAoaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpICE9PSB0cnVlKSB7XG4gICAgICBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5vYmosXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMob3B0cykge1xuICAgIGNvbnN0IGhhc0JvZHkgPSBvcHRzPy5ib2R5ICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBtZXRob2QgPSBvcHRzPy5tZXRob2QgfHwgJ0dFVCdcblxuICAgIGlmIChoYXNCb2R5ICYmIG1ldGhvZC50b1VwcGVyQ2FzZSgpID09PSAnR0VUJykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnU1BZTkUgV0FSTklORzogRmV0Y2ggYm9keSB3YXMgcHJvdmlkZWQgd2l0aCBtZXRob2QgR0VULiBDaGFuZ2luZyBtZXRob2QgdG8gUE9TVC4nLFxuICAgICAgICBvcHRzXG4gICAgICApXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdHNcbiAgfVxuXG4gIHN0YXRpYyBzZXRTZXJ2ZXJPcHRpb25zKG9wdHMpIHtcbiAgICBjb25zdCBvcHRpb25zID0gcGljayhbXG4gICAgICAnbWV0aG9kJyxcbiAgICAgICdoZWFkZXJzJyxcbiAgICAgICdib2R5JyxcbiAgICAgICdtb2RlJyxcbiAgICAgICdjcmVkZW50aWFscycsXG4gICAgICAnY2FjaGUnLFxuICAgICAgJ3JlZGlyZWN0JyxcbiAgICAgICdyZWZlcnJlcicsXG4gICAgICAncmVmZXJyZXJQb2xpY3knLFxuICAgICAgJ2ludGVncml0eScsXG4gICAgICAna2VlcGFsaXZlJ1xuICAgIF0sIG9wdHMpXG5cbiAgICBsZXQgbWVyZ2VkT3B0aW9ucyA9IG1lcmdlRGVlcFJpZ2h0KENoYW5uZWxGZXRjaFV0aWwuYmFzZU9wdGlvbnMoKSwgb3B0aW9ucylcblxuICAgIG1lcmdlZE9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnVwZGF0ZU1ldGhvZFdoZW5Cb2R5RXhpc3RzKG1lcmdlZE9wdGlvbnMpXG4gICAgbWVyZ2VkT3B0aW9ucyA9IENoYW5uZWxGZXRjaFV0aWwuc3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMobWVyZ2VkT3B0aW9ucylcblxuICAgIHJldHVybiBtZXJnZWRPcHRpb25zXG4gIH1cblxuICBzdGF0aWMgYmFzZU9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG5cbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICAgICAgfSksXG5cbiAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgY2FjaGU6ICdkZWZhdWx0JyxcbiAgICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICAgIHJlZmVycmVyUG9saWN5OiAnbm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGUnLFxuICAgICAgaW50ZWdyaXR5OiAnJyxcbiAgICAgIGtlZXBhbGl2ZTogZmFsc2VcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGlzLFxuICByZWplY3QsXG4gIGlzTmlsLFxuICBmaW5kLFxuICBhbGxQYXNzLFxuICBmb3JFYWNoT2JqSW5kZXhlZCxcbiAgbm90LFxuICBpc0VtcHR5LFxuICBhbHdheXMsXG4gIGNvbXBvc2UsXG4gIGVxdWFscyxcbiAgcHJvcCxcbiAgd2hlcmUsXG4gIGRlZmF1bHRUbyxcbiAgbWVyZ2VBbGwsXG4gIEYsXG4gIG9taXQsXG4gIGZsYXR0ZW4sXG4gIGFueSxcbiAgY3VycnksXG4gIGx0ZVxuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5jb25zdCBpc05vdEFyciA9IGNvbXBvc2Uobm90LCBpcyhBcnJheSkpXG5jb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShub3QsIGlzRW1wdHkpXG5jb25zdCBpc05vbkVtcHR5U3RyID0gYWxsUGFzcyhbaXMoU3RyaW5nKSwgaXNOb3RFbXB0eV0pXG5jb25zdCBpc05vbkVtcHR5QXJyID0gYWxsUGFzcyhbaXMoQXJyYXkpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzT2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5jb25zdCBpc05vbkVtcHR5T2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5cbmNvbnN0IGlzU3RyaW5nICA9ICh2YWwpID0+IGlzKFN0cmluZywgdmFsKVxuY29uc3QgaXNCb29sZWFuID0gKHZhbCkgPT4gaXMoQm9vbGVhbiwgdmFsKVxuY29uc3QgaXNOdW1iZXIgID0gKHZhbCkgPT4gaXMoTnVtYmVyLCB2YWwpXG5jb25zdCBpc0FycmF5Rm4gPSAodmFsKSA9PiBpcyhBcnJheSwgdmFsKVxuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFBheWxvYWRGaWx0ZXIge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsUGF5bG9hZEZpbHRlclxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgdXRpbGl0eSBmaWx0ZXJzIENoYW5uZWxQYXlsb2FkIG9iamVjdHMgYnkgdXNpbmcgcXVlcnkgc2VsZWN0b3JzIGFuZC9vciBieSBjb21wYXJpbmcgZGF0YSBwcm9wZXJ0aWVzPC9wPlxuICAgKiA8aDM+VGhlIENoYW5uZWxQYXlsb2FkRmlsdGVyIGZlYXR1cmVzPC9oMz5cbiAgICogPHVsPlxuICAgKiAgIDxsaT5DYW4gYmUgdXNlZCBieSBDaGFubmVscyBhbmQgVmlld1N0cmVhbXM8L2xpPlxuICAgKiAgIDxsaT5DaGFubmVsUGF5bG9hZEZpbHRlciBpbnN0YW5jZXMgY2FuIGJlIHVzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciB3aGVuIGJpbmRpbmcgYWN0aW9ucyB0byBWaWV3U3RyZWFtIG1ldGhvZHMuPC9saT5cbiAgICogICA8bGk+U2VsZWN0b3JzIGNhbiBiZSBhIHF1ZXJ5IHN0cmluZywgYW4gYXJyYXkgb2Ygc2VsZWN0b3Igc3RyaW5ncywgb3IgdGhlIHNlbGVjdG9yIGNhbiBiZSBhbiBhY3R1YWwgZG9tIGVsZW1lbnQuPC9saT5cbiAgICogICA8bGk+U2VsZWN0b3JzIGFyZSBub3QgcmVxdWlyZWQgYW5kIGNhbiBiZSBkaXNyZWdhcmRlZCBieSBhZGRpbmcgXCJcIiBvciB1bmRlZmluZWQgYXMgdGhlIHNlbGVjdG9yIHByb3BlcnR5LjwvbGk+XG4gICAqICAgPGxpPlRoZSBkYXRhIG9iamVjdCBjb21wYXJlcyB0aGUgdmFsdWVzIGZyb20gdGhlIHByb3BzKCkgbWV0aG9kIG9mIGEgQ2hhbm5lbFBheWxvYWQgb2JqZWN0PC9saT5cbiAgICogICA8bGk+SW50ZXJuYWxseSwgVGhlIGRhdGEgb2JqZWN0IGlzIGNvbmZvcm1lZCB0byBhIHNwZWMgb2JqZWN0IGZvciByYW1kYSZyc3F1bztzIEVYVFsnd2hlcmUnLCAnLy9yYW1kYWpzLmNvbS9kb2NzLyN3aGVyZSddIG1ldGhvZDwvbGk+XG4gICAqICAgPC91bD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEFycmF5fEhUTUxFbGVtZW50fSBzZWxlY3RvciBUaGUgbWF0Y2hpbmcgZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gZmlsdGVycyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0b3IsIHByb3BzLCBhbmQgZGVidWdMYWJlbCBwYXJhbXMuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wRmlsdGVycyBBIGpzb24gb2JqZWN0IGNvbnRhaW5pbmcgZmlsdGVyaW5nIG1ldGhvZHMgZm9yIGNoYW5uZWwgcHJvcHMgdmFyaWFibGVzLlxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xBcnJheXxIVE1MRWxlbWVudH0gc2VsZWN0b3IgLSA9ICcnOyBUaGUgbWF0Y2hpbmcgZWxlbWVudC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BGaWx0ZXJzIC0gPSB7fTsgQSBqc29uIG9iamVjdCBjb250YWluaW5nIGNvbXByYXRvcnMgZm9yIGFueSBleHBlY3RlZCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIEJvb2xlYW5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5GaWx0ZXJpbmcgdXNpbmcgU2VsZWN0b3JzIGFuZCBhIFByb3BlcnR5IENvbXBhcmF0b3IgV2l0aGluIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+J11cbiAgICogICAgY29uc3QgbXlTZWxlY3RvcnMgPSBbJ3VsJywgJ2xpOmZpcnN0LWNoaWxkJ107XG4gICAqICAgIGNvbnN0IHByb3BGaWx0ZXJzID0ge1xuICAgKiAgICAgIGxpbmtUeXBlOiBcImV4dGVybmFsXCJcbiAgICogICAgfTtcbiAgICogICAgY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIobXlTZWxlY3RvcnMsIHByb3BGaWx0ZXJzKTtcbiAgICpcbiAgICogICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCBteUZpbHRlcl1cbiAgICogICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICB9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+RmlsdGVyaW5nIFVzaW5nIE1ldGhvZCBhbmQgU3RyaW5nIENvbXBhcmF0b3JzIFdpdGhpbiBhIFZpZXdTdHJlYW0gSW5zdGFuY2U8L2g0PiddXG4gICAqICAgIGNvbnN0IHByb3BGaWx0ZXJzID0ge1xuICAgKiAgICAgIHR5cGU6IFwic2Nyb2xsaW5nLWVsZW1lbnRcIixcbiAgICogICAgICBzY3JvbGxOdW06ICAobik9Pm4+PTEyMDAgJiYgbjw9NTAwMDtcbiAgICogICAgfTtcbiAgICogICAgY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIoJycsIHByb3BGaWx0ZXJzKTtcbiAgICpcbiAgICogICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCBteUZpbHRlcl1cbiAgICogICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICB9XG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+QSBTaW1wbGUgUHJvcGVydHkgRmlsdGVyaW5nIEV4YW1wbGUgV2l0aGluIGEgQ2hhbm5lbCBJbnN0YW5jZTwvaDQ+J11cbiAgICogLy8gRmlsdGVyIGZvciBhIGJ1dHRvbiB3aXRoIGEgZGF0YSB0eXBlIG9mICdsaW5rJ1xuICAgKiBjb25zdCBteUZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcignJyB7dHlwZTogXCJsaW5rXCJ9KTtcbiAgICpcbiAgICogdGhpcy5nZXRDaGFubmVsKFwiQ0hBTk5FTF9VSVwiKVxuICAgKiAucGlwZShmaWx0ZXIobXlGaWx0ZXIpKVxuICAgKiAuc3Vic2NyaWJlKG15Q2hhbm5lbE1ldGhvZCk7XG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZWxlY3RvciwgZmlsdGVycyA9IHt9LCBkZWJ1Z0xhYmVsLCB0ZXN0TW9kZSkge1xuICAgIGNvbnN0IHNlbGVjdG9ySXNPYmogPSBpc09iamVjdEZuKHNlbGVjdG9yKVxuXG4gICAgaWYgKHNlbGVjdG9ySXNPYmopIHtcbiAgICAgIGZpbHRlcnMgPSBzZWxlY3RvclxuICAgICAgc2VsZWN0b3IgPSBwcm9wKCdzZWxlY3RvcicsIGZpbHRlcnMpXG4gICAgICB0ZXN0TW9kZSA9IHRlc3RNb2RlIHx8IHByb3AoJ3Rlc3RNb2RlJywgZmlsdGVycylcbiAgICB9XG5cbiAgICBjb25zdCBkZWJ1Z0xhYmVsQXJyID0gW2RlYnVnTGFiZWwsIHByb3AoJ2RlYnVnTGFiZWwnLCBmaWx0ZXJzKV1cblxuICAgIGRlYnVnTGFiZWwgPSBjb21wb3NlKGZpbmQoaXMoU3RyaW5nKSkpKGRlYnVnTGFiZWxBcnIpXG5cbiAgICBsZXQgcHJvcHMgPSBvbWl0KFsnZGVidWdMYWJlbCcsICdsYWJlbCcsICdzZWxlY3RvcicsICdwcm9wcycsICd0ZXN0TW9kZScsICdwcm9wRmlsdGVycyddLCBmaWx0ZXJzKVxuICAgIGlmIChmaWx0ZXJzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BzID0gbWVyZ2VBbGwoW2ZpbHRlcnMucHJvcHMsIHByb3BzXSlcbiAgICB9IGVsc2UgaWYgKGZpbHRlcnMucHJvcEZpbHRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMgPSBtZXJnZUFsbChbZmlsdGVycy5wcm9wRmlsdGVycywgcHJvcHNdKVxuICAgIH1cblxuICAgIGZpbHRlcnMucHJvcEZpbHRlcnMgPSBwcm9wc1xuXG4gICAgY29uc3QgeyBwcm9wRmlsdGVycyB9ID0gZmlsdGVyc1xuXG4gICAgY29uc3QgYWRkU3RyaW5nU2VsZWN0b3JGaWx0ZXIgPSAgaXNOb25FbXB0eVN0cihzZWxlY3RvcikgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJTZWxlY3Rvcihbc2VsZWN0b3JdLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGFkZEFycmF5U2VsZWN0b3JGaWx0ZXIgPSAgIGlzTm9uRW1wdHlBcnIoc2VsZWN0b3IpID8gQ2hhbm5lbFBheWxvYWRGaWx0ZXIuZmlsdGVyU2VsZWN0b3Ioc2VsZWN0b3IsIGRlYnVnTGFiZWwpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkRGF0YUZpbHRlciA9IGlzTm9uRW1wdHlPYmplY3RGbihwcm9wRmlsdGVycykgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJEYXRhKHByb3BGaWx0ZXJzLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuXG4gICAgbGV0IGZpbHRlcnNBcnIgPSByZWplY3QoaXNOaWwsIFthZGRTdHJpbmdTZWxlY3RvckZpbHRlciwgYWRkQXJyYXlTZWxlY3RvckZpbHRlciwgYWRkRGF0YUZpbHRlcl0pXG5cbiAgICAvLyBJRiBBUlJBWSBJUyBFTVBUWSBBTFdBWVMgUkVUVVJOIEZBTFNFO1xuXG4gICAgY29uc3QgZmlsdGVyc0FyZUVtcHR5ID0gaXNFbXB0eShmaWx0ZXJzQXJyKVxuXG4gICAgaWYgKGZpbHRlcnNBcmVFbXB0eSkge1xuICAgICAgZmlsdGVyc0FyciA9IFthbHdheXMoZmFsc2UpXVxuICAgICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZSAmJiB0ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBDaGFubmVsIEZpbHRlciwgd2l0aCBzZWxlY3RvcjogJHtzZWxlY3Rvcn0sIGFuZCBwcm9wRmlsdGVyczoke3Byb3BGaWx0ZXJzfSBhcHBlYXJzIHRvIGJlIGVtcHR5IWApXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ZXN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IsIHByb3BGaWx0ZXJzLCBkZWJ1Z0xhYmVsLCBmaWx0ZXJzLCB0ZXN0TW9kZSwgZmlsdGVyc0FyZUVtcHR5IH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUGFzcyhmaWx0ZXJzQXJyKVxuICB9XG5cbiAgc3RhdGljIGZpbHRlckRhdGEoZmlsdGVySnNvbiwgZmlsdGVyZGVidWdMYWJlbCkge1xuICAgIGNvbnN0IGRlYnVnTGFiZWwgPSBmaWx0ZXJkZWJ1Z0xhYmVsXG5cbiAgICBjb25zdCBjb21wYXJlRGF0YSA9ICgpID0+IHtcbiAgICAgIC8vIERPIE5PVCBBTExPVyBBTiBFTVBUWSBPQkpFQ1QgVE8gUkVUVVJOIFRSVUVzXG4gICAgICBpZiAoaXNFbXB0eShmaWx0ZXJKc29uKSkge1xuICAgICAgICByZXR1cm4gYWx3YXlzKGZhbHNlKVxuICAgICAgfVxuXG4gICAgICAvLyAgQ0hFQ0tTIEFMTCBWQUxVRVMgSU4gSlNPTiBUTyBERVRFUk1JTkUgSUYgVEhFUkUgQVJFIEZJTFRFUklORyBNRVRIT0RTXG5cbiAgICAgIGNvbnN0IGNyZWF0ZUN1cnJ5Q29tcGFyYXRvciA9IGNvbXBhcmVTdHIgPT4gKHN0cikgPT4ge1xuICAgICAgICByZXR1cm4gc3RyID09PSBjb21wYXJlU3RyXG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja1RvQ29udmVydFRvRm4gPSAodmFsLCBrZXksIG9iaikgPT4ge1xuICAgICAgICBsZXQgZm5WYWwgPSBGXG4gICAgICAgIGlmIChpc1N0cmluZyh2YWwpIHx8IGlzQm9vbGVhbih2YWwpIHx8IGlzTnVtYmVyKHZhbCkpIHtcbiAgICAgICAgICBmblZhbCA9IGNyZWF0ZUN1cnJ5Q29tcGFyYXRvcih2YWwpXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiB2YWxcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5Rm4odmFsKSB8fCBpc09iamVjdEZuKHZhbCkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBDaGFubmVsUGF5bG9hZEZpbHRlcjogUHJvcGVydHkgXCIke3ZhbH1cIiBpcyBhbiBhcnJheS9vYmplY3QsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiBgICtcbiAgICAgICAgICAgICAgJ1RoaXMgcHJvcGVydHkgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLidcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIGZuVmFsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuVmFsXG4gICAgICB9XG4gICAgICBmaWx0ZXJKc29uID0gck1hcChjaGVja1RvQ29udmVydFRvRm4sIGZpbHRlckpzb24pXG5cbiAgICAgIC8vIFRBUCBMT0dHRVJcbiAgICAgIGNvbnN0IHRhcExvZ2dlciA9IChjb21wYXJlZE9iaikgPT4ge1xuICAgICAgICBpZiAoZGVidWdMYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmVkT2JqXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvcHNCb29sZWFucyA9IHt9XG4gICAgICAgIGNvbnN0IG1hcEJvb2xzID0gKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBwcm9wc0Jvb2xlYW5zW2tleV0gPSB2YWx1ZShwcm9wKGtleSwgY29tcGFyZWRPYmopKVxuICAgICAgICB9XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKG1hcEJvb2xzLCBmaWx0ZXJKc29uKVxuICAgICAgICBjb25zb2xlLmxvZyhgJWMgQ0hBTk5FTCBQQVlMT0FEIEZJTFRFUiBERUJVR0dFUiBbXCIke2RlYnVnTGFiZWx9XCJdIC0gdmFsdWVzOiAgICBgLCAnY29sb3I6b3JhbmdlOycsIHsgcHJvcHNCb29sZWFucywgY29tcGFyZWRPYmogfSlcblxuICAgICAgICByZXR1cm4gY29tcGFyZWRPYmpcbiAgICAgIH1cblxuICAgICAgLy8gRU5EIFRBUCBMT0dHRVJcbiAgICAgIGNvbnN0IGZNZXRob2QgPSB3aGVyZShmaWx0ZXJKc29uKVxuXG4gICAgICBjb25zdCBnZXRGaWx0ZXJpbmdPYmogPSAgKHYpID0+IHtcbiAgICAgICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gdiB8fCB7fVxuICAgICAgICBjb25zdCBvID0gT2JqZWN0LmFzc2lnbih7fSwgdiwgc3JjRWxlbWVudCwgZXZlbnQsIHBheWxvYWQpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdvIGlzICcsbyk7XG4gICAgICAgIHJldHVybiBvXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wb3NlKGZNZXRob2QsIHRhcExvZ2dlciwgZGVmYXVsdFRvKHt9KSwgZ2V0RmlsdGVyaW5nT2JqKVxuICAgIH1cblxuICAgIHJldHVybiBjb21wYXJlRGF0YSgpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tQYXlsb2FkU2VsZWN0b3IoYXJyLCBkZWJ1Z0xhYmVsLCBzcmNQYXlsb2FkKSB7XG4gICAgLy8gRUxFTUVOVCBGUk9NIFBBWUxPQURzXG4gICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gc3JjUGF5bG9hZCB8fCB7fVxuXG4gICAgY29uc3QgcmVkdWNlRmluZEVsID0gKGFjYywgc3JjKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IHByb3AoJ2VsJywgc3JjKVxuICAgICAgaWYgKENoYW5uZWxQYXlsb2FkRmlsdGVyLmVsSXNEb21FbGVtZW50KGVsKSAmJiBhY2MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2MgPSBlbFxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIGNvbnN0IGVsID0gW3NyY0VsZW1lbnQsIHBheWxvYWQsIHByb3AoJ3NyY0VsZW1lbnQnLCBldmVudCksIHNyY1BheWxvYWRdLnJlZHVjZShyZWR1Y2VGaW5kRWwsIHVuZGVmaW5lZClcblxuICAgIC8vIFJFVFVSTiBCT09MRUFOIE1BVENIIFdJVEggUEFZTE9BRCBFTFxuICAgIGNvbnN0IGNvbXBhcmVFbHMgPSAoZWxDb21wYXJlKSA9PiBlbENvbXBhcmUuaXNFcXVhbE5vZGUoKGVsKSlcblxuICAgIC8vIExPT1AgVEhST1VHSCBOT0RFUyBJTiBxdWVyeVNlbGVjdG9yQWxsKClcbiAgICBjb25zdCBtYXBOb2RlQXJyV2l0aEVsID0gKHNlbCkgPT4ge1xuICAgICAgLy8gY29udmVydCBub2RlbGlzdCB0byBhcnJheSBvZiBlbHNcbiAgICAgIGNvbnN0IG5vZGVBcnIgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsKSlcbiAgICAgIC8vIGVscyBhcnJheSB0byBib29sZWFuIGFycmF5XG4gICAgICByZXR1cm4gck1hcChjb21wYXJlRWxzLCBub2RlQXJyKVxuICAgIH1cblxuICAgIGlmIChkZWJ1Z0xhYmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG5vZGVBcnJSZXN1bHRzRGVidWdnZXIgPSBjb21wb3NlKGZsYXR0ZW4sIHJNYXAobWFwTm9kZUFycldpdGhFbCkpKGFycilcbiAgICAgIGNvbnN0IHNlbGVjdG9yc0FyciA9IGFyclxuICAgICAgY29uc29sZS5sb2coYCVjIENIQU5ORUwgUEFZTE9BRCBGSUxURVIgREVCVUdHRVIgW1wiJHtkZWJ1Z0xhYmVsfVwiXSAtIHNlbGVjdG9yczogYCwgJ2NvbG9yOm9yYW5nZTsnLCB7IGVsLCBzZWxlY3RvcnNBcnIsIG5vZGVBcnJSZXN1bHRzRGVidWdnZXIgfSlcbiAgICB9XG5cbiAgICAvLyBDSEVDSyBJRiBQQVlMT0FEIEVMIEVYSVNUU1xuICAgIGlmICh0eXBlb2YgKGVsKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIExPT1AgVEhST1VHSCBBTEwgU0VMRUNUT1JTIElOIE1BSU4gQVJSQVlcbiAgICBjb25zdCBub2RlQXJyUmVzdWx0ID0gY29tcG9zZShmbGF0dGVuLCByTWFwKG1hcE5vZGVBcnJXaXRoRWwpKShhcnIpXG4gICAgaWYgKGlzRW1wdHkobm9kZUFyclJlc3VsdCkgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiBhbnkoZXF1YWxzKHRydWUpLCBub2RlQXJyUmVzdWx0KVxuICB9XG5cbiAgc3RhdGljIGVsSXNEb21FbGVtZW50KG8pIHtcbiAgICBpZiAoaXMoU3RyaW5nLCBvKSkge1xuICAgICAgbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobylcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpKG8pXG4gIH1cblxuICBzdGF0aWMgZmlsdGVyU2VsZWN0b3Ioc2VsZWN0b3JBcnIsIGRlYnVnTGFiZWwpIHtcbiAgICBjb25zdCBhcnIgPSByZWplY3QoaXNFbXB0eSwgc2VsZWN0b3JBcnIpXG4gICAgY29uc3QgcGF5bG9hZENoZWNrID0gY3VycnkoQ2hhbm5lbFBheWxvYWRGaWx0ZXIuY2hlY2tQYXlsb2FkU2VsZWN0b3IpXG4gICAgcmV0dXJuIHBheWxvYWRDaGVjayhhcnIsIGRlYnVnTGFiZWwpXG4gIH1cbn1cbiIsImZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbCkge1xuICBjb25zdCBub25OdWxsT2JqZWN0ID0gdmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnXG4gIHJldHVybiBub25OdWxsT2JqZWN0ICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpICE9PSAnW29iamVjdCBSZWdFeHBdJyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSAhPT0gJ1tvYmplY3QgRGF0ZV0nXG59XG5cbmZ1bmN0aW9uIGVtcHR5VGFyZ2V0KHZhbCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gW10gOiB7fVxufVxuXG5mdW5jdGlvbiBjbG9uZUlmTmVjZXNzYXJ5KHZhbHVlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgY2xvbmUgPSBvcHRpb25zQXJndW1lbnQgJiYgb3B0aW9uc0FyZ3VtZW50LmNsb25lID09PSB0cnVlXG4gIHJldHVybiAoY2xvbmUgJiYgaXNNZXJnZWFibGVPYmplY3QodmFsdWUpKVxuICAgID8gZGVlcE1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSxcbiAgICAgIHZhbHVlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgOiB2YWx1ZVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gdGFyZ2V0LnNsaWNlKClcbiAgc291cmNlLmZvckVhY2goZnVuY3Rpb24oZSwgaSkge1xuICAgIGlmICh0eXBlb2YgZGVzdGluYXRpb25baV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBkZXN0aW5hdGlvbltpXSA9IGNsb25lSWZOZWNlc3NhcnkoZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QoZSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gZGVlcE1lcmdlKHRhcmdldFtpXSwgZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSBpZiAodGFyZ2V0LmluZGV4T2YoZSkgPT09IC0xKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGNsb25lSWZOZWNlc3NhcnkoZSwgb3B0aW9uc0FyZ3VtZW50KSlcbiAgICB9XG4gIH0pXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBtZXJnZU9iamVjdCh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0ge31cbiAgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldCkpIHtcbiAgICBPYmplY3Qua2V5cyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gY2xvbmVJZk5lY2Vzc2FyeSh0YXJnZXRba2V5XSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0pXG4gIH1cbiAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICghaXNNZXJnZWFibGVPYmplY3Qoc291cmNlW2tleV0pIHx8ICF0YXJnZXRba2V5XSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGNsb25lSWZOZWNlc3Nhcnkoc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGRlZXBNZXJnZSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9XG4gIH0pXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudCkge1xuICBjb25zdCBhcnJheSA9IEFycmF5LmlzQXJyYXkoc291cmNlKVxuICBjb25zdCBvcHRpb25zID0gb3B0aW9uc0FyZ3VtZW50IHx8IHsgYXJyYXlNZXJnZTogZGVmYXVsdEFycmF5TWVyZ2UgfVxuICBjb25zdCBhcnJheU1lcmdlID0gb3B0aW9ucy5hcnJheU1lcmdlIHx8IGRlZmF1bHRBcnJheU1lcmdlXG5cbiAgaWYgKGFycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0KVxuICAgICAgPyBhcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgICA6IGNsb25lSWZOZWNlc3Nhcnkoc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gIH1cbn1cblxuZGVlcE1lcmdlLmFsbCA9IGZ1bmN0aW9uIGRlZXBtZXJnZUFsbChhcnJheSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkgfHwgYXJyYXkubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCB0d28gZWxlbWVudHMnKVxuICB9XG5cbiAgLy8gd2UgYXJlIHN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IDIgdmFsdWVzLCBzbyBpdCBpcyBzYWZlIHRvIGhhdmUgbm8gaW5pdGlhbCB2YWx1ZVxuICByZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gZGVlcE1lcmdlKHByZXYsIG5leHQsIG9wdGlvbnNBcmd1bWVudClcbiAgfSlcbn1cblxuZXhwb3J0IHsgZGVlcE1lcmdlIH1cbiIsImltcG9ydCB7IGRlZmF1bHRUbywgbWF0Y2gsIGZvckVhY2gsIHRlc3QsIGluY2x1ZGVzLCB3aXRob3V0LCBjb21wbGVtZW50LCBpc0VtcHR5LCB2YWx1ZXMsIGlzTmlsLCBmaWx0ZXIsIF9fLCBrZXlzLCBjb21wb3NlLCBoZWFkLCBtYXAsIGNvbmQsIFQsIGFsbFBhc3MsIGNvbmNhdCwgdW5pcSB9IGZyb20gJ3JhbWRhJ1xuY29uc3QgaXNJT1MgPSAoKSA9PiB7XG4gIGNvbnN0IHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKClcbiAgLy8gbGV0IHNhZmFyaSA9IC9zYWZhcmkvLnRlc3QodXNlckFnZW50KTtcbiAgY29uc3QgaW9zID0gL2lwaG9uZXxpcG9kfGlwYWQvLnRlc3QodXNlckFnZW50KVxuICByZXR1cm4gaW9zID09PSB0cnVlXG59XG5cbmNvbnN0IGRlbGF5Q2FsbCA9IGFzeW5jKGZuLCB0aW1lKSA9PiB7XG4gIGZ1bmN0aW9uIHNsZWVwKG1zKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG4gIH1cblxuICBjb25zdCB0aW1lb3V0SGFuZGxlciA9IGFzeW5jKCkgPT4ge1xuICAgIGF3YWl0IHNsZWVwKDEpXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbilcbiAgfVxuXG4gIHdpbmRvdy5zZXRUaW1lb3V0KHRpbWVvdXRIYW5kbGVyLCB0aW1lKVxufVxuXG5jb25zdCBnZXRDb25zdHJ1Y3Rvck5hbWUgPSAob2JqKSA9PiB7XG4gIGlmIChvYmouY29uc3RydWN0b3IubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG9iai5jb25zdHJ1Y3Rvci5uYW1lXG4gIH1cbiAgY29uc3QgcmUgPSAvXihmdW5jdGlvblxccykoXFx3KykoXFwoLiopJC9cbiAgY29uc3Qgc3RyID0gb2JqLnRvU3RyaW5nKClcbiAgcmV0dXJuIGRlZmF1bHRUbyhTdHJpbmcoc3RyKS5zdWJzdHIoMCwgMTIpLCBtYXRjaChyZSwgc3RyKVsyXSlcbn1cblxuY29uc3QgYXJyRnJvbU1hcEtleXMgPSAobWFwKSA9PiB7XG4gIGNvbnN0IGFyciA9IFtdXG4gIGNvbnN0IGFkZEtleXNUb0FyciA9ICh2LCBrLCBpKSA9PiBhcnIucHVzaChrKVxuICBmb3JFYWNoKGFkZEtleXNUb0FyciwgbWFwKVxuICByZXR1cm4gYXJyXG59XG5cbmNvbnN0IGZpbmRTdHJGcm9tUmVnZXhBcnIgPSAob2JqLCBzdHIpID0+IHtcbiAgaWYgKG9ialtzdHJdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cbiAgY29uc3QgY2hlY2tJZk1hdGNoID0gcyA9PiB0ZXN0KG5ldyBSZWdFeHAocyksIHN0cilcbiAgY29uc3QgY2hlY2tTdHJNYXRjaCA9IGluY2x1ZGVzKHN0cilcbiAgY29uc3QgY2hlY2tJZlJlZ0V4TWF0Y2ggPSBjb21wb3NlKGluY2x1ZGVzKHRydWUpLCBtYXAoY2hlY2tJZk1hdGNoKSlcbiAgY29uc3QgcnVuTWF0Y2hDaGVja3MgPSBjb25kKFtcbiAgICBbY2hlY2tTdHJNYXRjaCwgKCkgPT4gc3RyXSxcbiAgICBbY2hlY2tJZlJlZ0V4TWF0Y2gsICgpID0+IHN0cl0sXG4gICAgW1QsICgpID0+IHVuZGVmaW5lZF1cbiAgXSlcbiAgcmV0dXJuIHJ1bk1hdGNoQ2hlY2tzKG9iailcbn1cblxuY29uc3QgZmluZFN0ck9yUmVnZXhNYXRjaFN0ciA9IChvYmosIHN0cikgPT4ge1xuICBpZiAob2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdHJcbiAgfVxuICBjb25zdCBjcmVhdGVSZSA9IHMgPT4gbmV3IFJlZ0V4cChzKVxuICBjb25zdCBjaGVja2VySWZSZWdleE1hdGNoRXhpc3RzID0gY29tcG9zZShoZWFkLCBmaWx0ZXIoY29tcG9zZSh0ZXN0KF9fLCBzdHIpLCBjcmVhdGVSZSkpKVxuICByZXR1cm4gY2hlY2tlcklmUmVnZXhNYXRjaEV4aXN0cyhrZXlzKG9iaikpXG59XG5cbmNvbnN0IGNsb3Nlc3QgPSAoYXJyYXksIG51bSkgPT4ge1xuICBsZXQgaSA9IDBcbiAgbGV0IG1pbkRpZmYgPSAxMDAwXG4gIGxldCBhbnNcbiAgZm9yIChpIGluIGFycmF5KSB7XG4gICAgY29uc3QgbSA9IE1hdGguYWJzKG51bSAtIGFycmF5W2ldKVxuICAgIGlmIChtIDwgbWluRGlmZikge1xuICAgICAgbWluRGlmZiA9IG1cbiAgICAgIGFucyA9IGFycmF5W2ldXG4gICAgfVxuICB9XG4gIHJldHVybiBhbnNcbn1cblxuY29uc3QgY29udmVydERvbVN0cmluZ01hcFRvT2JqID0gKGRvbU1hcCkgPT4ge1xuICBjb25zdCBvYmogPSB7fVxuICBmb3IgKGNvbnN0IGQgaW4gZG9tTWFwKSB7XG4gICAgb2JqW2RdID0gZG9tTWFwW2RdXG4gIH1cbiAgcmV0dXJuIG9ialxufVxuXG4vLyBjb25zdCBwYXNzUGFnZURhdGEgPSBwaWNrKFsncGFyYW1zJywgJ3JvdXRlSWQnLCAnZGF0YSddLCBfXyk7XG5cbmNvbnN0IHN1YnNjcmliZUZuID0ge1xuICBuZXh0OiAgICAgeCA9PiBjb25zb2xlLmxvZyhgbmV4dCAgICAgICR7eH1gKSxcbiAgZXJyb3I6ICAgIHggPT4gY29uc29sZS5sb2coYGVycm9yICAgICAke3h9YCksXG4gIGNvbXBsZXRlOiB4ID0+IGNvbnNvbGUubG9nKGBjb21wbGV0ZSAgJHt4fWApXG59XG5cbmNvbnN0IHJpZ2h0ID0geCA9PiAoe1xuICBtYXA6IGYgPT4gcmlnaHQoZih4KSksXG4gIGZvbGQ6IChmLCBnKSA9PiBnKHgpLFxuICBpbnNwZWN0OiAoKSA9PiBgcmlnaHQoJHt4fSlgXG5cbn0pXG5cbmNvbnN0IGlmTmlsVGhlblVwZGF0ZSA9ICh2YWwsIG5ld1ZhbCkgPT4ge1xuICBjb25zdCBpc05pbEJvb2wgPSBpc05pbCh2YWwpXG4gIHJldHVybiBpc05pbEJvb2wgPyBuZXdWYWwgOiB2YWxcbn1cblxuY29uc3QgbGVmdCA9IHggPT4gKHtcbiAgbWFwOiBmID0+IGxlZnQoeCksXG4gIGZvbGQ6IChmLCBnKSA9PiBmKHgpLFxuICBpbnNwZWN0OiAoKSA9PiBgbGVmdCgke3h9KWBcbn0pXG5cbmNvbnN0IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgPSAob2JqKSA9PiB7XG4gIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNFbXB0eSksIGhlYWQsIHZhbHVlcylcbiAgY29uc3QgaXNOb3ROaWwgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNOaWwpLCBoZWFkLCB2YWx1ZXMpXG4gIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90TmlsXSlcbiAgcmV0dXJuIGlzTm90TmlsQW5kSXNOb3RFbXB0eShvYmopXG59XG5cbmNvbnN0IGZyb21OdWxsYWJsZSA9IHggPT4geCAhPT0gbnVsbCA/IHJpZ2h0KHgpIDogbGVmdChudWxsKVxuXG5jb25zdCBmaW5kSW5PYmogPSAob2JqLCB2YWwsIGVycm9yID0gbnVsbCkgPT4ge1xuICBjb25zdCBmb3VuZCA9IG9ialt2YWxdXG4gIHJldHVybiBmb3VuZCA/IHJpZ2h0KGZvdW5kKSA6IGxlZnQoZXJyb3IpXG59XG5jb25zdCBwdWxsUm91dGVJbmZvID0gKCkgPT4ge1xuICBjb25zdCBzdHIgPSBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2gpXG4gIGNvbnN0IHJvdXRlSWQgPSBwdWxsTWFpblJvdXRlKHN0cilcbiAgY29uc3QgcGFyYW1zID0gcHVsbFBhcmFtcyhzdHIpXG4gIHJldHVybiB7IHJvdXRlSWQsIHBhcmFtcyB9XG59XG5cbmZ1bmN0aW9uIGdldEFsbE1ldGhvZE5hbWVzKGluc3RhbmNlLCBvbWl0dGVkTWV0aG9kcyA9IFtdKSB7XG4gIC8vIE9wdGlvbmFsbHkgcmVuYW1lIGBpbnN0YW5jZWAgdG8gc29tZXRoaW5nIG1vcmUgZGVzY3JpcHRpdmU6XG4gIGNvbnN0IGJhc2VDbGFzc01ldGhvZHNBcnIgPSBbJ2xlbmd0aCcsICduYW1lJywgJ3Byb3RvdHlwZScsICdjb25zdHJ1Y3RvciddXG4gIGNvbnN0IGNvbWJpbmVkT21pdHRlZE1ldGhvZHMgPSBjb25jYXQoYmFzZUNsYXNzTWV0aG9kc0Fyciwgb21pdHRlZE1ldGhvZHMpXG5cbiAgLy8gRmlsdGVyIG91dCBvbWl0dGVkXG4gIGNvbnN0IG9taXRQcm9wc0Zyb21BcnIgPSBjb21wb3NlKHdpdGhvdXQoY29tYmluZWRPbWl0dGVkTWV0aG9kcyksIHVuaXEpXG5cbiAgLy8gUHVsbCBvdXQgaW5zdGFuY2UgbWV0aG9kc1xuICBjb25zdCBtZXRob2RzID0gb21pdFByb3BzRnJvbUFycihcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpXG4gIClcblxuICAvLyBQdWxsIG91dCBzdGF0aWMgbWV0aG9kc1xuICBjb25zdCBzdGF0aWNNZXRob2RzID0gb21pdFByb3BzRnJvbUFycihcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZS5jb25zdHJ1Y3RvcilcbiAgKVxuXG4gIGNvbnN0IGFsbE1ldGhvZHMgPSBjb25jYXQobWV0aG9kcywgc3RhdGljTWV0aG9kcylcblxuICByZXR1cm4geyBtZXRob2RzLCBzdGF0aWNNZXRob2RzLCBhbGxNZXRob2RzIH1cbn1cblxuLyogY29uc3QgZ2V0QWxsTWV0aG9kTmFtZXMzID0gKF90aGlzID0gdGhpcywgb21pdHRlZE1ldGhvZHMgPSBbXSkgPT4ge1xuICBjb25zdCBnZXRQcm9wTmFtZXNBcnIgPSAob2JqID0gdGhpcywgb21pdHRlZE1ldGhvZHMgPSBbXSkgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopXG4gIH1cbiAgLy8gRmlsdGVyIE1ldGhvZHNcbiAgY29uc3QgYmFzZUNsYXNzTWV0aG9kc0FyciA9IFsnbGVuZ3RoJywgJ25hbWUnLCAncHJvdG90eXBlJywgJ2NvbnN0cnVjdG9yJ11cbiAgb21pdHRlZE1ldGhvZHMgPSBjb25jYXQoYmFzZUNsYXNzTWV0aG9kc0Fyciwgb21pdHRlZE1ldGhvZHMpXG4gIGNvbnN0IG9taXRQcm9wc0Zyb21BcnIgPSBjb21wb3NlKHdpdGhvdXQob21pdHRlZE1ldGhvZHMpLCB1bmlxKVxuXG4gIC8vIFBVTEwgT1VUIE1FVEhPRCBOQU1FU1xuICBjb25zdCBtZXRob2RzID0gb21pdFByb3BzRnJvbUFycihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhfdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpKVxuICBjb25zdCBzdGF0aWNNZXRob2RzID0gb21pdFByb3BzRnJvbUFycihnZXRQcm9wTmFtZXNBcnIoX3RoaXMuY29uc3RydWN0b3IpKVxuICBjb25zdCBhbGxNZXRob2RzID0gY29uY2F0KG1ldGhvZHMsIHN0YXRpY01ldGhvZHMpXG5cbiAgcmV0dXJuIHsgbWV0aG9kcywgc3RhdGljTWV0aG9kcywgYWxsTWV0aG9kcyB9XG4gIC8vIHJldHVybiAnZm4nO1xufSAqL1xuXG4vLyBST1VURSBSRUdFWCBFWFBSRVNTSU9OU1xuY29uc3QgcmVtb3ZlU2xhc2hlcyA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihcXC8pKC4qKS9nLCAnJDInKVxuY29uc3Qgcm91dGVSRSA9IC9eKFxcLz8pKFxcdyopKFxcLz8pKC4qKS9nXG5jb25zdCBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGggPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXigjXFwvPykoLiopLywgJyQyJylcbmNvbnN0IHB1bGxTbGFzaEZyb21QYXRoID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oXFwvPykoLiopLywgJyQyJylcbmNvbnN0IHB1bGxNYWluUm91dGUgPSAoc3RyKSA9PiBzdHIucmVwbGFjZShyb3V0ZVJFLCAnJDInKVxuY29uc3QgcHVsbFBhcmFtcyA9ICAgIChzdHIpID0+IHN0ci5yZXBsYWNlKHJvdXRlUkUsICckNCcpXG5jb25zdCBwdWxsVHJhbnNsYXRlWCA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKikoLC4qKS8sICckNicpXG5jb25zdCBwdWxsVHJhbnNsYXRlWSA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKSguKikvLCAnJDcnKVxuY29uc3QgcHVsbFRyYW5zbGF0ZVlGcm9tSGVhZGVyID0gc3RyID0+IHN0ci5yZXBsYWNlKC9eKHRyYW5zZm9ybTogbWF0cml4KSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCopKFxcKS4qOykvLCAnJDYnKVxuZXhwb3J0IHsgZ2V0Q29uc3RydWN0b3JOYW1lLCBhcnJGcm9tTWFwS2V5cywgZ2V0QWxsTWV0aG9kTmFtZXMsIGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIsIGZpbmRTdHJGcm9tUmVnZXhBcnIsIGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwsIGlzSU9TLCBwdWxsUm91dGVJbmZvLCBwdWxsVHJhbnNsYXRlWUZyb21IZWFkZXIsIHB1bGxTbGFzaEZyb21QYXRoLCBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgsIGNsb3Nlc3QsIHB1bGxUcmFuc2xhdGVZLCBwdWxsVHJhbnNsYXRlWCwgcHVsbE1haW5Sb3V0ZSwgcHVsbFBhcmFtcywgcmlnaHQsIGxlZnQsIGZyb21OdWxsYWJsZSwgZmluZEluT2JqLCBpZk5pbFRoZW5VcGRhdGUsIHJlbW92ZVNsYXNoZXMsIHN1YnNjcmliZUZuLCBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmosIGRlbGF5Q2FsbCB9XG4iLCJpbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSAncmFtZGEnXG5leHBvcnQgZnVuY3Rpb24gZ2MoKSB7XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc3QgbG9vcE0gPSBtID0+IHVuZGVmaW5lZFxuICAgIGZvckVhY2gobG9vcE0sIHRoaXMpXG4gIH1cbiAgc2V0VGltZW91dChjbGVhbnVwLCAxKVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJhc2VDb3JlTWl4aW5zKCkge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZXByb3BzTWFwOiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKVxuICAgICAgY29uc3Qgb2JqS2V5ID0geyB2c2lkOiB0aGlzLnByb3BzLnZzaWQgfVxuICAgICAgd20uc2V0KG9iaktleSwgdGhpcy5wcm9wcylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogb2JqS2V5LFxuICAgICAgICB3ZWFrTWFwOiB3bVxuICAgICAgfVxuICAgIH0sXG4gICAgZ2M6IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yIChjb25zdCBtIGluIHRoaXMpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbbV1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzXG4gICAgfSxcbiAgICBjcmVhdGVJZDogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBsZXQgbnVtID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgxMDAwMDAwMCkgKiAxMDAwMDAwMCk7XG4gICAgICAvLyBjb25zdCBudW0gPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCk7O1xuICAgICAgY29uc3QgbnVtID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvXFxkL2dtLCAnJykuc3Vic3RyaW5nKDEsIDgpXG4gICAgICByZXR1cm4gbnVtKClcbiAgICAgIC8vIHJldHVybiBgdnNpZC0ke251bSgpfWA7XG4gICAgfSxcbiAgICBzZXRUcmFjZUZ1bmM6IGZ1bmN0aW9uKGRlYnVnKSB7XG4gICAgICByZXR1cm4gZGVidWcgPT09IHRydWVcbiAgICAgICAgPyBjb25zb2xlLmxvZ1xuICAgICAgICA6ICgpID0+IHtcbiAgICAgICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWaWV3U3RyZWFtUGF5bG9hZCB9IGZyb20gJy4uLy4uL3ZpZXdzL3ZpZXctc3RyZWFtLXBheWxvYWQuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlU3RyZWFtc01peGlucygpIHtcbiAgcmV0dXJuIHtcbiAgICB0ZXN0RnVuYzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICBjb25zb2xlLmxvZygnc3RyZWFtIG1peGluIGlzICcsIHN0cilcbiAgICB9LFxuICAgIHNlbmRSb3V0ZVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgLyoqIFRPRE86IEFERCBBIENIRUNLIEZPUiBFTkQgUk9VVEUgQU5EIFRSQU5TRk9STSBUTyBFTVBUWSAqL1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnQ0hBTk5FTF9ST1VURScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpXG4gICAgfSxcbiAgICBzZW5kVUlQYXlsb2FkOiBmdW5jdGlvbihvYnMsIGRhdGEpIHtcbiAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoJ0NIQU5ORUxfVUknLCBvYnMsIGRhdGEsICdzdWJzY3JpYmUnKVxuICAgIH1cbiAgICAvKlxuICAgIHNlbmRJbmZvVG9DaGFubmVsOiBmdW5jdGlvbihjaGFubmVsTmFtZSwgcGF5bG9hZCkge1xuICAgICAgY29uc3QgZ2V0UHJvcCA9IHN0ciA9PiBwcm9wKHN0ciwgdGhpcy5wcm9wcyk7XG4gICAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbE5hbWU7XG4gICAgICBsZXQgc3JjRWxlbWVudCA9IHtcbiAgICAgICAgdnNpZDogZ2V0UHJvcCgndnNpZCcpLFxuICAgICAgICBlbDogZ2V0UHJvcCgnZWwnKSxcbiAgICAgICAgdmlld05hbWU6IGdldFByb3AoJ25hbWUnKVxuICAgICAgfTtcbiAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICBwYXlsb2FkLCBjaGFubmVsLCBzcmNFbGVtZW50XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZChjaGFubmVsTmFtZSwgbmV3IG9mKCcnKSwgZGF0YSxcbiAgICAgICAgJ3N1YnNjcmliZScpO1xuICAgIH0sXG4gICAgKi9cbiAgICAvKiAgICBzZW5kTGlmZVN0cmVhbVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnTElGRVNUUkVBTScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpO1xuICAgIH0sXG5cbiAgICBjcmVhdGVMaWZlU3RyZWFtUGF5bG9hZDogZnVuY3Rpb24oU1RFUCwgZGF0YSA9IHt9LCB0eXBlID0gJ3BhcmVudCcpIHtcbiAgICAgIGxldCB2aWV3SWQgPSBgJHt0aGlzLnByb3BzLm5hbWV9OiAke3RoaXMucHJvcHMudnNpZH1gO1xuICAgICAgcmV0dXJuIG5ldyBMaWZlc3RyZWFtUGF5bG9hZCgnTElGRVNUUkVBTScsIFNURVAsIHR5cGUsIHZpZXdJZCwgZGF0YSkuZGF0YTtcbiAgICB9ICovXG4gIH1cbn1cbiIsImltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuLi92aWV3cy92aWV3LXN0cmVhbS5qcydcbmltcG9ydCB7IGN1cnJ5IH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgUm91dGVDaGFubmVsVXBkYXRlciB7XG4gIGNvbnN0cnVjdG9yKGN4dCkge1xuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcoY3h0LnByb3BzLm5hbWUpXG4gICAgY29uc3QgaWQgPSBgJHtuYW1lfV9ST1VURV9VUERBVEVSYFxuXG4gICAgY29uc3Qgc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSA9IGN1cnJ5KFJvdXRlQ2hhbm5lbFVwZGF0ZXIuY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iailcbiAgICByZXR1cm4gc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSh7IGlkLCBuYW1lIH0pXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iaihwcm9wcywgZGF0YSkge1xuICAgIGNvbnN0IHsgbmFtZSwgaWQgfSAgPSBwcm9wc1xuICAgIGNvbnN0IHBheWxvYWQgPSBkYXRhXG4gICAgY29uc3QgdnMgPSBuZXcgVmlld1N0cmVhbSh7XG4gICAgICBpZCwgbmFtZSwgZGF0YVxuICAgIH0pXG5cbiAgICB2cy5vblJlbmRlcmVkID0gKCkgPT4ge1xuICAgICAgdnMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfUk9VVEUnLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIHZzLmFmdGVyQnJvYWRjYXN0RXZlbnRzID0gKCkgPT4ge1xuICAgICAgdnMuZGlzcG9zZVZpZXdTdHJlYW0oKVxuICAgIH1cblxuICAgIHZzLmFwcGVuZFRvTnVsbCgpXG4gIH1cbn1cbiIsImltcG9ydCB7IGNsb25lLCBjb21wb3NlLCBmcm9tUGFpcnMsIGlzLCBwYXRoLCB0b1BhaXJzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5jb25zdCBnZXRQcm9wVHlwZSA9IChwcnApID0+IHtcbiAgbGV0IHR5cGUgPSB0eXBlb2YgcHJwXG4gIGlmIChbJ251bWJlcicsICdib29sZWFuJywgJ3N0cmluZyddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgdHlwZSA9ICdwcmltaXRpdmUnXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcnApKSB7XG4gICAgICB0eXBlID0gJ2FycmF5J1xuICAgIH0gZWxzZSBpZiAocHJwID09PSBudWxsKSB7XG4gICAgICB0eXBlID0gJ3VuZGVmaW5lZCdcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHR5cGVcbn1cblxuY29uc3QgY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqID0gKHByb3h5T2JqLCBwcm94eVJldml2ZXJNZXRob2QpID0+IHtcbiAgY29uc3QgeyBfX3Byb3h5X19wcm94eU5hbWUgfSA9IHByb3h5T2JqXG5cbiAgaWYgKF9fcHJveHlfX3Byb3h5TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5lcnJvcignb2JqZWN0IGlzIG5vdCBwcm94eSBvYmplY3QgJywgcHJveHlPYmopXG4gIH1cblxuICBjb25zdCBjbG9uZU5lc3RlZFByb3h5T2JqID0gKHRhcmdldCwgcGF0aEFycikgPT4ge1xuICAgIGNvbnN0IG5lc3RlZFByb3h5T2JqID0gcGF0aChwYXRoQXJyLCBwcm94eU9iailcbiAgICBjb25zdCB7IF9fcHJveHlfX2lzUHJveHksIF9fcHJveHlfX3Byb3BzIH0gPSBuZXN0ZWRQcm94eU9ialxuICAgIHJldHVybiBfX3Byb3h5X19pc1Byb3h5ID8gcHJveHlSZXZpdmVyTWV0aG9kKHRhcmdldCwgX19wcm94eV9fcHJvcHMpIDogdGFyZ2V0XG4gIH1cblxuICBjb25zdCByb290T2JqID0gY2xvbmVOZXN0ZWRQcm94eU9iaihjbG9uZShwcm94eU9iaiksIFtdKVxuXG4gIGNvbnN0IHByb3h5SXRlcmFibGUgPSAoaXRlck9iaiwgaXRlclBhdGgpID0+IHtcbiAgICBjb25zdCBkYXRhUGF0aCA9IGl0ZXJQYXRoIHx8IFtdXG4gICAgY29uc3QgbG9vcE9iaiA9IChba2V5LCBwcm9wXSkgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IGdldFByb3BUeXBlKHByb3ApXG4gICAgICBjb25zdCBjbG9uZWRQYXRoID0gWy4uLmRhdGFQYXRoXVxuICAgICAgY2xvbmVkUGF0aC5wdXNoKGtleSlcbiAgICAgIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGl0ZXJPYmpba2V5XSA9IGNsb25lTmVzdGVkUHJveHlPYmoocHJvcCwgY2xvbmVkUGF0aClcbiAgICAgICAgcHJveHlJdGVyYWJsZShwcm9wLCBjbG9uZWRQYXRoKVxuICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuZW50cmllcyhpdGVyT2JqKS5mb3JFYWNoKGxvb3BPYmopXG4gIH1cblxuICBwcm94eUl0ZXJhYmxlKHJvb3RPYmopXG4gIC8vIGNvbnNvbGUudGltZUVuZCgncHJveGlmeTInKTtcblxuICByZXR1cm4gcm9vdE9ialxufVxuXG5leHBvcnQgY29uc3Qgc2FmZUNsb25lID0gZnVuY3Rpb24obykge1xuICBjb25zdCB7IF9fcHJveHlfX3Byb3h5TmFtZSB9ID0gb1xuICBpZiAoX19wcm94eV9fcHJveHlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBwcm94eVJldml2ZXJNZXRob2QgPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0UHJveHlSZXZpdmVyKF9fcHJveHlfX3Byb3h5TmFtZSlcbiAgICBpZiAodHlwZW9mIHByb3h5UmV2aXZlck1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNtc0RhdGFSZXZpdmVOZXN0ZWRQcm94eU9iaihvLCBwcm94eVJldml2ZXJNZXRob2QpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSlcbiAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QpXG4gIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gIGNvbnN0IGlzSXRlcmFibGUgPSBpc0l0ZXIobylcbiAgcmV0dXJuIGlzSXRlcmFibGUgPyBjb21wb3NlKGZyb21QYWlycywgdG9QYWlycywgY2xvbmUpKG8pIDogY2xvbmUobylcbn1cbiIsIi8vIHNyYy91dGlscy9zYW5pdGl6ZS1kYXRhLmpzXG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmxldCBfc2FuaXRpemVEYXRhXG5sZXQgaXNDb25maWd1cmVkID0gZmFsc2VcbmxldCBnbG9iYWxEaXNhYmxlID0gZmFsc2VcbmxldCBmb3JjZVN0cmljdCA9IGZhbHNlIC8vIGRlcHJlY2F0ZWQgbGVnYWN5IHRvZ2dsZSwgc2VlIHNldFNhbml0aXplRGF0YUZvcmNlU3RyaWN0XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVVJJIHBvbGljeVxuICpcbiAqIEFsbG93cyBodHRwcz8sIG1haWx0bzosIHRlbDosIGRhdGE6aW1hZ2UvIGFuZCBhbnkgc2NoZW1lLWxlc3NcbiAqIChyZWxhdGl2ZSwgZnJhZ21lbnQsIHF1ZXJ5LCBwcm90b2NvbC1yZWxhdGl2ZSkgVVJMLlxuICogQWxsIG90aGVyIHNjaGVtZXMgKGphdmFzY3JpcHQ6LCB2YnNjcmlwdDosIGRhdGE6dGV4dC9odG1sLCBldGMuKSBmYWlsLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgU0FGRV9VUklfUkVHRVhQID0gL14oPzooPzpodHRwcz98bWFpbHRvfHRlbCk6fGRhdGE6aW1hZ2VcXC98KD8hW2Etel1bYS16MC05Ky4tXSo6KVtcXHNcXFNdKiQpL2lcblxuLy8gQnJvd3NlcnMgc3RyaXAgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCB3aGl0ZXNwYWNlIHdoZW4gcGFyc2luZyBVUkxcbi8vIHNjaGVtZXMsIHNvIFwiamF2XFx0YXNjcmlwdDpcIiBleGVjdXRlcy4gTm9ybWFsaXplIGJlZm9yZSB0ZXN0aW5nLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gbWF0Y2hpbmcgY29udHJvbCBjaGFycyBpcyB0aGUgcG9pbnRcbmNvbnN0IG5vcm1hbGl6ZVVyaUZvckNoZWNrID0gKHZhbCkgPT4gU3RyaW5nKHZhbCkucmVwbGFjZSgvW1xcdTAwMDAtXFx1MDAyMF0vZywgJycpXG5cbmNvbnN0IGlzU2FmZVVyaSA9ICh2YWwpID0+IFNBRkVfVVJJX1JFR0VYUC50ZXN0KG5vcm1hbGl6ZVVyaUZvckNoZWNrKHZhbCkpXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogTW9kZSBjb25maWd1cmF0aW9uc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgU0FGRV9GT1JfUklDSF9URVhUID0ge1xuICBBTExPV0VEX1RBR1M6IFtcbiAgICAnYScsICdiJywgJ2knLCAnZW0nLCAnc3Ryb25nJywgJ3UnLCAncCcsICdicicsICd1bCcsICdkbCcsICdkdCcsICdkZCcsICdvbCcsICdsaScsICdocicsXG4gICAgJ2Jsb2NrcXVvdGUnLCAncHJlJywgJ2NvZGUnLCAnc3BhbicsICdkaXYnLCAnc2VjdGlvbicsICdhcnRpY2xlJywgJ2FzaWRlJyxcbiAgICAnaGVhZGVyJywgJ2Zvb3RlcicsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsXG4gICAgJ3RhYmxlJywgJ3RoZWFkJywgJ3Rib2R5JywgJ3RyJywgJ3RkJywgJ3RoJywgJ2ltZycsICdmaWd1cmUnLCAnZmlnY2FwdGlvbicsXG4gICAgJ3ZpZGVvJywgJ3NvdXJjZScsICdpZnJhbWUnLCAnaW5wdXQnLCAnYnV0dG9uJywgJ2xhYmVsJywgJ2xpbmsnXG4gIF0sXG4gIEFERF9UQUdTOiBbJ2lmcmFtZScsICdpbnB1dCcsICdidXR0b24nLCAnbGluayddLFxuICBBTExPV0VEX0FUVFI6IFtcbiAgICAnaHJlZicsICdzcmMnLCAnYWx0JywgJ2NsYXNzJywgJ3RpdGxlJywgJ3dpZHRoJywgJ2hlaWdodCcsICdzdHlsZScsICd0YXJnZXQnLCAncmVsJyxcbiAgICAnY29udHJvbHMnLCAncG9zdGVyJywgJ3R5cGUnLCAncm93cycsICdjb2xzJywgJ3NhbmRib3gnXG4gIF0sXG4gIEFMTE9XX0RBVEFfQVRUUjogdHJ1ZSxcbiAgRk9SQklEX0FUVFI6IFsnb25lcnJvcicsICdvbmxvYWQnLCAnb25jbGljaycsICdvbm1vdXNlb3ZlcicsICdvbmZvY3VzJywgJ29uYmx1cicsICdvbmNoYW5nZSddLFxuICBGT1JCSURfVEFHUzogWydzY3JpcHQnLCAnb2JqZWN0JywgJ2VtYmVkJywgJ21ldGEnXSxcbiAgQUxMT1dFRF9VUklfUkVHRVhQOiBTQUZFX1VSSV9SRUdFWFBcbn1cblxuY29uc3QgU0FGRV9GT1JfQVBQID0ge1xuICBGT1JCSURfVEFHUzogWydzY3JpcHQnLCAnaWZyYW1lJywgJ29iamVjdCcsICdlbWJlZCcsICdmb3JtJywgJ2lucHV0JywgJ2J1dHRvbicsICdsaW5rJywgJ21ldGEnXSxcbiAgRk9SQklEX0FUVFI6IFsnb25lcnJvcicsICdvbmxvYWQnLCAnb25jbGljaycsICdvbm1vdXNlb3ZlcicsICdvbmZvY3VzJywgJ29uYmx1cicsICdvbmNoYW5nZSddLFxuICBBTExPV19EQVRBX0FUVFI6IGZhbHNlLFxuICBBTExPV0VEX1VSSV9SRUdFWFA6IFNBRkVfVVJJX1JFR0VYUFxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIElmcmFtZSBwb2xpY3lcbiAqXG4gKiBDb25maWd1cmVkIHZpYSBjb25maWcuaWZyYW1lcyBhdCBTcHluZUFwcC5pbml0OlxuICogICBhbGxvdyAgICAgICAgICDigJQgdW5kZWZpbmVkIChtb2RlIGRlZmF1bHQ6IHJpY2h0ZXh0IHllcywgYXBwIG5vKSB8IHRydWUgfCBmYWxzZVxuICogICBhbGxvd2VkT3JpZ2lucyDigJQgW10gKGFueSBodHRwcyBvcmlnaW4pIHwgWydodHRwczovL3d3dy55b3V0dWJlLmNvbScsIC4uLl1cbiAqICAgc2FuZGJveCAgICAgICAg4oCUIHNhbmRib3ggdmFsdWUgZm9yY2VkIG9udG8gaWZyYW1lcyBsYWNraW5nIG9uZTsgZmFsc2UgPSBuZXZlciBmb3JjZVxuICpcbiAqIEEgcGVyLWNhbGwgb3ZlcnJpZGUgY2FuIGJlIHBhc3NlZCBhcyBvcHRzLmlmcmFtZXMgdG8gc2FuaXRpemVEYXRhLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgREVGQVVMVF9JRlJBTUVfU0FOREJPWCA9ICdhbGxvdy1zY3JpcHRzIGFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXBvcHVwcydcblxubGV0IGNvbmZpZ3VyZWRJZnJhbWVQb2xpY3kgPSB7IGFsbG93OiB1bmRlZmluZWQsIGFsbG93ZWRPcmlnaW5zOiBbXSwgc2FuZGJveDogREVGQVVMVF9JRlJBTUVfU0FOREJPWCB9XG5sZXQgYWN0aXZlSWZyYW1lUG9saWN5ID0gY29uZmlndXJlZElmcmFtZVBvbGljeVxuXG5jb25zdCByZXNvbHZlSWZyYW1lUG9saWN5ID0gKG92ZXJyaWRlKSA9PiB7XG4gIGlmICghb3ZlcnJpZGUpIHJldHVybiBjb25maWd1cmVkSWZyYW1lUG9saWN5XG4gIHJldHVybiB7XG4gICAgYWxsb3c6IG92ZXJyaWRlLmFsbG93ICE9PSB1bmRlZmluZWQgPyBvdmVycmlkZS5hbGxvdyA6IGNvbmZpZ3VyZWRJZnJhbWVQb2xpY3kuYWxsb3csXG4gICAgYWxsb3dlZE9yaWdpbnM6IG92ZXJyaWRlLmFsbG93ZWRPcmlnaW5zICE9PSB1bmRlZmluZWQgPyBvdmVycmlkZS5hbGxvd2VkT3JpZ2lucyA6IGNvbmZpZ3VyZWRJZnJhbWVQb2xpY3kuYWxsb3dlZE9yaWdpbnMsXG4gICAgc2FuZGJveDogb3ZlcnJpZGUuc2FuZGJveCAhPT0gdW5kZWZpbmVkID8gb3ZlcnJpZGUuc2FuZGJveCA6IGNvbmZpZ3VyZWRJZnJhbWVQb2xpY3kuc2FuZGJveFxuICB9XG59XG5cbmNvbnN0IGlmcmFtZUFsbG93ZWRGb3JNb2RlID0gKG1vZGUsIHBvbGljeSA9IGFjdGl2ZUlmcmFtZVBvbGljeSkgPT4ge1xuICBpZiAocG9saWN5LmFsbG93ID09PSB1bmRlZmluZWQpIHJldHVybiBtb2RlID09PSAncmljaHRleHQnXG4gIHJldHVybiBwb2xpY3kuYWxsb3cgPT09IHRydWVcbn1cblxuLy8gbG9jYWxob3N0IGlzIGEgc2VjdXJlIGNvbnRleHQgcGVyIHRoZSBwbGF0Zm9ybSdzIG93biBkZWZpbml0aW9uLlxuY29uc3QgaXNUcnVzdHdvcnRoeUxvY2FsSG9zdG5hbWUgPSAoaG9zdG5hbWUpID0+XG4gIGhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fFxuICBob3N0bmFtZSA9PT0gJzEyNy4wLjAuMScgfHxcbiAgaG9zdG5hbWUgPT09ICdbOjoxXScgfHxcbiAgaG9zdG5hbWUuZW5kc1dpdGgoJy5sb2NhbGhvc3QnKVxuXG5jb25zdCBpc0FsbG93ZWRJZnJhbWVTcmMgPSAoc3JjLCBwb2xpY3kgPSBhY3RpdmVJZnJhbWVQb2xpY3kpID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVVyaUZvckNoZWNrKHNyYylcblxuICBsZXQgcmVzb2x2ZWRcbiAgdHJ5IHtcbiAgICByZXNvbHZlZCA9IG5ldyBVUkwobm9ybWFsaXplZCwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIEV4ZWN1dGFibGUvcHNldWRvIHNjaGVtZXMgKGphdmFzY3JpcHQ6LCBkYXRhOiwgdmJzY3JpcHQ6KSByZXNvbHZlIHdpdGhcbiAgLy8gYW4gb3BhcXVlICdudWxsJyBvcmlnaW4gYW5kIGZhaWwgYm90aCBjaGVja3MgYmVsb3cuXG5cbiAgLy8gU2FtZS1vcmlnaW4gZW1iZWRzIChpbmNsdWRpbmcgcmVsYXRpdmUgc3JjKSBhcmUgYXMgdHJ1c3RlZCBhcyB0aGVcbiAgLy8gcGFnZSBpdHNlbGYgYW5kIGFsd2F5cyBwYXNzLCByZWdhcmRsZXNzIG9mIHNjaGVtZSBvciBhbGxvd2xpc3QuXG4gIGlmIChyZXNvbHZlZC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gJiYgcmVzb2x2ZWQub3JpZ2luICE9PSAnbnVsbCcpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gQ3Jvc3Mtb3JpZ2luIGVtYmVkcyBtdXN0IGJlIGh0dHBzLCBvciBodHRwIG9uIGEgbG9jYWxob3N0IGhvc3RcbiAgLy8gKGEgc2VjdXJlIGNvbnRleHQpIHRvIGtlZXAgbG9jYWwgZGV2ZWxvcG1lbnQgZnJpY3Rpb24tZnJlZS5cbiAgY29uc3QgaXNTZWN1cmUgPSByZXNvbHZlZC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgfHxcbiAgICAocmVzb2x2ZWQucHJvdG9jb2wgPT09ICdodHRwOicgJiYgaXNUcnVzdHdvcnRoeUxvY2FsSG9zdG5hbWUocmVzb2x2ZWQuaG9zdG5hbWUpKVxuXG4gIGlmIChpc1NlY3VyZSAhPT0gdHJ1ZSkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qgb3JpZ2lucyA9IHBvbGljeS5hbGxvd2VkT3JpZ2luc1xuICBpZiAoIUFycmF5LmlzQXJyYXkob3JpZ2lucykgfHwgb3JpZ2lucy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIG9yaWdpbnMuc29tZShvID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBVUkwobykub3JpZ2luID09PSByZXNvbHZlZC5vcmlnaW5cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH0pXG59XG5cbmxldCBpZnJhbWVIb29rQWRkZWQgPSBmYWxzZVxuY29uc3QgYWRkSWZyYW1lSGFyZGVuaW5nSG9vayA9ICgpID0+IHtcbiAgaWYgKGlmcmFtZUhvb2tBZGRlZCkgcmV0dXJuXG4gIGlmcmFtZUhvb2tBZGRlZCA9IHRydWVcblxuICBET01QdXJpZnkuYWRkSG9vaygnYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXMnLCAobm9kZSkgPT4ge1xuICAgIGlmICghbm9kZSB8fCBub2RlLnRhZ05hbWUgIT09ICdJRlJBTUUnKSByZXR1cm5cblxuICAgIGNvbnN0IHNyYyA9IG5vZGUuZ2V0QXR0cmlidXRlKCdzcmMnKSB8fCAnJ1xuICAgIGlmIChzcmMgIT09ICcnICYmIGlzQWxsb3dlZElmcmFtZVNyYyhzcmMpICE9PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNQWU5FIFdBUk5JTkc6IGlmcmFtZSBzcmMgXCIke3NyY31cIiB3YXMgcmVtb3ZlZCBieSB0aGUgaWZyYW1lIHBvbGljeSAoc2FtZS1vcmlnaW4sIGh0dHBzLCBvciBhbiBhbGxvd2VkIG9yaWdpbiBpcyByZXF1aXJlZCkuYClcbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdzcmMnKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2FuZGJveCB9ID0gYWN0aXZlSWZyYW1lUG9saWN5XG4gICAgaWYgKHNhbmRib3ggIT09IGZhbHNlICYmIG5vZGUuaGFzQXR0cmlidXRlKCdzYW5kYm94JykgIT09IHRydWUpIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdzYW5kYm94Jywgc2FuZGJveClcbiAgICB9XG4gIH0pXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogRGV0ZXJtaW5lIHNhbml0aXphdGlvbiBtb2RlXG4gKlxuICogRXhwbGljaXQgY29uZmlnIGFsd2F5cyB3aW5zOyB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgb25seSBhXG4gKiBmYWxsYmFjayB3aGVuIG5vIG1vZGUgaGFzIGJlZW4gY29uZmlndXJlZC5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IFJJQ0hURVhUX0FMSUFTRVMgPSBbJ3JpY2h0ZXh0JywgJ2F1dGhvcmluZycsICdkZXZlbG9wbWVudCddXG5cbmNvbnN0IHJlc29sdmVEZWZhdWx0TW9kZSA9ICgpID0+IHtcbiAgY29uc3QgY29uZmlnTW9kZSA9IFNweW5lQXBwUHJvcGVydGllcz8ubW9kZVxuXG4gIGlmIChSSUNIVEVYVF9BTElBU0VTLmluY2x1ZGVzKGNvbmZpZ01vZGUpKSByZXR1cm4gJ3JpY2h0ZXh0J1xuICBpZiAoY29uZmlnTW9kZSA9PT0gJ2FwcCcpIHJldHVybiAnYXBwJ1xuXG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzPy5lbnY/Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICByZXR1cm4gJ3JpY2h0ZXh0J1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIG5vIGJ1aWxkLXRpbWUgZW52IGF2YWlsYWJsZVxuICB9XG5cbiAgcmV0dXJuICdhcHAnXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgYnVpbGRNb2RlQ29uZmlnID0gKG1vZGUpID0+IHtcbiAgY29uc3QgYmFzZSA9IG1vZGUgPT09ICdyaWNodGV4dCcgPyBTQUZFX0ZPUl9SSUNIX1RFWFQgOiBTQUZFX0ZPUl9BUFBcbiAgY29uc3QgYWxsb3dJZnJhbWUgPSBpZnJhbWVBbGxvd2VkRm9yTW9kZShtb2RlKVxuXG4gIGlmIChtb2RlID09PSAncmljaHRleHQnICYmIGFsbG93SWZyYW1lICE9PSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJhc2UsXG4gICAgICBBTExPV0VEX1RBR1M6IGJhc2UuQUxMT1dFRF9UQUdTLmZpbHRlcih0ID0+IHQgIT09ICdpZnJhbWUnKSxcbiAgICAgIEFERF9UQUdTOiBiYXNlLkFERF9UQUdTLmZpbHRlcih0ID0+IHQgIT09ICdpZnJhbWUnKSxcbiAgICAgIEZPUkJJRF9UQUdTOiBbLi4uYmFzZS5GT1JCSURfVEFHUywgJ2lmcmFtZSddXG4gICAgfVxuICB9XG5cbiAgaWYgKG1vZGUgPT09ICdhcHAnICYmIGFsbG93SWZyYW1lID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJhc2UsXG4gICAgICBGT1JCSURfVEFHUzogYmFzZS5GT1JCSURfVEFHUy5maWx0ZXIodCA9PiB0ICE9PSAnaWZyYW1lJyksXG4gICAgICBBRERfVEFHUzogWydpZnJhbWUnXSxcbiAgICAgIEFERF9BVFRSOiBbJ3NhbmRib3gnXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYXNlXG59XG5cbmZ1bmN0aW9uIG1ha2VTYW5pdGl6ZUZuKG1vZGUgPSAnYXBwJykge1xuICBjb25zdCBjZmcgPSBidWlsZE1vZGVDb25maWcobW9kZSlcblxuICByZXR1cm4gKGh0bWwpID0+IERPTVB1cmlmeS5zYW5pdGl6ZShodG1sLCBjZmcpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uZmlndXJlIG9uY2VcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNhbml0aXplRGF0YUNvbmZpZ3VyZSA9IChjb25maWcgPSB7fSkgPT4ge1xuICBpZiAoaXNDb25maWd1cmVkKSB7XG4gICAgY29uc29sZS53YXJuKCdzYW5pdGl6ZURhdGEgaXMgYWxyZWFkeSBjb25maWd1cmVkLiBSZWNvbmZpZ3VyYXRpb24gaXMgbm90IGFsbG93ZWQuJylcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgc3RyaWN0ID0gZmFsc2UsIGRpc2FibGVTYW5pdGl6ZSA9IGZhbHNlLCBpZnJhbWVzIH0gPSBjb25maWdcblxuICBnbG9iYWxEaXNhYmxlID0gZGlzYWJsZVNhbml0aXplID09PSB0cnVlXG5cbiAgaWYgKGlmcmFtZXMgJiYgdHlwZW9mIGlmcmFtZXMgPT09ICdvYmplY3QnKSB7XG4gICAgY29uZmlndXJlZElmcmFtZVBvbGljeSA9IHJlc29sdmVJZnJhbWVQb2xpY3koaWZyYW1lcylcbiAgICBhY3RpdmVJZnJhbWVQb2xpY3kgPSBjb25maWd1cmVkSWZyYW1lUG9saWN5XG4gIH1cblxuICBpZiAoZ2xvYmFsRGlzYWJsZSkge1xuICAgIGNvbnNvbGUud2FybignU1BZTkUgU0VDVVJJVFkgV0FSTklORzogQWxsIGRhdGEgc2FuaXRpemF0aW9uIGlzIERJU0FCTEVEIHZpYSBjb25maWcuZGlzYWJsZVNhbml0aXplLiBEbyBub3QgdXNlIHRoaXMgc2V0dGluZyBpbiBwcm9kdWN0aW9uLicpXG4gIH0gZWxzZSB7XG4gICAgYWRkSWZyYW1lSGFyZGVuaW5nSG9vaygpXG4gIH1cblxuICBjb25zdCBwcm9jZXNzRmFjdG9yeSA9IChtb2RlKSA9PiB7XG4gICAgY29uc3Qgc2FuaXRpemVTdHIgPSBtYWtlU2FuaXRpemVGbihtb2RlKVxuICAgIGNvbnN0IHByb2Nlc3MgPSAodmFsKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gdmFsLm1hcChwcm9jZXNzKVxuICAgICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBvdXQgPSB7fVxuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWwpKSB7XG4gICAgICAgICAgb3V0W2tdID0gKHR5cGVvZiB2ID09PSAnc3RyaW5nJykgPyBzYW5pdGl6ZVN0cih2KSA6IHByb2Nlc3ModilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0XG4gICAgICB9XG4gICAgICByZXR1cm4gKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSA/IHNhbml0aXplU3RyKHZhbCkgOiB2YWxcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NcbiAgfVxuXG4gIF9zYW5pdGl6ZURhdGEgPSAoZGF0YSwgb3B0cyA9IHt9KSA9PiB7XG4gICAgY29uc3QgeyBkaXNhYmxlU2FuaXRpemU6IGNhbGxEaXNhYmxlID0gZmFsc2UsIG1vZGUsIGlmcmFtZXM6IGlmcmFtZXNPdmVycmlkZSB9ID0gb3B0c1xuICAgIGlmIChnbG9iYWxEaXNhYmxlIHx8IGNhbGxEaXNhYmxlKSByZXR1cm4gZGF0YVxuXG4gICAgY29uc3QgbGVnYWN5U3RyaWN0ID0gZm9yY2VTdHJpY3QgfHwgc3RyaWN0XG4gICAgY29uc3QgZWZmZWN0aXZlTW9kZSA9IG1vZGUgfHwgKGxlZ2FjeVN0cmljdCA/ICdhcHAnIDogcmVzb2x2ZURlZmF1bHRNb2RlKCkpXG5cbiAgICAvLyBTYW5pdGl6YXRpb24gaXMgc3luY2hyb25vdXMsIHNvIHRoZSBwZXItY2FsbCBpZnJhbWUgcG9saWN5IGNhbiBiZVxuICAgIC8vIHNjb3BlZCB3aXRoIGEgc3dhcC1hbmQtcmVzdG9yZSBhcm91bmQgdGhlIHByb2Nlc3NpbmcgcGFzcy5cbiAgICBhY3RpdmVJZnJhbWVQb2xpY3kgPSByZXNvbHZlSWZyYW1lUG9saWN5KGlmcmFtZXNPdmVycmlkZSlcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHByb2Nlc3NGYWN0b3J5KGVmZmVjdGl2ZU1vZGUpKGRhdGEpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFjdGl2ZUlmcmFtZVBvbGljeSA9IGNvbmZpZ3VyZWRJZnJhbWVQb2xpY3lcbiAgICB9XG4gIH1cblxuICBzYW5pdGl6ZURhdGFDb25maWd1cmUuc2FuaXRpemVEYXRhRm9yY2UgPSAoZGF0YSwgbW9kZSkgPT4ge1xuICAgIGlmIChnbG9iYWxEaXNhYmxlKSByZXR1cm4gZGF0YVxuICAgIGNvbnN0IGVmZmVjdGl2ZSA9IG1vZGUgfHwgcmVzb2x2ZURlZmF1bHRNb2RlKClcbiAgICByZXR1cm4gcHJvY2Vzc0ZhY3RvcnkoZWZmZWN0aXZlKShkYXRhKVxuICB9XG5cbiAgaXNDb25maWd1cmVkID0gdHJ1ZVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvbmZpZ3VyYWJsZSBydW50aW1lIHNhbml0aXplclxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3Qgc2FuaXRpemVEYXRhID0gKGRhdGEsIG9wdHMgPSB7fSkgPT4ge1xuICBpZiAoIWlzQ29uZmlndXJlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2FuaXRpemVEYXRhIGlzIG5vdCBjb25maWd1cmVkLiBDYWxsIHNhbml0aXplRGF0YUNvbmZpZ3VyZSgpIGZpcnN0LicpXG4gIH1cbiAgcmV0dXJuIF9zYW5pdGl6ZURhdGEoZGF0YSwgb3B0cylcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBbHdheXMtb24gc2FuaXRpemVyIHdpdGggZW52aXJvbm1lbnQgZGVmYXVsdFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3Qgc2FuaXRpemVEYXRhRm9yY2UgPSAoZGF0YSwgbW9kZSkgPT4ge1xuICBpZiAoIWlzQ29uZmlndXJlZCB8fCAhc2FuaXRpemVEYXRhQ29uZmlndXJlLnNhbml0aXplRGF0YUZvcmNlKSB7XG4gICAgY29uc3Qgc2FuaXRpemVTdHIgPSBtYWtlU2FuaXRpemVGbihtb2RlIHx8IHJlc29sdmVEZWZhdWx0TW9kZSgpKVxuICAgIHJldHVybiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSA/IHNhbml0aXplU3RyKGRhdGEpIDogZGF0YVxuICB9XG4gIHJldHVybiBzYW5pdGl6ZURhdGFDb25maWd1cmUuc2FuaXRpemVEYXRhRm9yY2UoZGF0YSwgbW9kZSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBdHRyaWJ1dGUgc2FuaXRpemVyXG4gKlxuICogVGhlIHNpbmdsZSB2YWx1ZS1sZXZlbCBndWFyZCBmb3IgdGhlIGF0dHJpYnV0ZSBjaGFubmVsXG4gKiAoRG9tRWxlbWVudC5zZXRFbEF0dHJzKS4gQXR0cmlidXRlIG5hbWVzIGFyZSBnYXRlZCBieSB0aGVcbiAqIERvbUVsZW1lbnQvVmlld1N0cmVhbSBhbGxvd2xpc3RzOyB0aGlzIHZhbGlkYXRlcyB2YWx1ZXMuXG4gKlxuICogSW5kZXBlbmRlbnQgb2Ygc2FuaXRpemVEYXRhQ29uZmlndXJlIHNvIGl0IGlzIGFsd2F5cyBhdmFpbGFibGUuXG4gKiBSZXR1cm5zIHsgYWxsb3dlZDogQm9vbGVhbiwgdmFsdWUgfS5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IFVSTF9BVFRSUyA9IFtcbiAgJ2hyZWYnLCAnc3JjJywgJ2FjdGlvbicsICdmb3JtYWN0aW9uJywgJ3BpbmcnLCAncG9zdGVyJyxcbiAgJ2NpdGUnLCAnY29kZWJhc2UnLCAnbWFuaWZlc3QnLCAnaWNvbicsICdiYWNrZ3JvdW5kJ1xuXVxuXG5jb25zdCBzYW5pdGl6ZUF0dHJpYnV0ZSA9IChrZXksIHZhbHVlLCB0YWdOYW1lKSA9PiB7XG4gIGlmIChnbG9iYWxEaXNhYmxlKSByZXR1cm4geyBhbGxvd2VkOiB0cnVlLCB2YWx1ZSB9XG5cbiAgY29uc3QgayA9IFN0cmluZyhrZXkpLnRvTG93ZXJDYXNlKClcbiAgY29uc3QgdGFnID0gU3RyaW5nKHRhZ05hbWUgfHwgJycpLnRvVXBwZXJDYXNlKClcblxuICAvLyBFdmVudC1oYW5kbGVyIGF0dHJpYnV0ZXMgYXJlIG5ldmVyIGxlZ2l0aW1hdGUgaW4gU3B5bmVKUyDigJRcbiAgLy8gYnJvYWRjYXN0RXZlbnRzIGlzIHRoZSBkZWNsYXJlZCBtZWNoYW5pc20gZm9yIGludGVyYWN0aXZpdHkuXG4gIGlmIChrLnN0YXJ0c1dpdGgoJ29uJykpIHtcbiAgICByZXR1cm4geyBhbGxvd2VkOiBmYWxzZSwgdmFsdWUgfVxuICB9XG5cbiAgLy8gc3JjZG9jIGlzIGEgZnVsbCBIVE1MIGRvY3VtZW50OyBzYW5pdGl6ZSBpdCBhcyBvbmUuXG4gIGlmIChrID09PSAnc3JjZG9jJykge1xuICAgIGNvbnN0IGNmZyA9IGJ1aWxkTW9kZUNvbmZpZyhyZXNvbHZlRGVmYXVsdE1vZGUoKSlcbiAgICByZXR1cm4geyBhbGxvd2VkOiB0cnVlLCB2YWx1ZTogRE9NUHVyaWZ5LnNhbml0aXplKFN0cmluZyh2YWx1ZSksIGNmZykgfVxuICB9XG5cbiAgLy8gSWZyYW1lIHNyYyBmb2xsb3dzIHRoZSBpZnJhbWUgcG9saWN5OiBodHRwcy1vbmx5LCBwbHVzIHRoZVxuICAvLyBjb25maWd1cmVkIG9yaWdpbiBhbGxvd2xpc3QuXG4gIGlmICh0YWcgPT09ICdJRlJBTUUnICYmIGsgPT09ICdzcmMnKSB7XG4gICAgcmV0dXJuIHsgYWxsb3dlZDogaXNBbGxvd2VkSWZyYW1lU3JjKHZhbHVlLCBjb25maWd1cmVkSWZyYW1lUG9saWN5KSwgdmFsdWUgfVxuICB9XG5cbiAgaWYgKFVSTF9BVFRSUy5pbmNsdWRlcyhrKSAmJiBpc1NhZmVVcmkodmFsdWUpICE9PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYWxsb3dlZDogZmFsc2UsIHZhbHVlIH1cbiAgfVxuXG4gIHJldHVybiB7IGFsbG93ZWQ6IHRydWUsIHZhbHVlIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBjb25maWd1cmVkIGlmcmFtZSBzYW5kYm94IHBvbGljeSB0byBhbiBlbGVtZW50IGNyZWF0ZWRcbiAqIHRocm91Z2ggdGhlIGF0dHJpYnV0ZSBjaGFubmVsIChEb21FbGVtZW50KSwgbWlycm9yaW5nIHRoZSBET01QdXJpZnlcbiAqIGhvb2sgdGhhdCBndWFyZHMgcGFyc2VkIEhUTUwuXG4gKi9cbmNvbnN0IGFwcGx5SWZyYW1lSGFyZGVuaW5nID0gKGVsKSA9PiB7XG4gIGlmIChnbG9iYWxEaXNhYmxlIHx8ICFlbCB8fCBlbC50YWdOYW1lICE9PSAnSUZSQU1FJykgcmV0dXJuIGVsXG5cbiAgY29uc3QgeyBzYW5kYm94IH0gPSBjb25maWd1cmVkSWZyYW1lUG9saWN5XG4gIGlmIChzYW5kYm94ICE9PSBmYWxzZSAmJiBlbC5oYXNBdHRyaWJ1dGUoJ3NhbmRib3gnKSAhPT0gdHJ1ZSkge1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsIHNhbmRib3gpXG4gIH1cblxuICByZXR1cm4gZWxcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFdmVudC10YXJnZXQgc2FuaXRpemVyXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBzYW5pdGl6ZUV2ZW50VGFyZ2V0ID0gKGVsLCBtb2RlKSA9PiB7XG4gIGlmICghZWwgfHwgZ2xvYmFsRGlzYWJsZSkgcmV0dXJuXG4gIGNvbnN0IGVmZmVjdGl2ZU1vZGUgPSBtb2RlIHx8IHJlc29sdmVEZWZhdWx0TW9kZSgpXG4gIGNvbnN0IHNhbml0aXplU3RyID0gbWFrZVNhbml0aXplRm4oZWZmZWN0aXZlTW9kZSlcbiAgY29uc3QgVU5TQUZFX1JFID0gLzwoPzpzY3JpcHR8b2JqZWN0fGVtYmVkfGZvcm18aW5wdXR8YnV0dG9ufGxpbmt8bWV0YSlbXj5dKj58b25cXHcrPXxqYXZhc2NyaXB0Oi9pXG4gIGlmICh0eXBlb2YgZWwudmFsdWUgPT09ICdzdHJpbmcnICYmIFVOU0FGRV9SRS50ZXN0KGVsLnZhbHVlKSkge1xuICAgIGNvbnN0IGNsZWFuID0gc2FuaXRpemVTdHIoZWwudmFsdWUpXG4gICAgaWYgKGNsZWFuICE9PSBlbC52YWx1ZSkgZWwudmFsdWUgPSBjbGVhblxuICB9XG4gIGlmIChlbC5pc0NvbnRlbnRFZGl0YWJsZSAmJiB0eXBlb2YgZWwuaW5uZXJIVE1MID09PSAnc3RyaW5nJyAmJiBVTlNBRkVfUkUudGVzdChlbC5pbm5lckhUTUwpKSB7XG4gICAgY29uc3QgY2xlYW4gPSBzYW5pdGl6ZVN0cihlbC5pbm5lckhUTUwpXG4gICAgaWYgKGNsZWFuICE9PSBlbC5pbm5lckhUTUwpIGVsLmlubmVySFRNTCA9IGNsZWFuXG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBAZGVwcmVjYXRlZCBVc2Ugc2FuaXRpemVEYXRhKGRhdGEsIHsgbW9kZTogJ2FwcCcgfSkgcGVyIGNhbGwsIG9yIHNldFxuICogY29uZmlnLm1vZGUgYXQgU3B5bmVBcHAuaW5pdC4gUmV0YWluZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBzZXRTYW5pdGl6ZURhdGFGb3JjZVN0cmljdCA9IChib29sID0gdHJ1ZSkgPT4ge1xuICBjb25zb2xlLndhcm4oJ1NQWU5FIERFUFJFQ0FUSU9OOiBzZXRTYW5pdGl6ZURhdGFGb3JjZVN0cmljdCBpcyBkZXByZWNhdGVkLiBQYXNzIHsgbW9kZTogXCJhcHBcIiB9IHRvIHNhbml0aXplRGF0YSwgb3Igc2V0IGNvbmZpZy5tb2RlIGluIFNweW5lQXBwLmluaXQuJylcbiAgZm9yY2VTdHJpY3QgPSAhIWJvb2xcbn1cblxuZXhwb3J0IHtcbiAgc2FuaXRpemVEYXRhQ29uZmlndXJlLFxuICBzYW5pdGl6ZURhdGEsXG4gIHNhbml0aXplRGF0YUZvcmNlLFxuICBzYW5pdGl6ZUF0dHJpYnV0ZSxcbiAgYXBwbHlJZnJhbWVIYXJkZW5pbmcsXG4gIHNhbml0aXplRXZlbnRUYXJnZXQsXG4gIHNldFNhbml0aXplRGF0YUZvcmNlU3RyaWN0XG59XG5leHBvcnQgZGVmYXVsdCBzYW5pdGl6ZURhdGFcbiIsImltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5J1xuXG5sZXQgX3Nhbml0aXplSFRNTFxubGV0IGlzQ29uZmlndXJlZCA9IGZhbHNlXG5cbi8qKlxuICogQ29uZmlndXJlcyB0aGUgdGVtcGxhdGUtbGF5ZXIgc2FuaXRpemVyLlxuICpcbiAqIFNhbml0aXphdGlvbiBpcyBhbHdheXMgb24uIFRoZSB0aHJlZS1sZXZlbCBwb3N0dXJlOlxuICpcbiAqICAgbW9kZTogJ2FwcCcgKGRlZmF1bHQpICAg4oCUIERPTVB1cmlmeSB3aXRoIGl0cyBzdGFuZGFyZCBhbGxvd2xpc3RcbiAqICAgbW9kZTogJ3JpY2h0ZXh0JyAgICAgICAg4oCUIGFkZGl0aW9uYWxseSBhZG1pdHMgaWZyYW1lL2xpbmsgKCsgc2FuZGJveCBhdHRyKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIENNUy9hdXRob3JpbmcgY29udGVudCBzdXJ2aXZlcyB0ZW1wbGF0ZXNcbiAqICAgc3RyaWN0OiB0cnVlICAgICAgICAgICAg4oCUIGFkZGl0aW9uYWxseSByZWdpc3RlcnMgYSBUcnVzdGVkIFR5cGVzICdkZWZhdWx0J1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeSBzbyBET00gc2lua3Mgcm91dGUgdGhyb3VnaCBzYW5pdGl6YXRpb25cbiAqICAgZGlzYWJsZVNhbml0aXplOiB0cnVlICAg4oCUIHRoZSBvbmx5IGZ1bGwgcGFzc3Rocm91Z2g7IGxvZ3MgYSBzZWN1cml0eSB3YXJuaW5nXG4gKi9cbmNvbnN0IHNhbml0aXplSFRNTENvbmZpZ3VyZSA9IChjb25maWcgPSB7fSkgPT4ge1xuICBpZiAoaXNDb25maWd1cmVkKSB7XG4gICAgY29uc29sZS53YXJuKCdzYW5pdGl6ZUhUTUwgaXMgYWxyZWFkeSBjb25maWd1cmVkLiBSZWNvbmZpZ3VyYXRpb24gaXMgbm90IGFsbG93ZWQuJylcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBzdHJpY3QgPSBmYWxzZSxcbiAgICBtb2RlID0gJ2FwcCcsXG4gICAgZGlzYWJsZVNhbml0aXplID0gZmFsc2UsXG4gICAgYWxsb3dUYXJnZXRBdHRyID0gdHJ1ZSxcbiAgICBhZGROb29wZW5lciA9IHRydWUsXG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICBpZnJhbWVzID0ge31cbiAgfSA9IGNvbmZpZ1xuXG4gIGlmIChkaXNhYmxlU2FuaXRpemUgPT09IHRydWUpIHtcbiAgICBjb25zb2xlLndhcm4oJ1NQWU5FIFNFQ1VSSVRZIFdBUk5JTkc6IEFsbCBIVE1MIHNhbml0aXphdGlvbiBpcyBESVNBQkxFRCB2aWEgY29uZmlnLmRpc2FibGVTYW5pdGl6ZS4gRG8gbm90IHVzZSB0aGlzIHNldHRpbmcgaW4gcHJvZHVjdGlvbi4nKVxuICAgIF9zYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4gaHRtbFxuICAgIGlzQ29uZmlndXJlZCA9IHRydWVcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGlzUmljaHRleHQgPSBbJ3JpY2h0ZXh0JywgJ2F1dGhvcmluZycsICdkZXZlbG9wbWVudCddLmluY2x1ZGVzKG1vZGUpXG5cbiAgLy8gSWZyYW1lIGFkbWlzc2lvbiBmb2xsb3dzIGNvbmZpZy5pZnJhbWVzLmFsbG93IHdoZW4gc2V0OyBvdGhlcndpc2VcbiAgLy8gdGhlIG1vZGUgZGVmYXVsdCAocmljaHRleHQgeWVzLCBhcHAgbm8pLiBUaGUgRE9NUHVyaWZ5IGhvb2sgYWRkZWQgYnlcbiAgLy8gc2FuaXRpemUtZGF0YSBlbmZvcmNlcyBzcmMgb3JpZ2luIGFuZCBzYW5kYm94IHBvbGljeSBvbiB3aGF0ZXZlclxuICAvLyBpcyBhZG1pdHRlZCBoZXJlLlxuICBjb25zdCBhbGxvd0lmcmFtZSA9IGlmcmFtZXMuYWxsb3cgIT09IHVuZGVmaW5lZCA/IGlmcmFtZXMuYWxsb3cgPT09IHRydWUgOiBpc1JpY2h0ZXh0XG5cbiAgY29uc3QgZG9tUHVyaWZ5Q29uZmlnID0ge1xuICAgIFJFVFVSTl9UUlVTVEVEX1RZUEU6IGZhbHNlLFxuICAgIEFERF9UQUdTOiBbXG4gICAgICAuLi4oYWxsb3dJZnJhbWUgPyBbJ2lmcmFtZSddIDogW10pLFxuICAgICAgLi4uKGlzUmljaHRleHQgPyBbJ2xpbmsnXSA6IFtdKVxuICAgIF0sXG4gICAgQUREX0FUVFI6IFtcbiAgICAgIC4uLihhbGxvd1RhcmdldEF0dHIgPyBbJ3RhcmdldCddIDogW10pLFxuICAgICAgLi4uKGFsbG93SWZyYW1lID8gWydzYW5kYm94J10gOiBbXSlcbiAgICBdLFxuICAgIC4uLihhbGxvd0lmcmFtZSAhPT0gdHJ1ZSAmJiBpc1JpY2h0ZXh0ID8geyBGT1JCSURfVEFHUzogWydpZnJhbWUnXSB9IDoge30pXG4gIH1cblxuICBjb25zdCBzYW5pdGl6ZVdpdGhQb2xpY3kgPSAoaHRtbCkgPT4gRE9NUHVyaWZ5LnNhbml0aXplKGh0bWwsIGRvbVB1cmlmeUNvbmZpZylcblxuICBpZiAoYWxsb3dUYXJnZXRBdHRyKSB7XG4gICAgRE9NUHVyaWZ5LmFkZEhvb2soJ2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzJywgKG5vZGUpID0+IHtcbiAgICAgIGlmICghbm9kZSB8fCB0eXBlb2Ygbm9kZS5nZXRBdHRyaWJ1dGUgIT09ICdmdW5jdGlvbicpIHJldHVyblxuICAgICAgaWYgKG5vZGUudGFnTmFtZSAhPT0gJ0EnKSByZXR1cm5cblxuICAgICAgY29uc3QgaHJlZiA9IG5vZGUuZ2V0QXR0cmlidXRlKCdocmVmJylcbiAgICAgIGNvbnN0IHRhcmdldCA9IG5vZGUuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKVxuXG4gICAgICAvLyByZW1vdmUgdGFyZ2V0IG9uIGFuY2hvcnMgd2l0aG91dCBocmVmXG4gICAgICBpZiAoIWhyZWYgJiYgdGFyZ2V0KSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd0YXJnZXQnKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKCF0YXJnZXQpIHJldHVyblxuXG4gICAgICBjb25zdCB2YWxpZFRhcmdldHMgPSBbJ19ibGFuaycsICdfc2VsZicsICdfcGFyZW50JywgJ190b3AnXVxuICAgICAgaWYgKCF2YWxpZFRhcmdldHMuaW5jbHVkZXModGFyZ2V0KSkge1xuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgndGFyZ2V0JylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0YXJnZXQgPT09ICdfYmxhbmsnICYmIGFkZE5vb3BlbmVyKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZWwgPSBub2RlLmdldEF0dHJpYnV0ZSgncmVsJykgfHwgJydcbiAgICAgICAgY29uc3QgcmVsUGFydHMgPSBjdXJyZW50UmVsLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIGNvbnN0IHJlbFNldCA9IG5ldyBTZXQocmVsUGFydHMpXG5cbiAgICAgICAgcmVsU2V0LmFkZCgnbm9vcGVuZXInKVxuICAgICAgICByZWxTZXQuYWRkKCdub3JlZmVycmVyJylcblxuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgncmVsJywgQXJyYXkuZnJvbShyZWxTZXQpLmpvaW4oJyAnKSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgX3Nhbml0aXplSFRNTCA9IHNhbml0aXplV2l0aFBvbGljeVxuXG4gIGlmIChzdHJpY3QgPT09IHRydWUgJiYgd2luZG93LnRydXN0ZWRUeXBlcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwb2xpY3kgPSB3aW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSgnZGVmYXVsdCcsIHtcbiAgICAgICAgY3JlYXRlSFRNTDogKHRvRXNjYXBlKSA9PiBzYW5pdGl6ZVdpdGhQb2xpY3kodG9Fc2NhcGUpXG4gICAgICB9KVxuXG4gICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IHBvbGljeS5jcmVhdGVIVE1MKGh0bWwpXG5cbiAgICAgIGlmIChkZWJ1ZyA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnU1BZTkU6IFRydXN0ZWQgVHlwZXMgZGVmYXVsdCBwb2xpY3kgcmVnaXN0ZXJlZC4gTm90ZSB0aGF0IGJyb3dzZXIgZW5mb3JjZW1lbnQgYWRkaXRpb25hbGx5IHJlcXVpcmVzIHRoZSBDU1AgaGVhZGVyOiByZXF1aXJlLXRydXN0ZWQtdHlwZXMtZm9yIFxcJ3NjcmlwdFxcJy4nKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdTUFlORSBXQVJOSU5HOiBBIFRydXN0ZWQgVHlwZXMgXCJkZWZhdWx0XCIgcG9saWN5IGFscmVhZHkgZXhpc3RzIG9uIHRoaXMgcGFnZS4gRmFsbGluZyBiYWNrIHRvIGRpcmVjdCBzYW5pdGl6YXRpb24uJywgZXJyKVxuICAgIH1cbiAgfVxuXG4gIGlzQ29uZmlndXJlZCA9IHRydWVcbn1cblxuY29uc3Qgc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IHtcbiAgaWYgKCFpc0NvbmZpZ3VyZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nhbml0aXplSFRNTCBpcyBub3QgY29uZmlndXJlZC4gQ2FsbCBzYW5pdGl6ZUhUTUxDb25maWd1cmUoKSB3aXRoIGFwcHJvcHJpYXRlIGNvbmZpZy4nKVxuICB9XG4gIHJldHVybiBfc2FuaXRpemVIVE1MKGh0bWwpXG59XG5cbmV4cG9ydCB7IHNhbml0aXplSFRNTENvbmZpZ3VyZSB9XG5leHBvcnQgZGVmYXVsdCBzYW5pdGl6ZUhUTUxcbiIsImltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGUgfSBmcm9tICcuL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUuanMnXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIH0gZnJvbSAnLi9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcydcbmltcG9ydCB7IFNweW5lUGx1Z2luc01ldGhvZHMgfSBmcm9tICcuL3NweW5lLXBsdWdpbnMtbWV0aG9kcy5qcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4vZGVlcC1tZXJnZS5qcydcblxubGV0IF9jb25maWdcbmxldCBfY2hhbm5lbHNcbmxldCBfY2hhbm5lbHNNYXBcbmxldCBfaW5pdGlhbGl6ZWRcbmxldCBfZGVidWcgPSB0cnVlXG5sZXQgX2VuYWJsZUNNU1Byb3hpZXMgPSBmYWxzZVxuY29uc3QgX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlID0gW11cbi8qIGVzbGludC1kaXNhYmxlICovXG5sZXQgX2xpbmtzRGF0YVxubGV0IF9uYXZMaW5rc1xubGV0IF9JTUdfUEFUSFxuY29uc3QgX2RvTm90VHJhY2tDaGFubmVsc0FyciA9IFtdXG5jb25zdCBfcHJveGllc01hcCA9IG5ldyBNYXAoKVxuXG5mdW5jdGlvbiByYW5kb202Q2hhcnMoKSB7XG4gIC8vIEZvciBzaW1wbGljaXR5OiBzbGljZSgyLCA4KSBnZXRzIDYgcmFuZG9tIGNoYXJzIGZyb20gdGhlIHN1YnN0cmluZ1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG59XG5cbmNvbnN0IF9zcHluZVBsdWdpbk1ldGhvZHMgPSBuZXcgU3B5bmVQbHVnaW5zTWV0aG9kcygpXG5cbmNsYXNzIFNweW5lQXBwUHJvcGVydGllc0NsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgX2luaXRpYWxpemVkID0gZmFsc2VcbiAgfVxuXG4gIGdldCBjaGFubmVsc01hcCgpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzTWFwXG4gIH1cblxuICBnZXQgaW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIF9pbml0aWFsaXplZFxuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gX2NvbmZpZ1xuICB9XG5cbiAgZ2V0IGRlYnVnKCkge1xuICAgIHJldHVybiBfZGVidWdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24ncyBzYW5pdGl6YXRpb24gbW9kZSwgc2V0IHZpYSBjb25maWcubW9kZSBpbiBTcHluZUFwcC5pbml0LlxuICAgKiAnYXBwJyAoZGVmYXVsdCkgaXMgdGhlIHN0cmljdCBwcm9kdWN0aW9uIHBvc3R1cmU7ICdyaWNodGV4dCcgKGFsaWFzZXM6XG4gICAqICdhdXRob3JpbmcnLCAnZGV2ZWxvcG1lbnQnKSBpcyB0aGUgcGVybWlzc2l2ZSBwb3N0dXJlIGZvciBDTVMgYW5kXG4gICAqIGF1dGhvcmluZyB0b29scy5cbiAgICovXG4gIGdldCBtb2RlKCkge1xuICAgIHJldHVybiBfY29uZmlnPy5tb2RlICE9PSB1bmRlZmluZWQgPyBfY29uZmlnLm1vZGUgOiAnYXBwJ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbW9zdGx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0Pkxpc3RpbmcgdGhlIHJlZ2lzdGVyZWVkIENoYW5uZWxzIGluIHRoZSBicm93c2VyIGNvbnNvbGU8L2g0PiddXG4gICAqIFNweW5lQXBwLmxpc3RDaGFubmVscygpO1xuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgY2hhbm5lbHNcbiAgICovXG4gIHN0YXRpYyBsaXN0Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oX2NoYW5uZWxzLm1hcC5rZXlzKCkpXG4gIH1cblxuICBpbml0aWFsaXplKGRlZmF1bHRDb25maWcgPSB7fSwgY29uZmlnID0ge30sIGNoYW5uZWxzTWFwLCByb3V0ZVV0aWxzKSB7XG4gICAgX2NoYW5uZWxzID0gY2hhbm5lbHNNYXBcbiAgICBfY29uZmlnID0gZGVlcE1lcmdlKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgICAvLyBjb25zb2xlLmxvZyhcImNvbmZpZyBpcyBcIiwgeyBkZWZhdWx0Q29uZmlnLGNvbmZpZyB9KTtcbiAgICBpZiAoX2NvbmZpZy5jaGFubmVscyAmJiBfY29uZmlnLmNoYW5uZWxzLlJPVVRFKSB7XG4gICAgICAvLyBfY29uZmlnID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jb25mb3JtUm91dGVPYmplY3QoX2NvbmZpZylcbiAgICAgIF9jb25maWcgPSByb3V0ZVV0aWxzLmNvbmZvcm1Sb3V0ZU9iamVjdChfY29uZmlnKVxuICAgIH1cbiAgICBfSU1HX1BBVEggPSBfY29uZmlnPy5JTUdfUEFUSFxuICAgIF9kZWJ1ZyA9IF9jb25maWcuZGVidWcgIT09IHVuZGVmaW5lZCA/IF9jb25maWcuZGVidWcgOiBfZGVidWdcbiAgICB0aGlzLmdldENoYW5uZWxBY3Rpb25zID0gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zLmJpbmQoX2NoYW5uZWxzKVxuICAgIHRoaXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscyA9IF9jaGFubmVscy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzLmJpbmQoX2NoYW5uZWxzKVxuICAgIF9pbml0aWFsaXplZCA9IHRydWVcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IF9pbml0aWFsaXplZFxuICAgIHRoaXMuc2V0Q2hhbm5lbHNNYXAoKVxuICAgIGlmIChjb25maWc/LmJhc2VIcmVmKSB7XG4gICAgICB0aGlzLnNldEhlYWRCYXNlSHJlZihjb25maWcuYmFzZUhyZWYpXG4gICAgfVxuICAgIHJldHVybiBfY29uZmlnXG4gIH1cblxuICBzZXRIZWFkQmFzZUhyZWYoc3RyKSB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGJhc2UgZWxlbWVudFxuICAgIGNvbnN0IGJhc2VUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiYXNlJylcbiAgICAvLyBTZXQgdGhlIGhyZWYgYXR0cmlidXRlIHRvIHRoZSBkZXNpcmVkIGJhc2UgVVJMXG4gICAgYmFzZVRhZy5ocmVmID0gc3RyIC8vIFlvdSBjYW4gc2V0IHRoaXMgdG8gYW55IGJhc2UgVVJMXG4gICAgLy8gQXBwZW5kIHRoZSBiYXNlIGVsZW1lbnQgdG8gdGhlIGhlYWQgc2VjdGlvbiBvZiB0aGUgZG9jdW1lbnRcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGJhc2VUYWcpXG4gIH1cblxuICBjb25mb3JtUm91dGVDb25maWcoYWRkNDA0UHJvcHMgPSBmYWxzZSkge1xuICAgIC8qKlxuICAgICAqIFRISVMgTUVUSE9EIElTIFBSSU1BUklMWSBVU0VEIEZPUiBTUEEgR0VOIFNJVEUgR0VORVJBVElPTlxuICAgICAqL1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgX2NvbmZpZyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29uZm9ybVJvdXRlT2JqZWN0KF9jb25maWcsIGFkZDQwNFByb3BzKVxuICB9XG5cbiAgc2V0Q2hhbm5lbHNNYXAoKSB7XG4gICAgY29uc3QgZ2V0U3RyZWFtID0gX2NoYW5uZWxzLmdldFN0cmVhbS5iaW5kKF9jaGFubmVscylcbiAgICBjb25zdCB0ZXN0U3RyZWFtID0gIF9jaGFubmVscy50ZXN0U3RyZWFtLmJpbmQoX2NoYW5uZWxzKVxuICAgIGNvbnN0IGdldFByb3h5U3ViamVjdCA9IF9jaGFubmVscy5nZXRQcm94eVN1YmplY3QuYmluZChfY2hhbm5lbHMpXG5cbiAgICBfY2hhbm5lbHNNYXAgPSB7IGdldFN0cmVhbSwgdGVzdFN0cmVhbSwgZ2V0UHJveHlTdWJqZWN0IH1cbiAgfVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEZJWEVEOiBkdXJhYmxlIHNldFByb3AvZ2V0UHJvcCArIGlzb2xhdGVkIGVwaGVtZXJhbCAocmVhZC1vbmNlKSB0aWVyXG4vL1xuLy8gQ29udHJhY3QgYWZ0ZXIgZml4OlxuLy8gICBzZXRQcm9wKGtleSwgdmFsKSAgICAgICAgICAgIOKGkiBkdXJhYmxlLiBQZXJzaXN0cyBmb3IgdGhlIGFwcCBsaWZlc3Bhbi5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIHZhbC5cbi8vICAgc2V0UHJvcChrZXksIHZhbCwgdHJ1ZSkgICAgICDihpIgZXBoZW1lcmFsLiBSZWFkLW9uY2UgdmlhIGdldFByb3AuIFJldHVybnMgdmFsLlxuLy8gICBjcmVhdGVUZW1wUHJvcCh2YWwpICAgICAgICAgIOKGkiBlcGhlbWVyYWwgd2l0aCBnZW5lcmF0ZWQga2V5LiBSZXR1cm5zIHRoZSBrZXkuXG4vLyAgIGdldFByb3Aoa2V5KSAgICAgICAgICAgICAgICAg4oaSIHJldHVybnMgZHVyYWJsZSB2YWx1ZSBpZiBwcmVzZW50O1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSByZXR1cm5zIGVwaGVtZXJhbCB2YWx1ZSBPTkNFLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZGVsZXRlcyBpdC4gVGhlIHR3byB0aWVycyBjYW5ub3Rcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3cgZWFjaCBvdGhlci5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHNldFByb3Aoa2V5LCB2YWwsIGlzVGVtcCA9IGZhbHNlKSB7XG4gICAgaWYgKGlzVGVtcCkge1xuICAgICAgX2NvbmZpZy5lcGhlbWVyYWxQcm9wc1trZXldID0gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBfY29uZmlnLnRtcFByb3BzW2tleV0gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVggMjogYm90aCB0aWVycyByZXR1cm4gdGhlIHN0b3JlZCB2YWx1ZVxuICB9XG5cbiAgZ2V0UHJvcChrZXkpIHtcbiAgICAvLyBGSVggMSszOiBkdXJhYmxlIHRpZXIgcmVzb2x2ZXMgRklSU1QgYW5kIGluZGVwZW5kZW50bHkuIEEgZHVyYWJsZSB2YWx1ZVxuICAgIC8vIGNhbiBuZXZlciBiZSBzaGFkb3dlZCBvciBjb25zdW1lZCBieSBhIHNhbWUtbmFtZWQgZXBoZW1lcmFsIGtleS5cbiAgICBpZiAoX2NvbmZpZz8udG1wUHJvcHMgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKF9jb25maWcudG1wUHJvcHMsIGtleSkpIHtcbiAgICAgIHJldHVybiBfY29uZmlnLnRtcFByb3BzW2tleV07XG4gICAgfVxuICAgIC8vIEVwaGVtZXJhbCB0aWVyOiByZWFkLW9uY2UuIE9ubHkgcmVhY2hlZCB3aGVuIG5vIGR1cmFibGUgdmFsdWUgZXhpc3RzLlxuICAgIGlmIChfY29uZmlnPy5lcGhlbWVyYWxQcm9wcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoX2NvbmZpZy5lcGhlbWVyYWxQcm9wcywga2V5KSkge1xuICAgICAgY29uc3QgdGVtcFZhbCA9IF9jb25maWcuZXBoZW1lcmFsUHJvcHNba2V5XTtcbiAgICAgIGRlbGV0ZSBfY29uZmlnLmVwaGVtZXJhbFByb3BzW2tleV07XG4gICAgICByZXR1cm4gdGVtcFZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNyZWF0ZVRlbXBQcm9wKHZhbHVlKSB7XG4gICAgY29uc3Qga2V5ID0gcmFuZG9tNkNoYXJzKCk7XG4gICAgdGhpcy5zZXRQcm9wKGtleSwgdmFsdWUsIHRydWUpOyAgIC8vIGlzVGVtcCA9IHRydWVcbiAgICByZXR1cm4ga2V5OyAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyBrZXkgKGNvcnJlY3Qg4oCUIGNhbGxlciBuZWVkcyBpdCB0byByZWFkIGJhY2spXG4gIH1cblxuXG4gIHNldENoYW5uZWxDb25maWcoY2hhbm5lbE5hbWUsIGNvbmZpZykge1xuICAgIF9jb25maWcuY2hhbm5lbHNbY2hhbm5lbE5hbWVdID0gY29uZmlnXG4gICAgcmV0dXJuIF9jb25maWcuY2hhbm5lbHNbY2hhbm5lbE5hbWVdXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGNoZWNrIGluIHRoZSBjb25zb2xlIG9yIGluIHRoZSBjb2RlIHdoYXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGJlIGxpc3RlbmVkIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbm5lbE5hbWVcbiAgICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiBBY3Rpb25zIHRoYXQgY2FuIGJlIGxpc3RlbmVkIHRvXG4gICAqL1xuICAvKiAgZ2V0Q2hhbm5lbEFjdGlvbnMoY2hhbm5lbE5hbWUpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zKGNoYW5uZWxOYW1lKTtcbiAgfSAqL1xuXG4gIGdldENoYW5uZWxDb25maWcoY2hhbm5lbE5hbWUsIGNvbmZpZyA9IF9jb25maWcpIHtcbiAgICBpZiAoY2hhbm5lbE5hbWUgPT09ICdDSEFOTkVMX1JPVVRFJykge1xuICAgICAgY2hhbm5lbE5hbWUgPSAnUk9VVEUnXG4gICAgfSBlbHNlIGlmIChjaGFubmVsTmFtZSA9PT0gJ0NIQU5ORUxfV0lORE9XJykge1xuICAgICAgY2hhbm5lbE5hbWUgPSAnV0lORE9XJ1xuICAgIH1cblxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCB8fCBfY29uZmlnLmNoYW5uZWxzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3B5bmUgd2FybmluZzogU3B5bmUgY29uZmlnIG9iamVjdCBpcyBlbXB0eSEnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbENvbmZpZyA9IF9jb25maWcuY2hhbm5lbHNbY2hhbm5lbE5hbWVdXG5cbiAgICBpZiAoY2hhbm5lbENvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIHdhcm5pbmc6IFNweW5lIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwsICR7Y2hhbm5lbE5hbWV9IGlzIGVtcHR5IWApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbm5lbENvbmZpZ1xuICB9XG5cbiAgcmVnaXN0ZXJDaGFubmVsKCkge1xuXG4gIH1cblxuICBhZGRQbHVnaW5Db25maWcocGx1Z2luTmFtZSwgcGx1Z2luQ29uZmlnID0ge30pIHtcbiAgICBpZiAoX2NvbmZpZy5wbHVnaW5zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIF9jb25maWcucGx1Z2lucyA9IHt9XG4gICAgfVxuICAgIHRoaXMuYWRkUGx1Z2luTWV0aG9kcyhwbHVnaW5Db25maWcucGx1Z2luTWV0aG9kcylcblxuICAgIF9jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXSA9IHBsdWdpbkNvbmZpZ1xuICB9XG5cbiAgZ2V0UGx1Z2luc01ldGhvZE9iaihwbHVnaW5NZXRob2RzT2JqKSB7XG4gICAgaWYgKHBsdWdpbk1ldGhvZHNPYmopIHtcbiAgICAgIHRoaXMuYWRkUGx1Z2luTWV0aG9kcyhwbHVnaW5NZXRob2RzT2JqKVxuICAgIH1cblxuICAgIHJldHVybiBfc3B5bmVQbHVnaW5NZXRob2RzLnBsdWdpbk1ldGhvZHNPYmpcbiAgfVxuXG4gIGFkZFBsdWdpbk1ldGhvZHMocGx1Z2luTWV0aG9kcykge1xuICAgIGlmIChwbHVnaW5NZXRob2RzKSB7XG4gICAgICBfc3B5bmVQbHVnaW5NZXRob2RzLmFkZE1ldGhvZHMocGx1Z2luTWV0aG9kcylcbiAgICB9XG4gIH1cblxuICBkb05vdFRyYWNrQ2hhbm5lbChjaGFubmVsTmFtZSkge1xuICAgIF9kb05vdFRyYWNrQ2hhbm5lbHNBcnIucHVzaChjaGFubmVsTmFtZSlcbiAgfVxuXG4gIGdldFVudHJhY2tlZENoYW5uZWxzTGlzdCgpIHtcbiAgICByZXR1cm4gX2RvTm90VHJhY2tDaGFubmVsc0FyclxuICB9XG5cbiAgcmVnaXN0ZXJQcm94eVJldml2ZXIobmFtZSwgbWV0aG9kKSB7XG4gICAgX3Byb3hpZXNNYXAuc2V0KG5hbWUsIG1ldGhvZClcbiAgICAvLyBjb25zb2xlLmxvZyhcIlJFR0lTVEVSRCBQUk9YWSBSRVZJVkVSXCIsX3Byb3hpZXNNYXAsIF9wcm94aWVzTWFwLmdldChuYW1lKSk7XG4gIH1cblxuICAvLyBUaGlzIGlzIHRoZSBuZXcgbWV0aG9kIHlvdSBhZGRcbiAgcmVnaXN0ZXJQbHVnaW4ocGx1Z2luSW5zdGFuY2UpIHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NweW5lQXBwIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuIFBsdWdpbiB3aWxsIG5vdCBiZSBmdWxseSByZWdpc3RlcmVkLicpXG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0UgXCIsdGhpcywgcGx1Z2luSW5zdGFuY2UpXG5cbiAgICBwbHVnaW5JbnN0YW5jZS5yZWdpc3Rlcih0aGlzKVxuICB9XG5cbiAgZ2V0UHJveHlSZXZpdmVyKHByb3h5TmFtZSkge1xuICAgIHJldHVybiBfcHJveGllc01hcC5nZXQocHJveHlOYW1lKVxuICB9XG5cbiAgZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lKHBsdWdpbk5hbWUpIHtcbiAgICByZXR1cm4gX2NvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdXG4gIH1cblxuICBnZXQgSU1HX1BBVEgoKSB7XG4gICAgcmV0dXJuIF9JTUdfUEFUSFxuICB9XG5cbiAgZ2V0IGV4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlKCkge1xuICAgIHJldHVybiBfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGVcbiAgfVxuXG4gIC8vIFNldHRlciBmb3IgX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlXG4gIHNldCBleGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBQdXNoIGEgc2luZ2xlIHN0cmluZyBpbnRvIHRoZSBhcnJheSBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICBpZiAoIV9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlLnB1c2godmFsdWUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gTWVyZ2UgYW4gYXJyYXkgaW50byB0aGUgZXhpc3RpbmcgYXJyYXksIGF2b2lkaW5nIGR1cGxpY2F0ZXNcbiAgICAgIHZhbHVlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgJiYgIV9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgICAgIF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2YWx1ZSBwcm92aWRlZCB0byBleGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS4gT25seSBzdHJpbmdzIG9yIGFycmF5cyBhcmUgYWxsb3dlZC4nKVxuICAgIH1cbiAgfVxuXG4gIGdldCBsaW5rc0RhdGEoKSB7XG4gICAgY29uc29sZS53YXJuKCdnZXQgbGlua3MgZGF0YSBpbiBTcHluZUFwcFByb3BlcnRpZXMgaXMgZGVwcmVjYXRlZCwgdXNlIG5hdkxpbmtzJylcbiAgICByZXR1cm4gX25hdkxpbmtzXG4gIH1cblxuICBzZXQgbGlua3NEYXRhKGFycikge1xuICAgIGNvbnNvbGUud2Fybignc2V0IGxpbmtzIGRhdGEgaW4gU3B5bmVBcHBQcm9wZXJ0aWVzIGlzIGRlcHJlY2F0ZWQsIHVzZSBuYXZMaW5rcycpXG4gIH1cblxuICBnZXQgbmF2TGlua3MoKSB7XG4gICAgcmV0dXJuIF9uYXZMaW5rc1xuICB9XG5cbiAgc2V0IG5hdkxpbmtzKGFycikge1xuICAgIF9uYXZMaW5rcyA9IGFyclxuICB9XG5cbiAgZ2V0IGVuYWJsZUNNU1Byb3hpZXMoKXtcbiAgICByZXR1cm4gX2VuYWJsZUNNU1Byb3hpZXNcbiAgfVxuXG4gIGdldEhyZWZGcm9tRGF0YShyb3V0ZVByb3BzPXt9KXtcblxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRQYXJhbXNUb1JvdXRlKHJvdXRlUHJvcHMpO1xuXG4gIH1cblxuICBzZXQgZW5hYmxlQ01TUHJveGllcyhib29sPXRydWUpe1xuICAgIF9lbmFibGVDTVNQcm94aWVzID0gQm9vbGVhbihib29sKTtcbiAgfVxuXG4gIHNldENNU1Byb3h5TWV0aG9kKGZuKXtcbiAgICB0aGlzLmVuYWJsZUNNU1Byb3hpZXMgPSB0cnVlO1xuICAgIHRoaXMuZm9ybWF0VGVtcGxhdGVGb3JQcm94eURhdGEgPSBmbjtcblxuICB9XG5cbiAgdGVtcEdldENoYW5uZWxzSW5zdGFuY2UoKSB7XG5cbiAgfVxuXG4gIHRlbXBHZXRDb25maWcoKSB7XG5cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU3B5bmVBcHBQcm9wZXJ0aWVzID0gbmV3IFNweW5lQXBwUHJvcGVydGllc0NsYXNzKClcbiIsImltcG9ydCB7IGFsbFBhc3MsIGNvbXBvc2UsIGlzLCBrZXlzLCBub3QsIHByb3AgfSBmcm9tICdyYW1kYSdcblxuY29uc3QgX3BsdWdpbk1ldGhvZHNPYmogPSBPYmplY3QuY3JlYXRlKHt9KVxuXG5jb25zdCBpc05vdEFyciA9IGNvbXBvc2Uobm90LCBpcyhBcnJheSkpXG4vLyBjb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShub3QsIGlzRW1wdHkpXG4vLyBjb25zdCBpc05vbkVtcHR5U3RyID0gYWxsUGFzcyhbaXMoU3RyaW5nKSwgaXNOb3RFbXB0eV0pXG4vLyBjb25zdCBpc05vbkVtcHR5QXJyID0gYWxsUGFzcyhbaXMoQXJyYXkpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzT2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90QXJyLCBpcyhPYmplY3QpXSkpXG4vLyBjb25zdCBpc05vbkVtcHR5T2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5cbmV4cG9ydCBjbGFzcyBTcHluZVBsdWdpbnNNZXRob2RzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgX3BsdWdpbk1ldGhvZHNPYmouZm9vID0gKCkgPT4gY29uc29sZS5sb2coJ3VzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuJylcbiAgfVxuXG4gIGFkZE1ldGhvZChrZXksIGZuLCB0ZXN0ID0gZmFsc2UpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKF9wbHVnaW5NZXRob2RzT2JqLCBrZXkpID09PSB0cnVlKSB7XG4gICAgICBjb25zdCB3YXJuU3RyID0gYFNweW5lIFdhcm5pbmc6IHRoZSBtZXRob2QgbmFtZSwgJHtrZXl9LCBhbHJlYWR5IGV4aXN0cy5gXG4gICAgICBpZiAodGVzdCkge1xuICAgICAgICByZXR1cm4gd2FyblN0clxuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKHdhcm5TdHIpXG4gICAgfSBlbHNlIHtcbiAgICAgIF9wbHVnaW5NZXRob2RzT2JqW2tleV0gPSBmblxuICAgIH1cbiAgfVxuXG4gIGFkZE1ldGhvZHMobWV0aG9kc09iaiA9IHt9LCB0ZXN0ID0gZmFsc2UpIHtcbiAgICBsZXQgd2FyblN0clxuXG4gICAgY29uc3QgaXNPYmogPSBpc09iamVjdEZuKG1ldGhvZHNPYmopXG5cbiAgICBpZiAoaXNPYmogPT09IGZhbHNlKSB7XG4gICAgICB3YXJuU3RyID0gYFNweW5lIFdhcm5pbmc6IHRoZSBwbHVnaW5NZXRob2RzIHByb3BlcnR5LCAke0pTT04uc3RyaW5naWZ5KG1ldGhvZHNPYmopfSBuZWVkcyB0byBiZSBhbiBvYmplY3QuYFxuICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgcmV0dXJuIHdhcm5TdHJcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tFYWNoS2V5Rm9yVmFsaWRNZXRob2QgPSAoa2V5U3RyKSA9PiB7XG4gICAgICBjb25zdCBtZXRob2RWYWwgPSBwcm9wKGtleVN0ciwgbWV0aG9kc09iailcblxuICAgICAgY29uc3QgaXNGdW5jdGlvbiA9IHR5cGVvZiAobWV0aG9kVmFsKSA9PT0gJ2Z1bmN0aW9uJ1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbikge1xuICAgICAgICB0aGlzLmFkZE1ldGhvZChrZXlTdHIsIG1ldGhvZFZhbCwgdGVzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5TdHIgPSBgdGhlIHZhbHVlIGZvciAke2tleVN0cn0gaXMgbm90IGEgdmFsaWQgZnVuY3Rpb24uYFxuICAgICAgICBpZiAodGVzdCkge1xuICAgICAgICAgIHJldHVybiB3YXJuU3RyXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKHdhcm5TdHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2RLZXlzID0ga2V5cyhtZXRob2RzT2JqKVxuXG4gICAgcmV0dXJuIG1ldGhvZEtleXMubWFwKGNoZWNrRWFjaEtleUZvclZhbGlkTWV0aG9kKS5qb2luKCcsJylcbiAgfVxuXG4gIGNoZWNrSWZNZXRob2RFeGlzdHMoa2V5KSB7XG5cbiAgfVxuXG4gIGdldCBwbHVnaW5NZXRob2RzT2JqKCkge1xuICAgIHJldHVybiBfcGx1Z2luTWV0aG9kc09ialxuICB9XG59XG4iLCJpbXBvcnQgeyBnZXRBbGxNZXRob2ROYW1lcyB9IGZyb20gJy4vZnJwLXRvb2xzLmpzJ1xuaW1wb3J0IHsgcmVqZWN0LCBjdXJyeU4sIF9fLCBtYXAgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVRyYWl0IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVUcmFpdFxuICAgKiBAdHlwZSBleHRlbmRhYmxlXG4gICAqIEBwYXJhbSB7dGhpc30gcGFyZW50Q29udGV4dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJlZml4XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXV0b0luaXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7dGhpc30gcGFyZW50Q29udGVudCAtID0gdW5kZWZpbmVkOyBUaGlzIGJpbmRzIGFsbCBtZXRob2RzIHdpdGhpbiBTcHluZVRyYWl0IGludG8gdGhlIHBhcmVudENvbnRleHQncyBvYmplY3RcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByZWZpeCAtID0gdW5kZWZpbmVkOyBTcHluZVRyYWl0cyBmb3JjZXMgYWxsIG1ldGhvZCBuYW1lcyB0byBiZWdpbiB3aXRoIHRoZSBzYW1lIHByZWZpeC4gVGhpcyBhbGxvd3Mgb3RoZXIgb2JqZWN0cyB0byBxdWlja2x5IHVuZGVyc3RhbmQgd2hlcmUgdGhlIG9yaWdpbmFsIG1ldGhvZCBpcyBzZXQuXG4gICAqIEBkZXNjXG4gICAqIFNweW5lVHJhaXRzIGFsbG93IHRoZSBlaGFuY2luZyBvZiBjbGFzc2VzIGFuZCBvdGhlciBvYmplY3RzIHdpdGhvdXQgaGF2aW5nIHRvIGV4dGVuZCBjbGFzc2VzIG9yIG1hbmlwdWxhdGUgZnVuY3Rpb24gcHJvdG90eXBlc1xuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihwYXJlbnRDb250ZXh0LCBwcmVmaXggPSAnJywgYXV0b0luaXQgPSB0cnVlKSB7XG4gICAgdGhpcy5wYXJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dFxuICAgIHRoaXMub21pdHRlZE1ldGhvZHMgPSBbXG4gICAgICAnYXV0b0JpbmRlcicsXG4gICAgICAnaW5pdEF1dG9CaW5kZXInLFxuICAgICAgJ2dldEVuaGFuY2VyTWV0aG9kcycsXG4gICAgICAnY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzJyxcbiAgICAgICdjYWxsZXInLFxuICAgICAgJ2FyZ3VtZW50cycsXG4gICAgICAnYmluZFBhcmVudFZpZXdTdHJlYW0nXVxuXG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXhcblxuICAgIGlmIChhdXRvSW5pdCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5hdXRvQmluZGVyKClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWxsTWV0aG9kc0xpc3RcbiAgfVxuXG4gIGluaXRBdXRvQmluZGVyKCkge1xuICAgIHRoaXMuYXV0b0JpbmRlcigpXG4gIH1cblxuICBnZXRFbmhhbmNlck1ldGhvZHMoKSB7XG4gICAgcmV0dXJuIGdldEFsbE1ldGhvZE5hbWVzKHRoaXMsIHRoaXMub21pdHRlZE1ldGhvZHMpXG4gIH1cblxuICBjaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMobWV0aG9kc0Fycikge1xuICAgIGNvbnN0IGlzRGVidWdNb2RlID0gU3B5bmVBcHBQcm9wZXJ0aWVzPy5kZWJ1ZyB8fCBmYWxzZVxuXG4gICAgaWYgKHRoaXMucHJlZml4ID09PSAnJyAmJiBpc0RlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTUFlORSBXQVJOSU5HOiBUaGUgZm9sbG93aW5nIFNweW5lVHJhaXQgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IG5lZWRzIGEgcHJlZml4YClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBsZXQgcmVTdHIgPSBgXigke3RoaXMucHJlZml4fSkoLiopJGA7XG4gICAgLy8gbGV0IHJlID0gbmV3IFJlZ0V4cChyZVN0cik7XG4gICAgY29uc3QgaGFzUHJlZml4ID0gKHN0cikgPT4gc3RyLmluZGV4T2YodGhpcy5wcmVmaXgpID09PSAwXG5cbiAgICBjb25zdCBtYWxmb3JtZWRNZXRob2RzQXJyID0gcmVqZWN0KGhhc1ByZWZpeCwgbWV0aG9kc0FycilcbiAgICBpZiAobWFsZm9ybWVkTWV0aG9kc0Fyci5sZW5ndGggPj0gMSAmJiBpc0RlYnVnTW9kZSkge1xuICAgICAgY29uc3Qgd2FybmluZ1N0ciA9IGBTcHluZSBXYXJuaW5nOiBUaGUgZm9sbG93aW5nIG1ldGhvZChzKSBpbiAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gcmVxdWlyZSB0aGUgcHJlZml4LCBcIiR7dGhpcy5wcmVmaXh9XCI6IFske21hbGZvcm1lZE1ldGhvZHNBcnIuam9pbignLCAnKX1dO2BcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nU3RyKVxuICAgIH1cbiAgfVxuXG4gIGJpbmRQYXJlbnRWaWV3U3RyZWFtKG1ldGhvZHNPYmosIGNvbnRleHQpIHtcbiAgICB0aGlzLmNoZWNrRm9yTWFsZm9ybWVkTWV0aG9kcyhtZXRob2RzT2JqLmFsbE1ldGhvZHMpXG4gICAgY29uc3Qgb2JqID0ge31cbiAgICBjb25zdCBiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSA9IChzdHIsIGlzU3RhdGljID0gZmFsc2UpID0+IHtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yVHlwZSA9IGlzU3RhdGljID09PSB0cnVlID8gdGhpcy5jb25zdHJ1Y3RvciA6IHRoaXNcbiAgICAgIGNvbnN0IHByb3BlcnR5VHlwZSA9IHR5cGVvZiAoY29uc3RydWN0b3JUeXBlW3N0cl0pXG4gICAgICBpZiAocHJvcGVydHlUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9ialtzdHJdID0gY29udGV4dFtzdHJdID0gY29uc3RydWN0b3JUeXBlW3N0cl0uYmluZChjb250ZXh0KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJpbmRDdXJyeSA9IGN1cnJ5TigyLCBiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSlcbiAgICBjb25zdCBiaW5kU3RhdGljTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSA9IGJpbmRDdXJyeShfXywgdHJ1ZSlcbiAgICAvLyBNQVAgU1RBVElDIE1FVEhPRFNcbiAgICBtYXAoYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0sIG1ldGhvZHNPYmouc3RhdGljTWV0aG9kcylcbiAgICAvLyBNQVAgTUFJTiBNRVRIT0RTXG4gICAgbWFwKGJpbmRNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtLCBtZXRob2RzT2JqLm1ldGhvZHMpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgYXV0b0JpbmRlcigpIHtcbiAgICBjb25zdCBhbGxNZXRob2RzID0gdGhpcy5nZXRFbmhhbmNlck1ldGhvZHMoKVxuICAgIC8vIGNvbnNvbGUubG9nKCdhbGwgJyxhbGxNZXRob2RzKTtcbiAgICB0aGlzLmFsbE1ldGhvZHNMaXN0ID0gdGhpcy5iaW5kUGFyZW50Vmlld1N0cmVhbShhbGxNZXRob2RzLCB0aGlzLnBhcmVudENvbnRleHQpXG4gICAgcmV0dXJuIHRoaXMuYWxsTWV0aG9kc0xpc3RcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNFbXB0eSwgaGVhZCwgdmFsdWVzLCBjb21wb3NlLCBwcm9wLCBjb21wbGVtZW50LCBpc05pbCwgYWxsUGFzcywgcmVkdWNlLCBmaWx0ZXIsIGVxdWFscywgdG9QYWlycywgcmVwbGFjZSwgZWl0aGVyLCBwcm9wRXEsIF9fLCBpbnZlcnQsIHBhdGgsIHppcE9iaiwgcmVqZWN0LCBrZXlzLCBmaW5kLCBhc3NvYywgaXMsIGhhcywgd2hlbiwgc3BsaXQsIGFsd2F5cywgY29uY2F0LCBqb2luLCBmbGF0dGVuLCBtYXAsIGlmRWxzZSwgdGVzdCwgZmluZExhc3RJbmRleCwgbGFzdCwgZGVmYXVsdFRvLCBmcm9tUGFpcnMgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgdXJsIG1ldGhvZHMgZm9yIHRoZSBTcHluZVJvdXRlQ2hhbm5lbFxuICAgICAqL1xuICAgIHRoaXMuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbC5iaW5kKHRoaXMpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbChvYmopIHtcbiAgICBjb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShjb21wbGVtZW50KGlzRW1wdHkpLCBoZWFkLCB2YWx1ZXMpXG4gICAgY29uc3QgaXNOb3ROaWwgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNOaWwpLCBoZWFkLCB2YWx1ZXMpXG4gICAgY29uc3QgaXNOb3ROaWxBbmRJc05vdEVtcHR5ID0gYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3ROaWxdKVxuICAgIHJldHVybiBpc05vdE5pbEFuZElzTm90RW1wdHkob2JqKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZQYXJhbVZhbHVlTWF0Y2hlc1JlZ2V4KHBhcmFtVmFsdWUsIHJvdXRlT2JqKSB7XG4gICAgY29uc3QgcmVqZWN0UGFyYW1LZXkgPSByZWplY3QoZXF1YWxzKCdyb3V0ZU5hbWUnKSlcbiAgICBjb25zdCBrZXlzQXJyID0gY29tcG9zZShyZWplY3RQYXJhbUtleSwga2V5cylcbiAgICBjb25zdCB0ZXN0Rm9yUmVnZXhNYXRjaCA9IHN0ciA9PiB0ZXN0KG5ldyBSZWdFeHAoc3RyKSwgcGFyYW1WYWx1ZSlcbiAgICBjb25zdCBjaGVja2VyID0gY29tcG9zZShmaW5kKHRlc3RGb3JSZWdleE1hdGNoKSwga2V5c0FycilcbiAgICBjb25zdCByZWdleE1hdGNoU3RyID0gY2hlY2tlcihyb3V0ZU9iailcbiAgICBpZiAoaXMoU3RyaW5nLCByZWdleE1hdGNoU3RyKSkge1xuICAgICAgcm91dGVPYmogPSBhc3NvYyhwYXJhbVZhbHVlLCBwcm9wKHJlZ2V4TWF0Y2hTdHIsIHJvdXRlT2JqKSwgcm91dGVPYmopXG4gICAgfVxuICAgIHJldHVybiByb3V0ZU9ialxuICB9XG5cbiAgc3RhdGljIGZvcm1hdFN0ckFzV2luZG93TG9jYXRpb24oc3RyKSB7XG4gICAgY29uc3QgaGFzaCA9IHN0clxuICAgIGNvbnN0IHNlYXJjaCA9IHN0clxuICAgIGNvbnN0IHBhdGhuYW1lID0gc3RyXG4gICAgcmV0dXJuIHsgaGFzaCwgc2VhcmNoLCBwYXRobmFtZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25TdHJCeVR5cGUodCwgaXNIYXNoID0gZmFsc2UsIGxvYyA9IHdpbmRvdy5sb2NhdGlvbikge1xuICAgIGNvbnN0IHR5cGUgPSBpc0hhc2ggPT09IHRydWUgPyAnaGFzaCcgOiB0XG5cbiAgICBjb25zdCB0eXBlTWFwID0ge1xuICAgICAgc2xhc2g6ICdwYXRobmFtZScsXG4gICAgICBxdWVyeTogJ3NlYXJjaCcsXG4gICAgICBoYXNoOiAnaGFzaCdcbiAgICB9XG4gICAgY29uc3QgcHJvcFZhbCA9IHR5cGVNYXBbdHlwZV1cbiAgICBjb25zdCBzdHIgID0gcHJvcChwcm9wVmFsLCBsb2MpXG4gICAgY29uc3QgY2hlY2tGb3JTbGFzaEFuZEhhc2ggPSAvXihcXC8pPygjKT8oXFwvKT8oLiopJC9cbiAgICAvLyBjb25zb2xlLmxvZyhcIkRBVEEgTE9DIFNUUiBcIix7c3RyLCBsb2MsIHByb3AsIHR5cGUsaXNIYXNofSk7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKGNoZWNrRm9yU2xhc2hBbmRIYXNoLCAnJDQnKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVJvdXRlQXJyYXlGcm9tUGFyYW1zKGRhdGEsIHJvdXRlLCB0ID0gJ3NsYXNoJywgcGFyYW1zRnJvbUxvYykge1xuICAgIGNvbnN0IHVybEFyciA9IFtdXG4gICAgY29uc3QgbG9vcFRocm91Z2hQYXJhbSA9IChyb3V0ZU9iaikgPT4ge1xuICAgICAgY29uc3QgdXJsT2JqID0ge31cbiAgICAgIGNvbnN0IGtleXdvcmQgPSByb3V0ZU9iai5yb3V0ZU5hbWUgLy8gUEFSQU0gRk9STSBTUFlORSBDT05GSUdcbiAgICAgIGxldCBwYXJhbVZhbEZyb21EYXRhID0gZGF0YVtrZXl3b3JkXSAhPT0gdW5kZWZpbmVkID8gZGF0YVtrZXl3b3JkXSA6IHByb3Aoa2V5d29yZCwgcGFyYW1zRnJvbUxvYykgLy8gUFVMTCBWQUxVRSBGT1IgVEhJUyBQQVJBTSBGUk9NIERBVEFcbiAgICAgIGNvbnN0IHBhcmFtVmFsVHlwZSA9IHR5cGVvZiAocm91dGVPYmpbcGFyYW1WYWxGcm9tRGF0YV0pXG5cbiAgICAgIGlmIChwYXJhbVZhbFR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHBhcmFtVmFsRnJvbURhdGEgPSByb3V0ZU9ialtwYXJhbVZhbEZyb21EYXRhXVxuICAgICAgfSBlbHNlIGlmIChwYXJhbVZhbFR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJvdXRlT2JqID0gdGhpcy5jaGVja0lmUGFyYW1WYWx1ZU1hdGNoZXNSZWdleChwYXJhbVZhbEZyb21EYXRhLCByb3V0ZU9iailcbiAgICAgIH1cblxuICAgICAgdXJsT2JqW2tleXdvcmRdID0gcGFyYW1WYWxGcm9tRGF0YVxuXG4gICAgICBpZiAodGhpcy5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKHVybE9iaikpIHtcbiAgICAgICAgdXJsQXJyLnB1c2godXJsT2JqKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpc09iamVjdCA9IGlzKE9iamVjdCwgcm91dGVPYmopXG4gICAgICBjb25zdCBvYmplY3RQYXJhbUV4aXN0cyA9IGhhcyhwYXJhbVZhbEZyb21EYXRhLCByb3V0ZU9iailcbiAgICAgIGNvbnN0IG9iamVjdENvbnRhaW5zUm91dGUgPSBoYXMoJ3JvdXRlUGF0aCcsIHJvdXRlT2JqKVxuICAgICAgY29uc3QgcmVjdXJzaXZlbHlDYWxsTG9vcEJvb2wgPSBvYmplY3RQYXJhbUV4aXN0cyAmJiBpc09iamVjdFxuICAgICAgaWYgKHJlY3Vyc2l2ZWx5Q2FsbExvb3BCb29sID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHJvdXRlT2JqW3BhcmFtVmFsRnJvbURhdGFdXG4gICAgICAgIGlmIChoYXMoJ3JvdXRlUGF0aCcsIG5ld09iaikpIHtcbiAgICAgICAgICBsb29wVGhyb3VnaFBhcmFtKG5ld09iai5yb3V0ZVBhdGgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob2JqZWN0Q29udGFpbnNSb3V0ZSA9PT0gdHJ1ZSAmJiBwYXJhbVZhbEZyb21EYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG9vcFRocm91Z2hQYXJhbShyb3V0ZU9iai5yb3V0ZVBhdGgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9vcFRocm91Z2hQYXJhbShyb3V0ZSlcblxuICAgIHJldHVybiB1cmxBcnJcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVTbGFzaFN0cmluZyhhcnIpIHtcbiAgICBjb25zdCBhcnJDbGVhciA9IHJlamVjdChpc05pbClcbiAgICBjb25zdCBub3RVbmRlZmluZWQgPSB3aGVuKGNvbXBsZW1lbnQoaXNOaWwsIF9fKSwgam9pbignLycpKVxuICAgIGNvbnN0IHN0cmlwUmVnZXggPSByZXBsYWNlKC9eKFxcXiopKC4qfF5cXCQpKFxcJCkkLywgJyQyJylcbiAgICBjb25zdCBqb2luZXIgPSBjb21wb3NlKHN0cmlwUmVnZXgsIG5vdFVuZGVmaW5lZCwgYXJyQ2xlYXIsIGZsYXR0ZW4sIG1hcCh2YWx1ZXMpKVxuICAgIHJldHVybiBqb2luZXIoYXJyKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVF1ZXJ5U3RyaW5nKGFycikge1xuICAgIGNvbnN0IGFyckNsZWFyID0gcmVqZWN0KGlzTmlsKVxuXG4gICAgY29uc3QgaXNOb3ROaWxBbmRJc05vdEVtcHR5ID0gdGhpcy5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsXG5cbiAgICBjb25zdCBjcmVhdGVQYWlyID0gY29tcG9zZShcbiAgICAgIGpvaW4oJz0nKSxcbiAgICAgIGZsYXR0ZW4sXG4gICAgICB0b1BhaXJzKVxuXG4gICAgY29uc3QgY2hlY2tQYWlyID0gaWZFbHNlKFxuICAgICAgaXNOb3ROaWxBbmRJc05vdEVtcHR5LFxuICAgICAgY3JlYXRlUGFpcixcbiAgICAgIGFsd2F5cyh1bmRlZmluZWQpXG4gICAgKVxuXG4gICAgY29uc3QgbWFwQXJyYXlPZlBhaXJzID0gbWFwKGNoZWNrUGFpcilcblxuICAgIGNvbnN0IGNoZWNrSWZTdHJJc0VtcHR5ID0gd2hlbihcbiAgICAgIGNvbXBsZW1lbnQoaXNFbXB0eSksXG4gICAgICBjb25jYXQoJz8nKSlcblxuICAgIGNvbnN0IGNyZWF0ZVFzID0gY29tcG9zZShcbiAgICAgIGNoZWNrSWZTdHJJc0VtcHR5LFxuICAgICAgam9pbignJicpLFxuICAgICAgYXJyQ2xlYXIsXG4gICAgICBtYXBBcnJheU9mUGFpcnMpXG5cbiAgICByZXR1cm4gY3JlYXRlUXMoYXJyKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzKHVybHNBcnIsIGRhdGEsIHBhcnNlU3RyaW5nID0gJ1ZhbHVlJykge1xuICAgIC8vIENIRUNLIElGIFBBWUxPQUQgSEFTIEFOWSBPVkVSUklERVNcbiAgICBjb25zdCBnZXRQcm9wVmFsT3ZlcnJpZGUgPSAoa2V5KSA9PiBwcm9wKGAke2tleX0ke3BhcnNlU3RyaW5nfWAsIGRhdGEpXG5cbiAgICAvLyBHRVQgQU5ZIFBPU1NJQkxFIFZBTFVFIFVTSU5HIFRIRSBDVVJSRU5UIEtFWVxuICAgIGNvbnN0IGdldE92ZXJyaWRlVmFsID0gY29tcG9zZShnZXRQcm9wVmFsT3ZlcnJpZGUsIGhlYWQsIGtleXMpXG5cbiAgICAvLyBNQVAgQUxMIE9CSkVDVCBWQUxTIFRPIFRFU1QgRk9SIE9WRVJSSURFU1xuICAgIGNvbnN0IG1hcFVybFByb3BzID0gKHByb3ApID0+IHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlVmFsID0gZ2V0T3ZlcnJpZGVWYWwocHJvcClcblxuICAgICAgLy8gY29uc29sZS5sb2coXCJvdmVycmlkZSB2YWwgXCIsb3ZlcnJpZGVWYWwsIGRhdGEpO1xuICAgICAgLy8gaWYgcmVnZXggdmFsdWUgaXMgZm91bmRcbiAgICAgIGlmIChvdmVycmlkZVZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBhc3NvYyhjb21wb3NlKGhlYWQsIGtleXMpKHByb3ApLCBvdmVycmlkZVZhbCwgcHJvcClcbiAgICAgIH1cbiAgICAgIC8vIGlkZW50aXR5XG4gICAgICByZXR1cm4gcHJvcFxuICAgIH1cblxuICAgIHJldHVybiBtYXAobWFwVXJsUHJvcHMsIHVybHNBcnIpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JSb3V0ZVZhbFdpdGhNdWx0aXBsZVZhbHModXJsc0Fycikge1xuICAgIC8vIERlZmluZSB0aGUgaW50ZXJuYWwgbWV0aG9kIHRvIGV4dHJhY3QgdGhlIHN0cmluZyBiZWZvcmUgdGhlIHBpcGVcbiAgICBjb25zdCBnZXRTdHJpbmdCZWZvcmVQaXBlID0gKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKC9eW158XSovKVxuICAgICAgcmV0dXJuIG1hdGNoID8gKG1hdGNoWzBdID09PSAnXiQnID8gJycgOiBtYXRjaFswXSkgOiBpbnB1dFxuICAgIH1cblxuICAgIGNvbnN0IG1hcFVybEFyck9iaiA9IChvYmopID0+IHtcbiAgICAgIGNvbnN0IHBpcGVSZWR1Y2VyID0gKGFjYywga2V5KSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gZ2V0U3RyaW5nQmVmb3JlUGlwZShvYmpba2V5XSlcbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb2JqID0gT2JqZWN0LmtleXMob2JqKS5yZWR1Y2UocGlwZVJlZHVjZXIsIHt9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHVybHNBcnIpID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gdXJsc0Fyci5tYXAobWFwVXJsQXJyT2JqKVxuICAgIH1cblxuICAgIHJldHVybiB1cmxzQXJyXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2godXJsc0FyciwgZGF0YSA9IHt9KSB7XG4gICAgLyoqXG4gICAgICogMS4gTG9vcCB0aHJvdWdoIHVybHNBcnJcbiAgICAgKiAyLiBMb29wIHRocm91Z2ggcHJvcGVydGllc1xuICAgICAqIDMuIEFwcGx5IG1hdGNoR2xvYlBhdHRlcm4gdG8gZWFjaCBwcm9wZXJ0eSB2YWx1ZSBhbmQgY2hlY2sgZm9yIG1hdGNoIHdpdGggZGF0YSBvYmplY3QgcHJvcGVydHlcbiAgICAgKiA0LiBSZXR1cm4gdGhlIHVwZGF0ZWQgb2JqZWN0IHdpdGggbWF0Y2hlZCB2YWx1ZXMsIG9yIGtlZXAgdGhlIG9yaWdpbmFsIHBhdHRlcm4gaWYgbm8gbWF0Y2hcbiAgICAgKi9cblxuICAgIGNvbnN0IG1hdGNoR2xvYlBhdHRlcm4gPSAoc3RyLCBnbG9iUGF0dGVybikgPT4ge1xuICAgICAgY29uc3QgZ2xvYlBhdHRlcm5NYXRjaCA9IChwYXR0ZXJuLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm5cbiAgICAgICAgICAucmVwbGFjZSgvWy0vXFxcXF4kKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJykgLy8gRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVyc1xuICAgICAgICAgIC5yZXBsYWNlKC9cXCovZywgJ1tcXFxcd1xcXFxkXy1dKicpIC8vICogc2hvdWxkIG1hdGNoIGFueSBzZXF1ZW5jZSBvZiBhbHBoYW51bWVyaWMsIHVuZGVyc2NvcmVzLCBvciBkYXNoZXNcblxuICAgICAgICBjb25zdCByZWdleFBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHtlc2NhcGVkUGF0dGVybn0kYCkgLy8gTWF0Y2ggdGhlIGZ1bGwgc3RyaW5nXG4gICAgICAgIHJldHVybiByZWdleFBhdHRlcm4udGVzdCh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgLy8gU3BsaXQgdGhlIGdsb2JQYXR0ZXJuIGJ5IHBpcGUgKHwpXG4gICAgICBjb25zdCBwYXR0ZXJucyA9IGdsb2JQYXR0ZXJuLnNwbGl0KCd8JylcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmluZyBtYXRjaGVzIGFueSBvZiB0aGUgcGF0dGVybnNcbiAgICAgIGNvbnN0IGhhc01hdGNoID0gcGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZ2xvYlBhdHRlcm5NYXRjaChwYXR0ZXJuLCBzdHIpKVxuXG4gICAgICAvLyBSZXR1cm4gdGhlIHN0cmluZyBpZiB0aGVyZSdzIGEgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm4gdGhlIGdsb2IgcGF0dGVyblxuICAgICAgcmV0dXJuIGhhc01hdGNoID8gc3RyIDogZ2xvYlBhdHRlcm5cbiAgICB9XG5cbiAgICAvLyBGdW5jdGlvbiB0byBjaGVjayBhbmQgcmVwbGFjZSBtYXRjaGluZyBwcm9wZXJ0aWVzXG4gICAgY29uc3QgcmVwbGFjZU1hdGNoaW5nUHJvcGVydHkgPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkT2JqID0geyAuLi5vYmogfSAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBvYmplY3QgdG8gYXZvaWQgbXV0YXRpb25cblxuICAgICAgLy8gRnVuY3Rpb24gdG8gY2hlY2sgZWFjaCBwcm9wZXJ0eSBhbmQgYXBwbHkgbWF0Y2hHbG9iUGF0dGVyblxuICAgICAgY29uc3QgY2hlY2tBbmRSZXBsYWNlUHJvcGVydHkgPSAoa2V5KSA9PiB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodXBkYXRlZE9iaiwga2V5KSAmJiBkYXRhW2tleV0pIHtcbiAgICAgICAgICB1cGRhdGVkT2JqW2tleV0gPSBtYXRjaEdsb2JQYXR0ZXJuKGRhdGFba2V5XSwgdXBkYXRlZE9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0XG4gICAgICBPYmplY3Qua2V5cyh1cGRhdGVkT2JqKS5mb3JFYWNoKGNoZWNrQW5kUmVwbGFjZVByb3BlcnR5KVxuXG4gICAgICByZXR1cm4gdXBkYXRlZE9ialxuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgYXJyYXkgYW5kIHJlcGxhY2UgbWF0Y2hpbmcgcHJvcGVydGllc1xuICAgIHJldHVybiB1cmxzQXJyLm1hcChyZXBsYWNlTWF0Y2hpbmdQcm9wZXJ0eSlcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0UGFyYW1zVG9Sb3V0ZShkYXRhLCByID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5ST1VURSwgdCwgbG9jU3RyKSB7XG4gICAgY29uc3QgdXJsVHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByLnR5cGVcbiAgICBjb25zdCBpc0hhc2ggPSByLmlzSGFzaFxuICAgIGNvbnN0IHJvdXRlID0gci5yb3V0ZXMucm91dGVQYXRoXG4gICAgY29uc3QgbG9jYXRpb25TdHIgPSBsb2NTdHIgIT09IHVuZGVmaW5lZCA/IGxvY1N0ciA6IHRoaXMuZ2V0TG9jYXRpb25TdHJCeVR5cGUodXJsVHlwZSwgaXNIYXNoKVxuICAgIGNvbnN0IHBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24gPSB0aGlzLmNvbnZlcnRSb3V0ZVRvUGFyYW1zKGxvY2F0aW9uU3RyLCByLCB1cmxUeXBlKS5yb3V0ZURhdGFcbiAgICBsZXQgdXJsQXJyID0gdGhpcy5jcmVhdGVSb3V0ZUFycmF5RnJvbVBhcmFtcyhkYXRhLCByb3V0ZSwgdXJsVHlwZSwgcGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbilcblxuICAgIHVybEFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tQYXlsb2FkRm9yUmVnZXhPdmVycmlkZXModXJsQXJyLCBkYXRhKVxuICAgIHVybEFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tGb3JSb3V0ZVZhbFdpdGhNdWx0aXBsZVZhbHModXJsQXJyKVxuICAgIC8vIFRISVMgV0lMTCBNQVRDSCBFWEFDVExZIFRIRSBQUk9QRVJUWSBJRCwgU08gcGFnZUlkPVwiZGFzaGJvYXJkXzFcIiB3aWxsIHJldHVybiB0aGF0IGluc3RlYWQgb2YgZ2xvYlBhdHRlcm5bMF1cbiAgICAvLyB1cmxBcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrRm9yUm91dGVWYWxzUGFydE1hdGNoKHVybEFyciwgZGF0YSlcbiAgICAvLyBjb25zb2xlLmxvZygnUEFSQU1TIFRPIFJPVVRFICcsIHsgZGF0YSwgciwgdXJsQXJyLCBsb2NhdGlvblN0ciwgcGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiB9KVxuXG4gICAgLy8gVEhJUyBDUkVBVEVTIEEgUVVFUlkgUEFUSCBTVFJcbiAgICBpZiAodXJsVHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlTdHJpbmcodXJsQXJyKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNsYXNoU3RyaW5nKHVybEFycilcbiAgfVxuXG4gIHN0YXRpYyBmaW5kSW5kZXhPZk1hdGNoZWRTdHJpbmdPclJlZ2V4KG1haW5TdHIsIHBhcmFtc0Fycikge1xuICAgIGNvbnN0IGlzNDA0ID0gcGFyYW1zQXJyLmluY2x1ZGVzKCcuKycpXG5cbiAgICBjb25zdCByZUZuID0gKHMpID0+IHtcbiAgICAgIGlmIChpczQwNCkge1xuICAgICAgICBpZiAoIXMuc3RhcnRzV2l0aCgnXicpKSB7XG4gICAgICAgICAgcyA9ICdeJyArIHNcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXMuZW5kc1dpdGgoJyQnKSkge1xuICAgICAgICAgIHMgPSBzICsgJyQnXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocylcbiAgICB9XG5cbiAgICBjb25zdCBjaGVja0ZvckVtcHR5ID0gIHJlcGxhY2UoL14kLywgJ14kJylcbiAgICBjb25zdCBjcmVhdGVTdHJSZWdleFRlc3QgPSAoc3RyKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHIsXG4gICAgICAgIHJlOiByZUZuKHN0cilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjaGVja0ZvckVpdGhlclN0ck9yUmVNYXRjaCA9ICBlaXRoZXIoXG4gICAgICBwcm9wRXEobWFpblN0ciwgJ3N0cicpLCBjb21wb3NlKHRlc3QoX18sIG1haW5TdHIpLCBwcm9wKCdyZScpKVxuICAgIClcblxuICAgIGNvbnN0IGZpbmRNYXRjaEluZGV4ID0gY29tcG9zZShmaW5kTGFzdEluZGV4KGVxdWFscyh0cnVlKSksIG1hcChjaGVja0ZvckVpdGhlclN0ck9yUmVNYXRjaCksIG1hcChjcmVhdGVTdHJSZWdleFRlc3QpLCBtYXAoY2hlY2tGb3JFbXB0eSkpXG5cbiAgICByZXR1cm4gZmluZE1hdGNoSW5kZXgocGFyYW1zQXJyKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0ob2JqLCBzdHIsIHJlZ2V4VG9rZW5zKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vICAgICAgIFRISVMgSVMgQSBWRVJZIElNUE9SVEFOVCBNRVRIT0RcbiAgICAvLyAgICAgICBJVCBDT01QQVJFUyBUSEUgU1RSSU5HIFRPIEJFIE1BVENIRUQgV0lUSCBUSEUgUk9VVEUgUEFUSCBPQkpFQ1RcbiAgICAvLyAgICAgICBBTkQgSVQgV0lMTCBSRVRVUk4gT05FIE9GIFRIUkVFIFRISU5HU1xuICAgIC8vICAgICAgIDEuIFRIRSBTVFJJTkcgSVRTRUxGXG4gICAgLy8gICAgICAgMi4gQSBNQVRDSElORyBLRVkgRlJPTSBUSEUgQ1VSUkVOVCBPQkpFQ1RcbiAgICAvLyAgICAgICAzLiBUSEUgUk9VVEVOQU1FXG4gICAgLy9cblxuICAgIC8vIEdPIFRIUk9VR0ggS0VZUyBBTkQgQ0hFQ0sgSUYgUkVHRVggTUFUQ0hFU1xuXG4gICAgLy8gR08gVEhST1VHSCBST1VURSBDT05GSUcgVE8gRklHVVJFIE9VVCBJRiBWQUwgT1IgS0VZIFNIT1VMRCBCRSBDT01QQVJFRFxuICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QsIGNob29zZSB0aGUga2V5IG9mIHRoZSByb3V0ZSBwYXRoIHRvIGNoZWNrIGFnYWluc3RcbiAgICBjb25zdCBnZXRWYWxDb21wYXJlQXJyID0gY29tcG9zZShtYXAobGFzdCksIG1hcChmaWx0ZXIoaXMoU3RyaW5nKSkpLCB0b1BhaXJzKVxuXG4gICAgLy8gQ1JFQVRFIFRIRSBBUlJBWSBPRiBFSVRIRVIgVkFMUyBPUiBLRVlTXG4gICAgY29uc3QgcGFyYW1zQXJyID0gZ2V0VmFsQ29tcGFyZUFycihvYmopXG5cbiAgICAvLyBSRVNVTFRTIEZST00gUEFSQU0gQ0hFQ0tcbiAgICAvLyBsZXQgcGFyYW1JbmRleCA9IGNoZWNrRm9yUGFyYW1zTWF0Y2gocGFyYW1zQXJyKTtcblxuICAgIGNvbnN0IHBhcmFtSW5kZXggPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgoc3RyLCBwYXJhbXNBcnIpXG5cbiAgICAvLyBERUZBVUxUIFZBTCBGT1IgU1RSSU5HXG4gICAgbGV0IHBhcmFtU3RyID0gc3RyXG5cbiAgICAvLyBMRUdBQ1kgTUVUSE9EIC0tIFRVUk4gT0ZGXG4gICAgLy8gV0hFTiBUSEVSRSBJUyBBIE1BVENIIEZST00gVEhFIENVUlJFTlQgUk9VVEUgUEFUSCBPQkpFQ1RcbiAgICBpZiAocGFyYW1JbmRleCA+PSAwKSB7XG4gICAgICBjb25zdCBwYXJhbSA9IHBhcmFtc0FycltwYXJhbUluZGV4XVxuICAgICAgY29uc3QgaW52ZXJ0ZWRPYmogPSBpbnZlcnQob2JqKVxuXG4gICAgICAvLyBQVUxMIElOVkVSVEVEIE9CSkVDVCBUTyBTRUUgSUYgU1RSIE1BVENIRVNcbiAgICAgIGNvbnN0IGdldFBhcmFtSW52ZXJ0ZWQgPSBjb21wb3NlKGhlYWQsIGRlZmF1bHRUbyhbXSksIHByb3AocGFyYW0pKVxuICAgICAgY29uc3QgcGFyYW1JbnZlcnRlZCA9IGdldFBhcmFtSW52ZXJ0ZWQoaW52ZXJ0ZWRPYmopXG4gICAgICAvLyBzcHluZSAxMS4wLjE7XG4gICAgICBjb25zdCByZSA9ICAvXihbLSRcXHddKikkL1xuICAgICAgY29uc3Qga2V5TWF0Y2ggPSAgcmUudGVzdChwYXJhbUludmVydGVkKVxuXG4gICAgICBpZiAoa2V5TWF0Y2ggPT09IHRydWUgJiYgaXMoU3RyaW5nLCBwYXJhbUludmVydGVkKSA9PT0gdHJ1ZSkge1xuICAgICAgICBwYXJhbVN0ciA9IHBhcmFtSW52ZXJ0ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1TdHJcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVBcnJGcm9tU2xhc2hTdHIoc3RyKSB7XG4gICAgY29uc3Qgc2xhc2hSZSA9IC9eKFsvXSk/KC4qKSQvXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKHNsYXNoUmUsICckMicpLnNwbGl0KCcvJylcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0U2xhc2hSb3V0ZVN0clRvUGFyYW1zT2JqKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpIHtcbiAgICBjb25zdCByb3V0ZVZhbHVlID0gc3RyXG4gICAgY29uc3QgdmFsdWVzQXJyID0gdGhpcy5jcmVhdGVBcnJGcm9tU2xhc2hTdHIoc3RyKVxuICAgIGNvbnN0IHBhdGhzID0gW11cbiAgICBjb25zdCByb3V0ZWRWYWx1ZXNBcnIgPSBbXVxuICAgIGxldCBsYXRlc3RPYmogPSB0b3BMZXZlbFJvdXRlXG4gICAgY29uc3QgY3JlYXRlUGFyYW1zRnJvbVN0ciA9ICh0b3RhbCwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZVZhbHVlU3RyID0gdGhpcy5jaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKGxhdGVzdE9iaiwgY3VycmVudFZhbHVlLCByZWdleFRva2VucylcblxuICAgICAgbGF0ZXN0T2JqID0gdGhpcy5jaGVja0lmUGFyYW1WYWx1ZU1hdGNoZXNSZWdleChjdXJyZW50VmFsdWUsIGxhdGVzdE9iailcbiAgICAgIGNvbnN0IHByZXZQYXRoTm90RXFDdXJyZW50UGF0aCA9IChzdHIpID0+IHN0ciAhPT0gbGFzdChwYXRocylcblxuICAgICAgY29uc3QgaXNFbXB0eU9yTmlsID0gZWl0aGVyKGlzRW1wdHksIGlzTmlsKVxuXG4gICAgICBpZiAobGF0ZXN0T2JqICE9PSB1bmRlZmluZWQgJiYgcHJldlBhdGhOb3RFcUN1cnJlbnRQYXRoKGxhdGVzdE9iai5yb3V0ZU5hbWUpICYmIGlzRW1wdHlPck5pbChyb3V0ZVZhbHVlU3RyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcGF0aHMucHVzaChsYXRlc3RPYmoucm91dGVOYW1lKVxuICAgICAgICByb3V0ZWRWYWx1ZXNBcnIucHVzaChyb3V0ZVZhbHVlU3RyKVxuICAgICAgfVxuICAgICAgY29uc3Qgc3RyUGF0aCA9IFtjdXJyZW50VmFsdWUsICdyb3V0ZVBhdGgnXVxuICAgICAgY29uc3Qgcm91dGVQYXJhbVBhdGggPSBbJ3JvdXRlUGF0aCddXG4gICAgICBjb25zdCBvYmplY3RGcm9tU3RyID0gcGF0aChzdHJQYXRoLCBsYXRlc3RPYmopXG4gICAgICBjb25zdCBvYmplY3RGcm9tUm91dGVQYXJhbSA9IHBhdGgocm91dGVQYXJhbVBhdGgsIGxhdGVzdE9iailcblxuICAgICAgaWYgKG9iamVjdEZyb21TdHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsYXRlc3RPYmogPSBvYmplY3RGcm9tU3RyXG4gICAgICB9IGVsc2UgaWYgKG9iamVjdEZyb21Sb3V0ZVBhcmFtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGF0ZXN0T2JqID0gb2JqZWN0RnJvbVJvdXRlUGFyYW1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZWR1Y2UoY3JlYXRlUGFyYW1zRnJvbVN0ciwgMCwgdmFsdWVzQXJyKVxuICAgIGNvbnN0IHJvdXRlRGF0YSA9IHppcE9iaihwYXRocywgcm91dGVkVmFsdWVzQXJyKVxuICAgIGNvbnN0IHBhdGhJbm5lcm1vc3QgPSB0aGlzLmdldExhc3RBcnJWYWwocGF0aHMpXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TGFzdEFyclZhbChhcnIpIHtcbiAgICBjb25zdCBnZXRMYXN0UGFyYW0gPSAoYSkgPT4gbGFzdChhKSAhPT0gdW5kZWZpbmVkID8gbGFzdChhKSA6ICcnXG4gICAgcmV0dXJuIGdldExhc3RQYXJhbShhcnIpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyKHRvcExldmVsUm91dGUsIHN0cikge1xuICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgY29uc3Qga2V5d29yZCA9IHRvcExldmVsUm91dGUucm91dGVOYW1lXG4gICAgb2JqW2tleXdvcmRdID0gdGhpcy5jaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKHRvcExldmVsUm91dGUsIHN0cilcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgY29udmVydFF1ZXJ5U3RyVG9QYXJhbXModG9wTGV2ZWxSb3V0ZSwgc3RyLCByZWdleFRva2Vucykge1xuICAgIGNvbnN0IHF1ZXJ5UmUgPSAvXihbP10pPyguKikkL1xuICAgIGNvbnN0IHJvdXRlVmFsdWUgPSBzdHJcbiAgICBjb25zdCBzdHJBcnIgPSBzdHIucmVwbGFjZShxdWVyeVJlLCAnJDInKVxuICAgIGNvbnN0IGNvbnZlcnRUb1BhcmFtcyA9IGNvbXBvc2UobWFwKHNwbGl0KCc9JykpLCBzcGxpdCgnJicpKVxuICAgIGNvbnN0IHBhcmFtc0FyciA9IGNvbnZlcnRUb1BhcmFtcyhzdHJBcnIpXG4gICAgbGV0IHJvdXRlRGF0YSA9IGZyb21QYWlycyhwYXJhbXNBcnIpXG5cbiAgICBsZXQgcGF0aHMgPSBtYXAoaGVhZCwgcGFyYW1zQXJyKVxuXG4gICAgaWYgKGlzRW1wdHkoc3RyKSA9PT0gdHJ1ZSkge1xuICAgICAgcm91dGVEYXRhID0gdGhpcy5jcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIodG9wTGV2ZWxSb3V0ZSwgc3RyLCByZWdleFRva2VucylcbiAgICAgIHBhdGhzID0ga2V5cyhyb3V0ZURhdGEpXG4gICAgfVxuICAgIGNvbnN0IHBhdGhJbm5lcm1vc3QgPSB0aGlzLmdldExhc3RBcnJWYWwocGF0aHMpXG5cbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlIH1cbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0Um91dGVUb1BhcmFtcyhzdHIsIHJvdXRlQ29uZmlnLCB0KSB7XG4gICAgY29uc3QgYWRkU2xhc2ggPSAodXJsKSA9PiB1cmwucmVwbGFjZSgvXFwvJHwkLywgJy8nKVxuICAgIGlmIChyb3V0ZUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByb3V0ZUNvbmZpZy50eXBlXG4gICAgY29uc3QgcmVnZXhUb2tlbnMgPSBkZWZhdWx0VG8oe30sIHByb3AoJ3JlZ2V4VG9rZW5zJywgcm91dGVDb25maWcpKVxuICAgIGNvbnN0IHRvcExldmVsUm91dGUgPSByb3V0ZUNvbmZpZy5yb3V0ZXMucm91dGVQYXRoXG5cbiAgICBpZiAodHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFF1ZXJ5U3RyVG9QYXJhbXModG9wTGV2ZWxSb3V0ZSwgc3RyKVxuICAgIH1cbiAgICBzdHIgPSBhZGRTbGFzaChzdHIpXG5cbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2xhc2hSb3V0ZVN0clRvUGFyYW1zT2JqKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpXG4gIH1cbn1cbiIsImltcG9ydCB7IGZyb21FdmVudFBhdHRlcm4gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbGFzdCwgZmxhdHRlbiwgY2xvbmUsIHBpY2ssIHByb3AsIHBpY2tBbGwsIHBhdGgsIGVxdWFscywgY29tcG9zZSwga2V5cywgZmlsdGVyLCBwcm9wRXEsIHVuaXEsIG1hcCwgX18sIGNoYWluLCBpcywgaW5jbHVkZXMsIGZyb21QYWlycywgcmVqZWN0LCBtZXJnZURlZXBSaWdodCwgbWVyZ2VSaWdodCwgdGVzdCwgdG9QYWlycywgdmFsdWVzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIH0gZnJvbSAnLi9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcydcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsUm91dGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFNweW5lVXRpbHNDaGFubmVsUm91dGVcbiAgICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGRlc2NcbiAgICAgKiBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMgZm9yIHRoZSBTcHluZVJvdXRlQ2hhbm5lbFxuICAgICAqXG4gICAgICovXG4gICAgdGhpcy5jcmVhdGVQb3BTdGF0ZVN0cmVhbSA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY3JlYXRlUG9wU3RhdGVTdHJlYW0uYmluZCh0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVBvcFN0YXRlU3RyZWFtKHN1YnNjcmliZUZuKSB7XG4gICAgY29uc3QgYWRkSGFuZGxlciA9IGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gaGFuZGxlclxuICAgIH1cbiAgICBjb25zdCByZW1vdmVIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKCkge31cbiAgICB9XG4gICAgY29uc3QgcG9wdXBPYnMkID0gZnJvbUV2ZW50UGF0dGVybihhZGRIYW5kbGVyLCByZW1vdmVIYW5kbGVyKVxuXG4gICAgcG9wdXBPYnMkLnN1YnNjcmliZShzdWJzY3JpYmVGbilcbiAgfVxuXG4gIHN0YXRpYyBnZXRMYXN0QXJyVmFsKGFycikge1xuICAgIGNvbnN0IGdldExhc3RQYXJhbSA9IChhKSA9PiBsYXN0KGEpICE9PSB1bmRlZmluZWQgPyBsYXN0KGEpIDogJydcbiAgICByZXR1cm4gZ2V0TGFzdFBhcmFtKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjb21wYXJlUm91dGVLZXl3b3JkcyhvYmogPSB7fSwgYXJyKSB7XG4gICAgY29uc3QgcGlja1ZhbHVlcyA9IChvLCBhKSA9PiBhICE9PSB1bmRlZmluZWQgPyBwaWNrKGEsIG8pIDogb1xuICAgIGxldCBvYmoxID0gcGlja1ZhbHVlcyhvYmosIGFycilcbiAgICByZXR1cm4ge1xuICAgICAgcGlja1ZhbHVlcyxcbiAgICAgIGNvbXBhcmU6IChvYmogPSB7fSwgYXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iajIgPSBwaWNrVmFsdWVzKG9iaiwgYXJyKVxuICAgICAgICBjb25zdCBjb21wYXJlUHJvcHMgPSBwID0+IHtcbiAgICAgICAgICBjb25zdCBwMSA9IHByb3AocCwgb2JqMSlcbiAgICAgICAgICBjb25zdCBwMiA9IHByb3AocCwgb2JqMilcbiAgICAgICAgICBjb25zdCBzYW1lID0gZXF1YWxzKHAxLCBwMilcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0V4aXN0cyA9IHAxICE9PSB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBuZXh0RXhpc3RzID0gcDIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IGNoYW5nZWQgPSAhc2FtZVxuICAgICAgICAgIGNvbnN0IGFkZGVkID0gcHJldmlvdXNFeGlzdHMgPT09IGZhbHNlICYmIG5leHRFeGlzdHMgPT09IHRydWVcbiAgICAgICAgICBjb25zdCByZW1vdmVkID0gcHJldmlvdXNFeGlzdHMgPT09IHRydWUgJiYgbmV4dEV4aXN0cyA9PT0gZmFsc2VcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlA6IFwiLHAse3NhbWUsIHByZXZpb3VzRXhpc3RzLCBuZXh0RXhpc3RzfSk7XG4gICAgICAgICAgY29uc3Qgb2JqID0ge31cbiAgICAgICAgICBvYmpbcF0gPSB7IHNhbWUsIGNoYW5nZWQsIGFkZGVkLCByZW1vdmVkLCBwcmV2aW91c0V4aXN0cywgbmV4dEV4aXN0cyB9XG4gICAgICAgICAgcmV0dXJuIG9ialxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3JlYXRlUHJlZCA9IHAgPT4gY29tcG9zZShrZXlzLCBmaWx0ZXIocHJvcEVxKHRydWUsIHApKSlcblxuICAgICAgICBjb25zdCBnZXRQcm9wc1N0YXRlID0gY29tcG9zZShtYXAoY29tcGFyZVByb3BzKSwgdW5pcSwgY2hhaW4oa2V5cykpKFtvYmoxLCBvYmoyXSlcbiAgICAgICAgY29uc3QgcGF0aHNDaGFuZ2VkID0gY2hhaW4oY3JlYXRlUHJlZCgnY2hhbmdlZCcpLCBnZXRQcm9wc1N0YXRlKVxuICAgICAgICBjb25zdCBwYXRoc0FkZGVkID0gY2hhaW4oY3JlYXRlUHJlZCgnYWRkZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgY29uc3QgcGF0aHNSZW1vdmVkID0gY2hhaW4oY3JlYXRlUHJlZCgncmVtb3ZlZCcpLCBnZXRQcm9wc1N0YXRlKVxuICAgICAgICBvYmoxID0gb2JqMlxuICAgICAgICByZXR1cm4geyBwYXRoc0FkZGVkLCBwYXRoc1JlbW92ZWQsIHBhdGhzQ2hhbmdlZCB9XG4gICAgICB9LFxuXG4gICAgICBnZXRDb21wYXJlcjogKCkgPT4gb2JqMVxuXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlQXJyRGF0YShyb3V0ZUFyciwgcGFyYW1zQXJyKSB7XG4gICAgY29uc3QgcGF0aHMgPSAgZmlsdGVyKGluY2x1ZGVzKF9fLCByb3V0ZUFyciksIHBhcmFtc0FycilcbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuICAgIC8vIGNvbnNvbGUubG9nKCdhcnIgYW5kIHJvdXRlTmFtZSAnLHtwYXRocywgcGF0aElubmVybW9zdH0pO1xuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0IH1cbiAgfVxuXG4gIHN0YXRpYyBmbGF0dGVuQ29uZmlnT2JqZWN0KG9iaikge1xuICAgIGNvbnN0IGdvID0gKG9ial8pID0+IGNoYWluKChbaywgdl0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICByZXR1cm4gbWFwKChba18sIHZfXSkgPT4gW2Ake2t9LiR7a199YCwgdl9dLCBnbyh2KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbW2ssIHZdXVxuICAgICAgfVxuICAgIH0sIHRvUGFpcnMob2JqXykpXG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIkZMQVRURU46IFwiLCB2YWx1ZXMoZnJvbVBhaXJzKGdvKG9iaikpKSk7XG4gICAgcmV0dXJuIHZhbHVlcyhmcm9tUGFpcnMoZ28ob2JqKSkpXG4gIH1cblxuICBzdGF0aWMgYWRkUm91dGVEYXRhc2V0cyhjaGFubmVsUm91dGVPYmopIHtcbiAgICAvLyBjaGFubmVsUm91dGVPYmoudHlwZT0ncXVlcnknO1xuXG4gICAgZnVuY3Rpb24gcmVtb3ZlVW5kZWZpbmVkKGFycikge1xuICAgICAgcmV0dXJuIGFyci5tYXAob2JqID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gJ3VuZGVmaW5lZCcgfHwgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldXG4gICAgICAgICAgfSBlbHNlIGlmIChvYmpba2V5XSAmJiB0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9ialtrZXldKSkge1xuICAgICAgICAgICAgLy8gcmVjdXJzZSBpZiBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICBvYmpba2V5XSA9IHJlbW92ZVVuZGVmaW5lZChbb2JqW2tleV1dKVswXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHsgdHlwZSwgaXNIYXNoIH0gPSBjaGFubmVsUm91dGVPYmpcblxuICAgIC8vIGNyZWF0ZSBocmVmIGFuZCBjaGVjayB0byBzZWUgaWYgbmVlZCB0byBjb252ZXJ0IHRvIGhhc2ggaHJlZiBsaW5rc1xuICAgIGNvbnN0IGdldEhSRUYgPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCBzYW50aXplSFJFRiA9IHN0ciA9PiB7XG4gICAgICAgIGNvbnN0IGhyZWZSRSA9IC9eKC4qXFwvKShbXFx3LV0qXFwvPykoLiopJC9nbVxuICAgICAgICAvLyBjb25zdCBocmVmUkUgPSAvXiguKlxcLykoW1xcdy1dKikoLiopJC9nbTtcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoaHJlZlJFLCAnJDEkMicpXG4gICAgICAgIC8vIHN0ciA9IFN0cmluZyhzdHIpLnJlcGxhY2UoJ14kJywgXCJcIik7XG4gICAgICAgIHJldHVybiBzdHJcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGVhZFN0clZhbCA9IHR5cGUgPT09ICdxdWVyeScgPyAnJyA6IGlzSGFzaCA9PT0gdHJ1ZSA/ICcjJyA6ICcvJ1xuICAgICAgY29uc3QgaHJlZlN0ciA9ICBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRQYXJhbXNUb1JvdXRlKG9iaiwgY2hhbm5lbFJvdXRlT2JqKVxuICAgICAgcmV0dXJuIGhlYWRTdHJWYWwgKyBzYW50aXplSFJFRihocmVmU3RyKVxuICAgIH1cblxuICAgIC8vIHJlbW92ZSBzcGVjaWFsIGNoYXJzIGZyb20gaHJlZlxuICAgIGNvbnN0IHNhbml0aXplU3RyID0gKHN0cikgPT4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFteQS1aYS16MC05LV9dKS9nLCAnJylcblxuICAgIC8vIHRlc3Qgd2hldGhlciB0byB1c2Uga2V5IG9yIHZhbFxuICAgIGNvbnN0IGlzVmFsaWRTdHJSRSA9IC9eKFtBLVphLXowLTlfLV0pKyQvbVxuXG4gICAgY29uc3QgY3JlYXRlSW5pdGlhbFZhbEZuID0gKGFjY01haW4gPSBbXSwgcm91dGVQYXRoT2JqLCBvYmpBY2MgPSB7fSkgPT4ge1xuICAgICAgbGV0IHsgcm91dGVOYW1lIH0gPSByb3V0ZVBhdGhPYmpcblxuICAgICAgY29uc3QgcHJvcHNSZWR1Y2VyID0gKGFjYywgYXJyUGFpcikgPT4ge1xuICAgICAgICBjb25zdCBba2V5LCB2YWxdID0gYXJyUGFpclxuICAgICAgICBjb25zdCBpc09iamVjdCA9IGlzKE9iamVjdCwgdmFsKVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVRpdGxlID0gKHN0cikgPT4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFstX10pL2csICcgJykudG9VcHBlckNhc2UoKVxuXG4gICAgICAgIGNvbnN0IGdldExpbmtUZXh0ID0gc3RyID0+IHRlc3QoaXNWYWxpZFN0clJFLCBzdHIpID8gY3JlYXRlVGl0bGUoc3RyKSA6IGtleVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdyb3V0ZU5hbWUnIHx8IGtleSA9PT0gJzQwNCcpIHtcbiAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgIH1cblxuICAgICAgICByb3V0ZU5hbWUgPSByb3V0ZU5hbWUgfHwgcHJvcCgncm91dGVOYW1lJywgdmFsKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRIRSBLRVkgSVMgXCIse2tleSx2YWwscm91dGVOYW1lfSlcblxuICAgICAgICBsZXQgbyA9IGNsb25lKG9iakFjYylcbiAgICAgICAgb1tyb3V0ZU5hbWVdID0gc2FuaXRpemVTdHIoa2V5KVxuXG4gICAgICAgIGlmIChpc09iamVjdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGlmIChrZXlzKG8pLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViUm91dGVOYW1lID0gcGF0aChbJ3JvdXRlUGF0aCcsICdyb3V0ZU5hbWUnXSwgdmFsKVxuICAgICAgICAgICAgaWYgKHN1YlJvdXRlTmFtZSkge1xuICAgICAgICAgICAgICBjb25zdCBvQmFzZSA9IGNsb25lKG8pXG4gICAgICAgICAgICAgIG9CYXNlW3N1YlJvdXRlTmFtZV0gPSAnJ1xuICAgICAgICAgICAgICBvQmFzZS5uYXZMZXZlbCA9IGtleXMob2JqQWNjKS5sZW5ndGhcbiAgICAgICAgICAgICAgb0Jhc2UudGl0bGUgPSBnZXRMaW5rVGV4dChrZXkpXG4gICAgICAgICAgICAgIG9CYXNlLmhyZWYgPSBnZXRIUkVGKG9CYXNlKVxuICAgICAgICAgICAgICBhY2MucHVzaChvQmFzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbyA9IGNyZWF0ZUluaXRpYWxWYWxGbihhY2NNYWluLCB2YWwsIG8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgby50aXRsZSA9IGdldExpbmtUZXh0KGtleSlcbiAgICAgICAgICBvLmhyZWYgPSBnZXRIUkVGKG8pXG4gICAgICAgIH1cbiAgICAgICAgby5uYXZMZXZlbCA9IGtleXMob2JqQWNjKS5sZW5ndGhcbiAgICAgICAgYWNjLnB1c2gobylcbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9QYWlycyhyb3V0ZVBhdGhPYmopLnJlZHVjZShwcm9wc1JlZHVjZXIsIFtdKVxuICAgIH1cblxuICAgIGNvbnN0IHJlZHVjZWRBcnIgPSBjcmVhdGVJbml0aWFsVmFsRm4oW10sIGNoYW5uZWxSb3V0ZU9iai5yb3V0ZXMpXG4gICAgbGV0IHJvdXRlRGF0YXNldHNBcnIgPSBmbGF0dGVuKHJlZHVjZWRBcnIpXG4gICAgcm91dGVEYXRhc2V0c0FyciA9IHJlbW92ZVVuZGVmaW5lZChyb3V0ZURhdGFzZXRzQXJyKVxuXG4gICAgY29uc3QgZ2V0TmF2UHJvcHMgPSAoZGF0YXNldHNBcnIpID0+IHtcbiAgICAgIGNvbnN0IGV4Y2x1ZGUgPSByZWplY3QoaW5jbHVkZXMoX18sIFsndGl0bGUnLCAnaHJlZicsICduYXZMZXZlbCcsICd1bmRlZmluZWQnXSkpXG4gICAgICBjb25zdCBnZXRNYWluS2V5cyA9IGNvbXBvc2UodW5pcSwgZXhjbHVkZSwgZmxhdHRlbiwgbWFwKGtleXMpKVxuICAgICAgcmV0dXJuIGdldE1haW5LZXlzKGRhdGFzZXRzQXJyKVxuICAgIH1cbiAgICBjb25zdCByb3V0ZU5hbWVzQXJyID0gZ2V0TmF2UHJvcHMocm91dGVEYXRhc2V0c0FycilcblxuICAgIHJldHVybiB7IHJvdXRlRGF0YXNldHNBcnIsIHJvdXRlTmFtZXNBcnIgfVxuICB9XG5cbiAgc3RhdGljIGNvbmZvcm1Sb3V0ZU9iamVjdChjaGFubmVsUm91dGVPYmogPSB7fSwgYWRkNDA0UHJvcHMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGNoYW5uZWxzUm91dGVQYXRoID0gcGF0aChbJ2NoYW5uZWxzJywgJ1JPVVRFJ10sIGNoYW5uZWxSb3V0ZU9iailcbiAgICBsZXQgeyBhZGQ0MDRzIH0gPSBjaGFubmVsc1JvdXRlUGF0aCAhPT0gdW5kZWZpbmVkID8gY2hhbm5lbHNSb3V0ZVBhdGggOiBjaGFubmVsUm91dGVPYmpcbiAgICBhZGQ0MDRzID0gYWRkNDA0cyB8fCBhZGQ0MDRQcm9wc1xuICAgIGNvbnN0IHBhcnNlUm91dGVQYXRoID0gKGEpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IGFbMV1cbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGlmICh2YWwgPT09ICcnKSB7XG4gICAgICAgIGFbMV0gPSAnXiQnXG4gICAgICB9IGVsc2UgaWYgKGlzQXJyKSB7XG4gICAgICAgIGFbMV0gPSB2YWwuam9pbignfCcpXG4gICAgICB9XG4gICAgICByZXR1cm4gYVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zZHVjZUNvbmZpZyA9IChhcnIpID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJcbiAgICAgIGNvbnN0IG9iajQwNCA9IGFkZDQwNHMgPyB7IDQwNDogJy4rJyB9IDoge31cbiAgICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0LCB2YWwpXG4gICAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5LCB2YWwpXG4gICAgICBjb25zdCBpdGVyT2JqID0gaXNPYmogPT09IHRydWUgJiYgaXNBcnIgPT09IGZhbHNlXG4gICAgICBjb25zdCBpc1JvdXRlUGF0aCA9IGtleSA9PT0gJ3JvdXRlUGF0aCdcbiAgICAgIGlmIChpdGVyT2JqKSB7XG4gICAgICAgIGFyclsxXSA9IGNvbmZpZ01hcHBlckZuKGFyclsxXSlcbiAgICAgICAgaWYgKGlzUm91dGVQYXRoKSB7XG4gICAgICAgICAgYXJyWzFdID0gY29tcG9zZShtZXJnZURlZXBSaWdodChvYmo0MDQpLCBmcm9tUGFpcnMsIG1hcChwYXJzZVJvdXRlUGF0aCksIHRvUGFpcnMpKGFyclsxXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyclxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ01hcHBlckZuID0gY29tcG9zZShmcm9tUGFpcnMsIG1hcCh0cmFuc2R1Y2VDb25maWcpLCB0b1BhaXJzKVxuXG4gICAgaWYgKGNoYW5uZWxzUm91dGVQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSA9IGNvbmZpZ01hcHBlckZuKGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSlcbiAgICAgIGNvbnN0IGV4dHJhUm91dGVEYXRhID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5hZGRSb3V0ZURhdGFzZXRzKGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSlcbiAgICAgIGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSA9IG1lcmdlUmlnaHQoY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFLCBleHRyYVJvdXRlRGF0YSlcbiAgICAgIHJldHVybiBjaGFubmVsUm91dGVPYmpcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnTWFwcGVyRm4oY2hhbm5lbFJvdXRlT2JqKVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbUV2ZW50UGF0dGVybiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IG1hcE9iakluZGV4ZWQgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsV2luZG93IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3dcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcyBmb3IgU3B5bmVXaW5kb3dDaGFubmVsXG4gICAqXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQgPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50LmJpbmQoXG4gICAgICB0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoZXZlbnROYW1lLCBtYXBGbiwgaXNQYXNzaXZlID0gdHJ1ZSwgZWxlbWVudCA9IHdpbmRvdykge1xuICAgIGNvbnN0IGFkZEhhbmRsZXIgPSBoYW5kbGVyID0+IGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIsXG4gICAgICB7IHBhc3NpdmU6IGlzUGFzc2l2ZSB9KVxuICAgIGNvbnN0IHJlbW92ZUhhbmRsZXIgPSAoKSA9PiB7IGVsZW1lbnRbZXZlbnROYW1lXSA9IChwKSA9PiBwIH1cbiAgICBtYXBGbiA9IG1hcEZuID09PSB1bmRlZmluZWQgPyAocCkgPT4gcCA6IG1hcEZuXG4gICAgcmV0dXJuIGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlcikucGlwZShtYXAobWFwRm4pKVxuICB9XG5cbiAgLy8gTUVESUEgUVVFUklFU1xuICBzdGF0aWMgY3JlYXRlTWVkaWFRdWVyeShzdHIpIHtcbiAgICBjb25zdCBtcSA9IHdpbmRvdy5tYXRjaE1lZGlhKHN0cilcbiAgICB0aGlzLmNoZWNrSWZWYWxpZE1lZGlhUXVlcnkobXEsIHN0cilcbiAgICByZXR1cm4gbXEgIT09IGZhbHNlID8gbXEgOiBmYWxzZVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZWYWxpZE1lZGlhUXVlcnkobXEsIHN0cikge1xuICAgIGNvbnN0IG5vU3BhY2VzID0gc3RyID0+IHN0ci5yZXBsYWNlKC9cXHMrL2dtLCAnJylcbiAgICBjb25zdCBpc1ZhbGlkQm9vbCA9IG1xLm1hdGNoZXMgIT09IHVuZGVmaW5lZCAmJiBub1NwYWNlcyhtcS5tZWRpYSkuaW5kZXhPZihub1NwYWNlcyhzdHIpKSA+PSAwXG4gICAgY29uc3Qgd2Fybk1zZyA9IHN0ciA9PiBjb25zb2xlLndhcm4oYFNweW5lIEluZm86IHRoZSBmb2xsb3dpbmcgcXVlcnkgc3RyaW5nLCBcIiR7c3RyfVwiLCBoYXMgYmVlbiBvcHRpbWl6ZWQgdG8gXCIke21xLm1lZGlhfVwiIGJ5IHRoZSBicm93c2VyIGFuZCBtYXkgbm90IGJlIGEgdmFsaWQgTWVkaWEgUXVlcnkgaXRlbSFgKVxuICAgIGlmIChpc1ZhbGlkQm9vbCA9PT0gZmFsc2UpIHtcbiAgICAgIHdhcm5Nc2coc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZEJvb2xcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlcihxdWVyeSwga2V5KSB7XG4gICAgY29uc3Qga2V5Rm4gPSBrZXkgPT4gcCA9PiB7XG4gICAgICBwLm1lZGlhUXVlcnlOYW1lID0ga2V5XG4gICAgICByZXR1cm4gcFxuICAgIH1cblxuICAgIGNvbnN0IG1hcEtleSA9IGtleUZuKGtleSlcblxuICAgIGNvbnN0IGhhbmRsZXJzID0gKHEpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZEhhbmRsZXI6IChoYW5kbGVyKSA9PiB7IHEuYWRkTGlzdGVuZXIoaGFuZGxlcikgfSxcbiAgICAgICAgcmVtb3ZlSGFuZGxlcjogKGhhbmRsZXIpID0+IHsgcS5vbmNoYW5nZSA9ICgpID0+IHt9IH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbWVkaWFRdWVyeUhhbmRsZXIgPSBoYW5kbGVycyhxdWVyeSlcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG4gICAgcmV0dXJuIG5ldyBmcm9tRXZlbnRQYXR0ZXJuKFxuICAgICAgbWVkaWFRdWVyeUhhbmRsZXIuYWRkSGFuZGxlcixcbiAgICAgIG1lZGlhUXVlcnlIYW5kbGVyLnJlbW92ZUhhbmRsZXIpXG4gICAgICAucGlwZShtYXAobWFwS2V5KSlcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZXJnZWRPYnNGcm9tT2JqKGNvbmZpZykge1xuICAgIGNvbnN0IG1lZGlhUXVlcmllc09iaiA9IGNvbmZpZy5tZWRpYVF1ZXJpZXMgfHwgY29uZmlnLm1lZGlhUXVlcmllc1xuICAgIGNvbnN0IGFyciA9IFtdXG5cbiAgICBjb25zdCBsb29wUXVlcmllcyA9ICh2YWwsIGtleSwgb2JqKSA9PiB7XG4gICAgICBjb25zdCBtcSA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lZGlhUXVlcnkodmFsKVxuICAgICAgaWYgKG1xICE9PSBmYWxzZSkge1xuICAgICAgICBhcnIucHVzaChTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlcihtcSwga2V5KSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJcbiAgICB9XG5cbiAgICBtYXBPYmpJbmRleGVkKGxvb3BRdWVyaWVzLCBtZWRpYVF1ZXJpZXNPYmopXG4gICAgcmV0dXJuIGFyclxuICB9XG59XG4iLCJjb25zdCBjcmVhdGVGYWRlcklubGluZVRleHQgPSAoaXNJbkJvb2wgPSBmYWxzZSwgdCA9IDEsIGUgPSAnZWFzZScsIHN0YXJ0WmVyb0Jvb2wgPSBmYWxzZSkgPT4ge1xuICBjb25zdCBpbml0T3BhY2l0eVplcm8gPSBzdGFydFplcm9Cb29sID09PSB0cnVlID8gJ29wYWNpdHk6MDsnIDogJydcbiAgY29uc3Qgb3BhY2l0eSA9IGlzSW5Cb29sID09PSB0cnVlID8gMSA6IDBcbiAgcmV0dXJuIGAke2luaXRPcGFjaXR5WmVyb310cmFuc2l0aW9uOiBvcGFjaXR5ICR7dH1zICR7ZX07IG9wYWNpdHk6ICR7b3BhY2l0eX07YFxufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVpbihlbCwgdCkge1xuICBjb25zdCBjdXJyZW50T3BhY2l0eSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5vcGFjaXR5ICogMVxuICBjb25zdCBzdGFydEF0WmVybyA9IGN1cnJlbnRPcGFjaXR5ID09PSAxXG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dCh0cnVlLCB0LCAnZWFzZScsIHN0YXJ0QXRaZXJvKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVvdXQoZWwsIHQsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dChmYWxzZSwgdCwgJ2Vhc2UnKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xuXG4gIC8vIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCB0ICogMTAwMCk7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBjYWxsYmFjaywgZmFsc2UpXG59XG4iLCJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBmbGlwLCBtZXJnZVJpZ2h0LCBjbG9uZSwgZm9yRWFjaCwgcHJvcFNhdGlzZmllcyB9IGZyb20gJ3JhbWRhJ1xuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1PYnNlcnZhYmxlIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1PYnNlcnZhYmxlXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgb2JzZXJ2YWJsZSB0aGF0IGNyZWF0ZXMgdGhlIFZpZXdTdHJlYW0gT2JzZXJ2YWJsZSB0aGF0IGJyYW5jaGVzIG91dCB0byBwYXJlbnQsIGludGVybmFsIGFuZCBjaGlsZCBkaXJlY3Rpb25zXG4gICAgICovXG4gICAgdGhpcy5wcm9wcy5vYnNlcnZhYmxlU3RyZWFtcyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsT2JzZXJ2YWJsZXMoKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpIHtcbiAgICBjb25zdCBkaXJJbnRlcm5hbCA9ICdpbnRlcm5hbCdcbiAgICBjb25zdCBkaXJQYXJlbnQgPSAncGFyZW50J1xuICAgIGNvbnN0IGRpckNoaWxkID0gJ2NoaWxkJ1xuICAgIHJldHVybiB7XG4gICAgICBQOiBbZGlyUGFyZW50XSxcbiAgICAgIEM6IFtkaXJDaGlsZF0sXG4gICAgICBQQ0k6IFtkaXJQYXJlbnQsIGRpckludGVybmFsLCBkaXJDaGlsZF0sXG4gICAgICBDSTogW2RpckNoaWxkLCBkaXJJbnRlcm5hbF0sXG4gICAgICBQSTogW2RpclBhcmVudCwgZGlySW50ZXJuYWxdLFxuICAgICAgUEM6IFtkaXJQYXJlbnQsIGRpckNoaWxkXVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhZGREZWZhdWx0RGlyKG9iaikge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyh7ICRkaXI6WydpbnRlcm5hbCddIH0sIGNsb25lKG9iaikpXG4gIH1cblxuICBzdGF0aWMgYWRkRG93bkludGVybmFsRGlyKG9iaiwgYXJyID0gWydpbnRlcm5hbCcsICdkb3duJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IGZsaXAobWVyZ2VSaWdodClcbiAgICByZXR1cm4gZGVmYXVsdHMoY2xvbmUob2JqKSwgeyAkZGlyOmFyciB9KVxuICB9XG5cbiAgc3RhdGljIGFkZENoaWxkQW5kSW50ZXJuYWxEaXIob2JqLCBhcnIgPSBbJ2NoaWxkJywgJ2Rvd24nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyhjbG9uZShvYmopLCB7ICRkaXI6YXJyIH0pXG4gIH1cblxuICBzdGF0aWMgbWFwVG9EZWZhdWx0RGlyKHApIHtcbiAgICByZXR1cm4gdGhpcy5hZGREZWZhdWx0RGlyKHApXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyhvYnMkID0gbmV3IFN1YmplY3QoKSwgdmlld05hbWUsIHZzaWQpIHtcbiAgICBpZiAodmlld05hbWUgIT09IHVuZGVmaW5lZCAmJiB2c2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9icyQudmlld05hbWUgPSB2aWV3TmFtZVxuICAgICAgb2JzJC52c2lkID0gdnNpZFxuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlclN0cmVhbXMgPSB2YWwgPT4gcHJvcFNhdGlzZmllcyhhcnJUeXBlID0+IGFyclR5cGUuaW5jbHVkZXModmFsKSwgJyRkaXInKVxuICAgIGNvbnN0IGZpbHRlclBhcmVudCA9IGZpbHRlclN0cmVhbXMoJ3BhcmVudCcpXG4gICAgY29uc3QgZmlsdGVyQ2hpbGQgPSBmaWx0ZXJTdHJlYW1zKCdjaGlsZCcpXG4gICAgY29uc3QgZmlsdGVySW50ZXJuYWwgPSBmaWx0ZXJTdHJlYW1zKCdpbnRlcm5hbCcpXG5cbiAgICBjb25zdCBhZGRmcm9tJCA9IHJlbFN0ciA9PiBtZXJnZVJpZ2h0KHsgZnJvbSQ6cmVsU3RyIH0pXG4gICAgY29uc3QgYWRkUGFyZW50ZnJvbSQgPSBhZGRmcm9tJCgnY2hpbGQnKVxuICAgIGNvbnN0IGFkZEludGVybmFsZnJvbSQgPSBhZGRmcm9tJCgnaW50ZXJuYWwnKVxuICAgIGNvbnN0IGFkZENoaWxkZnJvbSQgPSBhZGRmcm9tJCgncGFyZW50JylcblxuICAgIGNvbnN0IHJhdyQgPSAgb2JzJFxuICAgICAgLnBpcGUoZmlsdGVyKChwYXlsb2FkKSA9PiBwYXlsb2FkICE9PSB1bmRlZmluZWQgJiYgcGF5bG9hZC5hY3Rpb24gIT09IHVuZGVmaW5lZCkpXG5cbiAgICBjb25zdCB0b0ludGVybmFsJCA9IG9icyQucGlwZShmaWx0ZXIoZmlsdGVySW50ZXJuYWwpLCBtYXAoYWRkSW50ZXJuYWxmcm9tJCkpXG4gICAgY29uc3QgdG9QYXJlbnQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJQYXJlbnQpLCBtYXAoYWRkUGFyZW50ZnJvbSQpKVxuICAgIGNvbnN0IHRvQ2hpbGQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJDaGlsZCksIG1hcChhZGRDaGlsZGZyb20kKSlcblxuICAgIGNvbnN0IHN0cmVhbU9iaiA9IHtcbiAgICAgIHBhcmVudDogdG9QYXJlbnQkLFxuICAgICAgaW50ZXJuYWw6IHRvSW50ZXJuYWwkLFxuICAgICAgY2hpbGQ6IHRvQ2hpbGQkXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSAoYXJyID0gW10pID0+IHtcbiAgICAgIGNvbnN0IGVuZFN0cmVhbSA9IG8gPT4ge1xuICAgICAgICBvLmNvbXBsZXRlKClcbiAgICAgICAgby5pc1N0b3BwZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNldENvbXBsZXRlU3RyZWFtID0gKHN0cikgPT4ge1xuICAgICAgICBpZiAoc3RyZWFtT2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IG9icyQgPSBzdHJlYW1PYmpbc3RyXVxuICAgICAgICAgIGVuZFN0cmVhbShvYnMkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhcnIgIT09IHVuZGVmaW5lZCAmJiBhcnIubGVuZ3RoID49IDEpIHtcbiAgICAgICAgYXJyLmZvckVhY2goc2V0Q29tcGxldGVTdHJlYW0pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbXBsZXRlQWxsID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSBvID0+IHtcbiAgICAgICAgby5jb21wbGV0ZSgpXG4gICAgICAgIG8uaXNTdG9wcGVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgZm9yRWFjaChjb21wbGV0ZVN0cmVhbSwgW3JhdyQsIHRvSW50ZXJuYWwkLCB0b1BhcmVudCQsIHRvQ2hpbGQkXSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmF3JCwgdG9JbnRlcm5hbCQsIHRvUGFyZW50JCwgdG9DaGlsZCQsIGNvbXBsZXRlQWxsLCBjb21wbGV0ZVN0cmVhbVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaW5jbHVkZXMsIF9fLCBpZkVsc2UsIHBhdGgsIHByb3AsIHJlamVjdCwgaXMsIGlzTmlsLCBpc0VtcHR5IH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgc2FuaXRpemVIVE1MIGZyb20gJy4uL3V0aWxzL3Nhbml0aXplLWh0bWwuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxuLyoqXG4gKiBEb21FbGVtZW50VGVtcGxhdGVcbiAqXG4gKiBNdXN0YWNoZS1jb21wYXRpYmxlIHRlbXBsYXRlIGVuZ2luZSB1c2VkIGJ5IFZpZXdTdHJlYW0gYW5kIERvbUVsZW1lbnQgZm9yIEhUTUwgcmVuZGVyaW5nLlxuICpcbiAqIFN1cHBvcnRlZCBzeW50YXg6XG4gKiAgIHt7a2V5fX0gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGludGVycG9sYXRpb24sIEhUTUwtZXNjYXBlZFxuICogICB7e2tleS5wYXRoLnRvLnZhbHVlfX0gICAgICAgICAgICBkb3Qtbm90YXRpb24gcHJvcGVydHkgYWNjZXNzXG4gKiAgIHt7I2tleX19Li4ue3sva2V5fX0gICAgICAgICAgICAgIGFycmF5L29iamVjdCBzZWN0aW9uc1xuICogICB7ey59fSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGVsZW1lbnQgaW5zaWRlIGEgbG9vcFxuICogICB7eyN9fS4uLnt7L319ICAgICAgICAgICAgICAgICAgICB0b3AtbGV2ZWwgYmFyZSBhcnJheSAocGFzc2VkIGFzIGBkYXRhYClcbiAqXG4gKiBOZXN0aW5nOlxuICogICBEb21FbGVtZW50VGVtcGxhdGUgc3VwcG9ydHMgZXhhY3RseSBPTkUgbGV2ZWwgb2YgbmVzdGVkIGFycmF5IHNlY3Rpb25zLlxuICogICBBIHRlbXBsYXRlIGxpa2Uge3sjcm93c319Li4ue3sjY2VsbHN9fS4uLnt7L2NlbGxzfX0uLi57ey9yb3dzfX0gaXMgc3VwcG9ydGVkLlxuICogICBEZWVwZXIgbmVzdGluZyDigJQge3sjYX19e3sjYn19e3sjY319Li4ue3svY319e3svYn19e3svYX19IOKAlCBpcyBOT1Qgc3VwcG9ydGVkLlxuICpcbiAqICAgV2hlbiBhIHRlbXBsYXRlIGhhcyBkZWVwZXIgbmVzdGluZywgYSB3YXJuaW5nIGlzIGxvZ2dlZCBpbiBkZWJ1ZyBtb2RlIGFuZFxuICogICB0aGUgdGhpcmQtbGV2ZWwgbG9vcCBpcyBub3QgcHJvY2Vzc2VkLiBUaGlzIGlzIGEgZGVsaWJlcmF0ZSBkZXNpZ24gY2hvaWNlOlxuICogICBkZWVwIGhpZXJhcmNoaWNhbCByZW5kZXJpbmcgYmVsb25ncyBpbiBuZXN0ZWQgVmlld1N0cmVhbXMsIG5vdCBpbiB0ZW1wbGF0ZXMuXG4gKiAgIE5lc3RlZCBWaWV3U3RyZWFtcyBwcm92aWRlIHByb3BlciBsaWZlY3ljbGUgc2VtYW50aWNzLCBpc29sYXRlZCByZW5kZXJpbmcsXG4gKiAgIGFuZCBjbGVhcmVyIGFyY2hpdGVjdHVyYWwgYm91bmRhcmllcyB0aGFuIGFyYml0cmFyaWx5LW5lc3RlZCB0ZW1wbGF0ZXMuXG4gKlxuICogTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gbmVzdGVkIGxvb3BzOlxuICogICAtIENNUyBwcm94eSBtZXRhZGF0YSAoX19jbXNfX2RhdGFJZCwgX19jbXNfX2tleUZvcl8qKS4gSW5uZXItbG9vcCBDTVNcbiAqICAgICBlZGl0aW5nIGlzIGEgZnV0dXJlIGVuaGFuY2VtZW50OyB1bnRpbCB0aGVuLCBjb250ZW50IGluc2lkZSBhbiBpbm5lclxuICogICAgIGxvb3AgaXMgcmVuZGVyZWQgYXMgcmVhZC1vbmx5IGZyb20gdGhlIENNUyBwZXJzcGVjdGl2ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIERvbUVsZW1lbnRUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlLCBkYXRhID0ge30sIG9wdHMgPSB7fSkge1xuICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLmZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlKVxuICAgIHRoaXMuaXNQcm94eURhdGEgPSBkYXRhLl9fY21zX19pc1Byb3h5ID09PSB0cnVlXG4gICAgdGhpcy50ZXN0TW9kZSA9IG9wdHM/LnRlc3RNb2RlXG5cbiAgICAvLyBOb3JtYWxpemUgdHJpcGxlLWJyYWNrZXQgdGFncyB0byBkb3VibGUtYnJhY2tldC5cbiAgICAvL1xuICAgIC8vIERvbUVsZW1lbnRUZW1wbGF0ZSB0cmVhdHMge3t7a2V5fX19IGFzIGFuIGFsaWFzIGZvciB7e2tleX19IOKAlCBib3RoXG4gICAgLy8gaW50ZXJwb2xhdGUgdGhlIHZhbHVlIGFzLWlzLiBNdXN0YWNoZSdzIGNvbnZlbnRpb24gb2YgXCJ0cmlwbGUtYnJhY2tldFxuICAgIC8vIG1lYW5zIHVuZXNjYXBlZFwiIGRvZXNuJ3QgYXBwbHkgaGVyZSBiZWNhdXNlIFNweW5lSlMgaGFuZGxlcyBlc2NhcGluZ1xuICAgIC8vIGFuZCBzYW5pdGl6YXRpb24gdGhyb3VnaCBgc2FuaXRpemUtZGF0YWAgKGtleWVkIG9uIFNweW5lQXBwIG1vZGUpXG4gICAgLy8gYmVmb3JlIHZhbHVlcyByZWFjaCB0aGUgdGVtcGxhdGUsIG5vdCB0aHJvdWdoIHN5bnRheC1sZXZlbCBlc2NhcGluZy5cbiAgICAvL1xuICAgIC8vIFdlIGFjY2VwdCB0cmlwbGUtYnJhY2tldCBzeW50YXggc28gdGhhdCBhdXRob3JzIGFuZCBBSSBmYW1pbGlhciB3aXRoXG4gICAgLy8gc3RhbmRhcmQgTXVzdGFjaGUgZG9uJ3QgaGF2ZSB0aGVpciB0ZW1wbGF0ZXMgc2lsZW50bHkgYnJlYWsgd2hlbiB0aGV5XG4gICAgLy8gcmVhY2ggZm9yIHt7e2tleX19fSBvdXQgb2YgaGFiaXQuIFRoZSBub3JtYWxpemF0aW9uIGhhcHBlbnMgb25jZSBoZXJlLFxuICAgIC8vIHNvIHRoZSByZXN0IG9mIHRoZSBlbmdpbmUgb25seSBldmVyIHJlYXNvbnMgYWJvdXQgZG91YmxlLWJyYWNrZXQgdGFncy5cbiAgICB0aGlzLnRlbXBsYXRlID0gRG9tRWxlbWVudFRlbXBsYXRlLm5vcm1hbGl6ZVRyaXBsZUJyYWNrZXRzKHRoaXMudGVtcGxhdGUpXG5cbiAgICBpZiAodGhpcy5pc1Byb3h5RGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgcHJveHlGb3JtYXR0ZXIgPSBTcHluZUFwcFByb3BlcnRpZXMuZW5hYmxlQ01TUHJveGllcyA9PT0gdHJ1ZVxuICAgICAgICA/IFNweW5lQXBwUHJvcGVydGllcy5mb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YVxuICAgICAgICA6IERvbUVsZW1lbnRUZW1wbGF0ZS5mb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YVxuXG4gICAgICBpZiAodHlwZW9mIHByb3h5Rm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBwcm94eUZvcm1hdHRlcih0aGlzLnRlbXBsYXRlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrRm9yQXJyYXlEYXRhID0gKCkgPT4ge1xuICAgICAgaWYgKGlzKEFycmF5LCBkYXRhKSA9PT0gdHJ1ZSkge1xuICAgICAgICBkYXRhID0geyBzcHluZURhdGE6ZGF0YSB9XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLnJlcGxhY2UoJ3t7L319JywgJ3t7L3NweW5lRGF0YX19JylcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUucmVwbGFjZSgne3sjfX0nLCAne3sjc3B5bmVEYXRhfX0nKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrRm9yQXJyYXlEYXRhKClcblxuICAgIHRoaXMudGVtcGxhdGVEYXRhID0gZGF0YVxuXG4gICAgLy8gU3Rhc2ggdXNlZCBieSBwZXItaXRlcmF0aW9uIHN1YnN0aXR1dGlvbiBzbyB0aGF0IENNUyBwcm94eSBsb29rdXBzXG4gICAgLy8gZm9yIHN0cmluZy1hcnJheSBpdGVtcyAod2hlcmUgX19jbXNfX2RhdGFJZCAvIF9fY21zX19rZXlGb3JfKiBsaXZlIG9uXG4gICAgLy8gdGhlIFBBUkVOVCBhcnJheSwgbm90IG9uIHRoZSBpbmRpdmlkdWFsIHN0cmluZyBlbGVtZW50cykgY2FuIGZpbmQgdGhlXG4gICAgLy8gcGFyZW50IG9iamVjdCBhdCByZW5kZXIgdGltZS4gU2V0IGJ5IHBhcnNlVGhlVG1wbExvb3AsIGNsZWFyZWQgd2hlblxuICAgIC8vIHRoYXQgbG9vcCBjb21wbGV0ZXMuXG4gICAgdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YSA9IG51bGxcblxuICAgIGNvbnN0IHN0ckFyciA9IERvbUVsZW1lbnRUZW1wbGF0ZS5nZXRTdHJpbmdBcnJheSh0aGlzLnRlbXBsYXRlKVxuXG4gICAgbGV0IHN0ck1hdGNoZXMgPSB0aGlzLnRlbXBsYXRlLm1hdGNoKERvbUVsZW1lbnRUZW1wbGF0ZS5maW5kVG1wbExvb3BzUkUoKSlcbiAgICBzdHJNYXRjaGVzID0gc3RyTWF0Y2hlcyA9PT0gbnVsbCA/IFtdIDogc3RyTWF0Y2hlc1xuXG4gICAgY29uc3QgcGFyc2VUbXBsTG9vcHNSRSA9IERvbUVsZW1lbnRUZW1wbGF0ZS5wYXJzZVRtcGxMb29wc1JFKClcblxuICAgIGNvbnN0IHBhcnNlVG1wbExvb3BGbiA9IHRoaXMucGFyc2VUaGVUbXBsTG9vcC5iaW5kKHRoaXMpXG5cbiAgICBjb25zdCBtYXBUbXBsTG9vcCA9IChzdHIpID0+IHtcbiAgICAgIHJldHVybiBzdHIucmVwbGFjZShwYXJzZVRtcGxMb29wc1JFLCBwYXJzZVRtcGxMb29wRm4pXG4gICAgfVxuXG4gICAgY29uc3QgZmluZFRtcGxMb29wc1ByZWQgPSBpbmNsdWRlcyhfXywgc3RyTWF0Y2hlcylcbiAgICBjb25zdCBjaGVja0Zvck1hdGNoZXMgPSBpZkVsc2UoXG4gICAgICBmaW5kVG1wbExvb3BzUHJlZCxcbiAgICAgIG1hcFRtcGxMb29wLFxuICAgICAgdGhpcy5hZGRQYXJhbXMuYmluZCh0aGlzKSlcblxuICAgIHRoaXMuZmluYWxBcnIgPSBzdHJBcnIubWFwKGNoZWNrRm9yTWF0Y2hlcylcbiAgfVxuXG4gIHN0YXRpYyBpc1ByaW1pdGl2ZVRhZyhzdHIpIHtcbiAgICByZXR1cm4gLyh7e1xcLlxcKj99fSkvLnRlc3Qoc3RyKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgdHJpcGxlLWJyYWNrZXQgdGFncyB0byBkb3VibGUtYnJhY2tldCBmb3JtLlxuICAgKlxuICAgKiAgIHt7e2tleX19fSAgICAgICDihpIge3trZXl9fVxuICAgKiAgIHt7e2EuYi5jfX19ICAgICDihpIge3thLmIuY319XG4gICAqICAge3t7Ln19fSAgICAgICAgIOKGkiB7ey59fVxuICAgKiAgIHt7ey4qfX19ICAgICAgICDihpIge3suKn19XG4gICAqXG4gICAqIFNlY3Rpb24gbWFya2VycyB7eyNrZXl9fSBhbmQge3sva2V5fX0gYXJlIGFscmVhZHkgdHdvLWJyYWNrZXQgYnlcbiAgICogY29udmVudGlvbiBhbmQgYXJlIG5vdCBhZmZlY3RlZC4gVGFncyBvZiB0aGUgd3Jvbmcgc2hhcGUgKHVuYmFsYW5jZWQsXG4gICAqIGZvdXIgb3IgbW9yZSBicmFja2V0cywgZXRjLikgYXJlIGxlZnQgdW50b3VjaGVkIOKAlCBhbnl0aGluZyB0aGUgbWFpblxuICAgKiBwYXJzZXIgZG9lc24ndCByZWNvZ25pemUgbGF0ZXIgd2lsbCByZW5kZXIgYXMgbGl0ZXJhbCB0ZXh0LCB3aGljaCBpc1xuICAgKiB0aGUgY29ycmVjdCBmYWlsdXJlIG1vZGUgZm9yIGEgbG9naWMtbGVzcyB0ZW1wbGF0ZSBlbmdpbmUuXG4gICAqXG4gICAqIFRoaXMgZXhpc3RzIGJlY2F1c2UgRG9tRWxlbWVudFRlbXBsYXRlIHRyZWF0cyB7e3trZXl9fX0gYW5kIHt7a2V5fX1cbiAgICogYXMgaW50ZXJjaGFuZ2VhYmxlIOKAlCBzYW5pdGl6YXRpb24gYW5kIGVzY2FwaW5nIGFyZSBjb25maWctZHJpdmVuXG4gICAqIHRocm91Z2ggYHNhbml0aXplLWRhdGFgLCBub3Qgc3ludGF4LWRyaXZlbiB0aHJvdWdoIGJyYWNrZXQgY291bnQuXG4gICAqIE5vcm1hbGl6aW5nIGF0IGNvbnN0cnVjdGlvbiB0aW1lIG1lYW5zIHRoZSByZXN0IG9mIHRoZSBlbmdpbmUgKGxvb3BcbiAgICogcmVnZXhlcywgQ01TIHByb3h5IHdyYXBwaW5nLCB2YXJpYWJsZSBzdWJzdGl0dXRpb24pIG9ubHkgcmVhc29uc1xuICAgKiBhYm91dCBvbmUgYnJhY2tldCBzdHlsZS5cbiAgICovXG4gIHN0YXRpYyBub3JtYWxpemVUcmlwbGVCcmFja2V0cyh0ZW1wbGF0ZSkge1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgIT09ICdzdHJpbmcnIHx8IHRlbXBsYXRlLmluZGV4T2YoJ3t7eycpID09PSAtMSkge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlXG4gICAgfVxuICAgIC8vIE1hdGNoIGJhbGFuY2VkIHRyaXBsZS1icmFja2V0cyBjb250YWluaW5nIGFueXRoaW5nIHRoYXQgaXNuJ3QgYVxuICAgIC8vIGJyYWNlIGNoYXJhY3Rlci4gS2VlcHMgdGhlIGNhcHR1cmVkIGlubmVyIGNvbnRlbnQsIHN0cmlwcyB0aGVcbiAgICAvLyBvdXRlciB0aGlyZCBicmFjZSBvbiBlYWNoIHNpZGUuXG4gICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1xce1xce1xceyhbXnt9XSs/KVxcfVxcfVxcfS9nLCAne3skMX19JylcbiAgfVxuXG4gIC8vIEZJTkQgQ09SUkVDVCBORVNURUQgREFUQVxuICBzdGF0aWMgZ2V0TmVzdGVkRGF0YVJlZHVjZXIoZGF0YSA9IHt9LCBwYXJhbSA9ICcnKSB7XG4gICAgY29uc3QgZGF0YVJlZHVjZXIgPSAobmVzdGVkRGF0YSwgc3RyKSA9PiB7XG4gICAgICBpZiAobmVzdGVkRGF0YVtzdHJdKSB7XG4gICAgICAgIHJldHVybiBuZXN0ZWREYXRhW3N0cl1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgbmVzdGVkRGF0YSA9PT0gJ3N0cmluZycgPyBuZXN0ZWREYXRhIDogJydcbiAgICB9XG5cbiAgICByZXR1cm4gLyhcXC4pL2dtLnRlc3QoU3RyaW5nKHBhcmFtKSkgPyBTdHJpbmcocGFyYW0pLnNwbGl0KCcuJykucmVkdWNlKGRhdGFSZWR1Y2VyLCBkYXRhKSA6IGRhdGFbcGFyYW1dID8/ICcnXG4gIH1cblxuICBzdGF0aWMgZ2V0U3RyaW5nQXJyYXkodGVtcGxhdGUpIHtcbiAgICBjb25zdCBzdHJBcnIgPSB0ZW1wbGF0ZS5zcGxpdChEb21FbGVtZW50VGVtcGxhdGUuZmluZFRtcGxMb29wc1JFKCkpXG4gICAgY29uc3QgZW1wdHlSRSA9IC9eKFtcXFxcblxcc1xcV10rKSQvXG4gICAgLy8gZmluZFRtcGxMb29wc1JFIGhhcyBUV08gY2FwdHVyZSBncm91cHMgKHRoZSBmdWxsIGxvb3AgbWF0Y2gsIGFuZCB0aGVcbiAgICAvLyBcXDItYmFja3JlZmVyZW5jZWQga2V5IG5hbWUpLiBXaGVuIHVzZWQgd2l0aCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCB0aGVcbiAgICAvLyBzZWNvbmQgZ3JvdXAgaXMgZW1pdHRlZCBpbnRvIHRoZSByZXN1bHQgYXJyYXkgYXMgYSBsZWFrZWQgY2h1bmsuXG4gICAgLy9cbiAgICAvLyBUaGUgY2h1bmtzIGFycml2ZSBpbiBhIHByZWRpY3RhYmxlIDMtc3RlcCBjeWNsZTpcbiAgICAvLyAgIGluZGV4IDA6ICAgICAgICAgICAgICAgIHByZS10ZXh0IGJlZm9yZSB0aGUgZmlyc3QgbG9vcFxuICAgIC8vICAgaW5kZXggMTogZnVsbCBtYXRjaCAgICAgdGhlIGxvb3AgKGtlZXApXG4gICAgLy8gICBpbmRleCAyOiBncm91cC0yIGxlYWsgICB0aGUgbG9vcCdzIGtleSBuYW1lIChkaXNjYXJkKVxuICAgIC8vICAgaW5kZXggMzogICAgICAgICAgICAgICAgYmV0d2Vlbi1sb29wcyB0ZXh0XG4gICAgLy8gICBpbmRleCA0OiBmdWxsIG1hdGNoXG4gICAgLy8gICBpbmRleCA1OiBncm91cC0yIGxlYWtcbiAgICAvLyAgIC4uLlxuICAgIC8vIFNvIGFueSBpbmRleCBpIHdoZXJlIGkgPj0gMiBhbmQgKGkgLSAyKSAlIDMgPT09IDAgaXMgYSBrZXktbmFtZSBsZWFrXG4gICAgLy8gdGhhdCBzaG91bGQgbm90IGZsb3cgaW50byB0aGUgcmVuZGVyIHBpcGVsaW5lLlxuICAgIGNvbnN0IHdpdGhvdXRMZWFrcyA9IHN0ckFyci5maWx0ZXIoKF8sIGkpID0+ICEoaSA+PSAyICYmIChpIC0gMikgJSAzID09PSAwKSlcbiAgICBjb25zdCBmaWx0ZXJPdXRFbXB0eVN0cmluZ3MgPSBzID0+IHMubWF0Y2goZW1wdHlSRSlcbiAgICBjb25zdCBmaW5hbFN0ciA9IHJlamVjdChmaWx0ZXJPdXRFbXB0eVN0cmluZ3MsIHdpdGhvdXRMZWFrcylcblxuICAgIHJldHVybiBmaW5hbFN0clxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2V4IHRoYXQgZmluZHMgdG9wLWxldmVsIGxvb3Agc2VjdGlvbnMsIHBhaXJpbmcgZWFjaCBvcGVuaW5nIHRhZyB3aXRoIGFcbiAgICogY2xvc2luZyB0YWcgb2YgdGhlIFNBTUUgTkFNRSB2aWEgdGhlIFxcMiBiYWNrcmVmZXJlbmNlLiBUaGlzIGlzIHdoYXQgbWFrZXNcbiAgICoge3sjcm93c319PHRyPnt7I2NlbGxzfX08dGQ+e3sufX08L3RkPnt7L2NlbGxzfX08L3RyPnt7L3Jvd3N9fSBtYXRjaCBhcyBhXG4gICAqIHNpbmdsZSBvdXRlciBsb29wIHJhdGhlciB0aGFuIGdldHRpbmcgdHJ1bmNhdGVkIGF0IHRoZSBpbm5lciB7ey9jZWxsc319LlxuICAgKi9cbiAgc3RhdGljIGZpbmRUbXBsTG9vcHNSRSgpIHtcbiAgICByZXR1cm4gLyh7eyMoW1xcdy5dKyl9fVtcXHdcXG5cXHNcXFddKz97e1xcL1xcMn19KS9nbVxuICB9XG5cbiAgc3RhdGljIHBhcnNlVG1wbExvb3BzUkUoKSB7XG4gICAgcmV0dXJuIC8oe3sjKFtcXHcuXSspfX0pKFtcXHdcXG5cXHNcXFddKz8pKHt7XFwvXFwyfX0pL2dtXG4gIH1cblxuICAvKipcbiAgICogUmVnZXggZm9yIGZpbmRpbmcgYSBzaW5nbGUgaW5uZXIgbG9vcCBpbnNpZGUgYW4gb3V0ZXIgbG9vcCdzIGJvZHkuXG4gICAqIElkZW50aWNhbCBpbiBmb3JtIHRvIHBhcnNlVG1wbExvb3BzUkUsIGJ1dCBjcmVhdGVkIGZyZXNoIHRvIGF2b2lkXG4gICAqIHNoYXJlZC1sYXN0SW5kZXggYnVncyB3aXRoIGdsb2JhbCByZWdleGVzIHdoZW4gdXNlZCBpbiAucmVwbGFjZSBjYWxsYmFja3MuXG4gICAqL1xuICBzdGF0aWMgaW5uZXJMb29wUkUoKSB7XG4gICAgcmV0dXJuIC8oe3sjKFtcXHcuXSspfX0pKFtcXHdcXG5cXHNcXFddKz8pKHt7XFwvXFwyfX0pL2dtXG4gIH1cblxuICBzdGF0aWMgc3dhcFBhcmFtc0ZvclRhZ3NSRSgpIHtcbiAgICByZXR1cm4gLyh7eykoLio/KSh9fSkvZ21cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RzIHdoZXRoZXIgYSB0ZW1wbGF0ZSBib2R5IGNvbnRhaW5zIGFueSB7eyNrZXl9fS4uLnt7L2tleX19IHBhaXIuXG4gICAqIFVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIGlubmVyLWxvb3AgcGFzcyBpcyBuZWVkZWQsIGFuZCB0byBkZXRlY3RcbiAgICogdHdvLWxldmVsIG5lc3RpbmcgZm9yIHdhcm5pbmcgcHVycG9zZXMuXG4gICAqL1xuICBzdGF0aWMgaGFzTG9vcChzdHIpIHtcbiAgICByZXR1cm4gRG9tRWxlbWVudFRlbXBsYXRlLmlubmVyTG9vcFJFKCkudGVzdChzdHIpXG4gIH1cblxuICByZW1vdmVUaGlzKCkge1xuICAgIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZmluYWxBcnIgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudGVtcGxhdGVEYXRhID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFJldHVybnMgYSBkb2N1bWVudCBmcmFnbWVudCBnZW5lcmF0ZWQgZnJvbSB0aGUgdGVtcGxhdGUgYW5kIGFueSBhZGRlZCBkYXRhLlxuICAgKi9cbiAgcmVuZGVyRG9jRnJhZygpIHtcbiAgICBsZXQgaHRtbCA9IERvbUVsZW1lbnRUZW1wbGF0ZS5yZXBsYWNlSW1nUGF0aCh0aGlzLmZpbmFsQXJyLmpvaW4oJycpKVxuICAgIGlmICh0aGlzLnRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBodG1sID0gc2FuaXRpemVIVE1MKGh0bWwpXG4gICAgfVxuICAgIGNvbnN0IGlzVGFibGVTdWJUYWcgPSAvXihbXj5dKj8pKDwpezF9KFxcYikodGhlYWR8Y29sfGNvbGdyb3VwfHRib2R5fHRkfHRmb290fHRyfHRoKShcXGIpKFteXFwwXSopJC8udGVzdChodG1sKVxuICAgIGNvbnN0IGVsID0gaXNUYWJsZVN1YlRhZyA/IGh0bWwgOiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKVxuXG4gICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5yZW1vdmVUaGlzLCAyKVxuICAgIHJldHVybiBlbFxuICB9XG5cbiAgcmVuZGVyVG9TdHJpbmcoKSB7XG4gICAgbGV0IGh0bWwgPSB0aGlzLmZpbmFsQXJyLmpvaW4oJycpXG4gICAgaHRtbCA9IERvbUVsZW1lbnRUZW1wbGF0ZS5yZXBsYWNlSW1nUGF0aChodG1sKVxuICAgIGlmICh0aGlzLnRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICAvLyBTdHJpbmcoLi4uKSB1bndyYXBzIFRydXN0ZWRIVE1MIHdoZW4gc3RyaWN0IG1vZGUgaXMgYWN0aXZlLFxuICAgICAgLy8ga2VlcGluZyB0aGlzIG1ldGhvZCdzIHN0cmluZyBjb250cmFjdC5cbiAgICAgIGh0bWwgPSBTdHJpbmcoc2FuaXRpemVIVE1MKGh0bWwpKVxuICAgIH1cbiAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJlbW92ZVRoaXMsIDIpXG4gICAgcmV0dXJuIGh0bWxcbiAgfVxuXG4gIGdldFRlbXBsYXRlU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsQXJyLmpvaW4oJycpXG4gIH1cblxuICBmb3JtYXRUZW1wbGF0ZSh0ZW1wbGF0ZSkge1xuICAgIHJldHVybiBbJ1NDUklQVCcsICdURU1QTEFURSddLmluY2x1ZGVzKHByb3AoJ25vZGVOYW1lJywgdGVtcGxhdGUpKSA9PT0gdHJ1ZSA/IHRlbXBsYXRlLmlubmVySFRNTCA6IHRlbXBsYXRlXG4gIH1cblxuICBnZXREYXRhVmFsRnJvbVBhdGhTdHIocGF0aFN0ciwgZGF0YUZpbGUpIHtcbiAgICBjb25zdCBwYXRoQXJyID0gU3RyaW5nKHBhdGhTdHIpLnNwbGl0KCcuJylcbiAgICBjb25zdCBwYXRoRGF0YSA9IHBhdGgocGF0aEFyciwgZGF0YUZpbGUpXG4gICAgcmV0dXJuIHBhdGhEYXRhIHx8ICcnXG4gIH1cblxuICBhZGRQYXJhbXMoc3RyKSB7XG4gICAgY29uc3QgcmVwbGFjZVRhZ3MgPSAoc3RyLCBwMSwgcDIsIHAzKSA9PiB7XG4gICAgICByZXR1cm4gRG9tRWxlbWVudFRlbXBsYXRlLmdldE5lc3RlZERhdGFSZWR1Y2VyKHRoaXMudGVtcGxhdGVEYXRhLCBwMilcbiAgICB9XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKERvbUVsZW1lbnRUZW1wbGF0ZS5zd2FwUGFyYW1zRm9yVGFnc1JFKCksIHJlcGxhY2VUYWdzKVxuICB9XG5cbiAgc3RhdGljIHJlcGxhY2VJbWdQYXRoKHRlbXBsYXRlU3RyKSB7XG4gICAgY29uc3QgeyBJTUdfUEFUSCB9ID0gU3B5bmVBcHBQcm9wZXJ0aWVzXG4gICAgaWYgKElNR19QQVRIICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlbXBsYXRlU3RyID0gdGVtcGxhdGVTdHIucmVwbGFjZUFsbCgvc3JjXFxzKj1cXHMqKFsnXCJdKWltZ3NcXC8vZywgYHNyYz0kMSR7SU1HX1BBVEh9YClcbiAgICAgIHJldHVybiB0ZW1wbGF0ZVN0ci5yZXBsYWNlQWxsKC91cmxcXChcXHMqKFsnXCJdPylpbWdzXFwvL2csIGB1cmwoJDEke0lNR19QQVRIfWApXG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZVN0clxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgc2luZ2xlIGlubmVyIGxvb3AgKG9uZSBsZXZlbCBkb3duKSBpbnNpZGUgYW4gb3V0ZXItbG9vcCBib2R5LFxuICAgKiB1c2luZyBgcGFyZW50SXRlbWAgYXMgdGhlIGRhdGEgY29udGV4dC4gSWYgdGhlIGlubmVyIGJvZHkgaXRzZWxmIGNvbnRhaW5zXG4gICAqIGFub3RoZXIgbG9vcCwgYSBkZWJ1Zy1tb2RlIHdhcm5pbmcgaXMgbG9nZ2VkIGFuZCB0aGF0IGRlZXBlciBsb29wIGlzIG5vdFxuICAgKiBwcm9jZXNzZWQuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGJvZHkgc3RyaW5nIHdpdGggYW55IGlubmVyIGxvb3AgZXhwYW5kZWQsIHJlYWR5IGZvclxuICAgKiBvdXRlci1sZXZlbCB2YXJpYWJsZSBzdWJzdGl0dXRpb24uXG4gICAqL1xuICBwcm9jZXNzSW5uZXJMb29wKGJvZHlTdHIsIHBhcmVudEl0ZW0pIHtcbiAgICBjb25zdCBpbm5lclJFID0gRG9tRWxlbWVudFRlbXBsYXRlLmlubmVyTG9vcFJFKClcblxuICAgIHJldHVybiBib2R5U3RyLnJlcGxhY2UoaW5uZXJSRSwgKGZ1bGxNYXRjaCwgb3BlblRhZywgaW5uZXJLZXksIGlubmVyQm9keSAvKiwgY2xvc2VUYWcgKi8pID0+IHtcbiAgICAgIC8vIERldGVjdCBkaXNhbGxvd2VkIHNlY29uZC1sZXZlbCBuZXN0aW5nIGluc2lkZSB0aGUgaW5uZXIgYm9keS5cbiAgICAgIGlmIChEb21FbGVtZW50VGVtcGxhdGUuaGFzTG9vcChpbm5lckJvZHkpID09PSB0cnVlKSB7XG4gICAgICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWUgJiYgdGhpcy50ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdTcHluZSBXYXJuaW5nOiBEb21FbGVtZW50VGVtcGxhdGUgc3VwcG9ydHMgb25lIGxldmVsIG9mIG5lc3RlZCBhcnJheSBsb29wcy4gJyArXG4gICAgICAgICAgICBgQSBkZWVwZXIgbmVzdGVkIGxvb3Agd2FzIGRldGVjdGVkIGluc2lkZSBcInt7IyR7aW5uZXJLZXl9fX1cIi4gYCArXG4gICAgICAgICAgICAnQ29uc2lkZXIgcmVzdHJ1Y3R1cmluZyB2aWEgbmVzdGVkIFZpZXdTdHJlYW1zIGluc3RlYWQuJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICAvLyBTdHJpcCB1bnN1cHBvcnRlZCBkZWVwZXItbGV2ZWwgc2VjdGlvbiB0YWdzIHNvIHRoZXkgZG9uJ3QgZW1pdCBhc1xuICAgICAgICAvLyBnYXJibGVkIHZhcmlhYmxlcyBkdXJpbmcgc3Vic3RpdHV0aW9uIGJlbG93LlxuICAgICAgICBpbm5lckJvZHkgPSBpbm5lckJvZHkucmVwbGFjZSgve3tbIy9dW1xcdy5dK319L2csICcnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpbm5lckRhdGEgPSBEb21FbGVtZW50VGVtcGxhdGUuZ2V0TmVzdGVkRGF0YVJlZHVjZXIocGFyZW50SXRlbSwgaW5uZXJLZXkpXG5cbiAgICAgIGlmIChpc05pbChpbm5lckRhdGEpID09PSB0cnVlIHx8IGlzRW1wdHkoaW5uZXJEYXRhKSkge1xuICAgICAgICByZXR1cm4gJydcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5uZXJBcnIgPSBBcnJheS5pc0FycmF5KGlubmVyRGF0YSkgPyBpbm5lckRhdGEgOiBbaW5uZXJEYXRhXVxuXG4gICAgICAvLyBXaGlsZSBwcm9jZXNzaW5nIGFuIGlubmVyIGxvb3AsIHRoZSBcIm91dGVyXCIgZGF0YSBmb3IgQ01TIHN0cmluZy1pdGVtXG4gICAgICAvLyBsb29rdXBzIGlzIHRoZSBjdXJyZW50IGlubmVyRGF0YSAodGhlIGFycmF5L29iamVjdCB0aGUgaW5uZXIgaXRlbXNcbiAgICAgIC8vIGJlbG9uZyB0byksIG5vdCB0aGUgb3JpZ2luYWwgb3V0ZXItbG9vcCBhcnJheS4gU3dhcCBpdCBpbiwgcmVzdG9yZVxuICAgICAgLy8gd2hlbiB0aGUgaW5uZXIgcGFzcyBjb21wbGV0ZXMuXG4gICAgICBjb25zdCBwcmV2aW91c091dGVyID0gdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YVxuICAgICAgdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YSA9IGlubmVyRGF0YVxuXG4gICAgICBjb25zdCByZW5kZXJlZCA9IGlubmVyQXJyLm1hcCgoaW5uZXJJdGVtLCBpbm5lcklkeCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzdGl0dXRlRm9ySXRlbShpbm5lckJvZHksIGlubmVySXRlbSwgaW5uZXJJZHgpXG4gICAgICB9KS5qb2luKCcnKVxuXG4gICAgICB0aGlzLmN1cnJlbnRPdXRlckxvb3BEYXRhID0gcHJldmlvdXNPdXRlclxuICAgICAgcmV0dXJuIHJlbmRlcmVkXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzdGl0dXRlcyB7ey4uLn19IHZhcmlhYmxlcyBpbiBgc3RyYCB1c2luZyBgaXRlbWAgYXMgdGhlIGRhdGEgY29udGV4dC5cbiAgICpcbiAgICogVGhyZWUgY2FzZXM6XG4gICAqXG4gICAqICAgMS4gU3RyaW5nIGl0ZW0gKyBwcmltaXRpdmUge3sufX0ve3suKn19IHRlbXBsYXRlOlxuICAgKiAgICAgIGRpcmVjdCB0ZXh0IHN1YnN0aXR1dGlvbiAobm8gQ01TIHdyYXBwaW5nIHBvc3NpYmxlIOKAlCB0aGlzIHBhdGggb25seVxuICAgKiAgICAgIHJ1bnMgd2hlbiBmb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSBoYXMgTk9UIHdyYXBwZWQgdGhlIHRhZykuXG4gICAqXG4gICAqICAgMi4gU3RyaW5nIGl0ZW0gKyBub24tcHJpbWl0aXZlIHRlbXBsYXRlOlxuICAgKiAgICAgIGNhbiBoYXBwZW4gdHdvIHdheXM6IChhKSBhIHNlY3Rpb24gaXRlcmF0aW5nIHN0cmluZ3Mgd2hlcmVcbiAgICogICAgICBmb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSBoYXMgcmVwbGFjZWQge3sufX0ve3suKn19IHdpdGhcbiAgICogICAgICB7e3NweW5lTG9vcEtleX19ICsge3tvcmlnS2V5fX0gaW5zaWRlIGEgPHNweW5lLWNtcy1pdGVtPiB3cmFwcGVyLFxuICAgKiAgICAgIG9yIChiKSBhIG5vbi1wcm94eSB0ZW1wbGF0ZSB3aXRoIHBvc2l0aW9uYWwgdG9rZW5zIG9ubHkuXG4gICAqICAgICAgQnVpbGQgYSBjb250ZXh0IHRoYXQgc2F0aXNmaWVzIGJvdGgg4oCUIHNweW5lTG9vcEtleSA9IHRoZSBzdHJpbmcsXG4gICAqICAgICAgcGx1cyBfX2Ntc19fZGF0YUlkIC8gb3JpZ0tleSBsb29rZWQgdXAgb24gdGhlIHBhcmVudCBhcnJheSB3aGVuXG4gICAqICAgICAgcHJveHkgZGF0YSBpcyBhY3RpdmUuXG4gICAqXG4gICAqICAgMy4gT2JqZWN0IGl0ZW06XG4gICAqICAgICAgdGhlIGNvbnZlbnRpb25hbCBwYXRoIOKAlCBidWlsZCBhIGxvb2t1cCBvYmplY3Qgd2l0aCB0aGUgaXRlbSdzXG4gICAqICAgICAgcHJvcGVydGllcyBwbHVzIHBvc2l0aW9uYWwgdG9rZW5zLCBzdWJzdGl0dXRlIGJ5IHByb3BlcnR5IG5hbWVcbiAgICogICAgICBvciBkb3QtcGF0aC5cbiAgICovXG4gIHN1YnN0aXR1dGVGb3JJdGVtKHN0ciwgaXRlbSwgaW5kZXgpIHtcbiAgICAvLyBDYXNlIDE6IHN0cmluZyBpdGVtIHdpdGggYSBwcmltaXRpdmUtdGFnIHRlbXBsYXRlLlxuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChEb21FbGVtZW50VGVtcGxhdGUuaXNQcmltaXRpdmVUYWcoc3RyKSkge1xuICAgICAgICBjb25zdCBlc2NhcGVkID0gaXRlbS5yZXBsYWNlKC9cXCQvZywgJyQkJCQnKSAvLyAkIC0+ICQkIGZvciByZXBsYWNlKCkgbGl0ZXJhbCBzYWZldHlcbiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKERvbUVsZW1lbnRUZW1wbGF0ZS5zd2FwUGFyYW1zRm9yVGFnc1JFKCksIGVzY2FwZWQpXG4gICAgICB9XG5cbiAgICAgIC8vIENhc2UgMjogc3RyaW5nIGl0ZW0gd2l0aCBhIG5vbi1wcmltaXRpdmUgdGVtcGxhdGUuXG4gICAgICBjb25zdCBjdHggPSB0aGlzLmJ1aWxkU3RyaW5nSXRlbUNvbnRleHQoaXRlbSwgaW5kZXgpXG4gICAgICByZXR1cm4gdGhpcy5zdWJzdGl0dXRlT2JqZWN0KHN0ciwgY3R4KVxuICAgIH1cblxuICAgIC8vIENhc2UgMzogb2JqZWN0IGl0ZW0uXG4gICAgY29uc3QgZGF0YU9iaiA9IHRoaXMuYnVpbGRJdGVtQ29udGV4dChpdGVtLCBpbmRleClcbiAgICByZXR1cm4gdGhpcy5zdWJzdGl0dXRlT2JqZWN0KHN0ciwgZGF0YU9iailcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHBlci1pdGVyYXRpb24gbG9va3VwIGNvbnRleHQgZm9yIGEgU1RSSU5HIGl0ZW0uXG4gICAqXG4gICAqIEFsd2F5cyBpbmNsdWRlczpcbiAgICogICAtIHNweW5lTG9vcEtleTogdGhlIHN0cmluZyBpdHNlbGYgKG1hdGNoZXMgdGhlIENNUyBwcm94eSB3cmFwcGluZyxcbiAgICogICAgIHdoaWNoIHJlcGxhY2VzIHt7Ln19L3t7Lip9fSBpbnNpZGUgc3RyaW5nIGxvb3BzIHdpdGgge3tzcHluZUxvb3BLZXl9fSlcbiAgICogICAtIGxvb3BJbmRleCAvIGxvb3BOdW06IHBvc2l0aW9uYWwgdG9rZW5zXG4gICAqXG4gICAqIFdoZW4gcHJveHkgZGF0YSBpcyBhY3RpdmUsIGFkZGl0aW9uYWxseSBpbmNsdWRlczpcbiAgICogICAtIF9fY21zX19kYXRhSWQ6IHRoZSBDTVMgaWRlbnRpZmllciBmb3IgdGhlIFBBUkVOVCBhcnJheSAodGhlIHN0cmluZ1xuICAgKiAgICAgaXRlbXMgdGhlbXNlbHZlcyBhcmUgcHJpbWl0aXZlcyBhbmQgZG9uJ3QgY2FycnkgdGhlIGlkKVxuICAgKiAgIC0gb3JpZ0tleTogdGhlIG9yaWdpbmFsIGtleSB0aGUgQ01TIHVzZXMgdG8gYWRkcmVzcyB0aGlzIHNwZWNpZmljXG4gICAqICAgICBzdHJpbmcgd2l0aGluIGl0cyBwYXJlbnQsIGxvb2tlZCB1cCB2aWEgX19jbXNfX2tleUZvcl88aXRlbT5cbiAgICovXG4gIGJ1aWxkU3RyaW5nSXRlbUNvbnRleHQoaXRlbSwgaW5kZXgpIHtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgc3B5bmVMb29wS2V5OiBpdGVtLFxuICAgICAgbG9vcEluZGV4OiBpbmRleCxcbiAgICAgIGxvb3BOdW06IGluZGV4ICsgMVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzUHJveHlEYXRhID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBvdXRlckRhdGEgPSB0aGlzLmN1cnJlbnRPdXRlckxvb3BEYXRhXG4gICAgICBpZiAob3V0ZXJEYXRhICYmIHR5cGVvZiBvdXRlckRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnRleHQuX19jbXNfX2RhdGFJZCA9IG91dGVyRGF0YS5fX2Ntc19fZGF0YUlkIHx8ICcnXG4gICAgICAgIGNvbnN0IGtleUlkU3RyID0gYF9fY21zX19rZXlGb3JfJHtpdGVtfWBcbiAgICAgICAgY29udGV4dC5vcmlnS2V5ID0gb3V0ZXJEYXRhW2tleUlkU3RyXSAhPT0gdW5kZWZpbmVkID8gb3V0ZXJEYXRhW2tleUlkU3RyXSA6ICcnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0Ll9fY21zX19kYXRhSWQgPSAnJ1xuICAgICAgICBjb250ZXh0Lm9yaWdLZXkgPSAnJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBwZXItaXRlcmF0aW9uIGxvb2t1cCBjb250ZXh0IGZvciBhbiBPQkpFQ1QgaXRlbSwgaW5jbHVkaW5nXG4gICAqIENNUy1wcm94eSBtZXRhZGF0YSB3aGVuIHRoaXMgdGVtcGxhdGUgaXMgcmVuZGVyaW5nIHByb3hpZWQgZGF0YS5cbiAgICovXG4gIGJ1aWxkSXRlbUNvbnRleHQoaXRlbSwgaW5kZXgpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwge1xuICAgICAgbG9vcEluZGV4OiBpbmRleCxcbiAgICAgIGxvb3BOdW06IGluZGV4ICsgMVxuICAgIH0pXG5cbiAgICBpZiAodGhpcy5pc1Byb3h5RGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgY29udGV4dC5fX2Ntc19fZGF0YUlkID0gaXRlbS5fX2Ntc19fZGF0YUlkXG4gICAgICBjb250ZXh0LnNweW5lTG9vcEtleSA9IGl0ZW1cbiAgICAgIGNvbnRleHQubG9vcEluZGV4ID0gaW5kZXhcbiAgICAgIGNvbnRleHQubG9vcE51bSA9IGluZGV4ICsgMVxuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMge3trZXl9fSBhbmQge3thLmIuY319IHRva2VucyBpbiBgc3RyYCB1c2luZyBgY3R4YCBhcyB0aGUgc291cmNlLlxuICAgKi9cbiAgc3Vic3RpdHV0ZU9iamVjdChzdHIsIGN0eCkge1xuICAgIGNvbnN0IHJlRG90ID0gLyhcXC4pL2dtXG4gICAgY29uc3QgcG9zaXRpb25hbCA9IHsgbG9vcEluZGV4OiBjdHgubG9vcEluZGV4LCBsb29wTnVtOiBjdHgubG9vcE51bSB9XG5cbiAgICBjb25zdCByZXBsYWNlciA9IChtYXRjaCwgcDEsIHAyKSA9PiB7XG4gICAgICAvLyBBdXRvLWluamVjdGVkIHBvc2l0aW9uYWwgdG9rZW5zIHRha2UgcHJlY2VkZW5jZVxuICAgICAgaWYgKHBvc2l0aW9uYWxbcDJdICE9PSB1bmRlZmluZWQpIHJldHVybiBwb3NpdGlvbmFsW3AyXVxuXG4gICAgICAvLyBTaW1wbGUga2V5IGFjY2Vzc1xuICAgICAgaWYgKHJlRG90LnRlc3QocDIpID09PSBmYWxzZSAmJiBjdHhbcDJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGN0eFtwMl1cbiAgICAgIH1cblxuICAgICAgLy8gRG90LXBhdGggYWNjZXNzXG4gICAgICByZXR1cm4gdGhpcy5nZXREYXRhVmFsRnJvbVBhdGhTdHIocDIsIGN0eClcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgcmVwbGFjZXIpXG4gIH1cblxuICAvKipcbiAgICogRW50cnkgcG9pbnQgZm9yIGVhY2ggdG9wLWxldmVsIGxvb3AgbWF0Y2guIEV4dHJhY3RzIGxvb3AgZGF0YSwgcnVucyB0aGVcbiAgICogaW5uZXItbG9vcCBwYXNzIG9uIHRoZSBib2R5IGZvciBlYWNoIGl0ZXJhdGlvbiwgdGhlbiBzdWJzdGl0dXRlcyBvdXRlclxuICAgKiB2YXJpYWJsZXMuXG4gICAqL1xuICBwYXJzZVRoZVRtcGxMb29wKHN0ciwgcDEsIHAyLCBwMykge1xuICAgIGNvbnN0IG91dGVyQm9keSA9IHAzXG4gICAgY29uc3QgZWxEYXRhID0gRG9tRWxlbWVudFRlbXBsYXRlLmdldE5lc3RlZERhdGFSZWR1Y2VyKHRoaXMudGVtcGxhdGVEYXRhLCBwMilcblxuICAgIGlmIChpc05pbChlbERhdGEpID09PSB0cnVlIHx8IGlzRW1wdHkoZWxEYXRhKSkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgLy8gU3Rhc2ggdGhlIG91dGVyIGRhdGEgc28gdGhhdCBwZXItaXRlcmF0aW9uIHN1YnN0aXR1dGlvbiBjYW4gbG9vayB1cFxuICAgIC8vIENNUyBwcm94eSBtZXRhZGF0YSAoX19jbXNfX2RhdGFJZCwgX19jbXNfX2tleUZvcl8qKSB0aGF0IGxpdmVzIG9uIHRoZVxuICAgIC8vIHBhcmVudCBhcnJheSBvYmplY3Qg4oCUIG5vdCBvbiBpbmRpdmlkdWFsIHN0cmluZyBlbGVtZW50cy5cbiAgICBjb25zdCBwcmV2aW91c091dGVyID0gdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YVxuICAgIHRoaXMuY3VycmVudE91dGVyTG9vcERhdGEgPSBlbERhdGFcblxuICAgIGNvbnN0IGVsQXJyID0gQXJyYXkuaXNBcnJheShlbERhdGEpID8gZWxEYXRhIDogW2VsRGF0YV1cblxuICAgIC8vIFdoZXRoZXIgdGhlIG91dGVyIGJvZHkgY29udGFpbnMgYW4gaW5uZXIgbG9vcCBpcyBjaGVhcCB0byB0ZXN0IGFuZCBsZXRzXG4gICAgLy8gdXMgc2tpcCB0aGUgaW5uZXItbG9vcCBwcm9jZXNzaW5nIGVudGlyZWx5IGZvciB0aGUgY29tbW9uIHNpbmdsZS1sZXZlbCBjYXNlLlxuICAgIGNvbnN0IGJvZHlIYXNJbm5lckxvb3AgPSBEb21FbGVtZW50VGVtcGxhdGUuaGFzTG9vcChvdXRlckJvZHkpXG5cbiAgICBjb25zdCByZW5kZXJlZCA9IGVsQXJyLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBib2R5SGFzSW5uZXJMb29wXG4gICAgICAgID8gdGhpcy5wcm9jZXNzSW5uZXJMb29wKG91dGVyQm9keSwgaXRlbSlcbiAgICAgICAgOiBvdXRlckJvZHlcblxuICAgICAgcmV0dXJuIHRoaXMuc3Vic3RpdHV0ZUZvckl0ZW0oYm9keSwgaXRlbSwgaW5kZXgpXG4gICAgfSkuam9pbignJylcblxuICAgIHRoaXMuY3VycmVudE91dGVyTG9vcERhdGEgPSBwcmV2aW91c091dGVyXG4gICAgcmV0dXJuIHJlbmRlcmVkXG4gIH1cbn1cbiIsImltcG9ydCB7IGJhc2VDb3JlTWl4aW5zIH0gZnJvbSAnLi4vdXRpbHMvbWl4aW5zL2Jhc2UtY29yZS1taXhpbnMuanMnXG5pbXBvcnQgeyBEb21FbGVtZW50VGVtcGxhdGUgfSBmcm9tICcuL2RvbS1lbGVtZW50LXRlbXBsYXRlLmpzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZS5qcydcbmltcG9ydCB7IHNhbml0aXplQXR0cmlidXRlLCBhcHBseUlmcmFtZUhhcmRlbmluZyB9IGZyb20gJy4uL3V0aWxzL3Nhbml0aXplLWRhdGEuanMnXG5pbXBvcnQgeyBpcywgZGVmYXVsdFRvLCBwaWNrLCBtYXBPYmpJbmRleGVkLCBmb3JFYWNoT2JqSW5kZXhlZCwgcGlwZSB9IGZyb20gJ3JhbWRhJ1xuXG5jbGFzcyBEb21FbGVtZW50IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgRG9tRWxlbWVudFxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgaXMgdGhlIFZpZXdTdHJlYW0gcmVuZGVyaW5nIGVuZ2luZS48L3A+XG4gICAqIDxwPlRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHByb2Nlc3MgZm9yIGNyZWF0aW5nIEhUTUxFbGVtZW50cyB0aGF0IGRvIG5vdCByZXF1aXJlIHRoZSBsb2dpYyBhbmQgb3ZlcmhlYWQgb2YgYSBWaWV3U3RyZWFtIGluc3RhbmNlLjwvcD5cbiAgICogPGJ1dHRvbiBjbGFzcz0nbW9kYWwtYnRuIGJ0biBidG4tYmx1ZS1yZWYnIGRhdGEtdHlwZT0nbW9kYWwtd2luZG93JyBkYXRhLW51bT04MDAgZGF0YS12YWx1ZT0nYXR0cmlidXRlcyc+VmlldyBBdHRyaWJ1dGVzPC9idXR0b24+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZSB0aGUgdGFnbmFtZSBmb3IgdGhpcyBkb20gZWxlbWVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgYW55IGRvbUVsZW1lbnQgYXR0cmlidXRlIChleGNlcHQgZm9yIGNsYXNzIClcbiAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBkYXRhIHN0cmluZyBmb3IgdGV4dCB0YWdzIGFuZCBqc29uIGZvciB0ZW1wbGF0ZXNcbiAgICogQHBhcmFtIHt0ZW1wbGF0ZX0gdGVtcGxhdGVcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByb3BzLnRhZ05hbWUgLSA9ICdkaXYnOyBEZWZhdWx0IGZvciB0YWdOYW1lLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuYXR0cmlidXRlcyAtID0ge307IFRoaXMgY2FuIGJlIGFueSB2YWxpZCBIVE1MIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIHRhZ05hbWUuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfE9iamVjdH0gcHJvcHMuZGF0YSA9IHVuZGVmaW5lZDsgVGhpcyBpcyBlaXRoZXIgYSBTdHJpbmcgZm9yIGFuIGVsZW1lbnQgb3IgSlNPTiBkYXRhIG9iamVjdCBmb3IgYSB0ZW1wbGF0ZS5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd8SFRNTH0gcHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWQ7IElmIGEgdGVtcGxhdGUgaXMgZGVmaW5lZCwgdGhlIERvbUVsZW1lbnQgd2lsbCB1c2UgaXQuXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30sIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICBjb25zdCBjaGVja0RlZmF1bHQgPSAoZGZsdCwgdmFsKSA9PiBkZWZhdWx0VG8oZGZsdCkodmFsKVxuXG4gICAgcHJvcHMudGFnTmFtZSA9IGNoZWNrRGVmYXVsdCgnZGl2JywgcHJvcHMudGFnTmFtZSlcblxuICAgIHByb3BzLmF0dHJpYnV0ZXMgPSBwcm9wcy5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgPyBwcm9wcy5hdHRyaWJ1dGVzIDogdGhpcy5nZXREb21BdHRyaWJ1dGVzKHByb3BzKVxuICAgIHByb3BzLmF0dHJzID0gdGhpcy51cGRhdGVBdHRycyhwcm9wcy5hdHRyaWJ1dGVzKVxuXG4gICAgcHJvcHMuZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICB0aGlzLnRlc3RNb2RlID0gdGVzdE1vZGVcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgfVxuXG4gIHNldFByb3Aoa2V5LCB2YWwpIHtcbiAgICB0aGlzLnByb3BzW2tleV0gPSB2YWxcbiAgfVxuXG4gIGdldFByb3AodmFsKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNbdmFsXVxuICB9XG5cbiAgZ2V0IGVsKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmVsXG4gIH1cblxuICBzZXRFbEF0dHJzKGVsLCBwYXJhbXMpIHtcbiAgICBjb25zdCB0ZXN0TW9kZSA9IHRoaXMudGVzdE1vZGUgPT09IHRydWVcbiAgICBjb25zdCBhZGRBdHRyaWJ1dGVzID0gKHZhbCwga2V5KSA9PiB7XG4gICAgICBjb25zdCBhZGRUb0RhdGFzZXQgPSAodmFsLCBrZXkpID0+IHsgZWwuZGF0YXNldFtrZXldID0gdmFsIH1cbiAgICAgIGlmIChrZXkgPT09ICdkYXRhc2V0Jykge1xuICAgICAgICAvLyBEYXRhc2V0IHZhbHVlcyBhcmUgaW5lcnQgdGV4dCBhbmQgYXJlIHRoZSBmcmFtZXdvcmsncyBwYXlsb2FkXG4gICAgICAgIC8vIHN1cmZhY2U7IHRoZXkgYXJlIGFwcGxpZWQgYXMtaXMuXG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKGFkZFRvRGF0YXNldCwgdmFsKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHsgYWxsb3dlZCwgdmFsdWUgfSA9IHNhbml0aXplQXR0cmlidXRlKGtleSwgdmFsLCBlbC50YWdOYW1lKVxuICAgICAgICBpZiAoYWxsb3dlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgU1BZTkUgV0FSTklORzogVGhlIGF0dHJpYnV0ZSBcIiR7a2V5fVwiIHdhcyByZW1vdmVkIGR1cmluZyBzYW5pdGl6YXRpb24uYCwgZWwpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdmFsID0gdmFsdWVcbiAgICAgIH1cblxuICAgICAgZWwuc2V0QXR0cmlidXRlKGtleSwgdmFsKVxuICAgIH1cbiAgICB0aGlzLmdldFByb3AoJ2F0dHJzJykuZm9yRWFjaChhZGRBdHRyaWJ1dGVzKVxuXG4gICAgaWYgKHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBhcHBseUlmcmFtZUhhcmRlbmluZyhlbClcbiAgICB9XG5cbiAgICByZXR1cm4gZWxcbiAgfVxuXG4gIHVwZGF0ZUF0dHJzKHBhcmFtcywgbSkge1xuICAgIGNvbnN0IHRoZU1hcCA9IG0gIT09IHVuZGVmaW5lZCA/IG0gOiBuZXcgTWFwKClcbiAgICBjb25zdCBhZGRBdHRyaWJ1dGVzID0gKHZhbCwga2V5KSA9PiB0aGVNYXAuc2V0KGtleSwgdmFsKVxuICAgIG1hcE9iakluZGV4ZWQoYWRkQXR0cmlidXRlcywgcGFyYW1zKVxuICAgIHJldHVybiB0aGVNYXBcbiAgfVxuXG4gIGFkZFRlbXBsYXRlKGVsKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLmdldFByb3AoJ3RlbXBsYXRlJylcblxuICAgIGNvbnN0IGFkZFRtcGwgPSAodGVtcGxhdGUpID0+IHtcbiAgICAgIGxldCBkYXRhID0gdGhpcy5nZXRQcm9wKCdkYXRhJylcbiAgICAgIGRhdGEgPSBpcyhPYmplY3QsIGRhdGEpID8gZGF0YSA6IHt9XG4gICAgICBjb25zdCBmcmFnID0gbmV3IERvbUVsZW1lbnRUZW1wbGF0ZSh0ZW1wbGF0ZSwgZGF0YSwgeyB0ZXN0TW9kZTogdGhpcz8udGVzdE1vZGUgfSkucmVuZGVyRG9jRnJhZygpXG4gICAgICBjb25zdCBmcmFnSXNTdHJpbmcgPSBpcyhTdHJpbmcsIGZyYWcpXG4gICAgICBmcmFnSXNTdHJpbmcgPyBlbC5pbm5lckhUTUwgPSBmcmFnIDogZWwuYXBwZW5kQ2hpbGQoZnJhZylcbiAgICAgIHJldHVybiBlbFxuICAgIH1cbiAgICBjb25zdCBkb05vdGhpbmcgPSAoZWwpID0+IGVsXG4gICAgcmV0dXJuIHRlbXBsYXRlICE9PSB1bmRlZmluZWQgPyBhZGRUbXBsKHRlbXBsYXRlKSA6IGRvTm90aGluZyhlbClcbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSA9ICdkaXYnKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSlcbiAgfVxuXG4gIGFkZENvbnRlbnQoZWwpIHtcbiAgICBjb25zdCB0ZXh0ID0gKHRoaXMuZ2V0UHJvcCgnZGF0YScpKVxuICAgIGNvbnN0IGlzVGV4dCA9IGlzKFN0cmluZywgdGV4dClcbiAgICBpZiAoaXNUZXh0ID09PSB0cnVlKSB7XG4gICAgICBjb25zdCB0eHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KVxuICAgICAgZWwuYXBwZW5kQ2hpbGQodHh0KVxuICAgIH1cbiAgICByZXR1cm4gZWxcbiAgfVxuXG4gIGV4ZWN1dGUoKSB7XG4gICAgY29uc3QgZWwgPSBwaXBlKFxuICAgICAgdGhpcy5jcmVhdGVFbGVtZW50LmJpbmQodGhpcyksXG4gICAgICB0aGlzLnNldEVsQXR0cnMuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuYWRkVGVtcGxhdGUuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuYWRkQ29udGVudC5iaW5kKHRoaXMpXG4gICAgKSh0aGlzLmdldFByb3AoJ3RhZ05hbWUnKSlcbiAgICAvLyB0aGlzLmdldFByb3AoJ2ZyYWdtZW50JykuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHRoaXMucHJvcHMuZWwgPSBlbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgcmVuZGVyIHRoZSBIVE1MIEVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBIVE1MRWxlbWVudFxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuZXhlY3V0ZSgpXG4gICAgdGhpcy5wcm9wcy50ZW1wbGF0ZSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucHJvcHMuZGF0YSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucHJvcHMuYXR0cmlidXRlcyA9IHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmdldFByb3AoJ2VsJylcbiAgfVxuXG4gIHJlbmRlclRvSFRNTFN0cmluZygpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHRoaXMucHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmRhdGEgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmF0dHJpYnV0ZXMgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKCdlbCcpLm91dGVySFRNTFxuICB9XG5cbiAgcmV0dXJuSWZEZWZpbmVkKG9iaiwgdmFsKSB7XG4gICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc09iaiA9IHR5cGVvZiAodmFsKSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgIGlzT2JqID09PSBmYWxzZSA/IG9ialt2YWxdID0gdmFsIDogb2JqW3ZhbF0gPSBkZWVwTWVyZ2Uob2JqW3ZhbF0sIHZhbClcbiAgICB9XG4gIH1cblxuICB1cGRhdGVwcm9wcyh2YWwpIHtcbiAgICB0aGlzLnJldHVybklmRGVmaW5lZCh0aGlzLnByb3BzLCB2YWwpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHVwZGF0ZXByb3BzQW5kUnVuKHZhbCkge1xuICAgIHRoaXMudXBkYXRlcHJvcHModmFsKVxuICAgIHRoaXMuZXhlY3V0ZSgpXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcCgnZnJhZ21lbnQnKVxuICB9XG5cbiAgdW5tb3VudCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmdldFByb3AoJ2VsJykucmVtb3ZlKClcbiAgICAgIHRoaXMucHJvcHMgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMuZ2MoKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRhZyh0YWdOYW1lID0gJ2RpdicpIHsgdGhpcy51cGRhdGVwcm9wcyh0YWdOYW1lKSB9XG4gIHVwZGF0ZUF0dHJpYnV0ZXMoYXR0cnMgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzKGF0dHJzKSB9XG4gIHVwZGF0ZVRlbXBsYXRlKHRlbXBsYXRlKSB7IHRoaXMudXBkYXRlcHJvcHModGVtcGxhdGUpIH1cbiAgdXBkYXRlRGF0YShkYXRhID0ge30pIHsgdGhpcy51cGRhdGVwcm9wcyhkYXRhKSB9XG4gIGFkZFRhZ0FuZFJlbmRlcih0YWdOYW1lID0gJ2RpdicpIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bih0YWdOYW1lKSB9XG4gIGFkZEF0dHJzaWJ1dGVzQW5kUmVuZGVyKGF0dHJzID0ge30pIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bihhdHRycykgfVxuICBhZGRUZW1wbGF0ZUFuZFJlbmRlcih0ZW1wbGF0ZSkgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKHRlbXBsYXRlKSB9XG4gIGFkZERhdGFBbmRSZW5kZXIoZGF0YSA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4oZGF0YSkgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCQVNFIENPUkUgTUlYSU5TXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGFkZE1peGlucygpIHtcbiAgICBjb25zdCBjb3JlTWl4aW5zID0gYmFzZUNvcmVNaXhpbnMoKVxuICAgIHRoaXMuZ2MgPSBjb3JlTWl4aW5zLmdjLmJpbmQodGhpcylcbiAgfVxuXG4gIGdldERvbUF0dHJpYnV0ZXMocHJvcHMpIHtcbiAgICByZXR1cm4gcGljayh0aGlzLmF0dHJpYnV0ZXNBcnJheSwgcHJvcHMpXG4gIH1cblxuICBnZXQgYXR0cmlidXRlc0FycmF5KCkge1xuICAgIHJldHVybiBbXG4gICAgICAnYWNjZXB0JyxcbiAgICAgICdhY2NlcHQtY2hhcnNldCcsXG4gICAgICAnYWNjZXNza2V5JyxcbiAgICAgICdhY3Rpb24nLFxuICAgICAgJ2FsaWduJyxcbiAgICAgICdhbGxvdycsXG4gICAgICAnYWx0JyxcbiAgICAgICdhc3luYycsXG4gICAgICAnYXV0b2NhcGl0YWxpemUnLFxuICAgICAgJ2F1dG9jb21wbGV0ZScsXG4gICAgICAnYXV0b2ZvY3VzJyxcbiAgICAgICdhdXRvcGxheScsXG4gICAgICAnYmdjb2xvcicsXG4gICAgICAnYm9yZGVyJyxcbiAgICAgICdidWZmZXJlZCcsXG4gICAgICAnY2hhbGxlbmdlJyxcbiAgICAgICdjaGFyc2V0JyxcbiAgICAgICdjaGVja2VkJyxcbiAgICAgICdjaXRlJyxcbiAgICAgICdjbGFzcycsXG4gICAgICAnY29kZScsXG4gICAgICAnY29kZWJhc2UnLFxuICAgICAgJ2NvbG9yJyxcbiAgICAgICdjb2xzJyxcbiAgICAgICdjb2xzcGFuJyxcbiAgICAgICdjb250ZW50JyxcbiAgICAgICdjb250ZW50ZWRpdGFibGUnLFxuICAgICAgJ2NvbnRleHRtZW51JyxcbiAgICAgICdjb250cm9scycsXG4gICAgICAnY29vcmRzJyxcbiAgICAgICdjcm9zc29yaWdpbicsXG4gICAgICAnY3NwJyxcbiAgICAgICdkYXRhc2V0JyxcbiAgICAgICdkYXRldGltZScsXG4gICAgICAnZGVjb2RpbmcnLFxuICAgICAgJ2RlZmF1bHQnLFxuICAgICAgJ2RlZmVyJyxcbiAgICAgICdkaXInLFxuICAgICAgJ2Rpcm5hbWUnLFxuICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgICdkb3dubG9hZCcsXG4gICAgICAnZHJhZ2dhYmxlJyxcbiAgICAgICdkcm9wem9uZScsXG4gICAgICAnZW5jdHlwZScsXG4gICAgICAnZm9yJyxcbiAgICAgICdmb3JtJyxcbiAgICAgICdmb3JtYWN0aW9uJyxcbiAgICAgICdoZWFkZXJzJyxcbiAgICAgICdoZWlnaHQnLFxuICAgICAgJ2hpZGRlbicsXG4gICAgICAnaGlnaCcsXG4gICAgICAnaHJlZicsXG4gICAgICAnaHJlZmxhbmcnLFxuICAgICAgJ2h0dHAtZXF1aXYnLFxuICAgICAgJ2ljb24nLFxuICAgICAgJ2lkJyxcbiAgICAgICdpbXBvcnRhbmNlJyxcbiAgICAgICdpbnRlZ3JpdHknLFxuICAgICAgJ2lzbWFwJyxcbiAgICAgICdpdGVtcHJvcCcsXG4gICAgICAna2V5dHlwZScsXG4gICAgICAna2luZCcsXG4gICAgICAnbGFiZWwnLFxuICAgICAgJ2xhbmcnLFxuICAgICAgJ2xhbmd1YWdlJyxcbiAgICAgICdsYXp5bG9hZCcsXG4gICAgICAnbGlzdCcsXG4gICAgICAnbG9vcCcsXG4gICAgICAnbG93JyxcbiAgICAgICdtYW5pZmVzdCcsXG4gICAgICAnbWF4JyxcbiAgICAgICdtYXhsZW5ndGgnLFxuICAgICAgJ21pbmxlbmd0aCcsXG4gICAgICAnbWVkaWEnLFxuICAgICAgJ21ldGhvZCcsXG4gICAgICAnbWluJyxcbiAgICAgICdtdWx0aXBsZScsXG4gICAgICAnbXV0ZWQnLFxuICAgICAgJ25hbWUnLFxuICAgICAgJ25vdmFsaWRhdGUnLFxuICAgICAgJ29wZW4nLFxuICAgICAgJ29wdGltdW0nLFxuICAgICAgJ3BhdHRlcm4nLFxuICAgICAgJ3BpbmcnLFxuICAgICAgJ3BsYWNlaG9sZGVyJyxcbiAgICAgICdwb3N0ZXInLFxuICAgICAgJ3ByZWxvYWQnLFxuICAgICAgJ3JhZGlvZ3JvdXAnLFxuICAgICAgJ3JlYWRvbmx5JyxcbiAgICAgICdyZWZlcnJlcnBvbGljeScsXG4gICAgICAncmVsJyxcbiAgICAgICdyZXF1aXJlZCcsXG4gICAgICAncmV2ZXJzZWQnLFxuICAgICAgJ3Jvd3MnLFxuICAgICAgJ3Jvd3NwYW4nLFxuICAgICAgJ3NhbmRib3gnLFxuICAgICAgJ3Njb3BlJyxcbiAgICAgICdzY29wZWQnLFxuICAgICAgJ3NlbGVjdGVkJyxcbiAgICAgICdzaGFwZScsXG4gICAgICAnc2l6ZScsXG4gICAgICAnc2l6ZXMnLFxuICAgICAgJ3Nsb3QnLFxuICAgICAgJ3NwYW4nLFxuICAgICAgJ3NwZWxsY2hlY2snLFxuICAgICAgJ3NyYycsXG4gICAgICAnc3JjZG9jJyxcbiAgICAgICdzcmNsYW5nJyxcbiAgICAgICdzcmNzZXQnLFxuICAgICAgJ3N0YXJ0JyxcbiAgICAgICdzdGVwJyxcbiAgICAgICdzdHlsZScsXG4gICAgICAnc3VtbWFyeScsXG4gICAgICAndGFiaW5kZXgnLFxuICAgICAgJ3RhcmdldCcsXG4gICAgICAndGl0bGUnLFxuICAgICAgJ3RyYW5zbGF0ZScsXG4gICAgICAndHlwZScsXG4gICAgICAndXNlbWFwJyxcbiAgICAgICd2YWx1ZScsXG4gICAgICAnd2lkdGgnLFxuICAgICAgJ3dyYXAnXG4gICAgXVxuICB9XG59XG5jb25zdCBEb21FbCA9IERvbUVsZW1lbnRcbmV4cG9ydCB7IERvbUVsZW1lbnQsIERvbUVsIH1cbiIsImltcG9ydCB7IGJhc2VTdHJlYW1zTWl4aW5zIH0gZnJvbSAnLi4vdXRpbHMvbWl4aW5zL2Jhc2Utc3RyZWFtcy1taXhpbnMuanMnXG5pbXBvcnQgeyBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmogfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGNsb25lLCBvbWl0IH0gZnJvbSAncmFtZGEnXG5jb25zdCBpc0Rldk1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWVcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1Ccm9hZGNhc3RlciB7XG4gIC8qKlxuICAgKiBUaGUgY2xhc3MgdGFrZXMgaW4gYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoZSAnYnJvYWRjYXN0RXZlbnRzJyBtZXRob2QgYW5kIGRpcmVjdHMgdGhlIGV2ZW50cyB0byBlaXRoZXIgdGhlIFVJIG9yIFJPVVRFIGNoYW5uZWxzXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbUJyb2FkY2FzdGVyXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gYnJvYWRjYXN0Rm5cbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJvcHMsIGJyb2FkY2FzdEZuKSB7XG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICAgIHRoaXMuYnJvYWRjYXN0Rm4gPSBicm9hZGNhc3RGblxuICAgIHRoaXMuYnJvYWRjYXN0ZXIodGhpcy5icm9hZGNhc3RGbilcbiAgfVxuXG4gIGFkZERibENsaWNrRXZ0KHEpIHtcbiAgICBjb25zdCBkYmxjbGljayQgPSBmcm9tRXZlbnQocSwgJ2RibGNsaWNrJylcbiAgICAvLyBjb25zb2xlLmxvZygnQURESU5HIERCTCBDTElDSyAnLCBxKTtcbiAgICBjb25zdCBzdHJlYW0kID0gZGJsY2xpY2skLnBpcGUoXG4gICAgICBtYXAocCA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjbG9uZShwKVxuICAgICAgICAvLyBBREQgRE9VQkxFQ0xJQ0sgVE8gVUkgRVZFTlRTXG4gICAgICAgIGRhdGEudHlwZU92ZXJSaWRlID0gJ2RibGNsaWNrJ1xuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfSkpXG4gICAgcmV0dXJuIHN0cmVhbSRcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQlJPQURDQVNUIEJVVFRPTiBFVkVOVFNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBicm9hZGNhc3QoYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA8PSAwICYmIGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbmVzdGVkIGFycmF5IGluICR7dGhpcy5wcm9wcy5uYW1lfS5icm9hZGNhc3RFdmVudHMgYXBwZWFycyB0byBiZSBlbXB0eSAtLT4gdnNpZDoke3RoaXMucHJvcHMudnNpZH0hYClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBwYXlsb2FkcyB0byBzZW5kLCBiYXNlZCBvbiBlaXRoZXIgdGhlIGFycmF5IG9yIHRoZSBlbGVtZW50cyBkYXRhTWFwXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRzID0ge1xuICAgICAgVUk6IHRoaXMuc2VuZFVJUGF5bG9hZCxcbiAgICAgIFJPVVRFOiB0aGlzLnNlbmRSb3V0ZVBheWxvYWRcbiAgICB9XG4gICAgLy8gc3ByZWFkIG9wZXJhdG9yIHRvIHNlbGVjdCB2YXJpYWJsZXMgZnJvbSBhcnJheXNcbiAgICBjb25zdCBbc2VsZWN0b3IsIGV2ZW50LCBsb2NhbF0gPSBhcmdzXG4gICAgLy8gYnRuIHF1ZXJ5XG4gICAgbGV0IGNoYW5uZWwgLy8gaG9pc3QgY2hhbm5lbCBhbmQgbGF0ZXIgY2hlY2sgaWYgY2hubCBleGlzdHNcbiAgICBsZXQgcXVlcnkgPSB0aGlzLnByb3BzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG5cbiAgICBpZiAocXVlcnkubGVuZ3RoIDw9IDApIHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy5wcm9wcy5lbFxuICAgICAgY29uc3QgY2hlY2tQYXJlbnRFbHMgPSAoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gZWwpIHtcbiAgICAgICAgICBxdWVyeSA9IFtlbGVtZW50XVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBsdWNrRWxGcm9tUGFyZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBlbFBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQgIT09IG51bGwgPyBlbC5wYXJlbnRFbGVtZW50IDogZG9jdW1lbnRcbiAgICAgICAgY29uc3QgZWxTZWxlY3RlZCA9IGVsUGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgICAgIGVsU2VsZWN0ZWQuZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoXG4gICAgICAgIGVsU2VsZWN0ZWQuZm9yRWFjaChjaGVja1BhcmVudEVscylcbiAgICAgIH1cblxuICAgICAgcGx1Y2tFbEZyb21QYXJlbnQoKVxuICAgIH1cblxuICAgIGNvbnN0IGlzTG9jYWxFdmVudCA9IGxvY2FsICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhZGRPYnNlcnZhYmxlID0gKHEpID0+IHtcbiAgICAgIC8vIHRoZSAgYnRuIG9ic2VydmFibGVcbiAgICAgIGNvbnN0IG9ic2VydmFibGUgPSBldmVudCAhPT0gJ2RibENsaWNrJ1xuICAgICAgICA/IGZyb21FdmVudChxLCBldmVudCwgeyBwcmV2ZW50RGVmYXVsdDogKCkgPT4gdHJ1ZSB9KVxuICAgICAgICA6IHRoaXMuYWRkRGJsQ2xpY2tFdnQocSlcbiAgICAgIC8vIHNlbGVjdCBjaGFubmVsIGFuZCBkYXRhIHZhbHVlcyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgb3IgdGhlIGVsZW1lbnQncyBkb20gTWFwXG4gICAgICBjaGFubmVsID0gcS5kYXRhc2V0LmNoYW5uZWwvLyBpZk5pbFRoZW5VcGRhdGUoY2hubCwgcS5kYXRhc2V0LmNoYW5uZWwpO1xuICAgICAgY29uc3QgZGF0YSA9IHt9Ly8gY29udmVydERvbVN0cmluZ01hcFRvT2JqKHEuZGF0YXNldCk7XG4gICAgICBkYXRhLnBheWxvYWQgPSBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmoocS5kYXRhc2V0KVxuICAgICAgZGF0YS5wYXlsb2FkID0gb21pdChbJ2NoYW5uZWwnXSwgZGF0YS5wYXlsb2FkKVxuICAgICAgaWYgKGRhdGEuY2hhbm5lbCA9PT0gJ1JPVVRFJykge1xuICAgICAgICBkYXRhLnBheWxvYWQuZW5kUHJldmVudERlZmF1bHQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGRhdGEuY2hhbm5lbCA9IGNoYW5uZWxcbiAgICAgIC8vIHBheWxvYWQgbmVlZHMgdnNpZCMgdG8gcGFzcyB2ZXJpZmljYXRpb25cblxuICAgICAgZGF0YS5zcmNFbGVtZW50ID0ge30vLyBwaWNrKFsndnNpZCcsJ3ZpZXdOYW1lJ10sIGRhdGEpO1xuICAgICAgZGF0YS5zcmNFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZFxuICAgICAgZGF0YS5zcmNFbGVtZW50LnZzaWQgPSB0aGlzLnByb3BzLnZzaWRcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5pc0xvY2FsRXZlbnQgPSBpc0xvY2FsRXZlbnRcbiAgICAgIC8vIGRhdGEuc3JjRWxlbWVudFsndmlld05hbWUnXSA9IHRoaXMucHJvcHMubmFtZTtcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5zcmNFdmVudCA9IGV2ZW50XG4gICAgICBkYXRhLnNyY0VsZW1lbnQuZWwgPSBxXG4gICAgICAvLyBzZWxlY3QgdGhlIGNvcnJlY3QgcGF5bG9hZFxuXG4gICAgICBmdW5jdGlvbiBnZXRWYWxpZENoYW5uZWwoY2gpIHtcbiAgICAgICAgaWYgKGNoID09PSAnUk9VVEUnIHx8IGNoID09PSAnQ0hBTk5FTF9ST1VURScpIHtcbiAgICAgICAgICByZXR1cm4gJ1JPVVRFJ1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCAhPT0gJ1VJJyAmJiBjaCAhPT0gJ0NIQU5ORUxfVUknICYmIGNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lSlMgd2FybmluZzogVGhlIGNoYW5uZWwsICR7Y2h9LCBpcyBub3QgYWxsb3dlZCBoZXJlLCBvbmx5IFwiVUlcIiBvciBcIlJPVVRFXCIgYXJlIHZhbGlkIGNoYW5uZWxzLCBkZWZhdWx0aW5nIHRvIENIQU5ORUxfVUlgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnVUknXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkID0gY2hhbm5lbFBheWxvYWRzW2dldFZhbGlkQ2hhbm5lbChjaGFubmVsKV1cbiAgICAgIC8vIHJ1biBwYXlsb2FkXG4gICAgICBjaGFubmVsUGF5bG9hZChvYnNlcnZhYmxlLCBkYXRhKVxuICAgIH1cbiAgICBjb25zdCBxdWVyeUlzTmlsID0gcXVlcnkgPT09IHVuZGVmaW5lZCB8fCBxdWVyeS5sZW5ndGggPD0gMFxuICAgIGlmIChxdWVyeUlzTmlsID09PSB0cnVlICYmIGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgaXRlbSAke3NlbGVjdG9yfSwgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IGluICR7dGhpcy5wcm9wcy5uYW1lfSAtLT4gdnNpZDoke3RoaXMucHJvcHMudnNpZH0hYClcblxuICAgICAgLy8gYWRkT2JzZXJ2YWJsZShxdWVyeSwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeS5mb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2hcbiAgICAgIHF1ZXJ5LmZvckVhY2goYWRkT2JzZXJ2YWJsZSlcbiAgICB9XG4gIH1cblxuICBicm9hZGNhc3RlcihhcnJGbikge1xuICAgIGNvbnN0IGJyb2FkY2FzdEFyciA9IGFyckZuKClcbiAgICBicm9hZGNhc3RBcnIuZm9yRWFjaChhcmdzID0+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+IHtcbiAgICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgICBjb25zdCBhZGRDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChjKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFyci5mb3JFYWNoKGFkZENsYXNzKVxuICAgIH1cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZGVsYXlBZGRDbGFzcylcbiAgICAvLyB3aW5kb3cuc2V0VGltZW91dChkZWxheUFkZENsYXNzLCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gZWxTZWwgVGhlIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudC5cbiAgICogQGRlc2MgU2V0cyB0aGUgY2xhc3MgYWN0aXZlIEhUTUxFbGVtZW50IGZyb20gYSBOb2RlTGlzdC5cbiAgICovXG4gIHNlbGVjdG9yLnNldEFjdGl2ZUl0ZW0yID0gKGMsIGVsU2VsKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCBjdXJyZW50RWwgPSB0eXBlb2YgKGVsU2VsKSA9PT0gJ3N0cmluZycgPyBnZXRFbE9yTGlzdChjeHQsIGVsU2VsKSA6IGVsU2VsXG4gICAgY29uc3QgdG9nZ2xlQm9vbCA9IGl0ZW0gPT4gaXRlbS5pc0VxdWFsTm9kZShjdXJyZW50RWwpID8gaXRlbS5jbGFzc0xpc3QuYWRkKGMpIDogaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpXG4gICAgaWYgKGlzTm9kZUVsZW1lbnQoY3VycmVudEVsKSA9PT0gdHJ1ZSkge1xuICAgICAgYXJyLmZvckVhY2godG9nZ2xlQm9vbClcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpID09PSB0cnVlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlNFTCBJUyBcIixlbFNlbCxjKTtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIHNlbGVjdG9yLCAke2VsU2VsfSwgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgaXRlbSBpbiBzZXRBY3RpdmVJdGVtOiAke2N9YClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHNlbGVjdG9yLnNldEFjdGl2ZUl0ZW0gPSAoYywgZWxTZWwpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IGN1cnJlbnRFbCA9IHR5cGVvZiBlbFNlbCA9PT0gJ3N0cmluZydcbiAgICAgID8gZ2V0RWxPckxpc3QoY3h0LCBlbFNlbClcbiAgICAgIDogZWxTZWxcblxuICAgIGFyci5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpKVxuXG4gICAgaWYgKGlzTm9kZUVsZW1lbnQoY3VycmVudEVsKSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdFbCA9IEFycmF5LmZyb20oYXJyKS5maW5kKGl0ZW0gPT4gaXRlbSA9PT0gY3VycmVudEVsKVxuXG4gICAgICBpZiAobWF0Y2hpbmdFbCkge1xuICAgICAgICBtYXRjaGluZ0VsLmNsYXNzTGlzdC5hZGQoYylcbiAgICAgIH0gZWxzZSBpZiAoaXNEZXZNb2RlKCkgPT09IHRydWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBTcHluZSBXYXJuaW5nOiBUaGUgc2VsZWN0b3IsICR7ZWxTZWx9LCBpcyB2YWxpZCBidXQgZG9lcyBub3QgbWF0Y2ggYW55IGl0ZW0gaW4gc2V0QWN0aXZlSXRlbTogJHtjfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNEZXZNb2RlKCkgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFNweW5lIFdhcm5pbmc6IFRoZSBzZWxlY3RvciwgJHtlbFNlbH0sIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIGl0ZW0gaW4gc2V0QWN0aXZlSXRlbTogJHtjfWBcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBmdW5jdGlvbiBlbFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBnZXR0ZXIgZm9yIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgYSBzaW5nbGUgZWxlbWVudCBvciBhIE5vZGVMaXN0IGZyb20gdGhlIHNlbGVjdG9yXG4gICAqL1xuXG4gIC8qKlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbGVuZ3RoXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIERldGVybWluZXMgdGhlIGxlbmd0aCBvZiB0aGUgTm9kZUxpc3RcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogVGhlIGxlbmd0aCBvZiB0aGUgc2VsZWN0b3IgYXMgYSBOb2RlTGlzdFxuICAgKi9cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGV4aXN0c1xuICAgKlxuICAgKiBAZGVzY1xuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gdGhlIHNlbGVjdGVkIGVsZW1lbnQgZXhpc3RzXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEJvb2xlYW5cbiAgICovXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZWwnLCB7IGdldDogKCkgPT4gZ2V0RWxPckxpc3QoY3h0LCBzZWwsIHRydWUpIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2VscycsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdsZW4nLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgZmFsc2UpLmxlbmd0aCB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdleGlzdHMnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgZmFsc2UpLmxlbmd0aCA+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+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJyZXF1aXJlIiwiZGVmaW5lIiwiYW1kIiwic2VsZiIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTMxX18iLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX182MzZfXyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUzMV9fIiwiQ2hhbm5lbEZldGNoIiwiY29uc3RydWN0b3IiLCJuYW1lIiwicHJvcHMiLCJkaXNhYmxlU2FuaXRpemUiLCJ2YWxpZGF0ZU1hcE1ldGhvZCIsInVuZGVmaW5lZCIsIm1hcCIsIm1hcEZuIiwiZXh0ZW5kZWRBY3Rpb25zQXJyIiwic2VuZENhY2hlZFBheWxvYWQiLCJzdXBlciIsInRlc3RNb2RlIiwiaXNVbmRlZmluZWRPcldyb25nVHlwZSIsImVpdGhlciIsImlzTmlsIiwidmFsIiwiaXNVbmRlZmluZWQiLCJhbGwiLCJpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHkiLCJhbGxQYXNzIiwiYXJyIiwibGVuZ3RoIiwiY29tcG9zZSIsInZhbHVlcyIsInBpY2siLCJjb25zb2xlIiwid2FybiIsIm9uUmVnaXN0ZXJlZCIsInRoaXMiLCJwYXVzZSIsInN0YXJ0RmV0Y2giLCJhZGRSZWdpc3RlcmVkQWN0aW9ucyIsImV4dGVuZGVkQXJyIiwiZGVmYXVsdFRvIiwicGF0aCIsImNvbmNhdCIsIm9wdGlvbnMiLCJzdWJzY3JpYmVyIiwib25GZXRjaFJldHVybmVkIiwiYmluZCIsImZldGNoUHJvcHMiLCJjb25zb2xpZGF0ZUFsbEZldGNoUHJvcHMiLCJvbkZldGNoVXBkYXRlIiwiZXZ0IiwicHJvcHNPcHRpb25zIiwiZ2V0UHJvcHNGb3JGZXRjaCIsInN0cmVhbUl0ZW0iLCJhY3Rpb24iLCJpc0NoYW5uZWxGZXRjaEVycm9yIiwiY3JlYXRlQ2hhbm5lbFBheWxvYWRJdGVtIiwicGF5bG9hZCIsInVybCIsInNyY0VsZW1lbnQiLCJzZW5kQ2hhbm5lbFBheWxvYWQiLCJkYXRhT2JqIiwidmlld1N0cmVhbUluZm8iLCJmaWx0ZXJPdXRVbmRlZmluZWQiLCJyZWplY3QiLCJvMSIsIm8yIiwibWVyZ2VEZWVwUmlnaHQiLCJvYnNlcnZlciIsIm9ic2VydmVyJCIsIkNoYW5uZWxQYXlsb2FkIiwiY2hhbm5lbE5hbWUiLCJldmVudCIsInRpbWVMYWJlbCIsImNoYW5uZWwiLCJ0aW1lIiwiY2hhbm5lbFBheWxvYWRJdGVtT2JqIiwiZnJvemVuUGF5bG9hZCIsImRlZXBGcmVlemUiLCJkZWJ1ZyIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInBheWxvYWRTdHIiLCJKU09OIiwic3RyaW5naWZ5IiwiY2hhbm5lbEFjdGlvbnNBcnIiLCJnZXRDaGFubmVsQWN0aW9ucyIsInZhbGlkYXRlQWN0aW9uIiwiY2xvbmUiLCJtZXJnZUFsbCIsImNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzIiwiJGRpciIsImdldCIsIl9kaXIiLCJzZXQiLCJsb2NhdGlvbiIsImdldExvY2F0aW9uRGF0YSIsImRlZmluZVByb3BlcnRpZXMiLCJ0aW1lRW5kIiwiaXNJbkFyciIsImluY2x1ZGVzIiwiaW5pdGlhbGl6ZWQiLCJwaWNrQWxsIiwid2luZG93IiwiZ2V0U3RyZWFtSXRlbSIsImRlZXBDbG9uZSIsIm8iLCJpc0FyciIsImlzIiwiQXJyYXkiLCJpc09iaiIsIm9iIiwiZnJvbVBhaXJzIiwidG9QYWlycyIsImVsSXNEb21FbGVtZW50IiwibHRlIiwicHJvcCIsImZyZWV6ZSIsImdldE93blByb3BlcnR5TmFtZXMiLCJmb3JFYWNoIiwiaXNGcm96ZW4iLCJlIiwiZ2V0TW91c2VFdmVudEtleXMiLCJDaGFubmVsUHJveHkiLCJpc1Byb3h5Iiwic3ViamVjdCQiLCJTdWJqZWN0IiwicmVwbGF5U3ViJCIsIlJlcGxheVN1YmplY3QiLCJtZXJnZSIsImNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5IiwiZ2V0TWVyZ2VkU3ViamVjdCIsInBlcmlzdERhdGEiLCJsaXN0UmVnaXN0ZXJlZENoYW5uZWxzIiwicmVwbGF5U3ViamVjdCIsInN1YmplY3QiLCJDaGFubmVsIiwiQ0hBTk5FTF9OQU1FIiwiY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmoiLCJkZWZhdWx0QWN0aW9ucyIsImRhdGEiLCJpc1JlZ2lzdGVyZWQiLCJkZWZhdWx0Q2FjaGVkUGF5bG9hZEJvb2wiLCJyZXBsYXkiLCJzZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsIiwiY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMiLCJzdHJlYW1zQ29udHJvbGxlciIsImNoYW5uZWxzTWFwIiwiZ2V0TWFpbk9ic2VydmVyIiwiY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUiLCJkaXNwYXRjaGVyU3RyZWFtJCIsImdldFN0cmVhbSIsInBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSIsInByb3BFcSIsInBpcGUiLCJmaWx0ZXIiLCJzdWJzY3JpYmUiLCJvblJlY2VpdmVkT2JzZXJ2YWJsZSIsInRlc3RTdHJlYW0iLCJnZXRQcm94eVN1YmplY3QiLCJvbkNoYW5uZWxJbml0aWFsaXplZCIsImtleXMiLCJjaGFubmVsQWN0aW9ucyIsImNoZWNrRm9yVHJhaXRzIiwidHJhaXRzIiwiVHJhaXRDbGFzcyIsImFkZFRyYWl0cyIsImluaXRpYWxpemVTdHJlYW0iLCJhY3Rpb25zT2JqIiwiYWN0aW9uc09iaklzRW1wdHkiLCJpc0VtcHR5IiwiZGF0YUlzQWRkZWQiLCJhY3Rpb25TdHIiLCJzZXREZWZhdWx0QWN0aW9uc09iaiIsInNldFRyYWNlIiwiYm9vbCIsImdldEFjdGlvblZhbCIsImlmRWxzZSIsIlN0cmluZyIsImlkZW50aXR5IiwiaGVhZCIsIm1haW5BcnIiLCJvYmoiLCJjaGFpbiIsInN0ciIsIm9iak9mIiwiZGVsYXlDaGVja0lmVHJhaXRNZXRob2RIYXNCZWVuQWRkZWQiLCJtZXRob2RTdHIiLCJzZXRUaW1lb3V0IiwiZ2V0QXJyTWV0aG9kIiwiYWx3YXlzIiwidmlldyIsImxlbnNJbmRleCIsImNoYW5uZWxBY3Rpb25NZXRob2RzIiwib25JbmNvbWluZ09ic2VydmFibGUiLCJnZXRBY3Rpb25NZXRob2RGb3JPYnNlcnZhYmxlIiwidW5wYWNrZWQiLCJkZWZhdWx0Rm4iLCJvblZpZXdTdHJlYW1JbmZvIiwibWV0aG9kVmFsIiwiZm4iLCJlcXNOYW1lIiwiZXF1YWxzIiwib2JzVmFsIiwibWVyZ2VQcm9wcyIsImQiLCJvYnNlcnZhYmxlIiwib25TdWNjZXNzIiwib25FcnJvciIsIm9icyIsIm9icyQiLCJjaGFubmVsUGF5bG9hZEl0ZW0iLCJuZXh0IiwiZ2V0Q2hhbm5lbCIsInBheWxvYWRGaWx0ZXIiLCJjIiwic291cmNlIiwibWVyZ2VDaGFubmVscyIsImNoYW5uZWxzQXJyIiwiZW1pdE9uY2UiLCJjaGFubmVsT2JzZXJ2YWJsZXMiLCJpdGVtIiwiY2hhbiQiLCJ0YWtlIiwiY29tYmluZWQkIiwiZm9ya0pvaW4iLCJFTVBUWSIsImZpcnN0JCIsInJlc3QkIiwiY29tYmluZUxhdGVzdFdpdGgiLCJyZXN1bHRzQXJyIiwiaWR4IiwiaXRlcktleSIsImNoZWNrRm9yTm90VHJhY2tGbGFnIiwiZG9Ob3RUcmFjayIsImRvTm90VHJhY2tDaGFubmVsIiwicmVnaXN0ZXJlZFN0cmVhbU5hbWVzIiwicmVnaXN0ZXJlZFN0ZXBzIiwicmVnaXN0ZXJlZExpZmVTdHJlYW1UeXBlcyIsInJlZ2lzdGVyZWRTdHJlYW1UeXBlcyIsInJlZ2lzdGVyZWRBY3Rpb25zIiwiYmFzZVZhbGlkYXRpb25zIiwidmlld0luZm9WYWxpZGF0aW9ucyIsInVpVmFsaWRhdGlvbnMiLCJsaWZlc3RyZWFtVmFsaWRhdGlvbnMiLCJzdGVwVmFsaWRhdGlvbnMiLCJzdGVwRGlzcG9zZVZhbGlkYXRpb25zIiwic3RlcFVwZGF0ZVZhbGlkYXRpb25zIiwicm91dGVWYWxpZGF0aW9ucyIsIlN0cmVhbXNDb25maWciLCJPYnNlcnZhYmxlIiwiZXJyb3IiLCJwcmVkaWNhdGUiLCJsaWZlU3RyZWFtVmFsaWRhdGlvbnMiLCJTVEVQIiwidHlwZSIsInZpZXdJZCIsImRpc3Bvc2VJdGVtcyIsInN0cmVhbVZhbGlkYXRpb25zIiwiZ2V0UnhUeXBlIiwic3RyZWFtcyIsImluaXQiLCJzdHJ1Y3R1cmUiLCJ2YWxpZGF0aW9ucyIsIl9tYXAiLCJNYXAiLCJDaGFubmVsc01hcCIsImFkZE1peGlucyIsImdldENoYW5uZWxzTGlzdCIsImZyb20iLCJrIiwidiIsImtleSIsInNob3dPbmx5UHJveGllcyIsInByb3h5TWFwIiwicmVqZWN0UHJveHlGbiIsImZpbHRlclByb3h5Rm4iLCJyZW1vdmVkUHJveHlBcnIiLCJwbHVjayIsImxpc3RQcm94eUNoYW5uZWxzIiwiY2hlY2tGb3JNaXNzaW5nQ2hhbm5lbHMiLCJmaWx0ZXJQcm94eUFyciIsImZpbHRlclByZWZpeFdhcm5pbmciLCJqb2luIiwiY3JlYXRlTWFpblN0cmVhbXMiLCJyb3V0ZVN0cmVhbSIsInVpU3RyZWFtIiwiZG9tU3RyZWFtIiwidmlld1N0cmVhbUxpZmVjeWNsZSIsImFpU3RyZWFtIiwiYWRkS2V5RXZlbnQiLCJyZWdpc3RlclN0cmVhbSIsImhhcyIsInBhdGhFcSIsImlzUmVwbGF5U3ViamVjdCIsInN1YmplY3RUeXBlIiwiU3B5bmVDaGFubmVsQUkiLCJvblNlbmRFdmVudCIsIlNweW5lQ2hhbm5lbExpZmVjeWNsZSIsIlNweW5lQ2hhbm5lbFJvdXRlIiwicm91dGVDb25maWdKc29uIiwiZ2V0Um91dGVDb25maWciLCJiaW5kU3RhdGljTWV0aG9kcyIsIm5hdlRvU3RyZWFtJCIsImluZm8iLCJvbk1hcE5leHQiLCJjb21wYXJlUm91dGVLZXl3b3JkcyIsImNoZWNrQ29uZmlnRm9ySGFzaCIsImNvbmZpZyIsImNoYW5uZWxzIiwiUk9VVEUiLCJpc0hhc2giLCJpbml0U3RyZWFtIiwidXBkYXRlUm91dGVDb25maWciLCJuZXdSb3V0ZXNPYmoiLCJtZXJnZVJpZ2h0IiwiY29uZm9ybVJvdXRlQ29uZmlnIiwicm91dGVDb25maWciLCJuYXZMaW5rcyIsInJvdXRlRGF0YXNldHNBcnIiLCJiaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhIiwic3B5bmVDb25maWciLCJmbGF0dGVuQ29uZmlnT2JqZWN0Iiwicm91dGVzIiwicGFyYW1zQXJyIiwiZmlyc3RMb2FkU3RyZWFtJCIsIm9uSW5jb21pbmdEb21FdmVudCIsImNyZWF0ZVBvcFN0YXRlU3RyZWFtIiwiZmlyc3RMb2FkZWQiLCJyZW1vdmVTU0lEIiwicm91dGVMZW5zIiwibGVuc1Byb3AiLCJvdmVyIiwib21pdCIsIm9taXRTU0lEIiwiYWN0biIsIkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UIiwiZXZlbnRDb3VudCIsImlzSGlzdG9yeUNvdW50IiwiTnVtYmVyIiwiZ2V0RGF0YUZyb21TdHJpbmciLCJyb3V0ZUNvdW50IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImVudW1lcmFibGUiLCJrZXl3b3JkQXJycyIsImNvbXBhcmUiLCJyb3V0ZURhdGEiLCJwYXRocyIsImNoZWNrRm9yUm91dGVQYXJhbXNPdmVycmlkZXMiLCJjaGVja0ZvckV2ZW50TWV0aG9kcyIsIm1ldGhvZHNBcnIiLCJ0ZXN0IiwiZ2V0TWV0aG9kcyIsIm1ldGhvZFVwZGF0ZSIsIm1hdGNoIiwicDEiLCJwMiIsInAzIiwicDQiLCJ0b0xvd2VyQ2FzZSIsIm1ldGhvZFN0clJlcGxhY2UiLCJyZXBsYWNlIiwicnVuTWV0aG9kIiwibSIsImNoZWNrRm9yRW5kUm91dGUiLCJwbCIsImRlYnVnQm9vbCIsIml0ZXIiLCJvblJlZHVjZVJvdXRlUGF0aHMiLCJhY2MiLCJyb3V0ZVBhdGgiLCJyb3V0ZU5hbWUiLCJyb3V0ZU5hbWVWYWwiLCJrZXlzQXJyIiwicHJlZCIsImFyclN0ciIsIlJlZ0V4cCIsImZpbmQiLCJnZXRQcm9wVmFsIiwibmV4dFJvdXRlUGF0aCIsInJldmVyc2UiLCJyZWR1Y2UiLCJwdXNoIiwiZW5kUm91dGVWYWxBcnIiLCJlbmRSb3V0ZVZhbCIsImVsIiwiZGF0YXNldCIsImRvbVN0cmluZ01hcCIsImRvbVN0cmluZ01hcFRvT2JqZWN0IiwiZ2V0RGF0YUZyb21QYXJhbXMiLCJjaGFuZ2VMb2NhdGlvbkJvb2wiLCJpc0hpZGRlbiIsInNlbmRSb3V0ZVN0cmVhbSIsImNoZWNrQW5kQ29udmVydFN0cldpdGhSZWdleFRva2VucyIsInJvdXRlVmFsdWUiLCJyZWdleFRva2VuT2JqIiwiY2hhbmdlV2luZG93TG9jIiwic2V0V2luZG93TG9jYXRpb24iLCJnZXRSb3V0ZVN0YXRlIiwiZ2V0SXNEZWVwTGlua0Jvb2wiLCJpc0hpc3RvcnkiLCJfcm91dGVDb3VudCIsImdldFJvdXRlQ291bnQiLCJnZXRFeHRyYVBheWxvYWRQYXJhbXMiLCJpc0RlZXBMaW5rIiwicm91dGVUeXBlIiwiZ2V0Um91dGVTdHJGcm9tUGFyYW1zIiwiZ2V0UHJvcEZyb21Db25maWciLCJwcnAiLCJkZWZhbHQiLCJ0eXBlRm9yU3RyIiwiaXNIYXNoRm9yU3RyIiwibmV4dFdpbmRvd0xvYyIsImZvcm1hdFN0ckFzV2luZG93TG9jYXRpb24iLCJkYXRhRnJvbVN0ciIsImdldERhdGFGcm9tTG9jYXRpb25TdHIiLCJwYXRoSW5uZXJtb3N0IiwiaGFzaElzVHJ1ZSIsImdldExvY2F0aW9uU3RyQnlUeXBlIiwiZ2V0UGFyYW1zRnJvbVJvdXRlU3RyIiwidCIsImxvYyIsInBhcmFtc0RhdGEiLCJjb252ZXJ0UGFyYW1zVG9Sb3V0ZSIsImNvbnZlcnRSb3V0ZVRvUGFyYW1zIiwiY2hlY2tFbXB0eVJvdXRlU3RyIiwiaXNFbXB0eUJvb2wiLCJyZW1vdmVMYXN0U2xhc2giLCJjaGFubmVsUGF5bG9hZCIsInBhdGhuYW1lIiwiaGlzdG9yeSIsInB1c2hTdGF0ZSIsImNoZWNrRm9yU2xhc2giLCJ3aGVuIiwiY29tcGxlbWVudCIsIl9fIiwiZ2V0V2luZG93TG9jYXRpb24iLCJjdXJyaWVkR2V0Um91dGUiLCJjdXJyeU4iLCJTcHluZUNoYW5uZWxVSSIsImtleUV2ZW50c0xvYWRlZCIsImtleUNvZGVBcnIiLCJsb2FkS2V5U3RyZWFtIiwia2V5VXBzIiwiZnJvbUV2ZW50IiwiZG9jdW1lbnQiLCJrZXlQcmVzc2VzJCIsImdyb3VwQnkiLCJrZXlDb2RlIiwiaW5kZXhPZiIsInJlcGVhdCIsIm9uS2V5UHJlc3NlZCIsIm51bSIsInJlZ2lzdGVyS2V5Iiwib25VSUV2ZW50IiwiZ2V0QWN0aW9uU3RhdGUiLCJ0eXBlVmFsIiwidHlwZU92ZXJSaWRlVmFsIiwidG9VcHBlciIsImV2ZW50VHlwZSIsIm1haW5BY3Rpb24iLCJ0YXJnZXQiLCJTcHluZUNoYW5uZWxXaW5kb3ciLCJjdXJyZW50U2Nyb2xsWSIsImRvbUNoYW5uZWxDb25maWciLCJXSU5ET1ciLCJvYnMkQXJyIiwiZ2V0QWN0aXZlT2JzZXJ2YWJsZXMiLCJkb20kIiwicCIsImdldE1vdXNlV2hlZWxNYXBGbiIsIkNIQU5ORUxfV0lORE9XX1dIRUVMX0VWRU5UIiwic2Nyb2xsRGlyIiwiZGVsdGFZIiwiZGVsdGFYIiwiZGVsdGFaIiwiY3JlYXRlQ3VycmllZEdlbmVyaWNFdmVudCIsInRvVXBwZXJDYXNlIiwiY3VycnkiLCJtYXBHZW5lcmljRXZlbnQiLCJjdXJyeUZuIiwiZ2V0UmVzaXplTWFwRm4iLCJDSEFOTkVMX1dJTkRPV19SRVNJWkVfRVZFTlQiLCJnZXRPcmllbnRhdGlvbk1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfT1JJRU5UQVRJT05fRVZFTlQiLCJpc1BvcnRyYWl0Qm9vbCIsIm1hdGNoTWVkaWEiLCJtYXRjaGVzIiwib3JpZW50YXRpb24iLCJnZXRNZWRpYVF1ZXJ5TWFwRm4iLCJDSEFOTkVMX1dJTkRPV19NRURJQV9RVUVSWV9FVkVOVCIsImNyZWF0ZU1vdXNlV2hlZWxPYnNlcnZhYmxlIiwiZGVib3VuY2VUIiwiZGVib3VuY2VNU1RpbWVGb3JTY3JvbGwiLCJjcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50IiwiZGVib3VuY2VUaW1lIiwiZ2V0U2Nyb2xsRGF0YSIsInNjcm9sbFkiLCJzY3JvbGxEaXN0YW5jZSIsImdldFNjcm9sbFkiLCJzY3JvbGxFbGVtZW50IiwicGFnZVlPZmZzZXQiLCJzY3JvbGxUb3AiLCJnZXRTY3JvbGxNYXBGbiIsImludGVydmFsIiwic2Nyb2xsRGF0YUZuIiwiY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZSIsImlzUGFzc2l2ZSIsImRUaW1lIiwiZWxlbWVudCIsImlzV2luZG93Iiwic2Nyb2xsRWxGb3JWYWxzIiwic2Nyb2xsTWFwRm4iLCJwYXJ0aWFsUmlnaHQiLCJza2lwV2hpbGUiLCJuZXdTY3JvbGxZIiwic2Nyb2xsRGlzdGFuY2VBYnMiLCJNYXRoIiwiYWJzIiwiY3JlYXRlT3JpZW50YXRpb25PYnNlcnZhYmxlIiwiY3JlYXRlUmVzaXplT2JzZXJ2YWJsZSIsImRlYm91bmNlTVNUaW1lRm9yUmVzaXplIiwiZ2V0RXZlbnRzRnJvbUNvbmZpZyIsImV2ZW50cyIsImxpc3RlbkZvck1lZGlhUXVlcmllcyIsIm1lZGlhUXVlcmllcyIsIm1ldGhvZHMiLCJsaXN0ZW5Gb3JSZXNpemUiLCJsaXN0ZW5Gb3JPcmllbnRhdGlvbiIsImxpc3RlbkZvclNjcm9sbCIsImxpc3RlbkZvcldoZWVsIiwibWFwT2JqSW5kZXhlZCIsIm1ldGhvZCIsImkiLCJjaGVja0Zvck1lZGlhUXVlcmllcyIsImV2ZW50c0FyciIsImdldE1lZGlhUXVlcnlPYnNlcnZhYmxlIiwiY3JlYXRlTWVyZ2VkT2JzRnJvbU9iaiIsImFwcGx5Iiwib25TY3JvbGxMb2NrRXZlbnQiLCJvblNldEVsZW1lbnRUb1Njcm9sbCIsImNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyIiwiX2NoYW5uZWxzIiwidmVyc2lvbiIsIlNweW5lQXBwIiwiZGVmYXVsdENvbmZpZyIsInNjcm9sbExvY2siLCJzY3JvbGxMb2NrWCIsInNjcm9sbExvY2tZIiwic3RyaWN0IiwibW9kZSIsImlmcmFtZXMiLCJiYXNlSHJlZiIsIklNR19QQVRIIiwicGx1Z2luTWV0aG9kcyIsInBsdWdpbnMiLCJ0bXAiLCJlcGhlbWVyYWxQcm9wcyIsInRtcFByb3BzIiwibGlzdGVuRm9yTW91c2VXaGVlbCIsImFkZDQwNHMiLCJyb3V0ZVV0aWxzIiwiaW5pdGlhbGl6ZSIsInBsdWdpbnNGbiIsImdldFBsdWdpbnNNZXRob2RPYmoiLCJyZWdpc3RlckNoYW5uZWwiLCJyZWdpc3RlclBsdWdpbiIsInBsdWdpbkluc3RhbmNlIiwicmVnaXN0ZXJEYXRhQ2hhbm5lbCIsImxpc3RDaGFubmVscyIsIm51bGxIb2xkZXIiLCJpZCIsImFwcGVuZFRvRG9tIiwiYm9keSIsInN0eWxlIiwiY3NzVGV4dCIsIlNweW5lIiwiX3NweW5lQXBwUHJvcHMiLCJTcHluZVBsdWdpbiIsInBhcmVudEVsIiwibWVyZ2VEZWZhdWx0Q29uZmlnIiwiY3JlYXRlUGFyZW50RWwiLCJyZWdpc3RlciIsInNweW5lQXBwUHJvcHMiLCJwbHVnaW5OYW1lIiwib25CZWZvcmVSZWdpc3RlcmVkIiwiYWRkUGx1Z2luQ29uZmlnIiwib25SZW5kZXIiLCJTcHluZUFwcFByb3BlcnRpZXMiLCJhc3NpZ24iLCJnZXRTcHluZUFwcCIsInVwZGF0ZVNweW5lQ29uZmlnIiwic3B5bmVBcHAiLCJwbHVnaW5Db25maWciLCJwYXRoU2F0aXNmaWVzIiwiZ2V0RWxlbWVudEJ5SWQiLCJwbHVnaW5FbCIsImFwcGVuZENoaWxkIiwicmVuZGVyIiwiY3JlYXRlUGx1Z2luRWwiLCJjaGVja0ZvclJlcXVpcmVkV2luZG93RXZlbnQiLCJyZXF1aXJlZEV2ZW50cyIsIndpbmRvd0NvbmZpZyIsImdldENoYW5uZWxDb25maWciLCJtaXNzaW5nRXZlbnRzIiwiQ2hhbm5lbEZldGNoVXRpbCIsIl9tYXBGbiIsInNldE1hcEZuIiwiX3VybCIsInNldFVybCIsIl9yZXNwb25zZVR5cGUiLCJzZXRSZXNwb25zZVR5cGUiLCJfc2VydmVyT3B0aW9ucyIsInNldFNlcnZlck9wdGlvbnMiLCJfc3Vic2NyaWJlciIsImxvZyIsInNlcnZlck9wdGlvbnMiLCJyZXNwb25zZVR5cGUiLCJzdGFydFdpbmRvd0ZldGNoIiwibWV0YWRhdGEiLCJ0YXBMb2ciLCJ0YXAiLCJtYXBNZXRob2QiLCJmZXRjaCIsIm1lcmdlTWFwIiwicmVzcG9uc2UiLCJwYXJzZVJlc3BvbnNlIiwic2FuaXRpemVkRGF0YSIsImNhdGNoRXJyb3IiLCJvZiIsImNyZWF0ZUZldGNoRXJyb3JQYXlsb2FkIiwic2hhcmUiLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwiY29udGVudFR5cGUiLCJoZWFkZXJzIiwicmVzcG9uc2VNZXRhZGF0YSIsIm9rIiwicmF3Qm9keSIsInNhZmVSZWFkVGV4dCIsImNyZWF0ZUZldGNoRXJyb3IiLCJlcnJvclR5cGUiLCJtZXNzYWdlIiwicGFyc2VKc29uUmVzcG9uc2UiLCJ0ZXh0IiwiYmxvYiIsImFycmF5QnVmZmVyIiwiZm9ybURhdGEiLCJ0cmltbWVkQm9keSIsInRyaW0iLCJwYXJzZSIsIm9yaWdpbmFsRXJyb3IiLCJFcnJvciIsImZldGNoTWV0YWRhdGEiLCJpc0Vycm9yIiwicmF3Qm9keVByZXZpZXciLCJ0cnVuY2F0ZUJvZHkiLCJvcmlnaW5hbEVycm9yTWVzc2FnZSIsIm1heExlbmd0aCIsInNsaWNlIiwib3B0cyIsImdldEZuIiwic3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMiLCJIZWFkZXJzIiwidXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMiLCJtZXJnZWRPcHRpb25zIiwiYmFzZU9wdGlvbnMiLCJBY2NlcHQiLCJjcmVkZW50aWFscyIsImNhY2hlIiwicmVkaXJlY3QiLCJyZWZlcnJlclBvbGljeSIsImludGVncml0eSIsImtlZXBhbGl2ZSIsImlzTm90QXJyIiwibm90IiwiaXNOb3RFbXB0eSIsImlzTm9uRW1wdHlTdHIiLCJpc05vbkVtcHR5QXJyIiwiaXNPYmplY3RGbiIsImlzTm9uRW1wdHlPYmplY3RGbiIsIkNoYW5uZWxQYXlsb2FkRmlsdGVyIiwic2VsZWN0b3IiLCJmaWx0ZXJzIiwiZGVidWdMYWJlbCIsImRlYnVnTGFiZWxBcnIiLCJwcm9wRmlsdGVycyIsImFkZFN0cmluZ1NlbGVjdG9yRmlsdGVyIiwiZmlsdGVyU2VsZWN0b3IiLCJhZGRBcnJheVNlbGVjdG9yRmlsdGVyIiwiYWRkRGF0YUZpbHRlciIsImZpbHRlckRhdGEiLCJmaWx0ZXJzQXJyIiwiZmlsdGVyc0FyZUVtcHR5IiwiZmlsdGVySnNvbiIsImZpbHRlcmRlYnVnTGFiZWwiLCJmblZhbCIsIkYiLCJpc1N0cmluZyIsIkJvb2xlYW4iLCJpc0Jvb2xlYW4iLCJpc051bWJlciIsImNvbXBhcmVTdHIiLCJpc0FycmF5Rm4iLCJmTWV0aG9kIiwid2hlcmUiLCJjb21wYXJlZE9iaiIsInByb3BzQm9vbGVhbnMiLCJmb3JFYWNoT2JqSW5kZXhlZCIsImNvbXBhcmVEYXRhIiwiY2hlY2tQYXlsb2FkU2VsZWN0b3IiLCJzcmNQYXlsb2FkIiwic3JjIiwiY29tcGFyZUVscyIsImVsQ29tcGFyZSIsImlzRXF1YWxOb2RlIiwibWFwTm9kZUFycldpdGhFbCIsInNlbCIsIm5vZGVBcnIiLCJxdWVyeVNlbGVjdG9yQWxsIiwibm9kZUFyclJlc3VsdHNEZWJ1Z2dlciIsImZsYXR0ZW4iLCJzZWxlY3RvcnNBcnIiLCJub2RlQXJyUmVzdWx0IiwiYW55IiwicXVlcnlTZWxlY3RvciIsInNlbGVjdG9yQXJyIiwicGF5bG9hZENoZWNrIiwiaXNNZXJnZWFibGVPYmplY3QiLCJ0b1N0cmluZyIsImNsb25lSWZOZWNlc3NhcnkiLCJvcHRpb25zQXJndW1lbnQiLCJkZWVwTWVyZ2UiLCJpc0FycmF5IiwiZGVmYXVsdEFycmF5TWVyZ2UiLCJkZXN0aW5hdGlvbiIsImFycmF5IiwiYXJyYXlNZXJnZSIsIm1lcmdlT2JqZWN0IiwicHJldiIsImRlbGF5Q2FsbCIsImFzeW5jIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJnZXRDb25zdHJ1Y3Rvck5hbWUiLCJzdWJzdHIiLCJmaW5kU3RyT3JSZWdleE1hdGNoU3RyIiwicyIsImNoZWNrZXJJZlJlZ2V4TWF0Y2hFeGlzdHMiLCJjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmoiLCJkb21NYXAiLCJjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsIiwiaXNOb3ROaWwiLCJpc05vdE5pbEFuZElzTm90RW1wdHkiLCJnZXRBbGxNZXRob2ROYW1lcyIsImluc3RhbmNlIiwib21pdHRlZE1ldGhvZHMiLCJjb21iaW5lZE9taXR0ZWRNZXRob2RzIiwib21pdFByb3BzRnJvbUFyciIsIndpdGhvdXQiLCJ1bmlxIiwic3RhdGljTWV0aG9kcyIsImFsbE1ldGhvZHMiLCJnYyIsImJhc2VDb3JlTWl4aW5zIiwiY3JlYXRlcHJvcHNNYXAiLCJ3bSIsIldlYWtNYXAiLCJvYmpLZXkiLCJ2c2lkIiwid2Vha01hcCIsImNyZWF0ZUlkIiwicmFuZG9tIiwic3Vic3RyaW5nIiwic2V0VHJhY2VGdW5jIiwiYmFzZVN0cmVhbXNNaXhpbnMiLCJ0ZXN0RnVuYyIsInNlbmRSb3V0ZVBheWxvYWQiLCJzZW5kVUlQYXlsb2FkIiwiUm91dGVDaGFubmVsVXBkYXRlciIsImN4dCIsImNyZWF0ZVRlbXBvcmFyeVZpZXdTdHJlYW1PYmoiLCJzZW5kUm91dGVDaGFubmVsVXBkYXRlIiwidnMiLCJvblJlbmRlcmVkIiwic2VuZEluZm9Ub0NoYW5uZWwiLCJhZnRlckJyb2FkY2FzdEV2ZW50cyIsImRpc3Bvc2VWaWV3U3RyZWFtIiwiYXBwZW5kVG9OdWxsIiwic2FmZUNsb25lIiwiX19wcm94eV9fcHJveHlOYW1lIiwicHJveHlSZXZpdmVyTWV0aG9kIiwiZ2V0UHJveHlSZXZpdmVyIiwicHJveHlPYmoiLCJjbG9uZU5lc3RlZFByb3h5T2JqIiwicGF0aEFyciIsIm5lc3RlZFByb3h5T2JqIiwiX19wcm94eV9faXNQcm94eSIsIl9fcHJveHlfX3Byb3BzIiwicm9vdE9iaiIsInByb3h5SXRlcmFibGUiLCJpdGVyT2JqIiwiaXRlclBhdGgiLCJkYXRhUGF0aCIsImVudHJpZXMiLCJnZXRQcm9wVHlwZSIsImNsb25lZFBhdGgiLCJjbXNEYXRhUmV2aXZlTmVzdGVkUHJveHlPYmoiLCJfc2FuaXRpemVEYXRhIiwiaXNDb25maWd1cmVkIiwiZ2xvYmFsRGlzYWJsZSIsIlNBRkVfVVJJX1JFR0VYUCIsIm5vcm1hbGl6ZVVyaUZvckNoZWNrIiwiU0FGRV9GT1JfUklDSF9URVhUIiwiQUxMT1dFRF9UQUdTIiwiQUREX1RBR1MiLCJBTExPV0VEX0FUVFIiLCJBTExPV19EQVRBX0FUVFIiLCJGT1JCSURfQVRUUiIsIkZPUkJJRF9UQUdTIiwiQUxMT1dFRF9VUklfUkVHRVhQIiwiU0FGRV9GT1JfQVBQIiwiY29uZmlndXJlZElmcmFtZVBvbGljeSIsImFsbG93IiwiYWxsb3dlZE9yaWdpbnMiLCJzYW5kYm94IiwiYWN0aXZlSWZyYW1lUG9saWN5IiwicmVzb2x2ZUlmcmFtZVBvbGljeSIsIm92ZXJyaWRlIiwiaXNBbGxvd2VkSWZyYW1lU3JjIiwicG9saWN5Iiwibm9ybWFsaXplZCIsInJlc29sdmVkIiwiVVJMIiwiaHJlZiIsIm9yaWdpbiIsImhvc3RuYW1lIiwicHJvdG9jb2wiLCJlbmRzV2l0aCIsIm9yaWdpbnMiLCJzb21lIiwiaWZyYW1lSG9va0FkZGVkIiwiUklDSFRFWFRfQUxJQVNFUyIsInJlc29sdmVEZWZhdWx0TW9kZSIsImNvbmZpZ01vZGUiLCJidWlsZE1vZGVDb25maWciLCJiYXNlIiwiYWxsb3dJZnJhbWUiLCJpZnJhbWVBbGxvd2VkRm9yTW9kZSIsIkFERF9BVFRSIiwibWFrZVNhbml0aXplRm4iLCJjZmciLCJodG1sIiwic2FuaXRpemVEYXRhQ29uZmlndXJlIiwibm9kZSIsInRhZ05hbWUiLCJnZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJoYXNBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJwcm9jZXNzRmFjdG9yeSIsInNhbml0aXplU3RyIiwicHJvY2VzcyIsIm91dCIsImNhbGxEaXNhYmxlIiwiaWZyYW1lc092ZXJyaWRlIiwiZWZmZWN0aXZlTW9kZSIsInNhbml0aXplRGF0YUZvcmNlIiwiZWZmZWN0aXZlIiwiVVJMX0FUVFJTIiwic2FuaXRpemVBdHRyaWJ1dGUiLCJhbGxvd2VkIiwidGFnIiwic3RhcnRzV2l0aCIsImFwcGx5SWZyYW1lSGFyZGVuaW5nIiwic2FuaXRpemVFdmVudFRhcmdldCIsIlVOU0FGRV9SRSIsImNsZWFuIiwiaXNDb250ZW50RWRpdGFibGUiLCJpbm5lckhUTUwiLCJfc2FuaXRpemVIVE1MIiwic2FuaXRpemVIVE1MQ29uZmlndXJlIiwiYWxsb3dUYXJnZXRBdHRyIiwiYWRkTm9vcGVuZXIiLCJpc1JpY2h0ZXh0IiwiZG9tUHVyaWZ5Q29uZmlnIiwiUkVUVVJOX1RSVVNURURfVFlQRSIsInNhbml0aXplV2l0aFBvbGljeSIsInJlbFBhcnRzIiwic3BsaXQiLCJyZWxTZXQiLCJTZXQiLCJhZGQiLCJ0cnVzdGVkVHlwZXMiLCJjcmVhdGVQb2xpY3kiLCJjcmVhdGVIVE1MIiwidG9Fc2NhcGUiLCJlcnIiLCJfY29uZmlnIiwiX2NoYW5uZWxzTWFwIiwiX2luaXRpYWxpemVkIiwiX2RlYnVnIiwiX2VuYWJsZUNNU1Byb3hpZXMiLCJfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUiLCJfbmF2TGlua3MiLCJfSU1HX1BBVEgiLCJfZG9Ob3RUcmFja0NoYW5uZWxzQXJyIiwiX3Byb3hpZXNNYXAiLCJfc3B5bmVQbHVnaW5NZXRob2RzIiwiY29uZm9ybVJvdXRlT2JqZWN0Iiwic2V0Q2hhbm5lbHNNYXAiLCJzZXRIZWFkQmFzZUhyZWYiLCJiYXNlVGFnIiwiY3JlYXRlRWxlbWVudCIsImFkZDQwNFByb3BzIiwic2V0UHJvcCIsImlzVGVtcCIsImdldFByb3AiLCJ0ZW1wVmFsIiwiY3JlYXRlVGVtcFByb3AiLCJzZXRDaGFubmVsQ29uZmlnIiwiY2hhbm5lbENvbmZpZyIsImFkZFBsdWdpbk1ldGhvZHMiLCJwbHVnaW5NZXRob2RzT2JqIiwiYWRkTWV0aG9kcyIsImdldFVudHJhY2tlZENoYW5uZWxzTGlzdCIsInJlZ2lzdGVyUHJveHlSZXZpdmVyIiwicHJveHlOYW1lIiwiZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lIiwiZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUiLCJsaW5rc0RhdGEiLCJlbmFibGVDTVNQcm94aWVzIiwiZ2V0SHJlZkZyb21EYXRhIiwicm91dGVQcm9wcyIsInNldENNU1Byb3h5TWV0aG9kIiwiZm9ybWF0VGVtcGxhdGVGb3JQcm94eURhdGEiLCJ0ZW1wR2V0Q2hhbm5lbHNJbnN0YW5jZSIsInRlbXBHZXRDb25maWciLCJfcGx1Z2luTWV0aG9kc09iaiIsImNyZWF0ZSIsIlNweW5lUGx1Z2luc01ldGhvZHMiLCJmb28iLCJhZGRNZXRob2QiLCJ3YXJuU3RyIiwibWV0aG9kc09iaiIsImtleVN0ciIsImNoZWNrSWZNZXRob2RFeGlzdHMiLCJTcHluZVRyYWl0IiwicGFyZW50Q29udGV4dCIsInByZWZpeCIsImF1dG9Jbml0IiwiYXV0b0JpbmRlciIsImFsbE1ldGhvZHNMaXN0IiwiaW5pdEF1dG9CaW5kZXIiLCJnZXRFbmhhbmNlck1ldGhvZHMiLCJjaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMiLCJpc0RlYnVnTW9kZSIsIm1hbGZvcm1lZE1ldGhvZHNBcnIiLCJ3YXJuaW5nU3RyIiwiYmluZFBhcmVudFZpZXdTdHJlYW0iLCJjb250ZXh0IiwiYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0iLCJpc1N0YXRpYyIsImNvbnN0cnVjdG9yVHlwZSIsImJpbmRTdGF0aWNNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtIiwiYmluZEN1cnJ5IiwiU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCIsImNoZWNrSWZQYXJhbVZhbHVlTWF0Y2hlc1JlZ2V4IiwicGFyYW1WYWx1ZSIsInJvdXRlT2JqIiwicmVqZWN0UGFyYW1LZXkiLCJyZWdleE1hdGNoU3RyIiwiY2hlY2tlciIsImFzc29jIiwiaGFzaCIsInNlYXJjaCIsInByb3BWYWwiLCJzbGFzaCIsInF1ZXJ5IiwiY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMiLCJyb3V0ZSIsInBhcmFtc0Zyb21Mb2MiLCJ1cmxBcnIiLCJsb29wVGhyb3VnaFBhcmFtIiwidXJsT2JqIiwia2V5d29yZCIsInBhcmFtVmFsRnJvbURhdGEiLCJwYXJhbVZhbFR5cGUiLCJpc09iamVjdCIsIm9iamVjdFBhcmFtRXhpc3RzIiwib2JqZWN0Q29udGFpbnNSb3V0ZSIsIm5ld09iaiIsImNyZWF0ZVNsYXNoU3RyaW5nIiwiYXJyQ2xlYXIiLCJub3RVbmRlZmluZWQiLCJzdHJpcFJlZ2V4Iiwiam9pbmVyIiwiY3JlYXRlUXVlcnlTdHJpbmciLCJjcmVhdGVQYWlyIiwiY2hlY2tQYWlyIiwibWFwQXJyYXlPZlBhaXJzIiwiY2hlY2tJZlN0cklzRW1wdHkiLCJjcmVhdGVRcyIsImNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzIiwidXJsc0FyciIsInBhcnNlU3RyaW5nIiwiZ2V0T3ZlcnJpZGVWYWwiLCJvdmVycmlkZVZhbCIsImNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzIiwiaW5wdXQiLCJnZXRTdHJpbmdCZWZvcmVQaXBlIiwiY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2giLCJ1cGRhdGVkT2JqIiwiZ2xvYlBhdHRlcm4iLCJwYXR0ZXJuIiwiZXNjYXBlZFBhdHRlcm4iLCJnbG9iUGF0dGVybk1hdGNoIiwiciIsImxvY1N0ciIsInVybFR5cGUiLCJsb2NhdGlvblN0ciIsInBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24iLCJmaW5kSW5kZXhPZk1hdGNoZWRTdHJpbmdPclJlZ2V4IiwibWFpblN0ciIsImlzNDA0IiwiY2hlY2tGb3JFbXB0eSIsImNoZWNrRm9yRWl0aGVyU3RyT3JSZU1hdGNoIiwiZmluZExhc3RJbmRleCIsInJlIiwiZmluZE1hdGNoSW5kZXgiLCJjaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtIiwicmVnZXhUb2tlbnMiLCJsYXN0IiwiZ2V0VmFsQ29tcGFyZUFyciIsInBhcmFtSW5kZXgiLCJwYXJhbVN0ciIsInBhcmFtIiwiaW52ZXJ0ZWRPYmoiLCJpbnZlcnQiLCJwYXJhbUludmVydGVkIiwiZ2V0UGFyYW1JbnZlcnRlZCIsImNyZWF0ZUFyckZyb21TbGFzaFN0ciIsImNvbnZlcnRTbGFzaFJvdXRlU3RyVG9QYXJhbXNPYmoiLCJ0b3BMZXZlbFJvdXRlIiwidmFsdWVzQXJyIiwicm91dGVkVmFsdWVzQXJyIiwibGF0ZXN0T2JqIiwidG90YWwiLCJjdXJyZW50VmFsdWUiLCJyb3V0ZVZhbHVlU3RyIiwiaXNFbXB0eU9yTmlsIiwicHJldlBhdGhOb3RFcUN1cnJlbnRQYXRoIiwic3RyUGF0aCIsIm9iamVjdEZyb21TdHIiLCJvYmplY3RGcm9tUm91dGVQYXJhbSIsInppcE9iaiIsImdldExhc3RBcnJWYWwiLCJhIiwiY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyIiwiY29udmVydFF1ZXJ5U3RyVG9QYXJhbXMiLCJzdHJBcnIiLCJjb252ZXJ0VG9QYXJhbXMiLCJTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIiwic3Vic2NyaWJlRm4iLCJmcm9tRXZlbnRQYXR0ZXJuIiwiaGFuZGxlciIsIm9ucG9wc3RhdGUiLCJwaWNrVmFsdWVzIiwib2JqMSIsIm9iajIiLCJjcmVhdGVQcmVkIiwiZ2V0UHJvcHNTdGF0ZSIsInNhbWUiLCJwcmV2aW91c0V4aXN0cyIsIm5leHRFeGlzdHMiLCJjaGFuZ2VkIiwiYWRkZWQiLCJyZW1vdmVkIiwicGF0aHNDaGFuZ2VkIiwicGF0aHNBZGRlZCIsInBhdGhzUmVtb3ZlZCIsImdldENvbXBhcmVyIiwiZ2V0Um91dGVBcnJEYXRhIiwicm91dGVBcnIiLCJnbyIsIm9ial8iLCJrXyIsInZfIiwiYWRkUm91dGVEYXRhc2V0cyIsImNoYW5uZWxSb3V0ZU9iaiIsImdldEhSRUYiLCJpc1ZhbGlkU3RyUkUiLCJjcmVhdGVJbml0aWFsVmFsRm4iLCJhY2NNYWluIiwicm91dGVQYXRoT2JqIiwib2JqQWNjIiwiYXJyUGFpciIsImdldExpbmtUZXh0IiwiY3JlYXRlVGl0bGUiLCJzdWJSb3V0ZU5hbWUiLCJvQmFzZSIsIm5hdkxldmVsIiwidGl0bGUiLCJyZWR1Y2VkQXJyIiwicmVtb3ZlVW5kZWZpbmVkIiwicm91dGVOYW1lc0FyciIsImRhdGFzZXRzQXJyIiwiZXhjbHVkZSIsImdldE1haW5LZXlzIiwiZ2V0TmF2UHJvcHMiLCJjaGFubmVsc1JvdXRlUGF0aCIsInBhcnNlUm91dGVQYXRoIiwiY29uZmlnTWFwcGVyRm4iLCJvYmo0MDQiLCJpc1JvdXRlUGF0aCIsImV4dHJhUm91dGVEYXRhIiwiU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3ciLCJldmVudE5hbWUiLCJhZGRFdmVudExpc3RlbmVyIiwicGFzc2l2ZSIsImNyZWF0ZU1lZGlhUXVlcnkiLCJtcSIsImNoZWNrSWZWYWxpZE1lZGlhUXVlcnkiLCJub1NwYWNlcyIsImlzVmFsaWRCb29sIiwibWVkaWEiLCJ3YXJuTXNnIiwibWFwS2V5IiwibWVkaWFRdWVyeU5hbWUiLCJrZXlGbiIsIm1lZGlhUXVlcnlIYW5kbGVyIiwicSIsImFkZEhhbmRsZXIiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUhhbmRsZXIiLCJvbmNoYW5nZSIsIm1lZGlhUXVlcmllc09iaiIsImNyZWF0ZUZhZGVySW5saW5lVGV4dCIsImlzSW5Cb29sIiwic3RhcnRaZXJvQm9vbCIsImZhZGVpbiIsImN1cnJlbnRPcGFjaXR5IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm9wYWNpdHkiLCJpbmxpbmVDc3MiLCJmYWRlb3V0IiwiY2FsbGJhY2siLCJWaWV3U3RyZWFtT2JzZXJ2YWJsZSIsIm9ic2VydmFibGVTdHJlYW1zIiwiY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyIsImNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCIsImRpckludGVybmFsIiwiZGlyUGFyZW50IiwiZGlyQ2hpbGQiLCJQIiwiQyIsIlBDSSIsIkNJIiwiUEkiLCJQQyIsImFkZERlZmF1bHREaXIiLCJmbGlwIiwiZGVmYXVsdHMiLCJhZGREb3duSW50ZXJuYWxEaXIiLCJhZGRDaGlsZEFuZEludGVybmFsRGlyIiwibWFwVG9EZWZhdWx0RGlyIiwidmlld05hbWUiLCJmaWx0ZXJTdHJlYW1zIiwicHJvcFNhdGlzZmllcyIsImFyclR5cGUiLCJmaWx0ZXJQYXJlbnQiLCJmaWx0ZXJDaGlsZCIsImZpbHRlckludGVybmFsIiwiYWRkZnJvbSQiLCJyZWxTdHIiLCJmcm9tJCIsImFkZFBhcmVudGZyb20kIiwiYWRkSW50ZXJuYWxmcm9tJCIsImFkZENoaWxkZnJvbSQiLCJyYXckIiwidG9JbnRlcm5hbCQiLCJ0b1BhcmVudCQiLCJ0b0NoaWxkJCIsInN0cmVhbU9iaiIsInBhcmVudCIsImludGVybmFsIiwiY2hpbGQiLCJjb21wbGV0ZUFsbCIsImNvbXBsZXRlIiwiaXNTdG9wcGVkIiwiY29tcGxldGVTdHJlYW0iLCJEb21FbGVtZW50VGVtcGxhdGUiLCJ0ZW1wbGF0ZSIsImZvcm1hdFRlbXBsYXRlIiwiaXNQcm94eURhdGEiLCJfX2Ntc19faXNQcm94eSIsIm5vcm1hbGl6ZVRyaXBsZUJyYWNrZXRzIiwicHJveHlGb3JtYXR0ZXIiLCJzcHluZURhdGEiLCJjaGVja0ZvckFycmF5RGF0YSIsInRlbXBsYXRlRGF0YSIsImN1cnJlbnRPdXRlckxvb3BEYXRhIiwiZ2V0U3RyaW5nQXJyYXkiLCJzdHJNYXRjaGVzIiwiZmluZFRtcGxMb29wc1JFIiwicGFyc2VUbXBsTG9vcHNSRSIsInBhcnNlVG1wbExvb3BGbiIsInBhcnNlVGhlVG1wbExvb3AiLCJmaW5kVG1wbExvb3BzUHJlZCIsImNoZWNrRm9yTWF0Y2hlcyIsImFkZFBhcmFtcyIsImZpbmFsQXJyIiwiaXNQcmltaXRpdmVUYWciLCJnZXROZXN0ZWREYXRhUmVkdWNlciIsIm5lc3RlZERhdGEiLCJlbXB0eVJFIiwid2l0aG91dExlYWtzIiwiXyIsImlubmVyTG9vcFJFIiwic3dhcFBhcmFtc0ZvclRhZ3NSRSIsImhhc0xvb3AiLCJyZW1vdmVUaGlzIiwicmVuZGVyRG9jRnJhZyIsInJlcGxhY2VJbWdQYXRoIiwiY3JlYXRlUmFuZ2UiLCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiLCJyZW5kZXJUb1N0cmluZyIsImdldFRlbXBsYXRlU3RyaW5nIiwiZ2V0RGF0YVZhbEZyb21QYXRoU3RyIiwicGF0aFN0ciIsImRhdGFGaWxlIiwidGVtcGxhdGVTdHIiLCJyZXBsYWNlQWxsIiwicHJvY2Vzc0lubmVyTG9vcCIsImJvZHlTdHIiLCJwYXJlbnRJdGVtIiwiaW5uZXJSRSIsImZ1bGxNYXRjaCIsIm9wZW5UYWciLCJpbm5lcktleSIsImlubmVyQm9keSIsImlubmVyRGF0YSIsImlubmVyQXJyIiwicHJldmlvdXNPdXRlciIsInJlbmRlcmVkIiwiaW5uZXJJdGVtIiwiaW5uZXJJZHgiLCJzdWJzdGl0dXRlRm9ySXRlbSIsImluZGV4IiwiZXNjYXBlZCIsImN0eCIsImJ1aWxkU3RyaW5nSXRlbUNvbnRleHQiLCJzdWJzdGl0dXRlT2JqZWN0IiwiYnVpbGRJdGVtQ29udGV4dCIsInNweW5lTG9vcEtleSIsImxvb3BJbmRleCIsImxvb3BOdW0iLCJvdXRlckRhdGEiLCJfX2Ntc19fZGF0YUlkIiwia2V5SWRTdHIiLCJvcmlnS2V5IiwicmVEb3QiLCJwb3NpdGlvbmFsIiwib3V0ZXJCb2R5IiwiZWxEYXRhIiwiZWxBcnIiLCJib2R5SGFzSW5uZXJMb29wIiwiRG9tRWxlbWVudCIsImF0dHJpYnV0ZXMiLCJnZXREb21BdHRyaWJ1dGVzIiwiYXR0cnMiLCJ1cGRhdGVBdHRycyIsImZyYWdtZW50IiwiY3JlYXRlRG9jdW1lbnRGcmFnbWVudCIsInNldEVsQXR0cnMiLCJwYXJhbXMiLCJ0aGVNYXAiLCJhZGRUZW1wbGF0ZSIsImZyYWciLCJhZGRUbXBsIiwiYWRkQ29udGVudCIsInR4dCIsImNyZWF0ZVRleHROb2RlIiwiZXhlY3V0ZSIsInJlbmRlclRvSFRNTFN0cmluZyIsIm91dGVySFRNTCIsInJldHVybklmRGVmaW5lZCIsInVwZGF0ZXByb3BzIiwidXBkYXRlcHJvcHNBbmRSdW4iLCJ1bm1vdW50IiwicmVtb3ZlIiwidXBkYXRlVGFnIiwidXBkYXRlQXR0cmlidXRlcyIsInVwZGF0ZVRlbXBsYXRlIiwidXBkYXRlRGF0YSIsImFkZFRhZ0FuZFJlbmRlciIsImFkZEF0dHJzaWJ1dGVzQW5kUmVuZGVyIiwiYWRkVGVtcGxhdGVBbmRSZW5kZXIiLCJhZGREYXRhQW5kUmVuZGVyIiwiY29yZU1peGlucyIsImF0dHJpYnV0ZXNBcnJheSIsImlzRGV2TW9kZSIsIlZpZXdTdHJlYW1Ccm9hZGNhc3RlciIsImJyb2FkY2FzdEZuIiwiYnJvYWRjYXN0ZXIiLCJhZGREYmxDbGlja0V2dCIsInR5cGVPdmVyUmlkZSIsImJyb2FkY2FzdCIsImFyZ3MiLCJjaGFubmVsUGF5bG9hZHMiLCJVSSIsImxvY2FsIiwiY2hlY2tQYXJlbnRFbHMiLCJlbFNlbGVjdGVkIiwicGFyZW50RWxlbWVudCIsInBsdWNrRWxGcm9tUGFyZW50IiwiaXNMb2NhbEV2ZW50IiwicHJldmVudERlZmF1bHQiLCJjaCIsImVuZFByZXZlbnREZWZhdWx0Iiwic3JjRXZlbnQiLCJhcnJGbiIsInN0cmVhbU1peGlucyIsIlZpZXdTdHJlYW1FbGVtZW50Iiwic2luayQiLCJ2aWV3UHJvcHMiLCJ2c05hbWUiLCJfc3RhdGUiLCJleHRlbmRlZEhhc2hNZXRob2RzIiwiYWRkQWN0aW9uTGlzdGVuZXJzIiwiZnVuY1N0ciIsImhhc2hNZXRob2RzIiwic2V0SGFzaE1ldGhvZHMiLCJvbk9ic1NpbmtTdWJzY3JpYmUiLCIkZGlycyIsInNvdXJjZVN0cmVhbXMiLCJfc291cmNlJCIsImV4dGVuZGVkSGFzaE1ldGhvZHNPYmoiLCJkZWZhdWx0SGFzaE1ldGhvZHMiLCJWU19ERVRSSVRVU19DT0xMRUNUIiwib25HYXJiYWdlQ29sbGVjdCIsIlJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUIiwib25SZWFkeUZvckdDIiwiRVhUSVJQQVRFIiwib25EaXNwb3NlIiwiVlNfU1BBV04iLCJWU19TUEFXTl9BTkRfQVRUQUNIX1RPX1BBUkVOVCIsIm9uUmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQiLCJWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTSIsIm9uUmVuZGVyQW5kQXR0YWNoVG9Eb20iLCJBVFRBQ0hfQ0hJTERfVE9fU0VMRiIsIm9uQXR0YWNoQ2hpbGRUb1NlbGYiLCJjcmVhdGVEb21JdGVtIiwib25EaXNwb3NlQ29tcGxldGVkIiwiYW5pbWF0ZUluVHdlZW4iLCJhbmltYXRlT3V0VHdlZW4iLCJzZXRBbmltYXRlSW4iLCJhbmltYXRlSW4iLCJkb21JdGVtIiwiYW5pbWF0ZUluVGltZSIsImRpc3Bvc2VNZXRob2QiLCJnY0RhdGEiLCJmYWRlT3V0T2JzIiwiYmluZENhbGxiYWNrIiwiYW5pbWF0ZU91dFRpbWUiLCJvbkZhZGVvdXRDb21wbGV0ZWQiLCJhbmltYXRlT3V0IiwicmVtb3ZlU3RyZWFtIiwiZ2V0U291cmNlU3RyZWFtIiwiY29tYmluZURvbUl0ZW1zIiwiY29udGFpbmVyIiwiYWZ0ZXIiLCJhdHRhY2hUeXBlIiwiaW5zZXJ0QmVmb3JlIiwiZmlyc3RDaGlsZCIsImNoaWxkUmVuZGVyRGF0YSIsInJlbmRlckRvbUl0ZW0iLCJnZXRFbCIsIkkiLCJleHRlbmRlZE1ldGhvZHMiLCJhdHRhY2hEYXRhIiwiZGVmYXVsdFRvRm4iLCJzZW5kRGF0YSIsIlZpZXdTdHJlYW1QYXlsb2FkIiwic2VuZFRvRGlyZWN0b3JTdHJlYW0iLCJkaXJlY3RvclN0cmVhbSQiLCJpc05vZGVFbGVtZW50Iiwibm9kZUNoZWNrIiwiZ2V0RWxPckxpc3QiLCJ2ZXJib3NlQm9vbCIsImxpc3QiLCJnZXROb2RlTGlzdEFycmF5IiwidGVzdFNlbGVjdG9ycyIsImlzVmFsaWRTZWxlY3RvciIsImlzVmFsaWRTZWxlY3RvckJvb2wiLCJpc1BhcmVudCIsInJldHVyblNlbGVjdG9ySWZWYWxpZCIsInNldElubGluZUNzcyIsIlZpZXdTdHJlYW1TZWxlY3RvciIsImdlbmVyYXRlU3B5bmVTZWxlY3RvcklkIiwiYWRkQ2xhc3MiLCJjbGFzc0xpc3QiLCJyZW1vdmVDbGFzcyIsInNldENsYXNzIiwicmVtb3ZlQ2xhc3NTdHJBcnIiLCJjbGFzc05hbWUiLCJjbGFzc1N0ckFyciIsInRvZ2dsZUNsYXNzIiwiY29udGFpbnMiLCJ0b2dnbGUiLCJodG1sRWxlbWVudCIsImFkZEFuaW1DbGFzcyIsInNldEFjdGl2ZUl0ZW0yIiwiZWxTZWwiLCJjdXJyZW50RWwiLCJzZXRBY3RpdmVJdGVtIiwibWF0Y2hpbmdFbCIsIlZpZXdTdHJlYW0iLCJ2c251bSIsIl9wb3N0UmVuZGVyQ2FsbGVkIiwic2VuZExpZmVjeWxlRXZlbnRzIiwiaGFzaElkIiwiaWQkIiwidmlld0NsYXNzIiwiZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHMiLCJhZGREZWZhdWx0RGlyZWN0aW9uIiwic2VuZExpZmVjeWNsZU1ldGhvZCIsInNlbmRMaWZlY3ljbGVNZXRob2RBY3RpdmUiLCJzZW5kTGlmZWN5Y2xlTWV0aG9kSW5hY3RpdmUiLCJhdHRyaWJ1dGVzQXJyIiwiZG9tQXR0cmlidXRlcyIsImxvYWRBbGxNZXRob2RzIiwiZWxJc0FscmVhZHlSZW5kZXJlZEJvb2wiLCJlbEFscmVhZHlFeGlzdHNGbiIsIlZpZXdDbGFzcyIsIl9yYXdTb3VyY2UkIiwic2VuZEV2ZW50c0Rvd25TdHJlYW0iLCJzZW5kRXZlbnRzRG93blN0cmVhbUZuIiwiaW5pdFZpZXdTdHJlYW0iLCJhZGRlZENoYW5uZWxzIiwiY2hlY2tJZkVsZW1lbnRBbHJlYWR5RXhpc3RzIiwic291cmNlJCIsImNoZWNrSWZBY3Rpb25zQXJlUmVnaXN0ZXJlZCIsImFjdGlvbnNBcnIiLCJjaGVja0Zvck1hdGNoIiwic3RyTWF0Y2giLCJmaW5kSW5kZXgiLCJnZXRBbGxBY3Rpb25zQXJyIiwiY2hhbm5lbFN5bnRheCIsImdldEFsbEFjdGlvbnMiLCJpc1ZhbGlkTmVzdGVkQXJyIiwiaXNUcnVlIiwiYWxsSXNUcnVlIiwiaXNWYWxpZEFyciIsIm1hcEV2ZW50c0FyckZuIiwidXBkYXRlUHJvcHNUb01hdGNoRWwiLCJnZXRUYWdOYW1lIiwidG9Mb3dlciIsInBvc3RSZW5kZXIiLCJjaGFubmVsRm4iLCJvbkNoYW5uZWxNZXRob2RDYWxsIiwiYWN0aW9uRmlsdGVyIiwiaGFzaFNvdXJjZU1ldGhvZHMiLCJzZXRTb3VyY2VIYXNoTWV0aG9kcyIsImRlbGV0ZWQiLCJmaWx0ZXJQYXlsb2FkIiwicnVuRnVuYyIsImhhc2hTb3VyY2VLZXlzIiwiRVhUSVJQQVRJTkciLCJjaGVja1BhcmVudERpc3Bvc2UiLCJWU19TUEFXTkVEIiwib25WU1JlbmRlcmVkIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UIiwib25SZWFkeVRvR0MiLCJWU19OVUxMSVRZIiwib25NYXBWaWV3U291cmNlIiwidGFrZVdoaWxlIiwibm90R0NTVEFURSIsImluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zIiwidXBkYXRlU291cmNlU3Vic2NyaXB0aW9uIiwiZXFHQ1NUQVRFIiwibm90Q09NUExFVEVEIiwibm90R0NDT01QTEVURSIsInRlc3RWYWwiLCJhZGRQYXJlbnRTdHJlYW0iLCJwYXJlbnQkIiwicmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQiLCJhZGRDaGlsZFN0cmVhbSIsImNoaWxkJCIsInRyYWNlciIsImZpbmFsaXplIiwib25DaGlsZENvbXBsZXRlZCIsIm9uQ2hpbGREaXNwb3NlZCIsImNoaWxkQ29tcGxldGVkRGF0YSIsIngiLCJmaW5hbERlc3QiLCJ5IiwiZmluZE5hbWUiLCJvblN1YnNjcmliZVRvU291cmNlc05leHQiLCJvblN1YnNjcmliZVRvU291cmNlc0Vycm9yIiwib25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZSIsImVsJCIsInViZXJTb3VyY2UkIiwiYXV0b1N1YnNjcmliZXIkIiwiZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkIiwib2JzQ291bnQiLCJhdXRvTWVyZ2VTdWJqZWN0JCIsIm9ic0RhdGEiLCJicmFuY2hPYnNlcnZhYmxlJCIsImF1dG9DbG9zZXNCb29sIiwicmVsIiwic2VuZEV4dGVuZGVkU3RyZWFtcyIsImhhc2hBY3Rpb25TdHIiLCJvcGVuU3BpZ290IiwicmVuZGVyVmlldyIsInJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbSIsIm9uQmVmb3JlRGlzcG9zZSIsIm1zIiwibWV0aG9kRm4iLCJvbkNoaWxkRGlzcG9zZSIsIm9uUGFyZW50RGlzcG9zaW5nIiwiaXNJbnRlcm5hbCIsInNldEF0dGFjaERhdGEiLCJjaGVja1F1ZXJ5IiwiZ2V0UGFyZW50RWxzIiwiZ2V0RWxlbSIsInNldEF0dGFjaFBhcmVudERhdGEiLCJsZXZlbCIsImV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQiLCJjaGlsZFZpZXciLCJhcHBlbmRUb0RvbUFmdGVyIiwicHJlcGVuZFRvRG9tIiwiYXBwZW5kVmlldyIsImFwcGVuZFZpZXdBZnRlciIsImFwcGVuZFZpZXdUb1BhcmVudEVsIiwicHJlcGVuZFZpZXdUb1BhcmVudEVsIiwicHJlcGVuZFZpZXciLCJfcG9zdFJlbmRlcmVkQ2FsbGVkIiwiYmVmb3JlQWZ0ZXJSZW5kZXIiLCJhZnRlclJlbmRlciIsIm9uQW5pbUZyYW1lQWZ0ZXJSZW5kZXJlZCIsImJyb2FkY2FzdEV2ZW50cyIsImluaXRpYWxpemVDaGFubmVscyIsInZpZXdzU3RyZWFtQnJvYWRjYXN0ZXIiLCJwdWxsQWN0aW9uc0Zyb21MaXN0IiwibmVzdGVkQWN0aW9uc0FyciIsImNoZWNrRm9yRXhpc3RpbmdNZXRob2QiLCJGdW5jdGlvbiIsImRlbGF5Rm9yUHJveHlDaGFubmVsUmVzZXRzIiwic2V0RGF0YVZTSUQiLCJkb3duU3RyZWFtIiwic2tpcEZpcnN0IiwiYWRkQ2hhbm5lbCIsInNlbmREb3duU3RyZWFtIiwiZGlyZWN0aW9uQXJyIiwiaXNMb2NhbEV2ZW50Q2hlY2siLCJjaWRDaGVjayIsInBpcGVBcnIiLCJ1bnNoaWZ0Iiwic2tpcCIsImNoYW5uZWwkIiwiY2hlY2tJZkNoYW5uZWxFeGlzdHMiLCJjaGFubmVsRXhpc3RzIiwiZGVmYXVsdFRvQWN0aW9uIiwiZ2V0QWN0aW9uRm4iLCJDSEFOTkVMX1JPVVRFIiwiaXNEaXNwb3NlZCIsImNyZWF0ZUFjdGlvbkZpbHRlciIsInNlbGVjdG9ycyIsIml0ZW1FbCIsInRoaXNFbCIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJuIiwiZ2V0dGVyIiwiX19lc01vZHVsZSIsImRlZmluaXRpb24iLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyJdLCJzb3VyY2VSb290IjoiIn0=
|
|
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:()=>a});var s=r(2),n=r(9),o=r(131);class a extends s.c{constructor(e,t={disableSanitize:!1}){a.validateMapMethod(t,e),void 0!==t.map&&(t.mapFn=t.map),t.extendedActionsArr=[`${e}_RESPONSE_EVENT`,`${e}_ERROR_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),a=(0,o.allPass)([n,e=>e.length>=1]);return!(0,o.compose)(a,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_ERROR_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){const t=!0===e?.isChannelFetchError?`${this.props.name}_ERROR_EVENT`:`${this.props.name}_RESPONSE_EVENT`;return this.createChannelPayloadItem(e,t)}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=e?.payload??e?.viewStreamInfo?.payload??{};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","disableSanitize","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);const a=new WeakMap;class i{constructor(e,t,r,a,c,l){const d=e;l&&console.time(l);const E={channelName:e,action:t,srcElement:a,event:c};if(E.payload=i.deepFreeze(r),!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(d);i.validateAction(t,d,e)}E.clone=()=>(0,s.mergeAll)([{payload:(0,o.lE)(E.payload)},E.payload,{channel:(0,s.clone)(d)},{event:(0,s.clone)(c)},{srcElement:a},(0,s.clone)(E.srcElement),{action:(0,s.clone)(E.action)}]),E.safeClone=()=>{const e=(0,o.f0)(E.payload);return(0,s.mergeAll)([{payload:e},e,{channel:d},{event:c},{srcElement:a},E.srcElement,{action:E.action}])};const p={$dir:{get:()=>E._dir,set:e=>(E._dir=e,e)}};return"CHANNEL_ROUTE"===d&&(p.location={get:()=>i.getLocationData()}),E._dir=void 0,Object.defineProperties(E,p),l&&console.timeEnd(l),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 createReadOnlyProxyFacade(e){if(a.has(e))return a.get(e);const t=e=>(!0===n.M.debug&&console.warn(`Spyne Warning: blocked write of '${String(e)}' on read-only channel payload data; use e.safeClone() for a writable copy`),!0),r=new Proxy(e,{get(e,t){const r=e[t];return null!==r&&"object"==typeof r&&!0===r.__proxy__isProxy?i.createReadOnlyProxyFacade(r):r},set:(e,r)=>t(r),defineProperty:(e,r)=>t(r),deleteProperty:(e,r)=>t(r)});return a.set(e,r),r}static deepFreeze(e){const t=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));if(null!==e&&"object"==typeof e&&!0===e.__proxy__isProxy)return i.createReadOnlyProxyFacade(e);try{Object.getOwnPropertyNames(e).forEach(function(r){const s=e[r];if(Object.prototype.hasOwnProperty.call(e,r)&&!1===t(s)&&null!==s&&("object"==typeof s||"function"==typeof s)&&!Object.isFrozen(s)){const t=i.deepFreeze(s);t!==s&&(e[r]=t)}}),Object.freeze(e)}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),a=r(131),i=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,i.Ir)(()=>{!0!==(0,a.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:()=>E});var s=r(584),n=r(980),o=r(961),a=r(225),i=r(521),c=r(968),l=r(531),d=r(131);class E{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=a.M.channelsMap;const s=this.getMainObserver();this.checkForPersistentDataMode=E.checkForPersistentDataMode.bind(this),this.observer$=this.props.observer=s;const n=this.streamsController.getStream("DISPATCHER"),o=(0,d.propEq)(t.name,"name");n.pipe((0,l.filter)(o)).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 c.ReplaySubject(1):new c.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,a=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},safeClone:()=>{const e=(0,o.f0)(s);return(0,d.mergeAll)([{payload:e},e,{action:r},{srcElement:n},{event:t}])},action:r,payload:s,srcElement:n,event:t});return!0===t?(e=>e.observable.pipe((0,l.map)(a)).subscribe(this.getActionMethodForObservable(e)))(e):void 0}onViewStreamInfo(e){}sendChannelPayload(e,t,r={},s={},o=this.observer$){const a=new n.m(this.props.name,e,t,r,s);o.next(a)}getChannel(e,t){return(0,d.ifElse)(e=>(0,s.ns)().includes(e),r=>{const s=this.streamsController.getStream(r).observer;return s.source?s.source.channelName=e:s.channelName=e,void 0!==t?s.pipe((0,l.filter)(t)):s},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,l.take)(1)):r}return t?e.pipe((0,l.take)(1)):e});let s;if(t)s=(0,c.forkJoin)(r);else if(0===r.length)s=c.EMPTY;else if(1===r.length)s=r[0];else{const[e,...t]=r;s=e.pipe((0,l.combineLatestWith)(...t))}return s.pipe((0,l.map)(t=>{const r={};return e.forEach((e,s)=>{const n="string"==typeof e?e:`channel_${s}`;r[e?.source?.channelName||e?.source?.source?.channelName||n]=t[s]}),r}))}static checkForNotTrackFlag(e={}){!0===e.doNotTrack&&a.M.doNotTrackChannel(e.channelName)}}},584(e,t,r){r.d(t,{ns:()=>a});var s=r(225),n=r(131),o=r(968);const a=()=>({includes:()=>!0===s.M.initialized?s.M.listRegisteredChannels():["CHANNEL_ROUTE","CHANNEL_UI","CHANNEL_WINDOW","DISPATCHER"]}),i=["LOAD","RENDER","MOUNT","UNMOUNT","DISPOSE","GARBAGE_COLLECT","UPDATE"],c=["parent","self","child","children","view"],l=["Observable","BehaviorSubject","Subject","Observer","Subscriber","FromEventObservable"],d=["subscribe","combineLatest"];let E=[],p=[],h=null,u=null,N=null,m=null,_=null,T=null,A=null;if(void 0!==n.compose&&void 0!==o.Observable){E=[{error:`need to match a valid name within ${l}`,predicate:e=>a().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=>d.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 ${l}`,predicate:e=>a().includes(e.name)},{error:`needs one of the following step strings: ${i}`,predicate:e=>i.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}];N=function(){return[].concat(e)},m=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)},_=function(){return[{error:"UPDATE STEP requires a data object ",predicate:e=>"UPDATE"===e.STEP&&void 0!==e.data}].concat(e)},u=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=>a().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>l.includes((0,e.observable)().constructor.name)},{error:"param action must be a registered action",predicate:e=>d.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:()=>p});var s=r(68),n=r(303),o=r(597),a=r(205),i=r(59),c=r(968),l=r(683),d=r(131);const E=new Map;class p{constructor(){this.addMixins(),E.set("DISPATCHER",new c.Subject),this.listRegisteredChannels=p.listRegisteredChannels.bind(this),this.getChannelsList=p.getChannelsList.bind(this)}get map(){return E}static getChannelsList(){return Array.from(E,(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,E.set("CHANNEL_ROUTE",this.routeStream),this.uiStream=new n.z,E.set("CHANNEL_UI",this.uiStream),this.domStream=new o.x,E.set("CHANNEL_WINDOW",this.domStream),this.viewStreamLifecycle=new a.b,E.set("CHANNEL_LIFECYCLE",this.viewStreamLifecycle),this.aiStream=new i.$,E.set("CHANNEL_AI",this.aiStream),this.routeStream.initializeStream(),this.domStream.initializeStream()}addKeyEvent(e){E.get("UI").addKeyEvent(e)}registerStream(e){const t=e.channelName;E.has(t)&&(0,d.compose)((0,d.pathEq)(["props","isRegistered"],!0))(E.get(t))?console.warn(`Spyne Warning: The Channel, ${t}, has already been registered!`):(E.set(t,e),e.initializeStream())}getChannelActions(e){return E.get(e).addRegisteredActions()}getProxySubject(e,t=!1){const r=!0===t?"replaySubject":"subject";return E.get(e)[r]}testStream(e){return void 0!==E.get(e)}getStream(e){return!1===this.testStream(e)&&E.set(e,new l.w(e)),E.get(e)}addMixins(){}}},59(e,t,r){r.d(t,{$:()=>n});var s=r(2);class n extends s.c{constructor(e={}){super("CHANNEL_AI",e)}addRegisteredActions(){return["CHANNEL_AI_RENDERED_EVENT","CHANNEL_AI_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)}}},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:()=>d});var s=r(2),n=r(511),o=r(167),a=r(225),i=r(968),c=r(531),l=r(131);class d 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 i.ReplaySubject(1),this.observer$=this.navToStream$.pipe((0,c.map)(e=>this.onMapNext(e))),this.compareRouteKeywords=o.H.compareRouteKeywords()}checkConfigForHash(){!0==("hash"===a.M.config.channels.ROUTE.type)&&(a.M.config.channels.ROUTE.type="slash",a.M.config.channels.ROUTE.isHash=!0)}onRegistered(){this.checkConfigForHash(),this.initStream()}createChannelActionsObj(){const e=this.addRegisteredActions(),t=(0,l.mergeAll)((0,l.chain)(e=>(0,l.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,l.pick)(["isHash","isHidden","routes","type"],e.payload);a.M.config.channels.ROUTE=(0,l.mergeRight)(a.M.config.channels.ROUTE,t),a.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=a.M.config,t=(0,l.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 i.ReplaySubject(1),this.onIncomingDomEvent(void 0,this.routeConfigJson,"CHANNEL_ROUTE_DEEPLINK_EVENT"),o.H.createPopStateStream(this.onIncomingDomEvent.bind(this)),this.observer$=(0,i.merge)(this.firstLoadStream$,this.navToStream$)}onMapNext(e,t=!1){return e.action="CHANNEL_ROUTE_CHANGE_EVENT",e}static removeSSID(e){const t=(0,l.lensProp)(["routeData"]);return(0,l.over)(t,(0,l.omit)(["vsid"]))(e)}static onIncomingDomEvent(e,t=this.routeConfigJson,r){const s=void 0!==r?r:this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT,n=(0,l.path)(["state","routeCount"],e),o=!0===(0,l.is)(Number,n);let a=this.getDataFromString(t,o);!0===o&&(a.routeCount=n),"CHANNEL_ROUTE_DEEPLINK_EVENT"===r&&(a.navLinks=(0,l.prop)("routeDatasetsArr",t),Object.defineProperty(a,"linksData",{get(){return this.navLinks},set(e){console.warn("set links data is deprecated in ROUTE DEEPLINK DATA, use navLinks")},enumerable:!0}));const i=this.compareRouteKeywords.compare(a.routeData,a.paths);a=(0,l.mergeRight)(a,i),this.sendChannelPayload(s,a,void 0,e,this.navToStream$)}static checkForRouteParamsOverrides(e){return e}static checkForEventMethods(e){const t=(0,l.compose)((0,l.filter)((0,l.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),l.keys,(0,l.prop)("payload"))(e);if(t.length>=1){const r=(0,l.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,l.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,l.compose)((0,l.equals)("true"),(0,l.path)(["payload","endRoute"]))(e))return e;const s=void 0!==r?r:!0===a.M.debug,{payload:n}=e;let o=0;const i=(e=[],t)=>{const r=t[1],{routePath:a}=r,c=(0,l.prop)("routeName",a),d=(e=>{const t=(0,l.prop)("routeName",e);if(t){const r=(0,l.compose)(l.keys,(0,l.omit)(["routeName"]))(e),s=n[t],o=e=>new RegExp(`^${e}$`).test(s);return(0,l.find)(o,r)}})(a),E=(0,l.is)(Object,r),p=(0,l.is)(Array,r);if(o+=1,!0===E&&!1===p){const t=a[d];t?(0,l.compose)(l.reverse,(0,l.reduce)(i,e),l.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,d=(0,l.compose)(l.reverse,(0,l.reduce)(i,[]),l.toPairs)({routes:c});if(1===d.length){const t=d[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),d.checkForEventMethods(e),e=this.checkForEndRoute(e);let r=this.getDataFromParams(e);const s=(0,l.prop)("srcElement",e),n=(0,l.prop)("event",e),o=!r.isHidden,a=this.compareRouteKeywords.compare(r.routeData,r.paths);r=(0,l.mergeRight)(r,a),this.sendRouteStream(r,o),r=d.removeSSID(r),this.sendChannelPayload(t,r,s,n,this.navToStream$)}static checkAndConvertStrWithRegexTokens(e,t){return(0,l.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,l.prop)("payload",e);const s=this.getRouteStrFromParams(r,t),o=(e,r)=>(0,l.defaultTo)(r,(0,l.prop)(e,t)),a=o("type","slash"),i=o("isHash",!1),c=n.Q.formatStrAsWindowLocation(s),d=this.getDataFromLocationStr(a,i,c),{pathInnermost:E,paths:p}=d;r=(0,l.mergeRight)(d.routeData,r);const{routeCount:h,isDeepLink:u,isHash:N,isHistory:m,isHidden:_,routeType:T}=this.getExtraPayloadParams(t);return{isDeepLink:u,routeCount:h,pathInnermost:E,paths:p,routeData:r,routeValue:s,isHash:N,isHidden:_,isHistory:m,routeType:T}}static getDataFromString(e=this.routeConfigJson,t=!1){const r=e.type,s=!0===e.isHash,o=n.Q.getLocationStrByType(r,s),{paths:a,pathInnermost:i,routeData:c,routeValue:l}=d.getParamsFromRouteStr(o,e,r),{routeCount:E,isDeepLink:p,isHash:h,routeType:u,isHidden:N}=this.getExtraPayloadParams(e,t);return{isDeepLink:p,routeCount:E,pathInnermost:i,paths:a,routeData:c,routeValue:l,isHash:h,isHidden:N,isHistory:t,routeType:u}}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:a,pathInnermost:i,routeData:c,routeValue:l}=this.getParamsFromRouteStr(o,this.routeConfigJson,s);return{paths:a,pathInnermost:i,routeData:c,routeValue:l,action:this.getRouteState()}}static getLocationData(){return(0,l.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,l.isEmpty)(e);return!0==(!0===r&&!1===t)||!0==(!0===r&&!0===t)?"/":!0==(!1===r&&!0===t)?(0,l.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=d.removeLastSlash(window.location.pathname)+r,window.history.pushState({routeCount:n},"",r);else{const e=(0,l.when)((0,l.compose)((0,l.complement)((0,l.equals)("/")),l.head),(0,l.concat)("/",l.__));window.history.pushState({routeCount:n},"",e(r))}}getWindowLocation(){return window.location.pathname}bindStaticMethods(){this.checkForEndRoute=d.checkForEndRoute.bind(this),this.getIsDeepLinkBool=d.getIsDeepLinkBool.bind(this),this.getDataFromLocationStr=d.getDataFromLocationStr.bind(this),this.onIncomingDomEvent=d.onIncomingDomEvent.bind(this),this.getDataFromString=d.getDataFromString.bind(this),this.getParamsFromRouteStr=d.getParamsFromRouteStr.bind(this),this.getLocationData=d.getLocationData.bind(this),this.getRouteState=d.getRouteState.bind(this),this.getDataFromParams=d.getDataFromParams.bind(this),this.getRouteCount=d.getRouteCount.bind(this),this.getExtraPayloadParams=d.getExtraPayloadParams.bind(this),this.bindStaticMethodsWithConfigData()}bindStaticMethodsWithConfigData(){const e=(0,l.curryN)(3,d.getRouteStrFromParams);this.getRouteStrFromParams=e(l.__,this.routeConfigJson,this.routeConfigJson.type)}}},303(e,t,r){r.d(t,{z:()=>c});var s=r(2),n=r(968),o=r(531),a=r(131),i=r(672);class c 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,a.lensProp)(["payload"]);return(0,a.over)(t,(0,a.omit)(["vsid"]))(e)}onIncomingObservable(e){const t=(0,a.equals)(e.name,this.props.name);e.data=c.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,a.path)(["event","type"]),r=(0,a.path)(["event","typeOverRide"]),s=(0,a.compose)(a.toUpper,(0,a.either)(r,t))(e),n="CHANNEL_UI";return void 0!==s?`${n}_${s}_EVENT`:n}static checkForEventMethods(e){const t=(0,a.compose)((0,a.filter)((0,a.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),a.keys,(0,a.prop)("payload"))(e);if(t.length>=1){const r=(0,a.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,a.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,c.checkForEventMethods(e),e.action=this.getActionState(e);const t=e.action,{payload:r,srcElement:s}=e,n=e.event;(0,i.v8)(n?.target),this.sendChannelPayload(t,r,s,n)}}},597(e,t,r){r.d(t,{x:()=>p});var s=r(2),n=r(64),o=r(225),a=r(432),i=r(968),c=r(531),l=r(131),d=r(907);const E=[];class p 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,i.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,l.curry)(p.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,l.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,l.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,l.pick)(["matches","media","mediaQueryName"],e),srcElement:e.srcElement,event:e}}createMouseWheelObservable(e){const t=e.debounceMSTimeForScroll;return a.Y.createDomObservableFromEvent("wheel",p.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(p.getScrollY(n)),{scrollDistance:a}=o;return{action:r,payload:o,srcElement:e.srcElement,scrollDistance:a,event:e}}createScrollObservable(e,t=window,r=!0){const s=e.debounceMSTimeForScroll,n=t,o=t===window,i=void 0!==e.scrollElForVals?e.scrollElForVals:t,d=o?"CHANNEL_WINDOW_SCROLL_EVENT":"CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT",E=p.getScrollData(),h=(0,l.partialRight)(p.getScrollMapFn,[d,E,i,r,n]).bind(this);return a.Y.createDomObservableFromEvent("scroll",h,r,n).pipe((0,c.debounceTime)(s),(0,c.skipWhile)(e=>0===e.scrollDistance),(0,c.map)(e=>{const t=p.getScrollY(n);return e.payload.scrollDistanceAbs=Math.abs(this.currentScrollY-t),this.currentScrollY=t,e}))}createOrientationObservable(e){return a.Y.createDomObservableFromEvent("orientationchange",p.getOrientationMapFn.bind(this))}createResizeObservable(e){const t=e.debounceMSTimeForResize;return a.Y.createDomObservableFromEvent("resize",p.getResizeMapFn.bind(this)).pipe((0,c.debounceTime)(t))}getEventsFromConfig(e=this.domChannelConfig){const t=e.events,r=Array.isArray(e.customEvents)?e.customEvents.map(p.conformCustomEventConfig).filter(e=>null!==e):[];r.forEach(e=>this.updateChannelActions(e.name));const s=e=>{const t=p.createCurriedGenericEvent(e);return a.Y.createDomObservableFromEvent(e,t)};return(0,l.map)(s,t).concat((0,l.map)(({name:e,operator:t,value:r})=>{const n=s(e);return void 0===t?n:p.customizeCustomEventObservable(n,t,r)},r))}static conformCustomEventConfig(e){if("string"==typeof e)return{name:e,operator:void 0,value:void 0};if(null!==e&&"object"==typeof e&&"string"==typeof e.name){const t=["buffer","count","debounce","throttle"].filter(t=>void 0!==e[t]),r=t[0];return t.length>1&&!0===o.M.debug&&console.warn(`Spyne Warning: the customEvent, ${e.name}, sets multiple operators (${t.join(", ")}); using ${r}.`),{name:e.name,operator:r,value:void 0!==r?e[r]:void 0}}return console.warn(`Spyne Warning: the following config.customEvents entry is not a string or a {name} object and was skipped: ${JSON.stringify(e)}`),null}static customizeCustomEventObservable(e,t,r){switch(t){case"buffer":return e.pipe((0,c.buffer)(e.pipe((0,c.debounceTime)(r))),(0,c.filter)(e=>e.length>0),(0,c.map)(p.mapBatchedEvents));case"count":return e.pipe((0,c.bufferCount)(r),(0,c.map)(p.mapBatchedEvents));case"debounce":return e.pipe((0,c.debounceTime)(r));case"throttle":return e.pipe((0,c.throttleTime)(r));default:return e}}static mapBatchedEvents(e){const t=e[e.length-1],{action:r,srcElement:s,event:n}=t;return{action:r,payload:{detail:e.map(e=>void 0!==e.event&&null!==e.event?e.event.detail:void 0),isBatch:!0,batchCount:e.length},srcElement:s,event:n}}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,l.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,l.apply)(i.merge,t).pipe((0,c.map)(this.getMediaQueryMapFn.bind(this)))}updateChannelActions(e){if("string"!=typeof e)return;const t=`CHANNEL_WINDOW_${e.toUpperCase()}_EVENT`;E.push(t)}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"].concat(E)}onScrollLockEvent(e){}onSetElementToScroll(e){let{config:t,el:r,scrollElement:s}=e.payload;t=t||{},t=(0,d.$)(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=a.Y.createMediaQueryHandler.bind(this),this.createMergedObsFromObj=a.Y.createMergedObsFromObj.bind(this)}}},713(e,t,r){r.d(t,{D:()=>E});var s=r(470),n=r(173),o=r(167),a=r(225),i=r(49),c=r(672);const l=new s.H,d="0.26.0";let E=new class{constructor(){this.version=d}get channels(){return l}init(e={},t=!1){if(!0===a.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,mode:"app",disableSanitize:!1,iframes:{},anchors:{},customElements:[],baseHref:void 0,IMG_PATH:"undefined"!=typeof IMG_PATH?IMG_PATH:void 0,pluginMethods:{},plugins:{},tmp:{},ephemeralProps:{},tmpProps:{},channels:{WINDOW:{mediaQueries:{},events:[],customEvents:[],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=a.M.initialize(r,e,l,t)}this.pluginsFn=a.M.getPluginsMethodObj(e.pluginMethods),this.getChannelActions=e=>l.getChannelActions(e),this.registerChannel=e=>l.registerStream(e),this.registerPlugin=e=>a.M.registerPlugin(e),this.registerDataChannel=e=>l.registerStream(e),this.listChannels=()=>Array.from(l.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;",l.init(),!0===a.M.config.debug&&(window.Spyne={version:d}),(0,i.D)(a.M.config),(0,c.oG)(a.M.config)}static listChannels(){return Array.from(l.map.keys())}static getChannelActions(e){return l.getChannelActions(e)}static registerChannel(e){if(!1!==a.M.initialized)return l.registerStream(e);console.warn("Spyne has not been initialized")}}},930(e,t,r){r.d(t,{V:()=>i});var s=r(192),n=r(225),o=r(131);let a=n.M;class i{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=i.mergeDefaultConfig(r,this.defaultConfig()),this.props.parentEl=s||i.createParentEl(),this.props.config=r,void 0!==this.props.traits&&this.addTraits(this.props.traits)}register(e){a=e,this.props.pluginName=this.props.name,!1!==a.initialized?(this.onBeforeRegistered(),this.props.config=(0,o.clone)(this.props.config),a.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 a}static mergeDefaultConfig(e={},t=this.defaultConfig()){return Object.assign(t,e)}static getSpyneApp(e,t){!1===a.initialized?console.warn(`Spyne Warning: Unable to install plugin, ${e}! SpyneApp has not been initialized!`):a.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=this.props.requiredCustomEvents??[],r=n.M.getChannelConfig("WINDOW"),s=e.filter(e=>!r.events.includes(e)),o=e=>"string"==typeof e?e:e?.name,a=r.customEvents.map(o),i=t.filter(e=>!a.includes(o(e)));if(s.length>0&&console.warn(`plugin "${this.props.name}" requires the following config.WINDOW.events, --\x3e ${s.join(", ")} <--`),i.length>0){const e=e=>"string"==typeof e?`'${e}'`:JSON.stringify(e);console.warn(`plugin "${this.props.name}" requires the following config.WINDOW.customEvents, --\x3e ${i.map(e).join(", ")} <--`)}}defaultConfig(){return{}}onRegistered(){}onRender(){}}},9(e,t,r){r.d(t,{G:()=>c});var s=r(968),n=r(531),o=r(131),a=r(672),i=r(950);class c{constructor(e={},t,r,s){this._mapFn=c.setMapFn(e),this._url=c.setUrl(e),this._responseType=c.setResponseType(e),this._serverOptions=c.setServerOptions(e),this._subscriber=void 0!==t?t:e=>console.log("FETCH RETURNED ",e),this.debug=!0===e?.debug,this.disableSanitize=!0===e?.disableSanitize,this.channelName=s;const n={mapFn:this.mapFn,url:this.url,serverOptions:this.serverOptions,responseType:this.responseType,disableSanitize:this.disableSanitize,debug:this.debug};!0!==r&&c.startWindowFetch(n,this._subscriber,this.channelName)}static startWindowFetch(e,t,r){const{mapFn:o,url:i,serverOptions:l,responseType:d,debug:E}=e,p={channelName:r,url:i,responseType:d,serverOptions:l},h=!0===E?(0,n.tap)(e=>{console.log("DEBUG FETCH :",e,p)}):(0,n.tap)(()=>{});var u;(0,s.from)(window.fetch(i,l)).pipe((0,n.mergeMap)(e=>(0,s.from)(c.parseResponse(e,p))),h,(0,n.map)((u=o,t=>{const r=!0===e?.disableSanitize?t:(0,a.Ay)(t,{mode:"app"});return u(r,p)})),(0,n.catchError)(e=>(0,s.of)(c.createFetchErrorPayload(e,p))),(0,n.share)()).subscribe(t)}static async parseResponse(e,t){const{responseType:r}=t,s=e.status,n=e.statusText,o=e.headers?.get?.("content-type")||"",a={...t,status:s,statusText:n,contentType:o,ok:e.ok};if(!0!==e.ok){const t=await c.safeReadText(e);throw c.createFetchError({errorType:"FETCH_HTTP_ERROR",message:`Fetch request failed with status ${s} ${n}`,metadata:a,rawBody:t})}if("json"===r)return c.parseJsonResponse(e,a);if("text"===r)return e.text();if("blob"===r)return e.blob();if("arrayBuffer"===r)return e.arrayBuffer();if("formData"===r)return e.formData();throw c.createFetchError({errorType:"FETCH_UNSUPPORTED_RESPONSE_TYPE",message:`Unsupported fetch responseType "${r}"`,metadata:a})}static async parseJsonResponse(e,t){const r=await e.text(),s=r.trim();if(""===s)return null;try{return JSON.parse(s)}catch(e){throw c.createFetchError({errorType:"FETCH_RESPONSE_PARSE_ERROR",message:"Expected JSON but could not parse response body.",metadata:t,rawBody:r,originalError:e})}}static createFetchError({errorType:e,message:t,metadata:r,rawBody:s="",originalError:n}){const o=new Error(t);return o.isChannelFetchError=!0,o.errorType=e,o.metadata=r,o.rawBody=s,o.originalError=n,o}static createFetchErrorPayload(e,t){const r=e?.metadata||t||{};return{isChannelFetchError:!0,isError:!0,error:!0,errorType:e?.errorType||"FETCH_UNKNOWN_ERROR",message:e?.message||"Unknown ChannelFetchUtil error",channelName:r.channelName,url:r.url,responseType:r.responseType,status:r.status,statusText:r.statusText,contentType:r.contentType,ok:r.ok,rawBodyPreview:c.truncateBody(e?.rawBody),originalErrorMessage:e?.originalError?.message}}static truncateBody(e="",t=500){return"string"!=typeof e?"":e.length>t?`${e.slice(0,t)}...`:e}static async safeReadText(e){try{return await e.text()}catch(e){return""}}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&&(0,i.q)("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){const t=e?.body;if(!0!=(null!==t&&"object"==typeof t&&t.constructor===Object))return e;const r=new Headers(e.headers||{});return!0!==r.has("Content-Type")&&r.set("Content-Type","application/json"),{...e,headers:r,body:JSON.stringify(t)}}static updateMethodWhenBodyExists(e){return void 0!==e?.body&&"GET"===(e?.method||"GET").toUpperCase()?((0,i.q)("SPYNE WARNING: Fetch body was provided with method GET. Changing method to POST.",e),{...e,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)(c.baseOptions(),t);return r=c.updateMethodWhenBodyExists(r),r=c.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",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)),a=(0,s.compose)(s.not,s.isEmpty),i=(0,s.allPass)([(0,s.is)(String),a]),c=(0,s.allPass)([(0,s.is)(Array),a]),l=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)])),d=(0,s.compose)((0,s.allPass)([a,o,(0,s.is)(Object)]));class E{constructor(e,t={},r,o){l(e)&&(t=e,e=(0,s.prop)("selector",t),o=o||(0,s.prop)("testMode",t));const a=[r,(0,s.prop)("debugLabel",t)];r=(0,s.compose)((0,s.find)((0,s.is)(String)))(a);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,u=i(e)?E.filterSelector([e],r):void 0,N=c(e)?E.filterSelector(e,r):void 0,m=d(h)?E.filterData(h,r):void 0;let _=(0,s.reject)(s.isNil,[u,N,m]);const T=(0,s.isEmpty)(_);return T&&(_=[(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)(_)}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)||l(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:o,srcElement:a,event:i}=r||{},c=[a,o,(0,s.prop)("srcElement",i),r].reduce((e,t)=>{if(void 0!==e)return e;const r=(0,s.prop)("el",t);return E.elIsDomElement(r)&&(e=r),e},void 0),l=null!==c&&"object"==typeof c&&"function"==typeof c.matches,d=l?(0,s.map)(e=>{try{return c.matches(e)}catch(t){return!0===n.M.debug&&console.warn(`Spyne Warning: The ChannelPayloadFilter selector, ${e}, is not a valid css selector!`),!1}},e):[];if(void 0!==t){const r=e;console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${t}"] - selectors: `,"color:orange;",{el:c,selectorsArr:r,nodeArrResultsDebugger:d})}return!1!==l&&!0!==(0,s.isEmpty)(d)&&(0,s.any)((0,s.equals)(!0),d)}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)?a((r=e,Array.isArray(r)?[]:{}),e,t):e;var r}function o(e,t,r){const o=e.slice();return t.forEach(function(t,i){void 0===o[i]?o[i]=n(t,r):s(t)?o[i]=a(e[i],t,r):-1===e.indexOf(t)&&o.push(n(t,r))}),o}function a(e,t,r){const i=Array.isArray(t),c=(r||{arrayMerge:o}).arrayMerge||o;return i?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(i){s(t[i])&&e[i]?o[i]=a(e[i],t[i],r):o[i]=n(t[i],r)}),o}(e,t,r)}r.d(t,{$:()=>a}),a.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 a(e,r,t)})}},64(e,t,r){r.d(t,{FZ:()=>a,Ir:()=>n,Lx:()=>i,OZ:()=>o,RK:()=>c,V0:()=>l});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])},a=(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)),i=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 l(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)),a=n(Object.getOwnPropertyNames(e.constructor));return{methods:o,staticMethods:a,allMethods:(0,s.concat)(o,a)}}},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,a=new s.A({id:n,name:r,data:t});a.onRendered=()=>{a.sendInfoToChannel("CHANNEL_ROUTE",o)},a.afterBroadcastEvents=()=>{a.disposeViewStream()},a.appendToNull()}}},961(e,t,r){r.d(t,{Ek:()=>d,Hy:()=>E,WD:()=>c,f0:()=>a,lE:()=>p,pt:()=>l});var s=r(131),n=r(225);const o=(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:a,__proxy__props:i}=o;return a?t(r,i):r},o=n((0,s.clone)(e),[]),a=(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),i=[...r];i.push(t),"object"!==o&&"array"!==o||(e[t]=n(s,i),a(s,i))})};return a(o),o})(e,r)}},a=function(e,t=new WeakSet){if(null===e||"object"!=typeof e)return e;const r=o(e);if(void 0!==r)return r;if(t.has(e))return e;if(t.add(e),Array.isArray(e))return e.map(e=>a(e,t));const s={};return Object.entries(e).forEach(([e,r])=>{s[e]=a(r,t)}),s},i=(e,t)=>{const r=e?.__proxy__proxyName;if(void 0===r)return t;const s=n.M.getProxyReviver(r);return"function"!=typeof s?t:s(t,e.__proxy__props)},c=function(e,t){return i(e,e.filter(t))},l=function(e,t){return i(e,e.filter((e,r)=>!1===t(e,r)))},d=function(e,t){const r=e.map((e,r)=>{const s=null!==e&&"object"==typeof e&&void 0!==e.__proxy__proxyName;return t(s?a(e):e,r)});return i(e,r)},E=function(e,t={}){const r=a(e);return Object.entries(t).forEach(([e,t])=>{r[e]=t}),r},p=function(e,t=!1){const r=o(e);if(void 0!==r)return r;if(!0===t)return a(e);const n=(0,s.is)(Array),i=(0,s.is)(Object);var c;return!1===n(c=e)&&!0===i(c)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}},672(e,t,r){r.d(t,{Ay:()=>x,Wh:()=>M,Zy:()=>W,o$:()=>N,oG:()=>w,tT:()=>m,v8:()=>$});var s=r(636),n=r.n(s),o=r(950),a=r(225);let i,c=!1,l=!1;const d=/^(?:(?:https?|mailto|tel):|data:image\/|(?![a-z][a-z0-9+.-]*:)[\s\S]*$)/i,E=e=>String(e).replace(/[\u0000-\u0020]/g,""),p=e=>d.test(E(e)),h=/^spyne-[a-z][a-z0-9-]*$/i,u=[],N=(e=[])=>{(Array.isArray(e)?e:[e]).forEach(e=>{if(e instanceof RegExp)return void u.push(e);const t=String(e).toLowerCase();!0===/^[a-z][a-z0-9]*-[a-z0-9-]+$/.test(t)?u.push(t):(0,o.q)(`SPYNE WARNING: "${e}" is not a valid custom element name (a hyphen is required) and was not added to the sanitizer allowlist.`)})},m={tagNameCheck:e=>!!h.test(e)||u.some(t=>t instanceof RegExp?t.test(e):t===e),attributeNameCheck:/^data-[a-z0-9-]+$/i,allowCustomizedBuiltInElements:!1},_={ALLOWED_TAGS:["a","b","i","em","strong","u","p","br","ul","dl","dt","dd","ol","li","hr","blockquote","pre","code","span","div","section","article","aside","header","footer","h1","h2","h3","h4","h5","h6","table","thead","tbody","tr","td","th","img","figure","figcaption","video","source","iframe","input","button","label","link"],ADD_TAGS:["iframe","input","button","link"],ALLOWED_ATTR:["href","src","alt","class","title","width","height","style","target","rel","controls","poster","type","rows","cols","sandbox"],ALLOW_DATA_ATTR:!0,FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","onchange"],FORBID_TAGS:["script","object","embed","meta"],ALLOWED_URI_REGEXP:d,CUSTOM_ELEMENT_HANDLING:m},T={FORBID_TAGS:["script","iframe","object","embed","form","input","button","link","meta"],FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","onchange"],ALLOW_DATA_ATTR:!1,ALLOWED_URI_REGEXP:d,CUSTOM_ELEMENT_HANDLING:m};let A={allow:void 0,allowedOrigins:[],sandbox:"allow-scripts allow-same-origin allow-popups"},C=A;const g=e=>e?{allow:void 0!==e.allow?e.allow:A.allow,allowedOrigins:void 0!==e.allowedOrigins?e.allowedOrigins:A.allowedOrigins,sandbox:void 0!==e.sandbox?e.sandbox:A.sandbox}:A,f=(e,t=C)=>{const r=E(e);let s;try{s=new URL(r,window.location.href)}catch(e){return!1}if(s.origin===window.location.origin&&"null"!==s.origin)return!0;var n;if(!0!==("https:"===s.protocol||"http:"===s.protocol&&("localhost"===(n=s.hostname)||"127.0.0.1"===n||"[::1]"===n||n.endsWith(".localhost"))))return!1;const o=t.allowedOrigins;return!Array.isArray(o)||0===o.length||o.some(e=>{try{return new URL(e).origin===s.origin}catch(e){return!1}})};let y=!1;const S=["_self","_parent","_top"];let I={allowTarget:!0,addNoopener:!0,allowedDomains:[]},b=I;const L=e=>e?{allowTarget:void 0!==e.allowTarget?!0===e.allowTarget:I.allowTarget,addNoopener:void 0!==e.addNoopener?!0===e.addNoopener:I.addNoopener,allowedDomains:void 0!==e.allowedDomains?e.allowedDomains:I.allowedDomains}:I,O=(e,t=b)=>{const r=E(e);if(/^(mailto|tel):/i.test(r))return!0;let s;try{s=new URL(r,window.location.href)}catch(e){return!1}if(s.origin===window.location.origin&&"null"!==s.origin)return!0;if(!0!==/^https?:$/.test(s.protocol))return!1;const n=t.allowedDomains;return!Array.isArray(n)||0===n.length||n.some(e=>{try{return new URL(e).origin===s.origin}catch(e){return!1}})},v=e=>{const t=e.getAttribute("rel")||"",r=new Set(t.split(/\s+/).filter(Boolean));r.add("noopener"),r.add("noreferrer"),e.setAttribute("rel",Array.from(r).join(" "))};let D=!1;const R=["richtext","authoring","development"],H=()=>{const e=a.M?.mode;return R.includes(e)?"richtext":"app"},P=e=>{const t="richtext"===e?_:T,r=((e,t=C)=>void 0===t.allow?"richtext"===e:!0===t.allow)(e);if("richtext"===e&&!0!==r)return{...t,ALLOWED_TAGS:t.ALLOWED_TAGS.filter(e=>"iframe"!==e),ADD_TAGS:t.ADD_TAGS.filter(e=>"iframe"!==e),FORBID_TAGS:[...t.FORBID_TAGS,"iframe"]};if("app"===e){const e={...t},s=[];return!0===r&&(e.FORBID_TAGS=t.FORBID_TAGS.filter(e=>"iframe"!==e),e.ADD_TAGS=["iframe"],s.push("sandbox")),!0===b.allowTarget&&s.push("target","rel"),s.length>0&&(e.ADD_ATTR=s),e}return t};function V(e="app"){const t=P(e);return e=>n().sanitize(e,t)}const w=(e={})=>{if(c)return void(0,o.q)("sanitizeData is already configured. Reconfiguration is not allowed.");const{strict:t=!1,disableSanitize:r=!1,iframes:s,customElements:a,anchors:d,allowTargetAttr:E,addNoopener:p}=e;l=!0===r,void 0!==a&&N(a),s&&"object"==typeof s&&(A=g(s),C=A),I=L({allowTarget:void 0!==d?.allowTarget?d.allowTarget:E,addNoopener:void 0!==d?.addNoopener?d.addNoopener:p,allowedDomains:d?.allowedDomains}),b=I,l?console.warn("SPYNE SECURITY WARNING: All data sanitization is DISABLED via config.disableSanitize. Do not use this setting in production."):(y||(y=!0,n().addHook("afterSanitizeAttributes",e=>{if(!e||"IFRAME"!==e.tagName)return;const t=e.getAttribute("src")||"";""!==t&&!0!==f(t)&&((0,o.q)(`SPYNE WARNING: iframe src "${t}" was removed by the iframe policy (same-origin, https, or an allowed origin is required).`),e.removeAttribute("src"));const{sandbox:r}=C;!1!==r&&!0!==e.hasAttribute("sandbox")&&e.setAttribute("sandbox",r)})),D||(D=!0,n().addHook("afterSanitizeAttributes",e=>{if(!e||"function"!=typeof e.getAttribute)return;if("A"!==e.tagName)return;const t=b,r=e.getAttribute("href");r&&t.allowedDomains.length>0&&!0!==O(r,t)&&((0,o.q)(`SPYNE WARNING: anchor href "${r}" was removed by the anchor policy (same-origin or an allowed domain is required).`),e.removeAttribute("href"));const s=e.getAttribute("target");s&&(!0===t.allowTarget&&e.getAttribute("href")?!0!==S.includes(s)&&!0===t.addNoopener&&v(e):e.removeAttribute("target"))})));const h=e=>{const t=V(e),r=e=>{if(Array.isArray(e))return e.map(r);if(e&&"object"==typeof e){const s={};for(const[n,o]of Object.entries(e))s[n]="string"==typeof o?t(o):r(o);return s}return"string"==typeof e?t(e):e};return r};i=(e,r={})=>{const{disableSanitize:s=!1,mode:n,iframes:o,anchors:a}=r;if(l||s)return e;const i=n||(t?"app":H());C=g(o),b=L(a);try{return h(i)(e)}finally{C=A,b=I}},w.sanitizeDataForce=(e,t)=>{if(l)return e;const r=t||H();return h(r)(e)},c=!0},U=["href","src","action","formaction","ping","poster","cite","codebase","manifest","icon","background"],M=(e,t,r)=>{if(l)return{allowed:!0,value:t};const s=String(e).toLowerCase(),o=String(r||"").toUpperCase();if(s.startsWith("on"))return{allowed:!1,value:t};if("srcdoc"===s){const e=P(H());return{allowed:!0,value:n().sanitize(String(t),e)}}return"IFRAME"===o&&"src"===s?{allowed:f(t,A),value:t}:"A"===o&&"href"===s?!0!==p(t)||I.allowedDomains.length>0&&!0!==O(t,I)?{allowed:!1,value:t}:{allowed:!0,value:t}:U.includes(s)&&!0!==p(t)?{allowed:!1,value:t}:{allowed:!0,value:t}},W=e=>{if(l||!e)return e;if("IFRAME"===e.tagName){const{sandbox:t}=A;!1!==t&&!0!==e.hasAttribute("sandbox")&&e.setAttribute("sandbox",t)}if("A"===e.tagName){const t=I,r=e.getAttribute("target");r&&(!0===t.allowTarget&&e.getAttribute("href")?!0!==S.includes(r)&&!0===t.addNoopener&&v(e):e.removeAttribute("target"))}return e},$=(e,t)=>{if(!e||l)return;const r=V(t||H()),s=/<(?:script|object|embed|form|input|button|link|meta)[^>]*>|on\w+=|javascript:/i;if("string"==typeof e.value&&s.test(e.value)){const t=r(e.value);t!==e.value&&(e.value=t)}if(e.isContentEditable&&"string"==typeof e.innerHTML&&s.test(e.innerHTML)){const t=r(e.innerHTML);t!==e.innerHTML&&(e.innerHTML=t)}},x=(e,t={})=>{if(!c)throw new Error("sanitizeData is not configured. Call sanitizeDataConfigure() first.");return i(e,t)}},49(e,t,r){r.d(t,{A:()=>d,D:()=>l});var s=r(636),n=r.n(s),o=r(950),a=r(672);let i,c=!1;const l=(e={})=>{if(c)return void(0,o.q)("sanitizeHTML is already configured. Reconfiguration is not allowed.");const{strict:t=!1,mode:r="app",disableSanitize:s=!1,allowTargetAttr:l=!0,debug:d=!1,iframes:E={},anchors:p={}}=e;if(!0===s)return console.warn("SPYNE SECURITY WARNING: All HTML sanitization is DISABLED via config.disableSanitize. Do not use this setting in production."),i=e=>e,void(c=!0);const h=["richtext","authoring","development"].includes(r),u=void 0!==E.allow?!0===E.allow:h,N={RETURN_TRUSTED_TYPE:!1,ADD_TAGS:[...u?["iframe"]:[],...h?["link"]:[]],ADD_ATTR:[...(void 0!==p.allowTarget?!0===p.allowTarget:!0===l)?["target","rel"]:[],...u?["sandbox"]:[]],CUSTOM_ELEMENT_HANDLING:a.tT,...!0!==u&&h?{FORBID_TAGS:["iframe"]}:{}},m=e=>n().sanitize(e,N);if(i=m,!0===t&&window.trustedTypes)try{const e=window.trustedTypes.createPolicy("default",{createHTML:e=>m(e)});i=t=>e.createHTML(t),!0===d&&console.log("SPYNE: Trusted Types default policy registered. Note that browser enforcement additionally requires the CSP header: require-trusted-types-for 'script'.")}catch(e){(0,o.q)('SPYNE WARNING: A Trusted Types "default" policy already exists on this page. Falling back to direct sanitization.',e)}c=!0},d=e=>{if(!c)throw new Error("sanitizeHTML is not configured. Call sanitizeHTMLConfigure() with appropriate config.");return i(e)}},225(e,t,r){r.d(t,{M:()=>g});var s=r(167),n=r(511),o=r(519),a=r(907);let i,c,l,d,E,p,h=!0,u=!1;const N=[];let m,_;const T=[],A=new Map,C=new o.O,g=new class{constructor(){d=!1}get channelsMap(){return l}get initialized(){return d}get config(){return i}get debug(){return h}get mode(){return void 0!==i?.mode?i.mode:"app"}static listChannels(){return Array.from(c.map.keys())}initialize(e={},t={},r,s){return c=r,i=(0,a.$)(e,t),i.channels&&i.channels.ROUTE&&(i=s.conformRouteObject(i)),_=i?.IMG_PATH,h=void 0!==i.debug?i.debug:h,this.getChannelActions=c.getChannelActions.bind(c),this.listRegisteredChannels=c.listRegisteredChannels.bind(c),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=c.getStream.bind(c),t=c.testStream.bind(c),r=c.getProxySubject.bind(c);l={getStream:e,testStream:t,getProxySubject:r}}setProp(e,t,r=!1){return r?i.ephemeralProps[e]=t:i.tmpProps[e]=t,t}getProp(e){if(i?.tmpProps&&Object.prototype.hasOwnProperty.call(i.tmpProps,e))return i.tmpProps[e];if(i?.ephemeralProps&&Object.prototype.hasOwnProperty.call(i.ephemeralProps,e)){const t=i.ephemeralProps[e];return delete i.ephemeralProps[e],t}}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),C.pluginMethodsObj}addPluginMethods(e){e&&C.addMethods(e)}doNotTrackChannel(e){T.push(e)}getUntrackedChannelsList(){return T}registerProxyReviver(e,t){A.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 A.get(e)}registerCmsRehydrator(e){E=e}get rehydrateCmsData(){return E}registerCmsLineageWarner(e){p=e}get warnUnproxiedCmsData(){return p}getPluginConfigByPluginName(e){return i.plugins[e]}get IMG_PATH(){return _}get excludeChannelsFromConsole(){return N}set excludeChannelsFromConsole(e){"string"==typeof e?N.includes(e)||N.push(e):Array.isArray(e)?e.forEach(e=>{"string"!=typeof e||N.includes(e)||N.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"),m}set linksData(e){console.warn("set links data in SpyneAppProperties is deprecated, use navLinks")}get navLinks(){return m}set navLinks(e){m=e}get enableCMSProxies(){return u}getHrefFromData(e={}){return n.Q.convertParamsToRoute(e)}set enableCMSProxies(e=!0){u=Boolean(e)}setCMSProxyMethod(e){this.enableCMSProxies=!0,this.formatTemplateForProxyData=e}tempGetChannelsInstance(){}tempGetConfig(){}}},519(e,t,r){r.d(t,{O:()=>i});var s=r(131);const n=Object.create({}),o=(0,s.compose)(s.not,(0,s.is)(Array)),a=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)]));class i{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===a(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:()=>a});var s=r(64),n=r(131),o=r(225);class a{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){const t=o.M?.debug||!1;if(""===this.prefix&&t)return void console.warn(`SPYNE WARNING: The following SpyneTrait ${this.constructor.name} needs a prefix`);const r=(0,n.reject)(e=>0===e.indexOf(this.prefix),e);if(r.length>=1&&t){const e=`Spyne Warning: The following method(s) in ${this.constructor.name} require the prefix, "${this.prefix}": [${r.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=[],a=t=>{const r={},i=t.routeName;let c=void 0!==e[i]?e[i]:(0,s.prop)(i,n);const l=typeof t[c];"string"===l?c=t[c]:"undefined"===l&&(t=this.checkIfParamValueMatchesRegex(c,t)),r[i]=c,this.checkIfObjIsNotEmptyOrNil(r)&&o.push(r);const d=(0,s.is)(Object,t),E=(0,s.has)(c,t),p=(0,s.has)("routePath",t);if(!0===(E&&d)){const e=t[c];(0,s.has)("routePath",e)&&a(e.routePath)}else!0===p&&void 0!==c&&a(t.routePath)};return a(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)),a=(0,s.map)(o),i=(0,s.when)((0,s.complement)(s.isEmpty),(0,s.concat)("?"));return(0,s.compose)(i,(0,s.join)("&"),t,a)(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 a=void 0!==r?r:t.type,i=t.isHash,c=t.routes.routePath,l=void 0!==s?s:this.getLocationStrByType(a,i),d=this.convertRouteToParams(l,t,a).routeData;let E=this.createRouteArrayFromParams(e,c,a,d);return E=o.checkPayloadForRegexOverrides(E,e),E=o.checkForRouteValWithMultipleVals(E),"query"===a?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),a=o.findIndexOfMatchedStringOrRegex(t,n);let i=t;if(a>=0){const t=n[a],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)&&(i=o)}return i}static createArrFromSlashStr(e){return e.replace(/^([/])?(.*)$/,"$2").split("/")}static convertSlashRouteStrToParamsObj(e,t,r){const n=t,o=this.createArrFromSlashStr(t),a=[],i=[];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)(a))(c.routeName)&&!1===o(n)&&(a.push(c.routeName),i.push(n));const l=[t,"routePath"],d=(0,s.path)(l,c),E=(0,s.path)(["routePath"],c);void 0!==d?c=d:void 0!==E&&(c=E)},0,o);const l=(0,s.zipObj)(a,i),d=this.getLastArrVal(a);return{paths:a,pathInnermost:d,routeData:l,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"),a=(0,s.compose)((0,s.map)((0,s.split)("=")),(0,s.split)("&"))(o);let i=(0,s.fromPairs)(a),c=(0,s.map)(s.head,a);return!0===(0,s.isEmpty)(t)&&(i=this.createDefaultParamFromEmptyStr(e,t,r),c=(0,s.keys)(i)),{paths:c,pathInnermost:this.getLastArrVal(c),routeData:i,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)),a=t.routes.routePath;return"query"===n?this.convertQueryStrToParams(a,e):(e=e.replace(/\/$|$/,"/"),this.convertSlashRouteStrToParamsObj(a,e,o))}}},167(e,t,r){r.d(t,{H:()=>a});var s=r(968),n=r(131),o=r(511);class a{constructor(){this.createPopStateStream=a.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),a=e=>(0,n.compose)(n.keys,(0,n.filter)((0,n.propEq)(!0,e))),i=(0,n.compose)((0,n.map)(e=>{const t=(0,n.prop)(e,s),r=(0,n.prop)(e,o),a=(0,n.equals)(t,r),i=void 0!==t,c=void 0!==r,l=!a,d=!1===i&&!0===c,E=!0===i&&!1===c,p={};return p[e]={same:a,changed:l,added:d,removed:E,previousExists:i,nextExists:c},p}),n.uniq,(0,n.chain)(n.keys))([s,o]),c=(0,n.chain)(a("changed"),i),l=(0,n.chain)(a("added"),i),d=(0,n.chain)(a("removed"),i);return s=o,{pathsAdded:l,pathsRemoved:d,pathsChanged:c}},getComparer:()=>s}}static getRouteArrData(e,t){const r=(0,n.filter)((0,n.includes)(n.__,e),t);return{paths:r,pathInnermost:a.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"),a=/^([A-Za-z0-9_-])+$/m,i=(e=[],t,r={})=>{let{routeName:o}=t;return(0,n.toPairs)(t).reduce((t,c)=>{const[l,d]=c,E=(0,n.is)(Object,d),p=e=>(0,n.test)(a,e)?(e=>String(e).replace(/([-_])/g," ").toUpperCase())(e):l;if("routeName"===l||"404"===l)return t;o=o||(0,n.prop)("routeName",d);let h=(0,n.clone)(r);if(h[o]=String(l).replace(/([^A-Za-z0-9-_])/g,""),!0===E){if(1===(0,n.keys)(h).length){const e=(0,n.path)(["routePath","routeName"],d);if(e){const o=(0,n.clone)(h);o[e]="",o.navLevel=(0,n.keys)(r).length,o.title=p(l),o.href=s(o),t.push(o)}}h=i(e,d,h)}else h.title=p(l),h.href=s(h);return h.navLevel=(0,n.keys)(r).length,t.push(h),t},[])},c=i([],e.routes);let l=(0,n.flatten)(c);return l=function e(t){return t.map(t=>{for(const r in t)void 0===r||"undefined"===r||void 0===t[r]?delete t[r]:t[r]&&"object"==typeof t[r]&&!Array.isArray(t[r])&&(t[r]=e([t[r]])[0]);return t})}(l),{routeDatasetsArr:l,routeNamesArr:(e=>{const t=(0,n.reject)((0,n.includes)(n.__,["title","href","navLevel","undefined"]));return(0,n.compose)(n.uniq,t,n.flatten,(0,n.map)(n.keys))(e)})(l)}}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},i=(0,n.compose)(n.fromPairs,(0,n.map)(e=>{const[t,r]=e,a=s?{404:".+"}:{},c=(0,n.is)(Object,r),l=(0,n.is)(Array,r),d="routePath"===t;return!0===c&&!1===l&&(e[1]=i(e[1]),d&&(e[1]=(0,n.compose)((0,n.mergeDeepRight)(a),n.fromPairs,(0,n.map)(o),n.toPairs)(e[1]))),e}),n.toPairs);if(void 0!==r){e.channels.ROUTE=i(e.channels.ROUTE);const t=a.addRouteDatasets(e.channels.ROUTE);return e.channels.ROUTE=(0,n.mergeRight)(e.channels.ROUTE,t),e}return i(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:()=>a});var s=r(968),n=r(531),o=r(131);class a{constructor(){this.createDomObservableFromEvent=a.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=(a=e,{addHandler:e=>{a.addListener(e)},removeHandler:e=>{a.onchange=()=>{}}});var a;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=a.createMediaQuery(e);return!1!==n&&r.push(a.createMediaQueryHandler(n,t)),r},t),r}}},950(e,t,r){r.d(t,{q:()=>s,t:()=>n});const s=(...e)=>{!0!=("undefined"!=typeof window&&!0===window.SPYNE_SUPPRESS_WARNINGS)&&console.warn(...e)},n=(e=!0)=>{"undefined"!=typeof window&&(window.SPYNE_SUPPRESS_WARNINGS=!0===e)}},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:()=>a});var s=r(968),n=r(531),o=r(131);class a{constructor(e){this.props.observableStreams=a.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 a=e=>(0,o.propSatisfies)(t=>t.includes(e),"$dir"),i=a("parent"),c=a("child"),l=a("internal"),d=e=>(0,o.mergeRight)({from$:e}),E=d("child"),p=d("internal"),h=d("parent"),u=e.pipe((0,n.filter)(e=>void 0!==e&&void 0!==e.action)),N=e.pipe((0,n.filter)(l),(0,n.map)(p)),m=e.pipe((0,n.filter)(i),(0,n.map)(E)),_=e.pipe((0,n.filter)(c),(0,n.map)(h)),T={parent:m,internal:N,child:_};return{raw$:u,toInternal$:N,toParent$:m,toChild$:_,completeAll:()=>{(0,o.forEach)(e=>{e.complete(),e.isStopped=!0},[u,N,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:()=>a});var s=r(131),n=r(49),o=r(225);class a{constructor(e,t={},r={}){if(this.template=this.formatTemplate(e),this.isProxyData=!0===t.__cms__isProxy,this.testMode=r?.testMode,!1===this.isProxyData&&!0===o.M.enableCMSProxies){const e=o.M.rehydrateCmsData?.(t);void 0!==e?(t=e,this.isProxyData=!0):!0===a.templateBindsProxiedChild(t,this.template)?this.isProxyData=!0:!0===o.M.debug&&o.M.warnUnproxiedCmsData?.(t,this.template)}if(this.template=a.normalizeTripleBrackets(this.template),!0===this.isProxyData){const e=!0===o.M.enableCMSProxies?o.M.formatTemplateForProxyData:a.formatTemplateForProxyData;"function"==typeof e&&(this.template=e(this.template))}(()=>{!0===(0,s.is)(Array,t)&&(t={spyneData:t},this.template=this.template.replace("{{/}}","{{/spyneData}}"),this.template=this.template.replace("{{#}}","{{#spyneData}}"))})(),this.templateData=t,this.currentOuterLoopData=null;const n=a.getStringArray(this.template);let i=this.template.match(a.findTmplLoopsRE());i=null===i?[]:i;const c=a.parseTmplLoopsRE(),l=this.parseTheTmplLoop.bind(this),d=(0,s.includes)(s.__,i),E=(0,s.ifElse)(d,e=>e.replace(c,l),this.addParams.bind(this));this.finalArr=n.map(E)}static isPrimitiveTag(e){return/({{\.\*?}})/.test(e)}static templateBindsProxiedChild(e,t){if(null===e||"object"!=typeof e||"string"!=typeof t)return!1;if(-1===t.indexOf("{{"))return!1;const r=Object.keys(e);for(let s=0;s<r.length;s++){const n=r[s],o=e[n];if(null!==o&&"object"==typeof o&&!0===o.__cms__isProxy&&(-1!==t.indexOf(`{{${n}.`)||-1!==t.indexOf(`{{#${n}}}`)||-1!==t.indexOf(`{{#${n}.`)))return!0}return!1}static hasProxiedChild(e){if(null===e||"object"!=typeof e)return!1;const t=Object.values(e);for(let e=0;e<t.length;e++){const r=t[e];if(null!==r&&"object"==typeof r&&!0===r.__cms__isProxy)return!0}return!1}static normalizeTripleBrackets(e){return"string"!=typeof e||-1===e.indexOf("{{{")?e:e.replace(/\{\{\{([^{}]+?)\}\}\}/g,"{{$1}}")}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(a.findTmplLoopsRE()),r=/^([\\n\s\W]+)$/,n=t.filter((e,t)=>!(t>=2&&(t-2)%3==0));return(0,s.reject)(e=>e.match(r),n)}static findTmplLoopsRE(){return/({{#([\w.]+)}}[\w\n\s\W]+?{{\/\2}})/gm}static parseTmplLoopsRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static innerLoopRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static swapParamsForTagsRE(){return/({{)(.*?)(}})/gm}static hasLoop(e){return a.innerLoopRE().test(e)}removeThis(){void 0!==this&&(this.finalArr=void 0,this.templateData=void 0,this.template=void 0)}static stripInertCmsItems(e){return-1===e.indexOf('data-cms-id=""')?e:e.replace(/<spyne-cms-item data-cms-id=""[^>]*>[\s\S]*?<spyne-cms-item-text>([\s\S]*?)<\/spyne-cms-item-text>\s*<\/spyne-cms-item>/g,"$1")}renderDocFrag(){let e=a.replaceImgPath(this.finalArr.join(""));!0===this.isProxyData&&(e=a.stripInertCmsItems(e)),!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=a.replaceImgPath(e),!0===this.isProxyData&&(e=a.stripInertCmsItems(e)),!0!==this.testMode&&(e=String((0,n.A)(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(a.swapParamsForTagsRE(),(e,t,r,s)=>a.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}processInnerLoop(e,t){const r=a.innerLoopRE();return e.replace(r,(e,r,n,i)=>{!0===a.hasLoop(i)&&(!0===o.M.debug&&!0!==this.testMode&&console.warn(`Spyne Warning: DomElementTemplate supports one level of nested array loops. A deeper nested loop was detected inside "{{#${n}}}". Consider restructuring via nested ViewStreams instead.`),i=i.replace(/{{[#/][\w.]+}}/g,""));const c=a.getNestedDataReducer(t,n);if(!0===(0,s.isNil)(c)||(0,s.isEmpty)(c))return"";const l=Array.isArray(c)?c:[c],d=this.currentOuterLoopData;this.currentOuterLoopData=c;const E=l.map((e,t)=>this.substituteForItem(i,e,t)).join("");return this.currentOuterLoopData=d,E})}substituteForItem(e,t,r){if("string"==typeof t){if(a.isPrimitiveTag(e)){const r=t.replace(/\$/g,"$$$$");return e.replace(a.swapParamsForTagsRE(),r)}const s=this.buildStringItemContext(t,r);return this.substituteObject(e,s)}const s=this.buildItemContext(t,r);return this.substituteObject(e,s)}buildStringItemContext(e,t){const r={spyneLoopKey:e,loopIndex:t,loopNum:t+1};if(!0===this.isProxyData){const t=this.currentOuterLoopData;if(t&&"object"==typeof t){r.__cms__dataId=t.__cms__dataId||"";const s=`__cms__keyFor_${e}`;r.origKey=void 0!==t[s]?t[s]:""}else r.__cms__dataId="",r.origKey=""}return r}buildItemContext(e,t){const r=Object.assign({},e,{loopIndex:t,loopNum:t+1});return!0===this.isProxyData&&(r.__cms__dataId=e.__cms__dataId,r.spyneLoopKey=e,r.loopIndex=t,r.loopNum=t+1),r}substituteObject(e,t){const r=/(\.)/gm,s={loopIndex:t.loopIndex,loopNum:t.loopNum};return e.replace(a.swapParamsForTagsRE(),(e,n,o)=>void 0!==s[o]?s[o]:!1===r.test(o)&&void 0!==t[o]?t[o]:this.getDataValFromPathStr(o,t))}parseTheTmplLoop(e,t,r,n){const o=n,i=a.getNestedDataReducer(this.templateData,r);if(!0===(0,s.isNil)(i)||(0,s.isEmpty)(i))return"";const c=this.currentOuterLoopData;this.currentOuterLoopData=i;const l=Array.isArray(i)?i:[i],d=a.hasLoop(o),E=l.map((e,t)=>{const r=d?this.processInnerLoop(o,e):o;return this.substituteForItem(r,e,t)}).join("");return this.currentOuterLoopData=c,E}}},192(e,t,r){r.d(t,{r:()=>l});var s=r(445),n=r(950),o=r(291),a=r(907),i=r(672),c=r(131);class l{constructor(e={},t=!1){var r;e.tagName=(r=e.tagName,(0,c.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){const r=!0===this.testMode;return this.getProp("attrs").forEach((t,s)=>{if("dataset"!==s){if(!0!==r){const{allowed:r,value:o}=(0,i.Wh)(s,t,e.tagName);if(!0!==r)return void(0,n.q)(`SPYNE WARNING: The attribute "${s}" was removed during sanitization.`,e);t=o}e.setAttribute(s,t)}else(0,c.forEachObjIndexed)((t,r)=>{e.dataset[r]=t},t)}),!0!==r&&(0,i.Zy)(e),e}updateAttrs(e,t){const r=void 0!==t?t:new Map;return(0,c.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,c.is)(Object,r)?r:{};const s=new o.X(t,r,{testMode:this?.testMode}).renderDocFrag();return(0,c.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,c.is)(String,t)){const r=document.createTextNode(t);e.appendChild(r)}return e}execute(){const e=(0,c.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,a.$)(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,c.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:()=>d});var s=r(643),n=r(64),o=r(225),a=r(968),i=r(531),c=r(131);const l=!0===o.M.debug;class d{constructor(e,t){this.addMixins(),this.props=e,this.broadcastFn=t,this.broadcaster(this.broadcastFn)}addDblClickEvt(e){return(0,a.fromEvent)(e,"dblclick").pipe((0,i.map)(e=>{const t=(0,c.clone)(e);return t.typeOverRide="dblclick",t}))}broadcast(e){if(e.length<=0&&!0===l)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 i,d=this.props.el.querySelectorAll(r);if(d.length<=0){const e=this.props.el,t=t=>{t===e&&(d=[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===d||d.length<=0)&&!0===l?console.warn(`Spyne Warning: The item ${r}, does not appear to exist in ${this.props.name} --\x3e vsid:${this.props.vsid}!`):(d.forEach=Array.prototype.forEach,d.forEach(e=>{const r="dblClick"!==s?(0,a.fromEvent)(e,s,{preventDefault:()=>!0}):this.addDblClickEvt(e);i=e.dataset.channel;const o={};var l;o.payload=(0,n.Lx)(e.dataset),o.payload=(0,c.omit)(["channel"],o.payload),"ROUTE"===o.channel&&(o.payload.endPreventDefault=!0),o.channel=i,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[l=i,"ROUTE"===l||"CHANNEL_ROUTE"===l?"ROUTE":("UI"!==l&&"CHANNEL_UI"!==l&&void 0!==l&&console.warn(`SpyneJS warning: The channel, ${l}, 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:()=>l});var s=r(192),n=r(393),o=r(518),a=r(907),i=r(968),c=r(131);class l{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,a.$)(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 i.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,a.$)(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,i.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:()=>i});var s=r(225),n=r(961),o=r(158),a=r(131);class i{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.lE)(e);t.next(r),e=void 0}static deepClone(e){const t=(0,a.is)(Array),r=(0,a.is)(Object);var s;return!1===t(s=e)&&!0===r(s)?(0,a.compose)(a.fromPairs,a.toPairs,a.clone)(e):(0,a.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:()=>E});var s=r(131),n=r(950),o=r(225);function a(){return!0===o.M.debug}function i(e,t,r=!1){const n=l(e,t,r);return 1===n.length?(0,s.head)(n):n}function c(e,t,r){const o=document.querySelector(e),i=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));if(null===o||!1!==i(o)){if(void 0!==t&&String(t).trim().length>0){function c(e){try{return document.querySelectorAll(e).length>0}catch(e){return!1}}const l=c(t);!0===r&&!0===a()&&!1===l&&(0,n.q)(`Spyne Warning: the selector, ${t} does not exist in this el, ${e}`)}}else(0,n.q)(`Spyne Warning: the el object is not a valid single element, ${o}`)}function l(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&&c(!0===s?"body":e,t,r),n}function d(e,t,r){return l(t,r).forEach(t=>{t.style.cssText=e}),this}function E(e,t){function r(t){return E(e,t)}c(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(l(e,t)).map(r),r.forEach=r=>Array.from(l(e,t)).map(r),r.addClass=s=>(l(e,t).forEach(e=>e.classList.add(s)),r),r.removeClass=s=>(l(e,t).forEach(e=>{e.classList.remove(s)}),r),r.setClass=n=>(l(e,t).forEach(e=>{const t=(0,s.compose)((0,s.reject)(s.isEmpty),(0,s.split)(" "))(e.className),r=n.split(" ");t.forEach(t=>e.classList.remove(t)),r.forEach(t=>e.classList.add(t))}),r),r.unmount=()=>{},r.toggleClass=(s,n)=>(l(e,t).forEach(e=>{(n=void 0!==n?n:!e.classList.contains(s))?e.classList.add(s):e.classList.remove(s)}),r),r.toggle=(e,t)=>(r.toggleClass(e,t),r),r.appendChild=e=>{const s=r.el;return null!==s?s.appendChild(e):(0,n.q)(`Spyne Warning: The selector, ${t} does not appear to be valid!`),r.el},r.addAnimClass=s=>(requestAnimationFrame(()=>{l(e,t).forEach(e=>{try{e.classList.add(s)}catch(e){}})}),r),r.setActiveItem=(o,c)=>{const d=l(e,t),E="string"==typeof c?i(e,c):c;if(d.forEach(e=>e.classList.remove(o)),!0===(p=E,(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(p))){const e=Array.from(d).find(e=>e===E);e?e.classList.add(o):!0===a()&&(0,n.q)(`Spyne Warning: The selector, ${c}, is valid but does not match any item in setActiveItem: ${o}`)}else!0===a()&&(0,n.q)(`Spyne Warning: The selector, ${c}, does not appear to be a valid item in setActiveItem: ${o}`);var p;return r};const o=(r=!0)=>Array.from(l(e,t,r));return Object.defineProperty(r,"el",{get:()=>{const r=o();return r.length>1&&!0===a()&&(0,n.q)(`Spyne Warning: el$("${void 0!==t?t:e}").el matched ${r.length} elements; returning the first. Use .els for the full list.`),r.length>=1?r[0]:null}}),Object.defineProperty(r,"els",{get:()=>o()}),Object.defineProperty(r,"arr",{get:()=>o()}),Object.defineProperty(r,"elLegacy",{get:()=>i(e,t,!0)}),Object.defineProperty(r,"len",{get:()=>l(e,t,!1).length}),Object.defineProperty(r,"length",{get:()=>l(e,t,!1).length}),Object.defineProperty(r,"exists",{get:()=>l(e,t,!1).length>=1}),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),a=r(961),i=r(64),c=r(300),l=r(584),d=r(992),E=r(54),p=r(589),h=r(518),u=r(707),N=r(968),m=r(531),_=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,i.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,_.pick)(t,this.props),void 0!==this.props.traits&&this.addTraits(this.props.traits),this.loadAllMethods(),this.props.action="LOADED",this.sink$=new N.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,_.findIndex)((0,_.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,_.flatten)(t)})(e);t.forEach(r)}}static isValidNestedArr(e){const t=(0,_.equals)(!0),r=(0,_.all)(t),s=(0,_.is)(String),n=(0,_.compose)(r,(0,_.map)(s),(0,_.slice)(0,2),(0,_.defaultTo)([]));return(0,_.compose)(r,(0,_.map)(n),(0,_.defaultTo)([]))(e)}static elIsDomElement(e){return(0,_.is)(String,e)&&(e=document.querySelector(e)),(0,_.compose)((0,_.lte)(0),(0,_.defaultTo)(-1),(0,_.prop)("nodeType"))(e)}updatePropsToMatchEl(){const e=(0,_.compose)(_.toLower,(0,_.either)((0,_.prop)("tagName"),(0,_.always)("")));this.props.tagName=e(this.props.el)}elAlreadyExistsFn(e){const t=(0,_.compose)((0,_.lte)(0),(0,_.defaultTo)(-1),(0,_.prop)("nodeType"));return(0,_.propSatisfies)((0,_.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,_.curry)(this.onChannelMethodCall.bind(this));this.addActionListeners().forEach(t=>{let[r,s,n]=t;(0,_.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,_.defaultTo)((0,_.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,_.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,m.map)(e=>this.onMapViewSource(e)),(0,m.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,m.filter)(e=>void 0!==e&&void 0!==e.action),(0,m.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,m.filter)(e=>void 0!==e&&void 0!==e.action),(0,m.tap)(e=>this.tracer("addChildStraem do ",e)),(0,m.map)(e=>e),(0,m.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,_.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 N.Subject,this.autoMergeSubject$=this.uberSource$.pipe((0,m.mergeMap)(e=>{const t=e.observable.pipe((0,m.filter)(e=>void 0!==e&&void 0!==e.action),(0,m.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,m.finalize)(r)))})),this.autoSubscriber$=this.autoMergeSubject$.pipe((0,m.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,_.defaultTo)(e=>this.sendExtendedStreams(e)),r=(0,i.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,_.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,_.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,_.is)(String,t)&&(0,_.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,_.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 d.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,_.defaultTo)("",e[1]);!1===(0,_.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,_.compose)((0,_.forEach)(e),(0,_.defaultTo)([]))(t)}const s=()=>{void 0!==(0,_.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,u.T)(this.props.el)}downStream(){}onRendered(){}onAnimFrameAfterRendered(){}afterRender(){}broadcastEvents(){return[]}getChannel(e){return(0,_.ifElse)(e=>(0,l.ns)().includes(e),e=>n.M.channelsMap.getStream(e).observer.pipe((0,m.takeWhile)(e=>!0!==this.deleted)),e=>console.warn(`channel name ${e} is not within ${l.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,_.path)(["srcElement","isLocalEvent"]),a=(0,_.path)(["srcElement","vsid"]),i=[(0,m.map)(e=>{const t=e;return t.$dir=n,t}),(0,m.filter)(e=>{const t=a(e);return!0!==o(e)||t===this.props.vsid})];!0===t&&i.unshift((0,m.skip)(1));const c=this.getChannel(e).pipe(...i);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,_.defaultTo)("VIEWSTREAM_EVENT"),o=(0,_.compose)(n,(0,_.prop)(e)),i={payload:s,action:r=r||o({CHANNEL_ROUTE:"CHANNEL_ROUTE_CHANGE_EVENT"})};try{if(i.srcElement=(0,_.compose)((0,_.pick)(["id","vsid","class","tagName"]),(0,_.prop)("props"))(this),!0===this.checkIfChannelExists(e)){!1===/CHANNEL_LIFECYCLE/.test(r)&&Object.defineProperties(i,{payload:{get:()=>(0,a.lE)(t)}});const s=(0,N.of)(i);return new E.u(e,s,i)}}catch(e){console.warn("SPYNE WARNING ",e)}}tracer(...e){this.sendLifecycleMethod(...e)}sendLifecycleMethodInactive(){}sendLifecycleMethodActive(e,t){const r="VS_DETRITUS_COLLECT"===t;!0===(0,_.where)({from$:(0,_.equals)("internal"),action:(0,_.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,_.path)(["srcElement","el"],e),r=(0,_.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 a(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}};return n[e](r,r.exports,a),r.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};a.r(i),a.d(i,{Channel:()=>_.c,ChannelFetch:()=>T.e,ChannelFetchUtil:()=>A.G,ChannelPayload:()=>C.m,ChannelPayloadFilter:()=>g.C,ChannelsMap:()=>c.H,DomElement:()=>l.r,DomElementTemplate:()=>d.X,SpyneApp:()=>b.D,SpyneAppProperties:()=>I.M,SpynePlugin:()=>f.V,SpyneTrait:()=>N.g,ViewStream:()=>h.A,ViewStreamBroadcaster:()=>u.e,ViewStreamElement:()=>E.q,ViewStreamPayload:()=>m.u,ViewStreamSelector:()=>p.T,allowCustomElements:()=>O.o$,deepMerge:()=>y.$,safeAugment:()=>S.Hy,safeClone:()=>S.lE,safeCloneDeep:()=>S.f0,safeFilter:()=>S.WD,safeMap:()=>S.Ek,safeReject:()=>S.pt,sanitizeData:()=>O.Ay,sanitizeEventTarget:()=>O.v8,setSpyneWarningsDisabled:()=>L.t});var c=a(470),l=a(192),d=a(291),E=a(300),p=a(707),h=a(173),u=a(992),N=a(732),m=a(54),_=a(2),T=a(126),A=a(9),C=a(980),g=a(589),f=a(930),y=a(907),S=a(961),I=a(225),b=a(713),L=a(950),O=a(672);return i})());
|
|
3
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3B5bmUudW1kLmpzIiwibWFwcGluZ3MiOiI7Q0FBQSxTQUEyQ0EsRUFBTUMsR0FDMUIsaUJBQVpDLFNBQTBDLGlCQUFYQyxPQUN4Q0EsT0FBT0QsUUFBVUQsRUFBUUcsUUFBUSxRQUFTQSxRQUFRLFNBQVVBLFFBQVEsYUFBY0EsUUFBUSxRQUFtQixXQUNwRixtQkFBWEMsUUFBeUJBLE9BQU9DLElBQzlDRCxPQUFPLFFBQVMsQ0FBQyxPQUFRLFFBQVMsWUFBYSxrQkFBbUJKLEdBQ3hDLGlCQUFaQyxRQUNkQSxRQUFlLE1BQUlELEVBQVFHLFFBQVEsUUFBU0EsUUFBUSxTQUFVQSxRQUFRLGFBQWNBLFFBQVEsUUFBbUIsV0FFL0dKLEVBQVksTUFBSUMsRUFBUUQsRUFBVyxLQUFHQSxFQUFRLEVBQUdBLEVBQWdCLFVBQUdBLEVBQVcsS0FBYSxVQUM3RixDQVRELENBU0dPLEtBQU0sQ0FBQ0MsRUFBa0NDLEVBQWtDQyxFQUFrQ0MsSSxpRkNMekcsTUFBTUMsVUFBcUIsSUE4Q2hDLFdBQUFDLENBQVlDLEVBQU1DLEVBQVEsQ0FBRUMsaUJBQWdCLElBRzFDSixFQUFhSyxrQkFBa0JGLEVBQU9ELFFBRXBCSSxJQUFkSCxFQUFNSSxNQUNSSixFQUFNSyxNQUFRTCxFQUFNSSxLQUV0QkosRUFBTU0sbUJBQXFCLENBQ3pCLEdBQUdQLG1CQUNILEdBQUdBLGdCQUNILENBQUMsR0FBR0Esa0JBQXNCLGtCQUU1QkMsRUFBTU8sbUJBQW9CLEVBQzFCQyxNQUFNVCxFQUFNQyxFQUNkLENBRUEsd0JBQU9FLENBQWtCRixFQUFPRCxFQUFNVSxHQUFXLEdBQy9DLE1BRU1DLEdBQXlCLElBQUFDLFFBQU8sRUFBQUMsTUFEaEJDLEdBQXdCLG1CQUFWLEdBRTlCQyxHQUFjLElBQUFDLEtBQUlMLEdBQ2xCTSxHQUE4QixJQUFBQyxTQUFRLENBQUNILEVBSjFCSSxHQUFPQSxFQUFJQyxRQUFVLElBT3hDLFFBRjJCLElBQUFDLFNBQVFKLEVBQTZCLEVBQUFLLFFBQVEsSUFBQUMsTUFBSyxDQUFDLE1BQU8sVUFBMUQsQ0FBcUV0QixNQUc3RSxJQUFiUyxHQUNGYyxRQUFRQyxLQUFLLG1EQUFtRHpCLDZCQUUzRCxFQUlYLENBRUEsWUFBQTBCLENBQWF6QixFQUFRMEIsS0FBSzFCLFFBQ0gsSUFBakJBLEdBQU8yQixPQUNURCxLQUFLRSxZQUVULENBRUEsb0JBQUFDLENBQXFCOUIsR0FDbkIsTUFPTStCLEdBQWMsSUFBQVYsVUFBUSxJQUFBVyxXQUFVLEtBQUssSUFBQUMsTUFBSyxDQUFDLFFBQVMsd0JBQzFELE1BUlksQ0FDVix5QkFDQSxzQkFDQSxDQUFDLGdDQUFpQyxpQkFDbEMsQ0FBQyw4QkFBK0Isa0JBSXZCQyxPQUFPSCxFQUFZSixNQUNoQyxDQUVBLFVBQUFFLENBQVdNLEVBQVUsQ0FBQyxFQUFHQyxFQUFhVCxLQUFLVSxnQkFBZ0JDLEtBQUtYLE9BQzlELE1BQU1ZLEVBQWFaLEtBQUthLHlCQUF5QkwsR0FDakQsT0FBTyxJQUFJLElBQWlCSSxFQUFZSCxHQUFZLEVBQU9ULEtBQUsxQixNQUFNRCxLQUN4RSxDQUVBLGFBQUF5QyxDQUFjQyxHQUNaLE1BQU1DLEVBQWVoQixLQUFLaUIsaUJBQWlCRixHQUMzQ2YsS0FBS0UsV0FBV2MsRUFDbEIsQ0FFQSxlQUFBTixDQUFnQlEsR0FDZCxNQUNNQyxHQURtRCxJQUFwQ0QsR0FBWUUsb0JBRTdCLEdBQUdwQixLQUFLMUIsTUFBTUQsbUJBQ2QsR0FBRzJCLEtBQUsxQixNQUFNRCxzQkFFbEIsT0FBTzJCLEtBQUtxQix5QkFBeUJILEVBQVlDLEVBQ25ELENBRUEsd0JBQUFFLENBQXlCQyxFQUFTSCxFQUFTLEdBQUduQixLQUFLMUIsTUFBTUQsdUJBQ3ZELE1BQU0sS0FBRUEsRUFBSSxrQkFBRVEsRUFBaUIsSUFBRTBDLEdBQVF2QixLQUFLMUIsTUFDeENrRCxFQUFhLENBQUVuRCxPQUFNUSxvQkFBbUIwQyxPQUM5Q3ZCLEtBQUt5QixtQkFBbUJOLEVBQVFHLEVBQVNFLEVBQzNDLENBRUEsZ0JBQUFQLENBQWlCRixHQUNmLE1BQU1XLEVBQVVYLEdBQUtPLFNBQVdQLEdBQUtZLGdCQUFnQkwsU0FBVyxDQUFDLEVBQ2pFLE9BQU8sSUFBQTFCLE1BQUssQ0FBQyxRQUFTLE1BQU8sU0FBVSxPQUFRLE9BQVEsU0FBVSxlQUFnQixTQUFVOEIsRUFDN0YsQ0FFQSx3QkFBQWIsQ0FBeUJMLEVBQVNsQyxFQUFRMEIsS0FBSzFCLE9BQzdDLE1BQU0wQyxHQUFlLElBQUFwQixNQUFLLENBQUMsUUFBUyxNQUFPLFNBQVUsT0FBUSxPQUFRLGtCQUFtQixTQUFVLGVBQWdCLFNBQVV0QixHQUV0SHNELEdBQXFCLElBQUFDLFFBQU8sRUFBQTNDLE9BQ2xDLE9BQU8sSUFBQVEsU0FBUWtDLEVBRk0sQ0FBQ0UsRUFBSUMsS0FBTyxJQUFBQyxnQkFBZUYsRUFBSUMsR0FFN0MsQ0FBMENmLEVBQWNSLEVBQ2pFLENBRUEsWUFBSXlCLEdBQ0YsT0FBT2pDLEtBQUtrQyxTQUNkLEUsNkRDNUhGLE1BQU1DLEVBQXVCLElBQUlDLFFBRTFCLE1BQU1DLEVBcUJYLFdBQUFqRSxDQUFZa0UsRUFBYW5CLEVBQVFHLEVBQVNFLEVBQVllLEVBQU9DLEdBQzNELE1BQU1DLEVBQVVILEVBR1pFLEdBQ0YzQyxRQUFRNkMsS0FBS0YsR0FHZixNQUFNRyxFQUF3QixDQUFFTCxjQUFhbkIsU0FBUUssYUFBWWUsU0FnQmpFLEdBZEFJLEVBQXNCckIsUUFBVWUsRUFBZU8sV0FBV3RCLElBY3pCLElBQTdCLElBQW1CdUIsTUFBZ0IsQ0FDckMsR0FBSUMsT0FBT0MsVUFBVUMsZUFBZUMsS0FBSzNCLEVBQVMsV0FBWSxDQUM1RCxNQUFNNEIsRUFBYUMsS0FBS0MsVUFBVTlCLEdBQ2xDekIsUUFBUUMsS0FBSywrR0FBK0dxQixNQUFXK0IsSUFDekksQ0FFQSxNQUFNRyxFQUFvQixJQUFtQkMsa0JBQWtCYixHQUUvREosRUFBZWtCLGVBQWVwQyxFQUFRc0IsRUFBU1ksRUFDakQsQ0FFQVYsRUFBc0JhLE1BQVEsS0FDckIsSUFBQUMsVUFBUyxDQUNkLENBQUVuQyxTQUFRLFFBQVVxQixFQUFzQnJCLFVBQzFDcUIsRUFBc0JyQixRQUN0QixDQUFFbUIsU0FBUyxJQUFBZSxPQUFNZixJQUNqQixDQUFFRixPQUFPLElBQUFpQixPQUFNakIsSUFDZixDQUFFZixlQUNGLElBQUFnQyxPQUFNYixFQUFzQm5CLFlBQWEsQ0FBRUwsUUFBUSxJQUFBcUMsT0FBTWIsRUFBc0J4QixXQXNCbkZ3QixFQUFzQmUsVUFBWSxLQUNoQyxNQUFNQyxHQUFpQixRQUFjaEIsRUFBc0JyQixTQUMzRCxPQUFPLElBQUFtQyxVQUFTLENBQ2QsQ0FBRW5DLFFBQVNxQyxHQUNYQSxFQUNBLENBQUVsQixXQUNGLENBQUVGLFNBQ0YsQ0FBRWYsY0FDRm1CLEVBQXNCbkIsV0FDdEIsQ0FBRUwsT0FBUXdCLEVBQXNCeEIsV0FJcEMsTUFBTXlDLEVBQTZCLENBQ2pDQyxLQUFNLENBQ0pDLElBQUssSUFBTW5CLEVBQXNCb0IsS0FDakNDLElBQU03RSxJQUNKd0QsRUFBc0JvQixLQUFPNUUsRUFDdEJBLEtBdUJiLE1BbEJnQixrQkFBWnNELElBRUZtQixFQUEyQkssU0FBVyxDQUNwQ0gsSUFBSyxJQUFNekIsRUFBZTZCLG9CQVE5QnZCLEVBQXNCb0IsVUFBT3RGLEVBRTdCcUUsT0FBT3FCLGlCQUFpQnhCLEVBQXVCaUIsR0FFM0NwQixHQUNGM0MsUUFBUXVFLFFBQVE1QixHQUVYRyxDQUNULENBRUEscUJBQU9ZLENBQWVwQyxFQUFRc0IsRUFBU2pELEdBQ3JDLE1BQU02RSxHQUFVLElBQUFDLFVBQVNuRCxFQUFRM0IsR0FJakMsT0FIZ0IsSUFBWjZFLElBQXdELElBQW5DLElBQW1CRSxhQUMxQzFFLFFBQVFDLEtBQUsscUJBQXFCcUIsbUNBQXdDc0IsY0FFckU0QixDQUNULENBRUEsc0JBQU9ILEdBV0wsT0FBTyxJQUFBTSxTQVZtQixDQUN4QixPQUNBLFNBQ0EsV0FDQSxPQUNBLFdBQ0EsT0FDQSxXQUNBLFNBQ0EsUUFDZ0NDLE9BQU9SLFNBQzNDLENBRUEsb0JBQU9TLEdBRVAsQ0FFQSxnQkFBT0MsQ0FBVUMsR0FDZixNQUFNQyxHQUFRLElBQUFDLElBQUdDLE9BQ1hDLEdBQVEsSUFBQUYsSUFBR2hDLFFBQ0ZtQyxNQUVmLE9BRm1DLElBQWRKLEVBQU5JLEVBQ1dMLEtBRGdDLElBQWRJLEVBQU1DLElBRTlCLElBQUF2RixTQUFRLEVBQUF3RixVQUFXLEVBQUFDLFFBQVMsRUFBQTNCLE1BQTVCLENBQW1Db0IsSUFBSyxJQUFBcEIsT0FBTW9CLEVBQ3BFLENBV0EsZ0NBQU9RLENBQTBCQyxHQUMvQixHQUFJbEQsRUFBcUJtRCxJQUFJRCxHQUMzQixPQUFPbEQsRUFBcUIyQixJQUFJdUIsR0FHbEMsTUFBTUUsRUFBb0JDLEtBQ1MsSUFBN0IsSUFBbUIzQyxPQUNyQmhELFFBQVFDLEtBQUssb0NBQW9DMkYsT0FBT0QsaUZBRW5ELEdBR0hFLEVBQVMsSUFBSUMsTUFBTU4sRUFBVSxDQUNqQyxHQUFBdkIsQ0FBSThCLEVBQVFKLEdBQ1YsTUFBTXJHLEVBQU15RyxFQUFPSixHQUduQixPQUFZLE9BQVJyRyxHQUErQixpQkFBUkEsSUFBNkMsSUFBekJBLEVBQUkwRyxpQkFDMUN4RCxFQUFlK0MsMEJBQTBCakcsR0FFM0NBLENBQ1QsRUFDQTZFLElBQUcsQ0FBQzRCLEVBQVFKLElBQ0hELEVBQWlCQyxHQUUxQk0sZUFBYyxDQUFDRixFQUFRSixJQUNkRCxFQUFpQkMsR0FFMUJPLGVBQWMsQ0FBQ0gsRUFBUUosSUFDZEQsRUFBaUJDLEtBSzVCLE9BREFyRCxFQUFxQjZCLElBQUlxQixFQUFVSyxHQUM1QkEsQ0FDVCxDQUVBLGlCQUFPOUMsQ0FBV2dDLEdBR2hCLE1BQU1vQixHQUFpQixJQUFBdEcsVUFBUSxJQUFBdUcsS0FBSSxJQUFJLElBQUE1RixZQUFXLElBQUksSUFBQTZGLE1BQUssYUFLM0QsR0FBVSxPQUFOdEIsR0FBMkIsaUJBQU5BLElBQXlDLElBQXZCQSxFQUFFaUIsaUJBQzNDLE9BQU94RCxFQUFlK0MsMEJBQTBCUixHQUdsRCxJQUdFOUIsT0FBT3FELG9CQUFvQnZCLEdBQUd3QixRQUFRLFNBQVNGLEdBQzdDLE1BQU0vRyxFQUFNeUYsRUFBRXNCLEdBQ2QsR0FBSXBELE9BQU9DLFVBQVVDLGVBQWVDLEtBQUsyQixFQUFHc0IsS0FDaEIsSUFBeEJGLEVBQWU3RyxJQUNQLE9BQVJBLElBQ2dCLGlCQUFSQSxHQUFtQyxtQkFBUkEsS0FDbEMyRCxPQUFPdUQsU0FBU2xILEdBQU0sQ0FDekIsTUFBTW1ILEVBQVlqRSxFQUFlTyxXQUFXekQsR0FDeENtSCxJQUFjbkgsSUFDaEJ5RixFQUFFc0IsR0FBUUksRUFFZCxDQUNGLEdBQ0F4RCxPQUFPeUQsT0FBTzNCLEVBQ2hCLENBQUUsTUFBTzRCLEdBRVAsT0FBTzVCLENBQ1QsQ0FFQSxPQUFPQSxDQUNULENBRUEsd0JBQU82QixHQUNMLE1BQU8sQ0FBQyxTQUFVLFVBQVcsZUFBZ0IsYUFBYyxVQUFXLFVBQVcsV0FBWSxVQUFXLGdCQUFpQixtQkFBb0IsU0FBVSxhQUFjLGNBQWUsWUFBYSxTQUFVLFNBQVUsVUFBVyxZQUFhLFlBQWEsVUFBVyxVQUFXLFFBQVMsUUFBUyxPQUFRLGdCQUFpQixjQUFlLFVBQVcsVUFBVyxXQUFZLHFCQUFzQixhQUFjLFNBQVUsWUFBYSxZQUFhLE9BQVEsT0FBUSxRQUFTLElBQUssSUFDcGQsRSw0RUN0UUssTUFBTUMsVUFBcUIsSUFhaEMsV0FBQXRJLENBQVlDLEVBQU1DLEVBQVEsQ0FBQyxHQUN6QkEsRUFBTXFJLFNBQVUsRUFDaEI3SCxNQUFNVCxFQUFNQyxHQUNaMEIsS0FBSzFCLE1BQVFBLEVBQ2IwQixLQUFLNEcsU0FBVyxJQUFJLEVBQUFDLFFBQ3BCN0csS0FBSzhHLFdBQWEsSUFBSSxFQUFBQyxjQUFjLEdBQ3BDL0csS0FBS2tDLFdBQVksSUFBQThFLE9BQU1oSCxLQUFLNEcsU0FBVTVHLEtBQUs4RyxhQUV6QixJQURBLElBQW1CakUsT0FFbkM3QyxLQUFLaUgsMkJBQTJCNUksRUFFcEMsQ0FFQSxnQkFBQTZJLENBQWlCQyxHQUFhLEdBQzVCLE9BQXNCLElBQWZBLEVBQXNCbkgsS0FBSzhHLFdBQWE5RyxLQUFLNEcsUUFDdEQsQ0FFQSwwQkFBQUssQ0FBMkIzRSxHQUN6QixNQUFNakUsRUFBT2lFLEdBU2IsUUFQcUIsTUFFTixLQURBLElBQUFnQyxVQUFTakcsRUFBTSxJQUFtQitJLDJCQUU3Q3ZILFFBQVFDLEtBQUssK0JBQStCekIsd0NBSXhCLElBQzFCLENBRUEsaUJBQUlnSixHQUNGLE9BQU9ySCxLQUFLOEcsVUFDZCxDQUVBLFdBQUlRLEdBQ0YsT0FBT3RILEtBQUs0RyxRQUNkLEUsd0dDM0JLLE1BQU1XLEVBMENYLFdBQUFuSixDQUFZb0osRUFBY2xKLEVBQVEsQ0FBQyxHQUNqQzBCLEtBQUtHLHFCQUFxQlEsS0FBS1gsTUFDL0JBLEtBQUt5SCx3QkFBd0JELEVBQWNsSixFQUFNTSxvQkFHakROLEVBQU1ELEtBQU9tSixFQUNibEosRUFBTW9KLG9CQUFnQ2pKLElBQWZILEVBQU1xSixLQUFxQixDQUFDLEdBQUdySixFQUFNRCxjQUFnQixHQUM1RTJCLEtBQUsxQixNQUFRQSxFQUViMEIsS0FBSzFCLE1BQU1zSixjQUFlLEVBQzFCNUgsS0FBSzFCLE1BQU1xSSxhQUNjbEksSUFBdkJ1QixLQUFLMUIsTUFBTXFJLFNBQWdDM0csS0FBSzFCLE1BQU1xSSxRQUd4RCxNQUFNa0IsT0FBK0NwSixJQUFwQnVCLEtBQUsxQixNQUFNcUosVUFJWCxJQUF0QjNILEtBQUsxQixNQUFNd0osT0FDcEI5SCxLQUFLMUIsTUFBTU8sa0JBQW9CbUIsS0FBSzFCLE1BQU13SixPQUUxQzlILEtBQUsxQixNQUFNTyx1QkFDd0JKLElBQWpDdUIsS0FBSzFCLE1BQU1PLGtCQUNQZ0osRUFDQTdILEtBQUsxQixNQUFNTyxrQkFHbkJtQixLQUFLK0gsMEJBQTRCLElBQUksSUFBb0IvSCxNQUN6REEsS0FBS2dJLDZCQUdMaEksS0FBS2lJLGtCQUFvQixJQUFtQkMsWUFDNUMsTUFBTWhHLEVBQVlsQyxLQUFLbUksa0JBQ3ZCbkksS0FBS29JLDJCQUE2QmIsRUFBUWEsMkJBQTJCekgsS0FBS1gsTUFDMUVBLEtBQUtrQyxVQUFZbEMsS0FBSzFCLE1BQU0yRCxTQUFXQyxFQUd2QyxNQUFNbUcsRUFBb0JySSxLQUFLaUksa0JBQWtCSyxVQUFVLGNBQ3JEQyxHQUEyQixJQUFBQyxRQUFPbEssRUFBTUQsS0FBTSxRQUNwRGdLLEVBQ0dJLE1BQUssSUFBQUMsUUFBT0gsSUFDWkksVUFBV3hKLEdBQVFhLEtBQUs0SSxxQkFBcUJ6SixHQUNsRCxDQUVBLGVBQUFnSixHQU9FLFlBTitCMUosSUFBM0J1QixLQUFLaUksbUJBQ1BwSSxRQUFRQyxLQUFLLHlDQUF5Q0UsS0FBSzFCLE1BQU1ELHNFQUsvQyxJQUZBMkIsS0FBS2lJLGtCQUFrQlksV0FBVzdJLEtBQUsxQixNQUFNRCxNQUd4RDJCLEtBQUtpSSxrQkFBa0JhLGdCQUFnQjlJLEtBQUsxQixNQUFNRCxLQUFNMkIsS0FBSzFCLE1BQU1PLG9CQUVsQyxJQUFqQ21CLEtBQUsxQixNQUFNTyxrQkFBNkIsSUFBSSxFQUFBa0ksY0FBYyxHQUFLLElBQUksRUFBQUYsT0FFOUUsQ0FPQSxvQkFBQWtDLEdBRUEsQ0FPQSxZQUFBaEosQ0FBYXpCLEVBQVEwQixLQUFLMUIsT0FDeEIsUUFBbUJHLElBQWZILEVBQU1xSixLQUFvQixDQUM1QixNQUFNeEcsRUFBUzJCLE9BQU9rRyxLQUFLaEosS0FBS2lKLGdCQUFnQixHQUdoRGpKLEtBQUt5QixtQkFBbUJOLEVBQVE3QyxFQUFNcUosS0FDeEMsQ0FDRixDQUVBLFdBQUloQixHQUNGLE9BQU8zRyxLQUFLMUIsTUFBTXFJLE9BQ3BCLENBRUEsZUFBSXJFLEdBQ0YsT0FBT3RDLEtBQUsxQixNQUFNRCxJQUNwQixDQU9BLFlBQUk0RCxHQUNGLE9BQU9qQyxLQUFLa0MsU0FDZCxDQUVBLGNBQUFnSCxRQVk0QnpLLElBQXRCdUIsS0FBSzFCLE1BQU02SyxRQVhHLENBQUNBLElBQ2UsVUFBNUJBLEVBQU8vSyxZQUFZQyxPQUNyQjhLLEVBQVMsQ0FBQ0EsSUFNWkEsRUFBTy9DLFFBSldnRCxHQUNULElBQUlBLEVBQVdwSixRQU94QnFKLENBQVVySixLQUFLMUIsTUFBTTZLLE9BRXpCLENBR0EsZ0JBQUFHLEdBQ0V0SixLQUFLa0osaUJBQ0xsSixLQUFLK0ksdUJBQ0wvSSxLQUFLb0ksNkJBQ0xwSSxLQUFLRCxlQUNMQyxLQUFLMUIsTUFBTXNKLGNBQWUsQ0FDNUIsQ0FFQSxpQ0FBT1EsQ0FBMkI5SixFQUFRMEIsS0FBSzFCLE1BQU9pTCxFQUFhdkosS0FBS2lKLGdCQUN0RSxNQUFNTyxHQUFvQixJQUFBQyxTQUFRRixHQUM1QkcsT0FBc0NqTCxLQUF4QixJQUFBeUgsTUFBSyxPQUFRNUgsR0FvQmpDLE9BbkJxRCxJQUF0QmtMLElBQThDLElBQWhCRSxJQVUzRHBMLEVBQU1PLG1CQUFvQixFQUMxQjBLLEVBVjJCLE1BQzNCLE1BQU0sS0FBRWxMLEdBQVNDLEVBQ1hxTCxFQUFZLEdBQUd0TCxVQUNyQixNQUFPLENBQ0wsQ0FBQ3NMLEdBQWFBLElBTUhDLFFBRWVuTCxJQUF4QnVCLEtBQUtpSixpQkFDUGpKLEtBQUtpSixlQUFpQk0sSUFLbkIsQ0FBRWpMLFFBQU9pTCxhQUNsQixDQUVBLFFBQUFNLENBQVNDLEdBQ1QsQ0FFQSx1QkFBQXJDLENBQXdCcEosRUFBTU8sRUFBcUIsSUFDakQsTUFBTW1MLEdBQWUsSUFBQUMsU0FBTyxJQUFBbEYsSUFBR1csUUFBUyxFQUFBd0UsU0FBVSxFQUFBQyxNQUM1Q0MsRUFBVXZMLEVBQW1CMkIsT0FBT1AsS0FBS0cscUJBQXFCOUIsSUFDOURtQixHQUFNLFNBQUt1SyxFQUFjSSxHQUV6QkMsR0FBTSxJQUFBM0csV0FBUyxJQUFBNEcsT0FESEMsSUFBTyxJQUFBQyxPQUFNRCxFQUFLQSxHQUNFOUssSUFDdENRLEtBQUtpSixlQUFpQm1CLENBQ3hCLENBRUEsMEJBQUFwQyxHQUNFLE1BQ00rQixHQUFlLElBQUFDLFNBQU8sSUFBQWxGLElBQUdXLFFBQVMsRUFBQXdFLFNBQVUsRUFBQUMsTUFDNUNNLEVBQXNDLENBQUNDLEVBQVd0TCxLQU10RHNGLE9BQU9pRyxXQUxTLEtBQ2lCLG1CQUFwQjFLLEtBQUt5SyxJQUNkNUssUUFBUUMsS0FBSyxJQUFJRSxLQUFLMUIsTUFBTUQsd0NBQXdDb00saUJBQXlCdEwsRUFBSSxPQUcxRSxNQVN2QndMLEdBQWdCLElBQUFYLFNBQU8sSUFBQWxGLElBQUdXLFNBQVMsSUFBQW1GLFFBakJ2QixvQkFXTXpMLElBQ3RCLE1BQU1zTCxHQUFZLElBQUFJLE9BQUssSUFBQUMsV0FBVSxHQUFJM0wsR0FFckMsT0FEQXFMLEVBQW9DQyxFQUFXdEwsR0FDeENzTCxJQVdUekssS0FBSytLLHNCQUF1QixJQUFBN0YsWUFBVSxTQU5wQi9GLEdBR1QsQ0FGSzRLLEVBQWE1SyxHQUNUd0wsRUFBYXhMLElBSXVCYSxLQUFLRyx3QkFHN0QsQ0F1QkEsb0JBQUFBLEdBQ0UsSUFBSVgsRUFBTSxHQUlWLE9BSEksSUFBQWMsTUFBSyxDQUFDLFFBQVMsUUFBU04sUUFDMUJSLEVBQU0sQ0FBQyxHQUFHUSxLQUFLMUIsTUFBTUQsZUFFaEJtQixDQUNULENBRUEsb0JBQUFvSixDQUFxQndCLEdBQ25CcEssS0FBS2dMLHFCQUFxQlosRUFDNUIsQ0FFQSw0QkFBQWEsQ0FBNkJiLEdBQzNCQSxFQUFJYyxVQUFXLEVBQ2YsTUFBTUMsRUFBWW5MLEtBQUtvTCxpQkFBaUJ6SyxLQUFLWCxNQUV2Q3lLLEdBQVksSUFBQW5LLE1BQUssQ0FBQyxPQUFRLFVBQVc4SixHQUNyQ2lCLEdBQVksSUFBQW5GLE1BQUt1RSxFQUFXekssS0FBSytLLHNCQUV2QyxJQUFJTyxFQUFLSCxFQVNULFlBUGtCMU0sSUFBZDRNLEdBQXlDLHFCQUFkQSxJQUVSLElBRDZCLG1CQUFyQnJMLEtBQUtxTCxNQUVoQ0MsRUFBS3RMLEtBQUtxTCxHQUFXMUssS0FBS1gsT0FJdkJzTCxDQUNULENBRUEsb0JBQUFOLENBQXFCWixHQUNuQixNQUFNbUIsR0FBVSxJQUFBQyxRQUFPcEIsRUFBSS9MLEtBQU0yQixLQUFLMUIsTUFBTUQsT0FDdEMsT0FBRThDLEVBQU0sUUFBRUcsRUFBTyxXQUFFRSxHQUFlNEksRUFBSXpDLEtBR3RDakcsRUFBVStKLElBQVUsQ0FDeEJqSSxNQUFPLEtBQU1rSSxPQUZLQyxFQUVNdkIsRUFBSXpDLE1BRkosSUFBQWxFLFVBQVMsQ0FBQ2tJLEVBQUcsQ0FBRXhLLFFBQVEsSUFBQStFLE1BQUssU0FBVXlGLEtBQU0sSUFBQXpGLE1BQUssVUFBV3lGLElBQUksSUFBQXpGLE1BQUssYUFBY3lGLEtBQTFGLElBQUNBLEdBS2xCakksVUFBVyxLQUNULE1BQU1DLEdBQWlCLFFBQWNyQyxHQUNyQyxPQUFPLElBQUFtQyxVQUFTLENBQ2QsQ0FBRW5DLFFBQVNxQyxHQUNYQSxFQUNBLENBQUV4QyxVQUNGLENBQUVLLGNBQ0YsQ0FBRWUsTUFBT2tKLE1BR2J0SyxTQUNBRyxVQUNBRSxhQUNBZSxNQUFPa0osSUFLVCxPQUFtQixJQUFaRixFQUhXLENBQUNuQixHQUFRQSxFQUFJd0IsV0FBV25ELE1BQUssSUFBQS9KLEtBQUlnRCxJQUNoRGlILFVBQVUzSSxLQUFLaUwsNkJBQTZCYixJQUVyQnlCLENBQVV6QixRQUFPMEIsQ0FDN0MsQ0FxQkEsZ0JBQUFWLENBQWlCVyxHQUNqQixDQTRCQSxrQkFBQXRLLENBQW1CTixFQUFRRyxFQUFTRSxFQUFhLENBQUMsRUFBR2UsRUFBUSxDQUFDLEVBQUd5SixFQUFPaE0sS0FBS2tDLFdBRzNFLE1BQU0rSixFQUFxQixJQUFJLElBQWVqTSxLQUFLMUIsTUFBTUQsS0FBTThDLEVBQVFHLEVBQVNFLEVBQVllLEdBTTVGeUosRUFBS0UsS0FBS0QsRUFDWixDQW1CQSxVQUFBRSxDQUFXN0osRUFBYThKLEdBbUJ0QixPQURXLElBQUFwQyxRQWpCWXFDLElBQUssVUFBd0IvSCxTQUFTK0gsR0FHckNBLElBQ3RCLE1BQU1MLEVBQU9oTSxLQUFLaUksa0JBQWtCSyxVQUFVK0QsR0FBR3BLLFNBT2pELE9BTkkrSixFQUFLTSxPQUNQTixFQUFLTSxPQUFPaEssWUFBY0EsRUFFMUIwSixFQUFLMUosWUFBY0EsT0FHQzdELElBQWxCMk4sRUFDS0osRUFBS3ZELE1BQUssSUFBQUMsUUFBTzBELElBR25CSixHQWRLSyxHQUFLeE0sUUFBUUMsS0FDdkIsZ0JBQWdCdU0sbUJBQW1CLFFBZ0JoQ2YsQ0FBR2hKLEVBQ1osQ0FPQSxhQUFBaUssQ0FBY0MsRUFBYUMsR0FBVyxHQUVwQyxNQUFNQyxFQUFxQkYsRUFBWTlOLElBQUlpTyxJQUN6QyxHQUFvQixpQkFBVEEsRUFBbUIsQ0FDNUIsTUFBTUMsRUFBUTVNLEtBQUttTSxXQUFXUSxHQUM5QixPQUFPRixFQUFXRyxFQUFNbkUsTUFBSyxJQUFBb0UsTUFBSyxJQUFNRCxDQUMxQyxDQUNBLE9BQU9ILEVBQVdFLEVBQUtsRSxNQUFLLElBQUFvRSxNQUFLLElBQU1GLElBSXpDLElBQUlHLEVBQ0osR0FBSUwsRUFDRkssR0FBWSxJQUFBQyxVQUFTTCxRQUVyQixHQUFrQyxJQUE5QkEsRUFBbUJqTixPQUNyQnFOLEVBQVksRUFBQUUsV0FDUCxHQUFrQyxJQUE5Qk4sRUFBbUJqTixPQUM1QnFOLEVBQVlKLEVBQW1CLE9BQzFCLENBQ0wsTUFBT08sS0FBV0MsR0FBU1IsRUFDM0JJLEVBQVlHLEVBQU94RSxNQUFLLElBQUEwRSxzQkFBcUJELEdBQy9DLENBS0YsT0FBT0osRUFBVXJFLE1BQ2YsSUFBQS9KLEtBQUkwTyxJQUNGLE1BQU1oRCxFQUFNLENBQUMsRUFPYixPQU5Bb0MsRUFBWXBHLFFBQVEsQ0FBQ3VHLEVBQU1VLEtBQ3pCLE1BQU1DLEVBQTBCLGlCQUFUWCxFQUFvQkEsRUFBTyxXQUFXVSxJQUc3RGpELEVBRmN1QyxHQUFNTCxRQUFRaEssYUFBZXFLLEdBQU1MLFFBQVFBLFFBQVFoSyxhQUM1Q2dMLEdBQ1ZGLEVBQVdDLEtBRWpCakQsSUFHYixDQUVBLDJCQUFPbUQsQ0FBcUJqUCxFQUFRLENBQUMsSUFDVixJQUFyQkEsRUFBTWtQLFlBQ1IsSUFBbUJDLGtCQUFrQm5QLEVBQU1nRSxZQUUvQyxFLDhEQ3hlRixNQUFNb0wsRUFBd0IsS0FBTSxDQUNsQ3BKLFNBQVcsS0FBeUMsSUFBbkMsSUFBbUJDLFlBQXVCLElBQW1CNkMseUJBQTJCLENBQUMsZ0JBQWlCLGFBQWMsaUJBQWtCLGdCQUt2SnVHLEVBQWtCLENBQUMsT0FBUSxTQUFVLFFBQVMsVUFBVyxVQUFXLGtCQUFtQixVQUN2RkMsRUFBNEIsQ0FBQyxTQUFVLE9BQVEsUUFBUyxXQUFZLFFBQ3BFQyxFQUF3QixDQUFDLGFBQWMsa0JBQW1CLFVBQVcsV0FBWSxhQUFjLHVCQUMvRkMsRUFBb0IsQ0FBQyxZQUFhLGlCQUt4QyxJQUFJQyxFQUFrQixHQUFRQyxFQUFzQixHQUFRQyxFQUFnQixLQUN4RUMsRUFBd0IsS0FBUUMsRUFBa0IsS0FBUUMsRUFBeUIsS0FBUUMsRUFBd0IsS0FDbkhDLEVBQW1CLEtBQVFDLEVBQWdCLEtBRS9DLFFBQWdCOVAsSUFBWixFQUFBaUIsY0FBd0NqQixJQUFmLEVBQUErUCxXQUEwQixDQUlyRFQsRUFBa0IsQ0FDaEIsQ0FDRVUsTUFBTyxxQ0FBcUNaLElBQzVDYSxVQUFXcE4sR0FBV29NLElBQXdCcEosU0FBU2hELEVBQVFqRCxPQUdqRSxDQUNFb1EsTUFBTyxxREFFUEMsVUFBV3BOLFFBbkJvQzdDLElBbUJQNkMsRUFBUXNLLFdBbkJmakQsV0FxQm5DLENBQ0U4RixNQUFPLDJDQUNQQyxVQUFXcE4sR0FBV3dNLEVBQWtCeEosU0FBU2hELEVBQVFILFVBTzdENk0sRUFBc0IsQ0FDcEIsQ0FDRVMsTUFBTyxrQ0FDUEMsV0FBVyxJQUFBaFAsVUFBUSxJQUFBb0YsSUFBR1csU0FBUyxJQUFBbkYsTUFBSyxDQUFDLE9BQVEsYUFBYyxXQUU3RCxDQUNFbU8sTUFBTywyQkFDUEMsV0FBVyxJQUFBaFAsVUFBUSxJQUFBb0YsSUFBR1csU0FDcEIsSUFBQW5GLE1BQUssQ0FBQyxPQUFRLGFBQWMsVUFPbEMyTixFQUFnQixXQUVkLE1BRHNCLEdBQ0QxTixPQUFPd04sR0FBaUJ4TixPQUFPeU4sRUFDdEQsRUFHQSxNQUFNVyxFQUF3QixDQUU1QixDQUNFRixNQUFPLHFDQUFxQ1osSUFDNUNhLFVBQVdwTixHQUFXb00sSUFBd0JwSixTQUFTaEQsRUFBUWpELE9BR2pFLENBQ0VvUSxNQUFPLDRDQUE0Q2QsSUFDbkRlLFVBQVdwTixHQUFXcU0sRUFBZ0JySixTQUFTaEQsRUFBUXNOLE9BRXpELENBQ0VILE1BQU8sdUNBQXVDYixJQUM5Q2MsVUFBV3BOLEdBQVdzTSxFQUEwQnRKLFNBQVNoRCxFQUFRdU4sT0FHbkUsQ0FDRUosTUFBTyw0QkFDUEMsVUFBV3BOLFFBQThCN0MsSUFBbkI2QyxFQUFRd04sU0FJbENYLEVBQWtCLFdBRWhCLE1BRHdCLEdBQ0Q1TixPQUFPb08sRUFDaEMsRUFFQVAsRUFBeUIsV0FRdkIsTUFQOEIsQ0FDNUIsQ0FDRUssTUFBTywrREFDUEMsVUFBV3BOLEdBQTRCLFlBQWpCQSxFQUFRc04sV0FDSW5RLElBQTlCNkMsRUFBUXFHLEtBQUtvSCxlQUdReE8sT0FBT29PLEVBQ3RDLEVBRUFOLEVBQXdCLFdBUXRCLE1BUDhCLENBQzVCLENBQ0VJLE1BQU8sc0NBQ1BDLFVBQVdwTixHQUE0QixXQUFqQkEsRUFBUXNOLFdBQzFCblEsSUFEK0M2QyxFQUFRcUcsT0FJbENwSCxPQUFPb08sRUFDdEMsRUFJQVQsRUFBd0IsV0FDdEIsT0FBT1MsRUFBc0JwTyxPQUFPd04sR0FDakN4TixPQUFPeU4sRUFDWixFQUlBTSxFQUFtQixXQVlqQixNQVh5QixHQVdEL04sT0FBT3dOLEdBQWlCeE4sT0FBT3lOLEVBQ3pELEVBT0FPLEVBQWdCLFdBQ2QsTUFBTVMsRUFBb0IsQ0FDeEIsQ0FDRVAsTUFBTyw0Q0FDUEMsVUFBV3BOLEdBQVdvTSxJQUF3QnBKLFNBQVNoRCxFQUFRakQsT0FFakUsQ0FDRW9RLE1BQU8scURBQ1BDLFVBQVdwTixHQUFXdU0sRUFBc0J2SixVQUMxQzJLLEVBQVUzTixFQUFRc0ssY0E1SUt4TixZQUFZQyxPQThJdkMsQ0FDRW9RLE1BQU8sMkNBQ1BDLFVBQVdwTixHQUFXd00sRUFBa0J4SixTQUFTaEQsRUFBUUgsVUFLN0QsTUFBTyxDQUNMK04sUUFBUyxDQUNQLENBQ0VDLEtBQU0sQ0FDSjlRLEtBQU0sYUFDTnVOLFdBQVksSUFBTSxJQUFJLEVBQUEvRSxRQUN0QjFGLE9BQVEsYUFFVmlPLFVBQVcsQ0FDVFAsS0FBTXBKLE9BQ05tRyxXQUFZLEVBQUE0QyxZQUFjLEVBQUEzSCxRQUMxQjFGLE9BQVFzRSxRQUVWNEosWUFBYUwsR0FFZixDQUNFRyxLQUFNLENBQ0o5USxLQUFNLE1BQ051TixXQUFZLElBQU0sSUFBSSxFQUFBL0UsUUFDdEIxRixPQUFRLGFBRVZpTyxVQUFXLENBQ1RQLEtBQU1wSixPQUNObUcsV0FBWSxFQUFBNEMsWUFBYyxFQUFBM0gsUUFDMUIxRixPQUFRc0UsUUFFVjRKLFlBQWFMLElBSXJCLENBQ0YsQyx3R0N6TEEsTUFBTU0sRUFBTyxJQUFJQyxJQUVWLE1BQU1DLEVBWVgsV0FBQXBSLEdBQ0U0QixLQUFLeVAsWUFDTEgsRUFBS3RMLElBQUksYUFBYyxJQUFJLEVBQUE2QyxTQUMzQjdHLEtBQUtvSCx1QkFBeUJvSSxFQUFZcEksdUJBQXVCekcsS0FBS1gsTUFDdEVBLEtBQUswUCxnQkFBa0JGLEVBQVlFLGdCQUFnQi9PLEtBQUtYLEtBQzFELENBRUEsT0FBSXRCLEdBQ0YsT0FBTzRRLENBQ1QsQ0FFQSxzQkFBT0ksR0FNTCxPQUFPM0ssTUFBTTRLLEtBQUtMLEVBTEUsQ0FBQ00sRUFBR0MsS0FHZixDQUFFQyxJQUZHRixFQUFFLEdBRUF6USxJQURGeVEsRUFBRSxHQUFHeFIsWUFBWUMsT0FJakMsQ0FFQSw2QkFBTytJLENBQXVCMkksR0FBa0IsR0FDOUMsTUFBTUMsRUFBV2hRLEtBQUswUCxrQkFDaEJPLEdBQWdCLElBQUFwTyxTQUFPLElBQUEyRyxRQUFPLGVBQWdCLFFBQzlDMEgsR0FBZ0IsSUFBQXhILFNBQU8sSUFBQUYsUUFBTyxlQUFnQixRQUU5QzJILElBRHlCLElBQXBCSixFQUEyQkcsRUFBZ0JELEdBQzNCRCxHQUMzQixPQUFPLElBQUFJLE9BQU0sQ0FBQyxPQUFRRCxFQUN4QixDQUVBLGlCQUFBRSxHQUNFLE9BQU9yUSxLQUFLb0gsd0JBQXVCLEVBQ3JDLENBRUEsdUJBQUFrSixHQUNFLE1BQU1OLEVBQVdoUSxLQUFLMFAsa0JBRWhCYSxHQURnQixJQUFBN0gsU0FBTyxJQUFBRixRQUFPLGVBQWdCLE9BQzdCMEgsQ0FBY0YsR0FFckMsR0FBSU8sRUFBZTlRLFFBQVUsRUFBRyxDQUM5QixNQUVNK1EsRUFBc0IsZ0NBRmlCLElBQTFCRCxFQUFlOVEsT0FBZSxjQUFnQiwwQ0FDaEQsSUFBQUMsVUFBUSxJQUFBK1EsTUFBSyxPQUFPLFVBQUssSUFBQXZLLE1BQUssUUFBOUIsQ0FBdUNxSyxLQUV4RDFRLFFBQVFDLEtBQUswUSxFQUNmLENBQ0YsQ0FFQSxJQUFBckIsR0FDRW5QLEtBQUswUSxtQkFDUCxDQUVBLGlCQUFBQSxHQUNFMVEsS0FBSzJRLFlBQWMsSUFBSSxJQUN2QnJCLEVBQUt0TCxJQUFJLGdCQUFpQmhFLEtBQUsyUSxhQUUvQjNRLEtBQUs0USxTQUFXLElBQUksSUFDcEJ0QixFQUFLdEwsSUFBSSxhQUFjaEUsS0FBSzRRLFVBRTVCNVEsS0FBSzZRLFVBQVksSUFBSSxJQUNyQnZCLEVBQUt0TCxJQUFJLGlCQUFrQmhFLEtBQUs2USxXQUVoQzdRLEtBQUs4USxvQkFBc0IsSUFBSSxJQUMvQnhCLEVBQUt0TCxJQUFJLG9CQUFxQmhFLEtBQUs4USxxQkFFbkM5USxLQUFLK1EsU0FBVyxJQUFJLElBQ3BCekIsRUFBS3RMLElBQUksYUFBY2hFLEtBQUsrUSxVQUU1Qi9RLEtBQUsyUSxZQUFZckgsbUJBQ2pCdEosS0FBSzZRLFVBQVV2SCxrQkFDakIsQ0FFQSxXQUFBMEgsQ0FBWWxCLEdBQ1ZSLEVBQUt4TCxJQUFJLE1BQU1rTixZQUFZbEIsRUFDN0IsQ0FFQSxjQUFBbUIsQ0FBZTlSLEdBQ2IsTUFBTWQsRUFBT2MsRUFBSW1ELFlBQ0VnTixFQUFLaEssSUFBSWpILEtBRUMsSUFBQXFCLFVBQVEsSUFBQXdSLFFBQU8sQ0FBQyxRQUFTLGlCQUFpQixHQUExQyxDQUFpRDVCLEVBQUt4TCxJQUFJekYsSUFFbkZ3QixRQUFRQyxLQUFLLCtCQUErQnpCLG9DQUtoRGlSLEVBQUt0TCxJQUFJM0YsRUFBTWMsR0FDZkEsRUFBSW1LLG1CQUNOLENBRUEsaUJBQUFoRyxDQUFrQmdILEdBQ2hCLE9BQU9nRixFQUFLeEwsSUFBSXdHLEdBQUtuSyxzQkFDdkIsQ0FFQSxlQUFBMkksQ0FBZ0J6SyxFQUFNOFMsR0FBa0IsR0FDdEMsTUFBTUMsR0FBa0MsSUFBcEJELEVBQTJCLGdCQUFrQixVQUVqRSxPQUFPN0IsRUFBS3hMLElBQUl6RixHQUFNK1MsRUFDeEIsQ0FFQSxVQUFBdkksQ0FBV3hLLEdBQ1QsWUFBMEJJLElBQW5CNlEsRUFBS3hMLElBQUl6RixFQUNsQixDQUVBLFNBQUFpSyxDQUFVakssR0FLUixPQUo4QixJQUExQjJCLEtBQUs2SSxXQUFXeEssSUFDbEJpUixFQUFLdEwsSUFBSTNGLEVBQU0sSUFBSSxJQUFhQSxJQUczQmlSLEVBQUt4TCxJQUFJekYsRUFDbEIsQ0FFQSxTQUFBb1IsR0FTQSxFLHdDQzlJSyxNQUFNNEIsVUFBdUIsSUFpQmxDLFdBQUFqVCxDQUFZRSxFQUFRLENBQUMsR0FDbkJRLE1BQU0sYUFBY1IsRUFDdEIsQ0FFQSxvQkFBQTZCLEdBQ0UsTUFBTyxDQUNMLDRCQUNBLDRCQUVKLENBRUEsZ0JBQUFpTCxDQUFpQmhCLEdBQ2YsTUFBTSxPQUFFakosRUFBTSxXQUFFSyxHQUFlNEksRUFDekI5SSxFQUFVRSxFQUNoQkYsRUFBUUgsT0FBU0EsRUFDakJuQixLQUFLc1IsWUFBWW5RLEVBQVFHLEVBQzNCLENBRUEsV0FBQWdRLENBQVkzSCxFQUFXckksRUFBVSxDQUFDLEdBQ2hDLE1BQU1ILEVBQVNuQixLQUFLaUosZUFBZVUsR0FDN0JuSSxFQUFhLENBQUMsRUFHcEJpRCxPQUFPaUcsV0FEYSxJQUFNMUssS0FBS3lCLG1CQUFtQk4sRUFBUUcsRUFBU0UsT0FEckQvQyxHQUVpQixFQUNqQyxFLHlDQ3pDSyxNQUFNOFMsVUFBOEIsSUFpQnpDLFdBQUFuVCxDQUFZRSxFQUFRLENBQUMsR0FDbkJRLE1BQU0sb0JBQXFCUixFQUM3QixDQUVBLG9CQUFBNkIsR0FDRSxNQUFPLENBQ0wsbUNBQ0EsbUNBRUosQ0FFQSxnQkFBQWlMLENBQWlCaEIsR0FDZixNQUFNLE9BQUVqSixFQUFNLFdBQUVLLEdBQWU0SSxFQUN6QjlJLEVBQVVFLEVBQ2hCRixFQUFRSCxPQUFTQSxFQUNqQm5CLEtBQUtzUixZQUFZblEsRUFBUUcsRUFDM0IsQ0FFQSxXQUFBZ1EsQ0FBWTNILEVBQVdySSxFQUFVLENBQUMsR0FDaEMsTUFBTUgsRUFBU25CLEtBQUtpSixlQUFlVSxHQUM3Qm5JLEVBQWEsQ0FBQyxFQUdwQmlELE9BQU9pRyxXQURhLElBQU0xSyxLQUFLeUIsbUJBQW1CTixFQUFRRyxFQUFTRSxPQURyRC9DLEdBRWlCLEVBQ2pDLEUsOEZDSEssTUFBTStTLFVBQTBCLElBQ3JDLFdBQUFwVCxDQUFZQyxFQUFPLGdCQUFpQkMsRUFBUSxDQUFDLEdBK0YzQ0EsRUFBTU8sbUJBQW9CLEVBQzFCQyxNQUFNLGdCQUFpQlIsR0FDdkIwQixLQUFLeUgsMEJBQ0x6SCxLQUFLeVIsZ0JBQWtCelIsS0FBSzBSLGlCQUM1QjFSLEtBQUsyUixvQkFDTDNSLEtBQUs0UixhQUFlLElBQUksRUFBQTdLLGNBQWMsR0FDdEMvRyxLQUFLa0MsVUFBWWxDLEtBQUs0UixhQUFhbkosTUFBSyxJQUFBL0osS0FBSW1ULEdBQVE3UixLQUFLOFIsVUFBVUQsS0FDbkU3UixLQUFLK1IscUJBQXVCLElBQXVCQSxzQkFDckQsQ0FFQSxrQkFBQUMsSUFHcUIsSUFEa0QsU0FBbEQsSUFBbUJDLE9BQU9DLFNBQVNDLE1BQU10RCxRQUUxRCxJQUFtQm9ELE9BQU9DLFNBQVNDLE1BQU10RCxLQUFPLFFBQ2hELElBQW1Cb0QsT0FBT0MsU0FBU0MsTUFBTUMsUUFBUyxFQUV0RCxDQUVBLFlBQUFyUyxHQUNFQyxLQUFLZ1MscUJBQ0xoUyxLQUFLcVMsWUFDUCxDQUVBLHVCQUFBNUssR0FDRSxNQUFNakksRUFBTVEsS0FBS0csdUJBRVhpSyxHQUFNLElBQUEzRyxXQUFTLElBQUE0RyxPQURIQyxJQUFPLElBQUFDLE9BQU1ELEVBQUtBLEdBQ0U5SyxJQUN0Q1EsS0FBS2lKLGVBQWlCbUIsQ0FDeEIsQ0FFQSxvQkFBQWpLLEdBQ0UsTUFBTyxDQUNMLCtCQUNBLDZCQUNBLHFDQUNBLENBQUMsb0NBQXFDLHFCQUUxQyxDQUVBLGlCQUFBbVMsQ0FBa0I5TCxHQUNoQixNQUFNK0wsR0FBZ0IsSUFBQTNTLE1BQUssQ0FBQyxTQUFVLFdBQVksU0FBVSxRQUFTNEcsRUFBRWxGLFNBRXZFLElBQW1CMlEsT0FBT0MsU0FBU0MsT0FBUSxJQUFBSyxZQUFXLElBQW1CUCxPQUFPQyxTQUFTQyxNQUFPSSxHQUVoRyxJQUFtQkUscUJBRW5CLE1BQU1DLEVBQWMxUyxLQUFLMFIsaUJBSXpCZ0IsRUFBWUMsU0FBVyxJQUFJRCxHQUFhRSxrQkFFeEM1UyxLQUFLeVIsZ0JBQWtCaUIsRUFDdkIxUyxLQUFLNlMsa0NBRUw3UyxLQUFLeUIsbUJBUlUscUNBUWlCaVIsRUFBYSxDQUFDLEVBQUcsQ0FBQyxFQUFHMVMsS0FBSzRSLGFBQzVELENBRUEsY0FBQUYsR0FDRSxNQUFNb0IsRUFBYyxJQUFtQmIsT0FDakNTLEdBQWMsSUFBQXBTLE1BQUssQ0FBQyxXQUFZLFNBQVV3UyxHQUN2QixVQUFyQkosRUFBWTdELE9BQ2Q2RCxFQUFZTixRQUFTLEdBR3ZCLE1BQU01UyxFQUFNLElBQXVCdVQsb0JBQW9CTCxFQUFZTSxRQUVuRSxPQURBTixFQUFZTyxVQUFZelQsRUFDakJrVCxDQUNULENBRUEsVUFBQUwsR0FDRXJTLEtBQUtrVCxpQkFBbUIsSUFBSSxFQUFBbk0sY0FBYyxHQUMxQy9HLEtBQUttVCx3QkFBbUIxVSxFQUFXdUIsS0FBS3lSLGdCQUFzQixnQ0FFOUQsSUFBdUIyQixxQkFBcUJwVCxLQUFLbVQsbUJBQW1CeFMsS0FBS1gsT0FFekVBLEtBQUtrQyxXQUFZLElBQUE4RSxPQUFNaEgsS0FBS2tULGlCQUMxQmxULEtBQUs0UixhQUNULENBRUEsU0FBQUUsQ0FBVW5LLEVBQU0wTCxHQUFjLEdBRTVCLE9BREExTCxFQUFLeEcsT0FBUyw2QkFDUHdHLENBQ1QsQ0FFQSxpQkFBTzJMLENBQVdoUyxHQUNoQixNQUFNaVMsR0FBWSxJQUFBQyxVQUFTLENBQUMsY0FFNUIsT0FEaUIsSUFBQUMsTUFBS0YsR0FBVyxJQUFBRyxNQUFLLENBQUMsU0FDaENDLENBQVNyUyxFQUNsQixDQUVBLHlCQUFPNlIsQ0FBbUJwUyxFQUFLa1IsRUFBU2pTLEtBQUt5UixnQkFBaUJtQyxHQUM1RCxNQUFNelMsT0FBa0IxQyxJQUFUbVYsRUFDWEEsRUFDQTVULEtBQUtpSixlQUFlNEssMkJBR2xCQyxHQUFhLElBQUF4VCxNQUFLLENBQUMsUUFBUyxjQUFlUyxHQUMzQ2dULEdBQTRDLEtBQTNCLElBQUFqUCxJQUFHa1AsT0FBUUYsR0FDbEMsSUFBSXhTLEVBQVV0QixLQUFLaVUsa0JBQWtCaEMsRUFBUThCLElBQ3RCLElBQW5CQSxJQUNGelMsRUFBUTRTLFdBQWFKLEdBR1YsaUNBQVRGLElBQ0Z0UyxFQUFRcVIsVUFBVyxJQUFBek0sTUFBSyxtQkFBb0IrTCxHQUs1Q25QLE9BQU9nRCxlQUFleEUsRUFBUyxZQUFhLENBQzFDLEdBQUF3QyxHQUVFLE9BQU85RCxLQUFLMlMsUUFDZCxFQUNBLEdBQUEzTyxDQUFJbVEsR0FDRnRVLFFBQVFDLEtBQUssb0VBR2YsRUFDQXNVLFlBQVksS0FHaEIsTUFBTUMsRUFBY3JVLEtBQUsrUixxQkFBcUJ1QyxRQUFRaFQsRUFBUWlULFVBQVdqVCxFQUFRa1QsT0FDakZsVCxHQUFVLGdCQUFPQSxFQUFTK1MsR0FDMUJyVSxLQUFLeUIsbUJBQW1CTixFQUFRRyxPQUFTN0MsRUFBV3NDLEVBQUtmLEtBQUs0UixhQUNoRSxDQUVBLG1DQUFPNkMsQ0FBNkJuVCxHQUNsQyxPQUFPQSxDQUNULENBRUEsMkJBQU9vVCxDQUFxQjNJLEdBQzFCLE1BRU00SSxHQURhLElBQUFqVixVQUFRLGFBQVksSUFBQWtWLE1BRDVCLGtDQUN1QyxFQUFBNUwsTUFBTSxJQUFBOUMsTUFBSyxXQUMxQzJPLENBQVc5SSxHQUM5QixHQUFJNEksRUFBV2xWLFFBQVUsRUFBRyxDQUMxQixNQUFNc0IsR0FBTSxJQUFBbUYsTUFBSyxRQUFTNkYsR0FDMUIsUUFBWXROLElBQVJzQyxFQUFtQixDQUNyQixNQUFNK1QsRUFBZSxDQUFDQyxFQUFPQyxFQUFJQyxFQUFJQyxFQUFJQyxJQUFPMVAsT0FBT3dQLEdBQUlHLGNBQWdCRixFQUFLQyxFQUMxRUUsR0FBbUIsSUFBQUMsU0FBUSxrQ0FBbUNSLEdBQzlEUyxFQUFhOUssSUFDakIsTUFBTStLLEVBQUlILEVBQWlCNUssUUFDWmhNLElBQVhzQyxFQUFJeVUsSUFBb0J6VSxFQUFJeVUsTUFFbENiLEVBQVd2TyxRQUFRbVAsRUFDckIsQ0FDRixDQUVBLE9BQU94SixDQUNULENBRUEsdUJBQU8wSixDQUFpQkMsRUFBSWpFLEVBQWtCelIsS0FBS3lSLGdCQUFpQmtFLEdBR2xFLElBQWlCLEtBRkEsSUFBQWpXLFVBQVEsSUFBQThMLFFBQU8sU0FBUyxJQUFBbEwsTUFBSyxDQUFDLFVBQVcsYUFBekMsQ0FBdURvVixHQUd0RSxPQUFPQSxFQUVULE1BQU03UyxPQUFzQnBFLElBQWRrWCxFQUEwQkEsR0FBeUMsSUFBN0IsSUFBbUI5UyxPQUNqRSxRQUFFdkIsR0FBWW9VLEVBYXBCLElBQUlFLEVBQU8sRUFDWCxNQUFNQyxFQUFxQixDQUFDQyxFQUFNLEdBQUl0VyxLQUVwQyxNQUFNTCxFQUFNSyxFQUFJLElBQ1YsVUFBRXVXLEdBQWM1VyxFQUNoQjZXLEdBQVksSUFBQTlQLE1BQUssWUFBYTZQLEdBQzlCRSxFQWpCVyxDQUFDRixJQUNsQixNQUFNQyxHQUFZLElBQUE5UCxNQUFLLFlBQWE2UCxHQUNwQyxHQUFJQyxFQUFXLENBQ2IsTUFBTUUsR0FBVSxJQUFBeFcsU0FBUSxFQUFBc0osTUFBTSxJQUFBMEssTUFBSyxDQUFDLGNBQXBCLENBQW1DcUMsR0FDN0NFLEVBQWUzVSxFQUFRMFUsR0FDdkJHLEVBQU9DLEdBQVUsSUFBSUMsT0FBTyxJQUFJRCxNQUFXeEIsS0FBS3FCLEdBRXRELE9BRGlCLElBQUFLLE1BQUtILEVBQU1ELEVBRTlCLEdBU3FCSyxDQUFXUixHQUMxQi9RLEdBQVEsSUFBQUYsSUFBR2hDLE9BQVEzRCxHQUNuQjBGLEdBQVEsSUFBQUMsSUFBR0MsTUFBTzVGLEdBR3hCLEdBREF5VyxHQUFjLEdBRFksSUFBVjVRLElBQTRCLElBQVZILEVBRXJCLENBQ1gsTUFBTTJSLEVBQWdCVCxFQUFVRSxHQUU1Qk8sR0FDRixJQUFBOVcsU0FBUSxFQUFBK1csU0FBUyxJQUFBQyxRQUFPYixFQUFvQkMsR0FBTSxFQUFBM1EsUUFBbEQsQ0FBMkQsQ0FBRXFSLGtCQUdoRCxJQUFUWixFQUNFL1MsR0FDRmhELFFBQVFDLEtBQUssMkVBQTJFa1csT0FHMUZGLEVBQUlhLEtBQUtYLEVBR2YsQ0FDQSxPQUFPRixJQUdILE9BQUU5QyxHQUFXdkIsRUFFYm1GLEdBQWlCLElBQUFsWCxTQUFRLEVBQUErVyxTQUFTLElBQUFDLFFBQU9iLEVBQW9CLElBQUssRUFBQTFRLFFBQWpELENBQTBELENBQUU2TixXQUVuRixHQUE4QixJQUExQjRELEVBQWVuWCxPQUFjLENBQy9CLE1BQU1vWCxFQUFjRCxFQUFlLEdBQ25DbEIsRUFBR3BVLFFBQVF1VixHQUFlLEVBQzVCLENBTUEsT0FBT25CLENBQ1QsQ0FFQSxnQkFBQXRLLENBQWlCc0ssR0FDZixNQUFNdlUsRUFBU3VVLEVBQUd2VSxRQUFVbkIsS0FBS2lKLGVBQWU0SywyQkFhNUM2QixHQUFJbFUsWUFBWXNWLElBQUlDLFVBQ3RCckIsRUFBR3BVLFFBWkwsU0FBOEIwVixHQUM1QixNQUFNNU0sRUFBTSxDQUFDLEVBQ2IsSUFBSyxNQUFNMEYsS0FBT2tILEVBRVpsVSxPQUFPQyxVQUFVQyxlQUFlQyxLQUFLK1QsRUFBY2xILEtBQ3JEMUYsRUFBSTBGLEdBQU9rSCxFQUFhbEgsSUFHNUIsT0FBTzFGLENBQ1QsQ0FHZTZNLENBQXFCdkIsR0FBSWxVLFlBQVlzVixJQUFJQyxVQUFZckIsRUFBR3BVLFNBS3ZFa1EsRUFBa0JrRCxxQkFBcUJnQixHQUN2Q0EsRUFBSzFWLEtBQUt5VixpQkFBaUJDLEdBQzNCLElBQUlwVSxFQUFVdEIsS0FBS2tYLGtCQUFrQnhCLEdBRXJDLE1BQU1sVSxHQUFhLElBQUEwRSxNQUFLLGFBQWN3UCxHQUNoQ25ULEdBQVEsSUFBQTJELE1BQUssUUFBU3dQLEdBQ3RCeUIsR0FBc0I3VixFQUFROFYsU0FDOUIvQyxFQUFjclUsS0FBSytSLHFCQUFxQnVDLFFBQVFoVCxFQUFRaVQsVUFBV2pULEVBQVFrVCxPQUVqRmxULEdBQVUsZ0JBQU9BLEVBQVMrUyxHQUMxQnJVLEtBQUtxWCxnQkFBZ0IvVixFQUFTNlYsR0FFOUI3VixFQUFVa1EsRUFBa0I4QixXQUFXaFMsR0FFdkN0QixLQUFLeUIsbUJBQW1CTixFQUFRRyxFQUFTRSxFQUFZZSxFQUNuRHZDLEtBQUs0UixhQUNULENBRUEsd0NBQU8wRixDQUFrQ0MsRUFBWUMsR0FHbkQsT0FGcUIsSUFBQXhPLE1BQUt3TyxFQUc1QixDQUVBLGVBQUFILENBQWdCL1YsRUFBU21XLEdBQWtCLElBQ2pCLElBQXBCQSxHQUNGelgsS0FBSzBYLGtCQUFrQnBXLEVBRTNCLENBRUEsb0JBQU9xVyxHQUNMLE1BQU8sNEJBQ1QsQ0FFQSx3QkFBT0MsQ0FBa0JDLEdBQ3ZCLE9BQXFCLElBQWRBLEdBQTRDLElBQXJCN1gsS0FBSzhYLFdBQ3JDLENBRUEsb0JBQU9DLENBQWNGLEdBQVksR0FDL0IsWUFBeUJwWixJQUFyQnVCLEtBQUs4WCxhQUNQOVgsS0FBSzhYLFlBQWMsRUFDWjlYLEtBQUs4WCxlQUVJLElBQWRELElBQ0Y3WCxLQUFLOFgsYUFBZSxHQUVmOVgsS0FBSzhYLFlBQ2QsQ0FFQSw0QkFBT0UsQ0FBc0IvRixFQUFTalMsS0FBS3lSLGdCQUFpQm9HLEdBQVksR0FNdEUsTUFBTyxDQUFFM0QsV0FMVWxVLEtBQUsrWCxjQUFjRixHQUtqQkksV0FKRmpZLEtBQUs0WCxrQkFBa0JDLEdBSVR6RixPQUhsQkgsRUFBT0csT0FHbUJ5RixZQUFXVCxTQUZuQ25GLEVBQU9tRixTQUVzQ2MsVUFENUNqRyxFQUFPcEQsS0FFM0IsQ0FFQSx3QkFBT3FJLENBQWtCeEIsRUFBSXpELEVBQVNqUyxLQUFLeVIsaUJBQ3pDLElBQUk4QyxHQUFZLElBQUFyTyxNQUFLLFVBQVd3UCxHQUVoQyxNQUFNNkIsRUFBYXZYLEtBQUttWSxzQkFBc0I1RCxFQUFXdEMsR0FHbkRtRyxFQUFvQixDQUFDQyxFQUFLQyxLQUFXLElBQUFqWSxXQUFVaVksR0FBUSxJQUFBcFMsTUFBS21TLEVBQUtwRyxJQUNqRXNHLEVBQWFILEVBQWtCLE9BQVEsU0FDdkNJLEVBQWVKLEVBQWtCLFVBQVUsR0FDM0NLLEVBQWdCLElBQTBCQywwQkFBMEJuQixHQUNwRW9CLEVBQWMzWSxLQUFLNFksdUJBQXVCTCxFQUFZQyxFQUFjQyxJQUVwRSxjQUFFSSxFQUFhLE1BQUVyRSxHQUFVbUUsRUFFakNwRSxHQUFZLGdCQUFPb0UsRUFBWXBFLFVBQVdBLEdBRTFDLE1BQU0sV0FBRUwsRUFBVSxXQUFFK0QsRUFBVSxPQUFFN0YsRUFBTSxVQUFFeUYsRUFBUyxTQUFFVCxFQUFRLFVBQUVjLEdBQWNsWSxLQUFLZ1ksc0JBQzlFL0YsR0FDRixNQUFPLENBQ0xnRyxhQUNBL0QsYUFDQTJFLGdCQUNBckUsUUFDQUQsWUFDQWdELGFBQ0FuRixTQUNBZ0YsV0FDQVMsWUFDQUssWUFFSixDQUVBLHdCQUFPakUsQ0FBa0JoQyxFQUFTalMsS0FBS3lSLGdCQUFpQm9HLEdBQVksR0FDbEUsTUFBTWhKLEVBQU9vRCxFQUFPcEQsS0FDZGlLLEdBQStCLElBQWxCN0csRUFBT0csT0FDcEI5SCxFQUFNLElBQTBCeU8scUJBQXFCbEssRUFBTWlLLElBQzNELE1BQUV0RSxFQUFLLGNBQUVxRSxFQUFhLFVBQUV0RSxFQUFTLFdBQUVnRCxHQUFlL0YsRUFBa0J3SCxzQkFDeEUxTyxFQUFLMkgsRUFBUXBELElBQ1QsV0FBRXFGLEVBQVUsV0FBRStELEVBQVUsT0FBRTdGLEVBQU0sVUFBRThGLEVBQVMsU0FBRWQsR0FBYXBYLEtBQUtnWSxzQkFDbkUvRixFQUFRNEYsR0FjVixNQVpZLENBQ1ZJLGFBQ0EvRCxhQUNBMkUsZ0JBQ0FyRSxRQUNBRCxZQUNBZ0QsYUFDQW5GLFNBQ0FnRixXQUNBUyxZQUNBSyxZQUdKLENBRUEsNkJBQU9VLENBQXVCSyxFQUFJLFFBQVM3RyxFQUFTcFMsS0FBS3lSLGdCQUFnQlcsT0FBUThHLEVBQU16VSxPQUFPUixVQUM1RixNQUFNNEssT0FBZ0NwUSxJQUF6QnVCLEtBQUt5UixnQkFDZHpSLEtBQUt5UixnQkFBZ0I1QyxLQUNyQm9LLEVBRUUzTyxFQUFNLElBQTBCeU8scUJBQXFCbEssRUFBTXVELEVBQVE4RyxJQUNuRSxNQUFFMUUsRUFBSyxjQUFFcUUsRUFBYSxVQUFFdEUsRUFBUyxXQUFFZ0QsR0FBZXZYLEtBQUtnWixzQkFDM0QxTyxFQUFLdEssS0FBS3lSLGdCQUFpQjVDLEdBRTdCLE1BQU8sQ0FBRTJGLFFBQU9xRSxnQkFBZXRFLFlBQVdnRCxhQUFZcFcsT0FEdkNuQixLQUFLMlgsZ0JBRXRCLENBRUEsc0JBQU96VCxHQVdMLE9BQU8sSUFBQU0sU0FWbUIsQ0FDeEIsT0FDQSxTQUNBLFdBQ0EsT0FDQSxXQUNBLE9BQ0EsV0FDQSxTQUNBLFFBQ2dDQyxPQUFPUixTQUMzQyxDQUVBLDRCQUFPa1UsQ0FBc0JnQixFQUFZekcsRUFBYXVHLEdBQ3BELE1BQU1wSyxPQUFhcFEsSUFBTndhLEVBQWtCQSxFQUFJdkcsRUFBWTdELEtBRS9DLE9BRFksSUFBMEJ1SyxxQkFBcUJELEVBQVl6RyxFQUFhN0QsRUFFdEYsQ0FFQSw0QkFBT21LLENBQXNCMU8sRUFBS29JLEVBQWF1RyxHQUM3QyxNQUFNcEssT0FBYXBRLElBQU53YSxFQUFrQkEsRUFBSXZHLEVBQVk3RCxLQUUvQyxPQURZLElBQTBCd0sscUJBQXFCL08sRUFBS29JLEVBQWE3RCxFQUUvRSxDQUVBLGtCQUFBeUssQ0FBbUJoUCxFQUFLOEgsR0FBUyxHQUMvQixNQUFNbUgsR0FBYyxJQUFBOVAsU0FBUWEsR0FLNUIsT0FBNEIsS0FKZ0IsSUFBaEJpUCxJQUFtQyxJQUFYbkgsS0FJUSxLQUhoQixJQUFoQm1ILElBQW1DLElBQVhuSCxHQUkzQyxLQUNtQixLQUpTLElBQWhCbUgsSUFBb0MsSUFBWG5ILElBS3JDLElBQUE3UixRQUFPLElBQUsrSixHQUVkQSxDQUNULENBRUEsc0JBQU9rUCxDQUFnQmxQLEdBRXJCLE9BQU9BLEVBQUlnTCxRQURBLGFBQ1ksS0FDekIsQ0FFQSxpQkFBQW9DLENBQWtCK0IsR0FDaEIsSUFBSSxPQUFFckgsRUFBTSxXQUFFbUYsRUFBVSxVQUFFVyxHQUFjdUIsRUFDeENsQyxFQUFhdlgsS0FBS3NaLG1CQUFtQi9CLEVBQVluRixHQUNqRCxNQUFNLFdBQUU4QixHQUFldUYsRUFDdkIsSUFBZSxJQUFYckgsR0FBaUMsVUFBZDhGLEVBRXJCWCxFQURpQi9GLEVBQWtCZ0ksZ0JBQWdCL1UsT0FBT1IsU0FBU3lWLFVBQzNDbkMsRUFDeEI5UyxPQUFPa1YsUUFBUUMsVUFBVSxDQUFFMUYsY0FBYyxHQUFJcUQsT0FDeEMsQ0FDTCxNQUFNc0MsR0FBZ0IsSUFBQUMsT0FDcEIsSUFBQXBhLFVBQVEsSUFBQXFhLGFBQVcsSUFBQXZPLFFBQU8sTUFBTyxFQUFBdEIsT0FBTyxJQUFBM0osUUFBTyxJQUFLLEVBQUF5WixLQUN0RHZWLE9BQU9rVixRQUFRQyxVQUFVLENBQUUxRixjQUFjLEdBQUkyRixFQUFjdEMsR0FDN0QsQ0FDRixDQUVBLGlCQUFBMEMsR0FDRSxPQUFPeFYsT0FBT1IsU0FBU3lWLFFBQ3pCLENBRUEsaUJBQUEvSCxHQUNFM1IsS0FBS3lWLGlCQUFtQmpFLEVBQWtCaUUsaUJBQWlCOVUsS0FBS1gsTUFDaEVBLEtBQUs0WCxrQkFBb0JwRyxFQUFrQm9HLGtCQUFrQmpYLEtBQUtYLE1BQ2xFQSxLQUFLNFksdUJBQXlCcEgsRUFBa0JvSCx1QkFBdUJqWSxLQUNyRVgsTUFDRkEsS0FBS21ULG1CQUFxQjNCLEVBQWtCMkIsbUJBQW1CeFMsS0FBS1gsTUFDcEVBLEtBQUtpVSxrQkFBb0J6QyxFQUFrQnlDLGtCQUFrQnRULEtBQUtYLE1BQ2xFQSxLQUFLZ1osc0JBQXdCeEgsRUFBa0J3SCxzQkFBc0JyWSxLQUFLWCxNQUMxRUEsS0FBS2tFLGdCQUFrQnNOLEVBQWtCdE4sZ0JBQWdCdkQsS0FBS1gsTUFDOURBLEtBQUsyWCxjQUFnQm5HLEVBQWtCbUcsY0FBY2hYLEtBQUtYLE1BQzFEQSxLQUFLa1gsa0JBQW9CMUYsRUFBa0IwRixrQkFBa0J2VyxLQUFLWCxNQUNsRUEsS0FBSytYLGNBQWdCdkcsRUFBa0J1RyxjQUFjcFgsS0FBS1gsTUFDMURBLEtBQUtnWSxzQkFBd0J4RyxFQUFrQndHLHNCQUFzQnJYLEtBQUtYLE1BQzFFQSxLQUFLNlMsaUNBQ1AsQ0FFQSwrQkFBQUEsR0FDRSxNQUFNcUgsR0FBa0IsSUFBQUMsUUFBTyxFQUFHM0ksRUFBa0IyRyx1QkFDcERuWSxLQUFLbVksc0JBQXdCK0IsRUFBZ0IsRUFBQUYsR0FBSWhhLEtBQUt5UixnQkFDcER6UixLQUFLeVIsZ0JBQWdCNUMsS0FDekIsRSw2RUNua0JLLE1BQU11TCxVQUF1QixJQWlCbEMsV0FBQWhjLENBQVlDLEVBQU8sYUFBY0MsRUFBUSxDQUFDLEdBQ3hDQSxFQUFNTyxtQkFBb0IsRUFDMUJDLE1BQU1ULEVBQU1DLEdBQ1owQixLQUFLcWEsaUJBQWtCLEVBQ3ZCcmEsS0FBS3NhLFdBQWEsRUFDcEIsQ0FFQSxvQkFBQW5hLEdBQ0UsTUFBTyxDQUNMLG9DQUNBLHlCQUNBLDRCQUNBLDRCQUNBLDhCQUNBLHNDQUNBLG1DQUNBLGdDQUNBLHNDQUNBLGtDQUNBLGdDQUNBLDRCQUNBLDhCQUNBLDRCQUNBLCtCQUNBLCtCQUNBLGdDQUNBLDhCQUNBLDJCQUNBLHdCQUNBLDRCQUNBLHFDQUNBLDBCQUNBLDJCQUNBLGtDQUNBLDBCQUNBLHlCQUNBLHlCQUNBLDJCQUNBLDRCQUNBLGtDQUNBLG9DQUNBLHFDQUNBLDJCQUNBLHlDQUNBLGlDQUNBLCtCQUNBLHdCQUNBLDZCQUNBLHVCQUNBLCtCQUNBLDRCQUNBLGdDQUNBLGdDQUNBLHFDQUNBLHdCQUNBLDJCQUNBLDZCQUNBLDZCQUNBLDRCQUNBLDZCQUNBLHdCQUNBLGtDQUNBLDJCQUNBLHVCQUNBLDRCQUNBLHlCQUNBLHlDQUNBLHlCQUNBLHlCQUNBLDJCQUNBLDRCQUNBLDRCQUNBLG9DQUNBLG1DQUNBLG9DQUNBLHVDQUNBLHdDQUNBLGlDQUNBLDhCQUNBLGdDQUNBLHFDQUNBLDhCQUNBLGdDQUNBLHFDQUNBLDRDQUNBLDJDQUNBLHlCQUNBLHNDQUNBLDJCQUNBLDJCQUNBLDJCQUNBLHlCQUNBLGtDQUNBLHlDQUNBLHdCQUNBLDhCQUNBLGtDQUNBLDJCQUNBLDZCQUNBLHNDQUNBLHdCQUNBLHNDQUNBLDJCQUNBLGdDQUNBLDZCQUNBLDhCQUNBLDhCQUNBLDZCQUNBLDRCQUNBLDZCQUNBLDJCQUNBLHdCQUNBLHFDQUNBLDJCQUNBLHFDQUNBLDJCQUNBLDBCQUNBLHdCQUNBLHFDQUNBLDRCQUNBLDRCQUNBLHlCQUNBLHlCQUNBLHFDQUNBLHVDQUNBLHdCQUNBLDJCQUNBLGlDQUNBLCtCQUNBLGdDQUNBLGdDQUNBLHFDQUNBLG9DQUNBLCtCQUNBLDhCQUNBLCtCQUNBLDZCQUNBLDRCQUNBLDRCQUNBLHdCQUNBLDBDQUNBLDhCQUNBLG9DQUNBLG9DQUNBLCtCQUNBLGdDQUNBLCtCQUNBLHlCQUNBLDBCQUNBLDRDQUNBLDBCQUNBLDBCQUNBLDBCQUNBLDBCQUNBLDBCQUNBLDJCQUNBLDBCQUNBLCtDQUNBLDZCQUNBLG1DQUNBLCtCQUNBLHlDQUNBLHdDQUNBLHdDQUNBLDhCQUNBLDRCQUNBLDhCQUNBLDZCQUNBLCtCQUNBLDJCQUNBLDhCQUNBLGdDQUNBLDJCQUNBLHlCQUNBLCtCQUNBLDJCQUNBLDBCQUNBLDJCQUNBLDJCQUNBLDJCQUNBLDhCQUNBLDBCQUNBLDhCQUNBLCtCQUNBLDRCQUNBLDZCQUNBLDhCQUNBLHlCQUNBLG9DQUNBLGlDQUNBLGlDQUNBLG1DQUNBLHNDQUNBLDBCQUNBLDBCQUNBLGlDQUNBLGlDQUNBLG9DQUNBLGlDQUNBLGdDQUNBLHFDQUNBLGlDQUNBLG9DQUNBLHVDQUNBLHVDQUNBLGtDQUNBLDhDQUNBLGdEQUNBLDBDQUNBLDJCQUNBLDZDQUNBLG9DQUNBLHdDQUNBLDJDQUNBLHdDQUNBLHNDQUNBLDZDQUNBLHlCQUVKLENBRUEsYUFBQW9hLEdBQ0UsTUFBTUMsRUFBUyxFQUFBaE0sV0FBV2lNLFVBQVVDLFNBQVUsU0FFOUMxYSxLQUFLMmEsWUFBY0gsRUFBT0ksUUFBUXBVLEdBQUtBLEVBQUVxVSxTQUN0Q3BYLFdBQ0FpRixPQUhnQmxDLEdBQUt4RyxLQUFLc2EsV0FBV1EsUUFBUXRVLEVBQUVxVSxVQUFZLEdBSTNERSxTQUNBcFMsVUFBVTNJLEtBQUtnYixhQUFhcmEsS0FBS1gsTUFDdEMsQ0FFQSxXQUFBZ1IsQ0FBWWlLLElBQ21CLElBQXpCamIsS0FBS3FhLGlCQUNQcmEsS0FBS3VhLGdCQUVQdmEsS0FBS3FhLGlCQUFrQixFQUN2QnJhLEtBQUtrYixZQUFZRCxFQUNuQixDQUVBLFdBQUFDLENBQVk3TyxHQUNWck0sS0FBS3NhLFdBQVczRCxLQUFLdEssRUFDdkIsQ0FFQSxZQUFBMk8sQ0FBYWphLEdBRWIsQ0FFQSxpQkFBT3VTLENBQVdvQyxHQUNoQixNQUFNbkMsR0FBWSxJQUFBQyxVQUFTLENBQUMsWUFFNUIsT0FEaUIsSUFBQUMsTUFBS0YsR0FBVyxJQUFBRyxNQUFLLENBQUMsU0FDaENDLENBQVMrQixFQUNsQixDQUVBLG9CQUFBMUssQ0FBcUJaLEdBQ25CLE1BQU1tQixHQUFVLElBQUFDLFFBQU9wQixFQUFJL0wsS0FBTTJCLEtBQUsxQixNQUFNRCxNQUM1QytMLEVBQUl6QyxLQUFPeVMsRUFBZTlHLFdBQVdsSixFQUFJekMsTUFDekMsTUFBTSxRQUFFckcsRUFBTyxXQUFFRSxHQUFlNEksRUFBSXpDLEtBQzlCakcsRUFBVStKLElBQVUsQ0FBR25LLFVBQVNFLGFBQVllLE1BQU9rSixJQUl6RCxPQUFtQixJQUFaRixFQUhXLENBQUNuQixHQUFRQSxFQUFJd0IsV0FBV25ELE1BQUssSUFBQS9KLEtBQUlnRCxJQUNoRGlILFVBQVUzSSxLQUFLbWIsVUFBVXhhLEtBQUtYLE9BRVA2TCxDQUFVekIsUUFBTzBCLENBQzdDLENBRUEsY0FBQXNQLENBQWVqYyxHQUNiLE1BQU1rYyxHQUFVLElBQUEvYSxNQUFLLENBQUMsUUFBUyxTQUN6QmdiLEdBQWtCLElBQUFoYixNQUFLLENBQUMsUUFBUyxpQkFFakN1TyxHQURZLElBQUFuUCxTQUFRLEVBQUE2YixTQUFTLElBQUF0YyxRQUFPcWMsRUFBaUJELEdBQzlDRyxDQUFVcmMsR0FDakJzYyxFQUFhLGFBQ25CLFlBQWdCaGQsSUFBVG9RLEVBQXFCLEdBQUc0TSxLQUFjNU0sVUFBZTRNLENBQzlELENBRUEsMkJBQU8vRyxDQUFxQjNJLEdBQzFCLE1BRU00SSxHQURhLElBQUFqVixVQUFRLElBQUFnSixTQUFPLElBQUFrTSxNQUR2QixrQ0FDa0MsRUFBQTVMLE1BQU0sSUFBQTlDLE1BQUssV0FDckMyTyxDQUFXOUksR0FDOUIsR0FBSTRJLEVBQVdsVixRQUFVLEVBQUcsQ0FDMUIsTUFBTXNCLEdBQU0sSUFBQW1GLE1BQUssUUFBUzZGLEdBQzFCLFFBQVl0TixJQUFSc0MsRUFBbUIsQ0FDckIsTUFBTStULEVBQWUsQ0FBQ0MsRUFBT0MsRUFBSUMsRUFBSUMsRUFBSUMsSUFBTzFQLE9BQU93UCxHQUFJRyxjQUFnQkYsRUFBS0MsRUFDMUVFLEdBQW1CLElBQUFDLFNBQVEsa0NBQW1DUixHQUM5RFMsRUFBYTlLLElBQ2pCLE1BQU0rSyxFQUFJSCxFQUFpQjVLLFFBQ1poTSxJQUFYc0MsRUFBSXlVLElBQXdDLG1CQUFaelUsRUFBSXlVLElBQXNCelUsRUFBSXlVLE1BRXBFYixFQUFXdk8sUUFBUW1QLEVBQ3JCLENBQ0YsQ0FFQSxPQUFPeEosQ0FDVCxDQUVBLFNBQUFvUCxDQUFVcFAsR0FZUkEsRUFBSXpLLFFBWEosU0FBOEIwVixHQUM1QixNQUFNNU0sRUFBTSxDQUFDLEVBQ2IsSUFBSyxNQUFNMEYsS0FBT2tILEVBRVpsVSxPQUFPQyxVQUFVQyxlQUFlQyxLQUFLK1QsRUFBY2xILEtBQ3JEMUYsRUFBSTBGLEdBQU9rSCxFQUFhbEgsSUFHNUIsT0FBTzFGLENBQ1QsQ0FFYzZNLENBQXFCbEwsR0FBS3ZLLFlBQVlzVixJQUFJQyxVQUFZaEwsRUFBSXpLLFFBRXhFOFksRUFBZTFGLHFCQUFxQjNJLEdBQ3BDQSxFQUFJNUssT0FBU25CLEtBQUtvYixlQUFlclAsR0FDakMsTUFBTTVLLEVBQVM0SyxFQUFJNUssUUFFYixRQUFFRyxFQUFPLFdBQUVFLEdBQWV1SyxFQUUxQnhKLEVBQVF3SixFQUFJeEosT0FDbEIsUUFBb0JBLEdBQU9xRCxRQUUzQjVGLEtBQUt5QixtQkFBbUJOLEVBQVFHLEVBQVNFLEVBQVllLEVBQ3ZELEUsdUdDM1VGLE1BQU1tWixFQUFtQixHQUVsQixNQUFNQyxVQUEyQixJQXlCdEMsV0FBQXZkLENBQVlvSixFQUFlLGtCQUN6QjFJLE1BQU0wSSxHQUNOeEgsS0FBSzJSLG9CQUNMM1IsS0FBSzRiLGVBQWlCLENBQ3hCLENBRUEsZ0JBQUF0UyxHQUNFdEosS0FBSzZiLGlCQUFtQixJQUFtQjVKLE9BQU9DLFNBQVM0SixPQUMzRCxNQUFNQyxFQUFVL2IsS0FBS2djLHVCQUNmQyxHQUFPLElBQUFqVixVQUFTK1UsR0FDdEIvYixLQUFLaWMsS0FBT0EsRUFDWkEsRUFBS3RULFVBQVV1VCxJQUNiLE1BQU0sT0FBRS9hLEVBQU0sUUFBRUcsRUFBTyxXQUFFRSxFQUFVLE1BQUVlLEdBQVUyWixFQUMvQ2xjLEtBQUt5QixtQkFBbUJOLEVBQVFHLEVBQVNFLEVBQVllLElBRXpELENBRUEseUJBQU80WixDQUFtQjVaLEdBQ3hCLE1BQU1wQixFQUFTbkIsS0FBS2lKLGVBQWVtVCwyQkFDN0JDLEVBQVk5WixFQUFNK1osUUFBVSxFQUFJLEtBQU8sUUFDdkMsT0FBRUMsRUFBTSxPQUFFRCxFQUFNLE9BQUVFLEdBQVdqYSxFQUduQyxNQUFPLENBQUVwQixTQUFRRyxRQUZELENBQUUrYSxZQUFXRSxTQUFRRCxTQUFRRSxVQUVuQmhiLFdBRFBlLEVBQU1mLFdBQ2FlLFFBQ3hDLENBRUEsZ0NBQU9rYSxDQUEwQjlTLEdBQy9CLE1BQU14SSxFQUFTLGtCQUFrQndJLEVBQVUrUyxzQkFFM0MsT0FEZ0IsSUFBQUMsT0FBTWhCLEVBQW1CaUIsZ0JBQ2xDQyxDQUFRMWIsRUFDakIsQ0FFQSxzQkFBT3liLENBQWdCaEosRUFBTXJSLEdBSzNCLE1BQU8sQ0FBRXBCLE9BSE15UyxFQUdFdFMsUUFGRGlCLEVBRVVmLFdBRFBlLEVBQU1mLFdBQ2FlLFFBQ3hDLENBRUEscUJBQU91YSxDQUFldmEsR0FLcEIsTUFBTyxDQUFFcEIsT0FKTW5CLEtBQUtpSixlQUFlOFQsNEJBSWxCemIsU0FIRCxJQUFBMUIsTUFDZCxDQUFDLGFBQWMsY0FBZSxhQUFjLGVBQWdCNkUsUUFFcENqRCxXQURQZSxFQUFNZixXQUNhZSxRQUN4QyxDQUVBLDBCQUFPeWEsQ0FBb0J6YSxHQUN6QixNQUFNcEIsRUFBU25CLEtBQUtpSixlQUFlZ1UsaUNBRTdCQyxFQUFpQnpZLE9BQU8wWSxXQURQLDJCQUNrQ0MsUUFDbkQ5YixHQUFVLElBQUExQixNQUNkLENBQUMsYUFBYyxjQUFlLGFBQWMsZUFBZ0I2RSxRQUs5RCxPQUpBbkQsRUFBUStiLGFBQWlDLElBQW5CSCxFQUNsQixXQUNBLFlBRUcsQ0FBRS9iLFNBQVFHLFVBQVNFLFdBRFBlLEVBQU1mLFdBQ2FlLFFBQ3hDLENBRUEsa0JBQUErYSxDQUFtQi9hLEdBSWpCLE1BQU8sQ0FBRXBCLE9BSE1uQixLQUFLaUosZUFBZXNVLGlDQUdsQmpjLFNBRkQsSUFBQTFCLE1BQUssQ0FBQyxVQUFXLFFBQVMsa0JBQW1CMkMsR0FFbkNmLFdBRFBlLEVBQU1mLFdBQ2FlLFFBQ3hDLENBRUEsMEJBQUFpYixDQUEyQnZMLEdBQ3pCLE1BQU13TCxFQUFZeEwsRUFBT3lMLHdCQUV6QixPQUFPLElBQXdCQyw2QkFBNkIsUUFDMURoQyxFQUFtQlEsbUJBQW1CeGIsS0FBS1gsT0FDMUN5SSxNQUNDLElBQUFtVixjQUFhSCxHQUVuQixDQUVBLG9CQUFPSSxHQUNMLElBQUlqQyxFQUFpQixFQVFyQixPQU51QmtDLElBQ3JCLE1BQU1DLEVBQWlCbkMsRUFBaUJrQyxFQUd4QyxPQURBbEMsRUFBaUJrQyxFQUNWLENBQUVBLFVBQVNDLGlCQUFnQjFCLFVBRmhCMEIsR0FBa0IsRUFBSSxLQUFPLFFBS25ELENBRUEsaUJBQU9DLENBQVdDLEdBQ2hCLFlBQXFDeGYsSUFBOUJ3ZixFQUFjQyxZQUE0QkQsRUFBY0MsWUFBY0QsRUFBY0UsU0FDN0YsQ0FFQSxxQkFBT0MsQ0FBZTdiLEVBQU84YixFQUFVbGQsRUFBUW1kLEVBQWNMLEdBQzNELE1BQ00zYyxFQUFVZ2QsRUFEQTNDLEVBQW1CcUMsV0FBV0MsS0FFeEMsZUFBRUYsR0FBbUJ6YyxFQUUzQixNQUFPLENBQUVILFNBQVFHLFVBQVNFLFdBRFBlLEVBQU1mLFdBQ2F1YyxpQkFBZ0J4YixRQUN4RCxDQUVBLHNCQUFBZ2MsQ0FBdUJ0TSxFQUFRZ00sRUFBZ0J4WixPQUFRK1osR0FBWSxHQUNqRSxNQUNNQyxFQUFReE0sRUFBT3lMLHdCQUVmZ0IsRUFBVVQsRUFFVlUsRUFBV1YsSUFBa0J4WixPQUU3Qm1hLE9BQTZDbmdCLElBQTNCd1QsRUFBTzJNLGdCQUFnQzNNLEVBQU8yTSxnQkFBa0JYLEVBQ2xGOWMsRUFBU3dkLEVBQVcsOEJBQWdDLHNDQUVwREwsRUFBZTNDLEVBQW1Ca0MsZ0JBRWxDZ0IsR0FBYyxJQUFBQyxjQUFhbkQsRUFBbUJ5QyxlQUFnQixDQUFDamQsRUFBUW1kLEVBQWNNLEVBQWlCSixFQUFXRSxJQUFVL2QsS0FBS1gsTUFJdEksT0FBTyxJQUF3QjJkLDZCQUE2QixTQUMxRGtCLEVBQWFMLEVBQVdFLEdBQ3ZCalcsTUFDQyxJQUFBbVYsY0FBYWEsSUFDYixJQUFBTSxXQXBCeUJoZSxHQUE4QixJQUF2QkEsRUFBSWdkLGlCQXFCcEMsSUFBQXJmLEtBQUl3ZCxJQUNGLE1BQU04QyxFQUFhckQsRUFBbUJxQyxXQUFXVSxHQUdqRCxPQUZBeEMsRUFBRTVhLFFBQVEyZCxrQkFBb0JDLEtBQUtDLElBQUluZixLQUFLNGIsZUFBaUJvRCxHQUM3RGhmLEtBQUs0YixlQUFpQm9ELEVBQ2Y5QyxJQUdmLENBRUEsMkJBQUFrRCxDQUE0Qm5OLEdBRTFCLE9BQU8sSUFBd0IwTCw2QkFBNkIsb0JBQzFEaEMsRUFBbUJxQixvQkFBb0JyYyxLQUFLWCxNQUNoRCxDQUVBLHNCQUFBcWYsQ0FBdUJwTixHQUNyQixNQUFNd00sRUFBUXhNLEVBQU9xTix3QkFHckIsT0FBTyxJQUF3QjNCLDZCQUE2QixTQUMxRGhDLEVBQW1CbUIsZUFBZW5jLEtBQUtYLE9BQU95SSxNQUFLLElBQUFtVixjQUFhYSxHQUNwRSxDQUVBLG1CQUFBYyxDQUFvQnROLEVBQVNqUyxLQUFLNmIsa0JBQ2hDLE1BQU1FLEVBQVU5SixFQUFPdU4sT0FFakJDLEVBQWdCMWEsTUFBTTJhLFFBQVF6TixFQUFPME4sY0FDdkMxTixFQUFPME4sYUFBYWpoQixJQUFJaWQsRUFBbUJpRSwwQkFBMEJsWCxPQUFPbVgsR0FBbUIsT0FBVkEsR0FDckYsR0FFSkosRUFBY3JaLFFBQVF5WixHQUFTN2YsS0FBSzhmLHFCQUFxQkQsRUFBTXhoQixPQUUvRCxNQUFNMGhCLEVBQXNCelYsSUFDMUIsTUFBTTNMLEVBQVFnZCxFQUFtQmMsMEJBQTBCblMsR0FDM0QsT0FBTyxJQUF3QnFULDZCQUE2QnJULEVBQUszTCxJQVFuRSxPQUFPLFNBQUtvaEIsRUFBcUJoRSxHQUFTeGIsUUFBTyxTQUxyQixFQUFHbEMsT0FBTTJoQixXQUFVN0wsWUFDN0MsTUFBTW5JLEVBQU8rVCxFQUFvQjFoQixHQUNqQyxZQUFvQkksSUFBYnVoQixFQUF5QmhVLEVBQU8yUCxFQUFtQnNFLCtCQUErQmpVLEVBQU1nVSxFQUFVN0wsSUFHaENzTCxHQUM3RSxDQVFBLCtCQUFPRyxDQUF5QkMsR0FDOUIsR0FBcUIsaUJBQVZBLEVBQ1QsTUFBTyxDQUFFeGhCLEtBQU13aEIsRUFBT0csY0FBVXZoQixFQUFXMFYsV0FBTzFWLEdBR3BELEdBQWMsT0FBVm9oQixHQUFtQyxpQkFBVkEsR0FBNEMsaUJBQWZBLEVBQU14aEIsS0FBbUIsQ0FDakYsTUFDTTZoQixFQURlLENBQUMsU0FBVSxRQUFTLFdBQVksWUFDeEJ4WCxPQUFPb0gsUUFBc0JyUixJQUFmb2hCLEVBQU0vUCxJQUMzQ2tRLEVBQVdFLEVBQVEsR0FNekIsT0FKSUEsRUFBUXpnQixPQUFTLElBQWtDLElBQTdCLElBQW1Cb0QsT0FDM0NoRCxRQUFRQyxLQUFLLG1DQUFtQytmLEVBQU14aEIsa0NBQWtDNmhCLEVBQVF6UCxLQUFLLGlCQUFpQnVQLE1BR2pILENBQUUzaEIsS0FBTXdoQixFQUFNeGhCLEtBQU0yaEIsV0FBVTdMLFdBQW9CMVYsSUFBYnVoQixFQUF5QkgsRUFBTUcsUUFBWXZoQixFQUN6RixDQUdBLE9BREFvQixRQUFRQyxLQUFLLDhHQUE4R3FELEtBQUtDLFVBQVV5YyxNQUNuSSxJQUNULENBUUEscUNBQU9JLENBQStCalUsRUFBTWdVLEVBQVU3TCxHQUNwRCxPQUFRNkwsR0FDTixJQUFLLFNBRUgsT0FBT2hVLEVBQUt2RCxNQUNWLElBQUEwWCxRQUFPblUsRUFBS3ZELE1BQUssSUFBQW1WLGNBQWF6SixNQUM5QixJQUFBekwsUUFBTzBYLEdBQVFBLEVBQUszZ0IsT0FBUyxJQUM3QixJQUFBZixLQUFJaWQsRUFBbUIwRSxtQkFFM0IsSUFBSyxRQUVILE9BQU9yVSxFQUFLdkQsTUFDVixJQUFBNlgsYUFBWW5NLElBQ1osSUFBQXpWLEtBQUlpZCxFQUFtQjBFLG1CQUUzQixJQUFLLFdBQ0gsT0FBT3JVLEVBQUt2RCxNQUFLLElBQUFtVixjQUFhekosSUFDaEMsSUFBSyxXQUNILE9BQU9uSSxFQUFLdkQsTUFBSyxJQUFBOFgsY0FBYXBNLElBQ2hDLFFBQ0UsT0FBT25JLEVBRWIsQ0FFQSx1QkFBT3FVLENBQWlCRCxHQUN0QixNQUFNSSxFQUFPSixFQUFLQSxFQUFLM2dCLE9BQVMsSUFDMUIsT0FBRTBCLEVBQU0sV0FBRUssRUFBVSxNQUFFZSxHQUFVaWUsRUFHdEMsTUFBTyxDQUFFcmYsU0FBUUcsUUFERCxDQUFFbWYsT0FESEwsRUFBSzFoQixJQUFJd2QsUUFBaUJ6ZCxJQUFaeWQsRUFBRTNaLE9BQW1DLE9BQVoyWixFQUFFM1osTUFBaUIyWixFQUFFM1osTUFBTWtlLFlBQVNoaUIsR0FDaEVpaUIsU0FBUyxFQUFNQyxXQUFZUCxFQUFLM2dCLFFBQ2hDK0IsYUFBWWUsUUFDeEMsQ0FFQSxvQkFBQXlaLENBQXFCL0osRUFBU2pTLEtBQUs2YixrQkFDakMsSUFBSUUsRUFBVSxHQUlkOUosRUFBTzJPLHVCQUF3QixRQUM3QjNPLEVBQU80TyxnQkFBaUIsUUFDeEI1TyxFQUFPNE8sY0FJVCxNQUFNQyxFQUFVLENBQ2RDLGdCQUFpQi9nQixLQUFLcWYsdUJBQXVCMWUsS0FBS1gsTUFDbERnaEIscUJBQXNCaGhCLEtBQUtvZiw0QkFBNEJ6ZSxLQUFLWCxNQUM1RGloQixnQkFBaUJqaEIsS0FBS3VlLHVCQUF1QjVkLEtBQUtYLE1BQ2xEa2hCLGVBQWdCbGhCLEtBQUt3ZCwyQkFBMkI3YyxLQUFLWCxRQVV2RCxJQUFBbWhCLGVBUDJCLENBQUNDLEVBQVF0UixFQUFLdVIsS0FDcEJwUCxFQUFPbkMsSUFFeEJpTSxFQUFRcEYsS0FBS3lLLEVBQU9uUCxLQUlVNk8sR0FHbEM5Z0IsS0FBS3NoQixxQkFBcUJyUCxFQUFPMk8sdUJBRWpDLE1BQU1XLEVBQVl2aEIsS0FBS3VmLG9CQUFvQnROLEdBRzNDLE9BRkE4SixFQUFVQSxFQUFReGIsT0FBT2doQixHQUVsQnhGLENBQ1QsQ0FFQSxvQkFBQXVGLENBQXFCeFgsSUFPTixJQUFUQSxHQUNGOUosS0FBS3doQix3QkFBd0J4aEIsS0FBSzZiLGtCQUMvQmxULFVBUmdCdVQsSUFDbkIsTUFBTSxPQUFFL2EsRUFBTSxRQUFFRyxFQUFPLFdBQUVFLEVBQVUsTUFBRWUsR0FBVTJaLEVBQy9DbGMsS0FBS3lCLG1CQUFtQk4sRUFBUUcsRUFBU0UsRUFBWWUsRUFDbkR2QyxLQUFLa0MsWUFPWCxDQUVBLHVCQUFBc2YsQ0FBd0J2UCxHQUN0QixNQUFNelMsRUFBTVEsS0FBS3loQix1QkFBdUJ4UCxHQUd4QyxPQURhLElBQUF5UCxPQUFNLEVBQUExYSxNQUFPeEgsR0FDZGlKLE1BQUssSUFBQS9KLEtBQUlzQixLQUFLc2QsbUJBQW1CM2MsS0FBS1gsT0FDcEQsQ0FFQSxvQkFBQThmLENBQXFCeFYsR0FDbkIsR0FBbUIsaUJBQVJBLEVBQ1QsT0FLRixNQUFNcVgsRUFGRyxrQkFBa0JyWCxFQUFJb1Msc0JBRy9CaEIsRUFBaUIvRSxLQUFLZ0wsRUFDeEIsQ0FFQSxvQkFBQXhoQixHQTBGRSxNQXpGb0IsQ0FDbEIsNkJBQ0Esa0NBQ0Esb0NBQ0EsMENBQ0Esc0NBQ0Esb0NBQ0EsbUNBQ0Esb0NBQ0Esa0NBQ0EsNEJBQ0EsOEJBQ0EsOEJBQ0EsNkJBQ0EsNkJBQ0Esc0NBQ0Esd0NBQ0EseUNBQ0EsNEJBQ0EsMkJBQ0EsZ0NBQ0Esb0NBQ0EsbUNBQ0Esb0NBQ0EseUNBQ0EsdUNBQ0EsK0NBQ0EsdUNBQ0EsZ0RBQ0Esd0NBQ0Esd0NBQ0EsNkNBQ0EsK0JBQ0EsaUNBQ0EsaUNBQ0EsZ0NBQ0EsaUNBQ0EsNEJBQ0EsNEJBQ0Esc0NBQ0EsNkJBQ0EsK0JBQ0EsNkJBQ0Esd0NBQ0EsdUNBQ0Esa0NBQ0EsNkJBQ0EsK0JBQ0EsK0JBQ0EsZ0NBQ0EsNkJBQ0EsNEJBQ0EsbUNBQ0EsK0JBQ0EsaUNBQ0Esa0NBQ0Esa0NBQ0EsaUNBQ0EsZ0NBQ0EsaUNBQ0EsK0JBQ0Esa0NBQ0EsK0JBQ0EsOEJBQ0EsNEJBQ0EsbUNBQ0EsZ0NBQ0EsZ0NBQ0EsNkJBQ0EsZ0NBQ0EsZ0NBQ0Esc0NBQ0EsNkJBQ0EsOEJBQ0EsNENBQ0EsOEJBQ0EsbUNBQ0EsQ0FBQyxtQ0FBb0MscUJBQ3JDLENBQUMsNkNBQThDLHdCQUMvQywrQkFDQSw4QkFDQSx3Q0FDQSxxQ0FDQSxxQ0FDQSx1Q0FDQSw4QkFDQSw4QkFHaUJJLE9BQU9tYixFQUM1QixDQUVBLGlCQUFBa0csQ0FBa0JwYixHQUVsQixDQUVBLG9CQUFBcWIsQ0FBcUJyYixHQUNuQixJQUFJLE9BQUV5TCxFQUFNLEdBQUU2RSxFQUFFLGNBQUVtSCxHQUFrQnpYLEVBQUVsRixRQUN0QzJRLEVBQVNBLEdBQVUsQ0FBQyxFQUNwQkEsR0FBUyxPQUFValMsS0FBSzZiLGlCQUFrQjVKLEdBRTFDZ00sRUFBZ0JBLEdBQWlCbkgsRUFHakM5VyxLQUFLeUIsbUJBRFUsNENBQ2lCLENBQUVxVixNQUFNQSxHQUV4QzlXLEtBQUt1ZSx1QkFBdUJ0TSxFQUFRZ00sR0FDakN0VixVQUFVdVQsSUFDVCxNQUFNLE9BQUUvYSxFQUFNLFFBQUVHLEVBQU8sV0FBRUUsRUFBVSxNQUFFZSxHQUFVMlosRUFDL0NsYyxLQUFLeUIsbUJBQW1CTixFQUFRRyxFQUFTRSxFQUFZZSxJQUUzRCxDQUVBLGlCQUFBb1AsR0FDRTNSLEtBQUs4aEIsd0JBQTBCLElBQXdCQSx3QkFBd0JuaEIsS0FDN0VYLE1BQ0ZBLEtBQUt5aEIsdUJBQXlCLElBQXdCQSx1QkFBdUI5Z0IsS0FDM0VYLEtBQ0osRSx1RkNqY0YsTUFBTStoQixFQUFZLElBQUksSUFDaEJDLEVBQVUsU0FvTFQsSUFBSUMsRUFBVyxJQWxMdEIsTUFzQkUsV0FBQTdqQixHQUNFNEIsS0FBS2dpQixRQUFVQSxDQUNqQixDQUVBLFlBQUk5UCxHQUNGLE9BQU82UCxDQUNULENBRUEsSUFBQTVTLENBQUs4QyxFQUFTLENBQUMsRUFBR2xULEdBQVcsR0FtQjNCLElBQXNDLElBQW5DLElBQW1Cd0YsWUFDcEIsT0FBSXhGLEVBQ0ssMkRBRVBjLFFBQVFDLEtBQUssdURBT2pCLElBQUlvaUIsRUFBZ0IsQ0FDbEJDLFlBQVksRUFDWkMsWUFBYSxHQUNiQyxZQUFhLEVBQ2J4ZixPQUFPLEVBQ1B5ZixRQUFRLEVBQ1JDLEtBQU0sTUFDTmhrQixpQkFBaUIsRUFDakJpa0IsUUFBUyxDQUFDLEVBQ1ZDLFFBQVMsQ0FBQyxFQUNWQyxlQUFnQixHQUNoQkMsY0FBVWxrQixFQUNWbWtCLFNBYm1DLG9CQUFiQSxTQUE0QkEsY0FBV25rQixFQWM3RG9rQixjQUFjLENBRWQsRUFDQUMsUUFBUSxDQUVSLEVBQ0FDLElBQUssQ0FBQyxFQUNOQyxlQUFnQixDQUFDLEVBQ2pCQyxTQUFVLENBQUMsRUFDWC9RLFNBQVUsQ0FDUjRKLE9BQVEsQ0FDTitFLGFBQWMsQ0FFZCxFQUNBckIsT0FBUSxHQUNSRyxhQUFjLEdBQ2RvQixpQkFBaUIsRUFDakJDLHNCQUFzQixFQUN0QkMsaUJBQWlCLEVBQ2pCaUMscUJBQXFCLEVBQ3JCaEMsZ0JBQWdCLEVBQ2hCNUIsd0JBQXlCLElBQ3pCNUIsd0JBQXlCLEtBRzNCdkwsTUFBTyxDQUNMdEQsS0FBTSxRQUNOdUQsUUFBUSxFQUNSZ0YsVUFBVSxFQUNWK0wsU0FBUyxFQUNUblEsT0FBUSxDQUNOLFVBQWMsQ0FDWixVQUFjLGNBT3hCLFFBQWV2VSxJQUFYd1QsRUFBc0IsQ0FDeEIsTUFBTW1SLEVBQWEsSUFDbEJuUixFQUFTLElBQW1Cb1IsV0FBV25CLEVBQWVqUSxFQUFROFAsRUFBV3FCLEVBSTVFLENBQ0FwakIsS0FBS3NqQixVQUFZLElBQW1CQyxvQkFBb0J0UixFQUFzQixlQUM5RWpTLEtBQUtzRCxrQkFBcUJnSCxHQUFReVgsRUFBVXplLGtCQUFrQmdILEdBQzlEdEssS0FBS3dqQixnQkFBbUJya0IsR0FBUTRpQixFQUFVOVEsZUFBZTlSLEdBQ3pEYSxLQUFLeWpCLGVBQWtCQyxHQUFtQixJQUFtQkQsZUFBZUMsR0FDNUUxakIsS0FBSzJqQixvQkFBdUIzWCxHQUFTK1YsRUFBVTlRLGVBQWVqRixHQUM5RGhNLEtBQUs0akIsYUFBZSxJQUFNN2UsTUFBTTRLLEtBQUtvUyxFQUFVcmpCLElBQUlzSyxRQUNuRCxJQUFJNmEsRUFBYSxJQUFJLElBQVcsQ0FBRUMsR0FBRyxxQkFDckNELEVBQVdFLFlBQVlySixTQUFTc0osTUFDaENILEVBQVd2bEIsTUFBTXdZLEdBQUdtTixNQUFNQyxRQUFVLGdEQUNwQ25DLEVBQVU1UyxRQUU0QixJQUFsQyxJQUFtQjhDLE9BQU9wUCxRQUMzQjRCLE9BQU8wZixNQUFRLENBQUNuQyxhQUduQixPQUFzQixJQUFtQi9QLFNBQ3pDLFFBQXNCLElBQW1CQSxPQUUzQyxDQVdBLG1CQUFPMlIsR0FDTCxPQUFPN2UsTUFBTTRLLEtBQUtvUyxFQUFVcmpCLElBQUlzSyxPQUNsQyxDQU9BLHdCQUFPMUYsQ0FBa0JnSCxHQUN2QixPQUFPeVgsRUFBVXplLGtCQUFrQmdILEVBQ3JDLENBU0Esc0JBQU9rWixDQUFnQm5YLEdBQ3JCLElBQXVDLElBQW5DLElBQW1COUgsWUFHckIsT0FBT3dkLEVBQVU5USxlQUFlNUUsR0FGaEN4TSxRQUFRQyxLQUFLLGlDQUlqQixFLDZEQ3JMRixJQUFJc2tCLEVBQWlCLElBQ2QsTUFBTUMsRUFDWCxXQUFBam1CLENBQVlFLEVBQVEsQ0FBQyxHQUNuQixJQUFJLEtBQUVELEVBQUksT0FBRTRULEVBQU0sU0FBRXFTLEdBQWFobUIsRUFDakMwQixLQUFLMUIsTUFBUUEsT0FFRUcsSUFBWHdULElBQ0ZBLEdBQVMsSUFBQXpPLE9BQU1sRixJQUdqQjBCLEtBQUszQixLQUFPQSxHQUFRLFFBQ3BCMkIsS0FBSzFCLE1BQU1ELEtBQU9BLEVBQ2xCNFQsRUFBU29TLEVBQVlFLG1CQUFtQnRTLEVBQVFqUyxLQUFLa2lCLGlCQUNyRGxpQixLQUFLMUIsTUFBTWdtQixTQUFXQSxHQUFZRCxFQUFZRyxpQkFFOUN4a0IsS0FBSzFCLE1BQU0yVCxPQUFTQSxPQUNNeFQsSUFBdEJ1QixLQUFLMUIsTUFBTTZLLFFBQ2JuSixLQUFLcUosVUFBVXJKLEtBQUsxQixNQUFNNkssT0FNOUIsQ0FPQSxRQUFBc2IsQ0FBU0MsR0FFUE4sRUFBaUJNLEVBQ2pCMWtCLEtBQUsxQixNQUFNcW1CLFdBQWEza0IsS0FBSzFCLE1BQU1ELE1BSUEsSUFBL0IrbEIsRUFBZTdmLGFBT25CdkUsS0FBSzRrQixxQkFHTDVrQixLQUFLMUIsTUFBTTJULFFBQVMsSUFBQXpPLE9BQU14RCxLQUFLMUIsTUFBTTJULFFBQ3JDbVMsRUFBZVMsZ0JBQWdCN2tCLEtBQUszQixLQUFNMkIsS0FBSzFCLE1BQU0yVCxRQU9yRGpTLEtBQUtELGVBQ0xDLEtBQUs4a0IsWUFsQkhqbEIsUUFBUUMsS0FDSixpRkFBaUZFLEtBQUszQixTQWtCOUYsQ0FFQSxzQkFBSTBtQixHQUNGLE9BQU9YLENBQ1QsQ0FFQSx5QkFBT0csQ0FBbUJ0UyxFQUFTLENBQUMsRUFBR2lRLEVBQWdCbGlCLEtBQUtraUIsaUJBQzFELE9BQU9wZixPQUFPa2lCLE9BQU85QyxFQUFlalEsRUFDdEMsQ0FFQSxrQkFBT2dULENBQVk1bUIsRUFBTTRULElBQ1ksSUFBL0JtUyxFQUFlN2YsWUFDakIxRSxRQUFRQyxLQUFLLDRDQUE0Q3pCLHlDQUd6RCtsQixFQUFlUyxnQkFBZ0J4bUIsRUFBTTRULEVBRXpDLENBRUEsd0JBQU9pVCxDQUFrQkMsRUFBVVIsRUFBWVMsR0FHN0MsT0FBbUIsS0FGQSxJQUFBQyxnQkFBYyxJQUFBdmdCLElBQUdoQyxRQUFTLENBQUMsU0FBVSxVQUFXNmhCLEdBQWhELENBQTZEUSxLQUdoRCxJQUExQkEsRUFBU2xULE9BQU9wUCxPQUNsQmhELFFBQVFDLEtBQUssOEJBQThCNmtCLHNCQUV0QyxJQUVUUSxFQUFTbFQsT0FBTzZRLFFBQVE2QixHQUFjUyxFQUMvQkQsRUFBU2xULE9BQU82USxRQUFRNkIsR0FDakMsQ0FFQSxxQkFBT0gsQ0FBZTFOLEdBZ0JwQixPQUFPQSxHQWRZNEQsU0FBUzRLLGVBQWUsa0JBRWxCLE1BQ3JCLE1BQU1DLEVBQVcsSUFBSSxJQUFXLENBQzlCekIsR0FBSSxrQkFFTnBKLFNBQVNzSixLQUFLd0IsWUFBWUQsRUFBU0UsVUFDbkMsTUFBTTNPLEVBQUs0RCxTQUFTNEssZUFBZSxpQkFFbkMsT0FEQXhPLEVBQUdtTixNQUFNQyxRQUFVLCtHQUNacE4sR0FFVTRPLEVBSXZCLENBRUEsU0FBQXJjLENBQVVGLEdBQ3dCLFVBQTVCQSxFQUFPL0ssWUFBWUMsT0FDckI4SyxFQUFTLENBQUNBLElBTVpBLEVBQU8vQyxRQUpXZ0QsR0FDVCxJQUFJQSxFQUFXcEosTUFJMUIsQ0FFQSxrQkFBQTRrQixHQUdFNWtCLEtBQUsybEIsNkJBQ1AsQ0FFQSwyQkFBQUEsR0FDRSxNQUFNQyxFQUFpQjVsQixLQUFLMUIsTUFBTXNuQixnQkFBa0IsR0FDOUNDLEVBQXVCN2xCLEtBQUsxQixNQUFNdW5CLHNCQUF3QixHQUUxREMsRUFBZSxJQUFtQkMsaUJBQWlCLFVBRW5EQyxFQUFnQkosRUFBZWxkLE9BQU8zSCxJQUFRK2tCLEVBQWF0RyxPQUFPbGIsU0FBU3ZELElBSzNFa2xCLEVBQVlwRyxHQUEwQixpQkFBVkEsRUFBcUJBLEVBQVFBLEdBQU94aEIsS0FDaEU2bkIsRUFBbUJKLEVBQWFuRyxhQUFhamhCLElBQUl1bkIsR0FDakRFLEVBQXNCTixFQUFxQm5kLE9BQU8zSCxJQUFRbWxCLEVBQWlCNWhCLFNBQVMyaEIsRUFBVWxsQixLQVNwRyxHQU5JaWxCLEVBQWN2bUIsT0FBUyxHQUN6QkksUUFBUUMsS0FDSixXQUFXRSxLQUFLMUIsTUFBTUQsNkRBQTBEMm5CLEVBQWN2VixLQUFLLGFBSXJHMFYsRUFBb0IxbUIsT0FBUyxFQUFHLENBRWxDLE1BQU0ybUIsRUFBbUJ2RyxHQUEwQixpQkFBVkEsRUFBcUIsSUFBSUEsS0FBVzFjLEtBQUtDLFVBQVV5YyxHQUM1RmhnQixRQUFRQyxLQUNOLFdBQVdFLEtBQUsxQixNQUFNRCxtRUFBZ0U4bkIsRUFBb0J6bkIsSUFBSTBuQixHQUFrQjNWLEtBQUssWUFFekksQ0FDRixDQUVBLGFBQUF5UixHQUNFLE1BQU8sQ0FFUCxDQUNGLENBRUEsWUFBQW5pQixHQUVBLENBRUEsUUFBQStrQixHQUVBLEUsNkVDcktLLE1BQU11QixFQXlCWCxXQUFBam9CLENBQVlvQyxFQUFVLENBQUMsRUFBR0MsRUFBWTFCLEVBQVV5SSxHQUc5Q3hILEtBQUtzbUIsT0FBU0QsRUFBaUJFLFNBQVMvbEIsR0FDeENSLEtBQUt3bUIsS0FBT0gsRUFBaUJJLE9BQU9qbUIsR0FDcENSLEtBQUswbUIsY0FBZ0JMLEVBQWlCTSxnQkFBZ0JubUIsR0FDdERSLEtBQUs0bUIsZUFBaUJQLEVBQWlCUSxpQkFBaUJybUIsR0FDeERSLEtBQUs4bUIsaUJBQTZCcm9CLElBQWZnQyxFQUEyQkEsRUFOdkJ5YixHQUFLcmMsUUFBUWtuQixJQUFJLGtCQUFtQjdLLEdBTzNEbGMsS0FBSzZDLE9BQTJCLElBQW5CckMsR0FBU3FDLE1BQ3RCN0MsS0FBS3pCLGlCQUErQyxJQUE3QmlDLEdBQVNqQyxnQkFDaEN5QixLQUFLc0MsWUFBY2tGLEVBRW5CLE1BQU01RyxFQUFhLENBQ2pCakMsTUFBT3FCLEtBQUtyQixNQUNaNEMsSUFBS3ZCLEtBQUt1QixJQUNWeWxCLGNBQWVobkIsS0FBS2duQixjQUNwQkMsYUFBY2puQixLQUFLaW5CLGFBQ25CMW9CLGdCQUFpQnlCLEtBQUt6QixnQkFDdEJzRSxNQUFPN0MsS0FBSzZDLFFBR0csSUFBYjlELEdBQ0ZzbkIsRUFBaUJhLGlCQUFpQnRtQixFQUFZWixLQUFLOG1CLFlBQWE5bUIsS0FBS3NDLFlBRXpFLENBRUEsdUJBQU80a0IsQ0FBaUI1b0IsRUFBT21DLEVBQVk2QixHQUN6QyxNQUFNLE1BQUUzRCxFQUFLLElBQUU0QyxFQUFHLGNBQUV5bEIsRUFBYSxhQUFFQyxFQUFZLE1BQUVwa0IsR0FBVXZFLEVBRXJENm9CLEVBQVcsQ0FDZjdrQixjQUNBZixNQUNBMGxCLGVBQ0FELGlCQU9JSSxHQUFtQixJQUFWdmtCLEdBQWlCLElBQUF3a0IsS0FKWm5MLElBQ2xCcmMsUUFBUWtuQixJQUFJLGdCQUFpQjdLLEVBQUdpTCxNQUdpQixJQUFBRSxLQUFJLFFBRXBDQyxPQVVELElBQUEzWCxNQUFLbEwsT0FBTzhpQixNQUFNaG1CLEVBQUt5bEIsSUFBZ0J2ZSxNQUN2RCxJQUFBK2UsVUFBU0MsSUFDUCxJQUFBOVgsTUFBSzBXLEVBQWlCcUIsY0FBY0QsRUFBVU4sS0FHaERDLEdBRUEsSUFBQTFvQixNQWpCaUI0b0IsRUFpQkYzb0IsRUFqQmVnSixJQUM5QixNQUlNZ2dCLEdBSjZDLElBQTNCcnBCLEdBQU9DLGdCQUlTb0osR0FBTyxRQUFhQSxFQUFNLENBQUU0YSxLQUFNLFFBRTFFLE9BQU8rRSxFQUFVSyxFQUFlUixPQVloQyxJQUFBUyxZQUFXblosSUFDVCxJQUFBb1osSUFBR3hCLEVBQWlCeUIsd0JBQXdCclosRUFBTzBZLE1BR3JELElBQUFZLFVBR1FwZixVQUFVbEksRUFDdEIsQ0FFQSwwQkFBYWluQixDQUFjRCxFQUFVTixHQUNuQyxNQUFNLGFBQUVGLEdBQWlCRSxFQUVuQmEsRUFBU1AsRUFBU08sT0FDbEJDLEVBQWFSLEVBQVNRLFdBQ3RCQyxFQUFjVCxFQUFTVSxTQUFTcmtCLE1BQU0saUJBQW1CLEdBRXpEc2tCLEVBQW1CLElBQ3BCakIsRUFDSGEsU0FDQUMsYUFDQUMsY0FDQUcsR0FBSVosRUFBU1ksSUFHZixJQUFvQixJQUFoQlosRUFBU1ksR0FBYSxDQUN4QixNQUFNQyxRQUFnQmpDLEVBQWlCa0MsYUFBYWQsR0FFcEQsTUFBTXBCLEVBQWlCbUMsaUJBQWlCLENBQ3RDQyxVQUFXLG1CQUNYQyxRQUFTLG9DQUFvQ1YsS0FBVUMsSUFDdkRkLFNBQVVpQixFQUNWRSxXQUVKLENBRUEsR0FBcUIsU0FBakJyQixFQUNGLE9BQU9aLEVBQWlCc0Msa0JBQWtCbEIsRUFBVVcsR0FHdEQsR0FBcUIsU0FBakJuQixFQUNGLE9BQU9RLEVBQVNtQixPQUdsQixHQUFxQixTQUFqQjNCLEVBQ0YsT0FBT1EsRUFBU29CLE9BR2xCLEdBQXFCLGdCQUFqQjVCLEVBQ0YsT0FBT1EsRUFBU3FCLGNBR2xCLEdBQXFCLGFBQWpCN0IsRUFDRixPQUFPUSxFQUFTc0IsV0FHbEIsTUFBTTFDLEVBQWlCbUMsaUJBQWlCLENBQ3RDQyxVQUFXLGtDQUNYQyxRQUFTLG1DQUFtQ3pCLEtBQzVDRSxTQUFVaUIsR0FFZCxDQUVBLDhCQUFhTyxDQUFrQmxCLEVBQVVOLEdBQ3ZDLE1BQU1tQixRQUFnQmIsRUFBU21CLE9BQ3pCSSxFQUFjVixFQUFRVyxPQUU1QixHQUFvQixLQUFoQkQsRUFDRixPQUFPLEtBR1QsSUFDRSxPQUFPN2xCLEtBQUsrbEIsTUFBTUYsRUFDcEIsQ0FBRSxNQUFPdmEsR0FDUCxNQUFNNFgsRUFBaUJtQyxpQkFBaUIsQ0FDdENDLFVBQVcsNkJBQ1hDLFFBQVMsbURBQ1R2QixXQUNBbUIsVUFDQWEsY0FBZTFhLEdBRW5CLENBQ0YsQ0FFQSx1QkFBTytaLEVBQWlCLFVBQUVDLEVBQVMsUUFBRUMsRUFBTyxTQUFFdkIsRUFBUSxRQUFFbUIsRUFBVSxHQUFFLGNBQUVhLElBQ3BFLE1BQU0xYSxFQUFRLElBQUkyYSxNQUFNVixHQVF4QixPQU5BamEsRUFBTXJOLHFCQUFzQixFQUM1QnFOLEVBQU1nYSxVQUFZQSxFQUNsQmhhLEVBQU0wWSxTQUFXQSxFQUNqQjFZLEVBQU02WixRQUFVQSxFQUNoQjdaLEVBQU0wYSxjQUFnQkEsRUFFZjFhLENBQ1QsQ0FFQSw4QkFBT3FaLENBQXdCclosRUFBTzBZLEdBQ3BDLE1BQU1rQyxFQUFnQjVhLEdBQU8wWSxVQUFZQSxHQUFZLENBQUMsRUFFdEQsTUFBTyxDQUNML2xCLHFCQUFxQixFQUNyQmtvQixTQUFTLEVBQ1Q3YSxPQUFPLEVBQ1BnYSxVQUFXaGEsR0FBT2dhLFdBQWEsc0JBQy9CQyxRQUFTamEsR0FBT2lhLFNBQVcsaUNBRTNCcG1CLFlBQWErbUIsRUFBYy9tQixZQUMzQmYsSUFBSzhuQixFQUFjOW5CLElBQ25CMGxCLGFBQWNvQyxFQUFjcEMsYUFDNUJlLE9BQVFxQixFQUFjckIsT0FDdEJDLFdBQVlvQixFQUFjcEIsV0FDMUJDLFlBQWFtQixFQUFjbkIsWUFDM0JHLEdBQUlnQixFQUFjaEIsR0FFbEJrQixlQUFnQmxELEVBQWlCbUQsYUFBYS9hLEdBQU82WixTQUVyRG1CLHFCQUFzQmhiLEdBQU8wYSxlQUFlVCxRQUVoRCxDQUVBLG1CQUFPYyxDQUFheEYsRUFBTyxHQUFJMEYsRUFBWSxLQUN6QyxNQUFvQixpQkFBVDFGLEVBQ0YsR0FHRkEsRUFBS3ZrQixPQUFTaXFCLEVBQ2pCLEdBQUcxRixFQUFLMkYsTUFBTSxFQUFHRCxRQUNqQjFGLENBQ04sQ0FFQSx5QkFBYXVFLENBQWFkLEdBQ3hCLElBQ0UsYUFBYUEsRUFBU21CLE1BQ3hCLENBQUUsTUFBT25hLEdBQ1AsTUFBTyxFQUNULENBQ0YsQ0FFQSxlQUFPOFgsQ0FBU3FELEdBRWQsT0FEYyxJQUFBbHFCLFVBQVEsSUFBQVcsV0FBVTZiLEdBQUtBLElBQUksSUFBQWhXLE1BQUssU0FDdkMyakIsQ0FBTUQsRUFDZixDQUVBLGFBQU9uRCxDQUFPbUQsR0FDWixNQUFNcm9CLEdBQU0sSUFBQTJFLE1BQUssTUFBTzBqQixHQU14QixZQUpZbnJCLElBQVI4QyxJQUNGLE9BQVUsb0RBR0xBLENBQ1QsQ0FFQSxzQkFBT29sQixDQUFnQmlELEdBQ3JCLE9BQU8sSUFBQXZwQixXQUFVLFFBQVEsSUFBQTZGLE1BQUssZUFBZ0IwakIsR0FDaEQsQ0FFQSxTQUFJanJCLEdBQ0YsT0FBT3FCLEtBQUtzbUIsTUFDZCxDQUVBLE9BQUkva0IsR0FDRixPQUFPdkIsS0FBS3dtQixJQUNkLENBRUEsaUJBQUlRLEdBQ0YsT0FBT2huQixLQUFLNG1CLGNBQ2QsQ0FFQSxnQkFBSUssR0FDRixPQUFPam5CLEtBQUswbUIsYUFDZCxDQUVBLDhCQUFPb0QsQ0FBd0IxZixHQUM3QixNQUFNNFosRUFBTzVaLEdBQUs0WixLQU9sQixJQUE0QixJQUpqQixPQUFUQSxHQUNnQixpQkFBVEEsR0FDUEEsRUFBSzVsQixjQUFnQjBFLFFBR3JCLE9BQU9zSCxFQUdULE1BQU0rZCxFQUFVLElBQUk0QixRQUFRM2YsRUFBSStkLFNBQVcsQ0FBQyxHQU01QyxPQUpvQyxJQUFoQ0EsRUFBUTdpQixJQUFJLGlCQUNkNmlCLEVBQVFua0IsSUFBSSxlQUFnQixvQkFHdkIsSUFDRm9HLEVBQ0grZCxVQUNBbkUsS0FBTTdnQixLQUFLQyxVQUFVNGdCLEdBRXpCLENBRUEsaUNBQU9nRyxDQUEyQkosR0FJaEMsWUFIK0JuckIsSUFBZm1yQixHQUFNNUYsTUFHa0IsU0FGekI0RixHQUFNeEksUUFBVSxPQUVUMUUsZ0JBQ3BCLE9BQ0UsbUZBQ0FrTixHQUdLLElBQ0ZBLEVBQ0h4SSxPQUFRLFNBSUx3SSxDQUNULENBRUEsdUJBQU8vQyxDQUFpQitDLEdBQ3RCLE1BQU1wcEIsR0FBVSxJQUFBWixNQUFLLENBQ25CLFNBQ0EsVUFDQSxPQUNBLE9BQ0EsY0FDQSxRQUNBLFdBQ0EsV0FDQSxpQkFDQSxZQUNBLGFBQ0NncUIsR0FFSCxJQUFJSyxHQUFnQixJQUFBam9CLGdCQUFlcWtCLEVBQWlCNkQsY0FBZTFwQixHQUtuRSxPQUhBeXBCLEVBQWdCNUQsRUFBaUIyRCwyQkFBMkJDLEdBQzVEQSxFQUFnQjVELEVBQWlCeUQsd0JBQXdCRyxHQUVsREEsQ0FDVCxDQUVBLGtCQUFPQyxHQUNMLE1BQU8sQ0FDTDlJLE9BQVEsTUFFUitHLFFBQVMsSUFBSTRCLFFBQVEsQ0FDbkJJLE9BQVEsc0NBR1Y1SCxLQUFNLE9BQ042SCxZQUFhLGNBQ2JDLE1BQU8sVUFDUEMsU0FBVSxTQUNWQyxlQUFnQiw2QkFDaEJDLFVBQVcsR0FDWEMsV0FBVyxFQUVmLEUsb0RDbFVGLE1BQU1DLEdBQVcsSUFBQWhyQixTQUFRLEVBQUFpckIsS0FBSyxJQUFBN2xCLElBQUdDLFFBQzNCNmxCLEdBQWEsSUFBQWxyQixTQUFRLEVBQUFpckIsSUFBSyxFQUFBbGhCLFNBQzFCb2hCLEdBQWdCLElBQUF0ckIsU0FBUSxFQUFDLElBQUF1RixJQUFHVyxRQUFTbWxCLElBQ3JDRSxHQUFnQixJQUFBdnJCLFNBQVEsRUFBQyxJQUFBdUYsSUFBR0MsT0FBUTZsQixJQUNwQ0csR0FBYSxJQUFBcnJCLFVBQVEsSUFBQUgsU0FBUSxDQUFDbXJCLEdBQVUsSUFBQTVsQixJQUFHaEMsV0FDM0Nrb0IsR0FBcUIsSUFBQXRyQixVQUFRLElBQUFILFNBQVEsQ0FBQ3FyQixFQUFZRixHQUFVLElBQUE1bEIsSUFBR2hDLFdBTzlELE1BQU1tb0IsRUFtRVgsV0FBQTdzQixDQUFZOHNCLEVBQVVDLEVBQVUsQ0FBQyxFQUFHQyxFQUFZcnNCLEdBQ3hCZ3NCLEVBQVdHLEtBRy9CQyxFQUFVRCxFQUNWQSxHQUFXLElBQUFobEIsTUFBSyxXQUFZaWxCLEdBQzVCcHNCLEVBQVdBLElBQVksSUFBQW1ILE1BQUssV0FBWWlsQixJQUcxQyxNQUFNRSxFQUFnQixDQUFDRCxHQUFZLElBQUFsbEIsTUFBSyxhQUFjaWxCLElBRXREQyxHQUFhLElBQUExckIsVUFBUSxJQUFBNFcsT0FBSyxJQUFBeFIsSUFBR1csU0FBaEIsQ0FBMEI0bEIsR0FFdkMsSUFBSS9zQixHQUFRLElBQUFvVixNQUFLLENBQUMsYUFBYyxRQUFTLFdBQVksUUFBUyxXQUFZLGVBQWdCeVgsUUFDcEUxc0IsSUFBbEIwc0IsRUFBUTdzQixNQUNWQSxHQUFRLElBQUFtRixVQUFTLENBQUMwbkIsRUFBUTdzQixNQUFPQSxTQUNBRyxJQUF4QjBzQixFQUFRRyxjQUNqQmh0QixHQUFRLElBQUFtRixVQUFTLENBQUMwbkIsRUFBUUcsWUFBYWh0QixLQUd6QzZzQixFQUFRRyxZQUFjaHRCLEVBRXRCLE1BQU0sWUFBRWd0QixHQUFnQkgsRUFFbEJJLEVBQTJCVixFQUFjSyxHQUFZRCxFQUFxQk8sZUFBZSxDQUFDTixHQUFXRSxRQUFjM3NCLEVBQ25IZ3RCLEVBQTJCWCxFQUFjSSxHQUFZRCxFQUFxQk8sZUFBZU4sRUFBVUUsUUFBYzNzQixFQUNqSGl0QixFQUFnQlYsRUFBbUJNLEdBQWVMLEVBQXFCVSxXQUFXTCxFQUFhRixRQUFjM3NCLEVBRW5ILElBQUltdEIsR0FBYSxJQUFBL3BCLFFBQU8sRUFBQTNDLE1BQU8sQ0FBQ3FzQixFQUF5QkUsRUFBd0JDLElBSWpGLE1BQU1HLEdBQWtCLElBQUFwaUIsU0FBUW1pQixHQVFoQyxPQU5JQyxJQUNGRCxFQUFhLEVBQUMsSUFBQWhoQixTQUFPLEtBQ1ksSUFBN0IsSUFBbUIvSCxRQUErQixJQUFiOUQsR0FDdkNjLFFBQVFDLEtBQUsscURBQXFEb3JCLHNCQUE2QkksNEJBR2xGLElBQWJ2c0IsRUFDSyxDQUFFbXNCLFdBQVVJLGNBQWFGLGFBQVlELFVBQVNwc0IsV0FBVThzQixvQkFHMUQsSUFBQXRzQixTQUFRcXNCLEVBQ2pCLENBRUEsaUJBQU9ELENBQVdHLEVBQVlDLEdBQzVCLE1BQU1YLEVBQWFXLEVBMERuQixNQXhEb0IsTUFFbEIsSUFBSSxJQUFBdGlCLFNBQVFxaUIsR0FDVixPQUFPLElBQUFsaEIsU0FBTyxHQXVCaEJraEIsR0FBYSxTQWZjLENBQUMzc0IsRUFBSzJRLEVBQUsxRixLQUNwQyxJQUFJNGhCLEVBQVEsRUFBQUMsRUFDWixHQXZJVSxDQUFDOXNCLElBQVEsSUFBQTJGLElBQUdXLE9BQVF0RyxHQXVJMUIrc0IsQ0FBUy9zQixJQXRJSCxDQUFDQSxJQUFRLElBQUEyRixJQUFHcW5CLFFBQVNodEIsR0FzSVZpdEIsQ0FBVWp0QixJQXJJckIsQ0FBQ0EsSUFBUSxJQUFBMkYsSUFBR2tQLE9BQVE3VSxHQXFJU2t0QixDQUFTbHRCLEdBTHBCbXRCLEVBTUludEIsRUFBOUI2c0IsRUFOeUMxaEIsR0FDcENBLElBQVFnaUIsTUFNUixJQUFtQixtQkFBUm50QixFQUNoQixPQUFPQSxFQUNGLEdBeElHLENBQUNBLElBQVEsSUFBQTJGLElBQUdDLE1BQU81RixHQXdJbEJvdEIsQ0FBVXB0QixJQUFRNHJCLEVBQVc1ckIsR0FLdEMsT0FKQVUsUUFBUUMsS0FDSixtQ0FBbUNYLHdGQUdoQzZzQixDQUNULENBZjRCTSxNQWdCNUIsT0FBT04sR0FFNkJGLEdBR3RDLE1BZU1VLEdBQVUsSUFBQUMsT0FBTVgsR0FTdEIsT0FBTyxJQUFBcHNCLFNBQVE4c0IsRUF4QklFLElBQ2pCLFFBQW1CanVCLElBQWYyc0IsRUFDRixPQUFPc0IsRUFFVCxNQUFNQyxFQUFnQixDQUFDLEVBT3ZCLE9BSEEsSUFBQUMsbUJBSGlCLENBQUN6WSxFQUFPckUsS0FDdkI2YyxFQUFjN2MsR0FBT3FFLEdBQU0sSUFBQWpPLE1BQUs0SixFQUFLNGMsS0FFWFosR0FDNUJqc0IsUUFBUWtuQixJQUFJLHdDQUF3Q3FFLG9CQUE4QixnQkFBaUIsQ0FBRXVCLGdCQUFlRCxnQkFFN0dBLElBYTBCLElBQUFyc0IsV0FBVSxDQUFDLEdBUHBCd1AsSUFDeEIsTUFBTSxRQUFFdk8sRUFBTyxXQUFFRSxFQUFVLE1BQUVlLEdBQVVzTixHQUFLLENBQUMsRUFHN0MsT0FGVS9NLE9BQU9raUIsT0FBTyxDQUFDLEVBQUduVixFQUFHck8sRUFBWWUsRUFBT2pCLE1BUS9DdXJCLEVBQ1QsQ0FFQSwyQkFBT0MsQ0FBcUJ0dEIsRUFBSzRyQixFQUFZMkIsR0FFM0MsTUFBTSxRQUFFenJCLEVBQU8sV0FBRUUsRUFBVSxNQUFFZSxHQUFVd3FCLEdBQWMsQ0FBQyxFQWFoRGpXLEVBQUssQ0FBQ3RWLEVBQVlGLEdBQVMsSUFBQTRFLE1BQUssYUFBYzNELEdBQVF3cUIsR0FBWXJXLE9BWG5ELENBQUNaLEVBQUtrWCxLQUN6QixRQUFZdnVCLElBQVJxWCxFQUNGLE9BQU9BLEVBRVQsTUFBTWdCLEdBQUssSUFBQTVRLE1BQUssS0FBTThtQixHQUl0QixPQUhJL0IsRUFBcUJqbEIsZUFBZThRLEtBQ3RDaEIsRUFBTWdCLEdBRURoQixRQUdvRnJYLEdBR3ZGd3VCLEVBQW9CLE9BQVBuVyxHQUE2QixpQkFBUEEsR0FBeUMsbUJBQWZBLEVBQUdzRyxRQWtCaEU4UCxFQUFpQkQsR0FBYSxTQVhqQkUsSUFDakIsSUFDRSxPQUFPclcsRUFBR3NHLFFBQVErUCxFQUNwQixDQUFFLE1BQU8zbUIsR0FJUCxPQUhpQyxJQUE3QixJQUFtQjNELE9BQ3JCaEQsUUFBUUMsS0FBSyxxREFBcURxdEIsb0NBRTdELENBQ1QsR0FHa0QzdEIsR0FBTyxHQUUzRCxRQUFtQmYsSUFBZjJzQixFQUEwQixDQUM1QixNQUFNZ0MsRUFBZTV0QixFQUNyQkssUUFBUWtuQixJQUFJLHdDQUF3Q3FFLG9CQUE4QixnQkFBaUIsQ0FBRXRVLEtBQUlzVyxlQUFjQyx1QkFBd0JILEdBQ2pKLENBRUEsT0FBbUIsSUFBZkQsSUFBb0QsS0FBNUIsSUFBQXhqQixTQUFReWpCLEtBSTdCLElBQUFJLE1BQUksSUFBQTloQixTQUFPLEdBQU8waEIsRUFDM0IsQ0FFQSxxQkFBT2xuQixDQUFlcEIsR0FLcEIsT0FKSSxJQUFBRSxJQUFHVyxPQUFRYixLQUNiQSxFQUFJOFYsU0FBUzZTLGNBQWMzb0IsS0FHdEIsSUFBQWxGLFVBQVEsSUFBQXVHLEtBQUksSUFBSSxJQUFBNUYsWUFBVyxJQUFJLElBQUE2RixNQUFLLFlBQXBDLENBQWlEdEIsRUFDMUQsQ0FFQSxxQkFBTzRtQixDQUFlZ0MsRUFBYXBDLEdBQ2pDLE1BQU01ckIsR0FBTSxJQUFBcUMsUUFBTyxFQUFBNEgsUUFBUytqQixHQUU1QixPQURxQixJQUFBN1EsT0FBTXNPLEVBQXFCNkIscUJBQ3pDVyxDQUFhanVCLEVBQUs0ckIsRUFDM0IsRSxhQ3BSRixTQUFTc0MsRUFBa0J2dUIsR0FFekIsT0FEc0JBLEdBQXNCLGlCQUFSQSxHQUM0QixvQkFBeEMyRCxPQUFPQyxVQUFVNHFCLFNBQVMxcUIsS0FBSzlELElBQXNFLGtCQUF4QzJELE9BQU9DLFVBQVU0cUIsU0FBUzFxQixLQUFLOUQsRUFDdEgsQ0FNQSxTQUFTeXVCLEVBQWlCelosRUFBTzBaLEdBRS9CLE9BRGNBLElBQTZDLElBQTFCQSxFQUFnQnJxQixPQUNoQ2txQixFQUFrQnZaLEdBQy9CMlosR0FQZTN1QixFQU9PZ1YsRUFObkJwUCxNQUFNMmEsUUFBUXZnQixHQUFPLEdBQUssQ0FBQyxHQU85QmdWLEVBQU8wWixHQUNQMVosRUFUTixJQUFxQmhWLENBVXJCLENBRUEsU0FBUzR1QixFQUFrQm5vQixFQUFRMEcsRUFBUXVoQixHQUN6QyxNQUFNRyxFQUFjcG9CLEVBQU8rakIsUUFVM0IsT0FUQXJkLEVBQU9sRyxRQUFRLFNBQVNJLEVBQUc2YSxRQUNLLElBQW5CMk0sRUFBWTNNLEdBQ3JCMk0sRUFBWTNNLEdBQUt1TSxFQUFpQnBuQixFQUFHcW5CLEdBQzVCSCxFQUFrQmxuQixHQUMzQnduQixFQUFZM00sR0FBS3lNLEVBQVVsb0IsRUFBT3liLEdBQUk3YSxFQUFHcW5CLElBQ1QsSUFBdkJqb0IsRUFBT2tWLFFBQVF0VSxJQUN4QnduQixFQUFZclgsS0FBS2lYLEVBQWlCcG5CLEVBQUdxbkIsR0FFekMsR0FDT0csQ0FDVCxDQW1CQSxTQUFTRixFQUFVbG9CLEVBQVEwRyxFQUFRdWhCLEdBQ2pDLE1BQU1JLEVBQVFscEIsTUFBTTJhLFFBQVFwVCxHQUV0QjRoQixHQURVTCxHQUFtQixDQUFFSyxXQUFZSCxJQUN0QkcsWUFBY0gsRUFFekMsT0FBSUUsRUFDS2xwQixNQUFNMmEsUUFBUTlaLEdBQ2pCc29CLEVBQVd0b0IsRUFBUTBHLEVBQVF1aEIsR0FDM0JELEVBQWlCdGhCLEVBQVF1aEIsR0F6QmpDLFNBQXFCam9CLEVBQVEwRyxFQUFRdWhCLEdBQ25DLE1BQU1HLEVBQWMsQ0FBQyxFQWFyQixPQVpJTixFQUFrQjluQixJQUNwQjlDLE9BQU9rRyxLQUFLcEQsR0FBUVEsUUFBUSxTQUFTMEosR0FDbkNrZSxFQUFZbGUsR0FBTzhkLEVBQWlCaG9CLEVBQU9rSyxHQUFNK2QsRUFDbkQsR0FFRi9xQixPQUFPa0csS0FBS3NELEdBQVFsRyxRQUFRLFNBQVMwSixHQUM5QjRkLEVBQWtCcGhCLEVBQU93RCxLQUFVbEssRUFBT2tLLEdBRzdDa2UsRUFBWWxlLEdBQU9nZSxFQUFVbG9CLEVBQU9rSyxHQUFNeEQsRUFBT3dELEdBQU0rZCxHQUZ2REcsRUFBWWxlLEdBQU84ZCxFQUFpQnRoQixFQUFPd0QsR0FBTStkLEVBSXJELEdBQ09HLENBQ1QsQ0FZV0csQ0FBWXZvQixFQUFRMEcsRUFBUXVoQixFQUV2QyxDLGlCQUVBQyxFQUFVenVCLElBQU0sU0FBc0I0dUIsRUFBT0osR0FDM0MsSUFBSzlvQixNQUFNMmEsUUFBUXVPLElBQVVBLEVBQU14dUIsT0FBUyxFQUMxQyxNQUFNLElBQUkycEIsTUFDUixnRUFJSixPQUFPNkUsRUFBTXZYLE9BQU8sU0FBUzBYLEVBQU1saUIsR0FDakMsT0FBTzRoQixFQUFVTSxFQUFNbGlCLEVBQU0yaEIsRUFDL0IsRUFDRixDLHdGQ3ZFQSxNQU9NUSxFQUFZQyxNQUFNaGpCLEVBQUk1SSxLQVUxQitCLE9BQU9pRyxXQUxnQjRqQixnQkFIZCxJQUFJQyxRQUFRQyxHQUFXOWpCLFdBQVc4akIsRUFJN0IsSUFDWi9wQixPQUFPZ3FCLHNCQUFzQm5qQixJQUdHNUksSUFHOUJnc0IsRUFBc0J0a0IsSUFDMUIsUUFBNkIzTCxJQUF6QjJMLEVBQUloTSxZQUFZQyxLQUNsQixPQUFPK0wsRUFBSWhNLFlBQVlDLEtBRXpCLE1BQ01pTSxFQUFNRixFQUFJdWpCLFdBQ2hCLE9BQU8sSUFBQXR0QixXQUFVb0YsT0FBTzZFLEdBQUtxa0IsT0FBTyxFQUFHLEtBQUssSUFBQTVaLE9BRmpDLDRCQUUyQ3pLLEdBQUssS0F5QnZEc2tCLEVBQXlCLENBQUN4a0IsRUFBS0UsU0FDbEI3TCxJQUFiMkwsRUFBSUUsR0FDQ0EsR0FHeUIsSUFBQTVLLFNBQVEsRUFBQXdLLE1BQU0sSUFBQXhCLFNBQU8sSUFBQWhKLFVBQVEsSUFBQWtWLE1BQUssRUFBQW9GLEdBQUkxUCxHQUR2RHVrQixHQUFLLElBQUl4WSxPQUFPd1ksS0FFMUJDLEVBQTBCLElBQUE5bEIsTUFBS29CLElBaUJsQzJrQixFQUE0QkMsSUFDaEMsTUFBTTVrQixFQUFNLENBQUMsRUFDYixJQUFLLE1BQU11QixLQUFLcWpCLEVBQ2Q1a0IsRUFBSXVCLEdBQUtxakIsRUFBT3JqQixHQUVsQixPQUFPdkIsR0E2Qkg2a0IsRUFBNkI3a0IsSUFDakMsTUFBTXdnQixHQUFhLElBQUFsckIsVUFBUSxJQUFBcWEsWUFBVyxFQUFBdFEsU0FBVSxFQUFBUyxLQUFNLEVBQUF2SyxRQUNoRHV2QixHQUFXLElBQUF4dkIsVUFBUSxJQUFBcWEsWUFBVyxFQUFBN2EsT0FBUSxFQUFBZ0wsS0FBTSxFQUFBdkssUUFFbEQsT0FEOEIsSUFBQUosU0FBUSxDQUFDcXJCLEVBQVlzRSxHQUM1Q0MsQ0FBc0Iva0IsSUFnQi9CLFNBQVNnbEIsRUFBa0JDLEVBQVVDLEVBQWlCLElBRXBELE1BQ01DLEdBQXlCLElBQUFodkIsUUFESCxDQUFDLFNBQVUsT0FBUSxZQUFhLGVBQ0QrdUIsR0FHckRFLEdBQW1CLElBQUE5dkIsVUFBUSxJQUFBK3ZCLFNBQVFGLEdBQXlCLEVBQUFHLE1BRzVENU8sRUFBVTBPLEVBQ2Qxc0IsT0FBT3FELG9CQUFvQmtwQixFQUFTanhCLFlBQVkyRSxZQUk1QzRzQixFQUFnQkgsRUFDcEIxc0IsT0FBT3FELG9CQUFvQmtwQixFQUFTanhCLGNBS3RDLE1BQU8sQ0FBRTBpQixVQUFTNk8sZ0JBQWVDLFlBRmQsSUFBQXJ2QixRQUFPdWdCLEVBQVM2TyxHQUdyQyxDLDRDQ3JKTyxTQUFTRSxJQUtkbmxCLFdBSmdCLE1BRWQsSUFBQXRFLFNBRGNvUCxNQUNDeFYsT0FFRyxFQUN0QixDLGFDUE8sU0FBUzh2QixJQUNkLE1BQU8sQ0FDTEMsZUFBZ0IsV0FDZCxNQUFNQyxFQUFLLElBQUk1dEIsUUFDVDZ0QixFQUFTLENBQUVDLEtBQU1sd0IsS0FBSzFCLE1BQU00eEIsTUFFbEMsT0FEQUYsRUFBR2hzQixJQUFJaXNCLEVBQVFqd0IsS0FBSzFCLE9BQ2IsQ0FDTHdSLElBQUttZ0IsRUFDTEUsUUFBU0gsRUFFYixFQUNBSCxHQUFJLFdBQ0YsSUFBSyxNQUFNcmEsS0FBS3hWLFlBQ1BBLEtBQUt3VixFQUdoQixFQUNBNGEsU0FBVSxXQUlSLE9BRGtCbFIsS0FBS21SLFNBQVMxQyxTQUFTLElBQUlyWSxRQUFRLE9BQVEsSUFBSWdiLFVBQVUsRUFBRyxFQUdoRixFQUNBQyxhQUFjLFNBQVMxdEIsR0FDckIsT0FBaUIsSUFBVkEsRUFDSGhELFFBQVFrbkIsSUFDUixNQUVOLEVBRUosQywwREM3Qk8sU0FBU3lKLElBQ2QsTUFBTyxDQUNMQyxTQUFVLFNBQVNubUIsR0FDakJ6SyxRQUFRa25CLElBQUksbUJBQW9CemMsRUFDbEMsRUFDQW9tQixpQkFBa0IsU0FBUzNrQixFQUFLcEUsR0FFOUIsT0FBTyxJQUFJLElBQWtCLGdCQUFpQm9FLEVBQUtwRSxFQUFNLFlBQzNELEVBQ0FncEIsY0FBZSxTQUFTNWtCLEVBQUtwRSxHQUMzQixPQUFPLElBQUksSUFBa0IsYUFBY29FLEVBQUtwRSxFQUFNLFlBQ3hELEVBMEJKLEMsb0RDckNPLE1BQU1pcEIsRUFDWCxXQUFBeHlCLENBQVl5eUIsR0FDVixNQUFNeHlCLEVBQU9vSCxPQUFPb3JCLEVBQUl2eUIsTUFBTUQsTUFDeEJ5bEIsRUFBSyxHQUFHemxCLGtCQUdkLE9BRCtCLElBQUFzZSxPQUFNaVUsRUFBb0JFLDZCQUNsREMsQ0FBdUIsQ0FBRWpOLEtBQUl6bEIsUUFDdEMsQ0FFQSxtQ0FBT3l5QixDQUE2Qnh5QixFQUFPcUosR0FDekMsTUFBTSxLQUFFdEosRUFBSSxHQUFFeWxCLEdBQVF4bEIsRUFDaEJnRCxFQUFVcUcsRUFDVnFwQixFQUFLLElBQUksSUFBVyxDQUN4QmxOLEtBQUl6bEIsT0FBTXNKLFNBR1pxcEIsRUFBR0MsV0FBYSxLQUNkRCxFQUFHRSxrQkFBa0IsZ0JBQWlCNXZCLElBR3hDMHZCLEVBQUdHLHFCQUF1QixLQUN4QkgsRUFBR0kscUJBR0xKLEVBQUdLLGNBQ0wsRSxrR0N4QkYsTUFpRE1DLEVBQWdCLENBQUMxc0IsRUFBSSxDQUFDLEtBQzFCLE1BQU0sbUJBQUUyc0IsR0FBdUIzc0IsRUFDL0IsUUFBMkJuRyxJQUF2Qjh5QixFQUFrQyxDQUNwQyxNQUFNQyxFQUFxQixJQUFtQkMsZ0JBQWdCRixHQUM5RCxHQUFrQyxtQkFBdkJDLEVBQ1QsTUF4QzhCLEVBQUNuc0IsRUFBVyxDQUFDLEVBQUdtc0IsS0FDbEQsTUFBTSxtQkFBRUQsR0FBdUJsc0IsT0FFSjVHLElBQXZCOHlCLEdBQ0YxeEIsUUFBUTRPLE1BQU0sOEJBQStCcEosR0FHL0MsTUFBTXFzQixFQUFzQixDQUFDOXJCLEVBQVErckIsS0FDbkMsTUFBTUMsR0FBaUIsSUFBQXR4QixNQUFLcXhCLEVBQVN0c0IsSUFDL0IsaUJBQUVRLEVBQWdCLGVBQUVnc0IsR0FBbUJELEVBQzdDLE9BQU8vckIsRUFBbUIyckIsRUFBbUI1ckIsRUFBUWlzQixHQUFrQmpzQixHQUduRWtzQixFQUFVSixHQUFvQixJQUFBbHVCLE9BQU02QixHQUFXLElBRS9DMHNCLEVBQWdCLENBQUNDLEVBQVNDLEtBQzlCLE1BQU1DLEVBQVdELEdBQVksR0FVN0JudkIsT0FBT3F2QixRQUFRSCxHQUFTNXJCLFFBVFIsRUFBRTBKLEVBQUs1SixNQUNyQixNQUFNMkksRUFoQ1EsQ0FBQ3dKLElBQ25CLElBQUl4SixTQUFjd0osRUFVbEIsTUFUSSxDQUFDLFNBQVUsVUFBVyxVQUFVL1QsU0FBU3VLLEdBQzNDQSxFQUFPLFlBQ1csV0FBVEEsSUFDTDlKLE1BQU0yYSxRQUFRckgsR0FDaEJ4SixFQUFPLFFBQ1UsT0FBUndKLElBQ1R4SixFQUFPLGNBR0pBLEdBcUJVdWpCLENBQVlsc0IsR0FDbkJtc0IsRUFBYSxJQUFJSCxHQUN2QkcsRUFBVzFiLEtBQUs3RyxHQUNILFdBQVRqQixHQUE4QixVQUFUQSxJQUN2Qm1qQixFQUFRbGlCLEdBQU80aEIsRUFBb0J4ckIsRUFBTW1zQixHQUN6Q04sRUFBYzdyQixFQUFNbXNCLE9BUzFCLE9BSEFOLEVBQWNELEdBR1BBLEdBUUlRLENBQTRCMXRCLEVBQUc0c0IsRUFFMUMsR0FlV2UsRUFBZ0IsU0FBUzN0QixFQUFHNHRCLEVBQU8sSUFBSUMsU0FDbEQsR0FBVSxPQUFON3RCLEdBQTJCLGlCQUFOQSxFQUN2QixPQUFPQSxFQUdULE1BQU04dEIsRUFBVXBCLEVBQWMxc0IsR0FDOUIsUUFBZ0JuRyxJQUFaaTBCLEVBQ0YsT0FBT0EsRUFHVCxHQUFJRixFQUFLbHRCLElBQUlWLEdBQ1gsT0FBT0EsRUFJVCxHQUZBNHRCLEVBQUtHLElBQUkvdEIsR0FFTEcsTUFBTTJhLFFBQVE5YSxHQUNoQixPQUFPQSxFQUFFbEcsSUFBSWlPLEdBQVE0bEIsRUFBYzVsQixFQUFNNmxCLElBRzNDLE1BQU1JLEVBQU0sQ0FBQyxFQUliLE9BSEE5dkIsT0FBT3F2QixRQUFRdnRCLEdBQUd3QixRQUFRLEVBQUUwSixFQUFLM1EsTUFDL0J5ekIsRUFBSTlpQixHQUFPeWlCLEVBQWNwekIsRUFBS3F6QixLQUV6QkksQ0FDVCxFQVlNQyxFQUF3QixDQUFDQyxFQUFXQyxLQUN4QyxNQUFNQyxFQUFZRixHQUFXdkIsbUJBQzdCLFFBQWtCOXlCLElBQWR1MEIsRUFDRixPQUFPRCxFQUVULE1BQU12QixFQUFxQixJQUFtQkMsZ0JBQWdCdUIsR0FDOUQsTUFBa0MsbUJBQXZCeEIsRUFDRnVCLEVBRUZ2QixFQUFtQnVCLEVBQVdELEVBQVVqQixpQkFTcENvQixFQUFhLFNBQVN6ekIsRUFBS2tQLEdBQ3RDLE9BQU9ta0IsRUFBc0JyekIsRUFBS0EsRUFBSWtKLE9BQU9nRyxHQUMvQyxFQU1hd2tCLEVBQWEsU0FBUzF6QixFQUFLa1AsR0FDdEMsT0FBT21rQixFQUFzQnJ6QixFQUFLQSxFQUFJa0osT0FBTyxDQUFDaUUsRUFBTTBVLEtBQTZCLElBQXZCM1MsRUFBVS9CLEVBQU0wVSxJQUM1RSxFQVlhOFIsRUFBVSxTQUFTM3pCLEVBQUtiLEdBQ25DLE1BQU15MEIsRUFBUzV6QixFQUFJZCxJQUFJLENBQUNpTyxFQUFNMFUsS0FDNUIsTUFBTWdTLEVBQXFCLE9BQVQxbUIsR0FBaUMsaUJBQVRBLFFBQWlEbE8sSUFBNUJrTyxFQUFLNGtCLG1CQUNwRSxPQUFPNXlCLEVBQU0wMEIsRUFBWWQsRUFBYzVsQixHQUFRQSxFQUFNMFUsS0FFdkQsT0FBT3dSLEVBQXNCcnpCLEVBQUs0ekIsRUFDcEMsRUFhYUUsRUFBYyxTQUFTMXVCLEVBQUcydUIsRUFBVyxDQUFDLEdBQ2pELE1BQU0zdEIsRUFBUzJzQixFQUFjM3RCLEdBSTdCLE9BSEE5QixPQUFPcXZCLFFBQVFvQixHQUFVbnRCLFFBQVEsRUFBRTBKLEVBQUszUSxNQUN0Q3lHLEVBQU9rSyxHQUFPM1EsSUFFVHlHLENBQ1QsRUFFYWxDLEVBQVksU0FBU2tCLEVBQUc0dUIsR0FBTyxHQUMxQyxNQUFNZCxFQUFVcEIsRUFBYzFzQixHQUM5QixRQUFnQm5HLElBQVppMEIsRUFDRixPQUFPQSxFQUdULElBQWEsSUFBVGMsRUFDRixPQUFPakIsRUFBYzN0QixHQUd2QixNQUFNQyxHQUFRLElBQUFDLElBQUdDLE9BQ1hDLEdBQVEsSUFBQUYsSUFBR2hDLFFBQ0ZtQyxNQUVmLE9BRm1DLElBQWRKLEVBQU5JLEVBQ1dMLEtBRGdDLElBQWRJLEVBQU1DLElBRTlCLElBQUF2RixTQUFRLEVBQUF3RixVQUFXLEVBQUFDLFFBQVMsRUFBQTNCLE1BQTVCLENBQW1Db0IsSUFBSyxJQUFBcEIsT0FBTW9CLEVBQ3BFLEMsNkhDM0xBLElBQUk2dUIsRUFDQUMsR0FBZSxFQUNmQyxHQUFnQixFQVVwQixNQUFNQyxFQUFrQiwyRUFLbEJDLEVBQXdCMTBCLEdBQVFzRyxPQUFPdEcsR0FBS21XLFFBQVEsbUJBQW9CLElBRXhFd2UsRUFBYTMwQixHQUFReTBCLEVBQWdCaGYsS0FBS2lmLEVBQXFCMTBCLElBZS9ENDBCLEVBQTBCLDJCQUUxQkMsRUFBK0IsR0FFL0JDLEVBQXNCLENBQUNDLEVBQVcsT0FDMUJudkIsTUFBTTJhLFFBQVF3VSxHQUFZQSxFQUFXLENBQUNBLElBRTlDOXRCLFFBQVN5WixJQUNYLEdBQUlBLGFBQWlCeEosT0FFbkIsWUFEQTJkLEVBQTZCcmQsS0FBS2tKLEdBSXBDLE1BQU14aEIsRUFBT29ILE9BQU9vYSxHQUFPekssZUFDc0IsSUFBN0MsOEJBQThCUixLQUFLdlcsR0FLdkMyMUIsRUFBNkJyZCxLQUFLdFksSUFKaEMsT0FBVSxtQkFBbUJ3aEIsaUhBZ0I3QnNVLEVBQTBCLENBQzlCQyxhQVQ2QkMsS0FDekJOLEVBQXdCbmYsS0FBS3lmLElBRTFCTCxFQUE2Qk0sS0FBS3BZLEdBQ3ZDQSxhQUFhN0YsT0FBUzZGLEVBQUV0SCxLQUFLeWYsR0FBV25ZLElBQU1tWSxHQU1oREUsbUJBQW9CLHFCQUNwQkMsZ0NBQWdDLEdBTTVCQyxFQUFxQixDQUN6QkMsYUFBYyxDQUNaLElBQUssSUFBSyxJQUFLLEtBQU0sU0FBVSxJQUFLLElBQUssS0FBTSxLQUFNLEtBQU0sS0FBTSxLQUFNLEtBQU0sS0FBTSxLQUNuRixhQUFjLE1BQU8sT0FBUSxPQUFRLE1BQU8sVUFBVyxVQUFXLFFBQ2xFLFNBQVUsU0FBVSxLQUFNLEtBQU0sS0FBTSxLQUFNLEtBQU0sS0FDbEQsUUFBUyxRQUFTLFFBQVMsS0FBTSxLQUFNLEtBQU0sTUFBTyxTQUFVLGFBQzlELFFBQVMsU0FBVSxTQUFVLFFBQVMsU0FBVSxRQUFTLFFBRTNEQyxTQUFVLENBQUMsU0FBVSxRQUFTLFNBQVUsUUFDeENDLGFBQWMsQ0FDWixPQUFRLE1BQU8sTUFBTyxRQUFTLFFBQVMsUUFBUyxTQUFVLFFBQVMsU0FBVSxNQUM5RSxXQUFZLFNBQVUsT0FBUSxPQUFRLE9BQVEsV0FFaERDLGlCQUFpQixFQUNqQkMsWUFBYSxDQUFDLFVBQVcsU0FBVSxVQUFXLGNBQWUsVUFBVyxTQUFVLFlBQ2xGQyxZQUFhLENBQUMsU0FBVSxTQUFVLFFBQVMsUUFDM0NDLG1CQUFvQnBCLEVBQ3BCTywyQkFHSWMsRUFBZSxDQUNuQkYsWUFBYSxDQUFDLFNBQVUsU0FBVSxTQUFVLFFBQVMsT0FBUSxRQUFTLFNBQVUsT0FBUSxRQUN4RkQsWUFBYSxDQUFDLFVBQVcsU0FBVSxVQUFXLGNBQWUsVUFBVyxTQUFVLFlBQ2xGRCxpQkFBaUIsRUFDakJHLG1CQUFvQnBCLEVBQ3BCTywyQkFlRixJQUFJZSxFQUF5QixDQUFFQyxXQUFPMTJCLEVBQVcyMkIsZUFBZ0IsR0FBSUMsUUFGdEMsZ0RBRzNCQyxFQUFxQkosRUFFekIsTUFBTUssRUFBdUJDLEdBQ3RCQSxFQUNFLENBQ0xMLFdBQTBCMTJCLElBQW5CKzJCLEVBQVNMLE1BQXNCSyxFQUFTTCxNQUFRRCxFQUF1QkMsTUFDOUVDLG9CQUE0QzMyQixJQUE1QisyQixFQUFTSixlQUErQkksRUFBU0osZUFBaUJGLEVBQXVCRSxlQUN6R0MsYUFBOEI1MkIsSUFBckIrMkIsRUFBU0gsUUFBd0JHLEVBQVNILFFBQVVILEVBQXVCRyxTQUpoRUgsRUFvQmxCTyxFQUFxQixDQUFDekksRUFBSzBJLEVBQVNKLEtBQ3hDLE1BQU1LLEVBQWE5QixFQUFxQjdHLEdBRXhDLElBQUk0SSxFQUNKLElBQ0VBLEVBQVcsSUFBSUMsSUFBSUYsRUFBWWx4QixPQUFPUixTQUFTNnhCLEtBQ2pELENBQUUsTUFBT3R2QixHQUNQLE9BQU8sQ0FDVCxDQU9BLEdBQUlvdkIsRUFBU0csU0FBV3R4QixPQUFPUixTQUFTOHhCLFFBQThCLFNBQXBCSCxFQUFTRyxPQUN6RCxPQUFPLEVBdEJ3QixJQUFDQyxFQThCbEMsSUFBaUIsS0FIc0IsV0FBdEJKLEVBQVNLLFVBQ0QsVUFBdEJMLEVBQVNLLFdBM0JDLGVBRHFCRCxFQTRCNkJKLEVBQVNJLFdBMUIzRCxjQUFiQSxHQUNhLFVBQWJBLEdBQ0FBLEVBQVNFLFNBQVMsZ0JBMEJLLE9BQU8sRUFFOUIsTUFBTUMsRUFBVVQsRUFBT04sZUFDdkIsT0FBS3J3QixNQUFNMmEsUUFBUXlXLElBQStCLElBQW5CQSxFQUFRMTJCLFFBRWhDMDJCLEVBQVE3QixLQUFLMXZCLElBQ2xCLElBQ0UsT0FBTyxJQUFJaXhCLElBQUlqeEIsR0FBR214QixTQUFXSCxFQUFTRyxNQUN4QyxDQUFFLE1BQU92dkIsR0FDUCxPQUFPLENBQ1QsS0FJSixJQUFJNHZCLEdBQWtCLEVBQ3RCLE1Bd0NNQyxFQUF1QixDQUFDLFFBQVMsVUFBVyxRQUVsRCxJQUFJQyxFQUF5QixDQUFFQyxhQUFhLEVBQU1DLGFBQWEsRUFBTUMsZUFBZ0IsSUFDakZDLEVBQXFCSixFQUV6QixNQUFNSyxFQUF1Qm5CLEdBQ3RCQSxFQUNFLENBQ0xlLGlCQUFzQzkzQixJQUF6QisyQixFQUFTZSxhQUFxRCxJQUF6QmYsRUFBU2UsWUFBdUJELEVBQXVCQyxZQUN6R0MsaUJBQXNDLzNCLElBQXpCKzJCLEVBQVNnQixhQUFxRCxJQUF6QmhCLEVBQVNnQixZQUF1QkYsRUFBdUJFLFlBQ3pHQyxvQkFBNENoNEIsSUFBNUIrMkIsRUFBU2lCLGVBQStCakIsRUFBU2lCLGVBQWlCSCxFQUF1QkcsZ0JBSnJGSCxFQVFsQk0sRUFBc0IsQ0FBQ2QsRUFBTUosRUFBU2dCLEtBQzFDLE1BQU1mLEVBQWE5QixFQUFxQmlDLEdBR3hDLEdBQUksa0JBQWtCbGhCLEtBQUsrZ0IsR0FBYSxPQUFPLEVBRS9DLElBQUlDLEVBQ0osSUFDRUEsRUFBVyxJQUFJQyxJQUFJRixFQUFZbHhCLE9BQU9SLFNBQVM2eEIsS0FDakQsQ0FBRSxNQUFPdHZCLEdBQ1AsT0FBTyxDQUNULENBR0EsR0FBSW92QixFQUFTRyxTQUFXdHhCLE9BQU9SLFNBQVM4eEIsUUFBOEIsU0FBcEJILEVBQVNHLE9BQ3pELE9BQU8sRUFHVCxJQUE0QyxJQUF4QyxZQUFZbmhCLEtBQUtnaEIsRUFBU0ssVUFBb0IsT0FBTyxFQUV6RCxNQUFNWSxFQUFVbkIsRUFBT2UsZUFDdkIsT0FBSzF4QixNQUFNMmEsUUFBUW1YLElBQStCLElBQW5CQSxFQUFRcDNCLFFBRWhDbzNCLEVBQVF2QyxLQUFLM29CLElBQ2xCLElBQ0UsT0FBTyxJQUFJa3FCLElBQUlscUIsR0FBR29xQixTQUFXSCxFQUFTRyxNQUN4QyxDQUFFLE1BQU92dkIsR0FDUCxPQUFPLENBQ1QsS0FJRXN3QixFQUFvQmhnQixJQUN4QixNQUFNaWdCLEVBQWFqZ0IsRUFBR2tnQixhQUFhLFFBQVUsR0FDdkNDLEVBQVMsSUFBSUMsSUFBSUgsRUFBV0ksTUFBTSxPQUFPenVCLE9BQU95akIsVUFFdEQ4SyxFQUFPdEUsSUFBSSxZQUNYc0UsRUFBT3RFLElBQUksY0FFWDdiLEVBQUdzZ0IsYUFBYSxNQUFPcnlCLE1BQU00SyxLQUFLc25CLEdBQVF4bUIsS0FBSyxPQUdqRCxJQUFJNG1CLEdBQWtCLEVBQ3RCLE1Bd0NNQyxFQUFtQixDQUFDLFdBQVksWUFBYSxlQUU3Q0MsRUFBcUIsS0FDekIsTUFBTUMsRUFBYSxLQUFvQmpWLEtBRXZDLE9BQUkrVSxFQUFpQmh6QixTQUFTa3pCLEdBQW9CLFdBQ2pCLE9BYzdCQyxFQUFtQmxWLElBQ3ZCLE1BQU1tVixFQUFnQixhQUFUblYsRUFBc0JrUyxFQUFxQlEsRUFDbEQwQyxFQWxOcUIsRUFBQ3BWLEVBQU1tVCxFQUFTSixTQUN0QjcyQixJQUFqQmkzQixFQUFPUCxNQUFxQyxhQUFUNVMsR0FDZixJQUFqQm1ULEVBQU9QLE1BZ05NeUMsQ0FBcUJyVixHQUV6QyxHQUFhLGFBQVRBLElBQXVDLElBQWhCb1YsRUFDekIsTUFBTyxJQUNGRCxFQUNIaEQsYUFBY2dELEVBQUtoRCxhQUFhaHNCLE9BQU91USxHQUFXLFdBQU5BLEdBQzVDMGIsU0FBVStDLEVBQUsvQyxTQUFTanNCLE9BQU91USxHQUFXLFdBQU5BLEdBQ3BDOGIsWUFBYSxJQUFJMkMsRUFBSzNDLFlBQWEsV0FJdkMsR0FBYSxRQUFUeFMsRUFBZ0IsQ0FDbEIsTUFBTXNWLEVBQU0sSUFBS0gsR0FDWEksRUFBVSxHQWtCaEIsT0FoQm9CLElBQWhCSCxJQUNGRSxFQUFJOUMsWUFBYzJDLEVBQUszQyxZQUFZcnNCLE9BQU91USxHQUFXLFdBQU5BLEdBQy9DNGUsRUFBSWxELFNBQVcsQ0FBQyxVQUNoQm1ELEVBQVFuaEIsS0FBSyxhQUt3QixJQUFuQytmLEVBQW1CSCxhQUNyQnVCLEVBQVFuaEIsS0FBSyxTQUFVLE9BR3JCbWhCLEVBQVFyNEIsT0FBUyxJQUNuQm80QixFQUFJRSxTQUFXRCxHQUdWRCxDQUNULENBRUEsT0FBT0gsR0FHVCxTQUFTTSxFQUFlelYsRUFBTyxPQUM3QixNQUFNc1YsRUFBTUosRUFBZ0JsVixHQUU1QixPQUFRMFYsR0FBUyxhQUFtQkEsRUFBTUosRUFDNUMsQ0FLQSxNQUFNSyxFQUF3QixDQUFDam1CLEVBQVMsQ0FBQyxLQUN2QyxHQUFJeWhCLEVBRUYsWUFEQSxPQUFVLHVFQUlaLE1BQU0sT0FBRXBSLEdBQVMsRUFBSyxnQkFBRS9qQixHQUFrQixFQUFLLFFBQUVpa0IsRUFBTyxlQUFFRSxFQUFjLFFBQUVELEVBQU8sZ0JBQUUwVixFQUFlLFlBQUUzQixHQUFnQnZrQixFQUVwSDBoQixHQUFvQyxJQUFwQnAxQixPQUVPRSxJQUFuQmlrQixHQUNGdVIsRUFBb0J2UixHQUdsQkYsR0FBOEIsaUJBQVpBLElBQ3BCMFMsRUFBeUJLLEVBQW9CL1MsR0FDN0M4UyxFQUFxQkosR0FLdkJvQixFQUF5QkssRUFBb0IsQ0FDM0NKLGlCQUFzQzkzQixJQUF6QmdrQixHQUFTOFQsWUFBNEI5VCxFQUFROFQsWUFBYzRCLEVBQ3hFM0IsaUJBQXNDLzNCLElBQXpCZ2tCLEdBQVMrVCxZQUE0Qi9ULEVBQVErVCxZQUFjQSxFQUN4RUMsZUFBZ0JoVSxHQUFTZ1UsaUJBRTNCQyxFQUFxQkosRUFFakIzQyxFQUNGOXpCLFFBQVFDLEtBQUssaUlBek9YczJCLElBQ0pBLEdBQWtCLEVBRWxCLFlBQWtCLDBCQUE0QmdDLElBQzVDLElBQUtBLEdBQXlCLFdBQWpCQSxFQUFLL0QsUUFBc0IsT0FFeEMsTUFBTXJILEVBQU1vTCxFQUFLcEIsYUFBYSxRQUFVLEdBQzVCLEtBQVJoSyxJQUEwQyxJQUE1QnlJLEVBQW1CekksTUFDbkMsT0FBVSw4QkFBOEJBLCtGQUN4Q29MLEVBQUtDLGdCQUFnQixRQUd2QixNQUFNLFFBQUVoRCxHQUFZQyxHQUNKLElBQVpELElBQXNELElBQWpDK0MsRUFBS0UsYUFBYSxZQUN6Q0YsRUFBS2hCLGFBQWEsVUFBVy9CLE1BbUY3QmdDLElBQ0pBLEdBQWtCLEVBRWxCLFlBQWtCLDBCQUE0QmUsSUFDNUMsSUFBS0EsR0FBcUMsbUJBQXRCQSxFQUFLcEIsYUFBNkIsT0FDdEQsR0FBcUIsTUFBakJvQixFQUFLL0QsUUFBaUIsT0FFMUIsTUFBTXFCLEVBQVNnQixFQUNUWixFQUFPc0MsRUFBS3BCLGFBQWEsUUFFM0JsQixHQUFRSixFQUFPZSxlQUFlaDNCLE9BQVMsSUFBMkMsSUFBdENtM0IsRUFBb0JkLEVBQU1KLE1BQ3hFLE9BQVUsK0JBQStCSSx1RkFDekNzQyxFQUFLQyxnQkFBZ0IsU0FHdkIsTUFBTXp5QixFQUFTd3lCLEVBQUtwQixhQUFhLFVBQzVCcHhCLEtBR3NCLElBQXZCOHZCLEVBQU9hLGFBQXlCNkIsRUFBS3BCLGFBQWEsU0FRUixJQUExQ1gsRUFBcUIveEIsU0FBU3NCLEtBQTJDLElBQXZCOHZCLEVBQU9jLGFBQzNETSxFQUFpQnNCLEdBUmpCQSxFQUFLQyxnQkFBZ0IsZUEwSHpCLE1BQU1FLEVBQWtCaFcsSUFDdEIsTUFBTWlXLEVBQWNSLEVBQWV6VixHQUM3QmtXLEVBQVd0NUIsSUFDZixHQUFJNEYsTUFBTTJhLFFBQVF2Z0IsR0FBTSxPQUFPQSxFQUFJVCxJQUFJKzVCLEdBQ3ZDLEdBQUl0NUIsR0FBc0IsaUJBQVJBLEVBQWtCLENBQ2xDLE1BQU15ekIsRUFBTSxDQUFDLEVBQ2IsSUFBSyxNQUFPaGpCLEVBQUdDLEtBQU0vTSxPQUFPcXZCLFFBQVFoekIsR0FDbEN5ekIsRUFBSWhqQixHQUFtQixpQkFBTkMsRUFBa0Iyb0IsRUFBWTNvQixHQUFLNG9CLEVBQVE1b0IsR0FFOUQsT0FBTytpQixDQUNULENBQ0EsTUFBdUIsaUJBQVJ6ekIsRUFBb0JxNUIsRUFBWXI1QixHQUFPQSxHQUV4RCxPQUFPczVCLEdBR1RoRixFQUFnQixDQUFDOXJCLEVBQU1paUIsRUFBTyxDQUFDLEtBQzdCLE1BQVFyckIsZ0JBQWlCbTZCLEdBQWMsRUFBSyxLQUFFblcsRUFBTUMsUUFBU21XLEVBQWlCbFcsUUFBU21XLEdBQW9CaFAsRUFDM0csR0FBSStKLEdBQWlCK0UsRUFBYSxPQUFPL3dCLEVBRXpDLE1BQ01reEIsRUFBZ0J0VyxJQURjRCxFQUNVLE1BQVFpVixLQUl0RGpDLEVBQXFCQyxFQUFvQm9ELEdBQ3pDakMsRUFBcUJDLEVBQW9CaUMsR0FDekMsSUFDRSxPQUFPTCxFQUFlTSxFQUFmTixDQUE4QjV3QixFQUN2QyxDQUFFLFFBQ0EydEIsRUFBcUJKLEVBQ3JCd0IsRUFBcUJKLENBQ3ZCLEdBR0Y0QixFQUFzQlksa0JBQW9CLENBQUNueEIsRUFBTTRhLEtBQy9DLEdBQUlvUixFQUFlLE9BQU9oc0IsRUFDMUIsTUFBTW94QixFQUFZeFcsR0FBUWdWLElBQzFCLE9BQU9nQixFQUFlUSxFQUFmUixDQUEwQjV3QixJQUduQytyQixHQUFlLEdBa0NYc0YsRUFBWSxDQUNoQixPQUFRLE1BQU8sU0FBVSxhQUFjLE9BQVEsU0FDL0MsT0FBUSxXQUFZLFdBQVksT0FBUSxjQUdwQ0MsRUFBb0IsQ0FBQ25wQixFQUFLcUUsRUFBT2tnQixLQUNyQyxHQUFJVixFQUFlLE1BQU8sQ0FBRXVGLFNBQVMsRUFBTS9rQixTQUUzQyxNQUFNdkUsRUFBSW5LLE9BQU9xSyxHQUFLc0YsY0FDaEIrakIsRUFBTTF6QixPQUFPNHVCLEdBQVcsSUFBSTNYLGNBSWxDLEdBQUk5TSxFQUFFd3BCLFdBQVcsTUFDZixNQUFPLENBQUVGLFNBQVMsRUFBTy9rQixTQUkzQixHQUFVLFdBQU52RSxFQUFnQixDQUNsQixNQUFNaW9CLEVBQU1KLEVBQWdCRixLQUM1QixNQUFPLENBQUUyQixTQUFTLEVBQU0va0IsTUFBTyxhQUFtQjFPLE9BQU8wTyxHQUFRMGpCLEdBQ25FLENBSUEsTUFBWSxXQUFSc0IsR0FBMEIsUUFBTnZwQixFQUNmLENBQUVzcEIsUUFBU3pELEVBQW1CdGhCLEVBQU8rZ0IsR0FBeUIvZ0IsU0FLM0QsTUFBUmdsQixHQUFxQixTQUFOdnBCLEdBQ1EsSUFBckJra0IsRUFBVTNmLElBQ1ZtaUIsRUFBdUJHLGVBQWVoM0IsT0FBUyxJQUE0RCxJQUF2RG0zQixFQUFvQnppQixFQUFPbWlCLEdBRDdDLENBQUU0QyxTQUFTLEVBQU8va0IsU0FJakQsQ0FBRStrQixTQUFTLEVBQU0va0IsU0FHdEI2a0IsRUFBVTEwQixTQUFTc0wsS0FBMkIsSUFBckJra0IsRUFBVTNmLEdBQzlCLENBQUUra0IsU0FBUyxFQUFPL2tCLFNBR3BCLENBQUUra0IsU0FBUyxFQUFNL2tCLFVBUXBCa2xCLEVBQXlCdmlCLElBQzdCLEdBQUk2YyxJQUFrQjdjLEVBQUksT0FBT0EsRUFFakMsR0FBbUIsV0FBZkEsRUFBR3VkLFFBQXNCLENBQzNCLE1BQU0sUUFBRWdCLEdBQVlILEdBQ0osSUFBWkcsSUFBb0QsSUFBL0J2ZSxFQUFHd2hCLGFBQWEsWUFDdkN4aEIsRUFBR3NnQixhQUFhLFVBQVcvQixFQUUvQixDQUVBLEdBQW1CLE1BQWZ2ZSxFQUFHdWQsUUFBaUIsQ0FDdEIsTUFBTXFCLEVBQVNZLEVBQ1Qxd0IsRUFBU2tSLEVBQUdrZ0IsYUFBYSxVQUUzQnB4QixLQUN5QixJQUF2Qjh2QixFQUFPYSxhQUF5QnpmLEVBQUdrZ0IsYUFBYSxTQUVDLElBQTFDWCxFQUFxQi94QixTQUFTc0IsS0FBMkMsSUFBdkI4dkIsRUFBT2MsYUFDbEVNLEVBQWlCaGdCLEdBRmpCQSxFQUFHdWhCLGdCQUFnQixVQUt6QixDQUVBLE9BQU92aEIsR0FNSHdpQixFQUFzQixDQUFDeGlCLEVBQUl5TCxLQUMvQixJQUFLekwsR0FBTTZjLEVBQWUsT0FDMUIsTUFDTTZFLEVBQWNSLEVBREV6VixHQUFRZ1YsS0FFeEJnQyxFQUFZLGlGQUNsQixHQUF3QixpQkFBYnppQixFQUFHM0MsT0FBc0JvbEIsRUFBVTNrQixLQUFLa0MsRUFBRzNDLE9BQVEsQ0FDNUQsTUFBTXFsQixFQUFRaEIsRUFBWTFoQixFQUFHM0MsT0FDekJxbEIsSUFBVTFpQixFQUFHM0MsUUFBTzJDLEVBQUczQyxNQUFRcWxCLEVBQ3JDLENBQ0EsR0FBSTFpQixFQUFHMmlCLG1CQUE2QyxpQkFBakIzaUIsRUFBRzRpQixXQUEwQkgsRUFBVTNrQixLQUFLa0MsRUFBRzRpQixXQUFZLENBQzVGLE1BQU1GLEVBQVFoQixFQUFZMWhCLEVBQUc0aUIsV0FDekJGLElBQVUxaUIsRUFBRzRpQixZQUFXNWlCLEVBQUc0aUIsVUFBWUYsRUFDN0MsR0F1QkYsRUEvSXFCLENBQUM3eEIsRUFBTWlpQixFQUFPLENBQUMsS0FDbEMsSUFBSzhKLEVBQ0gsTUFBTSxJQUFJdEssTUFBTSx1RUFFbEIsT0FBT3FLLEVBQWM5ckIsRUFBTWlpQixHLDZFQ3JkN0IsSUFBSStQLEVBQ0FqRyxHQUFlLEVBY25CLE1BQU1rRyxFQUF3QixDQUFDM25CLEVBQVMsQ0FBQyxLQUN2QyxHQUFJeWhCLEVBRUYsWUFEQSxPQUFVLHVFQUlaLE1BQU0sT0FDSnBSLEdBQVMsRUFBSyxLQUNkQyxFQUFPLE1BQUssZ0JBQ1poa0IsR0FBa0IsRUFBSyxnQkFDdkI0NUIsR0FBa0IsRUFBSSxNQUN0QnQxQixHQUFRLEVBQUssUUFDYjJmLEVBQVUsQ0FBQyxFQUFDLFFBQ1pDLEVBQVUsQ0FBQyxHQUNUeFEsRUFFSixJQUF3QixJQUFwQjFULEVBSUYsT0FIQXNCLFFBQVFDLEtBQUssZ0lBQ2I2NUIsRUFBaUIxQixHQUFTQSxPQUMxQnZFLEdBQWUsR0FJakIsTUFBTW1HLEVBQWEsQ0FBQyxXQUFZLFlBQWEsZUFBZXYxQixTQUFTaWUsR0FNL0RvVixPQUFnQ2w1QixJQUFsQitqQixFQUFRMlMsT0FBd0MsSUFBbEIzUyxFQUFRMlMsTUFBaUIwRSxFQVFyRUMsRUFBa0IsQ0FDdEJDLHFCQUFxQixFQUNyQnBGLFNBQVUsSUFDSmdELEVBQWMsQ0FBQyxVQUFZLE1BQzNCa0MsRUFBYSxDQUFDLFFBQVUsSUFFOUI5QixTQUFVLFVBUmdDdDVCLElBQXhCZ2tCLEVBQVE4VCxhQUFvRCxJQUF4QjlULEVBQVE4VCxhQUEyQyxJQUFwQjRCLEdBU2pFLENBQUMsU0FBVSxPQUFTLE1BQ2xDUixFQUFjLENBQUMsV0FBYSxJQUtsQ3hELHdCQUF5QixTQUNMLElBQWhCd0QsR0FBd0JrQyxFQUFhLENBQUU5RSxZQUFhLENBQUMsV0FBYyxDQUFDLEdBR3BFaUYsRUFBc0IvQixHQUFTLGFBQW1CQSxFQUFNNkIsR0FJOUQsR0FGQUgsRUFBZ0JLLEdBRUQsSUFBWDFYLEdBQW1CN2QsT0FBT3cxQixhQUM1QixJQUNFLE1BQU12RSxFQUFTanhCLE9BQU93MUIsYUFBYUMsYUFBYSxVQUFXLENBQ3pEQyxXQUFhQyxHQUFhSixFQUFtQkksS0FHL0NULEVBQWlCMUIsR0FBU3ZDLEVBQU95RSxXQUFXbEMsSUFFOUIsSUFBVnAxQixHQUNGaEQsUUFBUWtuQixJQUFJLDBKQUVoQixDQUFFLE1BQU9zVCxJQUNQLE9BQVUsb0hBQXFIQSxFQUNqSSxDQUdGM0csR0FBZSxHQVdqQixFQVJzQnVFLElBQ3BCLElBQUt2RSxFQUNILE1BQU0sSUFBSXRLLE1BQU0seUZBRWxCLE9BQU91USxFQUFjMUIsRyxzRUMvRnZCLElBQUlxQyxFQUNBdlksRUFDQXdZLEVBQ0FDLEVBR0FDLEVBQ0FDLEVBSEFDLEdBQVMsRUFDVEMsR0FBb0IsRUFHeEIsTUFBTUMsRUFBOEIsR0FFcEMsSUFDSUMsRUFDQUMsRUFDSixNQUFNQyxFQUF5QixHQUN6QkMsRUFBYyxJQUFJMXJCLElBT2xCMnJCLEVBQXNCLElBQUksSUE2VW5CblcsRUFBcUIsSUEzVWxDLE1BQ0UsV0FBQTNtQixHQUNFbzhCLEdBQWUsQ0FDakIsQ0FFQSxlQUFJdHlCLEdBQ0YsT0FBT3F5QixDQUNULENBRUEsZUFBSWgyQixHQUNGLE9BQU9pMkIsQ0FDVCxDQUVBLFVBQUl2b0IsR0FDRixPQUFPcW9CLENBQ1QsQ0FFQSxTQUFJejNCLEdBQ0YsT0FBTzgzQixDQUNULENBUUEsUUFBSXBZLEdBQ0YsWUFBeUI5akIsSUFBbEI2N0IsR0FBUy9YLEtBQXFCK1gsRUFBUS9YLEtBQU8sS0FDdEQsQ0FXQSxtQkFBT3FCLEdBQ0wsT0FBTzdlLE1BQU00SyxLQUFLb1MsRUFBVXJqQixJQUFJc0ssT0FDbEMsQ0FFQSxVQUFBcWEsQ0FBV25CLEVBQWdCLENBQUMsRUFBR2pRLEVBQVMsQ0FBQyxFQUFHL0osRUFBYWtiLEdBa0J2RCxPQWpCQXJCLEVBQVk3WixFQUNab3lCLEdBQVUsT0FBVXBZLEVBQWVqUSxHQUUvQnFvQixFQUFRcG9CLFVBQVlvb0IsRUFBUXBvQixTQUFTQyxRQUV2Q21vQixFQUFVbFgsRUFBVytYLG1CQUFtQmIsSUFFMUNTLEVBQVlULEdBQVMxWCxTQUNyQitYLE9BQTJCbDhCLElBQWxCNjdCLEVBQVF6M0IsTUFBc0J5M0IsRUFBUXozQixNQUFRODNCLEVBQ3ZEMzZCLEtBQUtzRCxrQkFBb0J5ZSxFQUFVemUsa0JBQWtCM0MsS0FBS29oQixHQUMxRC9oQixLQUFLb0gsdUJBQXlCMmEsRUFBVTNhLHVCQUF1QnpHLEtBQUtvaEIsR0FDcEV5WSxHQUFlLEVBQ2Z4NkIsS0FBS3c2QixhQUFlQSxFQUNwQng2QixLQUFLbzdCLGlCQUNEbnBCLEdBQVEwUSxVQUNWM2lCLEtBQUtxN0IsZ0JBQWdCcHBCLEVBQU8wUSxVQUV2QjJYLENBQ1QsQ0FFQSxlQUFBZSxDQUFnQi93QixHQUVkLE1BQU1neEIsRUFBVTVnQixTQUFTNmdCLGNBQWMsUUFFdkNELEVBQVF4RixLQUFPeHJCLEVBRWZvUSxTQUFTeFEsS0FBS3NiLFlBQVk4VixFQUM1QixDQUVBLGtCQUFBN29CLENBQW1CK29CLEdBQWMsR0FNL0JsQixFQUFVLElBQXVCYSxtQkFBbUJiLEVBQVNrQixFQUMvRCxDQUVBLGNBQUFKLEdBQ0UsTUFBTTl5QixFQUFZeVosRUFBVXpaLFVBQVUzSCxLQUFLb2hCLEdBQ3JDbFosRUFBY2taLEVBQVVsWixXQUFXbEksS0FBS29oQixHQUN4Q2paLEVBQWtCaVosRUFBVWpaLGdCQUFnQm5JLEtBQUtvaEIsR0FFdkR3WSxFQUFlLENBQUVqeUIsWUFBV08sYUFBWUMsa0JBQzFDLENBZ0JBLE9BQUEyeUIsQ0FBUTNyQixFQUFLM1EsRUFBS3U4QixHQUFTLEdBTXpCLE9BTElBLEVBQ0ZwQixFQUFRdFgsZUFBZWxULEdBQU8zUSxFQUU5Qm03QixFQUFRclgsU0FBU25ULEdBQU8zUSxFQUVuQkEsQ0FDVCxDQUVBLE9BQUF3OEIsQ0FBUTdyQixHQUdOLEdBQUl3cUIsR0FBU3JYLFVBQVluZ0IsT0FBT0MsVUFBVUMsZUFBZUMsS0FBS3EzQixFQUFRclgsU0FBVW5ULEdBQzlFLE9BQU93cUIsRUFBUXJYLFNBQVNuVCxHQUcxQixHQUFJd3FCLEdBQVN0WCxnQkFBa0JsZ0IsT0FBT0MsVUFBVUMsZUFBZUMsS0FBS3EzQixFQUFRdFgsZUFBZ0JsVCxHQUFNLENBQ2hHLE1BQU04ckIsRUFBVXRCLEVBQVF0WCxlQUFlbFQsR0FFdkMsY0FET3dxQixFQUFRdFgsZUFBZWxULEdBQ3ZCOHJCLENBQ1QsQ0FFRixDQUVBLGNBQUFDLENBQWUxbkIsR0FDYixNQUFNckUsRUF2SURvUCxLQUFLbVIsU0FBUzFDLFNBQVMsSUFBSWhFLE1BQU0sRUFBRyxHQXlJekMsT0FEQTNwQixLQUFLeTdCLFFBQVEzckIsRUFBS3FFLEdBQU8sR0FDbEJyRSxDQUNULENBR0EsZ0JBQUFnc0IsQ0FBaUJ4NUIsRUFBYTJQLEdBRTVCLE9BREFxb0IsRUFBUXBvQixTQUFTNVAsR0FBZTJQLEVBQ3pCcW9CLEVBQVFwb0IsU0FBUzVQLEVBQzFCLENBV0EsZ0JBQUF5akIsQ0FBaUJ6akIsRUFBYTJQLEVBQVNxb0IsR0FPckMsR0FOb0Isa0JBQWhCaDRCLEVBQ0ZBLEVBQWMsUUFDVyxtQkFBaEJBLElBQ1RBLEVBQWMsZUFHRDdELElBQVh3VCxRQUE2Q3hULElBQXJCNjdCLEVBQVFwb0IsU0FFbEMsWUFEQXJTLFFBQVFDLEtBQUssZ0RBSWYsTUFBTWk4QixFQUFnQnpCLEVBQVFwb0IsU0FBUzVQLEdBRXZDLFFBQXNCN0QsSUFBbEJzOUIsRUFLSixPQUFPQSxFQUpMbDhCLFFBQVFDLEtBQUssbURBQW1Ed0MsY0FLcEUsQ0FFQSxlQUFBa2hCLEdBRUEsQ0FFQSxlQUFBcUIsQ0FBZ0JGLEVBQVlTLEVBQWUsQ0FBQyxRQUNsQjNtQixJQUFwQjY3QixFQUFReFgsVUFDVndYLEVBQVF4WCxRQUFVLENBQUMsR0FFckI5aUIsS0FBS2c4QixpQkFBaUI1VyxFQUFhdkMsZUFFbkN5WCxFQUFReFgsUUFBUTZCLEdBQWNTLENBQ2hDLENBRUEsbUJBQUE3QixDQUFvQjBZLEdBS2xCLE9BSklBLEdBQ0ZqOEIsS0FBS2c4QixpQkFBaUJDLEdBR2pCZixFQUFvQmUsZ0JBQzdCLENBRUEsZ0JBQUFELENBQWlCblosR0FDWEEsR0FDRnFZLEVBQW9CZ0IsV0FBV3JaLEVBRW5DLENBRUEsaUJBQUFwVixDQUFrQm5MLEdBQ2hCMDRCLEVBQXVCcmtCLEtBQUtyVSxFQUM5QixDQUVBLHdCQUFBNjVCLEdBQ0UsT0FBT25CLENBQ1QsQ0FFQSxvQkFBQW9CLENBQXFCLzlCLEVBQU0raUIsR0FDekI2WixFQUFZajNCLElBQUkzRixFQUFNK2lCLEVBRXhCLENBR0EsY0FBQXFDLENBQWVDLEdBQ1IxakIsS0FBS3c2QixjQUNSMzZCLFFBQVFDLEtBQUsseUVBSWY0akIsRUFBZWUsU0FBU3prQixLQUMxQixDQUVBLGVBQUF5eEIsQ0FBZ0J1QixHQUNkLE9BQU9pSSxFQUFZbjNCLElBQUlrdkIsRUFDekIsQ0FTQSxxQkFBQXFKLENBQXNCamIsR0FDcEJxWixFQUFpQnJaLENBQ25CLENBRUEsb0JBQUlrYixHQUNGLE9BQU83QixDQUNULENBT0Esd0JBQUE4QixDQUF5Qm5iLEdBQ3ZCc1osRUFBb0J0WixDQUN0QixDQUVBLHdCQUFJb2IsR0FDRixPQUFPOUIsQ0FDVCxDQUVBLDJCQUFBK0IsQ0FBNEI5WCxHQUMxQixPQUFPMlYsRUFBUXhYLFFBQVE2QixFQUN6QixDQUVBLFlBQUkvQixHQUNGLE9BQU9tWSxDQUNULENBRUEsOEJBQUkyQixHQUNGLE9BQU83QixDQUNULENBR0EsOEJBQUk2QixDQUEyQnZvQixHQUNSLGlCQUFWQSxFQUVKMG1CLEVBQTRCdjJCLFNBQVM2UCxJQUN4QzBtQixFQUE0QmxrQixLQUFLeEMsR0FFMUJwUCxNQUFNMmEsUUFBUXZMLEdBRXZCQSxFQUFNL04sUUFBUXVHLElBQ1EsaUJBQVRBLEdBQXNCa3VCLEVBQTRCdjJCLFNBQVNxSSxJQUNwRWt1QixFQUE0QmxrQixLQUFLaEssS0FJckM5TSxRQUFRQyxLQUFLLDRGQUVqQixDQUVBLGFBQUk2OEIsR0FFRixPQURBOThCLFFBQVFDLEtBQUssb0VBQ05nN0IsQ0FDVCxDQUVBLGFBQUk2QixDQUFVbjlCLEdBQ1pLLFFBQVFDLEtBQUssbUVBQ2YsQ0FFQSxZQUFJNlMsR0FDRixPQUFPbW9CLENBQ1QsQ0FFQSxZQUFJbm9CLENBQVNuVCxHQUNYczdCLEVBQVl0N0IsQ0FDZCxDQUVBLG9CQUFJbzlCLEdBQ0YsT0FBT2hDLENBQ1QsQ0FFQSxlQUFBaUMsQ0FBZ0JDLEVBQVcsQ0FBQyxHQUUxQixPQUFPLElBQTBCMWpCLHFCQUFxQjBqQixFQUV4RCxDQUVBLG9CQUFJRixDQUFpQjl5QixHQUFLLEdBQ3hCOHdCLEVBQW9Cek8sUUFBUXJpQixFQUM5QixDQUVBLGlCQUFBaXpCLENBQWtCenhCLEdBQ2hCdEwsS0FBSzQ4QixrQkFBbUIsRUFDeEI1OEIsS0FBS2c5QiwyQkFBNkIxeEIsQ0FFcEMsQ0FFQSx1QkFBQTJ4QixHQUVBLENBRUEsYUFBQUMsR0FFQSxFLDJDQ2xXRixNQUFNQyxFQUFvQnI2QixPQUFPczZCLE9BQU8sQ0FBQyxHQUVuQzFTLEdBQVcsSUFBQWhyQixTQUFRLEVBQUFpckIsS0FBSyxJQUFBN2xCLElBQUdDLFFBSTNCZ21CLEdBQWEsSUFBQXJyQixVQUFRLElBQUFILFNBQVEsQ0FBQ21yQixHQUFVLElBQUE1bEIsSUFBR2hDLFdBRzFDLE1BQU11NkIsRUFDWCxXQUFBai9CLEdBQ0UrK0IsRUFBa0JHLElBQU0sSUFBTXo5QixRQUFRa25CLElBQUksNkJBQzVDLENBRUEsU0FBQXdXLENBQVV6dEIsRUFBS3hFLEVBQUlzSixHQUFPLEdBQ3hCLElBQXFFLElBQWpFOVIsT0FBT0MsVUFBVUMsZUFBZUMsS0FBS2s2QixFQUFtQnJ0QixHQUFlLENBQ3pFLE1BQU0wdEIsRUFBVSxtQ0FBbUMxdEIscUJBQ25ELEdBQUk4RSxFQUNGLE9BQU80b0IsRUFFVDM5QixRQUFRQyxLQUFLMDlCLEVBQ2YsTUFDRUwsRUFBa0JydEIsR0FBT3hFLENBRTdCLENBRUEsVUFBQTR3QixDQUFXdUIsRUFBYSxDQUFDLEVBQUc3b0IsR0FBTyxHQUNqQyxJQUFJNG9CLEVBSUosT0FBYyxJQUZBelMsRUFBVzBTLElBR3ZCRCxFQUFVLDhDQUE4Q3I2QixLQUFLQyxVQUFVcTZCLDRCQUNuRTdvQixFQUNLNG9CLE9BRVQzOUIsUUFBUUMsS0FBSzA5QixLQXFCSSxJQUFBeDBCLE1BQUt5MEIsR0FFTi8rQixJQW5Ca0JnL0IsSUFDbEMsTUFBTXJ5QixHQUFZLElBQUFuRixNQUFLdzNCLEVBQVFELEdBSS9CLEdBRjBDLG1CQUFoQixFQUd4Qno5QixLQUFLdTlCLFVBQVVHLEVBQVFyeUIsRUFBV3VKLE9BQzdCLENBRUwsR0FEQTRvQixFQUFVLGlCQUFpQkUsNkJBQ3ZCOW9CLEVBQ0YsT0FBTzRvQixFQUVQMzlCLFFBQVFDLEtBQUswOUIsRUFFakIsSUFLZ0Qvc0IsS0FBSyxJQUN6RCxDQUVBLG1CQUFBa3RCLENBQW9CN3RCLEdBRXBCLENBRUEsb0JBQUltc0IsR0FDRixPQUFPa0IsQ0FDVCxFLDREQ2xFSyxNQUFNUyxFQWVYLFdBQUF4L0IsQ0FBWXkvQixFQUFlQyxFQUFTLEdBQUlDLEdBQVcsR0FnQmpELE9BZkEvOUIsS0FBSzY5QixjQUFnQkEsRUFDckI3OUIsS0FBS3N2QixlQUFpQixDQUNwQixhQUNBLGlCQUNBLHFCQUNBLDJCQUNBLFNBQ0EsWUFDQSx3QkFFRnR2QixLQUFLODlCLE9BQVNBLEdBRUcsSUFBYkMsR0FDRi85QixLQUFLZytCLGFBRUFoK0IsS0FBS2krQixjQUNkLENBRUEsY0FBQUMsR0FDRWwrQixLQUFLZytCLFlBQ1AsQ0FFQSxrQkFBQUcsR0FDRSxPQUFPLFFBQWtCbitCLEtBQU1BLEtBQUtzdkIsZUFDdEMsQ0FFQSx3QkFBQThPLENBQXlCenBCLEdBQ3ZCLE1BQU0wcEIsRUFBYyxLQUFvQng3QixRQUFTLEVBRWpELEdBQW9CLEtBQWhCN0MsS0FBSzg5QixRQUFpQk8sRUFFeEIsWUFEQXgrQixRQUFRQyxLQUFLLDJDQUEyQ0UsS0FBSzVCLFlBQVlDLHVCQUszRSxNQUVNaWdDLEdBQXNCLElBQUF6OEIsUUFGVHlJLEdBQXFDLElBQTdCQSxFQUFJd1EsUUFBUTlhLEtBQUs4OUIsUUFFRW5wQixHQUM5QyxHQUFJMnBCLEVBQW9CNytCLFFBQVUsR0FBSzQrQixFQUFhLENBQ2xELE1BQU1FLEVBQWEsNkNBQTZDditCLEtBQUs1QixZQUFZQyw2QkFBNkIyQixLQUFLODlCLGFBQWFRLEVBQW9CN3RCLEtBQUssVUFDeko1USxRQUFRQyxLQUFLeStCLEVBQ2YsQ0FDRixDQUVBLG9CQUFBQyxDQUFxQmYsRUFBWWdCLEdBQy9CeitCLEtBQUtvK0IseUJBQXlCWCxFQUFXN04sWUFDekMsTUFBTXhsQixFQUFNLENBQUMsRUFDUHMwQixFQUFnQyxDQUFDcDBCLEVBQUtxMEIsR0FBVyxLQUNyRCxNQUFNQyxHQUErQixJQUFiRCxFQUFvQjMrQixLQUFLNUIsWUFBYzRCLEtBRTFDLG1CQURRNCtCLEVBQWdCdDBCLEtBRTNDRixFQUFJRSxHQUFPbTBCLEVBQVFuMEIsR0FBT3MwQixFQUFnQnQwQixHQUFLM0osS0FBSzg5QixLQUtsREksR0FEWSxJQUFBMWtCLFFBQU8sRUFBR3VrQixFQUNnQkksQ0FBVSxFQUFBOWtCLElBQUksR0FLMUQsT0FIQSxJQUFBdGIsS0FBSW1nQyxFQUFxQ3BCLEVBQVc5TixnQkFFcEQsSUFBQWp4QixLQUFJZ2dDLEVBQStCakIsRUFBVzNjLFNBQ3ZDMVcsQ0FDVCxDQUVBLFVBQUE0ekIsR0FDRSxNQUFNcE8sRUFBYTV2QixLQUFLbStCLHFCQUd4QixPQURBbitCLEtBQUtpK0IsZUFBaUJqK0IsS0FBS3crQixxQkFBcUI1TyxFQUFZNXZCLEtBQUs2OUIsZUFDMUQ3OUIsS0FBS2krQixjQUNkLEUsb0RDdEZLLE1BQU1jLEVBQ1gsV0FBQTNnQyxHQVNFNEIsS0FBS2l2QiwwQkFBNEI4UCxFQUEwQjlQLDBCQUEwQnR1QixLQUFLWCxLQUM1RixDQUVBLGdDQUFPaXZCLENBQTBCN2tCLEdBQy9CLE1BQU13Z0IsR0FBYSxJQUFBbHJCLFVBQVEsSUFBQXFhLFlBQVcsRUFBQXRRLFNBQVUsRUFBQVMsS0FBTSxFQUFBdkssUUFDaER1dkIsR0FBVyxJQUFBeHZCLFVBQVEsSUFBQXFhLFlBQVcsRUFBQTdhLE9BQVEsRUFBQWdMLEtBQU0sRUFBQXZLLFFBRWxELE9BRDhCLElBQUFKLFNBQVEsQ0FBQ3FyQixFQUFZc0UsR0FDNUNDLENBQXNCL2tCLEVBQy9CLENBRUEsb0NBQU80MEIsQ0FBOEJDLEVBQVlDLEdBQy9DLE1BQU1DLEdBQWlCLElBQUF0OUIsU0FBTyxJQUFBMkosUUFBTyxjQUMvQjBLLEdBQVUsSUFBQXhXLFNBQVF5L0IsRUFBZ0IsRUFBQW4yQixNQUdsQ28yQixHQURVLElBQUExL0IsVUFBUSxJQUFBNFcsTUFERWhNLElBQU8sSUFBQXNLLE1BQUssSUFBSXlCLE9BQU8vTCxHQUFNMjBCLElBQ04vb0IsRUFDM0JtcEIsQ0FBUUgsR0FJOUIsT0FISSxJQUFBcDZCLElBQUdXLE9BQVEyNUIsS0FDYkYsR0FBVyxJQUFBSSxPQUFNTCxHQUFZLElBQUEvNEIsTUFBS2s1QixFQUFlRixHQUFXQSxJQUV2REEsQ0FDVCxDQUVBLGdDQUFPeG1CLENBQTBCcE8sR0FJL0IsTUFBTyxDQUFFaTFCLEtBSElqMUIsRUFHRWsxQixPQUZBbDFCLEVBRVFvUCxTQUROcFAsRUFFbkIsQ0FFQSwyQkFBT3lPLENBQXFCRSxFQUFHN0csR0FBUyxFQUFPOEcsRUFBTXpVLE9BQU9SLFVBQzFELE1BT013N0IsRUFMVSxDQUNkQyxNQUFPLFdBQ1BDLE1BQU8sU0FDUEosS0FBTSxTQUxnQixJQUFYbnRCLEVBQWtCLE9BQVM2RyxHQVd4QyxPQUhhLElBQUEvUyxNQUFLdTVCLEVBQVN2bUIsR0FHaEI1RCxRQUZrQix1QkFFWSxLQUMzQyxDQUVBLGlDQUFPc3FCLENBQTJCajRCLEVBQU1rNEIsRUFBTzVtQixFQUFJLFFBQVM2bUIsR0FDMUQsTUFBTUMsRUFBUyxHQUNUQyxFQUFvQmQsSUFDeEIsTUFBTWUsRUFBUyxDQUFDLEVBQ1ZDLEVBQVVoQixFQUFTbHBCLFVBQ3pCLElBQUltcUIsT0FBcUMxaEMsSUFBbEJrSixFQUFLdTRCLEdBQXlCdjRCLEVBQUt1NEIsSUFBVyxJQUFBaDZCLE1BQUtnNkIsRUFBU0osR0FDbkYsTUFBTU0sU0FBdUJsQixFQUFTaUIsR0FFakIsV0FBakJDLEVBQ0ZELEVBQW1CakIsRUFBU2lCLEdBQ0YsY0FBakJDLElBQ1RsQixFQUFXbC9CLEtBQUtnL0IsOEJBQThCbUIsRUFBa0JqQixJQUdsRWUsRUFBT0MsR0FBV0MsRUFFZG5nQyxLQUFLaXZCLDBCQUEwQmdSLElBQ2pDRixFQUFPcHBCLEtBQUtzcEIsR0FHZCxNQUFNSSxHQUFXLElBQUF2N0IsSUFBR2hDLE9BQVFvOEIsR0FDdEJvQixHQUFvQixJQUFBaDdCLEtBQUk2NkIsRUFBa0JqQixHQUMxQ3FCLEdBQXNCLElBQUFqN0IsS0FBSSxZQUFhNDVCLEdBRTdDLElBQWdDLEtBREFvQixHQUFxQkQsR0FDZixDQUNwQyxNQUFNRyxFQUFTdEIsRUFBU2lCLElBQ3BCLElBQUE3NkIsS0FBSSxZQUFhazdCLElBQ25CUixFQUFpQlEsRUFBT3pxQixVQUU1QixNQUFtQyxJQUF4QndxQixRQUFxRDloQyxJQUFyQjBoQyxHQUN6Q0gsRUFBaUJkLEVBQVNucEIsWUFNOUIsT0FGQWlxQixFQUFpQkgsR0FFVkUsQ0FDVCxDQUVBLHdCQUFPVSxDQUFrQmpoQyxHQUN2QixNQUFNa2hDLEdBQVcsSUFBQTcrQixRQUFPLEVBQUEzQyxPQUNsQnloQyxHQUFlLElBQUE3bUIsT0FBSyxJQUFBQyxZQUFXLEVBQUE3YSxNQUFPLEVBQUE4YSxLQUFLLElBQUF2SixNQUFLLE1BQ2hEbXdCLEdBQWEsSUFBQXRyQixTQUFRLHNCQUF1QixNQUVsRCxPQURlLElBQUE1VixTQUFRa2hDLEVBQVlELEVBQWNELEVBQVUsRUFBQUcsU0FBUyxJQUFBbmlDLEtBQUksRUFBQWlCLFFBQ2pFbWhDLENBQU90aEMsRUFDaEIsQ0FFQSx3QkFBT3VoQyxDQUFrQnZoQyxHQUN2QixNQUFNa2hDLEdBQVcsSUFBQTcrQixRQUFPLEVBQUEzQyxPQUVsQml3QixFQUF3Qm52QixLQUFLaXZCLDBCQUU3QitSLEdBQWEsSUFBQXRoQyxVQUNqQixJQUFBK1EsTUFBSyxLQUNMLEVBQUFvd0IsUUFDQSxFQUFBMTdCLFNBRUk4N0IsR0FBWSxJQUFBajNCLFFBQ2hCbWxCLEVBQ0E2UixHQUNBLElBQUFwMkIsYUFBT25NLElBR0h5aUMsR0FBa0IsSUFBQXhpQyxLQUFJdWlDLEdBRXRCRSxHQUFvQixJQUFBcm5CLE9BQ3hCLElBQUFDLFlBQVcsRUFBQXRRLFVBQ1gsSUFBQWxKLFFBQU8sTUFRVCxPQU5pQixJQUFBYixTQUNmeWhDLEdBQ0EsSUFBQTF3QixNQUFLLEtBQ0xpd0IsRUFDQVEsRUFFS0UsQ0FBUzVoQyxFQUNsQixDQUVBLG9DQUFPNmhDLENBQThCQyxFQUFTMzVCLEVBQU00NUIsRUFBYyxTQUVoRSxNQUdNQyxHQUFpQixJQUFBOWhDLFNBSEtvUSxJQUFRLElBQUE1SixNQUFLLEdBQUc0SixJQUFNeXhCLElBQWU1NUIsR0FHZCxFQUFBdUMsS0FBTSxFQUFBbEIsTUFlekQsT0FBTyxJQUFBdEssS0FaY3dILElBQ25CLE1BQU11N0IsRUFBY0QsRUFBZXQ3QixHQUluQyxZQUFvQnpILElBQWhCZ2pDLEdBQ0ssSUFBQW5DLFFBQU0sSUFBQTUvQixTQUFRLEVBQUF3SyxLQUFNLEVBQUFsQixLQUFkLENBQW9COUMsR0FBT3U3QixFQUFhdjdCLEdBR2hEQSxHQUdlbzdCLEVBQzFCLENBRUEsdUNBQU9JLENBQWlDSixHQW1CdEMsT0FBK0IsSUFBM0J2OEIsTUFBTTJhLFFBQVE0aEIsR0FDVEEsRUFBUTVpQyxJQWJLMEwsSUFNRCxpQkFBUkEsSUFDVEEsRUFBTXRILE9BQU9rRyxLQUFLb0IsR0FBS3NNLE9BTkwsQ0FBQ1osRUFBS2hHLEtBQ3hCZ0csRUFBSWhHLEdBUG9CLENBQUM2eEIsSUFDM0IsTUFBTTVzQixFQUFRNHNCLEVBQU01c0IsTUFBTSxVQUMxQixPQUFPQSxFQUFzQixPQUFiQSxFQUFNLEdBQWMsR0FBS0EsRUFBTSxHQUFNNHNCLEdBS3hDQyxDQUFvQngzQixFQUFJMEYsSUFDNUJnRyxHQUlvQyxDQUFDLElBRXZDMUwsSUFPRmszQixDQUNULENBRUEsaUNBQU9PLENBQTJCUCxFQUFTMzVCLEVBQU8sQ0FBQyxHQThDakQsT0FBTzI1QixFQUFRNWlDLElBakJrQjBMLElBQy9CLE1BQU0wM0IsRUFBYSxJQUFLMTNCLEdBWXhCLE9BRkF0SCxPQUFPa0csS0FBSzg0QixHQUFZMTdCLFFBUFMwSixJQXpCVixJQUFDeEYsRUFBS3kzQixFQTBCdkJqL0IsT0FBT0MsVUFBVUMsZUFBZUMsS0FBSzYrQixFQUFZaHlCLElBQVFuSSxFQUFLbUksS0FDaEVneUIsRUFBV2h5QixJQTNCU3hGLEVBMkJlM0MsRUFBS21JLElBM0JmaXlCLEVBMkJxQkQsRUFBV2h5QixJQWhCaENxbkIsTUFBTSxLQUdUN0MsS0FBTTBOLEdBYlAsRUFBQ0EsRUFBUzd0QixLQUNqQyxNQUFNOHRCLEVBQWlCRCxFQUNwQjFzQixRQUFRLHVCQUF3QixRQUNoQ0EsUUFBUSxNQUFPLGVBR2xCLE9BRHFCLElBQUllLE9BQU8sSUFBSTRyQixNQUNoQnJ0QixLQUFLVCxJQU9pQit0QixDQUFpQkYsRUFBUzEzQixJQUdwREEsRUFBTXkzQixNQWlCakJELEdBS1gsQ0FFQSwyQkFBTzFvQixDQUFxQnpSLEVBQU13NkIsRUFBSSxJQUFtQmx3QixPQUFPQyxTQUFTQyxNQUFPOEcsRUFBR21wQixHQUNqRixNQUFNQyxPQUFnQjVqQyxJQUFOd2EsRUFBa0JBLEVBQUlrcEIsRUFBRXR6QixLQUNsQ3VELEVBQVMrdkIsRUFBRS92QixPQUNYeXRCLEVBQVFzQyxFQUFFbnZCLE9BQU8rQyxVQUNqQnVzQixPQUF5QjdqQyxJQUFYMmpDLEVBQXVCQSxFQUFTcGlDLEtBQUsrWSxxQkFBcUJzcEIsRUFBU2p3QixHQUNqRm13QixFQUE0QnZpQyxLQUFLcVoscUJBQXFCaXBCLEVBQWFILEVBQUdFLEdBQVM5dEIsVUFDckYsSUFBSXdyQixFQUFTLy9CLEtBQUs0L0IsMkJBQTJCajRCLEVBQU1rNEIsRUFBT3dDLEVBQVNFLEdBU25FLE9BUEF4QyxFQUFTaEIsRUFBMEJzQyw4QkFBOEJ0QixFQUFRcDRCLEdBQ3pFbzRCLEVBQVNoQixFQUEwQjJDLGlDQUFpQzNCLEdBTXBELFVBQVpzQyxFQUNLcmlDLEtBQUsrZ0Msa0JBQWtCaEIsR0FHekIvL0IsS0FBS3lnQyxrQkFBa0JWLEVBQ2hDLENBRUEsc0NBQU95QyxDQUFnQ0MsRUFBU3h2QixHQUM5QyxNQUFNeXZCLEVBQVF6dkIsRUFBVTNPLFNBQVMsTUFlM0JxK0IsR0FBaUIsSUFBQXJ0QixTQUFRLEtBQU0sTUFRL0JzdEIsR0FBOEIsSUFBQTNqQyxTQUNsQyxJQUFBdUosUUFBT2k2QixFQUFTLFFBQVEsSUFBQS9pQyxVQUFRLElBQUFrVixNQUFLLEVBQUFvRixHQUFJeW9CLElBQVUsSUFBQXY4QixNQUFLLFFBSzFELE9BRnVCLElBQUF4RyxVQUFRLElBQUFtakMsZ0JBQWMsSUFBQXIzQixTQUFPLEtBQVEsSUFBQTlNLEtBQUlra0MsSUFBNkIsSUFBQWxrQyxLQVhqRTRMLElBQzFCLE1BQU8sQ0FDTEEsTUFDQXc0QixJQWpCVWpVLEVBaUJEdmtCLEVBaEJQbzRCLElBQ0c3VCxFQUFFdUssV0FBVyxPQUNoQnZLLEVBQUksSUFBTUEsR0FFUEEsRUFBRXFILFNBQVMsT0FDZHJILEdBQVEsTUFJTCxJQUFJeFksT0FBT3dZLEtBVlAsSUFBQ0EsS0F5QndHLElBQUFud0IsS0FBSWlrQyxHQUVuSEksQ0FBZTl2QixFQUN4QixDQUVBLG1DQUFPK3ZCLENBQTZCNTRCLEVBQUtFLEVBQUsyNEIsR0FlNUMsTUFHTWh3QixHQUhtQixJQUFBdlQsVUFBUSxJQUFBaEIsS0FBSSxFQUFBOGhCLE9BQU8sSUFBQTloQixNQUFJLElBQUFnSyxTQUFPLElBQUE1RCxJQUFHVyxVQUFXLEVBQUFOLFFBR25EKzlCLENBQWlCOTRCLEdBSzdCKzRCLEVBQWFwRSxFQUEwQnlELGdDQUFnQ2w0QixFQUFLMkksR0FHbEYsSUFBSW13QixFQUFXOTRCLEVBSWYsR0FBSTY0QixHQUFjLEVBQUcsQ0FDbkIsTUFBTUUsRUFBUXB3QixFQUFVa3dCLEdBQ2xCRyxHQUFjLElBQUFDLFFBQU9uNUIsR0FJckJvNUIsR0FEbUIsSUFBQTlqQyxTQUFRLEVBQUF3SyxNQUFNLElBQUE3SixXQUFVLEtBQUssSUFBQTZGLE1BQUttOUIsR0FDckNJLENBQWlCSCxJQUt0QixJQUhMLGNBQ1MxdUIsS0FBSzR1QixLQUU2QixLQUE5QixJQUFBMStCLElBQUdXLE9BQVErOUIsS0FDbENKLEVBQVdJLEVBRWYsQ0FFQSxPQUFPSixDQUNULENBRUEsNEJBQU9NLENBQXNCcDVCLEdBRTNCLE9BQU9BLEVBQUlnTCxRQURLLGVBQ1ksTUFBTTZoQixNQUFNLElBQzFDLENBRUEsc0NBQU93TSxDQUFnQ0MsRUFBZXQ1QixFQUFLMjRCLEdBQ3pELE1BQU0xckIsRUFBYWpOLEVBQ2J1NUIsRUFBWTdqQyxLQUFLMGpDLHNCQUFzQnA1QixHQUN2Q2tLLEVBQVEsR0FDUnN2QixFQUFrQixHQUN4QixJQUFJQyxFQUFZSCxHQXlCaEIsSUFBQWx0QixRQXhCNEIsQ0FBQ3N0QixFQUFPQyxLQUNsQyxNQUFNQyxFQUFnQmxrQyxLQUFLZ2pDLDZCQUE2QmUsRUFBV0UsRUFBY2hCLEdBRWpGYyxFQUFZL2pDLEtBQUtnL0IsOEJBQThCaUYsRUFBY0YsR0FDN0QsTUFFTUksR0FBZSxJQUFBbGxDLFFBQU8sRUFBQXdLLFFBQVMsRUFBQXZLLFlBRW5CVCxJQUFkc2xDLEdBSjZCLENBQUN6NUIsR0FBUUEsS0FBUSxJQUFBa1csTUFBS2hNLEdBSXhCNHZCLENBQXlCTCxFQUFVL3RCLGFBQThDLElBQWhDbXVCLEVBQWFELEtBQzNGMXZCLEVBQU1tQyxLQUFLb3RCLEVBQVUvdEIsV0FDckI4dEIsRUFBZ0JudEIsS0FBS3V0QixJQUV2QixNQUFNRyxFQUFVLENBQUNKLEVBQWMsYUFFekJLLEdBQWdCLElBQUFoa0MsTUFBSytqQyxFQUFTTixHQUM5QlEsR0FBdUIsSUFBQWprQyxNQUZOLENBQUMsYUFFMEJ5akMsUUFFNUJ0bEMsSUFBbEI2bEMsRUFDRlAsRUFBWU8sT0FDc0I3bEMsSUFBekI4bEMsSUFDVFIsRUFBWVEsSUFJWSxFQUFHVixHQUMvQixNQUFNdHZCLEdBQVksSUFBQWl3QixRQUFPaHdCLEVBQU9zdkIsR0FDMUJqckIsRUFBZ0I3WSxLQUFLeWtDLGNBQWNqd0IsR0FDekMsTUFBTyxDQUFFQSxRQUFPcUUsZ0JBQWV0RSxZQUFXZ0QsYUFDNUMsQ0FFQSxvQkFBT2t0QixDQUFjamxDLEdBRW5CLE9BRHNCa2xDLEVBQ0ZsbEMsT0FEb0JmLEtBQVosSUFBQStoQixNQUFLa2tCLElBQW1CLElBQUFsa0IsTUFBS2trQixHQUFLLEdBQXpDLElBQUNBLENBRXhCLENBRUEscUNBQU9DLENBQStCZixFQUFldDVCLEdBQ25ELE1BQU1GLEVBQU0sQ0FBQyxFQUdiLE9BREFBLEVBRGdCdzVCLEVBQWM1dEIsV0FDZmhXLEtBQUtnakMsNkJBQTZCWSxFQUFldDVCLEdBQ3pERixDQUNULENBRUEsOEJBQU93NkIsQ0FBd0JoQixFQUFldDVCLEVBQUsyNEIsR0FDakQsTUFDTTFyQixFQUFhak4sRUFDYnU2QixFQUFTdjZCLEVBQUlnTCxRQUZILGVBRW9CLE1BRTlCckMsR0FEa0IsSUFBQXZULFVBQVEsSUFBQWhCLE1BQUksSUFBQXk0QixPQUFNLE9BQU8sSUFBQUEsT0FBTSxLQUNyQzJOLENBQWdCRCxHQUNsQyxJQUFJdHdCLEdBQVksSUFBQXJQLFdBQVUrTixHQUV0QnVCLEdBQVEsSUFBQTlWLEtBQUksRUFBQXdMLEtBQU0rSSxHQVF0QixPQU5xQixLQUFqQixJQUFBeEosU0FBUWEsS0FDVmlLLEVBQVl2VSxLQUFLMmtDLCtCQUErQmYsRUFBZXQ1QixFQUFLMjRCLEdBQ3BFenVCLEdBQVEsSUFBQXhMLE1BQUt1TCxJQUlSLENBQUVDLFFBQU9xRSxjQUZNN1ksS0FBS3lrQyxjQUFjandCLEdBRVZELFlBQVdnRCxhQUM1QyxDQUVBLDJCQUFPOEIsQ0FBcUIvTyxFQUFLb0ksRUFBYXVHLEdBRTVDLFFBQW9CeGEsSUFBaEJpVSxFQUNGLE1BQU8sQ0FBQyxFQUVWLE1BQU03RCxPQUFhcFEsSUFBTndhLEVBQWtCQSxFQUFJdkcsRUFBWTdELEtBQ3pDbzBCLEdBQWMsSUFBQTVpQyxXQUFVLENBQUMsR0FBRyxJQUFBNkYsTUFBSyxjQUFld00sSUFDaERreEIsRUFBZ0JseEIsRUFBWU0sT0FBTytDLFVBRXpDLE1BQWEsVUFBVGxILEVBQ0s3TyxLQUFLNGtDLHdCQUF3QmhCLEVBQWV0NUIsSUFFckRBLEVBQWVBLEVBWGVnTCxRQUFRLFFBQVMsS0FheEN0VixLQUFLMmpDLGdDQUFnQ0MsRUFBZXQ1QixFQUFLMjRCLEdBQ2xFLEUsNkRDcGFLLE1BQU04QixFQUNYLFdBQUEzbUMsR0FVRTRCLEtBQUtvVCxxQkFBdUIyeEIsRUFBdUIzeEIscUJBQXFCelMsS0FBS1gsS0FDL0UsQ0FFQSwyQkFBT29ULENBQXFCNHhCLElBT1IsSUFBQUMsa0JBTkMsU0FBU0MsR0FDMUJ6Z0MsT0FBTzBnQyxXQUFhRCxDQUN0QixFQUNzQixXQUNwQnpnQyxPQUFPMGdDLFdBQWEsV0FBWSxDQUNsQyxHQUdVeDhCLFVBQVVxOEIsRUFDdEIsQ0FFQSxvQkFBT1AsQ0FBY2psQyxHQUVuQixPQURzQmtsQyxFQUNGbGxDLE9BRG9CZixLQUFaLElBQUEraEIsTUFBS2trQixJQUFtQixJQUFBbGtCLE1BQUtra0IsR0FBSyxHQUF6QyxJQUFDQSxDQUV4QixDQUVBLDJCQUFPM3lCLENBQXFCM0gsRUFBTSxDQUFDLEVBQUc1SyxHQUNwQyxNQUFNNGxDLEVBQWEsQ0FBQ3hnQyxFQUFHOC9CLFNBQVlqbUMsSUFBTmltQyxHQUFrQixJQUFBOWtDLE1BQUs4a0MsRUFBRzkvQixHQUFLQSxFQUM1RCxJQUFJeWdDLEVBQU9ELEVBQVdoN0IsRUFBSzVLLEdBQzNCLE1BQU8sQ0FDTDRsQyxhQUNBOXdCLFFBQVMsQ0FBQ2xLLEVBQU0sQ0FBQyxFQUFHNUssS0FDbEIsTUFBTThsQyxFQUFPRixFQUFXaDdCLEVBQUs1SyxHQWdCdkIrbEMsRUFBYXJwQixJQUFLLElBQUF4YyxTQUFRLEVBQUFzSixNQUFNLElBQUFOLFNBQU8sSUFBQUYsU0FBTyxFQUFNMFQsS0FFcERzcEIsR0FBZ0IsSUFBQTlsQyxVQUFRLElBQUFoQixLQWpCVHdkLElBQ25CLE1BQU1sSCxHQUFLLElBQUE5TyxNQUFLZ1csRUFBR21wQixHQUNicHdCLEdBQUssSUFBQS9PLE1BQUtnVyxFQUFHb3BCLEdBQ2JHLEdBQU8sSUFBQWo2QixRQUFPd0osRUFBSUMsR0FDbEJ5d0IsT0FBd0JqbkMsSUFBUHVXLEVBQ2pCMndCLE9BQW9CbG5DLElBQVB3VyxFQUNiMndCLEdBQVdILEVBQ1hJLEdBQTJCLElBQW5CSCxJQUEyQyxJQUFmQyxFQUNwQ0csR0FBNkIsSUFBbkJKLElBQTBDLElBQWZDLEVBRXJDdjdCLEVBQU0sQ0FBQyxFQUViLE9BREFBLEVBQUk4UixHQUFLLENBQUV1cEIsT0FBTUcsVUFBU0MsUUFBT0MsVUFBU0osaUJBQWdCQyxjQUNuRHY3QixJQUt3QyxFQUFBc2xCLE1BQU0sSUFBQXJsQixPQUFNLEVBQUFyQixNQUF2QyxDQUE4QyxDQUFDcThCLEVBQU1DLElBQ3JFUyxHQUFlLElBQUExN0IsT0FBTWs3QixFQUFXLFdBQVlDLEdBQzVDUSxHQUFhLElBQUEzN0IsT0FBTWs3QixFQUFXLFNBQVVDLEdBQ3hDUyxHQUFlLElBQUE1N0IsT0FBTWs3QixFQUFXLFdBQVlDLEdBRWxELE9BREFILEVBQU9DLEVBQ0EsQ0FBRVUsYUFBWUMsZUFBY0YsaUJBR3JDRyxZQUFhLElBQU1iLEVBR3ZCLENBRUEsc0JBQU9jLENBQWdCQyxFQUFVbnpCLEdBQy9CLE1BQU11QixHQUFTLElBQUE5TCxTQUFPLElBQUFwRSxVQUFTLEVBQUEwVixHQUFJb3NCLEdBQVduekIsR0FHOUMsTUFBTyxDQUFFdUIsUUFBT3FFLGNBRk1rc0IsRUFBdUJOLGNBQWNqd0IsR0FHN0QsQ0FFQSwwQkFBT3pCLENBQW9CM0ksR0FDekIsTUFBTWk4QixFQUFNQyxJQUFTLElBQUFqOEIsT0FBTSxFQUFFdUYsRUFBR0MsS0FDYixpQkFBTkEsR0FBd0IsT0FBTkEsR0FBZTlLLE1BQU0yYSxRQUFRN1AsR0FHakQsQ0FBQyxDQUFDRCxFQUFHQyxLQUZMLElBQUFuUixLQUFJLEVBQUU2bkMsRUFBSUMsS0FBUSxDQUFDLEdBQUc1MkIsS0FBSzIyQixJQUFNQyxHQUFLSCxFQUFHeDJCLEtBSWpELElBQUExSyxTQUFRbWhDLElBR1gsT0FBTyxJQUFBM21DLFNBQU8sSUFBQXVGLFdBQVVtaEMsRUFBR2o4QixJQUM3QixDQUVBLHVCQUFPcThCLENBQWlCQyxHQWlCdEIsTUFBTSxLQUFFNzNCLEVBQUksT0FBRXVELEdBQVdzMEIsRUFHbkJDLEVBQVd2OEIsSUFTYSxVQUFUeUUsRUFBbUIsSUFBZ0IsSUFBWHVELEVBQWtCLElBQU0sS0FDbEQsSUFBMEJnSCxxQkFBcUJoUCxFQUFLczhCLEdBTnpEcHhCLFFBRkssNEJBRVcsUUFjeEJzeEIsRUFBZSxzQkFFZkMsRUFBcUIsQ0FBQ0MsRUFBVSxHQUFJQyxFQUFjQyxFQUFTLENBQUMsS0FDaEUsSUFBSSxVQUFFaHhCLEdBQWMrd0IsRUEwQ3BCLE9BQU8sSUFBQTVoQyxTQUFRNGhDLEdBQWNyd0IsT0F4Q1IsQ0FBQ1osRUFBS214QixLQUN6QixNQUFPbjNCLEVBQUszUSxHQUFPOG5DLEVBQ2I1RyxHQUFXLElBQUF2N0IsSUFBR2hDLE9BQVEzRCxHQUl0QituQyxFQUFjNThCLElBQU8sSUFBQXNLLE1BQUtneUIsRUFBY3Q4QixHQUYxQixDQUFDQSxHQUFRN0UsT0FBTzZFLEdBQUtnTCxRQUFRLFVBQVcsS0FBS29ILGNBRVp5cUIsQ0FBWTc4QixHQUFPd0YsRUFFeEUsR0FBWSxjQUFSQSxHQUErQixRQUFSQSxFQUN6QixPQUFPZ0csRUFHVEUsRUFBWUEsSUFBYSxJQUFBOVAsTUFBSyxZQUFhL0csR0FHM0MsSUFBSXlGLEdBQUksSUFBQXBCLE9BQU13akMsR0FHZCxHQUZBcGlDLEVBQUVvUixHQXhCdUJ2USxPQXdCRXFLLEdBeEJVd0YsUUFBUSxvQkFBcUIsS0EwQmpELElBQWIrcUIsRUFBbUIsQ0FDckIsR0FBdUIsS0FBbkIsSUFBQXIzQixNQUFLcEUsR0FBR25GLE9BQWMsQ0FDeEIsTUFBTTJuQyxHQUFlLElBQUE5bUMsTUFBSyxDQUFDLFlBQWEsYUFBY25CLEdBQ3RELEdBQUlpb0MsRUFBYyxDQUNoQixNQUFNQyxHQUFRLElBQUE3akMsT0FBTW9CLEdBQ3BCeWlDLEVBQU1ELEdBQWdCLEdBQ3RCQyxFQUFNQyxVQUFXLElBQUF0K0IsTUFBS2crQixHQUFRdm5DLE9BQzlCNG5DLEVBQU1FLE1BQVFMLEVBQVlwM0IsR0FDMUJ1M0IsRUFBTXZSLEtBQU82USxFQUFRVSxHQUNyQnZ4QixFQUFJYSxLQUFLMHdCLEVBQ1gsQ0FDRixDQUNBemlDLEVBQUlpaUMsRUFBbUJDLEVBQVMzbkMsRUFBS3lGLEVBQ3ZDLE1BQ0VBLEVBQUUyaUMsTUFBUUwsRUFBWXAzQixHQUN0QmxMLEVBQUVreEIsS0FBTzZRLEVBQVEvaEMsR0FJbkIsT0FGQUEsRUFBRTBpQyxVQUFXLElBQUF0K0IsTUFBS2crQixHQUFRdm5DLE9BQzFCcVcsRUFBSWEsS0FBSy9SLEdBQ0ZrUixHQUd5QyxLQUc5QzB4QixFQUFhWCxFQUFtQixHQUFJSCxFQUFnQjF6QixRQUMxRCxJQUFJSixHQUFtQixJQUFBaXVCLFNBQVEyRyxHQVUvQixPQVRBNTBCLEVBckZBLFNBQVM2MEIsRUFBZ0Jqb0MsR0FDdkIsT0FBT0EsRUFBSWQsSUFBSTBMLElBQ2IsSUFBSyxNQUFNMEYsS0FBTzFGLE9BQ0ozTCxJQUFScVIsR0FBNkIsY0FBUkEsUUFBb0NyUixJQUFiMkwsRUFBSTBGLFVBQzNDMUYsRUFBSTBGLEdBQ0YxRixFQUFJMEYsSUFBNEIsaUJBQWIxRixFQUFJMEYsS0FBc0IvSyxNQUFNMmEsUUFBUXRWLEVBQUkwRixNQUV4RTFGLEVBQUkwRixHQUFPMjNCLEVBQWdCLENBQUNyOUIsRUFBSTBGLEtBQU8sSUFHM0MsT0FBTzFGLEdBRVgsQ0F5RW1CcTlCLENBQWdCNzBCLEdBUzVCLENBQUVBLG1CQUFrQjgwQixjQVBQLENBQUNDLElBQ25CLE1BQU1DLEdBQVUsSUFBQS9sQyxTQUFPLElBQUF5QyxVQUFTLEVBQUEwVixHQUFJLENBQUMsUUFBUyxPQUFRLFdBQVksZUFFbEUsT0FEb0IsSUFBQXRhLFNBQVEsRUFBQWd3QixLQUFNa1ksRUFBUyxFQUFBL0csU0FBUyxJQUFBbmlDLEtBQUksRUFBQXNLLE1BQ2pENitCLENBQVlGLElBRUNHLENBQVlsMUIsR0FHcEMsQ0FFQSx5QkFBT3VvQixDQUFtQnVMLEVBQWtCLENBQUMsRUFBR2xMLEdBQWMsR0FDNUQsTUFBTXVNLEdBQW9CLElBQUF6bkMsTUFBSyxDQUFDLFdBQVksU0FBVW9tQyxHQUN0RCxJQUFJLFFBQUV2akIsUUFBa0Mxa0IsSUFBdEJzcEMsRUFBa0NBLEVBQW9CckIsRUFDeEV2akIsRUFBVUEsR0FBV3FZLEVBQ3JCLE1BQU13TSxFQUFrQnRELElBQ3RCLE1BQU12bEMsRUFBTXVsQyxFQUFFLEdBQ1I3L0IsR0FBUSxJQUFBQyxJQUFHQyxNQUFPNUYsR0FNeEIsTUFMWSxLQUFSQSxFQUNGdWxDLEVBQUUsR0FBSyxLQUNFNy9CLElBQ1Q2L0IsRUFBRSxHQUFLdmxDLEVBQUlzUixLQUFLLE1BRVhpMEIsR0FtQkh1RCxHQUFpQixJQUFBdm9DLFNBQVEsRUFBQXdGLFdBQVcsSUFBQXhHLEtBaEJqQmMsSUFDdkIsTUFBT3NRLEVBQUszUSxHQUFPSyxFQUNiMG9DLEVBQVMva0IsRUFBVSxDQUFFLElBQUssTUFBUyxDQUFDLEVBQ3BDbmUsR0FBUSxJQUFBRixJQUFHaEMsT0FBUTNELEdBQ25CMEYsR0FBUSxJQUFBQyxJQUFHQyxNQUFPNUYsR0FFbEJncEMsRUFBc0IsY0FBUnI0QixFQU9wQixPQVIwQixJQUFWOUssSUFBNEIsSUFBVkgsSUFHaENyRixFQUFJLEdBQUt5b0MsRUFBZXpvQyxFQUFJLElBQ3hCMm9DLElBQ0Yzb0MsRUFBSSxJQUFLLElBQUFFLFVBQVEsSUFBQXNDLGdCQUFla21DLEdBQVMsRUFBQWhqQyxXQUFXLElBQUF4RyxLQUFJc3BDLEdBQWlCLEVBQUE3aUMsUUFBaEUsQ0FBeUUzRixFQUFJLE1BR25GQSxJQUd1RCxFQUFBMkYsU0FFaEUsUUFBMEIxRyxJQUF0QnNwQyxFQUFpQyxDQUNuQ3JCLEVBQWdCeDBCLFNBQVNDLE1BQVE4MUIsRUFBZXZCLEVBQWdCeDBCLFNBQVNDLE9BQ3pFLE1BQU1pMkIsRUFBaUJyRCxFQUF1QjBCLGlCQUFpQkMsRUFBZ0J4MEIsU0FBU0MsT0FFeEYsT0FEQXUwQixFQUFnQngwQixTQUFTQyxPQUFRLElBQUFLLFlBQVdrMEIsRUFBZ0J4MEIsU0FBU0MsTUFBT2kyQixHQUNyRTFCLENBQ1QsQ0FFQSxPQUFPdUIsRUFBZXZCLEVBQ3hCLENBRUEsc0JBQU94aUMsR0FXTCxPQUFPLElBQUFNLFNBVm1CLENBQ3hCLE9BQ0EsU0FDQSxXQUNBLE9BQ0EsV0FDQSxPQUNBLFdBQ0EsU0FDQSxRQUNnQ0MsT0FBT1IsU0FDM0MsRSw2RENuUEssTUFBTW9rQyxFQVdYLFdBQUFqcUMsR0FDRTRCLEtBQUsyZCw2QkFBK0IwcUIsRUFBd0IxcUIsNkJBQTZCaGQsS0FDdkZYLEtBQ0osQ0FFQSxtQ0FBTzJkLENBQTZCMnFCLEVBQVczcEMsRUFBTzZmLEdBQVksRUFBTUUsRUFBVWphLFFBS2hGLE9BREE5RixPQUFrQkYsSUFBVkUsRUFBdUJ1ZCxHQUFNQSxFQUFJdmQsR0FDbEMsSUFBQXNtQyxrQkFKWUMsR0FBV3htQixFQUFRNnBCLGlCQUFpQkQsRUFBV3BELEVBQ2hFLENBQUVzRCxRQUFTaHFCLElBQ1MsS0FBUUUsRUFBUTRwQixHQUFjcHNCLEdBQU1BLElBRVB6VCxNQUFLLElBQUEvSixLQUFJQyxHQUM5RCxDQUdBLHVCQUFPOHBDLENBQWlCbitCLEdBQ3RCLE1BQU1vK0IsRUFBS2prQyxPQUFPMFksV0FBVzdTLEdBRTdCLE9BREF0SyxLQUFLMm9DLHVCQUF1QkQsRUFBSXArQixJQUNsQixJQUFQbytCLEdBQWVBLENBQ3hCLENBRUEsNkJBQU9DLENBQXVCRCxFQUFJcCtCLEdBQ2hDLE1BQU1zK0IsRUFBV3QrQixHQUFPQSxFQUFJZ0wsUUFBUSxRQUFTLElBQ3ZDdXpCLE9BQTZCcHFDLElBQWZpcUMsRUFBR3RyQixTQUF5QndyQixFQUFTRixFQUFHSSxPQUFPaHVCLFFBQVE4dEIsRUFBU3QrQixLQUFTLEVBSzdGLE9BSG9CLElBQWhCdStCLEdBRFl2K0IsS0FBT3pLLFFBQVFDLEtBQUssNENBQTRDd0ssOEJBQWdDbytCLEVBQUdJLG1FQUVqSEMsQ0FBUXorQixHQUVIdStCLENBQ1QsQ0FFQSw4QkFBTy9tQixDQUF3QjZkLEVBQU83dkIsR0FDcEMsTUFLTWs1QixFQUxRbDVCLElBQU9vTSxJQUNuQkEsRUFBRStzQixlQUFpQm41QixFQUNab00sR0FHTWd0QixDQUFNcDVCLEdBUWZxNUIsR0FOWUMsRUFNaUJ6SixFQUwxQixDQUNMMEosV0FBYW5FLElBQWNrRSxFQUFFRSxZQUFZcEUsSUFDekNxRSxjQUFnQnJFLElBQWNrRSxFQUFFSSxTQUFXLFVBSDlCLElBQUNKLEVBUWxCLE9BQU8sSUFBSSxFQUFBbkUsaUJBQ1RrRSxFQUFrQkUsV0FDbEJGLEVBQWtCSSxlQUNqQjlnQyxNQUFLLElBQUEvSixLQUFJc3FDLEdBQ2QsQ0FFQSw2QkFBT3ZuQixDQUF1QnhQLEdBQzVCLE1BQU13M0IsRUFBa0J4M0IsRUFBTzRPLGNBQWdCNU8sRUFBTzRPLGFBQ2hEcmhCLEVBQU0sR0FXWixPQURBLElBQUEyaEIsZUFSb0IsQ0FBQ2hpQixFQUFLMlEsRUFBSzFGLEtBQzdCLE1BQU1zK0IsRUFBS0wsRUFBd0JJLGlCQUFpQnRwQyxHQUlwRCxPQUhXLElBQVB1cEMsR0FDRmxwQyxFQUFJbVgsS0FBSzB4QixFQUF3QnZtQix3QkFBd0I0bUIsRUFBSTU0QixJQUV4RHRRLEdBR2tCaXFDLEdBQ3BCanFDLENBQ1QsRSxzQ0NyRUYsTUFBTWtxQyxFQUFZLElBQUlDLE1BRUQsSUFEa0Isb0JBQVhsbEMsU0FBNkQsSUFBbkNBLE9BQU9tbEMsMEJBRXpEL3BDLFFBQVFDLFFBQVE2cEMsSUFJZEUsRUFBMkIsQ0FBQy8vQixHQUFPLEtBQ2pCLG9CQUFYckYsU0FDVEEsT0FBT21sQyx5QkFBbUMsSUFBVDkvQixHLHNDQ3JCckMsTUFBTWdnQyxFQUF3QixDQUFDQyxHQUFXLEVBQU85d0IsRUFBSSxFQUFHelMsRUFBSSxPQUFRd2pDLEdBQWdCLElBRzNFLElBRm1DLElBQWxCQSxFQUF5QixhQUFlLHlCQUVoQi93QixNQUFNelMsZ0JBRHpCLElBQWJ1akMsRUFBb0IsRUFBSSxLQUduQyxTQUFTRSxFQUFPbnpCLEVBQUltQyxHQUN6QixNQUFNaXhCLEVBQXVELEVBQXRDemxDLE9BQU8wbEMsaUJBQWlCcnpCLEdBQUlzekIsUUFFN0NDLEVBQVlQLEdBQXNCLEVBQU03d0IsRUFBRyxPQURWLElBQW5CaXhCLEdBRXBCcHpCLEVBQUdtTixNQUFNQyxTQUFXbW1CLENBQ3RCLENBQ08sU0FBU0MsRUFBUXh6QixFQUFJbUMsRUFBR3N4QixHQUM3QixNQUFNRixFQUFZUCxHQUFzQixFQUFPN3dCLEVBQUcsUUFDbERuQyxFQUFHbU4sTUFBTUMsU0FBV21tQixFQUdwQnZ6QixFQUFHeXhCLGlCQUFpQixnQkFBaUJnQyxHQUFVLEVBQ2pELEMsNkRDZE8sTUFBTUMsRUFDWCxXQUFBcHNDLENBQVlFLEdBU1YwQixLQUFLMUIsTUFBTW1zQyxrQkFBb0JELEVBQXFCRSw4QkFDdEQsQ0FFQSxxQ0FBT0MsR0FDTCxNQUFNQyxFQUFjLFdBQ2RDLEVBQVksU0FDWkMsRUFBVyxRQUNqQixNQUFPLENBQ0xDLEVBQUcsQ0FBQ0YsR0FDSkcsRUFBRyxDQUFDRixHQUNKRyxJQUFLLENBQUNKLEVBQVdELEVBQWFFLEdBQzlCSSxHQUFJLENBQUNKLEVBQVVGLEdBQ2ZPLEdBQUksQ0FBQ04sRUFBV0QsR0FDaEJRLEdBQUksQ0FBQ1AsRUFBV0MsR0FFcEIsQ0FFQSxvQkFBT08sQ0FBY2poQyxHQUVuQixPQURpQixJQUFBa2hDLE1BQUssRUFBQTk0QixXQUNmKzRCLENBQVMsQ0FBRTFuQyxLQUFLLENBQUMsY0FBZSxJQUFBTCxPQUFNNEcsR0FDL0MsQ0FFQSx5QkFBT29oQyxDQUFtQnBoQyxFQUFLNUssRUFBTSxDQUFDLFdBQVksU0FFaEQsT0FEaUIsSUFBQThyQyxNQUFLLEVBQUE5NEIsV0FDZis0QixFQUFTLElBQUEvbkMsT0FBTTRHLEdBQU0sQ0FBRXZHLEtBQUtyRSxHQUNyQyxDQUVBLDZCQUFPaXNDLENBQXVCcmhDLEVBQUs1SyxFQUFNLENBQUMsUUFBUyxTQUVqRCxPQURpQixJQUFBOHJDLE1BQUssRUFBQTk0QixXQUNmKzRCLEVBQVMsSUFBQS9uQyxPQUFNNEcsR0FBTSxDQUFFdkcsS0FBS3JFLEdBQ3JDLENBRUEsc0JBQU9rc0MsQ0FBZ0J4dkIsR0FDckIsT0FBT2xjLEtBQUtxckMsY0FBY252QixFQUM1QixDQUVBLG1DQUFPd3VCLENBQTZCMStCLEVBQU8sSUFBSSxFQUFBbkYsUUFBVzhrQyxFQUFVemIsUUFDakR6eEIsSUFBYmt0QyxRQUFtQ2x0QyxJQUFUeXhCLElBQzVCbGtCLEVBQUsyL0IsU0FBV0EsRUFDaEIzL0IsRUFBS2trQixLQUFPQSxHQUdkLE1BQU0wYixFQUFnQnpzQyxJQUFPLElBQUEwc0MsZUFBY0MsR0FBV0EsRUFBUXhuQyxTQUFTbkYsR0FBTSxRQUN2RTRzQyxFQUFlSCxFQUFjLFVBQzdCSSxFQUFjSixFQUFjLFNBQzVCSyxFQUFpQkwsRUFBYyxZQUUvQk0sRUFBV0MsSUFBVSxJQUFBMzVCLFlBQVcsQ0FBRTQ1QixNQUFNRCxJQUN4Q0UsRUFBaUJILEVBQVMsU0FDMUJJLEVBQW1CSixFQUFTLFlBQzVCSyxFQUFnQkwsRUFBUyxVQUV6Qk0sRUFBUXhnQyxFQUNYdkQsTUFBSyxJQUFBQyxRQUFRcEgsUUFBd0I3QyxJQUFaNkMsUUFBNEM3QyxJQUFuQjZDLEVBQVFILFNBRXZEc3JDLEVBQWN6Z0MsRUFBS3ZELE1BQUssSUFBQUMsUUFBT3VqQyxJQUFpQixJQUFBdnRDLEtBQUk0dEMsSUFDcERJLEVBQVkxZ0MsRUFBS3ZELE1BQUssSUFBQUMsUUFBT3FqQyxJQUFlLElBQUFydEMsS0FBSTJ0QyxJQUNoRE0sRUFBVzNnQyxFQUFLdkQsTUFBSyxJQUFBQyxRQUFPc2pDLElBQWMsSUFBQXR0QyxLQUFJNnRDLElBRTlDSyxFQUFZLENBQ2hCQyxPQUFRSCxFQUNSSSxTQUFVTCxFQUNWTSxNQUFPSixHQTRCVCxNQUFPLENBQ0xILE9BQU1DLGNBQWFDLFlBQVdDLFdBQVVLLFlBVHRCLE1BS2xCLElBQUE1bUMsU0FKdUJ4QixJQUNyQkEsRUFBRXFvQyxXQUNGcm9DLEVBQUVzb0MsV0FBWSxHQUVRLENBQUNWLEVBQU1DLEVBQWFDLEVBQVdDLEtBSUZRLGVBMUJoQyxDQUFDM3RDLEVBQU0sV0FhaEJmLElBQVJlLEdBQXFCQSxFQUFJQyxRQUFVLEdBQ3JDRCxFQUFJNEcsUUFScUJrRSxJQUxUMUYsV0FNT25HLElBQW5CbXVDLEVBQVV0aUMsTUFORTFGLEVBT0Rnb0MsRUFBVXRpQyxJQU52QjJpQyxXQUNGcm9DLEVBQUVzb0MsV0FBWSxNQXlCcEIsRSw0REMxRUssTUFBTUUsRUFDWCxXQUFBaHZDLENBQVlpdkMsRUFBVTFsQyxFQUFPLENBQUMsRUFBR2lpQixFQUFPLENBQUMsR0FRdkMsR0FQQTVwQixLQUFLcXRDLFNBQVdydEMsS0FBS3N0QyxlQUFlRCxHQUNwQ3J0QyxLQUFLdXRDLGFBQXNDLElBQXhCNWxDLEVBQUs2bEMsZUFDeEJ4dEMsS0FBS2pCLFNBQVc2cUIsR0FBTTdxQixVQUtHLElBQXJCaUIsS0FBS3V0QyxjQUFpRSxJQUF4QyxJQUFtQjNRLGlCQUEyQixDQUM5RSxNQUFNNlEsRUFBYSxJQUFtQm5SLG1CQUFtQjMwQixRQUN0Q2xKLElBQWZndkMsR0FFRjlsQyxFQUFPOGxDLEVBQ1B6dEMsS0FBS3V0QyxhQUFjLElBQzRELElBQXRFSCxFQUFtQk0sMEJBQTBCL2xDLEVBQU0zSCxLQUFLcXRDLFVBTWpFcnRDLEtBQUt1dEMsYUFBYyxHQUNtQixJQUE3QixJQUFtQjFxQyxPQUM1QixJQUFtQjI1Qix1QkFBdUI3MEIsRUFBTTNILEtBQUtxdEMsU0FFekQsQ0FnQkEsR0FGQXJ0QyxLQUFLcXRDLFNBQVdELEVBQW1CTyx3QkFBd0IzdEMsS0FBS3F0QyxXQUV2QyxJQUFyQnJ0QyxLQUFLdXRDLFlBQXNCLENBQzdCLE1BQU1LLEdBQXlELElBQXhDLElBQW1CaFIsaUJBQ3RDLElBQW1CSSwyQkFDbkJvUSxFQUFtQnBRLDJCQUVPLG1CQUFuQjRRLElBQ1Q1dEMsS0FBS3F0QyxTQUFXTyxFQUFlNXRDLEtBQUtxdEMsVUFFeEMsQ0FFMEIsT0FDQSxLQUFwQixJQUFBdm9DLElBQUdDLE1BQU80QyxLQUNaQSxFQUFPLENBQUVrbUMsVUFBVWxtQyxHQUNuQjNILEtBQUtxdEMsU0FBV3J0QyxLQUFLcXRDLFNBQVMvM0IsUUFBUSxRQUFTLGtCQUMvQ3RWLEtBQUtxdEMsU0FBV3J0QyxLQUFLcXRDLFNBQVMvM0IsUUFBUSxRQUFTLG9CQUluRHc0QixHQUVBOXRDLEtBQUsrdEMsYUFBZXBtQyxFQU9wQjNILEtBQUtndUMscUJBQXVCLEtBRTVCLE1BQU1uSixFQUFTdUksRUFBbUJhLGVBQWVqdUMsS0FBS3F0QyxVQUV0RCxJQUFJYSxFQUFhbHVDLEtBQUtxdEMsU0FBU3Q0QixNQUFNcTRCLEVBQW1CZSxtQkFDeERELEVBQTRCLE9BQWZBLEVBQXNCLEdBQUtBLEVBRXhDLE1BQU1FLEVBQW1CaEIsRUFBbUJnQixtQkFFdENDLEVBQWtCcnVDLEtBQUtzdUMsaUJBQWlCM3RDLEtBQUtYLE1BTTdDdXVDLEdBQW9CLElBQUFqcUMsVUFBUyxFQUFBMFYsR0FBSWswQixHQUNqQ00sR0FBa0IsSUFBQXhrQyxRQUN0QnVrQyxFQU5tQmprQyxHQUNaQSxFQUFJZ0wsUUFBUTg0QixFQUFrQkMsR0FPckNydUMsS0FBS3l1QyxVQUFVOXRDLEtBQUtYLE9BRXRCQSxLQUFLMHVDLFNBQVc3SixFQUFPbm1DLElBQUk4dkMsRUFDN0IsQ0FFQSxxQkFBT0csQ0FBZXJrQyxHQUNwQixNQUFPLGNBQWNzSyxLQUFLdEssRUFDNUIsQ0FpQkEsZ0NBQU9vakMsQ0FBMEIvbEMsRUFBTTBsQyxHQUNyQyxHQUFhLE9BQVQxbEMsR0FBaUMsaUJBQVRBLEdBQXlDLGlCQUFiMGxDLEVBQ3RELE9BQU8sRUFFVCxJQUFnQyxJQUE1QkEsRUFBU3Z5QixRQUFRLE1BQ25CLE9BQU8sRUFFVCxNQUFNOVIsRUFBT2xHLE9BQU9rRyxLQUFLckIsR0FDekIsSUFBSyxJQUFJMFosRUFBSSxFQUFHQSxFQUFJclksRUFBS3ZKLE9BQVE0aEIsSUFBSyxDQUNwQyxNQUFNdlIsRUFBTTlHLEVBQUtxWSxHQUNYbGlCLEVBQU13SSxFQUFLbUksR0FDakIsR0FBWSxPQUFSM1EsR0FBK0IsaUJBQVJBLElBQTJDLElBQXZCQSxFQUFJcXVDLGtCQUNWLElBQW5DSCxFQUFTdnlCLFFBQVEsS0FBS2hMLFFBQ2UsSUFBckN1OUIsRUFBU3Z5QixRQUFRLE1BQU1oTCxTQUNhLElBQXBDdTlCLEVBQVN2eUIsUUFBUSxNQUFNaEwsT0FDekIsT0FBTyxDQUdiLENBQ0EsT0FBTyxDQUNULENBRUEsc0JBQU84K0IsQ0FBZ0JqbkMsR0FDckIsR0FBYSxPQUFUQSxHQUFpQyxpQkFBVEEsRUFDMUIsT0FBTyxFQUVULE1BQU1oSSxFQUFTbUQsT0FBT25ELE9BQU9nSSxHQUM3QixJQUFLLElBQUkwWixFQUFJLEVBQUdBLEVBQUkxaEIsRUFBT0YsT0FBUTRoQixJQUFLLENBQ3RDLE1BQU1saUIsRUFBTVEsRUFBTzBoQixHQUNuQixHQUFZLE9BQVJsaUIsR0FBK0IsaUJBQVJBLElBQTJDLElBQXZCQSxFQUFJcXVDLGVBQ2pELE9BQU8sQ0FFWCxDQUNBLE9BQU8sQ0FDVCxDQXVCQSw4QkFBT0csQ0FBd0JOLEdBQzdCLE1BQXdCLGlCQUFiQSxJQUFzRCxJQUE3QkEsRUFBU3Z5QixRQUFRLE9BQzVDdXlCLEVBS0ZBLEVBQVMvM0IsUUFBUSx5QkFBMEIsU0FDcEQsQ0FHQSwyQkFBT3U1QixDQUFxQmxuQyxFQUFPLENBQUMsRUFBRzA3QixFQUFRLElBUTdDLE1BQU8sU0FBU3p1QixLQUFLblAsT0FBTzQ5QixJQUFVNTlCLE9BQU80OUIsR0FBT2xNLE1BQU0sS0FBS3pnQixPQVAzQyxDQUFDbzRCLEVBQVl4a0MsSUFDM0J3a0MsRUFBV3hrQyxHQUNOd2tDLEVBQVd4a0MsR0FFUyxpQkFBZndrQyxFQUEwQkEsRUFBYSxHQUc0Qm5uQyxHQUFRQSxFQUFLMDdCLElBQVUsRUFDNUcsQ0FFQSxxQkFBTzRLLENBQWVaLEdBQ3BCLE1BQU14SSxFQUFTd0ksRUFBU2xXLE1BQU1pVyxFQUFtQmUsbUJBQzNDWSxFQUFVLGlCQWVWQyxFQUFlbkssRUFBT244QixPQUFPLENBQUN1bUMsRUFBRzV0QixNQUFRQSxHQUFLLElBQU1BLEVBQUksR0FBSyxHQUFNLElBSXpFLE9BRmlCLElBQUF4ZixRQURhZ3RCLEdBQUtBLEVBQUU5WixNQUFNZzZCLEdBQ0lDLEVBR2pELENBUUEsc0JBQU9iLEdBQ0wsTUFBTyx1Q0FDVCxDQUVBLHVCQUFPQyxHQUNMLE1BQU8sMkNBQ1QsQ0FPQSxrQkFBT2MsR0FDTCxNQUFPLDJDQUNULENBRUEsMEJBQU9DLEdBQ0wsTUFBTyxpQkFDVCxDQU9BLGNBQU9DLENBQVE5a0MsR0FDYixPQUFPOGlDLEVBQW1COEIsY0FBY3Q2QixLQUFLdEssRUFDL0MsQ0FFQSxVQUFBK2tDLFFBQ2U1d0MsSUFBVHVCLE9BQ0ZBLEtBQUswdUMsY0FBV2p3QyxFQUNoQnVCLEtBQUsrdEMsa0JBQWV0dkMsRUFDcEJ1QixLQUFLcXRDLGNBQVc1dUMsRUFFcEIsQ0FZQSx5QkFBTzZ3QyxDQUFtQnJYLEdBQ3hCLE9BQXdDLElBQXBDQSxFQUFLbmQsUUFBUSxrQkFDUm1kLEVBR0ZBLEVBQUszaUIsUUFESSwySEFDYSxLQUMvQixDQUVBLGFBQUFpNkIsR0FDRSxJQUFJdFgsRUFBT21WLEVBQW1Cb0MsZUFBZXh2QyxLQUFLMHVDLFNBQVNqK0IsS0FBSyxNQUN2QyxJQUFyQnpRLEtBQUt1dEMsY0FDUHRWLEVBQU9tVixFQUFtQmtDLG1CQUFtQnJYLEtBRXpCLElBQWxCajRCLEtBQUtqQixXQUNQazVCLEdBQU8sT0FBYUEsSUFFdEIsTUFDTW5oQixFQURnQiw0RUFBNEVsQyxLQUFLcWpCLEdBQzVFQSxFQUFPdmQsU0FBUyswQixjQUFjQyx5QkFBeUJ6WCxHQUdsRixPQURBeHpCLE9BQU9pRyxXQUFXMUssS0FBS3F2QyxXQUFZLEdBQzVCdjRCLENBQ1QsQ0FFQSxjQUFBNjRCLEdBQ0UsSUFBSTFYLEVBQU9qNEIsS0FBSzB1QyxTQUFTaitCLEtBQUssSUFXOUIsT0FWQXduQixFQUFPbVYsRUFBbUJvQyxlQUFldlgsSUFDaEIsSUFBckJqNEIsS0FBS3V0QyxjQUNQdFYsRUFBT21WLEVBQW1Ca0MsbUJBQW1CclgsS0FFekIsSUFBbEJqNEIsS0FBS2pCLFdBR1BrNUIsRUFBT3h5QixRQUFPLE9BQWF3eUIsS0FFN0J4ekIsT0FBT2lHLFdBQVcxSyxLQUFLcXZDLFdBQVksR0FDNUJwWCxDQUNULENBRUEsaUJBQUEyWCxHQUNFLE9BQU81dkMsS0FBSzB1QyxTQUFTaitCLEtBQUssR0FDNUIsQ0FFQSxjQUFBNjhCLENBQWVELEdBQ2IsT0FBdUUsSUFBaEUsQ0FBQyxTQUFVLFlBQVkvb0MsVUFBUyxJQUFBNEIsTUFBSyxXQUFZbW5DLElBQXNCQSxFQUFTM1QsVUFBWTJULENBQ3JHLENBRUEscUJBQUF3QyxDQUFzQkMsRUFBU0MsR0FDN0IsTUFBTXBlLEVBQVVsc0IsT0FBT3FxQyxHQUFTM1ksTUFBTSxLQUV0QyxPQURpQixJQUFBNzJCLE1BQUtxeEIsRUFBU29lLElBQ1osRUFDckIsQ0FFQSxTQUFBdEIsQ0FBVW5rQyxHQUlSLE9BQU9BLEVBQUlnTCxRQUFRODNCLEVBQW1CK0Isc0JBSGxCLENBQUM3a0MsRUFBSzBLLEVBQUlDLEVBQUlDLElBQ3pCazRCLEVBQW1CeUIscUJBQXFCN3VDLEtBQUsrdEMsYUFBYzk0QixHQUd0RSxDQUVBLHFCQUFPdTZCLENBQWVRLEdBQ3BCLE1BQU0sU0FBRXB0QixHQUFhLElBQ3JCLFlBQWlCbmtCLElBQWJta0IsR0FDRm90QixFQUFjQSxFQUFZQyxXQUFXLDBCQUEyQixTQUFTcnRCLE1BQ3REcXRCLFdBQVcseUJBQTBCLFNBQVNydEIsS0FFNURvdEIsQ0FDVCxDQVdBLGdCQUFBRSxDQUFpQkMsRUFBU0MsR0FDeEIsTUFBTUMsRUFBVWpELEVBQW1COEIsY0FFbkMsT0FBT2lCLEVBQVE3NkIsUUFBUSs2QixFQUFTLENBQUNDLEVBQVdDLEVBQVNDLEVBQVVDLE1BRWYsSUFBMUNyRCxFQUFtQmdDLFFBQVFxQixNQUNJLElBQTdCLElBQW1CNXRDLFFBQW9DLElBQWxCN0MsS0FBS2pCLFVBQzVDYyxRQUFRQyxLQUVOLDRIQUFnRDB3QyxnRUFNcERDLEVBQVlBLEVBQVVuN0IsUUFBUSxrQkFBbUIsS0FHbkQsTUFBTW83QixFQUFZdEQsRUFBbUJ5QixxQkFBcUJ1QixFQUFZSSxHQUV0RSxJQUF5QixLQUFyQixJQUFBdHhDLE9BQU13eEMsS0FBdUIsSUFBQWpuQyxTQUFRaW5DLEdBQ3ZDLE1BQU8sR0FHVCxNQUFNQyxFQUFXNXJDLE1BQU0yYSxRQUFRZ3hCLEdBQWFBLEVBQVksQ0FBQ0EsR0FNbkRFLEVBQWdCNXdDLEtBQUtndUMscUJBQzNCaHVDLEtBQUtndUMscUJBQXVCMEMsRUFFNUIsTUFBTUcsRUFBV0YsRUFBU2p5QyxJQUFJLENBQUNveUMsRUFBV0MsSUFDakMvd0MsS0FBS2d4QyxrQkFBa0JQLEVBQVdLLEVBQVdDLElBQ25EdGdDLEtBQUssSUFHUixPQURBelEsS0FBS2d1QyxxQkFBdUI0QyxFQUNyQkMsR0FFWCxDQXlCQSxpQkFBQUcsQ0FBa0IxbUMsRUFBS3FDLEVBQU1za0MsR0FFM0IsR0FBb0IsaUJBQVR0a0MsRUFBbUIsQ0FDNUIsR0FBSXlnQyxFQUFtQnVCLGVBQWVya0MsR0FBTSxDQUMxQyxNQUFNNG1DLEVBQVV2a0MsRUFBSzJJLFFBQVEsTUFBTyxRQUNwQyxPQUFPaEwsRUFBSWdMLFFBQVE4M0IsRUFBbUIrQixzQkFBdUIrQixFQUMvRCxDQUdBLE1BQU1DLEVBQU1ueEMsS0FBS294Qyx1QkFBdUJ6a0MsRUFBTXNrQyxHQUM5QyxPQUFPanhDLEtBQUtxeEMsaUJBQWlCL21DLEVBQUs2bUMsRUFDcEMsQ0FHQSxNQUFNenZDLEVBQVUxQixLQUFLc3hDLGlCQUFpQjNrQyxFQUFNc2tDLEdBQzVDLE9BQU9qeEMsS0FBS3F4QyxpQkFBaUIvbUMsRUFBSzVJLEVBQ3BDLENBZ0JBLHNCQUFBMHZDLENBQXVCemtDLEVBQU1za0MsR0FDM0IsTUFBTXhTLEVBQVUsQ0FDZDhTLGFBQWM1a0MsRUFDZDZrQyxVQUFXUCxFQUNYUSxRQUFTUixFQUFRLEdBR25CLElBQXlCLElBQXJCanhDLEtBQUt1dEMsWUFBc0IsQ0FDN0IsTUFBTW1FLEVBQVkxeEMsS0FBS2d1QyxxQkFDdkIsR0FBSTBELEdBQWtDLGlCQUFkQSxFQUF3QixDQUM5Q2pULEVBQVFrVCxjQUFnQkQsRUFBVUMsZUFBaUIsR0FDbkQsTUFBTUMsRUFBVyxpQkFBaUJqbEMsSUFDbEM4eEIsRUFBUW9ULGFBQWtDcHpDLElBQXhCaXpDLEVBQVVFLEdBQTBCRixFQUFVRSxHQUFZLEVBQzlFLE1BQ0VuVCxFQUFRa1QsY0FBZ0IsR0FDeEJsVCxFQUFRb1QsUUFBVSxFQUV0QixDQUVBLE9BQU9wVCxDQUNULENBTUEsZ0JBQUE2UyxDQUFpQjNrQyxFQUFNc2tDLEdBQ3JCLE1BQU14UyxFQUFVMzdCLE9BQU9raUIsT0FBTyxDQUFDLEVBQUdyWSxFQUFNLENBQ3RDNmtDLFVBQVdQLEVBQ1hRLFFBQVNSLEVBQVEsSUFVbkIsT0FQeUIsSUFBckJqeEMsS0FBS3V0QyxjQUNQOU8sRUFBUWtULGNBQWdCaGxDLEVBQUtnbEMsY0FDN0JsVCxFQUFROFMsYUFBZTVrQyxFQUN2Qjh4QixFQUFRK1MsVUFBWVAsRUFDcEJ4UyxFQUFRZ1QsUUFBVVIsRUFBUSxHQUdyQnhTLENBQ1QsQ0FLQSxnQkFBQTRTLENBQWlCL21DLEVBQUs2bUMsR0FDcEIsTUFBTVcsRUFBUSxTQUNSQyxFQUFhLENBQUVQLFVBQVdMLEVBQUlLLFVBQVdDLFFBQVNOLEVBQUlNLFNBZTVELE9BQU9ubkMsRUFBSWdMLFFBQVE4M0IsRUFBbUIrQixzQkFickIsQ0FBQ3A2QixFQUFPQyxFQUFJQyxTQUVKeFcsSUFBbkJzekMsRUFBVzk4QixHQUEwQjg4QixFQUFXOThCLElBRzdCLElBQW5CNjhCLEVBQU1sOUIsS0FBS0ssU0FBNkJ4VyxJQUFaMHlDLEVBQUlsOEIsR0FDM0JrOEIsRUFBSWw4QixHQUlOalYsS0FBSzZ2QyxzQkFBc0I1NkIsRUFBSWs4QixHQUkxQyxDQU9BLGdCQUFBN0MsQ0FBaUJoa0MsRUFBSzBLLEVBQUlDLEVBQUlDLEdBQzVCLE1BQU04OEIsRUFBWTk4QixFQUNaKzhCLEVBQVM3RSxFQUFtQnlCLHFCQUFxQjd1QyxLQUFLK3RDLGFBQWM5NEIsR0FFMUUsSUFBc0IsS0FBbEIsSUFBQS9WLE9BQU0reUMsS0FBb0IsSUFBQXhvQyxTQUFRd29DLEdBQ3BDLE1BQU8sR0FNVCxNQUFNckIsRUFBZ0I1d0MsS0FBS2d1QyxxQkFDM0JodUMsS0FBS2d1QyxxQkFBdUJpRSxFQUU1QixNQUFNQyxFQUFRbnRDLE1BQU0yYSxRQUFRdXlCLEdBQVVBLEVBQVMsQ0FBQ0EsR0FJMUNFLEVBQW1CL0UsRUFBbUJnQyxRQUFRNEMsR0FFOUNuQixFQUFXcUIsRUFBTXh6QyxJQUFJLENBQUNpTyxFQUFNc2tDLEtBQ2hDLE1BQU1qdEIsRUFBT211QixFQUNUbnlDLEtBQUtrd0MsaUJBQWlCOEIsRUFBV3JsQyxHQUNqQ3FsQyxFQUVKLE9BQU9oeUMsS0FBS2d4QyxrQkFBa0JodEIsRUFBTXJYLEVBQU1za0MsS0FDekN4Z0MsS0FBSyxJQUdSLE9BREF6USxLQUFLZ3VDLHFCQUF1QjRDLEVBQ3JCQyxDQUNULEUsd0ZDdmpCRixNQUFNdUIsRUFzQkosV0FBQWgwQyxDQUFZRSxFQUFRLENBQUMsRUFBR1MsR0FBVyxHQUNaLElBQU9JLEVBRTVCYixFQUFNKzFCLFNBRnNCbDFCLEVBRVFiLEVBQU0rMUIsU0FGTixJQUFBaDBCLFdBRVAsTUFGTyxDQUFnQmxCLElBSXBEYixFQUFNK3pDLGdCQUFrQzV6QyxJQUFyQkgsRUFBTSt6QyxXQUEyQi96QyxFQUFNK3pDLFdBQWFyeUMsS0FBS3N5QyxpQkFBaUJoMEMsR0FDN0ZBLEVBQU1pMEMsTUFBUXZ5QyxLQUFLd3lDLFlBQVlsMEMsRUFBTSt6QyxZQUVyQy96QyxFQUFNbTBDLFNBQVcvM0IsU0FBU2c0Qix5QkFDMUIxeUMsS0FBS2pCLFNBQVdBLEVBQ2hCaUIsS0FBSzFCLE1BQVFBLEVBRWIwQixLQUFLeVAsV0FDUCxDQUVBLE9BQUFnc0IsQ0FBUTNyQixFQUFLM1EsR0FDWGEsS0FBSzFCLE1BQU13UixHQUFPM1EsQ0FDcEIsQ0FFQSxPQUFBdzhCLENBQVF4OEIsR0FDTixPQUFPYSxLQUFLMUIsTUFBTWEsRUFDcEIsQ0FFQSxNQUFJMlgsR0FDRixPQUFPOVcsS0FBSzFCLE1BQU13WSxFQUNwQixDQUVBLFVBQUE2N0IsQ0FBVzc3QixFQUFJODdCLEdBQ2IsTUFBTTd6QyxHQUE2QixJQUFsQmlCLEtBQUtqQixTQTJCdEIsT0FOQWlCLEtBQUsyN0IsUUFBUSxTQUFTdjFCLFFBcEJBLENBQUNqSCxFQUFLMlEsS0FFMUIsR0FBWSxZQUFSQSxFQUFKLENBT0EsSUFBaUIsSUFBYi9RLEVBQW1CLENBQ3JCLE1BQU0sUUFBRW02QixFQUFPLE1BQUUva0IsSUFBVSxRQUFrQnJFLEVBQUszUSxFQUFLMlgsRUFBR3VkLFNBQzFELElBQWdCLElBQVo2RSxFQUVGLFlBREEsT0FBVSxpQ0FBaUNwcEIsc0NBQXlDZ0gsR0FHdEYzWCxFQUFNZ1YsQ0FDUixDQUVBMkMsRUFBR3NnQixhQUFhdG5CLEVBQUszUSxFQVhyQixNQUZFLElBQUF5dEIsbUJBSm1CLENBQUN6dEIsRUFBSzJRLEtBQVVnSCxFQUFHQyxRQUFRakgsR0FBTzNRLEdBSXJCQSxNQWlCbkIsSUFBYkosSUFDRixRQUFzQitYLEdBR2pCQSxDQUNULENBRUEsV0FBQTA3QixDQUFZSSxFQUFRcDlCLEdBQ2xCLE1BQU1xOUIsT0FBZXAwQyxJQUFOK1csRUFBa0JBLEVBQUksSUFBSWpHLElBR3pDLE9BREEsSUFBQTRSLGVBRHNCLENBQUNoaUIsRUFBSzJRLElBQVEraUMsRUFBTzd1QyxJQUFJOEwsRUFBSzNRLEdBQ3ZCeXpDLEdBQ3RCQyxDQUNULENBRUEsV0FBQUMsQ0FBWWg4QixHQUNWLE1BQU11MkIsRUFBV3J0QyxLQUFLMjdCLFFBQVEsWUFXOUIsWUFBb0JsOUIsSUFBYjR1QyxFQVRTLENBQUNBLElBQ2YsSUFBSTFsQyxFQUFPM0gsS0FBSzI3QixRQUFRLFFBQ3hCaDBCLEdBQU8sSUFBQTdDLElBQUdoQyxPQUFRNkUsR0FBUUEsRUFBTyxDQUFDLEVBQ2xDLE1BQU1vckMsRUFBTyxJQUFJLElBQW1CMUYsRUFBVTFsQyxFQUFNLENBQUU1SSxTQUFVaUIsTUFBTWpCLFdBQVl3d0MsZ0JBR2xGLE9BRnFCLElBQUF6cUMsSUFBR1csT0FBUXN0QyxHQUNqQmo4QixFQUFHNGlCLFVBQVlxWixFQUFPajhCLEVBQUcwTyxZQUFZdXRCLEdBQzdDajhCLEdBR3VCazhCLENBQVEzRixHQUFzQnYyQixDQUNoRSxDQUVBLGFBQUF5a0IsQ0FBY2xILEVBQVUsT0FDdEIsT0FBTzNaLFNBQVM2Z0IsY0FBY2xILEVBQ2hDLENBRUEsVUFBQTRlLENBQVduOEIsR0FDVCxNQUFNOFIsRUFBUTVvQixLQUFLMjdCLFFBQVEsUUFFM0IsSUFBZSxLQURBLElBQUE3MkIsSUFBR1csT0FBUW1qQixHQUNMLENBQ25CLE1BQU1zcUIsRUFBTXg0QixTQUFTeTRCLGVBQWV2cUIsR0FDcEM5UixFQUFHME8sWUFBWTB0QixFQUNqQixDQUNBLE9BQU9wOEIsQ0FDVCxDQUVBLE9BQUFzOEIsR0FDRSxNQUFNdDhCLEdBQUssSUFBQXJPLE1BQ1R6SSxLQUFLdTdCLGNBQWM1NkIsS0FBS1gsTUFDeEJBLEtBQUsyeUMsV0FBV2h5QyxLQUFLWCxNQUNyQkEsS0FBSzh5QyxZQUFZbnlDLEtBQUtYLE1BQ3RCQSxLQUFLaXpDLFdBQVd0eUMsS0FBS1gsTUFKWixDQUtUQSxLQUFLMjdCLFFBQVEsWUFFZjM3QixLQUFLMUIsTUFBTXdZLEdBQUtBLENBQ2xCLENBTUEsTUFBQTJPLEdBS0UsT0FKQXpsQixLQUFLb3pDLFVBQ0xwekMsS0FBSzFCLE1BQU0rdUMsY0FBVzV1QyxFQUN0QnVCLEtBQUsxQixNQUFNcUosVUFBT2xKLEVBQ2xCdUIsS0FBSzFCLE1BQU0rekMsZ0JBQWE1ekMsRUFDakJ1QixLQUFLMjdCLFFBQVEsS0FDdEIsQ0FFQSxrQkFBQTBYLEdBS0UsT0FKQXJ6QyxLQUFLb3pDLFVBQ0xwekMsS0FBSzFCLE1BQU0rdUMsY0FBVzV1QyxFQUN0QnVCLEtBQUsxQixNQUFNcUosVUFBT2xKLEVBQ2xCdUIsS0FBSzFCLE1BQU0rekMsZ0JBQWE1ekMsRUFDakJ1QixLQUFLMjdCLFFBQVEsTUFBTTJYLFNBQzVCLENBRUEsZUFBQUMsQ0FBZ0JucEMsRUFBS2pMLEdBQ25CLFFBQVlWLElBQVJVLEVBQW1CLENBQ3JCLE1BQU02RixPQUF5QixJQUFWLEVBQ0hvRixFQUFJakwsSUFBWixJQUFWNkYsRUFBNkI3RixHQUFpQixPQUFVaUwsRUFBSWpMLEdBQU1BLEVBQ3BFLENBQ0YsQ0FFQSxXQUFBcTBDLENBQVlyMEMsR0FFVixPQURBYSxLQUFLdXpDLGdCQUFnQnZ6QyxLQUFLMUIsTUFBT2EsR0FDMUJhLElBQ1QsQ0FFQSxpQkFBQXl6QyxDQUFrQnQwQyxHQUdoQixPQUZBYSxLQUFLd3pDLFlBQVlyMEMsR0FDakJhLEtBQUtvekMsVUFDRXB6QyxLQUFLMjdCLFFBQVEsV0FDdEIsQ0FFQSxPQUFBK1gsUUFDcUJqMUMsSUFBZnVCLEtBQUsxQixRQUNQMEIsS0FBSzI3QixRQUFRLE1BQU1nWSxTQUNuQjN6QyxLQUFLMUIsV0FBUUcsRUFDYnVCLEtBQUs2dkIsS0FFVCxDQUVBLFNBQUErakIsQ0FBVXZmLEVBQVUsT0FBU3IwQixLQUFLd3pDLFlBQVluZixFQUFTLENBQ3ZELGdCQUFBd2YsQ0FBaUJ0QixFQUFRLENBQUMsR0FBS3Z5QyxLQUFLd3pDLFlBQVlqQixFQUFPLENBQ3ZELGNBQUF1QixDQUFlekcsR0FBWXJ0QyxLQUFLd3pDLFlBQVluRyxFQUFVLENBQ3RELFVBQUEwRyxDQUFXcHNDLEVBQU8sQ0FBQyxHQUFLM0gsS0FBS3d6QyxZQUFZN3JDLEVBQU0sQ0FDL0MsZUFBQXFzQyxDQUFnQjNmLEVBQVUsT0FBU3IwQixLQUFLeXpDLGtCQUFrQnBmLEVBQVMsQ0FDbkUsdUJBQUE0ZixDQUF3QjFCLEVBQVEsQ0FBQyxHQUFLdnlDLEtBQUt5ekMsa0JBQWtCbEIsRUFBTyxDQUNwRSxvQkFBQTJCLENBQXFCN0csR0FBWXJ0QyxLQUFLeXpDLGtCQUFrQnBHLEVBQVUsQ0FDbEUsZ0JBQUE4RyxDQUFpQnhzQyxFQUFPLENBQUMsR0FBSzNILEtBQUt5ekMsa0JBQWtCOXJDLEVBQU0sQ0FJM0QsU0FBQThILEdBQ0UsTUFBTTJrQyxHQUFhLFNBQ25CcDBDLEtBQUs2dkIsR0FBS3VrQixFQUFXdmtCLEdBQUdsdkIsS0FBS1gsS0FDL0IsQ0FFQSxnQkFBQXN5QyxDQUFpQmgwQyxHQUNmLE9BQU8sSUFBQXNCLE1BQUtJLEtBQUtxMEMsZ0JBQWlCLzFDLEVBQ3BDLENBRUEsbUJBQUkrMUMsR0FDRixNQUFPLENBQ0wsU0FDQSxpQkFDQSxZQUNBLFNBQ0EsUUFDQSxRQUNBLE1BQ0EsUUFDQSxpQkFDQSxlQUNBLFlBQ0EsV0FDQSxVQUNBLFNBQ0EsV0FDQSxZQUNBLFVBQ0EsVUFDQSxPQUNBLFFBQ0EsT0FDQSxXQUNBLFFBQ0EsT0FDQSxVQUNBLFVBQ0Esa0JBQ0EsY0FDQSxXQUNBLFNBQ0EsY0FDQSxNQUNBLFVBQ0EsV0FDQSxXQUNBLFVBQ0EsUUFDQSxNQUNBLFVBQ0EsV0FDQSxXQUNBLFlBQ0EsV0FDQSxVQUNBLE1BQ0EsT0FDQSxhQUNBLFVBQ0EsU0FDQSxTQUNBLE9BQ0EsT0FDQSxXQUNBLGFBQ0EsT0FDQSxLQUNBLGFBQ0EsWUFDQSxRQUNBLFdBQ0EsVUFDQSxPQUNBLFFBQ0EsT0FDQSxXQUNBLFdBQ0EsT0FDQSxPQUNBLE1BQ0EsV0FDQSxNQUNBLFlBQ0EsWUFDQSxRQUNBLFNBQ0EsTUFDQSxXQUNBLFFBQ0EsT0FDQSxhQUNBLE9BQ0EsVUFDQSxVQUNBLE9BQ0EsY0FDQSxTQUNBLFVBQ0EsYUFDQSxXQUNBLGlCQUNBLE1BQ0EsV0FDQSxXQUNBLE9BQ0EsVUFDQSxVQUNBLFFBQ0EsU0FDQSxXQUNBLFFBQ0EsT0FDQSxRQUNBLE9BQ0EsT0FDQSxhQUNBLE1BQ0EsU0FDQSxVQUNBLFNBQ0EsUUFDQSxPQUNBLFFBQ0EsVUFDQSxXQUNBLFNBQ0EsUUFDQSxZQUNBLE9BQ0EsU0FDQSxRQUNBLFFBQ0EsT0FFSixFLHVGQy9URixNQUFNQyxHQUF5QyxJQUE3QixJQUFtQnp4QyxNQUU5QixNQUFNMHhDLEVBV1gsV0FBQW4yQyxDQUFZRSxFQUFPazJDLEdBQ2pCeDBDLEtBQUt5UCxZQUNMelAsS0FBSzFCLE1BQVFBLEVBQ2IwQixLQUFLdzBDLFlBQWNBLEVBQ25CeDBDLEtBQUt5MEMsWUFBWXowQyxLQUFLdzBDLFlBQ3hCLENBRUEsY0FBQUUsQ0FBZXRMLEdBVWIsT0FUa0IsSUFBQTN1QixXQUFVMnVCLEVBQUcsWUFFTDNnQyxNQUN4QixJQUFBL0osS0FBSXdkLElBQ0YsTUFBTXZVLEdBQU8sSUFBQW5FLE9BQU0wWSxHQUduQixPQURBdlUsRUFBS2d0QyxhQUFlLFdBQ2JodEMsSUFHYixDQUtBLFNBQUFpdEMsQ0FBVWpMLEdBQ1IsR0FBSUEsRUFBS2xxQyxRQUFVLElBQW1CLElBQWQ2MEMsRUFFdEIsWUFEQXowQyxRQUFRQyxLQUFLLHNDQUFzQ0UsS0FBSzFCLE1BQU1ELHdEQUFxRDJCLEtBQUsxQixNQUFNNHhCLFNBSWhJLE1BQU0ya0IsRUFBa0IsQ0FDdEJDLEdBQUk5MEMsS0FBSzJ3QixjQUNUeGUsTUFBT25TLEtBQUswd0IsbUJBR1B4RixFQUFVM29CLEVBQU93eUMsR0FBU3BMLEVBRWpDLElBQUlsbkMsRUFDQWs5QixFQUFRMy9CLEtBQUsxQixNQUFNd1ksR0FBR2srQixpQkFBaUI5cEIsR0FFM0MsR0FBSXlVLEVBQU1sZ0MsUUFBVSxFQUFHLENBQ3JCLE1BQU1xWCxFQUFLOVcsS0FBSzFCLE1BQU13WSxHQUNoQm0rQixFQUFrQnYyQixJQUNsQkEsSUFBWTVILElBQ2Q2b0IsRUFBUSxDQUFDamhCLEtBSWEsTUFDeEIsTUFDTXcyQixHQURnQyxPQUFyQnArQixFQUFHcStCLGNBQXlCcitCLEVBQUdxK0IsY0FBZ0J6NkIsVUFDcENzNkIsaUJBQWlCOXBCLEdBQzdDZ3FCLEVBQVc5dUMsUUFBVXJCLE1BQU1oQyxVQUFVcUQsUUFDckM4dUMsRUFBVzl1QyxRQUFRNnVDLElBR3JCRyxFQUNGLENBRUEsTUFBTUMsT0FBeUI1MkMsSUFBVnMyQyxHQTBDRixTQURVdDJDLElBQVZraEMsR0FBdUJBLEVBQU1sZ0MsUUFBVSxLQUNqQixJQUFkNjBDLEVBQ3pCejBDLFFBQVFDLEtBQUssMkJBQTJCb3JCLGtDQUF5Q2xyQixLQUFLMUIsTUFBTUQsb0JBQWlCMkIsS0FBSzFCLE1BQU00eEIsVUFJeEh5UCxFQUFNdjVCLFFBQVVyQixNQUFNaEMsVUFBVXFELFFBQ2hDdTVCLEVBQU12NUIsUUEvQ2VnakMsSUFFckIsTUFBTXg5QixFQUF1QixhQUFWckosR0FDZixJQUFBa1ksV0FBVTJ1QixFQUFHN21DLEVBQU8sQ0FBRSt5QyxlQUFnQixLQUFNLElBQzVDdDFDLEtBQUswMEMsZUFBZXRMLEdBRXhCM21DLEVBQVUybUMsRUFBRXJ5QixRQUFRdFUsUUFDcEIsTUFBTWtGLEVBQU8sQ0FBQyxFQW1CZCxJQUF5QjR0QyxFQWxCekI1dEMsRUFBS3JHLFNBQVUsUUFBeUI4bkMsRUFBRXJ5QixTQUMxQ3BQLEVBQUtyRyxTQUFVLElBQUFvUyxNQUFLLENBQUMsV0FBWS9MLEVBQUtyRyxTQUNqQixVQUFqQnFHLEVBQUtsRixVQUNQa0YsRUFBS3JHLFFBQVFrMEMsbUJBQW9CLEdBR25DN3RDLEVBQUtsRixRQUFVQSxFQUdma0YsRUFBS25HLFdBQWEsQ0FBQyxFQUNuQm1HLEVBQUtuRyxXQUFXc2lCLEdBQUs5akIsS0FBSzFCLE1BQU13bEIsR0FDaENuYyxFQUFLbkcsV0FBVzB1QixLQUFPbHdCLEtBQUsxQixNQUFNNHhCLEtBQ2xDdm9CLEVBQUtuRyxXQUFXNnpDLGFBQWVBLEVBRS9CMXRDLEVBQUtuRyxXQUFXaTBDLFNBQVdsekMsRUFDM0JvRixFQUFLbkcsV0FBV3NWLEdBQUtzeUIsR0FlckIzdkIsRUFGdUJvN0IsRUFWRVUsRUFVOEI5eUMsRUFUMUMsVUFBUDh5QyxHQUF5QixrQkFBUEEsRUFDYixTQUVFLE9BQVBBLEdBQXNCLGVBQVBBLFFBQThCOTJDLElBQVA4MkMsR0FDeEMxMUMsUUFBUUMsS0FBSyxpQ0FBaUN5MUMsNkZBRXpDLFFBS00zcEMsRUFBWWpFLEtBVy9CLENBRUEsV0FBQThzQyxDQUFZaUIsR0FDV0EsSUFDUnR2QyxRQUFRdWpDLEdBQVEzcEMsS0FBSzQwQyxVQUFVakwsR0FDOUMsQ0FHQSxTQUFBbDZCLEdBSUUsTUFBTWttQyxHQUFlLFNBQ3JCMzFDLEtBQUsyd0IsY0FBZ0JnbEIsRUFBYWhsQixjQUNsQzN3QixLQUFLMHdCLGlCQUFtQmlsQixFQUFhamxCLGdCQUN2QyxFLHdGQ3RJSyxNQUFNa2xCLEVBY1gsV0FBQXgzQyxDQUFZeTNDLEVBQU9DLEVBQVksQ0FBQyxFQUFHNWxCLEVBQU8sR0FBSTZsQixFQUFTLFdBQ3JELzFDLEtBQUt5UCxZQUNMelAsS0FBS2cyQyxPQUFTLE9BQ2RoMkMsS0FBS2t3QixLQUFPQSxFQUNabHdCLEtBQUs4VyxHQUFLZy9CLEVBQVVoL0IsR0FDcEI5VyxLQUFLKzFDLE9BQVNBLEVBQ2QvMUMsS0FBS3VyQyxTQUFXLENBQ2Qxb0MsT0FBTSxFQUNOb3pDLG9CQUFxQixDQUFDLEdBRXhCajJDLEtBQUtRLFNBQVUsT0FBVVIsS0FBS3VyQyxTQUFVdUssR0FLeEM5MUMsS0FBS2syQyxxQkFBcUI5dkMsUUFKTzVHLElBQy9CLE1BQU8yQixFQUFRZzFDLEdBQVczMkMsRUFDMUJRLEtBQUtRLFFBQVF5MUMsb0JBQW9COTBDLEdBQVcrYSxHQUFNbGMsS0FBS20yQyxHQUFTajZCLEtBR2xFbGMsS0FBS1EsUUFBUTQxQyxZQUFjcDJDLEtBQUtxMkMsZUFBZXIyQyxLQUFLUSxRQUFReTFDLHFCQUM1RGoyQyxLQUFLNjFDLE1BQVFBLEVBQ2I3MUMsS0FBSzYxQyxNQUNGbHRDLFVBQVUzSSxLQUFLczJDLG1CQUFtQjMxQyxLQUFLWCxPQUUxQ0EsS0FBS3UyQyxNQUFRLElBQXFCNUwsaUNBQ2xDM3FDLEtBQUtxckMsY0FBZ0IsSUFBcUJBLGNBQzFDcnJDLEtBQUt3MkMsY0FBZ0IsSUFBcUI5TCw2QkFBNkIsSUFBSSxFQUFBN2pDLFFBQVc3RyxLQUFLKzFDLE9BQVEvMUMsS0FBS2t3QixNQUN4R2x3QixLQUFLeTJDLFNBQVd6MkMsS0FBS3cyQyxjQUFjL0osV0FDckMsQ0FFQSxrQkFBQXlKLEdBQ0UsTUFBTyxFQUNULENBRUEsY0FBQUcsQ0FBZUssRUFBeUIsQ0FBQyxHQUN2QyxNQUFNQyxFQUFxQixDQUN6QkMsb0JBQXNDMTZCLEdBQU1sYyxLQUFLNjJDLGlCQUFpQjM2QixHQUNsRTQ2Qiw4QkFBbUQ1NkIsR0FBTWxjLEtBQUsrMkMsYUFBYTc2QixHQUMzRTg2QixVQUFvQzk2QixHQUFNbGMsS0FBS2kzQyxVQUFVLzZCLEdBQ3pEZzdCLFNBQW9DaDdCLEdBQU1sYyxLQUFLOGtCLFNBQVM1SSxHQUN4RGk3Qiw4QkFBb0NqN0IsR0FBTWxjLEtBQUtvM0MsMEJBQTBCbDdCLEdBQ3pFbTdCLDJCQUFvQ243QixHQUFNbGMsS0FBS3MzQyx1QkFBdUJwN0IsR0FDdEVxN0IscUJBQWtDcjdCLEdBQU1sYyxLQUFLdzNDLG9CQUFvQnQ3QixJQUVuRSxPQUFPLE9BQVV5NkIsRUFBb0JELEVBQ3ZDLENBRUEsYUFBQWUsR0FDRXozQyxLQUFLMUIsV0FBdUJHLElBQWZ1QixLQUFLMUIsTUFBc0IwQixLQUFLMUIsTUFBUSxDQUFDLEVBQ3RELE1BQ01pMEMsR0FBUSxJQUFBN3BDLFFBRE92SixRQUFnQlYsSUFBUlUsR0FDSyxJQUFBUyxNQUFLLENBQUMsS0FBTSxhQUFjSSxLQUFLMUIsU0FDM0QsUUFBRSsxQixFQUFPLEtBQUUxc0IsRUFBSSxTQUFFMGxDLEdBQWFydEMsS0FBSzFCLE1BQ3pDLE9BQU8sSUFBSSxJQUFXKzFCLEVBQVNrZSxFQUFPNXFDLEVBQU0wbEMsRUFDOUMsQ0FFQSxrQkFBQXFLLENBQW1CL3JDLEdBRW5CLENBRUEsY0FBQWdzQyxDQUFlN2dDLEVBQUlwVSxJQUNqQixPQUFPb1UsRUFBSXBVLEVBQ2IsQ0FFQSxlQUFBazFDLENBQWdCOWdDLEVBQUlwVSxFQUFNNm5DLElBRXhCLE9BQVF6ekIsRUFBSXBVLEVBQU02bkMsRUFDcEIsQ0FFQSxZQUFBc04sQ0FBYWxzQyxHQUNYLElBQW9CLElBQWhCQSxFQUFFbXNDLFVBQW9CLENBQ3hCLE1BQU1oaEMsT0FBY3JZLElBQVRrTixFQUFFbUwsR0FBbUJuTCxFQUFFbUwsR0FBSzlXLEtBQUsrM0MsUUFBUWpoQyxHQUNwRDlXLEtBQUsyM0MsZUFBZTdnQyxFQUFJbkwsRUFBRXFzQyxjQUM1QixDQUNGLENBUUEsYUFBQUMsQ0FBY3RzQyxHQUNaLE1BQU1tTCxPQUFpQnJZLElBQVprTixFQUFFbUwsR0FBR0EsR0FBbUJuTCxFQUFFbUwsR0FBR0EsR0FBS25MLEVBQUVtTCxHQUV6Q29oQyxFQUFTLENBQUUvMkMsT0FBTyxnQ0FBaUMwQyxLQUFLN0QsS0FBS3UyQyxNQUFNcEwsR0FBSXIwQixNQU12RXFoQyxHQUFhLElBQUFDLGNBSkEsQ0FBQ3pzQyxFQUFHNCtCLEtBQ3JCdnFDLEtBQUs0M0MsZ0JBQWdCOWdDLEVBQUluTCxFQUFFMHNDLGVBQWdCOU4sS0FJdkMrTixFQUFzQjl4QyxJQUMxQnhHLEtBQUt5MkMsU0FBU3ZxQyxLQUFLZ3NDLElBU2Y1c0MsR0FBc0IsSUFBakJLLEVBQUU0c0MsV0FOUzVzQyxJQUNwQndzQyxFQUFXeHNDLEdBQ1JoRCxVQUFVMnZDLEdBQ04sQ0FBRW4zQyxPQUFPLGNBQWUwQyxLQUFLN0QsS0FBS3UyQyxNQUFNckwsS0FFOUIsS0FBTSxDQUFHL3BDLE9BQU8sOENBQStDMEMsS0FBSzdELEtBQUt1MkMsTUFBTXJMLEtBRWxHLE9BQU81L0IsRUFBR0ssRUFDWixDQUVBLFNBQUFzckMsQ0FBVXRyQyxHQUNSLE9BQU8zTCxLQUFLaTRDLGNBQWN0c0MsRUFDNUIsQ0FFQSxZQUFBNnNDLFFBRTZCLzVDLElBQXZCdUIsS0FBS3cyQyxlQUNQeDJDLEtBQUt3MkMsY0FBY3JKLGVBQWUsQ0FBQyxXQUFZLFNBRW5ELENBRUEsWUFBQTRKLENBQWE3NkIsR0FDWGxjLEtBQUt3NEMsY0FDUCxDQUVBLGdCQUFBM0IsQ0FBaUIzNkIsUUFDTXpkLElBQWpCdUIsS0FBSyszQyxTQUNQLzNDLEtBQUsrM0MsUUFBUXJFLGVBR1lqMUMsSUFBdkJ1QixLQUFLdzJDLGVBQ1B4MkMsS0FBS3cyQyxjQUFjckosZUFBZSxDQUFDLFVBSXZDLENBRUEsZUFBQXNMLEdBQ0UsT0FBT3o0QyxLQUFLeTJDLFFBQ2QsQ0FFQSxlQUFBaUMsQ0FBZ0Ivc0MsR0FDZCxRQUFnQmxOLElBQVp1QixLQUFLOFcsR0FDUCxPQUdGLE1BQU02aEMsR0FBYSxJQUFBejVDLE9BQU15TSxFQUFFZzBCLE9BQVNoMEIsRUFBRXlzQixLQUFPenNCLEVBQUVnMEIsT0FNeEIsQ0FDckJuYSxZQUxhLENBQUM0UyxFQUFNenJCLElBQVN5ckIsRUFBSzVTLFlBQVk3WSxHQU05Q2lzQyxNQUxZLENBQUN4Z0IsRUFBTXpyQixJQUFTeXJCLEVBQUt3Z0IsTUFBTWpzQyxJQVVQaEIsRUFBRWt0QyxhQVpwQixFQUFDemdCLEVBQU16ckIsSUFBU3lyQixFQUFLMGdCLGFBQWFuc0MsRUFBTXlyQixFQUFLMmdCLGNBYWxESixFQUFXMzRDLEtBQUsrM0MsUUFBUXR5QixVQUNuQ3psQixLQUFLNjNDLGFBQWFsc0MsRUFDcEIsQ0FRQSxtQkFBQTZyQyxDQUFvQnQ3QixHQUNsQixNQUFNdlUsRUFBT3VVLEVBQUU4OEIsZ0JBRWYsT0FEQWg1QyxLQUFLMDRDLGdCQUFnQi93QyxHQUNkLENBQ0x4RyxPQUFRLGlCQUNSMEMsS0FBTTdELEtBQUt1MkMsTUFBTXBMLEdBRXJCLENBT0EseUJBQUFpTSxDQUEwQnpyQyxHQUd4QixPQUZBM0wsS0FBSzhrQixTQUFTblosR0FDZDNMLEtBQUswNEMsZ0JBQWdCL3NDLEdBQ2QsQ0FDTHhLLE9BQVEsb0NBQ1IyVixHQUFJOVcsS0FBSzhXLElBQU05VyxLQUFLKzNDLFFBQVFqaEMsR0FDNUJqVCxLQUFNN0QsS0FBS3UyQyxNQUFNcEwsR0FFckIsQ0FFQSxhQUFBOE4sQ0FBY3R0QyxHQUNaLE1BQU8wb0IsRUFBU2dlLEVBQVkxcUMsRUFBTTBsQyxHQUFZMWhDLEVBRTlDLE9BREEzTCxLQUFLKzNDLFFBQVUsSUFBSSxJQUFXLENBQUUxakIsVUFBU2dlLGFBQVkxcUMsT0FBTTBsQyxhQUNwRHJ0QyxLQUFLKzNDLE9BQ2QsQ0FFQSxRQUFBanpCLENBQVNuWixHQUdQLE1BQU8sQ0FDTHhLLE9BQVEsYUFDUjJWLEdBSFM5VyxLQUFLOFcsSUFERixDQUFDblAsR0FBUzNILEtBQUtpNUMsY0FBY3R4QyxHQUNyQnV4QyxFQUFNLElBQUE1NkMsT0FBTSxDQUFDLFVBQVcsZ0JBQWlCLE9BQVEsWUFBYXFOLElBSWxGOUgsS0FBTTdELEtBQUt1MkMsTUFBTTRDLEVBRXJCLENBRUEsZUFBQUMsQ0FBZ0J6eEMsR0FDaEIsQ0FRQSxzQkFBQTJ2QyxDQUF1QjNyQyxHQUlyQixPQUZBQSxFQUFFMHRDLFdBQVd2aUMsR0FEQyxDQUFDblAsR0FBUzNILEtBQUtpNUMsY0FBY3R4QyxHQUN6QnV4QyxFQUFNLElBQUE1NkMsT0FBTSxDQUFDLFVBQVcsZ0JBQWlCLE9BQVEsWUFBYXFOLElBQ2hGM0wsS0FBSzA0QyxnQkFBZ0Ivc0MsRUFBRTB0QyxZQUNoQixDQUNMbDRDLE9BQVEsaUNBQ1IyVixHQUFNOVcsS0FBSzhXLElBQU1uTCxFQUFFMHRDLFdBQVd2aUMsR0FBR0EsR0FDakNqVCxLQUFNN0QsS0FBS3UyQyxNQUFNckwsR0FFckIsQ0FRQSxrQkFBQW9MLENBQW1CaDFDLEdBQ2pCLE1BQU1ILEVBQVNHLEVBQVFILE9BQ2pCbTRDLEdBQWMsSUFBQWo1QyxXQUFXc0gsR0FBUzNILEtBQUtvNUMsZ0JBQWdCenhDLElBRXZEQSxFQURLMnhDLEVBQVl0NUMsS0FBS1EsUUFBUTQxQyxZQUFZajFDLEdBQ25DbUssQ0FBR2hLLFFBRUg3QyxJQUFUa0osR0FEYSxDQUFDZ0UsSUFBTTNMLEtBQUt5MkMsU0FBU3ZxQyxLQUFLUCxJQUV6QzR0QyxDQUFTejJDLE9BQU95RCxPQUFPb0IsR0FFM0IsQ0FFQSxTQUFBOEgsR0FLQSxFLHFFQzlQSyxNQUFNK3BDLEVBZVgsV0FBQXA3QyxDQUFZQyxFQUFNdU4sRUFBWWpFLEVBQU14RyxFQUFTLFlBQWEwQixHQUFRLEdBRWhFLE1BQU1yQyxFQUFVLENBQ2RuQyxPQUNBdU4sYUFDQWpFLE9BQ0F4RyxVQUVGbkIsS0FBS3k1QyxxQkFBcUJqNUMsRUFDNUIsQ0FFQSxvQkFBQWk1QyxDQUFxQm40QyxHQUNuQixNQUFNbzRDLEVBQWtCLElBQW1CeHhDLFlBQVlJLFVBQVUsY0FDM0RxeEMsR0FBZ0IsUUFBVXI0QyxHQUVoQ280QyxFQUFnQnh0QyxLQUFLeXRDLEdBQ3JCcjRDLE9BQVU3QyxDQUdaLENBRUEsZ0JBQU9rRyxDQUFVQyxHQUNmLE1BQU1DLEdBQVEsSUFBQUMsSUFBR0MsT0FDWEMsR0FBUSxJQUFBRixJQUFHaEMsUUFDRm1DLE1BRWYsT0FGbUMsSUFBZEosRUFBTkksRUFDV0wsS0FEZ0MsSUFBZEksRUFBTUMsSUFFOUIsSUFBQXZGLFNBQVEsRUFBQXdGLFVBQVcsRUFBQUMsUUFBUyxFQUFBM0IsTUFBNUIsQ0FBbUNvQixJQUFLLElBQUFwQixPQUFNb0IsRUFDcEUsQ0FFQSx3QkFBTzZCLEdBQ0wsTUFBTyxDQUFDLFNBQVUsVUFBVyxlQUFnQixhQUFjLFVBQVcsVUFBVyxXQUFZLFVBQVcsZ0JBQWlCLG1CQUFvQixTQUFVLGFBQWMsY0FBZSxZQUFhLFNBQVUsU0FBVSxVQUFXLFlBQWEsWUFBYSxVQUFXLFVBQVcsUUFBUyxRQUFTLE9BQVEsZ0JBQWlCLGNBQWUsVUFBVyxVQUFXLFdBQVkscUJBQXNCLGFBQWMsU0FBVSxZQUFhLFlBQWEsT0FBUSxPQUFRLFFBQVMsSUFBSyxJQUNwZCxDQUVBLFNBQUFnSixHQUNFelAsS0FBSzZ2QixHQUFLLEVBQUFBLEVBQ1osRSw2REM5Q0YsU0FBU3lrQixJQUNQLE9BQW9DLElBQTdCLElBQW1CenhDLEtBQzVCLENBT0EsU0FBUysyQyxFQUFZL29CLEVBQUsxRCxFQUFLMHNCLEdBQWMsR0FDM0MsTUFBTUMsRUFBT0MsRUFBaUJscEIsRUFBSzFELEVBQUswc0IsR0FDeEMsT0FBdUIsSUFBaEJDLEVBQUtyNkMsUUFBZSxJQUFBeUssTUFBSzR2QyxHQUFRQSxDQUMxQyxDQUVBLFNBQVNFLEVBQWNucEIsRUFBSzFELEVBQUswc0IsR0FDL0IsTUFBTS9pQyxFQUFLNEQsU0FBUzZTLGNBQWNzRCxHQUU1QjdxQixHQUFpQixJQUFBdEcsVUFBUSxJQUFBdUcsS0FBSSxJQUFJLElBQUE1RixZQUFXLElBQUksSUFBQTZGLE1BQUssYUFFM0QsR0FBVyxPQUFQNFEsSUFBc0MsSUFBdkI5USxFQUFlOFEsSUFLbEMsUUFBWXJZLElBQVIwdUIsR0FBcUIxbkIsT0FBTzBuQixHQUFLbEUsT0FBT3hwQixPQUFTLEVBQUcsQ0FDdEQsU0FBU3c2QyxFQUFnQi91QixHQUN2QixJQUVFLE9BRGlCeFEsU0FBU3M2QixpQkFBaUI5cEIsR0FDM0J6ckIsT0FBUyxDQUMzQixDQUFFLE1BQU8rRyxHQUNQLE9BQU8sQ0FDVCxDQUNGLENBRUEsTUFBTTB6QyxFQUFzQkQsRUFBZ0I5c0IsSUFDeEIsSUFBaEIwc0IsSUFBd0MsSUFBaEJ2RixNQUFnRCxJQUF4QjRGLElBQ2xELE9BQVUsZ0NBQWdDL3NCLGdDQUFrQzBELElBRWhGLE9BbEJFLE9BQVUsK0RBQStEL1osSUFtQjdFLENBRUEsU0FBU2lqQyxFQUFpQmxwQixFQUFLMUQsRUFBSzBzQixHQUFjLEdBRWhELElBQUlNLEdBQVcsRUFFZixNQWdCTWpJLEVBaEJ3QixDQUFDaG5CLElBQzdCLElBQUkxckIsRUFBTSxHQUNWLElBQ0VBLEVBQU1rYixTQUFTczZCLGlCQUFpQjlwQixFQUNsQyxDQUFFLE1BQU8xa0IsR0FBS2hILEVBQU0sRUFBRyxDQUN2QixJQUNFMjZDLEVBQVd6L0IsU0FBUzZTLGNBQWNKLEtBQVN6UyxTQUFTNlMsY0FBY3NELElBQ2pELElBQWJzcEIsSUFDRjM2QyxFQUFNLENBQUNrYixTQUFTNlMsY0FBY0osSUFFbEMsQ0FBRSxNQUFPM21CLEdBRVQsQ0FDQSxPQUFPaEgsR0FHTTQ2QyxNQW5CVTM3QyxJQUFSMHVCLEVBQW9CLEdBQUcwRCxLQUFPMUQsSUFBUTBELEdBMEJ2RCxPQUxvQixJQUFoQmdwQixHQUVGRyxHQUQ2QixJQUFiRyxFQUFvQixPQUFTdHBCLEVBQ3RCMUQsRUFBSzBzQixHQUd2QjNILENBQ1QsQ0FFQSxTQUFTbUksRUFBYWw3QyxFQUFLMHhCLEVBQUsxRCxHQU05QixPQUxZNHNCLEVBQWlCbHBCLEVBQUsxRCxHQUk5Qi9tQixRQUhpQnVHLElBQ25CQSxFQUFLc1gsTUFBTUMsUUFBVS9rQixJQUdoQmEsSUFDVCxDQWFBLFNBQVNzNkMsRUFBbUJ6cEIsRUFBSzFELEdBSS9CLFNBQVNqQyxFQUFTaUMsR0FDaEIsT0FBT210QixFQUFtQnpwQixFQUFLMUQsRUFDakMsQ0FKQTZzQixFQURBbnBCLEVBQXVCLGlCQUFWLEVBQXFCQSxFQXZHcEMsU0FBaUMvWixHQUUvQixJQUFJb1osRUFBTyxHQURPaFIsS0FBS21SLFNBQVMxQyxTQUFTLElBQUlyWSxRQUFRLE9BQVEsSUFBSWdiLFVBQVUsRUFBRyxLQU85RSxZQUx3Qjd4QixJQUFwQnFZLEVBQUdDLFFBQVFtWixLQUNicFosRUFBR0MsUUFBUW1aLEtBQU9BLEVBRWxCQSxFQUFPcFosRUFBR0MsUUFBUW1aLEtBRWIsZUFBZUEsS0FDeEIsQ0E4RjBDcXFCLENBQXdCMXBCLEdBQzdDMUQsR0FBSyxHQVl4QmpDLEVBQVN4c0IsSUFBTzRNLEdBQU92RyxNQUFNNEssS0FBS29xQyxFQUFpQmxwQixFQUFLMUQsSUFBTXp1QixJQUFJNE0sR0FRbEU0ZixFQUFTOWtCLFFBQVdrRixHQUFPdkcsTUFBTTRLLEtBQUtvcUMsRUFBaUJscEIsRUFBSzFELElBQU16dUIsSUFBSTRNLEdBV3RFNGYsRUFBU3N2QixTQUFZbnVDLElBQ1AwdEMsRUFBaUJscEIsRUFBSzFELEdBRTlCL21CLFFBRGF1RyxHQUFRQSxFQUFLOHRDLFVBQVU5bkIsSUFBSXRtQixJQUVyQzZlLEdBUVRBLEVBQVN3dkIsWUFBZXJ1QyxJQUNWMHRDLEVBQWlCbHBCLEVBQUsxRCxHQUk5Qi9tQixRQUhnQnVHLElBQ2xCQSxFQUFLOHRDLFVBQVU5RyxPQUFPdG5DLEtBR2pCNmUsR0FRVEEsRUFBU3l2QixTQUFZdHVDLElBQ1AwdEMsRUFBaUJscEIsRUFBSzFELEdBZTlCL21CLFFBUmdCdUcsSUFDbEIsTUFBTWl1QyxHQUFvQixJQUFBbDdDLFVBQVEsSUFBQW1DLFFBQU8sRUFBQTRILFVBQVUsSUFBQTB0QixPQUFNLEtBQS9CLENBQXFDeHFCLEVBQUtrdUMsV0FDOURDLEVBQWN6dUMsRUFBRThxQixNQUFNLEtBRzVCeWpCLEVBQWtCeDBDLFFBRkZ5b0IsR0FBS2xpQixFQUFLOHRDLFVBQVU5RyxPQUFPOWtCLElBRzNDaXNCLEVBQVkxMEMsUUFGRSttQixHQUFPeGdCLEVBQUs4dEMsVUFBVTluQixJQUFJeEYsTUFLbkNqQyxHQUdUQSxFQUFTd29CLFFBQVUsT0FjbkJ4b0IsRUFBUzZ2QixZQUFjLENBQUMxdUMsRUFBR3ZDLEtBQ2Jpd0MsRUFBaUJscEIsRUFBSzFELEdBSzlCL21CLFFBSmdCdUcsS0FDbEI3QyxPQUFnQnJMLElBQVRxTCxFQUFxQkEsR0FBUTZDLEVBQUs4dEMsVUFBVU8sU0FBUzN1QyxJQUNyRE0sRUFBSzh0QyxVQUFVOW5CLElBQUl0bUIsR0FBS00sRUFBSzh0QyxVQUFVOUcsT0FBT3RuQyxLQUdoRDZlLEdBR1RBLEVBQVMrdkIsT0FBUyxDQUFDNXVDLEVBQUd2QyxLQUNwQm9oQixFQUFTNnZCLFlBQVkxdUMsRUFBR3ZDLEdBQ2pCb2hCLEdBUVRBLEVBQVMxRixZQUFlMDFCLElBQ3RCLE1BQU1wa0MsRUFBS29VLEVBQVNwVSxHQU9wQixPQU5XLE9BQVBBLEVBQ0ZBLEVBQUcwTyxZQUFZMDFCLElBRWYsT0FBVSxnQ0FBZ0MvdEIsa0NBR3JDakMsRUFBU3BVLElBUWxCb1UsRUFBU2l3QixhQUFnQjl1QyxJQVd2Qm9pQixzQkFWc0IsS0FDUnNyQixFQUFpQmxwQixFQUFLMUQsR0FPOUIvbUIsUUFOYXVHLElBQ2YsSUFDRUEsRUFBSzh0QyxVQUFVOW5CLElBQUl0bUIsRUFDckIsQ0FBRSxNQUFPN0YsR0FDVCxNQUtHMGtCLEdBU1RBLEVBQVNrd0IsY0FBZ0IsQ0FBQy91QyxFQUFHZ3ZDLEtBQzNCLE1BQU03N0MsRUFBTXU2QyxFQUFpQmxwQixFQUFLMUQsR0FDNUJtdUIsRUFBNkIsaUJBQVZELEVBQ3JCekIsRUFBWS9vQixFQUFLd3FCLEdBQ2pCQSxFQUlKLEdBRkE3N0MsRUFBSTRHLFFBQVF1RyxHQUFRQSxFQUFLOHRDLFVBQVU5RyxPQUFPdG5DLEtBRVQsS0FyUGR5SyxFQXFQRHdrQyxHQXBQRixJQUFBNTdDLFVBQVEsSUFBQXVHLEtBQUksSUFBSSxJQUFBNUYsWUFBVyxJQUFJLElBQUE2RixNQUFLLFlBQy9DcTFDLENBQVV6a0MsSUFtUHdCLENBQ3JDLE1BQU0wa0MsRUFBYXoyQyxNQUFNNEssS0FBS25RLEdBQUs4VyxLQUFLM0osR0FBUUEsSUFBUzJ1QyxHQUVyREUsRUFDRkEsRUFBV2YsVUFBVTluQixJQUFJdG1CLElBQ0EsSUFBaEJpb0MsTUFDVCxPQUNFLGdDQUFnQytHLDZEQUFpRWh2QyxJQUd2RyxNQUEyQixJQUFoQmlvQyxNQUNULE9BQ0UsZ0NBQWdDK0csMkRBQStEaHZDLEtBalF2RyxJQUF1QnlLLEVBcVFuQixPQUFPb1UsR0FrRFQsTUFBTXV3QixFQUFjLENBQUM1QixHQUFjLElBQVM5MEMsTUFBTTRLLEtBQUtvcUMsRUFBaUJscEIsRUFBSzFELEVBQUswc0IsSUF5QmxGLE9BdkJBLzJDLE9BQU9nRCxlQUFlb2xCLEVBQVUsS0FBTSxDQUNwQ3BuQixJQUFLLEtBQ0gsTUFBTWcyQyxFQUFPMkIsSUFJYixPQUhJM0IsRUFBS3I2QyxPQUFTLElBQXFCLElBQWhCNjBDLE1BQ3JCLE9BQVUsNEJBQStCNzFDLElBQVIwdUIsRUFBb0JBLEVBQU0wRCxrQkFBb0JpcEIsRUFBS3I2QyxxRUFFL0VxNkMsRUFBS3I2QyxRQUFVLEVBQUlxNkMsRUFBSyxHQUFLLFFBR3hDaDNDLE9BQU9nRCxlQUFlb2xCLEVBQVUsTUFBTyxDQUFFcG5CLElBQUssSUFBTTIzQyxNQUNwRDM0QyxPQUFPZ0QsZUFBZW9sQixFQUFVLE1BQU8sQ0FBRXBuQixJQUFLLElBQU0yM0MsTUFLcEQzNEMsT0FBT2dELGVBQWVvbEIsRUFBVSxXQUFZLENBQUVwbkIsSUFBSyxJQUFNODFDLEVBQVkvb0IsRUFBSzFELEdBQUssS0FDL0VycUIsT0FBT2dELGVBQWVvbEIsRUFBVSxNQUFPLENBQUVwbkIsSUFBSyxJQUFNaTJDLEVBQWlCbHBCLEVBQUsxRCxHQUFLLEdBQU8xdEIsU0FDdEZxRCxPQUFPZ0QsZUFBZW9sQixFQUFVLFNBQVUsQ0FBRXBuQixJQUFLLElBQU1pMkMsRUFBaUJscEIsRUFBSzFELEdBQUssR0FBTzF0QixTQUN6RnFELE9BQU9nRCxlQUFlb2xCLEVBQVUsU0FBVSxDQUFFcG5CLElBQUssSUFBTWkyQyxFQUFpQmxwQixFQUFLMUQsR0FBSyxHQUFPMXRCLFFBQVUsSUFFbkdxRCxPQUFPZ0QsZUFBZW9sQixFQUFVLFNBQVUsQ0FBRWxuQixJQUFNN0UsR0FBUWs3QyxFQUFhbDdDLEVBQUsweEIsRUFBSzFELEdBQU1ycEIsSUFBSyxJQUFNb25CLElBQ2xHcG9CLE9BQU9nRCxlQUFlb2xCLEVBQVUsWUFBYSxDQUFFbG5CLElBQU03RSxHQUFRazdDLEVBQWFsN0MsRUFBSzB4QixFQUFLMUQsR0FBTXJwQixJQUFLLElBQU1vbkIsSUFFOUZBLENBQ1QsQyx1S0NyVE8sTUFBTXd3QixFQVVYLFdBQUF0OUMsQ0FBWUUsRUFBUSxDQUFDLEdBQ25CMEIsS0FBSzI3QyxNQUFRejhCLEtBQUttUixTQUNsQnJ3QixLQUFLeVAsWUFDTHpQLEtBQUs0N0MsbUJBQW9CLEVBQ3pCNTdDLEtBQUt1ckMsU0FBVyxLQUNkLE1BQU1yYixFQUFPbHdCLEtBQUtvd0IsV0FDWnRNLEVBQUt4bEIsRUFBTXdsQixHQUFLeGxCLEVBQU13bEIsR0FBS29NLEVBQ2pDLE1BQU8sQ0FDTEEsT0FDQXBNLEtBQ0F1USxRQUFTLE1BQ1R2ZCxRQUFJclksRUFDSmtKLFVBQU1sSixFQUNOcTVDLFdBQVcsRUFDWEUsY0FBZSxHQUNmTyxZQUFZLEVBQ1pGLGVBQWdCLEdBQ2hCd0Qsb0JBQW9CLEVBQ3BCQyxPQUFRLElBQUloNEIsSUFDWmk0QixJQUFLLElBQUlqNEIsSUFDVGs0QixVQUFXLElBQ1hDLDJCQUE0QixDQUFDLEVBQzdCcDVDLE9BQU8sRUFDUHdxQyxjQUFVNXVDLEVBQ1YyNUIsS0FBTTFkLFNBQVNnNEIseUJBQ2ZyMEMsTUFBTSxRQUFtQjJCLFFBRzdCQSxLQUFLZzJDLE9BQVMsQ0FBQyxFQUNmaDJDLEtBQUt1MkMsTUFBUSxJQUFxQjVMLGlDQUNsQzNxQyxLQUFLazhDLG9CQUFzQixJQUFxQjdRLGNBQ2hEcnJDLEtBQUt3ckMsbUJBQXFCLElBQXFCQSxtQkFFL0N4ckMsS0FBSzFCLE9BQVEsT0FBVTBCLEtBQUt1ckMsV0FBWWp0QyxHQUN4QzBCLEtBQUttOEMscUJBQXdELElBQWxDbjhDLEtBQUsxQixNQUFNdTlDLG1CQUE4Qjc3QyxLQUFLbzhDLDBCQUEwQno3QyxLQUFLWCxNQUFRQSxLQUFLcThDLDRCQUE0QjE3QyxLQUFLWCxNQUN0SixNQUFNczhDLEVBQWdCdDhDLEtBQUtxMEMsZ0JBRTNCcjBDLEtBQUsxQixNQUFNaStDLGVBQWdCLElBQUEzOEMsTUFBSzA4QyxFQUFldDhDLEtBQUsxQixZQUMxQkcsSUFBdEJ1QixLQUFLMUIsTUFBTTZLLFFBQ2JuSixLQUFLcUosVUFBVXJKLEtBQUsxQixNQUFNNkssUUFFNUJuSixLQUFLdzhDLGlCQUNMeDhDLEtBQUsxQixNQUFNNkMsT0FBUyxTQUNwQm5CLEtBQUs2MUMsTUFBUSxJQUFJLEVBQUFodkMsUUFDakI3RyxLQUFLMUIsTUFBTW0rQyx3QkFBMEJ6OEMsS0FBSzA4QyxrQkFBa0IxOEMsS0FBSzFCLE9BQ2pFLE1BQU1xK0MsRUFBWTM4QyxLQUFLMUIsTUFBTTA5QyxVQUM3Qmg4QyxLQUFLNkssS0FBTyxJQUFJOHhDLEVBQVUzOEMsS0FBSzYxQyxNQUFPLENBQUUvK0IsR0FBRzlXLEtBQUsxQixNQUFNd1ksSUFBTTlXLEtBQUsxQixNQUFNNHhCLEtBQU1sd0IsS0FBSzFCLE1BQU13bEIsSUFDeEY5akIsS0FBS3cyQyxjQUFnQngyQyxLQUFLNkssS0FBSzJyQyxjQUMvQngyQyxLQUFLNDhDLFlBQWM1OEMsS0FBSzZLLEtBQUs0dEMsa0JBQzdCejRDLEtBQUs0OEMsWUFBWWpSLFNBQVczckMsS0FBSzFCLE1BQU1ELEtBQ3ZDMkIsS0FBSzY4QyxxQkFBdUI3OEMsS0FBSzg4Qyx1QkFDakM5OEMsS0FBSys4QyxpQkFDTC84QyxLQUFLczBDLFVBQVlvSCxFQUFXcEgsWUFDNUJ0MEMsS0FBSzFCLE1BQU0wK0MsY0FBZ0IsR0FDM0JoOUMsS0FBS2k5Qyw2QkFDUCxDQUdBLFdBQUlDLEdBQ0YsT0FBT2w5QyxLQUFLeTJDLFFBQ2QsQ0FFQSxtQkFBSXBDLEdBQ0YsTUFBTyxDQUVMLFlBQWEsUUFBUyxrQkFBbUIsTUFBTyxZQUFhLFNBQVUsS0FBTSxPQUFRLGFBQWMsUUFBUyxXQUFZLFFBQVMsWUFHakksb0JBQXFCLGVBQWdCLGdCQUFpQixnQkFBaUIsZ0JBQWlCLGNBQWUsZUFBZ0IsYUFBYyxhQUFjLGlCQUFrQix1QkFBd0IsbUJBQW9CLGVBQWdCLGdCQUFpQixnQkFBaUIsZ0JBQWlCLFlBQWEsZ0JBQWlCLGdCQUFpQixnQkFBaUIsaUJBQWtCLGNBQWUsWUFBYSxZQUFhLGdCQUFpQixrQkFBbUIsZUFBZ0Isd0JBQXlCLGdCQUFpQixtQkFBb0IsY0FBZSxrQkFBbUIsWUFBYSxnQkFBaUIsZUFHamtCLFNBQVUsZUFBZ0IsWUFBYSxVQUFXLFVBQVcsV0FBWSxPQUFRLGFBQ2pGLGNBQWUsYUFBYyxpQkFBa0IsYUFBYyxPQUFRLE1BQU8sWUFDNUUsTUFBTyxZQUFhLFdBQVksT0FBUSxVQUFXLGNBQWUsV0FBWSxXQUFZLE9BQVEsT0FBUSxRQUcxRyxNQUFPLFNBQVUsUUFBUyxTQUFVLFFBR3BDLE9BQVEsU0FBVSxXQUFZLE9BQVEsTUFBTyxXQUFZLEtBQU0sUUFHL0QsaUJBQWtCLFNBQVUsVUFBVyxhQUd2QyxVQUFXLFVBQVcsYUFHdEIsUUFBUyxRQUFTLFlBQWEsV0FBWSxRQUFTLGlCQUdwRCxpQkFBa0IsV0FBWSxXQUFZLFlBQWEsT0FBUSxPQUFRLFdBQVksUUFBUyxPQUFRLFVBQVcsY0FBZSxXQUFZLFNBQVUsY0FBZSxNQUFPLFVBQVcsV0FBWSxXQUFZLFVBQVcsTUFBTyxVQUFXLE9BQVEsT0FBUSxhQUFjLFdBQVksVUFBVyxPQUFRLFFBQVMsV0FBWSxXQUFZLE9BQVEsTUFBTyxXQUFZLFNBQVUsUUFBUyxPQUFRLFVBQVcsU0FBVSxVQUFXLGFBQWMsV0FBWSxPQUFRLE9BQVEsVUFBVyxVQUFXLFFBQVMsU0FBVSxXQUFZLFFBQVMsT0FBUSxPQUFRLFNBQVUsTUFBTyxPQUFRLFVBQVcsUUFBUyxVQUFXLE9BQVEsUUFBUyxTQUVubUIsQ0FFQSxnQkFBT0MsR0FDTCxPQUFPLElBQW1CenhDLEtBQzVCLENBRUEsa0NBQU9zNkMsQ0FBNEIzd0MsRUFBYyxHQUFJNHdDLEdBQ25ELEdBQUlBLEVBQVczOUMsT0FBUyxFQUFHLENBQ3pCLE1BS000OUMsRUFBaUJDLElBQ3JCLE1BQU14YSxFQUFLLElBQUl6c0IsT0FBT2luQyxHQUV0QixJQURvQixJQUFBQyxZQUFVLElBQUEzb0MsTUFBS2t1QixHQUFLMGEsR0FDdEIsRUFBRyxDQUNuQixNQUFNQyxFQUF1QyxJQUF2Qmp4QyxFQUFZL00sT0FBZSxxQkFBdUIsc0JBQ3hFSSxRQUFRQyxLQUFLLDhCQUE4Qnc5QyxTQUFnQnQ5QyxLQUFLMUIsTUFBTUQsc0RBQXNEby9DLE1BQWtCanhDLEVBQVlpRSxLQUFLLFFBQ2pLLEdBR0krc0MsRUFkZ0IsQ0FBQzlZLElBQ3JCLE1BQ01sbEMsRUFBT2tsQyxFQUFFaG1DLElBRGtCNEwsR0FBUSxJQUFtQmhILGtCQUFrQmdILElBRTlFLE9BQU8sSUFBQXUyQixTQUFRcmhDLElBV1FrK0MsQ0FBY2x4QyxHQUN2QzR3QyxFQUFXaDNDLFFBQVFpM0MsRUFDckIsQ0FDRixDQW1CQSx1QkFBT00sQ0FBaUJwOEIsR0FDdEIsTUFBTXE4QixHQUFTLElBQUFweUMsU0FBTyxHQUNoQnF5QyxHQUFZLElBQUF4K0MsS0FBSXUrQyxHQUNoQjF4QixHQUFXLElBQUFwbkIsSUFBR1csUUFDZHE0QyxHQUFhLElBQUFwK0MsU0FBUW0rQyxHQUFXLFNBQUszeEIsSUFBVyxJQUFBdkMsT0FBTSxFQUFHLElBQUksSUFBQXRwQixXQUFVLEtBRTdFLE9BRHVCLElBQUFYLFNBQVFtK0MsR0FBVyxTQUFLQyxJQUFhLElBQUF6OUMsV0FBVSxJQUMvRDA5QyxDQUFleDhCLEVBQ3hCLENBRUEscUJBQU92YixDQUFlcEIsR0FLcEIsT0FKSSxJQUFBRSxJQUFHVyxPQUFRYixLQUNiQSxFQUFJOFYsU0FBUzZTLGNBQWMzb0IsS0FHdEIsSUFBQWxGLFVBQVEsSUFBQXVHLEtBQUksSUFBSSxJQUFBNUYsWUFBVyxJQUFJLElBQUE2RixNQUFLLFlBQXBDLENBQWlEdEIsRUFDMUQsQ0FFQSxvQkFBQW81QyxHQUNFLE1BQU1DLEdBQWEsSUFBQXYrQyxTQUFRLEVBQUF3K0MsU0FBUyxJQUFBai9DLFNBQU8sSUFBQWlILE1BQUssWUFBWSxJQUFBMEUsUUFBTyxNQUNuRTVLLEtBQUsxQixNQUFNKzFCLFFBQVU0cEIsRUFBV2orQyxLQUFLMUIsTUFBTXdZLEdBQzdDLENBSUEsaUJBQUE0bEMsQ0FBa0JwK0MsR0FDaEIsTUFBTTBILEdBQWlCLElBQUF0RyxVQUFRLElBQUF1RyxLQUFJLElBQUksSUFBQTVGLFlBQVcsSUFBSSxJQUFBNkYsTUFBSyxhQUUzRCxPQUFPLElBQUEybEMsZ0JBQWMsSUFBQXRzQyxTQUFRLENBRFJ1WCxHQUFNNEQsU0FBU3NKLEtBQUtnM0IsU0FBU2xrQyxHQUNOOVEsSUFBa0IsS0FBdkQsQ0FBNkQxSCxFQUN0RSxDQUVBLDJCQUFBMitDLElBQzZDLElBQXZDajlDLEtBQUsxQixNQUFNbStDLHlCQUNiejhDLEtBQUtnK0MsdUJBQ0xoK0MsS0FBS20rQyxjQUNzQixPQUFsQm4rQyxLQUFLMUIsTUFBTXdZLElBQ3BCalgsUUFBUTRPLE1BQU0sa0VBQWtFek8sS0FBSzVCLFlBQVlDLDhCQUVyRyxDQUVBLGNBQUFtK0MsR0FDRSxNQUFNNEIsR0FBWSxJQUFBemhDLE9BQU0zYyxLQUFLcStDLG9CQUFvQjE5QyxLQUFLWCxPQVN0REEsS0FBS2syQyxxQkFBcUI5dkMsUUFSTzVHLElBQy9CLElBQUsyQixFQUFRZzFDLEVBQVNtSSxHQUFnQjkrQyxHQUNsQyxJQUFBc0YsSUFBR1csT0FBUTY0QyxLQUNiQSxFQUFlLElBQUksRUFBQXRULEVBQXFCLENBQUU5ZixTQUFTb3pCLEtBRXJEdCtDLEtBQUsxQixNQUFNMjlDLDJCQUEyQjk2QyxHQUFVaTlDLEVBQVVqSSxFQUN4RG1JLEtBR0p0K0MsS0FBSzFCLE1BQU1pZ0Qsa0JBQW9CditDLEtBQUt3K0MscUJBQ2xDeCtDLEtBQUsxQixNQUFNMjlDLDJCQUNmLENBbUJBLGtCQUFBL0YsR0FDRSxNQUFPLEVBQ1QsQ0FFQSxtQkFBQW1JLENBQW9CL3pDLEVBQUtnMEMsRUFBY3BpQyxHQVNyQyxRQUFlemQsSUFBWHlkLEVBQUVyWSxNQUFzQnFZLEVBQUVyWSxLQUFLUyxTQUFTLFdBQ3ZCLElBQWpCdEUsS0FBS3krQyxRQUFrQixDQUN6QixNQUFNcjBDLEdBQU0sT0FBVSxDQUFDLEVBQUc4UixHQUMxQjlSLEVBQUl2RyxLQUFPN0QsS0FBS3UyQyxNQUFNdkwsRUFDdEJockMsS0FBS3cyQyxjQUFjaEssS0FBS3RnQyxLQUFLOUIsRUFDL0IsRUFHeUIsS0FGSCxJQUFBL0osWUFBVSxJQUFBdUssU0FBTyxHQUFPMHpDLEVBRTFDSSxDQUFjeGlDLElBaEJGLENBQUM1YSxTQUNHN0MsSUFBZHVCLEtBQUtzSyxHQUNQekssUUFBUUMsS0FBSyw4QkFBOEJ3SyxpQ0FBbUN0SyxLQUFLNUIsWUFBWUMsU0FFL0YyQixLQUFLc0ssR0FBS2hKLElBY1pxOUMsQ0FEQXppQyxHQUFJLElBQUF4SSxNQUFLLENBQUMsUUFBU3dJLEdBR3ZCLENBRUEsb0JBQUFzaUMsQ0FBcUJ2QyxFQUE2QixDQUFDLEdBQ2pELE1BQU0yQyxFQUFpQixDQUNyQkMsWUFBYzNpQyxHQUFNbGMsS0FBSzgrQyxtQkFBbUI1aUMsR0FDNUM4NkIsVUFBWTk2QixHQUFNbGMsS0FBS294QixrQkFBa0JsVixHQUV6QzZpQyxXQUFhN2lDLEdBQU1sYyxLQUFLZy9DLGFBQWE5aUMsR0FDckMraUMsK0JBQWlDL2lDLEdBQU1sYyxLQUFLZy9DLGFBQWE5aUMsR0FDekRnakMsa0NBQW9DaGpDLEdBQU1sYyxLQUFLZy9DLGFBQWE5aUMsR0FFNUQ0NkIsOEJBQWdDNTZCLEdBQU1sYyxLQUFLbS9DLFlBQVlqakMsR0FDdkRrakMsV0FBWSxLQUFNLENBQUcsSUFFdkIsT0FBTyxJQUFVLy9DLElBQUksQ0FBQyxDQUFDLEVBQUd1L0MsRUFBZ0IzQyxHQUM1QyxDQUdBLGNBQUFjLEdBQ0UvOEMsS0FBS3kyQyxTQUFXejJDLEtBQUs0OEMsWUFBWW4wQyxNQUFLLElBQUEvSixLQUNuQzRDLEdBQVl0QixLQUFLcS9DLGdCQUFnQi85QyxLQUFXLElBQUFnK0MsV0FBVXQvQyxLQUFLdS9DLGFBRTlEdi9DLEtBQUt3L0MsNkJBQ0x4L0MsS0FBS3kvQyx5QkFBeUJ6L0MsS0FBS3kyQyxVQUFVLEVBQy9DLENBRUEsVUFBQThJLENBQVdyakMsR0FDVCxPQUFRQSxFQUFFL2EsT0FBT21ELFNBQVMsZ0NBQzVCLENBRUEsU0FBQW83QyxDQUFVeGpDLEdBQ1IsT0FBUUEsRUFBRS9hLE9BQU9tRCxTQUFTLGdDQUM1QixDQUVBLFlBQUFxN0MsQ0FBYXpqQyxHQUNYLE9BQVFBLEVBQUUvYSxPQUFPbUQsU0FBUyxZQUM1QixDQUVBLGFBQUFzN0MsQ0FBYzFqQyxHQUNaLE9BQVFBLEVBQUUvYSxPQUFPbUQsU0FBUyxjQUM1QixDQUVBLE9BQUF1N0MsQ0FBUTNqQyxHQUNOcmMsUUFBUWtuQixJQUFJLG1CQUFvQjdLLEVBQ2xDLENBRUEsZUFBQTRqQyxDQUFnQi96QyxFQUFLc3RDLEdBYW5CcjVDLEtBQUsrL0MsUUFBVWgwQyxFQUFJdEQsTUFDakIsSUFBQUMsUUFieUJmLFFBQWtCbEosSUFBVGtKLFFBQ2hDbEosSUFEc0RrSixFQUFLeEcsU0FjN0QsSUFBQXpDLEtBWitCaU4sSUFDL0IsTUFBTWhFLEdBQU8sT0FBVSxDQUFDLEVBQUdnRSxHQU0zQixNQUpvQixnREFBaEJoRSxFQUFLeEcsU0FDUG5CLEtBQUtveEIsa0JBQWtCenBCLEdBQ3ZCQSxFQUFLeEcsT0FBUyxpQ0FFVHdHLEtBTVQzSCxLQUFLeS9DLHlCQUF5QnovQyxLQUFLKy9DLFNBQVMsRUFBTyxVQUNuRC8vQyxLQUFLZ2dELHdCQUF3QjNHLEVBQy9CLENBRUEsY0FBQTRHLENBQWVqMEMsR0FDYixNQUVNazBDLEVBQVNsMEMsRUFBS3ZELE1BQ2xCLElBQUFDLFFBSHlCZixRQUFrQmxKLElBQVRrSixRQUNoQ2xKLElBRHNEa0osRUFBS3hHLFNBSTdELElBQUFrbUIsS0FBSW5MLEdBQUtsYyxLQUFLbWdELE9BQU8scUJBQXNCamtDLEtBQzNDLElBQUF4ZCxLQUFLd2QsR0FDSUEsSUFFVCxJQUFBa2tDLFVBQVNsa0MsR0FBS2xjLEtBQUtxZ0QsaUJBQWlCSCxFQUFPNXpDLFVBQzdDdE0sS0FBS3kvQyx5QkFBeUJTLEdBQVEsRUFBTSxRQUM5QyxDQUVBLGVBQUFJLENBQWdCcGtDLEdBRWhCLENBSUEsZ0JBQUFta0MsQ0FBaUJua0MsR0FDZixNQVNNcWtDLEVBVFcsQ0FBQ0MsSUFDaEIsTUFBTUMsRUFBYUMsSUFDakIsVUFBeUJqaUQsSUFBbEJpaUQsRUFBRTF5QixhQUNQMHlCLEVBQUlELEVBQVVDLEVBQUUxeUIsYUFFbEIsT0FBTzB5QixHQUVULE9BQU8sSUFBQTlnRCxNQUFLLENBQUMsS0FBTSxRQUFTNmdELEVBQVVELEtBRWJHLENBQVN6a0MsR0FJcEMsT0FIQWxjLEtBQUttZ0QsT0FBTyxvQkFBcUJuZ0QsS0FBSzI3QyxNQUFPei9CLEdBRTdDbGMsS0FBS3NnRCxnQkFBZ0JDLEVBQW9CcmtDLEdBQ2xDcWtDLENBQ1QsQ0FFQSwwQkFBQWYsR0FFRSxNQUFNLytDLEVBQWEsQ0FDakJ5TCxLQUFNbE0sS0FBSzRnRCx5QkFBeUJqZ0QsS0FBS1gsTUFDekN5TyxNQUFPek8sS0FBSzZnRCwwQkFBMEJsZ0QsS0FBS1gsTUFDM0NpdEMsU0FBVWp0QyxLQUFLOGdELDZCQUE2Qm5nRCxLQUFLWCxPQU83Q2d0QyxFQUFjLEtBQ2xCaHRDLEtBQUsxQixNQUFNeWlELFNBQU10aUQsRUFDakJ1QixLQUFLZ2hELFlBQVkvVCxXQUNqQmp0QyxLQUFLaWhELGdCQUFnQmhVLFdBQ3JCanRDLEtBQUs2MUMsTUFBTTVJLFdBQ1hqdEMsS0FBSzFCLFdBQVFHLEVBQ2J1QixLQUFLeStDLFNBQVUsRUFDZnorQyxLQUFLbWdELE9BQU8sY0FBZW5nRCxLQUFLeStDLFFBQVN6K0MsS0FBSzFCLFFBRTFDNGlELEVBQThCLEtBQ2xDQyxHQUFZLEVBQ0ssSUFBYkEsR0FDRm5VLEtBS0osSUFBSW1VLEVBQVcsRUFDZm5oRCxLQUFLZ2hELFlBQWMsSUFBSSxFQUFBbjZDLFFBR3ZCN0csS0FBS29oRCxrQkFBb0JwaEQsS0FBS2doRCxZQUFZdjRDLE1BQUssSUFBQStlLFVBQVU2NUIsSUFDdkQsTUFBTUMsRUFBb0JELEVBQVF6MUMsV0FBV25ELE1BQUssSUFBQUMsUUFDL0N3VCxRQUFZemQsSUFBTnlkLFFBQWdDemQsSUFBYnlkLEVBQUUvYSxTQUF1QixJQUFBekMsS0FBSXdkLElBRXZELE1BQU01YSxHQUFVLE9BQVUsQ0FBQyxFQUFHNGEsR0FHOUIsT0FGQTVhLEVBQVFILE9BQVMrYSxFQUFFL2EsT0FDbkJuQixLQUFLbWdELE9BQU8sb0JBQXFCNytDLEdBQzFCQSxLQUdULE9BQStCLElBQTNCKy9DLEVBQVFFLGVBQ0hELEdBWm9DSCxHQUFZLEVBZWhERyxFQUFrQjc0QyxNQUFLLElBQUEyM0MsVUFBU2MsUUFJM0NsaEQsS0FBS2loRCxnQkFBa0JqaEQsS0FBS29oRCxrQkFFekIzNEMsTUFBSyxJQUFBQyxRQUFRd1QsUUFBWXpkLElBQU55ZCxRQUFnQ3pkLElBQWJ5ZCxFQUFFL2EsU0FDeEN3SCxVQUFVbEksRUFDZixDQUdBLHdCQUFBZy9DLENBQXlCenpDLEVBQU11MUMsR0FBaUIsRUFBT0MsR0FFckQsTUFBTXAzQyxFQUFNLENBQ1Z3QixXQUFZSSxFQUNadTFDLGlCQUNBQyxPQUVGeGhELEtBQUttZ0QsT0FBTyw0QkFBNkJuZ0QsS0FBSzI3QyxNQUFPdnhDLEdBQ3JEcEssS0FBS2doRCxZQUFZOTBDLEtBQUs5QixFQUN4QixDQUdBLHdCQUFBdzJDLENBQXlCdC9DLEVBQVUsQ0FBQyxHQUNsQyxNQUFNZzRDLEdBQWMsSUFBQWo1QyxXQUFXNmIsR0FBTWxjLEtBQUt5aEQsb0JBQW9CdmxDLElBSXhEd2xDLEdBQWdCLFFBQXVCMWhELEtBQUsxQixNQUFNaWdELGtCQUN0RGo5QyxFQUFRSCxRQUlDbTRDLEVBSFF0NUMsS0FBSzFCLE1BQU1pZ0Qsa0JBQWtCbUQsR0FPaERwMkMsQ0FBR2hLLEdBSUh0QixLQUFLbWdELE9BQU8sMkJBQTRCLENBQUU3K0MsV0FDNUMsQ0FFQSx5QkFBQXUvQyxDQUEwQnYvQyxFQUFVLElBQ2xDekIsUUFBUWtuQixJQUFJLGNBQWUvbUIsS0FBSzVCLFlBQVlDLEtBQU1pRCxFQUNwRCxDQVVBLDRCQUFBdy9DLEdBRUU5Z0QsS0FBS21nRCxPQUFPLCtCQUFnQyx1QkFFNUNuZ0QsS0FBSzJoRCxXQUFXLHNCQUNsQixDQUVBLG1CQUFBRixDQUFvQm5nRCxHQUNsQnRCLEtBQUttZ0QsT0FBTyxzQkFBdUI3K0MsR0FFbkN0QixLQUFLMmhELFdBQVdyZ0QsRUFBUUgsT0FBUUcsRUFDbEMsQ0FHQSx1QkFBQTArQyxDQUF3QjNHLEdBRXRCcjVDLEtBQUsyaEQsV0FBVyxnQ0FBaUN0SSxFQUNuRCxDQUVBLFVBQUF1SSxHQUNFNWhELEtBQUsyaEQsV0FBVyxXQUNsQixDQUVBLHdCQUFBRSxDQUF5QnpwQixFQUFNdnBCLEVBQU1ncUMsR0FDbkMsTUFBTVEsRUFBYSxDQUFFamhCLE9BQU12cEIsT0FBTWdxQyxjQUNqQzc0QyxLQUFLMmhELFdBQVcsNkJBQThCLENBQUV0SSxjQUNsRCxDQUdBLGtCQUFBeUYsQ0FBbUI1aUMsR0FDRCxXQUFaQSxFQUFFa3dCLE9BQ0pwc0MsS0FBS294QixrQkFBa0JsVixFQUUzQixDQUVBLGVBQUE0bEMsR0FFQSxDQWFBLFVBQUFwM0MsQ0FBV1ksRUFBSXkyQyxFQUFLLEVBQUdwaEQsR0FBTyxHQU81QjhELE9BQU9pRyxXQU5lLElBQUlpL0IsS0FDeEIsUUFBYWxyQyxJQUFUdUIsV0FBcUN2QixJQUFmdUIsS0FBSzFCLE1BQXFCLENBQ2xELE1BQU0wakQsR0FBb0IsSUFBVHJoRCxFQUFnQjJLLEVBQUczSyxLQUFLWCxNQUFRc0wsR0FDakQsSUFBQW9XLE9BQU1zZ0MsRUFBVXJZLEVBQ2xCLEdBRStCb1ksRUFDbkMsQ0FNQSxpQkFBQTN3QixDQUFrQmxWLEdBRWhCbGMsS0FBSzhoRCxrQkFDTDloRCxLQUFLMmhELFdBQVcsWUFDbEIsQ0FFQSxjQUFBTSxDQUFlL2xDLEdBQ2YsQ0FFQSxpQkFBQWdtQyxDQUFrQmhtQyxHQUVoQmxjLEtBQUsyaEQsV0FBVyxZQUNsQixDQUVBLFdBQUF4QyxDQUFZampDLEdBQ1YsTUFBTWltQyxPQUF5QjFqRCxJQUFaeWQsRUFBRWt3QixPQUFtQyxhQUFabHdCLEVBQUVrd0IsTUFJOUNwc0MsS0FBS21nRCxPQUFPLGNBQWVnQyxFQUFZam1DLEVBQ3pDLENBRUEsVUFBQXlsQyxDQUFXeGdELEVBQVFpSixFQUFNLENBQUMsR0FDeEIsUUFBbUIzTCxJQUFmdUIsS0FBSzFCLE1BQXFCLENBQzVCMEIsS0FBSzFCLE1BQU02QyxPQUFTQSxFQUNwQixNQUFNd0csR0FBTyxJQUFBNkssWUFBV3hTLEtBQUsxQixNQUFPOEwsR0FHcENwSyxLQUFLNjFDLE1BQU0zcEMsS0FBS3BKLE9BQU95RCxPQUFPb0IsR0FDaEMsQ0FDRixDQUVBLGFBQUF5NkMsQ0FBY3ZKLEVBQVlsWixHQVV4QixNQUFPLENBQ0x2SCxLQUFNcDRCLEtBQUsxQixNQUFNd1ksR0FDakJqSSxLQUFNLHVCQUNOZ3FDLGFBQ0FsWixNQWJpQixNQUNqQixNQUFNeUosRUFBSXBwQyxLQUFLMUIsTUFBTXdZLEdBQUd5VyxjQUFjb1MsR0FLdEMsT0FIa0IsSUFEQStiLEVBQVdwSCxjQUNILElBQUF4dkMsSUFBR1csT0FBUWs2QixLQUFVLElBQUF6Z0MsT0FBTWtxQyxJQUNuRHZwQyxRQUFRQyxLQUFLLDBDQUEwQ0UsS0FBSzFCLE1BQU1ELFVBQVVzaEMsNkJBRXZFeUosR0FPQWlaLEdBRVgsQ0FFQSxZQUFBQyxDQUFheHJDLEVBQUltRSxHQUNmLE1BQU1zbkMsRUFBVXpyQyxHQUFNQSxFQUFHcStCLGNBQ3pCLElBQUl2L0IsRUFBTyxFQUNQME8sRUFBV3hOLEVBQ2YsS0FBT2xCLEVBQU9xRixHQUNacUosRUFBV2krQixFQUFRaitCLEdBQ25CMU8sSUFFRixPQUFPME8sQ0FDVCxDQUVBLG1CQUFBaytCLENBQW9CM0osRUFBWWxaLEVBQU84aUIsR0FDckM5aUIsRUFBa0IsS0FBVkEsRUFBZUEsT0FBUWxoQyxFQUMvQixNQUFNMjVCLEVBQU9wNEIsS0FBS3NpRCxhQUFhdGlELEtBQUsxQixNQUFNd1ksR0FBSTJyQyxHQUM5QyxNQUFPLENBQ0xycUIsT0FDQXZwQixLQUFNLHVCQUNOZ3FDLGFBQ0FsWixNQUFPdkgsRUFBSzdLLGNBQWNvUyxHQUU5QixDQUVBLGVBQUEwZixDQUFnQi85QyxFQUFVLENBQUMsR0FFekIsT0FEQXRCLEtBQUsxQixPQUFRLElBQUFrVSxZQUFXeFMsS0FBSzFCLE1BQU9nRCxHQUM3QkEsQ0FDVCxDQUdBLHNCQUFBb2hELENBQXVCQyxFQUFXdEosR0FDaENyNUMsS0FBS2lnRCxlQUFlMEMsRUFBVW5NLGNBQWM5SixXQUM1Q2lXLEVBQVU3QyxnQkFBZ0I5L0MsS0FBS3cyQyxjQUFjN0osU0FBVTBNLEVBQ3pELENBZUEsV0FBQXQxQixDQUFZcVUsUUFFWTM1QixJQUFsQnVCLEtBQUsxQixNQUFNd1ksSUFDYmpYLFFBQVFDLEtBQUssa0NBQWtDRSxLQUFLMUIsTUFBTUQseUJBQXlCMkIsS0FBSzFCLE1BQU13WSw4R0FFaEc5VyxLQUFLNmhELHlCQUF5QnpwQixFQUFNLE1BQU8sY0FDN0MsQ0FFQSxnQkFBQXdxQixDQUFpQnhxQixRQUNPMzVCLElBQWxCdUIsS0FBSzFCLE1BQU13WSxJQUNialgsUUFBUUMsS0FBSyxrQ0FBa0NFLEtBQUsxQixNQUFNRCx5QkFBeUIyQixLQUFLMUIsTUFBTXdZLG1IQUVoRzlXLEtBQUs2aEQseUJBQXlCenBCLEVBQU0sTUFBTyxRQUM3QyxDQVdBLFlBQUF5cUIsQ0FBYXpxQixRQUNXMzVCLElBQWxCdUIsS0FBSzFCLE1BQU13WSxJQUNialgsUUFBUUMsS0FBSyxrQ0FBa0NFLEtBQUsxQixNQUFNRCx5QkFBeUIyQixLQUFLMUIsTUFBTXdZLCtHQUVoRzlXLEtBQUs2aEQseUJBQXlCenBCLEVBQU0sTUFBTyxlQUM3QyxDQXVCQSxVQUFBMHFCLENBQVdqekMsRUFBRzh2QixHQUNaMy9CLEtBQUswaUQsdUJBQXVCN3lDLEVBQUc3UCxLQUFLb2lELGNBQWMsY0FBZXppQixHQUNuRSxDQUVBLGVBQUFvakIsQ0FBZ0JsekMsRUFBRzh2QixHQUNqQjMvQixLQUFLMGlELHVCQUF1Qjd5QyxFQUFHN1AsS0FBS29pRCxjQUFjLFFBQVN6aUIsR0FDN0QsQ0F5QkEsb0JBQUFxakIsQ0FBcUJuekMsRUFBRzh2QixFQUFPOGlCLEVBQVEsR0FDckN6aUQsS0FBSzBpRCx1QkFBdUI3eUMsRUFDMUI3UCxLQUFLd2lELG9CQUFvQixjQUFlN2lCLEVBQU84aUIsR0FDbkQsQ0FvQkEscUJBQUFRLENBQXNCcHpDLEVBQUc4dkIsRUFBTzhpQixFQUFRLEdBQ3RDemlELEtBQUswaUQsdUJBQXVCN3lDLEVBQzFCN1AsS0FBS3dpRCxvQkFBb0IsZUFBZ0I3aUIsRUFBTzhpQixHQUNwRCxDQXlCQSxXQUFBUyxDQUFZcnpDLEVBQUc4dkIsR0FDYjMvQixLQUFLMGlELHVCQUF1Qjd5QyxFQUFHN1AsS0FBS29pRCxjQUFjLGVBQWdCemlCLEdBQ3BFLENBS0EsWUFBQXRPLEdBQ0UsTUFBTStHLEVBQU8xZCxTQUFTNEssZUFBZSxvQkFDckN0bEIsS0FBSzZoRCx5QkFBeUJ6cEIsRUFBTSxNQUFPLGNBQzdDLENBRUEsWUFBQTRtQixDQUFhMTlDLEdBRVcsYUFBbEJBLEVBQVE4cUMsT0FHVnBzQyxLQUFLbStDLFlBR1QsQ0FFQSxVQUFBQSxHQUNFLElBQWlDLElBQTdCbitDLEtBQUttakQsb0JBQVQsQ0FXQSxHQVBBbmpELEtBQUtvakQsb0JBQ0xwakQsS0FBS3FqRCxjQUVMcmpELEtBQUtpeEIsYUFFTHhDLHNCQURvQyxJQUFNenVCLEtBQUtzakQsNkJBR3hCLElBQW5CdGpELEtBQUtzMEMsVUFBb0IsQ0FDM0IsTUFBTS95QixFQUFZdmhCLEtBQUt1akQsbUJBRUosSUFEQTdILEVBQVdpQyxpQkFBaUJwOEIsSUFFN0MxaEIsUUFBUUMsS0FBSyw2REFBNkRFLEtBQUsxQixNQUFNRCxVQUFVOEUsS0FBS0MsVUFBVW1lLGlEQUVsSCxDQUNBdmhCLEtBQUt3akQscUJBQ0x4akQsS0FBS3lqRCx1QkFBeUIsSUFBSSxJQUFzQnpqRCxLQUFLMUIsTUFBTzBCLEtBQUt1akQsZ0JBQWdCNWlELEtBQUtYLE9BQzlGQSxLQUFLbXhCLHVCQUVMbnhCLEtBQUttakQscUJBQXNCLENBcEIzQixDQXFCRixDQUVBLFNBQUE5NUMsQ0FBVUYsR0FDd0IsVUFBNUJBLEVBQU8vSyxZQUFZQyxPQUNyQjhLLEVBQVMsQ0FBQ0EsSUFNWkEsRUFBTy9DLFFBSldnRCxJQUNoQixJQUFJQSxFQUFXcEosT0FJbkIsQ0FJQSxvQkFBQW14QixHQUNFLElBQXVCLElBQW5CbnhCLEtBQUtzMEMsVUFBb0IsQ0FDM0IsTUFBTW9QLEVBQXVCbGtELEdBQVFBLEVBQUksR0FDbkNta0QsRUFBbUIzakQsS0FBS2syQyxxQkFFeEJrSCxFQUFhdUcsRUFBaUJqbEQsSUFBSWdsRCxHQUl4QyxJQUFtQixJQUZBaEksRUFBV2lDLGlCQUFpQmdHLEdBRzdDOWpELFFBQVFDLEtBQUssaUVBQWlFRSxLQUFLMUIsTUFBTUQsVUFBVThFLEtBQUtDLFVBQVV1Z0Qsc0RBQzdHLENBQ0wsTUFBTUMsRUFBMEJwa0QsSUFDOUIsTUFBTTRoQixHQUFTLElBQUEvZ0IsV0FBVSxHQUFJYixFQUFJLEtBRWhCLEtBREEsSUFBQXNGLElBQUcrK0MsU0FBVTdqRCxLQUFLb2hCLEtBRWpDdmhCLFFBQVFDLEtBQUssa0VBQWtFcUQsS0FBS0MsVUFBVTVELFdBQWFRLEtBQUsxQixNQUFNRCxxQ0FHMUgsSUFBQXFCLFVBQVEsSUFBQTBHLFNBQVF3OUMsSUFBeUIsSUFBQXZqRCxXQUFVLElBQW5ELENBQXdEc2pELEVBQzFELENBRUEsTUFBTUcsRUFBNkIsVUFDY3JsRCxLQUEzQyxJQUFBNkIsTUFBSyxDQUFDLFFBQVMsaUJBQWtCTixPQUNuQzA3QyxFQUFXeUIsNEJBQTRCeDhDLEtBQUtYLEtBQTVDMDdDLENBQWtEMTdDLEtBQUsxQixNQUFNMCtDLGNBQWVJLElBR2hGcDlDLEtBQUswSyxXQUFXbzVDLEVBQTRCLElBQzlDLENBQ0YsQ0FFQSxXQUFBQyxHQUNFL2pELEtBQUsxQixNQUFNd1ksR0FBR0MsUUFBUW1aLEtBQU9sd0IsS0FBSzFCLE1BQU00eEIsSUFDMUMsQ0FFQSxpQkFBQWt6QixHQVFFcGpELEtBQUsrakQsY0FDTC9qRCxLQUFLMUIsTUFBTXlpRCxLQUFNLE9BQW1CL2dELEtBQUsxQixNQUFNd1ksR0FHakQsQ0FHQSxVQUFBa3RDLEdBRUEsQ0FRQSxVQUFBL3lCLEdBQ0EsQ0FRQSx3QkFBQXF5QixHQUNBLENBUUEsV0FBQUQsR0FDQSxDQUVBLGVBQUFFLEdBRUUsTUFBTyxFQUNULENBaUJBLFVBQUFwM0MsQ0FBVzFKLEdBWVQsT0FGVyxJQUFBdUgsUUFUWXFDLElBQUssVUFBd0IvSCxTQUFTK0gsR0FHckNBLEdBQ1QsSUFBbUJuRSxZQUFZSSxVQUFVK0QsR0FBR3BLLFNBRTdDd0csTUFBSyxJQUFBNjJDLFdBQVVwakMsSUFBc0IsSUFBakJsYyxLQUFLeStDLFVBTHpCcHlDLEdBQUt4TSxRQUFRQyxLQUN2QixnQkFBZ0J1TSxtQkFBbUIsUUFTaENmLENBQUc3SSxFQUNaLENBS0Esa0JBQUErZ0QsR0FLTXorQyxNQUFNMmEsUUFBUTFmLE1BQU0xQixPQUFPNFQsVUFDN0JsUyxNQUFNMUIsT0FBTzRULFVBQVU5TCxRQUxMM0QsSUFDbEIsTUFBT0gsRUFBYTJoRCxHQUFZLEdBQVNsL0MsTUFBTTJhLFFBQVFqZCxHQUFXQSxFQUFVLENBQUNBLEdBQzdFekMsTUFBTWtrRCxXQUFXNWhELEVBQWEyaEQsS0FJckJsL0MsTUFBTTJhLFFBQVExZixNQUFNMUIsT0FBT21FLFVBQ3BDNUMsUUFBUUMsS0FBSywwRUFFakIsQ0E2QkEsVUFBQW9rRCxDQUFXNWhELEVBQWEyaEQsR0FBWSxFQUFPRSxHQUFpQixFQUFPcjZDLEdBQU8sR0FDeEUsTUFBTXM2QyxHQUFrQyxJQUFuQkQsRUFBMEJua0QsS0FBS3UyQyxNQUFNckwsR0FBS2xyQyxLQUFLdTJDLE1BQU00QyxFQVMxRSxJQUEwRCxJQUF0RG41QyxNQUFNMUIsT0FBTzArQyxlQUFlMTRDLFNBQVNoQyxHQUV2QyxPQUVGLE1BQU0raEQsR0FBb0IsSUFBQS9qRCxNQUFLLENBQUMsYUFBYyxpQkFDeENna0QsR0FBVyxJQUFBaGtELE1BQUssQ0FBQyxhQUFjLFNBUy9CaWtELEVBQVUsRUFBQyxJQUFBN2xELEtBdEJJd2QsSUFFbkIsTUFBTXhHLEVBQUt3RyxFQUVYLE9BREF4RyxFQUFHN1IsS0FBT3VnRCxFQUNIMXVDLEtBa0IyQixJQUFBaE4sUUFSakJ3VCxJQUNqQixNQUFNZ1UsRUFBT28wQixFQUFTcG9DLEdBSXRCLE9BRnFDLElBRGhCbW9DLEVBQWtCbm9DLElBQ01nVSxJQUFTbHdCLEtBQUsxQixNQUFNNHhCLFNBTWpELElBQWQrekIsR0FDRk0sRUFBUUMsU0FBUSxJQUFBQyxNQUFLLElBR3ZCLE1BQU1DLEVBQVcxa0QsS0FBS21NLFdBQVc3SixHQUFhbUcsUUFBUTg3QyxHQUN0RHZrRCxLQUFLeS9DLHlCQUF5QmlGLEdBQVUsR0FDeEMxa0QsS0FBSzFCLE1BQU0wK0MsY0FBY3JtQyxLQUFLclUsRUFDaEMsQ0FFQSxvQkFBQXFpRCxDQUFxQnJpRCxHQUNuQixNQUFNc2lELEVBQWdCLElBQW1CMThDLFlBQVlXLFdBQVd2RyxHQUloRSxPQUhzQixJQUFsQnNpRCxHQUNGL2tELFFBQVFDLEtBQUssMENBQTBDRSxLQUFLMUIsTUFBTUQscUNBQXFDaUUsb0NBRWxHc2lELENBQ1QsQ0FnQkEsaUJBQUExekIsQ0FBa0I1dUIsRUFBYW9ULEVBQUssQ0FBQyxFQUFHdlUsR0FDdEMsTUFBTUcsRUFBVW9VLEVBRVZtdkMsR0FBa0IsSUFBQXhrRCxXQUFVLG9CQUk1QnlrRCxHQUFjLElBQUFwbEQsU0FBUW1sRCxHQUFpQixJQUFBMytDLE1BQUs1RCxJQUk1Q3FGLEVBQU8sQ0FBRXJHLFVBQVNILE9BRnhCQSxFQUFTQSxHQUFVMmpELEVBTGMsQ0FDL0JDLGNBQWUsZ0NBUWpCLElBRUUsR0FEQXA5QyxFQUFLbkcsWUFBYSxJQUFBOUIsVUFBUSxJQUFBRSxNQUFLLENBQUMsS0FBTSxPQUFRLFFBQVMsYUFBYSxJQUFBc0csTUFBSyxTQUF2RCxDQUFpRWxHLE9BQ3BDLElBQTNDQSxLQUFLMmtELHFCQUFxQnJpRCxHQUF1QixFQUNWLElBQXJDLG9CQUFvQnNTLEtBQUt6VCxJQUMzQjJCLE9BQU9xQixpQkFBaUJ3RCxFQUFNLENBQzVCckcsUUFBUyxDQUNQd0MsSUFBSyxLQUFNLFFBQVU0UixNQUkzQixNQUFNMUosR0FBTyxJQUFBNmIsSUFBR2xnQixHQUNoQixPQUFPLElBQUksSUFBa0JyRixFQUFhMEosRUFBTXJFLEVBQ2xELENBQ0YsQ0FBRSxNQUFPbkIsR0FDUDNHLFFBQVFDLEtBQUssaUJBQWtCMEcsRUFDakMsQ0FDRixDQUVBLE1BQUEyNUMsSUFBVXhXLEdBQ1IzcEMsS0FBS204Qyx1QkFBdUJ4UyxFQUM5QixDQUVBLDJCQUFBMFMsR0FFQSxDQUVBLHlCQUFBRCxDQUEwQmo5QyxFQUFLK2MsR0FDN0IsTUFJTThvQyxFQUFtQix3QkFBTjlvQyxHQUNBLEtBTEEsSUFBQXVRLE9BQU0sQ0FDdkIyZixPQUFPLElBQUE1Z0MsUUFBTyxZQUNkckssUUFBUSxJQUFBcUssUUFBTyxzQ0FDZDBRLEdBR0RsYyxLQUFLa3hCLGtCQUFrQixvQkFBcUIsQ0FBRS92QixPQUFPLG9DQUFzQyxxQ0FDbkUsSUFBZjZqRCxHQUNUaGxELEtBQUtreEIsa0JBQWtCLG9CQUFxQixDQUFFL3ZCLE9BQU8sb0NBQXNDLG1DQUUvRixDQUVBLGtCQUFBOGpELENBQW1CQyxFQUFXdjlDLEdBQzVCLE9BQU8sSUFBSSxFQUFBcWpDLEVBQXFCa2EsRUFBV3Y5QyxFQUM3QyxDQUVBLFlBQUEwdEMsQ0FBYXBwQyxHQUNYLE1BQU1rNUMsR0FBUyxJQUFBN2tELE1BQUssQ0FBQyxhQUFjLE1BQU8yTCxHQUNwQ201QyxHQUFTLElBQUE5a0QsTUFBSyxDQUFDLFFBQVMsTUFBT04sTUFFckMsT0FBTzA3QyxFQUFXMTFDLGVBQWVvL0MsSUFBVzFKLEVBQVcxMUMsZUFBZW0vQyxJQUFXQyxFQUFPcEssU0FBU21LLEVBQ25HLENBR0EsU0FBQTExQyxHQUlFLE1BQU0ya0MsR0FBYSxTQUNuQnAwQyxLQUFLb3dCLFNBQVdna0IsRUFBV2hrQixRQUM3QixFLFNDOW1DRjF5QixFQUFPRCxRQUFVUSxDLFNDQWpCUCxFQUFPRCxRQUFVTyxDLFNDQWpCTixFQUFPRCxRQUFVTSxDLFNDQWpCTCxFQUFPRCxRQUFVUyxDLEdDQ2JtbkQsRUFBMkIsQ0FBQyxFQUdoQyxTQUFTQyxFQUFvQkMsR0FFNUIsSUFBSUMsRUFBZUgsRUFBeUJFLEdBQzVDLFFBQXFCOW1ELElBQWpCK21ELEVBQ0gsT0FBT0EsRUFBYS9uRCxRQUdyQixJQUFJQyxFQUFTMm5ELEVBQXlCRSxHQUFZLENBR2pEOW5ELFFBQVMsQ0FBQyxHQU9YLE9BSEFnb0QsRUFBb0JGLEdBQVU3bkQsRUFBUUEsRUFBT0QsUUFBUzZuRCxHQUcvQzVuRCxFQUFPRCxPQUNmLENDckJBNm5ELEVBQW9CSSxFQUFLaG9ELElBQ3hCLElBQUlpb0QsRUFBU2pvRCxHQUFVQSxFQUFPa29ELFdBQzdCLElBQU9sb0QsRUFBaUIsUUFDeEIsSUFBTSxFQUVQLE9BREE0bkQsRUFBb0IzNUMsRUFBRWc2QyxFQUFRLENBQUVqaEIsRUFBR2loQixJQUM1QkEsR0NMUkwsRUFBb0IzNUMsRUFBSSxDQUFDbE8sRUFBU29vRCxLQUNqQyxJQUFJLElBQUkvMUMsS0FBTysxQyxFQUNYUCxFQUFvQjFnRCxFQUFFaWhELEVBQVkvMUMsS0FBU3cxQyxFQUFvQjFnRCxFQUFFbkgsRUFBU3FTLElBQzVFaE4sT0FBT2dELGVBQWVySSxFQUFTcVMsRUFBSyxDQUFFc0UsWUFBWSxFQUFNdFEsSUFBSytoRCxFQUFXLzFDLE1DSjNFdzFDLEVBQW9CMWdELEVBQUksQ0FBQ3dGLEVBQUtsRSxJQUFVcEQsT0FBT0MsVUFBVUMsZUFBZUMsS0FBS21ILEVBQUtsRSxHQ0NsRm8vQyxFQUFvQm5qQixFQUFLMWtDLElBQ0gsb0JBQVhxb0QsUUFBMEJBLE9BQU9DLGFBQzFDampELE9BQU9nRCxlQUFlckksRUFBU3FvRCxPQUFPQyxZQUFhLENBQUU1eEMsTUFBTyxXQUU3RHJSLE9BQU9nRCxlQUFlckksRUFBUyxhQUFjLENBQUUwVyxPQUFPLEsiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1mZXRjaC1jbGFzcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLXBheWxvYWQtY2xhc3MuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1wcm94eS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWxzLWNvbmZpZy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVscy1tYXAuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC1haS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLWxpZmVjeWNsZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLXJvdXRlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtdWkuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC13aW5kb3cuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvc3B5bmUtYXBwLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3NweW5lLXBsdWdpbnMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvY2hhbm5lbC1mZXRjaC11dGlsLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2NoYW5uZWwtcGF5bG9hZC1maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvZGVlcC1tZXJnZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9mcnAtdG9vbHMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvZ2MuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvbWl4aW5zL2Jhc2UtY29yZS1taXhpbnMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvbWl4aW5zL2Jhc2Utc3RyZWFtcy1taXhpbnMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvcm91dGUtY2hhbm5lbC11cGRhdGVyLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NhZmUtY2xvbmUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc2FuaXRpemUtZGF0YS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zYW5pdGl6ZS1odG1sLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXBsdWdpbnMtbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS10cmFpdC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtd2luZG93LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXdhcm4uanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvdmlld3N0cmVhbS1hbmltYXRpb25zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3ZpZXdzdHJlYW0tb2JzZXJ2YWJsZXMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3MvZG9tLWVsZW1lbnQtdGVtcGxhdGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3MvZG9tLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tYnJvYWRjYXN0ZXIuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1wYXlsb2FkLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLXNlbGVjdG9yLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLmpzIiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOlwiZG9tcHVyaWZ5XCIsXCJjb21tb25qczJcIjpcImRvbXB1cmlmeVwiLFwiYW1kXCI6XCJkb21wdXJpZnlcIixcInJvb3RcIjpcIkRPTVB1cmlmeVwifSIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcInJhbWRhXCIsXCJjb21tb25qczJcIjpcInJhbWRhXCIsXCJhbWRcIjpcInJhbWRhXCIsXCJyb290XCI6XCJSXCJ9Iiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOlwicnhqc1wiLFwiY29tbW9uanMyXCI6XCJyeGpzXCIsXCJhbWRcIjpcInJ4anNcIixcInJvb3RcIjpcInJ4anNcIn0iLCJ3ZWJwYWNrOi8vc3B5bmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6W1wicnhqc1wiLFwib3BlcmF0b3JzXCJdLFwiY29tbW9uanMyXCI6W1wicnhqc1wiLFwib3BlcmF0b3JzXCJdLFwiYW1kXCI6XCJyeGpzL29wZXJhdG9yc1wiLFwicm9vdFwiOltcInJ4anNcIixcIm9wZXJhdG9yc1wiXX0iLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJyeGpzXCIpLCByZXF1aXJlKFwicmFtZGFcIiksIHJlcXVpcmUoXCJkb21wdXJpZnlcIiksIHJlcXVpcmUoXCJyeGpzXCIpW1wib3BlcmF0b3JzXCJdKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwic3B5bmVcIiwgW1wicnhqc1wiLCBcInJhbWRhXCIsIFwiZG9tcHVyaWZ5XCIsIFwicnhqcy9vcGVyYXRvcnNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic3B5bmVcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJyeGpzXCIpLCByZXF1aXJlKFwicmFtZGFcIiksIHJlcXVpcmUoXCJkb21wdXJpZnlcIiksIHJlcXVpcmUoXCJyeGpzXCIpW1wib3BlcmF0b3JzXCJdKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJzcHluZVwiXSA9IGZhY3Rvcnkocm9vdFtcInJ4anNcIl0sIHJvb3RbXCJSXCJdLCByb290W1wiRE9NUHVyaWZ5XCJdLCByb290W1wicnhqc1wiXVtcIm9wZXJhdG9yc1wiXSk7XG59KShzZWxmLCAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fOTY4X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzEzMV9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX182MzZfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTMxX18pID0+IHtcbnJldHVybiAiLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgQ2hhbm5lbEZldGNoVXRpbCB9IGZyb20gJy4uL3V0aWxzL2NoYW5uZWwtZmV0Y2gtdXRpbC5qcydcbmltcG9ydCB7IHBhdGgsIHBpY2ssIG1lcmdlRGVlcFJpZ2h0LCBhbGwsIGFsbFBhc3MsIGVpdGhlciwgdmFsdWVzLCBkZWZhdWx0VG8sIHJlamVjdCwgY29tcG9zZSwgaXNOaWwgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxGZXRjaCBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsRmV0Y2hcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKiBAZGVzY1xuICAgKiA8cD5DaGFubmVsRmV0Y2ggZXh0ZW5kcyBDaGFubmVsIGFuZCBpcyBkZXNpZ25lZCB0byBjcmVhdGUgYSBDaGFubmVsIGZyb20gZmV0Y2hlZCBodHRwIGRhdGEuPC9wPlxuICAgKiA8cD5BIENoYW5uZWxGZXRjaCBpbnN0YW5jZSBjYW4gYmUgY3JlYXRlZCB3aXRoIGp1c3QgdGhlIGNoYW5uZWwgbmFtZSBhbmQgdXJsIHByb3BlcnRpZXMuPC9wPlxuICAgKiA8cD5UaGUgZGF0YSBpcyBmZXRjaGVkIG9uY2UsIGJ1dCB0aGUgQ2hhbm5lbEZldGNoJ3MgZGF0YSBpcyBhbHdheXMgYXZhaWxhYmxlIHRvIG90aGVyIENoYW5uZWwgYW5kIFZpZXdTdHJlYW0gaW5zdGFuY2VzPC9wPlxuICAgKlxuICAgKiA8aDM+VGhlIENoYW5uZWxGZXRjaCBDbGFzczwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkV4dGVuZHMgQ2hhbm5lbCBhbmQgdXNlcyB0aGUgQ2hhbm5lbEZldGNoVXRpbCB0byBtYWtlIGFueSB0eXBlIG9mIGh0dHAocykgcmVxdWVzdC48L2xpPlxuICAgKiA8bGk+UmVxdWlyZXMgYSB1cmwgcHJvcGVydHkgYXQgaW5zdGFudGlhdGlvbi48L2xpPlxuICAgKiA8bGk+VGhlIHJlc3BvbnNlIGRhdGEgaXMgcHVibGlzaGVkIGFzIGEgQ2hhbm5lbFBheWxvYWQuPC9saT5cbiAgICogPGxpPlRoZSBhY3Rpb24gZm9yIHRoZSByZXR1cm5lZCBDaGFubmVsRmV0Y2ggZGF0YSBpcyBhbHdheXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQsIFwiQ0hBTk5FTF9OQU1FX1JFU1BPTlNFX0VWRU5UXCI8L2xpPlxuICAgKiA8bGk+RmV0Y2ggZmFpbHVyZXMgKG5ldHdvcmsgZXJyb3JzLCBub24tT0sgSFRUUCBzdGF0dXNlcywgdW5wYXJzZWFibGUgcmVzcG9uc2VzKSBhcmUgcHVibGlzaGVkIGFzIGEgY29uZm9ybWVkIGVycm9yIENoYW5uZWxQYXlsb2FkIHdpdGggdGhlIGFjdGlvbiBmb3JtYXQsIFwiQ0hBTk5FTF9OQU1FX0VSUk9SX0VWRU5UXCI8L2xpPlxuICAgKiA8bGk+VGhlIGVycm9yIHBheWxvYWQgY29udGFpbnMgZmlsdGVyYWJsZSBwcm9wZXJ0aWVzIHN1Y2ggYXMgZXJyb3JUeXBlLCBzdGF0dXMsIHN0YXR1c1RleHQsIHVybCBhbmQgbWVzc2FnZS48L2xpPlxuICAgKiA8bGk+VGhlIGRlZmF1bHQgcmVxdWVzdCB0eXBlIGlzIGEgR0VUIHJlcXVlc3QgdGhhdCByZXR1cm5zIGEgSlNPTiBvYmplY3QuPC9saT5cbiAgICogPGxpPkhvd2V2ZXIsIGFueSB0eXBlIG9mIHJlcXVlc3QgYW5kIHJldHVybiB0eXBlIGNhbiBiZSBjb25maWd1cmVkIGJ5IHVzaW5nIHRoZSBib2R5IHByb3BlcnR5IHdoZW4gY3JlYXRpbmcgdGhlIGluc3RhbmNlLjwvbGk+XG4gICAqIDxsaT5UaGUgbWFwRm4gZ2l2ZXMgYWNjZXNzIHRvIHRoZSByZXR1cm5lZCByZXNwb25zZSBhbmQgY2FuIGJlIHVzZSB0byBwYXJzZSB0aGUgZGF0YSBiZWZvcmUgaXQgaXMgcHVibGlzaGVkIHRvIG90aGVyIENoYW5uZWxzIGFuZCBWaWV3U3RyZWFtIGluc3RhbmNlcy4gVGhlIG1hcEZuIGlzIG5vdCBjYWxsZWQgZm9yIGVycm9yIHBheWxvYWRzLjwvbGk+XG4gICAqIDxsaT5DaGFubmVsIEZldGNoIHdpbGwgc2VuZCB0aGUgbGFzdCByZXNwb25zZSB0byBmdXR1cmUgc3Vic2NyaWJlcnMsIGFuZCB3aWxsIG5vdCBtYWtlIGZ1cnRoZXIgaHR0cChzKSByZXF1ZXN0cyB1bmxlc3MgZGlyZWN0ZWQgdG8gZG8gIHNvLjwvbGk+XG4gICAqIDxsaT5EYXRhIGNhbiBiZSBGZXRjaGVkIGFnYWluLCBieSBzZW5kaW5nIGEgXCJDSEFOTkVMX05BTUVfUkVRVUVTVF9FVkVOVFwiIGFjdGlvbiBmcm9tIGEgVmlld1N0cmVhbSdzIHNlbmRJbmZvVG9DaGFubmVsIG1ldGhvZC48L2xpPlxuICAgKiA8L3VsPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIC0gPSB1bmRlZmluZWQ7IFRoZSByZWdpc3RlcmVkIG5hbWUgZm9yIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gcHJvcHMudXJsIC0gPSB1bmRlZmluZWQ7IFRoZSB1cmwgdG8gYmUgZmV0Y2hlZC5cbiAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gcHJvcHMubWFwRm4gLSA9IHVuZGVmaW5lZDsgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmZXRjaGVkIHJlc3BvbnNlIGFuZCBiZWhhdmVzIGxpa2UgYW55IG1hcCBtZXRob2QuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcy5ib2R5IC0gPSB1bmRlZmluZWQ7IFRoaXMgd2lsbCB1cGRhdGUgdGhlIG9wdGlvbnMsIGluY2x1ZGluZyBoZWFkZXIgb3B0aW9ucywgc2VudCBhbG9uZyB3aXRoIHRoZSBmZXRjaCByZXF1ZXN0LiBEZWZhdWx0IG9wdGlvbnMgdXNlcyBhIEdFVCByZXF1ZXN0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5BIFZpZXdTdHJlYW0gSW5zdGFuY2UgU2VuZGluZyBBIEZldGNoIFVwZGF0ZSBSZXF1ZXN0PC9oND5cIl1cbiAgICogY29uc3QgYWN0aW9uID0gXCJDSEFOTkVMX0ZFVENIQ0hBTk5FTF9OQU1FX1JFUVVFU1RfRVZFTlRcIjtcbiAgICogY29uc3QgdXJsID0gXCIvL3NpdGUuY29tL2pzb24vXCI7XG4gICAqIGNvbnN0IGJvZHkgPSB7XG4gICAqICAgICBtZXRob2Q6IFwiUE9TVFwiXG4gICAqIH1cbiAgICpcbiAgICogdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbChcIkNIQU5ORUxfRkVUQ0hDSEFOTkVMX05BTUVcIiwge2FjdGlvbiwgdXJsLCBib2R5fSk7XG4gICAqXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUsIHByb3BzID0geyBkaXNhYmxlU2FuaXRpemU6ZmFsc2UgfSkge1xuICAgIC8vIEFMTE9XIEZPUiBHRU5FUklDIE1BUCBQUk9QRVJUWVxuXG4gICAgQ2hhbm5lbEZldGNoLnZhbGlkYXRlTWFwTWV0aG9kKHByb3BzLCBuYW1lKVxuXG4gICAgaWYgKHByb3BzLm1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wcy5tYXBGbiA9IHByb3BzLm1hcFxuICAgIH1cbiAgICBwcm9wcy5leHRlbmRlZEFjdGlvbnNBcnIgPSBbXG4gICAgICBgJHtuYW1lfV9SRVNQT05TRV9FVkVOVGAsXG4gICAgICBgJHtuYW1lfV9FUlJPUl9FVkVOVGAsXG4gICAgICBbYCR7bmFtZX1fUkVRVUVTVF9FVkVOVGAsICdvbkZldGNoVXBkYXRlJ11cbiAgICBdXG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgc3VwZXIobmFtZSwgcHJvcHMpXG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVNYXBNZXRob2QocHJvcHMsIG5hbWUsIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICBjb25zdCBpc05vdEVtcHR5ID0gYXJyID0+IGFyci5sZW5ndGggPj0gMVxuICAgIGNvbnN0IGlzTm90RnVuY3Rpb24gPSB2YWwgPT4gdHlwZW9mICh2YWwpICE9PSAnZnVuY3Rpb24nXG4gICAgY29uc3QgaXNVbmRlZmluZWRPcldyb25nVHlwZSA9IGVpdGhlcihpc05pbCwgaXNOb3RGdW5jdGlvbilcbiAgICBjb25zdCBpc1VuZGVmaW5lZCA9IGFsbChpc1VuZGVmaW5lZE9yV3JvbmdUeXBlKVxuICAgIGNvbnN0IGlzTm90VW5kZWZpbmVkQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzVW5kZWZpbmVkLCBpc05vdEVtcHR5XSlcbiAgICBjb25zdCBtYXBNZXRob2RJc0ludmFsaWQgPSBjb21wb3NlKGlzTm90VW5kZWZpbmVkQW5kSXNOb3RFbXB0eSwgdmFsdWVzLCBwaWNrKFsnbWFwJywgJ21hcEZuJ10pKShwcm9wcylcblxuICAgIGlmIChtYXBNZXRob2RJc0ludmFsaWQpIHtcbiAgICAgIGlmICh0ZXN0TW9kZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWFwIG1ldGhvZCBmb3IgQ2hhbm5lbEZldGNoLCAke25hbWV9LCBhcHBlYXJzIHRvIGJlIGludmFsaWRgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZChwcm9wcyA9IHRoaXMucHJvcHMpIHtcbiAgICBpZiAocHJvcHM/LnBhdXNlICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLnN0YXJ0RmV0Y2goKVxuICAgIH1cbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKG5hbWUpIHtcbiAgICBjb25zdCBhcnIgPSBbXG4gICAgICAnQ0hBTk5FTF9SRVNQT05TRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9FUlJPUl9FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfVVBEQVRFX1JFU1BPTlNFX0VWRU5UJywgJ29uRmV0Y2hVcGRhdGUnXSxcbiAgICAgIFsnQ0hBTk5FTF9GRVRDSF9SRVFVRVNUX0VWRU5UJywgJ29uRmV0Y2hVcGRhdGUnXVxuICAgIF1cblxuICAgIGNvbnN0IGV4dGVuZGVkQXJyID0gY29tcG9zZShkZWZhdWx0VG8oW10pLCBwYXRoKFsncHJvcHMnLCAnZXh0ZW5kZWRBY3Rpb25zQXJyJ10pKVxuICAgIHJldHVybiBhcnIuY29uY2F0KGV4dGVuZGVkQXJyKHRoaXMpKVxuICB9XG5cbiAgc3RhcnRGZXRjaChvcHRpb25zID0ge30sIHN1YnNjcmliZXIgPSB0aGlzLm9uRmV0Y2hSZXR1cm5lZC5iaW5kKHRoaXMpKSB7XG4gICAgY29uc3QgZmV0Y2hQcm9wcyA9IHRoaXMuY29uc29saWRhdGVBbGxGZXRjaFByb3BzKG9wdGlvbnMpXG4gICAgcmV0dXJuIG5ldyBDaGFubmVsRmV0Y2hVdGlsKGZldGNoUHJvcHMsIHN1YnNjcmliZXIsIGZhbHNlLCB0aGlzLnByb3BzLm5hbWUpXG4gIH1cblxuICBvbkZldGNoVXBkYXRlKGV2dCkge1xuICAgIGNvbnN0IHByb3BzT3B0aW9ucyA9IHRoaXMuZ2V0UHJvcHNGb3JGZXRjaChldnQpXG4gICAgdGhpcy5zdGFydEZldGNoKHByb3BzT3B0aW9ucylcbiAgfVxuXG4gIG9uRmV0Y2hSZXR1cm5lZChzdHJlYW1JdGVtKSB7XG4gICAgY29uc3QgaXNGZXRjaEVycm9yID0gc3RyZWFtSXRlbT8uaXNDaGFubmVsRmV0Y2hFcnJvciA9PT0gdHJ1ZVxuICAgIGNvbnN0IGFjdGlvbiA9IGlzRmV0Y2hFcnJvclxuICAgICAgPyBgJHt0aGlzLnByb3BzLm5hbWV9X0VSUk9SX0VWRU5UYFxuICAgICAgOiBgJHt0aGlzLnByb3BzLm5hbWV9X1JFU1BPTlNFX0VWRU5UYFxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ2hhbm5lbFBheWxvYWRJdGVtKHN0cmVhbUl0ZW0sIGFjdGlvbilcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxQYXlsb2FkSXRlbShwYXlsb2FkLCBhY3Rpb24gPSBgJHt0aGlzLnByb3BzLm5hbWV9X1JFU1BPTlNFX0VWRU5UYCkge1xuICAgIGNvbnN0IHsgbmFtZSwgc2VuZENhY2hlZFBheWxvYWQsIHVybCB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSB7IG5hbWUsIHNlbmRDYWNoZWRQYXlsb2FkLCB1cmwgfVxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudClcbiAgfVxuXG4gIGdldFByb3BzRm9yRmV0Y2goZXZ0KSB7XG4gICAgY29uc3QgZGF0YU9iaiA9IGV2dD8ucGF5bG9hZCA/PyBldnQ/LnZpZXdTdHJlYW1JbmZvPy5wYXlsb2FkID8/IHt9XG4gICAgcmV0dXJuIHBpY2soWydtYXBGbicsICd1cmwnLCAnaGVhZGVyJywgJ2JvZHknLCAnbW9kZScsICdtZXRob2QnLCAncmVzcG9uc2VUeXBlJywgJ2RlYnVnJ10sIGRhdGFPYmopXG4gIH1cblxuICBjb25zb2xpZGF0ZUFsbEZldGNoUHJvcHMob3B0aW9ucywgcHJvcHMgPSB0aGlzLnByb3BzKSB7XG4gICAgY29uc3QgcHJvcHNPcHRpb25zID0gcGljayhbJ21hcEZuJywgJ3VybCcsICdoZWFkZXInLCAnYm9keScsICdtb2RlJywgJ2Rpc2FibGVTYW5pdGl6ZScsICdtZXRob2QnLCAncmVzcG9uc2VUeXBlJywgJ2RlYnVnJ10sIHByb3BzKVxuICAgIGNvbnN0IG1lcmdlT3B0aW9ucyA9IChvMSwgbzIpID0+IG1lcmdlRGVlcFJpZ2h0KG8xLCBvMilcbiAgICBjb25zdCBmaWx0ZXJPdXRVbmRlZmluZWQgPSByZWplY3QoaXNOaWwpXG4gICAgcmV0dXJuIGNvbXBvc2UoZmlsdGVyT3V0VW5kZWZpbmVkLCBtZXJnZU9wdGlvbnMpKHByb3BzT3B0aW9ucywgb3B0aW9ucylcbiAgfVxuXG4gIGdldCBvYnNlcnZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlciRcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgbWVyZ2VBbGwsXG4gIGNsb25lLFxuICBmcm9tUGFpcnMsXG4gIHRvUGFpcnMsXG4gIGNvbXBvc2UsXG4gIGluY2x1ZGVzLFxuICBwaWNrQWxsLFxuICBsdGUsXG4gIGRlZmF1bHRUbyxcbiAgcHJvcCxcbiAgaXNcbn0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IHNhZmVDbG9uZSwgc2FmZUNsb25lRGVlcCB9IGZyb20gJy4uL3V0aWxzL3NhZmUtY2xvbmUuanMnXG5cbi8vIHJlYWQtb25seSBmYWNhZGVzIGZvciBjbXMtcHJveGllZCBwYXlsb2FkIHN1YnRyZWVzLCBjYWNoZWQgcGVyIHByb3h5IHNvXG4vLyByZXBlYXRlZCBkaXNwYXRjaGVzIG9mIHRoZSBzYW1lIGNhbm9uaWNhbCBkYXRhIHJldXNlIGEgc2luZ2xlIHdyYXBwZXJcbmNvbnN0IF9yZWFkT25seUZhY2FkZUNhY2hlID0gbmV3IFdlYWtNYXAoKVxuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFBheWxvYWQge1xuICAvKipcbiAgICpcbiAgICogQWxsIENoYW5uZWwgZGF0YSBpcyBwdWJsaXNoZWQgdXNpbmcgdGhpcyBpbnRlcmZhY2UuXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFBheWxvYWRcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gc3JjRWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gY2hhbm5lbE5hbWUgLSA9IHVuZGVmaW5lZDsgVGhlIG5hbWUgb2YgdGhlIENoYW5uZWwgdGhhdCBpcyBzZW5kaW5nIHRoZSBwYXlsb2FkLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYWN0aW9uIC0gPSB1bmRlZmluZWQ7IEFuIGFjdGlvbiBzdHJpbmcgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGhpbiB0aGUgQ2hhbm5lbCdzIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHBheWxvYWQgLSA9IHVuZGVmaW5lZDsgVGhlIGRhdGEgb2JqZWN0LlxuICAgKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50IC0gPSB7fTsgVGhpcyBpcyBwb3B1bGF0ZWQgd2hlbiB0cmlnZ2VyZWQgZnJvbSBhIFZpZXdTdHJlYW0gaW5zdGFuY2UuXG4gICAqIEBwcm9wZXJ0eSB7VUlFdmVudH0gZXZlbnQgLSA9IHVuZGVmaW5lZDsgVGhlIFVJRXZlbnQsIGlmIGFueS5cbiAgICogQHJldHVybnMgVmFsaWRhdGVkIENoYW5uZWxQYXlsb2FkIGpzb24gb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihjaGFubmVsTmFtZSwgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCwgdGltZUxhYmVsKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IGNoYW5uZWxOYW1lXG4gICAgLy8gcGF5bG9hZCA9IENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUocGF5bG9hZCk7XG5cbiAgICBpZiAodGltZUxhYmVsKSB7XG4gICAgICBjb25zb2xlLnRpbWUodGltZUxhYmVsKVxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkSXRlbU9iaiA9IHsgY2hhbm5lbE5hbWUsIGFjdGlvbiwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICAgIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaGFubmVsUGF5bG9hZEl0ZW1PYmosICdwYXlsb2FkJywge2dldDogKCkgPT4gY2xvbmUocGF5bG9hZCl9KTtcbiAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmoucGF5bG9hZCA9IENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUocGF5bG9hZClcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaGVscHMgd2l0aCBkZXN0cnVjdHVyaW5nIGJ5IG1lcmdpbmcgYWxsIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqIEpTT04gT2JqZWN0XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFWyc8aDQ+RGVzdHJ1Y3R1cmluZyBQcm9wZXJ0aWVzIHVzaW5nIHRoZSBDaGFubmVsUGF5bG9hZCBwcm9wcyBNZXRob2Q8L2g0PiddXG4gICAgICogbGV0IHtlbCwgYWN0aW9uLCBteVZhbH0gPSBwYXlsb2FkLnByb3BzKCk7XG4gICAgICpcbiAgICAgKlxuICAgICAqL1xuXG4gICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXlsb2FkLCAncGF5bG9hZCcpKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWRTdHIgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBmb2xsb3dpbmcgcGF5bG9hZCBjb250YWlucyBhIG5lc3RlZCBwYXlsb2FkIHByb3BlcnR5IHdoaWNoIG1heSBjcmVhdGUgY29uZmxpY3RzOiBBY3Rpb246ICR7YWN0aW9ufSwgJHtwYXlsb2FkU3RyfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxBY3Rpb25zQXJyID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldENoYW5uZWxBY3Rpb25zKGNoYW5uZWwpXG5cbiAgICAgIENoYW5uZWxQYXlsb2FkLnZhbGlkYXRlQWN0aW9uKGFjdGlvbiwgY2hhbm5lbCwgY2hhbm5lbEFjdGlvbnNBcnIpXG4gICAgfVxuXG4gICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLmNsb25lID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIG1lcmdlQWxsKFtcbiAgICAgICAgeyBwYXlsb2FkOnNhZmVDbG9uZShjaGFubmVsUGF5bG9hZEl0ZW1PYmoucGF5bG9hZCkgfSxcbiAgICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLnBheWxvYWQsXG4gICAgICAgIHsgY2hhbm5lbDogY2xvbmUoY2hhbm5lbCkgfSxcbiAgICAgICAgeyBldmVudDogY2xvbmUoZXZlbnQpIH0sXG4gICAgICAgIHsgc3JjRWxlbWVudCB9LFxuICAgICAgICBjbG9uZShjaGFubmVsUGF5bG9hZEl0ZW1PYmouc3JjRWxlbWVudCksIHsgYWN0aW9uOiBjbG9uZShjaGFubmVsUGF5bG9hZEl0ZW1PYmouYWN0aW9uKSB9XG4gICAgICBdKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3h5LXByZXNlcnZpbmcgdmVyc2lvbiBvZiBjbG9uZS4gUmV0dXJucyB0aGUgc2FtZSBtZXJnZWQgc2hhcGUsIGJ1dFxuICAgICAqIHRoZSBwYXlsb2FkIGlzIGNvcGllZCB3aXRoIHNhZmVDbG9uZURlZXAsIHNvIGFueSBDTVMgcHJveHkgb2JqZWN0cyDigJRcbiAgICAgKiBhdCB0aGUgcm9vdCBvciBuZXN0ZWQgaW5zaWRlIHBsYWluIGNvbnRhaW5lcnMgb3IgYXJyYXlzIOKAlCBhcmUgcmV2aXZlZFxuICAgICAqIGFzIHdyaXRhYmxlIHByb3h5IGNvcGllcyBpbnN0ZWFkIG9mIGJlaW5nIHN0cmlwcGVkIGJ5IGEgc3RydWN0dXJhbFxuICAgICAqIGNsb25lLiBVc2UgdGhpcyB3aGVuIGEgaGFuZGxlciB0cmVhdHMgdGhlIHBheWxvYWQgYXMgaXRzIGRhdGEgc291cmNlLlxuICAgICAqXG4gICAgICogQHJldHVybnNcbiAgICAgKiBKU09OIE9iamVjdFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVsnPGg0PlJldHJpZXZpbmcgUHJveGllZCBQYXlsb2FkIERhdGE8L2g0PiddXG4gICAgICogb25TdG9yeUV2ZW50KGUpe1xuICAgICAqICAgIGNvbnN0IGRhdGEgPSBlLnNhZmVDbG9uZSgpO1xuICAgICAqICAgIHRoaXMuYWRkU3RvcnlBcnRpY2xlKGRhdGEpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqL1xuICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5zYWZlQ2xvbmUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXZpdmVkUGF5bG9hZCA9IHNhZmVDbG9uZURlZXAoY2hhbm5lbFBheWxvYWRJdGVtT2JqLnBheWxvYWQpXG4gICAgICByZXR1cm4gbWVyZ2VBbGwoW1xuICAgICAgICB7IHBheWxvYWQ6IHJldml2ZWRQYXlsb2FkIH0sXG4gICAgICAgIHJldml2ZWRQYXlsb2FkLFxuICAgICAgICB7IGNoYW5uZWwgfSxcbiAgICAgICAgeyBldmVudCB9LFxuICAgICAgICB7IHNyY0VsZW1lbnQgfSxcbiAgICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLnNyY0VsZW1lbnQsXG4gICAgICAgIHsgYWN0aW9uOiBjaGFubmVsUGF5bG9hZEl0ZW1PYmouYWN0aW9uIH1cbiAgICAgIF0pXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMgPSB7XG4gICAgICAkZGlyOiB7XG4gICAgICAgIGdldDogKCkgPT4gY2hhbm5lbFBheWxvYWRJdGVtT2JqLl9kaXIsXG4gICAgICAgIHNldDogKHZhbCkgPT4ge1xuICAgICAgICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5fZGlyID0gdmFsXG4gICAgICAgICAgcmV0dXJuIHZhbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5uZWwgPT09ICdDSEFOTkVMX1JPVVRFJykge1xuICAgICAgLy8gY2hhbm5lbFBheWxvYWRJdGVtT2JqWydsb2NhdGlvbiddID0gQ2hhbm5lbFBheWxvYWQuZ2V0TG9jYXRpb25EYXRhKCk7XG4gICAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcy5sb2NhdGlvbiA9IHtcbiAgICAgICAgZ2V0OiAoKSA9PiBDaGFubmVsUGF5bG9hZC5nZXRMb2NhdGlvbkRhdGEoKVxuICAgICAgfVxuICAgICAgLyogY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHNbJ3JvdXRlRGF0YSddID0ge1xuICAgICAgICBnZXQ6ICgpPT5wcm9wKCdyb3V0ZURhdGEnLCBmcm96ZW5QYXlsb2FkKVxuICAgICAgfVxuKi9cbiAgICB9XG5cbiAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmouX2RpciA9IHVuZGVmaW5lZFxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2hhbm5lbFBheWxvYWRJdGVtT2JqLCBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcylcblxuICAgIGlmICh0aW1lTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUudGltZUVuZCh0aW1lTGFiZWwpXG4gICAgfVxuICAgIHJldHVybiBjaGFubmVsUGF5bG9hZEl0ZW1PYmpcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUFjdGlvbihhY3Rpb24sIGNoYW5uZWwsIGFycikge1xuICAgIGNvbnN0IGlzSW5BcnIgPSBpbmNsdWRlcyhhY3Rpb24sIGFycilcbiAgICBpZiAoaXNJbkFyciA9PT0gZmFsc2UgJiYgU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYHdhcm5pbmc6IEFjdGlvbjogJyR7YWN0aW9ufScgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aGluIHRoZSAke2NoYW5uZWx9IGNoYW5uZWwhYClcbiAgICB9XG4gICAgcmV0dXJuIGlzSW5BcnJcbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvbkRhdGEoKSB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbXNBcnIgPSBbXG4gICAgICAnaHJlZicsXG4gICAgICAnb3JpZ2luJyxcbiAgICAgICdwcm90b2NvbCcsXG4gICAgICAnaG9zdCcsXG4gICAgICAnaG9zdG5hbWUnLFxuICAgICAgJ3BvcnQnLFxuICAgICAgJ3BhdGhuYW1lJyxcbiAgICAgICdzZWFyY2gnLFxuICAgICAgJ2hhc2gnXVxuICAgIHJldHVybiBwaWNrQWxsKGxvY2F0aW9uUGFyYW1zQXJyLCB3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0U3RyZWFtSXRlbSgpIHtcblxuICB9XG5cbiAgc3RhdGljIGRlZXBDbG9uZShvKSB7XG4gICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSlcbiAgICBjb25zdCBpc09iaiA9IGlzKE9iamVjdClcbiAgICBjb25zdCBpc0l0ZXIgPSBvYiA9PiBpc0FycihvYikgPT09IGZhbHNlICYmIGlzT2JqKG9iKSA9PT0gdHJ1ZVxuICAgIGNvbnN0IGlzSXRlcmFibGUgPSBpc0l0ZXIobylcbiAgICByZXR1cm4gaXNJdGVyYWJsZSA/IGNvbXBvc2UoZnJvbVBhaXJzLCB0b1BhaXJzLCBjbG9uZSkobykgOiBjbG9uZShvKVxuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIGEgQ01TLXByb3hpZWQgcGF5bG9hZCBzdWJ0cmVlIGluIGEgcmVhZC1vbmx5IGZhY2FkZS4gUGF5bG9hZHMgYXJlXG4gICAqIHJlZmVyZW5jZS1ieS13aXJlIChldmVyeSBzdWJzY3JpYmVyIHNoYXJlcyB0aGUgc2FtZSBvYmplY3QpLCBhbmQgZnJlZXppbmdcbiAgICogYSBwcm94eSB3b3VsZCBmcmVlemUgdGhlIENBTk9OSUNBTCBjbXMgdGFyZ2V0IGZvciB0aGUgd2hvbGUgYXBwIOKAlCBzb1xuICAgKiBpbnN0ZWFkIHRoZSBwYXlsb2FkIGJvdW5kYXJ5IGdldHMgYSBsaWdodHdlaWdodCBzZWNvbmQgcHJveHkgdGhhdCBibG9ja3NcbiAgICogd3JpdGVzIHdoaWxlIHJlYWRzIChhbmQgbmVzdGVkIHJlYWRzKSBwYXNzIHRocm91Z2guIENvbnN1bWVycyB0aGF0IG5lZWRcbiAgICogYSB3cml0YWJsZSBjb3B5IGNhbGwgZS5zYWZlQ2xvbmUoKS4gRmFjYWRlcyBhcmUgY2FjaGVkIHBlciBwcm94eSBzb1xuICAgKiByZXBlYXRlZCBkaXNwYXRjaGVzIG9mIHRoZSBzYW1lIGRhdGEgcmV1c2Ugb25lIHdyYXBwZXIuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlUmVhZE9ubHlQcm94eUZhY2FkZShwcm94eU9iaikge1xuICAgIGlmIChfcmVhZE9ubHlGYWNhZGVDYWNoZS5oYXMocHJveHlPYmopKSB7XG4gICAgICByZXR1cm4gX3JlYWRPbmx5RmFjYWRlQ2FjaGUuZ2V0KHByb3h5T2JqKVxuICAgIH1cblxuICAgIGNvbnN0IHdhcm5CbG9ja2VkV3JpdGUgPSAocHJvcE5hbWUpID0+IHtcbiAgICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBibG9ja2VkIHdyaXRlIG9mICcke1N0cmluZyhwcm9wTmFtZSl9JyBvbiByZWFkLW9ubHkgY2hhbm5lbCBwYXlsb2FkIGRhdGE7IHVzZSBlLnNhZmVDbG9uZSgpIGZvciBhIHdyaXRhYmxlIGNvcHlgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWUgLy8gc2lsZW50IG5vLW9wOyByZXR1cm5pbmcgZmFsc2Ugd291bGQgdGhyb3cgaW4gc3RyaWN0IG1vZGVcbiAgICB9XG5cbiAgICBjb25zdCBmYWNhZGUgPSBuZXcgUHJveHkocHJveHlPYmosIHtcbiAgICAgIGdldCh0YXJnZXQsIHByb3BOYW1lKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRhcmdldFtwcm9wTmFtZV1cbiAgICAgICAgLy8gbmVzdGVkIGNtcyBjb250YWluZXJzIGFyZSBwcm94aWVzIHRoZW1zZWx2ZXMg4oCUIHdyYXAgdGhlbSBzbyBkZWVwXG4gICAgICAgIC8vIHdyaXRlcyBhcmUgYmxvY2tlZCB0b28gKGNhY2hlZCwgc28gcmVwZWF0IHJlYWRzIHJldXNlIHRoZSBmYWNhZGUpXG4gICAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsLl9fcHJveHlfX2lzUHJveHkgPT09IHRydWUpIHtcbiAgICAgICAgICByZXR1cm4gQ2hhbm5lbFBheWxvYWQuY3JlYXRlUmVhZE9ubHlQcm94eUZhY2FkZSh2YWwpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbFxuICAgICAgfSxcbiAgICAgIHNldCh0YXJnZXQsIHByb3BOYW1lKSB7XG4gICAgICAgIHJldHVybiB3YXJuQmxvY2tlZFdyaXRlKHByb3BOYW1lKVxuICAgICAgfSxcbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHdhcm5CbG9ja2VkV3JpdGUocHJvcE5hbWUpXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wTmFtZSkge1xuICAgICAgICByZXR1cm4gd2FybkJsb2NrZWRXcml0ZShwcm9wTmFtZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgX3JlYWRPbmx5RmFjYWRlQ2FjaGUuc2V0KHByb3h5T2JqLCBmYWNhZGUpXG4gICAgcmV0dXJuIGZhY2FkZVxuICB9XG5cbiAgc3RhdGljIGRlZXBGcmVlemUobykge1xuICAgIC8vIHJldHVybiBvO1xuICAgIC8vIHJldHVybiBPYmplY3QuZnJlZXplKG8pO1xuICAgIGNvbnN0IGVsSXNEb21FbGVtZW50ID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG5cbiAgICAvLyBDTVMgcHJveHkgc3VidHJlZXMgYXJlIE5PVCBmcm96ZW4gKHRoYXQgd291bGQgZnJlZXplIHRoZSBjYW5vbmljYWwgY21zXG4gICAgLy8gdGFyZ2V0IGFwcC13aWRlKSDigJQgdGhleSBhcmUgd3JhcHBlZCBpbiBhIHJlYWQtb25seSBmYWNhZGUgaW5zdGVhZCwgc29cbiAgICAvLyB0aGUgcGF5bG9hZCBpbW11dGFiaWxpdHkgY29udHJhY3QgaG9sZHMgd2l0aG91dCBjb3BpZXNcbiAgICBpZiAobyAhPT0gbnVsbCAmJiB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgby5fX3Byb3h5X19pc1Byb3h5ID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gQ2hhbm5lbFBheWxvYWQuY3JlYXRlUmVhZE9ubHlQcm94eUZhY2FkZShvKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBjaGlsZHJlbiBmaXJzdDogcHJveHkgc3VidHJlZXMgbXVzdCBiZSBzd2FwcGVkIGZvciB0aGVpciBmYWNhZGVzXG4gICAgICAvLyBCRUZPUkUgdGhlIHBhcmVudCBpcyBmcm96ZW4sIG9yIHRoZSBhc3NpZ25tZW50IHdvdWxkIGJlIHJlamVjdGVkXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgY29uc3QgdmFsID0gb1twcm9wXVxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHByb3ApICYmXG4gICAgICAgICAgICBlbElzRG9tRWxlbWVudCh2YWwpID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgdmFsICE9PSBudWxsICYmXG4gICAgICAgICAgICAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAgICAgICAgICFPYmplY3QuaXNGcm96ZW4odmFsKSkge1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUodmFsKVxuICAgICAgICAgIGlmIChwcm9jZXNzZWQgIT09IHZhbCkge1xuICAgICAgICAgICAgb1twcm9wXSA9IHByb2Nlc3NlZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIE9iamVjdC5mcmVlemUobylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkZSRUVaRSBFUlIgXCIse28sZX0pO1xuICAgICAgcmV0dXJuIG9cbiAgICB9XG5cbiAgICByZXR1cm4gb1xuICB9XG5cbiAgc3RhdGljIGdldE1vdXNlRXZlbnRLZXlzKCkge1xuICAgIHJldHVybiBbJ2FsdEtleScsICdidWJibGVzJywgJ2NhbmNlbEJ1YmJsZScsICdjYW5jZWxhYmxlJywgJ2NsaWVudFgnLCAnY2xpZW50WScsICdjb21wb3NlZCcsICdjdHJsS2V5JywgJ2N1cnJlbnRUYXJnZXQnLCAnZGVmYXVsdFByZXZlbnRlZCcsICdkZXRhaWwnLCAnZXZlbnRQaGFzZScsICdmcm9tRWxlbWVudCcsICdpc1RydXN0ZWQnLCAnbGF5ZXJYJywgJ2xheWVyWScsICdtZXRhS2V5JywgJ21vdmVtZW50WCcsICdtb3ZlbWVudFknLCAnb2Zmc2V0WCcsICdvZmZzZXRZJywgJ3BhZ2VYJywgJ3BhZ2VZJywgJ3BhdGgnLCAncmVsYXRlZFRhcmdldCcsICdyZXR1cm5WYWx1ZScsICdzY3JlZW5YJywgJ3NjcmVlblknLCAnc2hpZnRLZXknLCAnc291cmNlQ2FwYWJpbGl0aWVzJywgJ3NyY0VsZW1lbnQnLCAndGFyZ2V0JywgJ3RpbWVTdGFtcCcsICd0b0VsZW1lbnQnLCAndHlwZScsICd2aWV3JywgJ3doaWNoJywgJ3gnLCAneSddXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFN1YmplY3QsIFJlcGxheVN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGluY2x1ZGVzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBkZWxheUNhbGwgfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsUHJveHkgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFByb3h5XG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICpcbiAgICogQGRlc2NcbiAgICogQSBwcm94eSBjaGFubmVsIGlzIGNyZWF0ZWQgd2hlbiBhIGNoYW5uZWwgaXMgc3Vic2NyaWJlZCB0byBiZWZvcmUgaXQgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIHByb3BzID0ge30pIHtcbiAgICBwcm9wcy5pc1Byb3h5ID0gdHJ1ZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICAgIHRoaXMuc3ViamVjdCQgPSBuZXcgU3ViamVjdCgpXG4gICAgdGhpcy5yZXBsYXlTdWIkID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9ic2VydmVyJCA9IG1lcmdlKHRoaXMuc3ViamVjdCQsIHRoaXMucmVwbGF5U3ViJClcbiAgICBjb25zdCBpc0Rldk1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXMuZGVidWdcbiAgICBpZiAoaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5KG5hbWUpXG4gICAgfVxuICB9XG5cbiAgZ2V0TWVyZ2VkU3ViamVjdChwZXJpc3REYXRhID0gZmFsc2UpIHtcbiAgICByZXR1cm4gcGVyaXN0RGF0YSA9PT0gdHJ1ZSA/IHRoaXMucmVwbGF5U3ViJCA6IHRoaXMuc3ViamVjdCRcbiAgfVxuXG4gIGNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5KGNoYW5uZWxOYW1lKSB7XG4gICAgY29uc3QgbmFtZSA9IGNoYW5uZWxOYW1lXG5cbiAgICBjb25zdCBjaGVja0lmUHJveHkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBib29sID0gaW5jbHVkZXMobmFtZSwgU3B5bmVBcHBQcm9wZXJ0aWVzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoKSlcbiAgICAgIGlmIChib29sICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGNoYW5uZWwsICR7bmFtZX0gZG9lcyBub3QgYXBwZWFyIHRvIGJlIHJlZ2lzdGVyZWQhYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWxheUNhbGwoY2hlY2tJZlByb3h5LCAxMDAwKVxuICB9XG5cbiAgZ2V0IHJlcGxheVN1YmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGF5U3ViJFxuICB9XG5cbiAgZ2V0IHN1YmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdCRcbiAgfVxufVxuIiwiaW1wb3J0IHsgcmVnaXN0ZXJlZFN0cmVhbU5hbWVzIH0gZnJvbSAnLi9jaGFubmVscy1jb25maWcuanMnXG5pbXBvcnQgeyBDaGFubmVsUGF5bG9hZCB9IGZyb20gJy4vY2hhbm5lbC1wYXlsb2FkLWNsYXNzLmpzJ1xuaW1wb3J0IHsgc2FmZUNsb25lRGVlcCB9IGZyb20gJy4uL3V0aWxzL3NhZmUtY2xvbmUuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFJvdXRlQ2hhbm5lbFVwZGF0ZXIgfSBmcm9tICcuLi91dGlscy9yb3V0ZS1jaGFubmVsLXVwZGF0ZXIuanMnXG5cbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YmplY3QsIGZvcmtKb2luLCBFTVBUWSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgdGFrZSwgY29tYmluZUxhdGVzdFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7XG4gIGlmRWxzZSxcbiAgaWRlbnRpdHksXG4gIGhlYWQsXG4gIG1lcmdlQWxsLFxuICBvYmpPZixcbiAgdmlldyxcbiAgaXMsXG4gIGNoYWluLFxuICBsZW5zSW5kZXgsXG4gIGFsd2F5cyxcbiAgZnJvbVBhaXJzLFxuICBwYXRoLFxuICBpc0VtcHR5LFxuICBlcXVhbHMsXG4gIHByb3AsXG4gIHByb3BFcVxuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGUgQ2hhbm5lbCBjb21wb25lbnQgd3JhcHMgbWV0aG9kcyBhbmQgZnVuY3Rpb25hbGl0eSBhcm91bmQgYW4gUnhKcyBTdWJqZWN0LCB0byBjcmVhdGUgYSBvbmUtd2F5IGRhdGEgZmxvdyBiZXR3ZWVuIGl0c2VsZiBhbmQgb3RoZXIgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW1zLjwvcD5cbiAgICogPHA+Q2hhbm5lbHMgZ2V0IGRhdGEgYnkgaW1wb3J0aW5nIGpzb24gb2JqZWN0cywgc3Vic2NyaWJpbmcgdG8gb3RoZXIgQ2hhbm5lbHMgYW5kIGJ5IHBhcnNpbmcgVmlld1N0cmVhbSBpbmZvLjwvcD5cbiAgICogPGgzPlRoZSBCYXNpYyBDaGFubmVsIFN0cnVjdHVyZTwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNoYW5uZWxzIHJlcXVpcmVzIGEgdW5pcXVlIG5hbWUsIGZvciBleGFtcGxlLCA8Yj5DSEFOTkVMX01ZQ0hBTk5FTDwvYj4sIHdoaWNoIGNvbXBvbmVudHMgdXNlIHRvIHNlbGVjdCBhbmQgc3Vic2NyaWJlIHRvIGFueSBjaGFubmVsLjwvbGk+XG4gICAqIDxsaT5DaGFubmVscyBhcmUgaW5zdGFudGlhdGVkIGFuZCAncmVnaXN0ZXJlZCcgd2l0aCB0aGUgTElOS1snU3B5bmVBcHAnLCAnc3B5bmUtYXBwJ10uPC9saT5cbiAgICogPGxpPkNoYW5uZWxzIHJlbWFpbiBwZXJzaXN0ZW50IGFuZCBhcmUgbm90IGRlbGV0ZWQuPC9saT5cbiAgICogPC91bD5cbiAgICogPGgzPkNvbXBvbmVudHMgdGhhdCBleHRlbmQgQ2hhbm5lbDwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPlRoZSBmb3VyIFNweW5lIENoYW5uZWxzLCBMSU5LWydTcHluZUNoYW5uZWxVSScsICdzcHluZS1jaGFubmVsLXUtaSddLCBMSU5LWydTcHluZUNoYW5uZWxXaW5kb3cnLCAnc3B5bmUtY2hhbm5lbC13aW5kb3cnXSwgTElOS1snU3B5bmVDaGFubmVsUm91dGUnLCAnc3B5bmUtY2hhbm5lbC1yb3V0ZSddIGFuZCBMSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgYWxsIGV4dGVuZCBDaGFubmVsLjwvbGk+XG4gICAqIDxsaT5DaGFubmVsRmV0Y2ggYWxzbyBleHRlbmRzIENoYW5uZWwsIGFkZHMgYSBDaGFubmVsRmV0Y2hVdGlsIGNvbXBvbmVudCB0byBpbW1lZGlhdGVseSBwdWJsaXNoIGZldGNoZWQgcmVzcG9uc2VzLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIDxoMz5TZW5kaW5nIENoYW5uZWxQYXlsb2FkczwvaDM+XG4gICAqICAgPHA+Q2hhbm5lbHMgc2VuZCBkYXRhIHVzaW5nIHRoZSA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cImNoYW5uZWwtc2VuZC1jaGFubmVsLXBheWxvYWRcIiAgaHJlZj1cIi9ndWlkZS9yZWZlcmVuY2UvY2hhbm5lbC1zZW5kLWNoYW5uZWwtcGF5bG9hZFwiID5zZW5kQ2hhbm5lbFBheWxvYWQ8L2E+XG4gICBtZXRob2QuPC9wPlxuICAgKlxuICAgKlxuICAgKiA8aDM+UmVjZWl2aW5nIERhdGEgZnJvbSBWaWV3U3RyZWFtIEluc3RhbmNlczwvaDM+XG4gICAqIDxwPlZpZXdTdHJlYW1zIGNhbiBzZW5kIGRhdGEgdG8gYW55IGN1c3RvbSBjaGFubmVsIHVzaW5nIHRoZSA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cInZpZXctc3RyZWFtLXNlbmQtaW50by10by1jaGFubmVsXCIgIGhyZWY9XCIvZ3VpZGUvcmVmZXJlbmNlL3ZpZXctc3RyZWFtLXNlbmQtaW5mby10by1jaGFubmVsXCIgPnNlbmRJbmZvVG9DaGFubmVsPC9hPlxuICAgbWV0aG9kLiBDaGFubmVscyBjYW0gbGlzdGVuIHRvIGFueSBWaWV3U3RyZWFtIGRhdGEgZGlyZWN0ZWQgdG8gaXRzZWxmIHRocm91Z2ggdGhlIGRlZmF1bHQgbWV0aG9kLCA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cImNoYW5uZWwtb24tdmlldy1zdHJlYW0taW5mb1wiICBocmVmPVwiL2d1aWRlL3JlZmVyZW5jZS9jaGFubmVsLW9uLXZpZXctc3RyZWFtLWluZm9cIiA+b25WaWV3U3RyZWFtSW5mbzwvYT4uIDwvcD5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+UmVnaXN0ZXJpbmcgYSBOZXcgQ2hhbm5lbCBJbnN0YW5jZTwvaDQ+XCJdXG4gICAqIFNweW5lQXBwLnJlZ2lzdGVyKG5ldyBDaGFubmVsKFwiQ0hBTk5FTF9NWUNIQU5ORUxcIik7XG4gICAqXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ0hBTk5FTF9OQU1FXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGlzIGpzb24gb2JqZWN0IHRha2VzIGluIHBhcmFtZXRlcnMgdG8gaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSB1bmRlZmluZWQ7IFRoaXMgd2lsbCBiZSB0aGUgcmVnaXN0ZXJlZCBuYW1lIGZvciB0aGlzIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcyAtID0ge307IFRoZSBwcm9wcyBvYmplY3RzIGFsbG93cyBmb3IgY3VzdG9tIHByb3BlcnRpZXMgZm9yIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgLSA9IGZhbHNlOyBQdWJsaXNoZXMgaXRzIG1vc3QgY3VycmVudCBwYXlsb2FkIHRvIGxhdGUgc3Vic2NyaWJlcnMsIHdoZW4gc2V0IHRvIHRydWUuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihDSEFOTkVMX05BTUUsIHByb3BzID0ge30pIHtcbiAgICB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zLmJpbmQodGhpcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKENIQU5ORUxfTkFNRSwgcHJvcHMuZXh0ZW5kZWRBY3Rpb25zQXJyKVxuXG4gICAgLy8gQmFzaWMgcHJvcHMgc2V0dXBcbiAgICBwcm9wcy5uYW1lID0gQ0hBTk5FTF9OQU1FXG4gICAgcHJvcHMuZGVmYXVsdEFjdGlvbnMgPSBwcm9wcy5kYXRhICE9PSB1bmRlZmluZWQgPyBbYCR7cHJvcHMubmFtZX1fRVZFTlRgXSA6IFtdXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG5cbiAgICB0aGlzLnByb3BzLmlzUmVnaXN0ZXJlZCA9IGZhbHNlXG4gICAgdGhpcy5wcm9wcy5pc1Byb3h5ID1cbiAgICAgIHRoaXMucHJvcHMuaXNQcm94eSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLnByb3BzLmlzUHJveHlcblxuICAgIC8vIERldGVybWluZSBhIGRlZmF1bHQgZnJvbSBwcmVzZW5jZSBvZiBwcm9wcy5kYXRhXG4gICAgY29uc3QgZGVmYXVsdENhY2hlZFBheWxvYWRCb29sID0gdGhpcy5wcm9wcy5kYXRhICE9PSB1bmRlZmluZWRcblxuICAgIC8vIElmIHByb3BzLnJlcGxheSBpcyBkZWZpbmVkLCBvdmVycmlkZSBzZW5kQ2FjaGVkUGF5bG9hZCB3aXRoIGl0LlxuICAgIC8vIE90aGVyd2lzZSwgdXNlIHRoZSBleGlzdGluZyBzZW5kQ2FjaGVkUGF5bG9hZCBwcm9wZXJ0eSBvciBkZWZhdWx0LlxuICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5yZXBsYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gdGhpcy5wcm9wcy5yZXBsYXlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9XG4gICAgICAgIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gZGVmYXVsdENhY2hlZFBheWxvYWRCb29sXG4gICAgICAgICAgOiB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsID0gbmV3IFJvdXRlQ2hhbm5lbFVwZGF0ZXIodGhpcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25NZXRob2RzKClcblxuICAgIC8vIFNldCB1cCBzdHJlYW1zXG4gICAgdGhpcy5zdHJlYW1zQ29udHJvbGxlciA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcFxuICAgIGNvbnN0IG9ic2VydmVyJCA9IHRoaXMuZ2V0TWFpbk9ic2VydmVyKClcbiAgICB0aGlzLmNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlID0gQ2hhbm5lbC5jaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5vYnNlcnZlciQgPSB0aGlzLnByb3BzLm9ic2VydmVyID0gb2JzZXJ2ZXIkXG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gRElTUEFUQ0hFUlxuICAgIGNvbnN0IGRpc3BhdGNoZXJTdHJlYW0kID0gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRTdHJlYW0oJ0RJU1BBVENIRVInKVxuICAgIGNvbnN0IHBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSA9IHByb3BFcShwcm9wcy5uYW1lLCAnbmFtZScpXG4gICAgZGlzcGF0Y2hlclN0cmVhbSRcbiAgICAgIC5waXBlKGZpbHRlcihwYXlsb2FkUHJlZEJ5Q2hhbm5lbE5hbWUpKVxuICAgICAgLnN1YnNjcmliZSgodmFsKSA9PiB0aGlzLm9uUmVjZWl2ZWRPYnNlcnZhYmxlKHZhbCkpXG4gIH1cblxuICBnZXRNYWluT2JzZXJ2ZXIoKSB7XG4gICAgaWYgKHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgZm9sbG93aW5nIGNoYW5uZWwsICR7dGhpcy5wcm9wcy5uYW1lfSwgYXBwZWFycyB0byBiZSByZWdpc3RlcmVkIGJlZm9yZSBTcHluZSBoYXMgYmVlbiBpbml0aWFsaXplZC5gKVxuICAgIH1cblxuICAgIGNvbnN0IHByb3h5RXhpc3RzID0gdGhpcy5zdHJlYW1zQ29udHJvbGxlci50ZXN0U3RyZWFtKHRoaXMucHJvcHMubmFtZSlcblxuICAgIGlmIChwcm94eUV4aXN0cyA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIuZ2V0UHJveHlTdWJqZWN0KHRoaXMucHJvcHMubmFtZSwgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPT09IHRydWUgPyBuZXcgUmVwbGF5U3ViamVjdCgxKSA6IG5ldyBTdWJqZWN0KClcbiAgICB9XG4gIH1cblxuICAvLyAgT1ZFUlJJREUgSU5JVElBTElaQVRJT04gTUVUSE9EXG4gIC8qKlxuICAgKiA8cD4oRGVwcmVjYXRlZC4gVXNlIG9uUmVnaXN0ZXJlZCkuIFRoaXMgbWV0aG9kIGlzIGVtcHR5IGFuZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgQ2hhbm5lbCBoYXMgYmVlbiByZWdpc3RlcmVkLjwvcD5cbiAgICogPHA+VGFza3Mgc3VjaCBhcyBzdWJzY3JpYmluZyB0byBvdGhlciBjaGFubmVscywgYW5kIHNlbmRpbmcgaW5pdGlhbCBwYXlsb2FkcyBjYW4gYmUgYWRkZWQgaGVyZS48L3A+XG4gICAqL1xuICBvbkNoYW5uZWxJbml0aWFsaXplZCgpIHtcblxuICB9XG5cbiAgLy8gIE9WRVJSSURFIElOSVRJQUxJWkFUSU9OIE1FVEhPRFxuICAvKipcbiAgICogPHA+VGhpcyBtZXRob2QgaXMgZW1wdHkgYW5kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBDaGFubmVsIGhhcyBiZWVuIHJlZ2lzdGVyZWQuPC9wPlxuICAgKiA8cD5UYXNrcyBzdWNoIGFzIHN1YnNjcmliaW5nIHRvIG90aGVyIGNoYW5uZWxzLCBhbmQgc2VuZGluZyBpbml0aWFsIHBheWxvYWRzIGNhbiBiZSBhZGRlZCBoZXJlLjwvcD5cbiAgICovXG4gIG9uUmVnaXN0ZXJlZChwcm9wcyA9IHRoaXMucHJvcHMpIHtcbiAgICBpZiAocHJvcHMuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBPYmplY3Qua2V5cyh0aGlzLmNoYW5uZWxBY3Rpb25zKVswXVxuICAgICAgLy8gY29uc29sZS5sb2coXCJDSEFOTkVMUyBBQ1RJT05TIElTIFwiLHRoaXMuY2hhbm5lbEFjdGlvbnMpO1xuICAgICAgLy8gT2JqZWN0KHRoaXMuY2hhbm5lbEFjdGlvbnMpLmtleXNbMF07XG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHByb3BzLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzUHJveHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaXNQcm94eVxuICB9XG5cbiAgZ2V0IGNoYW5uZWxOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLm5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKiByZXR1cm5zIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBmb3IgdGhlIGNoYW5uZWxcbiAgICovXG4gIGdldCBvYnNlcnZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlciRcbiAgfVxuXG4gIGNoZWNrRm9yVHJhaXRzKCkge1xuICAgIGNvbnN0IGFkZFRyYWl0cyA9ICh0cmFpdHMpID0+IHtcbiAgICAgIGlmICh0cmFpdHMuY29uc3RydWN0b3IubmFtZSAhPT0gJ0FycmF5Jykge1xuICAgICAgICB0cmFpdHMgPSBbdHJhaXRzXVxuICAgICAgfVxuICAgICAgY29uc3QgYWRkVHJhaXQgPSAoVHJhaXRDbGFzcykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFRyYWl0Q2xhc3ModGhpcylcbiAgICAgIH1cblxuICAgICAgdHJhaXRzLmZvckVhY2goYWRkVHJhaXQpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMudHJhaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFkZFRyYWl0cyh0aGlzLnByb3BzLnRyYWl0cylcbiAgICB9XG4gIH1cblxuICAvLyBETyBOT1QgT1ZFUlJJREUgVEhJUyBNRVRIT0RcbiAgaW5pdGlhbGl6ZVN0cmVhbSgpIHtcbiAgICB0aGlzLmNoZWNrRm9yVHJhaXRzKClcbiAgICB0aGlzLm9uQ2hhbm5lbEluaXRpYWxpemVkKClcbiAgICB0aGlzLmNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlKClcbiAgICB0aGlzLm9uUmVnaXN0ZXJlZCgpXG4gICAgdGhpcy5wcm9wcy5pc1JlZ2lzdGVyZWQgPSB0cnVlXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUocHJvcHMgPSB0aGlzLnByb3BzLCBhY3Rpb25zT2JqID0gdGhpcy5jaGFubmVsQWN0aW9ucykge1xuICAgIGNvbnN0IGFjdGlvbnNPYmpJc0VtcHR5ID0gaXNFbXB0eShhY3Rpb25zT2JqKVxuICAgIGNvbnN0IGRhdGFJc0FkZGVkID0gcHJvcCgnZGF0YScsIHByb3BzKSAhPT0gdW5kZWZpbmVkXG4gICAgY29uc3QgYXV0b1NldFRvQ2FjaGVkUGF5bG9hZCA9IGFjdGlvbnNPYmpJc0VtcHR5ID09PSB0cnVlICYmIGRhdGFJc0FkZGVkID09PSB0cnVlXG4gICAgY29uc3Qgc2V0RGVmYXVsdEFjdGlvbnNPYmogPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IG5hbWUgfSA9IHByb3BzXG4gICAgICBjb25zdCBhY3Rpb25TdHIgPSBgJHtuYW1lfV9FVkVOVGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFthY3Rpb25TdHJdIDogYWN0aW9uU3RyXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF1dG9TZXRUb0NhY2hlZFBheWxvYWQpIHtcbiAgICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gdHJ1ZVxuICAgICAgYWN0aW9uc09iaiA9IHNldERlZmF1bHRBY3Rpb25zT2JqKClcblxuICAgICAgaWYgKHRoaXMuY2hhbm5lbEFjdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNoYW5uZWxBY3Rpb25zID0gYWN0aW9uc09ialxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKFwiUFJPUFMgSVMgXCIse2FjdGlvbnNPYmpJc0VtcHR5LCBkYXRhSXNBZGRlZCwgcHJvcHMsIGFjdGlvbnNPYmp9LCB0aGlzLmNoYW5uZWxBY3Rpb25zKVxuICAgIHJldHVybiB7IHByb3BzLCBhY3Rpb25zT2JqIH1cbiAgfVxuXG4gIHNldFRyYWNlKGJvb2wpIHtcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKG5hbWUsIGV4dGVuZGVkQWN0aW9uc0FyciA9IFtdKSB7XG4gICAgY29uc3QgZ2V0QWN0aW9uVmFsID0gaWZFbHNlKGlzKFN0cmluZyksIGlkZW50aXR5LCBoZWFkKVxuICAgIGNvbnN0IG1haW5BcnIgPSBleHRlbmRlZEFjdGlvbnNBcnIuY29uY2F0KHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMobmFtZSkpXG4gICAgY29uc3QgYXJyID0gck1hcChnZXRBY3Rpb25WYWwsIG1haW5BcnIpXG4gICAgY29uc3QgY29udmVydGVyID0gc3RyID0+IG9iak9mKHN0ciwgc3RyKVxuICAgIGNvbnN0IG9iaiA9IG1lcmdlQWxsKGNoYWluKGNvbnZlcnRlciwgYXJyKSlcbiAgICB0aGlzLmNoYW5uZWxBY3Rpb25zID0gb2JqXG4gIH1cblxuICBjcmVhdGVDaGFubmVsQWN0aW9uTWV0aG9kcygpIHtcbiAgICBjb25zdCBkZWZhdWx0Rm4gPSAnb25WaWV3U3RyZWFtSW5mbydcbiAgICBjb25zdCBnZXRBY3Rpb25WYWwgPSBpZkVsc2UoaXMoU3RyaW5nKSwgaWRlbnRpdHksIGhlYWQpXG4gICAgY29uc3QgZGVsYXlDaGVja0lmVHJhaXRNZXRob2RIYXNCZWVuQWRkZWQgPSAobWV0aG9kU3RyLCB2YWwpID0+IHtcbiAgICAgIGNvbnN0IGRlbGF5ZXIgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpc1ttZXRob2RTdHJdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBcIiR7dGhpcy5wcm9wcy5uYW1lfVwiLCBSRVFVSVJFUyBUSEUgRk9MTE9XSU5HIE1FVEhPRCAke21ldGhvZFN0cn0gRk9SIEFDVElPTiwgJHt2YWxbMF19YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2luZG93LnNldFRpbWVvdXQoZGVsYXllciwgMTAwKVxuICAgIH1cblxuICAgIGNvbnN0IGdldEN1c3RvbU1ldGhvZCA9IHZhbCA9PiB7XG4gICAgICBjb25zdCBtZXRob2RTdHIgPSB2aWV3KGxlbnNJbmRleCgxKSwgdmFsKVxuICAgICAgZGVsYXlDaGVja0lmVHJhaXRNZXRob2RIYXNCZWVuQWRkZWQobWV0aG9kU3RyLCB2YWwpXG4gICAgICByZXR1cm4gbWV0aG9kU3RyXG4gICAgfVxuXG4gICAgY29uc3QgZ2V0QXJyTWV0aG9kID0gIGlmRWxzZShpcyhTdHJpbmcpLCBhbHdheXMoZGVmYXVsdEZuKSwgZ2V0Q3VzdG9tTWV0aG9kKVxuXG4gICAgY29uc3QgY3JlYXRlT2JqID0gdmFsID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGdldEFjdGlvblZhbCh2YWwpXG4gICAgICBjb25zdCBtZXRob2QgPSAgZ2V0QXJyTWV0aG9kKHZhbClcbiAgICAgIHJldHVybiBba2V5LCBtZXRob2RdXG4gICAgfVxuXG4gICAgdGhpcy5jaGFubmVsQWN0aW9uTWV0aG9kcyA9IGZyb21QYWlycyhyTWFwKGNyZWF0ZU9iaiwgdGhpcy5hZGRSZWdpc3RlcmVkQWN0aW9ucygpKSlcblxuICAgIC8vIGNvbnNvbGUubG9nKCd0aGUgY2hhbm5lbCBhY3Rpb24gbWV0aG9kcyAnLHRoaXMuY2hhbm5lbEFjdGlvbk1ldGhvZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPkNoYW5uZWxzIHNlbmQgYWxvbmcgQWN0aW9uIG5hbWVzIGFsb25nIHdpdGggaXRzIHBheWxvYWQuPC9wPlxuICAgKiA8cD5CZWZvcmUgYW55IGFjdGlvbiBjYW4gYmUgdXNlZCwgdGhhdCBhY3Rpb24gbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCB1c2luZyB0aGlzIG1ldGhvZC48L3A+XG4gICAqIDxwPlZpZXdTdHJlYW0gaW5zdGFuY2VzIGNhbiBmaWx0ZXIgQ2hhbm5lbFBheWxvYWRzIGJ5IGJpbmRpbmcgc3BlY2lmaWMgTElOS1snYWN0aW9ucyB0byBsb2NhbCBtZXRob2RzJywgJ3ZpZXctc3RyZWFtLWFkZC1hY3Rpb24tbGlzdGVuZXJzJ10uPC9wPlxuICAgKiA8cD5Gb3JjaW5nIHJlZ2lzdHJhdGlvbiBvZiBhY3Rpb25zIGFsbG93cyBTcHluZSB0byB2YWxpZGF0ZSBBY3Rpb25zLCBhbmQgaXMgYWxzbyBhIHVzZWZ1bCB3YXkgdG8ga2VlcCB0cmFjayBvZiBhbGwgQWN0aW9ucyB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkLjwvcD5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQXJyYXkgb2YgU3RyaW5nc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5SZWdpc3RlcmluZyBBY3Rpb25zIGluIHRoZSBhZGRSZWdpc3RlcmVkQWN0aW9ucyBtZXRob2Q8L2g0PlwiXVxuICAgKiAgICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICogICAgIHJldHVybiBbXG4gICAqICAgICAgICAnQ0hBTk5FTF9NWV9DSEFOTkVMX0VWRU5UJyxcbiAgICogICAgICAgICdDSEFOTkVMX01ZX0NIQU5ORUxfVVBEQVRFX0VWRU5UJ1xuICAgKiAgICAgICBdO1xuICAgKiAgICAgIH1cbiAgICpcbiAgICovXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIGxldCBhcnIgPSBbXVxuICAgIGlmIChwYXRoKFsncHJvcHMnLCAnZGF0YSddLCB0aGlzKSkge1xuICAgICAgYXJyID0gW2Ake3RoaXMucHJvcHMubmFtZX1fRVZFTlRgXVxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICBvblJlY2VpdmVkT2JzZXJ2YWJsZShvYmopIHtcbiAgICB0aGlzLm9uSW5jb21pbmdPYnNlcnZhYmxlKG9iailcbiAgfVxuXG4gIGdldEFjdGlvbk1ldGhvZEZvck9ic2VydmFibGUob2JqKSB7XG4gICAgb2JqLnVucGFja2VkID0gdHJ1ZVxuICAgIGNvbnN0IGRlZmF1bHRGbiA9IHRoaXMub25WaWV3U3RyZWFtSW5mby5iaW5kKHRoaXMpXG5cbiAgICBjb25zdCBtZXRob2RTdHIgPSBwYXRoKFsnZGF0YScsICdhY3Rpb24nXSwgb2JqKVxuICAgIGNvbnN0IG1ldGhvZFZhbCA9IHByb3AobWV0aG9kU3RyLCB0aGlzLmNoYW5uZWxBY3Rpb25NZXRob2RzKVxuXG4gICAgbGV0IGZuID0gZGVmYXVsdEZuXG5cbiAgICBpZiAobWV0aG9kVmFsICE9PSB1bmRlZmluZWQgJiYgbWV0aG9kVmFsICE9PSAnb25WaWV3U3RyZWFtSW5mbycpIHtcbiAgICAgIGNvbnN0IG1ldGhvZEV4aXN0cyA9IHR5cGVvZiAodGhpc1ttZXRob2RWYWxdKSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgaWYgKG1ldGhvZEV4aXN0cyA9PT0gdHJ1ZSkge1xuICAgICAgICBmbiA9IHRoaXNbbWV0aG9kVmFsXS5iaW5kKHRoaXMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuXG4gIH1cblxuICBvbkluY29taW5nT2JzZXJ2YWJsZShvYmopIHtcbiAgICBjb25zdCBlcXNOYW1lID0gZXF1YWxzKG9iai5uYW1lLCB0aGlzLnByb3BzLm5hbWUpXG4gICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQgfSA9IG9iai5kYXRhXG4gICAgLy8gY29uc29sZS5sb2coXCJJTkNPTUlORyBcIix7YWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50fSwge29ian0pO1xuICAgIGNvbnN0IG1lcmdlUHJvcHMgPSAoZCkgPT4gbWVyZ2VBbGwoW2QsIHsgYWN0aW9uOiBwcm9wKCdhY3Rpb24nLCBkKSB9LCBwcm9wKCdwYXlsb2FkJywgZCksIHByb3AoJ3NyY0VsZW1lbnQnLCBkKV0pXG4gICAgY29uc3QgZGF0YU9iaiA9IG9ic1ZhbCA9PiAoe1xuICAgICAgY2xvbmU6ICgpID0+IG1lcmdlUHJvcHMob2JqLmRhdGEpLFxuICAgICAgLy8gcHJveHktcHJlc2VydmluZyBjbG9uZSDigJQgbWlycm9ycyBDaGFubmVsUGF5bG9hZC5zYWZlQ2xvbmUgZm9yXG4gICAgICAvLyBjaGFubmVsLXNpZGUgZ2V0Q2hhbm5lbCBzdWJzY3JpYmVyc1xuICAgICAgc2FmZUNsb25lOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJldml2ZWRQYXlsb2FkID0gc2FmZUNsb25lRGVlcChwYXlsb2FkKVxuICAgICAgICByZXR1cm4gbWVyZ2VBbGwoW1xuICAgICAgICAgIHsgcGF5bG9hZDogcmV2aXZlZFBheWxvYWQgfSxcbiAgICAgICAgICByZXZpdmVkUGF5bG9hZCxcbiAgICAgICAgICB7IGFjdGlvbiB9LFxuICAgICAgICAgIHsgc3JjRWxlbWVudCB9LFxuICAgICAgICAgIHsgZXZlbnQ6IG9ic1ZhbCB9XG4gICAgICAgIF0pXG4gICAgICB9LFxuICAgICAgYWN0aW9uLFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHNyY0VsZW1lbnQsXG4gICAgICBldmVudDogb2JzVmFsXG4gICAgfSlcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAob2JqKSA9PiBvYmoub2JzZXJ2YWJsZS5waXBlKG1hcChkYXRhT2JqKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5nZXRBY3Rpb25NZXRob2RGb3JPYnNlcnZhYmxlKG9iaikpXG4gICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHt9XG4gICAgcmV0dXJuIGVxc05hbWUgPT09IHRydWUgPyBvblN1Y2Nlc3Mob2JqKSA6IG9uRXJyb3IoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIDxwPlZpZXdTdGVhbSBpbnN0YW5jZXMgY2FuIHNlbmQgaW5mbyB0byBjaGFubmVscyB0aHJvdWdoIGl0cyBMSU5LWydzZW5kSW5mb1RvQ2hhbm5lbCwgJ3ZpZXctc3RyZWFtLXNlbmQtaW5mby10by1jaGFubmVsJ10gbWV0aG9kLjwvcD5cbiAgICogPHA+RGF0YSByZWNlaXZlZCBmcm9tIFZpZXdTdHJlYW1zIGFyZSBkaXJlY3RlZCB0byB0aGlzIG1ldGhvZC48L3A+XG4gICAqIDxwPlZpZXdTdHJlYW1zIHNlbmQgZGF0YSB1c2luZyB0aGUgTElOS1snVmlld1N0cmVhbVBheWxvYWQnLCAndmlldy1zdHJlYW0tcGF5bG9hZCddIGZvcm1hdC48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbVBheWxvYWR9IG9ialxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5QYXJzaW5nIERhdGEgUmV0dXJuZWQgZnJvbSBhIFZpZXdTdHJlYW0gSW5zdGFuY2U8L2g0PlwiXVxuICAgKiBvblZpZXdTdHJlYW1JbmZvKG9iail7XG4gICAqICAgICBsZXQgZGF0YSA9IG9iai52aWV3U3RyZWFtSW5mbztcbiAgICogICAgIGxldCBhY3Rpb24gPSBkYXRhLmFjdGlvbjtcbiAgICogICAgIGxldCBuZXdQYXlsb2FkID0gdGhpcy5wYXJzZVZpZXdTdHJlYW1EYXRhKGRhdGEpO1xuICAgKiAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBuZXdQYXlsb2FkKTtcbiAgICogfVxuICAgKlxuICAgKlxuICAgKi9cbiAgb25WaWV3U3RyZWFtSW5mbyhvYnMpIHtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKlxuICAgKiA8cD5UaGlzIG1ldGhvZCB0YWtlcyBhbiBhY3Rpb24sIGEgZGF0YSBvYmplY3QgYW5kIG90aGVyIHByb3BlcnRpZXMgdG8gY3JlYXRlIGFuZCBwdWJsaXNoIGEgTElOS1snQ2hhbm5lbFBheWxvYWQnLCAnY2hhbm5lbC1wYXlsb2FkJ10gb2JqZWN0LjwvcD5cbiAgICogPHA+T25jZSB0aGUgYWN0aW9uIGFuZCBwYXlsb2FkIGlzIHZhbGlkYXRlZCwgdGhpcyBtZXRob2Qgd2lsbCBwdWJsaXNoIHRoZSBkYXRhIGJ5IHVzaW5nIHRoZSBjaGFubmVsJ3Mgc291cmNlIFN1YmplY3QgbmV4dCgpIG1ldGhvZC5cbiAgICogPHA+VGhpcyBjb25zaXN0ZW50IGZvcm1hdCBhbGxvd3Mgc3Vic2NyaWJlcnMgdG8gdW5kZXJzdGFuZCBob3cgdG8gcGFyc2UgYW55IGluY29taW5nIGNoYW5uZWwgZGF0YS48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc3JjRWxlbWVudFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudFxuICAgKiBAcGFyYW0ge09ic2VydmFibGV9IG9icyRcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGFjdGlvbiAtID0gdW5kZWZpbmVkOyBSZXF1aXJlZC4gQW4gYWN0aW9uIGlzIGEgc3RyaW5nLCB0eXBpY2FsbHkgaW4gdGhlIGZvcm1hdCBvZiBcIkNIQU5ORUxfTkFNRV9BQ1RJT05fTkFNRV9FVkVOVFwiLCBhbmQgdGhhdCBoYXMgYmVlbiBhZGRlZCBpbiB0aGUgYWRkUmVnaXN0ZXJlZEFjdGlvbnMgbWV0aG9kLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcGF5bG9hZCAtID0gdW5kZWZpbmVkOyBSZXF1aXJlZC4gVGhpcyBjYW4gYmUgYW55IGphdmFzY3JpcHQgb2JqZWN0IGFuZCBpcyB1c2VkIHRvIHNlbmQgYW55IGN1c3RvbSBkYXRhLlxuICAgKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50IC0gPSBOb3QgUmVxdWlyZWQuIHVuZGVmaW5lZDsgVGhpcyBjYW4gYmUgZWl0aGVyIHRoZSBlbGVtZW50IHJldHVybmVkIGZyb20gdGhlIFVJIENoYW5uZWwsIG9yIHRoZSBzcmNFbGVtZW50IGZyb20gYSBWaWV3U3RyZWFtIGluc3RhbmNlLlxuICAgKiBAcHJvcGVydHkge1VJRXZlbnR9IGV2ZW50IC0gPSB1bmRlZmluZWQ7IE5vdCBSZXF1aXJlZC4gVGhpcyB3aWxsIGJlIGRlZmluZWQgaWYgdGhlIGV2ZW50IGlzIGZyb20gdGhlIFVJIENoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7T2JzZXJ2YWJsZX0gb2JzJCAtID0gdGhpcy5vYnNlcnZlcjsgVGhpcyBkZWZhdWx0IGlzIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBmb3IgdGhpcyBjaGFubmVsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0PlB1Ymxpc2hpbmcgYSBDaGFubmVsUGF5bG9hZDwvaDQ+J11cbiAgICogbGV0IGFjdGlvbiA9IFwiQ0hBTk5FTF9NWV9DSEFOTkVMX1JFR0lTVEVSRURfQUNUSU9OX0VWRU5UXCI7XG4gICAqIGxldCBkYXRhID0ge2ZvbzpcImJhclwifTtcbiAgICogdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBkYXRhKTtcbiAgICpcbiAgICovXG4gIHNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQgPSB7fSwgZXZlbnQgPSB7fSwgb2JzJCA9IHRoaXMub2JzZXJ2ZXIkKSB7XG4gICAgLy8gTUFLRVMgQUxMIENIQU5ORUwgQkFTRSBBTkQgREFUQSBTVFJFQU1TIENPTlNJU1RFTlRcblxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkSXRlbSA9IG5ldyBDaGFubmVsUGF5bG9hZCh0aGlzLnByb3BzLm5hbWUsIGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gICAgLy8gY29uc29sZS5sb2coXCJDSEFOTkVMIFNUUkVFTSBJVEVNIFwiLGNoYW5uZWxQYXlsb2FkSXRlbSk7XG5cbiAgICAvLyBjb25zdCBvbk5leHRGcmFtZSA9ICgpPT5vYnMkLm5leHQoY2hhbm5lbFBheWxvYWRJdGVtKTtcbiAgICAvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUob25OZXh0RnJhbWUpXG5cbiAgICBvYnMkLm5leHQoY2hhbm5lbFBheWxvYWRJdGVtKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIDxwPkFsbG93cyBjaGFubmVscyB0byBzdWJzY3JpYmUgdG8gb3RoZXIgY2hhbm5lbHMuPC9wPlxuICAgKiA8cD5UaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzb3VyY2UgcnhqcyBTdWJqZWN0IGZvciB0aGUgcmVxdWVzdGVkIENoYW5uZWwsIHdoaWNoIGNhbiBiZSBsaXN0ZW5lZCB0byBieSBjYWxsaW5nIGl0cyBzdWJzY3JpYmUgbWV0aG9kLjwvcD5cbiAgICogPHA+S25vd2xlZGdlIG9mIHJ4anMgaXMgbm90IHJlcXVpcmVkIHRvIHN1YnNjcmliZSB0byBhbmQgcGFyc2UgQ2hhbm5lbCBkYXRhLjwvcD5cbiAgICogPHA+QnV0IGFjY2Vzc2luZyB0aGUgcnhqcyBTdWJqZWN0IGdpdmVzIGRldmVsb3BlcnMgdGhlIGFiaWxpdHkgdG8gdXNlIGFsbCBvZiB0aGUgYXZhaWxhYmxlIHJ4anMgbWFwcGluZyBhbmQgb2JzZXJ2YWJsZSB0b29scy48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZSBUaGUgcmVnaXN0ZXJlZCBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbC5cbiAgICogQHJldHVybnNcbiAgICogVGhlIHNvdXJjZSByeGpzIFN1YmplY3Qgb2YgdGhlIHJlcXVlc3RlZCBjaGFubmVsLlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5TdWJzY3JpYmluZyB0byBhIENoYW5uZWwgVXNpbmcgdGhlIGdldENoYW5uZWwgbWV0aG9kPC9oND5cIl1cbiAgICogbGV0IHJvdXRlJCA9IHRoaXMuZ2V0Q2hhbm5lbChcIkNIQU5ORUxfUk9VVEVcIilcbiAgICogcm91dGUkLnN1YnNjcmliZShsb2NhbE1ldGhvZCk7XG4gICAqXG4gICAqXG4gICAqL1xuICBnZXRDaGFubmVsKGNoYW5uZWxOYW1lLCBwYXlsb2FkRmlsdGVyKSB7XG4gICAgY29uc3QgaXNWYWxpZENoYW5uZWwgPSBjID0+IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcygpLmluY2x1ZGVzKGMpXG4gICAgY29uc3QgZXJyb3IgPSBjID0+IGNvbnNvbGUud2FybihcbiAgICAgICAgYGNoYW5uZWwgbmFtZSAke2N9IGlzIG5vdCB3aXRoaW4gJHtyZWdpc3RlcmVkU3RyZWFtTmFtZXN9YClcbiAgICBjb25zdCBzdGFydFN1YnNjcmliZSA9IChjKSA9PiB7XG4gICAgICBjb25zdCBvYnMkID0gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRTdHJlYW0oYykub2JzZXJ2ZXJcbiAgICAgIGlmIChvYnMkLnNvdXJjZSkge1xuICAgICAgICBvYnMkLnNvdXJjZS5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYnMkLmNoYW5uZWxOYW1lID0gY2hhbm5lbE5hbWVcbiAgICAgIH1cblxuICAgICAgaWYgKHBheWxvYWRGaWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gb2JzJC5waXBlKGZpbHRlcihwYXlsb2FkRmlsdGVyKSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9icyRcbiAgICB9XG4gICAgY29uc3QgZm4gPSBpZkVsc2UoaXNWYWxpZENoYW5uZWwsIHN0YXJ0U3Vic2NyaWJlLCBlcnJvcilcbiAgICByZXR1cm4gZm4oY2hhbm5lbE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgQ2hhbm5lbHMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gZm9ya0pvaW4gQ2hhbm5lbC5vYnNlcnZlciRcbiAgICpcbiAgICogKi9cblxuICBtZXJnZUNoYW5uZWxzKGNoYW5uZWxzQXJyLCBlbWl0T25jZSA9IHRydWUpIHtcbiAgICAvLyAxKSBOb3JtYWxpemUgaW5wdXRzIHRvIE9ic2VydmFibGVzXG4gICAgY29uc3QgY2hhbm5lbE9ic2VydmFibGVzID0gY2hhbm5lbHNBcnIubWFwKGl0ZW0gPT4ge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBjaGFuJCA9IHRoaXMuZ2V0Q2hhbm5lbChpdGVtKVxuICAgICAgICByZXR1cm4gZW1pdE9uY2UgPyBjaGFuJC5waXBlKHRha2UoMSkpIDogY2hhbiRcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbWl0T25jZSA/IGl0ZW0ucGlwZSh0YWtlKDEpKSA6IGl0ZW1cbiAgICB9KVxuXG4gICAgLy8gMikgQ29tYmluZSB0aGVtXG4gICAgbGV0IGNvbWJpbmVkJFxuICAgIGlmIChlbWl0T25jZSkgeyAvLyBvbmXigJFzaG90OiBzbmFwc2hvdCB0aGVuIGNvbXBsZXRlXG4gICAgICBjb21iaW5lZCQgPSBmb3JrSm9pbihjaGFubmVsT2JzZXJ2YWJsZXMpXG4gICAgfSBlbHNlIHsgLy8gbGl2ZSB1cGRhdGVzOiBjb21iaW5lTGF0ZXN0V2l0aFxuICAgICAgaWYgKGNoYW5uZWxPYnNlcnZhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29tYmluZWQkID0gRU1QVFlcbiAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbE9ic2VydmFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb21iaW5lZCQgPSBjaGFubmVsT2JzZXJ2YWJsZXNbMF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCQsIC4uLnJlc3QkXSA9IGNoYW5uZWxPYnNlcnZhYmxlc1xuICAgICAgICBjb21iaW5lZCQgPSBmaXJzdCQucGlwZShjb21iaW5lTGF0ZXN0V2l0aCguLi5yZXN0JCkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMykgTWFwIGFycmF5IOKGkiBrZXllZCBvYmplY3RcbiAgICAvLyByZXR1cm4gY29tYmluZWQkO1xuICAgIHJldHVybiBjb21iaW5lZCQucGlwZShcbiAgICAgIG1hcChyZXN1bHRzQXJyID0+IHtcbiAgICAgICAgY29uc3Qgb2JqID0ge31cbiAgICAgICAgY2hhbm5lbHNBcnIuZm9yRWFjaCgoaXRlbSwgaWR4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlcktleSA9IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyA/IGl0ZW0gOiBgY2hhbm5lbF8ke2lkeH1gXG4gICAgICAgICAgY29uc3QgY25LZXkgPSBpdGVtPy5zb3VyY2U/LmNoYW5uZWxOYW1lIHx8IGl0ZW0/LnNvdXJjZT8uc291cmNlPy5jaGFubmVsTmFtZVxuICAgICAgICAgIGNvbnN0IGtleSA9IGNuS2V5IHx8IGl0ZXJLZXlcbiAgICAgICAgICBvYmpba2V5XSA9IHJlc3VsdHNBcnJbaWR4XVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gb2JqXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0Zvck5vdFRyYWNrRmxhZyhwcm9wcyA9IHt9KSB7XG4gICAgaWYgKHByb3BzLmRvTm90VHJhY2sgPT09IHRydWUpIHtcbiAgICAgIFNweW5lQXBwUHJvcGVydGllcy5kb05vdFRyYWNrQ2hhbm5lbChwcm9wcy5jaGFubmVsTmFtZSlcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgY29tcG9zZSwgcGF0aCwgaXMgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuXG4vLyBjb25zb2xlLmxvZygnY2hhbm5lbHMgY29uZmlnIGxvYWRlZCAnLFIsUngpO1xuY29uc3QgcmVnaXN0ZXJlZFN0cmVhbU5hbWVzID0gKCkgPT4gKHtcbiAgaW5jbHVkZXM6ICAoKSA9PiBTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IHRydWUgPyBTcHluZUFwcFByb3BlcnRpZXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscygpIDogWydDSEFOTkVMX1JPVVRFJywgJ0NIQU5ORUxfVUknLCAnQ0hBTk5FTF9XSU5ET1cnLCAnRElTUEFUQ0hFUiddXG5cbn0pXG5cbi8vIGdldEdsb2JhbE9iaigpLmNoYW5uZWxzTGlzdEFycjtcbmNvbnN0IHJlZ2lzdGVyZWRTdGVwcyA9IFsnTE9BRCcsICdSRU5ERVInLCAnTU9VTlQnLCAnVU5NT1VOVCcsICdESVNQT1NFJywgJ0dBUkJBR0VfQ09MTEVDVCcsICdVUERBVEUnXVxuY29uc3QgcmVnaXN0ZXJlZExpZmVTdHJlYW1UeXBlcyA9IFsncGFyZW50JywgJ3NlbGYnLCAnY2hpbGQnLCAnY2hpbGRyZW4nLCAndmlldyddXG5jb25zdCByZWdpc3RlcmVkU3RyZWFtVHlwZXMgPSBbJ09ic2VydmFibGUnLCAnQmVoYXZpb3JTdWJqZWN0JywgJ1N1YmplY3QnLCAnT2JzZXJ2ZXInLCAnU3Vic2NyaWJlcicsICdGcm9tRXZlbnRPYnNlcnZhYmxlJ11cbmNvbnN0IHJlZ2lzdGVyZWRBY3Rpb25zID0gWydzdWJzY3JpYmUnLCAnY29tYmluZUxhdGVzdCddXG5jb25zdCBnZXRSeFR5cGUgPSAob2JzKSA9PiBvYnMoKS5jb25zdHJ1Y3Rvci5uYW1lXG4vLyBsZXQgZ2V0T2JzZXJ2YWJsZVR5cGUgPSAob2JzKSA9PiBvYnMuY29uc3RydWN0b3IubmFtZTtcbmNvbnN0IGNvbmZpcm1PYnNlcnZhYmxlID0gKG9icykgPT4gb2JzLnN1YnNjcmliZSAhPT0gdW5kZWZpbmVkXG4vLyBsZXQgcHVsbE1haW5Sb3V0ZSA9IChzdHIpID0+IHN0ci5yZXBsYWNlKC9eKFxcLz8pKC4qKShcXC8pKC4qKS9nLCAnJDInKTtcbmxldCBiYXNlVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHZpZXdJbmZvVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHVpVmFsaWRhdGlvbnMgPSBbXVxubGV0IGxpZmVzdHJlYW1WYWxpZGF0aW9ucyA9IFtdOyBsZXQgc3RlcFZhbGlkYXRpb25zID0gW107IGxldCBzdGVwRGlzcG9zZVZhbGlkYXRpb25zID0gW107IGxldCBzdGVwVXBkYXRlVmFsaWRhdGlvbnMgPSBbXVxubGV0IHJvdXRlVmFsaWRhdGlvbnMgPSBbXTsgbGV0IFN0cmVhbXNDb25maWcgPSBbXVxuXG5pZiAoY29tcG9zZSAhPT0gdW5kZWZpbmVkICYmIE9ic2VydmFibGUgIT09IHVuZGVmaW5lZCkge1xuLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBTEwgVkFMSURBVElPTlMgQUREIFRIRSBCQVNFIFZBTElEQVRJT05TIFRIUk9VR0ggQ09OQ0FURU5BVElPTlxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGJhc2VWYWxpZGF0aW9ucyA9IFtcbiAgICB7XG4gICAgICBlcnJvcjogYG5lZWQgdG8gbWF0Y2ggYSB2YWxpZCBuYW1lIHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1UeXBlc31gLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcygpLmluY2x1ZGVzKHBheWxvYWQubmFtZSlcbiAgICB9LFxuXG4gICAge1xuICAgICAgZXJyb3I6ICdwYXJhbSBcXCdvYnNlcnZhYmxlXFwnIG11c3QgY29udGFpbiBhIHZhbGlkIE9ic2VydmFibGUnLFxuICAgICAgLy8gcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRTdHJlYW1UeXBlcy5pbmNsdWRlcyhnZXRPYnNlcnZhYmxlVHlwZShwYXlsb2FkLm9ic2VydmFibGUpKVxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IGNvbmZpcm1PYnNlcnZhYmxlKHBheWxvYWQub2JzZXJ2YWJsZSlcbiAgICB9LFxuICAgIHtcbiAgICAgIGVycm9yOiAncGFyYW0gYWN0aW9uIG11c3QgYmUgYSByZWdpc3RlcmVkIGFjdGlvbicsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZEFjdGlvbnMuaW5jbHVkZXMocGF5bG9hZC5hY3Rpb24pXG4gICAgfVxuXG4gIF1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUSEVTRSBWQUxJREFUSU9OUyBBUkUgQ09OQ0FURU5BVEVEIFdIRU4gVEhFIE9CU0VSVkFCTEUgUkVGRVJTIFRPIEEgVklFV1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZpZXdJbmZvVmFsaWRhdGlvbnMgPSBbXG4gICAge1xuICAgICAgZXJyb3I6ICduZWVkcyB2c2lkIG51bWJlciBpbiBzcmNFbGVtZW50JyxcbiAgICAgIHByZWRpY2F0ZTogY29tcG9zZShpcyhTdHJpbmcpLCBwYXRoKFsnZGF0YScsICdzcmNFbGVtZW50JywgJ3ZzaWQnXSkpXG4gICAgfSxcbiAgICB7XG4gICAgICBlcnJvcjogJ25lZWRzIGEgaWQgaW4gc3JjRWxlbWVudCcsXG4gICAgICBwcmVkaWNhdGU6IGNvbXBvc2UoaXMoU3RyaW5nKSxcbiAgICAgICAgcGF0aChbJ2RhdGEnLCAnc3JjRWxlbWVudCcsICdpZCddKSlcbiAgICB9XG4gIF1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5PIFNQRUNJRklDIFVJIFZBTElEQVRJT05TIEFUIFRISVMgVElNRSAtLSBJVCBKVVNUIEFERCBPVEhFUlNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB1aVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgdWlWYWxpZGF0aW9ucyA9IFtdXG4gICAgcmV0dXJuIHVpVmFsaWRhdGlvbnMuY29uY2F0KGJhc2VWYWxpZGF0aW9ucykuY29uY2F0KHZpZXdJbmZvVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOTyBTUEVDSUZJQyBMSUZFU1RSRUFNIFZBTElEQVRJT05TIEFUIFRISVMgVElNRSAtLSBJVCBKVVNUIEFERCBPVEhFUlNcbiAgY29uc3QgbGlmZVN0cmVhbVZhbGlkYXRpb25zID0gW1xuXG4gICAge1xuICAgICAgZXJyb3I6IGBuZWVkIHRvIG1hdGNoIGEgdmFsaWQgbmFtZSB3aXRoaW4gJHtyZWdpc3RlcmVkU3RyZWFtVHlwZXN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhwYXlsb2FkLm5hbWUpXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGVycm9yOiBgbmVlZHMgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RlcCBzdHJpbmdzOiAke3JlZ2lzdGVyZWRTdGVwc31gLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRTdGVwcy5pbmNsdWRlcyhwYXlsb2FkLlNURVApXG4gICAgfSxcbiAgICB7XG4gICAgICBlcnJvcjogYHR5cGUgbmVlZHMgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6ICR7cmVnaXN0ZXJlZExpZmVTdHJlYW1UeXBlc31gLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXMuaW5jbHVkZXMocGF5bG9hZC50eXBlKVxuICAgIH0sXG5cbiAgICB7XG4gICAgICBlcnJvcjogJ3ZpZXdJZCBuZWVkcyB0byBiZSBhZGRlZCAnLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHBheWxvYWQudmlld0lkICE9PSB1bmRlZmluZWRcbiAgICB9XG4gIF1cblxuICBzdGVwVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzdGVwVmFsaWRhdGlvbnMgPSBbXVxuICAgIHJldHVybiBzdGVwVmFsaWRhdGlvbnMuY29uY2F0KGxpZmVTdHJlYW1WYWxpZGF0aW9ucylcbiAgfVxuXG4gIHN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzdGVwVXBkYXRlVmFsaWRhdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIGVycm9yOiAnRElTUE9TRSBTVEVQIHJlcXVpcmVzIGEgZGlzcG9zZUl0ZW0gcGFyYW0gaW4gdGhlIGRhdGEgb2JqZWN0JyxcbiAgICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHBheWxvYWQuU1RFUCA9PT0gJ0RJU1BPU0UnICYmXG4gICAgICAgICAgICBwYXlsb2FkLmRhdGEuZGlzcG9zZUl0ZW1zICE9PSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICBdXG4gICAgcmV0dXJuIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucy5jb25jYXQobGlmZVN0cmVhbVZhbGlkYXRpb25zKVxuICB9XG5cbiAgc3RlcFVwZGF0ZVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RlcFVwZGF0ZVZhbGlkYXRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlcnJvcjogJ1VQREFURSBTVEVQIHJlcXVpcmVzIGEgZGF0YSBvYmplY3QgJyxcbiAgICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHBheWxvYWQuU1RFUCA9PT0gJ1VQREFURScgJiYgcGF5bG9hZC5kYXRhICE9PVxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICB9XG4gICAgXVxuICAgIHJldHVybiBzdGVwVXBkYXRlVmFsaWRhdGlvbnMuY29uY2F0KGxpZmVTdHJlYW1WYWxpZGF0aW9ucylcbiAgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIGxpZmVzdHJlYW1WYWxpZGF0aW9uc1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxpZmVzdHJlYW1WYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBsaWZlU3RyZWFtVmFsaWRhdGlvbnMuY29uY2F0KGJhc2VWYWxpZGF0aW9ucylcbiAgICAgIC5jb25jYXQodmlld0luZm9WYWxpZGF0aW9ucylcbiAgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhFUkUgSVMgVEhFIFJPVVRFIFZBTElEQVRJT05TXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcm91dGVWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHJvdXRlVmFsaWRhdGlvbnMgPSBbXG4gICAgICAvKlxuICAgICAgKlxuICAgICAge1xuICAgICAgICAgIGVycm9yOiBgbmVlZHMgYSB2YWxpZCByb3V0ZSBzdHJpbmcgd2l0aGluIFske3JlZ2lzdGVyZWRSb3V0ZXN9XWAsXG4gICAgICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRSb3V0ZXMuaW5jbHVkZXMocHVsbE1haW5Sb3V0ZShwYXlsb2FkLmRhdGEubmF2aWdhdGVUbykpXG4gICAgICB9XG4gICAgICAqXG4gICAgICAqL1xuXG4gICAgXVxuICAgIHJldHVybiByb3V0ZVZhbGlkYXRpb25zLmNvbmNhdChiYXNlVmFsaWRhdGlvbnMpLmNvbmNhdCh2aWV3SW5mb1ZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLypcbiAgKiBUSEUgSURFQSBPRiBTdHJlYW1zQ29uZmlnIElTIFRPIENPTVBMRVRFTFkgR0VORVJBVEUgQUxMIEFQUCBTVFJFQU1TIFVTSU5HIFRISVMgT0JKRUNUXG4gICogVEhJUyBIQVMgTk9UIEJFRU4gSU1QTEVNRU5URUQgLS0gTUFZIEJFIEFEREVEIElOIEEgRlVUVVJFIFZFUlNJT05cbiAgKi9cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBTdHJlYW1zQ29uZmlnID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RyZWFtVmFsaWRhdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIGVycm9yOiAncGFyYW0gXFwnbmFtZVxcJyBtdXN0IGJlIG9mIGEgcmVnaXN0ZXJlZCB0eXBlJyxcbiAgICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcygpLmluY2x1ZGVzKHBheWxvYWQubmFtZSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGVycm9yOiAncGFyYW0gXFwnb2JzZXJ2YWJsZVxcJyBtdXN0IGNvbnRhaW4gYSB2YWxpZCBPYnNlcnZhYmxlJyxcbiAgICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRTdHJlYW1UeXBlcy5pbmNsdWRlcyhcbiAgICAgICAgICBnZXRSeFR5cGUocGF5bG9hZC5vYnNlcnZhYmxlKSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGVycm9yOiAncGFyYW0gYWN0aW9uIG11c3QgYmUgYSByZWdpc3RlcmVkIGFjdGlvbicsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkQWN0aW9ucy5pbmNsdWRlcyhwYXlsb2FkLmFjdGlvbilcbiAgICAgIH1cblxuICAgIF1cblxuICAgIHJldHVybiB7XG4gICAgICBzdHJlYW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpbml0OiB7XG4gICAgICAgICAgICBuYW1lOiAnRElTUEFUQ0hFUicsXG4gICAgICAgICAgICBvYnNlcnZhYmxlOiAoKSA9PiBuZXcgU3ViamVjdCgpLFxuICAgICAgICAgICAgYWN0aW9uOiAnc3Vic2NyaWJlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RydWN0dXJlOiB7XG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICBvYnNlcnZhYmxlOiBPYnNlcnZhYmxlIHx8IFN1YmplY3QsXG4gICAgICAgICAgICBhY3Rpb246IFN0cmluZ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsaWRhdGlvbnM6IHN0cmVhbVZhbGlkYXRpb25zXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpbml0OiB7XG4gICAgICAgICAgICBuYW1lOiAnVUJVJyxcbiAgICAgICAgICAgIG9ic2VydmFibGU6ICgpID0+IG5ldyBTdWJqZWN0KCksXG4gICAgICAgICAgICBhY3Rpb246ICdzdWJzY3JpYmUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIG9ic2VydmFibGU6IE9ic2VydmFibGUgfHwgU3ViamVjdCxcbiAgICAgICAgICAgIGFjdGlvbjogU3RyaW5nXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2YWxpZGF0aW9uczogc3RyZWFtVmFsaWRhdGlvbnNcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cbiAgfVxufVxuZXhwb3J0IHtcbiAgc3RlcERpc3Bvc2VWYWxpZGF0aW9ucywgc3RlcFVwZGF0ZVZhbGlkYXRpb25zLCBzdGVwVmFsaWRhdGlvbnMsIHVpVmFsaWRhdGlvbnMsIHJvdXRlVmFsaWRhdGlvbnMsIGxpZmVzdHJlYW1WYWxpZGF0aW9ucywgcmVnaXN0ZXJlZFN0cmVhbU5hbWVzLCBTdHJlYW1zQ29uZmlnXG59XG4iLCJpbXBvcnQgeyBTcHluZUNoYW5uZWxSb3V0ZSB9IGZyb20gJy4vc3B5bmUtY2hhbm5lbC1yb3V0ZS5qcydcbmltcG9ydCB7IFNweW5lQ2hhbm5lbFVJIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLXVpLmpzJ1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsV2luZG93IH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLXdpbmRvdy5qcydcbmltcG9ydCB7IFNweW5lQ2hhbm5lbExpZmVjeWNsZSB9IGZyb20gJy4vc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUuanMnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxBSSB9IGZyb20gJy4vc3B5bmUtY2hhbm5lbC1haS5qcydcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBDaGFubmVsUHJveHkgfSBmcm9tICcuL2NoYW5uZWwtcHJveHkuanMnXG5pbXBvcnQgeyBwcm9wRXEsIHBsdWNrLCBwcm9wLCBmaWx0ZXIsIHBhdGhFcSwgcmVqZWN0LCBjb21wb3NlLCBqb2luLCBtYXAgYXMgck1hcCB9IGZyb20gJ3JhbWRhJ1xuXG5jb25zdCBfbWFwID0gbmV3IE1hcCgpXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsc01hcCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxzRGVsZWdhdG9yXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgb2JqZWN0IGNyZWF0ZXMgdGhlIGxvZ2ljIHNvIHRoYXQgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW1zIGNhbiBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXJcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICBfbWFwLnNldCgnRElTUEFUQ0hFUicsIG5ldyBTdWJqZWN0KCkpXG4gICAgdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzID0gQ2hhbm5lbHNNYXAubGlzdFJlZ2lzdGVyZWRDaGFubmVscy5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRDaGFubmVsc0xpc3QgPSBDaGFubmVsc01hcC5nZXRDaGFubmVsc0xpc3QuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IG1hcCgpIHtcbiAgICByZXR1cm4gX21hcFxuICB9XG5cbiAgc3RhdGljIGdldENoYW5uZWxzTGlzdCgpIHtcbiAgICBjb25zdCBwcm94eU1hcEZuID0gIChrLCB2KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBrWzBdXG4gICAgICBjb25zdCB2YWwgPSBrWzFdLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgIHJldHVybiB7IGtleSwgdmFsIH1cbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oX21hcCwgcHJveHlNYXBGbilcbiAgfVxuXG4gIHN0YXRpYyBsaXN0UmVnaXN0ZXJlZENoYW5uZWxzKHNob3dPbmx5UHJveGllcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgcHJveHlNYXAgPSB0aGlzLmdldENoYW5uZWxzTGlzdCgpXG4gICAgY29uc3QgcmVqZWN0UHJveHlGbiA9IHJlamVjdChwcm9wRXEoJ0NoYW5uZWxQcm94eScsICd2YWwnKSlcbiAgICBjb25zdCBmaWx0ZXJQcm94eUZuID0gZmlsdGVyKHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZuID0gc2hvd09ubHlQcm94aWVzID09PSB0cnVlID8gZmlsdGVyUHJveHlGbiA6IHJlamVjdFByb3h5Rm5cbiAgICBjb25zdCByZW1vdmVkUHJveHlBcnIgPSBmbihwcm94eU1hcClcbiAgICByZXR1cm4gcGx1Y2soWydrZXknXSwgcmVtb3ZlZFByb3h5QXJyKVxuICB9XG5cbiAgbGlzdFByb3h5Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscyh0cnVlKVxuICB9XG5cbiAgY2hlY2tGb3JNaXNzaW5nQ2hhbm5lbHMoKSB7XG4gICAgY29uc3QgcHJveHlNYXAgPSB0aGlzLmdldENoYW5uZWxzTGlzdCgpXG4gICAgY29uc3QgZmlsdGVyUHJveHlGbiA9IGZpbHRlcihwcm9wRXEoJ0NoYW5uZWxQcm94eScsICd2YWwnKSlcbiAgICBjb25zdCBmaWx0ZXJQcm94eUFyciA9IGZpbHRlclByb3h5Rm4ocHJveHlNYXApXG5cbiAgICBpZiAoZmlsdGVyUHJveHlBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWxTdHIgPSBmaWx0ZXJQcm94eUFyci5sZW5ndGggPT09IDEgPyAnQ2hhbm5lbCBoYXMnIDogJ0NoYW5uZWxzIGhhdmUnXG4gICAgICBjb25zdCBjaGFubmVscyA9IGNvbXBvc2Uoam9pbignLCAnKSwgck1hcChwcm9wKCdrZXknKSkpKGZpbHRlclByb3h5QXJyKVxuICAgICAgY29uc3QgZmlsdGVyUHJlZml4V2FybmluZyA9IGBTcHluZSBXYXJuaW5nOiBUaGUgZm9sbG93aW5nICR7Y2hhbm5lbFN0cn0gbm90IGJlZW4gaW5pdGlhbGl6ZWQ6ICR7Y2hhbm5lbHN9YFxuICAgICAgY29uc29sZS53YXJuKGZpbHRlclByZWZpeFdhcm5pbmcpXG4gICAgfVxuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLmNyZWF0ZU1haW5TdHJlYW1zKClcbiAgfVxuXG4gIGNyZWF0ZU1haW5TdHJlYW1zKCkge1xuICAgIHRoaXMucm91dGVTdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsUm91dGUoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX1JPVVRFJywgdGhpcy5yb3V0ZVN0cmVhbSlcblxuICAgIHRoaXMudWlTdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsVUkoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX1VJJywgdGhpcy51aVN0cmVhbSlcblxuICAgIHRoaXMuZG9tU3RyZWFtID0gbmV3IFNweW5lQ2hhbm5lbFdpbmRvdygpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfV0lORE9XJywgdGhpcy5kb21TdHJlYW0pXG5cbiAgICB0aGlzLnZpZXdTdHJlYW1MaWZlY3ljbGUgPSBuZXcgU3B5bmVDaGFubmVsTGlmZWN5Y2xlKClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9MSUZFQ1lDTEUnLCB0aGlzLnZpZXdTdHJlYW1MaWZlY3ljbGUpXG5cbiAgICB0aGlzLmFpU3RyZWFtID0gbmV3IFNweW5lQ2hhbm5lbEFJKClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9BSScsIHRoaXMuYWlTdHJlYW0pXG5cbiAgICB0aGlzLnJvdXRlU3RyZWFtLmluaXRpYWxpemVTdHJlYW0oKVxuICAgIHRoaXMuZG9tU3RyZWFtLmluaXRpYWxpemVTdHJlYW0oKVxuICB9XG5cbiAgYWRkS2V5RXZlbnQoa2V5KSB7XG4gICAgX21hcC5nZXQoJ1VJJykuYWRkS2V5RXZlbnQoa2V5KVxuICB9XG5cbiAgcmVnaXN0ZXJTdHJlYW0odmFsKSB7XG4gICAgY29uc3QgbmFtZSA9IHZhbC5jaGFubmVsTmFtZVxuICAgIGNvbnN0IG5hbWVFeGlzdHMgPSBfbWFwLmhhcyhuYW1lKVxuICAgIGlmIChuYW1lRXhpc3RzKSB7XG4gICAgICBjb25zdCBpc0FscmVhZHlSZWdpc3RlcmQgPSBjb21wb3NlKHBhdGhFcShbJ3Byb3BzJywgJ2lzUmVnaXN0ZXJlZCddLCB0cnVlKSkoX21hcC5nZXQobmFtZSkpXG4gICAgICBpZiAoaXNBbHJlYWR5UmVnaXN0ZXJkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIENoYW5uZWwsICR7bmFtZX0sIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCFgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbWFwLnNldChuYW1lLCB2YWwpXG4gICAgdmFsLmluaXRpYWxpemVTdHJlYW0oKVxuICB9XG5cbiAgZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKSB7XG4gICAgcmV0dXJuIF9tYXAuZ2V0KHN0cikuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKVxuICB9XG5cbiAgZ2V0UHJveHlTdWJqZWN0KG5hbWUsIGlzUmVwbGF5U3ViamVjdCA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3ViamVjdFR5cGUgPSBpc1JlcGxheVN1YmplY3QgPT09IHRydWUgPyAncmVwbGF5U3ViamVjdCcgOiAnc3ViamVjdCdcblxuICAgIHJldHVybiBfbWFwLmdldChuYW1lKVtzdWJqZWN0VHlwZV1cbiAgfVxuXG4gIHRlc3RTdHJlYW0obmFtZSkge1xuICAgIHJldHVybiBfbWFwLmdldChuYW1lKSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICBnZXRTdHJlYW0obmFtZSkge1xuICAgIGlmICh0aGlzLnRlc3RTdHJlYW0obmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICBfbWFwLnNldChuYW1lLCBuZXcgQ2hhbm5lbFByb3h5KG5hbWUpKVxuICAgIH1cblxuICAgIHJldHVybiBfbWFwLmdldChuYW1lKVxuICB9XG5cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBDT1JFIERFQ09SQVRPUlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIGxldCBjb3JlTWl4aW5zID0gIGJhc2VDb3JlTWl4aW5zKCk7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIFNUUkVBTVMgREVDT1JBVE9SU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IHN0cmVhbXNNaXhpbnMgPSBCYXNlU3RyZWFtc01peGlucygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsQUkgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsQUlcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBJbnRlcm5hbCBDaGFubmVsIHRoYXQgcHVibGlzaGVzIHJlbmRlcmluZyBhbmQgZGlzcG9zaW5nIGV2ZW50cyBvZiBhbGwgVmlld1N0cmVhbXMgd2hvc2UgcHJvcGVydHksIHByb3Blci5zZW5kQUlFdmVudHMgaXMgc2V0IHRvIHRydWUuXG4gICAqXG4gICAqIDxoMz5UaGUgdHdvIGFjdGlvbnMgdGhhdCBhcmUgcmVnc2l0ZXJlZCBmb3IgdGhpcyBjaGFubmVsIGFyZTo8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5DSEFOTkVMX0FJX1JFTkRFUkVEX0VWRU5UPC9saT5cbiAgICogPGxpPkNIQU5ORUxfQUlfRElTUE9TRURfRVZFTlQ8L2xpPlxuICAgKiAgPC91bD5cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBDSEFOTkVMX05BTUUgLSA9ICdDSEFOTkVMX0FJJztcbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKCdDSEFOTkVMX0FJJywgcHJvcHMpXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfQUlfUkVOREVSRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfQUlfRElTUE9TRURfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgb25WaWV3U3RyZWFtSW5mbyhvYmopIHtcbiAgICBjb25zdCB7IGFjdGlvbiwgc3JjRWxlbWVudCB9ID0gb2JqXG4gICAgY29uc3QgcGF5bG9hZCA9IHNyY0VsZW1lbnRcbiAgICBwYXlsb2FkLmFjdGlvbiA9IGFjdGlvblxuICAgIHRoaXMub25TZW5kRXZlbnQoYWN0aW9uLCBwYXlsb2FkKVxuICB9XG5cbiAgb25TZW5kRXZlbnQoYWN0aW9uU3RyLCBwYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zW2FjdGlvblN0cl1cbiAgICBjb25zdCBzcmNFbGVtZW50ID0ge31cbiAgICBjb25zdCBldmVudCA9IHVuZGVmaW5lZFxuICAgIGNvbnN0IGRlbGF5U3RyZWFtID0gKCkgPT4gdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICB3aW5kb3cuc2V0VGltZW91dChkZWxheVN0cmVhbSwgMClcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcblxuZXhwb3J0IGNsYXNzIFNweW5lQ2hhbm5lbExpZmVjeWNsZSBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxMaWZlY3ljbGVcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBJbnRlcm5hbCBDaGFubmVsIHRoYXQgcHVibGlzaGVzIHJlbmRlcmluZyBhbmQgZGlzcG9zaW5nIGV2ZW50cyBvZiBhbGwgVmlld1N0cmVhbXMgd2hvc2UgcHJvcGVydHksIHByb3Blci5zZW5kTGlmZWN5Y2xlRXZlbnRzIGlzIHNldCB0byB0cnVlLlxuICAgKlxuICAgKiA8aDM+VGhlIHR3byBhY3Rpb25zIHRoYXQgYXJlIHJlZ3NpdGVyZWQgZm9yIHRoaXMgY2hhbm5lbCBhcmU6PC9oMz5cbiAgICogPHVsPlxuICAgKiA8bGk+Q0hBTk5FTF9MSUZFQ1lDTEVfUkVOREVSRURfRVZFTlQ8L2xpPlxuICAgKiA8bGk+Q0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQ8L2xpPlxuICAgKiAgPC91bD5cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBDSEFOTkVMX05BTUUgLSA9ICdDSEFOTkVMX0xJRkVDWUNMRSc7XG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30pIHtcbiAgICBzdXBlcignQ0hBTk5FTF9MSUZFQ1lDTEUnLCBwcm9wcylcbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9MSUZFQ1lDTEVfUkVOREVSRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UJ1xuICAgIF1cbiAgfVxuXG4gIG9uVmlld1N0cmVhbUluZm8ob2JqKSB7XG4gICAgY29uc3QgeyBhY3Rpb24sIHNyY0VsZW1lbnQgfSA9IG9ialxuICAgIGNvbnN0IHBheWxvYWQgPSBzcmNFbGVtZW50XG4gICAgcGF5bG9hZC5hY3Rpb24gPSBhY3Rpb25cbiAgICB0aGlzLm9uU2VuZEV2ZW50KGFjdGlvbiwgcGF5bG9hZClcbiAgfVxuXG4gIG9uU2VuZEV2ZW50KGFjdGlvblN0ciwgcGF5bG9hZCA9IHt9KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9uc1thY3Rpb25TdHJdXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IHt9XG4gICAgY29uc3QgZXZlbnQgPSB1bmRlZmluZWRcbiAgICBjb25zdCBkZWxheVN0cmVhbSA9ICgpID0+IHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gICAgd2luZG93LnNldFRpbWVvdXQoZGVsYXlTdHJlYW0sIDApXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS11cmwuanMnXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgbWVyZ2UgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7XG4gIHBpY2ssXG4gIGZpbmQsXG4gIG9taXQsXG4gIG92ZXIsXG4gIG1lcmdlUmlnaHQsXG4gIGlzLFxuICBvYmpPZixcbiAgbWVyZ2VBbGwsXG4gIHBhdGgsXG4gIGtleXMsXG4gIHByb3AsXG4gIGVxdWFscyxcbiAgaGVhZCxcbiAgY29tcG9zZSxcbiAgbGVuc1Byb3AsXG4gIGNoYWluLFxuICBwaWNrQWxsLFxuICBkZWZhdWx0VG8sXG4gIGlzRW1wdHksXG4gIGNvbmNhdCxcbiAgd2hlbixcbiAgY29tcGxlbWVudCxcbiAgcmV2ZXJzZSxcbiAgY3VycnlOLFxuICBfXyxcbiAgdGVzdCxcbiAgcmVwbGFjZSxcbiAgdG9QYWlycyxcbiAgcmVkdWNlXG4gICwgZmlsdGVyIGFzIHJhbWRhRmlsdGVyLCBtZXJnZVJpZ2h0IGFzIHJNZXJnZVxufSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFNweW5lQ2hhbm5lbFJvdXRlIGV4dGVuZHMgQ2hhbm5lbCB7XG4gIGNvbnN0cnVjdG9yKG5hbWUgPSAnQ0hBTk5FTF9ST1VURScsIHByb3BzID0ge30pIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFNweW5lQ2hhbm5lbFJvdXRlXG4gICAgICogQHR5cGUgY29yZVxuICAgICAqXG4gICAgICogQGRlc2NcbiAgICAgKlxuICAgICAqIDxwPlRoZSBTcHluZUNoYW5uZWxSb3V0ZSBoYXMgdGhlIHR3byBtYWluIGR1dGllczpcbiAgICAgKiAgPHVsPlxuICAgICAqICAgPGxpPkNvbWJpbmUgZGF0YSB3aXRoIHRoZSBjdXJyZW50IHdpbmRvdyBsb2NhdGlvbiB0byB1cGRhdGUgdGhlIGxvY2F0aW9uJ3MgcGF0aG5hbWUuPC9saT5cbiAgICAgKiAgIDxsaT5MaXN0ZW4gdG8gd2luZG93IGxvY2F0aW9uIGNoYW5nZXMgdG8gdHJhbnNsYXRlIHRoZSBsb2NhdGlvbiBwYXRobmFtZSBpbnRvIGEgc2VyaWVzIG9mIG1vZGVsIHByb3BlcnRpZXMuPC9saT5cbiAgICAgKiA8L3VsPlxuICAgICAqIDxwPkluIGJvdGggY2FzZXMsIHRoaXMgY2hhbm5lbCBzZW5kcyBhIENoYW5uZWxQYXlsb2FkIGNvbnRhaW5pbmcgdXBkYXRlZCByb3V0ZSBwcm9wZXJ0aWVzLjwvcD5cbiAgICAgKlxuICAgICAqIDxoMz5UaGUgdHdvIGFjdGlvbnMgdGhhdCBhcmUgcmVnc2l0ZXJlZCBmb3IgdGhlIFJvdXRlIGNoYW5uZWwgYXJlOjwvaDM+XG4gICAgICogPHVsPlxuICAgICAqIDxsaT5DSEFOTkVMX1JPVVRFX0RFRVBMSU5LX0VWRU5UPC9saT5cbiAgICAgKiA8bGk+Q0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQ8L2xpPlxuICAgICAqICA8L3VsPlxuICAgICAqXG4gICAgICogICAgPGgzPlRoZSBSb3V0ZXMgQ29uZmlndXJhdGlvbiBPYmplY3Q8L2gzPlxuICAgICAqICAgIDxwPlRociByb3V0ZXMgY29uZmlndXJhdGlvbiBvYmplY3QgaXMgdXNlZCB0byBtYXAgdGhlIGxvY2F0aW9uIHN0cmluZyB0byBhbmQgZnJvbSBhIHJvdXRlIG1vZGVsLjwvcD5cbiAgICAgKlxuICAgICAqICAgICA8cHJlPiAgICAgICAgICAge1xuICAgICAqICAgICAgICAgICAgICAgIHJvdXRlUGF0aDoge1xuICAgICAqICAgICAgICAgICAgICAgICAgcm91dGVOYW1lOiAnbGV2ZWxPbmVQcm9wJyxcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdXRlT3B0aW9uMTogJ2JyYW5jaGluZy1lbmRzLWhlcmUnLFxuICAgICAqICAgICAgICAgICAgICAgICAgcm91dGVPcHRpb24yOiB7XG4gICAgICogICAgICAgICAgICAgICAgICAgICByb3V0ZVBhdGg6IHtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVOYW1lOiAnbGV2ZWxUd29Qcm9wJyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGV2ZWwyOiAnbGV2ZWwtMi1icmFuY2gtZW5kcy1oZXJlJ1xuICAgICAqXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICogICAgICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgICAgfVxuICAgICAqXG4gICAgICogICAgICAgICAgPC9wcmU+XG4gICAgICogICAgIDxwPlRoaXMgY29uZmlnIG9iamVjdCBjb25zaXN0cyBvZiBuZXN0ZWQgcm91dGVQYXRoIG9iamVjdHMgdGhhdCBjb3JyZXNwb25kcyB0byBhbGwgb2YgdGhlIGJyYW5jaGluZyBwb3NzaWJsaXRpZXMgZm9yIHRoZSBhcHAuPC9wPlxuICAgICAqICAgIDxwPlRoZSByb3V0ZU5hbWUgdmFsdWUgaXMgdGhlIHByb3BlcnR5IG5hbWUgZm9yIGVhY2ggcm91dGVQYXRoLjwvcD5cbiAgICAgKiAgICA8aDM+Um91dGUgT3B0aW9uczwvaDM+XG4gICAgICogICAgPHA+QSByb3V0ZVBhdGggbWF5IGNvbnRhaW4gc2V2ZXJhbCByb3V0ZSBvcHRpb24ga2V5LXZhbHVlIHBhaXJzLCB3aGljaCBpcyB1c2VkIHRvIG1hcCBiZXR3ZWVuIGRhdGEgYW5kIHRoZSB3aW5kb3cgbG9jYXRpb24uPC9wPlxuICAgICAqICAgIDx1bCBjbGFzcz0nYmFzaWMnPlxuICAgICAqICAgICAgPGxpPlxuICAgICAqICAgICAgICAgPGg1IGNsYXNzPSdiYXNpYyc+VGhlIFJvdXRlIE9wdGlvbiBLZXkgKG9yIGxlZnQgdmFsdWUpPC9oNT5cbiAgICAgKiAgICAgICAgIDx1bCBjbGFzcz0nZGVjaW1hbCc+XG4gICAgICogICAgICAgICA8bGk+TWFwcyB0aGUgd2luZG93IGxvY2F0aW9uIHRvIHJvdXRlIGRhdGEgcHJvcGVydGllczwvbGk+XG4gICAgICogICAgICAgICA8bGk+VGhpcyBjaGFubmVsIGNhbiAnZmlsbCBpbiB0aGUgYmxhbmtzJyBzbyB0aGF0IG9ubHkgdGhlIHVwZGF0ZWQgbGV2ZWwgcm91dGVOYW1lcyBhcmUgcmVxdWlyZWQgdG8gcmV2aXNlIHRoZSB3aW5kb3cgbG9jYXRpb248L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5DYW4gYmUgYSByZWdleCBwYXR0ZXJuIHNvIHRoYXQgbXVsdGlwbGUgZGF0YSBwcm9wZXJ0aWVzIGNhbiBzaGFyZSB0aGUgc2FtZSBicmFuY2hpbmcgbG9naWM8L2xpPlxuICAgICAqICAgICAgICAgIDwvdWw+XG4gICAgICogICAgICA8L2xpPlxuICAgICAqXG4gICAgICogICAgICA8bGk+XG4gICAgICogICAgICAgICAgIDxoNSBjbGFzcz0nYmFzaWMnPlRoZSBSb3V0ZSBPcHRpb24gVmFsdWUgKG9yIHJpZ2h0IHZhbHVlKTwvaDU+XG4gICAgICogICAgICAgICAgIDx1bCBjbGFzcz0nZGVjaW1hbCc+XG4gICAgICogICAgICAgICAgIDxsaT5NYXBzIGRhdGEgcHJvcGVydGllcyB0byBwYXJ0IG9mIGEgd2luZG93IGxvY2F0aW9uPC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+RGV0ZXJtaW5lcyB0aGUgc3RyaW5nIHZhbHVlIGZvciBpdHMgbGV2ZWwgb2YgdGhlIHdpbmRvdyBsb2NhdGlvbjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPlRoZSB2YWx1ZSBjYW4gYmUgYSByZWdleCBwYXR0ZXJuIHNvIHRoYXQgbXVsdGlwbGUgbG9jYXRpb25zIGNhbiBtYXAgdG8gc2FtZSByb3V0ZURhdGEgcHJvcGVydHk8L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5CcmFuY2hpbmcgZW5kcyBmb3IgdGhlIHJvdXRlIG9wdGlvbiB3aGVuIHRoaXMgdmFsdWUgaXMgYSBlaXRoZXIgYSBTdHJpbmcgb3IgYSByZWdleCBwYXR0ZXJuPC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+QnJhbmNoaW5nIGNvbnRpbnVlcyBmb3IgdGhlIHJvdXRlIG9wdGlvbiB3aGVuIHRoaXMgdmFsdWUgaXMgYSBuZXN0ZWQgcm91dGVQYXRoIG9iamVjdDwvbGk+XG4gICAgICogICAgICAgICAgPC91bD5cbiAgICAgKiAgICAgIDwvbGk+XG4gICAgICogICAgICA8L3VsPlxuICAgICAqXG4gICAgICogICAgICA8aDM+RW5oYW5jaW5nIFRoZSBBcHAncyBSb3V0aW5nIExvZ2ljPC9oMz5cbiAgICAgKiAgICAgIDxwPlRoZSBiZXN0IHByYWN0aWNlIGZvciBhIFNweW5lIEFwcCBpcyB0byBoYXZlIG9uZSBjb21wb25lbnQsIGEgY3VzdG9tIGNoYW5uZWwsIGxpc3RlbiB0byB0aGUgU3B5bmVSb3V0ZUNoYW5uZWwuIEFsbCBvdGhlciBjb21wb25lbnRzIHdpbGwgdGhlbiBsaXN0ZW4gdG8gdGhlIGN1c3RvbSByb3V0ZSBjaGFubmVsLiBUaGlzIGFsbG93cyB0aGUgY3VzdG9tIHJvdXRlIGNoYW5uZWwgdG8gZW5oYW5jZSByb3V0aW5nIGxvZ2ljIHdpdGggbW9yZSBkYXRhIGFuZCBjdXN0b20gYWN0aW9ucy48L3A+XG4gICAgICogICAgICA8cD5Zb3UgY2FuIHNlZSB0aGlzIGN1c3RvbSByb3V0aW5nIGNoYW5uZWwgaW4gYWN0aW9uIGluIHRoZSBTcHluZSBTdGFydGVyIEFwcDwvcD5cbiAgICAgKlxuICAgICAqICAgICAgPGg0IGNsYXNzPSdiYXNpYyc+RXhhbWluaW5nIHRoaXMgU2l0ZSdzIFJvdXRlIENvbmZpZ3VyYXRpb248L2g0PlxuICAgICAqICAgICAgPGFydGljbGUgY2xhc3M9J2NvZGUtZXhhbXBsZScgaWQ9J3JvdXRlcy1jb25maWctZXhhbXBsZSc+PC9hcnRpY2xlPlxuICAgICAqICAgICAgPHA+WW91IGNhbiBzZWUgdGhpcyBzaXRlIHJvdXRpbmcgaW4gYWN0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIGNvbnNvbGUncyByb3V0ZXMgcGFuZWw8L3A+XG4gICAgICogICAgICA8ZGl2IGNsYXNzPSdidG4gYnRuLWJsdWUtcmVmIGJ0bi1jb25zb2xlJyBkYXRhLXR5cGU9XCJjb25zb2xlXCIgZGF0YS12YWx1ZT1cIm9wZW5cIiBkYXRhLWNoYW5uZWwtdHlwZT1cInJvdXRlXCI+Q0xJQ0sgVE8gT1BFTiBST1VURSBQQU5FTDwvZGl2PlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVtcIjxoND5CaW5kaW5nIFVJIEVMZW1lbnRzIHRvIHRoZSBSb3V0ZSBDaGFubmVsPC9oND5cIl1cbiAgICAgKiAvLyBUaGlzIGFsc28gaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gb3ZlcnJpZGUgdGhlIFJvdXRlT3B0aW9uIHZhbHVlICh1c2VmdWwgd2hlbiB0aGUgdmFsdWUgaXMgYSByZWdleCBwYXR0ZXJuKVxuICAgICAqIDxkaXYgY2xhc3M9J2J0bicgZGF0YS1jaGFubmVsPVwiUk9VVEVcIiBkYXRhLXBhZ2UtaWQ9J2hvbWUnIGRhdGEtcGFnZS1pZC12YWx1ZT0nJz5IT01FPC9kaXY+XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFW1wiPGg0PlVwZGF0aW5nIHRoZSBSb3V0ZSBDaGFubmVsIHVzaW5nIFZpZXdTdHJlYW0mcnNxdW87cyBzZW5kSW5mb1RvQ2hhbm5lbDwvaDQ+XCJdXG4gICAgICogY29uc3QgZGF0YVVwZGF0ZU9iaiA9IHtwYWdlSWQ6J2d1aWRlJywgc2VjdGlvbjoncmVmZXJlbmNlJywgbWVudUl0ZW06J3NweW5lLXJvdXRlLWNoYW5uZWwnfTtcbiAgICAgKiB0aGlzLnNlbmRJbmZvVG9DaGFubmVsKFwiQ0hBTk5FTF9ST1VURVwiLCBkYXRhVXBkYXRlT2JqKTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbXCI8aDQ+VXBkYXRpbmcgdGhlIFJvdXRlIENoYW5uZWwgdXNpbmcgQ2hhbm5lbCZyc3F1bztzIHNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWw8L2g0PlwiXVxuICAgICAqIGNvbnN0IGRhdGFVcGRhdGVPYmogPSB7cGFnZUlkOidndWlkZScsIHNlY3Rpb246J3JlZmVyZW5jZScsIG1lbnVJdGVtOidzcHluZS1yb3V0ZS1jaGFubmVsJ307XG4gICAgICogdGhpcy5zZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsKGRhdGFVcGRhdGVPYmopO1xuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjb25maWcudHlwZSAtID0gJ3NsYXNoJzsgVGhpcyBwcm9wZXJ0eSBkZXRlcm1pbmVzIHRoZSB1cmwgc3RydWN0dXJlIGJ5IGNvbmZvcm1pbmcgdGhlIHdpbmRvdyBwYXRobmFtZSB0byBlaXRoZXIgdGhlIHNsYXNoLCBxdWVyeSBvciBoYXNoIGZvcm1hdHMuXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbmZpZy5yb3V0ZXMgLSA9IHtyb3V0ZVBhdGg6IHtyb3V0ZU5hbWU6J2NoYW5nZSd9OyBUaGlzIG5lc3RlZCBPYmplY3QgaXMgdXNlZCB0byBjb250cnVjdCB0aGUgd2luZG93IHBhdGhuYW1lIGFuZCB0byBleHByZXNzIHRoZSB3aW5kb3cgbG9jYXRpb24gYXMgbW9kZWwgdmFyaWFibGVzLlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBDSEFOTkVMX05BTUUgLSA9ICdDSEFOTkVMX1JPVVRFJztcbiAgICAgKlxuICAgICAqL1xuICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gdHJ1ZVxuICAgIHN1cGVyKCdDSEFOTkVMX1JPVVRFJywgcHJvcHMpXG4gICAgdGhpcy5jcmVhdGVDaGFubmVsQWN0aW9uc09iaigpXG4gICAgdGhpcy5yb3V0ZUNvbmZpZ0pzb24gPSB0aGlzLmdldFJvdXRlQ29uZmlnKClcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzKClcbiAgICB0aGlzLm5hdlRvU3RyZWFtJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXG4gICAgdGhpcy5vYnNlcnZlciQgPSB0aGlzLm5hdlRvU3RyZWFtJC5waXBlKG1hcChpbmZvID0+IHRoaXMub25NYXBOZXh0KGluZm8pKSlcbiAgICB0aGlzLmNvbXBhcmVSb3V0ZUtleXdvcmRzID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jb21wYXJlUm91dGVLZXl3b3JkcygpXG4gIH1cblxuICBjaGVja0NvbmZpZ0Zvckhhc2goKSB7XG4gICAgLy8gTEVHQUNZIENIRUNLIFRPIFNJTVBMSUZZIENPTkZJRyBGT1IgSEFTSDtcbiAgICBjb25zdCBpc0hhc2hUeXBlID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5ST1VURS50eXBlID09PSAnaGFzaCdcbiAgICBpZiAoaXNIYXNoVHlwZSA9PT0gdHJ1ZSkge1xuICAgICAgU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5ST1VURS50eXBlID0gJ3NsYXNoJ1xuICAgICAgU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5ST1VURS5pc0hhc2ggPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgb25SZWdpc3RlcmVkKCkge1xuICAgIHRoaXMuY2hlY2tDb25maWdGb3JIYXNoKClcbiAgICB0aGlzLmluaXRTdHJlYW0oKVxuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmooKSB7XG4gICAgY29uc3QgYXJyID0gdGhpcy5hZGRSZWdpc3RlcmVkQWN0aW9ucygpXG4gICAgY29uc3QgY29udmVydGVyID0gc3RyID0+IG9iak9mKHN0ciwgc3RyKVxuICAgIGNvbnN0IG9iaiA9IG1lcmdlQWxsKGNoYWluKGNvbnZlcnRlciwgYXJyKSlcbiAgICB0aGlzLmNoYW5uZWxBY3Rpb25zID0gb2JqXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfUk9VVEVfREVFUExJTktfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1JPVVRFX0NPTkZJR19VUERBVEVEX0VWRU5UJyxcbiAgICAgIFsnQ0hBTk5FTF9ST1VURV9VUERBVEVfQ09ORklHX0VWRU5UJywgJ3VwZGF0ZVJvdXRlQ29uZmlnJ11cbiAgICBdXG4gIH1cblxuICB1cGRhdGVSb3V0ZUNvbmZpZyhlKSB7XG4gICAgY29uc3QgbmV3Um91dGVzT2JqICA9IHBpY2soWydpc0hhc2gnLCAnaXNIaWRkZW4nLCAncm91dGVzJywgJ3R5cGUnXSwgZS5wYXlsb2FkKVxuXG4gICAgU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5ST1VURSA9IG1lcmdlUmlnaHQoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5ST1VURSwgbmV3Um91dGVzT2JqKVxuXG4gICAgU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZvcm1Sb3V0ZUNvbmZpZygpXG5cbiAgICBjb25zdCByb3V0ZUNvbmZpZyA9IHRoaXMuZ2V0Um91dGVDb25maWcoKVxuICAgIGNvbnN0IGFjdGlvbiA9ICdDSEFOTkVMX1JPVVRFX0NPTkZJR19VUERBVEVEX0VWRU5UJ1xuXG4gICAgLy8gcmV2ZXJzZSBiZWNhdXNlIHJvdXRlRGF0YXNldHNBcnIgdHVybnMgb3V0IHRoYXQgd2F5XG4gICAgcm91dGVDb25maWcubmF2TGlua3MgPSBbLi4ucm91dGVDb25maWc/LnJvdXRlRGF0YXNldHNBcnJdXG5cbiAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbiA9IHJvdXRlQ29uZmlnXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhKClcblxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcm91dGVDb25maWcsIHt9LCB7fSwgdGhpcy5uYXZUb1N0cmVhbSQpXG4gIH1cblxuICBnZXRSb3V0ZUNvbmZpZygpIHtcbiAgICBjb25zdCBzcHluZUNvbmZpZyA9IFNweW5lQXBwUHJvcGVydGllcy5jb25maWdcbiAgICBjb25zdCByb3V0ZUNvbmZpZyA9IHBhdGgoWydjaGFubmVscycsICdST1VURSddLCBzcHluZUNvbmZpZylcbiAgICBpZiAocm91dGVDb25maWcudHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgcm91dGVDb25maWcuaXNIYXNoID0gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBhcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmZsYXR0ZW5Db25maWdPYmplY3Qocm91dGVDb25maWcucm91dGVzKVxuICAgIHJvdXRlQ29uZmlnLnBhcmFtc0FyciA9IGFyclxuICAgIHJldHVybiByb3V0ZUNvbmZpZ1xuICB9XG5cbiAgaW5pdFN0cmVhbSgpIHtcbiAgICB0aGlzLmZpcnN0TG9hZFN0cmVhbSQgPSBuZXcgUmVwbGF5U3ViamVjdCgxKVxuICAgIHRoaXMub25JbmNvbWluZ0RvbUV2ZW50KHVuZGVmaW5lZCwgdGhpcy5yb3V0ZUNvbmZpZ0pzb24sICcnICsgJ0NIQU5ORUxfUk9VVEVfREVFUExJTktfRVZFTlQnKVxuXG4gICAgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jcmVhdGVQb3BTdGF0ZVN0cmVhbSh0aGlzLm9uSW5jb21pbmdEb21FdmVudC5iaW5kKHRoaXMpKVxuXG4gICAgdGhpcy5vYnNlcnZlciQgPSBtZXJnZSh0aGlzLmZpcnN0TG9hZFN0cmVhbSQsXG4gICAgICB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIG9uTWFwTmV4dChkYXRhLCBmaXJzdExvYWRlZCA9IGZhbHNlKSB7XG4gICAgZGF0YS5hY3Rpb24gPSAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVTU0lEKHBheWxvYWQpIHtcbiAgICBjb25zdCByb3V0ZUxlbnMgPSBsZW5zUHJvcChbJ3JvdXRlRGF0YSddKVxuICAgIGNvbnN0IG9taXRTU0lEID0gb3Zlcihyb3V0ZUxlbnMsIG9taXQoWyd2c2lkJ10pKVxuICAgIHJldHVybiBvbWl0U1NJRChwYXlsb2FkKVxuICB9XG5cbiAgc3RhdGljIG9uSW5jb21pbmdEb21FdmVudChldnQsIGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uLCBhY3RuKSB7XG4gICAgY29uc3QgYWN0aW9uID0gYWN0biAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGFjdG5cbiAgICAgIDogdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVFxuXG4gICAgLy8gQ0hFQ0sgSUYgVEhJUyBJUyBBIEhJU1RPUlkgRVZFTlQgQlkgVVNJTkcgVEhFIHJvdXRlQ291bnQgUFJPUEVSVFlcbiAgICBjb25zdCBldmVudENvdW50ID0gcGF0aChbJ3N0YXRlJywgJ3JvdXRlQ291bnQnXSwgZXZ0KVxuICAgIGNvbnN0IGlzSGlzdG9yeUNvdW50ID0gaXMoTnVtYmVyLCBldmVudENvdW50KSA9PT0gdHJ1ZVxuICAgIGxldCBwYXlsb2FkID0gdGhpcy5nZXREYXRhRnJvbVN0cmluZyhjb25maWcsIGlzSGlzdG9yeUNvdW50KVxuICAgIGlmIChpc0hpc3RvcnlDb3VudCA9PT0gdHJ1ZSkge1xuICAgICAgcGF5bG9hZC5yb3V0ZUNvdW50ID0gZXZlbnRDb3VudFxuICAgIH1cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBpZiAoYWN0biA9PT0gJ0NIQU5ORUxfUk9VVEVfREVFUExJTktfRVZFTlQnKSB7XG4gICAgICBwYXlsb2FkLm5hdkxpbmtzID0gcHJvcCgncm91dGVEYXRhc2V0c0FycicsIGNvbmZpZylcbiAgICAgIC8vIHBheWxvYWQubGlua3NEYXRhID0gcGF5bG9hZC5uYXZMaW5rc1xuICAgICAgLy8gU3B5bmVBcHBQcm9wZXJ0aWVzLmxpbmtzRGF0YSA9IHBheWxvYWQubmF2TGlua3NcblxuICAgICAgLy8gZGVmaW5lIGFuIGFsaWFzIHByb3BlcnR5IHVzaW5nIE9iamVjdC5kZWZpbmVQcm9wZXJ0eVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBheWxvYWQsICdsaW5rc0RhdGEnLCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJ2dldCBsaW5rcyBkYXRhIGlzIGRlcHJlY2F0ZWQgaW4gUk9VVEUgREVFUExJTksgREFUQSwgdXNlIG5hdkxpbmtzJylcbiAgICAgICAgICByZXR1cm4gdGhpcy5uYXZMaW5rc1xuICAgICAgICB9LFxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ3NldCBsaW5rcyBkYXRhIGlzIGRlcHJlY2F0ZWQgaW4gUk9VVEUgREVFUExJTksgREFUQSwgdXNlIG5hdkxpbmtzJylcblxuICAgICAgICAgIC8vIHRoaXMubmF2TGlua3MgPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3Qga2V5d29yZEFycnMgPSB0aGlzLmNvbXBhcmVSb3V0ZUtleXdvcmRzLmNvbXBhcmUocGF5bG9hZC5yb3V0ZURhdGEsIHBheWxvYWQucGF0aHMpXG4gICAgcGF5bG9hZCA9IHJNZXJnZShwYXlsb2FkLCBrZXl3b3JkQXJycylcbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHVuZGVmaW5lZCwgZXZ0LCB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclJvdXRlUGFyYW1zT3ZlcnJpZGVzKHBheWxvYWQpIHtcbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yRXZlbnRNZXRob2RzKG9icykge1xuICAgIGNvbnN0IHJlID0gL14oZXZlbnQpKFtBLVpdLiopKFtBLVpdLiopJC9nbVxuICAgIGNvbnN0IGdldE1ldGhvZHMgPSBjb21wb3NlKHJhbWRhRmlsdGVyKHRlc3QocmUpKSwga2V5cywgcHJvcCgncGF5bG9hZCcpKVxuICAgIGNvbnN0IG1ldGhvZHNBcnIgPSBnZXRNZXRob2RzKG9icylcbiAgICBpZiAobWV0aG9kc0Fyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3QgZXZ0ID0gcHJvcCgnZXZlbnQnLCBvYnMpXG4gICAgICBpZiAoZXZ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kVXBkYXRlID0gKG1hdGNoLCBwMSwgcDIsIHAzLCBwNCkgPT4gU3RyaW5nKHAyKS50b0xvd2VyQ2FzZSgpICsgcDMgKyBwNFxuICAgICAgICBjb25zdCBtZXRob2RTdHJSZXBsYWNlID0gcmVwbGFjZSgvXihldmVudCkoW0EtWl0pKC4qKShbQS1aXS4qKSQvZ20sIG1ldGhvZFVwZGF0ZSlcbiAgICAgICAgY29uc3QgcnVuTWV0aG9kID0gKG1ldGhvZFN0cikgPT4ge1xuICAgICAgICAgIGNvbnN0IG0gPSBtZXRob2RTdHJSZXBsYWNlKG1ldGhvZFN0cilcbiAgICAgICAgICBpZiAoZXZ0W21dICE9PSB1bmRlZmluZWQpIHsgZXZ0W21dKCkgfVxuICAgICAgICB9XG4gICAgICAgIG1ldGhvZHNBcnIuZm9yRWFjaChydW5NZXRob2QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ic1xuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yRW5kUm91dGUocGwsIHJvdXRlQ29uZmlnSnNvbiA9IHRoaXMucm91dGVDb25maWdKc29uLCBkZWJ1Z0Jvb2wpIHtcbiAgICBjb25zdCBlbmRSb3V0ZSA9IGNvbXBvc2UoZXF1YWxzKCd0cnVlJyksIHBhdGgoWydwYXlsb2FkJywgJ2VuZFJvdXRlJ10pKShwbClcblxuICAgIGlmIChlbmRSb3V0ZSAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHBsXG4gICAgfVxuICAgIGNvbnN0IGRlYnVnID0gZGVidWdCb29sICE9PSB1bmRlZmluZWQgPyBkZWJ1Z0Jvb2wgOiBTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWVcbiAgICBjb25zdCB7IHBheWxvYWQgfSA9IHBsXG5cbiAgICBjb25zdCBnZXRQcm9wVmFsID0gKHJvdXRlUGF0aCkgPT4ge1xuICAgICAgY29uc3Qgcm91dGVOYW1lID0gcHJvcCgncm91dGVOYW1lJywgcm91dGVQYXRoKVxuICAgICAgaWYgKHJvdXRlTmFtZSkge1xuICAgICAgICBjb25zdCBrZXlzQXJyID0gY29tcG9zZShrZXlzLCBvbWl0KFsncm91dGVOYW1lJ10pKShyb3V0ZVBhdGgpXG4gICAgICAgIGNvbnN0IHJvdXRlTmFtZVZhbCA9IHBheWxvYWRbcm91dGVOYW1lXVxuICAgICAgICBjb25zdCBwcmVkID0gYXJyU3RyID0+IG5ldyBSZWdFeHAoYF4ke2FyclN0cn0kYCkudGVzdChyb3V0ZU5hbWVWYWwpXG4gICAgICAgIGNvbnN0IHJvdXRlVmFsID0gZmluZChwcmVkLCBrZXlzQXJyKVxuICAgICAgICByZXR1cm4gcm91dGVWYWxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaXRlciA9IDBcbiAgICBjb25zdCBvblJlZHVjZVJvdXRlUGF0aHMgPSAoYWNjID0gW10sIGFycikgPT4ge1xuICAgICAgLy8gY29uc3QgW2tleSwgdmFsXSA9IGFyclxuICAgICAgY29uc3QgdmFsID0gYXJyWzFdXG4gICAgICBjb25zdCB7IHJvdXRlUGF0aCB9ID0gdmFsXG4gICAgICBjb25zdCByb3V0ZU5hbWUgPSBwcm9wKCdyb3V0ZU5hbWUnLCByb3V0ZVBhdGgpXG4gICAgICBjb25zdCByb3V0ZU5hbWVWYWwgPSBnZXRQcm9wVmFsKHJvdXRlUGF0aClcbiAgICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0LCB2YWwpXG4gICAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5LCB2YWwpXG4gICAgICBjb25zdCBpdGVyT2JqID0gaXNPYmogPT09IHRydWUgJiYgaXNBcnIgPT09IGZhbHNlXG4gICAgICBpdGVyID0gaXRlciArIDFcbiAgICAgIGlmIChpdGVyT2JqKSB7XG4gICAgICAgIGNvbnN0IG5leHRSb3V0ZVBhdGggPSByb3V0ZVBhdGhbcm91dGVOYW1lVmFsXVxuICAgICAgICAvLyBjb25zb2xlLmxvZygna2V5IGlzICcse2l0ZXIsYWNjLGtleSwgcm91dGVOYW1lLCByb3V0ZU5hbWVWYWwsIGl0ZXJPYmosIG5leHRSb3V0ZVBhdGh9KTtcbiAgICAgICAgaWYgKG5leHRSb3V0ZVBhdGgpIHtcbiAgICAgICAgICBjb21wb3NlKHJldmVyc2UsIHJlZHVjZShvblJlZHVjZVJvdXRlUGF0aHMsIGFjYyksIHRvUGFpcnMpKHsgbmV4dFJvdXRlUGF0aCB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiS0VZIElTIFwiLHtpdGVyLGtleSwgcm91dGVOYW1lLCByb3V0ZU5hbWVWYWx9KVxuICAgICAgICAgIGlmIChpdGVyID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB1c2Ugb2YgZW5kIHJvdXRlIG1ldGhvZCBzaG91bGQgYWRkIHN0YXJ0IHJvdXRlIHZhbHVlIG9mIFwiJHtyb3V0ZU5hbWV9XCIuYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjLnB1c2gocm91dGVOYW1lKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIGNvbnN0IHsgcm91dGVzIH0gPSByb3V0ZUNvbmZpZ0pzb25cblxuICAgIGNvbnN0IGVuZFJvdXRlVmFsQXJyID0gY29tcG9zZShyZXZlcnNlLCByZWR1Y2Uob25SZWR1Y2VSb3V0ZVBhdGhzLCBbXSksIHRvUGFpcnMpKHsgcm91dGVzIH0pXG4gICAgLy8gY29uc29sZS5sb2coJ2VuZCByb3V0ZSB2YWwgYXJyICcsZW5kUm91dGVWYWxBcnIpO1xuICAgIGlmIChlbmRSb3V0ZVZhbEFyci5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGVuZFJvdXRlVmFsID0gZW5kUm91dGVWYWxBcnJbMF1cbiAgICAgIHBsLnBheWxvYWRbZW5kUm91dGVWYWxdID0gJydcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIGVuZCByb3V0ZSBwYXJhbSBkaWQgbm90IHlpZWxkIGFueSByZXN1bHRzIGZvciAke0pTT04uc3RyaW5naWZ5KHBheWxvYWQpfSBgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGxcbiAgfVxuXG4gIG9uVmlld1N0cmVhbUluZm8ocGwpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBwbC5hY3Rpb24gPz8gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVFxuXG4gICAgZnVuY3Rpb24gZG9tU3RyaW5nTWFwVG9PYmplY3QoZG9tU3RyaW5nTWFwKSB7XG4gICAgICBjb25zdCBvYmogPSB7fVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZG9tU3RyaW5nTWFwKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl04oCZcyBhIGRpcmVjdCBwcm9wZXJ0eSAodGhvdWdoIGRhdGFzZXQgcmFyZWx5IGhhcyBhbnl0aGluZyBvbiB0aGUgcHJvdG90eXBlKTpcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkb21TdHJpbmdNYXAsIGtleSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IGRvbVN0cmluZ01hcFtrZXldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpcbiAgICB9XG5cbiAgICBpZiAocGw/LnNyY0VsZW1lbnQ/LmVsPy5kYXRhc2V0KSB7XG4gICAgICBwbC5wYXlsb2FkID0gZG9tU3RyaW5nTWFwVG9PYmplY3QocGw/LnNyY0VsZW1lbnQ/LmVsPy5kYXRhc2V0KSA/PyBwbC5wYXlsb2FkXG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coJ1JPVVRFIENIQU5ORUwgVlNJICcsIHsgcGwgfSlcblxuICAgIFNweW5lQ2hhbm5lbFJvdXRlLmNoZWNrRm9yRXZlbnRNZXRob2RzKHBsKVxuICAgIHBsID0gdGhpcy5jaGVja0ZvckVuZFJvdXRlKHBsKVxuICAgIGxldCBwYXlsb2FkID0gdGhpcy5nZXREYXRhRnJvbVBhcmFtcyhwbClcblxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBwcm9wKCdzcmNFbGVtZW50JywgcGwpXG4gICAgY29uc3QgZXZlbnQgPSBwcm9wKCdldmVudCcsIHBsKVxuICAgIGNvbnN0IGNoYW5nZUxvY2F0aW9uQm9vbCA9ICFwYXlsb2FkLmlzSGlkZGVuXG4gICAgY29uc3Qga2V5d29yZEFycnMgPSB0aGlzLmNvbXBhcmVSb3V0ZUtleXdvcmRzLmNvbXBhcmUocGF5bG9hZC5yb3V0ZURhdGEsIHBheWxvYWQucGF0aHMpXG5cbiAgICBwYXlsb2FkID0gck1lcmdlKHBheWxvYWQsIGtleXdvcmRBcnJzKVxuICAgIHRoaXMuc2VuZFJvdXRlU3RyZWFtKHBheWxvYWQsIGNoYW5nZUxvY2F0aW9uQm9vbClcblxuICAgIHBheWxvYWQgPSBTcHluZUNoYW5uZWxSb3V0ZS5yZW1vdmVTU0lEKHBheWxvYWQpXG5cbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50LFxuICAgICAgdGhpcy5uYXZUb1N0cmVhbSQpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tBbmRDb252ZXJ0U3RyV2l0aFJlZ2V4VG9rZW5zKHJvdXRlVmFsdWUsIHJlZ2V4VG9rZW5PYmopIHtcbiAgICBjb25zdCB0b2tlbktleXNBcnIgPSBrZXlzKHJlZ2V4VG9rZW5PYmopXG5cbiAgICByZXR1cm4gdG9rZW5LZXlzQXJyXG4gIH1cblxuICBzZW5kUm91dGVTdHJlYW0ocGF5bG9hZCwgY2hhbmdlV2luZG93TG9jID0gdHJ1ZSkge1xuICAgIGlmIChjaGFuZ2VXaW5kb3dMb2MgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2V0V2luZG93TG9jYXRpb24ocGF5bG9hZClcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVTdGF0ZSgpIHtcbiAgICByZXR1cm4gJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJ1xuICB9XG5cbiAgc3RhdGljIGdldElzRGVlcExpbmtCb29sKGlzSGlzdG9yeSkge1xuICAgIHJldHVybiBpc0hpc3RvcnkgPT09IGZhbHNlICYmIHRoaXMuX3JvdXRlQ291bnQgPT09IDBcbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZUNvdW50KGlzSGlzdG9yeSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX3JvdXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcm91dGVDb3VudCA9IDBcbiAgICAgIHJldHVybiB0aGlzLl9yb3V0ZUNvdW50XG4gICAgfVxuICAgIGlmIChpc0hpc3RvcnkgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl9yb3V0ZUNvdW50ICs9IDFcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlQ291bnRcbiAgfVxuXG4gIHN0YXRpYyBnZXRFeHRyYVBheWxvYWRQYXJhbXMoY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGlzSGlzdG9yeSA9IGZhbHNlKSB7XG4gICAgY29uc3Qgcm91dGVDb3VudCA9IHRoaXMuZ2V0Um91dGVDb3VudChpc0hpc3RvcnkpXG4gICAgY29uc3QgaXNEZWVwTGluayA9IHRoaXMuZ2V0SXNEZWVwTGlua0Jvb2woaXNIaXN0b3J5KVxuICAgIGNvbnN0IGlzSGFzaCA9IGNvbmZpZy5pc0hhc2hcbiAgICBjb25zdCBpc0hpZGRlbiA9IGNvbmZpZy5pc0hpZGRlblxuICAgIGNvbnN0IHJvdXRlVHlwZSA9IGNvbmZpZy50eXBlXG4gICAgcmV0dXJuIHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCBpc0hpc3RvcnksIGlzSGlkZGVuLCByb3V0ZVR5cGUgfVxuICB9XG5cbiAgc3RhdGljIGdldERhdGFGcm9tUGFyYW1zKHBsLCBjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbikge1xuICAgIGxldCByb3V0ZURhdGEgPSBwcm9wKCdwYXlsb2FkJywgcGwpXG5cbiAgICBjb25zdCByb3V0ZVZhbHVlID0gdGhpcy5nZXRSb3V0ZVN0ckZyb21QYXJhbXMocm91dGVEYXRhLCBjb25maWcpXG5cbiAgICAvLyBXSU5ET1cgTE9DQVRJT04gSEFTTidUIEJFRU4gQ0hBTkdFRCBZRVQsIFNPIFdJTEwgR0VUIFNUUiBQQVJBTVNcbiAgICBjb25zdCBnZXRQcm9wRnJvbUNvbmZpZyA9IChwcnAsIGRlZmFsdCkgPT4gZGVmYXVsdFRvKGRlZmFsdCwgcHJvcChwcnAsIGNvbmZpZykpXG4gICAgY29uc3QgdHlwZUZvclN0ciA9IGdldFByb3BGcm9tQ29uZmlnKCd0eXBlJywgJ3NsYXNoJylcbiAgICBjb25zdCBpc0hhc2hGb3JTdHIgPSBnZXRQcm9wRnJvbUNvbmZpZygnaXNIYXNoJywgZmFsc2UpXG4gICAgY29uc3QgbmV4dFdpbmRvd0xvYyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZm9ybWF0U3RyQXNXaW5kb3dMb2NhdGlvbihyb3V0ZVZhbHVlKVxuICAgIGNvbnN0IGRhdGFGcm9tU3RyID0gdGhpcy5nZXREYXRhRnJvbUxvY2F0aW9uU3RyKHR5cGVGb3JTdHIsIGlzSGFzaEZvclN0ciwgbmV4dFdpbmRvd0xvYylcblxuICAgIGNvbnN0IHsgcGF0aElubmVybW9zdCwgcGF0aHMgfSA9IGRhdGFGcm9tU3RyXG5cbiAgICByb3V0ZURhdGEgPSByTWVyZ2UoZGF0YUZyb21TdHIucm91dGVEYXRhLCByb3V0ZURhdGEpXG5cbiAgICBjb25zdCB7IHJvdXRlQ291bnQsIGlzRGVlcExpbmssIGlzSGFzaCwgaXNIaXN0b3J5LCBpc0hpZGRlbiwgcm91dGVUeXBlIH0gPSB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyhcbiAgICAgIGNvbmZpZylcbiAgICByZXR1cm4ge1xuICAgICAgaXNEZWVwTGluayxcbiAgICAgIHJvdXRlQ291bnQsXG4gICAgICBwYXRoSW5uZXJtb3N0LFxuICAgICAgcGF0aHMsXG4gICAgICByb3V0ZURhdGEsXG4gICAgICByb3V0ZVZhbHVlLFxuICAgICAgaXNIYXNoLFxuICAgICAgaXNIaWRkZW4sXG4gICAgICBpc0hpc3RvcnksXG4gICAgICByb3V0ZVR5cGVcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0RGF0YUZyb21TdHJpbmcoY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGlzSGlzdG9yeSA9IGZhbHNlKSB7XG4gICAgY29uc3QgdHlwZSA9IGNvbmZpZy50eXBlXG4gICAgY29uc3QgaGFzaElzVHJ1ZSA9IGNvbmZpZy5pc0hhc2ggPT09IHRydWVcbiAgICBjb25zdCBzdHIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmdldExvY2F0aW9uU3RyQnlUeXBlKHR5cGUsIGhhc2hJc1RydWUpXG4gICAgY29uc3QgeyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlIH0gPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRQYXJhbXNGcm9tUm91dGVTdHIoXG4gICAgICBzdHIsIGNvbmZpZywgdHlwZSlcbiAgICBjb25zdCB7IHJvdXRlQ291bnQsIGlzRGVlcExpbmssIGlzSGFzaCwgcm91dGVUeXBlLCBpc0hpZGRlbiB9ID0gdGhpcy5nZXRFeHRyYVBheWxvYWRQYXJhbXMoXG4gICAgICBjb25maWcsIGlzSGlzdG9yeSlcblxuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIGlzRGVlcExpbmssXG4gICAgICByb3V0ZUNvdW50LFxuICAgICAgcGF0aElubmVybW9zdCxcbiAgICAgIHBhdGhzLFxuICAgICAgcm91dGVEYXRhLFxuICAgICAgcm91dGVWYWx1ZSxcbiAgICAgIGlzSGFzaCxcbiAgICAgIGlzSGlkZGVuLFxuICAgICAgaXNIaXN0b3J5LFxuICAgICAgcm91dGVUeXBlXG4gICAgfVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIHN0YXRpYyBnZXREYXRhRnJvbUxvY2F0aW9uU3RyKHQgPSAnc2xhc2gnLCBpc0hhc2ggPSB0aGlzLnJvdXRlQ29uZmlnSnNvbi5pc0hhc2gsIGxvYyA9IHdpbmRvdy5sb2NhdGlvbikge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHRoaXMucm91dGVDb25maWdKc29uLnR5cGVcbiAgICAgIDogdFxuXG4gICAgY29uc3Qgc3RyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5nZXRMb2NhdGlvblN0ckJ5VHlwZSh0eXBlLCBpc0hhc2gsIGxvYylcbiAgICBjb25zdCB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfSA9IHRoaXMuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyKFxuICAgICAgc3RyLCB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgdHlwZSlcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmdldFJvdXRlU3RhdGUoKVxuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUsIGFjdGlvbiB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25EYXRhKCkge1xuICAgIGNvbnN0IGxvY2F0aW9uUGFyYW1zQXJyID0gW1xuICAgICAgJ2hyZWYnLFxuICAgICAgJ29yaWdpbicsXG4gICAgICAncHJvdG9jb2wnLFxuICAgICAgJ2hvc3QnLFxuICAgICAgJ2hvc3RuYW1lJyxcbiAgICAgICdwb3J0JyxcbiAgICAgICdwYXRobmFtZScsXG4gICAgICAnc2VhcmNoJyxcbiAgICAgICdoYXNoJ11cbiAgICByZXR1cm4gcGlja0FsbChsb2NhdGlvblBhcmFtc0Fyciwgd2luZG93LmxvY2F0aW9uKVxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlU3RyRnJvbVBhcmFtcyhwYXJhbXNEYXRhLCByb3V0ZUNvbmZpZywgdCkge1xuICAgIGNvbnN0IHR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogcm91dGVDb25maWcudHlwZVxuICAgIGNvbnN0IG9iaiA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY29udmVydFBhcmFtc1RvUm91dGUocGFyYW1zRGF0YSwgcm91dGVDb25maWcsIHR5cGUpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGdldFBhcmFtc0Zyb21Sb3V0ZVN0cihzdHIsIHJvdXRlQ29uZmlnLCB0KSB7XG4gICAgY29uc3QgdHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByb3V0ZUNvbmZpZy50eXBlXG4gICAgY29uc3Qgb2JqID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jb252ZXJ0Um91dGVUb1BhcmFtcyhzdHIsIHJvdXRlQ29uZmlnLCB0eXBlKVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGNoZWNrRW1wdHlSb3V0ZVN0cihzdHIsIGlzSGFzaCA9IGZhbHNlKSB7XG4gICAgY29uc3QgaXNFbXB0eUJvb2wgPSBpc0VtcHR5KHN0cilcbiAgICBjb25zdCBwYXRoTmFtZUlzRW1wdHlCb29sID0gaXNFbXB0eUJvb2wgPT09IHRydWUgJiYgaXNIYXNoID09PSBmYWxzZVxuICAgIGNvbnN0IGhhc2hOYW1lSXNFbXB0eUJvb2wgPSBpc0VtcHR5Qm9vbCA9PT0gdHJ1ZSAmJiBpc0hhc2ggPT09IHRydWVcbiAgICBjb25zdCBoYXNoTmFtZUJvb2wgPSBpc0VtcHR5Qm9vbCA9PT0gZmFsc2UgJiYgaXNIYXNoID09PSB0cnVlXG5cbiAgICBpZiAocGF0aE5hbWVJc0VtcHR5Qm9vbCA9PT0gdHJ1ZSB8fCBoYXNoTmFtZUlzRW1wdHlCb29sID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gJy8nXG4gICAgfSBlbHNlIGlmIChoYXNoTmFtZUJvb2wgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBjb25jYXQoJyMnLCBzdHIpXG4gICAgfVxuICAgIHJldHVybiBzdHJcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVMYXN0U2xhc2goc3RyKSB7XG4gICAgY29uc3QgcmUgPSAvXiguKikoXFwvKSQvXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKHJlLCAnJDEnKVxuICB9XG5cbiAgc2V0V2luZG93TG9jYXRpb24oY2hhbm5lbFBheWxvYWQpIHtcbiAgICBsZXQgeyBpc0hhc2gsIHJvdXRlVmFsdWUsIHJvdXRlVHlwZSB9ID0gY2hhbm5lbFBheWxvYWRcbiAgICByb3V0ZVZhbHVlID0gdGhpcy5jaGVja0VtcHR5Um91dGVTdHIocm91dGVWYWx1ZSwgaXNIYXNoKVxuICAgIGNvbnN0IHsgcm91dGVDb3VudCB9ID0gY2hhbm5lbFBheWxvYWRcbiAgICBpZiAoaXNIYXNoID09PSB0cnVlIHx8IHJvdXRlVHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgY29uc3QgcGF0aE5hbWUgPSBTcHluZUNoYW5uZWxSb3V0ZS5yZW1vdmVMYXN0U2xhc2god2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKVxuICAgICAgcm91dGVWYWx1ZSA9IHBhdGhOYW1lICsgcm91dGVWYWx1ZVxuICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHsgcm91dGVDb3VudCB9LCAnJywgcm91dGVWYWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2hlY2tGb3JTbGFzaCA9IHdoZW4oXG4gICAgICAgIGNvbXBvc2UoY29tcGxlbWVudChlcXVhbHMoJy8nKSksIGhlYWQpLCBjb25jYXQoJy8nLCBfXykpXG4gICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoeyByb3V0ZUNvdW50IH0sICcnLCBjaGVja0ZvclNsYXNoKHJvdXRlVmFsdWUpKVxuICAgIH1cbiAgfVxuXG4gIGdldFdpbmRvd0xvY2F0aW9uKCkge1xuICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgLy8gcHVsbEhhc2hBbmRTbGFzaEZyb21QYXRoKHdpbmRvdy5sb2NhdGlvbi5oYXNoKTtcbiAgfVxuXG4gIGJpbmRTdGF0aWNNZXRob2RzKCkge1xuICAgIHRoaXMuY2hlY2tGb3JFbmRSb3V0ZSA9IFNweW5lQ2hhbm5lbFJvdXRlLmNoZWNrRm9yRW5kUm91dGUuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0SXNEZWVwTGlua0Jvb2wgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRJc0RlZXBMaW5rQm9vbC5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXREYXRhRnJvbUxvY2F0aW9uU3RyID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RGF0YUZyb21Mb2NhdGlvblN0ci5iaW5kKFxuICAgICAgdGhpcylcbiAgICB0aGlzLm9uSW5jb21pbmdEb21FdmVudCA9IFNweW5lQ2hhbm5lbFJvdXRlLm9uSW5jb21pbmdEb21FdmVudC5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXREYXRhRnJvbVN0cmluZyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldERhdGFGcm9tU3RyaW5nLmJpbmQodGhpcylcbiAgICB0aGlzLmdldFBhcmFtc0Zyb21Sb3V0ZVN0ciA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFBhcmFtc0Zyb21Sb3V0ZVN0ci5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRMb2NhdGlvbkRhdGEgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRMb2NhdGlvbkRhdGEuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0Um91dGVTdGF0ZSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFJvdXRlU3RhdGUuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0RGF0YUZyb21QYXJhbXMgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXREYXRhRnJvbVBhcmFtcy5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRSb3V0ZUNvdW50ID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0Um91dGVDb3VudC5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRFeHRyYVBheWxvYWRQYXJhbXMgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRFeHRyYVBheWxvYWRQYXJhbXMuYmluZCh0aGlzKVxuICAgIHRoaXMuYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSgpXG4gIH1cblxuICBiaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhKCkge1xuICAgIGNvbnN0IGN1cnJpZWRHZXRSb3V0ZSA9IGN1cnJ5TigzLCBTcHluZUNoYW5uZWxSb3V0ZS5nZXRSb3V0ZVN0ckZyb21QYXJhbXMpXG4gICAgdGhpcy5nZXRSb3V0ZVN0ckZyb21QYXJhbXMgPSBjdXJyaWVkR2V0Um91dGUoX18sIHRoaXMucm91dGVDb25maWdKc29uLFxuICAgICAgdGhpcy5yb3V0ZUNvbmZpZ0pzb24udHlwZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBlcXVhbHMsIHBhdGgsIGNvbXBvc2UsIHByb3AsIGZpbHRlciwgcmVwbGFjZSwgbGVuc1Byb3AsIG92ZXIsIG9taXQsIHRlc3QsIGtleXMsIGVpdGhlciwgdG9VcHBlciB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgc2FuaXRpemVFdmVudFRhcmdldCB9IGZyb20gJy4uL3V0aWxzL3Nhbml0aXplLWRhdGEuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxVSSBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxVSVxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgQ2hhbm5lbCBsaXN0ZW5zIHRvIGFsbCBVc2VyIEV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzZXQgdG8gYnJvYWRjYXN0IGJ5IFZpZXdTdHJlYW0gaW5zdGFuY2VzLCB1c2luZyB0aGUgYnJvYWRDYXN0RXZlbnRzIG1ldGhvZC48L3A+XG4gICAqIDxwPkhUTUwgRWxlbWVudHMgdGhhdCBoYXZlIHRoZWlyIGRhdGEgY2hhbm5lbCBwcm9wZXJ0eSBzZXQgdG8gXCJST1VURVwiIHdpbGwgYnJvYWRjYXN0IHRoZWlyIHVpIGV2ZW50IHRvIHRoYXQgY2hhbm5lbCBpbnN0ZWFkLjwvcD5cbiAgICogPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZSBtb2RhbC1idG4nICBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS12YWx1ZT0ndWlFdmVudHMnPlZpZXcgVUkgRXZlbnRzPC9kaXY+PC9icj48L2JyPlxuICAgKiA8cD5TZWUgTElOS1snVmlld1N0cmVhbScsICd2aWV3LXN0cmVhbSddIGZvciBhbiBleGFtcGxlIG9uIGhvdyB0byBiaW5kIEhUTUwgRWxlbWVudHMgdG8gdGhlIFVJIENoYW5uZWwuPC9wPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfVUknO1xuICAgKlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihuYW1lID0gJ0NIQU5ORUxfVUknLCBwcm9wcyA9IHt9KSB7XG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSBmYWxzZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICAgIHRoaXMua2V5RXZlbnRzTG9hZGVkID0gZmFsc2VcbiAgICB0aGlzLmtleUNvZGVBcnIgPSBbXVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1VJX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUJPUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUREVFJBQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUZURVJQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BRlRFUlNDUklQVEVYRUNVVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05JVEVSQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVBQSU5TVEFMTEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVRElPRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVRElPU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVVYQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFR0lORVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkxPQ0tFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CTFVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JPVU5EQVJZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JVRkZFUkVEQU1PVU5UTE9XX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5QTEFZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NBTlBMQVlUSFJPVUdIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTE9TRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTE9TSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBMRVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09NUE9TSVRJT05VUERBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OTkVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05ORUNUSU9OU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OVEVOVERFTEVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05URVhUTUVOVV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT1BZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NVRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREFUQUNIQU5ORUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREJMQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREVWSUNFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RFVklDRU1PVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ERVZJQ0VPUklFTlRBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR0VOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJPUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EVVJBVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTVBUSUVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRFVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTlRFUlBJQ1RVUkVJTlBJQ1RVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT0NVU09VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT1JNREFUQV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GVUxMU0NSRUVOQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZVTExTQ1JFRU5FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HQU1FUEFEQ09OTkVDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dBTUVQQURESVNDT05ORUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0FUSEVSSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0VTVFVSRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HRVNUVVJFRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dFU1RVUkVTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HT1RQT0lOVEVSQ0FQVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9IQVNIQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUNBTkRJREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDQU5ESURBVEVFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDT05ORUNUSU9OU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFR0FUSEVSSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5QVVRTT1VSQ0VTQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOU1RBTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5WQUxJRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9LRVlET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0tFWVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xBTkdVQUdFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xFQVZFUElDVFVSRUlOUElDVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFRERBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BREVETUVUQURBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BREVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FEU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9TVFBPSU5URVJDQVBUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01BUktfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUVSQ0hBTlRWQUxJREFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FU1NBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUVTU0FHRUVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRUVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01VVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTkVHT1RJQVRJT05ORUVERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTk9NQVRDSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9OT1RJRklDQVRJT05DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PRkZMSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09OTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PUEVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09SSUVOVEFUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBR0VISURFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBR0VTSE9XX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBU1RFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBVVNFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBWUVSREVUQUlMQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBWU1FTlRNRVRIT0RDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUExBWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QTEFZSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJDQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkRPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTE9DS0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTE9DS0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUk9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUlVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPUFNUQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BST0dSRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BVU0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUFVTSFNVQlNDUklQVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFQURZU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVKRUNUSU9OSEFORExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRU1PVkVUUkFDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRU1PVkVTVFJFQU1fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVQRUFURVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTRVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTSVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU09VUkNFVElNSU5HQlVGRkVSRlVMTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNVTFRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTVU1FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NDUk9MTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUFSQ0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VFS0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFRUtJTkdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVEVEQ0FORElEQVRFUEFJUkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NISVBQSU5HQUREUkVTU0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSElQUElOR09QVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSUdOQUxJTkdTVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TTE9UQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NPVU5ERU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NPVU5EU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1BFRUNIRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NQRUVDSFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NRVUVFWkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1FVRUVaRUVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUVVFRVpFU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVE9SQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NVQk1JVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVUNDRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NVU1BFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVElNRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9USU1FVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPR0dMRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT05FQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNIQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNIRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNITU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OUlVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VTkhBTkRMRURSRUpFQ1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VOTVVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VUEdSQURFTkVFREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZFUlNJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVklTSUJJTElUWUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WT0lDRVNDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZPTFVNRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlBQ1RJVkFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlCTFVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUNPTk5FQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZREVBQ1RJVkFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlESVNDT05ORUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUZPQ1VTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBPSU5URVJSRVNUUklDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBPSU5URVJVTlJFU1RSSUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZUFJFU0VOVENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XQUlUSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQkdMQ09OVEVYVENSRUFUSU9ORVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCR0xDT05URVhUTE9TVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJHTENPTlRFWFRSRVNUT1JFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRVdJTExCRUdJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XSEVFTF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBsb2FkS2V5U3RyZWFtKCkge1xuICAgIGNvbnN0IGtleVVwcyA9IE9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAna2V5dXAnKVxuICAgIGNvbnN0IGZpbHRlcktleXMgPSBlID0+IHRoaXMua2V5Q29kZUFyci5pbmRleE9mKGUua2V5Q29kZSkgPj0gMFxuICAgIHRoaXMua2V5UHJlc3NlcyQgPSBrZXlVcHMuZ3JvdXBCeShlID0+IGUua2V5Q29kZSlcbiAgICAgIC5tZXJnZUFsbCgpXG4gICAgICAuZmlsdGVyKGZpbHRlcktleXMpXG4gICAgICAucmVwZWF0KClcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vbktleVByZXNzZWQuYmluZCh0aGlzKSlcbiAgfVxuXG4gIGFkZEtleUV2ZW50KG51bSkge1xuICAgIGlmICh0aGlzLmtleUV2ZW50c0xvYWRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubG9hZEtleVN0cmVhbSgpXG4gICAgfVxuICAgIHRoaXMua2V5RXZlbnRzTG9hZGVkID0gdHJ1ZVxuICAgIHRoaXMucmVnaXN0ZXJLZXkobnVtKVxuICB9XG5cbiAgcmVnaXN0ZXJLZXkoYykge1xuICAgIHRoaXMua2V5Q29kZUFyci5wdXNoKGMpXG4gIH1cblxuICBvbktleVByZXNzZWQoZXZ0KSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2tleSBpcyAnLCBldnQpO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZVNTSUQocGwpIHtcbiAgICBjb25zdCByb3V0ZUxlbnMgPSBsZW5zUHJvcChbJ3BheWxvYWQnXSlcbiAgICBjb25zdCBvbWl0U1NJRCA9IG92ZXIocm91dGVMZW5zLCBvbWl0KFsndnNpZCddKSlcbiAgICByZXR1cm4gb21pdFNTSUQocGwpXG4gIH1cblxuICBvbkluY29taW5nT2JzZXJ2YWJsZShvYmopIHtcbiAgICBjb25zdCBlcXNOYW1lID0gZXF1YWxzKG9iai5uYW1lLCB0aGlzLnByb3BzLm5hbWUpXG4gICAgb2JqLmRhdGEgPSBTcHluZUNoYW5uZWxVSS5yZW1vdmVTU0lEKG9iai5kYXRhKVxuICAgIGNvbnN0IHsgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JqLmRhdGFcbiAgICBjb25zdCBkYXRhT2JqID0gb2JzVmFsID0+ICh7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50OiBvYnNWYWwgfSlcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAob2JqKSA9PiBvYmoub2JzZXJ2YWJsZS5waXBlKG1hcChkYXRhT2JqKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vblVJRXZlbnQuYmluZCh0aGlzKSlcbiAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge31cbiAgICByZXR1cm4gZXFzTmFtZSA9PT0gdHJ1ZSA/IG9uU3VjY2VzcyhvYmopIDogb25FcnJvcigpXG4gIH1cblxuICBnZXRBY3Rpb25TdGF0ZSh2YWwpIHtcbiAgICBjb25zdCB0eXBlVmFsID0gcGF0aChbJ2V2ZW50JywgJ3R5cGUnXSlcbiAgICBjb25zdCB0eXBlT3ZlclJpZGVWYWwgPSBwYXRoKFsnZXZlbnQnLCAndHlwZU92ZXJSaWRlJ10pXG4gICAgY29uc3QgZXZlbnRUeXBlID0gY29tcG9zZSh0b1VwcGVyLCBlaXRoZXIodHlwZU92ZXJSaWRlVmFsLCB0eXBlVmFsKSlcbiAgICBjb25zdCB0eXBlID0gZXZlbnRUeXBlKHZhbClcbiAgICBjb25zdCBtYWluQWN0aW9uID0gJ0NIQU5ORUxfVUknXG4gICAgcmV0dXJuIHR5cGUgIT09IHVuZGVmaW5lZCA/IGAke21haW5BY3Rpb259XyR7dHlwZX1fRVZFTlRgIDogbWFpbkFjdGlvblxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yRXZlbnRNZXRob2RzKG9icykge1xuICAgIGNvbnN0IHJlID0gL14oZXZlbnQpKFtBLVpdLiopKFtBLVpdLiopJC9nbVxuICAgIGNvbnN0IGdldE1ldGhvZHMgPSBjb21wb3NlKGZpbHRlcih0ZXN0KHJlKSksIGtleXMsIHByb3AoJ3BheWxvYWQnKSlcbiAgICBjb25zdCBtZXRob2RzQXJyID0gZ2V0TWV0aG9kcyhvYnMpXG4gICAgaWYgKG1ldGhvZHNBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGV2dCA9IHByb3AoJ2V2ZW50Jywgb2JzKVxuICAgICAgaWYgKGV2dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZFVwZGF0ZSA9IChtYXRjaCwgcDEsIHAyLCBwMywgcDQpID0+IFN0cmluZyhwMikudG9Mb3dlckNhc2UoKSArIHAzICsgcDRcbiAgICAgICAgY29uc3QgbWV0aG9kU3RyUmVwbGFjZSA9IHJlcGxhY2UoL14oZXZlbnQpKFtBLVpdKSguKikoW0EtWl0uKikkL2dtLCBtZXRob2RVcGRhdGUpXG4gICAgICAgIGNvbnN0IHJ1bk1ldGhvZCA9IChtZXRob2RTdHIpID0+IHtcbiAgICAgICAgICBjb25zdCBtID0gbWV0aG9kU3RyUmVwbGFjZShtZXRob2RTdHIpXG4gICAgICAgICAgaWYgKGV2dFttXSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAoZXZ0W21dKSA9PT0gJ2Z1bmN0aW9uJykgeyBldnRbbV0oKSB9XG4gICAgICAgIH1cbiAgICAgICAgbWV0aG9kc0Fyci5mb3JFYWNoKHJ1bk1ldGhvZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JzXG4gIH1cblxuICBvblVJRXZlbnQob2JzKSB7XG4gICAgZnVuY3Rpb24gZG9tU3RyaW5nTWFwVG9PYmplY3QoZG9tU3RyaW5nTWFwKSB7XG4gICAgICBjb25zdCBvYmogPSB7fVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZG9tU3RyaW5nTWFwKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl04oCZcyBhIGRpcmVjdCBwcm9wZXJ0eSAodGhvdWdoIGRhdGFzZXQgcmFyZWx5IGhhcyBhbnl0aGluZyBvbiB0aGUgcHJvdG90eXBlKTpcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkb21TdHJpbmdNYXAsIGtleSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IGRvbVN0cmluZ01hcFtrZXldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpcbiAgICB9XG5cbiAgICBvYnMucGF5bG9hZCA9IGRvbVN0cmluZ01hcFRvT2JqZWN0KG9icz8uc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpID8/IG9icy5wYXlsb2FkXG5cbiAgICBTcHluZUNoYW5uZWxVSS5jaGVja0ZvckV2ZW50TWV0aG9kcyhvYnMpXG4gICAgb2JzLmFjdGlvbiA9IHRoaXMuZ2V0QWN0aW9uU3RhdGUob2JzKVxuICAgIGNvbnN0IGFjdGlvbiA9IG9icy5hY3Rpb24vLyB0aGlzLmdldEFjdGlvblN0YXRlKG9icyk7XG4gICAgLy8gY29uc3QgeyBzcmNFbGVtZW50IH0gPSBvYnNcbiAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQgfSA9IG9ic1xuXG4gICAgY29uc3QgZXZlbnQgPSBvYnMuZXZlbnRcbiAgICBzYW5pdGl6ZUV2ZW50VGFyZ2V0KGV2ZW50Py50YXJnZXQpXG4gICAgLy8gY29uc3QgcGF5bG9hZCA9IGRvbVN0cmluZ01hcFRvT2JqZWN0KHNyY0VsZW1lbnQ/LmVsPy5kYXRhc2V0KSA/PyBvYnMucGF5bG9hZFxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5pbXBvcnQgeyBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsIH0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtd2luZG93LmpzJ1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwLCBkZWJvdW5jZVRpbWUsIHNraXBXaGlsZSwgYnVmZmVyLCBidWZmZXJDb3VudCwgdGhyb3R0bGVUaW1lLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGN1cnJ5LCBwaWNrLCBwYXJ0aWFsUmlnaHQsIG1hcE9iakluZGV4ZWQsIGFwcGx5LCBtYXAgYXMgck1hcCB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZS5qcydcblxuY29uc3QgY3VzdG9tQWN0aW9uc0FyciA9IFtdXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxXaW5kb3cgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsV2luZG93XG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhlIFdpbmRvdyBDaGFubmVsIHdpbGwgbGlzdGVuIHRvIHdpbmRvdyBhbmQgZG9jdW1lbnQgZXZlbnRzIHRoYXQgYXJlIHNldCBpbiBpdHMgY29uZmlndXJhdGlvbiBmaWxlXG4gICAqIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUgbW9kYWwtYnRuJyAgZGF0YS10eXBlPSdtb2RhbC13aW5kb3cnIGRhdGEtdmFsdWU9J3dpbmRvd0V2ZW50cyc+VmlldyBXaW5kb3cgRXZlbnRzPC9kaXY+PC9icj48L2JyPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IENIQU5ORUxfTkFNRVxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcgLSA9IHt9OyBUaGUgY29uZmlnIGhhcyBzZXZlcmFsIG9wdGlvbnMgdXNlZCB0byBsaXN0ZW4gdG8gd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IGNvbmZpZy5ldmVudHMgLSA9IFtdOyBBbnkgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMgY2FuIGJlIGFkZGVkIGhlcmUuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IGNvbmZpZy5jdXN0b21FdmVudHMgLSA9IFtdOyBBcHBsaWNhdGlvbiBDdXN0b21FdmVudHMgdG8gY2FwdHVyZS4gRWFjaCBlbnRyeSBpcyBlaXRoZXIgYW4gZXZlbnQgbmFtZSBzdHJpbmcsIG9yIGFuIG9iamVjdCB3aXRoIGEgbmFtZSBwcm9wZXJ0eSBwbHVzIE9ORSByYXRlL2JhdGNoIG9wdGlvbjogYnVmZmVyIChtcyBvZiBxdWlldCB0aGF0IGNsb3NlcyBhIGJhdGNoOyBlbWl0cyBvbmUgcGF5bG9hZCB3aG9zZSBwYXlsb2FkLmRldGFpbCBpcyB0aGUgYXJyYXkgb2YgYmF0Y2hlZCBkZXRhaWxzKSwgY291bnQgKGJhdGNoIGV2ZXJ5IG4gZXZlbnRzKSwgZGVib3VuY2UgKG1zOyBlbWl0cyBvbmx5IHRoZSBsYXRlc3QgZXZlbnQpLCBvciB0aHJvdHRsZSAobXM7IGVtaXRzIHRoZSBsZWFkaW5nIGV2ZW50IHBlciB3aW5kb3cpLiBFeGFtcGxlOiBbJ3NpbXBsZV9ldmVudCcsIHtuYW1lOiAnc3B5bmVfY21zX2l0ZW1fY29ubmVjdGVkJywgYnVmZmVyOiA0MDB9XS5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbmZpZy5tZWRpYVF1ZXJpZXMgLSA9IHt9OyBNZWRpYSBxdWVyaWVzIGFyZSBhZGRlZCBhcyBrZXksdmFsdWUgcGFpcnM7IHRoZSBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIGJvb2xlYW4gZm9yIHRoZSBxdWVyeSwgdGhlIHZhbHVlIGlzIHRoZSBxdWVyeSBpdHNlbGYuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmxpc3RlbkZvclJlc2l6ZSAtID0gdHJ1ZTsgVGhpcyBpcyBkZWZhdWx0IGxpc3RlbmluZyBmb3IgcmVzaXplIGV2ZW50LlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5saXN0ZW5Gb3JPcmllbnRhdGlvbiAtID0gdHJ1ZTsgTGlzdGVuIGZvciBob3Jpem9udGFsIGFuZCBsYW5kc2NhcGUgb3JpZW50YXRpb24gY2hhbmdlcyBvbiBtb2JpbGUgZGV2aWNlcy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcubGlzdGVuRm9yTW91c2VXaGVlbCAtID0gZmFsc2U7IElmIHNldCB0byB0cnVlLCB3aWxsIGxpc3RlbiBmb3IgbW91c2VXaGVlbCBhbmQgd2lsbCBhZGQgZGlyZWN0aW9uIGFuZCBkaXN0YW5jZSBwYXJhbWV0ZXJzLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclJlc2l6ZSAtID0gMjAwOyBUaGUgdGltZSBiZXR3ZWVuIHJlc2l6ZSBldmVudHMgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclNjcm9sbCAtID0gMTUwOyBUaGUgdGltZSBiZXR3ZWVuIHNjcm9sbCBldmVudHMgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9XSU5ET1cnO1xuICAgKlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoQ0hBTk5FTF9OQU1FID0gJ0NIQU5ORUxfV0lORE9XJykge1xuICAgIHN1cGVyKENIQU5ORUxfTkFNRSlcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzKClcbiAgICB0aGlzLmN1cnJlbnRTY3JvbGxZID0gMFxuICB9XG5cbiAgaW5pdGlhbGl6ZVN0cmVhbSgpIHtcbiAgICB0aGlzLmRvbUNoYW5uZWxDb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLldJTkRPV1xuICAgIGNvbnN0IG9icyRBcnIgPSB0aGlzLmdldEFjdGl2ZU9ic2VydmFibGVzKClcbiAgICBjb25zdCBkb20kID0gbWVyZ2UoLi4ub2JzJEFycilcbiAgICB0aGlzLmRvbSQgPSBkb20kXG4gICAgZG9tJC5zdWJzY3JpYmUocCA9PiB7XG4gICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyBnZXRNb3VzZVdoZWVsTWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX1dIRUVMX0VWRU5UXG4gICAgY29uc3Qgc2Nyb2xsRGlyID0gZXZlbnQuZGVsdGFZIDw9IDAgPyAndXAnIDogJ2Rvd24nXG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSwgZGVsdGFaIH0gPSBldmVudFxuICAgIGNvbnN0IHBheWxvYWQgPSB7IHNjcm9sbERpciwgZGVsdGFYLCBkZWx0YVksIGRlbHRhWiB9XG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVDdXJyaWVkR2VuZXJpY0V2ZW50KGFjdGlvblN0cikge1xuICAgIGNvbnN0IGFjdGlvbiA9IGBDSEFOTkVMX1dJTkRPV18ke2FjdGlvblN0ci50b1VwcGVyQ2FzZSgpfV9FVkVOVGBcbiAgICBjb25zdCBjdXJyeUZuID0gY3VycnkoU3B5bmVDaGFubmVsV2luZG93Lm1hcEdlbmVyaWNFdmVudClcbiAgICByZXR1cm4gY3VycnlGbihhY3Rpb24pXG4gIH1cblxuICBzdGF0aWMgbWFwR2VuZXJpY0V2ZW50KGFjdG4sIGV2ZW50KSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJtYXAgZ2VuZXJpYyBldmVudCBcIixhY3RuKTtcbiAgICBjb25zdCBhY3Rpb24gPSBhY3RuXG4gICAgY29uc3QgcGF5bG9hZCA9IGV2ZW50XG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSZXNpemVNYXBGbihldmVudCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soXG4gICAgICBbJ2lubmVyV2lkdGgnLCAnaW5uZXJIZWlnaHQnLCAnb3V0ZXJXaWR0aCcsICdvdXRlckhlaWdodCddLCB3aW5kb3cpXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRPcmllbnRhdGlvbk1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19PUklFTlRBVElPTl9FVkVOVFxuICAgIGNvbnN0IG9yaWVudGF0aW9uU3RyID0gJyhvcmllbnRhdGlvbjogcG9ydHJhaXQpJ1xuICAgIGNvbnN0IGlzUG9ydHJhaXRCb29sID0gd2luZG93Lm1hdGNoTWVkaWEob3JpZW50YXRpb25TdHIpLm1hdGNoZXNcbiAgICBjb25zdCBwYXlsb2FkID0gcGljayhcbiAgICAgIFsnaW5uZXJXaWR0aCcsICdpbm5lckhlaWdodCcsICdvdXRlcldpZHRoJywgJ291dGVySGVpZ2h0J10sIHdpbmRvdylcbiAgICBwYXlsb2FkLm9yaWVudGF0aW9uID0gaXNQb3J0cmFpdEJvb2wgPT09IHRydWVcbiAgICAgID8gJ3BvcnRyYWl0J1xuICAgICAgOiAnbGFuZHNjYXBlJ1xuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBnZXRNZWRpYVF1ZXJ5TWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX01FRElBX1FVRVJZX0VWRU5UXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soWydtYXRjaGVzJywgJ21lZGlhJywgJ21lZGlhUXVlcnlOYW1lJ10sIGV2ZW50KVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBjcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZShjb25maWcpIHtcbiAgICBjb25zdCBkZWJvdW5jZVQgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGxcblxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KCd3aGVlbCcsXG4gICAgICBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0TW91c2VXaGVlbE1hcEZuLmJpbmQodGhpcykpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKGRlYm91bmNlVClcbiAgICAgIClcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxEYXRhKCkge1xuICAgIGxldCBjdXJyZW50U2Nyb2xsWSA9IDBcblxuICAgIGNvbnN0IGdldFNjcm9sbERhdGEgPSAoc2Nyb2xsWSkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsRGlzdGFuY2UgPSBjdXJyZW50U2Nyb2xsWSAtIHNjcm9sbFlcbiAgICAgIGNvbnN0IHNjcm9sbERpciA9IHNjcm9sbERpc3RhbmNlID49IDAgPyAndXAnIDogJ2Rvd24nXG4gICAgICBjdXJyZW50U2Nyb2xsWSA9IHNjcm9sbFlcbiAgICAgIHJldHVybiB7IHNjcm9sbFksIHNjcm9sbERpc3RhbmNlLCBzY3JvbGxEaXIgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0U2Nyb2xsRGF0YVxuICB9XG5cbiAgc3RhdGljIGdldFNjcm9sbFkoc2Nyb2xsRWxlbWVudCkge1xuICAgIHJldHVybiBzY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0ICE9PSB1bmRlZmluZWQgPyBzY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0IDogc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3BcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxNYXBGbihldmVudCwgaW50ZXJ2YWwsIGFjdGlvbiwgc2Nyb2xsRGF0YUZuLCBzY3JvbGxFbGVtZW50KSB7XG4gICAgY29uc3Qgc2Nyb2xsWSA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxZKHNjcm9sbEVsZW1lbnQpXG4gICAgY29uc3QgcGF5bG9hZCA9IHNjcm9sbERhdGFGbihzY3JvbGxZKVxuICAgIGNvbnN0IHsgc2Nyb2xsRGlzdGFuY2UgfSA9IHBheWxvYWRcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgc2Nyb2xsRGlzdGFuY2UsIGV2ZW50IH1cbiAgfVxuXG4gIGNyZWF0ZVNjcm9sbE9ic2VydmFibGUoY29uZmlnLCBzY3JvbGxFbGVtZW50ID0gd2luZG93LCBpc1Bhc3NpdmUgPSB0cnVlKSB7XG4gICAgY29uc3Qgc2tpcFdoZW5EaXJJc01pc3NpbmcgPSBldnQgPT4gZXZ0LnNjcm9sbERpc3RhbmNlID09PSAwXG4gICAgY29uc3QgZFRpbWUgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGxcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBzY3JvbGxFbGVtZW50XG5cbiAgICBjb25zdCBpc1dpbmRvdyA9IHNjcm9sbEVsZW1lbnQgPT09IHdpbmRvd1xuXG4gICAgY29uc3Qgc2Nyb2xsRWxGb3JWYWxzID0gY29uZmlnLnNjcm9sbEVsRm9yVmFscyAhPT0gdW5kZWZpbmVkID8gY29uZmlnLnNjcm9sbEVsRm9yVmFscyA6IHNjcm9sbEVsZW1lbnRcbiAgICBjb25zdCBhY3Rpb24gPSBpc1dpbmRvdyA/ICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRVZFTlQnIDogJ0NIQU5ORUxfV0lORE9XX0VMRU1FTlRfU0NST0xMX0VWRU5UJ1xuXG4gICAgY29uc3Qgc2Nyb2xsRGF0YUZuID0gU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbERhdGEoKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiU0NST0xMIEVMRU1FTlQgXCIsYWN0aW9uLHNjcm9sbEVsZW1lbnQsIHNjcm9sbEVsRm9yVmFscyk7XG4gICAgY29uc3Qgc2Nyb2xsTWFwRm4gPSBwYXJ0aWFsUmlnaHQoU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbE1hcEZuLCBbYWN0aW9uLCBzY3JvbGxEYXRhRm4sIHNjcm9sbEVsRm9yVmFscywgaXNQYXNzaXZlLCBlbGVtZW50XSkuYmluZCh0aGlzKVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJjcmVhdGVTY3JvbGxPYnNlcnZhYmxlIFwiLCB7c2Nyb2xsTWFwRm4sIHNjcm9sbERhdGFGbiwgYWN0aW9uLCBjb25maWcsIHNjcm9sbEVsZW1lbnQsIGVsZW1lbnR9KVxuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ3Njcm9sbCcsXG4gICAgICBzY3JvbGxNYXBGbiwgaXNQYXNzaXZlLCBlbGVtZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZShkVGltZSksXG4gICAgICAgIHNraXBXaGlsZShza2lwV2hlbkRpcklzTWlzc2luZyksXG4gICAgICAgIG1hcChwID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdTY3JvbGxZID0gU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbFkoZWxlbWVudClcbiAgICAgICAgICBwLnBheWxvYWQuc2Nyb2xsRGlzdGFuY2VBYnMgPSBNYXRoLmFicyh0aGlzLmN1cnJlbnRTY3JvbGxZIC0gbmV3U2Nyb2xsWSlcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTY3JvbGxZID0gbmV3U2Nyb2xsWVxuICAgICAgICAgIHJldHVybiBwXG4gICAgICAgIH0pXG4gICAgICApXG4gIH1cblxuICBjcmVhdGVPcmllbnRhdGlvbk9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJhZGQgb3JpZW50YXRpb25cIik7b3JpZW50YXRpb25jaGFuZ2VcbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgnb3JpZW50YXRpb25jaGFuZ2UnLFxuICAgICAgU3B5bmVDaGFubmVsV2luZG93LmdldE9yaWVudGF0aW9uTWFwRm4uYmluZCh0aGlzKSlcbiAgfVxuXG4gIGNyZWF0ZVJlc2l6ZU9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgZFRpbWUgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JSZXNpemVcbiAgICAvLyBjb25zb2xlLmxvZygncmVzaXplIHRoaXMgJywgdGhpcyk7XG5cbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgncmVzaXplJyxcbiAgICAgIFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRSZXNpemVNYXBGbi5iaW5kKHRoaXMpKS5waXBlKGRlYm91bmNlVGltZShkVGltZSkpXG4gIH1cblxuICBnZXRFdmVudHNGcm9tQ29uZmlnKGNvbmZpZyA9IHRoaXMuZG9tQ2hhbm5lbENvbmZpZykge1xuICAgIGNvbnN0IG9icyRBcnIgPSBjb25maWcuZXZlbnRzXG5cbiAgICBjb25zdCBjdXN0b21FbnRyaWVzID0gQXJyYXkuaXNBcnJheShjb25maWcuY3VzdG9tRXZlbnRzKVxuICAgICAgPyBjb25maWcuY3VzdG9tRXZlbnRzLm1hcChTcHluZUNoYW5uZWxXaW5kb3cuY29uZm9ybUN1c3RvbUV2ZW50Q29uZmlnKS5maWx0ZXIoZW50cnkgPT4gZW50cnkgIT09IG51bGwpXG4gICAgICA6IFtdXG5cbiAgICBjdXN0b21FbnRyaWVzLmZvckVhY2goZW50cnkgPT4gdGhpcy51cGRhdGVDaGFubmVsQWN0aW9ucyhlbnRyeS5uYW1lKSlcblxuICAgIGNvbnN0IGFkZFdpbmRvd0V2ZW50VG9BcnIgPSBzdHIgPT4ge1xuICAgICAgY29uc3QgbWFwRm4gPSBTcHluZUNoYW5uZWxXaW5kb3cuY3JlYXRlQ3VycmllZEdlbmVyaWNFdmVudChzdHIpXG4gICAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudChzdHIsIG1hcEZuKVxuICAgIH1cblxuICAgIGNvbnN0IGFkZEN1c3RvbUV2ZW50VG9BcnIgPSAoeyBuYW1lLCBvcGVyYXRvciwgdmFsdWUgfSkgPT4ge1xuICAgICAgY29uc3Qgb2JzJCA9IGFkZFdpbmRvd0V2ZW50VG9BcnIobmFtZSlcbiAgICAgIHJldHVybiBvcGVyYXRvciA9PT0gdW5kZWZpbmVkID8gb2JzJCA6IFNweW5lQ2hhbm5lbFdpbmRvdy5jdXN0b21pemVDdXN0b21FdmVudE9ic2VydmFibGUob2JzJCwgb3BlcmF0b3IsIHZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiByTWFwKGFkZFdpbmRvd0V2ZW50VG9BcnIsIG9icyRBcnIpLmNvbmNhdChyTWFwKGFkZEN1c3RvbUV2ZW50VG9BcnIsIGN1c3RvbUVudHJpZXMpKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgYSBjb25maWcuY3VzdG9tRXZlbnRzIGVudHJ5IOKAlCBhbiBldmVudCBuYW1lIHN0cmluZyBvciBhXG4gICAqIHtuYW1lLCA8b3BlcmF0b3I+fSBvYmplY3Qg4oCUIHRvIHtuYW1lLCBvcGVyYXRvciwgdmFsdWV9LiBDb21wbGV4aXR5IGlzXG4gICAqIGNhcHBlZCBhdCBvbmUgbGV2ZWw6IGEgc2luZ2xlIG9wZXJhdG9yIGtleSAoYnVmZmVyLCBjb3VudCwgZGVib3VuY2Ugb3JcbiAgICogdGhyb3R0bGUpOyB3aGVuIHNldmVyYWwgYXJlIHNldCB0aGUgZmlyc3QgaW4gdGhhdCBvcmRlciB3aW5zLlxuICAgKi9cbiAgc3RhdGljIGNvbmZvcm1DdXN0b21FdmVudENvbmZpZyhlbnRyeSkge1xuICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4geyBuYW1lOiBlbnRyeSwgb3BlcmF0b3I6IHVuZGVmaW5lZCwgdmFsdWU6IHVuZGVmaW5lZCB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ICE9PSBudWxsICYmIHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGVudHJ5Lm5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBvcGVyYXRvcktleXMgPSBbJ2J1ZmZlcicsICdjb3VudCcsICdkZWJvdW5jZScsICd0aHJvdHRsZSddXG4gICAgICBjb25zdCBzZXRLZXlzID0gb3BlcmF0b3JLZXlzLmZpbHRlcihrZXkgPT4gZW50cnlba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgICAgY29uc3Qgb3BlcmF0b3IgPSBzZXRLZXlzWzBdXG5cbiAgICAgIGlmIChzZXRLZXlzLmxlbmd0aCA+IDEgJiYgU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIGN1c3RvbUV2ZW50LCAke2VudHJ5Lm5hbWV9LCBzZXRzIG11bHRpcGxlIG9wZXJhdG9ycyAoJHtzZXRLZXlzLmpvaW4oJywgJyl9KTsgdXNpbmcgJHtvcGVyYXRvcn0uYClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgbmFtZTogZW50cnkubmFtZSwgb3BlcmF0b3IsIHZhbHVlOiBvcGVyYXRvciAhPT0gdW5kZWZpbmVkID8gZW50cnlbb3BlcmF0b3JdIDogdW5kZWZpbmVkIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBmb2xsb3dpbmcgY29uZmlnLmN1c3RvbUV2ZW50cyBlbnRyeSBpcyBub3QgYSBzdHJpbmcgb3IgYSB7bmFtZX0gb2JqZWN0IGFuZCB3YXMgc2tpcHBlZDogJHtKU09OLnN0cmluZ2lmeShlbnRyeSl9YClcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGVudHJ5J3MgcmF0ZS9iYXRjaCBvcGVyYXRvciB0byB0aGUgY29uZm9ybWVkIEN1c3RvbUV2ZW50XG4gICAqIG9ic2VydmFibGUuIGJ1ZmZlciBhbmQgY291bnQgZW1pdCBPTkUgYmF0Y2hlZCBwYXlsb2FkIChwYXlsb2FkLmRldGFpbCBpc1xuICAgKiB0aGUgYXJyYXkgb2YgZWFjaCBldmVudCdzIGRldGFpbCk7IGRlYm91bmNlIGFuZCB0aHJvdHRsZSBwYXNzIHNpbmdsZVxuICAgKiBjb25mb3JtZWQgZXZlbnRzIHRocm91Z2ggdW50b3VjaGVkLlxuICAgKi9cbiAgc3RhdGljIGN1c3RvbWl6ZUN1c3RvbUV2ZW50T2JzZXJ2YWJsZShvYnMkLCBvcGVyYXRvciwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICBjYXNlICdidWZmZXInOlxuICAgICAgICAvLyBxdWlldC1nYXAgYmF0Y2hpbmc6IHRoZSBiYXRjaCBjbG9zZXMgYWZ0ZXIgYHZhbHVlYCBtcyB3aXRob3V0IGEgbmV3IGV2ZW50XG4gICAgICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICAgICAgYnVmZmVyKG9icyQucGlwZShkZWJvdW5jZVRpbWUodmFsdWUpKSksXG4gICAgICAgICAgZmlsdGVyKHBBcnIgPT4gcEFyci5sZW5ndGggPiAwKSxcbiAgICAgICAgICBtYXAoU3B5bmVDaGFubmVsV2luZG93Lm1hcEJhdGNoZWRFdmVudHMpXG4gICAgICAgIClcbiAgICAgIGNhc2UgJ2NvdW50JzpcbiAgICAgICAgLy8gZml4ZWQtc2l6ZSBiYXRjaGluZzogYSBwYXJ0aWFsIGJhdGNoIGlzIGhlbGQgdW50aWwgaXQgZmlsbHNcbiAgICAgICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgICAgICBidWZmZXJDb3VudCh2YWx1ZSksXG4gICAgICAgICAgbWFwKFNweW5lQ2hhbm5lbFdpbmRvdy5tYXBCYXRjaGVkRXZlbnRzKVxuICAgICAgICApXG4gICAgICBjYXNlICdkZWJvdW5jZSc6XG4gICAgICAgIHJldHVybiBvYnMkLnBpcGUoZGVib3VuY2VUaW1lKHZhbHVlKSlcbiAgICAgIGNhc2UgJ3Rocm90dGxlJzpcbiAgICAgICAgcmV0dXJuIG9icyQucGlwZSh0aHJvdHRsZVRpbWUodmFsdWUpKVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG9icyRcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgbWFwQmF0Y2hlZEV2ZW50cyhwQXJyKSB7XG4gICAgY29uc3QgbGFzdCA9IHBBcnJbcEFyci5sZW5ndGggLSAxXVxuICAgIGNvbnN0IHsgYWN0aW9uLCBzcmNFbGVtZW50LCBldmVudCB9ID0gbGFzdFxuICAgIGNvbnN0IGRldGFpbCA9IHBBcnIubWFwKHAgPT4gcC5ldmVudCAhPT0gdW5kZWZpbmVkICYmIHAuZXZlbnQgIT09IG51bGwgPyBwLmV2ZW50LmRldGFpbCA6IHVuZGVmaW5lZClcbiAgICBjb25zdCBwYXlsb2FkID0geyBkZXRhaWwsIGlzQmF0Y2g6IHRydWUsIGJhdGNoQ291bnQ6IHBBcnIubGVuZ3RoIH1cbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIGdldEFjdGl2ZU9ic2VydmFibGVzKGNvbmZpZyA9IHRoaXMuZG9tQ2hhbm5lbENvbmZpZykge1xuICAgIGxldCBvYnMkQXJyID0gW11cblxuICAgIC8vIENIRUNLIFRPIEFERCBNRURJQSBRVUVSWSBPQlNFUlZBQkxFXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uZmlnLmxpc3RlbkZvck1lZGlhUXVlcmllcyA9IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwoXG4gICAgICBjb25maWcubWVkaWFRdWVyaWVzKSB8fCBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKFxuICAgICAgY29uZmlnLm1lZGlhUXVlcmllcylcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBjb25zdCBtZXRob2RzID0ge1xuICAgICAgbGlzdGVuRm9yUmVzaXplOiB0aGlzLmNyZWF0ZVJlc2l6ZU9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvck9yaWVudGF0aW9uOiB0aGlzLmNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yU2Nyb2xsOiB0aGlzLmNyZWF0ZVNjcm9sbE9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvcldoZWVsOiB0aGlzLmNyZWF0ZU1vdXNlV2hlZWxPYnNlcnZhYmxlLmJpbmQodGhpcylcbiAgICB9XG5cbiAgICBjb25zdCBhZGRPYnNlcnZhYmxlVG9BcnIgPSAobWV0aG9kLCBrZXksIGkpID0+IHtcbiAgICAgIGNvbnN0IGFkZE9ic0Jvb2wgPSBjb25maWdba2V5XVxuICAgICAgaWYgKGFkZE9ic0Jvb2wpIHtcbiAgICAgICAgb2JzJEFyci5wdXNoKG1ldGhvZChjb25maWcpKVxuICAgICAgfVxuICAgIH1cblxuICAgIG1hcE9iakluZGV4ZWQoYWRkT2JzZXJ2YWJsZVRvQXJyLCBtZXRob2RzKVxuXG4gICAgLy8gJ2xpc3RlbkZvck1lZGlhUXVlcmllcycgOiB0aGlzLmdldE1lZGlhUXVlcnlPYnNlcnZhYmxlLmJpbmQodGhpcylcbiAgICB0aGlzLmNoZWNrRm9yTWVkaWFRdWVyaWVzKGNvbmZpZy5saXN0ZW5Gb3JNZWRpYVF1ZXJpZXMpXG5cbiAgICBjb25zdCBldmVudHNBcnIgPSB0aGlzLmdldEV2ZW50c0Zyb21Db25maWcoY29uZmlnKVxuICAgIG9icyRBcnIgPSBvYnMkQXJyLmNvbmNhdChldmVudHNBcnIpXG5cbiAgICByZXR1cm4gb2JzJEFyclxuICB9XG5cbiAgY2hlY2tGb3JNZWRpYVF1ZXJpZXMoYm9vbCkge1xuICAgIGNvbnN0IHNlbmRNUVN0cmVhbSA9IHAgPT4ge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50LFxuICAgICAgICB0aGlzLm9ic2VydmVyJClcbiAgICB9XG5cbiAgICBpZiAoYm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5nZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSh0aGlzLmRvbUNoYW5uZWxDb25maWcpXG4gICAgICAgIC5zdWJzY3JpYmUoc2VuZE1RU3RyZWFtKVxuICAgIH1cbiAgfVxuXG4gIGdldE1lZGlhUXVlcnlPYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iaihjb25maWcpXG4gICAgLy8gY29uc29sZS5sb2coXCJBUlIgSVMgXCIse2Fycn0pO1xuICAgIGNvbnN0IG9icyQgPSBhcHBseShtZXJnZSwgYXJyKVxuICAgIHJldHVybiBvYnMkLnBpcGUobWFwKHRoaXMuZ2V0TWVkaWFRdWVyeU1hcEZuLmJpbmQodGhpcykpKVxuICB9XG5cbiAgdXBkYXRlQ2hhbm5lbEFjdGlvbnMoc3RyKSB7XG4gICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0V2luZG93QWN0aW9uKCkge1xuICAgICAgcmV0dXJuIGBDSEFOTkVMX1dJTkRPV18ke3N0ci50b1VwcGVyQ2FzZSgpfV9FVkVOVGBcbiAgICB9XG4gICAgY29uc3Qgd2luZG93QWN0aW9uID0gZ2V0V2luZG93QWN0aW9uKClcbiAgICBjdXN0b21BY3Rpb25zQXJyLnB1c2god2luZG93QWN0aW9uKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgY29uc3QgbWFpbkFjdGlvbnMgPSBbXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQUJPUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FGVEVSUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FOSU1BVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQU5JTUFUSU9OSVRFUkFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BTklNQVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQVBQSU5TVEFMTEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19CRUZPUkVQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkVGT1JFVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19CRUdJTkVWRU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19CTFVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DQUNIRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NMT1NFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT01QT1NJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09NUE9TSVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09NUE9TSVRJT05VUERBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPUFlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NVVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREJMQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFTElHSFRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRU1PVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFT1JJRU5UQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRVBST1hJTUlUWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQVRUUklCVVRFTkFNRUNIQU5HRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUFUVFJNT0RJRklFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQ0hBUkFDVEVSREFUQU1PRElGSUVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01DT05URU5UTE9BREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01DT05URU5UTE9BREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01FTEVNRU5UTkFNRUNIQU5HRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR0xFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR1NUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUk9QX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19FTEVNRU5UX1NDUk9MTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZPQ1VTSU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZPQ1VTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19GVUxMU0NSRUVOQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19GVUxMU0NSRUVORVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0hBU0hDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0lOUFVUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19JTlZBTElEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19LRVlET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19LRVlQUkVTU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfS0VZVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0xPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01FRElBX1FVRVJZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NRVNTQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFRU5URVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFTU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VXSEVFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfT0ZGTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfT05MSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PUEVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PUklFTlRBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUEFHRUhJREVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BBR0VTSE9XX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QQVNURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUE9QU1RBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BPUFNUQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QUk9HUkVTU0VWRU5UU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUkVTRVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1JFU0laRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VMRU1FTlRfQURERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0xPQ0tfRVZFTlQnLFxuICAgICAgWydDSEFOTkVMX1dJTkRPV19TQ1JPTExfTE9DS19FVkVOVCcsICdvblNjcm9sbExvY2tFdmVudCddLFxuICAgICAgWydDSEFOTkVMX1dJTkRPV19TRVRfRUxFTUVOVF9UT19TQ1JPTExfRVZFTlQnLCAnb25TZXRFbGVtZW50VG9TY3JvbGwnXSxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TVE9SQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TVUJNSVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1RSQU5TSVRJT05DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1RSQU5TSVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1RSQU5TSVRJT05SVU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1RSQU5TSVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVCdcbiAgICBdXG5cbiAgICByZXR1cm4gbWFpbkFjdGlvbnMuY29uY2F0KGN1c3RvbUFjdGlvbnNBcnIpXG4gIH1cblxuICBvblNjcm9sbExvY2tFdmVudChlKSB7XG4gICAgLy8gREVQUkVDQVRFRCAtLSBNT1ZFRCBUTyBzcHluZS1wbHVnaW4tc2Nyb2xsLWxvY2s7XG4gIH1cblxuICBvblNldEVsZW1lbnRUb1Njcm9sbChlKSB7XG4gICAgbGV0IHsgY29uZmlnLCBlbCwgc2Nyb2xsRWxlbWVudCB9ID0gZS5wYXlsb2FkXG4gICAgY29uZmlnID0gY29uZmlnIHx8IHt9XG4gICAgY29uZmlnID0gZGVlcE1lcmdlKHRoaXMuZG9tQ2hhbm5lbENvbmZpZywgY29uZmlnKVxuXG4gICAgc2Nyb2xsRWxlbWVudCA9IHNjcm9sbEVsZW1lbnQgfHwgZWxcblxuICAgIGNvbnN0IGFjdGlvbiA9ICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRUxFTUVOVF9BRERFRF9FVkVOVCdcbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHsgZWwgfSwgZWwpXG5cbiAgICB0aGlzLmNyZWF0ZVNjcm9sbE9ic2VydmFibGUoY29uZmlnLCBzY3JvbGxFbGVtZW50KVxuICAgICAgLnN1YnNjcmliZShwID0+IHtcbiAgICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gICAgICB9KVxuICB9XG5cbiAgYmluZFN0YXRpY01ldGhvZHMoKSB7XG4gICAgdGhpcy5jcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlciA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyLmJpbmQoXG4gICAgICB0aGlzKVxuICAgIHRoaXMuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iaiA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lcmdlZE9ic0Zyb21PYmouYmluZChcbiAgICAgIHRoaXMpXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWxzTWFwIH0gZnJvbSAnLi9jaGFubmVscy9jaGFubmVscy1tYXAuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtIH0gZnJvbSAnLi92aWV3cy92aWV3LXN0cmVhbS5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGUgfSBmcm9tICcuL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgc2FuaXRpemVIVE1MQ29uZmlndXJlIH0gZnJvbSAnLi91dGlscy9zYW5pdGl6ZS1odG1sLmpzJ1xuaW1wb3J0IHsgc2FuaXRpemVEYXRhQ29uZmlndXJlIH0gZnJvbSAnLi91dGlscy9zYW5pdGl6ZS1kYXRhLmpzJ1xuXG5jb25zdCBfY2hhbm5lbHMgPSBuZXcgQ2hhbm5lbHNNYXAoKVxuY29uc3QgdmVyc2lvbiA9ICcwLjI2LjAnXG5cbmNsYXNzIFNweW5lQXBwbGljYXRpb24ge1xuICAvKipcbiAgICpcbiAgICogU3B5bmVBcHAgY3JlYXRlcyB0aGUgZ2xvYmFsIFNweW5lIG9iamVjdCwgYW5kIGNyZWF0ZXMgdGhlIGZvbGxvd2luZyBpdGVtc1xuICAgKiA8dWw+XG4gICAqXG4gICAqIDxsaT5MSU5LWydDaGFubmVsc01hcCcsICdjaGFubmVscy1jb250cm9sbGVyJ10gdGhhdCBkaXJlY3RzIHRoZSBmbG93IG9mIGRhdGEgdG8gYWxsIENoYW5uZWxzPC9saT5cbiAgICogPGxpPkxJTktbJ1NweW5lQ2hhbm5lbFVJJywgJ3NweW5lLWNoYW5uZWwtdS1pJ10sIHRoYXQgYnJvYWRjYXN0IGFsbCB1c2VyIGludGVyYWN0aW9uIGV2ZW50czwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxSb3V0ZScsICdzcHluZS1jaGFubmVsLXJvdXRlJ10sIHRoYXQgYnJvYWRjYXN0IHdpbmRvdyBsb2NhdGlvbiBjaGFuZ2VzIGFuZCBpcyB0aGUgb25seSBvdGhlciBjaGFubmVsIHRoYXQgY2FuIGJlIGJvdW5kIHRvIHVzZXIgZXZlbnRzPC9saT5cbiAgICogPGxpPkxJTktbJ1NweW5lQ2hhbm5lbFdpbmRvdycsICdzcHluZS1jaGFubmVsLXdpbmRvdyddLCB0aGF0IGJyb2FkY2FzdCBhbGwgcmVxdWVzdGVkIHdpbmRvdyBhbmQgZG9jdW1lbnQgZXZlbnRzLCBzdWNoIGFzIHNjcm9sbGluZywgcmVzaXppbmcgYW5kIG1lZGlhIHF1ZXJpZXM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsTGlmZWN5Y2xlJywgJ3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlJ10sIHRoYXQgYnJvYWRjYXN0cyByZW5kZXJpbmcgYW5kIHJlbW92aW5nIG9mIFZpZXdTdHJlYW0gZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gZGlyZWN0ZWQgdG8gYnJvYWRjYXN0IHRoZWlyIGxpZmVjeWNsZSBldmVudHM8L2xpPlxuICAgKiA8L3VsPlxuICAgKlxuICAgKlxuICAgKiBAbW9kdWxlIFNweW5lQXBwXG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbmZpZyAtID0ge307IFRoaXMgZ2xvYmFsIGNvbmZpZyBvYmplY3QgaXMgbWFpbmx5IHVzZWQgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIHR3byBTcHluZUNoYW5uZWxzLCBDSEFOTkVMX1JPVVRFIGFuZCBDSEFOTkVMX1dJTkRPVy5cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvblxuICB9XG5cbiAgZ2V0IGNoYW5uZWxzKCkge1xuICAgIHJldHVybiBfY2hhbm5lbHNcbiAgfVxuXG4gIGluaXQoY29uZmlnID0ge30sIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICAvLyB0aGlzLmNoYW5uZWxzID0gbmV3IENoYW5uZWxzTWFwKCk7XG4gICAgLyohXG4gICAgICogU3B5bmUgMC4yNi4wXG4gICAgICogaHR0cHM6Ly9zcHluZWpzLm9yZ1xuICAgICAqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgMjAxNy0yMDI1LCBGcmFuayBCYXRpc3RhLFxuICAgICAqIFJlbGV2YW50IENvbnRleHQsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICAgKiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgICogQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgaW4gdGhlIHByb2plY3Qgcm9vdCwgb3IgYXQ6XG4gICAgICogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLTMuMC5odG1sXG4gICAgICpcbiAgICAgKiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBkaXN0cmlidXRpb24uXG4gICAgICovXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cblxuICAgIGlmKFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSl7XG4gICAgICBpZiAodGVzdE1vZGUpe1xuICAgICAgICByZXR1cm4gJ1RoZSBTcHluZSBBcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkISc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSBTcHluZSBBcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy9jb25zdCBpbWdQYXRoID0gSU1HX1BBVEggfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGltZ1BhdGggPSAodHlwZW9mIElNR19QQVRIICE9PSAndW5kZWZpbmVkJykgPyBJTUdfUEFUSCA6IHVuZGVmaW5lZDtcbiAgICBsZXQgZGVmYXVsdENvbmZpZyA9IHtcbiAgICAgIHNjcm9sbExvY2s6IGZhbHNlLFxuICAgICAgc2Nyb2xsTG9ja1g6IDMxLFxuICAgICAgc2Nyb2xsTG9ja1k6IDAsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgICAgbW9kZTogJ2FwcCcsXG4gICAgICBkaXNhYmxlU2FuaXRpemU6IGZhbHNlLFxuICAgICAgaWZyYW1lczoge30sXG4gICAgICBhbmNob3JzOiB7fSxcbiAgICAgIGN1c3RvbUVsZW1lbnRzOiBbXSxcbiAgICAgIGJhc2VIcmVmOiB1bmRlZmluZWQsXG4gICAgICBJTUdfUEFUSDogaW1nUGF0aCxcbiAgICAgIHBsdWdpbk1ldGhvZHM6e1xuXG4gICAgICB9LFxuICAgICAgcGx1Z2luczp7XG5cbiAgICAgIH0sXG4gICAgICB0bXA6IHt9LFxuICAgICAgZXBoZW1lcmFsUHJvcHM6IHt9LFxuICAgICAgdG1wUHJvcHM6IHt9LFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgV0lORE9XOiB7XG4gICAgICAgICAgbWVkaWFRdWVyaWVzOiB7XG5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGV2ZW50czogW10sXG4gICAgICAgICAgY3VzdG9tRXZlbnRzOiBbXSxcbiAgICAgICAgICBsaXN0ZW5Gb3JSZXNpemU6IHRydWUsXG4gICAgICAgICAgbGlzdGVuRm9yT3JpZW50YXRpb246IHRydWUsXG4gICAgICAgICAgbGlzdGVuRm9yU2Nyb2xsOiBmYWxzZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JNb3VzZVdoZWVsOiBmYWxzZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JXaGVlbDogZmFsc2UsXG4gICAgICAgICAgZGVib3VuY2VNU1RpbWVGb3JSZXNpemU6IDIwMCxcbiAgICAgICAgICBkZWJvdW5jZU1TVGltZUZvclNjcm9sbDogMTUwXG4gICAgICAgIH0sXG5cbiAgICAgICAgUk9VVEU6IHtcbiAgICAgICAgICB0eXBlOiAnc2xhc2gnLFxuICAgICAgICAgIGlzSGFzaDogZmFsc2UsXG4gICAgICAgICAgaXNIaWRkZW46IGZhbHNlLFxuICAgICAgICAgIGFkZDQwNHM6IGZhbHNlLFxuICAgICAgICAgIHJvdXRlczoge1xuICAgICAgICAgICAgJ3JvdXRlUGF0aCcgOiB7XG4gICAgICAgICAgICAgICdyb3V0ZU5hbWUnIDogJ2NoYW5nZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKGNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByb3V0ZVV0aWxzID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZTtcbiAgICAgICBjb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZShkZWZhdWx0Q29uZmlnLCBjb25maWcsIF9jaGFubmVscywgcm91dGVVdGlscyk7XG4gICAgICAgLy9jb25zb2xlLmxvZyhcIlNQWU5FIEFQUCBQUk9QUyBcIixTcHluZUFwcFByb3BlcnRpZXMpO1xuICAgICAgLy93aW5kb3cuU3B5bmUgPSB0aGlzO1xuICAgICAgLy93aW5kb3cuU3B5bmVbJ2NvbmZpZyddID0gZGVlcE1lcmdlKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgICB9XG4gICAgdGhpcy5wbHVnaW5zRm4gPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0UGx1Z2luc01ldGhvZE9iaihjb25maWdbJ3BsdWdpbk1ldGhvZHMnXSk7XG4gICAgdGhpcy5nZXRDaGFubmVsQWN0aW9ucyA9IChzdHIpID0+IF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpO1xuICAgIHRoaXMucmVnaXN0ZXJDaGFubmVsID0gKHZhbCkgPT4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKHZhbCk7XG4gICAgdGhpcy5yZWdpc3RlclBsdWdpbiA9IChwbHVnaW5JbnN0YW5jZSkgPT4gU3B5bmVBcHBQcm9wZXJ0aWVzLnJlZ2lzdGVyUGx1Z2luKHBsdWdpbkluc3RhbmNlKTtcbiAgICB0aGlzLnJlZ2lzdGVyRGF0YUNoYW5uZWwgPSAob2JzJCkgPT4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKG9icyQpO1xuICAgIHRoaXMubGlzdENoYW5uZWxzID0gKCkgPT4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSk7XG4gICAgbGV0IG51bGxIb2xkZXIgPSBuZXcgVmlld1N0cmVhbSh7IGlkOidzcHluZS1udWxsLXZpZXdzJyB9KTtcbiAgICBudWxsSG9sZGVyLmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgIG51bGxIb2xkZXIucHJvcHMuZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5Om5vbmU7IG9wYWNpdHk6MDsgcG9pbnRlci1ldmVudHM6bm9uZTsnO1xuICAgIF9jaGFubmVscy5pbml0KCk7XG5cbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5kZWJ1Zz09PXRydWUpe1xuICAgICAgIHdpbmRvdy5TcHluZSA9IHt2ZXJzaW9ufTtcbiAgICB9XG5cbiAgICBzYW5pdGl6ZUhUTUxDb25maWd1cmUoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZyk7XG4gICAgc2FuaXRpemVEYXRhQ29uZmlndXJlKFNweW5lQXBwUHJvcGVydGllcy5jb25maWcpO1xuXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBtb3N0bHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+TGlzdGluZyB0aGUgcmVnaXN0ZXJlZWQgQ2hhbm5lbHMgaW4gdGhlIGJyb3dzZXIgY29uc29sZTwvaDQ+J11cbiAgICogU3B5bmVBcHAubGlzdENoYW5uZWxzKCk7XG4gICAqXG4gICAqIEByZXR1cm5zIEEgbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCBjaGFubmVsc1xuICAgKi9cbiAgc3RhdGljIGxpc3RDaGFubmVscygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGNoZWNrIGluIHRoZSBjb25zb2xlIG9yIGluIHRoZSBjb2RlIHdoYXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGJlIGxpc3RlbmVkIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQW4gYXJyYXkgb2YgQWN0aW9ucyB0aGF0IGNhbiBiZSBsaXN0ZW5lZCB0b1xuICAgKi9cbiAgc3RhdGljIGdldENoYW5uZWxBY3Rpb25zKHN0cikge1xuICAgIHJldHVybiBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFkZCB0aGUgY2hhbm5lbCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0IHNvIHRoYXQgaXQgY2FuIHN1YnNjcmliZWQgYnkgYWxsIFZpZXdTdHJlYW0gYW5kIENoYW5uZWwgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0ge0NoYW5uZWx9IGNcbiAgICpcbiAgICpcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckNoYW5uZWwoYykge1xuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NweW5lIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKGMpO1xuICAgIH1cbiAgfVxufVxuXG5cbmV4cG9ydCBsZXQgU3B5bmVBcHAgPSBuZXcgU3B5bmVBcHBsaWNhdGlvbigpO1xuIiwiaW1wb3J0IHsgRG9tRWxlbWVudCB9IGZyb20gJy4vdmlld3MvZG9tLWVsZW1lbnQuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgaXMsIGNsb25lLCBwYXRoU2F0aXNmaWVzIH0gZnJvbSAncmFtZGEnXG5sZXQgX3NweW5lQXBwUHJvcHMgPSBTcHluZUFwcFByb3BlcnRpZXNcbmV4cG9ydCBjbGFzcyBTcHluZVBsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30pIHtcbiAgICBsZXQgeyBuYW1lLCBjb25maWcsIHBhcmVudEVsIH0gPSBwcm9wc1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcgPSBjbG9uZShwcm9wcylcbiAgICB9XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lIHx8ICdlbXB0eSdcbiAgICB0aGlzLnByb3BzLm5hbWUgPSBuYW1lXG4gICAgY29uZmlnID0gU3B5bmVQbHVnaW4ubWVyZ2VEZWZhdWx0Q29uZmlnKGNvbmZpZywgdGhpcy5kZWZhdWx0Q29uZmlnKCkpXG4gICAgdGhpcy5wcm9wcy5wYXJlbnRFbCA9IHBhcmVudEVsIHx8IFNweW5lUGx1Z2luLmNyZWF0ZVBhcmVudEVsKClcbiAgICAvLyBTcHluZVBsdWdpbi5nZXRTcHluZUFwcChuYW1lLCBjb25maWcpXG4gICAgdGhpcy5wcm9wcy5jb25maWcgPSBjb25maWdcbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hZGRUcmFpdHModGhpcy5wcm9wcy50cmFpdHMpXG4gICAgfVxuXG4gICAgLy8gdGhpcy5vbkJlZm9yZVJlZ2lzdGVyZWQoKVxuICAgIC8vIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICAvLyB0aGlzLm9uUmVuZGVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3cgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYXBwIGRlY2lkZXMgdG8gcmVnaXN0ZXIgdGhlIHBsdWdpbi5cbiAgICogVGhpcyB3YXksIHRoZSBwbHVnaW4gbm8gbG9uZ2VyIGhhcyB0byBpbXBvcnQgb3IgcmVseSBvbiBpdHMgb3duIHZlcnNpb25cbiAgICogb2YgU3B5bmVBcHBQcm9wZXJ0aWVzLiBJbnN0ZWFkLCBpdCBpcyAqcGFzc2VkKiB0aGUgYXV0aG9yaXRhdGl2ZSBpbnN0YW5jZS5cbiAgICovXG4gIHJlZ2lzdGVyKHNweW5lQXBwUHJvcHMpIHtcbiAgICAvLyAxLiBTYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSByZWFsIFNweW5lQXBwUHJvcGVydGllc1xuICAgIF9zcHluZUFwcFByb3BzID0gc3B5bmVBcHBQcm9wc1xuICAgIHRoaXMucHJvcHMucGx1Z2luTmFtZSA9IHRoaXMucHJvcHMubmFtZVxuXG4gICAgLy8gdGhpcy5wcm9wcy5jb25maWcgPSBfc3B5bmVBcHBQcm9wcy5nZXRQbHVnaW5Db25maWdCeVBsdWdpbk5hbWUodGhpcy5wcm9wcy5wbHVnaW5OYW1lKVxuXG4gICAgaWYgKF9zcHluZUFwcFByb3BzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBTcHluZSBXYXJuaW5nOiBTcHluZUFwcCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0ISBDYW5ub3QgcmVnaXN0ZXIgcGx1Z2luIFwiJHt0aGlzLm5hbWV9XCIuYFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5vbkJlZm9yZVJlZ2lzdGVyZWQoKVxuXG4gICAgLy8gMi4gQWRkIHBsdWdpbiBjb25maWcgaW4gdGhlIHJlYWwgU3B5bmVBcHBQcm9wZXJ0aWVzXG4gICAgdGhpcy5wcm9wcy5jb25maWcgPSBjbG9uZSh0aGlzLnByb3BzLmNvbmZpZylcbiAgICBfc3B5bmVBcHBQcm9wcy5hZGRQbHVnaW5Db25maWcodGhpcy5uYW1lLCB0aGlzLnByb3BzLmNvbmZpZylcblxuICAgIC8vIElmIHlvdSBoYXZlIHBsdWdpbi1sZXZlbCBsb2dpYyB0aGF0IGRlcGVuZHMgb24gdGhlIHJlYWwgc3B5bmVBcHAsXG4gICAgLy8geW91IGNhbiBhZGQgaXQgaGVyZSwgZS5nLjpcbiAgICAvLyBzcHluZUFwcFByb3BzLmFkZFBsdWdpbk1ldGhvZHModGhpcy5wcm9wcy5jb25maWcucGx1Z2luTWV0aG9kcylcblxuICAgIC8vIDMuIElmIHlvdSBoYXZlIG90aGVyIHBsdWdpbiBsaWZlY3ljbGUgbWV0aG9kc1xuICAgIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICB0aGlzLm9uUmVuZGVyKClcbiAgfVxuXG4gIGdldCBTcHluZUFwcFByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIF9zcHluZUFwcFByb3BzXG4gIH1cblxuICBzdGF0aWMgbWVyZ2VEZWZhdWx0Q29uZmlnKGNvbmZpZyA9IHt9LCBkZWZhdWx0Q29uZmlnID0gdGhpcy5kZWZhdWx0Q29uZmlnKCkpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gIH1cblxuICBzdGF0aWMgZ2V0U3B5bmVBcHAobmFtZSwgY29uZmlnKSB7XG4gICAgaWYgKF9zcHluZUFwcFByb3BzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBVbmFibGUgdG8gaW5zdGFsbCBwbHVnaW4sICR7bmFtZX0hIFNweW5lQXBwIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCFgKVxuICAgICAgLy8gU3B5bmVBcHAuaW5pdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIF9zcHluZUFwcFByb3BzLmFkZFBsdWdpbkNvbmZpZyhuYW1lLCBjb25maWcpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHVwZGF0ZVNweW5lQ29uZmlnKHNweW5lQXBwLCBwbHVnaW5OYW1lLCBwbHVnaW5Db25maWcpIHtcbiAgICBjb25zdCBwYXRoRXhpc3RzID0gcGF0aFNhdGlzZmllcyhpcyhPYmplY3QpLCBbJ2NvbmZpZycsICdwbHVnaW5zJywgcGx1Z2luTmFtZV0pKHNweW5lQXBwKVxuXG4gICAgaWYgKHBhdGhFeGlzdHMgPT09IHRydWUpIHtcbiAgICAgIGlmIChzcHluZUFwcC5jb25maWcuZGVidWcgPT09IHRydWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgcGx1Z2luLCAke3BsdWdpbk5hbWV9LCBhbHJlYWR5IGV4aXN0c2ApXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgc3B5bmVBcHAuY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV0gPSBwbHVnaW5Db25maWdcbiAgICByZXR1cm4gc3B5bmVBcHAuY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQYXJlbnRFbChlbCkge1xuICAgIGNvbnN0IGNyZWF0ZVBsdWdpblBhcmVudEVsID0gKCkgPT4ge1xuICAgICAgY29uc3QgcGx1Z2luRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3B5bmUtcGx1Z2lucycpXG5cbiAgICAgIGNvbnN0IGNyZWF0ZVBsdWdpbkVsID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBwbHVnaW5FbCA9IG5ldyBEb21FbGVtZW50KHtcbiAgICAgICAgICBpZDogJ3NweW5lLXBsdWdpbnMnXG4gICAgICAgIH0pXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGx1Z2luRWwucmVuZGVyKCkpXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NweW5lLXBsdWdpbnMnKVxuICAgICAgICBlbC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmFic29sdXRlOyB0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTttaW4taGVpZ2h0OjEwMHZoO3otaW5kZXg6MTAwMDAwMDsgcG9pbnRlci1ldmVudHM6bm9uZSdcbiAgICAgICAgcmV0dXJuIGVsXG4gICAgICB9XG4gICAgICByZXR1cm4gcGx1Z2luRWwgfHwgY3JlYXRlUGx1Z2luRWwoKVxuICAgIH1cblxuICAgIHJldHVybiBlbCB8fCBjcmVhdGVQbHVnaW5QYXJlbnRFbCgpXG4gIH1cblxuICBhZGRUcmFpdHModHJhaXRzKSB7XG4gICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICB0cmFpdHMgPSBbdHJhaXRzXVxuICAgIH1cbiAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFRyYWl0Q2xhc3ModGhpcylcbiAgICB9XG5cbiAgICB0cmFpdHMuZm9yRWFjaChhZGRUcmFpdClcbiAgfVxuXG4gIG9uQmVmb3JlUmVnaXN0ZXJlZCgpIHtcbiAgICAvLyB0aGlzLnByb3BzLnBsdWdpbk5hbWUgPSB0aGlzLnByb3BzLm5hbWVcbiAgICAvLyB0aGlzLnByb3BzLmNvbmZpZyA9IF9zcHluZUFwcFByb3BzLmdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZSh0aGlzLnByb3BzLnBsdWdpbk5hbWUpXG4gICAgdGhpcy5jaGVja0ZvclJlcXVpcmVkV2luZG93RXZlbnQoKVxuICB9XG5cbiAgY2hlY2tGb3JSZXF1aXJlZFdpbmRvd0V2ZW50KCkge1xuICAgIGNvbnN0IHJlcXVpcmVkRXZlbnRzID0gdGhpcy5wcm9wcy5yZXF1aXJlZEV2ZW50cyA/PyBbXVxuICAgIGNvbnN0IHJlcXVpcmVkQ3VzdG9tRXZlbnRzID0gdGhpcy5wcm9wcy5yZXF1aXJlZEN1c3RvbUV2ZW50cyA/PyBbXVxuXG4gICAgY29uc3Qgd2luZG93Q29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldENoYW5uZWxDb25maWcoJ1dJTkRPVycpXG5cbiAgICBjb25zdCBtaXNzaW5nRXZlbnRzID0gcmVxdWlyZWRFdmVudHMuZmlsdGVyKGV2dCA9PiAhd2luZG93Q29uZmlnLmV2ZW50cy5pbmNsdWRlcyhldnQpKVxuXG4gICAgLy8gZW50cmllcyBvbiBCT1RIIHNpZGVzIGNhbiBiZSBhIG5hbWUgc3RyaW5nIG9yIGEge25hbWUsIGJ1ZmZlcnxjb3VudHxkZWJvdW5jZXx0aHJvdHRsZX1cbiAgICAvLyBvYmplY3Qg4oCUIGhvc3RzIGRlY2xhcmUgaG93IHRoZSBldmVudCBpcyBjb25mb3JtZWQsIHBsdWdpbnMgZGVjbGFyZSB0aGUgZXhhY3RcbiAgICAvLyBjb25maWd1cmF0aW9uIHRoZXkgZXhwZWN0LCBhbmQgbWF0Y2hpbmcgaXMgYnkgbmFtZSBvbmx5XG4gICAgY29uc3QgZW50cnlOYW1lID0gZW50cnkgPT4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyA/IGVudHJ5IDogZW50cnk/Lm5hbWVcbiAgICBjb25zdCBjdXN0b21FdmVudE5hbWVzID0gd2luZG93Q29uZmlnLmN1c3RvbUV2ZW50cy5tYXAoZW50cnlOYW1lKVxuICAgIGNvbnN0IG1pc3NpbmdDdXN0b21FdmVudHMgPSByZXF1aXJlZEN1c3RvbUV2ZW50cy5maWx0ZXIoZXZ0ID0+ICFjdXN0b21FdmVudE5hbWVzLmluY2x1ZGVzKGVudHJ5TmFtZShldnQpKSlcblxuICAgIC8vIElmIGFueSBhcmUgbWlzc2luZywgbG9nIGEgc2luZ2xlIHdhcm5pbmcgbGlzdGluZyB0aGVtXG4gICAgaWYgKG1pc3NpbmdFdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBwbHVnaW4gXCIke3RoaXMucHJvcHMubmFtZX1cIiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGNvbmZpZy5XSU5ET1cuZXZlbnRzLCAtLT4gJHttaXNzaW5nRXZlbnRzLmpvaW4oJywgJyl9IDwtLWBcbiAgICAgIClcbiAgICB9XG5cbiAgICBpZiAobWlzc2luZ0N1c3RvbUV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBwcmludCB0aGUgZXhhY3QgY29uZmlndXJhdGlvbiBlbnRyeSBzbyBpdCBjYW4gYmUgcGFzdGVkIGludG8gdGhlIGhvc3QgY29uZmlnXG4gICAgICBjb25zdCBlbnRyeUFzQ29uZmlnU3RyID0gZW50cnkgPT4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyA/IGAnJHtlbnRyeX0nYCA6IEpTT04uc3RyaW5naWZ5KGVudHJ5KVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgcGx1Z2luIFwiJHt0aGlzLnByb3BzLm5hbWV9XCIgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBjb25maWcuV0lORE9XLmN1c3RvbUV2ZW50cywgLS0+ICR7bWlzc2luZ0N1c3RvbUV2ZW50cy5tYXAoZW50cnlBc0NvbmZpZ1N0cikuam9pbignLCAnKX0gPC0tYFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGRlZmF1bHRDb25maWcoKSB7XG4gICAgcmV0dXJuIHtcblxuICAgIH1cbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZCgpIHtcblxuICB9XG5cbiAgb25SZW5kZXIoKSB7XG5cbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbSwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBtZXJnZU1hcCwgc2hhcmUsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgY29tcG9zZSwgcHJvcCwgZGVmYXVsdFRvLCBwaWNrLCBtZXJnZURlZXBSaWdodCB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHNhbml0aXplRGF0YSBmcm9tICcuL3Nhbml0aXplLWRhdGEuanMnXG5pbXBvcnQgeyBzcHluZVdhcm4gfSBmcm9tICcuL3NweW5lLXdhcm4uanMnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsRmV0Y2hVdGlsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbEZldGNoVXRpbFxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgaXMgdGhlIGNvcmUgb2JqZWN0IHVzZWQgZm9yIENoYW5uZWxGZXRjaC4gVGhpcyB1dGlsaXR5IHdyYXBzIHRoZSBKYXZhU2NyaXB0XG4gICAqIGZldGNoIEFQSSBpbnRvIGFuIG9ic2VydmFibGUuXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBQcm9wZXJ0aWVzIHVzZWQgdG8gY3JlYXRlIHRoZSBmZXRjaCByZXF1ZXN0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHN1YnNjcmliZXIgQSBtZXRob2QgYXNzaWduZWQgdG8gbGlzdGVuIHRvIHRoZSByZXN1bHRcbiAgICogQHBhcmFtIHtCb29sZWFufSB0ZXN0TW9kZSBDb250cm9scyBpbml0aWFsaXphdGlvbiBmb3IgdW5pdCB0ZXN0c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gQ0hBTk5FTF9OQU1FIFRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIHVzaW5nIHRoaXMgZmV0Y2ggdXRpbFxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gb3B0aW9ucy51cmwgLSBUaGUgVVJMIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLnNlcnZlck9wdGlvbnMgLSBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gb3B0aW9ucy5tYXBGbiAtIEEgbWV0aG9kIHRoYXQgY2FuIHBhcnNlIHRoZSBkYXRhIGJlZm9yZSBpdCBpcyByZXR1cm5lZFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gb3B0aW9ucy5yZXNwb25zZVR5cGUgLSBEZWZhdWx0IGlzIGpzb25cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBvcHRpb25zLmRlYnVnIC0gTG9ncyBmZXRjaCByZXNwb25zZSBkZXRhaWxzIGJlZm9yZSBvYnNlcnZhYmxlIGNvbXBsZXRlc1xuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IG9wdGlvbnMuZGlzYWJsZVNhbml0aXplIC0gQWxsb3dzIHRydXN0ZWQgZmV0Y2ggZGF0YSB0byBza2lwIHNhbml0aXphdGlvblxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZmV0Y2hlZCByZXNwb25zZSBwYXJzZWQgYnkgdGhlIGNvbmZpZ3VyZWQgcGFyYW1ldGVycy5cbiAgICovXG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9LCBzdWJzY3JpYmVyLCB0ZXN0TW9kZSwgQ0hBTk5FTF9OQU1FKSB7XG4gICAgY29uc3QgdGVzdFN1YnNjcmliZXIgPSBwID0+IGNvbnNvbGUubG9nKCdGRVRDSCBSRVRVUk5FRCAnLCBwKVxuXG4gICAgdGhpcy5fbWFwRm4gPSBDaGFubmVsRmV0Y2hVdGlsLnNldE1hcEZuKG9wdGlvbnMpXG4gICAgdGhpcy5fdXJsID0gQ2hhbm5lbEZldGNoVXRpbC5zZXRVcmwob3B0aW9ucylcbiAgICB0aGlzLl9yZXNwb25zZVR5cGUgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFJlc3BvbnNlVHlwZShvcHRpb25zKVxuICAgIHRoaXMuX3NlcnZlck9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFNlcnZlck9wdGlvbnMob3B0aW9ucylcbiAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlciAhPT0gdW5kZWZpbmVkID8gc3Vic2NyaWJlciA6IHRlc3RTdWJzY3JpYmVyXG4gICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnM/LmRlYnVnID09PSB0cnVlXG4gICAgdGhpcy5kaXNhYmxlU2FuaXRpemUgPSBvcHRpb25zPy5kaXNhYmxlU2FuaXRpemUgPT09IHRydWVcbiAgICB0aGlzLmNoYW5uZWxOYW1lID0gQ0hBTk5FTF9OQU1FXG5cbiAgICBjb25zdCBmZXRjaFByb3BzID0ge1xuICAgICAgbWFwRm46IHRoaXMubWFwRm4sXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgc2VydmVyT3B0aW9uczogdGhpcy5zZXJ2ZXJPcHRpb25zLFxuICAgICAgcmVzcG9uc2VUeXBlOiB0aGlzLnJlc3BvbnNlVHlwZSxcbiAgICAgIGRpc2FibGVTYW5pdGl6ZTogdGhpcy5kaXNhYmxlU2FuaXRpemUsXG4gICAgICBkZWJ1ZzogdGhpcy5kZWJ1Z1xuICAgIH1cblxuICAgIGlmICh0ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgQ2hhbm5lbEZldGNoVXRpbC5zdGFydFdpbmRvd0ZldGNoKGZldGNoUHJvcHMsIHRoaXMuX3N1YnNjcmliZXIsIHRoaXMuY2hhbm5lbE5hbWUpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHN0YXJ0V2luZG93RmV0Y2gocHJvcHMsIHN1YnNjcmliZXIsIGNoYW5uZWxOYW1lKSB7XG4gICAgY29uc3QgeyBtYXBGbiwgdXJsLCBzZXJ2ZXJPcHRpb25zLCByZXNwb25zZVR5cGUsIGRlYnVnIH0gPSBwcm9wc1xuXG4gICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICBjaGFubmVsTmFtZSxcbiAgICAgIHVybCxcbiAgICAgIHJlc3BvbnNlVHlwZSxcbiAgICAgIHNlcnZlck9wdGlvbnNcbiAgICB9XG5cbiAgICBjb25zdCB0YXBMb2dEZWJ1ZyA9IHAgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ0RFQlVHIEZFVENIIDonLCBwLCBtZXRhZGF0YSlcbiAgICB9XG5cbiAgICBjb25zdCB0YXBMb2cgPSBkZWJ1ZyA9PT0gdHJ1ZSA/IHRhcCh0YXBMb2dEZWJ1ZykgOiB0YXAoKCkgPT4ge30pXG5cbiAgICBjb25zdCBtYXBXcmFwcGVyID0gbWFwTWV0aG9kID0+IGRhdGEgPT4ge1xuICAgICAgY29uc3QgZGlzYWJsZVNhbml0aXplID0gcHJvcHM/LmRpc2FibGVTYW5pdGl6ZSA9PT0gdHJ1ZVxuXG4gICAgICAvLyBGZXRjaGVkIGRhdGEgaXMgcmVtb3RlIGFuZCB1bnRydXN0ZWQ6IGFsd2F5cyBzYW5pdGl6ZSBpbiAnYXBwJyBtb2RlLFxuICAgICAgLy8gcmVnYXJkbGVzcyBvZiB0aGUgYXBwbGljYXRpb24ncyBhdXRob3JpbmcvcmljaHRleHQgcG9zdHVyZS5cbiAgICAgIGNvbnN0IHNhbml0aXplZERhdGEgPSBkaXNhYmxlU2FuaXRpemUgPyBkYXRhIDogc2FuaXRpemVEYXRhKGRhdGEsIHsgbW9kZTogJ2FwcCcgfSlcblxuICAgICAgcmV0dXJuIG1hcE1ldGhvZChzYW5pdGl6ZWREYXRhLCBtZXRhZGF0YSlcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSQgPSBmcm9tKHdpbmRvdy5mZXRjaCh1cmwsIHNlcnZlck9wdGlvbnMpKS5waXBlKFxuICAgICAgbWVyZ2VNYXAocmVzcG9uc2UgPT5cbiAgICAgICAgZnJvbShDaGFubmVsRmV0Y2hVdGlsLnBhcnNlUmVzcG9uc2UocmVzcG9uc2UsIG1ldGFkYXRhKSlcbiAgICAgICksXG5cbiAgICAgIHRhcExvZyxcblxuICAgICAgbWFwKG1hcFdyYXBwZXIobWFwRm4pKSxcblxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PlxuICAgICAgICBvZihDaGFubmVsRmV0Y2hVdGlsLmNyZWF0ZUZldGNoRXJyb3JQYXlsb2FkKGVycm9yLCBtZXRhZGF0YSkpXG4gICAgICApLFxuXG4gICAgICBzaGFyZSgpXG4gICAgKVxuXG4gICAgcmVzcG9uc2UkLnN1YnNjcmliZShzdWJzY3JpYmVyKVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIHBhcnNlUmVzcG9uc2UocmVzcG9uc2UsIG1ldGFkYXRhKSB7XG4gICAgY29uc3QgeyByZXNwb25zZVR5cGUgfSA9IG1ldGFkYXRhXG5cbiAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXNcbiAgICBjb25zdCBzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdHVzVGV4dFxuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycz8uZ2V0Py4oJ2NvbnRlbnQtdHlwZScpIHx8ICcnXG5cbiAgICBjb25zdCByZXNwb25zZU1ldGFkYXRhID0ge1xuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICBzdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0LFxuICAgICAgY29udGVudFR5cGUsXG4gICAgICBvazogcmVzcG9uc2Uub2tcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2Uub2sgIT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHJhd0JvZHkgPSBhd2FpdCBDaGFubmVsRmV0Y2hVdGlsLnNhZmVSZWFkVGV4dChyZXNwb25zZSlcblxuICAgICAgdGhyb3cgQ2hhbm5lbEZldGNoVXRpbC5jcmVhdGVGZXRjaEVycm9yKHtcbiAgICAgICAgZXJyb3JUeXBlOiAnRkVUQ0hfSFRUUF9FUlJPUicsXG4gICAgICAgIG1lc3NhZ2U6IGBGZXRjaCByZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3N0YXR1c30gJHtzdGF0dXNUZXh0fWAsXG4gICAgICAgIG1ldGFkYXRhOiByZXNwb25zZU1ldGFkYXRhLFxuICAgICAgICByYXdCb2R5XG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICdqc29uJykge1xuICAgICAgcmV0dXJuIENoYW5uZWxGZXRjaFV0aWwucGFyc2VKc29uUmVzcG9uc2UocmVzcG9uc2UsIHJlc3BvbnNlTWV0YWRhdGEpXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuYmxvYigpXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJ2FycmF5QnVmZmVyJykge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKClcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2VUeXBlID09PSAnZm9ybURhdGEnKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZm9ybURhdGEoKVxuICAgIH1cblxuICAgIHRocm93IENoYW5uZWxGZXRjaFV0aWwuY3JlYXRlRmV0Y2hFcnJvcih7XG4gICAgICBlcnJvclR5cGU6ICdGRVRDSF9VTlNVUFBPUlRFRF9SRVNQT05TRV9UWVBFJyxcbiAgICAgIG1lc3NhZ2U6IGBVbnN1cHBvcnRlZCBmZXRjaCByZXNwb25zZVR5cGUgXCIke3Jlc3BvbnNlVHlwZX1cImAsXG4gICAgICBtZXRhZGF0YTogcmVzcG9uc2VNZXRhZGF0YVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcGFyc2VKc29uUmVzcG9uc2UocmVzcG9uc2UsIG1ldGFkYXRhKSB7XG4gICAgY29uc3QgcmF3Qm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgIGNvbnN0IHRyaW1tZWRCb2R5ID0gcmF3Qm9keS50cmltKClcblxuICAgIGlmICh0cmltbWVkQm9keSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHRyaW1tZWRCb2R5KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBDaGFubmVsRmV0Y2hVdGlsLmNyZWF0ZUZldGNoRXJyb3Ioe1xuICAgICAgICBlcnJvclR5cGU6ICdGRVRDSF9SRVNQT05TRV9QQVJTRV9FUlJPUicsXG4gICAgICAgIG1lc3NhZ2U6ICdFeHBlY3RlZCBKU09OIGJ1dCBjb3VsZCBub3QgcGFyc2UgcmVzcG9uc2UgYm9keS4nLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgcmF3Qm9keSxcbiAgICAgICAgb3JpZ2luYWxFcnJvcjogZXJyb3JcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZldGNoRXJyb3IoeyBlcnJvclR5cGUsIG1lc3NhZ2UsIG1ldGFkYXRhLCByYXdCb2R5ID0gJycsIG9yaWdpbmFsRXJyb3IgfSkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpXG5cbiAgICBlcnJvci5pc0NoYW5uZWxGZXRjaEVycm9yID0gdHJ1ZVxuICAgIGVycm9yLmVycm9yVHlwZSA9IGVycm9yVHlwZVxuICAgIGVycm9yLm1ldGFkYXRhID0gbWV0YWRhdGFcbiAgICBlcnJvci5yYXdCb2R5ID0gcmF3Qm9keVxuICAgIGVycm9yLm9yaWdpbmFsRXJyb3IgPSBvcmlnaW5hbEVycm9yXG5cbiAgICByZXR1cm4gZXJyb3JcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVGZXRjaEVycm9yUGF5bG9hZChlcnJvciwgbWV0YWRhdGEpIHtcbiAgICBjb25zdCBmZXRjaE1ldGFkYXRhID0gZXJyb3I/Lm1ldGFkYXRhIHx8IG1ldGFkYXRhIHx8IHt9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNDaGFubmVsRmV0Y2hFcnJvcjogdHJ1ZSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgIGVycm9yVHlwZTogZXJyb3I/LmVycm9yVHlwZSB8fCAnRkVUQ0hfVU5LTk9XTl9FUlJPUicsXG4gICAgICBtZXNzYWdlOiBlcnJvcj8ubWVzc2FnZSB8fCAnVW5rbm93biBDaGFubmVsRmV0Y2hVdGlsIGVycm9yJyxcblxuICAgICAgY2hhbm5lbE5hbWU6IGZldGNoTWV0YWRhdGEuY2hhbm5lbE5hbWUsXG4gICAgICB1cmw6IGZldGNoTWV0YWRhdGEudXJsLFxuICAgICAgcmVzcG9uc2VUeXBlOiBmZXRjaE1ldGFkYXRhLnJlc3BvbnNlVHlwZSxcbiAgICAgIHN0YXR1czogZmV0Y2hNZXRhZGF0YS5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiBmZXRjaE1ldGFkYXRhLnN0YXR1c1RleHQsXG4gICAgICBjb250ZW50VHlwZTogZmV0Y2hNZXRhZGF0YS5jb250ZW50VHlwZSxcbiAgICAgIG9rOiBmZXRjaE1ldGFkYXRhLm9rLFxuXG4gICAgICByYXdCb2R5UHJldmlldzogQ2hhbm5lbEZldGNoVXRpbC50cnVuY2F0ZUJvZHkoZXJyb3I/LnJhd0JvZHkpLFxuXG4gICAgICBvcmlnaW5hbEVycm9yTWVzc2FnZTogZXJyb3I/Lm9yaWdpbmFsRXJyb3I/Lm1lc3NhZ2VcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdHJ1bmNhdGVCb2R5KGJvZHkgPSAnJywgbWF4TGVuZ3RoID0gNTAwKSB7XG4gICAgaWYgKHR5cGVvZiBib2R5ICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgcmV0dXJuIGJvZHkubGVuZ3RoID4gbWF4TGVuZ3RoXG4gICAgICA/IGAke2JvZHkuc2xpY2UoMCwgbWF4TGVuZ3RoKX0uLi5gXG4gICAgICA6IGJvZHlcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBzYWZlUmVhZFRleHQocmVzcG9uc2UpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgc2V0TWFwRm4ob3B0cykge1xuICAgIGNvbnN0IGdldEZuID0gY29tcG9zZShkZWZhdWx0VG8ocCA9PiBwKSwgcHJvcCgnbWFwRm4nKSlcbiAgICByZXR1cm4gZ2V0Rm4ob3B0cylcbiAgfVxuXG4gIHN0YXRpYyBzZXRVcmwob3B0cykge1xuICAgIGNvbnN0IHVybCA9IHByb3AoJ3VybCcsIG9wdHMpXG5cbiAgICBpZiAodXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNweW5lV2FybignU1BZTkUgV0FSTklORzogVVJMIGlzIHVuZGVmaW5lZCBmb3IgZGF0YSBjaGFubmVsJylcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsXG4gIH1cblxuICBzdGF0aWMgc2V0UmVzcG9uc2VUeXBlKG9wdHMpIHtcbiAgICByZXR1cm4gZGVmYXVsdFRvKCdqc29uJywgcHJvcCgncmVzcG9uc2VUeXBlJywgb3B0cykpXG4gIH1cblxuICBnZXQgbWFwRm4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hcEZuXG4gIH1cblxuICBnZXQgdXJsKCkge1xuICAgIHJldHVybiB0aGlzLl91cmxcbiAgfVxuXG4gIGdldCBzZXJ2ZXJPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJPcHRpb25zXG4gIH1cblxuICBnZXQgcmVzcG9uc2VUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNwb25zZVR5cGVcbiAgfVxuXG4gIHN0YXRpYyBzdHJpbmdpZnlCb2R5SWZJdEV4aXN0cyhvYmopIHtcbiAgICBjb25zdCBib2R5ID0gb2JqPy5ib2R5XG5cbiAgICBjb25zdCBzaG91bGRTdHJpbmdpZnlCb2R5ID1cbiAgICAgIGJvZHkgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiBib2R5ID09PSAnb2JqZWN0JyAmJlxuICAgICAgYm9keS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0XG5cbiAgICBpZiAoc2hvdWxkU3RyaW5naWZ5Qm9keSAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIG9ialxuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhvYmouaGVhZGVycyB8fCB7fSlcblxuICAgIGlmIChoZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykgIT09IHRydWUpIHtcbiAgICAgIGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9iaixcbiAgICAgIGhlYWRlcnMsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB1cGRhdGVNZXRob2RXaGVuQm9keUV4aXN0cyhvcHRzKSB7XG4gICAgY29uc3QgaGFzQm9keSA9IG9wdHM/LmJvZHkgIT09IHVuZGVmaW5lZFxuICAgIGNvbnN0IG1ldGhvZCA9IG9wdHM/Lm1ldGhvZCB8fCAnR0VUJ1xuXG4gICAgaWYgKGhhc0JvZHkgJiYgbWV0aG9kLnRvVXBwZXJDYXNlKCkgPT09ICdHRVQnKSB7XG4gICAgICBzcHluZVdhcm4oXG4gICAgICAgICdTUFlORSBXQVJOSU5HOiBGZXRjaCBib2R5IHdhcyBwcm92aWRlZCB3aXRoIG1ldGhvZCBHRVQuIENoYW5naW5nIG1ldGhvZCB0byBQT1NULicsXG4gICAgICAgIG9wdHNcbiAgICAgIClcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3B0c1xuICB9XG5cbiAgc3RhdGljIHNldFNlcnZlck9wdGlvbnMob3B0cykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBwaWNrKFtcbiAgICAgICdtZXRob2QnLFxuICAgICAgJ2hlYWRlcnMnLFxuICAgICAgJ2JvZHknLFxuICAgICAgJ21vZGUnLFxuICAgICAgJ2NyZWRlbnRpYWxzJyxcbiAgICAgICdjYWNoZScsXG4gICAgICAncmVkaXJlY3QnLFxuICAgICAgJ3JlZmVycmVyJyxcbiAgICAgICdyZWZlcnJlclBvbGljeScsXG4gICAgICAnaW50ZWdyaXR5JyxcbiAgICAgICdrZWVwYWxpdmUnXG4gICAgXSwgb3B0cylcblxuICAgIGxldCBtZXJnZWRPcHRpb25zID0gbWVyZ2VEZWVwUmlnaHQoQ2hhbm5lbEZldGNoVXRpbC5iYXNlT3B0aW9ucygpLCBvcHRpb25zKVxuXG4gICAgbWVyZ2VkT3B0aW9ucyA9IENoYW5uZWxGZXRjaFV0aWwudXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMobWVyZ2VkT3B0aW9ucylcbiAgICBtZXJnZWRPcHRpb25zID0gQ2hhbm5lbEZldGNoVXRpbC5zdHJpbmdpZnlCb2R5SWZJdEV4aXN0cyhtZXJnZWRPcHRpb25zKVxuXG4gICAgcmV0dXJuIG1lcmdlZE9wdGlvbnNcbiAgfVxuXG4gIHN0YXRpYyBiYXNlT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcblxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe1xuICAgICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonXG4gICAgICB9KSxcblxuICAgICAgbW9kZTogJ2NvcnMnLFxuICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICBjYWNoZTogJ2RlZmF1bHQnLFxuICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLFxuICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZScsXG4gICAgICBpbnRlZ3JpdHk6ICcnLFxuICAgICAga2VlcGFsaXZlOiBmYWxzZVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXMsXG4gIHJlamVjdCxcbiAgaXNOaWwsXG4gIGZpbmQsXG4gIGFsbFBhc3MsXG4gIGZvckVhY2hPYmpJbmRleGVkLFxuICBub3QsXG4gIGlzRW1wdHksXG4gIGFsd2F5cyxcbiAgY29tcG9zZSxcbiAgZXF1YWxzLFxuICBwcm9wLFxuICB3aGVyZSxcbiAgZGVmYXVsdFRvLFxuICBtZXJnZUFsbCxcbiAgRixcbiAgb21pdCxcbiAgYW55LFxuICBjdXJyeSxcbiAgbHRlXG4gICwgbWFwIGFzIHJNYXBcbn0gZnJvbSAncmFtZGEnXG5cbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmNvbnN0IGlzTm90QXJyID0gY29tcG9zZShub3QsIGlzKEFycmF5KSlcbmNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKG5vdCwgaXNFbXB0eSlcbmNvbnN0IGlzTm9uRW1wdHlTdHIgPSBhbGxQYXNzKFtpcyhTdHJpbmcpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzTm9uRW1wdHlBcnIgPSBhbGxQYXNzKFtpcyhBcnJheSksIGlzTm90RW1wdHldKVxuY29uc3QgaXNPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcblxuY29uc3QgaXNTdHJpbmcgID0gKHZhbCkgPT4gaXMoU3RyaW5nLCB2YWwpXG5jb25zdCBpc0Jvb2xlYW4gPSAodmFsKSA9PiBpcyhCb29sZWFuLCB2YWwpXG5jb25zdCBpc051bWJlciAgPSAodmFsKSA9PiBpcyhOdW1iZXIsIHZhbClcbmNvbnN0IGlzQXJyYXlGbiA9ICh2YWwpID0+IGlzKEFycmF5LCB2YWwpXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsUGF5bG9hZEZpbHRlciB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxQYXlsb2FkRmlsdGVyXG4gICAqIEB0eXBlIHV0aWxcbiAgICpcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+VGhpcyB1dGlsaXR5IGZpbHRlcnMgQ2hhbm5lbFBheWxvYWQgb2JqZWN0cyBieSB1c2luZyBxdWVyeSBzZWxlY3RvcnMgYW5kL29yIGJ5IGNvbXBhcmluZyBkYXRhIHByb3BlcnRpZXM8L3A+XG4gICAqIDxoMz5UaGUgQ2hhbm5lbFBheWxvYWRGaWx0ZXIgZmVhdHVyZXM8L2gzPlxuICAgKiA8dWw+XG4gICAqICAgPGxpPkNhbiBiZSB1c2VkIGJ5IENoYW5uZWxzIGFuZCBWaWV3U3RyZWFtczwvbGk+XG4gICAqICAgPGxpPkNoYW5uZWxQYXlsb2FkRmlsdGVyIGluc3RhbmNlcyBjYW4gYmUgdXNlZCBhcyB0aGUgdGhpcmQgcGFyYW1ldGVyIHdoZW4gYmluZGluZyBhY3Rpb25zIHRvIFZpZXdTdHJlYW0gbWV0aG9kcy48L2xpPlxuICAgKiAgIDxsaT5TZWxlY3RvcnMgY2FuIGJlIGEgcXVlcnkgc3RyaW5nLCBhbiBhcnJheSBvZiBzZWxlY3RvciBzdHJpbmdzLCBvciB0aGUgc2VsZWN0b3IgY2FuIGJlIGFuIGFjdHVhbCBkb20gZWxlbWVudC48L2xpPlxuICAgKiAgIDxsaT5TZWxlY3RvcnMgYXJlIG5vdCByZXF1aXJlZCBhbmQgY2FuIGJlIGRpc3JlZ2FyZGVkIGJ5IGFkZGluZyBcIlwiIG9yIHVuZGVmaW5lZCBhcyB0aGUgc2VsZWN0b3IgcHJvcGVydHkuPC9saT5cbiAgICogICA8bGk+VGhlIGRhdGEgb2JqZWN0IGNvbXBhcmVzIHRoZSB2YWx1ZXMgZnJvbSB0aGUgcHJvcHMoKSBtZXRob2Qgb2YgYSBDaGFubmVsUGF5bG9hZCBvYmplY3Q8L2xpPlxuICAgKiAgIDxsaT5JbnRlcm5hbGx5LCBUaGUgZGF0YSBvYmplY3QgaXMgY29uZm9ybWVkIHRvIGEgc3BlYyBvYmplY3QgZm9yIHJhbWRhJnJzcXVvO3MgRVhUWyd3aGVyZScsICcvL3JhbWRhanMuY29tL2RvY3MvI3doZXJlJ10gbWV0aG9kPC9saT5cbiAgICogICA8L3VsPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd8QXJyYXl8SFRNTEVsZW1lbnR9IHNlbGVjdG9yIFRoZSBtYXRjaGluZyBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBmaWx0ZXJzIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RvciwgcHJvcHMsIGFuZCBkZWJ1Z0xhYmVsIHBhcmFtcy5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BGaWx0ZXJzIEEganNvbiBvYmplY3QgY29udGFpbmluZyBmaWx0ZXJpbmcgbWV0aG9kcyBmb3IgY2hhbm5lbCBwcm9wcyB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEFycmF5fEhUTUxFbGVtZW50fSBzZWxlY3RvciAtID0gJyc7IFRoZSBtYXRjaGluZyBlbGVtZW50LlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcEZpbHRlcnMgLSA9IHt9OyBBIGpzb24gb2JqZWN0IGNvbnRhaW5pbmcgY29tcHJhdG9ycyBmb3IgYW55IGV4cGVjdGVkIHByb3BlcnR5IHZhbHVlcy5cbiAgICogQHJldHVybnMgQm9vbGVhblxuICAgKlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0PkZpbHRlcmluZyB1c2luZyBTZWxlY3RvcnMgYW5kIGEgUHJvcGVydHkgQ29tcGFyYXRvciBXaXRoaW4gYSBWaWV3U3RyZWFtIEluc3RhbmNlPC9oND4nXVxuICAgKiAgICBjb25zdCBteVNlbGVjdG9ycyA9IFsndWwnLCAnbGk6Zmlyc3QtY2hpbGQnXTtcbiAgICogICAgY29uc3QgcHJvcEZpbHRlcnMgPSB7XG4gICAqICAgICAgbGlua1R5cGU6IFwiZXh0ZXJuYWxcIlxuICAgKiAgICB9O1xuICAgKiAgICBjb25zdCBteUZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcihteVNlbGVjdG9ycywgcHJvcEZpbHRlcnMpO1xuICAgKlxuICAgKiAgICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICAgICAgICAgWydDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJywgJ29uQ2xpY2tFdmVudCcsIG15RmlsdGVyXVxuICAgKiAgICAgICAgICAgICBdXG4gICAqICAgICAgICAgIH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5GaWx0ZXJpbmcgVXNpbmcgTWV0aG9kIGFuZCBTdHJpbmcgQ29tcGFyYXRvcnMgV2l0aGluIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+J11cbiAgICogICAgY29uc3QgcHJvcEZpbHRlcnMgPSB7XG4gICAqICAgICAgdHlwZTogXCJzY3JvbGxpbmctZWxlbWVudFwiLFxuICAgKiAgICAgIHNjcm9sbE51bTogIChuKT0+bj49MTIwMCAmJiBuPD01MDAwO1xuICAgKiAgICB9O1xuICAgKiAgICBjb25zdCBteUZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcignJywgcHJvcEZpbHRlcnMpO1xuICAgKlxuICAgKiAgICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICAgICAgICAgWydDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJywgJ29uQ2xpY2tFdmVudCcsIG15RmlsdGVyXVxuICAgKiAgICAgICAgICAgICBdXG4gICAqICAgICAgICAgIH1cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5BIFNpbXBsZSBQcm9wZXJ0eSBGaWx0ZXJpbmcgRXhhbXBsZSBXaXRoaW4gYSBDaGFubmVsIEluc3RhbmNlPC9oND4nXVxuICAgKiAvLyBGaWx0ZXIgZm9yIGEgYnV0dG9uIHdpdGggYSBkYXRhIHR5cGUgb2YgJ2xpbmsnXG4gICAqIGNvbnN0IG15RmlsdGVyID0gbmV3IENoYW5uZWxQYXlsb2FkRmlsdGVyKCcnIHt0eXBlOiBcImxpbmtcIn0pO1xuICAgKlxuICAgKiB0aGlzLmdldENoYW5uZWwoXCJDSEFOTkVMX1VJXCIpXG4gICAqIC5waXBlKGZpbHRlcihteUZpbHRlcikpXG4gICAqIC5zdWJzY3JpYmUobXlDaGFubmVsTWV0aG9kKTtcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNlbGVjdG9yLCBmaWx0ZXJzID0ge30sIGRlYnVnTGFiZWwsIHRlc3RNb2RlKSB7XG4gICAgY29uc3Qgc2VsZWN0b3JJc09iaiA9IGlzT2JqZWN0Rm4oc2VsZWN0b3IpXG5cbiAgICBpZiAoc2VsZWN0b3JJc09iaikge1xuICAgICAgZmlsdGVycyA9IHNlbGVjdG9yXG4gICAgICBzZWxlY3RvciA9IHByb3AoJ3NlbGVjdG9yJywgZmlsdGVycylcbiAgICAgIHRlc3RNb2RlID0gdGVzdE1vZGUgfHwgcHJvcCgndGVzdE1vZGUnLCBmaWx0ZXJzKVxuICAgIH1cblxuICAgIGNvbnN0IGRlYnVnTGFiZWxBcnIgPSBbZGVidWdMYWJlbCwgcHJvcCgnZGVidWdMYWJlbCcsIGZpbHRlcnMpXVxuXG4gICAgZGVidWdMYWJlbCA9IGNvbXBvc2UoZmluZChpcyhTdHJpbmcpKSkoZGVidWdMYWJlbEFycilcblxuICAgIGxldCBwcm9wcyA9IG9taXQoWydkZWJ1Z0xhYmVsJywgJ2xhYmVsJywgJ3NlbGVjdG9yJywgJ3Byb3BzJywgJ3Rlc3RNb2RlJywgJ3Byb3BGaWx0ZXJzJ10sIGZpbHRlcnMpXG4gICAgaWYgKGZpbHRlcnMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMgPSBtZXJnZUFsbChbZmlsdGVycy5wcm9wcywgcHJvcHNdKVxuICAgIH0gZWxzZSBpZiAoZmlsdGVycy5wcm9wRmlsdGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wcyA9IG1lcmdlQWxsKFtmaWx0ZXJzLnByb3BGaWx0ZXJzLCBwcm9wc10pXG4gICAgfVxuXG4gICAgZmlsdGVycy5wcm9wRmlsdGVycyA9IHByb3BzXG5cbiAgICBjb25zdCB7IHByb3BGaWx0ZXJzIH0gPSBmaWx0ZXJzXG5cbiAgICBjb25zdCBhZGRTdHJpbmdTZWxlY3RvckZpbHRlciA9ICBpc05vbkVtcHR5U3RyKHNlbGVjdG9yKSA/IENoYW5uZWxQYXlsb2FkRmlsdGVyLmZpbHRlclNlbGVjdG9yKFtzZWxlY3Rvcl0sIGRlYnVnTGFiZWwpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkQXJyYXlTZWxlY3RvckZpbHRlciA9ICAgaXNOb25FbXB0eUFycihzZWxlY3RvcikgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJTZWxlY3RvcihzZWxlY3RvciwgZGVidWdMYWJlbCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBhZGREYXRhRmlsdGVyID0gaXNOb25FbXB0eU9iamVjdEZuKHByb3BGaWx0ZXJzKSA/IENoYW5uZWxQYXlsb2FkRmlsdGVyLmZpbHRlckRhdGEocHJvcEZpbHRlcnMsIGRlYnVnTGFiZWwpIDogdW5kZWZpbmVkXG5cbiAgICBsZXQgZmlsdGVyc0FyciA9IHJlamVjdChpc05pbCwgW2FkZFN0cmluZ1NlbGVjdG9yRmlsdGVyLCBhZGRBcnJheVNlbGVjdG9yRmlsdGVyLCBhZGREYXRhRmlsdGVyXSlcblxuICAgIC8vIElGIEFSUkFZIElTIEVNUFRZIEFMV0FZUyBSRVRVUk4gRkFMU0U7XG5cbiAgICBjb25zdCBmaWx0ZXJzQXJlRW1wdHkgPSBpc0VtcHR5KGZpbHRlcnNBcnIpXG5cbiAgICBpZiAoZmlsdGVyc0FyZUVtcHR5KSB7XG4gICAgICBmaWx0ZXJzQXJyID0gW2Fsd2F5cyhmYWxzZSldXG4gICAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlICYmIHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIENoYW5uZWwgRmlsdGVyLCB3aXRoIHNlbGVjdG9yOiAke3NlbGVjdG9yfSwgYW5kIHByb3BGaWx0ZXJzOiR7cHJvcEZpbHRlcnN9IGFwcGVhcnMgdG8gYmUgZW1wdHkhYClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRlc3RNb2RlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciwgcHJvcEZpbHRlcnMsIGRlYnVnTGFiZWwsIGZpbHRlcnMsIHRlc3RNb2RlLCBmaWx0ZXJzQXJlRW1wdHkgfVxuICAgIH1cblxuICAgIHJldHVybiBhbGxQYXNzKGZpbHRlcnNBcnIpXG4gIH1cblxuICBzdGF0aWMgZmlsdGVyRGF0YShmaWx0ZXJKc29uLCBmaWx0ZXJkZWJ1Z0xhYmVsKSB7XG4gICAgY29uc3QgZGVidWdMYWJlbCA9IGZpbHRlcmRlYnVnTGFiZWxcblxuICAgIGNvbnN0IGNvbXBhcmVEYXRhID0gKCkgPT4ge1xuICAgICAgLy8gRE8gTk9UIEFMTE9XIEFOIEVNUFRZIE9CSkVDVCBUTyBSRVRVUk4gVFJVRXNcbiAgICAgIGlmIChpc0VtcHR5KGZpbHRlckpzb24pKSB7XG4gICAgICAgIHJldHVybiBhbHdheXMoZmFsc2UpXG4gICAgICB9XG5cbiAgICAgIC8vICBDSEVDS1MgQUxMIFZBTFVFUyBJTiBKU09OIFRPIERFVEVSTUlORSBJRiBUSEVSRSBBUkUgRklMVEVSSU5HIE1FVEhPRFNcblxuICAgICAgY29uc3QgY3JlYXRlQ3VycnlDb21wYXJhdG9yID0gY29tcGFyZVN0ciA9PiAoc3RyKSA9PiB7XG4gICAgICAgIHJldHVybiBzdHIgPT09IGNvbXBhcmVTdHJcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoZWNrVG9Db252ZXJ0VG9GbiA9ICh2YWwsIGtleSwgb2JqKSA9PiB7XG4gICAgICAgIGxldCBmblZhbCA9IEZcbiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbCkgfHwgaXNCb29sZWFuKHZhbCkgfHwgaXNOdW1iZXIodmFsKSkge1xuICAgICAgICAgIGZuVmFsID0gY3JlYXRlQ3VycnlDb21wYXJhdG9yKHZhbClcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbFxuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXlGbih2YWwpIHx8IGlzT2JqZWN0Rm4odmFsKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYENoYW5uZWxQYXlsb2FkRmlsdGVyOiBQcm9wZXJ0eSBcIiR7dmFsfVwiIGlzIGFuIGFycmF5L29iamVjdCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIGAgK1xuICAgICAgICAgICAgICAnVGhpcyBwcm9wZXJ0eSB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UuJ1xuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm4gZm5WYWxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm5WYWxcbiAgICAgIH1cbiAgICAgIGZpbHRlckpzb24gPSByTWFwKGNoZWNrVG9Db252ZXJ0VG9GbiwgZmlsdGVySnNvbilcblxuICAgICAgLy8gVEFQIExPR0dFUlxuICAgICAgY29uc3QgdGFwTG9nZ2VyID0gKGNvbXBhcmVkT2JqKSA9PiB7XG4gICAgICAgIGlmIChkZWJ1Z0xhYmVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGFyZWRPYmpcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wc0Jvb2xlYW5zID0ge31cbiAgICAgICAgY29uc3QgbWFwQm9vbHMgPSAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgIHByb3BzQm9vbGVhbnNba2V5XSA9IHZhbHVlKHByb3Aoa2V5LCBjb21wYXJlZE9iaikpXG4gICAgICAgIH1cbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQobWFwQm9vbHMsIGZpbHRlckpzb24pXG4gICAgICAgIGNvbnNvbGUubG9nKGAlYyBDSEFOTkVMIFBBWUxPQUQgRklMVEVSIERFQlVHR0VSIFtcIiR7ZGVidWdMYWJlbH1cIl0gLSB2YWx1ZXM6ICAgIGAsICdjb2xvcjpvcmFuZ2U7JywgeyBwcm9wc0Jvb2xlYW5zLCBjb21wYXJlZE9iaiB9KVxuXG4gICAgICAgIHJldHVybiBjb21wYXJlZE9ialxuICAgICAgfVxuXG4gICAgICAvLyBFTkQgVEFQIExPR0dFUlxuICAgICAgY29uc3QgZk1ldGhvZCA9IHdoZXJlKGZpbHRlckpzb24pXG5cbiAgICAgIGNvbnN0IGdldEZpbHRlcmluZ09iaiA9ICAodikgPT4ge1xuICAgICAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSB2IHx8IHt9XG4gICAgICAgIGNvbnN0IG8gPSBPYmplY3QuYXNzaWduKHt9LCB2LCBzcmNFbGVtZW50LCBldmVudCwgcGF5bG9hZClcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ28gaXMgJyxvKTtcbiAgICAgICAgcmV0dXJuIG9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbXBvc2UoZk1ldGhvZCwgdGFwTG9nZ2VyLCBkZWZhdWx0VG8oe30pLCBnZXRGaWx0ZXJpbmdPYmopXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBhcmVEYXRhKClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja1BheWxvYWRTZWxlY3RvcihhcnIsIGRlYnVnTGFiZWwsIHNyY1BheWxvYWQpIHtcbiAgICAvLyBFTEVNRU5UIEZST00gUEFZTE9BRHNcbiAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBzcmNQYXlsb2FkIHx8IHt9XG5cbiAgICBjb25zdCByZWR1Y2VGaW5kRWwgPSAoYWNjLCBzcmMpID0+IHtcbiAgICAgIGlmIChhY2MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9XG4gICAgICBjb25zdCBlbCA9IHByb3AoJ2VsJywgc3JjKVxuICAgICAgaWYgKENoYW5uZWxQYXlsb2FkRmlsdGVyLmVsSXNEb21FbGVtZW50KGVsKSkge1xuICAgICAgICBhY2MgPSBlbFxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIGNvbnN0IGVsID0gW3NyY0VsZW1lbnQsIHBheWxvYWQsIHByb3AoJ3NyY0VsZW1lbnQnLCBldmVudCksIHNyY1BheWxvYWRdLnJlZHVjZShyZWR1Y2VGaW5kRWwsIHVuZGVmaW5lZClcblxuICAgIC8vIENIRUNLIElGIFBBWUxPQUQgRUwgRVhJU1RTXG4gICAgY29uc3QgZWxDYW5NYXRjaCA9IGVsICE9PSBudWxsICYmIHR5cGVvZiBlbCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGVsLm1hdGNoZXMgPT09ICdmdW5jdGlvbidcblxuICAgIC8vIHRoZSBwYXlsb2FkIGVsZW1lbnQgaXMgdGVzdGVkIGRpcmVjdGx5IHdpdGggRWxlbWVudC5tYXRjaGVzIOKAlCB0aGUgc2FtZVxuICAgIC8vIFwiaXMgdGhpcyBlbCBvbmUgb2YgdGhlIHNlbGVjdG9yJ3MgZWxlbWVudHNcIiBhbnN3ZXIgYXMgdGhlIHByZXZpb3VzXG4gICAgLy8gZG9jdW1lbnQtd2lkZSBxdWVyeVNlbGVjdG9yQWxsIHdhbGssIHdpdGhvdXQgc2Nhbm5pbmcgdGhlIGRvY3VtZW50IG9uXG4gICAgLy8gZXZlcnkgZGlzcGF0Y2ggKGlzRXF1YWxOb2RlIGNvdWxkIGFsc28gcGFzcyBhIHN0cnVjdHVyYWwgbG9va2FsaWtlIG9mXG4gICAgLy8gYSBtYXRjaGVkIG5vZGUsIHdoaWNoIHdhcyBhbiBvdmVyLW1hdGNoLCBub3QgYSBjb250cmFjdClcbiAgICBjb25zdCBlbE1hdGNoZXMgPSAoc2VsKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZWwubWF0Y2hlcyhzZWwpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBDaGFubmVsUGF5bG9hZEZpbHRlciBzZWxlY3RvciwgJHtzZWx9LCBpcyBub3QgYSB2YWxpZCBjc3Mgc2VsZWN0b3IhYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaGVzQm9vbEFyciA9IGVsQ2FuTWF0Y2ggPyByTWFwKGVsTWF0Y2hlcywgYXJyKSA6IFtdXG5cbiAgICBpZiAoZGVidWdMYWJlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzZWxlY3RvcnNBcnIgPSBhcnJcbiAgICAgIGNvbnNvbGUubG9nKGAlYyBDSEFOTkVMIFBBWUxPQUQgRklMVEVSIERFQlVHR0VSIFtcIiR7ZGVidWdMYWJlbH1cIl0gLSBzZWxlY3RvcnM6IGAsICdjb2xvcjpvcmFuZ2U7JywgeyBlbCwgc2VsZWN0b3JzQXJyLCBub2RlQXJyUmVzdWx0c0RlYnVnZ2VyOiBtYXRjaGVzQm9vbEFyciB9KVxuICAgIH1cblxuICAgIGlmIChlbENhbk1hdGNoID09PSBmYWxzZSB8fCBpc0VtcHR5KG1hdGNoZXNCb29sQXJyKSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGFueShlcXVhbHModHJ1ZSksIG1hdGNoZXNCb29sQXJyKVxuICB9XG5cbiAgc3RhdGljIGVsSXNEb21FbGVtZW50KG8pIHtcbiAgICBpZiAoaXMoU3RyaW5nLCBvKSkge1xuICAgICAgbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobylcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpKG8pXG4gIH1cblxuICBzdGF0aWMgZmlsdGVyU2VsZWN0b3Ioc2VsZWN0b3JBcnIsIGRlYnVnTGFiZWwpIHtcbiAgICBjb25zdCBhcnIgPSByZWplY3QoaXNFbXB0eSwgc2VsZWN0b3JBcnIpXG4gICAgY29uc3QgcGF5bG9hZENoZWNrID0gY3VycnkoQ2hhbm5lbFBheWxvYWRGaWx0ZXIuY2hlY2tQYXlsb2FkU2VsZWN0b3IpXG4gICAgcmV0dXJuIHBheWxvYWRDaGVjayhhcnIsIGRlYnVnTGFiZWwpXG4gIH1cbn1cbiIsImZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbCkge1xuICBjb25zdCBub25OdWxsT2JqZWN0ID0gdmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnXG4gIHJldHVybiBub25OdWxsT2JqZWN0ICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpICE9PSAnW29iamVjdCBSZWdFeHBdJyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSAhPT0gJ1tvYmplY3QgRGF0ZV0nXG59XG5cbmZ1bmN0aW9uIGVtcHR5VGFyZ2V0KHZhbCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gW10gOiB7fVxufVxuXG5mdW5jdGlvbiBjbG9uZUlmTmVjZXNzYXJ5KHZhbHVlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgY2xvbmUgPSBvcHRpb25zQXJndW1lbnQgJiYgb3B0aW9uc0FyZ3VtZW50LmNsb25lID09PSB0cnVlXG4gIHJldHVybiAoY2xvbmUgJiYgaXNNZXJnZWFibGVPYmplY3QodmFsdWUpKVxuICAgID8gZGVlcE1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSxcbiAgICAgIHZhbHVlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgOiB2YWx1ZVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gdGFyZ2V0LnNsaWNlKClcbiAgc291cmNlLmZvckVhY2goZnVuY3Rpb24oZSwgaSkge1xuICAgIGlmICh0eXBlb2YgZGVzdGluYXRpb25baV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBkZXN0aW5hdGlvbltpXSA9IGNsb25lSWZOZWNlc3NhcnkoZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QoZSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gZGVlcE1lcmdlKHRhcmdldFtpXSwgZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSBpZiAodGFyZ2V0LmluZGV4T2YoZSkgPT09IC0xKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGNsb25lSWZOZWNlc3NhcnkoZSwgb3B0aW9uc0FyZ3VtZW50KSlcbiAgICB9XG4gIH0pXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBtZXJnZU9iamVjdCh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0ge31cbiAgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldCkpIHtcbiAgICBPYmplY3Qua2V5cyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gY2xvbmVJZk5lY2Vzc2FyeSh0YXJnZXRba2V5XSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0pXG4gIH1cbiAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICghaXNNZXJnZWFibGVPYmplY3Qoc291cmNlW2tleV0pIHx8ICF0YXJnZXRba2V5XSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGNsb25lSWZOZWNlc3Nhcnkoc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGRlZXBNZXJnZSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9XG4gIH0pXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudCkge1xuICBjb25zdCBhcnJheSA9IEFycmF5LmlzQXJyYXkoc291cmNlKVxuICBjb25zdCBvcHRpb25zID0gb3B0aW9uc0FyZ3VtZW50IHx8IHsgYXJyYXlNZXJnZTogZGVmYXVsdEFycmF5TWVyZ2UgfVxuICBjb25zdCBhcnJheU1lcmdlID0gb3B0aW9ucy5hcnJheU1lcmdlIHx8IGRlZmF1bHRBcnJheU1lcmdlXG5cbiAgaWYgKGFycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0KVxuICAgICAgPyBhcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgICA6IGNsb25lSWZOZWNlc3Nhcnkoc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gIH1cbn1cblxuZGVlcE1lcmdlLmFsbCA9IGZ1bmN0aW9uIGRlZXBtZXJnZUFsbChhcnJheSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkgfHwgYXJyYXkubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCB0d28gZWxlbWVudHMnKVxuICB9XG5cbiAgLy8gd2UgYXJlIHN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IDIgdmFsdWVzLCBzbyBpdCBpcyBzYWZlIHRvIGhhdmUgbm8gaW5pdGlhbCB2YWx1ZVxuICByZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gZGVlcE1lcmdlKHByZXYsIG5leHQsIG9wdGlvbnNBcmd1bWVudClcbiAgfSlcbn1cblxuZXhwb3J0IHsgZGVlcE1lcmdlIH1cbiIsImltcG9ydCB7IGRlZmF1bHRUbywgbWF0Y2gsIGZvckVhY2gsIHRlc3QsIGluY2x1ZGVzLCB3aXRob3V0LCBjb21wbGVtZW50LCBpc0VtcHR5LCB2YWx1ZXMsIGlzTmlsLCBmaWx0ZXIsIF9fLCBrZXlzLCBjb21wb3NlLCBoZWFkLCBtYXAsIGNvbmQsIFQsIGFsbFBhc3MsIGNvbmNhdCwgdW5pcSB9IGZyb20gJ3JhbWRhJ1xuY29uc3QgaXNJT1MgPSAoKSA9PiB7XG4gIGNvbnN0IHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKClcbiAgLy8gbGV0IHNhZmFyaSA9IC9zYWZhcmkvLnRlc3QodXNlckFnZW50KTtcbiAgY29uc3QgaW9zID0gL2lwaG9uZXxpcG9kfGlwYWQvLnRlc3QodXNlckFnZW50KVxuICByZXR1cm4gaW9zID09PSB0cnVlXG59XG5cbmNvbnN0IGRlbGF5Q2FsbCA9IGFzeW5jKGZuLCB0aW1lKSA9PiB7XG4gIGZ1bmN0aW9uIHNsZWVwKG1zKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG4gIH1cblxuICBjb25zdCB0aW1lb3V0SGFuZGxlciA9IGFzeW5jKCkgPT4ge1xuICAgIGF3YWl0IHNsZWVwKDEpXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbilcbiAgfVxuXG4gIHdpbmRvdy5zZXRUaW1lb3V0KHRpbWVvdXRIYW5kbGVyLCB0aW1lKVxufVxuXG5jb25zdCBnZXRDb25zdHJ1Y3Rvck5hbWUgPSAob2JqKSA9PiB7XG4gIGlmIChvYmouY29uc3RydWN0b3IubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG9iai5jb25zdHJ1Y3Rvci5uYW1lXG4gIH1cbiAgY29uc3QgcmUgPSAvXihmdW5jdGlvblxccykoXFx3KykoXFwoLiopJC9cbiAgY29uc3Qgc3RyID0gb2JqLnRvU3RyaW5nKClcbiAgcmV0dXJuIGRlZmF1bHRUbyhTdHJpbmcoc3RyKS5zdWJzdHIoMCwgMTIpLCBtYXRjaChyZSwgc3RyKVsyXSlcbn1cblxuY29uc3QgYXJyRnJvbU1hcEtleXMgPSAobWFwKSA9PiB7XG4gIGNvbnN0IGFyciA9IFtdXG4gIGNvbnN0IGFkZEtleXNUb0FyciA9ICh2LCBrLCBpKSA9PiBhcnIucHVzaChrKVxuICBmb3JFYWNoKGFkZEtleXNUb0FyciwgbWFwKVxuICByZXR1cm4gYXJyXG59XG5cbmNvbnN0IGZpbmRTdHJGcm9tUmVnZXhBcnIgPSAob2JqLCBzdHIpID0+IHtcbiAgaWYgKG9ialtzdHJdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cbiAgY29uc3QgY2hlY2tJZk1hdGNoID0gcyA9PiB0ZXN0KG5ldyBSZWdFeHAocyksIHN0cilcbiAgY29uc3QgY2hlY2tTdHJNYXRjaCA9IGluY2x1ZGVzKHN0cilcbiAgY29uc3QgY2hlY2tJZlJlZ0V4TWF0Y2ggPSBjb21wb3NlKGluY2x1ZGVzKHRydWUpLCBtYXAoY2hlY2tJZk1hdGNoKSlcbiAgY29uc3QgcnVuTWF0Y2hDaGVja3MgPSBjb25kKFtcbiAgICBbY2hlY2tTdHJNYXRjaCwgKCkgPT4gc3RyXSxcbiAgICBbY2hlY2tJZlJlZ0V4TWF0Y2gsICgpID0+IHN0cl0sXG4gICAgW1QsICgpID0+IHVuZGVmaW5lZF1cbiAgXSlcbiAgcmV0dXJuIHJ1bk1hdGNoQ2hlY2tzKG9iailcbn1cblxuY29uc3QgZmluZFN0ck9yUmVnZXhNYXRjaFN0ciA9IChvYmosIHN0cikgPT4ge1xuICBpZiAob2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdHJcbiAgfVxuICBjb25zdCBjcmVhdGVSZSA9IHMgPT4gbmV3IFJlZ0V4cChzKVxuICBjb25zdCBjaGVja2VySWZSZWdleE1hdGNoRXhpc3RzID0gY29tcG9zZShoZWFkLCBmaWx0ZXIoY29tcG9zZSh0ZXN0KF9fLCBzdHIpLCBjcmVhdGVSZSkpKVxuICByZXR1cm4gY2hlY2tlcklmUmVnZXhNYXRjaEV4aXN0cyhrZXlzKG9iaikpXG59XG5cbmNvbnN0IGNsb3Nlc3QgPSAoYXJyYXksIG51bSkgPT4ge1xuICBsZXQgaSA9IDBcbiAgbGV0IG1pbkRpZmYgPSAxMDAwXG4gIGxldCBhbnNcbiAgZm9yIChpIGluIGFycmF5KSB7XG4gICAgY29uc3QgbSA9IE1hdGguYWJzKG51bSAtIGFycmF5W2ldKVxuICAgIGlmIChtIDwgbWluRGlmZikge1xuICAgICAgbWluRGlmZiA9IG1cbiAgICAgIGFucyA9IGFycmF5W2ldXG4gICAgfVxuICB9XG4gIHJldHVybiBhbnNcbn1cblxuY29uc3QgY29udmVydERvbVN0cmluZ01hcFRvT2JqID0gKGRvbU1hcCkgPT4ge1xuICBjb25zdCBvYmogPSB7fVxuICBmb3IgKGNvbnN0IGQgaW4gZG9tTWFwKSB7XG4gICAgb2JqW2RdID0gZG9tTWFwW2RdXG4gIH1cbiAgcmV0dXJuIG9ialxufVxuXG4vLyBjb25zdCBwYXNzUGFnZURhdGEgPSBwaWNrKFsncGFyYW1zJywgJ3JvdXRlSWQnLCAnZGF0YSddLCBfXyk7XG5cbmNvbnN0IHN1YnNjcmliZUZuID0ge1xuICBuZXh0OiAgICAgeCA9PiBjb25zb2xlLmxvZyhgbmV4dCAgICAgICR7eH1gKSxcbiAgZXJyb3I6ICAgIHggPT4gY29uc29sZS5sb2coYGVycm9yICAgICAke3h9YCksXG4gIGNvbXBsZXRlOiB4ID0+IGNvbnNvbGUubG9nKGBjb21wbGV0ZSAgJHt4fWApXG59XG5cbmNvbnN0IHJpZ2h0ID0geCA9PiAoe1xuICBtYXA6IGYgPT4gcmlnaHQoZih4KSksXG4gIGZvbGQ6IChmLCBnKSA9PiBnKHgpLFxuICBpbnNwZWN0OiAoKSA9PiBgcmlnaHQoJHt4fSlgXG5cbn0pXG5cbmNvbnN0IGlmTmlsVGhlblVwZGF0ZSA9ICh2YWwsIG5ld1ZhbCkgPT4ge1xuICBjb25zdCBpc05pbEJvb2wgPSBpc05pbCh2YWwpXG4gIHJldHVybiBpc05pbEJvb2wgPyBuZXdWYWwgOiB2YWxcbn1cblxuY29uc3QgbGVmdCA9IHggPT4gKHtcbiAgbWFwOiBmID0+IGxlZnQoeCksXG4gIGZvbGQ6IChmLCBnKSA9PiBmKHgpLFxuICBpbnNwZWN0OiAoKSA9PiBgbGVmdCgke3h9KWBcbn0pXG5cbmNvbnN0IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgPSAob2JqKSA9PiB7XG4gIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNFbXB0eSksIGhlYWQsIHZhbHVlcylcbiAgY29uc3QgaXNOb3ROaWwgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNOaWwpLCBoZWFkLCB2YWx1ZXMpXG4gIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90TmlsXSlcbiAgcmV0dXJuIGlzTm90TmlsQW5kSXNOb3RFbXB0eShvYmopXG59XG5cbmNvbnN0IGZyb21OdWxsYWJsZSA9IHggPT4geCAhPT0gbnVsbCA/IHJpZ2h0KHgpIDogbGVmdChudWxsKVxuXG5jb25zdCBmaW5kSW5PYmogPSAob2JqLCB2YWwsIGVycm9yID0gbnVsbCkgPT4ge1xuICBjb25zdCBmb3VuZCA9IG9ialt2YWxdXG4gIHJldHVybiBmb3VuZCA/IHJpZ2h0KGZvdW5kKSA6IGxlZnQoZXJyb3IpXG59XG5jb25zdCBwdWxsUm91dGVJbmZvID0gKCkgPT4ge1xuICBjb25zdCBzdHIgPSBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2gpXG4gIGNvbnN0IHJvdXRlSWQgPSBwdWxsTWFpblJvdXRlKHN0cilcbiAgY29uc3QgcGFyYW1zID0gcHVsbFBhcmFtcyhzdHIpXG4gIHJldHVybiB7IHJvdXRlSWQsIHBhcmFtcyB9XG59XG5cbmZ1bmN0aW9uIGdldEFsbE1ldGhvZE5hbWVzKGluc3RhbmNlLCBvbWl0dGVkTWV0aG9kcyA9IFtdKSB7XG4gIC8vIE9wdGlvbmFsbHkgcmVuYW1lIGBpbnN0YW5jZWAgdG8gc29tZXRoaW5nIG1vcmUgZGVzY3JpcHRpdmU6XG4gIGNvbnN0IGJhc2VDbGFzc01ldGhvZHNBcnIgPSBbJ2xlbmd0aCcsICduYW1lJywgJ3Byb3RvdHlwZScsICdjb25zdHJ1Y3RvciddXG4gIGNvbnN0IGNvbWJpbmVkT21pdHRlZE1ldGhvZHMgPSBjb25jYXQoYmFzZUNsYXNzTWV0aG9kc0Fyciwgb21pdHRlZE1ldGhvZHMpXG5cbiAgLy8gRmlsdGVyIG91dCBvbWl0dGVkXG4gIGNvbnN0IG9taXRQcm9wc0Zyb21BcnIgPSBjb21wb3NlKHdpdGhvdXQoY29tYmluZWRPbWl0dGVkTWV0aG9kcyksIHVuaXEpXG5cbiAgLy8gUHVsbCBvdXQgaW5zdGFuY2UgbWV0aG9kc1xuICBjb25zdCBtZXRob2RzID0gb21pdFByb3BzRnJvbUFycihcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpXG4gIClcblxuICAvLyBQdWxsIG91dCBzdGF0aWMgbWV0aG9kc1xuICBjb25zdCBzdGF0aWNNZXRob2RzID0gb21pdFByb3BzRnJvbUFycihcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZS5jb25zdHJ1Y3RvcilcbiAgKVxuXG4gIGNvbnN0IGFsbE1ldGhvZHMgPSBjb25jYXQobWV0aG9kcywgc3RhdGljTWV0aG9kcylcblxuICByZXR1cm4geyBtZXRob2RzLCBzdGF0aWNNZXRob2RzLCBhbGxNZXRob2RzIH1cbn1cblxuLyogY29uc3QgZ2V0QWxsTWV0aG9kTmFtZXMzID0gKF90aGlzID0gdGhpcywgb21pdHRlZE1ldGhvZHMgPSBbXSkgPT4ge1xuICBjb25zdCBnZXRQcm9wTmFtZXNBcnIgPSAob2JqID0gdGhpcywgb21pdHRlZE1ldGhvZHMgPSBbXSkgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopXG4gIH1cbiAgLy8gRmlsdGVyIE1ldGhvZHNcbiAgY29uc3QgYmFzZUNsYXNzTWV0aG9kc0FyciA9IFsnbGVuZ3RoJywgJ25hbWUnLCAncHJvdG90eXBlJywgJ2NvbnN0cnVjdG9yJ11cbiAgb21pdHRlZE1ldGhvZHMgPSBjb25jYXQoYmFzZUNsYXNzTWV0aG9kc0Fyciwgb21pdHRlZE1ldGhvZHMpXG4gIGNvbnN0IG9taXRQcm9wc0Zyb21BcnIgPSBjb21wb3NlKHdpdGhvdXQob21pdHRlZE1ldGhvZHMpLCB1bmlxKVxuXG4gIC8vIFBVTEwgT1VUIE1FVEhPRCBOQU1FU1xuICBjb25zdCBtZXRob2RzID0gb21pdFByb3BzRnJvbUFycihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhfdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpKVxuICBjb25zdCBzdGF0aWNNZXRob2RzID0gb21pdFByb3BzRnJvbUFycihnZXRQcm9wTmFtZXNBcnIoX3RoaXMuY29uc3RydWN0b3IpKVxuICBjb25zdCBhbGxNZXRob2RzID0gY29uY2F0KG1ldGhvZHMsIHN0YXRpY01ldGhvZHMpXG5cbiAgcmV0dXJuIHsgbWV0aG9kcywgc3RhdGljTWV0aG9kcywgYWxsTWV0aG9kcyB9XG4gIC8vIHJldHVybiAnZm4nO1xufSAqL1xuXG4vLyBST1VURSBSRUdFWCBFWFBSRVNTSU9OU1xuY29uc3QgcmVtb3ZlU2xhc2hlcyA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihcXC8pKC4qKS9nLCAnJDInKVxuY29uc3Qgcm91dGVSRSA9IC9eKFxcLz8pKFxcdyopKFxcLz8pKC4qKS9nXG5jb25zdCBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGggPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXigjXFwvPykoLiopLywgJyQyJylcbmNvbnN0IHB1bGxTbGFzaEZyb21QYXRoID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oXFwvPykoLiopLywgJyQyJylcbmNvbnN0IHB1bGxNYWluUm91dGUgPSAoc3RyKSA9PiBzdHIucmVwbGFjZShyb3V0ZVJFLCAnJDInKVxuY29uc3QgcHVsbFBhcmFtcyA9ICAgIChzdHIpID0+IHN0ci5yZXBsYWNlKHJvdXRlUkUsICckNCcpXG5jb25zdCBwdWxsVHJhbnNsYXRlWCA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKikoLC4qKS8sICckNicpXG5jb25zdCBwdWxsVHJhbnNsYXRlWSA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKSguKikvLCAnJDcnKVxuY29uc3QgcHVsbFRyYW5zbGF0ZVlGcm9tSGVhZGVyID0gc3RyID0+IHN0ci5yZXBsYWNlKC9eKHRyYW5zZm9ybTogbWF0cml4KSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCopKFxcKS4qOykvLCAnJDYnKVxuZXhwb3J0IHsgZ2V0Q29uc3RydWN0b3JOYW1lLCBhcnJGcm9tTWFwS2V5cywgZ2V0QWxsTWV0aG9kTmFtZXMsIGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIsIGZpbmRTdHJGcm9tUmVnZXhBcnIsIGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwsIGlzSU9TLCBwdWxsUm91dGVJbmZvLCBwdWxsVHJhbnNsYXRlWUZyb21IZWFkZXIsIHB1bGxTbGFzaEZyb21QYXRoLCBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgsIGNsb3Nlc3QsIHB1bGxUcmFuc2xhdGVZLCBwdWxsVHJhbnNsYXRlWCwgcHVsbE1haW5Sb3V0ZSwgcHVsbFBhcmFtcywgcmlnaHQsIGxlZnQsIGZyb21OdWxsYWJsZSwgZmluZEluT2JqLCBpZk5pbFRoZW5VcGRhdGUsIHJlbW92ZVNsYXNoZXMsIHN1YnNjcmliZUZuLCBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmosIGRlbGF5Q2FsbCB9XG4iLCJpbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSAncmFtZGEnXG5leHBvcnQgZnVuY3Rpb24gZ2MoKSB7XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc3QgbG9vcE0gPSBtID0+IHVuZGVmaW5lZFxuICAgIGZvckVhY2gobG9vcE0sIHRoaXMpXG4gIH1cbiAgc2V0VGltZW91dChjbGVhbnVwLCAxKVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJhc2VDb3JlTWl4aW5zKCkge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZXByb3BzTWFwOiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKVxuICAgICAgY29uc3Qgb2JqS2V5ID0geyB2c2lkOiB0aGlzLnByb3BzLnZzaWQgfVxuICAgICAgd20uc2V0KG9iaktleSwgdGhpcy5wcm9wcylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogb2JqS2V5LFxuICAgICAgICB3ZWFrTWFwOiB3bVxuICAgICAgfVxuICAgIH0sXG4gICAgZ2M6IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yIChjb25zdCBtIGluIHRoaXMpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbbV1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzXG4gICAgfSxcbiAgICBjcmVhdGVJZDogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBsZXQgbnVtID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgxMDAwMDAwMCkgKiAxMDAwMDAwMCk7XG4gICAgICAvLyBjb25zdCBudW0gPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCk7O1xuICAgICAgY29uc3QgbnVtID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvXFxkL2dtLCAnJykuc3Vic3RyaW5nKDEsIDgpXG4gICAgICByZXR1cm4gbnVtKClcbiAgICAgIC8vIHJldHVybiBgdnNpZC0ke251bSgpfWA7XG4gICAgfSxcbiAgICBzZXRUcmFjZUZ1bmM6IGZ1bmN0aW9uKGRlYnVnKSB7XG4gICAgICByZXR1cm4gZGVidWcgPT09IHRydWVcbiAgICAgICAgPyBjb25zb2xlLmxvZ1xuICAgICAgICA6ICgpID0+IHtcbiAgICAgICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWaWV3U3RyZWFtUGF5bG9hZCB9IGZyb20gJy4uLy4uL3ZpZXdzL3ZpZXctc3RyZWFtLXBheWxvYWQuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlU3RyZWFtc01peGlucygpIHtcbiAgcmV0dXJuIHtcbiAgICB0ZXN0RnVuYzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICBjb25zb2xlLmxvZygnc3RyZWFtIG1peGluIGlzICcsIHN0cilcbiAgICB9LFxuICAgIHNlbmRSb3V0ZVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgLyoqIFRPRE86IEFERCBBIENIRUNLIEZPUiBFTkQgUk9VVEUgQU5EIFRSQU5TRk9STSBUTyBFTVBUWSAqL1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnQ0hBTk5FTF9ST1VURScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpXG4gICAgfSxcbiAgICBzZW5kVUlQYXlsb2FkOiBmdW5jdGlvbihvYnMsIGRhdGEpIHtcbiAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoJ0NIQU5ORUxfVUknLCBvYnMsIGRhdGEsICdzdWJzY3JpYmUnKVxuICAgIH1cbiAgICAvKlxuICAgIHNlbmRJbmZvVG9DaGFubmVsOiBmdW5jdGlvbihjaGFubmVsTmFtZSwgcGF5bG9hZCkge1xuICAgICAgY29uc3QgZ2V0UHJvcCA9IHN0ciA9PiBwcm9wKHN0ciwgdGhpcy5wcm9wcyk7XG4gICAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbE5hbWU7XG4gICAgICBsZXQgc3JjRWxlbWVudCA9IHtcbiAgICAgICAgdnNpZDogZ2V0UHJvcCgndnNpZCcpLFxuICAgICAgICBlbDogZ2V0UHJvcCgnZWwnKSxcbiAgICAgICAgdmlld05hbWU6IGdldFByb3AoJ25hbWUnKVxuICAgICAgfTtcbiAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICBwYXlsb2FkLCBjaGFubmVsLCBzcmNFbGVtZW50XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZChjaGFubmVsTmFtZSwgbmV3IG9mKCcnKSwgZGF0YSxcbiAgICAgICAgJ3N1YnNjcmliZScpO1xuICAgIH0sXG4gICAgKi9cbiAgICAvKiAgICBzZW5kTGlmZVN0cmVhbVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnTElGRVNUUkVBTScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpO1xuICAgIH0sXG5cbiAgICBjcmVhdGVMaWZlU3RyZWFtUGF5bG9hZDogZnVuY3Rpb24oU1RFUCwgZGF0YSA9IHt9LCB0eXBlID0gJ3BhcmVudCcpIHtcbiAgICAgIGxldCB2aWV3SWQgPSBgJHt0aGlzLnByb3BzLm5hbWV9OiAke3RoaXMucHJvcHMudnNpZH1gO1xuICAgICAgcmV0dXJuIG5ldyBMaWZlc3RyZWFtUGF5bG9hZCgnTElGRVNUUkVBTScsIFNURVAsIHR5cGUsIHZpZXdJZCwgZGF0YSkuZGF0YTtcbiAgICB9ICovXG4gIH1cbn1cbiIsImltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuLi92aWV3cy92aWV3LXN0cmVhbS5qcydcbmltcG9ydCB7IGN1cnJ5IH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgUm91dGVDaGFubmVsVXBkYXRlciB7XG4gIGNvbnN0cnVjdG9yKGN4dCkge1xuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcoY3h0LnByb3BzLm5hbWUpXG4gICAgY29uc3QgaWQgPSBgJHtuYW1lfV9ST1VURV9VUERBVEVSYFxuXG4gICAgY29uc3Qgc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSA9IGN1cnJ5KFJvdXRlQ2hhbm5lbFVwZGF0ZXIuY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iailcbiAgICByZXR1cm4gc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSh7IGlkLCBuYW1lIH0pXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iaihwcm9wcywgZGF0YSkge1xuICAgIGNvbnN0IHsgbmFtZSwgaWQgfSAgPSBwcm9wc1xuICAgIGNvbnN0IHBheWxvYWQgPSBkYXRhXG4gICAgY29uc3QgdnMgPSBuZXcgVmlld1N0cmVhbSh7XG4gICAgICBpZCwgbmFtZSwgZGF0YVxuICAgIH0pXG5cbiAgICB2cy5vblJlbmRlcmVkID0gKCkgPT4ge1xuICAgICAgdnMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfUk9VVEUnLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIHZzLmFmdGVyQnJvYWRjYXN0RXZlbnRzID0gKCkgPT4ge1xuICAgICAgdnMuZGlzcG9zZVZpZXdTdHJlYW0oKVxuICAgIH1cblxuICAgIHZzLmFwcGVuZFRvTnVsbCgpXG4gIH1cbn1cbiIsImltcG9ydCB7IGNsb25lLCBjb21wb3NlLCBmcm9tUGFpcnMsIGlzLCBwYXRoLCB0b1BhaXJzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5jb25zdCBnZXRQcm9wVHlwZSA9IChwcnApID0+IHtcbiAgbGV0IHR5cGUgPSB0eXBlb2YgcHJwXG4gIGlmIChbJ251bWJlcicsICdib29sZWFuJywgJ3N0cmluZyddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgdHlwZSA9ICdwcmltaXRpdmUnXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcnApKSB7XG4gICAgICB0eXBlID0gJ2FycmF5J1xuICAgIH0gZWxzZSBpZiAocHJwID09PSBudWxsKSB7XG4gICAgICB0eXBlID0gJ3VuZGVmaW5lZCdcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHR5cGVcbn1cblxuY29uc3QgY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqID0gKHByb3h5T2JqID0ge30sIHByb3h5UmV2aXZlck1ldGhvZCkgPT4ge1xuICBjb25zdCB7IF9fcHJveHlfX3Byb3h5TmFtZSB9ID0gcHJveHlPYmpcblxuICBpZiAoX19wcm94eV9fcHJveHlOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKCdvYmplY3QgaXMgbm90IHByb3h5IG9iamVjdCAnLCBwcm94eU9iailcbiAgfVxuXG4gIGNvbnN0IGNsb25lTmVzdGVkUHJveHlPYmogPSAodGFyZ2V0LCBwYXRoQXJyKSA9PiB7XG4gICAgY29uc3QgbmVzdGVkUHJveHlPYmogPSBwYXRoKHBhdGhBcnIsIHByb3h5T2JqKVxuICAgIGNvbnN0IHsgX19wcm94eV9faXNQcm94eSwgX19wcm94eV9fcHJvcHMgfSA9IG5lc3RlZFByb3h5T2JqXG4gICAgcmV0dXJuIF9fcHJveHlfX2lzUHJveHkgPyBwcm94eVJldml2ZXJNZXRob2QodGFyZ2V0LCBfX3Byb3h5X19wcm9wcykgOiB0YXJnZXRcbiAgfVxuXG4gIGNvbnN0IHJvb3RPYmogPSBjbG9uZU5lc3RlZFByb3h5T2JqKGNsb25lKHByb3h5T2JqKSwgW10pXG5cbiAgY29uc3QgcHJveHlJdGVyYWJsZSA9IChpdGVyT2JqLCBpdGVyUGF0aCkgPT4ge1xuICAgIGNvbnN0IGRhdGFQYXRoID0gaXRlclBhdGggfHwgW11cbiAgICBjb25zdCBsb29wT2JqID0gKFtrZXksIHByb3BdKSA9PiB7XG4gICAgICBjb25zdCB0eXBlID0gZ2V0UHJvcFR5cGUocHJvcClcbiAgICAgIGNvbnN0IGNsb25lZFBhdGggPSBbLi4uZGF0YVBhdGhdXG4gICAgICBjbG9uZWRQYXRoLnB1c2goa2V5KVxuICAgICAgaWYgKHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgaXRlck9ialtrZXldID0gY2xvbmVOZXN0ZWRQcm94eU9iaihwcm9wLCBjbG9uZWRQYXRoKVxuICAgICAgICBwcm94eUl0ZXJhYmxlKHByb3AsIGNsb25lZFBhdGgpXG4gICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5lbnRyaWVzKGl0ZXJPYmopLmZvckVhY2gobG9vcE9iailcbiAgfVxuXG4gIHByb3h5SXRlcmFibGUocm9vdE9iailcbiAgLy8gY29uc29sZS50aW1lRW5kKCdwcm94aWZ5MicpO1xuXG4gIHJldHVybiByb290T2JqXG59XG5cbmNvbnN0IHJldml2ZUlmUHJveHkgPSAobyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgX19wcm94eV9fcHJveHlOYW1lIH0gPSBvXG4gIGlmIChfX3Byb3h5X19wcm94eU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHByb3h5UmV2aXZlck1ldGhvZCA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRQcm94eVJldml2ZXIoX19wcm94eV9fcHJveHlOYW1lKVxuICAgIGlmICh0eXBlb2YgcHJveHlSZXZpdmVyTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqKG8sIHByb3h5UmV2aXZlck1ldGhvZClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqXG4gKiBEZWVwLCBwcm94eS1wcmVzZXJ2aW5nIGNsb25lLiBVbmxpa2Ugc2FmZUNsb25lIOKAlCB3aGljaCBvbmx5IHJldml2ZXMgd2hlbiB0aGVcbiAqIFJPT1Qgb2JqZWN0IGlzIGEgcHJveHkg4oCUIHRoaXMgd2Fsa3MgcGxhaW4gY29udGFpbmVycyAob2JqZWN0cyBhbmQgYXJyYXlzKVxuICogYW5kIHJldml2ZXMgYW55IG5lc3RlZCBwcm94eSBpdCBmaW5kcywgc28gd3JhcHBlcnMgdGhhdCBob2xkIHByb3hpZWQgZGF0YVxuICogKGUuZy4gY2hhbm5lbCBwYXlsb2FkcywgcGFnZURhdGEgY29udGFpbmVycykgc3Vydml2ZSBjbG9uaW5nIGludGFjdC5cbiAqIEZ1bmN0aW9ucyBhcmUgcGFzc2VkIHRocm91Z2ggYnkgcmVmZXJlbmNlOyBjeWNsZXMgYXJlIGd1YXJkZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9cbiAqIEByZXR1cm5zIEEgd3JpdGFibGUgY29weSBpbiB3aGljaCBldmVyeSBuZXN0ZWQgcHJveHkgaGFzIGJlZW4gcmV2aXZlZFxuICovXG5leHBvcnQgY29uc3Qgc2FmZUNsb25lRGVlcCA9IGZ1bmN0aW9uKG8sIHNlZW4gPSBuZXcgV2Vha1NldCgpKSB7XG4gIGlmIChvID09PSBudWxsIHx8IHR5cGVvZiBvICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvXG4gIH1cblxuICBjb25zdCByZXZpdmVkID0gcmV2aXZlSWZQcm94eShvKVxuICBpZiAocmV2aXZlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJldml2ZWRcbiAgfVxuXG4gIGlmIChzZWVuLmhhcyhvKSkge1xuICAgIHJldHVybiBvXG4gIH1cbiAgc2Vlbi5hZGQobylcblxuICBpZiAoQXJyYXkuaXNBcnJheShvKSkge1xuICAgIHJldHVybiBvLm1hcChpdGVtID0+IHNhZmVDbG9uZURlZXAoaXRlbSwgc2VlbikpXG4gIH1cblxuICBjb25zdCBvdXQgPSB7fVxuICBPYmplY3QuZW50cmllcyhvKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgb3V0W2tleV0gPSBzYWZlQ2xvbmVEZWVwKHZhbCwgc2VlbilcbiAgfSlcbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIFJlLXdyYXBzIGEgZGVyaXZlZCBhcnJheSB3aXRoIHRoZSBTT1VSQ0UgYXJyYXkncyBwcm94eSBtZXRhZGF0YSB2aWEgdGhlXG4gKiByZWdpc3RlcmVkIHJldml2ZXIuIE5hdGl2ZSBmaWx0ZXIvcmVqZWN0L21hcCBrZWVwIGVsZW1lbnQgaWRlbnRpdHkgYnV0XG4gKiByZXR1cm4gYSBwbGFpbiBhcnJheSDigJQgbG9zaW5nIHRoZSBhcnJheS1sZXZlbCBwcm94eSB0aGF0IHN0cmluZy1pdGVtXG4gKiB0ZW1wbGF0ZSBsb29wcyAoZS5nLiB7eyN0aXRsZXN9fSkgcmVseSBvbiBmb3IgX19jbXNfX2RhdGFJZCAvIGtleUZvclxuICogbG9va3Vwcy4gSW4gcHJvZHVjdGlvbiAobm8gcHJveGllcykgdGhpcyBpcyBhIHNpbmdsZSB1bmRlZmluZWQgY2hlY2suXG4gKlxuICogTm90ZTogdGhlIHJldml2ZXIgcmVidWlsZHMgaXRzIGtleS92YWx1ZSBtYXAgZnJvbSB0aGUgZGVyaXZlZCBjb250ZW50cywgc29cbiAqIHZhbHVlLWtleWVkIGxvb2t1cHMgc3Vydml2ZSB3aGlsZSBvcmlnaW5hbCBpbmRleCBwb3NpdGlvbnMgc2hpZnQuXG4gKi9cbmNvbnN0IHJld3JhcEFycmF5RnJvbVNvdXJjZSA9IChzb3VyY2VBcnIsIHJlc3VsdEFycikgPT4ge1xuICBjb25zdCBwcm94eU5hbWUgPSBzb3VyY2VBcnI/Ll9fcHJveHlfX3Byb3h5TmFtZVxuICBpZiAocHJveHlOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVzdWx0QXJyXG4gIH1cbiAgY29uc3QgcHJveHlSZXZpdmVyTWV0aG9kID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldFByb3h5UmV2aXZlcihwcm94eU5hbWUpXG4gIGlmICh0eXBlb2YgcHJveHlSZXZpdmVyTWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHJlc3VsdEFyclxuICB9XG4gIHJldHVybiBwcm94eVJldml2ZXJNZXRob2QocmVzdWx0QXJyLCBzb3VyY2VBcnIuX19wcm94eV9fcHJvcHMpXG59XG5cbi8qKlxuICpcbiAqIFByb3h5LXByZXNlcnZpbmcgQXJyYXkucHJvdG90eXBlLmZpbHRlcjogZWxlbWVudHMga2VlcCB0aGVpciBpZGVudGl0eVxuICogKG5hdGl2ZSBiZWhhdmlvcikgQU5EIHRoZSByZXR1cm5lZCBhcnJheSBrZWVwcyB0aGUgc291cmNlIGFycmF5J3MgcHJveHlcbiAqIG1ldGFkYXRhLiBVc2UgaW4gcGxhY2Ugb2YgcmFtZGEgZmlsdGVyIC8gYXJyLmZpbHRlciBvbiBDTVMgZGF0YS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNhZmVGaWx0ZXIgPSBmdW5jdGlvbihhcnIsIHByZWRpY2F0ZSkge1xuICByZXR1cm4gcmV3cmFwQXJyYXlGcm9tU291cmNlKGFyciwgYXJyLmZpbHRlcihwcmVkaWNhdGUpKVxufVxuXG4vKipcbiAqXG4gKiBQcm94eS1wcmVzZXJ2aW5nIHJlamVjdCDigJQgaW52ZXJzZSBvZiBzYWZlRmlsdGVyLlxuICovXG5leHBvcnQgY29uc3Qgc2FmZVJlamVjdCA9IGZ1bmN0aW9uKGFyciwgcHJlZGljYXRlKSB7XG4gIHJldHVybiByZXdyYXBBcnJheUZyb21Tb3VyY2UoYXJyLCBhcnIuZmlsdGVyKChpdGVtLCBpKSA9PiBwcmVkaWNhdGUoaXRlbSwgaSkgPT09IGZhbHNlKSlcbn1cblxuLyoqXG4gKlxuICogUHJveHktcHJlc2VydmluZyBBcnJheS5wcm90b3R5cGUubWFwIHdpdGggYW4gYXVnbWVudC1pbi1wbGFjZSBjb250cmFjdDpcbiAqIHByb3hpZWQgZWxlbWVudHMgYXJyaXZlIGluIHRoZSBjYWxsYmFjayBhcyBXUklUQUJMRSByZXZpdmVkIGNvcGllcywgc29cbiAqIGBzYWZlTWFwKHN0b3JpZXMsIHMgPT4geyBzLnR5cGUgPSAnc3RvcnknOyByZXR1cm4gczsgfSlgIGlzIHNhZmUgYnlcbiAqIGNvbnN0cnVjdGlvbiAobm8gc2lsZW50IGxpdmUtcHJveHkgd3JpdGUgdHJhcHMpLiBQbGFpbiBlbGVtZW50cyBwYXNzIGJ5XG4gKiByZWZlcmVuY2UgZXhhY3RseSBsaWtlIG5hdGl2ZSBtYXAsIHNvIHByb2R1Y3Rpb24gY29zdCBtYXRjaGVzIG5hdGl2ZS5cbiAqIEEgY2FsbGJhY2sgdGhhdCBidWlsZHMgYW4gZW50aXJlbHkgbmV3IG9iamVjdCBwZXIgZWxlbWVudCBzdGlsbCBzdHJpcHNcbiAqIHRoYXQgZWxlbWVudCdzIGlkZW50aXR5IOKAlCB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gcHJlc2VydmUuXG4gKi9cbmV4cG9ydCBjb25zdCBzYWZlTWFwID0gZnVuY3Rpb24oYXJyLCBtYXBGbikge1xuICBjb25zdCByZXN1bHQgPSBhcnIubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgY29uc3QgaXNQcm94aWVkID0gaXRlbSAhPT0gbnVsbCAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbS5fX3Byb3h5X19wcm94eU5hbWUgIT09IHVuZGVmaW5lZFxuICAgIHJldHVybiBtYXBGbihpc1Byb3hpZWQgPyBzYWZlQ2xvbmVEZWVwKGl0ZW0pIDogaXRlbSwgaSlcbiAgfSlcbiAgcmV0dXJuIHJld3JhcEFycmF5RnJvbVNvdXJjZShhcnIsIHJlc3VsdClcbn1cblxuLyoqXG4gKlxuICogUmV2aXZlLXRoZW4tYXVnbWVudC4gTGl2ZSBDTVMgcHJveGllcyBzaWxlbnRseSBpZ25vcmUgd3JpdGVzIG9mIG5ldyBrZXlzLFxuICogc28gcHJvcGVydGllcyBjYW5ub3QgYmUgYXR0YWNoZWQgdG8gdGhlbSBkaXJlY3RseS4gVGhpcyByZXR1cm5zIGEgd3JpdGFibGUsXG4gKiBwcm94eS1wcmVzZXJ2ZWQgY29weSBvZiBvIHdpdGggdGhlIGdpdmVuIHByb3BzIGFwcGxpZWQg4oCUIHRoZSBzYW5jdGlvbmVkIHdheVxuICogdG8gYWRkIHZpZXcgb3Igcm91dGUgcHJvcGVydGllcyB0byBDTVMtcHJveGllZCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHNPYmogcHJvcGVydGllcyB0byBhc3NpZ24gb250byB0aGUgcmV2aXZlZCBjb3B5XG4gKiBAcmV0dXJucyBBIHdyaXRhYmxlIHByb3h5LXByZXNlcnZlZCBjb3B5IGNhcnJ5aW5nIHRoZSBleHRyYSBwcm9wc1xuICovXG5leHBvcnQgY29uc3Qgc2FmZUF1Z21lbnQgPSBmdW5jdGlvbihvLCBwcm9wc09iaiA9IHt9KSB7XG4gIGNvbnN0IHRhcmdldCA9IHNhZmVDbG9uZURlZXAobylcbiAgT2JqZWN0LmVudHJpZXMocHJvcHNPYmopLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICB0YXJnZXRba2V5XSA9IHZhbFxuICB9KVxuICByZXR1cm4gdGFyZ2V0XG59XG5cbmV4cG9ydCBjb25zdCBzYWZlQ2xvbmUgPSBmdW5jdGlvbihvLCBkZWVwID0gZmFsc2UpIHtcbiAgY29uc3QgcmV2aXZlZCA9IHJldml2ZUlmUHJveHkobylcbiAgaWYgKHJldml2ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZXZpdmVkXG4gIH1cblxuICBpZiAoZGVlcCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBzYWZlQ2xvbmVEZWVwKG8pXG4gIH1cblxuICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICBjb25zdCBpc09iaiA9IGlzKE9iamVjdClcbiAgY29uc3QgaXNJdGVyID0gb2IgPT4gaXNBcnIob2IpID09PSBmYWxzZSAmJiBpc09iaihvYikgPT09IHRydWVcbiAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICByZXR1cm4gaXNJdGVyYWJsZSA/IGNvbXBvc2UoZnJvbVBhaXJzLCB0b1BhaXJzLCBjbG9uZSkobykgOiBjbG9uZShvKVxufVxuIiwiLy8gc3JjL3V0aWxzL3Nhbml0aXplLWRhdGEuanNcbmltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5J1xuaW1wb3J0IHsgc3B5bmVXYXJuIH0gZnJvbSAnLi9zcHluZS13YXJuLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxubGV0IF9zYW5pdGl6ZURhdGFcbmxldCBpc0NvbmZpZ3VyZWQgPSBmYWxzZVxubGV0IGdsb2JhbERpc2FibGUgPSBmYWxzZVxubGV0IGZvcmNlU3RyaWN0ID0gZmFsc2UgLy8gZGVwcmVjYXRlZCBsZWdhY3kgdG9nZ2xlLCBzZWUgc2V0U2FuaXRpemVEYXRhRm9yY2VTdHJpY3RcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBVUkkgcG9saWN5XG4gKlxuICogQWxsb3dzIGh0dHBzPywgbWFpbHRvOiwgdGVsOiwgZGF0YTppbWFnZS8gYW5kIGFueSBzY2hlbWUtbGVzc1xuICogKHJlbGF0aXZlLCBmcmFnbWVudCwgcXVlcnksIHByb3RvY29sLXJlbGF0aXZlKSBVUkwuXG4gKiBBbGwgb3RoZXIgc2NoZW1lcyAoamF2YXNjcmlwdDosIHZic2NyaXB0OiwgZGF0YTp0ZXh0L2h0bWwsIGV0Yy4pIGZhaWwuXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBTQUZFX1VSSV9SRUdFWFAgPSAvXig/Oig/Omh0dHBzP3xtYWlsdG98dGVsKTp8ZGF0YTppbWFnZVxcL3woPyFbYS16XVthLXowLTkrLi1dKjopW1xcc1xcU10qJCkvaVxuXG4vLyBCcm93c2VycyBzdHJpcCBBU0NJSSBjb250cm9sIGNoYXJhY3RlcnMgYW5kIHdoaXRlc3BhY2Ugd2hlbiBwYXJzaW5nIFVSTFxuLy8gc2NoZW1lcywgc28gXCJqYXZcXHRhc2NyaXB0OlwiIGV4ZWN1dGVzLiBOb3JtYWxpemUgYmVmb3JlIHRlc3RpbmcuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBtYXRjaGluZyBjb250cm9sIGNoYXJzIGlzIHRoZSBwb2ludFxuY29uc3Qgbm9ybWFsaXplVXJpRm9yQ2hlY2sgPSAodmFsKSA9PiBTdHJpbmcodmFsKS5yZXBsYWNlKC9bXFx1MDAwMC1cXHUwMDIwXS9nLCAnJylcblxuY29uc3QgaXNTYWZlVXJpID0gKHZhbCkgPT4gU0FGRV9VUklfUkVHRVhQLnRlc3Qobm9ybWFsaXplVXJpRm9yQ2hlY2sodmFsKSlcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDdXN0b20gZWxlbWVudHNcbiAqXG4gKiBUaGUgZnJhbWV3b3JrJ3Mgb3duIGN1c3RvbSBlbGVtZW50cyAoc3B5bmUtKikgYXJlIGZpcnN0LXBhcnR5IG91dHB1dCDigJRcbiAqIHRoZSBDTVMgcHJveHkgd3JhcHMgZWRpdGFibGUgY29udGVudCBpbiA8c3B5bmUtY21zLWl0ZW0+IGV0Yy4g4oCUIGFuZCBhcmVcbiAqIGFkbWl0dGVkIGluIGV2ZXJ5IG1vZGUuIFRoZXkgYXJlIGluZXJ0IHdpdGhvdXQgdGhlaXIgZGVmaW5pbmcgcGx1Z2luXG4gKiBhbmQgdGhlIGF0dHJpYnV0ZSBjaGVjayBiZWxvdyBvbmx5IGFkbWl0cyBkYXRhLSogb24gdGhlbS5cbiAqXG4gKiBBZGRpdGlvbmFsIGVsZW1lbnRzIHJlZ2lzdGVyIHZpYSBhbGxvd0N1c3RvbUVsZW1lbnRzKCkgKGFkZGl0aXZlIG9ubHk7XG4gKiBuYW1lcyBtdXN0IGNvbnRhaW4gYSBoeXBoZW4gcGVyIHRoZSBjdXN0b20tZWxlbWVudCBzcGVjLCBzbyBidWlsdC1pblxuICogdGFncyBsaWtlIHNjcmlwdCBvciBpZnJhbWUgY2FuIG5ldmVyIGJlIGFkbWl0dGVkIHRocm91Z2ggdGhpcyBwYXRoKVxuICogb3IgdmlhIGNvbmZpZy5jdXN0b21FbGVtZW50cyBhdCBTcHluZUFwcC5pbml0LlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgU1BZTkVfQ1VTVE9NX0VMRU1FTlRfUkUgPSAvXnNweW5lLVthLXpdW2EtejAtOS1dKiQvaVxuXG5jb25zdCBhbGxvd2VkQ3VzdG9tRWxlbWVudFBhdHRlcm5zID0gW11cblxuY29uc3QgYWxsb3dDdXN0b21FbGVtZW50cyA9IChlbGVtZW50cyA9IFtdKSA9PiB7XG4gIGNvbnN0IGFyciA9IEFycmF5LmlzQXJyYXkoZWxlbWVudHMpID8gZWxlbWVudHMgOiBbZWxlbWVudHNdXG5cbiAgYXJyLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgaWYgKGVudHJ5IGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICBhbGxvd2VkQ3VzdG9tRWxlbWVudFBhdHRlcm5zLnB1c2goZW50cnkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBuYW1lID0gU3RyaW5nKGVudHJ5KS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKC9eW2Etel1bYS16MC05XSotW2EtejAtOS1dKyQvLnRlc3QobmFtZSkgIT09IHRydWUpIHtcbiAgICAgIHNweW5lV2FybihgU1BZTkUgV0FSTklORzogXCIke2VudHJ5fVwiIGlzIG5vdCBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUgKGEgaHlwaGVuIGlzIHJlcXVpcmVkKSBhbmQgd2FzIG5vdCBhZGRlZCB0byB0aGUgc2FuaXRpemVyIGFsbG93bGlzdC5gKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYWxsb3dlZEN1c3RvbUVsZW1lbnRQYXR0ZXJucy5wdXNoKG5hbWUpXG4gIH0pXG59XG5cbmNvbnN0IGN1c3RvbUVsZW1lbnRUYWdDaGVjayA9ICh0YWdOYW1lKSA9PiB7XG4gIGlmIChTUFlORV9DVVNUT01fRUxFTUVOVF9SRS50ZXN0KHRhZ05hbWUpKSByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBhbGxvd2VkQ3VzdG9tRWxlbWVudFBhdHRlcm5zLnNvbWUocCA9PlxuICAgIHAgaW5zdGFuY2VvZiBSZWdFeHAgPyBwLnRlc3QodGFnTmFtZSkgOiBwID09PSB0YWdOYW1lXG4gIClcbn1cblxuY29uc3QgQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcgPSB7XG4gIHRhZ05hbWVDaGVjazogY3VzdG9tRWxlbWVudFRhZ0NoZWNrLFxuICBhdHRyaWJ1dGVOYW1lQ2hlY2s6IC9eZGF0YS1bYS16MC05LV0rJC9pLFxuICBhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHM6IGZhbHNlXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogTW9kZSBjb25maWd1cmF0aW9uc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgU0FGRV9GT1JfUklDSF9URVhUID0ge1xuICBBTExPV0VEX1RBR1M6IFtcbiAgICAnYScsICdiJywgJ2knLCAnZW0nLCAnc3Ryb25nJywgJ3UnLCAncCcsICdicicsICd1bCcsICdkbCcsICdkdCcsICdkZCcsICdvbCcsICdsaScsICdocicsXG4gICAgJ2Jsb2NrcXVvdGUnLCAncHJlJywgJ2NvZGUnLCAnc3BhbicsICdkaXYnLCAnc2VjdGlvbicsICdhcnRpY2xlJywgJ2FzaWRlJyxcbiAgICAnaGVhZGVyJywgJ2Zvb3RlcicsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsXG4gICAgJ3RhYmxlJywgJ3RoZWFkJywgJ3Rib2R5JywgJ3RyJywgJ3RkJywgJ3RoJywgJ2ltZycsICdmaWd1cmUnLCAnZmlnY2FwdGlvbicsXG4gICAgJ3ZpZGVvJywgJ3NvdXJjZScsICdpZnJhbWUnLCAnaW5wdXQnLCAnYnV0dG9uJywgJ2xhYmVsJywgJ2xpbmsnXG4gIF0sXG4gIEFERF9UQUdTOiBbJ2lmcmFtZScsICdpbnB1dCcsICdidXR0b24nLCAnbGluayddLFxuICBBTExPV0VEX0FUVFI6IFtcbiAgICAnaHJlZicsICdzcmMnLCAnYWx0JywgJ2NsYXNzJywgJ3RpdGxlJywgJ3dpZHRoJywgJ2hlaWdodCcsICdzdHlsZScsICd0YXJnZXQnLCAncmVsJyxcbiAgICAnY29udHJvbHMnLCAncG9zdGVyJywgJ3R5cGUnLCAncm93cycsICdjb2xzJywgJ3NhbmRib3gnXG4gIF0sXG4gIEFMTE9XX0RBVEFfQVRUUjogdHJ1ZSxcbiAgRk9SQklEX0FUVFI6IFsnb25lcnJvcicsICdvbmxvYWQnLCAnb25jbGljaycsICdvbm1vdXNlb3ZlcicsICdvbmZvY3VzJywgJ29uYmx1cicsICdvbmNoYW5nZSddLFxuICBGT1JCSURfVEFHUzogWydzY3JpcHQnLCAnb2JqZWN0JywgJ2VtYmVkJywgJ21ldGEnXSxcbiAgQUxMT1dFRF9VUklfUkVHRVhQOiBTQUZFX1VSSV9SRUdFWFAsXG4gIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HXG59XG5cbmNvbnN0IFNBRkVfRk9SX0FQUCA9IHtcbiAgRk9SQklEX1RBR1M6IFsnc2NyaXB0JywgJ2lmcmFtZScsICdvYmplY3QnLCAnZW1iZWQnLCAnZm9ybScsICdpbnB1dCcsICdidXR0b24nLCAnbGluaycsICdtZXRhJ10sXG4gIEZPUkJJRF9BVFRSOiBbJ29uZXJyb3InLCAnb25sb2FkJywgJ29uY2xpY2snLCAnb25tb3VzZW92ZXInLCAnb25mb2N1cycsICdvbmJsdXInLCAnb25jaGFuZ2UnXSxcbiAgQUxMT1dfREFUQV9BVFRSOiBmYWxzZSxcbiAgQUxMT1dFRF9VUklfUkVHRVhQOiBTQUZFX1VSSV9SRUdFWFAsXG4gIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogSWZyYW1lIHBvbGljeVxuICpcbiAqIENvbmZpZ3VyZWQgdmlhIGNvbmZpZy5pZnJhbWVzIGF0IFNweW5lQXBwLmluaXQ6XG4gKiAgIGFsbG93ICAgICAgICAgIOKAlCB1bmRlZmluZWQgKG1vZGUgZGVmYXVsdDogcmljaHRleHQgeWVzLCBhcHAgbm8pIHwgdHJ1ZSB8IGZhbHNlXG4gKiAgIGFsbG93ZWRPcmlnaW5zIOKAlCBbXSAoYW55IGh0dHBzIG9yaWdpbikgfCBbJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tJywgLi4uXVxuICogICBzYW5kYm94ICAgICAgICDigJQgc2FuZGJveCB2YWx1ZSBmb3JjZWQgb250byBpZnJhbWVzIGxhY2tpbmcgb25lOyBmYWxzZSA9IG5ldmVyIGZvcmNlXG4gKlxuICogQSBwZXItY2FsbCBvdmVycmlkZSBjYW4gYmUgcGFzc2VkIGFzIG9wdHMuaWZyYW1lcyB0byBzYW5pdGl6ZURhdGEuXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBERUZBVUxUX0lGUkFNRV9TQU5EQk9YID0gJ2FsbG93LXNjcmlwdHMgYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctcG9wdXBzJ1xuXG5sZXQgY29uZmlndXJlZElmcmFtZVBvbGljeSA9IHsgYWxsb3c6IHVuZGVmaW5lZCwgYWxsb3dlZE9yaWdpbnM6IFtdLCBzYW5kYm94OiBERUZBVUxUX0lGUkFNRV9TQU5EQk9YIH1cbmxldCBhY3RpdmVJZnJhbWVQb2xpY3kgPSBjb25maWd1cmVkSWZyYW1lUG9saWN5XG5cbmNvbnN0IHJlc29sdmVJZnJhbWVQb2xpY3kgPSAob3ZlcnJpZGUpID0+IHtcbiAgaWYgKCFvdmVycmlkZSkgcmV0dXJuIGNvbmZpZ3VyZWRJZnJhbWVQb2xpY3lcbiAgcmV0dXJuIHtcbiAgICBhbGxvdzogb3ZlcnJpZGUuYWxsb3cgIT09IHVuZGVmaW5lZCA/IG92ZXJyaWRlLmFsbG93IDogY29uZmlndXJlZElmcmFtZVBvbGljeS5hbGxvdyxcbiAgICBhbGxvd2VkT3JpZ2luczogb3ZlcnJpZGUuYWxsb3dlZE9yaWdpbnMgIT09IHVuZGVmaW5lZCA/IG92ZXJyaWRlLmFsbG93ZWRPcmlnaW5zIDogY29uZmlndXJlZElmcmFtZVBvbGljeS5hbGxvd2VkT3JpZ2lucyxcbiAgICBzYW5kYm94OiBvdmVycmlkZS5zYW5kYm94ICE9PSB1bmRlZmluZWQgPyBvdmVycmlkZS5zYW5kYm94IDogY29uZmlndXJlZElmcmFtZVBvbGljeS5zYW5kYm94XG4gIH1cbn1cblxuY29uc3QgaWZyYW1lQWxsb3dlZEZvck1vZGUgPSAobW9kZSwgcG9saWN5ID0gYWN0aXZlSWZyYW1lUG9saWN5KSA9PiB7XG4gIGlmIChwb2xpY3kuYWxsb3cgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG1vZGUgPT09ICdyaWNodGV4dCdcbiAgcmV0dXJuIHBvbGljeS5hbGxvdyA9PT0gdHJ1ZVxufVxuXG4vLyBsb2NhbGhvc3QgaXMgYSBzZWN1cmUgY29udGV4dCBwZXIgdGhlIHBsYXRmb3JtJ3Mgb3duIGRlZmluaXRpb24uXG5jb25zdCBpc1RydXN0d29ydGh5TG9jYWxIb3N0bmFtZSA9IChob3N0bmFtZSkgPT5cbiAgaG9zdG5hbWUgPT09ICdsb2NhbGhvc3QnIHx8XG4gIGhvc3RuYW1lID09PSAnMTI3LjAuMC4xJyB8fFxuICBob3N0bmFtZSA9PT0gJ1s6OjFdJyB8fFxuICBob3N0bmFtZS5lbmRzV2l0aCgnLmxvY2FsaG9zdCcpXG5cbmNvbnN0IGlzQWxsb3dlZElmcmFtZVNyYyA9IChzcmMsIHBvbGljeSA9IGFjdGl2ZUlmcmFtZVBvbGljeSkgPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplVXJpRm9yQ2hlY2soc3JjKVxuXG4gIGxldCByZXNvbHZlZFxuICB0cnkge1xuICAgIHJlc29sdmVkID0gbmV3IFVSTChub3JtYWxpemVkLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gRXhlY3V0YWJsZS9wc2V1ZG8gc2NoZW1lcyAoamF2YXNjcmlwdDosIGRhdGE6LCB2YnNjcmlwdDopIHJlc29sdmUgd2l0aFxuICAvLyBhbiBvcGFxdWUgJ251bGwnIG9yaWdpbiBhbmQgZmFpbCBib3RoIGNoZWNrcyBiZWxvdy5cblxuICAvLyBTYW1lLW9yaWdpbiBlbWJlZHMgKGluY2x1ZGluZyByZWxhdGl2ZSBzcmMpIGFyZSBhcyB0cnVzdGVkIGFzIHRoZVxuICAvLyBwYWdlIGl0c2VsZiBhbmQgYWx3YXlzIHBhc3MsIHJlZ2FyZGxlc3Mgb2Ygc2NoZW1lIG9yIGFsbG93bGlzdC5cbiAgaWYgKHJlc29sdmVkLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiAmJiByZXNvbHZlZC5vcmlnaW4gIT09ICdudWxsJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBDcm9zcy1vcmlnaW4gZW1iZWRzIG11c3QgYmUgaHR0cHMsIG9yIGh0dHAgb24gYSBsb2NhbGhvc3QgaG9zdFxuICAvLyAoYSBzZWN1cmUgY29udGV4dCkgdG8ga2VlcCBsb2NhbCBkZXZlbG9wbWVudCBmcmljdGlvbi1mcmVlLlxuICBjb25zdCBpc1NlY3VyZSA9IHJlc29sdmVkLnByb3RvY29sID09PSAnaHR0cHM6JyB8fFxuICAgIChyZXNvbHZlZC5wcm90b2NvbCA9PT0gJ2h0dHA6JyAmJiBpc1RydXN0d29ydGh5TG9jYWxIb3N0bmFtZShyZXNvbHZlZC5ob3N0bmFtZSkpXG5cbiAgaWYgKGlzU2VjdXJlICE9PSB0cnVlKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBvcmlnaW5zID0gcG9saWN5LmFsbG93ZWRPcmlnaW5zXG4gIGlmICghQXJyYXkuaXNBcnJheShvcmlnaW5zKSB8fCBvcmlnaW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWVcblxuICByZXR1cm4gb3JpZ2lucy5zb21lKG8gPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IFVSTChvKS5vcmlnaW4gPT09IHJlc29sdmVkLm9yaWdpblxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSlcbn1cblxubGV0IGlmcmFtZUhvb2tBZGRlZCA9IGZhbHNlXG5jb25zdCBhZGRJZnJhbWVIYXJkZW5pbmdIb29rID0gKCkgPT4ge1xuICBpZiAoaWZyYW1lSG9va0FkZGVkKSByZXR1cm5cbiAgaWZyYW1lSG9va0FkZGVkID0gdHJ1ZVxuXG4gIERPTVB1cmlmeS5hZGRIb29rKCdhZnRlclNhbml0aXplQXR0cmlidXRlcycsIChub2RlKSA9PiB7XG4gICAgaWYgKCFub2RlIHx8IG5vZGUudGFnTmFtZSAhPT0gJ0lGUkFNRScpIHJldHVyblxuXG4gICAgY29uc3Qgc3JjID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ3NyYycpIHx8ICcnXG4gICAgaWYgKHNyYyAhPT0gJycgJiYgaXNBbGxvd2VkSWZyYW1lU3JjKHNyYykgIT09IHRydWUpIHtcbiAgICAgIHNweW5lV2FybihgU1BZTkUgV0FSTklORzogaWZyYW1lIHNyYyBcIiR7c3JjfVwiIHdhcyByZW1vdmVkIGJ5IHRoZSBpZnJhbWUgcG9saWN5IChzYW1lLW9yaWdpbiwgaHR0cHMsIG9yIGFuIGFsbG93ZWQgb3JpZ2luIGlzIHJlcXVpcmVkKS5gKVxuICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpXG4gICAgfVxuXG4gICAgY29uc3QgeyBzYW5kYm94IH0gPSBhY3RpdmVJZnJhbWVQb2xpY3lcbiAgICBpZiAoc2FuZGJveCAhPT0gZmFsc2UgJiYgbm9kZS5oYXNBdHRyaWJ1dGUoJ3NhbmRib3gnKSAhPT0gdHJ1ZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ3NhbmRib3gnLCBzYW5kYm94KVxuICAgIH1cbiAgfSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBbmNob3IgcG9saWN5XG4gKlxuICogQ29uZmlndXJlZCB2aWEgY29uZmlnLmFuY2hvcnMgYXQgU3B5bmVBcHAuaW5pdDpcbiAqICAgYWxsb3dUYXJnZXQgICAg4oCUIHRydWUgKGRlZmF1bHQpIGFkbWl0cyB0YXJnZXQgb24gZHluYW1pYyBhbmNob3JzIGluXG4gKiAgICAgICAgICAgICAgICAgICAgZXZlcnkgbW9kZTsgdGhlIGhvb2sgdmFsaWRhdGVzIHZhbHVlcyBhbmQgZm9yY2VzXG4gKiAgICAgICAgICAgICAgICAgICAgbm9vcGVuZXIuIGZhbHNlIHN0cmlwcyB0YXJnZXQgZXZlcnl3aGVyZS5cbiAqICAgYWRkTm9vcGVuZXIgICAg4oCUIHRydWUgKGRlZmF1bHQpIGZvcmNlcyByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAqICAgICAgICAgICAgICAgICAgICBvbnRvIHRhcmdldD1cIl9ibGFua1wiIGFuY2hvcnMuXG4gKiAgIGFsbG93ZWREb21haW5zIOKAlCBbXSAoYW55IGRlc3RpbmF0aW9uIHRoZSBVUkkgc2NoZW1lIHBvbGljeSBhbGxvd3MpIHxcbiAqICAgICAgICAgICAgICAgICAgICBbJ2h0dHBzOi8vZ2l0aHViLmNvbScsIC4uLl0gcmVzdHJpY3RzIGNyb3NzLW9yaWdpblxuICogICAgICAgICAgICAgICAgICAgIGhyZWZzIHRvIHRoZSBsaXN0ZWQgb3JpZ2lucy4gU2FtZS1vcmlnaW4sIHJlbGF0aXZlLFxuICogICAgICAgICAgICAgICAgICAgIG1haWx0bzogYW5kIHRlbDogaHJlZnMgYXJlIGFsd2F5cyBhbGxvd2VkLlxuICpcbiAqIEEgcGVyLWNhbGwgb3ZlcnJpZGUgY2FuIGJlIHBhc3NlZCBhcyBvcHRzLmFuY2hvcnMgdG8gc2FuaXRpemVEYXRhLlxuICogVGhlIGxlZ2FjeSB0b3AtbGV2ZWwgYWxsb3dUYXJnZXRBdHRyIGFuZCBhZGROb29wZW5lciBjb25maWcga2V5cyBhcmVcbiAqIGhvbm9yZWQgYXMgZmFsbGJhY2tzLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLy8gdGFyZ2V0IGFjY2VwdHMgYW55IGJyb3dzaW5nLWNvbnRleHQgbmFtZTsgdGhlc2UgYXJlIHRoZSBrZXl3b3JkcyB0aGF0XG4vLyBzdGF5IGluIHRoZSBzYW1lIGNvbnRleHQgYW5kIHRoZXJlZm9yZSBjYXJyeSBubyBvcGVuZXIgcmlzay5cbmNvbnN0IFNBTUVfQ09OVEVYVF9UQVJHRVRTID0gWydfc2VsZicsICdfcGFyZW50JywgJ190b3AnXVxuXG5sZXQgY29uZmlndXJlZEFuY2hvclBvbGljeSA9IHsgYWxsb3dUYXJnZXQ6IHRydWUsIGFkZE5vb3BlbmVyOiB0cnVlLCBhbGxvd2VkRG9tYWluczogW10gfVxubGV0IGFjdGl2ZUFuY2hvclBvbGljeSA9IGNvbmZpZ3VyZWRBbmNob3JQb2xpY3lcblxuY29uc3QgcmVzb2x2ZUFuY2hvclBvbGljeSA9IChvdmVycmlkZSkgPT4ge1xuICBpZiAoIW92ZXJyaWRlKSByZXR1cm4gY29uZmlndXJlZEFuY2hvclBvbGljeVxuICByZXR1cm4ge1xuICAgIGFsbG93VGFyZ2V0OiBvdmVycmlkZS5hbGxvd1RhcmdldCAhPT0gdW5kZWZpbmVkID8gb3ZlcnJpZGUuYWxsb3dUYXJnZXQgPT09IHRydWUgOiBjb25maWd1cmVkQW5jaG9yUG9saWN5LmFsbG93VGFyZ2V0LFxuICAgIGFkZE5vb3BlbmVyOiBvdmVycmlkZS5hZGROb29wZW5lciAhPT0gdW5kZWZpbmVkID8gb3ZlcnJpZGUuYWRkTm9vcGVuZXIgPT09IHRydWUgOiBjb25maWd1cmVkQW5jaG9yUG9saWN5LmFkZE5vb3BlbmVyLFxuICAgIGFsbG93ZWREb21haW5zOiBvdmVycmlkZS5hbGxvd2VkRG9tYWlucyAhPT0gdW5kZWZpbmVkID8gb3ZlcnJpZGUuYWxsb3dlZERvbWFpbnMgOiBjb25maWd1cmVkQW5jaG9yUG9saWN5LmFsbG93ZWREb21haW5zXG4gIH1cbn1cblxuY29uc3QgaXNBbGxvd2VkQW5jaG9ySHJlZiA9IChocmVmLCBwb2xpY3kgPSBhY3RpdmVBbmNob3JQb2xpY3kpID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVVyaUZvckNoZWNrKGhyZWYpXG5cbiAgLy8gbWFpbHRvOiBhbmQgdGVsOiBhcmUgbm90IGRvbWFpbnMgYW5kIGFsd2F5cyBwYXNzLlxuICBpZiAoL14obWFpbHRvfHRlbCk6L2kudGVzdChub3JtYWxpemVkKSkgcmV0dXJuIHRydWVcblxuICBsZXQgcmVzb2x2ZWRcbiAgdHJ5IHtcbiAgICByZXNvbHZlZCA9IG5ldyBVUkwobm9ybWFsaXplZCwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFNhbWUtb3JpZ2luIGxpbmtzIChpbmNsdWRpbmcgcmVsYXRpdmUgaHJlZnMpIGFyZSBuZXZlciByZXN0cmljdGVkLlxuICBpZiAocmVzb2x2ZWQub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICYmIHJlc29sdmVkLm9yaWdpbiAhPT0gJ251bGwnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICgvXmh0dHBzPzokLy50ZXN0KHJlc29sdmVkLnByb3RvY29sKSAhPT0gdHJ1ZSkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgZG9tYWlucyA9IHBvbGljeS5hbGxvd2VkRG9tYWluc1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZG9tYWlucykgfHwgZG9tYWlucy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIGRvbWFpbnMuc29tZShkID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBVUkwoZCkub3JpZ2luID09PSByZXNvbHZlZC5vcmlnaW5cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IGZvcmNlTm9vcGVuZXJSZWwgPSAoZWwpID0+IHtcbiAgY29uc3QgY3VycmVudFJlbCA9IGVsLmdldEF0dHJpYnV0ZSgncmVsJykgfHwgJydcbiAgY29uc3QgcmVsU2V0ID0gbmV3IFNldChjdXJyZW50UmVsLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pKVxuXG4gIHJlbFNldC5hZGQoJ25vb3BlbmVyJylcbiAgcmVsU2V0LmFkZCgnbm9yZWZlcnJlcicpXG5cbiAgZWwuc2V0QXR0cmlidXRlKCdyZWwnLCBBcnJheS5mcm9tKHJlbFNldCkuam9pbignICcpKVxufVxuXG5sZXQgYW5jaG9ySG9va0FkZGVkID0gZmFsc2VcbmNvbnN0IGFkZEFuY2hvckhhcmRlbmluZ0hvb2sgPSAoKSA9PiB7XG4gIGlmIChhbmNob3JIb29rQWRkZWQpIHJldHVyblxuICBhbmNob3JIb29rQWRkZWQgPSB0cnVlXG5cbiAgRE9NUHVyaWZ5LmFkZEhvb2soJ2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzJywgKG5vZGUpID0+IHtcbiAgICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUuZ2V0QXR0cmlidXRlICE9PSAnZnVuY3Rpb24nKSByZXR1cm5cbiAgICBpZiAobm9kZS50YWdOYW1lICE9PSAnQScpIHJldHVyblxuXG4gICAgY29uc3QgcG9saWN5ID0gYWN0aXZlQW5jaG9yUG9saWN5XG4gICAgY29uc3QgaHJlZiA9IG5vZGUuZ2V0QXR0cmlidXRlKCdocmVmJylcblxuICAgIGlmIChocmVmICYmIHBvbGljeS5hbGxvd2VkRG9tYWlucy5sZW5ndGggPiAwICYmIGlzQWxsb3dlZEFuY2hvckhyZWYoaHJlZiwgcG9saWN5KSAhPT0gdHJ1ZSkge1xuICAgICAgc3B5bmVXYXJuKGBTUFlORSBXQVJOSU5HOiBhbmNob3IgaHJlZiBcIiR7aHJlZn1cIiB3YXMgcmVtb3ZlZCBieSB0aGUgYW5jaG9yIHBvbGljeSAoc2FtZS1vcmlnaW4gb3IgYW4gYWxsb3dlZCBkb21haW4gaXMgcmVxdWlyZWQpLmApXG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgnaHJlZicpXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ3RhcmdldCcpXG4gICAgaWYgKCF0YXJnZXQpIHJldHVyblxuXG4gICAgLy8gdGFyZ2V0IHdpdGhvdXQgYW4gaHJlZiBzZXJ2ZXMgbm8gcHVycG9zZS5cbiAgICBpZiAocG9saWN5LmFsbG93VGFyZ2V0ICE9PSB0cnVlIHx8ICFub2RlLmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgndGFyZ2V0JylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEFueSBicm93c2luZy1jb250ZXh0IG5hbWUgaXMgdmFsaWQ7IF9ibGFuayBhbmQgbmFtZWQgd2luZG93cyBib3RoXG4gICAgLy8gaGFuZCB0aGUgb3BlbmVkIHBhZ2UgYW4gb3BlbmVyIHJlZmVyZW5jZSwgc28gbm9vcGVuZXIgYXBwbGllcyB0b1xuICAgIC8vIGV2ZXJ5IHRhcmdldCBleGNlcHQgdGhlIHNhbWUtY29udGV4dCBrZXl3b3Jkcy5cbiAgICBpZiAoU0FNRV9DT05URVhUX1RBUkdFVFMuaW5jbHVkZXModGFyZ2V0KSAhPT0gdHJ1ZSAmJiBwb2xpY3kuYWRkTm9vcGVuZXIgPT09IHRydWUpIHtcbiAgICAgIGZvcmNlTm9vcGVuZXJSZWwobm9kZSlcbiAgICB9XG4gIH0pXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogRGV0ZXJtaW5lIHNhbml0aXphdGlvbiBtb2RlXG4gKlxuICogRXhwbGljaXQgY29uZmlnIGFsd2F5cyB3aW5zOyB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgb25seSBhXG4gKiBmYWxsYmFjayB3aGVuIG5vIG1vZGUgaGFzIGJlZW4gY29uZmlndXJlZC5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IFJJQ0hURVhUX0FMSUFTRVMgPSBbJ3JpY2h0ZXh0JywgJ2F1dGhvcmluZycsICdkZXZlbG9wbWVudCddXG5cbmNvbnN0IHJlc29sdmVEZWZhdWx0TW9kZSA9ICgpID0+IHtcbiAgY29uc3QgY29uZmlnTW9kZSA9IFNweW5lQXBwUHJvcGVydGllcz8ubW9kZVxuXG4gIGlmIChSSUNIVEVYVF9BTElBU0VTLmluY2x1ZGVzKGNvbmZpZ01vZGUpKSByZXR1cm4gJ3JpY2h0ZXh0J1xuICBpZiAoY29uZmlnTW9kZSA9PT0gJ2FwcCcpIHJldHVybiAnYXBwJ1xuXG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzPy5lbnY/Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICByZXR1cm4gJ3JpY2h0ZXh0J1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIG5vIGJ1aWxkLXRpbWUgZW52IGF2YWlsYWJsZVxuICB9XG5cbiAgcmV0dXJuICdhcHAnXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgYnVpbGRNb2RlQ29uZmlnID0gKG1vZGUpID0+IHtcbiAgY29uc3QgYmFzZSA9IG1vZGUgPT09ICdyaWNodGV4dCcgPyBTQUZFX0ZPUl9SSUNIX1RFWFQgOiBTQUZFX0ZPUl9BUFBcbiAgY29uc3QgYWxsb3dJZnJhbWUgPSBpZnJhbWVBbGxvd2VkRm9yTW9kZShtb2RlKVxuXG4gIGlmIChtb2RlID09PSAncmljaHRleHQnICYmIGFsbG93SWZyYW1lICE9PSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJhc2UsXG4gICAgICBBTExPV0VEX1RBR1M6IGJhc2UuQUxMT1dFRF9UQUdTLmZpbHRlcih0ID0+IHQgIT09ICdpZnJhbWUnKSxcbiAgICAgIEFERF9UQUdTOiBiYXNlLkFERF9UQUdTLmZpbHRlcih0ID0+IHQgIT09ICdpZnJhbWUnKSxcbiAgICAgIEZPUkJJRF9UQUdTOiBbLi4uYmFzZS5GT1JCSURfVEFHUywgJ2lmcmFtZSddXG4gICAgfVxuICB9XG5cbiAgaWYgKG1vZGUgPT09ICdhcHAnKSB7XG4gICAgY29uc3QgY2ZnID0geyAuLi5iYXNlIH1cbiAgICBjb25zdCBhZGRBdHRyID0gW11cblxuICAgIGlmIChhbGxvd0lmcmFtZSA9PT0gdHJ1ZSkge1xuICAgICAgY2ZnLkZPUkJJRF9UQUdTID0gYmFzZS5GT1JCSURfVEFHUy5maWx0ZXIodCA9PiB0ICE9PSAnaWZyYW1lJylcbiAgICAgIGNmZy5BRERfVEFHUyA9IFsnaWZyYW1lJ11cbiAgICAgIGFkZEF0dHIucHVzaCgnc2FuZGJveCcpXG4gICAgfVxuXG4gICAgLy8gRE9NUHVyaWZ5IHN0cmlwcyB0YXJnZXQgYnkgZGVmYXVsdDsgcmUtYWRtaXQgaXQgKHdpdGggcmVsKSBzbyB0aGVcbiAgICAvLyBhbmNob3IgaG9vayBjYW4gdmFsaWRhdGUgdmFsdWVzIGFuZCBmb3JjZSBub29wZW5lciBpbnN0ZWFkLlxuICAgIGlmIChhY3RpdmVBbmNob3JQb2xpY3kuYWxsb3dUYXJnZXQgPT09IHRydWUpIHtcbiAgICAgIGFkZEF0dHIucHVzaCgndGFyZ2V0JywgJ3JlbCcpXG4gICAgfVxuXG4gICAgaWYgKGFkZEF0dHIubGVuZ3RoID4gMCkge1xuICAgICAgY2ZnLkFERF9BVFRSID0gYWRkQXR0clxuICAgIH1cblxuICAgIHJldHVybiBjZmdcbiAgfVxuXG4gIHJldHVybiBiYXNlXG59XG5cbmZ1bmN0aW9uIG1ha2VTYW5pdGl6ZUZuKG1vZGUgPSAnYXBwJykge1xuICBjb25zdCBjZmcgPSBidWlsZE1vZGVDb25maWcobW9kZSlcblxuICByZXR1cm4gKGh0bWwpID0+IERPTVB1cmlmeS5zYW5pdGl6ZShodG1sLCBjZmcpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uZmlndXJlIG9uY2VcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNhbml0aXplRGF0YUNvbmZpZ3VyZSA9IChjb25maWcgPSB7fSkgPT4ge1xuICBpZiAoaXNDb25maWd1cmVkKSB7XG4gICAgc3B5bmVXYXJuKCdzYW5pdGl6ZURhdGEgaXMgYWxyZWFkeSBjb25maWd1cmVkLiBSZWNvbmZpZ3VyYXRpb24gaXMgbm90IGFsbG93ZWQuJylcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgc3RyaWN0ID0gZmFsc2UsIGRpc2FibGVTYW5pdGl6ZSA9IGZhbHNlLCBpZnJhbWVzLCBjdXN0b21FbGVtZW50cywgYW5jaG9ycywgYWxsb3dUYXJnZXRBdHRyLCBhZGROb29wZW5lciB9ID0gY29uZmlnXG5cbiAgZ2xvYmFsRGlzYWJsZSA9IGRpc2FibGVTYW5pdGl6ZSA9PT0gdHJ1ZVxuXG4gIGlmIChjdXN0b21FbGVtZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWxsb3dDdXN0b21FbGVtZW50cyhjdXN0b21FbGVtZW50cylcbiAgfVxuXG4gIGlmIChpZnJhbWVzICYmIHR5cGVvZiBpZnJhbWVzID09PSAnb2JqZWN0Jykge1xuICAgIGNvbmZpZ3VyZWRJZnJhbWVQb2xpY3kgPSByZXNvbHZlSWZyYW1lUG9saWN5KGlmcmFtZXMpXG4gICAgYWN0aXZlSWZyYW1lUG9saWN5ID0gY29uZmlndXJlZElmcmFtZVBvbGljeVxuICB9XG5cbiAgLy8gY29uZmlnLmFuY2hvcnMgd2luczsgdGhlIGxlZ2FjeSB0b3AtbGV2ZWwgYWxsb3dUYXJnZXRBdHRyL2FkZE5vb3BlbmVyXG4gIC8vIGtleXMgYXJlIGhvbm9yZWQgYXMgZmFsbGJhY2tzLlxuICBjb25maWd1cmVkQW5jaG9yUG9saWN5ID0gcmVzb2x2ZUFuY2hvclBvbGljeSh7XG4gICAgYWxsb3dUYXJnZXQ6IGFuY2hvcnM/LmFsbG93VGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBhbmNob3JzLmFsbG93VGFyZ2V0IDogYWxsb3dUYXJnZXRBdHRyLFxuICAgIGFkZE5vb3BlbmVyOiBhbmNob3JzPy5hZGROb29wZW5lciAhPT0gdW5kZWZpbmVkID8gYW5jaG9ycy5hZGROb29wZW5lciA6IGFkZE5vb3BlbmVyLFxuICAgIGFsbG93ZWREb21haW5zOiBhbmNob3JzPy5hbGxvd2VkRG9tYWluc1xuICB9KVxuICBhY3RpdmVBbmNob3JQb2xpY3kgPSBjb25maWd1cmVkQW5jaG9yUG9saWN5XG5cbiAgaWYgKGdsb2JhbERpc2FibGUpIHtcbiAgICBjb25zb2xlLndhcm4oJ1NQWU5FIFNFQ1VSSVRZIFdBUk5JTkc6IEFsbCBkYXRhIHNhbml0aXphdGlvbiBpcyBESVNBQkxFRCB2aWEgY29uZmlnLmRpc2FibGVTYW5pdGl6ZS4gRG8gbm90IHVzZSB0aGlzIHNldHRpbmcgaW4gcHJvZHVjdGlvbi4nKVxuICB9IGVsc2Uge1xuICAgIGFkZElmcmFtZUhhcmRlbmluZ0hvb2soKVxuICAgIGFkZEFuY2hvckhhcmRlbmluZ0hvb2soKVxuICB9XG5cbiAgY29uc3QgcHJvY2Vzc0ZhY3RvcnkgPSAobW9kZSkgPT4ge1xuICAgIGNvbnN0IHNhbml0aXplU3RyID0gbWFrZVNhbml0aXplRm4obW9kZSlcbiAgICBjb25zdCBwcm9jZXNzID0gKHZhbCkgPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHZhbC5tYXAocHJvY2VzcylcbiAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0ge31cbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsKSkge1xuICAgICAgICAgIG91dFtrXSA9ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpID8gc2FuaXRpemVTdHIodikgOiBwcm9jZXNzKHYpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dFxuICAgICAgfVxuICAgICAgcmV0dXJuICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgPyBzYW5pdGl6ZVN0cih2YWwpIDogdmFsXG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzXG4gIH1cblxuICBfc2FuaXRpemVEYXRhID0gKGRhdGEsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgZGlzYWJsZVNhbml0aXplOiBjYWxsRGlzYWJsZSA9IGZhbHNlLCBtb2RlLCBpZnJhbWVzOiBpZnJhbWVzT3ZlcnJpZGUsIGFuY2hvcnM6IGFuY2hvcnNPdmVycmlkZSB9ID0gb3B0c1xuICAgIGlmIChnbG9iYWxEaXNhYmxlIHx8IGNhbGxEaXNhYmxlKSByZXR1cm4gZGF0YVxuXG4gICAgY29uc3QgbGVnYWN5U3RyaWN0ID0gZm9yY2VTdHJpY3QgfHwgc3RyaWN0XG4gICAgY29uc3QgZWZmZWN0aXZlTW9kZSA9IG1vZGUgfHwgKGxlZ2FjeVN0cmljdCA/ICdhcHAnIDogcmVzb2x2ZURlZmF1bHRNb2RlKCkpXG5cbiAgICAvLyBTYW5pdGl6YXRpb24gaXMgc3luY2hyb25vdXMsIHNvIHRoZSBwZXItY2FsbCBpZnJhbWUgYW5kIGFuY2hvclxuICAgIC8vIHBvbGljaWVzIGNhbiBiZSBzY29wZWQgd2l0aCBhIHN3YXAtYW5kLXJlc3RvcmUgYXJvdW5kIHRoZSBwYXNzLlxuICAgIGFjdGl2ZUlmcmFtZVBvbGljeSA9IHJlc29sdmVJZnJhbWVQb2xpY3koaWZyYW1lc092ZXJyaWRlKVxuICAgIGFjdGl2ZUFuY2hvclBvbGljeSA9IHJlc29sdmVBbmNob3JQb2xpY3koYW5jaG9yc092ZXJyaWRlKVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0ZhY3RvcnkoZWZmZWN0aXZlTW9kZSkoZGF0YSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWN0aXZlSWZyYW1lUG9saWN5ID0gY29uZmlndXJlZElmcmFtZVBvbGljeVxuICAgICAgYWN0aXZlQW5jaG9yUG9saWN5ID0gY29uZmlndXJlZEFuY2hvclBvbGljeVxuICAgIH1cbiAgfVxuXG4gIHNhbml0aXplRGF0YUNvbmZpZ3VyZS5zYW5pdGl6ZURhdGFGb3JjZSA9IChkYXRhLCBtb2RlKSA9PiB7XG4gICAgaWYgKGdsb2JhbERpc2FibGUpIHJldHVybiBkYXRhXG4gICAgY29uc3QgZWZmZWN0aXZlID0gbW9kZSB8fCByZXNvbHZlRGVmYXVsdE1vZGUoKVxuICAgIHJldHVybiBwcm9jZXNzRmFjdG9yeShlZmZlY3RpdmUpKGRhdGEpXG4gIH1cblxuICBpc0NvbmZpZ3VyZWQgPSB0cnVlXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uZmlndXJhYmxlIHJ1bnRpbWUgc2FuaXRpemVyXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBzYW5pdGl6ZURhdGEgPSAoZGF0YSwgb3B0cyA9IHt9KSA9PiB7XG4gIGlmICghaXNDb25maWd1cmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzYW5pdGl6ZURhdGEgaXMgbm90IGNvbmZpZ3VyZWQuIENhbGwgc2FuaXRpemVEYXRhQ29uZmlndXJlKCkgZmlyc3QuJylcbiAgfVxuICByZXR1cm4gX3Nhbml0aXplRGF0YShkYXRhLCBvcHRzKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFsd2F5cy1vbiBzYW5pdGl6ZXIgd2l0aCBlbnZpcm9ubWVudCBkZWZhdWx0XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBzYW5pdGl6ZURhdGFGb3JjZSA9IChkYXRhLCBtb2RlKSA9PiB7XG4gIGlmICghaXNDb25maWd1cmVkIHx8ICFzYW5pdGl6ZURhdGFDb25maWd1cmUuc2FuaXRpemVEYXRhRm9yY2UpIHtcbiAgICBjb25zdCBzYW5pdGl6ZVN0ciA9IG1ha2VTYW5pdGl6ZUZuKG1vZGUgfHwgcmVzb2x2ZURlZmF1bHRNb2RlKCkpXG4gICAgcmV0dXJuICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpID8gc2FuaXRpemVTdHIoZGF0YSkgOiBkYXRhXG4gIH1cbiAgcmV0dXJuIHNhbml0aXplRGF0YUNvbmZpZ3VyZS5zYW5pdGl6ZURhdGFGb3JjZShkYXRhLCBtb2RlKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEF0dHJpYnV0ZSBzYW5pdGl6ZXJcbiAqXG4gKiBUaGUgc2luZ2xlIHZhbHVlLWxldmVsIGd1YXJkIGZvciB0aGUgYXR0cmlidXRlIGNoYW5uZWxcbiAqIChEb21FbGVtZW50LnNldEVsQXR0cnMpLiBBdHRyaWJ1dGUgbmFtZXMgYXJlIGdhdGVkIGJ5IHRoZVxuICogRG9tRWxlbWVudC9WaWV3U3RyZWFtIGFsbG93bGlzdHM7IHRoaXMgdmFsaWRhdGVzIHZhbHVlcy5cbiAqXG4gKiBJbmRlcGVuZGVudCBvZiBzYW5pdGl6ZURhdGFDb25maWd1cmUgc28gaXQgaXMgYWx3YXlzIGF2YWlsYWJsZS5cbiAqIFJldHVybnMgeyBhbGxvd2VkOiBCb29sZWFuLCB2YWx1ZSB9LlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgVVJMX0FUVFJTID0gW1xuICAnaHJlZicsICdzcmMnLCAnYWN0aW9uJywgJ2Zvcm1hY3Rpb24nLCAncGluZycsICdwb3N0ZXInLFxuICAnY2l0ZScsICdjb2RlYmFzZScsICdtYW5pZmVzdCcsICdpY29uJywgJ2JhY2tncm91bmQnXG5dXG5cbmNvbnN0IHNhbml0aXplQXR0cmlidXRlID0gKGtleSwgdmFsdWUsIHRhZ05hbWUpID0+IHtcbiAgaWYgKGdsb2JhbERpc2FibGUpIHJldHVybiB7IGFsbG93ZWQ6IHRydWUsIHZhbHVlIH1cblxuICBjb25zdCBrID0gU3RyaW5nKGtleSkudG9Mb3dlckNhc2UoKVxuICBjb25zdCB0YWcgPSBTdHJpbmcodGFnTmFtZSB8fCAnJykudG9VcHBlckNhc2UoKVxuXG4gIC8vIEV2ZW50LWhhbmRsZXIgYXR0cmlidXRlcyBhcmUgbmV2ZXIgbGVnaXRpbWF0ZSBpbiBTcHluZUpTIOKAlFxuICAvLyBicm9hZGNhc3RFdmVudHMgaXMgdGhlIGRlY2xhcmVkIG1lY2hhbmlzbSBmb3IgaW50ZXJhY3Rpdml0eS5cbiAgaWYgKGsuc3RhcnRzV2l0aCgnb24nKSkge1xuICAgIHJldHVybiB7IGFsbG93ZWQ6IGZhbHNlLCB2YWx1ZSB9XG4gIH1cblxuICAvLyBzcmNkb2MgaXMgYSBmdWxsIEhUTUwgZG9jdW1lbnQ7IHNhbml0aXplIGl0IGFzIG9uZS5cbiAgaWYgKGsgPT09ICdzcmNkb2MnKSB7XG4gICAgY29uc3QgY2ZnID0gYnVpbGRNb2RlQ29uZmlnKHJlc29sdmVEZWZhdWx0TW9kZSgpKVxuICAgIHJldHVybiB7IGFsbG93ZWQ6IHRydWUsIHZhbHVlOiBET01QdXJpZnkuc2FuaXRpemUoU3RyaW5nKHZhbHVlKSwgY2ZnKSB9XG4gIH1cblxuICAvLyBJZnJhbWUgc3JjIGZvbGxvd3MgdGhlIGlmcmFtZSBwb2xpY3k6IGh0dHBzLW9ubHksIHBsdXMgdGhlXG4gIC8vIGNvbmZpZ3VyZWQgb3JpZ2luIGFsbG93bGlzdC5cbiAgaWYgKHRhZyA9PT0gJ0lGUkFNRScgJiYgayA9PT0gJ3NyYycpIHtcbiAgICByZXR1cm4geyBhbGxvd2VkOiBpc0FsbG93ZWRJZnJhbWVTcmModmFsdWUsIGNvbmZpZ3VyZWRJZnJhbWVQb2xpY3kpLCB2YWx1ZSB9XG4gIH1cblxuICAvLyBBbmNob3IgaHJlZiBmb2xsb3dzIHRoZSBhbmNob3IgcG9saWN5OiBzYWZlIHNjaGVtZSwgcGx1cyB0aGVcbiAgLy8gY29uZmlndXJlZCBkb21haW4gYWxsb3dsaXN0IGZvciBjcm9zcy1vcmlnaW4gZGVzdGluYXRpb25zLlxuICBpZiAodGFnID09PSAnQScgJiYgayA9PT0gJ2hyZWYnKSB7XG4gICAgaWYgKGlzU2FmZVVyaSh2YWx1ZSkgIT09IHRydWUpIHJldHVybiB7IGFsbG93ZWQ6IGZhbHNlLCB2YWx1ZSB9XG4gICAgaWYgKGNvbmZpZ3VyZWRBbmNob3JQb2xpY3kuYWxsb3dlZERvbWFpbnMubGVuZ3RoID4gMCAmJiBpc0FsbG93ZWRBbmNob3JIcmVmKHZhbHVlLCBjb25maWd1cmVkQW5jaG9yUG9saWN5KSAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHsgYWxsb3dlZDogZmFsc2UsIHZhbHVlIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgYWxsb3dlZDogdHJ1ZSwgdmFsdWUgfVxuICB9XG5cbiAgaWYgKFVSTF9BVFRSUy5pbmNsdWRlcyhrKSAmJiBpc1NhZmVVcmkodmFsdWUpICE9PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYWxsb3dlZDogZmFsc2UsIHZhbHVlIH1cbiAgfVxuXG4gIHJldHVybiB7IGFsbG93ZWQ6IHRydWUsIHZhbHVlIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBjb25maWd1cmVkIGlmcmFtZSBhbmQgYW5jaG9yIHBvbGljaWVzIHRvIGFuIGVsZW1lbnQgY3JlYXRlZFxuICogdGhyb3VnaCB0aGUgYXR0cmlidXRlIGNoYW5uZWwgKERvbUVsZW1lbnQpLCBtaXJyb3JpbmcgdGhlIERPTVB1cmlmeVxuICogaG9va3MgdGhhdCBndWFyZCBwYXJzZWQgSFRNTC5cbiAqL1xuY29uc3QgYXBwbHlFbGVtZW50SGFyZGVuaW5nID0gKGVsKSA9PiB7XG4gIGlmIChnbG9iYWxEaXNhYmxlIHx8ICFlbCkgcmV0dXJuIGVsXG5cbiAgaWYgKGVsLnRhZ05hbWUgPT09ICdJRlJBTUUnKSB7XG4gICAgY29uc3QgeyBzYW5kYm94IH0gPSBjb25maWd1cmVkSWZyYW1lUG9saWN5XG4gICAgaWYgKHNhbmRib3ggIT09IGZhbHNlICYmIGVsLmhhc0F0dHJpYnV0ZSgnc2FuZGJveCcpICE9PSB0cnVlKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3NhbmRib3gnLCBzYW5kYm94KVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbC50YWdOYW1lID09PSAnQScpIHtcbiAgICBjb25zdCBwb2xpY3kgPSBjb25maWd1cmVkQW5jaG9yUG9saWN5XG4gICAgY29uc3QgdGFyZ2V0ID0gZWwuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKVxuXG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgaWYgKHBvbGljeS5hbGxvd1RhcmdldCAhPT0gdHJ1ZSB8fCAhZWwuZ2V0QXR0cmlidXRlKCdocmVmJykpIHtcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCd0YXJnZXQnKVxuICAgICAgfSBlbHNlIGlmIChTQU1FX0NPTlRFWFRfVEFSR0VUUy5pbmNsdWRlcyh0YXJnZXQpICE9PSB0cnVlICYmIHBvbGljeS5hZGROb29wZW5lciA9PT0gdHJ1ZSkge1xuICAgICAgICBmb3JjZU5vb3BlbmVyUmVsKGVsKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbFxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZW50LXRhcmdldCBzYW5pdGl6ZXJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNhbml0aXplRXZlbnRUYXJnZXQgPSAoZWwsIG1vZGUpID0+IHtcbiAgaWYgKCFlbCB8fCBnbG9iYWxEaXNhYmxlKSByZXR1cm5cbiAgY29uc3QgZWZmZWN0aXZlTW9kZSA9IG1vZGUgfHwgcmVzb2x2ZURlZmF1bHRNb2RlKClcbiAgY29uc3Qgc2FuaXRpemVTdHIgPSBtYWtlU2FuaXRpemVGbihlZmZlY3RpdmVNb2RlKVxuICBjb25zdCBVTlNBRkVfUkUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8Zm9ybXxpbnB1dHxidXR0b258bGlua3xtZXRhKVtePl0qPnxvblxcdys9fGphdmFzY3JpcHQ6L2lcbiAgaWYgKHR5cGVvZiBlbC52YWx1ZSA9PT0gJ3N0cmluZycgJiYgVU5TQUZFX1JFLnRlc3QoZWwudmFsdWUpKSB7XG4gICAgY29uc3QgY2xlYW4gPSBzYW5pdGl6ZVN0cihlbC52YWx1ZSlcbiAgICBpZiAoY2xlYW4gIT09IGVsLnZhbHVlKSBlbC52YWx1ZSA9IGNsZWFuXG4gIH1cbiAgaWYgKGVsLmlzQ29udGVudEVkaXRhYmxlICYmIHR5cGVvZiBlbC5pbm5lckhUTUwgPT09ICdzdHJpbmcnICYmIFVOU0FGRV9SRS50ZXN0KGVsLmlubmVySFRNTCkpIHtcbiAgICBjb25zdCBjbGVhbiA9IHNhbml0aXplU3RyKGVsLmlubmVySFRNTClcbiAgICBpZiAoY2xlYW4gIT09IGVsLmlubmVySFRNTCkgZWwuaW5uZXJIVE1MID0gY2xlYW5cbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEBkZXByZWNhdGVkIFVzZSBzYW5pdGl6ZURhdGEoZGF0YSwgeyBtb2RlOiAnYXBwJyB9KSBwZXIgY2FsbCwgb3Igc2V0XG4gKiBjb25maWcubW9kZSBhdCBTcHluZUFwcC5pbml0LiBSZXRhaW5lZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNldFNhbml0aXplRGF0YUZvcmNlU3RyaWN0ID0gKGJvb2wgPSB0cnVlKSA9PiB7XG4gIHNweW5lV2FybignU1BZTkUgREVQUkVDQVRJT046IHNldFNhbml0aXplRGF0YUZvcmNlU3RyaWN0IGlzIGRlcHJlY2F0ZWQuIFBhc3MgeyBtb2RlOiBcImFwcFwiIH0gdG8gc2FuaXRpemVEYXRhLCBvciBzZXQgY29uZmlnLm1vZGUgaW4gU3B5bmVBcHAuaW5pdC4nKVxuICBmb3JjZVN0cmljdCA9ICEhYm9vbFxufVxuXG5leHBvcnQge1xuICBzYW5pdGl6ZURhdGFDb25maWd1cmUsXG4gIHNhbml0aXplRGF0YSxcbiAgc2FuaXRpemVEYXRhRm9yY2UsXG4gIHNhbml0aXplQXR0cmlidXRlLFxuICBhcHBseUVsZW1lbnRIYXJkZW5pbmcsXG4gIGFsbG93Q3VzdG9tRWxlbWVudHMsXG4gIENVU1RPTV9FTEVNRU5UX0hBTkRMSU5HIGFzIGN1c3RvbUVsZW1lbnRIYW5kbGluZyxcbiAgc2FuaXRpemVFdmVudFRhcmdldCxcbiAgc2V0U2FuaXRpemVEYXRhRm9yY2VTdHJpY3Rcbn1cbmV4cG9ydCBkZWZhdWx0IHNhbml0aXplRGF0YVxuIiwiaW1wb3J0IERPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknXG5pbXBvcnQgeyBzcHluZVdhcm4gfSBmcm9tICcuL3NweW5lLXdhcm4uanMnXG5pbXBvcnQgeyBjdXN0b21FbGVtZW50SGFuZGxpbmcgfSBmcm9tICcuL3Nhbml0aXplLWRhdGEuanMnXG5cbmxldCBfc2FuaXRpemVIVE1MXG5sZXQgaXNDb25maWd1cmVkID0gZmFsc2VcblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSB0ZW1wbGF0ZS1sYXllciBzYW5pdGl6ZXIuXG4gKlxuICogU2FuaXRpemF0aW9uIGlzIGFsd2F5cyBvbi4gVGhlIHRocmVlLWxldmVsIHBvc3R1cmU6XG4gKlxuICogICBtb2RlOiAnYXBwJyAoZGVmYXVsdCkgICDigJQgRE9NUHVyaWZ5IHdpdGggaXRzIHN0YW5kYXJkIGFsbG93bGlzdFxuICogICBtb2RlOiAncmljaHRleHQnICAgICAgICDigJQgYWRkaXRpb25hbGx5IGFkbWl0cyBpZnJhbWUvbGluayAoKyBzYW5kYm94IGF0dHIpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gQ01TL2F1dGhvcmluZyBjb250ZW50IHN1cnZpdmVzIHRlbXBsYXRlc1xuICogICBzdHJpY3Q6IHRydWUgICAgICAgICAgICDigJQgYWRkaXRpb25hbGx5IHJlZ2lzdGVycyBhIFRydXN0ZWQgVHlwZXMgJ2RlZmF1bHQnXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5IHNvIERPTSBzaW5rcyByb3V0ZSB0aHJvdWdoIHNhbml0aXphdGlvblxuICogICBkaXNhYmxlU2FuaXRpemU6IHRydWUgICDigJQgdGhlIG9ubHkgZnVsbCBwYXNzdGhyb3VnaDsgbG9ncyBhIHNlY3VyaXR5IHdhcm5pbmdcbiAqL1xuY29uc3Qgc2FuaXRpemVIVE1MQ29uZmlndXJlID0gKGNvbmZpZyA9IHt9KSA9PiB7XG4gIGlmIChpc0NvbmZpZ3VyZWQpIHtcbiAgICBzcHluZVdhcm4oJ3Nhbml0aXplSFRNTCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQuIFJlY29uZmlndXJhdGlvbiBpcyBub3QgYWxsb3dlZC4nKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qge1xuICAgIHN0cmljdCA9IGZhbHNlLFxuICAgIG1vZGUgPSAnYXBwJyxcbiAgICBkaXNhYmxlU2FuaXRpemUgPSBmYWxzZSxcbiAgICBhbGxvd1RhcmdldEF0dHIgPSB0cnVlLFxuICAgIGRlYnVnID0gZmFsc2UsXG4gICAgaWZyYW1lcyA9IHt9LFxuICAgIGFuY2hvcnMgPSB7fVxuICB9ID0gY29uZmlnXG5cbiAgaWYgKGRpc2FibGVTYW5pdGl6ZSA9PT0gdHJ1ZSkge1xuICAgIGNvbnNvbGUud2FybignU1BZTkUgU0VDVVJJVFkgV0FSTklORzogQWxsIEhUTUwgc2FuaXRpemF0aW9uIGlzIERJU0FCTEVEIHZpYSBjb25maWcuZGlzYWJsZVNhbml0aXplLiBEbyBub3QgdXNlIHRoaXMgc2V0dGluZyBpbiBwcm9kdWN0aW9uLicpXG4gICAgX3Nhbml0aXplSFRNTCA9IChodG1sKSA9PiBodG1sXG4gICAgaXNDb25maWd1cmVkID0gdHJ1ZVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgaXNSaWNodGV4dCA9IFsncmljaHRleHQnLCAnYXV0aG9yaW5nJywgJ2RldmVsb3BtZW50J10uaW5jbHVkZXMobW9kZSlcblxuICAvLyBJZnJhbWUgYWRtaXNzaW9uIGZvbGxvd3MgY29uZmlnLmlmcmFtZXMuYWxsb3cgd2hlbiBzZXQ7IG90aGVyd2lzZVxuICAvLyB0aGUgbW9kZSBkZWZhdWx0IChyaWNodGV4dCB5ZXMsIGFwcCBubykuIFRoZSBET01QdXJpZnkgaG9vayBhZGRlZCBieVxuICAvLyBzYW5pdGl6ZS1kYXRhIGVuZm9yY2VzIHNyYyBvcmlnaW4gYW5kIHNhbmRib3ggcG9saWN5IG9uIHdoYXRldmVyXG4gIC8vIGlzIGFkbWl0dGVkIGhlcmUuXG4gIGNvbnN0IGFsbG93SWZyYW1lID0gaWZyYW1lcy5hbGxvdyAhPT0gdW5kZWZpbmVkID8gaWZyYW1lcy5hbGxvdyA9PT0gdHJ1ZSA6IGlzUmljaHRleHRcblxuICAvLyBjb25maWcuYW5jaG9ycy5hbGxvd1RhcmdldCB3aW5zOyB0aGUgbGVnYWN5IHRvcC1sZXZlbCBhbGxvd1RhcmdldEF0dHJcbiAgLy8ga2V5IGlzIGhvbm9yZWQgYXMgYSBmYWxsYmFjay4gVGFyZ2V0IHZhbHVlcyBhbmQgbm9vcGVuZXIgZW5mb3JjZW1lbnRcbiAgLy8gYXJlIGhhbmRsZWQgYnkgdGhlIGFuY2hvciBob29rIHJlZ2lzdGVyZWQgaW4gc2FuaXRpemUtZGF0YSwgd2hpY2hcbiAgLy8gYXBwbGllcyB0byB0aGlzIGxheWVyJ3Mgc2FuaXRpemF0aW9uIGFzIHdlbGwuXG4gIGNvbnN0IGFsbG93VGFyZ2V0ID0gYW5jaG9ycy5hbGxvd1RhcmdldCAhPT0gdW5kZWZpbmVkID8gYW5jaG9ycy5hbGxvd1RhcmdldCA9PT0gdHJ1ZSA6IGFsbG93VGFyZ2V0QXR0ciA9PT0gdHJ1ZVxuXG4gIGNvbnN0IGRvbVB1cmlmeUNvbmZpZyA9IHtcbiAgICBSRVRVUk5fVFJVU1RFRF9UWVBFOiBmYWxzZSxcbiAgICBBRERfVEFHUzogW1xuICAgICAgLi4uKGFsbG93SWZyYW1lID8gWydpZnJhbWUnXSA6IFtdKSxcbiAgICAgIC4uLihpc1JpY2h0ZXh0ID8gWydsaW5rJ10gOiBbXSlcbiAgICBdLFxuICAgIEFERF9BVFRSOiBbXG4gICAgICAuLi4oYWxsb3dUYXJnZXQgPyBbJ3RhcmdldCcsICdyZWwnXSA6IFtdKSxcbiAgICAgIC4uLihhbGxvd0lmcmFtZSA/IFsnc2FuZGJveCddIDogW10pXG4gICAgXSxcbiAgICAvLyBBZG1pdHMgdGhlIGZyYW1ld29yaydzIHNweW5lLSogZWxlbWVudHMgKENNUyBwcm94eSB3cmFwcGVycykgYW5kIGFueVxuICAgIC8vIGVsZW1lbnRzIHJlZ2lzdGVyZWQgdmlhIGFsbG93Q3VzdG9tRWxlbWVudHMvY29uZmlnLmN1c3RvbUVsZW1lbnRzLlxuICAgIC8vIFRoZSB0YWcgY2hlY2sgaXMgYSBjbG9zdXJlLCBzbyBsYXRlIHBsdWdpbiByZWdpc3RyYXRpb24gaXMgaG9ub3JlZC5cbiAgICBDVVNUT01fRUxFTUVOVF9IQU5ETElORzogY3VzdG9tRWxlbWVudEhhbmRsaW5nLFxuICAgIC4uLihhbGxvd0lmcmFtZSAhPT0gdHJ1ZSAmJiBpc1JpY2h0ZXh0ID8geyBGT1JCSURfVEFHUzogWydpZnJhbWUnXSB9IDoge30pXG4gIH1cblxuICBjb25zdCBzYW5pdGl6ZVdpdGhQb2xpY3kgPSAoaHRtbCkgPT4gRE9NUHVyaWZ5LnNhbml0aXplKGh0bWwsIGRvbVB1cmlmeUNvbmZpZylcblxuICBfc2FuaXRpemVIVE1MID0gc2FuaXRpemVXaXRoUG9saWN5XG5cbiAgaWYgKHN0cmljdCA9PT0gdHJ1ZSAmJiB3aW5kb3cudHJ1c3RlZFR5cGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBvbGljeSA9IHdpbmRvdy50cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCdkZWZhdWx0Jywge1xuICAgICAgICBjcmVhdGVIVE1MOiAodG9Fc2NhcGUpID0+IHNhbml0aXplV2l0aFBvbGljeSh0b0VzY2FwZSlcbiAgICAgIH0pXG5cbiAgICAgIF9zYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4gcG9saWN5LmNyZWF0ZUhUTUwoaHRtbClcblxuICAgICAgaWYgKGRlYnVnID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTUFlORTogVHJ1c3RlZCBUeXBlcyBkZWZhdWx0IHBvbGljeSByZWdpc3RlcmVkLiBOb3RlIHRoYXQgYnJvd3NlciBlbmZvcmNlbWVudCBhZGRpdGlvbmFsbHkgcmVxdWlyZXMgdGhlIENTUCBoZWFkZXI6IHJlcXVpcmUtdHJ1c3RlZC10eXBlcy1mb3IgXFwnc2NyaXB0XFwnLicpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzcHluZVdhcm4oJ1NQWU5FIFdBUk5JTkc6IEEgVHJ1c3RlZCBUeXBlcyBcImRlZmF1bHRcIiBwb2xpY3kgYWxyZWFkeSBleGlzdHMgb24gdGhpcyBwYWdlLiBGYWxsaW5nIGJhY2sgdG8gZGlyZWN0IHNhbml0aXphdGlvbi4nLCBlcnIpXG4gICAgfVxuICB9XG5cbiAgaXNDb25maWd1cmVkID0gdHJ1ZVxufVxuXG5jb25zdCBzYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4ge1xuICBpZiAoIWlzQ29uZmlndXJlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2FuaXRpemVIVE1MIGlzIG5vdCBjb25maWd1cmVkLiBDYWxsIHNhbml0aXplSFRNTENvbmZpZ3VyZSgpIHdpdGggYXBwcm9wcmlhdGUgY29uZmlnLicpXG4gIH1cbiAgcmV0dXJuIF9zYW5pdGl6ZUhUTUwoaHRtbClcbn1cblxuZXhwb3J0IHsgc2FuaXRpemVIVE1MQ29uZmlndXJlIH1cbmV4cG9ydCBkZWZhdWx0IHNhbml0aXplSFRNTFxuIiwiaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwgfSBmcm9tICcuL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsLmpzJ1xuaW1wb3J0IHsgU3B5bmVQbHVnaW5zTWV0aG9kcyB9IGZyb20gJy4vc3B5bmUtcGx1Z2lucy1tZXRob2RzLmpzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi9kZWVwLW1lcmdlLmpzJ1xuXG5sZXQgX2NvbmZpZ1xubGV0IF9jaGFubmVsc1xubGV0IF9jaGFubmVsc01hcFxubGV0IF9pbml0aWFsaXplZFxubGV0IF9kZWJ1ZyA9IHRydWVcbmxldCBfZW5hYmxlQ01TUHJveGllcyA9IGZhbHNlXG5sZXQgX2Ntc1JlaHlkcmF0b3JcbmxldCBfY21zTGluZWFnZVdhcm5lclxuY29uc3QgX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlID0gW11cbi8qIGVzbGludC1kaXNhYmxlICovXG5sZXQgX2xpbmtzRGF0YVxubGV0IF9uYXZMaW5rc1xubGV0IF9JTUdfUEFUSFxuY29uc3QgX2RvTm90VHJhY2tDaGFubmVsc0FyciA9IFtdXG5jb25zdCBfcHJveGllc01hcCA9IG5ldyBNYXAoKVxuXG5mdW5jdGlvbiByYW5kb202Q2hhcnMoKSB7XG4gIC8vIEZvciBzaW1wbGljaXR5OiBzbGljZSgyLCA4KSBnZXRzIDYgcmFuZG9tIGNoYXJzIGZyb20gdGhlIHN1YnN0cmluZ1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG59XG5cbmNvbnN0IF9zcHluZVBsdWdpbk1ldGhvZHMgPSBuZXcgU3B5bmVQbHVnaW5zTWV0aG9kcygpXG5cbmNsYXNzIFNweW5lQXBwUHJvcGVydGllc0NsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgX2luaXRpYWxpemVkID0gZmFsc2VcbiAgfVxuXG4gIGdldCBjaGFubmVsc01hcCgpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzTWFwXG4gIH1cblxuICBnZXQgaW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIF9pbml0aWFsaXplZFxuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gX2NvbmZpZ1xuICB9XG5cbiAgZ2V0IGRlYnVnKCkge1xuICAgIHJldHVybiBfZGVidWdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24ncyBzYW5pdGl6YXRpb24gbW9kZSwgc2V0IHZpYSBjb25maWcubW9kZSBpbiBTcHluZUFwcC5pbml0LlxuICAgKiAnYXBwJyAoZGVmYXVsdCkgaXMgdGhlIHN0cmljdCBwcm9kdWN0aW9uIHBvc3R1cmU7ICdyaWNodGV4dCcgKGFsaWFzZXM6XG4gICAqICdhdXRob3JpbmcnLCAnZGV2ZWxvcG1lbnQnKSBpcyB0aGUgcGVybWlzc2l2ZSBwb3N0dXJlIGZvciBDTVMgYW5kXG4gICAqIGF1dGhvcmluZyB0b29scy5cbiAgICovXG4gIGdldCBtb2RlKCkge1xuICAgIHJldHVybiBfY29uZmlnPy5tb2RlICE9PSB1bmRlZmluZWQgPyBfY29uZmlnLm1vZGUgOiAnYXBwJ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbW9zdGx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0Pkxpc3RpbmcgdGhlIHJlZ2lzdGVyZWVkIENoYW5uZWxzIGluIHRoZSBicm93c2VyIGNvbnNvbGU8L2g0PiddXG4gICAqIFNweW5lQXBwLmxpc3RDaGFubmVscygpO1xuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgY2hhbm5lbHNcbiAgICovXG4gIHN0YXRpYyBsaXN0Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oX2NoYW5uZWxzLm1hcC5rZXlzKCkpXG4gIH1cblxuICBpbml0aWFsaXplKGRlZmF1bHRDb25maWcgPSB7fSwgY29uZmlnID0ge30sIGNoYW5uZWxzTWFwLCByb3V0ZVV0aWxzKSB7XG4gICAgX2NoYW5uZWxzID0gY2hhbm5lbHNNYXBcbiAgICBfY29uZmlnID0gZGVlcE1lcmdlKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgICAvLyBjb25zb2xlLmxvZyhcImNvbmZpZyBpcyBcIiwgeyBkZWZhdWx0Q29uZmlnLGNvbmZpZyB9KTtcbiAgICBpZiAoX2NvbmZpZy5jaGFubmVscyAmJiBfY29uZmlnLmNoYW5uZWxzLlJPVVRFKSB7XG4gICAgICAvLyBfY29uZmlnID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jb25mb3JtUm91dGVPYmplY3QoX2NvbmZpZylcbiAgICAgIF9jb25maWcgPSByb3V0ZVV0aWxzLmNvbmZvcm1Sb3V0ZU9iamVjdChfY29uZmlnKVxuICAgIH1cbiAgICBfSU1HX1BBVEggPSBfY29uZmlnPy5JTUdfUEFUSFxuICAgIF9kZWJ1ZyA9IF9jb25maWcuZGVidWcgIT09IHVuZGVmaW5lZCA/IF9jb25maWcuZGVidWcgOiBfZGVidWdcbiAgICB0aGlzLmdldENoYW5uZWxBY3Rpb25zID0gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zLmJpbmQoX2NoYW5uZWxzKVxuICAgIHRoaXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscyA9IF9jaGFubmVscy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzLmJpbmQoX2NoYW5uZWxzKVxuICAgIF9pbml0aWFsaXplZCA9IHRydWVcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IF9pbml0aWFsaXplZFxuICAgIHRoaXMuc2V0Q2hhbm5lbHNNYXAoKVxuICAgIGlmIChjb25maWc/LmJhc2VIcmVmKSB7XG4gICAgICB0aGlzLnNldEhlYWRCYXNlSHJlZihjb25maWcuYmFzZUhyZWYpXG4gICAgfVxuICAgIHJldHVybiBfY29uZmlnXG4gIH1cblxuICBzZXRIZWFkQmFzZUhyZWYoc3RyKSB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGJhc2UgZWxlbWVudFxuICAgIGNvbnN0IGJhc2VUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiYXNlJylcbiAgICAvLyBTZXQgdGhlIGhyZWYgYXR0cmlidXRlIHRvIHRoZSBkZXNpcmVkIGJhc2UgVVJMXG4gICAgYmFzZVRhZy5ocmVmID0gc3RyIC8vIFlvdSBjYW4gc2V0IHRoaXMgdG8gYW55IGJhc2UgVVJMXG4gICAgLy8gQXBwZW5kIHRoZSBiYXNlIGVsZW1lbnQgdG8gdGhlIGhlYWQgc2VjdGlvbiBvZiB0aGUgZG9jdW1lbnRcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGJhc2VUYWcpXG4gIH1cblxuICBjb25mb3JtUm91dGVDb25maWcoYWRkNDA0UHJvcHMgPSBmYWxzZSkge1xuICAgIC8qKlxuICAgICAqIFRISVMgTUVUSE9EIElTIFBSSU1BUklMWSBVU0VEIEZPUiBTUEEgR0VOIFNJVEUgR0VORVJBVElPTlxuICAgICAqL1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgX2NvbmZpZyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29uZm9ybVJvdXRlT2JqZWN0KF9jb25maWcsIGFkZDQwNFByb3BzKVxuICB9XG5cbiAgc2V0Q2hhbm5lbHNNYXAoKSB7XG4gICAgY29uc3QgZ2V0U3RyZWFtID0gX2NoYW5uZWxzLmdldFN0cmVhbS5iaW5kKF9jaGFubmVscylcbiAgICBjb25zdCB0ZXN0U3RyZWFtID0gIF9jaGFubmVscy50ZXN0U3RyZWFtLmJpbmQoX2NoYW5uZWxzKVxuICAgIGNvbnN0IGdldFByb3h5U3ViamVjdCA9IF9jaGFubmVscy5nZXRQcm94eVN1YmplY3QuYmluZChfY2hhbm5lbHMpXG5cbiAgICBfY2hhbm5lbHNNYXAgPSB7IGdldFN0cmVhbSwgdGVzdFN0cmVhbSwgZ2V0UHJveHlTdWJqZWN0IH1cbiAgfVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEZJWEVEOiBkdXJhYmxlIHNldFByb3AvZ2V0UHJvcCArIGlzb2xhdGVkIGVwaGVtZXJhbCAocmVhZC1vbmNlKSB0aWVyXG4vL1xuLy8gQ29udHJhY3QgYWZ0ZXIgZml4OlxuLy8gICBzZXRQcm9wKGtleSwgdmFsKSAgICAgICAgICAgIOKGkiBkdXJhYmxlLiBQZXJzaXN0cyBmb3IgdGhlIGFwcCBsaWZlc3Bhbi5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIHZhbC5cbi8vICAgc2V0UHJvcChrZXksIHZhbCwgdHJ1ZSkgICAgICDihpIgZXBoZW1lcmFsLiBSZWFkLW9uY2UgdmlhIGdldFByb3AuIFJldHVybnMgdmFsLlxuLy8gICBjcmVhdGVUZW1wUHJvcCh2YWwpICAgICAgICAgIOKGkiBlcGhlbWVyYWwgd2l0aCBnZW5lcmF0ZWQga2V5LiBSZXR1cm5zIHRoZSBrZXkuXG4vLyAgIGdldFByb3Aoa2V5KSAgICAgICAgICAgICAgICAg4oaSIHJldHVybnMgZHVyYWJsZSB2YWx1ZSBpZiBwcmVzZW50O1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSByZXR1cm5zIGVwaGVtZXJhbCB2YWx1ZSBPTkNFLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZGVsZXRlcyBpdC4gVGhlIHR3byB0aWVycyBjYW5ub3Rcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3cgZWFjaCBvdGhlci5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHNldFByb3Aoa2V5LCB2YWwsIGlzVGVtcCA9IGZhbHNlKSB7XG4gICAgaWYgKGlzVGVtcCkge1xuICAgICAgX2NvbmZpZy5lcGhlbWVyYWxQcm9wc1trZXldID0gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBfY29uZmlnLnRtcFByb3BzW2tleV0gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVggMjogYm90aCB0aWVycyByZXR1cm4gdGhlIHN0b3JlZCB2YWx1ZVxuICB9XG5cbiAgZ2V0UHJvcChrZXkpIHtcbiAgICAvLyBGSVggMSszOiBkdXJhYmxlIHRpZXIgcmVzb2x2ZXMgRklSU1QgYW5kIGluZGVwZW5kZW50bHkuIEEgZHVyYWJsZSB2YWx1ZVxuICAgIC8vIGNhbiBuZXZlciBiZSBzaGFkb3dlZCBvciBjb25zdW1lZCBieSBhIHNhbWUtbmFtZWQgZXBoZW1lcmFsIGtleS5cbiAgICBpZiAoX2NvbmZpZz8udG1wUHJvcHMgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKF9jb25maWcudG1wUHJvcHMsIGtleSkpIHtcbiAgICAgIHJldHVybiBfY29uZmlnLnRtcFByb3BzW2tleV07XG4gICAgfVxuICAgIC8vIEVwaGVtZXJhbCB0aWVyOiByZWFkLW9uY2UuIE9ubHkgcmVhY2hlZCB3aGVuIG5vIGR1cmFibGUgdmFsdWUgZXhpc3RzLlxuICAgIGlmIChfY29uZmlnPy5lcGhlbWVyYWxQcm9wcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoX2NvbmZpZy5lcGhlbWVyYWxQcm9wcywga2V5KSkge1xuICAgICAgY29uc3QgdGVtcFZhbCA9IF9jb25maWcuZXBoZW1lcmFsUHJvcHNba2V5XTtcbiAgICAgIGRlbGV0ZSBfY29uZmlnLmVwaGVtZXJhbFByb3BzW2tleV07XG4gICAgICByZXR1cm4gdGVtcFZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNyZWF0ZVRlbXBQcm9wKHZhbHVlKSB7XG4gICAgY29uc3Qga2V5ID0gcmFuZG9tNkNoYXJzKCk7XG4gICAgdGhpcy5zZXRQcm9wKGtleSwgdmFsdWUsIHRydWUpOyAgIC8vIGlzVGVtcCA9IHRydWVcbiAgICByZXR1cm4ga2V5OyAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyBrZXkgKGNvcnJlY3Qg4oCUIGNhbGxlciBuZWVkcyBpdCB0byByZWFkIGJhY2spXG4gIH1cblxuXG4gIHNldENoYW5uZWxDb25maWcoY2hhbm5lbE5hbWUsIGNvbmZpZykge1xuICAgIF9jb25maWcuY2hhbm5lbHNbY2hhbm5lbE5hbWVdID0gY29uZmlnXG4gICAgcmV0dXJuIF9jb25maWcuY2hhbm5lbHNbY2hhbm5lbE5hbWVdXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGNoZWNrIGluIHRoZSBjb25zb2xlIG9yIGluIHRoZSBjb2RlIHdoYXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGJlIGxpc3RlbmVkIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbm5lbE5hbWVcbiAgICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiBBY3Rpb25zIHRoYXQgY2FuIGJlIGxpc3RlbmVkIHRvXG4gICAqL1xuICAvKiAgZ2V0Q2hhbm5lbEFjdGlvbnMoY2hhbm5lbE5hbWUpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zKGNoYW5uZWxOYW1lKTtcbiAgfSAqL1xuXG4gIGdldENoYW5uZWxDb25maWcoY2hhbm5lbE5hbWUsIGNvbmZpZyA9IF9jb25maWcpIHtcbiAgICBpZiAoY2hhbm5lbE5hbWUgPT09ICdDSEFOTkVMX1JPVVRFJykge1xuICAgICAgY2hhbm5lbE5hbWUgPSAnUk9VVEUnXG4gICAgfSBlbHNlIGlmIChjaGFubmVsTmFtZSA9PT0gJ0NIQU5ORUxfV0lORE9XJykge1xuICAgICAgY2hhbm5lbE5hbWUgPSAnV0lORE9XJ1xuICAgIH1cblxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCB8fCBfY29uZmlnLmNoYW5uZWxzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3B5bmUgd2FybmluZzogU3B5bmUgY29uZmlnIG9iamVjdCBpcyBlbXB0eSEnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbENvbmZpZyA9IF9jb25maWcuY2hhbm5lbHNbY2hhbm5lbE5hbWVdXG5cbiAgICBpZiAoY2hhbm5lbENvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIHdhcm5pbmc6IFNweW5lIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwsICR7Y2hhbm5lbE5hbWV9IGlzIGVtcHR5IWApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbm5lbENvbmZpZ1xuICB9XG5cbiAgcmVnaXN0ZXJDaGFubmVsKCkge1xuXG4gIH1cblxuICBhZGRQbHVnaW5Db25maWcocGx1Z2luTmFtZSwgcGx1Z2luQ29uZmlnID0ge30pIHtcbiAgICBpZiAoX2NvbmZpZy5wbHVnaW5zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIF9jb25maWcucGx1Z2lucyA9IHt9XG4gICAgfVxuICAgIHRoaXMuYWRkUGx1Z2luTWV0aG9kcyhwbHVnaW5Db25maWcucGx1Z2luTWV0aG9kcylcblxuICAgIF9jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXSA9IHBsdWdpbkNvbmZpZ1xuICB9XG5cbiAgZ2V0UGx1Z2luc01ldGhvZE9iaihwbHVnaW5NZXRob2RzT2JqKSB7XG4gICAgaWYgKHBsdWdpbk1ldGhvZHNPYmopIHtcbiAgICAgIHRoaXMuYWRkUGx1Z2luTWV0aG9kcyhwbHVnaW5NZXRob2RzT2JqKVxuICAgIH1cblxuICAgIHJldHVybiBfc3B5bmVQbHVnaW5NZXRob2RzLnBsdWdpbk1ldGhvZHNPYmpcbiAgfVxuXG4gIGFkZFBsdWdpbk1ldGhvZHMocGx1Z2luTWV0aG9kcykge1xuICAgIGlmIChwbHVnaW5NZXRob2RzKSB7XG4gICAgICBfc3B5bmVQbHVnaW5NZXRob2RzLmFkZE1ldGhvZHMocGx1Z2luTWV0aG9kcylcbiAgICB9XG4gIH1cblxuICBkb05vdFRyYWNrQ2hhbm5lbChjaGFubmVsTmFtZSkge1xuICAgIF9kb05vdFRyYWNrQ2hhbm5lbHNBcnIucHVzaChjaGFubmVsTmFtZSlcbiAgfVxuXG4gIGdldFVudHJhY2tlZENoYW5uZWxzTGlzdCgpIHtcbiAgICByZXR1cm4gX2RvTm90VHJhY2tDaGFubmVsc0FyclxuICB9XG5cbiAgcmVnaXN0ZXJQcm94eVJldml2ZXIobmFtZSwgbWV0aG9kKSB7XG4gICAgX3Byb3hpZXNNYXAuc2V0KG5hbWUsIG1ldGhvZClcbiAgICAvLyBjb25zb2xlLmxvZyhcIlJFR0lTVEVSRCBQUk9YWSBSRVZJVkVSXCIsX3Byb3hpZXNNYXAsIF9wcm94aWVzTWFwLmdldChuYW1lKSk7XG4gIH1cblxuICAvLyBUaGlzIGlzIHRoZSBuZXcgbWV0aG9kIHlvdSBhZGRcbiAgcmVnaXN0ZXJQbHVnaW4ocGx1Z2luSW5zdGFuY2UpIHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NweW5lQXBwIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuIFBsdWdpbiB3aWxsIG5vdCBiZSBmdWxseSByZWdpc3RlcmVkLicpXG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0UgXCIsdGhpcywgcGx1Z2luSW5zdGFuY2UpXG5cbiAgICBwbHVnaW5JbnN0YW5jZS5yZWdpc3Rlcih0aGlzKVxuICB9XG5cbiAgZ2V0UHJveHlSZXZpdmVyKHByb3h5TmFtZSkge1xuICAgIHJldHVybiBfcHJveGllc01hcC5nZXQocHJveHlOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgQ01TIHJlLWh5ZHJhdGlvbiBob29rIGNvbnN1bHRlZCBieSBEb21FbGVtZW50VGVtcGxhdGUgd2hlblxuICAgKiBpdCByZWNlaXZlcyBwbGFpbiAodW5wcm94aWVkKSBkYXRhIHdoaWxlIENNUyBwcm94aWVzIGFyZSBlbmFibGVkLiBUaGVcbiAgICogaG9vayByZWNlaXZlcyB0aGUgdGVtcGxhdGUgZGF0YSBhbmQgcmV0dXJucyBlaXRoZXIgcmV2aXZlZCBwcm94eSBkYXRhXG4gICAqIGZvciB0aGF0IGNvbnRlbnQgb3IgdW5kZWZpbmVkIHRvIGRlY2xpbmUuIEltcGxlbWVudGF0aW9ucyBtdXN0IGJlIGNoZWFwXG4gICAqIGZvciBub24tQ01TIGRhdGEg4oCUIGlkZWFsbHkgYSBzaW5nbGUgb3duLXByb3BlcnR5IHJlYWQgYmVmb3JlIGJhaWxpbmcuXG4gICAqL1xuICByZWdpc3RlckNtc1JlaHlkcmF0b3IobWV0aG9kKSB7XG4gICAgX2Ntc1JlaHlkcmF0b3IgPSBtZXRob2RcbiAgfVxuXG4gIGdldCByZWh5ZHJhdGVDbXNEYXRhKCkge1xuICAgIHJldHVybiBfY21zUmVoeWRyYXRvclxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgZGVidWctbW9kZSBob29rIERvbUVsZW1lbnRUZW1wbGF0ZSBjYWxscyB3aGVuIGRhdGEgcmVuZGVyc1xuICAgKiB1bnByb3hpZWQgd2hpbGUgQ01TIHByb3hpZXMgYXJlIGVuYWJsZWQgYW5kIHJlLWh5ZHJhdGlvbiBkZWNsaW5lZCDigJRcbiAgICogdGhlIGxpbmVhZ2UgcmVwb3J0ZXIgdGhhdCB0dXJucyBzaWxlbnQgcHJveHkgc3RyaXBzIGludG8gd2FybmluZ3MuXG4gICAqL1xuICByZWdpc3RlckNtc0xpbmVhZ2VXYXJuZXIobWV0aG9kKSB7XG4gICAgX2Ntc0xpbmVhZ2VXYXJuZXIgPSBtZXRob2RcbiAgfVxuXG4gIGdldCB3YXJuVW5wcm94aWVkQ21zRGF0YSgpIHtcbiAgICByZXR1cm4gX2Ntc0xpbmVhZ2VXYXJuZXJcbiAgfVxuXG4gIGdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZShwbHVnaW5OYW1lKSB7XG4gICAgcmV0dXJuIF9jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXVxuICB9XG5cbiAgZ2V0IElNR19QQVRIKCkge1xuICAgIHJldHVybiBfSU1HX1BBVEhcbiAgfVxuXG4gIGdldCBleGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZSgpIHtcbiAgICByZXR1cm4gX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlXG4gIH1cblxuICAvLyBTZXR0ZXIgZm9yIF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZVxuICBzZXQgZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gUHVzaCBhIHNpbmdsZSBzdHJpbmcgaW50byB0aGUgYXJyYXkgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgaWYgKCFfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgIF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS5wdXNoKHZhbHVlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIE1lcmdlIGFuIGFycmF5IGludG8gdGhlIGV4aXN0aW5nIGFycmF5LCBhdm9pZGluZyBkdXBsaWNhdGVzXG4gICAgICB2YWx1ZS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnICYmICFfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgICAgICBfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdmFsdWUgcHJvdmlkZWQgdG8gZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUuIE9ubHkgc3RyaW5ncyBvciBhcnJheXMgYXJlIGFsbG93ZWQuJylcbiAgICB9XG4gIH1cblxuICBnZXQgbGlua3NEYXRhKCkge1xuICAgIGNvbnNvbGUud2FybignZ2V0IGxpbmtzIGRhdGEgaW4gU3B5bmVBcHBQcm9wZXJ0aWVzIGlzIGRlcHJlY2F0ZWQsIHVzZSBuYXZMaW5rcycpXG4gICAgcmV0dXJuIF9uYXZMaW5rc1xuICB9XG5cbiAgc2V0IGxpbmtzRGF0YShhcnIpIHtcbiAgICBjb25zb2xlLndhcm4oJ3NldCBsaW5rcyBkYXRhIGluIFNweW5lQXBwUHJvcGVydGllcyBpcyBkZXByZWNhdGVkLCB1c2UgbmF2TGlua3MnKVxuICB9XG5cbiAgZ2V0IG5hdkxpbmtzKCkge1xuICAgIHJldHVybiBfbmF2TGlua3NcbiAgfVxuXG4gIHNldCBuYXZMaW5rcyhhcnIpIHtcbiAgICBfbmF2TGlua3MgPSBhcnJcbiAgfVxuXG4gIGdldCBlbmFibGVDTVNQcm94aWVzKCl7XG4gICAgcmV0dXJuIF9lbmFibGVDTVNQcm94aWVzXG4gIH1cblxuICBnZXRIcmVmRnJvbURhdGEocm91dGVQcm9wcz17fSl7XG5cbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jb252ZXJ0UGFyYW1zVG9Sb3V0ZShyb3V0ZVByb3BzKTtcblxuICB9XG5cbiAgc2V0IGVuYWJsZUNNU1Byb3hpZXMoYm9vbD10cnVlKXtcbiAgICBfZW5hYmxlQ01TUHJveGllcyA9IEJvb2xlYW4oYm9vbCk7XG4gIH1cblxuICBzZXRDTVNQcm94eU1ldGhvZChmbil7XG4gICAgdGhpcy5lbmFibGVDTVNQcm94aWVzID0gdHJ1ZTtcbiAgICB0aGlzLmZvcm1hdFRlbXBsYXRlRm9yUHJveHlEYXRhID0gZm47XG5cbiAgfVxuXG4gIHRlbXBHZXRDaGFubmVsc0luc3RhbmNlKCkge1xuXG4gIH1cblxuICB0ZW1wR2V0Q29uZmlnKCkge1xuXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFNweW5lQXBwUHJvcGVydGllcyA9IG5ldyBTcHluZUFwcFByb3BlcnRpZXNDbGFzcygpXG4iLCJpbXBvcnQgeyBhbGxQYXNzLCBjb21wb3NlLCBpcywga2V5cywgbm90LCBwcm9wIH0gZnJvbSAncmFtZGEnXG5cbmNvbnN0IF9wbHVnaW5NZXRob2RzT2JqID0gT2JqZWN0LmNyZWF0ZSh7fSlcblxuY29uc3QgaXNOb3RBcnIgPSBjb21wb3NlKG5vdCwgaXMoQXJyYXkpKVxuLy8gY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBvc2Uobm90LCBpc0VtcHR5KVxuLy8gY29uc3QgaXNOb25FbXB0eVN0ciA9IGFsbFBhc3MoW2lzKFN0cmluZyksIGlzTm90RW1wdHldKVxuLy8gY29uc3QgaXNOb25FbXB0eUFyciA9IGFsbFBhc3MoW2lzKEFycmF5KSwgaXNOb3RFbXB0eV0pXG5jb25zdCBpc09iamVjdEZuID0gY29tcG9zZShhbGxQYXNzKFtpc05vdEFyciwgaXMoT2JqZWN0KV0pKVxuLy8gY29uc3QgaXNOb25FbXB0eU9iamVjdEZuID0gY29tcG9zZShhbGxQYXNzKFtpc05vdEVtcHR5LCBpc05vdEFyciwgaXMoT2JqZWN0KV0pKVxuXG5leHBvcnQgY2xhc3MgU3B5bmVQbHVnaW5zTWV0aG9kcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIF9wbHVnaW5NZXRob2RzT2JqLmZvbyA9ICgpID0+IGNvbnNvbGUubG9nKCd1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLicpXG4gIH1cblxuICBhZGRNZXRob2Qoa2V5LCBmbiwgdGVzdCA9IGZhbHNlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfcGx1Z2luTWV0aG9kc09iaiwga2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgd2FyblN0ciA9IGBTcHluZSBXYXJuaW5nOiB0aGUgbWV0aG9kIG5hbWUsICR7a2V5fSwgYWxyZWFkeSBleGlzdHMuYFxuICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgcmV0dXJuIHdhcm5TdHJcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgIH0gZWxzZSB7XG4gICAgICBfcGx1Z2luTWV0aG9kc09ialtrZXldID0gZm5cbiAgICB9XG4gIH1cblxuICBhZGRNZXRob2RzKG1ldGhvZHNPYmogPSB7fSwgdGVzdCA9IGZhbHNlKSB7XG4gICAgbGV0IHdhcm5TdHJcblxuICAgIGNvbnN0IGlzT2JqID0gaXNPYmplY3RGbihtZXRob2RzT2JqKVxuXG4gICAgaWYgKGlzT2JqID09PSBmYWxzZSkge1xuICAgICAgd2FyblN0ciA9IGBTcHluZSBXYXJuaW5nOiB0aGUgcGx1Z2luTWV0aG9kcyBwcm9wZXJ0eSwgJHtKU09OLnN0cmluZ2lmeShtZXRob2RzT2JqKX0gbmVlZHMgdG8gYmUgYW4gb2JqZWN0LmBcbiAgICAgIGlmICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiB3YXJuU3RyXG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4od2FyblN0cilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrRWFjaEtleUZvclZhbGlkTWV0aG9kID0gKGtleVN0cikgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kVmFsID0gcHJvcChrZXlTdHIsIG1ldGhvZHNPYmopXG5cbiAgICAgIGNvbnN0IGlzRnVuY3Rpb24gPSB0eXBlb2YgKG1ldGhvZFZhbCkgPT09ICdmdW5jdGlvbidcblxuICAgICAgaWYgKGlzRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5hZGRNZXRob2Qoa2V5U3RyLCBtZXRob2RWYWwsIHRlc3QpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuU3RyID0gYHRoZSB2YWx1ZSBmb3IgJHtrZXlTdHJ9IGlzIG5vdCBhIHZhbGlkIGZ1bmN0aW9uLmBcbiAgICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgICByZXR1cm4gd2FyblN0clxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kS2V5cyA9IGtleXMobWV0aG9kc09iailcblxuICAgIHJldHVybiBtZXRob2RLZXlzLm1hcChjaGVja0VhY2hLZXlGb3JWYWxpZE1ldGhvZCkuam9pbignLCcpXG4gIH1cblxuICBjaGVja0lmTWV0aG9kRXhpc3RzKGtleSkge1xuXG4gIH1cblxuICBnZXQgcGx1Z2luTWV0aG9kc09iaigpIHtcbiAgICByZXR1cm4gX3BsdWdpbk1ldGhvZHNPYmpcbiAgfVxufVxuIiwiaW1wb3J0IHsgZ2V0QWxsTWV0aG9kTmFtZXMgfSBmcm9tICcuL2ZycC10b29scy5qcydcbmltcG9ydCB7IHJlamVjdCwgY3VycnlOLCBfXywgbWFwIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVUcmFpdCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lVHJhaXRcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKiBAcGFyYW0ge3RoaXN9IHBhcmVudENvbnRleHRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF1dG9Jbml0XG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge3RoaXN9IHBhcmVudENvbnRlbnQgLSA9IHVuZGVmaW5lZDsgVGhpcyBiaW5kcyBhbGwgbWV0aG9kcyB3aXRoaW4gU3B5bmVUcmFpdCBpbnRvIHRoZSBwYXJlbnRDb250ZXh0J3Mgb2JqZWN0XG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcmVmaXggLSA9IHVuZGVmaW5lZDsgU3B5bmVUcmFpdHMgZm9yY2VzIGFsbCBtZXRob2QgbmFtZXMgdG8gYmVnaW4gd2l0aCB0aGUgc2FtZSBwcmVmaXguIFRoaXMgYWxsb3dzIG90aGVyIG9iamVjdHMgdG8gcXVpY2tseSB1bmRlcnN0YW5kIHdoZXJlIHRoZSBvcmlnaW5hbCBtZXRob2QgaXMgc2V0LlxuICAgKiBAZGVzY1xuICAgKiBTcHluZVRyYWl0cyBhbGxvdyB0aGUgZWhhbmNpbmcgb2YgY2xhc3NlcyBhbmQgb3RoZXIgb2JqZWN0cyB3aXRob3V0IGhhdmluZyB0byBleHRlbmQgY2xhc3NlcyBvciBtYW5pcHVsYXRlIGZ1bmN0aW9uIHByb3RvdHlwZXNcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IocGFyZW50Q29udGV4dCwgcHJlZml4ID0gJycsIGF1dG9Jbml0ID0gdHJ1ZSkge1xuICAgIHRoaXMucGFyZW50Q29udGV4dCA9IHBhcmVudENvbnRleHRcbiAgICB0aGlzLm9taXR0ZWRNZXRob2RzID0gW1xuICAgICAgJ2F1dG9CaW5kZXInLFxuICAgICAgJ2luaXRBdXRvQmluZGVyJyxcbiAgICAgICdnZXRFbmhhbmNlck1ldGhvZHMnLFxuICAgICAgJ2NoZWNrRm9yTWFsZm9ybWVkTWV0aG9kcycsXG4gICAgICAnY2FsbGVyJyxcbiAgICAgICdhcmd1bWVudHMnLFxuICAgICAgJ2JpbmRQYXJlbnRWaWV3U3RyZWFtJ11cblxuICAgIHRoaXMucHJlZml4ID0gcHJlZml4XG5cbiAgICBpZiAoYXV0b0luaXQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuYXV0b0JpbmRlcigpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFsbE1ldGhvZHNMaXN0XG4gIH1cblxuICBpbml0QXV0b0JpbmRlcigpIHtcbiAgICB0aGlzLmF1dG9CaW5kZXIoKVxuICB9XG5cbiAgZ2V0RW5oYW5jZXJNZXRob2RzKCkge1xuICAgIHJldHVybiBnZXRBbGxNZXRob2ROYW1lcyh0aGlzLCB0aGlzLm9taXR0ZWRNZXRob2RzKVxuICB9XG5cbiAgY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzKG1ldGhvZHNBcnIpIHtcbiAgICBjb25zdCBpc0RlYnVnTW9kZSA9IFNweW5lQXBwUHJvcGVydGllcz8uZGVidWcgfHwgZmFsc2VcblxuICAgIGlmICh0aGlzLnByZWZpeCA9PT0gJycgJiYgaXNEZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU1BZTkUgV0FSTklORzogVGhlIGZvbGxvd2luZyBTcHluZVRyYWl0ICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBuZWVkcyBhIHByZWZpeGApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gbGV0IHJlU3RyID0gYF4oJHt0aGlzLnByZWZpeH0pKC4qKSRgO1xuICAgIC8vIGxldCByZSA9IG5ldyBSZWdFeHAocmVTdHIpO1xuICAgIGNvbnN0IGhhc1ByZWZpeCA9IChzdHIpID0+IHN0ci5pbmRleE9mKHRoaXMucHJlZml4KSA9PT0gMFxuXG4gICAgY29uc3QgbWFsZm9ybWVkTWV0aG9kc0FyciA9IHJlamVjdChoYXNQcmVmaXgsIG1ldGhvZHNBcnIpXG4gICAgaWYgKG1hbGZvcm1lZE1ldGhvZHNBcnIubGVuZ3RoID49IDEgJiYgaXNEZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnN0IHdhcm5pbmdTdHIgPSBgU3B5bmUgV2FybmluZzogVGhlIGZvbGxvd2luZyBtZXRob2QocykgaW4gJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IHJlcXVpcmUgdGhlIHByZWZpeCwgXCIke3RoaXMucHJlZml4fVwiOiBbJHttYWxmb3JtZWRNZXRob2RzQXJyLmpvaW4oJywgJyl9XTtgXG4gICAgICBjb25zb2xlLndhcm4od2FybmluZ1N0cilcbiAgICB9XG4gIH1cblxuICBiaW5kUGFyZW50Vmlld1N0cmVhbShtZXRob2RzT2JqLCBjb250ZXh0KSB7XG4gICAgdGhpcy5jaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMobWV0aG9kc09iai5hbGxNZXRob2RzKVxuICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgY29uc3QgYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0gPSAoc3RyLCBpc1N0YXRpYyA9IGZhbHNlKSA9PiB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvclR5cGUgPSBpc1N0YXRpYyA9PT0gdHJ1ZSA/IHRoaXMuY29uc3RydWN0b3IgOiB0aGlzXG4gICAgICBjb25zdCBwcm9wZXJ0eVR5cGUgPSB0eXBlb2YgKGNvbnN0cnVjdG9yVHlwZVtzdHJdKVxuICAgICAgaWYgKHByb3BlcnR5VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmpbc3RyXSA9IGNvbnRleHRbc3RyXSA9IGNvbnN0cnVjdG9yVHlwZVtzdHJdLmJpbmQoY29udGV4dClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBiaW5kQ3VycnkgPSBjdXJyeU4oMiwgYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0pXG4gICAgY29uc3QgYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0gPSBiaW5kQ3VycnkoX18sIHRydWUpXG4gICAgLy8gTUFQIFNUQVRJQyBNRVRIT0RTXG4gICAgbWFwKGJpbmRTdGF0aWNNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtLCBtZXRob2RzT2JqLnN0YXRpY01ldGhvZHMpXG4gICAgLy8gTUFQIE1BSU4gTUVUSE9EU1xuICAgIG1hcChiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSwgbWV0aG9kc09iai5tZXRob2RzKVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGF1dG9CaW5kZXIoKSB7XG4gICAgY29uc3QgYWxsTWV0aG9kcyA9IHRoaXMuZ2V0RW5oYW5jZXJNZXRob2RzKClcbiAgICAvLyBjb25zb2xlLmxvZygnYWxsICcsYWxsTWV0aG9kcyk7XG4gICAgdGhpcy5hbGxNZXRob2RzTGlzdCA9IHRoaXMuYmluZFBhcmVudFZpZXdTdHJlYW0oYWxsTWV0aG9kcywgdGhpcy5wYXJlbnRDb250ZXh0KVxuICAgIHJldHVybiB0aGlzLmFsbE1ldGhvZHNMaXN0XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzRW1wdHksIGhlYWQsIHZhbHVlcywgY29tcG9zZSwgcHJvcCwgY29tcGxlbWVudCwgaXNOaWwsIGFsbFBhc3MsIHJlZHVjZSwgZmlsdGVyLCBlcXVhbHMsIHRvUGFpcnMsIHJlcGxhY2UsIGVpdGhlciwgcHJvcEVxLCBfXywgaW52ZXJ0LCBwYXRoLCB6aXBPYmosIHJlamVjdCwga2V5cywgZmluZCwgYXNzb2MsIGlzLCBoYXMsIHdoZW4sIHNwbGl0LCBhbHdheXMsIGNvbmNhdCwgam9pbiwgZmxhdHRlbiwgbWFwLCBpZkVsc2UsIHRlc3QsIGZpbmRMYXN0SW5kZXgsIGxhc3QsIGRlZmF1bHRUbywgZnJvbVBhaXJzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybFxuICAgICAqIEB0eXBlIGludGVybmFsXG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAZGVzY1xuICAgICAqIEludGVybmFsIHVybCBtZXRob2RzIGZvciB0aGUgU3B5bmVSb3V0ZUNoYW5uZWxcbiAgICAgKi9cbiAgICB0aGlzLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwuYmluZCh0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwob2JqKSB7XG4gICAgY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBvc2UoY29tcGxlbWVudChpc0VtcHR5KSwgaGVhZCwgdmFsdWVzKVxuICAgIGNvbnN0IGlzTm90TmlsID0gY29tcG9zZShjb21wbGVtZW50KGlzTmlsKSwgaGVhZCwgdmFsdWVzKVxuICAgIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90TmlsXSlcbiAgICByZXR1cm4gaXNOb3ROaWxBbmRJc05vdEVtcHR5KG9iailcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmUGFyYW1WYWx1ZU1hdGNoZXNSZWdleChwYXJhbVZhbHVlLCByb3V0ZU9iaikge1xuICAgIGNvbnN0IHJlamVjdFBhcmFtS2V5ID0gcmVqZWN0KGVxdWFscygncm91dGVOYW1lJykpXG4gICAgY29uc3Qga2V5c0FyciA9IGNvbXBvc2UocmVqZWN0UGFyYW1LZXksIGtleXMpXG4gICAgY29uc3QgdGVzdEZvclJlZ2V4TWF0Y2ggPSBzdHIgPT4gdGVzdChuZXcgUmVnRXhwKHN0ciksIHBhcmFtVmFsdWUpXG4gICAgY29uc3QgY2hlY2tlciA9IGNvbXBvc2UoZmluZCh0ZXN0Rm9yUmVnZXhNYXRjaCksIGtleXNBcnIpXG4gICAgY29uc3QgcmVnZXhNYXRjaFN0ciA9IGNoZWNrZXIocm91dGVPYmopXG4gICAgaWYgKGlzKFN0cmluZywgcmVnZXhNYXRjaFN0cikpIHtcbiAgICAgIHJvdXRlT2JqID0gYXNzb2MocGFyYW1WYWx1ZSwgcHJvcChyZWdleE1hdGNoU3RyLCByb3V0ZU9iaiksIHJvdXRlT2JqKVxuICAgIH1cbiAgICByZXR1cm4gcm91dGVPYmpcbiAgfVxuXG4gIHN0YXRpYyBmb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uKHN0cikge1xuICAgIGNvbnN0IGhhc2ggPSBzdHJcbiAgICBjb25zdCBzZWFyY2ggPSBzdHJcbiAgICBjb25zdCBwYXRobmFtZSA9IHN0clxuICAgIHJldHVybiB7IGhhc2gsIHNlYXJjaCwgcGF0aG5hbWUgfVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uU3RyQnlUeXBlKHQsIGlzSGFzaCA9IGZhbHNlLCBsb2MgPSB3aW5kb3cubG9jYXRpb24pIHtcbiAgICBjb25zdCB0eXBlID0gaXNIYXNoID09PSB0cnVlID8gJ2hhc2gnIDogdFxuXG4gICAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAgIHNsYXNoOiAncGF0aG5hbWUnLFxuICAgICAgcXVlcnk6ICdzZWFyY2gnLFxuICAgICAgaGFzaDogJ2hhc2gnXG4gICAgfVxuICAgIGNvbnN0IHByb3BWYWwgPSB0eXBlTWFwW3R5cGVdXG4gICAgY29uc3Qgc3RyICA9IHByb3AocHJvcFZhbCwgbG9jKVxuICAgIGNvbnN0IGNoZWNrRm9yU2xhc2hBbmRIYXNoID0gL14oXFwvKT8oIyk/KFxcLyk/KC4qKSQvXG4gICAgLy8gY29uc29sZS5sb2coXCJEQVRBIExPQyBTVFIgXCIse3N0ciwgbG9jLCBwcm9wLCB0eXBlLGlzSGFzaH0pO1xuICAgIHJldHVybiBzdHIucmVwbGFjZShjaGVja0ZvclNsYXNoQW5kSGFzaCwgJyQ0JylcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVSb3V0ZUFycmF5RnJvbVBhcmFtcyhkYXRhLCByb3V0ZSwgdCA9ICdzbGFzaCcsIHBhcmFtc0Zyb21Mb2MpIHtcbiAgICBjb25zdCB1cmxBcnIgPSBbXVxuICAgIGNvbnN0IGxvb3BUaHJvdWdoUGFyYW0gPSAocm91dGVPYmopID0+IHtcbiAgICAgIGNvbnN0IHVybE9iaiA9IHt9XG4gICAgICBjb25zdCBrZXl3b3JkID0gcm91dGVPYmoucm91dGVOYW1lIC8vIFBBUkFNIEZPUk0gU1BZTkUgQ09ORklHXG4gICAgICBsZXQgcGFyYW1WYWxGcm9tRGF0YSA9IGRhdGFba2V5d29yZF0gIT09IHVuZGVmaW5lZCA/IGRhdGFba2V5d29yZF0gOiBwcm9wKGtleXdvcmQsIHBhcmFtc0Zyb21Mb2MpIC8vIFBVTEwgVkFMVUUgRk9SIFRISVMgUEFSQU0gRlJPTSBEQVRBXG4gICAgICBjb25zdCBwYXJhbVZhbFR5cGUgPSB0eXBlb2YgKHJvdXRlT2JqW3BhcmFtVmFsRnJvbURhdGFdKVxuXG4gICAgICBpZiAocGFyYW1WYWxUeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBwYXJhbVZhbEZyb21EYXRhID0gcm91dGVPYmpbcGFyYW1WYWxGcm9tRGF0YV1cbiAgICAgIH0gZWxzZSBpZiAocGFyYW1WYWxUeXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByb3V0ZU9iaiA9IHRoaXMuY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgocGFyYW1WYWxGcm9tRGF0YSwgcm91dGVPYmopXG4gICAgICB9XG5cbiAgICAgIHVybE9ialtrZXl3b3JkXSA9IHBhcmFtVmFsRnJvbURhdGFcblxuICAgICAgaWYgKHRoaXMuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCh1cmxPYmopKSB7XG4gICAgICAgIHVybEFyci5wdXNoKHVybE9iailcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNPYmplY3QgPSBpcyhPYmplY3QsIHJvdXRlT2JqKVxuICAgICAgY29uc3Qgb2JqZWN0UGFyYW1FeGlzdHMgPSBoYXMocGFyYW1WYWxGcm9tRGF0YSwgcm91dGVPYmopXG4gICAgICBjb25zdCBvYmplY3RDb250YWluc1JvdXRlID0gaGFzKCdyb3V0ZVBhdGgnLCByb3V0ZU9iailcbiAgICAgIGNvbnN0IHJlY3Vyc2l2ZWx5Q2FsbExvb3BCb29sID0gb2JqZWN0UGFyYW1FeGlzdHMgJiYgaXNPYmplY3RcbiAgICAgIGlmIChyZWN1cnNpdmVseUNhbGxMb29wQm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBuZXdPYmogPSByb3V0ZU9ialtwYXJhbVZhbEZyb21EYXRhXVxuICAgICAgICBpZiAoaGFzKCdyb3V0ZVBhdGgnLCBuZXdPYmopKSB7XG4gICAgICAgICAgbG9vcFRocm91Z2hQYXJhbShuZXdPYmoucm91dGVQYXRoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG9iamVjdENvbnRhaW5zUm91dGUgPT09IHRydWUgJiYgcGFyYW1WYWxGcm9tRGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvb3BUaHJvdWdoUGFyYW0ocm91dGVPYmoucm91dGVQYXRoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxvb3BUaHJvdWdoUGFyYW0ocm91dGUpXG5cbiAgICByZXR1cm4gdXJsQXJyXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlU2xhc2hTdHJpbmcoYXJyKSB7XG4gICAgY29uc3QgYXJyQ2xlYXIgPSByZWplY3QoaXNOaWwpXG4gICAgY29uc3Qgbm90VW5kZWZpbmVkID0gd2hlbihjb21wbGVtZW50KGlzTmlsLCBfXyksIGpvaW4oJy8nKSlcbiAgICBjb25zdCBzdHJpcFJlZ2V4ID0gcmVwbGFjZSgvXihcXF4qKSguKnxeXFwkKShcXCQpJC8sICckMicpXG4gICAgY29uc3Qgam9pbmVyID0gY29tcG9zZShzdHJpcFJlZ2V4LCBub3RVbmRlZmluZWQsIGFyckNsZWFyLCBmbGF0dGVuLCBtYXAodmFsdWVzKSlcbiAgICByZXR1cm4gam9pbmVyKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVRdWVyeVN0cmluZyhhcnIpIHtcbiAgICBjb25zdCBhcnJDbGVhciA9IHJlamVjdChpc05pbClcblxuICAgIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IHRoaXMuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbFxuXG4gICAgY29uc3QgY3JlYXRlUGFpciA9IGNvbXBvc2UoXG4gICAgICBqb2luKCc9JyksXG4gICAgICBmbGF0dGVuLFxuICAgICAgdG9QYWlycylcblxuICAgIGNvbnN0IGNoZWNrUGFpciA9IGlmRWxzZShcbiAgICAgIGlzTm90TmlsQW5kSXNOb3RFbXB0eSxcbiAgICAgIGNyZWF0ZVBhaXIsXG4gICAgICBhbHdheXModW5kZWZpbmVkKVxuICAgIClcblxuICAgIGNvbnN0IG1hcEFycmF5T2ZQYWlycyA9IG1hcChjaGVja1BhaXIpXG5cbiAgICBjb25zdCBjaGVja0lmU3RySXNFbXB0eSA9IHdoZW4oXG4gICAgICBjb21wbGVtZW50KGlzRW1wdHkpLFxuICAgICAgY29uY2F0KCc/JykpXG5cbiAgICBjb25zdCBjcmVhdGVRcyA9IGNvbXBvc2UoXG4gICAgICBjaGVja0lmU3RySXNFbXB0eSxcbiAgICAgIGpvaW4oJyYnKSxcbiAgICAgIGFyckNsZWFyLFxuICAgICAgbWFwQXJyYXlPZlBhaXJzKVxuXG4gICAgcmV0dXJuIGNyZWF0ZVFzKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja1BheWxvYWRGb3JSZWdleE92ZXJyaWRlcyh1cmxzQXJyLCBkYXRhLCBwYXJzZVN0cmluZyA9ICdWYWx1ZScpIHtcbiAgICAvLyBDSEVDSyBJRiBQQVlMT0FEIEhBUyBBTlkgT1ZFUlJJREVTXG4gICAgY29uc3QgZ2V0UHJvcFZhbE92ZXJyaWRlID0gKGtleSkgPT4gcHJvcChgJHtrZXl9JHtwYXJzZVN0cmluZ31gLCBkYXRhKVxuXG4gICAgLy8gR0VUIEFOWSBQT1NTSUJMRSBWQUxVRSBVU0lORyBUSEUgQ1VSUkVOVCBLRVlcbiAgICBjb25zdCBnZXRPdmVycmlkZVZhbCA9IGNvbXBvc2UoZ2V0UHJvcFZhbE92ZXJyaWRlLCBoZWFkLCBrZXlzKVxuXG4gICAgLy8gTUFQIEFMTCBPQkpFQ1QgVkFMUyBUTyBURVNUIEZPUiBPVkVSUklERVNcbiAgICBjb25zdCBtYXBVcmxQcm9wcyA9IChwcm9wKSA9PiB7XG4gICAgICBjb25zdCBvdmVycmlkZVZhbCA9IGdldE92ZXJyaWRlVmFsKHByb3ApXG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFwib3ZlcnJpZGUgdmFsIFwiLG92ZXJyaWRlVmFsLCBkYXRhKTtcbiAgICAgIC8vIGlmIHJlZ2V4IHZhbHVlIGlzIGZvdW5kXG4gICAgICBpZiAob3ZlcnJpZGVWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYXNzb2MoY29tcG9zZShoZWFkLCBrZXlzKShwcm9wKSwgb3ZlcnJpZGVWYWwsIHByb3ApXG4gICAgICB9XG4gICAgICAvLyBpZGVudGl0eVxuICAgICAgcmV0dXJuIHByb3BcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwKG1hcFVybFByb3BzLCB1cmxzQXJyKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzKHVybHNBcnIpIHtcbiAgICAvLyBEZWZpbmUgdGhlIGludGVybmFsIG1ldGhvZCB0byBleHRyYWN0IHRoZSBzdHJpbmcgYmVmb3JlIHRoZSBwaXBlXG4gICAgY29uc3QgZ2V0U3RyaW5nQmVmb3JlUGlwZSA9IChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaCgvXltefF0qLylcbiAgICAgIHJldHVybiBtYXRjaCA/IChtYXRjaFswXSA9PT0gJ14kJyA/ICcnIDogbWF0Y2hbMF0pIDogaW5wdXRcbiAgICB9XG5cbiAgICBjb25zdCBtYXBVcmxBcnJPYmogPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCBwaXBlUmVkdWNlciA9IChhY2MsIGtleSkgPT4ge1xuICAgICAgICBhY2Nba2V5XSA9IGdldFN0cmluZ0JlZm9yZVBpcGUob2JqW2tleV0pXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9iaiA9IE9iamVjdC5rZXlzKG9iaikucmVkdWNlKHBpcGVSZWR1Y2VyLCB7fSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh1cmxzQXJyKSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHVybHNBcnIubWFwKG1hcFVybEFyck9iailcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsc0FyclxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUm91dGVWYWxzUGFydE1hdGNoKHVybHNBcnIsIGRhdGEgPSB7fSkge1xuICAgIC8qKlxuICAgICAqIDEuIExvb3AgdGhyb3VnaCB1cmxzQXJyXG4gICAgICogMi4gTG9vcCB0aHJvdWdoIHByb3BlcnRpZXNcbiAgICAgKiAzLiBBcHBseSBtYXRjaEdsb2JQYXR0ZXJuIHRvIGVhY2ggcHJvcGVydHkgdmFsdWUgYW5kIGNoZWNrIGZvciBtYXRjaCB3aXRoIGRhdGEgb2JqZWN0IHByb3BlcnR5XG4gICAgICogNC4gUmV0dXJuIHRoZSB1cGRhdGVkIG9iamVjdCB3aXRoIG1hdGNoZWQgdmFsdWVzLCBvciBrZWVwIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIGlmIG5vIG1hdGNoXG4gICAgICovXG5cbiAgICBjb25zdCBtYXRjaEdsb2JQYXR0ZXJuID0gKHN0ciwgZ2xvYlBhdHRlcm4pID0+IHtcbiAgICAgIGNvbnN0IGdsb2JQYXR0ZXJuTWF0Y2ggPSAocGF0dGVybiwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgZXNjYXBlZFBhdHRlcm4gPSBwYXR0ZXJuXG4gICAgICAgICAgLnJlcGxhY2UoL1stL1xcXFxeJCs/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICAgICAgICAucmVwbGFjZSgvXFwqL2csICdbXFxcXHdcXFxcZF8tXSonKSAvLyAqIHNob3VsZCBtYXRjaCBhbnkgc2VxdWVuY2Ugb2YgYWxwaGFudW1lcmljLCB1bmRlcnNjb3Jlcywgb3IgZGFzaGVzXG5cbiAgICAgICAgY29uc3QgcmVnZXhQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZFBhdHRlcm59JGApIC8vIE1hdGNoIHRoZSBmdWxsIHN0cmluZ1xuICAgICAgICByZXR1cm4gcmVnZXhQYXR0ZXJuLnRlc3QodmFsdWUpXG4gICAgICB9XG5cbiAgICAgIC8vIFNwbGl0IHRoZSBnbG9iUGF0dGVybiBieSBwaXBlICh8KVxuICAgICAgY29uc3QgcGF0dGVybnMgPSBnbG9iUGF0dGVybi5zcGxpdCgnfCcpXG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdHJpbmcgbWF0Y2hlcyBhbnkgb2YgdGhlIHBhdHRlcm5zXG4gICAgICBjb25zdCBoYXNNYXRjaCA9IHBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGdsb2JQYXR0ZXJuTWF0Y2gocGF0dGVybiwgc3RyKSlcblxuICAgICAgLy8gUmV0dXJuIHRoZSBzdHJpbmcgaWYgdGhlcmUncyBhIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBnbG9iIHBhdHRlcm5cbiAgICAgIHJldHVybiBoYXNNYXRjaCA/IHN0ciA6IGdsb2JQYXR0ZXJuXG4gICAgfVxuXG4gICAgLy8gRnVuY3Rpb24gdG8gY2hlY2sgYW5kIHJlcGxhY2UgbWF0Y2hpbmcgcHJvcGVydGllc1xuICAgIGNvbnN0IHJlcGxhY2VNYXRjaGluZ1Byb3BlcnR5ID0gKG9iaikgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZE9iaiA9IHsgLi4ub2JqIH0gLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgb2JqZWN0IHRvIGF2b2lkIG11dGF0aW9uXG5cbiAgICAgIC8vIEZ1bmN0aW9uIHRvIGNoZWNrIGVhY2ggcHJvcGVydHkgYW5kIGFwcGx5IG1hdGNoR2xvYlBhdHRlcm5cbiAgICAgIGNvbnN0IGNoZWNrQW5kUmVwbGFjZVByb3BlcnR5ID0gKGtleSkgPT4ge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHVwZGF0ZWRPYmosIGtleSkgJiYgZGF0YVtrZXldKSB7XG4gICAgICAgICAgdXBkYXRlZE9ialtrZXldID0gbWF0Y2hHbG9iUGF0dGVybihkYXRhW2tleV0sIHVwZGF0ZWRPYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdFxuICAgICAgT2JqZWN0LmtleXModXBkYXRlZE9iaikuZm9yRWFjaChjaGVja0FuZFJlcGxhY2VQcm9wZXJ0eSlcblxuICAgICAgcmV0dXJuIHVwZGF0ZWRPYmpcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggdGhlIGFycmF5IGFuZCByZXBsYWNlIG1hdGNoaW5nIHByb3BlcnRpZXNcbiAgICByZXR1cm4gdXJsc0Fyci5tYXAocmVwbGFjZU1hdGNoaW5nUHJvcGVydHkpXG4gIH1cblxuICBzdGF0aWMgY29udmVydFBhcmFtc1RvUm91dGUoZGF0YSwgciA9IFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUsIHQsIGxvY1N0cikge1xuICAgIGNvbnN0IHVybFR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogci50eXBlXG4gICAgY29uc3QgaXNIYXNoID0gci5pc0hhc2hcbiAgICBjb25zdCByb3V0ZSA9IHIucm91dGVzLnJvdXRlUGF0aFxuICAgIGNvbnN0IGxvY2F0aW9uU3RyID0gbG9jU3RyICE9PSB1bmRlZmluZWQgPyBsb2NTdHIgOiB0aGlzLmdldExvY2F0aW9uU3RyQnlUeXBlKHVybFR5cGUsIGlzSGFzaClcbiAgICBjb25zdCBwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uID0gdGhpcy5jb252ZXJ0Um91dGVUb1BhcmFtcyhsb2NhdGlvblN0ciwgciwgdXJsVHlwZSkucm91dGVEYXRhXG4gICAgbGV0IHVybEFyciA9IHRoaXMuY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMoZGF0YSwgcm91dGUsIHVybFR5cGUsIHBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24pXG5cbiAgICB1cmxBcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzKHVybEFyciwgZGF0YSlcbiAgICB1cmxBcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzKHVybEFycilcbiAgICAvLyBUSElTIFdJTEwgTUFUQ0ggRVhBQ1RMWSBUSEUgUFJPUEVSVFkgSUQsIFNPIHBhZ2VJZD1cImRhc2hib2FyZF8xXCIgd2lsbCByZXR1cm4gdGhhdCBpbnN0ZWFkIG9mIGdsb2JQYXR0ZXJuWzBdXG4gICAgLy8gdXJsQXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja0ZvclJvdXRlVmFsc1BhcnRNYXRjaCh1cmxBcnIsIGRhdGEpXG4gICAgLy8gY29uc29sZS5sb2coJ1BBUkFNUyBUTyBST1VURSAnLCB7IGRhdGEsIHIsIHVybEFyciwgbG9jYXRpb25TdHIsIHBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24gfSlcblxuICAgIC8vIFRISVMgQ1JFQVRFUyBBIFFVRVJZIFBBVEggU1RSXG4gICAgaWYgKHVybFR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVF1ZXJ5U3RyaW5nKHVybEFycilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTbGFzaFN0cmluZyh1cmxBcnIpXG4gIH1cblxuICBzdGF0aWMgZmluZEluZGV4T2ZNYXRjaGVkU3RyaW5nT3JSZWdleChtYWluU3RyLCBwYXJhbXNBcnIpIHtcbiAgICBjb25zdCBpczQwNCA9IHBhcmFtc0Fyci5pbmNsdWRlcygnLisnKVxuXG4gICAgY29uc3QgcmVGbiA9IChzKSA9PiB7XG4gICAgICBpZiAoaXM0MDQpIHtcbiAgICAgICAgaWYgKCFzLnN0YXJ0c1dpdGgoJ14nKSkge1xuICAgICAgICAgIHMgPSAnXicgKyBzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzLmVuZHNXaXRoKCckJykpIHtcbiAgICAgICAgICBzID0gcyArICckJ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHMpXG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tGb3JFbXB0eSA9ICByZXBsYWNlKC9eJC8sICdeJCcpXG4gICAgY29uc3QgY3JlYXRlU3RyUmVnZXhUZXN0ID0gKHN0cikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RyLFxuICAgICAgICByZTogcmVGbihzdHIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2ggPSAgZWl0aGVyKFxuICAgICAgcHJvcEVxKG1haW5TdHIsICdzdHInKSwgY29tcG9zZSh0ZXN0KF9fLCBtYWluU3RyKSwgcHJvcCgncmUnKSlcbiAgICApXG5cbiAgICBjb25zdCBmaW5kTWF0Y2hJbmRleCA9IGNvbXBvc2UoZmluZExhc3RJbmRleChlcXVhbHModHJ1ZSkpLCBtYXAoY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2gpLCBtYXAoY3JlYXRlU3RyUmVnZXhUZXN0KSwgbWFwKGNoZWNrRm9yRW1wdHkpKVxuXG4gICAgcmV0dXJuIGZpbmRNYXRjaEluZGV4KHBhcmFtc0FycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKG9iaiwgc3RyLCByZWdleFRva2Vucykge1xuICAgIC8vXG4gICAgLy9cbiAgICAvLyAgICAgICBUSElTIElTIEEgVkVSWSBJTVBPUlRBTlQgTUVUSE9EXG4gICAgLy8gICAgICAgSVQgQ09NUEFSRVMgVEhFIFNUUklORyBUTyBCRSBNQVRDSEVEIFdJVEggVEhFIFJPVVRFIFBBVEggT0JKRUNUXG4gICAgLy8gICAgICAgQU5EIElUIFdJTEwgUkVUVVJOIE9ORSBPRiBUSFJFRSBUSElOR1NcbiAgICAvLyAgICAgICAxLiBUSEUgU1RSSU5HIElUU0VMRlxuICAgIC8vICAgICAgIDIuIEEgTUFUQ0hJTkcgS0VZIEZST00gVEhFIENVUlJFTlQgT0JKRUNUXG4gICAgLy8gICAgICAgMy4gVEhFIFJPVVRFTkFNRVxuICAgIC8vXG5cbiAgICAvLyBHTyBUSFJPVUdIIEtFWVMgQU5EIENIRUNLIElGIFJFR0VYIE1BVENIRVNcblxuICAgIC8vIEdPIFRIUk9VR0ggUk9VVEUgQ09ORklHIFRPIEZJR1VSRSBPVVQgSUYgVkFMIE9SIEtFWSBTSE9VTEQgQkUgQ09NUEFSRURcbiAgICAvLyBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LCBjaG9vc2UgdGhlIGtleSBvZiB0aGUgcm91dGUgcGF0aCB0byBjaGVjayBhZ2FpbnN0XG4gICAgY29uc3QgZ2V0VmFsQ29tcGFyZUFyciA9IGNvbXBvc2UobWFwKGxhc3QpLCBtYXAoZmlsdGVyKGlzKFN0cmluZykpKSwgdG9QYWlycylcblxuICAgIC8vIENSRUFURSBUSEUgQVJSQVkgT0YgRUlUSEVSIFZBTFMgT1IgS0VZU1xuICAgIGNvbnN0IHBhcmFtc0FyciA9IGdldFZhbENvbXBhcmVBcnIob2JqKVxuXG4gICAgLy8gUkVTVUxUUyBGUk9NIFBBUkFNIENIRUNLXG4gICAgLy8gbGV0IHBhcmFtSW5kZXggPSBjaGVja0ZvclBhcmFtc01hdGNoKHBhcmFtc0Fycik7XG5cbiAgICBjb25zdCBwYXJhbUluZGV4ID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5maW5kSW5kZXhPZk1hdGNoZWRTdHJpbmdPclJlZ2V4KHN0ciwgcGFyYW1zQXJyKVxuXG4gICAgLy8gREVGQVVMVCBWQUwgRk9SIFNUUklOR1xuICAgIGxldCBwYXJhbVN0ciA9IHN0clxuXG4gICAgLy8gTEVHQUNZIE1FVEhPRCAtLSBUVVJOIE9GRlxuICAgIC8vIFdIRU4gVEhFUkUgSVMgQSBNQVRDSCBGUk9NIFRIRSBDVVJSRU5UIFJPVVRFIFBBVEggT0JKRUNUXG4gICAgaWYgKHBhcmFtSW5kZXggPj0gMCkge1xuICAgICAgY29uc3QgcGFyYW0gPSBwYXJhbXNBcnJbcGFyYW1JbmRleF1cbiAgICAgIGNvbnN0IGludmVydGVkT2JqID0gaW52ZXJ0KG9iailcblxuICAgICAgLy8gUFVMTCBJTlZFUlRFRCBPQkpFQ1QgVE8gU0VFIElGIFNUUiBNQVRDSEVTXG4gICAgICBjb25zdCBnZXRQYXJhbUludmVydGVkID0gY29tcG9zZShoZWFkLCBkZWZhdWx0VG8oW10pLCBwcm9wKHBhcmFtKSlcbiAgICAgIGNvbnN0IHBhcmFtSW52ZXJ0ZWQgPSBnZXRQYXJhbUludmVydGVkKGludmVydGVkT2JqKVxuICAgICAgLy8gc3B5bmUgMTEuMC4xO1xuICAgICAgY29uc3QgcmUgPSAgL14oWy0kXFx3XSopJC9cbiAgICAgIGNvbnN0IGtleU1hdGNoID0gIHJlLnRlc3QocGFyYW1JbnZlcnRlZClcblxuICAgICAgaWYgKGtleU1hdGNoID09PSB0cnVlICYmIGlzKFN0cmluZywgcGFyYW1JbnZlcnRlZCkgPT09IHRydWUpIHtcbiAgICAgICAgcGFyYW1TdHIgPSBwYXJhbUludmVydGVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtU3RyXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQXJyRnJvbVNsYXNoU3RyKHN0cikge1xuICAgIGNvbnN0IHNsYXNoUmUgPSAvXihbL10pPyguKikkL1xuICAgIHJldHVybiBzdHIucmVwbGFjZShzbGFzaFJlLCAnJDInKS5zcGxpdCgnLycpXG4gIH1cblxuICBzdGF0aWMgY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaih0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKSB7XG4gICAgY29uc3Qgcm91dGVWYWx1ZSA9IHN0clxuICAgIGNvbnN0IHZhbHVlc0FyciA9IHRoaXMuY3JlYXRlQXJyRnJvbVNsYXNoU3RyKHN0cilcbiAgICBjb25zdCBwYXRocyA9IFtdXG4gICAgY29uc3Qgcm91dGVkVmFsdWVzQXJyID0gW11cbiAgICBsZXQgbGF0ZXN0T2JqID0gdG9wTGV2ZWxSb3V0ZVxuICAgIGNvbnN0IGNyZWF0ZVBhcmFtc0Zyb21TdHIgPSAodG90YWwsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgcm91dGVWYWx1ZVN0ciA9IHRoaXMuY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbShsYXRlc3RPYmosIGN1cnJlbnRWYWx1ZSwgcmVnZXhUb2tlbnMpXG5cbiAgICAgIGxhdGVzdE9iaiA9IHRoaXMuY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgoY3VycmVudFZhbHVlLCBsYXRlc3RPYmopXG4gICAgICBjb25zdCBwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGggPSAoc3RyKSA9PiBzdHIgIT09IGxhc3QocGF0aHMpXG5cbiAgICAgIGNvbnN0IGlzRW1wdHlPck5pbCA9IGVpdGhlcihpc0VtcHR5LCBpc05pbClcblxuICAgICAgaWYgKGxhdGVzdE9iaiAhPT0gdW5kZWZpbmVkICYmIHByZXZQYXRoTm90RXFDdXJyZW50UGF0aChsYXRlc3RPYmoucm91dGVOYW1lKSAmJiBpc0VtcHR5T3JOaWwocm91dGVWYWx1ZVN0cikgPT09IGZhbHNlKSB7XG4gICAgICAgIHBhdGhzLnB1c2gobGF0ZXN0T2JqLnJvdXRlTmFtZSlcbiAgICAgICAgcm91dGVkVmFsdWVzQXJyLnB1c2gocm91dGVWYWx1ZVN0cilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0clBhdGggPSBbY3VycmVudFZhbHVlLCAncm91dGVQYXRoJ11cbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1QYXRoID0gWydyb3V0ZVBhdGgnXVxuICAgICAgY29uc3Qgb2JqZWN0RnJvbVN0ciA9IHBhdGgoc3RyUGF0aCwgbGF0ZXN0T2JqKVxuICAgICAgY29uc3Qgb2JqZWN0RnJvbVJvdXRlUGFyYW0gPSBwYXRoKHJvdXRlUGFyYW1QYXRoLCBsYXRlc3RPYmopXG5cbiAgICAgIGlmIChvYmplY3RGcm9tU3RyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGF0ZXN0T2JqID0gb2JqZWN0RnJvbVN0clxuICAgICAgfSBlbHNlIGlmIChvYmplY3RGcm9tUm91dGVQYXJhbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxhdGVzdE9iaiA9IG9iamVjdEZyb21Sb3V0ZVBhcmFtXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVkdWNlKGNyZWF0ZVBhcmFtc0Zyb21TdHIsIDAsIHZhbHVlc0FycilcbiAgICBjb25zdCByb3V0ZURhdGEgPSB6aXBPYmoocGF0aHMsIHJvdXRlZFZhbHVlc0FycilcbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gdGhpcy5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfVxuICB9XG5cbiAgc3RhdGljIGdldExhc3RBcnJWYWwoYXJyKSB7XG4gICAgY29uc3QgZ2V0TGFzdFBhcmFtID0gKGEpID0+IGxhc3QoYSkgIT09IHVuZGVmaW5lZCA/IGxhc3QoYSkgOiAnJ1xuICAgIHJldHVybiBnZXRMYXN0UGFyYW0oYXJyKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURlZmF1bHRQYXJhbUZyb21FbXB0eVN0cih0b3BMZXZlbFJvdXRlLCBzdHIpIHtcbiAgICBjb25zdCBvYmogPSB7fVxuICAgIGNvbnN0IGtleXdvcmQgPSB0b3BMZXZlbFJvdXRlLnJvdXRlTmFtZVxuICAgIG9ialtrZXl3b3JkXSA9IHRoaXMuY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbSh0b3BMZXZlbFJvdXRlLCBzdHIpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRRdWVyeVN0clRvUGFyYW1zKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpIHtcbiAgICBjb25zdCBxdWVyeVJlID0gL14oWz9dKT8oLiopJC9cbiAgICBjb25zdCByb3V0ZVZhbHVlID0gc3RyXG4gICAgY29uc3Qgc3RyQXJyID0gc3RyLnJlcGxhY2UocXVlcnlSZSwgJyQyJylcbiAgICBjb25zdCBjb252ZXJ0VG9QYXJhbXMgPSBjb21wb3NlKG1hcChzcGxpdCgnPScpKSwgc3BsaXQoJyYnKSlcbiAgICBjb25zdCBwYXJhbXNBcnIgPSBjb252ZXJ0VG9QYXJhbXMoc3RyQXJyKVxuICAgIGxldCByb3V0ZURhdGEgPSBmcm9tUGFpcnMocGFyYW1zQXJyKVxuXG4gICAgbGV0IHBhdGhzID0gbWFwKGhlYWQsIHBhcmFtc0FycilcblxuICAgIGlmIChpc0VtcHR5KHN0cikgPT09IHRydWUpIHtcbiAgICAgIHJvdXRlRGF0YSA9IHRoaXMuY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpXG4gICAgICBwYXRocyA9IGtleXMocm91dGVEYXRhKVxuICAgIH1cbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gdGhpcy5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9XG4gIH1cblxuICBzdGF0aWMgY29udmVydFJvdXRlVG9QYXJhbXMoc3RyLCByb3V0ZUNvbmZpZywgdCkge1xuICAgIGNvbnN0IGFkZFNsYXNoID0gKHVybCkgPT4gdXJsLnJlcGxhY2UoL1xcLyR8JC8sICcvJylcbiAgICBpZiAocm91dGVDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogcm91dGVDb25maWcudHlwZVxuICAgIGNvbnN0IHJlZ2V4VG9rZW5zID0gZGVmYXVsdFRvKHt9LCBwcm9wKCdyZWdleFRva2VucycsIHJvdXRlQ29uZmlnKSlcbiAgICBjb25zdCB0b3BMZXZlbFJvdXRlID0gcm91dGVDb25maWcucm91dGVzLnJvdXRlUGF0aFxuXG4gICAgaWYgKHR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRRdWVyeVN0clRvUGFyYW1zKHRvcExldmVsUm91dGUsIHN0cilcbiAgICB9XG4gICAgc3RyID0gYWRkU2xhc2goc3RyKVxuXG4gICAgcmV0dXJuIHRoaXMuY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaih0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKVxuICB9XG59XG4iLCJpbXBvcnQgeyBmcm9tRXZlbnRQYXR0ZXJuIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGxhc3QsIGZsYXR0ZW4sIGNsb25lLCBwaWNrLCBwcm9wLCBwaWNrQWxsLCBwYXRoLCBlcXVhbHMsIGNvbXBvc2UsIGtleXMsIGZpbHRlciwgcHJvcEVxLCB1bmlxLCBtYXAsIF9fLCBjaGFpbiwgaXMsIGluY2x1ZGVzLCBmcm9tUGFpcnMsIHJlamVjdCwgbWVyZ2VEZWVwUmlnaHQsIG1lcmdlUmlnaHQsIHRlc3QsIHRvUGFpcnMsIHZhbHVlcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB9IGZyb20gJy4vc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS11cmwuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzIGZvciB0aGUgU3B5bmVSb3V0ZUNoYW5uZWxcbiAgICAgKlxuICAgICAqL1xuICAgIHRoaXMuY3JlYXRlUG9wU3RhdGVTdHJlYW0gPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNyZWF0ZVBvcFN0YXRlU3RyZWFtLmJpbmQodGhpcylcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQb3BTdGF0ZVN0cmVhbShzdWJzY3JpYmVGbikge1xuICAgIGNvbnN0IGFkZEhhbmRsZXIgPSBmdW5jdGlvbihoYW5kbGVyKSB7XG4gICAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGhhbmRsZXJcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbigpIHt9XG4gICAgfVxuICAgIGNvbnN0IHBvcHVwT2JzJCA9IGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlcilcblxuICAgIHBvcHVwT2JzJC5zdWJzY3JpYmUoc3Vic2NyaWJlRm4pXG4gIH1cblxuICBzdGF0aWMgZ2V0TGFzdEFyclZhbChhcnIpIHtcbiAgICBjb25zdCBnZXRMYXN0UGFyYW0gPSAoYSkgPT4gbGFzdChhKSAhPT0gdW5kZWZpbmVkID8gbGFzdChhKSA6ICcnXG4gICAgcmV0dXJuIGdldExhc3RQYXJhbShhcnIpXG4gIH1cblxuICBzdGF0aWMgY29tcGFyZVJvdXRlS2V5d29yZHMob2JqID0ge30sIGFycikge1xuICAgIGNvbnN0IHBpY2tWYWx1ZXMgPSAobywgYSkgPT4gYSAhPT0gdW5kZWZpbmVkID8gcGljayhhLCBvKSA6IG9cbiAgICBsZXQgb2JqMSA9IHBpY2tWYWx1ZXMob2JqLCBhcnIpXG4gICAgcmV0dXJuIHtcbiAgICAgIHBpY2tWYWx1ZXMsXG4gICAgICBjb21wYXJlOiAob2JqID0ge30sIGFycikgPT4ge1xuICAgICAgICBjb25zdCBvYmoyID0gcGlja1ZhbHVlcyhvYmosIGFycilcbiAgICAgICAgY29uc3QgY29tcGFyZVByb3BzID0gcCA9PiB7XG4gICAgICAgICAgY29uc3QgcDEgPSBwcm9wKHAsIG9iajEpXG4gICAgICAgICAgY29uc3QgcDIgPSBwcm9wKHAsIG9iajIpXG4gICAgICAgICAgY29uc3Qgc2FtZSA9IGVxdWFscyhwMSwgcDIpXG4gICAgICAgICAgY29uc3QgcHJldmlvdXNFeGlzdHMgPSBwMSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3QgbmV4dEV4aXN0cyA9IHAyICE9PSB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkID0gIXNhbWVcbiAgICAgICAgICBjb25zdCBhZGRlZCA9IHByZXZpb3VzRXhpc3RzID09PSBmYWxzZSAmJiBuZXh0RXhpc3RzID09PSB0cnVlXG4gICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHByZXZpb3VzRXhpc3RzID09PSB0cnVlICYmIG5leHRFeGlzdHMgPT09IGZhbHNlXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJQOiBcIixwLHtzYW1lLCBwcmV2aW91c0V4aXN0cywgbmV4dEV4aXN0c30pO1xuICAgICAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICAgICAgb2JqW3BdID0geyBzYW1lLCBjaGFuZ2VkLCBhZGRlZCwgcmVtb3ZlZCwgcHJldmlvdXNFeGlzdHMsIG5leHRFeGlzdHMgfVxuICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVByZWQgPSBwID0+IGNvbXBvc2Uoa2V5cywgZmlsdGVyKHByb3BFcSh0cnVlLCBwKSkpXG5cbiAgICAgICAgY29uc3QgZ2V0UHJvcHNTdGF0ZSA9IGNvbXBvc2UobWFwKGNvbXBhcmVQcm9wcyksIHVuaXEsIGNoYWluKGtleXMpKShbb2JqMSwgb2JqMl0pXG4gICAgICAgIGNvbnN0IHBhdGhzQ2hhbmdlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ2NoYW5nZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgY29uc3QgcGF0aHNBZGRlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ2FkZGVkJyksIGdldFByb3BzU3RhdGUpXG4gICAgICAgIGNvbnN0IHBhdGhzUmVtb3ZlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ3JlbW92ZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgb2JqMSA9IG9iajJcbiAgICAgICAgcmV0dXJuIHsgcGF0aHNBZGRlZCwgcGF0aHNSZW1vdmVkLCBwYXRoc0NoYW5nZWQgfVxuICAgICAgfSxcblxuICAgICAgZ2V0Q29tcGFyZXI6ICgpID0+IG9iajFcblxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZUFyckRhdGEocm91dGVBcnIsIHBhcmFtc0Fycikge1xuICAgIGNvbnN0IHBhdGhzID0gIGZpbHRlcihpbmNsdWRlcyhfXywgcm91dGVBcnIpLCBwYXJhbXNBcnIpXG4gICAgY29uc3QgcGF0aElubmVybW9zdCA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuZ2V0TGFzdEFyclZhbChwYXRocylcbiAgICAvLyBjb25zb2xlLmxvZygnYXJyIGFuZCByb3V0ZU5hbWUgJyx7cGF0aHMsIHBhdGhJbm5lcm1vc3R9KTtcbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCB9XG4gIH1cblxuICBzdGF0aWMgZmxhdHRlbkNvbmZpZ09iamVjdChvYmopIHtcbiAgICBjb25zdCBnbyA9IChvYmpfKSA9PiBjaGFpbigoW2ssIHZdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgcmV0dXJuIG1hcCgoW2tfLCB2X10pID0+IFtgJHtrfS4ke2tffWAsIHZfXSwgZ28odikpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW1trLCB2XV1cbiAgICAgIH1cbiAgICB9LCB0b1BhaXJzKG9ial8pKVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJGTEFUVEVOOiBcIiwgdmFsdWVzKGZyb21QYWlycyhnbyhvYmopKSkpO1xuICAgIHJldHVybiB2YWx1ZXMoZnJvbVBhaXJzKGdvKG9iaikpKVxuICB9XG5cbiAgc3RhdGljIGFkZFJvdXRlRGF0YXNldHMoY2hhbm5lbFJvdXRlT2JqKSB7XG4gICAgLy8gY2hhbm5lbFJvdXRlT2JqLnR5cGU9J3F1ZXJ5JztcblxuICAgIGZ1bmN0aW9uIHJlbW92ZVVuZGVmaW5lZChhcnIpIHtcbiAgICAgIHJldHVybiBhcnIubWFwKG9iaiA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09ICd1bmRlZmluZWQnIHx8IG9ialtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmpba2V5XVxuICAgICAgICAgIH0gZWxzZSBpZiAob2JqW2tleV0gJiYgdHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIC8vIHJlY3Vyc2UgaWYgbmVzdGVkIG9iamVjdFxuICAgICAgICAgICAgb2JqW2tleV0gPSByZW1vdmVVbmRlZmluZWQoW29ialtrZXldXSlbMF1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ialxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCB7IHR5cGUsIGlzSGFzaCB9ID0gY2hhbm5lbFJvdXRlT2JqXG5cbiAgICAvLyBjcmVhdGUgaHJlZiBhbmQgY2hlY2sgdG8gc2VlIGlmIG5lZWQgdG8gY29udmVydCB0byBoYXNoIGhyZWYgbGlua3NcbiAgICBjb25zdCBnZXRIUkVGID0gKG9iaikgPT4ge1xuICAgICAgY29uc3Qgc2FudGl6ZUhSRUYgPSBzdHIgPT4ge1xuICAgICAgICBjb25zdCBocmVmUkUgPSAvXiguKlxcLykoW1xcdy1dKlxcLz8pKC4qKSQvZ21cbiAgICAgICAgLy8gY29uc3QgaHJlZlJFID0gL14oLipcXC8pKFtcXHctXSopKC4qKSQvZ207XG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKGhyZWZSRSwgJyQxJDInKVxuICAgICAgICAvLyBzdHIgPSBTdHJpbmcoc3RyKS5yZXBsYWNlKCdeJCcsIFwiXCIpO1xuICAgICAgICByZXR1cm4gc3RyXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhlYWRTdHJWYWwgPSB0eXBlID09PSAncXVlcnknID8gJycgOiBpc0hhc2ggPT09IHRydWUgPyAnIycgOiAnLydcbiAgICAgIGNvbnN0IGhyZWZTdHIgPSAgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jb252ZXJ0UGFyYW1zVG9Sb3V0ZShvYmosIGNoYW5uZWxSb3V0ZU9iailcbiAgICAgIHJldHVybiBoZWFkU3RyVmFsICsgc2FudGl6ZUhSRUYoaHJlZlN0cilcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgc3BlY2lhbCBjaGFycyBmcm9tIGhyZWZcbiAgICBjb25zdCBzYW5pdGl6ZVN0ciA9IChzdHIpID0+IFN0cmluZyhzdHIpLnJlcGxhY2UoLyhbXkEtWmEtejAtOS1fXSkvZywgJycpXG5cbiAgICAvLyB0ZXN0IHdoZXRoZXIgdG8gdXNlIGtleSBvciB2YWxcbiAgICBjb25zdCBpc1ZhbGlkU3RyUkUgPSAvXihbQS1aYS16MC05Xy1dKSskL21cblxuICAgIGNvbnN0IGNyZWF0ZUluaXRpYWxWYWxGbiA9IChhY2NNYWluID0gW10sIHJvdXRlUGF0aE9iaiwgb2JqQWNjID0ge30pID0+IHtcbiAgICAgIGxldCB7IHJvdXRlTmFtZSB9ID0gcm91dGVQYXRoT2JqXG5cbiAgICAgIGNvbnN0IHByb3BzUmVkdWNlciA9IChhY2MsIGFyclBhaXIpID0+IHtcbiAgICAgICAgY29uc3QgW2tleSwgdmFsXSA9IGFyclBhaXJcbiAgICAgICAgY29uc3QgaXNPYmplY3QgPSBpcyhPYmplY3QsIHZhbClcblxuICAgICAgICBjb25zdCBjcmVhdGVUaXRsZSA9IChzdHIpID0+IFN0cmluZyhzdHIpLnJlcGxhY2UoLyhbLV9dKS9nLCAnICcpLnRvVXBwZXJDYXNlKClcblxuICAgICAgICBjb25zdCBnZXRMaW5rVGV4dCA9IHN0ciA9PiB0ZXN0KGlzVmFsaWRTdHJSRSwgc3RyKSA/IGNyZWF0ZVRpdGxlKHN0cikgOiBrZXlcblxuICAgICAgICBpZiAoa2V5ID09PSAncm91dGVOYW1lJyB8fCBrZXkgPT09ICc0MDQnKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICB9XG5cbiAgICAgICAgcm91dGVOYW1lID0gcm91dGVOYW1lIHx8IHByb3AoJ3JvdXRlTmFtZScsIHZhbClcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJUSEUgS0VZIElTIFwiLHtrZXksdmFsLHJvdXRlTmFtZX0pXG5cbiAgICAgICAgbGV0IG8gPSBjbG9uZShvYmpBY2MpXG4gICAgICAgIG9bcm91dGVOYW1lXSA9IHNhbml0aXplU3RyKGtleSlcblxuICAgICAgICBpZiAoaXNPYmplY3QgPT09IHRydWUpIHtcbiAgICAgICAgICBpZiAoa2V5cyhvKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YlJvdXRlTmFtZSA9IHBhdGgoWydyb3V0ZVBhdGgnLCAncm91dGVOYW1lJ10sIHZhbClcbiAgICAgICAgICAgIGlmIChzdWJSb3V0ZU5hbWUpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb0Jhc2UgPSBjbG9uZShvKVxuICAgICAgICAgICAgICBvQmFzZVtzdWJSb3V0ZU5hbWVdID0gJydcbiAgICAgICAgICAgICAgb0Jhc2UubmF2TGV2ZWwgPSBrZXlzKG9iakFjYykubGVuZ3RoXG4gICAgICAgICAgICAgIG9CYXNlLnRpdGxlID0gZ2V0TGlua1RleHQoa2V5KVxuICAgICAgICAgICAgICBvQmFzZS5ocmVmID0gZ2V0SFJFRihvQmFzZSlcbiAgICAgICAgICAgICAgYWNjLnB1c2gob0Jhc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG8gPSBjcmVhdGVJbml0aWFsVmFsRm4oYWNjTWFpbiwgdmFsLCBvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG8udGl0bGUgPSBnZXRMaW5rVGV4dChrZXkpXG4gICAgICAgICAgby5ocmVmID0gZ2V0SFJFRihvKVxuICAgICAgICB9XG4gICAgICAgIG8ubmF2TGV2ZWwgPSBrZXlzKG9iakFjYykubGVuZ3RoXG4gICAgICAgIGFjYy5wdXNoKG8pXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRvUGFpcnMocm91dGVQYXRoT2JqKS5yZWR1Y2UocHJvcHNSZWR1Y2VyLCBbXSlcbiAgICB9XG5cbiAgICBjb25zdCByZWR1Y2VkQXJyID0gY3JlYXRlSW5pdGlhbFZhbEZuKFtdLCBjaGFubmVsUm91dGVPYmoucm91dGVzKVxuICAgIGxldCByb3V0ZURhdGFzZXRzQXJyID0gZmxhdHRlbihyZWR1Y2VkQXJyKVxuICAgIHJvdXRlRGF0YXNldHNBcnIgPSByZW1vdmVVbmRlZmluZWQocm91dGVEYXRhc2V0c0FycilcblxuICAgIGNvbnN0IGdldE5hdlByb3BzID0gKGRhdGFzZXRzQXJyKSA9PiB7XG4gICAgICBjb25zdCBleGNsdWRlID0gcmVqZWN0KGluY2x1ZGVzKF9fLCBbJ3RpdGxlJywgJ2hyZWYnLCAnbmF2TGV2ZWwnLCAndW5kZWZpbmVkJ10pKVxuICAgICAgY29uc3QgZ2V0TWFpbktleXMgPSBjb21wb3NlKHVuaXEsIGV4Y2x1ZGUsIGZsYXR0ZW4sIG1hcChrZXlzKSlcbiAgICAgIHJldHVybiBnZXRNYWluS2V5cyhkYXRhc2V0c0FycilcbiAgICB9XG4gICAgY29uc3Qgcm91dGVOYW1lc0FyciA9IGdldE5hdlByb3BzKHJvdXRlRGF0YXNldHNBcnIpXG5cbiAgICByZXR1cm4geyByb3V0ZURhdGFzZXRzQXJyLCByb3V0ZU5hbWVzQXJyIH1cbiAgfVxuXG4gIHN0YXRpYyBjb25mb3JtUm91dGVPYmplY3QoY2hhbm5lbFJvdXRlT2JqID0ge30sIGFkZDQwNFByb3BzID0gZmFsc2UpIHtcbiAgICBjb25zdCBjaGFubmVsc1JvdXRlUGF0aCA9IHBhdGgoWydjaGFubmVscycsICdST1VURSddLCBjaGFubmVsUm91dGVPYmopXG4gICAgbGV0IHsgYWRkNDA0cyB9ID0gY2hhbm5lbHNSb3V0ZVBhdGggIT09IHVuZGVmaW5lZCA/IGNoYW5uZWxzUm91dGVQYXRoIDogY2hhbm5lbFJvdXRlT2JqXG4gICAgYWRkNDA0cyA9IGFkZDQwNHMgfHwgYWRkNDA0UHJvcHNcbiAgICBjb25zdCBwYXJzZVJvdXRlUGF0aCA9IChhKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBhWzFdXG4gICAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5LCB2YWwpXG4gICAgICBpZiAodmFsID09PSAnJykge1xuICAgICAgICBhWzFdID0gJ14kJ1xuICAgICAgfSBlbHNlIGlmIChpc0Fycikge1xuICAgICAgICBhWzFdID0gdmFsLmpvaW4oJ3wnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2R1Y2VDb25maWcgPSAoYXJyKSA9PiB7XG4gICAgICBjb25zdCBba2V5LCB2YWxdID0gYXJyXG4gICAgICBjb25zdCBvYmo0MDQgPSBhZGQ0MDRzID8geyA0MDQ6ICcuKycgfSA6IHt9XG4gICAgICBjb25zdCBpc09iaiA9IGlzKE9iamVjdCwgdmFsKVxuICAgICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSwgdmFsKVxuICAgICAgY29uc3QgaXRlck9iaiA9IGlzT2JqID09PSB0cnVlICYmIGlzQXJyID09PSBmYWxzZVxuICAgICAgY29uc3QgaXNSb3V0ZVBhdGggPSBrZXkgPT09ICdyb3V0ZVBhdGgnXG4gICAgICBpZiAoaXRlck9iaikge1xuICAgICAgICBhcnJbMV0gPSBjb25maWdNYXBwZXJGbihhcnJbMV0pXG4gICAgICAgIGlmIChpc1JvdXRlUGF0aCkge1xuICAgICAgICAgIGFyclsxXSA9IGNvbXBvc2UobWVyZ2VEZWVwUmlnaHQob2JqNDA0KSwgZnJvbVBhaXJzLCBtYXAocGFyc2VSb3V0ZVBhdGgpLCB0b1BhaXJzKShhcnJbMV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWdNYXBwZXJGbiA9IGNvbXBvc2UoZnJvbVBhaXJzLCBtYXAodHJhbnNkdWNlQ29uZmlnKSwgdG9QYWlycylcblxuICAgIGlmIChjaGFubmVsc1JvdXRlUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjaGFubmVsUm91dGVPYmouY2hhbm5lbHMuUk9VVEUgPSBjb25maWdNYXBwZXJGbihjaGFubmVsUm91dGVPYmouY2hhbm5lbHMuUk9VVEUpXG4gICAgICBjb25zdCBleHRyYVJvdXRlRGF0YSA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuYWRkUm91dGVEYXRhc2V0cyhjaGFubmVsUm91dGVPYmouY2hhbm5lbHMuUk9VVEUpXG4gICAgICBjaGFubmVsUm91dGVPYmouY2hhbm5lbHMuUk9VVEUgPSBtZXJnZVJpZ2h0KGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSwgZXh0cmFSb3V0ZURhdGEpXG4gICAgICByZXR1cm4gY2hhbm5lbFJvdXRlT2JqXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ01hcHBlckZuKGNoYW5uZWxSb3V0ZU9iailcbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvbkRhdGEoKSB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbXNBcnIgPSBbXG4gICAgICAnaHJlZicsXG4gICAgICAnb3JpZ2luJyxcbiAgICAgICdwcm90b2NvbCcsXG4gICAgICAnaG9zdCcsXG4gICAgICAnaG9zdG5hbWUnLFxuICAgICAgJ3BvcnQnLFxuICAgICAgJ3BhdGhuYW1lJyxcbiAgICAgICdzZWFyY2gnLFxuICAgICAgJ2hhc2gnXVxuICAgIHJldHVybiBwaWNrQWxsKGxvY2F0aW9uUGFyYW1zQXJyLCB3aW5kb3cubG9jYXRpb24pXG4gIH1cbn1cbiIsImltcG9ydCB7IGZyb21FdmVudFBhdHRlcm4gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBtYXBPYmpJbmRleGVkIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdyB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lVXRpbHNDaGFubmVsV2luZG93XG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAZGVzY1xuICAgKiBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMgZm9yIFNweW5lV2luZG93Q2hhbm5lbFxuICAgKlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50ID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudC5iaW5kKFxuICAgICAgdGhpcylcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KGV2ZW50TmFtZSwgbWFwRm4sIGlzUGFzc2l2ZSA9IHRydWUsIGVsZW1lbnQgPSB3aW5kb3cpIHtcbiAgICBjb25zdCBhZGRIYW5kbGVyID0gaGFuZGxlciA9PiBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyLFxuICAgICAgeyBwYXNzaXZlOiBpc1Bhc3NpdmUgfSlcbiAgICBjb25zdCByZW1vdmVIYW5kbGVyID0gKCkgPT4geyBlbGVtZW50W2V2ZW50TmFtZV0gPSAocCkgPT4gcCB9XG4gICAgbWFwRm4gPSBtYXBGbiA9PT0gdW5kZWZpbmVkID8gKHApID0+IHAgOiBtYXBGblxuICAgIHJldHVybiBmcm9tRXZlbnRQYXR0ZXJuKGFkZEhhbmRsZXIsIHJlbW92ZUhhbmRsZXIpLnBpcGUobWFwKG1hcEZuKSlcbiAgfVxuXG4gIC8vIE1FRElBIFFVRVJJRVNcbiAgc3RhdGljIGNyZWF0ZU1lZGlhUXVlcnkoc3RyKSB7XG4gICAgY29uc3QgbXEgPSB3aW5kb3cubWF0Y2hNZWRpYShzdHIpXG4gICAgdGhpcy5jaGVja0lmVmFsaWRNZWRpYVF1ZXJ5KG1xLCBzdHIpXG4gICAgcmV0dXJuIG1xICE9PSBmYWxzZSA/IG1xIDogZmFsc2VcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmVmFsaWRNZWRpYVF1ZXJ5KG1xLCBzdHIpIHtcbiAgICBjb25zdCBub1NwYWNlcyA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXFxzKy9nbSwgJycpXG4gICAgY29uc3QgaXNWYWxpZEJvb2wgPSBtcS5tYXRjaGVzICE9PSB1bmRlZmluZWQgJiYgbm9TcGFjZXMobXEubWVkaWEpLmluZGV4T2Yobm9TcGFjZXMoc3RyKSkgPj0gMFxuICAgIGNvbnN0IHdhcm5Nc2cgPSBzdHIgPT4gY29uc29sZS53YXJuKGBTcHluZSBJbmZvOiB0aGUgZm9sbG93aW5nIHF1ZXJ5IHN0cmluZywgXCIke3N0cn1cIiwgaGFzIGJlZW4gb3B0aW1pemVkIHRvIFwiJHttcS5tZWRpYX1cIiBieSB0aGUgYnJvd3NlciBhbmQgbWF5IG5vdCBiZSBhIHZhbGlkIE1lZGlhIFF1ZXJ5IGl0ZW0hYClcbiAgICBpZiAoaXNWYWxpZEJvb2wgPT09IGZhbHNlKSB7XG4gICAgICB3YXJuTXNnKHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzVmFsaWRCb29sXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlTWVkaWFRdWVyeUhhbmRsZXIocXVlcnksIGtleSkge1xuICAgIGNvbnN0IGtleUZuID0ga2V5ID0+IHAgPT4ge1xuICAgICAgcC5tZWRpYVF1ZXJ5TmFtZSA9IGtleVxuICAgICAgcmV0dXJuIHBcbiAgICB9XG5cbiAgICBjb25zdCBtYXBLZXkgPSBrZXlGbihrZXkpXG5cbiAgICBjb25zdCBoYW5kbGVycyA9IChxKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZGRIYW5kbGVyOiAoaGFuZGxlcikgPT4geyBxLmFkZExpc3RlbmVyKGhhbmRsZXIpIH0sXG4gICAgICAgIHJlbW92ZUhhbmRsZXI6IChoYW5kbGVyKSA9PiB7IHEub25jaGFuZ2UgPSAoKSA9PiB7fSB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1lZGlhUXVlcnlIYW5kbGVyID0gaGFuZGxlcnMocXVlcnkpXG4gICAgLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuICAgIHJldHVybiBuZXcgZnJvbUV2ZW50UGF0dGVybihcbiAgICAgIG1lZGlhUXVlcnlIYW5kbGVyLmFkZEhhbmRsZXIsXG4gICAgICBtZWRpYVF1ZXJ5SGFuZGxlci5yZW1vdmVIYW5kbGVyKVxuICAgICAgLnBpcGUobWFwKG1hcEtleSkpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlTWVyZ2VkT2JzRnJvbU9iaihjb25maWcpIHtcbiAgICBjb25zdCBtZWRpYVF1ZXJpZXNPYmogPSBjb25maWcubWVkaWFRdWVyaWVzIHx8IGNvbmZpZy5tZWRpYVF1ZXJpZXNcbiAgICBjb25zdCBhcnIgPSBbXVxuXG4gICAgY29uc3QgbG9vcFF1ZXJpZXMgPSAodmFsLCBrZXksIG9iaikgPT4ge1xuICAgICAgY29uc3QgbXEgPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZWRpYVF1ZXJ5KHZhbClcbiAgICAgIGlmIChtcSAhPT0gZmFsc2UpIHtcbiAgICAgICAgYXJyLnB1c2goU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVkaWFRdWVyeUhhbmRsZXIobXEsIGtleSkpXG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyXG4gICAgfVxuXG4gICAgbWFwT2JqSW5kZXhlZChsb29wUXVlcmllcywgbWVkaWFRdWVyaWVzT2JqKVxuICAgIHJldHVybiBhcnJcbiAgfVxufVxuIiwiLyoqXG4gKiBDZW50cmFsIG91dGxldCBmb3IgU3B5bmVKUyBkZXZlbG9wZXItaGludCB3YXJuaW5ncyAoaW52YWxpZCBzZWxlY3RvcnMsXG4gKiBzYW5pdGl6ZWQgYXR0cmlidXRlcywgcG9saWN5IHJlbW92YWxzLCBkZXByZWNhdGlvbnMpLlxuICpcbiAqIFdhcm5pbmdzIGFyZSBzdXBwcmVzc2VkIHdoZW4gd2luZG93LlNQWU5FX1NVUFBSRVNTX1dBUk5JTkdTIGlzIHRydWUg4oCUXG4gKiBwcmltYXJpbHkgZm9yIHRlc3QgcnVucywgd2hlcmUgZXhwZWN0ZWQtZmFpbHVyZSBjYXNlcyB3b3VsZCBvdGhlcndpc2VcbiAqIGZsb29kIHRoZSByZXBvcnRlci4gVGhlIGZsYWcgbGl2ZXMgb24gd2luZG93IChub3QgbW9kdWxlIHN0YXRlKSBzbyBpdFxuICogc3BhbnMgc2VwYXJhdGVseSBidW5kbGVkIHRlc3QgZmlsZXMuXG4gKlxuICogU2VjdXJpdHktcG9zdHVyZSB3YXJuaW5ncyAoZS5nLiBjb25maWcuZGlzYWJsZVNhbml0aXplKSBkbyBOT1Qgcm91dGVcbiAqIHRocm91Z2ggaGVyZSBhbmQgYXJlIGFsd2F5cyBwcmludGVkLlxuICovXG5jb25zdCBzcHluZVdhcm4gPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCBzdXBwcmVzc2VkID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LlNQWU5FX1NVUFBSRVNTX1dBUk5JTkdTID09PSB0cnVlXG4gIGlmIChzdXBwcmVzc2VkICE9PSB0cnVlKSB7XG4gICAgY29uc29sZS53YXJuKC4uLmFyZ3MpXG4gIH1cbn1cblxuY29uc3Qgc2V0U3B5bmVXYXJuaW5nc0Rpc2FibGVkID0gKGJvb2wgPSB0cnVlKSA9PiB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHdpbmRvdy5TUFlORV9TVVBQUkVTU19XQVJOSU5HUyA9IGJvb2wgPT09IHRydWVcbiAgfVxufVxuXG5leHBvcnQgeyBzcHluZVdhcm4sIHNldFNweW5lV2FybmluZ3NEaXNhYmxlZCB9XG4iLCJjb25zdCBjcmVhdGVGYWRlcklubGluZVRleHQgPSAoaXNJbkJvb2wgPSBmYWxzZSwgdCA9IDEsIGUgPSAnZWFzZScsIHN0YXJ0WmVyb0Jvb2wgPSBmYWxzZSkgPT4ge1xuICBjb25zdCBpbml0T3BhY2l0eVplcm8gPSBzdGFydFplcm9Cb29sID09PSB0cnVlID8gJ29wYWNpdHk6MDsnIDogJydcbiAgY29uc3Qgb3BhY2l0eSA9IGlzSW5Cb29sID09PSB0cnVlID8gMSA6IDBcbiAgcmV0dXJuIGAke2luaXRPcGFjaXR5WmVyb310cmFuc2l0aW9uOiBvcGFjaXR5ICR7dH1zICR7ZX07IG9wYWNpdHk6ICR7b3BhY2l0eX07YFxufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVpbihlbCwgdCkge1xuICBjb25zdCBjdXJyZW50T3BhY2l0eSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5vcGFjaXR5ICogMVxuICBjb25zdCBzdGFydEF0WmVybyA9IGN1cnJlbnRPcGFjaXR5ID09PSAxXG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dCh0cnVlLCB0LCAnZWFzZScsIHN0YXJ0QXRaZXJvKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVvdXQoZWwsIHQsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dChmYWxzZSwgdCwgJ2Vhc2UnKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xuXG4gIC8vIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCB0ICogMTAwMCk7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBjYWxsYmFjaywgZmFsc2UpXG59XG4iLCJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBmbGlwLCBtZXJnZVJpZ2h0LCBjbG9uZSwgZm9yRWFjaCwgcHJvcFNhdGlzZmllcyB9IGZyb20gJ3JhbWRhJ1xuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1PYnNlcnZhYmxlIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1PYnNlcnZhYmxlXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgb2JzZXJ2YWJsZSB0aGF0IGNyZWF0ZXMgdGhlIFZpZXdTdHJlYW0gT2JzZXJ2YWJsZSB0aGF0IGJyYW5jaGVzIG91dCB0byBwYXJlbnQsIGludGVybmFsIGFuZCBjaGlsZCBkaXJlY3Rpb25zXG4gICAgICovXG4gICAgdGhpcy5wcm9wcy5vYnNlcnZhYmxlU3RyZWFtcyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsT2JzZXJ2YWJsZXMoKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpIHtcbiAgICBjb25zdCBkaXJJbnRlcm5hbCA9ICdpbnRlcm5hbCdcbiAgICBjb25zdCBkaXJQYXJlbnQgPSAncGFyZW50J1xuICAgIGNvbnN0IGRpckNoaWxkID0gJ2NoaWxkJ1xuICAgIHJldHVybiB7XG4gICAgICBQOiBbZGlyUGFyZW50XSxcbiAgICAgIEM6IFtkaXJDaGlsZF0sXG4gICAgICBQQ0k6IFtkaXJQYXJlbnQsIGRpckludGVybmFsLCBkaXJDaGlsZF0sXG4gICAgICBDSTogW2RpckNoaWxkLCBkaXJJbnRlcm5hbF0sXG4gICAgICBQSTogW2RpclBhcmVudCwgZGlySW50ZXJuYWxdLFxuICAgICAgUEM6IFtkaXJQYXJlbnQsIGRpckNoaWxkXVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhZGREZWZhdWx0RGlyKG9iaikge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyh7ICRkaXI6WydpbnRlcm5hbCddIH0sIGNsb25lKG9iaikpXG4gIH1cblxuICBzdGF0aWMgYWRkRG93bkludGVybmFsRGlyKG9iaiwgYXJyID0gWydpbnRlcm5hbCcsICdkb3duJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IGZsaXAobWVyZ2VSaWdodClcbiAgICByZXR1cm4gZGVmYXVsdHMoY2xvbmUob2JqKSwgeyAkZGlyOmFyciB9KVxuICB9XG5cbiAgc3RhdGljIGFkZENoaWxkQW5kSW50ZXJuYWxEaXIob2JqLCBhcnIgPSBbJ2NoaWxkJywgJ2Rvd24nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyhjbG9uZShvYmopLCB7ICRkaXI6YXJyIH0pXG4gIH1cblxuICBzdGF0aWMgbWFwVG9EZWZhdWx0RGlyKHApIHtcbiAgICByZXR1cm4gdGhpcy5hZGREZWZhdWx0RGlyKHApXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyhvYnMkID0gbmV3IFN1YmplY3QoKSwgdmlld05hbWUsIHZzaWQpIHtcbiAgICBpZiAodmlld05hbWUgIT09IHVuZGVmaW5lZCAmJiB2c2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9icyQudmlld05hbWUgPSB2aWV3TmFtZVxuICAgICAgb2JzJC52c2lkID0gdnNpZFxuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlclN0cmVhbXMgPSB2YWwgPT4gcHJvcFNhdGlzZmllcyhhcnJUeXBlID0+IGFyclR5cGUuaW5jbHVkZXModmFsKSwgJyRkaXInKVxuICAgIGNvbnN0IGZpbHRlclBhcmVudCA9IGZpbHRlclN0cmVhbXMoJ3BhcmVudCcpXG4gICAgY29uc3QgZmlsdGVyQ2hpbGQgPSBmaWx0ZXJTdHJlYW1zKCdjaGlsZCcpXG4gICAgY29uc3QgZmlsdGVySW50ZXJuYWwgPSBmaWx0ZXJTdHJlYW1zKCdpbnRlcm5hbCcpXG5cbiAgICBjb25zdCBhZGRmcm9tJCA9IHJlbFN0ciA9PiBtZXJnZVJpZ2h0KHsgZnJvbSQ6cmVsU3RyIH0pXG4gICAgY29uc3QgYWRkUGFyZW50ZnJvbSQgPSBhZGRmcm9tJCgnY2hpbGQnKVxuICAgIGNvbnN0IGFkZEludGVybmFsZnJvbSQgPSBhZGRmcm9tJCgnaW50ZXJuYWwnKVxuICAgIGNvbnN0IGFkZENoaWxkZnJvbSQgPSBhZGRmcm9tJCgncGFyZW50JylcblxuICAgIGNvbnN0IHJhdyQgPSAgb2JzJFxuICAgICAgLnBpcGUoZmlsdGVyKChwYXlsb2FkKSA9PiBwYXlsb2FkICE9PSB1bmRlZmluZWQgJiYgcGF5bG9hZC5hY3Rpb24gIT09IHVuZGVmaW5lZCkpXG5cbiAgICBjb25zdCB0b0ludGVybmFsJCA9IG9icyQucGlwZShmaWx0ZXIoZmlsdGVySW50ZXJuYWwpLCBtYXAoYWRkSW50ZXJuYWxmcm9tJCkpXG4gICAgY29uc3QgdG9QYXJlbnQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJQYXJlbnQpLCBtYXAoYWRkUGFyZW50ZnJvbSQpKVxuICAgIGNvbnN0IHRvQ2hpbGQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJDaGlsZCksIG1hcChhZGRDaGlsZGZyb20kKSlcblxuICAgIGNvbnN0IHN0cmVhbU9iaiA9IHtcbiAgICAgIHBhcmVudDogdG9QYXJlbnQkLFxuICAgICAgaW50ZXJuYWw6IHRvSW50ZXJuYWwkLFxuICAgICAgY2hpbGQ6IHRvQ2hpbGQkXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSAoYXJyID0gW10pID0+IHtcbiAgICAgIGNvbnN0IGVuZFN0cmVhbSA9IG8gPT4ge1xuICAgICAgICBvLmNvbXBsZXRlKClcbiAgICAgICAgby5pc1N0b3BwZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNldENvbXBsZXRlU3RyZWFtID0gKHN0cikgPT4ge1xuICAgICAgICBpZiAoc3RyZWFtT2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IG9icyQgPSBzdHJlYW1PYmpbc3RyXVxuICAgICAgICAgIGVuZFN0cmVhbShvYnMkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhcnIgIT09IHVuZGVmaW5lZCAmJiBhcnIubGVuZ3RoID49IDEpIHtcbiAgICAgICAgYXJyLmZvckVhY2goc2V0Q29tcGxldGVTdHJlYW0pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbXBsZXRlQWxsID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSBvID0+IHtcbiAgICAgICAgby5jb21wbGV0ZSgpXG4gICAgICAgIG8uaXNTdG9wcGVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgZm9yRWFjaChjb21wbGV0ZVN0cmVhbSwgW3JhdyQsIHRvSW50ZXJuYWwkLCB0b1BhcmVudCQsIHRvQ2hpbGQkXSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmF3JCwgdG9JbnRlcm5hbCQsIHRvUGFyZW50JCwgdG9DaGlsZCQsIGNvbXBsZXRlQWxsLCBjb21wbGV0ZVN0cmVhbVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaW5jbHVkZXMsIF9fLCBpZkVsc2UsIHBhdGgsIHByb3AsIHJlamVjdCwgaXMsIGlzTmlsLCBpc0VtcHR5IH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgc2FuaXRpemVIVE1MIGZyb20gJy4uL3V0aWxzL3Nhbml0aXplLWh0bWwuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxuLyoqXG4gKiBEb21FbGVtZW50VGVtcGxhdGVcbiAqXG4gKiBNdXN0YWNoZS1jb21wYXRpYmxlIHRlbXBsYXRlIGVuZ2luZSB1c2VkIGJ5IFZpZXdTdHJlYW0gYW5kIERvbUVsZW1lbnQgZm9yIEhUTUwgcmVuZGVyaW5nLlxuICpcbiAqIFN1cHBvcnRlZCBzeW50YXg6XG4gKiAgIHt7a2V5fX0gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGludGVycG9sYXRpb24sIEhUTUwtZXNjYXBlZFxuICogICB7e2tleS5wYXRoLnRvLnZhbHVlfX0gICAgICAgICAgICBkb3Qtbm90YXRpb24gcHJvcGVydHkgYWNjZXNzXG4gKiAgIHt7I2tleX19Li4ue3sva2V5fX0gICAgICAgICAgICAgIGFycmF5L29iamVjdCBzZWN0aW9uc1xuICogICB7ey59fSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGVsZW1lbnQgaW5zaWRlIGEgbG9vcFxuICogICB7eyN9fS4uLnt7L319ICAgICAgICAgICAgICAgICAgICB0b3AtbGV2ZWwgYmFyZSBhcnJheSAocGFzc2VkIGFzIGBkYXRhYClcbiAqXG4gKiBOZXN0aW5nOlxuICogICBEb21FbGVtZW50VGVtcGxhdGUgc3VwcG9ydHMgZXhhY3RseSBPTkUgbGV2ZWwgb2YgbmVzdGVkIGFycmF5IHNlY3Rpb25zLlxuICogICBBIHRlbXBsYXRlIGxpa2Uge3sjcm93c319Li4ue3sjY2VsbHN9fS4uLnt7L2NlbGxzfX0uLi57ey9yb3dzfX0gaXMgc3VwcG9ydGVkLlxuICogICBEZWVwZXIgbmVzdGluZyDigJQge3sjYX19e3sjYn19e3sjY319Li4ue3svY319e3svYn19e3svYX19IOKAlCBpcyBOT1Qgc3VwcG9ydGVkLlxuICpcbiAqICAgV2hlbiBhIHRlbXBsYXRlIGhhcyBkZWVwZXIgbmVzdGluZywgYSB3YXJuaW5nIGlzIGxvZ2dlZCBpbiBkZWJ1ZyBtb2RlIGFuZFxuICogICB0aGUgdGhpcmQtbGV2ZWwgbG9vcCBpcyBub3QgcHJvY2Vzc2VkLiBUaGlzIGlzIGEgZGVsaWJlcmF0ZSBkZXNpZ24gY2hvaWNlOlxuICogICBkZWVwIGhpZXJhcmNoaWNhbCByZW5kZXJpbmcgYmVsb25ncyBpbiBuZXN0ZWQgVmlld1N0cmVhbXMsIG5vdCBpbiB0ZW1wbGF0ZXMuXG4gKiAgIE5lc3RlZCBWaWV3U3RyZWFtcyBwcm92aWRlIHByb3BlciBsaWZlY3ljbGUgc2VtYW50aWNzLCBpc29sYXRlZCByZW5kZXJpbmcsXG4gKiAgIGFuZCBjbGVhcmVyIGFyY2hpdGVjdHVyYWwgYm91bmRhcmllcyB0aGFuIGFyYml0cmFyaWx5LW5lc3RlZCB0ZW1wbGF0ZXMuXG4gKlxuICogTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gbmVzdGVkIGxvb3BzOlxuICogICAtIENNUyBwcm94eSBtZXRhZGF0YSAoX19jbXNfX2RhdGFJZCwgX19jbXNfX2tleUZvcl8qKS4gSW5uZXItbG9vcCBDTVNcbiAqICAgICBlZGl0aW5nIGlzIGEgZnV0dXJlIGVuaGFuY2VtZW50OyB1bnRpbCB0aGVuLCBjb250ZW50IGluc2lkZSBhbiBpbm5lclxuICogICAgIGxvb3AgaXMgcmVuZGVyZWQgYXMgcmVhZC1vbmx5IGZyb20gdGhlIENNUyBwZXJzcGVjdGl2ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIERvbUVsZW1lbnRUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlLCBkYXRhID0ge30sIG9wdHMgPSB7fSkge1xuICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLmZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlKVxuICAgIHRoaXMuaXNQcm94eURhdGEgPSBkYXRhLl9fY21zX19pc1Byb3h5ID09PSB0cnVlXG4gICAgdGhpcy50ZXN0TW9kZSA9IG9wdHM/LnRlc3RNb2RlXG5cbiAgICAvLyBDTVMgbGluZWFnZSBwYXNzIOKAlCBjb25zdHJ1Y3Rpb24tdGltZSBvbmx5LCBhbmQgb25seSBpbiBhdXRob3JpbmcgbW9kZS5cbiAgICAvLyBJbiBwcm9kdWN0aW9uIChlbmFibGVDTVNQcm94aWVzIGZhbHNlKSB0aGlzIGNvc3RzIG9uZSBib29sZWFuIHJlYWQ7XG4gICAgLy8gbm90aGluZyBoZXJlIGV2ZXIgcnVucyBpbnNpZGUgdGhlIHN1YnN0aXR1dGlvbiBsb29wcy5cbiAgICBpZiAodGhpcy5pc1Byb3h5RGF0YSA9PT0gZmFsc2UgJiYgU3B5bmVBcHBQcm9wZXJ0aWVzLmVuYWJsZUNNU1Byb3hpZXMgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHJlaHlkcmF0ZWQgPSBTcHluZUFwcFByb3BlcnRpZXMucmVoeWRyYXRlQ21zRGF0YT8uKGRhdGEpXG4gICAgICBpZiAocmVoeWRyYXRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGEgc3RyaXBwZWQgY2xvbmUgd2FzIHJlLWlkZW50aWZpZWQg4oCUIHJlbmRlciB3aXRoIHRoZSByZXZpdmVkIHByb3h5XG4gICAgICAgIGRhdGEgPSByZWh5ZHJhdGVkXG4gICAgICAgIHRoaXMuaXNQcm94eURhdGEgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKERvbUVsZW1lbnRUZW1wbGF0ZS50ZW1wbGF0ZUJpbmRzUHJveGllZENoaWxkKGRhdGEsIHRoaXMudGVtcGxhdGUpID09PSB0cnVlKSB7XG4gICAgICAgIC8vIHBsYWluIHdyYXBwZXIgaG9sZGluZyBwcm94aWVkIHZhbHVlcyAoZS5nLiBhIHBhZ2VEYXRhIGNvbnRhaW5lciksXG4gICAgICAgIC8vIEFORCB0aGlzIHRlbXBsYXRlIGFjdHVhbGx5IHJlZmVyZW5jZXMgb25lIG9mIHRob3NlIHByb3hpZWQgY2hpbGRyZW5cbiAgICAgICAgLy8gdmlhIGEgZG90LXBhdGggb3IgbG9vcCB0b2tlbiDigJQgb25seSB0aGVuIGlzIENNUyB3cmFwcGluZyB1c2VmdWwuXG4gICAgICAgIC8vIEZsaXBwaW5nIG9uIGNoaWxkIHByZXNlbmNlIGFsb25lIHB1dCB+NDAlIG9mIGFsbCB0ZW1wbGF0ZXMgdGhyb3VnaFxuICAgICAgICAvLyB0aGUgd3JhcOKGkmluZmxhdGXihpJzYW5pdGl6ZeKGknN0cmlwIHBpcGVsaW5lIGZvciB6ZXJvIGJpbmRpbmdzLlxuICAgICAgICB0aGlzLmlzUHJveHlEYXRhID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWUpIHtcbiAgICAgICAgU3B5bmVBcHBQcm9wZXJ0aWVzLndhcm5VbnByb3hpZWRDbXNEYXRhPy4oZGF0YSwgdGhpcy50ZW1wbGF0ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgdHJpcGxlLWJyYWNrZXQgdGFncyB0byBkb3VibGUtYnJhY2tldC5cbiAgICAvL1xuICAgIC8vIERvbUVsZW1lbnRUZW1wbGF0ZSB0cmVhdHMge3t7a2V5fX19IGFzIGFuIGFsaWFzIGZvciB7e2tleX19IOKAlCBib3RoXG4gICAgLy8gaW50ZXJwb2xhdGUgdGhlIHZhbHVlIGFzLWlzLiBNdXN0YWNoZSdzIGNvbnZlbnRpb24gb2YgXCJ0cmlwbGUtYnJhY2tldFxuICAgIC8vIG1lYW5zIHVuZXNjYXBlZFwiIGRvZXNuJ3QgYXBwbHkgaGVyZSBiZWNhdXNlIFNweW5lSlMgaGFuZGxlcyBlc2NhcGluZ1xuICAgIC8vIGFuZCBzYW5pdGl6YXRpb24gdGhyb3VnaCBgc2FuaXRpemUtZGF0YWAgKGtleWVkIG9uIFNweW5lQXBwIG1vZGUpXG4gICAgLy8gYmVmb3JlIHZhbHVlcyByZWFjaCB0aGUgdGVtcGxhdGUsIG5vdCB0aHJvdWdoIHN5bnRheC1sZXZlbCBlc2NhcGluZy5cbiAgICAvL1xuICAgIC8vIFdlIGFjY2VwdCB0cmlwbGUtYnJhY2tldCBzeW50YXggc28gdGhhdCBhdXRob3JzIGFuZCBBSSBmYW1pbGlhciB3aXRoXG4gICAgLy8gc3RhbmRhcmQgTXVzdGFjaGUgZG9uJ3QgaGF2ZSB0aGVpciB0ZW1wbGF0ZXMgc2lsZW50bHkgYnJlYWsgd2hlbiB0aGV5XG4gICAgLy8gcmVhY2ggZm9yIHt7e2tleX19fSBvdXQgb2YgaGFiaXQuIFRoZSBub3JtYWxpemF0aW9uIGhhcHBlbnMgb25jZSBoZXJlLFxuICAgIC8vIHNvIHRoZSByZXN0IG9mIHRoZSBlbmdpbmUgb25seSBldmVyIHJlYXNvbnMgYWJvdXQgZG91YmxlLWJyYWNrZXQgdGFncy5cbiAgICB0aGlzLnRlbXBsYXRlID0gRG9tRWxlbWVudFRlbXBsYXRlLm5vcm1hbGl6ZVRyaXBsZUJyYWNrZXRzKHRoaXMudGVtcGxhdGUpXG5cbiAgICBpZiAodGhpcy5pc1Byb3h5RGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgcHJveHlGb3JtYXR0ZXIgPSBTcHluZUFwcFByb3BlcnRpZXMuZW5hYmxlQ01TUHJveGllcyA9PT0gdHJ1ZVxuICAgICAgICA/IFNweW5lQXBwUHJvcGVydGllcy5mb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YVxuICAgICAgICA6IERvbUVsZW1lbnRUZW1wbGF0ZS5mb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YVxuXG4gICAgICBpZiAodHlwZW9mIHByb3h5Rm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBwcm94eUZvcm1hdHRlcih0aGlzLnRlbXBsYXRlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrRm9yQXJyYXlEYXRhID0gKCkgPT4ge1xuICAgICAgaWYgKGlzKEFycmF5LCBkYXRhKSA9PT0gdHJ1ZSkge1xuICAgICAgICBkYXRhID0geyBzcHluZURhdGE6ZGF0YSB9XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLnJlcGxhY2UoJ3t7L319JywgJ3t7L3NweW5lRGF0YX19JylcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUucmVwbGFjZSgne3sjfX0nLCAne3sjc3B5bmVEYXRhfX0nKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrRm9yQXJyYXlEYXRhKClcblxuICAgIHRoaXMudGVtcGxhdGVEYXRhID0gZGF0YVxuXG4gICAgLy8gU3Rhc2ggdXNlZCBieSBwZXItaXRlcmF0aW9uIHN1YnN0aXR1dGlvbiBzbyB0aGF0IENNUyBwcm94eSBsb29rdXBzXG4gICAgLy8gZm9yIHN0cmluZy1hcnJheSBpdGVtcyAod2hlcmUgX19jbXNfX2RhdGFJZCAvIF9fY21zX19rZXlGb3JfKiBsaXZlIG9uXG4gICAgLy8gdGhlIFBBUkVOVCBhcnJheSwgbm90IG9uIHRoZSBpbmRpdmlkdWFsIHN0cmluZyBlbGVtZW50cykgY2FuIGZpbmQgdGhlXG4gICAgLy8gcGFyZW50IG9iamVjdCBhdCByZW5kZXIgdGltZS4gU2V0IGJ5IHBhcnNlVGhlVG1wbExvb3AsIGNsZWFyZWQgd2hlblxuICAgIC8vIHRoYXQgbG9vcCBjb21wbGV0ZXMuXG4gICAgdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YSA9IG51bGxcblxuICAgIGNvbnN0IHN0ckFyciA9IERvbUVsZW1lbnRUZW1wbGF0ZS5nZXRTdHJpbmdBcnJheSh0aGlzLnRlbXBsYXRlKVxuXG4gICAgbGV0IHN0ck1hdGNoZXMgPSB0aGlzLnRlbXBsYXRlLm1hdGNoKERvbUVsZW1lbnRUZW1wbGF0ZS5maW5kVG1wbExvb3BzUkUoKSlcbiAgICBzdHJNYXRjaGVzID0gc3RyTWF0Y2hlcyA9PT0gbnVsbCA/IFtdIDogc3RyTWF0Y2hlc1xuXG4gICAgY29uc3QgcGFyc2VUbXBsTG9vcHNSRSA9IERvbUVsZW1lbnRUZW1wbGF0ZS5wYXJzZVRtcGxMb29wc1JFKClcblxuICAgIGNvbnN0IHBhcnNlVG1wbExvb3BGbiA9IHRoaXMucGFyc2VUaGVUbXBsTG9vcC5iaW5kKHRoaXMpXG5cbiAgICBjb25zdCBtYXBUbXBsTG9vcCA9IChzdHIpID0+IHtcbiAgICAgIHJldHVybiBzdHIucmVwbGFjZShwYXJzZVRtcGxMb29wc1JFLCBwYXJzZVRtcGxMb29wRm4pXG4gICAgfVxuXG4gICAgY29uc3QgZmluZFRtcGxMb29wc1ByZWQgPSBpbmNsdWRlcyhfXywgc3RyTWF0Y2hlcylcbiAgICBjb25zdCBjaGVja0Zvck1hdGNoZXMgPSBpZkVsc2UoXG4gICAgICBmaW5kVG1wbExvb3BzUHJlZCxcbiAgICAgIG1hcFRtcGxMb29wLFxuICAgICAgdGhpcy5hZGRQYXJhbXMuYmluZCh0aGlzKSlcblxuICAgIHRoaXMuZmluYWxBcnIgPSBzdHJBcnIubWFwKGNoZWNrRm9yTWF0Y2hlcylcbiAgfVxuXG4gIHN0YXRpYyBpc1ByaW1pdGl2ZVRhZyhzdHIpIHtcbiAgICByZXR1cm4gLyh7e1xcLlxcKj99fSkvLnRlc3Qoc3RyKVxuICB9XG5cbiAgLyoqXG4gICAqIFNoYWxsb3csIG9uZS1sZXZlbCBzY2FuIGZvciBDTVMtcHJveGllZCB2YWx1ZXMgaW5zaWRlIGEgcGxhaW4gY29udGFpbmVyLFxuICAgKiBiYWlsaW5nIG9uIHRoZSBmaXJzdCBoaXQuIExldHMgd3JhcHBlcnMgdGhhdCBob2xkIHByb3hpZWQgY29udGVudCAoYVxuICAgKiBwYWdlRGF0YSBvYmplY3QsIGEgZmlsdGVyZWQgYXJyYXkgb2YgcHJveGllZCBzdG9yaWVzKSBvcHQgaW4gdG8gQ01TXG4gICAqIHRlbXBsYXRlIHdyYXBwaW5nIGV2ZW4gdGhvdWdoIHRoZSB3cmFwcGVyIGl0c2VsZiBpcyBub3QgYSBwcm94eS5cbiAgICogT25seSBldmVyIGNhbGxlZCBpbiBhdXRob3JpbmcgbW9kZSAoZW5hYmxlQ01TUHJveGllcyB0cnVlKS5cbiAgICovXG4gIC8qKlxuICAgKiBXcmFwcGVyIGRldGVjdGlvbiB3aXRoIGEgYmluZGluZyB0ZXN0OiByZXR1cm5zIHRydWUgb25seSB3aGVuIGRhdGEgaG9sZHNcbiAgICogYSBwcm94aWVkIGNoaWxkIHVuZGVyIGEga2V5IHRoYXQgdGhlIHRlbXBsYXRlIGFjdHVhbGx5IHJlZmVyZW5jZXMgdmlhIGFcbiAgICogZG90LXBhdGggKHt7a2V5LnByb3B9fSkgb3IgbG9vcCAoe3sja2V5fX0gLyB7eyNrZXkucGF0aH19KSB0b2tlbi4gQVxuICAgKiB0ZW1wbGF0ZSB0aGF0IG5ldmVyIHJlYWNoZXMgaW50byB0aGUgcHJveGllZCBjaGlsZCBnYWlucyBub3RoaW5nIGZyb21cbiAgICogQ01TIHdyYXBwaW5nIOKAlCBpdHMgb3duIHRvcC1sZXZlbCB0b2tlbnMgaGF2ZSBubyBkYXRhSWQgdG8gYmluZCDigJQgc29cbiAgICogZmxpcHBpbmcgaXQgaW50byBwcm94eSBtb2RlIG9ubHkgcGF5cyB0aGUgd3JhcC9zYW5pdGl6ZS9zdHJpcCBwaXBlbGluZS5cbiAgICovXG4gIHN0YXRpYyB0ZW1wbGF0ZUJpbmRzUHJveGllZENoaWxkKGRhdGEsIHRlbXBsYXRlKSB7XG4gICAgaWYgKGRhdGEgPT09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnIHx8IHR5cGVvZiB0ZW1wbGF0ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAodGVtcGxhdGUuaW5kZXhPZigne3snKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV1cbiAgICAgIGNvbnN0IHZhbCA9IGRhdGFba2V5XVxuICAgICAgaWYgKHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwuX19jbXNfX2lzUHJveHkgPT09IHRydWUpIHtcbiAgICAgICAgaWYgKHRlbXBsYXRlLmluZGV4T2YoYHt7JHtrZXl9LmApICE9PSAtMSB8fFxuICAgICAgICAgICAgdGVtcGxhdGUuaW5kZXhPZihge3sjJHtrZXl9fX1gKSAhPT0gLTEgfHxcbiAgICAgICAgICAgIHRlbXBsYXRlLmluZGV4T2YoYHt7IyR7a2V5fS5gKSAhPT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgc3RhdGljIGhhc1Byb3hpZWRDaGlsZChkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhkYXRhKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB2YWwgPSB2YWx1ZXNbaV1cbiAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsLl9fY21zX19pc1Byb3h5ID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgdHJpcGxlLWJyYWNrZXQgdGFncyB0byBkb3VibGUtYnJhY2tldCBmb3JtLlxuICAgKlxuICAgKiAgIHt7e2tleX19fSAgICAgICDihpIge3trZXl9fVxuICAgKiAgIHt7e2EuYi5jfX19ICAgICDihpIge3thLmIuY319XG4gICAqICAge3t7Ln19fSAgICAgICAgIOKGkiB7ey59fVxuICAgKiAgIHt7ey4qfX19ICAgICAgICDihpIge3suKn19XG4gICAqXG4gICAqIFNlY3Rpb24gbWFya2VycyB7eyNrZXl9fSBhbmQge3sva2V5fX0gYXJlIGFscmVhZHkgdHdvLWJyYWNrZXQgYnlcbiAgICogY29udmVudGlvbiBhbmQgYXJlIG5vdCBhZmZlY3RlZC4gVGFncyBvZiB0aGUgd3Jvbmcgc2hhcGUgKHVuYmFsYW5jZWQsXG4gICAqIGZvdXIgb3IgbW9yZSBicmFja2V0cywgZXRjLikgYXJlIGxlZnQgdW50b3VjaGVkIOKAlCBhbnl0aGluZyB0aGUgbWFpblxuICAgKiBwYXJzZXIgZG9lc24ndCByZWNvZ25pemUgbGF0ZXIgd2lsbCByZW5kZXIgYXMgbGl0ZXJhbCB0ZXh0LCB3aGljaCBpc1xuICAgKiB0aGUgY29ycmVjdCBmYWlsdXJlIG1vZGUgZm9yIGEgbG9naWMtbGVzcyB0ZW1wbGF0ZSBlbmdpbmUuXG4gICAqXG4gICAqIFRoaXMgZXhpc3RzIGJlY2F1c2UgRG9tRWxlbWVudFRlbXBsYXRlIHRyZWF0cyB7e3trZXl9fX0gYW5kIHt7a2V5fX1cbiAgICogYXMgaW50ZXJjaGFuZ2VhYmxlIOKAlCBzYW5pdGl6YXRpb24gYW5kIGVzY2FwaW5nIGFyZSBjb25maWctZHJpdmVuXG4gICAqIHRocm91Z2ggYHNhbml0aXplLWRhdGFgLCBub3Qgc3ludGF4LWRyaXZlbiB0aHJvdWdoIGJyYWNrZXQgY291bnQuXG4gICAqIE5vcm1hbGl6aW5nIGF0IGNvbnN0cnVjdGlvbiB0aW1lIG1lYW5zIHRoZSByZXN0IG9mIHRoZSBlbmdpbmUgKGxvb3BcbiAgICogcmVnZXhlcywgQ01TIHByb3h5IHdyYXBwaW5nLCB2YXJpYWJsZSBzdWJzdGl0dXRpb24pIG9ubHkgcmVhc29uc1xuICAgKiBhYm91dCBvbmUgYnJhY2tldCBzdHlsZS5cbiAgICovXG4gIHN0YXRpYyBub3JtYWxpemVUcmlwbGVCcmFja2V0cyh0ZW1wbGF0ZSkge1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgIT09ICdzdHJpbmcnIHx8IHRlbXBsYXRlLmluZGV4T2YoJ3t7eycpID09PSAtMSkge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlXG4gICAgfVxuICAgIC8vIE1hdGNoIGJhbGFuY2VkIHRyaXBsZS1icmFja2V0cyBjb250YWluaW5nIGFueXRoaW5nIHRoYXQgaXNuJ3QgYVxuICAgIC8vIGJyYWNlIGNoYXJhY3Rlci4gS2VlcHMgdGhlIGNhcHR1cmVkIGlubmVyIGNvbnRlbnQsIHN0cmlwcyB0aGVcbiAgICAvLyBvdXRlciB0aGlyZCBicmFjZSBvbiBlYWNoIHNpZGUuXG4gICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1xce1xce1xceyhbXnt9XSs/KVxcfVxcfVxcfS9nLCAne3skMX19JylcbiAgfVxuXG4gIC8vIEZJTkQgQ09SUkVDVCBORVNURUQgREFUQVxuICBzdGF0aWMgZ2V0TmVzdGVkRGF0YVJlZHVjZXIoZGF0YSA9IHt9LCBwYXJhbSA9ICcnKSB7XG4gICAgY29uc3QgZGF0YVJlZHVjZXIgPSAobmVzdGVkRGF0YSwgc3RyKSA9PiB7XG4gICAgICBpZiAobmVzdGVkRGF0YVtzdHJdKSB7XG4gICAgICAgIHJldHVybiBuZXN0ZWREYXRhW3N0cl1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgbmVzdGVkRGF0YSA9PT0gJ3N0cmluZycgPyBuZXN0ZWREYXRhIDogJydcbiAgICB9XG5cbiAgICByZXR1cm4gLyhcXC4pL2dtLnRlc3QoU3RyaW5nKHBhcmFtKSkgPyBTdHJpbmcocGFyYW0pLnNwbGl0KCcuJykucmVkdWNlKGRhdGFSZWR1Y2VyLCBkYXRhKSA6IGRhdGFbcGFyYW1dID8/ICcnXG4gIH1cblxuICBzdGF0aWMgZ2V0U3RyaW5nQXJyYXkodGVtcGxhdGUpIHtcbiAgICBjb25zdCBzdHJBcnIgPSB0ZW1wbGF0ZS5zcGxpdChEb21FbGVtZW50VGVtcGxhdGUuZmluZFRtcGxMb29wc1JFKCkpXG4gICAgY29uc3QgZW1wdHlSRSA9IC9eKFtcXFxcblxcc1xcV10rKSQvXG4gICAgLy8gZmluZFRtcGxMb29wc1JFIGhhcyBUV08gY2FwdHVyZSBncm91cHMgKHRoZSBmdWxsIGxvb3AgbWF0Y2gsIGFuZCB0aGVcbiAgICAvLyBcXDItYmFja3JlZmVyZW5jZWQga2V5IG5hbWUpLiBXaGVuIHVzZWQgd2l0aCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCB0aGVcbiAgICAvLyBzZWNvbmQgZ3JvdXAgaXMgZW1pdHRlZCBpbnRvIHRoZSByZXN1bHQgYXJyYXkgYXMgYSBsZWFrZWQgY2h1bmsuXG4gICAgLy9cbiAgICAvLyBUaGUgY2h1bmtzIGFycml2ZSBpbiBhIHByZWRpY3RhYmxlIDMtc3RlcCBjeWNsZTpcbiAgICAvLyAgIGluZGV4IDA6ICAgICAgICAgICAgICAgIHByZS10ZXh0IGJlZm9yZSB0aGUgZmlyc3QgbG9vcFxuICAgIC8vICAgaW5kZXggMTogZnVsbCBtYXRjaCAgICAgdGhlIGxvb3AgKGtlZXApXG4gICAgLy8gICBpbmRleCAyOiBncm91cC0yIGxlYWsgICB0aGUgbG9vcCdzIGtleSBuYW1lIChkaXNjYXJkKVxuICAgIC8vICAgaW5kZXggMzogICAgICAgICAgICAgICAgYmV0d2Vlbi1sb29wcyB0ZXh0XG4gICAgLy8gICBpbmRleCA0OiBmdWxsIG1hdGNoXG4gICAgLy8gICBpbmRleCA1OiBncm91cC0yIGxlYWtcbiAgICAvLyAgIC4uLlxuICAgIC8vIFNvIGFueSBpbmRleCBpIHdoZXJlIGkgPj0gMiBhbmQgKGkgLSAyKSAlIDMgPT09IDAgaXMgYSBrZXktbmFtZSBsZWFrXG4gICAgLy8gdGhhdCBzaG91bGQgbm90IGZsb3cgaW50byB0aGUgcmVuZGVyIHBpcGVsaW5lLlxuICAgIGNvbnN0IHdpdGhvdXRMZWFrcyA9IHN0ckFyci5maWx0ZXIoKF8sIGkpID0+ICEoaSA+PSAyICYmIChpIC0gMikgJSAzID09PSAwKSlcbiAgICBjb25zdCBmaWx0ZXJPdXRFbXB0eVN0cmluZ3MgPSBzID0+IHMubWF0Y2goZW1wdHlSRSlcbiAgICBjb25zdCBmaW5hbFN0ciA9IHJlamVjdChmaWx0ZXJPdXRFbXB0eVN0cmluZ3MsIHdpdGhvdXRMZWFrcylcblxuICAgIHJldHVybiBmaW5hbFN0clxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2V4IHRoYXQgZmluZHMgdG9wLWxldmVsIGxvb3Agc2VjdGlvbnMsIHBhaXJpbmcgZWFjaCBvcGVuaW5nIHRhZyB3aXRoIGFcbiAgICogY2xvc2luZyB0YWcgb2YgdGhlIFNBTUUgTkFNRSB2aWEgdGhlIFxcMiBiYWNrcmVmZXJlbmNlLiBUaGlzIGlzIHdoYXQgbWFrZXNcbiAgICoge3sjcm93c319PHRyPnt7I2NlbGxzfX08dGQ+e3sufX08L3RkPnt7L2NlbGxzfX08L3RyPnt7L3Jvd3N9fSBtYXRjaCBhcyBhXG4gICAqIHNpbmdsZSBvdXRlciBsb29wIHJhdGhlciB0aGFuIGdldHRpbmcgdHJ1bmNhdGVkIGF0IHRoZSBpbm5lciB7ey9jZWxsc319LlxuICAgKi9cbiAgc3RhdGljIGZpbmRUbXBsTG9vcHNSRSgpIHtcbiAgICByZXR1cm4gLyh7eyMoW1xcdy5dKyl9fVtcXHdcXG5cXHNcXFddKz97e1xcL1xcMn19KS9nbVxuICB9XG5cbiAgc3RhdGljIHBhcnNlVG1wbExvb3BzUkUoKSB7XG4gICAgcmV0dXJuIC8oe3sjKFtcXHcuXSspfX0pKFtcXHdcXG5cXHNcXFddKz8pKHt7XFwvXFwyfX0pL2dtXG4gIH1cblxuICAvKipcbiAgICogUmVnZXggZm9yIGZpbmRpbmcgYSBzaW5nbGUgaW5uZXIgbG9vcCBpbnNpZGUgYW4gb3V0ZXIgbG9vcCdzIGJvZHkuXG4gICAqIElkZW50aWNhbCBpbiBmb3JtIHRvIHBhcnNlVG1wbExvb3BzUkUsIGJ1dCBjcmVhdGVkIGZyZXNoIHRvIGF2b2lkXG4gICAqIHNoYXJlZC1sYXN0SW5kZXggYnVncyB3aXRoIGdsb2JhbCByZWdleGVzIHdoZW4gdXNlZCBpbiAucmVwbGFjZSBjYWxsYmFja3MuXG4gICAqL1xuICBzdGF0aWMgaW5uZXJMb29wUkUoKSB7XG4gICAgcmV0dXJuIC8oe3sjKFtcXHcuXSspfX0pKFtcXHdcXG5cXHNcXFddKz8pKHt7XFwvXFwyfX0pL2dtXG4gIH1cblxuICBzdGF0aWMgc3dhcFBhcmFtc0ZvclRhZ3NSRSgpIHtcbiAgICByZXR1cm4gLyh7eykoLio/KSh9fSkvZ21cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RzIHdoZXRoZXIgYSB0ZW1wbGF0ZSBib2R5IGNvbnRhaW5zIGFueSB7eyNrZXl9fS4uLnt7L2tleX19IHBhaXIuXG4gICAqIFVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIGlubmVyLWxvb3AgcGFzcyBpcyBuZWVkZWQsIGFuZCB0byBkZXRlY3RcbiAgICogdHdvLWxldmVsIG5lc3RpbmcgZm9yIHdhcm5pbmcgcHVycG9zZXMuXG4gICAqL1xuICBzdGF0aWMgaGFzTG9vcChzdHIpIHtcbiAgICByZXR1cm4gRG9tRWxlbWVudFRlbXBsYXRlLmlubmVyTG9vcFJFKCkudGVzdChzdHIpXG4gIH1cblxuICByZW1vdmVUaGlzKCkge1xuICAgIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZmluYWxBcnIgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudGVtcGxhdGVEYXRhID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFJldHVybnMgYSBkb2N1bWVudCBmcmFnbWVudCBnZW5lcmF0ZWQgZnJvbSB0aGUgdGVtcGxhdGUgYW5kIGFueSBhZGRlZCBkYXRhLlxuICAgKi9cbiAgLyoqXG4gICAqIFVud3JhcHMgPHNweW5lLWNtcy1pdGVtPiBlbGVtZW50cyB3aG9zZSBkYXRhLWNtcy1pZCByZXNvbHZlZCB0byBhbiBlbXB0eVxuICAgKiBzdHJpbmcg4oCUIHRva2VucyB0aGF0IGxpdmUgb24gYSBwbGFpbiB3cmFwcGVyIChubyBfX2Ntc19fZGF0YUlkKSByYXRoZXJcbiAgICogdGhhbiBvbiBDTVMgY29udGVudC4gTGVhdmVzIHRoZWlyIGlubmVyIHRleHQgaW4gcGxhY2UsIHNvIHRoZSByZW5kZXJlZFxuICAgKiBET00gbWF0Y2hlcyB3aGF0IGEgbm9uLUNNUyByZW5kZXIgd291bGQgcHJvZHVjZS4gT25seSBydW5zIGluIGF1dGhvcmluZ1xuICAgKiBtb2RlIChpc1Byb3h5RGF0YSB0cnVlKSwgb25lIHBhc3Mgb3ZlciB0aGUgZmluYWwgSFRNTCBzdHJpbmcuXG4gICAqL1xuICBzdGF0aWMgc3RyaXBJbmVydENtc0l0ZW1zKGh0bWwpIHtcbiAgICBpZiAoaHRtbC5pbmRleE9mKCdkYXRhLWNtcy1pZD1cIlwiJykgPT09IC0xKSB7XG4gICAgICByZXR1cm4gaHRtbFxuICAgIH1cbiAgICBjb25zdCBpbmVydFJFID0gLzxzcHluZS1jbXMtaXRlbSBkYXRhLWNtcy1pZD1cIlwiW14+XSo+W1xcc1xcU10qPzxzcHluZS1jbXMtaXRlbS10ZXh0PihbXFxzXFxTXSo/KTxcXC9zcHluZS1jbXMtaXRlbS10ZXh0Plxccyo8XFwvc3B5bmUtY21zLWl0ZW0+L2dcbiAgICByZXR1cm4gaHRtbC5yZXBsYWNlKGluZXJ0UkUsICckMScpXG4gIH1cblxuICByZW5kZXJEb2NGcmFnKCkge1xuICAgIGxldCBodG1sID0gRG9tRWxlbWVudFRlbXBsYXRlLnJlcGxhY2VJbWdQYXRoKHRoaXMuZmluYWxBcnIuam9pbignJykpXG4gICAgaWYgKHRoaXMuaXNQcm94eURhdGEgPT09IHRydWUpIHtcbiAgICAgIGh0bWwgPSBEb21FbGVtZW50VGVtcGxhdGUuc3RyaXBJbmVydENtc0l0ZW1zKGh0bWwpXG4gICAgfVxuICAgIGlmICh0aGlzLnRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBodG1sID0gc2FuaXRpemVIVE1MKGh0bWwpXG4gICAgfVxuICAgIGNvbnN0IGlzVGFibGVTdWJUYWcgPSAvXihbXj5dKj8pKDwpezF9KFxcYikodGhlYWR8Y29sfGNvbGdyb3VwfHRib2R5fHRkfHRmb290fHRyfHRoKShcXGIpKFteXFwwXSopJC8udGVzdChodG1sKVxuICAgIGNvbnN0IGVsID0gaXNUYWJsZVN1YlRhZyA/IGh0bWwgOiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKVxuXG4gICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5yZW1vdmVUaGlzLCAyKVxuICAgIHJldHVybiBlbFxuICB9XG5cbiAgcmVuZGVyVG9TdHJpbmcoKSB7XG4gICAgbGV0IGh0bWwgPSB0aGlzLmZpbmFsQXJyLmpvaW4oJycpXG4gICAgaHRtbCA9IERvbUVsZW1lbnRUZW1wbGF0ZS5yZXBsYWNlSW1nUGF0aChodG1sKVxuICAgIGlmICh0aGlzLmlzUHJveHlEYXRhID09PSB0cnVlKSB7XG4gICAgICBodG1sID0gRG9tRWxlbWVudFRlbXBsYXRlLnN0cmlwSW5lcnRDbXNJdGVtcyhodG1sKVxuICAgIH1cbiAgICBpZiAodGhpcy50ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgLy8gU3RyaW5nKC4uLikgdW53cmFwcyBUcnVzdGVkSFRNTCB3aGVuIHN0cmljdCBtb2RlIGlzIGFjdGl2ZSxcbiAgICAgIC8vIGtlZXBpbmcgdGhpcyBtZXRob2QncyBzdHJpbmcgY29udHJhY3QuXG4gICAgICBodG1sID0gU3RyaW5nKHNhbml0aXplSFRNTChodG1sKSlcbiAgICB9XG4gICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5yZW1vdmVUaGlzLCAyKVxuICAgIHJldHVybiBodG1sXG4gIH1cblxuICBnZXRUZW1wbGF0ZVN0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbEFyci5qb2luKCcnKVxuICB9XG5cbiAgZm9ybWF0VGVtcGxhdGUodGVtcGxhdGUpIHtcbiAgICByZXR1cm4gWydTQ1JJUFQnLCAnVEVNUExBVEUnXS5pbmNsdWRlcyhwcm9wKCdub2RlTmFtZScsIHRlbXBsYXRlKSkgPT09IHRydWUgPyB0ZW1wbGF0ZS5pbm5lckhUTUwgOiB0ZW1wbGF0ZVxuICB9XG5cbiAgZ2V0RGF0YVZhbEZyb21QYXRoU3RyKHBhdGhTdHIsIGRhdGFGaWxlKSB7XG4gICAgY29uc3QgcGF0aEFyciA9IFN0cmluZyhwYXRoU3RyKS5zcGxpdCgnLicpXG4gICAgY29uc3QgcGF0aERhdGEgPSBwYXRoKHBhdGhBcnIsIGRhdGFGaWxlKVxuICAgIHJldHVybiBwYXRoRGF0YSB8fCAnJ1xuICB9XG5cbiAgYWRkUGFyYW1zKHN0cikge1xuICAgIGNvbnN0IHJlcGxhY2VUYWdzID0gKHN0ciwgcDEsIHAyLCBwMykgPT4ge1xuICAgICAgcmV0dXJuIERvbUVsZW1lbnRUZW1wbGF0ZS5nZXROZXN0ZWREYXRhUmVkdWNlcih0aGlzLnRlbXBsYXRlRGF0YSwgcDIpXG4gICAgfVxuICAgIHJldHVybiBzdHIucmVwbGFjZShEb21FbGVtZW50VGVtcGxhdGUuc3dhcFBhcmFtc0ZvclRhZ3NSRSgpLCByZXBsYWNlVGFncylcbiAgfVxuXG4gIHN0YXRpYyByZXBsYWNlSW1nUGF0aCh0ZW1wbGF0ZVN0cikge1xuICAgIGNvbnN0IHsgSU1HX1BBVEggfSA9IFNweW5lQXBwUHJvcGVydGllc1xuICAgIGlmIChJTUdfUEFUSCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZW1wbGF0ZVN0ciA9IHRlbXBsYXRlU3RyLnJlcGxhY2VBbGwoL3NyY1xccyo9XFxzKihbJ1wiXSlpbWdzXFwvL2csIGBzcmM9JDEke0lNR19QQVRIfWApXG4gICAgICByZXR1cm4gdGVtcGxhdGVTdHIucmVwbGFjZUFsbCgvdXJsXFwoXFxzKihbJ1wiXT8paW1nc1xcLy9nLCBgdXJsKCQxJHtJTUdfUEFUSH1gKVxuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGVTdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHNpbmdsZSBpbm5lciBsb29wIChvbmUgbGV2ZWwgZG93bikgaW5zaWRlIGFuIG91dGVyLWxvb3AgYm9keSxcbiAgICogdXNpbmcgYHBhcmVudEl0ZW1gIGFzIHRoZSBkYXRhIGNvbnRleHQuIElmIHRoZSBpbm5lciBib2R5IGl0c2VsZiBjb250YWluc1xuICAgKiBhbm90aGVyIGxvb3AsIGEgZGVidWctbW9kZSB3YXJuaW5nIGlzIGxvZ2dlZCBhbmQgdGhhdCBkZWVwZXIgbG9vcCBpcyBub3RcbiAgICogcHJvY2Vzc2VkLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBib2R5IHN0cmluZyB3aXRoIGFueSBpbm5lciBsb29wIGV4cGFuZGVkLCByZWFkeSBmb3JcbiAgICogb3V0ZXItbGV2ZWwgdmFyaWFibGUgc3Vic3RpdHV0aW9uLlxuICAgKi9cbiAgcHJvY2Vzc0lubmVyTG9vcChib2R5U3RyLCBwYXJlbnRJdGVtKSB7XG4gICAgY29uc3QgaW5uZXJSRSA9IERvbUVsZW1lbnRUZW1wbGF0ZS5pbm5lckxvb3BSRSgpXG5cbiAgICByZXR1cm4gYm9keVN0ci5yZXBsYWNlKGlubmVyUkUsIChmdWxsTWF0Y2gsIG9wZW5UYWcsIGlubmVyS2V5LCBpbm5lckJvZHkgLyosIGNsb3NlVGFnICovKSA9PiB7XG4gICAgICAvLyBEZXRlY3QgZGlzYWxsb3dlZCBzZWNvbmQtbGV2ZWwgbmVzdGluZyBpbnNpZGUgdGhlIGlubmVyIGJvZHkuXG4gICAgICBpZiAoRG9tRWxlbWVudFRlbXBsYXRlLmhhc0xvb3AoaW5uZXJCb2R5KSA9PT0gdHJ1ZSkge1xuICAgICAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlICYmIHRoaXMudGVzdE1vZGUgIT09IHRydWUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnU3B5bmUgV2FybmluZzogRG9tRWxlbWVudFRlbXBsYXRlIHN1cHBvcnRzIG9uZSBsZXZlbCBvZiBuZXN0ZWQgYXJyYXkgbG9vcHMuICcgK1xuICAgICAgICAgICAgYEEgZGVlcGVyIG5lc3RlZCBsb29wIHdhcyBkZXRlY3RlZCBpbnNpZGUgXCJ7eyMke2lubmVyS2V5fX19XCIuIGAgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIHJlc3RydWN0dXJpbmcgdmlhIG5lc3RlZCBWaWV3U3RyZWFtcyBpbnN0ZWFkLidcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RyaXAgdW5zdXBwb3J0ZWQgZGVlcGVyLWxldmVsIHNlY3Rpb24gdGFncyBzbyB0aGV5IGRvbid0IGVtaXQgYXNcbiAgICAgICAgLy8gZ2FyYmxlZCB2YXJpYWJsZXMgZHVyaW5nIHN1YnN0aXR1dGlvbiBiZWxvdy5cbiAgICAgICAgaW5uZXJCb2R5ID0gaW5uZXJCb2R5LnJlcGxhY2UoL3t7WyMvXVtcXHcuXSt9fS9nLCAnJylcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5uZXJEYXRhID0gRG9tRWxlbWVudFRlbXBsYXRlLmdldE5lc3RlZERhdGFSZWR1Y2VyKHBhcmVudEl0ZW0sIGlubmVyS2V5KVxuXG4gICAgICBpZiAoaXNOaWwoaW5uZXJEYXRhKSA9PT0gdHJ1ZSB8fCBpc0VtcHR5KGlubmVyRGF0YSkpIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlubmVyQXJyID0gQXJyYXkuaXNBcnJheShpbm5lckRhdGEpID8gaW5uZXJEYXRhIDogW2lubmVyRGF0YV1cblxuICAgICAgLy8gV2hpbGUgcHJvY2Vzc2luZyBhbiBpbm5lciBsb29wLCB0aGUgXCJvdXRlclwiIGRhdGEgZm9yIENNUyBzdHJpbmctaXRlbVxuICAgICAgLy8gbG9va3VwcyBpcyB0aGUgY3VycmVudCBpbm5lckRhdGEgKHRoZSBhcnJheS9vYmplY3QgdGhlIGlubmVyIGl0ZW1zXG4gICAgICAvLyBiZWxvbmcgdG8pLCBub3QgdGhlIG9yaWdpbmFsIG91dGVyLWxvb3AgYXJyYXkuIFN3YXAgaXQgaW4sIHJlc3RvcmVcbiAgICAgIC8vIHdoZW4gdGhlIGlubmVyIHBhc3MgY29tcGxldGVzLlxuICAgICAgY29uc3QgcHJldmlvdXNPdXRlciA9IHRoaXMuY3VycmVudE91dGVyTG9vcERhdGFcbiAgICAgIHRoaXMuY3VycmVudE91dGVyTG9vcERhdGEgPSBpbm5lckRhdGFcblxuICAgICAgY29uc3QgcmVuZGVyZWQgPSBpbm5lckFyci5tYXAoKGlubmVySXRlbSwgaW5uZXJJZHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3Vic3RpdHV0ZUZvckl0ZW0oaW5uZXJCb2R5LCBpbm5lckl0ZW0sIGlubmVySWR4KVxuICAgICAgfSkuam9pbignJylcblxuICAgICAgdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YSA9IHByZXZpb3VzT3V0ZXJcbiAgICAgIHJldHVybiByZW5kZXJlZFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU3Vic3RpdHV0ZXMge3suLi59fSB2YXJpYWJsZXMgaW4gYHN0cmAgdXNpbmcgYGl0ZW1gIGFzIHRoZSBkYXRhIGNvbnRleHQuXG4gICAqXG4gICAqIFRocmVlIGNhc2VzOlxuICAgKlxuICAgKiAgIDEuIFN0cmluZyBpdGVtICsgcHJpbWl0aXZlIHt7Ln19L3t7Lip9fSB0ZW1wbGF0ZTpcbiAgICogICAgICBkaXJlY3QgdGV4dCBzdWJzdGl0dXRpb24gKG5vIENNUyB3cmFwcGluZyBwb3NzaWJsZSDigJQgdGhpcyBwYXRoIG9ubHlcbiAgICogICAgICBydW5zIHdoZW4gZm9ybWF0VGVtcGxhdGVGb3JQcm94eURhdGEgaGFzIE5PVCB3cmFwcGVkIHRoZSB0YWcpLlxuICAgKlxuICAgKiAgIDIuIFN0cmluZyBpdGVtICsgbm9uLXByaW1pdGl2ZSB0ZW1wbGF0ZTpcbiAgICogICAgICBjYW4gaGFwcGVuIHR3byB3YXlzOiAoYSkgYSBzZWN0aW9uIGl0ZXJhdGluZyBzdHJpbmdzIHdoZXJlXG4gICAqICAgICAgZm9ybWF0VGVtcGxhdGVGb3JQcm94eURhdGEgaGFzIHJlcGxhY2VkIHt7Ln19L3t7Lip9fSB3aXRoXG4gICAqICAgICAge3tzcHluZUxvb3BLZXl9fSArIHt7b3JpZ0tleX19IGluc2lkZSBhIDxzcHluZS1jbXMtaXRlbT4gd3JhcHBlcixcbiAgICogICAgICBvciAoYikgYSBub24tcHJveHkgdGVtcGxhdGUgd2l0aCBwb3NpdGlvbmFsIHRva2VucyBvbmx5LlxuICAgKiAgICAgIEJ1aWxkIGEgY29udGV4dCB0aGF0IHNhdGlzZmllcyBib3RoIOKAlCBzcHluZUxvb3BLZXkgPSB0aGUgc3RyaW5nLFxuICAgKiAgICAgIHBsdXMgX19jbXNfX2RhdGFJZCAvIG9yaWdLZXkgbG9va2VkIHVwIG9uIHRoZSBwYXJlbnQgYXJyYXkgd2hlblxuICAgKiAgICAgIHByb3h5IGRhdGEgaXMgYWN0aXZlLlxuICAgKlxuICAgKiAgIDMuIE9iamVjdCBpdGVtOlxuICAgKiAgICAgIHRoZSBjb252ZW50aW9uYWwgcGF0aCDigJQgYnVpbGQgYSBsb29rdXAgb2JqZWN0IHdpdGggdGhlIGl0ZW0nc1xuICAgKiAgICAgIHByb3BlcnRpZXMgcGx1cyBwb3NpdGlvbmFsIHRva2Vucywgc3Vic3RpdHV0ZSBieSBwcm9wZXJ0eSBuYW1lXG4gICAqICAgICAgb3IgZG90LXBhdGguXG4gICAqL1xuICBzdWJzdGl0dXRlRm9ySXRlbShzdHIsIGl0ZW0sIGluZGV4KSB7XG4gICAgLy8gQ2FzZSAxOiBzdHJpbmcgaXRlbSB3aXRoIGEgcHJpbWl0aXZlLXRhZyB0ZW1wbGF0ZS5cbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoRG9tRWxlbWVudFRlbXBsYXRlLmlzUHJpbWl0aXZlVGFnKHN0cikpIHtcbiAgICAgICAgY29uc3QgZXNjYXBlZCA9IGl0ZW0ucmVwbGFjZSgvXFwkL2csICckJCQkJykgLy8gJCAtPiAkJCBmb3IgcmVwbGFjZSgpIGxpdGVyYWwgc2FmZXR5XG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZShEb21FbGVtZW50VGVtcGxhdGUuc3dhcFBhcmFtc0ZvclRhZ3NSRSgpLCBlc2NhcGVkKVxuICAgICAgfVxuXG4gICAgICAvLyBDYXNlIDI6IHN0cmluZyBpdGVtIHdpdGggYSBub24tcHJpbWl0aXZlIHRlbXBsYXRlLlxuICAgICAgY29uc3QgY3R4ID0gdGhpcy5idWlsZFN0cmluZ0l0ZW1Db250ZXh0KGl0ZW0sIGluZGV4KVxuICAgICAgcmV0dXJuIHRoaXMuc3Vic3RpdHV0ZU9iamVjdChzdHIsIGN0eClcbiAgICB9XG5cbiAgICAvLyBDYXNlIDM6IG9iamVjdCBpdGVtLlxuICAgIGNvbnN0IGRhdGFPYmogPSB0aGlzLmJ1aWxkSXRlbUNvbnRleHQoaXRlbSwgaW5kZXgpXG4gICAgcmV0dXJuIHRoaXMuc3Vic3RpdHV0ZU9iamVjdChzdHIsIGRhdGFPYmopXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBwZXItaXRlcmF0aW9uIGxvb2t1cCBjb250ZXh0IGZvciBhIFNUUklORyBpdGVtLlxuICAgKlxuICAgKiBBbHdheXMgaW5jbHVkZXM6XG4gICAqICAgLSBzcHluZUxvb3BLZXk6IHRoZSBzdHJpbmcgaXRzZWxmIChtYXRjaGVzIHRoZSBDTVMgcHJveHkgd3JhcHBpbmcsXG4gICAqICAgICB3aGljaCByZXBsYWNlcyB7ey59fS97ey4qfX0gaW5zaWRlIHN0cmluZyBsb29wcyB3aXRoIHt7c3B5bmVMb29wS2V5fX0pXG4gICAqICAgLSBsb29wSW5kZXggLyBsb29wTnVtOiBwb3NpdGlvbmFsIHRva2Vuc1xuICAgKlxuICAgKiBXaGVuIHByb3h5IGRhdGEgaXMgYWN0aXZlLCBhZGRpdGlvbmFsbHkgaW5jbHVkZXM6XG4gICAqICAgLSBfX2Ntc19fZGF0YUlkOiB0aGUgQ01TIGlkZW50aWZpZXIgZm9yIHRoZSBQQVJFTlQgYXJyYXkgKHRoZSBzdHJpbmdcbiAgICogICAgIGl0ZW1zIHRoZW1zZWx2ZXMgYXJlIHByaW1pdGl2ZXMgYW5kIGRvbid0IGNhcnJ5IHRoZSBpZClcbiAgICogICAtIG9yaWdLZXk6IHRoZSBvcmlnaW5hbCBrZXkgdGhlIENNUyB1c2VzIHRvIGFkZHJlc3MgdGhpcyBzcGVjaWZpY1xuICAgKiAgICAgc3RyaW5nIHdpdGhpbiBpdHMgcGFyZW50LCBsb29rZWQgdXAgdmlhIF9fY21zX19rZXlGb3JfPGl0ZW0+XG4gICAqL1xuICBidWlsZFN0cmluZ0l0ZW1Db250ZXh0KGl0ZW0sIGluZGV4KSB7XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIHNweW5lTG9vcEtleTogaXRlbSxcbiAgICAgIGxvb3BJbmRleDogaW5kZXgsXG4gICAgICBsb29wTnVtOiBpbmRleCArIDFcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1Byb3h5RGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgb3V0ZXJEYXRhID0gdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YVxuICAgICAgaWYgKG91dGVyRGF0YSAmJiB0eXBlb2Ygb3V0ZXJEYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb250ZXh0Ll9fY21zX19kYXRhSWQgPSBvdXRlckRhdGEuX19jbXNfX2RhdGFJZCB8fCAnJ1xuICAgICAgICBjb25zdCBrZXlJZFN0ciA9IGBfX2Ntc19fa2V5Rm9yXyR7aXRlbX1gXG4gICAgICAgIGNvbnRleHQub3JpZ0tleSA9IG91dGVyRGF0YVtrZXlJZFN0cl0gIT09IHVuZGVmaW5lZCA/IG91dGVyRGF0YVtrZXlJZFN0cl0gOiAnJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5fX2Ntc19fZGF0YUlkID0gJydcbiAgICAgICAgY29udGV4dC5vcmlnS2V5ID0gJydcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgcGVyLWl0ZXJhdGlvbiBsb29rdXAgY29udGV4dCBmb3IgYW4gT0JKRUNUIGl0ZW0sIGluY2x1ZGluZ1xuICAgKiBDTVMtcHJveHkgbWV0YWRhdGEgd2hlbiB0aGlzIHRlbXBsYXRlIGlzIHJlbmRlcmluZyBwcm94aWVkIGRhdGEuXG4gICAqL1xuICBidWlsZEl0ZW1Db250ZXh0KGl0ZW0sIGluZGV4KSB7XG4gICAgY29uc3QgY29udGV4dCA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0sIHtcbiAgICAgIGxvb3BJbmRleDogaW5kZXgsXG4gICAgICBsb29wTnVtOiBpbmRleCArIDFcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMuaXNQcm94eURhdGEgPT09IHRydWUpIHtcbiAgICAgIGNvbnRleHQuX19jbXNfX2RhdGFJZCA9IGl0ZW0uX19jbXNfX2RhdGFJZFxuICAgICAgY29udGV4dC5zcHluZUxvb3BLZXkgPSBpdGVtXG4gICAgICBjb250ZXh0Lmxvb3BJbmRleCA9IGluZGV4XG4gICAgICBjb250ZXh0Lmxvb3BOdW0gPSBpbmRleCArIDFcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIHt7a2V5fX0gYW5kIHt7YS5iLmN9fSB0b2tlbnMgaW4gYHN0cmAgdXNpbmcgYGN0eGAgYXMgdGhlIHNvdXJjZS5cbiAgICovXG4gIHN1YnN0aXR1dGVPYmplY3Qoc3RyLCBjdHgpIHtcbiAgICBjb25zdCByZURvdCA9IC8oXFwuKS9nbVxuICAgIGNvbnN0IHBvc2l0aW9uYWwgPSB7IGxvb3BJbmRleDogY3R4Lmxvb3BJbmRleCwgbG9vcE51bTogY3R4Lmxvb3BOdW0gfVxuXG4gICAgY29uc3QgcmVwbGFjZXIgPSAobWF0Y2gsIHAxLCBwMikgPT4ge1xuICAgICAgLy8gQXV0by1pbmplY3RlZCBwb3NpdGlvbmFsIHRva2VucyB0YWtlIHByZWNlZGVuY2VcbiAgICAgIGlmIChwb3NpdGlvbmFsW3AyXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcG9zaXRpb25hbFtwMl1cblxuICAgICAgLy8gU2ltcGxlIGtleSBhY2Nlc3NcbiAgICAgIGlmIChyZURvdC50ZXN0KHAyKSA9PT0gZmFsc2UgJiYgY3R4W3AyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBjdHhbcDJdXG4gICAgICB9XG5cbiAgICAgIC8vIERvdC1wYXRoIGFjY2Vzc1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YVZhbEZyb21QYXRoU3RyKHAyLCBjdHgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKERvbUVsZW1lbnRUZW1wbGF0ZS5zd2FwUGFyYW1zRm9yVGFnc1JFKCksIHJlcGxhY2VyKVxuICB9XG5cbiAgLyoqXG4gICAqIEVudHJ5IHBvaW50IGZvciBlYWNoIHRvcC1sZXZlbCBsb29wIG1hdGNoLiBFeHRyYWN0cyBsb29wIGRhdGEsIHJ1bnMgdGhlXG4gICAqIGlubmVyLWxvb3AgcGFzcyBvbiB0aGUgYm9keSBmb3IgZWFjaCBpdGVyYXRpb24sIHRoZW4gc3Vic3RpdHV0ZXMgb3V0ZXJcbiAgICogdmFyaWFibGVzLlxuICAgKi9cbiAgcGFyc2VUaGVUbXBsTG9vcChzdHIsIHAxLCBwMiwgcDMpIHtcbiAgICBjb25zdCBvdXRlckJvZHkgPSBwM1xuICAgIGNvbnN0IGVsRGF0YSA9IERvbUVsZW1lbnRUZW1wbGF0ZS5nZXROZXN0ZWREYXRhUmVkdWNlcih0aGlzLnRlbXBsYXRlRGF0YSwgcDIpXG5cbiAgICBpZiAoaXNOaWwoZWxEYXRhKSA9PT0gdHJ1ZSB8fCBpc0VtcHR5KGVsRGF0YSkpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIC8vIFN0YXNoIHRoZSBvdXRlciBkYXRhIHNvIHRoYXQgcGVyLWl0ZXJhdGlvbiBzdWJzdGl0dXRpb24gY2FuIGxvb2sgdXBcbiAgICAvLyBDTVMgcHJveHkgbWV0YWRhdGEgKF9fY21zX19kYXRhSWQsIF9fY21zX19rZXlGb3JfKikgdGhhdCBsaXZlcyBvbiB0aGVcbiAgICAvLyBwYXJlbnQgYXJyYXkgb2JqZWN0IOKAlCBub3Qgb24gaW5kaXZpZHVhbCBzdHJpbmcgZWxlbWVudHMuXG4gICAgY29uc3QgcHJldmlvdXNPdXRlciA9IHRoaXMuY3VycmVudE91dGVyTG9vcERhdGFcbiAgICB0aGlzLmN1cnJlbnRPdXRlckxvb3BEYXRhID0gZWxEYXRhXG5cbiAgICBjb25zdCBlbEFyciA9IEFycmF5LmlzQXJyYXkoZWxEYXRhKSA/IGVsRGF0YSA6IFtlbERhdGFdXG5cbiAgICAvLyBXaGV0aGVyIHRoZSBvdXRlciBib2R5IGNvbnRhaW5zIGFuIGlubmVyIGxvb3AgaXMgY2hlYXAgdG8gdGVzdCBhbmQgbGV0c1xuICAgIC8vIHVzIHNraXAgdGhlIGlubmVyLWxvb3AgcHJvY2Vzc2luZyBlbnRpcmVseSBmb3IgdGhlIGNvbW1vbiBzaW5nbGUtbGV2ZWwgY2FzZS5cbiAgICBjb25zdCBib2R5SGFzSW5uZXJMb29wID0gRG9tRWxlbWVudFRlbXBsYXRlLmhhc0xvb3Aob3V0ZXJCb2R5KVxuXG4gICAgY29uc3QgcmVuZGVyZWQgPSBlbEFyci5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBib2R5ID0gYm9keUhhc0lubmVyTG9vcFxuICAgICAgICA/IHRoaXMucHJvY2Vzc0lubmVyTG9vcChvdXRlckJvZHksIGl0ZW0pXG4gICAgICAgIDogb3V0ZXJCb2R5XG5cbiAgICAgIHJldHVybiB0aGlzLnN1YnN0aXR1dGVGb3JJdGVtKGJvZHksIGl0ZW0sIGluZGV4KVxuICAgIH0pLmpvaW4oJycpXG5cbiAgICB0aGlzLmN1cnJlbnRPdXRlckxvb3BEYXRhID0gcHJldmlvdXNPdXRlclxuICAgIHJldHVybiByZW5kZXJlZFxuICB9XG59XG4iLCJpbXBvcnQgeyBiYXNlQ29yZU1peGlucyB9IGZyb20gJy4uL3V0aWxzL21peGlucy9iYXNlLWNvcmUtbWl4aW5zLmpzJ1xuaW1wb3J0IHsgc3B5bmVXYXJuIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtd2Fybi5qcydcbmltcG9ydCB7IERvbUVsZW1lbnRUZW1wbGF0ZSB9IGZyb20gJy4vZG9tLWVsZW1lbnQtdGVtcGxhdGUuanMnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlLmpzJ1xuaW1wb3J0IHsgc2FuaXRpemVBdHRyaWJ1dGUsIGFwcGx5RWxlbWVudEhhcmRlbmluZyB9IGZyb20gJy4uL3V0aWxzL3Nhbml0aXplLWRhdGEuanMnXG5pbXBvcnQgeyBpcywgZGVmYXVsdFRvLCBwaWNrLCBtYXBPYmpJbmRleGVkLCBmb3JFYWNoT2JqSW5kZXhlZCwgcGlwZSB9IGZyb20gJ3JhbWRhJ1xuXG5jbGFzcyBEb21FbGVtZW50IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgRG9tRWxlbWVudFxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgaXMgdGhlIFZpZXdTdHJlYW0gcmVuZGVyaW5nIGVuZ2luZS48L3A+XG4gICAqIDxwPlRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHByb2Nlc3MgZm9yIGNyZWF0aW5nIEhUTUxFbGVtZW50cyB0aGF0IGRvIG5vdCByZXF1aXJlIHRoZSBsb2dpYyBhbmQgb3ZlcmhlYWQgb2YgYSBWaWV3U3RyZWFtIGluc3RhbmNlLjwvcD5cbiAgICogPGJ1dHRvbiBjbGFzcz0nbW9kYWwtYnRuIGJ0biBidG4tYmx1ZS1yZWYnIGRhdGEtdHlwZT0nbW9kYWwtd2luZG93JyBkYXRhLW51bT04MDAgZGF0YS12YWx1ZT0nYXR0cmlidXRlcyc+VmlldyBBdHRyaWJ1dGVzPC9idXR0b24+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZSB0aGUgdGFnbmFtZSBmb3IgdGhpcyBkb20gZWxlbWVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgYW55IGRvbUVsZW1lbnQgYXR0cmlidXRlIChleGNlcHQgZm9yIGNsYXNzIClcbiAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBkYXRhIHN0cmluZyBmb3IgdGV4dCB0YWdzIGFuZCBqc29uIGZvciB0ZW1wbGF0ZXNcbiAgICogQHBhcmFtIHt0ZW1wbGF0ZX0gdGVtcGxhdGVcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByb3BzLnRhZ05hbWUgLSA9ICdkaXYnOyBEZWZhdWx0IGZvciB0YWdOYW1lLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuYXR0cmlidXRlcyAtID0ge307IFRoaXMgY2FuIGJlIGFueSB2YWxpZCBIVE1MIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIHRhZ05hbWUuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfE9iamVjdH0gcHJvcHMuZGF0YSA9IHVuZGVmaW5lZDsgVGhpcyBpcyBlaXRoZXIgYSBTdHJpbmcgZm9yIGFuIGVsZW1lbnQgb3IgSlNPTiBkYXRhIG9iamVjdCBmb3IgYSB0ZW1wbGF0ZS5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd8SFRNTH0gcHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWQ7IElmIGEgdGVtcGxhdGUgaXMgZGVmaW5lZCwgdGhlIERvbUVsZW1lbnQgd2lsbCB1c2UgaXQuXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30sIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICBjb25zdCBjaGVja0RlZmF1bHQgPSAoZGZsdCwgdmFsKSA9PiBkZWZhdWx0VG8oZGZsdCkodmFsKVxuXG4gICAgcHJvcHMudGFnTmFtZSA9IGNoZWNrRGVmYXVsdCgnZGl2JywgcHJvcHMudGFnTmFtZSlcblxuICAgIHByb3BzLmF0dHJpYnV0ZXMgPSBwcm9wcy5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgPyBwcm9wcy5hdHRyaWJ1dGVzIDogdGhpcy5nZXREb21BdHRyaWJ1dGVzKHByb3BzKVxuICAgIHByb3BzLmF0dHJzID0gdGhpcy51cGRhdGVBdHRycyhwcm9wcy5hdHRyaWJ1dGVzKVxuXG4gICAgcHJvcHMuZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICB0aGlzLnRlc3RNb2RlID0gdGVzdE1vZGVcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgfVxuXG4gIHNldFByb3Aoa2V5LCB2YWwpIHtcbiAgICB0aGlzLnByb3BzW2tleV0gPSB2YWxcbiAgfVxuXG4gIGdldFByb3AodmFsKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNbdmFsXVxuICB9XG5cbiAgZ2V0IGVsKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmVsXG4gIH1cblxuICBzZXRFbEF0dHJzKGVsLCBwYXJhbXMpIHtcbiAgICBjb25zdCB0ZXN0TW9kZSA9IHRoaXMudGVzdE1vZGUgPT09IHRydWVcbiAgICBjb25zdCBhZGRBdHRyaWJ1dGVzID0gKHZhbCwga2V5KSA9PiB7XG4gICAgICBjb25zdCBhZGRUb0RhdGFzZXQgPSAodmFsLCBrZXkpID0+IHsgZWwuZGF0YXNldFtrZXldID0gdmFsIH1cbiAgICAgIGlmIChrZXkgPT09ICdkYXRhc2V0Jykge1xuICAgICAgICAvLyBEYXRhc2V0IHZhbHVlcyBhcmUgaW5lcnQgdGV4dCBhbmQgYXJlIHRoZSBmcmFtZXdvcmsncyBwYXlsb2FkXG4gICAgICAgIC8vIHN1cmZhY2U7IHRoZXkgYXJlIGFwcGxpZWQgYXMtaXMuXG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKGFkZFRvRGF0YXNldCwgdmFsKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHsgYWxsb3dlZCwgdmFsdWUgfSA9IHNhbml0aXplQXR0cmlidXRlKGtleSwgdmFsLCBlbC50YWdOYW1lKVxuICAgICAgICBpZiAoYWxsb3dlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHNweW5lV2FybihgU1BZTkUgV0FSTklORzogVGhlIGF0dHJpYnV0ZSBcIiR7a2V5fVwiIHdhcyByZW1vdmVkIGR1cmluZyBzYW5pdGl6YXRpb24uYCwgZWwpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdmFsID0gdmFsdWVcbiAgICAgIH1cblxuICAgICAgZWwuc2V0QXR0cmlidXRlKGtleSwgdmFsKVxuICAgIH1cbiAgICB0aGlzLmdldFByb3AoJ2F0dHJzJykuZm9yRWFjaChhZGRBdHRyaWJ1dGVzKVxuXG4gICAgaWYgKHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBhcHBseUVsZW1lbnRIYXJkZW5pbmcoZWwpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICB1cGRhdGVBdHRycyhwYXJhbXMsIG0pIHtcbiAgICBjb25zdCB0aGVNYXAgPSBtICE9PSB1bmRlZmluZWQgPyBtIDogbmV3IE1hcCgpXG4gICAgY29uc3QgYWRkQXR0cmlidXRlcyA9ICh2YWwsIGtleSkgPT4gdGhlTWFwLnNldChrZXksIHZhbClcbiAgICBtYXBPYmpJbmRleGVkKGFkZEF0dHJpYnV0ZXMsIHBhcmFtcylcbiAgICByZXR1cm4gdGhlTWFwXG4gIH1cblxuICBhZGRUZW1wbGF0ZShlbCkge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5nZXRQcm9wKCd0ZW1wbGF0ZScpXG5cbiAgICBjb25zdCBhZGRUbXBsID0gKHRlbXBsYXRlKSA9PiB7XG4gICAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0UHJvcCgnZGF0YScpXG4gICAgICBkYXRhID0gaXMoT2JqZWN0LCBkYXRhKSA/IGRhdGEgOiB7fVxuICAgICAgY29uc3QgZnJhZyA9IG5ldyBEb21FbGVtZW50VGVtcGxhdGUodGVtcGxhdGUsIGRhdGEsIHsgdGVzdE1vZGU6IHRoaXM/LnRlc3RNb2RlIH0pLnJlbmRlckRvY0ZyYWcoKVxuICAgICAgY29uc3QgZnJhZ0lzU3RyaW5nID0gaXMoU3RyaW5nLCBmcmFnKVxuICAgICAgZnJhZ0lzU3RyaW5nID8gZWwuaW5uZXJIVE1MID0gZnJhZyA6IGVsLmFwcGVuZENoaWxkKGZyYWcpXG4gICAgICByZXR1cm4gZWxcbiAgICB9XG4gICAgY29uc3QgZG9Ob3RoaW5nID0gKGVsKSA9PiBlbFxuICAgIHJldHVybiB0ZW1wbGF0ZSAhPT0gdW5kZWZpbmVkID8gYWRkVG1wbCh0ZW1wbGF0ZSkgOiBkb05vdGhpbmcoZWwpXG4gIH1cblxuICBjcmVhdGVFbGVtZW50KHRhZ05hbWUgPSAnZGl2Jykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpXG4gIH1cblxuICBhZGRDb250ZW50KGVsKSB7XG4gICAgY29uc3QgdGV4dCA9ICh0aGlzLmdldFByb3AoJ2RhdGEnKSlcbiAgICBjb25zdCBpc1RleHQgPSBpcyhTdHJpbmcsIHRleHQpXG4gICAgaWYgKGlzVGV4dCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgdHh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dClcbiAgICAgIGVsLmFwcGVuZENoaWxkKHR4dClcbiAgICB9XG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICBleGVjdXRlKCkge1xuICAgIGNvbnN0IGVsID0gcGlwZShcbiAgICAgIHRoaXMuY3JlYXRlRWxlbWVudC5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5zZXRFbEF0dHJzLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmFkZFRlbXBsYXRlLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmFkZENvbnRlbnQuYmluZCh0aGlzKVxuICAgICkodGhpcy5nZXRQcm9wKCd0YWdOYW1lJykpXG4gICAgLy8gdGhpcy5nZXRQcm9wKCdmcmFnbWVudCcpLmFwcGVuZENoaWxkKGVsKTtcbiAgICB0aGlzLnByb3BzLmVsID0gZWxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJlbmRlciB0aGUgSFRNTCBFbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gSFRNTEVsZW1lbnRcbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHRoaXMucHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmRhdGEgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmF0dHJpYnV0ZXMgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKCdlbCcpXG4gIH1cblxuICByZW5kZXJUb0hUTUxTdHJpbmcoKSB7XG4gICAgdGhpcy5leGVjdXRlKClcbiAgICB0aGlzLnByb3BzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5kYXRhID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5hdHRyaWJ1dGVzID0gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcCgnZWwnKS5vdXRlckhUTUxcbiAgfVxuXG4gIHJldHVybklmRGVmaW5lZChvYmosIHZhbCkge1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNPYmogPSB0eXBlb2YgKHZhbCkgPT09ICd1bmRlZmluZWQnXG4gICAgICBpc09iaiA9PT0gZmFsc2UgPyBvYmpbdmFsXSA9IHZhbCA6IG9ialt2YWxdID0gZGVlcE1lcmdlKG9ialt2YWxdLCB2YWwpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlcHJvcHModmFsKSB7XG4gICAgdGhpcy5yZXR1cm5JZkRlZmluZWQodGhpcy5wcm9wcywgdmFsKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB1cGRhdGVwcm9wc0FuZFJ1bih2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZXByb3BzKHZhbClcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHJldHVybiB0aGlzLmdldFByb3AoJ2ZyYWdtZW50JylcbiAgfVxuXG4gIHVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5nZXRQcm9wKCdlbCcpLnJlbW92ZSgpXG4gICAgICB0aGlzLnByb3BzID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmdjKClcbiAgICB9XG4gIH1cblxuICB1cGRhdGVUYWcodGFnTmFtZSA9ICdkaXYnKSB7IHRoaXMudXBkYXRlcHJvcHModGFnTmFtZSkgfVxuICB1cGRhdGVBdHRyaWJ1dGVzKGF0dHJzID0ge30pIHsgdGhpcy51cGRhdGVwcm9wcyhhdHRycykgfVxuICB1cGRhdGVUZW1wbGF0ZSh0ZW1wbGF0ZSkgeyB0aGlzLnVwZGF0ZXByb3BzKHRlbXBsYXRlKSB9XG4gIHVwZGF0ZURhdGEoZGF0YSA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHMoZGF0YSkgfVxuICBhZGRUYWdBbmRSZW5kZXIodGFnTmFtZSA9ICdkaXYnKSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4odGFnTmFtZSkgfVxuICBhZGRBdHRyc2lidXRlc0FuZFJlbmRlcihhdHRycyA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4oYXR0cnMpIH1cbiAgYWRkVGVtcGxhdGVBbmRSZW5kZXIodGVtcGxhdGUpIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bih0ZW1wbGF0ZSkgfVxuICBhZGREYXRhQW5kUmVuZGVyKGRhdGEgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKGRhdGEpIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQkFTRSBDT1JFIE1JWElOU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgY29uc3QgY29yZU1peGlucyA9IGJhc2VDb3JlTWl4aW5zKClcbiAgICB0aGlzLmdjID0gY29yZU1peGlucy5nYy5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXREb21BdHRyaWJ1dGVzKHByb3BzKSB7XG4gICAgcmV0dXJuIHBpY2sodGhpcy5hdHRyaWJ1dGVzQXJyYXksIHByb3BzKVxuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZXNBcnJheSgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2FjY2VwdCcsXG4gICAgICAnYWNjZXB0LWNoYXJzZXQnLFxuICAgICAgJ2FjY2Vzc2tleScsXG4gICAgICAnYWN0aW9uJyxcbiAgICAgICdhbGlnbicsXG4gICAgICAnYWxsb3cnLFxuICAgICAgJ2FsdCcsXG4gICAgICAnYXN5bmMnLFxuICAgICAgJ2F1dG9jYXBpdGFsaXplJyxcbiAgICAgICdhdXRvY29tcGxldGUnLFxuICAgICAgJ2F1dG9mb2N1cycsXG4gICAgICAnYXV0b3BsYXknLFxuICAgICAgJ2JnY29sb3InLFxuICAgICAgJ2JvcmRlcicsXG4gICAgICAnYnVmZmVyZWQnLFxuICAgICAgJ2NoYWxsZW5nZScsXG4gICAgICAnY2hhcnNldCcsXG4gICAgICAnY2hlY2tlZCcsXG4gICAgICAnY2l0ZScsXG4gICAgICAnY2xhc3MnLFxuICAgICAgJ2NvZGUnLFxuICAgICAgJ2NvZGViYXNlJyxcbiAgICAgICdjb2xvcicsXG4gICAgICAnY29scycsXG4gICAgICAnY29sc3BhbicsXG4gICAgICAnY29udGVudCcsXG4gICAgICAnY29udGVudGVkaXRhYmxlJyxcbiAgICAgICdjb250ZXh0bWVudScsXG4gICAgICAnY29udHJvbHMnLFxuICAgICAgJ2Nvb3JkcycsXG4gICAgICAnY3Jvc3NvcmlnaW4nLFxuICAgICAgJ2NzcCcsXG4gICAgICAnZGF0YXNldCcsXG4gICAgICAnZGF0ZXRpbWUnLFxuICAgICAgJ2RlY29kaW5nJyxcbiAgICAgICdkZWZhdWx0JyxcbiAgICAgICdkZWZlcicsXG4gICAgICAnZGlyJyxcbiAgICAgICdkaXJuYW1lJyxcbiAgICAgICdkaXNhYmxlZCcsXG4gICAgICAnZG93bmxvYWQnLFxuICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAnZHJvcHpvbmUnLFxuICAgICAgJ2VuY3R5cGUnLFxuICAgICAgJ2ZvcicsXG4gICAgICAnZm9ybScsXG4gICAgICAnZm9ybWFjdGlvbicsXG4gICAgICAnaGVhZGVycycsXG4gICAgICAnaGVpZ2h0JyxcbiAgICAgICdoaWRkZW4nLFxuICAgICAgJ2hpZ2gnLFxuICAgICAgJ2hyZWYnLFxuICAgICAgJ2hyZWZsYW5nJyxcbiAgICAgICdodHRwLWVxdWl2JyxcbiAgICAgICdpY29uJyxcbiAgICAgICdpZCcsXG4gICAgICAnaW1wb3J0YW5jZScsXG4gICAgICAnaW50ZWdyaXR5JyxcbiAgICAgICdpc21hcCcsXG4gICAgICAnaXRlbXByb3AnLFxuICAgICAgJ2tleXR5cGUnLFxuICAgICAgJ2tpbmQnLFxuICAgICAgJ2xhYmVsJyxcbiAgICAgICdsYW5nJyxcbiAgICAgICdsYW5ndWFnZScsXG4gICAgICAnbGF6eWxvYWQnLFxuICAgICAgJ2xpc3QnLFxuICAgICAgJ2xvb3AnLFxuICAgICAgJ2xvdycsXG4gICAgICAnbWFuaWZlc3QnLFxuICAgICAgJ21heCcsXG4gICAgICAnbWF4bGVuZ3RoJyxcbiAgICAgICdtaW5sZW5ndGgnLFxuICAgICAgJ21lZGlhJyxcbiAgICAgICdtZXRob2QnLFxuICAgICAgJ21pbicsXG4gICAgICAnbXVsdGlwbGUnLFxuICAgICAgJ211dGVkJyxcbiAgICAgICduYW1lJyxcbiAgICAgICdub3ZhbGlkYXRlJyxcbiAgICAgICdvcGVuJyxcbiAgICAgICdvcHRpbXVtJyxcbiAgICAgICdwYXR0ZXJuJyxcbiAgICAgICdwaW5nJyxcbiAgICAgICdwbGFjZWhvbGRlcicsXG4gICAgICAncG9zdGVyJyxcbiAgICAgICdwcmVsb2FkJyxcbiAgICAgICdyYWRpb2dyb3VwJyxcbiAgICAgICdyZWFkb25seScsXG4gICAgICAncmVmZXJyZXJwb2xpY3knLFxuICAgICAgJ3JlbCcsXG4gICAgICAncmVxdWlyZWQnLFxuICAgICAgJ3JldmVyc2VkJyxcbiAgICAgICdyb3dzJyxcbiAgICAgICdyb3dzcGFuJyxcbiAgICAgICdzYW5kYm94JyxcbiAgICAgICdzY29wZScsXG4gICAgICAnc2NvcGVkJyxcbiAgICAgICdzZWxlY3RlZCcsXG4gICAgICAnc2hhcGUnLFxuICAgICAgJ3NpemUnLFxuICAgICAgJ3NpemVzJyxcbiAgICAgICdzbG90JyxcbiAgICAgICdzcGFuJyxcbiAgICAgICdzcGVsbGNoZWNrJyxcbiAgICAgICdzcmMnLFxuICAgICAgJ3NyY2RvYycsXG4gICAgICAnc3JjbGFuZycsXG4gICAgICAnc3Jjc2V0JyxcbiAgICAgICdzdGFydCcsXG4gICAgICAnc3RlcCcsXG4gICAgICAnc3R5bGUnLFxuICAgICAgJ3N1bW1hcnknLFxuICAgICAgJ3RhYmluZGV4JyxcbiAgICAgICd0YXJnZXQnLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgICd0cmFuc2xhdGUnLFxuICAgICAgJ3R5cGUnLFxuICAgICAgJ3VzZW1hcCcsXG4gICAgICAndmFsdWUnLFxuICAgICAgJ3dpZHRoJyxcbiAgICAgICd3cmFwJ1xuICAgIF1cbiAgfVxufVxuY29uc3QgRG9tRWwgPSBEb21FbGVtZW50XG5leHBvcnQgeyBEb21FbGVtZW50LCBEb21FbCB9XG4iLCJpbXBvcnQgeyBiYXNlU3RyZWFtc01peGlucyB9IGZyb20gJy4uL3V0aWxzL21peGlucy9iYXNlLXN0cmVhbXMtbWl4aW5zLmpzJ1xuaW1wb3J0IHsgY29udmVydERvbVN0cmluZ01hcFRvT2JqIH0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjbG9uZSwgb21pdCB9IGZyb20gJ3JhbWRhJ1xuY29uc3QgaXNEZXZNb2RlID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtQnJvYWRjYXN0ZXIge1xuICAvKipcbiAgICogVGhlIGNsYXNzIHRha2VzIGluIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGUgJ2Jyb2FkY2FzdEV2ZW50cycgbWV0aG9kIGFuZCBkaXJlY3RzIHRoZSBldmVudHMgdG8gZWl0aGVyIHRoZSBVSSBvciBST1VURSBjaGFubmVsc1xuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1Ccm9hZGNhc3RlclxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGJyb2FkY2FzdEZuXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzLCBicm9hZGNhc3RGbikge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgICB0aGlzLmJyb2FkY2FzdEZuID0gYnJvYWRjYXN0Rm5cbiAgICB0aGlzLmJyb2FkY2FzdGVyKHRoaXMuYnJvYWRjYXN0Rm4pXG4gIH1cblxuICBhZGREYmxDbGlja0V2dChxKSB7XG4gICAgY29uc3QgZGJsY2xpY2skID0gZnJvbUV2ZW50KHEsICdkYmxjbGljaycpXG4gICAgLy8gY29uc29sZS5sb2coJ0FERElORyBEQkwgQ0xJQ0sgJywgcSk7XG4gICAgY29uc3Qgc3RyZWFtJCA9IGRibGNsaWNrJC5waXBlKFxuICAgICAgbWFwKHAgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gY2xvbmUocClcbiAgICAgICAgLy8gQUREIERPVUJMRUNMSUNLIFRPIFVJIEVWRU5UU1xuICAgICAgICBkYXRhLnR5cGVPdmVyUmlkZSA9ICdkYmxjbGljaydcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgIH0pKVxuICAgIHJldHVybiBzdHJlYW0kXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJST0FEQ0FTVCBCVVRUT04gRVZFTlRTXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYnJvYWRjYXN0KGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPD0gMCAmJiBpc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG5lc3RlZCBhcnJheSBpbiAke3RoaXMucHJvcHMubmFtZX0uYnJvYWRjYXN0RXZlbnRzIGFwcGVhcnMgdG8gYmUgZW1wdHkgLS0+IHZzaWQ6JHt0aGlzLnByb3BzLnZzaWR9IWApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gcGF5bG9hZHMgdG8gc2VuZCwgYmFzZWQgb24gZWl0aGVyIHRoZSBhcnJheSBvciB0aGUgZWxlbWVudHMgZGF0YU1hcFxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkcyA9IHtcbiAgICAgIFVJOiB0aGlzLnNlbmRVSVBheWxvYWQsXG4gICAgICBST1VURTogdGhpcy5zZW5kUm91dGVQYXlsb2FkXG4gICAgfVxuICAgIC8vIHNwcmVhZCBvcGVyYXRvciB0byBzZWxlY3QgdmFyaWFibGVzIGZyb20gYXJyYXlzXG4gICAgY29uc3QgW3NlbGVjdG9yLCBldmVudCwgbG9jYWxdID0gYXJnc1xuICAgIC8vIGJ0biBxdWVyeVxuICAgIGxldCBjaGFubmVsIC8vIGhvaXN0IGNoYW5uZWwgYW5kIGxhdGVyIGNoZWNrIGlmIGNobmwgZXhpc3RzXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5wcm9wcy5lbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuXG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA8PSAwKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMucHJvcHMuZWxcbiAgICAgIGNvbnN0IGNoZWNrUGFyZW50RWxzID0gKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT09IGVsKSB7XG4gICAgICAgICAgcXVlcnkgPSBbZWxlbWVudF1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwbHVja0VsRnJvbVBhcmVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZWxQYXJlbnQgPSBlbC5wYXJlbnRFbGVtZW50ICE9PSBudWxsID8gZWwucGFyZW50RWxlbWVudCA6IGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGVsU2VsZWN0ZWQgPSBlbFBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgICAgICBlbFNlbGVjdGVkLmZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaFxuICAgICAgICBlbFNlbGVjdGVkLmZvckVhY2goY2hlY2tQYXJlbnRFbHMpXG4gICAgICB9XG5cbiAgICAgIHBsdWNrRWxGcm9tUGFyZW50KClcbiAgICB9XG5cbiAgICBjb25zdCBpc0xvY2FsRXZlbnQgPSBsb2NhbCAhPT0gdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkT2JzZXJ2YWJsZSA9IChxKSA9PiB7XG4gICAgICAvLyB0aGUgIGJ0biBvYnNlcnZhYmxlXG4gICAgICBjb25zdCBvYnNlcnZhYmxlID0gZXZlbnQgIT09ICdkYmxDbGljaydcbiAgICAgICAgPyBmcm9tRXZlbnQocSwgZXZlbnQsIHsgcHJldmVudERlZmF1bHQ6ICgpID0+IHRydWUgfSlcbiAgICAgICAgOiB0aGlzLmFkZERibENsaWNrRXZ0KHEpXG4gICAgICAvLyBzZWxlY3QgY2hhbm5lbCBhbmQgZGF0YSB2YWx1ZXMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IG9yIHRoZSBlbGVtZW50J3MgZG9tIE1hcFxuICAgICAgY2hhbm5lbCA9IHEuZGF0YXNldC5jaGFubmVsLy8gaWZOaWxUaGVuVXBkYXRlKGNobmwsIHEuZGF0YXNldC5jaGFubmVsKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB7fS8vIGNvbnZlcnREb21TdHJpbmdNYXBUb09iaihxLmRhdGFzZXQpO1xuICAgICAgZGF0YS5wYXlsb2FkID0gY29udmVydERvbVN0cmluZ01hcFRvT2JqKHEuZGF0YXNldClcbiAgICAgIGRhdGEucGF5bG9hZCA9IG9taXQoWydjaGFubmVsJ10sIGRhdGEucGF5bG9hZClcbiAgICAgIGlmIChkYXRhLmNoYW5uZWwgPT09ICdST1VURScpIHtcbiAgICAgICAgZGF0YS5wYXlsb2FkLmVuZFByZXZlbnREZWZhdWx0ID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBkYXRhLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgICAvLyBwYXlsb2FkIG5lZWRzIHZzaWQjIHRvIHBhc3MgdmVyaWZpY2F0aW9uXG5cbiAgICAgIGRhdGEuc3JjRWxlbWVudCA9IHt9Ly8gcGljayhbJ3ZzaWQnLCd2aWV3TmFtZSddLCBkYXRhKTtcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWRcbiAgICAgIGRhdGEuc3JjRWxlbWVudC52c2lkID0gdGhpcy5wcm9wcy52c2lkXG4gICAgICBkYXRhLnNyY0VsZW1lbnQuaXNMb2NhbEV2ZW50ID0gaXNMb2NhbEV2ZW50XG4gICAgICAvLyBkYXRhLnNyY0VsZW1lbnRbJ3ZpZXdOYW1lJ10gPSB0aGlzLnByb3BzLm5hbWU7XG4gICAgICBkYXRhLnNyY0VsZW1lbnQuc3JjRXZlbnQgPSBldmVudFxuICAgICAgZGF0YS5zcmNFbGVtZW50LmVsID0gcVxuICAgICAgLy8gc2VsZWN0IHRoZSBjb3JyZWN0IHBheWxvYWRcblxuICAgICAgZnVuY3Rpb24gZ2V0VmFsaWRDaGFubmVsKGNoKSB7XG4gICAgICAgIGlmIChjaCA9PT0gJ1JPVVRFJyB8fCBjaCA9PT0gJ0NIQU5ORUxfUk9VVEUnKSB7XG4gICAgICAgICAgcmV0dXJuICdST1VURSdcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggIT09ICdVSScgJiYgY2ggIT09ICdDSEFOTkVMX1VJJyAmJiBjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZUpTIHdhcm5pbmc6IFRoZSBjaGFubmVsLCAke2NofSwgaXMgbm90IGFsbG93ZWQgaGVyZSwgb25seSBcIlVJXCIgb3IgXCJST1VURVwiIGFyZSB2YWxpZCBjaGFubmVscywgZGVmYXVsdGluZyB0byBDSEFOTkVMX1VJYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ1VJJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGFubmVsUGF5bG9hZCA9IGNoYW5uZWxQYXlsb2Fkc1tnZXRWYWxpZENoYW5uZWwoY2hhbm5lbCldXG4gICAgICAvLyBydW4gcGF5bG9hZFxuICAgICAgY2hhbm5lbFBheWxvYWQob2JzZXJ2YWJsZSwgZGF0YSlcbiAgICB9XG4gICAgY29uc3QgcXVlcnlJc05pbCA9IHF1ZXJ5ID09PSB1bmRlZmluZWQgfHwgcXVlcnkubGVuZ3RoIDw9IDBcbiAgICBpZiAocXVlcnlJc05pbCA9PT0gdHJ1ZSAmJiBpc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGl0ZW0gJHtzZWxlY3Rvcn0sIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCBpbiAke3RoaXMucHJvcHMubmFtZX0gLS0+IHZzaWQ6JHt0aGlzLnByb3BzLnZzaWR9IWApXG5cbiAgICAgIC8vIGFkZE9ic2VydmFibGUocXVlcnksIGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkuZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoXG4gICAgICBxdWVyeS5mb3JFYWNoKGFkZE9ic2VydmFibGUpXG4gICAgfVxuICB9XG5cbiAgYnJvYWRjYXN0ZXIoYXJyRm4pIHtcbiAgICBjb25zdCBicm9hZGNhc3RBcnIgPSBhcnJGbigpXG4gICAgYnJvYWRjYXN0QXJyLmZvckVhY2goYXJncyA9PiB0aGlzLmJyb2FkY2FzdChhcmdzKSlcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIFNUUkVBTSBNSVhJTlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHN0cmVhbU1peGlucyA9IGJhc2VTdHJlYW1zTWl4aW5zKClcbiAgICB0aGlzLnNlbmRVSVBheWxvYWQgPSBzdHJlYW1NaXhpbnMuc2VuZFVJUGF5bG9hZFxuICAgIHRoaXMuc2VuZFJvdXRlUGF5bG9hZCA9IHN0cmVhbU1peGlucy5zZW5kUm91dGVQYXlsb2FkXG4gIH1cbn1cbiIsImltcG9ydCB7IERvbUVsZW1lbnQgfSBmcm9tICcuL2RvbS1lbGVtZW50LmpzJ1xuaW1wb3J0IHsgZmFkZWluLCBmYWRlb3V0IH0gZnJvbSAnLi4vdXRpbHMvdmlld3N0cmVhbS1hbmltYXRpb25zLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbU9ic2VydmFibGUgfSBmcm9tICcuLi91dGlscy92aWV3c3RyZWFtLW9ic2VydmFibGVzLmpzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZS5qcydcbmltcG9ydCB7IFN1YmplY3QsIGJpbmRDYWxsYmFjayB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBmaWx0ZXIsIGlzTmlsLCBwaWNrLCBwcm9wcywgZGVmYXVsdFRvIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtRWxlbWVudCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1FbGVtZW50XG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgY2xhc3MgdGhhdCBpcyBwYXJ0IG9mIHRoZSBWaWV3U3RyZWFtIG9ic2VydmFibGUgc3lzdGVtLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBzaW5rJFxuICAgKiBAcGFyYW0ge09iamVjdH0gdmlld1Byb3BzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2c2lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2c05hbWVcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNpbmskLCB2aWV3UHJvcHMgPSB7fSwgdnNpZCA9ICcnLCB2c05hbWUgPSAndGhlTmFtZScpIHtcbiAgICB0aGlzLmFkZE1peGlucygpXG4gICAgdGhpcy5fc3RhdGUgPSAnSU5JVCdcbiAgICB0aGlzLnZzaWQgPSB2c2lkXG4gICAgdGhpcy5lbCA9IHZpZXdQcm9wcy5lbFxuICAgIHRoaXMudnNOYW1lID0gdnNOYW1lXG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIGRlYnVnOmZhbHNlLFxuICAgICAgZXh0ZW5kZWRIYXNoTWV0aG9kczoge31cbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0gZGVlcE1lcmdlKHRoaXMuZGVmYXVsdHMsIHZpZXdQcm9wcylcbiAgICBjb25zdCBjcmVhdGVFeHRyYVN0YXRlc01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgIGNvbnN0IFthY3Rpb24sIGZ1bmNTdHJdID0gYXJyXG4gICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kZWRIYXNoTWV0aG9kc1thY3Rpb25dID0gKHApID0+IHRoaXNbZnVuY1N0cl0ocClcbiAgICB9XG4gICAgdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKS5mb3JFYWNoKGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kKVxuICAgIHRoaXMub3B0aW9ucy5oYXNoTWV0aG9kcyA9IHRoaXMuc2V0SGFzaE1ldGhvZHModGhpcy5vcHRpb25zLmV4dGVuZGVkSGFzaE1ldGhvZHMpXG4gICAgdGhpcy5zaW5rJCA9IHNpbmskXG4gICAgdGhpcy5zaW5rJFxuICAgICAgLnN1YnNjcmliZSh0aGlzLm9uT2JzU2lua1N1YnNjcmliZS5iaW5kKHRoaXMpKVxuXG4gICAgdGhpcy4kZGlycyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpXG4gICAgdGhpcy5hZGREZWZhdWx0RGlyID0gVmlld1N0cmVhbU9ic2VydmFibGUuYWRkRGVmYXVsdERpclxuICAgIHRoaXMuc291cmNlU3RyZWFtcyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsT2JzZXJ2YWJsZXMobmV3IFN1YmplY3QoKSwgdGhpcy52c05hbWUsIHRoaXMudnNpZClcbiAgICB0aGlzLl9zb3VyY2UkID0gdGhpcy5zb3VyY2VTdHJlYW1zLnRvSW50ZXJuYWwkIC8vICBuZXcgU3ViamVjdCgpO1xuICB9XG5cbiAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgc2V0SGFzaE1ldGhvZHMoZXh0ZW5kZWRIYXNoTWV0aG9kc09iaiA9IHt9KSB7XG4gICAgY29uc3QgZGVmYXVsdEhhc2hNZXRob2RzID0ge1xuICAgICAgVlNfREVUUklUVVNfQ09MTEVDVCAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uR2FyYmFnZUNvbGxlY3QocCksXG4gICAgICBSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uUmVhZHlGb3JHQyhwKSxcbiAgICAgIEVYVElSUEFURSAgICAgICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25EaXNwb3NlKHApLFxuICAgICAgVlNfU1BBV04gICAgICAgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vblJlbmRlcihwKSxcbiAgICAgIFZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fUEFSRU5UICAgIDogKHApID0+IHRoaXMub25SZW5kZXJBbmRBdHRhY2hUb1BhcmVudChwKSxcbiAgICAgIFZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fRE9NICAgICAgIDogKHApID0+IHRoaXMub25SZW5kZXJBbmRBdHRhY2hUb0RvbShwKSxcbiAgICAgIEFUVEFDSF9DSElMRF9UT19TRUxGICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uQXR0YWNoQ2hpbGRUb1NlbGYocClcbiAgICB9XG4gICAgcmV0dXJuIGRlZXBNZXJnZShkZWZhdWx0SGFzaE1ldGhvZHMsIGV4dGVuZGVkSGFzaE1ldGhvZHNPYmopXG4gIH1cblxuICBjcmVhdGVEb21JdGVtKCkge1xuICAgIHRoaXMucHJvcHMgPSB0aGlzLnByb3BzICE9PSB1bmRlZmluZWQgPyB0aGlzLnByb3BzIDoge31cbiAgICBjb25zdCByZW1vdmVJc05pbCA9ICh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkXG4gICAgY29uc3QgYXR0cnMgPSBmaWx0ZXIocmVtb3ZlSXNOaWwsIHBpY2soWydpZCcsICdjbGFzc05hbWUnXSwgdGhpcy5wcm9wcykpXG4gICAgY29uc3QgeyB0YWdOYW1lLCBkYXRhLCB0ZW1wbGF0ZSB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBuZXcgRG9tRWxlbWVudCh0YWdOYW1lLCBhdHRycywgZGF0YSwgdGVtcGxhdGUpXG4gIH1cblxuICBvbkRpc3Bvc2VDb21wbGV0ZWQoZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdidiBzZWxmIGRpc3Bvc2VkIGFmdGVyIGFuaW1hdGVPdXQgJywgZCwgdGhpcyk7XG4gIH1cblxuICBhbmltYXRlSW5Ud2VlbihlbCwgdGltZSkge1xuICAgIGZhZGVpbihlbCwgdGltZSlcbiAgfVxuXG4gIGFuaW1hdGVPdXRUd2VlbihlbCwgdGltZSwgY2FsbGJhY2spIHtcbiAgICAvLyBjb25zb2xlLmxvZygnYW5pbSBvdXQgJywge2VsLCB0aW1lLCBjYWxsYmFja30pO1xuICAgIGZhZGVvdXQoZWwsIHRpbWUsIGNhbGxiYWNrKVxuICB9XG5cbiAgc2V0QW5pbWF0ZUluKGQpIHtcbiAgICBpZiAoZC5hbmltYXRlSW4gPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGVsID0gZC5lbCAhPT0gdW5kZWZpbmVkID8gZC5lbCA6IHRoaXMuZG9tSXRlbS5lbFxuICAgICAgdGhpcy5hbmltYXRlSW5Ud2VlbihlbCwgZC5hbmltYXRlSW5UaW1lKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZFxuICAgKiBAcmV0dXJucyBwYXlsb2FkIHRoYXQgY29uZmlybXMgZGlzcG9zZVxuICAgKi9cblxuICBkaXNwb3NlTWV0aG9kKGQpIHtcbiAgICBjb25zdCBlbCA9IGQuZWwuZWwgIT09IHVuZGVmaW5lZCA/IGQuZWwuZWwgOiBkLmVsIC8vIERPTSBJVEVNUyBIQVZFIFRIRUlSIEVMIElURU1TIE5FU1RFRFxuXG4gICAgY29uc3QgZ2NEYXRhID0geyBhY3Rpb246J1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJywgJGRpcjp0aGlzLiRkaXJzLlBJLCBlbCB9XG5cbiAgICBjb25zdCBhbmltYXRlT3V0ID0gKGQsIGNhbGxiYWNrKSA9PiB7XG4gICAgICB0aGlzLmFuaW1hdGVPdXRUd2VlbihlbCwgZC5hbmltYXRlT3V0VGltZSwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgY29uc3QgZmFkZU91dE9icyA9IGJpbmRDYWxsYmFjayhhbmltYXRlT3V0KVxuICAgIGNvbnN0IG9uRmFkZW91dENvbXBsZXRlZCA9IChlKSA9PiB7XG4gICAgICB0aGlzLl9zb3VyY2UkLm5leHQoZ2NEYXRhKVxuICAgIH1cblxuICAgIGNvbnN0IG9uRmFkZW91dE9icyA9IChkKSA9PiB7XG4gICAgICBmYWRlT3V0T2JzKGQpXG4gICAgICAgIC5zdWJzY3JpYmUob25GYWRlb3V0Q29tcGxldGVkKVxuICAgICAgcmV0dXJuIHsgYWN0aW9uOidFWFRJUlBBVElORycsICRkaXI6dGhpcy4kZGlycy5DSSB9XG4gICAgfVxuICAgIGNvbnN0IG9uRW1wdHlPYnMgPSAoKSA9PiAoeyBhY3Rpb246J0VYVElSUEFURV9BTkRfUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnLCAkZGlyOnRoaXMuJGRpcnMuQ0kgfSlcbiAgICBjb25zdCBmbiA9IGQuYW5pbWF0ZU91dCA9PT0gdHJ1ZSA/IG9uRmFkZW91dE9icyA6IG9uRW1wdHlPYnNcbiAgICByZXR1cm4gZm4oZClcbiAgfVxuXG4gIG9uRGlzcG9zZShkKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcG9zZU1ldGhvZChkKVxuICB9XG5cbiAgcmVtb3ZlU3RyZWFtKCkge1xuICAgIC8vIHRoaXMuc291cmNlU3RyZWFtcy5jb21wbGV0ZUFsbCgpO1xuICAgIGlmICh0aGlzLnNvdXJjZVN0cmVhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zb3VyY2VTdHJlYW1zLmNvbXBsZXRlU3RyZWFtKFsnaW50ZXJuYWwnLCAnY2hpbGQnXSlcbiAgICB9XG4gIH1cblxuICBvblJlYWR5Rm9yR0MocCkge1xuICAgIHRoaXMucmVtb3ZlU3RyZWFtKClcbiAgfVxuXG4gIG9uR2FyYmFnZUNvbGxlY3QocCkge1xuICAgIGlmICh0aGlzLmRvbUl0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kb21JdGVtLnVubW91bnQoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNvdXJjZVN0cmVhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zb3VyY2VTdHJlYW1zLmNvbXBsZXRlU3RyZWFtKFsncGFyZW50J10pXG4gICAgfVxuXG4gICAgZGVsZXRlIHRoaXNcbiAgfVxuXG4gIGdldFNvdXJjZVN0cmVhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlJFxuICB9XG5cbiAgY29tYmluZURvbUl0ZW1zKGQpIHtcbiAgICBpZiAodGhpcy5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb250YWluZXIgPSAgaXNOaWwoZC5xdWVyeSkgPyBkLm5vZGUgOiBkLnF1ZXJ5XG4gICAgY29uc3QgcHJlcGVuZCA9IChub2RlLCBpdGVtKSA9PiBub2RlLmluc2VydEJlZm9yZShpdGVtLCBub2RlLmZpcnN0Q2hpbGQpXG4gICAgY29uc3QgYXBwZW5kID0gKG5vZGUsIGl0ZW0pID0+IG5vZGUuYXBwZW5kQ2hpbGQoaXRlbSlcbiAgICBjb25zdCBhZnRlciA9IChub2RlLCBpdGVtKSA9PiBub2RlLmFmdGVyKGl0ZW0pXG5cbiAgICBjb25zdCBkZWZhdWx0Rm4gPSBwcmVwZW5kXG4gICAgY29uc3QgYXR0YWNoVHlwZUhhc2ggPSB7XG4gICAgICBhcHBlbmRDaGlsZCA6IGFwcGVuZCxcbiAgICAgIGFmdGVyXG4gICAgfVxuICAgIC8vIERFVEVSTUlORSBXSEVUSEVSIFRPIFVTRSBBUFBFTkQgT1IgUFJFUEVORFxuICAgIC8vIE9OIENPTk5FQ1RJTkcgRE9NIElURU1TIFRPIEVBQ0ggT1RIRVJcbiAgICAvLyBsZXQgYXR0YWNoRnVuYyA9IGQuYXR0YWNoVHlwZSA9PT0gJ2FwcGVuZENoaWxkJyA/IGFwcGVuZCA6IHByZXBlbmQ7XG4gICAgY29uc3QgYXR0YWNoRnVuYyA9IGF0dGFjaFR5cGVIYXNoW2QuYXR0YWNoVHlwZV0gfHwgZGVmYXVsdEZuXG4gICAgYXR0YWNoRnVuYyhjb250YWluZXIsIHRoaXMuZG9tSXRlbS5yZW5kZXIoKSlcbiAgICB0aGlzLnNldEFuaW1hdGVJbihkKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwXG4gICAqIEByZXR1cm5zIHBheWxvYWQgdG8gYXBwZW5kIGNoaWxkIGVsZW1lbnQgdG8gY3VycmVudCBlbGVtZW50XG4gICAqL1xuXG4gIG9uQXR0YWNoQ2hpbGRUb1NlbGYocCkge1xuICAgIGNvbnN0IGRhdGEgPSBwLmNoaWxkUmVuZGVyRGF0YVxuICAgIHRoaXMuY29tYmluZURvbUl0ZW1zKGRhdGEpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ0NISUxEX0FUVEFDSEVEJyxcbiAgICAgICRkaXI6IHRoaXMuJGRpcnMuUElcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGRcbiAgICogQHJldHVybnMgcGF5bG9hZCB0aGF0IGF0dGFjaGVzIGN1cnJlbnQgY2hpbGQgZWxlbWVudCB0byBwYXJlbnRcbiAgICovXG4gIG9uUmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQoZCkge1xuICAgIHRoaXMub25SZW5kZXIoZClcbiAgICB0aGlzLmNvbWJpbmVEb21JdGVtcyhkKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQnLFxuICAgICAgZWw6IHRoaXMuZWwgfHwgdGhpcy5kb21JdGVtLmVsLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5QSVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlckRvbUl0ZW0oZCkge1xuICAgIGNvbnN0IFt0YWdOYW1lLCBhdHRyaWJ1dGVzLCBkYXRhLCB0ZW1wbGF0ZV0gPSBkXG4gICAgdGhpcy5kb21JdGVtID0gbmV3IERvbUVsZW1lbnQoeyB0YWdOYW1lLCBhdHRyaWJ1dGVzLCBkYXRhLCB0ZW1wbGF0ZSB9KVxuICAgIHJldHVybiB0aGlzLmRvbUl0ZW1cbiAgfVxuXG4gIG9uUmVuZGVyKGQpIHtcbiAgICBjb25zdCBnZXRFbCA9IChkYXRhKSA9PiB0aGlzLnJlbmRlckRvbUl0ZW0oZGF0YSlcbiAgICBjb25zdCBlbCA9IHRoaXMuZWwgfHwgZ2V0RWwocHJvcHMoWyd0YWdOYW1lJywgJ2RvbUF0dHJpYnV0ZXMnLCAnZGF0YScsICd0ZW1wbGF0ZSddLCBkKSlcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnVlNfU1BBV05FRCcsXG4gICAgICBlbCxcbiAgICAgICRkaXI6IHRoaXMuJGRpcnMuSVxuICAgIH1cbiAgfVxuXG4gIGV4dGVuZGVkTWV0aG9kcyhkYXRhKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGRcbiAgICogQHJldHVybnNcbiAgICogUGF5bG9hZCBjb250YWluaW5nIHRoZSBhY3Rpb24sIGludGVybmFsIG9ic2VydmFibGUgYW5kIGVsZW1lbnQuXG4gICAqL1xuICBvblJlbmRlckFuZEF0dGFjaFRvRG9tKGQpIHtcbiAgICBjb25zdCBnZXRFbCA9IChkYXRhKSA9PiB0aGlzLnJlbmRlckRvbUl0ZW0oZGF0YSlcbiAgICBkLmF0dGFjaERhdGEuZWwgPSBnZXRFbChwcm9wcyhbJ3RhZ05hbWUnLCAnZG9tQXR0cmlidXRlcycsICdkYXRhJywgJ3RlbXBsYXRlJ10sIGQpKVxuICAgIHRoaXMuY29tYmluZURvbUl0ZW1zKGQuYXR0YWNoRGF0YSlcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NJyxcbiAgICAgIGVsOiAgIHRoaXMuZWwgfHwgZC5hdHRhY2hEYXRhLmVsLmVsLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5DSVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGUgVmlld1N0cmVhbSBkaXJlY3RzIGFsbCByZWxldmFudCBhY3Rpb25zIHRvIHRoZSBEb21FbGVtZW50IHRvIHJlbmRlciBhbmQgZGlzcG9zZSBvZiBpdHNlbGZcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICovXG4gIG9uT2JzU2lua1N1YnNjcmliZShwYXlsb2FkKSB7XG4gICAgY29uc3QgYWN0aW9uID0gcGF5bG9hZC5hY3Rpb25cbiAgICBjb25zdCBkZWZhdWx0VG9GbiA9IGRlZmF1bHRUbygoZGF0YSkgPT4gdGhpcy5leHRlbmRlZE1ldGhvZHMoZGF0YSkpXG4gICAgY29uc3QgZm4gPSBkZWZhdWx0VG9Gbih0aGlzLm9wdGlvbnMuaGFzaE1ldGhvZHNbYWN0aW9uXSlcbiAgICBjb25zdCBkYXRhID0gZm4ocGF5bG9hZClcbiAgICBjb25zdCBzZW5kRGF0YSA9IChkKSA9PiB0aGlzLl9zb3VyY2UkLm5leHQoZClcbiAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZW5kRGF0YShPYmplY3QuZnJlZXplKGRhdGEpKVxuICAgIH1cbiAgfVxuXG4gIGFkZE1peGlucygpIHtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgQ09SRSBNSVhJTlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIGxldCBjb3JlTWl4aW5zID0gYmFzZUNvcmVNaXhpbnMoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBzYWZlQ2xvbmUgfSBmcm9tICcuLi91dGlscy9zYWZlLWNsb25lLmpzJ1xuaW1wb3J0IHsgZ2MgfSBmcm9tICcuLi91dGlscy9nYy5qcydcbmltcG9ydCB7XG4gIGNvbXBvc2UsXG4gIGNsb25lLFxuICBmcm9tUGFpcnMsXG4gIHRvUGFpcnMsXG4gIGlzXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbVBheWxvYWQge1xuICAvKipcbiAgICpcbiAgICogT2JzZXJ2YWJsZXMgc2VudCBmcm9tIFZpZXdTdHJlYW1zIHRvIENoYW5uZWxzIGFyZSB2YWxpZGF0ZWQgYnkgdGhpcyBjbGFzc1xuICAgKlxuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1QYXlsb2FkXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09ic2VydmFibGV9IG9ic2VydmFibGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRlYnVnXG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lLCBvYnNlcnZhYmxlLCBkYXRhLCBhY3Rpb24gPSAnc3Vic2NyaWJlJywgZGVidWcgPSBmYWxzZSkge1xuICAgIC8vIHRoaXMuYWRkTWl4aW5zKCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBvYnNlcnZhYmxlLFxuICAgICAgZGF0YSxcbiAgICAgIGFjdGlvblxuICAgIH1cbiAgICB0aGlzLnNlbmRUb0RpcmVjdG9yU3RyZWFtKG9wdGlvbnMpXG4gIH1cblxuICBzZW5kVG9EaXJlY3RvclN0cmVhbShwYXlsb2FkKSB7XG4gICAgY29uc3QgZGlyZWN0b3JTdHJlYW0kID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNoYW5uZWxzTWFwLmdldFN0cmVhbSgnRElTUEFUQ0hFUicpXG4gICAgY29uc3QgZnJvemVuUGF5bG9hZCA9IHNhZmVDbG9uZShwYXlsb2FkKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiVlMgUEFZTE9BRCBcIixmcm96ZW5QYXlsb2FkKTtcbiAgICBkaXJlY3RvclN0cmVhbSQubmV4dChmcm96ZW5QYXlsb2FkKVxuICAgIHBheWxvYWQgPSB1bmRlZmluZWRcblxuICAgIGRlbGV0ZSB0aGlzXG4gIH1cblxuICBzdGF0aWMgZGVlcENsb25lKG8pIHtcbiAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0KVxuICAgIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gICAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICAgIHJldHVybiBpc0l0ZXJhYmxlID8gY29tcG9zZShmcm9tUGFpcnMsIHRvUGFpcnMsIGNsb25lKShvKSA6IGNsb25lKG8pXG4gIH1cblxuICBzdGF0aWMgZ2V0TW91c2VFdmVudEtleXMoKSB7XG4gICAgcmV0dXJuIFsnYWx0S2V5JywgJ2J1YmJsZXMnLCAnY2FuY2VsQnViYmxlJywgJ2NhbmNlbGFibGUnLCAnY2xpZW50WCcsICdjbGllbnRZJywgJ2NvbXBvc2VkJywgJ2N0cmxLZXknLCAnY3VycmVudFRhcmdldCcsICdkZWZhdWx0UHJldmVudGVkJywgJ2RldGFpbCcsICdldmVudFBoYXNlJywgJ2Zyb21FbGVtZW50JywgJ2lzVHJ1c3RlZCcsICdsYXllclgnLCAnbGF5ZXJZJywgJ21ldGFLZXknLCAnbW92ZW1lbnRYJywgJ21vdmVtZW50WScsICdvZmZzZXRYJywgJ29mZnNldFknLCAncGFnZVgnLCAncGFnZVknLCAncGF0aCcsICdyZWxhdGVkVGFyZ2V0JywgJ3JldHVyblZhbHVlJywgJ3NjcmVlblgnLCAnc2NyZWVuWScsICdzaGlmdEtleScsICdzb3VyY2VDYXBhYmlsaXRpZXMnLCAnc3JjRWxlbWVudCcsICd0YXJnZXQnLCAndGltZVN0YW1wJywgJ3RvRWxlbWVudCcsICd0eXBlJywgJ3ZpZXcnLCAnd2hpY2gnLCAneCcsICd5J11cbiAgfVxuXG4gIGFkZE1peGlucygpIHtcbiAgICB0aGlzLmdjID0gZ2NcbiAgfVxufVxuIiwiaW1wb3J0IHsgaGVhZCwgY29tcG9zZSwgcmVqZWN0LCBzcGxpdCwgaXNFbXB0eSwgbHRlLCBkZWZhdWx0VG8sIHByb3AgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IHNweW5lV2FybiB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXdhcm4uanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxuZnVuY3Rpb24gZ2VuZXJhdGVTcHluZVNlbGVjdG9ySWQoZWwpIHtcbiAgY29uc3QgbnVtID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvXFxkL2dtLCAnJykuc3Vic3RyaW5nKDEsIDgpXG4gIGxldCB2c2lkID0gYCR7bnVtKCl9YFxuICBpZiAoZWwuZGF0YXNldC52c2lkID09PSB1bmRlZmluZWQpIHtcbiAgICBlbC5kYXRhc2V0LnZzaWQgPSB2c2lkXG4gIH0gZWxzZSB7XG4gICAgdnNpZCA9IGVsLmRhdGFzZXQudnNpZFxuICB9XG4gIHJldHVybiBgW2RhdGEtdnNpZD0nJHt2c2lkfSddYFxufVxuXG5mdW5jdGlvbiBpc0Rldk1vZGUoKSB7XG4gIHJldHVybiBTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWVcbn1cblxuZnVuY3Rpb24gaXNOb2RlRWxlbWVudChlbCkge1xuICBjb25zdCBub2RlQ2hlY2sgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcbiAgcmV0dXJuIG5vZGVDaGVjayhlbClcbn1cblxuZnVuY3Rpb24gZ2V0RWxPckxpc3QoY3h0LCBzZWwsIHZlcmJvc2VCb29sID0gZmFsc2UpIHtcbiAgY29uc3QgbGlzdCA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIHZlcmJvc2VCb29sKVxuICByZXR1cm4gbGlzdC5sZW5ndGggPT09IDEgPyBoZWFkKGxpc3QpIDogbGlzdFxufVxuXG5mdW5jdGlvbiB0ZXN0U2VsZWN0b3JzKGN4dCwgc2VsLCB2ZXJib3NlQm9vbCkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY3h0KVxuXG4gIGNvbnN0IGVsSXNEb21FbGVtZW50ID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG5cbiAgaWYgKGVsICE9PSBudWxsICYmIGVsSXNEb21FbGVtZW50KGVsKSA9PT0gZmFsc2UpIHtcbiAgICBzcHluZVdhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBlbCBvYmplY3QgaXMgbm90IGEgdmFsaWQgc2luZ2xlIGVsZW1lbnQsICR7ZWx9YClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChzZWwgIT09IHVuZGVmaW5lZCAmJiBTdHJpbmcoc2VsKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgIGZ1bmN0aW9uIGlzVmFsaWRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMCAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGlzIHZhbGlkIGFuZCBzZWxlY3RzIGF0IGxlYXN0IG9uZSBlbGVtZW50XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZSAvLyBDYXRjaGluZyBhbiBleGNlcHRpb24gbWVhbnMgdGhlIHNlbGVjdG9yIGlzIGludmFsaWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc1ZhbGlkU2VsZWN0b3JCb29sID0gaXNWYWxpZFNlbGVjdG9yKHNlbClcbiAgICBpZiAodmVyYm9zZUJvb2wgPT09IHRydWUgJiYgaXNEZXZNb2RlKCkgPT09IHRydWUgJiYgaXNWYWxpZFNlbGVjdG9yQm9vbCA9PT0gZmFsc2UpIHtcbiAgICAgIHNweW5lV2FybihgU3B5bmUgV2FybmluZzogdGhlIHNlbGVjdG9yLCAke3NlbH0gZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBlbCwgJHtjeHR9YClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgdmVyYm9zZUJvb2wgPSBmYWxzZSkge1xuICBjb25zdCBzZWxlY3RvciA9IHNlbCAhPT0gdW5kZWZpbmVkID8gYCR7Y3h0fSAke3NlbH1gIDogY3h0XG4gIGxldCBpc1BhcmVudCA9IGZhbHNlXG5cbiAgY29uc3QgcmV0dXJuU2VsZWN0b3JJZlZhbGlkID0gKHNlbGVjdG9yKSA9PiB7XG4gICAgbGV0IGFyciA9IFtdXG4gICAgdHJ5IHtcbiAgICAgIGFyciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBjYXRjaCAoZSkgeyBhcnIgPSBbXSB9XG4gICAgdHJ5IHtcbiAgICAgIGlzUGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWwpID09PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGN4dClcbiAgICAgIGlmIChpc1BhcmVudCA9PT0gdHJ1ZSkge1xuICAgICAgICBhcnIgPSBbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWwpXVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGFyci8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9XG5cbiAgY29uc3QgZWxBcnIgPSAgcmV0dXJuU2VsZWN0b3JJZlZhbGlkKHNlbGVjdG9yKVxuXG4gIGlmICh2ZXJib3NlQm9vbCA9PT0gdHJ1ZSkge1xuICAgIGNvbnN0IG1haW5TZWwgPSBpc1BhcmVudCA9PT0gdHJ1ZSA/ICdib2R5JyA6IGN4dFxuICAgIHRlc3RTZWxlY3RvcnMobWFpblNlbCwgc2VsLCB2ZXJib3NlQm9vbClcbiAgfVxuXG4gIHJldHVybiBlbEFyclxufVxuXG5mdW5jdGlvbiBzZXRJbmxpbmVDc3ModmFsLCBjeHQsIHNlbCkge1xuICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICBjb25zdCBhZGRJbmxpbmVDc3MgPSBpdGVtID0+IHtcbiAgICBpdGVtLnN0eWxlLmNzc1RleHQgPSB2YWxcbiAgfVxuICBhcnIuZm9yRWFjaChhZGRJbmxpbmVDc3MpXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKlxuICpcbiAqIEBtb2R1bGUgVmlld1N0cmVhbVNlbGVjdG9yXG4gKiBAdHlwZSB1dGlsXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8RWx9IGN4dCBUaGUgbWFpbiBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ3xFbH0gVGhlIHNlbGVjdG9yIGFzIGEgU3RyaW5nXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oKj0pfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gVmlld1N0cmVhbVNlbGVjdG9yKGN4dCwgc2VsKSB7XG4gIGN4dCA9IHR5cGVvZiAoY3h0KSA9PT0gJ3N0cmluZycgPyBjeHQgOiBnZW5lcmF0ZVNweW5lU2VsZWN0b3JJZChjeHQpXG4gIHRlc3RTZWxlY3RvcnMoY3h0LCBzZWwsIGZhbHNlKVxuXG4gIGZ1bmN0aW9uIHNlbGVjdG9yKHNlbCkge1xuICAgIHJldHVybiBWaWV3U3RyZWFtU2VsZWN0b3IoY3h0LCBzZWwpXG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG1hcCB0aHJvdWdoIGEgTm9kZUxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVsZW1lbnRzXG4gICAqL1xuICBzZWxlY3Rvci5tYXAgPSAoZm4pID0+IEFycmF5LmZyb20oZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkpLm1hcChmbilcblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGl0ZXJhdGUgdGhyb3VnaCBhIE5vZGVMaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVsZW1lbnRzXG4gICAqL1xuICBzZWxlY3Rvci5mb3JFYWNoID0gKGZuKSA9PiBBcnJheS5mcm9tKGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpKS5tYXAoZm4pXG5cbiAgLyoqXG4gICAqXG4gICAqIEFkZHMgdGhlIGNsYXNzIHRvIHRoZSBFbGVtZW50IG9yIHRvIHRoZSBOb2RlTGlzdC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICpcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGMgLSA9IHVuZGVmaW5lZDsgVGhlIGNsYXNzIHRvIGJlIGFkZGVkLlxuICAgKlxuICAgKiovXG4gIHNlbGVjdG9yLmFkZENsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IGFkZENsYXNzID0gaXRlbSA9PiBpdGVtLmNsYXNzTGlzdC5hZGQoYylcbiAgICBhcnIuZm9yRWFjaChhZGRDbGFzcylcbiAgICByZXR1cm4gc2VsZWN0b3JcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAZGVzYyBSZW1vdmVzIHRoZSBjbGFzcyB0byB0aGUgRWxlbWVudCBvciB0byB0aGUgTm9kZUxpc3QuXG4gICAqL1xuICBzZWxlY3Rvci5yZW1vdmVDbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCByZW1vdmVDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpXG4gICAgfVxuICAgIGFyci5mb3JFYWNoKHJlbW92ZUNsYXNzKVxuICAgIHJldHVybiBzZWxlY3RvclxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBkZXNjIFNldHMgdGhlIGNsYXNzIHRvIGVxdWFsIGV4YWN0bHkgdGhlIGNsYXNzIHN0cmluZy5cbiAgICovXG4gIHNlbGVjdG9yLnNldENsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIC8qKlxuICAgICogTk9OIElFIENMRUFORVIgU09MVVRJT05cbiAgICAqIGNvbnN0IHJlbW92ZUNsYXNzID0gaXRlbSA9PiBpdGVtLmNsYXNzTGlzdCA9IGM7XG4gICAgKiAgYXJyLmZvckVhY2gocmVtb3ZlQ2xhc3MpO1xuICAgICovXG5cbiAgICBjb25zdCBzZXRUaGVDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgY29uc3QgcmVtb3ZlQ2xhc3NTdHJBcnIgPSBjb21wb3NlKHJlamVjdChpc0VtcHR5KSwgc3BsaXQoJyAnKSkoaXRlbS5jbGFzc05hbWUpXG4gICAgICBjb25zdCBjbGFzc1N0ckFyciA9IGMuc3BsaXQoJyAnKVxuICAgICAgY29uc3QgcmVtb3ZlciA9IHMgPT4gaXRlbS5jbGFzc0xpc3QucmVtb3ZlKHMpXG4gICAgICBjb25zdCBhZGRlciA9IHNlbCA9PiBpdGVtLmNsYXNzTGlzdC5hZGQoc2VsKVxuICAgICAgcmVtb3ZlQ2xhc3NTdHJBcnIuZm9yRWFjaChyZW1vdmVyKVxuICAgICAgY2xhc3NTdHJBcnIuZm9yRWFjaChhZGRlcilcbiAgICB9XG4gICAgYXJyLmZvckVhY2goc2V0VGhlQ2xhc3MpXG4gICAgcmV0dXJuIHNlbGVjdG9yXG4gIH1cblxuICBzZWxlY3Rvci51bm1vdW50ID0gKCkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKCd1bm1vdW50aW5nIHNlbGVjdG9yICcsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYm9vbCBEZWZhdWx0IGlzIHVuZGVmaW5lZC5cbiAgICogQGRlc2MgU2V0cyB0aGUgY2xhc3MgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGJvb2xlYW4gb3IgdGhlIHRvZ2dsZXMgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnByb3BzLmVsJC50b2dnbGVDbGFzcygnbXljbGFzcycsIHRydWUpO1xuICAgKlxuICAgKi9cbiAgc2VsZWN0b3IudG9nZ2xlQ2xhc3MgPSAoYywgYm9vbCkgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgdG9nZ2xlQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgIGJvb2wgPSBib29sICE9PSB1bmRlZmluZWQgPyBib29sIDogIWl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKGMpXG4gICAgICBib29sID8gaXRlbS5jbGFzc0xpc3QuYWRkKGMpIDogaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpXG4gICAgfVxuICAgIGFyci5mb3JFYWNoKHRvZ2dsZUNsYXNzKVxuICAgIHJldHVybiBzZWxlY3RvclxuICB9XG5cbiAgc2VsZWN0b3IudG9nZ2xlID0gKGMsIGJvb2wpID0+IHtcbiAgICBzZWxlY3Rvci50b2dnbGVDbGFzcyhjLCBib29sKVxuICAgIHJldHVybiBzZWxlY3RvclxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIGh0bWwgdG8gdGhlIFNlbGVjdG9yJ3MgZWxlbWVudCAodGhlIGZpcnN0IG1hdGNoIHdoZW4gdGhlXG4gICAqIHNlbGVjdG9yIG1hdGNoZXMgbXVsdGlwbGUgZWxlbWVudHMpLlxuICAgKiBAcGFyYW0gaHRtbEVsZW1lbnRcbiAgICovXG4gIHNlbGVjdG9yLmFwcGVuZENoaWxkID0gKGh0bWxFbGVtZW50KSA9PiB7XG4gICAgY29uc3QgZWwgPSBzZWxlY3Rvci5lbFxuICAgIGlmIChlbCAhPT0gbnVsbCkge1xuICAgICAgZWwuYXBwZW5kQ2hpbGQoaHRtbEVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHNweW5lV2FybihgU3B5bmUgV2FybmluZzogVGhlIHNlbGVjdG9yLCAke3NlbH0gZG9lcyBub3QgYXBwZWFyIHRvIGJlIHZhbGlkIWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdG9yLmVsXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQWRkcyBjbGFzcyB3aXRoIGEgZGVsYXkgb2YgMW1zIHRvIGFsbG93IGNzcyB0byByZWdpc3RlciBhIHRyYW5zaXRpb24uXG4gICAqIEBwYXJhbSBjXG4gICAqL1xuICBzZWxlY3Rvci5hZGRBbmltQ2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGRlbGF5QWRkQ2xhc3MgPSAoKSA9PiB7XG4gICAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgICAgY29uc3QgYWRkQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhcnIuZm9yRWFjaChhZGRDbGFzcylcbiAgICB9XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRlbGF5QWRkQ2xhc3MpXG4gICAgcmV0dXJuIHNlbGVjdG9yXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR9IGVsU2VsIFRoZSBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnQuXG4gICAqIEBkZXNjIFNldHMgdGhlIGNsYXNzIGFjdGl2ZSBIVE1MRWxlbWVudCBmcm9tIGEgTm9kZUxpc3QuXG4gICAqL1xuICBzZWxlY3Rvci5zZXRBY3RpdmVJdGVtID0gKGMsIGVsU2VsKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCBjdXJyZW50RWwgPSB0eXBlb2YgZWxTZWwgPT09ICdzdHJpbmcnXG4gICAgICA/IGdldEVsT3JMaXN0KGN4dCwgZWxTZWwpXG4gICAgICA6IGVsU2VsXG5cbiAgICBhcnIuZm9yRWFjaChpdGVtID0+IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShjKSlcblxuICAgIGlmIChpc05vZGVFbGVtZW50KGN1cnJlbnRFbCkgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRWwgPSBBcnJheS5mcm9tKGFycikuZmluZChpdGVtID0+IGl0ZW0gPT09IGN1cnJlbnRFbClcblxuICAgICAgaWYgKG1hdGNoaW5nRWwpIHtcbiAgICAgICAgbWF0Y2hpbmdFbC5jbGFzc0xpc3QuYWRkKGMpXG4gICAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpID09PSB0cnVlKSB7XG4gICAgICAgIHNweW5lV2FybihcbiAgICAgICAgICBgU3B5bmUgV2FybmluZzogVGhlIHNlbGVjdG9yLCAke2VsU2VsfSwgaXMgdmFsaWQgYnV0IGRvZXMgbm90IG1hdGNoIGFueSBpdGVtIGluIHNldEFjdGl2ZUl0ZW06ICR7Y31gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpID09PSB0cnVlKSB7XG4gICAgICBzcHluZVdhcm4oXG4gICAgICAgIGBTcHluZSBXYXJuaW5nOiBUaGUgc2VsZWN0b3IsICR7ZWxTZWx9LCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB2YWxpZCBpdGVtIGluIHNldEFjdGl2ZUl0ZW06ICR7Y31gXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdG9yXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGVsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIGdldHRlciB0aGF0IGFsd2F5cyByZXNvbHZlcyB0byBhIHNpbmdsZSBlbGVtZW50OiB0aGUgbWF0Y2hlZCBlbGVtZW50LFxuICAgKiBvciB0aGUgZmlyc3QgaXRlbSB3aGVuIHRoZSBzZWxlY3RvciBtYXRjaGVzIG11bHRpcGxlIGVsZW1lbnRzIChhXG4gICAqIHdhcm5pbmcgaXMgbG9nZ2VkIGluIGRlYnVnIG1vZGUpLlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBBbiBIVE1MRWxlbWVudCwgb3IgbnVsbCB3aGVuIHRoZSBzZWxlY3RvciBtYXRjaGVzIG5vdGhpbmdcbiAgICogKG1pcnJvcmluZyBxdWVyeVNlbGVjdG9yKVxuICAgKi9cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGVsc1xuICAgKlxuICAgKiBAZGVzY1xuICAgKiBnZXR0ZXIgdGhhdCBhbHdheXMgcmVzb2x2ZXMgdG8gYW4gQXJyYXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudHMuXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEFuIEFycmF5IG9mIEhUTUxFbGVtZW50czsgZW1wdHkgd2hlbiB0aGUgc2VsZWN0b3IgbWF0Y2hlcyBub3RoaW5nXG4gICAqL1xuXG4gIC8qKlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbGVuZ3RoXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIERldGVybWluZXMgdGhlIGxlbmd0aCBvZiB0aGUgTm9kZUxpc3RcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyBtYXRjaGVkIGJ5IHRoZSBzZWxlY3RvclxuICAgKi9cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGV4aXN0c1xuICAgKlxuICAgKiBAZGVzY1xuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gdGhlIHNlbGVjdGVkIGVsZW1lbnQgZXhpc3RzXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEJvb2xlYW5cbiAgICovXG5cbiAgY29uc3QgZ2V0RWxzQXJyYXkgPSAodmVyYm9zZUJvb2wgPSB0cnVlKSA9PiBBcnJheS5mcm9tKGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIHZlcmJvc2VCb29sKSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdlbCcsIHtcbiAgICBnZXQ6ICgpID0+IHtcbiAgICAgIGNvbnN0IGxpc3QgPSBnZXRFbHNBcnJheSgpXG4gICAgICBpZiAobGlzdC5sZW5ndGggPiAxICYmIGlzRGV2TW9kZSgpID09PSB0cnVlKSB7XG4gICAgICAgIHNweW5lV2FybihgU3B5bmUgV2FybmluZzogZWwkKFwiJHtzZWwgIT09IHVuZGVmaW5lZCA/IHNlbCA6IGN4dH1cIikuZWwgbWF0Y2hlZCAke2xpc3QubGVuZ3RofSBlbGVtZW50czsgcmV0dXJuaW5nIHRoZSBmaXJzdC4gVXNlIC5lbHMgZm9yIHRoZSBmdWxsIGxpc3QuYClcbiAgICAgIH1cbiAgICAgIHJldHVybiBsaXN0Lmxlbmd0aCA+PSAxID8gbGlzdFswXSA6IG51bGxcbiAgICB9XG4gIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2VscycsIHsgZ2V0OiAoKSA9PiBnZXRFbHNBcnJheSgpIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2FycicsIHsgZ2V0OiAoKSA9PiBnZXRFbHNBcnJheSgpIH0pXG5cbiAgLy8gVW5kb2N1bWVudGVkLiBSZXRhaW5zIHRoZSBwcmUtMC4yNCBwb2x5bW9ycGhpYyBlbCBjb250cmFjdCDigJQgYSBzaW5nbGVcbiAgLy8gZWxlbWVudCwgYSBOb2RlTGlzdCwgb3IgYW4gZW1wdHkgTm9kZUxpc3QgZGVwZW5kaW5nIG9uIG1hdGNoIGNvdW50IOKAlFxuICAvLyB0byBhc3Npc3QgaW4gZGVidWdnaW5nIGFuZCBtaWdyYXRpbmcgb2xkZXIgU3B5bmVKUyBhcHBzLlxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdlbExlZ2FjeScsIHsgZ2V0OiAoKSA9PiBnZXRFbE9yTGlzdChjeHQsIHNlbCwgdHJ1ZSkgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnbGVuJywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIGZhbHNlKS5sZW5ndGggfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnbGVuZ3RoJywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIGZhbHNlKS5sZW5ndGggfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZXhpc3RzJywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIGZhbHNlKS5sZW5ndGggPj0gMSB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2lubGluZScsIHsgc2V0OiAodmFsKSA9PiBzZXRJbmxpbmVDc3ModmFsLCBjeHQsIHNlbCksIGdldDogKCkgPT4gc2VsZWN0b3IgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnaW5saW5lQ3NzJywgeyBzZXQ6ICh2YWwpID0+IHNldElubGluZUNzcyh2YWwsIGN4dCwgc2VsKSwgZ2V0OiAoKSA9PiBzZWxlY3RvciB9KVxuXG4gIHJldHVybiBzZWxlY3RvclxufVxuXG5leHBvcnQgeyBWaWV3U3RyZWFtU2VsZWN0b3IgfVxuIiwiaW1wb3J0IHsgYmFzZUNvcmVNaXhpbnMgfSBmcm9tICcuLi91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucy5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZS5qcydcbmltcG9ydCB7IHNhZmVDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3NhZmUtY2xvbmUuanMnXG5pbXBvcnQge1xuICBmaW5kU3RyT3JSZWdleE1hdGNoU3RyLFxuICBnZXRDb25zdHJ1Y3Rvck5hbWVcbn0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbUVsZW1lbnQgfSBmcm9tICcuL3ZpZXctc3RyZWFtLWVsZW1lbnQuanMnXG5pbXBvcnQgeyByZWdpc3RlcmVkU3RyZWFtTmFtZXMgfSBmcm9tICcuLi9jaGFubmVscy9jaGFubmVscy1jb25maWcuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtQnJvYWRjYXN0ZXIgfSBmcm9tICcuL3ZpZXctc3RyZWFtLWJyb2FkY2FzdGVyLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbVBheWxvYWQgfSBmcm9tICcuL3ZpZXctc3RyZWFtLXBheWxvYWQuanMnXG5pbXBvcnQgeyBDaGFubmVsUGF5bG9hZEZpbHRlciB9IGZyb20gJy4uL3V0aWxzL2NoYW5uZWwtcGF5bG9hZC1maWx0ZXIuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtT2JzZXJ2YWJsZSB9IGZyb20gJy4uL3V0aWxzL3ZpZXdzdHJlYW0tb2JzZXJ2YWJsZXMuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtU2VsZWN0b3IgfSBmcm9tICcuL3ZpZXctc3RyZWFtLXNlbGVjdG9yLmpzJ1xuaW1wb3J0IHsgU3ViamVjdCwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWVyZ2VNYXAsIG1hcCwgdGFrZVdoaWxlLCBmaWx0ZXIsIHRhcCwgc2tpcCwgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7XG4gIHBpY2ssXG4gIGNvbXBvc2UsXG4gIGlzTmlsLFxuICBhbGwsXG4gIGZvckVhY2gsXG4gIHRvTG93ZXIsXG4gIGVpdGhlcixcbiAgZmluZEluZGV4LFxuICBhcHBseSxcbiAgdGVzdCxcbiAgZmxhdHRlbixcbiAgcHJvcCxcbiAgYWx3YXlzLFxuICBsdGUsXG4gIGRlZmF1bHRUbyxcbiAgcHJvcFNhdGlzZmllcyxcbiAgYWxsUGFzcyxcbiAgY3VycnksXG4gIGlzLFxuICBzbGljZSxcbiAgcGF0aCxcbiAgb21pdCxcbiAgaWZFbHNlLFxuICBtZXJnZVJpZ2h0LFxuICB3aGVyZSxcbiAgZXF1YWxzXG4gICwgbWFwIGFzIHJNYXBcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbVxuICAgKlxuICAgKiBAZGVzY1xuICAgKlxuICAgKiA8cD5WaWV3U3RyZWFtIGlzIHRoZSBpbnRlcmFjdGl2ZS12aWV3IGNvbXBvbmVudCwgYW5kIGl0cyBjb3JlIGZ1bmN0aW9uYWxpdHkgaXMgY29tcHJpc2VkIG9mIHR3byBpbnRlcm5hbCBjb21wb25lbnRzOiA8L3A+XG4gICA8dWwgY2xhc3M9J2Jhc2ljJz5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30pIHtcbiAgICB0aGlzLnZzbnVtID0gTWF0aC5yYW5kb20oKVxuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLl9wb3N0UmVuZGVyQ2FsbGVkID0gZmFsc2VcbiAgICB0aGlzLmRlZmF1bHRzID0gKCkgPT4ge1xuICAgICAgY29uc3QgdnNpZCA9IHRoaXMuY3JlYXRlSWQoKVxuICAgICAgY29uc3QgaWQgPSBwcm9wcy5pZCA/IHByb3BzLmlkIDogdnNpZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdnNpZCxcbiAgICAgICAgaWQsXG4gICAgICAgIHRhZ05hbWU6ICdkaXYnLFxuICAgICAgICBlbDogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGFuaW1hdGVJbjogZmFsc2UsXG4gICAgICAgIGFuaW1hdGVJblRpbWU6IDAuNSxcbiAgICAgICAgYW5pbWF0ZU91dDogZmFsc2UsXG4gICAgICAgIGFuaW1hdGVPdXRUaW1lOiAwLjUsXG4gICAgICAgIHNlbmRMaWZlY3lsZUV2ZW50czogZmFsc2UsXG4gICAgICAgIGhhc2hJZDogYCMke2lkfWAsXG4gICAgICAgIGlkJDogYCMke2lkfWAsXG4gICAgICAgIHZpZXdDbGFzczogVmlld1N0cmVhbUVsZW1lbnQsXG4gICAgICAgIGV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzOiB7fSxcbiAgICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgICB0ZW1wbGF0ZTogdW5kZWZpbmVkLFxuICAgICAgICBub2RlOiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG4gICAgICAgIG5hbWU6IGdldENvbnN0cnVjdG9yTmFtZSh0aGlzKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zdGF0ZSA9IHt9XG4gICAgdGhpcy4kZGlycyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpXG4gICAgdGhpcy5hZGREZWZhdWx0RGlyZWN0aW9uID0gVmlld1N0cmVhbU9ic2VydmFibGUuYWRkRGVmYXVsdERpclxuICAgIHRoaXMuYWRkRG93bkludGVybmFsRGlyID0gVmlld1N0cmVhbU9ic2VydmFibGUuYWRkRG93bkludGVybmFsRGlyXG4gICAgLy8gdGhpcy5wcm9wcyA9IE9iamVjdC5hc3NpZ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUbih7fSwgdGhpcy5kZWZhdWx0cygpLCBwcm9wcyk7XG4gICAgdGhpcy5wcm9wcyA9IGRlZXBNZXJnZSh0aGlzLmRlZmF1bHRzKCksIHByb3BzKVxuICAgIHRoaXMuc2VuZExpZmVjeWNsZU1ldGhvZCA9IHRoaXMucHJvcHMuc2VuZExpZmVjeWxlRXZlbnRzID09PSB0cnVlID8gdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kQWN0aXZlLmJpbmQodGhpcykgOiB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZS5iaW5kKHRoaXMpXG4gICAgY29uc3QgYXR0cmlidXRlc0FyciA9IHRoaXMuYXR0cmlidXRlc0FycmF5XG4gICAgLy8gbGV0IGF0dHJpYnV0ZXNBcnIgPSBbJ2lkJywgJ2NsYXNzJywgJ2RhdGFzZXQnXTtcbiAgICB0aGlzLnByb3BzLmRvbUF0dHJpYnV0ZXMgPSBwaWNrKGF0dHJpYnV0ZXNBcnIsIHRoaXMucHJvcHMpXG4gICAgaWYgKHRoaXMucHJvcHMudHJhaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWRkVHJhaXRzKHRoaXMucHJvcHMudHJhaXRzKVxuICAgIH1cbiAgICB0aGlzLmxvYWRBbGxNZXRob2RzKClcbiAgICB0aGlzLnByb3BzLmFjdGlvbiA9ICdMT0FERUQnXG4gICAgdGhpcy5zaW5rJCA9IG5ldyBTdWJqZWN0KClcbiAgICB0aGlzLnByb3BzLmVsSXNBbHJlYWR5UmVuZGVyZWRCb29sID0gdGhpcy5lbEFscmVhZHlFeGlzdHNGbih0aGlzLnByb3BzKVxuICAgIGNvbnN0IFZpZXdDbGFzcyA9IHRoaXMucHJvcHMudmlld0NsYXNzXG4gICAgdGhpcy52aWV3ID0gbmV3IFZpZXdDbGFzcyh0aGlzLnNpbmskLCB7IGVsOnRoaXMucHJvcHMuZWwgfSwgdGhpcy5wcm9wcy52c2lkLCB0aGlzLnByb3BzLmlkKS8vIG5ldyB0aGlzLnByb3BzLnZpZXdDbGFzcyh0aGlzLnNpbmskKTtcbiAgICB0aGlzLnNvdXJjZVN0cmVhbXMgPSB0aGlzLnZpZXcuc291cmNlU3RyZWFtc1xuICAgIHRoaXMuX3Jhd1NvdXJjZSQgPSB0aGlzLnZpZXcuZ2V0U291cmNlU3RyZWFtKClcbiAgICB0aGlzLl9yYXdTb3VyY2UkLnZpZXdOYW1lID0gdGhpcy5wcm9wcy5uYW1lXG4gICAgdGhpcy5zZW5kRXZlbnRzRG93blN0cmVhbSA9IHRoaXMuc2VuZEV2ZW50c0Rvd25TdHJlYW1GblxuICAgIHRoaXMuaW5pdFZpZXdTdHJlYW0oKVxuICAgIHRoaXMuaXNEZXZNb2RlID0gVmlld1N0cmVhbS5pc0Rldk1vZGUoKVxuICAgIHRoaXMucHJvcHMuYWRkZWRDaGFubmVscyA9IFtdXG4gICAgdGhpcy5jaGVja0lmRWxlbWVudEFscmVhZHlFeGlzdHMoKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSEFTSCBLRVkgQU5EIFNQSUdPVCBNRVRIT0RTPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGdldCBzb3VyY2UkKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2UkXG4gIH1cblxuICBnZXQgYXR0cmlidXRlc0FycmF5KCkge1xuICAgIHJldHVybiBbXG4gICAgICAvLyBHbG9iYWwgQXR0cmlidXRlc1xuICAgICAgJ2FjY2Vzc2tleScsICdjbGFzcycsICdjb250ZW50ZWRpdGFibGUnLCAnZGlyJywgJ2RyYWdnYWJsZScsICdoaWRkZW4nLCAnaWQnLCAnbGFuZycsICdzcGVsbGNoZWNrJywgJ3N0eWxlJywgJ3RhYmluZGV4JywgJ3RpdGxlJywgJ3RyYW5zbGF0ZScsXG5cbiAgICAgIC8vIEFjY2Vzc2libGl0eSBBdHRyaWJ1dGVzXG4gICAgICAnYXJpYS1hdXRvY29tcGxldGUnLCAnYXJpYS1jaGVja2VkJywgJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1leHBhbmRlZCcsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaGlkZGVuJywgJ2FyaWEtaW52YWxpZCcsICdhcmlhLWxhYmVsJywgJ2FyaWEtbGV2ZWwnLCAnYXJpYS1tdWx0aWxpbmUnLCAnYXJpYS1tdWx0aXNlbGVjdGFibGUnLCAnYXJpYS1vcmllbnRhdGlvbicsICdhcmlhLXByZXNzZWQnLCAnYXJpYS1yZWFkb25seScsICdhcmlhLXJlcXVpcmVkJywgJ2FyaWEtc2VsZWN0ZWQnLCAnYXJpYS1zb3J0JywgJ2FyaWEtdmFsdWVtYXgnLCAnYXJpYS12YWx1ZW1pbicsICdhcmlhLXZhbHVlbm93JywgJ2FyaWEtdmFsdWV0ZXh0JywgJ2FyaWEtYXRvbWljJywgJ2FyaWEtYnVzeScsICdhcmlhLWxpdmUnLCAnYXJpYS1yZWxldmFudCcsICdhcmlhLWRyb3BlZmZlY3QnLCAnYXJpYS1ncmFiYmVkJywgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcsICdhcmlhLWNvbnRyb2xzJywgJ2FyaWEtZGVzY3JpYmVkYnknLCAnYXJpYS1mbG93dG8nLCAnYXJpYS1sYWJlbGxlZGJ5JywgJ2FyaWEtb3ducycsICdhcmlhLXBvc2luc2V0JywgJ2FyaWEtc2V0c2l6ZScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGlucHV0XG4gICAgICAnYWNjZXB0JywgJ2F1dG9jb21wbGV0ZScsICdhdXRvZm9jdXMnLCAnY2hlY2tlZCcsICdkaXJuYW1lJywgJ2Rpc2FibGVkJywgJ2Zvcm0nLCAnZm9ybWFjdGlvbicsXG4gICAgICAnZm9ybWVuY3R5cGUnLCAnZm9ybW1ldGhvZCcsICdmb3Jtbm92YWxpZGF0ZScsICdmb3JtdGFyZ2V0JywgJ2xpc3QnLCAnbWF4JywgJ21heGxlbmd0aCcsXG4gICAgICAnbWluJywgJ21pbmxlbmd0aCcsICdtdWx0aXBsZScsICduYW1lJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAncmVhZG9ubHknLCAncmVxdWlyZWQnLCAnc2l6ZScsICdzdGVwJywgJ3ZhbHVlJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgaW1nXG4gICAgICAnYWx0JywgJ3NyY3NldCcsICdzaXplcycsICd1c2VtYXAnLCAnaXNtYXAnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBhIGFuZCBsaW5rXG4gICAgICAnaHJlZicsICd0YXJnZXQnLCAnZG93bmxvYWQnLCAncGluZycsICdyZWwnLCAnaHJlZmxhbmcnLCAnYXMnLCAnbWVkaWEnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBmb3JtXG4gICAgICAnYWNjZXB0LWNoYXJzZXQnLCAnYWN0aW9uJywgJ2VuY3R5cGUnLCAnbm92YWxpZGF0ZScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIG1ldGFcbiAgICAgICdjb250ZW50JywgJ2NoYXJzZXQnLCAnaHR0cC1lcXVpdicsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIHNjcmlwdFxuICAgICAgJ2FzeW5jJywgJ2RlZmVyJywgJ2ludGVncml0eScsICdub21vZHVsZScsICdub25jZScsICdyZWZlcnJlcnBvbGljeScsXG5cbiAgICAgIC8vIE90aGVyIEVsZW1lbnQtc3BlY2lmaWMgQXR0cmlidXRlc1xuICAgICAgJ2F1dG9jYXBpdGFsaXplJywgJ2F1dG9wbGF5JywgJ2J1ZmZlcmVkJywgJ2NoYWxsZW5nZScsICdjaXRlJywgJ2NvZGUnLCAnY29kZWJhc2UnLCAnY29sb3InLCAnY29scycsICdjb2xzcGFuJywgJ2NvbnRleHRtZW51JywgJ2NvbnRyb2xzJywgJ2Nvb3JkcycsICdjcm9zc29yaWdpbicsICdjc3AnLCAnZGF0YXNldCcsICdkYXRldGltZScsICdkZWNvZGluZycsICdkZWZhdWx0JywgJ2ZvcicsICdoZWFkZXJzJywgJ2hpZ2gnLCAnaWNvbicsICdpbXBvcnRhbmNlJywgJ2l0ZW1wcm9wJywgJ2tleXR5cGUnLCAna2luZCcsICdsYWJlbCcsICdsYW5ndWFnZScsICdsYXp5bG9hZCcsICdsb29wJywgJ2xvdycsICdtYW5pZmVzdCcsICdtZXRob2QnLCAnbXV0ZWQnLCAnb3BlbicsICdvcHRpbXVtJywgJ3Bvc3RlcicsICdwcmVsb2FkJywgJ3JhZGlvZ3JvdXAnLCAncmV2ZXJzZWQnLCAncm9sZScsICdyb3dzJywgJ3Jvd3NwYW4nLCAnc2FuZGJveCcsICdzY29wZScsICdzY29wZWQnLCAnc2VsZWN0ZWQnLCAnc2hhcGUnLCAnc2xvdCcsICdzcGFuJywgJ3NyY2RvYycsICdzcmMnLCAndHlwZScsICdzcmNsYW5nJywgJ3N0YXJ0JywgJ3N1bW1hcnknLCAnd3JhcCcsICd3aWR0aCcsICdoZWlnaHQnXG4gICAgXVxuICB9XG5cbiAgc3RhdGljIGlzRGV2TW9kZSgpIHtcbiAgICByZXR1cm4gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZkFjdGlvbnNBcmVSZWdpc3RlcmVkKGNoYW5uZWxzQXJyID0gW10sIGFjdGlvbnNBcnIpIHtcbiAgICBpZiAoYWN0aW9uc0Fyci5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBnZXRBbGxBY3Rpb25zID0gKGEpID0+IHtcbiAgICAgICAgY29uc3QgZ2V0UmVnaXN0ZXJlZEFjdGlvbnNBcnIgPSAoc3RyKSA9PiBTcHluZUFwcFByb3BlcnRpZXMuZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKVxuICAgICAgICBjb25zdCBhcnIgPSAgYS5tYXAoZ2V0UmVnaXN0ZXJlZEFjdGlvbnNBcnIpXG4gICAgICAgIHJldHVybiBmbGF0dGVuKGFycilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoZWNrRm9yTWF0Y2ggPSAoc3RyTWF0Y2gpID0+IHtcbiAgICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKHN0ck1hdGNoKVxuICAgICAgICBjb25zdCBhY3Rpb25JbmRleCA9IGZpbmRJbmRleCh0ZXN0KHJlKSwgZ2V0QWxsQWN0aW9uc0FycilcbiAgICAgICAgaWYgKGFjdGlvbkluZGV4IDwgMCkge1xuICAgICAgICAgIGNvbnN0IGNoYW5uZWxTeW50YXggPSBjaGFubmVsc0Fyci5sZW5ndGggPT09IDEgPyAnZnJvbSBhZGRlZCBjaGFubmVsJyA6ICdmcm9tIGFkZGVkIGNoYW5uZWxzJ1xuICAgICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFjdGlvbiwgJHtzdHJNYXRjaH0sIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSByZWdpc3RlcmVkIGFjdGlvbnMgJHtjaGFubmVsU3ludGF4fSwgJHtjaGFubmVsc0Fyci5qb2luKCcsICcpfWApXG4gICAgICAgIH1cbiAgICAgICAgLy8gIGNvbnN0IHZzbnVtID0gKCk9PiBSLnRlc3QobmV3IFJlZ0V4cChzdHIpLCBcIkNIQU5ORUxfUk9VVEVfVEVTVF9FVkVOVFwiKVxuICAgICAgfVxuICAgICAgY29uc3QgZ2V0QWxsQWN0aW9uc0FyciA9IGdldEFsbEFjdGlvbnMoY2hhbm5lbHNBcnIpXG4gICAgICBhY3Rpb25zQXJyLmZvckVhY2goY2hlY2tGb3JNYXRjaClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQWRkIGFueSBxdWVyeSB3aXRoaW4gdGhlIFZpZXdTdHJlYW0ncyBkb20gYW5kIGFueSBkb20gZXZlbnRzIHRvIGF1dG9tYXRpY2FsbHkgYmUgb2JzZXJ2ZWQgYnkgdGhlIFVJIENoYW5uZWwuXG4gICAqIDxicj5cbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogIGJyb2FkY2FzdEV2ZW50cygpIHtcbiAgICogIC8vIEFERCBCVVRUT04gRVZFTlRTIEFTIE5FU1RFRCBBUlJBWVNcbiAgICogIHJldHVybiBbXG4gICAqICAgICAgIFsnI215LWJ1dHRvbicsICdtb3VzZW92ZXInXSxcbiAgICogICAgICAgWycjbXktaW5wdXQnLCAnY2hhbmdlJ11cbiAgICogICAgIF1cbiAgICogICB9XG4gICAqXG4gICAqXG4gICAqICovXG5cbiAgc3RhdGljIGlzVmFsaWROZXN0ZWRBcnIoZXZlbnRzQXJyKSB7XG4gICAgY29uc3QgaXNUcnVlID0gZXF1YWxzKHRydWUpXG4gICAgY29uc3QgYWxsSXNUcnVlID0gYWxsKGlzVHJ1ZSlcbiAgICBjb25zdCBpc1N0cmluZyA9IGlzKFN0cmluZylcbiAgICBjb25zdCBpc1ZhbGlkQXJyID0gY29tcG9zZShhbGxJc1RydWUsIHJNYXAoaXNTdHJpbmcpLCBzbGljZSgwLCAyKSwgZGVmYXVsdFRvKFtdKSlcbiAgICBjb25zdCBtYXBFdmVudHNBcnJGbiA9IGNvbXBvc2UoYWxsSXNUcnVlLCByTWFwKGlzVmFsaWRBcnIpLCBkZWZhdWx0VG8oW10pKVxuICAgIHJldHVybiBtYXBFdmVudHNBcnJGbihldmVudHNBcnIpXG4gIH1cblxuICBzdGF0aWMgZWxJc0RvbUVsZW1lbnQobykge1xuICAgIGlmIChpcyhTdHJpbmcsIG8pKSB7XG4gICAgICBvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvKVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSkobylcbiAgfVxuXG4gIHVwZGF0ZVByb3BzVG9NYXRjaEVsKCkge1xuICAgIGNvbnN0IGdldFRhZ05hbWUgPSBjb21wb3NlKHRvTG93ZXIsIGVpdGhlcihwcm9wKCd0YWdOYW1lJyksIGFsd2F5cygnJykpKVxuICAgIHRoaXMucHJvcHMudGFnTmFtZSA9IGdldFRhZ05hbWUodGhpcy5wcm9wcy5lbClcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBlbEFscmVhZHlFeGlzdHNGbihwcm9wcykge1xuICAgIGNvbnN0IGVsSXNEb21FbGVtZW50ID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG4gICAgY29uc3QgZWxJc1JlbmRlcmVkID0gZWwgPT4gZG9jdW1lbnQuYm9keS5jb250YWlucyhlbClcbiAgICByZXR1cm4gcHJvcFNhdGlzZmllcyhhbGxQYXNzKFtlbElzUmVuZGVyZWQsIGVsSXNEb21FbGVtZW50XSksICdlbCcpKHByb3BzKVxuICB9XG5cbiAgY2hlY2tJZkVsZW1lbnRBbHJlYWR5RXhpc3RzKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmVsSXNBbHJlYWR5UmVuZGVyZWRCb29sID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVByb3BzVG9NYXRjaEVsKClcbiAgICAgIHRoaXMucG9zdFJlbmRlcigpXG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLmVsID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTcHluZSBFcnJvcjogVGhlIGRlZmluZWQgZWxlbWVudCBmb3IgdGhpcyBWaWV3U3RyZWFtIGluc3RhbmNlLCAke3RoaXMuY29uc3RydWN0b3IubmFtZX0sIGFwcGVhcnMgdG8gbm90IGV4aXN0LmApXG4gICAgfVxuICB9XG5cbiAgbG9hZEFsbE1ldGhvZHMoKSB7XG4gICAgY29uc3QgY2hhbm5lbEZuID0gY3VycnkodGhpcy5vbkNoYW5uZWxNZXRob2RDYWxsLmJpbmQodGhpcykpXG4gICAgY29uc3QgY3JlYXRlRXh0cmFTdGF0ZXNNZXRob2QgPSAoYXJyKSA9PiB7XG4gICAgICBsZXQgW2FjdGlvbiwgZnVuY1N0ciwgYWN0aW9uRmlsdGVyXSA9IGFyclxuICAgICAgaWYgKGlzKFN0cmluZywgYWN0aW9uRmlsdGVyKSkge1xuICAgICAgICBhY3Rpb25GaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIoeyBzZWxlY3RvcjphY3Rpb25GaWx0ZXIgfSlcbiAgICAgIH1cbiAgICAgIHRoaXMucHJvcHMuZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHNbYWN0aW9uXSA9IGNoYW5uZWxGbihmdW5jU3RyLFxuICAgICAgICBhY3Rpb25GaWx0ZXIpXG4gICAgfVxuICAgIHRoaXMuYWRkQWN0aW9uTGlzdGVuZXJzKCkuZm9yRWFjaChjcmVhdGVFeHRyYVN0YXRlc01ldGhvZClcbiAgICB0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzID0gdGhpcy5zZXRTb3VyY2VIYXNoTWV0aG9kcyhcbiAgICAgIHRoaXMucHJvcHMuZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHMpXG4gIH1cblxuICAvKipcbiAgICogQmluZHMgY2hhbm5lbCBhY3Rpb25zIHRvIGxvY2FsIG1ldGhvZHMsIGZvcm1hdHRlZCBhcyBhcnJheSB2YWx1ZXMuXG4gICAqIDx1bD5cbiAgICogPGxpPjxiPkZpcnN0IHZhbHVlOjwvYj4gQWN0aW9uIG5hbWUsIGFzIGEgc3RyaW5nIG9yIGFzIGEgYmFzaWMgUmVndWxhciBFeHByZXNzaW9uLlxuICAgKiA8bGk+PGI+U2Vjb25kIHZhbHVlOjwvYj4gVGhlIG1ldGhvZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYWN0aW9uIGlzIHB1Ymxpc2hlZC5cbiAgICogPGxpPjxiPlRoaXJkIG9wdGlvbmFsIHZhbHVlOjwvYj4gVGhpcyBpcyBhIGZpbHRlciBvcHRpb24gdGhhdCBjYW4gYmUgYSBzZWxlY3RvciBzdHJpbmcuIG9yIGFuIGluc3RhbmNlIG9mIHRoZSBMSU5LWydjaGFubmVsUGF5bG9hZEZpbHRlcicsICdjaGFubmVsLXBheWxvYWQtZmlsdGVyJ10uXG4gICAqIDwvdWw+XG4gICAqIEBleGFtcGxlXG4gICAqICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgcmV0dXJuIFtcbiAgICogICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCAnbGkubXljbGFzcyddLFxuICAgKiAgICAgWydDSEFOTkVMX01ZX0NVU1RPTV9FVkVOVCcsICdvbkFjdGlvblJldHVybmVkJ11cbiAgICogICAgICAgICAgICBdXG4gICAqICAgICAgICAgICB9XG4gICAqXG4gICAqIEByZXR1cm5zIE5lc3RlZCBBcnJheVxuICAgKi9cbiAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgb25DaGFubmVsTWV0aG9kQ2FsbChzdHIsIGFjdGlvbkZpbHRlciwgcCkge1xuICAgIGNvbnN0IHJ1bkZ1bmMgPSAocGF5bG9hZCkgPT4ge1xuICAgICAgaWYgKHRoaXNbc3RyXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG1ldGhvZCwgJHtzdHJ9IGRvZXMgbm90IGFwcGVhciB0byBleGlzdCBpbiAke3RoaXMuY29uc3RydWN0b3IubmFtZX0hYClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbc3RyXShwYXlsb2FkKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwLiRkaXIgIT09IHVuZGVmaW5lZCAmJiBwLiRkaXIuaW5jbHVkZXMoJ2NoaWxkJykgJiZcbiAgICAgICAgdGhpcy5kZWxldGVkICE9PSB0cnVlKSB7XG4gICAgICBjb25zdCBvYmogPSBkZWVwTWVyZ2Uoe30sIHApLy8gT2JqZWN0LmFzc2lnbih7fSwgcCk7XG4gICAgICBvYmouJGRpciA9IHRoaXMuJGRpcnMuQ1xuICAgICAgdGhpcy5zb3VyY2VTdHJlYW1zLnJhdyQubmV4dChvYmopXG4gICAgfVxuICAgIGNvbnN0IGZpbHRlclBheWxvYWQgPSBkZWZhdWx0VG8oYWx3YXlzKHRydWUpLCBhY3Rpb25GaWx0ZXIpXG5cbiAgICBpZiAoZmlsdGVyUGF5bG9hZChwKSA9PT0gdHJ1ZSkge1xuICAgICAgcCA9IG9taXQoWyckZGlyJ10sIHApXG4gICAgICBydW5GdW5jKHApXG4gICAgfVxuICB9XG5cbiAgc2V0U291cmNlSGFzaE1ldGhvZHMoZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHMgPSB7fSkge1xuICAgIGNvbnN0IGhhc2hTb3VyY2VLZXlzID0ge1xuICAgICAgRVhUSVJQQVRJTkc6IChwKSA9PiB0aGlzLmNoZWNrUGFyZW50RGlzcG9zZShwKSxcbiAgICAgIEVYVElSUEFURTogKHApID0+IHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0ocCksXG4gICAgICAvLyAnQ0hJTERfRVhUSVJQQVRFJyAgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5kaXNwb3NlVmlld1N0cmVhbShwKSxcbiAgICAgIFZTX1NQQVdORUQ6IChwKSA9PiB0aGlzLm9uVlNSZW5kZXJlZChwKSxcbiAgICAgIFZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX0RPTTogKHApID0+IHRoaXMub25WU1JlbmRlcmVkKHApLFxuICAgICAgVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UOiAocCkgPT4gdGhpcy5vblZTUmVuZGVyZWQocCksXG4gICAgICAvLyAnQ0hJTERfVlNfU1BBV05FRCcgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5hdHRhY2hDaGlsZFRvVmlldyhwKSxcbiAgICAgIFJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUOiAocCkgPT4gdGhpcy5vblJlYWR5VG9HQyhwKSxcbiAgICAgIFZTX05VTExJVFk6ICgpID0+ICh7fSlcbiAgICB9XG4gICAgcmV0dXJuIGRlZXBNZXJnZS5hbGwoW3t9LCBoYXNoU291cmNlS2V5cywgZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHNdKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBNQUlOIFNUUkVBTSBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGluaXRWaWV3U3RyZWFtKCkge1xuICAgIHRoaXMuX3NvdXJjZSQgPSB0aGlzLl9yYXdTb3VyY2UkLnBpcGUobWFwKFxuICAgICAgKHBheWxvYWQpID0+IHRoaXMub25NYXBWaWV3U291cmNlKHBheWxvYWQpKSwgdGFrZVdoaWxlKHRoaXMubm90R0NTVEFURSkpXG5cbiAgICB0aGlzLmluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zKClcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbih0aGlzLl9zb3VyY2UkLCB0cnVlKVxuICB9XG5cbiAgbm90R0NTVEFURShwKSB7XG4gICAgcmV0dXJuICFwLmFjdGlvbi5pbmNsdWRlcygnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKVxuICB9XG5cbiAgZXFHQ1NUQVRFKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpXG4gIH1cblxuICBub3RDT01QTEVURUQocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ0NPTVBMRVRFRCcpXG4gIH1cblxuICBub3RHQ0NPTVBMRVRFKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdHQ19DT01QTEVURScpXG4gIH1cblxuICB0ZXN0VmFsKHApIHtcbiAgICBjb25zb2xlLmxvZygnVEVTVElORyBWQUxMIElTICcsIHApXG4gIH1cblxuICBhZGRQYXJlbnRTdHJlYW0ob2JzLCBhdHRhY2hEYXRhKSB7XG4gICAgY29uc3QgZmlsdGVyT3V0TnVsbERhdGEgPSAoZGF0YSkgPT4gZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEuYWN0aW9uICE9PVxuICAgICAgICB1bmRlZmluZWRcbiAgICBjb25zdCBjaGVja0lmRGlzcG9zZU9yRmFkZW91dCA9IChkKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gZGVlcE1lcmdlKHt9LCBkKVxuXG4gICAgICBpZiAoZGF0YS5hY3Rpb24gPT09ICdFWFRJUlBBVEVfQU5EX1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJykge1xuICAgICAgICB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKGRhdGEpXG4gICAgICAgIGRhdGEuYWN0aW9uID0gJ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJ1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICB0aGlzLnBhcmVudCQgPSBvYnMucGlwZShcbiAgICAgIGZpbHRlcihmaWx0ZXJPdXROdWxsRGF0YSksXG4gICAgICBtYXAoY2hlY2tJZkRpc3Bvc2VPckZhZGVvdXQpKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKHRoaXMucGFyZW50JCwgZmFsc2UsICdQQVJFTlQnKVxuICAgIHRoaXMucmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQoYXR0YWNoRGF0YSlcbiAgfVxuXG4gIGFkZENoaWxkU3RyZWFtKG9icyQpIHtcbiAgICBjb25zdCBmaWx0ZXJPdXROdWxsRGF0YSA9IChkYXRhKSA9PiBkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YS5hY3Rpb24gIT09XG4gICAgICAgIHVuZGVmaW5lZFxuICAgIGNvbnN0IGNoaWxkJCA9IG9icyQucGlwZShcbiAgICAgIGZpbHRlcihmaWx0ZXJPdXROdWxsRGF0YSksXG4gICAgICB0YXAocCA9PiB0aGlzLnRyYWNlcignYWRkQ2hpbGRTdHJhZW0gZG8gJywgcCkpLFxuICAgICAgbWFwKChwKSA9PiB7XG4gICAgICAgIHJldHVybiBwXG4gICAgICB9KSxcbiAgICAgIGZpbmFsaXplKHAgPT4gdGhpcy5vbkNoaWxkQ29tcGxldGVkKGNoaWxkJC5zb3VyY2UpKSlcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbihjaGlsZCQsIHRydWUsICdDSElMRCcpXG4gIH1cblxuICBvbkNoaWxkRGlzcG9zZWQocCkge1xuXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgb25DaGlsZENvbXBsZXRlZChwKSB7XG4gICAgY29uc3QgZmluZE5hbWUgPSAoeCkgPT4ge1xuICAgICAgY29uc3QgZmluYWxEZXN0ID0gKHkpID0+IHtcbiAgICAgICAgd2hpbGUgKHkuZGVzdGluYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHkgPSBmaW5hbERlc3QoeS5kZXN0aW5hdGlvbilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBpY2soWydpZCcsICd2c2lkJ10sIGZpbmFsRGVzdCh4KSlcbiAgICB9XG4gICAgY29uc3QgY2hpbGRDb21wbGV0ZWREYXRhID0gZmluZE5hbWUocClcbiAgICB0aGlzLnRyYWNlcignb25DaGlsZENvbXBsZXRlZCAnLCB0aGlzLnZzbnVtLCBwKVxuICAgIC8vIGNvbnNvbGUubG9nKCdvYmogaXMgJyxjaGlsZENvbXBsZXRlZE5hbWUsb2JqLHRoaXMucHJvcHMpO1xuICAgIHRoaXMub25DaGlsZERpc3Bvc2VkKGNoaWxkQ29tcGxldGVkRGF0YSwgcClcbiAgICByZXR1cm4gY2hpbGRDb21wbGV0ZWREYXRhXG4gIH1cblxuICBpbml0QXV0b01lcmdlU291cmNlU3RyZWFtcygpIHtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFNVQlNDUklQVElPTiBTT1VSQ0UgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHN1YnNjcmliZXIgPSB7XG4gICAgICBuZXh0OiB0aGlzLm9uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dC5iaW5kKHRoaXMpLFxuICAgICAgZXJyb3I6IHRoaXMub25TdWJzY3JpYmVUb1NvdXJjZXNFcnJvci5iaW5kKHRoaXMpLFxuICAgICAgY29tcGxldGU6IHRoaXMub25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZS5iaW5kKHRoaXMpXG4gICAgfVxuICAgIC8vIGxldCB0YWtlQmVmb3JlR0NPbGQgPSAodmFsKSA9PiB2YWwuYWN0aW9uICE9PSAnVlNfREVUUklUVVNfQ09MTEVDVEVEJztcbiAgICAvLyBsZXQgdGFrZUJlZm9yZUdDID0gKHApID0+ICFwLmFjdGlvbi5pbmNsdWRlcygnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKTtcbiAgICAvLyBsZXQgbWFwVG9TdGF0ZSA9ICh2YWwpID0+ICh7YWN0aW9uOnZhbH0pO1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyA9PT09PT09PT09IE1FVEhPRFMgVE8gQ0hFQ0sgRk9SIFdIRU4gVE8gQ09NUExFVEUgVEhFIFNUUkVBTSA9PT09PT09PT1cbiAgICBjb25zdCBjb21wbGV0ZUFsbCA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMuZWwkID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnViZXJTb3VyY2UkLmNvbXBsZXRlKClcbiAgICAgIHRoaXMuYXV0b1N1YnNjcmliZXIkLmNvbXBsZXRlKClcbiAgICAgIHRoaXMuc2luayQuY29tcGxldGUoKVxuICAgICAgdGhpcy5wcm9wcyA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5kZWxldGVkID0gdHJ1ZVxuICAgICAgdGhpcy50cmFjZXIoJ2NvbXBsZXRlQWxsJywgdGhpcy5kZWxldGVkLCB0aGlzLnByb3BzKVxuICAgIH1cbiAgICBjb25zdCBkZWNyZW1lbnRPbk9ic2VydmFibGVDbG9zZWQgPSAoKSA9PiB7XG4gICAgICBvYnNDb3VudCAtPSAxXG4gICAgICBpZiAob2JzQ291bnQgPT09IDApIHtcbiAgICAgICAgY29tcGxldGVBbGwoKVxuICAgICAgfVxuICAgIH1cbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IElOSVQgU1RSRUFNIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IG9ic0NvdW50ID0gMFxuICAgIHRoaXMudWJlclNvdXJjZSQgPSBuZXcgU3ViamVjdCgpXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gQ09NUE9TRUQgUlhKUyBPQlNFUlZBQkxFID09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBpbmNyZW1lbnRPYnNlcnZhYmxlc1RoYXRDbG9zZXMgPSAoKSA9PiB7IG9ic0NvdW50ICs9IDEgfVxuICAgIHRoaXMuYXV0b01lcmdlU3ViamVjdCQgPSB0aGlzLnViZXJTb3VyY2UkLnBpcGUobWVyZ2VNYXAoKG9ic0RhdGEpID0+IHtcbiAgICAgIGNvbnN0IGJyYW5jaE9ic2VydmFibGUkID0gb2JzRGF0YS5vYnNlcnZhYmxlLnBpcGUoZmlsdGVyKFxuICAgICAgICAocCkgPT4gcCAhPT0gdW5kZWZpbmVkICYmIHAuYWN0aW9uICE9PSB1bmRlZmluZWQpLCBtYXAocCA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdQQVlMT0FEIElTICcsIHAsIHRoaXMuY29uc3RydWN0b3IubmFtZSlcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGRlZXBNZXJnZSh7fSwgcClcbiAgICAgICAgcGF5bG9hZC5hY3Rpb24gPSBwLmFjdGlvbi8vIGFkZFJlbGF0aW9uVG9TdGF0ZShvYnNEYXRhLnJlbCwgcC5hY3Rpb24pO1xuICAgICAgICB0aGlzLnRyYWNlcignYXV0b01lcmdlU3ViamVjdCQnLCBwYXlsb2FkKVxuICAgICAgICByZXR1cm4gcGF5bG9hZFxuICAgICAgfSkpXG5cbiAgICAgIGlmIChvYnNEYXRhLmF1dG9DbG9zZXNCb29sID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYnJhbmNoT2JzZXJ2YWJsZSRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluY3JlbWVudE9ic2VydmFibGVzVGhhdENsb3NlcygpXG4gICAgICAgIHJldHVybiBicmFuY2hPYnNlcnZhYmxlJC5waXBlKGZpbmFsaXplKGRlY3JlbWVudE9uT2JzZXJ2YWJsZUNsb3NlZCkpXG4gICAgICB9XG4gICAgfSkpXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1VCU0NSSUJFUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICB0aGlzLmF1dG9TdWJzY3JpYmVyJCA9IHRoaXMuYXV0b01lcmdlU3ViamVjdCRcbiAgICAvLyAuZG8oKHApID0+IGNvbnNvbGUubG9nKCdTSU5LIERBVEEgJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCBwKSlcbiAgICAgIC5waXBlKGZpbHRlcigocCkgPT4gcCAhPT0gdW5kZWZpbmVkICYmIHAuYWN0aW9uICE9PSB1bmRlZmluZWQpKVxuICAgICAgLnN1YnNjcmliZShzdWJzY3JpYmVyKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBNRVJHRSBTVFJFQU1TIFRPIE1BSU4gU1VCU0NSSUJFUiA9PT09PT09PT09PT09PT09PVxuICB1cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24ob2JzJCwgYXV0b0Nsb3Nlc0Jvb2wgPSBmYWxzZSwgcmVsKSB7XG4gICAgLy8gY29uc3QgZGlyZWN0aW9uQXJyID0gc2VuZERvd25TdHJlYW0gPT09IHRydWUgPyB0aGlzLiRkaXJzLkRJIDogdGhpcy4kZGlycy5JO1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIG9ic2VydmFibGU6IG9icyQsXG4gICAgICBhdXRvQ2xvc2VzQm9vbCxcbiAgICAgIHJlbFxuICAgIH1cbiAgICB0aGlzLnRyYWNlcigndXBkYXRlU291cmNlU3Vic2NyaXB0aW9uICcsIHRoaXMudnNudW0sIG9iailcbiAgICB0aGlzLnViZXJTb3VyY2UkLm5leHQob2JqKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1VCU0NSSUJFUiBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBvblN1YnNjcmliZVRvU291cmNlc05leHQocGF5bG9hZCA9IHt9KSB7XG4gICAgY29uc3QgZGVmYXVsdFRvRm4gPSBkZWZhdWx0VG8oKHApID0+IHRoaXMuc2VuZEV4dGVuZGVkU3RyZWFtcyhwKSlcblxuICAgIC8vICoqKipVU0UgUkVHRVggQVMgUFJFRElDQVRFIENIRUNLIEZPUiBQQVlMT0FELkFDVElPTiBJTiBIQVNIIE1FVEhPRFMgT0JKXG4gICAgLy8gY29uc3QgaGFzaEFjdGlvbiA9IHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHNbcGF5bG9hZC5hY3Rpb25dO1xuICAgIGNvbnN0IGhhc2hBY3Rpb25TdHIgPSBmaW5kU3RyT3JSZWdleE1hdGNoU3RyKHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHMsXG4gICAgICBwYXlsb2FkLmFjdGlvbilcbiAgICBjb25zdCBoYXNoQWN0aW9uID0gdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kc1toYXNoQWN0aW9uU3RyXVxuICAgIC8vIGNvbnNvbGUubG9nKCdTIFBBWUxPQUQgJywgdGhpcy5wcm9wcy5uYW1lLCB0eXBlb2YgKGhhc2hBY3Rpb24pLCBwYXlsb2FkKTtcblxuICAgIGNvbnN0IGZuID0gZGVmYXVsdFRvRm4oaGFzaEFjdGlvbilcblxuICAgIC8vIGNvbnNvbGUubG9nKCdoYXNoIG1ldGhvZHMgJywgZm4sIHRoaXMucHJvcHMubmFtZSwgcGF5bG9hZC5hY3Rpb24sIGhhc2hBY3Rpb25TdHIsIHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHMpO1xuXG4gICAgZm4ocGF5bG9hZClcbiAgICAvLyBjb25zb2xlLmxvZyhmbiwgcGF5bG9hZCwgJyBUSEUgUEFZTE9BRCBGUk9NIFNVQlNDUklCRSBJUyAnLCAnIC0tLS0gJywgJyAtLS0+ICcsIHRoaXMucHJvcHMpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdFWFRJUlBBVEVSIFZTIE5FWFQnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIHBheWxvYWQpO1xuXG4gICAgdGhpcy50cmFjZXIoJ29uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dCcsIHsgcGF5bG9hZCB9KVxuICB9XG5cbiAgb25TdWJzY3JpYmVUb1NvdXJjZXNFcnJvcihwYXlsb2FkID0gJycpIHtcbiAgICBjb25zb2xlLmxvZygnQUxMIEVSUk9SICAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIHBheWxvYWQpXG4gIH1cblxuICAvKlxuICAgIGF0dGFjaENoaWxkVG9WaWV3KGRhdGEpIHtcbiAgICAgIC8vIGxldCBjaGlsZFJlbmRlckRhdGEgPSBkYXRhLmF0dGFjaERhdGE7XG4gICAgICAvLyBjb25zb2xlLmxvZygnQ0hJTEQgREFUQSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIGNoaWxkUmVuZGVyRGF0YSk7XG4gICAgICAvLyB0aGlzLm9wZW5TcGlnb3QoJ0FUVEFDSF9DSElMRF9UT19TRUxGJywge2NoaWxkUmVuZGVyRGF0YX0pO1xuICAgIH1cbiAgKi9cblxuICBvblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCc9PT09IEVYVElSUEFURVIgQUxMIENPTVBMRVRFRCA9PT09JywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB0aGlzLnRyYWNlcignb25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZScsICdWU19ERVRSSVRVU19DT0xMRUNUJylcblxuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfREVUUklUVVNfQ09MTEVDVCcpXG4gIH1cblxuICBzZW5kRXh0ZW5kZWRTdHJlYW1zKHBheWxvYWQpIHtcbiAgICB0aGlzLnRyYWNlcignc2VuZEV4dGVuZGVkU3RyZWFtcycsIHBheWxvYWQpXG4gICAgLy8gY29uc29sZS5sb2coJ2V4dGVuZGVkIG1ldGhvZHMgJywgcGF5bG9hZC5hY3Rpb24sIHBheWxvYWQpO1xuICAgIHRoaXMub3BlblNwaWdvdChwYXlsb2FkLmFjdGlvbiwgcGF5bG9hZClcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVlNfU1BBV04gTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJlbmRlckFuZEF0dGFjaFRvUGFyZW50KGF0dGFjaERhdGEpIHtcbiAgICAvLyBsZXQgY2hpbGRSZW5kZXJEYXRhID0gYXR0YWNoRGF0YTtcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ1ZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fUEFSRU5UJywgYXR0YWNoRGF0YSlcbiAgfVxuXG4gIHJlbmRlclZpZXcoKSB7XG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19TUEFXTicpXG4gIH1cblxuICByZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgdHlwZSwgYXR0YWNoVHlwZSkge1xuICAgIGNvbnN0IGF0dGFjaERhdGEgPSB7IG5vZGUsIHR5cGUsIGF0dGFjaFR5cGUgfVxuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfU1BBV05fQU5EX0FUVEFDSF9UT19ET00nLCB7IGF0dGFjaERhdGEgfSlcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRVhUSVJQQVRFIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNoZWNrUGFyZW50RGlzcG9zZShwKSB7XG4gICAgaWYgKHAuZnJvbSQgPT09ICdwYXJlbnQnKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKHApXG4gICAgfVxuICB9XG5cbiAgb25CZWZvcmVEaXNwb3NlKCkge1xuXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNJTkskIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqXG4gICAqIFdyYXBzIHdpbmRvdy5zZXRUaW1lb3V0IHdpdGggYSBjaGVjayB0byBzZWUgaWYgXCJ0aGlzXCIgVmlld1N0cmVhbSBlbGVtZW50IGFuZCBpdHMgcHJvcHMgcHJvcGVydHkgc3RpbGwgZXhpc3RzXG4gICAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGZuIC0gPSAnZnVuY3Rpb24nOyBUaGUgbG9jYWwgbWV0aG9kIHRoYXQgaXMgdG8gYmUgY2FsbGVkLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gbXMgLSA9IDA7ICBUaGUgdGltZSwgaW4gbWlsbGVzZWNvbmRzLCBmb3IgdGhlIHRpbWVvdXQuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYmluZCAtID0gZmFsc2U7ICBXaGVuIHRydWUsIHdpbGwgYmluZCB0aGUgbWV0aG9kIHRvICd0aGlzJy5cbiAgICpcbiAgICovXG5cbiAgc2V0VGltZW91dChmbiwgbXMgPSAwLCBiaW5kID0gZmFsc2UpIHtcbiAgICBjb25zdCB0aW1lb3V0TWV0aG9kID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmICh0aGlzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZEZuID0gYmluZCA9PT0gdHJ1ZSA/IGZuLmJpbmQodGhpcykgOiBmblxuICAgICAgICBhcHBseShtZXRob2RGbiwgYXJncylcbiAgICAgIH1cbiAgICB9XG4gICAgd2luZG93LnNldFRpbWVvdXQodGltZW91dE1ldGhvZCwgbXMpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQmVnaW5zIHRoZSByZW1vdmFsIHByb2Nlc3Mgb2YgdGhlIFZpZXdTdHJlYW0gaW5zdGFuY2UgYWxvbmcgd2l0aCBhbGwgb2YgaXRzIGNoYWluZWQgVmlld1N0cmVhbSBjaGlsZHJlbi5cbiAgICovXG4gIGRpc3Bvc2VWaWV3U3RyZWFtKHApIHtcbiAgICAvLyBjb25zb2xlLmxvZygnRVhUSVJQQVRFUiBWUyBvbkRpc3Bvc2UgJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB0aGlzLm9uQmVmb3JlRGlzcG9zZSgpXG4gICAgdGhpcy5vcGVuU3BpZ290KCdFWFRJUlBBVEUnKVxuICB9XG5cbiAgb25DaGlsZERpc3Bvc2UocCkge1xuICB9XG5cbiAgb25QYXJlbnREaXNwb3NpbmcocCkge1xuICAgIC8vIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKHRoaXMuX3NvdXJjZSQpO1xuICAgIHRoaXMub3BlblNwaWdvdCgnRVhUSVJQQVRFJylcbiAgfVxuXG4gIG9uUmVhZHlUb0dDKHApIHtcbiAgICBjb25zdCBpc0ludGVybmFsID0gcC5mcm9tJCAhPT0gdW5kZWZpbmVkICYmIHAuZnJvbSQgPT09ICdpbnRlcm5hbCdcbiAgICBpZiAoaXNJbnRlcm5hbCkge1xuICAgICAgLy8gdGhpcy5vcGVuU3BpZ290KCdWU19ERVRSSVRVU19DT0xMRUNUJyk7XG4gICAgfVxuICAgIHRoaXMudHJhY2VyKCdvblJlYWR5VG9HQycsIGlzSW50ZXJuYWwsIHApXG4gIH1cblxuICBvcGVuU3BpZ290KGFjdGlvbiwgb2JqID0ge30pIHtcbiAgICBpZiAodGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnByb3BzLmFjdGlvbiA9IGFjdGlvblxuICAgICAgY29uc3QgZGF0YSA9IG1lcmdlUmlnaHQodGhpcy5wcm9wcywgb2JqKVxuICAgICAgLy8gbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3BzLCBvYmopO1xuXG4gICAgICB0aGlzLnNpbmskLm5leHQoT2JqZWN0LmZyZWV6ZShkYXRhKSlcbiAgICB9XG4gIH1cblxuICBzZXRBdHRhY2hEYXRhKGF0dGFjaFR5cGUsIHF1ZXJ5KSB7XG4gICAgY29uc3QgY2hlY2tRdWVyeSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHEgPSB0aGlzLnByb3BzLmVsLnF1ZXJ5U2VsZWN0b3IocXVlcnkpXG4gICAgICBjb25zdCBpc0Rldk1vZGUgPSBWaWV3U3RyZWFtLmlzRGV2TW9kZSgpXG4gICAgICBpZiAoaXNEZXZNb2RlID09PSB0cnVlICYmIGlzKFN0cmluZywgcXVlcnkpICYmIGlzTmlsKHEpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFwcGVuZFZpZXcgcXVlcnkgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCAnJHtxdWVyeX0nLCBhcHBlYXJzIHRvIG5vdCBleGlzdCFgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHFcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbm9kZTogdGhpcy5wcm9wcy5lbCxcbiAgICAgIHR5cGU6ICdWaWV3U3RyZWFtT2JzZXJ2YWJsZScsXG4gICAgICBhdHRhY2hUeXBlLFxuICAgICAgcXVlcnk6IGNoZWNrUXVlcnkocXVlcnkpXG4gICAgfVxuICB9XG5cbiAgZ2V0UGFyZW50RWxzKGVsLCBudW0pIHtcbiAgICBjb25zdCBnZXRFbGVtID0gZWwgPT4gZWwucGFyZW50RWxlbWVudFxuICAgIGxldCBpdGVyID0gMFxuICAgIGxldCBwYXJlbnRFbCA9IGVsXG4gICAgd2hpbGUgKGl0ZXIgPCBudW0pIHtcbiAgICAgIHBhcmVudEVsID0gZ2V0RWxlbShwYXJlbnRFbClcbiAgICAgIGl0ZXIrK1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50RWxcbiAgfVxuXG4gIHNldEF0dGFjaFBhcmVudERhdGEoYXR0YWNoVHlwZSwgcXVlcnksIGxldmVsKSB7XG4gICAgcXVlcnkgPSBxdWVyeSAhPT0gJycgPyBxdWVyeSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldFBhcmVudEVscyh0aGlzLnByb3BzLmVsLCBsZXZlbClcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZSxcbiAgICAgIHR5cGU6ICdWaWV3U3RyZWFtT2JzZXJ2YWJsZScsXG4gICAgICBhdHRhY2hUeXBlLFxuICAgICAgcXVlcnk6IG5vZGUucXVlcnlTZWxlY3RvcihxdWVyeSlcbiAgICB9XG4gIH1cblxuICBvbk1hcFZpZXdTb3VyY2UocGF5bG9hZCA9IHt9KSB7XG4gICAgdGhpcy5wcm9wcyA9IG1lcmdlUmlnaHQodGhpcy5wcm9wcywgcGF5bG9hZClcbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBBVFRBQ0ggU1RSRUFNIEFORCBET00gREFUQSBBR0dSRUdBVE9SUz09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQoY2hpbGRWaWV3LCBhdHRhY2hEYXRhKSB7XG4gICAgdGhpcy5hZGRDaGlsZFN0cmVhbShjaGlsZFZpZXcuc291cmNlU3RyZWFtcy50b1BhcmVudCQpXG4gICAgY2hpbGRWaWV3LmFkZFBhcmVudFN0cmVhbSh0aGlzLnNvdXJjZVN0cmVhbXMudG9DaGlsZCQsIGF0dGFjaERhdGEpXG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIFZpZXdTdHJlYW0gb2JqZWN0IHRvIGFuIGV4aXN0aW5nIGRvbSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8aDI+SGVsbG8gV29ybGQ8L2gyPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqIGxldCB2aWV3U3RyZWFtID0gbmV3IFZpZXdTdHJlYW0oJ2gyJywgJ0hlbGxvIFdvcmxkJyk7XG4gICAqIHZpZXdTdHJlYW0uYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqL1xuICBhcHBlbmRUb0RvbShub2RlKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJhcHBlbmQgdG8gZG9tIFwiLHRoaXMucHJvcHMudnNpZCwgdGhpcy5wcm9wcy5lbCk7XG4gICAgaWYgKHRoaXMucHJvcHMuZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgVmlld1N0cmVhbSwgJHt0aGlzLnByb3BzLm5hbWV9LCBoYXMgYW4gZWxlbWVudCwgJHt0aGlzLnByb3BzLmVsfSwgdGhhdCBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIGFwcGVuZGVkVG9Eb20uIFRoaXMgbWF5IGNyZWF0ZSB1bnN1c3VhbCBzaWRlIGVmZmVjdHMhYClcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhcHBlbmRDaGlsZCcpXG4gIH1cblxuICBhcHBlbmRUb0RvbUFmdGVyKG5vZGUpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBWaWV3U3RyZWFtLCAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBhbiBlbGVtZW50LCAke3RoaXMucHJvcHMuZWx9LCB0aGF0IGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgYXBwZW5kZWRUb0RvbUFmdGVyLiBUaGlzIG1heSBjcmVhdGUgdW5zdXN1YWwgc2lkZSBlZmZlY3RzIWApXG4gICAgfVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAnYWZ0ZXInKVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBlbmRzIHRoZSBjdXJyZW50IFZpZXdTdHJlYW0gb2JqZWN0IHRvIGFuIGV4aXN0aW5nIGRvbSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHRoaXMucHJlcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKi9cblxuICBwcmVwZW5kVG9Eb20obm9kZSkge1xuICAgIGlmICh0aGlzLnByb3BzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIFZpZXdTdHJlYW0sICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGFuIGVsZW1lbnQsICR7dGhpcy5wcm9wcy5lbH0sIHRoYXQgaXMgYWxyZWFkeSByZW5kZXJlZCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBwcmVwZW5kZWRUb0RvbS4gVGhpcyBtYXkgY3JlYXRlIHVuc3VzdWFsIHNpZGUgZWZmZWN0cyFgKVxuICAgIH1cbiAgICB0aGlzLnJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCAnZG9tJywgJ3ByZXBlbmRDaGlsZCcpXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYXBwZW5kcyBhIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0LiA8YnI+QWZ0ZXIgdGhlIGF0dGFjaG1lbnQsIHJ4anMgb2JzZXJ2YWJsZXMgYXJlIGV4Y2hhbmdlZCBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0cy48YnI+PGJyPlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW19IHYgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IGEgcXVlcnlTZWxlY3RvciB3aXRoaW4gdGhpcyBWaWV3U3RyZWFtLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyAgcmV0dXJuc1xuICAgKiA8Ym9keT5cbiAgICogICAgPG1haW4+XG4gICAqICAgICAgICA8aDI+SGVsbG8gV29ybGQ8L2gyPlxuICAgKiAgICA8L21haW4+XG4gICAqIDwvYm9keT5cbiAgICpcbiAgICpcbiAgICogbGV0IHBhcmVudFZpZXcgPSBuZXcgVmlld1N0cmVhbSgnbWFpbicpO1xuICAgKiBwYXJlbnRWaWV3LmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKiBsZXQgY2hpbGRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oe3RhZ05hbWU6J2gyJywgZGF0YTonSGVsbG8gV29ybGQnfTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRWaWV3KGNoaWxkVmlldylcbiAgICpcbiAgICogKi9cbiAgYXBwZW5kVmlldyh2LCBxdWVyeSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LCB0aGlzLnNldEF0dGFjaERhdGEoJ2FwcGVuZENoaWxkJywgcXVlcnkpKVxuICB9XG5cbiAgYXBwZW5kVmlld0FmdGVyKHYsIHF1ZXJ5KSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsIHRoaXMuc2V0QXR0YWNoRGF0YSgnYWZ0ZXInLCBxdWVyeSkpXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYXBwZW5kcyBhIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0IHRvIGEgcGFyZW50IFZpZXdTdHJlYW0gb2JqZWN0LlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW19IHYgdGhlIFZpZXdTdHJlYW0gcGFyZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqIEBwYXJhbSB7bGV2ZWx9IHRoaXMgcGFyYW1ldGVycyBjYW4gYXR0YWNoIHRoZSB2aWV3U3RyZWFtJ3MgZG9tIGVsZW1lbnQgdXAgdGhlIGRvbSB0cmVlIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIHRoZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIG9mIHRoZSBWaWV3U3RyZWFtIG9iamVjdHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8bWFpbj5cbiAgICogICAgICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqICAgIDwvbWFpbj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKlxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBjaGlsZFZpZXcuYXBwZW5kVG9QYXJlbnQocGFyZW50VmlldylcbiAgICpcbiAgICogKi9cblxuICBhcHBlbmRWaWV3VG9QYXJlbnRFbCh2LCBxdWVyeSwgbGV2ZWwgPSAxKSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsXG4gICAgICB0aGlzLnNldEF0dGFjaFBhcmVudERhdGEoJ2FwcGVuZENoaWxkJywgcXVlcnksIGxldmVsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBwcmVwZW5kcyBhIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0IHRvIGEgcGFyZW50IFZpZXdTdHJlYW0gb2JqZWN0LlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW19IHZcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsZXZlbFxuICAgKlxuICAgKiBAcHJvcGVydHkge1ZpZXdTdHJlYW19IHYgLSA9IHVuZGVmaW5lZDsgdGhlIFZpZXdTdHJlYW0gcGFyZW50LlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnkgLSA9IHVuZGVmaW5lZDsgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZXZlbCAtID0gMTsgdGhpcyBwYXJhbWV0ZXIgY2FuIGF0dGFjaCB0aGUgdmlld1N0cmVhbSdzIGRvbSBlbGVtZW50IHVwIHRoZSBkb20gdHJlZSB3aGlsZSBzdGlsbCBtYWludGFpbmluZyB0aGUgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcCBvZiB0aGUgVmlld1N0cmVhbSBvYmplY3RzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcucHJlcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKiBsZXQgY2hpbGRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oe3RhZ05hbWU6J2gyJywgZGF0YTonSGVsbG8gV29ybGQnfTtcbiAgICogY2hpbGRWaWV3LnByZXBlbmRWaWV3VG9QYXJlbnRFbChwYXJlbnRWaWV3KVxuICAgKlxuICAgKiAqL1xuICBwcmVwZW5kVmlld1RvUGFyZW50RWwodiwgcXVlcnksIGxldmVsID0gMSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LFxuICAgICAgdGhpcy5zZXRBdHRhY2hQYXJlbnREYXRhKCdwcmVwZW5kQ2hpbGQnLCBxdWVyeSwgbGV2ZWwpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByZXBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gdGhlIGN1cnJlbnQgVmlld1N0cmVhbSBvYmplY3QuIDxicj5BZnRlciB0aGUgYXR0YWNobWVudCwgcnhqcyBvYnNlcnZhYmxlcyBhcmUgZXhjaGFuZ2VkIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgVmlld1N0cmVhbSBvYmplY3RzLjxicj48YnI+XG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBjaGlsZCB0aGF0IGlzIHRvIGJlIGF0dGFjaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8bWFpbj5cbiAgICogICAgICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqICAgIDwvbWFpbj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBwYXJlbnRWaWV3LnByZXBlbmRWaWV3KGNoaWxkVmlldyk7XG4gICAqXG4gICAqICovXG5cbiAgcHJlcGVuZFZpZXcodiwgcXVlcnkpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodiwgdGhpcy5zZXRBdHRhY2hEYXRhKCdwcmVwZW5kQ2hpbGQnLCBxdWVyeSkpXG4gIH1cblxuICAvKipcbiAgICogIEFwcGVuZHMgYSBWaWV3U3RyZWFtIG9iamVjdCB0aGF0IGFyZSBub3QgcmVuZGVyZWQgdG8gdGhlICNzcHluZS1udWxsLXZpZXdzIGRpdi5cbiAgICovXG4gIGFwcGVuZFRvTnVsbCgpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NweW5lLW51bGwtdmlld3MnKVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAnYXBwZW5kQ2hpbGQnKVxuICB9XG5cbiAgb25WU1JlbmRlcmVkKHBheWxvYWQpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnVlNfU1BBV046ICcsIHRoaXMucHJvcHMubmFtZSwgcGF5bG9hZCk7XG4gICAgaWYgKHBheWxvYWQuZnJvbSQgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgIC8vIHRoaXMucHJvcHNbJ2VsJ10gPSBwYXlsb2FkLmVsLmVsO1xuXG4gICAgICB0aGlzLnBvc3RSZW5kZXIoKVxuICAgICAgLy8gdGhpcy5icm9hZGNhc3RlciA9IG5ldyBTcHluZS5WaWV3U3RyZWFtQnJvYWRjYXN0ZXIodGhpcy5wcm9wcywgdGhpcy5icm9hZGNhc3RFdmVudHMpO1xuICAgIH1cbiAgfVxuXG4gIHBvc3RSZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuX3Bvc3RSZW5kZXJlZENhbGxlZCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5iZWZvcmVBZnRlclJlbmRlcigpXG4gICAgdGhpcy5hZnRlclJlbmRlcigpXG5cbiAgICB0aGlzLm9uUmVuZGVyZWQoKVxuICAgIGNvbnN0IHN0YXJ0QW5pbUZyYW1lQWZ0ZXJSZW5kZXJlZCA9ICgpID0+IHRoaXMub25BbmltRnJhbWVBZnRlclJlbmRlcmVkKClcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RhcnRBbmltRnJhbWVBZnRlclJlbmRlcmVkKVxuXG4gICAgaWYgKHRoaXMuaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBldmVudHNBcnIgPSB0aGlzLmJyb2FkY2FzdEV2ZW50cygpXG4gICAgICBjb25zdCBpc1ZhbGlkQXJyID0gVmlld1N0cmVhbS5pc1ZhbGlkTmVzdGVkQXJyKGV2ZW50c0FycilcbiAgICAgIGlmIChpc1ZhbGlkQXJyID09PSBmYWxzZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBhcnJheSByZXR1cm5lZCBmcm9tIGJyb2FkY2FzdEV2ZW50cyBpbiAke3RoaXMucHJvcHMubmFtZX0sICcke0pTT04uc3RyaW5naWZ5KGV2ZW50c0Fycil9JywgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHByb3Blcmx5IGZvcm1hdHRlZCFgKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVDaGFubmVscygpXG4gICAgdGhpcy52aWV3c1N0cmVhbUJyb2FkY2FzdGVyID0gbmV3IFZpZXdTdHJlYW1Ccm9hZGNhc3Rlcih0aGlzLnByb3BzLCB0aGlzLmJyb2FkY2FzdEV2ZW50cy5iaW5kKHRoaXMpKVxuICAgIHRoaXMuYWZ0ZXJCcm9hZGNhc3RFdmVudHMoKVxuXG4gICAgdGhpcy5fcG9zdFJlbmRlcmVkQ2FsbGVkID0gdHJ1ZVxuICB9XG5cbiAgYWRkVHJhaXRzKHRyYWl0cykge1xuICAgIGlmICh0cmFpdHMuY29uc3RydWN0b3IubmFtZSAhPT0gJ0FycmF5Jykge1xuICAgICAgdHJhaXRzID0gW3RyYWl0c11cbiAgICB9XG4gICAgY29uc3QgYWRkVHJhaXQgPSAoVHJhaXRDbGFzcykgPT4ge1xuICAgICAgbmV3IFRyYWl0Q2xhc3ModGhpcylcbiAgICB9XG5cbiAgICB0cmFpdHMuZm9yRWFjaChhZGRUcmFpdClcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNRVRIT0RTIFRPIEJFIEVYVEVOREVEID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGFmdGVyQnJvYWRjYXN0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLmlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgcHVsbEFjdGlvbnNGcm9tTGlzdCA9IChhcnIpID0+IGFyclswXVxuICAgICAgY29uc3QgbmVzdGVkQWN0aW9uc0FyciA9IHRoaXMuYWRkQWN0aW9uTGlzdGVuZXJzKClcblxuICAgICAgY29uc3QgYWN0aW9uc0FyciA9IG5lc3RlZEFjdGlvbnNBcnIubWFwKHB1bGxBY3Rpb25zRnJvbUxpc3QpXG5cbiAgICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBWaWV3U3RyZWFtLmlzVmFsaWROZXN0ZWRBcnIobmVzdGVkQWN0aW9uc0FycilcblxuICAgICAgaWYgKGlzVmFsaWRBcnIgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFycmF5IHJldHVybmVkIGZyb20gYWRkQWN0aW9uc0xpc3RlbmVycyBpbiAke3RoaXMucHJvcHMubmFtZX0sICcke0pTT04uc3RyaW5naWZ5KG5lc3RlZEFjdGlvbnNBcnIpfScsIGRvZXMgbm90IGFwcGVhciB0byBiZSBwcm9wZXJseSBmb3JtYXR0ZWQhYClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNoZWNrRm9yRXhpc3RpbmdNZXRob2QgPSAoYXJyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0aG9kID0gZGVmYXVsdFRvKCcnLCBhcnJbMV0pXG4gICAgICAgICAgY29uc3QgaXNNZXRob2QgPSBpcyhGdW5jdGlvbiwgdGhpc1ttZXRob2RdKVxuICAgICAgICAgIGlmIChpc01ldGhvZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG1ldGhvZCBpbiBhZGRBY3Rpb25MaXN0ZW5lcnMgbmVzdGVkIEFycmF5LCAnJHtKU09OLnN0cmluZ2lmeShhcnIpfScsIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IWApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbXBvc2UoZm9yRWFjaChjaGVja0ZvckV4aXN0aW5nTWV0aG9kKSwgZGVmYXVsdFRvKFtdKSkobmVzdGVkQWN0aW9uc0FycilcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVsYXlGb3JQcm94eUNoYW5uZWxSZXNldHMgPSAoKSA9PiB7XG4gICAgICAgIGlmIChwYXRoKFsncHJvcHMnLCAnYWRkZWRDaGFubmVscyddLCB0aGlzKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgVmlld1N0cmVhbS5jaGVja0lmQWN0aW9uc0FyZVJlZ2lzdGVyZWQuYmluZCh0aGlzKSh0aGlzLnByb3BzLmFkZGVkQ2hhbm5lbHMsIGFjdGlvbnNBcnIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0VGltZW91dChkZWxheUZvclByb3h5Q2hhbm5lbFJlc2V0cywgNTAwKVxuICAgIH1cbiAgfVxuXG4gIHNldERhdGFWU0lEKCkge1xuICAgIHRoaXMucHJvcHMuZWwuZGF0YXNldC52c2lkID0gdGhpcy5wcm9wcy52c2lkLy8gU3RyaW5nKHRoaXMucHJvcHMudnNpZCkucmVwbGFjZSgvXih2c2lkLSkoLiopJC8sICckMicpO1xuICB9XG5cbiAgYmVmb3JlQWZ0ZXJSZW5kZXIoKSB7XG4gICAgLyogICAgbGV0IGRtMiA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0ciA9ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERvbUl0ZW1TZWxlY3RvcnMoZWwsIHN0cik7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTsgKi9cblxuICAgIC8vIHRoaXMucHJvcHMuZWwkID0gZG0yKHRoaXMucHJvcHMuZWwpO1xuICAgIHRoaXMuc2V0RGF0YVZTSUQoKVxuICAgIHRoaXMucHJvcHMuZWwkID0gVmlld1N0cmVhbVNlbGVjdG9yKHRoaXMucHJvcHMuZWwpXG4gICAgLy8gY29uc29sZS5sb2coJ0VMIElTICcsIHRoaXMucHJvcHMuZWwkLmVsQXJyKTtcbiAgICAvLyB3aW5kb3cudGhlRWwkID0gdGhpcy5wcm9wcy5lbCQ7XG4gIH1cblxuICAvLyBUSElTIElTIEFOIEVWRU5UIEhPTERFUiBNRVRIT0QgQkVDQVVTRSBTRU5ESU5HIERPV05TVFJFQU0gUkVRVUlSRSBUSEUgUEFSRU5UIFRPIEhBVkUgQSBNRVRIT0RcbiAgZG93blN0cmVhbSgpIHtcblxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgKlxuICAgKi9cblxuICBvblJlbmRlcmVkKCkge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBhZGQgYW5pbWF0aW9uIGNsYXNzZXMgdG8gYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHJlbmRlcmluZy5cbiAgICpcbiAgICovXG5cbiAgb25BbmltRnJhbWVBZnRlclJlbmRlcmVkKCkge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIChEZXByZWNhdGVkLiBVc2Ugb25SZW5kZXJlZCkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgKlxuICAgKi9cblxuICBhZnRlclJlbmRlcigpIHtcbiAgfVxuXG4gIGJyb2FkY2FzdEV2ZW50cygpIHtcbiAgICAvLyBBREQgQlVUVE9OIEVWRU5UUyBBUyBORVNURUQgQVJSQVlTXG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQXV0b21hdGljYWxseSBjb25uZWN0IHRvIGFuIGluc3RhbmNlIG9mIHJlZ2lzdGVyZWQgY2hhbm5lbHMsIHN1Y2ggYXMgJ0RPTScsICdVSScsIGFuZCAnUk9VVEUnIGNoYW5uZWxzLlxuICAgKlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBsZXQgdWlDaGFubmVsID0gdGhpcy5nZXRDaGFubmVsKCdVSScpO1xuICAgKlxuICAgKiB1aUNoYW5uZWxcbiAgICogICAgLmZpbHRlcigocCkgPT4gcC5kYXRhLmlkPT09JyNteS1idXR0b24nKVxuICAgKiAgICAuc3Vic2NyaWJlKChwKSA9PiBjb25zb2xlLmxvZygnbXkgYnV0dG9uIHdhcyBjbGlja2VkICcsIHApKTtcbiAgICpcbiAgICogKi9cblxuICBnZXRDaGFubmVsKGNoYW5uZWwpIHtcbiAgICBjb25zdCBpc1ZhbGlkQ2hhbm5lbCA9IGMgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMoYylcbiAgICBjb25zdCBlcnJvciA9IGMgPT4gY29uc29sZS53YXJuKFxuICAgICAgICBgY2hhbm5lbCBuYW1lICR7Y30gaXMgbm90IHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1OYW1lc31gKVxuICAgIGNvbnN0IHN0YXJ0U3Vic2NyaWJlID0gKGMpID0+IHtcbiAgICAgIGNvbnN0IG9icyQgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXAuZ2V0U3RyZWFtKGMpLm9ic2VydmVyXG5cbiAgICAgIHJldHVybiBvYnMkLnBpcGUodGFrZVdoaWxlKHAgPT4gdGhpcy5kZWxldGVkICE9PSB0cnVlKSlcbiAgICB9Ly8gZ2V0R2xvYmFsUGFyYW0oJ3N0cmVhbXNDb250cm9sbGVyJykuZ2V0U3RyZWFtKGMpLm9ic2VydmVyO1xuXG4gICAgY29uc3QgZm4gPSBpZkVsc2UoaXNWYWxpZENoYW5uZWwsIHN0YXJ0U3Vic2NyaWJlLCBlcnJvcilcblxuICAgIHJldHVybiBmbihjaGFubmVsKVxuICB9XG5cbiAgLyoqXG4gICAqIENIRUNLUyBUTyBTRUUgSUYgQ0hBTk5FTFMgSEFWRSBCRUVOIEFEREVEIFRPIHByb3BzLmNoYW5uZWxzIG9iamVjdDtcbiAgICovXG4gIGluaXRpYWxpemVDaGFubmVscygpIHtcbiAgICBjb25zdCBhZGRDaGFubmVsID0gKGNoYW5uZWwpID0+IHtcbiAgICAgIGNvbnN0IFtjaGFubmVsTmFtZSwgc2tpcEZpcnN0ID0gZmFsc2VdID0gQXJyYXkuaXNBcnJheShjaGFubmVsKSA/IGNoYW5uZWwgOiBbY2hhbm5lbF1cbiAgICAgIHRoaXM/LmFkZENoYW5uZWwoY2hhbm5lbE5hbWUsIHNraXBGaXJzdClcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcz8ucHJvcHM/LmNoYW5uZWxzKSkge1xuICAgICAgdGhpcz8ucHJvcHM/LmNoYW5uZWxzPy5mb3JFYWNoKGFkZENoYW5uZWwpXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXM/LnByb3BzPy5jaGFubmVsKSkge1xuICAgICAgY29uc29sZS53YXJuKCdwcm9wcy5jaGFubmVsIGlzIG5vdCBhIFZpZXdTdHJlYW0gcHJvcGVydHkuIERvIHlvdSBtZWFuIHByb3BzLmNoYW5uZWxzPycpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFByZWZlcnJlZCBtZXRob2QgdG8gY29ubmVjdCB0byBpbnN0YW5jZXMgb2YgcmVnaXN0ZXJlZCBjaGFubmVscywgc3VjaCBhcyAnRE9NJywgJ1VJJywgYW5kICdST1VURScgY2hhbm5lbHMuXG4gICAqXG4gICAqIEFkZCBDaGFubmVsIHdpbGwgYXV0b21hdGljYWxseSB1bnN1YnNjcmliZSB0byB0aGUgY2hhbm5lbCwgd2hlcmVhcyB0aGUgZ2V0Q2hhbm5lbCBtZXRob2QgcmVxdWlyZXMgdGhlIGRldmVsb3BlciB0byBtYW51YWxseSB1bnN1YnNjcmliZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXJlZCBDaGFubmVsIHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBDaGFubmVscyBDb250cm9sbGVyLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJvb2wgZmFsc2UsIGFkZCB0cnVlIGlmIHRoZSBWaWV3IHNob3VsZCB3YWl0IGZvciB0aGlzIGNoYW5uZWwgdG8gdW5zdWJzY3JpYmUgYmVmb3JlIHJlbW92aW5nIGl0c2VsZi5cbiAgICogQHBhcmFtIHtzZW5kRG93blN0cmVhbX0gYm9vbCBUaGUgZGlyZWN0aW9uIHdoZXJlIHRoZSBzdHJlYW0gaXMgYWxsb3dlZCB0byB0cmF2ZWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGxldCByb3V0ZUNoYW5uZWwgPSB0aGlzLmFkZENoYW5uZWwoJ1JPVVRFJyk7XG4gICAqXG4gICAqICAgICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgICAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICAgICAgWydDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCcsICdvbk1hcFJvdXRlRXZlbnQnXVxuICAgKiAgICAgICAgICAgXVxuICAgKiAgICAgICB9XG4gICAqXG4gICAqICAgICAgIG9uTWFwUm91dGVFdmVudChwKSB7XG4gICAqICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGUgcm91dGUgdmFsdWUgaXMgJywgcCk7XG4gICAqICAgICAgIH1cbiAgICpcbiAgICpcbiAgICogKi9cblxuICBhZGRDaGFubmVsKGNoYW5uZWxOYW1lLCBza2lwRmlyc3QgPSBmYWxzZSwgc2VuZERvd25TdHJlYW0gPSBmYWxzZSwgYm9vbCA9IGZhbHNlKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uQXJyID0gc2VuZERvd25TdHJlYW0gPT09IHRydWUgPyB0aGlzLiRkaXJzLkNJIDogdGhpcy4kZGlycy5JXG4gICAgY29uc3QgbWFwRGlyZWN0aW9uID0gcCA9PiB7XG4gICAgICAvLyBldCBwMiA9IGRlZmF1bHRUbyh7fSwgY2xvbmUocCkpO1xuICAgICAgY29uc3QgcGwgPSBwLy8gfHwge307XG4gICAgICBwbC4kZGlyID0gZGlyZWN0aW9uQXJyXG4gICAgICByZXR1cm4gcGxcbiAgICAgIC8vIHJldHVybiBkZWVwTWVyZ2UoZGlyT2JqLCBwMik7XG4gICAgICAvLyBPYmplY3QuYXNzaWduKHskZGlyOiBkaXJlY3Rpb25BcnJ9LCBjbG9uZShwKSlcbiAgICB9XG4gICAgaWYgKHRoaXM/LnByb3BzPy5hZGRlZENoYW5uZWxzPy5pbmNsdWRlcyhjaGFubmVsTmFtZSkgPT09IHRydWUpIHtcbiAgICAgIC8vIENIRUNLUyBJRiBDSEFOTkVMIEhBUyBBTFJFQURZIEJFRU4gQURERURcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBpc0xvY2FsRXZlbnRDaGVjayA9IHBhdGgoWydzcmNFbGVtZW50JywgJ2lzTG9jYWxFdmVudCddKVxuICAgIGNvbnN0IGNpZENoZWNrID0gcGF0aChbJ3NyY0VsZW1lbnQnLCAndnNpZCddKVxuICAgIGNvbnN0IGNpZE1hdGNoZXMgPSBwID0+IHtcbiAgICAgIGNvbnN0IHZzaWQgPSBjaWRDaGVjayhwKVxuICAgICAgY29uc3QgaXNMb2NhbEV2ZW50ID0gaXNMb2NhbEV2ZW50Q2hlY2socClcbiAgICAgIGNvbnN0IGZpbHRlckV2ZW50ID0gaXNMb2NhbEV2ZW50ICE9PSB0cnVlIHx8IHZzaWQgPT09IHRoaXMucHJvcHMudnNpZFxuICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVja3MgXCIsdnNpZCx0aGlzLnByb3BzLnZzaWQsIGlzTG9jYWxFdmVudCxmaWx0ZXJFdmVudCk7XG4gICAgICByZXR1cm4gZmlsdGVyRXZlbnRcbiAgICB9XG5cbiAgICBjb25zdCBwaXBlQXJyID0gW21hcChtYXBEaXJlY3Rpb24pLCBmaWx0ZXIoY2lkTWF0Y2hlcyldXG4gICAgaWYgKHNraXBGaXJzdCA9PT0gdHJ1ZSkge1xuICAgICAgcGlwZUFyci51bnNoaWZ0KHNraXAoMSkpXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbCQgPSB0aGlzLmdldENoYW5uZWwoY2hhbm5lbE5hbWUpLnBpcGUoLi4ucGlwZUFycilcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbihjaGFubmVsJCwgZmFsc2UpXG4gICAgdGhpcy5wcm9wcy5hZGRlZENoYW5uZWxzLnB1c2goY2hhbm5lbE5hbWUpXG4gIH1cblxuICBjaGVja0lmQ2hhbm5lbEV4aXN0cyhjaGFubmVsTmFtZSkge1xuICAgIGNvbnN0IGNoYW5uZWxFeGlzdHMgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXAudGVzdFN0cmVhbShjaGFubmVsTmFtZSlcbiAgICBpZiAoY2hhbm5lbEV4aXN0cyAhPT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTUFlORSBXQVJOSU5HOiBUaGUgQ2hhbm5lbFBheWxvYWQgZnJvbSAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBiZWVuIHNlbnQgdG8gYSBjaGFubmVsLCAke2NoYW5uZWxOYW1lfSwgdGhhdCBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCFgKVxuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbEV4aXN0c1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjaGFubmVsTmFtZSAtID0gdW5kZWZpbmVkOyBUaGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXJlZCBDaGFubmVsLlxuICAgKiBAcHJvcGVydHkge29iamVjdH0gcGF5bG9hZCAtID0ge307IFRoZSBtYWluIGRhdGEgdG8gc2VuZCB0byB0aGUgY2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiAtID0gXCJWSUVXU1RSRUFNX0VWRU5UXCI7IFRoZSBhY3Rpb24gc2VudCB0byB0aGUgY2hhbm5lbC5cbiAgICogQGRlc2NcbiAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHZlcnNhdGlsZSBhbmQgY29uc2lzdGVudCBtZXRob2QgdG8gY29tbXVuaWNhdGUgd2l0aCBhbGwgY2hhbm5lbHMuXG4gICAqXG4gICAqXG4gICAqL1xuXG4gIHNlbmRJbmZvVG9DaGFubmVsKGNoYW5uZWxOYW1lLCBwbCA9IHt9LCBhY3Rpb24pIHtcbiAgICBjb25zdCBwYXlsb2FkID0gcGxcblxuICAgIGNvbnN0IGRlZmF1bHRUb0FjdGlvbiA9IGRlZmF1bHRUbygnVklFV1NUUkVBTV9FVkVOVCcpXG4gICAgY29uc3QgY2hhbm5lbERlZmF1bHRBY3Rpb25IYXNoID0ge1xuICAgICAgQ0hBTk5FTF9ST1VURTogJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJ1xuICAgIH1cbiAgICBjb25zdCBnZXRBY3Rpb25GbiA9IGNvbXBvc2UoZGVmYXVsdFRvQWN0aW9uLCBwcm9wKGNoYW5uZWxOYW1lKSlcblxuICAgIGFjdGlvbiA9IGFjdGlvbiB8fCBnZXRBY3Rpb25GbihjaGFubmVsRGVmYXVsdEFjdGlvbkhhc2gpXG5cbiAgICBjb25zdCBkYXRhID0geyBwYXlsb2FkLCBhY3Rpb24gfVxuXG4gICAgdHJ5IHtcbiAgICAgIGRhdGEuc3JjRWxlbWVudCA9IGNvbXBvc2UocGljayhbJ2lkJywgJ3ZzaWQnLCAnY2xhc3MnLCAndGFnTmFtZSddKSwgcHJvcCgncHJvcHMnKSkodGhpcylcbiAgICAgIGlmICh0aGlzLmNoZWNrSWZDaGFubmVsRXhpc3RzKGNoYW5uZWxOYW1lKSA9PT0gdHJ1ZSkge1xuICAgICAgICBpZiAoL0NIQU5ORUxfTElGRUNZQ0xFLy50ZXN0KGFjdGlvbikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGF0YSwge1xuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICBnZXQ6ICgpID0+IHNhZmVDbG9uZShwbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9icyQgPSBvZihkYXRhKVxuICAgICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKGNoYW5uZWxOYW1lLCBvYnMkLCBkYXRhKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignU1BZTkUgV0FSTklORyAnLCBlKVxuICAgIH1cbiAgfVxuXG4gIHRyYWNlciguLi5hcmdzKSB7XG4gICAgdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kKC4uLmFyZ3MpXG4gIH1cblxuICBzZW5kTGlmZWN5Y2xlTWV0aG9kSW5hY3RpdmUoKSB7XG5cbiAgfVxuXG4gIHNlbmRMaWZlY3ljbGVNZXRob2RBY3RpdmUodmFsLCBwKSB7XG4gICAgY29uc3QgaXNSZW5kZXJlZCA9IHdoZXJlKHtcbiAgICAgIGZyb20kOiBlcXVhbHMoJ2ludGVybmFsJyksXG4gICAgICBhY3Rpb246IGVxdWFscygnVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UJylcbiAgICB9LCBwKVxuICAgIGNvbnN0IGlzRGlzcG9zZWQgPSBwID09PSAnVlNfREVUUklUVVNfQ09MTEVDVCdcbiAgICBpZiAoaXNSZW5kZXJlZCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbCgnQ0hBTk5FTF9MSUZFQ1lDTEUnLCB7IGFjdGlvbjonQ0hBTk5FTF9MSUZFQ1lDTEVfUkVOREVSRURfRVZFTlQnIH0sICdDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcpXG4gICAgfSBlbHNlIGlmIChpc0Rpc3Bvc2VkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNlbmRJbmZvVG9DaGFubmVsKCdDSEFOTkVMX0xJRkVDWUNMRScsIHsgYWN0aW9uOidDSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVCcgfSwgJ0NIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UJylcbiAgICB9XG4gIH1cblxuICBjcmVhdGVBY3Rpb25GaWx0ZXIoc2VsZWN0b3JzLCBkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcihzZWxlY3RvcnMsIGRhdGEpXG4gIH1cblxuICBpc0xvY2FsRXZlbnQoY2hhbm5lbFBheWxvYWRJdGVtKSB7XG4gICAgY29uc3QgaXRlbUVsID0gcGF0aChbJ3NyY0VsZW1lbnQnLCAnZWwnXSwgY2hhbm5lbFBheWxvYWRJdGVtKVxuICAgIGNvbnN0IHRoaXNFbCA9IHBhdGgoWydwcm9wcycsICdlbCddLCB0aGlzKVxuICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzIGVsIGlzICcse3RoaXNFbCwgaXRlbUVsfSk7XG4gICAgcmV0dXJuIFZpZXdTdHJlYW0uZWxJc0RvbUVsZW1lbnQodGhpc0VsKSAmJiBWaWV3U3RyZWFtLmVsSXNEb21FbGVtZW50KGl0ZW1FbCkgJiYgdGhpc0VsLmNvbnRhaW5zKGl0ZW1FbClcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBDT1JFIE1JWElOU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgY29yZU1peGlucyA9IGJhc2VDb3JlTWl4aW5zKClcbiAgICB0aGlzLmNyZWF0ZUlkID0gY29yZU1peGlucy5jcmVhdGVJZFxuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzYzNl9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTMxX187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX185NjhfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUzMV9fOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwicmVxdWlyZSIsImRlZmluZSIsImFtZCIsInNlbGYiLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX185NjhfXyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzEzMV9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNjM2X18iLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181MzFfXyIsIkNoYW5uZWxGZXRjaCIsImNvbnN0cnVjdG9yIiwibmFtZSIsInByb3BzIiwiZGlzYWJsZVNhbml0aXplIiwidmFsaWRhdGVNYXBNZXRob2QiLCJ1bmRlZmluZWQiLCJtYXAiLCJtYXBGbiIsImV4dGVuZGVkQWN0aW9uc0FyciIsInNlbmRDYWNoZWRQYXlsb2FkIiwic3VwZXIiLCJ0ZXN0TW9kZSIsImlzVW5kZWZpbmVkT3JXcm9uZ1R5cGUiLCJlaXRoZXIiLCJpc05pbCIsInZhbCIsImlzVW5kZWZpbmVkIiwiYWxsIiwiaXNOb3RVbmRlZmluZWRBbmRJc05vdEVtcHR5IiwiYWxsUGFzcyIsImFyciIsImxlbmd0aCIsImNvbXBvc2UiLCJ2YWx1ZXMiLCJwaWNrIiwiY29uc29sZSIsIndhcm4iLCJvblJlZ2lzdGVyZWQiLCJ0aGlzIiwicGF1c2UiLCJzdGFydEZldGNoIiwiYWRkUmVnaXN0ZXJlZEFjdGlvbnMiLCJleHRlbmRlZEFyciIsImRlZmF1bHRUbyIsInBhdGgiLCJjb25jYXQiLCJvcHRpb25zIiwic3Vic2NyaWJlciIsIm9uRmV0Y2hSZXR1cm5lZCIsImJpbmQiLCJmZXRjaFByb3BzIiwiY29uc29saWRhdGVBbGxGZXRjaFByb3BzIiwib25GZXRjaFVwZGF0ZSIsImV2dCIsInByb3BzT3B0aW9ucyIsImdldFByb3BzRm9yRmV0Y2giLCJzdHJlYW1JdGVtIiwiYWN0aW9uIiwiaXNDaGFubmVsRmV0Y2hFcnJvciIsImNyZWF0ZUNoYW5uZWxQYXlsb2FkSXRlbSIsInBheWxvYWQiLCJ1cmwiLCJzcmNFbGVtZW50Iiwic2VuZENoYW5uZWxQYXlsb2FkIiwiZGF0YU9iaiIsInZpZXdTdHJlYW1JbmZvIiwiZmlsdGVyT3V0VW5kZWZpbmVkIiwicmVqZWN0IiwibzEiLCJvMiIsIm1lcmdlRGVlcFJpZ2h0Iiwib2JzZXJ2ZXIiLCJvYnNlcnZlciQiLCJfcmVhZE9ubHlGYWNhZGVDYWNoZSIsIldlYWtNYXAiLCJDaGFubmVsUGF5bG9hZCIsImNoYW5uZWxOYW1lIiwiZXZlbnQiLCJ0aW1lTGFiZWwiLCJjaGFubmVsIiwidGltZSIsImNoYW5uZWxQYXlsb2FkSXRlbU9iaiIsImRlZXBGcmVlemUiLCJkZWJ1ZyIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInBheWxvYWRTdHIiLCJKU09OIiwic3RyaW5naWZ5IiwiY2hhbm5lbEFjdGlvbnNBcnIiLCJnZXRDaGFubmVsQWN0aW9ucyIsInZhbGlkYXRlQWN0aW9uIiwiY2xvbmUiLCJtZXJnZUFsbCIsInNhZmVDbG9uZSIsInJldml2ZWRQYXlsb2FkIiwiY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMiLCIkZGlyIiwiZ2V0IiwiX2RpciIsInNldCIsImxvY2F0aW9uIiwiZ2V0TG9jYXRpb25EYXRhIiwiZGVmaW5lUHJvcGVydGllcyIsInRpbWVFbmQiLCJpc0luQXJyIiwiaW5jbHVkZXMiLCJpbml0aWFsaXplZCIsInBpY2tBbGwiLCJ3aW5kb3ciLCJnZXRTdHJlYW1JdGVtIiwiZGVlcENsb25lIiwibyIsImlzQXJyIiwiaXMiLCJBcnJheSIsImlzT2JqIiwib2IiLCJmcm9tUGFpcnMiLCJ0b1BhaXJzIiwiY3JlYXRlUmVhZE9ubHlQcm94eUZhY2FkZSIsInByb3h5T2JqIiwiaGFzIiwid2FybkJsb2NrZWRXcml0ZSIsInByb3BOYW1lIiwiU3RyaW5nIiwiZmFjYWRlIiwiUHJveHkiLCJ0YXJnZXQiLCJfX3Byb3h5X19pc1Byb3h5IiwiZGVmaW5lUHJvcGVydHkiLCJkZWxldGVQcm9wZXJ0eSIsImVsSXNEb21FbGVtZW50IiwibHRlIiwicHJvcCIsImdldE93blByb3BlcnR5TmFtZXMiLCJmb3JFYWNoIiwiaXNGcm96ZW4iLCJwcm9jZXNzZWQiLCJmcmVlemUiLCJlIiwiZ2V0TW91c2VFdmVudEtleXMiLCJDaGFubmVsUHJveHkiLCJpc1Byb3h5Iiwic3ViamVjdCQiLCJTdWJqZWN0IiwicmVwbGF5U3ViJCIsIlJlcGxheVN1YmplY3QiLCJtZXJnZSIsImNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5IiwiZ2V0TWVyZ2VkU3ViamVjdCIsInBlcmlzdERhdGEiLCJsaXN0UmVnaXN0ZXJlZENoYW5uZWxzIiwicmVwbGF5U3ViamVjdCIsInN1YmplY3QiLCJDaGFubmVsIiwiQ0hBTk5FTF9OQU1FIiwiY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmoiLCJkZWZhdWx0QWN0aW9ucyIsImRhdGEiLCJpc1JlZ2lzdGVyZWQiLCJkZWZhdWx0Q2FjaGVkUGF5bG9hZEJvb2wiLCJyZXBsYXkiLCJzZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsIiwiY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMiLCJzdHJlYW1zQ29udHJvbGxlciIsImNoYW5uZWxzTWFwIiwiZ2V0TWFpbk9ic2VydmVyIiwiY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUiLCJkaXNwYXRjaGVyU3RyZWFtJCIsImdldFN0cmVhbSIsInBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSIsInByb3BFcSIsInBpcGUiLCJmaWx0ZXIiLCJzdWJzY3JpYmUiLCJvblJlY2VpdmVkT2JzZXJ2YWJsZSIsInRlc3RTdHJlYW0iLCJnZXRQcm94eVN1YmplY3QiLCJvbkNoYW5uZWxJbml0aWFsaXplZCIsImtleXMiLCJjaGFubmVsQWN0aW9ucyIsImNoZWNrRm9yVHJhaXRzIiwidHJhaXRzIiwiVHJhaXRDbGFzcyIsImFkZFRyYWl0cyIsImluaXRpYWxpemVTdHJlYW0iLCJhY3Rpb25zT2JqIiwiYWN0aW9uc09iaklzRW1wdHkiLCJpc0VtcHR5IiwiZGF0YUlzQWRkZWQiLCJhY3Rpb25TdHIiLCJzZXREZWZhdWx0QWN0aW9uc09iaiIsInNldFRyYWNlIiwiYm9vbCIsImdldEFjdGlvblZhbCIsImlmRWxzZSIsImlkZW50aXR5IiwiaGVhZCIsIm1haW5BcnIiLCJvYmoiLCJjaGFpbiIsInN0ciIsIm9iak9mIiwiZGVsYXlDaGVja0lmVHJhaXRNZXRob2RIYXNCZWVuQWRkZWQiLCJtZXRob2RTdHIiLCJzZXRUaW1lb3V0IiwiZ2V0QXJyTWV0aG9kIiwiYWx3YXlzIiwidmlldyIsImxlbnNJbmRleCIsImNoYW5uZWxBY3Rpb25NZXRob2RzIiwib25JbmNvbWluZ09ic2VydmFibGUiLCJnZXRBY3Rpb25NZXRob2RGb3JPYnNlcnZhYmxlIiwidW5wYWNrZWQiLCJkZWZhdWx0Rm4iLCJvblZpZXdTdHJlYW1JbmZvIiwibWV0aG9kVmFsIiwiZm4iLCJlcXNOYW1lIiwiZXF1YWxzIiwib2JzVmFsIiwibWVyZ2VQcm9wcyIsImQiLCJvYnNlcnZhYmxlIiwib25TdWNjZXNzIiwib25FcnJvciIsIm9icyIsIm9icyQiLCJjaGFubmVsUGF5bG9hZEl0ZW0iLCJuZXh0IiwiZ2V0Q2hhbm5lbCIsInBheWxvYWRGaWx0ZXIiLCJjIiwic291cmNlIiwibWVyZ2VDaGFubmVscyIsImNoYW5uZWxzQXJyIiwiZW1pdE9uY2UiLCJjaGFubmVsT2JzZXJ2YWJsZXMiLCJpdGVtIiwiY2hhbiQiLCJ0YWtlIiwiY29tYmluZWQkIiwiZm9ya0pvaW4iLCJFTVBUWSIsImZpcnN0JCIsInJlc3QkIiwiY29tYmluZUxhdGVzdFdpdGgiLCJyZXN1bHRzQXJyIiwiaWR4IiwiaXRlcktleSIsImNoZWNrRm9yTm90VHJhY2tGbGFnIiwiZG9Ob3RUcmFjayIsImRvTm90VHJhY2tDaGFubmVsIiwicmVnaXN0ZXJlZFN0cmVhbU5hbWVzIiwicmVnaXN0ZXJlZFN0ZXBzIiwicmVnaXN0ZXJlZExpZmVTdHJlYW1UeXBlcyIsInJlZ2lzdGVyZWRTdHJlYW1UeXBlcyIsInJlZ2lzdGVyZWRBY3Rpb25zIiwiYmFzZVZhbGlkYXRpb25zIiwidmlld0luZm9WYWxpZGF0aW9ucyIsInVpVmFsaWRhdGlvbnMiLCJsaWZlc3RyZWFtVmFsaWRhdGlvbnMiLCJzdGVwVmFsaWRhdGlvbnMiLCJzdGVwRGlzcG9zZVZhbGlkYXRpb25zIiwic3RlcFVwZGF0ZVZhbGlkYXRpb25zIiwicm91dGVWYWxpZGF0aW9ucyIsIlN0cmVhbXNDb25maWciLCJPYnNlcnZhYmxlIiwiZXJyb3IiLCJwcmVkaWNhdGUiLCJsaWZlU3RyZWFtVmFsaWRhdGlvbnMiLCJTVEVQIiwidHlwZSIsInZpZXdJZCIsImRpc3Bvc2VJdGVtcyIsInN0cmVhbVZhbGlkYXRpb25zIiwiZ2V0UnhUeXBlIiwic3RyZWFtcyIsImluaXQiLCJzdHJ1Y3R1cmUiLCJ2YWxpZGF0aW9ucyIsIl9tYXAiLCJNYXAiLCJDaGFubmVsc01hcCIsImFkZE1peGlucyIsImdldENoYW5uZWxzTGlzdCIsImZyb20iLCJrIiwidiIsImtleSIsInNob3dPbmx5UHJveGllcyIsInByb3h5TWFwIiwicmVqZWN0UHJveHlGbiIsImZpbHRlclByb3h5Rm4iLCJyZW1vdmVkUHJveHlBcnIiLCJwbHVjayIsImxpc3RQcm94eUNoYW5uZWxzIiwiY2hlY2tGb3JNaXNzaW5nQ2hhbm5lbHMiLCJmaWx0ZXJQcm94eUFyciIsImZpbHRlclByZWZpeFdhcm5pbmciLCJqb2luIiwiY3JlYXRlTWFpblN0cmVhbXMiLCJyb3V0ZVN0cmVhbSIsInVpU3RyZWFtIiwiZG9tU3RyZWFtIiwidmlld1N0cmVhbUxpZmVjeWNsZSIsImFpU3RyZWFtIiwiYWRkS2V5RXZlbnQiLCJyZWdpc3RlclN0cmVhbSIsInBhdGhFcSIsImlzUmVwbGF5U3ViamVjdCIsInN1YmplY3RUeXBlIiwiU3B5bmVDaGFubmVsQUkiLCJvblNlbmRFdmVudCIsIlNweW5lQ2hhbm5lbExpZmVjeWNsZSIsIlNweW5lQ2hhbm5lbFJvdXRlIiwicm91dGVDb25maWdKc29uIiwiZ2V0Um91dGVDb25maWciLCJiaW5kU3RhdGljTWV0aG9kcyIsIm5hdlRvU3RyZWFtJCIsImluZm8iLCJvbk1hcE5leHQiLCJjb21wYXJlUm91dGVLZXl3b3JkcyIsImNoZWNrQ29uZmlnRm9ySGFzaCIsImNvbmZpZyIsImNoYW5uZWxzIiwiUk9VVEUiLCJpc0hhc2giLCJpbml0U3RyZWFtIiwidXBkYXRlUm91dGVDb25maWciLCJuZXdSb3V0ZXNPYmoiLCJtZXJnZVJpZ2h0IiwiY29uZm9ybVJvdXRlQ29uZmlnIiwicm91dGVDb25maWciLCJuYXZMaW5rcyIsInJvdXRlRGF0YXNldHNBcnIiLCJiaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhIiwic3B5bmVDb25maWciLCJmbGF0dGVuQ29uZmlnT2JqZWN0Iiwicm91dGVzIiwicGFyYW1zQXJyIiwiZmlyc3RMb2FkU3RyZWFtJCIsIm9uSW5jb21pbmdEb21FdmVudCIsImNyZWF0ZVBvcFN0YXRlU3RyZWFtIiwiZmlyc3RMb2FkZWQiLCJyZW1vdmVTU0lEIiwicm91dGVMZW5zIiwibGVuc1Byb3AiLCJvdmVyIiwib21pdCIsIm9taXRTU0lEIiwiYWN0biIsIkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UIiwiZXZlbnRDb3VudCIsImlzSGlzdG9yeUNvdW50IiwiTnVtYmVyIiwiZ2V0RGF0YUZyb21TdHJpbmciLCJyb3V0ZUNvdW50IiwidmFsdWUiLCJlbnVtZXJhYmxlIiwia2V5d29yZEFycnMiLCJjb21wYXJlIiwicm91dGVEYXRhIiwicGF0aHMiLCJjaGVja0ZvclJvdXRlUGFyYW1zT3ZlcnJpZGVzIiwiY2hlY2tGb3JFdmVudE1ldGhvZHMiLCJtZXRob2RzQXJyIiwidGVzdCIsImdldE1ldGhvZHMiLCJtZXRob2RVcGRhdGUiLCJtYXRjaCIsInAxIiwicDIiLCJwMyIsInA0IiwidG9Mb3dlckNhc2UiLCJtZXRob2RTdHJSZXBsYWNlIiwicmVwbGFjZSIsInJ1bk1ldGhvZCIsIm0iLCJjaGVja0ZvckVuZFJvdXRlIiwicGwiLCJkZWJ1Z0Jvb2wiLCJpdGVyIiwib25SZWR1Y2VSb3V0ZVBhdGhzIiwiYWNjIiwicm91dGVQYXRoIiwicm91dGVOYW1lIiwicm91dGVOYW1lVmFsIiwia2V5c0FyciIsInByZWQiLCJhcnJTdHIiLCJSZWdFeHAiLCJmaW5kIiwiZ2V0UHJvcFZhbCIsIm5leHRSb3V0ZVBhdGgiLCJyZXZlcnNlIiwicmVkdWNlIiwicHVzaCIsImVuZFJvdXRlVmFsQXJyIiwiZW5kUm91dGVWYWwiLCJlbCIsImRhdGFzZXQiLCJkb21TdHJpbmdNYXAiLCJkb21TdHJpbmdNYXBUb09iamVjdCIsImdldERhdGFGcm9tUGFyYW1zIiwiY2hhbmdlTG9jYXRpb25Cb29sIiwiaXNIaWRkZW4iLCJzZW5kUm91dGVTdHJlYW0iLCJjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMiLCJyb3V0ZVZhbHVlIiwicmVnZXhUb2tlbk9iaiIsImNoYW5nZVdpbmRvd0xvYyIsInNldFdpbmRvd0xvY2F0aW9uIiwiZ2V0Um91dGVTdGF0ZSIsImdldElzRGVlcExpbmtCb29sIiwiaXNIaXN0b3J5IiwiX3JvdXRlQ291bnQiLCJnZXRSb3V0ZUNvdW50IiwiZ2V0RXh0cmFQYXlsb2FkUGFyYW1zIiwiaXNEZWVwTGluayIsInJvdXRlVHlwZSIsImdldFJvdXRlU3RyRnJvbVBhcmFtcyIsImdldFByb3BGcm9tQ29uZmlnIiwicHJwIiwiZGVmYWx0IiwidHlwZUZvclN0ciIsImlzSGFzaEZvclN0ciIsIm5leHRXaW5kb3dMb2MiLCJmb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uIiwiZGF0YUZyb21TdHIiLCJnZXREYXRhRnJvbUxvY2F0aW9uU3RyIiwicGF0aElubmVybW9zdCIsImhhc2hJc1RydWUiLCJnZXRMb2NhdGlvblN0ckJ5VHlwZSIsImdldFBhcmFtc0Zyb21Sb3V0ZVN0ciIsInQiLCJsb2MiLCJwYXJhbXNEYXRhIiwiY29udmVydFBhcmFtc1RvUm91dGUiLCJjb252ZXJ0Um91dGVUb1BhcmFtcyIsImNoZWNrRW1wdHlSb3V0ZVN0ciIsImlzRW1wdHlCb29sIiwicmVtb3ZlTGFzdFNsYXNoIiwiY2hhbm5lbFBheWxvYWQiLCJwYXRobmFtZSIsImhpc3RvcnkiLCJwdXNoU3RhdGUiLCJjaGVja0ZvclNsYXNoIiwid2hlbiIsImNvbXBsZW1lbnQiLCJfXyIsImdldFdpbmRvd0xvY2F0aW9uIiwiY3VycmllZEdldFJvdXRlIiwiY3VycnlOIiwiU3B5bmVDaGFubmVsVUkiLCJrZXlFdmVudHNMb2FkZWQiLCJrZXlDb2RlQXJyIiwibG9hZEtleVN0cmVhbSIsImtleVVwcyIsImZyb21FdmVudCIsImRvY3VtZW50Iiwia2V5UHJlc3NlcyQiLCJncm91cEJ5Iiwia2V5Q29kZSIsImluZGV4T2YiLCJyZXBlYXQiLCJvbktleVByZXNzZWQiLCJudW0iLCJyZWdpc3RlcktleSIsIm9uVUlFdmVudCIsImdldEFjdGlvblN0YXRlIiwidHlwZVZhbCIsInR5cGVPdmVyUmlkZVZhbCIsInRvVXBwZXIiLCJldmVudFR5cGUiLCJtYWluQWN0aW9uIiwiY3VzdG9tQWN0aW9uc0FyciIsIlNweW5lQ2hhbm5lbFdpbmRvdyIsImN1cnJlbnRTY3JvbGxZIiwiZG9tQ2hhbm5lbENvbmZpZyIsIldJTkRPVyIsIm9icyRBcnIiLCJnZXRBY3RpdmVPYnNlcnZhYmxlcyIsImRvbSQiLCJwIiwiZ2V0TW91c2VXaGVlbE1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfV0hFRUxfRVZFTlQiLCJzY3JvbGxEaXIiLCJkZWx0YVkiLCJkZWx0YVgiLCJkZWx0YVoiLCJjcmVhdGVDdXJyaWVkR2VuZXJpY0V2ZW50IiwidG9VcHBlckNhc2UiLCJjdXJyeSIsIm1hcEdlbmVyaWNFdmVudCIsImN1cnJ5Rm4iLCJnZXRSZXNpemVNYXBGbiIsIkNIQU5ORUxfV0lORE9XX1JFU0laRV9FVkVOVCIsImdldE9yaWVudGF0aW9uTWFwRm4iLCJDSEFOTkVMX1dJTkRPV19PUklFTlRBVElPTl9FVkVOVCIsImlzUG9ydHJhaXRCb29sIiwibWF0Y2hNZWRpYSIsIm1hdGNoZXMiLCJvcmllbnRhdGlvbiIsImdldE1lZGlhUXVlcnlNYXBGbiIsIkNIQU5ORUxfV0lORE9XX01FRElBX1FVRVJZX0VWRU5UIiwiY3JlYXRlTW91c2VXaGVlbE9ic2VydmFibGUiLCJkZWJvdW5jZVQiLCJkZWJvdW5jZU1TVGltZUZvclNjcm9sbCIsImNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQiLCJkZWJvdW5jZVRpbWUiLCJnZXRTY3JvbGxEYXRhIiwic2Nyb2xsWSIsInNjcm9sbERpc3RhbmNlIiwiZ2V0U2Nyb2xsWSIsInNjcm9sbEVsZW1lbnQiLCJwYWdlWU9mZnNldCIsInNjcm9sbFRvcCIsImdldFNjcm9sbE1hcEZuIiwiaW50ZXJ2YWwiLCJzY3JvbGxEYXRhRm4iLCJjcmVhdGVTY3JvbGxPYnNlcnZhYmxlIiwiaXNQYXNzaXZlIiwiZFRpbWUiLCJlbGVtZW50IiwiaXNXaW5kb3ciLCJzY3JvbGxFbEZvclZhbHMiLCJzY3JvbGxNYXBGbiIsInBhcnRpYWxSaWdodCIsInNraXBXaGlsZSIsIm5ld1Njcm9sbFkiLCJzY3JvbGxEaXN0YW5jZUFicyIsIk1hdGgiLCJhYnMiLCJjcmVhdGVPcmllbnRhdGlvbk9ic2VydmFibGUiLCJjcmVhdGVSZXNpemVPYnNlcnZhYmxlIiwiZGVib3VuY2VNU1RpbWVGb3JSZXNpemUiLCJnZXRFdmVudHNGcm9tQ29uZmlnIiwiZXZlbnRzIiwiY3VzdG9tRW50cmllcyIsImlzQXJyYXkiLCJjdXN0b21FdmVudHMiLCJjb25mb3JtQ3VzdG9tRXZlbnRDb25maWciLCJlbnRyeSIsInVwZGF0ZUNoYW5uZWxBY3Rpb25zIiwiYWRkV2luZG93RXZlbnRUb0FyciIsIm9wZXJhdG9yIiwiY3VzdG9taXplQ3VzdG9tRXZlbnRPYnNlcnZhYmxlIiwic2V0S2V5cyIsImJ1ZmZlciIsInBBcnIiLCJtYXBCYXRjaGVkRXZlbnRzIiwiYnVmZmVyQ291bnQiLCJ0aHJvdHRsZVRpbWUiLCJsYXN0IiwiZGV0YWlsIiwiaXNCYXRjaCIsImJhdGNoQ291bnQiLCJsaXN0ZW5Gb3JNZWRpYVF1ZXJpZXMiLCJtZWRpYVF1ZXJpZXMiLCJtZXRob2RzIiwibGlzdGVuRm9yUmVzaXplIiwibGlzdGVuRm9yT3JpZW50YXRpb24iLCJsaXN0ZW5Gb3JTY3JvbGwiLCJsaXN0ZW5Gb3JXaGVlbCIsIm1hcE9iakluZGV4ZWQiLCJtZXRob2QiLCJpIiwiY2hlY2tGb3JNZWRpYVF1ZXJpZXMiLCJldmVudHNBcnIiLCJnZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSIsImNyZWF0ZU1lcmdlZE9ic0Zyb21PYmoiLCJhcHBseSIsIndpbmRvd0FjdGlvbiIsIm9uU2Nyb2xsTG9ja0V2ZW50Iiwib25TZXRFbGVtZW50VG9TY3JvbGwiLCJjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlciIsIl9jaGFubmVscyIsInZlcnNpb24iLCJTcHluZUFwcCIsImRlZmF1bHRDb25maWciLCJzY3JvbGxMb2NrIiwic2Nyb2xsTG9ja1giLCJzY3JvbGxMb2NrWSIsInN0cmljdCIsIm1vZGUiLCJpZnJhbWVzIiwiYW5jaG9ycyIsImN1c3RvbUVsZW1lbnRzIiwiYmFzZUhyZWYiLCJJTUdfUEFUSCIsInBsdWdpbk1ldGhvZHMiLCJwbHVnaW5zIiwidG1wIiwiZXBoZW1lcmFsUHJvcHMiLCJ0bXBQcm9wcyIsImxpc3RlbkZvck1vdXNlV2hlZWwiLCJhZGQ0MDRzIiwicm91dGVVdGlscyIsImluaXRpYWxpemUiLCJwbHVnaW5zRm4iLCJnZXRQbHVnaW5zTWV0aG9kT2JqIiwicmVnaXN0ZXJDaGFubmVsIiwicmVnaXN0ZXJQbHVnaW4iLCJwbHVnaW5JbnN0YW5jZSIsInJlZ2lzdGVyRGF0YUNoYW5uZWwiLCJsaXN0Q2hhbm5lbHMiLCJudWxsSG9sZGVyIiwiaWQiLCJhcHBlbmRUb0RvbSIsImJvZHkiLCJzdHlsZSIsImNzc1RleHQiLCJTcHluZSIsIl9zcHluZUFwcFByb3BzIiwiU3B5bmVQbHVnaW4iLCJwYXJlbnRFbCIsIm1lcmdlRGVmYXVsdENvbmZpZyIsImNyZWF0ZVBhcmVudEVsIiwicmVnaXN0ZXIiLCJzcHluZUFwcFByb3BzIiwicGx1Z2luTmFtZSIsIm9uQmVmb3JlUmVnaXN0ZXJlZCIsImFkZFBsdWdpbkNvbmZpZyIsIm9uUmVuZGVyIiwiU3B5bmVBcHBQcm9wZXJ0aWVzIiwiYXNzaWduIiwiZ2V0U3B5bmVBcHAiLCJ1cGRhdGVTcHluZUNvbmZpZyIsInNweW5lQXBwIiwicGx1Z2luQ29uZmlnIiwicGF0aFNhdGlzZmllcyIsImdldEVsZW1lbnRCeUlkIiwicGx1Z2luRWwiLCJhcHBlbmRDaGlsZCIsInJlbmRlciIsImNyZWF0ZVBsdWdpbkVsIiwiY2hlY2tGb3JSZXF1aXJlZFdpbmRvd0V2ZW50IiwicmVxdWlyZWRFdmVudHMiLCJyZXF1aXJlZEN1c3RvbUV2ZW50cyIsIndpbmRvd0NvbmZpZyIsImdldENoYW5uZWxDb25maWciLCJtaXNzaW5nRXZlbnRzIiwiZW50cnlOYW1lIiwiY3VzdG9tRXZlbnROYW1lcyIsIm1pc3NpbmdDdXN0b21FdmVudHMiLCJlbnRyeUFzQ29uZmlnU3RyIiwiQ2hhbm5lbEZldGNoVXRpbCIsIl9tYXBGbiIsInNldE1hcEZuIiwiX3VybCIsInNldFVybCIsIl9yZXNwb25zZVR5cGUiLCJzZXRSZXNwb25zZVR5cGUiLCJfc2VydmVyT3B0aW9ucyIsInNldFNlcnZlck9wdGlvbnMiLCJfc3Vic2NyaWJlciIsImxvZyIsInNlcnZlck9wdGlvbnMiLCJyZXNwb25zZVR5cGUiLCJzdGFydFdpbmRvd0ZldGNoIiwibWV0YWRhdGEiLCJ0YXBMb2ciLCJ0YXAiLCJtYXBNZXRob2QiLCJmZXRjaCIsIm1lcmdlTWFwIiwicmVzcG9uc2UiLCJwYXJzZVJlc3BvbnNlIiwic2FuaXRpemVkRGF0YSIsImNhdGNoRXJyb3IiLCJvZiIsImNyZWF0ZUZldGNoRXJyb3JQYXlsb2FkIiwic2hhcmUiLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwiY29udGVudFR5cGUiLCJoZWFkZXJzIiwicmVzcG9uc2VNZXRhZGF0YSIsIm9rIiwicmF3Qm9keSIsInNhZmVSZWFkVGV4dCIsImNyZWF0ZUZldGNoRXJyb3IiLCJlcnJvclR5cGUiLCJtZXNzYWdlIiwicGFyc2VKc29uUmVzcG9uc2UiLCJ0ZXh0IiwiYmxvYiIsImFycmF5QnVmZmVyIiwiZm9ybURhdGEiLCJ0cmltbWVkQm9keSIsInRyaW0iLCJwYXJzZSIsIm9yaWdpbmFsRXJyb3IiLCJFcnJvciIsImZldGNoTWV0YWRhdGEiLCJpc0Vycm9yIiwicmF3Qm9keVByZXZpZXciLCJ0cnVuY2F0ZUJvZHkiLCJvcmlnaW5hbEVycm9yTWVzc2FnZSIsIm1heExlbmd0aCIsInNsaWNlIiwib3B0cyIsImdldEZuIiwic3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMiLCJIZWFkZXJzIiwidXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMiLCJtZXJnZWRPcHRpb25zIiwiYmFzZU9wdGlvbnMiLCJBY2NlcHQiLCJjcmVkZW50aWFscyIsImNhY2hlIiwicmVkaXJlY3QiLCJyZWZlcnJlclBvbGljeSIsImludGVncml0eSIsImtlZXBhbGl2ZSIsImlzTm90QXJyIiwibm90IiwiaXNOb3RFbXB0eSIsImlzTm9uRW1wdHlTdHIiLCJpc05vbkVtcHR5QXJyIiwiaXNPYmplY3RGbiIsImlzTm9uRW1wdHlPYmplY3RGbiIsIkNoYW5uZWxQYXlsb2FkRmlsdGVyIiwic2VsZWN0b3IiLCJmaWx0ZXJzIiwiZGVidWdMYWJlbCIsImRlYnVnTGFiZWxBcnIiLCJwcm9wRmlsdGVycyIsImFkZFN0cmluZ1NlbGVjdG9yRmlsdGVyIiwiZmlsdGVyU2VsZWN0b3IiLCJhZGRBcnJheVNlbGVjdG9yRmlsdGVyIiwiYWRkRGF0YUZpbHRlciIsImZpbHRlckRhdGEiLCJmaWx0ZXJzQXJyIiwiZmlsdGVyc0FyZUVtcHR5IiwiZmlsdGVySnNvbiIsImZpbHRlcmRlYnVnTGFiZWwiLCJmblZhbCIsIkYiLCJpc1N0cmluZyIsIkJvb2xlYW4iLCJpc0Jvb2xlYW4iLCJpc051bWJlciIsImNvbXBhcmVTdHIiLCJpc0FycmF5Rm4iLCJmTWV0aG9kIiwid2hlcmUiLCJjb21wYXJlZE9iaiIsInByb3BzQm9vbGVhbnMiLCJmb3JFYWNoT2JqSW5kZXhlZCIsImNvbXBhcmVEYXRhIiwiY2hlY2tQYXlsb2FkU2VsZWN0b3IiLCJzcmNQYXlsb2FkIiwic3JjIiwiZWxDYW5NYXRjaCIsIm1hdGNoZXNCb29sQXJyIiwic2VsIiwic2VsZWN0b3JzQXJyIiwibm9kZUFyclJlc3VsdHNEZWJ1Z2dlciIsImFueSIsInF1ZXJ5U2VsZWN0b3IiLCJzZWxlY3RvckFyciIsInBheWxvYWRDaGVjayIsImlzTWVyZ2VhYmxlT2JqZWN0IiwidG9TdHJpbmciLCJjbG9uZUlmTmVjZXNzYXJ5Iiwib3B0aW9uc0FyZ3VtZW50IiwiZGVlcE1lcmdlIiwiZGVmYXVsdEFycmF5TWVyZ2UiLCJkZXN0aW5hdGlvbiIsImFycmF5IiwiYXJyYXlNZXJnZSIsIm1lcmdlT2JqZWN0IiwicHJldiIsImRlbGF5Q2FsbCIsImFzeW5jIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJnZXRDb25zdHJ1Y3Rvck5hbWUiLCJzdWJzdHIiLCJmaW5kU3RyT3JSZWdleE1hdGNoU3RyIiwicyIsImNoZWNrZXJJZlJlZ2V4TWF0Y2hFeGlzdHMiLCJjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmoiLCJkb21NYXAiLCJjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsIiwiaXNOb3ROaWwiLCJpc05vdE5pbEFuZElzTm90RW1wdHkiLCJnZXRBbGxNZXRob2ROYW1lcyIsImluc3RhbmNlIiwib21pdHRlZE1ldGhvZHMiLCJjb21iaW5lZE9taXR0ZWRNZXRob2RzIiwib21pdFByb3BzRnJvbUFyciIsIndpdGhvdXQiLCJ1bmlxIiwic3RhdGljTWV0aG9kcyIsImFsbE1ldGhvZHMiLCJnYyIsImJhc2VDb3JlTWl4aW5zIiwiY3JlYXRlcHJvcHNNYXAiLCJ3bSIsIm9iaktleSIsInZzaWQiLCJ3ZWFrTWFwIiwiY3JlYXRlSWQiLCJyYW5kb20iLCJzdWJzdHJpbmciLCJzZXRUcmFjZUZ1bmMiLCJiYXNlU3RyZWFtc01peGlucyIsInRlc3RGdW5jIiwic2VuZFJvdXRlUGF5bG9hZCIsInNlbmRVSVBheWxvYWQiLCJSb3V0ZUNoYW5uZWxVcGRhdGVyIiwiY3h0IiwiY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iaiIsInNlbmRSb3V0ZUNoYW5uZWxVcGRhdGUiLCJ2cyIsIm9uUmVuZGVyZWQiLCJzZW5kSW5mb1RvQ2hhbm5lbCIsImFmdGVyQnJvYWRjYXN0RXZlbnRzIiwiZGlzcG9zZVZpZXdTdHJlYW0iLCJhcHBlbmRUb051bGwiLCJyZXZpdmVJZlByb3h5IiwiX19wcm94eV9fcHJveHlOYW1lIiwicHJveHlSZXZpdmVyTWV0aG9kIiwiZ2V0UHJveHlSZXZpdmVyIiwiY2xvbmVOZXN0ZWRQcm94eU9iaiIsInBhdGhBcnIiLCJuZXN0ZWRQcm94eU9iaiIsIl9fcHJveHlfX3Byb3BzIiwicm9vdE9iaiIsInByb3h5SXRlcmFibGUiLCJpdGVyT2JqIiwiaXRlclBhdGgiLCJkYXRhUGF0aCIsImVudHJpZXMiLCJnZXRQcm9wVHlwZSIsImNsb25lZFBhdGgiLCJjbXNEYXRhUmV2aXZlTmVzdGVkUHJveHlPYmoiLCJzYWZlQ2xvbmVEZWVwIiwic2VlbiIsIldlYWtTZXQiLCJyZXZpdmVkIiwiYWRkIiwib3V0IiwicmV3cmFwQXJyYXlGcm9tU291cmNlIiwic291cmNlQXJyIiwicmVzdWx0QXJyIiwicHJveHlOYW1lIiwic2FmZUZpbHRlciIsInNhZmVSZWplY3QiLCJzYWZlTWFwIiwicmVzdWx0IiwiaXNQcm94aWVkIiwic2FmZUF1Z21lbnQiLCJwcm9wc09iaiIsImRlZXAiLCJfc2FuaXRpemVEYXRhIiwiaXNDb25maWd1cmVkIiwiZ2xvYmFsRGlzYWJsZSIsIlNBRkVfVVJJX1JFR0VYUCIsIm5vcm1hbGl6ZVVyaUZvckNoZWNrIiwiaXNTYWZlVXJpIiwiU1BZTkVfQ1VTVE9NX0VMRU1FTlRfUkUiLCJhbGxvd2VkQ3VzdG9tRWxlbWVudFBhdHRlcm5zIiwiYWxsb3dDdXN0b21FbGVtZW50cyIsImVsZW1lbnRzIiwiQ1VTVE9NX0VMRU1FTlRfSEFORExJTkciLCJ0YWdOYW1lQ2hlY2siLCJ0YWdOYW1lIiwic29tZSIsImF0dHJpYnV0ZU5hbWVDaGVjayIsImFsbG93Q3VzdG9taXplZEJ1aWx0SW5FbGVtZW50cyIsIlNBRkVfRk9SX1JJQ0hfVEVYVCIsIkFMTE9XRURfVEFHUyIsIkFERF9UQUdTIiwiQUxMT1dFRF9BVFRSIiwiQUxMT1dfREFUQV9BVFRSIiwiRk9SQklEX0FUVFIiLCJGT1JCSURfVEFHUyIsIkFMTE9XRURfVVJJX1JFR0VYUCIsIlNBRkVfRk9SX0FQUCIsImNvbmZpZ3VyZWRJZnJhbWVQb2xpY3kiLCJhbGxvdyIsImFsbG93ZWRPcmlnaW5zIiwic2FuZGJveCIsImFjdGl2ZUlmcmFtZVBvbGljeSIsInJlc29sdmVJZnJhbWVQb2xpY3kiLCJvdmVycmlkZSIsImlzQWxsb3dlZElmcmFtZVNyYyIsInBvbGljeSIsIm5vcm1hbGl6ZWQiLCJyZXNvbHZlZCIsIlVSTCIsImhyZWYiLCJvcmlnaW4iLCJob3N0bmFtZSIsInByb3RvY29sIiwiZW5kc1dpdGgiLCJvcmlnaW5zIiwiaWZyYW1lSG9va0FkZGVkIiwiU0FNRV9DT05URVhUX1RBUkdFVFMiLCJjb25maWd1cmVkQW5jaG9yUG9saWN5IiwiYWxsb3dUYXJnZXQiLCJhZGROb29wZW5lciIsImFsbG93ZWREb21haW5zIiwiYWN0aXZlQW5jaG9yUG9saWN5IiwicmVzb2x2ZUFuY2hvclBvbGljeSIsImlzQWxsb3dlZEFuY2hvckhyZWYiLCJkb21haW5zIiwiZm9yY2VOb29wZW5lclJlbCIsImN1cnJlbnRSZWwiLCJnZXRBdHRyaWJ1dGUiLCJyZWxTZXQiLCJTZXQiLCJzcGxpdCIsInNldEF0dHJpYnV0ZSIsImFuY2hvckhvb2tBZGRlZCIsIlJJQ0hURVhUX0FMSUFTRVMiLCJyZXNvbHZlRGVmYXVsdE1vZGUiLCJjb25maWdNb2RlIiwiYnVpbGRNb2RlQ29uZmlnIiwiYmFzZSIsImFsbG93SWZyYW1lIiwiaWZyYW1lQWxsb3dlZEZvck1vZGUiLCJjZmciLCJhZGRBdHRyIiwiQUREX0FUVFIiLCJtYWtlU2FuaXRpemVGbiIsImh0bWwiLCJzYW5pdGl6ZURhdGFDb25maWd1cmUiLCJhbGxvd1RhcmdldEF0dHIiLCJub2RlIiwicmVtb3ZlQXR0cmlidXRlIiwiaGFzQXR0cmlidXRlIiwicHJvY2Vzc0ZhY3RvcnkiLCJzYW5pdGl6ZVN0ciIsInByb2Nlc3MiLCJjYWxsRGlzYWJsZSIsImlmcmFtZXNPdmVycmlkZSIsImFuY2hvcnNPdmVycmlkZSIsImVmZmVjdGl2ZU1vZGUiLCJzYW5pdGl6ZURhdGFGb3JjZSIsImVmZmVjdGl2ZSIsIlVSTF9BVFRSUyIsInNhbml0aXplQXR0cmlidXRlIiwiYWxsb3dlZCIsInRhZyIsInN0YXJ0c1dpdGgiLCJhcHBseUVsZW1lbnRIYXJkZW5pbmciLCJzYW5pdGl6ZUV2ZW50VGFyZ2V0IiwiVU5TQUZFX1JFIiwiY2xlYW4iLCJpc0NvbnRlbnRFZGl0YWJsZSIsImlubmVySFRNTCIsIl9zYW5pdGl6ZUhUTUwiLCJzYW5pdGl6ZUhUTUxDb25maWd1cmUiLCJpc1JpY2h0ZXh0IiwiZG9tUHVyaWZ5Q29uZmlnIiwiUkVUVVJOX1RSVVNURURfVFlQRSIsInNhbml0aXplV2l0aFBvbGljeSIsInRydXN0ZWRUeXBlcyIsImNyZWF0ZVBvbGljeSIsImNyZWF0ZUhUTUwiLCJ0b0VzY2FwZSIsImVyciIsIl9jb25maWciLCJfY2hhbm5lbHNNYXAiLCJfaW5pdGlhbGl6ZWQiLCJfY21zUmVoeWRyYXRvciIsIl9jbXNMaW5lYWdlV2FybmVyIiwiX2RlYnVnIiwiX2VuYWJsZUNNU1Byb3hpZXMiLCJfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUiLCJfbmF2TGlua3MiLCJfSU1HX1BBVEgiLCJfZG9Ob3RUcmFja0NoYW5uZWxzQXJyIiwiX3Byb3hpZXNNYXAiLCJfc3B5bmVQbHVnaW5NZXRob2RzIiwiY29uZm9ybVJvdXRlT2JqZWN0Iiwic2V0Q2hhbm5lbHNNYXAiLCJzZXRIZWFkQmFzZUhyZWYiLCJiYXNlVGFnIiwiY3JlYXRlRWxlbWVudCIsImFkZDQwNFByb3BzIiwic2V0UHJvcCIsImlzVGVtcCIsImdldFByb3AiLCJ0ZW1wVmFsIiwiY3JlYXRlVGVtcFByb3AiLCJzZXRDaGFubmVsQ29uZmlnIiwiY2hhbm5lbENvbmZpZyIsImFkZFBsdWdpbk1ldGhvZHMiLCJwbHVnaW5NZXRob2RzT2JqIiwiYWRkTWV0aG9kcyIsImdldFVudHJhY2tlZENoYW5uZWxzTGlzdCIsInJlZ2lzdGVyUHJveHlSZXZpdmVyIiwicmVnaXN0ZXJDbXNSZWh5ZHJhdG9yIiwicmVoeWRyYXRlQ21zRGF0YSIsInJlZ2lzdGVyQ21zTGluZWFnZVdhcm5lciIsIndhcm5VbnByb3hpZWRDbXNEYXRhIiwiZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lIiwiZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUiLCJsaW5rc0RhdGEiLCJlbmFibGVDTVNQcm94aWVzIiwiZ2V0SHJlZkZyb21EYXRhIiwicm91dGVQcm9wcyIsInNldENNU1Byb3h5TWV0aG9kIiwiZm9ybWF0VGVtcGxhdGVGb3JQcm94eURhdGEiLCJ0ZW1wR2V0Q2hhbm5lbHNJbnN0YW5jZSIsInRlbXBHZXRDb25maWciLCJfcGx1Z2luTWV0aG9kc09iaiIsImNyZWF0ZSIsIlNweW5lUGx1Z2luc01ldGhvZHMiLCJmb28iLCJhZGRNZXRob2QiLCJ3YXJuU3RyIiwibWV0aG9kc09iaiIsImtleVN0ciIsImNoZWNrSWZNZXRob2RFeGlzdHMiLCJTcHluZVRyYWl0IiwicGFyZW50Q29udGV4dCIsInByZWZpeCIsImF1dG9Jbml0IiwiYXV0b0JpbmRlciIsImFsbE1ldGhvZHNMaXN0IiwiaW5pdEF1dG9CaW5kZXIiLCJnZXRFbmhhbmNlck1ldGhvZHMiLCJjaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMiLCJpc0RlYnVnTW9kZSIsIm1hbGZvcm1lZE1ldGhvZHNBcnIiLCJ3YXJuaW5nU3RyIiwiYmluZFBhcmVudFZpZXdTdHJlYW0iLCJjb250ZXh0IiwiYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0iLCJpc1N0YXRpYyIsImNvbnN0cnVjdG9yVHlwZSIsImJpbmRTdGF0aWNNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtIiwiYmluZEN1cnJ5IiwiU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCIsImNoZWNrSWZQYXJhbVZhbHVlTWF0Y2hlc1JlZ2V4IiwicGFyYW1WYWx1ZSIsInJvdXRlT2JqIiwicmVqZWN0UGFyYW1LZXkiLCJyZWdleE1hdGNoU3RyIiwiY2hlY2tlciIsImFzc29jIiwiaGFzaCIsInNlYXJjaCIsInByb3BWYWwiLCJzbGFzaCIsInF1ZXJ5IiwiY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMiLCJyb3V0ZSIsInBhcmFtc0Zyb21Mb2MiLCJ1cmxBcnIiLCJsb29wVGhyb3VnaFBhcmFtIiwidXJsT2JqIiwia2V5d29yZCIsInBhcmFtVmFsRnJvbURhdGEiLCJwYXJhbVZhbFR5cGUiLCJpc09iamVjdCIsIm9iamVjdFBhcmFtRXhpc3RzIiwib2JqZWN0Q29udGFpbnNSb3V0ZSIsIm5ld09iaiIsImNyZWF0ZVNsYXNoU3RyaW5nIiwiYXJyQ2xlYXIiLCJub3RVbmRlZmluZWQiLCJzdHJpcFJlZ2V4IiwiZmxhdHRlbiIsImpvaW5lciIsImNyZWF0ZVF1ZXJ5U3RyaW5nIiwiY3JlYXRlUGFpciIsImNoZWNrUGFpciIsIm1hcEFycmF5T2ZQYWlycyIsImNoZWNrSWZTdHJJc0VtcHR5IiwiY3JlYXRlUXMiLCJjaGVja1BheWxvYWRGb3JSZWdleE92ZXJyaWRlcyIsInVybHNBcnIiLCJwYXJzZVN0cmluZyIsImdldE92ZXJyaWRlVmFsIiwib3ZlcnJpZGVWYWwiLCJjaGVja0ZvclJvdXRlVmFsV2l0aE11bHRpcGxlVmFscyIsImlucHV0IiwiZ2V0U3RyaW5nQmVmb3JlUGlwZSIsImNoZWNrRm9yUm91dGVWYWxzUGFydE1hdGNoIiwidXBkYXRlZE9iaiIsImdsb2JQYXR0ZXJuIiwicGF0dGVybiIsImVzY2FwZWRQYXR0ZXJuIiwiZ2xvYlBhdHRlcm5NYXRjaCIsInIiLCJsb2NTdHIiLCJ1cmxUeXBlIiwibG9jYXRpb25TdHIiLCJwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uIiwiZmluZEluZGV4T2ZNYXRjaGVkU3RyaW5nT3JSZWdleCIsIm1haW5TdHIiLCJpczQwNCIsImNoZWNrRm9yRW1wdHkiLCJjaGVja0ZvckVpdGhlclN0ck9yUmVNYXRjaCIsImZpbmRMYXN0SW5kZXgiLCJyZSIsImZpbmRNYXRjaEluZGV4IiwiY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbSIsInJlZ2V4VG9rZW5zIiwiZ2V0VmFsQ29tcGFyZUFyciIsInBhcmFtSW5kZXgiLCJwYXJhbVN0ciIsInBhcmFtIiwiaW52ZXJ0ZWRPYmoiLCJpbnZlcnQiLCJwYXJhbUludmVydGVkIiwiZ2V0UGFyYW1JbnZlcnRlZCIsImNyZWF0ZUFyckZyb21TbGFzaFN0ciIsImNvbnZlcnRTbGFzaFJvdXRlU3RyVG9QYXJhbXNPYmoiLCJ0b3BMZXZlbFJvdXRlIiwidmFsdWVzQXJyIiwicm91dGVkVmFsdWVzQXJyIiwibGF0ZXN0T2JqIiwidG90YWwiLCJjdXJyZW50VmFsdWUiLCJyb3V0ZVZhbHVlU3RyIiwiaXNFbXB0eU9yTmlsIiwicHJldlBhdGhOb3RFcUN1cnJlbnRQYXRoIiwic3RyUGF0aCIsIm9iamVjdEZyb21TdHIiLCJvYmplY3RGcm9tUm91dGVQYXJhbSIsInppcE9iaiIsImdldExhc3RBcnJWYWwiLCJhIiwiY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyIiwiY29udmVydFF1ZXJ5U3RyVG9QYXJhbXMiLCJzdHJBcnIiLCJjb252ZXJ0VG9QYXJhbXMiLCJTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIiwic3Vic2NyaWJlRm4iLCJmcm9tRXZlbnRQYXR0ZXJuIiwiaGFuZGxlciIsIm9ucG9wc3RhdGUiLCJwaWNrVmFsdWVzIiwib2JqMSIsIm9iajIiLCJjcmVhdGVQcmVkIiwiZ2V0UHJvcHNTdGF0ZSIsInNhbWUiLCJwcmV2aW91c0V4aXN0cyIsIm5leHRFeGlzdHMiLCJjaGFuZ2VkIiwiYWRkZWQiLCJyZW1vdmVkIiwicGF0aHNDaGFuZ2VkIiwicGF0aHNBZGRlZCIsInBhdGhzUmVtb3ZlZCIsImdldENvbXBhcmVyIiwiZ2V0Um91dGVBcnJEYXRhIiwicm91dGVBcnIiLCJnbyIsIm9ial8iLCJrXyIsInZfIiwiYWRkUm91dGVEYXRhc2V0cyIsImNoYW5uZWxSb3V0ZU9iaiIsImdldEhSRUYiLCJpc1ZhbGlkU3RyUkUiLCJjcmVhdGVJbml0aWFsVmFsRm4iLCJhY2NNYWluIiwicm91dGVQYXRoT2JqIiwib2JqQWNjIiwiYXJyUGFpciIsImdldExpbmtUZXh0IiwiY3JlYXRlVGl0bGUiLCJzdWJSb3V0ZU5hbWUiLCJvQmFzZSIsIm5hdkxldmVsIiwidGl0bGUiLCJyZWR1Y2VkQXJyIiwicmVtb3ZlVW5kZWZpbmVkIiwicm91dGVOYW1lc0FyciIsImRhdGFzZXRzQXJyIiwiZXhjbHVkZSIsImdldE1haW5LZXlzIiwiZ2V0TmF2UHJvcHMiLCJjaGFubmVsc1JvdXRlUGF0aCIsInBhcnNlUm91dGVQYXRoIiwiY29uZmlnTWFwcGVyRm4iLCJvYmo0MDQiLCJpc1JvdXRlUGF0aCIsImV4dHJhUm91dGVEYXRhIiwiU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3ciLCJldmVudE5hbWUiLCJhZGRFdmVudExpc3RlbmVyIiwicGFzc2l2ZSIsImNyZWF0ZU1lZGlhUXVlcnkiLCJtcSIsImNoZWNrSWZWYWxpZE1lZGlhUXVlcnkiLCJub1NwYWNlcyIsImlzVmFsaWRCb29sIiwibWVkaWEiLCJ3YXJuTXNnIiwibWFwS2V5IiwibWVkaWFRdWVyeU5hbWUiLCJrZXlGbiIsIm1lZGlhUXVlcnlIYW5kbGVyIiwicSIsImFkZEhhbmRsZXIiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUhhbmRsZXIiLCJvbmNoYW5nZSIsIm1lZGlhUXVlcmllc09iaiIsInNweW5lV2FybiIsImFyZ3MiLCJTUFlORV9TVVBQUkVTU19XQVJOSU5HUyIsInNldFNweW5lV2FybmluZ3NEaXNhYmxlZCIsImNyZWF0ZUZhZGVySW5saW5lVGV4dCIsImlzSW5Cb29sIiwic3RhcnRaZXJvQm9vbCIsImZhZGVpbiIsImN1cnJlbnRPcGFjaXR5IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm9wYWNpdHkiLCJpbmxpbmVDc3MiLCJmYWRlb3V0IiwiY2FsbGJhY2siLCJWaWV3U3RyZWFtT2JzZXJ2YWJsZSIsIm9ic2VydmFibGVTdHJlYW1zIiwiY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyIsImNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCIsImRpckludGVybmFsIiwiZGlyUGFyZW50IiwiZGlyQ2hpbGQiLCJQIiwiQyIsIlBDSSIsIkNJIiwiUEkiLCJQQyIsImFkZERlZmF1bHREaXIiLCJmbGlwIiwiZGVmYXVsdHMiLCJhZGREb3duSW50ZXJuYWxEaXIiLCJhZGRDaGlsZEFuZEludGVybmFsRGlyIiwibWFwVG9EZWZhdWx0RGlyIiwidmlld05hbWUiLCJmaWx0ZXJTdHJlYW1zIiwicHJvcFNhdGlzZmllcyIsImFyclR5cGUiLCJmaWx0ZXJQYXJlbnQiLCJmaWx0ZXJDaGlsZCIsImZpbHRlckludGVybmFsIiwiYWRkZnJvbSQiLCJyZWxTdHIiLCJmcm9tJCIsImFkZFBhcmVudGZyb20kIiwiYWRkSW50ZXJuYWxmcm9tJCIsImFkZENoaWxkZnJvbSQiLCJyYXckIiwidG9JbnRlcm5hbCQiLCJ0b1BhcmVudCQiLCJ0b0NoaWxkJCIsInN0cmVhbU9iaiIsInBhcmVudCIsImludGVybmFsIiwiY2hpbGQiLCJjb21wbGV0ZUFsbCIsImNvbXBsZXRlIiwiaXNTdG9wcGVkIiwiY29tcGxldGVTdHJlYW0iLCJEb21FbGVtZW50VGVtcGxhdGUiLCJ0ZW1wbGF0ZSIsImZvcm1hdFRlbXBsYXRlIiwiaXNQcm94eURhdGEiLCJfX2Ntc19faXNQcm94eSIsInJlaHlkcmF0ZWQiLCJ0ZW1wbGF0ZUJpbmRzUHJveGllZENoaWxkIiwibm9ybWFsaXplVHJpcGxlQnJhY2tldHMiLCJwcm94eUZvcm1hdHRlciIsInNweW5lRGF0YSIsImNoZWNrRm9yQXJyYXlEYXRhIiwidGVtcGxhdGVEYXRhIiwiY3VycmVudE91dGVyTG9vcERhdGEiLCJnZXRTdHJpbmdBcnJheSIsInN0ck1hdGNoZXMiLCJmaW5kVG1wbExvb3BzUkUiLCJwYXJzZVRtcGxMb29wc1JFIiwicGFyc2VUbXBsTG9vcEZuIiwicGFyc2VUaGVUbXBsTG9vcCIsImZpbmRUbXBsTG9vcHNQcmVkIiwiY2hlY2tGb3JNYXRjaGVzIiwiYWRkUGFyYW1zIiwiZmluYWxBcnIiLCJpc1ByaW1pdGl2ZVRhZyIsImhhc1Byb3hpZWRDaGlsZCIsImdldE5lc3RlZERhdGFSZWR1Y2VyIiwibmVzdGVkRGF0YSIsImVtcHR5UkUiLCJ3aXRob3V0TGVha3MiLCJfIiwiaW5uZXJMb29wUkUiLCJzd2FwUGFyYW1zRm9yVGFnc1JFIiwiaGFzTG9vcCIsInJlbW92ZVRoaXMiLCJzdHJpcEluZXJ0Q21zSXRlbXMiLCJyZW5kZXJEb2NGcmFnIiwicmVwbGFjZUltZ1BhdGgiLCJjcmVhdGVSYW5nZSIsImNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCIsInJlbmRlclRvU3RyaW5nIiwiZ2V0VGVtcGxhdGVTdHJpbmciLCJnZXREYXRhVmFsRnJvbVBhdGhTdHIiLCJwYXRoU3RyIiwiZGF0YUZpbGUiLCJ0ZW1wbGF0ZVN0ciIsInJlcGxhY2VBbGwiLCJwcm9jZXNzSW5uZXJMb29wIiwiYm9keVN0ciIsInBhcmVudEl0ZW0iLCJpbm5lclJFIiwiZnVsbE1hdGNoIiwib3BlblRhZyIsImlubmVyS2V5IiwiaW5uZXJCb2R5IiwiaW5uZXJEYXRhIiwiaW5uZXJBcnIiLCJwcmV2aW91c091dGVyIiwicmVuZGVyZWQiLCJpbm5lckl0ZW0iLCJpbm5lcklkeCIsInN1YnN0aXR1dGVGb3JJdGVtIiwiaW5kZXgiLCJlc2NhcGVkIiwiY3R4IiwiYnVpbGRTdHJpbmdJdGVtQ29udGV4dCIsInN1YnN0aXR1dGVPYmplY3QiLCJidWlsZEl0ZW1Db250ZXh0Iiwic3B5bmVMb29wS2V5IiwibG9vcEluZGV4IiwibG9vcE51bSIsIm91dGVyRGF0YSIsIl9fY21zX19kYXRhSWQiLCJrZXlJZFN0ciIsIm9yaWdLZXkiLCJyZURvdCIsInBvc2l0aW9uYWwiLCJvdXRlckJvZHkiLCJlbERhdGEiLCJlbEFyciIsImJvZHlIYXNJbm5lckxvb3AiLCJEb21FbGVtZW50IiwiYXR0cmlidXRlcyIsImdldERvbUF0dHJpYnV0ZXMiLCJhdHRycyIsInVwZGF0ZUF0dHJzIiwiZnJhZ21lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50Iiwic2V0RWxBdHRycyIsInBhcmFtcyIsInRoZU1hcCIsImFkZFRlbXBsYXRlIiwiZnJhZyIsImFkZFRtcGwiLCJhZGRDb250ZW50IiwidHh0IiwiY3JlYXRlVGV4dE5vZGUiLCJleGVjdXRlIiwicmVuZGVyVG9IVE1MU3RyaW5nIiwib3V0ZXJIVE1MIiwicmV0dXJuSWZEZWZpbmVkIiwidXBkYXRlcHJvcHMiLCJ1cGRhdGVwcm9wc0FuZFJ1biIsInVubW91bnQiLCJyZW1vdmUiLCJ1cGRhdGVUYWciLCJ1cGRhdGVBdHRyaWJ1dGVzIiwidXBkYXRlVGVtcGxhdGUiLCJ1cGRhdGVEYXRhIiwiYWRkVGFnQW5kUmVuZGVyIiwiYWRkQXR0cnNpYnV0ZXNBbmRSZW5kZXIiLCJhZGRUZW1wbGF0ZUFuZFJlbmRlciIsImFkZERhdGFBbmRSZW5kZXIiLCJjb3JlTWl4aW5zIiwiYXR0cmlidXRlc0FycmF5IiwiaXNEZXZNb2RlIiwiVmlld1N0cmVhbUJyb2FkY2FzdGVyIiwiYnJvYWRjYXN0Rm4iLCJicm9hZGNhc3RlciIsImFkZERibENsaWNrRXZ0IiwidHlwZU92ZXJSaWRlIiwiYnJvYWRjYXN0IiwiY2hhbm5lbFBheWxvYWRzIiwiVUkiLCJsb2NhbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJjaGVja1BhcmVudEVscyIsImVsU2VsZWN0ZWQiLCJwYXJlbnRFbGVtZW50IiwicGx1Y2tFbEZyb21QYXJlbnQiLCJpc0xvY2FsRXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsImNoIiwiZW5kUHJldmVudERlZmF1bHQiLCJzcmNFdmVudCIsImFyckZuIiwic3RyZWFtTWl4aW5zIiwiVmlld1N0cmVhbUVsZW1lbnQiLCJzaW5rJCIsInZpZXdQcm9wcyIsInZzTmFtZSIsIl9zdGF0ZSIsImV4dGVuZGVkSGFzaE1ldGhvZHMiLCJhZGRBY3Rpb25MaXN0ZW5lcnMiLCJmdW5jU3RyIiwiaGFzaE1ldGhvZHMiLCJzZXRIYXNoTWV0aG9kcyIsIm9uT2JzU2lua1N1YnNjcmliZSIsIiRkaXJzIiwic291cmNlU3RyZWFtcyIsIl9zb3VyY2UkIiwiZXh0ZW5kZWRIYXNoTWV0aG9kc09iaiIsImRlZmF1bHRIYXNoTWV0aG9kcyIsIlZTX0RFVFJJVFVTX0NPTExFQ1QiLCJvbkdhcmJhZ2VDb2xsZWN0IiwiUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QiLCJvblJlYWR5Rm9yR0MiLCJFWFRJUlBBVEUiLCJvbkRpc3Bvc2UiLCJWU19TUEFXTiIsIlZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fUEFSRU5UIiwib25SZW5kZXJBbmRBdHRhY2hUb1BhcmVudCIsIlZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fRE9NIiwib25SZW5kZXJBbmRBdHRhY2hUb0RvbSIsIkFUVEFDSF9DSElMRF9UT19TRUxGIiwib25BdHRhY2hDaGlsZFRvU2VsZiIsImNyZWF0ZURvbUl0ZW0iLCJvbkRpc3Bvc2VDb21wbGV0ZWQiLCJhbmltYXRlSW5Ud2VlbiIsImFuaW1hdGVPdXRUd2VlbiIsInNldEFuaW1hdGVJbiIsImFuaW1hdGVJbiIsImRvbUl0ZW0iLCJhbmltYXRlSW5UaW1lIiwiZGlzcG9zZU1ldGhvZCIsImdjRGF0YSIsImZhZGVPdXRPYnMiLCJiaW5kQ2FsbGJhY2siLCJhbmltYXRlT3V0VGltZSIsIm9uRmFkZW91dENvbXBsZXRlZCIsImFuaW1hdGVPdXQiLCJyZW1vdmVTdHJlYW0iLCJnZXRTb3VyY2VTdHJlYW0iLCJjb21iaW5lRG9tSXRlbXMiLCJjb250YWluZXIiLCJhZnRlciIsImF0dGFjaFR5cGUiLCJpbnNlcnRCZWZvcmUiLCJmaXJzdENoaWxkIiwiY2hpbGRSZW5kZXJEYXRhIiwicmVuZGVyRG9tSXRlbSIsImdldEVsIiwiSSIsImV4dGVuZGVkTWV0aG9kcyIsImF0dGFjaERhdGEiLCJkZWZhdWx0VG9GbiIsInNlbmREYXRhIiwiVmlld1N0cmVhbVBheWxvYWQiLCJzZW5kVG9EaXJlY3RvclN0cmVhbSIsImRpcmVjdG9yU3RyZWFtJCIsImZyb3plblBheWxvYWQiLCJnZXRFbE9yTGlzdCIsInZlcmJvc2VCb29sIiwibGlzdCIsImdldE5vZGVMaXN0QXJyYXkiLCJ0ZXN0U2VsZWN0b3JzIiwiaXNWYWxpZFNlbGVjdG9yIiwiaXNWYWxpZFNlbGVjdG9yQm9vbCIsImlzUGFyZW50IiwicmV0dXJuU2VsZWN0b3JJZlZhbGlkIiwic2V0SW5saW5lQ3NzIiwiVmlld1N0cmVhbVNlbGVjdG9yIiwiZ2VuZXJhdGVTcHluZVNlbGVjdG9ySWQiLCJhZGRDbGFzcyIsImNsYXNzTGlzdCIsInJlbW92ZUNsYXNzIiwic2V0Q2xhc3MiLCJyZW1vdmVDbGFzc1N0ckFyciIsImNsYXNzTmFtZSIsImNsYXNzU3RyQXJyIiwidG9nZ2xlQ2xhc3MiLCJjb250YWlucyIsInRvZ2dsZSIsImh0bWxFbGVtZW50IiwiYWRkQW5pbUNsYXNzIiwic2V0QWN0aXZlSXRlbSIsImVsU2VsIiwiY3VycmVudEVsIiwibm9kZUNoZWNrIiwibWF0Y2hpbmdFbCIsImdldEVsc0FycmF5IiwiVmlld1N0cmVhbSIsInZzbnVtIiwiX3Bvc3RSZW5kZXJDYWxsZWQiLCJzZW5kTGlmZWN5bGVFdmVudHMiLCJoYXNoSWQiLCJpZCQiLCJ2aWV3Q2xhc3MiLCJleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcyIsImFkZERlZmF1bHREaXJlY3Rpb24iLCJzZW5kTGlmZWN5Y2xlTWV0aG9kIiwic2VuZExpZmVjeWNsZU1ldGhvZEFjdGl2ZSIsInNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZSIsImF0dHJpYnV0ZXNBcnIiLCJkb21BdHRyaWJ1dGVzIiwibG9hZEFsbE1ldGhvZHMiLCJlbElzQWxyZWFkeVJlbmRlcmVkQm9vbCIsImVsQWxyZWFkeUV4aXN0c0ZuIiwiVmlld0NsYXNzIiwiX3Jhd1NvdXJjZSQiLCJzZW5kRXZlbnRzRG93blN0cmVhbSIsInNlbmRFdmVudHNEb3duU3RyZWFtRm4iLCJpbml0Vmlld1N0cmVhbSIsImFkZGVkQ2hhbm5lbHMiLCJjaGVja0lmRWxlbWVudEFscmVhZHlFeGlzdHMiLCJzb3VyY2UkIiwiY2hlY2tJZkFjdGlvbnNBcmVSZWdpc3RlcmVkIiwiYWN0aW9uc0FyciIsImNoZWNrRm9yTWF0Y2giLCJzdHJNYXRjaCIsImZpbmRJbmRleCIsImdldEFsbEFjdGlvbnNBcnIiLCJjaGFubmVsU3ludGF4IiwiZ2V0QWxsQWN0aW9ucyIsImlzVmFsaWROZXN0ZWRBcnIiLCJpc1RydWUiLCJhbGxJc1RydWUiLCJpc1ZhbGlkQXJyIiwibWFwRXZlbnRzQXJyRm4iLCJ1cGRhdGVQcm9wc1RvTWF0Y2hFbCIsImdldFRhZ05hbWUiLCJ0b0xvd2VyIiwicG9zdFJlbmRlciIsImNoYW5uZWxGbiIsIm9uQ2hhbm5lbE1ldGhvZENhbGwiLCJhY3Rpb25GaWx0ZXIiLCJoYXNoU291cmNlTWV0aG9kcyIsInNldFNvdXJjZUhhc2hNZXRob2RzIiwiZGVsZXRlZCIsImZpbHRlclBheWxvYWQiLCJydW5GdW5jIiwiaGFzaFNvdXJjZUtleXMiLCJFWFRJUlBBVElORyIsImNoZWNrUGFyZW50RGlzcG9zZSIsIlZTX1NQQVdORUQiLCJvblZTUmVuZGVyZWQiLCJWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19ET00iLCJWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQiLCJvblJlYWR5VG9HQyIsIlZTX05VTExJVFkiLCJvbk1hcFZpZXdTb3VyY2UiLCJ0YWtlV2hpbGUiLCJub3RHQ1NUQVRFIiwiaW5pdEF1dG9NZXJnZVNvdXJjZVN0cmVhbXMiLCJ1cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24iLCJlcUdDU1RBVEUiLCJub3RDT01QTEVURUQiLCJub3RHQ0NPTVBMRVRFIiwidGVzdFZhbCIsImFkZFBhcmVudFN0cmVhbSIsInBhcmVudCQiLCJyZW5kZXJBbmRBdHRhY2hUb1BhcmVudCIsImFkZENoaWxkU3RyZWFtIiwiY2hpbGQkIiwidHJhY2VyIiwiZmluYWxpemUiLCJvbkNoaWxkQ29tcGxldGVkIiwib25DaGlsZERpc3Bvc2VkIiwiY2hpbGRDb21wbGV0ZWREYXRhIiwieCIsImZpbmFsRGVzdCIsInkiLCJmaW5kTmFtZSIsIm9uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dCIsIm9uU3Vic2NyaWJlVG9Tb3VyY2VzRXJyb3IiLCJvblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlIiwiZWwkIiwidWJlclNvdXJjZSQiLCJhdXRvU3Vic2NyaWJlciQiLCJkZWNyZW1lbnRPbk9ic2VydmFibGVDbG9zZWQiLCJvYnNDb3VudCIsImF1dG9NZXJnZVN1YmplY3QkIiwib2JzRGF0YSIsImJyYW5jaE9ic2VydmFibGUkIiwiYXV0b0Nsb3Nlc0Jvb2wiLCJyZWwiLCJzZW5kRXh0ZW5kZWRTdHJlYW1zIiwiaGFzaEFjdGlvblN0ciIsIm9wZW5TcGlnb3QiLCJyZW5kZXJWaWV3IiwicmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tIiwib25CZWZvcmVEaXNwb3NlIiwibXMiLCJtZXRob2RGbiIsIm9uQ2hpbGREaXNwb3NlIiwib25QYXJlbnREaXNwb3NpbmciLCJpc0ludGVybmFsIiwic2V0QXR0YWNoRGF0YSIsImNoZWNrUXVlcnkiLCJnZXRQYXJlbnRFbHMiLCJnZXRFbGVtIiwic2V0QXR0YWNoUGFyZW50RGF0YSIsImxldmVsIiwiZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCIsImNoaWxkVmlldyIsImFwcGVuZFRvRG9tQWZ0ZXIiLCJwcmVwZW5kVG9Eb20iLCJhcHBlbmRWaWV3IiwiYXBwZW5kVmlld0FmdGVyIiwiYXBwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlldyIsIl9wb3N0UmVuZGVyZWRDYWxsZWQiLCJiZWZvcmVBZnRlclJlbmRlciIsImFmdGVyUmVuZGVyIiwib25BbmltRnJhbWVBZnRlclJlbmRlcmVkIiwiYnJvYWRjYXN0RXZlbnRzIiwiaW5pdGlhbGl6ZUNoYW5uZWxzIiwidmlld3NTdHJlYW1Ccm9hZGNhc3RlciIsInB1bGxBY3Rpb25zRnJvbUxpc3QiLCJuZXN0ZWRBY3Rpb25zQXJyIiwiY2hlY2tGb3JFeGlzdGluZ01ldGhvZCIsIkZ1bmN0aW9uIiwiZGVsYXlGb3JQcm94eUNoYW5uZWxSZXNldHMiLCJzZXREYXRhVlNJRCIsImRvd25TdHJlYW0iLCJza2lwRmlyc3QiLCJhZGRDaGFubmVsIiwic2VuZERvd25TdHJlYW0iLCJkaXJlY3Rpb25BcnIiLCJpc0xvY2FsRXZlbnRDaGVjayIsImNpZENoZWNrIiwicGlwZUFyciIsInVuc2hpZnQiLCJza2lwIiwiY2hhbm5lbCQiLCJjaGVja0lmQ2hhbm5lbEV4aXN0cyIsImNoYW5uZWxFeGlzdHMiLCJkZWZhdWx0VG9BY3Rpb24iLCJnZXRBY3Rpb25GbiIsIkNIQU5ORUxfUk9VVEUiLCJpc0Rpc3Bvc2VkIiwiY3JlYXRlQWN0aW9uRmlsdGVyIiwic2VsZWN0b3JzIiwiaXRlbUVsIiwidGhpc0VsIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsIm4iLCJnZXR0ZXIiLCJfX2VzTW9kdWxlIiwiZGVmaW5pdGlvbiIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIl0sInNvdXJjZVJvb3QiOiIifQ==
|