UNPKG

angular-odata

Version:

Client side OData typescript library for Angular

149 lines 21.1 kB
import { PATH_SEPARATOR } from '../../constants'; import { PathSegment } from '../../types'; import { Objects } from '../../utils'; import { buildPathAndQuery, raw } from '../query'; import { SegmentHandler } from './handlers'; function pathSegmentsBuilder(segment, escape = false, parser, options) { if (segment.name === PathSegment.function) { let [path, params] = segment.parameters ? buildPathAndQuery({ func: { [segment.path]: segment.parameters }, escape, }) : buildPathAndQuery({ func: segment.path, escape }); if (path.startsWith(PATH_SEPARATOR)) { path = path.slice(1); } // HACK: Remove parenthesis if (path.endsWith('()') && options?.nonParenthesisForEmptyParameterFunction) { path = path.substring(0, path.length - 2); } return [path, params]; } else { //TODO: Parser key let key = segment.key; // HACK: Check guid string if (typeof key === 'string' && /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(key)) { key = raw(key); } let [path, params] = key ? buildPathAndQuery({ key, escape }) : ['', {}]; return [segment.path + path, params]; } } export const pathAndParamsFromSegments = (segments, { escape, parser, options, } = {}) => { const result = segments.reduce((acc, segment) => { const [path, params] = pathSegmentsBuilder(segment, escape, parser, options); acc.paths.push(path); acc.params = Object.assign(acc.params, params); return acc; }, { paths: [], params: {} }); return [result.paths.join(PATH_SEPARATOR), result.params]; }; export class ODataPathSegments { _segments; constructor(segments) { this._segments = segments || []; } pathAndParams({ escape, parser, options, } = {}) { return pathAndParamsFromSegments(this._segments, { escape, parser, options, }); } types({ key = false } = {}) { return this.segments({ key }) .map((s) => s.outgoingType()) .filter((t) => t !== undefined); } keys(values) { const segments = this.segments({ key: true }); if (values !== undefined) { segments.forEach((segment, index) => { const key = values[index]; if (key === undefined) { segment.clearKey(); } else { segment.key(key); } }); } return segments.map((s) => s.key()); } toString({ escape } = {}) { const [path, params] = this.pathAndParams({ escape }); return (path + Object.entries(params) .filter(([, value]) => value) .map(([key, value]) => `${key}=${value}`) .join('&')); } toJson() { return this._segments.map((s) => { let json = { name: s.name, path: s.path, }; if (s.incomingType !== undefined) json.incomingType = s.incomingType; if (s.outgoingType !== undefined) json.outgoingType = s.outgoingType; if (s.key !== undefined) json.key = s.key; if (s.parameters !== undefined) json.parameters = s.parameters; return json; }); } static fromJson(json) { return new ODataPathSegments(json.map((s) => ({ name: s.name, path: s.path, type: s.type, key: s.key, parameters: s.parameters, }))); } clone() { const segments = Objects.clone(this._segments); return new ODataPathSegments(segments); } find(predicate) { //Backward Find return [...this._segments].reverse().find(predicate); } segments({ key = false } = {}) { let segments = [...this._segments]; if (key) segments = segments.filter((s) => [ PathSegment.entitySet, PathSegment.navigationProperty, PathSegment.property, ].indexOf(s.name) !== -1); return segments.map((s) => new SegmentHandler(s)); } first({ key = false } = {}) { const segments = this.segments({ key }); return segments.length > 0 ? segments[0] : undefined; } last({ key = false } = {}) { const segments = this.segments({ key }); return segments.length > 0 ? segments[segments.length - 1] : undefined; } add(name, path) { const segment = { name, path }; this._segments.push(segment); return new SegmentHandler(segment); } get(name) { let segment = this.find((s) => s.name === name); if (segment === undefined) throw Error(`No Segment for name ${name} was found`); return new SegmentHandler(segment); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3BhdGgvc2VnbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBeUIsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBWTVDLFNBQVMsbUJBQW1CLENBQzFCLE9BQXFCLEVBQ3JCLFNBQWtCLEtBQUssRUFDdkIsTUFBb0IsRUFDcEIsT0FBdUI7SUFFdkIsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVO1lBQ3JDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDaEIsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRTtnQkFDNUMsTUFBTTthQUNQLENBQUM7WUFDSixDQUFDLENBQUMsaUJBQWlCLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3BDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCwyQkFBMkI7UUFDM0Is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QUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsR0FBRyxDQUFDLElBQVksRUFBRSxJQUFZO1FBQzVCLE1BQU0sT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBa0IsQ0FBQztRQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QixPQUFPLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxHQUFHLENBQUMsSUFBWTtRQUNkLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDaEQsSUFBSSxPQUFPLEtBQUssU0FBUztZQUN2QixNQUFNLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxZQUFZLENBQUMsQ0FBQztRQUN2RCxPQUFPLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBBVEhfU0VQQVJBVE9SIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFBhcnNlciwgUGFyc2VyT3B0aW9ucywgUGF0aFNlZ21lbnQgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBPYmplY3RzIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgYnVpbGRQYXRoQW5kUXVlcnksIHJhdyB9IGZyb20gJy4uL3F1ZXJ5JztcbmltcG9ydCB7IEVudGl0eUtleSB9IGZyb20gJy4uL3Jlc291cmNlJztcbmltcG9ydCB7IFNlZ21lbnRIYW5kbGVyIH0gZnJvbSAnLi9oYW5kbGVycyc7XG5cbmV4cG9ydCB0eXBlIE9EYXRhU2VnbWVudCA9IHtcbiAgbmFtZTogUGF0aFNlZ21lbnQ7XG4gIHBhdGg6IHN0cmluZztcbiAgb3V0Z29pbmdUeXBlPzogc3RyaW5nO1xuICBpbmNvbWluZ1R5cGU/OiBzdHJpbmc7XG4gIGJpbmRpbmdUeXBlPzogc3RyaW5nO1xuICBrZXk/OiBhbnk7XG4gIHBhcmFtZXRlcnM/OiBhbnk7XG59O1xuXG5mdW5jdGlvbiBwYXRoU2VnbWVudHNCdWlsZGVyKFxuICBzZWdtZW50OiBPRGF0YVNlZ21lbnQsXG4gIGVzY2FwZTogYm9vbGVhbiA9IGZhbHNlLFxuICBwYXJzZXI/OiBQYXJzZXI8YW55PixcbiAgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMsXG4pOiBbc3RyaW5nLCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfV0ge1xuICBpZiAoc2VnbWVudC5uYW1lID09PSBQYXRoU2VnbWVudC5mdW5jdGlvbikge1xuICAgIGxldCBbcGF0aCwgcGFyYW1zXSA9IHNlZ21lbnQucGFyYW1ldGVyc1xuICAgICAgPyBidWlsZFBhdGhBbmRRdWVyeSh7XG4gICAgICAgICAgZnVuYzogeyBbc2VnbWVudC5wYXRoXTogc2VnbWVudC5wYXJhbWV0ZXJzIH0sXG4gICAgICAgICAgZXNjYXBlLFxuICAgICAgICB9KVxuICAgICAgOiBidWlsZFBhdGhBbmRRdWVyeSh7IGZ1bmM6IHNlZ21lbnQucGF0aCwgZXNjYXBlIH0pO1xuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoUEFUSF9TRVBBUkFUT1IpKSB7XG4gICAgICBwYXRoID0gcGF0aC5zbGljZSgxKTtcbiAgICB9XG4gICAgLy8gSEFDSzogUmVtb3ZlIHBhcmVudGhlc2lzXG4gICAgaWYgKFxuICAgICAgcGF0aC5lbmRzV2l0aCgnKCknKSAmJlxuICAgICAgb3B0aW9ucz8ubm9uUGFyZW50aGVzaXNGb3JFbXB0eVBhcmFtZXRlckZ1bmN0aW9uXG4gICAgKSB7XG4gICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGggLSAyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW3BhdGgsIHBhcmFtc107XG4gIH0gZWxzZSB7XG4gICAgLy9UT0RPOiBQYXJzZXIga2V5XG4gICAgbGV0IGtleSA9IHNlZ21lbnQua2V5O1xuICAgIC8vIEhBQ0s6IENoZWNrIGd1aWQgc3RyaW5nXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIC9eWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JC8udGVzdChcbiAgICAgICAga2V5LFxuICAgICAgKVxuICAgICkge1xuICAgICAga2V5ID0gcmF3KGtleSk7XG4gICAgfVxuICAgIGxldCBbcGF0aCwgcGFyYW1zXSA9IGtleSA/IGJ1aWxkUGF0aEFuZFF1ZXJ5KHsga2V5LCBlc2NhcGUgfSkgOiBbJycsIHt9XTtcbiAgICByZXR1cm4gW3NlZ21lbnQucGF0aCArIHBhdGgsIHBhcmFtc107XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBhdGhBbmRQYXJhbXNGcm9tU2VnbWVudHMgPSAoXG4gIHNlZ21lbnRzOiBPRGF0YVNlZ21lbnRbXSxcbiAge1xuICAgIGVzY2FwZSxcbiAgICBwYXJzZXIsXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcGFyc2VyPzogUGFyc2VyPGFueT47XG4gICAgb3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG4gIH0gPSB7fSxcbik6IFtzdHJpbmcsIHsgW25hbWU6IHN0cmluZ106IGFueSB9XSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IHNlZ21lbnRzLnJlZHVjZShcbiAgICAoYWNjLCBzZWdtZW50KSA9PiB7XG4gICAgICBjb25zdCBbcGF0aCwgcGFyYW1zXSA9IHBhdGhTZWdtZW50c0J1aWxkZXIoXG4gICAgICAgIHNlZ21lbnQsXG4gICAgICAgIGVzY2FwZSxcbiAgICAgICAgcGFyc2VyLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICAgIGFjYy5wYXRocy5wdXNoKHBhdGgpO1xuICAgICAgYWNjLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oYWNjLnBhcmFtcywgcGFyYW1zKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7IHBhdGhzOiBbXSBhcyBzdHJpbmdbXSwgcGFyYW1zOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB9LFxuICApO1xuICByZXR1cm4gW3Jlc3VsdC5wYXRocy5qb2luKFBBVEhfU0VQQVJBVE9SKSwgcmVzdWx0LnBhcmFtc107XG59O1xuXG5leHBvcnQgY2xhc3MgT0RhdGFQYXRoU2VnbWVudHMge1xuICBwcml2YXRlIF9zZWdtZW50czogT0RhdGFTZWdtZW50W107XG5cbiAgY29uc3RydWN0b3Ioc2VnbWVudHM/OiBPRGF0YVNlZ21lbnRbXSkge1xuICAgIHRoaXMuX3NlZ21lbnRzID0gc2VnbWVudHMgfHwgW107XG4gIH1cblxuICBwYXRoQW5kUGFyYW1zKHtcbiAgICBlc2NhcGUsXG4gICAgcGFyc2VyLFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBlc2NhcGU/OiBib29sZWFuO1xuICAgIHBhcnNlcj86IFBhcnNlcjxhbnk+O1xuICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuICB9ID0ge30pOiBbc3RyaW5nLCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfV0ge1xuICAgIHJldHVybiBwYXRoQW5kUGFyYW1zRnJvbVNlZ21lbnRzKHRoaXMuX3NlZ21lbnRzLCB7XG4gICAgICBlc2NhcGUsXG4gICAgICBwYXJzZXIsXG4gICAgICBvcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgdHlwZXMoeyBrZXkgPSBmYWxzZSB9OiB7IGtleT86IGJvb2xlYW4gfSA9IHt9KTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnNlZ21lbnRzKHsga2V5IH0pXG4gICAgICAubWFwKChzKSA9PiBzLm91dGdvaW5nVHlwZSgpKVxuICAgICAgLmZpbHRlcigodCkgPT4gdCAhPT0gdW5kZWZpbmVkKSBhcyBzdHJpbmdbXTtcbiAgfVxuXG4gIGtleXModmFsdWVzPzogKEVudGl0eUtleTxhbnk+IHwgdW5kZWZpbmVkKVtdKSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzKHsga2V5OiB0cnVlIH0pO1xuICAgIGlmICh2YWx1ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdmFsdWVzW2luZGV4XTtcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2VnbWVudC5jbGVhcktleSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlZ21lbnQua2V5KGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2VnbWVudHMubWFwKChzKSA9PiBzLmtleSgpIGFzIEVudGl0eUtleTxhbnk+IHwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHRvU3RyaW5nKHsgZXNjYXBlIH06IHsgZXNjYXBlPzogYm9vbGVhbiB9ID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IFtwYXRoLCBwYXJhbXNdID0gdGhpcy5wYXRoQW5kUGFyYW1zKHsgZXNjYXBlIH0pO1xuICAgIHJldHVybiAoXG4gICAgICBwYXRoICtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtcylcbiAgICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSlcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7dmFsdWV9YClcbiAgICAgICAgLmpvaW4oJyYnKVxuICAgICk7XG4gIH1cblxuICB0b0pzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlZ21lbnRzLm1hcCgocykgPT4ge1xuICAgICAgbGV0IGpzb24gPSB7XG4gICAgICAgIG5hbWU6IHMubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgIHBhdGg6IHMucGF0aCxcbiAgICAgIH0gYXMgYW55O1xuICAgICAgaWYgKHMuaW5jb21pbmdUeXBlICE9PSB1bmRlZmluZWQpIGpzb24uaW5jb21pbmdUeXBlID0gcy5pbmNvbWluZ1R5cGU7XG4gICAgICBpZiAocy5vdXRnb2luZ1R5cGUgIT09IHVuZGVmaW5lZCkganNvbi5vdXRnb2luZ1R5cGUgPSBzLm91dGdvaW5nVHlwZTtcbiAgICAgIGlmIChzLmtleSAhPT0gdW5kZWZpbmVkKSBqc29uLmtleSA9IHMua2V5O1xuICAgICAgaWYgKHMucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSBqc29uLnBhcmFtZXRlcnMgPSBzLnBhcmFtZXRlcnM7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSnNvbihqc29uOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdKTogT0RhdGFQYXRoU2VnbWVudHMge1xuICAgIHJldHVybiBuZXcgT0RhdGFQYXRoU2VnbWVudHMoXG4gICAgICBqc29uLm1hcCgoczogYW55KSA9PiAoe1xuICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgIHBhdGg6IHMucGF0aCxcbiAgICAgICAgdHlwZTogcy50eXBlLFxuICAgICAgICBrZXk6IHMua2V5LFxuICAgICAgICBwYXJhbWV0ZXJzOiBzLnBhcmFtZXRlcnMsXG4gICAgICB9KSksXG4gICAgKTtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gT2JqZWN0cy5jbG9uZSh0aGlzLl9zZWdtZW50cyk7XG4gICAgcmV0dXJuIG5ldyBPRGF0YVBhdGhTZWdtZW50cyhzZWdtZW50cyk7XG4gIH1cblxuICBmaW5kKHByZWRpY2F0ZTogKHNlZ21lbnQ6IE9EYXRhU2VnbWVudCkgPT4gYm9vbGVhbikge1xuICAgIC8vQmFja3dhcmQgRmluZFxuICAgIHJldHVybiBbLi4udGhpcy5fc2VnbWVudHNdLnJldmVyc2UoKS5maW5kKHByZWRpY2F0ZSk7XG4gIH1cblxuICBzZWdtZW50cyh7IGtleSA9IGZhbHNlIH06IHsga2V5PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBsZXQgc2VnbWVudHMgPSBbLi4udGhpcy5fc2VnbWVudHNdO1xuICAgIGlmIChrZXkpXG4gICAgICBzZWdtZW50cyA9IHNlZ21lbnRzLmZpbHRlcihcbiAgICAgICAgKHMpID0+XG4gICAgICAgICAgW1xuICAgICAgICAgICAgUGF0aFNlZ21lbnQuZW50aXR5U2V0LFxuICAgICAgICAgICAgUGF0aFNlZ21lbnQubmF2aWdhdGlvblByb3BlcnR5LFxuICAgICAgICAgICAgUGF0aFNlZ21lbnQucHJvcGVydHksXG4gICAgICAgICAgXS5pbmRleE9mKHMubmFtZSkgIT09IC0xLFxuICAgICAgKTtcbiAgICByZXR1cm4gc2VnbWVudHMubWFwKChzKSA9PiBuZXcgU2VnbWVudEhhbmRsZXIocykpO1xuICB9XG5cbiAgZmlyc3QoeyBrZXkgPSBmYWxzZSB9OiB7IGtleT86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzKHsga2V5IH0pO1xuICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGggPiAwID8gc2VnbWVudHNbMF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBsYXN0KHsga2V5ID0gZmFsc2UgfTogeyBrZXk/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5zZWdtZW50cyh7IGtleSB9KTtcbiAgICByZXR1cm4gc2VnbWVudHMubGVuZ3RoID4gMCA/IHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgYWRkKG5hbWU6IHN0cmluZywgcGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2VnbWVudCA9IHsgbmFtZSwgcGF0aCB9IGFzIE9EYXRhU2VnbWVudDtcbiAgICB0aGlzLl9zZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICAgIHJldHVybiBuZXcgU2VnbWVudEhhbmRsZXIoc2VnbWVudCk7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IHNlZ21lbnQgPSB0aGlzLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gbmFtZSk7XG4gICAgaWYgKHNlZ21lbnQgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IEVycm9yKGBObyBTZWdtZW50IGZvciBuYW1lICR7bmFtZX0gd2FzIGZvdW5kYCk7XG4gICAgcmV0dXJuIG5ldyBTZWdtZW50SGFuZGxlcihzZWdtZW50KTtcbiAgfVxufVxuIl19