UNPKG

@hxui/angular

Version:

This README includes the steps that are necessary to import the HxUi-angular into a project or to contribute with development.

388 lines (387 loc) 31 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Directive, ElementRef, EventEmitter, Input, Output, Renderer2, ViewContainerRef } from '@angular/core'; import { filter } from 'rxjs/operators'; import { ComponentLoaderFactory } from '../component-loader/component-loader.factory'; import { DropdownConfig } from './dropdown.config'; import { DropdownContainerComponent } from './dropdown-container.component'; import { DropdownState } from './dropdown.state'; var DropdownDirective = /** @class */ (function () { function DropdownDirective(_elementRef, _renderer, _viewContainerRef, _cis, _config, _state) { this._elementRef = _elementRef; this._renderer = _renderer; this._viewContainerRef = _viewContainerRef; this._cis = _cis; this._config = _config; this._state = _state; this._isInlineOpen = false; this._isInlineRight = false; this._subscriptions = []; this._isInited = false; // create dropdown component loader this._dropdown = this._cis .createLoader(this._elementRef, this._viewContainerRef, this._renderer) .provide({ provide: DropdownState, useValue: this._state }); this.onShown = this._dropdown.onShown; this.onHidden = this._dropdown.onHidden; this.isOpenChange = this._state.isOpenChange; // set initial dropdown state from config this._state.autoClose = this._config.autoClose; } Object.defineProperty(DropdownDirective.prototype, "autoClose", { get: /** * @return {?} */ function () { return this._state.autoClose; }, set: /** * Indicates that dropdown will be closed on item or document click, * and after pressing ESC * @param {?} value * @return {?} */ function (value) { if (typeof value === 'boolean') { this._state.autoClose = value; } }, enumerable: true, configurable: true }); ; Object.defineProperty(DropdownDirective.prototype, "isDisabled", { get: /** * @return {?} */ function () { return this._isDisabled; }, set: /** * Disables dropdown toggle and hides dropdown menu if opened * @param {?} value * @return {?} */ function (value) { this._isDisabled = value; this._state.isDisabledChange.emit(value); if (value) { this.hide(); } }, enumerable: true, configurable: true }); Object.defineProperty(DropdownDirective.prototype, "isRight", { get: /** * Returns whether or not dropdown is position right of the toggle * @return {?} */ function () { return this._isInlineRight; }, set: /** * @param {?} value * @return {?} */ function (value) { this._isInlineRight = value; }, enumerable: true, configurable: true }); Object.defineProperty(DropdownDirective.prototype, "isOpen", { get: /** * Returns whether or not the dropdown is currently being shown * @return {?} */ function () { if (this._showInline) { return this._isInlineOpen; } return this._dropdown.isShown; }, set: /** * @param {?} value * @return {?} */ function (value) { if (value) { this.show(); } else { this.hide(); } }, enumerable: true, configurable: true }); /** * @return {?} */ DropdownDirective.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; // fix: seems there are an issue with `routerLinkActive` // which result in duplicated call ngOnInit without call to ngOnDestroy // read more: https://github.com/valor-software/ngx-bootstrap/issues/1885 if (this._isInited) { return; } this._isInited = true; this._showInline = !this.container; // attach DOM listeners this._dropdown.listen({ triggers: this.triggers, show: function () { return _this.show(); } }); // toggle visibility on toggle element click this._subscriptions.push(this._state .toggleClick.subscribe(function (value) { return _this.toggle(value); })); // hide dropdown if set disabled while opened this._subscriptions.push(this._state .isDisabledChange.pipe(filter(function (value) { return value === true; })).subscribe(function (value) { return _this.hide(); })); // attach dropdown menu inside of dropdown if (this._showInline) { this._state.dropdownMenu .then(function (dropdownMenu) { _this._inlinedMenu = dropdownMenu.viewContainer.createEmbeddedView(dropdownMenu.templateRef); }); } }; /** * Opens an element’s popover. This is considered a “manual” triggering of * the popover. */ /** * Opens an element’s popover. This is considered a “manual” triggering of * the popover. * @return {?} */ DropdownDirective.prototype.show = /** * Opens an element’s popover. This is considered a “manual” triggering of * the popover. * @return {?} */ function () { var _this = this; if (this.isOpen || this.isDisabled) { return; } if (this._showInline) { this._isInlineOpen = true; this.onShown.emit(true); this._state.isOpenChange.emit(true); return; } this._state.dropdownMenu .then(function (dropdownMenu) { // check direction in which dropdown should be opened var /** @type {?} */ _dropup = _this.dropup === true || (typeof _this.dropup !== 'undefined' && _this.dropup !== false); _this._state.direction = _dropup ? 'up' : 'down'; var /** @type {?} */ _placement = _this.placement || (_dropup ? 'top left' : 'bottom left'); // show dropdown // show dropdown _this._dropdown .attach(DropdownContainerComponent) .to(_this.container) .position({ attachment: _placement }) .show({ content: dropdownMenu.templateRef, placement: _placement }); _this._state.isOpenChange.emit(true); }); }; /** * Closes an element’s popover. This is considered a “manual” triggering of * the popover. */ /** * Closes an element’s popover. This is considered a “manual” triggering of * the popover. * @return {?} */ DropdownDirective.prototype.hide = /** * Closes an element’s popover. This is considered a “manual” triggering of * the popover. * @return {?} */ function () { if (!this.isOpen) { return; } if (this._showInline) { this._isInlineOpen = false; this.onHidden.emit(true); } else { this._dropdown.hide(); } this._state.isOpenChange.emit(false); }; /** * Toggles an element’s popover. This is considered a “manual” triggering of * the popover. */ /** * Toggles an element’s popover. This is considered a “manual” triggering of * the popover. * @param {?=} value * @return {?} */ DropdownDirective.prototype.toggle = /** * Toggles an element’s popover. This is considered a “manual” triggering of * the popover. * @param {?=} value * @return {?} */ function (value) { if (this.isOpen || value === false) { return this.hide(); } return this.show(); }; /** * @return {?} */ DropdownDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { try { // clean up subscriptions and destroy dropdown for (var _a = tslib_1.__values(this._subscriptions), _b = _a.next(); !_b.done; _b = _a.next()) { var sub = _b.value; sub.unsubscribe(); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_1) throw e_1.error; } } this._dropdown.dispose(); var e_1, _c; }; DropdownDirective.decorators = [ { type: Directive, args: [{ selector: '[hxDropdown],[dropdown]', exportAs: 'hx-dropdown', providers: [DropdownState], host: { '[class.is-dropup]': 'dropup', '[class.is-open]': 'isOpen', '[class.is-right]': 'isRight' } },] }, ]; /** @nocollapse */ DropdownDirective.ctorParameters = function () { return [ { type: ElementRef, }, { type: Renderer2, }, { type: ViewContainerRef, }, { type: ComponentLoaderFactory, }, { type: DropdownConfig, }, { type: DropdownState, }, ]; }; DropdownDirective.propDecorators = { "placement": [{ type: Input },], "triggers": [{ type: Input },], "container": [{ type: Input },], "dropup": [{ type: Input },], "autoClose": [{ type: Input },], "isDisabled": [{ type: Input },], "isRight": [{ type: Input },], "isOpen": [{ type: Input },], "isOpenChange": [{ type: Output },], "onShown": [{ type: Output },], "onHidden": [{ type: Output },], }; return DropdownDirective; }()); export { DropdownDirective }; function DropdownDirective_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ DropdownDirective.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ DropdownDirective.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ DropdownDirective.propDecorators; /** * Placement of a popover. Accepts: "top", "bottom", "left", "right" * @type {?} */ DropdownDirective.prototype.placement; /** * Specifies events that should trigger. Supports a space separated list of * event names. * @type {?} */ DropdownDirective.prototype.triggers; /** * A selector specifying the element the popover should be appended to. * Currently only supports "body". * @type {?} */ DropdownDirective.prototype.container; /** * This attribute indicates that the dropdown should be opened upwards * @type {?} */ DropdownDirective.prototype.dropup; /** * Emits an event when isOpen change * @type {?} */ DropdownDirective.prototype.isOpenChange; /** * Emits an event when the popover is shown * @type {?} */ DropdownDirective.prototype.onShown; /** * Emits an event when the popover is hidden * @type {?} */ DropdownDirective.prototype.onHidden; /** @type {?} */ DropdownDirective.prototype._isInlineOpen; /** @type {?} */ DropdownDirective.prototype._isInlineRight; /** @type {?} */ DropdownDirective.prototype._showInline; /** @type {?} */ DropdownDirective.prototype._inlinedMenu; /** @type {?} */ DropdownDirective.prototype._isDisabled; /** @type {?} */ DropdownDirective.prototype._dropdown; /** @type {?} */ DropdownDirective.prototype._subscriptions; /** @type {?} */ DropdownDirective.prototype._isInited; /** @type {?} */ DropdownDirective.prototype._elementRef; /** @type {?} */ DropdownDirective.prototype._renderer; /** @type {?} */ DropdownDirective.prototype._viewContainerRef; /** @type {?} */ DropdownDirective.prototype._cis; /** @type {?} */ DropdownDirective.prototype._config; /** @type {?} */ DropdownDirective.prototype._state; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGh4dWkvYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kcm9wZG93bi9kcm9wZG93bi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUFFLFVBQVUsRUFBbUIsWUFBWSxFQUFlLEtBQUssRUFBcUIsTUFBTSxFQUNuRyxTQUFTLEVBQUUsZ0JBQWdCLEVBQzVCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUV0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDOztJQXFIL0MsMkJBQW9CLFdBQXVCLEVBQ3ZCLFdBQ0EsbUJBQ0EsTUFDQSxTQUNBO1FBTEEsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsY0FBUyxHQUFULFNBQVM7UUFDVCxzQkFBaUIsR0FBakIsaUJBQWlCO1FBQ2pCLFNBQUksR0FBSixJQUFJO1FBQ0osWUFBTyxHQUFQLE9BQU87UUFDUCxXQUFNLEdBQU4sTUFBTTs2QkFmRixLQUFLOzhCQUNKLEtBQUs7OEJBTVcsRUFBRTt5QkFDdkIsS0FBSzs7UUFTdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSTthQUN2QixZQUFZLENBQTZCLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDbEcsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxD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Q0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNwQjtRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDcEI7Ozs7SUFFRCx1Q0FBVzs7O0lBQVg7O1lBQ0UsOENBQThDO1lBQzlDLEdBQUcsQ0FBQyxDQUFjLElBQUEsS0FBQSxpQkFBQSxJQUFJLENBQUMsY0FBYyxDQUFBLGdCQUFBO2dCQUFoQyxJQUFNLEdBQUcsV0FBQTtnQkFDWixHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDbkI7Ozs7Ozs7OztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7O0tBQzFCOztnQkFsUEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSx5QkFBeUI7b0JBQ25DLFFBQVEsRUFBRSxhQUFhO29CQUN2QixTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUM7b0JBQzFCLElBQUksRUFBRTt3QkFDSixtQkFBbUIsRUFBRSxRQUFRO3dCQUM3QixpQkFBaUIsRUFBRSxRQUFRO3dCQUMzQixrQkFBa0IsRUFBRSxTQUFTO3FCQUM5QjtpQkFDRjs7OztnQkF0QlksVUFBVTtnQkFDckIsU0FBUztnQkFBRSxnQkFBZ0I7Z0JBSXBCLHNCQUFzQjtnQkFFdEIsY0FBYztnQkFFZCxhQUFhOzs7OEJBa0JuQixLQUFLOzZCQUtMLEtBQUs7OEJBS0wsS0FBSzsyQkFLTCxLQUFLOzhCQU1MLEtBQUs7K0JBYUwsS0FBSzs0QkFhTCxLQUFLOzJCQVdMLEtBQUs7aUNBa0JMLE1BQU07NEJBS04sTUFBTTs2QkFLTixNQUFNOzs0QkFsSFQ7O1NBd0JhLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFbWJlZGRlZFZpZXdSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LFxyXG4gIFJlbmRlcmVyMiwgVmlld0NvbnRhaW5lclJlZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMb2FkZXJGYWN0b3J5IH0gZnJvbSAnLi4vY29tcG9uZW50LWxvYWRlci9jb21wb25lbnQtbG9hZGVyLmZhY3RvcnknO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMb2FkZXIgfSBmcm9tICcuLi9jb21wb25lbnQtbG9hZGVyL2NvbXBvbmVudC1sb2FkZXIuY2xhc3MnO1xyXG5pbXBvcnQgeyBEcm9wZG93bkNvbmZpZyB9IGZyb20gJy4vZHJvcGRvd24uY29uZmlnJztcclxuaW1wb3J0IHsgRHJvcGRvd25Db250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL2Ryb3Bkb3duLWNvbnRhaW5lci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcm9wZG93blN0YXRlIH0gZnJvbSAnLi9kcm9wZG93bi5zdGF0ZSc7XHJcbmltcG9ydCB7IEh4Q29tcG9uZW50UmVmIH0gZnJvbSAnLi4vY29tcG9uZW50LWxvYWRlci9oeC1jb21wb25lbnQtcmVmLmNsYXNzJztcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51RGlyZWN0aXZlIH0gZnJvbSAnLi9kcm9wZG93bi1tZW51LmRpcmVjdGl2ZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1toeERyb3Bkb3duXSxbZHJvcGRvd25dJyxcclxuICBleHBvcnRBczogJ2h4LWRyb3Bkb3duJyxcclxuICBwcm92aWRlcnM6IFtEcm9wZG93blN0YXRlXSxcclxuICBob3N0OiB7XHJcbiAgICAnW2NsYXNzLmlzLWRyb3B1cF0nOiAnZHJvcHVwJyxcclxuICAgICdbY2xhc3MuaXMtb3Blbl0nOiAnaXNPcGVuJyxcclxuICAgICdbY2xhc3MuaXMtcmlnaHRdJzogJ2lzUmlnaHQnXHJcbiAgfVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLyoqXHJcbiAgICogUGxhY2VtZW50IG9mIGEgcG9wb3Zlci4gQWNjZXB0czogXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHBsYWNlbWVudDogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIFNwZWNpZmllcyBldmVudHMgdGhhdCBzaG91bGQgdHJpZ2dlci4gU3VwcG9ydHMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZlxyXG4gICAqIGV2ZW50IG5hbWVzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHRyaWdnZXJzOiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogQSBzZWxlY3RvciBzcGVjaWZ5aW5nIHRoZSBlbGVtZW50IHRoZSBwb3BvdmVyIHNob3VsZCBiZSBhcHBlbmRlZCB0by5cclxuICAgKiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBcImJvZHlcIi5cclxuICAgKi9cclxuICBASW5wdXQoKSBjb250YWluZXI6IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIGRyb3Bkb3duIHNob3VsZCBiZSBvcGVuZWQgdXB3YXJkc1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGRyb3B1cDogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5kaWNhdGVzIHRoYXQgZHJvcGRvd24gd2lsbCBiZSBjbG9zZWQgb24gaXRlbSBvciBkb2N1bWVudCBjbGljayxcclxuICAgKiBhbmQgYWZ0ZXIgcHJlc3NpbmcgRVNDXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2V0IGF1dG9DbG9zZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIHRoaXMuX3N0YXRlLmF1dG9DbG9zZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGdldCBhdXRvQ2xvc2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUuYXV0b0Nsb3NlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzYWJsZXMgZHJvcGRvd24gdG9nZ2xlIGFuZCBoaWRlcyBkcm9wZG93biBtZW51IGlmIG9wZW5lZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNldCBpc0Rpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pc0Rpc2FibGVkID0gdmFsdWU7XHJcbiAgICB0aGlzLl9zdGF0ZS5pc0Rpc2FibGVkQ2hhbmdlLmVtaXQodmFsdWUpO1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0Rpc2FibGVkOyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgZHJvcGRvd24gaXMgcG9zaXRpb24gcmlnaHQgb2YgdGhlIHRvZ2dsZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGdldCBpc1JpZ2h0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzSW5saW5lUmlnaHQ7XHJcbiAgfVxyXG5cclxuICBzZXQgaXNSaWdodCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNJbmxpbmVSaWdodCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZHJvcGRvd24gaXMgY3VycmVudGx5IGJlaW5nIHNob3duXHJcbiAgICovXHJcbiAgQElucHV0KCkgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLl9zaG93SW5saW5lKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9pc0lubGluZU9wZW47XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fZHJvcGRvd24uaXNTaG93bjtcclxuICB9XHJcblxyXG4gIHNldCBpc09wZW4odmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLnNob3coKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiBpc09wZW4gY2hhbmdlXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGlzT3BlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIHBvcG92ZXIgaXMgc2hvd25cclxuICAgKi9cclxuICBAT3V0cHV0KCkgb25TaG93bjogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIHBvcG92ZXIgaXMgaGlkZGVuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9uSGlkZGVuOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgLy8gdG9kbzogbW92ZSB0byBjb21wb25lbnQgbG9hZGVyXHJcbiAgcHJpdmF0ZSBfaXNJbmxpbmVPcGVuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNJbmxpbmVSaWdodCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3Nob3dJbmxpbmU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfaW5saW5lZE1lbnU6IEVtYmVkZGVkVmlld1JlZjxEcm9wZG93bk1lbnVEaXJlY3RpdmU+O1xyXG5cclxuICBwcml2YXRlIF9pc0Rpc2FibGVkOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2Ryb3Bkb3duOiBDb21wb25lbnRMb2FkZXI8RHJvcGRvd25Db250YWluZXJDb21wb25lbnQ+O1xyXG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBfaXNJbml0ZWQgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfY2lzOiBDb21wb25lbnRMb2FkZXJGYWN0b3J5LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbmZpZzogRHJvcGRvd25Db25maWcsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfc3RhdGU6IERyb3Bkb3duU3RhdGUpIHtcclxuICAgIC8vIGNyZWF0ZSBkcm9wZG93biBjb21wb25lbnQgbG9hZGVyXHJcbiAgICB0aGlzLl9kcm9wZG93biA9IHRoaXMuX2Npc1xyXG4gICAgICAuY3JlYXRlTG9hZGVyPERyb3Bkb3duQ29udGFpbmVyQ29tcG9uZW50Pih0aGlzLl9lbGVtZW50UmVmLCB0aGlzLl92aWV3Q29udGFpbmVyUmVmLCB0aGlzLl9yZW5kZXJlcilcclxuICAgICAgLnByb3ZpZGUoeyBwcm92aWRlOiBEcm9wZG93blN0YXRlLCB1c2VWYWx1ZTogdGhpcy5fc3RhdGUgfSk7XHJcblxyXG4gICAgdGhpcy5vblNob3duID0gdGhpcy5fZHJvcGRvd24ub25TaG93bjtcclxuICAgIHRoaXMub25IaWRkZW4gPSB0aGlzLl9kcm9wZG93bi5vbkhpZGRlbjtcclxuICAgIHRoaXMuaXNPcGVuQ2hhbmdlID0gdGhpcy5fc3RhdGUuaXNPcGVuQ2hhbmdlO1xyXG5cclxuICAgIC8vIHNldCBpbml0aWFsIGRyb3Bkb3duIHN0YXRlIGZyb20gY29uZmlnXHJcbiAgICB0aGlzLl9zdGF0ZS5hdXRvQ2xvc2UgPSB0aGlzLl9jb25maWcuYXV0b0Nsb3NlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyBmaXg6IHNlZW1zIHRoZXJlIGFyZSBhbiBpc3N1ZSB3aXRoIGByb3V0ZXJMaW5rQWN0aXZlYFxyXG4gICAgLy8gd2hpY2ggcmVzdWx0IGluIGR1cGxpY2F0ZWQgY2FsbCBuZ09uSW5pdCB3aXRob3V0IGNhbGwgdG8gbmdPbkRlc3Ryb3lcclxuICAgIC8vIHJlYWQgbW9yZTogaHR0cHM6Ly9naXRodWIuY29tL3ZhbG9yLXNvZnR3YXJlL25neC1ib290c3RyYXAvaXNzdWVzLzE4ODVcclxuICAgIGlmICh0aGlzLl9pc0luaXRlZCkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuX2lzSW5pdGVkID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLl9zaG93SW5saW5lID0gIXRoaXMuY29udGFpbmVyO1xyXG5cclxuICAgIC8vIGF0dGFjaCBET00gbGlzdGVuZXJzXHJcbiAgICB0aGlzLl9kcm9wZG93bi5saXN0ZW4oe1xyXG4gICAgICB0cmlnZ2VyczogdGhpcy50cmlnZ2VycyxcclxuICAgICAgc2hvdzogKCkgPT4gdGhpcy5zaG93KClcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIHRvZ2dsZSB2aXNpYmlsaXR5IG9uIHRvZ2dsZSBlbGVtZW50IGNsaWNrXHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnB1c2godGhpcy5fc3RhdGVcclxuICAgICAgLnRvZ2dsZUNsaWNrLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHRoaXMudG9nZ2xlKHZhbHVlKSkpO1xyXG5cclxuICAgIC8vIGhpZGUgZHJvcGRvd24gaWYgc2V0IGRpc2FibGVkIHdoaWxlIG9wZW5lZFxyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMuX3N0YXRlXHJcbiAgICAgIC5pc0Rpc2FibGVkQ2hhbmdlLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKCh2YWx1ZTogYm9vbGVhbikgPT4gdmFsdWUgPT09IHRydWUpXHJcbiAgICAgICkuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4gdGhpcy5oaWRlKCkpKTtcclxuXHJcbiAgICAvLyBhdHRhY2ggZHJvcGRvd24gbWVudSBpbnNpZGUgb2YgZHJvcGRvd25cclxuICAgIGlmICh0aGlzLl9zaG93SW5saW5lKSB7XHJcbiAgICAgIHRoaXMuX3N0YXRlLmRyb3Bkb3duTWVudVxyXG4gICAgICAgIC50aGVuKChkcm9wZG93bk1lbnU6IEh4Q29tcG9uZW50UmVmPERyb3Bkb3duTWVudURpcmVjdGl2ZT4pID0+IHtcclxuICAgICAgICAgIHRoaXMuX2lubGluZWRNZW51ID0gZHJvcGRvd25NZW51LnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KGRyb3Bkb3duTWVudS50ZW1wbGF0ZVJlZik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcGVucyBhbiBlbGVtZW504oCZcyBwb3BvdmVyLiBUaGlzIGlzIGNvbnNpZGVyZWQgYSDigJxtYW51YWzigJ0gdHJpZ2dlcmluZyBvZlxyXG4gICAqIHRoZSBwb3BvdmVyLlxyXG4gICAqL1xyXG4gIHNob3coKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc09wZW4gfHwgdGhpcy5pc0Rpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fc2hvd0lubGluZSkge1xyXG4gICAgICB0aGlzLl9pc0lubGluZU9wZW4gPSB0cnVlO1xyXG4gICAgICB0aGlzLm9uU2hvd24uZW1pdCh0cnVlKTtcclxuICAgICAgdGhpcy5fc3RhdGUuaXNPcGVuQ2hhbmdlLmVtaXQodHJ1ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3N0YXRlLmRyb3Bkb3duTWVudVxyXG4gICAgICAudGhlbigoZHJvcGRvd25NZW51KSA9PiB7XHJcbiAgICAgICAgLy8gY2hlY2sgZGlyZWN0aW9uIGluIHdoaWNoIGRyb3Bkb3duIHNob3VsZCBiZSBvcGVuZWRcclxuICAgICAgICBjb25zdCBfZHJvcHVwID0gdGhpcy5kcm9wdXAgPT09IHRydWUgfHxcclxuICAgICAgICAgICh0eXBlb2YgdGhpcy5kcm9wdXAgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZHJvcHVwICE9PSBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUuZGlyZWN0aW9uID0gX2Ryb3B1cCA/ICd1cCcgOiAnZG93bic7XHJcbiAgICAgICAgY29uc3QgX3BsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50IHx8XHJcbiAgICAgICAgICAoX2Ryb3B1cCA/ICd0b3AgbGVmdCcgOiAnYm90dG9tIGxlZnQnKTtcclxuXHJcbiAgICAgICAgLy8gc2hvdyBkcm9wZG93blxyXG4gICAgICAgIHRoaXMuX2Ryb3Bkb3duXHJcbiAgICAgICAgICAuYXR0YWNoKERyb3Bkb3duQ29udGFpbmVyQ29tcG9uZW50KVxyXG4gICAgICAgICAgLnRvKHRoaXMuY29udGFpbmVyKVxyXG4gICAgICAgICAgLnBvc2l0aW9uKHsgYXR0YWNobWVudDogX3BsYWNlbWVudCB9KVxyXG4gICAgICAgICAgLnNob3coe1xyXG4gICAgICAgICAgICBjb250ZW50OiBkcm9wZG93bk1lbnUudGVtcGxhdGVSZWYsXHJcbiAgICAgICAgICAgIHBsYWNlbWVudDogX3BsYWNlbWVudFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0YXRlLmlzT3BlbkNoYW5nZS5lbWl0KHRydWUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZXMgYW4gZWxlbWVudOKAmXMgcG9wb3Zlci4gVGhpcyBpcyBjb25zaWRlcmVkIGEg4oCcbWFudWFs4oCdIHRyaWdnZXJpbmcgb2ZcclxuICAgKiB0aGUgcG9wb3Zlci5cclxuICAgKi9cclxuICBoaWRlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzT3Blbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3Nob3dJbmxpbmUpIHtcclxuICAgICAgdGhpcy5faXNJbmxpbmVPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMub25IaWRkZW4uZW1pdCh0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2Ryb3Bkb3duLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zdGF0ZS5pc09wZW5DaGFuZ2UuZW1pdChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUb2dnbGVzIGFuIGVsZW1lbnTigJlzIHBvcG92ZXIuIFRoaXMgaXMgY29uc2lkZXJlZCBhIOKAnG1hbnVhbOKAnSB0cmlnZ2VyaW5nIG9mXHJcbiAgICogdGhlIHBvcG92ZXIuXHJcbiAgICovXHJcbiAgdG9nZ2xlKHZhbHVlPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNPcGVuIHx8IHZhbHVlID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2hvdygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAvLyBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBkZXN0cm95IGRyb3Bkb3duXHJcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLl9zdWJzY3JpcHRpb25zKSB7XHJcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZHJvcGRvd24uZGlzcG9zZSgpO1xyXG4gIH1cclxufVxyXG4iXX0=