UNPKG

kwikid-components

Version:
191 lines 28.9 kB
import { __awaiter } from "tslib"; import { Component, Input } from "@angular/core"; import { checkObjectPathExists, isNotEmptyValue, checkObjectKeyExists, RuleEngine, setValueToObjectPath, Source } from "kwikid-toolkit"; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class KwikIDDynamicViewContainerComponent { constructor() { this.config = {}; this.data = {}; this.layoutId = undefined; /** * Function to get and render all components in the specified element. * @param {HTMLElement} element - The element to which the components will be appended. * @param {Array} components - Array of components to be rendered. * @param {Object} data - Data object used to populate components. * @param {Object} config - Configuration object for dynamic view. * @returns {HTMLElement} - The updated element with appended components. */ this.getComponents = (element, components, data, config) => { Array.isArray(components) && components.forEach((layoutItem, index) => { var _a, _b; // If Component Type is <tr> or <row>, create a row and add row elements. if ((layoutItem === null || layoutItem === void 0 ? void 0 : layoutItem.type) === "tr" || (layoutItem === null || layoutItem === void 0 ? void 0 : layoutItem.type) === "row") { let row = document.createElement(layoutItem.type); row.setAttribute("id", (_a = layoutItem === null || layoutItem === void 0 ? void 0 : layoutItem.id) !== null && _a !== void 0 ? _a : `row_${index}`); row.setAttribute("style", (_b = layoutItem === null || layoutItem === void 0 ? void 0 : layoutItem.styles) !== null && _b !== void 0 ? _b : ""); row.style.display = "flex"; row.style.flexDirection = "row"; // Get all row items and append them to the row row = this.getRowItems(row, layoutItem.components, data, config); element.appendChild(row); } // If Component Type is not a row, create a normal div and add it to the parent div else { const component = this.getComponent(layoutItem, data, config); element.appendChild(component); } }); return element; }; /** * Function to append all components to a row. * @param {HTMLElement} row - The row element to which the components will be appended. * @param {Array} components - Array of components to be appended to the row. * @param {Object} data - Data object used to populate components. * @param {Object} config - Configuration object for dynamic view. * @returns {HTMLElement} - The updated row element with appended components. */ this.getRowItems = (row, components, data, config) => { Array.isArray(components) && components.forEach((componentItem) => __awaiter(this, void 0, void 0, function* () { const component = yield this.getComponent(componentItem, data, config); row.appendChild(component); })); return row; }; /** * Function to configure and return a component or element. * @param {Object} component - The component object to be configured. * @param {Object} data - Data object used to populate components. * @param {Object} config - Configuration object for dynamic view. * @returns {HTMLElement} - The configured element. */ this.getComponent = (component, data, config) => __awaiter(this, void 0, void 0, function* () { var _a, _b; // Execute validation if the component has a validation key if (checkObjectKeyExists(component, "validation")) { component = yield this.executeValidation(component, data, config); } // Create element and assign attributes to it const elementType = (_a = component.type) !== null && _a !== void 0 ? _a : "div"; let element = document.createElement(elementType); element.setAttribute("id", component.id); element.setAttribute("style", (_b = component === null || component === void 0 ? void 0 : component.styles) !== null && _b !== void 0 ? _b : ""); // If the element contains child components, get all its components if (checkObjectKeyExists(component, "components") && Array.isArray(component.components)) { element = this.getComponents(element, component.components, data, config); } // If the element contains a source, fetch value or innerHTML from source else if (checkObjectKeyExists(component, "source")) { const source = new Source({ DATA: data }); const value = source.getValueFromSource(component.source); element.innerHTML = value; } // Otherwise, set the value to innerHTML of the element else if (checkObjectKeyExists(component, "value")) { element.innerHTML = component.value; } return element.cloneNode(true); }); /** * Function to execute validation for a component. * @param {Object} component - The component object to be validated. * @param {Object} data - Data object used to populate components. * @param {Object} config - Configuration object for dynamic view. * @returns {Promise<HTMLElement>} - The promise with the updated element after validation. */ this.executeValidation = (component, data, config) => { return new Promise((resolve) => { const takeAction = (action, object) => __awaiter(this, void 0, void 0, function* () { var _a, _b, _c, _d, _e; const source = new Source(object); switch (action.key) { // For "SET_STYLES" action case "SET_STYLES": if (checkObjectPathExists(action, "props.styles.source")) { const sourceValue = yield source.getValueFromSource(action.props.styles.source); action = setValueToObjectPath(action, "props.styles.styles", sourceValue); } component.styles = (_a = action.props.styles.styles) !== null && _a !== void 0 ? _a : component.style; break; // For "SET_HTML" action case "SET_HTML": if (checkObjectPathExists(action, "props.value.source")) { const sourceValue = yield source.getValueFromSource(action.props.value.source); action = setValueToObjectPath(action, "props.value.value", sourceValue); } component.value = (_c = (_b = action.props) === null || _b === void 0 ? void 0 : _b.value) === null || _c === void 0 ? void 0 : _c.value; break; // For "SET_COMPONENTS" action case "SET_COMPONENTS": if (checkObjectPathExists(action, "props.components.source")) { const sourceValue = yield source.getValueFromSource(action.props.components.source); action = setValueToObjectPath(action, "props.components.components", sourceValue); } component.components = (_e = (_d = action.props) === null || _d === void 0 ? void 0 : _d.components) === null || _e === void 0 ? void 0 : _e.components; break; default: break; } }); const ruleEngine = new RuleEngine({ COMPONENT_CONFIG: component, DATA: data, DYNAMIC_VIEW_CONFIG: config }, takeAction); (() => __awaiter(this, void 0, void 0, function* () { // Perform the validation for the component yield ruleEngine.run(component.validation); // Resolve the promise with the updated component resolve(component); }))(); }); }; } ngOnInit() { if (isNotEmptyValue(this.config) && checkObjectPathExists(this.config, "layout.components")) { const { id } = this.config.layout; this.layoutId = id; } } ngAfterViewInit() { var _a, _b; const root = document.querySelector(`#${this.layoutId}`); if (root) { root.setAttribute("style", (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.layout) === null || _b === void 0 ? void 0 : _b.styles); // Call the function to get and render all components in the main container this.getComponents(root, this.config.layout.components, this.data, this.config); } } } /** @nocollapse */ KwikIDDynamicViewContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDDynamicViewContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ KwikIDDynamicViewContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDDynamicViewContainerComponent, selector: "kwikid-dynamic-view-container", inputs: { config: "config", data: "data" }, ngImport: i0, template: ` <div *ngIf="layoutId" [id]="layoutId" > </div> `, isInline: true, directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDDynamicViewContainerComponent, decorators: [{ type: Component, args: [{ selector: "kwikid-dynamic-view-container", template: ` <div *ngIf="layoutId" [id]="layoutId" > </div> `, styles: [] }] }], ctorParameters: function () { return []; }, propDecorators: { config: [{ type: Input }], data: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy12aWV3LWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZHluYW1pYy12aWV3LWNvbnRhaW5lci9keW5hbWljLXZpZXctY29udGFpbmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixVQUFVLEVBQ1Ysb0JBQW9CLEVBQ3BCLE1BQU0sRUFDUCxNQUFNLGdCQUFnQixDQUFDOzs7QUFheEIsTUFBTSxPQUFPLG1DQUFtQztJQVU5QztRQVBBLFdBQU0sR0FBUSxFQUFFLENBQUM7UUFHakIsU0FBSSxHQUFRLEVBQUUsQ0FBQztRQUVmLGFBQVEsR0FBRyxTQUFTLENBQUM7UUE2QnJCOzs7Ozs7O1dBT0c7UUFDSCxrQkFBYSxHQUFHLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDcEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQ3ZCLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUU7O29CQUN2Qyx5RUFBeUU7b0JBQ3pFLElBQUksQ0FBQSxVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsSUFBSSxNQUFLLElBQUksSUFBSSxDQUFBLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxJQUFJLE1BQUssS0FBSyxFQUFFO3dCQUMzRCxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDbEQsR0FBRyxDQUFDLFlBQVks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QUNELE1BQU0sRUFBRSxFQUFFO2lCQUNYOzBFQUlDLE1BQU07c0JBREwsS0FBSztnQkFJTixJQUFJO3NCQURILEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgY2hlY2tPYmplY3RQYXRoRXhpc3RzLFxuICBpc05vdEVtcHR5VmFsdWUsXG4gIGNoZWNrT2JqZWN0S2V5RXhpc3RzLFxuICBSdWxlRW5naW5lLFxuICBzZXRWYWx1ZVRvT2JqZWN0UGF0aCxcbiAgU291cmNlXG59IGZyb20gXCJrd2lraWQtdG9vbGtpdFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwia3dpa2lkLWR5bmFtaWMtdmlldy1jb250YWluZXJcIixcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cImxheW91dElkXCJcbiAgICAgIFtpZF09XCJsYXlvdXRJZFwiXG4gICAgPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtdXG59KVxuZXhwb3J0IGNsYXNzIEt3aWtJRER5bmFtaWNWaWV3Q29udGFpbmVyQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KClcbiAgY29uZmlnOiBhbnkgPSB7fTtcblxuICBASW5wdXQoKVxuICBkYXRhOiBhbnkgPSB7fTtcblxuICBsYXlvdXRJZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgaXNOb3RFbXB0eVZhbHVlKHRoaXMuY29uZmlnKSAmJlxuICAgICAgY2hlY2tPYmplY3RQYXRoRXhpc3RzKHRoaXMuY29uZmlnLCBcImxheW91dC5jb21wb25lbnRzXCIpXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSB0aGlzLmNvbmZpZy5sYXlvdXQ7XG4gICAgICB0aGlzLmxheW91dElkID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGNvbnN0IHJvb3Q6IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3RoaXMubGF5b3V0SWR9YCk7XG4gICAgaWYgKHJvb3QpIHtcbiAgICAgIHJvb3Quc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgdGhpcy5jb25maWc/LmxheW91dD8uc3R5bGVzKTtcblxuICAgICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gdG8gZ2V0IGFuZCByZW5kZXIgYWxsIGNvbXBvbmVudHMgaW4gdGhlIG1haW4gY29udGFpbmVyXG4gICAgICB0aGlzLmdldENvbXBvbmVudHMoXG4gICAgICAgIHJvb3QsXG4gICAgICAgIHRoaXMuY29uZmlnLmxheW91dC5jb21wb25lbnRzLFxuICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgIHRoaXMuY29uZmlnXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBnZXQgYW5kIHJlbmRlciBhbGwgY29tcG9uZW50cyBpbiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byB3aGljaCB0aGUgY29tcG9uZW50cyB3aWxsIGJlIGFwcGVuZGVkLlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb21wb25lbnRzIC0gQXJyYXkgb2YgY29tcG9uZW50cyB0byBiZSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhIG9iamVjdCB1c2VkIHRvIHBvcHVsYXRlIGNvbXBvbmVudHMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgZHluYW1pYyB2aWV3LlxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IC0gVGhlIHVwZGF0ZWQgZWxlbWVudCB3aXRoIGFwcGVuZGVkIGNvbXBvbmVudHMuXG4gICAqL1xuICBnZXRDb21wb25lbnRzID0gKGVsZW1lbnQsIGNvbXBvbmVudHMsIGRhdGEsIGNvbmZpZykgPT4ge1xuICAgIEFycmF5LmlzQXJyYXkoY29tcG9uZW50cykgJiZcbiAgICAgIGNvbXBvbmVudHMuZm9yRWFjaCgobGF5b3V0SXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gSWYgQ29tcG9uZW50IFR5cGUgaXMgPHRyPiBvciA8cm93PiwgY3JlYXRlIGEgcm93IGFuZCBhZGQgcm93IGVsZW1lbnRzLlxuICAgICAgICBpZiAobGF5b3V0SXRlbT8udHlwZSA9PT0gXCJ0clwiIHx8IGxheW91dEl0ZW0/LnR5cGUgPT09IFwicm93XCIpIHtcbiAgICAgICAgICBsZXQgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChsYXlvdXRJdGVtLnR5cGUpO1xuICAgICAgICAgIHJvdy5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBsYXlvdXRJdGVtPy5pZCA/PyBgcm93XyR7aW5kZXh9YCk7XG4gICAgICAgICAgcm93LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIGxheW91dEl0ZW0/LnN0eWxlcyA/PyBcIlwiKTtcbiAgICAgICAgICByb3cuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xuICAgICAgICAgIHJvdy5zdHlsZS5mbGV4RGlyZWN0aW9uID0gXCJyb3dcIjtcblxuICAgICAgICAgIC8vIEdldCBhbGwgcm93IGl0ZW1zIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUgcm93XG4gICAgICAgICAgcm93ID0gdGhpcy5nZXRSb3dJdGVtcyhyb3csIGxheW91dEl0ZW0uY29tcG9uZW50cywgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgQ29tcG9uZW50IFR5cGUgaXMgbm90IGEgcm93LCBjcmVhdGUgYSBub3JtYWwgZGl2IGFuZCBhZGQgaXQgdG8gdGhlIHBhcmVudCBkaXZcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5nZXRDb21wb25lbnQobGF5b3V0SXRlbSwgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9O1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBhcHBlbmQgYWxsIGNvbXBvbmVudHMgdG8gYSByb3cuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJvdyAtIFRoZSByb3cgZWxlbWVudCB0byB3aGljaCB0aGUgY29tcG9uZW50cyB3aWxsIGJlIGFwcGVuZGVkLlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb21wb25lbnRzIC0gQXJyYXkgb2YgY29tcG9uZW50cyB0byBiZSBhcHBlbmRlZCB0byB0aGUgcm93LlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIERhdGEgb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgY29tcG9uZW50cy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBkeW5hbWljIHZpZXcuXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gLSBUaGUgdXBkYXRlZCByb3cgZWxlbWVudCB3aXRoIGFwcGVuZGVkIGNvbXBvbmVudHMuXG4gICAqL1xuICBnZXRSb3dJdGVtcyA9IChyb3csIGNvbXBvbmVudHMsIGRhdGEsIGNvbmZpZykgPT4ge1xuICAgIEFycmF5LmlzQXJyYXkoY29tcG9uZW50cykgJiZcbiAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChhc3luYyhjb21wb25lbnRJdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGF3YWl0IHRoaXMuZ2V0Q29tcG9uZW50KGNvbXBvbmVudEl0ZW0sIGRhdGEsIGNvbmZpZyk7XG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChjb21wb25lbnQpO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIHJvdztcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gdG8gY29uZmlndXJlIGFuZCByZXR1cm4gYSBjb21wb25lbnQgb3IgZWxlbWVudC5cbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgb2JqZWN0IHRvIGJlIGNvbmZpZ3VyZWQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YSBvYmplY3QgdXNlZCB0byBwb3B1bGF0ZSBjb21wb25lbnRzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGR5bmFtaWMgdmlldy5cbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSAtIFRoZSBjb25maWd1cmVkIGVsZW1lbnQuXG4gICAqL1xuICBnZXRDb21wb25lbnQgPSBhc3luYyhjb21wb25lbnQsIGRhdGEsIGNvbmZpZykgPT4ge1xuICAgIC8vIEV4ZWN1dGUgdmFsaWRhdGlvbiBpZiB0aGUgY29tcG9uZW50IGhhcyBhIHZhbGlkYXRpb24ga2V5XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNvbXBvbmVudCwgXCJ2YWxpZGF0aW9uXCIpKSB7XG4gICAgICBjb21wb25lbnQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVWYWxpZGF0aW9uKGNvbXBvbmVudCwgZGF0YSwgY29uZmlnKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZWxlbWVudCBhbmQgYXNzaWduIGF0dHJpYnV0ZXMgdG8gaXRcbiAgICBjb25zdCBlbGVtZW50VHlwZSA9IGNvbXBvbmVudC50eXBlID8/IFwiZGl2XCI7XG4gICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsZW1lbnRUeXBlKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImlkXCIsIGNvbXBvbmVudC5pZCk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBjb21wb25lbnQ/LnN0eWxlcyA/PyBcIlwiKTtcblxuICAgIC8vIElmIHRoZSBlbGVtZW50IGNvbnRhaW5zIGNoaWxkIGNvbXBvbmVudHMsIGdldCBhbGwgaXRzIGNvbXBvbmVudHNcbiAgICBpZiAoXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhjb21wb25lbnQsIFwiY29tcG9uZW50c1wiKSAmJlxuICAgICAgQXJyYXkuaXNBcnJheShjb21wb25lbnQuY29tcG9uZW50cylcbiAgICApIHtcbiAgICAgIGVsZW1lbnQgPSB0aGlzLmdldENvbXBvbmVudHMoZWxlbWVudCwgY29tcG9uZW50LmNvbXBvbmVudHMsIGRhdGEsIGNvbmZpZyk7XG4gICAgfVxuICAgIC8vIElmIHRoZSBlbGVtZW50IGNvbnRhaW5zIGEgc291cmNlLCBmZXRjaCB2YWx1ZSBvciBpbm5lckhUTUwgZnJvbSBzb3VyY2VcbiAgICBlbHNlIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb21wb25lbnQsIFwic291cmNlXCIpKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKHsgREFUQTogZGF0YSB9KTtcbiAgICAgIGNvbnN0IHZhbHVlID0gc291cmNlLmdldFZhbHVlRnJvbVNvdXJjZShjb21wb25lbnQuc291cmNlKTtcbiAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIE90aGVyd2lzZSwgc2V0IHRoZSB2YWx1ZSB0byBpbm5lckhUTUwgb2YgdGhlIGVsZW1lbnRcbiAgICBlbHNlIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb21wb25lbnQsIFwidmFsdWVcIikpIHtcbiAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29tcG9uZW50LnZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50LmNsb25lTm9kZSh0cnVlKTtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gdG8gZXhlY3V0ZSB2YWxpZGF0aW9uIGZvciBhIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgb2JqZWN0IHRvIGJlIHZhbGlkYXRlZC5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhIG9iamVjdCB1c2VkIHRvIHBvcHVsYXRlIGNvbXBvbmVudHMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgZHluYW1pYyB2aWV3LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxIVE1MRWxlbWVudD59IC0gVGhlIHByb21pc2Ugd2l0aCB0aGUgdXBkYXRlZCBlbGVtZW50IGFmdGVyIHZhbGlkYXRpb24uXG4gICAqL1xuICBleGVjdXRlVmFsaWRhdGlvbiA9IChjb21wb25lbnQsIGRhdGEsIGNvbmZpZykgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgdGFrZUFjdGlvbiA9IGFzeW5jKGFjdGlvbiwgb2JqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBTb3VyY2Uob2JqZWN0KTtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24ua2V5KSB7XG4gICAgICAgICAgLy8gRm9yIFwiU0VUX1NUWUxFU1wiIGFjdGlvblxuICAgICAgICAgIGNhc2UgXCJTRVRfU1RZTEVTXCI6XG4gICAgICAgICAgICBpZiAoY2hlY2tPYmplY3RQYXRoRXhpc3RzKGFjdGlvbiwgXCJwcm9wcy5zdHlsZXMuc291cmNlXCIpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gYXdhaXQgc291cmNlLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgICAgICAgICAgICBhY3Rpb24ucHJvcHMuc3R5bGVzLnNvdXJjZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBhY3Rpb24gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChcbiAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgXCJwcm9wcy5zdHlsZXMuc3R5bGVzXCIsXG4gICAgICAgICAgICAgICAgc291cmNlVmFsdWVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudC5zdHlsZXMgPSBhY3Rpb24ucHJvcHMuc3R5bGVzLnN0eWxlcyA/PyBjb21wb25lbnQuc3R5bGU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIC8vIEZvciBcIlNFVF9IVE1MXCIgYWN0aW9uXG4gICAgICAgICAgY2FzZSBcIlNFVF9IVE1MXCI6XG4gICAgICAgICAgICBpZiAoY2hlY2tPYmplY3RQYXRoRXhpc3RzKGFjdGlvbiwgXCJwcm9wcy52YWx1ZS5zb3VyY2VcIikpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBhd2FpdCBzb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKFxuICAgICAgICAgICAgICAgIGFjdGlvbi5wcm9wcy52YWx1ZS5zb3VyY2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYWN0aW9uID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgIFwicHJvcHMudmFsdWUudmFsdWVcIixcbiAgICAgICAgICAgICAgICBzb3VyY2VWYWx1ZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9uZW50LnZhbHVlID0gYWN0aW9uLnByb3BzPy52YWx1ZT8udmFsdWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIC8vIEZvciBcIlNFVF9DT01QT05FTlRTXCIgYWN0aW9uXG4gICAgICAgICAgY2FzZSBcIlNFVF9DT01QT05FTlRTXCI6XG4gICAgICAgICAgICBpZiAoY2hlY2tPYmplY3RQYXRoRXhpc3RzKGFjdGlvbiwgXCJwcm9wcy5jb21wb25lbnRzLnNvdXJjZVwiKSkge1xuICAgICAgICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IGF3YWl0IHNvdXJjZS5nZXRWYWx1ZUZyb21Tb3VyY2UoXG4gICAgICAgICAgICAgICAgYWN0aW9uLnByb3BzLmNvbXBvbmVudHMuc291cmNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGFjdGlvbiA9IHNldFZhbHVlVG9PYmplY3RQYXRoKFxuICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICBcInByb3BzLmNvbXBvbmVudHMuY29tcG9uZW50c1wiLFxuICAgICAgICAgICAgICAgIHNvdXJjZVZhbHVlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnQuY29tcG9uZW50cyA9IGFjdGlvbi5wcm9wcz8uY29tcG9uZW50cz8uY29tcG9uZW50cztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBydWxlRW5naW5lID0gbmV3IFJ1bGVFbmdpbmUoXG4gICAgICAgIHtcbiAgICAgICAgICBDT01QT05FTlRfQ09ORklHOiBjb21wb25lbnQsXG4gICAgICAgICAgREFUQTogZGF0YSxcbiAgICAgICAgICBEWU5BTUlDX1ZJRVdfQ09ORklHOiBjb25maWdcbiAgICAgICAgfSxcbiAgICAgICAgdGFrZUFjdGlvblxuICAgICAgKTtcblxuICAgICAgKGFzeW5jKCkgPT4ge1xuICAgICAgICAvLyBQZXJmb3JtIHRoZSB2YWxpZGF0aW9uIGZvciB0aGUgY29tcG9uZW50XG4gICAgICAgIGF3YWl0IHJ1bGVFbmdpbmUucnVuKGNvbXBvbmVudC52YWxpZGF0aW9uKTtcbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcHJvbWlzZSB3aXRoIHRoZSB1cGRhdGVkIGNvbXBvbmVudFxuICAgICAgICByZXNvbHZlKGNvbXBvbmVudCk7XG4gICAgICB9KSgpO1xuICAgIH0pO1xuICB9O1xufVxuIl19