UNPKG

angular-odata

Version:

Client side OData typescript library for Angular

187 lines 30.2 kB
import { EMPTY } from 'rxjs'; import { expand, map, reduce } from 'rxjs/operators'; import { PathSegment, } from '../../types'; import { ODataResource } from '../resource'; import { ODataValueResource } from './value'; import { ODataCountResource } from './count'; export class ODataPropertyResource extends ODataResource { //#region Factory static factory(api, { path, type, segments, }) { const segment = segments.add(PathSegment.property, path); if (type !== undefined) { segment.outgoingType(type); segment.incomingType(type); } return new ODataPropertyResource(api, { segments, }); } static fromResource(resource, path) { const baseType = resource.outgoingType(); let baseSchema = baseType !== undefined ? resource.api.structuredType(baseType) : undefined; let fieldType; if (baseSchema !== undefined) { const field = baseSchema.field(path); fieldType = field?.type; baseSchema = field !== undefined ? baseSchema.findParentSchemaForField(field) : undefined; } const property = ODataPropertyResource.factory(resource.api, { path, type: fieldType, segments: resource.cloneSegments(), }); // Switch entitySet to binding type if available if (baseSchema !== undefined && baseSchema.type() !== baseType) { let entitySet = resource.api.findEntitySet(baseSchema.type()); if (entitySet !== undefined) { property.segment((s) => s.entitySet().path(entitySet.name)); } } return property; } clone() { return super.clone(); } transform(opts, { type, fields, } = {}) { return super.transform(opts, { type, fields, }); } //#endregion key(value) { const property = this.clone(); var key = this.resolveKey(value); if (key !== undefined) property.segment((s) => s.property().key(key)); return property; } keys(values) { const property = this.clone(); const types = this.pathSegments.types({ key: true }); const keys = values.map((value, index) => ODataResource.resolveKey(value, this.api.findStructuredType(types[index]))); property.segment((s) => s.keys(keys)); return property; } value() { return ODataValueResource.fromResource(this); } count() { return ODataCountResource.factory(this.api, { segments: this.cloneSegments(), query: this.cloneQuery(), }); } /* navigationProperty<N>(path: string) { let schema: ODataStructuredType<N> | undefined; if (this.schema instanceof ODataStructuredType) { const field = this.schema.field<any>(path as keyof T); schema = field !== undefined ? this.schema.findSchemaForField<N>(field) : undefined; } return ODataNavigationPropertyResource.factory<N>(this.api, { path, schema, segments: this.cloneSegments(), query: this.cloneQuery<N>(), }); } */ property(path) { return ODataPropertyResource.fromResource(this, path); } //#region Requests get(options) { return super.get(options); } fetch(options = {}) { return this.get(options); } /** * Fetch the property value * @param options Options for the request * @returns The property value */ fetchProperty(options = {}) { return this.fetch({ responseType: 'property', ...options }).pipe(map(({ property }) => property)); } /** * Fetch the entity * @param options Options for the request * @returns The entity */ fetchEntity(options = {}) { return this.fetch({ responseType: 'entity', ...options }).pipe(map(({ entity }) => entity)); } fetchModel(options = {}) { return this.fetch({ responseType: 'entity', ...options }).pipe(map(({ entity, annots }) => entity ? this.asModel(entity, { annots, ModelType: options?.ModelType }) : null)); } /** * Fetch the entities * @param options Options for the request * @returns The entities */ fetchEntities(options = {}) { return this.fetch({ responseType: 'entities', ...options }).pipe(map(({ entities }) => entities)); } fetchCollection(options = {}) { return this.fetch({ responseType: 'entities', ...options }).pipe(map(({ entities, annots }) => entities ? this.asCollection(entities, { annots, CollectionType: options?.CollectionType, }) : null)); } fetchOne(options) { let res = this.clone(); res.query((q) => q.top(1)); return res.fetch({ responseType: 'entities', ...options }).pipe(map(({ entities, annots }) => ({ entity: entities !== null && entities.length === 1 ? entities[0] : null, annots, }))); } fetchMany(top, options) { let res = this.clone(); let fetch = (opts) => { if (opts) { res.query((q) => q.paging(opts)); } return res.fetch({ responseType: 'entities', ...options }); }; return fetch({ top }).pipe(expand(({ annots }) => annots.skip || annots.skiptoken ? fetch(annots) : EMPTY), map(({ entities, annots }) => ({ entities: entities || [], annots })), reduce((acc, { entities, annots }) => ({ entities: [...(acc.entities || []), ...(entities || [])], annots: acc.annots.union(annots), }))); } /** * Fetch all entities * @param options Options for the request * @returns All entities */ fetchAll(options = {}) { let res = this.clone(); // Clean Paging res.query((q) => q.removePaging()); let fetch = (opts) => { if (opts) { res.query((q) => q.paging(opts)); } return res.fetch({ responseType: 'entities', ...options }); }; return fetch().pipe(expand(({ annots }) => annots.skip || annots.skiptoken ? fetch(annots) : EMPTY), map(({ entities, annots }) => ({ entities: entities || [], annots })), reduce((acc, { entities, annots }) => ({ entities: [...(acc.entities || []), ...(entities || [])], annots: acc.annots.union(annots), }))); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3R5cGVzL3Byb3BlcnR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckQsT0FBTyxFQUNMLFdBQVcsR0FHWixNQUFNLGFBQWEsQ0FBQztBQUdyQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBUTVDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFHN0MsTUFBTSxPQUFPLHFCQUF5QixTQUFRLGFBQWdCO0lBQzVELGlCQUFpQjtJQUNqQixNQUFNLENBQUMsT0FBTyxDQUNaLEdBQWEsRUFDYixFQUNFLElBQUksRUFDSixJQUFJLEVBQ0osUUFBUSxHQUtUO1FBRUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pELElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQ0QsT0FBTyxJQUFJLHFCQUFxQixDQUFJLEdBQUcsRUFBRTtZQUN2QyxRQUFRO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUksUUFBNEIsRUFBRSxJQUFZO1FBQy9ELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FB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LEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUM7UUFDRixPQUFPLEtBQUssRUFBRSxDQUFDLElBQUksQ0FDakIsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQ3BCLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ3hELEVBQ0QsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQ3JFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7U0FDakMsQ0FBQyxDQUFDLENBQ0osQ0FBQztJQUNKLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVNUFRZLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBleHBhbmQsIG1hcCwgcmVkdWNlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT0RhdGFBcGkgfSBmcm9tICcuLi8uLi9hcGknO1xuaW1wb3J0IHR5cGUgeyBNb2RlbEludGVyZmFjZSwgT0RhdGFDb2xsZWN0aW9uLCBPRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG4gIFBhdGhTZWdtZW50LFxuICBRdWVyeU9wdGlvbixcbiAgU3RydWN0dXJlZFR5cGVGaWVsZENvbmZpZyxcbn0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgT0RhdGFQYXRoU2VnbWVudHMgfSBmcm9tICcuLi9wYXRoJztcbmltcG9ydCB7IEFwcGx5RXhwcmVzc2lvbiwgQXBwbHlFeHByZXNzaW9uQnVpbGRlciB9IGZyb20gJy4uL3F1ZXJ5JztcbmltcG9ydCB7IE9EYXRhUmVzb3VyY2UgfSBmcm9tICcuLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBPRGF0YUVudGl0aWVzLCBPRGF0YUVudGl0eSwgT0RhdGFQcm9wZXJ0eSB9IGZyb20gJy4uL3Jlc3BvbnNlJztcbmltcG9ydCB7XG4gIE9EYXRhRW50aXRpZXNPcHRpb25zLFxuICBPRGF0YUVudGl0eU9wdGlvbnMsXG4gIE9EYXRhT3B0aW9ucyxcbiAgT0RhdGFQcm9wZXJ0eU9wdGlvbnMsXG59IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBPRGF0YVZhbHVlUmVzb3VyY2UgfSBmcm9tICcuL3ZhbHVlJztcbmltcG9ydCB7IE9EYXRhQ291bnRSZXNvdXJjZSB9IGZyb20gJy4vY291bnQnO1xuaW1wb3J0IHsgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zIH0gZnJvbSAnLi4vLi4vYW5ub3RhdGlvbnMnO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+IGV4dGVuZHMgT0RhdGFSZXNvdXJjZTxUPiB7XG4gIC8vI3JlZ2lvbiBGYWN0b3J5XG4gIHN0YXRpYyBmYWN0b3J5PFA+KFxuICAgIGFwaTogT0RhdGFBcGksXG4gICAge1xuICAgICAgcGF0aCxcbiAgICAgIHR5cGUsXG4gICAgICBzZWdtZW50cyxcbiAgICB9OiB7XG4gICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICB0eXBlPzogc3RyaW5nO1xuICAgICAgc2VnbWVudHM6IE9EYXRhUGF0aFNlZ21lbnRzO1xuICAgIH0sXG4gICkge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50cy5hZGQoUGF0aFNlZ21lbnQucHJvcGVydHksIHBhdGgpO1xuICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlZ21lbnQub3V0Z29pbmdUeXBlKHR5cGUpO1xuICAgICAgc2VnbWVudC5pbmNvbWluZ1R5cGUodHlwZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFA+KGFwaSwge1xuICAgICAgc2VnbWVudHMsXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbVJlc291cmNlPE4+KHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sIHBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IGJhc2VUeXBlID0gcmVzb3VyY2Uub3V0Z29pbmdUeXBlKCk7XG4gICAgbGV0IGJhc2VTY2hlbWEgPVxuICAgICAgYmFzZVR5cGUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHJlc291cmNlLmFwaS5zdHJ1Y3R1cmVkVHlwZTxhbnk+KGJhc2VUeXBlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBsZXQgZmllbGRUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGJhc2VTY2hlbWEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZmllbGQgPSBiYXNlU2NoZW1hLmZpZWxkPE4+KHBhdGgpO1xuICAgICAgZmllbGRUeXBlID0gZmllbGQ/LnR5cGU7XG4gICAgICBiYXNlU2NoZW1hID1cbiAgICAgICAgZmllbGQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYmFzZVNjaGVtYS5maW5kUGFyZW50U2NoZW1hRm9yRmllbGQ8Tj4oZmllbGQpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHkgPSBPRGF0YVByb3BlcnR5UmVzb3VyY2UuZmFjdG9yeTxOPihyZXNvdXJjZS5hcGksIHtcbiAgICAgIHBhdGgsXG4gICAgICB0eXBlOiBmaWVsZFR5cGUsXG4gICAgICBzZWdtZW50czogcmVzb3VyY2UuY2xvbmVTZWdtZW50cygpLFxuICAgIH0pO1xuXG4gICAgLy8gU3dpdGNoIGVudGl0eVNldCB0byBiaW5kaW5nIHR5cGUgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGJhc2VTY2hlbWEgIT09IHVuZGVmaW5lZCAmJiBiYXNlU2NoZW1hLnR5cGUoKSAhPT0gYmFzZVR5cGUpIHtcbiAgICAgIGxldCBlbnRpdHlTZXQgPSByZXNvdXJjZS5hcGkuZmluZEVudGl0eVNldChiYXNlU2NoZW1hLnR5cGUoKSk7XG4gICAgICBpZiAoZW50aXR5U2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcGVydHkuc2VnbWVudCgocykgPT4gcy5lbnRpdHlTZXQoKS5wYXRoKGVudGl0eVNldCEubmFtZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgfVxuICBvdmVycmlkZSBjbG9uZSgpOiBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD4ge1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPjtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYW5zZm9ybTxSPihcbiAgICBvcHRzOiAoXG4gICAgICBidWlsZGVyOiBBcHBseUV4cHJlc3Npb25CdWlsZGVyPFQ+LFxuICAgICAgY3VycmVudD86IEFwcGx5RXhwcmVzc2lvbjxUPixcbiAgICApID0+IEFwcGx5RXhwcmVzc2lvbjxUPixcbiAgICB7XG4gICAgICB0eXBlLFxuICAgICAgZmllbGRzLFxuICAgIH06IHtcbiAgICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgICBmaWVsZHM/OiB7IFtuYW1lOiBzdHJpbmddOiBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnIH07XG4gICAgfSA9IHt9LFxuICApOiBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Uj4ge1xuICAgIHJldHVybiBzdXBlci50cmFuc2Zvcm08Uj4ob3B0cywge1xuICAgICAgdHlwZSxcbiAgICAgIGZpZWxkcyxcbiAgICB9KSBhcyBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Uj47XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAga2V5KHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuY2xvbmUoKTtcbiAgICB2YXIga2V5ID0gdGhpcy5yZXNvbHZlS2V5KHZhbHVlKTtcbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHByb3BlcnR5LnNlZ21lbnQoKHMpID0+IHMucHJvcGVydHkoKS5rZXkoa2V5KSk7XG4gICAgcmV0dXJuIHByb3BlcnR5O1xuICB9XG5cbiAga2V5cyh2YWx1ZXM6IGFueVtdKSB7XG4gICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmNsb25lKCk7XG4gICAgY29uc3QgdHlwZXMgPSB0aGlzLnBhdGhTZWdtZW50cy50eXBlcyh7IGtleTogdHJ1ZSB9KTtcbiAgICBjb25zdCBrZXlzID0gdmFsdWVzLm1hcCgodmFsdWUsIGluZGV4KSA9PlxuICAgICAgT0RhdGFSZXNvdXJjZS5yZXNvbHZlS2V5KFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdGhpcy5hcGkuZmluZFN0cnVjdHVyZWRUeXBlPFQ+KHR5cGVzW2luZGV4XSksXG4gICAgICApLFxuICAgICk7XG4gICAgcHJvcGVydHkuc2VnbWVudCgocykgPT4gcy5rZXlzKGtleXMpKTtcbiAgICByZXR1cm4gcHJvcGVydHk7XG4gIH1cblxuICB2YWx1ZSgpIHtcbiAgICByZXR1cm4gT0RhdGFWYWx1ZVJlc291cmNlLmZyb21SZXNvdXJjZTxUPih0aGlzKTtcbiAgfVxuXG4gIGNvdW50KCkge1xuICAgIHJldHVybiBPRGF0YUNvdW50UmVzb3VyY2UuZmFjdG9yeTxUPih0aGlzLmFwaSwge1xuICAgICAgc2VnbWVudHM6IHRoaXMuY2xvbmVTZWdtZW50cygpLFxuICAgICAgcXVlcnk6IHRoaXMuY2xvbmVRdWVyeTxUPigpLFxuICAgIH0pO1xuICB9XG5cbiAgLypcbiAgbmF2aWdhdGlvblByb3BlcnR5PE4+KHBhdGg6IHN0cmluZykge1xuICAgIGxldCBzY2hlbWE6IE9EYXRhU3RydWN0dXJlZFR5cGU8Tj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuc2NoZW1hIGluc3RhbmNlb2YgT0RhdGFTdHJ1Y3R1cmVkVHlwZSkge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLnNjaGVtYS5maWVsZDxhbnk+KHBhdGggYXMga2V5b2YgVCk7XG4gICAgICBzY2hlbWEgPVxuICAgICAgICBmaWVsZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0aGlzLnNjaGVtYS5maW5kU2NoZW1hRm9yRmllbGQ8Tj4oZmllbGQpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLmZhY3Rvcnk8Tj4odGhpcy5hcGksIHtcbiAgICAgIHBhdGgsXG4gICAgICBzY2hlbWEsXG4gICAgICBzZWdtZW50czogdGhpcy5jbG9uZVNlZ21lbnRzKCksXG4gICAgICBxdWVyeTogdGhpcy5jbG9uZVF1ZXJ5PE4+KCksXG4gICAgfSk7XG4gIH1cbiAgKi9cblxuICBwcm9wZXJ0eTxQPihwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gT0RhdGFQcm9wZXJ0eVJlc291cmNlLmZyb21SZXNvdXJjZTxQPih0aGlzLCBwYXRoKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBSZXF1ZXN0c1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0KFxuICAgIG9wdGlvbnM/OiBPRGF0YUVudGl0eU9wdGlvbnMgJiBPRGF0YUVudGl0aWVzT3B0aW9ucyAmIE9EYXRhUHJvcGVydHlPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiBzdXBlci5nZXQob3B0aW9ucyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFNob3J0Y3V0c1xuICAvKipcbiAgICogRmV0Y2ggdGhlIHByb3BlcnR5XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm4gVGhlIGVudGl0eSAvIGVudGl0aWVzIC8gcHJvcGVydHkgdmFsdWVcbiAgICovXG4gIGZldGNoKG9wdGlvbnM/OiBPRGF0YUVudGl0eU9wdGlvbnMpOiBPYnNlcnZhYmxlPE9EYXRhRW50aXR5PFQ+PjtcbiAgZmV0Y2gob3B0aW9ucz86IE9EYXRhRW50aXRpZXNPcHRpb25zKTogT2JzZXJ2YWJsZTxPRGF0YUVudGl0aWVzPFQ+PjtcbiAgZmV0Y2gob3B0aW9ucz86IE9EYXRhUHJvcGVydHlPcHRpb25zKTogT2JzZXJ2YWJsZTxPRGF0YVByb3BlcnR5PFQ+PjtcbiAgZmV0Y2goXG4gICAgb3B0aW9uczogT0RhdGFFbnRpdHlPcHRpb25zICZcbiAgICAgIE9EYXRhRW50aXRpZXNPcHRpb25zICZcbiAgICAgIE9EYXRhUHJvcGVydHlPcHRpb25zID0ge30sXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBUaGUgcHJvcGVydHkgdmFsdWVcbiAgICovXG4gIGZldGNoUHJvcGVydHkob3B0aW9uczogT0RhdGFPcHRpb25zID0ge30pOiBPYnNlcnZhYmxlPFQgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2goeyByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScsIC4uLm9wdGlvbnMgfSkucGlwZShcbiAgICAgIG1hcCgoeyBwcm9wZXJ0eSB9KSA9PiBwcm9wZXJ0eSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgZW50aXR5XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIFRoZSBlbnRpdHlcbiAgICovXG4gIGZldGNoRW50aXR5KG9wdGlvbnM6IE9EYXRhT3B0aW9ucyA9IHt9KTogT2JzZXJ2YWJsZTxUIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmZldGNoKHsgcmVzcG9uc2VUeXBlOiAnZW50aXR5JywgLi4ub3B0aW9ucyB9KS5waXBlKFxuICAgICAgbWFwKCh7IGVudGl0eSB9KSA9PiBlbnRpdHkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGVudGl0eSBhbmQgcmV0dXJuIGFzIG1vZGVsXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIFRoZSBtb2RlbFxuICAgKi9cbiAgZmV0Y2hNb2RlbChcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keVF1ZXJ5T3B0aW9ucz86IFF1ZXJ5T3B0aW9uW107XG4gICAgICBNb2RlbFR5cGU/OiB0eXBlb2YgT0RhdGFNb2RlbDtcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPChPRGF0YU1vZGVsPFQ+ICYgTW9kZWxJbnRlcmZhY2U8VD4pIHwgbnVsbD47XG4gIGZldGNoTW9kZWw8TSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KFxuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBib2R5UXVlcnlPcHRpb25zPzogUXVlcnlPcHRpb25bXTtcbiAgICAgIE1vZGVsVHlwZT86IHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8TSB8IG51bGw+O1xuICBmZXRjaE1vZGVsKFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIE1vZGVsVHlwZT86IHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2goeyByZXNwb25zZVR5cGU6ICdlbnRpdHknLCAuLi5vcHRpb25zIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXR5LCBhbm5vdHMgfSkgPT5cbiAgICAgICAgZW50aXR5XG4gICAgICAgICAgPyB0aGlzLmFzTW9kZWwoZW50aXR5LCB7IGFubm90cywgTW9kZWxUeXBlOiBvcHRpb25zPy5Nb2RlbFR5cGUgfSlcbiAgICAgICAgICA6IG51bGwsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGVudGl0aWVzXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIFRoZSBlbnRpdGllc1xuICAgKi9cbiAgZmV0Y2hFbnRpdGllcyhcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7IHdpdGhDb3VudD86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFRbXSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaCh7IHJlc3BvbnNlVHlwZTogJ2VudGl0aWVzJywgLi4ub3B0aW9ucyB9KS5waXBlKFxuICAgICAgbWFwKCh7IGVudGl0aWVzIH0pID0+IGVudGl0aWVzKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSBlbnRpdGllcyBhbmQgcmV0dXJuIGFzIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHJldHVybnMgVGhlIGNvbGxlY3Rpb25cbiAgICovXG4gIGZldGNoQ29sbGVjdGlvbihcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zICYge1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICAgIGJvZHlRdWVyeU9wdGlvbnM/OiBRdWVyeU9wdGlvbltdO1xuICAgICAgQ29sbGVjdGlvblR5cGU/OiB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8T0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4gJiBNb2RlbEludGVyZmFjZTxUPj4gfCBudWxsPjtcbiAgZmV0Y2hDb2xsZWN0aW9uPE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+LCBDIGV4dGVuZHMgT0RhdGFDb2xsZWN0aW9uPFQsIE0+PihcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zICYge1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICAgIGJvZHlRdWVyeU9wdGlvbnM/OiBRdWVyeU9wdGlvbltdO1xuICAgICAgQ29sbGVjdGlvblR5cGU/OiB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8QyB8IG51bGw+O1xuICBmZXRjaENvbGxlY3Rpb24oXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICAgIENvbGxlY3Rpb25UeXBlPzogdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIHJldHVybiB0aGlzLmZldGNoKHsgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLCAuLi5vcHRpb25zIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXRpZXMsIGFubm90cyB9KSA9PlxuICAgICAgICBlbnRpdGllc1xuICAgICAgICAgID8gdGhpcy5hc0NvbGxlY3Rpb24oZW50aXRpZXMsIHtcbiAgICAgICAgICAgICAgYW5ub3RzLFxuICAgICAgICAgICAgICBDb2xsZWN0aW9uVHlwZTogb3B0aW9ucz8uQ29sbGVjdGlvblR5cGUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoT25lKFxuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICAgICAgYm9keVF1ZXJ5T3B0aW9ucz86IFF1ZXJ5T3B0aW9uW107XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTx7IGVudGl0eTogVCB8IG51bGw7IGFubm90czogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPFQ+IH0+IHtcbiAgICBsZXQgcmVzID0gdGhpcy5jbG9uZSgpO1xuICAgIHJlcy5xdWVyeSgocSkgPT4gcS50b3AoMSkpO1xuICAgIHJldHVybiByZXMuZmV0Y2goeyByZXNwb25zZVR5cGU6ICdlbnRpdGllcycsIC4uLm9wdGlvbnMgfSkucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdGllcywgYW5ub3RzIH0pID0+ICh7XG4gICAgICAgIGVudGl0eTogZW50aXRpZXMgIT09IG51bGwgJiYgZW50aXRpZXMubGVuZ3RoID09PSAxID8gZW50aXRpZXNbMF0gOiBudWxsLFxuICAgICAgICBhbm5vdHMsXG4gICAgICB9KSksXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoTWFueShcbiAgICB0b3A6IG51bWJlcixcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zICYge1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICAgIGJvZHlRdWVyeU9wdGlvbnM/OiBRdWVyeU9wdGlvbltdO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8eyBlbnRpdGllczogVFtdOyBhbm5vdHM6IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxUPiB9PiB7XG4gICAgbGV0IHJlcyA9IHRoaXMuY2xvbmUoKTtcbiAgICBsZXQgZmV0Y2ggPSAob3B0cz86IHtcbiAgICAgIHNraXA/OiBudW1iZXI7XG4gICAgICBza2lwdG9rZW4/OiBzdHJpbmc7XG4gICAgICB0b3A/OiBudW1iZXI7XG4gICAgfSk6IE9ic2VydmFibGU8T0RhdGFFbnRpdGllczxUPj4gPT4ge1xuICAgICAgaWYgKG9wdHMpIHtcbiAgICAgICAgcmVzLnF1ZXJ5KChxKSA9PiBxLnBhZ2luZyhvcHRzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzLmZldGNoKHsgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLCAuLi5vcHRpb25zIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIGZldGNoKHsgdG9wIH0pLnBpcGUoXG4gICAgICBleHBhbmQoKHsgYW5ub3RzIH0pID0+XG4gICAgICAgIGFubm90cy5za2lwIHx8IGFubm90cy5za2lwdG9rZW4gPyBmZXRjaChhbm5vdHMpIDogRU1QVFksXG4gICAgICApLFxuICAgICAgbWFwKCh7IGVudGl0aWVzLCBhbm5vdHMgfSkgPT4gKHsgZW50aXRpZXM6IGVudGl0aWVzIHx8IFtdLCBhbm5vdHMgfSkpLFxuICAgICAgcmVkdWNlKChhY2MsIHsgZW50aXRpZXMsIGFubm90cyB9KSA9PiAoe1xuICAgICAgICBlbnRpdGllczogWy4uLihhY2MuZW50aXRpZXMgfHwgW10pLCAuLi4oZW50aXRpZXMgfHwgW10pXSxcbiAgICAgICAgYW5ub3RzOiBhY2MuYW5ub3RzLnVuaW9uKGFubm90cyksXG4gICAgICB9KSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhbGwgZW50aXRpZXNcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHJldHVybnMgQWxsIGVudGl0aWVzXG4gICAqL1xuICBmZXRjaEFsbChcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICAgICAgYm9keVF1ZXJ5T3B0aW9ucz86IFF1ZXJ5T3B0aW9uW107XG4gICAgfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPHsgZW50aXRpZXM6IFRbXTsgYW5ub3RzOiBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM8VD4gfT4ge1xuICAgIGxldCByZXMgPSB0aGlzLmNsb25lKCk7XG4gICAgLy8gQ2xlYW4gUGFnaW5nXG4gICAgcmVzLnF1ZXJ5KChxKSA9PiBxLnJlbW92ZVBhZ2luZygpKTtcbiAgICBsZXQgZmV0Y2ggPSAob3B0cz86IHtcbiAgICAgIHNraXA/OiBudW1iZXI7XG4gICAgICBza2lwdG9rZW4/OiBzdHJpbmc7XG4gICAgICB0b3A/OiBudW1iZXI7XG4gICAgfSk6IE9ic2VydmFibGU8T0RhdGFFbnRpdGllczxUPj4gPT4ge1xuICAgICAgaWYgKG9wdHMpIHtcbiAgICAgICAgcmVzLnF1ZXJ5KChxKSA9PiBxLnBhZ2luZyhvcHRzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzLmZldGNoKHsgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLCAuLi5vcHRpb25zIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIGZldGNoKCkucGlwZShcbiAgICAgIGV4cGFuZCgoeyBhbm5vdHMgfSkgPT5cbiAgICAgICAgYW5ub3RzLnNraXAgfHwgYW5ub3RzLnNraXB0b2tlbiA/IGZldGNoKGFubm90cykgOiBFTVBUWSxcbiAgICAgICksXG4gICAgICBtYXAoKHsgZW50aXRpZXMsIGFubm90cyB9KSA9PiAoeyBlbnRpdGllczogZW50aXRpZXMgfHwgW10sIGFubm90cyB9KSksXG4gICAgICByZWR1Y2UoKGFjYywgeyBlbnRpdGllcywgYW5ub3RzIH0pID0+ICh7XG4gICAgICAgIGVudGl0aWVzOiBbLi4uKGFjYy5lbnRpdGllcyB8fCBbXSksIC4uLihlbnRpdGllcyB8fCBbXSldLFxuICAgICAgICBhbm5vdHM6IGFjYy5hbm5vdHMudW5pb24oYW5ub3RzKSxcbiAgICAgIH0pKSxcbiAgICApO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxufVxuIl19