UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

468 lines (467 loc) 37.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { AbstractDataEditor } from './AbstractDataEditor'; import { ViewModel } from '../model/ViewModel'; import { PhloxAppInfo } from '../../component/model/PhloxAppInfo'; import { Option } from '../../decorator/Option.decorator'; import { AbstractHasDataHelp } from '../../component/AbstractHasDataHelp'; import { EventUtils } from '../../share/utils/EventUtils'; import { BEFORE_VIEW_SHOW_EVENT, VIEW_SHOW_EVENT, BEFORE_VIEW_HIDE_EVENT, VIEW_HIDE_EVENT, BEFORE_VIEW_CHANGE_EVENT, VIEW_CHANGE_EVENT } from '../../share/CustomEventType'; /** * @abstract */ export class AbstractDataEditorView extends AbstractHasDataHelp { /** * @param {?} settingServiceFactory * @param {?} elementRef * @param {?=} kbShortcutService */ constructor(settingServiceFactory, elementRef, kbShortcutService) { super(elementRef, kbShortcutService); this.editorSettingServiceFactory = settingServiceFactory; this.showEvent = new EventEmitter(); this.hideEvent = new EventEmitter(); this.viewChangeEvent = new EventEmitter(); this.beforeShowEvent = new EventEmitter(); this.beforeHideEvent = new EventEmitter(); this.beforeViewChangeEvent = new EventEmitter(); this.active = false; this.viewSetting = null; } /** * @return {?} */ ngOnInit() { super.ngOnInit(); // create service this.initViewSettingService(); } /** * @return {?} */ getObjectIdField() { if (this.editor !== null && typeof this.editor !== 'undefined') { return this.editor.getObjectIdField(); } return PhloxAppInfo.DEFAULT_OBJECT_ID_FIELD_NAME; } /** * @return {?} */ initViewSettingService() { if (this.editorSettingServiceFactory !== null && typeof this.editorSettingServiceFactory !== 'undefined') { let /** @type {?} */ viewType = null; if (this.model !== null && typeof this.model !== 'undefined') { viewType = this.model.type; } let /** @type {?} */ settingProm = this.editorSettingServiceFactory.createViewSettingService(this.editor, viewType); if (settingProm != null) { settingProm.then((result) => { this.viewSettingService = result; this.reloadViewSetting(); }); } } } /** * @param {?=} $event * @return {?} */ emitBeforeHideEvent($event) { if (this.beforeHideEvent !== null) { let /** @type {?} */ data = {}; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_HIDE_EVENT, this, data, $event); this.beforeHideEvent.emit(ev); } } /** * @param {?=} $event * @return {?} */ emitHideEvent($event) { // emit event if (this.hideEvent !== null) { let /** @type {?} */ data = {}; let /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_HIDE_EVENT, this, data, $event); this.hideEvent.emit(ev); } } /** * @param {?=} $event * @return {?} */ emitBeforeShowEvent($event) { if (this.beforeShowEvent !== null) { let /** @type {?} */ data = {}; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_SHOW_EVENT, this, data, $event); this.beforeShowEvent.emit(ev); } } /** * @param {?=} $event * @return {?} */ emitShowEvent($event) { // emit event if (this.showEvent !== null) { let /** @type {?} */ data = {}; let /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_SHOW_EVENT, this, data, $event); this.showEvent.emit(ev); } } /** * @param {?} action * @param {?} data * @param {?=} $event * @return {?} */ emitBeforeViewChangeEvent(action, data, $event) { if (this.beforeViewChangeEvent !== null) { let /** @type {?} */ passingData = { action: action, data: data }; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_CHANGE_EVENT, this, passingData, $event); this.beforeViewChangeEvent.emit(ev); } } /** * @param {?} action * @param {?} data * @param {?=} $event * @return {?} */ emitViewChangeEvent(action, data, $event) { // emit event if (this.viewChangeEvent !== null) { let /** @type {?} */ passingData = { action: action, data: data }; let /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_CHANGE_EVENT, this, passingData, $event); this.viewChangeEvent.emit(ev); } } /** * @return {?} */ reloadViewSetting() { if (this.viewSettingService !== null && typeof this.viewSettingService !== 'undefined') { return new Promise((resolve, reject) => { this.viewSettingService.loadSettings().then((result) => { this.viewSetting = result; this.onViewSettingLoaded(result); resolve(result); }, (err) => { reject(err); }).catch((error) => { return Promise.reject(error); }); }); } return Promise.resolve(null); } /** * @return {?} */ getViewSetting() { return this.viewSetting; } /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ _doHide($event, fireEvent) { if (!this.active) { return false; } if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeHideEvent', $event, fireEvent, ($event) => { // doEvent this.active = false; }, ($event) => { // emitBeforeEvent this.emitBeforeHideEvent($event); }, ($event, result) => { // emitAfterEvent this.emitHideEvent($event); }, ($event) => { // doPrevented }); return true; } /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ _doShow($event, fireEvent) { if (this.active) { return false; } if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeShowEvent', $event, fireEvent, ($event) => { // doEvent this.active = true; }, ($event) => { // emitBeforeEvent this.emitBeforeShowEvent($event); }, ($event, result) => { // emitAfterEvent this.emitShowEvent($event); }, ($event) => { // doPrevented }); return true; } /** * @return {?} */ show() { return this.editor.showView(this.model); } /** * @param {?} editor * @return {?} */ setEditor(editor) { this.editor = editor; } /** * @return {?} */ getEditor() { return this.editor; } /** * @param {?} model * @return {?} */ setModel(model) { this.model = model; } /** * @return {?} */ getModel() { return this.model; } /** * @return {?} */ isActive() { return this.active; } /** * @return {?} */ getBeforeShowEvent() { return this.beforeShowEvent; } /** * @return {?} */ getShowEvent() { return this.showEvent; } /** * @return {?} */ getBeforeHideEvent() { return this.beforeHideEvent; } /** * @return {?} */ getHideEvent() { return this.hideEvent; } /** * @param {?} event * @return {?} */ setBeforeShowEvent(event) { this.beforeShowEvent = event; } /** * @param {?} event * @return {?} */ setShowEvent(event) { this.showEvent = event; } /** * @param {?} event * @return {?} */ setBeforeHideEvent(event) { this.beforeHideEvent = event; } /** * @param {?} event * @return {?} */ setHideEvent(event) { this.hideEvent = event; } /** * @return {?} */ getBeforeViewChangeEvent() { return this.beforeViewChangeEvent; } /** * @return {?} */ getViewChangeEvent() { return this.viewChangeEvent; } /** * @param {?} event * @return {?} */ setBeforeViewChangeEvent(event) { this.beforeViewChangeEvent = event; } /** * @param {?} event * @return {?} */ setViewChangeEvent(event) { this.viewChangeEvent = event; } /** * @return {?} */ isEditorDataDirty() { return new Promise((resolve, reject) => { let /** @type {?} */ dirtyDataProm = this.getEditorDirtyData(); if (dirtyDataProm !== null && typeof dirtyDataProm !== 'undefined') { dirtyDataProm.then((result) => { if (result !== null && typeof result !== 'undefined') { if (Array.isArray(result)) { if (result.length > 0) { resolve(true); } else { resolve(false); } } else { resolve(true); } } else { resolve(false); } }); } else { resolve(false); } }); } } tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", AbstractDataEditor) ], AbstractDataEditorView.prototype, "editor", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", ViewModel) ], AbstractDataEditorView.prototype, "model", void 0); tslib_1.__decorate([ Option('show'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDataEditorView.prototype, "showEvent", void 0); tslib_1.__decorate([ Option('hide'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDataEditorView.prototype, "hideEvent", void 0); tslib_1.__decorate([ Option('change'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDataEditorView.prototype, "viewChangeEvent", void 0); tslib_1.__decorate([ Option('beforeShow'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDataEditorView.prototype, "beforeShowEvent", void 0); tslib_1.__decorate([ Option('beforeHide'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDataEditorView.prototype, "beforeHideEvent", void 0); tslib_1.__decorate([ Option('beforeViewChange'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDataEditorView.prototype, "beforeViewChangeEvent", void 0); function AbstractDataEditorView_tsickle_Closure_declarations() { /** @type {?} */ AbstractDataEditorView.prototype.editor; /** @type {?} */ AbstractDataEditorView.prototype.model; /** @type {?} */ AbstractDataEditorView.prototype.showEvent; /** @type {?} */ AbstractDataEditorView.prototype.hideEvent; /** @type {?} */ AbstractDataEditorView.prototype.viewChangeEvent; /** @type {?} */ AbstractDataEditorView.prototype.beforeShowEvent; /** @type {?} */ AbstractDataEditorView.prototype.beforeHideEvent; /** @type {?} */ AbstractDataEditorView.prototype.beforeViewChangeEvent; /** @type {?} */ AbstractDataEditorView.prototype.editorSettingServiceFactory; /** @type {?} */ AbstractDataEditorView.prototype.viewSettingService; /** @type {?} */ AbstractDataEditorView.prototype.viewSetting; /** @type {?} */ AbstractDataEditorView.prototype.data; /** @type {?} */ AbstractDataEditorView.prototype.active; /** * @abstract * @param {?} settings * @return {?} */ AbstractDataEditorView.prototype.onViewSettingLoaded = function (settings) { }; /** * @abstract * @return {?} */ AbstractDataEditorView.prototype.getEditorDirtyData = function () { }; /** * @abstract * @return {?} */ AbstractDataEditorView.prototype.getSelectedData = function () { }; /** * @abstract * @return {?} */ AbstractDataEditorView.prototype.getCurrentHistoryState = function () { }; /** * @abstract * @param {?} history * @param {?} state * @return {?} */ AbstractDataEditorView.prototype.loadHistoryState = function (history, state) { }; /** * @abstract * @return {?} */ AbstractDataEditorView.prototype.reloadView = function () { }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3REYXRhRWRpdG9yVmlldy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9lZGl0b3IvQWJzdHJhY3REYXRhRWRpdG9yVmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBaUIsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXhFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFJbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUkxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUN0RSxlQUFlLEVBQUUsd0JBQXdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7OztBQUVwRyxNQUFNLDZCQUF1QyxTQUFRLG1CQUFtQjs7Ozs7O0lBd0J0RSxZQUFZLHFCQUFtRCxFQUFFLFVBQXNCLEVBQUUsaUJBQTJDO1FBQ2xJLEtBQUssQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcscUJBQXFCLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLGVBQWUsR0FB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QyxJQUFJLENBQUMsQ0FBQzt5QkFDZjtxQkFDRjtvQkFBQyxJQUFJLENBQUMsQ0FBQzt3QkFDTixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ2hCO2lCQUNGLENBQUMsQ0FBQzthQUNKO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2hCO1NBQ0YsQ0FBQyxDQUFDOztDQWNOOztJQXZURSxNQUFNLEVBQUU7c0NBQ1Msa0JBQWtCOzs7SUFDbkMsTUFBTSxFQUFFO3NDQUNRLFNBQVM7OztJQUN6QixNQUFNLENBQUMsTUFBTSxDQUFDO3NDQUNNLFlBQVk7OztJQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDO3NDQUNNLFlBQVk7OztJQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDO3NDQUNVLFlBQVk7OztJQUN0QyxNQUFNLENBQUMsWUFBWSxDQUFDO3NDQUNNLFlBQVk7OztJQUN0QyxNQUFNLENBQUMsWUFBWSxDQUFDO3NDQUNNLFlBQVk7OztJQUN0QyxNQUFNLENBQUMsa0JBQWtCLENBQUM7c0NBQ00sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdERhdGFFZGl0b3IgfSBmcm9tICcuL0Fic3RyYWN0RGF0YUVkaXRvcic7XG5pbXBvcnQgeyBWaWV3TW9kZWwgfSBmcm9tICcuLi9tb2RlbC9WaWV3TW9kZWwnO1xuaW1wb3J0IHsgUGhsb3hBcHBJbmZvIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50L21vZGVsL1BobG94QXBwSW5mbyc7XG5pbXBvcnQgeyBJSGFzTW9kZWwgfSBmcm9tICcuLi8uLi9jb21wb25lbnQvSUhhc01vZGVsJztcbmltcG9ydCB7IElFZGl0b3JTZXR0aW5nU2VydmljZUZhY3RvcnkgfSBmcm9tICcuL0lFZGl0b3JTZXR0aW5nU2VydmljZUZhY3RvcnknO1xuaW1wb3J0IHsgSUVkaXRvclNldHRpbmdTZXJ2aWNlIH0gZnJvbSAnLi9JRWRpdG9yU2V0dGluZ1NlcnZpY2UnO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XG5pbXBvcnQgeyBBYnN0cmFjdEhhc0RhdGFIZWxwIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50L0Fic3RyYWN0SGFzRGF0YUhlbHAnO1xuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xuaW1wb3J0IHsgSUhpc3RvcnlNYW5hZ2VkIH0gZnJvbSBcIi4uL0lIaXN0b3J5TWFuYWdlZFwiO1xuaW1wb3J0IHsgVUlIaXN0b3J5IH0gZnJvbSBcIi4uL21vZGVsL1VJSGlzdG9yeVwiO1xuaW1wb3J0IHsgS2V5Ym9hcmRTaG9ydGN1dFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZS9LZXlib2FyZFNob3J0Y3V0U2VydmljZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBCRUZPUkVfVklFV19TSE9XX0VWRU5ULCBWSUVXX1NIT1dfRVZFTlQsIEJFRk9SRV9WSUVXX0hJREVfRVZFTlQsXG4gIFZJRVdfSElERV9FVkVOVCwgQkVGT1JFX1ZJRVdfQ0hBTkdFX0VWRU5ULCBWSUVXX0NIQU5HRV9FVkVOVCB9IGZyb20gJy4uLy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERhdGFFZGl0b3JWaWV3IGV4dGVuZHMgQWJzdHJhY3RIYXNEYXRhSGVscCBpbXBsZW1lbnRzIE9uSW5pdCwgSUhhc01vZGVsLCBJSGlzdG9yeU1hbmFnZWQge1xuXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZWRpdG9yOiBBYnN0cmFjdERhdGFFZGl0b3I7XG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbW9kZWw6IFZpZXdNb2RlbDtcbiAgQE9wdGlvbignc2hvdycpXG4gIHByb3RlY3RlZCBzaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdoaWRlJylcbiAgcHJvdGVjdGVkIGhpZGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2NoYW5nZScpXG4gIHByb3RlY3RlZCB2aWV3Q2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdiZWZvcmVTaG93JylcbiAgcHJvdGVjdGVkIGJlZm9yZVNob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUhpZGUnKVxuICBwcm90ZWN0ZWQgYmVmb3JlSGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignYmVmb3JlVmlld0NoYW5nZScpXG4gIHByb3RlY3RlZCBiZWZvcmVWaWV3Q2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBwcm90ZWN0ZWQgZWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5OiBJRWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5O1xuICBwcm90ZWN0ZWQgdmlld1NldHRpbmdTZXJ2aWNlOiBJRWRpdG9yU2V0dGluZ1NlcnZpY2U7XG4gIHByb3RlY3RlZCB2aWV3U2V0dGluZzogYW55O1xuICBwcm90ZWN0ZWQgZGF0YTogYW55W107XG4gIHByb3RlY3RlZCBhY3RpdmU6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioc2V0dGluZ1NlcnZpY2VGYWN0b3J5OiBJRWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5LCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBrYlNob3J0Y3V0U2VydmljZT86IEtleWJvYXJkU2hvcnRjdXRTZXJ2aWNlKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZiwga2JTaG9ydGN1dFNlcnZpY2UpO1xuICAgIHRoaXMuZWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5ID0gc2V0dGluZ1NlcnZpY2VGYWN0b3J5O1xuICAgIHRoaXMuc2hvd0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuaGlkZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMudmlld0NoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlU2hvd0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlSGlkZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlVmlld0NoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy52aWV3U2V0dGluZyA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAvLyBjcmVhdGUgc2VydmljZVxuICAgIHRoaXMuaW5pdFZpZXdTZXR0aW5nU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE9iamVjdElkRmllbGQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5lZGl0b3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZWRpdG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmdldE9iamVjdElkRmllbGQoKTtcbiAgICB9XG4gICAgcmV0dXJuIFBobG94QXBwSW5mby5ERUZBVUxUX09CSkVDVF9JRF9GSUVMRF9OQU1FO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRWaWV3U2V0dGluZ1NlcnZpY2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVkaXRvclNldHRpbmdTZXJ2aWNlRmFjdG9yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB2aWV3VHlwZSA9IG51bGw7XG4gICAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmlld1R5cGUgPSB0aGlzLm1vZGVsLnR5cGU7XG4gICAgICB9XG5cbiAgICAgIGxldCBzZXR0aW5nUHJvbSA9IHRoaXMuZWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5LmNyZWF0ZVZpZXdTZXR0aW5nU2VydmljZSh0aGlzLmVkaXRvciwgdmlld1R5cGUpO1xuICAgICAgaWYgKHNldHRpbmdQcm9tICE9IG51bGwpIHtcbiAgICAgICAgc2V0dGluZ1Byb20udGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgdGhpcy52aWV3U2V0dGluZ1NlcnZpY2UgPSByZXN1bHQ7XG4gICAgICAgICAgdGhpcy5yZWxvYWRWaWV3U2V0dGluZygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUhpZGVFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iZWZvcmVIaWRlRXZlbnQgIT09IG51bGwpIHtcbiAgICAgIGxldCBkYXRhOiBhbnkgPSB7fTtcbiAgICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX1ZJRVdfSElERV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgICAgdGhpcy5iZWZvcmVIaWRlRXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRIaWRlRXZlbnQoJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgLy8gZW1pdCBldmVudFxuICAgIGlmICh0aGlzLmhpZGVFdmVudCAhPT0gbnVsbCkge1xuICAgICAgbGV0IGRhdGE6IGFueSA9IHt9O1xuICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChWSUVXX0hJREVfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICAgIHRoaXMuaGlkZUV2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlU2hvd0V2ZW50KCRldmVudD86IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJlZm9yZVNob3dFdmVudCAhPT0gbnVsbCkge1xuICAgICAgbGV0IGRhdGE6IGFueSA9IHt9O1xuICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfVklFV19TSE9XX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgICB0aGlzLmJlZm9yZVNob3dFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdFNob3dFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgaWYgKHRoaXMuc2hvd0V2ZW50ICE9PSBudWxsKSB7XG4gICAgICBsZXQgZGF0YTogYW55ID0ge307XG4gICAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KFZJRVdfU0hPV19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgICAgdGhpcy5zaG93RXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVWaWV3Q2hhbmdlRXZlbnQoYWN0aW9uOiBzdHJpbmcsIGRhdGE6IGFueSwgJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmVmb3JlVmlld0NoYW5nZUV2ZW50ICE9PSBudWxsKSB7XG4gICAgICBsZXQgcGFzc2luZ0RhdGE6IGFueSA9IHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICAgIH07XG4gICAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJFRk9SRV9WSUVXX0NIQU5HRV9FVkVOVCwgdGhpcywgcGFzc2luZ0RhdGEsICRldmVudCk7XG5cbiAgICAgIHRoaXMuYmVmb3JlVmlld0NoYW5nZUV2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0Vmlld0NoYW5nZUV2ZW50KGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnksICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIC8vIGVtaXQgZXZlbnRcbiAgICBpZiAodGhpcy52aWV3Q2hhbmdlRXZlbnQgIT09IG51bGwpIHtcbiAgICAgIGxldCBwYXNzaW5nRGF0YTogYW55ID0ge1xuICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgZGF0YTogZGF0YVxuICAgICAgfTtcbiAgICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoVklFV19DSEFOR0VfRVZFTlQsIHRoaXMsIHBhc3NpbmdEYXRhLCAkZXZlbnQpO1xuXG4gICAgICB0aGlzLnZpZXdDaGFuZ2VFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkVmlld1NldHRpbmcoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy52aWV3U2V0dGluZ1NlcnZpY2UgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMudmlld1NldHRpbmdTZXJ2aWNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy52aWV3U2V0dGluZ1NlcnZpY2UubG9hZFNldHRpbmdzKCkudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnZpZXdTZXR0aW5nID0gcmVzdWx0O1xuXG4gICAgICAgICAgdGhpcy5vblZpZXdTZXR0aW5nTG9hZGVkKHJlc3VsdCk7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaWV3U2V0dGluZygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZpZXdTZXR0aW5nO1xuICB9XG5cbiAgLy8gcmV0dXJuIHRydWUgaWYgZG9IaWRlIHRyaWdnZXJcbiAgcHVibGljIF9kb0hpZGUoJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlSGlkZUV2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb0V2ZW50XG4gICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcbiAgICAgIHRoaXMuZW1pdEJlZm9yZUhpZGVFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdEhpZGVFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyByZXR1cm4gdHJ1ZSBpZiBkb1Nob3cgdHJpZ2dlclxuICBwdWJsaWMgX2RvU2hvdygkZXZlbnQ/OiBFdmVudCwgZmlyZUV2ZW50PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZVNob3dFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9FdmVudFxuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcbiAgICAgIHRoaXMuZW1pdEJlZm9yZVNob3dFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdFNob3dFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc2hvdygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3Iuc2hvd1ZpZXcodGhpcy5tb2RlbCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RWRpdG9yKGVkaXRvcjogQWJzdHJhY3REYXRhRWRpdG9yKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0RWRpdG9yKCk6IEFic3RyYWN0RGF0YUVkaXRvciB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yO1xuICB9XG5cbiAgcHVibGljIHNldE1vZGVsKG1vZGVsOiBWaWV3TW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0TW9kZWwoKTogVmlld01vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlU2hvd0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVTaG93RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2hvd0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zaG93RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlSGlkZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVIaWRlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlkZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5oaWRlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlU2hvd0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlU2hvd0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0U2hvd0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlSGlkZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlSGlkZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0SGlkZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuaGlkZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlVmlld0NoYW5nZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVWaWV3Q2hhbmdlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0Vmlld0NoYW5nZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3Q2hhbmdlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlVmlld0NoYW5nZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlVmlld0NoYW5nZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0Vmlld0NoYW5nZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMudmlld0NoYW5nZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgaXNFZGl0b3JEYXRhRGlydHkoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBkaXJ0eURhdGFQcm9tID0gdGhpcy5nZXRFZGl0b3JEaXJ0eURhdGEoKTtcbiAgICAgIGlmIChkaXJ0eURhdGFQcm9tICE9PSBudWxsICYmIHR5cGVvZiBkaXJ0eURhdGFQcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkaXJ0eURhdGFQcm9tLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgdHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG9uVmlld1NldHRpbmdMb2FkZWQoc2V0dGluZ3M6IGFueSk6IHZvaWQ7XG5cbiAgcHVibGljIGFic3RyYWN0IGdldEVkaXRvckRpcnR5RGF0YSgpOiBQcm9taXNlPGFueVtdPjsgLy8gdXNlIGZvciBzYXZpbmcvdXBkYXRpbmdcblxuICBwdWJsaWMgYWJzdHJhY3QgZ2V0U2VsZWN0ZWREYXRhKCk6IFByb21pc2U8YW55W10+OyAvLyB1c2UgZm9yIGRlbGV0aW5nXG5cbiAgcHVibGljIGFic3RyYWN0IGdldEN1cnJlbnRIaXN0b3J5U3RhdGUoKTogYW55O1xuXG4gIHB1YmxpYyBhYnN0cmFjdCBsb2FkSGlzdG9yeVN0YXRlKGhpc3Rvcnk6IFVJSGlzdG9yeSwgc3RhdGU6IGFueSk6IFByb21pc2U8dm9pZD47XG5cbiAgcHVibGljIGFic3RyYWN0IHJlbG9hZFZpZXcoKTogdm9pZDtcbn1cbiJdfQ==