UNPKG

@adobe/cq-angular-editable-components

Version:

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

288 lines (287 loc) 26.3 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"; var /** @type {?} */ PLACEHOLDER_CLASS_NAME = 'cq-placeholder'; var /** @type {?} */ DRAG_DROP_REGEX = /cq-dd-([^ ])+/g; var /** @type {?} */ DRAG_DROP_CLASS_NAME = 'cq-dd-'; var AEMComponentDirective = /** @class */ (function () { function AEMComponentDirective(renderer, viewContainer, factoryResolver, ngZone) { this.renderer = renderer; this.viewContainer = viewContainer; this.factoryResolver = factoryResolver; this.ngZone = ngZone; } /** * @return {?} */ AEMComponentDirective.prototype.ngOnInit = /** * @return {?} */ function () { this.renderComponent(ComponentMapping.get(this.type)); }; Object.defineProperty(AEMComponentDirective.prototype, "type", { /** * Returns the type of the cqModel if exists. */ get: /** * Returns the type of the cqModel if exists. * @return {?} */ function () { return this.cqModel && this.cqModel[":type"]; }, enumerable: true, configurable: true }); Object.defineProperty(AEMComponentDirective.prototype, "columnClasses", { /** * Returns the column classes of the cqModel */ get: /** * Returns the column classes of the cqModel * @return {?} */ function () { return this.cqModel && (this.cqModel.columnClassNames || ''); }, enumerable: true, configurable: true }); /** * Updates the cqModel * @return {?} */ AEMComponentDirective.prototype.updateCqModel = /** * Updates the cqModel * @return {?} */ function () { var _this = this; var /** @type {?} */ self = this; // Fetching the latest data for the item at the given path this.getCqModel().then(function (model) { _this.ngZone.run(function () { model[Constants.DATA_PATH_PROP] = _this.path; _this.cqModel = model; _this.updateComponentData(); _this.setupElement(); var /** @type {?} */ editConfig = ComponentMapping.getEditConfig(ComponentMapping.get(_this.type)); if (editConfig) { _this.setupPlaceholder(editConfig); } }); }); }; /** * Returns the Cq Model * * @return {?} */ AEMComponentDirective.prototype.getCqModel = /** * Returns the Cq Model * * @return {?} */ function () { 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 {?} */ AEMComponentDirective.prototype.renderComponent = /** * Renders a component dynamically based on the component definition * * @param {?} componentDefinition The component definition to render * @return {?} */ function (componentDefinition) { if (componentDefinition) { var /** @type {?} */ factory = this.factoryResolver.resolveComponentFactory(componentDefinition); this.viewContainer.clear(); this._component = this.viewContainer.createComponent(factory); this.updateComponentData(); this.setupElement(); var /** @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 {?} */ AEMComponentDirective.prototype.updateComponentData = /** * Updates the data of the component based the data of the directive * @return {?} */ function () { 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 {?} */ AEMComponentDirective.prototype.setupElement = /** * Setups the DOM element, setting the classes and attributes needed for the AEM editor. * @return {?} */ function () { var _this = this; if (this._oldClasses) { var /** @type {?} */ oldClasses = this._oldClasses.split(' '); oldClasses.forEach(function (columnClass) { _this.renderer.removeClass(_this._component.location.nativeElement, columnClass); }); } this._oldClasses = this.columnClasses; // Manually add the classes if (this.columnClasses) { var /** @type {?} */ classes = this.columnClasses.split(' '); classes.forEach(function (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 {?} */ AEMComponentDirective.prototype.setupPlaceholder = /** * Setups the placeholder of needed for the AEM editor * * @param {?} editConfig - the editConfig, which will dictate the classes to be added on. * @return {?} */ function (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 {?} */ AEMComponentDirective.prototype.usePlaceholder = /** * Determines if the placeholder should e displayed. * * @param {?} editConfig - the edit config of the directive * @return {?} */ function (editConfig) { return editConfig.isEmpty && typeof editConfig.isEmpty === "function" && editConfig.isEmpty(this.cqModel); }; /** * @return {?} */ AEMComponentDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { 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 = function () { return [ { 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 },], }; return AEMComponentDirective; }()); export { AEMComponentDirective }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWVtLWNvbXBvbmVudC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYWRvYmUvY3EtYW5ndWxhci1lZGl0YWJsZS1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsibGliL2xheW91dC9hZW0tY29tcG9uZW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBd0IsU0FBUyxFQUFFLE1BQU0sRUFBcUIsZ0JBQWdCLEVBQUUsd0JBQXdCLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBRXZMLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUdoQyxxQkFBTSxzQkFBc0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNoRCxxQkFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7QUFDekMscUJBQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDOztJQWdCcEMsK0JBQ1UsVUFDQSxlQUNBLGlCQUNBO1FBSEEsYUFBUSxHQUFSLFFBQVE7UUFDUixrQkFBYSxHQUFiLGFBQWE7UUFDYixvQkFBZSxHQUFmLGVBQWU7UUFDZixXQUFNLEdBQU4sTUFBTTtLQUNmOzs7O0lBRUQsd0NBQVE7OztJQUFSO1FBQ0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDdkQ7SUFLRCxzQkFBSSx1Q0FBSTtRQUhSOztXQUVHOzs7OztRQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMs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QUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Ozs7O0lBRzVHLDJDQUFXOzs7SUFBWDtRQUNFLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUgsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQzlDOztnQkFoS0YsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCOzs7O2dCQWhCZ0QsU0FBUztnQkFBNkIsZ0JBQWdCO2dCQUFFLHdCQUF3QjtnQkFBckUsTUFBTTs7OzRCQXNCL0QsS0FBSzt5QkFDTCxLQUFLOzZCQUNMLEtBQUs7OEJBQ0wsS0FBSztpQ0FDTCxLQUFLOztnQ0EzQ1I7O1NBbUNhLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBBRE9CRSBDT05GSURFTlRJQUxcbiAqXG4gKiBDb3B5cmlnaHQgMjAxOCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFxuICogQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBOT1RJQ0U6ICBBbGwgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcywgYW5kIHJlbWFpbnNcbiAqIHRoZSBwcm9wZXJ0eSBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBhbmQgaXRzIHN1cHBsaWVycyxcbiAqIGlmIGFueS4gIFRoZSBpbnRlbGxlY3R1YWwgYW5kIHRlY2huaWNhbCBjb25jZXB0cyBjb250YWluZWRcbiAqIGhlcmVpbiBhcmUgcHJvcHJpZXRhcnkgdG8gQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgYW5kIGl0c1xuICogc3VwcGxpZXJzIGFuZCBtYXkgYmUgY292ZXJlZCBieSBVLlMuIGFuZCBGb3JlaWduIFBhdGVudHMsXG4gKiBwYXRlbnRzIGluIHByb2Nlc3MsIGFuZCBhcmUgcHJvdGVjdGVkIGJ5IHRyYWRlIHNlY3JldCBvciBjb3B5cmlnaHQgbGF3LlxuICogRGlzc2VtaW5hdGlvbiBvZiB0aGlzIGluZm9ybWF0aW9uIG9yIHJlcHJvZHVjdGlvbiBvZiB0aGlzIG1hdGVyaWFsXG4gKiBpcyBzdHJpY3RseSBmb3JiaWRkZW4gdW5sZXNzIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBvYnRhaW5lZFxuICogZnJvbSBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC5cbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgUmVuZGVyZXIyLCBOZ1pvbmUsIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEFwcGxpY2F0aW9uUmVmLCBDb21wb25lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29tcG9uZW50TWFwcGluZyB9IGZyb20gXCIuL2NvbXBvbmVudC1tYXBwaW5nXCI7XG5cbmltcG9ydCB7IFBhZ2VNb2RlbE1hbmFnZXIgfSBmcm9tICdAYWRvYmUvY3Etc3BhLXBhZ2UtbW9kZWwtbWFuYWdlcic7XG5cbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5cbmNvbnN0IFBMQUNFSE9MREVSX0NMQVNTX05BTUUgPSAnY3EtcGxhY2Vob2xkZXInO1xuY29uc3QgRFJBR19EUk9QX1JFR0VYID0gL2NxLWRkLShbXiBdKSsvZztcbmNvbnN0IERSQUdfRFJPUF9DTEFTU19OQU1FID0gJ2NxLWRkLSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thZW1Db21wb25lbnRdJ1xufSlcblxuZXhwb3J0IGNsYXNzIEFFTUNvbXBvbmVudERpcmVjdGl2ZSB7XG4gIHByaXZhdGUgX2NvbXBvbmVudDpDb21wb25lbnRSZWY8YW55PjtcbiAgcHJpdmF0ZSBfb2xkQ2xhc3NlczpzdHJpbmc7XG5cbiAgQElucHV0KCkgY3FNb2RlbDphbnk7XG4gIEBJbnB1dCgpIHBhdGg6c3RyaW5nO1xuICBASW5wdXQoKSBwYWdlUGF0aDpzdHJpbmc7XG4gIEBJbnB1dCgpIG1vZGVsTmFtZTpzdHJpbmc7XG4gIEBJbnB1dCgpIGFlbUNvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgZmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5yZW5kZXJDb21wb25lbnQoQ29tcG9uZW50TWFwcGluZy5nZXQodGhpcy50eXBlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgY3FNb2RlbCBpZiBleGlzdHMuXG4gICAqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jcU1vZGVsICYmIHRoaXMuY3FNb2RlbFtcIjp0eXBlXCJdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbHVtbiBjbGFzc2VzIG9mIHRoZSBjcU1vZGVsXG4gICAqL1xuICBnZXQgY29sdW1uQ2xhc3NlcygpIHtcbiAgICByZXR1cm4gdGhpcy5jcU1vZGVsICYmICh0aGlzLmNxTW9kZWwuY29sdW1uQ2xhc3NOYW1lcyB8fCAnJyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY3FNb2RlbFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVDcU1vZGVsKCkge1xuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAvLyBGZXRjaGluZyB0aGUgbGF0ZXN0IGRhdGEgZm9yIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBwYXRoXG4gICAgdGhpcy5nZXRDcU1vZGVsKCkudGhlbihtb2RlbCA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgbW9kZWxbQ29uc3RhbnRzLkRBVEFfUEFUSF9QUk9QXSA9IHRoaXMucGF0aDtcbiAgICAgICAgICB0aGlzLmNxTW9kZWwgPSBtb2RlbDtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudERhdGEoKTtcbiAgICAgICAgICB0aGlzLnNldHVwRWxlbWVudCgpO1xuICAgICAgICAgIGxldCBlZGl0Q29uZmlnID0gQ29tcG9uZW50TWFwcGluZy5nZXRFZGl0Q29uZmlnKENvbXBvbmVudE1hcHBpbmcuZ2V0KHRoaXMudHlwZSkpO1xuICAgICAgICAgIGlmIChlZGl0Q29uZmlnKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwUGxhY2Vob2xkZXIoZWRpdENvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBDcSBNb2RlbFxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDcU1vZGVsKCkge1xuICAgICAgcmV0dXJuIFBhZ2VNb2RlbE1hbmFnZXIuZ2V0RGF0YSh7cGFnZVBhdGg6IHRoaXMucGFnZVBhdGgsIGRhdGFQYXRoOiB0aGlzLnBhdGh9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgY29tcG9uZW50IGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBjb21wb25lbnQgZGVmaW5pdGlvblxuICAgKlxuICAgKiBAcGFyYW0gY29tcG9uZW50RGVmaW5pdGlvbiBUaGUgY29tcG9uZW50IGRlZmluaXRpb24gdG8gcmVuZGVyXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uOmFueSkge1xuICAgIGlmIChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgIHRoaXMuX2NvbXBvbmVudCA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSk7XG5cbiAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50RGF0YSgpO1xuICAgICAgdGhpcy5zZXR1cEVsZW1lbnQoKTtcbiAgICAgIGxldCBlZGl0Q29uZmlnID0gQ29tcG9uZW50TWFwcGluZy5nZXRFZGl0Q29uZmlnKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgaWYgKGVkaXRDb25maWcgJiYgVXRpbHMuaXNJbkVkaXRvcikge1xuICAgICAgICB0aGlzLnNldHVwUGxhY2Vob2xkZXIoZWRpdENvbmZpZyk7XG4gICAgICB9XG4gICAgICBQYWdlTW9kZWxNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKHtwYWdlUGF0aDogdGhpcy5wYWdlUGF0aCwgZGF0YVBhdGg6IHRoaXMucGF0aCwgY2FsbGJhY2s6IHRoaXMudXBkYXRlQ3FNb2RlbC5iaW5kKHRoaXMpIH0pO1xuICAgICAgUGFnZU1vZGVsTWFuYWdlci5hZGRMaXN0ZW5lcih7cGFnZVBhdGg6IHRoaXMucGFnZVBhdGgsIGRhdGFQYXRoOiB0aGlzLnBhdGgsIGNhbGxiYWNrOiB0aGlzLnVwZGF0ZUNxTW9kZWwuYmluZCh0aGlzKSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZGF0YSBvZiB0aGUgY29tcG9uZW50IGJhc2VkIHRoZSBkYXRhIG9mIHRoZSBkaXJlY3RpdmVcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29tcG9uZW50RGF0YSgpIHtcbiAgICB0aGlzLl9jb21wb25lbnQuaW5zdGFuY2UuY3FNb2RlbCA9IHRoaXMuY3FNb2RlbDtcbiAgICB0aGlzLl9jb21wb25lbnQuaW5zdGFuY2UucGF0aCA9IHRoaXMucGF0aDtcbiAgICB0aGlzLl9jb21wb25lbnQuaW5zdGFuY2UucGFnZVBhdGggPSB0aGlzLnBhZ2VQYXRoO1xuICAgIHRoaXMuX2NvbXBvbmVudC5pbnN0YW5jZS5tb2RlbE5hbWUgPSB0aGlzLm1vZGVsTmFtZTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwcyB0aGUgRE9NIGVsZW1lbnQsIHNldHRpbmcgdGhlIGNsYXNzZXMgYW5kIGF0dHJpYnV0ZXMgbmVlZGVkIGZvciB0aGUgQUVNIGVkaXRvci5cbiAgICovXG4gIHByaXZhdGUgc2V0dXBFbGVtZW50KCkgIHtcbiAgICBpZiAodGhpcy5fb2xkQ2xhc3Nlcykge1xuICAgICAgbGV0IG9sZENsYXNzZXMgPSB0aGlzLl9vbGRDbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgICBvbGRDbGFzc2VzLmZvckVhY2goKGNvbHVtbkNsYXNzKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIGNvbHVtbkNsYXNzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX29sZENsYXNzZXMgPSB0aGlzLmNvbHVtbkNsYXNzZXM7XG4gICAgLy8gTWFudWFsbHkgYWRkIHRoZSBjbGFzc2VzXG4gICAgaWYgKHRoaXMuY29sdW1uQ2xhc3Nlcykge1xuICAgICAgbGV0IGNsYXNzZXMgPSB0aGlzLmNvbHVtbkNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICAgIGNsYXNzZXMuZm9yRWFjaCgoY29sdW1uQ2xhc3MpID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgY29sdW1uQ2xhc3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGF0aCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIFwiZGF0YS1jcS1kYXRhLXBhdGhcIiAsdGhpcy5wYXRoKTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cHMgdGhlIHBsYWNlaG9sZGVyIG9mIG5lZWRlZCBmb3IgdGhlIEFFTSBlZGl0b3JcbiAgICpcbiAgICogQHBhcmFtIGVkaXRDb25maWcgLSB0aGUgZWRpdENvbmZpZywgd2hpY2ggd2lsbCBkaWN0YXRlIHRoZSBjbGFzc2VzIHRvIGJlIGFkZGVkIG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFBsYWNlaG9sZGVyKGVkaXRDb25maWcpIHtcbiAgICAvLyBSZW1vdmUgcHJldmlvdXMgZHJhZyBhbmQgZHJvcCBjbGFzcyBuYW1lc1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIERSQUdfRFJPUF9DTEFTU19OQU1FICsgZWRpdENvbmZpZy5kcmFnRHJvcE5hbWUpO1xuXG4gICAgaWYgKGVkaXRDb25maWcuZHJhZ0Ryb3BOYW1lICYmIGVkaXRDb25maWcuZHJhZ0Ryb3BOYW1lLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIERSQUdfRFJPUF9DTEFTU19OQU1FICsgZWRpdENvbmZpZy5kcmFnRHJvcE5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZVBsYWNlaG9sZGVyKGVkaXRDb25maWcpKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIFBMQUNFSE9MREVSX0NMQVNTX05BTUUpO1xuICAgICAgICB0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudC5kYXRhc2V0LmVtcHR5dGV4dCA9IGVkaXRDb25maWcuZW1wdHlMYWJlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX2NvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LCBQTEFDRUhPTERFUl9DTEFTU19OQU1FKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2NvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmRhdGFzZXQuZW1wdHl0ZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBwbGFjZWhvbGRlciBzaG91bGQgZSBkaXNwbGF5ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlZGl0Q29uZmlnIC0gdGhlIGVkaXQgY29uZmlnIG9mIHRoZSBkaXJlY3RpdmVcbiAgICovXG4gIHByaXZhdGUgdXNlUGxhY2Vob2xkZXIoZWRpdENvbmZpZykge1xuICAgIHJldHVybiBlZGl0Q29uZmlnLmlzRW1wdHkgJiYgdHlwZW9mIGVkaXRDb25maWcuaXNFbXB0eSA9PT0gXCJmdW5jdGlvblwiICYmIGVkaXRDb25maWcuaXNFbXB0eSh0aGlzLmNxTW9kZWwpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgUGFnZU1vZGVsTWFuYWdlci5yZW1vdmVMaXN0ZW5lcih7cGFnZVBhdGg6IHRoaXMucGFnZVBhdGgsIGRhdGFQYXRoOiB0aGlzLnBhdGgsIGNhbGxiYWNrOiB0aGlzLnVwZGF0ZUNxTW9kZWwuYmluZCh0aGlzKSB9KTtcbiAgICB0aGlzLl9jb21wb25lbnQgJiYgdGhpcy5fY29tcG9uZW50LmRlc3Ryb3koKTtcbiAgfVxuXG59XG4iXX0=