UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

176 lines 28.2 kB
import { Component } from '@angular/core'; import { BasicAuth, FetchClient, TenantLoginOptionType, UserService } from '@c8y/client'; import { omit } from 'lodash-es'; import { BsModalRef } from 'ngx-bootstrap/modal'; import { AlertService } from '../alert/alert.service'; import { PasswordService } from '../authentication/password.service'; import { CookieBannerService } from '../bootstrap/cookie-banner/cookie-banner.service'; import { Status } from '../common/status.model'; import { AppStateService } from '../common/ui-state.service'; import { UserPreferencesService } from '../common/user-preferences/user-preferences.service'; import { gettext } from '../i18n/gettext'; import { LoginService } from '../login/login.service'; import { ModalService } from '../modal/modal.service'; import { GainsightService } from '../product-experience/gainsight.service'; import { UserEngagementsService } from '../product-experience/user-engagements.service'; import * as i0 from "@angular/core"; import * as i1 from "ngx-bootstrap/modal"; import * as i2 from "@c8y/client"; import * as i3 from "../common/ui-state.service"; import * as i4 from "../alert/alert.service"; import * as i5 from "../common/user-preferences/user-preferences.service"; import * as i6 from "../modal/modal.service"; import * as i7 from "../product-experience/gainsight.service"; import * as i8 from "../bootstrap/cookie-banner/cookie-banner.service"; import * as i9 from "../login/login.service"; import * as i10 from "../authentication/password.service"; import * as i11 from "../product-experience/user-engagements.service"; import * as i12 from "../modal/modal.component"; import * as i13 from "./user-edit.component"; import * as i14 from "../i18n/c8y-translate.pipe"; import * as i15 from "@angular/common"; export class UserEditModalComponent { constructor(modal, user, ui, auth, client, alert, userPreferences, c8yModalService, gainsightService, cookieBannerService, loginService, passwordService, userEngagementsService) { this.modal = modal; this.user = user; this.ui = ui; this.auth = auth; this.client = client; this.alert = alert; this.userPreferences = userPreferences; this.c8yModalService = c8yModalService; this.gainsightService = gainsightService; this.cookieBannerService = cookieBannerService; this.loginService = loginService; this.passwordService = passwordService; this.userEngagementsService = userEngagementsService; this.loading = false; this.showProductExperienceOptions = false; } async ngOnInit() { this.updateUserInAppState(); await this.setInitialProductExperienceOptions(); } /** * Initializes product experience options for the user. * * This function performs the following operations: * - Determines if the user has the permission to edit product experience options. * - If the user has the permission and functional cookies are enabled: * - Checks whether personalized product experience tracking is active. * - Checks whether in-product information and communication is active. */ async setInitialProductExperienceOptions() { this.showProductExperienceOptions = await this.gainsightService.canEditProductExperienceSettings(); if (this.showProductExperienceOptions && this.cookieBannerService.isFunctionalCookieEnabled()) { // Enable personalized product experience tracking option this.currentUsageTrackingState = !(await this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY)); // Enable in-product information & communication option this.currentUserEngagementPreferenceInitialState = this.userEngagementsService.userEngagementsEnabled$.value; } } async onDismiss() { this.modal.hide(); } onUsageTrackingChange(isEnabled) { this.usageTrackingState = isEnabled; } onUserEngagementPreferenceChange(isEnabled) { this.userEngagementPreferenceNewState = isEnabled; } async updateAndClose(user) { this.loading = true; try { const passwordChanged = Boolean(user.password); const usesBasic = this.loginService.loginMode.type === TenantLoginOptionType.BASIC; const isExternalUser = user.customProperties.userOrigin === 'OAUTH2'; if (!isExternalUser && passwordChanged) { const currentPassword = await this.passwordService.currentPassword().toPromise(); if (!currentPassword) { return; } await this.user.changeCurrentUserPassword(user.password, currentPassword); if (usesBasic) { this.updateCredentials(user.password); } } await this.updateProductExperienceOptions(); if (user.customProperties.userOrigin !== 'OAUTH2') { await this.user.updateCurrent(omit(user, 'password')); await this.updateUserInAppState(); } this.modal.hide(); this.alert.success(gettext('User saved.')); } catch (e) { if (e) { this.alert.addServerFailure(e); } } finally { this.loading = false; } } async gainsightTrackingAppReload() { try { await this.c8yModalService.confirm(gettext('Reload required'), gettext('To change the tracking option in the entire application, you need to reload the page. If you have any unsaved changes, you can reload later. How would you like to proceed?'), Status.WARNING, { ok: gettext('Reload now'), cancel: gettext('Reload later') }); location.reload(); } catch (ex) { // do nothing } } async updateProductExperienceOptions() { this.updateUserEngagementsPreference(); await this.updateTrackingOption(); } /** * Updates the user engagement preference if it has changed from the initial state. * Calls the user engagements service to update the preference. * * The update only occurs if the current preference differs from the new state. */ updateUserEngagementsPreference() { if (this.currentUserEngagementPreferenceInitialState !== this.userEngagementPreferenceNewState) { this.userEngagementsService.updateUserEngagementPreference(this.userEngagementPreferenceNewState); } } /** * Asynchronously updates the tracking option for user preferences. * If the current usage tracking state differs from the new state, * it updates the Gainsight preferences and sets a functional cookie * before triggering a reload of the application. */ async updateTrackingOption() { if (this.currentUsageTrackingState !== this.usageTrackingState) { await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState); this.gainsightService.setFunctionalCookie(this.usageTrackingState); await this.gainsightTrackingAppReload(); } } async updateUserInAppState() { const currentUserResult = await this.user.current(); this.ui.currentUser.next(currentUserResult.data); } updateCredentials(password) { const newCredentials = { password, user: this.ui.currentUser.value.id, tenant: this.client.tenant }; this.auth.updateCredentials(newCredentials); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEditModalComponent, deps: [{ token: i1.BsModalRef }, { token: i2.UserService }, { token: i3.AppStateService }, { token: i2.BasicAuth }, { token: i2.FetchClient }, { token: i4.AlertService }, { token: i5.UserPreferencesService }, { token: i6.ModalService }, { token: i7.GainsightService }, { token: i8.CookieBannerService }, { token: i9.LoginService }, { token: i10.PasswordService }, { token: i11.UserEngagementsService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserEditModalComponent, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal\n [title]=\"'Edit user' | translate\"\n [customFooter]=\"true\"\n (onDismiss)=\"onDismiss()\"\n>\n <c8y-user-edit\n [user]=\"ui.currentUser | async\"\n [loading]=\"loading\"\n [isUsageTrackingEnabled]=\"currentUsageTrackingState\"\n [isUserEngagementPreferenceEnabled]=\"currentUserEngagementPreferenceInitialState\"\n [showProductExperienceOptions]=\"showProductExperienceOptions\"\n (onUsageTrackingChange)=\"onUsageTrackingChange($event)\"\n (onUserEngagementPreferenceChange)=\"onUserEngagementPreferenceChange($event)\"\n (onUser)=\"updateAndClose($event)\"\n (onCancel)=\"onDismiss()\"\n ></c8y-user-edit>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: i12.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: i13.UserEditComponent, selector: "c8y-user-edit", inputs: ["loading", "user", "showProductExperienceOptions", "isUsageTrackingEnabled", "isUserEngagementPreferenceEnabled"], outputs: ["onUser", "onUsageTrackingChange", "onUserEngagementPreferenceChange", "onCancel"] }, { kind: "pipe", type: i14.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i15.AsyncPipe, name: "async" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEditModalComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-user-edit-modal', template: "<c8y-modal\n [title]=\"'Edit user' | translate\"\n [customFooter]=\"true\"\n (onDismiss)=\"onDismiss()\"\n>\n <c8y-user-edit\n [user]=\"ui.currentUser | async\"\n [loading]=\"loading\"\n [isUsageTrackingEnabled]=\"currentUsageTrackingState\"\n [isUserEngagementPreferenceEnabled]=\"currentUserEngagementPreferenceInitialState\"\n [showProductExperienceOptions]=\"showProductExperienceOptions\"\n (onUsageTrackingChange)=\"onUsageTrackingChange($event)\"\n (onUserEngagementPreferenceChange)=\"onUserEngagementPreferenceChange($event)\"\n (onUser)=\"updateAndClose($event)\"\n (onCancel)=\"onDismiss()\"\n ></c8y-user-edit>\n</c8y-modal>\n" }] }], ctorParameters: () => [{ type: i1.BsModalRef }, { type: i2.UserService }, { type: i3.AppStateService }, { type: i2.BasicAuth }, { type: i2.FetchClient }, { type: i4.AlertService }, { type: i5.UserPreferencesService }, { type: i6.ModalService }, { type: i7.GainsightService }, { type: i8.CookieBannerService }, { type: i9.LoginService }, { type: i10.PasswordService }, { type: i11.UserEngagementsService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0LW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvdXNlci91c2VyLWVkaXQtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS91c2VyL3VzZXItZWRpdC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUdYLHFCQUFxQixFQUNyQixXQUFXLEVBQ1osTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN2RixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7Ozs7Ozs7Ozs7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LENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxRQUFnQjtRQUN4QyxNQUFNLGNBQWMsR0FBaUI7WUFDbkMsUUFBUTtZQUNSLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1NBQzNCLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7K0dBOUtVLHNCQUFzQjttR0FBdEIsc0JBQXNCLDJEQzNCbkMsZ3FCQWlCQTs7NEZEVWEsc0JBQXNCO2tCQUpsQyxTQUFTOytCQUNFLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCYXNpY0F1dGgsXG4gIEZldGNoQ2xpZW50LFxuICBJQ3JlZGVudGlhbHMsXG4gIElVc2VyLFxuICBUZW5hbnRMb2dpbk9wdGlvblR5cGUsXG4gIFVzZXJTZXJ2aWNlXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IG9taXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBQYXNzd29yZFNlcnZpY2UgfSBmcm9tICcuLi9hdXRoZW50aWNhdGlvbi9wYXNzd29yZC5zZXJ2aWNlJztcbmltcG9ydCB7IENvb2tpZUJhbm5lclNlcnZpY2UgfSBmcm9tICcuLi9ib290c3RyYXAvY29va2llLWJhbm5lci9jb29raWUtYmFubmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi4vY29tbW9uL3N0YXR1cy5tb2RlbCc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdWktc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VzZXItcHJlZmVyZW5jZXMvdXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICcuLi9pMThuL2dldHRleHQnO1xuaW1wb3J0IHsgTG9naW5TZXJ2aWNlIH0gZnJvbSAnLi4vbG9naW4vbG9naW4uc2VydmljZSc7XG5pbXBvcnQgeyBNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi9tb2RhbC9tb2RhbC5zZXJ2aWNlJztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvZ2FpbnNpZ2h0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlckVuZ2FnZW1lbnRzU2VydmljZSB9IGZyb20gJy4uL3Byb2R1Y3QtZXhwZXJpZW5jZS91c2VyLWVuZ2FnZW1lbnRzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktdXNlci1lZGl0LW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItZWRpdC1tb2RhbC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVXNlckVkaXRNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGN1cnJlbnRVc2VyOiBJVXNlcjtcbiAgY2hhbmdlZExhbmc6IHN0cmluZztcbiAgbG9hZGluZyA9IGZhbHNlO1xuICBzaG93UHJvZHVjdEV4cGVyaWVuY2VPcHRpb25zID0gZmFsc2U7XG4gIGN1cnJlbnRVc2FnZVRyYWNraW5nU3RhdGU6IGJvb2xlYW47XG4gIGN1cnJlbnRVc2VyRW5nYWdlbWVudFByZWZlcmVuY2VJbml0aWFsU3RhdGU6IGJvb2xlYW47XG4gIHVzYWdlVHJhY2tpbmdTdGF0ZTogYm9vbGVhbjtcbiAgdXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlTmV3U3RhdGU6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1vZGFsOiBCc01vZGFsUmVmLFxuICAgIHB1YmxpYyB1c2VyOiBVc2VyU2VydmljZSxcbiAgICBwdWJsaWMgdWk6IEFwcFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGF1dGg6IEJhc2ljQXV0aCxcbiAgICBwcml2YXRlIGNsaWVudDogRmV0Y2hDbGllbnQsXG4gICAgcHJpdmF0ZSBhbGVydDogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclByZWZlcmVuY2VzOiBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgYzh5TW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29va2llQmFubmVyU2VydmljZTogQ29va2llQmFubmVyU2VydmljZSxcbiAgICBwcml2YXRlIGxvZ2luU2VydmljZTogTG9naW5TZXJ2aWNlLFxuICAgIHByaXZhdGUgcGFzc3dvcmRTZXJ2aWNlOiBQYXNzd29yZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyRW5nYWdlbWVudHNTZXJ2aWNlOiBVc2VyRW5nYWdlbWVudHNTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZVVzZXJJbkFwcFN0YXRlKCk7XG4gICAgYXdhaXQgdGhpcy5zZXRJbml0aWFsUHJvZHVjdEV4cGVyaWVuY2VPcHRpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgcHJvZHVjdCBleHBlcmllbmNlIG9wdGlvbnMgZm9yIHRoZSB1c2VyLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uczpcbiAgICogLSBEZXRlcm1pbmVzIGlmIHRoZSB1c2VyIGhhcyB0aGUgcGVybWlzc2lvbiB0byBlZGl0IHByb2R1Y3QgZXhwZXJpZW5jZSBvcHRpb25zLlxuICAgKiAtIElmIHRoZSB1c2VyIGhhcyB0aGUgcGVybWlzc2lvbiBhbmQgZnVuY3Rpb25hbCBjb29raWVzIGFyZSBlbmFibGVkOlxuICAgKiAgIC0gQ2hlY2tzIHdoZXRoZXIgcGVyc29uYWxpemVkIHByb2R1Y3QgZXhwZXJpZW5jZSB0cmFja2luZyBpcyBhY3RpdmUuXG4gICAqICAgLSBDaGVja3Mgd2hldGhlciBpbi1wcm9kdWN0IGluZm9ybWF0aW9uIGFuZCBjb21tdW5pY2F0aW9uIGlzIGFjdGl2ZS5cbiAgICovXG4gIGFzeW5jIHNldEluaXRpYWxQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnMoKSB7XG4gICAgdGhpcy5zaG93UHJvZHVjdEV4cGVyaWVuY2VPcHRpb25zID1cbiAgICAgIGF3YWl0IHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5jYW5FZGl0UHJvZHVjdEV4cGVyaWVuY2VTZXR0aW5ncygpO1xuXG4gICAgaWYgKHRoaXMuc2hvd1Byb2R1Y3RFeHBlcmllbmNlT3B0aW9ucyAmJiB0aGlzLmNvb2tpZUJhbm5lclNlcnZpY2UuaXNGdW5jdGlvbmFsQ29va2llRW5hYmxlZCgpKSB7XG4gICAgICAvLyBFbmFibGUgcGVyc29uYWxpemVkIHByb2R1Y3QgZXhwZXJpZW5jZSB0cmFja2luZyBvcHRpb25cbiAgICAgIHRoaXMuY3VycmVudFVzYWdlVHJhY2tpbmdTdGF0ZSA9XG4gICAgICAgICEoYXdhaXQgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLmlzR2FpbnNpZ2h0UHJlZmVyZW5jZURpc2FibGVkSW5Vc2VyUHJlZmVyZW5jZXMoXG4gICAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLlVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0tFWVxuICAgICAgICApKTtcblxuICAgICAgLy8gRW5hYmxlIGluLXByb2R1Y3QgaW5mb3JtYXRpb24gJiBjb21tdW5pY2F0aW9uIG9wdGlvblxuICAgICAgdGhpcy5jdXJyZW50VXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlSW5pdGlhbFN0YXRlID1cbiAgICAgICAgdGhpcy51c2VyRW5nYWdlbWVudHNTZXJ2aWNlLnVzZXJFbmdhZ2VtZW50c0VuYWJsZWQkLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uRGlzbWlzcygpIHtcbiAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgfVxuXG4gIG9uVXNhZ2VUcmFja2luZ0NoYW5nZShpc0VuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVzYWdlVHJhY2tpbmdTdGF0ZSA9IGlzRW5hYmxlZDtcbiAgfVxuXG4gIG9uVXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlQ2hhbmdlKGlzRW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMudXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlTmV3U3RhdGUgPSBpc0VuYWJsZWQ7XG4gIH1cblxuICBhc3luYyB1cGRhdGVBbmRDbG9zZSh1c2VyKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXNzd29yZENoYW5nZWQgPSBCb29sZWFuKHVzZXIucGFzc3dvcmQpO1xuICAgICAgY29uc3QgdXNlc0Jhc2ljID0gdGhpcy5sb2dpblNlcnZpY2UubG9naW5Nb2RlLnR5cGUgPT09IFRlbmFudExvZ2luT3B0aW9uVHlwZS5CQVNJQztcbiAgICAgIGNvbnN0IGlzRXh0ZXJuYWxVc2VyID0gdXNlci5jdXN0b21Qcm9wZXJ0aWVzLnVzZXJPcmlnaW4gPT09ICdPQVVUSDInO1xuXG4gICAgICBpZiAoIWlzRXh0ZXJuYWxVc2VyICYmIHBhc3N3b3JkQ2hhbmdlZCkge1xuICAgICAgICBjb25zdCBjdXJyZW50UGFzc3dvcmQgPSBhd2FpdCB0aGlzLnBhc3N3b3JkU2VydmljZS5jdXJyZW50UGFzc3dvcmQoKS50b1Byb21pc2UoKTtcbiAgICAgICAgaWYgKCFjdXJyZW50UGFzc3dvcmQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy51c2VyLmNoYW5nZUN1cnJlbnRVc2VyUGFzc3dvcmQodXNlci5wYXNzd29yZCwgY3VycmVudFBhc3N3b3JkKTtcbiAgICAgICAgaWYgKHVzZXNCYXNpYykge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ3JlZGVudGlhbHModXNlci5wYXNzd29yZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy51cGRhdGVQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnMoKTtcblxuICAgICAgaWYgKHVzZXIuY3VzdG9tUHJvcGVydGllcy51c2VyT3JpZ2luICE9PSAnT0FVVEgyJykge1xuICAgICAgICBhd2FpdCB0aGlzLnVzZXIudXBkYXRlQ3VycmVudChvbWl0KHVzZXIsICdwYXNzd29yZCcpKTtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVVc2VySW5BcHBTdGF0ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5tb2RhbC5oaWRlKCk7XG4gICAgICB0aGlzLmFsZXJ0LnN1Y2Nlc3MoZ2V0dGV4dCgnVXNlciBzYXZlZC4nKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgdGhpcy5hbGVydC5hZGRTZXJ2ZXJGYWlsdXJlKGUpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnYWluc2lnaHRUcmFja2luZ0FwcFJlbG9hZCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jOHlNb2RhbFNlcnZpY2UuY29uZmlybShcbiAgICAgICAgZ2V0dGV4dCgnUmVsb2FkIHJlcXVpcmVkJyksXG4gICAgICAgIGdldHRleHQoXG4gICAgICAgICAgJ1RvIGNoYW5nZSB0aGUgdHJhY2tpbmcgb3B0aW9uIGluIHRoZSBlbnRpcmUgYXBwbGljYXRpb24sIHlvdSBuZWVkIHRvIHJlbG9hZCB0aGUgcGFnZS4gSWYgeW91IGhhdmUgYW55IHVuc2F2ZWQgY2hhbmdlcywgeW91IGNhbiByZWxvYWQgbGF0ZXIuIEhvdyB3b3VsZCB5b3UgbGlrZSB0byBwcm9jZWVkPydcbiAgICAgICAgKSxcbiAgICAgICAgU3RhdHVzLldBUk5JTkcsXG4gICAgICAgIHtcbiAgICAgICAgICBvazogZ2V0dGV4dCgnUmVsb2FkIG5vdycpLFxuICAgICAgICAgIGNhbmNlbDogZ2V0dGV4dCgnUmVsb2FkIGxhdGVyJylcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnMoKSB7XG4gICAgdGhpcy51cGRhdGVVc2VyRW5nYWdlbWVudHNQcmVmZXJlbmNlKCk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVUcmFja2luZ09wdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHVzZXIgZW5nYWdlbWVudCBwcmVmZXJlbmNlIGlmIGl0IGhhcyBjaGFuZ2VkIGZyb20gdGhlIGluaXRpYWwgc3RhdGUuXG4gICAqIENhbGxzIHRoZSB1c2VyIGVuZ2FnZW1lbnRzIHNlcnZpY2UgdG8gdXBkYXRlIHRoZSBwcmVmZXJlbmNlLlxuICAgKlxuICAgKiBUaGUgdXBkYXRlIG9ubHkgb2NjdXJzIGlmIHRoZSBjdXJyZW50IHByZWZlcmVuY2UgZGlmZmVycyBmcm9tIHRoZSBuZXcgc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVVzZXJFbmdhZ2VtZW50c1ByZWZlcmVuY2UoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jdXJyZW50VXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlSW5pdGlhbFN0YXRlICE9PSB0aGlzLnVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZU5ld1N0YXRlXG4gICAgKSB7XG4gICAgICB0aGlzLnVzZXJFbmdhZ2VtZW50c1NlcnZpY2UudXBkYXRlVXNlckVuZ2FnZW1lbnRQcmVmZXJlbmNlKFxuICAgICAgICB0aGlzLnVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZU5ld1N0YXRlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSB1cGRhdGVzIHRoZSB0cmFja2luZyBvcHRpb24gZm9yIHVzZXIgcHJlZmVyZW5jZXMuXG4gICAqIElmIHRoZSBjdXJyZW50IHVzYWdlIHRyYWNraW5nIHN0YXRlIGRpZmZlcnMgZnJvbSB0aGUgbmV3IHN0YXRlLFxuICAgKiBpdCB1cGRhdGVzIHRoZSBHYWluc2lnaHQgcHJlZmVyZW5jZXMgYW5kIHNldHMgYSBmdW5jdGlvbmFsIGNvb2tpZVxuICAgKiBiZWZvcmUgdHJpZ2dlcmluZyBhIHJlbG9hZCBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVRyYWNraW5nT3B0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRVc2FnZVRyYWNraW5nU3RhdGUgIT09IHRoaXMudXNhZ2VUcmFja2luZ1N0YXRlKSB7XG4gICAgICBhd2FpdCB0aGlzLnVzZXJQcmVmZXJlbmNlcy5zZXQoXG4gICAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5VU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9LRVksXG4gICAgICAgIHRoaXMudXNhZ2VUcmFja2luZ1N0YXRlXG4gICAgICApO1xuICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnNldEZ1bmN0aW9uYWxDb29raWUodGhpcy51c2FnZVRyYWNraW5nU3RhdGUpO1xuICAgICAgYXdhaXQgdGhpcy5nYWluc2lnaHRUcmFja2luZ0FwcFJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlVXNlckluQXBwU3RhdGUoKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJSZXN1bHQgPSBhd2FpdCB0aGlzLnVzZXIuY3VycmVudCgpO1xuICAgIHRoaXMudWkuY3VycmVudFVzZXIubmV4dChjdXJyZW50VXNlclJlc3VsdC5kYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ3JlZGVudGlhbHMocGFzc3dvcmQ6IHN0cmluZykge1xuICAgIGNvbnN0IG5ld0NyZWRlbnRpYWxzOiBJQ3JlZGVudGlhbHMgPSB7XG4gICAgICBwYXNzd29yZCxcbiAgICAgIHVzZXI6IHRoaXMudWkuY3VycmVudFVzZXIudmFsdWUuaWQsXG4gICAgICB0ZW5hbnQ6IHRoaXMuY2xpZW50LnRlbmFudFxuICAgIH07XG4gICAgdGhpcy5hdXRoLnVwZGF0ZUNyZWRlbnRpYWxzKG5ld0NyZWRlbnRpYWxzKTtcbiAgfVxufVxuIiwiPGM4eS1tb2RhbFxuICBbdGl0bGVdPVwiJ0VkaXQgdXNlcicgfCB0cmFuc2xhdGVcIlxuICBbY3VzdG9tRm9vdGVyXT1cInRydWVcIlxuICAob25EaXNtaXNzKT1cIm9uRGlzbWlzcygpXCJcbj5cbiAgPGM4eS11c2VyLWVkaXRcbiAgICBbdXNlcl09XCJ1aS5jdXJyZW50VXNlciB8IGFzeW5jXCJcbiAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICBbaXNVc2FnZVRyYWNraW5nRW5hYmxlZF09XCJjdXJyZW50VXNhZ2VUcmFja2luZ1N0YXRlXCJcbiAgICBbaXNVc2VyRW5nYWdlbWVudFByZWZlcmVuY2VFbmFibGVkXT1cImN1cnJlbnRVc2VyRW5nYWdlbWVudFByZWZlcmVuY2VJbml0aWFsU3RhdGVcIlxuICAgIFtzaG93UHJvZHVjdEV4cGVyaWVuY2VPcHRpb25zXT1cInNob3dQcm9kdWN0RXhwZXJpZW5jZU9wdGlvbnNcIlxuICAgIChvblVzYWdlVHJhY2tpbmdDaGFuZ2UpPVwib25Vc2FnZVRyYWNraW5nQ2hhbmdlKCRldmVudClcIlxuICAgIChvblVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZUNoYW5nZSk9XCJvblVzZXJFbmdhZ2VtZW50UHJlZmVyZW5jZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAob25Vc2VyKT1cInVwZGF0ZUFuZENsb3NlKCRldmVudClcIlxuICAgIChvbkNhbmNlbCk9XCJvbkRpc21pc3MoKVwiXG4gID48L2M4eS11c2VyLWVkaXQ+XG48L2M4eS1tb2RhbD5cbiJdfQ==