UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

339 lines 44.2 kB
import { __decorate, __metadata } from "tslib"; import { Component, Injector, Input } from '@angular/core'; import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators'; import { CoreBaseComponent } from '../common/base.component'; import { DialogChangeEvent, DialogService } from '../dialog/dialog.service'; import { StatusIconType } from '../icon/layered-icon/status/status-icon.component'; import { AlertBarService, AlertSeverity } from './alert-bar.service'; import * as i0 from "@angular/core"; import * as i1 from "./alert-bar.service"; import * as i2 from "../dialog/dialog.service"; import * as i3 from "@angular/common"; import * as i4 from "@angular/router"; import * as i5 from "../icon/layered-icon/status/status-icon.component"; import * as i6 from "../tooltip/tooltip.directive"; const _c0 = function (a0, a1) { return { "sme-icon-chevronDown": a0, "sme-icon-chevronRight": a1 }; }; function AlertBarComponent_div_1_span_3_Template(rf, ctx) { if (rf & 1) { const _r8 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "span", 18); i0.ɵɵlistener("click", function AlertBarComponent_div_1_span_3_Template_span_click_0_listener($event) { i0.ɵɵrestoreView(_r8); const alert_r1 = i0.ɵɵnextContext().$implicit; const ctx_r6 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r6.clickExpand($event, alert_r1)); }); i0.ɵɵelementEnd(); } if (rf & 2) { const alert_r1 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(2, _c0, alert_r1.isExpanded, !alert_r1.isExpanded))("title", ctx_r2.strings.MsftSmeShell.Angular.AlertBar.Expand); } } function AlertBarComponent_div_1_p_12_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "p", 19); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const alert_r1 = i0.ɵɵnextContext().$implicit; i0.ɵɵattribute("aria-label", alert_r1.message); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", alert_r1.message, " "); } } function AlertBarComponent_div_1_p_13_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "p", 19); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const alert_r1 = i0.ɵɵnextContext().$implicit; i0.ɵɵattribute("aria-label", alert_r1.message); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", alert_r1.message, " "); } } function AlertBarComponent_div_1_label_14_div_1_a_1_Template(rf, ctx) { if (rf & 1) { const _r18 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "a", 23); i0.ɵɵlistener("click", function AlertBarComponent_div_1_label_14_div_1_a_1_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r18); const link_r13 = i0.ɵɵnextContext().$implicit; const ctx_r16 = i0.ɵɵnextContext(3); link_r13.event(); return i0.ɵɵresetView(ctx_r16.stopClickPropagation($event)); }); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const link_r13 = i0.ɵɵnextContext().$implicit; i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", link_r13.displayText, " "); } } function AlertBarComponent_div_1_label_14_div_1_div_2_a_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "a", 27); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const link_r13 = i0.ɵɵnextContext(2).$implicit; i0.ɵɵproperty("href", link_r13.uri, i0.ɵɵsanitizeUrl); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", link_r13.displayText, " "); } } function AlertBarComponent_div_1_label_14_div_1_div_2_a_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "a", 28); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const link_r13 = i0.ɵɵnextContext(2).$implicit; i0.ɵɵproperty("routerLink", link_r13.uri); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", link_r13.displayText, " "); } } function AlertBarComponent_div_1_label_14_div_1_div_2_Template(rf, ctx) { if (rf & 1) { const _r25 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 24); i0.ɵɵlistener("click", function AlertBarComponent_div_1_label_14_div_1_div_2_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r24 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r24.stopClickPropagation($event)); }); i0.ɵɵtemplate(1, AlertBarComponent_div_1_label_14_div_1_div_2_a_1_Template, 2, 2, "a", 25); i0.ɵɵtemplate(2, AlertBarComponent_div_1_label_14_div_1_div_2_a_2_Template, 2, 2, "a", 26); i0.ɵɵelementEnd(); } if (rf & 2) { const link_r13 = i0.ɵɵnextContext().$implicit; i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", link_r13.isExternalLink); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !link_r13.isExternalLink); } } function AlertBarComponent_div_1_label_14_div_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div"); i0.ɵɵtemplate(1, AlertBarComponent_div_1_label_14_div_1_a_1_Template, 2, 1, "a", 21); i0.ɵɵtemplate(2, AlertBarComponent_div_1_label_14_div_1_div_2_Template, 3, 2, "div", 22); i0.ɵɵelementEnd(); } if (rf & 2) { const link_r13 = ctx.$implicit; i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", link_r13.event); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !link_r13.event && link_r13.uri); } } function AlertBarComponent_div_1_label_14_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "label"); i0.ɵɵtemplate(1, AlertBarComponent_div_1_label_14_div_1_Template, 3, 2, "div", 20); i0.ɵɵelementEnd(); } if (rf & 2) { const alert_r1 = i0.ɵɵnextContext().$implicit; i0.ɵɵadvance(1); i0.ɵɵproperty("ngForOf", alert_r1.links); } } function AlertBarComponent_div_1_Template(rf, ctx) { if (rf & 1) { const _r29 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 2); i0.ɵɵlistener("click", function AlertBarComponent_div_1_Template_div_click_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r29); const alert_r1 = restoredCtx.$implicit; const ctx_r28 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r28.openNotificationDetails(alert_r1)); }); i0.ɵɵelementStart(1, "div", 3); i0.ɵɵelement(2, "sme-status-icon", 4); i0.ɵɵtemplate(3, AlertBarComponent_div_1_span_3_Template, 1, 5, "span", 5); i0.ɵɵelementEnd(); i0.ɵɵelementStart(4, "div", 6)(5, "div", 7)(6, "div", 8)(7, "p", 9); i0.ɵɵtext(8); i0.ɵɵelementEnd(); i0.ɵɵelementStart(9, "p", 10); i0.ɵɵtext(10); i0.ɵɵelementEnd()(); i0.ɵɵelementStart(11, "div", 3); i0.ɵɵtemplate(12, AlertBarComponent_div_1_p_12_Template, 2, 2, "p", 11); i0.ɵɵtemplate(13, AlertBarComponent_div_1_p_13_Template, 2, 2, "p", 11); i0.ɵɵtemplate(14, AlertBarComponent_div_1_label_14_Template, 2, 1, "label", 12); i0.ɵɵelementEnd()(); i0.ɵɵelementStart(15, "div", 13)(16, "div", 14); i0.ɵɵtext(17); i0.ɵɵelementEnd(); i0.ɵɵelementStart(18, "div", 15); i0.ɵɵtext(19); i0.ɵɵelementEnd()()(); i0.ɵɵelementStart(20, "div", 3)(21, "button", 16); i0.ɵɵlistener("click", function AlertBarComponent_div_1_Template_button_click_21_listener() { const restoredCtx = i0.ɵɵrestoreView(_r29); const alert_r1 = restoredCtx.$implicit; const ctx_r30 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r30.dismiss(alert_r1)); }); i0.ɵɵelement(22, "span", 17); i0.ɵɵelementEnd()()(); } if (rf & 2) { const alert_r1 = ctx.$implicit; const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(2); i0.ɵɵproperty("status", ctx_r0.getStatusString(alert_r1))("title", ctx_r0.getIconTitle(alert_r1)); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", alert_r1.title && alert_r1.needsClamp); i0.ɵɵadvance(5); i0.ɵɵtextInterpolate(ctx_r0.getIconTitle(alert_r1)); i0.ɵɵadvance(1); i0.ɵɵattribute("aria-label", alert_r1.title || alert_r1.message); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(alert_r1.title || alert_r1.message); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", alert_r1.title && !alert_r1.isExpanded); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", alert_r1.title && alert_r1.isExpanded); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", alert_r1.links); i0.ɵɵadvance(3); i0.ɵɵtextInterpolate(alert_r1.nodeName); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", alert_r1.timestamp, ""); i0.ɵɵadvance(2); i0.ɵɵattribute("aria-label", ctx_r0.strings.MsftSmeShell.Angular.AlertBar.DismissAriaLabel); i0.ɵɵadvance(1); i0.ɵɵproperty("title", ctx_r0.strings.MsftSmeShell.Angular.AlertBar.Dismiss); } } export class AlertBarComponent extends CoreBaseComponent { /** * Initializes a new instance of the {AlertBarComponent} class. * * @param alertBarService The alert service. * @param router The router. * @param activatedRoute The activated route. */ constructor(injector, alertBarService, dialogService) { super(injector); this.alertBarService = alertBarService; this.dialogService = dialogService; this.dialogSubscriptions = []; } /** * The source name to use for logging */ get logSourceName() { return 'AlertBarComponent'; } /** * The method to run when the component is initialized. */ ngOnInit() { this.alerts = []; this.alertBarService.register(this, this.id); this.dialogSubscriptions.push(this.dialogService.changed.subscribe(event => { // clear all alerts if the notification dialog opens if (event.dialogId === this.dialogService.commonIds.notificationsPane && event.changeEvent === DialogChangeEvent.Show) { this.alerts = []; } })); } /** * The method to run when the component is destroyed. */ ngOnDestroy() { this.alertBarService.unregister(this.id); if (this.dialogSubscriptions) { this.dialogSubscriptions.forEach(sub => sub?.unsubscribe()); } } /** * Open details view in notification pane * @param alert the alert clicked */ openNotificationDetails(alert) { this.dialogSubscriptions.push(this.dialogService.show(this.dialogService.commonIds.notificationsPane, { id: alert.id }).subscribe()); } /** * click the message expand button * @param event the event * @param alert the alert clicked */ clickExpand(event, alert) { alert.isExpanded = !alert.isExpanded; this.stopClickPropagation(event); } /** * stop propagation on the event * @param event the event to stop */ stopClickPropagation(event) { event.stopPropagation(); } /** * Assigns needsClamp properly to given alert * @param alert the alert * @param event the clamped event */ assignClamped(alert, event) { alert.needsClamp = event.clamped; } /** * Gets the status string for the status icon * * @param alert The alert. */ getStatusString(alert) { switch (alert.severity) { case AlertSeverity.Error: return StatusIconType.Error; case AlertSeverity.Warning: return StatusIconType.Warning; case AlertSeverity.Success: return StatusIconType.Success; case AlertSeverity.InProgress: return StatusIconType.Progress; case AlertSeverity.Informational: default: return StatusIconType.Info; } } getIconTitle(alert) { switch (alert.severity) { case AlertSeverity.Error: return this.strings.MsftSmeShell.Angular.AlertBar.Error; case AlertSeverity.Warning: return this.strings.MsftSmeShell.Angular.AlertBar.Warning; case AlertSeverity.Success: return this.strings.MsftSmeShell.Angular.AlertBar.Success; case AlertSeverity.InProgress: return this.strings.MsftSmeShell.Angular.AlertBar.InProgress; case AlertSeverity.Informational: default: return this.strings.MsftSmeShell.Angular.AlertBar.Information; } } /** * Shows an alert. * * @param alert The alert to show. */ show(alert) { // don't show popup if notifications are already open if (!MsftSme.find(this.dialogService.activeDialogsStack, dialog => dialog.id === this.dialogService.commonIds.notificationsPane)) { const existingAlert = this.alerts.find(x => x.id === alert.id || this.indexName(x) === this.indexName(alert)); if (existingAlert) { if (existingAlert.setTimeout) { clearTimeout(existingAlert.setTimeout); existingAlert.setTimeout = null; } this.dismiss(existingAlert); } if (alert.setTimeout) { clearTimeout(alert.setTimeout); alert.setTimeout = null; } this.alerts.unshift(alert); alert.setTimeout = setTimeout(() => { this.dismiss(alert); }, 7000); } } /** * Dismisses an alert. * * @param alert The alert to dismiss. */ dismiss(alert) { MsftSme.remove(this.alerts, alert); } /** * Create the index name in map collection. * * @param alert the alert */ indexName(alert) { return alert.severity + ':' + alert.title + ':' + alert.message + ':' + alert.nodeName; } } /** @nocollapse */ AlertBarComponent.ɵfac = function AlertBarComponent_Factory(t) { return new (t || AlertBarComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.AlertBarService), i0.ɵɵdirectiveInject(i2.DialogService)); }; /** @nocollapse */ AlertBarComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: AlertBarComponent, selectors: [["sme-alert-bar"]], inputs: { id: "id" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "sme-layer-notification", "sme-layout-absolute", "sme-layout-notification-popup-list"], ["tabindex", "0", "class", "sme-layout-notification-popup sme-shadow-notification-popup sme-margin-right-sm sme-margin-top-sm sme-arrange-stack-h\n sme-background-color-alt-5 sme-border-color-alt-5 sme-padding-top-xs sme-padding-left-sm sme-padding-right-xs sme-padding-bottom-xs sme-behavior-hover-trigger", 3, "click", 4, "ngFor", "ngForOf"], ["tabindex", "0", 1, "sme-layout-notification-popup", "sme-shadow-notification-popup", "sme-margin-right-sm", "sme-margin-top-sm", "sme-arrange-stack-h", "sme-background-color-alt-5", "sme-border-color-alt-5", "sme-padding-top-xs", "sme-padding-left-sm", "sme-padding-right-xs", "sme-padding-bottom-xs", "sme-behavior-hover-trigger", 3, "click"], [1, "sme-arrange-stack-v"], ["size", "16px", 1, "sme-padding-right-xs", "sme-padding-top-xxxs", 3, "status", "title"], ["role", "button", "class", "sme-button-trigger sme-button-auto-width sme-position-flex-none sme-padding-inset-none sme-icon sme-padding-top-xxs sme-behavior-hover-target-show", 3, "ngClass", "title", "click", 4, "ngIf"], ["role", "alert", "id", "sme-alert-bar-content", 1, "sme-arrange-stack-v", "sme-arrange-overflow-hide-x", "sme-arrange-word-wrap-break-word", "sme-position-stretch-h"], [1, "sme-layout-notification-message"], [1, "sme-arrange-stack-h"], [1, "sme-screen-reader"], [1, "sme-font-family-bold", "sme-font-label", "sme-margin-inset-none", "sme-padding-top-xxxs", "sme-position-stretch-h", "sme-position-left-inline"], ["class", "sme-font-label", 4, "ngIf"], [4, "ngIf"], [1, "sme-arrange-stack-h", "sme-font-label", "sme-color-base-40"], [1, "sme-position-flex-auto", "sme-arrange-ellipsis"], [1, "sme-position-flex-none", "sme-margin-left-xxs"], ["data-uta-id", "cancel-alert", "aria-describedby", "sme-alert-bar-content", 1, "sme-button-trigger", "sme-button-auto-width", "sme-position-flex-none", "sme-padding-inset-none", "sme-padding-left-xxs", "sme-padding-right-xxs", 3, "click"], [1, "sme-icon", "sme-icon-cancel", 3, "title"], ["role", "button", 1, "sme-button-trigger", "sme-button-auto-width", "sme-position-flex-none", "sme-padding-inset-none", "sme-icon", "sme-padding-top-xxs", "sme-behavior-hover-target-show", 3, "ngClass", "title", "click"], [1, "sme-font-label"], [4, "ngFor", "ngForOf"], ["class", "sme-link", 3, "click", 4, "ngIf"], [3, "click", 4, "ngIf"], [1, "sme-link", 3, "click"], [3, "click"], ["class", "sme-link", "target", "_blank", 3, "href", 4, "ngIf"], ["class", "sme-link", 3, "routerLink", 4, "ngIf"], ["target", "_blank", 1, "sme-link", 3, "href"], [1, "sme-link", 3, "routerLink"]], template: function AlertBarComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 0); i0.ɵɵtemplate(1, AlertBarComponent_div_1_Template, 23, 13, "div", 1); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵadvance(1); i0.ɵɵproperty("ngForOf", ctx.alerts); } }, dependencies: [i3.NgClass, i3.NgForOf, i3.NgIf, i4.RouterLink, i5.StatusIconComponent, i6.TooltipDirective], encapsulation: 2 }); __decorate([ Debounce(), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, Object]), __metadata("design:returntype", void 0) ], AlertBarComponent.prototype, "assignClamped", null); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AlertBarComponent, [{ type: Component, args: [{ selector: 'sme-alert-bar', template: "<div class=\"sme-layer-notification sme-layout-absolute sme-layout-notification-popup-list\">\r\n\r\n <div *ngFor=\"let alert of alerts\" tabindex=\"0\" (click)=\"openNotificationDetails(alert)\"\r\n class=\"sme-layout-notification-popup sme-shadow-notification-popup sme-margin-right-sm sme-margin-top-sm sme-arrange-stack-h\r\n sme-background-color-alt-5 sme-border-color-alt-5 sme-padding-top-xs sme-padding-left-sm sme-padding-right-xs sme-padding-bottom-xs sme-behavior-hover-trigger\">\r\n\r\n <div class=\"sme-arrange-stack-v\">\r\n <sme-status-icon class=\"sme-padding-right-xs sme-padding-top-xxxs\" [status]=\"getStatusString(alert)\" size=\"16px\"\r\n [title]=\"getIconTitle(alert)\"></sme-status-icon>\r\n <span role=\"button\" *ngIf=\"alert.title && alert.needsClamp\" (click)=\"clickExpand($event, alert)\"\r\n class=\"sme-button-trigger sme-button-auto-width sme-position-flex-none sme-padding-inset-none sme-icon sme-padding-top-xxs sme-behavior-hover-target-show\"\r\n [ngClass]=\"{'sme-icon-chevronDown':alert.isExpanded, 'sme-icon-chevronRight': !alert.isExpanded}\"\r\n [title]=\"strings.MsftSmeShell.Angular.AlertBar.Expand\"></span>\r\n </div>\r\n\r\n <div role=\"alert\" id=\"sme-alert-bar-content\"\r\n class=\"sme-arrange-stack-v sme-arrange-overflow-hide-x sme-arrange-word-wrap-break-word sme-position-stretch-h\">\r\n\r\n <div class=\"sme-layout-notification-message\">\r\n <div class=\"sme-arrange-stack-h\">\r\n <p class=\"sme-screen-reader\">{{ getIconTitle(alert) }}</p>\r\n <p class=\"sme-font-family-bold sme-font-label sme-margin-inset-none sme-padding-top-xxxs sme-position-stretch-h sme-position-left-inline\"\r\n [attr.aria-label]=\"alert.title || alert.message\">{{ alert.title || alert.message }}</p>\r\n </div>\r\n <div class=\"sme-arrange-stack-v\">\r\n <p *ngIf=\"alert.title && !alert.isExpanded\" class=\"sme-font-label\" [attr.aria-label]=\"alert.message\">\r\n {{ alert.message }}\r\n </p>\r\n <p *ngIf=\"alert.title && alert.isExpanded\" class=\"sme-font-label\" [attr.aria-label]=\"alert.message\">\r\n {{ alert.message }}\r\n </p>\r\n\r\n <label *ngIf=\"alert.links\">\r\n <div *ngFor=\"let link of alert.links\">\r\n <a *ngIf=\"link.event\" class=\"sme-link\" (click)=\"link.event();stopClickPropagation($event)\">\r\n {{ link.displayText }}\r\n </a>\r\n <div *ngIf=\"!link.event && link.uri\" (click)=\"stopClickPropagation($event)\">\r\n <a *ngIf=\"link.isExternalLink\" class=\"sme-link\" [href]=\"link.uri\" target=\"_blank\">\r\n {{ link.displayText }}\r\n </a>\r\n <a *ngIf=\"!link.isExternalLink\" class=\"sme-link\" [routerLink]=\"link.uri\">\r\n {{ link.displayText }}\r\n </a>\r\n </div>\r\n </div>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"sme-arrange-stack-h sme-font-label sme-color-base-40\">\r\n <div class=\"sme-position-flex-auto sme-arrange-ellipsis\">{{ alert.nodeName }}</div>\r\n <div class=\"sme-position-flex-none sme-margin-left-xxs\"> {{ alert.timestamp }}</div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"sme-arrange-stack-v\">\r\n <button\r\n class=\"sme-button-trigger sme-button-auto-width sme-position-flex-none sme-padding-inset-none sme-padding-left-xxs sme-padding-right-xxs\"\r\n (click)=\"dismiss(alert)\" [attr.aria-label]=\"strings.MsftSmeShell.Angular.AlertBar.DismissAriaLabel\"\r\n data-uta-id=\"cancel-alert\" aria-describedby=\"sme-alert-bar-content\">\r\n <span class=\"sme-icon sme-icon-cancel\" [title]=\"strings.MsftSmeShell.Angular.AlertBar.Dismiss\"></span>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n" }] }], function () { return [{ type: i0.Injector }, { type: i1.AlertBarService }, { type: i2.DialogService }]; }, { id: [{ type: Input }], assignClamped: [] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2FsZXJ0LWJhci9hbGVydC1iYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvYWxlcnQtYmFyL2FsZXJ0LWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFFeEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNuRixPQUFPLEVBQW1CLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7SUNHaEYsZ0NBR3lEO0lBSEcsd05BQVMsZUFBQSxvQ0FBMEIsQ0FBQSxJQUFDO0lBR3ZDLGlCQUFPOzs7O0lBRDlELCtGQUFpRyw4REFBQTs7O0lBYy9GLDZCQUFxRztJQUNuRyxZQUNGO0lBQUEsaUJBQUk7OztJQUYrRCw4Q0FBaUM7SUFDbEcsZUFDRjtJQURFLGlEQUNGOzs7SUFDQSw2QkFBb0c7SUFDbEcsWUFDRjtJQUFBLGlCQUFJOzs7SUFGOEQsOENBQWlDO0lBQ2pHLGVBQ0Y7SUFERSxpREFDRjs7OztJQUlJLDZCQUEyRjtJQUFwRCw2TkFBUyxnQkFBWSxTQUFDLGVBQUEsb0NBQTRCLENBQUEsSUFBQztJQUN4RixZQUNGO0lBQUEsaUJBQUk7OztJQURGLGVBQ0Y7SUFERSxxREFD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dkIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssU0FBUyxDQUFDLEtBQVk7UUFDMUIsT0FBTyxLQUFLLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQzNGLENBQUM7O3FHQTdLUSxpQkFBaUI7bUdBQWpCLGlCQUFpQjtRQ1o5Qiw4QkFBMkY7UUFFekYsb0VBK0RNO1FBQ1IsaUJBQU07O1FBaEVtQixlQUFTO1FBQVQsb0NBQVM7O0FEaUc5QjtJQUFDLFFBQVEsRUFBRTs7OztzREFHVjt1RkExRlEsaUJBQWlCO2NBSjdCLFNBQVM7MkJBQ0ksZUFBZTtxSEFZbEIsRUFBRTtrQkFEUixLQUFLO1lBZ0ZDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGVib3VuY2UgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2Jhc2UvZGVjb3JhdG9ycy9kZWJvdW5jZS5kZWNvcmF0b3JzJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvcmVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL2Jhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGlhbG9nQ2hhbmdlRXZlbnQsIERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi9kaWFsb2cvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdGF0dXNJY29uVHlwZSB9IGZyb20gJy4uL2ljb24vbGF5ZXJlZC1pY29uL3N0YXR1cy9zdGF0dXMtaWNvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBbGVydCwgQWxlcnRCYXIsIEFsZXJ0QmFyU2VydmljZSwgQWxlcnRTZXZlcml0eSB9IGZyb20gJy4vYWxlcnQtYmFyLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1hbGVydC1iYXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FsZXJ0LWJhci5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFsZXJ0QmFyQ29tcG9uZW50IGV4dGVuZHMgQ29yZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWxlcnRCYXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ0FsZXJ0QmFyQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGlkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGRpYWxvZ1N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gICAgLy8gS2VlcCB0aGUgYXJyYXkgdG8gbWFpbnRhaW4gdGhlIG9yZGVyIG9mIEFsZXJ0cyByZWNlaXZlZC5cclxuICAgIHB1YmxpYyBhbGVydHM6IEFsZXJ0W107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUge0FsZXJ0QmFyQ29tcG9uZW50fSBjbGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gYWxlcnRCYXJTZXJ2aWNlIFRoZSBhbGVydCBzZXJ2aWNlLlxyXG4gICAgICogQHBhcmFtIHJvdXRlciBUaGUgcm91dGVyLlxyXG4gICAgICogQHBhcmFtIGFjdGl2YXRlZFJvdXRlIFRoZSBhY3RpdmF0ZWQgcm91dGUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcclxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBhbGVydEJhclNlcnZpY2U6IEFsZXJ0QmFyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UpIHtcclxuICAgICAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1ldGhvZCB0byBydW4gd2hlbiB0aGUgY29tcG9uZW50IGlzIGluaXRpYWxpemVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hbGVydHMgPSBbXTtcclxuICAgICAgICB0aGlzLmFsZXJ0QmFyU2VydmljZS5yZWdpc3Rlcih0aGlzLCB0aGlzLmlkKTtcclxuXHJcbiAgICAgICAgdGhpcy5kaWFsb2dTdWJzY3JpcHRpb25zLnB1c2godGhpcy5kaWFsb2dTZXJ2aWNlLmNoYW5nZWQuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGFsZXJ0cyBpZiB0aGUgbm90aWZpY2F0aW9uIGRpYWxvZyBvcGVuc1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGlhbG9nSWQgPT09IHRoaXMuZGlhbG9nU2VydmljZS5jb21tb25JZHMubm90aWZpY2F0aW9uc1BhbmUgJiYgZXZlbnQuY2hhbmdlRXZlbnQgPT09IERpYWxvZ0NoYW5nZUV2ZW50LlNob3cpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWxlcnRzID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWV0aG9kIHRvIHJ1biB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hbGVydEJhclNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmlkKTtcclxuICAgICAgICBpZiAodGhpcy5kaWFsb2dTdWJzY3JpcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWI/LnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9wZW4gZGV0YWlscyB2aWV3IGluIG5vdGlmaWNhdGlvbiBwYW5lXHJcbiAgICAgKiBAcGFyYW0gYWxlcnQgdGhlIGFsZXJ0IGNsaWNrZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9wZW5Ob3RpZmljYXRpb25EZXRhaWxzKGFsZXJ0OiBBbGVydCkge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nU3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvdyh0aGlzLmRpYWxvZ1NlcnZpY2UuY29tbW9uSWRzLm5vdGlmaWNhdGlvbnNQYW5lLCB7IGlkOiBhbGVydC5pZCB9KS5zdWJzY3JpYmUoKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjbGljayB0aGUgbWVzc2FnZSBleHBhbmQgYnV0dG9uXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50XHJcbiAgICAgKiBAcGFyYW0gYWxlcnQgdGhlIGFsZXJ0IGNsaWNrZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsaWNrRXhwYW5kKGV2ZW50OiBFdmVudCwgYWxlcnQ6IEFsZXJ0KSB7XHJcbiAgICAgICAgYWxlcnQuaXNFeHBhbmRlZCA9ICFhbGVydC5pc0V4cGFuZGVkO1xyXG4gICAgICAgIHRoaXMuc3RvcENsaWNrUHJvcGFnYXRpb24oZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogc3RvcCBwcm9wYWdhdGlvbiBvbiB0aGUgZXZlbnRcclxuICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgdG8gc3RvcFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RvcENsaWNrUHJvcGFnYXRpb24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc3NpZ25zIG5lZWRzQ2xhbXAgcHJvcGVybHkgdG8gZ2l2ZW4gYWxlcnRcclxuICAgICAqIEBwYXJhbSBhbGVydCB0aGUgYWxlcnRcclxuICAgICAqIEBwYXJhbSBldmVudCB0aGUgY2xhbXBlZCBldmVudFxyXG4gICAgICovXHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHVibGljIGFzc2lnbkNsYW1wZWQoYWxlcnQ6IEFsZXJ0LCBldmVudDogYW55KSB7XHJcbiAgICAgICAgYWxlcnQubmVlZHNDbGFtcCA9IGV2ZW50LmNsYW1wZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBzdGF0dXMgc3RyaW5nIGZvciB0aGUgc3RhdHVzIGljb25cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gYWxlcnQgVGhlIGFsZXJ0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U3RhdHVzU3RyaW5nKGFsZXJ0OiBBbGVydCk6IFN0YXR1c0ljb25UeXBlIHtcclxuICAgICAgICBzd2l0Y2ggKGFsZXJ0LnNldmVyaXR5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgQWxlcnRTZXZlcml0eS5FcnJvcjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXNJY29uVHlwZS5FcnJvcjtcclxuICAgICAgICAgICAgY2FzZSBBbGVydFNldmVyaXR5Lldhcm5pbmc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzSWNvblR5cGUuV2FybmluZztcclxuICAgICAgICAgICAgY2FzZSBBbGVydFNldmVyaXR5LlN1Y2Nlc3M6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzSWNvblR5cGUuU3VjY2VzcztcclxuICAgICAgICAgICAgY2FzZSBBbGVydFNldmVyaXR5LkluUHJvZ3Jlc3M6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzSWNvblR5cGUuUHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgIGNhc2UgQWxlcnRTZXZlcml0eS5JbmZvcm1hdGlvbmFsOlxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1c0ljb25UeXBlLkluZm87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJY29uVGl0bGUoYWxlcnQ6IEFsZXJ0KTogc3RyaW5nIHtcclxuICAgICAgICBzd2l0Y2ggKGFsZXJ0LnNldmVyaXR5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgQWxlcnRTZXZlcml0eS5FcnJvcjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQWxlcnRCYXIuRXJyb3I7XHJcbiAgICAgICAgICAgIGNhc2UgQWxlcnRTZXZlcml0eS5XYXJuaW5nOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5BbGVydEJhci5XYXJuaW5nO1xyXG4gICAgICAgICAgICBjYXNlIEFsZXJ0U2V2ZXJpdHkuU3VjY2VzczpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQWxlcnRCYXIuU3VjY2VzcztcclxuICAgICAgICAgICAgY2FzZSBBbGVydFNldmVyaXR5LkluUHJvZ3Jlc3M6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkFsZXJ0QmFyLkluUHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgIGNhc2UgQWxlcnRTZXZlcml0eS5JbmZvcm1hdGlvbmFsOlxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5BbGVydEJhci5JbmZvcm1hdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93cyBhbiBhbGVydC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gYWxlcnQgVGhlIGFsZXJ0IHRvIHNob3cuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG93KGFsZXJ0OiBBbGVydCk6IHZvaWQge1xyXG4gICAgICAgIC8vIGRvbid0IHNob3cgcG9wdXAgaWYgbm90aWZpY2F0aW9ucyBhcmUgYWxyZWFkeSBvcGVuXHJcbiAgICAgICAgaWYgKCFNc2Z0U21lLmZpbmQodGhpcy5kaWFsb2dTZXJ2aWNlLmFjdGl2ZURpYWxvZ3NTdGFjaywgZGlhbG9nID0+IGRpYWxvZy5pZCA9PT0gdGhpcy5kaWFsb2dTZXJ2aWNlLmNvbW1vbklkcy5ub3RpZmljYXRpb25zUGFuZSkpIHtcclxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdBbGVydCA9IHRoaXMuYWxlcnRzLmZpbmQoeCA9PiB4LmlkID09PSBhbGVydC5pZCB8fCB0aGlzLmluZGV4TmFtZSh4KSA9PT0gdGhpcy5pbmRleE5hbWUoYWxlcnQpKTtcclxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQWxlcnQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0FsZXJ0LnNldFRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZXhpc3RpbmdBbGVydC5zZXRUaW1lb3V0KTtcclxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FsZXJ0LnNldFRpbWVvdXQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzbWlzcyhleGlzdGluZ0FsZXJ0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGFsZXJ0LnNldFRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhbGVydC5zZXRUaW1lb3V0KTtcclxuICAgICAgICAgICAgICAgIGFsZXJ0LnNldFRpbWVvdXQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFsZXJ0cy51bnNoaWZ0KGFsZXJ0KTtcclxuICAgICAgICAgICAgYWxlcnQuc2V0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmRpc21pc3MoYWxlcnQpOyB9LCA3MDAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNtaXNzZXMgYW4gYWxlcnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGFsZXJ0IFRoZSBhbGVydCB0byBkaXNtaXNzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzbWlzcyhhbGVydDogQWxlcnQpOiB2b2lkIHtcclxuICAgICAgICBNc2Z0U21lLnJlbW92ZSh0aGlzLmFsZXJ0cywgYWxlcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIHRoZSBpbmRleCBuYW1lIGluIG1hcCBjb2xsZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhbGVydCB0aGUgYWxlcnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpbmRleE5hbWUoYWxlcnQ6IEFsZXJ0KTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYWxlcnQuc2V2ZXJpdHkgKyAnOicgKyBhbGVydC50aXRsZSArICc6JyArIGFsZXJ0Lm1lc3NhZ2UgKyAnOicgKyBhbGVydC5ub2RlTmFtZTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwic21lLWxheWVyLW5vdGlmaWNhdGlvbiBzbWUtbGF5b3V0LWFic29sdXRlIHNtZS1sYXlvdXQtbm90aWZpY2F0aW9uLXBvcHVwLWxpc3RcIj5cclxuXHJcbiAgPGRpdiAqbmdGb3I9XCJsZXQgYWxlcnQgb2YgYWxlcnRzXCIgdGFiaW5kZXg9XCIwXCIgKGNsaWNrKT1cIm9wZW5Ob3RpZmljYXRpb25EZXRhaWxzKGFsZXJ0KVwiXHJcbiAgICBjbGFzcz1cInNtZS1sYXlvdXQtbm90aWZpY2F0aW9uLXBvcHVwIHNtZS1zaGFkb3ctbm90aWZpY2F0aW9uLXBvcHVwIHNtZS1tYXJnaW4tcmlnaHQtc20gc21lLW1hcmdpbi10b3Atc20gc21lLWFycmFuZ2Utc3RhY2staFxyXG4gICAgc21lLWJhY2tncm91bmQtY29sb3ItYWx0LTUgc21lLWJvcmRlci1jb2xvci1hbHQtNSBzbWUtcGFkZGluZy10b3AteHMgc21lLXBhZGRpbmctbGVmdC1zbSBzbWUtcGFkZGluZy1yaWdodC14cyBzbWUtcGFkZGluZy1ib3R0b20teHMgc21lLWJlaGF2aW9yLWhvdmVyLXRyaWdnZXJcIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2stdlwiPlxyXG4gICAgICA8c21lLXN0YXR1cy1pY29uIGNsYXNzPVwic21lLXBhZGRpbmctcmlnaHQteHMgc21lLXBhZGRpbmctdG9wLXh4eHNcIiBbc3RhdHVzXT1cImdldFN0YXR1c1N0cmluZyhhbGVydClcIiBzaXplPVwiMTZweFwiXHJcbiAgICAgICAgW3RpdGxlXT1cImdldEljb25UaXRsZShhbGVydClcIj48L3NtZS1zdGF0dXMtaWNvbj5cclxuICAgICAgPHNwYW4gcm9sZT1cImJ1dHRvblwiICpuZ0lmPVwiYWxlcnQudGl0bGUgJiYgYWxlcnQubmVlZHNDbGFtcFwiIChjbGljayk9XCJjbGlja0V4cGFuZCgkZXZlbnQsIGFsZXJ0KVwiXHJcbiAgICAgICAgY2xhc3M9XCJzbWUtYnV0dG9uLXRyaWdnZXIgc21lLWJ1dHRvbi1hdXRvLXdpZHRoIHNtZS1wb3NpdGlvbi1mbGV4LW5vbmUgc21lLXBhZGRpbmctaW5zZXQtbm9uZSBzbWUtaWNvbiBzbWUtcGFkZGluZy10b3AteHhzIHNtZS1iZWhhdmlvci1ob3Zlci10YXJnZXQtc2hvd1wiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi1jaGV2cm9uRG93bic6YWxlcnQuaXNFeHBhbmRlZCwgJ3NtZS1pY29uLWNoZXZyb25SaWdodCc6ICFhbGVydC5pc0V4cGFuZGVkfVwiXHJcbiAgICAgICAgW3RpdGxlXT1cInN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQWxlcnRCYXIuRXhwYW5kXCI+PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiByb2xlPVwiYWxlcnRcIiBpZD1cInNtZS1hbGVydC1iYXItY29udGVudFwiXHJcbiAgICAgIGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2stdiBzbWUtYXJyYW5nZS1vdmVyZmxvdy1oaWRlLXggc21lLWFycmFuZ2Utd29yZC13cmFwLWJyZWFrLXdvcmQgc21lLXBvc2l0aW9uLXN0cmV0Y2gtaFwiPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtZS1sYXlvdXQtbm90aWZpY2F0aW9uLW1lc3NhZ2VcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2staFwiPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJzbWUtc2NyZWVuLXJlYWRlclwiPnt7IGdldEljb25UaXRsZShhbGVydCkgfX08L3A+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cInNtZS1mb250LWZhbWlseS1ib2xkIHNtZS1mb250LWxhYmVsIHNtZS1tYXJnaW4taW5zZXQtbm9uZSBzbWUtcGFkZGluZy10b3AteHh4cyBzbWUtcG9zaXRpb24tc3RyZXRjaC1oIHNtZS1wb3NpdGlvbi1sZWZ0LWlubGluZVwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYWxlcnQudGl0bGUgfHwgYWxlcnQubWVzc2FnZVwiPnt7IGFsZXJ0LnRpdGxlIHx8IGFsZXJ0Lm1lc3NhZ2UgfX08L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNtZS1hcnJhbmdlLXN0YWNrLXZcIj5cclxuICAgICAgICAgIDxwICpuZ0lmPVwiYWxlcnQudGl0bGUgJiYgIWFsZXJ0LmlzRXhwYW5kZWRcIiBjbGFzcz1cInNtZS1mb250LWxhYmVsXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJhbGVydC5tZXNzYWdlXCI+XHJcbiAgICAgICAgICAgIHt7IGFsZXJ0Lm1lc3NhZ2UgfX1cclxuICAgICAgICAgIDwvcD5cclxuICAgICAgICAgIDxwICpuZ0lmPVwiYWxlcnQudGl0bGUgJiYgYWxlcnQuaXNFeHBhbmRlZFwiIGNsYXNzPVwic21lLWZvbnQtbGFiZWxcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImFsZXJ0Lm1lc3NhZ2VcIj5cclxuICAgICAgICAgICAge3sgYWxlcnQubWVzc2FnZSB9fVxyXG4gICAgICAgICAgPC9wPlxyXG5cclxuICAgICAgICAgIDxsYWJlbCAqbmdJZj1cImFsZXJ0LmxpbmtzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGxpbmsgb2YgYWxlcnQubGlua3NcIj5cclxuICAgICAgICAgICAgICA8YSAqbmdJZj1cImxpbmsuZXZlbnRcIiBjbGFzcz1cInNtZS1saW5rXCIgKGNsaWNrKT1cImxpbmsuZXZlbnQoKTtzdG9wQ2xpY2tQcm9wYWdhdGlvbigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBsaW5rLmRpc3BsYXlUZXh0IH19XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhbGluay5ldmVudCAmJiBsaW5rLnVyaVwiIChjbGljayk9XCJzdG9wQ2xpY2tQcm9wYWdhdGlvbigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8YSAqbmdJZj1cImxpbmsuaXNFeHRlcm5hbExpbmtcIiBjbGFzcz1cInNtZS1saW5rXCIgW2hyZWZdPVwibGluay51cmlcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cclxuICAgICAgICAgICAgICAgICAge3sgbGluay5kaXNwbGF5VGV4dCB9fVxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgPGEgKm5nSWY9XCIhbGluay5pc0V4dGVybmFsTGlua1wiIGNsYXNzPVwic21lLWxpbmtcIiBbcm91dGVyTGlua109XCJsaW5rLnVyaVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBsaW5rLmRpc3BsYXlUZXh0IH19XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay1oIHNtZS1mb250LWxhYmVsIHNtZS1jb2xvci1iYXNlLTQwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNtZS1wb3NpdGlvbi1mbGV4LWF1dG8gc21lLWFycmFuZ2UtZWxsaXBzaXNcIj57eyBhbGVydC5ub2RlTmFtZSB9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtcG9zaXRpb24tZmxleC1ub25lIHNtZS1tYXJnaW4tbGVmdC14eHNcIj4ge3sgYWxlcnQudGltZXN0YW1wIH19PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay12XCI+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBjbGFzcz1cInNtZS1idXR0b24tdHJpZ2dlciBzbWUtYnV0dG9uLWF1dG8td2lkdGggc21lLXBvc2l0aW9uLWZsZXgtbm9uZSBzbWUtcGFkZGluZy1pbnNldC1ub25lIHNtZS1wYWRkaW5nLWxlZnQteHhzIHNtZS1wYWRkaW5nLXJpZ2h0LXh4c1wiXHJcbiAgICAgICAgKGNsaWNrKT1cImRpc21pc3MoYWxlcnQpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJzdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkFsZXJ0QmFyLkRpc21pc3NBcmlhTGFiZWxcIlxyXG4gICAgICAgIGRhdGEtdXRhLWlkPVwiY2FuY2VsLWFsZXJ0XCIgYXJpYS1kZXNjcmliZWRieT1cInNtZS1hbGVydC1iYXItY29udGVudFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLWljb24tY2FuY2VsXCIgW3RpdGxlXT1cInN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQWxlcnRCYXIuRGlzbWlzc1wiPjwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=