kinde-angular
Version:
Angular wrapper for the Kinde TypeScript SDK
109 lines • 18.8 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { defer, filter, from, iif, map, of, Subject, switchMap, takeUntil, tap } from "rxjs";
import { KINDE_FACTORY_TOKEN } from "./kinde-client-factory.service";
import { sessionManager } from "./session-manager";
import { DOCUMENT } from "@angular/common";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "./auth-state.service";
export class KindeAngularService {
constructor(kindeClient, document, location, authState) {
this.kindeClient = kindeClient;
this.document = document;
this.location = location;
this.authState = authState;
this.unsubscribe$ = new Subject();
this.user$ = this.authState.user$;
this.isAuthenticated$ = this.authState.isAuthenticated$;
this.isLoading$ = this.authState.isLoading$;
this.accessToken$ = this.authState.accessToken$;
this.shouldHandleCallback()
.pipe(filter(_ => this.kindeClient !== null), switchMap(shouldHandleCallback => iif(() => shouldHandleCallback, defer(() => this.handleCallback()), of(false))), tap(() => authState.setIsLoading(false)), takeUntil(this.unsubscribe$)).subscribe();
}
ngOnDestroy() {
this.unsubscribe$.next();
this.unsubscribe$.complete();
}
getClaim(claim, type) {
// todo: make reusable function to handle isAuthenticated
return this.isAuthenticated$.pipe(filter(_ => this.kindeClient !== null), switchMap(isAuthenticated => iif(() => isAuthenticated, from(this.kindeClient.getClaim(claim, type)), of(null))));
}
;
getUserOrganizations() {
// todo: check L59
return this.isAuthenticated$.pipe(filter(_ => this.kindeClient !== null), switchMap(isAuthenticated => iif(() => isAuthenticated, from(this.kindeClient.getUserOrganizations()), of({ orgCodes: [] }))));
}
getAccessToken() {
if (!this.kindeClient)
throw new Error("kindeClient is null");
return this.kindeClient.getToken();
}
getFeatureFlag(code, defaultValue, flagType) {
if (!this.kindeClient)
throw new Error("kindeClient is null");
return this.kindeClient.getFlag(code, defaultValue, flagType);
}
async getFeatureFlagEnabled(code, defaultValue) {
const BOOLEAN_FLAG_TYPE = 'b';
return (await this.getFeatureFlag(code, defaultValue, BOOLEAN_FLAG_TYPE)).value;
}
async login(options) {
if (!this.kindeClient)
throw new Error("kindeClient is null");
const loginUrl = await this.kindeClient.login(options);
if (options?.post_login_redirect_url) {
await sessionManager.setSessionItemBrowser('post_login_redirect_url', options.post_login_redirect_url);
}
this.document.location.href = loginUrl.href;
}
async logout() {
if (!this.kindeClient)
throw new Error("kindeClient is null");
const logoutUrl = await this.kindeClient.logout();
this.document.location.href = logoutUrl.href;
}
async register(options) {
if (!this.kindeClient)
throw new Error("kindeClient is null");
const registerUrl = await this.kindeClient.register(options);
this.document.location.href = registerUrl.href;
}
shouldHandleCallback() {
return of(this.document.location.search)
.pipe(map(search => new URLSearchParams(search)), map(params => params.has('code') || params.has('state')));
}
async handleCallback() {
try {
await this.kindeClient.handleRedirectToApp(new URL(this.document.location.href));
const token = await this.kindeClient.getToken();
this.authState.setAccessToken(token);
let url = new URL(this.document.location.href);
url.search = '';
const loginRedirectUrl = await sessionManager.getSessionItemBrowser('post_login_redirect_url');
if (loginRedirectUrl) {
url = new URL(loginRedirectUrl);
await sessionManager.removeSessionItemBrowser('post_login_redirect_url');
}
this.document.location.href = url.href;
this.location.go(url.toString());
}
catch (e) {
console.log(e);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: KindeAngularService, deps: [{ token: KINDE_FACTORY_TOKEN }, { token: DOCUMENT }, { token: i1.Location }, { token: i2.AuthStateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: KindeAngularService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: KindeAngularService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [KINDE_FACTORY_TOKEN]
}] }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i1.Location }, { type: i2.AuthStateService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2luZGUtYW5ndWxhci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMva2luZGUtYW5ndWxhci9zcmMvbGliL2tpbmRlLWFuZ3VsYXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixJQUFJLEVBQ0osR0FBRyxFQUNILEdBQUcsRUFFSCxFQUFFLEVBQ0YsT0FBTyxFQUNQLFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxFQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFLckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQStCLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFLeEUsTUFBTSxPQUFPLG1CQUFtQjtJQVE5QixZQUN1QyxXQUErQixFQUMxQyxRQUFrQixFQUNwQyxRQUFrQixFQUNsQixTQUEyQjtRQUhFLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMxQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFYN0IsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRTNDLFVBQUssR0FBZ0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDMUQscUJBQWdCLEdBQXdCLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7UUFDeEUsZUFBVSxHQUF3QixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztRQUM1RCxpQkFBWSxHQUE4QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztRQVFw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QUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDOzhHQTVIVSxtQkFBbUIsa0JBU3BCLG1CQUFtQixhQUNuQixRQUFRO2tIQVZQLG1CQUFtQixjQUZsQixNQUFNOzsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFVSSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBkZWZlcixcbiAgZmlsdGVyLFxuICBmcm9tLFxuICBpaWYsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFN1YmplY3QsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZVVudGlsLFxuICB0YXBcbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEtJTkRFX0ZBQ1RPUllfVE9LRU4gfSBmcm9tIFwiLi9raW5kZS1jbGllbnQtZmFjdG9yeS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBLaW5kZUNsaWVudCB9IGZyb20gXCIuL2ludGVyZmFjZXMva2luZGUtY2xpZW50LmludGVyZmFjZVwiO1xuaW1wb3J0IHsgQXV0aFN0YXRlU2VydmljZSB9IGZyb20gXCIuL2F1dGgtc3RhdGUuc2VydmljZVwiO1xuaW1wb3J0IHsgQ2xhaW1Ub2tlblR5cGUsIEZsYWdUeXBlLCBHZXRGbGFnVHlwZSwgUmVnaXN0ZXJVUkxPcHRpb25zLCBVc2VyVHlwZSB9IGZyb20gXCJAa2luZGUtb3NzL2tpbmRlLXR5cGVzY3JpcHQtc2RrXCI7XG5pbXBvcnQgeyBJQ2xhaW0gfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2NsYWltLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgc2Vzc2lvbk1hbmFnZXIgfSBmcm9tIFwiLi9zZXNzaW9uLW1hbmFnZXJcIjtcbmltcG9ydCB7IERPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3NlciwgTG9jYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEtpbmRlQW5ndWxhclNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgdXNlciQ6IE9ic2VydmFibGU8VXNlclR5cGUgfCBudWxsPiA9IHRoaXMuYXV0aFN0YXRlLnVzZXIkO1xuICBpc0F1dGhlbnRpY2F0ZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5hdXRoU3RhdGUuaXNBdXRoZW50aWNhdGVkJDtcbiAgaXNMb2FkaW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuYXV0aFN0YXRlLmlzTG9hZGluZyQ7XG4gIGFjY2Vzc1Rva2VuJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiA9IHRoaXMuYXV0aFN0YXRlLmFjY2Vzc1Rva2VuJDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KEtJTkRFX0ZBQ1RPUllfVE9LRU4pIHByaXZhdGUga2luZGVDbGllbnQ6IEtpbmRlQ2xpZW50IHwgbnVsbCxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBwcml2YXRlIGF1dGhTdGF0ZTogQXV0aFN0YXRlU2VydmljZVxuICApIHtcbiAgICB0aGlzLnNob3VsZEhhbmRsZUNhbGxiYWNrKClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoXyA9PiB0aGlzLmtpbmRlQ2xpZW50ICE9PSBudWxsKSxcbiAgICAgICAgc3dpdGNoTWFwKHNob3VsZEhhbmRsZUNhbGxiYWNrID0+XG4gICAgICAgICAgaWlmKFxuICAgICAgICAgICAgKCkgPT4gc2hvdWxkSGFuZGxlQ2FsbGJhY2ssXG4gICAgICAgICAgICBkZWZlcigoKSA9PiB0aGlzLmhhbmRsZUNhbGxiYWNrKCkpLFxuICAgICAgICAgICAgb2YoZmFsc2UpXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICAgdGFwKCgpID0+XG4gICAgICAgICAgYXV0aFN0YXRlLnNldElzTG9hZGluZyhmYWxzZSlcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKVxuICAgICAgKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZ2V0Q2xhaW08VD4oY2xhaW06IHN0cmluZywgdHlwZT86IENsYWltVG9rZW5UeXBlKTogT2JzZXJ2YWJsZTxJQ2xhaW08VD4gfCBudWxsPiB7XG4gICAgLy8gdG9kbzogbWFrZSByZXVzYWJsZSBmdW5jdGlvbiB0byBoYW5kbGUgaXNBdXRoZW50aWNhdGVkXG4gICAgcmV0dXJuIHRoaXMuaXNBdXRoZW50aWNhdGVkJC5waXBlKFxuICAgICAgZmlsdGVyKF8gPT4gdGhpcy5raW5kZUNsaWVudCAhPT0gbnVsbCksXG4gICAgICBzd2l0Y2hNYXAoaXNBdXRoZW50aWNhdGVkID0+XG4gICAgICAgIGlpZihcbiAgICAgICAgICAoKSA9PiBpc0F1dGhlbnRpY2F0ZWQsXG4gICAgICAgICAgZnJvbSh0aGlzLmtpbmRlQ2xpZW50IS5nZXRDbGFpbShjbGFpbSwgdHlwZSkpIGFzIE9ic2VydmFibGU8SUNsYWltPFQ+PixcbiAgICAgICAgICBvZihudWxsKVxuICAgICAgICApXG4gICAgKSk7XG4gIH07XG5cbiAgZ2V0VXNlck9yZ2FuaXphdGlvbnMoKTogT2JzZXJ2YWJsZTx7IG9yZ0NvZGVzOiBzdHJpbmdbXSB9PiB7XG4gICAgLy8gdG9kbzogY2hlY2sgTDU5XG4gICAgcmV0dXJuIHRoaXMuaXNBdXRoZW50aWNhdGVkJC5waXBlKFxuICAgICAgZmlsdGVyKF8gPT4gdGhpcy5raW5kZUNsaWVudCAhPT0gbnVsbCksXG4gICAgICBzd2l0Y2hNYXAoaXNBdXRoZW50aWNhdGVkID0+XG4gICAgICAgIGlpZihcbiAgICAgICAgICAoKSA9PiBpc0F1dGhlbnRpY2F0ZWQsXG4gICAgICAgICAgZnJvbSh0aGlzLmtpbmRlQ2xpZW50IS5nZXRVc2VyT3JnYW5pemF0aW9ucygpKSxcbiAgICAgICAgICBvZih7IG9yZ0NvZGVzOiBbXSB9KVxuICAgICAgICApXG4gICAgKSk7XG4gIH1cblxuICBnZXRBY2Nlc3NUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmKCF0aGlzLmtpbmRlQ2xpZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJraW5kZUNsaWVudCBpcyBudWxsXCIpO1xuICAgIHJldHVybiB0aGlzLmtpbmRlQ2xpZW50LmdldFRva2VuKCk7XG4gIH1cblxuICBnZXRGZWF0dXJlRmxhZyhjb2RlOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQsIGZsYWdUeXBlPzoga2V5b2YgRmxhZ1R5cGUpOiBQcm9taXNlPEdldEZsYWdUeXBlPiB7XG4gICAgaWYoIXRoaXMua2luZGVDbGllbnQpIHRocm93IG5ldyBFcnJvcihcImtpbmRlQ2xpZW50IGlzIG51bGxcIik7XG4gICAgcmV0dXJuIHRoaXMua2luZGVDbGllbnQuZ2V0RmxhZyhjb2RlLCBkZWZhdWx0VmFsdWUsIGZsYWdUeXBlKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZlYXR1cmVGbGFnRW5hYmxlZChjb2RlOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBCT09MRUFOX0ZMQUdfVFlQRSA9ICdiJztcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0RmVhdHVyZUZsYWcoY29kZSwgZGVmYXVsdFZhbHVlLCBCT09MRUFOX0ZMQUdfVFlQRSkpLnZhbHVlIGFzIGJvb2xlYW47XG4gIH1cblxuICBhc3luYyBsb2dpbihvcHRpb25zPzogUmVnaXN0ZXJVUkxPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYoIXRoaXMua2luZGVDbGllbnQpIHRocm93IG5ldyBFcnJvcihcImtpbmRlQ2xpZW50IGlzIG51bGxcIik7XG4gICAgY29uc3QgbG9naW5VcmwgPSBhd2FpdCB0aGlzLmtpbmRlQ2xpZW50LmxvZ2luKG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zPy5wb3N0X2xvZ2luX3JlZGlyZWN0X3VybCkge1xuICAgICAgYXdhaXQgc2Vzc2lvbk1hbmFnZXIuc2V0U2Vzc2lvbkl0ZW1Ccm93c2VyKCdwb3N0X2xvZ2luX3JlZGlyZWN0X3VybCcsIG9wdGlvbnMucG9zdF9sb2dpbl9yZWRpcmVjdF91cmwpO1xuICAgIH1cbiAgICB0aGlzLmRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPSBsb2dpblVybC5ocmVmO1xuICB9XG5cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmKCF0aGlzLmtpbmRlQ2xpZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJraW5kZUNsaWVudCBpcyBudWxsXCIpO1xuICAgIGNvbnN0IGxvZ291dFVybCA9IGF3YWl0IHRoaXMua2luZGVDbGllbnQubG9nb3V0KCk7XG4gICAgdGhpcy5kb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gbG9nb3V0VXJsLmhyZWY7XG4gIH1cblxuICBhc3luYyByZWdpc3RlcihvcHRpb25zPzogUmVnaXN0ZXJVUkxPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYoIXRoaXMua2luZGVDbGllbnQpIHRocm93IG5ldyBFcnJvcihcImtpbmRlQ2xpZW50IGlzIG51bGxcIik7XG4gICAgY29uc3QgcmVnaXN0ZXJVcmwgPSBhd2FpdCB0aGlzLmtpbmRlQ2xpZW50LnJlZ2lzdGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IHJlZ2lzdGVyVXJsLmhyZWY7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEhhbmRsZUNhbGxiYWNrKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBvZih0aGlzLmRvY3VtZW50LmxvY2F0aW9uLnNlYXJjaClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoc2VhcmNoID0+IG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoKSksXG4gICAgICAgIG1hcChwYXJhbXMgPT4gcGFyYW1zLmhhcygnY29kZScpIHx8IHBhcmFtcy5oYXMoJ3N0YXRlJykpXG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMua2luZGVDbGllbnQhLmhhbmRsZVJlZGlyZWN0VG9BcHAobmV3IFVSTCh0aGlzLmRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5raW5kZUNsaWVudCEuZ2V0VG9rZW4oKTtcbiAgICAgIHRoaXMuYXV0aFN0YXRlLnNldEFjY2Vzc1Rva2VuKHRva2VuKTtcbiAgICAgIGxldCB1cmwgPSBuZXcgVVJMKHRoaXMuZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgICB1cmwuc2VhcmNoID0gJyc7XG5cbiAgICAgIGNvbnN0IGxvZ2luUmVkaXJlY3RVcmwgPSBhd2FpdCBzZXNzaW9uTWFuYWdlci5nZXRTZXNzaW9uSXRlbUJyb3dzZXIoJ3Bvc3RfbG9naW5fcmVkaXJlY3RfdXJsJyk7XG4gICAgICBpZiAobG9naW5SZWRpcmVjdFVybCkge1xuICAgICAgICB1cmwgPSBuZXcgVVJMKGxvZ2luUmVkaXJlY3RVcmwpO1xuICAgICAgICBhd2FpdCBzZXNzaW9uTWFuYWdlci5yZW1vdmVTZXNzaW9uSXRlbUJyb3dzZXIoJ3Bvc3RfbG9naW5fcmVkaXJlY3RfdXJsJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPSB1cmwuaHJlZjtcbiAgICAgIHRoaXMubG9jYXRpb24uZ28odXJsLnRvU3RyaW5nKCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH1cbiAgfVxufVxuIl19