@hxui/angular
Version:
* * *
246 lines (241 loc) • 22.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
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';
export class FiltersComponent {
/**
* @param {?} conf
*/
constructor(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);
}
/**
* @return {?}
*/
get collapsed() {
return this._collapsed;
}
/**
* @param {?} value
* @return {?}
*/
set collapsed(value) {
this._collapsed = value;
}
/**
* @return {?}
*/
get filters() {
return this._filters;
}
/**
* @param {?} value
* @return {?}
*/
set filters(value) {
this._filters = value;
this.setData();
}
/**
* @return {?}
*/
ngOnInit() {
this.subscriptions.add(this.searchFilter$
.pipe(debounceTime(this.conf.debounce))
.subscribe((x) => this.onFilterOptionChanged$.next(x)));
}
/**
* @return {?}
*/
ngOnDestroy() {
this.subscriptions.unsubscribe();
}
/**
* @return {?}
*/
ngDoCheck() {
if (!_.isEqual(this._filters, this._oldFilters)) {
this._oldFilters = _.cloneDeep(this._filters);
this.setData();
}
}
/**
* @param {?=} silent
* @return {?}
*/
resetFilters(silent = false) {
for (const filter of this.data) {
if (filter.type === FilterType.SingleSelect) {
filter.setDefaultOption();
if (!silent) {
this.onFilterOptionChanged$.next(filter);
}
}
else if (filter.type === FilterType.Search) {
this.clearSearch(filter, silent);
}
}
}
/**
* @param {?} filter
* @param {?=} silent
* @return {?}
*/
clearSearch(filter, silent = false) {
filter.value = '';
if (!silent) {
this.onFilterOptionChanged$.next(filter);
}
}
/**
* Called when filter option is selected
* @param {?} filter
* @param {?} option
* @return {?}
*/
onFilterOptionSelected(filter, option) {
filter.setSelectedOption(option);
this.onFilterOptionChanged$.next(filter);
}
/**
* Called when character is typed in the search filter type
* @param {?} filter
* @return {?}
*/
onSearchFilterChange(filter) {
if (filter.value.length === 0 || filter.value.length >= filter.charLimit) {
this.searchFilter$.next(filter);
}
}
/**
* @param {?} $event
* @return {?}
*/
onCollapsedFilter($event) {
this.onFilterOptionSelected($event.filter, $event.option);
}
/**
* @param {?} $event
* @return {?}
*/
onCollapsedSearch($event) {
this.onSearchFilterChange($event.filter);
}
/**
* Used for track by and boost performance
* @param {?} index
* @param {?} action
* @return {?}
*/
trackByFn(index, action) {
return index;
}
/**
* Convert filter config objects to Filter Models
* @return {?}
*/
setData() {
this.data = [];
if (this._filters) {
this._filters.forEach((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">
<i class="hx-icon icon-filter-outline mx-1"></i>
<!-- collapsed filters -->
<hxa-filters-collapsed (onFilter)="onCollapsedFilter($event)" (onSearchFilter)="onCollapsedSearch($event)" [data]="data" *ngIf="collapsed"></hxa-filters-collapsed>
<!-- expanded filters -->
<ng-container *ngIf="!collapsed">
<ng-container *ngFor="let filter of data;trackBy: trackByFn;let lastItem = last;">
<!-- single select filter -->
<div [id]="filter?.id" class="hx-dropdown mx-1 expandedFilter" hxaDropdown [minWidthRelativeTo]="filter?.id + '-trigger'" *ngIf="filter?.type === FilterType.SingleSelect">
<a [id]="filter?.id + '-trigger'" class="hx-button hx-button-dropdown expandedFilter__button" hxaDropdownToggle>
<span class="is-text-weight-light">{{filter?.label}}: </span>
<span class="hx-icon-control" *ngIf="filter?.selected?.icon"><i class="{{filter?.selected?.icon}} mr-1"></i></span>
<span class="is-text-weight-bolder is-text-ellipsed" title="{{filter?.selected?.label}}">{{filter?.selected?.label}}</span>
<span class="hx-icon-control"><i class="hx-icon icon-caret-down"></i></span>
</a>
<div [id]="filter?.id + '-options'" class="hx-dropdown-menu has-limited-width has-limited-height expandedFilter__menu" [class.hx-dropdown-icon]="filter.isIconised()" *hxaDropdownMenu>
<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>
</div>
</div>
<!-- search filter -->
<div [id]="filter.id" *ngIf="filter.type === FilterType.Search" class="hx-input-group ml-4" [class.mx-1]="!lastItem">
<i class="hx-icon icon-search mt-1"></i>
<div class="hx-input-control my-0">
<input class="hx-input"
type="search"
placeholder="{{filter.label}}"
(input)="onSearchFilterChange(filter)"
[(ngModel)]="filter.value">
<label class="hx-label"></label>
<div class="hx-help"></div>
</div>
<div class="hx-input-actions" *ngIf="filter.value">
<!--<div id="searchLoadingIndicator" class="hx-loader is-small" *ngIf="patientSearchService.showPatientSearchLoader"><div></div><div></div><div></div><div></div></div>-->
<div class="hx-button-group">
<button class="hx-button is-flat" (click)="clearSearch(filter)"><span class="hx-icon-control"><i class="icon icon-close-empty"></i></span></button>
</div>
</div>
</div>
</ng-container>
</ng-container>
</div>
`,
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 = () => [
{ type: FiltersConfig }
];
FiltersComponent.propDecorators = {
carousel: [{ type: ViewChild, args: ['carousel',] }],
collapsed: [{ type: Input }],
filters: [{ type: Input }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2ZpbHRlcnMvZmlsdGVycy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQVcsVUFBVSxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUUvQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUEwQyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzFGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFxRHJELE1BQU0sT0FBTyxnQkFBZ0I7Ozs7SUFpQzNCLFlBQ1UsSUFBbUI7UUFBbkIsU0FBSSxHQUFKLElBQUksQ0FBZTtRQTlCN0IsZUFBVSxHQUFHLFVBQVUsQ0FBQztRQUN4QixTQUFJLEdBQW1CLEVBQUUsQ0FBQztRQUMxQiwyQkFBc0IsR0FBRyxJQUFJLE9BQU8sRUFBZ0IsQ0FBQztRQUNyRCxrQkFBYSxHQUEwQixJQUFJLE9BQU8sRUFBZ0IsQ0FBQztRQUNuRSxrQkFBYSxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXpDLGFBQVEsR0FBcUIsRUFBRSxDQUFDO1FBQ2hDLGdCQUFXLEdBQXFCLEVBQUUsQ0FBQztRQUNuQyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBd0J6QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDOzs7O0lBdkJELElBQ0ksU0FBUztRQUNYLE9BQU8sSUFB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QyxNQUFNO1FBQ3RCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7Ozs7OztJQU1ELFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTTtRQUNyQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Ozs7O0lBS0QsT0FBTztRQUNMLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBc0IsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7OztZQS9LRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThDWDtnQkFDQyxNQUFNLEVBQUUsQ0FBQywwSkFBMEosQ0FBQzthQUNySzs7OztZQXJETyxhQUFhOzs7dUJBd0RsQixTQUFTLFNBQUMsVUFBVTt3QkFZcEIsS0FBSztzQkFTTCxLQUFLOzs7O0lBckJOLG9DQUFvRDs7SUFFcEQsc0NBQXdCOztJQUN4QixnQ0FBMEI7O0lBQzFCLGtEQUFxRDs7SUFDckQseUNBQW1FOztJQUNuRSx5Q0FBaUQ7O0lBRWpELG9DQUF3Qzs7SUFDeEMsdUNBQTJDOztJQUMzQyxzQ0FBMkI7O0lBc0J6QixnQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRG9DaGVjaywgRWxlbWVudFJlZiwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0ZpbHRlclR5cGV9IGZyb20gJy4vZmlsdGVycy10eXBlLmVudW0nO1xyXG5pbXBvcnQge0lGaWx0ZXJPcHRpb24sIElGaWx0ZXJzQ29uZmlnfSBmcm9tICcuL2ZpbHRlcnMtY29uZmlnLmludGVyZmFjZSc7XHJcbmltcG9ydCB7RmlsdGVyc01vZGVsfSBmcm9tICcuL2ZpbHRlcnMubW9kZWwnO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBmcm9tLCBPYnNlcnZhYmxlLCBwaXBlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMvaW5kZXgnO1xyXG5pbXBvcnQge0ZpbHRlcnNDb25maWd9IGZyb20gJy4vZmlsdGVycy5jb25maWcnO1xyXG5pbXBvcnQge2RlYm91bmNlVGltZX0gZnJvbSAncnhqcy9pbnRlcm5hbC9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdoeGEtZmlsdGVycycsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiaHgtZmxleCBoeC1mbGV4LWFsaWduLWNlbnRlclwiPlxyXG5cclxuICA8aSAgY2xhc3M9XCJoeC1pY29uIGljb24tZmlsdGVyLW91dGxpbmUgbXgtMVwiPjwvaT5cclxuXHJcbiAgPCEtLSBjb2xsYXBzZWQgZmlsdGVycyAtLT5cclxuICA8aHhhLWZpbHRlcnMtY29sbGFwc2VkIChvbkZpbHRlcik9XCJvbkNvbGxhcHNlZEZpbHRlcigkZXZlbnQpXCIgKG9uU2VhcmNoRmlsdGVyKT1cIm9uQ29sbGFwc2VkU2VhcmNoKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgKm5nSWY9XCJjb2xsYXBzZWRcIj48L2h4YS1maWx0ZXJzLWNvbGxhcHNlZD5cclxuXHJcbiAgPCEtLSBleHBhbmRlZCBmaWx0ZXJzIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sbGFwc2VkXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZGF0YTt0cmFja0J5OiB0cmFja0J5Rm47bGV0IGxhc3RJdGVtID0gbGFzdDtcIj5cclxuXHJcbiAgICA8IS0tIHNpbmdsZSBzZWxlY3QgZmlsdGVyIC0tPlxyXG4gICAgPGRpdiBbaWRdPVwiZmlsdGVyPy5pZFwiIGNsYXNzPVwiaHgtZHJvcGRvd24gbXgtMSBleHBhbmRlZEZpbHRlclwiIGh4YURyb3Bkb3duIFttaW5XaWR0aFJlbGF0aXZlVG9dPVwiZmlsdGVyPy5pZCArICctdHJpZ2dlcidcIiAgKm5nSWY9XCJmaWx0ZXI/LnR5cGUgPT09IEZpbHRlclR5cGUuU2luZ2xlU2VsZWN0XCI+XHJcbiAgICAgIDxhIFtpZF09XCJmaWx0ZXI/LmlkICsgJy10cmlnZ2VyJ1wiIGNsYXNzPVwiaHgtYnV0dG9uIGh4LWJ1dHRvbi1kcm9wZG93biBleHBhbmRlZEZpbHRlcl9fYnV0dG9uXCIgaHhhRHJvcGRvd25Ub2dnbGU+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy10ZXh0LXdlaWdodC1saWdodFwiPnt7ZmlsdGVyPy5sYWJlbH19OiZuYnNwOzwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImh4LWljb24tY29udHJvbFwiICpuZ0lmPVwiZmlsdGVyPy5zZWxlY3RlZD8uaWNvblwiPjxpIGNsYXNzPVwie3tmaWx0ZXI/LnNlbGVjdGVkPy5pY29ufX0gbXItMVwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy10ZXh0LXdlaWdodC1ib2xkZXIgaXMtdGV4dC1lbGxpcHNlZFwiIHRpdGxlPVwie3tmaWx0ZXI/LnNlbGVjdGVkPy5sYWJlbH19XCI+e3tmaWx0ZXI/LnNlbGVjdGVkPy5sYWJlbH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaHgtaWNvbi1jb250cm9sXCI+PGkgY2xhc3M9XCJoeC1pY29uIGljb24tY2FyZXQtZG93blwiPjwvaT48L3NwYW4+XHJcbiAgICAgIDwvYT5cclxuICAgICAgPGRpdiBbaWRdPVwiZmlsdGVyPy5pZCArICctb3B0aW9ucydcIiBjbGFzcz1cImh4LWRyb3Bkb3duLW1lbnUgIGhhcy1saW1pdGVkLXdpZHRoIGhhcy1saW1pdGVkLWhlaWdodCBleHBhbmRlZEZpbHRlcl9fbWVudVwiIFtjbGFzcy5oeC1kcm9wZG93bi1pY29uXT1cImZpbHRlci5pc0ljb25pc2VkKClcIiAqaHhhRHJvcGRvd25NZW51PlxyXG4gICAgICAgIDxhIGh4YURyb3Bkb3duSXRlbSAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcj8ub3B0aW9uczt0cmFja0J5OiB0cmFja0J5Rm5cIiAoY2xpY2spPVwib25GaWx0ZXJPcHRpb25TZWxlY3RlZChmaWx0ZXIsb3B0aW9uKVwiIGNsYXNzPVwiaHgtZHJvcGRvd24taXRlbSBpcy10ZXh0LWVsbGlwc2VkXCIgdGl0bGU9XCJ7e29wdGlvbj8ubGFiZWx9fVwiPiA8c3BhbiBjbGFzcz1cImh4LWljb24tY29udHJvbFwiICpuZ0lmPVwib3B0aW9uPy5pY29uXCI+PGkgY2xhc3M9XCJ7e29wdGlvbj8uaWNvbn19XCI+PC9pPjwvc3Bhbj4ge3tvcHRpb24/LmxhYmVsfX08L2E+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBzZWFyY2ggZmlsdGVyIC0tPlxyXG4gICAgPGRpdiBbaWRdPVwiZmlsdGVyLmlkXCIgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gRmlsdGVyVHlwZS5TZWFyY2hcIiAgY2xhc3M9XCJoeC1pbnB1dC1ncm91cCBtbC00XCIgW2NsYXNzLm14LTFdPVwiIWxhc3RJdGVtXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiaHgtaWNvbiBpY29uLXNlYXJjaCBtdC0xXCI+PC9pPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaHgtaW5wdXQtY29udHJvbCBteS0wXCI+XHJcbiAgICAgICAgPGlucHV0IGNsYXNzPVwiaHgtaW5wdXRcIlxyXG4gICAgICAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcclxuICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e2ZpbHRlci5sYWJlbH19XCJcclxuICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uU2VhcmNoRmlsdGVyQ2hhbmdlKGZpbHRlcilcIlxyXG4gICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlci52YWx1ZVwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImh4LWxhYmVsXCI+PC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaHgtaGVscFwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImh4LWlucHV0LWFjdGlvbnNcIiAqbmdJZj1cImZpbHRlci52YWx1ZVwiPlxyXG4gICAgICAgIDwhLS08ZGl2IGlkPVwic2VhcmNoTG9hZGluZ0luZGljYXRvclwiIGNsYXNzPVwiaHgtbG9hZGVyIGlzLXNtYWxsXCIgKm5nSWY9XCJwYXRpZW50U2VhcmNoU2VydmljZS5zaG93UGF0aWVudFNlYXJjaExvYWRlclwiPjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PC9kaXY+LS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImh4LWJ1dHRvbi1ncm91cFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImh4LWJ1dHRvbiBpcy1mbGF0XCIgKGNsaWNrKT1cImNsZWFyU2VhcmNoKGZpbHRlcilcIj48c3BhbiBjbGFzcz1cImh4LWljb24tY29udHJvbFwiPjxpIGNsYXNzPVwiaWNvbiBpY29uLWNsb3NlLWVtcHR5XCI+PC9pPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbmAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IC5leHBhbmRlZEZpbHRlcl9fYnV0dG9ue21heC13aWR0aDoxNXJlbX06aG9zdCAuZXhwYW5kZWRGaWx0ZXJfX21lbnV7d2lkdGg6MTAwJTttYXgtaGVpZ2h0OjIwcmVtO21heC13aWR0aDoxNXJlbTtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG99YF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEZpbHRlcnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIERvQ2hlY2ssIE9uRGVzdHJveSB7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2Nhcm91c2VsJykgcHJpdmF0ZSBjYXJvdXNlbDogRWxlbWVudFJlZjtcclxuXHJcbiAgRmlsdGVyVHlwZSA9IEZpbHRlclR5cGU7XHJcbiAgZGF0YTogRmlsdGVyc01vZGVsW10gPSBbXTtcclxuICBvbkZpbHRlck9wdGlvbkNoYW5nZWQkID0gbmV3IFN1YmplY3Q8RmlsdGVyc01vZGVsPigpO1xyXG4gIHNlYXJjaEZpbHRlciQ6IFN1YmplY3Q8RmlsdGVyc01vZGVsPiA9IG5ldyBTdWJqZWN0PEZpbHRlcnNNb2RlbD4oKTtcclxuICBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIHByaXZhdGUgX2ZpbHRlcnM6IElGaWx0ZXJzQ29uZmlnW10gPSBbXTtcclxuICBwcml2YXRlIF9vbGRGaWx0ZXJzOiBJRmlsdGVyc0NvbmZpZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBfY29sbGFwc2VkID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGNvbGxhcHNlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jb2xsYXBzZWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgY29sbGFwc2VkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9jb2xsYXBzZWQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGZpbHRlcnMoKTogSUZpbHRlcnNDb25maWdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVycztcclxuICB9XHJcblxyXG4gIHNldCBmaWx0ZXJzKHZhbHVlOiBJRmlsdGVyc0NvbmZpZ1tdKSB7XHJcbiAgICB0aGlzLl9maWx0ZXJzID0gdmFsdWU7XHJcbiAgICB0aGlzLnNldERhdGEoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjb25mOiBGaWx0ZXJzQ29uZmlnXHJcbiAgKSB7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIGNvbmYpO1xyXG4gIH1cclxuXHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcclxuICAgICAgdGhpcy5zZWFyY2hGaWx0ZXIkXHJcbiAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuY29uZi5kZWJvdW5jZSkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoeCkgPT4gIHRoaXMub25GaWx0ZXJPcHRpb25DaGFuZ2VkJC5uZXh0KHgpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ0RvQ2hlY2soKSB7XHJcbiAgICBpZiAoIV8uaXNFcXVhbCh0aGlzLl9maWx0ZXJzLCB0aGlzLl9vbGRGaWx0ZXJzKSkge1xyXG4gICAgICB0aGlzLl9vbGRGaWx0ZXJzID0gXy5jbG9uZURlZXAodGhpcy5fZmlsdGVycyk7XHJcbiAgICAgIHRoaXMuc2V0RGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRGaWx0ZXJzKHNpbGVudDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiB0aGlzLmRhdGEpIHtcclxuICAgICAgaWYgKGZpbHRlci50eXBlID09PSBGaWx0ZXJUeXBlLlNpbmdsZVNlbGVjdCkge1xyXG4gICAgICAgIGZpbHRlci5zZXREZWZhdWx0T3B0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcclxuICAgICAgICAgIHRoaXMub25GaWx0ZXJPcHRpb25DaGFuZ2VkJC5uZXh0KGZpbHRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGZpbHRlci50eXBlID09PSBGaWx0ZXJUeXBlLlNlYXJjaCkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJTZWFyY2goZmlsdGVyLCBzaWxlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhclNlYXJjaChmaWx0ZXI6IEZpbHRlcnNNb2RlbCwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgZmlsdGVyLnZhbHVlID0gJyc7XHJcbiAgICAgIGlmICghc2lsZW50KSB7XHJcbiAgICAgICAgdGhpcy5vbkZpbHRlck9wdGlvbkNoYW5nZWQkLm5leHQoZmlsdGVyKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIGZpbHRlciBvcHRpb24gaXMgc2VsZWN0ZWRcclxuICAgKi9cclxuICBvbkZpbHRlck9wdGlvblNlbGVjdGVkKGZpbHRlcjogRmlsdGVyc01vZGVsLCBvcHRpb246IElGaWx0ZXJPcHRpb24pIHtcclxuICAgIGZpbHRlci5zZXRTZWxlY3RlZE9wdGlvbihvcHRpb24pO1xyXG4gICAgdGhpcy5vbkZpbHRlck9wdGlvbkNoYW5nZWQkLm5leHQoZmlsdGVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIGNoYXJhY3RlciBpcyB0eXBlZCBpbiB0aGUgc2VhcmNoIGZpbHRlciB0eXBlXHJcbiAgICovXHJcbiAgb25TZWFyY2hGaWx0ZXJDaGFuZ2UoZmlsdGVyOiBGaWx0ZXJzTW9kZWwpIHtcclxuICAgIGlmIChmaWx0ZXIudmFsdWUubGVuZ3RoID09PSAwIHx8IGZpbHRlci52YWx1ZS5sZW5ndGggPj0gZmlsdGVyLmNoYXJMaW1pdCkge1xyXG4gICAgICB0aGlzLnNlYXJjaEZpbHRlciQubmV4dChmaWx0ZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIG9uQ29sbGFwc2VkRmlsdGVyKCRldmVudCkge1xyXG4gICB0aGlzLm9uRmlsdGVyT3B0aW9uU2VsZWN0ZWQoJGV2ZW50LmZpbHRlciwgICRldmVudC5vcHRpb24pO1xyXG4gIH1cclxuXHJcbiAgb25Db2xsYXBzZWRTZWFyY2goJGV2ZW50KSB7XHJcbiAgICB0aGlzLm9uU2VhcmNoRmlsdGVyQ2hhbmdlKCRldmVudC5maWx0ZXIpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgZm9yIHRyYWNrIGJ5IGFuZCBib29zdCBwZXJmb3JtYW5jZVxyXG4gICAqL1xyXG4gIHRyYWNrQnlGbihpbmRleCwgYWN0aW9uKSB7XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0IGZpbHRlciBjb25maWcgb2JqZWN0cyB0byBGaWx0ZXIgTW9kZWxzXHJcbiAgICovXHJcbiAgc2V0RGF0YSgpIHtcclxuICAgIHRoaXMuZGF0YSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuX2ZpbHRlcnMpIHtcclxuICAgICAgdGhpcy5fZmlsdGVycy5mb3JFYWNoKChmaWx0ZXI6IElGaWx0ZXJzQ29uZmlnLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKG5ldyBGaWx0ZXJzTW9kZWwoXy5jbG9uZURlZXAoZmlsdGVyKSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19