devextreme-angular
Version:
Angular UI and visualization components based on DevExtreme widgets
246 lines • 32.3 kB
JavaScript
/*!
* devextreme-angular
* Version: 25.2.3
* Build date: Fri Dec 12 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file in the root of the project for details.
*
* https://github.com/DevExpress/devextreme-angular
*/
import { Component, EventEmitter, } from '@angular/core';
import render from 'devextreme/core/renderer';
import { triggerHandler } from 'devextreme/events';
import domAdapter from 'devextreme/core/dom_adapter';
import { getElement } from './utils';
import { warnIfLegacyNestedComponent } from './deprecated-config-warning';
import { DX_TEMPLATE_WRAPPER_CLASS } from './template';
import * as i0 from "@angular/core";
const VISIBILITY_CHANGE_SELECTOR = 'dx-visibility-change-handler';
export class BaseNestedOption {
_host;
_hostOptionPath;
_collectionContainerImpl;
_initialOptions = {};
constructor() {
this._collectionContainerImpl = new CollectionNestedOptionContainerImpl(this._setOption.bind(this), this._filterItems.bind(this));
}
_optionChangedHandler(e) {
const fullOptionPath = this._fullOptionPath();
if (e.fullName.indexOf(fullOptionPath) === 0) {
const optionName = e.fullName.slice(fullOptionPath.length);
const emitter = this[`${optionName}Change`];
if (emitter) {
emitter.next(e.value);
}
}
}
_createEventEmitters(events) {
events.forEach((event) => {
this[event.emit] = new EventEmitter();
});
}
_getOption(name) {
if (this.isLinked) {
return this.instance.option(this._fullOptionPath() + name);
}
return this._initialOptions[name];
}
_setOption(name, value) {
if (this.isLinked) {
const fullPath = this._fullOptionPath() + name;
this.instance.option(fullPath, value);
}
else {
this._initialOptions[name] = value;
}
}
_addRemovedOption(name) {
if (this.instance && this.removedNestedComponents) {
this.removedNestedComponents.push(name);
}
}
_deleteRemovedOptions(name) {
if (this.instance && this.removedNestedComponents) {
this.removedNestedComponents = this.removedNestedComponents.filter((x) => !x.startsWith(name));
}
}
_addRecreatedComponent() {
if (this.instance && this.recreatedNestedComponents) {
this.recreatedNestedComponents.push({ getOptionPath: () => this._getOptionPath() });
}
}
_getOptionPath() {
return this._hostOptionPath() + this._optionPath;
}
setHost(host, optionPath) {
this._host = host;
this._hostOptionPath = optionPath;
this.optionChangedHandlers.subscribe(this._optionChangedHandler.bind(this));
}
setChildren(propertyName, items) {
this.resetOptions(propertyName);
return this._collectionContainerImpl.setChildren(propertyName, items);
}
_filterItems(items) {
return items.filter((item) => item !== this);
}
get instance() {
return this._host?.instance;
}
get resetOptions() {
return this._host && this._host.resetOptions;
}
get isRecreated() {
return this._host && this._host.isRecreated;
}
get removedNestedComponents() {
return this._host && this._host.removedNestedComponents;
}
set removedNestedComponents(value) {
this._host.removedNestedComponents = value;
}
get recreatedNestedComponents() {
return this._host && this._host.recreatedNestedComponents;
}
set recreatedNestedComponents(value) {
this._host.recreatedNestedComponents = value;
}
get isLinked() {
return !!this.instance && this._host.isLinked;
}
get optionChangedHandlers() {
return this._host && this._host.optionChangedHandlers;
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseNestedOption, deps: [], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BaseNestedOption, selector: "ng-component", ngImport: i0, template: '', isInline: true });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseNestedOption, decorators: [{
type: Component,
args: [{
template: '',
}]
}], ctorParameters: () => [] });
export class CollectionNestedOptionContainerImpl {
_setOption;
_filterItems;
_activatedQueries = {};
constructor(_setOption, _filterItems) {
this._setOption = _setOption;
this._filterItems = _filterItems;
}
setChildren(propertyName, items) {
if (this._filterItems) {
items = this._filterItems(items);
}
if (items.length) {
this._activatedQueries[propertyName] = true;
}
if (this._activatedQueries[propertyName]) {
const widgetItems = items.map((item, index) => {
item._index = index;
return item._value;
});
this._setOption(propertyName, widgetItems);
}
}
}
export class NestedOption extends BaseNestedOption {
setHost(host, optionPath) {
super.setHost(host, optionPath);
this._host[this._optionPath] = this._initialOptions;
}
_fullOptionPath() {
return `${this._getOptionPath()}.`;
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NestedOption, deps: null, target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NestedOption, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NestedOption, decorators: [{
type: Component,
args: [{
template: '',
}]
}] });
export class CollectionNestedOption extends BaseNestedOption {
_index;
_fullOptionPath() {
return `${this._getOptionPath()}[${this._index}].`;
}
get _value() {
return this._initialOptions;
}
get isLinked() {
return this._index !== undefined && !!this.instance && this._host.isLinked;
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CollectionNestedOption, deps: null, target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CollectionNestedOption, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CollectionNestedOption, decorators: [{
type: Component,
args: [{
template: '',
}]
}] });
const triggerShownEvent = function (element) {
const changeHandlers = [];
if (!render(element).hasClass(VISIBILITY_CHANGE_SELECTOR)) {
changeHandlers.push(element);
}
changeHandlers.push.apply(changeHandlers, element.querySelectorAll(`.${VISIBILITY_CHANGE_SELECTOR}`));
for (let i = 0; i < changeHandlers.length; i++) {
triggerHandler(changeHandlers[i], 'dxshown');
}
};
export function extractTemplate(option, element, renderer, document) {
if (!option.template === undefined || !element.nativeElement.hasChildNodes()) {
return;
}
const childNodes = [].slice.call(element.nativeElement.childNodes);
const userContent = childNodes.filter((n) => {
if (n.tagName) {
const tagNamePrefix = n.tagName.toLowerCase().substr(0, 3);
return !(tagNamePrefix === 'dxi' || tagNamePrefix === 'dxo');
}
return n.nodeName !== '#comment' && n.textContent.replace(/\s/g, '').length;
});
if (!userContent.length) {
return;
}
option.template = {
render: (renderData) => {
const result = element.nativeElement;
domAdapter.setClass(result, DX_TEMPLATE_WRAPPER_CLASS, true);
if (renderData.container) {
const container = getElement(renderData.container);
const resultInContainer = container.contains(element.nativeElement);
renderer.appendChild(container, element.nativeElement);
if (!resultInContainer) {
const resultInBody = document.body.contains(container);
if (resultInBody) {
triggerShownEvent(result);
}
}
}
return result;
},
};
}
export class NestedOptionHost {
_host;
_optionPath;
getHost() {
return this._host;
}
setHost(host, optionPath) {
this._host = host;
this._optionPath = optionPath || (() => '');
}
setNestedOption(nestedOption) {
nestedOption.setHost(this._host, this._optionPath);
warnIfLegacyNestedComponent(nestedOption, this._host);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLW9wdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2Rpc3QvY29yZS9uZXN0ZWQtb3B0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFBb0MsWUFBWSxHQUMxRCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLE1BQU0sTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxVQUFVLE1BQU0sNkJBQTZCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBRXZELE1BQU0sMEJBQTBCLEdBQUcsOEJBQThCLENBQUM7QUFpQmxFLE1BQU0sT0FBZ0IsZ0JBQWdCO0lBQzFCLEtBQUssQ0FBeUI7SUFFOUIsZUFBZSxDQUFvQjtJQUU1Qix3QkFBd0IsQ0FBbUM7SUFFbEUsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUsvQjtRQUNFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEksQ0FBQztJQUVTLHFCQUFxQixDQUFDLENBQU07UUFDcEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTlDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxVQUFVLEdBQUcsQ0FB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QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxlQUFlLENBQUMsWUFBOEI7UUFDNUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRCwyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKiBWZXJzaW9uOiAyNS4yLjNcbiAqIEJ1aWxkIGRhdGU6IEZyaSBEZWMgMTIgMjAyNVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMiAtIDIwMjUgRGV2ZWxvcGVyIEV4cHJlc3MgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVEXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtc1xuICogb2YgdGhlIE1JVCBsaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBmb3IgZGV0YWlscy5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vRGV2RXhwcmVzcy9kZXZleHRyZW1lLWFuZ3VsYXJcbiAqL1xuXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCwgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIEV2ZW50RW1pdHRlcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCByZW5kZXIgZnJvbSAnZGV2ZXh0cmVtZS9jb3JlL3JlbmRlcmVyJztcclxuaW1wb3J0IHsgdHJpZ2dlckhhbmRsZXIgfSBmcm9tICdkZXZleHRyZW1lL2V2ZW50cyc7XHJcbmltcG9ydCBkb21BZGFwdGVyIGZyb20gJ2RldmV4dHJlbWUvY29yZS9kb21fYWRhcHRlcic7XHJcbmltcG9ydCB7IGdldEVsZW1lbnQgfSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgd2FybklmTGVnYWN5TmVzdGVkQ29tcG9uZW50IH0gZnJvbSAnLi9kZXByZWNhdGVkLWNvbmZpZy13YXJuaW5nJztcclxuaW1wb3J0IHsgRFhfVEVNUExBVEVfV1JBUFBFUl9DTEFTUyB9IGZyb20gJy4vdGVtcGxhdGUnO1xyXG5cclxuY29uc3QgVklTSUJJTElUWV9DSEFOR0VfU0VMRUNUT1IgPSAnZHgtdmlzaWJpbGl0eS1jaGFuZ2UtaGFuZGxlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElOZXN0ZWRPcHRpb25Db250YWluZXIge1xyXG4gIGluc3RhbmNlOiBhbnk7XHJcbiAgaXNMaW5rZWQ6IGJvb2xlYW47XHJcbiAgcmVtb3ZlZE5lc3RlZENvbXBvbmVudHM6IHN0cmluZ1tdO1xyXG4gIG9wdGlvbkNoYW5nZWRIYW5kbGVyczogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgcmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50czogYW55W107XHJcbiAgcmVzZXRPcHRpb25zOiAoY29sbGVjdGlvbk5hbWU/OiBzdHJpbmcpID0+IHZvaWQ7XHJcbiAgaXNSZWNyZWF0ZWQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElPcHRpb25QYXRoR2V0dGVyID0gKCkgPT4gc3RyaW5nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGU6ICcnLFxyXG59KVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU5lc3RlZE9wdGlvbiBpbXBsZW1lbnRzIElOZXN0ZWRPcHRpb25Db250YWluZXIsIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVyIHtcclxuICBwcm90ZWN0ZWQgX2hvc3Q6IElOZXN0ZWRPcHRpb25Db250YWluZXI7XHJcblxyXG4gIHByb3RlY3RlZCBfaG9zdE9wdGlvblBhdGg6IElPcHRpb25QYXRoR2V0dGVyO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9jb2xsZWN0aW9uQ29udGFpbmVySW1wbDogSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXI7XHJcblxyXG4gIHByb3RlY3RlZCBfaW5pdGlhbE9wdGlvbnMgPSB7fTtcclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBfb3B0aW9uUGF0aCgpOiBzdHJpbmc7XHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IF9mdWxsT3B0aW9uUGF0aCgpOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fY29sbGVjdGlvbkNvbnRhaW5lckltcGwgPSBuZXcgQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lckltcGwodGhpcy5fc2V0T3B0aW9uLmJpbmQodGhpcyksIHRoaXMuX2ZpbHRlckl0ZW1zLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9vcHRpb25DaGFuZ2VkSGFuZGxlcihlOiBhbnkpIHtcclxuICAgIGNvbnN0IGZ1bGxPcHRpb25QYXRoID0gdGhpcy5fZnVsbE9wdGlvblBhdGgoKTtcclxuXHJcbiAgICBpZiAoZS5mdWxsTmFtZS5pbmRleE9mKGZ1bGxPcHRpb25QYXRoKSA9PT0gMCkge1xyXG4gICAgICBjb25zdCBvcHRpb25OYW1lID0gZS5mdWxsTmFtZS5zbGljZShmdWxsT3B0aW9uUGF0aC5sZW5ndGgpO1xyXG4gICAgICBjb25zdCBlbWl0dGVyID0gdGhpc1tgJHtvcHRpb25OYW1lfUNoYW5nZWBdO1xyXG5cclxuICAgICAgaWYgKGVtaXR0ZXIpIHtcclxuICAgICAgICBlbWl0dGVyLm5leHQoZS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfY3JlYXRlRXZlbnRFbWl0dGVycyhldmVudHMpIHtcclxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICB0aGlzW2V2ZW50LmVtaXRdID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2dldE9wdGlvbihuYW1lOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMuaXNMaW5rZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2Uub3B0aW9uKHRoaXMuX2Z1bGxPcHRpb25QYXRoKCkgKyBuYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsT3B0aW9uc1tuYW1lXTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfc2V0T3B0aW9uKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuaXNMaW5rZWQpIHtcclxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLl9mdWxsT3B0aW9uUGF0aCgpICsgbmFtZTtcclxuICAgICAgdGhpcy5pbnN0YW5jZS5vcHRpb24oZnVsbFBhdGgsIHZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zW25hbWVdID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2FkZFJlbW92ZWRPcHRpb24obmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlZE5lc3RlZENvbXBvbmVudHMucHVzaChuYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfZGVsZXRlUmVtb3ZlZE9wdGlvbnMobmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlZE5lc3RlZENvbXBvbmVudHMgPSB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzLmZpbHRlcigoeCkgPT4gIXguc3RhcnRzV2l0aChuYW1lKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2FkZFJlY3JlYXRlZENvbXBvbmVudCgpIHtcclxuICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cykge1xyXG4gICAgICB0aGlzLnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHMucHVzaCh7IGdldE9wdGlvblBhdGg6ICgpID0+IHRoaXMuX2dldE9wdGlvblBhdGgoKSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfZ2V0T3B0aW9uUGF0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3N0T3B0aW9uUGF0aCgpICsgdGhpcy5fb3B0aW9uUGF0aDtcclxuICB9XHJcblxyXG4gIHNldEhvc3QoaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciwgb3B0aW9uUGF0aDogSU9wdGlvblBhdGhHZXR0ZXIpIHtcclxuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xyXG4gICAgdGhpcy5faG9zdE9wdGlvblBhdGggPSBvcHRpb25QYXRoO1xyXG4gICAgdGhpcy5vcHRpb25DaGFuZ2VkSGFuZGxlcnMuc3Vic2NyaWJlKHRoaXMuX29wdGlvbkNoYW5nZWRIYW5kbGVyLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2hpbGRyZW48VCBleHRlbmRzIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uPihwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXRlbXM6IFF1ZXJ5TGlzdDxUPikge1xyXG4gICAgdGhpcy5yZXNldE9wdGlvbnMocHJvcGVydHlOYW1lKTtcclxuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uQ29udGFpbmVySW1wbC5zZXRDaGlsZHJlbihwcm9wZXJ0eU5hbWUsIGl0ZW1zKTtcclxuICB9XHJcblxyXG4gIF9maWx0ZXJJdGVtcyhpdGVtczogUXVlcnlMaXN0PEJhc2VOZXN0ZWRPcHRpb24+KSB7XHJcbiAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB0aGlzKTtcclxuICB9XHJcblxyXG4gIGdldCBpbnN0YW5jZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3N0Py5pbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIGdldCByZXNldE9wdGlvbnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0LnJlc2V0T3B0aW9ucztcclxuICB9XHJcblxyXG4gIGdldCBpc1JlY3JlYXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3N0ICYmIHRoaXMuX2hvc3QuaXNSZWNyZWF0ZWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVtb3ZlZE5lc3RlZENvbXBvbmVudHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0LnJlbW92ZWROZXN0ZWRDb21wb25lbnRzO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJlbW92ZWROZXN0ZWRDb21wb25lbnRzKHZhbHVlKSB7XHJcbiAgICB0aGlzLl9ob3N0LnJlbW92ZWROZXN0ZWRDb21wb25lbnRzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cygpIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3N0ICYmIHRoaXMuX2hvc3QucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cztcclxuICB9XHJcblxyXG4gIHNldCByZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzKHZhbHVlKSB7XHJcbiAgICB0aGlzLl9ob3N0LnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBpc0xpbmtlZCgpIHtcclxuICAgIHJldHVybiAhIXRoaXMuaW5zdGFuY2UgJiYgdGhpcy5faG9zdC5pc0xpbmtlZDtcclxuICB9XHJcblxyXG4gIGdldCBvcHRpb25DaGFuZ2VkSGFuZGxlcnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0Lm9wdGlvbkNoYW5nZWRIYW5kbGVycztcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXIge1xyXG4gIHNldENoaWxkcmVuOiA8VCBleHRlbmRzIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uPihwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXRlbXM6IFF1ZXJ5TGlzdDxUPikgPT4gYW55O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lckltcGwgaW1wbGVtZW50cyBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lciB7XHJcbiAgcHJpdmF0ZSBfYWN0aXZhdGVkUXVlcmllcyA9IHt9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9zZXRPcHRpb246IEZ1bmN0aW9uLCBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJJdGVtcz86IEZ1bmN0aW9uKSB7IH1cclxuXHJcbiAgc2V0Q2hpbGRyZW48VCBleHRlbmRzIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uPihwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXRlbXM6IFF1ZXJ5TGlzdDxUPikge1xyXG4gICAgaWYgKHRoaXMuX2ZpbHRlckl0ZW1zKSB7XHJcbiAgICAgIGl0ZW1zID0gdGhpcy5fZmlsdGVySXRlbXMoaXRlbXMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLl9hY3RpdmF0ZWRRdWVyaWVzW3Byb3BlcnR5TmFtZV0gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2FjdGl2YXRlZFF1ZXJpZXNbcHJvcGVydHlOYW1lXSkge1xyXG4gICAgICBjb25zdCB3aWRnZXRJdGVtcyA9IGl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICBpdGVtLl9pbmRleCA9IGluZGV4O1xyXG4gICAgICAgIHJldHVybiBpdGVtLl92YWx1ZTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuX3NldE9wdGlvbihwcm9wZXJ0eU5hbWUsIHdpZGdldEl0ZW1zKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlOiAnJyxcclxufSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5lc3RlZE9wdGlvbiBleHRlbmRzIEJhc2VOZXN0ZWRPcHRpb24ge1xyXG4gIHNldEhvc3QoaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciwgb3B0aW9uUGF0aDogSU9wdGlvblBhdGhHZXR0ZXIpIHtcclxuICAgIHN1cGVyLnNldEhvc3QoaG9zdCwgb3B0aW9uUGF0aCk7XHJcblxyXG4gICAgdGhpcy5faG9zdFt0aGlzLl9vcHRpb25QYXRoXSA9IHRoaXMuX2luaXRpYWxPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9mdWxsT3B0aW9uUGF0aCgpIHtcclxuICAgIHJldHVybiBgJHt0aGlzLl9nZXRPcHRpb25QYXRoKCl9LmA7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uIHtcclxuICBfaW5kZXg6IG51bWJlcjtcclxuICBfdmFsdWU6IG9iamVjdDtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGU6ICcnLFxyXG59KVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvbk5lc3RlZE9wdGlvbiBleHRlbmRzIEJhc2VOZXN0ZWRPcHRpb24gaW1wbGVtZW50cyBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbiB7XHJcbiAgX2luZGV4OiBudW1iZXI7XHJcblxyXG4gIHByb3RlY3RlZCBfZnVsbE9wdGlvblBhdGgoKSB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5fZ2V0T3B0aW9uUGF0aCgpfVske3RoaXMuX2luZGV4fV0uYDtcclxuICB9XHJcblxyXG4gIGdldCBfdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbE9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNMaW5rZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5kZXggIT09IHVuZGVmaW5lZCAmJiAhIXRoaXMuaW5zdGFuY2UgJiYgdGhpcy5faG9zdC5pc0xpbmtlZDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU9wdGlvbldpdGhUZW1wbGF0ZSBleHRlbmRzIEJhc2VOZXN0ZWRPcHRpb24ge1xyXG4gIHRlbXBsYXRlOiBhbnk7XHJcbn1cclxuXHJcbmNvbnN0IHRyaWdnZXJTaG93bkV2ZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICBjb25zdCBjaGFuZ2VIYW5kbGVycyA9IFtdO1xyXG5cclxuICBpZiAoIXJlbmRlcihlbGVtZW50KS5oYXNDbGFzcyhWSVNJQklMSVRZX0NIQU5HRV9TRUxFQ1RPUikpIHtcclxuICAgIGNoYW5nZUhhbmRsZXJzLnB1c2goZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VIYW5kbGVycy5wdXNoLmFwcGx5KGNoYW5nZUhhbmRsZXJzLCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke1ZJU0lCSUxJVFlfQ0hBTkdFX1NFTEVDVE9SfWApKTtcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2VIYW5kbGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgdHJpZ2dlckhhbmRsZXIoY2hhbmdlSGFuZGxlcnNbaV0sICdkeHNob3duJyk7XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RUZW1wbGF0ZShvcHRpb246IElPcHRpb25XaXRoVGVtcGxhdGUsIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHJlbmRlcmVyOiBSZW5kZXJlcjIsIGRvY3VtZW50OiBhbnkpIHtcclxuICBpZiAoIW9wdGlvbi50ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkIHx8ICFlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCBjaGlsZE5vZGVzID0gW10uc2xpY2UuY2FsbChlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hpbGROb2Rlcyk7XHJcbiAgY29uc3QgdXNlckNvbnRlbnQgPSBjaGlsZE5vZGVzLmZpbHRlcigobikgPT4ge1xyXG4gICAgaWYgKG4udGFnTmFtZSkge1xyXG4gICAgICBjb25zdCB0YWdOYW1lUHJlZml4ID0gbi50YWdOYW1lLnRvTG93ZXJDYXNlKCkuc3Vic3RyKDAsIDMpO1xyXG4gICAgICByZXR1cm4gISh0YWdOYW1lUHJlZml4ID09PSAnZHhpJyB8fCB0YWdOYW1lUHJlZml4ID09PSAnZHhvJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbi5ub2RlTmFtZSAhPT0gJyNjb21tZW50JyAmJiBuLnRleHRDb250ZW50LnJlcGxhY2UoL1xccy9nLCAnJykubGVuZ3RoO1xyXG4gIH0pO1xyXG4gIGlmICghdXNlckNvbnRlbnQubGVuZ3RoKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBvcHRpb24udGVtcGxhdGUgPSB7XHJcbiAgICByZW5kZXI6IChyZW5kZXJEYXRhKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgIGRvbUFkYXB0ZXIuc2V0Q2xhc3MocmVzdWx0LCBEWF9URU1QTEFURV9XUkFQUEVSX0NMQVNTLCB0cnVlKTtcclxuXHJcbiAgICAgIGlmIChyZW5kZXJEYXRhLmNvbnRhaW5lcikge1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldEVsZW1lbnQocmVuZGVyRGF0YS5jb250YWluZXIpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdEluQ29udGFpbmVyID0gY29udGFpbmVyLmNvbnRhaW5zKGVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHJlbmRlcmVyLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXN1bHRJbkNvbnRhaW5lcikge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0SW5Cb2R5ID0gZG9jdW1lbnQuYm9keS5jb250YWlucyhjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgIGlmIChyZXN1bHRJbkJvZHkpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclNob3duRXZlbnQocmVzdWx0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOZXN0ZWRPcHRpb25Ib3N0IHtcclxuICBwcml2YXRlIF9ob3N0OiBJTmVzdGVkT3B0aW9uQ29udGFpbmVyO1xyXG5cclxuICBwcml2YXRlIF9vcHRpb25QYXRoOiBJT3B0aW9uUGF0aEdldHRlcjtcclxuXHJcbiAgZ2V0SG9zdCgpOiBJTmVzdGVkT3B0aW9uQ29udGFpbmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3N0O1xyXG4gIH1cclxuXHJcbiAgc2V0SG9zdChob3N0OiBJTmVzdGVkT3B0aW9uQ29udGFpbmVyLCBvcHRpb25QYXRoPzogSU9wdGlvblBhdGhHZXR0ZXIpIHtcclxuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xyXG4gICAgdGhpcy5fb3B0aW9uUGF0aCA9IG9wdGlvblBhdGggfHwgKCgpID0+ICcnKTtcclxuICB9XHJcblxyXG4gIHNldE5lc3RlZE9wdGlvbihuZXN0ZWRPcHRpb246IEJhc2VOZXN0ZWRPcHRpb24pIHtcclxuICAgIG5lc3RlZE9wdGlvbi5zZXRIb3N0KHRoaXMuX2hvc3QsIHRoaXMuX29wdGlvblBhdGgpO1xyXG4gICAgd2FybklmTGVnYWN5TmVzdGVkQ29tcG9uZW50KG5lc3RlZE9wdGlvbiwgdGhpcy5faG9zdCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==