@data-client/core 0.4.0 → 0.4.1

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/dist/index.js CHANGED
@@ -480,10 +480,11 @@ class Controller {
480
480
  */
481
481
  this.fetchIfStale = (endpoint, ...args) => {
482
482
  const {
483
+ data,
483
484
  expiresAt,
484
485
  expiryStatus
485
486
  } = this.getResponse(endpoint, ...args, this.getState());
486
- if (expiryStatus !== normalizr.ExpiryStatus.Invalid && Date.now() <= expiresAt) return;
487
+ if (expiryStatus !== normalizr.ExpiryStatus.Invalid && Date.now() <= expiresAt) return data;
487
488
  return this.fetch(endpoint, ...args);
488
489
  };
489
490
  /**
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@data-client/normalizr")):"function"==typeof define&&define.amd?define(["exports","@data-client/normalizr"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).dataClientCore={},e.normalizr)}(this,(function(e,t){"use strict";var s="function"==typeof requestIdleCallback?requestIdleCallback:e=>setTimeout(e,0);const i="rest-hooks/fetch",r="rest-hooks/receive",n=r,o="rest-hooks/optimistic",a="rest-hooks/reset",l="rest-hooks/subscribe",c="rest-hook/unsubscribe",h="rest-hooks/invalidate",d="rest-hooks/invalidateall",u="rest-hooks/expireall",p="rest-hooks/gc";var f=Object.freeze({__proto__:null,FETCH_TYPE:i,RECEIVE_TYPE:r,SET_TYPE:n,OPTIMISTIC_TYPE:o,RESET_TYPE:a,SUBSCRIBE_TYPE:l,UNSUBSCRIBE_TYPE:c,INVALIDATE_TYPE:h,INVALIDATEALL_TYPE:d,EXPIREALL_TYPE:u,GC_TYPE:p});function m(e,t){let s;return t.endpoint.getOptimisticResponse&&t.endpoint.sideEffect?(s=function(e,{args:t,fetchedAt:s}){var i;const r=null!=(i=e.dataExpiryLength)?i:6e4,n=Date.now(),a={args:t,fetchedAt:s,date:n,expiresAt:n+r,key:e.key(...t)};return{type:o,endpoint:e,meta:a}}(t.endpoint,{args:t.meta.args,fetchedAt:t.meta.createdAt}),Object.assign({},e,{optimistic:[...e.optimistic,s]})):e}function y(e,t,s){return"AbortError"===s.name?Object.assign({},e,{optimistic:g(e,t)}):Object.assign({},e,{meta:Object.assign({},e.meta,{[t.meta.key]:{date:t.meta.date,error:s,expiresAt:t.meta.expiresAt,errorPolicy:null==t.endpoint.errorPolicy?void 0:t.endpoint.errorPolicy(s)}}),optimistic:g(e,t)})}function g(e,t){return e.optimistic.filter((e=>e.meta.key!==t.meta.key||(e.type===o?e.meta.fetchedAt!==t.meta.fetchedAt:e.meta.date>t.meta.date)))}function v(e){return function(s,r){switch(s||(s=E),r.type){case p:return r.entities.forEach((([e,t])=>{var i,r;null==(i=s.entities[e])||delete i[t],null==(r=s.entityMeta[e])||delete r[t]})),r.results.forEach((e=>{delete s.results[e],delete s.meta[e]})),s;case i:return m(s,r);case o:case n:return function(e,s,i){if(s.error)return y(e,s,s.payload);try{var r;let a;if(s.type===o){if(!s.endpoint.getOptimisticResponse)return e;try{a=s.endpoint.getOptimisticResponse.call(s.endpoint,i.snapshot(e,s.meta.fetchedAt),...s.meta.args)}catch(t){var n;if("AbortOptimistic"===(null==(n=t.constructor)?void 0:n.name))return e;throw t}}else a=s.payload;const{result:l,entities:c,indexes:h,entityMeta:d}=t.normalize(a,s.endpoint.schema,s.meta.args,e.entities,e.indexes,e.entityMeta,s.meta),u=Object.assign({},e.results,{[s.meta.key]:l});try{if(s.endpoint.update){const e=s.endpoint.update(l,...s.meta.args);Object.keys(e).forEach((t=>{u[t]=e[t](u[t])}))}}catch(e){console.error(`The following error occured during Endpoint.update() for ${s.meta.key}`),console.error(e)}return{entities:c,indexes:h,results:u,entityMeta:d,meta:Object.assign({},e.meta,{[s.meta.key]:{date:s.meta.date,expiresAt:s.meta.expiresAt,prevExpiresAt:null==(r=e.meta[s.meta.key])?void 0:r.expiresAt}}),optimistic:g(e,s),lastReset:e.lastReset}}catch(t){return"object"==typeof t&&(t.message=`Error processing ${s.meta.key}\n\nFull Schema: ${JSON.stringify(s.endpoint.schema,void 0,2)}\n\nError:\n${t.message}`,"payload"in s&&(t.payload=s.payload),t.status=400),y(e,s,t)}}(s,r,e);case d:case h:return function(e,t){const s=Object.assign({},e.results),i=Object.assign({},e.meta),r=e=>{delete s[e];const t=Object.assign({},i[e],{expiresAt:0,invalidated:!0});delete t.error,i[e]=t};return t.type===h?r(t.meta.key):Object.keys(s).forEach((e=>{t.testKey(e)&&r(e)})),Object.assign({},e,{results:s,meta:i})}(s,r);case u:return function(e,t){const s=Object.assign({},e.meta);return Object.keys(s).forEach((e=>{t.testKey(e)&&(s[e]=Object.assign({},s[e],{expiresAt:1}))})),Object.assign({},e,{meta:s})}(s,r);case a:return Object.assign({},E,{lastReset:r.date});default:return s}}}const E={entities:{},indexes:{},results:{},meta:{},entityMeta:{},optimistic:[],lastReset:0};var b=Object.freeze({__proto__:null,inferResults:t.inferResults,DELETED:t.DELETED,INVALID:t.INVALID,RIC:s,initialState:E});function L(e,{args:t}){const s=e.key(...t);let r=0,n=0;const o=new Promise(((e,t)=>{[r,n]=[e,t]})),a={args:t,key:s,throttle:!e.sideEffect,resolve:r,reject:n,promise:o,createdAt:Date.now(),nm:!1};return{type:i,payload:()=>e(...t),meta:a,endpoint:e}}function O(e,{args:t,fetchedAt:s,response:i,error:r=!1}){var o,a;const l=r?null!=(o=e.errorExpiryLength)?o:1e3:null!=(a=e.dataExpiryLength)?a:6e4,c=Date.now(),h={args:t,fetchedAt:null!=s?s:c,date:c,expiresAt:c+l,key:e.key(...t)},d={type:n,payload:i,endpoint:e,meta:h};return r&&(d.error=!0),d}function I(e,t){return e.meta[t]}const k=e=>{throw new Error("Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")},w=()=>E;class S{constructor({dispatch:e=k,getState:s=w,globalCache:i={entities:{},results:{}}}={}){this.fetch=(e,...s)=>{const i=L(e,{args:s});return this.dispatch(i),e.schema?i.meta.promise.then((i=>t.denormalize(i,e.schema,{},s))):i.meta.promise},this.fetchIfStale=(e,...s)=>{const{expiresAt:i,expiryStatus:r}=this.getResponse(e,...s,this.getState());if(!(r!==t.ExpiryStatus.Invalid&&Date.now()<=i))return this.fetch(e,...s)},this.invalidate=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:h,meta:{key:e.key(...t)}}}(e,{args:t})):Promise.resolve(),this.invalidateAll=e=>this.dispatch({type:d,testKey:t=>e.testKey(t)}),this.expireAll=e=>this.dispatch({type:u,testKey:t=>e.testKey(t)}),this.resetEntireStore=()=>this.dispatch({type:a,date:Date.now()}),this.setResponse=(e,...t)=>{const s=t[t.length-1],i=O(e,{args:t.slice(0,t.length-1),response:s});return this.dispatch(i)},this.receive=(e,...t)=>this.setResponse(e,...t),this.setError=(e,...t)=>{const s=t[t.length-1],i=O(e,{args:t.slice(0,t.length-1),response:s,error:!0});return this.dispatch(i)},this.receiveError=(e,...t)=>this.setError(e,...t),this.resolve=(e,t)=>this.dispatch(O(e,t)),this.subscribe=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:l,endpoint:e,meta:{args:t,key:e.key(...t)}}}(e,{args:t})):Promise.resolve(),this.unsubscribe=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:c,endpoint:e,meta:{args:t,key:e.key(...t)}}}(e,{args:t})):Promise.resolve(),this.snapshot=(e,t)=>new x(this,e,t),this.getError=(e,...t)=>{if(null===t[0])return;const s=t[t.length-1],i=t.slice(0,t.length-1),r=e.key(...i),n=I(s,r);return void 0===s.results[r]||"soft"!==(null==n?void 0:n.errorPolicy)?null==n?void 0:n.error:void 0},this.getResponse=(e,...s)=>{const i=s[s.length-1],r=s.slice(0,s.length-1),n=1!==r.length||null!==r[0],o=n?e.key(...r):"",a=n?i.results[o]:void 0,l=e.schema,c=I(i,o);let h,d=null==c?void 0:c.expiresAt,u=!1;if(void 0===a&&void 0!==e.schema?(h=t.inferResults(e.schema,r,i.indexes,i.entities),u=!t.validateInference(h),!d&&u&&(d=1)):h=a,!n)return{data:h,expiryStatus:t.ExpiryStatus.Valid,expiresAt:1/0};if(!e.schema||!A(e.schema))return{data:h,expiryStatus:null!=c&&c.invalidated?t.ExpiryStatus.Invalid:a&&!e.invalidIfStale?t.ExpiryStatus.Valid:t.ExpiryStatus.InvalidIfStale,expiresAt:d||0};this.globalCache.results[o]||(this.globalCache.results[o]=new t.WeakEntityMap);const{data:p,paths:f}=t.denormalizeCached(h,l,i.entities,this.globalCache.entities,this.globalCache.results[o],r),m="symbol"==typeof p;d||(d=function(e,t){let s=1/0;for(const{pk:n,key:o}of e){var i,r;const e=null==(i=t[o])||null==(r=i[n])?void 0:r.expiresAt;e<s&&(s=e)}return s}(f,i.entityMeta));return{data:p,expiryStatus:null!=c&&c.invalidated||m&&(null==c||!c.error)?t.ExpiryStatus.Invalid:m||e.invalidIfStale||u?t.ExpiryStatus.InvalidIfStale:t.ExpiryStatus.Valid,expiresAt:d}},this.dispatch=e,this.getState=s,this.globalCache=i}}function A(e){if(t.isEntity(e))return!0;if(Array.isArray(e))return 0!==e.length&&A(e[0]);if(e&&("object"==typeof e||"function"==typeof e)){const t="schema"in e?e.schema:e;return"function"==typeof t?A(t):Object.values(t).some((e=>A(e)))}return!1}class x{constructor(e,t,s=0){this.state=void 0,this.controller=void 0,this.fetchedAt=void 0,this.getResponse=(e,...t)=>this.controller.getResponse(e,...t,this.state),this.getError=(e,...t)=>this.controller.getError(e,...t,this.state),this.state=t,this.controller=e,this.fetchedAt=s}}class T extends Error{constructor(){super("Aborted due to RESET"),this.name="ResetError"}}var j=Object.freeze({__proto__:null});class _{isOnline(){return void 0===navigator.onLine||navigator.onLine}addOnlineListener(e){addEventListener("online",e)}removeOnlineListener(e){removeEventListener("online",e)}addOfflineListener(e){addEventListener("offline",e)}removeOfflineListener(e){removeEventListener("offline",e)}}class R{isOnline(){return!0}addOnlineListener(){}removeOnlineListener(){}addOfflineListener(){}removeOfflineListener(){}}let P;P="undefined"!=typeof navigator&&"function"==typeof addEventListener?_:R;var q,D=P;const M="undefined"!=typeof Intl,C={name:`Rest Hooks: ${null==(q=globalThis.document)?void 0:q.title}`,autoPause:!0,serialize:{options:void 0,replacer:M?(e,t)=>"number"==typeof t&&"string"==typeof e&&isFinite(t)&&("date"===e||e.endsWith("At"))?Intl.DateTimeFormat("en-US",{hour:"numeric",minute:"numeric",second:"numeric",fractionalSecondDigits:3}).format(t):t:void 0}};Object.hasOwn=Object.hasOwn||function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},Object.defineProperty(e,"ExpiryStatus",{enumerable:!0,get:function(){return t.ExpiryStatus}}),e.Controller=S,e.DefaultConnectionListener=D,e.DevToolsManager=class{constructor(e,t){this.devTools="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__.connect(Object.assign({},C,{config:e})),this.devTools?this.middleware=e=>{const s=v(e);return i=>r=>{const n=i(r);return n.then((()=>{if(null!=t&&t(r))return;const i=e.getState();this.devTools.send(r,i.optimistic.reduce(s,i),void 0,"REST_HOOKS")})),n}}:this.middleware=()=>e=>t=>e(t)}init(e){this.devTools&&this.devTools.init(e)}cleanup(){}getMiddleware(){return this.middleware}},e.LogoutManager=class{constructor({handleLogout:e,shouldLogout:t}={}){e&&(this.handleLogout=e),t&&(this.shouldLogout=t),this.middleware=e=>t=>async s=>{await t(s),s.type===n&&s.error&&this.shouldLogout(s.payload)&&this.handleLogout(e)}}cleanup(){}getMiddleware(){return this.middleware}shouldLogout(e){return 401===e.status}handleLogout(e){e.resetEntireStore()}},e.NetworkManager=class{constructor(e=6e4,t=1e3){this.fetched=Object.create(null),this.resolvers={},this.rejectors={},this.fetchedAt={},this.controller=new S,this.dataExpiryLength=e,this.errorExpiryLength=t,this.middleware=e=>(this.controller=e,t=>s=>{switch(s.type){case i:return this.handleFetch(s),void 0!==s.endpoint.getOptimisticResponse&&s.endpoint.sideEffect?t(s):Promise.resolve();case n:return t(s).then((()=>{if(s.meta.key in this.fetched){var t;const i=null==(t=e.getState().meta[s.meta.key])?void 0:t.error;i?this.handleReceive(O(s.endpoint,{args:s.meta.args,response:i,fetchedAt:s.meta.fetchedAt,error:!0})):this.handleReceive(s)}}));case a:{const e=Object.assign({},this.rejectors);return this.clearAll(),t(s).then((()=>{for(const t in e)e[t](new T)}))}default:return t(s)}})}skipLogging(e){return e.type===i&&e.meta.key in this.fetched}init(){delete this.cleanupDate}cleanup(){this.cleanupDate=Date.now()}allSettled(){const e=Object.values(this.fetched);if(e.length)return Promise.allSettled(e)}clearAll(){for(const e in this.rejectors)this.clear(e)}clear(e){this.fetched[e].catch((()=>{})),delete this.resolvers[e],delete this.rejectors[e],delete this.fetched[e],delete this.fetchedAt[e]}getLastReset(){return this.cleanupDate?this.cleanupDate:this.controller.getState().lastReset}handleFetch(e){const t=e.payload,{key:s,throttle:i,resolve:r,reject:n,createdAt:o}=e.meta,a=()=>{let s=t();return i||(s=(e=>e.then((e=>(r(e),e))).catch((e=>{throw n(e),e})))(s)),s=s.then((t=>{let s=this.getLastReset();return o>=s&&this.controller.resolve(e.endpoint,{args:e.meta.args,response:t,fetchedAt:o}),t})).catch((t=>{const s=this.getLastReset();throw o>=s&&this.controller.resolve(e.endpoint,{args:e.meta.args,response:t,fetchedAt:o,error:!0}),t})),s};return i?this.throttle(s,a,o).then((e=>r(e))).catch((e=>n(e))):a().catch((()=>{}))}handleReceive(e){if(e.meta.key in this.fetched){let t;t=e.error?this.rejectors[e.meta.key]:this.resolvers[e.meta.key],t(e.payload),this.clear(e.meta.key)}}getMiddleware(){return this.middleware}throttle(e,t,i){const r=this.getLastReset();return e in this.fetched&&this.fetchedAt[e]>r||(this.fetched[e]=new Promise(((t,s)=>{this.resolvers[e]=t,this.rejectors[e]=s})),this.fetchedAt[e]=i,s((()=>{t().catch((()=>null))}),{timeout:500})),this.fetched[e]}},e.PollingSubscription=class{constructor(e,t,s){if(this.frequencyHistogram=new Map,this.offlineListener=()=>{this.cleanup(),this.connectionListener.addOnlineListener(this.onlineListener)},this.onlineListener=()=>{this.connectionListener.removeOnlineListener(this.onlineListener);const e=Date.now();this.startId=setTimeout((()=>{this.startId&&(delete this.startId,this.update(),this.run())}),Math.max(0,this.lastFetchTime()-e+this.frequency)),this.connectionListener.addOfflineListener(this.offlineListener)},void 0===e.endpoint.pollFrequency)throw new Error("frequency needed for polling subscription");this.endpoint=e.endpoint,this.frequency=e.endpoint.pollFrequency,this.args=e.meta.args,this.key=e.meta.key,this.frequencyHistogram.set(this.frequency,1),this.controller=t,this.connectionListener=s||new D,this.connectionListener.isOnline()?this.onlineListener():this.offlineListener()}add(e){void 0!==e&&(this.frequencyHistogram.has(e)?this.frequencyHistogram.set(e,this.frequencyHistogram.get(e)+1):(this.frequencyHistogram.set(e,1),e<this.frequency&&(this.frequency=e,this.run())))}remove(e){if(void 0===e)return!1;if(this.frequencyHistogram.has(e)&&(this.frequencyHistogram.set(e,this.frequencyHistogram.get(e)-1),this.frequencyHistogram.get(e)<1)){if(this.frequencyHistogram.delete(e),0===this.frequencyHistogram.size)return this.cleanup(),!0;e<=this.frequency&&(this.frequency=Math.min(...this.frequencyHistogram.keys()),this.run())}return!1}cleanup(){this.intervalId&&(clearInterval(this.intervalId),delete this.intervalId),this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.startId&&(clearTimeout(this.startId),delete this.startId),this.connectionListener.removeOnlineListener(this.onlineListener),this.connectionListener.removeOfflineListener(this.offlineListener)}update(){const e=this.endpoint,t=function(...t){return e.call(this,...t)};Object.assign(t,this.endpoint),t.dataExpiryLength=this.frequency/2,t.errorExpiryLength=this.frequency/10,t.errorPolicy=()=>"soft",t.key=()=>this.key,this.controller.fetch(t,...this.args).catch((()=>null))}run(){this.startId||(this.intervalId&&(this.lastIntervalId=this.intervalId),this.intervalId=setInterval((()=>{this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.intervalId&&this.update()}),this.frequency))}lastFetchTime(){var e,t;return null!=(e=null==(t=this.controller.getState().meta[this.key])?void 0:t.date)?e:0}},e.ResetError=T,e.SubscriptionManager=class{constructor(e){this.subscriptions={},this.controller=new S,this.Subscription=e,this.middleware=e=>(this.controller=e,e=>t=>{switch(t.type){case l:try{this.handleSubscribe(t)}catch(e){console.error(e)}return Promise.resolve();case c:return this.handleUnsubscribe(t),Promise.resolve();default:return e(t)}})}cleanup(){for(const e in this.subscriptions)this.subscriptions[e].cleanup()}handleSubscribe(e){const t=e.meta.key;if(t in this.subscriptions){const s=e.endpoint.pollFrequency;this.subscriptions[t].add(s)}else this.subscriptions[t]=new this.Subscription(e,this.controller)}handleUnsubscribe(e){const t=e.meta.key;if(t in this.subscriptions){const s=e.endpoint.pollFrequency;this.subscriptions[t].remove(s)&&delete this.subscriptions[t]}}getMiddleware(){return this.middleware}},e.__INTERNAL__=b,e.actionTypes=f,e.applyManager=function(e,t){return e.map((e=>{const s=e.getMiddleware();return({dispatch:e,getState:i})=>{t.dispatch=e,t.getState=i;const r=Object.create(t,{controller:{value:t}});return s(r)}}))},e.createFetch=L,e.createReceive=O,e.createReducer=v,e.initialState=E,e.newActions=j,Object.defineProperty(e,"__esModule",{value:!0})}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@data-client/normalizr")):"function"==typeof define&&define.amd?define(["exports","@data-client/normalizr"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).dataClientCore={},e.normalizr)}(this,(function(e,t){"use strict";var s="function"==typeof requestIdleCallback?requestIdleCallback:e=>setTimeout(e,0);const i="rest-hooks/fetch",r="rest-hooks/receive",n=r,o="rest-hooks/optimistic",a="rest-hooks/reset",l="rest-hooks/subscribe",c="rest-hook/unsubscribe",h="rest-hooks/invalidate",d="rest-hooks/invalidateall",u="rest-hooks/expireall",p="rest-hooks/gc";var f=Object.freeze({__proto__:null,FETCH_TYPE:i,RECEIVE_TYPE:r,SET_TYPE:n,OPTIMISTIC_TYPE:o,RESET_TYPE:a,SUBSCRIBE_TYPE:l,UNSUBSCRIBE_TYPE:c,INVALIDATE_TYPE:h,INVALIDATEALL_TYPE:d,EXPIREALL_TYPE:u,GC_TYPE:p});function m(e,t){let s;return t.endpoint.getOptimisticResponse&&t.endpoint.sideEffect?(s=function(e,{args:t,fetchedAt:s}){var i;const r=null!=(i=e.dataExpiryLength)?i:6e4,n=Date.now(),a={args:t,fetchedAt:s,date:n,expiresAt:n+r,key:e.key(...t)};return{type:o,endpoint:e,meta:a}}(t.endpoint,{args:t.meta.args,fetchedAt:t.meta.createdAt}),Object.assign({},e,{optimistic:[...e.optimistic,s]})):e}function y(e,t,s){return"AbortError"===s.name?Object.assign({},e,{optimistic:g(e,t)}):Object.assign({},e,{meta:Object.assign({},e.meta,{[t.meta.key]:{date:t.meta.date,error:s,expiresAt:t.meta.expiresAt,errorPolicy:null==t.endpoint.errorPolicy?void 0:t.endpoint.errorPolicy(s)}}),optimistic:g(e,t)})}function g(e,t){return e.optimistic.filter((e=>e.meta.key!==t.meta.key||(e.type===o?e.meta.fetchedAt!==t.meta.fetchedAt:e.meta.date>t.meta.date)))}function v(e){return function(s,r){switch(s||(s=E),r.type){case p:return r.entities.forEach((([e,t])=>{var i,r;null==(i=s.entities[e])||delete i[t],null==(r=s.entityMeta[e])||delete r[t]})),r.results.forEach((e=>{delete s.results[e],delete s.meta[e]})),s;case i:return m(s,r);case o:case n:return function(e,s,i){if(s.error)return y(e,s,s.payload);try{var r;let a;if(s.type===o){if(!s.endpoint.getOptimisticResponse)return e;try{a=s.endpoint.getOptimisticResponse.call(s.endpoint,i.snapshot(e,s.meta.fetchedAt),...s.meta.args)}catch(t){var n;if("AbortOptimistic"===(null==(n=t.constructor)?void 0:n.name))return e;throw t}}else a=s.payload;const{result:l,entities:c,indexes:h,entityMeta:d}=t.normalize(a,s.endpoint.schema,s.meta.args,e.entities,e.indexes,e.entityMeta,s.meta),u=Object.assign({},e.results,{[s.meta.key]:l});try{if(s.endpoint.update){const e=s.endpoint.update(l,...s.meta.args);Object.keys(e).forEach((t=>{u[t]=e[t](u[t])}))}}catch(e){console.error(`The following error occured during Endpoint.update() for ${s.meta.key}`),console.error(e)}return{entities:c,indexes:h,results:u,entityMeta:d,meta:Object.assign({},e.meta,{[s.meta.key]:{date:s.meta.date,expiresAt:s.meta.expiresAt,prevExpiresAt:null==(r=e.meta[s.meta.key])?void 0:r.expiresAt}}),optimistic:g(e,s),lastReset:e.lastReset}}catch(t){return"object"==typeof t&&(t.message=`Error processing ${s.meta.key}\n\nFull Schema: ${JSON.stringify(s.endpoint.schema,void 0,2)}\n\nError:\n${t.message}`,"payload"in s&&(t.payload=s.payload),t.status=400),y(e,s,t)}}(s,r,e);case d:case h:return function(e,t){const s=Object.assign({},e.results),i=Object.assign({},e.meta),r=e=>{delete s[e];const t=Object.assign({},i[e],{expiresAt:0,invalidated:!0});delete t.error,i[e]=t};return t.type===h?r(t.meta.key):Object.keys(s).forEach((e=>{t.testKey(e)&&r(e)})),Object.assign({},e,{results:s,meta:i})}(s,r);case u:return function(e,t){const s=Object.assign({},e.meta);return Object.keys(s).forEach((e=>{t.testKey(e)&&(s[e]=Object.assign({},s[e],{expiresAt:1}))})),Object.assign({},e,{meta:s})}(s,r);case a:return Object.assign({},E,{lastReset:r.date});default:return s}}}const E={entities:{},indexes:{},results:{},meta:{},entityMeta:{},optimistic:[],lastReset:0};var b=Object.freeze({__proto__:null,inferResults:t.inferResults,DELETED:t.DELETED,INVALID:t.INVALID,RIC:s,initialState:E});function L(e,{args:t}){const s=e.key(...t);let r=0,n=0;const o=new Promise(((e,t)=>{[r,n]=[e,t]})),a={args:t,key:s,throttle:!e.sideEffect,resolve:r,reject:n,promise:o,createdAt:Date.now(),nm:!1};return{type:i,payload:()=>e(...t),meta:a,endpoint:e}}function O(e,{args:t,fetchedAt:s,response:i,error:r=!1}){var o,a;const l=r?null!=(o=e.errorExpiryLength)?o:1e3:null!=(a=e.dataExpiryLength)?a:6e4,c=Date.now(),h={args:t,fetchedAt:null!=s?s:c,date:c,expiresAt:c+l,key:e.key(...t)},d={type:n,payload:i,endpoint:e,meta:h};return r&&(d.error=!0),d}function I(e,t){return e.meta[t]}const k=e=>{throw new Error("Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")},w=()=>E;class S{constructor({dispatch:e=k,getState:s=w,globalCache:i={entities:{},results:{}}}={}){this.fetch=(e,...s)=>{const i=L(e,{args:s});return this.dispatch(i),e.schema?i.meta.promise.then((i=>t.denormalize(i,e.schema,{},s))):i.meta.promise},this.fetchIfStale=(e,...s)=>{const{data:i,expiresAt:r,expiryStatus:n}=this.getResponse(e,...s,this.getState());return n!==t.ExpiryStatus.Invalid&&Date.now()<=r?i:this.fetch(e,...s)},this.invalidate=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:h,meta:{key:e.key(...t)}}}(e,{args:t})):Promise.resolve(),this.invalidateAll=e=>this.dispatch({type:d,testKey:t=>e.testKey(t)}),this.expireAll=e=>this.dispatch({type:u,testKey:t=>e.testKey(t)}),this.resetEntireStore=()=>this.dispatch({type:a,date:Date.now()}),this.setResponse=(e,...t)=>{const s=t[t.length-1],i=O(e,{args:t.slice(0,t.length-1),response:s});return this.dispatch(i)},this.receive=(e,...t)=>this.setResponse(e,...t),this.setError=(e,...t)=>{const s=t[t.length-1],i=O(e,{args:t.slice(0,t.length-1),response:s,error:!0});return this.dispatch(i)},this.receiveError=(e,...t)=>this.setError(e,...t),this.resolve=(e,t)=>this.dispatch(O(e,t)),this.subscribe=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:l,endpoint:e,meta:{args:t,key:e.key(...t)}}}(e,{args:t})):Promise.resolve(),this.unsubscribe=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:c,endpoint:e,meta:{args:t,key:e.key(...t)}}}(e,{args:t})):Promise.resolve(),this.snapshot=(e,t)=>new x(this,e,t),this.getError=(e,...t)=>{if(null===t[0])return;const s=t[t.length-1],i=t.slice(0,t.length-1),r=e.key(...i),n=I(s,r);return void 0===s.results[r]||"soft"!==(null==n?void 0:n.errorPolicy)?null==n?void 0:n.error:void 0},this.getResponse=(e,...s)=>{const i=s[s.length-1],r=s.slice(0,s.length-1),n=1!==r.length||null!==r[0],o=n?e.key(...r):"",a=n?i.results[o]:void 0,l=e.schema,c=I(i,o);let h,d=null==c?void 0:c.expiresAt,u=!1;if(void 0===a&&void 0!==e.schema?(h=t.inferResults(e.schema,r,i.indexes,i.entities),u=!t.validateInference(h),!d&&u&&(d=1)):h=a,!n)return{data:h,expiryStatus:t.ExpiryStatus.Valid,expiresAt:1/0};if(!e.schema||!A(e.schema))return{data:h,expiryStatus:null!=c&&c.invalidated?t.ExpiryStatus.Invalid:a&&!e.invalidIfStale?t.ExpiryStatus.Valid:t.ExpiryStatus.InvalidIfStale,expiresAt:d||0};this.globalCache.results[o]||(this.globalCache.results[o]=new t.WeakEntityMap);const{data:p,paths:f}=t.denormalizeCached(h,l,i.entities,this.globalCache.entities,this.globalCache.results[o],r),m="symbol"==typeof p;d||(d=function(e,t){let s=1/0;for(const{pk:n,key:o}of e){var i,r;const e=null==(i=t[o])||null==(r=i[n])?void 0:r.expiresAt;e<s&&(s=e)}return s}(f,i.entityMeta));return{data:p,expiryStatus:null!=c&&c.invalidated||m&&(null==c||!c.error)?t.ExpiryStatus.Invalid:m||e.invalidIfStale||u?t.ExpiryStatus.InvalidIfStale:t.ExpiryStatus.Valid,expiresAt:d}},this.dispatch=e,this.getState=s,this.globalCache=i}}function A(e){if(t.isEntity(e))return!0;if(Array.isArray(e))return 0!==e.length&&A(e[0]);if(e&&("object"==typeof e||"function"==typeof e)){const t="schema"in e?e.schema:e;return"function"==typeof t?A(t):Object.values(t).some((e=>A(e)))}return!1}class x{constructor(e,t,s=0){this.state=void 0,this.controller=void 0,this.fetchedAt=void 0,this.getResponse=(e,...t)=>this.controller.getResponse(e,...t,this.state),this.getError=(e,...t)=>this.controller.getError(e,...t,this.state),this.state=t,this.controller=e,this.fetchedAt=s}}class T extends Error{constructor(){super("Aborted due to RESET"),this.name="ResetError"}}var j=Object.freeze({__proto__:null});class _{isOnline(){return void 0===navigator.onLine||navigator.onLine}addOnlineListener(e){addEventListener("online",e)}removeOnlineListener(e){removeEventListener("online",e)}addOfflineListener(e){addEventListener("offline",e)}removeOfflineListener(e){removeEventListener("offline",e)}}class R{isOnline(){return!0}addOnlineListener(){}removeOnlineListener(){}addOfflineListener(){}removeOfflineListener(){}}let P;P="undefined"!=typeof navigator&&"function"==typeof addEventListener?_:R;var q,D=P;const M="undefined"!=typeof Intl,C={name:`Rest Hooks: ${null==(q=globalThis.document)?void 0:q.title}`,autoPause:!0,serialize:{options:void 0,replacer:M?(e,t)=>"number"==typeof t&&"string"==typeof e&&isFinite(t)&&("date"===e||e.endsWith("At"))?Intl.DateTimeFormat("en-US",{hour:"numeric",minute:"numeric",second:"numeric",fractionalSecondDigits:3}).format(t):t:void 0}};Object.hasOwn=Object.hasOwn||function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},Object.defineProperty(e,"ExpiryStatus",{enumerable:!0,get:function(){return t.ExpiryStatus}}),e.Controller=S,e.DefaultConnectionListener=D,e.DevToolsManager=class{constructor(e,t){this.devTools="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__.connect(Object.assign({},C,{config:e})),this.devTools?this.middleware=e=>{const s=v(e);return i=>r=>{const n=i(r);return n.then((()=>{if(null!=t&&t(r))return;const i=e.getState();this.devTools.send(r,i.optimistic.reduce(s,i),void 0,"REST_HOOKS")})),n}}:this.middleware=()=>e=>t=>e(t)}init(e){this.devTools&&this.devTools.init(e)}cleanup(){}getMiddleware(){return this.middleware}},e.LogoutManager=class{constructor({handleLogout:e,shouldLogout:t}={}){e&&(this.handleLogout=e),t&&(this.shouldLogout=t),this.middleware=e=>t=>async s=>{await t(s),s.type===n&&s.error&&this.shouldLogout(s.payload)&&this.handleLogout(e)}}cleanup(){}getMiddleware(){return this.middleware}shouldLogout(e){return 401===e.status}handleLogout(e){e.resetEntireStore()}},e.NetworkManager=class{constructor(e=6e4,t=1e3){this.fetched=Object.create(null),this.resolvers={},this.rejectors={},this.fetchedAt={},this.controller=new S,this.dataExpiryLength=e,this.errorExpiryLength=t,this.middleware=e=>(this.controller=e,t=>s=>{switch(s.type){case i:return this.handleFetch(s),void 0!==s.endpoint.getOptimisticResponse&&s.endpoint.sideEffect?t(s):Promise.resolve();case n:return t(s).then((()=>{if(s.meta.key in this.fetched){var t;const i=null==(t=e.getState().meta[s.meta.key])?void 0:t.error;i?this.handleReceive(O(s.endpoint,{args:s.meta.args,response:i,fetchedAt:s.meta.fetchedAt,error:!0})):this.handleReceive(s)}}));case a:{const e=Object.assign({},this.rejectors);return this.clearAll(),t(s).then((()=>{for(const t in e)e[t](new T)}))}default:return t(s)}})}skipLogging(e){return e.type===i&&e.meta.key in this.fetched}init(){delete this.cleanupDate}cleanup(){this.cleanupDate=Date.now()}allSettled(){const e=Object.values(this.fetched);if(e.length)return Promise.allSettled(e)}clearAll(){for(const e in this.rejectors)this.clear(e)}clear(e){this.fetched[e].catch((()=>{})),delete this.resolvers[e],delete this.rejectors[e],delete this.fetched[e],delete this.fetchedAt[e]}getLastReset(){return this.cleanupDate?this.cleanupDate:this.controller.getState().lastReset}handleFetch(e){const t=e.payload,{key:s,throttle:i,resolve:r,reject:n,createdAt:o}=e.meta,a=()=>{let s=t();return i||(s=(e=>e.then((e=>(r(e),e))).catch((e=>{throw n(e),e})))(s)),s=s.then((t=>{let s=this.getLastReset();return o>=s&&this.controller.resolve(e.endpoint,{args:e.meta.args,response:t,fetchedAt:o}),t})).catch((t=>{const s=this.getLastReset();throw o>=s&&this.controller.resolve(e.endpoint,{args:e.meta.args,response:t,fetchedAt:o,error:!0}),t})),s};return i?this.throttle(s,a,o).then((e=>r(e))).catch((e=>n(e))):a().catch((()=>{}))}handleReceive(e){if(e.meta.key in this.fetched){let t;t=e.error?this.rejectors[e.meta.key]:this.resolvers[e.meta.key],t(e.payload),this.clear(e.meta.key)}}getMiddleware(){return this.middleware}throttle(e,t,i){const r=this.getLastReset();return e in this.fetched&&this.fetchedAt[e]>r||(this.fetched[e]=new Promise(((t,s)=>{this.resolvers[e]=t,this.rejectors[e]=s})),this.fetchedAt[e]=i,s((()=>{t().catch((()=>null))}),{timeout:500})),this.fetched[e]}},e.PollingSubscription=class{constructor(e,t,s){if(this.frequencyHistogram=new Map,this.offlineListener=()=>{this.cleanup(),this.connectionListener.addOnlineListener(this.onlineListener)},this.onlineListener=()=>{this.connectionListener.removeOnlineListener(this.onlineListener);const e=Date.now();this.startId=setTimeout((()=>{this.startId&&(delete this.startId,this.update(),this.run())}),Math.max(0,this.lastFetchTime()-e+this.frequency)),this.connectionListener.addOfflineListener(this.offlineListener)},void 0===e.endpoint.pollFrequency)throw new Error("frequency needed for polling subscription");this.endpoint=e.endpoint,this.frequency=e.endpoint.pollFrequency,this.args=e.meta.args,this.key=e.meta.key,this.frequencyHistogram.set(this.frequency,1),this.controller=t,this.connectionListener=s||new D,this.connectionListener.isOnline()?this.onlineListener():this.offlineListener()}add(e){void 0!==e&&(this.frequencyHistogram.has(e)?this.frequencyHistogram.set(e,this.frequencyHistogram.get(e)+1):(this.frequencyHistogram.set(e,1),e<this.frequency&&(this.frequency=e,this.run())))}remove(e){if(void 0===e)return!1;if(this.frequencyHistogram.has(e)&&(this.frequencyHistogram.set(e,this.frequencyHistogram.get(e)-1),this.frequencyHistogram.get(e)<1)){if(this.frequencyHistogram.delete(e),0===this.frequencyHistogram.size)return this.cleanup(),!0;e<=this.frequency&&(this.frequency=Math.min(...this.frequencyHistogram.keys()),this.run())}return!1}cleanup(){this.intervalId&&(clearInterval(this.intervalId),delete this.intervalId),this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.startId&&(clearTimeout(this.startId),delete this.startId),this.connectionListener.removeOnlineListener(this.onlineListener),this.connectionListener.removeOfflineListener(this.offlineListener)}update(){const e=this.endpoint,t=function(...t){return e.call(this,...t)};Object.assign(t,this.endpoint),t.dataExpiryLength=this.frequency/2,t.errorExpiryLength=this.frequency/10,t.errorPolicy=()=>"soft",t.key=()=>this.key,this.controller.fetch(t,...this.args).catch((()=>null))}run(){this.startId||(this.intervalId&&(this.lastIntervalId=this.intervalId),this.intervalId=setInterval((()=>{this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.intervalId&&this.update()}),this.frequency))}lastFetchTime(){var e,t;return null!=(e=null==(t=this.controller.getState().meta[this.key])?void 0:t.date)?e:0}},e.ResetError=T,e.SubscriptionManager=class{constructor(e){this.subscriptions={},this.controller=new S,this.Subscription=e,this.middleware=e=>(this.controller=e,e=>t=>{switch(t.type){case l:try{this.handleSubscribe(t)}catch(e){console.error(e)}return Promise.resolve();case c:return this.handleUnsubscribe(t),Promise.resolve();default:return e(t)}})}cleanup(){for(const e in this.subscriptions)this.subscriptions[e].cleanup()}handleSubscribe(e){const t=e.meta.key;if(t in this.subscriptions){const s=e.endpoint.pollFrequency;this.subscriptions[t].add(s)}else this.subscriptions[t]=new this.Subscription(e,this.controller)}handleUnsubscribe(e){const t=e.meta.key;if(t in this.subscriptions){const s=e.endpoint.pollFrequency;this.subscriptions[t].remove(s)&&delete this.subscriptions[t]}}getMiddleware(){return this.middleware}},e.__INTERNAL__=b,e.actionTypes=f,e.applyManager=function(e,t){return e.map((e=>{const s=e.getMiddleware();return({dispatch:e,getState:i})=>{t.dispatch=e,t.getState=i;const r=Object.create(t,{controller:{value:t}});return s(r)}}))},e.createFetch=L,e.createReceive=O,e.createReducer=v,e.initialState=E,e.newActions=j,Object.defineProperty(e,"__esModule",{value:!0})}));
package/dist/next.js CHANGED
@@ -203,10 +203,11 @@ class Controller {
203
203
  */
204
204
  this.fetchIfStale = (endpoint, ...args) => {
205
205
  const {
206
+ data,
206
207
  expiresAt,
207
208
  expiryStatus
208
209
  } = this.getResponse(endpoint, ...args, this.getState());
209
- if (expiryStatus !== normalizr.ExpiryStatus.Invalid && Date.now() <= expiresAt) return;
210
+ if (expiryStatus !== normalizr.ExpiryStatus.Invalid && Date.now() <= expiresAt) return data;
210
211
  return this.fetch(endpoint, ...args);
211
212
  };
212
213
  /**
@@ -66,10 +66,11 @@ export default class Controller {
66
66
  */
67
67
  this.fetchIfStale = (endpoint, ...args) => {
68
68
  const {
69
+ data,
69
70
  expiresAt,
70
71
  expiryStatus
71
72
  } = this.getResponse(endpoint, ...args, this.getState());
72
- if (expiryStatus !== ExpiryStatus.Invalid && Date.now() <= expiresAt) return;
73
+ if (expiryStatus !== ExpiryStatus.Invalid && Date.now() <= expiresAt) return data;
73
74
  return this.fetch(endpoint, ...args);
74
75
  };
75
76
  /**
@@ -307,4 +308,4 @@ class Snapshot {
307
308
  this.fetchedAt = fetchedAt;
308
309
  }
309
310
  }
310
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXZWFrRW50aXR5TWFwIiwiRXhwaXJ5U3RhdHVzIiwiZGVub3JtYWxpemVDYWNoZWQiLCJpc0VudGl0eSIsImRlbm9ybWFsaXplIiwiaW5mZXJSZXN1bHRzIiwidmFsaWRhdGVJbmZlcmVuY2UiLCJjcmVhdGVFeHBpcmVBbGwiLCJjcmVhdGVGZXRjaCIsImNyZWF0ZUludmFsaWRhdGUiLCJjcmVhdGVJbnZhbGlkYXRlQWxsIiwiY3JlYXRlUmVzZXQiLCJjcmVhdGVTZXQiLCJjcmVhdGVVbnN1YnNjcmlwdGlvbiIsImNyZWF0ZVN1YnNjcmlwdGlvbiIsImluaXRpYWxTdGF0ZSIsInNlbGVjdE1ldGEiLCJ1bnNldERpc3BhdGNoIiwiYWN0aW9uIiwiRXJyb3IiLCJ1bnNldFN0YXRlIiwiQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiZGlzcGF0Y2giLCJnZXRTdGF0ZSIsImdsb2JhbENhY2hlIiwiZW50aXRpZXMiLCJyZXN1bHRzIiwiZmV0Y2giLCJlbmRwb2ludCIsImFyZ3MiLCJzY2hlbWEiLCJtZXRhIiwicHJvbWlzZSIsInRoZW4iLCJpbnB1dCIsImZldGNoSWZTdGFsZSIsImV4cGlyZXNBdCIsImV4cGlyeVN0YXR1cyIsImdldFJlc3BvbnNlIiwiSW52YWxpZCIsIkRhdGUiLCJub3ciLCJpbnZhbGlkYXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJpbnZhbGlkYXRlQWxsIiwib3B0aW9ucyIsImtleSIsInRlc3RLZXkiLCJleHBpcmVBbGwiLCJyZXNldEVudGlyZVN0b3JlIiwic2V0UmVzcG9uc2UiLCJyZXN0IiwicmVzcG9uc2UiLCJsZW5ndGgiLCJzbGljZSIsInJlY2VpdmUiLCJzZXRFcnJvciIsImVycm9yIiwicmVjZWl2ZUVycm9yIiwic3Vic2NyaWJlIiwidW5zdWJzY3JpYmUiLCJzbmFwc2hvdCIsInN0YXRlIiwiZmV0Y2hlZEF0IiwiU25hcHNob3QiLCJnZXRFcnJvciIsInVuZGVmaW5lZCIsImVycm9yUG9saWN5IiwiaXNBY3RpdmUiLCJjYWNoZVJlc3VsdHMiLCJpbnZhbGlkUmVzdWx0cyIsImluZGV4ZXMiLCJkYXRhIiwiVmFsaWQiLCJJbmZpbml0eSIsInNjaGVtYUhhc0VudGl0eSIsImludmFsaWRhdGVkIiwiaW52YWxpZElmU3RhbGUiLCJJbnZhbGlkSWZTdGFsZSIsInBhdGhzIiwiaW52YWxpZERlbm9ybWFsaXplIiwiZW50aXR5RXhwaXJlc0F0IiwiZW50aXR5TWV0YSIsInBrIiwiX2VudGl0eU1ldGEka2V5IiwiX2VudGl0eU1ldGEka2V5JHBrIiwiZW50aXR5RXhwaXJ5IiwiQXJyYXkiLCJpc0FycmF5IiwibmVzdGVkU2NoZW1hIiwiT2JqZWN0IiwidmFsdWVzIiwic29tZSIsIngiLCJjb250cm9sbGVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyb2xsZXIvQ29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEVycm9yVHlwZXMsXG4gIFNuYXBzaG90SW50ZXJmYWNlLFxuICBEZW5vcm1hbGl6ZUNhY2hlLFxuICBTY2hlbWEsXG4gIERlbm9ybWFsaXplLFxufSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcbmltcG9ydCB7XG4gIFdlYWtFbnRpdHlNYXAsXG4gIEV4cGlyeVN0YXR1cyxcbiAgRW5kcG9pbnRJbnRlcmZhY2UsXG4gIEZldGNoRnVuY3Rpb24sXG4gIFJlc29sdmVUeXBlLFxuICBEZW5vcm1hbGl6ZU51bGxhYmxlLFxuICBQYXRoLFxuICBkZW5vcm1hbGl6ZUNhY2hlZCxcbiAgaXNFbnRpdHksXG4gIGRlbm9ybWFsaXplLFxufSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcbmltcG9ydCB7IGluZmVyUmVzdWx0cywgdmFsaWRhdGVJbmZlcmVuY2UgfSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcblxuaW1wb3J0IGNyZWF0ZUV4cGlyZUFsbCBmcm9tICcuL2NyZWF0ZUV4cGlyZUFsbC5qcyc7XG5pbXBvcnQgY3JlYXRlRmV0Y2ggZnJvbSAnLi9jcmVhdGVGZXRjaC5qcyc7XG5pbXBvcnQgY3JlYXRlSW52YWxpZGF0ZSBmcm9tICcuL2NyZWF0ZUludmFsaWRhdGUuanMnO1xuaW1wb3J0IGNyZWF0ZUludmFsaWRhdGVBbGwgZnJvbSAnLi9jcmVhdGVJbnZhbGlkYXRlQWxsLmpzJztcbmltcG9ydCBjcmVhdGVSZXNldCBmcm9tICcuL2NyZWF0ZVJlc2V0LmpzJztcbmltcG9ydCBjcmVhdGVTZXQgZnJvbSAnLi9jcmVhdGVTZXQuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlVW5zdWJzY3JpcHRpb24sXG4gIGNyZWF0ZVN1YnNjcmlwdGlvbixcbn0gZnJvbSAnLi9jcmVhdGVTdWJzY3JpcHRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBpbml0aWFsU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9yZWR1Y2VyL2NyZWF0ZVJlZHVjZXIuanMnO1xuaW1wb3J0IHNlbGVjdE1ldGEgZnJvbSAnLi4vc3RhdGUvc2VsZWN0TWV0YS5qcyc7XG5pbXBvcnQgdHlwZSB7IEFjdGlvblR5cGVzLCBTdGF0ZSB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgR2VuZXJpY0Rpc3BhdGNoID0gKHZhbHVlOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG5leHBvcnQgdHlwZSBEYXRhQ2xpZW50RGlzcGF0Y2ggPSAodmFsdWU6IEFjdGlvblR5cGVzKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5pbnRlcmZhY2UgQ29uc3RydWN0b3JQcm9wczxEIGV4dGVuZHMgR2VuZXJpY0Rpc3BhdGNoID0gRGF0YUNsaWVudERpc3BhdGNoPiB7XG4gIGRpc3BhdGNoPzogRDtcbiAgZ2V0U3RhdGU/OiAoKSA9PiBTdGF0ZTx1bmtub3duPjtcbiAgZ2xvYmFsQ2FjaGU/OiBEZW5vcm1hbGl6ZUNhY2hlO1xufVxuXG5jb25zdCB1bnNldERpc3BhdGNoID0gKGFjdGlvbjogdW5rbm93bik6IFByb21pc2U8dm9pZD4gPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERpc3BhdGNoaW5nIHdoaWxlIGNvbnN0cnVjdGluZyB5b3VyIG1pZGRsZXdhcmUgaXMgbm90IGFsbG93ZWQuIGAgK1xuICAgICAgYE90aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC5gLFxuICApO1xufTtcbmNvbnN0IHVuc2V0U3RhdGUgPSAoKTogU3RhdGU8dW5rbm93bj4gPT4ge1xuICAvLyBUaGlzIGlzIG9ubHkgdGhlIHZhbHVlIHVudGlsIGl0IGlzIHNldCBieSB0aGUgQ2FjaGVQcm92aWRlclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gaW5pdGlhbFN0YXRlO1xufTtcblxuLyoqXG4gKiBJbXBlcmF0aXZlIGNvbnRyb2wgb2YgUmVzdCBIb29rcyBzdG9yZVxuICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRyb2xsZXI8XG4gIEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBEYXRhQ2xpZW50RGlzcGF0Y2gsXG4+IHtcbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uIHRvIFJlc3QgSG9va3MgcmVkdWNlci5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2Rpc3BhdGNoXG4gICAqL1xuICBkZWNsYXJlIHJlYWRvbmx5IGRpc3BhdGNoOiBEO1xuICAvKipcbiAgICogR2V0cyB0aGUgbGF0ZXN0IHN0YXRlIHNuYXBzaG90IHRoYXQgaXMgZnVsbHkgY29tbWl0dGVkLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGltcGVyYXRpdmUgdXNlLWNhc2VzIGxpa2UgZXZlbnQgaGFuZGxlcnMuXG4gICAqIFRoaXMgc2hvdWxkICpub3QqIGJlIHVzZWQgdG8gcmVuZGVyOyBpbnN0ZWFkIHVzZVN1c3BlbnNlKCkgb3IgdXNlQ2FjaGUoKVxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0U3RhdGVcbiAgICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgZ2V0U3RhdGU6ICgpID0+IFN0YXRlPHVua25vd24+O1xuICBkZWNsYXJlIHJlYWRvbmx5IGdsb2JhbENhY2hlOiBEZW5vcm1hbGl6ZUNhY2hlO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBkaXNwYXRjaCA9IHVuc2V0RGlzcGF0Y2ggYXMgYW55LFxuICAgIGdldFN0YXRlID0gdW5zZXRTdGF0ZSxcbiAgICBnbG9iYWxDYWNoZSA9IHtcbiAgICAgIGVudGl0aWVzOiB7fSxcbiAgICAgIHJlc3VsdHM6IHt9LFxuICAgIH0sXG4gIH06IENvbnN0cnVjdG9yUHJvcHM8RD4gPSB7fSkge1xuICAgIHRoaXMuZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbiAgICB0aGlzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG4gICAgdGhpcy5nbG9iYWxDYWNoZSA9IGdsb2JhbENhY2hlO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBBY3Rpb24gRGlzcGF0Y2hlcnMgKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBlbmRwb2ludCB3aXRoIGdpdmVuIGFyZ3MsIHVwZGF0aW5nIHRoZSBSZXN0IEhvb2tzIGNhY2hlIHdpdGggdGhlIHJlc3BvbnNlIG9yIGVycm9yIHVwb24gY29tcGxldGlvbi5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2ZldGNoXG4gICAqL1xuICBmZXRjaCA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7IHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT4gfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKTogRVsnc2NoZW1hJ10gZXh0ZW5kcyB1bmRlZmluZWQgfCBudWxsXG4gICAgPyBSZXR1cm5UeXBlPEU+XG4gICAgOiBQcm9taXNlPERlbm9ybWFsaXplPEVbJ3NjaGVtYSddPj4gPT4ge1xuICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZUZldGNoKGVuZHBvaW50LCB7XG4gICAgICBhcmdzLFxuICAgIH0pO1xuICAgIHRoaXMuZGlzcGF0Y2goYWN0aW9uKTtcblxuICAgIGlmIChlbmRwb2ludC5zY2hlbWEpIHtcbiAgICAgIHJldHVybiBhY3Rpb24ubWV0YS5wcm9taXNlLnRoZW4oaW5wdXQgPT5cbiAgICAgICAgZGVub3JtYWxpemUoaW5wdXQsIGVuZHBvaW50LnNjaGVtYSwge30sIGFyZ3MpLFxuICAgICAgKSBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBhY3Rpb24ubWV0YS5wcm9taXNlIGFzIGFueTtcbiAgfTtcblxuICAvKipcbiAgICogRmV0Y2hlcyBvbmx5IGlmIGVuZHBvaW50IGlzIGNvbnNpZGVyZWQgJ3N0YWxlJzsgb3RoZXJ3aXNlIHJldHVybnMgdW5kZWZpbmVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZmV0Y2hJZlN0YWxlXG4gICAqL1xuICBmZXRjaElmU3RhbGUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYgeyB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+IH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dXG4gICk6XG4gICAgfCAoRVsnc2NoZW1hJ10gZXh0ZW5kcyB1bmRlZmluZWQgfCBudWxsXG4gICAgICAgID8gUmV0dXJuVHlwZTxFPlxuICAgICAgICA6IFByb21pc2U8RGVub3JtYWxpemU8RVsnc2NoZW1hJ10+PilcbiAgICB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgeyBleHBpcmVzQXQsIGV4cGlyeVN0YXR1cyB9ID0gdGhpcy5nZXRSZXNwb25zZShcbiAgICAgIGVuZHBvaW50LFxuICAgICAgLi4uYXJncyxcbiAgICAgIHRoaXMuZ2V0U3RhdGUoKSxcbiAgICApO1xuICAgIGlmIChleHBpcnlTdGF0dXMgIT09IEV4cGlyeVN0YXR1cy5JbnZhbGlkICYmIERhdGUubm93KCkgPD0gZXhwaXJlc0F0KVxuICAgICAgcmV0dXJuO1xuICAgIHJldHVybiB0aGlzLmZldGNoKGVuZHBvaW50LCAuLi5hcmdzKTtcbiAgfTtcblxuICAvKipcbiAgICogRm9yY2VzIHJlZmV0Y2hpbmcgYW5kIHN1c3BlbnNlIG9uIHVzZVN1c3BlbnNlIHdpdGggdGhlIHNhbWUgRW5kcG9pbnQgYW5kIHBhcmFtZXRlcnMuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNpbnZhbGlkYXRlXG4gICAqL1xuICBpbnZhbGlkYXRlID0gPEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZT4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IFByb21pc2U8dm9pZD4gPT5cbiAgICBhcmdzWzBdICE9PSBudWxsXG4gICAgICA/IHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICAgY3JlYXRlSW52YWxpZGF0ZShlbmRwb2ludCwge1xuICAgICAgICAgICAgYXJnczogYXJncyBhcyByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqXG4gICAqIEZvcmNlcyByZWZldGNoaW5nIGFuZCBzdXNwZW5zZSBvbiB1c2VTdXNwZW5zZSBvbiBhbGwgbWF0Y2hpbmcgZW5kcG9pbnQgcmVzdWx0IGtleXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNpbnZhbGlkYXRlQWxsXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGludmFsaWRhdGlvbiBpcyBjb21taXRlZC5cbiAgICovXG4gIGludmFsaWRhdGVBbGwgPSAob3B0aW9uczogeyB0ZXN0S2V5OiAoa2V5OiBzdHJpbmcpID0+IGJvb2xlYW4gfSkgPT5cbiAgICB0aGlzLmRpc3BhdGNoKGNyZWF0ZUludmFsaWRhdGVBbGwoKGtleTogc3RyaW5nKSA9PiBvcHRpb25zLnRlc3RLZXkoa2V5KSkpO1xuXG4gIC8qKlxuICAgKiBTZXRzIGFsbCBtYXRjaGluZyBlbmRwb2ludCByZXN1bHQga2V5cyB0byBiZSBTVEFMRS5cbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNleHBpcmVBbGxcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXhwaXJ5IGlzIGNvbW1pdGVkLiAqTk9UKiBmZXRjaCBwcm9taXNlXG4gICAqL1xuICBleHBpcmVBbGwgPSAob3B0aW9uczogeyB0ZXN0S2V5OiAoa2V5OiBzdHJpbmcpID0+IGJvb2xlYW4gfSkgPT5cbiAgICB0aGlzLmRpc3BhdGNoKGNyZWF0ZUV4cGlyZUFsbCgoa2V5OiBzdHJpbmcpID0+IG9wdGlvbnMudGVzdEtleShrZXkpKSk7XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZW50aXJlIFJlc3QgSG9va3MgY2FjaGUuIEFsbCBpbmZsaWdodCByZXF1ZXN0cyB3aWxsIG5vdCByZXNvbHZlLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjcmVzZXRFbnRpcmVTdG9yZVxuICAgKi9cbiAgcmVzZXRFbnRpcmVTdG9yZSA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMuZGlzcGF0Y2goY3JlYXRlUmVzZXQoKSk7XG5cbiAgLyoqXG4gICAqIFN0b3JlcyByZXNwb25zZSBpbiBjYWNoZSBmb3IgZ2l2ZW4gRW5kcG9pbnQgYW5kIGFyZ3MuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzZXRcbiAgICovXG4gIHNldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgYW55XVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogUmVzb2x2ZVR5cGU8RT4gPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYWN0aW9uID0gY3JlYXRlU2V0KGVuZHBvaW50LCB7XG4gICAgICBhcmdzOiByZXN0LnNsaWNlKDAsIHJlc3QubGVuZ3RoIC0gMSkgYXMgUGFyYW1ldGVyczxFPixcbiAgICAgIHJlc3BvbnNlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGFjdGlvbik7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldFJlc3BvbnNlIGluc3RlYWRcbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIHJlY2VpdmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgICAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbiAgICB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+LCBhbnldXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHRoaXMuc2V0UmVzcG9uc2UoZW5kcG9pbnQsIC4uLnJlc3QpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgdGhlIHJlc3VsdCBvZiBFbmRwb2ludCBhbmQgYXJncyBhcyB0aGUgZXJyb3IgcHJvdmlkZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzZXRFcnJvclxuICAgKi9cbiAgc2V0RXJyb3IgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgICAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbiAgICB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+LCBFcnJvcl1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IEVycm9yID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZVNldChlbmRwb2ludCwge1xuICAgICAgYXJnczogcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RT4sXG4gICAgICByZXNwb25zZSxcbiAgICAgIGVycm9yOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGFjdGlvbik7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFub3RoZXIgbmFtZSBmb3Igc2V0RXJyb3JcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0RXJyb3IgaW5zdGVhZFxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gcmVjZWl2ZUVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgRXJyb3JdXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHRoaXMuc2V0RXJyb3IoZW5kcG9pbnQsIC4uLnJlc3QpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBpbmZsaWdodCBmZXRjaC4gYGZldGNoZWRBdGAgc2hvdWxkIGBmZXRjaGAncyBgY3JlYXRlZEF0YFxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjcmVzb2x2ZVxuICAgKi9cbiAgcmVzb2x2ZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgbWV0YTpcbiAgICAgIHwge1xuICAgICAgICAgIGFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XTtcbiAgICAgICAgICByZXNwb25zZTogRXJyb3I7XG4gICAgICAgICAgZmV0Y2hlZEF0OiBudW1iZXI7XG4gICAgICAgICAgZXJyb3I6IHRydWU7XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIGFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XTtcbiAgICAgICAgICByZXNwb25zZTogYW55O1xuICAgICAgICAgIGZldGNoZWRBdDogbnVtYmVyO1xuICAgICAgICAgIGVycm9yPzogZmFsc2U7XG4gICAgICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGNyZWF0ZVNldChlbmRwb2ludCwgbWV0YSBhcyBhbnkpKTtcbiAgfTtcblxuICAvKipcbiAgICogTWFya3MgYSBuZXcgc3Vic2NyaXB0aW9uIHRvIGEgZ2l2ZW4gRW5kcG9pbnQuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzdWJzY3JpYmVcbiAgICovXG4gIHN1YnNjcmliZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U8XG4gICAgICBGZXRjaEZ1bmN0aW9uLFxuICAgICAgU2NoZW1hIHwgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkIHwgZmFsc2VcbiAgICA+LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSB8IHJlYWRvbmx5IFtudWxsXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgYXJnc1swXSAhPT0gbnVsbFxuICAgICAgPyB0aGlzLmRpc3BhdGNoKFxuICAgICAgICAgIGNyZWF0ZVN1YnNjcmlwdGlvbihlbmRwb2ludCwge1xuICAgICAgICAgICAgYXJnczogYXJncyBhcyByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqXG4gICAqIE1hcmtzIGNvbXBsZXRpb24gb2Ygc3Vic2NyaXB0aW9uIHRvIGEgZ2l2ZW4gRW5kcG9pbnQuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciN1bnN1YnNjcmliZVxuICAgKi9cbiAgdW5zdWJzY3JpYmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPFxuICAgICAgRmV0Y2hGdW5jdGlvbixcbiAgICAgIFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCB8IGZhbHNlXG4gICAgPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIGFyZ3NbMF0gIT09IG51bGxcbiAgICAgID8gdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICBjcmVhdGVVbnN1YnNjcmlwdGlvbihlbmRwb2ludCwge1xuICAgICAgICAgICAgYXJnczogYXJncyBhcyByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqKioqKioqKioqKioqKiBNb3JlICoqKioqKioqKioqKioqKi9cblxuICAvKiBUT0RPOlxuICBhYm9ydCA9IDxFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XVxuICApOiBQcm9taXNlPHZvaWQ+XG4gICovXG5cbiAgLyoqXG4gICAqIEdldHMgYSBzbmFwc2hvdCAoaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvU25hcHNob3QpXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzbmFwc2hvdFxuICAgKi9cbiAgc25hcHNob3QgPSAoc3RhdGU6IFN0YXRlPHVua25vd24+LCBmZXRjaGVkQXQ/OiBudW1iZXIpOiBTbmFwc2hvdEludGVyZmFjZSA9PiB7XG4gICAgcmV0dXJuIG5ldyBTbmFwc2hvdCh0aGlzLCBzdGF0ZSwgZmV0Y2hlZEF0KTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgZXJyb3IsIGlmIGFueSwgZm9yIGEgZ2l2ZW4gZW5kcG9pbnQuIFJldHVybnMgdW5kZWZpbmVkIGZvciBubyBlcnJvcnMuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRFcnJvclxuICAgKi9cbiAgZ2V0RXJyb3IgPSA8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknPixcbiAgICBBcmdzIGV4dGVuZHMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiBbLi4uQXJncywgU3RhdGU8dW5rbm93bj5dXG4gICk6IEVycm9yVHlwZXMgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChyZXN0WzBdID09PSBudWxsKSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGUgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV0gYXMgU3RhdGU8dW5rbm93bj47XG4gICAgLy8gdGhpcyBpcyB0eXBlc2NyaXB0IGdlbmVyaWNzIGJyZWFraW5nXG4gICAgY29uc3QgYXJnczogYW55ID0gcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RVsna2V5J10+O1xuICAgIGNvbnN0IGtleSA9IGVuZHBvaW50LmtleSguLi5hcmdzKTtcblxuICAgIGNvbnN0IG1ldGEgPSBzZWxlY3RNZXRhKHN0YXRlLCBrZXkpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBzdGF0ZS5yZXN1bHRzW2tleV07XG5cbiAgICBpZiAocmVzdWx0cyAhPT0gdW5kZWZpbmVkICYmIG1ldGE/LmVycm9yUG9saWN5ID09PSAnc29mdCcpIHJldHVybjtcblxuICAgIHJldHVybiBtZXRhPy5lcnJvciBhcyBhbnk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIChnbG9iYWxseSByZWZlcmVudGlhbGx5IHN0YWJsZSkgcmVzcG9uc2UgZm9yIGEgZ2l2ZW4gZW5kcG9pbnQvYXJncyBwYWlyIGZyb20gc3RhdGUgZ2l2ZW4uXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRSZXNwb25zZVxuICAgKi9cbiAgZ2V0UmVzcG9uc2UgPSA8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknIHwgJ3NjaGVtYScgfCAnaW52YWxpZElmU3RhbGUnPixcbiAgICBBcmdzIGV4dGVuZHMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiBbLi4uQXJncywgU3RhdGU8dW5rbm93bj5dXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgfSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV0gYXMgU3RhdGU8dW5rbm93bj47XG4gICAgLy8gdGhpcyBpcyB0eXBlc2NyaXB0IGdlbmVyaWNzIGJyZWFraW5nXG4gICAgY29uc3QgYXJnczogYW55ID0gcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RVsna2V5J10+O1xuICAgIGNvbnN0IGlzQWN0aXZlID0gYXJncy5sZW5ndGggIT09IDEgfHwgYXJnc1swXSAhPT0gbnVsbDtcbiAgICBjb25zdCBrZXkgPSBpc0FjdGl2ZSA/IGVuZHBvaW50LmtleSguLi5hcmdzKSA6ICcnO1xuICAgIGNvbnN0IGNhY2hlUmVzdWx0cyA9IGlzQWN0aXZlID8gc3RhdGUucmVzdWx0c1trZXldIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNjaGVtYSA9IGVuZHBvaW50LnNjaGVtYTtcbiAgICBjb25zdCBtZXRhID0gc2VsZWN0TWV0YShzdGF0ZSwga2V5KTtcbiAgICBsZXQgZXhwaXJlc0F0ID0gbWV0YT8uZXhwaXJlc0F0O1xuXG4gICAgbGV0IGludmFsaWRSZXN1bHRzID0gZmFsc2U7XG4gICAgbGV0IHJlc3VsdHM7XG4gICAgaWYgKGNhY2hlUmVzdWx0cyA9PT0gdW5kZWZpbmVkICYmIGVuZHBvaW50LnNjaGVtYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHRzID0gaW5mZXJSZXN1bHRzKFxuICAgICAgICBlbmRwb2ludC5zY2hlbWEsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXRlLmluZGV4ZXMsXG4gICAgICAgIHN0YXRlLmVudGl0aWVzLFxuICAgICAgKTtcbiAgICAgIGludmFsaWRSZXN1bHRzID0gIXZhbGlkYXRlSW5mZXJlbmNlKHJlc3VsdHMpO1xuICAgICAgaWYgKCFleHBpcmVzQXQgJiYgaW52YWxpZFJlc3VsdHMpIGV4cGlyZXNBdCA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdHMgPSBjYWNoZVJlc3VsdHM7XG4gICAgfVxuXG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogcmVzdWx0cyBhcyBhbnksXG4gICAgICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzLlZhbGlkLFxuICAgICAgICBleHBpcmVzQXQ6IEluZmluaXR5LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIWVuZHBvaW50LnNjaGVtYSB8fCAhc2NoZW1hSGFzRW50aXR5KGVuZHBvaW50LnNjaGVtYSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3VsdHMsXG4gICAgICAgIGV4cGlyeVN0YXR1czogbWV0YT8uaW52YWxpZGF0ZWRcbiAgICAgICAgICA/IEV4cGlyeVN0YXR1cy5JbnZhbGlkXG4gICAgICAgICAgOiBjYWNoZVJlc3VsdHMgJiYgIWVuZHBvaW50LmludmFsaWRJZlN0YWxlXG4gICAgICAgICAgPyBFeHBpcnlTdGF0dXMuVmFsaWRcbiAgICAgICAgICA6IEV4cGlyeVN0YXR1cy5JbnZhbGlkSWZTdGFsZSxcbiAgICAgICAgZXhwaXJlc0F0OiBleHBpcmVzQXQgfHwgMCxcbiAgICAgIH0gYXMge1xuICAgICAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICAgICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZ2xvYmFsQ2FjaGUucmVzdWx0c1trZXldKVxuICAgICAgdGhpcy5nbG9iYWxDYWNoZS5yZXN1bHRzW2tleV0gPSBuZXcgV2Vha0VudGl0eU1hcCgpO1xuXG4gICAgLy8gc2Vjb25kIGFyZ3VtZW50IGlzIGZhbHNlIGlmIGFueSBlbnRpdGllcyBhcmUgbWlzc2luZ1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBjb25zdCB7IGRhdGEsIHBhdGhzIH0gPSBkZW5vcm1hbGl6ZUNhY2hlZChcbiAgICAgIHJlc3VsdHMsXG4gICAgICBzY2hlbWEsXG4gICAgICBzdGF0ZS5lbnRpdGllcyxcbiAgICAgIHRoaXMuZ2xvYmFsQ2FjaGUuZW50aXRpZXMsXG4gICAgICB0aGlzLmdsb2JhbENhY2hlLnJlc3VsdHNba2V5XSxcbiAgICAgIGFyZ3MsXG4gICAgKSBhcyB7IGRhdGE6IERlbm9ybWFsaXplTnVsbGFibGU8RVsnc2NoZW1hJ10+OyBwYXRoczogUGF0aFtdIH07XG4gICAgY29uc3QgaW52YWxpZERlbm9ybWFsaXplID0gdHlwZW9mIGRhdGEgPT09ICdzeW1ib2wnO1xuXG4gICAgLy8gZmFsbGJhY2sgdG8gZW50aXR5IGV4cGlyeSB0aW1lXG4gICAgaWYgKCFleHBpcmVzQXQpIHtcbiAgICAgIGV4cGlyZXNBdCA9IGVudGl0eUV4cGlyZXNBdChwYXRocywgc3RhdGUuZW50aXR5TWV0YSk7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9jb25jZXB0cy9leHBpcnktcG9saWN5I2V4cGlyeS1zdGF0dXNcbiAgICAvLyB3ZSBkb24ndCB0cmFjayB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YWxlIG9yIGZyZXNoIGJlY2F1c2UgdGhhdCBpcyB0aWVkIHRvIHRyaWdnZXJpbmdcbiAgICAvLyBjb25kaXRpb25zXG4gICAgY29uc3QgZXhwaXJ5U3RhdHVzID1cbiAgICAgIG1ldGE/LmludmFsaWRhdGVkIHx8IChpbnZhbGlkRGVub3JtYWxpemUgJiYgIW1ldGE/LmVycm9yKVxuICAgICAgICA/IEV4cGlyeVN0YXR1cy5JbnZhbGlkXG4gICAgICAgIDogaW52YWxpZERlbm9ybWFsaXplIHx8IGVuZHBvaW50LmludmFsaWRJZlN0YWxlIHx8IGludmFsaWRSZXN1bHRzXG4gICAgICAgID8gRXhwaXJ5U3RhdHVzLkludmFsaWRJZlN0YWxlXG4gICAgICAgIDogRXhwaXJ5U3RhdHVzLlZhbGlkO1xuXG4gICAgcmV0dXJuIHsgZGF0YSwgZXhwaXJ5U3RhdHVzLCBleHBpcmVzQXQgfTtcbiAgfTtcbn1cblxuLy8gYmVuY2htYXJrOiBodHRwczovL3d3dy5tZWFzdXJldGhhdC5uZXQvQmVuY2htYXJrcy9TaG93LzI0NjkxLzAvbWluLXJlZHVjZXItdnMtaW1wZXJhdGl2ZS13aXRoLXBhdGhzXG4vLyBlYXJsaWVzdCBleHBpcnkgZGljdGF0ZXMgYWdlXG5mdW5jdGlvbiBlbnRpdHlFeHBpcmVzQXQoXG4gIHBhdGhzOiBQYXRoW10sXG4gIGVudGl0eU1ldGE6IHtcbiAgICByZWFkb25seSBbZW50aXR5S2V5OiBzdHJpbmddOiB7XG4gICAgICByZWFkb25seSBbcGs6IHN0cmluZ106IHtcbiAgICAgICAgcmVhZG9ubHkgZGF0ZTogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgZmV0Y2hlZEF0OiBudW1iZXI7IC8vIFRoaXMgaXMgb25seSB0aGUgdmFsdWUgdW50aWwgaXQgaXMgc2V0IGJ5IHRoZSBDYWNoZVByb3ZpZGVyXG4gICAgICB9O1xuICAgIH07XG4gIH0sXG4pIHtcbiAgbGV0IGV4cGlyZXNBdCA9IEluZmluaXR5O1xuICBmb3IgKGNvbnN0IHsgcGssIGtleSB9IG9mIHBhdGhzKSB7XG4gICAgY29uc3QgZW50aXR5RXhwaXJ5ID0gZW50aXR5TWV0YVtrZXldPy5bcGtdPy5leHBpcmVzQXQ7XG4gICAgLy8gZXhwaXJlc0F0IHdpbGwgYWx3YXlzIHJlc29sdmUgdG8gZmFsc2Ugd2l0aCBhbnkgY29tcGFyaXNvblxuICAgIGlmIChlbnRpdHlFeHBpcnkgPCBleHBpcmVzQXQpIGV4cGlyZXNBdCA9IGVudGl0eUV4cGlyeTtcbiAgfVxuICByZXR1cm4gZXhwaXJlc0F0O1xufVxuXG4vKiogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNjaGVtYSBoYXMgYW55IGVudGl0aWVzLlxuICpcbiAqIFdpdGhvdXQgZW50aXRpZXMsIGRlbm9ybWFsaXphdGlvbiBpcyBub3QgbmVlZGVkLCBhbmQgcmVzdWx0cyBzaG91bGQgbm90IGJlIGluZmVycmVkLlxuICovXG5mdW5jdGlvbiBzY2hlbWFIYXNFbnRpdHkoc2NoZW1hOiBTY2hlbWEpOiBib29sZWFuIHtcbiAgaWYgKGlzRW50aXR5KHNjaGVtYSkpIHJldHVybiB0cnVlO1xuICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKVxuICAgIHJldHVybiBzY2hlbWEubGVuZ3RoICE9PSAwICYmIHNjaGVtYUhhc0VudGl0eShzY2hlbWFbMF0pO1xuICBpZiAoc2NoZW1hICYmICh0eXBlb2Ygc2NoZW1hID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygc2NoZW1hID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNvbnN0IG5lc3RlZFNjaGVtYSA9XG4gICAgICAnc2NoZW1hJyBpbiBzY2hlbWEgPyAoc2NoZW1hLnNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBTY2hlbWE+KSA6IHNjaGVtYTtcbiAgICBpZiAodHlwZW9mIG5lc3RlZFNjaGVtYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHNjaGVtYUhhc0VudGl0eShuZXN0ZWRTY2hlbWEpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhuZXN0ZWRTY2hlbWEpLnNvbWUoeCA9PiBzY2hlbWFIYXNFbnRpdHkoeCkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IHR5cGUgeyBFcnJvclR5cGVzIH07XG5cbmNsYXNzIFNuYXBzaG90PFQgPSB1bmtub3duPiBpbXBsZW1lbnRzIFNuYXBzaG90SW50ZXJmYWNlIHtcbiAgcHJpdmF0ZSBzdGF0ZTogU3RhdGU8VD47XG4gIHByaXZhdGUgY29udHJvbGxlcjogQ29udHJvbGxlcjtcbiAgcmVhZG9ubHkgZmV0Y2hlZEF0OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoY29udHJvbGxlcjogQ29udHJvbGxlciwgc3RhdGU6IFN0YXRlPFQ+LCBmZXRjaGVkQXQgPSAwKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgdGhpcy5mZXRjaGVkQXQgPSBmZXRjaGVkQXQ7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqIERhdGEgQWNjZXNzICoqKioqKioqKioqKioqKi9cbiAgLyoqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvU25hcHNob3QjZ2V0UmVzcG9uc2UgKi9cbiAgZ2V0UmVzcG9uc2UgPSA8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknIHwgJ3NjaGVtYScgfCAnaW52YWxpZElmU3RhbGUnPixcbiAgICBBcmdzIGV4dGVuZHMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiBBcmdzXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgfSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRSZXNwb25zZShlbmRwb2ludCwgLi4uYXJncywgdGhpcy5zdGF0ZSk7XG4gIH07XG5cbiAgLyoqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvU25hcHNob3QjZ2V0RXJyb3IgKi9cbiAgZ2V0RXJyb3IgPSA8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknPixcbiAgICBBcmdzIGV4dGVuZHMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiBBcmdzXG4gICk6IEVycm9yVHlwZXMgfCB1bmRlZmluZWQgPT4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0RXJyb3IoZW5kcG9pbnQsIC4uLmFyZ3MsIHRoaXMuc3RhdGUpO1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFPQSxTQUNFQSxhQUFhLEVBQ2JDLFlBQVksRUFNWkMsaUJBQWlCLEVBQ2pCQyxRQUFRLEVBQ1JDLFdBQVcsUUFDTix3QkFBd0I7QUFDL0IsU0FBU0MsWUFBWSxFQUFFQyxpQkFBaUIsUUFBUSx3QkFBd0I7QUFFeEUsT0FBT0MsZUFBZSxNQUFNLHNCQUFzQjtBQUNsRCxPQUFPQyxXQUFXLE1BQU0sa0JBQWtCO0FBQzFDLE9BQU9DLGdCQUFnQixNQUFNLHVCQUF1QjtBQUNwRCxPQUFPQyxtQkFBbUIsTUFBTSwwQkFBMEI7QUFDMUQsT0FBT0MsV0FBVyxNQUFNLGtCQUFrQjtBQUMxQyxPQUFPQyxTQUFTLE1BQU0sZ0JBQWdCO0FBQ3RDLFNBQ0VDLG9CQUFvQixFQUNwQkMsa0JBQWtCLFFBQ2IseUJBQXlCO0FBRWhDLFNBQVNDLFlBQVksUUFBUSxtQ0FBbUM7QUFDaEUsT0FBT0MsVUFBVSxNQUFNLHdCQUF3QjtBQVkvQyxNQUFNQyxhQUFhLEdBQUlDLE1BQWUsSUFBb0I7RUFDeEQsTUFBTSxJQUFJQyxLQUFLLENBQ1osaUVBQWdFLEdBQzlELHlEQUNMLENBQUM7QUFDSCxDQUFDO0FBQ0QsTUFBTUMsVUFBVSxHQUFHQSxDQUFBLEtBQXNCO0VBQ3ZDO0VBQ0E7RUFDQSxPQUFPTCxZQUFZO0FBQ3JCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE1BQU1NLFVBQVUsQ0FFN0I7RUFDQTtBQUNGO0FBQ0E7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
311
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXZWFrRW50aXR5TWFwIiwiRXhwaXJ5U3RhdHVzIiwiZGVub3JtYWxpemVDYWNoZWQiLCJpc0VudGl0eSIsImRlbm9ybWFsaXplIiwiaW5mZXJSZXN1bHRzIiwidmFsaWRhdGVJbmZlcmVuY2UiLCJjcmVhdGVFeHBpcmVBbGwiLCJjcmVhdGVGZXRjaCIsImNyZWF0ZUludmFsaWRhdGUiLCJjcmVhdGVJbnZhbGlkYXRlQWxsIiwiY3JlYXRlUmVzZXQiLCJjcmVhdGVTZXQiLCJjcmVhdGVVbnN1YnNjcmlwdGlvbiIsImNyZWF0ZVN1YnNjcmlwdGlvbiIsImluaXRpYWxTdGF0ZSIsInNlbGVjdE1ldGEiLCJ1bnNldERpc3BhdGNoIiwiYWN0aW9uIiwiRXJyb3IiLCJ1bnNldFN0YXRlIiwiQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiZGlzcGF0Y2giLCJnZXRTdGF0ZSIsImdsb2JhbENhY2hlIiwiZW50aXRpZXMiLCJyZXN1bHRzIiwiZmV0Y2giLCJlbmRwb2ludCIsImFyZ3MiLCJzY2hlbWEiLCJtZXRhIiwicHJvbWlzZSIsInRoZW4iLCJpbnB1dCIsImZldGNoSWZTdGFsZSIsImRhdGEiLCJleHBpcmVzQXQiLCJleHBpcnlTdGF0dXMiLCJnZXRSZXNwb25zZSIsIkludmFsaWQiLCJEYXRlIiwibm93IiwiaW52YWxpZGF0ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiaW52YWxpZGF0ZUFsbCIsIm9wdGlvbnMiLCJrZXkiLCJ0ZXN0S2V5IiwiZXhwaXJlQWxsIiwicmVzZXRFbnRpcmVTdG9yZSIsInNldFJlc3BvbnNlIiwicmVzdCIsInJlc3BvbnNlIiwibGVuZ3RoIiwic2xpY2UiLCJyZWNlaXZlIiwic2V0RXJyb3IiLCJlcnJvciIsInJlY2VpdmVFcnJvciIsInN1YnNjcmliZSIsInVuc3Vic2NyaWJlIiwic25hcHNob3QiLCJzdGF0ZSIsImZldGNoZWRBdCIsIlNuYXBzaG90IiwiZ2V0RXJyb3IiLCJ1bmRlZmluZWQiLCJlcnJvclBvbGljeSIsImlzQWN0aXZlIiwiY2FjaGVSZXN1bHRzIiwiaW52YWxpZFJlc3VsdHMiLCJpbmRleGVzIiwiVmFsaWQiLCJJbmZpbml0eSIsInNjaGVtYUhhc0VudGl0eSIsImludmFsaWRhdGVkIiwiaW52YWxpZElmU3RhbGUiLCJJbnZhbGlkSWZTdGFsZSIsInBhdGhzIiwiaW52YWxpZERlbm9ybWFsaXplIiwiZW50aXR5RXhwaXJlc0F0IiwiZW50aXR5TWV0YSIsInBrIiwiX2VudGl0eU1ldGEka2V5IiwiX2VudGl0eU1ldGEka2V5JHBrIiwiZW50aXR5RXhwaXJ5IiwiQXJyYXkiLCJpc0FycmF5IiwibmVzdGVkU2NoZW1hIiwiT2JqZWN0IiwidmFsdWVzIiwic29tZSIsIngiLCJjb250cm9sbGVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyb2xsZXIvQ29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEVycm9yVHlwZXMsXG4gIFNuYXBzaG90SW50ZXJmYWNlLFxuICBEZW5vcm1hbGl6ZUNhY2hlLFxuICBTY2hlbWEsXG4gIERlbm9ybWFsaXplLFxufSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcbmltcG9ydCB7XG4gIFdlYWtFbnRpdHlNYXAsXG4gIEV4cGlyeVN0YXR1cyxcbiAgRW5kcG9pbnRJbnRlcmZhY2UsXG4gIEZldGNoRnVuY3Rpb24sXG4gIFJlc29sdmVUeXBlLFxuICBEZW5vcm1hbGl6ZU51bGxhYmxlLFxuICBQYXRoLFxuICBkZW5vcm1hbGl6ZUNhY2hlZCxcbiAgaXNFbnRpdHksXG4gIGRlbm9ybWFsaXplLFxufSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcbmltcG9ydCB7IGluZmVyUmVzdWx0cywgdmFsaWRhdGVJbmZlcmVuY2UgfSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcblxuaW1wb3J0IGNyZWF0ZUV4cGlyZUFsbCBmcm9tICcuL2NyZWF0ZUV4cGlyZUFsbC5qcyc7XG5pbXBvcnQgY3JlYXRlRmV0Y2ggZnJvbSAnLi9jcmVhdGVGZXRjaC5qcyc7XG5pbXBvcnQgY3JlYXRlSW52YWxpZGF0ZSBmcm9tICcuL2NyZWF0ZUludmFsaWRhdGUuanMnO1xuaW1wb3J0IGNyZWF0ZUludmFsaWRhdGVBbGwgZnJvbSAnLi9jcmVhdGVJbnZhbGlkYXRlQWxsLmpzJztcbmltcG9ydCBjcmVhdGVSZXNldCBmcm9tICcuL2NyZWF0ZVJlc2V0LmpzJztcbmltcG9ydCBjcmVhdGVTZXQgZnJvbSAnLi9jcmVhdGVTZXQuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlVW5zdWJzY3JpcHRpb24sXG4gIGNyZWF0ZVN1YnNjcmlwdGlvbixcbn0gZnJvbSAnLi9jcmVhdGVTdWJzY3JpcHRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBpbml0aWFsU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9yZWR1Y2VyL2NyZWF0ZVJlZHVjZXIuanMnO1xuaW1wb3J0IHNlbGVjdE1ldGEgZnJvbSAnLi4vc3RhdGUvc2VsZWN0TWV0YS5qcyc7XG5pbXBvcnQgdHlwZSB7IEFjdGlvblR5cGVzLCBTdGF0ZSB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgR2VuZXJpY0Rpc3BhdGNoID0gKHZhbHVlOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG5leHBvcnQgdHlwZSBEYXRhQ2xpZW50RGlzcGF0Y2ggPSAodmFsdWU6IEFjdGlvblR5cGVzKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5pbnRlcmZhY2UgQ29uc3RydWN0b3JQcm9wczxEIGV4dGVuZHMgR2VuZXJpY0Rpc3BhdGNoID0gRGF0YUNsaWVudERpc3BhdGNoPiB7XG4gIGRpc3BhdGNoPzogRDtcbiAgZ2V0U3RhdGU/OiAoKSA9PiBTdGF0ZTx1bmtub3duPjtcbiAgZ2xvYmFsQ2FjaGU/OiBEZW5vcm1hbGl6ZUNhY2hlO1xufVxuXG5jb25zdCB1bnNldERpc3BhdGNoID0gKGFjdGlvbjogdW5rbm93bik6IFByb21pc2U8dm9pZD4gPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERpc3BhdGNoaW5nIHdoaWxlIGNvbnN0cnVjdGluZyB5b3VyIG1pZGRsZXdhcmUgaXMgbm90IGFsbG93ZWQuIGAgK1xuICAgICAgYE90aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC5gLFxuICApO1xufTtcbmNvbnN0IHVuc2V0U3RhdGUgPSAoKTogU3RhdGU8dW5rbm93bj4gPT4ge1xuICAvLyBUaGlzIGlzIG9ubHkgdGhlIHZhbHVlIHVudGlsIGl0IGlzIHNldCBieSB0aGUgQ2FjaGVQcm92aWRlclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gaW5pdGlhbFN0YXRlO1xufTtcblxuLyoqXG4gKiBJbXBlcmF0aXZlIGNvbnRyb2wgb2YgUmVzdCBIb29rcyBzdG9yZVxuICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRyb2xsZXI8XG4gIEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBEYXRhQ2xpZW50RGlzcGF0Y2gsXG4+IHtcbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uIHRvIFJlc3QgSG9va3MgcmVkdWNlci5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2Rpc3BhdGNoXG4gICAqL1xuICBkZWNsYXJlIHJlYWRvbmx5IGRpc3BhdGNoOiBEO1xuICAvKipcbiAgICogR2V0cyB0aGUgbGF0ZXN0IHN0YXRlIHNuYXBzaG90IHRoYXQgaXMgZnVsbHkgY29tbWl0dGVkLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGltcGVyYXRpdmUgdXNlLWNhc2VzIGxpa2UgZXZlbnQgaGFuZGxlcnMuXG4gICAqIFRoaXMgc2hvdWxkICpub3QqIGJlIHVzZWQgdG8gcmVuZGVyOyBpbnN0ZWFkIHVzZVN1c3BlbnNlKCkgb3IgdXNlQ2FjaGUoKVxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0U3RhdGVcbiAgICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgZ2V0U3RhdGU6ICgpID0+IFN0YXRlPHVua25vd24+O1xuICBkZWNsYXJlIHJlYWRvbmx5IGdsb2JhbENhY2hlOiBEZW5vcm1hbGl6ZUNhY2hlO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBkaXNwYXRjaCA9IHVuc2V0RGlzcGF0Y2ggYXMgYW55LFxuICAgIGdldFN0YXRlID0gdW5zZXRTdGF0ZSxcbiAgICBnbG9iYWxDYWNoZSA9IHtcbiAgICAgIGVudGl0aWVzOiB7fSxcbiAgICAgIHJlc3VsdHM6IHt9LFxuICAgIH0sXG4gIH06IENvbnN0cnVjdG9yUHJvcHM8RD4gPSB7fSkge1xuICAgIHRoaXMuZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbiAgICB0aGlzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG4gICAgdGhpcy5nbG9iYWxDYWNoZSA9IGdsb2JhbENhY2hlO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBBY3Rpb24gRGlzcGF0Y2hlcnMgKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBlbmRwb2ludCB3aXRoIGdpdmVuIGFyZ3MsIHVwZGF0aW5nIHRoZSBSZXN0IEhvb2tzIGNhY2hlIHdpdGggdGhlIHJlc3BvbnNlIG9yIGVycm9yIHVwb24gY29tcGxldGlvbi5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2ZldGNoXG4gICAqL1xuICBmZXRjaCA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7IHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT4gfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKTogRVsnc2NoZW1hJ10gZXh0ZW5kcyB1bmRlZmluZWQgfCBudWxsXG4gICAgPyBSZXR1cm5UeXBlPEU+XG4gICAgOiBQcm9taXNlPERlbm9ybWFsaXplPEVbJ3NjaGVtYSddPj4gPT4ge1xuICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZUZldGNoKGVuZHBvaW50LCB7XG4gICAgICBhcmdzLFxuICAgIH0pO1xuICAgIHRoaXMuZGlzcGF0Y2goYWN0aW9uKTtcblxuICAgIGlmIChlbmRwb2ludC5zY2hlbWEpIHtcbiAgICAgIHJldHVybiBhY3Rpb24ubWV0YS5wcm9taXNlLnRoZW4oaW5wdXQgPT5cbiAgICAgICAgZGVub3JtYWxpemUoaW5wdXQsIGVuZHBvaW50LnNjaGVtYSwge30sIGFyZ3MpLFxuICAgICAgKSBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBhY3Rpb24ubWV0YS5wcm9taXNlIGFzIGFueTtcbiAgfTtcblxuICAvKipcbiAgICogRmV0Y2hlcyBvbmx5IGlmIGVuZHBvaW50IGlzIGNvbnNpZGVyZWQgJ3N0YWxlJzsgb3RoZXJ3aXNlIHJldHVybnMgdW5kZWZpbmVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZmV0Y2hJZlN0YWxlXG4gICAqL1xuICBmZXRjaElmU3RhbGUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYgeyB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+IH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dXG4gICk6IEVbJ3NjaGVtYSddIGV4dGVuZHMgdW5kZWZpbmVkIHwgbnVsbFxuICAgID8gUmV0dXJuVHlwZTxFPiB8IFJlc29sdmVUeXBlPEU+XG4gICAgOiBQcm9taXNlPERlbm9ybWFsaXplPEVbJ3NjaGVtYSddPj4gfCBEZW5vcm1hbGl6ZTxFWydzY2hlbWEnXT4gPT4ge1xuICAgIGNvbnN0IHsgZGF0YSwgZXhwaXJlc0F0LCBleHBpcnlTdGF0dXMgfSA9IHRoaXMuZ2V0UmVzcG9uc2UoXG4gICAgICBlbmRwb2ludCxcbiAgICAgIC4uLmFyZ3MsXG4gICAgICB0aGlzLmdldFN0YXRlKCksXG4gICAgKTtcbiAgICBpZiAoZXhwaXJ5U3RhdHVzICE9PSBFeHBpcnlTdGF0dXMuSW52YWxpZCAmJiBEYXRlLm5vdygpIDw9IGV4cGlyZXNBdClcbiAgICAgIHJldHVybiBkYXRhIGFzIGFueTtcbiAgICByZXR1cm4gdGhpcy5mZXRjaChlbmRwb2ludCwgLi4uYXJncyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZvcmNlcyByZWZldGNoaW5nIGFuZCBzdXNwZW5zZSBvbiB1c2VTdXNwZW5zZSB3aXRoIHRoZSBzYW1lIEVuZHBvaW50IGFuZCBwYXJhbWV0ZXJzLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjaW52YWxpZGF0ZVxuICAgKi9cbiAgaW52YWxpZGF0ZSA9IDxFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSB8IHJlYWRvbmx5IFtudWxsXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgYXJnc1swXSAhPT0gbnVsbFxuICAgICAgPyB0aGlzLmRpc3BhdGNoKFxuICAgICAgICAgIGNyZWF0ZUludmFsaWRhdGUoZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MgYXMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKlxuICAgKiBGb3JjZXMgcmVmZXRjaGluZyBhbmQgc3VzcGVuc2Ugb24gdXNlU3VzcGVuc2Ugb24gYWxsIG1hdGNoaW5nIGVuZHBvaW50IHJlc3VsdCBrZXlzLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjaW52YWxpZGF0ZUFsbFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbnZhbGlkYXRpb24gaXMgY29tbWl0ZWQuXG4gICAqL1xuICBpbnZhbGlkYXRlQWxsID0gKG9wdGlvbnM6IHsgdGVzdEtleTogKGtleTogc3RyaW5nKSA9PiBib29sZWFuIH0pID0+XG4gICAgdGhpcy5kaXNwYXRjaChjcmVhdGVJbnZhbGlkYXRlQWxsKChrZXk6IHN0cmluZykgPT4gb3B0aW9ucy50ZXN0S2V5KGtleSkpKTtcblxuICAvKipcbiAgICogU2V0cyBhbGwgbWF0Y2hpbmcgZW5kcG9pbnQgcmVzdWx0IGtleXMgdG8gYmUgU1RBTEUuXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZXhwaXJlQWxsXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGV4cGlyeSBpcyBjb21taXRlZC4gKk5PVCogZmV0Y2ggcHJvbWlzZVxuICAgKi9cbiAgZXhwaXJlQWxsID0gKG9wdGlvbnM6IHsgdGVzdEtleTogKGtleTogc3RyaW5nKSA9PiBib29sZWFuIH0pID0+XG4gICAgdGhpcy5kaXNwYXRjaChjcmVhdGVFeHBpcmVBbGwoKGtleTogc3RyaW5nKSA9PiBvcHRpb25zLnRlc3RLZXkoa2V5KSkpO1xuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGVudGlyZSBSZXN0IEhvb2tzIGNhY2hlLiBBbGwgaW5mbGlnaHQgcmVxdWVzdHMgd2lsbCBub3QgcmVzb2x2ZS5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3Jlc2V0RW50aXJlU3RvcmVcbiAgICovXG4gIHJlc2V0RW50aXJlU3RvcmUgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB0aGlzLmRpc3BhdGNoKGNyZWF0ZVJlc2V0KCkpO1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgcmVzcG9uc2UgaW4gY2FjaGUgZm9yIGdpdmVuIEVuZHBvaW50IGFuZCBhcmdzLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0XG4gICAqL1xuICBzZXRSZXNwb25zZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIGFueV1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFJlc29sdmVUeXBlPEU+ID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZVNldChlbmRwb2ludCwge1xuICAgICAgYXJnczogcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RT4sXG4gICAgICByZXNwb25zZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChhY3Rpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzZXRSZXNwb25zZSBpbnN0ZWFkXG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyByZWNlaXZlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgYW55XVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB0aGlzLnNldFJlc3BvbnNlKGVuZHBvaW50LCAuLi5yZXN0KTtcbiAgfTtcblxuICAvKipcbiAgICogU3RvcmVzIHRoZSByZXN1bHQgb2YgRW5kcG9pbnQgYW5kIGFyZ3MgYXMgdGhlIGVycm9yIHByb3ZpZGVkLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0RXJyb3JcbiAgICovXG4gIHNldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgRXJyb3JdXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBFcnJvciA9IHJlc3RbcmVzdC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVTZXQoZW5kcG9pbnQsIHtcbiAgICAgIGFyZ3M6IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEU+LFxuICAgICAgcmVzcG9uc2UsXG4gICAgICBlcnJvcjogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChhY3Rpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBbm90aGVyIG5hbWUgZm9yIHNldEVycm9yXG4gICAqIEBkZXByZWNhdGVkIHVzZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldEVycm9yIGluc3RlYWRcbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIHJlY2VpdmVFcnJvciA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIEVycm9yXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB0aGlzLnNldEVycm9yKGVuZHBvaW50LCAuLi5yZXN0KTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW4gaW5mbGlnaHQgZmV0Y2guIGBmZXRjaGVkQXRgIHNob3VsZCBgZmV0Y2hgJ3MgYGNyZWF0ZWRBdGBcbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3Jlc29sdmVcbiAgICovXG4gIHJlc29sdmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgICAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbiAgICB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIG1ldGE6XG4gICAgICB8IHtcbiAgICAgICAgICBhcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl07XG4gICAgICAgICAgcmVzcG9uc2U6IEVycm9yO1xuICAgICAgICAgIGZldGNoZWRBdDogbnVtYmVyO1xuICAgICAgICAgIGVycm9yOiB0cnVlO1xuICAgICAgICB9XG4gICAgICB8IHtcbiAgICAgICAgICBhcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl07XG4gICAgICAgICAgcmVzcG9uc2U6IGFueTtcbiAgICAgICAgICBmZXRjaGVkQXQ6IG51bWJlcjtcbiAgICAgICAgICBlcnJvcj86IGZhbHNlO1xuICAgICAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChjcmVhdGVTZXQoZW5kcG9pbnQsIG1ldGEgYXMgYW55KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1hcmtzIGEgbmV3IHN1YnNjcmlwdGlvbiB0byBhIGdpdmVuIEVuZHBvaW50LlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc3Vic2NyaWJlXG4gICAqL1xuICBzdWJzY3JpYmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPFxuICAgICAgRmV0Y2hGdW5jdGlvbixcbiAgICAgIFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCB8IGZhbHNlXG4gICAgPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIGFyZ3NbMF0gIT09IG51bGxcbiAgICAgID8gdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICBjcmVhdGVTdWJzY3JpcHRpb24oZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MgYXMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKlxuICAgKiBNYXJrcyBjb21wbGV0aW9uIG9mIHN1YnNjcmlwdGlvbiB0byBhIGdpdmVuIEVuZHBvaW50LlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjdW5zdWJzY3JpYmVcbiAgICovXG4gIHVuc3Vic2NyaWJlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZTxcbiAgICAgIEZldGNoRnVuY3Rpb24sXG4gICAgICBTY2hlbWEgfCB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQgfCBmYWxzZVxuICAgID4sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IFByb21pc2U8dm9pZD4gPT5cbiAgICBhcmdzWzBdICE9PSBudWxsXG4gICAgICA/IHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICAgY3JlYXRlVW5zdWJzY3JpcHRpb24oZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MgYXMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKioqKioqKioqKioqKiogTW9yZSAqKioqKioqKioqKioqKiovXG5cbiAgLyogVE9ETzpcbiAgYWJvcnQgPSA8RSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKTogUHJvbWlzZTx2b2lkPlxuICAqL1xuXG4gIC8qKlxuICAgKiBHZXRzIGEgc25hcHNob3QgKGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL1NuYXBzaG90KVxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc25hcHNob3RcbiAgICovXG4gIHNuYXBzaG90ID0gKHN0YXRlOiBTdGF0ZTx1bmtub3duPiwgZmV0Y2hlZEF0PzogbnVtYmVyKTogU25hcHNob3RJbnRlcmZhY2UgPT4ge1xuICAgIHJldHVybiBuZXcgU25hcHNob3QodGhpcywgc3RhdGUsIGZldGNoZWRBdCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVycm9yLCBpZiBhbnksIGZvciBhIGdpdmVuIGVuZHBvaW50LiBSZXR1cm5zIHVuZGVmaW5lZCBmb3Igbm8gZXJyb3JzLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0RXJyb3JcbiAgICovXG4gIGdldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5Jz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0gfCByZWFkb25seSBbbnVsbF0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogWy4uLkFyZ3MsIFN0YXRlPHVua25vd24+XVxuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAocmVzdFswXSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXRlID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdIGFzIFN0YXRlPHVua25vd24+O1xuICAgIC8vIHRoaXMgaXMgdHlwZXNjcmlwdCBnZW5lcmljcyBicmVha2luZ1xuICAgIGNvbnN0IGFyZ3M6IGFueSA9IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEVbJ2tleSddPjtcbiAgICBjb25zdCBrZXkgPSBlbmRwb2ludC5rZXkoLi4uYXJncyk7XG5cbiAgICBjb25zdCBtZXRhID0gc2VsZWN0TWV0YShzdGF0ZSwga2V5KTtcbiAgICBjb25zdCByZXN1bHRzID0gc3RhdGUucmVzdWx0c1trZXldO1xuXG4gICAgaWYgKHJlc3VsdHMgIT09IHVuZGVmaW5lZCAmJiBtZXRhPy5lcnJvclBvbGljeSA9PT0gJ3NvZnQnKSByZXR1cm47XG5cbiAgICByZXR1cm4gbWV0YT8uZXJyb3IgYXMgYW55O1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSAoZ2xvYmFsbHkgcmVmZXJlbnRpYWxseSBzdGFibGUpIHJlc3BvbnNlIGZvciBhIGdpdmVuIGVuZHBvaW50L2FyZ3MgcGFpciBmcm9tIHN0YXRlIGdpdmVuLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0UmVzcG9uc2VcbiAgICovXG4gIGdldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5JyB8ICdzY2hlbWEnIHwgJ2ludmFsaWRJZlN0YWxlJz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0gfCByZWFkb25seSBbbnVsbF0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogWy4uLkFyZ3MsIFN0YXRlPHVua25vd24+XVxuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH0gPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdIGFzIFN0YXRlPHVua25vd24+O1xuICAgIC8vIHRoaXMgaXMgdHlwZXNjcmlwdCBnZW5lcmljcyBicmVha2luZ1xuICAgIGNvbnN0IGFyZ3M6IGFueSA9IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEVbJ2tleSddPjtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IGFyZ3MubGVuZ3RoICE9PSAxIHx8IGFyZ3NbMF0gIT09IG51bGw7XG4gICAgY29uc3Qga2V5ID0gaXNBY3RpdmUgPyBlbmRwb2ludC5rZXkoLi4uYXJncykgOiAnJztcbiAgICBjb25zdCBjYWNoZVJlc3VsdHMgPSBpc0FjdGl2ZSA/IHN0YXRlLnJlc3VsdHNba2V5XSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzY2hlbWEgPSBlbmRwb2ludC5zY2hlbWE7XG4gICAgY29uc3QgbWV0YSA9IHNlbGVjdE1ldGEoc3RhdGUsIGtleSk7XG4gICAgbGV0IGV4cGlyZXNBdCA9IG1ldGE/LmV4cGlyZXNBdDtcblxuICAgIGxldCBpbnZhbGlkUmVzdWx0cyA9IGZhbHNlO1xuICAgIGxldCByZXN1bHRzO1xuICAgIGlmIChjYWNoZVJlc3VsdHMgPT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5zY2hlbWEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0cyA9IGluZmVyUmVzdWx0cyhcbiAgICAgICAgZW5kcG9pbnQuc2NoZW1hLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdGF0ZS5pbmRleGVzLFxuICAgICAgICBzdGF0ZS5lbnRpdGllcyxcbiAgICAgICk7XG4gICAgICBpbnZhbGlkUmVzdWx0cyA9ICF2YWxpZGF0ZUluZmVyZW5jZShyZXN1bHRzKTtcbiAgICAgIGlmICghZXhwaXJlc0F0ICYmIGludmFsaWRSZXN1bHRzKSBleHBpcmVzQXQgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRzID0gY2FjaGVSZXN1bHRzO1xuICAgIH1cblxuICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3VsdHMgYXMgYW55LFxuICAgICAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cy5WYWxpZCxcbiAgICAgICAgZXhwaXJlc0F0OiBJbmZpbml0eSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCFlbmRwb2ludC5zY2hlbWEgfHwgIXNjaGVtYUhhc0VudGl0eShlbmRwb2ludC5zY2hlbWEpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiByZXN1bHRzLFxuICAgICAgICBleHBpcnlTdGF0dXM6IG1ldGE/LmludmFsaWRhdGVkXG4gICAgICAgICAgPyBFeHBpcnlTdGF0dXMuSW52YWxpZFxuICAgICAgICAgIDogY2FjaGVSZXN1bHRzICYmICFlbmRwb2ludC5pbnZhbGlkSWZTdGFsZVxuICAgICAgICAgID8gRXhwaXJ5U3RhdHVzLlZhbGlkXG4gICAgICAgICAgOiBFeHBpcnlTdGF0dXMuSW52YWxpZElmU3RhbGUsXG4gICAgICAgIGV4cGlyZXNBdDogZXhwaXJlc0F0IHx8IDAsXG4gICAgICB9IGFzIHtcbiAgICAgICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzO1xuICAgICAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmdsb2JhbENhY2hlLnJlc3VsdHNba2V5XSlcbiAgICAgIHRoaXMuZ2xvYmFsQ2FjaGUucmVzdWx0c1trZXldID0gbmV3IFdlYWtFbnRpdHlNYXAoKTtcblxuICAgIC8vIHNlY29uZCBhcmd1bWVudCBpcyBmYWxzZSBpZiBhbnkgZW50aXRpZXMgYXJlIG1pc3NpbmdcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgY29uc3QgeyBkYXRhLCBwYXRocyB9ID0gZGVub3JtYWxpemVDYWNoZWQoXG4gICAgICByZXN1bHRzLFxuICAgICAgc2NoZW1hLFxuICAgICAgc3RhdGUuZW50aXRpZXMsXG4gICAgICB0aGlzLmdsb2JhbENhY2hlLmVudGl0aWVzLFxuICAgICAgdGhpcy5nbG9iYWxDYWNoZS5yZXN1bHRzW2tleV0sXG4gICAgICBhcmdzLFxuICAgICkgYXMgeyBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjsgcGF0aHM6IFBhdGhbXSB9O1xuICAgIGNvbnN0IGludmFsaWREZW5vcm1hbGl6ZSA9IHR5cGVvZiBkYXRhID09PSAnc3ltYm9sJztcblxuICAgIC8vIGZhbGxiYWNrIHRvIGVudGl0eSBleHBpcnkgdGltZVxuICAgIGlmICghZXhwaXJlc0F0KSB7XG4gICAgICBleHBpcmVzQXQgPSBlbnRpdHlFeHBpcmVzQXQocGF0aHMsIHN0YXRlLmVudGl0eU1ldGEpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvY29uY2VwdHMvZXhwaXJ5LXBvbGljeSNleHBpcnktc3RhdHVzXG4gICAgLy8gd2UgZG9uJ3QgdHJhY2sgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFsZSBvciBmcmVzaCBiZWNhdXNlIHRoYXQgaXMgdGllZCB0byB0cmlnZ2VyaW5nXG4gICAgLy8gY29uZGl0aW9uc1xuICAgIGNvbnN0IGV4cGlyeVN0YXR1cyA9XG4gICAgICBtZXRhPy5pbnZhbGlkYXRlZCB8fCAoaW52YWxpZERlbm9ybWFsaXplICYmICFtZXRhPy5lcnJvcilcbiAgICAgICAgPyBFeHBpcnlTdGF0dXMuSW52YWxpZFxuICAgICAgICA6IGludmFsaWREZW5vcm1hbGl6ZSB8fCBlbmRwb2ludC5pbnZhbGlkSWZTdGFsZSB8fCBpbnZhbGlkUmVzdWx0c1xuICAgICAgICA/IEV4cGlyeVN0YXR1cy5JbnZhbGlkSWZTdGFsZVxuICAgICAgICA6IEV4cGlyeVN0YXR1cy5WYWxpZDtcblxuICAgIHJldHVybiB7IGRhdGEsIGV4cGlyeVN0YXR1cywgZXhwaXJlc0F0IH07XG4gIH07XG59XG5cbi8vIGJlbmNobWFyazogaHR0cHM6Ly93d3cubWVhc3VyZXRoYXQubmV0L0JlbmNobWFya3MvU2hvdy8yNDY5MS8wL21pbi1yZWR1Y2VyLXZzLWltcGVyYXRpdmUtd2l0aC1wYXRoc1xuLy8gZWFybGllc3QgZXhwaXJ5IGRpY3RhdGVzIGFnZVxuZnVuY3Rpb24gZW50aXR5RXhwaXJlc0F0KFxuICBwYXRoczogUGF0aFtdLFxuICBlbnRpdHlNZXRhOiB7XG4gICAgcmVhZG9ubHkgW2VudGl0eUtleTogc3RyaW5nXToge1xuICAgICAgcmVhZG9ubHkgW3BrOiBzdHJpbmddOiB7XG4gICAgICAgIHJlYWRvbmx5IGRhdGU6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgZXhwaXJlc0F0OiBudW1iZXI7XG4gICAgICAgIHJlYWRvbmx5IGZldGNoZWRBdDogbnVtYmVyOyAvLyBUaGlzIGlzIG9ubHkgdGhlIHZhbHVlIHVudGlsIGl0IGlzIHNldCBieSB0aGUgQ2FjaGVQcm92aWRlclxuICAgICAgfTtcbiAgICB9O1xuICB9LFxuKSB7XG4gIGxldCBleHBpcmVzQXQgPSBJbmZpbml0eTtcbiAgZm9yIChjb25zdCB7IHBrLCBrZXkgfSBvZiBwYXRocykge1xuICAgIGNvbnN0IGVudGl0eUV4cGlyeSA9IGVudGl0eU1ldGFba2V5XT8uW3BrXT8uZXhwaXJlc0F0O1xuICAgIC8vIGV4cGlyZXNBdCB3aWxsIGFsd2F5cyByZXNvbHZlIHRvIGZhbHNlIHdpdGggYW55IGNvbXBhcmlzb25cbiAgICBpZiAoZW50aXR5RXhwaXJ5IDwgZXhwaXJlc0F0KSBleHBpcmVzQXQgPSBlbnRpdHlFeHBpcnk7XG4gIH1cbiAgcmV0dXJuIGV4cGlyZXNBdDtcbn1cblxuLyoqIERldGVybWluZSB3aGV0aGVyIHRoZSBzY2hlbWEgaGFzIGFueSBlbnRpdGllcy5cbiAqXG4gKiBXaXRob3V0IGVudGl0aWVzLCBkZW5vcm1hbGl6YXRpb24gaXMgbm90IG5lZWRlZCwgYW5kIHJlc3VsdHMgc2hvdWxkIG5vdCBiZSBpbmZlcnJlZC5cbiAqL1xuZnVuY3Rpb24gc2NoZW1hSGFzRW50aXR5KHNjaGVtYTogU2NoZW1hKTogYm9vbGVhbiB7XG4gIGlmIChpc0VudGl0eShzY2hlbWEpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSlcbiAgICByZXR1cm4gc2NoZW1hLmxlbmd0aCAhPT0gMCAmJiBzY2hlbWFIYXNFbnRpdHkoc2NoZW1hWzBdKTtcbiAgaWYgKHNjaGVtYSAmJiAodHlwZW9mIHNjaGVtYSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHNjaGVtYSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBjb25zdCBuZXN0ZWRTY2hlbWEgPVxuICAgICAgJ3NjaGVtYScgaW4gc2NoZW1hID8gKHNjaGVtYS5zY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgU2NoZW1hPikgOiBzY2hlbWE7XG4gICAgaWYgKHR5cGVvZiBuZXN0ZWRTY2hlbWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzY2hlbWFIYXNFbnRpdHkobmVzdGVkU2NoZW1hKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobmVzdGVkU2NoZW1hKS5zb21lKHggPT4gc2NoZW1hSGFzRW50aXR5KHgpKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIHsgRXJyb3JUeXBlcyB9O1xuXG5jbGFzcyBTbmFwc2hvdDxUID0gdW5rbm93bj4gaW1wbGVtZW50cyBTbmFwc2hvdEludGVyZmFjZSB7XG4gIHByaXZhdGUgc3RhdGU6IFN0YXRlPFQ+O1xuICBwcml2YXRlIGNvbnRyb2xsZXI6IENvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGZldGNoZWRBdDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsIHN0YXRlOiBTdGF0ZTxUPiwgZmV0Y2hlZEF0ID0gMCkge1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIHRoaXMuZmV0Y2hlZEF0ID0gZmV0Y2hlZEF0O1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBEYXRhIEFjY2VzcyAqKioqKioqKioqKioqKiovXG4gIC8qKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL1NuYXBzaG90I2dldFJlc3BvbnNlICovXG4gIGdldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5JyB8ICdzY2hlbWEnIHwgJ2ludmFsaWRJZlN0YWxlJz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH0gPT4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0UmVzcG9uc2UoZW5kcG9pbnQsIC4uLmFyZ3MsIHRoaXMuc3RhdGUpO1xuICB9O1xuXG4gIC8qKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL1NuYXBzaG90I2dldEVycm9yICovXG4gIGdldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5Jz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEVycm9yKGVuZHBvaW50LCAuLi5hcmdzLCB0aGlzLnN0YXRlKTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBT0EsU0FDRUEsYUFBYSxFQUNiQyxZQUFZLEVBTVpDLGlCQUFpQixFQUNqQkMsUUFBUSxFQUNSQyxXQUFXLFFBQ04sd0JBQXdCO0FBQy9CLFNBQVNDLFlBQVksRUFBRUMsaUJBQWlCLFFBQVEsd0JBQXdCO0FBRXhFLE9BQU9DLGVBQWUsTUFBTSxzQkFBc0I7QUFDbEQsT0FBT0MsV0FBVyxNQUFNLGtCQUFrQjtBQUMxQyxPQUFPQyxnQkFBZ0IsTUFBTSx1QkFBdUI7QUFDcEQsT0FBT0MsbUJBQW1CLE1BQU0sMEJBQTBCO0FBQzFELE9BQU9DLFdBQVcsTUFBTSxrQkFBa0I7QUFDMUMsT0FBT0MsU0FBUyxNQUFNLGdCQUFnQjtBQUN0QyxTQUNFQyxvQkFBb0IsRUFDcEJDLGtCQUFrQixRQUNiLHlCQUF5QjtBQUVoQyxTQUFTQyxZQUFZLFFBQVEsbUNBQW1DO0FBQ2hFLE9BQU9DLFVBQVUsTUFBTSx3QkFBd0I7QUFZL0MsTUFBTUMsYUFBYSxHQUFJQyxNQUFlLElBQW9CO0VBQ3hELE1BQU0sSUFBSUMsS0FBSyxDQUNaLGlFQUFnRSxHQUM5RCx5REFDTCxDQUFDO0FBQ0gsQ0FBQztBQUNELE1BQU1DLFVBQVUsR0FBR0EsQ0FBQSxLQUFzQjtFQUN2QztFQUNBO0VBQ0EsT0FBT0wsWUFBWTtBQUNyQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxNQUFN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
@@ -1,5 +1,5 @@
1
1
  import type { ErrorTypes, SnapshotInterface, DenormalizeCache, Schema, Denormalize } from '@data-client/normalizr';
2
- import { ExpiryStatus, EndpointInterface, FetchFunction, DenormalizeNullable } from '@data-client/normalizr';
2
+ import { ExpiryStatus, EndpointInterface, FetchFunction, ResolveType, DenormalizeNullable } from '@data-client/normalizr';
3
3
  import type { EndpointUpdateFunction } from './types.js';
4
4
  import type { ActionTypes, State } from '../types.js';
5
5
  export type GenericDispatch = (value: any) => Promise<void>;
@@ -44,7 +44,7 @@ export default class Controller<D extends GenericDispatch = DataClientDispatch>
44
44
  */
45
45
  fetchIfStale: <E extends EndpointInterface<FetchFunction, Schema | undefined, boolean | undefined> & {
46
46
  update?: EndpointUpdateFunction<E> | undefined;
47
- }>(endpoint: E, ...args_0: Parameters<E>) => (E["schema"] extends null | undefined ? ReturnType<E> : Promise<Denormalize<E["schema"]>>) | undefined;
47
+ }>(endpoint: E, ...args_0: Parameters<E>) => E["schema"] extends null | undefined ? ReturnType<E> | ResolveType<E> : Denormalize<E["schema"]> | Promise<Denormalize<E["schema"]>>;
48
48
  /**
49
49
  * Forces refetching and suspense on useSuspense with the same Endpoint and parameters.
50
50
  * @see https://resthooks.io/docs/api/Controller#invalidate
@@ -1 +1 @@
1
- {"version":3,"file":"Controller.d.ts","sourceRoot":"","sources":["../../src/controller/Controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,EACN,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,YAAY,EACZ,iBAAiB,EACjB,aAAa,EAEb,mBAAmB,EAKpB,MAAM,wBAAwB,CAAC;AAahC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGzD,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5D,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvE,UAAU,gBAAgB,CAAC,CAAC,SAAS,eAAe,GAAG,kBAAkB;IACvE,QAAQ,CAAC,EAAE,CAAC,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAcD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU,CAC7B,CAAC,SAAS,eAAe,GAAG,kBAAkB;IAE9C;;;;OAIG;IACH,SAAiB,QAAQ,EAAE,CAAC,CAAC;IAC7B;;;;;;OAMG;IACH,SAAiB,QAAQ,EAAE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,SAAiB,WAAW,EAAE,gBAAgB,CAAC;gBAEnC,EACV,QAA+B,EAC/B,QAAqB,EACrB,WAGC,GACF,GAAE,gBAAgB,CAAC,CAAC,CAAM;IAM3B,oDAAoD;IAEpD;;;OAGG;IACH,KAAK;;0IAmBH;IAEF;;;OAGG;IACH,YAAY;;wJAkBV;IAEF;;;OAGG;IACH,UAAU,gKAGP,QAAQ,IAAI,CAAC,CAOQ;IAExB;;;;OAIG;IACH,aAAa;uBAA8B,MAAM,KAAK,OAAO;wBACe;IAE5E;;;;OAIG;IACH,SAAS;uBAA8B,MAAM,KAAK,OAAO;wBACe;IAExE;;;OAGG;IACH,gBAAgB,QAAO,QAAQ,IAAI,CAAC,CAAiC;IAErE;;;OAGG;IACH,WAAW;;kEAOR,QAAQ,IAAI,CAAC,CAOd;IAEF;;OAEG;IACwB,OAAO;;kEAO/B,QAAQ,IAAI,CAAC,CAGd;IAEF;;;OAGG;IACH,QAAQ;;oEAOL,QAAQ,IAAI,CAAC,CAQd;IAEF;;;OAGG;IACwB,YAAY;;oEAOpC,QAAQ,IAAI,CAAC,CAGd;IAEF;;;OAGG;IACH,OAAO;;;;kBASW,KAAK;mBACJ,MAAM;eACV,IAAI;;;kBAID,GAAG;mBACF,MAAM;;UAGtB,QAAQ,IAAI,CAAC,CAEd;IAEF;;;OAGG;IACH,SAAS,8JASN,QAAQ,IAAI,CAAC,CAOQ;IAExB;;;OAGG;IACH,WAAW,8JASR,QAAQ,IAAI,CAAC,CAOQ;IAExB,sCAAsC;IAStC;;;OAGG;IACH,QAAQ,UAAW,MAAM,OAAO,CAAC,cAAc,MAAM,KAAG,iBAAiB,CAEvE;IAEF;;;OAGG;IACH,QAAQ,4NAML,UAAU,GAAG,SAAS,CAavB;IAEF;;;OAGG;IACH,WAAW;;sBAQK,YAAY;mBACf,MAAM;MAkFjB;CACH;AA4CD,YAAY,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"Controller.d.ts","sourceRoot":"","sources":["../../src/controller/Controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,EACN,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,mBAAmB,EAKpB,MAAM,wBAAwB,CAAC;AAahC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGzD,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5D,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvE,UAAU,gBAAgB,CAAC,CAAC,SAAS,eAAe,GAAG,kBAAkB;IACvE,QAAQ,CAAC,EAAE,CAAC,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAcD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU,CAC7B,CAAC,SAAS,eAAe,GAAG,kBAAkB;IAE9C;;;;OAIG;IACH,SAAiB,QAAQ,EAAE,CAAC,CAAC;IAC7B;;;;;;OAMG;IACH,SAAiB,QAAQ,EAAE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,SAAiB,WAAW,EAAE,gBAAgB,CAAC;gBAEnC,EACV,QAA+B,EAC/B,QAAqB,EACrB,WAGC,GACF,GAAE,gBAAgB,CAAC,CAAC,CAAM;IAM3B,oDAAoD;IAEpD;;;OAGG;IACH,KAAK;;0IAmBH;IAEF;;;OAGG;IACH,YAAY;;sLAgBV;IAEF;;;OAGG;IACH,UAAU,gKAGP,QAAQ,IAAI,CAAC,CAOQ;IAExB;;;;OAIG;IACH,aAAa;uBAA8B,MAAM,KAAK,OAAO;wBACe;IAE5E;;;;OAIG;IACH,SAAS;uBAA8B,MAAM,KAAK,OAAO;wBACe;IAExE;;;OAGG;IACH,gBAAgB,QAAO,QAAQ,IAAI,CAAC,CAAiC;IAErE;;;OAGG;IACH,WAAW;;kEAOR,QAAQ,IAAI,CAAC,CAOd;IAEF;;OAEG;IACwB,OAAO;;kEAO/B,QAAQ,IAAI,CAAC,CAGd;IAEF;;;OAGG;IACH,QAAQ;;oEAOL,QAAQ,IAAI,CAAC,CAQd;IAEF;;;OAGG;IACwB,YAAY;;oEAOpC,QAAQ,IAAI,CAAC,CAGd;IAEF;;;OAGG;IACH,OAAO;;;;kBASW,KAAK;mBACJ,MAAM;eACV,IAAI;;;kBAID,GAAG;mBACF,MAAM;;UAGtB,QAAQ,IAAI,CAAC,CAEd;IAEF;;;OAGG;IACH,SAAS,8JASN,QAAQ,IAAI,CAAC,CAOQ;IAExB;;;OAGG;IACH,WAAW,8JASR,QAAQ,IAAI,CAAC,CAOQ;IAExB,sCAAsC;IAStC;;;OAGG;IACH,QAAQ,UAAW,MAAM,OAAO,CAAC,cAAc,MAAM,KAAG,iBAAiB,CAEvE;IAEF;;;OAGG;IACH,QAAQ,4NAML,UAAU,GAAG,SAAS,CAavB;IAEF;;;OAGG;IACH,WAAW;;sBAQK,YAAY;mBACf,MAAM;MAkFjB;CACH;AA4CD,YAAY,EAAE,UAAU,EAAE,CAAC"}
@@ -66,10 +66,11 @@ export default class Controller {
66
66
  */
67
67
  this.fetchIfStale = (endpoint, ...args) => {
68
68
  const {
69
+ data,
69
70
  expiresAt,
70
71
  expiryStatus
71
72
  } = this.getResponse(endpoint, ...args, this.getState());
72
- if (expiryStatus !== ExpiryStatus.Invalid && Date.now() <= expiresAt) return;
73
+ if (expiryStatus !== ExpiryStatus.Invalid && Date.now() <= expiresAt) return data;
73
74
  return this.fetch(endpoint, ...args);
74
75
  };
75
76
  /**
@@ -307,4 +308,4 @@ class Snapshot {
307
308
  this.fetchedAt = fetchedAt;
308
309
  }
309
310
  }
310
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXZWFrRW50aXR5TWFwIiwiRXhwaXJ5U3RhdHVzIiwiZGVub3JtYWxpemVDYWNoZWQiLCJpc0VudGl0eSIsImRlbm9ybWFsaXplIiwiaW5mZXJSZXN1bHRzIiwidmFsaWRhdGVJbmZlcmVuY2UiLCJjcmVhdGVFeHBpcmVBbGwiLCJjcmVhdGVGZXRjaCIsImNyZWF0ZUludmFsaWRhdGUiLCJjcmVhdGVJbnZhbGlkYXRlQWxsIiwiY3JlYXRlUmVzZXQiLCJjcmVhdGVTZXQiLCJjcmVhdGVVbnN1YnNjcmlwdGlvbiIsImNyZWF0ZVN1YnNjcmlwdGlvbiIsImluaXRpYWxTdGF0ZSIsInNlbGVjdE1ldGEiLCJ1bnNldERpc3BhdGNoIiwiYWN0aW9uIiwiRXJyb3IiLCJ1bnNldFN0YXRlIiwiQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiZGlzcGF0Y2giLCJnZXRTdGF0ZSIsImdsb2JhbENhY2hlIiwiZW50aXRpZXMiLCJyZXN1bHRzIiwiZmV0Y2giLCJlbmRwb2ludCIsImFyZ3MiLCJzY2hlbWEiLCJtZXRhIiwicHJvbWlzZSIsInRoZW4iLCJpbnB1dCIsImZldGNoSWZTdGFsZSIsImV4cGlyZXNBdCIsImV4cGlyeVN0YXR1cyIsImdldFJlc3BvbnNlIiwiSW52YWxpZCIsIkRhdGUiLCJub3ciLCJpbnZhbGlkYXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJpbnZhbGlkYXRlQWxsIiwib3B0aW9ucyIsImtleSIsInRlc3RLZXkiLCJleHBpcmVBbGwiLCJyZXNldEVudGlyZVN0b3JlIiwic2V0UmVzcG9uc2UiLCJyZXN0IiwicmVzcG9uc2UiLCJsZW5ndGgiLCJzbGljZSIsInJlY2VpdmUiLCJzZXRFcnJvciIsImVycm9yIiwicmVjZWl2ZUVycm9yIiwic3Vic2NyaWJlIiwidW5zdWJzY3JpYmUiLCJzbmFwc2hvdCIsInN0YXRlIiwiZmV0Y2hlZEF0IiwiU25hcHNob3QiLCJnZXRFcnJvciIsInVuZGVmaW5lZCIsImVycm9yUG9saWN5IiwiaXNBY3RpdmUiLCJjYWNoZVJlc3VsdHMiLCJpbnZhbGlkUmVzdWx0cyIsImluZGV4ZXMiLCJkYXRhIiwiVmFsaWQiLCJJbmZpbml0eSIsInNjaGVtYUhhc0VudGl0eSIsImludmFsaWRhdGVkIiwiaW52YWxpZElmU3RhbGUiLCJJbnZhbGlkSWZTdGFsZSIsInBhdGhzIiwiaW52YWxpZERlbm9ybWFsaXplIiwiZW50aXR5RXhwaXJlc0F0IiwiZW50aXR5TWV0YSIsInBrIiwiX2VudGl0eU1ldGEka2V5IiwiX2VudGl0eU1ldGEka2V5JHBrIiwiZW50aXR5RXhwaXJ5IiwiQXJyYXkiLCJpc0FycmF5IiwibmVzdGVkU2NoZW1hIiwiT2JqZWN0IiwidmFsdWVzIiwic29tZSIsIngiLCJjb250cm9sbGVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyb2xsZXIvQ29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEVycm9yVHlwZXMsXG4gIFNuYXBzaG90SW50ZXJmYWNlLFxuICBEZW5vcm1hbGl6ZUNhY2hlLFxuICBTY2hlbWEsXG4gIERlbm9ybWFsaXplLFxufSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcbmltcG9ydCB7XG4gIFdlYWtFbnRpdHlNYXAsXG4gIEV4cGlyeVN0YXR1cyxcbiAgRW5kcG9pbnRJbnRlcmZhY2UsXG4gIEZldGNoRnVuY3Rpb24sXG4gIFJlc29sdmVUeXBlLFxuICBEZW5vcm1hbGl6ZU51bGxhYmxlLFxuICBQYXRoLFxuICBkZW5vcm1hbGl6ZUNhY2hlZCxcbiAgaXNFbnRpdHksXG4gIGRlbm9ybWFsaXplLFxufSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcbmltcG9ydCB7IGluZmVyUmVzdWx0cywgdmFsaWRhdGVJbmZlcmVuY2UgfSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcblxuaW1wb3J0IGNyZWF0ZUV4cGlyZUFsbCBmcm9tICcuL2NyZWF0ZUV4cGlyZUFsbC5qcyc7XG5pbXBvcnQgY3JlYXRlRmV0Y2ggZnJvbSAnLi9jcmVhdGVGZXRjaC5qcyc7XG5pbXBvcnQgY3JlYXRlSW52YWxpZGF0ZSBmcm9tICcuL2NyZWF0ZUludmFsaWRhdGUuanMnO1xuaW1wb3J0IGNyZWF0ZUludmFsaWRhdGVBbGwgZnJvbSAnLi9jcmVhdGVJbnZhbGlkYXRlQWxsLmpzJztcbmltcG9ydCBjcmVhdGVSZXNldCBmcm9tICcuL2NyZWF0ZVJlc2V0LmpzJztcbmltcG9ydCBjcmVhdGVTZXQgZnJvbSAnLi9jcmVhdGVTZXQuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlVW5zdWJzY3JpcHRpb24sXG4gIGNyZWF0ZVN1YnNjcmlwdGlvbixcbn0gZnJvbSAnLi9jcmVhdGVTdWJzY3JpcHRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBpbml0aWFsU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9yZWR1Y2VyL2NyZWF0ZVJlZHVjZXIuanMnO1xuaW1wb3J0IHNlbGVjdE1ldGEgZnJvbSAnLi4vc3RhdGUvc2VsZWN0TWV0YS5qcyc7XG5pbXBvcnQgdHlwZSB7IEFjdGlvblR5cGVzLCBTdGF0ZSB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgR2VuZXJpY0Rpc3BhdGNoID0gKHZhbHVlOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG5leHBvcnQgdHlwZSBEYXRhQ2xpZW50RGlzcGF0Y2ggPSAodmFsdWU6IEFjdGlvblR5cGVzKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5pbnRlcmZhY2UgQ29uc3RydWN0b3JQcm9wczxEIGV4dGVuZHMgR2VuZXJpY0Rpc3BhdGNoID0gRGF0YUNsaWVudERpc3BhdGNoPiB7XG4gIGRpc3BhdGNoPzogRDtcbiAgZ2V0U3RhdGU/OiAoKSA9PiBTdGF0ZTx1bmtub3duPjtcbiAgZ2xvYmFsQ2FjaGU/OiBEZW5vcm1hbGl6ZUNhY2hlO1xufVxuXG5jb25zdCB1bnNldERpc3BhdGNoID0gKGFjdGlvbjogdW5rbm93bik6IFByb21pc2U8dm9pZD4gPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERpc3BhdGNoaW5nIHdoaWxlIGNvbnN0cnVjdGluZyB5b3VyIG1pZGRsZXdhcmUgaXMgbm90IGFsbG93ZWQuIGAgK1xuICAgICAgYE90aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC5gLFxuICApO1xufTtcbmNvbnN0IHVuc2V0U3RhdGUgPSAoKTogU3RhdGU8dW5rbm93bj4gPT4ge1xuICAvLyBUaGlzIGlzIG9ubHkgdGhlIHZhbHVlIHVudGlsIGl0IGlzIHNldCBieSB0aGUgQ2FjaGVQcm92aWRlclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gaW5pdGlhbFN0YXRlO1xufTtcblxuLyoqXG4gKiBJbXBlcmF0aXZlIGNvbnRyb2wgb2YgUmVzdCBIb29rcyBzdG9yZVxuICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRyb2xsZXI8XG4gIEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBEYXRhQ2xpZW50RGlzcGF0Y2gsXG4+IHtcbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uIHRvIFJlc3QgSG9va3MgcmVkdWNlci5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2Rpc3BhdGNoXG4gICAqL1xuICBkZWNsYXJlIHJlYWRvbmx5IGRpc3BhdGNoOiBEO1xuICAvKipcbiAgICogR2V0cyB0aGUgbGF0ZXN0IHN0YXRlIHNuYXBzaG90IHRoYXQgaXMgZnVsbHkgY29tbWl0dGVkLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGltcGVyYXRpdmUgdXNlLWNhc2VzIGxpa2UgZXZlbnQgaGFuZGxlcnMuXG4gICAqIFRoaXMgc2hvdWxkICpub3QqIGJlIHVzZWQgdG8gcmVuZGVyOyBpbnN0ZWFkIHVzZVN1c3BlbnNlKCkgb3IgdXNlQ2FjaGUoKVxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0U3RhdGVcbiAgICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgZ2V0U3RhdGU6ICgpID0+IFN0YXRlPHVua25vd24+O1xuICBkZWNsYXJlIHJlYWRvbmx5IGdsb2JhbENhY2hlOiBEZW5vcm1hbGl6ZUNhY2hlO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBkaXNwYXRjaCA9IHVuc2V0RGlzcGF0Y2ggYXMgYW55LFxuICAgIGdldFN0YXRlID0gdW5zZXRTdGF0ZSxcbiAgICBnbG9iYWxDYWNoZSA9IHtcbiAgICAgIGVudGl0aWVzOiB7fSxcbiAgICAgIHJlc3VsdHM6IHt9LFxuICAgIH0sXG4gIH06IENvbnN0cnVjdG9yUHJvcHM8RD4gPSB7fSkge1xuICAgIHRoaXMuZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbiAgICB0aGlzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG4gICAgdGhpcy5nbG9iYWxDYWNoZSA9IGdsb2JhbENhY2hlO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBBY3Rpb24gRGlzcGF0Y2hlcnMgKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBlbmRwb2ludCB3aXRoIGdpdmVuIGFyZ3MsIHVwZGF0aW5nIHRoZSBSZXN0IEhvb2tzIGNhY2hlIHdpdGggdGhlIHJlc3BvbnNlIG9yIGVycm9yIHVwb24gY29tcGxldGlvbi5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2ZldGNoXG4gICAqL1xuICBmZXRjaCA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7IHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT4gfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKTogRVsnc2NoZW1hJ10gZXh0ZW5kcyB1bmRlZmluZWQgfCBudWxsXG4gICAgPyBSZXR1cm5UeXBlPEU+XG4gICAgOiBQcm9taXNlPERlbm9ybWFsaXplPEVbJ3NjaGVtYSddPj4gPT4ge1xuICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZUZldGNoKGVuZHBvaW50LCB7XG4gICAgICBhcmdzLFxuICAgIH0pO1xuICAgIHRoaXMuZGlzcGF0Y2goYWN0aW9uKTtcblxuICAgIGlmIChlbmRwb2ludC5zY2hlbWEpIHtcbiAgICAgIHJldHVybiBhY3Rpb24ubWV0YS5wcm9taXNlLnRoZW4oaW5wdXQgPT5cbiAgICAgICAgZGVub3JtYWxpemUoaW5wdXQsIGVuZHBvaW50LnNjaGVtYSwge30sIGFyZ3MpLFxuICAgICAgKSBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBhY3Rpb24ubWV0YS5wcm9taXNlIGFzIGFueTtcbiAgfTtcblxuICAvKipcbiAgICogRmV0Y2hlcyBvbmx5IGlmIGVuZHBvaW50IGlzIGNvbnNpZGVyZWQgJ3N0YWxlJzsgb3RoZXJ3aXNlIHJldHVybnMgdW5kZWZpbmVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZmV0Y2hJZlN0YWxlXG4gICAqL1xuICBmZXRjaElmU3RhbGUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYgeyB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+IH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dXG4gICk6XG4gICAgfCAoRVsnc2NoZW1hJ10gZXh0ZW5kcyB1bmRlZmluZWQgfCBudWxsXG4gICAgICAgID8gUmV0dXJuVHlwZTxFPlxuICAgICAgICA6IFByb21pc2U8RGVub3JtYWxpemU8RVsnc2NoZW1hJ10+PilcbiAgICB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgeyBleHBpcmVzQXQsIGV4cGlyeVN0YXR1cyB9ID0gdGhpcy5nZXRSZXNwb25zZShcbiAgICAgIGVuZHBvaW50LFxuICAgICAgLi4uYXJncyxcbiAgICAgIHRoaXMuZ2V0U3RhdGUoKSxcbiAgICApO1xuICAgIGlmIChleHBpcnlTdGF0dXMgIT09IEV4cGlyeVN0YXR1cy5JbnZhbGlkICYmIERhdGUubm93KCkgPD0gZXhwaXJlc0F0KVxuICAgICAgcmV0dXJuO1xuICAgIHJldHVybiB0aGlzLmZldGNoKGVuZHBvaW50LCAuLi5hcmdzKTtcbiAgfTtcblxuICAvKipcbiAgICogRm9yY2VzIHJlZmV0Y2hpbmcgYW5kIHN1c3BlbnNlIG9uIHVzZVN1c3BlbnNlIHdpdGggdGhlIHNhbWUgRW5kcG9pbnQgYW5kIHBhcmFtZXRlcnMuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNpbnZhbGlkYXRlXG4gICAqL1xuICBpbnZhbGlkYXRlID0gPEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZT4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IFByb21pc2U8dm9pZD4gPT5cbiAgICBhcmdzWzBdICE9PSBudWxsXG4gICAgICA/IHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICAgY3JlYXRlSW52YWxpZGF0ZShlbmRwb2ludCwge1xuICAgICAgICAgICAgYXJnczogYXJncyBhcyByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqXG4gICAqIEZvcmNlcyByZWZldGNoaW5nIGFuZCBzdXNwZW5zZSBvbiB1c2VTdXNwZW5zZSBvbiBhbGwgbWF0Y2hpbmcgZW5kcG9pbnQgcmVzdWx0IGtleXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNpbnZhbGlkYXRlQWxsXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGludmFsaWRhdGlvbiBpcyBjb21taXRlZC5cbiAgICovXG4gIGludmFsaWRhdGVBbGwgPSAob3B0aW9uczogeyB0ZXN0S2V5OiAoa2V5OiBzdHJpbmcpID0+IGJvb2xlYW4gfSkgPT5cbiAgICB0aGlzLmRpc3BhdGNoKGNyZWF0ZUludmFsaWRhdGVBbGwoKGtleTogc3RyaW5nKSA9PiBvcHRpb25zLnRlc3RLZXkoa2V5KSkpO1xuXG4gIC8qKlxuICAgKiBTZXRzIGFsbCBtYXRjaGluZyBlbmRwb2ludCByZXN1bHQga2V5cyB0byBiZSBTVEFMRS5cbiAgICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNleHBpcmVBbGxcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXhwaXJ5IGlzIGNvbW1pdGVkLiAqTk9UKiBmZXRjaCBwcm9taXNlXG4gICAqL1xuICBleHBpcmVBbGwgPSAob3B0aW9uczogeyB0ZXN0S2V5OiAoa2V5OiBzdHJpbmcpID0+IGJvb2xlYW4gfSkgPT5cbiAgICB0aGlzLmRpc3BhdGNoKGNyZWF0ZUV4cGlyZUFsbCgoa2V5OiBzdHJpbmcpID0+IG9wdGlvbnMudGVzdEtleShrZXkpKSk7XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZW50aXJlIFJlc3QgSG9va3MgY2FjaGUuIEFsbCBpbmZsaWdodCByZXF1ZXN0cyB3aWxsIG5vdCByZXNvbHZlLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjcmVzZXRFbnRpcmVTdG9yZVxuICAgKi9cbiAgcmVzZXRFbnRpcmVTdG9yZSA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMuZGlzcGF0Y2goY3JlYXRlUmVzZXQoKSk7XG5cbiAgLyoqXG4gICAqIFN0b3JlcyByZXNwb25zZSBpbiBjYWNoZSBmb3IgZ2l2ZW4gRW5kcG9pbnQgYW5kIGFyZ3MuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzZXRcbiAgICovXG4gIHNldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgYW55XVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogUmVzb2x2ZVR5cGU8RT4gPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYWN0aW9uID0gY3JlYXRlU2V0KGVuZHBvaW50LCB7XG4gICAgICBhcmdzOiByZXN0LnNsaWNlKDAsIHJlc3QubGVuZ3RoIC0gMSkgYXMgUGFyYW1ldGVyczxFPixcbiAgICAgIHJlc3BvbnNlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGFjdGlvbik7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldFJlc3BvbnNlIGluc3RlYWRcbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIHJlY2VpdmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgICAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbiAgICB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+LCBhbnldXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHRoaXMuc2V0UmVzcG9uc2UoZW5kcG9pbnQsIC4uLnJlc3QpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgdGhlIHJlc3VsdCBvZiBFbmRwb2ludCBhbmQgYXJncyBhcyB0aGUgZXJyb3IgcHJvdmlkZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzZXRFcnJvclxuICAgKi9cbiAgc2V0RXJyb3IgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgICAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbiAgICB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+LCBFcnJvcl1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IEVycm9yID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZVNldChlbmRwb2ludCwge1xuICAgICAgYXJnczogcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RT4sXG4gICAgICByZXNwb25zZSxcbiAgICAgIGVycm9yOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGFjdGlvbik7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFub3RoZXIgbmFtZSBmb3Igc2V0RXJyb3JcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0RXJyb3IgaW5zdGVhZFxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gcmVjZWl2ZUVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgRXJyb3JdXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHRoaXMuc2V0RXJyb3IoZW5kcG9pbnQsIC4uLnJlc3QpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBpbmZsaWdodCBmZXRjaC4gYGZldGNoZWRBdGAgc2hvdWxkIGBmZXRjaGAncyBgY3JlYXRlZEF0YFxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjcmVzb2x2ZVxuICAgKi9cbiAgcmVzb2x2ZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgbWV0YTpcbiAgICAgIHwge1xuICAgICAgICAgIGFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XTtcbiAgICAgICAgICByZXNwb25zZTogRXJyb3I7XG4gICAgICAgICAgZmV0Y2hlZEF0OiBudW1iZXI7XG4gICAgICAgICAgZXJyb3I6IHRydWU7XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIGFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XTtcbiAgICAgICAgICByZXNwb25zZTogYW55O1xuICAgICAgICAgIGZldGNoZWRBdDogbnVtYmVyO1xuICAgICAgICAgIGVycm9yPzogZmFsc2U7XG4gICAgICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGNyZWF0ZVNldChlbmRwb2ludCwgbWV0YSBhcyBhbnkpKTtcbiAgfTtcblxuICAvKipcbiAgICogTWFya3MgYSBuZXcgc3Vic2NyaXB0aW9uIHRvIGEgZ2l2ZW4gRW5kcG9pbnQuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzdWJzY3JpYmVcbiAgICovXG4gIHN1YnNjcmliZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U8XG4gICAgICBGZXRjaEZ1bmN0aW9uLFxuICAgICAgU2NoZW1hIHwgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkIHwgZmFsc2VcbiAgICA+LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSB8IHJlYWRvbmx5IFtudWxsXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgYXJnc1swXSAhPT0gbnVsbFxuICAgICAgPyB0aGlzLmRpc3BhdGNoKFxuICAgICAgICAgIGNyZWF0ZVN1YnNjcmlwdGlvbihlbmRwb2ludCwge1xuICAgICAgICAgICAgYXJnczogYXJncyBhcyByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqXG4gICAqIE1hcmtzIGNvbXBsZXRpb24gb2Ygc3Vic2NyaXB0aW9uIHRvIGEgZ2l2ZW4gRW5kcG9pbnQuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciN1bnN1YnNjcmliZVxuICAgKi9cbiAgdW5zdWJzY3JpYmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPFxuICAgICAgRmV0Y2hGdW5jdGlvbixcbiAgICAgIFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCB8IGZhbHNlXG4gICAgPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIGFyZ3NbMF0gIT09IG51bGxcbiAgICAgID8gdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICBjcmVhdGVVbnN1YnNjcmlwdGlvbihlbmRwb2ludCwge1xuICAgICAgICAgICAgYXJnczogYXJncyBhcyByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqKioqKioqKioqKioqKiBNb3JlICoqKioqKioqKioqKioqKi9cblxuICAvKiBUT0RPOlxuICBhYm9ydCA9IDxFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XVxuICApOiBQcm9taXNlPHZvaWQ+XG4gICovXG5cbiAgLyoqXG4gICAqIEdldHMgYSBzbmFwc2hvdCAoaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvU25hcHNob3QpXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzbmFwc2hvdFxuICAgKi9cbiAgc25hcHNob3QgPSAoc3RhdGU6IFN0YXRlPHVua25vd24+LCBmZXRjaGVkQXQ/OiBudW1iZXIpOiBTbmFwc2hvdEludGVyZmFjZSA9PiB7XG4gICAgcmV0dXJuIG5ldyBTbmFwc2hvdCh0aGlzLCBzdGF0ZSwgZmV0Y2hlZEF0KTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgZXJyb3IsIGlmIGFueSwgZm9yIGEgZ2l2ZW4gZW5kcG9pbnQuIFJldHVybnMgdW5kZWZpbmVkIGZvciBubyBlcnJvcnMuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRFcnJvclxuICAgKi9cbiAgZ2V0RXJyb3IgPSA8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknPixcbiAgICBBcmdzIGV4dGVuZHMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiBbLi4uQXJncywgU3RhdGU8dW5rbm93bj5dXG4gICk6IEVycm9yVHlwZXMgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChyZXN0WzBdID09PSBudWxsKSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGUgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV0gYXMgU3RhdGU8dW5rbm93bj47XG4gICAgLy8gdGhpcyBpcyB0eXBlc2NyaXB0IGdlbmVyaWNzIGJyZWFraW5nXG4gICAgY29uc3QgYXJnczogYW55ID0gcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RVsna2V5J10+O1xuICAgIGNvbnN0IGtleSA9IGVuZHBvaW50LmtleSguLi5hcmdzKTtcblxuICAgIGNvbnN0IG1ldGEgPSBzZWxlY3RNZXRhKHN0YXRlLCBrZXkpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBzdGF0ZS5yZXN1bHRzW2tleV07XG5cbiAgICBpZiAocmVzdWx0cyAhPT0gdW5kZWZpbmVkICYmIG1ldGE/LmVycm9yUG9saWN5ID09PSAnc29mdCcpIHJldHVybjtcblxuICAgIHJldHVybiBtZXRhPy5lcnJvciBhcyBhbnk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIChnbG9iYWxseSByZWZlcmVudGlhbGx5IHN0YWJsZSkgcmVzcG9uc2UgZm9yIGEgZ2l2ZW4gZW5kcG9pbnQvYXJncyBwYWlyIGZyb20gc3RhdGUgZ2l2ZW4uXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRSZXNwb25zZVxuICAgKi9cbiAgZ2V0UmVzcG9uc2UgPSA8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknIHwgJ3NjaGVtYScgfCAnaW52YWxpZElmU3RhbGUnPixcbiAgICBBcmdzIGV4dGVuZHMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiBbLi4uQXJncywgU3RhdGU8dW5rbm93bj5dXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgfSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV0gYXMgU3RhdGU8dW5rbm93bj47XG4gICAgLy8gdGhpcyBpcyB0eXBlc2NyaXB0IGdlbmVyaWNzIGJyZWFraW5nXG4gICAgY29uc3QgYXJnczogYW55ID0gcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RVsna2V5J10+O1xuICAgIGNvbnN0IGlzQWN0aXZlID0gYXJncy5sZW5ndGggIT09IDEgfHwgYXJnc1swXSAhPT0gbnVsbDtcbiAgICBjb25zdCBrZXkgPSBpc0FjdGl2ZSA/IGVuZHBvaW50LmtleSguLi5hcmdzKSA6ICcnO1xuICAgIGNvbnN0IGNhY2hlUmVzdWx0cyA9IGlzQWN0aXZlID8gc3RhdGUucmVzdWx0c1trZXldIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNjaGVtYSA9IGVuZHBvaW50LnNjaGVtYTtcbiAgICBjb25zdCBtZXRhID0gc2VsZWN0TWV0YShzdGF0ZSwga2V5KTtcbiAgICBsZXQgZXhwaXJlc0F0ID0gbWV0YT8uZXhwaXJlc0F0O1xuXG4gICAgbGV0IGludmFsaWRSZXN1bHRzID0gZmFsc2U7XG4gICAgbGV0IHJlc3VsdHM7XG4gICAgaWYgKGNhY2hlUmVzdWx0cyA9PT0gdW5kZWZpbmVkICYmIGVuZHBvaW50LnNjaGVtYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHRzID0gaW5mZXJSZXN1bHRzKFxuICAgICAgICBlbmRwb2ludC5zY2hlbWEsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXRlLmluZGV4ZXMsXG4gICAgICAgIHN0YXRlLmVudGl0aWVzLFxuICAgICAgKTtcbiAgICAgIGludmFsaWRSZXN1bHRzID0gIXZhbGlkYXRlSW5mZXJlbmNlKHJlc3VsdHMpO1xuICAgICAgaWYgKCFleHBpcmVzQXQgJiYgaW52YWxpZFJlc3VsdHMpIGV4cGlyZXNBdCA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdHMgPSBjYWNoZVJlc3VsdHM7XG4gICAgfVxuXG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogcmVzdWx0cyBhcyBhbnksXG4gICAgICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzLlZhbGlkLFxuICAgICAgICBleHBpcmVzQXQ6IEluZmluaXR5LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIWVuZHBvaW50LnNjaGVtYSB8fCAhc2NoZW1hSGFzRW50aXR5KGVuZHBvaW50LnNjaGVtYSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3VsdHMsXG4gICAgICAgIGV4cGlyeVN0YXR1czogbWV0YT8uaW52YWxpZGF0ZWRcbiAgICAgICAgICA/IEV4cGlyeVN0YXR1cy5JbnZhbGlkXG4gICAgICAgICAgOiBjYWNoZVJlc3VsdHMgJiYgIWVuZHBvaW50LmludmFsaWRJZlN0YWxlXG4gICAgICAgICAgPyBFeHBpcnlTdGF0dXMuVmFsaWRcbiAgICAgICAgICA6IEV4cGlyeVN0YXR1cy5JbnZhbGlkSWZTdGFsZSxcbiAgICAgICAgZXhwaXJlc0F0OiBleHBpcmVzQXQgfHwgMCxcbiAgICAgIH0gYXMge1xuICAgICAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICAgICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZ2xvYmFsQ2FjaGUucmVzdWx0c1trZXldKVxuICAgICAgdGhpcy5nbG9iYWxDYWNoZS5yZXN1bHRzW2tleV0gPSBuZXcgV2Vha0VudGl0eU1hcCgpO1xuXG4gICAgLy8gc2Vjb25kIGFyZ3VtZW50IGlzIGZhbHNlIGlmIGFueSBlbnRpdGllcyBhcmUgbWlzc2luZ1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBjb25zdCB7IGRhdGEsIHBhdGhzIH0gPSBkZW5vcm1hbGl6ZUNhY2hlZChcbiAgICAgIHJlc3VsdHMsXG4gICAgICBzY2hlbWEsXG4gICAgICBzdGF0ZS5lbnRpdGllcyxcbiAgICAgIHRoaXMuZ2xvYmFsQ2FjaGUuZW50aXRpZXMsXG4gICAgICB0aGlzLmdsb2JhbENhY2hlLnJlc3VsdHNba2V5XSxcbiAgICAgIGFyZ3MsXG4gICAgKSBhcyB7IGRhdGE6IERlbm9ybWFsaXplTnVsbGFibGU8RVsnc2NoZW1hJ10+OyBwYXRoczogUGF0aFtdIH07XG4gICAgY29uc3QgaW52YWxpZERlbm9ybWFsaXplID0gdHlwZW9mIGRhdGEgPT09ICdzeW1ib2wnO1xuXG4gICAgLy8gZmFsbGJhY2sgdG8gZW50aXR5IGV4cGlyeSB0aW1lXG4gICAgaWYgKCFleHBpcmVzQXQpIHtcbiAgICAgIGV4cGlyZXNBdCA9IGVudGl0eUV4cGlyZXNBdChwYXRocywgc3RhdGUuZW50aXR5TWV0YSk7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9jb25jZXB0cy9leHBpcnktcG9saWN5I2V4cGlyeS1zdGF0dXNcbiAgICAvLyB3ZSBkb24ndCB0cmFjayB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YWxlIG9yIGZyZXNoIGJlY2F1c2UgdGhhdCBpcyB0aWVkIHRvIHRyaWdnZXJpbmdcbiAgICAvLyBjb25kaXRpb25zXG4gICAgY29uc3QgZXhwaXJ5U3RhdHVzID1cbiAgICAgIG1ldGE/LmludmFsaWRhdGVkIHx8IChpbnZhbGlkRGVub3JtYWxpemUgJiYgIW1ldGE/LmVycm9yKVxuICAgICAgICA/IEV4cGlyeVN0YXR1cy5JbnZhbGlkXG4gICAgICAgIDogaW52YWxpZERlbm9ybWFsaXplIHx8IGVuZHBvaW50LmludmFsaWRJZlN0YWxlIHx8IGludmFsaWRSZXN1bHRzXG4gICAgICAgID8gRXhwaXJ5U3RhdHVzLkludmFsaWRJZlN0YWxlXG4gICAgICAgIDogRXhwaXJ5U3RhdHVzLlZhbGlkO1xuXG4gICAgcmV0dXJuIHsgZGF0YSwgZXhwaXJ5U3RhdHVzLCBleHBpcmVzQXQgfTtcbiAgfTtcbn1cblxuLy8gYmVuY2htYXJrOiBodHRwczovL3d3dy5tZWFzdXJldGhhdC5uZXQvQmVuY2htYXJrcy9TaG93LzI0NjkxLzAvbWluLXJlZHVjZXItdnMtaW1wZXJhdGl2ZS13aXRoLXBhdGhzXG4vLyBlYXJsaWVzdCBleHBpcnkgZGljdGF0ZXMgYWdlXG5mdW5jdGlvbiBlbnRpdHlFeHBpcmVzQXQoXG4gIHBhdGhzOiBQYXRoW10sXG4gIGVudGl0eU1ldGE6IHtcbiAgICByZWFkb25seSBbZW50aXR5S2V5OiBzdHJpbmddOiB7XG4gICAgICByZWFkb25seSBbcGs6IHN0cmluZ106IHtcbiAgICAgICAgcmVhZG9ubHkgZGF0ZTogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgZmV0Y2hlZEF0OiBudW1iZXI7IC8vIFRoaXMgaXMgb25seSB0aGUgdmFsdWUgdW50aWwgaXQgaXMgc2V0IGJ5IHRoZSBDYWNoZVByb3ZpZGVyXG4gICAgICB9O1xuICAgIH07XG4gIH0sXG4pIHtcbiAgbGV0IGV4cGlyZXNBdCA9IEluZmluaXR5O1xuICBmb3IgKGNvbnN0IHsgcGssIGtleSB9IG9mIHBhdGhzKSB7XG4gICAgY29uc3QgZW50aXR5RXhwaXJ5ID0gZW50aXR5TWV0YVtrZXldPy5bcGtdPy5leHBpcmVzQXQ7XG4gICAgLy8gZXhwaXJlc0F0IHdpbGwgYWx3YXlzIHJlc29sdmUgdG8gZmFsc2Ugd2l0aCBhbnkgY29tcGFyaXNvblxuICAgIGlmIChlbnRpdHlFeHBpcnkgPCBleHBpcmVzQXQpIGV4cGlyZXNBdCA9IGVudGl0eUV4cGlyeTtcbiAgfVxuICByZXR1cm4gZXhwaXJlc0F0O1xufVxuXG4vKiogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNjaGVtYSBoYXMgYW55IGVudGl0aWVzLlxuICpcbiAqIFdpdGhvdXQgZW50aXRpZXMsIGRlbm9ybWFsaXphdGlvbiBpcyBub3QgbmVlZGVkLCBhbmQgcmVzdWx0cyBzaG91bGQgbm90IGJlIGluZmVycmVkLlxuICovXG5mdW5jdGlvbiBzY2hlbWFIYXNFbnRpdHkoc2NoZW1hOiBTY2hlbWEpOiBib29sZWFuIHtcbiAgaWYgKGlzRW50aXR5KHNjaGVtYSkpIHJldHVybiB0cnVlO1xuICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKVxuICAgIHJldHVybiBzY2hlbWEubGVuZ3RoICE9PSAwICYmIHNjaGVtYUhhc0VudGl0eShzY2hlbWFbMF0pO1xuICBpZiAoc2NoZW1hICYmICh0eXBlb2Ygc2NoZW1hID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygc2NoZW1hID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNvbnN0IG5lc3RlZFNjaGVtYSA9XG4gICAgICAnc2NoZW1hJyBpbiBzY2hlbWEgPyAoc2NoZW1hLnNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBTY2hlbWE+KSA6IHNjaGVtYTtcbiAgICBpZiAodHlwZW9mIG5lc3RlZFNjaGVtYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHNjaGVtYUhhc0VudGl0eShuZXN0ZWRTY2hlbWEpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhuZXN0ZWRTY2hlbWEpLnNvbWUoeCA9PiBzY2hlbWFIYXNFbnRpdHkoeCkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IHR5cGUgeyBFcnJvclR5cGVzIH07XG5cbmNsYXNzIFNuYXBzaG90PFQgPSB1bmtub3duPiBpbXBsZW1lbnRzIFNuYXBzaG90SW50ZXJmYWNlIHtcbiAgcHJpdmF0ZSBzdGF0ZTogU3RhdGU8VD47XG4gIHByaXZhdGUgY29udHJvbGxlcjogQ29udHJvbGxlcjtcbiAgcmVhZG9ubHkgZmV0Y2hlZEF0OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoY29udHJvbGxlcjogQ29udHJvbGxlciwgc3RhdGU6IFN0YXRlPFQ+LCBmZXRjaGVkQXQgPSAwKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgdGhpcy5mZXRjaGVkQXQgPSBmZXRjaGVkQXQ7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqIERhdGEgQWNjZXNzICoqKioqKioqKioqKioqKi9cbiAgLyoqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvU25hcHNob3QjZ2V0UmVzcG9uc2UgKi9cbiAgZ2V0UmVzcG9uc2UgPSA8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknIHwgJ3NjaGVtYScgfCAnaW52YWxpZElmU3RhbGUnPixcbiAgICBBcmdzIGV4dGVuZHMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiBBcmdzXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgfSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRSZXNwb25zZShlbmRwb2ludCwgLi4uYXJncywgdGhpcy5zdGF0ZSk7XG4gIH07XG5cbiAgLyoqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvU25hcHNob3QjZ2V0RXJyb3IgKi9cbiAgZ2V0RXJyb3IgPSA8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknPixcbiAgICBBcmdzIGV4dGVuZHMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiBBcmdzXG4gICk6IEVycm9yVHlwZXMgfCB1bmRlZmluZWQgPT4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0RXJyb3IoZW5kcG9pbnQsIC4uLmFyZ3MsIHRoaXMuc3RhdGUpO1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFPQSxTQUNFQSxhQUFhLEVBQ2JDLFlBQVksRUFNWkMsaUJBQWlCLEVBQ2pCQyxRQUFRLEVBQ1JDLFdBQVcsUUFDTix3QkFBd0I7QUFDL0IsU0FBU0MsWUFBWSxFQUFFQyxpQkFBaUIsUUFBUSx3QkFBd0I7QUFFeEUsT0FBT0MsZUFBZSxNQUFNLHNCQUFzQjtBQUNsRCxPQUFPQyxXQUFXLE1BQU0sa0JBQWtCO0FBQzFDLE9BQU9DLGdCQUFnQixNQUFNLHVCQUF1QjtBQUNwRCxPQUFPQyxtQkFBbUIsTUFBTSwwQkFBMEI7QUFDMUQsT0FBT0MsV0FBVyxNQUFNLGtCQUFrQjtBQUMxQyxPQUFPQyxTQUFTLE1BQU0sZ0JBQWdCO0FBQ3RDLFNBQ0VDLG9CQUFvQixFQUNwQkMsa0JBQWtCLFFBQ2IseUJBQXlCO0FBRWhDLFNBQVNDLFlBQVksUUFBUSxtQ0FBbUM7QUFDaEUsT0FBT0MsVUFBVSxNQUFNLHdCQUF3QjtBQVkvQyxNQUFNQyxhQUFhLEdBQUlDLE1BQWUsSUFBb0I7RUFDeEQsTUFBTSxJQUFJQyxLQUFLLENBQ1osaUVBQWdFLEdBQzlELHlEQUNMLENBQUM7QUFDSCxDQUFDO0FBQ0QsTUFBTUMsVUFBVSxHQUFHQSxDQUFBLEtBQXNCO0VBQ3ZDO0VBQ0E7RUFDQSxPQUFPTCxZQUFZO0FBQ3JCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE1BQU1NLFVBQVUsQ0FFN0I7RUFDQTtBQUNGO0FBQ0E7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
311
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXZWFrRW50aXR5TWFwIiwiRXhwaXJ5U3RhdHVzIiwiZGVub3JtYWxpemVDYWNoZWQiLCJpc0VudGl0eSIsImRlbm9ybWFsaXplIiwiaW5mZXJSZXN1bHRzIiwidmFsaWRhdGVJbmZlcmVuY2UiLCJjcmVhdGVFeHBpcmVBbGwiLCJjcmVhdGVGZXRjaCIsImNyZWF0ZUludmFsaWRhdGUiLCJjcmVhdGVJbnZhbGlkYXRlQWxsIiwiY3JlYXRlUmVzZXQiLCJjcmVhdGVTZXQiLCJjcmVhdGVVbnN1YnNjcmlwdGlvbiIsImNyZWF0ZVN1YnNjcmlwdGlvbiIsImluaXRpYWxTdGF0ZSIsInNlbGVjdE1ldGEiLCJ1bnNldERpc3BhdGNoIiwiYWN0aW9uIiwiRXJyb3IiLCJ1bnNldFN0YXRlIiwiQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiZGlzcGF0Y2giLCJnZXRTdGF0ZSIsImdsb2JhbENhY2hlIiwiZW50aXRpZXMiLCJyZXN1bHRzIiwiZmV0Y2giLCJlbmRwb2ludCIsImFyZ3MiLCJzY2hlbWEiLCJtZXRhIiwicHJvbWlzZSIsInRoZW4iLCJpbnB1dCIsImZldGNoSWZTdGFsZSIsImRhdGEiLCJleHBpcmVzQXQiLCJleHBpcnlTdGF0dXMiLCJnZXRSZXNwb25zZSIsIkludmFsaWQiLCJEYXRlIiwibm93IiwiaW52YWxpZGF0ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiaW52YWxpZGF0ZUFsbCIsIm9wdGlvbnMiLCJrZXkiLCJ0ZXN0S2V5IiwiZXhwaXJlQWxsIiwicmVzZXRFbnRpcmVTdG9yZSIsInNldFJlc3BvbnNlIiwicmVzdCIsInJlc3BvbnNlIiwibGVuZ3RoIiwic2xpY2UiLCJyZWNlaXZlIiwic2V0RXJyb3IiLCJlcnJvciIsInJlY2VpdmVFcnJvciIsInN1YnNjcmliZSIsInVuc3Vic2NyaWJlIiwic25hcHNob3QiLCJzdGF0ZSIsImZldGNoZWRBdCIsIlNuYXBzaG90IiwiZ2V0RXJyb3IiLCJ1bmRlZmluZWQiLCJlcnJvclBvbGljeSIsImlzQWN0aXZlIiwiY2FjaGVSZXN1bHRzIiwiaW52YWxpZFJlc3VsdHMiLCJpbmRleGVzIiwiVmFsaWQiLCJJbmZpbml0eSIsInNjaGVtYUhhc0VudGl0eSIsImludmFsaWRhdGVkIiwiaW52YWxpZElmU3RhbGUiLCJJbnZhbGlkSWZTdGFsZSIsInBhdGhzIiwiaW52YWxpZERlbm9ybWFsaXplIiwiZW50aXR5RXhwaXJlc0F0IiwiZW50aXR5TWV0YSIsInBrIiwiX2VudGl0eU1ldGEka2V5IiwiX2VudGl0eU1ldGEka2V5JHBrIiwiZW50aXR5RXhwaXJ5IiwiQXJyYXkiLCJpc0FycmF5IiwibmVzdGVkU2NoZW1hIiwiT2JqZWN0IiwidmFsdWVzIiwic29tZSIsIngiLCJjb250cm9sbGVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyb2xsZXIvQ29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEVycm9yVHlwZXMsXG4gIFNuYXBzaG90SW50ZXJmYWNlLFxuICBEZW5vcm1hbGl6ZUNhY2hlLFxuICBTY2hlbWEsXG4gIERlbm9ybWFsaXplLFxufSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcbmltcG9ydCB7XG4gIFdlYWtFbnRpdHlNYXAsXG4gIEV4cGlyeVN0YXR1cyxcbiAgRW5kcG9pbnRJbnRlcmZhY2UsXG4gIEZldGNoRnVuY3Rpb24sXG4gIFJlc29sdmVUeXBlLFxuICBEZW5vcm1hbGl6ZU51bGxhYmxlLFxuICBQYXRoLFxuICBkZW5vcm1hbGl6ZUNhY2hlZCxcbiAgaXNFbnRpdHksXG4gIGRlbm9ybWFsaXplLFxufSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcbmltcG9ydCB7IGluZmVyUmVzdWx0cywgdmFsaWRhdGVJbmZlcmVuY2UgfSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcblxuaW1wb3J0IGNyZWF0ZUV4cGlyZUFsbCBmcm9tICcuL2NyZWF0ZUV4cGlyZUFsbC5qcyc7XG5pbXBvcnQgY3JlYXRlRmV0Y2ggZnJvbSAnLi9jcmVhdGVGZXRjaC5qcyc7XG5pbXBvcnQgY3JlYXRlSW52YWxpZGF0ZSBmcm9tICcuL2NyZWF0ZUludmFsaWRhdGUuanMnO1xuaW1wb3J0IGNyZWF0ZUludmFsaWRhdGVBbGwgZnJvbSAnLi9jcmVhdGVJbnZhbGlkYXRlQWxsLmpzJztcbmltcG9ydCBjcmVhdGVSZXNldCBmcm9tICcuL2NyZWF0ZVJlc2V0LmpzJztcbmltcG9ydCBjcmVhdGVTZXQgZnJvbSAnLi9jcmVhdGVTZXQuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlVW5zdWJzY3JpcHRpb24sXG4gIGNyZWF0ZVN1YnNjcmlwdGlvbixcbn0gZnJvbSAnLi9jcmVhdGVTdWJzY3JpcHRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBpbml0aWFsU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9yZWR1Y2VyL2NyZWF0ZVJlZHVjZXIuanMnO1xuaW1wb3J0IHNlbGVjdE1ldGEgZnJvbSAnLi4vc3RhdGUvc2VsZWN0TWV0YS5qcyc7XG5pbXBvcnQgdHlwZSB7IEFjdGlvblR5cGVzLCBTdGF0ZSB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgR2VuZXJpY0Rpc3BhdGNoID0gKHZhbHVlOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG5leHBvcnQgdHlwZSBEYXRhQ2xpZW50RGlzcGF0Y2ggPSAodmFsdWU6IEFjdGlvblR5cGVzKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5pbnRlcmZhY2UgQ29uc3RydWN0b3JQcm9wczxEIGV4dGVuZHMgR2VuZXJpY0Rpc3BhdGNoID0gRGF0YUNsaWVudERpc3BhdGNoPiB7XG4gIGRpc3BhdGNoPzogRDtcbiAgZ2V0U3RhdGU/OiAoKSA9PiBTdGF0ZTx1bmtub3duPjtcbiAgZ2xvYmFsQ2FjaGU/OiBEZW5vcm1hbGl6ZUNhY2hlO1xufVxuXG5jb25zdCB1bnNldERpc3BhdGNoID0gKGFjdGlvbjogdW5rbm93bik6IFByb21pc2U8dm9pZD4gPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERpc3BhdGNoaW5nIHdoaWxlIGNvbnN0cnVjdGluZyB5b3VyIG1pZGRsZXdhcmUgaXMgbm90IGFsbG93ZWQuIGAgK1xuICAgICAgYE90aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC5gLFxuICApO1xufTtcbmNvbnN0IHVuc2V0U3RhdGUgPSAoKTogU3RhdGU8dW5rbm93bj4gPT4ge1xuICAvLyBUaGlzIGlzIG9ubHkgdGhlIHZhbHVlIHVudGlsIGl0IGlzIHNldCBieSB0aGUgQ2FjaGVQcm92aWRlclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gaW5pdGlhbFN0YXRlO1xufTtcblxuLyoqXG4gKiBJbXBlcmF0aXZlIGNvbnRyb2wgb2YgUmVzdCBIb29rcyBzdG9yZVxuICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRyb2xsZXI8XG4gIEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBEYXRhQ2xpZW50RGlzcGF0Y2gsXG4+IHtcbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uIHRvIFJlc3QgSG9va3MgcmVkdWNlci5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2Rpc3BhdGNoXG4gICAqL1xuICBkZWNsYXJlIHJlYWRvbmx5IGRpc3BhdGNoOiBEO1xuICAvKipcbiAgICogR2V0cyB0aGUgbGF0ZXN0IHN0YXRlIHNuYXBzaG90IHRoYXQgaXMgZnVsbHkgY29tbWl0dGVkLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGltcGVyYXRpdmUgdXNlLWNhc2VzIGxpa2UgZXZlbnQgaGFuZGxlcnMuXG4gICAqIFRoaXMgc2hvdWxkICpub3QqIGJlIHVzZWQgdG8gcmVuZGVyOyBpbnN0ZWFkIHVzZVN1c3BlbnNlKCkgb3IgdXNlQ2FjaGUoKVxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0U3RhdGVcbiAgICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgZ2V0U3RhdGU6ICgpID0+IFN0YXRlPHVua25vd24+O1xuICBkZWNsYXJlIHJlYWRvbmx5IGdsb2JhbENhY2hlOiBEZW5vcm1hbGl6ZUNhY2hlO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBkaXNwYXRjaCA9IHVuc2V0RGlzcGF0Y2ggYXMgYW55LFxuICAgIGdldFN0YXRlID0gdW5zZXRTdGF0ZSxcbiAgICBnbG9iYWxDYWNoZSA9IHtcbiAgICAgIGVudGl0aWVzOiB7fSxcbiAgICAgIHJlc3VsdHM6IHt9LFxuICAgIH0sXG4gIH06IENvbnN0cnVjdG9yUHJvcHM8RD4gPSB7fSkge1xuICAgIHRoaXMuZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbiAgICB0aGlzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG4gICAgdGhpcy5nbG9iYWxDYWNoZSA9IGdsb2JhbENhY2hlO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBBY3Rpb24gRGlzcGF0Y2hlcnMgKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBlbmRwb2ludCB3aXRoIGdpdmVuIGFyZ3MsIHVwZGF0aW5nIHRoZSBSZXN0IEhvb2tzIGNhY2hlIHdpdGggdGhlIHJlc3BvbnNlIG9yIGVycm9yIHVwb24gY29tcGxldGlvbi5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2ZldGNoXG4gICAqL1xuICBmZXRjaCA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7IHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT4gfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKTogRVsnc2NoZW1hJ10gZXh0ZW5kcyB1bmRlZmluZWQgfCBudWxsXG4gICAgPyBSZXR1cm5UeXBlPEU+XG4gICAgOiBQcm9taXNlPERlbm9ybWFsaXplPEVbJ3NjaGVtYSddPj4gPT4ge1xuICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZUZldGNoKGVuZHBvaW50LCB7XG4gICAgICBhcmdzLFxuICAgIH0pO1xuICAgIHRoaXMuZGlzcGF0Y2goYWN0aW9uKTtcblxuICAgIGlmIChlbmRwb2ludC5zY2hlbWEpIHtcbiAgICAgIHJldHVybiBhY3Rpb24ubWV0YS5wcm9taXNlLnRoZW4oaW5wdXQgPT5cbiAgICAgICAgZGVub3JtYWxpemUoaW5wdXQsIGVuZHBvaW50LnNjaGVtYSwge30sIGFyZ3MpLFxuICAgICAgKSBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBhY3Rpb24ubWV0YS5wcm9taXNlIGFzIGFueTtcbiAgfTtcblxuICAvKipcbiAgICogRmV0Y2hlcyBvbmx5IGlmIGVuZHBvaW50IGlzIGNvbnNpZGVyZWQgJ3N0YWxlJzsgb3RoZXJ3aXNlIHJldHVybnMgdW5kZWZpbmVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZmV0Y2hJZlN0YWxlXG4gICAqL1xuICBmZXRjaElmU3RhbGUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYgeyB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+IH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dXG4gICk6IEVbJ3NjaGVtYSddIGV4dGVuZHMgdW5kZWZpbmVkIHwgbnVsbFxuICAgID8gUmV0dXJuVHlwZTxFPiB8IFJlc29sdmVUeXBlPEU+XG4gICAgOiBQcm9taXNlPERlbm9ybWFsaXplPEVbJ3NjaGVtYSddPj4gfCBEZW5vcm1hbGl6ZTxFWydzY2hlbWEnXT4gPT4ge1xuICAgIGNvbnN0IHsgZGF0YSwgZXhwaXJlc0F0LCBleHBpcnlTdGF0dXMgfSA9IHRoaXMuZ2V0UmVzcG9uc2UoXG4gICAgICBlbmRwb2ludCxcbiAgICAgIC4uLmFyZ3MsXG4gICAgICB0aGlzLmdldFN0YXRlKCksXG4gICAgKTtcbiAgICBpZiAoZXhwaXJ5U3RhdHVzICE9PSBFeHBpcnlTdGF0dXMuSW52YWxpZCAmJiBEYXRlLm5vdygpIDw9IGV4cGlyZXNBdClcbiAgICAgIHJldHVybiBkYXRhIGFzIGFueTtcbiAgICByZXR1cm4gdGhpcy5mZXRjaChlbmRwb2ludCwgLi4uYXJncyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZvcmNlcyByZWZldGNoaW5nIGFuZCBzdXNwZW5zZSBvbiB1c2VTdXNwZW5zZSB3aXRoIHRoZSBzYW1lIEVuZHBvaW50IGFuZCBwYXJhbWV0ZXJzLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjaW52YWxpZGF0ZVxuICAgKi9cbiAgaW52YWxpZGF0ZSA9IDxFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSB8IHJlYWRvbmx5IFtudWxsXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgYXJnc1swXSAhPT0gbnVsbFxuICAgICAgPyB0aGlzLmRpc3BhdGNoKFxuICAgICAgICAgIGNyZWF0ZUludmFsaWRhdGUoZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MgYXMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKlxuICAgKiBGb3JjZXMgcmVmZXRjaGluZyBhbmQgc3VzcGVuc2Ugb24gdXNlU3VzcGVuc2Ugb24gYWxsIG1hdGNoaW5nIGVuZHBvaW50IHJlc3VsdCBrZXlzLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjaW52YWxpZGF0ZUFsbFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbnZhbGlkYXRpb24gaXMgY29tbWl0ZWQuXG4gICAqL1xuICBpbnZhbGlkYXRlQWxsID0gKG9wdGlvbnM6IHsgdGVzdEtleTogKGtleTogc3RyaW5nKSA9PiBib29sZWFuIH0pID0+XG4gICAgdGhpcy5kaXNwYXRjaChjcmVhdGVJbnZhbGlkYXRlQWxsKChrZXk6IHN0cmluZykgPT4gb3B0aW9ucy50ZXN0S2V5KGtleSkpKTtcblxuICAvKipcbiAgICogU2V0cyBhbGwgbWF0Y2hpbmcgZW5kcG9pbnQgcmVzdWx0IGtleXMgdG8gYmUgU1RBTEUuXG4gICAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZXhwaXJlQWxsXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGV4cGlyeSBpcyBjb21taXRlZC4gKk5PVCogZmV0Y2ggcHJvbWlzZVxuICAgKi9cbiAgZXhwaXJlQWxsID0gKG9wdGlvbnM6IHsgdGVzdEtleTogKGtleTogc3RyaW5nKSA9PiBib29sZWFuIH0pID0+XG4gICAgdGhpcy5kaXNwYXRjaChjcmVhdGVFeHBpcmVBbGwoKGtleTogc3RyaW5nKSA9PiBvcHRpb25zLnRlc3RLZXkoa2V5KSkpO1xuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGVudGlyZSBSZXN0IEhvb2tzIGNhY2hlLiBBbGwgaW5mbGlnaHQgcmVxdWVzdHMgd2lsbCBub3QgcmVzb2x2ZS5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3Jlc2V0RW50aXJlU3RvcmVcbiAgICovXG4gIHJlc2V0RW50aXJlU3RvcmUgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB0aGlzLmRpc3BhdGNoKGNyZWF0ZVJlc2V0KCkpO1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgcmVzcG9uc2UgaW4gY2FjaGUgZm9yIGdpdmVuIEVuZHBvaW50IGFuZCBhcmdzLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0XG4gICAqL1xuICBzZXRSZXNwb25zZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIGFueV1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFJlc29sdmVUeXBlPEU+ID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZVNldChlbmRwb2ludCwge1xuICAgICAgYXJnczogcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RT4sXG4gICAgICByZXNwb25zZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChhY3Rpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzZXRSZXNwb25zZSBpbnN0ZWFkXG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyByZWNlaXZlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgYW55XVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB0aGlzLnNldFJlc3BvbnNlKGVuZHBvaW50LCAuLi5yZXN0KTtcbiAgfTtcblxuICAvKipcbiAgICogU3RvcmVzIHRoZSByZXN1bHQgb2YgRW5kcG9pbnQgYW5kIGFyZ3MgYXMgdGhlIGVycm9yIHByb3ZpZGVkLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0RXJyb3JcbiAgICovXG4gIHNldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgRXJyb3JdXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBFcnJvciA9IHJlc3RbcmVzdC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVTZXQoZW5kcG9pbnQsIHtcbiAgICAgIGFyZ3M6IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEU+LFxuICAgICAgcmVzcG9uc2UsXG4gICAgICBlcnJvcjogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChhY3Rpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBbm90aGVyIG5hbWUgZm9yIHNldEVycm9yXG4gICAqIEBkZXByZWNhdGVkIHVzZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldEVycm9yIGluc3RlYWRcbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIHJlY2VpdmVFcnJvciA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIEVycm9yXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB0aGlzLnNldEVycm9yKGVuZHBvaW50LCAuLi5yZXN0KTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW4gaW5mbGlnaHQgZmV0Y2guIGBmZXRjaGVkQXRgIHNob3VsZCBgZmV0Y2hgJ3MgYGNyZWF0ZWRBdGBcbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3Jlc29sdmVcbiAgICovXG4gIHJlc29sdmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgICAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbiAgICB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIG1ldGE6XG4gICAgICB8IHtcbiAgICAgICAgICBhcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl07XG4gICAgICAgICAgcmVzcG9uc2U6IEVycm9yO1xuICAgICAgICAgIGZldGNoZWRBdDogbnVtYmVyO1xuICAgICAgICAgIGVycm9yOiB0cnVlO1xuICAgICAgICB9XG4gICAgICB8IHtcbiAgICAgICAgICBhcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl07XG4gICAgICAgICAgcmVzcG9uc2U6IGFueTtcbiAgICAgICAgICBmZXRjaGVkQXQ6IG51bWJlcjtcbiAgICAgICAgICBlcnJvcj86IGZhbHNlO1xuICAgICAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChjcmVhdGVTZXQoZW5kcG9pbnQsIG1ldGEgYXMgYW55KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1hcmtzIGEgbmV3IHN1YnNjcmlwdGlvbiB0byBhIGdpdmVuIEVuZHBvaW50LlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc3Vic2NyaWJlXG4gICAqL1xuICBzdWJzY3JpYmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPFxuICAgICAgRmV0Y2hGdW5jdGlvbixcbiAgICAgIFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCB8IGZhbHNlXG4gICAgPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIGFyZ3NbMF0gIT09IG51bGxcbiAgICAgID8gdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICBjcmVhdGVTdWJzY3JpcHRpb24oZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MgYXMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKlxuICAgKiBNYXJrcyBjb21wbGV0aW9uIG9mIHN1YnNjcmlwdGlvbiB0byBhIGdpdmVuIEVuZHBvaW50LlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjdW5zdWJzY3JpYmVcbiAgICovXG4gIHVuc3Vic2NyaWJlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZTxcbiAgICAgIEZldGNoRnVuY3Rpb24sXG4gICAgICBTY2hlbWEgfCB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQgfCBmYWxzZVxuICAgID4sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IFByb21pc2U8dm9pZD4gPT5cbiAgICBhcmdzWzBdICE9PSBudWxsXG4gICAgICA/IHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICAgY3JlYXRlVW5zdWJzY3JpcHRpb24oZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MgYXMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKioqKioqKioqKioqKiogTW9yZSAqKioqKioqKioqKioqKiovXG5cbiAgLyogVE9ETzpcbiAgYWJvcnQgPSA8RSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKTogUHJvbWlzZTx2b2lkPlxuICAqL1xuXG4gIC8qKlxuICAgKiBHZXRzIGEgc25hcHNob3QgKGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL1NuYXBzaG90KVxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc25hcHNob3RcbiAgICovXG4gIHNuYXBzaG90ID0gKHN0YXRlOiBTdGF0ZTx1bmtub3duPiwgZmV0Y2hlZEF0PzogbnVtYmVyKTogU25hcHNob3RJbnRlcmZhY2UgPT4ge1xuICAgIHJldHVybiBuZXcgU25hcHNob3QodGhpcywgc3RhdGUsIGZldGNoZWRBdCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVycm9yLCBpZiBhbnksIGZvciBhIGdpdmVuIGVuZHBvaW50LiBSZXR1cm5zIHVuZGVmaW5lZCBmb3Igbm8gZXJyb3JzLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0RXJyb3JcbiAgICovXG4gIGdldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5Jz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0gfCByZWFkb25seSBbbnVsbF0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogWy4uLkFyZ3MsIFN0YXRlPHVua25vd24+XVxuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAocmVzdFswXSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXRlID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdIGFzIFN0YXRlPHVua25vd24+O1xuICAgIC8vIHRoaXMgaXMgdHlwZXNjcmlwdCBnZW5lcmljcyBicmVha2luZ1xuICAgIGNvbnN0IGFyZ3M6IGFueSA9IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEVbJ2tleSddPjtcbiAgICBjb25zdCBrZXkgPSBlbmRwb2ludC5rZXkoLi4uYXJncyk7XG5cbiAgICBjb25zdCBtZXRhID0gc2VsZWN0TWV0YShzdGF0ZSwga2V5KTtcbiAgICBjb25zdCByZXN1bHRzID0gc3RhdGUucmVzdWx0c1trZXldO1xuXG4gICAgaWYgKHJlc3VsdHMgIT09IHVuZGVmaW5lZCAmJiBtZXRhPy5lcnJvclBvbGljeSA9PT0gJ3NvZnQnKSByZXR1cm47XG5cbiAgICByZXR1cm4gbWV0YT8uZXJyb3IgYXMgYW55O1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSAoZ2xvYmFsbHkgcmVmZXJlbnRpYWxseSBzdGFibGUpIHJlc3BvbnNlIGZvciBhIGdpdmVuIGVuZHBvaW50L2FyZ3MgcGFpciBmcm9tIHN0YXRlIGdpdmVuLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0UmVzcG9uc2VcbiAgICovXG4gIGdldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5JyB8ICdzY2hlbWEnIHwgJ2ludmFsaWRJZlN0YWxlJz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0gfCByZWFkb25seSBbbnVsbF0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogWy4uLkFyZ3MsIFN0YXRlPHVua25vd24+XVxuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH0gPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdIGFzIFN0YXRlPHVua25vd24+O1xuICAgIC8vIHRoaXMgaXMgdHlwZXNjcmlwdCBnZW5lcmljcyBicmVha2luZ1xuICAgIGNvbnN0IGFyZ3M6IGFueSA9IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEVbJ2tleSddPjtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IGFyZ3MubGVuZ3RoICE9PSAxIHx8IGFyZ3NbMF0gIT09IG51bGw7XG4gICAgY29uc3Qga2V5ID0gaXNBY3RpdmUgPyBlbmRwb2ludC5rZXkoLi4uYXJncykgOiAnJztcbiAgICBjb25zdCBjYWNoZVJlc3VsdHMgPSBpc0FjdGl2ZSA/IHN0YXRlLnJlc3VsdHNba2V5XSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzY2hlbWEgPSBlbmRwb2ludC5zY2hlbWE7XG4gICAgY29uc3QgbWV0YSA9IHNlbGVjdE1ldGEoc3RhdGUsIGtleSk7XG4gICAgbGV0IGV4cGlyZXNBdCA9IG1ldGE/LmV4cGlyZXNBdDtcblxuICAgIGxldCBpbnZhbGlkUmVzdWx0cyA9IGZhbHNlO1xuICAgIGxldCByZXN1bHRzO1xuICAgIGlmIChjYWNoZVJlc3VsdHMgPT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5zY2hlbWEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0cyA9IGluZmVyUmVzdWx0cyhcbiAgICAgICAgZW5kcG9pbnQuc2NoZW1hLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdGF0ZS5pbmRleGVzLFxuICAgICAgICBzdGF0ZS5lbnRpdGllcyxcbiAgICAgICk7XG4gICAgICBpbnZhbGlkUmVzdWx0cyA9ICF2YWxpZGF0ZUluZmVyZW5jZShyZXN1bHRzKTtcbiAgICAgIGlmICghZXhwaXJlc0F0ICYmIGludmFsaWRSZXN1bHRzKSBleHBpcmVzQXQgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRzID0gY2FjaGVSZXN1bHRzO1xuICAgIH1cblxuICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3VsdHMgYXMgYW55LFxuICAgICAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cy5WYWxpZCxcbiAgICAgICAgZXhwaXJlc0F0OiBJbmZpbml0eSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCFlbmRwb2ludC5zY2hlbWEgfHwgIXNjaGVtYUhhc0VudGl0eShlbmRwb2ludC5zY2hlbWEpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiByZXN1bHRzLFxuICAgICAgICBleHBpcnlTdGF0dXM6IG1ldGE/LmludmFsaWRhdGVkXG4gICAgICAgICAgPyBFeHBpcnlTdGF0dXMuSW52YWxpZFxuICAgICAgICAgIDogY2FjaGVSZXN1bHRzICYmICFlbmRwb2ludC5pbnZhbGlkSWZTdGFsZVxuICAgICAgICAgID8gRXhwaXJ5U3RhdHVzLlZhbGlkXG4gICAgICAgICAgOiBFeHBpcnlTdGF0dXMuSW52YWxpZElmU3RhbGUsXG4gICAgICAgIGV4cGlyZXNBdDogZXhwaXJlc0F0IHx8IDAsXG4gICAgICB9IGFzIHtcbiAgICAgICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzO1xuICAgICAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmdsb2JhbENhY2hlLnJlc3VsdHNba2V5XSlcbiAgICAgIHRoaXMuZ2xvYmFsQ2FjaGUucmVzdWx0c1trZXldID0gbmV3IFdlYWtFbnRpdHlNYXAoKTtcblxuICAgIC8vIHNlY29uZCBhcmd1bWVudCBpcyBmYWxzZSBpZiBhbnkgZW50aXRpZXMgYXJlIG1pc3NpbmdcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgY29uc3QgeyBkYXRhLCBwYXRocyB9ID0gZGVub3JtYWxpemVDYWNoZWQoXG4gICAgICByZXN1bHRzLFxuICAgICAgc2NoZW1hLFxuICAgICAgc3RhdGUuZW50aXRpZXMsXG4gICAgICB0aGlzLmdsb2JhbENhY2hlLmVudGl0aWVzLFxuICAgICAgdGhpcy5nbG9iYWxDYWNoZS5yZXN1bHRzW2tleV0sXG4gICAgICBhcmdzLFxuICAgICkgYXMgeyBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjsgcGF0aHM6IFBhdGhbXSB9O1xuICAgIGNvbnN0IGludmFsaWREZW5vcm1hbGl6ZSA9IHR5cGVvZiBkYXRhID09PSAnc3ltYm9sJztcblxuICAgIC8vIGZhbGxiYWNrIHRvIGVudGl0eSBleHBpcnkgdGltZVxuICAgIGlmICghZXhwaXJlc0F0KSB7XG4gICAgICBleHBpcmVzQXQgPSBlbnRpdHlFeHBpcmVzQXQocGF0aHMsIHN0YXRlLmVudGl0eU1ldGEpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvY29uY2VwdHMvZXhwaXJ5LXBvbGljeSNleHBpcnktc3RhdHVzXG4gICAgLy8gd2UgZG9uJ3QgdHJhY2sgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFsZSBvciBmcmVzaCBiZWNhdXNlIHRoYXQgaXMgdGllZCB0byB0cmlnZ2VyaW5nXG4gICAgLy8gY29uZGl0aW9uc1xuICAgIGNvbnN0IGV4cGlyeVN0YXR1cyA9XG4gICAgICBtZXRhPy5pbnZhbGlkYXRlZCB8fCAoaW52YWxpZERlbm9ybWFsaXplICYmICFtZXRhPy5lcnJvcilcbiAgICAgICAgPyBFeHBpcnlTdGF0dXMuSW52YWxpZFxuICAgICAgICA6IGludmFsaWREZW5vcm1hbGl6ZSB8fCBlbmRwb2ludC5pbnZhbGlkSWZTdGFsZSB8fCBpbnZhbGlkUmVzdWx0c1xuICAgICAgICA/IEV4cGlyeVN0YXR1cy5JbnZhbGlkSWZTdGFsZVxuICAgICAgICA6IEV4cGlyeVN0YXR1cy5WYWxpZDtcblxuICAgIHJldHVybiB7IGRhdGEsIGV4cGlyeVN0YXR1cywgZXhwaXJlc0F0IH07XG4gIH07XG59XG5cbi8vIGJlbmNobWFyazogaHR0cHM6Ly93d3cubWVhc3VyZXRoYXQubmV0L0JlbmNobWFya3MvU2hvdy8yNDY5MS8wL21pbi1yZWR1Y2VyLXZzLWltcGVyYXRpdmUtd2l0aC1wYXRoc1xuLy8gZWFybGllc3QgZXhwaXJ5IGRpY3RhdGVzIGFnZVxuZnVuY3Rpb24gZW50aXR5RXhwaXJlc0F0KFxuICBwYXRoczogUGF0aFtdLFxuICBlbnRpdHlNZXRhOiB7XG4gICAgcmVhZG9ubHkgW2VudGl0eUtleTogc3RyaW5nXToge1xuICAgICAgcmVhZG9ubHkgW3BrOiBzdHJpbmddOiB7XG4gICAgICAgIHJlYWRvbmx5IGRhdGU6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgZXhwaXJlc0F0OiBudW1iZXI7XG4gICAgICAgIHJlYWRvbmx5IGZldGNoZWRBdDogbnVtYmVyOyAvLyBUaGlzIGlzIG9ubHkgdGhlIHZhbHVlIHVudGlsIGl0IGlzIHNldCBieSB0aGUgQ2FjaGVQcm92aWRlclxuICAgICAgfTtcbiAgICB9O1xuICB9LFxuKSB7XG4gIGxldCBleHBpcmVzQXQgPSBJbmZpbml0eTtcbiAgZm9yIChjb25zdCB7IHBrLCBrZXkgfSBvZiBwYXRocykge1xuICAgIGNvbnN0IGVudGl0eUV4cGlyeSA9IGVudGl0eU1ldGFba2V5XT8uW3BrXT8uZXhwaXJlc0F0O1xuICAgIC8vIGV4cGlyZXNBdCB3aWxsIGFsd2F5cyByZXNvbHZlIHRvIGZhbHNlIHdpdGggYW55IGNvbXBhcmlzb25cbiAgICBpZiAoZW50aXR5RXhwaXJ5IDwgZXhwaXJlc0F0KSBleHBpcmVzQXQgPSBlbnRpdHlFeHBpcnk7XG4gIH1cbiAgcmV0dXJuIGV4cGlyZXNBdDtcbn1cblxuLyoqIERldGVybWluZSB3aGV0aGVyIHRoZSBzY2hlbWEgaGFzIGFueSBlbnRpdGllcy5cbiAqXG4gKiBXaXRob3V0IGVudGl0aWVzLCBkZW5vcm1hbGl6YXRpb24gaXMgbm90IG5lZWRlZCwgYW5kIHJlc3VsdHMgc2hvdWxkIG5vdCBiZSBpbmZlcnJlZC5cbiAqL1xuZnVuY3Rpb24gc2NoZW1hSGFzRW50aXR5KHNjaGVtYTogU2NoZW1hKTogYm9vbGVhbiB7XG4gIGlmIChpc0VudGl0eShzY2hlbWEpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSlcbiAgICByZXR1cm4gc2NoZW1hLmxlbmd0aCAhPT0gMCAmJiBzY2hlbWFIYXNFbnRpdHkoc2NoZW1hWzBdKTtcbiAgaWYgKHNjaGVtYSAmJiAodHlwZW9mIHNjaGVtYSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHNjaGVtYSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBjb25zdCBuZXN0ZWRTY2hlbWEgPVxuICAgICAgJ3NjaGVtYScgaW4gc2NoZW1hID8gKHNjaGVtYS5zY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgU2NoZW1hPikgOiBzY2hlbWE7XG4gICAgaWYgKHR5cGVvZiBuZXN0ZWRTY2hlbWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzY2hlbWFIYXNFbnRpdHkobmVzdGVkU2NoZW1hKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobmVzdGVkU2NoZW1hKS5zb21lKHggPT4gc2NoZW1hSGFzRW50aXR5KHgpKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIHsgRXJyb3JUeXBlcyB9O1xuXG5jbGFzcyBTbmFwc2hvdDxUID0gdW5rbm93bj4gaW1wbGVtZW50cyBTbmFwc2hvdEludGVyZmFjZSB7XG4gIHByaXZhdGUgc3RhdGU6IFN0YXRlPFQ+O1xuICBwcml2YXRlIGNvbnRyb2xsZXI6IENvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGZldGNoZWRBdDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsIHN0YXRlOiBTdGF0ZTxUPiwgZmV0Y2hlZEF0ID0gMCkge1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIHRoaXMuZmV0Y2hlZEF0ID0gZmV0Y2hlZEF0O1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBEYXRhIEFjY2VzcyAqKioqKioqKioqKioqKiovXG4gIC8qKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL1NuYXBzaG90I2dldFJlc3BvbnNlICovXG4gIGdldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5JyB8ICdzY2hlbWEnIHwgJ2ludmFsaWRJZlN0YWxlJz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH0gPT4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0UmVzcG9uc2UoZW5kcG9pbnQsIC4uLmFyZ3MsIHRoaXMuc3RhdGUpO1xuICB9O1xuXG4gIC8qKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL1NuYXBzaG90I2dldEVycm9yICovXG4gIGdldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5Jz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEVycm9yKGVuZHBvaW50LCAuLi5hcmdzLCB0aGlzLnN0YXRlKTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBT0EsU0FDRUEsYUFBYSxFQUNiQyxZQUFZLEVBTVpDLGlCQUFpQixFQUNqQkMsUUFBUSxFQUNSQyxXQUFXLFFBQ04sd0JBQXdCO0FBQy9CLFNBQVNDLFlBQVksRUFBRUMsaUJBQWlCLFFBQVEsd0JBQXdCO0FBRXhFLE9BQU9DLGVBQWUsTUFBTSxzQkFBc0I7QUFDbEQsT0FBT0MsV0FBVyxNQUFNLGtCQUFrQjtBQUMxQyxPQUFPQyxnQkFBZ0IsTUFBTSx1QkFBdUI7QUFDcEQsT0FBT0MsbUJBQW1CLE1BQU0sMEJBQTBCO0FBQzFELE9BQU9DLFdBQVcsTUFBTSxrQkFBa0I7QUFDMUMsT0FBT0MsU0FBUyxNQUFNLGdCQUFnQjtBQUN0QyxTQUNFQyxvQkFBb0IsRUFDcEJDLGtCQUFrQixRQUNiLHlCQUF5QjtBQUVoQyxTQUFTQyxZQUFZLFFBQVEsbUNBQW1DO0FBQ2hFLE9BQU9DLFVBQVUsTUFBTSx3QkFBd0I7QUFZL0MsTUFBTUMsYUFBYSxHQUFJQyxNQUFlLElBQW9CO0VBQ3hELE1BQU0sSUFBSUMsS0FBSyxDQUNaLGlFQUFnRSxHQUM5RCx5REFDTCxDQUFDO0FBQ0gsQ0FBQztBQUNELE1BQU1DLFVBQVUsR0FBR0EsQ0FBQSxLQUFzQjtFQUN2QztFQUNBO0VBQ0EsT0FBT0wsWUFBWTtBQUNyQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxNQUFN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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@data-client/core",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "High performance reactive framework for async data.",
5
5
  "sideEffects": false,
6
6
  "main": "dist/index.js",
@@ -127,18 +127,16 @@ export default class Controller<
127
127
  >(
128
128
  endpoint: E,
129
129
  ...args: readonly [...Parameters<E>]
130
- ):
131
- | (E['schema'] extends undefined | null
132
- ? ReturnType<E>
133
- : Promise<Denormalize<E['schema']>>)
134
- | undefined => {
135
- const { expiresAt, expiryStatus } = this.getResponse(
130
+ ): E['schema'] extends undefined | null
131
+ ? ReturnType<E> | ResolveType<E>
132
+ : Promise<Denormalize<E['schema']>> | Denormalize<E['schema']> => {
133
+ const { data, expiresAt, expiryStatus } = this.getResponse(
136
134
  endpoint,
137
135
  ...args,
138
136
  this.getState(),
139
137
  );
140
138
  if (expiryStatus !== ExpiryStatus.Invalid && Date.now() <= expiresAt)
141
- return;
139
+ return data as any;
142
140
  return this.fetch(endpoint, ...args);
143
141
  };
144
142
 
@@ -30,7 +30,7 @@ describe('Controller', () => {
30
30
  });
31
31
 
32
32
  describe('fetchIfStale', () => {
33
- it('should NOT fetch if result is NOT stale', () => {
33
+ it('should NOT fetch if result is NOT stale', async () => {
34
34
  const payload = {
35
35
  id: 5,
36
36
  title: 'hi ho',
@@ -61,8 +61,11 @@ describe('Controller', () => {
61
61
  dispatch: jest.fn(() => Promise.resolve()),
62
62
  getState,
63
63
  });
64
- controller.fetchIfStale(CoolerArticleResource.get, { id: payload.id });
64
+ const article = await controller.fetchIfStale(CoolerArticleResource.get, {
65
+ id: payload.id,
66
+ });
65
67
  expect(controller.dispatch.mock.calls.length).toBe(0);
68
+ expect(article.title).toBe(payload.title);
66
69
  });
67
70
  it('should fetch if result stale', () => {
68
71
  const payload = {
@@ -95,7 +98,9 @@ describe('Controller', () => {
95
98
  dispatch: jest.fn(() => Promise.resolve()),
96
99
  getState,
97
100
  });
98
- controller.fetchIfStale(CoolerArticleResource.get, { id: payload.id });
101
+ controller.fetchIfStale(CoolerArticleResource.get, {
102
+ id: payload.id,
103
+ });
99
104
 
100
105
  expect(controller.dispatch.mock.calls.length).toBe(1);
101
106
  });
@@ -1,5 +1,5 @@
1
1
  import { ErrorTypes, SnapshotInterface, DenormalizeCache, Schema, Denormalize } from '@data-client/normalizr';
2
- import { ExpiryStatus, EndpointInterface, FetchFunction, DenormalizeNullable } from '@data-client/normalizr';
2
+ import { ExpiryStatus, EndpointInterface, FetchFunction, ResolveType, DenormalizeNullable } from '@data-client/normalizr';
3
3
  import { EndpointUpdateFunction } from './types.js';
4
4
  import { ActionTypes, State } from '../types.js';
5
5
  export type GenericDispatch = (value: any) => Promise<void>;
@@ -44,7 +44,7 @@ export default class Controller<D extends GenericDispatch = DataClientDispatch>
44
44
  */
45
45
  fetchIfStale: <E extends EndpointInterface<FetchFunction, Schema | undefined, boolean | undefined> & {
46
46
  update?: EndpointUpdateFunction<E> | undefined;
47
- }>(endpoint: E, ...args_0: Parameters<E>) => (E["schema"] extends null | undefined ? ReturnType<E> : Promise<Denormalize<E["schema"]>>) | undefined;
47
+ }>(endpoint: E, ...args_0: Parameters<E>) => E["schema"] extends null | undefined ? ReturnType<E> | ResolveType<E> : Denormalize<E["schema"]> | Promise<Denormalize<E["schema"]>>;
48
48
  /**
49
49
  * Forces refetching and suspense on useSuspense with the same Endpoint and parameters.
50
50
  * @see https://resthooks.io/docs/api/Controller#invalidate