@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
464 lines • 53.4 kB
JavaScript
import { Component, ContentChildren, EventEmitter, forwardRef, Inject, Injector, Input, Optional, Output, QueryList, SkipSelf, TemplateRef, ViewChild } from '@angular/core';
import { CoreBaseComponent } from '../common/base.component';
import { SME_LAYOUT_PROVIDER } from '../common/layout';
import { PropertyGridItemComponent } from './property-grid-item.component';
import { PropertyGridResponsiveWindowManager } from './property-grid-responsive-window-manager';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@angular/common";
import * as i3 from "../layout/layout.component";
import * as i4 from "../layout/layout-item.component";
import * as i5 from "../layout/layout-definition.component";
import * as i6 from "../loading-wheel/loading-wheel.component";
import * as i7 from "../icon/layered-icon/status/status-icon.component";
import * as i8 from "../tooltip/tooltip.directive";
import * as i9 from "../tooltip/tooltip-zone.directive";
const _c0 = ["readonlyTemplate"];
const _c1 = ["actionLinkTemplate"];
const _c2 = ["internalLinkTemplate"];
const _c3 = ["externalLinkTemplate"];
function PropertyGridComponent_sme_layout_definition_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-layout-definition", 11);
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵproperty("until", ctx_r1.layoutItemWidth * 2)("columns", 2);
} }
function PropertyGridComponent_sme_layout_definition_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-layout-definition", 12);
} if (rf & 2) {
i0.ɵɵproperty("columns", 3);
} }
function PropertyGridComponent_sme_layout_item_5_span_6_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "span", 20);
} if (rf & 2) {
const item_r14 = i0.ɵɵnextContext().$implicit;
const _r16 = i0.ɵɵreference(2);
i0.ɵɵproperty("title", item_r14.tooltip)("tooltipZone", _r16);
} }
function PropertyGridComponent_sme_layout_item_5_ng_container_9_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
const _c4 = function (a0, a1) { return { $implicit: a0, index: a1 }; };
function PropertyGridComponent_sme_layout_item_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "sme-layout-item", 13)(1, "div", 14, 15)(3, "label", 16)(4, "span");
i0.ɵɵtext(5);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(6, PropertyGridComponent_sme_layout_item_5_span_6_Template, 1, 2, "span", 17);
i0.ɵɵelementStart(7, "span", 18);
i0.ɵɵtext(8);
i0.ɵɵelementEnd()();
i0.ɵɵtemplate(9, PropertyGridComponent_sme_layout_item_5_ng_container_9_Template, 1, 0, "ng-container", 19);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const item_r14 = ctx.$implicit;
const i_r15 = ctx.index;
const ctx_r3 = i0.ɵɵnextContext();
i0.ɵɵproperty("columnSpan", item_r14.columnSpan)("maxWidth", ctx_r3.orientation === "vertical" ? null : item_r14.columnSpan * ctx_r3.layoutItemWidth);
i0.ɵɵadvance(5);
i0.ɵɵtextInterpolate(item_r14.label);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", item_r14.tooltip);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(item_r14.tooltip);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngTemplateOutlet", ctx_r3.getTemplate(item_r14))("ngTemplateOutletContext", i0.ɵɵpureFunction2(7, _c4, item_r14, i_r15));
} }
function PropertyGridComponent_ng_template_6_sme_loading_wheel_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-loading-wheel", 23);
} if (rf & 2) {
i0.ɵɵproperty("inline", true)("isBackgroundTransparent", true);
} }
function PropertyGridComponent_ng_template_6_ng_container_1_ng_container_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function PropertyGridComponent_ng_template_6_ng_container_1_span_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span");
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r20 = i0.ɵɵnextContext(2).$implicit;
const ctx_r25 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r25.stringifyValue(item_r20.value));
} }
function PropertyGridComponent_ng_template_6_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "p", 24);
i0.ɵɵtemplate(2, PropertyGridComponent_ng_template_6_ng_container_1_ng_container_2_Template, 1, 0, "ng-container", 19);
i0.ɵɵtemplate(3, PropertyGridComponent_ng_template_6_ng_container_1_span_3_Template, 2, 1, "span", 22);
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r27 = i0.ɵɵnextContext();
const i_r21 = ctx_r27.index;
const item_r20 = ctx_r27.$implicit;
const ctx_r23 = i0.ɵɵnextContext();
const _r12 = i0.ɵɵreference(15);
i0.ɵɵadvance(1);
i0.ɵɵattribute("aria-labelledby", ctx_r23.idBag.labelSpan + i_r21)("aria-describedby", ctx_r23.idBag.detailsSpan + i_r21);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngTemplateOutlet", _r12)("ngTemplateOutletContext", i0.ɵɵpureFunction2(5, _c4, item_r20, i_r21));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !item_r20.link && !item_r20.action);
} }
function PropertyGridComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, PropertyGridComponent_ng_template_6_sme_loading_wheel_0_Template, 1, 2, "sme-loading-wheel", 21);
i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_6_ng_container_1_Template, 4, 8, "ng-container", 22);
} if (rf & 2) {
const item_r20 = ctx.$implicit;
i0.ɵɵproperty("ngIf", item_r20.loading && item_r20.isAsync);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !item_r20.loading || !item_r20.isAsync);
} }
function PropertyGridComponent_ng_template_8_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function PropertyGridComponent_ng_template_8_span_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 27);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r28 = i0.ɵɵnextContext().$implicit;
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r28.prefixString);
} }
function PropertyGridComponent_ng_template_8_Template(rf, ctx) { if (rf & 1) {
const _r34 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "p");
i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_8_ng_container_1_Template, 1, 0, "ng-container", 19);
i0.ɵɵtemplate(2, PropertyGridComponent_ng_template_8_span_2_Template, 2, 1, "span", 25);
i0.ɵɵelementStart(3, "a", 26);
i0.ɵɵlistener("click", function PropertyGridComponent_ng_template_8_Template_a_click_3_listener() { const restoredCtx = i0.ɵɵrestoreView(_r34); const item_r28 = restoredCtx.$implicit; return i0.ɵɵresetView(item_r28.action(item_r28)); });
i0.ɵɵtext(4);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const item_r28 = ctx.$implicit;
const i_r29 = ctx.index;
const ctx_r7 = i0.ɵɵnextContext();
const _r12 = i0.ɵɵreference(15);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngTemplateOutlet", _r12)("ngTemplateOutletContext", i0.ɵɵpureFunction2(6, _c4, item_r28, i_r29));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", item_r28.prefixString);
i0.ɵɵadvance(1);
i0.ɵɵattribute("aria-labelledby", ctx_r7.idBag.labelSpan + i_r29 + " " + (ctx_r7.idBag.valueSpan + i_r29))("aria-describedby", ctx_r7.idBag.detailsSpan + i_r29);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r28.value);
} }
function PropertyGridComponent_ng_template_10_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function PropertyGridComponent_ng_template_10_span_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 27);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r35 = i0.ɵɵnextContext().$implicit;
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r35.prefixString);
} }
function PropertyGridComponent_ng_template_10_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "p");
i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_10_ng_container_1_Template, 1, 0, "ng-container", 19);
i0.ɵɵtemplate(2, PropertyGridComponent_ng_template_10_span_2_Template, 2, 1, "span", 25);
i0.ɵɵelementStart(3, "a", 28);
i0.ɵɵtext(4);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const item_r35 = ctx.$implicit;
const i_r36 = ctx.index;
const ctx_r9 = i0.ɵɵnextContext();
const _r12 = i0.ɵɵreference(15);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngTemplateOutlet", _r12)("ngTemplateOutletContext", i0.ɵɵpureFunction2(7, _c4, item_r35, i_r36));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", item_r35.prefixString);
i0.ɵɵadvance(1);
i0.ɵɵproperty("routerLink", item_r35.link);
i0.ɵɵattribute("aria-labelledby", ctx_r9.idBag.labelSpan + i_r36 + " " + (ctx_r9.idBag.valueSpan + i_r36))("aria-describedby", ctx_r9.idBag.detailsSpan + i_r36);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r35.value);
} }
function PropertyGridComponent_ng_template_12_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function PropertyGridComponent_ng_template_12_span_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 27);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r40 = i0.ɵɵnextContext().$implicit;
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r40.prefixString);
} }
function PropertyGridComponent_ng_template_12_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "p");
i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_12_ng_container_1_Template, 1, 0, "ng-container", 19);
i0.ɵɵtemplate(2, PropertyGridComponent_ng_template_12_span_2_Template, 2, 1, "span", 25);
i0.ɵɵelementStart(3, "a", 29);
i0.ɵɵtext(4);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const item_r40 = ctx.$implicit;
const i_r41 = ctx.index;
const ctx_r11 = i0.ɵɵnextContext();
const _r12 = i0.ɵɵreference(15);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngTemplateOutlet", _r12)("ngTemplateOutletContext", i0.ɵɵpureFunction2(7, _c4, item_r40, i_r41));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", item_r40.prefixString);
i0.ɵɵadvance(1);
i0.ɵɵproperty("href", item_r40.link, i0.ɵɵsanitizeUrl);
i0.ɵɵattribute("aria-labelledby", ctx_r11.idBag.labelSpan + i_r41 + " " + (ctx_r11.idBag.valueSpan + i_r41))("aria-describedby", ctx_r11.idBag.detailsSpan + i_r41);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(item_r40.value);
} }
function PropertyGridComponent_ng_template_14_span_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "span");
} if (rf & 2) {
const item_r45 = i0.ɵɵnextContext().$implicit;
i0.ɵɵclassMapInterpolate1("sme-margin-right-xs sme-icon ", item_r45.iconClass, "");
} }
function PropertyGridComponent_ng_template_14_sme_status_icon_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-status-icon", 32);
} if (rf & 2) {
const item_r45 = i0.ɵɵnextContext().$implicit;
i0.ɵɵproperty("status", item_r45.status);
} }
function PropertyGridComponent_ng_template_14_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, PropertyGridComponent_ng_template_14_span_0_Template, 1, 3, "span", 30);
i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_14_sme_status_icon_1_Template, 1, 1, "sme-status-icon", 31);
} if (rf & 2) {
const item_r45 = ctx.$implicit;
i0.ɵɵproperty("ngIf", !!item_r45.iconClass);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", item_r45.status !== undefined && item_r45.status !== null && !item_r45.iconClass);
} }
/**
*
* @smeDoc {@label Property Grid @id sme-property-grid-component}
*
* @overview
* @file {@filepath ./examples/overview.md}
*
* @example {@label Basic Usage @id basic-usage}
* @file {@filename component.html @filepath ./examples/basic-usage.component.html}
*
* @example {@label Vertical Orientation @id vertical-orientation}
* @file {@filename component.html @filepath ./examples/vertical-orientation.component.html}
*
* @example {@label Item with a Link @id link-item}
* @file {@filename component.html @filepath ./examples/link-item.component.html}
*
* @example {@label Item with a Tooltip @id tooltip-item}
* @file {@filename component.html @filepath ./examples/tooltip-item.component.html}
*
* @example {@label Item with a Action @id action-item}
* @file {@filename component.ts @filepath ./examples/action-item.component.ts}
* @file {@filename component.html @filepath ./examples/action-item.component.html}
*
* @example {@label Item Spanning Multiple Columns @id multi-column}
* @file {@filename component.html @filepath ./examples/multi-column-item.component.html}
*
* @example {@label Items with Status and Icons @id status-and-icons}
* @file {@filename component.html @filepath ./examples/status-item.component.html}
*
* @example {@label Items with complex value types @id complex-value}
* @file {@filename component.html @filepath ./examples/complex-values.component.html}
*
*/
export class PropertyGridComponent extends CoreBaseComponent {
constructor(injector, layout) {
super(injector);
/**
* The basic column width for the property grid items.
*/
this.layoutItemWidth = 300;
/**
* The orientation for the property grid
*/
this.orientation = 'horizontal';
/**
* Implementation of the Layout interface
*/
this.layoutChanged = new EventEmitter();
/**
* Implementation of the Layout interface
*/
this.windowBreakpointChanged = new EventEmitter();
this.propertyGridResponsiveWindowManager = new PropertyGridResponsiveWindowManager();
// old style supported sme-property-grid-arrange-vertical class. default to vertical orientation if this class is applied.
const hasVerticalClass = this.hostElement.nativeElement.classList.contains('sme-property-grid-arrange-vertical');
this.orientation = hasVerticalClass ? 'vertical' : 'horizontal';
// on parent layout changes, re-emit the layout change to our event
if (layout) {
this.subscriptions.push(layout.layoutChanged.subscribe(() => {
this.layoutChanged.emit();
setTimeout(() => {
this.propertyGridResponsiveWindowManager.onWindowSizeChanged(this.hostElement.nativeElement);
});
}));
}
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'PropertyGridComponent';
}
stringifyValue(value) {
if (MsftSme.isNullOrWhiteSpace(value)) {
return '-';
}
if (Array.isArray(value)) {
return value.map(v => this.stringifyValue(v)).join(',\n');
}
if (MsftSme.isObject(value)) {
try {
return JSON.stringify(value, null, 2);
}
catch (error) {
return value;
}
}
return `${value}`;
}
getTemplate(item) {
if (item.action) {
return this.actionLinkTemplate;
}
if (item.link) {
if (item.isExternalLink) {
return this.externalLinkTemplate;
}
else {
return this.internalLinkTemplate;
}
}
return this.readonlyTemplate;
}
ngOnChanges(changes) {
super.ngOnChanges(changes);
if (changes.orientation) {
this.layoutChanged.emit();
}
}
/**
* It handles the undefined value won't be updated situation for async property item.
* Angular issue that the property item value initialized with undefined, if after async time, the value being set is still undefined,
* Angular will not be able to trigger the value on changed event. Thus we have to manually call to refresh it.
*
* @param index The index that needs to hard refresh.
*/
hardRefreshItem(index) {
if (!this.items) {
return;
}
const items = this.items.toArray();
if (!items[index]) {
return;
}
const item = items[index];
if (item.isAsync && item.value === undefined) {
item.loading = false;
}
}
/**
* 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 {
detailsSpan: '',
labelSpan: '',
valueSpan: ''
};
}
/**
* Gets the initial host classes to be applied to this element
*/
getInitialHostClasses() {
return super.getInitialHostClasses().concat([
'sme-property-grid',
'sme-layout-relative',
'sme-focus-zone'
]);
}
}
/** @nocollapse */ PropertyGridComponent.ɵfac = function PropertyGridComponent_Factory(t) { return new (t || PropertyGridComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(SME_LAYOUT_PROVIDER, 12)); };
/** @nocollapse */ PropertyGridComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: PropertyGridComponent, selectors: [["sme-property-grid"]], contentQueries: function PropertyGridComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
i0.ɵɵcontentQuery(dirIndex, PropertyGridItemComponent, 4);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.items = _t);
} }, viewQuery: function PropertyGridComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 7);
i0.ɵɵviewQuery(_c1, 7);
i0.ɵɵviewQuery(_c2, 7);
i0.ɵɵviewQuery(_c3, 7);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.readonlyTemplate = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.actionLinkTemplate = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.internalLinkTemplate = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.externalLinkTemplate = _t.first);
} }, inputs: { orientation: "orientation" }, outputs: { layoutChanged: "layoutChanged", windowBreakpointChanged: "windowBreakpointChanged" }, features: [i0.ɵɵProvidersFeature([
{ provide: SME_LAYOUT_PROVIDER, useExisting: forwardRef((() => PropertyGridComponent)) }
]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 16, vars: 7, consts: [[1, "sme-position-inset-none", "sme-position-stretch-h", 3, "padLastItem", "oneColumn"], ["layout", ""], ["name", "narrow", 3, "until", "columns"], ["name", "medium", 3, "until", "columns", 4, "ngIf"], ["name", "wide", 3, "columns", 4, "ngIf"], [3, "columnSpan", "maxWidth", 4, "ngFor", "ngForOf"], ["readonlyTemplate", ""], ["actionLinkTemplate", ""], ["internalLinkTemplate", ""], ["externalLinkTemplate", ""], ["iconTemplate", ""], ["name", "medium", 3, "until", "columns"], ["name", "wide", 3, "columns"], [3, "columnSpan", "maxWidth"], ["tabindex", "0", "aria-live", "polite", "aria-atomic", "true", "smeTooltipZone", "", 1, "sme-property-grid-item"], ["zone", "smeTooltipZone"], [1, "sme-arrange-stack-h"], ["class", "sme-position-flex-none sme-icon sme-icon-info sme-info-bubble sme-margin-left-xs", "aria-hidden", "true", "tabindex", "0", 3, "title", "tooltipZone", 4, "ngIf"], [1, "sme-screen-reader"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], ["aria-hidden", "true", "tabindex", "0", 1, "sme-position-flex-none", "sme-icon", "sme-icon-info", "sme-info-bubble", "sme-margin-left-xs", 3, "title", "tooltipZone"], ["size", "extra-small", 3, "inline", "isBackgroundTransparent", 4, "ngIf"], [4, "ngIf"], ["size", "extra-small", 3, "inline", "isBackgroundTransparent"], [1, "sme-read-only-template"], ["class", "sme-padding-right-xs", 4, "ngIf"], ["tabindex", "0", "role", "link", 1, "sme-link", "sme-focus-zone", "sme-action-link-template", 3, "click"], [1, "sme-padding-right-xs"], ["role", "link", 1, "sme-link", "sme-focus-zone", 3, "routerLink"], ["role", "link", "target", "_blank", 1, "sme-link", "sme-focus-zone", "sme-icon", "sme-icon-after", "sme-icon-openInNewWindow", 3, "href"], [3, "class", 4, "ngIf"], ["class", "sme-layout-inline-block sme-margin-right-xs ", "size", "16px", 3, "status", 4, "ngIf"], ["size", "16px", 1, "sme-layout-inline-block", "sme-margin-right-xs", 3, "status"]], template: function PropertyGridComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "sme-layout", 0, 1);
i0.ɵɵelement(2, "sme-layout-definition", 2);
i0.ɵɵtemplate(3, PropertyGridComponent_sme_layout_definition_3_Template, 1, 2, "sme-layout-definition", 3);
i0.ɵɵtemplate(4, PropertyGridComponent_sme_layout_definition_4_Template, 1, 1, "sme-layout-definition", 4);
i0.ɵɵtemplate(5, PropertyGridComponent_sme_layout_item_5_Template, 10, 10, "sme-layout-item", 5);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(6, PropertyGridComponent_ng_template_6_Template, 2, 2, "ng-template", null, 6, i0.ɵɵtemplateRefExtractor);
i0.ɵɵtemplate(8, PropertyGridComponent_ng_template_8_Template, 5, 9, "ng-template", null, 7, i0.ɵɵtemplateRefExtractor);
i0.ɵɵtemplate(10, PropertyGridComponent_ng_template_10_Template, 5, 10, "ng-template", null, 8, i0.ɵɵtemplateRefExtractor);
i0.ɵɵtemplate(12, PropertyGridComponent_ng_template_12_Template, 5, 10, "ng-template", null, 9, i0.ɵɵtemplateRefExtractor);
i0.ɵɵtemplate(14, PropertyGridComponent_ng_template_14_Template, 2, 2, "ng-template", null, 10, i0.ɵɵtemplateRefExtractor);
} if (rf & 2) {
i0.ɵɵproperty("padLastItem", true)("oneColumn", ctx.orientation === "vertical");
i0.ɵɵadvance(2);
i0.ɵɵproperty("until", ctx.layoutItemWidth)("columns", 1);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.orientation !== "vertical");
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.orientation !== "vertical");
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngForOf", ctx.items);
} }, dependencies: [i1.RouterLink, i2.NgForOf, i2.NgIf, i2.NgTemplateOutlet, i3.LayoutComponent, i4.LayoutItemComponent, i5.LayoutDefinitionComponent, i6.LoadingWheelComponent, i7.StatusIconComponent, i8.TooltipDirective, i9.TooltipZoneDirective], encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PropertyGridComponent, [{
type: Component,
args: [{ selector: 'sme-property-grid', providers: [
{ provide: SME_LAYOUT_PROVIDER, useExisting: forwardRef((() => PropertyGridComponent)) }
], template: "<sme-layout #layout [padLastItem]=\"true\" class=\"sme-position-inset-none sme-position-stretch-h\" [oneColumn]=\"orientation === 'vertical'\">\r\n <sme-layout-definition name=\"narrow\" [until]=\"layoutItemWidth\" [columns]=\"1\"></sme-layout-definition>\r\n <sme-layout-definition *ngIf=\"orientation !== 'vertical'\" name=\"medium\" [until]=\"layoutItemWidth*2\" [columns]=\"2\"></sme-layout-definition>\r\n <sme-layout-definition *ngIf=\"orientation !== 'vertical'\" name=\"wide\" [columns]=\"3\"></sme-layout-definition>\r\n <sme-layout-item *ngFor=\"let item of items; index as i\" [columnSpan]=\"item.columnSpan\"\r\n [maxWidth]=\"orientation === 'vertical' ? null : item.columnSpan * layoutItemWidth\">\r\n <div class=\"sme-property-grid-item\" tabindex=\"0\" aria-live=\"polite\" aria-atomic=\"true\" #zone=\"smeTooltipZone\" smeTooltipZone>\r\n <label class=\"sme-arrange-stack-h\">\r\n <span>{{ item.label }}</span>\r\n <span *ngIf=\"item.tooltip\" class=\"sme-position-flex-none sme-icon sme-icon-info sme-info-bubble sme-margin-left-xs\"\r\n [title]=\"item.tooltip\" [tooltipZone]=\"zone\" aria-hidden=\"true\" tabindex=\"0\"></span>\r\n <!-- in scan mode screen reader does not focus on the info icon properly to read the title -->\r\n <span class=\"sme-screen-reader\">{{ item.tooltip }}</span>\r\n </label>\r\n <ng-container *ngTemplateOutlet=\"getTemplate(item);context:{$implicit:item, index: i}\"></ng-container>\r\n </div>\r\n </sme-layout-item>\r\n</sme-layout>\r\n\r\n<!-- Read only -->\r\n<ng-template #readonlyTemplate let-item let-i=\"index\">\r\n <sme-loading-wheel *ngIf=\"item.loading && item.isAsync\" size=\"extra-small\" [inline]=\"true\" [isBackgroundTransparent]=\"true\"></sme-loading-wheel>\r\n <ng-container *ngIf=\"!item.loading || !item.isAsync\">\r\n <p class=\"sme-read-only-template\" [attr.aria-labelledby]=\"idBag.labelSpan + i\" [attr.aria-describedby]=\"idBag.detailsSpan + i\">\r\n <ng-container *ngTemplateOutlet=\"iconTemplate;context:{$implicit:item, index: i}\"></ng-container>\r\n <span *ngIf=\"!item.link && !item.action\">{{ stringifyValue(item.value) }}</span>\r\n </p>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Action link (role button) -->\r\n<ng-template #actionLinkTemplate let-item let-i=\"index\">\r\n <p>\r\n <ng-container *ngTemplateOutlet=\"iconTemplate;context:{$implicit:item, index: i}\"></ng-container>\r\n <span *ngIf=\"item.prefixString\" class=\"sme-padding-right-xs\">{{ item.prefixString }}</span>\r\n <a tabindex=\"0\" class=\"sme-link sme-focus-zone sme-action-link-template\" role=\"link\" (click)=\"item.action(item)\"\r\n [attr.aria-labelledby]=\"(idBag.labelSpan + i) + ' ' + (idBag.valueSpan + i)\"\r\n [attr.aria-describedby]=\"idBag.detailsSpan + i\">{{ item.value }}</a>\r\n </p>\r\n</ng-template>\r\n\r\n<!-- Internal link -->\r\n<ng-template #internalLinkTemplate let-item let-i=\"index\">\r\n <p>\r\n <ng-container *ngTemplateOutlet=\"iconTemplate;context:{$implicit:item, index: i}\"></ng-container>\r\n <span *ngIf=\"item.prefixString\" class=\"sme-padding-right-xs\">{{ item.prefixString }}</span>\r\n <a class=\"sme-link sme-focus-zone\" role=\"link\" [routerLink]=\"item.link\" [attr.aria-labelledby]=\"(idBag.labelSpan + i) + ' ' + (idBag.valueSpan + i)\"\r\n [attr.aria-describedby]=\"idBag.detailsSpan + i\">{{ item.value }}</a>\r\n </p>\r\n</ng-template>\r\n\r\n<!-- External link -->\r\n<ng-template #externalLinkTemplate let-item let-i=\"index\">\r\n <p>\r\n <ng-container *ngTemplateOutlet=\"iconTemplate;context:{$implicit:item, index: i}\"></ng-container>\r\n <span *ngIf=\"item.prefixString\" class=\"sme-padding-right-xs\">{{ item.prefixString }}</span>\r\n <a class=\"sme-link sme-focus-zone sme-icon sme-icon-after sme-icon-openInNewWindow\" role=\"link\" [href]=\"item.link\" target=\"_blank\"\r\n [attr.aria-labelledby]=\"(idBag.labelSpan + i) + ' ' + (idBag.valueSpan + i)\" [attr.aria-describedby]=\"idBag.detailsSpan + i\">{{ item.value }}</a>\r\n </p>\r\n</ng-template>\r\n\r\n<!-- Icon Template -->\r\n<ng-template #iconTemplate let-item let-i=\"index\">\r\n <span *ngIf=\"!!item.iconClass\" class=\"sme-margin-right-xs sme-icon {{item.iconClass}}\"></span>\r\n <sme-status-icon *ngIf=\"item.status !== undefined && item.status !== null && !item.iconClass\" class=\"sme-layout-inline-block sme-margin-right-xs \"\r\n [status]=\"item.status\" size=\"16px\"></sme-status-icon>\r\n</ng-template>\r\n" }]
}], function () { return [{ type: i0.Injector }, { type: undefined, decorators: [{
type: SkipSelf
}, {
type: Optional
}, {
type: Inject,
args: [SME_LAYOUT_PROVIDER]
}] }]; }, { items: [{
type: ContentChildren,
args: [PropertyGridItemComponent]
}], readonlyTemplate: [{
type: ViewChild,
args: ['readonlyTemplate', { static: true }]
}], actionLinkTemplate: [{
type: ViewChild,
args: ['actionLinkTemplate', { static: true }]
}], internalLinkTemplate: [{
type: ViewChild,
args: ['internalLinkTemplate', { static: true }]
}], externalLinkTemplate: [{
type: ViewChild,
args: ['externalLinkTemplate', { static: true }]
}], orientation: [{
type: Input
}], layoutChanged: [{
type: Output
}], windowBreakpointChanged: [{
type: Output
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9wcm9wZXJ0eS1ncmlkL3Byb3BlcnR5LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvcHJvcGVydHktZ3JpZC9wcm9wZXJ0eS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBRVQsUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFVLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7SUNsQjlGLDRDQUEwSTs7O0lBQWxFLGtEQUEyQixjQUFBOzs7SUFDbkcsNENBQTRHOztJQUF0QywyQkFBYTs7O0lBTTdFLDJCQUNxRjs7OztJQUFuRix3Q0FBc0IscUJBQUE7OztJQUkxQix3QkFBc0c7Ozs7SUFWMUcsMkNBQ3FGLGtCQUFBLGdCQUFBLFdBQUE7SUFHekUsWUFBZ0I7SUFBQSxpQkFBTztJQUM3QiwyRkFDcUY7SUFFckYsZ0NBQWdDO0lBQUEsWUFBa0I7SUFBQSxpQkFBTyxFQUFBO0lBRTNELDJHQUFzRztJQUN4RyxpQkFBTSxFQUFBOzs7OztJQVhnRCxnREFB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LE1BQU07dUJBQUMsbUJBQW1CO3dCQXpDNUUsS0FBSztrQkFEWCxlQUFlO21CQUFDLHlCQUF5QjtZQUluQyxnQkFBZ0I7a0JBRHRCLFNBQVM7bUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO1lBSXhDLGtCQUFrQjtrQkFEeEIsU0FBUzttQkFBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFJMUMsb0JBQW9CO2tCQUQxQixTQUFTO21CQUFDLHNCQUFzQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtZQUk1QyxvQkFBb0I7a0JBRDFCLFNBQVM7bUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO1lBYzVDLFdBQVc7a0JBRGpCLEtBQUs7WUFPQyxhQUFhO2tCQURuQixNQUFNO1lBT0EsdUJBQXVCO2tCQUQ3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIENvbnRlbnRDaGlsZHJlbixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIGZvcndhcmRSZWYsXHJcbiAgICBJbmplY3QsXHJcbiAgICBJbmplY3RvcixcclxuICAgIElucHV0LFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgT3B0aW9uYWwsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBRdWVyeUxpc3QsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgU2tpcFNlbGYsXHJcbiAgICBUZW1wbGF0ZVJlZixcclxuICAgIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb3JlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExheW91dCwgU01FX0xBWU9VVF9QUk9WSURFUiB9IGZyb20gJy4uL2NvbW1vbi9sYXlvdXQnO1xyXG5pbXBvcnQgeyBQcm9wZXJ0eUdyaWRJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1ncmlkLWl0ZW0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgUHJvcGVydHlHcmlkUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIgfSBmcm9tICcuL3Byb3BlcnR5LWdyaWQtcmVzcG9uc2l2ZS13aW5kb3ctbWFuYWdlcic7XHJcblxyXG4vKipcclxuICogVGhlIHBhbmUgb3JpZW50YXRpb24gb2YgdGhlIHNwbGl0IHZpZXcuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBQcm9wZXJ0eUdyaWRPcmllbnRhdGlvbiA9ICd2ZXJ0aWNhbCcgfCAnaG9yaXpvbnRhbCc7XHJcblxyXG4vKipcclxuICpcclxuICogQHNtZURvYyB7QGxhYmVsIFByb3BlcnR5IEdyaWQgQGlkIHNtZS1wcm9wZXJ0eS1ncmlkLWNvbXBvbmVudH1cclxuICpcclxuICogQG92ZXJ2aWV3XHJcbiAqIEBmaWxlIHtAZmlsZXBhdGggLi9leGFtcGxlcy9vdmVydmlldy5tZH1cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBCYXNpYyBVc2FnZSBAaWQgYmFzaWMtdXNhZ2V9XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50Lmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvYmFzaWMtdXNhZ2UuY29tcG9uZW50Lmh0bWx9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgVmVydGljYWwgT3JpZW50YXRpb24gQGlkIHZlcnRpY2FsLW9yaWVudGF0aW9ufVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC5odG1sIEBmaWxlcGF0aCAuL2V4YW1wbGVzL3ZlcnRpY2FsLW9yaWVudGF0aW9uLmNvbXBvbmVudC5odG1sfVxyXG4gKlxyXG4gKiBAZXhhbXBsZSB7QGxhYmVsIEl0ZW0gd2l0aCBhIExpbmsgQGlkIGxpbmstaXRlbX1cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQuaHRtbCBAZmlsZXBhdGggLi9leGFtcGxlcy9saW5rLWl0ZW0uY29tcG9uZW50Lmh0bWx9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgSXRlbSB3aXRoIGEgVG9vbHRpcCBAaWQgdG9vbHRpcC1pdGVtfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC5odG1sIEBmaWxlcGF0aCAuL2V4YW1wbGVzL3Rvb2x0aXAtaXRlbS5jb21wb25lbnQuaHRtbH1cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBJdGVtIHdpdGggYSBBY3Rpb24gQGlkIGFjdGlvbi1pdGVtfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC50cyBAZmlsZXBhdGggLi9leGFtcGxlcy9hY3Rpb24taXRlbS5jb21wb25lbnQudHN9XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50Lmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvYWN0aW9uLWl0ZW0uY29tcG9uZW50Lmh0bWx9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgSXRlbSBTcGFubmluZyBNdWx0aXBsZSBDb2x1bW5zIEBpZCBtdWx0aS1jb2x1bW59XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50Lmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvbXVsdGktY29sdW1uLWl0ZW0uY29tcG9uZW50Lmh0bWx9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgSXRlbXMgd2l0aCBTdGF0dXMgYW5kIEljb25zIEBpZCBzdGF0dXMtYW5kLWljb25zfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC5odG1sIEBmaWxlcGF0aCAuL2V4YW1wbGVzL3N0YXR1cy1pdGVtLmNvbXBvbmVudC5odG1sfVxyXG4gKlxyXG4gKiBAZXhhbXBsZSB7QGxhYmVsIEl0ZW1zIHdpdGggY29tcGxleCB2YWx1ZSB0eXBlcyBAaWQgY29tcGxleC12YWx1ZX1cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQuaHRtbCBAZmlsZXBhdGggLi9leGFtcGxlcy9jb21wbGV4LXZhbHVlcy5jb21wb25lbnQuaHRtbH1cclxuICpcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtcHJvcGVydHktZ3JpZCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vcHJvcGVydHktZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7IHByb3ZpZGU6IFNNRV9MQVlPVVRfUFJPVklERVIsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFByb3BlcnR5R3JpZENvbXBvbmVudCkgfVxyXG4gICAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvcGVydHlHcmlkQ29tcG9uZW50IGV4dGVuZHMgQ29yZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBMYXlvdXQsIE9uQ2hhbmdlcyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBiYXNpYyBjb2x1bW4gd2lkdGggZm9yIHRoZSBwcm9wZXJ0eSBncmlkIGl0ZW1zLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGF5b3V0SXRlbVdpZHRoID0gMzAwO1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oUHJvcGVydHlHcmlkSXRlbUNvbXBvbmVudClcclxuICAgIHB1YmxpYyBpdGVtczogUXVlcnlMaXN0PFByb3BlcnR5R3JpZEl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3JlYWRvbmx5VGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gICAgcHVibGljIHJlYWRvbmx5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPFByb3BlcnR5R3JpZEl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2FjdGlvbkxpbmtUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgICBwdWJsaWMgYWN0aW9uTGlua1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxQcm9wZXJ0eUdyaWRJdGVtQ29tcG9uZW50PjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdpbnRlcm5hbExpbmtUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgICBwdWJsaWMgaW50ZXJuYWxMaW5rVGVtcGxhdGU6IFRlbXBsYXRlUmVmPFByb3BlcnR5R3JpZEl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2V4dGVybmFsTGlua1RlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIHB1YmxpYyBleHRlcm5hbExpbmtUZW1wbGF0ZTogVGVtcGxhdGVSZWY8UHJvcGVydHlHcmlkSXRlbUNvbXBvbmVudD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ1Byb3BlcnR5R3JpZENvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb3JpZW50YXRpb24gZm9yIHRoZSBwcm9wZXJ0eSBncmlkXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgb3JpZW50YXRpb246IFByb3BlcnR5R3JpZE9yaWVudGF0aW9uID0gJ2hvcml6b250YWwnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wbGVtZW50YXRpb24gb2YgdGhlIExheW91dCBpbnRlcmZhY2VcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgbGF5b3V0Q2hhbmdlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wbGVtZW50YXRpb24gb2YgdGhlIExheW91dCBpbnRlcmZhY2VcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgd2luZG93QnJlYWtwb2ludENoYW5nZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICBwcml2YXRlIHByb3BlcnR5R3JpZFJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyID0gbmV3IFByb3BlcnR5R3JpZFJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBAU2tpcFNlbGYoKSBAT3B0aW9uYWwoKSBASW5qZWN0KFNNRV9MQVlPVVRfUFJPVklERVIpIGxheW91dDogTGF5b3V0KSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgICAgIC8vIG9sZCBzdHlsZSBzdXBwb3J0ZWQgc21lLXByb3BlcnR5LWdyaWQtYXJyYW5nZS12ZXJ0aWNhbCBjbGFzcy4gZGVmYXVsdCB0byB2ZXJ0aWNhbCBvcmllbnRhdGlvbiBpZiB0aGlzIGNsYXNzIGlzIGFwcGxpZWQuXHJcbiAgICAgICAgY29uc3QgaGFzVmVydGljYWxDbGFzcyA9ICg8SFRNTEVsZW1lbnQ+dGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50KS5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS1wcm9wZXJ0eS1ncmlkLWFycmFuZ2UtdmVydGljYWwnKTtcclxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gaGFzVmVydGljYWxDbGFzcyA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XHJcblxyXG4gICAgICAgIC8vIG9uIHBhcmVudCBsYXlvdXQgY2hhbmdlcywgcmUtZW1pdCB0aGUgbGF5b3V0IGNoYW5nZSB0byBvdXIgZXZlbnRcclxuICAgICAgICBpZiAobGF5b3V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgbGF5b3V0LmxheW91dENoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dENoYW5nZWQuZW1pdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5R3JpZFJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyLm9uV2luZG93U2l6ZUNoYW5nZWQodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKE1zZnRTbWUuaXNOdWxsT3JXaGl0ZVNwYWNlKHZhbHVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJy0nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCh2ID0+IHRoaXMuc3RyaW5naWZ5VmFsdWUodikpLmpvaW4oJyxcXG4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKE1zZnRTbWUuaXNPYmplY3QodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZShpdGVtOiBQcm9wZXJ0eUdyaWRJdGVtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgaWYgKGl0ZW0uYWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGlvbkxpbmtUZW1wbGF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGl0ZW0ubGluaykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5pc0V4dGVybmFsTGluaykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZXJuYWxMaW5rVGVtcGxhdGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbExpbmtUZW1wbGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkb25seVRlbXBsYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMub3JpZW50YXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRDaGFuZ2VkLmVtaXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSB1bmRlZmluZWQgdmFsdWUgd29uJ3QgYmUgdXBkYXRlZCBzaXR1YXRpb24gZm9yIGFzeW5jIHByb3BlcnR5IGl0ZW0uXHJcbiAgICAgKiBBbmd1bGFyIGlzc3VlIHRoYXQgdGhlIHByb3BlcnR5IGl0ZW0gdmFsdWUgaW5pdGlhbGl6ZWQgd2l0aCB1bmRlZmluZWQsIGlmIGFmdGVyIGFzeW5jIHRpbWUsIHRoZSB2YWx1ZSBiZWluZyBzZXQgaXMgc3RpbGwgdW5kZWZpbmVkLFxyXG4gICAgICogQW5ndWxhciB3aWxsIG5vdCBiZSBhYmxlIHRvIHRyaWdnZXIgdGhlIHZhbHVlIG9uIGNoYW5nZWQgZXZlbnQuIFRodXMgd2UgaGF2ZSB0byBtYW51YWxseSBjYWxsIHRvIHJlZnJlc2ggaXQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0aGF0IG5lZWRzIHRvIGhhcmQgcmVmcmVzaC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhcmRSZWZyZXNoSXRlbShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcy50b0FycmF5KCk7XHJcbiAgICAgICAgaWYgKCFpdGVtc1tpbmRleF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2luZGV4XTtcclxuICAgICAgICBpZiAoaXRlbS5pc0FzeW5jICYmIGl0ZW0udmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpdGVtLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBpZEJhZyB1c2VkIGJ5IHRoaXMgY29tcG9uZW50IHRvIHN0b3JlIHVuaXF1ZSBlbGVtZW50IGlkcy5cclxuICAgICAqIGlkIHZhbHVlcyB3aWxsIGJlIGFzc2lnbmVkIGJlIHRoZSBAc2VlIEJhc2VDb21wb25lbnQgc3VwZXIgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjcmVhdGVJZEJhZygpOiBNc2Z0U21lLlN0cmluZ01hcDxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkZXRhaWxzU3BhbjogJycsXHJcbiAgICAgICAgICAgIGxhYmVsU3BhbjogJycsXHJcbiAgICAgICAgICAgIHZhbHVlU3BhbjogJydcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgaW5pdGlhbCBob3N0IGNsYXNzZXMgdG8gYmUgYXBwbGllZCB0byB0aGlzIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldEluaXRpYWxIb3N0Q2xhc3NlcygpIHtcclxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW5pdGlhbEhvc3RDbGFzc2VzKCkuY29uY2F0KFtcclxuICAgICAgICAgICAgJ3NtZS1wcm9wZXJ0eS1ncmlkJyxcclxuICAgICAgICAgICAgJ3NtZS1sYXlvdXQtcmVsYXRpdmUnLFxyXG4gICAgICAgICAgICAnc21lLWZvY3VzLXpvbmUnXHJcbiAgICAgICAgXSk7XHJcbiAgICB9XHJcbn1cclxuIiwiPHNtZS1sYXlvdXQgI2xheW91dCBbcGFkTGFzdEl0ZW1dPVwidHJ1ZVwiIGNsYXNzPVwic21lLXBvc2l0aW9uLWluc2V0LW5vbmUgc21lLXBvc2l0aW9uLXN0cmV0Y2gtaFwiIFtvbmVDb2x1bW5dPVwib3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIj5cclxuICA8c21lLWxheW91dC1kZWZpbml0aW9uIG5hbWU9XCJuYXJyb3dcIiBbdW50aWxdPVwibGF5b3V0SXRlbVdpZHRoXCIgW2NvbHVtbnNdPVwiMVwiPjwvc21lLWxheW91dC1kZWZpbml0aW9uPlxyXG4gIDxzbWUtbGF5b3V0LWRlZmluaXRpb24gKm5nSWY9XCJvcmllbnRhdGlvbiAhPT0gJ3ZlcnRpY2FsJ1wiIG5hbWU9XCJtZWRpdW1cIiBbdW50aWxdPVwibGF5b3V0SXRlbVdpZHRoKjJcIiBbY29sdW1uc109XCIyXCI+PC9zbWUtbGF5b3V0LWRlZmluaXRpb24+XHJcbiAgPHNtZS1sYXlvdXQtZGVmaW5pdGlvbiAqbmdJZj1cIm9yaWVudGF0aW9uICE9PSAndmVydGljYWwnXCIgbmFtZT1cIndpZGVcIiBbY29sdW1uc109XCIzXCI+PC9zbWUtbGF5b3V0LWRlZmluaXRpb24+XHJcbiAgPHNtZS1sYXlvdXQtaXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgaW5kZXggYXMgaVwiIFtjb2x1bW5TcGFuXT1cIml0ZW0uY29sdW1uU3BhblwiXHJcbiAgICBbbWF4V2lkdGhdPVwib3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBudWxsIDogaXRlbS5jb2x1bW5TcGFuICogbGF5b3V0SXRlbVdpZHRoXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLXByb3BlcnR5LWdyaWQtaXRlbVwiIHRhYmluZGV4PVwiMFwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtYXRvbWljPVwidHJ1ZVwiICN6b25lPVwic21lVG9vbHRpcFpvbmVcIiBzbWVUb29sdGlwWm9uZT5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2staFwiPlxyXG4gICAgICAgIDxzcGFuPnt7IGl0ZW0ubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLnRvb2x0aXBcIiBjbGFzcz1cInNtZS1wb3NpdGlvbi1mbGV4LW5vbmUgc21lLWljb24gc21lLWljb24taW5mbyBzbWUtaW5mby1idWJibGUgc21lLW1hcmdpbi1sZWZ0LXhzXCJcclxuICAgICAgICAgIFt0aXRsZV09XCJpdGVtLnRvb2x0aXBcIiBbdG9vbHRpcFpvbmVdPVwiem9uZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRhYmluZGV4PVwiMFwiPjwvc3Bhbj5cclxuICAgICAgICA8IS0tIGluIHNjYW4gbW9kZSBzY3JlZW4gcmVhZGVyIGRvZXMgbm90IGZvY3VzIG9uIHRoZSBpbmZvIGljb24gcHJvcGVybHkgdG8gcmVhZCB0aGUgdGl0bGUgLS0+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtc2NyZWVuLXJlYWRlclwiPnt7IGl0ZW0udG9vbHRpcCB9fTwvc3Bhbj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKGl0ZW0pO2NvbnRleHQ6eyRpbXBsaWNpdDppdGVtLCBpbmRleDogaX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvc21lLWxheW91dC1pdGVtPlxyXG48L3NtZS1sYXlvdXQ+XHJcblxyXG48IS0tIFJlYWQgb25seSAtLT5cclxuPG5nLXRlbXBsYXRlICNyZWFkb25seVRlbXBsYXRlIGxldC1pdGVtIGxldC1pPVwiaW5kZXhcIj5cclxuICA8c21lLWxvYWRpbmctd2hlZWwgKm5nSWY9XCJpdGVtLmxvYWRpbmcgJiYgaXRlbS5pc0FzeW5jXCIgc2l6ZT1cImV4dHJhLXNtYWxsXCIgW2lubGluZV09XCJ0cnVlXCIgW2lzQmFja2dyb3VuZFRyYW5zcGFyZW50XT1cInRydWVcIj48L3NtZS1sb2FkaW5nLXdoZWVsPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS5sb2FkaW5nIHx8ICFpdGVtLmlzQXN5bmNcIj5cclxuICAgIDxwIGNsYXNzPVwic21lLXJlYWQtb25seS10ZW1wbGF0ZVwiIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpZEJhZy5sYWJlbFNwYW4gKyBpXCIgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpZEJhZy5kZXRhaWxzU3BhbiArIGlcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImljb25UZW1wbGF0ZTtjb250ZXh0OnskaW1wbGljaXQ6aXRlbSwgaW5kZXg6IGl9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiIWl0ZW0ubGluayAmJiAhaXRlbS5hY3Rpb25cIj57eyBzdHJpbmdpZnlWYWx1ZShpdGVtLnZhbHVlKSB9fTwvc3Bhbj5cclxuICAgIDwvcD5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gQWN0aW9uIGxpbmsgKHJvbGUgYnV0dG9uKSAtLT5cclxuPG5nLXRlbXBsYXRlICNhY3Rpb25MaW5rVGVtcG