@pepperi/ngx-lib
Version:
Pepperi Angular Components and Services
109 lines • 18.3 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "../../common/services/session.service";
export class AuthInterceptor {
// private SESSION_TOKEN_KEY = 'auth_token';
// private token = 'secrettoken';
// private refreshTokenInProgress = false;
// private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
constructor(sessionService) {
this.sessionService = sessionService;
this.AUTH_HEADER = 'Authorization';
this.PEPPERI_TOKEN_HEADER = 'PepperiSessionToken';
this.PEPPERI_CONSUMER_KEY_HEADER = 'X-Pepperi-ConsumerKey';
}
// Add authorization token if the token exist.
addAuthorizationToken(request) {
if (!request.headers.has(this.AUTH_HEADER)) {
const idpToken = this.sessionService.getIdpToken();
if (idpToken) {
request = request.clone({
headers: request.headers.set(this.AUTH_HEADER, `Bearer ${idpToken}`)
});
}
}
return request;
}
// Add pepperi consumer token if calling to papi domain.
addPepperiConsumerToken(request) {
if (!request.headers.has(this.PEPPERI_CONSUMER_KEY_HEADER)) {
const papiBaseUrl = this.sessionService.getPapiBaseUrl();
if (papiBaseUrl && request.url.match(new RegExp(papiBaseUrl, 'g'))) {
const pepperiConsumerToken = this.sessionService.getPepperiConsumerToken();
if (pepperiConsumerToken) {
request = request.clone({
headers: request.headers.set(this.PEPPERI_CONSUMER_KEY_HEADER, pepperiConsumerToken)
});
}
}
}
return request;
}
// Add web api token if calling to wapi domain.
addWebApiToken(request) {
if (!request.headers.has(this.PEPPERI_TOKEN_HEADER)) {
const wapiBaseUrl = this.sessionService.getWapiBaseUrl();
if (wapiBaseUrl && request.url.match(new RegExp(wapiBaseUrl, 'g'))) {
const webApiToken = this.sessionService.gettWapiToken();
if (webApiToken) {
request = request.clone({
headers: request.headers.set(this.PEPPERI_TOKEN_HEADER, webApiToken)
});
}
}
}
return request;
}
intercept(req, next) {
console.warn('AuthInterceptor');
// Add content type
if (!req.headers.has('Content-Type')) {
req = req.clone({
headers: req.headers.set('Content-Type', 'application/json')
});
}
req = this.addAuthorizationToken(req);
req = this.addPepperiConsumerToken(req);
req = this.addWebApiToken(req);
return next.handle(req);
// TODO: Check if we need this - this is an advance code that try to refresh the token in case of expired.
// return next.handle(req).pipe(
// catchError((error: HttpErrorResponse) => {
// if (error && error.status === 401) {
// // 401 errors are most likely going to be because we have an expired token that we need to refresh.
// if (this.refreshTokenInProgress) {
// // If refreshTokenInProgress is true, we will wait until refreshTokenSubject has a non-null value
// // which means the new token is ready and we can retry the request again
// return this.refreshTokenSubject.pipe(
// filter(result => result !== null),
// take(1),
// switchMap(() => next.handle(this.addAuthenticationToken(req)))
// );
// } else {
// this.refreshTokenInProgress = true;
// // Set the refreshTokenSubject to null so that subsequent API calls will
// // wait until the new token has been retrieved
// this.refreshTokenSubject.next(null);
// return this.refreshAccessToken().pipe(
// switchMap((success: boolean) => {
// this.refreshTokenSubject.next(success);
// return next.handle(this.addAuthenticationToken(req));
// }),
// // When the call to refreshToken completes we reset the refreshTokenInProgress to false
// // for the next time the token needs to be refreshed
// finalize(() => (this.refreshTokenInProgress = false))
// );
// }
// } else {
// return throwError(error);
// }
// })
// );
}
}
AuthInterceptor.ɵfac = function AuthInterceptor_Factory(t) { return new (t || AuthInterceptor)(i0.ɵɵinject(i1.SessionService)); };
AuthInterceptor.ɵprov = i0.ɵɵdefineInjectable({ token: AuthInterceptor, factory: AuthInterceptor.ɵfac });
/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(AuthInterceptor, [{
type: Injectable
}], function () { return [{ type: i1.SessionService }]; }, null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1saWIvc3JjL2NvcmUvaHR0cC9pbnRlcmNlcHRvcnMvYXV0aC5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFhM0MsTUFBTSxPQUFPLGVBQWU7SUFLeEIsNENBQTRDO0lBQzVDLGlDQUFpQztJQUNqQywwQ0FBMEM7SUFDMUMsc0ZBQXNGO0lBRXRGLFlBQW9CLGNBQThCO1FBQTlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQVQxQyxnQkFBVyxHQUFHLGVBQWUsQ0FBQztRQUM5Qix5QkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztRQUM3QyxnQ0FBMkIsR0FBRyx1QkFBdUIsQ0FBQztJQU9ULENBQUM7SUFFdEQsOENBQThDO0lBQ3RDLHFCQUFxQixDQUFDLE9BQXlCO1FBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUVuRCxJQUFJLFFBQVEsRUFBRTtnQkFDVixPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztvQkFDcEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxRQUFRLEVBQUUsQ0FBQztpQkFDdkUsQ0FBQyxDQUFDO2FBQ047U0FDSjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRCx3REFBd0Q7SUFDaEQsdUJBQXVCLENBQUMsT0FBeUI7UUFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQywyQkFBMkIs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QUNuQix3Q0FBd0M7UUFDeEMsWUFBWTtRQUNaLFNBQVM7UUFDVCxLQUFLO0lBQ1QsQ0FBQzs7OEVBcEhRLGVBQWU7dURBQWYsZUFBZSxXQUFmLGVBQWU7a0RBQWYsZUFBZTtjQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gICAgSHR0cEV2ZW50LFxyXG4gICAgSHR0cEludGVyY2VwdG9yLFxyXG4gICAgSHR0cEhhbmRsZXIsXHJcbiAgICBIdHRwUmVxdWVzdCxcclxuICAgIEh0dHBFcnJvclJlc3BvbnNlXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyB0aHJvd0Vycm9yLCBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbHRlciwgZmluYWxpemUsIHRha2UsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU2Vzc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24vc2VydmljZXMvc2Vzc2lvbi5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEF1dGhJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XHJcbiAgICBwcml2YXRlIEFVVEhfSEVBREVSID0gJ0F1dGhvcml6YXRpb24nO1xyXG4gICAgcHJpdmF0ZSBQRVBQRVJJX1RPS0VOX0hFQURFUiA9ICdQZXBwZXJpU2Vzc2lvblRva2VuJztcclxuICAgIHByaXZhdGUgUEVQUEVSSV9DT05TVU1FUl9LRVlfSEVBREVSID0gJ1gtUGVwcGVyaS1Db25zdW1lcktleSc7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBTRVNTSU9OX1RPS0VOX0tFWSA9ICdhdXRoX3Rva2VuJztcclxuICAgIC8vIHByaXZhdGUgdG9rZW4gPSAnc2VjcmV0dG9rZW4nO1xyXG4gICAgLy8gcHJpdmF0ZSByZWZyZXNoVG9rZW5JblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAvLyBwcml2YXRlIHJlZnJlc2hUb2tlblN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnk+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc2Vzc2lvblNlcnZpY2U6IFNlc3Npb25TZXJ2aWNlKSB7fVxyXG5cclxuICAgIC8vIEFkZCBhdXRob3JpemF0aW9uIHRva2VuIGlmIHRoZSB0b2tlbiBleGlzdC5cclxuICAgIHByaXZhdGUgYWRkQXV0aG9yaXphdGlvblRva2VuKHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4pOiBIdHRwUmVxdWVzdDxhbnk+IHtcclxuICAgICAgICBpZiAoIXJlcXVlc3QuaGVhZGVycy5oYXModGhpcy5BVVRIX0hFQURFUikpIHtcclxuICAgICAgICAgICAgY29uc3QgaWRwVG9rZW4gPSB0aGlzLnNlc3Npb25TZXJ2aWNlLmdldElkcFRva2VuKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaWRwVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIHJlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHtcclxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMuc2V0KHRoaXMuQVVUSF9IRUFERVIsIGBCZWFyZXIgJHtpZHBUb2tlbn1gKVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCBwZXBwZXJpIGNvbnN1bWVyIHRva2VuIGlmIGNhbGxpbmcgdG8gcGFwaSBkb21haW4uXHJcbiAgICBwcml2YXRlIGFkZFBlcHBlcmlDb25zdW1lclRva2VuKHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4pOiBIdHRwUmVxdWVzdDxhbnk+IHtcclxuICAgICAgICBpZiAoIXJlcXVlc3QuaGVhZGVycy5oYXModGhpcy5QRVBQRVJJX0NPTlNVTUVSX0tFWV9IRUFERVIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcGlCYXNlVXJsID0gdGhpcy5zZXNzaW9uU2VydmljZS5nZXRQYXBpQmFzZVVybCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBhcGlCYXNlVXJsICYmIHJlcXVlc3QudXJsLm1hdGNoKG5ldyBSZWdFeHAocGFwaUJhc2VVcmwsICdnJykpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwZXBwZXJpQ29uc3VtZXJUb2tlbiA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0UGVwcGVyaUNvbnN1bWVyVG9rZW4oKTtcclxuICAgICAgICAgICAgICAgIGlmIChwZXBwZXJpQ29uc3VtZXJUb2tlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLnNldCh0aGlzLlBFUFBFUklfQ09OU1VNRVJfS0VZX0hFQURFUiwgcGVwcGVyaUNvbnN1bWVyVG9rZW4pXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCB3ZWIgYXBpIHRva2VuIGlmIGNhbGxpbmcgdG8gd2FwaSBkb21haW4uXHJcbiAgICBwcml2YXRlIGFkZFdlYkFwaVRva2VuKHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4pOiBIdHRwUmVxdWVzdDxhbnk+IHtcclxuICAgICAgICBpZiAoIXJlcXVlc3QuaGVhZGVycy5oYXModGhpcy5QRVBQRVJJX1RPS0VOX0hFQURFUikpIHtcclxuICAgICAgICAgICAgY29uc3Qgd2FwaUJhc2VVcmwgPSB0aGlzLnNlc3Npb25TZXJ2aWNlLmdldFdhcGlCYXNlVXJsKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAod2FwaUJhc2VVcmwgJiYgcmVxdWVzdC51cmwubWF0Y2gobmV3IFJlZ0V4cCh3YXBpQmFzZVVybCwgJ2cnKSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkFwaVRva2VuID0gdGhpcy5zZXNzaW9uU2VydmljZS5nZXR0V2FwaVRva2VuKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAod2ViQXBpVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdC5jbG9uZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycy5zZXQodGhpcy5QRVBQRVJJX1RPS0VOX0hFQURFUiwgd2ViQXBpVG9rZW4pXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgfVxyXG5cclxuICAgIGludGVyY2VwdChyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignQXV0aEludGVyY2VwdG9yJyk7XHJcblxyXG4gICAgICAgIC8vIEFkZCBjb250ZW50IHR5cGVcclxuICAgICAgICBpZiAoIXJlcS5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHtcclxuICAgICAgICAgICAgcmVxID0gcmVxLmNsb25lKHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlcSA9IHRoaXMuYWRkQXV0aG9yaXphdGlvblRva2VuKHJlcSk7XHJcblxyXG4gICAgICAgIHJlcSA9IHRoaXMuYWRkUGVwcGVyaUNvbnN1bWVyVG9rZW4ocmVxKTtcclxuXHJcbiAgICAgICAgcmVxID0gdGhpcy5hZGRXZWJBcGlUb2tlbihyZXEpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcclxuXHJcbiAgICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgd2UgbmVlZCB0aGlzIC0gdGhpcyBpcyBhbiBhZHZhbmNlIGNvZGUgdGhhdCB0cnkgdG8gcmVmcmVzaCB0aGUgdG9rZW4gaW4gY2FzZSBvZiBleHBpcmVkLlxyXG4gICAgICAgIC8vIHJldHVybiBuZXh0LmhhbmRsZShyZXEpLnBpcGUoXHJcbiAgICAgICAgLy8gICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgLy8gNDAxIGVycm9ycyBhcmUgbW9zdCBsaWtlbHkgZ29pbmcgdG8gYmUgYmVjYXVzZSB3ZSBoYXZlIGFuIGV4cGlyZWQgdG9rZW4gdGhhdCB3ZSBuZWVkIHRvIHJlZnJlc2guXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgaWYgKHRoaXMucmVmcmVzaFRva2VuSW5Qcm9ncmVzcykge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyBJZiByZWZyZXNoVG9rZW5JblByb2dyZXNzIGlzIHRydWUsIHdlIHdpbGwgd2FpdCB1bnRpbCByZWZyZXNoVG9rZW5TdWJqZWN0IGhhcyBhIG5vbi1udWxsIHZhbHVlXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIHdoaWNoIG1lYW5zIHRoZSBuZXcgdG9rZW4gaXMgcmVhZHkgYW5kIHdlIGNhbiByZXRyeSB0aGUgcmVxdWVzdCBhZ2FpblxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoVG9rZW5TdWJqZWN0LnBpcGUoXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBmaWx0ZXIocmVzdWx0ID0+IHJlc3VsdCAhPT0gbnVsbCksXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IG5leHQuaGFuZGxlKHRoaXMuYWRkQXV0aGVudGljYXRpb25Ub2tlbihyZXEpKSlcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbkluUHJvZ3Jlc3MgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSByZWZyZXNoVG9rZW5TdWJqZWN0IHRvIG51bGwgc28gdGhhdCBzdWJzZXF1ZW50IEFQSSBjYWxscyB3aWxsXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIHdhaXQgdW50aWwgdGhlIG5ldyB0b2tlbiBoYXMgYmVlbiByZXRyaWV2ZWRcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5TdWJqZWN0Lm5leHQobnVsbCk7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKS5waXBlKFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKChzdWNjZXNzOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5TdWJqZWN0Lm5leHQoc3VjY2Vzcyk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHRoaXMuYWRkQXV0aGVudGljYXRpb25Ub2tlbihyZXEpKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgY2FsbCB0byByZWZyZXNoVG9rZW4gY29tcGxldGVzIHdlIHJlc2V0IHRoZSByZWZyZXNoVG9rZW5JblByb2dyZXNzIHRvIGZhbHNlXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIG5leHQgdGltZSB0aGUgdG9rZW4gbmVlZHMgdG8gYmUgcmVmcmVzaGVkXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiAodGhpcy5yZWZyZXNoVG9rZW5JblByb2dyZXNzID0gZmFsc2UpKVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9KVxyXG4gICAgICAgIC8vICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSByZWZyZXNoQWNjZXNzVG9rZW4oKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIC8vICAgICByZXR1cm4gb2YoJ3NlY3JldCB0b2tlbicpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHByaXZhdGUgYWRkQXV0aGVudGljYXRpb25Ub2tlbihyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+KTogSHR0cFJlcXVlc3Q8YW55PiB7XHJcbiAgICAvLyAgICAgLy8gSWYgd2UgZG8gbm90IGhhdmUgYSB0b2tlbiB5ZXQgdGhlbiB3ZSBzaG91bGQgbm90IHNldCB0aGUgaGVhZGVyLlxyXG4gICAgLy8gICAgIC8vIEhlcmUgd2UgY291bGQgZmlyc3QgcmV0cmlldmUgdGhlIHRva2VuIGZyb20gd2hlcmUgd2Ugc3RvcmUgaXQuXHJcbiAgICAvLyAgICAgaWYgKCF0aGlzLnRva2VuKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICAvLyBJZiB5b3UgYXJlIGNhbGxpbmcgYW4gb3V0c2lkZSBkb21haW4gdGhlbiBkbyBub3QgYWRkIHRoZSB0b2tlbi5cclxuICAgIC8vICAgICBpZiAoIXJlcXVlc3QudXJsLm1hdGNoKC93d3cubXlkb21haW4uY29tXFwvLykpIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiByZXF1ZXN0LmNsb25lKHtcclxuICAgIC8vICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLnNldCh0aGlzLkFVVEhfSEVBREVSLCBgQmVhcmVyICR7dGhpcy50b2tlbn1gKVxyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG59Il19