UNPKG

@kephas/ngx-core

Version:

Provides integration capabilities with Angular 13+.

188 lines 19.2 kB
import { ElementRef, ViewContainerRef, ChangeDetectorRef, Input, forwardRef, QueryList, ViewChildren, Component } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Logger } from '@kephas/core'; import { NotificationService } from '@kephas/ui'; import * as i0 from "@angular/core"; /** * Provides base functionality for a widget. * * @export * @class WidgetBase */ export class WidgetBase { /** * Creates an instance of WidgetBase. * @param {ElementRef} elementRef The element reference. * @param {ViewContainerRef} viewContainerRef The view container reference. * @memberof WidgetBase */ constructor(elementRef, viewContainerRef) { this.elementRef = elementRef; this.viewContainerRef = viewContainerRef; this._isVisible = true; this._readonly = false; const injector = viewContainerRef.injector; this.logger = injector.get(Logger); this.notification = injector.get(NotificationService); this.changeDetector = injector.get(ChangeDetectorRef); } /** * Gets or sets the child editors query. * * @readonly * @type {QueryList<EditorBase<any>>} * @memberof EditorBase */ get childWidgets() { return this._childWidgets; } set childWidgets(value) { if (this._childWidgets === value) { return; } const oldValue = this._childWidgets; this._childWidgets = value; this.onChildWidgetsChanged(oldValue, value); } /** * Gets or sets a value indicating whether the widget is visible. * * @readonly * @type {boolean} * @memberof WidgetBase */ get isVisible() { return this._isVisible; } set isVisible(value) { if (this._isVisible === value) { return; } this._isVisible = value; } /** * Gets or sets a value indicating whether the editor allows edits or not. * * @readonly * @type {boolean} * @memberof EditorBase */ get readonly() { return this._readonly; } set readonly(value) { if (this._readonly === value) { return; } const oldValue = this._readonly; this._readonly = value; this.onReadOnlyChanged(oldValue, value); } /** * A callback method that is invoked immediately after the * default change detector has checked the directive's * data-bound properties for the first time, * and before any of the view or content children have been checked. * It is invoked only once when the directive is instantiated. * * @memberof WidgetBase */ ngOnInit() { } /** * A callback method that is invoked immediately after * Angular has completed initialization of a component's view. * It is invoked only once when the view is instantiated. * * @memberof WidgetBase */ ngAfterViewInit() { } /** * A callback method that is invoked immediately after the * default change detector has checked data-bound properties * if at least one has changed, and before the view and content * children are checked. * * @param changes The changed properties. * @memberof WidgetBase */ ngOnChanges(changes) { } /** * A callback method that performs custom clean-up, invoked immediately * after a directive, pipe, or service instance is destroyed. */ ngOnDestroy() { } /** * When overridden in a derived class, this method is called when the read only state changes. * * @protected * @param {boolean} oldValue The old value. * @param {boolean} newValue The new value. * * @memberof WidgetBase */ onReadOnlyChanged(oldValue, newValue) { } /** * When overridden in a derived class, this method is called when the child widgets query changed. * * @protected * @param {QueryList<EditorBase<any>>} oldValue The old query. * @param {QueryList<EditorBase<any>>} newValue The new query. * * @memberof EditorBase */ onChildWidgetsChanged(oldValue, newValue) { } } WidgetBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WidgetBase, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); WidgetBase.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: WidgetBase, selector: "ng-component", inputs: { isVisible: "isVisible", readonly: "readonly" }, viewQueries: [{ propertyName: "childWidgets", predicate: WidgetBase, descendants: true }], usesOnChanges: true, ngImport: i0, template: '', isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WidgetBase, decorators: [{ type: Component, args: [{ template: '' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ViewContainerRef }]; }, propDecorators: { childWidgets: [{ type: ViewChildren, args: [WidgetBase] }], isVisible: [{ type: Input }], readonly: [{ type: Input }] } }); /** * This function provides the component as a WidgetBase, * to be able to import it over this base class instead of over its own class. * * For example, use it as @ViewChild(WidgetBase) or @ViewChildren(WidgetBase). * * @export * @param {Type<any>} componentType The component type. * @returns {Provider} The provider. */ export function provideWidget(componentType) { return { provide: WidgetBase, useExisting: forwardRef(() => componentType) }; } /** * This function provides the component as a NG_VALUE_ACCESSOR. * Thus, it is possible to bind it like this: * <my-component [(ngModel)]="boundProperty"></my-component> * * @export * @param {Type<any>} componentType The component type. * @returns {Provider} The provider. */ export function provideValueAccessor(componentType) { return { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => componentType), multi: true }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0QmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlcGhhcy9uZ3gtY29yZS9zcmMvbGliL2NvbXBvbmVudHMvd2lkZ2V0QmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUMvQyxLQUFLLEVBRVcsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQWEsU0FBUyxFQUM1RSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFFakQ7Ozs7O0dBS0c7QUFJSCxNQUFNLE9BQWdCLFVBQVU7SUFnQzVCOzs7OztPQUtHO0lBQ0gsWUFDb0IsVUFBc0IsRUFDdEIsZ0JBQWtDO1FBRGxDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQVo5QyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFhdEIsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFDSSxZQUFZO1FBQ1osT0FBTyxJQUFJLENBQUMsYUFBYyxDQUFDO0lBQy9CLENBQUM7SUFDRCxJQUFJLFlBQVksQ0FBQyxLQUE0QjtRQUN6QyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssS0FBSyxFQUFFO1lBQzlCLE9BQU87U0FDVjtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDcEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFDSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxLQUFjO1FBQ3hCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxLQUFLLEVBQUU7WUFDM0IsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQ0ksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsS0FBYztRQUN2QixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQzFCLE9BQU87U0FDVjtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxRQUFRO0lBQ1IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGVBQWU7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxXQUFXLENBQUMsT0FBc0I7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVc7SUFDWCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxpQkFBaUIsQ0FBQyxRQUFpQixFQUFFLFFBQWlCO0lBQ2hFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLHFCQUFxQixDQUFDLFFBQWdDLEVBQUUsUUFBZ0M7SUFDbEcsQ0FBQzs7dUdBNUtpQixVQUFVOzJGQUFWLFVBQVUsK0lBdURkLFVBQVUscUVBekRoQixFQUFFOzJGQUVRLFVBQVU7a0JBSC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7Z0lBeURPLFlBQVk7c0JBRGYsWUFBWTt1QkFBQyxVQUFVO2dCQXNCcEIsU0FBUztzQkFEWixLQUFLO2dCQW9CRixRQUFRO3NCQURYLEtBQUs7O0FBZ0ZWOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsYUFBd0I7SUFDbEQsT0FBTztRQUNILE9BQU8sRUFBRSxVQUFVO1FBQ25CLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO0tBQy9DLENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsYUFBd0I7SUFDekQsT0FBTztRQUNILE9BQU8sRUFBRSxpQkFBaUI7UUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDNUMsS0FBSyxFQUFFLElBQUk7S0FDZCxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBFbGVtZW50UmVmLCBWaWV3Q29udGFpbmVyUmVmLCBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIElucHV0LCBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsXHJcbiAgICBUeXBlLCBQcm92aWRlciwgZm9yd2FyZFJlZiwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4sIE9uRGVzdHJveSwgQ29tcG9uZW50XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAa2VwaGFzL2NvcmUnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnQGtlcGhhcy91aSc7XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgYmFzZSBmdW5jdGlvbmFsaXR5IGZvciBhIHdpZGdldC5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgV2lkZ2V0QmFzZVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGU6ICcnXHJcbn0pXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXaWRnZXRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGxvZ2dlci5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAdHlwZSB7TG9nZ2VyfVxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBub3RpZmljYXRpb24gc2VydmljZS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAdHlwZSB7Tm90aWZpY2F0aW9uU2VydmljZX1cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uU2VydmljZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGNoYW5nZSBkZXRlY3RvciBzZXJ2aWNlLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEB0eXBlIHtDaGFuZ2VEZXRlY3RvclJlZn1cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcclxuXHJcbiAgICBwcml2YXRlIF9pc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfcmVhZG9ubHkgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2NoaWxkV2lkZ2V0cz86IFF1ZXJ5TGlzdDxXaWRnZXRCYXNlPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgV2lkZ2V0QmFzZS5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudFJlZn0gZWxlbWVudFJlZiBUaGUgZWxlbWVudCByZWZlcmVuY2UuXHJcbiAgICAgKiBAcGFyYW0ge1ZpZXdDb250YWluZXJSZWZ9IHZpZXdDb250YWluZXJSZWYgVGhlIHZpZXcgY29udGFpbmVyIHJlZmVyZW5jZS5cclxuICAgICAqIEBtZW1iZXJvZiBXaWRnZXRCYXNlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSB2aWV3Q29udGFpbmVyUmVmLmluamVjdG9yO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyID0gaW5qZWN0b3IuZ2V0KExvZ2dlcik7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSBpbmplY3Rvci5nZXQoTm90aWZpY2F0aW9uU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvciA9IGluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIGNoaWxkIGVkaXRvcnMgcXVlcnkuXHJcbiAgICAgKlxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7UXVlcnlMaXN0PEVkaXRvckJhc2U8YW55Pj59XHJcbiAgICAgKiBAbWVtYmVyb2YgRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkcmVuKFdpZGdldEJhc2UpXHJcbiAgICBnZXQgY2hpbGRXaWRnZXRzKCk6IFF1ZXJ5TGlzdDxXaWRnZXRCYXNlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkV2lkZ2V0cyE7XHJcbiAgICB9XHJcbiAgICBzZXQgY2hpbGRXaWRnZXRzKHZhbHVlOiBRdWVyeUxpc3Q8V2lkZ2V0QmFzZT4pIHtcclxuICAgICAgICBpZiAodGhpcy5fY2hpbGRXaWRnZXRzID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX2NoaWxkV2lkZ2V0cztcclxuICAgICAgICB0aGlzLl9jaGlsZFdpZGdldHMgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLm9uQ2hpbGRXaWRnZXRzQ2hhbmdlZChvbGRWYWx1ZSwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB3aWRnZXQgaXMgdmlzaWJsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQG1lbWJlcm9mIFdpZGdldEJhc2VcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVmlzaWJsZTtcclxuICAgIH1cclxuICAgIHNldCBpc1Zpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5faXNWaXNpYmxlID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pc1Zpc2libGUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWRpdG9yIGFsbG93cyBlZGl0cyBvciBub3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBtZW1iZXJvZiBFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xyXG4gICAgfVxyXG4gICAgc2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JlYWRvbmx5ID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3JlYWRvbmx5O1xyXG4gICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5vblJlYWRPbmx5Q2hhbmdlZChvbGRWYWx1ZSwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBjYWxsYmFjayBtZXRob2QgdGhhdCBpcyBpbnZva2VkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxyXG4gICAgICogZGVmYXVsdCBjaGFuZ2UgZGV0ZWN0b3IgaGFzIGNoZWNrZWQgdGhlIGRpcmVjdGl2ZSdzXHJcbiAgICAgKiBkYXRhLWJvdW5kIHByb3BlcnRpZXMgZm9yIHRoZSBmaXJzdCB0aW1lLFxyXG4gICAgICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHZpZXcgb3IgY29udGVudCBjaGlsZHJlbiBoYXZlIGJlZW4gY2hlY2tlZC5cclxuICAgICAqIEl0IGlzIGludm9rZWQgb25seSBvbmNlIHdoZW4gdGhlIGRpcmVjdGl2ZSBpcyBpbnN0YW50aWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIFdpZGdldEJhc2VcclxuICAgICAqL1xyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhbGxiYWNrIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXJcclxuICAgICAqIEFuZ3VsYXIgaGFzIGNvbXBsZXRlZCBpbml0aWFsaXphdGlvbiBvZiBhIGNvbXBvbmVudCdzIHZpZXcuXHJcbiAgICAgKiBJdCBpcyBpbnZva2VkIG9ubHkgb25jZSB3aGVuIHRoZSB2aWV3IGlzIGluc3RhbnRpYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgV2lkZ2V0QmFzZVxyXG4gICAgICovXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhbGxiYWNrIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlXHJcbiAgICAgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY2hlY2tlZCBkYXRhLWJvdW5kIHByb3BlcnRpZXNcclxuICAgICAqIGlmIGF0IGxlYXN0IG9uZSBoYXMgY2hhbmdlZCwgYW5kIGJlZm9yZSB0aGUgdmlldyBhbmQgY29udGVudFxyXG4gICAgICogY2hpbGRyZW4gYXJlIGNoZWNrZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNoYW5nZXMgVGhlIGNoYW5nZWQgcHJvcGVydGllcy5cclxuICAgICAqIEBtZW1iZXJvZiBXaWRnZXRCYXNlXHJcbiAgICAgKi9cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgcGVyZm9ybXMgY3VzdG9tIGNsZWFuLXVwLCBpbnZva2VkIGltbWVkaWF0ZWx5XHJcbiAgICAgKiBhZnRlciBhIGRpcmVjdGl2ZSwgcGlwZSwgb3Igc2VydmljZSBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuXHJcbiAgICAgKi9cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBvdmVycmlkZGVuIGluIGEgZGVyaXZlZCBjbGFzcywgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHJlYWQgb25seSBzdGF0ZSBjaGFuZ2VzLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb2xkVmFsdWUgVGhlIG9sZCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgV2lkZ2V0QmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQob2xkVmFsdWU6IGJvb2xlYW4sIG5ld1ZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIG92ZXJyaWRkZW4gaW4gYSBkZXJpdmVkIGNsYXNzLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgY2hpbGQgd2lkZ2V0cyBxdWVyeSBjaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7UXVlcnlMaXN0PEVkaXRvckJhc2U8YW55Pj59IG9sZFZhbHVlIFRoZSBvbGQgcXVlcnkuXHJcbiAgICAgKiBAcGFyYW0ge1F1ZXJ5TGlzdDxFZGl0b3JCYXNlPGFueT4+fSBuZXdWYWx1ZSBUaGUgbmV3IHF1ZXJ5LlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBvbkNoaWxkV2lkZ2V0c0NoYW5nZWQob2xkVmFsdWU/OiBRdWVyeUxpc3Q8V2lkZ2V0QmFzZT4sIG5ld1ZhbHVlPzogUXVlcnlMaXN0PFdpZGdldEJhc2U+KTogdm9pZCB7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSBjb21wb25lbnQgYXMgYSBXaWRnZXRCYXNlLFxyXG4gKiB0byBiZSBhYmxlIHRvIGltcG9ydCBpdCBvdmVyIHRoaXMgYmFzZSBjbGFzcyBpbnN0ZWFkIG9mIG92ZXIgaXRzIG93biBjbGFzcy5cclxuICpcclxuICogRm9yIGV4YW1wbGUsIHVzZSBpdCBhcyBAVmlld0NoaWxkKFdpZGdldEJhc2UpIG9yIEBWaWV3Q2hpbGRyZW4oV2lkZ2V0QmFzZSkuXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICogQHBhcmFtIHtUeXBlPGFueT59IGNvbXBvbmVudFR5cGUgVGhlIGNvbXBvbmVudCB0eXBlLlxyXG4gKiBAcmV0dXJucyB7UHJvdmlkZXJ9IFRoZSBwcm92aWRlci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlV2lkZ2V0KGNvbXBvbmVudFR5cGU6IFR5cGU8YW55Pik6IFByb3ZpZGVyIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgcHJvdmlkZTogV2lkZ2V0QmFzZSxcclxuICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBjb21wb25lbnRUeXBlKVxyXG4gICAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIGNvbXBvbmVudCBhcyBhIE5HX1ZBTFVFX0FDQ0VTU09SLlxyXG4gKiBUaHVzLCBpdCBpcyBwb3NzaWJsZSB0byBiaW5kIGl0IGxpa2UgdGhpczpcclxuICogPG15LWNvbXBvbmVudCBbKG5nTW9kZWwpXT1cImJvdW5kUHJvcGVydHlcIj48L215LWNvbXBvbmVudD5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAcGFyYW0ge1R5cGU8YW55Pn0gY29tcG9uZW50VHlwZSBUaGUgY29tcG9uZW50IHR5cGUuXHJcbiAqIEByZXR1cm5zIHtQcm92aWRlcn0gVGhlIHByb3ZpZGVyLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVWYWx1ZUFjY2Vzc29yKGNvbXBvbmVudFR5cGU6IFR5cGU8YW55Pik6IFByb3ZpZGVyIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gY29tcG9uZW50VHlwZSksXHJcbiAgICAgICAgbXVsdGk6IHRydWVcclxuICAgIH07XHJcbn1cclxuIl19