igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
306 lines • 28.7 kB
JavaScript
/**
* @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=