UNPKG

igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

306 lines • 28.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, Input, ChangeDetectorRef, TemplateRef, ViewContainerRef, NgModule, NgZone, Output, EventEmitter } from '@angular/core'; import { CommonModule } from '@angular/common'; /** * @hidden */ export class IgxTemplateOutletDirective { /** * @param {?} _viewContainerRef * @param {?} _zone * @param {?} cdr */ constructor(_viewContainerRef, _zone, cdr) { this._viewContainerRef = _viewContainerRef; this._zone = _zone; this.cdr = cdr; /** * The embedded views cache. Collection is key-value paired. * Key is the template id, value is the embedded view for the related template. */ this._embeddedViewsMap = new Map(); this.onViewCreated = new EventEmitter(); this.onViewMoved = new EventEmitter(); this.onCachedViewLoaded = new EventEmitter(); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { /** @type {?} */ const actionType = this._getActionType(changes); switch (actionType) { case TemplateOutletAction.CreateView: this._recreateView(); break; case TemplateOutletAction.MoveView: this._moveView(); break; case TemplateOutletAction.UseCachedView: this._useCachedView(); break; case TemplateOutletAction.UpdateViewContext: this._updateExistingContext(this.igxTemplateOutletContext); break; } } /** * @private * @return {?} */ _recreateView() { // detach old and create new if (this._viewRef) { this._viewContainerRef.detach(this._viewContainerRef.indexOf(this._viewRef)); } if (this.igxTemplateOutlet) { this._viewRef = this._viewContainerRef.createEmbeddedView(this.igxTemplateOutlet, this.igxTemplateOutletContext); this.onViewCreated.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext }); /** @type {?} */ const tmplId = this.igxTemplateOutletContext['templateID']; if (tmplId) { // if context contains a template id, check if we have a view for that template already stored in the cache // if not create a copy and add it to the cache in detached state. // Note: Views in detached state do not appear in the DOM, however they remain stored in memory. /** @type {?} */ const res = this._embeddedViewsMap.get(this.igxTemplateOutletContext['templateID']); if (!res) { this._embeddedViewsMap.set(this.igxTemplateOutletContext['templateID'], this._viewRef); } } } } /** * @private * @return {?} */ _moveView() { // using external view and inserting it in current view. /** @type {?} */ const view = this.igxTemplateOutletContext['moveView']; /** @type {?} */ const owner = this.igxTemplateOutletContext['owner']; if (view !== this._viewRef) { if (owner._viewContainerRef.indexOf(view) !== -1) { // detach in case view it is attached somewhere else at the moment. owner._viewContainerRef.detach(owner._viewContainerRef.indexOf(view)); } if (this._viewRef && this._viewContainerRef.indexOf(this._viewRef) !== -1) { this._viewContainerRef.detach(this._viewContainerRef.indexOf(this._viewRef)); } this._viewRef = view; this._viewContainerRef.insert(view, 0); this._updateExistingContext(this.igxTemplateOutletContext); this.onViewMoved.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext }); } } /** * @private * @return {?} */ _useCachedView() { // use view for specific template cached in the current template outlet /** @type {?} */ const tmplID = this.igxTemplateOutletContext['templateID']; /** @type {?} */ const cachedView = tmplID ? this._embeddedViewsMap.get(tmplID) : null; // if view exists, but template has been changed and there is a view in the cache with the related template // then detach old view and insert the stored one with the matching template // after that update its context. this._viewContainerRef.detach(this._viewContainerRef.indexOf(this._viewRef)); this._viewRef = cachedView; /** @type {?} */ const oldContext = this._cloneContext(cachedView.context); this._viewContainerRef.insert(this._viewRef, 0); this._updateExistingContext(this.igxTemplateOutletContext); this.onCachedViewLoaded.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext, oldContext }); } /** * @private * @param {?} changes * @return {?} */ _shouldRecreateView(changes) { /** @type {?} */ const ctxChange = changes['igxTemplateOutletContext']; return !!changes['igxTemplateOutlet'] || (ctxChange && this._hasContextShapeChanged(ctxChange)); } /** * @private * @param {?} ctxChange * @return {?} */ _hasContextShapeChanged(ctxChange) { /** @type {?} */ const prevCtxKeys = Object.keys(ctxChange.previousValue || {}); /** @type {?} */ const currCtxKeys = Object.keys(ctxChange.currentValue || {}); if (prevCtxKeys.length === currCtxKeys.length) { for (const propName of currCtxKeys) { if (prevCtxKeys.indexOf(propName) === -1) { return true; } } return false; } else { return true; } } /** * @private * @param {?} ctx * @return {?} */ _updateExistingContext(ctx) { for (const propName of Object.keys(ctx)) { ((/** @type {?} */ (this._viewRef.context)))[propName] = ((/** @type {?} */ (this.igxTemplateOutletContext)))[propName]; } } /** * @private * @param {?} ctx * @return {?} */ _cloneContext(ctx) { /** @type {?} */ const clone = {}; for (const propName of Object.keys(ctx)) { clone[propName] = ctx[propName]; } return clone; } /** * @private * @param {?} changes * @return {?} */ _getActionType(changes) { /** @type {?} */ const movedView = this.igxTemplateOutletContext['moveView']; /** @type {?} */ const tmplID = this.igxTemplateOutletContext['templateID']; /** @type {?} */ const cachedView = tmplID ? this._embeddedViewsMap.get(tmplID) : null; /** @type {?} */ const shouldRecreate = this._shouldRecreateView(changes); if (movedView) { // view is moved from external source return TemplateOutletAction.MoveView; } else if (shouldRecreate && cachedView) { // should recreate (template or context change) and there is a matching template in cache return TemplateOutletAction.UseCachedView; } else if (!this._viewRef || shouldRecreate) { // no view or should recreate return TemplateOutletAction.CreateView; } else if (this.igxTemplateOutletContext) { // has context, update context return TemplateOutletAction.UpdateViewContext; } } } IgxTemplateOutletDirective.decorators = [ { type: Directive, args: [{ selector: '[igxTemplateOutlet]' },] } ]; /** @nocollapse */ IgxTemplateOutletDirective.ctorParameters = () => [ { type: ViewContainerRef }, { type: NgZone }, { type: ChangeDetectorRef } ]; IgxTemplateOutletDirective.propDecorators = { igxTemplateOutletContext: [{ type: Input }], igxTemplateOutlet: [{ type: Input }], onViewCreated: [{ type: Output }], onViewMoved: [{ type: Output }], onCachedViewLoaded: [{ type: Output }] }; if (false) { /** * @type {?} * @private */ IgxTemplateOutletDirective.prototype._viewRef; /** * The embedded views cache. Collection is key-value paired. * Key is the template id, value is the embedded view for the related template. * @type {?} * @private */ IgxTemplateOutletDirective.prototype._embeddedViewsMap; /** @type {?} */ IgxTemplateOutletDirective.prototype.igxTemplateOutletContext; /** @type {?} */ IgxTemplateOutletDirective.prototype.igxTemplateOutlet; /** @type {?} */ IgxTemplateOutletDirective.prototype.onViewCreated; /** @type {?} */ IgxTemplateOutletDirective.prototype.onViewMoved; /** @type {?} */ IgxTemplateOutletDirective.prototype.onCachedViewLoaded; /** @type {?} */ IgxTemplateOutletDirective.prototype._viewContainerRef; /** * @type {?} * @private */ IgxTemplateOutletDirective.prototype._zone; /** @type {?} */ IgxTemplateOutletDirective.prototype.cdr; } /** @enum {number} */ const TemplateOutletAction = { CreateView: 0, MoveView: 1, UseCachedView: 2, UpdateViewContext: 3, }; TemplateOutletAction[TemplateOutletAction.CreateView] = 'CreateView'; TemplateOutletAction[TemplateOutletAction.MoveView] = 'MoveView'; TemplateOutletAction[TemplateOutletAction.UseCachedView] = 'UseCachedView'; TemplateOutletAction[TemplateOutletAction.UpdateViewContext] = 'UpdateViewContext'; /** * @record */ export function IViewChangeEventArgs() { } if (false) { /** @type {?} */ IViewChangeEventArgs.prototype.owner; /** @type {?} */ IViewChangeEventArgs.prototype.view; /** @type {?} */ IViewChangeEventArgs.prototype.context; } /** * @record */ export function ICachedViewLoadedEventArgs() { } if (false) { /** @type {?} */ ICachedViewLoadedEventArgs.prototype.oldContext; } /** * @hidden */ export class IgxTemplateOutletModule { } IgxTemplateOutletModule.decorators = [ { type: NgModule, args: [{ declarations: [IgxTemplateOutletDirective], entryComponents: [], exports: [IgxTemplateOutletDirective], imports: [CommonModule] },] } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVfb3V0bGV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlcy90ZW1wbGF0ZS1vdXRsZXQvdGVtcGxhdGVfb3V0bGV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFBbUIsS0FBSyxFQUFhLGlCQUFpQixFQUNsQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBVyxNQUFNLEVBQUUsWUFBWSxFQUM5RyxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFNL0MsTUFBTSxPQUFPLDBCQUEwQjs7Ozs7O0lBc0JuQyxZQUFtQixpQkFBbUMsRUFBVSxLQUFhLEVBQVMsR0FBc0I7UUFBekYsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUFVLFVBQUssR0FBTCxLQUFLLENBQVE7UUFBUyxRQUFHLEdBQUgsR0FBRyxDQUFtQjs7Ozs7UUFmcEcsc0JBQWlCLEdBQXNDLElBQUksR0FBRyxFQUFFLENBQUM7UUFPbEUsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUd6RCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBR3ZELHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUE4QixDQUFDO0lBRzNFLENBQUM7Ozs7O0lBRUQsV0FBVyxDQUFDLE9BQXNCOztjQUN4QixVQUFVLEdBQXlCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1FBQ3JFLFFBQVEsVUFBVSxFQUFFO1lBQ2hCLEtBQUssb0JBQW9CLENBQUMsVUFBVTtnQkFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQUMsTUFBTTtZQUNsRSxLQUFLLG9CQUFvQixDQUFDLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLFNBQVMsRUFB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Qzs7SUFDbEMsb0NBQTJCOztJQUMzQix1Q0FBYTs7Ozs7QUFHakIsZ0RBRUM7OztJQURHLGdEQUFnQjs7Ozs7QUFhcEIsTUFBTSxPQUFPLHVCQUF1Qjs7O1lBUG5DLFFBQVEsU0FBQztnQkFDTixZQUFZLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztnQkFDMUMsZUFBZSxFQUFFLEVBQUU7Z0JBQ25CLE9BQU8sRUFBRSxDQUFDLDBCQUEwQixDQUFDO2dCQUNyQyxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7YUFDMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSwgRW1iZWRkZWRWaWV3UmVmLCBJbnB1dCwgT25DaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBTaW1wbGVDaGFuZ2UsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmLCBOZ01vZHVsZSwgTmdab25lLCBWaWV3UmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tpZ3hUZW1wbGF0ZU91dGxldF0nIH0pXG5leHBvcnQgY2xhc3MgSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIHByaXZhdGUgX3ZpZXdSZWYgITogRW1iZWRkZWRWaWV3UmVmPGFueT47XG5cbiAgICAvKipcbiAgICAqIFRoZSBlbWJlZGRlZCB2aWV3cyBjYWNoZS4gQ29sbGVjdGlvbiBpcyBrZXktdmFsdWUgcGFpcmVkLlxuICAgICogS2V5IGlzIHRoZSB0ZW1wbGF0ZSBpZCwgdmFsdWUgaXMgdGhlIGVtYmVkZGVkIHZpZXcgZm9yIHRoZSByZWxhdGVkIHRlbXBsYXRlLlxuICAgICovXG4gICAgcHJpdmF0ZSBfZW1iZWRkZWRWaWV3c01hcDogTWFwPHN0cmluZywgRW1iZWRkZWRWaWV3UmVmPGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gICAgQElucHV0KCkgcHVibGljIGlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCAhOiBPYmplY3Q7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgaWd4VGVtcGxhdGVPdXRsZXQgITogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblZpZXdDcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJVmlld0NoYW5nZUV2ZW50QXJncz4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblZpZXdNb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVZpZXdDaGFuZ2VFdmVudEFyZ3M+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25DYWNoZWRWaWV3TG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2FjaGVkVmlld0xvYWRlZEV2ZW50QXJncz4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgcHJpdmF0ZSBfem9uZTogTmdab25lLCBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uVHlwZTogVGVtcGxhdGVPdXRsZXRBY3Rpb24gPSB0aGlzLl9nZXRBY3Rpb25UeXBlKGNoYW5nZXMpO1xuICAgICAgICBzd2l0Y2ggKGFjdGlvblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVGVtcGxhdGVPdXRsZXRBY3Rpb24uQ3JlYXRlVmlldzogdGhpcy5fcmVjcmVhdGVWaWV3KCk7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBUZW1wbGF0ZU91dGxldEFjdGlvbi5Nb3ZlVmlldzogdGhpcy5fbW92ZVZpZXcoKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRlbXBsYXRlT3V0bGV0QWN0aW9uLlVzZUNhY2hlZFZpZXc6IHRoaXMuX3VzZUNhY2hlZFZpZXcoKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRlbXBsYXRlT3V0bGV0QWN0aW9uLlVwZGF0ZVZpZXdDb250ZXh0OiB0aGlzLl91cGRhdGVFeGlzdGluZ0NvbnRleHQodGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQpOyBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3JlY3JlYXRlVmlldygpIHtcbiAgICAgICAgLy8gZGV0YWNoIG9sZCBhbmQgY3JlYXRlIG5ld1xuICAgICAgICBpZiAodGhpcy5fdmlld1JlZikge1xuICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2godGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHRoaXMuX3ZpZXdSZWYpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pZ3hUZW1wbGF0ZU91dGxldCkge1xuICAgICAgICAgICAgdGhpcy5fdmlld1JlZiA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KFxuICAgICAgICAgICAgICAgIHRoaXMuaWd4VGVtcGxhdGVPdXRsZXQsIHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0KTtcbiAgICAgICAgICAgIHRoaXMub25WaWV3Q3JlYXRlZC5lbWl0KHsgb3duZXI6IHRoaXMsIHZpZXc6IHRoaXMuX3ZpZXdSZWYsIGNvbnRleHQ6IHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0IH0pO1xuICAgICAgICAgICAgY29uc3QgdG1wbElkID0gdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ3RlbXBsYXRlSUQnXTtcbiAgICAgICAgICAgIGlmICh0bXBsSWQpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBjb250ZXh0IGNvbnRhaW5zIGEgdGVtcGxhdGUgaWQsIGNoZWNrIGlmIHdlIGhhdmUgYSB2aWV3IGZvciB0aGF0IHRlbXBsYXRlIGFscmVhZHkgc3RvcmVkIGluIHRoZSBjYWNoZVxuICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBjcmVhdGUgYSBjb3B5IGFuZCBhZGQgaXQgdG8gdGhlIGNhY2hlIGluIGRldGFjaGVkIHN0YXRlLlxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IFZpZXdzIGluIGRldGFjaGVkIHN0YXRlIGRvIG5vdCBhcHBlYXIgaW4gdGhlIERPTSwgaG93ZXZlciB0aGV5IHJlbWFpbiBzdG9yZWQgaW4gbWVtb3J5LlxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuX2VtYmVkZGVkVmlld3NNYXAuZ2V0KHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0Wyd0ZW1wbGF0ZUlEJ10pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtYmVkZGVkVmlld3NNYXAuc2V0KHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0Wyd0ZW1wbGF0ZUlEJ10sIHRoaXMuX3ZpZXdSZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX21vdmVWaWV3KCkge1xuICAgICAgICAvLyB1c2luZyBleHRlcm5hbCB2aWV3IGFuZCBpbnNlcnRpbmcgaXQgaW4gY3VycmVudCB2aWV3LlxuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ21vdmVWaWV3J107XG4gICAgICAgIGNvbnN0IG93bmVyID0gdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ293bmVyJ107XG4gICAgICAgIGlmICh2aWV3ICE9PSB0aGlzLl92aWV3UmVmKSB7XG4gICAgICAgICAgICBpZiAob3duZXIuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih2aWV3KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBkZXRhY2ggaW4gY2FzZSB2aWV3IGl0IGlzIGF0dGFjaGVkIHNvbWV3aGVyZSBlbHNlIGF0IHRoZSBtb21lbnQuXG4gICAgICAgICAgICAgICAgb3duZXIuX3ZpZXdDb250YWluZXJSZWYuZGV0YWNoKG93bmVyLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodmlldykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZpZXdSZWYgJiYgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHRoaXMuX3ZpZXdSZWYpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYuZGV0YWNoKHRoaXMuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih0aGlzLl92aWV3UmVmKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl92aWV3UmVmID0gdmlldztcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYuaW5zZXJ0KHZpZXcsIDApO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlRXhpc3RpbmdDb250ZXh0KHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0KTtcbiAgICAgICAgICAgIHRoaXMub25WaWV3TW92ZWQuZW1pdCh7IG93bmVyOiB0aGlzLCB2aWV3OiB0aGlzLl92aWV3UmVmLCBjb250ZXh0OiB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF91c2VDYWNoZWRWaWV3KCkge1xuICAgICAgICAvLyB1c2UgdmlldyBmb3Igc3BlY2lmaWMgdGVtcGxhdGUgY2FjaGVkIGluIHRoZSBjdXJyZW50IHRlbXBsYXRlIG91dGxldFxuICAgICAgICBjb25zdCB0bXBsSUQgPSB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dFsndGVtcGxhdGVJRCddO1xuICAgICAgICBjb25zdCBjYWNoZWRWaWV3ID0gdG1wbElEID9cbiAgICAgICAgICAgIHRoaXMuX2VtYmVkZGVkVmlld3NNYXAuZ2V0KHRtcGxJRCkgOlxuICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgLy8gaWYgdmlldyBleGlzdHMsIGJ1dCB0ZW1wbGF0ZSBoYXMgYmVlbiBjaGFuZ2VkIGFuZCB0aGVyZSBpcyBhIHZpZXcgaW4gdGhlIGNhY2hlIHdpdGggdGhlIHJlbGF0ZWQgdGVtcGxhdGVcbiAgICAgICAgLy8gdGhlbiBkZXRhY2ggb2xkIHZpZXcgYW5kIGluc2VydCB0aGUgc3RvcmVkIG9uZSB3aXRoIHRoZSBtYXRjaGluZyB0ZW1wbGF0ZVxuICAgICAgICAvLyBhZnRlciB0aGF0IHVwZGF0ZSBpdHMgY29udGV4dC5cbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2godGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHRoaXMuX3ZpZXdSZWYpKTtcbiAgICAgICAgdGhpcy5fdmlld1JlZiA9IGNhY2hlZFZpZXc7XG4gICAgICAgIGNvbnN0IG9sZENvbnRleHQgPSB0aGlzLl9jbG9uZUNvbnRleHQoY2FjaGVkVmlldy5jb250ZXh0KTtcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbnNlcnQodGhpcy5fdmlld1JlZiwgMCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUV4aXN0aW5nQ29udGV4dCh0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCk7XG4gICAgICAgIHRoaXMub25DYWNoZWRWaWV3TG9hZGVkLmVtaXQoeyBvd25lcjogdGhpcywgdmlldzogdGhpcy5fdmlld1JlZiwgY29udGV4dDogdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQsIG9sZENvbnRleHQgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvdWxkUmVjcmVhdGVWaWV3KGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3R4Q2hhbmdlID0gY2hhbmdlc1snaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0J107XG4gICAgICAgIHJldHVybiAhIWNoYW5nZXNbJ2lneFRlbXBsYXRlT3V0bGV0J10gfHwgKGN0eENoYW5nZSAmJiB0aGlzLl9oYXNDb250ZXh0U2hhcGVDaGFuZ2VkKGN0eENoYW5nZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhc0NvbnRleHRTaGFwZUNoYW5nZWQoY3R4Q2hhbmdlOiBTaW1wbGVDaGFuZ2UpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcHJldkN0eEtleXMgPSBPYmplY3Qua2V5cyhjdHhDaGFuZ2UucHJldmlvdXNWYWx1ZSB8fCB7fSk7XG4gICAgICAgIGNvbnN0IGN1cnJDdHhLZXlzID0gT2JqZWN0LmtleXMoY3R4Q2hhbmdlLmN1cnJlbnRWYWx1ZSB8fCB7fSk7XG5cbiAgICAgICAgaWYgKHByZXZDdHhLZXlzLmxlbmd0aCA9PT0gY3VyckN0eEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIGN1cnJDdHhLZXlzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZDdHhLZXlzLmluZGV4T2YocHJvcE5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3VwZGF0ZUV4aXN0aW5nQ29udGV4dChjdHg6IE9iamVjdCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKGN0eCkpIHtcbiAgICAgICAgICAgICg8YW55PnRoaXMuX3ZpZXdSZWYuY29udGV4dClbcHJvcE5hbWVdID0gKDxhbnk+dGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQpW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2Nsb25lQ29udGV4dChjdHg6IGFueSk6IGFueSB7XG4gICAgICAgIGNvbnN0IGNsb25lID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXMoY3R4KSkge1xuICAgICAgICAgICAgY2xvbmVbcHJvcE5hbWVdID0gY3R4W3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0QWN0aW9uVHlwZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IG1vdmVkVmlldyA9IHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0Wydtb3ZlVmlldyddO1xuICAgICAgICBjb25zdCB0bXBsSUQgPSB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dFsndGVtcGxhdGVJRCddO1xuICAgICAgICBjb25zdCBjYWNoZWRWaWV3ID0gdG1wbElEID9cbiAgICAgICAgICAgIHRoaXMuX2VtYmVkZGVkVmlld3NNYXAuZ2V0KHRtcGxJRCkgOlxuICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgY29uc3Qgc2hvdWxkUmVjcmVhdGUgPSB0aGlzLl9zaG91bGRSZWNyZWF0ZVZpZXcoY2hhbmdlcyk7XG4gICAgICAgIGlmIChtb3ZlZFZpZXcpIHtcbiAgICAgICAgICAgIC8vIHZpZXcgaXMgbW92ZWQgZnJvbSBleHRlcm5hbCBzb3VyY2VcbiAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZU91dGxldEFjdGlvbi5Nb3ZlVmlldztcbiAgICAgICAgfSBlbHNlIGlmIChzaG91bGRSZWNyZWF0ZSAmJiBjYWNoZWRWaWV3KSB7XG4gICAgICAgICAgICAvLyBzaG91bGQgcmVjcmVhdGUgKHRlbXBsYXRlIG9yIGNvbnRleHQgY2hhbmdlKSBhbmQgdGhlcmUgaXMgYSBtYXRjaGluZyB0ZW1wbGF0ZSBpbiBjYWNoZVxuICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlT3V0bGV0QWN0aW9uLlVzZUNhY2hlZFZpZXc7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3ZpZXdSZWYgfHwgc2hvdWxkUmVjcmVhdGUpIHtcbiAgICAgICAgICAgIC8vIG5vIHZpZXcgb3Igc2hvdWxkIHJlY3JlYXRlXG4gICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVPdXRsZXRBY3Rpb24uQ3JlYXRlVmlldztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCkge1xuICAgICAgICAgICAgLy8gaGFzIGNvbnRleHQsIHVwZGF0ZSBjb250ZXh0XG4gICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVPdXRsZXRBY3Rpb24uVXBkYXRlVmlld0NvbnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5lbnVtIFRlbXBsYXRlT3V0bGV0QWN0aW9uIHtcbiAgICBDcmVhdGVWaWV3LFxuICAgIE1vdmVWaWV3LFxuICAgIFVzZUNhY2hlZFZpZXcsXG4gICAgVXBkYXRlVmlld0NvbnRleHRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmlld0NoYW5nZUV2ZW50QXJncyB7XG4gICAgb3duZXI6IElneFRlbXBsYXRlT3V0bGV0RGlyZWN0aXZlO1xuICAgIHZpZXc6IEVtYmVkZGVkVmlld1JlZjxhbnk+O1xuICAgIGNvbnRleHQ6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2FjaGVkVmlld0xvYWRlZEV2ZW50QXJncyBleHRlbmRzIElWaWV3Q2hhbmdlRXZlbnRBcmdzIHtcbiAgICBvbGRDb250ZXh0OiBhbnk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW0lneFRlbXBsYXRlT3V0bGV0RGlyZWN0aXZlXSxcbiAgICBlbnRyeUNvbXBvbmVudHM6IFtdLFxuICAgIGV4cG9ydHM6IFtJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZV0sXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV1cbn0pXG5cbmV4cG9ydCBjbGFzcyBJZ3hUZW1wbGF0ZU91dGxldE1vZHVsZSB7XG59XG4iXX0=