UNPKG

devextreme-angular

Version:

Angular UI and visualization components based on DevExtreme widgets

244 lines 31.9 kB
/*! * devextreme-angular * Version: 25.1.3 * Build date: Wed Jun 25 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 { 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); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLW9wdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2Rpc3QvY29yZS9uZXN0ZWQtb3B0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFBb0MsWUFBWSxHQUMxRCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLE1BQU0sTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxVQUFVLE1BQU0sNkJBQTZCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBRXZELE1BQU0sMEJBQTBCLEdBQUcsOEJBQThCLENBQUM7QUFpQmxFLE1BQU0sT0FBZ0IsZ0JBQWdCO0lBQzFCLEtBQUssQ0FBeUI7SUFFOUIsZUFBZSxDQUFvQjtJQUU1Qix3QkFBd0IsQ0FBbUM7SUFFbEUsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUsvQjtRQUNFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEksQ0FBQztJQUVTLHFCQUFxQixDQUFDLENBQU07UUFDcEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTlDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FB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RSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxlQUFlLENBQUMsWUFBOEI7UUFDNUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGRldmV4dHJlbWUtYW5ndWxhclxuICogVmVyc2lvbjogMjUuMS4zXG4gKiBCdWlsZCBkYXRlOiBXZWQgSnVuIDI1IDIwMjVcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgLSAyMDI1IERldmVsb3BlciBFeHByZXNzIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRFxuICpcbiAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXNcbiAqIG9mIHRoZSBNSVQgbGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QgZm9yIGRldGFpbHMuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0RldkV4cHJlc3MvZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKi9cblxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsIFF1ZXJ5TGlzdCwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBFdmVudEVtaXR0ZXIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgcmVuZGVyIGZyb20gJ2RldmV4dHJlbWUvY29yZS9yZW5kZXJlcic7XHJcbmltcG9ydCB7IHRyaWdnZXJIYW5kbGVyIH0gZnJvbSAnZGV2ZXh0cmVtZS9ldmVudHMnO1xyXG5pbXBvcnQgZG9tQWRhcHRlciBmcm9tICdkZXZleHRyZW1lL2NvcmUvZG9tX2FkYXB0ZXInO1xyXG5pbXBvcnQgeyBnZXRFbGVtZW50IH0gZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCB7IERYX1RFTVBMQVRFX1dSQVBQRVJfQ0xBU1MgfSBmcm9tICcuL3RlbXBsYXRlJztcclxuXHJcbmNvbnN0IFZJU0lCSUxJVFlfQ0hBTkdFX1NFTEVDVE9SID0gJ2R4LXZpc2liaWxpdHktY2hhbmdlLWhhbmRsZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTmVzdGVkT3B0aW9uQ29udGFpbmVyIHtcclxuICBpbnN0YW5jZTogYW55O1xyXG4gIGlzTGlua2VkOiBib29sZWFuO1xyXG4gIHJlbW92ZWROZXN0ZWRDb21wb25lbnRzOiBzdHJpbmdbXTtcclxuICBvcHRpb25DaGFuZ2VkSGFuZGxlcnM6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIHJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHM6IGFueVtdO1xyXG4gIHJlc2V0T3B0aW9uczogKGNvbGxlY3Rpb25OYW1lPzogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIGlzUmVjcmVhdGVkOiAobmFtZTogc3RyaW5nKSA9PiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJT3B0aW9uUGF0aEdldHRlciA9ICgpID0+IHN0cmluZztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlOiAnJyxcclxufSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VOZXN0ZWRPcHRpb24gaW1wbGVtZW50cyBJTmVzdGVkT3B0aW9uQ29udGFpbmVyLCBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lciB7XHJcbiAgcHJvdGVjdGVkIF9ob3N0OiBJTmVzdGVkT3B0aW9uQ29udGFpbmVyO1xyXG5cclxuICBwcm90ZWN0ZWQgX2hvc3RPcHRpb25QYXRoOiBJT3B0aW9uUGF0aEdldHRlcjtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY29sbGVjdGlvbkNvbnRhaW5lckltcGw6IElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVyO1xyXG5cclxuICBwcm90ZWN0ZWQgX2luaXRpYWxPcHRpb25zID0ge307XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgX29wdGlvblBhdGgoKTogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBfZnVsbE9wdGlvblBhdGgoKTogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX2NvbGxlY3Rpb25Db250YWluZXJJbXBsID0gbmV3IENvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXJJbXBsKHRoaXMuX3NldE9wdGlvbi5iaW5kKHRoaXMpLCB0aGlzLl9maWx0ZXJJdGVtcy5iaW5kKHRoaXMpKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfb3B0aW9uQ2hhbmdlZEhhbmRsZXIoZTogYW55KSB7XHJcbiAgICBjb25zdCBmdWxsT3B0aW9uUGF0aCA9IHRoaXMuX2Z1bGxPcHRpb25QYXRoKCk7XHJcblxyXG4gICAgaWYgKGUuZnVsbE5hbWUuaW5kZXhPZihmdWxsT3B0aW9uUGF0aCkgPT09IDApIHtcclxuICAgICAgY29uc3Qgb3B0aW9uTmFtZSA9IGUuZnVsbE5hbWUuc2xpY2UoZnVsbE9wdGlvblBhdGgubGVuZ3RoKTtcclxuICAgICAgY29uc3QgZW1pdHRlciA9IHRoaXNbYCR7b3B0aW9uTmFtZX1DaGFuZ2VgXTtcclxuXHJcbiAgICAgIGlmIChlbWl0dGVyKSB7XHJcbiAgICAgICAgZW1pdHRlci5uZXh0KGUudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2NyZWF0ZUV2ZW50RW1pdHRlcnMoZXZlbnRzKSB7XHJcbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcclxuICAgICAgdGhpc1tldmVudC5lbWl0XSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9nZXRPcHRpb24obmFtZTogc3RyaW5nKTogYW55IHtcclxuICAgIGlmICh0aGlzLmlzTGlua2VkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLm9wdGlvbih0aGlzLl9mdWxsT3B0aW9uUGF0aCgpICsgbmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbE9wdGlvbnNbbmFtZV07XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX3NldE9wdGlvbihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmlzTGlua2VkKSB7XHJcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5fZnVsbE9wdGlvblBhdGgoKSArIG5hbWU7XHJcbiAgICAgIHRoaXMuaW5zdGFuY2Uub3B0aW9uKGZ1bGxQYXRoLCB2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9pbml0aWFsT3B0aW9uc1tuYW1lXSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9hZGRSZW1vdmVkT3B0aW9uKG5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgdGhpcy5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cykge1xyXG4gICAgICB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzLnB1c2gobmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2RlbGV0ZVJlbW92ZWRPcHRpb25zKG5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgdGhpcy5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cykge1xyXG4gICAgICB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzID0gdGhpcy5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cy5maWx0ZXIoKHgpID0+ICF4LnN0YXJ0c1dpdGgobmFtZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9hZGRSZWNyZWF0ZWRDb21wb25lbnQoKSB7XHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHMpIHtcclxuICAgICAgdGhpcy5yZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzLnB1c2goeyBnZXRPcHRpb25QYXRoOiAoKSA9PiB0aGlzLl9nZXRPcHRpb25QYXRoKCkgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2dldE9wdGlvblBhdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdE9wdGlvblBhdGgoKSArIHRoaXMuX29wdGlvblBhdGg7XHJcbiAgfVxyXG5cclxuICBzZXRIb3N0KGhvc3Q6IElOZXN0ZWRPcHRpb25Db250YWluZXIsIG9wdGlvblBhdGg6IElPcHRpb25QYXRoR2V0dGVyKSB7XHJcbiAgICB0aGlzLl9ob3N0ID0gaG9zdDtcclxuICAgIHRoaXMuX2hvc3RPcHRpb25QYXRoID0gb3B0aW9uUGF0aDtcclxuICAgIHRoaXMub3B0aW9uQ2hhbmdlZEhhbmRsZXJzLnN1YnNjcmliZSh0aGlzLl9vcHRpb25DaGFuZ2VkSGFuZGxlci5iaW5kKHRoaXMpKTtcclxuICB9XHJcblxyXG4gIHNldENoaWxkcmVuPFQgZXh0ZW5kcyBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbj4ocHJvcGVydHlOYW1lOiBzdHJpbmcsIGl0ZW1zOiBRdWVyeUxpc3Q8VD4pIHtcclxuICAgIHRoaXMucmVzZXRPcHRpb25zKHByb3BlcnR5TmFtZSk7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbkNvbnRhaW5lckltcGwuc2V0Q2hpbGRyZW4ocHJvcGVydHlOYW1lLCBpdGVtcyk7XHJcbiAgfVxyXG5cclxuICBfZmlsdGVySXRlbXMoaXRlbXM6IFF1ZXJ5TGlzdDxCYXNlTmVzdGVkT3B0aW9uPikge1xyXG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdGhpcyk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5zdGFuY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdD8uaW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVzZXRPcHRpb25zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hvc3QgJiYgdGhpcy5faG9zdC5yZXNldE9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNSZWNyZWF0ZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0LmlzUmVjcmVhdGVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlbW92ZWROZXN0ZWRDb21wb25lbnRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hvc3QgJiYgdGhpcy5faG9zdC5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cztcclxuICB9XHJcblxyXG4gIHNldCByZW1vdmVkTmVzdGVkQ29tcG9uZW50cyh2YWx1ZSkge1xyXG4gICAgdGhpcy5faG9zdC5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0LnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHM7XHJcbiAgfVxyXG5cclxuICBzZXQgcmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cyh2YWx1ZSkge1xyXG4gICAgdGhpcy5faG9zdC5yZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNMaW5rZWQoKSB7XHJcbiAgICByZXR1cm4gISF0aGlzLmluc3RhbmNlICYmIHRoaXMuX2hvc3QuaXNMaW5rZWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgb3B0aW9uQ2hhbmdlZEhhbmRsZXJzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hvc3QgJiYgdGhpcy5faG9zdC5vcHRpb25DaGFuZ2VkSGFuZGxlcnM7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVyIHtcclxuICBzZXRDaGlsZHJlbjogPFQgZXh0ZW5kcyBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbj4ocHJvcGVydHlOYW1lOiBzdHJpbmcsIGl0ZW1zOiBRdWVyeUxpc3Q8VD4pID0+IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXJJbXBsIGltcGxlbWVudHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXIge1xyXG4gIHByaXZhdGUgX2FjdGl2YXRlZFF1ZXJpZXMgPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfc2V0T3B0aW9uOiBGdW5jdGlvbiwgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVySXRlbXM/OiBGdW5jdGlvbikgeyB9XHJcblxyXG4gIHNldENoaWxkcmVuPFQgZXh0ZW5kcyBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbj4ocHJvcGVydHlOYW1lOiBzdHJpbmcsIGl0ZW1zOiBRdWVyeUxpc3Q8VD4pIHtcclxuICAgIGlmICh0aGlzLl9maWx0ZXJJdGVtcykge1xyXG4gICAgICBpdGVtcyA9IHRoaXMuX2ZpbHRlckl0ZW1zKGl0ZW1zKTtcclxuICAgIH1cclxuICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5fYWN0aXZhdGVkUXVlcmllc1twcm9wZXJ0eU5hbWVdID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9hY3RpdmF0ZWRRdWVyaWVzW3Byb3BlcnR5TmFtZV0pIHtcclxuICAgICAgY29uc3Qgd2lkZ2V0SXRlbXMgPSBpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgaXRlbS5faW5kZXggPSBpbmRleDtcclxuICAgICAgICByZXR1cm4gaXRlbS5fdmFsdWU7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLl9zZXRPcHRpb24ocHJvcGVydHlOYW1lLCB3aWRnZXRJdGVtcyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICB0ZW1wbGF0ZTogJycsXHJcbn0pXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOZXN0ZWRPcHRpb24gZXh0ZW5kcyBCYXNlTmVzdGVkT3B0aW9uIHtcclxuICBzZXRIb3N0KGhvc3Q6IElOZXN0ZWRPcHRpb25Db250YWluZXIsIG9wdGlvblBhdGg6IElPcHRpb25QYXRoR2V0dGVyKSB7XHJcbiAgICBzdXBlci5zZXRIb3N0KGhvc3QsIG9wdGlvblBhdGgpO1xyXG5cclxuICAgIHRoaXMuX2hvc3RbdGhpcy5fb3B0aW9uUGF0aF0gPSB0aGlzLl9pbml0aWFsT3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfZnVsbE9wdGlvblBhdGgoKSB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5fZ2V0T3B0aW9uUGF0aCgpfS5gO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbiB7XHJcbiAgX2luZGV4OiBudW1iZXI7XHJcbiAgX3ZhbHVlOiBvYmplY3Q7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlOiAnJyxcclxufSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25OZXN0ZWRPcHRpb24gZXh0ZW5kcyBCYXNlTmVzdGVkT3B0aW9uIGltcGxlbWVudHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb24ge1xyXG4gIF9pbmRleDogbnVtYmVyO1xyXG5cclxuICBwcm90ZWN0ZWQgX2Z1bGxPcHRpb25QYXRoKCkge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuX2dldE9wdGlvblBhdGgoKX1bJHt0aGlzLl9pbmRleH1dLmA7XHJcbiAgfVxyXG5cclxuICBnZXQgX3ZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTGlua2VkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luZGV4ICE9PSB1bmRlZmluZWQgJiYgISF0aGlzLmluc3RhbmNlICYmIHRoaXMuX2hvc3QuaXNMaW5rZWQ7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElPcHRpb25XaXRoVGVtcGxhdGUgZXh0ZW5kcyBCYXNlTmVzdGVkT3B0aW9uIHtcclxuICB0ZW1wbGF0ZTogYW55O1xyXG59XHJcblxyXG5jb25zdCB0cmlnZ2VyU2hvd25FdmVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgY29uc3QgY2hhbmdlSGFuZGxlcnMgPSBbXTtcclxuXHJcbiAgaWYgKCFyZW5kZXIoZWxlbWVudCkuaGFzQ2xhc3MoVklTSUJJTElUWV9DSEFOR0VfU0VMRUNUT1IpKSB7XHJcbiAgICBjaGFuZ2VIYW5kbGVycy5wdXNoKGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlSGFuZGxlcnMucHVzaC5hcHBseShjaGFuZ2VIYW5kbGVycywgZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGAuJHtWSVNJQklMSVRZX0NIQU5HRV9TRUxFQ1RPUn1gKSk7XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgIHRyaWdnZXJIYW5kbGVyKGNoYW5nZUhhbmRsZXJzW2ldLCAnZHhzaG93bicpO1xyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VGVtcGxhdGUob3B0aW9uOiBJT3B0aW9uV2l0aFRlbXBsYXRlLCBlbGVtZW50OiBFbGVtZW50UmVmLCByZW5kZXJlcjogUmVuZGVyZXIyLCBkb2N1bWVudDogYW55KSB7XHJcbiAgaWYgKCFvcHRpb24udGVtcGxhdGUgPT09IHVuZGVmaW5lZCB8fCAhZWxlbWVudC5uYXRpdmVFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgY2hpbGROb2RlcyA9IFtdLnNsaWNlLmNhbGwoZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkTm9kZXMpO1xyXG4gIGNvbnN0IHVzZXJDb250ZW50ID0gY2hpbGROb2Rlcy5maWx0ZXIoKG4pID0+IHtcclxuICAgIGlmIChuLnRhZ05hbWUpIHtcclxuICAgICAgY29uc3QgdGFnTmFtZVByZWZpeCA9IG4udGFnTmFtZS50b0xvd2VyQ2FzZSgpLnN1YnN0cigwLCAzKTtcclxuICAgICAgcmV0dXJuICEodGFnTmFtZVByZWZpeCA9PT0gJ2R4aScgfHwgdGFnTmFtZVByZWZpeCA9PT0gJ2R4bycpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG4ubm9kZU5hbWUgIT09ICcjY29tbWVudCcgJiYgbi50ZXh0Q29udGVudC5yZXBsYWNlKC9cXHMvZywgJycpLmxlbmd0aDtcclxuICB9KTtcclxuICBpZiAoIXVzZXJDb250ZW50Lmxlbmd0aCkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgb3B0aW9uLnRlbXBsYXRlID0ge1xyXG4gICAgcmVuZGVyOiAocmVuZGVyRGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICBkb21BZGFwdGVyLnNldENsYXNzKHJlc3VsdCwgRFhfVEVNUExBVEVfV1JBUFBFUl9DTEFTUywgdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAocmVuZGVyRGF0YS5jb250YWluZXIpIHtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBnZXRFbGVtZW50KHJlbmRlckRhdGEuY29udGFpbmVyKTtcclxuICAgICAgICBjb25zdCByZXN1bHRJbkNvbnRhaW5lciA9IGNvbnRhaW5lci5jb250YWlucyhlbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICByZW5kZXJlci5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmICghcmVzdWx0SW5Db250YWluZXIpIHtcclxuICAgICAgICAgIGNvbnN0IHJlc3VsdEluQm9keSA9IGRvY3VtZW50LmJvZHkuY29udGFpbnMoY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICBpZiAocmVzdWx0SW5Cb2R5KSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJTaG93bkV2ZW50KHJlc3VsdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTmVzdGVkT3B0aW9uSG9zdCB7XHJcbiAgcHJpdmF0ZSBfaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lcjtcclxuXHJcbiAgcHJpdmF0ZSBfb3B0aW9uUGF0aDogSU9wdGlvblBhdGhHZXR0ZXI7XHJcblxyXG4gIGdldEhvc3QoKTogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciB7XHJcbiAgICByZXR1cm4gdGhpcy5faG9zdDtcclxuICB9XHJcblxyXG4gIHNldEhvc3QoaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciwgb3B0aW9uUGF0aD86IElPcHRpb25QYXRoR2V0dGVyKSB7XHJcbiAgICB0aGlzLl9ob3N0ID0gaG9zdDtcclxuICAgIHRoaXMuX29wdGlvblBhdGggPSBvcHRpb25QYXRoIHx8ICgoKSA9PiAnJyk7XHJcbiAgfVxyXG5cclxuICBzZXROZXN0ZWRPcHRpb24obmVzdGVkT3B0aW9uOiBCYXNlTmVzdGVkT3B0aW9uKSB7XHJcbiAgICBuZXN0ZWRPcHRpb24uc2V0SG9zdCh0aGlzLl9ob3N0LCB0aGlzLl9vcHRpb25QYXRoKTtcclxuICB9XHJcbn1cclxuIl19