@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
305 lines (304 loc) • 26.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { DefaultControlValueAccessor } from './../common/default-control-value-accessor';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Component, Input, ContentChild, forwardRef, Renderer2, ElementRef } from '@angular/core';
import { AsiComponentTemplateOptionDef, AsiComponentTemplateEmptyDef, AsiComponentTemplateSelectedDef } from '../common/asi-component-template';
import * as nh from '../../native-helper';
export class AsiSelectComponent extends DefaultControlValueAccessor {
/**
* @param {?} renderer
* @param {?} elementRef
*/
constructor(renderer, elementRef) {
super();
this.renderer = renderer;
this.elementRef = elementRef;
/**
* Label position
*/
this.labelPosition = 'top';
/**
* Multi selection
*/
this.multiple = false;
/**
* Add an empty value (template must be define)
*/
this.withEmptyValue = false;
this.open = false;
this.allChecked = false;
}
/**
* @return {?}
*/
ngOnInit() {
this.renderer.addClass(this.elementRef.nativeElement, 'label-' + this.labelPosition);
if (this.multiple) {
this.renderer.addClass(this.elementRef.nativeElement, 'multiple');
}
}
/**
* @return {?}
*/
onDropdownClose() {
this.open = false;
}
/**
* @return {?}
*/
isOpened() {
return this.open;
}
/**
* @return {?}
*/
ngOnChanges() {
this.initData();
}
/**
* @return {?}
*/
initData() {
this.selectDatas = [];
this.data = this.data || [];
if (this.withEmptyValue) {
this.selectDatas.push(null);
}
this.data.forEach((data) => {
/** @type {?} */
const proxyData = {
selected: false,
value: data
};
this.selectDatas.push(proxyData);
});
}
/**
* @param {?} value
* @return {?}
*/
checkAll(value) {
this.allChecked = value;
this.selectDatas.forEach((data) => {
if (data != null && (value !== data.selected)) {
this.internalSelectValue(null, data);
}
});
this.onModelChange(this._value);
}
/**
* @return {?}
*/
updateAllChecked() {
this.allChecked = nh.find(this.selectDatas, (data) => {
return data != null ? !data.selected : false;
}) == null;
}
/**
* @param {?} event
* @param {?} data
* @return {?}
*/
selectValue(event, data) {
this.internalSelectValue(event, data);
this.onModelChange(this._value);
}
/**
* @param {?} event
* @param {?} data
* @return {?}
*/
internalSelectValue(event, data) {
if (data == null) {
this.onModelChange(null);
this.open = false;
return;
}
/** @type {?} */
let realValue = data.value;
if (this.multiple) {
if (event != null) {
event.stopPropagation();
}
if (this._value == null) {
this._value = [];
}
/** @type {?} */
let removed = nh.remove(this._value, (value) => {
if (value != null) {
if (this.trackBy != null) {
return value[this.trackBy] === realValue[this.trackBy];
}
else {
return value === realValue;
}
}
return false;
});
if (nh.isEmpty(removed)) {
this.value.push(realValue);
data.selected = true;
}
else {
data.selected = false;
}
if (nh.isEmpty(this._value)) {
this._value = null;
}
if (event != null) {
this.updateAllChecked();
}
}
else {
this.open = false;
this._value = realValue;
}
}
/**
* @return {?}
*/
toggleSelect() {
this.open = !this.open;
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (isNaN(value) && nh.isEmpty(value)) {
this._value = null;
}
else {
this._value = value;
}
if (this.multiple) {
if (this._value != null) {
this.selectDatas.forEach((data) => {
if (data != null) {
data.selected = nh.find(this.value, (possibleValue) => {
if (possibleValue != null) {
if (this.trackBy != null) {
return possibleValue[this.trackBy] === data.value[this.trackBy];
}
else {
return possibleValue === data.value;
}
}
return false;
}) != null;
}
});
}
else {
this.selectDatas.forEach((data) => {
if (data != null) {
data.selected = false;
}
});
}
this.updateAllChecked();
}
this.manageHasValue();
}
/**
* @param {?} value
* @return {?}
*/
onModelChange(value) {
this.value = value;
this.manageHasValue();
}
/**
* @return {?}
*/
manageHasValue() {
if (this.value != null) {
this.renderer.addClass(this.elementRef.nativeElement, 'has-value');
}
else {
this.renderer.removeClass(this.elementRef.nativeElement, 'has-value');
}
}
}
AsiSelectComponent.decorators = [
{ type: Component, args: [{
selector: 'asi-select',
host: { 'class': 'asi-component asi-select' },
template: "<label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\r\n\r\n<div class=\"asi-select-container\" aria-labelledby=\"select\">\r\n <div class=\"asi-select-header asi-focus-error\" (keyup.esc)=\"toggleSelect()\">\r\n <asi-checkbox *ngIf=\"multiple\" [disabled]=\"disabled\" [ngModel]=\"allChecked\" (onValueChange)=\"checkAll($event)\">\r\n </asi-checkbox>\r\n <button type=\"button\" class=\"item-container\" [disabled]=\"disabled\" (click)=\"toggleSelect()\">\r\n <span>\r\n <div class=\"item\">\r\n <ng-template *ngIf=\"value != null\" [ngTemplateOutlet]=\"selectedDef.template\"\r\n [ngTemplateOutletContext]=\"{$implicit : value}\"></ng-template>\r\n <ng-template *ngIf=\"value == null\" [ngTemplateOutlet]=\"emptyDef?.template\"\r\n [ngTemplateOutletContext]=\"{$implicit : value}\"></ng-template>\r\n </div>\r\n <div class=\"drop-icon-container\">\r\n <span class=\"drop-icon\" [innerHtml]=\"'▼'\"></span>\r\n </div>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <asi-dropdown [open]=\"open\" (onClose)=\"onDropdownClose()\" dropDownClass=\"asi-select-dropdown\">\r\n <div class=\"drop-down-select\">\r\n <div class=\"drop-down-panel\">\r\n <button type=\"button\" class=\"drop-down-item\" [ngClass]=\"{'empty' : data == null , 'selected' : data?.selected}\"\r\n (keyup.esc)=\"toggleSelect()\" (click)=\"selectValue($event, data)\" *ngFor=\"let data of selectDatas\">\r\n <span class=\"option\">\r\n <asi-checkbox *ngIf=\"multiple && data != null\" [ngModel]=\"data.selected\"\r\n (click)=\"selectValue($event, data)\"></asi-checkbox>\r\n <div class=\"item\" aria-labelledby=\"item\">\r\n <ng-template *ngIf=\"data != null\" [ngTemplateOutlet]=\"optionDef.template\"\r\n [ngTemplateOutletContext]=\"{$implicit : data.value}\"></ng-template>\r\n </div>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </asi-dropdown>\r\n</div>\r\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AsiSelectComponent),
multi: true
}
]
}] }
];
/** @nocollapse */
AsiSelectComponent.ctorParameters = () => [
{ type: Renderer2 },
{ type: ElementRef }
];
AsiSelectComponent.propDecorators = {
label: [{ type: Input }],
labelPosition: [{ type: Input }],
data: [{ type: Input }],
multiple: [{ type: Input }],
trackBy: [{ type: Input }],
withEmptyValue: [{ type: Input }],
optionDef: [{ type: ContentChild, args: [AsiComponentTemplateOptionDef,] }],
emptyDef: [{ type: ContentChild, args: [AsiComponentTemplateEmptyDef,] }],
selectedDef: [{ type: ContentChild, args: [AsiComponentTemplateSelectedDef,] }]
};
if (false) {
/**
* Label to display (is translated)
* @type {?}
*/
AsiSelectComponent.prototype.label;
/**
* Label position
* @type {?}
*/
AsiSelectComponent.prototype.labelPosition;
/**
* Data to display
* @type {?}
*/
AsiSelectComponent.prototype.data;
/**
* Multi selection
* @type {?}
*/
AsiSelectComponent.prototype.multiple;
/**
* Track data base on a sub attribute rather than reference
* @type {?}
*/
AsiSelectComponent.prototype.trackBy;
/**
* Add an empty value (template must be define)
* @type {?}
*/
AsiSelectComponent.prototype.withEmptyValue;
/** @type {?} */
AsiSelectComponent.prototype.optionDef;
/** @type {?} */
AsiSelectComponent.prototype.emptyDef;
/** @type {?} */
AsiSelectComponent.prototype.selectedDef;
/** @type {?} */
AsiSelectComponent.prototype.selectDatas;
/** @type {?} */
AsiSelectComponent.prototype.open;
/** @type {?} */
AsiSelectComponent.prototype.allChecked;
/** @type {?} */
AsiSelectComponent.prototype.renderer;
/** @type {?} */
AsiSelectComponent.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLXNlbGVjdC9hc2ktc2VsZWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFxQixVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVySCxPQUFPLEVBQ0wsNkJBQTZCLEVBQUUsNEJBQTRCLEVBQzNELCtCQUErQixFQUNoQyxNQUFNLGtDQUFrQyxDQUFDO0FBRTFDLE9BQU8sS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFjMUMsTUFBTSx5QkFBMEIsU0FBUSwyQkFBMkI7Ozs7O0lBNkJqRSxZQUFvQixRQUFtQixFQUM3QjtRQUNSLEtBQUssRUFBRSxDQUFDO1FBRlUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUM3QixlQUFVLEdBQVYsVUFBVTs7Ozs2QkF4QjJFLEtBQUs7Ozs7d0JBTWhGLEtBQUs7Ozs7OEJBTUMsS0FBSztvQkFReEIsS0FBSzswQkFDQyxLQUFLO0tBS2pCOzs7O0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckYsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxD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LEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGO2FBQ0Y7Ozs7WUFwQnVFLFNBQVM7WUFBRSxVQUFVOzs7b0JBd0IxRixLQUFLOzRCQUdMLEtBQUs7bUJBR0wsS0FBSzt1QkFHTCxLQUFLO3NCQUdMLEtBQUs7NkJBR0wsS0FBSzt3QkFFTCxZQUFZLFNBQUMsNkJBQTZCO3VCQUMxQyxZQUFZLFNBQUMsNEJBQTRCOzBCQUN6QyxZQUFZLFNBQUMsK0JBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi8uLi9jb21tb24vZGVmYXVsdC1jb250cm9sLXZhbHVlLWFjY2Vzc29yJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENvbnRlbnRDaGlsZCwgT25Jbml0LCBPbkNoYW5nZXMsIGZvcndhcmRSZWYsIFJlbmRlcmVyMiwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHtcclxuICBBc2lDb21wb25lbnRUZW1wbGF0ZU9wdGlvbkRlZiwgQXNpQ29tcG9uZW50VGVtcGxhdGVFbXB0eURlZixcclxuICBBc2lDb21wb25lbnRUZW1wbGF0ZVNlbGVjdGVkRGVmXHJcbn0gZnJvbSAnLi4vY29tbW9uL2FzaS1jb21wb25lbnQtdGVtcGxhdGUnO1xyXG5cclxuaW1wb3J0ICogYXMgbmggZnJvbSAnLi4vLi4vbmF0aXZlLWhlbHBlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FzaS1zZWxlY3QnLFxyXG4gIGhvc3Q6IHsgJ2NsYXNzJzogJ2FzaS1jb21wb25lbnQgYXNpLXNlbGVjdCcgfSxcclxuICB0ZW1wbGF0ZVVybDogJ2FzaS1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXNpU2VsZWN0Q29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc2lTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIC8qKiBMYWJlbCB0byBkaXNwbGF5IChpcyB0cmFuc2xhdGVkKSAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBMYWJlbCBwb3NpdGlvbiAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246ICd0b3AnIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2JvdHRvbS1jZW50ZXInIHwgJ3RvcC1jZW50ZXInID0gJ3RvcCc7XHJcblxyXG4gIC8qKiBEYXRhIHRvIGRpc3BsYXkgICovXHJcbiAgQElucHV0KCkgZGF0YTogQXJyYXk8YW55PjtcclxuXHJcbiAgLyoqIE11bHRpIHNlbGVjdGlvbiAgKi9cclxuICBASW5wdXQoKSBtdWx0aXBsZSA9IGZhbHNlO1xyXG5cclxuICAvKiogVHJhY2sgZGF0YSBiYXNlIG9uIGEgc3ViIGF0dHJpYnV0ZSByYXRoZXIgdGhhbiByZWZlcmVuY2UgICovXHJcbiAgQElucHV0KCkgdHJhY2tCeTogc3RyaW5nO1xyXG5cclxuICAvKiogQWRkIGFuIGVtcHR5IHZhbHVlICh0ZW1wbGF0ZSBtdXN0IGJlIGRlZmluZSkgKi9cclxuICBASW5wdXQoKSB3aXRoRW1wdHlWYWx1ZSA9IGZhbHNlO1xyXG5cclxuICBAQ29udGVudENoaWxkKEFzaUNvbXBvbmVudFRlbXBsYXRlT3B0aW9uRGVmKSBvcHRpb25EZWY6IEFzaUNvbXBvbmVudFRlbXBsYXRlT3B0aW9uRGVmO1xyXG4gIEBDb250ZW50Q2hpbGQoQXNpQ29tcG9uZW50VGVtcGxhdGVFbXB0eURlZikgZW1wdHlEZWY6IEFzaUNvbXBvbmVudFRlbXBsYXRlRW1wdHlEZWY7XHJcbiAgQENvbnRlbnRDaGlsZChBc2lDb21wb25lbnRUZW1wbGF0ZVNlbGVjdGVkRGVmKSBzZWxlY3RlZERlZjogQXNpQ29tcG9uZW50VGVtcGxhdGVTZWxlY3RlZERlZjtcclxuXHJcbiAgLy8gQ29waWUgZGVzIGRvbm7DqWVzIGQnZW50csOpZVxyXG4gIHNlbGVjdERhdGFzOiBBcnJheTxhbnk+O1xyXG4gIG9wZW4gPSBmYWxzZTtcclxuICBhbGxDaGVja2VkID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2xhYmVsLScgKyB0aGlzLmxhYmVsUG9zaXRpb24pO1xyXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ211bHRpcGxlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRyb3Bkb3duQ2xvc2UoKSB7XHJcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc09wZW5lZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wZW47XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIHRoaXMuaW5pdERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdERhdGEoKSB7XHJcbiAgICB0aGlzLnNlbGVjdERhdGFzID0gW107XHJcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEgfHwgW107XHJcblxyXG4gICAgaWYgKHRoaXMud2l0aEVtcHR5VmFsdWUpIHtcclxuICAgICAgdGhpcy5zZWxlY3REYXRhcy5wdXNoKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0YS5mb3JFYWNoKChkYXRhKSA9PiB7XHJcbiAgICAgIGNvbnN0IHByb3h5RGF0YSA9IHtcclxuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgICAgdmFsdWU6IGRhdGFcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlbGVjdERhdGFzLnB1c2gocHJveHlEYXRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tBbGwodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5hbGxDaGVja2VkID0gdmFsdWU7XHJcbiAgICB0aGlzLnNlbGVjdERhdGFzLmZvckVhY2goKGRhdGEpID0+IHtcclxuICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiAodmFsdWUgIT09IGRhdGEuc2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdFZhbHVlKG51bGwsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLl92YWx1ZSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVBbGxDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hbGxDaGVja2VkID0gbmguZmluZCh0aGlzLnNlbGVjdERhdGFzLCAoZGF0YSkgPT4ge1xyXG4gICAgICByZXR1cm4gZGF0YSAhPSBudWxsID8gIWRhdGEuc2VsZWN0ZWQgOiBmYWxzZTtcclxuICAgIH0pID09IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RWYWx1ZShldmVudDogTW91c2VFdmVudCwgZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLmludGVybmFsU2VsZWN0VmFsdWUoZXZlbnQsIGRhdGEpO1xyXG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZXJuYWxTZWxlY3RWYWx1ZShldmVudDogTW91c2VFdmVudCwgZGF0YTogYW55KSB7XHJcbiAgICBpZiAoZGF0YSA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMub25Nb2RlbENoYW5nZShudWxsKTtcclxuICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVhbFZhbHVlID0gZGF0YS52YWx1ZTtcclxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgIGlmIChldmVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl92YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHJlbW92ZWQgPSBuaC5yZW1vdmUodGhpcy5fdmFsdWUsICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnRyYWNrQnkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVbdGhpcy50cmFja0J5XSA9PT0gcmVhbFZhbHVlW3RoaXMudHJhY2tCeV07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IHJlYWxWYWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChuaC5pc0VtcHR5KHJlbW92ZWQpKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHJlYWxWYWx1ZSk7XHJcbiAgICAgICAgZGF0YS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGF0YS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobmguaXNFbXB0eSh0aGlzLl92YWx1ZSkpIHtcclxuICAgICAgICB0aGlzLl92YWx1ZSA9IG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBbGxDaGVja2VkKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl92YWx1ZSA9IHJlYWxWYWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbGVjdCgpOiB2b2lkIHtcclxuICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChpc05hTih2YWx1ZSkgJiYgbmguaXNFbXB0eSh2YWx1ZSkpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgIGlmICh0aGlzLl92YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3REYXRhcy5mb3JFYWNoKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRhdGEuc2VsZWN0ZWQgPSBuaC5maW5kKHRoaXMudmFsdWUsIChwb3NzaWJsZVZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocG9zc2libGVWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0J5ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc3NpYmxlVmFsdWVbdGhpcy50cmFja0J5XSA9PT0gZGF0YS52YWx1ZVt0aGlzLnRyYWNrQnldO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc3NpYmxlVmFsdWUgPT09IGRhdGEudmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfSkgIT0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdERhdGFzLmZvckVhY2goKGRhdGEpID0+IHtcclxuICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgZGF0YS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXBkYXRlQWxsQ2hlY2tlZCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYW5hZ2VIYXNWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgb25Nb2RlbENoYW5nZSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLm1hbmFnZUhhc1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hbmFnZUhhc1ZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnaGFzLXZhbHVlJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnaGFzLXZhbHVlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==