@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
598 lines • 86.1 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, Inject, Injector, Input, IterableDiffers, Optional, ViewChild } from '@angular/core';
import { FormArray, FormGroup } from '@angular/forms';
import { Router } from '@angular/router';
import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators';
import { Yield } from '@microsoft/windows-admin-center-sdk/core/base/decorators/yield.decorator';
import { Net } from '@microsoft/windows-admin-center-sdk/core/data/net';
import { EnvironmentModule } from '@microsoft/windows-admin-center-sdk/core/manifest/environment-modules';
import { RpcOverlayCloseClient } from '@microsoft/windows-admin-center-sdk/core/rpc/overlay/rpc-overlay-close-client';
import { RpcType } from '@microsoft/windows-admin-center-sdk/core/rpc/rpc-base';
import { EMPTY, from } from 'rxjs';
import { AppContextService } from '../../../service/app-context.service';
import { RpcShellService } from '../../../service/rpc-shell.service';
import { CoreBaseComponent } from '../../common/base.component';
import { SME_LAYOUT_PROVIDER } from '../../common/layout';
import { SearchFormFieldComponent } from '../../form';
import { SettingsFormService } from '../settings-form.service';
import { SettingsComponent } from '../settings.component';
import { SettingsResponsiveWindowManager } from './settings-responsive-window-manager';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "../settings-form.service";
import * as i3 from "../../../service/app-context.service";
import * as i4 from "../../../service/rpc-shell.service";
import * as i5 from "../../../directives/router/router-link.directive";
import * as i6 from "@angular/common";
import * as i7 from "../../tooltip/tooltip.directive";
import * as i8 from "@angular/forms";
import * as i9 from "../../form/form-field/search/search-form-field.component";
import * as i10 from "../../form/form-field/form-field-accessor.directive";
import * as i11 from "../../form/form-field/form-field-validator.directive";
import * as i12 from "../settings.component";
import * as i13 from "../settings-footer.component";
import * as i14 from "../settings-header.component";
import * as i15 from "../settings-content.component";
import * as i16 from "../settings-navigation.component";
const _c0 = ["searchTextBox"];
function CommonSettingsComponent_header_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "header", 12)(1, "h2", 13);
i0.ɵɵtext(2);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵattribute("aria-label", ctx_r0.settingsTitle);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r0.settingsTitle);
} }
function CommonSettingsComponent_li_10_div_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 17);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r9 = i0.ɵɵnextContext();
const j_r6 = ctx_r9.index;
const group_r5 = ctx_r9.$implicit;
const ctx_r7 = i0.ɵɵnextContext();
i0.ɵɵproperty("id", ctx_r7.idBag.group + "-" + j_r6)("title", group_r5.group);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(group_r5.group);
} }
function CommonSettingsComponent_li_10_a_2_div_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "div", 24);
} if (rf & 2) {
const setting_r10 = i0.ɵɵnextContext().$implicit;
const ctx_r12 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("ngClass", ctx_r12.getSmeIconClass(setting_r10));
} }
function CommonSettingsComponent_li_10_a_2_div_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "div", 25);
} if (rf & 2) {
const setting_r10 = i0.ɵɵnextContext().$implicit;
i0.ɵɵstyleProp("background-image", setting_r10.urlIcon);
} }
function CommonSettingsComponent_li_10_a_2_div_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "div", 25);
} if (rf & 2) {
const ctx_r14 = i0.ɵɵnextContext(3);
i0.ɵɵstyleProp("background-image", ctx_r14.defaultIcon);
} }
function CommonSettingsComponent_li_10_a_2_Template(rf, ctx) { if (rf & 1) {
const _r18 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "a", 18);
i0.ɵɵlistener("smeRouterLinkActivated", function CommonSettingsComponent_li_10_a_2_Template_a_smeRouterLinkActivated_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r18); const setting_r10 = restoredCtx.$implicit; const ctx_r17 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r17.onSmeRouterLinkActivated(setting_r10)); });
i0.ɵɵelementStart(1, "div", 19);
i0.ɵɵtemplate(2, CommonSettingsComponent_li_10_a_2_div_2_Template, 1, 1, "div", 20);
i0.ɵɵtemplate(3, CommonSettingsComponent_li_10_a_2_div_3_Template, 1, 2, "div", 21);
i0.ɵɵtemplate(4, CommonSettingsComponent_li_10_a_2_div_4_Template, 1, 2, "div", 21);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "div", 22)(6, "span", 23);
i0.ɵɵtext(7);
i0.ɵɵelementEnd()()();
} if (rf & 2) {
const setting_r10 = ctx.$implicit;
const i_r11 = ctx.index;
const j_r6 = i0.ɵɵnextContext().index;
const ctx_r8 = i0.ɵɵnextContext();
i0.ɵɵattributeInterpolate5("aria-labelledby", "", ctx_r8.idBag.option, "-", j_r6, "-", i_r11, " ", ctx_r8.idBag.group, "-", j_r6, "");
i0.ɵɵproperty("routerLink", setting_r10.routeParams.commands)("preserveFragment", setting_r10.routeParams.extras && setting_r10.routeParams.extras.preserveFragment)("skipLocationChange", setting_r10.routeParams.extras && setting_r10.routeParams.extras.skipLocationChange)("replaceUrl", setting_r10.routeParams.extras && setting_r10.routeParams.extras.replaceUrl)("queryParams", setting_r10.routeParams.extras && setting_r10.routeParams.extras.queryParams)("title", setting_r10.label);
i0.ɵɵattribute("aria-selected", ctx_r8.selectedSetting === setting_r10);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", setting_r10.smeIconClassName);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", setting_r10.urlIcon);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !setting_r10.urlIcon && !setting_r10.smeIconClassName);
i0.ɵɵadvance(2);
i0.ɵɵclassProp("sme-dirty", !!(setting_r10.form && setting_r10.form.dirty))("sme-pristine", !(setting_r10.form && setting_r10.form.dirty));
i0.ɵɵproperty("id", ctx_r8.idBag.option + "-" + j_r6 + "-" + i_r11);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(setting_r10.label);
} }
function CommonSettingsComponent_li_10_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "li", 14);
i0.ɵɵtemplate(1, CommonSettingsComponent_li_10_div_1_Template, 2, 3, "div", 15);
i0.ɵɵtemplate(2, CommonSettingsComponent_li_10_a_2_Template, 8, 21, "a", 16);
i0.ɵɵelementEnd();
} if (rf & 2) {
const group_r5 = ctx.$implicit;
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", group_r5.group !== ctx_r2.defaultGroup);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngForOf", group_r5.options);
} }
function CommonSettingsComponent_div_11_div_1_Template(rf, ctx) { if (rf & 1) {
const _r23 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "div", 27);
i0.ɵɵlistener("click", function CommonSettingsComponent_div_11_div_1_Template_div_click_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r23); const layer_r21 = restoredCtx.$implicit; const ctx_r22 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r22.onOverlayClick(layer_r21)); });
i0.ɵɵelementEnd();
} }
function CommonSettingsComponent_div_11_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div");
i0.ɵɵtemplate(1, CommonSettingsComponent_div_11_div_1_Template, 1, 0, "div", 26);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r3 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngForOf", ctx_r3.layers);
} }
function CommonSettingsComponent_sme_settings_header_12_h3_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "h3", 29);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r24 = i0.ɵɵnextContext(2);
i0.ɵɵattribute("aria-label", ctx_r24.selectedSetting.label);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", ctx_r24.selectedSetting.label, "");
} }
function CommonSettingsComponent_sme_settings_header_12_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "sme-settings-header");
i0.ɵɵtemplate(1, CommonSettingsComponent_sme_settings_header_12_h3_1_Template, 2, 2, "h3", 28);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !!ctx_r4.selectedSetting);
} }
const _c1 = ["*"];
/**
* Container around settings component, handles common settings behavior.
*/
export class CommonSettingsComponent extends CoreBaseComponent {
constructor(injector, router, settingsForms, iterableDiffers, appContext, rpcShellService, layout) {
super(injector);
this.router = router;
this.settingsForms = settingsForms;
this.iterableDiffers = iterableDiffers;
this.appContext = appContext;
this.rpcShellService = rpcShellService;
/**
* If no header is being used internally, the control will depend on external header being customized
* For instance, a breadcrumb header can be used. And in this case, no extra scroll bar can be rendered on phone down.
*/
this.externalHeader = false;
this.defaultGroup = 'default';
this.layers = [];
/**
* Search box filter.
*/
this.filter = '';
this.filteredSettings = [];
this.showHeader = true;
this.hackShowOverlay = false;
this.hackToolHeader = false;
/**
* If connection settings page, the contents are all iframe, special logic to get rid of the extra scroll bar for iframe.
*/
this.connectionSettings = false;
/**
* Controls whether the tab list showing the Settings items is scrollable or not
* Default to true. Allowing separate scroll bar for the navbar and the selected Settings.
* Set to false for backward compatibility and use previous behavior where there is
* only 1 single scroll bar for both navbar and content of the selected Settings item.
*/
this.scrollableSecondaryNav = true;
this.autofocus = true;
this.combinedForm = new FormGroup({});
this.searchBoxPlaceholder = this.strings.MsftSmeShell.Angular.searchPlaceHolder;
if (layout) {
this.settingsResponsiveWindowManager = new SettingsResponsiveWindowManager(layout);
// on parent layout changes, re-emit the layout change to our event
this.subscriptions.push(layout.layoutChanged.subscribe((() => this.onLayoutChanged())));
// on window break point changes, emit the event about critical classes and styling updates signal.
this.subscriptions.push(layout.windowBreakpointChanged.subscribe(() => this.onWindowBreakpointChanged()));
this.deferredOnLayoutChanged();
}
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'CommonSettingsComponent';
}
ngOnInit() {
super.ngOnInit();
this.subscriptions.push(this.settingsForms.formAdded().subscribe((formAddedData) => {
// to avoid duplicates we first remove the form if it exists
this.latestForm = formAddedData.formGroup;
this.latestPristineFormValue = this.getRawValueRecursive(formAddedData.formGroup);
this.latestFormUpdateValueInComponent = formAddedData.updateValueInComponent;
this.recalculateActivePanel();
}));
this.settingsDiffer = this.iterableDiffers.find(this.settings).create(null);
this.recalculateActivePanel();
if (this.hackShowOverlay) {
this.subscriptions.push(this.rpcShellService.overlayOpenSubject.subscribe((deferredData) => {
// overlay tools with one more layer or remove one from top
if (deferredData.data.overlay) {
this.layers.push(deferredData.data);
}
else if (this.layers.length > 0) {
this.layers.pop();
}
else {
throw new Error('Rpc OverlayClose: close request is called while layer is no longer available');
}
deferredData.deferred.resolve();
}));
}
if (!this.showHeader && !this.hackToolHeader) {
this.externalHeader = true;
}
this.defaultIcon = EnvironmentModule.getFormattedIconRefUrl('/assets/icons/default.svg?v=1');
}
ngOnChanges(changes) {
super.ngOnChanges(changes);
if (changes.settings) {
this.settingsDiffer = this.iterableDiffers.find(this.settings).create(null);
}
this.createMenu();
this.recalculateActivePanel();
}
/**
* The deferred layout changed handler.
*/
deferredOnLayoutChanged() {
this.onLayoutChanged();
}
onLayoutChanged() {
this.settingsResponsiveWindowManager.setIframeHeight(this.connectionSettings, this.hostElement);
}
onWindowBreakpointChanged() {
if (!this.hostElement || !this.hostElement.nativeElement) {
return;
}
this.settingsResponsiveWindowManager.onWindowSizeChangedCommonSettings(this.connectionSettings, this.hostElement);
}
ngDoCheck() {
super.ngDoCheck();
if (this.settingsDiffer) {
const changes = this.settingsDiffer.diff(this.settings);
if (changes) {
this.createMenu();
}
}
}
ngAfterViewChecked() {
if (this.autofocus) {
const focusElements = this.hostElement.nativeElement.querySelectorAll('[role="tab"]');
if (focusElements && focusElements.length) {
focusElements[0].focus();
this.autofocus = false;
}
}
// Setting Title header is managed by child component this.settingsComponent,
// after current view and child view has been rendered, pass along the selectedSetting
// string if it exists so child view will render the title
if (this.selectedSetting) {
this.onSmeRouterLinkActivated(this.selectedSetting);
}
}
createMenu() {
// Before creating the Settings menu, filter the Settings menu to only display
// items that matches the filter
this.filteredSettings = this.filterSetting();
const groupTools = [];
groupTools['default'] = { group: 'default', options: [] };
this.filteredSettings.forEach((setting) => {
if (!!!setting.group) {
groupTools['default'].options.push(setting);
}
else {
if (!!!groupTools[setting.group]) {
groupTools[setting.group] = { group: setting.group, title: setting.groupTitle, options: [] };
}
groupTools[setting.group].options.push(setting);
}
});
this.groupTools = [];
for (const prop in groupTools) {
if (prop) {
this.groupTools.push(groupTools[prop]);
}
}
}
recalculateActivePanel() {
const setting = this.selectedSetting;
if (MsftSme.isNullOrUndefined(setting)) {
return;
}
if (setting.form && setting.form.dirty) {
const formValue = this.getRawValueRecursive(setting.form);
if (setting.updateValueInComponent) {
this.settingsForms.newFormValue(setting.form, formValue);
}
else {
this.latestForm.setValue(formValue);
}
this.latestForm.markAsDirty();
}
this.settingsForms.removeForm(setting.form);
setting.form = this.latestForm;
if (setting.form) {
if (this.combinedForm.controls[setting.label]) {
this.combinedForm.setControl(setting.label, setting.form);
}
else {
this.combinedForm.addControl(setting.label, setting.form);
}
}
setting.updateValueInComponent = this.latestFormUpdateValueInComponent;
}
discardAllChildForms() {
// For the current active setting, we need to reset the form to its
// original pristine form when discarding changes
const activeSetting = this.selectedSetting;
const settingWithForm = activeSetting;
if (settingWithForm.form) {
settingWithForm.form.reset(this.latestPristineFormValue);
}
this.settings.forEach((otherSetting) => {
if (otherSetting !== activeSetting) {
const othersettingWithForm = otherSetting;
this.settingsForms.removeForm(othersettingWithForm.form);
othersettingWithForm.form = null;
if (this.combinedForm.controls[othersettingWithForm.label]) {
this.combinedForm.removeControl(othersettingWithForm.label);
}
}
});
}
acceptAllChildFormsValue() {
const activeSetting = this.selectedSetting;
this.settings.forEach((setting) => {
const settingWithForm = setting;
if (settingWithForm.form) {
settingWithForm.form.reset(this.getRawValueRecursive(settingWithForm.form));
if (activeSetting === settingWithForm) {
this.latestPristineFormValue = this.getRawValueRecursive(settingWithForm.form);
}
}
});
}
getSmeIconClass(setting) {
const ngClassParameter = {};
if (setting.smeIconClassName) {
ngClassParameter[setting.smeIconClassName] = true;
}
return ngClassParameter;
}
canDeactivate(component, route, state) {
if (this.settingsComponent) {
return this.settingsComponent.canDeactivate(component, route, state);
}
return true;
}
/**
* Gets the initial host classes to be applied to this element
*/
getInitialHostClasses() {
return super.getInitialHostClasses().concat([
'sme-common-settings'
]);
}
/**
* 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 {
group: '',
option: ''
};
}
onOverlayClick(layer) {
const layerRpc = this.appContext.rpc.rpcManager.rpcChannel.getRpc(layer.sourceName, layer.sourceSubName, RpcType.Outbound);
from(RpcOverlayCloseClient.overlayClose(this.appContext.rpc, { overlay: false, dialogId: layer.dialogId }, layerRpc))
.subscribe({
next: result => {
if (!result.overlayClosed && this.layers.length > 0) {
this.layers.pop();
}
},
error: error => {
const notification = this.appContext.notification.create(null);
notification.showError(this.strings.MsftSmeShell.Angular.Overlay.closeErrorTitle, Net.getErrorMessage(error));
if (this.layers.length > 0) {
this.layers.pop();
}
return EMPTY;
}
});
}
/**
* Returns the value of the current control and all its children recursivelly,
* including disabled controls.
*
* Workaround for missing functionality added in later versions of angular
* Currently getRawValue only returns the value of hte current control disabled
* children but only enabled controls of other descendants:
* https://github.com/angular/angular/commit/1ece7366c8b67f387fbe13f8d128c19f4c50dd19
*
* Once we upgrade angular version we can remove this code.
*
* @param formControl The form control to get the value from
*/
getRawValueRecursive(formControl) {
if (formControl instanceof FormGroup) {
const value = {};
Object.keys(formControl.controls).forEach(key => {
value[key] = this.getRawValueRecursive(formControl.controls[key]);
});
return value;
}
else if (formControl instanceof FormArray) {
return formControl.controls.map((control) => {
return this.getRawValueRecursive(control);
});
}
return formControl.value;
}
/**
* Update this.selectedSetting to the newly selected Settings item when user navigate to a new Settings item
* Also call the child component this.settingsComponent to update the settingsTitle to reflect the title
* of the newly selected Settings item
*
* @param newSetting The newly selected Settings item
*/
onSmeRouterLinkActivated(newSetting) {
this.selectedSetting = newSetting;
if (this.settingsComponent) {
this.settingsComponent.updateSelectedSettingTitle(newSetting.label);
}
this.settingsResponsiveWindowManager.setIframeHeight(this.connectionSettings, this.hostElement);
}
/**
* Callback function for the search field
*/
onSearch() {
this.searchTextBox.searching = true;
setTimeout(() => {
this.createMenu();
this.searchTextBox.searching = false;
});
}
/**
* Filter out the settings Item based on this.filter string and match the title of Settings Items
*/
filterSetting() {
const settings = this.settings;
if (!this.filter) {
return settings;
}
const localFilter = this.filter.toLocaleLowerCase();
return settings.filter(setting => {
if (setting.label.toLocaleLowerCase().indexOf(localFilter) > -1) {
return true;
}
// if not match the exact title, need to match with keywords
if (setting.keywords) {
const matches = setting.keywords.filter(keyword => keyword.indexOf(localFilter) > -1);
if (matches.length > 0) {
return true;
}
}
return false;
});
}
}
/** @nocollapse */ CommonSettingsComponent.ɵfac = function CommonSettingsComponent_Factory(t) { return new (t || CommonSettingsComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i2.SettingsFormService), i0.ɵɵdirectiveInject(i0.IterableDiffers), i0.ɵɵdirectiveInject(i3.AppContextService), i0.ɵɵdirectiveInject(i4.RpcShellService), i0.ɵɵdirectiveInject(SME_LAYOUT_PROVIDER, 8)); };
/** @nocollapse */ CommonSettingsComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: CommonSettingsComponent, selectors: [["sme-common-settings"]], viewQuery: function CommonSettingsComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
i0.ɵɵviewQuery(SettingsComponent, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.searchTextBox = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.settingsComponent = _t.first);
} }, inputs: { searchBoxPlaceholder: "searchBoxPlaceholder", settingsTitle: "settingsTitle", settings: "settings", showHeader: "showHeader", hackShowOverlay: "hackShowOverlay", hackToolHeader: "hackToolHeader", connectionSettings: "connectionSettings", backRoute: "backRoute", scrollableSecondaryNav: "scrollableSecondaryNav" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c1, decls: 17, vars: 13, consts: [[3, "settingsTitle"], [1, "sme-position-stretch-v-phone-up", "sme-position-stretch-h", 2, "min-width", "160px"], ["class", "sme-layout-tool-header", 4, "ngIf"], ["role", "region", 1, "sme-position-stretch", "sme-arrange-stack-v"], [1, "sme-position-flex-none", "sme-focus-zone"], [1, "sme-margin-squish-v-sm"], ["type", "search", "name", "toolsListSearch", 3, "ngModel", "placeholder", "autofocus", "count", "ngModelChange", "search"], ["searchTextBox", ""], ["role", "tablist", 1, "sme-arrange-stack-v", "sme-focus-zone", 3, "ngClass"], ["role", "presentation", 1, "sme-position-flex-auto", "sme-arrange-stack-v", "sme-arrange-overflow-hide-x", "sme-arrange-overflow-auto-y"], ["class", "sme-margin-inset-none", "role", "presentation", 4, "ngFor", "ngForOf"], [4, "ngIf"], [1, "sme-layout-tool-header"], [1, "sme-position-flex-none", "sme-font-h3"], ["role", "presentation", 1, "sme-margin-inset-none"], ["class", "sme-font-h4 sme-font-h4-settings", 3, "id", "title", 4, "ngIf"], ["class", "sme-padding-squish-v-sm sme-arrange-stack-h sme-arrange-stack-centered-v sme-scheme-nav-item", "role", "tab", "href", "setting.routeParams.extras && setting.routeParams.extras.replaceUrl", "routerLinkActive", "sme-active", 3, "routerLink", "preserveFragment", "skipLocationChange", "replaceUrl", "queryParams", "title", "smeRouterLinkActivated", 4, "ngFor", "ngForOf"], [1, "sme-font-h4", "sme-font-h4-settings", 3, "id", "title"], ["role", "tab", "href", "setting.routeParams.extras && setting.routeParams.extras.replaceUrl", "routerLinkActive", "sme-active", 1, "sme-padding-squish-v-sm", "sme-arrange-stack-h", "sme-arrange-stack-centered-v", "sme-scheme-nav-item", 3, "routerLink", "preserveFragment", "skipLocationChange", "replaceUrl", "queryParams", "title", "smeRouterLinkActivated"], [1, "sme-margin-right-xs", "sme-layout-flex", "sme-position-flex-align-center"], ["class", "sme-icon", 3, "ngClass", 4, "ngIf"], ["class", "sme-url-icon", 3, "background-image", 4, "ngIf"], [1, "sme-position-flex-auto"], [1, "sme-font-label", "sme-layout-flex", "sme-position-flex-align-center", 3, "id"], [1, "sme-icon", 3, "ngClass"], [1, "sme-url-icon"], ["class", "sme-layout-absolute sme-position-inset-none sme-layer-above sme-scheme-backdrop-opaque", 3, "click", 4, "ngFor", "ngForOf"], [1, "sme-layout-absolute", "sme-position-inset-none", "sme-layer-above", "sme-scheme-backdrop-opaque", 3, "click"], ["id", "sme-shell-setting-selectedTitle", 4, "ngIf"], ["id", "sme-shell-setting-selectedTitle"]], template: function CommonSettingsComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵprojectionDef();
i0.ɵɵelementStart(0, "sme-settings", 0)(1, "sme-settings-navigation", 1);
i0.ɵɵtemplate(2, CommonSettingsComponent_header_2_Template, 3, 2, "header", 2);
i0.ɵɵelementStart(3, "div", 3)(4, "div", 4)(5, "form", 5)(6, "sme-form-field", 6, 7);
i0.ɵɵlistener("ngModelChange", function CommonSettingsComponent_Template_sme_form_field_ngModelChange_6_listener($event) { return ctx.filter = $event; })("search", function CommonSettingsComponent_Template_sme_form_field_search_6_listener() { return ctx.onSearch(); });
i0.ɵɵelementEnd()()();
i0.ɵɵelementStart(8, "nav", 8)(9, "ul", 9);
i0.ɵɵtemplate(10, CommonSettingsComponent_li_10_Template, 3, 2, "li", 10);
i0.ɵɵelementEnd()()();
i0.ɵɵtemplate(11, CommonSettingsComponent_div_11_Template, 2, 1, "div", 11);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(12, CommonSettingsComponent_sme_settings_header_12_Template, 2, 1, "sme-settings-header", 11);
i0.ɵɵelementStart(13, "sme-settings-content");
i0.ɵɵelement(14, "router-outlet");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(15, "sme-settings-footer");
i0.ɵɵprojection(16);
i0.ɵɵelementEnd()();
} if (rf & 2) {
i0.ɵɵclassProp("sme-settings-external-header", ctx.externalHeader);
i0.ɵɵproperty("settingsTitle", ctx.hackToolHeader ? "" : ctx.settingsTitle);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx.hackToolHeader);
i0.ɵɵadvance(1);
i0.ɵɵattribute("aria-label", ctx.settingsTitle);
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngModel", ctx.filter)("placeholder", ctx.searchBoxPlaceholder)("autofocus", true)("count", ctx.filteredSettings ? ctx.filteredSettings.length : 0);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngClass", ctx.scrollableSecondaryNav ? "sme-position-flex-auto sme-arrange-overflow-auto-y" : "");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", ctx.groupTools);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.hackShowOverlay);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !!ctx.showHeader);
} }, dependencies: [i5.SmeRouterLinkDirective, i1.RouterOutlet, i1.RouterLink, i1.RouterLinkActive, i6.NgClass, i6.NgForOf, i6.NgIf, i7.TooltipDirective, i8.ɵNgNoValidate, i8.NgControlStatus, i8.NgControlStatusGroup, i8.NgModel, i8.NgForm, i9.SearchFormFieldComponent, i10.FormFieldAccessorDirective, i11.FormFieldValidatorDirective, i12.SettingsComponent, i13.SettingsFooterComponent, i14.SettingsHeaderComponent, i15.SettingsContentComponent, i16.SettingsNavigationComponent], encapsulation: 2 });
__decorate([
Debounce(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], CommonSettingsComponent.prototype, "deferredOnLayoutChanged", null);
__decorate([
Yield(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], CommonSettingsComponent.prototype, "onLayoutChanged", null);
__decorate([
Yield(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], CommonSettingsComponent.prototype, "onWindowBreakpointChanged", null);
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CommonSettingsComponent, [{
type: Component,
args: [{ selector: 'sme-common-settings', template: "<sme-settings [settingsTitle]=\"hackToolHeader ? '' : settingsTitle\" [class.sme-settings-external-header]=\"externalHeader\">\r\n <sme-settings-navigation class=\"sme-position-stretch-v-phone-up sme-position-stretch-h\" style=\"min-width: 160px\">\r\n <header class=\"sme-layout-tool-header\" *ngIf=\"hackToolHeader\">\r\n <h2 class=\"sme-position-flex-none sme-font-h3\" [attr.aria-label]=\"settingsTitle\">{{settingsTitle}}</h2>\r\n </header>\r\n <div role=\"region\" [attr.aria-label]=\"settingsTitle\" class=\"sme-position-stretch sme-arrange-stack-v\">\r\n <div class=\"sme-position-flex-none sme-focus-zone\">\r\n <form class=\"sme-margin-squish-v-sm\">\r\n <sme-form-field #searchTextBox type=\"search\" name=\"toolsListSearch\" [(ngModel)]=\"filter\" [placeholder]=\"searchBoxPlaceholder\"\r\n [autofocus]=\"true\" [count]=\"filteredSettings ? filteredSettings.length : 0\"\r\n (search)=\"onSearch()\"></sme-form-field>\r\n </form>\r\n </div>\r\n <nav role=\"tablist\" class=\"sme-arrange-stack-v sme-focus-zone\"\r\n [ngClass]=\"scrollableSecondaryNav ? 'sme-position-flex-auto sme-arrange-overflow-auto-y' : ''\">\r\n <ul class=\"sme-position-flex-auto sme-arrange-stack-v sme-arrange-overflow-hide-x sme-arrange-overflow-auto-y\"\r\n role=\"presentation\">\r\n <li *ngFor=\"let group of groupTools; let j = index\" class=\"sme-margin-inset-none\" role=\"presentation\">\r\n <div [id]=\"idBag.group + '-' + j\" class=\"sme-font-h4 sme-font-h4-settings\" *ngIf=\"group.group!==defaultGroup\"\r\n [title]=\"group.group\">{{ group.group }}</div>\r\n <a *ngFor=\"let setting of group.options; let i = index\"\r\n class=\"sme-padding-squish-v-sm sme-arrange-stack-h sme-arrange-stack-centered-v sme-scheme-nav-item\" role=\"tab\"\r\n href=\"setting.routeParams.extras && setting.routeParams.extras.replaceUrl\"\r\n [attr.aria-selected]=\"selectedSetting === setting\"\r\n [routerLink]=\"setting.routeParams.commands\" routerLinkActive=\"sme-active\"\r\n (smeRouterLinkActivated)=\"onSmeRouterLinkActivated(setting)\"\r\n [preserveFragment]=\"setting.routeParams.extras && setting.routeParams.extras.preserveFragment\"\r\n [skipLocationChange]=\"setting.routeParams.extras && setting.routeParams.extras.skipLocationChange\"\r\n [replaceUrl]=\"setting.routeParams.extras && setting.routeParams.extras.replaceUrl\"\r\n [queryParams]=\"setting.routeParams.extras && setting.routeParams.extras.queryParams\"\r\n [title]=\"setting.label\" attr.aria-labelledby=\"{{idBag.option}}-{{j}}-{{i}} {{idBag.group}}-{{j}}\">\r\n <div class=\"sme-margin-right-xs sme-layout-flex sme-position-flex-align-center\">\r\n <div *ngIf=\"setting.smeIconClassName\" class=\"sme-icon\" [ngClass]=\"getSmeIconClass(setting)\"></div>\r\n <div *ngIf=\"setting.urlIcon\" class=\"sme-url-icon\" [style.background-image]=\"setting.urlIcon\"></div>\r\n <div *ngIf=\"!setting.urlIcon && !setting.smeIconClassName\" class=\"sme-url-icon\" [style.background-image]=\"defaultIcon\"></div>\r\n </div>\r\n <div class=\"sme-position-flex-auto\">\r\n <span [id]=\"idBag.option + '-' + j + '-' + i\" [class.sme-dirty]=\"!!(setting.form && setting.form.dirty)\"\r\n [class.sme-pristine]=\"!(setting.form && setting.form.dirty)\" class=\"sme-font-label sme-layout-flex sme-position-flex-align-center\">{{ setting.label }}</span>\r\n </div>\r\n </a>\r\n </li>\r\n </ul>\r\n </nav>\r\n </div>\r\n <div *ngIf=\"hackShowOverlay\">\r\n <div *ngFor=\"let layer of layers\"\r\n class=\"sme-layout-absolute sme-position-inset-none sme-layer-above sme-scheme-backdrop-opaque\"\r\n (click)=\"onOverlayClick(layer)\"></div>\r\n </div>\r\n </sme-settings-navigation>\r\n <sme-settings-header *ngIf=\"!!showHeader\">\r\n <h3 id=\"sme-shell-setting-selectedTitle\" [attr.aria-label]=\"selectedSetting.label\" *ngIf=\"!!selectedSetting\">\r\n {{ selectedSetting.label }}</h3>\r\n </sme-settings-header>\r\n <sme-settings-content>\r\n <router-outlet></router-outlet>\r\n </sme-settings-content>\r\n <sme-settings-footer>\r\n <ng-content></ng-content>\r\n </sme-settings-footer>\r\n</sme-settings>\r\n" }]
}], function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i2.SettingsFormService }, { type: i0.IterableDiffers }, { type: i3.AppContextService }, { type: i4.RpcShellService }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [SME_LAYOUT_PROVIDER]
}] }]; }, { searchBoxPlaceholder: [{
type: Input
}], searchTextBox: [{
type: ViewChild,
args: ['searchTextBox']
}], settingsTitle: [{
type: Input
}], settings: [{
type: Input
}], showHeader: [{
type: Input
}], hackShowOverlay: [{
type: Input
}], hackToolHeader: [{
type: Input
}], connectionSettings: [{
type: Input
}], backRoute: [{
type: Input
}], scrollableSecondaryNav: [{
type: Input
}], settingsComponent: [{
type: ViewChild,
args: [SettingsComponent]
}], deferredOnLayoutChanged: [], onLayoutChanged: [], onWindowBreakpointChanged: [] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3NldHRpbmdzL2NvbW1vbi1zZXR0aW5ncy9jb21tb24tc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc2V0dGluZ3MvY29tbW9uLXNldHRpbmdzL2NvbW1vbi1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVILFNBQVMsRUFFVCxNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFFTCxlQUFlLEVBSWYsUUFBUSxFQUNSLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW1CLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RSxPQUFPLEVBR0gsTUFBTSxFQUVULE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhFQUE4RSxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwwRUFBMEUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUVBQXVFLENBQUM7QUFDMUcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0VBQStFLENBQUM7QUFHdEgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBRWhGLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQVUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDdkNuRixrQ0FBOEQsYUFBQTtJQUNxQixZQUFpQjtJQUFBLGlCQUFLLEVBQUE7OztJQUF4RCxlQUFpQztJQUFqQyxrREFBaUM7SUFBQyxlQUFpQjtJQUFqQiwwQ0FBaUI7OztJQWU1RiwrQkFDd0I7SUFBQSxZQUFpQjtJQUFBLGlCQUFNOzs7Ozs7SUFEMUMsb0RBQTRCLHlCQUFBO0lBQ1QsZUFBaUI7SUFBakIsb0NBQWlCOzs7SUFhckMsMEJBQWtHOzs7O0lBQTNDLDhEQUFvQzs7O0lBQzNGLDBCQUFtRzs7O0lBQWpELHVEQUEwQzs7O0lBQzVGLDBCQUE2SDs7O0lBQTdDLHVEQUFzQzs7OztJQWQxSCw2QkFVb0c7SUFMbEcsdVFBQTBCLGVBQUEsNkNBQWlDLENBQUEsSUFBQztJQU01RCwrQkFBZ0Y7SUFDOUUsbUZBQWtHO0lBQ2xHLG1GQUFtRztJQUNuRyxtRkFBNkg7SUFDL0gsaUJBQU07SUFDTiwrQkFBb0MsZUFBQTtJQUVtRyxZQUFtQjtJQUFBLGlCQUFPLEVBQUEsRUFBQTs7Ozs7O0lBUnpJLHFJQUF5RTtJQU5qRyw2REFBMkMsdUdBQUEsMkdBQUEsMkZBQUEsNkZBQUEsNEJBQUE7SUFEM0MsdUVBQWtEO0lBUzFDLGVBQThCO0lBQTlCLG1EQUE4QjtJQUM5QixlQUFxQjtJQUFyQiwwQ0FBcUI7SUFDckIsZUFBbUQ7SUFBbkQsNEVBQW1EO0lBR1gsZUFBMEQ7SUFBMUQsMkVBQTBELCtEQUFBO0lBQWxHLG1FQUF1QztJQUN3RixlQUFtQjtJQUFuQix1Q0FBbUI7OztJQXJCOUosOEJBQXNHO0lBQ3BHLCtFQUMrQztJQUMvQyw0RUFvQkk7SUFDTixpQkFBSzs7OztJQXZCeUUsZUFBZ0M7SUFBaEMsNkRBQWdDO0lBRXJGLGVBQWtCO0lBQWxCLDBDQUFrQjs7OztJQTBCL0MsK0JBRWtDO0lBQWhDLHdPQUFTLGVBQUEsaUNBQXFCLENBQUEsSUFBQztJQUFDLGlCQUFNOzs7SUFIMUMsMkJBQTZCO0lBQzNCLGdGQUV3QztJQUMxQyxpQkFBTTs7O0lBSG1CLGVBQVM7SUFBVCx1Q0FBUzs7O0lBTWxDLDhCQUE2RztJQUMzRyxZQUEyQjtJQUFBLGlCQUFLOzs7SUFETywyREFBeUM7SUFDaEYsZUFBMkI7SUFBM0IsNkRBQTJCOzs7SUFGL0IsMkNBQTBDO0lBQ3hDLDhGQUNrQztJQUNwQyxpQkFBc0I7OztJQUZnRSxlQUF1QjtJQUF2QiwrQ0FBdUI7OztBREovRzs7R0FFRztBQUtILE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxpQkFBaUI7SUErRTFELFlBQ0ksUUFBa0IsRUFDWCxNQUFjLEVBQ2IsYUFBa0MsRUFDbEMsZUFBZ0MsRUFDaEMsVUFBNkIsRUFDN0IsZUFBZ0MsRUFDQyxNQUFjO1FBRXZELEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQVBULFdBQU0sR0FBTixNQUFNLENBQVE7UUFDYixrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFDbEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQzdCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQTVFNUM7OztXQUdHO1FBQ0ksbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFZCxpQkFBWSxHQUFHLFNBQVMsQ0FBQztRQUVsQyxXQUFNLEdBQTJCLEVBQUUsQ0FBQztRQUkzQzs7V0FFRztRQUNJLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFPWixxQkFBZ0IsR0FBbUMsRUFBRSxDQUFDO1FBWXRELGVBQVUsR0FBRyxJQUFJLENBQUM7UUFHbEIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFHeEIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFOUI7O1dBRUc7UUFFSSx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFLbEM7Ozs7O1dBS0c7UUFFSSwyQkFBc0IsR0FBRyxJQUFJLENBQUM7UUFTN0IsY0FBUyxHQUFHLElBQUksQ0FBQztRQWFyQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7UUFFaEYsSUFBSSxNQUFNLEVBQUU7WUFDUixJQUFJLENBQUMsK0JBQStCLEdBQUcsSUFBSSwrQkFBK0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRixtRUFBbUU7WUFDbkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEYsbUdBQW1HO1lBQ25HLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRTFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQ2xDO0lBQ0wsQ0FBQztJQW5HRDs7T0FFRztJQUNILElBQWMsYUFBYTtRQUN2QixPQUFPLHlCQUF5QixDQUFDO0lBQ3JDLENBQUM7SUFnR00sUUFBUTtRQUNYLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVqQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUN2RCw0REFBNEQ7WUFDNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDO1lBQzFDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDN0UsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUVGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBc0QsRUFBRSxFQUFFO2dCQUN6RywyREFBMkQ7Z0JBQzNELElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDdkM7cUJBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7aUJBQ3JCO3FCQUFNO29CQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsOEVBQThFLENBQUMsQ0FBQztpQkFDbkc7Z0JBQ0QsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FDTCxDQUFDO1NBQ0w7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDMUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDOUI7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUFPO1FBQ3RCLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvRTtRQUNELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFFSyx1QkFBdUI7UUFDM0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFHTyxlQUFlO1FBQ25CLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBR08seUJBQXlCO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUU7WUFDdEQsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLCtCQUErQixDQUFDLGlDQUFpQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUVNLFNBQVM7UUFDWixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbEIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4RCxJQUFJLE9BQU8sRUFBRTtnQkFDVCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDckI7U0FDSjtJQUNMLENBQUM7SUFFTSxrQkFBa0I7UUFDckIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3RGLElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7YUFDMUI7U0FDSjtRQUVELDZFQUE2RTtRQUM3RSxzRkFBc0Y7UUFDdEYsMERBQTBEO1FBQzFELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0wsQ0FBQztJQUVNLFVBQVU7UUFDYiw4RUFBOEU7UUFDOUUsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFN0MsTUFBTSxVQUFVLEdBQXFCLEVBQUUsQ0FBQztRQUN4QyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUMxRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO2dCQUNsQixVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMvQztpQkFBTTtnQkFDSCxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQzlCLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7aUJBQ2hHO2dCQUNELFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNuRDtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUU7WUFDM0IsSUFBSSxJQUFJLEVBQUU7Z0JBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDMUM7U0FDSjtJQUNMLENBQUM7SUFFTSxzQkFBc0I7UUFDekIsTUFBTSxPQUFPLEdBQXlDLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDM0UsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDcEMsT0FBTztTQUNWO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFMUQsSUFBSSxPQUFPLENBQUMsc0JBQXNCLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDNUQ7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDdkM7WUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUUvQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0Q7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0Q7U0FDSjtRQUVELE9BQU8sQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUM7SUFDM0UsQ0FBQztJQUVNLG9CQUFvQjtRQUN2QixtRUFBbUU7UUFDbkUsaURBQWlEO1FBQ2pELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDM0MsTUFBTSxlQUFlLEdBQXlDLGFBQWEsQ0FBQztRQUM1RSxJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUU7WUFDdEIsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7U0FDNUQ7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ25DLElBQUksWUFBWSxLQUFLLGFBQWEsRUFBRTtnQkFDaEMsTUFBTSxvQkFBb0IsR0FBeUMsWUFBWSxDQUFDO2dCQUNoRixJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDekQsb0JBQW9CLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDakMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDeEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQy9EO2FBQ0o7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSx3QkFBd0I7UUFDM0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzlCLE1BQU0sZUFBZSxHQUF5QyxPQUFPLENBQUM7WUFDdEUsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFO2dCQUN0QixlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzVFLElBQUksYUFBYSxLQUFLLGVBQWUsRUFBRTtvQkFDbkMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2xGO2FBQ0o7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxlQUFlLENBQUMsT0FBcUM7UUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7WUFDMUIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ3JEO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztJQUM1QixDQUFDO0lBRU0sYUFBYSxDQUNoQixTQUFpQyxFQUNqQyxLQUE2QixFQUM3QixLQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN4RTtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNPLHFCQUFxQjtRQUMzQixPQUFPLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN4QyxxQkFBcUI7U0FDeEIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7T0FHRztJQUNPLFdBQVc7UUFDakIsT0FBTztZQUNILEtBQUssRUFBRSxFQUFFO1lBQ1QsTUFBTSxFQUFFLEVBQUU7U0FDYixDQUFDO0lBQ04sQ0FBQztJQUVNLGNBQWMsQ0FBQyxLQUEyQjtRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDN0QsS0FBSyxDQUFDLFVBQVUsRUFDaEIsS0FBSyxDQUFDLGFBQWEsRUFDbkIsT0FBTyxDQUFDLFFBQVEsQ0FDbkIsQ0FBQztRQUNGLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDaEgsU0FBUyxDQUFDO1lBQ1AsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztpQkFDckI7WUFDTCxDQUFDO1lBQ0QsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNYLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0QsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzlHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUNyQjtnQkFFRCxPQUFPLEtBQUssQ0FBQztZQUNqQixDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNLLG9CQUFvQixDQUFDLFdBQTRCO1FBQ3JELElBQUksV0FBVyxZQUFZLFNBQVMsRUFBRTtZQUNsQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDakIsTUFBTSx