UNPKG

breeze-client

Version:

Breeze data management for JavaScript clients

110 lines (109 loc) 14.5 kB
import { EntityKey } from './entity-key'; import { config } from './config'; /* @class KeyGenerator */ export class KeyGenerator { /** @hidden @internal */ _tempIdMap; constructor() { // key is dataProperty.name + || + entityType.name, value is propEntry // propEntry = { entityType, propertyName, keyMap } // keyMap has key of the actual value ( as a string) and a value of null or the real id. this._tempIdMap = {}; } /* Returns a unique 'temporary' id for the specified [[EntityType]]. Uniqueness is defined for this purpose as being unique within each instance of a KeyGenerator. This is sufficient because each EntityManager will have its own instance of a KeyGenerator and any entities imported into the EntityManager with temporary keys will have them regenerated and remapped on import. The return value of this method must be of the correct type as determined by the keyProperties of the specified EntityType @example // Assume em1 is a preexisting EntityManager let custType = em1.metadataStore.getEntityType("Customer"); let cust1 = custType.createEntity(); // next line both sets cust1's 'CustomerId' property but also returns the value let cid1 = em1.generateTempKeyValue(cust1); em1.saveChanges().then( function( data) { let sameCust1 = data.results[0]; // cust1 === sameCust1; // but cust1.getProperty("CustomerId") != cid1 // because the server will have generated a new id // and the client will have been updated with this // new id. }); @method generateTempKeyValue @param entityType {EntityType} */ generateTempKeyValue(entityType, valueIfAvail) { let keyProps = entityType.keyProperties; if (keyProps.length > 1) { throw new Error("Ids can not be autogenerated for entities with multipart keys"); } let keyProp = keyProps[0]; let propEntry = this._getPropEntry(keyProp, true); let nextId; if (valueIfAvail != null) { if (!propEntry.keyMap[valueIfAvail.toString()]) { nextId = valueIfAvail; } } if (nextId === undefined) { let dataType = keyProp.dataType; let getNextFn = dataType.getNext; if (getNextFn) { nextId = getNextFn(this); // need to watch out for collision with previously imported ids that might also get generated. while (propEntry.keyMap[nextId.toString()] != null) { nextId = getNextFn(this); } } else { throw new Error("Cannot use a property with a dataType of: " + dataType.toString() + " for id generation"); } } propEntry.keyMap[nextId.toString()] = true; return nextId; } getTempKeys() { let results = []; //noinspection JSHint for (let key in this._tempIdMap) { let propEntry = this._tempIdMap[key]; let entityType = propEntry.entityType; // let propName = propEntry.propertyName; //noinspection JSHint for (let keyValue in propEntry.keyMap) { results.push(new EntityKey(entityType, [keyValue])); } } return results; } // proto methods below are not part of the KeyGenerator interface. isTempKey(entityKey) { let keyProps = entityKey.entityType.keyProperties; if (keyProps.length > 1) return false; let keyProp = keyProps[0]; let propEntry = this._getPropEntry(keyProp); if (!propEntry) { return false; } return (propEntry.keyMap[entityKey.values[0].toString()] !== undefined); } /** @hidden @internal */ _getPropEntry(keyProp, createIfMissing = false) { let key = keyProp.name + ".." + keyProp.parentType.name; let propEntry = this._tempIdMap[key]; if (!propEntry) { if (createIfMissing) { propEntry = { entityType: keyProp.parentType, propertyName: keyProp.name, keyMap: {} }; this._tempIdMap[key] = propEntry; } } return propEntry; } } config.registerType(KeyGenerator, "KeyGenerator"); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9rZXktZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQVlsQzs7SUFFSTtBQUNKLE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLHdCQUF3QjtJQUNoQixVQUFVLENBQWE7SUFHL0I7UUFDRSxzRUFBc0U7UUFDdEUsbURBQW1EO1FBQ25ELHdGQUF3RjtRQUN4RixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBR0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQXdCRTtJQUNGLG9CQUFvQixDQUFDLFVBQXNCLEVBQUUsWUFBc0I7UUFDakUsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUN4QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQztTQUNsRjtRQUNELElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRCxJQUFJLE1BQVcsQ0FBQztRQUNoQixJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUU7Z0JBQzlDLE1BQU0sR0FBRyxZQUFZLENBQUM7YUFDdkI7U0FDRjtRQUVELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN4QixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ2hDLElBQUksU0FBUyxHQUFJLFFBQWdCLENBQUMsT0FBTyxDQUFDO1lBQzFDLElBQUksU0FBUyxFQUFFO2dCQUNiLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLDhGQUE4RjtnQkFDOUYsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRTtvQkFDbEQsTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDMUI7YUFDRjtpQkFBTTtnQkFDTCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDO2FBQzVHO1NBQ0Y7UUFFRCxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMzQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksT0FBTyxHQUFnQixFQUFFLENBQUM7UUFDOUIscUJBQXFCO1FBQ3JCLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUMvQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDdEMseUNBQXlDO1lBQ3pDLHFCQUFxQjtZQUNyQixLQUFLLElBQUksUUFBUSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JEO1NBQ0Y7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBR0Qsa0VBQWtFO0lBRWxFLFNBQVMsQ0FBQyxTQUFvQjtRQUM1QixJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUNsRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3RDLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCx3QkFBd0I7SUFDaEIsYUFBYSxDQUFDLE9BQXFCLEVBQUUsZUFBZSxHQUFHLEtBQUs7UUFDbEUsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDeEQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLFNBQVMsR0FBRyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBd0IsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBQ3JHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDO2FBQ2xDO1NBQ0Y7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBRUY7QUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eVR5cGUsIERhdGFQcm9wZXJ0eSB9IGZyb20gJy4vZW50aXR5LW1ldGFkYXRhJztcclxuaW1wb3J0IHsgRW50aXR5S2V5IH0gZnJvbSAnLi9lbnRpdHkta2V5JztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xyXG5cclxuaW50ZXJmYWNlIElQcm9wRW50cnkge1xyXG4gIGVudGl0eVR5cGU6IEVudGl0eVR5cGU7XHJcbiAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XHJcbiAga2V5TWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVRlbXBJZE1hcCB7XHJcbiAgW2luZGV4OiBzdHJpbmddOiBJUHJvcEVudHJ5O1xyXG59XHJcblxyXG4vKlxyXG4gIEBjbGFzcyBLZXlHZW5lcmF0b3JcclxuICAqL1xyXG5leHBvcnQgY2xhc3MgS2V5R2VuZXJhdG9yIHtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBwcml2YXRlIF90ZW1wSWRNYXA6IElUZW1wSWRNYXA7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIC8vIGtleSBpcyBkYXRhUHJvcGVydHkubmFtZSArIHx8ICsgZW50aXR5VHlwZS5uYW1lLCB2YWx1ZSBpcyBwcm9wRW50cnlcclxuICAgIC8vIHByb3BFbnRyeSA9IHsgZW50aXR5VHlwZSwgcHJvcGVydHlOYW1lLCBrZXlNYXAgfVxyXG4gICAgLy8ga2V5TWFwIGhhcyBrZXkgb2YgdGhlIGFjdHVhbCB2YWx1ZSAoIGFzIGEgc3RyaW5nKSBhbmQgYSB2YWx1ZSBvZiBudWxsIG9yIHRoZSByZWFsIGlkLlxyXG4gICAgdGhpcy5fdGVtcElkTWFwID0ge307XHJcbiAgfVxyXG5cclxuXHJcbiAgLypcclxuICBSZXR1cm5zIGEgdW5pcXVlICd0ZW1wb3JhcnknIGlkIGZvciB0aGUgc3BlY2lmaWVkIFtbRW50aXR5VHlwZV1dLlxyXG4gIFVuaXF1ZW5lc3MgaXMgZGVmaW5lZCBmb3IgdGhpcyBwdXJwb3NlIGFzIGJlaW5nIHVuaXF1ZSB3aXRoaW4gZWFjaCBpbnN0YW5jZSBvZiBhIEtleUdlbmVyYXRvci4gVGhpcyBpcyBzdWZmaWNpZW50XHJcbiAgYmVjYXVzZSBlYWNoIEVudGl0eU1hbmFnZXIgd2lsbCBoYXZlIGl0cyBvd24gaW5zdGFuY2Ugb2YgYSBLZXlHZW5lcmF0b3IgYW5kIGFueSBlbnRpdGllcyBpbXBvcnRlZCBpbnRvXHJcbiAgdGhlIEVudGl0eU1hbmFnZXIgd2l0aCB0ZW1wb3Jhcnkga2V5cyB3aWxsIGhhdmUgdGhlbSByZWdlbmVyYXRlZCBhbmQgcmVtYXBwZWQgb24gaW1wb3J0LlxyXG5cclxuICBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgbWV0aG9kIG11c3QgYmUgb2YgdGhlIGNvcnJlY3QgdHlwZSBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBrZXlQcm9wZXJ0aWVzIG9mIHRoZVxyXG4gIHNwZWNpZmllZCBFbnRpdHlUeXBlXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXJcclxuICAgICAgbGV0IGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICBsZXQgY3VzdDEgPSBjdXN0VHlwZS5jcmVhdGVFbnRpdHkoKTtcclxuICAgICAgLy8gbmV4dCBsaW5lIGJvdGggc2V0cyBjdXN0MSdzICdDdXN0b21lcklkJyBwcm9wZXJ0eSBidXQgYWxzbyByZXR1cm5zIHRoZSB2YWx1ZVxyXG4gICAgICBsZXQgY2lkMSA9IGVtMS5nZW5lcmF0ZVRlbXBLZXlWYWx1ZShjdXN0MSk7XHJcbiAgICAgIGVtMS5zYXZlQ2hhbmdlcygpLnRoZW4oIGZ1bmN0aW9uKCBkYXRhKSB7XHJcbiAgICAgICAgbGV0IHNhbWVDdXN0MSA9IGRhdGEucmVzdWx0c1swXTtcclxuICAgICAgICAvLyBjdXN0MSA9PT0gc2FtZUN1c3QxO1xyXG4gICAgICAgIC8vIGJ1dCBjdXN0MS5nZXRQcm9wZXJ0eShcIkN1c3RvbWVySWRcIikgIT0gY2lkMVxyXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIHNlcnZlciB3aWxsIGhhdmUgZ2VuZXJhdGVkIGEgbmV3IGlkXHJcbiAgICAgICAgLy8gYW5kIHRoZSBjbGllbnQgd2lsbCBoYXZlIGJlZW4gdXBkYXRlZCB3aXRoIHRoaXNcclxuICAgICAgICAvLyBuZXcgaWQuXHJcbiAgICAgIH0pO1xyXG4gIEBtZXRob2QgZ2VuZXJhdGVUZW1wS2V5VmFsdWVcclxuICBAcGFyYW0gZW50aXR5VHlwZSB7RW50aXR5VHlwZX1cclxuICAqL1xyXG4gIGdlbmVyYXRlVGVtcEtleVZhbHVlKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIHZhbHVlSWZBdmFpbD86IGJvb2xlYW4pIHtcclxuICAgIGxldCBrZXlQcm9wcyA9IGVudGl0eVR5cGUua2V5UHJvcGVydGllcztcclxuICAgIGlmIChrZXlQcm9wcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIklkcyBjYW4gbm90IGJlIGF1dG9nZW5lcmF0ZWQgZm9yIGVudGl0aWVzIHdpdGggbXVsdGlwYXJ0IGtleXNcIik7XHJcbiAgICB9XHJcbiAgICBsZXQga2V5UHJvcCA9IGtleVByb3BzWzBdO1xyXG4gICAgbGV0IHByb3BFbnRyeSA9IHRoaXMuX2dldFByb3BFbnRyeShrZXlQcm9wLCB0cnVlKTtcclxuICAgIGxldCBuZXh0SWQ6IGFueTtcclxuICAgIGlmICh2YWx1ZUlmQXZhaWwgIT0gbnVsbCkge1xyXG4gICAgICBpZiAoIXByb3BFbnRyeS5rZXlNYXBbdmFsdWVJZkF2YWlsLnRvU3RyaW5nKCldKSB7XHJcbiAgICAgICAgbmV4dElkID0gdmFsdWVJZkF2YWlsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5leHRJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCBkYXRhVHlwZSA9IGtleVByb3AuZGF0YVR5cGU7XHJcbiAgICAgIGxldCBnZXROZXh0Rm4gPSAoZGF0YVR5cGUgYXMgYW55KS5nZXROZXh0O1xyXG4gICAgICBpZiAoZ2V0TmV4dEZuKSB7XHJcbiAgICAgICAgbmV4dElkID0gZ2V0TmV4dEZuKHRoaXMpO1xyXG4gICAgICAgIC8vIG5lZWQgdG8gd2F0Y2ggb3V0IGZvciBjb2xsaXNpb24gd2l0aCBwcmV2aW91c2x5IGltcG9ydGVkIGlkcyB0aGF0IG1pZ2h0IGFsc28gZ2V0IGdlbmVyYXRlZC5cclxuICAgICAgICB3aGlsZSAocHJvcEVudHJ5LmtleU1hcFtuZXh0SWQudG9TdHJpbmcoKV0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgbmV4dElkID0gZ2V0TmV4dEZuKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdXNlIGEgcHJvcGVydHkgd2l0aCBhIGRhdGFUeXBlIG9mOiBcIiArIGRhdGFUeXBlLnRvU3RyaW5nKCkgKyBcIiBmb3IgaWQgZ2VuZXJhdGlvblwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3BFbnRyeS5rZXlNYXBbbmV4dElkLnRvU3RyaW5nKCldID0gdHJ1ZTtcclxuICAgIHJldHVybiBuZXh0SWQ7XHJcbiAgfVxyXG5cclxuICBnZXRUZW1wS2V5cygpIHtcclxuICAgIGxldCByZXN1bHRzOiBFbnRpdHlLZXlbXSA9IFtdO1xyXG4gICAgLy9ub2luc3BlY3Rpb24gSlNIaW50XHJcbiAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5fdGVtcElkTWFwKSB7XHJcbiAgICAgIGxldCBwcm9wRW50cnkgPSB0aGlzLl90ZW1wSWRNYXBba2V5XTtcclxuICAgICAgbGV0IGVudGl0eVR5cGUgPSBwcm9wRW50cnkuZW50aXR5VHlwZTtcclxuICAgICAgLy8gbGV0IHByb3BOYW1lID0gcHJvcEVudHJ5LnByb3BlcnR5TmFtZTtcclxuICAgICAgLy9ub2luc3BlY3Rpb24gSlNIaW50XHJcbiAgICAgIGZvciAobGV0IGtleVZhbHVlIGluIHByb3BFbnRyeS5rZXlNYXApIHtcclxuICAgICAgICByZXN1bHRzLnB1c2gobmV3IEVudGl0eUtleShlbnRpdHlUeXBlLCBba2V5VmFsdWVdKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIHByb3RvIG1ldGhvZHMgYmVsb3cgYXJlIG5vdCBwYXJ0IG9mIHRoZSBLZXlHZW5lcmF0b3IgaW50ZXJmYWNlLlxyXG5cclxuICBpc1RlbXBLZXkoZW50aXR5S2V5OiBFbnRpdHlLZXkpIHtcclxuICAgIGxldCBrZXlQcm9wcyA9IGVudGl0eUtleS5lbnRpdHlUeXBlLmtleVByb3BlcnRpZXM7XHJcbiAgICBpZiAoa2V5UHJvcHMubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IGtleVByb3AgPSBrZXlQcm9wc1swXTtcclxuICAgIGxldCBwcm9wRW50cnkgPSB0aGlzLl9nZXRQcm9wRW50cnkoa2V5UHJvcCk7XHJcbiAgICBpZiAoIXByb3BFbnRyeSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKHByb3BFbnRyeS5rZXlNYXBbZW50aXR5S2V5LnZhbHVlc1swXS50b1N0cmluZygpXSAhPT0gdW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIHByaXZhdGUgX2dldFByb3BFbnRyeShrZXlQcm9wOiBEYXRhUHJvcGVydHksIGNyZWF0ZUlmTWlzc2luZyA9IGZhbHNlKSB7XHJcbiAgICBsZXQga2V5ID0ga2V5UHJvcC5uYW1lICsgXCIuLlwiICsga2V5UHJvcC5wYXJlbnRUeXBlLm5hbWU7XHJcbiAgICBsZXQgcHJvcEVudHJ5ID0gdGhpcy5fdGVtcElkTWFwW2tleV07XHJcbiAgICBpZiAoIXByb3BFbnRyeSkge1xyXG4gICAgICBpZiAoY3JlYXRlSWZNaXNzaW5nKSB7XHJcbiAgICAgICAgcHJvcEVudHJ5ID0geyBlbnRpdHlUeXBlOiBrZXlQcm9wLnBhcmVudFR5cGUgYXMgRW50aXR5VHlwZSwgcHJvcGVydHlOYW1lOiBrZXlQcm9wLm5hbWUsIGtleU1hcDoge30gfTtcclxuICAgICAgICB0aGlzLl90ZW1wSWRNYXBba2V5XSA9IHByb3BFbnRyeTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByb3BFbnRyeTtcclxuICB9XHJcblxyXG59XHJcblxyXG5jb25maWcucmVnaXN0ZXJUeXBlKEtleUdlbmVyYXRvciwgXCJLZXlHZW5lcmF0b3JcIik7XHJcblxyXG4iXX0=