New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@rest-hooks/normalizr

Package Overview
Dependencies
Maintainers
2
Versions
126
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@rest-hooks/normalizr - npm Package Compare versions

Comparing version 9.5.1 to 10.0.0

legacy/WeakEntityMap.js

299

dist/normalizr.amd.js

@@ -127,6 +127,69 @@ define(['exports'], (function (exports) { 'use strict';

/** Maps entity dependencies to a value (usually their denormalized form)
*
* Dependencies store `Path` to enable quick traversal using only `State`
* If *any* members of the dependency get cleaned up, so does that key/value pair get removed.
*/
class WeakEntityMap {
constructor() {
this.next = new WeakMap();
}
get(entity, getEntity) {
let curLink = this.next.get(entity);
if (!curLink) return EMPTY;
while (curLink.nextPath) {
const nextEntity = getEntity(curLink.nextPath);
curLink = curLink.next.get(nextEntity);
if (!curLink) return EMPTY;
}
// curLink exists, but has no path - so must have a value
return [curLink.value, curLink.journey];
}
set(dependencies, value) {
if (dependencies.length < 1) throw new KeySize();
let curLink = this;
for (const {
entity,
path
} of dependencies) {
let nextLink = curLink.next.get(entity);
if (!nextLink) {
nextLink = new Link();
curLink.next.set(entity, nextLink);
}
curLink.nextPath = path;
curLink = nextLink;
}
// in case there used to be more
delete curLink.nextPath;
curLink.value = value;
// we could recompute this on get, but it would have a cost and we optimize for `get`
curLink.journey = depToPaths(dependencies);
}
}
const EMPTY = [undefined, undefined];
function getEntities(state) {
const entityIsImmutable = isImmutable(state);
if (entityIsImmutable) {
return ({
key,
pk
}) => state.getIn([key, pk]);
} else {
return ({
key,
pk
}) => {
var _state$key;
return (_state$key = state[key]) == null ? void 0 : _state$key[pk];
};
}
}
function depToPaths(dependencies) {
return dependencies.map(dep => dep.path);
}
/** Link in a chain */
class Link {
constructor() {
this.children = new WeakMap();
this.next = new WeakMap();
}

@@ -141,57 +204,7 @@ }

/** Maps from a list of objects (referentially) to any value
*
* If *any* members of the list get claned up, so does that key/value pair get removed.
*/
class WeakListMap {
constructor() {
this.first = new WeakMap();
}
delete(key) {
const link = this.traverse(key);
link == null ? true : delete link.value;
return !!link;
}
get(key) {
const link = this.traverse(key);
return link == null ? void 0 : link.value;
}
has(key) {
const link = this.traverse(key);
if (!link) return false;
return Object.hasOwn(link, 'value');
}
set(key, value) {
if (key.length < 1) throw new KeySize();
let cur = this.first;
let link;
for (let i = 0; i < key.length; i++) {
if (!cur.has(key[i])) {
link = new Link();
cur.set(key[i], link);
} else {
link = cur.get(key[i]);
}
cur = link.children;
// do on later iteration of loop. this makes typescript happy rather than putting after loop
if (i === key.length - 1) {
link.value = value;
}
}
return this;
}
traverse(key) {
let cur = this.first;
let link;
for (let i = 0; i < key.length; i++) {
link = cur.get(key[i]);
if (!link) return;
cur = link.children;
}
return link;
}
}
const unvisitEntity = (entityOrId, schema, unvisit, getEntity, localCache, cycleCache, entityCache, dependencies, cycleIndex) => {
const entity = getEntity(entityOrId, schema);
const unvisitEntity = (entityOrId, schema, unvisit, getEntity, getCache, localCache, cycleCache, dependencies, cycleIndex) => {
const entity = typeof entityOrId === 'object' ? entityOrId : getEntity({
pk: entityOrId,
key: schema.key
});
if (typeof entity === 'symbol' && entity.toString().includes('DELETED')) {

@@ -224,45 +237,62 @@ return [undefined, true, true];

}
if (!(key in entityCache)) {
entityCache[key] = Object.create(null);
}
const localCacheKey = localCache[key];
const cycleCacheKey = cycleCache[key];
const entityCacheKey = entityCache[key];
let found = true;
let deleted = false;
// local cache lookup first
if (!localCacheKey[pk]) {
const trackingIndex = dependencies.length;
dependencies.push(entity);
let entityCopy;
if (schema.createIfValid) {
entityCopy = localCacheKey[pk] = isImmutable(entity) ? schema.createIfValid(entity.toObject()) : schema.createIfValid(entity);
// TODO(breaking): remove once old verions no longer supported
} else {
entityCopy = entity;
unvisit = withTrackedEntities(unvisit);
unvisit.setLocal = entityCopy => localCacheKey[pk] = entityCopy;
}
cycleCacheKey[pk] = trackingIndex;
if (entityCopy === undefined) {
// undefined indicates we should suspense (perhaps failed validation)
found = false;
deleted = true;
} else {
[localCacheKey[pk], found, deleted] = schema.denormalize(entityCopy, unvisit);
}
delete cycleCacheKey[pk];
const globalCacheEntry = getGlobalCacheEntry(entityCacheKey, pk);
const globalCache = getCache(pk, schema);
const [cacheValue] = globalCache.get(entity, getEntity);
// TODO: what if this just returned the deps - then we don't need to store them
// if in cycle, use the start of the cycle to track all deps
// otherwise, we use our own trackingIndex
const localKey = dependencies.slice(cycleIndex.i === -1 ? trackingIndex : cycleIndex.i);
if (!globalCacheEntry.has(localKey)) {
globalCacheEntry.set(localKey, localCacheKey[pk]);
} else {
localCacheKey[pk] = globalCacheEntry.get(localKey);
if (cacheValue) {
localCacheKey[pk] = cacheValue.value[0];
// TODO: can we store the cache values instead of tracking *all* their sources?
// this is only used for setting results cache correctly. if we got this far we will def need to set as we would have already tried getting it
dependencies.push(...cacheValue.dependencies);
return cacheValue.value;
}
// if we don't find in denormalize cache then do full denormalize
else {
const trackingIndex = dependencies.length;
dependencies.push({
entity,
path: {
key,
pk
}
});
let entityCopy;
if (schema.createIfValid) {
entityCopy = localCacheKey[pk] = isImmutable(entity) ? schema.createIfValid(entity.toObject()) : schema.createIfValid(entity);
// TODO(breaking): remove once old verions no longer supported
} else {
entityCopy = entity;
unvisit = withTrackedEntities(unvisit);
unvisit.setLocal = entityCopy => localCacheKey[pk] = entityCopy;
}
cycleCacheKey[pk] = trackingIndex;
if (entityCopy === undefined) {
// undefined indicates we should suspense (perhaps failed validation)
found = false;
deleted = true;
} else {
[localCacheKey[pk], found, deleted] = schema.denormalize(entityCopy, unvisit);
}
delete cycleCacheKey[pk];
// start of cycle - reset cycle detection
if (cycleIndex.i === trackingIndex) {
cycleIndex.i = -1;
// if in cycle, use the start of the cycle to track all deps
// otherwise, we use our own trackingIndex
const localKey = dependencies.slice(cycleIndex.i === -1 ? trackingIndex : cycleIndex.i);
const cacheValue = {
dependencies: localKey,
value: [localCacheKey[pk], found, deleted]
};
globalCache.set(localKey, cacheValue);
// start of cycle - reset cycle detection
if (cycleIndex.i === trackingIndex) {
cycleIndex.i = -1;
}
}

@@ -275,3 +305,9 @@ } else {

// with no cycle, globalCacheEntry will have already been set
dependencies.push(entity);
dependencies.push({
entity,
path: {
key,
pk
}
});
}

@@ -281,4 +317,6 @@ }

};
const getUnvisit = (entities, entityCache, resultCache, localCache) => {
const getUnvisit = (entities, entityCache, resultCache) => {
const getEntity = getEntities(entities);
const getCache = getEntityCaches(entityCache);
const localCache = {};
const dependencies = [];

@@ -297,2 +335,4 @@ const cycleIndex = {

const hasDenormalize = typeof schema.denormalize === 'function';
// deserialize fields (like Date)
if (!hasDenormalize && typeof schema === 'function') {

@@ -312,3 +352,3 @@ if (input instanceof schema) return [input, true, false];

if (isEntity(schema)) {
return unvisitEntity(input, schema, unvisit, getEntity, localCache, cycleCache, entityCache, dependencies, cycleIndex);
return unvisitEntity(input, schema, unvisit, getEntity, getCache, localCache, cycleCache, dependencies, cycleIndex);
}

@@ -320,50 +360,57 @@ if (hasDenormalize) {

}
//const wrappedUnvisit = withTrackedEntities(unvisit, globalKey);
return (input, schema) => {
const ret = unvisit(input, schema);
// in the case where WeakMap cannot be used
// this test ensures null is properly excluded from WeakMap
if (Object(input) !== input) return ret;
dependencies.push(input);
if (!resultCache.has(dependencies)) {
resultCache.set(dependencies, ret[0]);
return ret;
} else {
return [resultCache.get(dependencies), ret[1], ret[2]];
const cachable = Object(input) === input && Object(schema) === schema;
if (!cachable) {
const ret = unvisit(input, schema);
// this is faster than spread
// https://www.measurethat.net/Benchmarks/Show/23636/0/spread-with-tuples
return [ret[0], ret[1], ret[2], depToPaths(dependencies)];
}
let [ret, entityPaths] = resultCache.get(input, getEntity);
if (ret === undefined) {
ret = unvisit(input, schema);
// we want to do this before we add our 'input' entry
entityPaths = depToPaths(dependencies);
// for the first entry, `path` is ignored so empty members is fine
dependencies.unshift({
entity: input,
path: {
key: '',
pk: ''
}
});
resultCache.set(dependencies, ret);
}
return [ret[0], ret[1], ret[2], entityPaths];
};
};
const getEntities = entities => {
const entityIsImmutable = isImmutable(entities);
return (entityOrId, schema) => {
var _entities$schemaKey;
const schemaKey = schema.key;
if (typeof entityOrId === 'object') {
return entityOrId;
const getEntityCaches = entityCache => {
return (pk, schema) => {
const key = schema.key;
if (!(key in entityCache)) {
entityCache[key] = Object.create(null);
}
if (entityIsImmutable) {
return entities.getIn([schemaKey, entityOrId]);
const entityCacheKey = entityCache[key];
if (!entityCacheKey[pk]) entityCacheKey[pk] = new WeakMap();
let wem = entityCacheKey[pk].get(schema);
if (!wem) {
wem = new WeakEntityMap();
entityCacheKey[pk].set(schema, wem);
}
return (_entities$schemaKey = entities[schemaKey]) == null ? void 0 : _entities$schemaKey[entityOrId];
return wem;
};
};
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
const denormalize = (input, schema, entities, entityCache = {}, resultCache = new WeakListMap()) => {
const denormalize = (input, schema, entities, entityCache = {}, resultCache = new WeakEntityMap()) => {
// undefined mean don't do anything
if (schema === undefined) {
return [input, true, false, {}];
return [input, true, false, []];
}
if (input === undefined) {
return [undefined, false, false, {}];
return [undefined, false, false, []];
}
const resolvedEntities = {};
const unvisit = getUnvisit(entities, entityCache, resultCache, resolvedEntities);
return [...unvisit(input, schema), resolvedEntities];
return getUnvisit(entities, entityCache, resultCache)(input, schema);
};
function getGlobalCacheEntry(entityCache, id) {
if (!entityCache[id]) entityCache[id] = new WeakListMap();
return entityCache[id];
}

@@ -592,3 +639,3 @@ // TODO(breaking): remove once unused

exports.ExpiryStatus = ExpiryStatus;
exports.WeakListMap = WeakListMap;
exports.WeakEntityMap = WeakEntityMap;
exports.denormalize = denormalize;

@@ -595,0 +642,0 @@ exports.inferResults = inferResults;

@@ -128,6 +128,69 @@ var rest_hooks_normalizr = (function (exports) {

/** Maps entity dependencies to a value (usually their denormalized form)
*
* Dependencies store `Path` to enable quick traversal using only `State`
* If *any* members of the dependency get cleaned up, so does that key/value pair get removed.
*/
class WeakEntityMap {
constructor() {
this.next = new WeakMap();
}
get(entity, getEntity) {
let curLink = this.next.get(entity);
if (!curLink) return EMPTY;
while (curLink.nextPath) {
const nextEntity = getEntity(curLink.nextPath);
curLink = curLink.next.get(nextEntity);
if (!curLink) return EMPTY;
}
// curLink exists, but has no path - so must have a value
return [curLink.value, curLink.journey];
}
set(dependencies, value) {
if (dependencies.length < 1) throw new KeySize();
let curLink = this;
for (const {
entity,
path
} of dependencies) {
let nextLink = curLink.next.get(entity);
if (!nextLink) {
nextLink = new Link();
curLink.next.set(entity, nextLink);
}
curLink.nextPath = path;
curLink = nextLink;
}
// in case there used to be more
delete curLink.nextPath;
curLink.value = value;
// we could recompute this on get, but it would have a cost and we optimize for `get`
curLink.journey = depToPaths(dependencies);
}
}
const EMPTY = [undefined, undefined];
function getEntities(state) {
const entityIsImmutable = isImmutable(state);
if (entityIsImmutable) {
return ({
key,
pk
}) => state.getIn([key, pk]);
} else {
return ({
key,
pk
}) => {
var _state$key;
return (_state$key = state[key]) == null ? void 0 : _state$key[pk];
};
}
}
function depToPaths(dependencies) {
return dependencies.map(dep => dep.path);
}
/** Link in a chain */
class Link {
constructor() {
this.children = new WeakMap();
this.next = new WeakMap();
}

@@ -142,57 +205,7 @@ }

/** Maps from a list of objects (referentially) to any value
*
* If *any* members of the list get claned up, so does that key/value pair get removed.
*/
class WeakListMap {
constructor() {
this.first = new WeakMap();
}
delete(key) {
const link = this.traverse(key);
link == null ? true : delete link.value;
return !!link;
}
get(key) {
const link = this.traverse(key);
return link == null ? void 0 : link.value;
}
has(key) {
const link = this.traverse(key);
if (!link) return false;
return Object.hasOwn(link, 'value');
}
set(key, value) {
if (key.length < 1) throw new KeySize();
let cur = this.first;
let link;
for (let i = 0; i < key.length; i++) {
if (!cur.has(key[i])) {
link = new Link();
cur.set(key[i], link);
} else {
link = cur.get(key[i]);
}
cur = link.children;
// do on later iteration of loop. this makes typescript happy rather than putting after loop
if (i === key.length - 1) {
link.value = value;
}
}
return this;
}
traverse(key) {
let cur = this.first;
let link;
for (let i = 0; i < key.length; i++) {
link = cur.get(key[i]);
if (!link) return;
cur = link.children;
}
return link;
}
}
const unvisitEntity = (entityOrId, schema, unvisit, getEntity, localCache, cycleCache, entityCache, dependencies, cycleIndex) => {
const entity = getEntity(entityOrId, schema);
const unvisitEntity = (entityOrId, schema, unvisit, getEntity, getCache, localCache, cycleCache, dependencies, cycleIndex) => {
const entity = typeof entityOrId === 'object' ? entityOrId : getEntity({
pk: entityOrId,
key: schema.key
});
if (typeof entity === 'symbol' && entity.toString().includes('DELETED')) {

@@ -225,45 +238,62 @@ return [undefined, true, true];

}
if (!(key in entityCache)) {
entityCache[key] = Object.create(null);
}
const localCacheKey = localCache[key];
const cycleCacheKey = cycleCache[key];
const entityCacheKey = entityCache[key];
let found = true;
let deleted = false;
// local cache lookup first
if (!localCacheKey[pk]) {
const trackingIndex = dependencies.length;
dependencies.push(entity);
let entityCopy;
if (schema.createIfValid) {
entityCopy = localCacheKey[pk] = isImmutable(entity) ? schema.createIfValid(entity.toObject()) : schema.createIfValid(entity);
// TODO(breaking): remove once old verions no longer supported
} else {
entityCopy = entity;
unvisit = withTrackedEntities(unvisit);
unvisit.setLocal = entityCopy => localCacheKey[pk] = entityCopy;
}
cycleCacheKey[pk] = trackingIndex;
if (entityCopy === undefined) {
// undefined indicates we should suspense (perhaps failed validation)
found = false;
deleted = true;
} else {
[localCacheKey[pk], found, deleted] = schema.denormalize(entityCopy, unvisit);
}
delete cycleCacheKey[pk];
const globalCacheEntry = getGlobalCacheEntry(entityCacheKey, pk);
const globalCache = getCache(pk, schema);
const [cacheValue] = globalCache.get(entity, getEntity);
// TODO: what if this just returned the deps - then we don't need to store them
// if in cycle, use the start of the cycle to track all deps
// otherwise, we use our own trackingIndex
const localKey = dependencies.slice(cycleIndex.i === -1 ? trackingIndex : cycleIndex.i);
if (!globalCacheEntry.has(localKey)) {
globalCacheEntry.set(localKey, localCacheKey[pk]);
} else {
localCacheKey[pk] = globalCacheEntry.get(localKey);
if (cacheValue) {
localCacheKey[pk] = cacheValue.value[0];
// TODO: can we store the cache values instead of tracking *all* their sources?
// this is only used for setting results cache correctly. if we got this far we will def need to set as we would have already tried getting it
dependencies.push(...cacheValue.dependencies);
return cacheValue.value;
}
// if we don't find in denormalize cache then do full denormalize
else {
const trackingIndex = dependencies.length;
dependencies.push({
entity,
path: {
key,
pk
}
});
let entityCopy;
if (schema.createIfValid) {
entityCopy = localCacheKey[pk] = isImmutable(entity) ? schema.createIfValid(entity.toObject()) : schema.createIfValid(entity);
// TODO(breaking): remove once old verions no longer supported
} else {
entityCopy = entity;
unvisit = withTrackedEntities(unvisit);
unvisit.setLocal = entityCopy => localCacheKey[pk] = entityCopy;
}
cycleCacheKey[pk] = trackingIndex;
if (entityCopy === undefined) {
// undefined indicates we should suspense (perhaps failed validation)
found = false;
deleted = true;
} else {
[localCacheKey[pk], found, deleted] = schema.denormalize(entityCopy, unvisit);
}
delete cycleCacheKey[pk];
// start of cycle - reset cycle detection
if (cycleIndex.i === trackingIndex) {
cycleIndex.i = -1;
// if in cycle, use the start of the cycle to track all deps
// otherwise, we use our own trackingIndex
const localKey = dependencies.slice(cycleIndex.i === -1 ? trackingIndex : cycleIndex.i);
const cacheValue = {
dependencies: localKey,
value: [localCacheKey[pk], found, deleted]
};
globalCache.set(localKey, cacheValue);
// start of cycle - reset cycle detection
if (cycleIndex.i === trackingIndex) {
cycleIndex.i = -1;
}
}

@@ -276,3 +306,9 @@ } else {

// with no cycle, globalCacheEntry will have already been set
dependencies.push(entity);
dependencies.push({
entity,
path: {
key,
pk
}
});
}

@@ -282,4 +318,6 @@ }

};
const getUnvisit = (entities, entityCache, resultCache, localCache) => {
const getUnvisit = (entities, entityCache, resultCache) => {
const getEntity = getEntities(entities);
const getCache = getEntityCaches(entityCache);
const localCache = {};
const dependencies = [];

@@ -298,2 +336,4 @@ const cycleIndex = {

const hasDenormalize = typeof schema.denormalize === 'function';
// deserialize fields (like Date)
if (!hasDenormalize && typeof schema === 'function') {

@@ -313,3 +353,3 @@ if (input instanceof schema) return [input, true, false];

if (isEntity(schema)) {
return unvisitEntity(input, schema, unvisit, getEntity, localCache, cycleCache, entityCache, dependencies, cycleIndex);
return unvisitEntity(input, schema, unvisit, getEntity, getCache, localCache, cycleCache, dependencies, cycleIndex);
}

@@ -321,50 +361,57 @@ if (hasDenormalize) {

}
//const wrappedUnvisit = withTrackedEntities(unvisit, globalKey);
return (input, schema) => {
const ret = unvisit(input, schema);
// in the case where WeakMap cannot be used
// this test ensures null is properly excluded from WeakMap
if (Object(input) !== input) return ret;
dependencies.push(input);
if (!resultCache.has(dependencies)) {
resultCache.set(dependencies, ret[0]);
return ret;
} else {
return [resultCache.get(dependencies), ret[1], ret[2]];
const cachable = Object(input) === input && Object(schema) === schema;
if (!cachable) {
const ret = unvisit(input, schema);
// this is faster than spread
// https://www.measurethat.net/Benchmarks/Show/23636/0/spread-with-tuples
return [ret[0], ret[1], ret[2], depToPaths(dependencies)];
}
let [ret, entityPaths] = resultCache.get(input, getEntity);
if (ret === undefined) {
ret = unvisit(input, schema);
// we want to do this before we add our 'input' entry
entityPaths = depToPaths(dependencies);
// for the first entry, `path` is ignored so empty members is fine
dependencies.unshift({
entity: input,
path: {
key: '',
pk: ''
}
});
resultCache.set(dependencies, ret);
}
return [ret[0], ret[1], ret[2], entityPaths];
};
};
const getEntities = entities => {
const entityIsImmutable = isImmutable(entities);
return (entityOrId, schema) => {
var _entities$schemaKey;
const schemaKey = schema.key;
if (typeof entityOrId === 'object') {
return entityOrId;
const getEntityCaches = entityCache => {
return (pk, schema) => {
const key = schema.key;
if (!(key in entityCache)) {
entityCache[key] = Object.create(null);
}
if (entityIsImmutable) {
return entities.getIn([schemaKey, entityOrId]);
const entityCacheKey = entityCache[key];
if (!entityCacheKey[pk]) entityCacheKey[pk] = new WeakMap();
let wem = entityCacheKey[pk].get(schema);
if (!wem) {
wem = new WeakEntityMap();
entityCacheKey[pk].set(schema, wem);
}
return (_entities$schemaKey = entities[schemaKey]) == null ? void 0 : _entities$schemaKey[entityOrId];
return wem;
};
};
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
const denormalize = (input, schema, entities, entityCache = {}, resultCache = new WeakListMap()) => {
const denormalize = (input, schema, entities, entityCache = {}, resultCache = new WeakEntityMap()) => {
// undefined mean don't do anything
if (schema === undefined) {
return [input, true, false, {}];
return [input, true, false, []];
}
if (input === undefined) {
return [undefined, false, false, {}];
return [undefined, false, false, []];
}
const resolvedEntities = {};
const unvisit = getUnvisit(entities, entityCache, resultCache, resolvedEntities);
return [...unvisit(input, schema), resolvedEntities];
return getUnvisit(entities, entityCache, resultCache)(input, schema);
};
function getGlobalCacheEntry(entityCache, id) {
if (!entityCache[id]) entityCache[id] = new WeakListMap();
return entityCache[id];
}

@@ -593,3 +640,3 @@ // TODO(breaking): remove once unused

exports.ExpiryStatus = ExpiryStatus;
exports.WeakListMap = WeakListMap;
exports.WeakEntityMap = WeakEntityMap;
exports.denormalize = denormalize;

@@ -596,0 +643,0 @@ exports.inferResults = inferResults;

@@ -1,1 +0,1 @@

function e(e){return null!==e&&void 0!==e.pk}const t=e=>{if("production"!==process.env.NODE_ENV){if(Array.isArray(e)&&e.length>1)throw new Error(`Expected schema definition to be a single schema, but found ${e.length}.`)}return e[0]},n=([e,,t])=>void 0!==e&&!t,r=(e,n,r,o,i,s,c)=>{e=t(e);const u=(e=>Array.isArray(e)?e:Object.keys(e).map((t=>e[t])))(n);return u.map(((t,n)=>i(t,r,o,e,s,c)))},o=(e,r,o)=>(e=t(e),[r.map?r.map((t=>o(t,e))).filter(n).map((([e])=>e)):r,!0,!1]);function i(e,t,n,r){}function s(e){return!("function"!=typeof e.hasOwnProperty||!(Object.hasOwnProperty.call(e,"__ownerID")||e._map&&Object.hasOwnProperty.call(e._map,"__ownerID")))}const c=(e,t,n,r,o,i,s)=>{const c=Object.assign({},t);return Object.keys(e).forEach((n=>{const r=e[n],u=o(t[n],t,n,r,i,s);null==u?delete c[n]:c[n]=u})),c},u=(e,t,n)=>{if(s(t))return function(e,t,n){let r=!0,o=!1;return[Object.keys(e).reduce(((t,i)=>{const s=`${i}`,[c,u,a]=n(t.get(s),e[s]);return u||(r=!1),a&&(o=!0),t.has(s)?t.set(s,c):t}),t),r,o]}(e,t,n);const r=Object.assign({},t);let o=!0,i=!1;return Object.keys(e).forEach((t=>{const[s,c,u]=n(r[t],e[t]);void 0!==r[t]&&(r[t]=s),u&&(i=!0),c||(o=!1)})),[r,o,i]};function a(e,t,n,r,o){const i={};for(const s of Object.keys(e))i[s]=r(e[s],t,n,o);return i}class l{constructor(){this.children=new WeakMap}}class f extends Error{constructor(...e){super(...e),this.message="Keys must include at least one member"}}class d{constructor(){this.first=new WeakMap}delete(e){const t=this.traverse(e);return null==t||delete t.value,!!t}get(e){const t=this.traverse(e);return null==t?void 0:t.value}has(e){const t=this.traverse(e);return!!t&&Object.hasOwn(t,"value")}set(e,t){if(e.length<1)throw new f;let n,r=this.first;for(let o=0;o<e.length;o++)r.has(e[o])?n=r.get(e[o]):(n=new l,r.set(e[o],n)),r=n.children,o===e.length-1&&(n.value=t);return this}traverse(e){let t,n=this.first;for(let r=0;r<e.length;r++){if(t=n.get(e[r]),!t)return;n=t.children}return t}}const p=(e,t,n,r,o,i,c,u,a)=>{const l=r(e,t);if("symbol"==typeof l&&l.toString().includes("DELETED"))return[void 0,!0,!0];if("object"!=typeof l||null===l)return[l,!1,!1];const f="string"==typeof e?e:t.pk(s(l)?l.toJS():l);if(void 0===f||""===f||"undefined"===f)return[l,!1,!1];const p=t.key;p in o||(o[p]=Object.create(null)),p in i||(i[p]=Object.create(null)),p in c||(c[p]=Object.create(null));const y=o[p],h=i[p],g=c[p];let b=!0,m=!1;if(y[f])f in h?a.i=h[f]:u.push(l);else{const e=u.length;let r;u.push(l),t.createIfValid?r=y[f]=s(l)?t.createIfValid(l.toObject()):t.createIfValid(l):(r=l,n=function(e){const t=e.og||e,n=(e,n)=>t(e,n);return n.og=e,n}(n),n.setLocal=e=>y[f]=e),h[f]=e,void 0===r?(b=!1,m=!0):[y[f],b,m]=t.denormalize(r,n),delete h[f];const o=function(e,t){e[t]||(e[t]=new d);return e[t]}(g,f),i=u.slice(-1===a.i?e:a.i);o.has(i)?y[f]=o.get(i):o.set(i,y[f]),a.i===e&&(a.i=-1)}return[y[f],b,m]},y=e=>{const t=s(e);return(n,r)=>{var o;const i=r.key;return"object"==typeof n?n:t?e.getIn([i,n]):null==(o=e[i])?void 0:o[n]}},h=(t,n,r,i={},s=new d)=>{if(void 0===n)return[t,!0,!1,{}];if(void 0===t)return[void 0,!1,!1,{}];const c={},a=((t,n,r,i)=>{const s=y(t),c=[],a={i:-1},l={};function f(t,r){if(!r)return[t,!0,!1];if(null===t)return[t,!0,!1];const d="function"==typeof r.denormalize;return d||"function"!=typeof r?void 0===t?[t,!1,!1]:d||"object"!=typeof r?e(r)?p(t,r,f,s,i,l,n,c,a):d?r.denormalize(t,f):[t,!0,!1]:(Array.isArray(r)?o:u)(r,t,f):t instanceof r||void 0===t?[t,!0,!1]:[new r(t),!0,!1]}return(e,t)=>{const n=f(e,t);return Object(e)!==e?n:(c.push(e),r.has(c)?[r.get(c),n[1],n[2]]:(r.set(c,n[0]),n))}})(r,i,s,c);return[...a(t,n),c]};const g=Symbol("ENTITY WAS DELETED"),b=(e,t,n,o,i,s)=>{if(!e||!o)return e;if(o.normalize&&"function"==typeof o.normalize)return"object"!=typeof e?e:o.normalize(e,t,n,b,i,s);if("function"==typeof o)return new o(e);if("object"!=typeof e||"object"!=typeof o)return e;return(Array.isArray(o)?r:c)(o,e,t,n,b,i,s)};const m=(e,t,n={},r={},o={},i={date:Date.now(),expiresAt:1/0,fetchedAt:0})=>{if(null==t)return{entities:n,indexes:r,result:e,entityMeta:o};const s=function(e){return["object","function"].includes(typeof e)?"object":typeof e}(t);if(null===e||typeof e!==s&&(void 0===t.key||void 0!==t.pk||"string"!=typeof e)){if("production"!==process.env.NODE_ENV){const n=e=>{try{return"string"!=typeof JSON.parse(e)}catch(e){return!1}};throw"string"==typeof e&&n(e)?new Error(`Normalizing a string, but this does match schema.\n\nParsing this input string as JSON worked. This likely indicates fetch function did not parse\nthe JSON. By default, this only happens if "content-type" header includes "json".\nSee https://resthooks.io/rest/api/RestEndpoint#parseResponse for more information\n\n Schema: ${JSON.stringify(t,void 0,2)}\n Input: "${e}"`):new Error(`Unexpected input given to normalize. Expected type to be "${s}", found "${null===e?"null":typeof e}".\n\n Schema: ${JSON.stringify(t,void 0,2)}\n Input: "${e}"`)}throw new Error(`Unexpected input given to normalize. Expected type to be "${s}", found "${null===e?"null":typeof e}".`)}const c=Object.assign({},n),u=Object.assign({},r),a=Object.assign({},o),l=((e,t,n,r,o,i)=>(s,c,u)=>{const a=s.key;a in e||(e[a]={},n[a]=Object.assign({},n[a]),o[a]=Object.assign({},o[a]));const l=e[a][u];if(l)e[a][u]=s.merge(l,c);else{const t=s.expiresAt?s.expiresAt(i,c):i.expiresAt,r=n[a][u];if(r){var f,d,p;const n=o[a][u];e[a][u]=s.mergeWithStore?s.mergeWithStore(n,i,r,c):function(e,t,n,r,o){return!t||(e.useIncoming&&n.fetchedAt?e.useIncoming(t,n,r,o):t.date<=n.date)?typeof o!=typeof r?o:e.merge(r,o):r}(s,n,i,r,c),o[a][u]={expiresAt:Math.max(t,null==n?void 0:n.expiresAt),date:Math.max(i.date,null!=(f=null==n?void 0:n.date)?f:0),fetchedAt:Math.max(null!=(d=i.fetchedAt)?d:0,null!=(p=null==n?void 0:n.fetchedAt)?p:0)}}else{var y;e[a][u]=c,o[a][u]={expiresAt:t,date:i.date,fetchedAt:null!=(y=i.fetchedAt)?y:i.date}}}if(Array.isArray(s.indexes)){const o=e[a][u];a in t||(t[a]={},r[a]=Object.assign({},r[a]));for(const e of s.indexes){e in t[a]||(r[a][e]=t[a][e]={});const i=t[a][e];l&&delete i[l[e]],n[a]&&n[a][u]&&n[a][u][e]!==o[e]&&(i[n[a][u][e]]=g),e in o?i[o[e]]=u:"production"!==process.env.NODE_ENV&&console.warn(`Index not found in entity. Indexes must be top-level members of your entity.\nIndex: ${e}\nEntity: ${JSON.stringify(o,void 0,2)}`)}}n[a][u]=e[a][u]})({},{},c,u,a,i);return{entities:c,indexes:u,result:b(e,e,void 0,t,l,{}),entityMeta:a}};function v(e,t,n,r={}){if(function(e){return!!e&&"function"==typeof e.infer}(e))return e.infer(t,n,v,r);if("object"==typeof e&&e){return(Array.isArray(e)?i:a)(e,t,n,v,r)}return e}var O={Invalid:1,InvalidIfStale:2,Valid:3};Object.hasOwn=Object.hasOwn||function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};export{g as DELETED,O as ExpiryStatus,d as WeakListMap,h as denormalize,v as inferResults,e as isEntity,m as normalize};
function e(e){return null!==e&&void 0!==e.pk}const t=e=>{if("production"!==process.env.NODE_ENV){if(Array.isArray(e)&&e.length>1)throw new Error(`Expected schema definition to be a single schema, but found ${e.length}.`)}return e[0]},n=([e,,t])=>void 0!==e&&!t,r=(e,n,r,o,i,s,c)=>{e=t(e);const a=(e=>Array.isArray(e)?e:Object.keys(e).map((t=>e[t])))(n);return a.map(((t,n)=>i(t,r,o,e,s,c)))},o=(e,r,o)=>(e=t(e),[r.map?r.map((t=>o(t,e))).filter(n).map((([e])=>e)):r,!0,!1]);function i(e,t,n,r){}function s(e){return!("function"!=typeof e.hasOwnProperty||!(Object.hasOwnProperty.call(e,"__ownerID")||e._map&&Object.hasOwnProperty.call(e._map,"__ownerID")))}const c=(e,t,n,r,o,i,s)=>{const c=Object.assign({},t);return Object.keys(e).forEach((n=>{const r=e[n],a=o(t[n],t,n,r,i,s);null==a?delete c[n]:c[n]=a})),c},a=(e,t,n)=>{if(s(t))return function(e,t,n){let r=!0,o=!1;return[Object.keys(e).reduce(((t,i)=>{const s=`${i}`,[c,a,u]=n(t.get(s),e[s]);return a||(r=!1),u&&(o=!0),t.has(s)?t.set(s,c):t}),t),r,o]}(e,t,n);const r=Object.assign({},t);let o=!0,i=!1;return Object.keys(e).forEach((t=>{const[s,c,a]=n(r[t],e[t]);void 0!==r[t]&&(r[t]=s),a&&(i=!0),c||(o=!1)})),[r,o,i]};function u(e,t,n,r,o){const i={};for(const s of Object.keys(e))i[s]=r(e[s],t,n,o);return i}class f{constructor(){this.next=new WeakMap}get(e,t){let n=this.next.get(e);if(!n)return l;for(;n.nextPath;){const e=t(n.nextPath);if(n=n.next.get(e),!n)return l}return[n.value,n.journey]}set(e,t){if(e.length<1)throw new y;let n=this;for(const{entity:t,path:r}of e){let e=n.next.get(t);e||(e=new d,n.next.set(t,e)),n.nextPath=r,n=e}delete n.nextPath,n.value=t,n.journey=p(e)}}const l=[void 0,void 0];function p(e){return e.map((e=>e.path))}class d{constructor(){this.next=new WeakMap}}class y extends Error{constructor(...e){super(...e),this.message="Keys must include at least one member"}}const h=(t,n,r)=>{const i=s(c=t)?({key:e,pk:t})=>c.getIn([e,t]):({key:e,pk:t})=>{var n;return null==(n=c[e])?void 0:n[t]};var c;const u=g(n),f={},l=[],d={i:-1},y={};function h(t,n){if(!n)return[t,!0,!1];if(null===t)return[t,!0,!1];const r="function"==typeof n.denormalize;if(!r&&"function"==typeof n)return t instanceof n||void 0===t?[t,!0,!1]:[new n(t),!0,!1];if(void 0===t)return[t,!1,!1];if(!r&&"object"==typeof n){return(Array.isArray(n)?o:a)(n,t,h)}return e(n)?((e,t,n,r,o,i,c,a,u)=>{const f="object"==typeof e?e:r({pk:e,key:t.key});if("symbol"==typeof f&&f.toString().includes("DELETED"))return[void 0,!0,!0];if("object"!=typeof f||null===f)return[f,!1,!1];const l="string"==typeof e?e:t.pk(s(f)?f.toJS():f);if(void 0===l||""===l||"undefined"===l)return[f,!1,!1];const p=t.key;p in i||(i[p]=Object.create(null)),p in c||(c[p]=Object.create(null));const d=i[p],y=c[p];let h=!0,g=!1;if(d[l])l in y?u.i=y[l]:a.push({entity:f,path:{key:p,pk:l}});else{const e=o(l,t),[i]=e.get(f,r);if(i)return d[l]=i.value[0],a.push(...i.dependencies),i.value;{const r=a.length;let o;a.push({entity:f,path:{key:p,pk:l}}),t.createIfValid?o=d[l]=s(f)?t.createIfValid(f.toObject()):t.createIfValid(f):(o=f,n=function(e){const t=e.og||e,n=(e,n)=>t(e,n);return n.og=e,n}(n),n.setLocal=e=>d[l]=e),y[l]=r,void 0===o?(h=!1,g=!0):[d[l],h,g]=t.denormalize(o,n),delete y[l];const i=a.slice(-1===u.i?r:u.i),c={dependencies:i,value:[d[l],h,g]};e.set(i,c),u.i===r&&(u.i=-1)}}return[d[l],h,g]})(t,n,h,i,u,f,y,l,d):r?n.denormalize(t,h):[t,!0,!1]}return(e,t)=>{if(!(Object(e)===e&&Object(t)===t)){const n=h(e,t);return[n[0],n[1],n[2],p(l)]}let[n,o]=r.get(e,i);return void 0===n&&(n=h(e,t),o=p(l),l.unshift({entity:e,path:{key:"",pk:""}}),r.set(l,n)),[n[0],n[1],n[2],o]}},g=e=>(t,n)=>{const r=n.key;r in e||(e[r]=Object.create(null));const o=e[r];o[t]||(o[t]=new WeakMap);let i=o[t].get(n);return i||(i=new f,o[t].set(n,i)),i},b=(e,t,n,r={},o=new f)=>void 0===t?[e,!0,!1,[]]:void 0===e?[void 0,!1,!1,[]]:h(n,r,o)(e,t);const m=Symbol("ENTITY WAS DELETED"),v=(e,t,n,o,i,s)=>{if(!e||!o)return e;if(o.normalize&&"function"==typeof o.normalize)return"object"!=typeof e?e:o.normalize(e,t,n,v,i,s);if("function"==typeof o)return new o(e);if("object"!=typeof e||"object"!=typeof o)return e;return(Array.isArray(o)?r:c)(o,e,t,n,v,i,s)};const O=(e,t,n={},r={},o={},i={date:Date.now(),expiresAt:1/0,fetchedAt:0})=>{if(null==t)return{entities:n,indexes:r,result:e,entityMeta:o};const s=function(e){return["object","function"].includes(typeof e)?"object":typeof e}(t);if(null===e||typeof e!==s&&(void 0===t.key||void 0!==t.pk||"string"!=typeof e)){if("production"!==process.env.NODE_ENV){const n=e=>{try{return"string"!=typeof JSON.parse(e)}catch(e){return!1}};throw"string"==typeof e&&n(e)?new Error(`Normalizing a string, but this does match schema.\n\nParsing this input string as JSON worked. This likely indicates fetch function did not parse\nthe JSON. By default, this only happens if "content-type" header includes "json".\nSee https://resthooks.io/rest/api/RestEndpoint#parseResponse for more information\n\n Schema: ${JSON.stringify(t,void 0,2)}\n Input: "${e}"`):new Error(`Unexpected input given to normalize. Expected type to be "${s}", found "${null===e?"null":typeof e}".\n\n Schema: ${JSON.stringify(t,void 0,2)}\n Input: "${e}"`)}throw new Error(`Unexpected input given to normalize. Expected type to be "${s}", found "${null===e?"null":typeof e}".`)}const c=Object.assign({},n),a=Object.assign({},r),u=Object.assign({},o),f=((e,t,n,r,o,i)=>(s,c,a)=>{const u=s.key;u in e||(e[u]={},n[u]=Object.assign({},n[u]),o[u]=Object.assign({},o[u]));const f=e[u][a];if(f)e[u][a]=s.merge(f,c);else{const t=s.expiresAt?s.expiresAt(i,c):i.expiresAt,r=n[u][a];if(r){var l,p,d;const n=o[u][a];e[u][a]=s.mergeWithStore?s.mergeWithStore(n,i,r,c):function(e,t,n,r,o){return!t||(e.useIncoming&&n.fetchedAt?e.useIncoming(t,n,r,o):t.date<=n.date)?typeof o!=typeof r?o:e.merge(r,o):r}(s,n,i,r,c),o[u][a]={expiresAt:Math.max(t,null==n?void 0:n.expiresAt),date:Math.max(i.date,null!=(l=null==n?void 0:n.date)?l:0),fetchedAt:Math.max(null!=(p=i.fetchedAt)?p:0,null!=(d=null==n?void 0:n.fetchedAt)?d:0)}}else{var y;e[u][a]=c,o[u][a]={expiresAt:t,date:i.date,fetchedAt:null!=(y=i.fetchedAt)?y:i.date}}}if(Array.isArray(s.indexes)){const o=e[u][a];u in t||(t[u]={},r[u]=Object.assign({},r[u]));for(const e of s.indexes){e in t[u]||(r[u][e]=t[u][e]={});const i=t[u][e];f&&delete i[f[e]],n[u]&&n[u][a]&&n[u][a][e]!==o[e]&&(i[n[u][a][e]]=m),e in o?i[o[e]]=a:"production"!==process.env.NODE_ENV&&console.warn(`Index not found in entity. Indexes must be top-level members of your entity.\nIndex: ${e}\nEntity: ${JSON.stringify(o,void 0,2)}`)}}n[u][a]=e[u][a]})({},{},c,a,u,i);return{entities:c,indexes:a,result:v(e,e,void 0,t,f,{}),entityMeta:u}};function j(e,t,n,r={}){if(function(e){return!!e&&"function"==typeof e.infer}(e))return e.infer(t,n,j,r);if("object"==typeof e&&e){return(Array.isArray(e)?i:u)(e,t,n,j,r)}return e}var x={Invalid:1,InvalidIfStale:2,Valid:3};Object.hasOwn=Object.hasOwn||function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};export{m as DELETED,x as ExpiryStatus,f as WeakEntityMap,b as denormalize,j as inferResults,e as isEntity,O as normalize};

@@ -133,6 +133,69 @@ 'use strict';

/** Maps entity dependencies to a value (usually their denormalized form)
*
* Dependencies store `Path` to enable quick traversal using only `State`
* If *any* members of the dependency get cleaned up, so does that key/value pair get removed.
*/
class WeakEntityMap {
constructor() {
this.next = new WeakMap();
}
get(entity, getEntity) {
let curLink = this.next.get(entity);
if (!curLink) return EMPTY;
while (curLink.nextPath) {
const nextEntity = getEntity(curLink.nextPath);
curLink = curLink.next.get(nextEntity);
if (!curLink) return EMPTY;
}
// curLink exists, but has no path - so must have a value
return [curLink.value, curLink.journey];
}
set(dependencies, value) {
if (dependencies.length < 1) throw new KeySize();
let curLink = this;
for (const {
entity,
path
} of dependencies) {
let nextLink = curLink.next.get(entity);
if (!nextLink) {
nextLink = new Link();
curLink.next.set(entity, nextLink);
}
curLink.nextPath = path;
curLink = nextLink;
}
// in case there used to be more
delete curLink.nextPath;
curLink.value = value;
// we could recompute this on get, but it would have a cost and we optimize for `get`
curLink.journey = depToPaths(dependencies);
}
}
const EMPTY = [undefined, undefined];
function getEntities(state) {
const entityIsImmutable = isImmutable(state);
if (entityIsImmutable) {
return ({
key,
pk
}) => state.getIn([key, pk]);
} else {
return ({
key,
pk
}) => {
var _state$key;
return (_state$key = state[key]) == null ? void 0 : _state$key[pk];
};
}
}
function depToPaths(dependencies) {
return dependencies.map(dep => dep.path);
}
/** Link in a chain */
class Link {
constructor() {
this.children = new WeakMap();
this.next = new WeakMap();
}

@@ -147,57 +210,7 @@ }

/** Maps from a list of objects (referentially) to any value
*
* If *any* members of the list get claned up, so does that key/value pair get removed.
*/
class WeakListMap {
constructor() {
this.first = new WeakMap();
}
delete(key) {
const link = this.traverse(key);
link == null ? true : delete link.value;
return !!link;
}
get(key) {
const link = this.traverse(key);
return link == null ? void 0 : link.value;
}
has(key) {
const link = this.traverse(key);
if (!link) return false;
return Object.hasOwn(link, 'value');
}
set(key, value) {
if (key.length < 1) throw new KeySize();
let cur = this.first;
let link;
for (let i = 0; i < key.length; i++) {
if (!cur.has(key[i])) {
link = new Link();
cur.set(key[i], link);
} else {
link = cur.get(key[i]);
}
cur = link.children;
// do on later iteration of loop. this makes typescript happy rather than putting after loop
if (i === key.length - 1) {
link.value = value;
}
}
return this;
}
traverse(key) {
let cur = this.first;
let link;
for (let i = 0; i < key.length; i++) {
link = cur.get(key[i]);
if (!link) return;
cur = link.children;
}
return link;
}
}
const unvisitEntity = (entityOrId, schema, unvisit, getEntity, localCache, cycleCache, entityCache, dependencies, cycleIndex) => {
const entity = getEntity(entityOrId, schema);
const unvisitEntity = (entityOrId, schema, unvisit, getEntity, getCache, localCache, cycleCache, dependencies, cycleIndex) => {
const entity = typeof entityOrId === 'object' ? entityOrId : getEntity({
pk: entityOrId,
key: schema.key
});
if (typeof entity === 'symbol' && entity.toString().includes('DELETED')) {

@@ -230,45 +243,62 @@ return [undefined, true, true];

}
if (!(key in entityCache)) {
entityCache[key] = Object.create(null);
}
const localCacheKey = localCache[key];
const cycleCacheKey = cycleCache[key];
const entityCacheKey = entityCache[key];
let found = true;
let deleted = false;
// local cache lookup first
if (!localCacheKey[pk]) {
const trackingIndex = dependencies.length;
dependencies.push(entity);
let entityCopy;
if (schema.createIfValid) {
entityCopy = localCacheKey[pk] = isImmutable(entity) ? schema.createIfValid(entity.toObject()) : schema.createIfValid(entity);
// TODO(breaking): remove once old verions no longer supported
} else {
entityCopy = entity;
unvisit = withTrackedEntities(unvisit);
unvisit.setLocal = entityCopy => localCacheKey[pk] = entityCopy;
}
cycleCacheKey[pk] = trackingIndex;
if (entityCopy === undefined) {
// undefined indicates we should suspense (perhaps failed validation)
found = false;
deleted = true;
} else {
[localCacheKey[pk], found, deleted] = schema.denormalize(entityCopy, unvisit);
}
delete cycleCacheKey[pk];
const globalCacheEntry = getGlobalCacheEntry(entityCacheKey, pk);
const globalCache = getCache(pk, schema);
const [cacheValue] = globalCache.get(entity, getEntity);
// TODO: what if this just returned the deps - then we don't need to store them
// if in cycle, use the start of the cycle to track all deps
// otherwise, we use our own trackingIndex
const localKey = dependencies.slice(cycleIndex.i === -1 ? trackingIndex : cycleIndex.i);
if (!globalCacheEntry.has(localKey)) {
globalCacheEntry.set(localKey, localCacheKey[pk]);
} else {
localCacheKey[pk] = globalCacheEntry.get(localKey);
if (cacheValue) {
localCacheKey[pk] = cacheValue.value[0];
// TODO: can we store the cache values instead of tracking *all* their sources?
// this is only used for setting results cache correctly. if we got this far we will def need to set as we would have already tried getting it
dependencies.push(...cacheValue.dependencies);
return cacheValue.value;
}
// if we don't find in denormalize cache then do full denormalize
else {
const trackingIndex = dependencies.length;
dependencies.push({
entity,
path: {
key,
pk
}
});
let entityCopy;
if (schema.createIfValid) {
entityCopy = localCacheKey[pk] = isImmutable(entity) ? schema.createIfValid(entity.toObject()) : schema.createIfValid(entity);
// TODO(breaking): remove once old verions no longer supported
} else {
entityCopy = entity;
unvisit = withTrackedEntities(unvisit);
unvisit.setLocal = entityCopy => localCacheKey[pk] = entityCopy;
}
cycleCacheKey[pk] = trackingIndex;
if (entityCopy === undefined) {
// undefined indicates we should suspense (perhaps failed validation)
found = false;
deleted = true;
} else {
[localCacheKey[pk], found, deleted] = schema.denormalize(entityCopy, unvisit);
}
delete cycleCacheKey[pk];
// start of cycle - reset cycle detection
if (cycleIndex.i === trackingIndex) {
cycleIndex.i = -1;
// if in cycle, use the start of the cycle to track all deps
// otherwise, we use our own trackingIndex
const localKey = dependencies.slice(cycleIndex.i === -1 ? trackingIndex : cycleIndex.i);
const cacheValue = {
dependencies: localKey,
value: [localCacheKey[pk], found, deleted]
};
globalCache.set(localKey, cacheValue);
// start of cycle - reset cycle detection
if (cycleIndex.i === trackingIndex) {
cycleIndex.i = -1;
}
}

@@ -281,3 +311,9 @@ } else {

// with no cycle, globalCacheEntry will have already been set
dependencies.push(entity);
dependencies.push({
entity,
path: {
key,
pk
}
});
}

@@ -287,4 +323,6 @@ }

};
const getUnvisit = (entities, entityCache, resultCache, localCache) => {
const getUnvisit = (entities, entityCache, resultCache) => {
const getEntity = getEntities(entities);
const getCache = getEntityCaches(entityCache);
const localCache = {};
const dependencies = [];

@@ -303,2 +341,4 @@ const cycleIndex = {

const hasDenormalize = typeof schema.denormalize === 'function';
// deserialize fields (like Date)
if (!hasDenormalize && typeof schema === 'function') {

@@ -318,3 +358,3 @@ if (input instanceof schema) return [input, true, false];

if (isEntity(schema)) {
return unvisitEntity(input, schema, unvisit, getEntity, localCache, cycleCache, entityCache, dependencies, cycleIndex);
return unvisitEntity(input, schema, unvisit, getEntity, getCache, localCache, cycleCache, dependencies, cycleIndex);
}

@@ -326,50 +366,57 @@ if (hasDenormalize) {

}
//const wrappedUnvisit = withTrackedEntities(unvisit, globalKey);
return (input, schema) => {
const ret = unvisit(input, schema);
// in the case where WeakMap cannot be used
// this test ensures null is properly excluded from WeakMap
if (Object(input) !== input) return ret;
dependencies.push(input);
if (!resultCache.has(dependencies)) {
resultCache.set(dependencies, ret[0]);
return ret;
} else {
return [resultCache.get(dependencies), ret[1], ret[2]];
const cachable = Object(input) === input && Object(schema) === schema;
if (!cachable) {
const ret = unvisit(input, schema);
// this is faster than spread
// https://www.measurethat.net/Benchmarks/Show/23636/0/spread-with-tuples
return [ret[0], ret[1], ret[2], depToPaths(dependencies)];
}
let [ret, entityPaths] = resultCache.get(input, getEntity);
if (ret === undefined) {
ret = unvisit(input, schema);
// we want to do this before we add our 'input' entry
entityPaths = depToPaths(dependencies);
// for the first entry, `path` is ignored so empty members is fine
dependencies.unshift({
entity: input,
path: {
key: '',
pk: ''
}
});
resultCache.set(dependencies, ret);
}
return [ret[0], ret[1], ret[2], entityPaths];
};
};
const getEntities = entities => {
const entityIsImmutable = isImmutable(entities);
return (entityOrId, schema) => {
var _entities$schemaKey;
const schemaKey = schema.key;
if (typeof entityOrId === 'object') {
return entityOrId;
const getEntityCaches = entityCache => {
return (pk, schema) => {
const key = schema.key;
if (!(key in entityCache)) {
entityCache[key] = Object.create(null);
}
if (entityIsImmutable) {
return entities.getIn([schemaKey, entityOrId]);
const entityCacheKey = entityCache[key];
if (!entityCacheKey[pk]) entityCacheKey[pk] = new WeakMap();
let wem = entityCacheKey[pk].get(schema);
if (!wem) {
wem = new WeakEntityMap();
entityCacheKey[pk].set(schema, wem);
}
return (_entities$schemaKey = entities[schemaKey]) == null ? void 0 : _entities$schemaKey[entityOrId];
return wem;
};
};
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
const denormalize = (input, schema, entities, entityCache = {}, resultCache = new WeakListMap()) => {
const denormalize = (input, schema, entities, entityCache = {}, resultCache = new WeakEntityMap()) => {
// undefined mean don't do anything
if (schema === undefined) {
return [input, true, false, {}];
return [input, true, false, []];
}
if (input === undefined) {
return [undefined, false, false, {}];
return [undefined, false, false, []];
}
const resolvedEntities = {};
const unvisit = getUnvisit(entities, entityCache, resultCache, resolvedEntities);
return [...unvisit(input, schema), resolvedEntities];
return getUnvisit(entities, entityCache, resultCache)(input, schema);
};
function getGlobalCacheEntry(entityCache, id) {
if (!entityCache[id]) entityCache[id] = new WeakListMap();
return entityCache[id];
}

@@ -605,3 +652,3 @@ // TODO(breaking): remove once unused

exports.ExpiryStatus = ExpiryStatus;
exports.WeakListMap = WeakListMap;
exports.WeakEntityMap = WeakEntityMap;
exports.denormalize = denormalize;

@@ -608,0 +655,0 @@ exports.inferResults = inferResults;

@@ -131,6 +131,69 @@ (function (global, factory) {

/** Maps entity dependencies to a value (usually their denormalized form)
*
* Dependencies store `Path` to enable quick traversal using only `State`
* If *any* members of the dependency get cleaned up, so does that key/value pair get removed.
*/
class WeakEntityMap {
constructor() {
this.next = new WeakMap();
}
get(entity, getEntity) {
let curLink = this.next.get(entity);
if (!curLink) return EMPTY;
while (curLink.nextPath) {
const nextEntity = getEntity(curLink.nextPath);
curLink = curLink.next.get(nextEntity);
if (!curLink) return EMPTY;
}
// curLink exists, but has no path - so must have a value
return [curLink.value, curLink.journey];
}
set(dependencies, value) {
if (dependencies.length < 1) throw new KeySize();
let curLink = this;
for (const {
entity,
path
} of dependencies) {
let nextLink = curLink.next.get(entity);
if (!nextLink) {
nextLink = new Link();
curLink.next.set(entity, nextLink);
}
curLink.nextPath = path;
curLink = nextLink;
}
// in case there used to be more
delete curLink.nextPath;
curLink.value = value;
// we could recompute this on get, but it would have a cost and we optimize for `get`
curLink.journey = depToPaths(dependencies);
}
}
const EMPTY = [undefined, undefined];
function getEntities(state) {
const entityIsImmutable = isImmutable(state);
if (entityIsImmutable) {
return ({
key,
pk
}) => state.getIn([key, pk]);
} else {
return ({
key,
pk
}) => {
var _state$key;
return (_state$key = state[key]) == null ? void 0 : _state$key[pk];
};
}
}
function depToPaths(dependencies) {
return dependencies.map(dep => dep.path);
}
/** Link in a chain */
class Link {
constructor() {
this.children = new WeakMap();
this.next = new WeakMap();
}

@@ -145,57 +208,7 @@ }

/** Maps from a list of objects (referentially) to any value
*
* If *any* members of the list get claned up, so does that key/value pair get removed.
*/
class WeakListMap {
constructor() {
this.first = new WeakMap();
}
delete(key) {
const link = this.traverse(key);
link == null ? true : delete link.value;
return !!link;
}
get(key) {
const link = this.traverse(key);
return link == null ? void 0 : link.value;
}
has(key) {
const link = this.traverse(key);
if (!link) return false;
return Object.hasOwn(link, 'value');
}
set(key, value) {
if (key.length < 1) throw new KeySize();
let cur = this.first;
let link;
for (let i = 0; i < key.length; i++) {
if (!cur.has(key[i])) {
link = new Link();
cur.set(key[i], link);
} else {
link = cur.get(key[i]);
}
cur = link.children;
// do on later iteration of loop. this makes typescript happy rather than putting after loop
if (i === key.length - 1) {
link.value = value;
}
}
return this;
}
traverse(key) {
let cur = this.first;
let link;
for (let i = 0; i < key.length; i++) {
link = cur.get(key[i]);
if (!link) return;
cur = link.children;
}
return link;
}
}
const unvisitEntity = (entityOrId, schema, unvisit, getEntity, localCache, cycleCache, entityCache, dependencies, cycleIndex) => {
const entity = getEntity(entityOrId, schema);
const unvisitEntity = (entityOrId, schema, unvisit, getEntity, getCache, localCache, cycleCache, dependencies, cycleIndex) => {
const entity = typeof entityOrId === 'object' ? entityOrId : getEntity({
pk: entityOrId,
key: schema.key
});
if (typeof entity === 'symbol' && entity.toString().includes('DELETED')) {

@@ -228,45 +241,62 @@ return [undefined, true, true];

}
if (!(key in entityCache)) {
entityCache[key] = Object.create(null);
}
const localCacheKey = localCache[key];
const cycleCacheKey = cycleCache[key];
const entityCacheKey = entityCache[key];
let found = true;
let deleted = false;
// local cache lookup first
if (!localCacheKey[pk]) {
const trackingIndex = dependencies.length;
dependencies.push(entity);
let entityCopy;
if (schema.createIfValid) {
entityCopy = localCacheKey[pk] = isImmutable(entity) ? schema.createIfValid(entity.toObject()) : schema.createIfValid(entity);
// TODO(breaking): remove once old verions no longer supported
} else {
entityCopy = entity;
unvisit = withTrackedEntities(unvisit);
unvisit.setLocal = entityCopy => localCacheKey[pk] = entityCopy;
}
cycleCacheKey[pk] = trackingIndex;
if (entityCopy === undefined) {
// undefined indicates we should suspense (perhaps failed validation)
found = false;
deleted = true;
} else {
[localCacheKey[pk], found, deleted] = schema.denormalize(entityCopy, unvisit);
}
delete cycleCacheKey[pk];
const globalCacheEntry = getGlobalCacheEntry(entityCacheKey, pk);
const globalCache = getCache(pk, schema);
const [cacheValue] = globalCache.get(entity, getEntity);
// TODO: what if this just returned the deps - then we don't need to store them
// if in cycle, use the start of the cycle to track all deps
// otherwise, we use our own trackingIndex
const localKey = dependencies.slice(cycleIndex.i === -1 ? trackingIndex : cycleIndex.i);
if (!globalCacheEntry.has(localKey)) {
globalCacheEntry.set(localKey, localCacheKey[pk]);
} else {
localCacheKey[pk] = globalCacheEntry.get(localKey);
if (cacheValue) {
localCacheKey[pk] = cacheValue.value[0];
// TODO: can we store the cache values instead of tracking *all* their sources?
// this is only used for setting results cache correctly. if we got this far we will def need to set as we would have already tried getting it
dependencies.push(...cacheValue.dependencies);
return cacheValue.value;
}
// if we don't find in denormalize cache then do full denormalize
else {
const trackingIndex = dependencies.length;
dependencies.push({
entity,
path: {
key,
pk
}
});
let entityCopy;
if (schema.createIfValid) {
entityCopy = localCacheKey[pk] = isImmutable(entity) ? schema.createIfValid(entity.toObject()) : schema.createIfValid(entity);
// TODO(breaking): remove once old verions no longer supported
} else {
entityCopy = entity;
unvisit = withTrackedEntities(unvisit);
unvisit.setLocal = entityCopy => localCacheKey[pk] = entityCopy;
}
cycleCacheKey[pk] = trackingIndex;
if (entityCopy === undefined) {
// undefined indicates we should suspense (perhaps failed validation)
found = false;
deleted = true;
} else {
[localCacheKey[pk], found, deleted] = schema.denormalize(entityCopy, unvisit);
}
delete cycleCacheKey[pk];
// start of cycle - reset cycle detection
if (cycleIndex.i === trackingIndex) {
cycleIndex.i = -1;
// if in cycle, use the start of the cycle to track all deps
// otherwise, we use our own trackingIndex
const localKey = dependencies.slice(cycleIndex.i === -1 ? trackingIndex : cycleIndex.i);
const cacheValue = {
dependencies: localKey,
value: [localCacheKey[pk], found, deleted]
};
globalCache.set(localKey, cacheValue);
// start of cycle - reset cycle detection
if (cycleIndex.i === trackingIndex) {
cycleIndex.i = -1;
}
}

@@ -279,3 +309,9 @@ } else {

// with no cycle, globalCacheEntry will have already been set
dependencies.push(entity);
dependencies.push({
entity,
path: {
key,
pk
}
});
}

@@ -285,4 +321,6 @@ }

};
const getUnvisit = (entities, entityCache, resultCache, localCache) => {
const getUnvisit = (entities, entityCache, resultCache) => {
const getEntity = getEntities(entities);
const getCache = getEntityCaches(entityCache);
const localCache = {};
const dependencies = [];

@@ -301,2 +339,4 @@ const cycleIndex = {

const hasDenormalize = typeof schema.denormalize === 'function';
// deserialize fields (like Date)
if (!hasDenormalize && typeof schema === 'function') {

@@ -316,3 +356,3 @@ if (input instanceof schema) return [input, true, false];

if (isEntity(schema)) {
return unvisitEntity(input, schema, unvisit, getEntity, localCache, cycleCache, entityCache, dependencies, cycleIndex);
return unvisitEntity(input, schema, unvisit, getEntity, getCache, localCache, cycleCache, dependencies, cycleIndex);
}

@@ -324,50 +364,57 @@ if (hasDenormalize) {

}
//const wrappedUnvisit = withTrackedEntities(unvisit, globalKey);
return (input, schema) => {
const ret = unvisit(input, schema);
// in the case where WeakMap cannot be used
// this test ensures null is properly excluded from WeakMap
if (Object(input) !== input) return ret;
dependencies.push(input);
if (!resultCache.has(dependencies)) {
resultCache.set(dependencies, ret[0]);
return ret;
} else {
return [resultCache.get(dependencies), ret[1], ret[2]];
const cachable = Object(input) === input && Object(schema) === schema;
if (!cachable) {
const ret = unvisit(input, schema);
// this is faster than spread
// https://www.measurethat.net/Benchmarks/Show/23636/0/spread-with-tuples
return [ret[0], ret[1], ret[2], depToPaths(dependencies)];
}
let [ret, entityPaths] = resultCache.get(input, getEntity);
if (ret === undefined) {
ret = unvisit(input, schema);
// we want to do this before we add our 'input' entry
entityPaths = depToPaths(dependencies);
// for the first entry, `path` is ignored so empty members is fine
dependencies.unshift({
entity: input,
path: {
key: '',
pk: ''
}
});
resultCache.set(dependencies, ret);
}
return [ret[0], ret[1], ret[2], entityPaths];
};
};
const getEntities = entities => {
const entityIsImmutable = isImmutable(entities);
return (entityOrId, schema) => {
var _entities$schemaKey;
const schemaKey = schema.key;
if (typeof entityOrId === 'object') {
return entityOrId;
const getEntityCaches = entityCache => {
return (pk, schema) => {
const key = schema.key;
if (!(key in entityCache)) {
entityCache[key] = Object.create(null);
}
if (entityIsImmutable) {
return entities.getIn([schemaKey, entityOrId]);
const entityCacheKey = entityCache[key];
if (!entityCacheKey[pk]) entityCacheKey[pk] = new WeakMap();
let wem = entityCacheKey[pk].get(schema);
if (!wem) {
wem = new WeakEntityMap();
entityCacheKey[pk].set(schema, wem);
}
return (_entities$schemaKey = entities[schemaKey]) == null ? void 0 : _entities$schemaKey[entityOrId];
return wem;
};
};
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
const denormalize = (input, schema, entities, entityCache = {}, resultCache = new WeakListMap()) => {
const denormalize = (input, schema, entities, entityCache = {}, resultCache = new WeakEntityMap()) => {
// undefined mean don't do anything
if (schema === undefined) {
return [input, true, false, {}];
return [input, true, false, []];
}
if (input === undefined) {
return [undefined, false, false, {}];
return [undefined, false, false, []];
}
const resolvedEntities = {};
const unvisit = getUnvisit(entities, entityCache, resultCache, resolvedEntities);
return [...unvisit(input, schema), resolvedEntities];
return getUnvisit(entities, entityCache, resultCache)(input, schema);
};
function getGlobalCacheEntry(entityCache, id) {
if (!entityCache[id]) entityCache[id] = new WeakListMap();
return entityCache[id];
}

@@ -596,3 +643,3 @@ // TODO(breaking): remove once unused

exports.ExpiryStatus = ExpiryStatus;
exports.WeakListMap = WeakListMap;
exports.WeakEntityMap = WeakEntityMap;
exports.denormalize = denormalize;

@@ -599,0 +646,0 @@ exports.inferResults = inferResults;

@@ -5,5 +5,8 @@ import { isEntity } from './isEntity.js';

import { denormalize as objectDenormalize } from './schemas/Object.js';
import WeakListMap from './WeakListMap.js';
const unvisitEntity = (entityOrId, schema, unvisit, getEntity, localCache, cycleCache, entityCache, dependencies, cycleIndex) => {
const entity = getEntity(entityOrId, schema);
import WeakEntityMap, { getEntities, depToPaths } from './WeakEntityMap.js';
const unvisitEntity = (entityOrId, schema, unvisit, getEntity, getCache, localCache, cycleCache, dependencies, cycleIndex) => {
const entity = typeof entityOrId === 'object' ? entityOrId : getEntity({
pk: entityOrId,
key: schema.key
});
if (typeof entity === 'symbol' && entity.toString().includes('DELETED')) {

@@ -36,45 +39,62 @@ return [undefined, true, true];

}
if (!(key in entityCache)) {
entityCache[key] = Object.create(null);
}
const localCacheKey = localCache[key];
const cycleCacheKey = cycleCache[key];
const entityCacheKey = entityCache[key];
let found = true;
let deleted = false;
// local cache lookup first
if (!localCacheKey[pk]) {
const trackingIndex = dependencies.length;
dependencies.push(entity);
let entityCopy;
if (schema.createIfValid) {
entityCopy = localCacheKey[pk] = isImmutable(entity) ? schema.createIfValid(entity.toObject()) : schema.createIfValid(entity);
// TODO(breaking): remove once old verions no longer supported
} else {
entityCopy = entity;
unvisit = withTrackedEntities(unvisit);
unvisit.setLocal = entityCopy => localCacheKey[pk] = entityCopy;
}
cycleCacheKey[pk] = trackingIndex;
if (entityCopy === undefined) {
// undefined indicates we should suspense (perhaps failed validation)
found = false;
deleted = true;
} else {
[localCacheKey[pk], found, deleted] = schema.denormalize(entityCopy, unvisit);
}
delete cycleCacheKey[pk];
const globalCacheEntry = getGlobalCacheEntry(entityCacheKey, pk);
const globalCache = getCache(pk, schema);
const [cacheValue] = globalCache.get(entity, getEntity);
// TODO: what if this just returned the deps - then we don't need to store them
// if in cycle, use the start of the cycle to track all deps
// otherwise, we use our own trackingIndex
const localKey = dependencies.slice(cycleIndex.i === -1 ? trackingIndex : cycleIndex.i);
if (!globalCacheEntry.has(localKey)) {
globalCacheEntry.set(localKey, localCacheKey[pk]);
} else {
localCacheKey[pk] = globalCacheEntry.get(localKey);
if (cacheValue) {
localCacheKey[pk] = cacheValue.value[0];
// TODO: can we store the cache values instead of tracking *all* their sources?
// this is only used for setting results cache correctly. if we got this far we will def need to set as we would have already tried getting it
dependencies.push(...cacheValue.dependencies);
return cacheValue.value;
}
// if we don't find in denormalize cache then do full denormalize
else {
const trackingIndex = dependencies.length;
dependencies.push({
entity,
path: {
key,
pk
}
});
let entityCopy;
if (schema.createIfValid) {
entityCopy = localCacheKey[pk] = isImmutable(entity) ? schema.createIfValid(entity.toObject()) : schema.createIfValid(entity);
// TODO(breaking): remove once old verions no longer supported
} else {
entityCopy = entity;
unvisit = withTrackedEntities(unvisit);
unvisit.setLocal = entityCopy => localCacheKey[pk] = entityCopy;
}
cycleCacheKey[pk] = trackingIndex;
if (entityCopy === undefined) {
// undefined indicates we should suspense (perhaps failed validation)
found = false;
deleted = true;
} else {
[localCacheKey[pk], found, deleted] = schema.denormalize(entityCopy, unvisit);
}
delete cycleCacheKey[pk];
// start of cycle - reset cycle detection
if (cycleIndex.i === trackingIndex) {
cycleIndex.i = -1;
// if in cycle, use the start of the cycle to track all deps
// otherwise, we use our own trackingIndex
const localKey = dependencies.slice(cycleIndex.i === -1 ? trackingIndex : cycleIndex.i);
const cacheValue = {
dependencies: localKey,
value: [localCacheKey[pk], found, deleted]
};
globalCache.set(localKey, cacheValue);
// start of cycle - reset cycle detection
if (cycleIndex.i === trackingIndex) {
cycleIndex.i = -1;
}
}

@@ -87,3 +107,9 @@ } else {

// with no cycle, globalCacheEntry will have already been set
dependencies.push(entity);
dependencies.push({
entity,
path: {
key,
pk
}
});
}

@@ -93,4 +119,6 @@ }

};
const getUnvisit = (entities, entityCache, resultCache, localCache) => {
const getUnvisit = (entities, entityCache, resultCache) => {
const getEntity = getEntities(entities);
const getCache = getEntityCaches(entityCache);
const localCache = {};
const dependencies = [];

@@ -109,2 +137,4 @@ const cycleIndex = {

const hasDenormalize = typeof schema.denormalize === 'function';
// deserialize fields (like Date)
if (!hasDenormalize && typeof schema === 'function') {

@@ -124,3 +154,3 @@ if (input instanceof schema) return [input, true, false];

if (isEntity(schema)) {
return unvisitEntity(input, schema, unvisit, getEntity, localCache, cycleCache, entityCache, dependencies, cycleIndex);
return unvisitEntity(input, schema, unvisit, getEntity, getCache, localCache, cycleCache, dependencies, cycleIndex);
}

@@ -132,51 +162,58 @@ if (hasDenormalize) {

}
//const wrappedUnvisit = withTrackedEntities(unvisit, globalKey);
return (input, schema) => {
const ret = unvisit(input, schema);
// in the case where WeakMap cannot be used
// this test ensures null is properly excluded from WeakMap
if (Object(input) !== input) return ret;
dependencies.push(input);
if (!resultCache.has(dependencies)) {
resultCache.set(dependencies, ret[0]);
return ret;
} else {
return [resultCache.get(dependencies), ret[1], ret[2]];
const cachable = Object(input) === input && Object(schema) === schema;
if (!cachable) {
const ret = unvisit(input, schema);
// this is faster than spread
// https://www.measurethat.net/Benchmarks/Show/23636/0/spread-with-tuples
return [ret[0], ret[1], ret[2], depToPaths(dependencies)];
}
let [ret, entityPaths] = resultCache.get(input, getEntity);
if (ret === undefined) {
ret = unvisit(input, schema);
// we want to do this before we add our 'input' entry
entityPaths = depToPaths(dependencies);
// for the first entry, `path` is ignored so empty members is fine
dependencies.unshift({
entity: input,
path: {
key: '',
pk: ''
}
});
resultCache.set(dependencies, ret);
}
return [ret[0], ret[1], ret[2], entityPaths];
};
};
const getEntities = entities => {
const entityIsImmutable = isImmutable(entities);
return (entityOrId, schema) => {
var _entities$schemaKey;
const schemaKey = schema.key;
if (typeof entityOrId === 'object') {
return entityOrId;
const getEntityCaches = entityCache => {
return (pk, schema) => {
const key = schema.key;
if (!(key in entityCache)) {
entityCache[key] = Object.create(null);
}
if (entityIsImmutable) {
return entities.getIn([schemaKey, entityOrId]);
const entityCacheKey = entityCache[key];
if (!entityCacheKey[pk]) entityCacheKey[pk] = new WeakMap();
let wem = entityCacheKey[pk].get(schema);
if (!wem) {
wem = new WeakEntityMap();
entityCacheKey[pk].set(schema, wem);
}
return (_entities$schemaKey = entities[schemaKey]) == null ? void 0 : _entities$schemaKey[entityOrId];
return wem;
};
};
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export const denormalize = (input, schema, entities, entityCache = {}, resultCache = new WeakListMap()) => {
export const denormalize = (input, schema, entities, entityCache = {}, resultCache = new WeakEntityMap()) => {
// undefined mean don't do anything
if (schema === undefined) {
return [input, true, false, {}];
return [input, true, false, []];
}
if (input === undefined) {
return [undefined, false, false, {}];
return [undefined, false, false, []];
}
const resolvedEntities = {};
const unvisit = getUnvisit(entities, entityCache, resultCache, resolvedEntities);
return [...unvisit(input, schema), resolvedEntities];
return getUnvisit(entities, entityCache, resultCache)(input, schema);
};
export const denormalizeSimple = (input, schema, entities, entityCache = {}, resultCache = new WeakListMap()) => denormalize(input, schema, entities, entityCache, resultCache).slice(0, 3);
function getGlobalCacheEntry(entityCache, id) {
if (!entityCache[id]) entityCache[id] = new WeakListMap();
return entityCache[id];
}
export const denormalizeSimple = (input, schema, entities, entityCache, resultCache) => denormalize(input, schema, entities, entityCache, resultCache).slice(0, 3);

@@ -192,2 +229,2 @@ // TODO(breaking): remove once unused

}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0VudGl0eSIsImRlbm9ybWFsaXplIiwiYXJyYXlEZW5vcm1hbGl6ZSIsImlzSW1tdXRhYmxlIiwib2JqZWN0RGVub3JtYWxpemUiLCJXZWFrTGlzdE1hcCIsInVudmlzaXRFbnRpdHkiLCJlbnRpdHlPcklkIiwic2NoZW1hIiwidW52aXNpdCIsImdldEVudGl0eSIsImxvY2FsQ2FjaGUiLCJjeWNsZUNhY2hlIiwiZW50aXR5Q2FjaGUiLCJkZXBlbmRlbmNpZXMiLCJjeWNsZUluZGV4IiwiZW50aXR5IiwidG9TdHJpbmciLCJpbmNsdWRlcyIsInVuZGVmaW5lZCIsInBrIiwidG9KUyIsImtleSIsIk9iamVjdCIsImNyZWF0ZSIsImxvY2FsQ2FjaGVLZXkiLCJjeWNsZUNhY2hlS2V5IiwiZW50aXR5Q2FjaGVLZXkiLCJmb3VuZCIsImRlbGV0ZWQiLCJ0cmFja2luZ0luZGV4IiwibGVuZ3RoIiwicHVzaCIsImVudGl0eUNvcHkiLCJjcmVhdGVJZlZhbGlkIiwidG9PYmplY3QiLCJ3aXRoVHJhY2tlZEVudGl0aWVzIiwic2V0TG9jYWwiLCJnbG9iYWxDYWNoZUVudHJ5IiwiZ2V0R2xvYmFsQ2FjaGVFbnRyeSIsImxvY2FsS2V5Iiwic2xpY2UiLCJpIiwiaGFzIiwic2V0IiwiZ2V0IiwiZ2V0VW52aXNpdCIsImVudGl0aWVzIiwicmVzdWx0Q2FjaGUiLCJnZXRFbnRpdGllcyIsImlucHV0IiwiaGFzRGVub3JtYWxpemUiLCJtZXRob2QiLCJBcnJheSIsImlzQXJyYXkiLCJyZXQiLCJlbnRpdHlJc0ltbXV0YWJsZSIsInNjaGVtYUtleSIsImdldEluIiwicmVzb2x2ZWRFbnRpdGllcyIsImRlbm9ybWFsaXplU2ltcGxlIiwiaWQiLCJvcmlnaW5hbFVudmlzaXQiLCJvZyIsIndyYXBwZWRVbnZpc2l0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2Rlbm9ybWFsaXplLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hLCBFbnRpdHlJbnRlcmZhY2UsIFVudmlzaXRGdW5jdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlLmpzJztcbmltcG9ydCB7IGlzRW50aXR5IH0gZnJvbSAnLi9pc0VudGl0eS5qcyc7XG5pbXBvcnQgeyBkZW5vcm1hbGl6ZSBhcyBhcnJheURlbm9ybWFsaXplIH0gZnJvbSAnLi9zY2hlbWFzL0FycmF5LmpzJztcbmltcG9ydCB7IGlzSW1tdXRhYmxlIH0gZnJvbSAnLi9zY2hlbWFzL0ltbXV0YWJsZVV0aWxzLmpzJztcbmltcG9ydCB7IGRlbm9ybWFsaXplIGFzIG9iamVjdERlbm9ybWFsaXplIH0gZnJvbSAnLi9zY2hlbWFzL09iamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIERlbm9ybWFsaXplLFxuICBEZW5vcm1hbGl6ZU51bGxhYmxlLFxuICBEZW5vcm1hbGl6ZUNhY2hlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCBXZWFrTGlzdE1hcCBmcm9tICcuL1dlYWtMaXN0TWFwLmpzJztcblxuY29uc3QgdW52aXNpdEVudGl0eSA9IChcbiAgZW50aXR5T3JJZDogUmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZyxcbiAgc2NoZW1hOiBFbnRpdHlJbnRlcmZhY2UsXG4gIHVudmlzaXQ6IFVudmlzaXRGdW5jdGlvbixcbiAgZ2V0RW50aXR5OiAoXG4gICAgZW50aXR5T3JJZDogUmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZyxcbiAgICBzY2hlbWE6IEVudGl0eUludGVyZmFjZSxcbiAgKSA9PiBvYmplY3QgfCBzeW1ib2wsXG4gIGxvY2FsQ2FjaGU6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+LFxuICBjeWNsZUNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PixcbiAgZW50aXR5Q2FjaGU6IERlbm9ybWFsaXplQ2FjaGVbJ2VudGl0aWVzJ10sXG4gIGRlcGVuZGVuY2llczogb2JqZWN0W10sXG4gIGN5Y2xlSW5kZXg6IHsgaTogbnVtYmVyIH0sXG4pOiBbZGVub3JtYWxpemVkOiBvYmplY3QgfCB1bmRlZmluZWQsIGZvdW5kOiBib29sZWFuLCBkZWxldGVkOiBib29sZWFuXSA9PiB7XG4gIGNvbnN0IGVudGl0eSA9IGdldEVudGl0eShlbnRpdHlPcklkLCBzY2hlbWEpO1xuICBpZiAoXG4gICAgdHlwZW9mIGVudGl0eSA9PT0gJ3N5bWJvbCcgJiZcbiAgICAoZW50aXR5IGFzIHN5bWJvbCkudG9TdHJpbmcoKS5pbmNsdWRlcygnREVMRVRFRCcpXG4gICkge1xuICAgIHJldHVybiBbdW5kZWZpbmVkLCB0cnVlLCB0cnVlXTtcbiAgICAvLyBUT0RPOiBDaGFuZ2UgdG8gdGhpcyBhcyBicmVha2luZyBjaGFuZ2Ugb25jZSB3ZSBvbmx5IHN1cHBvcnQgbmV3ZXIgZW50aXRpZXNcbiAgICAvLyBhbHNvIHJlbW92ZSBgKGVudGl0eSBhcyBzeW1ib2wpLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0RFTEVURUQnKWAgYW5kIGRvIHRoaXMgZm9yIGFsbCBzeW1ib2xzXG4gICAgLy8gcmV0dXJuIHNjaGVtYS5kZW5vcm1hbGl6ZShlbnRpdHksIHVudmlzaXQpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbnRpdHkgIT09ICdvYmplY3QnIHx8IGVudGl0eSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBbZW50aXR5IGFzIGFueSwgZmFsc2UsIGZhbHNlXTtcbiAgfVxuXG4gIGNvbnN0IHBrID1cbiAgICAvLyBub3JtYWxpemUgbXVzdCBhbHdheXMgcGxhY2UgYSBzdHJpbmcsIGJlY2F1c2UgcGsoKSByZXR1cm4gdmFsdWUgaXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgLy8gdGhlcmVmb3JlIG5vIG5lZWQgdG8gY2hlY2sgZm9yIG51bWJlcnNcbiAgICB0eXBlb2YgZW50aXR5T3JJZCA9PT0gJ3N0cmluZydcbiAgICAgID8gZW50aXR5T3JJZFxuICAgICAgOiBzY2hlbWEucGsoaXNJbW11dGFibGUoZW50aXR5KSA/IChlbnRpdHkgYXMgYW55KS50b0pTKCkgOiBlbnRpdHkpO1xuICAvLyBpZiB3ZSBjYW4ndCBnZW5lcmF0ZSBhIHdvcmtpbmcgcGs7IHRoaXMgaXMgaG9wZWxlc3Mgc28gbGV0J3MgZ2l2ZSB0aGVtIHdoYXQncyBhbHJlYWR5IHRoZXJlXG4gIC8vIG90aGVyd2lzZSwgZXZlbiB3aGVuIHdlIGFyZW4ndCBkb2luZyBhIGxvb2t1cCB3ZSB3YW50IHRvIHR1cm4gdGhlIGVudGl0eU9ySWQgb2JqZWN0IGludG8gdGhlXG4gIC8vIGV4cGVjdGVkIGNsYXNzLCBhbmQgY2FjaGUgdGhhdCBjbGFzcyBmb3IgcmVmZXJlbnRpYWwgZXF1YWxpdHkuIFBLIGlzIHVzZWQgZm9yIGdsb2JhbCBlcXVhbGl0eSBsb29rdXAuXG4gIGlmIChwayA9PT0gdW5kZWZpbmVkIHx8IHBrID09PSAnJyB8fCBwayA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gW2VudGl0eSwgZmFsc2UsIGZhbHNlXTtcbiAgfVxuXG4gIGNvbnN0IGtleSA9IHNjaGVtYS5rZXk7XG4gIGlmICghKGtleSBpbiBsb2NhbENhY2hlKSkge1xuICAgIGxvY2FsQ2FjaGVba2V5XSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgaWYgKCEoa2V5IGluIGN5Y2xlQ2FjaGUpKSB7XG4gICAgY3ljbGVDYWNoZVtrZXldID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICBpZiAoIShrZXkgaW4gZW50aXR5Q2FjaGUpKSB7XG4gICAgZW50aXR5Q2FjaGVba2V5XSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgY29uc3QgbG9jYWxDYWNoZUtleSA9IGxvY2FsQ2FjaGVba2V5XTtcbiAgY29uc3QgY3ljbGVDYWNoZUtleSA9IGN5Y2xlQ2FjaGVba2V5XTtcbiAgY29uc3QgZW50aXR5Q2FjaGVLZXkgPSBlbnRpdHlDYWNoZVtrZXldO1xuXG4gIGxldCBmb3VuZCA9IHRydWU7XG4gIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgaWYgKCFsb2NhbENhY2hlS2V5W3BrXSkge1xuICAgIGNvbnN0IHRyYWNraW5nSW5kZXggPSBkZXBlbmRlbmNpZXMubGVuZ3RoO1xuICAgIGRlcGVuZGVuY2llcy5wdXNoKGVudGl0eSk7XG5cbiAgICBsZXQgZW50aXR5Q29weTogYW55O1xuICAgIGlmIChzY2hlbWEuY3JlYXRlSWZWYWxpZCkge1xuICAgICAgZW50aXR5Q29weSA9IGxvY2FsQ2FjaGVLZXlbcGtdID0gaXNJbW11dGFibGUoZW50aXR5KVxuICAgICAgICA/IHNjaGVtYS5jcmVhdGVJZlZhbGlkKGVudGl0eS50b09iamVjdCgpKVxuICAgICAgICA6IHNjaGVtYS5jcmVhdGVJZlZhbGlkKGVudGl0eSk7XG4gICAgICAvLyBUT0RPKGJyZWFraW5nKTogcmVtb3ZlIG9uY2Ugb2xkIHZlcmlvbnMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuICAgIH0gZWxzZSB7XG4gICAgICBlbnRpdHlDb3B5ID0gZW50aXR5O1xuICAgICAgdW52aXNpdCA9IHdpdGhUcmFja2VkRW50aXRpZXModW52aXNpdCk7XG4gICAgICB1bnZpc2l0LnNldExvY2FsID0gZW50aXR5Q29weSA9PiAobG9jYWxDYWNoZUtleVtwa10gPSBlbnRpdHlDb3B5KTtcbiAgICB9XG5cbiAgICBjeWNsZUNhY2hlS2V5W3BrXSA9IHRyYWNraW5nSW5kZXg7XG4gICAgaWYgKGVudGl0eUNvcHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gdW5kZWZpbmVkIGluZGljYXRlcyB3ZSBzaG91bGQgc3VzcGVuc2UgKHBlcmhhcHMgZmFpbGVkIHZhbGlkYXRpb24pXG4gICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIFtsb2NhbENhY2hlS2V5W3BrXSwgZm91bmQsIGRlbGV0ZWRdID0gc2NoZW1hLmRlbm9ybWFsaXplKFxuICAgICAgICBlbnRpdHlDb3B5LFxuICAgICAgICB1bnZpc2l0LFxuICAgICAgKTtcbiAgICB9XG4gICAgZGVsZXRlIGN5Y2xlQ2FjaGVLZXlbcGtdO1xuXG4gICAgY29uc3QgZ2xvYmFsQ2FjaGVFbnRyeSA9IGdldEdsb2JhbENhY2hlRW50cnkoZW50aXR5Q2FjaGVLZXksIHBrKTtcblxuICAgIC8vIGlmIGluIGN5Y2xlLCB1c2UgdGhlIHN0YXJ0IG9mIHRoZSBjeWNsZSB0byB0cmFjayBhbGwgZGVwc1xuICAgIC8vIG90aGVyd2lzZSwgd2UgdXNlIG91ciBvd24gdHJhY2tpbmdJbmRleFxuICAgIGNvbnN0IGxvY2FsS2V5ID0gZGVwZW5kZW5jaWVzLnNsaWNlKFxuICAgICAgY3ljbGVJbmRleC5pID09PSAtMSA/IHRyYWNraW5nSW5kZXggOiBjeWNsZUluZGV4LmksXG4gICAgKTtcblxuICAgIGlmICghZ2xvYmFsQ2FjaGVFbnRyeS5oYXMobG9jYWxLZXkpKSB7XG4gICAgICBnbG9iYWxDYWNoZUVudHJ5LnNldChsb2NhbEtleSwgbG9jYWxDYWNoZUtleVtwa10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbENhY2hlS2V5W3BrXSA9IGdsb2JhbENhY2hlRW50cnkuZ2V0KGxvY2FsS2V5KTtcbiAgICB9XG5cbiAgICAvLyBzdGFydCBvZiBjeWNsZSAtIHJlc2V0IGN5Y2xlIGRldGVjdGlvblxuICAgIGlmIChjeWNsZUluZGV4LmkgPT09IHRyYWNraW5nSW5kZXgpIHtcbiAgICAgIGN5Y2xlSW5kZXguaSA9IC0xO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBjeWNsZSBkZXRlY3RlZFxuICAgIGlmIChwayBpbiBjeWNsZUNhY2hlS2V5KSB7XG4gICAgICBjeWNsZUluZGV4LmkgPSBjeWNsZUNhY2hlS2V5W3BrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gd2l0aCBubyBjeWNsZSwgZ2xvYmFsQ2FjaGVFbnRyeSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHNldFxuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goZW50aXR5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2xvY2FsQ2FjaGVLZXlbcGtdLCBmb3VuZCwgZGVsZXRlZF07XG59O1xuXG5jb25zdCBnZXRVbnZpc2l0ID0gKFxuICBlbnRpdGllczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj4sXG4gIGVudGl0eUNhY2hlOiBEZW5vcm1hbGl6ZUNhY2hlWydlbnRpdGllcyddLFxuICByZXN1bHRDYWNoZTogV2Vha0xpc3RNYXA8b2JqZWN0LCBhbnk+LFxuICBsb2NhbENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PixcbikgPT4ge1xuICBjb25zdCBnZXRFbnRpdHkgPSBnZXRFbnRpdGllcyhlbnRpdGllcyk7XG4gIGNvbnN0IGRlcGVuZGVuY2llczogb2JqZWN0W10gPSBbXTtcbiAgY29uc3QgY3ljbGVJbmRleCA9IHsgaTogLTEgfTtcbiAgY29uc3QgY3ljbGVDYWNoZSA9IHt9O1xuXG4gIGZ1bmN0aW9uIHVudmlzaXQoXG4gICAgaW5wdXQ6IGFueSxcbiAgICBzY2hlbWE6IGFueSxcbiAgKTogW2Rlbm9ybWFsaXplZDogYW55LCBmb3VuZDogYm9vbGVhbiwgZGVsZXRlZDogYm9vbGVhbl0ge1xuICAgIGlmICghc2NoZW1hKSByZXR1cm4gW2lucHV0LCB0cnVlLCBmYWxzZV07XG5cbiAgICAvLyBudWxsIGlzIGNvbnNpZGVyZWQgaW50ZW50aW9uYWwsIHRodXMgYWx3YXlzICdmb3VuZCcgYXMgdHJ1ZVxuICAgIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtpbnB1dCwgdHJ1ZSwgZmFsc2VdO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0Rlbm9ybWFsaXplID0gdHlwZW9mIHNjaGVtYS5kZW5vcm1hbGl6ZSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIGlmICghaGFzRGVub3JtYWxpemUgJiYgdHlwZW9mIHNjaGVtYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2Ygc2NoZW1hKSByZXR1cm4gW2lucHV0LCB0cnVlLCBmYWxzZV07XG4gICAgICAvLyBmaWVsZCBkZXNlcmlhbGl6YXRpb24gc2hvdWxkIG5ldmVyIGNvdW50IGFnYWluc3QgJ2ZvdW5kJyAod2hldGhlciB0byB1c2VkIGluZmVycmVkIHJlc3VsdHMpXG4gICAgICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtpbnB1dCwgdHJ1ZSwgZmFsc2VdO1xuICAgICAgcmV0dXJuIFtuZXcgc2NoZW1hKGlucHV0KSwgdHJ1ZSwgZmFsc2VdO1xuICAgIH1cblxuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gW2lucHV0LCBmYWxzZSwgZmFsc2VdO1xuICAgIH1cblxuICAgIGlmICghaGFzRGVub3JtYWxpemUgJiYgdHlwZW9mIHNjaGVtYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IEFycmF5LmlzQXJyYXkoc2NoZW1hKVxuICAgICAgICA/IGFycmF5RGVub3JtYWxpemVcbiAgICAgICAgOiBvYmplY3REZW5vcm1hbGl6ZTtcbiAgICAgIHJldHVybiBtZXRob2Qoc2NoZW1hLCBpbnB1dCwgdW52aXNpdCk7XG4gICAgfVxuXG4gICAgaWYgKGlzRW50aXR5KHNjaGVtYSkpIHtcbiAgICAgIHJldHVybiB1bnZpc2l0RW50aXR5KFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICB1bnZpc2l0LFxuICAgICAgICBnZXRFbnRpdHksXG4gICAgICAgIGxvY2FsQ2FjaGUsXG4gICAgICAgIGN5Y2xlQ2FjaGUsXG4gICAgICAgIGVudGl0eUNhY2hlLFxuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIGN5Y2xlSW5kZXgsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChoYXNEZW5vcm1hbGl6ZSkge1xuICAgICAgcmV0dXJuIHNjaGVtYS5kZW5vcm1hbGl6ZShpbnB1dCwgdW52aXNpdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtpbnB1dCwgdHJ1ZSwgZmFsc2VdO1xuICB9XG5cbiAgLy9jb25zdCB3cmFwcGVkVW52aXNpdCA9IHdpdGhUcmFja2VkRW50aXRpZXModW52aXNpdCwgZ2xvYmFsS2V5KTtcblxuICByZXR1cm4gKFxuICAgIGlucHV0OiBhbnksXG4gICAgc2NoZW1hOiBhbnksXG4gICk6IFtkZW5vcm1hbGl6ZWQ6IGFueSwgZm91bmQ6IGJvb2xlYW4sIGRlbGV0ZWQ6IGJvb2xlYW5dID0+IHtcbiAgICBjb25zdCByZXQgPSB1bnZpc2l0KGlucHV0LCBzY2hlbWEpO1xuICAgIC8vIGluIHRoZSBjYXNlIHdoZXJlIFdlYWtNYXAgY2Fubm90IGJlIHVzZWRcbiAgICAvLyB0aGlzIHRlc3QgZW5zdXJlcyBudWxsIGlzIHByb3Blcmx5IGV4Y2x1ZGVkIGZyb20gV2Vha01hcFxuICAgIGlmIChPYmplY3QoaW5wdXQpICE9PSBpbnB1dCkgcmV0dXJuIHJldDtcblxuICAgIGRlcGVuZGVuY2llcy5wdXNoKGlucHV0KTtcbiAgICBpZiAoIXJlc3VsdENhY2hlLmhhcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICByZXN1bHRDYWNoZS5zZXQoZGVwZW5kZW5jaWVzLCByZXRbMF0pO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtyZXN1bHRDYWNoZS5nZXQoZGVwZW5kZW5jaWVzKSwgcmV0WzFdLCByZXRbMl1dO1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IGdldEVudGl0aWVzID0gKGVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7XG4gIGNvbnN0IGVudGl0eUlzSW1tdXRhYmxlID0gaXNJbW11dGFibGUoZW50aXRpZXMpO1xuXG4gIHJldHVybiAoXG4gICAgZW50aXR5T3JJZDogUmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZyxcbiAgICBzY2hlbWE6IEVudGl0eUludGVyZmFjZSxcbiAgKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hS2V5ID0gc2NoZW1hLmtleTtcblxuICAgIGlmICh0eXBlb2YgZW50aXR5T3JJZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBlbnRpdHlPcklkO1xuICAgIH1cblxuICAgIGlmIChlbnRpdHlJc0ltbXV0YWJsZSkge1xuICAgICAgcmV0dXJuIGVudGl0aWVzLmdldEluKFtzY2hlbWFLZXksIGVudGl0eU9ySWRdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXRpZXNbc2NoZW1hS2V5XT8uW2VudGl0eU9ySWRdO1xuICB9O1xufTtcblxudHlwZSBEZW5vcm1hbGl6ZVJldHVybjxTIGV4dGVuZHMgU2NoZW1hPiA9XG4gIHwgW1xuICAgICAgZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZTxTPixcbiAgICAgIGZvdW5kOiB0cnVlLFxuICAgICAgZGVsZXRlZDogZmFsc2UsXG4gICAgICByZXNvbHZlZEVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PixcbiAgICBdXG4gIHwgW1xuICAgICAgZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+LFxuICAgICAgZm91bmQ6IGJvb2xlYW4sXG4gICAgICBkZWxldGVkOiB0cnVlLFxuICAgICAgcmVzb2x2ZWRFbnRpdGllczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj4sXG4gICAgXVxuICB8IFtcbiAgICAgIGRlbm9ybWFsaXplZDogRGVub3JtYWxpemVOdWxsYWJsZTxTPixcbiAgICAgIGZvdW5kOiBmYWxzZSxcbiAgICAgIGRlbGV0ZWQ6IGJvb2xlYW4sXG4gICAgICByZXNvbHZlZEVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PixcbiAgICBdO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZXhwb3J0IGNvbnN0IGRlbm9ybWFsaXplID0gPFMgZXh0ZW5kcyBTY2hlbWE+KFxuICBpbnB1dDogdW5rbm93bixcbiAgc2NoZW1hOiBTIHwgdW5kZWZpbmVkLFxuICBlbnRpdGllczogYW55LFxuICBlbnRpdHlDYWNoZTogRGVub3JtYWxpemVDYWNoZVsnZW50aXRpZXMnXSA9IHt9LFxuICByZXN1bHRDYWNoZTogV2Vha0xpc3RNYXA8b2JqZWN0LCBhbnk+ID0gbmV3IFdlYWtMaXN0TWFwKCksXG4pOiBEZW5vcm1hbGl6ZVJldHVybjxTPiA9PiB7XG4gIC8vIHVuZGVmaW5lZCBtZWFuIGRvbid0IGRvIGFueXRoaW5nXG4gIGlmIChzY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbaW5wdXQsIHRydWUsIGZhbHNlLCB7fV0gYXMgW2FueSwgYm9vbGVhbiwgYm9vbGVhbiwgYW55XTtcbiAgfVxuICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbdW5kZWZpbmVkLCBmYWxzZSwgZmFsc2UsIHt9XSBhcyBbYW55LCBib29sZWFuLCBib29sZWFuLCBhbnldO1xuICB9XG4gIGNvbnN0IHJlc29sdmVkRW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge307XG4gIGNvbnN0IHVudmlzaXQgPSBnZXRVbnZpc2l0KFxuICAgIGVudGl0aWVzLFxuICAgIGVudGl0eUNhY2hlLFxuICAgIHJlc3VsdENhY2hlLFxuICAgIHJlc29sdmVkRW50aXRpZXMsXG4gICk7XG4gIHJldHVybiBbLi4udW52aXNpdChpbnB1dCwgc2NoZW1hKSwgcmVzb2x2ZWRFbnRpdGllc10gYXMgW1xuICAgIGFueSxcbiAgICBib29sZWFuLFxuICAgIGJvb2xlYW4sXG4gICAgYW55LFxuICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbm9ybWFsaXplU2ltcGxlID0gPFMgZXh0ZW5kcyBTY2hlbWE+KFxuICBpbnB1dDogYW55LFxuICBzY2hlbWE6IFMgfCB1bmRlZmluZWQsXG4gIGVudGl0aWVzOiBhbnksXG4gIGVudGl0eUNhY2hlOiBEZW5vcm1hbGl6ZUNhY2hlWydlbnRpdGllcyddID0ge30sXG4gIHJlc3VsdENhY2hlOiBXZWFrTGlzdE1hcDxvYmplY3QsIGFueT4gPSBuZXcgV2Vha0xpc3RNYXAoKSxcbik6XG4gIHwgW2Rlbm9ybWFsaXplZDogRGVub3JtYWxpemU8Uz4sIGZvdW5kOiB0cnVlLCBkZWxldGVkOiBmYWxzZV1cbiAgfCBbZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+LCBmb3VuZDogYm9vbGVhbiwgZGVsZXRlZDogdHJ1ZV1cbiAgfCBbZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+LCBmb3VuZDogZmFsc2UsIGRlbGV0ZWQ6IGJvb2xlYW5dID0+XG4gIGRlbm9ybWFsaXplKGlucHV0LCBzY2hlbWEsIGVudGl0aWVzLCBlbnRpdHlDYWNoZSwgcmVzdWx0Q2FjaGUpLnNsaWNlKFxuICAgIDAsXG4gICAgMyxcbiAgKSBhcyBhbnk7XG5cbmZ1bmN0aW9uIGdldEdsb2JhbENhY2hlRW50cnkoXG4gIGVudGl0eUNhY2hlOiB7IFtwazogc3RyaW5nXTogV2Vha0xpc3RNYXA8b2JqZWN0LCBFbnRpdHlJbnRlcmZhY2U8YW55Pj4gfSxcblxuICBpZDogYW55LFxuKSB7XG4gIGlmICghZW50aXR5Q2FjaGVbaWRdKSBlbnRpdHlDYWNoZVtpZF0gPSBuZXcgV2Vha0xpc3RNYXAoKTtcbiAgcmV0dXJuIGVudGl0eUNhY2hlW2lkXTtcbn1cblxuLy8gVE9ETyhicmVha2luZyk6IHJlbW92ZSBvbmNlIHVudXNlZFxuZnVuY3Rpb24gd2l0aFRyYWNrZWRFbnRpdGllcyh1bnZpc2l0OiBVbnZpc2l0RnVuY3Rpb24pOiBVbnZpc2l0RnVuY3Rpb24ge1xuICAvLyBldmVyeSB0aW1lIHdlIG5lc3QsIHdlIHdhbnQgdG8gdW53cmFwIGJhY2sgdG8gdGhlIHRvcC5cbiAgLy8gdGhpcyBpcyBkdWUgdG8gb25seSBuZWVkZWQgdGhlIG5leHQgbGV2ZWwgb2YgbmVzdGVkIGVudGl0aWVzIGZvciBsb29rdXBcbiAgY29uc3Qgb3JpZ2luYWxVbnZpc2l0ID0gdW52aXNpdC5vZyB8fCB1bnZpc2l0O1xuICBjb25zdCB3cmFwcGVkVW52aXNpdCA9IChpbnB1dDogYW55LCBzY2hlbWE6IGFueSkgPT5cbiAgICBvcmlnaW5hbFVudmlzaXQoaW5wdXQsIHNjaGVtYSk7XG4gIHdyYXBwZWRVbnZpc2l0Lm9nID0gdW52aXNpdDtcbiAgcmV0dXJuIHdyYXBwZWRVbnZpc2l0O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxRQUFRLFFBQVEsZUFBZTtBQUN4QyxTQUFTQyxXQUFXLElBQUlDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUNwRSxTQUFTQyxXQUFXLFFBQVEsNkJBQTZCO0FBQ3pELFNBQVNGLFdBQVcsSUFBSUcsaUJBQWlCLFFBQVEscUJBQXFCO0FBTXRFLE9BQU9DLFdBQVcsTUFBTSxrQkFBa0I7QUFFMUMsTUFBTUMsYUFBYSxHQUFHLENBQ3BCQyxVQUF3QyxFQUN4Q0MsTUFBdUIsRUFDdkJDLE9BQXdCLEVBQ3hCQyxTQUdvQixFQUNwQkMsVUFBK0MsRUFDL0NDLFVBQWtELEVBQ2xEQyxXQUF5QyxFQUN6Q0MsWUFBc0IsRUFDdEJDLFVBQXlCLEtBQ2dEO0VBQ3pFLE1BQU1DLE1BQU0sR0FBR04sU0FBUyxDQUFDSCxVQUFVLEVBQUVDLE1BQU0sQ0FBQztFQUM1QyxJQUNFLE9BQU9RLE1BQU0sS0FBSyxRQUFRLElBQ3pCQSxNQUFNLENBQVlDLFFBQVEsRUFBRSxDQUFDQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQ2pEO0lBQ0EsT0FBTyxDQUFDQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztJQUM5QjtJQUNBO0lBQ0E7RUFDRjs7RUFFQSxJQUFJLE9BQU9ILE1BQU0sS0FBSyxRQUFRLElBQUlBLE1BQU0sS0FBSyxJQUFJLEVBQUU7SUFDakQsT0FBTyxDQUFDQSxNQUFNLEVBQVMsS0FBSyxFQUFFLEtBQUssQ0FBQztFQUN0QztFQUVBLE1BQU1JLEVBQUU7RUFDTjtFQUNBO0VBQ0EsT0FBT2IsVUFBVSxLQUFLLFFBQVEsR0FDMUJBLFVBQVUsR0FDVkMsTUFBTSxDQUFDWSxFQUFFLENBQUNqQixXQUFXLENBQUNhLE1BQU0sQ0FBQyxHQUFJQSxNQUFNLENBQVNLLElBQUksRUFBRSxHQUFHTCxN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
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0VudGl0eSIsImRlbm9ybWFsaXplIiwiYXJyYXlEZW5vcm1hbGl6ZSIsImlzSW1tdXRhYmxlIiwib2JqZWN0RGVub3JtYWxpemUiLCJXZWFrRW50aXR5TWFwIiwiZ2V0RW50aXRpZXMiLCJkZXBUb1BhdGhzIiwidW52aXNpdEVudGl0eSIsImVudGl0eU9ySWQiLCJzY2hlbWEiLCJ1bnZpc2l0IiwiZ2V0RW50aXR5IiwiZ2V0Q2FjaGUiLCJsb2NhbENhY2hlIiwiY3ljbGVDYWNoZSIsImRlcGVuZGVuY2llcyIsImN5Y2xlSW5kZXgiLCJlbnRpdHkiLCJwayIsImtleSIsInRvU3RyaW5nIiwiaW5jbHVkZXMiLCJ1bmRlZmluZWQiLCJ0b0pTIiwiT2JqZWN0IiwiY3JlYXRlIiwibG9jYWxDYWNoZUtleSIsImN5Y2xlQ2FjaGVLZXkiLCJmb3VuZCIsImRlbGV0ZWQiLCJnbG9iYWxDYWNoZSIsImNhY2hlVmFsdWUiLCJnZXQiLCJ2YWx1ZSIsInB1c2giLCJ0cmFja2luZ0luZGV4IiwibGVuZ3RoIiwicGF0aCIsImVudGl0eUNvcHkiLCJjcmVhdGVJZlZhbGlkIiwidG9PYmplY3QiLCJ3aXRoVHJhY2tlZEVudGl0aWVzIiwic2V0TG9jYWwiLCJsb2NhbEtleSIsInNsaWNlIiwiaSIsInNldCIsImdldFVudmlzaXQiLCJlbnRpdGllcyIsImVudGl0eUNhY2hlIiwicmVzdWx0Q2FjaGUiLCJnZXRFbnRpdHlDYWNoZXMiLCJpbnB1dCIsImhhc0Rlbm9ybWFsaXplIiwibWV0aG9kIiwiQXJyYXkiLCJpc0FycmF5IiwiY2FjaGFibGUiLCJyZXQiLCJlbnRpdHlQYXRocyIsInVuc2hpZnQiLCJlbnRpdHlDYWNoZUtleSIsIldlYWtNYXAiLCJ3ZW0iLCJkZW5vcm1hbGl6ZVNpbXBsZSIsIm9yaWdpbmFsVW52aXNpdCIsIm9nIiwid3JhcHBlZFVudmlzaXQiXSwic291cmNlcyI6WyIuLi9zcmMvZGVub3JtYWxpemUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTY2hlbWEsIEVudGl0eUludGVyZmFjZSwgVW52aXNpdEZ1bmN0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2UuanMnO1xuaW1wb3J0IHsgaXNFbnRpdHkgfSBmcm9tICcuL2lzRW50aXR5LmpzJztcbmltcG9ydCB7IGRlbm9ybWFsaXplIGFzIGFycmF5RGVub3JtYWxpemUgfSBmcm9tICcuL3NjaGVtYXMvQXJyYXkuanMnO1xuaW1wb3J0IHsgaXNJbW11dGFibGUgfSBmcm9tICcuL3NjaGVtYXMvSW1tdXRhYmxlVXRpbHMuanMnO1xuaW1wb3J0IHsgZGVub3JtYWxpemUgYXMgb2JqZWN0RGVub3JtYWxpemUgfSBmcm9tICcuL3NjaGVtYXMvT2JqZWN0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRGVub3JtYWxpemUsXG4gIERlbm9ybWFsaXplTnVsbGFibGUsXG4gIERlbm9ybWFsaXplQ2FjaGUsXG4gIFBhdGgsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IFdlYWtFbnRpdHlNYXAsIHtcbiAgdHlwZSBEZXAsXG4gIGdldEVudGl0aWVzLFxuICB0eXBlIEdldEVudGl0eSxcbiAgZGVwVG9QYXRocyxcbn0gZnJvbSAnLi9XZWFrRW50aXR5TWFwLmpzJztcblxuaW50ZXJmYWNlIEVudGl0eUNhY2hlVmFsdWUge1xuICBkZXBlbmRlbmNpZXM6IERlcFtdO1xuICB2YWx1ZTogW2FueSwgYm9vbGVhbiwgYm9vbGVhbl07XG59XG5jb25zdCB1bnZpc2l0RW50aXR5ID0gKFxuICBlbnRpdHlPcklkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgc3RyaW5nLFxuICBzY2hlbWE6IEVudGl0eUludGVyZmFjZSxcbiAgdW52aXNpdDogVW52aXNpdEZ1bmN0aW9uLFxuICBnZXRFbnRpdHk6IEdldEVudGl0eSxcbiAgZ2V0Q2FjaGU6IFJldHVyblR5cGU8dHlwZW9mIGdldEVudGl0eUNhY2hlcz4sXG4gIGxvY2FsQ2FjaGU6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+LFxuICBjeWNsZUNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PixcbiAgZGVwZW5kZW5jaWVzOiBEZXBbXSxcbiAgY3ljbGVJbmRleDogeyBpOiBudW1iZXIgfSxcbik6IFtkZW5vcm1hbGl6ZWQ6IG9iamVjdCB8IHVuZGVmaW5lZCwgZm91bmQ6IGJvb2xlYW4sIGRlbGV0ZWQ6IGJvb2xlYW5dID0+IHtcbiAgY29uc3QgZW50aXR5ID1cbiAgICB0eXBlb2YgZW50aXR5T3JJZCA9PT0gJ29iamVjdCdcbiAgICAgID8gZW50aXR5T3JJZFxuICAgICAgOiBnZXRFbnRpdHkoeyBwazogZW50aXR5T3JJZCwga2V5OiBzY2hlbWEua2V5IH0pO1xuICBpZiAoXG4gICAgdHlwZW9mIGVudGl0eSA9PT0gJ3N5bWJvbCcgJiZcbiAgICAoZW50aXR5IGFzIHN5bWJvbCkudG9TdHJpbmcoKS5pbmNsdWRlcygnREVMRVRFRCcpXG4gICkge1xuICAgIHJldHVybiBbdW5kZWZpbmVkLCB0cnVlLCB0cnVlXTtcbiAgICAvLyBUT0RPOiBDaGFuZ2UgdG8gdGhpcyBhcyBicmVha2luZyBjaGFuZ2Ugb25jZSB3ZSBvbmx5IHN1cHBvcnQgbmV3ZXIgZW50aXRpZXNcbiAgICAvLyBhbHNvIHJlbW92ZSBgKGVudGl0eSBhcyBzeW1ib2wpLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0RFTEVURUQnKWAgYW5kIGRvIHRoaXMgZm9yIGFsbCBzeW1ib2xzXG4gICAgLy8gcmV0dXJuIHNjaGVtYS5kZW5vcm1hbGl6ZShlbnRpdHksIHVudmlzaXQpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbnRpdHkgIT09ICdvYmplY3QnIHx8IGVudGl0eSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBbZW50aXR5IGFzIGFueSwgZmFsc2UsIGZhbHNlXTtcbiAgfVxuXG4gIGNvbnN0IHBrID1cbiAgICAvLyBub3JtYWxpemUgbXVzdCBhbHdheXMgcGxhY2UgYSBzdHJpbmcsIGJlY2F1c2UgcGsoKSByZXR1cm4gdmFsdWUgaXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgLy8gdGhlcmVmb3JlIG5vIG5lZWQgdG8gY2hlY2sgZm9yIG51bWJlcnNcbiAgICB0eXBlb2YgZW50aXR5T3JJZCA9PT0gJ3N0cmluZydcbiAgICAgID8gZW50aXR5T3JJZFxuICAgICAgOiBzY2hlbWEucGsoaXNJbW11dGFibGUoZW50aXR5KSA/IChlbnRpdHkgYXMgYW55KS50b0pTKCkgOiBlbnRpdHkpO1xuICAvLyBpZiB3ZSBjYW4ndCBnZW5lcmF0ZSBhIHdvcmtpbmcgcGs7IHRoaXMgaXMgaG9wZWxlc3Mgc28gbGV0J3MgZ2l2ZSB0aGVtIHdoYXQncyBhbHJlYWR5IHRoZXJlXG4gIC8vIG90aGVyd2lzZSwgZXZlbiB3aGVuIHdlIGFyZW4ndCBkb2luZyBhIGxvb2t1cCB3ZSB3YW50IHRvIHR1cm4gdGhlIGVudGl0eU9ySWQgb2JqZWN0IGludG8gdGhlXG4gIC8vIGV4cGVjdGVkIGNsYXNzLCBhbmQgY2FjaGUgdGhhdCBjbGFzcyBmb3IgcmVmZXJlbnRpYWwgZXF1YWxpdHkuIFBLIGlzIHVzZWQgZm9yIGdsb2JhbCBlcXVhbGl0eSBsb29rdXAuXG4gIGlmIChwayA9PT0gdW5kZWZpbmVkIHx8IHBrID09PSAnJyB8fCBwayA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gW2VudGl0eSwgZmFsc2UsIGZhbHNlXTtcbiAgfVxuXG4gIGNvbnN0IGtleSA9IHNjaGVtYS5rZXk7XG4gIGlmICghKGtleSBpbiBsb2NhbENhY2hlKSkge1xuICAgIGxvY2FsQ2FjaGVba2V5XSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgaWYgKCEoa2V5IGluIGN5Y2xlQ2FjaGUpKSB7XG4gICAgY3ljbGVDYWNoZVtrZXldID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICBjb25zdCBsb2NhbENhY2hlS2V5ID0gbG9jYWxDYWNoZVtrZXldO1xuICBjb25zdCBjeWNsZUNhY2hlS2V5ID0gY3ljbGVDYWNoZVtrZXldO1xuXG4gIGxldCBmb3VuZCA9IHRydWU7XG4gIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgLy8gbG9jYWwgY2FjaGUgbG9va3VwIGZpcnN0XG4gIGlmICghbG9jYWxDYWNoZUtleVtwa10pIHtcbiAgICBjb25zdCBnbG9iYWxDYWNoZTogV2Vha0VudGl0eU1hcDxvYmplY3QsIEVudGl0eUNhY2hlVmFsdWU+ID0gZ2V0Q2FjaGUoXG4gICAgICBwayxcbiAgICAgIHNjaGVtYSxcbiAgICApO1xuICAgIGNvbnN0IFtjYWNoZVZhbHVlXSA9IGdsb2JhbENhY2hlLmdldChlbnRpdHksIGdldEVudGl0eSk7XG4gICAgLy8gVE9ETzogd2hhdCBpZiB0aGlzIGp1c3QgcmV0dXJuZWQgdGhlIGRlcHMgLSB0aGVuIHdlIGRvbid0IG5lZWQgdG8gc3RvcmUgdGhlbVxuXG4gICAgaWYgKGNhY2hlVmFsdWUpIHtcbiAgICAgIGxvY2FsQ2FjaGVLZXlbcGtdID0gY2FjaGVWYWx1ZS52YWx1ZVswXTtcbiAgICAgIC8vIFRPRE86IGNhbiB3ZSBzdG9yZSB0aGUgY2FjaGUgdmFsdWVzIGluc3RlYWQgb2YgdHJhY2tpbmcgKmFsbCogdGhlaXIgc291cmNlcz9cbiAgICAgIC8vIHRoaXMgaXMgb25seSB1c2VkIGZvciBzZXR0aW5nIHJlc3VsdHMgY2FjaGUgY29ycmVjdGx5LiBpZiB3ZSBnb3QgdGhpcyBmYXIgd2Ugd2lsbCBkZWYgbmVlZCB0byBzZXQgYXMgd2Ugd291bGQgaGF2ZSBhbHJlYWR5IHRyaWVkIGdldHRpbmcgaXRcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKC4uLmNhY2hlVmFsdWUuZGVwZW5kZW5jaWVzKTtcbiAgICAgIHJldHVybiBjYWNoZVZhbHVlLnZhbHVlO1xuICAgIH1cbiAgICAvLyBpZiB3ZSBkb24ndCBmaW5kIGluIGRlbm9ybWFsaXplIGNhY2hlIHRoZW4gZG8gZnVsbCBkZW5vcm1hbGl6ZVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgdHJhY2tpbmdJbmRleCA9IGRlcGVuZGVuY2llcy5sZW5ndGg7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCh7IGVudGl0eSwgcGF0aDogeyBrZXksIHBrIH0gfSk7XG5cbiAgICAgIGxldCBlbnRpdHlDb3B5OiBhbnk7XG4gICAgICBpZiAoc2NoZW1hLmNyZWF0ZUlmVmFsaWQpIHtcbiAgICAgICAgZW50aXR5Q29weSA9IGxvY2FsQ2FjaGVLZXlbcGtdID0gaXNJbW11dGFibGUoZW50aXR5KVxuICAgICAgICAgID8gc2NoZW1hLmNyZWF0ZUlmVmFsaWQoZW50aXR5LnRvT2JqZWN0KCkpXG4gICAgICAgICAgOiBzY2hlbWEuY3JlYXRlSWZWYWxpZChlbnRpdHkpO1xuICAgICAgICAvLyBUT0RPKGJyZWFraW5nKTogcmVtb3ZlIG9uY2Ugb2xkIHZlcmlvbnMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50aXR5Q29weSA9IGVudGl0eTtcbiAgICAgICAgdW52aXNpdCA9IHdpdGhUcmFja2VkRW50aXRpZXModW52aXNpdCk7XG4gICAgICAgIHVudmlzaXQuc2V0TG9jYWwgPSBlbnRpdHlDb3B5ID0+IChsb2NhbENhY2hlS2V5W3BrXSA9IGVudGl0eUNvcHkpO1xuICAgICAgfVxuXG4gICAgICBjeWNsZUNhY2hlS2V5W3BrXSA9IHRyYWNraW5nSW5kZXg7XG4gICAgICBpZiAoZW50aXR5Q29weSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHVuZGVmaW5lZCBpbmRpY2F0ZXMgd2Ugc2hvdWxkIHN1c3BlbnNlIChwZXJoYXBzIGZhaWxlZCB2YWxpZGF0aW9uKVxuICAgICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFtsb2NhbENhY2hlS2V5W3BrXSwgZm91bmQsIGRlbGV0ZWRdID0gc2NoZW1hLmRlbm9ybWFsaXplKFxuICAgICAgICAgIGVudGl0eUNvcHksXG4gICAgICAgICAgdW52aXNpdCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBjeWNsZUNhY2hlS2V5W3BrXTtcblxuICAgICAgLy8gaWYgaW4gY3ljbGUsIHVzZSB0aGUgc3RhcnQgb2YgdGhlIGN5Y2xlIHRvIHRyYWNrIGFsbCBkZXBzXG4gICAgICAvLyBvdGhlcndpc2UsIHdlIHVzZSBvdXIgb3duIHRyYWNraW5nSW5kZXhcbiAgICAgIGNvbnN0IGxvY2FsS2V5ID0gZGVwZW5kZW5jaWVzLnNsaWNlKFxuICAgICAgICBjeWNsZUluZGV4LmkgPT09IC0xID8gdHJhY2tpbmdJbmRleCA6IGN5Y2xlSW5kZXguaSxcbiAgICAgICk7XG4gICAgICBjb25zdCBjYWNoZVZhbHVlOiBFbnRpdHlDYWNoZVZhbHVlID0ge1xuICAgICAgICBkZXBlbmRlbmNpZXM6IGxvY2FsS2V5LFxuICAgICAgICB2YWx1ZTogW2xvY2FsQ2FjaGVLZXlbcGtdLCBmb3VuZCwgZGVsZXRlZF0sXG4gICAgICB9O1xuICAgICAgZ2xvYmFsQ2FjaGUuc2V0KGxvY2FsS2V5LCBjYWNoZVZhbHVlKTtcblxuICAgICAgLy8gc3RhcnQgb2YgY3ljbGUgLSByZXNldCBjeWNsZSBkZXRlY3Rpb25cbiAgICAgIGlmIChjeWNsZUluZGV4LmkgPT09IHRyYWNraW5nSW5kZXgpIHtcbiAgICAgICAgY3ljbGVJbmRleC5pID0gLTE7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGN5Y2xlIGRldGVjdGVkXG4gICAgaWYgKHBrIGluIGN5Y2xlQ2FjaGVLZXkpIHtcbiAgICAgIGN5Y2xlSW5kZXguaSA9IGN5Y2xlQ2FjaGVLZXlbcGtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB3aXRoIG5vIGN5Y2xlLCBnbG9iYWxDYWNoZUVudHJ5IHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCh7IGVudGl0eSwgcGF0aDogeyBrZXksIHBrIH0gfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtsb2NhbENhY2hlS2V5W3BrXSwgZm91bmQsIGRlbGV0ZWRdO1xufTtcblxuY29uc3QgZ2V0VW52aXNpdCA9IChcbiAgZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+LFxuICBlbnRpdHlDYWNoZTogRGVub3JtYWxpemVDYWNoZVsnZW50aXRpZXMnXSxcbiAgcmVzdWx0Q2FjaGU6IERlbm9ybWFsaXplQ2FjaGVbJ3Jlc3VsdHMnXVtzdHJpbmddLFxuKSA9PiB7XG4gIGNvbnN0IGdldEVudGl0eSA9IGdldEVudGl0aWVzKGVudGl0aWVzKTtcbiAgY29uc3QgZ2V0Q2FjaGUgPSBnZXRFbnRpdHlDYWNoZXMoZW50aXR5Q2FjaGUpO1xuICBjb25zdCBsb2NhbENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHt9O1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IERlcFtdID0gW107XG4gIGNvbnN0IGN5Y2xlSW5kZXggPSB7IGk6IC0xIH07XG4gIGNvbnN0IGN5Y2xlQ2FjaGUgPSB7fTtcblxuICBmdW5jdGlvbiB1bnZpc2l0KFxuICAgIGlucHV0OiBhbnksXG4gICAgc2NoZW1hOiBhbnksXG4gICk6IFtkZW5vcm1hbGl6ZWQ6IGFueSwgZm91bmQ6IGJvb2xlYW4sIGRlbGV0ZWQ6IGJvb2xlYW5dIHtcbiAgICBpZiAoIXNjaGVtYSkgcmV0dXJuIFtpbnB1dCwgdHJ1ZSwgZmFsc2VdO1xuXG4gICAgLy8gbnVsbCBpcyBjb25zaWRlcmVkIGludGVudGlvbmFsLCB0aHVzIGFsd2F5cyAnZm91bmQnIGFzIHRydWVcbiAgICBpZiAoaW5wdXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBbaW5wdXQsIHRydWUsIGZhbHNlXTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNEZW5vcm1hbGl6ZSA9IHR5cGVvZiBzY2hlbWEuZGVub3JtYWxpemUgPT09ICdmdW5jdGlvbic7XG5cbiAgICAvLyBkZXNlcmlhbGl6ZSBmaWVsZHMgKGxpa2UgRGF0ZSlcbiAgICBpZiAoIWhhc0Rlbm9ybWFsaXplICYmIHR5cGVvZiBzY2hlbWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIHNjaGVtYSkgcmV0dXJuIFtpbnB1dCwgdHJ1ZSwgZmFsc2VdO1xuICAgICAgLy8gZmllbGQgZGVzZXJpYWxpemF0aW9uIHNob3VsZCBuZXZlciBjb3VudCBhZ2FpbnN0ICdmb3VuZCcgKHdoZXRoZXIgdG8gdXNlZCBpbmZlcnJlZCByZXN1bHRzKVxuICAgICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHJldHVybiBbaW5wdXQsIHRydWUsIGZhbHNlXTtcbiAgICAgIHJldHVybiBbbmV3IHNjaGVtYShpbnB1dCksIHRydWUsIGZhbHNlXTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFtpbnB1dCwgZmFsc2UsIGZhbHNlXTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0Rlbm9ybWFsaXplICYmIHR5cGVvZiBzY2hlbWEgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBtZXRob2QgPSBBcnJheS5pc0FycmF5KHNjaGVtYSlcbiAgICAgICAgPyBhcnJheURlbm9ybWFsaXplXG4gICAgICAgIDogb2JqZWN0RGVub3JtYWxpemU7XG4gICAgICByZXR1cm4gbWV0aG9kKHNjaGVtYSwgaW5wdXQsIHVudmlzaXQpO1xuICAgIH1cblxuICAgIGlmIChpc0VudGl0eShzY2hlbWEpKSB7XG4gICAgICByZXR1cm4gdW52aXNpdEVudGl0eShcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdW52aXNpdCxcbiAgICAgICAgZ2V0RW50aXR5LFxuICAgICAgICBnZXRDYWNoZSxcbiAgICAgICAgbG9jYWxDYWNoZSxcbiAgICAgICAgY3ljbGVDYWNoZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgICBjeWNsZUluZGV4LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzRGVub3JtYWxpemUpIHtcbiAgICAgIHJldHVybiBzY2hlbWEuZGVub3JtYWxpemUoaW5wdXQsIHVudmlzaXQpO1xuICAgIH1cblxuICAgIHJldHVybiBbaW5wdXQsIHRydWUsIGZhbHNlXTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgaW5wdXQ6IGFueSxcbiAgICBzY2hlbWE6IGFueSxcbiAgKTogW1xuICAgIGRlbm9ybWFsaXplZDogYW55LFxuICAgIGZvdW5kOiBib29sZWFuLFxuICAgIGRlbGV0ZWQ6IGJvb2xlYW4sXG4gICAgZW50aXR5UGF0aHM6IFBhdGhbXSxcbiAgXSA9PiB7XG4gICAgLy8gaW4gdGhlIGNhc2Ugd2hlcmUgV2Vha01hcCBjYW5ub3QgYmUgdXNlZFxuICAgIC8vIHRoaXMgdGVzdCBlbnN1cmVzIG51bGwgaXMgcHJvcGVybHkgZXhjbHVkZWQgZnJvbSBXZWFrTWFwXG4gICAgY29uc3QgY2FjaGFibGUgPSBPYmplY3QoaW5wdXQpID09PSBpbnB1dCAmJiBPYmplY3Qoc2NoZW1hKSA9PT0gc2NoZW1hO1xuICAgIGlmICghY2FjaGFibGUpIHtcbiAgICAgIGNvbnN0IHJldCA9IHVudmlzaXQoaW5wdXQsIHNjaGVtYSk7XG4gICAgICAvLyB0aGlzIGlzIGZhc3RlciB0aGFuIHNwcmVhZFxuICAgICAgLy8gaHR0cHM6Ly93d3cubWVhc3VyZXRoYXQubmV0L0JlbmNobWFya3MvU2hvdy8yMzYzNi8wL3NwcmVhZC13aXRoLXR1cGxlc1xuICAgICAgcmV0dXJuIFtyZXRbMF0sIHJldFsxXSwgcmV0WzJdLCBkZXBUb1BhdGhzKGRlcGVuZGVuY2llcyldO1xuICAgIH1cblxuICAgIGxldCBbcmV0LCBlbnRpdHlQYXRoc10gPSByZXN1bHRDYWNoZS5nZXQoaW5wdXQsIGdldEVudGl0eSk7XG5cbiAgICBpZiAocmV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldCA9IHVudmlzaXQoaW5wdXQsIHNjaGVtYSk7XG4gICAgICAvLyB3ZSB3YW50IHRvIGRvIHRoaXMgYmVmb3JlIHdlIGFkZCBvdXIgJ2lucHV0JyBlbnRyeVxuICAgICAgZW50aXR5UGF0aHMgPSBkZXBUb1BhdGhzKGRlcGVuZGVuY2llcyk7XG4gICAgICAvLyBmb3IgdGhlIGZpcnN0IGVudHJ5LCBgcGF0aGAgaXMgaWdub3JlZCBzbyBlbXB0eSBtZW1iZXJzIGlzIGZpbmVcbiAgICAgIGRlcGVuZGVuY2llcy51bnNoaWZ0KHsgZW50aXR5OiBpbnB1dCwgcGF0aDogeyBrZXk6ICcnLCBwazogJycgfSB9KTtcbiAgICAgIHJlc3VsdENhY2hlLnNldChkZXBlbmRlbmNpZXMsIHJldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtyZXRbMF0sIHJldFsxXSwgcmV0WzJdLCBlbnRpdHlQYXRocyBhcyBQYXRoW11dO1xuICB9O1xufTtcblxuY29uc3QgZ2V0RW50aXR5Q2FjaGVzID0gKGVudGl0eUNhY2hlOiBEZW5vcm1hbGl6ZUNhY2hlWydlbnRpdGllcyddKSA9PiB7XG4gIHJldHVybiAocGs6IHN0cmluZywgc2NoZW1hOiBFbnRpdHlJbnRlcmZhY2UpID0+IHtcbiAgICBjb25zdCBrZXkgPSBzY2hlbWEua2V5O1xuXG4gICAgaWYgKCEoa2V5IGluIGVudGl0eUNhY2hlKSkge1xuICAgICAgZW50aXR5Q2FjaGVba2V5XSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuICAgIGNvbnN0IGVudGl0eUNhY2hlS2V5ID0gZW50aXR5Q2FjaGVba2V5XTtcbiAgICBpZiAoIWVudGl0eUNhY2hlS2V5W3BrXSlcbiAgICAgIGVudGl0eUNhY2hlS2V5W3BrXSA9IG5ldyBXZWFrTWFwPFxuICAgICAgICBFbnRpdHlJbnRlcmZhY2UsXG4gICAgICAgIFdlYWtFbnRpdHlNYXA8b2JqZWN0LCBhbnk+XG4gICAgICA+KCk7XG5cbiAgICBsZXQgd2VtOiBXZWFrRW50aXR5TWFwPG9iamVjdCwgYW55PiA9IGVudGl0eUNhY2hlS2V5W3BrXS5nZXQoc2NoZW1hKSBhcyBhbnk7XG4gICAgaWYgKCF3ZW0pIHtcbiAgICAgIHdlbSA9IG5ldyBXZWFrRW50aXR5TWFwPG9iamVjdCwgYW55PigpO1xuICAgICAgZW50aXR5Q2FjaGVLZXlbcGtdLnNldChzY2hlbWEsIHdlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdlbTtcbiAgfTtcbn07XG5cbnR5cGUgRGVub3JtYWxpemVSZXR1cm48UyBleHRlbmRzIFNjaGVtYT4gPVxuICB8IFtcbiAgICAgIGRlbm9ybWFsaXplZDogRGVub3JtYWxpemU8Uz4sXG4gICAgICBmb3VuZDogdHJ1ZSxcbiAgICAgIGRlbGV0ZWQ6IGZhbHNlLFxuICAgICAgZW50aXR5UGF0aHM6IFBhdGhbXSxcbiAgICBdXG4gIHwgW1xuICAgICAgZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+LFxuICAgICAgZm91bmQ6IGJvb2xlYW4sXG4gICAgICBkZWxldGVkOiB0cnVlLFxuICAgICAgZW50aXR5UGF0aHM6IFBhdGhbXSxcbiAgICBdXG4gIHwgW1xuICAgICAgZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+LFxuICAgICAgZm91bmQ6IGZhbHNlLFxuICAgICAgZGVsZXRlZDogYm9vbGVhbixcbiAgICAgIGVudGl0eVBhdGhzOiBQYXRoW10sXG4gICAgXTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbmV4cG9ydCBjb25zdCBkZW5vcm1hbGl6ZSA9IDxTIGV4dGVuZHMgU2NoZW1hPihcbiAgaW5wdXQ6IHVua25vd24sXG4gIHNjaGVtYTogUyB8IHVuZGVmaW5lZCxcbiAgZW50aXRpZXM6IGFueSxcbiAgZW50aXR5Q2FjaGU6IERlbm9ybWFsaXplQ2FjaGVbJ2VudGl0aWVzJ10gPSB7fSxcbiAgcmVzdWx0Q2FjaGU6IERlbm9ybWFsaXplQ2FjaGVbJ3Jlc3VsdHMnXVtzdHJpbmddID0gbmV3IFdlYWtFbnRpdHlNYXAoKSxcbik6IERlbm9ybWFsaXplUmV0dXJuPFM+ID0+IHtcbiAgLy8gdW5kZWZpbmVkIG1lYW4gZG9uJ3QgZG8gYW55dGhpbmdcbiAgaWYgKHNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFtpbnB1dCwgdHJ1ZSwgZmFsc2UsIFtdXSBhcyBbYW55LCBib29sZWFuLCBib29sZWFuLCBhbnldO1xuICB9XG4gIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFt1bmRlZmluZWQsIGZhbHNlLCBmYWxzZSwgW11dIGFzIFthbnksIGJvb2xlYW4sIGJvb2xlYW4sIGFueV07XG4gIH1cbiAgcmV0dXJuIGdldFVudmlzaXQoZW50aXRpZXMsIGVudGl0eUNhY2hlLCByZXN1bHRDYWNoZSkoaW5wdXQsIHNjaGVtYSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVub3JtYWxpemVTaW1wbGUgPSA8UyBleHRlbmRzIFNjaGVtYT4oXG4gIGlucHV0OiBhbnksXG4gIHNjaGVtYTogUyB8IHVuZGVmaW5lZCxcbiAgZW50aXRpZXM6IGFueSxcbiAgZW50aXR5Q2FjaGU/OiBEZW5vcm1hbGl6ZUNhY2hlWydlbnRpdGllcyddLFxuICByZXN1bHRDYWNoZT86IERlbm9ybWFsaXplQ2FjaGVbJ3Jlc3VsdHMnXVtzdHJpbmddLFxuKTpcbiAgfCBbZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZTxTPiwgZm91bmQ6IHRydWUsIGRlbGV0ZWQ6IGZhbHNlXVxuICB8IFtkZW5vcm1hbGl6ZWQ6IERlbm9ybWFsaXplTnVsbGFibGU8Uz4sIGZvdW5kOiBib29sZWFuLCBkZWxldGVkOiB0cnVlXVxuICB8IFtkZW5vcm1hbGl6ZWQ6IERlbm9ybWFsaXplTnVsbGFibGU8Uz4sIGZvdW5kOiBmYWxzZSwgZGVsZXRlZDogYm9vbGVhbl0gPT5cbiAgZGVub3JtYWxpemUoaW5wdXQsIHNjaGVtYSwgZW50aXRpZXMsIGVudGl0eUNhY2hlLCByZXN1bHRDYWNoZSkuc2xpY2UoXG4gICAgMCxcbiAgICAzLFxuICApIGFzIGFueTtcblxuLy8gVE9ETyhicmVha2luZyk6IHJlbW92ZSBvbmNlIHVudXNlZFxuZnVuY3Rpb24gd2l0aFRyYWNrZWRFbnRpdGllcyh1bnZpc2l0OiBVbnZpc2l0RnVuY3Rpb24pOiBVbnZpc2l0RnVuY3Rpb24ge1xuICAvLyBldmVyeSB0aW1lIHdlIG5lc3QsIHdlIHdhbnQgdG8gdW53cmFwIGJhY2sgdG8gdGhlIHRvcC5cbiAgLy8gdGhpcyBpcyBkdWUgdG8gb25seSBuZWVkZWQgdGhlIG5leHQgbGV2ZWwgb2YgbmVzdGVkIGVudGl0aWVzIGZvciBsb29rdXBcbiAgY29uc3Qgb3JpZ2luYWxVbnZpc2l0ID0gdW52aXNpdC5vZyB8fCB1bnZpc2l0O1xuICBjb25zdCB3cmFwcGVkVW52aXNpdCA9IChpbnB1dDogYW55LCBzY2hlbWE6IGFueSkgPT5cbiAgICBvcmlnaW5hbFVudmlzaXQoaW5wdXQsIHNjaGVtYSk7XG4gIHdyYXBwZWRVbnZpc2l0Lm9nID0gdW52aXNpdDtcbiAgcmV0dXJuIHdyYXBwZWRVbnZpc2l0O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxRQUFRLFFBQVEsZUFBZTtBQUN4QyxTQUFTQyxXQUFXLElBQUlDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUNwRSxTQUFTQyxXQUFXLFFBQVEsNkJBQTZCO0FBQ3pELFNBQVNGLFdBQVcsSUFBSUcsaUJBQWlCLFFBQVEscUJBQXFCO0FBT3RFLE9BQU9DLGFBQWEsSUFFbEJDLFdBQVcsRUFFWEMsVUFBVSxRQUNMLG9CQUFvQjtBQU0zQixNQUFNQyxhQUFhLEdBQUcsQ0FDcEJDLFVBQXdDLEVBQ3hDQyxNQUF1QixFQUN2QkMsT0FBd0IsRUFDeEJDLFNBQW9CLEVBQ3BCQyxRQUE0QyxFQUM1Q0MsVUFBK0MsRUFDL0NDLFVBQWtELEVBQ2xEQyxZQUFtQixFQUNuQkMsVUFBeUIsS0FDZ0Q7RUFDekUsTUFBTUMsTUFBTSxHQUNWLE9BQU9ULFVBQVUsS0FBSyxRQUFRLEdBQzFCQSxVQUFVLEdBQ1ZHLFNBQVMsQ0FBQztJQUFFTyxFQUFFLEVBQUVWLFVBQVU7SUFBRVcsR0FBRyxFQUFFVixNQUFNLENBQUNVO0VBQUksQ0FBQyxDQUFDO0VBQ3BELElBQ0UsT0FBT0YsTUFBTSxLQUFLLFFBQVEsSUFDekJBLE1BQU0sQ0FBWUcsUUFBUSxFQUFFLENBQUNDLFFBQVEsQ0FB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

@@ -7,3 +7,3 @@ Object.hasOwn = Object.hasOwn || /* istanbul ignore next */function hasOwn(it, key) {

import { normalize } from './normalize.js';
import WeakListMap from './WeakListMap.js';
import WeakEntityMap from './WeakEntityMap.js';
export { default as inferResults } from './inferResults.js';

@@ -15,3 +15,3 @@ export { DELETED } from './special.js';

export * from './normal.js';
export { denormalize, normalize, isEntity, WeakListMap };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlbm9ybWFsaXplIiwiaXNFbnRpdHkiLCJub3JtYWxpemUiLCJXZWFrTGlzdE1hcCIsImRlZmF1bHQiLCJpbmZlclJlc3VsdHMiLCJERUxFVEVEIl0sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIk9iamVjdC5oYXNPd24gPVxuICBPYmplY3QuaGFzT3duIHx8XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIGZ1bmN0aW9uIGhhc093bihpdCwga2V5KSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbiAgfTtcbmltcG9ydCB7IGRlbm9ybWFsaXplIH0gZnJvbSAnLi9kZW5vcm1hbGl6ZS5qcyc7XG5pbXBvcnQgeyBpc0VudGl0eSB9IGZyb20gJy4vaXNFbnRpdHkuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplIH0gZnJvbSAnLi9ub3JtYWxpemUuanMnO1xuaW1wb3J0IFdlYWtMaXN0TWFwIGZyb20gJy4vV2Vha0xpc3RNYXAuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmZlclJlc3VsdHMgfSBmcm9tICcuL2luZmVyUmVzdWx0cy5qcyc7XG5leHBvcnQgeyBERUxFVEVEIH0gZnJvbSAnLi9zcGVjaWFsLmpzJztcblxuZXhwb3J0IHR5cGUge1xuICBBYnN0cmFjdEluc3RhbmNlVHlwZSxcbiAgTm9ybWFsaXplUmV0dXJuVHlwZSxcbiAgTm9ybWFsaXplZFNjaGVtYSxcbiAgRGVub3JtYWxpemVSZXR1cm5UeXBlLFxuICBEZW5vcm1hbGl6ZUNhY2hlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZW5kcG9pbnQvdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHBpcnkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3JtYWwuanMnO1xuXG5leHBvcnQgeyBkZW5vcm1hbGl6ZSwgbm9ybWFsaXplLCBpc0VudGl0eSwgV2Vha0xpc3RNYXAgfTtcbiJdLCJtYXBwaW5ncyI6IkFBQUFBLE1BQU0sQ0FBQ0MsTUFBTSxHQUNYRCxNQUFNLENBQUNDLE1BQU0sSUFDYiwwQkFBMkIsU0FBU0EsTUFBTSxDQUFDQyxFQUFFLEVBQUVDLEdBQUcsRUFBRTtFQUNsRCxPQUFPSCxNQUFNLENBQUNJLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNKLEVBQUUsRUFBRUMsR0FBRyxDQUFDO0FBQ3RELENBQUM7QUFDSCxTQUFTSSxXQUFXLFFBQVEsa0JBQWtCO0FBQzlDLFNBQVNDLFFBQVEsUUFBUSxlQUFlO0FBQ3hDLFNBQVNDLFNBQVMsUUFBUSxnQkFBZ0I7QUFDMUMsT0FBT0MsV0FBVyxNQUFNLGtCQUFrQjtBQUMxQyxTQUFTQyxPQUFPLElBQUlDLFlBQVksUUFBUSxtQkFBbUI7QUFDM0QsU0FBU0MsT0FBTyxRQUFRLGNBQWM7QUFTdEMsY0FBYyxxQkFBcUI7QUFDbkMsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsYUFBYTtBQUUzQixTQUFTTixXQUFXLEVBQUVFLFNBQVMsRUFBRUQsUUFBUSxFQUFFRSxXQUFXIn0=
export { denormalize, normalize, isEntity, WeakEntityMap };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlbm9ybWFsaXplIiwiaXNFbnRpdHkiLCJub3JtYWxpemUiLCJXZWFrRW50aXR5TWFwIiwiZGVmYXVsdCIsImluZmVyUmVzdWx0cyIsIkRFTEVURUQiXSwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiT2JqZWN0Lmhhc093biA9XG4gIE9iamVjdC5oYXNPd24gfHxcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuICB9O1xuaW1wb3J0IHsgZGVub3JtYWxpemUgfSBmcm9tICcuL2Rlbm9ybWFsaXplLmpzJztcbmltcG9ydCB7IGlzRW50aXR5IH0gZnJvbSAnLi9pc0VudGl0eS5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemUgfSBmcm9tICcuL25vcm1hbGl6ZS5qcyc7XG5pbXBvcnQgV2Vha0VudGl0eU1hcCBmcm9tICcuL1dlYWtFbnRpdHlNYXAuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmZlclJlc3VsdHMgfSBmcm9tICcuL2luZmVyUmVzdWx0cy5qcyc7XG5leHBvcnQgeyBERUxFVEVEIH0gZnJvbSAnLi9zcGVjaWFsLmpzJztcblxuZXhwb3J0IHR5cGUge1xuICBBYnN0cmFjdEluc3RhbmNlVHlwZSxcbiAgTm9ybWFsaXplUmV0dXJuVHlwZSxcbiAgTm9ybWFsaXplZFNjaGVtYSxcbiAgRGVub3JtYWxpemVSZXR1cm5UeXBlLFxuICBEZW5vcm1hbGl6ZUNhY2hlLFxuICBQYXRoLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZW5kcG9pbnQvdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHBpcnkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3JtYWwuanMnO1xuXG5leHBvcnQgeyBkZW5vcm1hbGl6ZSwgbm9ybWFsaXplLCBpc0VudGl0eSwgV2Vha0VudGl0eU1hcCB9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQUEsTUFBTSxDQUFDQyxNQUFNLEdBQ1hELE1BQU0sQ0FBQ0MsTUFBTSxJQUNiLDBCQUEyQixTQUFTQSxNQUFNLENBQUNDLEVBQUUsRUFBRUMsR0FBRyxFQUFFO0VBQ2xELE9BQU9ILE1BQU0sQ0FBQ0ksU0FBUyxDQUFDQyxjQUFjLENBQUNDLElBQUksQ0FBQ0osRUFBRSxFQUFFQyxHQUFHLENBQUM7QUFDdEQsQ0FBQztBQUNILFNBQVNJLFdBQVcsUUFBUSxrQkFBa0I7QUFDOUMsU0FBU0MsUUFBUSxRQUFRLGVBQWU7QUFDeEMsU0FBU0MsU0FBUyxRQUFRLGdCQUFnQjtBQUMxQyxPQUFPQyxhQUFhLE1BQU0sb0JBQW9CO0FBQzlDLFNBQVNDLE9BQU8sSUFBSUMsWUFBWSxRQUFRLG1CQUFtQjtBQUMzRCxTQUFTQyxPQUFPLFFBQVEsY0FBYztBQVV0QyxjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLGdCQUFnQjtBQUM5QixjQUFjLGFBQWE7QUFDM0IsY0FBYyxhQUFhO0FBRTNCLFNBQVNOLFdBQVcsRUFBRUUsU0FBUyxFQUFFRCxRQUFRLEVBQUVFLGFBQWEifQ==
export {};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgU2NoZW1hLFxuICBTZXJpYWxpemFibGUsXG4gIEVudGl0eUludGVyZmFjZSxcbiAgTm9ybWFsaXplZEluZGV4LFxuICBTY2hlbWFDbGFzcyxcbn0gZnJvbSAnLi9pbnRlcmZhY2UuanMnO1xuaW1wb3J0IHR5cGUgV2Vha0xpc3RNYXAgZnJvbSAnLi9XZWFrTGlzdE1hcC5qcyc7XG5cbmV4cG9ydCB0eXBlIEFic3RyYWN0SW5zdGFuY2VUeXBlPFQ+ID0gVCBleHRlbmRzIHsgcHJvdG90eXBlOiBpbmZlciBVIH1cbiAgPyBVXG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRFbnRpdHk8VD4gPSBUIGV4dGVuZHMge1xuICBwcm90b3R5cGU6IGluZmVyIFU7XG4gIHNjaGVtYTogaW5mZXIgUztcbn1cbiAgPyB7IFtLIGluIEV4Y2x1ZGU8a2V5b2YgVSwga2V5b2YgUz5dOiBVW0tdIH0gJiB7IFtLIGluIGtleW9mIFNdOiBzdHJpbmcgfVxuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBEZW5vcm1hbGl6ZU9iamVjdDxTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtLIGluIGtleW9mIFNdOiBTW0tdIGV4dGVuZHMgU2NoZW1hID8gRGVub3JtYWxpemU8U1tLXT4gOiBTW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgRGVub3JtYWxpemVOdWxsYWJsZU9iamVjdDxTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtLIGluIGtleW9mIFNdOiBTW0tdIGV4dGVuZHMgU2NoZW1hID8gRGVub3JtYWxpemVOdWxsYWJsZTxTW0tdPiA6IFNbS107XG59O1xuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVPYmplY3Q8UyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBbSyBpbiBrZXlvZiBTXTogU1tLXSBleHRlbmRzIFNjaGVtYSA/IE5vcm1hbGl6ZTxTW0tdPiA6IFNbS107XG59O1xuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkTnVsbGFibGVPYmplY3Q8UyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBbSyBpbiBrZXlvZiBTXTogU1tLXSBleHRlbmRzIFNjaGVtYSA/IE5vcm1hbGl6ZU51bGxhYmxlPFNbS10+IDogU1tLXTtcbn07XG5cbmludGVyZmFjZSBOZXN0ZWRTY2hlbWFDbGFzczxUID0gYW55PiB7XG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgU2NoZW1hPjtcbiAgcHJvdG90eXBlOiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZENsYXNzPFQgPSBhbnk+IGV4dGVuZHMgTmVzdGVkU2NoZW1hQ2xhc3M8VD4ge1xuICBmcm9tSlM6ICguLi5hcmdzOiBhbnkpID0+IEFic3RyYWN0SW5zdGFuY2VUeXBlPFQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbm9ybWFsaXplQ2FjaGUge1xuICBlbnRpdGllczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIFtwazogc3RyaW5nXTogV2Vha0xpc3RNYXA8b2JqZWN0LCBFbnRpdHlJbnRlcmZhY2U+O1xuICAgIH07XG4gIH07XG4gIHJlc3VsdHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBXZWFrTGlzdE1hcDxvYmplY3QsIGFueT47XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIERlbm9ybWFsaXplTnVsbGFibGVOZXN0ZWRTY2hlbWE8UyBleHRlbmRzIE5lc3RlZFNjaGVtYUNsYXNzPiA9XG4gIGtleW9mIFNbJ3NjaGVtYSddIGV4dGVuZHMgbmV2ZXJcbiAgICA/IFNbJ3Byb3RvdHlwZSddIC8vIHRoaXMgaXMgdGhlIGNhc2Ugb2YgYSBub24tc2V0IHNjaGVtYSwgd2hpY2ggbWVhbnMgaXQgYWN0dWFsbHkgaGFzIG5vIG1lbWJlcnNcbiAgICA6IHN0cmluZyBleHRlbmRzIGtleW9mIFNbJ3NjaGVtYSddXG4gICAgPyBTWydwcm90b3R5cGUnXVxuICAgIDogU1sncHJvdG90eXBlJ10gLyomIHtcbiAgICAgICAgW0sgaW4ga2V5b2YgU1snc2NoZW1hJ11dOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFNbJ3NjaGVtYSddW0tdPjtcbiAgICAgIH0qLztcblxuZXhwb3J0IHR5cGUgRGVub3JtYWxpemVSZXR1cm5UeXBlPFQ+ID0gVCBleHRlbmRzIChcbiAgaW5wdXQ6IGFueSxcbiAgdW52aXNpdDogYW55LFxuKSA9PiBbaW5mZXIgUiwgYW55LCBhbnldXG4gID8gUlxuICA6IG5ldmVyO1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplUmV0dXJuVHlwZTxUPiA9IFQgZXh0ZW5kcyAoLi4uYXJnczogYW55KSA9PiBpbmZlciBSXG4gID8gUlxuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBEZW5vcm1hbGl6ZTxTPiA9IFMgZXh0ZW5kcyBFbnRpdHlJbnRlcmZhY2U8aW5mZXIgVT5cbiAgPyBVXG4gIDogUyBleHRlbmRzIFJlY29yZENsYXNzXG4gID8gQWJzdHJhY3RJbnN0YW5jZVR5cGU8Uz5cbiAgOiBTIGV4dGVuZHMgU2NoZW1hQ2xhc3NcbiAgPyBEZW5vcm1hbGl6ZVJldHVyblR5cGU8U1snZGVub3JtYWxpemUnXT5cbiAgOiBTIGV4dGVuZHMgU2VyaWFsaXphYmxlPGluZmVyIFQ+XG4gID8gVFxuICA6IFMgZXh0ZW5kcyBBcnJheTxpbmZlciBGPlxuICA/IERlbm9ybWFsaXplPEY+W11cbiAgOiBTIGV4dGVuZHMgeyBbSzogc3RyaW5nXTogYW55IH1cbiAgPyBEZW5vcm1hbGl6ZU9iamVjdDxTPlxuICA6IFM7XG5cbmV4cG9ydCB0eXBlIERlbm9ybWFsaXplTnVsbGFibGU8Uz4gPSBTIGV4dGVuZHMgRW50aXR5SW50ZXJmYWNlPGFueT5cbiAgPyBEZW5vcm1hbGl6ZU51bGxhYmxlTmVzdGVkU2NoZW1hPFM+IHwgdW5kZWZpbmVkXG4gIDogUyBleHRlbmRzIFJlY29yZENsYXNzXG4gID8gRGVub3JtYWxpemVOdWxsYWJsZU5lc3RlZFNjaGVtYTxTPlxuICA6IFMgZXh0ZW5kcyBTY2hlbWFDbGFzc1xuICA/IERlbm9ybWFsaXplUmV0dXJuVHlwZTxTWydfZGVub3JtYWxpemVOdWxsYWJsZSddPlxuICA6IFMgZXh0ZW5kcyBTZXJpYWxpemFibGU8aW5mZXIgVD5cbiAgPyBUXG4gIDogUyBleHRlbmRzIEFycmF5PGluZmVyIEY+XG4gID8gRGVub3JtYWxpemU8Rj5bXSB8IHVuZGVmaW5lZFxuICA6IFMgZXh0ZW5kcyB7IFtLOiBzdHJpbmddOiBhbnkgfVxuICA/IERlbm9ybWFsaXplTnVsbGFibGVPYmplY3Q8Uz5cbiAgOiBTO1xuXG5leHBvcnQgdHlwZSBOb3JtYWxpemU8Uz4gPSBTIGV4dGVuZHMgRW50aXR5SW50ZXJmYWNlXG4gID8gc3RyaW5nXG4gIDogUyBleHRlbmRzIFJlY29yZENsYXNzXG4gID8gTm9ybWFsaXplT2JqZWN0PFNbJ3NjaGVtYSddPlxuICA6IFMgZXh0ZW5kcyBTY2hlbWFDbGFzc1xuICA/IE5vcm1hbGl6ZVJldHVyblR5cGU8U1snbm9ybWFsaXplJ10+XG4gIDogUyBleHRlbmRzIFNlcmlhbGl6YWJsZTxpbmZlciBUPlxuICA/IFRcbiAgOiBTIGV4dGVuZHMgQXJyYXk8aW5mZXIgRj5cbiAgPyBOb3JtYWxpemU8Rj5bXVxuICA6IFMgZXh0ZW5kcyB7IFtLOiBzdHJpbmddOiBhbnkgfVxuICA/IE5vcm1hbGl6ZU9iamVjdDxTPlxuICA6IFM7XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZU51bGxhYmxlPFM+ID0gUyBleHRlbmRzIEVudGl0eUludGVyZmFjZVxuICA/IHN0cmluZyB8IHVuZGVmaW5lZFxuICA6IFMgZXh0ZW5kcyBSZWNvcmRDbGFzc1xuICA/IE5vcm1hbGl6ZWROdWxsYWJsZU9iamVjdDxTWydzY2hlbWEnXT5cbiAgOiBTIGV4dGVuZHMgU2NoZW1hQ2xhc3NcbiAgPyBOb3JtYWxpemVSZXR1cm5UeXBlPFNbJ19ub3JtYWxpemVOdWxsYWJsZSddPlxuICA6IFMgZXh0ZW5kcyBTZXJpYWxpemFibGU8aW5mZXIgVD5cbiAgPyBUXG4gIDogUyBleHRlbmRzIEFycmF5PGluZmVyIEY+XG4gID8gTm9ybWFsaXplPEY+W10gfCB1bmRlZmluZWRcbiAgOiBTIGV4dGVuZHMgeyBbSzogc3RyaW5nXTogYW55IH1cbiAgPyBOb3JtYWxpemVkTnVsbGFibGVPYmplY3Q8Uz5cbiAgOiBTO1xuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkU2NoZW1hPEUsIFI+ID0ge1xuICBlbnRpdGllczogRTtcbiAgcmVzdWx0OiBSO1xuICBpbmRleGVzOiBOb3JtYWxpemVkSW5kZXg7XG4gIGVudGl0eU1ldGE6IHtcbiAgICByZWFkb25seSBbZW50aXR5S2V5OiBzdHJpbmddOiB7XG4gICAgICByZWFkb25seSBbcGs6IHN0cmluZ106IHtcbiAgICAgICAgcmVhZG9ubHkgZGF0ZTogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgZmV0Y2hlZEF0OiBudW1iZXI7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBFbnRpdHlNYXA8VCA9IGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBFbnRpdHlJbnRlcmZhY2U8VD4+O1xuIl0sIm1hcHBpbmdzIjoiIn0=
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgU2NoZW1hLFxuICBTZXJpYWxpemFibGUsXG4gIEVudGl0eUludGVyZmFjZSxcbiAgTm9ybWFsaXplZEluZGV4LFxuICBTY2hlbWFDbGFzcyxcbn0gZnJvbSAnLi9pbnRlcmZhY2UuanMnO1xuaW1wb3J0IHR5cGUgV2Vha0VudGl0eU1hcCBmcm9tICcuL1dlYWtFbnRpdHlNYXAuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhdGgge1xuICBrZXk6IHN0cmluZztcbiAgcGs6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQWJzdHJhY3RJbnN0YW5jZVR5cGU8VD4gPSBUIGV4dGVuZHMgeyBwcm90b3R5cGU6IGluZmVyIFUgfVxuICA/IFVcbiAgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgTm9ybWFsaXplZEVudGl0eTxUPiA9IFQgZXh0ZW5kcyB7XG4gIHByb3RvdHlwZTogaW5mZXIgVTtcbiAgc2NoZW1hOiBpbmZlciBTO1xufVxuICA/IHsgW0sgaW4gRXhjbHVkZTxrZXlvZiBVLCBrZXlvZiBTPl06IFVbS10gfSAmIHsgW0sgaW4ga2V5b2YgU106IHN0cmluZyB9XG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIERlbm9ybWFsaXplT2JqZWN0PFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgW0sgaW4ga2V5b2YgU106IFNbS10gZXh0ZW5kcyBTY2hlbWEgPyBEZW5vcm1hbGl6ZTxTW0tdPiA6IFNbS107XG59O1xuXG5leHBvcnQgdHlwZSBEZW5vcm1hbGl6ZU51bGxhYmxlT2JqZWN0PFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgW0sgaW4ga2V5b2YgU106IFNbS10gZXh0ZW5kcyBTY2hlbWEgPyBEZW5vcm1hbGl6ZU51bGxhYmxlPFNbS10+IDogU1tLXTtcbn07XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZU9iamVjdDxTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtLIGluIGtleW9mIFNdOiBTW0tdIGV4dGVuZHMgU2NoZW1hID8gTm9ybWFsaXplPFNbS10+IDogU1tLXTtcbn07XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWROdWxsYWJsZU9iamVjdDxTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtLIGluIGtleW9mIFNdOiBTW0tdIGV4dGVuZHMgU2NoZW1hID8gTm9ybWFsaXplTnVsbGFibGU8U1tLXT4gOiBTW0tdO1xufTtcblxuaW50ZXJmYWNlIE5lc3RlZFNjaGVtYUNsYXNzPFQgPSBhbnk+IHtcbiAgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBTY2hlbWE+O1xuICBwcm90b3R5cGU6IFQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkQ2xhc3M8VCA9IGFueT4gZXh0ZW5kcyBOZXN0ZWRTY2hlbWFDbGFzczxUPiB7XG4gIGZyb21KUzogKC4uLmFyZ3M6IGFueSkgPT4gQWJzdHJhY3RJbnN0YW5jZVR5cGU8VD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVub3JtYWxpemVDYWNoZSB7XG4gIGVudGl0aWVzOiB7XG4gICAgW2tleTogc3RyaW5nXToge1xuICAgICAgW3BrOiBzdHJpbmddOiBXZWFrTWFwPEVudGl0eUludGVyZmFjZSwgV2Vha0VudGl0eU1hcDxvYmplY3QsIGFueT4+O1xuICAgIH07XG4gIH07XG4gIHJlc3VsdHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBXZWFrRW50aXR5TWFwPG9iamVjdCwgYW55PjtcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgRGVub3JtYWxpemVOdWxsYWJsZU5lc3RlZFNjaGVtYTxTIGV4dGVuZHMgTmVzdGVkU2NoZW1hQ2xhc3M+ID1cbiAga2V5b2YgU1snc2NoZW1hJ10gZXh0ZW5kcyBuZXZlclxuICAgID8gU1sncHJvdG90eXBlJ10gLy8gdGhpcyBpcyB0aGUgY2FzZSBvZiBhIG5vbi1zZXQgc2NoZW1hLCB3aGljaCBtZWFucyBpdCBhY3R1YWxseSBoYXMgbm8gbWVtYmVyc1xuICAgIDogc3RyaW5nIGV4dGVuZHMga2V5b2YgU1snc2NoZW1hJ11cbiAgICA/IFNbJ3Byb3RvdHlwZSddXG4gICAgOiBTWydwcm90b3R5cGUnXSAvKiYge1xuICAgICAgICBbSyBpbiBrZXlvZiBTWydzY2hlbWEnXV06IERlbm9ybWFsaXplTnVsbGFibGU8U1snc2NoZW1hJ11bS10+O1xuICAgICAgfSovO1xuXG5leHBvcnQgdHlwZSBEZW5vcm1hbGl6ZVJldHVyblR5cGU8VD4gPSBUIGV4dGVuZHMgKFxuICBpbnB1dDogYW55LFxuICB1bnZpc2l0OiBhbnksXG4pID0+IFtpbmZlciBSLCBhbnksIGFueV1cbiAgPyBSXG4gIDogbmV2ZXI7XG5leHBvcnQgdHlwZSBOb3JtYWxpemVSZXR1cm5UeXBlPFQ+ID0gVCBleHRlbmRzICguLi5hcmdzOiBhbnkpID0+IGluZmVyIFJcbiAgPyBSXG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIERlbm9ybWFsaXplPFM+ID0gUyBleHRlbmRzIEVudGl0eUludGVyZmFjZTxpbmZlciBVPlxuICA/IFVcbiAgOiBTIGV4dGVuZHMgUmVjb3JkQ2xhc3NcbiAgPyBBYnN0cmFjdEluc3RhbmNlVHlwZTxTPlxuICA6IFMgZXh0ZW5kcyBTY2hlbWFDbGFzc1xuICA/IERlbm9ybWFsaXplUmV0dXJuVHlwZTxTWydkZW5vcm1hbGl6ZSddPlxuICA6IFMgZXh0ZW5kcyBTZXJpYWxpemFibGU8aW5mZXIgVD5cbiAgPyBUXG4gIDogUyBleHRlbmRzIEFycmF5PGluZmVyIEY+XG4gID8gRGVub3JtYWxpemU8Rj5bXVxuICA6IFMgZXh0ZW5kcyB7IFtLOiBzdHJpbmddOiBhbnkgfVxuICA/IERlbm9ybWFsaXplT2JqZWN0PFM+XG4gIDogUztcblxuZXhwb3J0IHR5cGUgRGVub3JtYWxpemVOdWxsYWJsZTxTPiA9IFMgZXh0ZW5kcyBFbnRpdHlJbnRlcmZhY2U8YW55PlxuICA/IERlbm9ybWFsaXplTnVsbGFibGVOZXN0ZWRTY2hlbWE8Uz4gfCB1bmRlZmluZWRcbiAgOiBTIGV4dGVuZHMgUmVjb3JkQ2xhc3NcbiAgPyBEZW5vcm1hbGl6ZU51bGxhYmxlTmVzdGVkU2NoZW1hPFM+XG4gIDogUyBleHRlbmRzIFNjaGVtYUNsYXNzXG4gID8gRGVub3JtYWxpemVSZXR1cm5UeXBlPFNbJ19kZW5vcm1hbGl6ZU51bGxhYmxlJ10+XG4gIDogUyBleHRlbmRzIFNlcmlhbGl6YWJsZTxpbmZlciBUPlxuICA/IFRcbiAgOiBTIGV4dGVuZHMgQXJyYXk8aW5mZXIgRj5cbiAgPyBEZW5vcm1hbGl6ZTxGPltdIHwgdW5kZWZpbmVkXG4gIDogUyBleHRlbmRzIHsgW0s6IHN0cmluZ106IGFueSB9XG4gID8gRGVub3JtYWxpemVOdWxsYWJsZU9iamVjdDxTPlxuICA6IFM7XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZTxTPiA9IFMgZXh0ZW5kcyBFbnRpdHlJbnRlcmZhY2VcbiAgPyBzdHJpbmdcbiAgOiBTIGV4dGVuZHMgUmVjb3JkQ2xhc3NcbiAgPyBOb3JtYWxpemVPYmplY3Q8U1snc2NoZW1hJ10+XG4gIDogUyBleHRlbmRzIFNjaGVtYUNsYXNzXG4gID8gTm9ybWFsaXplUmV0dXJuVHlwZTxTWydub3JtYWxpemUnXT5cbiAgOiBTIGV4dGVuZHMgU2VyaWFsaXphYmxlPGluZmVyIFQ+XG4gID8gVFxuICA6IFMgZXh0ZW5kcyBBcnJheTxpbmZlciBGPlxuICA/IE5vcm1hbGl6ZTxGPltdXG4gIDogUyBleHRlbmRzIHsgW0s6IHN0cmluZ106IGFueSB9XG4gID8gTm9ybWFsaXplT2JqZWN0PFM+XG4gIDogUztcblxuZXhwb3J0IHR5cGUgTm9ybWFsaXplTnVsbGFibGU8Uz4gPSBTIGV4dGVuZHMgRW50aXR5SW50ZXJmYWNlXG4gID8gc3RyaW5nIHwgdW5kZWZpbmVkXG4gIDogUyBleHRlbmRzIFJlY29yZENsYXNzXG4gID8gTm9ybWFsaXplZE51bGxhYmxlT2JqZWN0PFNbJ3NjaGVtYSddPlxuICA6IFMgZXh0ZW5kcyBTY2hlbWFDbGFzc1xuICA/IE5vcm1hbGl6ZVJldHVyblR5cGU8U1snX25vcm1hbGl6ZU51bGxhYmxlJ10+XG4gIDogUyBleHRlbmRzIFNlcmlhbGl6YWJsZTxpbmZlciBUPlxuICA/IFRcbiAgOiBTIGV4dGVuZHMgQXJyYXk8aW5mZXIgRj5cbiAgPyBOb3JtYWxpemU8Rj5bXSB8IHVuZGVmaW5lZFxuICA6IFMgZXh0ZW5kcyB7IFtLOiBzdHJpbmddOiBhbnkgfVxuICA/IE5vcm1hbGl6ZWROdWxsYWJsZU9iamVjdDxTPlxuICA6IFM7XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRTY2hlbWE8RSwgUj4gPSB7XG4gIGVudGl0aWVzOiBFO1xuICByZXN1bHQ6IFI7XG4gIGluZGV4ZXM6IE5vcm1hbGl6ZWRJbmRleDtcbiAgZW50aXR5TWV0YToge1xuICAgIHJlYWRvbmx5IFtlbnRpdHlLZXk6IHN0cmluZ106IHtcbiAgICAgIHJlYWRvbmx5IFtwazogc3RyaW5nXToge1xuICAgICAgICByZWFkb25seSBkYXRlOiBudW1iZXI7XG4gICAgICAgIHJlYWRvbmx5IGV4cGlyZXNBdDogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBmZXRjaGVkQXQ6IG51bWJlcjtcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIEVudGl0eU1hcDxUID0gYW55PiA9IFJlY29yZDxzdHJpbmcsIEVudGl0eUludGVyZmFjZTxUPj47XG4iXSwibWFwcGluZ3MiOiIifQ==
import type { Schema } from './interface.js';
import type { Denormalize, DenormalizeNullable, DenormalizeCache } from './types.js';
import WeakListMap from './WeakListMap.js';
import type { Denormalize, DenormalizeNullable, DenormalizeCache, Path } from './types.js';
type DenormalizeReturn<S extends Schema> = [

@@ -8,3 +7,3 @@ denormalized: Denormalize<S>,

deleted: false,
resolvedEntities: Record<string, Record<string, any>>
entityPaths: Path[]
] | [

@@ -14,3 +13,3 @@ denormalized: DenormalizeNullable<S>,

deleted: true,
resolvedEntities: Record<string, Record<string, any>>
entityPaths: Path[]
] | [

@@ -20,7 +19,7 @@ denormalized: DenormalizeNullable<S>,

deleted: boolean,
resolvedEntities: Record<string, Record<string, any>>
entityPaths: Path[]
];
export declare const denormalize: <S extends Schema>(input: unknown, schema: S | undefined, entities: any, entityCache?: DenormalizeCache['entities'], resultCache?: WeakListMap<object, any>) => DenormalizeReturn<S>;
export declare const denormalizeSimple: <S extends Schema>(input: any, schema: S | undefined, entities: any, entityCache?: DenormalizeCache['entities'], resultCache?: WeakListMap<object, any>) => [denormalized: Denormalize<S>, found: true, deleted: false] | [denormalized: DenormalizeNullable<S>, found: boolean, deleted: true] | [denormalized: DenormalizeNullable<S>, found: false, deleted: boolean];
export declare const denormalize: <S extends Schema>(input: unknown, schema: S | undefined, entities: any, entityCache?: DenormalizeCache['entities'], resultCache?: DenormalizeCache['results'][string]) => DenormalizeReturn<S>;
export declare const denormalizeSimple: <S extends Schema>(input: any, schema: S | undefined, entities: any, entityCache?: DenormalizeCache['entities'], resultCache?: DenormalizeCache['results'][string]) => [denormalized: Denormalize<S>, found: true, deleted: false] | [denormalized: DenormalizeNullable<S>, found: boolean, deleted: true] | [denormalized: DenormalizeNullable<S>, found: false, deleted: boolean];
export {};
//# sourceMappingURL=denormalize.d.ts.map

@@ -5,5 +5,8 @@ import { isEntity } from './isEntity.js';

import { denormalize as objectDenormalize } from './schemas/Object.js';
import WeakListMap from './WeakListMap.js';
const unvisitEntity = (entityOrId, schema, unvisit, getEntity, localCache, cycleCache, entityCache, dependencies, cycleIndex) => {
const entity = getEntity(entityOrId, schema);
import WeakEntityMap, { getEntities, depToPaths } from './WeakEntityMap.js';
const unvisitEntity = (entityOrId, schema, unvisit, getEntity, getCache, localCache, cycleCache, dependencies, cycleIndex) => {
const entity = typeof entityOrId === 'object' ? entityOrId : getEntity({
pk: entityOrId,
key: schema.key
});
if (typeof entity === 'symbol' && entity.toString().includes('DELETED')) {

@@ -36,45 +39,62 @@ return [undefined, true, true];

}
if (!(key in entityCache)) {
entityCache[key] = Object.create(null);
}
const localCacheKey = localCache[key];
const cycleCacheKey = cycleCache[key];
const entityCacheKey = entityCache[key];
let found = true;
let deleted = false;
// local cache lookup first
if (!localCacheKey[pk]) {
const trackingIndex = dependencies.length;
dependencies.push(entity);
let entityCopy;
if (schema.createIfValid) {
entityCopy = localCacheKey[pk] = isImmutable(entity) ? schema.createIfValid(entity.toObject()) : schema.createIfValid(entity);
// TODO(breaking): remove once old verions no longer supported
} else {
entityCopy = entity;
unvisit = withTrackedEntities(unvisit);
unvisit.setLocal = entityCopy => localCacheKey[pk] = entityCopy;
}
cycleCacheKey[pk] = trackingIndex;
if (entityCopy === undefined) {
// undefined indicates we should suspense (perhaps failed validation)
found = false;
deleted = true;
} else {
[localCacheKey[pk], found, deleted] = schema.denormalize(entityCopy, unvisit);
}
delete cycleCacheKey[pk];
const globalCacheEntry = getGlobalCacheEntry(entityCacheKey, pk);
const globalCache = getCache(pk, schema);
const [cacheValue] = globalCache.get(entity, getEntity);
// TODO: what if this just returned the deps - then we don't need to store them
// if in cycle, use the start of the cycle to track all deps
// otherwise, we use our own trackingIndex
const localKey = dependencies.slice(cycleIndex.i === -1 ? trackingIndex : cycleIndex.i);
if (!globalCacheEntry.has(localKey)) {
globalCacheEntry.set(localKey, localCacheKey[pk]);
} else {
localCacheKey[pk] = globalCacheEntry.get(localKey);
if (cacheValue) {
localCacheKey[pk] = cacheValue.value[0];
// TODO: can we store the cache values instead of tracking *all* their sources?
// this is only used for setting results cache correctly. if we got this far we will def need to set as we would have already tried getting it
dependencies.push(...cacheValue.dependencies);
return cacheValue.value;
}
// if we don't find in denormalize cache then do full denormalize
else {
const trackingIndex = dependencies.length;
dependencies.push({
entity,
path: {
key,
pk
}
});
let entityCopy;
if (schema.createIfValid) {
entityCopy = localCacheKey[pk] = isImmutable(entity) ? schema.createIfValid(entity.toObject()) : schema.createIfValid(entity);
// TODO(breaking): remove once old verions no longer supported
} else {
entityCopy = entity;
unvisit = withTrackedEntities(unvisit);
unvisit.setLocal = entityCopy => localCacheKey[pk] = entityCopy;
}
cycleCacheKey[pk] = trackingIndex;
if (entityCopy === undefined) {
// undefined indicates we should suspense (perhaps failed validation)
found = false;
deleted = true;
} else {
[localCacheKey[pk], found, deleted] = schema.denormalize(entityCopy, unvisit);
}
delete cycleCacheKey[pk];
// start of cycle - reset cycle detection
if (cycleIndex.i === trackingIndex) {
cycleIndex.i = -1;
// if in cycle, use the start of the cycle to track all deps
// otherwise, we use our own trackingIndex
const localKey = dependencies.slice(cycleIndex.i === -1 ? trackingIndex : cycleIndex.i);
const cacheValue = {
dependencies: localKey,
value: [localCacheKey[pk], found, deleted]
};
globalCache.set(localKey, cacheValue);
// start of cycle - reset cycle detection
if (cycleIndex.i === trackingIndex) {
cycleIndex.i = -1;
}
}

@@ -87,3 +107,9 @@ } else {

// with no cycle, globalCacheEntry will have already been set
dependencies.push(entity);
dependencies.push({
entity,
path: {
key,
pk
}
});
}

@@ -93,4 +119,6 @@ }

};
const getUnvisit = (entities, entityCache, resultCache, localCache) => {
const getUnvisit = (entities, entityCache, resultCache) => {
const getEntity = getEntities(entities);
const getCache = getEntityCaches(entityCache);
const localCache = {};
const dependencies = [];

@@ -109,2 +137,4 @@ const cycleIndex = {

const hasDenormalize = typeof schema.denormalize === 'function';
// deserialize fields (like Date)
if (!hasDenormalize && typeof schema === 'function') {

@@ -124,3 +154,3 @@ if (input instanceof schema) return [input, true, false];

if (isEntity(schema)) {
return unvisitEntity(input, schema, unvisit, getEntity, localCache, cycleCache, entityCache, dependencies, cycleIndex);
return unvisitEntity(input, schema, unvisit, getEntity, getCache, localCache, cycleCache, dependencies, cycleIndex);
}

@@ -132,51 +162,58 @@ if (hasDenormalize) {

}
//const wrappedUnvisit = withTrackedEntities(unvisit, globalKey);
return (input, schema) => {
const ret = unvisit(input, schema);
// in the case where WeakMap cannot be used
// this test ensures null is properly excluded from WeakMap
if (Object(input) !== input) return ret;
dependencies.push(input);
if (!resultCache.has(dependencies)) {
resultCache.set(dependencies, ret[0]);
return ret;
} else {
return [resultCache.get(dependencies), ret[1], ret[2]];
const cachable = Object(input) === input && Object(schema) === schema;
if (!cachable) {
const ret = unvisit(input, schema);
// this is faster than spread
// https://www.measurethat.net/Benchmarks/Show/23636/0/spread-with-tuples
return [ret[0], ret[1], ret[2], depToPaths(dependencies)];
}
let [ret, entityPaths] = resultCache.get(input, getEntity);
if (ret === undefined) {
ret = unvisit(input, schema);
// we want to do this before we add our 'input' entry
entityPaths = depToPaths(dependencies);
// for the first entry, `path` is ignored so empty members is fine
dependencies.unshift({
entity: input,
path: {
key: '',
pk: ''
}
});
resultCache.set(dependencies, ret);
}
return [ret[0], ret[1], ret[2], entityPaths];
};
};
const getEntities = entities => {
const entityIsImmutable = isImmutable(entities);
return (entityOrId, schema) => {
var _entities$schemaKey;
const schemaKey = schema.key;
if (typeof entityOrId === 'object') {
return entityOrId;
const getEntityCaches = entityCache => {
return (pk, schema) => {
const key = schema.key;
if (!(key in entityCache)) {
entityCache[key] = Object.create(null);
}
if (entityIsImmutable) {
return entities.getIn([schemaKey, entityOrId]);
const entityCacheKey = entityCache[key];
if (!entityCacheKey[pk]) entityCacheKey[pk] = new WeakMap();
let wem = entityCacheKey[pk].get(schema);
if (!wem) {
wem = new WeakEntityMap();
entityCacheKey[pk].set(schema, wem);
}
return (_entities$schemaKey = entities[schemaKey]) == null ? void 0 : _entities$schemaKey[entityOrId];
return wem;
};
};
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export const denormalize = (input, schema, entities, entityCache = {}, resultCache = new WeakListMap()) => {
export const denormalize = (input, schema, entities, entityCache = {}, resultCache = new WeakEntityMap()) => {
// undefined mean don't do anything
if (schema === undefined) {
return [input, true, false, {}];
return [input, true, false, []];
}
if (input === undefined) {
return [undefined, false, false, {}];
return [undefined, false, false, []];
}
const resolvedEntities = {};
const unvisit = getUnvisit(entities, entityCache, resultCache, resolvedEntities);
return [...unvisit(input, schema), resolvedEntities];
return getUnvisit(entities, entityCache, resultCache)(input, schema);
};
export const denormalizeSimple = (input, schema, entities, entityCache = {}, resultCache = new WeakListMap()) => denormalize(input, schema, entities, entityCache, resultCache).slice(0, 3);
function getGlobalCacheEntry(entityCache, id) {
if (!entityCache[id]) entityCache[id] = new WeakListMap();
return entityCache[id];
}
export const denormalizeSimple = (input, schema, entities, entityCache, resultCache) => denormalize(input, schema, entities, entityCache, resultCache).slice(0, 3);

@@ -192,2 +229,2 @@ // TODO(breaking): remove once unused

}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0VudGl0eSIsImRlbm9ybWFsaXplIiwiYXJyYXlEZW5vcm1hbGl6ZSIsImlzSW1tdXRhYmxlIiwib2JqZWN0RGVub3JtYWxpemUiLCJXZWFrTGlzdE1hcCIsInVudmlzaXRFbnRpdHkiLCJlbnRpdHlPcklkIiwic2NoZW1hIiwidW52aXNpdCIsImdldEVudGl0eSIsImxvY2FsQ2FjaGUiLCJjeWNsZUNhY2hlIiwiZW50aXR5Q2FjaGUiLCJkZXBlbmRlbmNpZXMiLCJjeWNsZUluZGV4IiwiZW50aXR5IiwidG9TdHJpbmciLCJpbmNsdWRlcyIsInVuZGVmaW5lZCIsInBrIiwidG9KUyIsImtleSIsIk9iamVjdCIsImNyZWF0ZSIsImxvY2FsQ2FjaGVLZXkiLCJjeWNsZUNhY2hlS2V5IiwiZW50aXR5Q2FjaGVLZXkiLCJmb3VuZCIsImRlbGV0ZWQiLCJ0cmFja2luZ0luZGV4IiwibGVuZ3RoIiwicHVzaCIsImVudGl0eUNvcHkiLCJjcmVhdGVJZlZhbGlkIiwidG9PYmplY3QiLCJ3aXRoVHJhY2tlZEVudGl0aWVzIiwic2V0TG9jYWwiLCJnbG9iYWxDYWNoZUVudHJ5IiwiZ2V0R2xvYmFsQ2FjaGVFbnRyeSIsImxvY2FsS2V5Iiwic2xpY2UiLCJpIiwiaGFzIiwic2V0IiwiZ2V0IiwiZ2V0VW52aXNpdCIsImVudGl0aWVzIiwicmVzdWx0Q2FjaGUiLCJnZXRFbnRpdGllcyIsImlucHV0IiwiaGFzRGVub3JtYWxpemUiLCJtZXRob2QiLCJBcnJheSIsImlzQXJyYXkiLCJyZXQiLCJlbnRpdHlJc0ltbXV0YWJsZSIsInNjaGVtYUtleSIsImdldEluIiwicmVzb2x2ZWRFbnRpdGllcyIsImRlbm9ybWFsaXplU2ltcGxlIiwiaWQiLCJvcmlnaW5hbFVudmlzaXQiLCJvZyIsIndyYXBwZWRVbnZpc2l0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2Rlbm9ybWFsaXplLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hLCBFbnRpdHlJbnRlcmZhY2UsIFVudmlzaXRGdW5jdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlLmpzJztcbmltcG9ydCB7IGlzRW50aXR5IH0gZnJvbSAnLi9pc0VudGl0eS5qcyc7XG5pbXBvcnQgeyBkZW5vcm1hbGl6ZSBhcyBhcnJheURlbm9ybWFsaXplIH0gZnJvbSAnLi9zY2hlbWFzL0FycmF5LmpzJztcbmltcG9ydCB7IGlzSW1tdXRhYmxlIH0gZnJvbSAnLi9zY2hlbWFzL0ltbXV0YWJsZVV0aWxzLmpzJztcbmltcG9ydCB7IGRlbm9ybWFsaXplIGFzIG9iamVjdERlbm9ybWFsaXplIH0gZnJvbSAnLi9zY2hlbWFzL09iamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIERlbm9ybWFsaXplLFxuICBEZW5vcm1hbGl6ZU51bGxhYmxlLFxuICBEZW5vcm1hbGl6ZUNhY2hlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCBXZWFrTGlzdE1hcCBmcm9tICcuL1dlYWtMaXN0TWFwLmpzJztcblxuY29uc3QgdW52aXNpdEVudGl0eSA9IChcbiAgZW50aXR5T3JJZDogUmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZyxcbiAgc2NoZW1hOiBFbnRpdHlJbnRlcmZhY2UsXG4gIHVudmlzaXQ6IFVudmlzaXRGdW5jdGlvbixcbiAgZ2V0RW50aXR5OiAoXG4gICAgZW50aXR5T3JJZDogUmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZyxcbiAgICBzY2hlbWE6IEVudGl0eUludGVyZmFjZSxcbiAgKSA9PiBvYmplY3QgfCBzeW1ib2wsXG4gIGxvY2FsQ2FjaGU6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+LFxuICBjeWNsZUNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PixcbiAgZW50aXR5Q2FjaGU6IERlbm9ybWFsaXplQ2FjaGVbJ2VudGl0aWVzJ10sXG4gIGRlcGVuZGVuY2llczogb2JqZWN0W10sXG4gIGN5Y2xlSW5kZXg6IHsgaTogbnVtYmVyIH0sXG4pOiBbZGVub3JtYWxpemVkOiBvYmplY3QgfCB1bmRlZmluZWQsIGZvdW5kOiBib29sZWFuLCBkZWxldGVkOiBib29sZWFuXSA9PiB7XG4gIGNvbnN0IGVudGl0eSA9IGdldEVudGl0eShlbnRpdHlPcklkLCBzY2hlbWEpO1xuICBpZiAoXG4gICAgdHlwZW9mIGVudGl0eSA9PT0gJ3N5bWJvbCcgJiZcbiAgICAoZW50aXR5IGFzIHN5bWJvbCkudG9TdHJpbmcoKS5pbmNsdWRlcygnREVMRVRFRCcpXG4gICkge1xuICAgIHJldHVybiBbdW5kZWZpbmVkLCB0cnVlLCB0cnVlXTtcbiAgICAvLyBUT0RPOiBDaGFuZ2UgdG8gdGhpcyBhcyBicmVha2luZyBjaGFuZ2Ugb25jZSB3ZSBvbmx5IHN1cHBvcnQgbmV3ZXIgZW50aXRpZXNcbiAgICAvLyBhbHNvIHJlbW92ZSBgKGVudGl0eSBhcyBzeW1ib2wpLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0RFTEVURUQnKWAgYW5kIGRvIHRoaXMgZm9yIGFsbCBzeW1ib2xzXG4gICAgLy8gcmV0dXJuIHNjaGVtYS5kZW5vcm1hbGl6ZShlbnRpdHksIHVudmlzaXQpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbnRpdHkgIT09ICdvYmplY3QnIHx8IGVudGl0eSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBbZW50aXR5IGFzIGFueSwgZmFsc2UsIGZhbHNlXTtcbiAgfVxuXG4gIGNvbnN0IHBrID1cbiAgICAvLyBub3JtYWxpemUgbXVzdCBhbHdheXMgcGxhY2UgYSBzdHJpbmcsIGJlY2F1c2UgcGsoKSByZXR1cm4gdmFsdWUgaXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgLy8gdGhlcmVmb3JlIG5vIG5lZWQgdG8gY2hlY2sgZm9yIG51bWJlcnNcbiAgICB0eXBlb2YgZW50aXR5T3JJZCA9PT0gJ3N0cmluZydcbiAgICAgID8gZW50aXR5T3JJZFxuICAgICAgOiBzY2hlbWEucGsoaXNJbW11dGFibGUoZW50aXR5KSA/IChlbnRpdHkgYXMgYW55KS50b0pTKCkgOiBlbnRpdHkpO1xuICAvLyBpZiB3ZSBjYW4ndCBnZW5lcmF0ZSBhIHdvcmtpbmcgcGs7IHRoaXMgaXMgaG9wZWxlc3Mgc28gbGV0J3MgZ2l2ZSB0aGVtIHdoYXQncyBhbHJlYWR5IHRoZXJlXG4gIC8vIG90aGVyd2lzZSwgZXZlbiB3aGVuIHdlIGFyZW4ndCBkb2luZyBhIGxvb2t1cCB3ZSB3YW50IHRvIHR1cm4gdGhlIGVudGl0eU9ySWQgb2JqZWN0IGludG8gdGhlXG4gIC8vIGV4cGVjdGVkIGNsYXNzLCBhbmQgY2FjaGUgdGhhdCBjbGFzcyBmb3IgcmVmZXJlbnRpYWwgZXF1YWxpdHkuIFBLIGlzIHVzZWQgZm9yIGdsb2JhbCBlcXVhbGl0eSBsb29rdXAuXG4gIGlmIChwayA9PT0gdW5kZWZpbmVkIHx8IHBrID09PSAnJyB8fCBwayA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gW2VudGl0eSwgZmFsc2UsIGZhbHNlXTtcbiAgfVxuXG4gIGNvbnN0IGtleSA9IHNjaGVtYS5rZXk7XG4gIGlmICghKGtleSBpbiBsb2NhbENhY2hlKSkge1xuICAgIGxvY2FsQ2FjaGVba2V5XSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgaWYgKCEoa2V5IGluIGN5Y2xlQ2FjaGUpKSB7XG4gICAgY3ljbGVDYWNoZVtrZXldID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICBpZiAoIShrZXkgaW4gZW50aXR5Q2FjaGUpKSB7XG4gICAgZW50aXR5Q2FjaGVba2V5XSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgY29uc3QgbG9jYWxDYWNoZUtleSA9IGxvY2FsQ2FjaGVba2V5XTtcbiAgY29uc3QgY3ljbGVDYWNoZUtleSA9IGN5Y2xlQ2FjaGVba2V5XTtcbiAgY29uc3QgZW50aXR5Q2FjaGVLZXkgPSBlbnRpdHlDYWNoZVtrZXldO1xuXG4gIGxldCBmb3VuZCA9IHRydWU7XG4gIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgaWYgKCFsb2NhbENhY2hlS2V5W3BrXSkge1xuICAgIGNvbnN0IHRyYWNraW5nSW5kZXggPSBkZXBlbmRlbmNpZXMubGVuZ3RoO1xuICAgIGRlcGVuZGVuY2llcy5wdXNoKGVudGl0eSk7XG5cbiAgICBsZXQgZW50aXR5Q29weTogYW55O1xuICAgIGlmIChzY2hlbWEuY3JlYXRlSWZWYWxpZCkge1xuICAgICAgZW50aXR5Q29weSA9IGxvY2FsQ2FjaGVLZXlbcGtdID0gaXNJbW11dGFibGUoZW50aXR5KVxuICAgICAgICA/IHNjaGVtYS5jcmVhdGVJZlZhbGlkKGVudGl0eS50b09iamVjdCgpKVxuICAgICAgICA6IHNjaGVtYS5jcmVhdGVJZlZhbGlkKGVudGl0eSk7XG4gICAgICAvLyBUT0RPKGJyZWFraW5nKTogcmVtb3ZlIG9uY2Ugb2xkIHZlcmlvbnMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuICAgIH0gZWxzZSB7XG4gICAgICBlbnRpdHlDb3B5ID0gZW50aXR5O1xuICAgICAgdW52aXNpdCA9IHdpdGhUcmFja2VkRW50aXRpZXModW52aXNpdCk7XG4gICAgICB1bnZpc2l0LnNldExvY2FsID0gZW50aXR5Q29weSA9PiAobG9jYWxDYWNoZUtleVtwa10gPSBlbnRpdHlDb3B5KTtcbiAgICB9XG5cbiAgICBjeWNsZUNhY2hlS2V5W3BrXSA9IHRyYWNraW5nSW5kZXg7XG4gICAgaWYgKGVudGl0eUNvcHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gdW5kZWZpbmVkIGluZGljYXRlcyB3ZSBzaG91bGQgc3VzcGVuc2UgKHBlcmhhcHMgZmFpbGVkIHZhbGlkYXRpb24pXG4gICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIFtsb2NhbENhY2hlS2V5W3BrXSwgZm91bmQsIGRlbGV0ZWRdID0gc2NoZW1hLmRlbm9ybWFsaXplKFxuICAgICAgICBlbnRpdHlDb3B5LFxuICAgICAgICB1bnZpc2l0LFxuICAgICAgKTtcbiAgICB9XG4gICAgZGVsZXRlIGN5Y2xlQ2FjaGVLZXlbcGtdO1xuXG4gICAgY29uc3QgZ2xvYmFsQ2FjaGVFbnRyeSA9IGdldEdsb2JhbENhY2hlRW50cnkoZW50aXR5Q2FjaGVLZXksIHBrKTtcblxuICAgIC8vIGlmIGluIGN5Y2xlLCB1c2UgdGhlIHN0YXJ0IG9mIHRoZSBjeWNsZSB0byB0cmFjayBhbGwgZGVwc1xuICAgIC8vIG90aGVyd2lzZSwgd2UgdXNlIG91ciBvd24gdHJhY2tpbmdJbmRleFxuICAgIGNvbnN0IGxvY2FsS2V5ID0gZGVwZW5kZW5jaWVzLnNsaWNlKFxuICAgICAgY3ljbGVJbmRleC5pID09PSAtMSA/IHRyYWNraW5nSW5kZXggOiBjeWNsZUluZGV4LmksXG4gICAgKTtcblxuICAgIGlmICghZ2xvYmFsQ2FjaGVFbnRyeS5oYXMobG9jYWxLZXkpKSB7XG4gICAgICBnbG9iYWxDYWNoZUVudHJ5LnNldChsb2NhbEtleSwgbG9jYWxDYWNoZUtleVtwa10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbENhY2hlS2V5W3BrXSA9IGdsb2JhbENhY2hlRW50cnkuZ2V0KGxvY2FsS2V5KTtcbiAgICB9XG5cbiAgICAvLyBzdGFydCBvZiBjeWNsZSAtIHJlc2V0IGN5Y2xlIGRldGVjdGlvblxuICAgIGlmIChjeWNsZUluZGV4LmkgPT09IHRyYWNraW5nSW5kZXgpIHtcbiAgICAgIGN5Y2xlSW5kZXguaSA9IC0xO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBjeWNsZSBkZXRlY3RlZFxuICAgIGlmIChwayBpbiBjeWNsZUNhY2hlS2V5KSB7XG4gICAgICBjeWNsZUluZGV4LmkgPSBjeWNsZUNhY2hlS2V5W3BrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gd2l0aCBubyBjeWNsZSwgZ2xvYmFsQ2FjaGVFbnRyeSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHNldFxuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goZW50aXR5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2xvY2FsQ2FjaGVLZXlbcGtdLCBmb3VuZCwgZGVsZXRlZF07XG59O1xuXG5jb25zdCBnZXRVbnZpc2l0ID0gKFxuICBlbnRpdGllczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj4sXG4gIGVudGl0eUNhY2hlOiBEZW5vcm1hbGl6ZUNhY2hlWydlbnRpdGllcyddLFxuICByZXN1bHRDYWNoZTogV2Vha0xpc3RNYXA8b2JqZWN0LCBhbnk+LFxuICBsb2NhbENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PixcbikgPT4ge1xuICBjb25zdCBnZXRFbnRpdHkgPSBnZXRFbnRpdGllcyhlbnRpdGllcyk7XG4gIGNvbnN0IGRlcGVuZGVuY2llczogb2JqZWN0W10gPSBbXTtcbiAgY29uc3QgY3ljbGVJbmRleCA9IHsgaTogLTEgfTtcbiAgY29uc3QgY3ljbGVDYWNoZSA9IHt9O1xuXG4gIGZ1bmN0aW9uIHVudmlzaXQoXG4gICAgaW5wdXQ6IGFueSxcbiAgICBzY2hlbWE6IGFueSxcbiAgKTogW2Rlbm9ybWFsaXplZDogYW55LCBmb3VuZDogYm9vbGVhbiwgZGVsZXRlZDogYm9vbGVhbl0ge1xuICAgIGlmICghc2NoZW1hKSByZXR1cm4gW2lucHV0LCB0cnVlLCBmYWxzZV07XG5cbiAgICAvLyBudWxsIGlzIGNvbnNpZGVyZWQgaW50ZW50aW9uYWwsIHRodXMgYWx3YXlzICdmb3VuZCcgYXMgdHJ1ZVxuICAgIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtpbnB1dCwgdHJ1ZSwgZmFsc2VdO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0Rlbm9ybWFsaXplID0gdHlwZW9mIHNjaGVtYS5kZW5vcm1hbGl6ZSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIGlmICghaGFzRGVub3JtYWxpemUgJiYgdHlwZW9mIHNjaGVtYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2Ygc2NoZW1hKSByZXR1cm4gW2lucHV0LCB0cnVlLCBmYWxzZV07XG4gICAgICAvLyBmaWVsZCBkZXNlcmlhbGl6YXRpb24gc2hvdWxkIG5ldmVyIGNvdW50IGFnYWluc3QgJ2ZvdW5kJyAod2hldGhlciB0byB1c2VkIGluZmVycmVkIHJlc3VsdHMpXG4gICAgICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtpbnB1dCwgdHJ1ZSwgZmFsc2VdO1xuICAgICAgcmV0dXJuIFtuZXcgc2NoZW1hKGlucHV0KSwgdHJ1ZSwgZmFsc2VdO1xuICAgIH1cblxuICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gW2lucHV0LCBmYWxzZSwgZmFsc2VdO1xuICAgIH1cblxuICAgIGlmICghaGFzRGVub3JtYWxpemUgJiYgdHlwZW9mIHNjaGVtYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IEFycmF5LmlzQXJyYXkoc2NoZW1hKVxuICAgICAgICA/IGFycmF5RGVub3JtYWxpemVcbiAgICAgICAgOiBvYmplY3REZW5vcm1hbGl6ZTtcbiAgICAgIHJldHVybiBtZXRob2Qoc2NoZW1hLCBpbnB1dCwgdW52aXNpdCk7XG4gICAgfVxuXG4gICAgaWYgKGlzRW50aXR5KHNjaGVtYSkpIHtcbiAgICAgIHJldHVybiB1bnZpc2l0RW50aXR5KFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICB1bnZpc2l0LFxuICAgICAgICBnZXRFbnRpdHksXG4gICAgICAgIGxvY2FsQ2FjaGUsXG4gICAgICAgIGN5Y2xlQ2FjaGUsXG4gICAgICAgIGVudGl0eUNhY2hlLFxuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIGN5Y2xlSW5kZXgsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChoYXNEZW5vcm1hbGl6ZSkge1xuICAgICAgcmV0dXJuIHNjaGVtYS5kZW5vcm1hbGl6ZShpbnB1dCwgdW52aXNpdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtpbnB1dCwgdHJ1ZSwgZmFsc2VdO1xuICB9XG5cbiAgLy9jb25zdCB3cmFwcGVkVW52aXNpdCA9IHdpdGhUcmFja2VkRW50aXRpZXModW52aXNpdCwgZ2xvYmFsS2V5KTtcblxuICByZXR1cm4gKFxuICAgIGlucHV0OiBhbnksXG4gICAgc2NoZW1hOiBhbnksXG4gICk6IFtkZW5vcm1hbGl6ZWQ6IGFueSwgZm91bmQ6IGJvb2xlYW4sIGRlbGV0ZWQ6IGJvb2xlYW5dID0+IHtcbiAgICBjb25zdCByZXQgPSB1bnZpc2l0KGlucHV0LCBzY2hlbWEpO1xuICAgIC8vIGluIHRoZSBjYXNlIHdoZXJlIFdlYWtNYXAgY2Fubm90IGJlIHVzZWRcbiAgICAvLyB0aGlzIHRlc3QgZW5zdXJlcyBudWxsIGlzIHByb3Blcmx5IGV4Y2x1ZGVkIGZyb20gV2Vha01hcFxuICAgIGlmIChPYmplY3QoaW5wdXQpICE9PSBpbnB1dCkgcmV0dXJuIHJldDtcblxuICAgIGRlcGVuZGVuY2llcy5wdXNoKGlucHV0KTtcbiAgICBpZiAoIXJlc3VsdENhY2hlLmhhcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICByZXN1bHRDYWNoZS5zZXQoZGVwZW5kZW5jaWVzLCByZXRbMF0pO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtyZXN1bHRDYWNoZS5nZXQoZGVwZW5kZW5jaWVzKSwgcmV0WzFdLCByZXRbMl1dO1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IGdldEVudGl0aWVzID0gKGVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7XG4gIGNvbnN0IGVudGl0eUlzSW1tdXRhYmxlID0gaXNJbW11dGFibGUoZW50aXRpZXMpO1xuXG4gIHJldHVybiAoXG4gICAgZW50aXR5T3JJZDogUmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZyxcbiAgICBzY2hlbWE6IEVudGl0eUludGVyZmFjZSxcbiAgKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hS2V5ID0gc2NoZW1hLmtleTtcblxuICAgIGlmICh0eXBlb2YgZW50aXR5T3JJZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBlbnRpdHlPcklkO1xuICAgIH1cblxuICAgIGlmIChlbnRpdHlJc0ltbXV0YWJsZSkge1xuICAgICAgcmV0dXJuIGVudGl0aWVzLmdldEluKFtzY2hlbWFLZXksIGVudGl0eU9ySWRdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXRpZXNbc2NoZW1hS2V5XT8uW2VudGl0eU9ySWRdO1xuICB9O1xufTtcblxudHlwZSBEZW5vcm1hbGl6ZVJldHVybjxTIGV4dGVuZHMgU2NoZW1hPiA9XG4gIHwgW1xuICAgICAgZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZTxTPixcbiAgICAgIGZvdW5kOiB0cnVlLFxuICAgICAgZGVsZXRlZDogZmFsc2UsXG4gICAgICByZXNvbHZlZEVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PixcbiAgICBdXG4gIHwgW1xuICAgICAgZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+LFxuICAgICAgZm91bmQ6IGJvb2xlYW4sXG4gICAgICBkZWxldGVkOiB0cnVlLFxuICAgICAgcmVzb2x2ZWRFbnRpdGllczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj4sXG4gICAgXVxuICB8IFtcbiAgICAgIGRlbm9ybWFsaXplZDogRGVub3JtYWxpemVOdWxsYWJsZTxTPixcbiAgICAgIGZvdW5kOiBmYWxzZSxcbiAgICAgIGRlbGV0ZWQ6IGJvb2xlYW4sXG4gICAgICByZXNvbHZlZEVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PixcbiAgICBdO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZXhwb3J0IGNvbnN0IGRlbm9ybWFsaXplID0gPFMgZXh0ZW5kcyBTY2hlbWE+KFxuICBpbnB1dDogdW5rbm93bixcbiAgc2NoZW1hOiBTIHwgdW5kZWZpbmVkLFxuICBlbnRpdGllczogYW55LFxuICBlbnRpdHlDYWNoZTogRGVub3JtYWxpemVDYWNoZVsnZW50aXRpZXMnXSA9IHt9LFxuICByZXN1bHRDYWNoZTogV2Vha0xpc3RNYXA8b2JqZWN0LCBhbnk+ID0gbmV3IFdlYWtMaXN0TWFwKCksXG4pOiBEZW5vcm1hbGl6ZVJldHVybjxTPiA9PiB7XG4gIC8vIHVuZGVmaW5lZCBtZWFuIGRvbid0IGRvIGFueXRoaW5nXG4gIGlmIChzY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbaW5wdXQsIHRydWUsIGZhbHNlLCB7fV0gYXMgW2FueSwgYm9vbGVhbiwgYm9vbGVhbiwgYW55XTtcbiAgfVxuICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbdW5kZWZpbmVkLCBmYWxzZSwgZmFsc2UsIHt9XSBhcyBbYW55LCBib29sZWFuLCBib29sZWFuLCBhbnldO1xuICB9XG4gIGNvbnN0IHJlc29sdmVkRW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge307XG4gIGNvbnN0IHVudmlzaXQgPSBnZXRVbnZpc2l0KFxuICAgIGVudGl0aWVzLFxuICAgIGVudGl0eUNhY2hlLFxuICAgIHJlc3VsdENhY2hlLFxuICAgIHJlc29sdmVkRW50aXRpZXMsXG4gICk7XG4gIHJldHVybiBbLi4udW52aXNpdChpbnB1dCwgc2NoZW1hKSwgcmVzb2x2ZWRFbnRpdGllc10gYXMgW1xuICAgIGFueSxcbiAgICBib29sZWFuLFxuICAgIGJvb2xlYW4sXG4gICAgYW55LFxuICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbm9ybWFsaXplU2ltcGxlID0gPFMgZXh0ZW5kcyBTY2hlbWE+KFxuICBpbnB1dDogYW55LFxuICBzY2hlbWE6IFMgfCB1bmRlZmluZWQsXG4gIGVudGl0aWVzOiBhbnksXG4gIGVudGl0eUNhY2hlOiBEZW5vcm1hbGl6ZUNhY2hlWydlbnRpdGllcyddID0ge30sXG4gIHJlc3VsdENhY2hlOiBXZWFrTGlzdE1hcDxvYmplY3QsIGFueT4gPSBuZXcgV2Vha0xpc3RNYXAoKSxcbik6XG4gIHwgW2Rlbm9ybWFsaXplZDogRGVub3JtYWxpemU8Uz4sIGZvdW5kOiB0cnVlLCBkZWxldGVkOiBmYWxzZV1cbiAgfCBbZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+LCBmb3VuZDogYm9vbGVhbiwgZGVsZXRlZDogdHJ1ZV1cbiAgfCBbZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+LCBmb3VuZDogZmFsc2UsIGRlbGV0ZWQ6IGJvb2xlYW5dID0+XG4gIGRlbm9ybWFsaXplKGlucHV0LCBzY2hlbWEsIGVudGl0aWVzLCBlbnRpdHlDYWNoZSwgcmVzdWx0Q2FjaGUpLnNsaWNlKFxuICAgIDAsXG4gICAgMyxcbiAgKSBhcyBhbnk7XG5cbmZ1bmN0aW9uIGdldEdsb2JhbENhY2hlRW50cnkoXG4gIGVudGl0eUNhY2hlOiB7IFtwazogc3RyaW5nXTogV2Vha0xpc3RNYXA8b2JqZWN0LCBFbnRpdHlJbnRlcmZhY2U8YW55Pj4gfSxcblxuICBpZDogYW55LFxuKSB7XG4gIGlmICghZW50aXR5Q2FjaGVbaWRdKSBlbnRpdHlDYWNoZVtpZF0gPSBuZXcgV2Vha0xpc3RNYXAoKTtcbiAgcmV0dXJuIGVudGl0eUNhY2hlW2lkXTtcbn1cblxuLy8gVE9ETyhicmVha2luZyk6IHJlbW92ZSBvbmNlIHVudXNlZFxuZnVuY3Rpb24gd2l0aFRyYWNrZWRFbnRpdGllcyh1bnZpc2l0OiBVbnZpc2l0RnVuY3Rpb24pOiBVbnZpc2l0RnVuY3Rpb24ge1xuICAvLyBldmVyeSB0aW1lIHdlIG5lc3QsIHdlIHdhbnQgdG8gdW53cmFwIGJhY2sgdG8gdGhlIHRvcC5cbiAgLy8gdGhpcyBpcyBkdWUgdG8gb25seSBuZWVkZWQgdGhlIG5leHQgbGV2ZWwgb2YgbmVzdGVkIGVudGl0aWVzIGZvciBsb29rdXBcbiAgY29uc3Qgb3JpZ2luYWxVbnZpc2l0ID0gdW52aXNpdC5vZyB8fCB1bnZpc2l0O1xuICBjb25zdCB3cmFwcGVkVW52aXNpdCA9IChpbnB1dDogYW55LCBzY2hlbWE6IGFueSkgPT5cbiAgICBvcmlnaW5hbFVudmlzaXQoaW5wdXQsIHNjaGVtYSk7XG4gIHdyYXBwZWRVbnZpc2l0Lm9nID0gdW52aXNpdDtcbiAgcmV0dXJuIHdyYXBwZWRVbnZpc2l0O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxRQUFRLFFBQVEsZUFBZTtBQUN4QyxTQUFTQyxXQUFXLElBQUlDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUNwRSxTQUFTQyxXQUFXLFFBQVEsNkJBQTZCO0FBQ3pELFNBQVNGLFdBQVcsSUFBSUcsaUJBQWlCLFFBQVEscUJBQXFCO0FBTXRFLE9BQU9DLFdBQVcsTUFBTSxrQkFBa0I7QUFFMUMsTUFBTUMsYUFBYSxHQUFHLENBQ3BCQyxVQUF3QyxFQUN4Q0MsTUFBdUIsRUFDdkJDLE9BQXdCLEVBQ3hCQyxTQUdvQixFQUNwQkMsVUFBK0MsRUFDL0NDLFVBQWtELEVBQ2xEQyxXQUF5QyxFQUN6Q0MsWUFBc0IsRUFDdEJDLFVBQXlCLEtBQ2dEO0VBQ3pFLE1BQU1DLE1BQU0sR0FBR04sU0FBUyxDQUFDSCxVQUFVLEVBQUVDLE1BQU0sQ0FBQztFQUM1QyxJQUNFLE9BQU9RLE1BQU0sS0FBSyxRQUFRLElBQ3pCQSxNQUFNLENBQVlDLFFBQVEsRUFBRSxDQUFDQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQ2pEO0lBQ0EsT0FBTyxDQUFDQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztJQUM5QjtJQUNBO0lBQ0E7RUFDRjs7RUFFQSxJQUFJLE9BQU9ILE1BQU0sS0FBSyxRQUFRLElBQUlBLE1BQU0sS0FBSyxJQUFJLEVBQUU7SUFDakQsT0FBTyxDQUFDQSxNQUFNLEVBQVMsS0FBSyxFQUFFLEtBQUssQ0FBQztFQUN0QztFQUVBLE1BQU1JLEVBQUU7RUFDTjtFQUNBO0VBQ0EsT0FBT2IsVUFBVSxLQUFLLFFBQVEsR0FDMUJBLFVBQVUsR0FDVkMsTUFBTSxDQUFDWSxFQUFFLENBQUNqQixXQUFXLENBQUNhLE1BQU0sQ0FBQyxHQUFJQSxNQUFNLENBQVNLLElBQUksRUFBRSxHQUFHTCxN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
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0VudGl0eSIsImRlbm9ybWFsaXplIiwiYXJyYXlEZW5vcm1hbGl6ZSIsImlzSW1tdXRhYmxlIiwib2JqZWN0RGVub3JtYWxpemUiLCJXZWFrRW50aXR5TWFwIiwiZ2V0RW50aXRpZXMiLCJkZXBUb1BhdGhzIiwidW52aXNpdEVudGl0eSIsImVudGl0eU9ySWQiLCJzY2hlbWEiLCJ1bnZpc2l0IiwiZ2V0RW50aXR5IiwiZ2V0Q2FjaGUiLCJsb2NhbENhY2hlIiwiY3ljbGVDYWNoZSIsImRlcGVuZGVuY2llcyIsImN5Y2xlSW5kZXgiLCJlbnRpdHkiLCJwayIsImtleSIsInRvU3RyaW5nIiwiaW5jbHVkZXMiLCJ1bmRlZmluZWQiLCJ0b0pTIiwiT2JqZWN0IiwiY3JlYXRlIiwibG9jYWxDYWNoZUtleSIsImN5Y2xlQ2FjaGVLZXkiLCJmb3VuZCIsImRlbGV0ZWQiLCJnbG9iYWxDYWNoZSIsImNhY2hlVmFsdWUiLCJnZXQiLCJ2YWx1ZSIsInB1c2giLCJ0cmFja2luZ0luZGV4IiwibGVuZ3RoIiwicGF0aCIsImVudGl0eUNvcHkiLCJjcmVhdGVJZlZhbGlkIiwidG9PYmplY3QiLCJ3aXRoVHJhY2tlZEVudGl0aWVzIiwic2V0TG9jYWwiLCJsb2NhbEtleSIsInNsaWNlIiwiaSIsInNldCIsImdldFVudmlzaXQiLCJlbnRpdGllcyIsImVudGl0eUNhY2hlIiwicmVzdWx0Q2FjaGUiLCJnZXRFbnRpdHlDYWNoZXMiLCJpbnB1dCIsImhhc0Rlbm9ybWFsaXplIiwibWV0aG9kIiwiQXJyYXkiLCJpc0FycmF5IiwiY2FjaGFibGUiLCJyZXQiLCJlbnRpdHlQYXRocyIsInVuc2hpZnQiLCJlbnRpdHlDYWNoZUtleSIsIldlYWtNYXAiLCJ3ZW0iLCJkZW5vcm1hbGl6ZVNpbXBsZSIsIm9yaWdpbmFsVW52aXNpdCIsIm9nIiwid3JhcHBlZFVudmlzaXQiXSwic291cmNlcyI6WyIuLi9zcmMvZGVub3JtYWxpemUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTY2hlbWEsIEVudGl0eUludGVyZmFjZSwgVW52aXNpdEZ1bmN0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2UuanMnO1xuaW1wb3J0IHsgaXNFbnRpdHkgfSBmcm9tICcuL2lzRW50aXR5LmpzJztcbmltcG9ydCB7IGRlbm9ybWFsaXplIGFzIGFycmF5RGVub3JtYWxpemUgfSBmcm9tICcuL3NjaGVtYXMvQXJyYXkuanMnO1xuaW1wb3J0IHsgaXNJbW11dGFibGUgfSBmcm9tICcuL3NjaGVtYXMvSW1tdXRhYmxlVXRpbHMuanMnO1xuaW1wb3J0IHsgZGVub3JtYWxpemUgYXMgb2JqZWN0RGVub3JtYWxpemUgfSBmcm9tICcuL3NjaGVtYXMvT2JqZWN0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRGVub3JtYWxpemUsXG4gIERlbm9ybWFsaXplTnVsbGFibGUsXG4gIERlbm9ybWFsaXplQ2FjaGUsXG4gIFBhdGgsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IFdlYWtFbnRpdHlNYXAsIHtcbiAgdHlwZSBEZXAsXG4gIGdldEVudGl0aWVzLFxuICB0eXBlIEdldEVudGl0eSxcbiAgZGVwVG9QYXRocyxcbn0gZnJvbSAnLi9XZWFrRW50aXR5TWFwLmpzJztcblxuaW50ZXJmYWNlIEVudGl0eUNhY2hlVmFsdWUge1xuICBkZXBlbmRlbmNpZXM6IERlcFtdO1xuICB2YWx1ZTogW2FueSwgYm9vbGVhbiwgYm9vbGVhbl07XG59XG5jb25zdCB1bnZpc2l0RW50aXR5ID0gKFxuICBlbnRpdHlPcklkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgc3RyaW5nLFxuICBzY2hlbWE6IEVudGl0eUludGVyZmFjZSxcbiAgdW52aXNpdDogVW52aXNpdEZ1bmN0aW9uLFxuICBnZXRFbnRpdHk6IEdldEVudGl0eSxcbiAgZ2V0Q2FjaGU6IFJldHVyblR5cGU8dHlwZW9mIGdldEVudGl0eUNhY2hlcz4sXG4gIGxvY2FsQ2FjaGU6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+LFxuICBjeWNsZUNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PixcbiAgZGVwZW5kZW5jaWVzOiBEZXBbXSxcbiAgY3ljbGVJbmRleDogeyBpOiBudW1iZXIgfSxcbik6IFtkZW5vcm1hbGl6ZWQ6IG9iamVjdCB8IHVuZGVmaW5lZCwgZm91bmQ6IGJvb2xlYW4sIGRlbGV0ZWQ6IGJvb2xlYW5dID0+IHtcbiAgY29uc3QgZW50aXR5ID1cbiAgICB0eXBlb2YgZW50aXR5T3JJZCA9PT0gJ29iamVjdCdcbiAgICAgID8gZW50aXR5T3JJZFxuICAgICAgOiBnZXRFbnRpdHkoeyBwazogZW50aXR5T3JJZCwga2V5OiBzY2hlbWEua2V5IH0pO1xuICBpZiAoXG4gICAgdHlwZW9mIGVudGl0eSA9PT0gJ3N5bWJvbCcgJiZcbiAgICAoZW50aXR5IGFzIHN5bWJvbCkudG9TdHJpbmcoKS5pbmNsdWRlcygnREVMRVRFRCcpXG4gICkge1xuICAgIHJldHVybiBbdW5kZWZpbmVkLCB0cnVlLCB0cnVlXTtcbiAgICAvLyBUT0RPOiBDaGFuZ2UgdG8gdGhpcyBhcyBicmVha2luZyBjaGFuZ2Ugb25jZSB3ZSBvbmx5IHN1cHBvcnQgbmV3ZXIgZW50aXRpZXNcbiAgICAvLyBhbHNvIHJlbW92ZSBgKGVudGl0eSBhcyBzeW1ib2wpLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0RFTEVURUQnKWAgYW5kIGRvIHRoaXMgZm9yIGFsbCBzeW1ib2xzXG4gICAgLy8gcmV0dXJuIHNjaGVtYS5kZW5vcm1hbGl6ZShlbnRpdHksIHVudmlzaXQpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbnRpdHkgIT09ICdvYmplY3QnIHx8IGVudGl0eSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBbZW50aXR5IGFzIGFueSwgZmFsc2UsIGZhbHNlXTtcbiAgfVxuXG4gIGNvbnN0IHBrID1cbiAgICAvLyBub3JtYWxpemUgbXVzdCBhbHdheXMgcGxhY2UgYSBzdHJpbmcsIGJlY2F1c2UgcGsoKSByZXR1cm4gdmFsdWUgaXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgLy8gdGhlcmVmb3JlIG5vIG5lZWQgdG8gY2hlY2sgZm9yIG51bWJlcnNcbiAgICB0eXBlb2YgZW50aXR5T3JJZCA9PT0gJ3N0cmluZydcbiAgICAgID8gZW50aXR5T3JJZFxuICAgICAgOiBzY2hlbWEucGsoaXNJbW11dGFibGUoZW50aXR5KSA/IChlbnRpdHkgYXMgYW55KS50b0pTKCkgOiBlbnRpdHkpO1xuICAvLyBpZiB3ZSBjYW4ndCBnZW5lcmF0ZSBhIHdvcmtpbmcgcGs7IHRoaXMgaXMgaG9wZWxlc3Mgc28gbGV0J3MgZ2l2ZSB0aGVtIHdoYXQncyBhbHJlYWR5IHRoZXJlXG4gIC8vIG90aGVyd2lzZSwgZXZlbiB3aGVuIHdlIGFyZW4ndCBkb2luZyBhIGxvb2t1cCB3ZSB3YW50IHRvIHR1cm4gdGhlIGVudGl0eU9ySWQgb2JqZWN0IGludG8gdGhlXG4gIC8vIGV4cGVjdGVkIGNsYXNzLCBhbmQgY2FjaGUgdGhhdCBjbGFzcyBmb3IgcmVmZXJlbnRpYWwgZXF1YWxpdHkuIFBLIGlzIHVzZWQgZm9yIGdsb2JhbCBlcXVhbGl0eSBsb29rdXAuXG4gIGlmIChwayA9PT0gdW5kZWZpbmVkIHx8IHBrID09PSAnJyB8fCBwayA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gW2VudGl0eSwgZmFsc2UsIGZhbHNlXTtcbiAgfVxuXG4gIGNvbnN0IGtleSA9IHNjaGVtYS5rZXk7XG4gIGlmICghKGtleSBpbiBsb2NhbENhY2hlKSkge1xuICAgIGxvY2FsQ2FjaGVba2V5XSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgaWYgKCEoa2V5IGluIGN5Y2xlQ2FjaGUpKSB7XG4gICAgY3ljbGVDYWNoZVtrZXldID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICBjb25zdCBsb2NhbENhY2hlS2V5ID0gbG9jYWxDYWNoZVtrZXldO1xuICBjb25zdCBjeWNsZUNhY2hlS2V5ID0gY3ljbGVDYWNoZVtrZXldO1xuXG4gIGxldCBmb3VuZCA9IHRydWU7XG4gIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgLy8gbG9jYWwgY2FjaGUgbG9va3VwIGZpcnN0XG4gIGlmICghbG9jYWxDYWNoZUtleVtwa10pIHtcbiAgICBjb25zdCBnbG9iYWxDYWNoZTogV2Vha0VudGl0eU1hcDxvYmplY3QsIEVudGl0eUNhY2hlVmFsdWU+ID0gZ2V0Q2FjaGUoXG4gICAgICBwayxcbiAgICAgIHNjaGVtYSxcbiAgICApO1xuICAgIGNvbnN0IFtjYWNoZVZhbHVlXSA9IGdsb2JhbENhY2hlLmdldChlbnRpdHksIGdldEVudGl0eSk7XG4gICAgLy8gVE9ETzogd2hhdCBpZiB0aGlzIGp1c3QgcmV0dXJuZWQgdGhlIGRlcHMgLSB0aGVuIHdlIGRvbid0IG5lZWQgdG8gc3RvcmUgdGhlbVxuXG4gICAgaWYgKGNhY2hlVmFsdWUpIHtcbiAgICAgIGxvY2FsQ2FjaGVLZXlbcGtdID0gY2FjaGVWYWx1ZS52YWx1ZVswXTtcbiAgICAgIC8vIFRPRE86IGNhbiB3ZSBzdG9yZSB0aGUgY2FjaGUgdmFsdWVzIGluc3RlYWQgb2YgdHJhY2tpbmcgKmFsbCogdGhlaXIgc291cmNlcz9cbiAgICAgIC8vIHRoaXMgaXMgb25seSB1c2VkIGZvciBzZXR0aW5nIHJlc3VsdHMgY2FjaGUgY29ycmVjdGx5LiBpZiB3ZSBnb3QgdGhpcyBmYXIgd2Ugd2lsbCBkZWYgbmVlZCB0byBzZXQgYXMgd2Ugd291bGQgaGF2ZSBhbHJlYWR5IHRyaWVkIGdldHRpbmcgaXRcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKC4uLmNhY2hlVmFsdWUuZGVwZW5kZW5jaWVzKTtcbiAgICAgIHJldHVybiBjYWNoZVZhbHVlLnZhbHVlO1xuICAgIH1cbiAgICAvLyBpZiB3ZSBkb24ndCBmaW5kIGluIGRlbm9ybWFsaXplIGNhY2hlIHRoZW4gZG8gZnVsbCBkZW5vcm1hbGl6ZVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgdHJhY2tpbmdJbmRleCA9IGRlcGVuZGVuY2llcy5sZW5ndGg7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCh7IGVudGl0eSwgcGF0aDogeyBrZXksIHBrIH0gfSk7XG5cbiAgICAgIGxldCBlbnRpdHlDb3B5OiBhbnk7XG4gICAgICBpZiAoc2NoZW1hLmNyZWF0ZUlmVmFsaWQpIHtcbiAgICAgICAgZW50aXR5Q29weSA9IGxvY2FsQ2FjaGVLZXlbcGtdID0gaXNJbW11dGFibGUoZW50aXR5KVxuICAgICAgICAgID8gc2NoZW1hLmNyZWF0ZUlmVmFsaWQoZW50aXR5LnRvT2JqZWN0KCkpXG4gICAgICAgICAgOiBzY2hlbWEuY3JlYXRlSWZWYWxpZChlbnRpdHkpO1xuICAgICAgICAvLyBUT0RPKGJyZWFraW5nKTogcmVtb3ZlIG9uY2Ugb2xkIHZlcmlvbnMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50aXR5Q29weSA9IGVudGl0eTtcbiAgICAgICAgdW52aXNpdCA9IHdpdGhUcmFja2VkRW50aXRpZXModW52aXNpdCk7XG4gICAgICAgIHVudmlzaXQuc2V0TG9jYWwgPSBlbnRpdHlDb3B5ID0+IChsb2NhbENhY2hlS2V5W3BrXSA9IGVudGl0eUNvcHkpO1xuICAgICAgfVxuXG4gICAgICBjeWNsZUNhY2hlS2V5W3BrXSA9IHRyYWNraW5nSW5kZXg7XG4gICAgICBpZiAoZW50aXR5Q29weSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHVuZGVmaW5lZCBpbmRpY2F0ZXMgd2Ugc2hvdWxkIHN1c3BlbnNlIChwZXJoYXBzIGZhaWxlZCB2YWxpZGF0aW9uKVxuICAgICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFtsb2NhbENhY2hlS2V5W3BrXSwgZm91bmQsIGRlbGV0ZWRdID0gc2NoZW1hLmRlbm9ybWFsaXplKFxuICAgICAgICAgIGVudGl0eUNvcHksXG4gICAgICAgICAgdW52aXNpdCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBjeWNsZUNhY2hlS2V5W3BrXTtcblxuICAgICAgLy8gaWYgaW4gY3ljbGUsIHVzZSB0aGUgc3RhcnQgb2YgdGhlIGN5Y2xlIHRvIHRyYWNrIGFsbCBkZXBzXG4gICAgICAvLyBvdGhlcndpc2UsIHdlIHVzZSBvdXIgb3duIHRyYWNraW5nSW5kZXhcbiAgICAgIGNvbnN0IGxvY2FsS2V5ID0gZGVwZW5kZW5jaWVzLnNsaWNlKFxuICAgICAgICBjeWNsZUluZGV4LmkgPT09IC0xID8gdHJhY2tpbmdJbmRleCA6IGN5Y2xlSW5kZXguaSxcbiAgICAgICk7XG4gICAgICBjb25zdCBjYWNoZVZhbHVlOiBFbnRpdHlDYWNoZVZhbHVlID0ge1xuICAgICAgICBkZXBlbmRlbmNpZXM6IGxvY2FsS2V5LFxuICAgICAgICB2YWx1ZTogW2xvY2FsQ2FjaGVLZXlbcGtdLCBmb3VuZCwgZGVsZXRlZF0sXG4gICAgICB9O1xuICAgICAgZ2xvYmFsQ2FjaGUuc2V0KGxvY2FsS2V5LCBjYWNoZVZhbHVlKTtcblxuICAgICAgLy8gc3RhcnQgb2YgY3ljbGUgLSByZXNldCBjeWNsZSBkZXRlY3Rpb25cbiAgICAgIGlmIChjeWNsZUluZGV4LmkgPT09IHRyYWNraW5nSW5kZXgpIHtcbiAgICAgICAgY3ljbGVJbmRleC5pID0gLTE7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGN5Y2xlIGRldGVjdGVkXG4gICAgaWYgKHBrIGluIGN5Y2xlQ2FjaGVLZXkpIHtcbiAgICAgIGN5Y2xlSW5kZXguaSA9IGN5Y2xlQ2FjaGVLZXlbcGtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB3aXRoIG5vIGN5Y2xlLCBnbG9iYWxDYWNoZUVudHJ5IHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCh7IGVudGl0eSwgcGF0aDogeyBrZXksIHBrIH0gfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtsb2NhbENhY2hlS2V5W3BrXSwgZm91bmQsIGRlbGV0ZWRdO1xufTtcblxuY29uc3QgZ2V0VW52aXNpdCA9IChcbiAgZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+LFxuICBlbnRpdHlDYWNoZTogRGVub3JtYWxpemVDYWNoZVsnZW50aXRpZXMnXSxcbiAgcmVzdWx0Q2FjaGU6IERlbm9ybWFsaXplQ2FjaGVbJ3Jlc3VsdHMnXVtzdHJpbmddLFxuKSA9PiB7XG4gIGNvbnN0IGdldEVudGl0eSA9IGdldEVudGl0aWVzKGVudGl0aWVzKTtcbiAgY29uc3QgZ2V0Q2FjaGUgPSBnZXRFbnRpdHlDYWNoZXMoZW50aXR5Q2FjaGUpO1xuICBjb25zdCBsb2NhbENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHt9O1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IERlcFtdID0gW107XG4gIGNvbnN0IGN5Y2xlSW5kZXggPSB7IGk6IC0xIH07XG4gIGNvbnN0IGN5Y2xlQ2FjaGUgPSB7fTtcblxuICBmdW5jdGlvbiB1bnZpc2l0KFxuICAgIGlucHV0OiBhbnksXG4gICAgc2NoZW1hOiBhbnksXG4gICk6IFtkZW5vcm1hbGl6ZWQ6IGFueSwgZm91bmQ6IGJvb2xlYW4sIGRlbGV0ZWQ6IGJvb2xlYW5dIHtcbiAgICBpZiAoIXNjaGVtYSkgcmV0dXJuIFtpbnB1dCwgdHJ1ZSwgZmFsc2VdO1xuXG4gICAgLy8gbnVsbCBpcyBjb25zaWRlcmVkIGludGVudGlvbmFsLCB0aHVzIGFsd2F5cyAnZm91bmQnIGFzIHRydWVcbiAgICBpZiAoaW5wdXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBbaW5wdXQsIHRydWUsIGZhbHNlXTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNEZW5vcm1hbGl6ZSA9IHR5cGVvZiBzY2hlbWEuZGVub3JtYWxpemUgPT09ICdmdW5jdGlvbic7XG5cbiAgICAvLyBkZXNlcmlhbGl6ZSBmaWVsZHMgKGxpa2UgRGF0ZSlcbiAgICBpZiAoIWhhc0Rlbm9ybWFsaXplICYmIHR5cGVvZiBzY2hlbWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIHNjaGVtYSkgcmV0dXJuIFtpbnB1dCwgdHJ1ZSwgZmFsc2VdO1xuICAgICAgLy8gZmllbGQgZGVzZXJpYWxpemF0aW9uIHNob3VsZCBuZXZlciBjb3VudCBhZ2FpbnN0ICdmb3VuZCcgKHdoZXRoZXIgdG8gdXNlZCBpbmZlcnJlZCByZXN1bHRzKVxuICAgICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHJldHVybiBbaW5wdXQsIHRydWUsIGZhbHNlXTtcbiAgICAgIHJldHVybiBbbmV3IHNjaGVtYShpbnB1dCksIHRydWUsIGZhbHNlXTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFtpbnB1dCwgZmFsc2UsIGZhbHNlXTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0Rlbm9ybWFsaXplICYmIHR5cGVvZiBzY2hlbWEgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBtZXRob2QgPSBBcnJheS5pc0FycmF5KHNjaGVtYSlcbiAgICAgICAgPyBhcnJheURlbm9ybWFsaXplXG4gICAgICAgIDogb2JqZWN0RGVub3JtYWxpemU7XG4gICAgICByZXR1cm4gbWV0aG9kKHNjaGVtYSwgaW5wdXQsIHVudmlzaXQpO1xuICAgIH1cblxuICAgIGlmIChpc0VudGl0eShzY2hlbWEpKSB7XG4gICAgICByZXR1cm4gdW52aXNpdEVudGl0eShcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdW52aXNpdCxcbiAgICAgICAgZ2V0RW50aXR5LFxuICAgICAgICBnZXRDYWNoZSxcbiAgICAgICAgbG9jYWxDYWNoZSxcbiAgICAgICAgY3ljbGVDYWNoZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgICBjeWNsZUluZGV4LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzRGVub3JtYWxpemUpIHtcbiAgICAgIHJldHVybiBzY2hlbWEuZGVub3JtYWxpemUoaW5wdXQsIHVudmlzaXQpO1xuICAgIH1cblxuICAgIHJldHVybiBbaW5wdXQsIHRydWUsIGZhbHNlXTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgaW5wdXQ6IGFueSxcbiAgICBzY2hlbWE6IGFueSxcbiAgKTogW1xuICAgIGRlbm9ybWFsaXplZDogYW55LFxuICAgIGZvdW5kOiBib29sZWFuLFxuICAgIGRlbGV0ZWQ6IGJvb2xlYW4sXG4gICAgZW50aXR5UGF0aHM6IFBhdGhbXSxcbiAgXSA9PiB7XG4gICAgLy8gaW4gdGhlIGNhc2Ugd2hlcmUgV2Vha01hcCBjYW5ub3QgYmUgdXNlZFxuICAgIC8vIHRoaXMgdGVzdCBlbnN1cmVzIG51bGwgaXMgcHJvcGVybHkgZXhjbHVkZWQgZnJvbSBXZWFrTWFwXG4gICAgY29uc3QgY2FjaGFibGUgPSBPYmplY3QoaW5wdXQpID09PSBpbnB1dCAmJiBPYmplY3Qoc2NoZW1hKSA9PT0gc2NoZW1hO1xuICAgIGlmICghY2FjaGFibGUpIHtcbiAgICAgIGNvbnN0IHJldCA9IHVudmlzaXQoaW5wdXQsIHNjaGVtYSk7XG4gICAgICAvLyB0aGlzIGlzIGZhc3RlciB0aGFuIHNwcmVhZFxuICAgICAgLy8gaHR0cHM6Ly93d3cubWVhc3VyZXRoYXQubmV0L0JlbmNobWFya3MvU2hvdy8yMzYzNi8wL3NwcmVhZC13aXRoLXR1cGxlc1xuICAgICAgcmV0dXJuIFtyZXRbMF0sIHJldFsxXSwgcmV0WzJdLCBkZXBUb1BhdGhzKGRlcGVuZGVuY2llcyldO1xuICAgIH1cblxuICAgIGxldCBbcmV0LCBlbnRpdHlQYXRoc10gPSByZXN1bHRDYWNoZS5nZXQoaW5wdXQsIGdldEVudGl0eSk7XG5cbiAgICBpZiAocmV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldCA9IHVudmlzaXQoaW5wdXQsIHNjaGVtYSk7XG4gICAgICAvLyB3ZSB3YW50IHRvIGRvIHRoaXMgYmVmb3JlIHdlIGFkZCBvdXIgJ2lucHV0JyBlbnRyeVxuICAgICAgZW50aXR5UGF0aHMgPSBkZXBUb1BhdGhzKGRlcGVuZGVuY2llcyk7XG4gICAgICAvLyBmb3IgdGhlIGZpcnN0IGVudHJ5LCBgcGF0aGAgaXMgaWdub3JlZCBzbyBlbXB0eSBtZW1iZXJzIGlzIGZpbmVcbiAgICAgIGRlcGVuZGVuY2llcy51bnNoaWZ0KHsgZW50aXR5OiBpbnB1dCwgcGF0aDogeyBrZXk6ICcnLCBwazogJycgfSB9KTtcbiAgICAgIHJlc3VsdENhY2hlLnNldChkZXBlbmRlbmNpZXMsIHJldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtyZXRbMF0sIHJldFsxXSwgcmV0WzJdLCBlbnRpdHlQYXRocyBhcyBQYXRoW11dO1xuICB9O1xufTtcblxuY29uc3QgZ2V0RW50aXR5Q2FjaGVzID0gKGVudGl0eUNhY2hlOiBEZW5vcm1hbGl6ZUNhY2hlWydlbnRpdGllcyddKSA9PiB7XG4gIHJldHVybiAocGs6IHN0cmluZywgc2NoZW1hOiBFbnRpdHlJbnRlcmZhY2UpID0+IHtcbiAgICBjb25zdCBrZXkgPSBzY2hlbWEua2V5O1xuXG4gICAgaWYgKCEoa2V5IGluIGVudGl0eUNhY2hlKSkge1xuICAgICAgZW50aXR5Q2FjaGVba2V5XSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuICAgIGNvbnN0IGVudGl0eUNhY2hlS2V5ID0gZW50aXR5Q2FjaGVba2V5XTtcbiAgICBpZiAoIWVudGl0eUNhY2hlS2V5W3BrXSlcbiAgICAgIGVudGl0eUNhY2hlS2V5W3BrXSA9IG5ldyBXZWFrTWFwPFxuICAgICAgICBFbnRpdHlJbnRlcmZhY2UsXG4gICAgICAgIFdlYWtFbnRpdHlNYXA8b2JqZWN0LCBhbnk+XG4gICAgICA+KCk7XG5cbiAgICBsZXQgd2VtOiBXZWFrRW50aXR5TWFwPG9iamVjdCwgYW55PiA9IGVudGl0eUNhY2hlS2V5W3BrXS5nZXQoc2NoZW1hKSBhcyBhbnk7XG4gICAgaWYgKCF3ZW0pIHtcbiAgICAgIHdlbSA9IG5ldyBXZWFrRW50aXR5TWFwPG9iamVjdCwgYW55PigpO1xuICAgICAgZW50aXR5Q2FjaGVLZXlbcGtdLnNldChzY2hlbWEsIHdlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdlbTtcbiAgfTtcbn07XG5cbnR5cGUgRGVub3JtYWxpemVSZXR1cm48UyBleHRlbmRzIFNjaGVtYT4gPVxuICB8IFtcbiAgICAgIGRlbm9ybWFsaXplZDogRGVub3JtYWxpemU8Uz4sXG4gICAgICBmb3VuZDogdHJ1ZSxcbiAgICAgIGRlbGV0ZWQ6IGZhbHNlLFxuICAgICAgZW50aXR5UGF0aHM6IFBhdGhbXSxcbiAgICBdXG4gIHwgW1xuICAgICAgZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+LFxuICAgICAgZm91bmQ6IGJvb2xlYW4sXG4gICAgICBkZWxldGVkOiB0cnVlLFxuICAgICAgZW50aXR5UGF0aHM6IFBhdGhbXSxcbiAgICBdXG4gIHwgW1xuICAgICAgZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+LFxuICAgICAgZm91bmQ6IGZhbHNlLFxuICAgICAgZGVsZXRlZDogYm9vbGVhbixcbiAgICAgIGVudGl0eVBhdGhzOiBQYXRoW10sXG4gICAgXTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbmV4cG9ydCBjb25zdCBkZW5vcm1hbGl6ZSA9IDxTIGV4dGVuZHMgU2NoZW1hPihcbiAgaW5wdXQ6IHVua25vd24sXG4gIHNjaGVtYTogUyB8IHVuZGVmaW5lZCxcbiAgZW50aXRpZXM6IGFueSxcbiAgZW50aXR5Q2FjaGU6IERlbm9ybWFsaXplQ2FjaGVbJ2VudGl0aWVzJ10gPSB7fSxcbiAgcmVzdWx0Q2FjaGU6IERlbm9ybWFsaXplQ2FjaGVbJ3Jlc3VsdHMnXVtzdHJpbmddID0gbmV3IFdlYWtFbnRpdHlNYXAoKSxcbik6IERlbm9ybWFsaXplUmV0dXJuPFM+ID0+IHtcbiAgLy8gdW5kZWZpbmVkIG1lYW4gZG9uJ3QgZG8gYW55dGhpbmdcbiAgaWYgKHNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFtpbnB1dCwgdHJ1ZSwgZmFsc2UsIFtdXSBhcyBbYW55LCBib29sZWFuLCBib29sZWFuLCBhbnldO1xuICB9XG4gIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFt1bmRlZmluZWQsIGZhbHNlLCBmYWxzZSwgW11dIGFzIFthbnksIGJvb2xlYW4sIGJvb2xlYW4sIGFueV07XG4gIH1cbiAgcmV0dXJuIGdldFVudmlzaXQoZW50aXRpZXMsIGVudGl0eUNhY2hlLCByZXN1bHRDYWNoZSkoaW5wdXQsIHNjaGVtYSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVub3JtYWxpemVTaW1wbGUgPSA8UyBleHRlbmRzIFNjaGVtYT4oXG4gIGlucHV0OiBhbnksXG4gIHNjaGVtYTogUyB8IHVuZGVmaW5lZCxcbiAgZW50aXRpZXM6IGFueSxcbiAgZW50aXR5Q2FjaGU/OiBEZW5vcm1hbGl6ZUNhY2hlWydlbnRpdGllcyddLFxuICByZXN1bHRDYWNoZT86IERlbm9ybWFsaXplQ2FjaGVbJ3Jlc3VsdHMnXVtzdHJpbmddLFxuKTpcbiAgfCBbZGVub3JtYWxpemVkOiBEZW5vcm1hbGl6ZTxTPiwgZm91bmQ6IHRydWUsIGRlbGV0ZWQ6IGZhbHNlXVxuICB8IFtkZW5vcm1hbGl6ZWQ6IERlbm9ybWFsaXplTnVsbGFibGU8Uz4sIGZvdW5kOiBib29sZWFuLCBkZWxldGVkOiB0cnVlXVxuICB8IFtkZW5vcm1hbGl6ZWQ6IERlbm9ybWFsaXplTnVsbGFibGU8Uz4sIGZvdW5kOiBmYWxzZSwgZGVsZXRlZDogYm9vbGVhbl0gPT5cbiAgZGVub3JtYWxpemUoaW5wdXQsIHNjaGVtYSwgZW50aXRpZXMsIGVudGl0eUNhY2hlLCByZXN1bHRDYWNoZSkuc2xpY2UoXG4gICAgMCxcbiAgICAzLFxuICApIGFzIGFueTtcblxuLy8gVE9ETyhicmVha2luZyk6IHJlbW92ZSBvbmNlIHVudXNlZFxuZnVuY3Rpb24gd2l0aFRyYWNrZWRFbnRpdGllcyh1bnZpc2l0OiBVbnZpc2l0RnVuY3Rpb24pOiBVbnZpc2l0RnVuY3Rpb24ge1xuICAvLyBldmVyeSB0aW1lIHdlIG5lc3QsIHdlIHdhbnQgdG8gdW53cmFwIGJhY2sgdG8gdGhlIHRvcC5cbiAgLy8gdGhpcyBpcyBkdWUgdG8gb25seSBuZWVkZWQgdGhlIG5leHQgbGV2ZWwgb2YgbmVzdGVkIGVudGl0aWVzIGZvciBsb29rdXBcbiAgY29uc3Qgb3JpZ2luYWxVbnZpc2l0ID0gdW52aXNpdC5vZyB8fCB1bnZpc2l0O1xuICBjb25zdCB3cmFwcGVkVW52aXNpdCA9IChpbnB1dDogYW55LCBzY2hlbWE6IGFueSkgPT5cbiAgICBvcmlnaW5hbFVudmlzaXQoaW5wdXQsIHNjaGVtYSk7XG4gIHdyYXBwZWRVbnZpc2l0Lm9nID0gdW52aXNpdDtcbiAgcmV0dXJuIHdyYXBwZWRVbnZpc2l0O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxRQUFRLFFBQVEsZUFBZTtBQUN4QyxTQUFTQyxXQUFXLElBQUlDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUNwRSxTQUFTQyxXQUFXLFFBQVEsNkJBQTZCO0FBQ3pELFNBQVNGLFdBQVcsSUFBSUcsaUJBQWlCLFFBQVEscUJBQXFCO0FBT3RFLE9BQU9DLGFBQWEsSUFFbEJDLFdBQVcsRUFFWEMsVUFBVSxRQUNMLG9CQUFvQjtBQU0zQixNQUFNQyxhQUFhLEdBQUcsQ0FDcEJDLFVBQXdDLEVBQ3hDQyxNQUF1QixFQUN2QkMsT0FBd0IsRUFDeEJDLFNBQW9CLEVBQ3BCQyxRQUE0QyxFQUM1Q0MsVUFBK0MsRUFDL0NDLFVBQWtELEVBQ2xEQyxZQUFtQixFQUNuQkMsVUFBeUIsS0FDZ0Q7RUFDekUsTUFBTUMsTUFBTSxHQUNWLE9BQU9ULFVBQVUsS0FBSyxRQUFRLEdBQzFCQSxVQUFVLEdBQ1ZHLFNBQVMsQ0FBQztJQUFFTyxFQUFFLEVBQUVWLFVBQVU7SUFBRVcsR0FBRyxFQUFFVixNQUFNLENBQUNVO0VBQUksQ0FBQyxDQUFDO0VBQ3BELElBQ0UsT0FBT0YsTUFBTSxLQUFLLFFBQVEsSUFDekJBLE1BQU0sQ0FBWUcsUUFBUSxFQUFFLENBQUNDLFFBQVEsQ0FB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
import { denormalize } from './denormalize.js';
import { isEntity } from './isEntity.js';
import { normalize } from './normalize.js';
import WeakListMap from './WeakListMap.js';
import WeakEntityMap from './WeakEntityMap.js';
export { default as inferResults } from './inferResults.js';
export { DELETED } from './special.js';
export type { AbstractInstanceType, NormalizeReturnType, NormalizedSchema, DenormalizeReturnType, DenormalizeCache, } from './types.js';
export type { AbstractInstanceType, NormalizeReturnType, NormalizedSchema, DenormalizeReturnType, DenormalizeCache, Path, } from './types.js';
export * from './endpoint/types.js';

@@ -12,3 +12,3 @@ export * from './interface.js';

export * from './normal.js';
export { denormalize, normalize, isEntity, WeakListMap };
export { denormalize, normalize, isEntity, WeakEntityMap };
//# sourceMappingURL=index.d.ts.map

@@ -7,3 +7,3 @@ Object.hasOwn = Object.hasOwn || /* istanbul ignore next */function hasOwn(it, key) {

import { normalize } from './normalize.js';
import WeakListMap from './WeakListMap.js';
import WeakEntityMap from './WeakEntityMap.js';
export { default as inferResults } from './inferResults.js';

@@ -15,3 +15,3 @@ export { DELETED } from './special.js';

export * from './normal.js';
export { denormalize, normalize, isEntity, WeakListMap };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlbm9ybWFsaXplIiwiaXNFbnRpdHkiLCJub3JtYWxpemUiLCJXZWFrTGlzdE1hcCIsImRlZmF1bHQiLCJpbmZlclJlc3VsdHMiLCJERUxFVEVEIl0sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIk9iamVjdC5oYXNPd24gPVxuICBPYmplY3QuaGFzT3duIHx8XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIGZ1bmN0aW9uIGhhc093bihpdCwga2V5KSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbiAgfTtcbmltcG9ydCB7IGRlbm9ybWFsaXplIH0gZnJvbSAnLi9kZW5vcm1hbGl6ZS5qcyc7XG5pbXBvcnQgeyBpc0VudGl0eSB9IGZyb20gJy4vaXNFbnRpdHkuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplIH0gZnJvbSAnLi9ub3JtYWxpemUuanMnO1xuaW1wb3J0IFdlYWtMaXN0TWFwIGZyb20gJy4vV2Vha0xpc3RNYXAuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmZlclJlc3VsdHMgfSBmcm9tICcuL2luZmVyUmVzdWx0cy5qcyc7XG5leHBvcnQgeyBERUxFVEVEIH0gZnJvbSAnLi9zcGVjaWFsLmpzJztcblxuZXhwb3J0IHR5cGUge1xuICBBYnN0cmFjdEluc3RhbmNlVHlwZSxcbiAgTm9ybWFsaXplUmV0dXJuVHlwZSxcbiAgTm9ybWFsaXplZFNjaGVtYSxcbiAgRGVub3JtYWxpemVSZXR1cm5UeXBlLFxuICBEZW5vcm1hbGl6ZUNhY2hlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZW5kcG9pbnQvdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHBpcnkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3JtYWwuanMnO1xuXG5leHBvcnQgeyBkZW5vcm1hbGl6ZSwgbm9ybWFsaXplLCBpc0VudGl0eSwgV2Vha0xpc3RNYXAgfTtcbiJdLCJtYXBwaW5ncyI6IkFBQUFBLE1BQU0sQ0FBQ0MsTUFBTSxHQUNYRCxNQUFNLENBQUNDLE1BQU0sSUFDYiwwQkFBMkIsU0FBU0EsTUFBTSxDQUFDQyxFQUFFLEVBQUVDLEdBQUcsRUFBRTtFQUNsRCxPQUFPSCxNQUFNLENBQUNJLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNKLEVBQUUsRUFBRUMsR0FBRyxDQUFDO0FBQ3RELENBQUM7QUFDSCxTQUFTSSxXQUFXLFFBQVEsa0JBQWtCO0FBQzlDLFNBQVNDLFFBQVEsUUFBUSxlQUFlO0FBQ3hDLFNBQVNDLFNBQVMsUUFBUSxnQkFBZ0I7QUFDMUMsT0FBT0MsV0FBVyxNQUFNLGtCQUFrQjtBQUMxQyxTQUFTQyxPQUFPLElBQUlDLFlBQVksUUFBUSxtQkFBbUI7QUFDM0QsU0FBU0MsT0FBTyxRQUFRLGNBQWM7QUFTdEMsY0FBYyxxQkFBcUI7QUFDbkMsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsYUFBYTtBQUUzQixTQUFTTixXQUFXLEVBQUVFLFNBQVMsRUFBRUQsUUFBUSxFQUFFRSxXQUFXIn0=
export { denormalize, normalize, isEntity, WeakEntityMap };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlbm9ybWFsaXplIiwiaXNFbnRpdHkiLCJub3JtYWxpemUiLCJXZWFrRW50aXR5TWFwIiwiZGVmYXVsdCIsImluZmVyUmVzdWx0cyIsIkRFTEVURUQiXSwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiT2JqZWN0Lmhhc093biA9XG4gIE9iamVjdC5oYXNPd24gfHxcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuICB9O1xuaW1wb3J0IHsgZGVub3JtYWxpemUgfSBmcm9tICcuL2Rlbm9ybWFsaXplLmpzJztcbmltcG9ydCB7IGlzRW50aXR5IH0gZnJvbSAnLi9pc0VudGl0eS5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemUgfSBmcm9tICcuL25vcm1hbGl6ZS5qcyc7XG5pbXBvcnQgV2Vha0VudGl0eU1hcCBmcm9tICcuL1dlYWtFbnRpdHlNYXAuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmZlclJlc3VsdHMgfSBmcm9tICcuL2luZmVyUmVzdWx0cy5qcyc7XG5leHBvcnQgeyBERUxFVEVEIH0gZnJvbSAnLi9zcGVjaWFsLmpzJztcblxuZXhwb3J0IHR5cGUge1xuICBBYnN0cmFjdEluc3RhbmNlVHlwZSxcbiAgTm9ybWFsaXplUmV0dXJuVHlwZSxcbiAgTm9ybWFsaXplZFNjaGVtYSxcbiAgRGVub3JtYWxpemVSZXR1cm5UeXBlLFxuICBEZW5vcm1hbGl6ZUNhY2hlLFxuICBQYXRoLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZW5kcG9pbnQvdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHBpcnkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3JtYWwuanMnO1xuXG5leHBvcnQgeyBkZW5vcm1hbGl6ZSwgbm9ybWFsaXplLCBpc0VudGl0eSwgV2Vha0VudGl0eU1hcCB9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQUEsTUFBTSxDQUFDQyxNQUFNLEdBQ1hELE1BQU0sQ0FBQ0MsTUFBTSxJQUNiLDBCQUEyQixTQUFTQSxNQUFNLENBQUNDLEVBQUUsRUFBRUMsR0FBRyxFQUFFO0VBQ2xELE9BQU9ILE1BQU0sQ0FBQ0ksU0FBUyxDQUFDQyxjQUFjLENBQUNDLElBQUksQ0FBQ0osRUFBRSxFQUFFQyxHQUFHLENBQUM7QUFDdEQsQ0FBQztBQUNILFNBQVNJLFdBQVcsUUFBUSxrQkFBa0I7QUFDOUMsU0FBU0MsUUFBUSxRQUFRLGVBQWU7QUFDeEMsU0FBU0MsU0FBUyxRQUFRLGdCQUFnQjtBQUMxQyxPQUFPQyxhQUFhLE1BQU0sb0JBQW9CO0FBQzlDLFNBQVNDLE9BQU8sSUFBSUMsWUFBWSxRQUFRLG1CQUFtQjtBQUMzRCxTQUFTQyxPQUFPLFFBQVEsY0FBYztBQVV0QyxjQUFjLHFCQUFxQjtBQUNuQyxjQUFjLGdCQUFnQjtBQUM5QixjQUFjLGFBQWE7QUFDM0IsY0FBYyxhQUFhO0FBRTNCLFNBQVNOLFdBQVcsRUFBRUUsU0FBUyxFQUFFRCxRQUFRLEVBQUVFLGFBQWEifQ==
import type { Schema, Serializable, EntityInterface, NormalizedIndex, SchemaClass } from './interface.js';
import type WeakListMap from './WeakListMap.js';
import type WeakEntityMap from './WeakEntityMap.js';
export interface Path {
key: string;
pk: string;
}
export type AbstractInstanceType<T> = T extends {

@@ -36,7 +40,7 @@ prototype: infer U;

[key: string]: {
[pk: string]: WeakListMap<object, EntityInterface>;
[pk: string]: WeakMap<EntityInterface, WeakEntityMap<object, any>>;
};
};
results: {
[key: string]: WeakListMap<object, any>;
[key: string]: WeakEntityMap<object, any>;
};

@@ -43,0 +47,0 @@ }

export {};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgU2NoZW1hLFxuICBTZXJpYWxpemFibGUsXG4gIEVudGl0eUludGVyZmFjZSxcbiAgTm9ybWFsaXplZEluZGV4LFxuICBTY2hlbWFDbGFzcyxcbn0gZnJvbSAnLi9pbnRlcmZhY2UuanMnO1xuaW1wb3J0IHR5cGUgV2Vha0xpc3RNYXAgZnJvbSAnLi9XZWFrTGlzdE1hcC5qcyc7XG5cbmV4cG9ydCB0eXBlIEFic3RyYWN0SW5zdGFuY2VUeXBlPFQ+ID0gVCBleHRlbmRzIHsgcHJvdG90eXBlOiBpbmZlciBVIH1cbiAgPyBVXG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRFbnRpdHk8VD4gPSBUIGV4dGVuZHMge1xuICBwcm90b3R5cGU6IGluZmVyIFU7XG4gIHNjaGVtYTogaW5mZXIgUztcbn1cbiAgPyB7IFtLIGluIEV4Y2x1ZGU8a2V5b2YgVSwga2V5b2YgUz5dOiBVW0tdIH0gJiB7IFtLIGluIGtleW9mIFNdOiBzdHJpbmcgfVxuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBEZW5vcm1hbGl6ZU9iamVjdDxTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtLIGluIGtleW9mIFNdOiBTW0tdIGV4dGVuZHMgU2NoZW1hID8gRGVub3JtYWxpemU8U1tLXT4gOiBTW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgRGVub3JtYWxpemVOdWxsYWJsZU9iamVjdDxTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtLIGluIGtleW9mIFNdOiBTW0tdIGV4dGVuZHMgU2NoZW1hID8gRGVub3JtYWxpemVOdWxsYWJsZTxTW0tdPiA6IFNbS107XG59O1xuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVPYmplY3Q8UyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBbSyBpbiBrZXlvZiBTXTogU1tLXSBleHRlbmRzIFNjaGVtYSA/IE5vcm1hbGl6ZTxTW0tdPiA6IFNbS107XG59O1xuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkTnVsbGFibGVPYmplY3Q8UyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBbSyBpbiBrZXlvZiBTXTogU1tLXSBleHRlbmRzIFNjaGVtYSA/IE5vcm1hbGl6ZU51bGxhYmxlPFNbS10+IDogU1tLXTtcbn07XG5cbmludGVyZmFjZSBOZXN0ZWRTY2hlbWFDbGFzczxUID0gYW55PiB7XG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgU2NoZW1hPjtcbiAgcHJvdG90eXBlOiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZENsYXNzPFQgPSBhbnk+IGV4dGVuZHMgTmVzdGVkU2NoZW1hQ2xhc3M8VD4ge1xuICBmcm9tSlM6ICguLi5hcmdzOiBhbnkpID0+IEFic3RyYWN0SW5zdGFuY2VUeXBlPFQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbm9ybWFsaXplQ2FjaGUge1xuICBlbnRpdGllczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIFtwazogc3RyaW5nXTogV2Vha0xpc3RNYXA8b2JqZWN0LCBFbnRpdHlJbnRlcmZhY2U+O1xuICAgIH07XG4gIH07XG4gIHJlc3VsdHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBXZWFrTGlzdE1hcDxvYmplY3QsIGFueT47XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIERlbm9ybWFsaXplTnVsbGFibGVOZXN0ZWRTY2hlbWE8UyBleHRlbmRzIE5lc3RlZFNjaGVtYUNsYXNzPiA9XG4gIGtleW9mIFNbJ3NjaGVtYSddIGV4dGVuZHMgbmV2ZXJcbiAgICA/IFNbJ3Byb3RvdHlwZSddIC8vIHRoaXMgaXMgdGhlIGNhc2Ugb2YgYSBub24tc2V0IHNjaGVtYSwgd2hpY2ggbWVhbnMgaXQgYWN0dWFsbHkgaGFzIG5vIG1lbWJlcnNcbiAgICA6IHN0cmluZyBleHRlbmRzIGtleW9mIFNbJ3NjaGVtYSddXG4gICAgPyBTWydwcm90b3R5cGUnXVxuICAgIDogU1sncHJvdG90eXBlJ10gLyomIHtcbiAgICAgICAgW0sgaW4ga2V5b2YgU1snc2NoZW1hJ11dOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFNbJ3NjaGVtYSddW0tdPjtcbiAgICAgIH0qLztcblxuZXhwb3J0IHR5cGUgRGVub3JtYWxpemVSZXR1cm5UeXBlPFQ+ID0gVCBleHRlbmRzIChcbiAgaW5wdXQ6IGFueSxcbiAgdW52aXNpdDogYW55LFxuKSA9PiBbaW5mZXIgUiwgYW55LCBhbnldXG4gID8gUlxuICA6IG5ldmVyO1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplUmV0dXJuVHlwZTxUPiA9IFQgZXh0ZW5kcyAoLi4uYXJnczogYW55KSA9PiBpbmZlciBSXG4gID8gUlxuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBEZW5vcm1hbGl6ZTxTPiA9IFMgZXh0ZW5kcyBFbnRpdHlJbnRlcmZhY2U8aW5mZXIgVT5cbiAgPyBVXG4gIDogUyBleHRlbmRzIFJlY29yZENsYXNzXG4gID8gQWJzdHJhY3RJbnN0YW5jZVR5cGU8Uz5cbiAgOiBTIGV4dGVuZHMgU2NoZW1hQ2xhc3NcbiAgPyBEZW5vcm1hbGl6ZVJldHVyblR5cGU8U1snZGVub3JtYWxpemUnXT5cbiAgOiBTIGV4dGVuZHMgU2VyaWFsaXphYmxlPGluZmVyIFQ+XG4gID8gVFxuICA6IFMgZXh0ZW5kcyBBcnJheTxpbmZlciBGPlxuICA/IERlbm9ybWFsaXplPEY+W11cbiAgOiBTIGV4dGVuZHMgeyBbSzogc3RyaW5nXTogYW55IH1cbiAgPyBEZW5vcm1hbGl6ZU9iamVjdDxTPlxuICA6IFM7XG5cbmV4cG9ydCB0eXBlIERlbm9ybWFsaXplTnVsbGFibGU8Uz4gPSBTIGV4dGVuZHMgRW50aXR5SW50ZXJmYWNlPGFueT5cbiAgPyBEZW5vcm1hbGl6ZU51bGxhYmxlTmVzdGVkU2NoZW1hPFM+IHwgdW5kZWZpbmVkXG4gIDogUyBleHRlbmRzIFJlY29yZENsYXNzXG4gID8gRGVub3JtYWxpemVOdWxsYWJsZU5lc3RlZFNjaGVtYTxTPlxuICA6IFMgZXh0ZW5kcyBTY2hlbWFDbGFzc1xuICA/IERlbm9ybWFsaXplUmV0dXJuVHlwZTxTWydfZGVub3JtYWxpemVOdWxsYWJsZSddPlxuICA6IFMgZXh0ZW5kcyBTZXJpYWxpemFibGU8aW5mZXIgVD5cbiAgPyBUXG4gIDogUyBleHRlbmRzIEFycmF5PGluZmVyIEY+XG4gID8gRGVub3JtYWxpemU8Rj5bXSB8IHVuZGVmaW5lZFxuICA6IFMgZXh0ZW5kcyB7IFtLOiBzdHJpbmddOiBhbnkgfVxuICA/IERlbm9ybWFsaXplTnVsbGFibGVPYmplY3Q8Uz5cbiAgOiBTO1xuXG5leHBvcnQgdHlwZSBOb3JtYWxpemU8Uz4gPSBTIGV4dGVuZHMgRW50aXR5SW50ZXJmYWNlXG4gID8gc3RyaW5nXG4gIDogUyBleHRlbmRzIFJlY29yZENsYXNzXG4gID8gTm9ybWFsaXplT2JqZWN0PFNbJ3NjaGVtYSddPlxuICA6IFMgZXh0ZW5kcyBTY2hlbWFDbGFzc1xuICA/IE5vcm1hbGl6ZVJldHVyblR5cGU8U1snbm9ybWFsaXplJ10+XG4gIDogUyBleHRlbmRzIFNlcmlhbGl6YWJsZTxpbmZlciBUPlxuICA/IFRcbiAgOiBTIGV4dGVuZHMgQXJyYXk8aW5mZXIgRj5cbiAgPyBOb3JtYWxpemU8Rj5bXVxuICA6IFMgZXh0ZW5kcyB7IFtLOiBzdHJpbmddOiBhbnkgfVxuICA/IE5vcm1hbGl6ZU9iamVjdDxTPlxuICA6IFM7XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZU51bGxhYmxlPFM+ID0gUyBleHRlbmRzIEVudGl0eUludGVyZmFjZVxuICA/IHN0cmluZyB8IHVuZGVmaW5lZFxuICA6IFMgZXh0ZW5kcyBSZWNvcmRDbGFzc1xuICA/IE5vcm1hbGl6ZWROdWxsYWJsZU9iamVjdDxTWydzY2hlbWEnXT5cbiAgOiBTIGV4dGVuZHMgU2NoZW1hQ2xhc3NcbiAgPyBOb3JtYWxpemVSZXR1cm5UeXBlPFNbJ19ub3JtYWxpemVOdWxsYWJsZSddPlxuICA6IFMgZXh0ZW5kcyBTZXJpYWxpemFibGU8aW5mZXIgVD5cbiAgPyBUXG4gIDogUyBleHRlbmRzIEFycmF5PGluZmVyIEY+XG4gID8gTm9ybWFsaXplPEY+W10gfCB1bmRlZmluZWRcbiAgOiBTIGV4dGVuZHMgeyBbSzogc3RyaW5nXTogYW55IH1cbiAgPyBOb3JtYWxpemVkTnVsbGFibGVPYmplY3Q8Uz5cbiAgOiBTO1xuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkU2NoZW1hPEUsIFI+ID0ge1xuICBlbnRpdGllczogRTtcbiAgcmVzdWx0OiBSO1xuICBpbmRleGVzOiBOb3JtYWxpemVkSW5kZXg7XG4gIGVudGl0eU1ldGE6IHtcbiAgICByZWFkb25seSBbZW50aXR5S2V5OiBzdHJpbmddOiB7XG4gICAgICByZWFkb25seSBbcGs6IHN0cmluZ106IHtcbiAgICAgICAgcmVhZG9ubHkgZGF0ZTogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgZmV0Y2hlZEF0OiBudW1iZXI7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBFbnRpdHlNYXA8VCA9IGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBFbnRpdHlJbnRlcmZhY2U8VD4+O1xuIl0sIm1hcHBpbmdzIjoiIn0=
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgU2NoZW1hLFxuICBTZXJpYWxpemFibGUsXG4gIEVudGl0eUludGVyZmFjZSxcbiAgTm9ybWFsaXplZEluZGV4LFxuICBTY2hlbWFDbGFzcyxcbn0gZnJvbSAnLi9pbnRlcmZhY2UuanMnO1xuaW1wb3J0IHR5cGUgV2Vha0VudGl0eU1hcCBmcm9tICcuL1dlYWtFbnRpdHlNYXAuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhdGgge1xuICBrZXk6IHN0cmluZztcbiAgcGs6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQWJzdHJhY3RJbnN0YW5jZVR5cGU8VD4gPSBUIGV4dGVuZHMgeyBwcm90b3R5cGU6IGluZmVyIFUgfVxuICA/IFVcbiAgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgTm9ybWFsaXplZEVudGl0eTxUPiA9IFQgZXh0ZW5kcyB7XG4gIHByb3RvdHlwZTogaW5mZXIgVTtcbiAgc2NoZW1hOiBpbmZlciBTO1xufVxuICA/IHsgW0sgaW4gRXhjbHVkZTxrZXlvZiBVLCBrZXlvZiBTPl06IFVbS10gfSAmIHsgW0sgaW4ga2V5b2YgU106IHN0cmluZyB9XG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIERlbm9ybWFsaXplT2JqZWN0PFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgW0sgaW4ga2V5b2YgU106IFNbS10gZXh0ZW5kcyBTY2hlbWEgPyBEZW5vcm1hbGl6ZTxTW0tdPiA6IFNbS107XG59O1xuXG5leHBvcnQgdHlwZSBEZW5vcm1hbGl6ZU51bGxhYmxlT2JqZWN0PFMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgW0sgaW4ga2V5b2YgU106IFNbS10gZXh0ZW5kcyBTY2hlbWEgPyBEZW5vcm1hbGl6ZU51bGxhYmxlPFNbS10+IDogU1tLXTtcbn07XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZU9iamVjdDxTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtLIGluIGtleW9mIFNdOiBTW0tdIGV4dGVuZHMgU2NoZW1hID8gTm9ybWFsaXplPFNbS10+IDogU1tLXTtcbn07XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWROdWxsYWJsZU9iamVjdDxTIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtLIGluIGtleW9mIFNdOiBTW0tdIGV4dGVuZHMgU2NoZW1hID8gTm9ybWFsaXplTnVsbGFibGU8U1tLXT4gOiBTW0tdO1xufTtcblxuaW50ZXJmYWNlIE5lc3RlZFNjaGVtYUNsYXNzPFQgPSBhbnk+IHtcbiAgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBTY2hlbWE+O1xuICBwcm90b3R5cGU6IFQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkQ2xhc3M8VCA9IGFueT4gZXh0ZW5kcyBOZXN0ZWRTY2hlbWFDbGFzczxUPiB7XG4gIGZyb21KUzogKC4uLmFyZ3M6IGFueSkgPT4gQWJzdHJhY3RJbnN0YW5jZVR5cGU8VD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVub3JtYWxpemVDYWNoZSB7XG4gIGVudGl0aWVzOiB7XG4gICAgW2tleTogc3RyaW5nXToge1xuICAgICAgW3BrOiBzdHJpbmddOiBXZWFrTWFwPEVudGl0eUludGVyZmFjZSwgV2Vha0VudGl0eU1hcDxvYmplY3QsIGFueT4+O1xuICAgIH07XG4gIH07XG4gIHJlc3VsdHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBXZWFrRW50aXR5TWFwPG9iamVjdCwgYW55PjtcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgRGVub3JtYWxpemVOdWxsYWJsZU5lc3RlZFNjaGVtYTxTIGV4dGVuZHMgTmVzdGVkU2NoZW1hQ2xhc3M+ID1cbiAga2V5b2YgU1snc2NoZW1hJ10gZXh0ZW5kcyBuZXZlclxuICAgID8gU1sncHJvdG90eXBlJ10gLy8gdGhpcyBpcyB0aGUgY2FzZSBvZiBhIG5vbi1zZXQgc2NoZW1hLCB3aGljaCBtZWFucyBpdCBhY3R1YWxseSBoYXMgbm8gbWVtYmVyc1xuICAgIDogc3RyaW5nIGV4dGVuZHMga2V5b2YgU1snc2NoZW1hJ11cbiAgICA/IFNbJ3Byb3RvdHlwZSddXG4gICAgOiBTWydwcm90b3R5cGUnXSAvKiYge1xuICAgICAgICBbSyBpbiBrZXlvZiBTWydzY2hlbWEnXV06IERlbm9ybWFsaXplTnVsbGFibGU8U1snc2NoZW1hJ11bS10+O1xuICAgICAgfSovO1xuXG5leHBvcnQgdHlwZSBEZW5vcm1hbGl6ZVJldHVyblR5cGU8VD4gPSBUIGV4dGVuZHMgKFxuICBpbnB1dDogYW55LFxuICB1bnZpc2l0OiBhbnksXG4pID0+IFtpbmZlciBSLCBhbnksIGFueV1cbiAgPyBSXG4gIDogbmV2ZXI7XG5leHBvcnQgdHlwZSBOb3JtYWxpemVSZXR1cm5UeXBlPFQ+ID0gVCBleHRlbmRzICguLi5hcmdzOiBhbnkpID0+IGluZmVyIFJcbiAgPyBSXG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIERlbm9ybWFsaXplPFM+ID0gUyBleHRlbmRzIEVudGl0eUludGVyZmFjZTxpbmZlciBVPlxuICA/IFVcbiAgOiBTIGV4dGVuZHMgUmVjb3JkQ2xhc3NcbiAgPyBBYnN0cmFjdEluc3RhbmNlVHlwZTxTPlxuICA6IFMgZXh0ZW5kcyBTY2hlbWFDbGFzc1xuICA/IERlbm9ybWFsaXplUmV0dXJuVHlwZTxTWydkZW5vcm1hbGl6ZSddPlxuICA6IFMgZXh0ZW5kcyBTZXJpYWxpemFibGU8aW5mZXIgVD5cbiAgPyBUXG4gIDogUyBleHRlbmRzIEFycmF5PGluZmVyIEY+XG4gID8gRGVub3JtYWxpemU8Rj5bXVxuICA6IFMgZXh0ZW5kcyB7IFtLOiBzdHJpbmddOiBhbnkgfVxuICA/IERlbm9ybWFsaXplT2JqZWN0PFM+XG4gIDogUztcblxuZXhwb3J0IHR5cGUgRGVub3JtYWxpemVOdWxsYWJsZTxTPiA9IFMgZXh0ZW5kcyBFbnRpdHlJbnRlcmZhY2U8YW55PlxuICA/IERlbm9ybWFsaXplTnVsbGFibGVOZXN0ZWRTY2hlbWE8Uz4gfCB1bmRlZmluZWRcbiAgOiBTIGV4dGVuZHMgUmVjb3JkQ2xhc3NcbiAgPyBEZW5vcm1hbGl6ZU51bGxhYmxlTmVzdGVkU2NoZW1hPFM+XG4gIDogUyBleHRlbmRzIFNjaGVtYUNsYXNzXG4gID8gRGVub3JtYWxpemVSZXR1cm5UeXBlPFNbJ19kZW5vcm1hbGl6ZU51bGxhYmxlJ10+XG4gIDogUyBleHRlbmRzIFNlcmlhbGl6YWJsZTxpbmZlciBUPlxuICA/IFRcbiAgOiBTIGV4dGVuZHMgQXJyYXk8aW5mZXIgRj5cbiAgPyBEZW5vcm1hbGl6ZTxGPltdIHwgdW5kZWZpbmVkXG4gIDogUyBleHRlbmRzIHsgW0s6IHN0cmluZ106IGFueSB9XG4gID8gRGVub3JtYWxpemVOdWxsYWJsZU9iamVjdDxTPlxuICA6IFM7XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZTxTPiA9IFMgZXh0ZW5kcyBFbnRpdHlJbnRlcmZhY2VcbiAgPyBzdHJpbmdcbiAgOiBTIGV4dGVuZHMgUmVjb3JkQ2xhc3NcbiAgPyBOb3JtYWxpemVPYmplY3Q8U1snc2NoZW1hJ10+XG4gIDogUyBleHRlbmRzIFNjaGVtYUNsYXNzXG4gID8gTm9ybWFsaXplUmV0dXJuVHlwZTxTWydub3JtYWxpemUnXT5cbiAgOiBTIGV4dGVuZHMgU2VyaWFsaXphYmxlPGluZmVyIFQ+XG4gID8gVFxuICA6IFMgZXh0ZW5kcyBBcnJheTxpbmZlciBGPlxuICA/IE5vcm1hbGl6ZTxGPltdXG4gIDogUyBleHRlbmRzIHsgW0s6IHN0cmluZ106IGFueSB9XG4gID8gTm9ybWFsaXplT2JqZWN0PFM+XG4gIDogUztcblxuZXhwb3J0IHR5cGUgTm9ybWFsaXplTnVsbGFibGU8Uz4gPSBTIGV4dGVuZHMgRW50aXR5SW50ZXJmYWNlXG4gID8gc3RyaW5nIHwgdW5kZWZpbmVkXG4gIDogUyBleHRlbmRzIFJlY29yZENsYXNzXG4gID8gTm9ybWFsaXplZE51bGxhYmxlT2JqZWN0PFNbJ3NjaGVtYSddPlxuICA6IFMgZXh0ZW5kcyBTY2hlbWFDbGFzc1xuICA/IE5vcm1hbGl6ZVJldHVyblR5cGU8U1snX25vcm1hbGl6ZU51bGxhYmxlJ10+XG4gIDogUyBleHRlbmRzIFNlcmlhbGl6YWJsZTxpbmZlciBUPlxuICA/IFRcbiAgOiBTIGV4dGVuZHMgQXJyYXk8aW5mZXIgRj5cbiAgPyBOb3JtYWxpemU8Rj5bXSB8IHVuZGVmaW5lZFxuICA6IFMgZXh0ZW5kcyB7IFtLOiBzdHJpbmddOiBhbnkgfVxuICA/IE5vcm1hbGl6ZWROdWxsYWJsZU9iamVjdDxTPlxuICA6IFM7XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRTY2hlbWE8RSwgUj4gPSB7XG4gIGVudGl0aWVzOiBFO1xuICByZXN1bHQ6IFI7XG4gIGluZGV4ZXM6IE5vcm1hbGl6ZWRJbmRleDtcbiAgZW50aXR5TWV0YToge1xuICAgIHJlYWRvbmx5IFtlbnRpdHlLZXk6IHN0cmluZ106IHtcbiAgICAgIHJlYWRvbmx5IFtwazogc3RyaW5nXToge1xuICAgICAgICByZWFkb25seSBkYXRlOiBudW1iZXI7XG4gICAgICAgIHJlYWRvbmx5IGV4cGlyZXNBdDogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBmZXRjaGVkQXQ6IG51bWJlcjtcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIEVudGl0eU1hcDxUID0gYW55PiA9IFJlY29yZDxzdHJpbmcsIEVudGl0eUludGVyZmFjZTxUPj47XG4iXSwibWFwcGluZ3MiOiIifQ==
{
"name": "@rest-hooks/normalizr",
"version": "9.5.1",
"version": "10.0.0",
"description": "Normalizes and denormalizes JSON according to schema for Redux and Flux applications",

@@ -118,3 +118,3 @@ "homepage": "https://resthooks.io/docs/concepts/normalization",

},
"gitHead": "8d3be93d44408c4b2b565486df25a30df543f21f"
"gitHead": "8b0eda4d5e129ba0a02d704a65cdfeb402bafc4f"
}
import { Schema } from './interface.js';
import { Denormalize, DenormalizeNullable, DenormalizeCache } from './types.js';
import WeakListMap from './WeakListMap.js';
import { Denormalize, DenormalizeNullable, DenormalizeCache, Path } from './types.js';
type DenormalizeReturn<S extends Schema> = [

@@ -8,3 +7,3 @@ /*denormalized*/ Denormalize<S>,

/*deleted*/ false,
/*resolvedEntities*/ Record<string, Record<string, any>>
/*entityPaths*/ Path[]
] | [

@@ -14,3 +13,3 @@ /*denormalized*/ DenormalizeNullable<S>,

/*deleted*/ true,
/*resolvedEntities*/ Record<string, Record<string, any>>
/*entityPaths*/ Path[]
] | [

@@ -20,6 +19,6 @@ /*denormalized*/ DenormalizeNullable<S>,

/*deleted*/ boolean,
/*resolvedEntities*/ Record<string, Record<string, any>>
/*entityPaths*/ Path[]
];
export declare const denormalize: <S extends Schema>(input: unknown, schema: S | undefined, entities: any, entityCache?: DenormalizeCache['entities'], resultCache?: WeakListMap<object, any>) => DenormalizeReturn<S>;
export declare const denormalizeSimple: <S extends Schema>(input: any, schema: S | undefined, entities: any, entityCache?: DenormalizeCache['entities'], resultCache?: WeakListMap<object, any>) => [
export declare const denormalize: <S extends Schema>(input: unknown, schema: S | undefined, entities: any, entityCache?: DenormalizeCache['entities'], resultCache?: DenormalizeCache['results'][string]) => DenormalizeReturn<S>;
export declare const denormalizeSimple: <S extends Schema>(input: any, schema: S | undefined, entities: any, entityCache?: DenormalizeCache['entities'], resultCache?: DenormalizeCache['results'][string]) => [
/*denormalized*/ Denormalize<S>,

@@ -26,0 +25,0 @@ /*found*/ true,

import { denormalize } from './denormalize.js';
import { isEntity } from './isEntity.js';
import { normalize } from './normalize.js';
import WeakListMap from './WeakListMap.js';
import WeakEntityMap from './WeakEntityMap.js';
export { default as inferResults } from './inferResults.js';
export { DELETED } from './special.js';
export { AbstractInstanceType, NormalizeReturnType, NormalizedSchema, DenormalizeReturnType, DenormalizeCache, } from './types.js';
export { AbstractInstanceType, NormalizeReturnType, NormalizedSchema, DenormalizeReturnType, DenormalizeCache, Path, } from './types.js';
export * from './endpoint/types.js';

@@ -12,3 +12,3 @@ export * from './interface.js';

export * from './normal.js';
export { denormalize, normalize, isEntity, WeakListMap };
export { denormalize, normalize, isEntity, WeakEntityMap };
//# sourceMappingURL=index.d.ts.map
import { Schema, Serializable, EntityInterface, NormalizedIndex, SchemaClass } from './interface.js';
import WeakListMap from './WeakListMap.js';
import WeakEntityMap from './WeakEntityMap.js';
export interface Path {
key: string;
pk: string;
}
export type AbstractInstanceType<T> = T extends {

@@ -36,7 +40,7 @@ prototype: infer U;

[key: string]: {
[pk: string]: WeakListMap<object, EntityInterface>;
[pk: string]: WeakMap<EntityInterface, WeakEntityMap<object, any>>;
};
};
results: {
[key: string]: WeakListMap<object, any>;
[key: string]: WeakEntityMap<object, any>;
};

@@ -43,0 +47,0 @@ }

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc