@rest-hooks/core
Advanced tools
Comparing version 4.2.3 to 4.2.4
@@ -700,7 +700,7 @@ 'use strict'; | ||
} | ||
if (isActive && !this.globalCache.results[key]) this.globalCache.results[key] = new normalizr.WeakListMap(); | ||
if (isActive && !this.globalCache.results[key]) this.globalCache.results[key] = new normalizr.WeakEntityMap(); | ||
// second argument is false if any entities are missing | ||
// eslint-disable-next-line prefer-const | ||
const [data, found, suspend, resolvedEntities] = normalizr.denormalize(results, schema, state.entities, this.globalCache.entities, isActive ? this.globalCache.results[key] : undefined); | ||
const [data, found, suspend, entityPaths] = normalizr.denormalize(results, schema, state.entities, this.globalCache.entities, isActive ? this.globalCache.results[key] : undefined); | ||
@@ -711,9 +711,15 @@ // fallback to entity expiry time | ||
if (found) { | ||
const entityMeta = state.entityMeta; | ||
// oldest entity dictates age | ||
expiresAt = Infinity; | ||
// using Object.keys ensures we don't hit `toString` type members | ||
Object.entries(resolvedEntities).forEach(([key, entities]) => Object.keys(entities).forEach(pk => { | ||
var _state$entityMeta$key, _state$entityMeta$key2, _state$entityMeta$key3; | ||
expiresAt = Math.min(expiresAt, (_state$entityMeta$key = (_state$entityMeta$key2 = state.entityMeta[key]) == null ? void 0 : (_state$entityMeta$key3 = _state$entityMeta$key2[pk]) == null ? void 0 : _state$entityMeta$key3.expiresAt) != null ? _state$entityMeta$key : Infinity); | ||
})); | ||
expiresAt = entityPaths.reduce((expiresAt, { | ||
pk, | ||
key | ||
}) => { | ||
var _entityMeta$key$pk$ex, _entityMeta$key, _entityMeta$key$pk; | ||
return Math.min(expiresAt, (_entityMeta$key$pk$ex = (_entityMeta$key = entityMeta[key]) == null ? void 0 : (_entityMeta$key$pk = _entityMeta$key[pk]) == null ? void 0 : _entityMeta$key$pk.expiresAt) != null ? _entityMeta$key$pk$ex : Infinity); | ||
}, Infinity); | ||
/*expiresAt = entityPaths | ||
.map(({ pk, key }) => entityMeta[key]?.[pk]?.expiresAt) | ||
.filter(a => a) | ||
.reduce((a, b) => Math.min(a, b), Infinity); Alternative method - is it faster?*/ | ||
} else { | ||
@@ -804,3 +810,3 @@ expiresAt = 0; | ||
constructor(dataExpiryLength = 60000, errorExpiryLength = 1000) { | ||
this.fetched = {}; | ||
this.fetched = Object.create(null); | ||
this.resolvers = {}; | ||
@@ -872,3 +878,3 @@ this.rejectors = {}; | ||
/* istanbul ignore next */ | ||
return action.type === FETCH_TYPE && Object.hasOwn(this.fetched, action.meta.key); | ||
return action.type === FETCH_TYPE && action.meta.key in this.fetched; | ||
} | ||
@@ -1019,3 +1025,3 @@ | ||
// this can still turn out to be untrue since this is async | ||
if (Object.hasOwn(this.fetched, action.meta.key)) { | ||
if (action.meta.key in this.fetched) { | ||
let promiseHandler; | ||
@@ -1022,0 +1028,0 @@ if (action.error) { |
@@ -1,1 +0,1 @@ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@rest-hooks/normalizr")):"function"==typeof define&&define.amd?define(["exports","@rest-hooks/normalizr"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).restHookCore={},e.normalizr)}(this,(function(e,t){"use strict";var s="function"==typeof requestIdleCallback?requestIdleCallback:e=>setTimeout(e,0);const r="rest-hooks/fetch",i="rest-hooks/receive",n=i,a="rest-hooks/optimistic",o="rest-hooks/reset",c="rest-hooks/subscribe",l="rest-hook/unsubscribe",h="rest-hooks/invalidate",d="rest-hooks/invalidateall",u="rest-hooks/gc";var p=Object.freeze({__proto__:null,FETCH_TYPE:r,RECEIVE_TYPE:i,SET_TYPE:n,OPTIMISTIC_TYPE:a,RESET_TYPE:o,SUBSCRIBE_TYPE:c,UNSUBSCRIBE_TYPE:l,INVALIDATE_TYPE:h,INVALIDATEALL_TYPE:d,GC_TYPE:u});function m(e,{schema:t,key:s,args:r,updaters:n,fetchedAt:a=0,update:o,dataExpiryLength:c}){const l=Date.now(),h={schema:t,key:s,args:r,date:l,fetchedAt:a,expiresAt:l+c};return h.updaters=n,h.update=o,{type:i,payload:e,meta:h}}function f(e,{schema:t,key:s,options:r,errorExpiryLength:n=6e4,fetchedAt:a=0}){const o=Date.now();return{type:i,payload:e,meta:{schema:t,key:s,date:o,fetchedAt:a,expiresAt:o+n,errorPolicy:null==r?void 0:r.errorPolicy},error:!0}}var y=Object.freeze({__proto__:null,createFetch:function(e,{params:t,body:s,throttle:i,updateParams:n}){const{schema:a,type:o,getFetchKey:c,options:l}=e,h=c(t);let d=0,u=0;const p=new Promise(((e,t)=>{[d,u]=[e,t]})),m={schema:a,type:o,args:[t,s],key:h,throttle:i,options:l,resolve:d,reject:u,promise:p,createdAt:Date.now()};return e.update&&(m.update=e.update),n&&(m.update=e=>{const t={};return n.forEach((([s,r,i])=>{t[s.getFetchKey(r)]=t=>i(e,t)})),t}),null!=l&&l.optimisticUpdate&&(m.optimisticResponse=l.optimisticUpdate(t,s)),{type:r,payload:()=>e.fetch(t,s),meta:m}},createReceive:m,createReceiveError:f});function g(e,t){var s;const r=t.meta.optimisticResponse;let i;if((null==(s=t.endpoint)?void 0:s.getOptimisticResponse)&&t.endpoint)i=function(e,{args:t,fetchedAt:s}){var r;const i=null!=(r=e.dataExpiryLength)?r:6e4,n=Date.now(),o={args:t,fetchedAt:s,date:n,expiresAt:n+i,schema:e.schema,key:e.key(...t)};return e.update&&(o.update=e.update),e.errorPolicy&&(o.errorPolicy=e.errorPolicy),{type:a,endpoint:e,meta:o}}(t.endpoint,{args:t.meta.args,fetchedAt:"number"!=typeof t.meta.createdAt?t.meta.createdAt.getTime():t.meta.createdAt});else{if(!r)return e;i=m(r,Object.assign({},t.meta,{dataExpiryLength:1/0}))}return Object.assign({},e,{optimistic:[...e.optimistic,i]})}function v(e,s,r){if(s.error)return E(e,s,s.payload);try{var i;let o;if(s.type===a){if(!s.endpoint.getOptimisticResponse)return e;try{o=s.endpoint.getOptimisticResponse.call(s.endpoint,r.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 o=s.payload;const{result:c,entities:l,indexes:h,entityMeta:d}=t.normalize(o,s.meta.schema,e.entities,e.indexes,e.entityMeta,s.meta);let u=Object.assign({},e.results,{[s.meta.key]:c});try{if("updaters"in s.meta&&s.meta.updaters&&(u=function(e,t,s){return Object.assign({},e,Object.fromEntries(Object.entries(s).map((([s,r])=>[s,r(t,e[s])]))))}(u,c,s.meta.updaters)),s.meta.update){const e=s.meta.update(c,...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:l,indexes:h,results:u,entityMeta:d,meta:Object.assign({},e.meta,{[s.meta.key]:{date:s.meta.date,expiresAt:s.meta.expiresAt,prevExpiresAt:null==(i=e.meta[s.meta.key])?void 0:i.expiresAt}}),optimistic:b(e,s),lastReset:e.lastReset}}catch(t){return"object"==typeof t&&(t.message=`Error processing ${s.meta.key}\n\nFull Schema: ${JSON.stringify(s.meta.schema,void 0,2)}\n\nError:\n${t.message}`,"payload"in s&&(t.payload=s.payload),t.status=400),E(e,s,t)}}function E(e,t,s){return"AbortError"===s.name?Object.assign({},e,{optimistic:b(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.meta.errorPolicy?void 0:t.meta.errorPolicy(s)}}),optimistic:b(e,t)})}function b(e,t){return e.optimistic.filter((e=>e.meta.key!==t.meta.key||(e.type===a?e.meta.fetchedAt!==t.meta.fetchedAt:e.meta.date>t.meta.date)))}function L(e){return function(t,s){var i;switch(t||(t=O),s.type){case u:return s.entities.forEach((([e,s])=>{var r,i;null==(r=t.entities[e])||delete r[s],null==(i=t.entityMeta[e])||delete i[s]})),s.results.forEach((e=>{delete t.results[e],delete t.meta[e]})),t;case r:return g(t,s);case a:case n:return v(t,s,e);case d:case h:return function(e,t){const s=Object.assign({},e.results),r=Object.assign({},e.meta),i=e=>{delete s[e];const t=Object.assign({},r[e],{expiresAt:0,invalidated:!0});delete t.error,r[e]=t};return t.type===h?i(t.meta.key):Object.keys(s).forEach((e=>{t.testKey(e)&&i(e)})),Object.assign({},e,{results:s,meta:r})}(t,s);case o:return Object.assign({},O,{lastReset:null!=(i=s.date)?i:Date.now()});default:return t}}}const O={entities:{},indexes:{},results:{},meta:{},entityMeta:{},optimistic:[],lastReset:0};var k=Object.freeze({__proto__:null,inferResults:t.inferResults,DELETED:t.DELETED,RIC:s,initialState:O});function w(e,{args:t}){const s=e.key(...t);let i=0,n=0;const a=new Promise(((e,t)=>{[i,n]=[e,t]})),o={schema:e.schema,type:e.sideEffect?"mutate":"read",args:t,key:s,throttle:!e.sideEffect,options:e,resolve:i,reject:n,promise:a,createdAt:Date.now()};return e.update&&(o.update=e.update),e.optimisticUpdate&&(o.optimisticResponse=e.optimisticUpdate(...t)),{type:r,payload:()=>e(...t),meta:o,endpoint:e}}function A(e,{args:t,fetchedAt:s,response:r,error:i=!1}){var a,o;const c=i?null!=(a=e.errorExpiryLength)?a:1e3:null!=(o=e.dataExpiryLength)?o:6e4,l=Date.now(),h={args:t,fetchedAt:null!=s?s:l,date:l,expiresAt:l+c,schema:e.schema,key:e.key(...t)};e.update&&(h.update=e.update),e.errorPolicy&&(h.errorPolicy=e.errorPolicy);const d={type:n,payload:r,endpoint:e,meta:h};return i&&(d.error=!0),d}function I(e,t){return e.meta[t]}const S=e=>{throw new Error("Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")},x=()=>O;class j{constructor({dispatch:e=S,getState:s=x,globalCache:r={entities:{},results:{}}}={}){this.fetch=(e,...t)=>{const s=w(e,{args:t});return this.dispatch(s),s.meta.promise},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.resetEntireStore=()=>this.dispatch({type:o,date:Date.now()}),this.setResponse=(e,...t)=>{const s=t[t.length-1],r=A(e,{args:t.slice(0,t.length-1),response:s});return this.dispatch(r)},this.receive=(e,...t)=>this.setResponse(e,...t),this.setError=(e,...t)=>{const s=t[t.length-1],r=A(e,{args:t.slice(0,t.length-1),response:s,error:!0});return this.dispatch(r)},this.receiveError=(e,...t)=>this.setError(e,...t),this.resolve=(e,t)=>this.dispatch(A(e,t)),this.subscribe=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:c,endpoint:e,meta:{args:t,key:e.key(...t),fetch:()=>e(...t),schema:e.schema,options:e}}}(e,{args:t})):Promise.resolve(),this.unsubscribe=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:l,endpoint:e,meta:{args:t,key:e.key(...t),options:e}}}(e,{args:t})):Promise.resolve(),this.snapshot=(e,t)=>new _(this,e,t),this.getError=(e,...t)=>{if(null===t[0])return;const s=t[t.length-1],r=t.slice(0,t.length-1),i=e.key(...r),n=I(s,i);return void 0===s.results[i]||"soft"!==(null==n?void 0:n.errorPolicy)?null==n?void 0:n.error:void 0},this.getResponse=(e,...s)=>{const r=s[s.length-1],i=s.slice(0,s.length-1),n=1!==i.length||null!==i[0],a=n?e.key(...i):"",o=n&&r.results[a],c=e.schema,l=I(r,a);let h=null==l?void 0:l.expiresAt;const d=this.getResults(e.schema,o,i,r.indexes,r.entities);if(!e.schema||!R(e.schema))return{data:d,expiryStatus:null!=l&&l.invalidated?t.ExpiryStatus.Invalid:o&&!e.invalidIfStale?t.ExpiryStatus.Valid:t.ExpiryStatus.InvalidIfStale,expiresAt:h||0};n&&!this.globalCache.results[a]&&(this.globalCache.results[a]=new t.WeakListMap);const[u,p,m,f]=t.denormalize(d,c,r.entities,this.globalCache.entities,n?this.globalCache.results[a]:void 0);h||(p?(h=1/0,Object.entries(f).forEach((([e,t])=>Object.keys(t).forEach((t=>{var s,i,n;h=Math.min(h,null!=(s=null==(i=r.entityMeta[e])||null==(n=i[t])?void 0:n.expiresAt)?s:1/0)}))))):h=0);return{data:u,expiryStatus:null!=l&&l.invalidated||m&&(null==l||!l.error)?t.ExpiryStatus.Invalid:m||e.invalidIfStale||!o&&!p?t.ExpiryStatus.InvalidIfStale:t.ExpiryStatus.Valid,expiresAt:h}},this.getResults=(e,s,r,i,n)=>s||void 0===e?s:t.inferResults(e,r,i,n),this.dispatch=e,this.getState=s,this.globalCache=r}}function R(e){if(t.isEntity(e))return!0;if(Array.isArray(e))return 0!==e.length&&R(e[0]);if(e&&("object"==typeof e||"function"==typeof e)){const t="schema"in e?e.schema:e;return"function"==typeof t?R(t):Object.values(t).some((e=>R(e)))}return!1}class _{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 P=L(new j);var q=Object.freeze({__proto__:null});class D{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 M{isOnline(){return!0}addOnlineListener(){}removeOnlineListener(){}addOfflineListener(){}removeOfflineListener(){}}let C;C="undefined"!=typeof navigator&&"function"==typeof addEventListener?D:M;var H=C;const F="undefined"!=typeof Intl;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=j,e.DefaultConnectionListener=H,e.DevToolsManager=class{constructor(e={name:`Rest Hooks: ${(()=>{var e;return null==(e=globalThis.document)?void 0:e.title})()}`,autoPause:!0,serialize:{options:{circular:"[CIRCULAR]",date:!0},replacer:(e,t)=>F&&"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}},t){this.devTools="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__.connect(e),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={},this.resolvers={},this.rejectors={},this.fetchedAt={},this.getState=()=>O,this.controller=new j,this.dataExpiryLength=e,this.errorExpiryLength=t,this.middleware=({dispatch:e,getState:t,controller:s})=>(this.getState=t,this.controller=s,t=>i=>{var a;switch(i.type){case r:return this.handleFetch(i,e,s),void 0!==i.meta.optimisticResponse||void 0!==(null==(a=i.endpoint)?void 0:a.getOptimisticResponse)?t(i):Promise.resolve();case n:return t(i).then((()=>{if(i.meta.key in this.fetched){var e;const t=null==(e=s.getState().meta[i.meta.key])?void 0:e.error;t?this.handleReceive(f(t,i.meta)):this.handleReceive(i)}}));case o:{const e=Object.assign({},this.rejectors);return this.clearAll(),t(i).then((()=>{for(const t in e)e[t](new T)}))}default:return t(i)}})}skipLogging(e){return e.type===r&&Object.hasOwn(this.fetched,e.meta.key)}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(){if(this.cleanupDate)return this.cleanupDate;const e=this.controller.getState().lastReset;return e instanceof Date?e.valueOf():"number"!=typeof e?-1/0:e}handleFetch(e,t,s){const r=e.payload,{key:i,throttle:n,resolve:a,reject:o}=e.meta,c="number"!=typeof e.meta.createdAt?e.meta.createdAt.getTime():e.meta.createdAt,l=()=>{let t=r();const s=e=>e.then((e=>(a(e),e))).catch((e=>{throw o(e),e}));return!n&&e.endpoint&&(t=s(t)),t=t.then((t=>{let s=this.getLastReset();var r,i;c>=s&&(e.endpoint&&this.controller?this.controller.resolve(e.endpoint,{args:e.meta.args,response:t,fetchedAt:c}):this.controller.dispatch(m(t,Object.assign({},e.meta,{fetchedAt:c,dataExpiryLength:null!=(r=null==(i=e.meta.options)?void 0:i.dataExpiryLength)?r:this.dataExpiryLength}))));return t})).catch((t=>{const s=this.getLastReset();var r,i;c>=s&&(e.endpoint&&this.controller?this.controller.resolve(e.endpoint,{args:e.meta.args,response:t,fetchedAt:c,error:!0}):this.controller.dispatch(f(t,Object.assign({},e.meta,{errorExpiryLength:null!=(r=null==(i=e.meta.options)?void 0:i.errorExpiryLength)?r:this.errorExpiryLength,fetchedAt:c}))));throw t})),n||e.endpoint||(t=s(t)),t};return n?this.throttle(i,l,c).then((e=>a(e))).catch((e=>o(e))):l().catch((()=>{}))}handleReceive(e){if(Object.hasOwn(this.fetched,e.meta.key)){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,r){const i=this.getLastReset();return e in this.fetched&&this.fetchedAt[e]>i||(this.fetched[e]=new Promise(((t,s)=>{this.resolvers[e]=t,this.rejectors[e]=s})),this.fetchedAt[e]=r,s((()=>{t().catch((()=>null))}),{timeout:500})),this.fetched[e]}},e.PollingSubscription=class{constructor({key:e,schema:t,fetch:s,frequency:r,getState:i},n,a){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((()=>{delete this.startId,this.update(),this.run()}),Math.max(0,this.lastFetchTime()-e+this.frequency)),this.connectionListener.addOfflineListener(this.offlineListener)},void 0===r)throw new Error("frequency needed for polling subscription");this.schema=t,this.fetch=s,this.frequency=r,this.key=e,this.frequencyHistogram.set(this.frequency,1),this.dispatch=n,this.getState=i,this.connectionListener=a||new H,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.fetch();e.schema=this.schema,e.key=()=>this.key,e.dataExpiryLength=this.frequency/2,e.errorExpiryLength=this.frequency/10,e.errorPolicy=()=>"soft";const t=w(e,{args:[]});t.meta.promise.catch((e=>null)),this.dispatch(t)}run(){this.startId||(this.intervalId&&(this.lastIntervalId=this.intervalId),this.intervalId=setInterval((()=>{this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.update()}),this.frequency))}lastFetchTime(){var e,t;return null!=(e=null==(t=this.getState().meta[this.key])?void 0:t.date)?e:0}},e.ResetError=T,e.SubscriptionManager=class{constructor(e){this.subscriptions={},this.Subscription=e,this.middleware=({dispatch:e,getState:t})=>s=>r=>{switch(r.type){case c:try{this.handleSubscribe(r,e,t)}catch(e){console.error(e)}return Promise.resolve();case l:return this.handleUnsubscribe(r,e),Promise.resolve();default:return s(r)}}}cleanup(){for(const e in this.subscriptions)this.subscriptions[e].cleanup()}handleSubscribe(e,t,s){let r;if(e.endpoint){const{endpoint:t}=e,{args:i}=e.meta;r={schema:t.schema,fetch:()=>t(...i),frequency:t.pollFrequency,key:t.key(...i),getState:s}}else{var i;r={key:e.meta.key,frequency:null==(i=e.meta.options)?void 0:i.pollFrequency,schema:e.meta.schema,fetch:e.meta.fetch,getState:s}}r.key in this.subscriptions?this.subscriptions[r.key].add(r.frequency):this.subscriptions[r.key]=new this.Subscription(r,t)}handleUnsubscribe(e,t){var s;const r=e.meta.key,i=null==(s=e.meta.options)?void 0:s.pollFrequency;if(r in this.subscriptions){this.subscriptions[r].remove(i)&&delete this.subscriptions[r]}}getMiddleware(){return this.middleware}},e.__INTERNAL__=k,e.actionTypes=p,e.applyManager=function(e,t){return e.map((e=>{const s=e.getMiddleware();return({dispatch:e,getState:r})=>{t.dispatch=e,t.getState=r;const i=Object.create(t,{controller:{value:t}});return s(i)}}))},e.createFetch=w,e.createReceive=A,e.createReducer=L,e.initialState=O,e.legacyActions=y,e.newActions=q,e.reducer=P,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@rest-hooks/normalizr")):"function"==typeof define&&define.amd?define(["exports","@rest-hooks/normalizr"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).restHookCore={},e.normalizr)}(this,(function(e,t){"use strict";var s="function"==typeof requestIdleCallback?requestIdleCallback:e=>setTimeout(e,0);const r="rest-hooks/fetch",i="rest-hooks/receive",n=i,a="rest-hooks/optimistic",o="rest-hooks/reset",c="rest-hooks/subscribe",l="rest-hook/unsubscribe",h="rest-hooks/invalidate",d="rest-hooks/invalidateall",u="rest-hooks/gc";var p=Object.freeze({__proto__:null,FETCH_TYPE:r,RECEIVE_TYPE:i,SET_TYPE:n,OPTIMISTIC_TYPE:a,RESET_TYPE:o,SUBSCRIBE_TYPE:c,UNSUBSCRIBE_TYPE:l,INVALIDATE_TYPE:h,INVALIDATEALL_TYPE:d,GC_TYPE:u});function m(e,{schema:t,key:s,args:r,updaters:n,fetchedAt:a=0,update:o,dataExpiryLength:c}){const l=Date.now(),h={schema:t,key:s,args:r,date:l,fetchedAt:a,expiresAt:l+c};return h.updaters=n,h.update=o,{type:i,payload:e,meta:h}}function f(e,{schema:t,key:s,options:r,errorExpiryLength:n=6e4,fetchedAt:a=0}){const o=Date.now();return{type:i,payload:e,meta:{schema:t,key:s,date:o,fetchedAt:a,expiresAt:o+n,errorPolicy:null==r?void 0:r.errorPolicy},error:!0}}var y=Object.freeze({__proto__:null,createFetch:function(e,{params:t,body:s,throttle:i,updateParams:n}){const{schema:a,type:o,getFetchKey:c,options:l}=e,h=c(t);let d=0,u=0;const p=new Promise(((e,t)=>{[d,u]=[e,t]})),m={schema:a,type:o,args:[t,s],key:h,throttle:i,options:l,resolve:d,reject:u,promise:p,createdAt:Date.now()};return e.update&&(m.update=e.update),n&&(m.update=e=>{const t={};return n.forEach((([s,r,i])=>{t[s.getFetchKey(r)]=t=>i(e,t)})),t}),null!=l&&l.optimisticUpdate&&(m.optimisticResponse=l.optimisticUpdate(t,s)),{type:r,payload:()=>e.fetch(t,s),meta:m}},createReceive:m,createReceiveError:f});function g(e,t){var s;const r=t.meta.optimisticResponse;let i;if((null==(s=t.endpoint)?void 0:s.getOptimisticResponse)&&t.endpoint)i=function(e,{args:t,fetchedAt:s}){var r;const i=null!=(r=e.dataExpiryLength)?r:6e4,n=Date.now(),o={args:t,fetchedAt:s,date:n,expiresAt:n+i,schema:e.schema,key:e.key(...t)};return e.update&&(o.update=e.update),e.errorPolicy&&(o.errorPolicy=e.errorPolicy),{type:a,endpoint:e,meta:o}}(t.endpoint,{args:t.meta.args,fetchedAt:"number"!=typeof t.meta.createdAt?t.meta.createdAt.getTime():t.meta.createdAt});else{if(!r)return e;i=m(r,Object.assign({},t.meta,{dataExpiryLength:1/0}))}return Object.assign({},e,{optimistic:[...e.optimistic,i]})}function v(e,s,r){if(s.error)return E(e,s,s.payload);try{var i;let o;if(s.type===a){if(!s.endpoint.getOptimisticResponse)return e;try{o=s.endpoint.getOptimisticResponse.call(s.endpoint,r.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 o=s.payload;const{result:c,entities:l,indexes:h,entityMeta:d}=t.normalize(o,s.meta.schema,e.entities,e.indexes,e.entityMeta,s.meta);let u=Object.assign({},e.results,{[s.meta.key]:c});try{if("updaters"in s.meta&&s.meta.updaters&&(u=function(e,t,s){return Object.assign({},e,Object.fromEntries(Object.entries(s).map((([s,r])=>[s,r(t,e[s])]))))}(u,c,s.meta.updaters)),s.meta.update){const e=s.meta.update(c,...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:l,indexes:h,results:u,entityMeta:d,meta:Object.assign({},e.meta,{[s.meta.key]:{date:s.meta.date,expiresAt:s.meta.expiresAt,prevExpiresAt:null==(i=e.meta[s.meta.key])?void 0:i.expiresAt}}),optimistic:b(e,s),lastReset:e.lastReset}}catch(t){return"object"==typeof t&&(t.message=`Error processing ${s.meta.key}\n\nFull Schema: ${JSON.stringify(s.meta.schema,void 0,2)}\n\nError:\n${t.message}`,"payload"in s&&(t.payload=s.payload),t.status=400),E(e,s,t)}}function E(e,t,s){return"AbortError"===s.name?Object.assign({},e,{optimistic:b(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.meta.errorPolicy?void 0:t.meta.errorPolicy(s)}}),optimistic:b(e,t)})}function b(e,t){return e.optimistic.filter((e=>e.meta.key!==t.meta.key||(e.type===a?e.meta.fetchedAt!==t.meta.fetchedAt:e.meta.date>t.meta.date)))}function L(e){return function(t,s){var i;switch(t||(t=k),s.type){case u:return s.entities.forEach((([e,s])=>{var r,i;null==(r=t.entities[e])||delete r[s],null==(i=t.entityMeta[e])||delete i[s]})),s.results.forEach((e=>{delete t.results[e],delete t.meta[e]})),t;case r:return g(t,s);case a:case n:return v(t,s,e);case d:case h:return function(e,t){const s=Object.assign({},e.results),r=Object.assign({},e.meta),i=e=>{delete s[e];const t=Object.assign({},r[e],{expiresAt:0,invalidated:!0});delete t.error,r[e]=t};return t.type===h?i(t.meta.key):Object.keys(s).forEach((e=>{t.testKey(e)&&i(e)})),Object.assign({},e,{results:s,meta:r})}(t,s);case o:return Object.assign({},k,{lastReset:null!=(i=s.date)?i:Date.now()});default:return t}}}const k={entities:{},indexes:{},results:{},meta:{},entityMeta:{},optimistic:[],lastReset:0};var O=Object.freeze({__proto__:null,inferResults:t.inferResults,DELETED:t.DELETED,RIC:s,initialState:k});function A(e,{args:t}){const s=e.key(...t);let i=0,n=0;const a=new Promise(((e,t)=>{[i,n]=[e,t]})),o={schema:e.schema,type:e.sideEffect?"mutate":"read",args:t,key:s,throttle:!e.sideEffect,options:e,resolve:i,reject:n,promise:a,createdAt:Date.now()};return e.update&&(o.update=e.update),e.optimisticUpdate&&(o.optimisticResponse=e.optimisticUpdate(...t)),{type:r,payload:()=>e(...t),meta:o,endpoint:e}}function w(e,{args:t,fetchedAt:s,response:r,error:i=!1}){var a,o;const c=i?null!=(a=e.errorExpiryLength)?a:1e3:null!=(o=e.dataExpiryLength)?o:6e4,l=Date.now(),h={args:t,fetchedAt:null!=s?s:l,date:l,expiresAt:l+c,schema:e.schema,key:e.key(...t)};e.update&&(h.update=e.update),e.errorPolicy&&(h.errorPolicy=e.errorPolicy);const d={type:n,payload:r,endpoint:e,meta:h};return i&&(d.error=!0),d}function I(e,t){return e.meta[t]}const S=e=>{throw new Error("Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")},x=()=>k;class R{constructor({dispatch:e=S,getState:s=x,globalCache:r={entities:{},results:{}}}={}){this.fetch=(e,...t)=>{const s=A(e,{args:t});return this.dispatch(s),s.meta.promise},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.resetEntireStore=()=>this.dispatch({type:o,date:Date.now()}),this.setResponse=(e,...t)=>{const s=t[t.length-1],r=w(e,{args:t.slice(0,t.length-1),response:s});return this.dispatch(r)},this.receive=(e,...t)=>this.setResponse(e,...t),this.setError=(e,...t)=>{const s=t[t.length-1],r=w(e,{args:t.slice(0,t.length-1),response:s,error:!0});return this.dispatch(r)},this.receiveError=(e,...t)=>this.setError(e,...t),this.resolve=(e,t)=>this.dispatch(w(e,t)),this.subscribe=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:c,endpoint:e,meta:{args:t,key:e.key(...t),fetch:()=>e(...t),schema:e.schema,options:e}}}(e,{args:t})):Promise.resolve(),this.unsubscribe=(e,...t)=>null!==t[0]?this.dispatch(function(e,{args:t}){return{type:l,endpoint:e,meta:{args:t,key:e.key(...t),options:e}}}(e,{args:t})):Promise.resolve(),this.snapshot=(e,t)=>new _(this,e,t),this.getError=(e,...t)=>{if(null===t[0])return;const s=t[t.length-1],r=t.slice(0,t.length-1),i=e.key(...r),n=I(s,i);return void 0===s.results[i]||"soft"!==(null==n?void 0:n.errorPolicy)?null==n?void 0:n.error:void 0},this.getResponse=(e,...s)=>{const r=s[s.length-1],i=s.slice(0,s.length-1),n=1!==i.length||null!==i[0],a=n?e.key(...i):"",o=n&&r.results[a],c=e.schema,l=I(r,a);let h=null==l?void 0:l.expiresAt;const d=this.getResults(e.schema,o,i,r.indexes,r.entities);if(!e.schema||!j(e.schema))return{data:d,expiryStatus:null!=l&&l.invalidated?t.ExpiryStatus.Invalid:o&&!e.invalidIfStale?t.ExpiryStatus.Valid:t.ExpiryStatus.InvalidIfStale,expiresAt:h||0};n&&!this.globalCache.results[a]&&(this.globalCache.results[a]=new t.WeakEntityMap);const[u,p,m,f]=t.denormalize(d,c,r.entities,this.globalCache.entities,n?this.globalCache.results[a]:void 0);if(!h)if(p){const e=r.entityMeta;h=f.reduce(((t,{pk:s,key:r})=>{var i,n,a;return Math.min(t,null!=(i=null==(n=e[r])||null==(a=n[s])?void 0:a.expiresAt)?i:1/0)}),1/0)}else h=0;return{data:u,expiryStatus:null!=l&&l.invalidated||m&&(null==l||!l.error)?t.ExpiryStatus.Invalid:m||e.invalidIfStale||!o&&!p?t.ExpiryStatus.InvalidIfStale:t.ExpiryStatus.Valid,expiresAt:h}},this.getResults=(e,s,r,i,n)=>s||void 0===e?s:t.inferResults(e,r,i,n),this.dispatch=e,this.getState=s,this.globalCache=r}}function j(e){if(t.isEntity(e))return!0;if(Array.isArray(e))return 0!==e.length&&j(e[0]);if(e&&("object"==typeof e||"function"==typeof e)){const t="schema"in e?e.schema:e;return"function"==typeof t?j(t):Object.values(t).some((e=>j(e)))}return!1}class _{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 P=L(new R);var q=Object.freeze({__proto__:null});class D{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 M{isOnline(){return!0}addOnlineListener(){}removeOnlineListener(){}addOfflineListener(){}removeOfflineListener(){}}let C;C="undefined"!=typeof navigator&&"function"==typeof addEventListener?D:M;var H=C;const F="undefined"!=typeof Intl;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=R,e.DefaultConnectionListener=H,e.DevToolsManager=class{constructor(e={name:`Rest Hooks: ${(()=>{var e;return null==(e=globalThis.document)?void 0:e.title})()}`,autoPause:!0,serialize:{options:{circular:"[CIRCULAR]",date:!0},replacer:(e,t)=>F&&"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}},t){this.devTools="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__.connect(e),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.getState=()=>k,this.controller=new R,this.dataExpiryLength=e,this.errorExpiryLength=t,this.middleware=({dispatch:e,getState:t,controller:s})=>(this.getState=t,this.controller=s,t=>i=>{var a;switch(i.type){case r:return this.handleFetch(i,e,s),void 0!==i.meta.optimisticResponse||void 0!==(null==(a=i.endpoint)?void 0:a.getOptimisticResponse)?t(i):Promise.resolve();case n:return t(i).then((()=>{if(i.meta.key in this.fetched){var e;const t=null==(e=s.getState().meta[i.meta.key])?void 0:e.error;t?this.handleReceive(f(t,i.meta)):this.handleReceive(i)}}));case o:{const e=Object.assign({},this.rejectors);return this.clearAll(),t(i).then((()=>{for(const t in e)e[t](new T)}))}default:return t(i)}})}skipLogging(e){return e.type===r&&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(){if(this.cleanupDate)return this.cleanupDate;const e=this.controller.getState().lastReset;return e instanceof Date?e.valueOf():"number"!=typeof e?-1/0:e}handleFetch(e,t,s){const r=e.payload,{key:i,throttle:n,resolve:a,reject:o}=e.meta,c="number"!=typeof e.meta.createdAt?e.meta.createdAt.getTime():e.meta.createdAt,l=()=>{let t=r();const s=e=>e.then((e=>(a(e),e))).catch((e=>{throw o(e),e}));return!n&&e.endpoint&&(t=s(t)),t=t.then((t=>{let s=this.getLastReset();var r,i;c>=s&&(e.endpoint&&this.controller?this.controller.resolve(e.endpoint,{args:e.meta.args,response:t,fetchedAt:c}):this.controller.dispatch(m(t,Object.assign({},e.meta,{fetchedAt:c,dataExpiryLength:null!=(r=null==(i=e.meta.options)?void 0:i.dataExpiryLength)?r:this.dataExpiryLength}))));return t})).catch((t=>{const s=this.getLastReset();var r,i;c>=s&&(e.endpoint&&this.controller?this.controller.resolve(e.endpoint,{args:e.meta.args,response:t,fetchedAt:c,error:!0}):this.controller.dispatch(f(t,Object.assign({},e.meta,{errorExpiryLength:null!=(r=null==(i=e.meta.options)?void 0:i.errorExpiryLength)?r:this.errorExpiryLength,fetchedAt:c}))));throw t})),n||e.endpoint||(t=s(t)),t};return n?this.throttle(i,l,c).then((e=>a(e))).catch((e=>o(e))):l().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,r){const i=this.getLastReset();return e in this.fetched&&this.fetchedAt[e]>i||(this.fetched[e]=new Promise(((t,s)=>{this.resolvers[e]=t,this.rejectors[e]=s})),this.fetchedAt[e]=r,s((()=>{t().catch((()=>null))}),{timeout:500})),this.fetched[e]}},e.PollingSubscription=class{constructor({key:e,schema:t,fetch:s,frequency:r,getState:i},n,a){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((()=>{delete this.startId,this.update(),this.run()}),Math.max(0,this.lastFetchTime()-e+this.frequency)),this.connectionListener.addOfflineListener(this.offlineListener)},void 0===r)throw new Error("frequency needed for polling subscription");this.schema=t,this.fetch=s,this.frequency=r,this.key=e,this.frequencyHistogram.set(this.frequency,1),this.dispatch=n,this.getState=i,this.connectionListener=a||new H,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.fetch();e.schema=this.schema,e.key=()=>this.key,e.dataExpiryLength=this.frequency/2,e.errorExpiryLength=this.frequency/10,e.errorPolicy=()=>"soft";const t=A(e,{args:[]});t.meta.promise.catch((e=>null)),this.dispatch(t)}run(){this.startId||(this.intervalId&&(this.lastIntervalId=this.intervalId),this.intervalId=setInterval((()=>{this.lastIntervalId&&(clearInterval(this.lastIntervalId),delete this.lastIntervalId),this.update()}),this.frequency))}lastFetchTime(){var e,t;return null!=(e=null==(t=this.getState().meta[this.key])?void 0:t.date)?e:0}},e.ResetError=T,e.SubscriptionManager=class{constructor(e){this.subscriptions={},this.Subscription=e,this.middleware=({dispatch:e,getState:t})=>s=>r=>{switch(r.type){case c:try{this.handleSubscribe(r,e,t)}catch(e){console.error(e)}return Promise.resolve();case l:return this.handleUnsubscribe(r,e),Promise.resolve();default:return s(r)}}}cleanup(){for(const e in this.subscriptions)this.subscriptions[e].cleanup()}handleSubscribe(e,t,s){let r;if(e.endpoint){const{endpoint:t}=e,{args:i}=e.meta;r={schema:t.schema,fetch:()=>t(...i),frequency:t.pollFrequency,key:t.key(...i),getState:s}}else{var i;r={key:e.meta.key,frequency:null==(i=e.meta.options)?void 0:i.pollFrequency,schema:e.meta.schema,fetch:e.meta.fetch,getState:s}}r.key in this.subscriptions?this.subscriptions[r.key].add(r.frequency):this.subscriptions[r.key]=new this.Subscription(r,t)}handleUnsubscribe(e,t){var s;const r=e.meta.key,i=null==(s=e.meta.options)?void 0:s.pollFrequency;if(r in this.subscriptions){this.subscriptions[r].remove(i)&&delete this.subscriptions[r]}}getMiddleware(){return this.middleware}},e.__INTERNAL__=O,e.actionTypes=p,e.applyManager=function(e,t){return e.map((e=>{const s=e.getMiddleware();return({dispatch:e,getState:r})=>{t.dispatch=e,t.getState=r;const i=Object.create(t,{controller:{value:t}});return s(i)}}))},e.createFetch=A,e.createReceive=w,e.createReducer=L,e.initialState=k,e.legacyActions=y,e.newActions=q,e.reducer=P,Object.defineProperty(e,"__esModule",{value:!0})})); |
import { ExpiryStatus } from '@rest-hooks/normalizr'; | ||
import { denormalize, isEntity, WeakListMap } from '@rest-hooks/normalizr'; | ||
import { denormalize, isEntity, WeakEntityMap } from '@rest-hooks/normalizr'; | ||
import { inferResults } from '@rest-hooks/normalizr'; | ||
@@ -136,7 +136,7 @@ import createFetch from './createFetch.js'; | ||
} | ||
if (isActive && !this.globalCache.results[key]) this.globalCache.results[key] = new WeakListMap(); | ||
if (isActive && !this.globalCache.results[key]) this.globalCache.results[key] = new WeakEntityMap(); | ||
// second argument is false if any entities are missing | ||
// eslint-disable-next-line prefer-const | ||
const [data, found, suspend, resolvedEntities] = denormalize(results, schema, state.entities, this.globalCache.entities, isActive ? this.globalCache.results[key] : undefined); | ||
const [data, found, suspend, entityPaths] = denormalize(results, schema, state.entities, this.globalCache.entities, isActive ? this.globalCache.results[key] : undefined); | ||
@@ -147,9 +147,15 @@ // fallback to entity expiry time | ||
if (found) { | ||
const entityMeta = state.entityMeta; | ||
// oldest entity dictates age | ||
expiresAt = Infinity; | ||
// using Object.keys ensures we don't hit `toString` type members | ||
Object.entries(resolvedEntities).forEach(([key, entities]) => Object.keys(entities).forEach(pk => { | ||
var _state$entityMeta$key, _state$entityMeta$key2, _state$entityMeta$key3; | ||
expiresAt = Math.min(expiresAt, (_state$entityMeta$key = (_state$entityMeta$key2 = state.entityMeta[key]) == null ? void 0 : (_state$entityMeta$key3 = _state$entityMeta$key2[pk]) == null ? void 0 : _state$entityMeta$key3.expiresAt) != null ? _state$entityMeta$key : Infinity); | ||
})); | ||
expiresAt = entityPaths.reduce((expiresAt, { | ||
pk, | ||
key | ||
}) => { | ||
var _entityMeta$key$pk$ex, _entityMeta$key, _entityMeta$key$pk; | ||
return Math.min(expiresAt, (_entityMeta$key$pk$ex = (_entityMeta$key = entityMeta[key]) == null ? void 0 : (_entityMeta$key$pk = _entityMeta$key[pk]) == null ? void 0 : _entityMeta$key$pk.expiresAt) != null ? _entityMeta$key$pk$ex : Infinity); | ||
}, Infinity); | ||
/*expiresAt = entityPaths | ||
.map(({ pk, key }) => entityMeta[key]?.[pk]?.expiresAt) | ||
.filter(a => a) | ||
.reduce((a, b) => Math.min(a, b), Infinity); Alternative method - is it faster?*/ | ||
} else { | ||
@@ -221,2 +227,2 @@ expiresAt = 0; | ||
} | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHBpcnlTdGF0dXMiLCJkZW5vcm1hbGl6ZSIsImlzRW50aXR5IiwiV2Vha0xpc3RNYXAiLCJpbmZlclJlc3VsdHMiLCJjcmVhdGVGZXRjaCIsImNyZWF0ZUludmFsaWRhdGUiLCJjcmVhdGVJbnZhbGlkYXRlQWxsIiwiY3JlYXRlUmVjZWl2ZSIsImNyZWF0ZVJlc2V0IiwiY3JlYXRlVW5zdWJzY3JpcHRpb24iLCJjcmVhdGVTdWJzY3JpcHRpb24iLCJpbml0aWFsU3RhdGUiLCJzZWxlY3RNZXRhIiwidW5zZXREaXNwYXRjaCIsImFjdGlvbiIsIkVycm9yIiwidW5zZXRTdGF0ZSIsIkNvbnRyb2xsZXIiLCJjb25zdHJ1Y3RvciIsImRpc3BhdGNoIiwiZ2V0U3RhdGUiLCJnbG9iYWxDYWNoZSIsImVudGl0aWVzIiwicmVzdWx0cyIsImZldGNoIiwiZW5kcG9pbnQiLCJhcmdzIiwibWV0YSIsInByb21pc2UiLCJpbnZhbGlkYXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJpbnZhbGlkYXRlQWxsIiwib3B0aW9ucyIsImtleSIsInRlc3RLZXkiLCJyZXNldEVudGlyZVN0b3JlIiwic2V0UmVzcG9uc2UiLCJyZXN0IiwicmVzcG9uc2UiLCJsZW5ndGgiLCJzbGljZSIsInJlY2VpdmUiLCJzZXRFcnJvciIsImVycm9yIiwicmVjZWl2ZUVycm9yIiwic3Vic2NyaWJlIiwidW5zdWJzY3JpYmUiLCJzbmFwc2hvdCIsInN0YXRlIiwiZmV0Y2hlZEF0IiwiU25hcHNob3QiLCJnZXRFcnJvciIsInVuZGVmaW5lZCIsImVycm9yUG9saWN5IiwiZ2V0UmVzcG9uc2UiLCJpc0FjdGl2ZSIsImNhY2hlUmVzdWx0cyIsInNjaGVtYSIsImV4cGlyZXNBdCIsImdldFJlc3VsdHMiLCJpbmRleGVzIiwic2NoZW1hSGFzRW50aXR5IiwiZGF0YSIsImV4cGlyeVN0YXR1cyIsImludmFsaWRhdGVkIiwiSW52YWxpZCIsImludmFsaWRJZlN0YWxlIiwiVmFsaWQiLCJJbnZhbGlkSWZTdGFsZSIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsIkFycmF5IiwiaXNBcnJheSIsImZvdW5kIiwic3VzcGVuZCIsInJlc29sdmVkRW50aXRpZXMiLCJJbmZpbml0eSIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwia2V5cyIsInBrIiwiTWF0aCIsIm1pbiIsImVudGl0eU1ldGEiLCJuZXN0ZWRTY2hlbWEiLCJ2YWx1ZXMiLCJzb21lIiwieCIsImNvbnRyb2xsZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJvbGxlci9Db250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgRW5kcG9pbnRJbnRlcmZhY2UsXG4gIEZldGNoRnVuY3Rpb24sXG4gIFJlc29sdmVUeXBlLFxuICBEZW5vcm1hbGl6ZU51bGxhYmxlLFxuICBFbnRpdHlUYWJsZSxcbn0gZnJvbSAnQHJlc3QtaG9va3Mvbm9ybWFsaXpyJztcbmltcG9ydCB7IEV4cGlyeVN0YXR1cyB9IGZyb20gJ0ByZXN0LWhvb2tzL25vcm1hbGl6cic7XG5pbXBvcnQge1xuICBFcnJvclR5cGVzLFxuICBTbmFwc2hvdEludGVyZmFjZSxcbiAgZGVub3JtYWxpemUsXG4gIERlbm9ybWFsaXplQ2FjaGUsXG4gIGlzRW50aXR5LFxuICBTY2hlbWEsXG4gIFdlYWtMaXN0TWFwLFxufSBmcm9tICdAcmVzdC1ob29rcy9ub3JtYWxpenInO1xuaW1wb3J0IHsgaW5mZXJSZXN1bHRzIH0gZnJvbSAnQHJlc3QtaG9va3Mvbm9ybWFsaXpyJztcblxuaW1wb3J0IGNyZWF0ZUZldGNoIGZyb20gJy4vY3JlYXRlRmV0Y2guanMnO1xuaW1wb3J0IGNyZWF0ZUludmFsaWRhdGUgZnJvbSAnLi9jcmVhdGVJbnZhbGlkYXRlLmpzJztcbmltcG9ydCBjcmVhdGVJbnZhbGlkYXRlQWxsIGZyb20gJy4vY3JlYXRlSW52YWxpZGF0ZUFsbC5qcyc7XG5pbXBvcnQgY3JlYXRlUmVjZWl2ZSBmcm9tICcuL2NyZWF0ZVJlY2VpdmUuanMnO1xuaW1wb3J0IGNyZWF0ZVJlc2V0IGZyb20gJy4vY3JlYXRlUmVzZXQuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlVW5zdWJzY3JpcHRpb24sXG4gIGNyZWF0ZVN1YnNjcmlwdGlvbixcbn0gZnJvbSAnLi9jcmVhdGVTdWJzY3JpcHRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBDb21wYXRpYmxlQWN0aW9uVHlwZXMgfSBmcm9tICcuLi9jb21wYXRpYmxlQWN0aW9ucy5qcyc7XG5pbXBvcnQgeyBpbml0aWFsU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9yZWR1Y2VyL2NyZWF0ZVJlZHVjZXIuanMnO1xuaW1wb3J0IHNlbGVjdE1ldGEgZnJvbSAnLi4vc3RhdGUvc2VsZWN0TWV0YS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEFjdGlvblR5cGVzIGFzIEJyb2FkQWN0aW9uVHlwZXMsXG4gIENvbWJpbmVkQWN0aW9uVHlwZXMsXG4gIGxlZ2FjeUFjdGlvbnMsXG4gIFN0YXRlLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIEdlbmVyaWNEaXNwYXRjaCA9ICh2YWx1ZTogYW55KSA9PiBQcm9taXNlPHZvaWQ+O1xuZXhwb3J0IHR5cGUgQ29tcGF0aWJsZURpc3BhdGNoID0gKHZhbHVlOiBDb21iaW5lZEFjdGlvblR5cGVzKSA9PiBQcm9taXNlPHZvaWQ+O1xudHlwZSBQcmV2aW91c0Rpc3BhdGNoID0gKHZhbHVlOiBCcm9hZEFjdGlvblR5cGVzKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5pbnRlcmZhY2UgQ29uc3RydWN0b3JQcm9wczxEIGV4dGVuZHMgR2VuZXJpY0Rpc3BhdGNoID0gQ29tcGF0aWJsZURpc3BhdGNoPiB7XG4gIGRpc3BhdGNoPzogRDtcbiAgZ2V0U3RhdGU/OiAoKSA9PiBTdGF0ZTx1bmtub3duPjtcbiAgZ2xvYmFsQ2FjaGU/OiBEZW5vcm1hbGl6ZUNhY2hlO1xufVxuXG5jb25zdCB1bnNldERpc3BhdGNoID0gKGFjdGlvbjogdW5rbm93bik6IFByb21pc2U8dm9pZD4gPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERpc3BhdGNoaW5nIHdoaWxlIGNvbnN0cnVjdGluZyB5b3VyIG1pZGRsZXdhcmUgaXMgbm90IGFsbG93ZWQuIGAgK1xuICAgICAgYE90aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC5gLFxuICApO1xufTtcbmNvbnN0IHVuc2V0U3RhdGUgPSAoKTogU3RhdGU8dW5rbm93bj4gPT4ge1xuICAvLyBUaGlzIGlzIG9ubHkgdGhlIHZhbHVlIHVudGlsIGl0IGlzIHNldCBieSB0aGUgQ2FjaGVQcm92aWRlclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gaW5pdGlhbFN0YXRlO1xufTtcblxuLyoqXG4gKiBJbXBlcmF0aXZlIGNvbnRyb2wgb2YgUmVzdCBIb29rcyBzdG9yZVxuICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRyb2xsZXI8XG4gIEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBDb21wYXRpYmxlRGlzcGF0Y2gsXG4+IHtcbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uIHRvIFJlc3QgSG9va3MgcmVkdWNlci5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2Rpc3BhdGNoXG4gICAqL1xuICBkZWNsYXJlIHJlYWRvbmx5IGRpc3BhdGNoOiBEO1xuICAvKipcbiAgICogR2V0cyB0aGUgbGF0ZXN0IHN0YXRlIHNuYXBzaG90IHRoYXQgaXMgZnVsbHkgY29tbWl0dGVkLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGltcGVyYXRpdmUgdXNlLWNhc2VzIGxpa2UgZXZlbnQgaGFuZGxlcnMuXG4gICAqIFRoaXMgc2hvdWxkICpub3QqIGJlIHVzZWQgdG8gcmVuZGVyOyBpbnN0ZWFkIHVzZVN1c3BlbnNlKCkgb3IgdXNlQ2FjaGUoKVxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0U3RhdGVcbiAgICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgZ2V0U3RhdGU6ICgpID0+IFN0YXRlPHVua25vd24+O1xuICBkZWNsYXJlIHJlYWRvbmx5IGdsb2JhbENhY2hlOiBEZW5vcm1hbGl6ZUNhY2hlO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBkaXNwYXRjaCA9IHVuc2V0RGlzcGF0Y2ggYXMgYW55LFxuICAgIGdldFN0YXRlID0gdW5zZXRTdGF0ZSxcbiAgICBnbG9iYWxDYWNoZSA9IHtcbiAgICAgIGVudGl0aWVzOiB7fSxcbiAgICAgIHJlc3VsdHM6IHt9LFxuICAgIH0sXG4gIH06IENvbnN0cnVjdG9yUHJvcHM8RD4gPSB7fSkge1xuICAgIHRoaXMuZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbiAgICB0aGlzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG4gICAgdGhpcy5nbG9iYWxDYWNoZSA9IGdsb2JhbENhY2hlO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBBY3Rpb24gRGlzcGF0Y2hlcnMgKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBlbmRwb2ludCB3aXRoIGdpdmVuIGFyZ3MsIHVwZGF0aW5nIHRoZSBSZXN0IEhvb2tzIGNhY2hlIHdpdGggdGhlIHJlc3BvbnNlIG9yIGVycm9yIHVwb24gY29tcGxldGlvbi5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2ZldGNoXG4gICAqL1xuICBmZXRjaCA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7IHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT4gfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKTogUmV0dXJuVHlwZTxFPiA9PiB7XG4gICAgY29uc3QgYWN0aW9uID0gY3JlYXRlRmV0Y2goZW5kcG9pbnQsIHtcbiAgICAgIGFyZ3MsXG4gICAgfSk7XG4gICAgdGhpcy5kaXNwYXRjaChhY3Rpb24pO1xuXG4gICAgcmV0dXJuIGFjdGlvbi5tZXRhLnByb21pc2UgYXMgUmV0dXJuVHlwZTxFPjtcbiAgfTtcblxuICAvKipcbiAgICogRm9yY2VzIHJlZmV0Y2hpbmcgYW5kIHN1c3BlbnNlIG9uIHVzZVN1c3BlbnNlIHdpdGggdGhlIHNhbWUgRW5kcG9pbnQgYW5kIHBhcmFtZXRlcnMuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNpbnZhbGlkYXRlXG4gICAqL1xuICBpbnZhbGlkYXRlID0gPEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZT4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IFByb21pc2U8dm9pZD4gPT5cbiAgICBhcmdzWzBdICE9PSBudWxsXG4gICAgICA/IHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICAgY3JlYXRlSW52YWxpZGF0ZShlbmRwb2ludCwge1xuICAgICAgICAgICAgYXJnczogYXJncyBhcyByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqXG4gICAqIEZvcmNlcyByZWZldGNoaW5nIGFuZCBzdXNwZW5zZSBvbiB1c2VTdXNwZW5zZSBvbiBhbGwgbWF0Y2hpbmcgZW5kcG9pbnQgcmVzdWx0IGtleXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNpbnZhbGlkYXRlQWxsXG4gICAqL1xuICBpbnZhbGlkYXRlQWxsID0gKG9wdGlvbnM6IHsgdGVzdEtleTogKGtleTogc3RyaW5nKSA9PiBib29sZWFuIH0pID0+XG4gICAgdGhpcy5kaXNwYXRjaChjcmVhdGVJbnZhbGlkYXRlQWxsKChrZXk6IHN0cmluZykgPT4gb3B0aW9ucy50ZXN0S2V5KGtleSkpKTtcblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBlbnRpcmUgUmVzdCBIb29rcyBjYWNoZS4gQWxsIGluZmxpZ2h0IHJlcXVlc3RzIHdpbGwgbm90IHJlc29sdmUuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNyZXNldEVudGlyZVN0b3JlXG4gICAqL1xuICByZXNldEVudGlyZVN0b3JlID0gKCk6IFByb21pc2U8dm9pZD4gPT4gdGhpcy5kaXNwYXRjaChjcmVhdGVSZXNldCgpKTtcblxuICAvKipcbiAgICogU3RvcmVzIHJlc3BvbnNlIGluIGNhY2hlIGZvciBnaXZlbiBFbmRwb2ludCBhbmQgYXJncy5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldFxuICAgKi9cbiAgc2V0UmVzcG9uc2UgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgICAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbiAgICB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+LCBhbnldXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNvbHZlVHlwZTxFPiA9IHJlc3RbcmVzdC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVSZWNlaXZlKGVuZHBvaW50LCB7XG4gICAgICBhcmdzOiByZXN0LnNsaWNlKDAsIHJlc3QubGVuZ3RoIC0gMSkgYXMgUGFyYW1ldGVyczxFPixcbiAgICAgIHJlc3BvbnNlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGFjdGlvbik7XG4gIH07XG5cbiAgLy8gVE9ETzogZGVwcmVjYXRlXG4gIC8qKlxuICAgKiBBbm90aGVyIG5hbWUgZm9yIHNldFJlc3BvbnNlXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzZXRSZXNwb25zZVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gcmVjZWl2ZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIGFueV1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdGhpcy5zZXRSZXNwb25zZShlbmRwb2ludCwgLi4ucmVzdCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0b3JlcyB0aGUgcmVzdWx0IG9mIEVuZHBvaW50IGFuZCBhcmdzIGFzIHRoZSBlcnJvciBwcm92aWRlZC5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldEVycm9yXG4gICAqL1xuICBzZXRFcnJvciA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIEVycm9yXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogRXJyb3IgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYWN0aW9uID0gY3JlYXRlUmVjZWl2ZShlbmRwb2ludCwge1xuICAgICAgYXJnczogcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RT4sXG4gICAgICByZXNwb25zZSxcbiAgICAgIGVycm9yOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGFjdGlvbik7XG4gIH07XG5cbiAgLy8gVE9ETzogZGVwcmVjYXRlXG4gIC8qKlxuICAgKiBBbm90aGVyIG5hbWUgZm9yIHNldEVycm9yXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzZXRFcnJvclxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gcmVjZWl2ZUVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgRXJyb3JdXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHRoaXMuc2V0RXJyb3IoZW5kcG9pbnQsIC4uLnJlc3QpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBpbmZsaWdodCBmZXRjaC4gYGZldGNoZWRBdGAgc2hvdWxkIGBmZXRjaGAncyBgY3JlYXRlZEF0YFxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjcmVzb2x2ZVxuICAgKi9cbiAgcmVzb2x2ZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgbWV0YTpcbiAgICAgIHwge1xuICAgICAgICAgIGFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XTtcbiAgICAgICAgICByZXNwb25zZTogRXJyb3I7XG4gICAgICAgICAgZmV0Y2hlZEF0OiBudW1iZXI7XG4gICAgICAgICAgZXJyb3I6IHRydWU7XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIGFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XTtcbiAgICAgICAgICByZXNwb25zZTogYW55O1xuICAgICAgICAgIGZldGNoZWRBdDogbnVtYmVyO1xuICAgICAgICAgIGVycm9yPzogZmFsc2U7XG4gICAgICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGNyZWF0ZVJlY2VpdmUoZW5kcG9pbnQsIG1ldGEgYXMgYW55KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1hcmtzIGEgbmV3IHN1YnNjcmlwdGlvbiB0byBhIGdpdmVuIEVuZHBvaW50LlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc3Vic2NyaWJlXG4gICAqL1xuICBzdWJzY3JpYmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPEZldGNoRnVuY3Rpb24sIFNjaGVtYSB8IHVuZGVmaW5lZCwgdW5kZWZpbmVkPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIGFyZ3NbMF0gIT09IG51bGxcbiAgICAgID8gdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICBjcmVhdGVTdWJzY3JpcHRpb24oZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MgYXMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKlxuICAgKiBNYXJrcyBjb21wbGV0aW9uIG9mIHN1YnNjcmlwdGlvbiB0byBhIGdpdmVuIEVuZHBvaW50LlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjdW5zdWJzY3JpYmVcbiAgICovXG4gIHVuc3Vic2NyaWJlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZTxGZXRjaEZ1bmN0aW9uLCBTY2hlbWEgfCB1bmRlZmluZWQsIHVuZGVmaW5lZD4sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IFByb21pc2U8dm9pZD4gPT5cbiAgICBhcmdzWzBdICE9PSBudWxsXG4gICAgICA/IHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICAgY3JlYXRlVW5zdWJzY3JpcHRpb24oZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MgYXMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKioqKioqKioqKioqKiogTW9yZSAqKioqKioqKioqKioqKiovXG5cbiAgLyogVE9ETzpcbiAgYWJvcnQgPSA8RSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKTogUHJvbWlzZTx2b2lkPlxuICAqL1xuXG4gIHNuYXBzaG90ID0gKHN0YXRlOiBTdGF0ZTx1bmtub3duPiwgZmV0Y2hlZEF0PzogbnVtYmVyKTogU25hcHNob3RJbnRlcmZhY2UgPT4ge1xuICAgIHJldHVybiBuZXcgU25hcHNob3QodGhpcywgc3RhdGUsIGZldGNoZWRBdCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVycm9yLCBpZiBhbnksIGZvciBhIGdpdmVuIGVuZHBvaW50LiBSZXR1cm5zIHVuZGVmaW5lZCBmb3Igbm8gZXJyb3JzLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0RXJyb3JcbiAgICovXG4gIGdldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5Jz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0gfCByZWFkb25seSBbbnVsbF0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogWy4uLkFyZ3MsIFN0YXRlPHVua25vd24+XVxuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAocmVzdFswXSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXRlID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdIGFzIFN0YXRlPHVua25vd24+O1xuICAgIC8vIHRoaXMgaXMgdHlwZXNjcmlwdCBnZW5lcmljcyBicmVha2luZ1xuICAgIGNvbnN0IGFyZ3M6IGFueSA9IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEVbJ2tleSddPjtcbiAgICBjb25zdCBrZXkgPSBlbmRwb2ludC5rZXkoLi4uYXJncyk7XG5cbiAgICBjb25zdCBtZXRhID0gc2VsZWN0TWV0YShzdGF0ZSwga2V5KTtcbiAgICBjb25zdCByZXN1bHRzID0gc3RhdGUucmVzdWx0c1trZXldO1xuXG4gICAgaWYgKHJlc3VsdHMgIT09IHVuZGVmaW5lZCAmJiBtZXRhPy5lcnJvclBvbGljeSA9PT0gJ3NvZnQnKSByZXR1cm47XG5cbiAgICByZXR1cm4gbWV0YT8uZXJyb3IgYXMgYW55O1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSAoZ2xvYmFsbHkgcmVmZXJlbnRpYWxseSBzdGFibGUpIHJlc3BvbnNlIGZvciBhIGdpdmVuIGVuZHBvaW50L2FyZ3MgcGFpciBmcm9tIHN0YXRlIGdpdmVuLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0UmVzcG9uc2VcbiAgICovXG4gIGdldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5JyB8ICdzY2hlbWEnIHwgJ2ludmFsaWRJZlN0YWxlJz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0gfCByZWFkb25seSBbbnVsbF0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogWy4uLkFyZ3MsIFN0YXRlPHVua25vd24+XVxuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH0gPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdIGFzIFN0YXRlPHVua25vd24+O1xuICAgIC8vIHRoaXMgaXMgdHlwZXNjcmlwdCBnZW5lcmljcyBicmVha2luZ1xuICAgIGNvbnN0IGFyZ3M6IGFueSA9IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEVbJ2tleSddPjtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IGFyZ3MubGVuZ3RoICE9PSAxIHx8IGFyZ3NbMF0gIT09IG51bGw7XG4gICAgY29uc3Qga2V5ID0gaXNBY3RpdmUgPyBlbmRwb2ludC5rZXkoLi4uYXJncykgOiAnJztcbiAgICBjb25zdCBjYWNoZVJlc3VsdHMgPSBpc0FjdGl2ZSAmJiBzdGF0ZS5yZXN1bHRzW2tleV07XG4gICAgY29uc3Qgc2NoZW1hID0gZW5kcG9pbnQuc2NoZW1hO1xuICAgIGNvbnN0IG1ldGEgPSBzZWxlY3RNZXRhKHN0YXRlLCBrZXkpO1xuICAgIGxldCBleHBpcmVzQXQgPSBtZXRhPy5leHBpcmVzQXQ7XG5cbiAgICBjb25zdCByZXN1bHRzID0gdGhpcy5nZXRSZXN1bHRzKFxuICAgICAgZW5kcG9pbnQuc2NoZW1hLFxuICAgICAgY2FjaGVSZXN1bHRzLFxuICAgICAgYXJncyxcbiAgICAgIHN0YXRlLmluZGV4ZXMsXG4gICAgICBzdGF0ZS5lbnRpdGllcyxcbiAgICApO1xuXG4gICAgaWYgKCFlbmRwb2ludC5zY2hlbWEgfHwgIXNjaGVtYUhhc0VudGl0eShlbmRwb2ludC5zY2hlbWEpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiByZXN1bHRzLFxuICAgICAgICBleHBpcnlTdGF0dXM6IG1ldGE/LmludmFsaWRhdGVkXG4gICAgICAgICAgPyBFeHBpcnlTdGF0dXMuSW52YWxpZFxuICAgICAgICAgIDogY2FjaGVSZXN1bHRzICYmICFlbmRwb2ludC5pbnZhbGlkSWZTdGFsZVxuICAgICAgICAgID8gRXhwaXJ5U3RhdHVzLlZhbGlkXG4gICAgICAgICAgOiBFeHBpcnlTdGF0dXMuSW52YWxpZElmU3RhbGUsXG4gICAgICAgIGV4cGlyZXNBdDogZXhwaXJlc0F0IHx8IDAsXG4gICAgICB9IGFzIHtcbiAgICAgICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzO1xuICAgICAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIFdhcm4gdXNlcnMgd2l0aCBiYWQgY29uZmlndXJhdGlvbnNcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHNjaGVtYSAmJiBpc0VudGl0eShzY2hlbWEpKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGZldGNoIGtleSAke2tleX0gaGFzIGxpc3QgcmVzdWx0cyB3aGVuIHNpbmdsZSByZXN1bHQgaXMgZXhwZWN0ZWRgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXN1bHRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGZldGNoIGtleSAke2tleX0gaGFzIG9iamVjdCByZXN1bHRzIHdoZW4gZW50aXR5J3MgcHJpbWFyeSBrZXkgKHN0cmluZykgcmVzdWx0IGlzIGV4cGVjdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNBY3RpdmUgJiYgIXRoaXMuZ2xvYmFsQ2FjaGUucmVzdWx0c1trZXldKVxuICAgICAgdGhpcy5nbG9iYWxDYWNoZS5yZXN1bHRzW2tleV0gPSBuZXcgV2Vha0xpc3RNYXAoKTtcblxuICAgIC8vIHNlY29uZCBhcmd1bWVudCBpcyBmYWxzZSBpZiBhbnkgZW50aXRpZXMgYXJlIG1pc3NpbmdcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgY29uc3QgW2RhdGEsIGZvdW5kLCBzdXNwZW5kLCByZXNvbHZlZEVudGl0aWVzXSA9IGRlbm9ybWFsaXplKFxuICAgICAgcmVzdWx0cyxcbiAgICAgIHNjaGVtYSxcbiAgICAgIHN0YXRlLmVudGl0aWVzLFxuICAgICAgdGhpcy5nbG9iYWxDYWNoZS5lbnRpdGllcyxcbiAgICAgIGlzQWN0aXZlID8gdGhpcy5nbG9iYWxDYWNoZS5yZXN1bHRzW2tleV0gOiB1bmRlZmluZWQsXG4gICAgKSBhcyBbXG4gICAgICBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPixcbiAgICAgIGJvb2xlYW4sXG4gICAgICBib29sZWFuLFxuICAgICAgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj4sXG4gICAgXTtcblxuICAgIC8vIGZhbGxiYWNrIHRvIGVudGl0eSBleHBpcnkgdGltZVxuICAgIGlmICghZXhwaXJlc0F0KSB7XG4gICAgICAvLyBleHBpcmVzQXQgZXhpc3RhbmNlIGlzIGVxdWl2YWxlbnQgdG8gY2FjaGVSZXN1bHRzXG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgLy8gb2xkZXN0IGVudGl0eSBkaWN0YXRlcyBhZ2VcbiAgICAgICAgZXhwaXJlc0F0ID0gSW5maW5pdHk7XG4gICAgICAgIC8vIHVzaW5nIE9iamVjdC5rZXlzIGVuc3VyZXMgd2UgZG9uJ3QgaGl0IGB0b1N0cmluZ2AgdHlwZSBtZW1iZXJzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc29sdmVkRW50aXRpZXMpLmZvckVhY2goKFtrZXksIGVudGl0aWVzXSkgPT5cbiAgICAgICAgICBPYmplY3Qua2V5cyhlbnRpdGllcykuZm9yRWFjaChwayA9PiB7XG4gICAgICAgICAgICBleHBpcmVzQXQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgZXhwaXJlc0F0LFxuICAgICAgICAgICAgICBzdGF0ZS5lbnRpdHlNZXRhW2tleV0/Lltwa10/LmV4cGlyZXNBdCA/PyBJbmZpbml0eSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHBpcmVzQXQgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvY29uY2VwdHMvZXhwaXJ5LXBvbGljeSNleHBpcnktc3RhdHVzXG4gICAgLy8gd2UgZG9uJ3QgdHJhY2sgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFsZSBvciBmcmVzaCBiZWNhdXNlIHRoYXQgaXMgdGllZCB0byB0cmlnZ2VyaW5nXG4gICAgLy8gY29uZGl0aW9uc1xuICAgIGNvbnN0IGV4cGlyeVN0YXR1cyA9XG4gICAgICBtZXRhPy5pbnZhbGlkYXRlZCB8fCAoc3VzcGVuZCAmJiAhbWV0YT8uZXJyb3IpXG4gICAgICAgID8gRXhwaXJ5U3RhdHVzLkludmFsaWRcbiAgICAgICAgOiBzdXNwZW5kIHx8IGVuZHBvaW50LmludmFsaWRJZlN0YWxlIHx8ICghY2FjaGVSZXN1bHRzICYmICFmb3VuZClcbiAgICAgICAgPyBFeHBpcnlTdGF0dXMuSW52YWxpZElmU3RhbGVcbiAgICAgICAgOiBFeHBpcnlTdGF0dXMuVmFsaWQ7XG5cbiAgICByZXR1cm4geyBkYXRhLCBleHBpcnlTdGF0dXMsIGV4cGlyZXNBdCB9O1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0UmVzdWx0cyA9IChcbiAgICBzY2hlbWE6IFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICBjYWNoZVJlc3VsdHM6IGFueSxcbiAgICBhcmdzOiBhbnlbXSxcbiAgICBpbmRleGVzOiBhbnksXG4gICAgZW50aXRpZXM6IEVudGl0eVRhYmxlLFxuICApID0+IHtcbiAgICBpZiAoY2FjaGVSZXN1bHRzIHx8IHNjaGVtYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVSZXN1bHRzO1xuXG4gICAgcmV0dXJuIGluZmVyUmVzdWx0cyhzY2hlbWEsIGFyZ3MsIGluZGV4ZXMsIGVudGl0aWVzKTtcbiAgfTtcbn1cblxuLyoqIERldGVybWluZSB3aGV0aGVyIHRoZSBzY2hlbWEgaGFzIGFueSBlbnRpdGllcy5cbiAqXG4gKiBXaXRob3V0IGVudGl0aWVzLCBkZW5vcm1hbGl6YXRpb24gaXMgbm90IG5lZWRlZCwgYW5kIHJlc3VsdHMgc2hvdWxkIG5vdCBiZSBpbmZlcnJlZC5cbiAqL1xuZnVuY3Rpb24gc2NoZW1hSGFzRW50aXR5KHNjaGVtYTogU2NoZW1hKTogYm9vbGVhbiB7XG4gIGlmIChpc0VudGl0eShzY2hlbWEpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSlcbiAgICByZXR1cm4gc2NoZW1hLmxlbmd0aCAhPT0gMCAmJiBzY2hlbWFIYXNFbnRpdHkoc2NoZW1hWzBdKTtcbiAgaWYgKHNjaGVtYSAmJiAodHlwZW9mIHNjaGVtYSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHNjaGVtYSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBjb25zdCBuZXN0ZWRTY2hlbWEgPVxuICAgICAgJ3NjaGVtYScgaW4gc2NoZW1hID8gKHNjaGVtYS5zY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgU2NoZW1hPikgOiBzY2hlbWE7XG4gICAgaWYgKHR5cGVvZiBuZXN0ZWRTY2hlbWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzY2hlbWFIYXNFbnRpdHkobmVzdGVkU2NoZW1hKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobmVzdGVkU2NoZW1hKS5zb21lKHggPT4gc2NoZW1hSGFzRW50aXR5KHgpKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIHsgRXJyb3JUeXBlcyB9O1xuXG5jbGFzcyBTbmFwc2hvdDxUID0gdW5rbm93bj4gaW1wbGVtZW50cyBTbmFwc2hvdEludGVyZmFjZSB7XG4gIHByaXZhdGUgc3RhdGU6IFN0YXRlPFQ+O1xuICBwcml2YXRlIGNvbnRyb2xsZXI6IENvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGZldGNoZWRBdDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsIHN0YXRlOiBTdGF0ZTxUPiwgZmV0Y2hlZEF0ID0gMCkge1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIHRoaXMuZmV0Y2hlZEF0ID0gZmV0Y2hlZEF0O1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBEYXRhIEFjY2VzcyAqKioqKioqKioqKioqKiovXG4gIGdldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5JyB8ICdzY2hlbWEnIHwgJ2ludmFsaWRJZlN0YWxlJz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH0gPT4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0UmVzcG9uc2UoZW5kcG9pbnQsIC4uLmFyZ3MsIHRoaXMuc3RhdGUpO1xuICB9O1xuXG4gIGdldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5Jz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEVycm9yKGVuZHBvaW50LCAuLi5hcmdzLCB0aGlzLnN0YXRlKTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBT0EsU0FBU0EsWUFBWSxRQUFRLHVCQUF1QjtBQUNwRCxTQUdFQyxXQUFXLEVBRVhDLFFBQVEsRUFFUkMsV0FBVyxRQUNOLHVCQUF1QjtBQUM5QixTQUFTQyxZQUFZLFFBQVEsdUJBQXVCO0FBRXBELE9BQU9DLFdBQVcsTUFBTSxrQkFBa0I7QUFDMUMsT0FBT0MsZ0JBQWdCLE1BQU0sdUJBQXVCO0FBQ3BELE9BQU9DLG1CQUFtQixNQUFNLDBCQUEwQjtBQUMxRCxPQUFPQyxhQUFhLE1BQU0sb0JBQW9CO0FBQzlDLE9BQU9DLFdBQVcsTUFBTSxrQkFBa0I7QUFDMUMsU0FDRUMsb0JBQW9CLEVBQ3BCQyxrQkFBa0IsUUFDYix5QkFBeUI7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 | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHBpcnlTdGF0dXMiLCJkZW5vcm1hbGl6ZSIsImlzRW50aXR5IiwiV2Vha0VudGl0eU1hcCIsImluZmVyUmVzdWx0cyIsImNyZWF0ZUZldGNoIiwiY3JlYXRlSW52YWxpZGF0ZSIsImNyZWF0ZUludmFsaWRhdGVBbGwiLCJjcmVhdGVSZWNlaXZlIiwiY3JlYXRlUmVzZXQiLCJjcmVhdGVVbnN1YnNjcmlwdGlvbiIsImNyZWF0ZVN1YnNjcmlwdGlvbiIsImluaXRpYWxTdGF0ZSIsInNlbGVjdE1ldGEiLCJ1bnNldERpc3BhdGNoIiwiYWN0aW9uIiwiRXJyb3IiLCJ1bnNldFN0YXRlIiwiQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiZGlzcGF0Y2giLCJnZXRTdGF0ZSIsImdsb2JhbENhY2hlIiwiZW50aXRpZXMiLCJyZXN1bHRzIiwiZmV0Y2giLCJlbmRwb2ludCIsImFyZ3MiLCJtZXRhIiwicHJvbWlzZSIsImludmFsaWRhdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsImludmFsaWRhdGVBbGwiLCJvcHRpb25zIiwia2V5IiwidGVzdEtleSIsInJlc2V0RW50aXJlU3RvcmUiLCJzZXRSZXNwb25zZSIsInJlc3QiLCJyZXNwb25zZSIsImxlbmd0aCIsInNsaWNlIiwicmVjZWl2ZSIsInNldEVycm9yIiwiZXJyb3IiLCJyZWNlaXZlRXJyb3IiLCJzdWJzY3JpYmUiLCJ1bnN1YnNjcmliZSIsInNuYXBzaG90Iiwic3RhdGUiLCJmZXRjaGVkQXQiLCJTbmFwc2hvdCIsImdldEVycm9yIiwidW5kZWZpbmVkIiwiZXJyb3JQb2xpY3kiLCJnZXRSZXNwb25zZSIsImlzQWN0aXZlIiwiY2FjaGVSZXN1bHRzIiwic2NoZW1hIiwiZXhwaXJlc0F0IiwiZ2V0UmVzdWx0cyIsImluZGV4ZXMiLCJzY2hlbWFIYXNFbnRpdHkiLCJkYXRhIiwiZXhwaXJ5U3RhdHVzIiwiaW52YWxpZGF0ZWQiLCJJbnZhbGlkIiwiaW52YWxpZElmU3RhbGUiLCJWYWxpZCIsIkludmFsaWRJZlN0YWxlIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiQXJyYXkiLCJpc0FycmF5IiwiZm91bmQiLCJzdXNwZW5kIiwiZW50aXR5UGF0aHMiLCJlbnRpdHlNZXRhIiwicmVkdWNlIiwicGsiLCJNYXRoIiwibWluIiwiSW5maW5pdHkiLCJuZXN0ZWRTY2hlbWEiLCJPYmplY3QiLCJ2YWx1ZXMiLCJzb21lIiwieCIsImNvbnRyb2xsZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJvbGxlci9Db250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgRW5kcG9pbnRJbnRlcmZhY2UsXG4gIEZldGNoRnVuY3Rpb24sXG4gIFJlc29sdmVUeXBlLFxuICBEZW5vcm1hbGl6ZU51bGxhYmxlLFxuICBFbnRpdHlUYWJsZSxcbiAgUGF0aCxcbn0gZnJvbSAnQHJlc3QtaG9va3Mvbm9ybWFsaXpyJztcbmltcG9ydCB7IEV4cGlyeVN0YXR1cyB9IGZyb20gJ0ByZXN0LWhvb2tzL25vcm1hbGl6cic7XG5pbXBvcnQge1xuICBFcnJvclR5cGVzLFxuICBTbmFwc2hvdEludGVyZmFjZSxcbiAgZGVub3JtYWxpemUsXG4gIERlbm9ybWFsaXplQ2FjaGUsXG4gIGlzRW50aXR5LFxuICBTY2hlbWEsXG4gIFdlYWtFbnRpdHlNYXAsXG59IGZyb20gJ0ByZXN0LWhvb2tzL25vcm1hbGl6cic7XG5pbXBvcnQgeyBpbmZlclJlc3VsdHMgfSBmcm9tICdAcmVzdC1ob29rcy9ub3JtYWxpenInO1xuXG5pbXBvcnQgY3JlYXRlRmV0Y2ggZnJvbSAnLi9jcmVhdGVGZXRjaC5qcyc7XG5pbXBvcnQgY3JlYXRlSW52YWxpZGF0ZSBmcm9tICcuL2NyZWF0ZUludmFsaWRhdGUuanMnO1xuaW1wb3J0IGNyZWF0ZUludmFsaWRhdGVBbGwgZnJvbSAnLi9jcmVhdGVJbnZhbGlkYXRlQWxsLmpzJztcbmltcG9ydCBjcmVhdGVSZWNlaXZlIGZyb20gJy4vY3JlYXRlUmVjZWl2ZS5qcyc7XG5pbXBvcnQgY3JlYXRlUmVzZXQgZnJvbSAnLi9jcmVhdGVSZXNldC5qcyc7XG5pbXBvcnQge1xuICBjcmVhdGVVbnN1YnNjcmlwdGlvbixcbiAgY3JlYXRlU3Vic2NyaXB0aW9uLFxufSBmcm9tICcuL2NyZWF0ZVN1YnNjcmlwdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50VXBkYXRlRnVuY3Rpb24gfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IENvbXBhdGlibGVBY3Rpb25UeXBlcyB9IGZyb20gJy4uL2NvbXBhdGlibGVBY3Rpb25zLmpzJztcbmltcG9ydCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJy4uL3N0YXRlL3JlZHVjZXIvY3JlYXRlUmVkdWNlci5qcyc7XG5pbXBvcnQgc2VsZWN0TWV0YSBmcm9tICcuLi9zdGF0ZS9zZWxlY3RNZXRhLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQWN0aW9uVHlwZXMgYXMgQnJvYWRBY3Rpb25UeXBlcyxcbiAgQ29tYmluZWRBY3Rpb25UeXBlcyxcbiAgbGVnYWN5QWN0aW9ucyxcbiAgU3RhdGUsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgR2VuZXJpY0Rpc3BhdGNoID0gKHZhbHVlOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG5leHBvcnQgdHlwZSBDb21wYXRpYmxlRGlzcGF0Y2ggPSAodmFsdWU6IENvbWJpbmVkQWN0aW9uVHlwZXMpID0+IFByb21pc2U8dm9pZD47XG50eXBlIFByZXZpb3VzRGlzcGF0Y2ggPSAodmFsdWU6IEJyb2FkQWN0aW9uVHlwZXMpID0+IFByb21pc2U8dm9pZD47XG5cbmludGVyZmFjZSBDb25zdHJ1Y3RvclByb3BzPEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBDb21wYXRpYmxlRGlzcGF0Y2g+IHtcbiAgZGlzcGF0Y2g/OiBEO1xuICBnZXRTdGF0ZT86ICgpID0+IFN0YXRlPHVua25vd24+O1xuICBnbG9iYWxDYWNoZT86IERlbm9ybWFsaXplQ2FjaGU7XG59XG5cbmNvbnN0IHVuc2V0RGlzcGF0Y2ggPSAoYWN0aW9uOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzcGF0Y2hpbmcgd2hpbGUgY29uc3RydWN0aW5nIHlvdXIgbWlkZGxld2FyZSBpcyBub3QgYWxsb3dlZC4gYCArXG4gICAgICBgT3RoZXIgbWlkZGxld2FyZSB3b3VsZCBub3QgYmUgYXBwbGllZCB0byB0aGlzIGRpc3BhdGNoLmAsXG4gICk7XG59O1xuY29uc3QgdW5zZXRTdGF0ZSA9ICgpOiBTdGF0ZTx1bmtub3duPiA9PiB7XG4gIC8vIFRoaXMgaXMgb25seSB0aGUgdmFsdWUgdW50aWwgaXQgaXMgc2V0IGJ5IHRoZSBDYWNoZVByb3ZpZGVyXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiBpbml0aWFsU3RhdGU7XG59O1xuXG4vKipcbiAqIEltcGVyYXRpdmUgY29udHJvbCBvZiBSZXN0IEhvb2tzIHN0b3JlXG4gKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udHJvbGxlcjxcbiAgRCBleHRlbmRzIEdlbmVyaWNEaXNwYXRjaCA9IENvbXBhdGlibGVEaXNwYXRjaCxcbj4ge1xuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24gdG8gUmVzdCBIb29rcyByZWR1Y2VyLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZGlzcGF0Y2hcbiAgICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgZGlzcGF0Y2g6IEQ7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsYXRlc3Qgc3RhdGUgc25hcHNob3QgdGhhdCBpcyBmdWxseSBjb21taXR0ZWQuXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgaW1wZXJhdGl2ZSB1c2UtY2FzZXMgbGlrZSBldmVudCBoYW5kbGVycy5cbiAgICogVGhpcyBzaG91bGQgKm5vdCogYmUgdXNlZCB0byByZW5kZXI7IGluc3RlYWQgdXNlU3VzcGVuc2UoKSBvciB1c2VDYWNoZSgpXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRTdGF0ZVxuICAgKi9cbiAgZGVjbGFyZSByZWFkb25seSBnZXRTdGF0ZTogKCkgPT4gU3RhdGU8dW5rbm93bj47XG4gIGRlY2xhcmUgcmVhZG9ubHkgZ2xvYmFsQ2FjaGU6IERlbm9ybWFsaXplQ2FjaGU7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGRpc3BhdGNoID0gdW5zZXREaXNwYXRjaCBhcyBhbnksXG4gICAgZ2V0U3RhdGUgPSB1bnNldFN0YXRlLFxuICAgIGdsb2JhbENhY2hlID0ge1xuICAgICAgZW50aXRpZXM6IHt9LFxuICAgICAgcmVzdWx0czoge30sXG4gICAgfSxcbiAgfTogQ29uc3RydWN0b3JQcm9wczxEPiA9IHt9KSB7XG4gICAgdGhpcy5kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIHRoaXMuZ2V0U3RhdGUgPSBnZXRTdGF0ZTtcbiAgICB0aGlzLmdsb2JhbENhY2hlID0gZ2xvYmFsQ2FjaGU7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqIEFjdGlvbiBEaXNwYXRjaGVycyAqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGVuZHBvaW50IHdpdGggZ2l2ZW4gYXJncywgdXBkYXRpbmcgdGhlIFJlc3QgSG9va3MgY2FjaGUgd2l0aCB0aGUgcmVzcG9uc2Ugb3IgZXJyb3IgdXBvbiBjb21wbGV0aW9uLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZmV0Y2hcbiAgICovXG4gIGZldGNoID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHsgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPiB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XVxuICApOiBSZXR1cm5UeXBlPEU+ID0+IHtcbiAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVGZXRjaChlbmRwb2ludCwge1xuICAgICAgYXJncyxcbiAgICB9KTtcbiAgICB0aGlzLmRpc3BhdGNoKGFjdGlvbik7XG5cbiAgICByZXR1cm4gYWN0aW9uLm1ldGEucHJvbWlzZSBhcyBSZXR1cm5UeXBlPEU+O1xuICB9O1xuXG4gIC8qKlxuICAgKiBGb3JjZXMgcmVmZXRjaGluZyBhbmQgc3VzcGVuc2Ugb24gdXNlU3VzcGVuc2Ugd2l0aCB0aGUgc2FtZSBFbmRwb2ludCBhbmQgcGFyYW1ldGVycy5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2ludmFsaWRhdGVcbiAgICovXG4gIGludmFsaWRhdGUgPSA8RSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIGFyZ3NbMF0gIT09IG51bGxcbiAgICAgID8gdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICBjcmVhdGVJbnZhbGlkYXRlKGVuZHBvaW50LCB7XG4gICAgICAgICAgICBhcmdzOiBhcmdzIGFzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAvKipcbiAgICogRm9yY2VzIHJlZmV0Y2hpbmcgYW5kIHN1c3BlbnNlIG9uIHVzZVN1c3BlbnNlIG9uIGFsbCBtYXRjaGluZyBlbmRwb2ludCByZXN1bHQga2V5cy5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2ludmFsaWRhdGVBbGxcbiAgICovXG4gIGludmFsaWRhdGVBbGwgPSAob3B0aW9uczogeyB0ZXN0S2V5OiAoa2V5OiBzdHJpbmcpID0+IGJvb2xlYW4gfSkgPT5cbiAgICB0aGlzLmRpc3BhdGNoKGNyZWF0ZUludmFsaWRhdGVBbGwoKGtleTogc3RyaW5nKSA9PiBvcHRpb25zLnRlc3RLZXkoa2V5KSkpO1xuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGVudGlyZSBSZXN0IEhvb2tzIGNhY2hlLiBBbGwgaW5mbGlnaHQgcmVxdWVzdHMgd2lsbCBub3QgcmVzb2x2ZS5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3Jlc2V0RW50aXJlU3RvcmVcbiAgICovXG4gIHJlc2V0RW50aXJlU3RvcmUgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB0aGlzLmRpc3BhdGNoKGNyZWF0ZVJlc2V0KCkpO1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgcmVzcG9uc2UgaW4gY2FjaGUgZm9yIGdpdmVuIEVuZHBvaW50IGFuZCBhcmdzLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0XG4gICAqL1xuICBzZXRSZXNwb25zZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIGFueV1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFJlc29sdmVUeXBlPEU+ID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZVJlY2VpdmUoZW5kcG9pbnQsIHtcbiAgICAgIGFyZ3M6IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEU+LFxuICAgICAgcmVzcG9uc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goYWN0aW9uKTtcbiAgfTtcblxuICAvLyBUT0RPOiBkZXByZWNhdGVcbiAgLyoqXG4gICAqIEFub3RoZXIgbmFtZSBmb3Igc2V0UmVzcG9uc2VcbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldFJlc3BvbnNlXG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyByZWNlaXZlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgYW55XVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB0aGlzLnNldFJlc3BvbnNlKGVuZHBvaW50LCAuLi5yZXN0KTtcbiAgfTtcblxuICAvKipcbiAgICogU3RvcmVzIHRoZSByZXN1bHQgb2YgRW5kcG9pbnQgYW5kIGFyZ3MgYXMgdGhlIGVycm9yIHByb3ZpZGVkLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0RXJyb3JcbiAgICovXG4gIHNldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgRXJyb3JdXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBFcnJvciA9IHJlc3RbcmVzdC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVSZWNlaXZlKGVuZHBvaW50LCB7XG4gICAgICBhcmdzOiByZXN0LnNsaWNlKDAsIHJlc3QubGVuZ3RoIC0gMSkgYXMgUGFyYW1ldGVyczxFPixcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgZXJyb3I6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goYWN0aW9uKTtcbiAgfTtcblxuICAvLyBUT0RPOiBkZXByZWNhdGVcbiAgLyoqXG4gICAqIEFub3RoZXIgbmFtZSBmb3Igc2V0RXJyb3JcbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldEVycm9yXG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyByZWNlaXZlRXJyb3IgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgICAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbiAgICB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+LCBFcnJvcl1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdGhpcy5zZXRFcnJvcihlbmRwb2ludCwgLi4ucmVzdCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuIGluZmxpZ2h0IGZldGNoLiBgZmV0Y2hlZEF0YCBzaG91bGQgYGZldGNoYCdzIGBjcmVhdGVkQXRgXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNyZXNvbHZlXG4gICAqL1xuICByZXNvbHZlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICBtZXRhOlxuICAgICAgfCB7XG4gICAgICAgICAgYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dO1xuICAgICAgICAgIHJlc3BvbnNlOiBFcnJvcjtcbiAgICAgICAgICBmZXRjaGVkQXQ6IG51bWJlcjtcbiAgICAgICAgICBlcnJvcjogdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfCB7XG4gICAgICAgICAgYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dO1xuICAgICAgICAgIHJlc3BvbnNlOiBhbnk7XG4gICAgICAgICAgZmV0Y2hlZEF0OiBudW1iZXI7XG4gICAgICAgICAgZXJyb3I/OiBmYWxzZTtcbiAgICAgICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goY3JlYXRlUmVjZWl2ZShlbmRwb2ludCwgbWV0YSBhcyBhbnkpKTtcbiAgfTtcblxuICAvKipcbiAgICogTWFya3MgYSBuZXcgc3Vic2NyaXB0aW9uIHRvIGEgZ2l2ZW4gRW5kcG9pbnQuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzdWJzY3JpYmVcbiAgICovXG4gIHN1YnNjcmliZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U8RmV0Y2hGdW5jdGlvbiwgU2NoZW1hIHwgdW5kZWZpbmVkLCB1bmRlZmluZWQ+LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSB8IHJlYWRvbmx5IFtudWxsXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgYXJnc1swXSAhPT0gbnVsbFxuICAgICAgPyB0aGlzLmRpc3BhdGNoKFxuICAgICAgICAgIGNyZWF0ZVN1YnNjcmlwdGlvbihlbmRwb2ludCwge1xuICAgICAgICAgICAgYXJnczogYXJncyBhcyByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqXG4gICAqIE1hcmtzIGNvbXBsZXRpb24gb2Ygc3Vic2NyaXB0aW9uIHRvIGEgZ2l2ZW4gRW5kcG9pbnQuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciN1bnN1YnNjcmliZVxuICAgKi9cbiAgdW5zdWJzY3JpYmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPEZldGNoRnVuY3Rpb24sIFNjaGVtYSB8IHVuZGVmaW5lZCwgdW5kZWZpbmVkPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIGFyZ3NbMF0gIT09IG51bGxcbiAgICAgID8gdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICBjcmVhdGVVbnN1YnNjcmlwdGlvbihlbmRwb2ludCwge1xuICAgICAgICAgICAgYXJnczogYXJncyBhcyByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqKioqKioqKioqKioqKiBNb3JlICoqKioqKioqKioqKioqKi9cblxuICAvKiBUT0RPOlxuICBhYm9ydCA9IDxFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XVxuICApOiBQcm9taXNlPHZvaWQ+XG4gICovXG5cbiAgc25hcHNob3QgPSAoc3RhdGU6IFN0YXRlPHVua25vd24+LCBmZXRjaGVkQXQ/OiBudW1iZXIpOiBTbmFwc2hvdEludGVyZmFjZSA9PiB7XG4gICAgcmV0dXJuIG5ldyBTbmFwc2hvdCh0aGlzLCBzdGF0ZSwgZmV0Y2hlZEF0KTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgZXJyb3IsIGlmIGFueSwgZm9yIGEgZ2l2ZW4gZW5kcG9pbnQuIFJldHVybnMgdW5kZWZpbmVkIGZvciBubyBlcnJvcnMuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRFcnJvclxuICAgKi9cbiAgZ2V0RXJyb3IgPSA8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknPixcbiAgICBBcmdzIGV4dGVuZHMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiBbLi4uQXJncywgU3RhdGU8dW5rbm93bj5dXG4gICk6IEVycm9yVHlwZXMgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChyZXN0WzBdID09PSBudWxsKSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGUgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV0gYXMgU3RhdGU8dW5rbm93bj47XG4gICAgLy8gdGhpcyBpcyB0eXBlc2NyaXB0IGdlbmVyaWNzIGJyZWFraW5nXG4gICAgY29uc3QgYXJnczogYW55ID0gcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RVsna2V5J10+O1xuICAgIGNvbnN0IGtleSA9IGVuZHBvaW50LmtleSguLi5hcmdzKTtcblxuICAgIGNvbnN0IG1ldGEgPSBzZWxlY3RNZXRhKHN0YXRlLCBrZXkpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBzdGF0ZS5yZXN1bHRzW2tleV07XG5cbiAgICBpZiAocmVzdWx0cyAhPT0gdW5kZWZpbmVkICYmIG1ldGE/LmVycm9yUG9saWN5ID09PSAnc29mdCcpIHJldHVybjtcblxuICAgIHJldHVybiBtZXRhPy5lcnJvciBhcyBhbnk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIChnbG9iYWxseSByZWZlcmVudGlhbGx5IHN0YWJsZSkgcmVzcG9uc2UgZm9yIGEgZ2l2ZW4gZW5kcG9pbnQvYXJncyBwYWlyIGZyb20gc3RhdGUgZ2l2ZW4uXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRSZXNwb25zZVxuICAgKi9cbiAgZ2V0UmVzcG9uc2UgPSA8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknIHwgJ3NjaGVtYScgfCAnaW52YWxpZElmU3RhbGUnPixcbiAgICBBcmdzIGV4dGVuZHMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiBbLi4uQXJncywgU3RhdGU8dW5rbm93bj5dXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgfSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV0gYXMgU3RhdGU8dW5rbm93bj47XG4gICAgLy8gdGhpcyBpcyB0eXBlc2NyaXB0IGdlbmVyaWNzIGJyZWFraW5nXG4gICAgY29uc3QgYXJnczogYW55ID0gcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RVsna2V5J10+O1xuICAgIGNvbnN0IGlzQWN0aXZlID0gYXJncy5sZW5ndGggIT09IDEgfHwgYXJnc1swXSAhPT0gbnVsbDtcbiAgICBjb25zdCBrZXkgPSBpc0FjdGl2ZSA/IGVuZHBvaW50LmtleSguLi5hcmdzKSA6ICcnO1xuICAgIGNvbnN0IGNhY2hlUmVzdWx0cyA9IGlzQWN0aXZlICYmIHN0YXRlLnJlc3VsdHNba2V5XTtcbiAgICBjb25zdCBzY2hlbWEgPSBlbmRwb2ludC5zY2hlbWE7XG4gICAgY29uc3QgbWV0YSA9IHNlbGVjdE1ldGEoc3RhdGUsIGtleSk7XG4gICAgbGV0IGV4cGlyZXNBdCA9IG1ldGE/LmV4cGlyZXNBdDtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmdldFJlc3VsdHMoXG4gICAgICBlbmRwb2ludC5zY2hlbWEsXG4gICAgICBjYWNoZVJlc3VsdHMsXG4gICAgICBhcmdzLFxuICAgICAgc3RhdGUuaW5kZXhlcyxcbiAgICAgIHN0YXRlLmVudGl0aWVzLFxuICAgICk7XG5cbiAgICBpZiAoIWVuZHBvaW50LnNjaGVtYSB8fCAhc2NoZW1hSGFzRW50aXR5KGVuZHBvaW50LnNjaGVtYSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3VsdHMsXG4gICAgICAgIGV4cGlyeVN0YXR1czogbWV0YT8uaW52YWxpZGF0ZWRcbiAgICAgICAgICA/IEV4cGlyeVN0YXR1cy5JbnZhbGlkXG4gICAgICAgICAgOiBjYWNoZVJlc3VsdHMgJiYgIWVuZHBvaW50LmludmFsaWRJZlN0YWxlXG4gICAgICAgICAgPyBFeHBpcnlTdGF0dXMuVmFsaWRcbiAgICAgICAgICA6IEV4cGlyeVN0YXR1cy5JbnZhbGlkSWZTdGFsZSxcbiAgICAgICAgZXhwaXJlc0F0OiBleHBpcmVzQXQgfHwgMCxcbiAgICAgIH0gYXMge1xuICAgICAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICAgICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICAgICAgfTtcbiAgICB9XG4gICAgLy8gV2FybiB1c2VycyB3aXRoIGJhZCBjb25maWd1cmF0aW9uc1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgc2NoZW1hICYmIGlzRW50aXR5KHNjaGVtYSkpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgZmV0Y2gga2V5ICR7a2V5fSBoYXMgbGlzdCByZXN1bHRzIHdoZW4gc2luZ2xlIHJlc3VsdCBpcyBleHBlY3RlZGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlc3VsdHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgZmV0Y2gga2V5ICR7a2V5fSBoYXMgb2JqZWN0IHJlc3VsdHMgd2hlbiBlbnRpdHkncyBwcmltYXJ5IGtleSAoc3RyaW5nKSByZXN1bHQgaXMgZXhwZWN0ZWRgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0FjdGl2ZSAmJiAhdGhpcy5nbG9iYWxDYWNoZS5yZXN1bHRzW2tleV0pXG4gICAgICB0aGlzLmdsb2JhbENhY2hlLnJlc3VsdHNba2V5XSA9IG5ldyBXZWFrRW50aXR5TWFwKCk7XG5cbiAgICAvLyBzZWNvbmQgYXJndW1lbnQgaXMgZmFsc2UgaWYgYW55IGVudGl0aWVzIGFyZSBtaXNzaW5nXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGNvbnN0IFtkYXRhLCBmb3VuZCwgc3VzcGVuZCwgZW50aXR5UGF0aHNdID0gZGVub3JtYWxpemUoXG4gICAgICByZXN1bHRzLFxuICAgICAgc2NoZW1hLFxuICAgICAgc3RhdGUuZW50aXRpZXMsXG4gICAgICB0aGlzLmdsb2JhbENhY2hlLmVudGl0aWVzLFxuICAgICAgaXNBY3RpdmUgPyB0aGlzLmdsb2JhbENhY2hlLnJlc3VsdHNba2V5XSA6IHVuZGVmaW5lZCxcbiAgICApIGFzIFtEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPiwgYm9vbGVhbiwgYm9vbGVhbiwgUGF0aFtdXTtcblxuICAgIC8vIGZhbGxiYWNrIHRvIGVudGl0eSBleHBpcnkgdGltZVxuICAgIGlmICghZXhwaXJlc0F0KSB7XG4gICAgICAvLyBleHBpcmVzQXQgZXhpc3RhbmNlIGlzIGVxdWl2YWxlbnQgdG8gY2FjaGVSZXN1bHRzXG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgY29uc3QgZW50aXR5TWV0YSA9IHN0YXRlLmVudGl0eU1ldGE7XG4gICAgICAgIC8vIG9sZGVzdCBlbnRpdHkgZGljdGF0ZXMgYWdlXG4gICAgICAgIGV4cGlyZXNBdCA9IGVudGl0eVBhdGhzLnJlZHVjZShcbiAgICAgICAgICAoZXhwaXJlc0F0OiBudW1iZXIsIHsgcGssIGtleSB9KSA9PlxuICAgICAgICAgICAgTWF0aC5taW4oZXhwaXJlc0F0LCBlbnRpdHlNZXRhW2tleV0/Lltwa10/LmV4cGlyZXNBdCA/PyBJbmZpbml0eSksXG4gICAgICAgICAgSW5maW5pdHksXG4gICAgICAgICk7XG4gICAgICAgIC8qZXhwaXJlc0F0ID0gZW50aXR5UGF0aHNcbiAgICAgICAgICAubWFwKCh7IHBrLCBrZXkgfSkgPT4gZW50aXR5TWV0YVtrZXldPy5bcGtdPy5leHBpcmVzQXQpXG4gICAgICAgICAgLmZpbHRlcihhID0+IGEpXG4gICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5taW4oYSwgYiksIEluZmluaXR5KTsgQWx0ZXJuYXRpdmUgbWV0aG9kIC0gaXMgaXQgZmFzdGVyPyovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHBpcmVzQXQgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvY29uY2VwdHMvZXhwaXJ5LXBvbGljeSNleHBpcnktc3RhdHVzXG4gICAgLy8gd2UgZG9uJ3QgdHJhY2sgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFsZSBvciBmcmVzaCBiZWNhdXNlIHRoYXQgaXMgdGllZCB0byB0cmlnZ2VyaW5nXG4gICAgLy8gY29uZGl0aW9uc1xuICAgIGNvbnN0IGV4cGlyeVN0YXR1cyA9XG4gICAgICBtZXRhPy5pbnZhbGlkYXRlZCB8fCAoc3VzcGVuZCAmJiAhbWV0YT8uZXJyb3IpXG4gICAgICAgID8gRXhwaXJ5U3RhdHVzLkludmFsaWRcbiAgICAgICAgOiBzdXNwZW5kIHx8IGVuZHBvaW50LmludmFsaWRJZlN0YWxlIHx8ICghY2FjaGVSZXN1bHRzICYmICFmb3VuZClcbiAgICAgICAgPyBFeHBpcnlTdGF0dXMuSW52YWxpZElmU3RhbGVcbiAgICAgICAgOiBFeHBpcnlTdGF0dXMuVmFsaWQ7XG5cbiAgICByZXR1cm4geyBkYXRhLCBleHBpcnlTdGF0dXMsIGV4cGlyZXNBdCB9O1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0UmVzdWx0cyA9IChcbiAgICBzY2hlbWE6IFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICBjYWNoZVJlc3VsdHM6IGFueSxcbiAgICBhcmdzOiBhbnlbXSxcbiAgICBpbmRleGVzOiBhbnksXG4gICAgZW50aXRpZXM6IEVudGl0eVRhYmxlLFxuICApID0+IHtcbiAgICBpZiAoY2FjaGVSZXN1bHRzIHx8IHNjaGVtYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVSZXN1bHRzO1xuXG4gICAgcmV0dXJuIGluZmVyUmVzdWx0cyhzY2hlbWEsIGFyZ3MsIGluZGV4ZXMsIGVudGl0aWVzKTtcbiAgfTtcbn1cblxuLyoqIERldGVybWluZSB3aGV0aGVyIHRoZSBzY2hlbWEgaGFzIGFueSBlbnRpdGllcy5cbiAqXG4gKiBXaXRob3V0IGVudGl0aWVzLCBkZW5vcm1hbGl6YXRpb24gaXMgbm90IG5lZWRlZCwgYW5kIHJlc3VsdHMgc2hvdWxkIG5vdCBiZSBpbmZlcnJlZC5cbiAqL1xuZnVuY3Rpb24gc2NoZW1hSGFzRW50aXR5KHNjaGVtYTogU2NoZW1hKTogYm9vbGVhbiB7XG4gIGlmIChpc0VudGl0eShzY2hlbWEpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSlcbiAgICByZXR1cm4gc2NoZW1hLmxlbmd0aCAhPT0gMCAmJiBzY2hlbWFIYXNFbnRpdHkoc2NoZW1hWzBdKTtcbiAgaWYgKHNjaGVtYSAmJiAodHlwZW9mIHNjaGVtYSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHNjaGVtYSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBjb25zdCBuZXN0ZWRTY2hlbWEgPVxuICAgICAgJ3NjaGVtYScgaW4gc2NoZW1hID8gKHNjaGVtYS5zY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgU2NoZW1hPikgOiBzY2hlbWE7XG4gICAgaWYgKHR5cGVvZiBuZXN0ZWRTY2hlbWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzY2hlbWFIYXNFbnRpdHkobmVzdGVkU2NoZW1hKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobmVzdGVkU2NoZW1hKS5zb21lKHggPT4gc2NoZW1hSGFzRW50aXR5KHgpKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIHsgRXJyb3JUeXBlcyB9O1xuXG5jbGFzcyBTbmFwc2hvdDxUID0gdW5rbm93bj4gaW1wbGVtZW50cyBTbmFwc2hvdEludGVyZmFjZSB7XG4gIHByaXZhdGUgc3RhdGU6IFN0YXRlPFQ+O1xuICBwcml2YXRlIGNvbnRyb2xsZXI6IENvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGZldGNoZWRBdDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsIHN0YXRlOiBTdGF0ZTxUPiwgZmV0Y2hlZEF0ID0gMCkge1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIHRoaXMuZmV0Y2hlZEF0ID0gZmV0Y2hlZEF0O1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBEYXRhIEFjY2VzcyAqKioqKioqKioqKioqKiovXG4gIGdldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5JyB8ICdzY2hlbWEnIHwgJ2ludmFsaWRJZlN0YWxlJz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH0gPT4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0UmVzcG9uc2UoZW5kcG9pbnQsIC4uLmFyZ3MsIHRoaXMuc3RhdGUpO1xuICB9O1xuXG4gIGdldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5Jz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEVycm9yKGVuZHBvaW50LCAuLi5hcmdzLCB0aGlzLnN0YXRlKTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBUUEsU0FBU0EsWUFBWSxRQUFRLHVCQUF1QjtBQUNwRCxTQUdFQyxXQUFXLEVBRVhDLFFBQVEsRUFFUkMsYUFBYSxRQUNSLHVCQUF1QjtBQUM5QixTQUFTQyxZQUFZLFFBQVEsdUJBQXVCO0FBRXBELE9BQU9DLFdBQVcsTUFBTSxrQkFBa0I7QUFDMUMsT0FBT0MsZ0JBQWdCLE1BQU0sdUJBQXVCO0FBQ3BELE9BQU9DLG1CQUFtQixNQUFNLDBCQUEwQjtBQUMxRCxPQUFPQyxhQUFhLE1BQU0sb0JBQW9CO0FBQzlDLE9BQU9DLFdBQVcsTUFBTSxrQkFBa0I7QUFDMUMsU0FDRUMsb0JBQW9CLEVBQ3BCQyxrQkFBa0IsUUFDYix5QkFBeUI7QUFHaEMs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 |
@@ -24,3 +24,3 @@ import { SET_TYPE, FETCH_TYPE, RESET_TYPE } from '../actionTypes.js'; | ||
constructor(dataExpiryLength = 60000, errorExpiryLength = 1000) { | ||
this.fetched = {}; | ||
this.fetched = Object.create(null); | ||
this.resolvers = {}; | ||
@@ -90,3 +90,3 @@ this.rejectors = {}; | ||
/* istanbul ignore next */ | ||
return action.type === FETCH_TYPE && Object.hasOwn(this.fetched, action.meta.key); | ||
return action.type === FETCH_TYPE && action.meta.key in this.fetched; | ||
} | ||
@@ -235,3 +235,3 @@ | ||
// this can still turn out to be untrue since this is async | ||
if (Object.hasOwn(this.fetched, action.meta.key)) { | ||
if (action.meta.key in this.fetched) { | ||
let promiseHandler; | ||
@@ -294,2 +294,2 @@ if (action.error) { | ||
} | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTRVRfVFlQRSIsIkZFVENIX1RZUEUiLCJSRVNFVF9UWVBFIiwiQ29udHJvbGxlciIsImluaXRpYWxTdGF0ZSIsImNyZWF0ZVJlY2VpdmUiLCJjcmVhdGVSZWNlaXZlRXJyb3IiLCJSSUMiLCJSZXNldEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJOZXR3b3JrTWFuYWdlciIsImRhdGFFeHBpcnlMZW5ndGgiLCJlcnJvckV4cGlyeUxlbmd0aCIsImZldGNoZWQiLCJyZXNvbHZlcnMiLCJyZWplY3RvcnMiLCJmZXRjaGVkQXQiLCJnZXRTdGF0ZSIsImNvbnRyb2xsZXIiLCJtaWRkbGV3YXJlIiwiZGlzcGF0Y2giLCJuZXh0IiwiYWN0aW9uIiwidHlwZSIsImhhbmRsZUZldGNoIiwibWV0YSIsIm9wdGltaXN0aWNSZXNwb25zZSIsInVuZGVmaW5lZCIsImVuZHBvaW50IiwiZ2V0T3B0aW1pc3RpY1Jlc3BvbnNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwia2V5IiwiZXJyb3IiLCJoYW5kbGVSZWNlaXZlIiwiY2xlYXJBbGwiLCJrIiwic2tpcExvZ2dpbmciLCJPYmplY3QiLCJoYXNPd24iLCJpbml0IiwiY2xlYW51cERhdGUiLCJjbGVhbnVwIiwiRGF0ZSIsIm5vdyIsImFsbFNldHRsZWQiLCJmZXRjaGVzIiwidmFsdWVzIiwibGVuZ3RoIiwiY2xlYXIiLCJjYXRjaCIsImdldExhc3RSZXNldCIsImxhc3RSZXNldCIsInZhbHVlT2YiLCJJbmZpbml0eSIsImZldGNoIiwicGF5bG9hZCIsInRocm90dGxlIiwicmVqZWN0IiwiY3JlYXRlZEF0IiwiZ2V0VGltZSIsImRlZmVyZWRGZXRjaCIsInByb21pc2UiLCJyZXNvbHZlUHJvbWlzZSIsImRhdGEiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJpc05hTiIsImNvbnNvbGUiLCJhcmdzIiwicmVzcG9uc2UiLCJvcHRpb25zIiwicHJvbWlzZUhhbmRsZXIiLCJnZXRNaWRkbGV3YXJlIiwidGltZW91dCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyL05ldHdvcmtNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNFVF9UWVBFLCBGRVRDSF9UWVBFLCBSRVNFVF9UWVBFIH0gZnJvbSAnLi4vYWN0aW9uVHlwZXMuanMnO1xuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSAnLi4vY29udHJvbGxlci9Db250cm9sbGVyLmpzJztcbmltcG9ydCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJy4uL2ludGVybmFsLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVJlY2VpdmUsXG4gIGNyZWF0ZVJlY2VpdmVFcnJvcixcbn0gZnJvbSAnLi4vc3RhdGUvbGVnYWN5LWFjdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0IFJJQyBmcm9tICcuLi9zdGF0ZS9SSUMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBGZXRjaEFjdGlvbixcbiAgUmVjZWl2ZUFjdGlvbixcbiAgTWFuYWdlcixcbiAgQWN0aW9uVHlwZXMsXG4gIE1pZGRsZXdhcmVBUEksXG4gIE1pZGRsZXdhcmUsXG4gIFN0YXRlLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBSZXNldEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBuYW1lID0gJ1Jlc2V0RXJyb3InO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdBYm9ydGVkIGR1ZSB0byBSRVNFVCcpO1xuICB9XG59XG5cbi8qKiBIYW5kbGVzIGFsbCBhc3luYyBuZXR3b3JrIGRpc3BhdGNoZXNcbiAqXG4gKiBEZWR1cGVzIGNvbmN1cnJlbnQgcmVxdWVzdHMgYnkga2VlcGluZyB0cmFjayBvZiBhbGwgZmV0Y2hlcyBpbiBmbGlnaHRcbiAqIGFuZCByZXR1cm5pbmcgZXhpc3RpbmcgcHJvbWlzZXMgZm9yIHJlcXVlc3RzIGFscmVhZHkgaW4gZmxpZ2h0LlxuICpcbiAqIEludGVyZmFjZXMgd2l0aCBzdG9yZSB2aWEgYSByZWR1eC1jb21wYXRpYmxlIG1pZGRsZXdhcmUuXG4gKlxuICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9OZXR3b3JrTWFuYWdlclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXR3b3JrTWFuYWdlciBpbXBsZW1lbnRzIE1hbmFnZXIge1xuICBwcm90ZWN0ZWQgZmV0Y2hlZDogeyBbazogc3RyaW5nXTogUHJvbWlzZTxhbnk+IH0gPSB7fTtcbiAgcHJvdGVjdGVkIHJlc29sdmVyczogeyBbazogc3RyaW5nXTogKHZhbHVlPzogYW55KSA9PiB2b2lkIH0gPSB7fTtcbiAgcHJvdGVjdGVkIHJlamVjdG9yczogeyBbazogc3RyaW5nXTogKHZhbHVlPzogYW55KSA9PiB2b2lkIH0gPSB7fTtcbiAgcHJvdGVjdGVkIGZldGNoZWRBdDogeyBbazogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgZGVjbGFyZSByZWFkb25seSBkYXRhRXhwaXJ5TGVuZ3RoOiBudW1iZXI7XG4gIGRlY2xhcmUgcmVhZG9ubHkgZXJyb3JFeHBpcnlMZW5ndGg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGRlY2xhcmUgbWlkZGxld2FyZTogTWlkZGxld2FyZTtcbiAgcHJvdGVjdGVkIGdldFN0YXRlOiAoKSA9PiBTdGF0ZTx1bmtub3duPiA9ICgpID0+IGluaXRpYWxTdGF0ZTtcbiAgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcigpO1xuICBkZWNsYXJlIGNsZWFudXBEYXRlPzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFFeHBpcnlMZW5ndGggPSA2MDAwMCwgZXJyb3JFeHBpcnlMZW5ndGggPSAxMDAwKSB7XG4gICAgdGhpcy5kYXRhRXhwaXJ5TGVuZ3RoID0gZGF0YUV4cGlyeUxlbmd0aDtcbiAgICB0aGlzLmVycm9yRXhwaXJ5TGVuZ3RoID0gZXJyb3JFeHBpcnlMZW5ndGg7XG5cbiAgICB0aGlzLm1pZGRsZXdhcmUgPSA8QyBleHRlbmRzIE1pZGRsZXdhcmVBUEk+KHtcbiAgICAgIGRpc3BhdGNoLFxuICAgICAgZ2V0U3RhdGUsXG4gICAgICBjb250cm9sbGVyLFxuICAgIH06IEMpID0+IHtcbiAgICAgIHRoaXMuZ2V0U3RhdGUgPSBnZXRTdGF0ZTtcbiAgICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgICByZXR1cm4gKG5leHQ6IENbJ2Rpc3BhdGNoJ10pOiBDWydkaXNwYXRjaCddID0+XG4gICAgICAgIChhY3Rpb24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEZFVENIX1RZUEU6XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmV0Y2goYWN0aW9uLCBkaXNwYXRjaCwgY29udHJvbGxlcik7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgY2FzZSB0aGF0IGNhdXNlcyBhbnkgc3RhdGUgY2hhbmdlXG4gICAgICAgICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIGludGVyY2VwdCBvdGhlciBmZXRjaGVzIGFzIHdlIGRvbid0IHdhbnQgdG8gdHJpZ2dlciByZWR1Y2VycyBkdXJpbmdcbiAgICAgICAgICAgICAgLy8gcmVuZGVyIC0gc28gd2UgbmVlZCB0byBzdG9wICdyZWFkb25seScgZmV0Y2hlcyB3aGljaCBjYW4gYmUgdHJpZ2dlcmVkIGluIHJlbmRlclxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgYWN0aW9uLm1ldGEub3B0aW1pc3RpY1Jlc3BvbnNlICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBhY3Rpb24uZW5kcG9pbnQ/LmdldE9wdGltaXN0aWNSZXNwb25zZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgY2FzZSBTRVRfVFlQRTpcbiAgICAgICAgICAgICAgLy8gb25seSByZWNlaXZlIGFmdGVyIG5ldyBzdGF0ZSBpcyBjb21wdXRlZFxuICAgICAgICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24ubWV0YS5rZXkgaW4gdGhpcy5mZXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAvLyBOb3RlOiBtZXRhICptdXN0KiBiZSBzZXQgYnkgcmVkdWNlciBzbyB0aGlzIHNob3VsZCBiZSBzYWZlXG4gICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0U3RhdGUoKS5tZXRhW2FjdGlvbi5tZXRhLmtleV0/LmVycm9yO1xuICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBlcnJvcnMgcmVzdWx0IGluIHN0YXRlIG1ldGEgaGF2aW5nIGVycm9yLCBzbyB3ZSBzaG91bGQgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdXNlIG9ubHkgbmV3IGFjdGlvbiB0eXBlc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJlY2VpdmUoY3JlYXRlUmVjZWl2ZUVycm9yKGVycm9yLCBhY3Rpb24ubWV0YSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSZWNlaXZlKGFjdGlvbik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgUkVTRVRfVFlQRToge1xuICAgICAgICAgICAgICBjb25zdCByZWplY3RvcnMgPSB7IC4uLnRoaXMucmVqZWN0b3JzIH07XG5cbiAgICAgICAgICAgICAgdGhpcy5jbGVhckFsbCgpO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIGV4dGVybmFsIGxpc3RlbmVycyB0byB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBoYXBwZW4gYWZ0ZXIgY29tbWl0IHNvIG91ciBvd24gcmVqZWN0b3Iga25vd3Mgbm90IHRvIGRpc3BhdGNoIGFuIGVycm9yIGJhc2VkIG9uIHRoaXNcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGsgaW4gcmVqZWN0b3JzKSB7XG4gICAgICAgICAgICAgICAgICByZWplY3RvcnNba10obmV3IFJlc2V0RXJyb3IoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gIH1cblxuICAvKiogVXNlZCBieSBEZXZ0b29sc01hbmFnZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gbG9nIGFuIGFjdGlvbiAqL1xuICBza2lwTG9nZ2luZyhhY3Rpb246IEFjdGlvblR5cGVzKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gKFxuICAgICAgYWN0aW9uLnR5cGUgPT09IEZFVENIX1RZUEUgJiYgT2JqZWN0Lmhhc093bih0aGlzLmZldGNoZWQsIGFjdGlvbi5tZXRhLmtleSlcbiAgICApO1xuICB9XG5cbiAgLyoqIE9uIG1vdW50ICovXG4gIGluaXQoKSB7XG4gICAgZGVsZXRlIHRoaXMuY2xlYW51cERhdGU7XG4gIH1cblxuICAvKiogRW5zdXJlcyBhbGwgcHJvbWlzZXMgYXJlIGNvbXBsZXRlZCBieSByZWplY3RpbmcgcmVtYWluaW5nLiAqL1xuICBjbGVhbnVwKCkge1xuICAgIC8vIGVuc3VyZSBubyBkaXNwYXRjaGVzIGFmdGVyIHVubW91bnRcbiAgICAvLyB0aGlzIG11c3QgYmUgcmV2ZXJzaWJsZSAoZG9uZSBpbiBpbml0KSBzbyB1c2VFZmZlY3QoKSByZW1haW5zIHN5bW1ldHJpY1xuICAgIHRoaXMuY2xlYW51cERhdGUgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgYWxsU2V0dGxlZCgpIHtcbiAgICBjb25zdCBmZXRjaGVzID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZldGNoZWQpO1xuICAgIGlmIChmZXRjaGVzLmxlbmd0aCkgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChmZXRjaGVzKTtcbiAgfVxuXG4gIC8qKiBDbGVhciBhbGwgcHJvbWlzZSBzdGF0ZSAqL1xuICBwcm90ZWN0ZWQgY2xlYXJBbGwoKSB7XG4gICAgZm9yIChjb25zdCBrIGluIHRoaXMucmVqZWN0b3JzKSB7XG4gICAgICB0aGlzLmNsZWFyKGspO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbGVhciBwcm9taXNlIHN0YXRlIGZvciBhIGdpdmVuIGtleSAqL1xuICBwcm90ZWN0ZWQgY2xlYXIoa2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmZldGNoZWRba2V5XS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgZGVsZXRlIHRoaXMucmVzb2x2ZXJzW2tleV07XG4gICAgZGVsZXRlIHRoaXMucmVqZWN0b3JzW2tleV07XG4gICAgZGVsZXRlIHRoaXMuZmV0Y2hlZFtrZXldO1xuICAgIGRlbGV0ZSB0aGlzLmZldGNoZWRBdFtrZXldO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldExhc3RSZXNldCgpIHtcbiAgICBpZiAodGhpcy5jbGVhbnVwRGF0ZSkgcmV0dXJuIHRoaXMuY2xlYW51cERhdGU7XG4gICAgY29uc3QgbGFzdFJlc2V0ID0gdGhpcy5jb250cm9sbGVyLmdldFN0YXRlKCkubGFzdFJlc2V0O1xuICAgIGlmIChsYXN0UmVzZXQgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbGFzdFJlc2V0LnZhbHVlT2YoKTtcbiAgICBpZiAodHlwZW9mIGxhc3RSZXNldCAhPT0gJ251bWJlcicpIHJldHVybiAtSW5maW5pdHk7XG4gICAgcmV0dXJuIGxhc3RSZXNldDtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBtaWRkbGV3YXJlIGludGVyY2VwdHMgJ3Jlc3QtaG9va3MvZmV0Y2gnIGFjdGlvbi5cbiAgICpcbiAgICogV2lsbCB0aGVuIHN0YXJ0IGEgcHJvbWlzZSBmb3IgYSBrZXkgYW5kIHBvdGVudGlhbGx5IHN0YXJ0IHRoZSBuZXR3b3JrXG4gICAqIGZldGNoLlxuICAgKlxuICAgKiBVc2VzIHRocm90dGxlIG9ubHkgd2hlbiBpbnN0cnVjdGVkIGJ5IGFjdGlvbiBtZXRhLiBUaGlzIGlzIHZhbHVhYmxlXG4gICAqIGZvciBlbnN1cmVzIG11dGF0aW9uIHJlcXVlc3RzIGFsd2F5cyBnbyB0aHJvdWdoLlxuICAgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZUZldGNoKFxuICAgIGFjdGlvbjogRmV0Y2hBY3Rpb24sXG4gICAgZGlzcGF0Y2g6IChhY3Rpb246IGFueSkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxuICApIHtcbiAgICBjb25zdCBmZXRjaCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIGNvbnN0IHsga2V5LCB0aHJvdHRsZSwgcmVzb2x2ZSwgcmVqZWN0IH0gPSBhY3Rpb24ubWV0YTtcbiAgICAvLyBUT0RPKGJyZWFraW5nKTogcmVtb3ZlIHN1cHBvcnQgZm9yIERhdGUgdHlwZSBpbiAnUmVjZWl2ZScgYWN0aW9uXG4gICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgIHR5cGVvZiBhY3Rpb24ubWV0YS5jcmVhdGVkQXQgIT09ICdudW1iZXInXG4gICAgICAgID8gYWN0aW9uLm1ldGEuY3JlYXRlZEF0LmdldFRpbWUoKVxuICAgICAgICA6IGFjdGlvbi5tZXRhLmNyZWF0ZWRBdDtcblxuICAgIGNvbnN0IGRlZmVyZWRGZXRjaCA9ICgpID0+IHtcbiAgICAgIGxldCBwcm9taXNlID0gZmV0Y2goKTtcbiAgICAgIGNvbnN0IHJlc29sdmVQcm9taXNlID0gKFxuICAgICAgICBwcm9taXNlOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IG9iamVjdCB8IG51bGw+LFxuICAgICAgKSA9PlxuICAgICAgICBwcm9taXNlXG4gICAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0pO1xuICAgICAgLy8gc2NoZWR1bGUgbm9uLXRocm90dGxlZCByZXNvbHV0aW9ucyBpbiBhIG1pY3JvdGFzayBiZWZvcmUgcmVjZWl2ZVxuICAgICAgLy8gdGhpcyBlbmFibGVzIHVzZXJzIGF3YWl0aW5nIHRoZWlyIGZldGNoIHRvIHRyaWdnZXIgYW55IHJlYWN0IHVwZGF0ZXMgbmVlZGVkIHRvIGRlYWxcbiAgICAgIC8vIHdpdGggdXBjb21pbmcgY2hhbmdlcyBiZWNhdXNlIG9mIHRoZSBmZXRjaCAoZm9yIGluc3RhbmNlIGF2b2lkaW5nIHN1c3BlbnNlIGlmIHNvbWV0aGluZyBpcyBkZWxldGVkKVxuICAgICAgaWYgKCF0aHJvdHRsZSAmJiBhY3Rpb24uZW5kcG9pbnQpIHtcbiAgICAgICAgcHJvbWlzZSA9IHJlc29sdmVQcm9taXNlKHByb21pc2UpO1xuICAgICAgfVxuICAgICAgcHJvbWlzZSA9IHByb21pc2VcbiAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgbGV0IGxhc3RSZXNldCA9IHRoaXMuZ2V0TGFzdFJlc2V0KCk7XG5cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGlzTmFOKGxhc3RSZXNldCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdzdGF0ZS5sYXN0UmVzZXQgaXMgTmFOLiBPbmx5IHBvc2l0aXZlIHRpbWVzdGFtcHMgYXJlIHZhbGlkLicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGFzdFJlc2V0ID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkb24ndCB1cGRhdGUgc3RhdGUgd2l0aCBwcm9taXNlcyBzdGFydGVkIGJlZm9yZSBsYXN0IGNsZWFyXG4gICAgICAgICAgaWYgKGNyZWF0ZWRBdCA+PSBsYXN0UmVzZXQpIHtcbiAgICAgICAgICAgIC8vIHdlIHN0aWxsIGNoZWNrIGZvciBjb250cm9sbGVyIGluIGNhc2Ugc29tZW9uZSBkaWRuJ3QgaGF2ZSB0eXBlIHByb3RlY3Rpb24gc2luY2UgdGhpcyBkaWRuJ3QgYWx3YXlzIGV4aXN0XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmVuZHBvaW50ICYmIHRoaXMuY29udHJvbGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucmVzb2x2ZShhY3Rpb24uZW5kcG9pbnQsIHtcbiAgICAgICAgICAgICAgICBhcmdzOiBhY3Rpb24ubWV0YS5hcmdzIGFzIGFueSxcbiAgICAgICAgICAgICAgICByZXNwb25zZTogZGF0YSxcbiAgICAgICAgICAgICAgICBmZXRjaGVkQXQ6IGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPKGJyZWFraW5nKTogaXMgdGhpcyBicmFuY2ggc3RpbGwgcG9zc2libGU/IHJlbW92ZSBpbiBuZXh0IG1ham9yIHVwZGF0ZVxuICAgICAgICAgICAgICAvLyBkb2VzIHRoaXMgdGhyb3cgaWYgdGhlIHJlZHVjZXIgZmFpbHM/IC0gbm8gYmVjYXVzZSByZWR1Y2VyIGlzIHdyYXBwZWQgaW4gdHJ5L2NhdGNoXG4gICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kaXNwYXRjaChcbiAgICAgICAgICAgICAgICBjcmVhdGVSZWNlaXZlKGRhdGEsIHtcbiAgICAgICAgICAgICAgICAgIC4uLmFjdGlvbi5tZXRhLFxuICAgICAgICAgICAgICAgICAgZmV0Y2hlZEF0OiBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgICBkYXRhRXhwaXJ5TGVuZ3RoOlxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24ubWV0YS5vcHRpb25zPy5kYXRhRXhwaXJ5TGVuZ3RoID8/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUV4cGlyeUxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc3QgbGFzdFJlc2V0ID0gdGhpcy5nZXRMYXN0UmVzZXQoKTtcbiAgICAgICAgICAvLyBkb24ndCB1cGRhdGUgc3RhdGUgd2l0aCBwcm9taXNlcyBzdGFydGVkIGJlZm9yZSBsYXN0IGNsZWFyXG4gICAgICAgICAgaWYgKGNyZWF0ZWRBdCA+PSBsYXN0UmVzZXQpIHtcbiAgICAgICAgICAgIGlmIChhY3Rpb24uZW5kcG9pbnQgJiYgdGhpcy5jb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5yZXNvbHZlKGFjdGlvbi5lbmRwb2ludCwge1xuICAgICAgICAgICAgICAgIGFyZ3M6IGFjdGlvbi5tZXRhLmFyZ3MgYXMgYW55LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBlcnJvcixcbiAgICAgICAgICAgICAgICBmZXRjaGVkQXQ6IGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgY3JlYXRlUmVjZWl2ZUVycm9yKGVycm9yLCB7XG4gICAgICAgICAgICAgICAgICAuLi5hY3Rpb24ubWV0YSxcbiAgICAgICAgICAgICAgICAgIGVycm9yRXhwaXJ5TGVuZ3RoOlxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24ubWV0YS5vcHRpb25zPy5lcnJvckV4cGlyeUxlbmd0aCA/P1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yRXhwaXJ5TGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgZmV0Y2hlZEF0OiBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICAgIC8vIGxlZ2FjeSBiZWhhdmlvciBzY2hlZHVsZXMgcmVzb2x1dGlvbiBhZnRlciBkaXNwYXRjaFxuICAgICAgaWYgKCF0aHJvdHRsZSAmJiAhYWN0aW9uLmVuZHBvaW50KSB7XG4gICAgICAgIHByb21pc2UgPSByZXNvbHZlUHJvbWlzZShwcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBpZiAodGhyb3R0bGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRocm90dGxlKGtleSwgZGVmZXJlZEZldGNoLCBjcmVhdGVkQXQpXG4gICAgICAgIC50aGVuKGRhdGEgPT4gcmVzb2x2ZShkYXRhKSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGVmZXJlZEZldGNoKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBtaWRkbGV3YXJlIGludGVyY2VwdHMgYSByZWNlaXZlIGFjdGlvbi5cbiAgICpcbiAgICogV2lsbCByZXNvbHZlIHRoZSBwcm9taXNlIGFzc29jaWF0ZWQgd2l0aCByZWNlaXZlIGtleS5cbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVSZWNlaXZlKGFjdGlvbjogUmVjZWl2ZUFjdGlvbikge1xuICAgIC8vIHRoaXMgY2FuIHN0aWxsIHR1cm4gb3V0IHRvIGJlIHVudHJ1ZSBzaW5jZSB0aGlzIGlzIGFzeW5jXG4gICAgaWYgKE9iamVjdC5oYXNPd24odGhpcy5mZXRjaGVkLCBhY3Rpb24ubWV0YS5rZXkpKSB7XG4gICAgICBsZXQgcHJvbWlzZUhhbmRsZXI6ICh2YWx1ZT86IGFueSkgPT4gdm9pZDtcbiAgICAgIGlmIChhY3Rpb24uZXJyb3IpIHtcbiAgICAgICAgcHJvbWlzZUhhbmRsZXIgPSB0aGlzLnJlamVjdG9yc1thY3Rpb24ubWV0YS5rZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvbWlzZUhhbmRsZXIgPSB0aGlzLnJlc29sdmVyc1thY3Rpb24ubWV0YS5rZXldO1xuICAgICAgfVxuICAgICAgcHJvbWlzZUhhbmRsZXIoYWN0aW9uLnBheWxvYWQpO1xuICAgICAgLy8gc2luY2Ugd2UncmUgcmVzb2x2ZWQgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGlzIHByb21pc2VcbiAgICAgIHRoaXMuY2xlYXIoYWN0aW9uLm1ldGEua2V5KTtcbiAgICB9XG4gIH1cblxuICAvKiogQXR0YWNoZXMgTmV0d29ya01hbmFnZXIgdG8gc3RvcmVcbiAgICpcbiAgICogSW50ZXJjZXB0cyAncmVzdC1ob29rcy9mZXRjaCcgYWN0aW9ucyB0byBzdGFydCByZXF1ZXN0cy5cbiAgICpcbiAgICogUmVzb2x2ZS9yZWplY3RzIGEgcmVxdWVzdCB3aGVuIG1hdGNoaW5nICdyZXN0LWhvb2tzL3JlY2VpdmUnIGV2ZW50XG4gICAqIGlzIHNlZW4uXG4gICAqL1xuICBnZXRNaWRkbGV3YXJlKCkge1xuICAgIHJldHVybiB0aGlzLm1pZGRsZXdhcmU7XG4gIH1cblxuICAvKiogRW5zdXJlcyBvbmx5IG9uZSByZXF1ZXN0IGZvciBhIGdpdmVuIGtleSBpcyBpbiBmbGlnaHQgYXQgYW55IHRpbWVcbiAgICpcbiAgICogVXNlcyBrZXkgdG8gZWl0aGVyIHJldHJpZXZlIGluLWZsaWdodCBwcm9taXNlLCBvciBpZiBub3RcbiAgICogY3JlYXRlIGEgbmV3IHByb21pc2UgYW5kIGNhbGwgZmV0Y2guXG4gICAqXG4gICAqIE5vdGU6IFRoZSBuZXcgcHJvbWlzZSBpcyBub3QgYWN0dWFsbHkgdGllZCB0byBmZXRjaCBhdCBhbGwsXG4gICAqIGJ1dCBpcyByZXNvbHZlZCB3aGVuIHRoZSBleHBlY3RlZCAncmVjaWV2ZScgYWN0aW9uIGlzIHByb2Nlc3NlZC5cbiAgICogVGhpcyBlbnN1cmVzIHByb21pc2VzIGFyZSByZXNvbHZlZCBvbmx5IG9uY2UgdGhlaXIgZGF0YSBpcyBwcm9jZXNzZWRcbiAgICogYnkgdGhlIHJlZHVjZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgdGhyb3R0bGUoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgZmV0Y2g6ICgpID0+IFByb21pc2U8YW55PixcbiAgICBjcmVhdGVkQXQ6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgbGFzdFJlc2V0ID0gdGhpcy5nZXRMYXN0UmVzZXQoKTtcbiAgICAvLyB3ZSdyZSBhbHJlYWR5IGZldGNoaW5nIHNvIHJldXNlIHRoZSBwcm9taXNlXG4gICAgLy8gZmV0Y2hlcyBhZnRlciByZXNldCBkbyBub3QgY291bnRcbiAgICBpZiAoa2V5IGluIHRoaXMuZmV0Y2hlZCAmJiB0aGlzLmZldGNoZWRBdFtrZXldID4gbGFzdFJlc2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5mZXRjaGVkW2tleV07XG4gICAgfVxuXG4gICAgdGhpcy5mZXRjaGVkW2tleV0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVyc1trZXldID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMucmVqZWN0b3JzW2tleV0gPSByZWplY3Q7XG4gICAgfSk7XG4gICAgdGhpcy5mZXRjaGVkQXRba2V5XSA9IGNyZWF0ZWRBdDtcblxuICAgIC8vIHNpbmNlIG91ciByZWFsIHByb21pc2UgaXMgcmVzb2x2ZWQgdmlhIHRoZSB3cmFwUmVkdWNlcigpLFxuICAgIC8vIHdlIHNob3VsZCBqdXN0IHN0b3AgYWxsIGVycm9ycyBoZXJlLlxuICAgIC8vIFRPRE86IGRlY291cGxlIHRoaXMgZnJvbSB1c2VGZXRjaGVyKCkgKHRoYXQncyB3aGF0J3MgZGlzcGF0Y2hpbmcgdGhlIGVycm9yIHRoZSByZXNvbHZlcyBpbiBoZXJlKVxuICAgIFJJQyhcbiAgICAgICgpID0+IHtcbiAgICAgICAgZmV0Y2goKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgIH0sXG4gICAgICB7IHRpbWVvdXQ6IDUwMCB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5mZXRjaGVkW2tleV07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsUUFBUSxFQUFFQyxVQUFVLEVBQUVDLFVBQVUsUUFBUSxtQkFBbUI7QUFDcEUsT0FBT0MsVUFBVSxNQUFNLDZCQUE2QjtBQUNwRCxTQUFTQyxZQUFZLFFBQVEsZ0JBQWdCO0FBQzdDLFNBQ0VDLGFBQWEsRUFDYkMsa0JBQWtCLFFBQ2Isa0NBQWtDO0FBQ3pDLE9BQU9DLEdBQUcsTUFBTSxpQkFBaUI7QUFXakMsT0FBTyxNQUFNQyxVQUFVLFNBQVNDLEtBQUssQ0FBQztFQUdwQ0MsV0FBVyxHQUFHO0lBQ1osS0FBSyxDQUFDLHNCQUFzQixDQUFDO0lBQUMsS0FIaENDLElBQUksR0FBRyxZQUFZO0VBSW5CO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxNQUFNQyxjQUFjLENBQW9CO0VBWXJERixXQUFXLENBQUNHLGdCQUFnQixHQUFHLEtBQUssRUFBRUMsaUJBQWlCLEdBQUcsSUFBSSxFQUFFO0lBQUEsS0FYdERDLE9BQU8sR0FBa0MsQ0FBQyxDQUFDO0lBQUEsS0FDM0NDLFNB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 | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTRVRfVFlQRSIsIkZFVENIX1RZUEUiLCJSRVNFVF9UWVBFIiwiQ29udHJvbGxlciIsImluaXRpYWxTdGF0ZSIsImNyZWF0ZVJlY2VpdmUiLCJjcmVhdGVSZWNlaXZlRXJyb3IiLCJSSUMiLCJSZXNldEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJOZXR3b3JrTWFuYWdlciIsImRhdGFFeHBpcnlMZW5ndGgiLCJlcnJvckV4cGlyeUxlbmd0aCIsImZldGNoZWQiLCJPYmplY3QiLCJjcmVhdGUiLCJyZXNvbHZlcnMiLCJyZWplY3RvcnMiLCJmZXRjaGVkQXQiLCJnZXRTdGF0ZSIsImNvbnRyb2xsZXIiLCJtaWRkbGV3YXJlIiwiZGlzcGF0Y2giLCJuZXh0IiwiYWN0aW9uIiwidHlwZSIsImhhbmRsZUZldGNoIiwibWV0YSIsIm9wdGltaXN0aWNSZXNwb25zZSIsInVuZGVmaW5lZCIsImVuZHBvaW50IiwiZ2V0T3B0aW1pc3RpY1Jlc3BvbnNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwia2V5IiwiZXJyb3IiLCJoYW5kbGVSZWNlaXZlIiwiY2xlYXJBbGwiLCJrIiwic2tpcExvZ2dpbmciLCJpbml0IiwiY2xlYW51cERhdGUiLCJjbGVhbnVwIiwiRGF0ZSIsIm5vdyIsImFsbFNldHRsZWQiLCJmZXRjaGVzIiwidmFsdWVzIiwibGVuZ3RoIiwiY2xlYXIiLCJjYXRjaCIsImdldExhc3RSZXNldCIsImxhc3RSZXNldCIsInZhbHVlT2YiLCJJbmZpbml0eSIsImZldGNoIiwicGF5bG9hZCIsInRocm90dGxlIiwicmVqZWN0IiwiY3JlYXRlZEF0IiwiZ2V0VGltZSIsImRlZmVyZWRGZXRjaCIsInByb21pc2UiLCJyZXNvbHZlUHJvbWlzZSIsImRhdGEiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJpc05hTiIsImNvbnNvbGUiLCJhcmdzIiwicmVzcG9uc2UiLCJvcHRpb25zIiwicHJvbWlzZUhhbmRsZXIiLCJnZXRNaWRkbGV3YXJlIiwidGltZW91dCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyL05ldHdvcmtNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNFVF9UWVBFLCBGRVRDSF9UWVBFLCBSRVNFVF9UWVBFIH0gZnJvbSAnLi4vYWN0aW9uVHlwZXMuanMnO1xuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSAnLi4vY29udHJvbGxlci9Db250cm9sbGVyLmpzJztcbmltcG9ydCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJy4uL2ludGVybmFsLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVJlY2VpdmUsXG4gIGNyZWF0ZVJlY2VpdmVFcnJvcixcbn0gZnJvbSAnLi4vc3RhdGUvbGVnYWN5LWFjdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0IFJJQyBmcm9tICcuLi9zdGF0ZS9SSUMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBGZXRjaEFjdGlvbixcbiAgUmVjZWl2ZUFjdGlvbixcbiAgTWFuYWdlcixcbiAgQWN0aW9uVHlwZXMsXG4gIE1pZGRsZXdhcmVBUEksXG4gIE1pZGRsZXdhcmUsXG4gIFN0YXRlLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBSZXNldEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBuYW1lID0gJ1Jlc2V0RXJyb3InO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdBYm9ydGVkIGR1ZSB0byBSRVNFVCcpO1xuICB9XG59XG5cbi8qKiBIYW5kbGVzIGFsbCBhc3luYyBuZXR3b3JrIGRpc3BhdGNoZXNcbiAqXG4gKiBEZWR1cGVzIGNvbmN1cnJlbnQgcmVxdWVzdHMgYnkga2VlcGluZyB0cmFjayBvZiBhbGwgZmV0Y2hlcyBpbiBmbGlnaHRcbiAqIGFuZCByZXR1cm5pbmcgZXhpc3RpbmcgcHJvbWlzZXMgZm9yIHJlcXVlc3RzIGFscmVhZHkgaW4gZmxpZ2h0LlxuICpcbiAqIEludGVyZmFjZXMgd2l0aCBzdG9yZSB2aWEgYSByZWR1eC1jb21wYXRpYmxlIG1pZGRsZXdhcmUuXG4gKlxuICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9OZXR3b3JrTWFuYWdlclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXR3b3JrTWFuYWdlciBpbXBsZW1lbnRzIE1hbmFnZXIge1xuICBwcm90ZWN0ZWQgZmV0Y2hlZDogeyBbazogc3RyaW5nXTogUHJvbWlzZTxhbnk+IH0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBwcm90ZWN0ZWQgcmVzb2x2ZXJzOiB7IFtrOiBzdHJpbmddOiAodmFsdWU/OiBhbnkpID0+IHZvaWQgfSA9IHt9O1xuICBwcm90ZWN0ZWQgcmVqZWN0b3JzOiB7IFtrOiBzdHJpbmddOiAodmFsdWU/OiBhbnkpID0+IHZvaWQgfSA9IHt9O1xuICBwcm90ZWN0ZWQgZmV0Y2hlZEF0OiB7IFtrOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICBkZWNsYXJlIHJlYWRvbmx5IGRhdGFFeHBpcnlMZW5ndGg6IG51bWJlcjtcbiAgZGVjbGFyZSByZWFkb25seSBlcnJvckV4cGlyeUxlbmd0aDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBtaWRkbGV3YXJlOiBNaWRkbGV3YXJlO1xuICBwcm90ZWN0ZWQgZ2V0U3RhdGU6ICgpID0+IFN0YXRlPHVua25vd24+ID0gKCkgPT4gaW5pdGlhbFN0YXRlO1xuICBwcm90ZWN0ZWQgY29udHJvbGxlcjogQ29udHJvbGxlciA9IG5ldyBDb250cm9sbGVyKCk7XG4gIGRlY2xhcmUgY2xlYW51cERhdGU/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZGF0YUV4cGlyeUxlbmd0aCA9IDYwMDAwLCBlcnJvckV4cGlyeUxlbmd0aCA9IDEwMDApIHtcbiAgICB0aGlzLmRhdGFFeHBpcnlMZW5ndGggPSBkYXRhRXhwaXJ5TGVuZ3RoO1xuICAgIHRoaXMuZXJyb3JFeHBpcnlMZW5ndGggPSBlcnJvckV4cGlyeUxlbmd0aDtcblxuICAgIHRoaXMubWlkZGxld2FyZSA9IDxDIGV4dGVuZHMgTWlkZGxld2FyZUFQST4oe1xuICAgICAgZGlzcGF0Y2gsXG4gICAgICBnZXRTdGF0ZSxcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgfTogQykgPT4ge1xuICAgICAgdGhpcy5nZXRTdGF0ZSA9IGdldFN0YXRlO1xuICAgICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICAgIHJldHVybiAobmV4dDogQ1snZGlzcGF0Y2gnXSk6IENbJ2Rpc3BhdGNoJ10gPT5cbiAgICAgICAgKGFjdGlvbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRkVUQ0hfVFlQRTpcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGZXRjaChhY3Rpb24sIGRpc3BhdGNoLCBjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgb25seSBjYXNlIHRoYXQgY2F1c2VzIGFueSBzdGF0ZSBjaGFuZ2VcbiAgICAgICAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gaW50ZXJjZXB0IG90aGVyIGZldGNoZXMgYXMgd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIHJlZHVjZXJzIGR1cmluZ1xuICAgICAgICAgICAgICAvLyByZW5kZXIgLSBzbyB3ZSBuZWVkIHRvIHN0b3AgJ3JlYWRvbmx5JyBmZXRjaGVzIHdoaWNoIGNhbiBiZSB0cmlnZ2VyZWQgaW4gcmVuZGVyXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhY3Rpb24ubWV0YS5vcHRpbWlzdGljUmVzcG9uc2UgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgIGFjdGlvbi5lbmRwb2ludD8uZ2V0T3B0aW1pc3RpY1Jlc3BvbnNlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICBjYXNlIFNFVF9UWVBFOlxuICAgICAgICAgICAgICAvLyBvbmx5IHJlY2VpdmUgYWZ0ZXIgbmV3IHN0YXRlIGlzIGNvbXB1dGVkXG4gICAgICAgICAgICAgIHJldHVybiBuZXh0KGFjdGlvbikudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5tZXRhLmtleSBpbiB0aGlzLmZldGNoZWQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IG1ldGEgKm11c3QqIGJlIHNldCBieSByZWR1Y2VyIHNvIHRoaXMgc2hvdWxkIGJlIHNhZmVcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5nZXRTdGF0ZSgpLm1ldGFbYWN0aW9uLm1ldGEua2V5XT8uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzaW5nIGVycm9ycyByZXN1bHQgaW4gc3RhdGUgbWV0YSBoYXZpbmcgZXJyb3IsIHNvIHdlIHNob3VsZCByZWplY3QgdGhlIHByb21pc2VcbiAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2Ugb25seSBuZXcgYWN0aW9uIHR5cGVzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVjZWl2ZShjcmVhdGVSZWNlaXZlRXJyb3IoZXJyb3IsIGFjdGlvbi5tZXRhKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJlY2VpdmUoYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FzZSBSRVNFVF9UWVBFOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlamVjdG9ycyA9IHsgLi4udGhpcy5yZWplY3RvcnMgfTtcblxuICAgICAgICAgICAgICB0aGlzLmNsZWFyQWxsKCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0KGFjdGlvbikudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgZXh0ZXJuYWwgbGlzdGVuZXJzIHRvIHRoZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBtdXN0IGhhcHBlbiBhZnRlciBjb21taXQgc28gb3VyIG93biByZWplY3RvciBrbm93cyBub3QgdG8gZGlzcGF0Y2ggYW4gZXJyb3IgYmFzZWQgb24gdGhpc1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgayBpbiByZWplY3RvcnMpIHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdG9yc1trXShuZXcgUmVzZXRFcnJvcigpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBVc2VkIGJ5IERldnRvb2xzTWFuYWdlciB0byBkZXRlcm1pbmUgd2hldGhlciB0byBsb2cgYW4gYWN0aW9uICovXG4gIHNraXBMb2dnaW5nKGFjdGlvbjogQWN0aW9uVHlwZXMpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiBhY3Rpb24udHlwZSA9PT0gRkVUQ0hfVFlQRSAmJiBhY3Rpb24ubWV0YS5rZXkgaW4gdGhpcy5mZXRjaGVkO1xuICB9XG5cbiAgLyoqIE9uIG1vdW50ICovXG4gIGluaXQoKSB7XG4gICAgZGVsZXRlIHRoaXMuY2xlYW51cERhdGU7XG4gIH1cblxuICAvKiogRW5zdXJlcyBhbGwgcHJvbWlzZXMgYXJlIGNvbXBsZXRlZCBieSByZWplY3RpbmcgcmVtYWluaW5nLiAqL1xuICBjbGVhbnVwKCkge1xuICAgIC8vIGVuc3VyZSBubyBkaXNwYXRjaGVzIGFmdGVyIHVubW91bnRcbiAgICAvLyB0aGlzIG11c3QgYmUgcmV2ZXJzaWJsZSAoZG9uZSBpbiBpbml0KSBzbyB1c2VFZmZlY3QoKSByZW1haW5zIHN5bW1ldHJpY1xuICAgIHRoaXMuY2xlYW51cERhdGUgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgYWxsU2V0dGxlZCgpIHtcbiAgICBjb25zdCBmZXRjaGVzID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZldGNoZWQpO1xuICAgIGlmIChmZXRjaGVzLmxlbmd0aCkgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChmZXRjaGVzKTtcbiAgfVxuXG4gIC8qKiBDbGVhciBhbGwgcHJvbWlzZSBzdGF0ZSAqL1xuICBwcm90ZWN0ZWQgY2xlYXJBbGwoKSB7XG4gICAgZm9yIChjb25zdCBrIGluIHRoaXMucmVqZWN0b3JzKSB7XG4gICAgICB0aGlzLmNsZWFyKGspO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbGVhciBwcm9taXNlIHN0YXRlIGZvciBhIGdpdmVuIGtleSAqL1xuICBwcm90ZWN0ZWQgY2xlYXIoa2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmZldGNoZWRba2V5XS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgZGVsZXRlIHRoaXMucmVzb2x2ZXJzW2tleV07XG4gICAgZGVsZXRlIHRoaXMucmVqZWN0b3JzW2tleV07XG4gICAgZGVsZXRlIHRoaXMuZmV0Y2hlZFtrZXldO1xuICAgIGRlbGV0ZSB0aGlzLmZldGNoZWRBdFtrZXldO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldExhc3RSZXNldCgpIHtcbiAgICBpZiAodGhpcy5jbGVhbnVwRGF0ZSkgcmV0dXJuIHRoaXMuY2xlYW51cERhdGU7XG4gICAgY29uc3QgbGFzdFJlc2V0ID0gdGhpcy5jb250cm9sbGVyLmdldFN0YXRlKCkubGFzdFJlc2V0O1xuICAgIGlmIChsYXN0UmVzZXQgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbGFzdFJlc2V0LnZhbHVlT2YoKTtcbiAgICBpZiAodHlwZW9mIGxhc3RSZXNldCAhPT0gJ251bWJlcicpIHJldHVybiAtSW5maW5pdHk7XG4gICAgcmV0dXJuIGxhc3RSZXNldDtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBtaWRkbGV3YXJlIGludGVyY2VwdHMgJ3Jlc3QtaG9va3MvZmV0Y2gnIGFjdGlvbi5cbiAgICpcbiAgICogV2lsbCB0aGVuIHN0YXJ0IGEgcHJvbWlzZSBmb3IgYSBrZXkgYW5kIHBvdGVudGlhbGx5IHN0YXJ0IHRoZSBuZXR3b3JrXG4gICAqIGZldGNoLlxuICAgKlxuICAgKiBVc2VzIHRocm90dGxlIG9ubHkgd2hlbiBpbnN0cnVjdGVkIGJ5IGFjdGlvbiBtZXRhLiBUaGlzIGlzIHZhbHVhYmxlXG4gICAqIGZvciBlbnN1cmVzIG11dGF0aW9uIHJlcXVlc3RzIGFsd2F5cyBnbyB0aHJvdWdoLlxuICAgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZUZldGNoKFxuICAgIGFjdGlvbjogRmV0Y2hBY3Rpb24sXG4gICAgZGlzcGF0Y2g6IChhY3Rpb246IGFueSkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxuICApIHtcbiAgICBjb25zdCBmZXRjaCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIGNvbnN0IHsga2V5LCB0aHJvdHRsZSwgcmVzb2x2ZSwgcmVqZWN0IH0gPSBhY3Rpb24ubWV0YTtcbiAgICAvLyBUT0RPKGJyZWFraW5nKTogcmVtb3ZlIHN1cHBvcnQgZm9yIERhdGUgdHlwZSBpbiAnUmVjZWl2ZScgYWN0aW9uXG4gICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgIHR5cGVvZiBhY3Rpb24ubWV0YS5jcmVhdGVkQXQgIT09ICdudW1iZXInXG4gICAgICAgID8gYWN0aW9uLm1ldGEuY3JlYXRlZEF0LmdldFRpbWUoKVxuICAgICAgICA6IGFjdGlvbi5tZXRhLmNyZWF0ZWRBdDtcblxuICAgIGNvbnN0IGRlZmVyZWRGZXRjaCA9ICgpID0+IHtcbiAgICAgIGxldCBwcm9taXNlID0gZmV0Y2goKTtcbiAgICAgIGNvbnN0IHJlc29sdmVQcm9taXNlID0gKFxuICAgICAgICBwcm9taXNlOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IG9iamVjdCB8IG51bGw+LFxuICAgICAgKSA9PlxuICAgICAgICBwcm9taXNlXG4gICAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0pO1xuICAgICAgLy8gc2NoZWR1bGUgbm9uLXRocm90dGxlZCByZXNvbHV0aW9ucyBpbiBhIG1pY3JvdGFzayBiZWZvcmUgcmVjZWl2ZVxuICAgICAgLy8gdGhpcyBlbmFibGVzIHVzZXJzIGF3YWl0aW5nIHRoZWlyIGZldGNoIHRvIHRyaWdnZXIgYW55IHJlYWN0IHVwZGF0ZXMgbmVlZGVkIHRvIGRlYWxcbiAgICAgIC8vIHdpdGggdXBjb21pbmcgY2hhbmdlcyBiZWNhdXNlIG9mIHRoZSBmZXRjaCAoZm9yIGluc3RhbmNlIGF2b2lkaW5nIHN1c3BlbnNlIGlmIHNvbWV0aGluZyBpcyBkZWxldGVkKVxuICAgICAgaWYgKCF0aHJvdHRsZSAmJiBhY3Rpb24uZW5kcG9pbnQpIHtcbiAgICAgICAgcHJvbWlzZSA9IHJlc29sdmVQcm9taXNlKHByb21pc2UpO1xuICAgICAgfVxuICAgICAgcHJvbWlzZSA9IHByb21pc2VcbiAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgbGV0IGxhc3RSZXNldCA9IHRoaXMuZ2V0TGFzdFJlc2V0KCk7XG5cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGlzTmFOKGxhc3RSZXNldCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdzdGF0ZS5sYXN0UmVzZXQgaXMgTmFOLiBPbmx5IHBvc2l0aXZlIHRpbWVzdGFtcHMgYXJlIHZhbGlkLicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGFzdFJlc2V0ID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkb24ndCB1cGRhdGUgc3RhdGUgd2l0aCBwcm9taXNlcyBzdGFydGVkIGJlZm9yZSBsYXN0IGNsZWFyXG4gICAgICAgICAgaWYgKGNyZWF0ZWRBdCA+PSBsYXN0UmVzZXQpIHtcbiAgICAgICAgICAgIC8vIHdlIHN0aWxsIGNoZWNrIGZvciBjb250cm9sbGVyIGluIGNhc2Ugc29tZW9uZSBkaWRuJ3QgaGF2ZSB0eXBlIHByb3RlY3Rpb24gc2luY2UgdGhpcyBkaWRuJ3QgYWx3YXlzIGV4aXN0XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmVuZHBvaW50ICYmIHRoaXMuY29udHJvbGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucmVzb2x2ZShhY3Rpb24uZW5kcG9pbnQsIHtcbiAgICAgICAgICAgICAgICBhcmdzOiBhY3Rpb24ubWV0YS5hcmdzIGFzIGFueSxcbiAgICAgICAgICAgICAgICByZXNwb25zZTogZGF0YSxcbiAgICAgICAgICAgICAgICBmZXRjaGVkQXQ6IGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPKGJyZWFraW5nKTogaXMgdGhpcyBicmFuY2ggc3RpbGwgcG9zc2libGU/IHJlbW92ZSBpbiBuZXh0IG1ham9yIHVwZGF0ZVxuICAgICAgICAgICAgICAvLyBkb2VzIHRoaXMgdGhyb3cgaWYgdGhlIHJlZHVjZXIgZmFpbHM/IC0gbm8gYmVjYXVzZSByZWR1Y2VyIGlzIHdyYXBwZWQgaW4gdHJ5L2NhdGNoXG4gICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kaXNwYXRjaChcbiAgICAgICAgICAgICAgICBjcmVhdGVSZWNlaXZlKGRhdGEsIHtcbiAgICAgICAgICAgICAgICAgIC4uLmFjdGlvbi5tZXRhLFxuICAgICAgICAgICAgICAgICAgZmV0Y2hlZEF0OiBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgICBkYXRhRXhwaXJ5TGVuZ3RoOlxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24ubWV0YS5vcHRpb25zPy5kYXRhRXhwaXJ5TGVuZ3RoID8/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUV4cGlyeUxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc3QgbGFzdFJlc2V0ID0gdGhpcy5nZXRMYXN0UmVzZXQoKTtcbiAgICAgICAgICAvLyBkb24ndCB1cGRhdGUgc3RhdGUgd2l0aCBwcm9taXNlcyBzdGFydGVkIGJlZm9yZSBsYXN0IGNsZWFyXG4gICAgICAgICAgaWYgKGNyZWF0ZWRBdCA+PSBsYXN0UmVzZXQpIHtcbiAgICAgICAgICAgIGlmIChhY3Rpb24uZW5kcG9pbnQgJiYgdGhpcy5jb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5yZXNvbHZlKGFjdGlvbi5lbmRwb2ludCwge1xuICAgICAgICAgICAgICAgIGFyZ3M6IGFjdGlvbi5tZXRhLmFyZ3MgYXMgYW55LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBlcnJvcixcbiAgICAgICAgICAgICAgICBmZXRjaGVkQXQ6IGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgY3JlYXRlUmVjZWl2ZUVycm9yKGVycm9yLCB7XG4gICAgICAgICAgICAgICAgICAuLi5hY3Rpb24ubWV0YSxcbiAgICAgICAgICAgICAgICAgIGVycm9yRXhwaXJ5TGVuZ3RoOlxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24ubWV0YS5vcHRpb25zPy5lcnJvckV4cGlyeUxlbmd0aCA/P1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yRXhwaXJ5TGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgZmV0Y2hlZEF0OiBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICAgIC8vIGxlZ2FjeSBiZWhhdmlvciBzY2hlZHVsZXMgcmVzb2x1dGlvbiBhZnRlciBkaXNwYXRjaFxuICAgICAgaWYgKCF0aHJvdHRsZSAmJiAhYWN0aW9uLmVuZHBvaW50KSB7XG4gICAgICAgIHByb21pc2UgPSByZXNvbHZlUHJvbWlzZShwcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBpZiAodGhyb3R0bGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRocm90dGxlKGtleSwgZGVmZXJlZEZldGNoLCBjcmVhdGVkQXQpXG4gICAgICAgIC50aGVuKGRhdGEgPT4gcmVzb2x2ZShkYXRhKSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGVmZXJlZEZldGNoKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBtaWRkbGV3YXJlIGludGVyY2VwdHMgYSByZWNlaXZlIGFjdGlvbi5cbiAgICpcbiAgICogV2lsbCByZXNvbHZlIHRoZSBwcm9taXNlIGFzc29jaWF0ZWQgd2l0aCByZWNlaXZlIGtleS5cbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVSZWNlaXZlKGFjdGlvbjogUmVjZWl2ZUFjdGlvbikge1xuICAgIC8vIHRoaXMgY2FuIHN0aWxsIHR1cm4gb3V0IHRvIGJlIHVudHJ1ZSBzaW5jZSB0aGlzIGlzIGFzeW5jXG4gICAgaWYgKGFjdGlvbi5tZXRhLmtleSBpbiB0aGlzLmZldGNoZWQpIHtcbiAgICAgIGxldCBwcm9taXNlSGFuZGxlcjogKHZhbHVlPzogYW55KSA9PiB2b2lkO1xuICAgICAgaWYgKGFjdGlvbi5lcnJvcikge1xuICAgICAgICBwcm9taXNlSGFuZGxlciA9IHRoaXMucmVqZWN0b3JzW2FjdGlvbi5tZXRhLmtleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9taXNlSGFuZGxlciA9IHRoaXMucmVzb2x2ZXJzW2FjdGlvbi5tZXRhLmtleV07XG4gICAgICB9XG4gICAgICBwcm9taXNlSGFuZGxlcihhY3Rpb24ucGF5bG9hZCk7XG4gICAgICAvLyBzaW5jZSB3ZSdyZSByZXNvbHZlZCB3ZSBubyBsb25nZXIgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoaXMgcHJvbWlzZVxuICAgICAgdGhpcy5jbGVhcihhY3Rpb24ubWV0YS5rZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBdHRhY2hlcyBOZXR3b3JrTWFuYWdlciB0byBzdG9yZVxuICAgKlxuICAgKiBJbnRlcmNlcHRzICdyZXN0LWhvb2tzL2ZldGNoJyBhY3Rpb25zIHRvIHN0YXJ0IHJlcXVlc3RzLlxuICAgKlxuICAgKiBSZXNvbHZlL3JlamVjdHMgYSByZXF1ZXN0IHdoZW4gbWF0Y2hpbmcgJ3Jlc3QtaG9va3MvcmVjZWl2ZScgZXZlbnRcbiAgICogaXMgc2Vlbi5cbiAgICovXG4gIGdldE1pZGRsZXdhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWlkZGxld2FyZTtcbiAgfVxuXG4gIC8qKiBFbnN1cmVzIG9ubHkgb25lIHJlcXVlc3QgZm9yIGEgZ2l2ZW4ga2V5IGlzIGluIGZsaWdodCBhdCBhbnkgdGltZVxuICAgKlxuICAgKiBVc2VzIGtleSB0byBlaXRoZXIgcmV0cmlldmUgaW4tZmxpZ2h0IHByb21pc2UsIG9yIGlmIG5vdFxuICAgKiBjcmVhdGUgYSBuZXcgcHJvbWlzZSBhbmQgY2FsbCBmZXRjaC5cbiAgICpcbiAgICogTm90ZTogVGhlIG5ldyBwcm9taXNlIGlzIG5vdCBhY3R1YWxseSB0aWVkIHRvIGZldGNoIGF0IGFsbCxcbiAgICogYnV0IGlzIHJlc29sdmVkIHdoZW4gdGhlIGV4cGVjdGVkICdyZWNpZXZlJyBhY3Rpb24gaXMgcHJvY2Vzc2VkLlxuICAgKiBUaGlzIGVuc3VyZXMgcHJvbWlzZXMgYXJlIHJlc29sdmVkIG9ubHkgb25jZSB0aGVpciBkYXRhIGlzIHByb2Nlc3NlZFxuICAgKiBieSB0aGUgcmVkdWNlci5cbiAgICovXG4gIHByb3RlY3RlZCB0aHJvdHRsZShcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmZXRjaDogKCkgPT4gUHJvbWlzZTxhbnk+LFxuICAgIGNyZWF0ZWRBdDogbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBsYXN0UmVzZXQgPSB0aGlzLmdldExhc3RSZXNldCgpO1xuICAgIC8vIHdlJ3JlIGFscmVhZHkgZmV0Y2hpbmcgc28gcmV1c2UgdGhlIHByb21pc2VcbiAgICAvLyBmZXRjaGVzIGFmdGVyIHJlc2V0IGRvIG5vdCBjb3VudFxuICAgIGlmIChrZXkgaW4gdGhpcy5mZXRjaGVkICYmIHRoaXMuZmV0Y2hlZEF0W2tleV0gPiBsYXN0UmVzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmZldGNoZWRba2V5XTtcbiAgICB9XG5cbiAgICB0aGlzLmZldGNoZWRba2V5XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXJzW2tleV0gPSByZXNvbHZlO1xuICAgICAgdGhpcy5yZWplY3RvcnNba2V5XSA9IHJlamVjdDtcbiAgICB9KTtcbiAgICB0aGlzLmZldGNoZWRBdFtrZXldID0gY3JlYXRlZEF0O1xuXG4gICAgLy8gc2luY2Ugb3VyIHJlYWwgcHJvbWlzZSBpcyByZXNvbHZlZCB2aWEgdGhlIHdyYXBSZWR1Y2VyKCksXG4gICAgLy8gd2Ugc2hvdWxkIGp1c3Qgc3RvcCBhbGwgZXJyb3JzIGhlcmUuXG4gICAgLy8gVE9ETzogZGVjb3VwbGUgdGhpcyBmcm9tIHVzZUZldGNoZXIoKSAodGhhdCdzIHdoYXQncyBkaXNwYXRjaGluZyB0aGUgZXJyb3IgdGhlIHJlc29sdmVzIGluIGhlcmUpXG4gICAgUklDKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBmZXRjaCgpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgfSxcbiAgICAgIHsgdGltZW91dDogNTAwIH0sXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmZldGNoZWRba2V5XTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLEVBQUVDLFVBQVUsRUFBRUMsVUFBVSxRQUFRLG1CQUFtQjtBQUNwRSxPQUFPQyxVQUFVLE1BQU0sNkJBQTZCO0FBQ3BELFNBQVNDLFlBQVksUUFBUSxnQkFBZ0I7QUFDN0MsU0FDRUMsYUFBYSxFQUNiQyxrQkFBa0IsUUFDYixrQ0FBa0M7QUFDekMsT0FBT0MsR0FBRyxNQUFNLGlCQUFpQjtBQVdqQyxPQUFPLE1BQU1DLFVBQVUsU0FBU0MsS0FBSyxDQUFDO0VBR3BDQyxXQUFXLEdBQUc7SUFDWixLQUFLLENBQUMsc0JBQXNCLENBQUM7SUFBQyxLQUhoQ0MsSUFBSSxHQUFHLFlBQVk7RUFJbkI7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE1BQU1DLGNBQWMsQ0FBb0I7RUFZckRGLFdBQVcsQ0FBQ0csZ0JBQWdCLEdBQUcsS0FBSyxFQUFFQyxpQkFBaUIsR0FBRyxJQUFJLEVBQUU7SUFBQSxLQVh0REMsT0FBTyxHQUFrQ0MsTUFBTSxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQUEsS0FDNURDLFNBQVMs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 |
import { ExpiryStatus } from '@rest-hooks/normalizr'; | ||
import { denormalize, isEntity, WeakListMap } from '@rest-hooks/normalizr'; | ||
import { denormalize, isEntity, WeakEntityMap } from '@rest-hooks/normalizr'; | ||
import { inferResults } from '@rest-hooks/normalizr'; | ||
@@ -136,7 +136,7 @@ import createFetch from './createFetch.js'; | ||
} | ||
if (isActive && !this.globalCache.results[key]) this.globalCache.results[key] = new WeakListMap(); | ||
if (isActive && !this.globalCache.results[key]) this.globalCache.results[key] = new WeakEntityMap(); | ||
// second argument is false if any entities are missing | ||
// eslint-disable-next-line prefer-const | ||
const [data, found, suspend, resolvedEntities] = denormalize(results, schema, state.entities, this.globalCache.entities, isActive ? this.globalCache.results[key] : undefined); | ||
const [data, found, suspend, entityPaths] = denormalize(results, schema, state.entities, this.globalCache.entities, isActive ? this.globalCache.results[key] : undefined); | ||
@@ -147,9 +147,15 @@ // fallback to entity expiry time | ||
if (found) { | ||
const entityMeta = state.entityMeta; | ||
// oldest entity dictates age | ||
expiresAt = Infinity; | ||
// using Object.keys ensures we don't hit `toString` type members | ||
Object.entries(resolvedEntities).forEach(([key, entities]) => Object.keys(entities).forEach(pk => { | ||
var _state$entityMeta$key, _state$entityMeta$key2, _state$entityMeta$key3; | ||
expiresAt = Math.min(expiresAt, (_state$entityMeta$key = (_state$entityMeta$key2 = state.entityMeta[key]) == null ? void 0 : (_state$entityMeta$key3 = _state$entityMeta$key2[pk]) == null ? void 0 : _state$entityMeta$key3.expiresAt) != null ? _state$entityMeta$key : Infinity); | ||
})); | ||
expiresAt = entityPaths.reduce((expiresAt, { | ||
pk, | ||
key | ||
}) => { | ||
var _entityMeta$key$pk$ex, _entityMeta$key, _entityMeta$key$pk; | ||
return Math.min(expiresAt, (_entityMeta$key$pk$ex = (_entityMeta$key = entityMeta[key]) == null ? void 0 : (_entityMeta$key$pk = _entityMeta$key[pk]) == null ? void 0 : _entityMeta$key$pk.expiresAt) != null ? _entityMeta$key$pk$ex : Infinity); | ||
}, Infinity); | ||
/*expiresAt = entityPaths | ||
.map(({ pk, key }) => entityMeta[key]?.[pk]?.expiresAt) | ||
.filter(a => a) | ||
.reduce((a, b) => Math.min(a, b), Infinity); Alternative method - is it faster?*/ | ||
} else { | ||
@@ -221,2 +227,2 @@ expiresAt = 0; | ||
} | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHBpcnlTdGF0dXMiLCJkZW5vcm1hbGl6ZSIsImlzRW50aXR5IiwiV2Vha0xpc3RNYXAiLCJpbmZlclJlc3VsdHMiLCJjcmVhdGVGZXRjaCIsImNyZWF0ZUludmFsaWRhdGUiLCJjcmVhdGVJbnZhbGlkYXRlQWxsIiwiY3JlYXRlUmVjZWl2ZSIsImNyZWF0ZVJlc2V0IiwiY3JlYXRlVW5zdWJzY3JpcHRpb24iLCJjcmVhdGVTdWJzY3JpcHRpb24iLCJpbml0aWFsU3RhdGUiLCJzZWxlY3RNZXRhIiwidW5zZXREaXNwYXRjaCIsImFjdGlvbiIsIkVycm9yIiwidW5zZXRTdGF0ZSIsIkNvbnRyb2xsZXIiLCJjb25zdHJ1Y3RvciIsImRpc3BhdGNoIiwiZ2V0U3RhdGUiLCJnbG9iYWxDYWNoZSIsImVudGl0aWVzIiwicmVzdWx0cyIsImZldGNoIiwiZW5kcG9pbnQiLCJhcmdzIiwibWV0YSIsInByb21pc2UiLCJpbnZhbGlkYXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJpbnZhbGlkYXRlQWxsIiwib3B0aW9ucyIsImtleSIsInRlc3RLZXkiLCJyZXNldEVudGlyZVN0b3JlIiwic2V0UmVzcG9uc2UiLCJyZXN0IiwicmVzcG9uc2UiLCJsZW5ndGgiLCJzbGljZSIsInJlY2VpdmUiLCJzZXRFcnJvciIsImVycm9yIiwicmVjZWl2ZUVycm9yIiwic3Vic2NyaWJlIiwidW5zdWJzY3JpYmUiLCJzbmFwc2hvdCIsInN0YXRlIiwiZmV0Y2hlZEF0IiwiU25hcHNob3QiLCJnZXRFcnJvciIsInVuZGVmaW5lZCIsImVycm9yUG9saWN5IiwiZ2V0UmVzcG9uc2UiLCJpc0FjdGl2ZSIsImNhY2hlUmVzdWx0cyIsInNjaGVtYSIsImV4cGlyZXNBdCIsImdldFJlc3VsdHMiLCJpbmRleGVzIiwic2NoZW1hSGFzRW50aXR5IiwiZGF0YSIsImV4cGlyeVN0YXR1cyIsImludmFsaWRhdGVkIiwiSW52YWxpZCIsImludmFsaWRJZlN0YWxlIiwiVmFsaWQiLCJJbnZhbGlkSWZTdGFsZSIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsIkFycmF5IiwiaXNBcnJheSIsImZvdW5kIiwic3VzcGVuZCIsInJlc29sdmVkRW50aXRpZXMiLCJJbmZpbml0eSIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwia2V5cyIsInBrIiwiTWF0aCIsIm1pbiIsImVudGl0eU1ldGEiLCJuZXN0ZWRTY2hlbWEiLCJ2YWx1ZXMiLCJzb21lIiwieCIsImNvbnRyb2xsZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJvbGxlci9Db250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgRW5kcG9pbnRJbnRlcmZhY2UsXG4gIEZldGNoRnVuY3Rpb24sXG4gIFJlc29sdmVUeXBlLFxuICBEZW5vcm1hbGl6ZU51bGxhYmxlLFxuICBFbnRpdHlUYWJsZSxcbn0gZnJvbSAnQHJlc3QtaG9va3Mvbm9ybWFsaXpyJztcbmltcG9ydCB7IEV4cGlyeVN0YXR1cyB9IGZyb20gJ0ByZXN0LWhvb2tzL25vcm1hbGl6cic7XG5pbXBvcnQge1xuICBFcnJvclR5cGVzLFxuICBTbmFwc2hvdEludGVyZmFjZSxcbiAgZGVub3JtYWxpemUsXG4gIERlbm9ybWFsaXplQ2FjaGUsXG4gIGlzRW50aXR5LFxuICBTY2hlbWEsXG4gIFdlYWtMaXN0TWFwLFxufSBmcm9tICdAcmVzdC1ob29rcy9ub3JtYWxpenInO1xuaW1wb3J0IHsgaW5mZXJSZXN1bHRzIH0gZnJvbSAnQHJlc3QtaG9va3Mvbm9ybWFsaXpyJztcblxuaW1wb3J0IGNyZWF0ZUZldGNoIGZyb20gJy4vY3JlYXRlRmV0Y2guanMnO1xuaW1wb3J0IGNyZWF0ZUludmFsaWRhdGUgZnJvbSAnLi9jcmVhdGVJbnZhbGlkYXRlLmpzJztcbmltcG9ydCBjcmVhdGVJbnZhbGlkYXRlQWxsIGZyb20gJy4vY3JlYXRlSW52YWxpZGF0ZUFsbC5qcyc7XG5pbXBvcnQgY3JlYXRlUmVjZWl2ZSBmcm9tICcuL2NyZWF0ZVJlY2VpdmUuanMnO1xuaW1wb3J0IGNyZWF0ZVJlc2V0IGZyb20gJy4vY3JlYXRlUmVzZXQuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlVW5zdWJzY3JpcHRpb24sXG4gIGNyZWF0ZVN1YnNjcmlwdGlvbixcbn0gZnJvbSAnLi9jcmVhdGVTdWJzY3JpcHRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBDb21wYXRpYmxlQWN0aW9uVHlwZXMgfSBmcm9tICcuLi9jb21wYXRpYmxlQWN0aW9ucy5qcyc7XG5pbXBvcnQgeyBpbml0aWFsU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9yZWR1Y2VyL2NyZWF0ZVJlZHVjZXIuanMnO1xuaW1wb3J0IHNlbGVjdE1ldGEgZnJvbSAnLi4vc3RhdGUvc2VsZWN0TWV0YS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEFjdGlvblR5cGVzIGFzIEJyb2FkQWN0aW9uVHlwZXMsXG4gIENvbWJpbmVkQWN0aW9uVHlwZXMsXG4gIGxlZ2FjeUFjdGlvbnMsXG4gIFN0YXRlLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIEdlbmVyaWNEaXNwYXRjaCA9ICh2YWx1ZTogYW55KSA9PiBQcm9taXNlPHZvaWQ+O1xuZXhwb3J0IHR5cGUgQ29tcGF0aWJsZURpc3BhdGNoID0gKHZhbHVlOiBDb21iaW5lZEFjdGlvblR5cGVzKSA9PiBQcm9taXNlPHZvaWQ+O1xudHlwZSBQcmV2aW91c0Rpc3BhdGNoID0gKHZhbHVlOiBCcm9hZEFjdGlvblR5cGVzKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5pbnRlcmZhY2UgQ29uc3RydWN0b3JQcm9wczxEIGV4dGVuZHMgR2VuZXJpY0Rpc3BhdGNoID0gQ29tcGF0aWJsZURpc3BhdGNoPiB7XG4gIGRpc3BhdGNoPzogRDtcbiAgZ2V0U3RhdGU/OiAoKSA9PiBTdGF0ZTx1bmtub3duPjtcbiAgZ2xvYmFsQ2FjaGU/OiBEZW5vcm1hbGl6ZUNhY2hlO1xufVxuXG5jb25zdCB1bnNldERpc3BhdGNoID0gKGFjdGlvbjogdW5rbm93bik6IFByb21pc2U8dm9pZD4gPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERpc3BhdGNoaW5nIHdoaWxlIGNvbnN0cnVjdGluZyB5b3VyIG1pZGRsZXdhcmUgaXMgbm90IGFsbG93ZWQuIGAgK1xuICAgICAgYE90aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC5gLFxuICApO1xufTtcbmNvbnN0IHVuc2V0U3RhdGUgPSAoKTogU3RhdGU8dW5rbm93bj4gPT4ge1xuICAvLyBUaGlzIGlzIG9ubHkgdGhlIHZhbHVlIHVudGlsIGl0IGlzIHNldCBieSB0aGUgQ2FjaGVQcm92aWRlclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gaW5pdGlhbFN0YXRlO1xufTtcblxuLyoqXG4gKiBJbXBlcmF0aXZlIGNvbnRyb2wgb2YgUmVzdCBIb29rcyBzdG9yZVxuICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRyb2xsZXI8XG4gIEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBDb21wYXRpYmxlRGlzcGF0Y2gsXG4+IHtcbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uIHRvIFJlc3QgSG9va3MgcmVkdWNlci5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2Rpc3BhdGNoXG4gICAqL1xuICBkZWNsYXJlIHJlYWRvbmx5IGRpc3BhdGNoOiBEO1xuICAvKipcbiAgICogR2V0cyB0aGUgbGF0ZXN0IHN0YXRlIHNuYXBzaG90IHRoYXQgaXMgZnVsbHkgY29tbWl0dGVkLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGltcGVyYXRpdmUgdXNlLWNhc2VzIGxpa2UgZXZlbnQgaGFuZGxlcnMuXG4gICAqIFRoaXMgc2hvdWxkICpub3QqIGJlIHVzZWQgdG8gcmVuZGVyOyBpbnN0ZWFkIHVzZVN1c3BlbnNlKCkgb3IgdXNlQ2FjaGUoKVxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0U3RhdGVcbiAgICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgZ2V0U3RhdGU6ICgpID0+IFN0YXRlPHVua25vd24+O1xuICBkZWNsYXJlIHJlYWRvbmx5IGdsb2JhbENhY2hlOiBEZW5vcm1hbGl6ZUNhY2hlO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBkaXNwYXRjaCA9IHVuc2V0RGlzcGF0Y2ggYXMgYW55LFxuICAgIGdldFN0YXRlID0gdW5zZXRTdGF0ZSxcbiAgICBnbG9iYWxDYWNoZSA9IHtcbiAgICAgIGVudGl0aWVzOiB7fSxcbiAgICAgIHJlc3VsdHM6IHt9LFxuICAgIH0sXG4gIH06IENvbnN0cnVjdG9yUHJvcHM8RD4gPSB7fSkge1xuICAgIHRoaXMuZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbiAgICB0aGlzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG4gICAgdGhpcy5nbG9iYWxDYWNoZSA9IGdsb2JhbENhY2hlO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBBY3Rpb24gRGlzcGF0Y2hlcnMgKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBlbmRwb2ludCB3aXRoIGdpdmVuIGFyZ3MsIHVwZGF0aW5nIHRoZSBSZXN0IEhvb2tzIGNhY2hlIHdpdGggdGhlIHJlc3BvbnNlIG9yIGVycm9yIHVwb24gY29tcGxldGlvbi5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2ZldGNoXG4gICAqL1xuICBmZXRjaCA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7IHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT4gfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKTogUmV0dXJuVHlwZTxFPiA9PiB7XG4gICAgY29uc3QgYWN0aW9uID0gY3JlYXRlRmV0Y2goZW5kcG9pbnQsIHtcbiAgICAgIGFyZ3MsXG4gICAgfSk7XG4gICAgdGhpcy5kaXNwYXRjaChhY3Rpb24pO1xuXG4gICAgcmV0dXJuIGFjdGlvbi5tZXRhLnByb21pc2UgYXMgUmV0dXJuVHlwZTxFPjtcbiAgfTtcblxuICAvKipcbiAgICogRm9yY2VzIHJlZmV0Y2hpbmcgYW5kIHN1c3BlbnNlIG9uIHVzZVN1c3BlbnNlIHdpdGggdGhlIHNhbWUgRW5kcG9pbnQgYW5kIHBhcmFtZXRlcnMuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNpbnZhbGlkYXRlXG4gICAqL1xuICBpbnZhbGlkYXRlID0gPEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZT4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IFByb21pc2U8dm9pZD4gPT5cbiAgICBhcmdzWzBdICE9PSBudWxsXG4gICAgICA/IHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICAgY3JlYXRlSW52YWxpZGF0ZShlbmRwb2ludCwge1xuICAgICAgICAgICAgYXJnczogYXJncyBhcyByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqXG4gICAqIEZvcmNlcyByZWZldGNoaW5nIGFuZCBzdXNwZW5zZSBvbiB1c2VTdXNwZW5zZSBvbiBhbGwgbWF0Y2hpbmcgZW5kcG9pbnQgcmVzdWx0IGtleXMuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNpbnZhbGlkYXRlQWxsXG4gICAqL1xuICBpbnZhbGlkYXRlQWxsID0gKG9wdGlvbnM6IHsgdGVzdEtleTogKGtleTogc3RyaW5nKSA9PiBib29sZWFuIH0pID0+XG4gICAgdGhpcy5kaXNwYXRjaChjcmVhdGVJbnZhbGlkYXRlQWxsKChrZXk6IHN0cmluZykgPT4gb3B0aW9ucy50ZXN0S2V5KGtleSkpKTtcblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBlbnRpcmUgUmVzdCBIb29rcyBjYWNoZS4gQWxsIGluZmxpZ2h0IHJlcXVlc3RzIHdpbGwgbm90IHJlc29sdmUuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNyZXNldEVudGlyZVN0b3JlXG4gICAqL1xuICByZXNldEVudGlyZVN0b3JlID0gKCk6IFByb21pc2U8dm9pZD4gPT4gdGhpcy5kaXNwYXRjaChjcmVhdGVSZXNldCgpKTtcblxuICAvKipcbiAgICogU3RvcmVzIHJlc3BvbnNlIGluIGNhY2hlIGZvciBnaXZlbiBFbmRwb2ludCBhbmQgYXJncy5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldFxuICAgKi9cbiAgc2V0UmVzcG9uc2UgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgICAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbiAgICB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+LCBhbnldXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNvbHZlVHlwZTxFPiA9IHJlc3RbcmVzdC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVSZWNlaXZlKGVuZHBvaW50LCB7XG4gICAgICBhcmdzOiByZXN0LnNsaWNlKDAsIHJlc3QubGVuZ3RoIC0gMSkgYXMgUGFyYW1ldGVyczxFPixcbiAgICAgIHJlc3BvbnNlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGFjdGlvbik7XG4gIH07XG5cbiAgLy8gVE9ETzogZGVwcmVjYXRlXG4gIC8qKlxuICAgKiBBbm90aGVyIG5hbWUgZm9yIHNldFJlc3BvbnNlXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzZXRSZXNwb25zZVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gcmVjZWl2ZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIGFueV1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdGhpcy5zZXRSZXNwb25zZShlbmRwb2ludCwgLi4ucmVzdCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0b3JlcyB0aGUgcmVzdWx0IG9mIEVuZHBvaW50IGFuZCBhcmdzIGFzIHRoZSBlcnJvciBwcm92aWRlZC5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldEVycm9yXG4gICAqL1xuICBzZXRFcnJvciA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIEVycm9yXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByZXNwb25zZTogRXJyb3IgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYWN0aW9uID0gY3JlYXRlUmVjZWl2ZShlbmRwb2ludCwge1xuICAgICAgYXJnczogcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RT4sXG4gICAgICByZXNwb25zZSxcbiAgICAgIGVycm9yOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGFjdGlvbik7XG4gIH07XG5cbiAgLy8gVE9ETzogZGVwcmVjYXRlXG4gIC8qKlxuICAgKiBBbm90aGVyIG5hbWUgZm9yIHNldEVycm9yXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzZXRFcnJvclxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gcmVjZWl2ZUVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgRXJyb3JdXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHRoaXMuc2V0RXJyb3IoZW5kcG9pbnQsIC4uLnJlc3QpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBpbmZsaWdodCBmZXRjaC4gYGZldGNoZWRBdGAgc2hvdWxkIGBmZXRjaGAncyBgY3JlYXRlZEF0YFxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjcmVzb2x2ZVxuICAgKi9cbiAgcmVzb2x2ZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgbWV0YTpcbiAgICAgIHwge1xuICAgICAgICAgIGFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XTtcbiAgICAgICAgICByZXNwb25zZTogRXJyb3I7XG4gICAgICAgICAgZmV0Y2hlZEF0OiBudW1iZXI7XG4gICAgICAgICAgZXJyb3I6IHRydWU7XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIGFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XTtcbiAgICAgICAgICByZXNwb25zZTogYW55O1xuICAgICAgICAgIGZldGNoZWRBdDogbnVtYmVyO1xuICAgICAgICAgIGVycm9yPzogZmFsc2U7XG4gICAgICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKGNyZWF0ZVJlY2VpdmUoZW5kcG9pbnQsIG1ldGEgYXMgYW55KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1hcmtzIGEgbmV3IHN1YnNjcmlwdGlvbiB0byBhIGdpdmVuIEVuZHBvaW50LlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc3Vic2NyaWJlXG4gICAqL1xuICBzdWJzY3JpYmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPEZldGNoRnVuY3Rpb24sIFNjaGVtYSB8IHVuZGVmaW5lZCwgdW5kZWZpbmVkPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIGFyZ3NbMF0gIT09IG51bGxcbiAgICAgID8gdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICBjcmVhdGVTdWJzY3JpcHRpb24oZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MgYXMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKlxuICAgKiBNYXJrcyBjb21wbGV0aW9uIG9mIHN1YnNjcmlwdGlvbiB0byBhIGdpdmVuIEVuZHBvaW50LlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjdW5zdWJzY3JpYmVcbiAgICovXG4gIHVuc3Vic2NyaWJlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZTxGZXRjaEZ1bmN0aW9uLCBTY2hlbWEgfCB1bmRlZmluZWQsIHVuZGVmaW5lZD4sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dIHwgcmVhZG9ubHkgW251bGxdXG4gICk6IFByb21pc2U8dm9pZD4gPT5cbiAgICBhcmdzWzBdICE9PSBudWxsXG4gICAgICA/IHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICAgY3JlYXRlVW5zdWJzY3JpcHRpb24oZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MgYXMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKioqKioqKioqKioqKiogTW9yZSAqKioqKioqKioqKioqKiovXG5cbiAgLyogVE9ETzpcbiAgYWJvcnQgPSA8RSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbiAgKTogUHJvbWlzZTx2b2lkPlxuICAqL1xuXG4gIHNuYXBzaG90ID0gKHN0YXRlOiBTdGF0ZTx1bmtub3duPiwgZmV0Y2hlZEF0PzogbnVtYmVyKTogU25hcHNob3RJbnRlcmZhY2UgPT4ge1xuICAgIHJldHVybiBuZXcgU25hcHNob3QodGhpcywgc3RhdGUsIGZldGNoZWRBdCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVycm9yLCBpZiBhbnksIGZvciBhIGdpdmVuIGVuZHBvaW50LiBSZXR1cm5zIHVuZGVmaW5lZCBmb3Igbm8gZXJyb3JzLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0RXJyb3JcbiAgICovXG4gIGdldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5Jz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0gfCByZWFkb25seSBbbnVsbF0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogWy4uLkFyZ3MsIFN0YXRlPHVua25vd24+XVxuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAocmVzdFswXSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXRlID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdIGFzIFN0YXRlPHVua25vd24+O1xuICAgIC8vIHRoaXMgaXMgdHlwZXNjcmlwdCBnZW5lcmljcyBicmVha2luZ1xuICAgIGNvbnN0IGFyZ3M6IGFueSA9IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEVbJ2tleSddPjtcbiAgICBjb25zdCBrZXkgPSBlbmRwb2ludC5rZXkoLi4uYXJncyk7XG5cbiAgICBjb25zdCBtZXRhID0gc2VsZWN0TWV0YShzdGF0ZSwga2V5KTtcbiAgICBjb25zdCByZXN1bHRzID0gc3RhdGUucmVzdWx0c1trZXldO1xuXG4gICAgaWYgKHJlc3VsdHMgIT09IHVuZGVmaW5lZCAmJiBtZXRhPy5lcnJvclBvbGljeSA9PT0gJ3NvZnQnKSByZXR1cm47XG5cbiAgICByZXR1cm4gbWV0YT8uZXJyb3IgYXMgYW55O1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSAoZ2xvYmFsbHkgcmVmZXJlbnRpYWxseSBzdGFibGUpIHJlc3BvbnNlIGZvciBhIGdpdmVuIGVuZHBvaW50L2FyZ3MgcGFpciBmcm9tIHN0YXRlIGdpdmVuLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZ2V0UmVzcG9uc2VcbiAgICovXG4gIGdldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5JyB8ICdzY2hlbWEnIHwgJ2ludmFsaWRJZlN0YWxlJz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0gfCByZWFkb25seSBbbnVsbF0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogWy4uLkFyZ3MsIFN0YXRlPHVua25vd24+XVxuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH0gPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdIGFzIFN0YXRlPHVua25vd24+O1xuICAgIC8vIHRoaXMgaXMgdHlwZXNjcmlwdCBnZW5lcmljcyBicmVha2luZ1xuICAgIGNvbnN0IGFyZ3M6IGFueSA9IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEVbJ2tleSddPjtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IGFyZ3MubGVuZ3RoICE9PSAxIHx8IGFyZ3NbMF0gIT09IG51bGw7XG4gICAgY29uc3Qga2V5ID0gaXNBY3RpdmUgPyBlbmRwb2ludC5rZXkoLi4uYXJncykgOiAnJztcbiAgICBjb25zdCBjYWNoZVJlc3VsdHMgPSBpc0FjdGl2ZSAmJiBzdGF0ZS5yZXN1bHRzW2tleV07XG4gICAgY29uc3Qgc2NoZW1hID0gZW5kcG9pbnQuc2NoZW1hO1xuICAgIGNvbnN0IG1ldGEgPSBzZWxlY3RNZXRhKHN0YXRlLCBrZXkpO1xuICAgIGxldCBleHBpcmVzQXQgPSBtZXRhPy5leHBpcmVzQXQ7XG5cbiAgICBjb25zdCByZXN1bHRzID0gdGhpcy5nZXRSZXN1bHRzKFxuICAgICAgZW5kcG9pbnQuc2NoZW1hLFxuICAgICAgY2FjaGVSZXN1bHRzLFxuICAgICAgYXJncyxcbiAgICAgIHN0YXRlLmluZGV4ZXMsXG4gICAgICBzdGF0ZS5lbnRpdGllcyxcbiAgICApO1xuXG4gICAgaWYgKCFlbmRwb2ludC5zY2hlbWEgfHwgIXNjaGVtYUhhc0VudGl0eShlbmRwb2ludC5zY2hlbWEpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiByZXN1bHRzLFxuICAgICAgICBleHBpcnlTdGF0dXM6IG1ldGE/LmludmFsaWRhdGVkXG4gICAgICAgICAgPyBFeHBpcnlTdGF0dXMuSW52YWxpZFxuICAgICAgICAgIDogY2FjaGVSZXN1bHRzICYmICFlbmRwb2ludC5pbnZhbGlkSWZTdGFsZVxuICAgICAgICAgID8gRXhwaXJ5U3RhdHVzLlZhbGlkXG4gICAgICAgICAgOiBFeHBpcnlTdGF0dXMuSW52YWxpZElmU3RhbGUsXG4gICAgICAgIGV4cGlyZXNBdDogZXhwaXJlc0F0IHx8IDAsXG4gICAgICB9IGFzIHtcbiAgICAgICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgICAgIGV4cGlyeVN0YXR1czogRXhwaXJ5U3RhdHVzO1xuICAgICAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIFdhcm4gdXNlcnMgd2l0aCBiYWQgY29uZmlndXJhdGlvbnNcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHNjaGVtYSAmJiBpc0VudGl0eShzY2hlbWEpKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGZldGNoIGtleSAke2tleX0gaGFzIGxpc3QgcmVzdWx0cyB3aGVuIHNpbmdsZSByZXN1bHQgaXMgZXhwZWN0ZWRgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXN1bHRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGZldGNoIGtleSAke2tleX0gaGFzIG9iamVjdCByZXN1bHRzIHdoZW4gZW50aXR5J3MgcHJpbWFyeSBrZXkgKHN0cmluZykgcmVzdWx0IGlzIGV4cGVjdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNBY3RpdmUgJiYgIXRoaXMuZ2xvYmFsQ2FjaGUucmVzdWx0c1trZXldKVxuICAgICAgdGhpcy5nbG9iYWxDYWNoZS5yZXN1bHRzW2tleV0gPSBuZXcgV2Vha0xpc3RNYXAoKTtcblxuICAgIC8vIHNlY29uZCBhcmd1bWVudCBpcyBmYWxzZSBpZiBhbnkgZW50aXRpZXMgYXJlIG1pc3NpbmdcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgY29uc3QgW2RhdGEsIGZvdW5kLCBzdXNwZW5kLCByZXNvbHZlZEVudGl0aWVzXSA9IGRlbm9ybWFsaXplKFxuICAgICAgcmVzdWx0cyxcbiAgICAgIHNjaGVtYSxcbiAgICAgIHN0YXRlLmVudGl0aWVzLFxuICAgICAgdGhpcy5nbG9iYWxDYWNoZS5lbnRpdGllcyxcbiAgICAgIGlzQWN0aXZlID8gdGhpcy5nbG9iYWxDYWNoZS5yZXN1bHRzW2tleV0gOiB1bmRlZmluZWQsXG4gICAgKSBhcyBbXG4gICAgICBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPixcbiAgICAgIGJvb2xlYW4sXG4gICAgICBib29sZWFuLFxuICAgICAgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj4sXG4gICAgXTtcblxuICAgIC8vIGZhbGxiYWNrIHRvIGVudGl0eSBleHBpcnkgdGltZVxuICAgIGlmICghZXhwaXJlc0F0KSB7XG4gICAgICAvLyBleHBpcmVzQXQgZXhpc3RhbmNlIGlzIGVxdWl2YWxlbnQgdG8gY2FjaGVSZXN1bHRzXG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgLy8gb2xkZXN0IGVudGl0eSBkaWN0YXRlcyBhZ2VcbiAgICAgICAgZXhwaXJlc0F0ID0gSW5maW5pdHk7XG4gICAgICAgIC8vIHVzaW5nIE9iamVjdC5rZXlzIGVuc3VyZXMgd2UgZG9uJ3QgaGl0IGB0b1N0cmluZ2AgdHlwZSBtZW1iZXJzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc29sdmVkRW50aXRpZXMpLmZvckVhY2goKFtrZXksIGVudGl0aWVzXSkgPT5cbiAgICAgICAgICBPYmplY3Qua2V5cyhlbnRpdGllcykuZm9yRWFjaChwayA9PiB7XG4gICAgICAgICAgICBleHBpcmVzQXQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgZXhwaXJlc0F0LFxuICAgICAgICAgICAgICBzdGF0ZS5lbnRpdHlNZXRhW2tleV0/Lltwa10/LmV4cGlyZXNBdCA/PyBJbmZpbml0eSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHBpcmVzQXQgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvY29uY2VwdHMvZXhwaXJ5LXBvbGljeSNleHBpcnktc3RhdHVzXG4gICAgLy8gd2UgZG9uJ3QgdHJhY2sgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFsZSBvciBmcmVzaCBiZWNhdXNlIHRoYXQgaXMgdGllZCB0byB0cmlnZ2VyaW5nXG4gICAgLy8gY29uZGl0aW9uc1xuICAgIGNvbnN0IGV4cGlyeVN0YXR1cyA9XG4gICAgICBtZXRhPy5pbnZhbGlkYXRlZCB8fCAoc3VzcGVuZCAmJiAhbWV0YT8uZXJyb3IpXG4gICAgICAgID8gRXhwaXJ5U3RhdHVzLkludmFsaWRcbiAgICAgICAgOiBzdXNwZW5kIHx8IGVuZHBvaW50LmludmFsaWRJZlN0YWxlIHx8ICghY2FjaGVSZXN1bHRzICYmICFmb3VuZClcbiAgICAgICAgPyBFeHBpcnlTdGF0dXMuSW52YWxpZElmU3RhbGVcbiAgICAgICAgOiBFeHBpcnlTdGF0dXMuVmFsaWQ7XG5cbiAgICByZXR1cm4geyBkYXRhLCBleHBpcnlTdGF0dXMsIGV4cGlyZXNBdCB9O1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0UmVzdWx0cyA9IChcbiAgICBzY2hlbWE6IFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICBjYWNoZVJlc3VsdHM6IGFueSxcbiAgICBhcmdzOiBhbnlbXSxcbiAgICBpbmRleGVzOiBhbnksXG4gICAgZW50aXRpZXM6IEVudGl0eVRhYmxlLFxuICApID0+IHtcbiAgICBpZiAoY2FjaGVSZXN1bHRzIHx8IHNjaGVtYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVSZXN1bHRzO1xuXG4gICAgcmV0dXJuIGluZmVyUmVzdWx0cyhzY2hlbWEsIGFyZ3MsIGluZGV4ZXMsIGVudGl0aWVzKTtcbiAgfTtcbn1cblxuLyoqIERldGVybWluZSB3aGV0aGVyIHRoZSBzY2hlbWEgaGFzIGFueSBlbnRpdGllcy5cbiAqXG4gKiBXaXRob3V0IGVudGl0aWVzLCBkZW5vcm1hbGl6YXRpb24gaXMgbm90IG5lZWRlZCwgYW5kIHJlc3VsdHMgc2hvdWxkIG5vdCBiZSBpbmZlcnJlZC5cbiAqL1xuZnVuY3Rpb24gc2NoZW1hSGFzRW50aXR5KHNjaGVtYTogU2NoZW1hKTogYm9vbGVhbiB7XG4gIGlmIChpc0VudGl0eShzY2hlbWEpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSlcbiAgICByZXR1cm4gc2NoZW1hLmxlbmd0aCAhPT0gMCAmJiBzY2hlbWFIYXNFbnRpdHkoc2NoZW1hWzBdKTtcbiAgaWYgKHNjaGVtYSAmJiAodHlwZW9mIHNjaGVtYSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHNjaGVtYSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBjb25zdCBuZXN0ZWRTY2hlbWEgPVxuICAgICAgJ3NjaGVtYScgaW4gc2NoZW1hID8gKHNjaGVtYS5zY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgU2NoZW1hPikgOiBzY2hlbWE7XG4gICAgaWYgKHR5cGVvZiBuZXN0ZWRTY2hlbWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzY2hlbWFIYXNFbnRpdHkobmVzdGVkU2NoZW1hKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobmVzdGVkU2NoZW1hKS5zb21lKHggPT4gc2NoZW1hSGFzRW50aXR5KHgpKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIHsgRXJyb3JUeXBlcyB9O1xuXG5jbGFzcyBTbmFwc2hvdDxUID0gdW5rbm93bj4gaW1wbGVtZW50cyBTbmFwc2hvdEludGVyZmFjZSB7XG4gIHByaXZhdGUgc3RhdGU6IFN0YXRlPFQ+O1xuICBwcml2YXRlIGNvbnRyb2xsZXI6IENvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGZldGNoZWRBdDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsIHN0YXRlOiBTdGF0ZTxUPiwgZmV0Y2hlZEF0ID0gMCkge1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIHRoaXMuZmV0Y2hlZEF0ID0gZmV0Y2hlZEF0O1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBEYXRhIEFjY2VzcyAqKioqKioqKioqKioqKiovXG4gIGdldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5JyB8ICdzY2hlbWEnIHwgJ2ludmFsaWRJZlN0YWxlJz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH0gPT4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0UmVzcG9uc2UoZW5kcG9pbnQsIC4uLmFyZ3MsIHRoaXMuc3RhdGUpO1xuICB9O1xuXG4gIGdldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5Jz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEVycm9yKGVuZHBvaW50LCAuLi5hcmdzLCB0aGlzLnN0YXRlKTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBT0EsU0FBU0EsWUFBWSxRQUFRLHVCQUF1QjtBQUNwRCxTQUdFQyxXQUFXLEVBRVhDLFFBQVEsRUFFUkMsV0FBVyxRQUNOLHVCQUF1QjtBQUM5QixTQUFTQyxZQUFZLFFBQVEsdUJBQXVCO0FBRXBELE9BQU9DLFdBQVcsTUFBTSxrQkFBa0I7QUFDMUMsT0FBT0MsZ0JBQWdCLE1BQU0sdUJBQXVCO0FBQ3BELE9BQU9DLG1CQUFtQixNQUFNLDBCQUEwQjtBQUMxRCxPQUFPQyxhQUFhLE1BQU0sb0JBQW9CO0FBQzlDLE9BQU9DLFdBQVcsTUFBTSxrQkFBa0I7QUFDMUMsU0FDRUMsb0JBQW9CLEVBQ3BCQyxrQkFBa0IsUUFDYix5QkFBeUI7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 | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHBpcnlTdGF0dXMiLCJkZW5vcm1hbGl6ZSIsImlzRW50aXR5IiwiV2Vha0VudGl0eU1hcCIsImluZmVyUmVzdWx0cyIsImNyZWF0ZUZldGNoIiwiY3JlYXRlSW52YWxpZGF0ZSIsImNyZWF0ZUludmFsaWRhdGVBbGwiLCJjcmVhdGVSZWNlaXZlIiwiY3JlYXRlUmVzZXQiLCJjcmVhdGVVbnN1YnNjcmlwdGlvbiIsImNyZWF0ZVN1YnNjcmlwdGlvbiIsImluaXRpYWxTdGF0ZSIsInNlbGVjdE1ldGEiLCJ1bnNldERpc3BhdGNoIiwiYWN0aW9uIiwiRXJyb3IiLCJ1bnNldFN0YXRlIiwiQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiZGlzcGF0Y2giLCJnZXRTdGF0ZSIsImdsb2JhbENhY2hlIiwiZW50aXRpZXMiLCJyZXN1bHRzIiwiZmV0Y2giLCJlbmRwb2ludCIsImFyZ3MiLCJtZXRhIiwicHJvbWlzZSIsImludmFsaWRhdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsImludmFsaWRhdGVBbGwiLCJvcHRpb25zIiwia2V5IiwidGVzdEtleSIsInJlc2V0RW50aXJlU3RvcmUiLCJzZXRSZXNwb25zZSIsInJlc3QiLCJyZXNwb25zZSIsImxlbmd0aCIsInNsaWNlIiwicmVjZWl2ZSIsInNldEVycm9yIiwiZXJyb3IiLCJyZWNlaXZlRXJyb3IiLCJzdWJzY3JpYmUiLCJ1bnN1YnNjcmliZSIsInNuYXBzaG90Iiwic3RhdGUiLCJmZXRjaGVkQXQiLCJTbmFwc2hvdCIsImdldEVycm9yIiwidW5kZWZpbmVkIiwiZXJyb3JQb2xpY3kiLCJnZXRSZXNwb25zZSIsImlzQWN0aXZlIiwiY2FjaGVSZXN1bHRzIiwic2NoZW1hIiwiZXhwaXJlc0F0IiwiZ2V0UmVzdWx0cyIsImluZGV4ZXMiLCJzY2hlbWFIYXNFbnRpdHkiLCJkYXRhIiwiZXhwaXJ5U3RhdHVzIiwiaW52YWxpZGF0ZWQiLCJJbnZhbGlkIiwiaW52YWxpZElmU3RhbGUiLCJWYWxpZCIsIkludmFsaWRJZlN0YWxlIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiQXJyYXkiLCJpc0FycmF5IiwiZm91bmQiLCJzdXNwZW5kIiwiZW50aXR5UGF0aHMiLCJlbnRpdHlNZXRhIiwicmVkdWNlIiwicGsiLCJNYXRoIiwibWluIiwiSW5maW5pdHkiLCJuZXN0ZWRTY2hlbWEiLCJPYmplY3QiLCJ2YWx1ZXMiLCJzb21lIiwieCIsImNvbnRyb2xsZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJvbGxlci9Db250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgRW5kcG9pbnRJbnRlcmZhY2UsXG4gIEZldGNoRnVuY3Rpb24sXG4gIFJlc29sdmVUeXBlLFxuICBEZW5vcm1hbGl6ZU51bGxhYmxlLFxuICBFbnRpdHlUYWJsZSxcbiAgUGF0aCxcbn0gZnJvbSAnQHJlc3QtaG9va3Mvbm9ybWFsaXpyJztcbmltcG9ydCB7IEV4cGlyeVN0YXR1cyB9IGZyb20gJ0ByZXN0LWhvb2tzL25vcm1hbGl6cic7XG5pbXBvcnQge1xuICBFcnJvclR5cGVzLFxuICBTbmFwc2hvdEludGVyZmFjZSxcbiAgZGVub3JtYWxpemUsXG4gIERlbm9ybWFsaXplQ2FjaGUsXG4gIGlzRW50aXR5LFxuICBTY2hlbWEsXG4gIFdlYWtFbnRpdHlNYXAsXG59IGZyb20gJ0ByZXN0LWhvb2tzL25vcm1hbGl6cic7XG5pbXBvcnQgeyBpbmZlclJlc3VsdHMgfSBmcm9tICdAcmVzdC1ob29rcy9ub3JtYWxpenInO1xuXG5pbXBvcnQgY3JlYXRlRmV0Y2ggZnJvbSAnLi9jcmVhdGVGZXRjaC5qcyc7XG5pbXBvcnQgY3JlYXRlSW52YWxpZGF0ZSBmcm9tICcuL2NyZWF0ZUludmFsaWRhdGUuanMnO1xuaW1wb3J0IGNyZWF0ZUludmFsaWRhdGVBbGwgZnJvbSAnLi9jcmVhdGVJbnZhbGlkYXRlQWxsLmpzJztcbmltcG9ydCBjcmVhdGVSZWNlaXZlIGZyb20gJy4vY3JlYXRlUmVjZWl2ZS5qcyc7XG5pbXBvcnQgY3JlYXRlUmVzZXQgZnJvbSAnLi9jcmVhdGVSZXNldC5qcyc7XG5pbXBvcnQge1xuICBjcmVhdGVVbnN1YnNjcmlwdGlvbixcbiAgY3JlYXRlU3Vic2NyaXB0aW9uLFxufSBmcm9tICcuL2NyZWF0ZVN1YnNjcmlwdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50VXBkYXRlRnVuY3Rpb24gfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IENvbXBhdGlibGVBY3Rpb25UeXBlcyB9IGZyb20gJy4uL2NvbXBhdGlibGVBY3Rpb25zLmpzJztcbmltcG9ydCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJy4uL3N0YXRlL3JlZHVjZXIvY3JlYXRlUmVkdWNlci5qcyc7XG5pbXBvcnQgc2VsZWN0TWV0YSBmcm9tICcuLi9zdGF0ZS9zZWxlY3RNZXRhLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQWN0aW9uVHlwZXMgYXMgQnJvYWRBY3Rpb25UeXBlcyxcbiAgQ29tYmluZWRBY3Rpb25UeXBlcyxcbiAgbGVnYWN5QWN0aW9ucyxcbiAgU3RhdGUsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgR2VuZXJpY0Rpc3BhdGNoID0gKHZhbHVlOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG5leHBvcnQgdHlwZSBDb21wYXRpYmxlRGlzcGF0Y2ggPSAodmFsdWU6IENvbWJpbmVkQWN0aW9uVHlwZXMpID0+IFByb21pc2U8dm9pZD47XG50eXBlIFByZXZpb3VzRGlzcGF0Y2ggPSAodmFsdWU6IEJyb2FkQWN0aW9uVHlwZXMpID0+IFByb21pc2U8dm9pZD47XG5cbmludGVyZmFjZSBDb25zdHJ1Y3RvclByb3BzPEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBDb21wYXRpYmxlRGlzcGF0Y2g+IHtcbiAgZGlzcGF0Y2g/OiBEO1xuICBnZXRTdGF0ZT86ICgpID0+IFN0YXRlPHVua25vd24+O1xuICBnbG9iYWxDYWNoZT86IERlbm9ybWFsaXplQ2FjaGU7XG59XG5cbmNvbnN0IHVuc2V0RGlzcGF0Y2ggPSAoYWN0aW9uOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzcGF0Y2hpbmcgd2hpbGUgY29uc3RydWN0aW5nIHlvdXIgbWlkZGxld2FyZSBpcyBub3QgYWxsb3dlZC4gYCArXG4gICAgICBgT3RoZXIgbWlkZGxld2FyZSB3b3VsZCBub3QgYmUgYXBwbGllZCB0byB0aGlzIGRpc3BhdGNoLmAsXG4gICk7XG59O1xuY29uc3QgdW5zZXRTdGF0ZSA9ICgpOiBTdGF0ZTx1bmtub3duPiA9PiB7XG4gIC8vIFRoaXMgaXMgb25seSB0aGUgdmFsdWUgdW50aWwgaXQgaXMgc2V0IGJ5IHRoZSBDYWNoZVByb3ZpZGVyXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiBpbml0aWFsU3RhdGU7XG59O1xuXG4vKipcbiAqIEltcGVyYXRpdmUgY29udHJvbCBvZiBSZXN0IEhvb2tzIHN0b3JlXG4gKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udHJvbGxlcjxcbiAgRCBleHRlbmRzIEdlbmVyaWNEaXNwYXRjaCA9IENvbXBhdGlibGVEaXNwYXRjaCxcbj4ge1xuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24gdG8gUmVzdCBIb29rcyByZWR1Y2VyLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZGlzcGF0Y2hcbiAgICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgZGlzcGF0Y2g6IEQ7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsYXRlc3Qgc3RhdGUgc25hcHNob3QgdGhhdCBpcyBmdWxseSBjb21taXR0ZWQuXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgaW1wZXJhdGl2ZSB1c2UtY2FzZXMgbGlrZSBldmVudCBoYW5kbGVycy5cbiAgICogVGhpcyBzaG91bGQgKm5vdCogYmUgdXNlZCB0byByZW5kZXI7IGluc3RlYWQgdXNlU3VzcGVuc2UoKSBvciB1c2VDYWNoZSgpXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRTdGF0ZVxuICAgKi9cbiAgZGVjbGFyZSByZWFkb25seSBnZXRTdGF0ZTogKCkgPT4gU3RhdGU8dW5rbm93bj47XG4gIGRlY2xhcmUgcmVhZG9ubHkgZ2xvYmFsQ2FjaGU6IERlbm9ybWFsaXplQ2FjaGU7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGRpc3BhdGNoID0gdW5zZXREaXNwYXRjaCBhcyBhbnksXG4gICAgZ2V0U3RhdGUgPSB1bnNldFN0YXRlLFxuICAgIGdsb2JhbENhY2hlID0ge1xuICAgICAgZW50aXRpZXM6IHt9LFxuICAgICAgcmVzdWx0czoge30sXG4gICAgfSxcbiAgfTogQ29uc3RydWN0b3JQcm9wczxEPiA9IHt9KSB7XG4gICAgdGhpcy5kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIHRoaXMuZ2V0U3RhdGUgPSBnZXRTdGF0ZTtcbiAgICB0aGlzLmdsb2JhbENhY2hlID0gZ2xvYmFsQ2FjaGU7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqIEFjdGlvbiBEaXNwYXRjaGVycyAqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGVuZHBvaW50IHdpdGggZ2l2ZW4gYXJncywgdXBkYXRpbmcgdGhlIFJlc3QgSG9va3MgY2FjaGUgd2l0aCB0aGUgcmVzcG9uc2Ugb3IgZXJyb3IgdXBvbiBjb21wbGV0aW9uLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjZmV0Y2hcbiAgICovXG4gIGZldGNoID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHsgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPiB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XVxuICApOiBSZXR1cm5UeXBlPEU+ID0+IHtcbiAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVGZXRjaChlbmRwb2ludCwge1xuICAgICAgYXJncyxcbiAgICB9KTtcbiAgICB0aGlzLmRpc3BhdGNoKGFjdGlvbik7XG5cbiAgICByZXR1cm4gYWN0aW9uLm1ldGEucHJvbWlzZSBhcyBSZXR1cm5UeXBlPEU+O1xuICB9O1xuXG4gIC8qKlxuICAgKiBGb3JjZXMgcmVmZXRjaGluZyBhbmQgc3VzcGVuc2Ugb24gdXNlU3VzcGVuc2Ugd2l0aCB0aGUgc2FtZSBFbmRwb2ludCBhbmQgcGFyYW1ldGVycy5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2ludmFsaWRhdGVcbiAgICovXG4gIGludmFsaWRhdGUgPSA8RSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIGFyZ3NbMF0gIT09IG51bGxcbiAgICAgID8gdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICBjcmVhdGVJbnZhbGlkYXRlKGVuZHBvaW50LCB7XG4gICAgICAgICAgICBhcmdzOiBhcmdzIGFzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAvKipcbiAgICogRm9yY2VzIHJlZmV0Y2hpbmcgYW5kIHN1c3BlbnNlIG9uIHVzZVN1c3BlbnNlIG9uIGFsbCBtYXRjaGluZyBlbmRwb2ludCByZXN1bHQga2V5cy5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI2ludmFsaWRhdGVBbGxcbiAgICovXG4gIGludmFsaWRhdGVBbGwgPSAob3B0aW9uczogeyB0ZXN0S2V5OiAoa2V5OiBzdHJpbmcpID0+IGJvb2xlYW4gfSkgPT5cbiAgICB0aGlzLmRpc3BhdGNoKGNyZWF0ZUludmFsaWRhdGVBbGwoKGtleTogc3RyaW5nKSA9PiBvcHRpb25zLnRlc3RLZXkoa2V5KSkpO1xuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGVudGlyZSBSZXN0IEhvb2tzIGNhY2hlLiBBbGwgaW5mbGlnaHQgcmVxdWVzdHMgd2lsbCBub3QgcmVzb2x2ZS5cbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3Jlc2V0RW50aXJlU3RvcmVcbiAgICovXG4gIHJlc2V0RW50aXJlU3RvcmUgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB0aGlzLmRpc3BhdGNoKGNyZWF0ZVJlc2V0KCkpO1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgcmVzcG9uc2UgaW4gY2FjaGUgZm9yIGdpdmVuIEVuZHBvaW50IGFuZCBhcmdzLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0XG4gICAqL1xuICBzZXRSZXNwb25zZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgICB1cGRhdGU/OiBFbmRwb2ludFVwZGF0ZUZ1bmN0aW9uPEU+O1xuICAgIH0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4ucmVzdDogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT4sIGFueV1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFJlc29sdmVUeXBlPEU+ID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGFjdGlvbiA9IGNyZWF0ZVJlY2VpdmUoZW5kcG9pbnQsIHtcbiAgICAgIGFyZ3M6IHJlc3Quc2xpY2UoMCwgcmVzdC5sZW5ndGggLSAxKSBhcyBQYXJhbWV0ZXJzPEU+LFxuICAgICAgcmVzcG9uc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goYWN0aW9uKTtcbiAgfTtcblxuICAvLyBUT0RPOiBkZXByZWNhdGVcbiAgLyoqXG4gICAqIEFub3RoZXIgbmFtZSBmb3Igc2V0UmVzcG9uc2VcbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldFJlc3BvbnNlXG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyByZWNlaXZlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgYW55XVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB0aGlzLnNldFJlc3BvbnNlKGVuZHBvaW50LCAuLi5yZXN0KTtcbiAgfTtcblxuICAvKipcbiAgICogU3RvcmVzIHRoZSByZXN1bHQgb2YgRW5kcG9pbnQgYW5kIGFyZ3MgYXMgdGhlIGVycm9yIHByb3ZpZGVkLlxuICAgKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0NvbnRyb2xsZXIjc2V0RXJyb3JcbiAgICovXG4gIHNldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPiwgRXJyb3JdXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBFcnJvciA9IHJlc3RbcmVzdC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBhY3Rpb24gPSBjcmVhdGVSZWNlaXZlKGVuZHBvaW50LCB7XG4gICAgICBhcmdzOiByZXN0LnNsaWNlKDAsIHJlc3QubGVuZ3RoIC0gMSkgYXMgUGFyYW1ldGVyczxFPixcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgZXJyb3I6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goYWN0aW9uKTtcbiAgfTtcblxuICAvLyBUT0RPOiBkZXByZWNhdGVcbiAgLyoqXG4gICAqIEFub3RoZXIgbmFtZSBmb3Igc2V0RXJyb3JcbiAgICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9Db250cm9sbGVyI3NldEVycm9yXG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyByZWNlaXZlRXJyb3IgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgICAgdXBkYXRlPzogRW5kcG9pbnRVcGRhdGVGdW5jdGlvbjxFPjtcbiAgICB9LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLnJlc3Q6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+LCBFcnJvcl1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdGhpcy5zZXRFcnJvcihlbmRwb2ludCwgLi4ucmVzdCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuIGluZmxpZ2h0IGZldGNoLiBgZmV0Y2hlZEF0YCBzaG91bGQgYGZldGNoYCdzIGBjcmVhdGVkQXRgXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNyZXNvbHZlXG4gICAqL1xuICByZXNvbHZlID0gPFxuICAgIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHtcbiAgICAgIHVwZGF0ZT86IEVuZHBvaW50VXBkYXRlRnVuY3Rpb248RT47XG4gICAgfSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICBtZXRhOlxuICAgICAgfCB7XG4gICAgICAgICAgYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dO1xuICAgICAgICAgIHJlc3BvbnNlOiBFcnJvcjtcbiAgICAgICAgICBmZXRjaGVkQXQ6IG51bWJlcjtcbiAgICAgICAgICBlcnJvcjogdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfCB7XG4gICAgICAgICAgYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dO1xuICAgICAgICAgIHJlc3BvbnNlOiBhbnk7XG4gICAgICAgICAgZmV0Y2hlZEF0OiBudW1iZXI7XG4gICAgICAgICAgZXJyb3I/OiBmYWxzZTtcbiAgICAgICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goY3JlYXRlUmVjZWl2ZShlbmRwb2ludCwgbWV0YSBhcyBhbnkpKTtcbiAgfTtcblxuICAvKipcbiAgICogTWFya3MgYSBuZXcgc3Vic2NyaXB0aW9uIHRvIGEgZ2l2ZW4gRW5kcG9pbnQuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNzdWJzY3JpYmVcbiAgICovXG4gIHN1YnNjcmliZSA9IDxcbiAgICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U8RmV0Y2hGdW5jdGlvbiwgU2NoZW1hIHwgdW5kZWZpbmVkLCB1bmRlZmluZWQ+LFxuICA+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSB8IHJlYWRvbmx5IFtudWxsXVxuICApOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgYXJnc1swXSAhPT0gbnVsbFxuICAgICAgPyB0aGlzLmRpc3BhdGNoKFxuICAgICAgICAgIGNyZWF0ZVN1YnNjcmlwdGlvbihlbmRwb2ludCwge1xuICAgICAgICAgICAgYXJnczogYXJncyBhcyByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqXG4gICAqIE1hcmtzIGNvbXBsZXRpb24gb2Ygc3Vic2NyaXB0aW9uIHRvIGEgZ2l2ZW4gRW5kcG9pbnQuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciN1bnN1YnNjcmliZVxuICAgKi9cbiAgdW5zdWJzY3JpYmUgPSA8XG4gICAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPEZldGNoRnVuY3Rpb24sIFNjaGVtYSB8IHVuZGVmaW5lZCwgdW5kZWZpbmVkPixcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbiAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgIGFyZ3NbMF0gIT09IG51bGxcbiAgICAgID8gdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICBjcmVhdGVVbnN1YnNjcmlwdGlvbihlbmRwb2ludCwge1xuICAgICAgICAgICAgYXJnczogYXJncyBhcyByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqKioqKioqKioqKioqKiBNb3JlICoqKioqKioqKioqKioqKi9cblxuICAvKiBUT0RPOlxuICBhYm9ydCA9IDxFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U+KFxuICAgIGVuZHBvaW50OiBFLFxuICAgIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XVxuICApOiBQcm9taXNlPHZvaWQ+XG4gICovXG5cbiAgc25hcHNob3QgPSAoc3RhdGU6IFN0YXRlPHVua25vd24+LCBmZXRjaGVkQXQ/OiBudW1iZXIpOiBTbmFwc2hvdEludGVyZmFjZSA9PiB7XG4gICAgcmV0dXJuIG5ldyBTbmFwc2hvdCh0aGlzLCBzdGF0ZSwgZmV0Y2hlZEF0KTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgZXJyb3IsIGlmIGFueSwgZm9yIGEgZ2l2ZW4gZW5kcG9pbnQuIFJldHVybnMgdW5kZWZpbmVkIGZvciBubyBlcnJvcnMuXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRFcnJvclxuICAgKi9cbiAgZ2V0RXJyb3IgPSA8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknPixcbiAgICBBcmdzIGV4dGVuZHMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiBbLi4uQXJncywgU3RhdGU8dW5rbm93bj5dXG4gICk6IEVycm9yVHlwZXMgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChyZXN0WzBdID09PSBudWxsKSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGUgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV0gYXMgU3RhdGU8dW5rbm93bj47XG4gICAgLy8gdGhpcyBpcyB0eXBlc2NyaXB0IGdlbmVyaWNzIGJyZWFraW5nXG4gICAgY29uc3QgYXJnczogYW55ID0gcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RVsna2V5J10+O1xuICAgIGNvbnN0IGtleSA9IGVuZHBvaW50LmtleSguLi5hcmdzKTtcblxuICAgIGNvbnN0IG1ldGEgPSBzZWxlY3RNZXRhKHN0YXRlLCBrZXkpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBzdGF0ZS5yZXN1bHRzW2tleV07XG5cbiAgICBpZiAocmVzdWx0cyAhPT0gdW5kZWZpbmVkICYmIG1ldGE/LmVycm9yUG9saWN5ID09PSAnc29mdCcpIHJldHVybjtcblxuICAgIHJldHVybiBtZXRhPy5lcnJvciBhcyBhbnk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIChnbG9iYWxseSByZWZlcmVudGlhbGx5IHN0YWJsZSkgcmVzcG9uc2UgZm9yIGEgZ2l2ZW4gZW5kcG9pbnQvYXJncyBwYWlyIGZyb20gc3RhdGUgZ2l2ZW4uXG4gICAqIEBzZWUgaHR0cHM6Ly9yZXN0aG9va3MuaW8vZG9jcy9hcGkvQ29udHJvbGxlciNnZXRSZXNwb25zZVxuICAgKi9cbiAgZ2V0UmVzcG9uc2UgPSA8XG4gICAgRSBleHRlbmRzIFBpY2s8RW5kcG9pbnRJbnRlcmZhY2UsICdrZXknIHwgJ3NjaGVtYScgfCAnaW52YWxpZElmU3RhbGUnPixcbiAgICBBcmdzIGV4dGVuZHMgcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RVsna2V5J10+XSB8IHJlYWRvbmx5IFtudWxsXSxcbiAgPihcbiAgICBlbmRwb2ludDogRSxcbiAgICAuLi5yZXN0OiBbLi4uQXJncywgU3RhdGU8dW5rbm93bj5dXG4gICk6IHtcbiAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICBleHBpcnlTdGF0dXM6IEV4cGlyeVN0YXR1cztcbiAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgfSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV0gYXMgU3RhdGU8dW5rbm93bj47XG4gICAgLy8gdGhpcyBpcyB0eXBlc2NyaXB0IGdlbmVyaWNzIGJyZWFraW5nXG4gICAgY29uc3QgYXJnczogYW55ID0gcmVzdC5zbGljZSgwLCByZXN0Lmxlbmd0aCAtIDEpIGFzIFBhcmFtZXRlcnM8RVsna2V5J10+O1xuICAgIGNvbnN0IGlzQWN0aXZlID0gYXJncy5sZW5ndGggIT09IDEgfHwgYXJnc1swXSAhPT0gbnVsbDtcbiAgICBjb25zdCBrZXkgPSBpc0FjdGl2ZSA/IGVuZHBvaW50LmtleSguLi5hcmdzKSA6ICcnO1xuICAgIGNvbnN0IGNhY2hlUmVzdWx0cyA9IGlzQWN0aXZlICYmIHN0YXRlLnJlc3VsdHNba2V5XTtcbiAgICBjb25zdCBzY2hlbWEgPSBlbmRwb2ludC5zY2hlbWE7XG4gICAgY29uc3QgbWV0YSA9IHNlbGVjdE1ldGEoc3RhdGUsIGtleSk7XG4gICAgbGV0IGV4cGlyZXNBdCA9IG1ldGE/LmV4cGlyZXNBdDtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmdldFJlc3VsdHMoXG4gICAgICBlbmRwb2ludC5zY2hlbWEsXG4gICAgICBjYWNoZVJlc3VsdHMsXG4gICAgICBhcmdzLFxuICAgICAgc3RhdGUuaW5kZXhlcyxcbiAgICAgIHN0YXRlLmVudGl0aWVzLFxuICAgICk7XG5cbiAgICBpZiAoIWVuZHBvaW50LnNjaGVtYSB8fCAhc2NoZW1hSGFzRW50aXR5KGVuZHBvaW50LnNjaGVtYSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3VsdHMsXG4gICAgICAgIGV4cGlyeVN0YXR1czogbWV0YT8uaW52YWxpZGF0ZWRcbiAgICAgICAgICA/IEV4cGlyeVN0YXR1cy5JbnZhbGlkXG4gICAgICAgICAgOiBjYWNoZVJlc3VsdHMgJiYgIWVuZHBvaW50LmludmFsaWRJZlN0YWxlXG4gICAgICAgICAgPyBFeHBpcnlTdGF0dXMuVmFsaWRcbiAgICAgICAgICA6IEV4cGlyeVN0YXR1cy5JbnZhbGlkSWZTdGFsZSxcbiAgICAgICAgZXhwaXJlc0F0OiBleHBpcmVzQXQgfHwgMCxcbiAgICAgIH0gYXMge1xuICAgICAgICBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPjtcbiAgICAgICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICAgICAgfTtcbiAgICB9XG4gICAgLy8gV2FybiB1c2VycyB3aXRoIGJhZCBjb25maWd1cmF0aW9uc1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgc2NoZW1hICYmIGlzRW50aXR5KHNjaGVtYSkpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgZmV0Y2gga2V5ICR7a2V5fSBoYXMgbGlzdCByZXN1bHRzIHdoZW4gc2luZ2xlIHJlc3VsdCBpcyBleHBlY3RlZGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlc3VsdHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgZmV0Y2gga2V5ICR7a2V5fSBoYXMgb2JqZWN0IHJlc3VsdHMgd2hlbiBlbnRpdHkncyBwcmltYXJ5IGtleSAoc3RyaW5nKSByZXN1bHQgaXMgZXhwZWN0ZWRgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0FjdGl2ZSAmJiAhdGhpcy5nbG9iYWxDYWNoZS5yZXN1bHRzW2tleV0pXG4gICAgICB0aGlzLmdsb2JhbENhY2hlLnJlc3VsdHNba2V5XSA9IG5ldyBXZWFrRW50aXR5TWFwKCk7XG5cbiAgICAvLyBzZWNvbmQgYXJndW1lbnQgaXMgZmFsc2UgaWYgYW55IGVudGl0aWVzIGFyZSBtaXNzaW5nXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGNvbnN0IFtkYXRhLCBmb3VuZCwgc3VzcGVuZCwgZW50aXR5UGF0aHNdID0gZGVub3JtYWxpemUoXG4gICAgICByZXN1bHRzLFxuICAgICAgc2NoZW1hLFxuICAgICAgc3RhdGUuZW50aXRpZXMsXG4gICAgICB0aGlzLmdsb2JhbENhY2hlLmVudGl0aWVzLFxuICAgICAgaXNBY3RpdmUgPyB0aGlzLmdsb2JhbENhY2hlLnJlc3VsdHNba2V5XSA6IHVuZGVmaW5lZCxcbiAgICApIGFzIFtEZW5vcm1hbGl6ZU51bGxhYmxlPEVbJ3NjaGVtYSddPiwgYm9vbGVhbiwgYm9vbGVhbiwgUGF0aFtdXTtcblxuICAgIC8vIGZhbGxiYWNrIHRvIGVudGl0eSBleHBpcnkgdGltZVxuICAgIGlmICghZXhwaXJlc0F0KSB7XG4gICAgICAvLyBleHBpcmVzQXQgZXhpc3RhbmNlIGlzIGVxdWl2YWxlbnQgdG8gY2FjaGVSZXN1bHRzXG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgY29uc3QgZW50aXR5TWV0YSA9IHN0YXRlLmVudGl0eU1ldGE7XG4gICAgICAgIC8vIG9sZGVzdCBlbnRpdHkgZGljdGF0ZXMgYWdlXG4gICAgICAgIGV4cGlyZXNBdCA9IGVudGl0eVBhdGhzLnJlZHVjZShcbiAgICAgICAgICAoZXhwaXJlc0F0OiBudW1iZXIsIHsgcGssIGtleSB9KSA9PlxuICAgICAgICAgICAgTWF0aC5taW4oZXhwaXJlc0F0LCBlbnRpdHlNZXRhW2tleV0/Lltwa10/LmV4cGlyZXNBdCA/PyBJbmZpbml0eSksXG4gICAgICAgICAgSW5maW5pdHksXG4gICAgICAgICk7XG4gICAgICAgIC8qZXhwaXJlc0F0ID0gZW50aXR5UGF0aHNcbiAgICAgICAgICAubWFwKCh7IHBrLCBrZXkgfSkgPT4gZW50aXR5TWV0YVtrZXldPy5bcGtdPy5leHBpcmVzQXQpXG4gICAgICAgICAgLmZpbHRlcihhID0+IGEpXG4gICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5taW4oYSwgYiksIEluZmluaXR5KTsgQWx0ZXJuYXRpdmUgbWV0aG9kIC0gaXMgaXQgZmFzdGVyPyovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHBpcmVzQXQgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvY29uY2VwdHMvZXhwaXJ5LXBvbGljeSNleHBpcnktc3RhdHVzXG4gICAgLy8gd2UgZG9uJ3QgdHJhY2sgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFsZSBvciBmcmVzaCBiZWNhdXNlIHRoYXQgaXMgdGllZCB0byB0cmlnZ2VyaW5nXG4gICAgLy8gY29uZGl0aW9uc1xuICAgIGNvbnN0IGV4cGlyeVN0YXR1cyA9XG4gICAgICBtZXRhPy5pbnZhbGlkYXRlZCB8fCAoc3VzcGVuZCAmJiAhbWV0YT8uZXJyb3IpXG4gICAgICAgID8gRXhwaXJ5U3RhdHVzLkludmFsaWRcbiAgICAgICAgOiBzdXNwZW5kIHx8IGVuZHBvaW50LmludmFsaWRJZlN0YWxlIHx8ICghY2FjaGVSZXN1bHRzICYmICFmb3VuZClcbiAgICAgICAgPyBFeHBpcnlTdGF0dXMuSW52YWxpZElmU3RhbGVcbiAgICAgICAgOiBFeHBpcnlTdGF0dXMuVmFsaWQ7XG5cbiAgICByZXR1cm4geyBkYXRhLCBleHBpcnlTdGF0dXMsIGV4cGlyZXNBdCB9O1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0UmVzdWx0cyA9IChcbiAgICBzY2hlbWE6IFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICBjYWNoZVJlc3VsdHM6IGFueSxcbiAgICBhcmdzOiBhbnlbXSxcbiAgICBpbmRleGVzOiBhbnksXG4gICAgZW50aXRpZXM6IEVudGl0eVRhYmxlLFxuICApID0+IHtcbiAgICBpZiAoY2FjaGVSZXN1bHRzIHx8IHNjaGVtYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVSZXN1bHRzO1xuXG4gICAgcmV0dXJuIGluZmVyUmVzdWx0cyhzY2hlbWEsIGFyZ3MsIGluZGV4ZXMsIGVudGl0aWVzKTtcbiAgfTtcbn1cblxuLyoqIERldGVybWluZSB3aGV0aGVyIHRoZSBzY2hlbWEgaGFzIGFueSBlbnRpdGllcy5cbiAqXG4gKiBXaXRob3V0IGVudGl0aWVzLCBkZW5vcm1hbGl6YXRpb24gaXMgbm90IG5lZWRlZCwgYW5kIHJlc3VsdHMgc2hvdWxkIG5vdCBiZSBpbmZlcnJlZC5cbiAqL1xuZnVuY3Rpb24gc2NoZW1hSGFzRW50aXR5KHNjaGVtYTogU2NoZW1hKTogYm9vbGVhbiB7XG4gIGlmIChpc0VudGl0eShzY2hlbWEpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSlcbiAgICByZXR1cm4gc2NoZW1hLmxlbmd0aCAhPT0gMCAmJiBzY2hlbWFIYXNFbnRpdHkoc2NoZW1hWzBdKTtcbiAgaWYgKHNjaGVtYSAmJiAodHlwZW9mIHNjaGVtYSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHNjaGVtYSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBjb25zdCBuZXN0ZWRTY2hlbWEgPVxuICAgICAgJ3NjaGVtYScgaW4gc2NoZW1hID8gKHNjaGVtYS5zY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgU2NoZW1hPikgOiBzY2hlbWE7XG4gICAgaWYgKHR5cGVvZiBuZXN0ZWRTY2hlbWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzY2hlbWFIYXNFbnRpdHkobmVzdGVkU2NoZW1hKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobmVzdGVkU2NoZW1hKS5zb21lKHggPT4gc2NoZW1hSGFzRW50aXR5KHgpKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIHsgRXJyb3JUeXBlcyB9O1xuXG5jbGFzcyBTbmFwc2hvdDxUID0gdW5rbm93bj4gaW1wbGVtZW50cyBTbmFwc2hvdEludGVyZmFjZSB7XG4gIHByaXZhdGUgc3RhdGU6IFN0YXRlPFQ+O1xuICBwcml2YXRlIGNvbnRyb2xsZXI6IENvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGZldGNoZWRBdDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsIHN0YXRlOiBTdGF0ZTxUPiwgZmV0Y2hlZEF0ID0gMCkge1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgIHRoaXMuZmV0Y2hlZEF0ID0gZmV0Y2hlZEF0O1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKiBEYXRhIEFjY2VzcyAqKioqKioqKioqKioqKiovXG4gIGdldFJlc3BvbnNlID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5JyB8ICdzY2hlbWEnIHwgJ2ludmFsaWRJZlN0YWxlJz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiB7XG4gICAgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gICAgZXhwaXJ5U3RhdHVzOiBFeHBpcnlTdGF0dXM7XG4gICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIH0gPT4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0UmVzcG9uc2UoZW5kcG9pbnQsIC4uLmFyZ3MsIHRoaXMuc3RhdGUpO1xuICB9O1xuXG4gIGdldEVycm9yID0gPFxuICAgIEUgZXh0ZW5kcyBQaWNrPEVuZHBvaW50SW50ZXJmYWNlLCAna2V5Jz4sXG4gICAgQXJncyBleHRlbmRzIHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEVbJ2tleSddPl0sXG4gID4oXG4gICAgZW5kcG9pbnQ6IEUsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkID0+IHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEVycm9yKGVuZHBvaW50LCAuLi5hcmdzLCB0aGlzLnN0YXRlKTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBUUEsU0FBU0EsWUFBWSxRQUFRLHVCQUF1QjtBQUNwRCxTQUdFQyxXQUFXLEVBRVhDLFFBQVEsRUFFUkMsYUFBYSxRQUNSLHVCQUF1QjtBQUM5QixTQUFTQyxZQUFZLFFBQVEsdUJBQXVCO0FBRXBELE9BQU9DLFdBQVcsTUFBTSxrQkFBa0I7QUFDMUMsT0FBT0MsZ0JBQWdCLE1BQU0sdUJBQXVCO0FBQ3BELE9BQU9DLG1CQUFtQixNQUFNLDBCQUEwQjtBQUMxRCxPQUFPQyxhQUFhLE1BQU0sb0JBQW9CO0FBQzlDLE9BQU9DLFdBQVcsTUFBTSxrQkFBa0I7QUFDMUMsU0FDRUMsb0JBQW9CLEVBQ3BCQyxrQkFBa0IsUUFDYix5QkFBeUI7QUFHaEMsU0FBU0MsWUFBWSxRQUFRLG1DQUFtQztBQUNoRSxPQUFPQyxVQUFVLE1BQU0sd0JBQXdCO0FBa0IvQyxNQUFNQyxhQUFhLEdBQUlDLE1BQWUsSUFBb0I7RUFDeEQsTUFBTSxJQUFJQyxLQUFLLENBQ1osaUVBQWdFLEdBQzlELHlEQUF3RCxDQUM1RDtBQUNILENBQUM7QUFDRCxNQUFNQyxVQUFVLEdBQUcsTUFBc0I7RUFDdkM7RUFDQTtFQUNBLE9BQU9MLFlBQVk7QUFDckIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsTUFBTU0sVUFBVSxDQUU3QjtFQUNBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0VBRUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0VBSUVDLFdBQVcsQ0FBQztJQUNWQyxRQUFRLEdBQUdOLGFBQW9CO0lBQy9CTyxRQUFRLEdBQUdKLFVBQVU7SUFDckJLLFdBQVcsR0FBRztNQUNaQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO01BQ1pDLE9BQU8sRUFBRSxDQUFDO0lBQ1o7RUFDbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQUEsS0FZN0JDLEtBQUssR0FBRyxDQUdOQyxRQUFXLEVBQ1gsR0FBR0MsSUFBaUMsS0FDbEI7TUFDbEIsTUFBTVosTUFBTSxHQUFHVixXQUFXLENBQUNxQixRQUFRLEVBQUU7UUFDbkNDO01BQ0YsQ0FBQyxDQUFDO01BQ0YsSUFBSSxDQUFDUCxRQUFRLENBQUNMLE1BQU0sQ0FBQztNQUVyQixPQUFPQSxNQUFNLENBQUNhLElBQUksQ0FBQ0MsT0FBTztJQUM1QixDQUFDO0lBQUEsS0FNREMsVUFBVSxHQUFHLENBQ1hKLFFBQVcsRUFDWCxHQUFHQyxJQUFtRCxLQUV0REEsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksR0FDWixJQUFJLENBQUNQLFFBQVEsQ0FDWGQsZ0JBQWdCLENBQUNvQixRQUFRLEVBQUU7TUFDekJDLElBQUksRUFBRUE7SUFDUixDQUFDLENBQUMsQ0FDSCxHQUNESSxPQUFPLENBQUNDLE9BQU8sRUFBRTtJQUFBLEtBTXZCQyxhQUFhLEdBQUlDLE9BQThDLElBQzdELElBQUksQ0FBQ2QsUUFBUSxDQUFDYixtQkFBbUIsQ0FBRTRCLEdBQVcsSUFBS0QsT0FBTyxDQUFDRSxPQUFPLENBQUNELEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFBQSxLQU0zRUUsZ0JBQWdCLEdBQUcsTUFBcUIsSUFBSSxDQUFDakIsUUFBUSxDQUFDWCxXQUFXLEVBQUUsQ0FBQztJQUFBLEtBTXBFNkIsV0FBVyxHQUFHLENBS1paLFFBQVcsRUFDWCxHQUFHYSxJQUFzQyxLQUN2QjtNQUNsQixNQUFNQyxRQUF3QixHQUFHRCxJQUFJLENBQUNBLElBQUksQ0FBQ0UsTUFBTSxHQUFHLENBQUMsQ0FBQztNQUN0RCxNQUFNMUIsTUFBTSxHQUFHUCxhQUFhLENBQUNrQixRQUFRLEVBQUU7UUFDckNDLElBQUksRUFBRVksSUFBSSxDQUFDRyxLQUFLLENBQUMsQ0FBQyxFQUFFSCxJQUFJLENBQUNFLE1BQU0sR0FBRyxDQUFDLENBQWtCO1FBQ3JERDtNQUNGLENBQUMsQ0FBQztNQUNGLE9BQU8sSUFBSSxDQUFDcEIsUUFBUSxDQUFDTCxNQUFNLENBQUM7SUFDOUIsQ0FBQztJQUFBLEtBTzBCNEIsT0FBTyxHQUFHLENBS25DakIsUUFBVyxFQUNYLEdBQUdhLElBQXNDLEtBQ3ZCO01BQ2xCO01BQ0EsT0FBTyxJQUFJLENBQUNELFdBQVcsQ0FBQ1osUUFBUSxFQUFFLEdBQUdhLElBQUksQ0FBQztJQUM1QyxDQUFDO0lBQUEsS0FNREssUUFBUSxHQUFHLENBS1RsQixRQUFXLEVBQ1gsR0FBR2EsSUFBd0MsS0FDekI7TUFDbEIsTUFBTUMsUUFBZSxHQUFHRCxJQUFJLENBQUNBLElBQUksQ0FBQ0UsTUFBTSxHQUFHLENBQUMsQ0FBQztNQUM3QyxNQUFNMUIsTUFBTSxHQUFHUCxhQUFhLENBQUNrQixRQUFRLEVBQUU7UUFDckNDLElBQUksRUFBRVksSUFBSSxDQUFDRyxLQUFLLENBQUMsQ0FBQyxFQUFFSCxJQUFJLENBQUNFLE1BQU0sR0FBRyxDQUFDLENBQWtCO1FBQ3JERCxRQUFRO1FBQ1JLLEtBQUssRUFBRTtNQUNULENBQUMsQ0FBQztNQUNGLE9BQU8sSUFBSSxDQUFDekIsUUFBUSxDQUFDTCxNQUFNLENBQUM7SUFDOUIsQ0FBQztJQUFBLEtBTzBCK0IsWUFBWSxHQUFHLENBS3hDcEIsUUFBVyxFQUNYLEdBQUdhLElBQXdDLEtBQ3pCO01BQ2xCO01BQ0EsT0FBTyxJQUFJLENBQUNLLFFBQVEsQ0FBQ2xCLFFBQVEsRUFBRSxHQUFHYSxJQUFJLENBQUM7SUFDekMsQ0FBQztJQUFBLEtBTURQLE9BQU8sR0FBRyxDQUtSTixRQUFXLEVBQ1hFLElBWUssS0FDYTtNQUNsQixPQUFPLElBQUksQ0FBQ1IsUUFBUSxDQUFDWixhQUFhLENBQUNrQixRQUFRLEVBQUVFLElBQUksQ0FBUSxDQUFDO0lBQzVELENBQUM7SUFBQSxLQU1EbUIsU0FBUyxHQUFHLENBR1ZyQixRQUFXLEVBQ1gsR0FBR0MsSUFBbUQsS0FFdERBLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQ1osSUFBSSxDQUFDUCxRQUFRLENBQ1hULGtCQUFrQixDQUFDZSxRQUFRLEVBQUU7TUFDM0JDLElBQUksRUFBRUE7SUFDUixDQUFDLENBQUMsQ0FDSCxHQUNESSxPQUFPLENBQUNDLE9BQU8sRUFBRTtJQUFBLEtBTXZCZ0IsV0FBVyxHQUFHLENBR1p0QixRQUFXLEVBQ1gsR0FBR0MsSUFBbUQsS0FFdERBLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQ1osSUFBSSxDQUFDUCxRQUFRLENBQ1hWLG9CQUFvQixDQUFDZ0IsUUFBUSxFQUFFO01BQzdCQyxJQUFJLEVBQUVBO0lBQ1IsQ0FBQyxDQUFDLENBQ0gsR0FDREksT0FBTyxDQUFDQyxPQUFPLEVBQUU7SUFBQSxLQVd2QmlCLFFBQVEsR0FBRyxDQUFDQyxLQUFxQixFQUFFQyxTQUFrQixLQUF3QjtNQUMzRSxPQUFPLElBQUlDLFFBQVEsQ0FBQyxJQUFJLEVBQUVGLEtBQUssRUFBRUMsU0FBUyxDQUFDO0lBQzdDLENBQUM7SUFBQSxLQU1ERSxRQUFRLEdBQUcsQ0FJVDNCLFFBQVcsRUFDWCxHQUFHYSxJQUErQixLQUNQO01BQzNCLElBQUlBLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7TUFDdEIsTUFBTVcsS0FBSyxHQUFHWCxJQUFJLENBQUNBLElBQUksQ0FBQ0UsTUFBTSxHQUFHLENBQUMsQ0FBbUI7TUFDckQ7TUFDQSxNQUFNZCxJQUFTLEdBQUdZLElBQUksQ0FBQ0csS0FBSyxDQUFDLENBQUMsRUFBRUgsSUFBSSxDQUFDRSxNQUFNLEdBQUcsQ0FBQyxDQUF5QjtNQUN4RSxNQUFNTixHQUFHLEdBQUdULFFBQVEsQ0FBQ1MsR0FBRyxDQUFDLEdBQUdSLElBQUksQ0FBQztNQUVqQyxNQUFNQyxJQUFJLEdBQUdmLFVBQVUsQ0FBQ3FDLEtBQUssRUFBRWYsR0FBRyxDQUFDO01BQ25DLE1BQU1YLE9BQU8sR0FBRzBCLEtBQUssQ0FBQzFCLE9BQU8sQ0FBQ1csR0FBRyxDQUFDO01BRWxDLElBQUlYLE9BQU8sS0FBSzhCLFNBQVMsSUFBSSxDQUFBMUIsSUFBSSxvQkFBSkEsSUFBSSxDQUFFMkIsV0FBVyxNQUFLLE1BQU0sRUFBRTtNQUUzRCxPQUFPM0IsSUFBSSxvQkFBSkEsSUFBSSxDQUFFaUIsS0FBSztJQUNwQixDQUFDO0lBQUEsS0FNRFcsV0FBVyxHQUFHLENBSVo5QixRQUFXLEVBQ1gsR0FBR2EsSUFBK0IsS0FLL0I7TUFDSCxNQUFNVyxLQUFLLEdBQUdYLElBQUksQ0FBQ0EsSUFBSSxDQUFDRSxNQUFNLEdBQUcsQ0FBQyxDQUFtQjtNQUNyRDtNQUNBLE1BQU1kLElBQVMsR0FBR1ksSUFBSSxDQUFDRyxLQUFLLENBQUMsQ0FBQyxFQUFFSCxJQUFJLENBQUNFLE1BQU0sR0FBRyxDQUFDLENBQXlCO01BQ3hFLE1BQU1nQixRQUFRLEdBQUc5QixJQUFJLENBQUNjLE1BQU0sS0FBSyxDQUFDLElBQUlkLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJO01BQ3RELE1BQU1RLEdBQUcsR0FBR3NCLFFBQVEsR0FBRy9CLFFBQVEsQ0FBQ1MsR0FBRyxDQUFDLEdBQUdSLElBQUksQ0FBQyxHQUFHLEVBQUU7TUFDakQsTUFBTStCLFlBQVksR0FBR0QsUUFBUSxJQUFJUCxLQUFLLENBQUMxQixPQUFPLENBQUNXLEdBQUcsQ0FBQztNQUNuRCxNQUFNd0IsTUFBTSxHQUFHakMsUUFBUSxDQUFDaUMsTUFBTTtNQUM5QixNQUFNL0IsSUFBSSxHQUFHZixVQUFVLENBQUNxQyxLQUFLLEVBQUVmLEdBQUcsQ0FBQztNQUNuQyxJQUFJeUIsU0FBUyxHQUFHaEMsSUFBSSxvQkFBSkEsSUFBSSxDQUFFZ0MsU0FBUztNQUUvQixNQUFNcEMsT0FBTyxHQUFHLElBQUksQ0FBQ3FDLFVBQVUsQ0FDN0JuQyxRQUFRLENBQUNpQyxNQUFNLEVBQ2ZELFlBQVksRUFDWi9CLElBQUksRUFDSnVCLEtBQUssQ0FBQ1ksT0FBTyxFQUNiWixLQUFLLENBQUMzQixRQUFRLENBQ2Y7TUFFRCxJQUFJLENBQUNHLFFBQVEsQ0FBQ2lDLE1BQU0sSUFBSSxDQUFDSSxlQUFlLENBQUNyQyxRQUFRLENBQUNpQyxNQUFNLENBQUMsRUFBRTtRQUN6RCxPQUFPO1VBQ0xLLElBQUksRUFBRXhDLE9BQU87VUFDYnlDLFlBQVksRUFBRXJDLElBQUksWUFBSkEsSUFBSSxDQUFFc0MsV0FBVyxHQUMzQmxFLFlBQVksQ0FBQ21FLE9BQU8sR0FDcEJULFlBQVksSUFBSSxDQUFDaEMsUUFBUSxDQUFDMEMsY0FBYyxHQUN4Q3BFLFlBQVksQ0FBQ3FFLEtBQUssR0FDbEJyRSxZQUFZLENBQUNzRSxjQUFjO1VBQy9CVixTQUFTLEVBQUVBLFNBQVMsSUFBSTtRQUMxQixDQUFDO01BS0g7TUFDQTtNQUNBO01BQ0EsSUFBSVcsT0FBTyxDQUFDQyxHQUFHLENBQUNDLFFBQVEsS0FBSyxZQUFZLElBQUlkLE1BQU0sSUFBSXpELFFBQVEsQ0FBQ3lELE1BQU0sQ0FBQyxFQUFFO1FBQ3ZFLElBQUllLEtBQUssQ0FBQ0MsT0FBTyxDQUFDbkQsT0FBTyxDQUFDLEVBQUU7VUFDMUIsTUFBTSxJQUFJUixLQUFLLENBQ1osYUFBWW1CLEdBQUksa0RBQWlELENBQ25FO1FBQ0g7UUFDQSxJQUFJLE9BQU9YLE9BQU8sS0FBSyxRQUFRLEVBQUU7VUFDL0IsTUFBTSxJQUFJUixLQUFLLENBQ1osYUFBWW1CLEdBQUksMkVBQTBFLENBQzVGO1FBQ0g7TUFDRjtNQUVBLElBQUlzQixRQUFRLElBQUksQ0FBQyxJQUFJLENBQUNuQyxXQUFXLENBQUNFLE9BQU8sQ0FBQ1csR0FBRyxDQUFDLEVBQzVDLElBQUksQ0FBQ2IsV0FBVyxDQUFDRSxPQUFPLENBQUNXLEdBQUcsQ0FBQyxHQUFHLElBQUloQyxhQUFhLEVBQUU7O01BRXJEO01BQ0E7TUFDQSxNQUFNLENBQUM2RCxJQUFJLEVBQUVZLEtBQUssRUFBRUMsT0FBTyxFQUFFQyxXQUFXLENBQUMsR0FBRzdFLFdBQVcsQ0FDckR1QixPQUFPLEVBQ1BtQyxNQUFNLEVBQ05ULEtBQUssQ0FBQzNCLFFBQVEsRUFDZCxJQUFJLENBQUNELFdBQVcsQ0FBQ0MsUUFBUSxFQUN6QmtDLFFBQVEsR0FBRyxJQUFJLENBQUNuQyxXQUFXLENBQUNFLE9BQU8sQ0FBQ1csR0FBRyxDQUFDLEdBQUdtQixTQUFTLENBQ1c7O01BRWpFO01BQ0EsSUFBSSxDQUFDTSxTQUFTLEVBQUU7UUFDZDtRQUNBLElBQUlnQixLQUFLLEVBQUU7VUFDVCxNQUFNRyxVQUFVLEdBQUc3QixLQUFLLENBQUM2QixVQUFVO1VBQ25DO1VBQ0FuQixTQUFTLEdBQUdrQixXQUFXLENBQUNFLE1BQU0sQ0FDNUIsQ0FBQ3BCLFNBQWlCLEVBQUU7WUFBRXFCLEVBQUU7WUFBRTlDO1VBQUksQ0FBQztZQUFBO1lBQUEsT0FDN0IrQyxJQUFJLENBQUNDLEdBQUcsQ0FBQ3ZCLFNBQVMsOENBQUVtQixVQUFVLENBQUM1QyxHQUFHLENBQUMsMkNBQWYsZ0JBQWtCOEMsRUFBRSxDQUFDLHFCQUFyQixtQkFBdUJyQixTQUFTLG9DQUFJd0IsUUFBUSxDQUFDO1VBQUEsR0FDbkVBLFFBQVEsQ0FDVDtVQUNEO0FBQ1I7QUFDQTtBQUNBO1FBQ00sQ0FBQyxNQUFNO1VBQ0x4QixTQUFTLEdBQUcsQ0FBQztRQUNmO01BQ0Y7O01BRUE7TUFDQTtNQUNBO01BQ0EsTUFBTUssWUFBWSxHQUNoQnJDLElBQUksWUFBSkEsSUFBSSxDQUFFc0MsV0FBVyxJQUFLVyxPQUFPLElBQUksRUFBQ2pELElBQUksWUFBSkEsSUFBSSxDQUFFaUIsS0FBSyxDQUFDLEdBQzFDN0MsWUFBWSxDQUFDbUUsT0FBTyxHQUNwQlUsT0FBTyxJQUFJbkQsUUFBUSxDQUFDMEMsY0FBYyxJQUFLLENBQUNWLFlBQVksSUFBSSxDQUFDa0IsS0FBTSxHQUMvRDVFLFlBQVksQ0FBQ3NFLGNBQWMsR0FDM0J0RSxZQUFZLENBQUNxRSxLQUFLO01BRXhCLE9BQU87UUFBRUwsSUFBSTtRQUFFQyxZQUFZO1FBQUVMO01BQVUsQ0FBQztJQUMxQyxDQUFDO0lBQUEsS0FFT0MsVUFBVSxHQUFHLENBQ25CRixNQUEwQixFQUMxQkQsWUFBaUIsRUFDakIvQixJQUFXLEVBQ1htQyxPQUFZLEVBQ1p2QyxRQUFxQixLQUNsQjtNQUNILElBQUltQyxZQUFZLElBQUlDLE1BQU0sS0FBS0wsU0FBUyxFQUFFLE9BQU9JLFlBQVk7TUFFN0QsT0FBT3RELFlBQVksQ0FBQ3VELE1BQU0sRUFBRWhDLElBQUksRUFBRW1DLE9BQU8sRUFBRXZDLFFBQVEsQ0FBQztJQUN0RCxDQUFDO0lBN1ZDLElBQUksQ0FBQ0gsUUFBUSxHQUFHQSxRQUFRO0lBQ3hCLElBQUksQ0FBQ0MsUUFBUSxHQUFHQSxRQUFRO0lBQ3hCLElBQUksQ0FBQ0MsV0FBVyxHQUFHQSxXQUFXO0VBQ2hDOztFQUVBOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBb1ZBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU3lDLGVBQWUsQ0FBQ0osTUFBYyxFQUFXO0VBQ2hELElBQUl6RCxRQUFRLENBQUN5RCxNQUFNLENBQUMsRUFBRSxPQUFPLElBQUk7RUFDakMsSUFBSWUsS0FBSyxDQUFDQyxPQUFPLENBQUNoQixNQUFNLENBQUMsRUFDdkIsT0FBT0EsTUFBTSxDQUFDbEIsTUFBTSxLQUFLLENBQUMsSUFBSXNCLGVBQWUsQ0FBQ0osTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzFELElBQUlBLE1BQU0sS0FBSyxPQUFPQSxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU9BLE1BQU0sS0FBSyxVQUFVLENBQUMsRUFBRTtJQUMxRSxNQUFNMEIsWUFBWSxHQUNoQixRQUFRLElBQUkxQixNQUFNLEdBQUlBLE1BQU0sQ0FBQ0EsTUFBTSxHQUE4QkEsTUFBTTtJQUN6RSxJQUFJLE9BQU8wQixZQUFZLEtBQUssVUFBVSxFQUFFO01BQ3RDLE9BQU90QixlQUFlLENBQUNzQixZQUFZLENBQUM7SUFDdEM7SUFDQSxPQUFPQyxNQUFNLENBQUNDLE1BQU0sQ0FBQ0YsWUFBWSxDQUFDLENBQUNHLElBQUksQ0FBQ0MsQ0FBQyxJQUFJMUIsZUFBZSxDQUFDMEIsQ0FBQyxDQUFDLENBQUM7RUFDbEU7RUFDQSxPQUFPLEtBQUs7QUFDZDtBQUlBLE1BQU1yQyxRQUFRLENBQTJDO0VBS3ZEakMsV0FBVyxDQUFDdUUsVUFBc0IsRUFBRXhDLEtBQWUsRUFBRUMsU0FBUyxHQUFHLENBQUMsRUFBRTtJQUFBLEtBSjVERCxLQUFLO0lBQUEsS0FDTHdDLFVBQVU7SUFBQSxLQUNUdkMsU0FBUztJQUFBLEtBU2xCSyxXQUFXLEdBQUcsQ0FJWjlCLFFBQVcsRUFDWCxHQUFHQyxJQUFVLEtBS1Y7TUFDSCxPQUFPLElBQUksQ0FBQytELFVBQVUsQ0FBQ2xDLFdBQVcsQ0FBQzlCLFFBQVEsRUFBRSxHQUFHQyxJQUFJLEVBQUUsSUFBSSxDQUFDdUIsS0FBSyxDQUFDO0lBQ25FLENBQUM7SUFBQSxLQUVERyxRQUFRLEdBQUcsQ0FJVDNCLFFBQVcsRUFDWCxHQUFHQyxJQUFVLEtBQ2M7TUFDM0IsT0FBTyxJQUFJLENBQUMrRCxVQUFVLENBQUNyQyxRQUFRLENBQUMzQixRQUFRLEVBQUUsR0FBR0MsSUFBSSxFQUFFLElBQUksQ0FBQ3VCLEtBQUssQ0FBQztJQUNoRSxDQUFDO0lBNUJDLElBQUksQ0FBQ0EsS0FBSyxHQUFHQSxLQUFLO0lBQ2xCLElBQUksQ0FBQ3dDLFVBQVUsR0FBR0EsVUFBVTtJQUM1QixJQUFJLENBQUN2QyxTQUFTLEdBQUdBLFNBQVM7RUFDNUI7O0VBRUE7QUF3QkYifQ== |
@@ -24,3 +24,3 @@ import { SET_TYPE, FETCH_TYPE, RESET_TYPE } from '../actionTypes.js'; | ||
constructor(dataExpiryLength = 60000, errorExpiryLength = 1000) { | ||
this.fetched = {}; | ||
this.fetched = Object.create(null); | ||
this.resolvers = {}; | ||
@@ -92,3 +92,3 @@ this.rejectors = {}; | ||
/* istanbul ignore next */ | ||
return action.type === FETCH_TYPE && Object.hasOwn(this.fetched, action.meta.key); | ||
return action.type === FETCH_TYPE && action.meta.key in this.fetched; | ||
} | ||
@@ -239,3 +239,3 @@ | ||
// this can still turn out to be untrue since this is async | ||
if (Object.hasOwn(this.fetched, action.meta.key)) { | ||
if (action.meta.key in this.fetched) { | ||
let promiseHandler; | ||
@@ -298,2 +298,2 @@ if (action.error) { | ||
} | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTRVRfVFlQRSIsIkZFVENIX1RZUEUiLCJSRVNFVF9UWVBFIiwiQ29udHJvbGxlciIsImluaXRpYWxTdGF0ZSIsImNyZWF0ZVJlY2VpdmUiLCJjcmVhdGVSZWNlaXZlRXJyb3IiLCJSSUMiLCJSZXNldEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJOZXR3b3JrTWFuYWdlciIsImRhdGFFeHBpcnlMZW5ndGgiLCJlcnJvckV4cGlyeUxlbmd0aCIsImZldGNoZWQiLCJyZXNvbHZlcnMiLCJyZWplY3RvcnMiLCJmZXRjaGVkQXQiLCJnZXRTdGF0ZSIsImNvbnRyb2xsZXIiLCJtaWRkbGV3YXJlIiwiZGlzcGF0Y2giLCJuZXh0IiwiYWN0aW9uIiwidHlwZSIsImhhbmRsZUZldGNoIiwibWV0YSIsIm9wdGltaXN0aWNSZXNwb25zZSIsInVuZGVmaW5lZCIsImVuZHBvaW50IiwiZ2V0T3B0aW1pc3RpY1Jlc3BvbnNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwia2V5IiwiZXJyb3IiLCJoYW5kbGVSZWNlaXZlIiwiY2xlYXJBbGwiLCJrIiwic2tpcExvZ2dpbmciLCJPYmplY3QiLCJoYXNPd24iLCJpbml0IiwiY2xlYW51cERhdGUiLCJjbGVhbnVwIiwiRGF0ZSIsIm5vdyIsImFsbFNldHRsZWQiLCJmZXRjaGVzIiwidmFsdWVzIiwibGVuZ3RoIiwiY2xlYXIiLCJjYXRjaCIsImdldExhc3RSZXNldCIsImxhc3RSZXNldCIsInZhbHVlT2YiLCJJbmZpbml0eSIsImZldGNoIiwicGF5bG9hZCIsInRocm90dGxlIiwicmVqZWN0IiwiY3JlYXRlZEF0IiwiZ2V0VGltZSIsImRlZmVyZWRGZXRjaCIsInByb21pc2UiLCJyZXNvbHZlUHJvbWlzZSIsImRhdGEiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJpc05hTiIsImNvbnNvbGUiLCJhcmdzIiwicmVzcG9uc2UiLCJvcHRpb25zIiwicHJvbWlzZUhhbmRsZXIiLCJnZXRNaWRkbGV3YXJlIiwidGltZW91dCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyL05ldHdvcmtNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNFVF9UWVBFLCBGRVRDSF9UWVBFLCBSRVNFVF9UWVBFIH0gZnJvbSAnLi4vYWN0aW9uVHlwZXMuanMnO1xuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSAnLi4vY29udHJvbGxlci9Db250cm9sbGVyLmpzJztcbmltcG9ydCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJy4uL2ludGVybmFsLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVJlY2VpdmUsXG4gIGNyZWF0ZVJlY2VpdmVFcnJvcixcbn0gZnJvbSAnLi4vc3RhdGUvbGVnYWN5LWFjdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0IFJJQyBmcm9tICcuLi9zdGF0ZS9SSUMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBGZXRjaEFjdGlvbixcbiAgUmVjZWl2ZUFjdGlvbixcbiAgTWFuYWdlcixcbiAgQWN0aW9uVHlwZXMsXG4gIE1pZGRsZXdhcmVBUEksXG4gIE1pZGRsZXdhcmUsXG4gIFN0YXRlLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBSZXNldEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBuYW1lID0gJ1Jlc2V0RXJyb3InO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdBYm9ydGVkIGR1ZSB0byBSRVNFVCcpO1xuICB9XG59XG5cbi8qKiBIYW5kbGVzIGFsbCBhc3luYyBuZXR3b3JrIGRpc3BhdGNoZXNcbiAqXG4gKiBEZWR1cGVzIGNvbmN1cnJlbnQgcmVxdWVzdHMgYnkga2VlcGluZyB0cmFjayBvZiBhbGwgZmV0Y2hlcyBpbiBmbGlnaHRcbiAqIGFuZCByZXR1cm5pbmcgZXhpc3RpbmcgcHJvbWlzZXMgZm9yIHJlcXVlc3RzIGFscmVhZHkgaW4gZmxpZ2h0LlxuICpcbiAqIEludGVyZmFjZXMgd2l0aCBzdG9yZSB2aWEgYSByZWR1eC1jb21wYXRpYmxlIG1pZGRsZXdhcmUuXG4gKlxuICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9OZXR3b3JrTWFuYWdlclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXR3b3JrTWFuYWdlciBpbXBsZW1lbnRzIE1hbmFnZXIge1xuICBwcm90ZWN0ZWQgZmV0Y2hlZDogeyBbazogc3RyaW5nXTogUHJvbWlzZTxhbnk+IH0gPSB7fTtcbiAgcHJvdGVjdGVkIHJlc29sdmVyczogeyBbazogc3RyaW5nXTogKHZhbHVlPzogYW55KSA9PiB2b2lkIH0gPSB7fTtcbiAgcHJvdGVjdGVkIHJlamVjdG9yczogeyBbazogc3RyaW5nXTogKHZhbHVlPzogYW55KSA9PiB2b2lkIH0gPSB7fTtcbiAgcHJvdGVjdGVkIGZldGNoZWRBdDogeyBbazogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgZGVjbGFyZSByZWFkb25seSBkYXRhRXhwaXJ5TGVuZ3RoOiBudW1iZXI7XG4gIGRlY2xhcmUgcmVhZG9ubHkgZXJyb3JFeHBpcnlMZW5ndGg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGRlY2xhcmUgbWlkZGxld2FyZTogTWlkZGxld2FyZTtcbiAgcHJvdGVjdGVkIGdldFN0YXRlOiAoKSA9PiBTdGF0ZTx1bmtub3duPiA9ICgpID0+IGluaXRpYWxTdGF0ZTtcbiAgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcigpO1xuICBkZWNsYXJlIGNsZWFudXBEYXRlPzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFFeHBpcnlMZW5ndGggPSA2MDAwMCwgZXJyb3JFeHBpcnlMZW5ndGggPSAxMDAwKSB7XG4gICAgdGhpcy5kYXRhRXhwaXJ5TGVuZ3RoID0gZGF0YUV4cGlyeUxlbmd0aDtcbiAgICB0aGlzLmVycm9yRXhwaXJ5TGVuZ3RoID0gZXJyb3JFeHBpcnlMZW5ndGg7XG5cbiAgICB0aGlzLm1pZGRsZXdhcmUgPSA8QyBleHRlbmRzIE1pZGRsZXdhcmVBUEk+KHtcbiAgICAgIGRpc3BhdGNoLFxuICAgICAgZ2V0U3RhdGUsXG4gICAgICBjb250cm9sbGVyLFxuICAgIH06IEMpID0+IHtcbiAgICAgIHRoaXMuZ2V0U3RhdGUgPSBnZXRTdGF0ZTtcbiAgICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgICByZXR1cm4gKG5leHQ6IENbJ2Rpc3BhdGNoJ10pOiBDWydkaXNwYXRjaCddID0+XG4gICAgICAgIChhY3Rpb24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEZFVENIX1RZUEU6XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmV0Y2goYWN0aW9uLCBkaXNwYXRjaCwgY29udHJvbGxlcik7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgY2FzZSB0aGF0IGNhdXNlcyBhbnkgc3RhdGUgY2hhbmdlXG4gICAgICAgICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIGludGVyY2VwdCBvdGhlciBmZXRjaGVzIGFzIHdlIGRvbid0IHdhbnQgdG8gdHJpZ2dlciByZWR1Y2VycyBkdXJpbmdcbiAgICAgICAgICAgICAgLy8gcmVuZGVyIC0gc28gd2UgbmVlZCB0byBzdG9wICdyZWFkb25seScgZmV0Y2hlcyB3aGljaCBjYW4gYmUgdHJpZ2dlcmVkIGluIHJlbmRlclxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgYWN0aW9uLm1ldGEub3B0aW1pc3RpY1Jlc3BvbnNlICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBhY3Rpb24uZW5kcG9pbnQ/LmdldE9wdGltaXN0aWNSZXNwb25zZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgY2FzZSBTRVRfVFlQRTpcbiAgICAgICAgICAgICAgLy8gb25seSByZWNlaXZlIGFmdGVyIG5ldyBzdGF0ZSBpcyBjb21wdXRlZFxuICAgICAgICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24ubWV0YS5rZXkgaW4gdGhpcy5mZXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAvLyBOb3RlOiBtZXRhICptdXN0KiBiZSBzZXQgYnkgcmVkdWNlciBzbyB0aGlzIHNob3VsZCBiZSBzYWZlXG4gICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZ2V0U3RhdGUoKS5tZXRhW2FjdGlvbi5tZXRhLmtleV0/LmVycm9yO1xuICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBlcnJvcnMgcmVzdWx0IGluIHN0YXRlIG1ldGEgaGF2aW5nIGVycm9yLCBzbyB3ZSBzaG91bGQgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdXNlIG9ubHkgbmV3IGFjdGlvbiB0eXBlc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJlY2VpdmUoY3JlYXRlUmVjZWl2ZUVycm9yKGVycm9yLCBhY3Rpb24ubWV0YSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSZWNlaXZlKGFjdGlvbik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgUkVTRVRfVFlQRToge1xuICAgICAgICAgICAgICBjb25zdCByZWplY3RvcnMgPSB7IC4uLnRoaXMucmVqZWN0b3JzIH07XG5cbiAgICAgICAgICAgICAgdGhpcy5jbGVhckFsbCgpO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIGV4dGVybmFsIGxpc3RlbmVycyB0byB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBoYXBwZW4gYWZ0ZXIgY29tbWl0IHNvIG91ciBvd24gcmVqZWN0b3Iga25vd3Mgbm90IHRvIGRpc3BhdGNoIGFuIGVycm9yIGJhc2VkIG9uIHRoaXNcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGsgaW4gcmVqZWN0b3JzKSB7XG4gICAgICAgICAgICAgICAgICByZWplY3RvcnNba10obmV3IFJlc2V0RXJyb3IoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gIH1cblxuICAvKiogVXNlZCBieSBEZXZ0b29sc01hbmFnZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gbG9nIGFuIGFjdGlvbiAqL1xuICBza2lwTG9nZ2luZyhhY3Rpb246IEFjdGlvblR5cGVzKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gKFxuICAgICAgYWN0aW9uLnR5cGUgPT09IEZFVENIX1RZUEUgJiYgT2JqZWN0Lmhhc093bih0aGlzLmZldGNoZWQsIGFjdGlvbi5tZXRhLmtleSlcbiAgICApO1xuICB9XG5cbiAgLyoqIE9uIG1vdW50ICovXG4gIGluaXQoKSB7XG4gICAgZGVsZXRlIHRoaXMuY2xlYW51cERhdGU7XG4gIH1cblxuICAvKiogRW5zdXJlcyBhbGwgcHJvbWlzZXMgYXJlIGNvbXBsZXRlZCBieSByZWplY3RpbmcgcmVtYWluaW5nLiAqL1xuICBjbGVhbnVwKCkge1xuICAgIC8vIGVuc3VyZSBubyBkaXNwYXRjaGVzIGFmdGVyIHVubW91bnRcbiAgICAvLyB0aGlzIG11c3QgYmUgcmV2ZXJzaWJsZSAoZG9uZSBpbiBpbml0KSBzbyB1c2VFZmZlY3QoKSByZW1haW5zIHN5bW1ldHJpY1xuICAgIHRoaXMuY2xlYW51cERhdGUgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgYWxsU2V0dGxlZCgpIHtcbiAgICBjb25zdCBmZXRjaGVzID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZldGNoZWQpO1xuICAgIGlmIChmZXRjaGVzLmxlbmd0aCkgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChmZXRjaGVzKTtcbiAgfVxuXG4gIC8qKiBDbGVhciBhbGwgcHJvbWlzZSBzdGF0ZSAqL1xuICBwcm90ZWN0ZWQgY2xlYXJBbGwoKSB7XG4gICAgZm9yIChjb25zdCBrIGluIHRoaXMucmVqZWN0b3JzKSB7XG4gICAgICB0aGlzLmNsZWFyKGspO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbGVhciBwcm9taXNlIHN0YXRlIGZvciBhIGdpdmVuIGtleSAqL1xuICBwcm90ZWN0ZWQgY2xlYXIoa2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmZldGNoZWRba2V5XS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgZGVsZXRlIHRoaXMucmVzb2x2ZXJzW2tleV07XG4gICAgZGVsZXRlIHRoaXMucmVqZWN0b3JzW2tleV07XG4gICAgZGVsZXRlIHRoaXMuZmV0Y2hlZFtrZXldO1xuICAgIGRlbGV0ZSB0aGlzLmZldGNoZWRBdFtrZXldO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldExhc3RSZXNldCgpIHtcbiAgICBpZiAodGhpcy5jbGVhbnVwRGF0ZSkgcmV0dXJuIHRoaXMuY2xlYW51cERhdGU7XG4gICAgY29uc3QgbGFzdFJlc2V0ID0gdGhpcy5jb250cm9sbGVyLmdldFN0YXRlKCkubGFzdFJlc2V0O1xuICAgIGlmIChsYXN0UmVzZXQgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbGFzdFJlc2V0LnZhbHVlT2YoKTtcbiAgICBpZiAodHlwZW9mIGxhc3RSZXNldCAhPT0gJ251bWJlcicpIHJldHVybiAtSW5maW5pdHk7XG4gICAgcmV0dXJuIGxhc3RSZXNldDtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBtaWRkbGV3YXJlIGludGVyY2VwdHMgJ3Jlc3QtaG9va3MvZmV0Y2gnIGFjdGlvbi5cbiAgICpcbiAgICogV2lsbCB0aGVuIHN0YXJ0IGEgcHJvbWlzZSBmb3IgYSBrZXkgYW5kIHBvdGVudGlhbGx5IHN0YXJ0IHRoZSBuZXR3b3JrXG4gICAqIGZldGNoLlxuICAgKlxuICAgKiBVc2VzIHRocm90dGxlIG9ubHkgd2hlbiBpbnN0cnVjdGVkIGJ5IGFjdGlvbiBtZXRhLiBUaGlzIGlzIHZhbHVhYmxlXG4gICAqIGZvciBlbnN1cmVzIG11dGF0aW9uIHJlcXVlc3RzIGFsd2F5cyBnbyB0aHJvdWdoLlxuICAgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZUZldGNoKFxuICAgIGFjdGlvbjogRmV0Y2hBY3Rpb24sXG4gICAgZGlzcGF0Y2g6IChhY3Rpb246IGFueSkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxuICApIHtcbiAgICBjb25zdCBmZXRjaCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIGNvbnN0IHsga2V5LCB0aHJvdHRsZSwgcmVzb2x2ZSwgcmVqZWN0IH0gPSBhY3Rpb24ubWV0YTtcbiAgICAvLyBUT0RPKGJyZWFraW5nKTogcmVtb3ZlIHN1cHBvcnQgZm9yIERhdGUgdHlwZSBpbiAnUmVjZWl2ZScgYWN0aW9uXG4gICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgIHR5cGVvZiBhY3Rpb24ubWV0YS5jcmVhdGVkQXQgIT09ICdudW1iZXInXG4gICAgICAgID8gYWN0aW9uLm1ldGEuY3JlYXRlZEF0LmdldFRpbWUoKVxuICAgICAgICA6IGFjdGlvbi5tZXRhLmNyZWF0ZWRBdDtcblxuICAgIGNvbnN0IGRlZmVyZWRGZXRjaCA9ICgpID0+IHtcbiAgICAgIGxldCBwcm9taXNlID0gZmV0Y2goKTtcbiAgICAgIGNvbnN0IHJlc29sdmVQcm9taXNlID0gKFxuICAgICAgICBwcm9taXNlOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IG9iamVjdCB8IG51bGw+LFxuICAgICAgKSA9PlxuICAgICAgICBwcm9taXNlXG4gICAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0pO1xuICAgICAgLy8gc2NoZWR1bGUgbm9uLXRocm90dGxlZCByZXNvbHV0aW9ucyBpbiBhIG1pY3JvdGFzayBiZWZvcmUgcmVjZWl2ZVxuICAgICAgLy8gdGhpcyBlbmFibGVzIHVzZXJzIGF3YWl0aW5nIHRoZWlyIGZldGNoIHRvIHRyaWdnZXIgYW55IHJlYWN0IHVwZGF0ZXMgbmVlZGVkIHRvIGRlYWxcbiAgICAgIC8vIHdpdGggdXBjb21pbmcgY2hhbmdlcyBiZWNhdXNlIG9mIHRoZSBmZXRjaCAoZm9yIGluc3RhbmNlIGF2b2lkaW5nIHN1c3BlbnNlIGlmIHNvbWV0aGluZyBpcyBkZWxldGVkKVxuICAgICAgaWYgKCF0aHJvdHRsZSAmJiBhY3Rpb24uZW5kcG9pbnQpIHtcbiAgICAgICAgcHJvbWlzZSA9IHJlc29sdmVQcm9taXNlKHByb21pc2UpO1xuICAgICAgfVxuICAgICAgcHJvbWlzZSA9IHByb21pc2VcbiAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgbGV0IGxhc3RSZXNldCA9IHRoaXMuZ2V0TGFzdFJlc2V0KCk7XG5cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGlzTmFOKGxhc3RSZXNldCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdzdGF0ZS5sYXN0UmVzZXQgaXMgTmFOLiBPbmx5IHBvc2l0aXZlIHRpbWVzdGFtcHMgYXJlIHZhbGlkLicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGFzdFJlc2V0ID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkb24ndCB1cGRhdGUgc3RhdGUgd2l0aCBwcm9taXNlcyBzdGFydGVkIGJlZm9yZSBsYXN0IGNsZWFyXG4gICAgICAgICAgaWYgKGNyZWF0ZWRBdCA+PSBsYXN0UmVzZXQpIHtcbiAgICAgICAgICAgIC8vIHdlIHN0aWxsIGNoZWNrIGZvciBjb250cm9sbGVyIGluIGNhc2Ugc29tZW9uZSBkaWRuJ3QgaGF2ZSB0eXBlIHByb3RlY3Rpb24gc2luY2UgdGhpcyBkaWRuJ3QgYWx3YXlzIGV4aXN0XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmVuZHBvaW50ICYmIHRoaXMuY29udHJvbGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucmVzb2x2ZShhY3Rpb24uZW5kcG9pbnQsIHtcbiAgICAgICAgICAgICAgICBhcmdzOiBhY3Rpb24ubWV0YS5hcmdzIGFzIGFueSxcbiAgICAgICAgICAgICAgICByZXNwb25zZTogZGF0YSxcbiAgICAgICAgICAgICAgICBmZXRjaGVkQXQ6IGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPKGJyZWFraW5nKTogaXMgdGhpcyBicmFuY2ggc3RpbGwgcG9zc2libGU/IHJlbW92ZSBpbiBuZXh0IG1ham9yIHVwZGF0ZVxuICAgICAgICAgICAgICAvLyBkb2VzIHRoaXMgdGhyb3cgaWYgdGhlIHJlZHVjZXIgZmFpbHM/IC0gbm8gYmVjYXVzZSByZWR1Y2VyIGlzIHdyYXBwZWQgaW4gdHJ5L2NhdGNoXG4gICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kaXNwYXRjaChcbiAgICAgICAgICAgICAgICBjcmVhdGVSZWNlaXZlKGRhdGEsIHtcbiAgICAgICAgICAgICAgICAgIC4uLmFjdGlvbi5tZXRhLFxuICAgICAgICAgICAgICAgICAgZmV0Y2hlZEF0OiBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgICBkYXRhRXhwaXJ5TGVuZ3RoOlxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24ubWV0YS5vcHRpb25zPy5kYXRhRXhwaXJ5TGVuZ3RoID8/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUV4cGlyeUxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc3QgbGFzdFJlc2V0ID0gdGhpcy5nZXRMYXN0UmVzZXQoKTtcbiAgICAgICAgICAvLyBkb24ndCB1cGRhdGUgc3RhdGUgd2l0aCBwcm9taXNlcyBzdGFydGVkIGJlZm9yZSBsYXN0IGNsZWFyXG4gICAgICAgICAgaWYgKGNyZWF0ZWRBdCA+PSBsYXN0UmVzZXQpIHtcbiAgICAgICAgICAgIGlmIChhY3Rpb24uZW5kcG9pbnQgJiYgdGhpcy5jb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5yZXNvbHZlKGFjdGlvbi5lbmRwb2ludCwge1xuICAgICAgICAgICAgICAgIGFyZ3M6IGFjdGlvbi5tZXRhLmFyZ3MgYXMgYW55LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBlcnJvcixcbiAgICAgICAgICAgICAgICBmZXRjaGVkQXQ6IGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgY3JlYXRlUmVjZWl2ZUVycm9yKGVycm9yLCB7XG4gICAgICAgICAgICAgICAgICAuLi5hY3Rpb24ubWV0YSxcbiAgICAgICAgICAgICAgICAgIGVycm9yRXhwaXJ5TGVuZ3RoOlxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24ubWV0YS5vcHRpb25zPy5lcnJvckV4cGlyeUxlbmd0aCA/P1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yRXhwaXJ5TGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgZmV0Y2hlZEF0OiBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICAgIC8vIGxlZ2FjeSBiZWhhdmlvciBzY2hlZHVsZXMgcmVzb2x1dGlvbiBhZnRlciBkaXNwYXRjaFxuICAgICAgaWYgKCF0aHJvdHRsZSAmJiAhYWN0aW9uLmVuZHBvaW50KSB7XG4gICAgICAgIHByb21pc2UgPSByZXNvbHZlUHJvbWlzZShwcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBpZiAodGhyb3R0bGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRocm90dGxlKGtleSwgZGVmZXJlZEZldGNoLCBjcmVhdGVkQXQpXG4gICAgICAgIC50aGVuKGRhdGEgPT4gcmVzb2x2ZShkYXRhKSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGVmZXJlZEZldGNoKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBtaWRkbGV3YXJlIGludGVyY2VwdHMgYSByZWNlaXZlIGFjdGlvbi5cbiAgICpcbiAgICogV2lsbCByZXNvbHZlIHRoZSBwcm9taXNlIGFzc29jaWF0ZWQgd2l0aCByZWNlaXZlIGtleS5cbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVSZWNlaXZlKGFjdGlvbjogUmVjZWl2ZUFjdGlvbikge1xuICAgIC8vIHRoaXMgY2FuIHN0aWxsIHR1cm4gb3V0IHRvIGJlIHVudHJ1ZSBzaW5jZSB0aGlzIGlzIGFzeW5jXG4gICAgaWYgKE9iamVjdC5oYXNPd24odGhpcy5mZXRjaGVkLCBhY3Rpb24ubWV0YS5rZXkpKSB7XG4gICAgICBsZXQgcHJvbWlzZUhhbmRsZXI6ICh2YWx1ZT86IGFueSkgPT4gdm9pZDtcbiAgICAgIGlmIChhY3Rpb24uZXJyb3IpIHtcbiAgICAgICAgcHJvbWlzZUhhbmRsZXIgPSB0aGlzLnJlamVjdG9yc1thY3Rpb24ubWV0YS5rZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvbWlzZUhhbmRsZXIgPSB0aGlzLnJlc29sdmVyc1thY3Rpb24ubWV0YS5rZXldO1xuICAgICAgfVxuICAgICAgcHJvbWlzZUhhbmRsZXIoYWN0aW9uLnBheWxvYWQpO1xuICAgICAgLy8gc2luY2Ugd2UncmUgcmVzb2x2ZWQgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGlzIHByb21pc2VcbiAgICAgIHRoaXMuY2xlYXIoYWN0aW9uLm1ldGEua2V5KTtcbiAgICB9XG4gIH1cblxuICAvKiogQXR0YWNoZXMgTmV0d29ya01hbmFnZXIgdG8gc3RvcmVcbiAgICpcbiAgICogSW50ZXJjZXB0cyAncmVzdC1ob29rcy9mZXRjaCcgYWN0aW9ucyB0byBzdGFydCByZXF1ZXN0cy5cbiAgICpcbiAgICogUmVzb2x2ZS9yZWplY3RzIGEgcmVxdWVzdCB3aGVuIG1hdGNoaW5nICdyZXN0LWhvb2tzL3JlY2VpdmUnIGV2ZW50XG4gICAqIGlzIHNlZW4uXG4gICAqL1xuICBnZXRNaWRkbGV3YXJlKCkge1xuICAgIHJldHVybiB0aGlzLm1pZGRsZXdhcmU7XG4gIH1cblxuICAvKiogRW5zdXJlcyBvbmx5IG9uZSByZXF1ZXN0IGZvciBhIGdpdmVuIGtleSBpcyBpbiBmbGlnaHQgYXQgYW55IHRpbWVcbiAgICpcbiAgICogVXNlcyBrZXkgdG8gZWl0aGVyIHJldHJpZXZlIGluLWZsaWdodCBwcm9taXNlLCBvciBpZiBub3RcbiAgICogY3JlYXRlIGEgbmV3IHByb21pc2UgYW5kIGNhbGwgZmV0Y2guXG4gICAqXG4gICAqIE5vdGU6IFRoZSBuZXcgcHJvbWlzZSBpcyBub3QgYWN0dWFsbHkgdGllZCB0byBmZXRjaCBhdCBhbGwsXG4gICAqIGJ1dCBpcyByZXNvbHZlZCB3aGVuIHRoZSBleHBlY3RlZCAncmVjaWV2ZScgYWN0aW9uIGlzIHByb2Nlc3NlZC5cbiAgICogVGhpcyBlbnN1cmVzIHByb21pc2VzIGFyZSByZXNvbHZlZCBvbmx5IG9uY2UgdGhlaXIgZGF0YSBpcyBwcm9jZXNzZWRcbiAgICogYnkgdGhlIHJlZHVjZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgdGhyb3R0bGUoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgZmV0Y2g6ICgpID0+IFByb21pc2U8YW55PixcbiAgICBjcmVhdGVkQXQ6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgbGFzdFJlc2V0ID0gdGhpcy5nZXRMYXN0UmVzZXQoKTtcbiAgICAvLyB3ZSdyZSBhbHJlYWR5IGZldGNoaW5nIHNvIHJldXNlIHRoZSBwcm9taXNlXG4gICAgLy8gZmV0Y2hlcyBhZnRlciByZXNldCBkbyBub3QgY291bnRcbiAgICBpZiAoa2V5IGluIHRoaXMuZmV0Y2hlZCAmJiB0aGlzLmZldGNoZWRBdFtrZXldID4gbGFzdFJlc2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5mZXRjaGVkW2tleV07XG4gICAgfVxuXG4gICAgdGhpcy5mZXRjaGVkW2tleV0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVyc1trZXldID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMucmVqZWN0b3JzW2tleV0gPSByZWplY3Q7XG4gICAgfSk7XG4gICAgdGhpcy5mZXRjaGVkQXRba2V5XSA9IGNyZWF0ZWRBdDtcblxuICAgIC8vIHNpbmNlIG91ciByZWFsIHByb21pc2UgaXMgcmVzb2x2ZWQgdmlhIHRoZSB3cmFwUmVkdWNlcigpLFxuICAgIC8vIHdlIHNob3VsZCBqdXN0IHN0b3AgYWxsIGVycm9ycyBoZXJlLlxuICAgIC8vIFRPRE86IGRlY291cGxlIHRoaXMgZnJvbSB1c2VGZXRjaGVyKCkgKHRoYXQncyB3aGF0J3MgZGlzcGF0Y2hpbmcgdGhlIGVycm9yIHRoZSByZXNvbHZlcyBpbiBoZXJlKVxuICAgIFJJQyhcbiAgICAgICgpID0+IHtcbiAgICAgICAgZmV0Y2goKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgIH0sXG4gICAgICB7IHRpbWVvdXQ6IDUwMCB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5mZXRjaGVkW2tleV07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsUUFBUSxFQUFFQyxVQUFVLEVBQUVDLFVBQVUsUUFBUSxtQkFBbUI7QUFDcEUsT0FBT0MsVUFBVSxNQUFNLDZCQUE2QjtBQUNwRCxTQUFTQyxZQUFZLFFBQVEsZ0JBQWdCO0FBQzdDLFNBQ0VDLGFBQWEsRUFDYkMsa0JBQWtCLFFBQ2Isa0NBQWtDO0FBQ3pDLE9BQU9DLEdBQUcsTUFBTSxpQkFBaUI7QUFXakMsT0FBTyxNQUFNQyxVQUFVLFNBQVNDLEtBQUssQ0FBQztFQUdwQ0MsV0FBVyxHQUFHO0lBQ1osS0FBSyxDQUFDLHNCQUFzQixDQUFDO0lBQUMsS0FIaENDLElBQUksR0FBRyxZQUFZO0VBSW5CO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxNQUFNQyxjQUFjLENBQW9CO0VBWXJERixXQUFXLENBQUNHLGdCQUFnQixHQUFHLEtBQUssRUFBRUMsaUJBQWlCLEdBQUcsSUFBSSxFQUFFO0lBQUEsS0FYdERDLE9BQU8sR0FBa0MsQ0FBQyxDQUFDO0lBQUEsS0FDM0NDLFNB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 | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTRVRfVFlQRSIsIkZFVENIX1RZUEUiLCJSRVNFVF9UWVBFIiwiQ29udHJvbGxlciIsImluaXRpYWxTdGF0ZSIsImNyZWF0ZVJlY2VpdmUiLCJjcmVhdGVSZWNlaXZlRXJyb3IiLCJSSUMiLCJSZXNldEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJOZXR3b3JrTWFuYWdlciIsImRhdGFFeHBpcnlMZW5ndGgiLCJlcnJvckV4cGlyeUxlbmd0aCIsImZldGNoZWQiLCJPYmplY3QiLCJjcmVhdGUiLCJyZXNvbHZlcnMiLCJyZWplY3RvcnMiLCJmZXRjaGVkQXQiLCJnZXRTdGF0ZSIsImNvbnRyb2xsZXIiLCJtaWRkbGV3YXJlIiwiZGlzcGF0Y2giLCJuZXh0IiwiYWN0aW9uIiwidHlwZSIsImhhbmRsZUZldGNoIiwibWV0YSIsIm9wdGltaXN0aWNSZXNwb25zZSIsInVuZGVmaW5lZCIsImVuZHBvaW50IiwiZ2V0T3B0aW1pc3RpY1Jlc3BvbnNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwia2V5IiwiZXJyb3IiLCJoYW5kbGVSZWNlaXZlIiwiY2xlYXJBbGwiLCJrIiwic2tpcExvZ2dpbmciLCJpbml0IiwiY2xlYW51cERhdGUiLCJjbGVhbnVwIiwiRGF0ZSIsIm5vdyIsImFsbFNldHRsZWQiLCJmZXRjaGVzIiwidmFsdWVzIiwibGVuZ3RoIiwiY2xlYXIiLCJjYXRjaCIsImdldExhc3RSZXNldCIsImxhc3RSZXNldCIsInZhbHVlT2YiLCJJbmZpbml0eSIsImZldGNoIiwicGF5bG9hZCIsInRocm90dGxlIiwicmVqZWN0IiwiY3JlYXRlZEF0IiwiZ2V0VGltZSIsImRlZmVyZWRGZXRjaCIsInByb21pc2UiLCJyZXNvbHZlUHJvbWlzZSIsImRhdGEiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJpc05hTiIsImNvbnNvbGUiLCJhcmdzIiwicmVzcG9uc2UiLCJvcHRpb25zIiwicHJvbWlzZUhhbmRsZXIiLCJnZXRNaWRkbGV3YXJlIiwidGltZW91dCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyL05ldHdvcmtNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNFVF9UWVBFLCBGRVRDSF9UWVBFLCBSRVNFVF9UWVBFIH0gZnJvbSAnLi4vYWN0aW9uVHlwZXMuanMnO1xuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSAnLi4vY29udHJvbGxlci9Db250cm9sbGVyLmpzJztcbmltcG9ydCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJy4uL2ludGVybmFsLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVJlY2VpdmUsXG4gIGNyZWF0ZVJlY2VpdmVFcnJvcixcbn0gZnJvbSAnLi4vc3RhdGUvbGVnYWN5LWFjdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0IFJJQyBmcm9tICcuLi9zdGF0ZS9SSUMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBGZXRjaEFjdGlvbixcbiAgUmVjZWl2ZUFjdGlvbixcbiAgTWFuYWdlcixcbiAgQWN0aW9uVHlwZXMsXG4gIE1pZGRsZXdhcmVBUEksXG4gIE1pZGRsZXdhcmUsXG4gIFN0YXRlLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBSZXNldEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBuYW1lID0gJ1Jlc2V0RXJyb3InO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdBYm9ydGVkIGR1ZSB0byBSRVNFVCcpO1xuICB9XG59XG5cbi8qKiBIYW5kbGVzIGFsbCBhc3luYyBuZXR3b3JrIGRpc3BhdGNoZXNcbiAqXG4gKiBEZWR1cGVzIGNvbmN1cnJlbnQgcmVxdWVzdHMgYnkga2VlcGluZyB0cmFjayBvZiBhbGwgZmV0Y2hlcyBpbiBmbGlnaHRcbiAqIGFuZCByZXR1cm5pbmcgZXhpc3RpbmcgcHJvbWlzZXMgZm9yIHJlcXVlc3RzIGFscmVhZHkgaW4gZmxpZ2h0LlxuICpcbiAqIEludGVyZmFjZXMgd2l0aCBzdG9yZSB2aWEgYSByZWR1eC1jb21wYXRpYmxlIG1pZGRsZXdhcmUuXG4gKlxuICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9OZXR3b3JrTWFuYWdlclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXR3b3JrTWFuYWdlciBpbXBsZW1lbnRzIE1hbmFnZXIge1xuICBwcm90ZWN0ZWQgZmV0Y2hlZDogeyBbazogc3RyaW5nXTogUHJvbWlzZTxhbnk+IH0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBwcm90ZWN0ZWQgcmVzb2x2ZXJzOiB7IFtrOiBzdHJpbmddOiAodmFsdWU/OiBhbnkpID0+IHZvaWQgfSA9IHt9O1xuICBwcm90ZWN0ZWQgcmVqZWN0b3JzOiB7IFtrOiBzdHJpbmddOiAodmFsdWU/OiBhbnkpID0+IHZvaWQgfSA9IHt9O1xuICBwcm90ZWN0ZWQgZmV0Y2hlZEF0OiB7IFtrOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICBkZWNsYXJlIHJlYWRvbmx5IGRhdGFFeHBpcnlMZW5ndGg6IG51bWJlcjtcbiAgZGVjbGFyZSByZWFkb25seSBlcnJvckV4cGlyeUxlbmd0aDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBtaWRkbGV3YXJlOiBNaWRkbGV3YXJlO1xuICBwcm90ZWN0ZWQgZ2V0U3RhdGU6ICgpID0+IFN0YXRlPHVua25vd24+ID0gKCkgPT4gaW5pdGlhbFN0YXRlO1xuICBwcm90ZWN0ZWQgY29udHJvbGxlcjogQ29udHJvbGxlciA9IG5ldyBDb250cm9sbGVyKCk7XG4gIGRlY2xhcmUgY2xlYW51cERhdGU/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZGF0YUV4cGlyeUxlbmd0aCA9IDYwMDAwLCBlcnJvckV4cGlyeUxlbmd0aCA9IDEwMDApIHtcbiAgICB0aGlzLmRhdGFFeHBpcnlMZW5ndGggPSBkYXRhRXhwaXJ5TGVuZ3RoO1xuICAgIHRoaXMuZXJyb3JFeHBpcnlMZW5ndGggPSBlcnJvckV4cGlyeUxlbmd0aDtcblxuICAgIHRoaXMubWlkZGxld2FyZSA9IDxDIGV4dGVuZHMgTWlkZGxld2FyZUFQST4oe1xuICAgICAgZGlzcGF0Y2gsXG4gICAgICBnZXRTdGF0ZSxcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgfTogQykgPT4ge1xuICAgICAgdGhpcy5nZXRTdGF0ZSA9IGdldFN0YXRlO1xuICAgICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICAgIHJldHVybiAobmV4dDogQ1snZGlzcGF0Y2gnXSk6IENbJ2Rpc3BhdGNoJ10gPT5cbiAgICAgICAgKGFjdGlvbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRkVUQ0hfVFlQRTpcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGZXRjaChhY3Rpb24sIGRpc3BhdGNoLCBjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgb25seSBjYXNlIHRoYXQgY2F1c2VzIGFueSBzdGF0ZSBjaGFuZ2VcbiAgICAgICAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gaW50ZXJjZXB0IG90aGVyIGZldGNoZXMgYXMgd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIHJlZHVjZXJzIGR1cmluZ1xuICAgICAgICAgICAgICAvLyByZW5kZXIgLSBzbyB3ZSBuZWVkIHRvIHN0b3AgJ3JlYWRvbmx5JyBmZXRjaGVzIHdoaWNoIGNhbiBiZSB0cmlnZ2VyZWQgaW4gcmVuZGVyXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhY3Rpb24ubWV0YS5vcHRpbWlzdGljUmVzcG9uc2UgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgIGFjdGlvbi5lbmRwb2ludD8uZ2V0T3B0aW1pc3RpY1Jlc3BvbnNlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICBjYXNlIFNFVF9UWVBFOlxuICAgICAgICAgICAgICAvLyBvbmx5IHJlY2VpdmUgYWZ0ZXIgbmV3IHN0YXRlIGlzIGNvbXB1dGVkXG4gICAgICAgICAgICAgIHJldHVybiBuZXh0KGFjdGlvbikudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5tZXRhLmtleSBpbiB0aGlzLmZldGNoZWQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IG1ldGEgKm11c3QqIGJlIHNldCBieSByZWR1Y2VyIHNvIHRoaXMgc2hvdWxkIGJlIHNhZmVcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5nZXRTdGF0ZSgpLm1ldGFbYWN0aW9uLm1ldGEua2V5XT8uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzaW5nIGVycm9ycyByZXN1bHQgaW4gc3RhdGUgbWV0YSBoYXZpbmcgZXJyb3IsIHNvIHdlIHNob3VsZCByZWplY3QgdGhlIHByb21pc2VcbiAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2Ugb25seSBuZXcgYWN0aW9uIHR5cGVzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVjZWl2ZShjcmVhdGVSZWNlaXZlRXJyb3IoZXJyb3IsIGFjdGlvbi5tZXRhKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJlY2VpdmUoYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FzZSBSRVNFVF9UWVBFOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlamVjdG9ycyA9IHsgLi4udGhpcy5yZWplY3RvcnMgfTtcblxuICAgICAgICAgICAgICB0aGlzLmNsZWFyQWxsKCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0KGFjdGlvbikudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgZXh0ZXJuYWwgbGlzdGVuZXJzIHRvIHRoZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBtdXN0IGhhcHBlbiBhZnRlciBjb21taXQgc28gb3VyIG93biByZWplY3RvciBrbm93cyBub3QgdG8gZGlzcGF0Y2ggYW4gZXJyb3IgYmFzZWQgb24gdGhpc1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgayBpbiByZWplY3RvcnMpIHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdG9yc1trXShuZXcgUmVzZXRFcnJvcigpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBVc2VkIGJ5IERldnRvb2xzTWFuYWdlciB0byBkZXRlcm1pbmUgd2hldGhlciB0byBsb2cgYW4gYWN0aW9uICovXG4gIHNraXBMb2dnaW5nKGFjdGlvbjogQWN0aW9uVHlwZXMpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiBhY3Rpb24udHlwZSA9PT0gRkVUQ0hfVFlQRSAmJiBhY3Rpb24ubWV0YS5rZXkgaW4gdGhpcy5mZXRjaGVkO1xuICB9XG5cbiAgLyoqIE9uIG1vdW50ICovXG4gIGluaXQoKSB7XG4gICAgZGVsZXRlIHRoaXMuY2xlYW51cERhdGU7XG4gIH1cblxuICAvKiogRW5zdXJlcyBhbGwgcHJvbWlzZXMgYXJlIGNvbXBsZXRlZCBieSByZWplY3RpbmcgcmVtYWluaW5nLiAqL1xuICBjbGVhbnVwKCkge1xuICAgIC8vIGVuc3VyZSBubyBkaXNwYXRjaGVzIGFmdGVyIHVubW91bnRcbiAgICAvLyB0aGlzIG11c3QgYmUgcmV2ZXJzaWJsZSAoZG9uZSBpbiBpbml0KSBzbyB1c2VFZmZlY3QoKSByZW1haW5zIHN5bW1ldHJpY1xuICAgIHRoaXMuY2xlYW51cERhdGUgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgYWxsU2V0dGxlZCgpIHtcbiAgICBjb25zdCBmZXRjaGVzID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZldGNoZWQpO1xuICAgIGlmIChmZXRjaGVzLmxlbmd0aCkgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChmZXRjaGVzKTtcbiAgfVxuXG4gIC8qKiBDbGVhciBhbGwgcHJvbWlzZSBzdGF0ZSAqL1xuICBwcm90ZWN0ZWQgY2xlYXJBbGwoKSB7XG4gICAgZm9yIChjb25zdCBrIGluIHRoaXMucmVqZWN0b3JzKSB7XG4gICAgICB0aGlzLmNsZWFyKGspO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbGVhciBwcm9taXNlIHN0YXRlIGZvciBhIGdpdmVuIGtleSAqL1xuICBwcm90ZWN0ZWQgY2xlYXIoa2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmZldGNoZWRba2V5XS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgZGVsZXRlIHRoaXMucmVzb2x2ZXJzW2tleV07XG4gICAgZGVsZXRlIHRoaXMucmVqZWN0b3JzW2tleV07XG4gICAgZGVsZXRlIHRoaXMuZmV0Y2hlZFtrZXldO1xuICAgIGRlbGV0ZSB0aGlzLmZldGNoZWRBdFtrZXldO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldExhc3RSZXNldCgpIHtcbiAgICBpZiAodGhpcy5jbGVhbnVwRGF0ZSkgcmV0dXJuIHRoaXMuY2xlYW51cERhdGU7XG4gICAgY29uc3QgbGFzdFJlc2V0ID0gdGhpcy5jb250cm9sbGVyLmdldFN0YXRlKCkubGFzdFJlc2V0O1xuICAgIGlmIChsYXN0UmVzZXQgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbGFzdFJlc2V0LnZhbHVlT2YoKTtcbiAgICBpZiAodHlwZW9mIGxhc3RSZXNldCAhPT0gJ251bWJlcicpIHJldHVybiAtSW5maW5pdHk7XG4gICAgcmV0dXJuIGxhc3RSZXNldDtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBtaWRkbGV3YXJlIGludGVyY2VwdHMgJ3Jlc3QtaG9va3MvZmV0Y2gnIGFjdGlvbi5cbiAgICpcbiAgICogV2lsbCB0aGVuIHN0YXJ0IGEgcHJvbWlzZSBmb3IgYSBrZXkgYW5kIHBvdGVudGlhbGx5IHN0YXJ0IHRoZSBuZXR3b3JrXG4gICAqIGZldGNoLlxuICAgKlxuICAgKiBVc2VzIHRocm90dGxlIG9ubHkgd2hlbiBpbnN0cnVjdGVkIGJ5IGFjdGlvbiBtZXRhLiBUaGlzIGlzIHZhbHVhYmxlXG4gICAqIGZvciBlbnN1cmVzIG11dGF0aW9uIHJlcXVlc3RzIGFsd2F5cyBnbyB0aHJvdWdoLlxuICAgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZUZldGNoKFxuICAgIGFjdGlvbjogRmV0Y2hBY3Rpb24sXG4gICAgZGlzcGF0Y2g6IChhY3Rpb246IGFueSkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBjb250cm9sbGVyOiBDb250cm9sbGVyLFxuICApIHtcbiAgICBjb25zdCBmZXRjaCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIGNvbnN0IHsga2V5LCB0aHJvdHRsZSwgcmVzb2x2ZSwgcmVqZWN0IH0gPSBhY3Rpb24ubWV0YTtcbiAgICAvLyBUT0RPKGJyZWFraW5nKTogcmVtb3ZlIHN1cHBvcnQgZm9yIERhdGUgdHlwZSBpbiAnUmVjZWl2ZScgYWN0aW9uXG4gICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgIHR5cGVvZiBhY3Rpb24ubWV0YS5jcmVhdGVkQXQgIT09ICdudW1iZXInXG4gICAgICAgID8gYWN0aW9uLm1ldGEuY3JlYXRlZEF0LmdldFRpbWUoKVxuICAgICAgICA6IGFjdGlvbi5tZXRhLmNyZWF0ZWRBdDtcblxuICAgIGNvbnN0IGRlZmVyZWRGZXRjaCA9ICgpID0+IHtcbiAgICAgIGxldCBwcm9taXNlID0gZmV0Y2goKTtcbiAgICAgIGNvbnN0IHJlc29sdmVQcm9taXNlID0gKFxuICAgICAgICBwcm9taXNlOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IG9iamVjdCB8IG51bGw+LFxuICAgICAgKSA9PlxuICAgICAgICBwcm9taXNlXG4gICAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0pO1xuICAgICAgLy8gc2NoZWR1bGUgbm9uLXRocm90dGxlZCByZXNvbHV0aW9ucyBpbiBhIG1pY3JvdGFzayBiZWZvcmUgcmVjZWl2ZVxuICAgICAgLy8gdGhpcyBlbmFibGVzIHVzZXJzIGF3YWl0aW5nIHRoZWlyIGZldGNoIHRvIHRyaWdnZXIgYW55IHJlYWN0IHVwZGF0ZXMgbmVlZGVkIHRvIGRlYWxcbiAgICAgIC8vIHdpdGggdXBjb21pbmcgY2hhbmdlcyBiZWNhdXNlIG9mIHRoZSBmZXRjaCAoZm9yIGluc3RhbmNlIGF2b2lkaW5nIHN1c3BlbnNlIGlmIHNvbWV0aGluZyBpcyBkZWxldGVkKVxuICAgICAgaWYgKCF0aHJvdHRsZSAmJiBhY3Rpb24uZW5kcG9pbnQpIHtcbiAgICAgICAgcHJvbWlzZSA9IHJlc29sdmVQcm9taXNlKHByb21pc2UpO1xuICAgICAgfVxuICAgICAgcHJvbWlzZSA9IHByb21pc2VcbiAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgbGV0IGxhc3RSZXNldCA9IHRoaXMuZ2V0TGFzdFJlc2V0KCk7XG5cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGlzTmFOKGxhc3RSZXNldCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdzdGF0ZS5sYXN0UmVzZXQgaXMgTmFOLiBPbmx5IHBvc2l0aXZlIHRpbWVzdGFtcHMgYXJlIHZhbGlkLicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGFzdFJlc2V0ID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkb24ndCB1cGRhdGUgc3RhdGUgd2l0aCBwcm9taXNlcyBzdGFydGVkIGJlZm9yZSBsYXN0IGNsZWFyXG4gICAgICAgICAgaWYgKGNyZWF0ZWRBdCA+PSBsYXN0UmVzZXQpIHtcbiAgICAgICAgICAgIC8vIHdlIHN0aWxsIGNoZWNrIGZvciBjb250cm9sbGVyIGluIGNhc2Ugc29tZW9uZSBkaWRuJ3QgaGF2ZSB0eXBlIHByb3RlY3Rpb24gc2luY2UgdGhpcyBkaWRuJ3QgYWx3YXlzIGV4aXN0XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmVuZHBvaW50ICYmIHRoaXMuY29udHJvbGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucmVzb2x2ZShhY3Rpb24uZW5kcG9pbnQsIHtcbiAgICAgICAgICAgICAgICBhcmdzOiBhY3Rpb24ubWV0YS5hcmdzIGFzIGFueSxcbiAgICAgICAgICAgICAgICByZXNwb25zZTogZGF0YSxcbiAgICAgICAgICAgICAgICBmZXRjaGVkQXQ6IGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPKGJyZWFraW5nKTogaXMgdGhpcyBicmFuY2ggc3RpbGwgcG9zc2libGU/IHJlbW92ZSBpbiBuZXh0IG1ham9yIHVwZGF0ZVxuICAgICAgICAgICAgICAvLyBkb2VzIHRoaXMgdGhyb3cgaWYgdGhlIHJlZHVjZXIgZmFpbHM/IC0gbm8gYmVjYXVzZSByZWR1Y2VyIGlzIHdyYXBwZWQgaW4gdHJ5L2NhdGNoXG4gICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kaXNwYXRjaChcbiAgICAgICAgICAgICAgICBjcmVhdGVSZWNlaXZlKGRhdGEsIHtcbiAgICAgICAgICAgICAgICAgIC4uLmFjdGlvbi5tZXRhLFxuICAgICAgICAgICAgICAgICAgZmV0Y2hlZEF0OiBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgICBkYXRhRXhwaXJ5TGVuZ3RoOlxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24ubWV0YS5vcHRpb25zPy5kYXRhRXhwaXJ5TGVuZ3RoID8/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUV4cGlyeUxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc3QgbGFzdFJlc2V0ID0gdGhpcy5nZXRMYXN0UmVzZXQoKTtcbiAgICAgICAgICAvLyBkb24ndCB1cGRhdGUgc3RhdGUgd2l0aCBwcm9taXNlcyBzdGFydGVkIGJlZm9yZSBsYXN0IGNsZWFyXG4gICAgICAgICAgaWYgKGNyZWF0ZWRBdCA+PSBsYXN0UmVzZXQpIHtcbiAgICAgICAgICAgIGlmIChhY3Rpb24uZW5kcG9pbnQgJiYgdGhpcy5jb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5yZXNvbHZlKGFjdGlvbi5lbmRwb2ludCwge1xuICAgICAgICAgICAgICAgIGFyZ3M6IGFjdGlvbi5tZXRhLmFyZ3MgYXMgYW55LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBlcnJvcixcbiAgICAgICAgICAgICAgICBmZXRjaGVkQXQ6IGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgY3JlYXRlUmVjZWl2ZUVycm9yKGVycm9yLCB7XG4gICAgICAgICAgICAgICAgICAuLi5hY3Rpb24ubWV0YSxcbiAgICAgICAgICAgICAgICAgIGVycm9yRXhwaXJ5TGVuZ3RoOlxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24ubWV0YS5vcHRpb25zPy5lcnJvckV4cGlyeUxlbmd0aCA/P1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yRXhwaXJ5TGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgZmV0Y2hlZEF0OiBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICAgIC8vIGxlZ2FjeSBiZWhhdmlvciBzY2hlZHVsZXMgcmVzb2x1dGlvbiBhZnRlciBkaXNwYXRjaFxuICAgICAgaWYgKCF0aHJvdHRsZSAmJiAhYWN0aW9uLmVuZHBvaW50KSB7XG4gICAgICAgIHByb21pc2UgPSByZXNvbHZlUHJvbWlzZShwcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBpZiAodGhyb3R0bGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRocm90dGxlKGtleSwgZGVmZXJlZEZldGNoLCBjcmVhdGVkQXQpXG4gICAgICAgIC50aGVuKGRhdGEgPT4gcmVzb2x2ZShkYXRhKSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGVmZXJlZEZldGNoKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgd2hlbiBtaWRkbGV3YXJlIGludGVyY2VwdHMgYSByZWNlaXZlIGFjdGlvbi5cbiAgICpcbiAgICogV2lsbCByZXNvbHZlIHRoZSBwcm9taXNlIGFzc29jaWF0ZWQgd2l0aCByZWNlaXZlIGtleS5cbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVSZWNlaXZlKGFjdGlvbjogUmVjZWl2ZUFjdGlvbikge1xuICAgIC8vIHRoaXMgY2FuIHN0aWxsIHR1cm4gb3V0IHRvIGJlIHVudHJ1ZSBzaW5jZSB0aGlzIGlzIGFzeW5jXG4gICAgaWYgKGFjdGlvbi5tZXRhLmtleSBpbiB0aGlzLmZldGNoZWQpIHtcbiAgICAgIGxldCBwcm9taXNlSGFuZGxlcjogKHZhbHVlPzogYW55KSA9PiB2b2lkO1xuICAgICAgaWYgKGFjdGlvbi5lcnJvcikge1xuICAgICAgICBwcm9taXNlSGFuZGxlciA9IHRoaXMucmVqZWN0b3JzW2FjdGlvbi5tZXRhLmtleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9taXNlSGFuZGxlciA9IHRoaXMucmVzb2x2ZXJzW2FjdGlvbi5tZXRhLmtleV07XG4gICAgICB9XG4gICAgICBwcm9taXNlSGFuZGxlcihhY3Rpb24ucGF5bG9hZCk7XG4gICAgICAvLyBzaW5jZSB3ZSdyZSByZXNvbHZlZCB3ZSBubyBsb25nZXIgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoaXMgcHJvbWlzZVxuICAgICAgdGhpcy5jbGVhcihhY3Rpb24ubWV0YS5rZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBdHRhY2hlcyBOZXR3b3JrTWFuYWdlciB0byBzdG9yZVxuICAgKlxuICAgKiBJbnRlcmNlcHRzICdyZXN0LWhvb2tzL2ZldGNoJyBhY3Rpb25zIHRvIHN0YXJ0IHJlcXVlc3RzLlxuICAgKlxuICAgKiBSZXNvbHZlL3JlamVjdHMgYSByZXF1ZXN0IHdoZW4gbWF0Y2hpbmcgJ3Jlc3QtaG9va3MvcmVjZWl2ZScgZXZlbnRcbiAgICogaXMgc2Vlbi5cbiAgICovXG4gIGdldE1pZGRsZXdhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWlkZGxld2FyZTtcbiAgfVxuXG4gIC8qKiBFbnN1cmVzIG9ubHkgb25lIHJlcXVlc3QgZm9yIGEgZ2l2ZW4ga2V5IGlzIGluIGZsaWdodCBhdCBhbnkgdGltZVxuICAgKlxuICAgKiBVc2VzIGtleSB0byBlaXRoZXIgcmV0cmlldmUgaW4tZmxpZ2h0IHByb21pc2UsIG9yIGlmIG5vdFxuICAgKiBjcmVhdGUgYSBuZXcgcHJvbWlzZSBhbmQgY2FsbCBmZXRjaC5cbiAgICpcbiAgICogTm90ZTogVGhlIG5ldyBwcm9taXNlIGlzIG5vdCBhY3R1YWxseSB0aWVkIHRvIGZldGNoIGF0IGFsbCxcbiAgICogYnV0IGlzIHJlc29sdmVkIHdoZW4gdGhlIGV4cGVjdGVkICdyZWNpZXZlJyBhY3Rpb24gaXMgcHJvY2Vzc2VkLlxuICAgKiBUaGlzIGVuc3VyZXMgcHJvbWlzZXMgYXJlIHJlc29sdmVkIG9ubHkgb25jZSB0aGVpciBkYXRhIGlzIHByb2Nlc3NlZFxuICAgKiBieSB0aGUgcmVkdWNlci5cbiAgICovXG4gIHByb3RlY3RlZCB0aHJvdHRsZShcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmZXRjaDogKCkgPT4gUHJvbWlzZTxhbnk+LFxuICAgIGNyZWF0ZWRBdDogbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBsYXN0UmVzZXQgPSB0aGlzLmdldExhc3RSZXNldCgpO1xuICAgIC8vIHdlJ3JlIGFscmVhZHkgZmV0Y2hpbmcgc28gcmV1c2UgdGhlIHByb21pc2VcbiAgICAvLyBmZXRjaGVzIGFmdGVyIHJlc2V0IGRvIG5vdCBjb3VudFxuICAgIGlmIChrZXkgaW4gdGhpcy5mZXRjaGVkICYmIHRoaXMuZmV0Y2hlZEF0W2tleV0gPiBsYXN0UmVzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmZldGNoZWRba2V5XTtcbiAgICB9XG5cbiAgICB0aGlzLmZldGNoZWRba2V5XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXJzW2tleV0gPSByZXNvbHZlO1xuICAgICAgdGhpcy5yZWplY3RvcnNba2V5XSA9IHJlamVjdDtcbiAgICB9KTtcbiAgICB0aGlzLmZldGNoZWRBdFtrZXldID0gY3JlYXRlZEF0O1xuXG4gICAgLy8gc2luY2Ugb3VyIHJlYWwgcHJvbWlzZSBpcyByZXNvbHZlZCB2aWEgdGhlIHdyYXBSZWR1Y2VyKCksXG4gICAgLy8gd2Ugc2hvdWxkIGp1c3Qgc3RvcCBhbGwgZXJyb3JzIGhlcmUuXG4gICAgLy8gVE9ETzogZGVjb3VwbGUgdGhpcyBmcm9tIHVzZUZldGNoZXIoKSAodGhhdCdzIHdoYXQncyBkaXNwYXRjaGluZyB0aGUgZXJyb3IgdGhlIHJlc29sdmVzIGluIGhlcmUpXG4gICAgUklDKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBmZXRjaCgpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgfSxcbiAgICAgIHsgdGltZW91dDogNTAwIH0sXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmZldGNoZWRba2V5XTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLEVBQUVDLFVBQVUsRUFBRUMsVUFBVSxRQUFRLG1CQUFtQjtBQUNwRSxPQUFPQyxVQUFVLE1BQU0sNkJBQTZCO0FBQ3BELFNBQVNDLFlBQVksUUFBUSxnQkFBZ0I7QUFDN0MsU0FDRUMsYUFBYSxFQUNiQyxrQkFBa0IsUUFDYixrQ0FBa0M7QUFDekMsT0FBT0MsR0FBRyxNQUFNLGlCQUFpQjtBQVdqQyxPQUFPLE1BQU1DLFVBQVUsU0FBU0MsS0FBSyxDQUFDO0VBR3BDQyxXQUFXLEdBQUc7SUFDWixLQUFLLENBQUMsc0JBQXNCLENBQUM7SUFBQyxLQUhoQ0MsSUFBSSxHQUFHLFlBQVk7RUFJbkI7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE1BQU1DLGNBQWMsQ0FBb0I7RUFZckRGLFdBQVcsQ0FBQ0csZ0JBQWdCLEdBQUcsS0FBSyxFQUFFQyxpQkFBaUIsR0FBRyxJQUFJLEVBQUU7SUFBQSxLQVh0REMsT0FBTyxHQUFrQ0MsTUFBTSxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQUEsS0FDNURDLFNBQVMs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 |
{ | ||
"name": "@rest-hooks/core", | ||
"version": "4.2.3", | ||
"version": "4.2.4", | ||
"description": "Normalized Asynchronous data framework. Protocol and View agnostic.", | ||
@@ -110,3 +110,3 @@ "sideEffects": false, | ||
"@babel/runtime": "^7.17.0", | ||
"@rest-hooks/normalizr": "^9.5.1", | ||
"@rest-hooks/normalizr": "^10.0.0", | ||
"flux-standard-action": "^2.1.1" | ||
@@ -130,3 +130,3 @@ }, | ||
}, | ||
"gitHead": "8d3be93d44408c4b2b565486df25a30df543f21f" | ||
"gitHead": "8b0eda4d5e129ba0a02d704a65cdfeb402bafc4f" | ||
} |
@@ -53,2 +53,76 @@ import { Endpoint, Entity } from '@rest-hooks/endpoint'; | ||
it('denormalizes distinct schemas for null arg', () => { | ||
const controller = new Contoller(); | ||
class Tacos extends Entity { | ||
type = ''; | ||
id = ''; | ||
pk() { | ||
return this.id; | ||
} | ||
} | ||
const ep = new Endpoint(() => Promise.resolve(), { | ||
key() { | ||
return 'mytest'; | ||
}, | ||
schema: { | ||
data: [Tacos], | ||
extra: '', | ||
page: { | ||
first: null, | ||
second: undefined, | ||
third: 0, | ||
complex: { complex: true, next: false }, | ||
}, | ||
}, | ||
}); | ||
const entities = { | ||
Tacos: { | ||
1: { id: '1', type: 'foo' }, | ||
2: { id: '2', type: 'bar' }, | ||
}, | ||
}; | ||
const state = { | ||
...initialState, | ||
entities, | ||
results: { | ||
[ep.key()]: { | ||
data: ['1', '2'], | ||
}, | ||
}, | ||
}; | ||
const { data, expiryStatus } = controller.getResponse(ep, null, state); | ||
expect(expiryStatus).toBe(ExpiryStatus.InvalidIfStale); | ||
// null args means don't fill anything in | ||
expect(data.data).toBeUndefined(); | ||
expect(data).toMatchInlineSnapshot(` | ||
{ | ||
"data": undefined, | ||
"extra": "", | ||
"page": { | ||
"complex": { | ||
"complex": true, | ||
"next": false, | ||
}, | ||
"first": null, | ||
"second": undefined, | ||
"third": 0, | ||
}, | ||
} | ||
`); | ||
expect(controller.getResponse(ep, null, state).data).toStrictEqual(data); | ||
const ep2 = ep.extend({ schema: { data: Tacos, nextPage: { five: '5' } } }); | ||
const data2 = controller.getResponse(ep2, null, state).data; | ||
expect(data2.data).toBeUndefined(); | ||
expect(data2).toMatchInlineSnapshot(` | ||
{ | ||
"data": undefined, | ||
"nextPage": { | ||
"five": "5", | ||
}, | ||
} | ||
`); | ||
}); | ||
it('infers schema with extra members but not set', () => { | ||
@@ -88,4 +162,10 @@ const controller = new Contoller(); | ||
entities, | ||
entityMeta: { | ||
Tacos: { | ||
1: { date: 1000000, expiresAt: 1100000, fetchedAt: 1000000 }, | ||
2: { date: 2000000, expiresAt: 2100000, fetchedAt: 2000000 }, | ||
}, | ||
}, | ||
}; | ||
const { data, expiryStatus } = controller.getResponse( | ||
const { data, expiryStatus, expiresAt } = controller.getResponse( | ||
ep, | ||
@@ -97,3 +177,9 @@ { id: '1' }, | ||
expect(data).toMatchSnapshot(); | ||
expect(expiresAt).toBe(1100000); | ||
// test caching | ||
const second = controller.getResponse(ep, { id: '1' }, state); | ||
expect(second.data.data).toBe(data.data); | ||
expect(second.expiryStatus).toBe(expiryStatus); | ||
expect(second.expiresAt).toBe(expiresAt); | ||
}); | ||
}); |
@@ -7,2 +7,3 @@ import type { | ||
EntityTable, | ||
Path, | ||
} from '@rest-hooks/normalizr'; | ||
@@ -17,3 +18,3 @@ import { ExpiryStatus } from '@rest-hooks/normalizr'; | ||
Schema, | ||
WeakListMap, | ||
WeakEntityMap, | ||
} from '@rest-hooks/normalizr'; | ||
@@ -389,7 +390,7 @@ import { inferResults } from '@rest-hooks/normalizr'; | ||
if (isActive && !this.globalCache.results[key]) | ||
this.globalCache.results[key] = new WeakListMap(); | ||
this.globalCache.results[key] = new WeakEntityMap(); | ||
// second argument is false if any entities are missing | ||
// eslint-disable-next-line prefer-const | ||
const [data, found, suspend, resolvedEntities] = denormalize( | ||
const [data, found, suspend, entityPaths] = denormalize( | ||
results, | ||
@@ -400,8 +401,3 @@ schema, | ||
isActive ? this.globalCache.results[key] : undefined, | ||
) as [ | ||
DenormalizeNullable<E['schema']>, | ||
boolean, | ||
boolean, | ||
Record<string, Record<string, any>>, | ||
]; | ||
) as [DenormalizeNullable<E['schema']>, boolean, boolean, Path[]]; | ||
@@ -412,13 +408,13 @@ // fallback to entity expiry time | ||
if (found) { | ||
const entityMeta = state.entityMeta; | ||
// oldest entity dictates age | ||
expiresAt = Infinity; | ||
// using Object.keys ensures we don't hit `toString` type members | ||
Object.entries(resolvedEntities).forEach(([key, entities]) => | ||
Object.keys(entities).forEach(pk => { | ||
expiresAt = Math.min( | ||
expiresAt, | ||
state.entityMeta[key]?.[pk]?.expiresAt ?? Infinity, | ||
); | ||
}), | ||
expiresAt = entityPaths.reduce( | ||
(expiresAt: number, { pk, key }) => | ||
Math.min(expiresAt, entityMeta[key]?.[pk]?.expiresAt ?? Infinity), | ||
Infinity, | ||
); | ||
/*expiresAt = entityPaths | ||
.map(({ pk, key }) => entityMeta[key]?.[pk]?.expiresAt) | ||
.filter(a => a) | ||
.reduce((a, b) => Math.min(a, b), Infinity); Alternative method - is it faster?*/ | ||
} else { | ||
@@ -425,0 +421,0 @@ expiresAt = 0; |
@@ -37,3 +37,3 @@ import { SET_TYPE, FETCH_TYPE, RESET_TYPE } from '../actionTypes.js'; | ||
export default class NetworkManager implements Manager { | ||
protected fetched: { [k: string]: Promise<any> } = {}; | ||
protected fetched: { [k: string]: Promise<any> } = Object.create(null); | ||
protected resolvers: { [k: string]: (value?: any) => void } = {}; | ||
@@ -113,5 +113,3 @@ protected rejectors: { [k: string]: (value?: any) => void } = {}; | ||
/* istanbul ignore next */ | ||
return ( | ||
action.type === FETCH_TYPE && Object.hasOwn(this.fetched, action.meta.key) | ||
); | ||
return action.type === FETCH_TYPE && action.meta.key in this.fetched; | ||
} | ||
@@ -285,3 +283,3 @@ | ||
// this can still turn out to be untrue since this is async | ||
if (Object.hasOwn(this.fetched, action.meta.key)) { | ||
if (action.meta.key in this.fetched) { | ||
let promiseHandler: (value?: any) => void; | ||
@@ -288,0 +286,0 @@ if (action.error) { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Unpopular package
QualityThis package is not very popular.
Found 1 instance in 1 package
968013
12686
735
1
+ Added@rest-hooks/normalizr@10.1.0(transitive)
- Removed@rest-hooks/normalizr@9.5.1(transitive)