332 lines
53 KiB
Plaintext
332 lines
53 KiB
Plaintext
import { __assign } from "/_nuxt/node_modules/tslib/tslib.es6.js?v=e4f18c29";
|
|
import { invariant, newInvariantError } from "/_nuxt/node_modules/@apollo/client/utilities/globals/index.js?v=e4f18c29";
|
|
import { Kind } from "/_nuxt/node_modules/graphql/index.mjs?v=e4f18c29";
|
|
import { wrap } from "/_nuxt/node_modules/optimism/lib/index.js?v=e4f18c29";
|
|
import { isField, resultKeyNameFromField, isReference, makeReference, shouldInclude, addTypenameToDocument, getDefaultValues, getMainDefinition, getQueryDefinition, getFragmentFromSelection, maybeDeepFreeze, mergeDeepArray, DeepMerger, isNonNullObject, canUseWeakMap, compact, canonicalStringify, cacheSizes, } from "/_nuxt/node_modules/@apollo/client/utilities/index.js?v=e4f18c29";
|
|
import { maybeDependOnExistenceOfEntity, supportsResultCaching, } from "/_nuxt/node_modules/@apollo/client/cache/inmemory/entityStore.js?v=e4f18c29";
|
|
import { isArray, extractFragmentContext, getTypenameFromStoreObject, shouldCanonizeResults, } from "/_nuxt/node_modules/@apollo/client/cache/inmemory/helpers.js?v=e4f18c29";
|
|
import { MissingFieldError } from "/_nuxt/node_modules/@apollo/client/cache/core/types/common.js?v=e4f18c29";
|
|
import { ObjectCanon } from "/_nuxt/node_modules/@apollo/client/cache/inmemory/object-canon.js?v=e4f18c29";
|
|
function execSelectionSetKeyArgs(options) {
|
|
return [
|
|
options.selectionSet,
|
|
options.objectOrReference,
|
|
options.context,
|
|
// We split out this property so we can pass different values
|
|
// independently without modifying options.context itself.
|
|
options.context.canonizeResults,
|
|
];
|
|
}
|
|
var StoreReader = /** @class */ (function () {
|
|
function StoreReader(config) {
|
|
var _this = this;
|
|
this.knownResults = new (canUseWeakMap ? WeakMap : Map)();
|
|
this.config = compact(config, {
|
|
addTypename: config.addTypename !== false,
|
|
canonizeResults: shouldCanonizeResults(config),
|
|
});
|
|
this.canon = config.canon || new ObjectCanon();
|
|
// memoized functions in this class will be "garbage-collected"
|
|
// by recreating the whole `StoreReader` in
|
|
// `InMemoryCache.resetResultsCache`
|
|
// (triggered from `InMemoryCache.gc` with `resetResultCache: true`)
|
|
this.executeSelectionSet = wrap(function (options) {
|
|
var _a;
|
|
var canonizeResults = options.context.canonizeResults;
|
|
var peekArgs = execSelectionSetKeyArgs(options);
|
|
// Negate this boolean option so we can find out if we've already read
|
|
// this result using the other boolean value.
|
|
peekArgs[3] = !canonizeResults;
|
|
var other = (_a = _this.executeSelectionSet).peek.apply(_a, peekArgs);
|
|
if (other) {
|
|
if (canonizeResults) {
|
|
return __assign(__assign({}, other), {
|
|
// If we previously read this result without canonizing it, we can
|
|
// reuse that result simply by canonizing it now.
|
|
result: _this.canon.admit(other.result) });
|
|
}
|
|
// If we previously read this result with canonization enabled, we can
|
|
// return that canonized result as-is.
|
|
return other;
|
|
}
|
|
maybeDependOnExistenceOfEntity(options.context.store, options.enclosingRef.__ref);
|
|
// Finally, if we didn't find any useful previous results, run the real
|
|
// execSelectionSetImpl method with the given options.
|
|
return _this.execSelectionSetImpl(options);
|
|
}, {
|
|
max: this.config.resultCacheMaxSize ||
|
|
cacheSizes["inMemoryCache.executeSelectionSet"] ||
|
|
50000 /* defaultCacheSizes["inMemoryCache.executeSelectionSet"] */,
|
|
keyArgs: execSelectionSetKeyArgs,
|
|
// Note that the parameters of makeCacheKey are determined by the
|
|
// array returned by keyArgs.
|
|
makeCacheKey: function (selectionSet, parent, context, canonizeResults) {
|
|
if (supportsResultCaching(context.store)) {
|
|
return context.store.makeCacheKey(selectionSet, isReference(parent) ? parent.__ref : parent, context.varString, canonizeResults);
|
|
}
|
|
},
|
|
});
|
|
this.executeSubSelectedArray = wrap(function (options) {
|
|
maybeDependOnExistenceOfEntity(options.context.store, options.enclosingRef.__ref);
|
|
return _this.execSubSelectedArrayImpl(options);
|
|
}, {
|
|
max: this.config.resultCacheMaxSize ||
|
|
cacheSizes["inMemoryCache.executeSubSelectedArray"] ||
|
|
10000 /* defaultCacheSizes["inMemoryCache.executeSubSelectedArray"] */,
|
|
makeCacheKey: function (_a) {
|
|
var field = _a.field, array = _a.array, context = _a.context;
|
|
if (supportsResultCaching(context.store)) {
|
|
return context.store.makeCacheKey(field, array, context.varString);
|
|
}
|
|
},
|
|
});
|
|
}
|
|
StoreReader.prototype.resetCanon = function () {
|
|
this.canon = new ObjectCanon();
|
|
};
|
|
/**
|
|
* Given a store and a query, return as much of the result as possible and
|
|
* identify if any data was missing from the store.
|
|
*/
|
|
StoreReader.prototype.diffQueryAgainstStore = function (_a) {
|
|
var store = _a.store, query = _a.query, _b = _a.rootId, rootId = _b === void 0 ? "ROOT_QUERY" : _b, variables = _a.variables, _c = _a.returnPartialData, returnPartialData = _c === void 0 ? true : _c, _d = _a.canonizeResults, canonizeResults = _d === void 0 ? this.config.canonizeResults : _d;
|
|
var policies = this.config.cache.policies;
|
|
variables = __assign(__assign({}, getDefaultValues(getQueryDefinition(query))), variables);
|
|
var rootRef = makeReference(rootId);
|
|
var execResult = this.executeSelectionSet({
|
|
selectionSet: getMainDefinition(query).selectionSet,
|
|
objectOrReference: rootRef,
|
|
enclosingRef: rootRef,
|
|
context: __assign({ store: store, query: query, policies: policies, variables: variables, varString: canonicalStringify(variables), canonizeResults: canonizeResults }, extractFragmentContext(query, this.config.fragments)),
|
|
});
|
|
var missing;
|
|
if (execResult.missing) {
|
|
// For backwards compatibility we still report an array of
|
|
// MissingFieldError objects, even though there will only ever be at most
|
|
// one of them, now that all missing field error messages are grouped
|
|
// together in the execResult.missing tree.
|
|
missing = [
|
|
new MissingFieldError(firstMissing(execResult.missing), execResult.missing, query, variables),
|
|
];
|
|
if (!returnPartialData) {
|
|
throw missing[0];
|
|
}
|
|
}
|
|
return {
|
|
result: execResult.result,
|
|
complete: !missing,
|
|
missing: missing,
|
|
};
|
|
};
|
|
StoreReader.prototype.isFresh = function (result, parent, selectionSet, context) {
|
|
if (supportsResultCaching(context.store) &&
|
|
this.knownResults.get(result) === selectionSet) {
|
|
var latest = this.executeSelectionSet.peek(selectionSet, parent, context,
|
|
// If result is canonical, then it could only have been previously
|
|
// cached by the canonizing version of executeSelectionSet, so we can
|
|
// avoid checking both possibilities here.
|
|
this.canon.isKnown(result));
|
|
if (latest && result === latest.result) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
// Uncached version of executeSelectionSet.
|
|
StoreReader.prototype.execSelectionSetImpl = function (_a) {
|
|
var _this = this;
|
|
var selectionSet = _a.selectionSet, objectOrReference = _a.objectOrReference, enclosingRef = _a.enclosingRef, context = _a.context;
|
|
if (isReference(objectOrReference) &&
|
|
!context.policies.rootTypenamesById[objectOrReference.__ref] &&
|
|
!context.store.has(objectOrReference.__ref)) {
|
|
return {
|
|
result: this.canon.empty,
|
|
missing: "Dangling reference to missing ".concat(objectOrReference.__ref, " object"),
|
|
};
|
|
}
|
|
var variables = context.variables, policies = context.policies, store = context.store;
|
|
var typename = store.getFieldValue(objectOrReference, "__typename");
|
|
var objectsToMerge = [];
|
|
var missing;
|
|
var missingMerger = new DeepMerger();
|
|
if (this.config.addTypename &&
|
|
typeof typename === "string" &&
|
|
!policies.rootIdsByTypename[typename]) {
|
|
// Ensure we always include a default value for the __typename
|
|
// field, if we have one, and this.config.addTypename is true. Note
|
|
// that this field can be overridden by other merged objects.
|
|
objectsToMerge.push({ __typename: typename });
|
|
}
|
|
function handleMissing(result, resultName) {
|
|
var _a;
|
|
if (result.missing) {
|
|
missing = missingMerger.merge(missing, (_a = {},
|
|
_a[resultName] = result.missing,
|
|
_a));
|
|
}
|
|
return result.result;
|
|
}
|
|
var workSet = new Set(selectionSet.selections);
|
|
workSet.forEach(function (selection) {
|
|
var _a, _b;
|
|
// Omit fields with directives @skip(if: <truthy value>) or
|
|
// @include(if: <falsy value>).
|
|
if (!shouldInclude(selection, variables))
|
|
return;
|
|
if (isField(selection)) {
|
|
var fieldValue = policies.readField({
|
|
fieldName: selection.name.value,
|
|
field: selection,
|
|
variables: context.variables,
|
|
from: objectOrReference,
|
|
}, context);
|
|
var resultName = resultKeyNameFromField(selection);
|
|
if (fieldValue === void 0) {
|
|
if (!addTypenameToDocument.added(selection)) {
|
|
missing = missingMerger.merge(missing, (_a = {},
|
|
_a[resultName] = "Can't find field '".concat(selection.name.value, "' on ").concat(isReference(objectOrReference) ?
|
|
objectOrReference.__ref + " object"
|
|
: "object " + JSON.stringify(objectOrReference, null, 2)),
|
|
_a));
|
|
}
|
|
}
|
|
else if (isArray(fieldValue)) {
|
|
if (fieldValue.length > 0) {
|
|
fieldValue = handleMissing(_this.executeSubSelectedArray({
|
|
field: selection,
|
|
array: fieldValue,
|
|
enclosingRef: enclosingRef,
|
|
context: context,
|
|
}), resultName);
|
|
}
|
|
}
|
|
else if (!selection.selectionSet) {
|
|
// If the field does not have a selection set, then we handle it
|
|
// as a scalar value. To keep this.canon from canonicalizing
|
|
// this value, we use this.canon.pass to wrap fieldValue in a
|
|
// Pass object that this.canon.admit will later unwrap as-is.
|
|
if (context.canonizeResults) {
|
|
fieldValue = _this.canon.pass(fieldValue);
|
|
}
|
|
}
|
|
else if (fieldValue != null) {
|
|
// In this case, because we know the field has a selection set,
|
|
// it must be trying to query a GraphQLObjectType, which is why
|
|
// fieldValue must be != null.
|
|
fieldValue = handleMissing(_this.executeSelectionSet({
|
|
selectionSet: selection.selectionSet,
|
|
objectOrReference: fieldValue,
|
|
enclosingRef: isReference(fieldValue) ? fieldValue : enclosingRef,
|
|
context: context,
|
|
}), resultName);
|
|
}
|
|
if (fieldValue !== void 0) {
|
|
objectsToMerge.push((_b = {}, _b[resultName] = fieldValue, _b));
|
|
}
|
|
}
|
|
else {
|
|
var fragment = getFragmentFromSelection(selection, context.lookupFragment);
|
|
if (!fragment && selection.kind === Kind.FRAGMENT_SPREAD) {
|
|
throw newInvariantError(10, selection.name.value);
|
|
}
|
|
if (fragment && policies.fragmentMatches(fragment, typename)) {
|
|
fragment.selectionSet.selections.forEach(workSet.add, workSet);
|
|
}
|
|
}
|
|
});
|
|
var result = mergeDeepArray(objectsToMerge);
|
|
var finalResult = { result: result, missing: missing };
|
|
var frozen = context.canonizeResults ?
|
|
this.canon.admit(finalResult)
|
|
// Since this.canon is normally responsible for freezing results (only in
|
|
// development), freeze them manually if canonization is disabled.
|
|
: maybeDeepFreeze(finalResult);
|
|
// Store this result with its selection set so that we can quickly
|
|
// recognize it again in the StoreReader#isFresh method.
|
|
if (frozen.result) {
|
|
this.knownResults.set(frozen.result, selectionSet);
|
|
}
|
|
return frozen;
|
|
};
|
|
// Uncached version of executeSubSelectedArray.
|
|
StoreReader.prototype.execSubSelectedArrayImpl = function (_a) {
|
|
var _this = this;
|
|
var field = _a.field, array = _a.array, enclosingRef = _a.enclosingRef, context = _a.context;
|
|
var missing;
|
|
var missingMerger = new DeepMerger();
|
|
function handleMissing(childResult, i) {
|
|
var _a;
|
|
if (childResult.missing) {
|
|
missing = missingMerger.merge(missing, (_a = {}, _a[i] = childResult.missing, _a));
|
|
}
|
|
return childResult.result;
|
|
}
|
|
if (field.selectionSet) {
|
|
array = array.filter(context.store.canRead);
|
|
}
|
|
array = array.map(function (item, i) {
|
|
// null value in array
|
|
if (item === null) {
|
|
return null;
|
|
}
|
|
// This is a nested array, recurse
|
|
if (isArray(item)) {
|
|
return handleMissing(_this.executeSubSelectedArray({
|
|
field: field,
|
|
array: item,
|
|
enclosingRef: enclosingRef,
|
|
context: context,
|
|
}), i);
|
|
}
|
|
// This is an object, run the selection set on it
|
|
if (field.selectionSet) {
|
|
return handleMissing(_this.executeSelectionSet({
|
|
selectionSet: field.selectionSet,
|
|
objectOrReference: item,
|
|
enclosingRef: isReference(item) ? item : enclosingRef,
|
|
context: context,
|
|
}), i);
|
|
}
|
|
if (globalThis.__DEV__ !== false) {
|
|
assertSelectionSetForIdValue(context.store, field, item);
|
|
}
|
|
return item;
|
|
});
|
|
return {
|
|
result: context.canonizeResults ? this.canon.admit(array) : array,
|
|
missing: missing,
|
|
};
|
|
};
|
|
return StoreReader;
|
|
}());
|
|
export { StoreReader };
|
|
function firstMissing(tree) {
|
|
try {
|
|
JSON.stringify(tree, function (_, value) {
|
|
if (typeof value === "string")
|
|
throw value;
|
|
return value;
|
|
});
|
|
}
|
|
catch (result) {
|
|
return result;
|
|
}
|
|
}
|
|
function assertSelectionSetForIdValue(store, field, fieldValue) {
|
|
if (!field.selectionSet) {
|
|
var workSet_1 = new Set([fieldValue]);
|
|
workSet_1.forEach(function (value) {
|
|
if (isNonNullObject(value)) {
|
|
invariant(
|
|
!isReference(value),
|
|
11,
|
|
getTypenameFromStoreObject(store, value),
|
|
field.name.value
|
|
);
|
|
Object.values(value).forEach(workSet_1.add, workSet_1);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZEZyb21TdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYWNoZS9pbm1lbW9yeS9yZWFkRnJvbVN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHaEYsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUvQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBUWhDLE9BQU8sRUFDTCxPQUFPLEVBQ1Asc0JBQXNCLEVBQ3RCLFdBQVcsRUFDWCxhQUFhLEVBQ2IsYUFBYSxFQUNiLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLGNBQWMsRUFDZCxVQUFVLEVBQ1YsZUFBZSxFQUNmLGFBQWEsRUFDYixPQUFPLEVBQ1Asa0JBQWtCLEVBQ2xCLFVBQVUsR0FFWCxNQUFNLDBCQUEwQixDQUFDO0FBUWxDLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIscUJBQXFCLEdBQ3RCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLE9BQU8sRUFDUCxzQkFBc0IsRUFDdEIsMEJBQTBCLEVBQzFCLHFCQUFxQixHQUN0QixNQUFNLGNBQWMsQ0FBQztBQUl0QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFnRGhELFNBQVMsdUJBQXVCLENBQzlCLE9BQWdDO0lBRWhDLE9BQU87UUFDTCxPQUFPLENBQUMsWUFBWTtRQUNwQixPQUFPLENBQUMsaUJBQWlCO1FBQ3pCLE9BQU8sQ0FBQyxPQUFPO1FBQ2YsNkRBQTZEO1FBQzdELDBEQUEwRDtRQUMxRCxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWU7S0FD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QyxBQXphRCxJQXlhQzs7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFpQjtJQUNyQyxJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxVQUFDLENBQUMsRUFBRSxLQUFLO1lBQzVCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFBRSxNQUFNLEtBQUssQ0FBQztZQUMzQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sTUFBTSxFQUFFLENBQUM7UUFDaEIsT0FBTyxNQUFnQixDQUFDO0lBQzFCLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyw0QkFBNEIsQ0FDbkMsS0FBc0IsRUFDdEIsS0FBZ0IsRUFDaEIsVUFBZTtJQUVmLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsSUFBTSxTQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLFNBQU8sQ0FBQyxPQUFPLENBQUMsVUFBQyxLQUFLO1lBQ3BCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLFNBQVMsQ0FDUCxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFDbkIseUVBQXlFLEVBQ3pFLDBCQUEwQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFDeEMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQ2pCLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFPLENBQUMsQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludmFyaWFudCwgbmV3SW52YXJpYW50RXJyb3IgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2dsb2JhbHMvaW5kZXguanNcIjtcblxuaW1wb3J0IHR5cGUgeyBEb2N1bWVudE5vZGUsIEZpZWxkTm9kZSwgU2VsZWN0aW9uU2V0Tm9kZSB9IGZyb20gXCJncmFwaHFsXCI7XG5pbXBvcnQgeyBLaW5kIH0gZnJvbSBcImdyYXBocWxcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW1pc3RpY1dyYXBwZXJGdW5jdGlvbiB9IGZyb20gXCJvcHRpbWlzbVwiO1xuaW1wb3J0IHsgd3JhcCB9IGZyb20gXCJvcHRpbWlzbVwiO1xuXG5pbXBvcnQgdHlwZSB7XG4gIFJlZmVyZW5jZSxcbiAgU3RvcmVPYmplY3QsXG4gIEZyYWdtZW50TWFwLFxuICBGcmFnbWVudE1hcEZ1bmN0aW9uLFxufSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2luZGV4LmpzXCI7XG5pbXBvcnQge1xuICBpc0ZpZWxkLFxuICByZXN1bHRLZXlOYW1lRnJvbUZpZWxkLFxuICBpc1JlZmVyZW5jZSxcbiAgbWFrZVJlZmVyZW5jZSxcbiAgc2hvdWxkSW5jbHVkZSxcbiAgYWRkVHlwZW5hbWVUb0RvY3VtZW50LFxuICBnZXREZWZhdWx0VmFsdWVzLFxuICBnZXRNYWluRGVmaW5pdGlvbixcbiAgZ2V0UXVlcnlEZWZpbml0aW9uLFxuICBnZXRGcmFnbWVudEZyb21TZWxlY3Rpb24sXG4gIG1heWJlRGVlcEZyZWV6ZSxcbiAgbWVyZ2VEZWVwQXJyYXksXG4gIERlZXBNZXJnZXIsXG4gIGlzTm9uTnVsbE9iamVjdCxcbiAgY2FuVXNlV2Vha01hcCxcbiAgY29tcGFjdCxcbiAgY2Fub25pY2FsU3RyaW5naWZ5LFxuICBjYWNoZVNpemVzLFxuICBkZWZhdWx0Q2FjaGVTaXplcyxcbn0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZSB9IGZyb20gXCIuLi9jb3JlL3R5cGVzL0NhY2hlLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIERpZmZRdWVyeUFnYWluc3RTdG9yZU9wdGlvbnMsXG4gIEluTWVtb3J5Q2FjaGVDb25maWcsXG4gIE5vcm1hbGl6ZWRDYWNoZSxcbiAgUmVhZE1lcmdlTW9kaWZ5Q29udGV4dCxcbn0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB7XG4gIG1heWJlRGVwZW5kT25FeGlzdGVuY2VPZkVudGl0eSxcbiAgc3VwcG9ydHNSZXN1bHRDYWNoaW5nLFxufSBmcm9tIFwiLi9lbnRpdHlTdG9yZS5qc1wiO1xuaW1wb3J0IHtcbiAgaXNBcnJheSxcbiAgZXh0cmFjdEZyYWdtZW50Q29udGV4dCxcbiAgZ2V0VHlwZW5hbWVGcm9tU3RvcmVPYmplY3QsXG4gIHNob3VsZENhbm9uaXplUmVzdWx0cyxcbn0gZnJvbSBcIi4vaGVscGVycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb2xpY2llcyB9IGZyb20gXCIuL3BvbGljaWVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEluTWVtb3J5Q2FjaGUgfSBmcm9tIFwiLi9pbk1lbW9yeUNhY2hlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE1pc3NpbmdUcmVlIH0gZnJvbSBcIi4uL2NvcmUvdHlwZXMvY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBNaXNzaW5nRmllbGRFcnJvciB9IGZyb20gXCIuLi9jb3JlL3R5cGVzL2NvbW1vbi5qc1wiO1xuaW1wb3J0IHsgT2JqZWN0Q2Fub24gfSBmcm9tIFwiLi9vYmplY3QtY2Fub24uanNcIjtcblxuZXhwb3J0IHR5cGUgVmFyaWFibGVNYXAgPSB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcblxuaW50ZXJmYWNlIFJlYWRDb250ZXh0IGV4dGVuZHMgUmVhZE1lcmdlTW9kaWZ5Q29udGV4dCB7XG4gIHF1ZXJ5OiBEb2N1bWVudE5vZGU7XG4gIHBvbGljaWVzOiBQb2xpY2llcztcbiAgY2Fub25pemVSZXN1bHRzOiBib29sZWFuO1xuICBmcmFnbWVudE1hcDogRnJhZ21lbnRNYXA7XG4gIGxvb2t1cEZyYWdtZW50OiBGcmFnbWVudE1hcEZ1bmN0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBFeGVjUmVzdWx0PFIgPSBhbnk+ID0ge1xuICByZXN1bHQ6IFI7XG4gIG1pc3Npbmc/OiBNaXNzaW5nVHJlZTtcbn07XG5cbnR5cGUgRXhlY1NlbGVjdGlvblNldE9wdGlvbnMgPSB7XG4gIHNlbGVjdGlvblNldDogU2VsZWN0aW9uU2V0Tm9kZTtcbiAgb2JqZWN0T3JSZWZlcmVuY2U6IFN0b3JlT2JqZWN0IHwgUmVmZXJlbmNlO1xuICBlbmNsb3NpbmdSZWY6IFJlZmVyZW5jZTtcbiAgY29udGV4dDogUmVhZENvbnRleHQ7XG59O1xuXG50eXBlIEV4ZWNTdWJTZWxlY3RlZEFycmF5T3B0aW9ucyA9IHtcbiAgZmllbGQ6IEZpZWxkTm9kZTtcbiAgYXJyYXk6IHJlYWRvbmx5IGFueVtdO1xuICBlbmNsb3NpbmdSZWY6IFJlZmVyZW5jZTtcbiAgY29udGV4dDogUmVhZENvbnRleHQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlUmVhZGVyQ29uZmlnIHtcbiAgY2FjaGU6IEluTWVtb3J5Q2FjaGU7XG4gIGFkZFR5cGVuYW1lPzogYm9vbGVhbjtcbiAgcmVzdWx0Q2FjaGVNYXhTaXplPzogbnVtYmVyO1xuICBjYW5vbml6ZVJlc3VsdHM/OiBib29sZWFuO1xuICBjYW5vbj86IE9iamVjdENhbm9uO1xuICBmcmFnbWVudHM/OiBJbk1lbW9yeUNhY2hlQ29uZmlnW1wiZnJhZ21lbnRzXCJdO1xufVxuXG4vLyBBcmd1bWVudHMgdHlwZSBhZnRlciBrZXlBcmdzIHRyYW5zbGF0aW9uLlxudHlwZSBFeGVjU2VsZWN0aW9uU2V0S2V5QXJncyA9IFtcbiAgU2VsZWN0aW9uU2V0Tm9kZSxcbiAgU3RvcmVPYmplY3QgfCBSZWZlcmVuY2UsXG4gIFJlYWRNZXJnZU1vZGlmeUNvbnRleHQsXG4gIGJvb2xlYW4sXG5dO1xuXG5mdW5jdGlvbiBleGVjU2VsZWN0aW9uU2V0S2V5QXJncyhcbiAgb3B0aW9uczogRXhlY1NlbGVjdGlvblNldE9wdGlvbnNcbik6IEV4ZWNTZWxlY3Rpb25TZXRLZXlBcmdzIHtcbiAgcmV0dXJuIFtcbiAgICBvcHRpb25zLnNlbGVjdGlvblNldCxcbiAgICBvcHRpb25zLm9iamVjdE9yUmVmZXJlbmNlLFxuICAgIG9wdGlvbnMuY29udGV4dCxcbiAgICAvLyBXZSBzcGxpdCBvdXQgdGhpcyBwcm9wZXJ0eSBzbyB3ZSBjYW4gcGFzcyBkaWZmZXJlbnQgdmFsdWVzXG4gICAgLy8gaW5kZXBlbmRlbnRseSB3aXRob3V0IG1vZGlmeWluZyBvcHRpb25zLmNvbnRleHQgaXRzZWxmLlxuICAgIG9wdGlvbnMuY29udGV4dC5jYW5vbml6ZVJlc3VsdHMsXG4gIF07XG59XG5cbmV4cG9ydCBjbGFzcyBTdG9yZVJlYWRlciB7XG4gIC8vIGNhY2hlZCB2ZXJzaW9uIG9mIGV4ZWN1dGVTZWxlY3Rpb25TZXRcbiAgcHJpdmF0ZSBleGVjdXRlU2VsZWN0aW9uU2V0OiBPcHRpbWlzdGljV3JhcHBlckZ1bmN0aW9uPFxuICAgIFtFeGVjU2VsZWN0aW9uU2V0T3B0aW9uc10sIC8vIEFjdHVhbCBhcmd1bWVudHMgdHVwbGUgdHlwZS5cbiAgICBFeGVjUmVzdWx0LCAvLyBBY3R1YWwgcmV0dXJuIHR5cGUuXG4gICAgRXhlY1NlbGVjdGlvblNldEtleUFyZ3NcbiAgPjtcblxuICAvLyBjYWNoZWQgdmVyc2lvbiBvZiBleGVjdXRlU3ViU2VsZWN0ZWRBcnJheVxuICBwcml2YXRlIGV4ZWN1dGVTdWJTZWxlY3RlZEFycmF5OiBPcHRpbWlzdGljV3JhcHBlckZ1bmN0aW9uPFxuICAgIFtFeGVjU3ViU2VsZWN0ZWRBcnJheU9wdGlvbnNdLFxuICAgIEV4ZWNSZXN1bHQ8YW55PixcbiAgICBbRXhlY1N1YlNlbGVjdGVkQXJyYXlPcHRpb25zXVxuICA+O1xuXG4gIHByaXZhdGUgY29uZmlnOiB7XG4gICAgY2FjaGU6IEluTWVtb3J5Q2FjaGU7XG4gICAgYWRkVHlwZW5hbWU6IGJvb2xlYW47XG4gICAgcmVzdWx0Q2FjaGVNYXhTaXplPzogbnVtYmVyO1xuICAgIGNhbm9uaXplUmVzdWx0czogYm9vbGVhbjtcbiAgICBmcmFnbWVudHM/OiBJbk1lbW9yeUNhY2hlQ29uZmlnW1wiZnJhZ21lbnRzXCJdO1xuICB9O1xuXG4gIHByaXZhdGUga25vd25SZXN1bHRzID0gbmV3IChjYW5Vc2VXZWFrTWFwID8gV2Vha01hcCA6IE1hcCk8XG4gICAgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBTZWxlY3Rpb25TZXROb2RlXG4gID4oKTtcblxuICBwdWJsaWMgY2Fub246IE9iamVjdENhbm9uO1xuICBwdWJsaWMgcmVzZXRDYW5vbigpIHtcbiAgICB0aGlzLmNhbm9uID0gbmV3IE9iamVjdENhbm9uKCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFN0b3JlUmVhZGVyQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb21wYWN0KGNvbmZpZywge1xuICAgICAgYWRkVHlwZW5hbWU6IGNvbmZpZy5hZGRUeXBlbmFtZSAhPT0gZmFsc2UsXG4gICAgICBjYW5vbml6ZVJlc3VsdHM6IHNob3VsZENhbm9uaXplUmVzdWx0cyhjb25maWcpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jYW5vbiA9IGNvbmZpZy5jYW5vbiB8fCBuZXcgT2JqZWN0Q2Fub24oKTtcblxuICAgIC8vIG1lbW9pemVkIGZ1bmN0aW9ucyBpbiB0aGlzIGNsYXNzIHdpbGwgYmUgXCJnYXJiYWdlLWNvbGxlY3RlZFwiXG4gICAgLy8gYnkgcmVjcmVhdGluZyB0aGUgd2hvbGUgYFN0b3JlUmVhZGVyYCBpblxuICAgIC8vIGBJbk1lbW9yeUNhY2hlLnJlc2V0UmVzdWx0c0NhY2hlYFxuICAgIC8vICh0cmlnZ2VyZWQgZnJvbSBgSW5NZW1vcnlDYWNoZS5nY2Agd2l0aCBgcmVzZXRSZXN1bHRDYWNoZTogdHJ1ZWApXG4gICAgdGhpcy5leGVjdXRlU2VsZWN0aW9uU2V0ID0gd3JhcChcbiAgICAgIChvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2Fub25pemVSZXN1bHRzIH0gPSBvcHRpb25zLmNvbnRleHQ7XG5cbiAgICAgICAgY29uc3QgcGVla0FyZ3MgPSBleGVjU2VsZWN0aW9uU2V0S2V5QXJncyhvcHRpb25zKTtcblxuICAgICAgICAvLyBOZWdhdGUgdGhpcyBib29sZWFuIG9wdGlvbiBzbyB3ZSBjYW4gZmluZCBvdXQgaWYgd2UndmUgYWxyZWFkeSByZWFkXG4gICAgICAgIC8vIHRoaXMgcmVzdWx0IHVzaW5nIHRoZSBvdGhlciBib29sZWFuIHZhbHVlLlxuICAgICAgICBwZWVrQXJnc1szXSA9ICFjYW5vbml6ZVJlc3VsdHM7XG5cbiAgICAgICAgY29uc3Qgb3RoZXIgPSB0aGlzLmV4ZWN1dGVTZWxlY3Rpb25TZXQucGVlayguLi5wZWVrQXJncyk7XG5cbiAgICAgICAgaWYgKG90aGVyKSB7XG4gICAgICAgICAgaWYgKGNhbm9uaXplUmVzdWx0cykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ub3RoZXIsXG4gICAgICAgICAgICAgIC8vIElmIHdlIHByZXZpb3VzbHkgcmVhZCB0aGlzIHJlc3VsdCB3aXRob3V0IGNhbm9uaXppbmcgaXQsIHdlIGNhblxuICAgICAgICAgICAgICAvLyByZXVzZSB0aGF0IHJlc3VsdCBzaW1wbHkgYnkgY2Fub25pemluZyBpdCBub3cuXG4gICAgICAgICAgICAgIHJlc3VsdDogdGhpcy5jYW5vbi5hZG1pdChvdGhlci5yZXN1bHQpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgd2UgcHJldmlvdXNseSByZWFkIHRoaXMgcmVzdWx0IHdpdGggY2Fub25pemF0aW9uIGVuYWJsZWQsIHdlIGNhblxuICAgICAgICAgIC8vIHJldHVybiB0aGF0IGNhbm9uaXplZCByZXN1bHQgYXMtaXMuXG4gICAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgbWF5YmVEZXBlbmRPbkV4aXN0ZW5jZU9mRW50aXR5KFxuICAgICAgICAgIG9wdGlvbnMuY29udGV4dC5zdG9yZSxcbiAgICAgICAgICBvcHRpb25zLmVuY2xvc2luZ1JlZi5fX3JlZlxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEZpbmFsbHksIGlmIHdlIGRpZG4ndCBmaW5kIGFueSB1c2VmdWwgcHJldmlvdXMgcmVzdWx0cywgcnVuIHRoZSByZWFsXG4gICAgICAgIC8vIGV4ZWNTZWxlY3Rpb25TZXRJbXBsIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICAgICAgICByZXR1cm4gdGhpcy5leGVjU2VsZWN0aW9uU2V0SW1wbChvcHRpb25zKTtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1heDpcbiAgICAgICAgICB0aGlzLmNvbmZpZy5yZXN1bHRDYWNoZU1heFNpemUgfHxcbiAgICAgICAgICBjYWNoZVNpemVzW1wiaW5NZW1vcnlDYWNoZS5leGVjdXRlU2VsZWN0aW9uU2V0XCJdIHx8XG4gICAgICAgICAgZGVmYXVsdENhY2hlU2l6ZXNbXCJpbk1lbW9yeUNhY2hlLmV4ZWN1dGVTZWxlY3Rpb25TZXRcIl0sXG4gICAgICAgIGtleUFyZ3M6IGV4ZWNTZWxlY3Rpb25TZXRLZXlBcmdzLFxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHBhcmFtZXRlcnMgb2YgbWFrZUNhY2hlS2V5IGFyZSBkZXRlcm1pbmVkIGJ5IHRoZVxuICAgICAgICAvLyBhcnJheSByZXR1cm5lZCBieSBrZXlBcmdzLlxuICAgICAgICBtYWtlQ2FjaGVLZXkoc2VsZWN0aW9uU2V0LCBwYXJlbnQsIGNvbnRleHQsIGNhbm9uaXplUmVzdWx0cykge1xuICAgICAgICAgIGlmIChzdXBwb3J0c1Jlc3VsdENhY2hpbmcoY29udGV4dC5zdG9yZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnN0b3JlLm1ha2VDYWNoZUtleShcbiAgICAgICAgICAgICAgc2VsZWN0aW9uU2V0LFxuICAgICAgICAgICAgICBpc1JlZmVyZW5jZShwYXJlbnQpID8gcGFyZW50Ll9fcmVmIDogcGFyZW50LFxuICAgICAgICAgICAgICBjb250ZXh0LnZhclN0cmluZyxcbiAgICAgICAgICAgICAgY2Fub25pemVSZXN1bHRzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5leGVjdXRlU3ViU2VsZWN0ZWRBcnJheSA9IHdyYXAoXG4gICAgICAob3B0aW9uczogRXhlY1N1YlNlbGVjdGVkQXJyYXlPcHRpb25zKSA9PiB7XG4gICAgICAgIG1heWJlRGVwZW5kT25FeGlzdGVuY2VPZkVudGl0eShcbiAgICAgICAgICBvcHRpb25zLmNvbnRleHQuc3RvcmUsXG4gICAgICAgICAgb3B0aW9ucy5lbmNsb3NpbmdSZWYuX19yZWZcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhlY1N1YlNlbGVjdGVkQXJyYXlJbXBsKG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF4OlxuICAgICAgICAgIHRoaXMuY29uZmlnLnJlc3VsdENhY2hlTWF4U2l6ZSB8fFxuICAgICAgICAgIGNhY2hlU2l6ZXNbXCJpbk1lbW9yeUNhY2hlLmV4ZWN1dGVTdWJTZWxlY3RlZEFycmF5XCJdIHx8XG4gICAgICAgICAgZGVmYXVsdENhY2hlU2l6ZXNbXCJpbk1lbW9yeUNhY2hlLmV4ZWN1dGVTdWJTZWxlY3RlZEFycmF5XCJdLFxuICAgICAgICBtYWtlQ2FjaGVLZXkoeyBmaWVsZCwgYXJyYXksIGNvbnRleHQgfSkge1xuICAgICAgICAgIGlmIChzdXBwb3J0c1Jlc3VsdENhY2hpbmcoY29udGV4dC5zdG9yZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnN0b3JlLm1ha2VDYWNoZUtleShmaWVsZCwgYXJyYXksIGNvbnRleHQudmFyU3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIHN0b3JlIGFuZCBhIHF1ZXJ5LCByZXR1cm4gYXMgbXVjaCBvZiB0aGUgcmVzdWx0IGFzIHBvc3NpYmxlIGFuZFxuICAgKiBpZGVudGlmeSBpZiBhbnkgZGF0YSB3YXMgbWlzc2luZyBmcm9tIHRoZSBzdG9yZS5cbiAgICovXG4gIHB1YmxpYyBkaWZmUXVlcnlBZ2FpbnN0U3RvcmU8VD4oe1xuICAgIHN0b3JlLFxuICAgIHF1ZXJ5LFxuICAgIHJvb3RJZCA9IFwiUk9PVF9RVUVSWVwiLFxuICAgIHZhcmlhYmxlcyxcbiAgICByZXR1cm5QYXJ0aWFsRGF0YSA9IHRydWUsXG4gICAgY2Fub25pemVSZXN1bHRzID0gdGhpcy5jb25maWcuY2Fub25pemVSZXN1bHRzLFxuICB9OiBEaWZmUXVlcnlBZ2FpbnN0U3RvcmVPcHRpb25zKTogQ2FjaGUuRGlmZlJlc3VsdDxUPiB7XG4gICAgY29uc3QgcG9saWNpZXMgPSB0aGlzLmNvbmZpZy5jYWNoZS5wb2xpY2llcztcblxuICAgIHZhcmlhYmxlcyA9IHtcbiAgICAgIC4uLmdldERlZmF1bHRWYWx1ZXMoZ2V0UXVlcnlEZWZpbml0aW9uKHF1ZXJ5KSksXG4gICAgICAuLi52YXJpYWJsZXMhLFxuICAgIH07XG5cbiAgICBjb25zdCByb290UmVmID0gbWFrZVJlZmVyZW5jZShyb290SWQpO1xuICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSB0aGlzLmV4ZWN1dGVTZWxlY3Rpb25TZXQoe1xuICAgICAgc2VsZWN0aW9uU2V0OiBnZXRNYWluRGVmaW5pdGlvbihxdWVyeSkuc2VsZWN0aW9uU2V0LFxuICAgICAgb2JqZWN0T3JSZWZlcmVuY2U6IHJvb3RSZWYsXG4gICAgICBlbmNsb3NpbmdSZWY6IHJvb3RSZWYsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHN0b3JlLFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgcG9saWNpZXMsXG4gICAgICAgIHZhcmlhYmxlcyxcbiAgICAgICAgdmFyU3RyaW5nOiBjYW5vbmljYWxTdHJpbmdpZnkodmFyaWFibGVzKSxcbiAgICAgICAgY2Fub25pemVSZXN1bHRzLFxuICAgICAgICAuLi5leHRyYWN0RnJhZ21lbnRDb250ZXh0KHF1ZXJ5LCB0aGlzLmNvbmZpZy5mcmFnbWVudHMpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGxldCBtaXNzaW5nOiBNaXNzaW5nRmllbGRFcnJvcltdIHwgdW5kZWZpbmVkO1xuICAgIGlmIChleGVjUmVzdWx0Lm1pc3NpbmcpIHtcbiAgICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3ZSBzdGlsbCByZXBvcnQgYW4gYXJyYXkgb2ZcbiAgICAgIC8vIE1pc3NpbmdGaWVsZEVycm9yIG9iamVjdHMsIGV2ZW4gdGhvdWdoIHRoZXJlIHdpbGwgb25seSBldmVyIGJlIGF0IG1vc3RcbiAgICAgIC8vIG9uZSBvZiB0aGVtLCBub3cgdGhhdCBhbGwgbWlzc2luZyBmaWVsZCBlcnJvciBtZXNzYWdlcyBhcmUgZ3JvdXBlZFxuICAgICAgLy8gdG9nZXRoZXIgaW4gdGhlIGV4ZWNSZXN1bHQubWlzc2luZyB0cmVlLlxuICAgICAgbWlzc2luZyA9IFtcbiAgICAgICAgbmV3IE1pc3NpbmdGaWVsZEVycm9yKFxuICAgICAgICAgIGZpcnN0TWlzc2luZyhleGVjUmVzdWx0Lm1pc3NpbmcpISxcbiAgICAgICAgICBleGVjUmVzdWx0Lm1pc3NpbmcsXG4gICAgICAgICAgcXVlcnksXG4gICAgICAgICAgdmFyaWFibGVzXG4gICAgICAgICksXG4gICAgICBdO1xuICAgICAgaWYgKCFyZXR1cm5QYXJ0aWFsRGF0YSkge1xuICAgICAgICB0aHJvdyBtaXNzaW5nWzBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZXN1bHQ6IGV4ZWNSZXN1bHQucmVzdWx0LFxuICAgICAgY29tcGxldGU6ICFtaXNzaW5nLFxuICAgICAgbWlzc2luZyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGlzRnJlc2goXG4gICAgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHBhcmVudDogU3RvcmVPYmplY3QgfCBSZWZlcmVuY2UsXG4gICAgc2VsZWN0aW9uU2V0OiBTZWxlY3Rpb25TZXROb2RlLFxuICAgIGNvbnRleHQ6IFJlYWRNZXJnZU1vZGlmeUNvbnRleHRcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgc3VwcG9ydHNSZXN1bHRDYWNoaW5nKGNvbnRleHQuc3RvcmUpICYmXG4gICAgICB0aGlzLmtub3duUmVzdWx0cy5nZXQocmVzdWx0KSA9PT0gc2VsZWN0aW9uU2V0XG4gICAgKSB7XG4gICAgICBjb25zdCBsYXRlc3QgPSB0aGlzLmV4ZWN1dGVTZWxlY3Rpb25TZXQucGVlayhcbiAgICAgICAgc2VsZWN0aW9uU2V0LFxuICAgICAgICBwYXJlbnQsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIC8vIElmIHJlc3VsdCBpcyBjYW5vbmljYWwsIHRoZW4gaXQgY291bGQgb25seSBoYXZlIGJlZW4gcHJldmlvdXNseVxuICAgICAgICAvLyBjYWNoZWQgYnkgdGhlIGNhbm9uaXppbmcgdmVyc2lvbiBvZiBleGVjdXRlU2VsZWN0aW9uU2V0LCBzbyB3ZSBjYW5cbiAgICAgICAgLy8gYXZvaWQgY2hlY2tpbmcgYm90aCBwb3NzaWJpbGl0aWVzIGhlcmUuXG4gICAgICAgIHRoaXMuY2Fub24uaXNLbm93bihyZXN1bHQpXG4gICAgICApO1xuICAgICAgaWYgKGxhdGVzdCAmJiByZXN1bHQgPT09IGxhdGVzdC5yZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFVuY2FjaGVkIHZlcnNpb24gb2YgZXhlY3V0ZVNlbGVjdGlvblNldC5cbiAgcHJpdmF0ZSBleGVjU2VsZWN0aW9uU2V0SW1wbCh7XG4gICAgc2VsZWN0aW9uU2V0LFxuICAgIG9iamVjdE9yUmVmZXJlbmNlLFxuICAgIGVuY2xvc2luZ1JlZixcbiAgICBjb250ZXh0LFxuICB9OiBFeGVjU2VsZWN0aW9uU2V0T3B0aW9ucyk6IEV4ZWNSZXN1bHQge1xuICAgIGlmIChcbiAgICAgIGlzUmVmZXJlbmNlKG9iamVjdE9yUmVmZXJlbmNlKSAmJlxuICAgICAgIWNvbnRleHQucG9saWNpZXMucm9vdFR5cGVuYW1lc0J5SWRbb2JqZWN0T3JSZWZlcmVuY2UuX19yZWZdICYmXG4gICAgICAhY29udGV4dC5zdG9yZS5oYXMob2JqZWN0T3JSZWZlcmVuY2UuX19yZWYpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IHRoaXMuY2Fub24uZW1wdHksXG4gICAgICAgIG1pc3Npbmc6IGBEYW5nbGluZyByZWZlcmVuY2UgdG8gbWlzc2luZyAke29iamVjdE9yUmVmZXJlbmNlLl9fcmVmfSBvYmplY3RgLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHZhcmlhYmxlcywgcG9saWNpZXMsIHN0b3JlIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHR5cGVuYW1lID0gc3RvcmUuZ2V0RmllbGRWYWx1ZTxzdHJpbmc+KFxuICAgICAgb2JqZWN0T3JSZWZlcmVuY2UsXG4gICAgICBcIl9fdHlwZW5hbWVcIlxuICAgICk7XG5cbiAgICBjb25zdCBvYmplY3RzVG9NZXJnZTogUmVjb3JkPHN0cmluZywgYW55PltdID0gW107XG4gICAgbGV0IG1pc3Npbmc6IE1pc3NpbmdUcmVlIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1pc3NpbmdNZXJnZXIgPSBuZXcgRGVlcE1lcmdlcigpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5jb25maWcuYWRkVHlwZW5hbWUgJiZcbiAgICAgIHR5cGVvZiB0eXBlbmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgIXBvbGljaWVzLnJvb3RJZHNCeVR5cGVuYW1lW3R5cGVuYW1lXVxuICAgICkge1xuICAgICAgLy8gRW5zdXJlIHdlIGFsd2F5cyBpbmNsdWRlIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIF9fdHlwZW5hbWVcbiAgICAgIC8vIGZpZWxkLCBpZiB3ZSBoYXZlIG9uZSwgYW5kIHRoaXMuY29uZmlnLmFkZFR5cGVuYW1lIGlzIHRydWUuIE5vdGVcbiAgICAgIC8vIHRoYXQgdGhpcyBmaWVsZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBvdGhlciBtZXJnZWQgb2JqZWN0cy5cbiAgICAgIG9iamVjdHNUb01lcmdlLnB1c2goeyBfX3R5cGVuYW1lOiB0eXBlbmFtZSB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVNaXNzaW5nPFQ+KHJlc3VsdDogRXhlY1Jlc3VsdDxUPiwgcmVzdWx0TmFtZTogc3RyaW5nKTogVCB7XG4gICAgICBpZiAocmVzdWx0Lm1pc3NpbmcpIHtcbiAgICAgICAgbWlzc2luZyA9IG1pc3NpbmdNZXJnZXIubWVyZ2UobWlzc2luZywge1xuICAgICAgICAgIFtyZXN1bHROYW1lXTogcmVzdWx0Lm1pc3NpbmcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya1NldCA9IG5ldyBTZXQoc2VsZWN0aW9uU2V0LnNlbGVjdGlvbnMpO1xuXG4gICAgd29ya1NldC5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcbiAgICAgIC8vIE9taXQgZmllbGRzIHdpdGggZGlyZWN0aXZlcyBAc2tpcChpZjogPHRydXRoeSB2YWx1ZT4pIG9yXG4gICAgICAvLyBAaW5jbHVkZShpZjogPGZhbHN5IHZhbHVlPikuXG4gICAgICBpZiAoIXNob3VsZEluY2x1ZGUoc2VsZWN0aW9uLCB2YXJpYWJsZXMpKSByZXR1cm47XG5cbiAgICAgIGlmIChpc0ZpZWxkKHNlbGVjdGlvbikpIHtcbiAgICAgICAgbGV0IGZpZWxkVmFsdWUgPSBwb2xpY2llcy5yZWFkRmllbGQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmllbGROYW1lOiBzZWxlY3Rpb24ubmFtZS52YWx1ZSxcbiAgICAgICAgICAgIGZpZWxkOiBzZWxlY3Rpb24sXG4gICAgICAgICAgICB2YXJpYWJsZXM6IGNvbnRleHQudmFyaWFibGVzLFxuICAgICAgICAgICAgZnJvbTogb2JqZWN0T3JSZWZlcmVuY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0TmFtZSA9IHJlc3VsdEtleU5hbWVGcm9tRmllbGQoc2VsZWN0aW9uKTtcblxuICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgaWYgKCFhZGRUeXBlbmFtZVRvRG9jdW1lbnQuYWRkZWQoc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgbWlzc2luZyA9IG1pc3NpbmdNZXJnZXIubWVyZ2UobWlzc2luZywge1xuICAgICAgICAgICAgICBbcmVzdWx0TmFtZV06IGBDYW4ndCBmaW5kIGZpZWxkICcke3NlbGVjdGlvbi5uYW1lLnZhbHVlfScgb24gJHtcbiAgICAgICAgICAgICAgICBpc1JlZmVyZW5jZShvYmplY3RPclJlZmVyZW5jZSkgP1xuICAgICAgICAgICAgICAgICAgb2JqZWN0T3JSZWZlcmVuY2UuX19yZWYgKyBcIiBvYmplY3RcIlxuICAgICAgICAgICAgICAgIDogXCJvYmplY3QgXCIgKyBKU09OLnN0cmluZ2lmeShvYmplY3RPclJlZmVyZW5jZSwgbnVsbCwgMilcbiAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShmaWVsZFZhbHVlKSkge1xuICAgICAgICAgIGlmIChmaWVsZFZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBoYW5kbGVNaXNzaW5nKFxuICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVTdWJTZWxlY3RlZEFycmF5KHtcbiAgICAgICAgICAgICAgICBmaWVsZDogc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIGFycmF5OiBmaWVsZFZhbHVlLFxuICAgICAgICAgICAgICAgIGVuY2xvc2luZ1JlZixcbiAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgcmVzdWx0TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXNlbGVjdGlvbi5zZWxlY3Rpb25TZXQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZmllbGQgZG9lcyBub3QgaGF2ZSBhIHNlbGVjdGlvbiBzZXQsIHRoZW4gd2UgaGFuZGxlIGl0XG4gICAgICAgICAgLy8gYXMgYSBzY2FsYXIgdmFsdWUuIFRvIGtlZXAgdGhpcy5jYW5vbiBmcm9tIGNhbm9uaWNhbGl6aW5nXG4gICAgICAgICAgLy8gdGhpcyB2YWx1ZSwgd2UgdXNlIHRoaXMuY2Fub24ucGFzcyB0byB3cmFwIGZpZWxkVmFsdWUgaW4gYVxuICAgICAgICAgIC8vIFBhc3Mgb2JqZWN0IHRoYXQgdGhpcy5jYW5vbi5hZG1pdCB3aWxsIGxhdGVyIHVud3JhcCBhcy1pcy5cbiAgICAgICAgICBpZiAoY29udGV4dC5jYW5vbml6ZVJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSB0aGlzLmNhbm9uLnBhc3MoZmllbGRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgYmVjYXVzZSB3ZSBrbm93IHRoZSBmaWVsZCBoYXMgYSBzZWxlY3Rpb24gc2V0LFxuICAgICAgICAgIC8vIGl0IG11c3QgYmUgdHJ5aW5nIHRvIHF1ZXJ5IGEgR3JhcGhRTE9iamVjdFR5cGUsIHdoaWNoIGlzIHdoeVxuICAgICAgICAgIC8vIGZpZWxkVmFsdWUgbXVzdCBiZSAhPSBudWxsLlxuICAgICAgICAgIGZpZWxkVmFsdWUgPSBoYW5kbGVNaXNzaW5nKFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlU2VsZWN0aW9uU2V0KHtcbiAgICAgICAgICAgICAgc2VsZWN0aW9uU2V0OiBzZWxlY3Rpb24uc2VsZWN0aW9uU2V0LFxuICAgICAgICAgICAgICBvYmplY3RPclJlZmVyZW5jZTogZmllbGRWYWx1ZSBhcyBTdG9yZU9iamVjdCB8IFJlZmVyZW5jZSxcbiAgICAgICAgICAgICAgZW5jbG9zaW5nUmVmOiBpc1JlZmVyZW5jZShmaWVsZFZhbHVlKSA/IGZpZWxkVmFsdWUgOiBlbmNsb3NpbmdSZWYsXG4gICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHJlc3VsdE5hbWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpZWxkVmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICAgIG9iamVjdHNUb01lcmdlLnB1c2goeyBbcmVzdWx0TmFtZV06IGZpZWxkVmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gZ2V0RnJhZ21lbnRGcm9tU2VsZWN0aW9uKFxuICAgICAgICAgIHNlbGVjdGlvbixcbiAgICAgICAgICBjb250ZXh0Lmxvb2t1cEZyYWdtZW50XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFmcmFnbWVudCAmJiBzZWxlY3Rpb24ua2luZCA9PT0gS2luZC5GUkFHTUVOVF9TUFJFQUQpIHtcbiAgICAgICAgICB0aHJvdyBuZXdJbnZhcmlhbnRFcnJvcihgTm8gZnJhZ21lbnQgbmFtZWQgJXNgLCBzZWxlY3Rpb24ubmFtZS52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJhZ21lbnQgJiYgcG9saWNpZXMuZnJhZ21lbnRNYXRjaGVzKGZyYWdtZW50LCB0eXBlbmFtZSkpIHtcbiAgICAgICAgICBmcmFnbWVudC5zZWxlY3Rpb25TZXQuc2VsZWN0aW9ucy5mb3JFYWNoKHdvcmtTZXQuYWRkLCB3b3JrU2V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbWVyZ2VEZWVwQXJyYXkob2JqZWN0c1RvTWVyZ2UpO1xuICAgIGNvbnN0IGZpbmFsUmVzdWx0OiBFeGVjUmVzdWx0ID0geyByZXN1bHQsIG1pc3NpbmcgfTtcbiAgICBjb25zdCBmcm96ZW4gPVxuICAgICAgY29udGV4dC5jYW5vbml6ZVJlc3VsdHMgP1xuICAgICAgICB0aGlzLmNhbm9uLmFkbWl0KGZpbmFsUmVzdWx0KVxuICAgICAgICAvLyBTaW5jZSB0aGlzLmNhbm9uIGlzIG5vcm1hbGx5IHJlc3BvbnNpYmxlIGZvciBmcmVlemluZyByZXN1bHRzIChvbmx5IGluXG4gICAgICAgIC8vIGRldmVsb3BtZW50KSwgZnJlZXplIHRoZW0gbWFudWFsbHkgaWYgY2Fub25pemF0aW9uIGlzIGRpc2FibGVkLlxuICAgICAgOiBtYXliZURlZXBGcmVlemUoZmluYWxSZXN1bHQpO1xuXG4gICAgLy8gU3RvcmUgdGhpcyByZXN1bHQgd2l0aCBpdHMgc2VsZWN0aW9uIHNldCBzbyB0aGF0IHdlIGNhbiBxdWlja2x5XG4gICAgLy8gcmVjb2duaXplIGl0IGFnYWluIGluIHRoZSBTdG9yZVJlYWRlciNpc0ZyZXNoIG1ldGhvZC5cbiAgICBpZiAoZnJvemVuLnJlc3VsdCkge1xuICAgICAgdGhpcy5rbm93blJlc3VsdHMuc2V0KGZyb3plbi5yZXN1bHQsIHNlbGVjdGlvblNldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb3plbjtcbiAgfVxuXG4gIC8vIFVuY2FjaGVkIHZlcnNpb24gb2YgZXhlY3V0ZVN1YlNlbGVjdGVkQXJyYXkuXG4gIHByaXZhdGUgZXhlY1N1YlNlbGVjdGVkQXJyYXlJbXBsKHtcbiAgICBmaWVsZCxcbiAgICBhcnJheSxcbiAgICBlbmNsb3NpbmdSZWYsXG4gICAgY29udGV4dCxcbiAgfTogRXhlY1N1YlNlbGVjdGVkQXJyYXlPcHRpb25zKTogRXhlY1Jlc3VsdCB7XG4gICAgbGV0IG1pc3Npbmc6IE1pc3NpbmdUcmVlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBtaXNzaW5nTWVyZ2VyID0gbmV3IERlZXBNZXJnZXI8TWlzc2luZ1RyZWVbXT4oKTtcblxuICAgIGZ1bmN0aW9uIGhhbmRsZU1pc3Npbmc8VD4oY2hpbGRSZXN1bHQ6IEV4ZWNSZXN1bHQ8VD4sIGk6IG51bWJlcik6IFQge1xuICAgICAgaWYgKGNoaWxkUmVzdWx0Lm1pc3NpbmcpIHtcbiAgICAgICAgbWlzc2luZyA9IG1pc3NpbmdNZXJnZXIubWVyZ2UobWlzc2luZywgeyBbaV06IGNoaWxkUmVzdWx0Lm1pc3NpbmcgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRSZXN1bHQucmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChmaWVsZC5zZWxlY3Rpb25TZXQpIHtcbiAgICAgIGFycmF5ID0gYXJyYXkuZmlsdGVyKGNvbnRleHQuc3RvcmUuY2FuUmVhZCk7XG4gICAgfVxuXG4gICAgYXJyYXkgPSBhcnJheS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgIC8vIG51bGwgdmFsdWUgaW4gYXJyYXlcbiAgICAgIGlmIChpdGVtID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGlzIGEgbmVzdGVkIGFycmF5LCByZWN1cnNlXG4gICAgICBpZiAoaXNBcnJheShpdGVtKSkge1xuICAgICAgICByZXR1cm4gaGFuZGxlTWlzc2luZyhcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVTdWJTZWxlY3RlZEFycmF5KHtcbiAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgYXJyYXk6IGl0ZW0sXG4gICAgICAgICAgICBlbmNsb3NpbmdSZWYsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhpcyBpcyBhbiBvYmplY3QsIHJ1biB0aGUgc2VsZWN0aW9uIHNldCBvbiBpdFxuICAgICAgaWYgKGZpZWxkLnNlbGVjdGlvblNldCkge1xuICAgICAgICByZXR1cm4gaGFuZGxlTWlzc2luZyhcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVTZWxlY3Rpb25TZXQoe1xuICAgICAgICAgICAgc2VsZWN0aW9uU2V0OiBmaWVsZC5zZWxlY3Rpb25TZXQsXG4gICAgICAgICAgICBvYmplY3RPclJlZmVyZW5jZTogaXRlbSxcbiAgICAgICAgICAgIGVuY2xvc2luZ1JlZjogaXNSZWZlcmVuY2UoaXRlbSkgPyBpdGVtIDogZW5jbG9zaW5nUmVmLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIGFzc2VydFNlbGVjdGlvblNldEZvcklkVmFsdWUoY29udGV4dC5zdG9yZSwgZmllbGQsIGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICByZXN1bHQ6IGNvbnRleHQuY2Fub25pemVSZXN1bHRzID8gdGhpcy5jYW5vbi5hZG1pdChhcnJheSkgOiBhcnJheSxcbiAgICAgIG1pc3NpbmcsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaXJzdE1pc3NpbmcodHJlZTogTWlzc2luZ1RyZWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIEpTT04uc3RyaW5naWZ5KHRyZWUsIChfLCB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgdGhyb3cgdmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKHJlc3VsdCkge1xuICAgIHJldHVybiByZXN1bHQgYXMgc3RyaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNlbGVjdGlvblNldEZvcklkVmFsdWUoXG4gIHN0b3JlOiBOb3JtYWxpemVkQ2FjaGUsXG4gIGZpZWxkOiBGaWVsZE5vZGUsXG4gIGZpZWxkVmFsdWU6IGFueVxuKSB7XG4gIGlmICghZmllbGQuc2VsZWN0aW9uU2V0KSB7XG4gICAgY29uc3Qgd29ya1NldCA9IG5ldyBTZXQoW2ZpZWxkVmFsdWVdKTtcbiAgICB3b3JrU2V0LmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoaXNOb25OdWxsT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgIWlzUmVmZXJlbmNlKHZhbHVlKSxcbiAgICAgICAgICBgTWlzc2luZyBzZWxlY3Rpb24gc2V0IGZvciBvYmplY3Qgb2YgdHlwZSAlcyByZXR1cm5lZCBmb3IgcXVlcnkgZmllbGQgJXNgLFxuICAgICAgICAgIGdldFR5cGVuYW1lRnJvbVN0b3JlT2JqZWN0KHN0b3JlLCB2YWx1ZSksXG4gICAgICAgICAgZmllbGQubmFtZS52YWx1ZVxuICAgICAgICApO1xuICAgICAgICBPYmplY3QudmFsdWVzKHZhbHVlKS5mb3JFYWNoKHdvcmtTZXQuYWRkLCB3b3JrU2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXX0= |