ag-grid-angular
Version:
AG Grid Angular Component
88 lines • 14.6 kB
JavaScript
import { Injectable, NgZone } from '@angular/core';
import { VanillaFrameworkOverrides } from 'ag-grid-community';
import { AngularFrameworkEventListenerService } from './angularFrameworkEventListenerService';
import * as i0 from "@angular/core";
export class AngularFrameworkOverrides extends VanillaFrameworkOverrides {
constructor(_ngZone) {
super('angular');
this._ngZone = _ngZone;
this.batchFrameworkComps = true;
// Flag used to control Zone behaviour when running tests as many test features rely on Zone.
this.isRunningWithinTestZone = false;
// Make all events run outside Angular as they often trigger the setup of event listeners
// By having the event listeners outside Angular we can avoid triggering change detection
// This also means that if a user calls an AG Grid API method from within their component
// the internal side effects will not trigger change detection. Without this the events would
// run inside Angular and trigger change detection as the source of the event was within the angular zone.
this.wrapIncoming = (callback, source) => this.runOutside(callback, source);
/**
* Make sure that any code that is executed outside of AG Grid is running within the Angular zone.
* This means users can update templates and use binding without having to do anything extra.
*/
this.wrapOutgoing = (callback) => this.runInsideAngular(callback);
this.isRunningWithinTestZone =
window?.AG_GRID_UNDER_TEST ?? !!window?.Zone?.AsyncTestZoneSpec;
if (!this._ngZone) {
this.runOutside = (callback) => callback();
}
else if (this.isRunningWithinTestZone) {
this.runOutside = (callback, source) => {
if (source === 'resize-observer' || source === 'popupPositioning') {
// ensure resize observer callbacks are run outside of Angular even under test due to Jest not supporting ResizeObserver
// which means it just loops continuously with a setTimeout with no way to flush the queue or have fixture.whenStable() resolve.
return this._ngZone.runOutsideAngular(callback);
}
// When under test run inside Angular so that tests can use fixture.whenStable() to wait for async operations to complete.
return callback();
};
}
else {
this.runOutside = (callback) => this._ngZone.runOutsideAngular(callback);
}
}
/**
* The shouldWrapOutgoing property is used to determine if events should be run outside of Angular or not.
* If an event handler is registered outside of Angular then we should not wrap the event handler
* with runInsideAngular() as the user may not have wanted this.
* This is also used to not wrap internal event listeners that are registered with RowNodes and Columns.
*/
get shouldWrapOutgoing() {
return this._ngZone && NgZone.isInAngularZone();
}
createLocalEventListenerWrapper(existingFrameworkEventListenerService, localEventService) {
if (this.shouldWrapOutgoing) {
return (existingFrameworkEventListenerService ??
(() => {
localEventService.setFrameworkOverrides(this);
return new AngularFrameworkEventListenerService(this);
})());
}
return undefined;
}
createGlobalEventListenerWrapper() {
return new AngularFrameworkEventListenerService(this);
}
isFrameworkComponent(comp) {
if (!comp) {
return false;
}
const prototype = comp.prototype;
return prototype && 'agInit' in prototype;
}
runInsideAngular(callback) {
if (!this._ngZone || NgZone.isInAngularZone()) {
return callback();
}
// Check for _ngZone existence as it is not present when Zoneless
return this._ngZone.run(callback);
}
runOutsideAngular(callback, source) {
return this.runOutside(callback, source);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularFrameworkOverrides, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularFrameworkOverrides }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularFrameworkOverrides, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i0.NgZone }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhckZyYW1ld29ya092ZXJyaWRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FnLWdyaWQtYW5ndWxhci9zcmMvbGliL2FuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFPbkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7O0FBRzlGLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSx5QkFBeUI7SUFRcEUsWUFBb0IsT0FBZTtRQUMvQixLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFERCxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBUFYsd0JBQW1CLEdBQVksSUFBSSxDQUFDO1FBRTdELDZGQUE2RjtRQUNyRiw0QkFBdUIsR0FBWSxLQUFLLENBQUM7UUEyQmpELHlGQUF5RjtRQUN6Rix5RkFBeUY7UUFDekYseUZBQXlGO1FBQ3pGLDZGQUE2RjtRQUM3RiwwR0FBMEc7UUFDakcsaUJBQVksR0FBMkUsQ0FDNUYsUUFBUSxFQUNSLE1BQU0sRUFDUixFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFZdkM7OztXQUdHO1FBQ00saUJBQVksR0FBZ0MsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQTVDL0YsSUFBSSxDQUFDLHVCQUF1QjtZQUN2QixNQUFjLEVBQUUsa0JBQWtCLElBQUksQ0FBQyxDQUFFLE1BQWMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUM7UUFFdEYsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNuQyxJQUFJLE1BQU0sS0FBSyxpQkFBaUIsSUFBSSxNQUFNLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztvQkFDaEUsd0hBQXdIO29CQUN4SCxnSUFBZ0k7b0JBQ2hJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztnQkFDRCwwSEFBMEg7Z0JBQzFILE9BQU8sUUFBUSxFQUFFLENBQUM7WUFDdEIsQ0FBQyxDQUFDO1FBQ04sQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdFLENBQUM7SUFDTCxDQUFDO0lBWUQ7Ozs7O09BS0c7SUFDSCxJQUFXLGtCQUFrQjtRQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFRTSwrQkFBK0IsQ0FDbEMscUNBQTJGLEVBQzNGLGlCQUF5QztRQUV6QyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLE9BQU8sQ0FDSCxxQ0FBcUM7Z0JBQ3JDLENBQUMsR0FBRyxFQUFFO29CQUNGLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QyxPQUFPLElBQUksb0NBQW9DLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFELENBQUMsQ0FBQyxFQUFFLENBQ1AsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRU0sZ0NBQWdDO1FBQ25DLE9BQU8sSUFBSSxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRVEsb0JBQW9CLENBQUMsSUFBUztRQUNuQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDUixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNqQyxPQUFPLFNBQVMsSUFBSSxRQUFRLElBQUksU0FBUyxDQUFDO0lBQzlDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBSSxRQUFpQjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxPQUFPLFFBQVEsRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxpRUFBaUU7UUFDakUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsaUJBQWlCLENBQUksUUFBaUIsRUFBRSxNQUF5QztRQUM3RSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7K0dBakdRLHlCQUF5QjttSEFBekIseUJBQXlCOzs0RkFBekIseUJBQXlCO2tCQURyQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBGcmFtZXdvcmtPdmVycmlkZXNJbmNvbWluZ1NvdXJjZSxcbiAgICBJRnJhbWV3b3JrRXZlbnRMaXN0ZW5lclNlcnZpY2UsXG4gICAgTG9jYWxFdmVudFNlcnZpY2UsXG59IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcbmltcG9ydCB7IFZhbmlsbGFGcmFtZXdvcmtPdmVycmlkZXMgfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XG5cbmltcG9ydCB7IEFuZ3VsYXJGcmFtZXdvcmtFdmVudExpc3RlbmVyU2VydmljZSB9IGZyb20gJy4vYW5ndWxhckZyYW1ld29ya0V2ZW50TGlzdGVuZXJTZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMgZXh0ZW5kcyBWYW5pbGxhRnJhbWV3b3JrT3ZlcnJpZGVzIHtcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgYmF0Y2hGcmFtZXdvcmtDb21wczogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvLyBGbGFnIHVzZWQgdG8gY29udHJvbCBab25lIGJlaGF2aW91ciB3aGVuIHJ1bm5pbmcgdGVzdHMgYXMgbWFueSB0ZXN0IGZlYXR1cmVzIHJlbHkgb24gWm9uZS5cbiAgICBwcml2YXRlIGlzUnVubmluZ1dpdGhpblRlc3Rab25lOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIHJ1bk91dHNpZGU6IDxUPihjYWxsYmFjazogKCkgPT4gVCwgc291cmNlPzogRnJhbWV3b3JrT3ZlcnJpZGVzSW5jb21pbmdTb3VyY2UpID0+IFQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSkge1xuICAgICAgICBzdXBlcignYW5ndWxhcicpO1xuXG4gICAgICAgIHRoaXMuaXNSdW5uaW5nV2l0aGluVGVzdFpvbmUgPVxuICAgICAgICAgICAgKHdpbmRvdyBhcyBhbnkpPy5BR19HUklEX1VOREVSX1RFU1QgPz8gISEod2luZG93IGFzIGFueSk/LlpvbmU/LkFzeW5jVGVzdFpvbmVTcGVjO1xuXG4gICAgICAgIGlmICghdGhpcy5fbmdab25lKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bk91dHNpZGUgPSAoY2FsbGJhY2spID0+IGNhbGxiYWNrKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1J1bm5pbmdXaXRoaW5UZXN0Wm9uZSkge1xuICAgICAgICAgICAgdGhpcy5ydW5PdXRzaWRlID0gKGNhbGxiYWNrLCBzb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlID09PSAncmVzaXplLW9ic2VydmVyJyB8fCBzb3VyY2UgPT09ICdwb3B1cFBvc2l0aW9uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgcmVzaXplIG9ic2VydmVyIGNhbGxiYWNrcyBhcmUgcnVuIG91dHNpZGUgb2YgQW5ndWxhciBldmVuIHVuZGVyIHRlc3QgZHVlIHRvIEplc3Qgbm90IHN1cHBvcnRpbmcgUmVzaXplT2JzZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgaXQganVzdCBsb29wcyBjb250aW51b3VzbHkgd2l0aCBhIHNldFRpbWVvdXQgd2l0aCBubyB3YXkgdG8gZmx1c2ggdGhlIHF1ZXVlIG9yIGhhdmUgZml4dHVyZS53aGVuU3RhYmxlKCkgcmVzb2x2ZS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcihjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdoZW4gdW5kZXIgdGVzdCBydW4gaW5zaWRlIEFuZ3VsYXIgc28gdGhhdCB0ZXN0cyBjYW4gdXNlIGZpeHR1cmUud2hlblN0YWJsZSgpIHRvIHdhaXQgZm9yIGFzeW5jIG9wZXJhdGlvbnMgdG8gY29tcGxldGUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ydW5PdXRzaWRlID0gKGNhbGxiYWNrKSA9PiB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWFrZSBhbGwgZXZlbnRzIHJ1biBvdXRzaWRlIEFuZ3VsYXIgYXMgdGhleSBvZnRlbiB0cmlnZ2VyIHRoZSBzZXR1cCBvZiBldmVudCBsaXN0ZW5lcnNcbiAgICAvLyBCeSBoYXZpbmcgdGhlIGV2ZW50IGxpc3RlbmVycyBvdXRzaWRlIEFuZ3VsYXIgd2UgY2FuIGF2b2lkIHRyaWdnZXJpbmcgY2hhbmdlIGRldGVjdGlvblxuICAgIC8vIFRoaXMgYWxzbyBtZWFucyB0aGF0IGlmIGEgdXNlciBjYWxscyBhbiBBRyBHcmlkIEFQSSBtZXRob2QgZnJvbSB3aXRoaW4gdGhlaXIgY29tcG9uZW50XG4gICAgLy8gdGhlIGludGVybmFsIHNpZGUgZWZmZWN0cyB3aWxsIG5vdCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24uIFdpdGhvdXQgdGhpcyB0aGUgZXZlbnRzIHdvdWxkXG4gICAgLy8gcnVuIGluc2lkZSBBbmd1bGFyIGFuZCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gYXMgdGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQgd2FzIHdpdGhpbiB0aGUgYW5ndWxhciB6b25lLlxuICAgIG92ZXJyaWRlIHdyYXBJbmNvbWluZzogPFQ+KGNhbGxiYWNrOiAoKSA9PiBULCBzb3VyY2U/OiBGcmFtZXdvcmtPdmVycmlkZXNJbmNvbWluZ1NvdXJjZSkgPT4gVCA9IChcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgIHNvdXJjZVxuICAgICkgPT4gdGhpcy5ydW5PdXRzaWRlKGNhbGxiYWNrLCBzb3VyY2UpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNob3VsZFdyYXBPdXRnb2luZyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBldmVudHMgc2hvdWxkIGJlIHJ1biBvdXRzaWRlIG9mIEFuZ3VsYXIgb3Igbm90LlxuICAgICAqIElmIGFuIGV2ZW50IGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBvdXRzaWRlIG9mIEFuZ3VsYXIgdGhlbiB3ZSBzaG91bGQgbm90IHdyYXAgdGhlIGV2ZW50IGhhbmRsZXJcbiAgICAgKiB3aXRoIHJ1bkluc2lkZUFuZ3VsYXIoKSBhcyB0aGUgdXNlciBtYXkgbm90IGhhdmUgd2FudGVkIHRoaXMuXG4gICAgICogVGhpcyBpcyBhbHNvIHVzZWQgdG8gbm90IHdyYXAgaW50ZXJuYWwgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCBSb3dOb2RlcyBhbmQgQ29sdW1ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3VsZFdyYXBPdXRnb2luZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25nWm9uZSAmJiBOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZSBzdXJlIHRoYXQgYW55IGNvZGUgdGhhdCBpcyBleGVjdXRlZCBvdXRzaWRlIG9mIEFHIEdyaWQgaXMgcnVubmluZyB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZS5cbiAgICAgKiBUaGlzIG1lYW5zIHVzZXJzIGNhbiB1cGRhdGUgdGVtcGxhdGVzIGFuZCB1c2UgYmluZGluZyB3aXRob3V0IGhhdmluZyB0byBkbyBhbnl0aGluZyBleHRyYS5cbiAgICAgKi9cbiAgICBvdmVycmlkZSB3cmFwT3V0Z29pbmc6IDxUPihjYWxsYmFjazogKCkgPT4gVCkgPT4gVCA9IChjYWxsYmFjaykgPT4gdGhpcy5ydW5JbnNpZGVBbmd1bGFyKGNhbGxiYWNrKTtcblxuICAgIHB1YmxpYyBjcmVhdGVMb2NhbEV2ZW50TGlzdGVuZXJXcmFwcGVyKFxuICAgICAgICBleGlzdGluZ0ZyYW1ld29ya0V2ZW50TGlzdGVuZXJTZXJ2aWNlOiBJRnJhbWV3b3JrRXZlbnRMaXN0ZW5lclNlcnZpY2U8YW55LCBhbnk+IHwgdW5kZWZpbmVkLFxuICAgICAgICBsb2NhbEV2ZW50U2VydmljZTogTG9jYWxFdmVudFNlcnZpY2U8YW55PlxuICAgICk6IElGcmFtZXdvcmtFdmVudExpc3RlbmVyU2VydmljZTxhbnksIGFueT4gfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRXcmFwT3V0Z29pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdGcmFtZXdvcmtFdmVudExpc3RlbmVyU2VydmljZSA/P1xuICAgICAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsRXZlbnRTZXJ2aWNlLnNldEZyYW1ld29ya092ZXJyaWRlcyh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBbmd1bGFyRnJhbWV3b3JrRXZlbnRMaXN0ZW5lclNlcnZpY2UodGhpcyk7XG4gICAgICAgICAgICAgICAgfSkoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUdsb2JhbEV2ZW50TGlzdGVuZXJXcmFwcGVyKCk6IElGcmFtZXdvcmtFdmVudExpc3RlbmVyU2VydmljZTxhbnksIGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IEFuZ3VsYXJGcmFtZXdvcmtFdmVudExpc3RlbmVyU2VydmljZSh0aGlzKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBpc0ZyYW1ld29ya0NvbXBvbmVudChjb21wOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFjb21wKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvdG90eXBlID0gY29tcC5wcm90b3R5cGU7XG4gICAgICAgIHJldHVybiBwcm90b3R5cGUgJiYgJ2FnSW5pdCcgaW4gcHJvdG90eXBlO1xuICAgIH1cblxuICAgIHJ1bkluc2lkZUFuZ3VsYXI8VD4oY2FsbGJhY2s6ICgpID0+IFQpOiBUIHtcbiAgICAgICAgaWYgKCF0aGlzLl9uZ1pvbmUgfHwgTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciBfbmdab25lIGV4aXN0ZW5jZSBhcyBpdCBpcyBub3QgcHJlc2VudCB3aGVuIFpvbmVsZXNzXG4gICAgICAgIHJldHVybiB0aGlzLl9uZ1pvbmUucnVuKGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBydW5PdXRzaWRlQW5ndWxhcjxUPihjYWxsYmFjazogKCkgPT4gVCwgc291cmNlPzogRnJhbWV3b3JrT3ZlcnJpZGVzSW5jb21pbmdTb3VyY2UpOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuT3V0c2lkZShjYWxsYmFjaywgc291cmNlKTtcbiAgICB9XG59XG4iXX0=