angular-odata
Version:
Client side OData typescript library for Angular
140 lines • 21.4 kB
JavaScript
import { QueryOption } from '../../types';
import { Objects, Types } from '../../utils';
import { buildPathAndQuery, raw, } from './builder';
import { RenderableFactory, } from './expressions';
import { ODataQueryOptionHandler } from './handlers';
// Create a path and params tuple from the query options
export const pathAndParamsFromQueryOptions = (values, { escape, parser, options, } = {}) => {
const aliases = [];
const queryOptions = [
QueryOption.select,
QueryOption.filter,
QueryOption.search,
QueryOption.compute,
QueryOption.apply,
QueryOption.transform,
QueryOption.orderBy,
QueryOption.top,
QueryOption.skip,
QueryOption.skiptoken,
QueryOption.expand,
QueryOption.format,
QueryOption.levels,
QueryOption.count,
]
.filter((key) => values.has(key) && !Types.isEmpty(values.get(key)))
.reduce((acc, key) => {
let value = values.get(key);
if (Types.rawType(value).endsWith('Expression') ||
(Types.isArray(value) &&
value.some((v) => Types.rawType(v).endsWith('Expression')))) {
value = Types.isArray(value)
? value.map((v) => Types.rawType(v).endsWith('Expression')
? raw(v.render({ aliases, escape, parser, options }))
: v)
: raw(value.render({
aliases,
escape,
parser,
options,
}));
}
return Object.assign(acc, { [key]: value });
}, {});
return buildPathAndQuery({ ...queryOptions, aliases, escape });
};
export class ODataQueryOptions {
_values;
constructor(values) {
this._values = values ?? new Map();
}
pathAndParams({ escape, parser, options, } = {}) {
return pathAndParamsFromQueryOptions(this._values, {
escape,
parser,
options,
});
}
toString({ escape, parser, } = {}) {
const [path, params] = this.pathAndParams({ escape, parser });
return (path +
Object.entries(params)
.filter(([, value]) => !Types.isEmpty(value))
.map(([key, value]) => `${key}=${value}`)
.join('&'));
}
toJson() {
return [...this._values.keys()].reduce((acc, key) => {
let value = this._values.get(key);
value = 'toJson' in value ? value.toJson() : value;
return Object.assign(acc, { [key]: value });
}, {});
}
fromJson(json) {
Object.entries(json || {}).forEach(([key, value]) => {
this._values.set(key, RenderableFactory(value));
});
return this;
}
static fromJson(json) {
const entries = Object.entries(json || {}).map(([key, value]) => [
key,
RenderableFactory(value),
]);
new Map(entries);
return new ODataQueryOptions(new Map(entries));
}
toQueryArguments() {
return {
select: this._values.get(QueryOption.select) ?? null,
expand: this._values.get(QueryOption.expand) ?? null,
transform: this._values.get(QueryOption.transform) ?? null,
compute: this._values.get(QueryOption.compute) ?? null,
apply: this._values.get(QueryOption.apply) ?? null,
search: this._values.get(QueryOption.search) ?? null,
filter: this._values.get(QueryOption.filter) ?? null,
orderBy: this._values.get(QueryOption.orderBy) ?? null,
top: this._values.get(QueryOption.top) ?? null,
skip: this._values.get(QueryOption.skip) ?? null,
skiptoken: this._values.get(QueryOption.skiptoken) ?? null,
levels: this._values.get(QueryOption.levels) ?? null,
count: this._values.get(QueryOption.count) ?? null,
};
}
clone() {
return new ODataQueryOptions(Objects.clone(this._values));
}
// Set Renderable
expression(key, exp) {
if (exp !== undefined)
this._values.set(key, exp);
return this._values.get(key);
}
// Option Handler
option(key, opts) {
if (opts !== undefined)
this._values.set(key, opts);
return new ODataQueryOptionHandler(this._values, key);
}
// Query Options tools
has(key) {
return this._values.has(key);
}
remove(...keys) {
for (let key of this._values.keys()) {
if (keys.includes(key))
this._values.delete(key);
}
}
keep(...keys) {
for (let key of this._values.keys()) {
if (!keys.includes(key))
this._values.delete(key);
}
}
// Clear
clear() {
this._values.clear();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9yZXNvdXJjZXMvcXVlcnkvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXlCLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsaUJBQWlCLEVBS2pCLEdBQUcsR0FHSixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBS0wsaUJBQWlCLEdBRWxCLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQW1CckQsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQzNDLE1BQTZCLEVBQzdCLEVBQ0UsTUFBTSxFQUNOLE1BQU0sRUFDTixPQUFPLE1BQzhELEVBQUUsRUFDdEMsRUFBRTtJQUNyQyxNQUFNLE9BQU8sR0FBc0IsRUFBRSxDQUFDO0lBQ3RDLE1BQU0sWUFBWSxHQUFHO1FBQ25CLFdBQVcsQ0FBQyxNQUFNO1FBQ2xCLFdBQVcsQ0FBQyxNQUFNO1FBQ2xCLFdBQVcsQ0FBQyxNQUFNO1FBQ2xCLFdBQVcsQ0FBQyxPQUFPO1FBQ25CLFdBQVcsQ0FBQyxLQUFLO1FBQ2pCLFdBQVcsQ0FBQyxTQUFTO1FBQ3JCLFdBQVcsQ0FBQyxPQUFPO1FBQ25CLFdBQVcsQ0FBQyxHQUFHO1FBQ2YsV0FBVyxDQUFDLElBQUk7UUFDaEIsV0FBVyxDQUFDLFNBQVM7UUFDckIsV0FBVyxDQUFDLE1BQU07UUFDbEIsV0FBVyxDQUFDLE1BQU07UUFDbEIsV0FBVyxDQUFDLE1BQU07UUFDbEIsV0FBVyxDQUFDLEtBQUs7S0FDbEI7U0FDRSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxD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Z0JBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsR0FBRyxJQUFtQjtRQUN6QixLQUFLLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO0lBQ1IsS0FBSztRQUNILElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyc2VyLCBQYXJzZXJPcHRpb25zLCBRdWVyeU9wdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IE9iamVjdHMsIFR5cGVzIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRQYXRoQW5kUXVlcnksXG4gIEV4cGFuZCxcbiAgRmlsdGVyLFxuICBPcmRlckJ5LFxuICBRdWVyeUN1c3RvbVR5cGUsXG4gIHJhdyxcbiAgU2VsZWN0LFxuICBUcmFuc2Zvcm0sXG59IGZyb20gJy4vYnVpbGRlcic7XG5pbXBvcnQge1xuICBDb21wdXRlRXhwcmVzc2lvbixcbiAgRXhwcmVzc2lvbixcbiAgRmlsdGVyRXhwcmVzc2lvbixcbiAgT3JkZXJCeUV4cHJlc3Npb24sXG4gIFJlbmRlcmFibGVGYWN0b3J5LFxuICBTZWFyY2hFeHByZXNzaW9uLFxufSBmcm9tICcuL2V4cHJlc3Npb25zJztcbmltcG9ydCB7IEFwcGx5RXhwcmVzc2lvbiB9IGZyb20gJy4vZXhwcmVzc2lvbnMvYXBwbHknO1xuaW1wb3J0IHsgRXhwYW5kRXhwcmVzc2lvbiB9IGZyb20gJy4vZXhwcmVzc2lvbnMvZXhwYW5kJztcbmltcG9ydCB7IFNlbGVjdEV4cHJlc3Npb24gfSBmcm9tICcuL2V4cHJlc3Npb25zL3NlbGVjdCc7XG5pbXBvcnQgeyBPRGF0YVF1ZXJ5T3B0aW9uSGFuZGxlciB9IGZyb20gJy4vaGFuZGxlcnMnO1xuXG5leHBvcnQgdHlwZSBPRGF0YVF1ZXJ5QXJndW1lbnRzPFQ+ID0ge1xuICBbUXVlcnlPcHRpb24uc2VsZWN0XT86IFNlbGVjdDxUPiB8IFNlbGVjdEV4cHJlc3Npb248VD4gfCBudWxsO1xuICBbUXVlcnlPcHRpb24uZXhwYW5kXT86IEV4cGFuZDxUPiB8IEV4cGFuZEV4cHJlc3Npb248VD4gfCBudWxsO1xuICBbUXVlcnlPcHRpb24uY29tcHV0ZV0/OiBzdHJpbmcgfCBDb21wdXRlRXhwcmVzc2lvbjxUPiB8IG51bGw7XG4gIFtRdWVyeU9wdGlvbi5hcHBseV0/OiBzdHJpbmcgfCBBcHBseUV4cHJlc3Npb248VD4gfCBudWxsO1xuICBbUXVlcnlPcHRpb24uZmlsdGVyXT86IEZpbHRlcjxUPiB8IEZpbHRlckV4cHJlc3Npb248VD4gfCBudWxsO1xuICBbUXVlcnlPcHRpb24uc2VhcmNoXT86IHN0cmluZyB8IFNlYXJjaEV4cHJlc3Npb248VD4gfCBudWxsO1xuICBbUXVlcnlPcHRpb24udHJhbnNmb3JtXT86IFRyYW5zZm9ybTxUPiB8IG51bGw7XG4gIFtRdWVyeU9wdGlvbi5vcmRlckJ5XT86IE9yZGVyQnk8VD4gfCBPcmRlckJ5RXhwcmVzc2lvbjxUPiB8IG51bGw7XG4gIFtRdWVyeU9wdGlvbi50b3BdPzogbnVtYmVyIHwgbnVsbDtcbiAgW1F1ZXJ5T3B0aW9uLnNraXBdPzogbnVtYmVyIHwgbnVsbDtcbiAgW1F1ZXJ5T3B0aW9uLnNraXB0b2tlbl0/OiBzdHJpbmcgfCBudWxsO1xuICBbUXVlcnlPcHRpb24uZm9ybWF0XT86IHN0cmluZyB8IG51bGw7XG4gIFtRdWVyeU9wdGlvbi5sZXZlbHNdPzogbnVtYmVyIHwgJ21heCcgfCBudWxsO1xuICBbUXVlcnlPcHRpb24uY291bnRdPzogYm9vbGVhbiB8IG51bGw7XG59O1xuXG4vLyBDcmVhdGUgYSBwYXRoIGFuZCBwYXJhbXMgdHVwbGUgZnJvbSB0aGUgcXVlcnkgb3B0aW9uc1xuZXhwb3J0IGNvbnN0IHBhdGhBbmRQYXJhbXNGcm9tUXVlcnlPcHRpb25zID0gPFQ+KFxuICB2YWx1ZXM6IE1hcDxRdWVyeU9wdGlvbiwgYW55PixcbiAge1xuICAgIGVzY2FwZSxcbiAgICBwYXJzZXIsXG4gICAgb3B0aW9ucyxcbiAgfTogeyBlc2NhcGU/OiBib29sZWFuOyBwYXJzZXI/OiBQYXJzZXI8VD47IG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zIH0gPSB7fSxcbik6IFtzdHJpbmcsIHsgW25hbWU6IHN0cmluZ106IGFueSB9XSA9PiB7XG4gIGNvbnN0IGFsaWFzZXM6IFF1ZXJ5Q3VzdG9tVHlwZVtdID0gW107XG4gIGNvbnN0IHF1ZXJ5T3B0aW9ucyA9IFtcbiAgICBRdWVyeU9wdGlvbi5zZWxlY3QsXG4gICAgUXVlcnlPcHRpb24uZmlsdGVyLFxuICAgIFF1ZXJ5T3B0aW9uLnNlYXJjaCxcbiAgICBRdWVyeU9wdGlvbi5jb21wdXRlLFxuICAgIFF1ZXJ5T3B0aW9uLmFwcGx5LFxuICAgIFF1ZXJ5T3B0aW9uLnRyYW5zZm9ybSxcbiAgICBRdWVyeU9wdGlvbi5vcmRlckJ5LFxuICAgIFF1ZXJ5T3B0aW9uLnRvcCxcbiAgICBRdWVyeU9wdGlvbi5za2lwLFxuICAgIFF1ZXJ5T3B0aW9uLnNraXB0b2tlbixcbiAgICBRdWVyeU9wdGlvbi5leHBhbmQsXG4gICAgUXVlcnlPcHRpb24uZm9ybWF0LFxuICAgIFF1ZXJ5T3B0aW9uLmxldmVscyxcbiAgICBRdWVyeU9wdGlvbi5jb3VudCxcbiAgXVxuICAgIC5maWx0ZXIoKGtleSkgPT4gdmFsdWVzLmhhcyhrZXkpICYmICFUeXBlcy5pc0VtcHR5KHZhbHVlcy5nZXQoa2V5KSkpXG4gICAgLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IHZhbHVlcy5nZXQoa2V5KTtcbiAgICAgIGlmIChcbiAgICAgICAgVHlwZXMucmF3VHlwZSh2YWx1ZSkuZW5kc1dpdGgoJ0V4cHJlc3Npb24nKSB8fFxuICAgICAgICAoVHlwZXMuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgICB2YWx1ZS5zb21lKCh2OiBhbnkpID0+IFR5cGVzLnJhd1R5cGUodikuZW5kc1dpdGgoJ0V4cHJlc3Npb24nKSkpXG4gICAgICApIHtcbiAgICAgICAgdmFsdWUgPSBUeXBlcy5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgID8gdmFsdWUubWFwKCh2OiBFeHByZXNzaW9uPFQ+KSA9PlxuICAgICAgICAgICAgICBUeXBlcy5yYXdUeXBlKHYpLmVuZHNXaXRoKCdFeHByZXNzaW9uJylcbiAgICAgICAgICAgICAgICA/IHJhdyh2LnJlbmRlcih7IGFsaWFzZXMsIGVzY2FwZSwgcGFyc2VyLCBvcHRpb25zIH0pKVxuICAgICAgICAgICAgICAgIDogdixcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IHJhdyhcbiAgICAgICAgICAgICAgKHZhbHVlIGFzIEV4cHJlc3Npb248VD4pLnJlbmRlcih7XG4gICAgICAgICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgICAgICAgcGFyc2VyLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBba2V5XTogdmFsdWUgfSk7XG4gICAgfSwge30pO1xuICByZXR1cm4gYnVpbGRQYXRoQW5kUXVlcnk8YW55Pih7IC4uLnF1ZXJ5T3B0aW9ucywgYWxpYXNlcywgZXNjYXBlIH0pO1xufTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhUXVlcnlPcHRpb25zPFQ+IHtcbiAgcHJpdmF0ZSBfdmFsdWVzOiBNYXA8UXVlcnlPcHRpb24sIGFueT47XG5cbiAgY29uc3RydWN0b3IodmFsdWVzPzogTWFwPFF1ZXJ5T3B0aW9uLCBhbnk+KSB7XG4gICAgdGhpcy5fdmFsdWVzID0gdmFsdWVzID8/IG5ldyBNYXA8UXVlcnlPcHRpb24sIGFueT4oKTtcbiAgfVxuXG4gIHBhdGhBbmRQYXJhbXMoe1xuICAgIGVzY2FwZSxcbiAgICBwYXJzZXIsXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcGFyc2VyPzogUGFyc2VyPFQ+O1xuICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuICB9ID0ge30pOiBbc3RyaW5nLCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfV0ge1xuICAgIHJldHVybiBwYXRoQW5kUGFyYW1zRnJvbVF1ZXJ5T3B0aW9uczxUPih0aGlzLl92YWx1ZXMsIHtcbiAgICAgIGVzY2FwZSxcbiAgICAgIHBhcnNlcixcbiAgICAgIG9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICB0b1N0cmluZyh7XG4gICAgZXNjYXBlLFxuICAgIHBhcnNlcixcbiAgfTogeyBlc2NhcGU/OiBib29sZWFuOyBwYXJzZXI/OiBQYXJzZXI8VD4gfSA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCBbcGF0aCwgcGFyYW1zXSA9IHRoaXMucGF0aEFuZFBhcmFtcyh7IGVzY2FwZSwgcGFyc2VyIH0pO1xuICAgIHJldHVybiAoXG4gICAgICBwYXRoICtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtcylcbiAgICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhVHlwZXMuaXNFbXB0eSh2YWx1ZSkpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fT0ke3ZhbHVlfWApXG4gICAgICAgIC5qb2luKCcmJylcbiAgICApO1xuICB9XG5cbiAgdG9Kc29uKCkge1xuICAgIHJldHVybiBbLi4udGhpcy5fdmFsdWVzLmtleXMoKV0ucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChrZXkpO1xuICAgICAgdmFsdWUgPSAndG9Kc29uJyBpbiB2YWx1ZSA/IHZhbHVlLnRvSnNvbigpIDogdmFsdWU7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW2tleV06IHZhbHVlIH0pO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIGZyb21Kc29uPFQ+KGpzb246IHsgW25hbWU6IHN0cmluZ106IGFueSB9KTogdGhpcyB7XG4gICAgT2JqZWN0LmVudHJpZXMoanNvbiB8fCB7fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGtleSBhcyBRdWVyeU9wdGlvbiwgUmVuZGVyYWJsZUZhY3RvcnkodmFsdWUpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSnNvbjxUPihqc29uOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSk6IE9EYXRhUXVlcnlPcHRpb25zPFQ+IHtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoanNvbiB8fCB7fSkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgIGtleSxcbiAgICAgIFJlbmRlcmFibGVGYWN0b3J5KHZhbHVlKSxcbiAgICBdKSBhcyBbUXVlcnlPcHRpb24sIGFueV1bXTtcbiAgICBuZXcgTWFwKGVudHJpZXMpO1xuICAgIHJldHVybiBuZXcgT0RhdGFRdWVyeU9wdGlvbnM8VD4obmV3IE1hcChlbnRyaWVzKSk7XG4gIH1cblxuICB0b1F1ZXJ5QXJndW1lbnRzKCk6IE9EYXRhUXVlcnlBcmd1bWVudHM8VD4ge1xuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3Q6IHRoaXMuX3ZhbHVlcy5nZXQoUXVlcnlPcHRpb24uc2VsZWN0KSA/PyBudWxsLFxuICAgICAgZXhwYW5kOiB0aGlzLl92YWx1ZXMuZ2V0KFF1ZXJ5T3B0aW9uLmV4cGFuZCkgPz8gbnVsbCxcbiAgICAgIHRyYW5zZm9ybTogdGhpcy5fdmFsdWVzLmdldChRdWVyeU9wdGlvbi50cmFuc2Zvcm0pID8/IG51bGwsXG4gICAgICBjb21wdXRlOiB0aGlzLl92YWx1ZXMuZ2V0KFF1ZXJ5T3B0aW9uLmNvbXB1dGUpID8/IG51bGwsXG4gICAgICBhcHBseTogdGhpcy5fdmFsdWVzLmdldChRdWVyeU9wdGlvbi5hcHBseSkgPz8gbnVsbCxcbiAgICAgIHNlYXJjaDogdGhpcy5fdmFsdWVzLmdldChRdWVyeU9wdGlvbi5zZWFyY2gpID8/IG51bGwsXG4gICAgICBmaWx0ZXI6IHRoaXMuX3ZhbHVlcy5nZXQoUXVlcnlPcHRpb24uZmlsdGVyKSA/PyBudWxsLFxuICAgICAgb3JkZXJCeTogdGhpcy5fdmFsdWVzLmdldChRdWVyeU9wdGlvbi5vcmRlckJ5KSA/PyBudWxsLFxuICAgICAgdG9wOiB0aGlzLl92YWx1ZXMuZ2V0KFF1ZXJ5T3B0aW9uLnRvcCkgPz8gbnVsbCxcbiAgICAgIHNraXA6IHRoaXMuX3ZhbHVlcy5nZXQoUXVlcnlPcHRpb24uc2tpcCkgPz8gbnVsbCxcbiAgICAgIHNraXB0b2tlbjogdGhpcy5fdmFsdWVzLmdldChRdWVyeU9wdGlvbi5za2lwdG9rZW4pID8/IG51bGwsXG4gICAgICBsZXZlbHM6IHRoaXMuX3ZhbHVlcy5nZXQoUXVlcnlPcHRpb24ubGV2ZWxzKSA/PyBudWxsLFxuICAgICAgY291bnQ6IHRoaXMuX3ZhbHVlcy5nZXQoUXVlcnlPcHRpb24uY291bnQpID8/IG51bGwsXG4gICAgfSBhcyBPRGF0YVF1ZXJ5QXJndW1lbnRzPFQ+O1xuICB9XG5cbiAgY2xvbmU8Tz4oKSB7XG4gICAgcmV0dXJuIG5ldyBPRGF0YVF1ZXJ5T3B0aW9uczxPPihPYmplY3RzLmNsb25lKHRoaXMuX3ZhbHVlcykpO1xuICB9XG5cbiAgLy8gU2V0IFJlbmRlcmFibGVcbiAgZXhwcmVzc2lvbihrZXk6IFF1ZXJ5T3B0aW9uLCBleHA/OiBFeHByZXNzaW9uPFQ+KSB7XG4gICAgaWYgKGV4cCAhPT0gdW5kZWZpbmVkKSB0aGlzLl92YWx1ZXMuc2V0KGtleSwgZXhwKTtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzLmdldChrZXkpO1xuICB9XG5cbiAgLy8gT3B0aW9uIEhhbmRsZXJcbiAgb3B0aW9uPE8+KGtleTogUXVlcnlPcHRpb24sIG9wdHM/OiBPKSB7XG4gICAgaWYgKG9wdHMgIT09IHVuZGVmaW5lZCkgdGhpcy5fdmFsdWVzLnNldChrZXksIG9wdHMpO1xuICAgIHJldHVybiBuZXcgT0RhdGFRdWVyeU9wdGlvbkhhbmRsZXI8Tz4odGhpcy5fdmFsdWVzLCBrZXkpO1xuICB9XG5cbiAgLy8gUXVlcnkgT3B0aW9ucyB0b29sc1xuICBoYXMoa2V5OiBRdWVyeU9wdGlvbikge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXMuaGFzKGtleSk7XG4gIH1cblxuICByZW1vdmUoLi4ua2V5czogUXVlcnlPcHRpb25bXSkge1xuICAgIGZvciAobGV0IGtleSBvZiB0aGlzLl92YWx1ZXMua2V5cygpKSB7XG4gICAgICBpZiAoa2V5cy5pbmNsdWRlcyhrZXkpKSB0aGlzLl92YWx1ZXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAga2VlcCguLi5rZXlzOiBRdWVyeU9wdGlvbltdKSB7XG4gICAgZm9yIChsZXQga2V5IG9mIHRoaXMuX3ZhbHVlcy5rZXlzKCkpIHtcbiAgICAgIGlmICgha2V5cy5pbmNsdWRlcyhrZXkpKSB0aGlzLl92YWx1ZXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2xlYXJcbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5fdmFsdWVzLmNsZWFyKCk7XG4gIH1cbn1cbiJdfQ==