@ebondu/angular2-keycloak
Version:
182 lines • 23.8 kB
JavaScript
/*
* Copyright 2018 ebondu and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Cordova adapter for hybrid apps.
*/
export class CordovaAdapter {
keycloak;
constructor(keycloak) {
this.keycloak = keycloak;
}
login(options) {
// let promise = Keycloak.createPromise();
let o = 'location=no';
if (options && options.prompt === 'none') {
o += ',hidden=yes';
}
const loginUrl = this.keycloak.createLoginUrl(options);
// console.log('opening login frame from cordova: ' + loginUrl);
if (!window.cordova) {
throw new Error('Cannot authenticate via a web browser');
}
if (!window.cordova.InAppBrowser || !window.cordova.plugins.browsertab) {
throw new Error('The Apache Cordova InAppBrowser/BrowserTab plugins was not found and are required');
}
let ref;
// let ref = window.cordova.InAppBrowser.open(loginUrl, '_blank', o);
// let ref = window.cordova.InAppBrowser.open(loginUrl, '_system', o);
let completed = false;
window.cordova.plugins.browsertab.themeable.isAvailable(function (result) {
if (!result) {
ref = window.cordova.InAppBrowser.open(loginUrl, '_system');
ref.addEventListener('loadstart', function (event) {
if (event.url.indexOf('http://localhost') === 0) {
const callback = this.keycloak.parseCallback(event.url);
this.keycloak.processCallback(callback).subscribe(processed => {
ref.close();
completed = true;
});
}
});
ref.addEventListener('loaderror', function (event) {
if (!completed) {
if (event.url.indexOf('http://localhost') === 0) {
const callback = this.keycloak.parseCallback(event.url);
this.keycloak.processCallback(callback).subscribe(processed => {
this.closeBrowserTab();
// ref.close();
// completed = true;
});
}
else {
this.closeBrowserTab();
// ref.close();
}
}
});
}
else {
this.openBrowserTab(loginUrl, options);
}
}, function (isAvailableError) {
console.error('failed to query availability of in-app browser tab');
});
}
closeBrowserTab() {
const cordova = window.cordova;
cordova.plugins.browsertab.themeable.close();
// completed = true;
}
logout(options) {
const cordova = window.cordova;
const logoutUrl = this.keycloak.createLogoutUrl(options);
let ref;
let error;
cordova.plugins.browsertab.themeable.isAvailable(function (result) {
if (!result) {
ref = cordova.InAppBrowser.open(logoutUrl, '_system');
ref.addEventListener('loadstart', function (event) {
if (event.url.indexOf('http://localhost') === 0) {
this.ref.close();
this.closeBrowserTab();
}
});
ref.addEventListener('loaderror', function (event) {
if (event.url.indexOf('http://localhost') === 0) {
this.ref.close();
this.closeBrowserTab();
}
else {
error = true;
this.ref.close();
this.closeBrowserTab();
}
});
ref.addEventListener('exit', function (event) {
if (error) {
console.error('listener of in-app browser tab exited due to error', error);
}
else {
this.keycloak.clearToken({});
}
});
}
else {
this.openBrowserTab(logoutUrl, options);
}
}, function (isAvailableError) {
console.error('failed to query availability of in-app browser tab', isAvailableError);
});
}
register(options) {
const registerUrl = this.keycloak.createRegisterUrl({});
window.cordova.plugins.browsertab.themeable.isAvailable(function (result) {
if (!result) {
window.cordova.InAppBrowser.open(registerUrl, '_system');
}
else {
this.openBrowserTab(registerUrl, options);
}
}, function (isAvailableError) {
console.error('failed to query availability of in-app browser tab', isAvailableError);
});
}
accountManagement(options) {
const accountUrl = this.keycloak.createAccountUrl({});
window.cordova.plugins.browsertab.themeable.isAvailable(function (result) {
if (!result) {
window.cordova.InAppBrowser.open(accountUrl, '_system');
}
else {
this.openBrowserTab(accountUrl, options);
}
}, function (isAvailableError) {
console.error('failed to query availability of in-app browser tab', isAvailableError);
});
}
passwordManagement(options) {
const accountUrl = this.keycloak.createChangePasswordUrl({});
window.cordova.plugins.browsertab.themeable.isAvailable(function (result) {
if (!result) {
window.cordova.InAppBrowser.open(accountUrl, '_system');
}
else {
this.openBrowserTab(accountUrl, options);
}
}, function (isAvailableError) {
console.error('failed to query availability of in-app browser tab', isAvailableError);
});
}
redirectUri(options) {
if (options.redirectUri) {
return options.redirectUri;
}
else {
return 'http://localhost';
}
}
openBrowserTab(url, options) {
const cordova = window.cordova;
if (options.toolbarColor) {
cordova.plugins.browsertab.themeable.openUrl(url, options);
}
else {
cordova.plugins.browsertab.themeable.openUrl(url);
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2xvYWsuYWRhcHRlci5jb3Jkb3ZhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWJvbmR1L2FuZ3VsYXIta2V5Y2xvYWsvc3JjL2xpYi9hZGFwdGVyL2tleWNsb2FrLmFkYXB0ZXIuY29yZG92YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFNSDs7R0FFRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBRUw7SUFBcEIsWUFBb0IsUUFBeUI7UUFBekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7SUFFN0MsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFZO1FBQ3ZCLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDdEIsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN6QyxDQUFDLElBQUksYUFBYSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV2RCxnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUZBQW1GLENBQUMsQ0FBQztRQUN2RyxDQUFDO1FBRUQsSUFBSSxHQUFRLENBQUM7UUFDYixxRUFBcUU7UUFDckUsc0VBQXNFO1FBQ3RFLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUV0QixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8s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LFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxOCBlYm9uZHUgYW5kL29yIGl0cyBhZmZpbGlhdGVzXG4gKiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIGFzIGluZGljYXRlZCBieSB0aGUgQGF1dGhvciB0YWdzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEtleWNsb2FrU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2Uva2V5Y2xvYWsuc2VydmljZSc7XG5cbmRlY2xhcmUgdmFyIHdpbmRvdzogYW55O1xuXG4vKipcbiAqIENvcmRvdmEgYWRhcHRlciBmb3IgaHlicmlkIGFwcHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb3Jkb3ZhQWRhcHRlciB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBrZXljbG9hazogS2V5Y2xvYWtTZXJ2aWNlKSB7XG5cbiAgfVxuXG4gIHB1YmxpYyBsb2dpbihvcHRpb25zOiBhbnkpIHtcbiAgICAvLyBsZXQgcHJvbWlzZSA9IEtleWNsb2FrLmNyZWF0ZVByb21pc2UoKTtcbiAgICBsZXQgbyA9ICdsb2NhdGlvbj1ubyc7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wcm9tcHQgPT09ICdub25lJykge1xuICAgICAgbyArPSAnLGhpZGRlbj15ZXMnO1xuICAgIH1cbiAgICBjb25zdCBsb2dpblVybCA9IHRoaXMua2V5Y2xvYWsuY3JlYXRlTG9naW5Vcmwob3B0aW9ucyk7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnb3BlbmluZyBsb2dpbiBmcmFtZSBmcm9tIGNvcmRvdmE6ICcgKyBsb2dpblVybCk7XG4gICAgaWYgKCF3aW5kb3cuY29yZG92YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYXV0aGVudGljYXRlIHZpYSBhIHdlYiBicm93c2VyJyk7XG4gICAgfVxuXG4gICAgaWYgKCF3aW5kb3cuY29yZG92YS5JbkFwcEJyb3dzZXIgfHwgIXdpbmRvdy5jb3Jkb3ZhLnBsdWdpbnMuYnJvd3NlcnRhYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQXBhY2hlIENvcmRvdmEgSW5BcHBCcm93c2VyL0Jyb3dzZXJUYWIgcGx1Z2lucyB3YXMgbm90IGZvdW5kIGFuZCBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBsZXQgcmVmOiBhbnk7XG4gICAgLy8gbGV0IHJlZiA9IHdpbmRvdy5jb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKGxvZ2luVXJsLCAnX2JsYW5rJywgbyk7XG4gICAgLy8gbGV0IHJlZiA9IHdpbmRvdy5jb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKGxvZ2luVXJsLCAnX3N5c3RlbScsIG8pO1xuICAgIGxldCBjb21wbGV0ZWQgPSBmYWxzZTtcblxuICAgIHdpbmRvdy5jb3Jkb3ZhLnBsdWdpbnMuYnJvd3NlcnRhYi50aGVtZWFibGUuaXNBdmFpbGFibGUoXG4gICAgICBmdW5jdGlvbiAocmVzdWx0OiBhbnkpIHtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICByZWYgPSB3aW5kb3cuY29yZG92YS5JbkFwcEJyb3dzZXIub3Blbihsb2dpblVybCwgJ19zeXN0ZW0nKTtcbiAgICAgICAgICByZWYuYWRkRXZlbnRMaXN0ZW5lcignbG9hZHN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChldmVudC51cmwuaW5kZXhPZignaHR0cDovL2xvY2FsaG9zdCcpID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5rZXljbG9hay5wYXJzZUNhbGxiYWNrKGV2ZW50LnVybCk7XG4gICAgICAgICAgICAgIHRoaXMua2V5Y2xvYWsucHJvY2Vzc0NhbGxiYWNrKGNhbGxiYWNrKS5zdWJzY3JpYmUocHJvY2Vzc2VkID0+IHtcbiAgICAgICAgICAgICAgICByZWYuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlZi5hZGRFdmVudExpc3RlbmVyKCdsb2FkZXJyb3InLCBmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xuICAgICAgICAgICAgaWYgKCFjb21wbGV0ZWQpIHtcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LnVybC5pbmRleE9mKCdodHRwOi8vbG9jYWxob3N0JykgPT09IDApIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5rZXljbG9hay5wYXJzZUNhbGxiYWNrKGV2ZW50LnVybCk7XG4gICAgICAgICAgICAgICAgdGhpcy5rZXljbG9hay5wcm9jZXNzQ2FsbGJhY2soY2FsbGJhY2spLnN1YnNjcmliZShwcm9jZXNzZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZUJyb3dzZXJUYWIoKTtcbiAgICAgICAgICAgICAgICAgIC8vIHJlZi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQnJvd3NlclRhYigpO1xuICAgICAgICAgICAgICAgIC8vIHJlZi5jbG9zZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuQnJvd3NlclRhYihsb2dpblVybCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbiAoaXNBdmFpbGFibGVFcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCB0byBxdWVyeSBhdmFpbGFiaWxpdHkgb2YgaW4tYXBwIGJyb3dzZXIgdGFiJyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZUJyb3dzZXJUYWIoKSB7XG4gICAgY29uc3QgY29yZG92YSA9IHdpbmRvdy5jb3Jkb3ZhO1xuICAgIGNvcmRvdmEucGx1Z2lucy5icm93c2VydGFiLnRoZW1lYWJsZS5jbG9zZSgpO1xuICAgIC8vIGNvbXBsZXRlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgbG9nb3V0KG9wdGlvbnM6IGFueSkge1xuICAgIGNvbnN0IGNvcmRvdmEgPSB3aW5kb3cuY29yZG92YTtcbiAgICBjb25zdCBsb2dvdXRVcmwgPSB0aGlzLmtleWNsb2FrLmNyZWF0ZUxvZ291dFVybChvcHRpb25zKTtcbiAgICBsZXQgcmVmOiBhbnk7XG4gICAgbGV0IGVycm9yOiBhbnk7XG5cbiAgICBjb3Jkb3ZhLnBsdWdpbnMuYnJvd3NlcnRhYi50aGVtZWFibGUuaXNBdmFpbGFibGUoXG4gICAgICBmdW5jdGlvbiAocmVzdWx0OiBhbnkpIHtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICByZWYgPSBjb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKGxvZ291dFVybCwgJ19zeXN0ZW0nKTtcbiAgICAgICAgICByZWYuYWRkRXZlbnRMaXN0ZW5lcignbG9hZHN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChldmVudC51cmwuaW5kZXhPZignaHR0cDovL2xvY2FsaG9zdCcpID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVmLmNsb3NlKCk7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VCcm93c2VyVGFiKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZWYuYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVycm9yJywgZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChldmVudC51cmwuaW5kZXhPZignaHR0cDovL2xvY2FsaG9zdCcpID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVmLmNsb3NlKCk7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VCcm93c2VyVGFiKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMucmVmLmNsb3NlKCk7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VCcm93c2VyVGFiKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZWYuYWRkRXZlbnRMaXN0ZW5lcignZXhpdCcsIGZ1bmN0aW9uIChldmVudDogYW55KSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignbGlzdGVuZXIgb2YgaW4tYXBwIGJyb3dzZXIgdGFiIGV4aXRlZCBkdWUgdG8gZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmtleWNsb2FrLmNsZWFyVG9rZW4oe30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3BlbkJyb3dzZXJUYWIobG9nb3V0VXJsLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChpc0F2YWlsYWJsZUVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignZmFpbGVkIHRvIHF1ZXJ5IGF2YWlsYWJpbGl0eSBvZiBpbi1hcHAgYnJvd3NlciB0YWInLCBpc0F2YWlsYWJsZUVycm9yKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyKG9wdGlvbnM6IGFueSkge1xuICAgIGNvbnN0IHJlZ2lzdGVyVXJsID0gdGhpcy5rZXljbG9hay5jcmVhdGVSZWdpc3RlclVybCh7fSk7XG4gICAgd2luZG93LmNvcmRvdmEucGx1Z2lucy5icm93c2VydGFiLnRoZW1lYWJsZS5pc0F2YWlsYWJsZShcbiAgICAgIGZ1bmN0aW9uIChyZXN1bHQ6IGFueSkge1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgIHdpbmRvdy5jb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKHJlZ2lzdGVyVXJsLCAnX3N5c3RlbScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3BlbkJyb3dzZXJUYWIocmVnaXN0ZXJVcmwsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24gKGlzQXZhaWxhYmxlRXJyb3I6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gcXVlcnkgYXZhaWxhYmlsaXR5IG9mIGluLWFwcCBicm93c2VyIHRhYicsIGlzQXZhaWxhYmxlRXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYWNjb3VudE1hbmFnZW1lbnQob3B0aW9uczogYW55KSB7XG4gICAgY29uc3QgYWNjb3VudFVybCA9IHRoaXMua2V5Y2xvYWsuY3JlYXRlQWNjb3VudFVybCh7fSk7XG4gICAgd2luZG93LmNvcmRvdmEucGx1Z2lucy5icm93c2VydGFiLnRoZW1lYWJsZS5pc0F2YWlsYWJsZShcbiAgICAgIGZ1bmN0aW9uIChyZXN1bHQ6IGFueSkge1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgIHdpbmRvdy5jb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKGFjY291bnRVcmwsICdfc3lzdGVtJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuQnJvd3NlclRhYihhY2NvdW50VXJsLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChpc0F2YWlsYWJsZUVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignZmFpbGVkIHRvIHF1ZXJ5IGF2YWlsYWJpbGl0eSBvZiBpbi1hcHAgYnJvd3NlciB0YWInLCBpc0F2YWlsYWJsZUVycm9yKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cblxuICBwdWJsaWMgcGFzc3dvcmRNYW5hZ2VtZW50KG9wdGlvbnM6IGFueSkge1xuICAgIGNvbnN0IGFjY291bnRVcmwgPSB0aGlzLmtleWNsb2FrLmNyZWF0ZUNoYW5nZVBhc3N3b3JkVXJsKHt9KTtcbiAgICB3aW5kb3cuY29yZG92YS5wbHVnaW5zLmJyb3dzZXJ0YWIudGhlbWVhYmxlLmlzQXZhaWxhYmxlKFxuICAgICAgZnVuY3Rpb24gKHJlc3VsdDogYW55KSB7XG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgd2luZG93LmNvcmRvdmEuSW5BcHBCcm93c2VyLm9wZW4oYWNjb3VudFVybCwgJ19zeXN0ZW0nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9wZW5Ccm93c2VyVGFiKGFjY291bnRVcmwsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24gKGlzQXZhaWxhYmxlRXJyb3I6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gcXVlcnkgYXZhaWxhYmlsaXR5IG9mIGluLWFwcCBicm93c2VyIHRhYicsIGlzQXZhaWxhYmxlRXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVkaXJlY3RVcmkob3B0aW9uczogYW55KTogYW55IHtcbiAgICBpZiAob3B0aW9ucy5yZWRpcmVjdFVyaSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMucmVkaXJlY3RVcmk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnaHR0cDovL2xvY2FsaG9zdCc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQnJvd3NlclRhYih1cmw6IFN0cmluZywgb3B0aW9uczogYW55KSB7XG4gICAgY29uc3QgY29yZG92YSA9IHdpbmRvdy5jb3Jkb3ZhO1xuICAgIGlmIChvcHRpb25zLnRvb2xiYXJDb2xvcikge1xuICAgICAgY29yZG92YS5wbHVnaW5zLmJyb3dzZXJ0YWIudGhlbWVhYmxlLm9wZW5VcmwodXJsLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29yZG92YS5wbHVnaW5zLmJyb3dzZXJ0YWIudGhlbWVhYmxlLm9wZW5VcmwodXJsKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==