@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
153 lines • 23.7 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, Injector, Input, Output, ViewChild } from '@angular/core';
import { CapacityBase } from '../../common/capacity-base.component';
import { DoughnutChartComponent } from '../doughnut-chart.component';
import { LegendPosition } from '../legend-position';
import * as i0 from "@angular/core";
import * as i1 from "../doughnut-chart.component";
const _c0 = ["chart"];
export class CapacityDoughnutChartComponent extends CapacityBase {
constructor(injector, changeDetectorRef) {
super(injector);
this.changeDetectorRef = changeDetectorRef;
/**
* The legend data to put into the legend
* If legend is not specified, it will automatically be generated
*/
this.legendData = [];
/**
* Whether to display the chart title
* Defaults to true
*/
this.showTitle = true;
/**
* List of data for the doughnut chart
*/
this.capacityChartData = [];
this.tooltipToggled = new EventEmitter();
this.doughnutChartData = [];
this.showLegend = true;
this.width = '180px';
this.legendPosition = LegendPosition.Top;
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'CapacityDoughnutChartComponent';
}
/**
* Emits tool tip toggled event
* @deprecated since 9/25/2019. Please use 'tooltipToggled' instead
*/
// eslint-disable-next-line @angular-eslint/no-output-on-prefix
get onTooltipToggle() {
return this.tooltipToggled;
}
ngOnInit() {
this.updateChartData();
}
updateChartData() {
let amountUsed = 0;
// Check if capacityChartData is defined and contains elements avoid TypeError: Cannot read property 'foreach' of undefined
if (this.capacityChartData && this.capacityChartData.length > 0) {
this.capacityChartData.forEach(x => amountUsed += x.value);
// Default total when not provided to sum of capacityChartData
this.total = !this.total ? amountUsed : this.total;
if (!this.total || this.total <= 0 || this.total < amountUsed) {
throw new Error('Total must be defined as greater than both zero and the sum of values in the chart');
}
}
const amountFree = this.total - amountUsed;
// 0/0 evaluates to NaN. Condition added to set value to 0 when this is encountered
const fractionUsed = amountUsed > 0 ? amountUsed / this.total : 0;
const percentUsed = MsftSme.round(fractionUsed * 100, 1);
this.percentUsedText = '{0}%'.format(percentUsed);
const colorScheme = this.getColorScheme(amountUsed);
if (this.capacityChartData.length > colorScheme.length) {
throw new Error('Too many data entries for a capacity doughnut chart. Please use a generic doughnut chart with color scheme specified.');
}
this.stateString = this.getStateString(amountUsed);
this.doughnutChartData = [];
for (let i = 0; i < this.capacityChartData.length; i++) {
const valuePercent = MsftSme.round(this.capacityChartData[i].value / this.total * 100, 1);
this.doughnutChartData.push({
label: this.capacityChartData[i].label,
value: this.capacityChartData[i].value,
displayValue: '{0}%'.format(valuePercent),
color: colorScheme[i],
showLegend: true
});
}
// 0/0 evaluates to NaN. Condition added to set value to 0 when this is encountered
const fractionFree = amountFree > 0 ? amountFree / this.total : 0;
const percentFree = MsftSme.round(fractionFree * 100, 1);
this.doughnutChartData.push({
label: this.strings.MsftSmeShell.Angular.Common.free,
value: amountFree,
displayValue: '{0}%'.format(percentFree),
color: CapacityDoughnutChartComponent.defaults.freeColor,
showLegend: false
});
}
/**
* emit tool tip event
*/
toggleTooltip() {
this.tooltipToggled.emit();
}
/**
* refresh the chart data
*/
refresh() {
this.updateChartData();
// TODO: figure out if there is a way to reliably refresh without detect changes
this.changeDetectorRef.detectChanges();
this.chart.refresh();
}
ngOnDestroy() {
this.changeDetectorRef.detach();
}
}
/** @nocollapse */ CapacityDoughnutChartComponent.ɵfac = function CapacityDoughnutChartComponent_Factory(t) { return new (t || CapacityDoughnutChartComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
/** @nocollapse */ CapacityDoughnutChartComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: CapacityDoughnutChartComponent, selectors: [["sme-capacity-doughnut-chart"]], viewQuery: function CapacityDoughnutChartComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.chart = _t.first);
} }, inputs: { showLegend: "showLegend", legendData: "legendData", chartTitle: "chartTitle", showTitle: "showTitle", capacityChartData: "capacityChartData", centerChartSubtext: "centerChartSubtext", tooltipTitle: "tooltipTitle", width: "width", refreshIntervalString: "refreshIntervalString", legendPosition: "legendPosition" }, outputs: { onTooltipToggle: "onTooltipToggle", tooltipToggled: "tooltipToggled" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 12, consts: [[3, "legendData", "showLegend", "legendPosition", "chartTitle", "showTitle", "doughnutChartData", "centerChartText", "centerChartSubtext", "tooltipTitle", "width", "refreshIntervalString", "stateString"], ["chart", ""]], template: function CapacityDoughnutChartComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-doughnut-chart", 0, 1);
} if (rf & 2) {
i0.ɵɵproperty("legendData", ctx.legendData)("showLegend", ctx.showLegend)("legendPosition", ctx.legendPosition)("chartTitle", ctx.chartTitle)("showTitle", ctx.showTitle)("doughnutChartData", ctx.doughnutChartData)("centerChartText", ctx.percentUsedText)("centerChartSubtext", ctx.centerChartSubtext)("tooltipTitle", ctx.tooltipTitle)("width", ctx.width)("refreshIntervalString", ctx.refreshIntervalString)("stateString", ctx.stateString);
} }, dependencies: [i1.DoughnutChartComponent], encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CapacityDoughnutChartComponent, [{
type: Component,
args: [{ selector: 'sme-capacity-doughnut-chart', template: "<sme-doughnut-chart #chart [legendData]=\"legendData\" [showLegend]=\"showLegend\" [legendPosition]=\"legendPosition\" [chartTitle]=\"chartTitle\" [showTitle]=\"showTitle\" [doughnutChartData]=\"doughnutChartData\" [centerChartText]=\"percentUsedText\"\r\n [centerChartSubtext]=\"centerChartSubtext\" [tooltipTitle]=\"tooltipTitle\" [width]=\"width\" [refreshIntervalString]=\"refreshIntervalString\" [stateString]=\"stateString\"></sme-doughnut-chart>\r\n" }]
}], function () { return [{ type: i0.Injector }, { type: i0.ChangeDetectorRef }]; }, { showLegend: [{
type: Input
}], legendData: [{
type: Input
}], chartTitle: [{
type: Input
}], showTitle: [{
type: Input
}], capacityChartData: [{
type: Input
}], centerChartSubtext: [{
type: Input
}], tooltipTitle: [{
type: Input
}], width: [{
type: Input
}], refreshIntervalString: [{
type: Input
}], legendPosition: [{
type: Input
}], onTooltipToggle: [{
type: Output
}], tooltipToggled: [{
type: Output
}], chart: [{
type: ViewChild,
args: ['chart']
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwYWNpdHktZG91Z2hudXQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZG91Z2hudXQtY2hhcnQvY2FwYWNpdHktZG91Z2hudXQtY2hhcnQvY2FwYWNpdHktZG91Z2hudXQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZG91Z2hudXQtY2hhcnQvY2FwYWNpdHktZG91Z2hudXQtY2hhcnQvY2FwYWNpdHktZG91Z2hudXQtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFxQixNQUFNLDZCQUE2QixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7OztBQWtCcEQsTUFBTSxPQUFPLDhCQUErQixTQUFRLFlBQVk7SUErRTVELFlBQVksUUFBa0IsRUFBVSxpQkFBb0M7UUFDeEUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRG9CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFoRTVFOzs7V0FHRztRQUNhLGVBQVUsR0FBc0IsRUFBRSxDQUFDO1FBT25EOzs7V0FHRztRQUNhLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFFakM7O1dBRUc7UUFDYSxzQkFBaUIsR0FBZ0MsRUFBRSxDQUFDO1FBcUNuRCxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFJcEQsc0JBQWlCLEdB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O1FBRGhLLDJDQUF5Qiw4QkFBQSxzQ0FBQSw4QkFBQSw0QkFBQSw0Q0FBQSx3Q0FBQSw4Q0FBQSxrQ0FBQSxvQkFBQSxvREFBQSxnQ0FBQTs7dUZEc0J2Qyw4QkFBOEI7Y0FKMUMsU0FBUzsyQkFDSSw2QkFBNkI7MkZBZ0J2QixVQUFVO2tCQUF6QixLQUFLO1lBTVUsVUFBVTtrQkFBekIsS0FBSztZQUtVLFVBQVU7a0JBQXpCLEtBQUs7WUFNVSxTQUFTO2tCQUF4QixLQUFLO1lBS1UsaUJBQWlCO2tCQUFoQyxLQUFLO1lBS1Usa0JBQWtCO2tCQUFqQyxLQUFLO1lBS1UsWUFBWTtrQkFBM0IsS0FBSztZQUtVLEtBQUs7a0JBQXBCLEtBQUs7WUFPVSxxQkFBcUI7a0JBQXBDLEtBQUs7WUFLVSxjQUFjO2tCQUE3QixLQUFLO1lBT2UsZUFBZTtrQkFBbkMsTUFBTTtZQUdVLGNBQWM7a0JBQTlCLE1BQU07WUFDb0IsS0FBSztrQkFBL0IsU0FBUzttQkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDYXBhY2l0eUJhc2UgfSBmcm9tICcuLi8uLi9jb21tb24vY2FwYWNpdHktYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMZWdlbmRFbnRyeURhdGEgfSBmcm9tICcuLi8uLi9sZWdlbmQvbGVnZW5kLWVudHJ5L2xlZ2VuZC1lbnRyeS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEb3VnaG51dENoYXJ0Q29tcG9uZW50LCBEb3VnaG51dENoYXJ0RGF0YSB9IGZyb20gJy4uL2RvdWdobnV0LWNoYXJ0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExlZ2VuZFBvc2l0aW9uIH0gZnJvbSAnLi4vbGVnZW5kLXBvc2l0aW9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2FwYWNpdHlEb3VnaG51dENoYXJ0RGF0YSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsYWJlbCBmb3IgdGhlIGRhdGEgc2VnbWVudFxyXG4gICAgICovXHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBkYXRhIHNlZ21lbnRcclxuICAgICAqL1xyXG4gICAgdmFsdWU6IG51bWJlcjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1jYXBhY2l0eS1kb3VnaG51dC1jaGFydCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FwYWNpdHktZG91Z2hudXQtY2hhcnQuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXBhY2l0eURvdWdobnV0Q2hhcnRDb21wb25lbnQgZXh0ZW5kcyBDYXBhY2l0eUJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ0NhcGFjaXR5RG91Z2hudXRDaGFydENvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byB1c2UgYSBnZW5lcmF0ZWQgbGVnZW5kXHJcbiAgICAgKiBJZiBsZWdlbmREYXRhIGlzIHNwZWNpZmllZCwgYSBsZWdlbmQgd2lsbCBiZSBzaG93biByZWdhcmRsZXNzIG9mIHNob3dMZWdlbmQgdmFsdWVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHNob3dMZWdlbmQ6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGVnZW5kIGRhdGEgdG8gcHV0IGludG8gdGhlIGxlZ2VuZFxyXG4gICAgICogSWYgbGVnZW5kIGlzIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBnZW5lcmF0ZWRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGxlZ2VuZERhdGE6IExlZ2VuZEVudHJ5RGF0YVtdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaXRsZSBzaG93biBmb3IgdGhlIGNoYXJ0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjaGFydFRpdGxlOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRvIGRpc3BsYXkgdGhlIGNoYXJ0IHRpdGxlXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93VGl0bGUgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdCBvZiBkYXRhIGZvciB0aGUgZG91Z2hudXQgY2hhcnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGNhcGFjaXR5Q2hhcnREYXRhOiBDYXBhY2l0eURvdWdobnV0Q2hhcnREYXRhW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN1YnRleHQgdG8gYmUgc2hvd24gaW4gdGhlIGNlbnRlciBvZiB0aGUgY2hhcnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGNlbnRlckNoYXJ0U3VidGV4dDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBnaXZlIGFkZGl0aW9uYWwgb3B0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRvdWdobnV0IGNoYXJ0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB0b29sdGlwVGl0bGU6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBjaGFydC4gQ2FuIGJlIGFueSB2YWxpZCBjc3Mgd2lkdGggdmFsdWUuIERlZmF1bHRzIHRvIDE4MHB4XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB3aWR0aDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzdHJpbmcgZXhwbGFpbmluZyB0aGUgaG93IG9mdGVuIHRoZSBjaGFydCByZWZyZXNoZXMsIGlmIGFwcGxpY2FibGVcclxuICAgICAqIEV4cGVjdCBzdHJpbmdzIGxpa2UgXCIzIG1pbnV0ZXNcIiBhbmQgXCIzMCBzZWNvbmRzXCJcclxuICAgICAqIFVzZWQgZm9yIGFyaWEtbGFiZWwgb2YgY2hhcnQgaW4gc2VudGVuY2UgXCJDaGFydCByZWZyZXNoZXMgZXZlcnkgPHJlZnJlc2hJbnRlcnZhbFN0cmluZz5cIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcmVmcmVzaEludGVydmFsU3RyaW5nPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHBvc2l0aW9uIG9mIHRoZSBsZWdlbmQgcmVsYXRpdmUgdG8gdGhlIGNoYXJ0LiBDdXJyZW50bHkgc3VwcG9ydGVkIG9wdGlvbnMgYXJlICd0b3AnIGFuZCAncmlnaHQnXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsZWdlbmRQb3NpdGlvbj86IExlZ2VuZFBvc2l0aW9uLkJpbmRhYmxlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdHMgdG9vbCB0aXAgdG9nZ2xlZCBldmVudFxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICd0b29sdGlwVG9nZ2xlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uVG9vbHRpcFRvZ2dsZSgpOiBFdmVudEVtaXR0ZXI8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvb2x0aXBUb2dnbGVkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyB0b29sdGlwVG9nZ2xlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAgIEBWaWV3Q2hpbGQoJ2NoYXJ0JykgcHVibGljIGNoYXJ0OiBEb3VnaG51dENoYXJ0Q29tcG9uZW50O1xyXG5cclxuICAgIHB1YmxpYyBwZXJjZW50VXNlZFRleHQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBkb3VnaG51dENoYXJ0RGF0YTogRG91Z2hudXRDaGFydERhdGFbXSA9IFtdO1xyXG4gICAgcHVibGljIHN0YXRlU3RyaW5nOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICB0aGlzLnNob3dMZWdlbmQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMud2lkdGggPSAnMTgwcHgnO1xyXG4gICAgICAgIHRoaXMubGVnZW5kUG9zaXRpb24gPSBMZWdlbmRQb3NpdGlvbi5Ub3A7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2hhcnREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVDaGFydERhdGEoKSB7XHJcblxyXG4gICAgICAgIGxldCBhbW91bnRVc2VkID0gMDtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgY2FwYWNpdHlDaGFydERhdGEgaXMgZGVmaW5lZCBhbmQgY29udGFpbnMgZWxlbWVudHMgYXZvaWQgVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0eSAnZm9yZWFjaCcgb2YgdW5kZWZpbmVkXHJcbiAgICAgICAgaWYgKHRoaXMuY2FwYWNpdHlDaGFydERhdGEgJiYgdGhpcy5jYXBhY2l0eUNoYXJ0RGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FwYWNpdHlDaGFydERhdGEuZm9yRWFjaCh4ID0+IGFtb3VudFVzZWQgKz0geC52YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBEZWZhdWx0IHRvdGFsIHdoZW4gbm90IHByb3ZpZGVkIHRvIHN1bSBvZiBjYXBhY2l0eUNoYXJ0RGF0YVxyXG4gICAgICAgICAgICB0aGlzLnRvdGFsID0gIXRoaXMudG90YWwgPyBhbW91bnRVc2VkIDogdGhpcy50b3RhbDtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnRvdGFsIHx8IHRoaXMudG90YWwgPD0gMCB8fCB0aGlzLnRvdGFsIDwgYW1vdW50VXNlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb3RhbCBtdXN0IGJlIGRlZmluZWQgYXMgZ3JlYXRlciB0aGFuIGJvdGggemVybyBhbmQgdGhlIHN1bSBvZiB2YWx1ZXMgaW4gdGhlIGNoYXJ0Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFtb3VudEZyZWUgPSB0aGlzLnRvdGFsIC0gYW1vdW50VXNlZDtcclxuXHJcbiAgICAgICAgLy8gMC8wIGV2YWx1YXRlcyB0byBOYU4uIENvbmRpdGlvbiBhZGRlZCB0byBzZXQgdmFsdWUgdG8gMCB3aGVuIHRoaXMgaXMgZW5jb3VudGVyZWRcclxuICAgICAgICBjb25zdCBmcmFjdGlvblVzZWQgPSBhbW91bnRVc2VkID4gMCA/IGFtb3VudFVzZWQgLyB0aGlzLnRvdGFsIDogMDtcclxuICAgICAgICBjb25zdCBwZXJjZW50VXNlZCA9IE1zZnRTbWUucm91bmQoZnJhY3Rpb25Vc2VkICogMTAwLCAxKTtcclxuICAgICAgICB0aGlzLnBlcmNlbnRVc2VkVGV4dCA9ICd7MH0lJy5mb3JtYXQocGVyY2VudFVzZWQpO1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvclNjaGVtZSA9IHRoaXMuZ2V0Q29sb3JTY2hlbWUoYW1vdW50VXNlZCk7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FwYWNpdHlDaGFydERhdGEubGVuZ3RoID4gY29sb3JTY2hlbWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICdUb28gbWFueSBkYXRhIGVudHJpZXMgZm9yIGEgY2FwYWNpdHkgZG91Z2hudXQgY2hhcnQuIFBsZWFzZSB1c2UgYSBnZW5lcmljIGRvdWdobnV0IGNoYXJ0IHdpdGggY29sb3Igc2NoZW1lIHNwZWNpZmllZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGVTdHJpbmcgPSB0aGlzLmdldFN0YXRlU3RyaW5nKGFtb3VudFVzZWQpO1xyXG5cclxuICAgICAgICB0aGlzLmRvdWdobnV0Q2hhcnREYXRhID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNhcGFjaXR5Q2hhcnREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUGVyY2VudCA9IE1zZnRTbWUucm91bmQodGhpcy5jYXBhY2l0eUNoYXJ0RGF0YVtpXS52YWx1ZSAvIHRoaXMudG90YWwgKiAxMDAsIDEpO1xyXG4gICAgICAgICAgICB0aGlzLmRvdWdobnV0Q2hhcnREYXRhLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuY2FwYWNpdHlDaGFydERhdGFbaV0ubGFiZWwsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jYXBhY2l0eUNoYXJ0RGF0YVtpXS52YWx1ZSxcclxuICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogJ3swfSUnLmZvcm1hdCh2YWx1ZVBlcmNlbnQpLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IGNvbG9yU2NoZW1lW2ldLFxyXG4gICAgICAgICAgICAgICAgc2hvd0xlZ2VuZDogdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIDAvMCBldmFsdWF0ZXMgdG8gTmFOLiBDb25kaXRpb24gYWRkZWQgdG8gc2V0IHZhbHVlIHRvIDAgd2hlbiB0aGlzIGlzIGVuY291bnRlcmVkXHJcbiAgICAgICAgY29uc3QgZnJhY3Rpb25GcmVlID0gYW1vdW50RnJlZSA+IDAgPyBhbW91bnRGcmVlIC8gdGhpcy50b3RhbCA6IDA7XHJcbiAgICAgICAgY29uc3QgcGVyY2VudEZyZWUgPSBNc2Z0U21lLnJvdW5kKGZyYWN0aW9uRnJlZSAqIDEwMCwgMSk7XHJcbiAgICAgICAgdGhpcy5kb3VnaG51dENoYXJ0RGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgbGFiZWw6IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Db21tb24uZnJlZSxcclxuICAgICAgICAgICAgdmFsdWU6IGFtb3VudEZyZWUsXHJcbiAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogJ3swfSUnLmZvcm1hdChwZXJjZW50RnJlZSksXHJcbiAgICAgICAgICAgIGNvbG9yOiBDYXBhY2l0eURvdWdobnV0Q2hhcnRDb21wb25lbnQuZGVmYXVsdHMuZnJlZUNvbG9yLFxyXG4gICAgICAgICAgICBzaG93TGVnZW5kOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogZW1pdCB0b29sIHRpcCBldmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9nZ2xlVG9vbHRpcCgpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBUb2dnbGVkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJlZnJlc2ggdGhlIGNoYXJ0IGRhdGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZnJlc2goKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDaGFydERhdGEoKTtcclxuXHJcbiAgICAgICAgLy8gVE9ETzogZmlndXJlIG91dCBpZiB0aGVyZSBpcyBhIHdheSB0byByZWxpYWJseSByZWZyZXNoIHdpdGhvdXQgZGV0ZWN0IGNoYW5nZXNcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLmNoYXJ0LnJlZnJlc2goKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRhY2goKTtcclxuICAgIH1cclxufVxyXG4iLCI8c21lLWRvdWdobnV0LWNoYXJ0ICNjaGFydCBbbGVnZW5kRGF0YV09XCJsZWdlbmREYXRhXCIgW3Nob3dMZWdlbmRdPVwic2hvd0xlZ2VuZFwiIFtsZWdlbmRQb3NpdGlvbl09XCJsZWdlbmRQb3NpdGlvblwiIFtjaGFydFRpdGxlXT1cImNoYXJ0VGl0bGVcIiBbc2hvd1RpdGxlXT1cInNob3dUaXRsZVwiIFtkb3VnaG51dENoYXJ0RGF0YV09XCJkb3VnaG51dENoYXJ0RGF0YVwiIFtjZW50ZXJDaGFydFRleHRdPVwicGVyY2VudFVzZWRUZXh0XCJcclxuICBbY2VudGVyQ2hhcnRTdWJ0ZXh0XT1cImNlbnRlckNoYXJ0U3VidGV4dFwiIFt0b29sdGlwVGl0bGVdPVwidG9vbHRpcFRpdGxlXCIgW3dpZHRoXT1cIndpZHRoXCIgW3JlZnJlc2hJbnRlcnZhbFN0cmluZ109XCJyZWZyZXNoSW50ZXJ2YWxTdHJpbmdcIiBbc3RhdGVTdHJpbmddPVwic3RhdGVTdHJpbmdcIj48L3NtZS1kb3VnaG51dC1jaGFydD5cclxuIl19