UNPKG

devextreme-angular

Version:

Angular UI and visualization components based on DevExtreme widgets

240 lines 32.1 kB
/*! * devextreme-angular * Version: 22.1.14 * Build date: Mon Apr 29 2024 * * Copyright (c) 2012 - 2024 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 { DX_TEMPLATE_WRAPPER_CLASS } from './template'; import { getElement } from './utils'; import render from 'devextreme/core/renderer'; import { triggerHandler } from 'devextreme/events'; import domAdapter from 'devextreme/core/dom_adapter'; import * as i0 from "@angular/core"; const VISIBILITY_CHANGE_SELECTOR = 'dx-visibility-change-handler'; export class BaseNestedOption { constructor() { this._initialOptions = {}; this._collectionContainerImpl = new CollectionNestedOptionContainerImpl(this._setOption.bind(this), this._filterItems.bind(this)); } _optionChangedHandler(e) { let fullOptionPath = this._fullOptionPath(); if (e.fullName.indexOf(fullOptionPath) === 0) { let optionName = e.fullName.slice(fullOptionPath.length); let 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); } else { 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) => { return item !== this; }); } get instance() { return this._host && 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 */ BaseNestedOption.ɵfac = function BaseNestedOption_Factory(t) { return new (t || BaseNestedOption)(); }; /** @nocollapse */ BaseNestedOption.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: BaseNestedOption, selectors: [["ng-component"]], decls: 0, vars: 0, template: function BaseNestedOption_Template(rf, ctx) { }, encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseNestedOption, [{ type: Component, args: [{ template: '' }] }], function () { return []; }, null); })(); export class CollectionNestedOptionContainerImpl { constructor(_setOption, _filterItems) { this._setOption = _setOption; this._filterItems = _filterItems; this._activatedQueries = {}; } setChildren(propertyName, items) { if (this._filterItems) { items = this._filterItems(items); } if (items.length) { this._activatedQueries[propertyName] = true; } if (this._activatedQueries[propertyName]) { let 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 */ NestedOption.ɵfac = /** @pureOrBreakMyCode */ function () { let ɵNestedOption_BaseFactory; return function NestedOption_Factory(t) { return (ɵNestedOption_BaseFactory || (ɵNestedOption_BaseFactory = i0.ɵɵgetInheritedFactory(NestedOption)))(t || NestedOption); }; }(); /** @nocollapse */ NestedOption.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: NestedOption, selectors: [["ng-component"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function NestedOption_Template(rf, ctx) { }, encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NestedOption, [{ type: Component, args: [{ template: '' }] }], null, null); })(); export class CollectionNestedOption extends BaseNestedOption { _fullOptionPath() { return `${this._getOptionPath()}[${this._index}].`; } get _value() { return this._initialOptions; } get isLinked() { return this._index !== undefined && !!this.instance && this._host.isLinked; } } /** @nocollapse */ CollectionNestedOption.ɵfac = /** @pureOrBreakMyCode */ function () { let ɵCollectionNestedOption_BaseFactory; return function CollectionNestedOption_Factory(t) { return (ɵCollectionNestedOption_BaseFactory || (ɵCollectionNestedOption_BaseFactory = i0.ɵɵgetInheritedFactory(CollectionNestedOption)))(t || CollectionNestedOption); }; }(); /** @nocollapse */ CollectionNestedOption.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: CollectionNestedOption, selectors: [["ng-component"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function CollectionNestedOption_Template(rf, ctx) { }, encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CollectionNestedOption, [{ type: Component, args: [{ template: '' }] }], null, null); })(); let triggerShownEvent = function (element) { let 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; } let childNodes = [].slice.call(element.nativeElement.childNodes); let userContent = childNodes.filter((n) => { if (n.tagName) { let tagNamePrefix = n.tagName.toLowerCase().substr(0, 3); return !(tagNamePrefix === 'dxi' || tagNamePrefix === 'dxo'); } else { return n.nodeName !== '#comment' && n.textContent.replace(/\s/g, '').length; } }); if (!userContent.length) { return; } option.template = { render: (renderData) => { let result = element.nativeElement; domAdapter.setClass(result, DX_TEMPLATE_WRAPPER_CLASS, true); if (renderData.container) { let container = getElement(renderData.container); let resultInContainer = container.contains(element.nativeElement); renderer.appendChild(container, element.nativeElement); if (!resultInContainer) { let resultInBody = document.body.contains(container); if (resultInBody) { triggerShownEvent(result); } } } return result; } }; } export class NestedOptionHost { 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLW9wdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2Rpc3QvY29yZS9uZXN0ZWQtb3B0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBb0MsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXJDLE9BQU8sTUFBTSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLFVBQVUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFFckQsTUFBTSwwQkFBMEIsR0FBRyw4QkFBOEIsQ0FBQztBQWlCbEUsTUFBTSxPQUFnQixnQkFBZ0I7SUFTbEM7UUFMVSxvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQU0zQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxtQ0FBbUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RJLENBQUM7SUFFUyxxQkFBcUIsQ0FBQyxDQUFNO1FBQ2xDLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU1QyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxQyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekQsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMs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LElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRTtnQkFDdEIsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDakQsSUFBSSxpQkFBaUIsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFFbEUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUV2RCxJQUFJLENBQUMsaUJBQWlCLEVBQUU7b0JBQ3BCLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUVyRCxJQUFJLFlBQVksRUFBRTt3QkFDZCxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDN0I7aUJBQ0o7YUFDSjtZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7S0FDSixDQUFDO0FBQ04sQ0FBQztBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFJekIsT0FBTztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsT0FBTyxDQUFDLElBQTRCLEVBQUUsVUFBOEI7UUFDaEUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsZUFBZSxDQUFDLFlBQThCO1FBQzFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBkZXZleHRyZW1lLWFuZ3VsYXJcbiAqIFZlcnNpb246IDIyLjEuMTRcbiAqIEJ1aWxkIGRhdGU6IE1vbiBBcHIgMjkgMjAyNFxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMiAtIDIwMjQgRGV2ZWxvcGVyIEV4cHJlc3MgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVEXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtc1xuICogb2YgdGhlIE1JVCBsaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBmb3IgZGV0YWlscy5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vRGV2RXhwcmVzcy9kZXZleHRyZW1lLWFuZ3VsYXJcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIFF1ZXJ5TGlzdCwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRFhfVEVNUExBVEVfV1JBUFBFUl9DTEFTUyB9IGZyb20gJy4vdGVtcGxhdGUnO1xuaW1wb3J0IHsgZ2V0RWxlbWVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG5pbXBvcnQgcmVuZGVyIGZyb20gJ2RldmV4dHJlbWUvY29yZS9yZW5kZXJlcic7XG5pbXBvcnQgeyB0cmlnZ2VySGFuZGxlciB9IGZyb20gJ2RldmV4dHJlbWUvZXZlbnRzJztcbmltcG9ydCBkb21BZGFwdGVyIGZyb20gJ2RldmV4dHJlbWUvY29yZS9kb21fYWRhcHRlcic7XG5cbmNvbnN0IFZJU0lCSUxJVFlfQ0hBTkdFX1NFTEVDVE9SID0gJ2R4LXZpc2liaWxpdHktY2hhbmdlLWhhbmRsZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElOZXN0ZWRPcHRpb25Db250YWluZXIge1xuICAgIGluc3RhbmNlOiBhbnk7XG4gICAgaXNMaW5rZWQ6IGJvb2xlYW47XG4gICAgcmVtb3ZlZE5lc3RlZENvbXBvbmVudHM6IHN0cmluZ1tdO1xuICAgIG9wdGlvbkNoYW5nZWRIYW5kbGVyczogRXZlbnRFbWl0dGVyPGFueT47XG4gICAgcmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50czogYW55W107XG4gICAgcmVzZXRPcHRpb25zOiAoY29sbGVjdGlvbk5hbWU/OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgaXNSZWNyZWF0ZWQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9wdGlvblBhdGhHZXR0ZXIgeyAoKTogc3RyaW5nOyB9XG5cbkBDb21wb25lbnQoe1xuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTmVzdGVkT3B0aW9uIGltcGxlbWVudHMgSU5lc3RlZE9wdGlvbkNvbnRhaW5lciwgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXIge1xuICAgIHByb3RlY3RlZCBfaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lcjtcbiAgICBwcm90ZWN0ZWQgX2hvc3RPcHRpb25QYXRoOiBJT3B0aW9uUGF0aEdldHRlcjtcbiAgICBwcml2YXRlIF9jb2xsZWN0aW9uQ29udGFpbmVySW1wbDogSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXI7XG4gICAgcHJvdGVjdGVkIF9pbml0aWFsT3B0aW9ucyA9IHt9O1xuXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBfb3B0aW9uUGF0aCgpOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IF9mdWxsT3B0aW9uUGF0aCgpOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fY29sbGVjdGlvbkNvbnRhaW5lckltcGwgPSBuZXcgQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lckltcGwodGhpcy5fc2V0T3B0aW9uLmJpbmQodGhpcyksIHRoaXMuX2ZpbHRlckl0ZW1zLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfb3B0aW9uQ2hhbmdlZEhhbmRsZXIoZTogYW55KSB7XG4gICAgICAgIGxldCBmdWxsT3B0aW9uUGF0aCA9IHRoaXMuX2Z1bGxPcHRpb25QYXRoKCk7XG5cbiAgICAgICAgaWYgKGUuZnVsbE5hbWUuaW5kZXhPZihmdWxsT3B0aW9uUGF0aCkgPT09IDApIHtcbiAgICAgICAgICAgIGxldCBvcHRpb25OYW1lID0gZS5mdWxsTmFtZS5zbGljZShmdWxsT3B0aW9uUGF0aC5sZW5ndGgpO1xuICAgICAgICAgICAgbGV0IGVtaXR0ZXIgPSB0aGlzW29wdGlvbk5hbWUgKyAnQ2hhbmdlJ107XG5cbiAgICAgICAgICAgIGlmIChlbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5uZXh0KGUudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jcmVhdGVFdmVudEVtaXR0ZXJzKGV2ZW50cykge1xuICAgICAgICBldmVudHMuZm9yRWFjaChldmVudCA9PiB7XG4gICAgICAgICAgICB0aGlzW2V2ZW50LmVtaXRdID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2dldE9wdGlvbihuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICBpZiAodGhpcy5pc0xpbmtlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2Uub3B0aW9uKHRoaXMuX2Z1bGxPcHRpb25QYXRoKCkgKyBuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbml0aWFsT3B0aW9uc1tuYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfc2V0T3B0aW9uKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5pc0xpbmtlZCkge1xuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLl9mdWxsT3B0aW9uUGF0aCgpICsgbmFtZTtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2Uub3B0aW9uKGZ1bGxQYXRoLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsT3B0aW9uc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9hZGRSZW1vdmVkT3B0aW9uKG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzLnB1c2gobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2RlbGV0ZVJlbW92ZWRPcHRpb25zKG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzID0gdGhpcy5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cy5maWx0ZXIoKHgpID0+ICF4LnN0YXJ0c1dpdGgobmFtZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9hZGRSZWNyZWF0ZWRDb21wb25lbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cykge1xuICAgICAgICAgICAgdGhpcy5yZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzLnB1c2goeyBnZXRPcHRpb25QYXRoOiAoKSA9PiB0aGlzLl9nZXRPcHRpb25QYXRoKCkgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2dldE9wdGlvblBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ob3N0T3B0aW9uUGF0aCgpICsgdGhpcy5fb3B0aW9uUGF0aDtcbiAgICB9XG5cbiAgICBzZXRIb3N0KGhvc3Q6IElOZXN0ZWRPcHRpb25Db250YWluZXIsIG9wdGlvblBhdGg6IElPcHRpb25QYXRoR2V0dGVyKSB7XG4gICAgICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgICAgICB0aGlzLl9ob3N0T3B0aW9uUGF0aCA9IG9wdGlvblBhdGg7XG4gICAgICAgIHRoaXMub3B0aW9uQ2hhbmdlZEhhbmRsZXJzLnN1YnNjcmliZSh0aGlzLl9vcHRpb25DaGFuZ2VkSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBzZXRDaGlsZHJlbjxUIGV4dGVuZHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb24+KHByb3BlcnR5TmFtZTogc3RyaW5nLCBpdGVtczogUXVlcnlMaXN0PFQ+KSB7XG4gICAgICAgIHRoaXMucmVzZXRPcHRpb25zKHByb3BlcnR5TmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uQ29udGFpbmVySW1wbC5zZXRDaGlsZHJlbihwcm9wZXJ0eU5hbWUsIGl0ZW1zKTtcbiAgICB9XG5cbiAgICBfZmlsdGVySXRlbXMoaXRlbXM6IFF1ZXJ5TGlzdDxCYXNlTmVzdGVkT3B0aW9uPikge1xuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7IHJldHVybiBpdGVtICE9PSB0aGlzOyB9KTtcbiAgICB9XG5cbiAgICBnZXQgaW5zdGFuY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ob3N0ICYmIHRoaXMuX2hvc3QuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgZ2V0IHJlc2V0T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3QgJiYgdGhpcy5faG9zdC5yZXNldE9wdGlvbnM7XG4gICAgfVxuXG4gICAgZ2V0IGlzUmVjcmVhdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0LmlzUmVjcmVhdGVkO1xuICAgIH1cblxuICAgIGdldCByZW1vdmVkTmVzdGVkQ29tcG9uZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3QgJiYgdGhpcy5faG9zdC5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cztcbiAgICB9XG5cbiAgICBzZXQgcmVtb3ZlZE5lc3RlZENvbXBvbmVudHModmFsdWUpIHtcbiAgICAgICAgdGhpcy5faG9zdC5yZW1vdmVkTmVzdGVkQ29tcG9uZW50cyA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCByZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0LnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgc2V0IHJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHModmFsdWUpIHtcbiAgICAgICAgdGhpcy5faG9zdC5yZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IGlzTGlua2VkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmluc3RhbmNlICYmIHRoaXMuX2hvc3QuaXNMaW5rZWQ7XG4gICAgfVxuXG4gICAgZ2V0IG9wdGlvbkNoYW5nZWRIYW5kbGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3QgJiYgdGhpcy5faG9zdC5vcHRpb25DaGFuZ2VkSGFuZGxlcnM7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVyIHtcbiAgICBzZXRDaGlsZHJlbjxUIGV4dGVuZHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb24+KHByb3BlcnR5TmFtZTogc3RyaW5nLCBpdGVtczogUXVlcnlMaXN0PFQ+KTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXJJbXBsIGltcGxlbWVudHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXIge1xuICAgIHByaXZhdGUgX2FjdGl2YXRlZFF1ZXJpZXMgPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NldE9wdGlvbjogRnVuY3Rpb24sIHByaXZhdGUgX2ZpbHRlckl0ZW1zPzogRnVuY3Rpb24pIHsgfVxuXG4gICAgc2V0Q2hpbGRyZW48VCBleHRlbmRzIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uPihwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXRlbXM6IFF1ZXJ5TGlzdDxUPikge1xuICAgICAgICBpZiAodGhpcy5fZmlsdGVySXRlbXMpIHtcbiAgICAgICAgICAgIGl0ZW1zID0gdGhpcy5fZmlsdGVySXRlbXMoaXRlbXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2YXRlZFF1ZXJpZXNbcHJvcGVydHlOYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2YXRlZFF1ZXJpZXNbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICAgICAgbGV0IHdpZGdldEl0ZW1zID0gaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0uX2luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uX3ZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9zZXRPcHRpb24ocHJvcGVydHlOYW1lLCB3aWRnZXRJdGVtcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOZXN0ZWRPcHRpb24gZXh0ZW5kcyBCYXNlTmVzdGVkT3B0aW9uIHtcbiAgICBzZXRIb3N0KGhvc3Q6IElOZXN0ZWRPcHRpb25Db250YWluZXIsIG9wdGlvblBhdGg6IElPcHRpb25QYXRoR2V0dGVyKSB7XG4gICAgICAgIHN1cGVyLnNldEhvc3QoaG9zdCwgb3B0aW9uUGF0aCk7XG5cbiAgICAgICAgdGhpcy5faG9zdFt0aGlzLl9vcHRpb25QYXRoXSA9IHRoaXMuX2luaXRpYWxPcHRpb25zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZnVsbE9wdGlvblBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb25QYXRoKCkgKyAnLic7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uIHtcbiAgICBfaW5kZXg6IG51bWJlcjtcbiAgICBfdmFsdWU6IE9iamVjdDtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGU6ICcnXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25OZXN0ZWRPcHRpb24gZXh0ZW5kcyBCYXNlTmVzdGVkT3B0aW9uIGltcGxlbWVudHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb24ge1xuICAgIF9pbmRleDogbnVtYmVyO1xuXG4gICAgcHJvdGVjdGVkIF9mdWxsT3B0aW9uUGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuX2dldE9wdGlvblBhdGgoKX1bJHt0aGlzLl9pbmRleH1dLmA7XG4gICAgfVxuXG4gICAgZ2V0IF92YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRpYWxPcHRpb25zO1xuICAgIH1cblxuICAgIGdldCBpc0xpbmtlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4ICE9PSB1bmRlZmluZWQgJiYgISF0aGlzLmluc3RhbmNlICYmIHRoaXMuX2hvc3QuaXNMaW5rZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPcHRpb25XaXRoVGVtcGxhdGUgZXh0ZW5kcyBCYXNlTmVzdGVkT3B0aW9uIHtcbiAgICB0ZW1wbGF0ZTogYW55O1xufVxuXG5sZXQgdHJpZ2dlclNob3duRXZlbnQgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgbGV0IGNoYW5nZUhhbmRsZXJzID0gW107XG5cbiAgICBpZiAoIXJlbmRlcihlbGVtZW50KS5oYXNDbGFzcyhWSVNJQklMSVRZX0NIQU5HRV9TRUxFQ1RPUikpIHtcbiAgICAgICAgY2hhbmdlSGFuZGxlcnMucHVzaChlbGVtZW50KTtcbiAgICB9XG5cbiAgICBjaGFuZ2VIYW5kbGVycy5wdXNoLmFwcGx5KGNoYW5nZUhhbmRsZXJzLCBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgVklTSUJJTElUWV9DSEFOR0VfU0VMRUNUT1IpKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckhhbmRsZXIoY2hhbmdlSGFuZGxlcnNbaV0sICdkeHNob3duJyk7XG4gICAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RUZW1wbGF0ZShvcHRpb246IElPcHRpb25XaXRoVGVtcGxhdGUsIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHJlbmRlcmVyOiBSZW5kZXJlcjIsIGRvY3VtZW50OiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbi50ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkIHx8ICFlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgY2hpbGROb2RlcyA9IFtdLnNsaWNlLmNhbGwoZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkTm9kZXMpO1xuICAgIGxldCB1c2VyQ29udGVudCA9IGNoaWxkTm9kZXMuZmlsdGVyKChuKSA9PiB7XG4gICAgICAgIGlmIChuLnRhZ05hbWUpIHtcbiAgICAgICAgICAgIGxldCB0YWdOYW1lUHJlZml4ID0gbi50YWdOYW1lLnRvTG93ZXJDYXNlKCkuc3Vic3RyKDAsIDMpO1xuICAgICAgICAgICAgcmV0dXJuICEodGFnTmFtZVByZWZpeCA9PT0gJ2R4aScgfHwgdGFnTmFtZVByZWZpeCA9PT0gJ2R4bycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG4ubm9kZU5hbWUgIT09ICcjY29tbWVudCcgJiYgbi50ZXh0Q29udGVudC5yZXBsYWNlKC9cXHMvZywgJycpLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghdXNlckNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcHRpb24udGVtcGxhdGUgPSB7XG4gICAgICAgIHJlbmRlcjogKHJlbmRlckRhdGEpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGRvbUFkYXB0ZXIuc2V0Q2xhc3MocmVzdWx0LCBEWF9URU1QTEFURV9XUkFQUEVSX0NMQVNTLCB0cnVlKTtcblxuICAgICAgICAgICAgaWYgKHJlbmRlckRhdGEuY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IGdldEVsZW1lbnQocmVuZGVyRGF0YS5jb250YWluZXIpO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHRJbkNvbnRhaW5lciA9IGNvbnRhaW5lci5jb250YWlucyhlbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRJbkNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0SW5Cb2R5ID0gZG9jdW1lbnQuYm9keS5jb250YWlucyhjb250YWluZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRJbkJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJTaG93bkV2ZW50KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgTmVzdGVkT3B0aW9uSG9zdCB7XG4gICAgcHJpdmF0ZSBfaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lcjtcbiAgICBwcml2YXRlIF9vcHRpb25QYXRoOiBJT3B0aW9uUGF0aEdldHRlcjtcblxuICAgIGdldEhvc3QoKTogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ob3N0O1xuICAgIH1cblxuICAgIHNldEhvc3QoaG9zdDogSU5lc3RlZE9wdGlvbkNvbnRhaW5lciwgb3B0aW9uUGF0aD86IElPcHRpb25QYXRoR2V0dGVyKSB7XG4gICAgICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgICAgICB0aGlzLl9vcHRpb25QYXRoID0gb3B0aW9uUGF0aCB8fCAoKCkgPT4gJycpO1xuICAgIH1cblxuICAgIHNldE5lc3RlZE9wdGlvbihuZXN0ZWRPcHRpb246IEJhc2VOZXN0ZWRPcHRpb24pIHtcbiAgICAgICAgbmVzdGVkT3B0aW9uLnNldEhvc3QodGhpcy5faG9zdCwgdGhpcy5fb3B0aW9uUGF0aCk7XG4gICAgfVxufVxuIl19