UNPKG

@harbor/ui

Version:

Harbor shared UI components based on Clarity and Angular6

234 lines (233 loc) 22 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ViewChild, Input } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { ConfirmationDialogComponent } from '../confirmation-dialog/confirmation-dialog.component'; import { ConfirmationMessage } from '../confirmation-dialog/confirmation-message'; import { ConfigurationService, SystemInfoService } from '../service/index'; import { toPromise, compareValue, isEmptyObject, clone } from '../utils'; import { ErrorHandler } from '../error-handler/index'; import { SystemSettingsComponent, VulnerabilityConfigComponent, GcComponent } from './index'; import { Configuration } from './config'; export class RegistryConfigComponent { /** * @param {?} configService * @param {?} errorHandler * @param {?} translate * @param {?} systemInfoService */ constructor(configService, errorHandler, translate, systemInfoService) { this.configService = configService; this.errorHandler = errorHandler; this.translate = translate; this.systemInfoService = systemInfoService; this.config = new Configuration(); this.onGoing = false; this.hasAdminRole = false; } /** * @return {?} */ get shouldDisable() { return !this.isValid() || !this.hasChanges() || this.onGoing; } /** * @return {?} */ get hasCAFile() { return this.systemInfo && this.systemInfo.has_ca_root; } /** * @return {?} */ get withClair() { return this.systemInfo && this.systemInfo.with_clair; } /** * @return {?} */ get withAdmiral() { return this.systemInfo && this.systemInfo.with_admiral; } /** * @return {?} */ ngOnInit() { this.loadSystemInfo(); // Initialize this.load(); } /** * @return {?} */ isValid() { return this.systemSettings && this.systemSettings.isValid && this.vulnerabilityCfg && this.vulnerabilityCfg.isValid; } /** * @return {?} */ hasChanges() { return !isEmptyObject(this.getChanges()); } /** * @return {?} */ loadSystemInfo() { toPromise(this.systemInfoService.getSystemInfo()) .then((info) => this.systemInfo = info) .catch(error => this.errorHandler.error(error)); } /** * @return {?} */ load() { this.onGoing = true; toPromise(this.configService.getConfigurations()) .then((config) => { this.configCopy = clone(config); this.config = config; this.onGoing = false; }) .catch(error => { this.errorHandler.error(error); this.onGoing = false; }); } /** * @return {?} */ save() { /** @type {?} */ let changes = this.getChanges(); if (isEmptyObject(changes)) { // Guard code, do nothing return; } this.onGoing = true; toPromise(this.configService.saveConfigurations(changes)) .then(() => { this.onGoing = false; this.translate.get("CONFIG.SAVE_SUCCESS").subscribe((res) => { this.errorHandler.info(res); }); // Reload to fetch all the updates this.load(); // Reload all system info // this.loadSystemInfo(); }) .catch(error => { this.onGoing = false; this.errorHandler.error(error); }); } /** * @return {?} */ cancel() { /** @type {?} */ let msg = new ConfirmationMessage("CONFIG.CONFIRM_TITLE", "CONFIG.CONFIRM_SUMMARY", "", {}, 9 /* CONFIG */); this.confirmationDlg.open(msg); } /** * @param {?} ack * @return {?} */ confirmCancel(ack) { if (ack && ack.source === 9 /* CONFIG */ && ack.state === 1 /* CONFIRMED */) { this.reset(); } } /** * @return {?} */ reset() { /** @type {?} */ let changes = this.getChanges(); for (let prop of Object.keys(changes)) { this.config[prop] = clone(this.configCopy[prop]); } } /** * @return {?} */ getChanges() { /** @type {?} */ let changes = {}; if (!this.config || !this.configCopy) { return changes; } for (let prop of Object.keys(this.config)) { /** @type {?} */ let field = this.configCopy[prop]; if (field && field.editable) { if (!compareValue(field.value, this.config[prop].value)) { changes[prop] = this.config[prop].value; // Number if (typeof field.value === "number") { changes[prop] = +changes[prop]; } // Trim string value if (typeof field.value === "string") { changes[prop] = ('' + changes[prop]).trim(); } } } } return changes; } } RegistryConfigComponent.decorators = [ { type: Component, args: [{ selector: 'hbr-registry-config', template: "<clr-tabs>\n <clr-tab>\n <button id=\"config-system\" clrTabLink>{{'CONFIG.SYSTEM' | translate}}</button>\n <clr-tab-content id=\"system_settings\" *clrIfActive>\n <system-settings #systemSettings [(systemSettings)]=\"config\" [showSubTitle]=\"true\" [hasAdminRole]=\"hasAdminRole\" [hasCAFile]=\"hasCAFile\"\n [withAdmiral]=\"withAdmiral\">\n </system-settings>\n </clr-tab-content>\n </clr-tab>\n <clr-tab>\n <button id=\"config-vulnerability\" clrTabLink>{{'CONFIG.VULNERABILITY' | translate}}</button>\n <clr-tab-content id=\"vulnerability\" *clrIfActive>\n <vulnerability-config *ngIf=\"withClair\" #vulnerabilityConfig [(vulnerabilityConfig)]=\"config\" [showSubTitle]=\"true\"></vulnerability-config>\n </clr-tab-content>\n </clr-tab>\n <clr-tab>\n <button id=\"config-gc\" clrTabLink>{{'CONFIG.GC' | translate}}</button>\n <clr-tab-content id=\"gc\" *clrIfActive>\n <gc-config #gcConfig></gc-config>\n </clr-tab-content>\n </clr-tab>\n</clr-tabs>\n<confirmation-dialog #cfgConfirmationDialog (confirmAction)=\"confirmCancel($event)\"></confirmation-dialog>" }] } ]; /** @nocollapse */ RegistryConfigComponent.ctorParameters = () => [ { type: ConfigurationService }, { type: ErrorHandler }, { type: TranslateService }, { type: SystemInfoService } ]; RegistryConfigComponent.propDecorators = { hasAdminRole: [{ type: Input }], systemSettings: [{ type: ViewChild, args: ["systemSettings",] }], vulnerabilityCfg: [{ type: ViewChild, args: ["vulnerabilityConfig",] }], gc: [{ type: ViewChild, args: ["gc",] }], confirmationDlg: [{ type: ViewChild, args: ["cfgConfirmationDialog",] }] }; if (false) { /** @type {?} */ RegistryConfigComponent.prototype.config; /** @type {?} */ RegistryConfigComponent.prototype.configCopy; /** @type {?} */ RegistryConfigComponent.prototype.onGoing; /** @type {?} */ RegistryConfigComponent.prototype.systemInfo; /** @type {?} */ RegistryConfigComponent.prototype.hasAdminRole; /** @type {?} */ RegistryConfigComponent.prototype.systemSettings; /** @type {?} */ RegistryConfigComponent.prototype.vulnerabilityCfg; /** @type {?} */ RegistryConfigComponent.prototype.gc; /** @type {?} */ RegistryConfigComponent.prototype.confirmationDlg; /** @type {?} */ RegistryConfigComponent.prototype.configService; /** @type {?} */ RegistryConfigComponent.prototype.errorHandler; /** @type {?} */ RegistryConfigComponent.prototype.translate; /** @type {?} */ RegistryConfigComponent.prototype.systemInfoService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnktY29uZmlnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoYXJib3IvdWkvIiwic291cmNlcyI6WyJzcmMvY29uZmlnL3JlZ2lzdHJ5LWNvbmZpZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd2RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNuRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVsRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RixPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixhQUFhLEVBQ2IsS0FBSyxFQUNSLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsNEJBQTRCLEVBQUUsV0FBVyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFNekMsTUFBTTs7Ozs7OztJQWFGLFlBQ1ksZUFDQSxjQUNBLFdBQ0E7UUFIQSxrQkFBYSxHQUFiLGFBQWE7UUFDYixpQkFBWSxHQUFaLFlBQVk7UUFDWixjQUFTLEdBQVQsU0FBUztRQUNULHNCQUFpQixHQUFqQixpQkFBaUI7c0JBaEJMLElBQUksYUFBYSxFQUFFO3VCQUV4QixLQUFLOzRCQUdTLEtBQUs7S0FZakM7Ozs7SUFFTCxJQUFJLGFBQWE7UUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJ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QU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDckQsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDOztvQkFFeEMsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO3dCQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2xDOztvQkFHRCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7d0JBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztxQkFDL0M7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsT0FBTyxPQUFPLENBQUM7S0FDbEI7OztZQWhLSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLHFCQUFxQjtnQkFDL0IsZ3NDQUErQzthQUNsRDs7OztZQWRRLG9CQUFvQjtZQU9wQixZQUFZO1lBYlosZ0JBQWdCO1lBTU0saUJBQWlCOzs7MkJBcUIzQyxLQUFLOzZCQUVMLFNBQVMsU0FBQyxnQkFBZ0I7K0JBQzFCLFNBQVMsU0FBQyxxQkFBcUI7aUJBQy9CLFNBQVMsU0FBQyxJQUFJOzhCQUNkLFNBQVMsU0FBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5pbXBvcnQgeyBDb25maXJtYXRpb25TdGF0ZSwgQ29uZmlybWF0aW9uVGFyZ2V0cyB9IGZyb20gJy4uL3NoYXJlZC9zaGFyZWQuY29uc3QnO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybWF0aW9uLWRpYWxvZy9jb25maXJtYXRpb24tZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25NZXNzYWdlIH0gZnJvbSAnLi4vY29uZmlybWF0aW9uLWRpYWxvZy9jb25maXJtYXRpb24tbWVzc2FnZSc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25BY2tub3dsZWRnZW1lbnQgfSBmcm9tICcuLi9jb25maXJtYXRpb24tZGlhbG9nL2NvbmZpcm1hdGlvbi1zdGF0ZS1tZXNzYWdlJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25TZXJ2aWNlLCBTeXN0ZW1JbmZvU2VydmljZSwgU3lzdGVtSW5mbyB9IGZyb20gJy4uL3NlcnZpY2UvaW5kZXgnO1xuaW1wb3J0IHtcbiAgICB0b1Byb21pc2UsXG4gICAgY29tcGFyZVZhbHVlLFxuICAgIGlzRW1wdHlPYmplY3QsXG4gICAgY2xvbmVcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi4vZXJyb3ItaGFuZGxlci9pbmRleCc7XG5pbXBvcnQgeyBTeXN0ZW1TZXR0aW5nc0NvbXBvbmVudCwgVnVsbmVyYWJpbGl0eUNvbmZpZ0NvbXBvbmVudCwgR2NDb21wb25lbnR9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vY29uZmlnJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdoYnItcmVnaXN0cnktY29uZmlnJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmVnaXN0cnktY29uZmlnLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBSZWdpc3RyeUNvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgY29uZmlnOiBDb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcbiAgICBjb25maWdDb3B5OiBDb25maWd1cmF0aW9uO1xuICAgIG9uR29pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBzeXN0ZW1JbmZvOiBTeXN0ZW1JbmZvO1xuXG4gICAgQElucHV0KCkgaGFzQWRtaW5Sb2xlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBAVmlld0NoaWxkKFwic3lzdGVtU2V0dGluZ3NcIikgc3lzdGVtU2V0dGluZ3M6IFN5c3RlbVNldHRpbmdzQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoXCJ2dWxuZXJhYmlsaXR5Q29uZmlnXCIpIHZ1bG5lcmFiaWxpdHlDZmc6IFZ1bG5lcmFiaWxpdHlDb25maWdDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZChcImdjXCIpIGdjOiBHY0NvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKFwiY2ZnQ29uZmlybWF0aW9uRGlhbG9nXCIpIGNvbmZpcm1hdGlvbkRsZzogQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXIsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHN5c3RlbUluZm9TZXJ2aWNlOiBTeXN0ZW1JbmZvU2VydmljZVxuICAgICkgeyB9XG5cbiAgICBnZXQgc2hvdWxkRGlzYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzVmFsaWQoKSB8fCAhdGhpcy5oYXNDaGFuZ2VzKCkgfHwgdGhpcy5vbkdvaW5nO1xuICAgIH1cblxuICAgIGdldCBoYXNDQUZpbGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5c3RlbUluZm8gJiYgdGhpcy5zeXN0ZW1JbmZvLmhhc19jYV9yb290O1xuICAgIH1cblxuICAgIGdldCB3aXRoQ2xhaXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5c3RlbUluZm8gJiYgdGhpcy5zeXN0ZW1JbmZvLndpdGhfY2xhaXI7XG4gICAgfVxuXG4gICAgZ2V0IHdpdGhBZG1pcmFsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeXN0ZW1JbmZvICYmIHRoaXMuc3lzdGVtSW5mby53aXRoX2FkbWlyYWw7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9hZFN5c3RlbUluZm8oKTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZVxuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeXN0ZW1TZXR0aW5ncyAmJlxuICAgICAgICAgICAgdGhpcy5zeXN0ZW1TZXR0aW5ncy5pc1ZhbGlkICYmXG4gICAgICAgICAgICB0aGlzLnZ1bG5lcmFiaWxpdHlDZmcgJiZcbiAgICAgICAgICAgIHRoaXMudnVsbmVyYWJpbGl0eUNmZy5pc1ZhbGlkO1xuICAgIH1cblxuICAgIGhhc0NoYW5nZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhaXNFbXB0eU9iamVjdCh0aGlzLmdldENoYW5nZXMoKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHN5c3RlbSBpbmZvXG4gICAgbG9hZFN5c3RlbUluZm8oKTogdm9pZCB7XG4gICAgICAgIHRvUHJvbWlzZTxTeXN0ZW1JbmZvPih0aGlzLnN5c3RlbUluZm9TZXJ2aWNlLmdldFN5c3RlbUluZm8oKSlcbiAgICAgICAgICAgIC50aGVuKChpbmZvOiBTeXN0ZW1JbmZvKSA9PiB0aGlzLnN5c3RlbUluZm8gPSBpbmZvKVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHRoaXMuZXJyb3JIYW5kbGVyLmVycm9yKGVycm9yKSk7XG4gICAgfVxuXG4gICAgLy8gTG9hZCBjb25maWd1cmF0aW9uc1xuICAgIGxvYWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Hb2luZyA9IHRydWU7XG4gICAgICAgIHRvUHJvbWlzZTxDb25maWd1cmF0aW9uPih0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlndXJhdGlvbnMoKSlcbiAgICAgICAgICAgIC50aGVuKChjb25maWc6IENvbmZpZ3VyYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ0NvcHkgPSBjbG9uZShjb25maWcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgICAgIHRoaXMub25Hb2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMub25Hb2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSBjb25maWd1cmF0aW9uIGNoYW5nZXNcbiAgICBzYXZlKCk6IHZvaWQge1xuICAgICAgICBsZXQgY2hhbmdlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfCBhbnlbXSB9ID0gdGhpcy5nZXRDaGFuZ2VzKCk7XG5cbiAgICAgICAgaWYgKGlzRW1wdHlPYmplY3QoY2hhbmdlcykpIHtcbiAgICAgICAgICAgIC8vIEd1YXJkIGNvZGUsIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub25Hb2luZyA9IHRydWU7XG4gICAgICAgIHRvUHJvbWlzZTxhbnk+KHRoaXMuY29uZmlnU2VydmljZS5zYXZlQ29uZmlndXJhdGlvbnMoY2hhbmdlcykpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkdvaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS5nZXQoXCJDT05GSUcuU0FWRV9TVUNDRVNTXCIpLnN1YnNjcmliZSgocmVzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaW5mbyhyZXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIFJlbG9hZCB0byBmZXRjaCBhbGwgdGhlIHVwZGF0ZXNcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgICAgICAgICAvLyBSZWxvYWQgYWxsIHN5c3RlbSBpbmZvXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5sb2FkU3lzdGVtSW5mbygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkdvaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIHRoZSBjaGFuZ2VzIGlmIGhhdmVcbiAgICBjYW5jZWwoKTogdm9pZCB7XG4gICAgICAgIGxldCBtc2cgPSBuZXcgQ29uZmlybWF0aW9uTWVzc2FnZShcbiAgICAgICAgICAgIFwiQ09ORklHLkNPTkZJUk1fVElUTEVcIixcbiAgICAgICAgICAgIFwiQ09ORklHLkNPTkZJUk1fU1VNTUFSWVwiLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgQ29uZmlybWF0aW9uVGFyZ2V0cy5DT05GSUdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maXJtYXRpb25EbGcub3Blbihtc2cpO1xuICAgIH1cblxuICAgIC8vIENvbmZpcm0gY2FuY2VsXG4gICAgY29uZmlybUNhbmNlbChhY2s6IENvbmZpcm1hdGlvbkFja25vd2xlZGdlbWVudCk6IHZvaWQge1xuICAgICAgICBpZiAoYWNrICYmIGFjay5zb3VyY2UgPT09IENvbmZpcm1hdGlvblRhcmdldHMuQ09ORklHICYmXG4gICAgICAgICAgICBhY2suc3RhdGUgPT09IENvbmZpcm1hdGlvblN0YXRlLkNPTkZJUk1FRCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIC8vIFJlc2V0IHRvIHRoZSB2YWx1ZXMgb2YgY29weVxuICAgICAgICBsZXQgY2hhbmdlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfCBhbnlbXSB9ID0gdGhpcy5nZXRDaGFuZ2VzKCk7XG4gICAgICAgIGZvciAobGV0IHByb3Agb2YgT2JqZWN0LmtleXMoY2hhbmdlcykpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnW3Byb3BdID0gY2xvbmUodGhpcy5jb25maWdDb3B5W3Byb3BdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENoYW5nZXMoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfCBhbnlbXSB9IHtcbiAgICAgICAgbGV0IGNoYW5nZXM6IHsgW2tleTogc3RyaW5nXTogYW55IHwgYW55W10gfSA9IHt9O1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnIHx8ICF0aGlzLmNvbmZpZ0NvcHkpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZykpIHtcbiAgICAgICAgICAgIGxldCBmaWVsZCA9IHRoaXMuY29uZmlnQ29weVtwcm9wXTtcbiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5lZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICghY29tcGFyZVZhbHVlKGZpZWxkLnZhbHVlLCB0aGlzLmNvbmZpZ1twcm9wXS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1twcm9wXSA9IHRoaXMuY29uZmlnW3Byb3BdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZC52YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1twcm9wXSA9ICtjaGFuZ2VzW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVHJpbSBzdHJpbmcgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZC52YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1twcm9wXSA9ICgnJyArIGNoYW5nZXNbcHJvcF0pLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgIH1cbn1cbiJdfQ==