@c-standard/angular-devui-extension
Version:
an extensional components lib for devui
163 lines • 26.5 kB
JavaScript
import { Component, ContentChildren, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
import { forEach, isEmpty, isNull, isObject, mergeWith } from 'lodash-es';
import { FormDirective, FormLayout } from 'ng-devui/form';
import { FormField } from './form-field';
import { TemplateDirective } from '@c-standard/angular-devui-extension/template';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "./form-plus-item.component";
import * as i3 from "ng-devui";
import * as i4 from "@angular/cdk/scrolling";
import * as i5 from "@angular/common";
export class FormPlusComponent {
constructor(fb, ref, _cdr) {
this.fb = fb;
this.ref = ref;
this._cdr = _cdr;
this.loading = false;
this.readonly = false;
this.initialized = new EventEmitter();
this.fieldDataChanged = new EventEmitter();
this.formSubmit = new EventEmitter();
this.layoutDirection = FormLayout.Horizontal;
this.formGroup = this.fb.group({});
}
set data(value) {
this._data = value;
if (this._data) {
this.formGroup.patchValue(this._data);
}
}
get layout() {
return (this._layout = 'horizontal');
}
set layout(value) {
this._layout = value;
if (this._layout) {
this._layout == 'vertical'
? (this.layoutDirection = FormLayout.Vertical)
: (this.layoutDirection = FormLayout.Horizontal);
}
}
ngOnInit() {
this.initialized.emit({
element: this.ref.nativeElement,
component: this,
});
}
ngAfterContentInit() {
this.addFormControls(this.fields);
this.fields?.changes.subscribe((f) => {
this.addFormControls(f);
});
// this.formGroup.patchValue(this._data);
this.formGroup.valueChanges.subscribe((value) => {
this.fieldDataChanged.emit(value);
});
}
addFormControls(fields) {
if (!fields)
return;
// dynamic add、set or remove control
const changedNames = [];
forEach(fields.toArray(), (t) => {
if (this.formGroup.contains(t.field)) {
this.formGroup.setControl(t.field, t.control);
}
else {
this.formGroup.addControl(t.field, t.control);
}
changedNames.push(t.field);
});
// Note 表单field发生改变时,移除对应的control以保证校验通过
const controlNames = Object.keys(this.formGroup.controls);
controlNames.forEach((name) => {
if (!changedNames.find((t) => t == name)) {
this.formGroup.removeControl(name);
}
});
// Note: 当表单field改变时,其对应的默认值再次填充
this.formGroup.patchValue(mergeWith(this.formGroup.value, this._data, (o, s) => (isEmpty(o) ? s : o)));
}
get templates() {
if (this.itemDefinitions != null) {
const itemTemplates = {};
for (const definition of this.itemDefinitions.toArray()) {
itemTemplates[definition.template] = definition.templateRef;
}
return itemTemplates;
}
else {
return {};
}
}
setValue(value) {
if (isObject(value) && !isNull(value)) {
this.formGroup.patchValue(value);
}
}
submit(e) {
this.formSubmit.emit({
valid: e.valid,
});
}
check() {
this.devuiForm?.updateOnSubmit();
}
get valid() {
this.check();
return this.formGroup.valid;
}
get value() {
return {
...this._data,
...this.formGroup.value,
};
}
}
FormPlusComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormPlusComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
FormPlusComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: FormPlusComponent, selector: "d-form-plus", inputs: { data: "data", layout: "layout", items: "items", loading: "loading", readonly: "readonly", validateRules: "validateRules", height: "height", maxHeight: "maxHeight" }, outputs: { initialized: "initialized", fieldDataChanged: "fieldDataChanged", formSubmit: "formSubmit" }, queries: [{ propertyName: "itemDefinitions", predicate: TemplateDirective }, { propertyName: "fields", predicate: FormField }], viewQueries: [{ propertyName: "devuiForm", first: true, predicate: FormDirective, descendants: true }], ngImport: i0, template: "<form\r\n dForm\r\n ngForm\r\n cdkScrollable\r\n labelAlign=\"start\"\r\n labelSize=\"sm\"\r\n dLoading\r\n [formGroup]=\"formGroup\"\r\n [dValidateRules]=\"validateRules\"\r\n [showLoading]=\"loading\"\r\n [layout]=\"layoutDirection\"\r\n [style.height]=\"height\"\r\n [style.max-height]=\"maxHeight\"\r\n (dSubmit)=\"submit($event)\"\r\n>\r\n <d-form-plus-item\r\n *ngFor=\"let item of items\"\r\n [field]=\"item.field\"\r\n [helpText]=\"item.helpText || ''\"\r\n [label]=\"item.label\"\r\n [option]=\"item.options\"\r\n [dataType]=\"item.dataType\"\r\n [required]=\"item.required || false\"\r\n [validateRules]=\"item.validateRules || []\"\r\n [showLabel]=\"item.showLabel || true\"\r\n [template]=\"item.template\"\r\n [disabled]=\"item.disabled\"\r\n >\r\n <ng-container *ngIf=\"item.template\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{ $implicit: { item: item } }\"\r\n [ngTemplateOutlet]=\"templates[item.template || ''] || defaultItemTemplate\"\r\n >\r\n </ng-container>\r\n <ng-template #defaultItemTemplate>\r\n <span>formTmpl:{{ item.template }}</span>\r\n </ng-template>\r\n </ng-container>\r\n </d-form-plus-item>\r\n <ng-content></ng-content>\r\n</form>\r\n", styles: ["form{padding:0 1rem;overflow:auto;max-height:60vh}\n"], components: [{ type: i2.FormPlusItemComponent, selector: "d-form-plus-item", inputs: ["showLabel", "label", "field", "dataType", "helpText", "option", "required", "disabled", "template", "validateRules"] }], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.DFormGroupRuleDirective, selector: "[dValidateRules][formGroupName],[dValidateRules][formArrayName],[dValidateRules][ngModelGroup], [dValidateRules][formGroup],[dValidateRules]form:not([ngNoForm]),[dValidateRules][ngForm]", inputs: ["dValidateRules"], outputs: ["dRulesStatusChange"], exportAs: ["dValidateRules"] }, { type: i3.FormDirective, selector: "[dForm]", inputs: ["layout", "labelSize", "labelAlign", "dFeedbackType", "dHasFeedback"], outputs: ["dSubmit"], exportAs: ["dForm"] }, { type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { type: i3.LoadingDirective, selector: "[dLoading]", inputs: ["message", "backdrop", "loadingTemplateRef", "positionType", "view", "showLoading", "loading", "zIndex"], exportAs: ["dLoading"] }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormPlusComponent, decorators: [{
type: Component,
args: [{ selector: 'd-form-plus', styles: [
`
form {
padding: 0 1rem;
overflow: auto;
max-height: 60vh;
}
`,
], template: "<form\r\n dForm\r\n ngForm\r\n cdkScrollable\r\n labelAlign=\"start\"\r\n labelSize=\"sm\"\r\n dLoading\r\n [formGroup]=\"formGroup\"\r\n [dValidateRules]=\"validateRules\"\r\n [showLoading]=\"loading\"\r\n [layout]=\"layoutDirection\"\r\n [style.height]=\"height\"\r\n [style.max-height]=\"maxHeight\"\r\n (dSubmit)=\"submit($event)\"\r\n>\r\n <d-form-plus-item\r\n *ngFor=\"let item of items\"\r\n [field]=\"item.field\"\r\n [helpText]=\"item.helpText || ''\"\r\n [label]=\"item.label\"\r\n [option]=\"item.options\"\r\n [dataType]=\"item.dataType\"\r\n [required]=\"item.required || false\"\r\n [validateRules]=\"item.validateRules || []\"\r\n [showLabel]=\"item.showLabel || true\"\r\n [template]=\"item.template\"\r\n [disabled]=\"item.disabled\"\r\n >\r\n <ng-container *ngIf=\"item.template\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{ $implicit: { item: item } }\"\r\n [ngTemplateOutlet]=\"templates[item.template || ''] || defaultItemTemplate\"\r\n >\r\n </ng-container>\r\n <ng-template #defaultItemTemplate>\r\n <span>formTmpl:{{ item.template }}</span>\r\n </ng-template>\r\n </ng-container>\r\n </d-form-plus-item>\r\n <ng-content></ng-content>\r\n</form>\r\n" }]
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { data: [{
type: Input
}], layout: [{
type: Input
}], items: [{
type: Input
}], loading: [{
type: Input
}], readonly: [{
type: Input
}], validateRules: [{
type: Input
}], height: [{
type: Input
}], maxHeight: [{
type: Input
}], initialized: [{
type: Output
}], fieldDataChanged: [{
type: Output
}], formSubmit: [{
type: Output
}], devuiForm: [{
type: ViewChild,
args: [FormDirective]
}], itemDefinitions: [{
type: ContentChildren,
args: [TemplateDirective]
}], fields: [{
type: ContentChildren,
args: [FormField]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1wbHVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvZm9ybS9mb3JtLXBsdXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9mb3JtL2Zvcm0tcGx1cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFHTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUUsT0FBTyxFQUEyQyxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOENBQThDLENBQUE7Ozs7Ozs7QUFpQmhGLE1BQU0sT0FBTyxpQkFBaUI7SUEyQzFCLFlBQW9CLEVBQWUsRUFBVSxHQUFlLEVBQVUsSUFBdUI7UUFBekUsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQWhCcEYsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBSXpCLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDekQscUJBQWdCLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDOUQsZUFBVSxHQUFpQyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQU94RixvQkFBZSxHQUFlLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFHaEQsSUFBSSxDQUFDLFNB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UUFDTCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDTCxPQUFPO1lBQ0gsR0FBRyxJQUFJLENBQUMsS0FBSztZQUNiLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO1NBQzFCLENBQUM7SUFDTixDQUFDOzs4R0FoSVEsaUJBQWlCO2tHQUFqQixpQkFBaUIsNFdBcUNULGlCQUFpQix5Q0FDakIsU0FBUyx3RUFGZixhQUFhLGdEQ3hFNUIsazVDQXlDQTsyRkRMYSxpQkFBaUI7a0JBZjdCLFNBQVM7K0JBQ0ksYUFBYSxVQUdmO3dCQUNKOzs7Ozs7U0FNQztxQkFDSjsySkFPRyxJQUFJO3NCQURQLEtBQUs7Z0JBY0YsTUFBTTtzQkFEVCxLQUFLO2dCQVVHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRW1CLFNBQVM7c0JBQWxDLFNBQVM7dUJBQUMsYUFBYTtnQkFDWSxlQUFlO3NCQUFsRCxlQUFlO3VCQUFDLGlCQUFpQjtnQkFDTixNQUFNO3NCQUFqQyxlQUFlO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgQ29udGVudENoaWxkcmVuLFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIElucHV0LFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgUXVlcnlMaXN0LFxyXG4gICAgVGVtcGxhdGVSZWYsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZvckVhY2gsIGlzRW1wdHksIGlzTnVsbCwgaXNPYmplY3QsIG1lcmdlV2l0aCB9IGZyb20gJ2xvZGFzaC1lcyc7XHJcbmltcG9ydCB7IERGb3JtR3JvdXBSdWxlRGlyZWN0aXZlLCBEVmFsaWRhdGVSdWxlcywgRm9ybURpcmVjdGl2ZSwgRm9ybUxheW91dCB9IGZyb20gJ25nLWRldnVpL2Zvcm0nO1xyXG5pbXBvcnQgeyBGb3JtRmllbGQgfSBmcm9tICcuL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBERm9ybUl0ZW0sIERGb3JtTGF5b3V0LCBERm9ybVZhbGlkYXRvciB9IGZyb20gJy4vZm9ybSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICdAYy1zdGFuZGFyZC9hbmd1bGFyLWRldnVpLWV4dGVuc2lvbi90ZW1wbGF0ZSdcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdkLWZvcm0tcGx1cycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1wbHVzLmNvbXBvbmVudC5odG1sJyxcclxuICAgIC8vIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgICBzdHlsZXM6IFtcclxuICAgICAgICBgXHJcbiAgICAgICAgICAgIGZvcm0ge1xyXG4gICAgICAgICAgICAgICAgcGFkZGluZzogMCAxcmVtO1xyXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICAgICAgICAgICAgICBtYXgtaGVpZ2h0OiA2MHZoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgYCxcclxuICAgIF0sXHJcbiAgICAvLyBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm1QbHVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcclxuICAgIHByaXZhdGUgX2RhdGE6IGFueTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGRhdGEodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5fZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHRoaXMuX2RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9sYXlvdXQ/OiBERm9ybUxheW91dDtcclxuICAgIGdldCBsYXlvdXQoKTogREZvcm1MYXlvdXQge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5fbGF5b3V0ID0gJ2hvcml6b250YWwnKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGxheW91dCh2YWx1ZTogREZvcm1MYXlvdXQpIHtcclxuICAgICAgICB0aGlzLl9sYXlvdXQgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5fbGF5b3V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xheW91dCA9PSAndmVydGljYWwnXHJcbiAgICAgICAgICAgICAgICA/ICh0aGlzLmxheW91dERpcmVjdGlvbiA9IEZvcm1MYXlvdXQuVmVydGljYWwpXHJcbiAgICAgICAgICAgICAgICA6ICh0aGlzLmxheW91dERpcmVjdGlvbiA9IEZvcm1MYXlvdXQuSG9yaXpvbnRhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpIGl0ZW1zPzogREZvcm1JdGVtW107XHJcbiAgICBASW5wdXQoKSBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgdmFsaWRhdGVSdWxlcyE6IERWYWxpZGF0ZVJ1bGVzO1xyXG4gICAgQElucHV0KCkgaGVpZ2h0Pzogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgbWF4SGVpZ2h0Pzogc3RyaW5nO1xyXG4gICAgQE91dHB1dCgpIGluaXRpYWxpemVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGZpZWxkRGF0YUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgZm9ybVN1Ym1pdDogRXZlbnRFbWl0dGVyPERGb3JtVmFsaWRhdG9yPiA9IG5ldyBFdmVudEVtaXR0ZXI8REZvcm1WYWxpZGF0b3I+KCk7XHJcblxyXG4gICAgQFZpZXdDaGlsZChGb3JtRGlyZWN0aXZlKSBkZXZ1aUZvcm0/OiBGb3JtRGlyZWN0aXZlO1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZURpcmVjdGl2ZSkgaXRlbURlZmluaXRpb25zITogUXVlcnlMaXN0PFRlbXBsYXRlRGlyZWN0aXZlPjtcclxuICAgIEBDb250ZW50Q2hpbGRyZW4oRm9ybUZpZWxkKSBmaWVsZHM/OiBRdWVyeUxpc3Q8Rm9ybUZpZWxkPjtcclxuXHJcbiAgICBmb3JtR3JvdXA6IEZvcm1Hcm91cDtcclxuICAgIGxheW91dERpcmVjdGlvbjogRm9ybUxheW91dCA9IEZvcm1MYXlvdXQuSG9yaXpvbnRhbDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgICAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe30pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQuZW1pdCh7XHJcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hZGRGb3JtQ29udHJvbHModGhpcy5maWVsZHMpO1xyXG4gICAgICAgIHRoaXMuZmllbGRzPy5jaGFuZ2VzLnN1YnNjcmliZSgoZikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZEZvcm1Db250cm9scyhmKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHRoaXMuX2RhdGEpO1xyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZmllbGREYXRhQ2hhbmdlZC5lbWl0KHZhbHVlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZEZvcm1Db250cm9scyhmaWVsZHM/OiBRdWVyeUxpc3Q8Rm9ybUZpZWxkPikge1xyXG4gICAgICAgIGlmICghZmllbGRzKSByZXR1cm47XHJcbiAgICAgICAgLy8gZHluYW1pYyBhZGTjgIFzZXQgb3IgcmVtb3ZlIGNvbnRyb2xcclxuICAgICAgICBjb25zdCBjaGFuZ2VkTmFtZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgZm9yRWFjaChmaWVsZHMudG9BcnJheSgpLCAodCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXAuY29udGFpbnModC5maWVsZCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnNldENvbnRyb2wodC5maWVsZCwgdC5jb250cm9sKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmFkZENvbnRyb2wodC5maWVsZCwgdC5jb250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjaGFuZ2VkTmFtZXMucHVzaCh0LmZpZWxkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBOb3RlIOihqOWNlWZpZWxk5Y+R55Sf5pS55Y+Y5pe277yM56e76Zmk5a+55bqU55qEY29udHJvbOS7peS/neivgeagoemqjOmAmui/h1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2xOYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKTtcclxuICAgICAgICBjb250cm9sTmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWNoYW5nZWROYW1lcy5maW5kKCh0KSA9PiB0ID09IG5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5yZW1vdmVDb250cm9sKG5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gTm90ZTog5b2T6KGo5Y2VZmllbGTmlLnlj5jml7bvvIzlhbblr7nlupTnmoTpu5jorqTlgLzlho3mrKHloavlhYVcclxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxyXG4gICAgICAgICAgICBtZXJnZVdpdGgodGhpcy5mb3JtR3JvdXAudmFsdWUsIHRoaXMuX2RhdGEsIChvLCBzKSA9PiAoaXNFbXB0eShvKSA/IHMgOiBvKSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGVtcGxhdGVzKCk6IHsgW2tleTogc3RyaW5nXTogVGVtcGxhdGVSZWY8YW55PiB9IHtcclxuICAgICAgICBpZiAodGhpcy5pdGVtRGVmaW5pdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtVGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT4gfSA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgdGhpcy5pdGVtRGVmaW5pdGlvbnMudG9BcnJheSgpKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtVGVtcGxhdGVzW2RlZmluaXRpb24udGVtcGxhdGVdID0gZGVmaW5pdGlvbi50ZW1wbGF0ZVJlZjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gaXRlbVRlbXBsYXRlcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAoaXNPYmplY3QodmFsdWUpICYmICFpc051bGwodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdWJtaXQoZTogeyB2YWxpZDogYm9vbGVhbjsgZGlyZWN0aXZlOiBERm9ybUdyb3VwUnVsZURpcmVjdGl2ZSB8IEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSB9KSB7XHJcbiAgICAgICAgdGhpcy5mb3JtU3VibWl0LmVtaXQoe1xyXG4gICAgICAgICAgICB2YWxpZDogZS52YWxpZCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVjaygpIHtcclxuICAgICAgICB0aGlzLmRldnVpRm9ybT8udXBkYXRlT25TdWJtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmFsaWQoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVjaygpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC52YWxpZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmFsdWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4udGhpcy5fZGF0YSxcclxuICAgICAgICAgICAgLi4udGhpcy5mb3JtR3JvdXAudmFsdWUsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCI8Zm9ybVxyXG4gICAgZEZvcm1cclxuICAgIG5nRm9ybVxyXG4gICAgY2RrU2Nyb2xsYWJsZVxyXG4gICAgbGFiZWxBbGlnbj1cInN0YXJ0XCJcclxuICAgIGxhYmVsU2l6ZT1cInNtXCJcclxuICAgIGRMb2FkaW5nXHJcbiAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXHJcbiAgICBbZFZhbGlkYXRlUnVsZXNdPVwidmFsaWRhdGVSdWxlc1wiXHJcbiAgICBbc2hvd0xvYWRpbmddPVwibG9hZGluZ1wiXHJcbiAgICBbbGF5b3V0XT1cImxheW91dERpcmVjdGlvblwiXHJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodFwiXHJcbiAgICBbc3R5bGUubWF4LWhlaWdodF09XCJtYXhIZWlnaHRcIlxyXG4gICAgKGRTdWJtaXQpPVwic3VibWl0KCRldmVudClcIlxyXG4+XHJcbiAgICA8ZC1mb3JtLXBsdXMtaXRlbVxyXG4gICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCJcclxuICAgICAgICBbZmllbGRdPVwiaXRlbS5maWVsZFwiXHJcbiAgICAgICAgW2hlbHBUZXh0XT1cIml0ZW0uaGVscFRleHQgfHwgJydcIlxyXG4gICAgICAgIFtsYWJlbF09XCJpdGVtLmxhYmVsXCJcclxuICAgICAgICBbb3B0aW9uXT1cIml0ZW0ub3B0aW9uc1wiXHJcbiAgICAgICAgW2RhdGFUeXBlXT1cIml0ZW0uZGF0YVR5cGVcIlxyXG4gICAgICAgIFtyZXF1aXJlZF09XCJpdGVtLnJlcXVpcmVkIHx8IGZhbHNlXCJcclxuICAgICAgICBbdmFsaWRhdGVSdWxlc109XCJpdGVtLnZhbGlkYXRlUnVsZXMgfHwgW11cIlxyXG4gICAgICAgIFtzaG93TGFiZWxdPVwiaXRlbS5zaG93TGFiZWwgfHwgdHJ1ZVwiXHJcbiAgICAgICAgW3RlbXBsYXRlXT1cIml0ZW0udGVtcGxhdGVcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcclxuICAgID5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHsgaXRlbTogaXRlbSB9IH1cIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVzW2l0ZW0udGVtcGxhdGUgfHwgJyddIHx8IGRlZmF1bHRJdGVtVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJdGVtVGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5mb3JtVG1wbDp7eyBpdGVtLnRlbXBsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kLWZvcm0tcGx1cy1pdGVtPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG48L2Zvcm0+XHJcbiJdfQ==