@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
170 lines • 22.5 kB
JavaScript
import { Component, Injector, Input, ViewChild } from '@angular/core';
import { WrappedBoolean } from './models/wrapped-boolean';
import { TemplateAppearance } from '../models/template-appearance';
import { DATA_FIELD_PORTAL_DATA } from "../models/data-field-portal-data-injection-token";
import * as i0 from "@angular/core";
import * as i1 from "../../navigation/quick-panel/components/paper-view.service";
import * as i2 from "../../configuration/configuration.service";
import * as i3 from "../../registry/component-registry.service";
/**
* Provides a responsive layout to data fields where their appearance can change based on the width of space they have available.
*
* If the width of the available space is less than the `layoutChangeWidthBreakpoint` then the provided `dataFieldTemplate` is displayed at
* 100% width. If the width is greater or equal to the breakpoint the datafield template occupies the right half and the left half contains
* it's title.
*
* If the datafield's layout is set to `TemplateAppearance.MATERIAL` the field always occupies 100% of the available space
* regardless of it's width.
*
* See {@link DataField} and {@link TemplateAppearance} for more information.
*/
export class AbstractDataFieldTemplateComponent {
_paperView;
_config;
_componentRegistry;
injector;
/**
* Content of the datafield that should be displayed in the template
*/
dataFieldTemplate;
/**
* If the available space has a width smaller that this breakpoint the datafield will fill 100% of the available space.
*
* The breakpoint is only taken into consideration if `TemplateAppearance.NETGRIF` is set on the data field.
*
* See [DataField.layout]{@link DataField#layout} for more information.
*/
layoutChangeWidthBreakpoint = 250;
/**
* Field offset defined by task
*/
offset = 0;
_additionalFieldProperties;
container;
_dataField;
_isConfiguredNetgrifTemplate = true;
_isNetgrifTemplate = true;
_componentPortal;
/**
* @ignore
* The value determines whether the layout should be "small" or not. Data field fills 100% of the width in "small" layout.
*/
_showLargeLayout = new WrappedBoolean();
constructor(_paperView, _config, _componentRegistry, injector) {
this._paperView = _paperView;
this._config = _config;
this._componentRegistry = _componentRegistry;
this.injector = injector;
const configuredTemplate = this._config.getDatafieldConfiguration();
this._isConfiguredNetgrifTemplate = configuredTemplate
&& configuredTemplate.template
&& configuredTemplate.template === TemplateAppearance.NETGRIF;
}
ngOnInit() {
if (!!this._dataField && !!this._dataField.layout && !!this._dataField.layout.offset) {
this.offset += this._dataField.layout.offset;
}
this._showLargeLayout.value = this.evaluateTemplate();
this._dataField.resolveAppearance(this._config);
}
get showLargeLayout() {
return this._showLargeLayout;
}
/**
* Datafield model object that should be displayed in the template
*/
set dataField(dataField) {
this._dataField = dataField;
if (this._dataField.layout && this._dataField.layout.template) {
this._isNetgrifTemplate = this._dataField.layout.template === TemplateAppearance.NETGRIF;
}
else {
this._isNetgrifTemplate = this._isConfiguredNetgrifTemplate;
}
this._componentPortal = this.resolveComponentPortal(this.dataField, this.showLargeLayout, this.dataField.formControlRef, this.additionalFieldProperties);
}
get dataField() {
return this._dataField;
}
get componentPortal() {
return this._componentPortal;
}
get additionalFieldProperties() {
return this._additionalFieldProperties;
}
set additionalFieldProperties(value) {
this._additionalFieldProperties = value;
}
/**
* Function that is called when the Component changes dimension and
* determines whether the "small" or "large" layout should be displayed.
* @param event - event containing the new width of this Component
*/
evaluateTemplateCondition() {
(this.container && this.container.nativeElement && this.container.nativeElement.offsetWidth) ?
this._showLargeLayout.value =
this.container.nativeElement.offsetWidth >= this.layoutChangeWidthBreakpoint && this.evaluateTemplate() :
this._showLargeLayout.value = this.evaluateTemplate();
return this._showLargeLayout.value;
}
hasComponent() {
return this._componentRegistry.contains(this.dataField.getTypedComponentType());
}
resolveComponentPortal(dataField, showLargeLayout, formControlRef, additionalFieldProperties) {
if (this.hasComponent()) {
const portalInjector = Injector.create({
providers: [
{
provide: DATA_FIELD_PORTAL_DATA,
useValue: {
dataField: dataField,
showLargeLayout: showLargeLayout,
formControlRef: formControlRef,
additionalFieldProperties
}
}
],
parent: this.injector
});
return this._componentRegistry.get(this.dataField.getTypedComponentType(), portalInjector);
}
return undefined;
}
/**
* @returns `false` if the data field uses the `TemplateAppearance.MATERIAL` and `true` otherwise.
*/
evaluateTemplate() {
if (!this._dataField) {
return true;
}
return this._isNetgrifTemplate;
}
isPaperView() {
return this._paperView.paperView;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractDataFieldTemplateComponent, deps: [{ token: i1.PaperViewService }, { token: i2.ConfigurationService }, { token: i3.ComponentRegistryService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AbstractDataFieldTemplateComponent, selector: "ncc-abstract-datafield-template", inputs: { dataFieldTemplate: "dataFieldTemplate", layoutChangeWidthBreakpoint: "layoutChangeWidthBreakpoint", offset: "offset", _additionalFieldProperties: "_additionalFieldProperties", dataField: "dataField", additionalFieldProperties: "additionalFieldProperties" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["dataFieldContainer"], descendants: true }], ngImport: i0, template: '', isInline: true });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractDataFieldTemplateComponent, decorators: [{
type: Component,
args: [{
selector: 'ncc-abstract-datafield-template',
template: ''
}]
}], ctorParameters: () => [{ type: i1.PaperViewService }, { type: i2.ConfigurationService }, { type: i3.ComponentRegistryService }, { type: i0.Injector }], propDecorators: { dataFieldTemplate: [{
type: Input
}], layoutChangeWidthBreakpoint: [{
type: Input
}], offset: [{
type: Input
}], _additionalFieldProperties: [{
type: Input
}], container: [{
type: ViewChild,
args: ['dataFieldContainer']
}], dataField: [{
type: Input
}], additionalFieldProperties: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZGF0YS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL2RhdGEtZmllbGRzL2RhdGEtZmllbGQtdGVtcGxhdGUvYWJzdHJhY3QtZGF0YS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBYyxRQUFRLEVBQUUsS0FBSyxFQUF1QixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRXhELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBTWpFLE9BQU8sRUFBQyxzQkFBc0IsRUFBc0IsTUFBTSxrREFBa0QsQ0FBQzs7Ozs7QUFHN0c7Ozs7Ozs7Ozs7O0dBV0c7QUFNSCxNQUFNLE9BQWdCLGtDQUFrQztJQWlDcEI7SUFDQTtJQUNBO0lBQ0E7SUFsQ2hDOztPQUVHO0lBQ2EsaUJBQWlCLENBQW1CO0lBQ3BEOzs7Ozs7T0FNRztJQUNhLDJCQUEyQixHQUFHLEdBQUcsQ0FBQztJQUNsRDs7T0FFRztJQUNhLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFViwwQkFBMEIsQ0FBcUM7SUFFL0MsU0FBUyxDQUFhO0lBQzdDLFVBQVUsQ0FBaUI7SUFDM0IsNEJBQTRCLEdBQUcsSUFBSSxDQUFDO0lBQ3BDLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUMxQixnQkFBZ0IsQ0FBdUI7SUFFakQ7OztPQUdHO0lBQ08sZ0JBQWdCLEdBQW1CLElBQUksY0FBYyxFQUFFLENBQUM7SUFFbEUsWUFBZ0MsVUFBNEIsRUFDNUIsT0FBNkIsRUFDN0Isa0JBQTRDLEVBQzVDLFFBQWtCO1FBSGxCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVC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QUEyQjtzQkFBMUMsS0FBSztnQkFJVSxNQUFNO3NCQUFyQixLQUFLO2dCQUVXLDBCQUEwQjtzQkFBMUMsS0FBSztnQkFFMkIsU0FBUztzQkFBekMsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBcUNsQixTQUFTO3NCQUFyQixLQUFLO2dCQXdCRix5QkFBeUI7c0JBRDVCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0b3IsIElucHV0LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXcmFwcGVkQm9vbGVhbn0gZnJvbSAnLi9tb2RlbHMvd3JhcHBlZC1ib29sZWFuJztcbmltcG9ydCB7RGF0YUZpZWxkfSBmcm9tICcuLi9tb2RlbHMvYWJzdHJhY3QtZGF0YS1maWVsZCc7XG5pbXBvcnQge1RlbXBsYXRlQXBwZWFyYW5jZX0gZnJvbSAnLi4vbW9kZWxzL3RlbXBsYXRlLWFwcGVhcmFuY2UnO1xuaW1wb3J0IHtQYXBlclZpZXdTZXJ2aWNlfSBmcm9tICcuLi8uLi9uYXZpZ2F0aW9uL3F1aWNrLXBhbmVsL2NvbXBvbmVudHMvcGFwZXItdmlldy5zZXJ2aWNlJztcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHtDb21wb25lbnRQb3J0YWx9IGZyb20gXCJAYW5ndWxhci9jZGsvcG9ydGFsXCI7XG5pbXBvcnQge0NvbXBvbmVudFJlZ2lzdHJ5U2VydmljZX0gZnJvbSBcIi4uLy4uL3JlZ2lzdHJ5L2NvbXBvbmVudC1yZWdpc3RyeS5zZXJ2aWNlXCI7XG5pbXBvcnQge0RBVEFfRklFTERfUE9SVEFMX0RBVEEsIERhdGFGaWVsZFBvcnRhbERhdGF9IGZyb20gXCIuLi9tb2RlbHMvZGF0YS1maWVsZC1wb3J0YWwtZGF0YS1pbmplY3Rpb24tdG9rZW5cIjtcbmltcG9ydCB7QnV0dG9uRmllbGR9IGZyb20gJy4uL2J1dHRvbi1maWVsZC9tb2RlbHMvYnV0dG9uLWZpZWxkJztcblxuLyoqXG4gKiBQcm92aWRlcyBhIHJlc3BvbnNpdmUgbGF5b3V0IHRvIGRhdGEgZmllbGRzIHdoZXJlIHRoZWlyIGFwcGVhcmFuY2UgY2FuIGNoYW5nZSBiYXNlZCBvbiB0aGUgd2lkdGggb2Ygc3BhY2UgdGhleSBoYXZlIGF2YWlsYWJsZS5cbiAqXG4gKiBJZiB0aGUgd2lkdGggb2YgdGhlIGF2YWlsYWJsZSBzcGFjZSBpcyBsZXNzIHRoYW4gdGhlIGBsYXlvdXRDaGFuZ2VXaWR0aEJyZWFrcG9pbnRgIHRoZW4gdGhlIHByb3ZpZGVkIGBkYXRhRmllbGRUZW1wbGF0ZWAgaXMgZGlzcGxheWVkIGF0XG4gKiAxMDAlIHdpZHRoLiBJZiB0aGUgd2lkdGggaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgYnJlYWtwb2ludCB0aGUgZGF0YWZpZWxkIHRlbXBsYXRlIG9jY3VwaWVzIHRoZSByaWdodCBoYWxmIGFuZCB0aGUgbGVmdCBoYWxmIGNvbnRhaW5zXG4gKiBpdCdzIHRpdGxlLlxuICpcbiAqIElmIHRoZSBkYXRhZmllbGQncyBsYXlvdXQgaXMgc2V0IHRvIGBUZW1wbGF0ZUFwcGVhcmFuY2UuTUFURVJJQUxgIHRoZSBmaWVsZCBhbHdheXMgb2NjdXBpZXMgMTAwJSBvZiB0aGUgYXZhaWxhYmxlIHNwYWNlXG4gKiByZWdhcmRsZXNzIG9mIGl0J3Mgd2lkdGguXG4gKlxuICogU2VlIHtAbGluayBEYXRhRmllbGR9IGFuZCB7QGxpbmsgVGVtcGxhdGVBcHBlYXJhbmNlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqL1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25jYy1hYnN0cmFjdC1kYXRhZmllbGQtdGVtcGxhdGUnLFxuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERhdGFGaWVsZFRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIC8qKlxuICAgICAqIENvbnRlbnQgb2YgdGhlIGRhdGFmaWVsZCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRlbXBsYXRlXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGRhdGFGaWVsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBhdmFpbGFibGUgc3BhY2UgaGFzIGEgd2lkdGggc21hbGxlciB0aGF0IHRoaXMgYnJlYWtwb2ludCB0aGUgZGF0YWZpZWxkIHdpbGwgZmlsbCAxMDAlIG9mIHRoZSBhdmFpbGFibGUgc3BhY2UuXG4gICAgICpcbiAgICAgKiBUaGUgYnJlYWtwb2ludCBpcyBvbmx5IHRha2VuIGludG8gY29uc2lkZXJhdGlvbiBpZiBgVGVtcGxhdGVBcHBlYXJhbmNlLk5FVEdSSUZgIGlzIHNldCBvbiB0aGUgZGF0YSBmaWVsZC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF0YUZpZWxkLmxheW91dF17QGxpbmsgRGF0YUZpZWxkI2xheW91dH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGxheW91dENoYW5nZVdpZHRoQnJlYWtwb2ludCA9IDI1MDtcbiAgICAvKipcbiAgICAgKiBGaWVsZCBvZmZzZXQgZGVmaW5lZCBieSB0YXNrXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIG9mZnNldCA9IDA7XG5cbiAgICBASW5wdXQoKSBwcml2YXRlIF9hZGRpdGlvbmFsRmllbGRQcm9wZXJ0aWVzOiB7IFsgazogc3RyaW5nIF06IHN0cmluZyB8IG51bWJlciB9O1xuXG4gICAgQFZpZXdDaGlsZCgnZGF0YUZpZWxkQ29udGFpbmVyJykgY29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIHByb3RlY3RlZCBfZGF0YUZpZWxkOiBEYXRhRmllbGQ8YW55PjtcbiAgICBwcm90ZWN0ZWQgX2lzQ29uZmlndXJlZE5ldGdyaWZUZW1wbGF0ZSA9IHRydWU7XG4gICAgcHJvdGVjdGVkIF9pc05ldGdyaWZUZW1wbGF0ZSA9IHRydWU7XG4gICAgcHJvdGVjdGVkIF9jb21wb25lbnRQb3J0YWw6IENvbXBvbmVudFBvcnRhbDxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqIFRoZSB2YWx1ZSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGxheW91dCBzaG91bGQgYmUgXCJzbWFsbFwiIG9yIG5vdC4gRGF0YSBmaWVsZCBmaWxscyAxMDAlIG9mIHRoZSB3aWR0aCBpbiBcInNtYWxsXCIgbGF5b3V0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfc2hvd0xhcmdlTGF5b3V0OiBXcmFwcGVkQm9vbGVhbiA9IG5ldyBXcmFwcGVkQm9vbGVhbigpO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfcGFwZXJWaWV3OiBQYXBlclZpZXdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NvbmZpZzogQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfY29tcG9uZW50UmVnaXN0cnk6IENvbXBvbmVudFJlZ2lzdHJ5U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgICAgICBjb25zdCBjb25maWd1cmVkVGVtcGxhdGUgPSB0aGlzLl9jb25maWcuZ2V0RGF0YWZpZWxkQ29uZmlndXJhdGlvbigpO1xuICAgICAgICB0aGlzLl9pc0NvbmZpZ3VyZWROZXRncmlmVGVtcGxhdGUgPSBjb25maWd1cmVkVGVtcGxhdGVcbiAgICAgICAgICAgICYmIGNvbmZpZ3VyZWRUZW1wbGF0ZS50ZW1wbGF0ZVxuICAgICAgICAgICAgJiYgY29uZmlndXJlZFRlbXBsYXRlLnRlbXBsYXRlID09PSBUZW1wbGF0ZUFwcGVhcmFuY2UuTkVUR1JJRjtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICghIXRoaXMuX2RhdGFGaWVsZCAmJiAhIXRoaXMuX2RhdGFGaWVsZC5sYXlvdXQgJiYgISF0aGlzLl9kYXRhRmllbGQubGF5b3V0Lm9mZnNldCkge1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gdGhpcy5fZGF0YUZpZWxkLmxheW91dC5vZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2hvd0xhcmdlTGF5b3V0LnZhbHVlID0gdGhpcy5ldmFsdWF0ZVRlbXBsYXRlKCk7XG4gICAgICAgIHRoaXMuX2RhdGFGaWVsZC5yZXNvbHZlQXBwZWFyYW5jZSh0aGlzLl9jb25maWcpO1xuICAgIH1cblxuICAgIGdldCBzaG93TGFyZ2VMYXlvdXQoKTogV3JhcHBlZEJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvd0xhcmdlTGF5b3V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERhdGFmaWVsZCBtb2RlbCBvYmplY3QgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSB0ZW1wbGF0ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNldCBkYXRhRmllbGQoZGF0YUZpZWxkOiBEYXRhRmllbGQ8YW55Pikge1xuICAgICAgICB0aGlzLl9kYXRhRmllbGQgPSBkYXRhRmllbGQ7XG4gICAgICAgIGlmICh0aGlzLl9kYXRhRmllbGQubGF5b3V0ICYmIHRoaXMuX2RhdGFGaWVsZC5sYXlvdXQudGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzTmV0Z3JpZlRlbXBsYXRlID0gdGhpcy5fZGF0YUZpZWxkLmxheW91dC50ZW1wbGF0ZSA9PT0gVGVtcGxhdGVBcHBlYXJhbmNlLk5FVEdSSUY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc05ldGdyaWZUZW1wbGF0ZSA9IHRoaXMuX2lzQ29uZmlndXJlZE5ldGdyaWZUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb21wb25lbnRQb3J0YWwgPSB0aGlzLnJlc29sdmVDb21wb25lbnRQb3J0YWwodGhpcy5kYXRhRmllbGQsIHRoaXMuc2hvd0xhcmdlTGF5b3V0LCB0aGlzLmRhdGFGaWVsZC5mb3JtQ29udHJvbFJlZiwgdGhpcy5hZGRpdGlvbmFsRmllbGRQcm9wZXJ0aWVzKVxuICAgIH1cblxuICAgIGdldCBkYXRhRmllbGQoKTogRGF0YUZpZWxkPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YUZpZWxkO1xuICAgIH1cblxuICAgIGdldCBjb21wb25lbnRQb3J0YWwoKTogQ29tcG9uZW50UG9ydGFsPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50UG9ydGFsO1xuICAgIH1cblxuXG4gICAgZ2V0IGFkZGl0aW9uYWxGaWVsZFByb3BlcnRpZXMoKToge1trOnN0cmluZ106IHN0cmluZyB8IG51bWJlcn0ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25hbEZpZWxkUHJvcGVydGllcztcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHNldCBhZGRpdGlvbmFsRmllbGRQcm9wZXJ0aWVzKHZhbHVlOiB7W2s6c3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyfSkge1xuICAgICAgICB0aGlzLl9hZGRpdGlvbmFsRmllbGRQcm9wZXJ0aWVzID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgQ29tcG9uZW50IGNoYW5nZXMgZGltZW5zaW9uIGFuZFxuICAgICAqIGRldGVybWluZXMgd2hldGhlciB0aGUgXCJzbWFsbFwiIG9yIFwibGFyZ2VcIiBsYXlvdXQgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBldmVudCBjb250YWluaW5nIHRoZSBuZXcgd2lkdGggb2YgdGhpcyBDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZXZhbHVhdGVUZW1wbGF0ZUNvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCkgP1xuICAgICAgICAgICAgdGhpcy5fc2hvd0xhcmdlTGF5b3V0LnZhbHVlID1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICA+PSB0aGlzLmxheW91dENoYW5nZVdpZHRoQnJlYWtwb2ludCAmJiB0aGlzLmV2YWx1YXRlVGVtcGxhdGUoKSA6XG4gICAgICAgICAgICB0aGlzLl9zaG93TGFyZ2VMYXlvdXQudmFsdWUgPSB0aGlzLmV2YWx1YXRlVGVtcGxhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3dMYXJnZUxheW91dC52YWx1ZTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBoYXNDb21wb25lbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRSZWdpc3RyeS5jb250YWlucyh0aGlzLmRhdGFGaWVsZC5nZXRUeXBlZENvbXBvbmVudFR5cGUoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc29sdmVDb21wb25lbnRQb3J0YWwoZGF0YUZpZWxkOiBEYXRhRmllbGQ8YW55Piwgc2hvd0xhcmdlTGF5b3V0OiBXcmFwcGVkQm9vbGVhbiwgZm9ybUNvbnRyb2xSZWY6IEZvcm1Db250cm9sLCBhZGRpdGlvbmFsRmllbGRQcm9wZXJ0aWVzPzoge1trOnN0cmluZ106IHN0cmluZyB8IG51bWJlcn0pOiBDb21wb25lbnRQb3J0YWw8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbXBvbmVudCgpKSB7XG4gICAgICAgICAgICBjb25zdCBwb3J0YWxJbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IERBVEFfRklFTERfUE9SVEFMX0RBVEEsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogZGF0YUZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dMYXJnZUxheW91dDogc2hvd0xhcmdlTGF5b3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sUmVmOiBmb3JtQ29udHJvbFJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRmllbGRQcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGFzIERhdGFGaWVsZFBvcnRhbERhdGE8YW55PlxuICAgICAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudFJlZ2lzdHJ5LmdldCh0aGlzLmRhdGFGaWVsZC5nZXRUeXBlZENvbXBvbmVudFR5cGUoKSwgcG9ydGFsSW5qZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYGZhbHNlYCBpZiB0aGUgZGF0YSBmaWVsZCB1c2VzIHRoZSBgVGVtcGxhdGVBcHBlYXJhbmNlLk1BVEVSSUFMYCBhbmQgYHRydWVgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZXZhbHVhdGVUZW1wbGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kYXRhRmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pc05ldGdyaWZUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQYXBlclZpZXcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXBlclZpZXcucGFwZXJWaWV3O1xuICAgIH1cbn1cbiJdfQ==