angular-simple-oidc
Version:
Angular Library implementing Open Id Connect specification. Code Flow, Refresh Tokens, Session Management, Discovery Document.
103 lines • 17.1 kB
JavaScript
import { Injectable, Inject } from '@angular/core';
import { TokenStorageKeys } from 'angular-simple-oidc/core';
import { of, BehaviorSubject } from 'rxjs';
import { LOCAL_STORAGE_REF } from './providers';
// @dynamic
export class TokenStorageService {
constructor(localStorage) {
this.localStorage = localStorage;
this.localStateSubject = new BehaviorSubject(this.getCurrentLocalState());
}
get currentState$() {
return this.localStateSubject.asObservable();
}
get storage() {
return this.localStorage;
}
storePreAuthorizationState(authState) {
this.storage.setItem(TokenStorageKeys.Nonce, authState.nonce);
this.storage.setItem(TokenStorageKeys.State, authState.state);
this.storage.setItem(TokenStorageKeys.CodeVerifier, authState.codeVerifier);
this.storage.setItem(TokenStorageKeys.PreRedirectUrl, authState.preRedirectUrl);
const state = this.getCurrentLocalState();
this.localStateSubject.next(state);
return of(state);
}
clearPreAuthorizationState() {
this.storage.removeItem(TokenStorageKeys.Nonce);
this.storage.removeItem(TokenStorageKeys.State);
this.storage.removeItem(TokenStorageKeys.CodeVerifier);
this.storage.removeItem(TokenStorageKeys.PreRedirectUrl);
const state = this.getCurrentLocalState();
this.localStateSubject.next(state);
return of(state);
}
storeAuthorizationCode(authorizationCode, sessionState) {
this.storage.setItem(TokenStorageKeys.AuthorizationCode, authorizationCode);
if (sessionState) {
this.storage.setItem(TokenStorageKeys.SessionState, sessionState);
}
const state = this.getCurrentLocalState();
this.localStateSubject.next(state);
return of(state);
}
storeOriginalIdToken(idToken) {
this.storage.setItem(TokenStorageKeys.OriginalIdentityToken, idToken);
const state = this.getCurrentLocalState();
this.localStateSubject.next(state);
return of(state);
}
storeTokens(tokens) {
this.storage.setItem(TokenStorageKeys.IdentityToken, tokens.idToken);
this.storeJSON(TokenStorageKeys.IdentityTokenDecoded, tokens.decodedIdToken);
this.storage.setItem(TokenStorageKeys.AccessToken, tokens.accessToken);
if (tokens.accessTokenExpiresAt) {
this.storage.setItem(TokenStorageKeys.AccessTokenExpiration, tokens.accessTokenExpiresAt.toString());
}
if (tokens.refreshToken) {
this.storage.setItem(TokenStorageKeys.RefreshToken, tokens.refreshToken);
}
const state = this.getCurrentLocalState();
this.localStateSubject.next(state);
return of(state);
}
removeAll() {
for (const k of Object.keys(TokenStorageKeys)) {
// We can't use clear since we could
// potentially delete keys which are not owned by us
this.storage.removeItem(TokenStorageKeys[k]);
}
return of(this.getCurrentLocalState());
}
getCurrentLocalState() {
const state = {
nonce: this.storage.getItem(TokenStorageKeys.Nonce),
state: this.storage.getItem(TokenStorageKeys.State),
codeVerifier: this.storage.getItem(TokenStorageKeys.CodeVerifier),
authorizationCode: this.storage.getItem(TokenStorageKeys.AuthorizationCode),
sessionState: this.storage.getItem(TokenStorageKeys.SessionState),
identityToken: this.storage.getItem(TokenStorageKeys.IdentityToken),
originalIdentityToken: this.storage.getItem(TokenStorageKeys.OriginalIdentityToken),
accessToken: this.storage.getItem(TokenStorageKeys.AccessToken),
accessTokenExpiration: parseInt(this.storage.getItem(TokenStorageKeys.AccessTokenExpiration), 10),
refreshToken: this.storage.getItem(TokenStorageKeys.RefreshToken),
preRedirectUrl: this.storage.getItem(TokenStorageKeys.PreRedirectUrl),
decodedIdentityToken: this.readJSON(TokenStorageKeys.IdentityTokenDecoded)
};
return state;
}
storeJSON(key, obj) {
this.storage.setItem(key, JSON.stringify(obj));
}
readJSON(key) {
const json = this.storage.getItem(key);
return json ? JSON.parse(json) : null;
}
}
TokenStorageService.decorators = [
{ type: Injectable }
];
TokenStorageService.ctorParameters = () => [
{ type: Storage, decorators: [{ type: Inject, args: [LOCAL_STORAGE_REF,] }] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1zaW1wbGUtb2lkYy9zcmMvbGliL3Rva2VuLXN0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0gsZ0JBQWdCLEVBSW5CLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWhELFdBQVc7QUFFWCxNQUFNLE9BQU8sbUJBQW1CO0lBWTVCLFlBRXFCLFlBQXFCO1FBQXJCLGlCQUFZLEdBQVosWUFBWSxDQUFTO1FBSnZCLHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUFhLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7SUFLaEcsQ0FBQztJQWJMLElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBYyxPQUFPO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDO0lBU00sMEJBQTBCLENBQUMsU0FLakM7UUFDRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLFNBQVMs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QUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQztZQUMvRCxxQkFBcUIsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakcsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQztZQUNqRSxjQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDO1lBQ3JFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxRQUFRLENBQXVCLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDO1NBQ25HLENBQUM7UUFDRixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRVMsU0FBUyxDQUFJLEdBQVcsRUFBRSxHQUFNO1FBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVTLFFBQVEsQ0FBSSxHQUFXO1FBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0MsQ0FBQzs7O1lBbkhKLFVBQVU7OztZQWU0QixPQUFPLHVCQURyQyxNQUFNLFNBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIFRva2VuU3RvcmFnZUtleXMsXG4gICAgTG9jYWxTdGF0ZSxcbiAgICBUb2tlblJlcXVlc3RSZXN1bHQsXG4gICAgRGVjb2RlZElkZW50aXR5VG9rZW5cbn0gZnJvbSAnYW5ndWxhci1zaW1wbGUtb2lkYy9jb3JlJztcbmltcG9ydCB7IG9mLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExPQ0FMX1NUT1JBR0VfUkVGIH0gZnJvbSAnLi9wcm92aWRlcnMnO1xuXG4vLyBAZHluYW1pY1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRva2VuU3RvcmFnZVNlcnZpY2Uge1xuXG4gICAgcHVibGljIGdldCBjdXJyZW50U3RhdGUkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbFN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IHN0b3JhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsU3RvcmFnZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9jYWxTdGF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PExvY2FsU3RhdGU+KHRoaXMuZ2V0Q3VycmVudExvY2FsU3RhdGUoKSk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChMT0NBTF9TVE9SQUdFX1JFRilcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFN0b3JhZ2U6IFN0b3JhZ2UsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdG9yZVByZUF1dGhvcml6YXRpb25TdGF0ZShhdXRoU3RhdGU6IHtcbiAgICAgICAgbm9uY2U6IHN0cmluZyxcbiAgICAgICAgc3RhdGU6IHN0cmluZyxcbiAgICAgICAgY29kZVZlcmlmaWVyOiBzdHJpbmcsXG4gICAgICAgIHByZVJlZGlyZWN0VXJsOiBzdHJpbmcsXG4gICAgfSkge1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShUb2tlblN0b3JhZ2VLZXlzLk5vbmNlLCBhdXRoU3RhdGUubm9uY2UpO1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShUb2tlblN0b3JhZ2VLZXlzLlN0YXRlLCBhdXRoU3RhdGUuc3RhdGUpO1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShUb2tlblN0b3JhZ2VLZXlzLkNvZGVWZXJpZmllciwgYXV0aFN0YXRlLmNvZGVWZXJpZmllcik7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKFRva2VuU3RvcmFnZUtleXMuUHJlUmVkaXJlY3RVcmwsIGF1dGhTdGF0ZS5wcmVSZWRpcmVjdFVybCk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRDdXJyZW50TG9jYWxTdGF0ZSgpO1xuICAgICAgICB0aGlzLmxvY2FsU3RhdGVTdWJqZWN0Lm5leHQoc3RhdGUpO1xuICAgICAgICByZXR1cm4gb2Yoc3RhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhclByZUF1dGhvcml6YXRpb25TdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oVG9rZW5TdG9yYWdlS2V5cy5Ob25jZSk7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKFRva2VuU3RvcmFnZUtleXMuU3RhdGUpO1xuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShUb2tlblN0b3JhZ2VLZXlzLkNvZGVWZXJpZmllcik7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKFRva2VuU3RvcmFnZUtleXMuUHJlUmVkaXJlY3RVcmwpO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudExvY2FsU3RhdGUoKTtcbiAgICAgICAgdGhpcy5sb2NhbFN0YXRlU3ViamVjdC5uZXh0KHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIG9mKHN0YXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcmVBdXRob3JpemF0aW9uQ29kZShhdXRob3JpemF0aW9uQ29kZTogc3RyaW5nLCBzZXNzaW9uU3RhdGU/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oVG9rZW5TdG9yYWdlS2V5cy5BdXRob3JpemF0aW9uQ29kZSwgYXV0aG9yaXphdGlvbkNvZGUpO1xuXG4gICAgICAgIGlmIChzZXNzaW9uU3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKFRva2VuU3RvcmFnZUtleXMuU2Vzc2lvblN0YXRlLCBzZXNzaW9uU3RhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnRMb2NhbFN0YXRlKCk7XG4gICAgICAgIHRoaXMubG9jYWxTdGF0ZVN1YmplY3QubmV4dChzdGF0ZSk7XG4gICAgICAgIHJldHVybiBvZihzdGF0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0b3JlT3JpZ2luYWxJZFRva2VuKGlkVG9rZW46IHN0cmluZykge1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShUb2tlblN0b3JhZ2VLZXlzLk9yaWdpbmFsSWRlbnRpdHlUb2tlbiwgaWRUb2tlbik7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRDdXJyZW50TG9jYWxTdGF0ZSgpO1xuICAgICAgICB0aGlzLmxvY2FsU3RhdGVTdWJqZWN0Lm5leHQoc3RhdGUpO1xuICAgICAgICByZXR1cm4gb2Yoc3RhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdG9yZVRva2Vucyh0b2tlbnM6IFRva2VuUmVxdWVzdFJlc3VsdCkge1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShUb2tlblN0b3JhZ2VLZXlzLklkZW50aXR5VG9rZW4sIHRva2Vucy5pZFRva2VuKTtcbiAgICAgICAgdGhpcy5zdG9yZUpTT04oVG9rZW5TdG9yYWdlS2V5cy5JZGVudGl0eVRva2VuRGVjb2RlZCwgdG9rZW5zLmRlY29kZWRJZFRva2VuKTtcblxuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShUb2tlblN0b3JhZ2VLZXlzLkFjY2Vzc1Rva2VuLCB0b2tlbnMuYWNjZXNzVG9rZW4pO1xuICAgICAgICBpZiAodG9rZW5zLmFjY2Vzc1Rva2VuRXhwaXJlc0F0KSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShUb2tlblN0b3JhZ2VLZXlzLkFjY2Vzc1Rva2VuRXhwaXJhdGlvbixcbiAgICAgICAgICAgICAgICB0b2tlbnMuYWNjZXNzVG9rZW5FeHBpcmVzQXQudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW5zLnJlZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oVG9rZW5TdG9yYWdlS2V5cy5SZWZyZXNoVG9rZW4sIHRva2Vucy5yZWZyZXNoVG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnRMb2NhbFN0YXRlKCk7XG4gICAgICAgIHRoaXMubG9jYWxTdGF0ZVN1YmplY3QubmV4dChzdGF0ZSk7XG4gICAgICAgIHJldHVybiBvZihzdGF0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUFsbCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKFRva2VuU3RvcmFnZUtleXMpKSB7XG4gICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgY2xlYXIgc2luY2Ugd2UgY291bGRcbiAgICAgICAgICAgIC8vIHBvdGVudGlhbGx5IGRlbGV0ZSBrZXlzIHdoaWNoIGFyZSBub3Qgb3duZWQgYnkgdXNcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKFRva2VuU3RvcmFnZUtleXNba10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZih0aGlzLmdldEN1cnJlbnRMb2NhbFN0YXRlKCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRDdXJyZW50TG9jYWxTdGF0ZSgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGU6IExvY2FsU3RhdGUgPSB7XG4gICAgICAgICAgICBub25jZTogdGhpcy5zdG9yYWdlLmdldEl0ZW0oVG9rZW5TdG9yYWdlS2V5cy5Ob25jZSksXG4gICAgICAgICAgICBzdGF0ZTogdGhpcy5zdG9yYWdlLmdldEl0ZW0oVG9rZW5TdG9yYWdlS2V5cy5TdGF0ZSksXG4gICAgICAgICAgICBjb2RlVmVyaWZpZXI6IHRoaXMuc3RvcmFnZS5nZXRJdGVtKFRva2VuU3RvcmFnZUtleXMuQ29kZVZlcmlmaWVyKSxcbiAgICAgICAgICAgIGF1dGhvcml6YXRpb25Db2RlOiB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShUb2tlblN0b3JhZ2VLZXlzLkF1dGhvcml6YXRpb25Db2RlKSxcbiAgICAgICAgICAgIHNlc3Npb25TdGF0ZTogdGhpcy5zdG9yYWdlLmdldEl0ZW0oVG9rZW5TdG9yYWdlS2V5cy5TZXNzaW9uU3RhdGUpLFxuICAgICAgICAgICAgaWRlbnRpdHlUb2tlbjogdGhpcy5zdG9yYWdlLmdldEl0ZW0oVG9rZW5TdG9yYWdlS2V5cy5JZGVudGl0eVRva2VuKSxcbiAgICAgICAgICAgIG9yaWdpbmFsSWRlbnRpdHlUb2tlbjogdGhpcy5zdG9yYWdlLmdldEl0ZW0oVG9rZW5TdG9yYWdlS2V5cy5PcmlnaW5hbElkZW50aXR5VG9rZW4pLFxuICAgICAgICAgICAgYWNjZXNzVG9rZW46IHRoaXMuc3RvcmFnZS5nZXRJdGVtKFRva2VuU3RvcmFnZUtleXMuQWNjZXNzVG9rZW4pLFxuICAgICAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmF0aW9uOiBwYXJzZUludCh0aGlzLnN0b3JhZ2UuZ2V0SXRlbShUb2tlblN0b3JhZ2VLZXlzLkFjY2Vzc1Rva2VuRXhwaXJhdGlvbiksIDEwKSxcbiAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogdGhpcy5zdG9yYWdlLmdldEl0ZW0oVG9rZW5TdG9yYWdlS2V5cy5SZWZyZXNoVG9rZW4pLFxuICAgICAgICAgICAgcHJlUmVkaXJlY3RVcmw6IHRoaXMuc3RvcmFnZS5nZXRJdGVtKFRva2VuU3RvcmFnZUtleXMuUHJlUmVkaXJlY3RVcmwpLFxuICAgICAgICAgICAgZGVjb2RlZElkZW50aXR5VG9rZW46IHRoaXMucmVhZEpTT048RGVjb2RlZElkZW50aXR5VG9rZW4+KFRva2VuU3RvcmFnZUtleXMuSWRlbnRpdHlUb2tlbkRlY29kZWQpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RvcmVKU09OPFQ+KGtleTogc3RyaW5nLCBvYmo6IFQpIHtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZEpTT048VD4oa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICAgIHJldHVybiBqc29uID8gSlNPTi5wYXJzZShqc29uKSBhcyBUIDogbnVsbDtcbiAgICB9XG59XG4iXX0=