igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
382 lines • 31.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Directive, Input, ChangeDetectorRef, TemplateRef, ViewContainerRef, NgModule, NgZone, Output, EventEmitter } from '@angular/core';
import { CommonModule } from '@angular/common';
/**
* @hidden
*/
var IgxTemplateOutletDirective = /** @class */ (function () {
function IgxTemplateOutletDirective(_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 {?}
*/
IgxTemplateOutletDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
/** @type {?} */
var 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 {?}
*/
IgxTemplateOutletDirective.prototype._recreateView = /**
* @private
* @return {?}
*/
function () {
// 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 {?} */
var 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 {?} */
var res = this._embeddedViewsMap.get(this.igxTemplateOutletContext['templateID']);
if (!res) {
this._embeddedViewsMap.set(this.igxTemplateOutletContext['templateID'], this._viewRef);
}
}
}
};
/**
* @private
* @return {?}
*/
IgxTemplateOutletDirective.prototype._moveView = /**
* @private
* @return {?}
*/
function () {
// using external view and inserting it in current view.
/** @type {?} */
var view = this.igxTemplateOutletContext['moveView'];
/** @type {?} */
var 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 {?}
*/
IgxTemplateOutletDirective.prototype._useCachedView = /**
* @private
* @return {?}
*/
function () {
// use view for specific template cached in the current template outlet
/** @type {?} */
var tmplID = this.igxTemplateOutletContext['templateID'];
/** @type {?} */
var 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 {?} */
var 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: oldContext });
};
/**
* @private
* @param {?} changes
* @return {?}
*/
IgxTemplateOutletDirective.prototype._shouldRecreateView = /**
* @private
* @param {?} changes
* @return {?}
*/
function (changes) {
/** @type {?} */
var ctxChange = changes['igxTemplateOutletContext'];
return !!changes['igxTemplateOutlet'] || (ctxChange && this._hasContextShapeChanged(ctxChange));
};
/**
* @private
* @param {?} ctxChange
* @return {?}
*/
IgxTemplateOutletDirective.prototype._hasContextShapeChanged = /**
* @private
* @param {?} ctxChange
* @return {?}
*/
function (ctxChange) {
var e_1, _a;
/** @type {?} */
var prevCtxKeys = Object.keys(ctxChange.previousValue || {});
/** @type {?} */
var currCtxKeys = Object.keys(ctxChange.currentValue || {});
if (prevCtxKeys.length === currCtxKeys.length) {
try {
for (var currCtxKeys_1 = tslib_1.__values(currCtxKeys), currCtxKeys_1_1 = currCtxKeys_1.next(); !currCtxKeys_1_1.done; currCtxKeys_1_1 = currCtxKeys_1.next()) {
var propName = currCtxKeys_1_1.value;
if (prevCtxKeys.indexOf(propName) === -1) {
return true;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (currCtxKeys_1_1 && !currCtxKeys_1_1.done && (_a = currCtxKeys_1.return)) _a.call(currCtxKeys_1);
}
finally { if (e_1) throw e_1.error; }
}
return false;
}
else {
return true;
}
};
/**
* @private
* @param {?} ctx
* @return {?}
*/
IgxTemplateOutletDirective.prototype._updateExistingContext = /**
* @private
* @param {?} ctx
* @return {?}
*/
function (ctx) {
var e_2, _a;
try {
for (var _b = tslib_1.__values(Object.keys(ctx)), _c = _b.next(); !_c.done; _c = _b.next()) {
var propName = _c.value;
((/** @type {?} */ (this._viewRef.context)))[propName] = ((/** @type {?} */ (this.igxTemplateOutletContext)))[propName];
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_2) throw e_2.error; }
}
};
/**
* @private
* @param {?} ctx
* @return {?}
*/
IgxTemplateOutletDirective.prototype._cloneContext = /**
* @private
* @param {?} ctx
* @return {?}
*/
function (ctx) {
var e_3, _a;
/** @type {?} */
var clone = {};
try {
for (var _b = tslib_1.__values(Object.keys(ctx)), _c = _b.next(); !_c.done; _c = _b.next()) {
var propName = _c.value;
clone[propName] = ctx[propName];
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_3) throw e_3.error; }
}
return clone;
};
/**
* @private
* @param {?} changes
* @return {?}
*/
IgxTemplateOutletDirective.prototype._getActionType = /**
* @private
* @param {?} changes
* @return {?}
*/
function (changes) {
/** @type {?} */
var movedView = this.igxTemplateOutletContext['moveView'];
/** @type {?} */
var tmplID = this.igxTemplateOutletContext['templateID'];
/** @type {?} */
var cachedView = tmplID ?
this._embeddedViewsMap.get(tmplID) :
null;
/** @type {?} */
var 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 = function () { return [
{ type: ViewContainerRef },
{ type: NgZone },
{ type: ChangeDetectorRef }
]; };
IgxTemplateOutletDirective.propDecorators = {
igxTemplateOutletContext: [{ type: Input }],
igxTemplateOutlet: [{ type: Input }],
onViewCreated: [{ type: Output }],
onViewMoved: [{ type: Output }],
onCachedViewLoaded: [{ type: Output }]
};
return IgxTemplateOutletDirective;
}());
export { IgxTemplateOutletDirective };
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} */
var 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
*/
var IgxTemplateOutletModule = /** @class */ (function () {
function IgxTemplateOutletModule() {
}
IgxTemplateOutletModule.decorators = [
{ type: NgModule, args: [{
declarations: [IgxTemplateOutletDirective],
entryComponents: [],
exports: [IgxTemplateOutletDirective],
imports: [CommonModule]
},] }
];
return IgxTemplateOutletModule;
}());
export { IgxTemplateOutletModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVfb3V0bGV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlcy90ZW1wbGF0ZS1vdXRsZXQvdGVtcGxhdGVfb3V0bGV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQW1CLEtBQUssRUFBYSxpQkFBaUIsRUFDbEMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVcsTUFBTSxFQUFFLFlBQVksRUFDOUcsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBSy9DO0lBdUJJLG9DQUFtQixpQkFBbUMsRUFBVSxLQUFhLEVBQVMsR0FBc0I7UUFBekYsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUFVLFVBQUssR0FBTCxLQUFLLENBQVE7UUFBUyxRQUFHLEdBQUgsR0FBRyxDQUFtQjs7Ozs7UUFmcEcsc0JBQWlCLEdBQXNDLElBQUksR0FBRyxFQUFFLENBQUM7UUFPbEUsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUd6RCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBR3ZELHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUE4QixDQUFDO0lBRzNFLENBQUM7Ozs7O0lBRUQsZ0RBQVc7Ozs7SUFBWCxVQUFZLE9BQXNCOztZQUN4QixVQUFVLEdBQXlCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1FBQ3JFLFFBQVEsVUFBVSxFQUFFO1lBQ2hCLEtBQUssb0JBQW9CLENBQUMsVUFBVTtnQkFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQUMsTUFBTTtZQUNsRSxLQUFLLG9CQUFvQixDQUFDLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUFD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Q0FBQztDQUFBLEFBckpELElBcUpDO1NBcEpZLDBCQUEwQjs7Ozs7O0lBQ25DLDhDQUF5Qzs7Ozs7OztJQU16Qyx1REFBeUU7O0lBRXpFLDhEQUFtRDs7SUFFbkQsdURBQXNEOztJQUV0RCxtREFDZ0U7O0lBRWhFLGlEQUM4RDs7SUFFOUQsd0RBQzJFOztJQUUvRCx1REFBMEM7Ozs7O0lBQUUsMkNBQXFCOztJQUFFLHlDQUE2Qjs7OztJQWdJNUcsYUFBVTtJQUNWLFdBQVE7SUFDUixnQkFBYTtJQUNiLG9CQUFpQjs7Ozs7Ozs7O0FBR3JCLDBDQUlDOzs7SUFIRyxxQ0FBa0M7O0lBQ2xDLG9DQUEyQjs7SUFDM0IsdUNBQWE7Ozs7O0FBR2pCLGdEQUVDOzs7SUFERyxnREFBZ0I7Ozs7O0FBTXBCO0lBQUE7SUFRQSxDQUFDOztnQkFSQSxRQUFRLFNBQUM7b0JBQ04sWUFBWSxFQUFFLENBQUMsMEJBQTBCLENBQUM7b0JBQzFDLGVBQWUsRUFBRSxFQUFFO29CQUNuQixPQUFPLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztvQkFDckMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUMxQjs7SUFHRCw4QkFBQztDQUFBLEFBUkQsSUFRQztTQURZLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLCBFbWJlZGRlZFZpZXdSZWYsIElucHV0LCBPbkNoYW5nZXMsIENoYW5nZURldGVjdG9yUmVmLFxuICAgIFNpbXBsZUNoYW5nZSwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYsIE5nTW9kdWxlLCBOZ1pvbmUsIFZpZXdSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2lneFRlbXBsYXRlT3V0bGV0XScgfSlcbmV4cG9ydCBjbGFzcyBJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgcHJpdmF0ZSBfdmlld1JlZiAhOiBFbWJlZGRlZFZpZXdSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICogVGhlIGVtYmVkZGVkIHZpZXdzIGNhY2hlLiBDb2xsZWN0aW9uIGlzIGtleS12YWx1ZSBwYWlyZWQuXG4gICAgKiBLZXkgaXMgdGhlIHRlbXBsYXRlIGlkLCB2YWx1ZSBpcyB0aGUgZW1iZWRkZWQgdmlldyBmb3IgdGhlIHJlbGF0ZWQgdGVtcGxhdGUuXG4gICAgKi9cbiAgICBwcml2YXRlIF9lbWJlZGRlZFZpZXdzTWFwOiBNYXA8c3RyaW5nLCBFbWJlZGRlZFZpZXdSZWY8YW55Pj4gPSBuZXcgTWFwKCk7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0ICE6IE9iamVjdDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBpZ3hUZW1wbGF0ZU91dGxldCAhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uVmlld0NyZWF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElWaWV3Q2hhbmdlRXZlbnRBcmdzPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uVmlld01vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxJVmlld0NoYW5nZUV2ZW50QXJncz4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkNhY2hlZFZpZXdMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElDYWNoZWRWaWV3TG9hZGVkRXZlbnRBcmdzPigpO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLCBwcml2YXRlIF96b25lOiBOZ1pvbmUsIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBjb25zdCBhY3Rpb25UeXBlOiBUZW1wbGF0ZU91dGxldEFjdGlvbiA9IHRoaXMuX2dldEFjdGlvblR5cGUoY2hhbmdlcyk7XG4gICAgICAgIHN3aXRjaCAoYWN0aW9uVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBUZW1wbGF0ZU91dGxldEFjdGlvbi5DcmVhdGVWaWV3OiB0aGlzLl9yZWNyZWF0ZVZpZXcoKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRlbXBsYXRlT3V0bGV0QWN0aW9uLk1vdmVWaWV3OiB0aGlzLl9tb3ZlVmlldygpOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVGVtcGxhdGVPdXRsZXRBY3Rpb24uVXNlQ2FjaGVkVmlldzogdGhpcy5fdXNlQ2FjaGVkVmlldygpOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVGVtcGxhdGVPdXRsZXRBY3Rpb24uVXBkYXRlVmlld0NvbnRleHQ6IHRoaXMuX3VwZGF0ZUV4aXN0aW5nQ29udGV4dCh0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCk7IGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVjcmVhdGVWaWV3KCkge1xuICAgICAgICAvLyBkZXRhY2ggb2xkIGFuZCBjcmVhdGUgbmV3XG4gICAgICAgIGlmICh0aGlzLl92aWV3UmVmKSB7XG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmRldGFjaCh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5fdmlld1JlZikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlneFRlbXBsYXRlT3V0bGV0KSB7XG4gICAgICAgICAgICB0aGlzLl92aWV3UmVmID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcoXG4gICAgICAgICAgICAgICAgdGhpcy5pZ3hUZW1wbGF0ZU91dGxldCwgdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQpO1xuICAgICAgICAgICAgdGhpcy5vblZpZXdDcmVhdGVkLmVtaXQoeyBvd25lcjogdGhpcywgdmlldzogdGhpcy5fdmlld1JlZiwgY29udGV4dDogdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQgfSk7XG4gICAgICAgICAgICBjb25zdCB0bXBsSWQgPSB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dFsndGVtcGxhdGVJRCddO1xuICAgICAgICAgICAgaWYgKHRtcGxJZCkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGNvbnRleHQgY29udGFpbnMgYSB0ZW1wbGF0ZSBpZCwgY2hlY2sgaWYgd2UgaGF2ZSBhIHZpZXcgZm9yIHRoYXQgdGVtcGxhdGUgYWxyZWFkeSBzdG9yZWQgaW4gdGhlIGNhY2hlXG4gICAgICAgICAgICAgICAgLy8gaWYgbm90IGNyZWF0ZSBhIGNvcHkgYW5kIGFkZCBpdCB0byB0aGUgY2FjaGUgaW4gZGV0YWNoZWQgc3RhdGUuXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogVmlld3MgaW4gZGV0YWNoZWQgc3RhdGUgZG8gbm90IGFwcGVhciBpbiB0aGUgRE9NLCBob3dldmVyIHRoZXkgcmVtYWluIHN0b3JlZCBpbiBtZW1vcnkuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzID0gdGhpcy5fZW1iZWRkZWRWaWV3c01hcC5nZXQodGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ3RlbXBsYXRlSUQnXSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1iZWRkZWRWaWV3c01hcC5zZXQodGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ3RlbXBsYXRlSUQnXSwgdGhpcy5fdmlld1JlZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbW92ZVZpZXcoKSB7XG4gICAgICAgIC8vIHVzaW5nIGV4dGVybmFsIHZpZXcgYW5kIGluc2VydGluZyBpdCBpbiBjdXJyZW50IHZpZXcuXG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dFsnbW92ZVZpZXcnXTtcbiAgICAgICAgY29uc3Qgb3duZXIgPSB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dFsnb3duZXInXTtcbiAgICAgICAgaWYgKHZpZXcgIT09IHRoaXMuX3ZpZXdSZWYpIHtcbiAgICAgICAgICAgIGlmIChvd25lci5fdmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHZpZXcpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIGRldGFjaCBpbiBjYXNlIHZpZXcgaXQgaXMgYXR0YWNoZWQgc29tZXdoZXJlIGVsc2UgYXQgdGhlIG1vbWVudC5cbiAgICAgICAgICAgICAgICBvd25lci5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2gob3duZXIuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih2aWV3KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdmlld1JlZiAmJiB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5fdmlld1JlZikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2godGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHRoaXMuX3ZpZXdSZWYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3ZpZXdSZWYgPSB2aWV3O1xuICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbnNlcnQodmlldywgMCk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVFeGlzdGluZ0NvbnRleHQodGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHQpO1xuICAgICAgICAgICAgdGhpcy5vblZpZXdNb3ZlZC5lbWl0KHsgb3duZXI6IHRoaXMsIHZpZXc6IHRoaXMuX3ZpZXdSZWYsIGNvbnRleHQ6IHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX3VzZUNhY2hlZFZpZXcoKSB7XG4gICAgICAgIC8vIHVzZSB2aWV3IGZvciBzcGVjaWZpYyB0ZW1wbGF0ZSBjYWNoZWQgaW4gdGhlIGN1cnJlbnQgdGVtcGxhdGUgb3V0bGV0XG4gICAgICAgIGNvbnN0IHRtcGxJRCA9IHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0Wyd0ZW1wbGF0ZUlEJ107XG4gICAgICAgIGNvbnN0IGNhY2hlZFZpZXcgPSB0bXBsSUQgP1xuICAgICAgICAgICAgdGhpcy5fZW1iZWRkZWRWaWV3c01hcC5nZXQodG1wbElEKSA6XG4gICAgICAgICAgICBudWxsO1xuICAgICAgICAvLyBpZiB2aWV3IGV4aXN0cywgYnV0IHRlbXBsYXRlIGhhcyBiZWVuIGNoYW5nZWQgYW5kIHRoZXJlIGlzIGEgdmlldyBpbiB0aGUgY2FjaGUgd2l0aCB0aGUgcmVsYXRlZCB0ZW1wbGF0ZVxuICAgICAgICAvLyB0aGVuIGRldGFjaCBvbGQgdmlldyBhbmQgaW5zZXJ0IHRoZSBzdG9yZWQgb25lIHdpdGggdGhlIG1hdGNoaW5nIHRlbXBsYXRlXG4gICAgICAgIC8vIGFmdGVyIHRoYXQgdXBkYXRlIGl0cyBjb250ZXh0LlxuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmRldGFjaCh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5fdmlld1JlZikpO1xuICAgICAgICB0aGlzLl92aWV3UmVmID0gY2FjaGVkVmlldztcbiAgICAgICAgY29uc3Qgb2xkQ29udGV4dCA9IHRoaXMuX2Nsb25lQ29udGV4dChjYWNoZWRWaWV3LmNvbnRleHQpO1xuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluc2VydCh0aGlzLl92aWV3UmVmLCAwKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRXhpc3RpbmdDb250ZXh0KHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0KTtcbiAgICAgICAgdGhpcy5vbkNhY2hlZFZpZXdMb2FkZWQuZW1pdCh7IG93bmVyOiB0aGlzLCB2aWV3OiB0aGlzLl92aWV3UmVmLCBjb250ZXh0OiB0aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dCwgb2xkQ29udGV4dCB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zaG91bGRSZWNyZWF0ZVZpZXcoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjdHhDaGFuZ2UgPSBjaGFuZ2VzWydpZ3hUZW1wbGF0ZU91dGxldENvbnRleHQnXTtcbiAgICAgICAgcmV0dXJuICEhY2hhbmdlc1snaWd4VGVtcGxhdGVPdXRsZXQnXSB8fCAoY3R4Q2hhbmdlICYmIHRoaXMuX2hhc0NvbnRleHRTaGFwZUNoYW5nZWQoY3R4Q2hhbmdlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFzQ29udGV4dFNoYXBlQ2hhbmdlZChjdHhDaGFuZ2U6IFNpbXBsZUNoYW5nZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwcmV2Q3R4S2V5cyA9IE9iamVjdC5rZXlzKGN0eENoYW5nZS5wcmV2aW91c1ZhbHVlIHx8IHt9KTtcbiAgICAgICAgY29uc3QgY3VyckN0eEtleXMgPSBPYmplY3Qua2V5cyhjdHhDaGFuZ2UuY3VycmVudFZhbHVlIHx8IHt9KTtcblxuICAgICAgICBpZiAocHJldkN0eEtleXMubGVuZ3RoID09PSBjdXJyQ3R4S2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgY3VyckN0eEtleXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJldkN0eEtleXMuaW5kZXhPZihwcm9wTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdXBkYXRlRXhpc3RpbmdDb250ZXh0KGN0eDogT2JqZWN0KTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXMoY3R4KSkge1xuICAgICAgICAgICAgKDxhbnk+dGhpcy5fdmlld1JlZi5jb250ZXh0KVtwcm9wTmFtZV0gPSAoPGFueT50aGlzLmlneFRlbXBsYXRlT3V0bGV0Q29udGV4dClbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2xvbmVDb250ZXh0KGN0eDogYW55KTogYW55IHtcbiAgICAgICAgY29uc3QgY2xvbmUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBPYmplY3Qua2V5cyhjdHgpKSB7XG4gICAgICAgICAgICBjbG9uZVtwcm9wTmFtZV0gPSBjdHhbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRBY3Rpb25UeXBlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgY29uc3QgbW92ZWRWaWV3ID0gdGhpcy5pZ3hUZW1wbGF0ZU91dGxldENvbnRleHRbJ21vdmVWaWV3J107XG4gICAgICAgIGNvbnN0IHRtcGxJRCA9IHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0Wyd0ZW1wbGF0ZUlEJ107XG4gICAgICAgIGNvbnN0IGNhY2hlZFZpZXcgPSB0bXBsSUQgP1xuICAgICAgICAgICAgdGhpcy5fZW1iZWRkZWRWaWV3c01hcC5nZXQodG1wbElEKSA6XG4gICAgICAgICAgICBudWxsO1xuICAgICAgICBjb25zdCBzaG91bGRSZWNyZWF0ZSA9IHRoaXMuX3Nob3VsZFJlY3JlYXRlVmlldyhjaGFuZ2VzKTtcbiAgICAgICAgaWYgKG1vdmVkVmlldykge1xuICAgICAgICAgICAgLy8gdmlldyBpcyBtb3ZlZCBmcm9tIGV4dGVybmFsIHNvdXJjZVxuICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlT3V0bGV0QWN0aW9uLk1vdmVWaWV3O1xuICAgICAgICB9IGVsc2UgaWYgKHNob3VsZFJlY3JlYXRlICYmIGNhY2hlZFZpZXcpIHtcbiAgICAgICAgICAgIC8vIHNob3VsZCByZWNyZWF0ZSAodGVtcGxhdGUgb3IgY29udGV4dCBjaGFuZ2UpIGFuZCB0aGVyZSBpcyBhIG1hdGNoaW5nIHRlbXBsYXRlIGluIGNhY2hlXG4gICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVPdXRsZXRBY3Rpb24uVXNlQ2FjaGVkVmlldztcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fdmlld1JlZiB8fCBzaG91bGRSZWNyZWF0ZSkge1xuICAgICAgICAgICAgLy8gbm8gdmlldyBvciBzaG91bGQgcmVjcmVhdGVcbiAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZU91dGxldEFjdGlvbi5DcmVhdGVWaWV3O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaWd4VGVtcGxhdGVPdXRsZXRDb250ZXh0KSB7XG4gICAgICAgICAgICAvLyBoYXMgY29udGV4dCwgdXBkYXRlIGNvbnRleHRcbiAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZU91dGxldEFjdGlvbi5VcGRhdGVWaWV3Q29udGV4dDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmVudW0gVGVtcGxhdGVPdXRsZXRBY3Rpb24ge1xuICAgIENyZWF0ZVZpZXcsXG4gICAgTW92ZVZpZXcsXG4gICAgVXNlQ2FjaGVkVmlldyxcbiAgICBVcGRhdGVWaWV3Q29udGV4dFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElWaWV3Q2hhbmdlRXZlbnRBcmdzIHtcbiAgICBvd25lcjogSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmU7XG4gICAgdmlldzogRW1iZWRkZWRWaWV3UmVmPGFueT47XG4gICAgY29udGV4dDogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDYWNoZWRWaWV3TG9hZGVkRXZlbnRBcmdzIGV4dGVuZHMgSVZpZXdDaGFuZ2VFdmVudEFyZ3Mge1xuICAgIG9sZENvbnRleHQ6IGFueTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmVdLFxuICAgIGVudHJ5Q29tcG9uZW50czogW10sXG4gICAgZXhwb3J0czogW0lneFRlbXBsYXRlT3V0bGV0RGlyZWN0aXZlXSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXVxufSlcblxuZXhwb3J0IGNsYXNzIElneFRlbXBsYXRlT3V0bGV0TW9kdWxlIHtcbn1cbiJdfQ==