ag-grid-angular
Version:
AG Grid Angular Component
115 lines • 18 kB
JavaScript
import { ViewContainerRef } from '@angular/core';
import { Component, Injectable, inject } from '@angular/core';
import { BaseComponentWrapper, _removeFromParent } from 'ag-grid-community';
import * as i0 from "@angular/core";
// To speed up the removal of custom components we create a number of shards to contain them.
// Removing a single component calls a function within Angular called removeFromArray.
// This is a lot faster if the array is smaller.
export class AgComponentContainer {
constructor() {
this.vcr = inject(ViewContainerRef);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgComponentContainer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AgComponentContainer, selector: "ag-component-container", ngImport: i0, template: '', isInline: true }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgComponentContainer, decorators: [{
type: Component,
args: [{
selector: 'ag-component-container',
template: '',
}]
}] });
const NUM_SHARDS = 16;
let shardIdx = 0;
function createComponentContainers(vcr) {
const containerMap = new Map();
for (let i = 0; i < NUM_SHARDS; i++) {
const container = vcr.createComponent(AgComponentContainer);
containerMap.set(i, container);
_removeFromParent(container.location.nativeElement);
}
return containerMap;
}
/**
* These methods are called on a hot path for every row so we do not want to enter / exit NgZone each time.
* Also these methods should not be used to update the UI, so we don't need to run them inside Angular.
*/
const runOutsideMethods = new Set(['doesFilterPass', 'isFilterActive']);
export class AngularFrameworkComponentWrapper extends BaseComponentWrapper {
setViewContainerRef(viewContainerRef, angularFrameworkOverrides) {
this.viewContainerRef = viewContainerRef;
this.angularFrameworkOverrides = angularFrameworkOverrides;
}
createWrapper(OriginalConstructor) {
const angularFrameworkOverrides = this.angularFrameworkOverrides;
const that = this;
that.compShards ??= createComponentContainers(this.viewContainerRef);
class DynamicAgNg2Component extends BaseGuiComponent {
init(params) {
angularFrameworkOverrides.runInsideAngular(() => {
super.init(params);
this._componentRef.changeDetectorRef.detectChanges();
});
}
createComponent() {
return that.createComponent(OriginalConstructor);
}
hasMethod(name) {
return wrapper.getFrameworkComponentInstance()[name] != null;
}
callMethod(name, args) {
const componentRef = this.getFrameworkComponentInstance();
const methodCall = componentRef[name];
if (runOutsideMethods.has(name)) {
return methodCall.apply(componentRef, args);
}
return angularFrameworkOverrides.runInsideAngular(() => methodCall.apply(componentRef, args));
}
addMethod(name, callback) {
wrapper[name] = callback;
}
}
const wrapper = new DynamicAgNg2Component();
return wrapper;
}
createComponent(componentType) {
shardIdx = (shardIdx + 1) % NUM_SHARDS;
const container = this.compShards.get(shardIdx);
return container.instance.vcr.createComponent(componentType);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularFrameworkComponentWrapper, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularFrameworkComponentWrapper }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularFrameworkComponentWrapper, decorators: [{
type: Injectable
}] });
class BaseGuiComponent {
init(params) {
this._params = params;
this._componentRef = this.createComponent();
this._agAwareComponent = this._componentRef.instance;
this._frameworkComponentInstance = this._componentRef.instance;
this._eGui = this._componentRef.location.nativeElement;
// Angular appends the component to the DOM, so remove it
_removeFromParent(this._eGui);
this._agAwareComponent.agInit(this._params);
}
getGui() {
return this._eGui;
}
/** `getGui()` returns the `ng-component` element. This returns the actual root element. */
getRootElement() {
const firstChild = this._eGui.firstChild;
return firstChild;
}
destroy() {
if (this._frameworkComponentInstance && typeof this._frameworkComponentInstance.destroy === 'function') {
this._frameworkComponentInstance.destroy();
}
this._componentRef?.destroy();
}
getFrameworkComponentInstance() {
return this._frameworkComponentInstance;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhckZyYW1ld29ya0NvbXBvbmVudFdyYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hZy1ncmlkLWFuZ3VsYXIvc3JjL2xpYi9hbmd1bGFyRnJhbWV3b3JrQ29tcG9uZW50V3JhcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUs1RSw2RkFBNkY7QUFDN0Ysc0ZBQXNGO0FBQ3RGLGdEQUFnRDtBQUtoRCxNQUFNLE9BQU8sb0JBQW9CO0lBSmpDO1FBS1csUUFBRyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3pDOytHQUZZLG9CQUFvQjttR0FBcEIsb0JBQW9CLDhEQUZuQixFQUFFOzs0RkFFSCxvQkFBb0I7a0JBSmhDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsUUFBUSxFQUFFLEVBQUU7aUJBQ2Y7O0FBSUQsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQUVqQixTQUFTLHlCQUF5QixDQUFDLEdBQXFCO0lBQ3BELE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUE4QyxDQUFDO0lBQzNFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDakMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVELFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxD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RUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUNyRCxJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDL0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDdkQseURBQXlEO1FBQ3pELGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5QixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU0sTUFBTTtRQUNULE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsMkZBQTJGO0lBQ3BGLGNBQWM7UUFDakIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDekMsT0FBTyxVQUF5QixDQUFDO0lBQ3JDLENBQUM7SUFFTSxPQUFPO1FBQ1YsSUFBSSxJQUFJLENBQUMsMkJBQTJCLElBQUksT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRTtZQUNwRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDOUM7UUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTSw2QkFBNkI7UUFDaEMsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUM7SUFDNUMsQ0FBQztDQUdKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb21wb25lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgRnJhbWV3b3JrQ29tcG9uZW50V3JhcHBlciwgSUZpbHRlciwgV3JhcHBhYmxlSW50ZXJmYWNlIH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudFdyYXBwZXIsIF9yZW1vdmVGcm9tUGFyZW50IH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xuXG5pbXBvcnQgdHlwZSB7IEFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMgfSBmcm9tICcuL2FuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMnO1xuaW1wb3J0IHR5cGUgeyBBZ0ZyYW1ld29ya0NvbXBvbmVudCB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbi8vIFRvIHNwZWVkIHVwIHRoZSByZW1vdmFsIG9mIGN1c3RvbSBjb21wb25lbnRzIHdlIGNyZWF0ZSBhIG51bWJlciBvZiBzaGFyZHMgdG8gY29udGFpbiB0aGVtLlxuLy8gUmVtb3ZpbmcgYSBzaW5nbGUgY29tcG9uZW50IGNhbGxzIGEgZnVuY3Rpb24gd2l0aGluIEFuZ3VsYXIgY2FsbGVkIHJlbW92ZUZyb21BcnJheS5cbi8vIFRoaXMgaXMgYSBsb3QgZmFzdGVyIGlmIHRoZSBhcnJheSBpcyBzbWFsbGVyLlxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhZy1jb21wb25lbnQtY29udGFpbmVyJyxcbiAgICB0ZW1wbGF0ZTogJycsXG59KVxuZXhwb3J0IGNsYXNzIEFnQ29tcG9uZW50Q29udGFpbmVyIHtcbiAgICBwdWJsaWMgdmNyID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xufVxuY29uc3QgTlVNX1NIQVJEUyA9IDE2O1xubGV0IHNoYXJkSWR4ID0gMDtcblxuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50Q29udGFpbmVycyh2Y3I6IFZpZXdDb250YWluZXJSZWYpOiBNYXA8bnVtYmVyLCBDb21wb25lbnRSZWY8QWdDb21wb25lbnRDb250YWluZXI+PiB7XG4gICAgY29uc3QgY29udGFpbmVyTWFwID0gbmV3IE1hcDxudW1iZXIsIENvbXBvbmVudFJlZjxBZ0NvbXBvbmVudENvbnRhaW5lcj4+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOVU1fU0hBUkRTOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdmNyLmNyZWF0ZUNvbXBvbmVudChBZ0NvbXBvbmVudENvbnRhaW5lcik7XG4gICAgICAgIGNvbnRhaW5lck1hcC5zZXQoaSwgY29udGFpbmVyKTtcbiAgICAgICAgX3JlbW92ZUZyb21QYXJlbnQoY29udGFpbmVyLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGFpbmVyTWFwO1xufVxuXG4vKipcbiAqIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBvbiBhIGhvdCBwYXRoIGZvciBldmVyeSByb3cgc28gd2UgZG8gbm90IHdhbnQgdG8gZW50ZXIgLyBleGl0IE5nWm9uZSBlYWNoIHRpbWUuXG4gKiBBbHNvIHRoZXNlIG1ldGhvZHMgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgVUksIHNvIHdlIGRvbid0IG5lZWQgdG8gcnVuIHRoZW0gaW5zaWRlIEFuZ3VsYXIuXG4gKi9cbmNvbnN0IHJ1bk91dHNpZGVNZXRob2RzID0gbmV3IFNldDxrZXlvZiBJRmlsdGVyPihbJ2RvZXNGaWx0ZXJQYXNzJywgJ2lzRmlsdGVyQWN0aXZlJ10pO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQW5ndWxhckZyYW1ld29ya0NvbXBvbmVudFdyYXBwZXJcbiAgICBleHRlbmRzIEJhc2VDb21wb25lbnRXcmFwcGVyPFdyYXBwYWJsZUludGVyZmFjZT5cbiAgICBpbXBsZW1lbnRzIEZyYW1ld29ya0NvbXBvbmVudFdyYXBwZXJcbntcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWY7XG4gICAgcHJpdmF0ZSBhbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzOiBBbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzO1xuICAgIHByaXZhdGUgY29tcFNoYXJkczogTWFwPG51bWJlciwgQ29tcG9uZW50UmVmPEFnQ29tcG9uZW50Q29udGFpbmVyPj47XG5cbiAgICBwdWJsaWMgc2V0Vmlld0NvbnRhaW5lclJlZihcbiAgICAgICAgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgYW5ndWxhckZyYW1ld29ya092ZXJyaWRlczogQW5ndWxhckZyYW1ld29ya092ZXJyaWRlc1xuICAgICkge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYgPSB2aWV3Q29udGFpbmVyUmVmO1xuICAgICAgICB0aGlzLmFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMgPSBhbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVXcmFwcGVyKE9yaWdpbmFsQ29uc3RydWN0b3I6IHsgbmV3ICgpOiBhbnkgfSk6IFdyYXBwYWJsZUludGVyZmFjZSB7XG4gICAgICAgIGNvbnN0IGFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMgPSB0aGlzLmFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXM7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICB0aGF0LmNvbXBTaGFyZHMgPz89IGNyZWF0ZUNvbXBvbmVudENvbnRhaW5lcnModGhpcy52aWV3Q29udGFpbmVyUmVmKTtcblxuICAgICAgICBjbGFzcyBEeW5hbWljQWdOZzJDb21wb25lbnRcbiAgICAgICAgICAgIGV4dGVuZHMgQmFzZUd1aUNvbXBvbmVudDxhbnksIEFnRnJhbWV3b3JrQ29tcG9uZW50PGFueT4+XG4gICAgICAgICAgICBpbXBsZW1lbnRzIFdyYXBwYWJsZUludGVyZmFjZVxuICAgICAgICB7XG4gICAgICAgICAgICBvdmVycmlkZSBpbml0KHBhcmFtczogYW55KTogdm9pZCB7XG4gICAgICAgICAgICAgICAgYW5ndWxhckZyYW1ld29ya092ZXJyaWRlcy5ydW5JbnNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuaW5pdChwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcm90ZWN0ZWQgY3JlYXRlQ29tcG9uZW50KCk6IENvbXBvbmVudFJlZjxBZ0ZyYW1ld29ya0NvbXBvbmVudDxhbnk+PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuY3JlYXRlQ29tcG9uZW50KE9yaWdpbmFsQ29uc3RydWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBoYXNNZXRob2QobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXIuZ2V0RnJhbWV3b3JrQ29tcG9uZW50SW5zdGFuY2UoKVtuYW1lXSAhPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYWxsTWV0aG9kKG5hbWU6IHN0cmluZywgYXJnczogSUFyZ3VtZW50cyk6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuZ2V0RnJhbWV3b3JrQ29tcG9uZW50SW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRob2RDYWxsID0gY29tcG9uZW50UmVmW25hbWVdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJ1bk91dHNpZGVNZXRob2RzLmhhcyhuYW1lIGFzIGFueSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZENhbGwuYXBwbHkoY29tcG9uZW50UmVmLCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMucnVuSW5zaWRlQW5ndWxhcigoKSA9PiBtZXRob2RDYWxsLmFwcGx5KGNvbXBvbmVudFJlZiwgYXJncykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhZGRNZXRob2QobmFtZTogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICAod3JhcHBlciBhcyBhbnkpW25hbWVdID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IG5ldyBEeW5hbWljQWdOZzJDb21wb25lbnQoKTtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUNvbXBvbmVudDxUPihjb21wb25lbnRUeXBlOiB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0pOiBDb21wb25lbnRSZWY8VD4ge1xuICAgICAgICBzaGFyZElkeCA9IChzaGFyZElkeCArIDEpICUgTlVNX1NIQVJEUztcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb21wU2hhcmRzLmdldChzaGFyZElkeCkhO1xuICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc3RhbmNlLnZjci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7XG4gICAgfVxufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlR3VpQ29tcG9uZW50PFAsIFQgZXh0ZW5kcyBBZ0ZyYW1ld29ya0NvbXBvbmVudDxQPj4ge1xuICAgIHByb3RlY3RlZCBfcGFyYW1zOiBQO1xuICAgIHByb3RlY3RlZCBfZUd1aTogSFRNTEVsZW1lbnQ7XG4gICAgcHJvdGVjdGVkIF9jb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxUPjtcbiAgICBwcm90ZWN0ZWQgX2FnQXdhcmVDb21wb25lbnQ6IFQ7XG4gICAgcHJvdGVjdGVkIF9mcmFtZXdvcmtDb21wb25lbnRJbnN0YW5jZTogYW55OyAvLyB0aGUgdXNlcnMgY29tcG9uZW50IC0gZm9yIGFjY2Vzc2luZyBtZXRob2RzIHRoZXkgY3JlYXRlXG5cbiAgICBwcm90ZWN0ZWQgaW5pdChwYXJhbXM6IFApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudFJlZiA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KCk7XG4gICAgICAgIHRoaXMuX2FnQXdhcmVDb21wb25lbnQgPSB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2U7XG4gICAgICAgIHRoaXMuX2ZyYW1ld29ya0NvbXBvbmVudEluc3RhbmNlID0gdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlO1xuICAgICAgICB0aGlzLl9lR3VpID0gdGhpcy5fY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIC8vIEFuZ3VsYXIgYXBwZW5kcyB0aGUgY29tcG9uZW50IHRvIHRoZSBET00sIHNvIHJlbW92ZSBpdFxuICAgICAgICBfcmVtb3ZlRnJvbVBhcmVudCh0aGlzLl9lR3VpKTtcblxuICAgICAgICB0aGlzLl9hZ0F3YXJlQ29tcG9uZW50LmFnSW5pdCh0aGlzLl9wYXJhbXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHdWkoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZUd1aTtcbiAgICB9XG5cbiAgICAvKiogYGdldEd1aSgpYCByZXR1cm5zIHRoZSBgbmctY29tcG9uZW50YCBlbGVtZW50LiBUaGlzIHJldHVybnMgdGhlIGFjdHVhbCByb290IGVsZW1lbnQuICovXG4gICAgcHVibGljIGdldFJvb3RFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IHRoaXMuX2VHdWkuZmlyc3RDaGlsZDtcbiAgICAgICAgcmV0dXJuIGZpcnN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFtZXdvcmtDb21wb25lbnRJbnN0YW5jZSAmJiB0eXBlb2YgdGhpcy5fZnJhbWV3b3JrQ29tcG9uZW50SW5zdGFuY2UuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fZnJhbWV3b3JrQ29tcG9uZW50SW5zdGFuY2UuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbXBvbmVudFJlZj8uZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGcmFtZXdvcmtDb21wb25lbnRJbnN0YW5jZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWV3b3JrQ29tcG9uZW50SW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZUNvbXBvbmVudCgpOiBDb21wb25lbnRSZWY8VD47XG59XG4iXX0=