UNPKG

breeze-client

Version:

Breeze data management for JavaScript clients

143 lines 16.1 kB
/* * Copyright 2012-2023 IdeaBlade, Inc. All Rights Reserved. * Use, reproduction, distribution, and modification of this code is subject to the terms and * conditions of the IdeaBlade Breeze license, available at http://www.breezejs.com/license * * Author: Jay Traband */ /** Base class for all Breeze enumerations, such as EntityState, DataType, FetchStrategy, MergeStrategy etc. A Breeze Enum is a namespaced set of constant values. Each Enum consists of a group of related constants, called 'symbols'. Unlike enums in some other environments, each 'symbol' can have both methods and properties. > class DayOfWeek extends BreezeEnum { > dayIndex: number; > isWeekend?: boolean; > nextDay() { > let nextIndex = (this.dayIndex + 1) % 7; > return DayOfWeek.getSymbols()[nextIndex]; > } > > static Monday = new DayOfWeek( { dayIndex: 0}); > static Tuesday = new DayOfWeek( { dayIndex: 1 }); > static Wednesday = new DayOfWeek( { dayIndex: 2 }); > static Thursday = new DayOfWeek( { dayIndex: 3 }); > static Friday = new DayOfWeek( { dayIndex: 4 }); > static Saturday = new DayOfWeek( { dayIndex: 5, isWeekend: true }); > static Sunday = new DayOfWeek( { dayIndex: 6, isWeekend: true }); > } > > describe("DayOfWeek", () => { > test("should support full enum capabilities", function() { > // // custom methods > let dowSymbols = DayOfWeek.getSymbols(); > expect(dowSymbols.length).toBe(7); > expect(DayOfWeek.Monday.nextDay()).toBe(DayOfWeek.Tuesday); > expect(DayOfWeek.Sunday.nextDay()).toBe(DayOfWeek.Monday); > // // custom properties > expect(DayOfWeek.Tuesday.isWeekend).toBe(undefined); > expect(DayOfWeek.Saturday.isWeekend).toBe(true); > // // Standard enum capabilities > expect(DayOfWeek.Thursday instanceof DayOfWeek).toBe(true); > expect(BreezeEnum.isSymbol(DayOfWeek.Wednesday)).toBe(true); > expect(DayOfWeek.contains(DayOfWeek.Thursday)).toBe(true); > expect(DayOfWeek.Friday.toString()).toBe("Friday"); > }); > }); Note that we have Error['x'] = ... in some places in the code to prevent Terser from optimizing out some important calls. @dynamic */ export class BreezeEnum { /** @hidden @internal */ static _resolvedNamesAndSymbols; /** */ constructor(propertiesObj) { if (propertiesObj) { Object.keys(propertiesObj).forEach((key) => this[key] = propertiesObj[key]); } } /** Returns all of the symbols contained within this Enum. > let symbols = DayOfWeek.getSymbols(); @return All of the symbols contained within this Enum. **/ static getSymbols() { return this.resolveSymbols().map(ks => ks.symbol); } /** Returns the names of all of the symbols contained within this Enum. > let symbols = DayOfWeek.getNames(); @return All of the names of the symbols contained within this Enum. **/ static getNames() { return this.resolveSymbols().map(ks => ks.name); } /** Returns an Enum symbol given its name. > let dayOfWeek = DayOfWeek.from("Thursday"); > // nowdayOfWeek === DayOfWeek.Thursday @param name - Name for which an enum symbol should be returned. @return The symbol that matches the name or 'undefined' if not found. **/ static fromName(name) { return this[name]; } /** Seals this enum so that no more symbols may be added to it. This should only be called after all symbols have already been added to the Enum. This method also sets the 'name' property on each of the symbols. > DayOfWeek.resolveSymbols(); **/ static resolveSymbols() { if (this._resolvedNamesAndSymbols) return this._resolvedNamesAndSymbols; let result = []; for (let key in this) { if (this.hasOwnProperty(key)) { let symb = this[key]; if (symb instanceof BreezeEnum) { result.push({ name: key, symbol: symb }); this[key] = symb; symb.name = key; } } } this._resolvedNamesAndSymbols = result; return result; } /** Returns whether an Enum contains a specified symbol. > let symbol = DayOfWeek.Friday; > if (DayOfWeek.contains(symbol)) { > // do something > } @param sym - Object or symbol to test. @return Whether this Enum contains the specified symbol. **/ static contains(sym) { if (!(sym instanceof BreezeEnum)) { return false; } return this[sym.name] != null; } // /** // Checks if an object is an Enum 'symbol'. Use the 'contains' method instead of this one // if you want to test for a specific Enum. // > if (Enum.isSymbol(DayOfWeek.Wednesday)) { // > // do something ... // > }; // **/ // static isSymbol(obj: any) { // return obj instanceof BreezeEnum; // }; /** Returns the string name of this Enum */ toString() { return this.name; } /** Return enum name and symbol name */ toJSON() { return { _$typeName: this['_$typeName'] || this.constructor.name, name: this.name }; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBd0NFO0FBQ0YsTUFBTSxPQUFPLFVBQVU7SUFNckIsd0JBQXdCO0lBQ3hCLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBeUM7SUFFeEUsT0FBTztJQUNQLFlBQVksYUFBc0I7UUFDaEMsSUFBSSxhQUFhLEVBQUU7WUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM3RTtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsUUFBUTtRQUNiLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFZO1FBQzFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGNBQWM7UUFDbkIsSUFBSSxJQUFJLENBQUMsd0JBQXdCO1lBQUUsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7UUFDeEUsSUFBSSxNQUFNLEdBQTBDLEVBQUUsQ0FBQztRQUV2RCxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNwQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckIsSUFBSSxJQUFJLFlBQVksVUFBVSxFQUFFO29CQUM5QixNQUFNLENBQUMsSUFBSSxDQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7aUJBQ2pCO2FBQ0Y7U0FDRjtRQUNELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxNQUFNLENBQUM7UUFDdkMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFlO1FBQzdCLElBQUksQ0FBQyxDQUFDLEdBQUcsWUFBWSxVQUFVLENBQUMsRUFBRTtZQUNoQyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBR0QsTUFBTTtJQUNOLDBGQUEwRjtJQUMxRiw0Q0FBNEM7SUFDNUMsa0RBQWtEO0lBQ2xELDhCQUE4QjtJQUM5QixXQUFXO0lBQ1gsTUFBTTtJQUNOLDhCQUE4QjtJQUM5QixzQ0FBc0M7SUFDdEMsS0FBSztJQUVMLDJDQUEyQztJQUMzQyxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRCx1Q0FBdUM7SUFDdkMsTUFBTTtRQUNKLE9BQU87WUFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFLLElBQUksQ0FBQyxXQUFtQixDQUFDLElBQUk7WUFDaEUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ2hCLENBQUM7SUFDSixDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgMjAxMi0yMDIzIElkZWFCbGFkZSwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gIFxyXG4gKiBVc2UsIHJlcHJvZHVjdGlvbiwgZGlzdHJpYnV0aW9uLCBhbmQgbW9kaWZpY2F0aW9uIG9mIHRoaXMgY29kZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgXHJcbiAqIGNvbmRpdGlvbnMgb2YgdGhlIElkZWFCbGFkZSBCcmVlemUgbGljZW5zZSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJlZXplanMuY29tL2xpY2Vuc2VcclxuICpcclxuICogQXV0aG9yOiBKYXkgVHJhYmFuZFxyXG4gKi9cclxuXHJcbi8qKlxyXG5CYXNlIGNsYXNzIGZvciBhbGwgQnJlZXplIGVudW1lcmF0aW9ucywgc3VjaCBhcyBFbnRpdHlTdGF0ZSwgRGF0YVR5cGUsIEZldGNoU3RyYXRlZ3ksIE1lcmdlU3RyYXRlZ3kgZXRjLlxyXG5BIEJyZWV6ZSBFbnVtIGlzIGEgbmFtZXNwYWNlZCBzZXQgb2YgY29uc3RhbnQgdmFsdWVzLiAgRWFjaCBFbnVtIGNvbnNpc3RzIG9mIGEgZ3JvdXAgb2YgcmVsYXRlZCBjb25zdGFudHMsIGNhbGxlZCAnc3ltYm9scycuXHJcblVubGlrZSBlbnVtcyBpbiBzb21lIG90aGVyIGVudmlyb25tZW50cywgZWFjaCAnc3ltYm9sJyBjYW4gaGF2ZSBib3RoIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMuXHJcbj4gICAgIGNsYXNzIERheU9mV2VlayBleHRlbmRzIEJyZWV6ZUVudW0ge1xyXG4+ICAgICAgIGRheUluZGV4OiBudW1iZXI7XHJcbj4gICAgICAgaXNXZWVrZW5kPzogYm9vbGVhbjtcclxuPiAgICAgICBuZXh0RGF5KCkge1xyXG4+ICAgICAgICAgbGV0IG5leHRJbmRleCA9ICh0aGlzLmRheUluZGV4ICsgMSkgJSA3O1xyXG4+ICAgICAgICAgcmV0dXJuIERheU9mV2Vlay5nZXRTeW1ib2xzKClbbmV4dEluZGV4XTtcclxuPiAgICAgICB9XHJcbj5cclxuPiAgICAgICBzdGF0aWMgTW9uZGF5ID0gbmV3IERheU9mV2VlayggeyBkYXlJbmRleDogMH0pO1xyXG4+ICAgICAgIHN0YXRpYyBUdWVzZGF5ID0gbmV3IERheU9mV2VlayggeyBkYXlJbmRleDogMSB9KTtcclxuPiAgICAgICBzdGF0aWMgV2VkbmVzZGF5ID0gbmV3IERheU9mV2VlayggeyBkYXlJbmRleDogMiB9KTtcclxuPiAgICAgICBzdGF0aWMgVGh1cnNkYXkgPSBuZXcgRGF5T2ZXZWVrKCB7IGRheUluZGV4OiAzIH0pO1xyXG4+ICAgICAgIHN0YXRpYyBGcmlkYXkgPSBuZXcgRGF5T2ZXZWVrKCB7IGRheUluZGV4OiA0IH0pO1xyXG4+ICAgICAgIHN0YXRpYyBTYXR1cmRheSA9IG5ldyBEYXlPZldlZWsoIHsgZGF5SW5kZXg6IDUsIGlzV2Vla2VuZDogdHJ1ZSB9KTtcclxuPiAgICAgICBzdGF0aWMgU3VuZGF5ID0gbmV3IERheU9mV2VlayggeyBkYXlJbmRleDogNiwgaXNXZWVrZW5kOiB0cnVlIH0pO1xyXG4+ICAgICB9XHJcbj5cclxuPiAgICAgZGVzY3JpYmUoXCJEYXlPZldlZWtcIiwgKCkgPT4ge1xyXG4+ICAgICAgIHRlc3QoXCJzaG91bGQgc3VwcG9ydCBmdWxsIGVudW0gY2FwYWJpbGl0aWVzXCIsIGZ1bmN0aW9uKCkge1xyXG4+ICAgICAgICAgLy8gLy8gY3VzdG9tIG1ldGhvZHNcclxuPiAgICAgICAgIGxldCBkb3dTeW1ib2xzID0gRGF5T2ZXZWVrLmdldFN5bWJvbHMoKTtcclxuPiAgICAgICAgIGV4cGVjdChkb3dTeW1ib2xzLmxlbmd0aCkudG9CZSg3KTtcclxuPiAgICAgICAgIGV4cGVjdChEYXlPZldlZWsuTW9uZGF5Lm5leHREYXkoKSkudG9CZShEYXlPZldlZWsuVHVlc2RheSk7XHJcbj4gICAgICAgICBleHBlY3QoRGF5T2ZXZWVrLlN1bmRheS5uZXh0RGF5KCkpLnRvQmUoRGF5T2ZXZWVrLk1vbmRheSk7XHJcbj4gICAgICAgLy8gLy8gY3VzdG9tIHByb3BlcnRpZXNcclxuPiAgICAgICAgIGV4cGVjdChEYXlPZldlZWsuVHVlc2RheS5pc1dlZWtlbmQpLnRvQmUodW5kZWZpbmVkKTtcclxuPiAgICAgICAgIGV4cGVjdChEYXlPZldlZWsuU2F0dXJkYXkuaXNXZWVrZW5kKS50b0JlKHRydWUpO1xyXG4+ICAgICAgIC8vIC8vIFN0YW5kYXJkIGVudW0gY2FwYWJpbGl0aWVzXHJcbj4gICAgICAgICBleHBlY3QoRGF5T2ZXZWVrLlRodXJzZGF5IGluc3RhbmNlb2YgRGF5T2ZXZWVrKS50b0JlKHRydWUpO1xyXG4+ICAgICAgICAgZXhwZWN0KEJyZWV6ZUVudW0uaXNTeW1ib2woRGF5T2ZXZWVrLldlZG5lc2RheSkpLnRvQmUodHJ1ZSk7XHJcbj4gICAgICAgICBleHBlY3QoRGF5T2ZXZWVrLmNvbnRhaW5zKERheU9mV2Vlay5UaHVyc2RheSkpLnRvQmUodHJ1ZSk7XHJcbj4gICAgICAgICBleHBlY3QoRGF5T2ZXZWVrLkZyaWRheS50b1N0cmluZygpKS50b0JlKFwiRnJpZGF5XCIpO1xyXG4+ICAgICAgIH0pO1xyXG4+ICAgfSk7XHJcbk5vdGUgdGhhdCB3ZSBoYXZlIEVycm9yWyd4J10gPSAuLi4gaW4gc29tZSBwbGFjZXMgaW4gdGhlIGNvZGUgdG8gcHJldmVudCBUZXJzZXIgZnJvbSBvcHRpbWl6aW5nIG91dCBzb21lIGltcG9ydGFudCBjYWxscy5cclxuQGR5bmFtaWNcclxuKi9cclxuZXhwb3J0IGNsYXNzIEJyZWV6ZUVudW0ge1xyXG4gIC8vIC8vIFRPRE86IHRoaW5rIGFib3V0IENvbXBvc2l0ZUVudW0gKGZsYWdzIGltcGwpLlxyXG4gIC8qKiBUaGUgbmFtZSBvZiB0aGlzIHN5bWJvbCAqL1xyXG4gIGRlY2xhcmUgbmFtZTogc3RyaW5nO1xyXG4gIC8qKiBUeXBlIG9mIHRoZSBlbnVtOyBzZXQgaW4gcHJvdG90eXBlIG9mIGVhY2ggZW51bSAqL1xyXG4gIGRlY2xhcmUgXyR0eXBlTmFtZTogc3RyaW5nO1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIHN0YXRpYyBfcmVzb2x2ZWROYW1lc0FuZFN5bWJvbHM6IHsgbmFtZTogc3RyaW5nLCBzeW1ib2w6IEJyZWV6ZUVudW0gfVtdO1xyXG5cclxuICAvKiogICovXHJcbiAgY29uc3RydWN0b3IocHJvcGVydGllc09iaj86IE9iamVjdCkge1xyXG4gICAgaWYgKHByb3BlcnRpZXNPYmopIHtcclxuICAgICAgT2JqZWN0LmtleXMocHJvcGVydGllc09iaikuZm9yRWFjaCgoa2V5KSA9PiB0aGlzW2tleV0gPSBwcm9wZXJ0aWVzT2JqW2tleV0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhbGwgb2YgdGhlIHN5bWJvbHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIEVudW0uXHJcbiAgPiAgICAgbGV0IHN5bWJvbHMgPSBEYXlPZldlZWsuZ2V0U3ltYm9scygpO1xyXG4gIEByZXR1cm4gQWxsIG9mIHRoZSBzeW1ib2xzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBFbnVtLlxyXG4gICoqL1xyXG4gIHN0YXRpYyBnZXRTeW1ib2xzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVN5bWJvbHMoKS5tYXAoa3MgPT4ga3Muc3ltYm9sKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCBvZiB0aGUgc3ltYm9scyBjb250YWluZWQgd2l0aGluIHRoaXMgRW51bS5cclxuICA+ICAgICBsZXQgc3ltYm9scyA9IERheU9mV2Vlay5nZXROYW1lcygpO1xyXG4gIEByZXR1cm4gIEFsbCBvZiB0aGUgbmFtZXMgb2YgdGhlIHN5bWJvbHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIEVudW0uXHJcbiAgKiovXHJcbiAgc3RhdGljIGdldE5hbWVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVN5bWJvbHMoKS5tYXAoa3MgPT4ga3MubmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGFuIEVudW0gc3ltYm9sIGdpdmVuIGl0cyBuYW1lLlxyXG4gID4gICAgIGxldCBkYXlPZldlZWsgPSBEYXlPZldlZWsuZnJvbShcIlRodXJzZGF5XCIpO1xyXG4gID4gICAgIC8vIG5vd2RheU9mV2VlayA9PT0gRGF5T2ZXZWVrLlRodXJzZGF5XHJcbiAgQHBhcmFtIG5hbWUgLSBOYW1lIGZvciB3aGljaCBhbiBlbnVtIHN5bWJvbCBzaG91bGQgYmUgcmV0dXJuZWQuXHJcbiAgQHJldHVybiBUaGUgc3ltYm9sIHRoYXQgbWF0Y2hlcyB0aGUgbmFtZSBvciAndW5kZWZpbmVkJyBpZiBub3QgZm91bmQuXHJcbiAgKiovXHJcbiAgc3RhdGljIGZyb21OYW1lKG5hbWU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXNbbmFtZV07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBTZWFscyB0aGlzIGVudW0gc28gdGhhdCBubyBtb3JlIHN5bWJvbHMgbWF5IGJlIGFkZGVkIHRvIGl0LiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBhbGwgc3ltYm9sc1xyXG4gIGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBFbnVtLiBUaGlzIG1ldGhvZCBhbHNvIHNldHMgdGhlICduYW1lJyBwcm9wZXJ0eSBvbiBlYWNoIG9mIHRoZSBzeW1ib2xzLlxyXG4gID4gICAgIERheU9mV2Vlay5yZXNvbHZlU3ltYm9scygpO1xyXG4gICoqL1xyXG4gIHN0YXRpYyByZXNvbHZlU3ltYm9scygpIHtcclxuICAgIGlmICh0aGlzLl9yZXNvbHZlZE5hbWVzQW5kU3ltYm9scykgcmV0dXJuIHRoaXMuX3Jlc29sdmVkTmFtZXNBbmRTeW1ib2xzO1xyXG4gICAgbGV0IHJlc3VsdDoge25hbWU6IHN0cmluZywgc3ltYm9sOiBCcmVlemVFbnVtIH1bXSA9IFtdO1xyXG5cclxuICAgIGZvciAobGV0IGtleSBpbiB0aGlzKSB7XHJcbiAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICBsZXQgc3ltYiA9IHRoaXNba2V5XTtcclxuICAgICAgICBpZiAoc3ltYiBpbnN0YW5jZW9mIEJyZWV6ZUVudW0pIHtcclxuICAgICAgICAgIHJlc3VsdC5wdXNoKCB7IG5hbWU6IGtleSwgc3ltYm9sOiBzeW1iIH0pO1xyXG4gICAgICAgICAgdGhpc1trZXldID0gc3ltYjtcclxuICAgICAgICAgIHN5bWIubmFtZSA9IGtleTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX3Jlc29sdmVkTmFtZXNBbmRTeW1ib2xzID0gcmVzdWx0O1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgd2hldGhlciBhbiBFbnVtIGNvbnRhaW5zIGEgc3BlY2lmaWVkIHN5bWJvbC5cclxuICA+ICAgICBsZXQgc3ltYm9sID0gRGF5T2ZXZWVrLkZyaWRheTtcclxuICA+ICAgICBpZiAoRGF5T2ZXZWVrLmNvbnRhaW5zKHN5bWJvbCkpIHtcclxuICA+ICAgICAgICAgLy8gZG8gc29tZXRoaW5nXHJcbiAgPiAgICAgfVxyXG4gIEBwYXJhbSBzeW0gLSBPYmplY3Qgb3Igc3ltYm9sIHRvIHRlc3QuXHJcbiAgQHJldHVybiBXaGV0aGVyIHRoaXMgRW51bSBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN5bWJvbC5cclxuICAqKi9cclxuICBzdGF0aWMgY29udGFpbnMoc3ltOiBCcmVlemVFbnVtKSB7XHJcbiAgICBpZiAoIShzeW0gaW5zdGFuY2VvZiBCcmVlemVFbnVtKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXNbc3ltLm5hbWVdICE9IG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gLyoqXHJcbiAgLy8gQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhbiBFbnVtICdzeW1ib2wnLiBVc2UgdGhlICdjb250YWlucycgbWV0aG9kIGluc3RlYWQgb2YgdGhpcyBvbmUgXHJcbiAgLy8gaWYgeW91IHdhbnQgdG8gdGVzdCBmb3IgYSBzcGVjaWZpYyBFbnVtLiBcclxuICAvLyA+ICAgICBpZiAoRW51bS5pc1N5bWJvbChEYXlPZldlZWsuV2VkbmVzZGF5KSkge1xyXG4gIC8vID4gICAgICAgLy8gZG8gc29tZXRoaW5nIC4uLlxyXG4gIC8vID4gICAgIH07XHJcbiAgLy8gKiovXHJcbiAgLy8gc3RhdGljIGlzU3ltYm9sKG9iajogYW55KSB7XHJcbiAgLy8gICByZXR1cm4gb2JqIGluc3RhbmNlb2YgQnJlZXplRW51bTtcclxuICAvLyB9O1xyXG5cclxuICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIG5hbWUgb2YgdGhpcyBFbnVtICovXHJcbiAgdG9TdHJpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybiBlbnVtIG5hbWUgYW5kIHN5bWJvbCBuYW1lICovXHJcbiAgdG9KU09OKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgXyR0eXBlTmFtZTogdGhpc1snXyR0eXBlTmFtZSddIHx8ICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkubmFtZSxcclxuICAgICAgbmFtZTogdGhpcy5uYW1lXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG4iXX0=