@hxui/angular
Version:
* * *
282 lines • 25.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input, ViewChild } from '@angular/core';
import { FilterType } from './filters-type.enum';
import { FiltersModel } from './filters.model';
import * as _ from 'lodash';
import { Subject, Subscription } from 'rxjs/index';
import { FiltersConfig } from './filters.config';
import { debounceTime } from 'rxjs/internal/operators';
var FiltersComponent = /** @class */ (function () {
function FiltersComponent(conf) {
this.conf = conf;
this.FilterType = FilterType;
this.data = [];
this.onFilterOptionChanged$ = new Subject();
this.searchFilter$ = new Subject();
this.subscriptions = new Subscription();
this._filters = [];
this._oldFilters = [];
this._collapsed = false;
Object.assign(this, conf);
}
Object.defineProperty(FiltersComponent.prototype, "collapsed", {
get: /**
* @return {?}
*/
function () {
return this._collapsed;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._collapsed = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(FiltersComponent.prototype, "filters", {
get: /**
* @return {?}
*/
function () {
return this._filters;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._filters = value;
this.setData();
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
FiltersComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.subscriptions.add(this.searchFilter$
.pipe(debounceTime(this.conf.debounce))
.subscribe(function (x) { return _this.onFilterOptionChanged$.next(x); }));
};
/**
* @return {?}
*/
FiltersComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.subscriptions.unsubscribe();
};
/**
* @return {?}
*/
FiltersComponent.prototype.ngDoCheck = /**
* @return {?}
*/
function () {
if (!_.isEqual(this._filters, this._oldFilters)) {
this._oldFilters = _.cloneDeep(this._filters);
this.setData();
}
};
/**
* @param {?=} silent
* @return {?}
*/
FiltersComponent.prototype.resetFilters = /**
* @param {?=} silent
* @return {?}
*/
function (silent) {
if (silent === void 0) { silent = false; }
var e_1, _a;
try {
for (var _b = tslib_1.__values(this.data), _c = _b.next(); !_c.done; _c = _b.next()) {
var filter = _c.value;
if (filter.type === FilterType.SingleSelect) {
filter.setDefaultOption();
if (!silent) {
this.onFilterOptionChanged$.next(filter);
}
}
else if (filter.type === FilterType.Search) {
this.clearSearch(filter, silent);
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
};
/**
* @param {?} filter
* @param {?=} silent
* @return {?}
*/
FiltersComponent.prototype.clearSearch = /**
* @param {?} filter
* @param {?=} silent
* @return {?}
*/
function (filter, silent) {
if (silent === void 0) { silent = false; }
filter.value = '';
if (!silent) {
this.onFilterOptionChanged$.next(filter);
}
};
/**
* Called when filter option is selected
*/
/**
* Called when filter option is selected
* @param {?} filter
* @param {?} option
* @return {?}
*/
FiltersComponent.prototype.onFilterOptionSelected = /**
* Called when filter option is selected
* @param {?} filter
* @param {?} option
* @return {?}
*/
function (filter, option) {
filter.setSelectedOption(option);
this.onFilterOptionChanged$.next(filter);
};
/**
* Called when character is typed in the search filter type
*/
/**
* Called when character is typed in the search filter type
* @param {?} filter
* @return {?}
*/
FiltersComponent.prototype.onSearchFilterChange = /**
* Called when character is typed in the search filter type
* @param {?} filter
* @return {?}
*/
function (filter) {
if (filter.value.length === 0 || filter.value.length >= filter.charLimit) {
this.searchFilter$.next(filter);
}
};
/**
* @param {?} $event
* @return {?}
*/
FiltersComponent.prototype.onCollapsedFilter = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.onFilterOptionSelected($event.filter, $event.option);
};
/**
* @param {?} $event
* @return {?}
*/
FiltersComponent.prototype.onCollapsedSearch = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.onSearchFilterChange($event.filter);
};
/**
* Used for track by and boost performance
*/
/**
* Used for track by and boost performance
* @param {?} index
* @param {?} action
* @return {?}
*/
FiltersComponent.prototype.trackByFn = /**
* Used for track by and boost performance
* @param {?} index
* @param {?} action
* @return {?}
*/
function (index, action) {
return index;
};
/**
* Convert filter config objects to Filter Models
*/
/**
* Convert filter config objects to Filter Models
* @return {?}
*/
FiltersComponent.prototype.setData = /**
* Convert filter config objects to Filter Models
* @return {?}
*/
function () {
var _this = this;
this.data = [];
if (this._filters) {
this._filters.forEach(function (filter, index) {
_this.data.push(new FiltersModel(_.cloneDeep(filter)));
});
}
};
FiltersComponent.decorators = [
{ type: Component, args: [{
selector: 'hxa-filters',
template: "<div class=\"hx-flex hx-flex-align-center\">\n\n <i class=\"hx-icon icon-filter-outline mx-1\"></i>\n\n <!-- collapsed filters -->\n <hxa-filters-collapsed (onFilter)=\"onCollapsedFilter($event)\" (onSearchFilter)=\"onCollapsedSearch($event)\" [data]=\"data\" *ngIf=\"collapsed\"></hxa-filters-collapsed>\n\n <!-- expanded filters -->\n <ng-container *ngIf=\"!collapsed\">\n <ng-container *ngFor=\"let filter of data;trackBy: trackByFn;let lastItem = last;\">\n\n <!-- single select filter -->\n <div [id]=\"filter?.id\" class=\"hx-dropdown mx-1 expandedFilter\" hxaDropdown [minWidthRelativeTo]=\"filter?.id + '-trigger'\" *ngIf=\"filter?.type === FilterType.SingleSelect\">\n <a [id]=\"filter?.id + '-trigger'\" class=\"hx-button hx-button-dropdown expandedFilter__button\" hxaDropdownToggle>\n <span class=\"is-text-weight-light\">{{filter?.label}}: </span>\n <span class=\"hx-icon-control\" *ngIf=\"filter?.selected?.icon\"><i class=\"{{filter?.selected?.icon}} mr-1\"></i></span>\n <span class=\"is-text-weight-bolder is-text-ellipsed\" title=\"{{filter?.selected?.label}}\">{{filter?.selected?.label}}</span>\n <span class=\"hx-icon-control\"><i class=\"hx-icon icon-caret-down\"></i></span>\n </a>\n <div [id]=\"filter?.id + '-options'\" class=\"hx-dropdown-menu has-limited-width has-limited-height expandedFilter__menu\" [class.hx-dropdown-icon]=\"filter.isIconised()\" *hxaDropdownMenu>\n <a hxaDropdownItem *ngFor=\"let option of filter?.options;trackBy: trackByFn\" (click)=\"onFilterOptionSelected(filter,option)\" class=\"hx-dropdown-item is-text-ellipsed\" title=\"{{option?.label}}\"> <span class=\"hx-icon-control\" *ngIf=\"option?.icon\"><i class=\"{{option?.icon}}\"></i></span> {{option?.label}}</a>\n </div>\n </div>\n\n <!-- search filter -->\n <div [id]=\"filter.id\" *ngIf=\"filter.type === FilterType.Search\" class=\"hx-input-group ml-4\" [class.mx-1]=\"!lastItem\">\n <i class=\"hx-icon icon-search mt-1\"></i>\n <div class=\"hx-input-control my-0\">\n <input class=\"hx-input\"\n type=\"search\"\n placeholder=\"{{filter.label}}\"\n (input)=\"onSearchFilterChange(filter)\"\n [(ngModel)]=\"filter.value\">\n <label class=\"hx-label\"></label>\n <div class=\"hx-help\"></div>\n </div>\n <div class=\"hx-input-actions\" *ngIf=\"filter.value\">\n <!--<div id=\"searchLoadingIndicator\" class=\"hx-loader is-small\" *ngIf=\"patientSearchService.showPatientSearchLoader\"><div></div><div></div><div></div><div></div></div>-->\n <div class=\"hx-button-group\">\n <button class=\"hx-button is-flat\" (click)=\"clearSearch(filter)\"><span class=\"hx-icon-control\"><i class=\"icon icon-close-empty\"></i></span></button>\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</div>\n",
styles: [":host .expandedFilter__button{max-width:15rem}:host .expandedFilter__menu{width:100%;max-height:20rem;max-width:15rem;overflow-x:hidden;overflow-y:auto}"]
},] },
];
/** @nocollapse */
FiltersComponent.ctorParameters = function () { return [
{ type: FiltersConfig }
]; };
FiltersComponent.propDecorators = {
carousel: [{ type: ViewChild, args: ['carousel',] }],
collapsed: [{ type: Input }],
filters: [{ type: Input }]
};
return FiltersComponent;
}());
export { FiltersComponent };
if (false) {
/** @type {?} */
FiltersComponent.prototype.carousel;
/** @type {?} */
FiltersComponent.prototype.FilterType;
/** @type {?} */
FiltersComponent.prototype.data;
/** @type {?} */
FiltersComponent.prototype.onFilterOptionChanged$;
/** @type {?} */
FiltersComponent.prototype.searchFilter$;
/** @type {?} */
FiltersComponent.prototype.subscriptions;
/** @type {?} */
FiltersComponent.prototype._filters;
/** @type {?} */
FiltersComponent.prototype._oldFilters;
/** @type {?} */
FiltersComponent.prototype._collapsed;
/** @type {?} */
FiltersComponent.prototype.conf;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2ZpbHRlcnMvZmlsdGVycy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFXLFVBQVUsRUFBRSxLQUFLLEVBQXFCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFL0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBMEMsT0FBTyxFQUFFLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMxRixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXJEO0lBb0ZFLDBCQUNVLElBQW1CO1FBQW5CLFNBQUksR0FBSixJQUFJLENBQWU7UUE5QjdCLGVBQVUsR0FBRyxVQUFVLENBQUM7UUFDeEIsU0FBSSxHQUFtQixFQUFFLENBQUM7UUFDMUIsMkJBQXNCLEdBQUcsSUFBSSxPQUFPLEVBQWdCLENBQUM7UUFDckQsa0JBQWEsR0FBMEIsSUFBSSxPQUFPLEVBQWdCLENBQUM7UUFDbkUsa0JBQWEsR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV6QyxhQUFRLEdBQXFCLEVBQUUsQ0FBQztRQUNoQyxnQkFBVyxHQUFxQixFQUFFLENBQUM7UUFDbkMsZUFBVSxHQUFHLEtBQUssQ0FBQztRQXdCekIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQXZCRCxzQkFDSSx1Q0FBUzs7OztRQURiO1lBRUUsT0FBTyxJQUFJLENBQUMsVUFBVSxD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Q3hCLGdDQUEwQjs7SUFDMUIsa0RBQXFEOztJQUNyRCx5Q0FBbUU7O0lBQ25FLHlDQUFpRDs7SUFFakQsb0NBQXdDOztJQUN4Qyx1Q0FBMkM7O0lBQzNDLHNDQUEyQjs7SUFzQnpCLGdDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBEb0NoZWNrLCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7RmlsdGVyVHlwZX0gZnJvbSAnLi9maWx0ZXJzLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7SUZpbHRlck9wdGlvbiwgSUZpbHRlcnNDb25maWd9IGZyb20gJy4vZmlsdGVycy1jb25maWcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtGaWx0ZXJzTW9kZWx9IGZyb20gJy4vZmlsdGVycy5tb2RlbCc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGZyb20sIE9ic2VydmFibGUsIHBpcGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcy9pbmRleCc7XHJcbmltcG9ydCB7RmlsdGVyc0NvbmZpZ30gZnJvbSAnLi9maWx0ZXJzLmNvbmZpZyc7XHJcbmltcG9ydCB7ZGVib3VuY2VUaW1lfSBmcm9tICdyeGpzL2ludGVybmFsL29wZXJhdG9ycyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2h4YS1maWx0ZXJzJyxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJoeC1mbGV4IGh4LWZsZXgtYWxpZ24tY2VudGVyXCI+XHJcblxyXG4gIDxpICBjbGFzcz1cImh4LWljb24gaWNvbi1maWx0ZXItb3V0bGluZSBteC0xXCI+PC9pPlxyXG5cclxuICA8IS0tIGNvbGxhcHNlZCBmaWx0ZXJzIC0tPlxyXG4gIDxoeGEtZmlsdGVycy1jb2xsYXBzZWQgKG9uRmlsdGVyKT1cIm9uQ29sbGFwc2VkRmlsdGVyKCRldmVudClcIiAob25TZWFyY2hGaWx0ZXIpPVwib25Db2xsYXBzZWRTZWFyY2goJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiAqbmdJZj1cImNvbGxhcHNlZFwiPjwvaHhhLWZpbHRlcnMtY29sbGFwc2VkPlxyXG5cclxuICA8IS0tIGV4cGFuZGVkIGZpbHRlcnMgLS0+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2xsYXBzZWRcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBkYXRhO3RyYWNrQnk6IHRyYWNrQnlGbjtsZXQgbGFzdEl0ZW0gPSBsYXN0O1wiPlxyXG5cclxuICAgIDwhLS0gc2luZ2xlIHNlbGVjdCBmaWx0ZXIgLS0+XHJcbiAgICA8ZGl2IFtpZF09XCJmaWx0ZXI/LmlkXCIgY2xhc3M9XCJoeC1kcm9wZG93biBteC0xIGV4cGFuZGVkRmlsdGVyXCIgaHhhRHJvcGRvd24gW21pbldpZHRoUmVsYXRpdmVUb109XCJmaWx0ZXI/LmlkICsgJy10cmlnZ2VyJ1wiICAqbmdJZj1cImZpbHRlcj8udHlwZSA9PT0gRmlsdGVyVHlwZS5TaW5nbGVTZWxlY3RcIj5cclxuICAgICAgPGEgW2lkXT1cImZpbHRlcj8uaWQgKyAnLXRyaWdnZXInXCIgY2xhc3M9XCJoeC1idXR0b24gaHgtYnV0dG9uLWRyb3Bkb3duIGV4cGFuZGVkRmlsdGVyX19idXR0b25cIiBoeGFEcm9wZG93blRvZ2dsZT5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXRleHQtd2VpZ2h0LWxpZ2h0XCI+e3tmaWx0ZXI/LmxhYmVsfX06Jm5ic3A7PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaHgtaWNvbi1jb250cm9sXCIgKm5nSWY9XCJmaWx0ZXI/LnNlbGVjdGVkPy5pY29uXCI+PGkgY2xhc3M9XCJ7e2ZpbHRlcj8uc2VsZWN0ZWQ/Lmljb259fSBtci0xXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXRleHQtd2VpZ2h0LWJvbGRlciBpcy10ZXh0LWVsbGlwc2VkXCIgdGl0bGU9XCJ7e2ZpbHRlcj8uc2VsZWN0ZWQ/LmxhYmVsfX1cIj57e2ZpbHRlcj8uc2VsZWN0ZWQ/LmxhYmVsfX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoeC1pY29uLWNvbnRyb2xcIj48aSBjbGFzcz1cImh4LWljb24gaWNvbi1jYXJldC1kb3duXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgPC9hPlxyXG4gICAgICA8ZGl2IFtpZF09XCJmaWx0ZXI/LmlkICsgJy1vcHRpb25zJ1wiIGNsYXNzPVwiaHgtZHJvcGRvd24tbWVudSAgaGFzLWxpbWl0ZWQtd2lkdGggaGFzLWxpbWl0ZWQtaGVpZ2h0IGV4cGFuZGVkRmlsdGVyX19tZW51XCIgW2NsYXNzLmh4LWRyb3Bkb3duLWljb25dPVwiZmlsdGVyLmlzSWNvbmlzZWQoKVwiICpoeGFEcm9wZG93bk1lbnU+XHJcbiAgICAgICAgPGEgaHhhRHJvcGRvd25JdGVtICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyPy5vcHRpb25zO3RyYWNrQnk6IHRyYWNrQnlGblwiIChjbGljayk9XCJvbkZpbHRlck9wdGlvblNlbGVjdGVkKGZpbHRlcixvcHRpb24pXCIgY2xhc3M9XCJoeC1kcm9wZG93bi1pdGVtIGlzLXRleHQtZWxsaXBzZWRcIiB0aXRsZT1cInt7b3B0aW9uPy5sYWJlbH19XCI+IDxzcGFuIGNsYXNzPVwiaHgtaWNvbi1jb250cm9sXCIgKm5nSWY9XCJvcHRpb24/Lmljb25cIj48aSBjbGFzcz1cInt7b3B0aW9uPy5pY29ufX1cIj48L2k+PC9zcGFuPiB7e29wdGlvbj8ubGFiZWx9fTwvYT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIHNlYXJjaCBmaWx0ZXIgLS0+XHJcbiAgICA8ZGl2IFtpZF09XCJmaWx0ZXIuaWRcIiAqbmdJZj1cImZpbHRlci50eXBlID09PSBGaWx0ZXJUeXBlLlNlYXJjaFwiICBjbGFzcz1cImh4LWlucHV0LWdyb3VwIG1sLTRcIiBbY2xhc3MubXgtMV09XCIhbGFzdEl0ZW1cIj5cclxuICAgICAgPGkgY2xhc3M9XCJoeC1pY29uIGljb24tc2VhcmNoIG10LTFcIj48L2k+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoeC1pbnB1dC1jb250cm9sIG15LTBcIj5cclxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJoeC1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxyXG4gICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ZmlsdGVyLmxhYmVsfX1cIlxyXG4gICAgICAgICAgICAgICAoaW5wdXQpPVwib25TZWFyY2hGaWx0ZXJDaGFuZ2UoZmlsdGVyKVwiXHJcbiAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyLnZhbHVlXCI+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiaHgtbGFiZWxcIj48L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoeC1oZWxwXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaHgtaW5wdXQtYWN0aW9uc1wiICpuZ0lmPVwiZmlsdGVyLnZhbHVlXCI+XHJcbiAgICAgICAgPCEtLTxkaXYgaWQ9XCJzZWFyY2hMb2FkaW5nSW5kaWNhdG9yXCIgY2xhc3M9XCJoeC1sb2FkZXIgaXMtc21hbGxcIiAqbmdJZj1cInBhdGllbnRTZWFyY2hTZXJ2aWNlLnNob3dQYXRpZW50U2VhcmNoTG9hZGVyXCI+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48L2Rpdj4tLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaHgtYnV0dG9uLWdyb3VwXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaHgtYnV0dG9uIGlzLWZsYXRcIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goZmlsdGVyKVwiPjxzcGFuIGNsYXNzPVwiaHgtaWNvbi1jb250cm9sXCI+PGkgY2xhc3M9XCJpY29uIGljb24tY2xvc2UtZW1wdHlcIj48L2k+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuYCxcclxuICBzdHlsZXM6IFtgOmhvc3QgLmV4cGFuZGVkRmlsdGVyX19idXR0b257bWF4LXdpZHRoOjE1cmVtfTpob3N0IC5leHBhbmRlZEZpbHRlcl9fbWVudXt3aWR0aDoxMDAlO21heC1oZWlnaHQ6MjByZW07bWF4LXdpZHRoOjE1cmVtO292ZXJmbG93LXg6aGlkZGVuO292ZXJmbG93LXk6YXV0b31gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsdGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgRG9DaGVjaywgT25EZXN0cm95IHtcclxuXHJcbiAgQFZpZXdDaGlsZCgnY2Fyb3VzZWwnKSBwcml2YXRlIGNhcm91c2VsOiBFbGVtZW50UmVmO1xyXG5cclxuICBGaWx0ZXJUeXBlID0gRmlsdGVyVHlwZTtcclxuICBkYXRhOiBGaWx0ZXJzTW9kZWxbXSA9IFtdO1xyXG4gIG9uRmlsdGVyT3B0aW9uQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDxGaWx0ZXJzTW9kZWw+KCk7XHJcbiAgc2VhcmNoRmlsdGVyJDogU3ViamVjdDxGaWx0ZXJzTW9kZWw+ID0gbmV3IFN1YmplY3Q8RmlsdGVyc01vZGVsPigpO1xyXG4gIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgcHJpdmF0ZSBfZmlsdGVyczogSUZpbHRlcnNDb25maWdbXSA9IFtdO1xyXG4gIHByaXZhdGUgX29sZEZpbHRlcnM6IElGaWx0ZXJzQ29uZmlnW10gPSBbXTtcclxuICBwcml2YXRlIF9jb2xsYXBzZWQgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgY29sbGFwc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbGxhcHNlZDtcclxuICB9XHJcblxyXG4gIHNldCBjb2xsYXBzZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2NvbGxhcHNlZCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgZmlsdGVycygpOiBJRmlsdGVyc0NvbmZpZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLl9maWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgc2V0IGZpbHRlcnModmFsdWU6IElGaWx0ZXJzQ29uZmlnW10pIHtcclxuICAgIHRoaXMuX2ZpbHRlcnMgPSB2YWx1ZTtcclxuICAgIHRoaXMuc2V0RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNvbmY6IEZpbHRlcnNDb25maWdcclxuICApIHtcclxuICAgIE9iamVjdC5hc3NpZ24odGhpcywgY29uZik7XHJcbiAgfVxyXG5cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxyXG4gICAgICB0aGlzLnNlYXJjaEZpbHRlciRcclxuICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5jb25mLmRlYm91bmNlKSlcclxuICAgICAgICAuc3Vic2NyaWJlKCh4KSA9PiAgdGhpcy5vbkZpbHRlck9wdGlvbkNoYW5nZWQkLm5leHQoeCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIG5nRG9DaGVjaygpIHtcclxuICAgIGlmICghXy5pc0VxdWFsKHRoaXMuX2ZpbHRlcnMsIHRoaXMuX29sZEZpbHRlcnMpKSB7XHJcbiAgICAgIHRoaXMuX29sZEZpbHRlcnMgPSBfLmNsb25lRGVlcCh0aGlzLl9maWx0ZXJzKTtcclxuICAgICAgdGhpcy5zZXREYXRhKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldEZpbHRlcnMoc2lsZW50OiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRoaXMuZGF0YSkge1xyXG4gICAgICBpZiAoZmlsdGVyLnR5cGUgPT09IEZpbHRlclR5cGUuU2luZ2xlU2VsZWN0KSB7XHJcbiAgICAgICAgZmlsdGVyLnNldERlZmF1bHRPcHRpb24oKTtcclxuICAgICAgICBpZiAoIXNpbGVudCkge1xyXG4gICAgICAgICAgdGhpcy5vbkZpbHRlck9wdGlvbkNoYW5nZWQkLm5leHQoZmlsdGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLnR5cGUgPT09IEZpbHRlclR5cGUuU2VhcmNoKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhclNlYXJjaChmaWx0ZXIsIHNpbGVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyU2VhcmNoKGZpbHRlcjogRmlsdGVyc01vZGVsLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICBmaWx0ZXIudmFsdWUgPSAnJztcclxuICAgICAgaWYgKCFzaWxlbnQpIHtcclxuICAgICAgICB0aGlzLm9uRmlsdGVyT3B0aW9uQ2hhbmdlZCQubmV4dChmaWx0ZXIpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gZmlsdGVyIG9wdGlvbiBpcyBzZWxlY3RlZFxyXG4gICAqL1xyXG4gIG9uRmlsdGVyT3B0aW9uU2VsZWN0ZWQoZmlsdGVyOiBGaWx0ZXJzTW9kZWwsIG9wdGlvbjogSUZpbHRlck9wdGlvbikge1xyXG4gICAgZmlsdGVyLnNldFNlbGVjdGVkT3B0aW9uKG9wdGlvbik7XHJcbiAgICB0aGlzLm9uRmlsdGVyT3B0aW9uQ2hhbmdlZCQubmV4dChmaWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gY2hhcmFjdGVyIGlzIHR5cGVkIGluIHRoZSBzZWFyY2ggZmlsdGVyIHR5cGVcclxuICAgKi9cclxuICBvblNlYXJjaEZpbHRlckNoYW5nZShmaWx0ZXI6IEZpbHRlcnNNb2RlbCkge1xyXG4gICAgaWYgKGZpbHRlci52YWx1ZS5sZW5ndGggPT09IDAgfHwgZmlsdGVyLnZhbHVlLmxlbmd0aCA+PSBmaWx0ZXIuY2hhckxpbWl0KSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRmlsdGVyJC5uZXh0KGZpbHRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgb25Db2xsYXBzZWRGaWx0ZXIoJGV2ZW50KSB7XHJcbiAgIHRoaXMub25GaWx0ZXJPcHRpb25TZWxlY3RlZCgkZXZlbnQuZmlsdGVyLCAgJGV2ZW50Lm9wdGlvbik7XHJcbiAgfVxyXG5cclxuICBvbkNvbGxhcHNlZFNlYXJjaCgkZXZlbnQpIHtcclxuICAgIHRoaXMub25TZWFyY2hGaWx0ZXJDaGFuZ2UoJGV2ZW50LmZpbHRlcik7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogVXNlZCBmb3IgdHJhY2sgYnkgYW5kIGJvb3N0IHBlcmZvcm1hbmNlXHJcbiAgICovXHJcbiAgdHJhY2tCeUZuKGluZGV4LCBhY3Rpb24pIHtcclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgZmlsdGVyIGNvbmZpZyBvYmplY3RzIHRvIEZpbHRlciBNb2RlbHNcclxuICAgKi9cclxuICBzZXREYXRhKCkge1xyXG4gICAgdGhpcy5kYXRhID0gW107XHJcbiAgICBpZiAodGhpcy5fZmlsdGVycykge1xyXG4gICAgICB0aGlzLl9maWx0ZXJzLmZvckVhY2goKGZpbHRlcjogSUZpbHRlcnNDb25maWcsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhLnB1c2gobmV3IEZpbHRlcnNNb2RlbChfLmNsb25lRGVlcChmaWx0ZXIpKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=