UNPKG

@adobe/cq-angular-editable-components

Version:

* [API](#api) * [Documentation](#documentation) * [Changelog](#changelog)

235 lines (234 loc) 24.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /* * ADOBE CONFIDENTIAL * * Copyright 2018 Adobe Systems Incorporated * All Rights Reserved. * * NOTICE: All information contained herein is, and remains * the property of Adobe Systems Incorporated and its suppliers, * if any. The intellectual and technical concepts contained * herein are proprietary to Adobe Systems Incorporated and its * suppliers and may be covered by U.S. and Foreign Patents, * patents in process, and are protected by trade secret or copyright law. * Dissemination of this information or reproduction of this material * is strictly forbidden unless prior written permission is obtained * from Adobe Systems Incorporated. */ import { Directive, Input, Renderer2, NgZone, ViewContainerRef, ComponentFactoryResolver } from '@angular/core'; import { ComponentMapping } from "./component-mapping"; import { PageModelManager } from '@adobe/cq-spa-page-model-manager'; import { Constants } from "./constants"; import { Utils } from "./utils"; const /** @type {?} */ PLACEHOLDER_CLASS_NAME = 'cq-placeholder'; const /** @type {?} */ DRAG_DROP_REGEX = /cq-dd-([^ ])+/g; const /** @type {?} */ DRAG_DROP_CLASS_NAME = 'cq-dd-'; export class AEMComponentDirective { /** * @param {?} renderer * @param {?} viewContainer * @param {?} factoryResolver * @param {?} ngZone */ constructor(renderer, viewContainer, factoryResolver, ngZone) { this.renderer = renderer; this.viewContainer = viewContainer; this.factoryResolver = factoryResolver; this.ngZone = ngZone; } /** * @return {?} */ ngOnInit() { this.renderComponent(ComponentMapping.get(this.type)); } /** * Returns the type of the cqModel if exists. * @return {?} */ get type() { return this.cqModel && this.cqModel[":type"]; } /** * Returns the column classes of the cqModel * @return {?} */ get columnClasses() { return this.cqModel && (this.cqModel.columnClassNames || ''); } /** * Updates the cqModel * @return {?} */ updateCqModel() { let /** @type {?} */ self = this; // Fetching the latest data for the item at the given path this.getCqModel().then(model => { this.ngZone.run(() => { model[Constants.DATA_PATH_PROP] = this.path; this.cqModel = model; this.updateComponentData(); this.setupElement(); let /** @type {?} */ editConfig = ComponentMapping.getEditConfig(ComponentMapping.get(this.type)); if (editConfig) { this.setupPlaceholder(editConfig); } }); }); } /** * Returns the Cq Model * * @return {?} */ getCqModel() { return PageModelManager.getData({ pagePath: this.pagePath, dataPath: this.path }); } /** * Renders a component dynamically based on the component definition * * @param {?} componentDefinition The component definition to render * @return {?} */ renderComponent(componentDefinition) { if (componentDefinition) { const /** @type {?} */ factory = this.factoryResolver.resolveComponentFactory(componentDefinition); this.viewContainer.clear(); this._component = this.viewContainer.createComponent(factory); this.updateComponentData(); this.setupElement(); let /** @type {?} */ editConfig = ComponentMapping.getEditConfig(componentDefinition); if (editConfig && Utils.isInEditor) { this.setupPlaceholder(editConfig); } PageModelManager.removeListener({ pagePath: this.pagePath, dataPath: this.path, callback: this.updateCqModel.bind(this) }); PageModelManager.addListener({ pagePath: this.pagePath, dataPath: this.path, callback: this.updateCqModel.bind(this) }); } } /** * Updates the data of the component based the data of the directive * @return {?} */ updateComponentData() { this._component.instance.cqModel = this.cqModel; this._component.instance.path = this.path; this._component.instance.pagePath = this.pagePath; this._component.instance.modelName = this.modelName; } /** * Setups the DOM element, setting the classes and attributes needed for the AEM editor. * @return {?} */ setupElement() { if (this._oldClasses) { let /** @type {?} */ oldClasses = this._oldClasses.split(' '); oldClasses.forEach((columnClass) => { this.renderer.removeClass(this._component.location.nativeElement, columnClass); }); } this._oldClasses = this.columnClasses; // Manually add the classes if (this.columnClasses) { let /** @type {?} */ classes = this.columnClasses.split(' '); classes.forEach((columnClass) => { this.renderer.addClass(this._component.location.nativeElement, columnClass); }); } if (this.path) { this.renderer.setAttribute(this._component.location.nativeElement, "data-cq-data-path", this.path); } } /** * Setups the placeholder of needed for the AEM editor * * @param {?} editConfig - the editConfig, which will dictate the classes to be added on. * @return {?} */ setupPlaceholder(editConfig) { // Remove previous drag and drop class names this.renderer.removeClass(this._component.location.nativeElement, DRAG_DROP_CLASS_NAME + editConfig.dragDropName); if (editConfig.dragDropName && editConfig.dragDropName.trim().length > 0) { this.renderer.addClass(this._component.location.nativeElement, DRAG_DROP_CLASS_NAME + editConfig.dragDropName); } if (this.usePlaceholder(editConfig)) { this.renderer.addClass(this._component.location.nativeElement, PLACEHOLDER_CLASS_NAME); this._component.location.nativeElement.dataset.emptytext = editConfig.emptyLabel; } else { this.renderer.removeClass(this._component.location.nativeElement, PLACEHOLDER_CLASS_NAME); delete this._component.location.nativeElement.dataset.emptytext; } } /** * Determines if the placeholder should e displayed. * * @param {?} editConfig - the edit config of the directive * @return {?} */ usePlaceholder(editConfig) { return editConfig.isEmpty && typeof editConfig.isEmpty === "function" && editConfig.isEmpty(this.cqModel); } /** * @return {?} */ ngOnDestroy() { PageModelManager.removeListener({ pagePath: this.pagePath, dataPath: this.path, callback: this.updateCqModel.bind(this) }); this._component && this._component.destroy(); } } AEMComponentDirective.decorators = [ { type: Directive, args: [{ selector: '[aemComponent]' },] }, ]; /** @nocollapse */ AEMComponentDirective.ctorParameters = () => [ { type: Renderer2, }, { type: ViewContainerRef, }, { type: ComponentFactoryResolver, }, { type: NgZone, }, ]; AEMComponentDirective.propDecorators = { "cqModel": [{ type: Input },], "path": [{ type: Input },], "pagePath": [{ type: Input },], "modelName": [{ type: Input },], "aemComponent": [{ type: Input },], }; function AEMComponentDirective_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ AEMComponentDirective.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ AEMComponentDirective.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ AEMComponentDirective.propDecorators; /** @type {?} */ AEMComponentDirective.prototype._component; /** @type {?} */ AEMComponentDirective.prototype._oldClasses; /** @type {?} */ AEMComponentDirective.prototype.cqModel; /** @type {?} */ AEMComponentDirective.prototype.path; /** @type {?} */ AEMComponentDirective.prototype.pagePath; /** @type {?} */ AEMComponentDirective.prototype.modelName; /** @type {?} */ AEMComponentDirective.prototype.aemComponent; /** @type {?} */ AEMComponentDirective.prototype.renderer; /** @type {?} */ AEMComponentDirective.prototype.viewContainer; /** @type {?} */ AEMComponentDirective.prototype.factoryResolver; /** @type {?} */ AEMComponentDirective.prototype.ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWVtLWNvbXBvbmVudC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYWRvYmUvY3EtYW5ndWxhci1lZGl0YWJsZS1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsibGliL2xheW91dC9hZW0tY29tcG9uZW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBd0IsU0FBUyxFQUFFLE1BQU0sRUFBcUIsZ0JBQWdCLEVBQUUsd0JBQXdCLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBRXZMLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUdoQyx1QkFBTSxzQkFBc0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNoRCx1QkFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7QUFDekMsdUJBQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDO0FBTXRDLE1BQU07Ozs7Ozs7SUFVSixZQUNVLFVBQ0EsZUFDQSxpQkFDQTtRQUhBLGFBQVEsR0FBUixRQUFRO1FBQ1Isa0JBQWEsR0FBYixhQUFhO1FBQ2Isb0JBQWUsR0FBZixlQUFlO1FBQ2YsV0FBTSxHQUFOLE1BQU07S0FDZjs7OztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUN2RDs7Ozs7SUFLRCxJQUFJLElBQUk7UUFDTixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzlDOzs7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Ozs7SUFHNUcsV0FBVztRQUNULGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUgsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQzlDOzs7WUFoS0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxnQkFBZ0I7YUFDM0I7Ozs7WUFoQmdELFNBQVM7WUFBNkIsZ0JBQWdCO1lBQUUsd0JBQXdCO1lBQXJFLE1BQU07Ozt3QkFzQi9ELEtBQUs7cUJBQ0wsS0FBSzt5QkFDTCxLQUFLOzBCQUNMLEtBQUs7NkJBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBBRE9CRSBDT05GSURFTlRJQUxcbiAqXG4gKiBDb3B5cmlnaHQgMjAxOCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFxuICogQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBOT1RJQ0U6ICBBbGwgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcywgYW5kIHJlbWFpbnNcbiAqIHRoZSBwcm9wZXJ0eSBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBhbmQgaXRzIHN1cHBsaWVycyxcbiAqIGlmIGFueS4gIFRoZSBpbnRlbGxlY3R1YWwgYW5kIHRlY2huaWNhbCBjb25jZXB0cyBjb250YWluZWRcbiAqIGhlcmVpbiBhcmUgcHJvcHJpZXRhcnkgdG8gQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgYW5kIGl0c1xuICogc3VwcGxpZXJzIGFuZCBtYXkgYmUgY292ZXJlZCBieSBVLlMuIGFuZCBGb3JlaWduIFBhdGVudHMsXG4gKiBwYXRlbnRzIGluIHByb2Nlc3MsIGFuZCBhcmUgcHJvdGVjdGVkIGJ5IHRyYWRlIHNlY3JldCBvciBjb3B5cmlnaHQgbGF3LlxuICogRGlzc2VtaW5hdGlvbiBvZiB0aGlzIGluZm9ybWF0aW9uIG9yIHJlcHJvZHVjdGlvbiBvZiB0aGlzIG1hdGVyaWFsXG4gKiBpcyBzdHJpY3RseSBmb3JiaWRkZW4gdW5sZXNzIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBvYnRhaW5lZFxuICogZnJvbSBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC5cbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgUmVuZGVyZXIyLCBOZ1pvbmUsIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEFwcGxpY2F0aW9uUmVmLCBDb21wb25lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29tcG9uZW50TWFwcGluZyB9IGZyb20gXCIuL2NvbXBvbmVudC1tYXBwaW5nXCI7XG5cbmltcG9ydCB7IFBhZ2VNb2RlbE1hbmFnZXIgfSBmcm9tICdAYWRvYmUvY3Etc3BhLXBhZ2UtbW9kZWwtbWFuYWdlcic7XG5cbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5cbmNvbnN0IFBMQUNFSE9MREVSX0NMQVNTX05BTUUgPSAnY3EtcGxhY2Vob2xkZXInO1xuY29uc3QgRFJBR19EUk9QX1JFR0VYID0gL2NxLWRkLShbXiBdKSsvZztcbmNvbnN0IERSQUdfRFJPUF9DTEFTU19OQU1FID0gJ2NxLWRkLSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thZW1Db21wb25lbnRdJ1xufSlcblxuZXhwb3J0IGNsYXNzIEFFTUNvbXBvbmVudERpcmVjdGl2ZSB7XG4gIHByaXZhdGUgX2NvbXBvbmVudDpDb21wb25lbnRSZWY8YW55PjtcbiAgcHJpdmF0ZSBfb2xkQ2xhc3NlczpzdHJpbmc7XG5cbiAgQElucHV0KCkgY3FNb2RlbDphbnk7XG4gIEBJbnB1dCgpIHBhdGg6c3RyaW5nO1xuICBASW5wdXQoKSBwYWdlUGF0aDpzdHJpbmc7XG4gIEBJbnB1dCgpIG1vZGVsTmFtZTpzdHJpbmc7XG4gIEBJbnB1dCgpIGFlbUNvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgZmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5yZW5kZXJDb21wb25lbnQoQ29tcG9uZW50TWFwcGluZy5nZXQodGhpcy50eXBlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgY3FNb2RlbCBpZiBleGlzdHMuXG4gICAqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jcU1vZGVsICYmIHRoaXMuY3FNb2RlbFtcIjp0eXBlXCJdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbHVtbiBjbGFzc2VzIG9mIHRoZSBjcU1vZGVsXG4gICAqL1xuICBnZXQgY29sdW1uQ2xhc3NlcygpIHtcbiAgICByZXR1cm4gdGhpcy5jcU1vZGVsICYmICh0aGlzLmNxTW9kZWwuY29sdW1uQ2xhc3NOYW1lcyB8fCAnJyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY3FNb2RlbFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVDcU1vZGVsKCkge1xuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAvLyBGZXRjaGluZyB0aGUgbGF0ZXN0IGRhdGEgZm9yIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBwYXRoXG4gICAgdGhpcy5nZXRDcU1vZGVsKCkudGhlbihtb2RlbCA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgbW9kZWxbQ29uc3RhbnRzLkRBVEFfUEFUSF9QUk9QXSA9IHRoaXMucGF0aDtcbiAgICAgICAgICB0aGlzLmNxTW9kZWwgPSBtb2RlbDtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudERhdGEoKTtcbiAgICAgICAgICB0aGlzLnNldHVwRWxlbWVudCgpO1xuICAgICAgICAgIGxldCBlZGl0Q29uZmlnID0gQ29tcG9uZW50TWFwcGluZy5nZXRFZGl0Q29uZmlnKENvbXBvbmVudE1hcHBpbmcuZ2V0KHRoaXMudHlwZSkpO1xuICAgICAgICAgIGlmIChlZGl0Q29uZmlnKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwUGxhY2Vob2xkZXIoZWRpdENvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBDcSBNb2RlbFxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDcU1vZGVsKCkge1xuICAgICAgcmV0dXJuIFBhZ2VNb2RlbE1hbmFnZXIuZ2V0RGF0YSh7cGFnZVBhdGg6IHRoaXMucGFnZVBhdGgsIGRhdGFQYXRoOiB0aGlzLnBhdGh9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgY29tcG9uZW50IGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBjb21wb25lbnQgZGVmaW5pdGlvblxuICAgKlxuICAgKiBAcGFyYW0gY29tcG9uZW50RGVmaW5pdGlvbiBUaGUgY29tcG9uZW50IGRlZmluaXRpb24gdG8gcmVuZGVyXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uOmFueSkge1xuICAgIGlmIChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgIHRoaXMuX2NvbXBvbmVudCA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSk7XG5cbiAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50RGF0YSgpO1xuICAgICAgdGhpcy5zZXR1cEVsZW1lbnQoKTtcbiAgICAgIGxldCBlZGl0Q29uZmlnID0gQ29tcG9uZW50TWFwcGluZy5nZXRFZGl0Q29uZmlnKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgaWYgKGVkaXRDb25maWcgJiYgVXRpbHMuaXNJbkVkaXRvcikge1xuICAgICAgICB0aGlzLnNldHVwUGxhY2Vob2xkZXIoZWRpdENvbmZpZyk7XG4gICAgICB9XG4gICAgICBQYWdlTW9kZWxNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKHtwYWdlUGF0aDogdGhpcy5wYWdlUGF0aCwgZGF0YVBhdGg6IHRoaXMucGF0aCwgY2FsbGJhY2s6IHRoaXMudXBkYXRlQ3FNb2RlbC5iaW5kKHRoaXMpIH0pO1xuICAgICAgUGFnZU1vZGVsTWFuYWdlci5hZGRMaXN0ZW5lcih7cGFnZVBhdGg6IHRoaXMucGFnZVBhdGgsIGRhdGFQYXRoOiB0aGlzLnBhdGgsIGNhbGxiYWNrOiB0aGlzLnVwZGF0ZUNxTW9kZWwuYmluZCh0aGlzKSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZGF0YSBvZiB0aGUgY29tcG9uZW50IGJhc2VkIHRoZSBkYXRhIG9mIHRoZSBkaXJlY3RpdmVcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29tcG9uZW50RGF0YSgpIHtcbiAgICB0aGlzLl9jb21wb25lbnQuaW5zdGFuY2UuY3FNb2RlbCA9IHRoaXMuY3FNb2RlbDtcbiAgICB0aGlzLl9jb21wb25lbnQuaW5zdGFuY2UucGF0aCA9IHRoaXMucGF0aDtcbiAgICB0aGlzLl9jb21wb25lbnQuaW5zdGFuY2UucGFnZVBhdGggPSB0aGlzLnBhZ2VQYXRoO1xuICAgIHRoaXMuX2NvbXBvbmVudC5pbnN0YW5jZS5tb2RlbE5hbWUgPSB0aGlzLm1vZGVsTmFtZTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwcyB0aGUgRE9NIGVsZW1lbnQsIHNldHRpbmcgdGhlIGNsYXNzZXMgYW5kIGF0dHJpYnV0ZXMgbmVlZGVkIGZvciB0aGUgQUVNIGVkaXRvci5cbiAgICovXG4gIHByaXZhdGUgc2V0dXBFbGVtZW50KCkgIHtcbiAgICBpZiAodGhpcy5fb2xkQ2xhc3Nlcykge1xuICAgICAgbGV0IG9sZENsYXNzZXMgPSB0aGlzLl9vbGRDbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgICBvbGRDbGFzc2VzLmZvckVhY2goKGNvbHVtbkNsYXNzKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIGNvbHVtbkNsYXNzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX29sZENsYXNzZXMgPSB0aGlzLmNvbHVtbkNsYXNzZXM7XG4gICAgLy8gTWFudWFsbHkgYWRkIHRoZSBjbGFzc2VzXG4gICAgaWYgKHRoaXMuY29sdW1uQ2xhc3Nlcykge1xuICAgICAgbGV0IGNsYXNzZXMgPSB0aGlzLmNvbHVtbkNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICAgIGNsYXNzZXMuZm9yRWFjaCgoY29sdW1uQ2xhc3MpID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgY29sdW1uQ2xhc3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGF0aCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIFwiZGF0YS1jcS1kYXRhLXBhdGhcIiAsdGhpcy5wYXRoKTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cHMgdGhlIHBsYWNlaG9sZGVyIG9mIG5lZWRlZCBmb3IgdGhlIEFFTSBlZGl0b3JcbiAgICpcbiAgICogQHBhcmFtIGVkaXRDb25maWcgLSB0aGUgZWRpdENvbmZpZywgd2hpY2ggd2lsbCBkaWN0YXRlIHRoZSBjbGFzc2VzIHRvIGJlIGFkZGVkIG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFBsYWNlaG9sZGVyKGVkaXRDb25maWcpIHtcbiAgICAvLyBSZW1vdmUgcHJldmlvdXMgZHJhZyBhbmQgZHJvcCBjbGFzcyBuYW1lc1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIERSQUdfRFJPUF9DTEFTU19OQU1FICsgZWRpdENvbmZpZy5kcmFnRHJvcE5hbWUpO1xuXG4gICAgaWYgKGVkaXRDb25maWcuZHJhZ0Ryb3BOYW1lICYmIGVkaXRDb25maWcuZHJhZ0Ryb3BOYW1lLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIERSQUdfRFJPUF9DTEFTU19OQU1FICsgZWRpdENvbmZpZy5kcmFnRHJvcE5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZVBsYWNlaG9sZGVyKGVkaXRDb25maWcpKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIFBMQUNFSE9MREVSX0NMQVNTX05BTUUpO1xuICAgICAgICB0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudC5kYXRhc2V0LmVtcHR5dGV4dCA9IGVkaXRDb25maWcuZW1wdHlMYWJlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX2NvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LCBQTEFDRUhPTERFUl9DTEFTU19OQU1FKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2NvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmRhdGFzZXQuZW1wdHl0ZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBwbGFjZWhvbGRlciBzaG91bGQgZSBkaXNwbGF5ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlZGl0Q29uZmlnIC0gdGhlIGVkaXQgY29uZmlnIG9mIHRoZSBkaXJlY3RpdmVcbiAgICovXG4gIHByaXZhdGUgdXNlUGxhY2Vob2xkZXIoZWRpdENvbmZpZykge1xuICAgIHJldHVybiBlZGl0Q29uZmlnLmlzRW1wdHkgJiYgdHlwZW9mIGVkaXRDb25maWcuaXNFbXB0eSA9PT0gXCJmdW5jdGlvblwiICYmIGVkaXRDb25maWcuaXNFbXB0eSh0aGlzLmNxTW9kZWwpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgUGFnZU1vZGVsTWFuYWdlci5yZW1vdmVMaXN0ZW5lcih7cGFnZVBhdGg6IHRoaXMucGFnZVBhdGgsIGRhdGFQYXRoOiB0aGlzLnBhdGgsIGNhbGxiYWNrOiB0aGlzLnVwZGF0ZUNxTW9kZWwuYmluZCh0aGlzKSB9KTtcbiAgICB0aGlzLl9jb21wb25lbnQgJiYgdGhpcy5fY29tcG9uZW50LmRlc3Ryb3koKTtcbiAgfVxuXG59XG4iXX0=