@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
218 lines • 29.3 kB
JavaScript
import { Component, EventEmitter, Injector, Input, Output } from '@angular/core';
import { CoreBaseComponent } from '../common/base.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
const _c0 = function (a0) { return { "sme-margin-left-sm": a0 }; };
function LoadingWheelComponent_span_10_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 6);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵclassMapInterpolate1("sme-color-accent ", ctx_r0.messageClass, "");
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(5, _c0, ctx_r0.messageInline));
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r0.message);
} }
const _c1 = function (a0) { return { "sme-margin-left-xs": a0 }; };
function LoadingWheelComponent_a_11_Template(rf, ctx) { if (rf & 1) {
const _r3 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "a", 7);
i0.ɵɵlistener("click", function LoadingWheelComponent_a_11_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.buttonClick.next()); });
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(2, _c1, ctx_r1.messageInline));
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r1.buttonLabel);
} }
const _c2 = function (a0, a1, a2) { return { "sme-scheme-loading-wheel": a0, "sme-layout-absolute": a1, "sme-position-inset-none": a2 }; };
const _c3 = function (a0, a1, a2, a3) { return { "sme-layout-absolute": a0, "sme-position-center": a1, "sme-arrange-stack-h": a2, "sme-position-flex-align-center": a3 }; };
const _c4 = function (a0, a1, a2) { return { "sme-progress-center": a0, "sme-progress-center-h": a1, "sme-progress-message-inline": a2 }; };
export var LoadingWheelSize;
(function (LoadingWheelSize) {
LoadingWheelSize["ExtraSmall"] = "extra-small";
LoadingWheelSize["Small"] = "small";
LoadingWheelSize["Medium"] = "medium";
LoadingWheelSize["Large"] = "large";
LoadingWheelSize["Default"] = "large";
})(LoadingWheelSize || (LoadingWheelSize = {}));
(function (LoadingWheelSize) {
const loadingWheelSizes = [
LoadingWheelSize.ExtraSmall,
LoadingWheelSize.Small,
LoadingWheelSize.Medium,
LoadingWheelSize.Large
];
function fromString(value) {
const defaultLoadingWheelSize = LoadingWheelSize.Default;
if (MsftSme.isNullOrWhiteSpace(value)) {
return defaultLoadingWheelSize;
}
value = value.toLowerCase();
return loadingWheelSizes.find(size => size.toLowerCase() === value) || defaultLoadingWheelSize;
}
function fromBindableType(value) {
if (typeof (value) === 'string') {
return fromString(value);
}
return value;
}
LoadingWheelSize.fromBindableType = fromBindableType;
function toProgressClass(size) {
switch (size) {
case LoadingWheelSize.ExtraSmall:
return 'sme-progress-extra-small';
case LoadingWheelSize.Small:
return 'sme-progress-small';
case LoadingWheelSize.Medium:
return 'sme-progress-medium';
case LoadingWheelSize.Large:
default:
return 'sme-progress-large';
}
}
LoadingWheelSize.toProgressClass = toProgressClass;
})(LoadingWheelSize || (LoadingWheelSize = {}));
/**
* @smeDoc {@label Loading Wheel @id sme-loading-wheel}
*
* @overview
* @file {@filepath ./examples/loading-wheel-overview.md}
*
* @example {@label Small loading wheel example @id small-loading-wheel}
* @file {@filename small-loading-wheel-example.html @filepath ./examples/small-loading-wheel-example.html }
* @file {@filename small-loading-wheel-example.ts @filepath ./examples/small-loading-wheel-example.ts }
* @file {@filename loading-wheel-example.module.ts @filepath ./examples/loading-wheel-example.module.ts }
*
* @example {@label Large loading wheel example @id large-loading-wheel}
* @file {@filename large-loading-wheel-example.html @filepath ./examples/large-loading-wheel-example.html }
* @file {@filename large-loading-wheel-example.ts @filepath ./examples/large-loading-wheel-example.ts }
* @file {@filename loading-wheel-example.module.ts @filepath ./examples/loading-wheel-example.module.ts }
*/
export class LoadingWheelComponent extends CoreBaseComponent {
constructor(injector) {
super(injector);
/**
* The class to be applied to the message, multiple classes should be passed in with space separator.
*/
this.messageClass = 'sme-font-h3';
/**
* It determines whether the message is inline with the spinner wheel.
*/
this.messageInline = false;
this.size = LoadingWheelSize.Default;
this.message = '';
this.inline = false;
this.buttonLabel = null;
this.isBackgroundTransparent = false;
this.buttonClick = new EventEmitter();
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'LoadingWheelComponent';
}
get sizeClass() {
return LoadingWheelSize.toProgressClass(LoadingWheelSize.fromBindableType(this.size));
}
/**
* The method run when the component is initialized
*/
ngOnInit() {
super.ngOnInit();
this.initialSize = LoadingWheelSize.fromBindableType(this.size);
this.onLayoutChanged();
}
/**
* Destroy resources.
*/
ngOnDestroy() {
super.ngOnDestroy();
this.buttonClick.complete();
}
/**
* Adjust loading wheel size if its container is smaller than the inputted size
*/
onLayoutChanged() {
setTimeout(() => {
const firstChild = this.hostElement.nativeElement.firstChild;
const layoutHeight = firstChild.clientHeight || Number.MAX_VALUE;
const layoutWidth = firstChild.clientWidth || Number.MAX_VALUE;
// ranges come from sme-progress- classes, each size is a square with margin-top: 12px
// extra-small = 16px, small = 20px, medium = 40px, large = 60px
if (layoutHeight < 32 || layoutWidth < 20 || this.initialSize === LoadingWheelSize.ExtraSmall) {
this.size = LoadingWheelSize.ExtraSmall;
}
else if (layoutHeight < 52 || layoutWidth < 40 || this.initialSize === LoadingWheelSize.Small) {
this.size = LoadingWheelSize.Small;
}
else if (layoutHeight < 72 || layoutWidth < 60 || this.initialSize === LoadingWheelSize.Medium) {
this.size = this.initialSize === LoadingWheelSize.Medium ? LoadingWheelSize.Medium : this.initialSize;
}
else {
this.size = this.initialSize;
}
});
}
/**
* Creates the idBag used by this component to store unique element ids.
* id values will be assigned be the @see BaseComponent super class.
*/
createIdBag() {
return {
loadingAriaLabel: ''
};
}
}
/** @nocollapse */ LoadingWheelComponent.ɵfac = function LoadingWheelComponent_Factory(t) { return new (t || LoadingWheelComponent)(i0.ɵɵdirectiveInject(i0.Injector)); };
/** @nocollapse */ LoadingWheelComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: LoadingWheelComponent, selectors: [["sme-loading-wheel"]], inputs: { message: "message", messageClass: "messageClass", messageInline: "messageInline", inline: "inline", buttonLabel: "buttonLabel", isBackgroundTransparent: "isBackgroundTransparent", size: "size" }, outputs: { buttonClick: "buttonClick" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 12, vars: 24, consts: [["aria-live", "assertive", 1, "sme-layer-over", 3, "ngClass"], [1, "sme-position-center-h-inline", 3, "ngClass"], ["role", "status", "tabindex", "0", 3, "ngClass"], [1, "sme-screen-reader", 3, "id"], ["aria-hidden", "true", 3, "class", "ngClass", 4, "ngIf"], ["tabindex", "0", "role", "link", "class", "sme-layout-block sme-link sme-focus-zone", 3, "ngClass", "click", 4, "ngIf"], ["aria-hidden", "true", 3, "ngClass"], ["tabindex", "0", "role", "link", 1, "sme-layout-block", "sme-link", "sme-focus-zone", 3, "ngClass", "click"]], template: function LoadingWheelComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
i0.ɵɵelement(3, "span")(4, "span")(5, "span")(6, "span")(7, "span");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(8, "div", 3);
i0.ɵɵtext(9);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(10, LoadingWheelComponent_span_10_Template, 2, 7, "span", 4);
i0.ɵɵtemplate(11, LoadingWheelComponent_a_11_Template, 2, 4, "a", 5);
i0.ɵɵelementEnd()();
} if (rf & 2) {
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction3(11, _c2, !ctx.isBackgroundTransparent, !ctx.inline, !ctx.inline));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction4(15, _c3, !ctx.inline, !ctx.inline, ctx.messageInline, ctx.messageInline));
i0.ɵɵadvance(1);
i0.ɵɵclassMapInterpolate1("sme-progress sme-progress-indeterminate-local ", ctx.sizeClass, " sme-focus-zone");
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction3(20, _c4, ctx.inline, !ctx.inline, ctx.messageInline));
i0.ɵɵattribute("aria-labelledby", ctx.idBag.loadingAriaLabel);
i0.ɵɵadvance(6);
i0.ɵɵproperty("id", ctx.idBag.loadingAriaLabel);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx.message || ctx.strings.MsftSmeShell.Angular.LoadingWheel.ARIA.loading);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.message);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.buttonLabel);
} }, dependencies: [i1.NgClass, i1.NgIf], encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LoadingWheelComponent, [{
type: Component,
args: [{ selector: 'sme-loading-wheel', template: "<div class=\"sme-layer-over\" aria-live=\"assertive\"\r\n [ngClass]=\"{'sme-scheme-loading-wheel': !isBackgroundTransparent, 'sme-layout-absolute': !inline, 'sme-position-inset-none': !inline}\">\r\n <div class=\"sme-position-center-h-inline\" [ngClass]=\"{'sme-layout-absolute': !inline, 'sme-position-center': !inline, 'sme-arrange-stack-h': messageInline, 'sme-position-flex-align-center': messageInline}\">\r\n <div class=\"sme-progress sme-progress-indeterminate-local {{sizeClass}} sme-focus-zone\" role=\"status\" tabindex=\"0\"\r\n [ngClass]=\"{'sme-progress-center': inline, 'sme-progress-center-h': !inline, 'sme-progress-message-inline': messageInline}\" [attr.aria-labelledby]=\"idBag.loadingAriaLabel\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n <div class=\"sme-screen-reader\" [id]=\"idBag.loadingAriaLabel\">{{ message || strings.MsftSmeShell.Angular.LoadingWheel.ARIA.loading }}</div>\r\n <span *ngIf=\"message\" class=\"sme-color-accent {{ messageClass }}\" [ngClass]=\"{'sme-margin-left-sm': messageInline}\" aria-hidden=\"true\">{{ message }}</span>\r\n <a tabindex=\"0\" role=\"link\" *ngIf=\"buttonLabel\" class=\"sme-layout-block sme-link sme-focus-zone\" [ngClass]=\"{'sme-margin-left-xs': messageInline}\"\r\n (click)=\"buttonClick.next()\">{{ buttonLabel }}</a>\r\n </div>\r\n</div>\r\n" }]
}], function () { return [{ type: i0.Injector }]; }, { buttonClick: [{
type: Output
}], message: [{
type: Input
}], messageClass: [{
type: Input
}], messageInline: [{
type: Input
}], inline: [{
type: Input
}], buttonLabel: [{
type: Input
}], isBackgroundTransparent: [{
type: Input
}], size: [{
type: Input
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGluZy13aGVlbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9sb2FkaW5nLXdoZWVsL2xvYWRpbmctd2hlZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvbG9hZGluZy13aGVlbC9sb2FkaW5nLXdoZWVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFVLFFBQVEsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7SUNXekQsK0JBQXVJO0lBQUEsWUFBYTtJQUFBLGlCQUFPOzs7SUFBckksdUVBQTJDO0lBQUMsMEVBQWlEO0lBQW9CLGVBQWE7SUFBYixvQ0FBYTs7Ozs7SUFDcEosNEJBQytCO0lBQTdCLDRKQUFTLGVBQUEseUJBQWtCLENBQUEsSUFBQztJQUFDLFlBQWlCO0lBQUEsaUJBQUk7OztJQUQ2QywwRUFBaUQ7SUFDbkgsZUFBaUI7SUFBakIsd0NBQWlCOzs7OztBRFZwRCxNQUFNLENBQU4sSUFBWSxnQkFNWDtBQU5ELFdBQVksZ0JBQWdCO0lBQ3hCLDhDQUEwQixDQUFBO0lBQzFCLG1DQUFlLENBQUE7SUFDZixxQ0FBaUIsQ0FBQTtJQUNqQixtQ0FBZSxDQUFBO0lBQ2YscUNBQWUsQ0FBQTtBQUNuQixDQUFDLEVBTlcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQU0zQjtBQUVELFdBQWMsZ0JBQWdCO0lBRzFCLE1BQU0saUJBQWlCLEdBQUc7UUFDdEIsZ0JBQWdCLENBQUMsVUFBVTtRQUMzQixnQkFBZ0IsQ0FBQyxLQUFLO1FBQ3RCLGdCQUFnQixDQUFDLE1BQU07UUFDdkIsZ0JBQWdC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Q3pFbEMsOEJBQ3lJLGFBQUEsYUFBQTtRQUluSSx1QkFBYSxXQUFBLFdBQUEsV0FBQSxXQUFBO1FBS2YsaUJBQU07UUFDTiw4QkFBNkQ7UUFBQSxZQUF1RTtRQUFBLGlCQUFNO1FBQzFJLDBFQUEySjtRQUMzSixvRUFDb0Q7UUFDdEQsaUJBQU0sRUFBQTs7UUFkTiw2R0FBc0k7UUFDNUYsZUFBbUs7UUFBbksscUhBQW1LO1FBQ3RNLGVBQWtGO1FBQWxGLDZHQUFrRjtRQUNyRixpR0FBMkg7UUFBQyw2REFBK0M7UUFPOUksZUFBNkI7UUFBN0IsK0NBQTZCO1FBQUMsZUFBdUU7UUFBdkUsK0ZBQXVFO1FBQzdILGVBQWE7UUFBYixrQ0FBYTtRQUNTLGVBQWlCO1FBQWpCLHNDQUFpQjs7dUZENERyQyxxQkFBcUI7Y0FKakMsU0FBUzsyQkFDSSxtQkFBbUI7MkRBZ0J0QixXQUFXO2tCQURqQixNQUFNO1lBT0EsT0FBTztrQkFEYixLQUFLO1lBT0MsWUFBWTtrQkFEbEIsS0FBSztZQU9DLGFBQWE7a0JBRG5CLEtBQUs7WUFPQyxNQUFNO2tCQURaLEtBQUs7WUFPQyxXQUFXO2tCQURqQixLQUFLO1lBT0MsdUJBQXVCO2tCQUQ3QixLQUFLO1lBT0MsSUFBSTtrQkFEVixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvcmVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL2Jhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTGF5b3V0LCBTTUVfTEFZT1VUX1BST1ZJREVSIH0gZnJvbSAnLi4vY29tbW9uL2xheW91dCc7XHJcblxyXG5leHBvcnQgZW51bSBMb2FkaW5nV2hlZWxTaXplIHtcclxuICAgIEV4dHJhU21hbGwgPSAnZXh0cmEtc21hbGwnLFxyXG4gICAgU21hbGwgPSAnc21hbGwnLFxyXG4gICAgTWVkaXVtID0gJ21lZGl1bScsXHJcbiAgICBMYXJnZSA9ICdsYXJnZScsXHJcbiAgICBEZWZhdWx0ID0gTGFyZ2VcclxufVxyXG5cclxuZXhwb3J0IG1vZHVsZSBMb2FkaW5nV2hlZWxTaXplIHtcclxuICAgIGV4cG9ydCB0eXBlIEJpbmRhYmxlID0gTG9hZGluZ1doZWVsU2l6ZSB8ICdleHRyYS1zbWFsbCcgfCAnc21hbGwnIHwgJ21lZGl1bScgfCAnbGFyZ2UnO1xyXG5cclxuICAgIGNvbnN0IGxvYWRpbmdXaGVlbFNpemVzID0gW1xyXG4gICAgICAgIExvYWRpbmdXaGVlbFNpemUuRXh0cmFTbWFsbCxcclxuICAgICAgICBMb2FkaW5nV2hlZWxTaXplLlNtYWxsLFxyXG4gICAgICAgIExvYWRpbmdXaGVlbFNpemUuTWVkaXVtLFxyXG4gICAgICAgIExvYWRpbmdXaGVlbFNpemUuTGFyZ2VcclxuICAgIF07XHJcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBMb2FkaW5nV2hlZWxTaXplIHtcclxuICAgICAgICBjb25zdCBkZWZhdWx0TG9hZGluZ1doZWVsU2l6ZSA9IExvYWRpbmdXaGVlbFNpemUuRGVmYXVsdDtcclxuXHJcbiAgICAgICAgaWYgKE1zZnRTbWUuaXNOdWxsT3JXaGl0ZVNwYWNlKHZhbHVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdExvYWRpbmdXaGVlbFNpemU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIGxvYWRpbmdXaGVlbFNpemVzLmZpbmQoc2l6ZSA9PiBzaXplLnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlKSB8fCBkZWZhdWx0TG9hZGluZ1doZWVsU2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbUJpbmRhYmxlVHlwZSh2YWx1ZTogQmluZGFibGUpOiBMb2FkaW5nV2hlZWxTaXplIHtcclxuICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmcm9tU3RyaW5nKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiB0b1Byb2dyZXNzQ2xhc3Moc2l6ZTogTG9hZGluZ1doZWVsU2l6ZSk6IHN0cmluZyB7XHJcbiAgICAgICAgc3dpdGNoIChzaXplKSB7XHJcbiAgICAgICAgICAgIGNhc2UgTG9hZGluZ1doZWVsU2l6ZS5FeHRyYVNtYWxsOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdzbWUtcHJvZ3Jlc3MtZXh0cmEtc21hbGwnO1xyXG4gICAgICAgICAgICBjYXNlIExvYWRpbmdXaGVlbFNpemUuU21hbGw6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NtZS1wcm9ncmVzcy1zbWFsbCc7XHJcbiAgICAgICAgICAgIGNhc2UgTG9hZGluZ1doZWVsU2l6ZS5NZWRpdW06XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NtZS1wcm9ncmVzcy1tZWRpdW0nO1xyXG4gICAgICAgICAgICBjYXNlIExvYWRpbmdXaGVlbFNpemUuTGFyZ2U6XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NtZS1wcm9ncmVzcy1sYXJnZSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBAc21lRG9jIHtAbGFiZWwgTG9hZGluZyBXaGVlbCBAaWQgc21lLWxvYWRpbmctd2hlZWx9XHJcbiAqXHJcbiAqIEBvdmVydmlld1xyXG4gKiBAZmlsZSB7QGZpbGVwYXRoIC4vZXhhbXBsZXMvbG9hZGluZy13aGVlbC1vdmVydmlldy5tZH1cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBTbWFsbCBsb2FkaW5nIHdoZWVsIGV4YW1wbGUgQGlkIHNtYWxsLWxvYWRpbmctd2hlZWx9XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgc21hbGwtbG9hZGluZy13aGVlbC1leGFtcGxlLmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvc21hbGwtbG9hZGluZy13aGVlbC1leGFtcGxlLmh0bWwgfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIHNtYWxsLWxvYWRpbmctd2hlZWwtZXhhbXBsZS50cyBAZmlsZXBhdGggLi9leGFtcGxlcy9zbWFsbC1sb2FkaW5nLXdoZWVsLWV4YW1wbGUudHMgfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGxvYWRpbmctd2hlZWwtZXhhbXBsZS5tb2R1bGUudHMgQGZpbGVwYXRoIC4vZXhhbXBsZXMvbG9hZGluZy13aGVlbC1leGFtcGxlLm1vZHVsZS50cyB9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgTGFyZ2UgbG9hZGluZyB3aGVlbCBleGFtcGxlIEBpZCBsYXJnZS1sb2FkaW5nLXdoZWVsfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGxhcmdlLWxvYWRpbmctd2hlZWwtZXhhbXBsZS5odG1sIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2xhcmdlLWxvYWRpbmctd2hlZWwtZXhhbXBsZS5odG1sIH1cclxuICogQGZpbGUge0BmaWxlbmFtZSBsYXJnZS1sb2FkaW5nLXdoZWVsLWV4YW1wbGUudHMgQGZpbGVwYXRoIC4vZXhhbXBsZXMvbGFyZ2UtbG9hZGluZy13aGVlbC1leGFtcGxlLnRzIH1cclxuICogQGZpbGUge0BmaWxlbmFtZSBsb2FkaW5nLXdoZWVsLWV4YW1wbGUubW9kdWxlLnRzIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2xvYWRpbmctd2hlZWwtZXhhbXBsZS5tb2R1bGUudHMgfVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1sb2FkaW5nLXdoZWVsJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9sb2FkaW5nLXdoZWVsLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTG9hZGluZ1doZWVsQ29tcG9uZW50IGV4dGVuZHMgQ29yZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnTG9hZGluZ1doZWVsQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBldmVudCBmaXJlZCB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZC5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgYnV0dG9uQ2xpY2s6IEV2ZW50RW1pdHRlcjx2b2lkPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgbG9hZGluZyB3aGVlbC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2xhc3MgdG8gYmUgYXBwbGllZCB0byB0aGUgbWVzc2FnZSwgbXVsdGlwbGUgY2xhc3NlcyBzaG91bGQgYmUgcGFzc2VkIGluIHdpdGggc3BhY2Ugc2VwYXJhdG9yLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIG1lc3NhZ2VDbGFzcyA9ICdzbWUtZm9udC1oMyc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgaW5saW5lIHdpdGggdGhlIHNwaW5uZXIgd2hlZWwuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbWVzc2FnZUlubGluZSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBsb2FkaW5nIHdoZWVsIGlzIHdob2xlIHBhZ2Ugb3IgaW5saW5lLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGlubGluZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsYWJlbCB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIGJ1dHRvbi9saW5rLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGJ1dHRvbkxhYmVsOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGJhY2tncm91bmQgZm9yIHRoZSBsb2FkaW5nIHdoZWVsIGlzIHRyYW5zcGFyZW50LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGlzQmFja2dyb3VuZFRyYW5zcGFyZW50OiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgbG9hZGluZyB3aGVlbC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaXplOiBMb2FkaW5nV2hlZWxTaXplLkJpbmRhYmxlO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgc2l6ZUNsYXNzKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIExvYWRpbmdXaGVlbFNpemUudG9Qcm9ncmVzc0NsYXNzKExvYWRpbmdXaGVlbFNpemUuZnJvbUJpbmRhYmxlVHlwZSh0aGlzLnNpemUpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRpYWxTaXplOiBMb2FkaW5nV2hlZWxTaXplO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICB0aGlzLnNpemUgPSBMb2FkaW5nV2hlZWxTaXplLkRlZmF1bHQ7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gJyc7XHJcbiAgICAgICAgdGhpcy5pbmxpbmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkxhYmVsID0gbnVsbDtcclxuICAgICAgICB0aGlzLmlzQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5idXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZXRob2QgcnVuIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBpbml0aWFsaXplZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgICAgICB0aGlzLmluaXRpYWxTaXplID0gTG9hZGluZ1doZWVsU2l6ZS5mcm9tQmluZGFibGVUeXBlKHRoaXMuc2l6ZSk7XHJcbiAgICAgICAgdGhpcy5vbkxheW91dENoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3kgcmVzb3VyY2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkNsaWNrLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGp1c3QgbG9hZGluZyB3aGVlbCBzaXplIGlmIGl0cyBjb250YWluZXIgaXMgc21hbGxlciB0aGFuIHRoZSBpbnB1dHRlZCBzaXplXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25MYXlvdXRDaGFuZ2VkKCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdENoaWxkID0gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGxheW91dEhlaWdodCA9IGZpcnN0Q2hpbGQuY2xpZW50SGVpZ2h0IHx8IE51bWJlci5NQVhfVkFMVUU7XHJcbiAgICAgICAgICAgIGNvbnN0IGxheW91dFdpZHRoID0gZmlyc3RDaGlsZC5jbGllbnRXaWR0aCB8fCBOdW1iZXIuTUFYX1ZBTFVFO1xyXG4gICAgICAgICAgICAvLyByYW5nZXMgY29tZSBmcm9tIHNtZS1wcm9ncmVzcy0gY2xhc3NlcywgZWFjaCBzaXplIGlzIGEgc3F1YXJlIHdpdGggbWFyZ2luLXRvcDogMTJweFxyXG4gICAgICAgICAgICAvLyBleHRyYS1zbWFsbCA9IDE2cHgsIHNtYWxsID0gMjBweCwgbWVkaXVtID0gNDBweCwgbGFyZ2UgPSA2MHB4XHJcbiAgICAgICAgICAgIGlmIChsYXlvdXRIZWlnaHQgPCAzMiB8fCBsYXlvdXRXaWR0aCA8IDIwIHx8IHRoaXMuaW5pdGlhbFNpemUgPT09IExvYWRpbmdXaGVlbFNpemUuRXh0cmFTbWFsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaXplID0gTG9hZGluZ1doZWVsU2l6ZS5FeHRyYVNtYWxsO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxheW91dEhlaWdodCA8IDUyIHx8IGxheW91dFdpZHRoIDwgNDAgfHwgdGhpcy5pbml0aWFsU2l6ZSA9PT0gTG9hZGluZ1doZWVsU2l6ZS5TbWFsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaXplID0gTG9hZGluZ1doZWVsU2l6ZS5TbWFsbDtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRIZWlnaHQgPCA3MiB8fCBsYXlvdXRXaWR0aCA8IDYwIHx8IHRoaXMuaW5pdGlhbFNpemUgPT09IExvYWRpbmdXaGVlbFNpemUuTWVkaXVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpemUgPSB0aGlzLmluaXRpYWxTaXplID09PSBMb2FkaW5nV2hlZWxTaXplLk1lZGl1bSA/IExvYWRpbmdXaGVlbFNpemUuTWVkaXVtIDogdGhpcy5pbml0aWFsU2l6ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2l6ZSA9IHRoaXMuaW5pdGlhbFNpemU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIGlkQmFnIHVzZWQgYnkgdGhpcyBjb21wb25lbnQgdG8gc3RvcmUgdW5pcXVlIGVsZW1lbnQgaWRzLlxyXG4gICAgICogaWQgdmFsdWVzIHdpbGwgYmUgYXNzaWduZWQgYmUgdGhlIEBzZWUgQmFzZUNvbXBvbmVudCBzdXBlciBjbGFzcy5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUlkQmFnKCk6IE1zZnRTbWUuU3RyaW5nTWFwPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxvYWRpbmdBcmlhTGFiZWw6ICcnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwic21lLWxheWVyLW92ZXJcIiBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIlxyXG4gIFtuZ0NsYXNzXT1cInsnc21lLXNjaGVtZS1sb2FkaW5nLXdoZWVsJzogIWlzQmFja2dyb3VuZFRyYW5zcGFyZW50LCAnc21lLWxheW91dC1hYnNvbHV0ZSc6ICFpbmxpbmUsICdzbWUtcG9zaXRpb24taW5zZXQtbm9uZSc6ICFpbmxpbmV9XCI+XHJcbiAgPGRpdiBjbGFzcz1cInNtZS1wb3NpdGlvbi1jZW50ZXItaC1pbmxpbmVcIiBbbmdDbGFzc109XCJ7J3NtZS1sYXlvdXQtYWJzb2x1dGUnOiAhaW5saW5lLCAnc21lLXBvc2l0aW9uLWNlbnRlcic6ICFpbmxpbmUsICdzbWUtYXJyYW5nZS1zdGFjay1oJzogbWVzc2FnZUlubGluZSwgJ3NtZS1wb3NpdGlvbi1mbGV4LWFsaWduLWNlbnRlcic6IG1lc3NhZ2VJbmxpbmV9XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLXByb2dyZXNzIHNtZS1wcm9ncmVzcy1pbmRldGVybWluYXRlLWxvY2FsIHt7c2l6ZUNsYXNzfX0gc21lLWZvY3VzLXpvbmVcIiByb2xlPVwic3RhdHVzXCIgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgW25nQ2xhc3NdPVwieydzbWUtcHJvZ3Jlc3MtY2VudGVyJzogaW5saW5lLCAnc21lLXByb2dyZXNzLWNlbnRlci1oJzogIWlubGluZSwgJ3NtZS1wcm9ncmVzcy1tZXNzYWdlLWlubGluZSc6IG1lc3NhZ2VJbmxpbmV9XCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlkQmFnLmxvYWRpbmdBcmlhTGFiZWxcIj5cclxuICAgICAgPHNwYW4+PC9zcGFuPlxyXG4gICAgICA8c3Bhbj48L3NwYW4+XHJcbiAgICAgIDxzcGFuPjwvc3Bhbj5cclxuICAgICAgPHNwYW4+PC9zcGFuPlxyXG4gICAgICA8c3Bhbj48L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtc2NyZWVuLXJlYWRlclwiIFtpZF09XCJpZEJhZy5sb2FkaW5nQXJpYUxhYmVsXCI+e3sgbWVzc2FnZSB8fCBzdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkxvYWRpbmdXaGVlbC5BUklBLmxvYWRpbmcgfX08L2Rpdj5cclxuICAgIDxzcGFuICpuZ0lmPVwibWVzc2FnZVwiIGNsYXNzPVwic21lLWNvbG9yLWFjY2VudCB7eyBtZXNzYWdlQ2xhc3MgfX1cIiBbbmdDbGFzc109XCJ7J3NtZS1tYXJnaW4tbGVmdC1zbSc6IG1lc3NhZ2VJbmxpbmV9XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3sgbWVzc2FnZSB9fTwvc3Bhbj5cclxuICAgIDxhIHRhYmluZGV4PVwiMFwiIHJvbGU9XCJsaW5rXCIgKm5nSWY9XCJidXR0b25MYWJlbFwiIGNsYXNzPVwic21lLWxheW91dC1ibG9jayBzbWUtbGluayBzbWUtZm9jdXMtem9uZVwiIFtuZ0NsYXNzXT1cInsnc21lLW1hcmdpbi1sZWZ0LXhzJzogbWVzc2FnZUlubGluZX1cIlxyXG4gICAgICAoY2xpY2spPVwiYnV0dG9uQ2xpY2submV4dCgpXCI+e3sgYnV0dG9uTGFiZWwgfX08L2E+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=