UNPKG

angular-dynamic-forms-lite

Version:
131 lines 14.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable, ComponentFactoryResolver, Injector, Inject, Optional } from "@angular/core"; import { FormBuilder } from "@angular/forms"; import { ParentFieldFactory } from "../form-field/field-factory"; import { GroupFieldFactory } from "../form-field/group/group-field-factory"; import { ArrayFieldFactory } from "../form-field/array/array-field-factory"; import { SingleFieldFactory } from "../form-field/single/single-field-factory"; import { createFormFieldSettings, ROOT_ID, ensureDefaultFormComponents } from "../form-settings/form-field-settings"; import { DEFAULT_FORM_COMPONENTS, DynamicFormType } from "../form-field/form-field-type"; import { InlineFormFactory } from "./inline/inline-form-factory"; import { HiddenFieldFactory } from "../form-field/hidden/hidden-field-factory"; import * as i0 from "@angular/core"; import * as i1 from "../form-field/form-field-type"; /** * A service for creating and rendering dynamic forms. For usage informations refer to * https://github.com/tom-schoener/angular-dynamic-forms-lite */ export class DynamicFormsLiteService { /** * @param {?} componentFactoryResolver * @param {?} injector * @param {?=} defaultFormComponents */ constructor(componentFactoryResolver, injector, defaultFormComponents) { this.componentFactoryResolver = componentFactoryResolver; this.injector = injector; this.defaultFormComponents = defaultFormComponents; } /** * Creates a form context from a seperated model and form settings. This is useful for advanced * forms, where the model is fetched from a server. * * @template M * @param {?} formModel form model * @param {?} formFieldSettings settings for the form model * @param {?=} rootSetting settings for the root of the form * @return {?} */ create(formModel, formFieldSettings, rootSetting = this.createRootSetting()) { /** @type {?} */ const settings = createFormFieldSettings(rootSetting, formFieldSettings, this.defaultFormComponents); return (/** @type {?} */ (this.createParentFieldFactory(settings).create({ initialValue: formModel, setting: settings.get(ROOT_ID), settings }))); } /** * Creates a dynamic form context which can be used to render a form. This is useful for simple forms, where * the model is basically empty. For an advanced usecase with a seperate model and form settings see 'create'. * * @param {?} inlineForm form, where the model and settings are combined * @param {?=} rootSetting settings for the root of the form * @return {?} */ createInline(inlineForm, rootSetting = this.createRootSetting()) { /** @type {?} */ const inlineFormFactory = new InlineFormFactory(this.defaultFormComponents); /** @type {?} */ const settings = inlineFormFactory.resolveSettings(inlineForm); /** @type {?} */ const formModel = inlineFormFactory.resolveModel(inlineForm); return this.create(formModel, settings, rootSetting); } /** * Renders the form at the specified form root recursively. * * @param {?} formRoot root element (directive) to insert the form into * @param {?} formContext form context * @return {?} */ render(formRoot, formContext) { this.createParentFieldFactory(formContext.settings).render(formRoot, formContext); } /** * @private * @return {?} */ createRootSetting() { return { component: (/** @type {?} */ (ensureDefaultFormComponents(this.defaultFormComponents, "root", DynamicFormType.GROUP))), metadata: null }; } /** * @private * @param {?} settings * @return {?} */ createParentFieldFactory(settings) { return new ParentFieldFactory({ [DynamicFormType.GROUP]: GroupFieldFactory, [DynamicFormType.ARRAY]: ArrayFieldFactory, [DynamicFormType.SINGLE]: SingleFieldFactory, [DynamicFormType.HIDDEN]: HiddenFieldFactory }, this.componentFactoryResolver, this.injector, new FormBuilder(), settings); } } DynamicFormsLiteService.decorators = [ { type: Injectable, args: [{ providedIn: "root" },] } ]; /** @nocollapse */ DynamicFormsLiteService.ctorParameters = () => [ { type: ComponentFactoryResolver }, { type: Injector }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DEFAULT_FORM_COMPONENTS,] }] } ]; /** @nocollapse */ DynamicFormsLiteService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function DynamicFormsLiteService_Factory() { return new DynamicFormsLiteService(i0.ɵɵinject(i0.ComponentFactoryResolver), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.DEFAULT_FORM_COMPONENTS, 8)); }, token: DynamicFormsLiteService, providedIn: "root" }); if (false) { /** * @type {?} * @private */ DynamicFormsLiteService.prototype.componentFactoryResolver; /** * @type {?} * @private */ DynamicFormsLiteService.prototype.injector; /** * @type {?} * @private */ DynamicFormsLiteService.prototype.defaultFormComponents; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3Jtcy1saXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWR5bmFtaWMtZm9ybXMtbGl0ZS8iLCJzb3VyY2VzIjpbImxpYi9mb3JtL2R5bmFtaWMtZm9ybXMtbGl0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBYSxXQUFXLEVBQThCLE1BQU0sZ0JBQWdCLENBQUM7QUFLcEYsT0FBTyxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRS9FLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsT0FBTyxFQUNQLDJCQUEyQixFQUM1QixNQUFNLHNDQUFzQyxDQUFDO0FBQzlDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxlQUFlLEVBQXdCLE1BQU0sK0JBQStCLENBQUM7QUFFL0csT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7QUFTL0UsTUFBTSxPQUFPLHVCQUF1Qjs7Ozs7O0lBQ2xDLFlBQ1Usd0JBQWtELEVBQ2xELFFBQWtCLEVBR2xCLHFCQUE0QztRQUo1Qyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELGFBQVEsR0FBUixRQUFRLENBQVU7UUFHbEIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtJQUNuRCxDQUFDOzs7Ozs7Ozs7OztJQVVHLE1BQU0sQ0FDWCxTQUFvQixFQUNwQixpQkFBb0MsRUFDcEMsY0FBMkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFOztjQUU3QyxRQUFRLEdBQUcsdUJBQXVCLENBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUVwRyxPQUFPLG1CQUFBLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUk7WUFDdkQsWUFBWSxFQUFFLFNBQVM7WUFDdkIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQzlCLFFBQVE7U0FDVCxDQUFDLEVBQTZCLENBQUM7SUFDbEMsQ0FBQzs7Ozs7Ozs7O0lBU00sWUFBWSxDQUNqQixVQUFzQixFQUN0QixjQUEyQixJQUFJLENBQUMsaUJBQWlCLEVBQUU7O2NBRTdDLGlCQUFpQixHQUFzQixJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQzs7Y0FDeEYsUUFBUSxHQUFzQixpQkFBaUIsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDOztjQUMzRSxTQUFTLEdBQWMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUV2RSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2RCxDQUFDOzs7Ozs7OztJQVFNLE1BQU0sQ0FBQyxRQUEyQixFQUFFLFdBQW9EO1FBQzdGLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRixDQUFDOzs7OztJQUVPLGlCQUFpQjtRQUN2QixPQUFPO1lBQ0wsU0FBUyxFQUFFLG1CQUFBLDJCQUEyQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUVoRztZQUNELFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztJQUNKLENBQUM7Ozs7OztJQUVPLHdCQUF3QixDQUFDLFFBQTJCO1FBQzFELE9BQU8sSUFBSSxrQkFBa0IsQ0FDM0I7WUFDRSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxpQkFBaUI7WUFDMUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsaUJBQWlCO1lBQzFDLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGtCQUFrQjtZQUM1QyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxrQkFBa0I7U0FDN0MsRUFDRCxJQUFJLENBQUMsd0JBQXdCLEVBQzdCLElBQUksQ0FBQyxRQUFRLEVBQ2IsSUFBSSxXQUFXLEVBQUUsRUFDakIsUUFBUSxDQUNULENBQUM7SUFDSixDQUFDOzs7WUFwRkYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7O1lBNUJvQix3QkFBd0I7WUFBRSxRQUFROzRDQWlDbEQsUUFBUSxZQUNSLE1BQU0sU0FBQyx1QkFBdUI7Ozs7Ozs7O0lBSC9CLDJEQUEwRDs7Ozs7SUFDMUQsMkNBQTBCOzs7OztJQUMxQix3REFFb0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEluamVjdG9yLCBJbmplY3QsIFR5cGUsIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5IH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBGb3JtRmllbGRTZXR0aW5nLCBSb290U2V0dGluZyB9IGZyb20gXCIuLi9mb3JtLXNldHRpbmdzL2Zvcm0tZmllbGQtc2V0dGluZ1wiO1xuaW1wb3J0IHsgRm9ybU1vZGVsIH0gZnJvbSBcIi4vZm9ybS1tb2RlbFwiO1xuaW1wb3J0IHsgRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9mb3JtLWNvbnRleHRcIjtcbmltcG9ydCB7IEZvcm1Sb290RGlyZWN0aXZlIH0gZnJvbSBcIi4vZm9ybS1yb290LmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgRmllbGRGYWN0b3J5LCBQYXJlbnRGaWVsZEZhY3RvcnkgfSBmcm9tIFwiLi4vZm9ybS1maWVsZC9maWVsZC1mYWN0b3J5XCI7XG5pbXBvcnQgeyBHcm91cEZpZWxkRmFjdG9yeSB9IGZyb20gXCIuLi9mb3JtLWZpZWxkL2dyb3VwL2dyb3VwLWZpZWxkLWZhY3RvcnlcIjtcbmltcG9ydCB7IEFycmF5RmllbGRGYWN0b3J5IH0gZnJvbSBcIi4uL2Zvcm0tZmllbGQvYXJyYXkvYXJyYXktZmllbGQtZmFjdG9yeVwiO1xuaW1wb3J0IHsgU2luZ2xlRmllbGRGYWN0b3J5IH0gZnJvbSBcIi4uL2Zvcm0tZmllbGQvc2luZ2xlL3NpbmdsZS1maWVsZC1mYWN0b3J5XCI7XG5pbXBvcnQgeyBJbmxpbmVGb3JtIH0gZnJvbSBcIi4vaW5saW5lL2lubGluZS1mb3JtXCI7XG5pbXBvcnQge1xuICBjcmVhdGVGb3JtRmllbGRTZXR0aW5ncyxcbiAgRm9ybUZpZWxkU2V0dGluZ3MsXG4gIFJPT1RfSUQsXG4gIGVuc3VyZURlZmF1bHRGb3JtQ29tcG9uZW50c1xufSBmcm9tIFwiLi4vZm9ybS1zZXR0aW5ncy9mb3JtLWZpZWxkLXNldHRpbmdzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0ZPUk1fQ09NUE9ORU5UUywgRHluYW1pY0Zvcm1UeXBlLCBGb3JtQ29tcG9uZW50c0J5VHlwZSB9IGZyb20gXCIuLi9mb3JtLWZpZWxkL2Zvcm0tZmllbGQtdHlwZVwiO1xuaW1wb3J0IHsgRm9ybUZpZWxkR3JvdXBDb21wb25lbnQgfSBmcm9tIFwiLi4vZm9ybS1maWVsZC9ncm91cC9mb3JtLWZpZWxkLWdyb3VwLWNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSW5saW5lRm9ybUZhY3RvcnkgfSBmcm9tIFwiLi9pbmxpbmUvaW5saW5lLWZvcm0tZmFjdG9yeVwiO1xuaW1wb3J0IHsgSGlkZGVuRmllbGRGYWN0b3J5IH0gZnJvbSBcIi4uL2Zvcm0tZmllbGQvaGlkZGVuL2hpZGRlbi1maWVsZC1mYWN0b3J5XCI7XG5cbi8qKlxuICogQSBzZXJ2aWNlIGZvciBjcmVhdGluZyBhbmQgcmVuZGVyaW5nIGR5bmFtaWMgZm9ybXMuIEZvciB1c2FnZSBpbmZvcm1hdGlvbnMgcmVmZXIgdG9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90b20tc2Nob2VuZXIvYW5ndWxhci1keW5hbWljLWZvcm1zLWxpdGVcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiBcInJvb3RcIlxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybXNMaXRlU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KERFRkFVTFRfRk9STV9DT01QT05FTlRTKVxuICAgIHByaXZhdGUgZGVmYXVsdEZvcm1Db21wb25lbnRzPzogRm9ybUNvbXBvbmVudHNCeVR5cGVcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZm9ybSBjb250ZXh0IGZyb20gYSBzZXBlcmF0ZWQgbW9kZWwgYW5kIGZvcm0gc2V0dGluZ3MuIFRoaXMgaXMgdXNlZnVsIGZvciBhZHZhbmNlZFxuICAgKiBmb3Jtcywgd2hlcmUgdGhlIG1vZGVsIGlzIGZldGNoZWQgZnJvbSBhIHNlcnZlci5cbiAgICpcbiAgICogQHBhcmFtIGZvcm1Nb2RlbCBmb3JtIG1vZGVsXG4gICAqIEBwYXJhbSBmb3JtRmllbGRTZXR0aW5ncyBzZXR0aW5ncyBmb3IgdGhlIGZvcm0gbW9kZWxcbiAgICogQHBhcmFtIHJvb3RTZXR0aW5nIHNldHRpbmdzIGZvciB0aGUgcm9vdCBvZiB0aGUgZm9ybVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZTxNID0gYW55PihcbiAgICBmb3JtTW9kZWw6IEZvcm1Nb2RlbCxcbiAgICBmb3JtRmllbGRTZXR0aW5nczogRm9ybUZpZWxkU2V0dGluZ3MsXG4gICAgcm9vdFNldHRpbmc6IFJvb3RTZXR0aW5nID0gdGhpcy5jcmVhdGVSb290U2V0dGluZygpXG4gICk6IEZvcm1Db250ZXh0PE0sIEZvcm1Hcm91cD4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gY3JlYXRlRm9ybUZpZWxkU2V0dGluZ3Mocm9vdFNldHRpbmcsIGZvcm1GaWVsZFNldHRpbmdzLCB0aGlzLmRlZmF1bHRGb3JtQ29tcG9uZW50cyk7XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJlbnRGaWVsZEZhY3Rvcnkoc2V0dGluZ3MpLmNyZWF0ZTxNPih7XG4gICAgICBpbml0aWFsVmFsdWU6IGZvcm1Nb2RlbCxcbiAgICAgIHNldHRpbmc6IHNldHRpbmdzLmdldChST09UX0lEKSxcbiAgICAgIHNldHRpbmdzXG4gICAgfSkgYXMgRm9ybUNvbnRleHQ8TSwgRm9ybUdyb3VwPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZHluYW1pYyBmb3JtIGNvbnRleHQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVuZGVyIGEgZm9ybS4gVGhpcyBpcyB1c2VmdWwgZm9yIHNpbXBsZSBmb3Jtcywgd2hlcmVcbiAgICogdGhlIG1vZGVsIGlzIGJhc2ljYWxseSBlbXB0eS4gRm9yIGFuIGFkdmFuY2VkIHVzZWNhc2Ugd2l0aCBhIHNlcGVyYXRlIG1vZGVsIGFuZCBmb3JtIHNldHRpbmdzIHNlZSAnY3JlYXRlJy5cbiAgICpcbiAgICogQHBhcmFtIGlubGluZUZvcm0gZm9ybSwgd2hlcmUgdGhlIG1vZGVsIGFuZCBzZXR0aW5ncyBhcmUgY29tYmluZWRcbiAgICogQHBhcmFtIHJvb3RTZXR0aW5nIHNldHRpbmdzIGZvciB0aGUgcm9vdCBvZiB0aGUgZm9ybVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUlubGluZShcbiAgICBpbmxpbmVGb3JtOiBJbmxpbmVGb3JtLFxuICAgIHJvb3RTZXR0aW5nOiBSb290U2V0dGluZyA9IHRoaXMuY3JlYXRlUm9vdFNldHRpbmcoKVxuICApOiBGb3JtQ29udGV4dDxhbnksIEZvcm1Hcm91cD4ge1xuICAgIGNvbnN0IGlubGluZUZvcm1GYWN0b3J5OiBJbmxpbmVGb3JtRmFjdG9yeSA9IG5ldyBJbmxpbmVGb3JtRmFjdG9yeSh0aGlzLmRlZmF1bHRGb3JtQ29tcG9uZW50cyk7XG4gICAgY29uc3Qgc2V0dGluZ3M6IEZvcm1GaWVsZFNldHRpbmdzID0gaW5saW5lRm9ybUZhY3RvcnkucmVzb2x2ZVNldHRpbmdzKGlubGluZUZvcm0pO1xuICAgIGNvbnN0IGZvcm1Nb2RlbDogRm9ybU1vZGVsID0gaW5saW5lRm9ybUZhY3RvcnkucmVzb2x2ZU1vZGVsKGlubGluZUZvcm0pO1xuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKGZvcm1Nb2RlbCwgc2V0dGluZ3MsIHJvb3RTZXR0aW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBmb3JtIGF0IHRoZSBzcGVjaWZpZWQgZm9ybSByb290IHJlY3Vyc2l2ZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybVJvb3Qgcm9vdCBlbGVtZW50IChkaXJlY3RpdmUpIHRvIGluc2VydCB0aGUgZm9ybSBpbnRvXG4gICAqIEBwYXJhbSBmb3JtQ29udGV4dCBmb3JtIGNvbnRleHRcbiAgICovXG4gIHB1YmxpYyByZW5kZXIoZm9ybVJvb3Q6IEZvcm1Sb290RGlyZWN0aXZlLCBmb3JtQ29udGV4dDogRm9ybUNvbnRleHQ8YW55LCBGb3JtR3JvdXAgfCBGb3JtQXJyYXk+KTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVQYXJlbnRGaWVsZEZhY3RvcnkoZm9ybUNvbnRleHQuc2V0dGluZ3MpLnJlbmRlcihmb3JtUm9vdCwgZm9ybUNvbnRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSb290U2V0dGluZygpOiBSb290U2V0dGluZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBvbmVudDogZW5zdXJlRGVmYXVsdEZvcm1Db21wb25lbnRzKHRoaXMuZGVmYXVsdEZvcm1Db21wb25lbnRzLCBcInJvb3RcIiwgRHluYW1pY0Zvcm1UeXBlLkdST1VQKSBhcyBUeXBlPFxuICAgICAgICBGb3JtRmllbGRHcm91cENvbXBvbmVudFxuICAgICAgPixcbiAgICAgIG1ldGFkYXRhOiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUGFyZW50RmllbGRGYWN0b3J5KHNldHRpbmdzOiBGb3JtRmllbGRTZXR0aW5ncyk6IEZpZWxkRmFjdG9yeTxBYnN0cmFjdENvbnRyb2wsIEZvcm1GaWVsZFNldHRpbmc8YW55Pj4ge1xuICAgIHJldHVybiBuZXcgUGFyZW50RmllbGRGYWN0b3J5KFxuICAgICAge1xuICAgICAgICBbRHluYW1pY0Zvcm1UeXBlLkdST1VQXTogR3JvdXBGaWVsZEZhY3RvcnksXG4gICAgICAgIFtEeW5hbWljRm9ybVR5cGUuQVJSQVldOiBBcnJheUZpZWxkRmFjdG9yeSxcbiAgICAgICAgW0R5bmFtaWNGb3JtVHlwZS5TSU5HTEVdOiBTaW5nbGVGaWVsZEZhY3RvcnksXG4gICAgICAgIFtEeW5hbWljRm9ybVR5cGUuSElEREVOXTogSGlkZGVuRmllbGRGYWN0b3J5XG4gICAgICB9LFxuICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgbmV3IEZvcm1CdWlsZGVyKCksXG4gICAgICBzZXR0aW5nc1xuICAgICk7XG4gIH1cbn1cbiJdfQ==