angular-odata
Version:
Client side OData typescript library for Angular
113 lines • 16.9 kB
JavaScript
import { ODataApi } from './api';
export class ODataSettings {
apis;
constructor(configs) {
this.apis = configs.map((config) => new ODataApi(config));
if (this.apis.length > 1) {
if (this.apis.some((c) => c.name === undefined))
throw new Error('Multiple APIs: Needs configuration names');
if (this.apis.filter((c) => c.default).length > 1)
throw new Error('Multiple APIs: Needs only one default api');
}
// If not default setup first config as default api
if (this.apis.every((c) => !c.default))
this.apis[0].default = true;
}
configure(settings) {
this.apis.forEach((api) => api.configure(settings));
}
defaultApi() {
return this.apis.find((c) => c.default);
}
findApiByName(name) {
return this.apis.find((c) => c.name === name);
}
apiByName(name) {
const api = this.findApiByName(name);
if (api === undefined)
throw new Error(`No API for name: ${name}`);
return api;
}
findApiForTypes(types) {
return this.apis.find((c) => c.schemas.some((s) => types.some((type) => s.isNamespaceOf(type))));
}
findApiForType(type) {
return this.findApiForTypes([type]);
}
apiForType(type) {
const api = this.findApiForType(type);
if (api === undefined)
throw new Error(`No API for type: ${type}`);
return api;
}
//#region Configs shortcuts
enumTypeForType(type) {
let values = this.apis
.map((api) => api.findEnumType(type))
.filter((e) => e);
if (values.length === 0)
throw Error(`No Enum for type ${type} was found`);
if (values.length > 1)
throw Error('Multiple APIs: More than one value was found');
return values[0];
}
structuredTypeForType(type) {
let values = this.apis
.map((api) => api.findStructuredType(type))
.filter((e) => e);
if (values.length === 0)
throw Error(`No Structured for type ${type} was found`);
if (values.length > 1)
throw Error('Multiple APIs: More than one value was found');
return values[0];
}
callableForType(type, bindingType) {
let values = this.apis
.map((api) => api.findCallable(type, bindingType))
.filter((e) => e);
if (values.length === 0)
throw Error(`No Callable for type ${type} was found`);
if (values.length > 1)
throw Error('Multiple APIs: More than one value was found');
return values[0];
}
entitySetForType(type) {
let values = this.apis
.map((api) => api.findEntitySet(type))
.filter((e) => e);
if (values.length === 0)
throw Error(`No EntitySet for type ${type} was found`);
if (values.length > 1)
throw Error('Multiple APIs: More than one value was found');
return values[0];
}
parserForType(type) {
let values = this.apis
.map((api) => api.parserForType(type))
.filter((e) => e);
if (values.length === 0)
throw Error(`No Parser for type ${type} was found`);
if (!type.startsWith('Edm.') && values.length > 1)
throw Error('Multiple APIs: More than one value was found');
return values[0];
}
modelForType(type) {
let values = this.apis.map((api) => api.findModel(type)).filter((e) => e);
if (values.length === 0)
throw Error(`No Model for type ${type} was found`);
if (values.length > 1)
throw Error('Multiple APIs: More than one value was found');
return values[0];
}
collectionForType(type) {
let values = this.apis
.map((api) => api.findCollection(type))
.filter((e) => e);
if (values.length === 0)
throw Error(`No Collection for type ${type} was found`);
if (values.length > 1)
throw Error('Multiple APIs: More than one value was found');
return values[0];
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvc2V0dGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQVdqQyxNQUFNLE9BQU8sYUFBYTtJQUN4QixJQUFJLENBQWE7SUFDakIsWUFBWSxPQUFvQjtRQUM5QixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDMUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztnQkFDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1lBQzlELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxtREFBbUQ7UUFDbkQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RFLENBQUM7SUFFRCxTQUFTLENBQUMsUUFFVDtRQUNDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVNLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFhLENBQUM7SUFDdEQsQ0FBQztJQUVNLGFBQWEsQ0FBQyxJQUFZO1FBQy9CLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLFNBQVMsQ0FBQyxJQUFZO1FBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxHQUFHLEtBQUssU0FBUztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkUsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sZUFBZSxDQUFDLEtBQWU7UUFDcEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzFCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDbkUsQ0FBQztJQUNKLENBQUM7SUFFTSxjQUFjLENBQUMsSUFBWTtRQUNoQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTSxVQUFVLENBQUMsSUFBWTtRQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksR0FBRyxLQUFLLFNBQVM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELDJCQUEyQjtJQUNwQixlQUFlLENBQUksSUFBWTtRQUNwQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSTthQUNuQixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUksSUFBSSxDQUFDLENBQUM7YUFDdkMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE1BQU0sS0FBSyxDQUFDLG9CQUFvQixJQUFJLFlBQVksQ0FBQyxDQUFDO1FBQzNFLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ25CLE1BQU0sS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFxQixDQUFDO0lBQ3ZDLENBQUM7SUFFTSxxQkFBcUIsQ0FBSSxJQUFZO1FBQzFDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJO2FBQ25CLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFJLElBQUksQ0FBQyxDQUFDO2FBQzdDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDckIsTUFBTSxLQUFLLENBQUMsMEJBQTBCLElBQUksWUFBWSxDQUFDLENBQUM7UUFDMUQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbkIsTUFBTSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUM5RCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQTJCLENBQUM7SUFDN0MsQ0FBQztJQUVNLGVBQWUsQ0FBSSxJQUFZLEVBQUUsV0FBb0I7UUFDMUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUk7YUFDbkIsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFJLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQzthQUNwRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3JCLE1BQU0sS0FBSyxDQUFDLHdCQUF3QixJQUFJLFlBQVksQ0FBQyxDQUFDO1FBQ3hELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ25CLE1BQU0sS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFxQixDQUFDO0lBQ3ZDLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxJQUFZO1FBQ2xDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJO2FBQ25CLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNyQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3JCLE1BQU0sS0FBSyxDQUFDLHlCQUF5QixJQUFJLFlBQVksQ0FBQyxDQUFDO1FBQ3pELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ25CLE1BQU0sS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFtQixDQUFDO0lBQ3JDLENBQUM7SUFFTSxhQUFhLENBQUksSUFBc0I7UUFDNUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUk7YUFDbkIsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFJLElBQUksQ0FBQyxDQUFDO2FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDckIsTUFBTSxLQUFLLENBQUMsc0JBQXNCLElBQUksWUFBWSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQy9DLE1BQU0sS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFjLENBQUM7SUFDaEMsQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUFZO1FBQzlCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE1BQU0sS0FBSyxDQUFDLHFCQUFxQixJQUFJLFlBQVksQ0FBQyxDQUFDO1FBQzVFLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ25CLE1BQU0sS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFzQixDQUFDO0lBQ3hDLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxJQUFZO1FBQ25DLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJO2FBQ25CLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3JCLE1BQU0sS0FBSyxDQUFDLDBCQUEwQixJQUFJLFlBQVksQ0FBQyxDQUFDO1FBQzFELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ25CLE1BQU0sS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUEyQixDQUFDO0lBQzdDLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9EYXRhQXBpIH0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgT0RhdGFDb2xsZWN0aW9uLCBPRGF0YU1vZGVsIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgT0RhdGFSZXF1ZXN0IH0gZnJvbSAnLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHtcbiAgT0RhdGFDYWxsYWJsZSxcbiAgT0RhdGFFbnRpdHlTZXQsXG4gIE9EYXRhRW51bVR5cGUsXG4gIE9EYXRhU3RydWN0dXJlZFR5cGUsXG59IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7IEFwaUNvbmZpZywgRWRtVHlwZSwgUGFyc2VyIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVNldHRpbmdzIHtcbiAgYXBpczogT0RhdGFBcGlbXTtcbiAgY29uc3RydWN0b3IoY29uZmlnczogQXBpQ29uZmlnW10pIHtcbiAgICB0aGlzLmFwaXMgPSBjb25maWdzLm1hcCgoY29uZmlnKSA9PiBuZXcgT0RhdGFBcGkoY29uZmlnKSk7XG4gICAgaWYgKHRoaXMuYXBpcy5sZW5ndGggPiAxKSB7XG4gICAgICBpZiAodGhpcy5hcGlzLnNvbWUoKGMpID0+IGMubmFtZSA9PT0gdW5kZWZpbmVkKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBBUElzOiBOZWVkcyBjb25maWd1cmF0aW9uIG5hbWVzJyk7XG4gICAgICBpZiAodGhpcy5hcGlzLmZpbHRlcigoYykgPT4gYy5kZWZhdWx0KS5sZW5ndGggPiAxKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011bHRpcGxlIEFQSXM6IE5lZWRzIG9ubHkgb25lIGRlZmF1bHQgYXBpJyk7XG4gICAgfVxuICAgIC8vIElmIG5vdCBkZWZhdWx0IHNldHVwIGZpcnN0IGNvbmZpZyBhcyBkZWZhdWx0IGFwaVxuICAgIGlmICh0aGlzLmFwaXMuZXZlcnkoKGMpID0+ICFjLmRlZmF1bHQpKSB0aGlzLmFwaXNbMF0uZGVmYXVsdCA9IHRydWU7XG4gIH1cblxuICBjb25maWd1cmUoc2V0dGluZ3M6IHtcbiAgICByZXF1ZXN0ZXI/OiAocmVxdWVzdDogT0RhdGFSZXF1ZXN0PGFueT4pID0+IE9ic2VydmFibGU8YW55PjtcbiAgfSkge1xuICAgIHRoaXMuYXBpcy5mb3JFYWNoKChhcGkpID0+IGFwaS5jb25maWd1cmUoc2V0dGluZ3MpKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWZhdWx0QXBpKCkge1xuICAgIHJldHVybiB0aGlzLmFwaXMuZmluZCgoYykgPT4gYy5kZWZhdWx0KSBhcyBPRGF0YUFwaTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kQXBpQnlOYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmFwaXMuZmluZCgoYykgPT4gYy5uYW1lID09PSBuYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBhcGlCeU5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYXBpID0gdGhpcy5maW5kQXBpQnlOYW1lKG5hbWUpO1xuICAgIGlmIChhcGkgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBObyBBUEkgZm9yIG5hbWU6ICR7bmFtZX1gKTtcbiAgICByZXR1cm4gYXBpO1xuICB9XG5cbiAgcHVibGljIGZpbmRBcGlGb3JUeXBlcyh0eXBlczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gdGhpcy5hcGlzLmZpbmQoKGMpID0+XG4gICAgICBjLnNjaGVtYXMuc29tZSgocykgPT4gdHlwZXMuc29tZSgodHlwZSkgPT4gcy5pc05hbWVzcGFjZU9mKHR5cGUpKSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kQXBpRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kQXBpRm9yVHlwZXMoW3R5cGVdKTtcbiAgfVxuXG4gIHB1YmxpYyBhcGlGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IGFwaSA9IHRoaXMuZmluZEFwaUZvclR5cGUodHlwZSk7XG4gICAgaWYgKGFwaSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIEFQSSBmb3IgdHlwZTogJHt0eXBlfWApO1xuICAgIHJldHVybiBhcGk7XG4gIH1cblxuICAvLyNyZWdpb24gQ29uZmlncyBzaG9ydGN1dHNcbiAgcHVibGljIGVudW1UeXBlRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcpIHtcbiAgICBsZXQgdmFsdWVzID0gdGhpcy5hcGlzXG4gICAgICAubWFwKChhcGkpID0+IGFwaS5maW5kRW51bVR5cGU8VD4odHlwZSkpXG4gICAgICAuZmlsdGVyKChlKSA9PiBlKTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgdGhyb3cgRXJyb3IoYE5vIEVudW0gZm9yIHR5cGUgJHt0eXBlfSB3YXMgZm91bmRgKTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDEpXG4gICAgICB0aHJvdyBFcnJvcignTXVsdGlwbGUgQVBJczogTW9yZSB0aGFuIG9uZSB2YWx1ZSB3YXMgZm91bmQnKTtcbiAgICByZXR1cm4gdmFsdWVzWzBdIGFzIE9EYXRhRW51bVR5cGU8VD47XG4gIH1cblxuICBwdWJsaWMgc3RydWN0dXJlZFR5cGVGb3JUeXBlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIGxldCB2YWx1ZXMgPSB0aGlzLmFwaXNcbiAgICAgIC5tYXAoKGFwaSkgPT4gYXBpLmZpbmRTdHJ1Y3R1cmVkVHlwZTxUPih0eXBlKSlcbiAgICAgIC5maWx0ZXIoKGUpID0+IGUpO1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKVxuICAgICAgdGhyb3cgRXJyb3IoYE5vIFN0cnVjdHVyZWQgZm9yIHR5cGUgJHt0eXBlfSB3YXMgZm91bmRgKTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDEpXG4gICAgICB0aHJvdyBFcnJvcignTXVsdGlwbGUgQVBJczogTW9yZSB0aGFuIG9uZSB2YWx1ZSB3YXMgZm91bmQnKTtcbiAgICByZXR1cm4gdmFsdWVzWzBdIGFzIE9EYXRhU3RydWN0dXJlZFR5cGU8VD47XG4gIH1cblxuICBwdWJsaWMgY2FsbGFibGVGb3JUeXBlPFQ+KHR5cGU6IHN0cmluZywgYmluZGluZ1R5cGU/OiBzdHJpbmcpIHtcbiAgICBsZXQgdmFsdWVzID0gdGhpcy5hcGlzXG4gICAgICAubWFwKChhcGkpID0+IGFwaS5maW5kQ2FsbGFibGU8VD4odHlwZSwgYmluZGluZ1R5cGUpKVxuICAgICAgLmZpbHRlcigoZSkgPT4gZSk7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBFcnJvcihgTm8gQ2FsbGFibGUgZm9yIHR5cGUgJHt0eXBlfSB3YXMgZm91bmRgKTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDEpXG4gICAgICB0aHJvdyBFcnJvcignTXVsdGlwbGUgQVBJczogTW9yZSB0aGFuIG9uZSB2YWx1ZSB3YXMgZm91bmQnKTtcbiAgICByZXR1cm4gdmFsdWVzWzBdIGFzIE9EYXRhQ2FsbGFibGU8VD47XG4gIH1cblxuICBwdWJsaWMgZW50aXR5U2V0Rm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBsZXQgdmFsdWVzID0gdGhpcy5hcGlzXG4gICAgICAubWFwKChhcGkpID0+IGFwaS5maW5kRW50aXR5U2V0KHR5cGUpKVxuICAgICAgLmZpbHRlcigoZSkgPT4gZSk7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBFcnJvcihgTm8gRW50aXR5U2V0IGZvciB0eXBlICR7dHlwZX0gd2FzIGZvdW5kYCk7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPiAxKVxuICAgICAgdGhyb3cgRXJyb3IoJ011bHRpcGxlIEFQSXM6IE1vcmUgdGhhbiBvbmUgdmFsdWUgd2FzIGZvdW5kJyk7XG4gICAgcmV0dXJuIHZhbHVlc1swXSBhcyBPRGF0YUVudGl0eVNldDtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZXJGb3JUeXBlPFQ+KHR5cGU6IHN0cmluZyB8IEVkbVR5cGUpIHtcbiAgICBsZXQgdmFsdWVzID0gdGhpcy5hcGlzXG4gICAgICAubWFwKChhcGkpID0+IGFwaS5wYXJzZXJGb3JUeXBlPFQ+KHR5cGUpKVxuICAgICAgLmZpbHRlcigoZSkgPT4gZSk7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBFcnJvcihgTm8gUGFyc2VyIGZvciB0eXBlICR7dHlwZX0gd2FzIGZvdW5kYCk7XG4gICAgaWYgKCF0eXBlLnN0YXJ0c1dpdGgoJ0VkbS4nKSAmJiB2YWx1ZXMubGVuZ3RoID4gMSlcbiAgICAgIHRocm93IEVycm9yKCdNdWx0aXBsZSBBUElzOiBNb3JlIHRoYW4gb25lIHZhbHVlIHdhcyBmb3VuZCcpO1xuICAgIHJldHVybiB2YWx1ZXNbMF0gYXMgUGFyc2VyPFQ+O1xuICB9XG5cbiAgcHVibGljIG1vZGVsRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBsZXQgdmFsdWVzID0gdGhpcy5hcGlzLm1hcCgoYXBpKSA9PiBhcGkuZmluZE1vZGVsKHR5cGUpKS5maWx0ZXIoKGUpID0+IGUpO1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB0aHJvdyBFcnJvcihgTm8gTW9kZWwgZm9yIHR5cGUgJHt0eXBlfSB3YXMgZm91bmRgKTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDEpXG4gICAgICB0aHJvdyBFcnJvcignTXVsdGlwbGUgQVBJczogTW9yZSB0aGFuIG9uZSB2YWx1ZSB3YXMgZm91bmQnKTtcbiAgICByZXR1cm4gdmFsdWVzWzBdIGFzIHR5cGVvZiBPRGF0YU1vZGVsO1xuICB9XG5cbiAgcHVibGljIGNvbGxlY3Rpb25Gb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGxldCB2YWx1ZXMgPSB0aGlzLmFwaXNcbiAgICAgIC5tYXAoKGFwaSkgPT4gYXBpLmZpbmRDb2xsZWN0aW9uKHR5cGUpKVxuICAgICAgLmZpbHRlcigoZSkgPT4gZSk7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBFcnJvcihgTm8gQ29sbGVjdGlvbiBmb3IgdHlwZSAke3R5cGV9IHdhcyBmb3VuZGApO1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSlcbiAgICAgIHRocm93IEVycm9yKCdNdWx0aXBsZSBBUElzOiBNb3JlIHRoYW4gb25lIHZhbHVlIHdhcyBmb3VuZCcpO1xuICAgIHJldHVybiB2YWx1ZXNbMF0gYXMgdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjtcbiAgfVxuICAvLyNlbmRyZWdpb25cbn1cbiJdfQ==