@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
407 lines • 33.7 kB
JavaScript
import { __decorate, __metadata, __param } from "tslib";
import { IGX_DROPDOWN_BASE } from './drop-down.common';
import { Directive, Input, HostBinding, HostListener, ElementRef, Optional, Inject, DoCheck, Output, EventEmitter } from '@angular/core';
import { IgxSelectionAPIService } from '../core/selection';
import { DeprecateProperty, showMessage } from '../core/deprecateDecorators';
import { IgxDropDownGroupComponent } from './drop-down-group.component';
var NEXT_ID = 0;
var warningShown = false;
/**
* An abstract class defining a drop-down item:
* With properties / styles for selection, highlight, height
* Bindable property for passing data (`value: any`)
* Parent component (has to be used under a parent with type `IDropDownBase`)
* Method for handling click on Host()
*/
var IgxDropDownItemBaseDirective = /** @class */ (function () {
function IgxDropDownItemBaseDirective(dropDown, elementRef, group, selection) {
this.dropDown = dropDown;
this.elementRef = elementRef;
this.group = group;
this.selection = selection;
/**
* @hidden
*/
this._focused = false;
this._selected = false;
this._index = null;
this._disabled = false;
/**
* Sets/gets the `id` of the item.
* ```html
* <igx-drop-down-item [id] = 'igx-drop-down-item-0'></igx-drop-down-item>
* ```
* ```typescript
* let itemId = this.item.id;
* ```
* @memberof IgxSelectItemComponent
*/
this.id = "igx-drop-down-item-" + NEXT_ID++;
/**
*@hidden
*/
this.selectedChange = new EventEmitter();
/**
* Gets/sets the `role` attribute of the item. Default is 'option'.
*
* ```html
* <igx-drop-down-item [role]="customRole"></igx-drop-down-item>
* ```
*/
this.role = 'option';
}
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "hasIndex", {
get: function () {
return this._index !== null && this._index !== undefined;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "itemID", {
/**
* @hidden @internal
*/
get: function () {
return this;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "index", {
/**
* The data index of the dropdown item.
*
* ```typescript
* // get the data index of the selected dropdown item
* let selectedItemIndex = this.dropdown.selectedItem.index
* ```
*/
get: function () {
if (this._index === null) {
warningShown = showMessage('IgxDropDownItemBaseDirective: Automatic index is deprecated.' +
'Bind in the template instead using `<igx-drop-down-item [index]="i"` instead.`', warningShown);
return this.itemIndex;
}
return this._index;
},
set: function (value) {
this._index = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "itemStyle", {
/**
* @hidden @internal
*/
get: function () {
return !this.isHeader;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "itemStyleCosy", {
/**
* @hidden @internal
*/
get: function () {
return this.dropDown.displayDensity === 'cosy' && !this.isHeader;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "itemStyleCompact", {
/**
* @hidden @internal
*/
get: function () {
return this.dropDown.displayDensity === 'compact' && !this.isHeader;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "selected", {
/**
* Sets/Gets if the item is the currently selected one in the dropdown
*
* ```typescript
* let mySelectedItem = this.dropdown.selectedItem;
* let isMyItemSelected = mySelectedItem.selected; // true
* ```
*
* Two-way data binding
* ```html
* <igx-drop-down-item [(selected)]='model.isSelected'></igx-drop-down-item>
* ```
*/
get: function () {
return this._selected;
},
set: function (value) {
if (this.isHeader) {
return;
}
this._selected = value;
this.selectedChange.emit(this._selected);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "isSelected", {
/**
* @hidden @internal
*/
get: function () {
return this.selected;
},
/**
* @hidden @internal
*/
set: function (value) {
this.selected = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "focused", {
/**
* Sets/gets if the given item is focused
* ```typescript
* let mySelectedItem = this.dropdown.selectedItem;
* let isMyItemFocused = mySelectedItem.focused;
* ```
*/
get: function () {
return (!this.isHeader && !this.disabled) && this._focused;
},
/**
* ```html
* <igx-drop-down-item *ngFor="let item of items" focused={{!item.focused}}>
* <div>
* {{item.field}}
* </div>
* </igx-drop-down-item>
* ```
*/
set: function (value) {
this._focused = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "isFocused", {
/**
* @hidden @internal
*/
get: function () {
return this.focused;
},
/**
* @hidden @internal
*/
set: function (value) {
this.focused = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "headerClassCosy", {
/**
* @hidden @internal
*/
get: function () {
return this.isHeader && this.dropDown.displayDensity === 'cosy';
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "headerClassCompact", {
/**
* @hidden @internal
*/
get: function () {
return this.isHeader && this.dropDown.displayDensity === 'compact';
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "disabled", {
/**
* Sets/gets if the given item is disabled
*
* ```typescript
* // get
* let mySelectedItem = this.dropdown.selectedItem;
* let myItemIsDisabled = mySelectedItem.disabled;
* ```
*
* ```html
* <igx-drop-down-item *ngFor="let item of items" disabled={{!item.disabled}}>
* <div>
* {{item.field}}
* </div>
* </igx-drop-down-item>
* ```
* **NOTE:** Drop-down items inside of a disabled `IgxDropDownGroup` will always count as disabled
*/
get: function () {
return this.group ? this.group.disabled || this._disabled : this._disabled;
},
set: function (value) {
this._disabled = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "itemIndex", {
/**
* Gets item index
* @hidden @internal
*/
get: function () {
return this.dropDown.items.indexOf(this);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "elementHeight", {
/**
* Gets item element height
* @hidden @internal
*/
get: function () {
return this.elementRef.nativeElement.clientHeight;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "element", {
/**
* Get item html element
* @hidden @internal
*/
get: function () {
return this.elementRef;
},
enumerable: true,
configurable: true
});
IgxDropDownItemBaseDirective.prototype.ngDoCheck = function () {
if (this._selected) {
var dropDownSelectedItem = this.dropDown.selectedItem;
if (!dropDownSelectedItem) {
this.dropDown.selectItem(this);
}
else if (this.hasIndex
? this._index !== dropDownSelectedItem.index || this.value !== dropDownSelectedItem.value :
this !== dropDownSelectedItem) {
this.dropDown.selectItem(this);
}
}
};
IgxDropDownItemBaseDirective.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_DROPDOWN_BASE,] }] },
{ type: ElementRef },
{ type: IgxDropDownGroupComponent, decorators: [{ type: Optional }] },
{ type: IgxSelectionAPIService, decorators: [{ type: Optional }, { type: Inject, args: [IgxSelectionAPIService,] }] }
]; };
__decorate([
HostBinding('attr.id'),
Input(),
__metadata("design:type", Object)
], IgxDropDownItemBaseDirective.prototype, "id", void 0);
__decorate([
Input(),
__metadata("design:type", Number),
__metadata("design:paramtypes", [Object])
], IgxDropDownItemBaseDirective.prototype, "index", null);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxDropDownItemBaseDirective.prototype, "value", void 0);
__decorate([
HostBinding('class.igx-drop-down__item'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxDropDownItemBaseDirective.prototype, "itemStyle", null);
__decorate([
HostBinding('class.igx-drop-down__item--cosy'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxDropDownItemBaseDirective.prototype, "itemStyleCosy", null);
__decorate([
HostBinding('class.igx-drop-down__item--compact'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxDropDownItemBaseDirective.prototype, "itemStyleCompact", null);
__decorate([
Input(),
HostBinding('attr.aria-selected'),
HostBinding('class.igx-drop-down__item--selected'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxDropDownItemBaseDirective.prototype, "selected", null);
__decorate([
Output(),
__metadata("design:type", Object)
], IgxDropDownItemBaseDirective.prototype, "selectedChange", void 0);
__decorate([
Input(),
DeprecateProperty("IgxDropDownItemBaseDirective `isSelected` property is deprecated.\n" +
"Use `selected` instead."),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxDropDownItemBaseDirective.prototype, "isSelected", null);
__decorate([
HostBinding('class.igx-drop-down__item--focused'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxDropDownItemBaseDirective.prototype, "focused", null);
__decorate([
DeprecateProperty("IgxDropDownItemBaseDirective `isFocused` property is depracated.\n" +
"Use `focused` instead."),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxDropDownItemBaseDirective.prototype, "isFocused", null);
__decorate([
Input(),
HostBinding('class.igx-drop-down__header'),
__metadata("design:type", Boolean)
], IgxDropDownItemBaseDirective.prototype, "isHeader", void 0);
__decorate([
HostBinding('class.igx-drop-down__header--cosy'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxDropDownItemBaseDirective.prototype, "headerClassCosy", null);
__decorate([
HostBinding('class.igx-drop-down__header--compact'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxDropDownItemBaseDirective.prototype, "headerClassCompact", null);
__decorate([
Input(),
HostBinding('attr.aria-disabled'),
HostBinding('class.igx-drop-down__item--disabled'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxDropDownItemBaseDirective.prototype, "disabled", null);
__decorate([
Input(),
HostBinding('attr.role'),
__metadata("design:type", Object)
], IgxDropDownItemBaseDirective.prototype, "role", void 0);
IgxDropDownItemBaseDirective = __decorate([
Directive({
selector: '[igxDropDownItemBase]'
}),
__param(0, Inject(IGX_DROPDOWN_BASE)),
__param(2, Optional()),
__param(3, Optional()), __param(3, Inject(IgxSelectionAPIService)),
__metadata("design:paramtypes", [Object, ElementRef,
IgxDropDownGroupComponent,
IgxSelectionAPIService])
], IgxDropDownItemBaseDirective);
return IgxDropDownItemBaseDirective;
}());
export { IgxDropDownItemBaseDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcC1kb3duLWl0ZW0uYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZHJvcC1kb3duL2Ryb3AtZG93bi1pdGVtLmJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBaUIsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pJLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV4RSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDaEIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBRXpCOzs7Ozs7R0FNRztBQUlIO0lBcVNJLHNDQUN5QyxRQUF1QixFQUNsRCxVQUFzQixFQUNWLEtBQWdDLEVBQ0EsU0FBa0M7UUFIbkQsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUNsRCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ1YsVUFBSyxHQUFMLEtBQUssQ0FBMkI7UUFDQSxjQUFTLEdBQVQsU0FBUyxDQUF5QjtRQXhTNUY7O1dBRUc7UUFDTyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsV0FBTSxHQUFHLElBQUksQ0FBQztRQUNkLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFLNUI7Ozs7Ozs7OztXQVNHO1FBR0ksT0FBRSxHQUFHLHdCQUFzQixPQUFPLEVBQUksQ0FBQztRQXlHOUM7O1dB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LENBQUMsNkJBQTZCLENBQUM7O2tFQUNsQjtJQU16QjtRQURDLFdBQVcsQ0FBQyxtQ0FBbUMsQ0FBQzs7O3VFQUdoRDtJQU1EO1FBREMsV0FBVyxDQUFDLHNDQUFzQyxDQUFDOzs7MEVBR25EO0lBdUJEO1FBSEMsS0FBSyxFQUFFO1FBQ1AsV0FBVyxDQUFDLG9CQUFvQixDQUFDO1FBQ2pDLFdBQVcsQ0FBQyxxQ0FBcUMsQ0FBQzs7O2dFQUdsRDtJQWVEO1FBRkMsS0FBSyxFQUFFO1FBQ1AsV0FBVyxDQUFDLFdBQVcsQ0FBQzs7OERBQ0Y7SUEzUWQsNEJBQTRCO1FBSHhDLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSx1QkFBdUI7U0FDcEMsQ0FBQztRQXVTTyxXQUFBLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBRXpCLFdBQUEsUUFBUSxFQUFFLENBQUE7UUFDVixXQUFBLFFBQVEsRUFBRSxDQUFBLEVBQUUsV0FBQSxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtpREFGckIsVUFBVTtZQUNILHlCQUF5QjtZQUNZLHNCQUFzQjtPQXpTbkYsNEJBQTRCLENBd1R4QztJQUFELG1DQUFDO0NBQUEsQUF4VEQsSUF3VEM7U0F4VFksNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURyb3BEb3duQmFzZSwgSUdYX0RST1BET1dOX0JBU0UgfSBmcm9tICcuL2Ryb3AtZG93bi5jb21tb24nO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgT3B0aW9uYWwsIEluamVjdCwgRG9DaGVjaywgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElneFNlbGVjdGlvbkFQSVNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3NlbGVjdGlvbic7XG5pbXBvcnQgeyBEZXByZWNhdGVQcm9wZXJ0eSwgc2hvd01lc3NhZ2UgfSBmcm9tICcuLi9jb3JlL2RlcHJlY2F0ZURlY29yYXRvcnMnO1xuaW1wb3J0IHsgSWd4RHJvcERvd25Hcm91cENvbXBvbmVudCB9IGZyb20gJy4vZHJvcC1kb3duLWdyb3VwLmNvbXBvbmVudCc7XG5cbmxldCBORVhUX0lEID0gMDtcbmxldCB3YXJuaW5nU2hvd24gPSBmYWxzZTtcblxuLyoqXG4gKiBBbiBhYnN0cmFjdCBjbGFzcyBkZWZpbmluZyBhIGRyb3AtZG93biBpdGVtOlxuICogV2l0aCBwcm9wZXJ0aWVzIC8gc3R5bGVzIGZvciBzZWxlY3Rpb24sIGhpZ2hsaWdodCwgaGVpZ2h0XG4gKiBCaW5kYWJsZSBwcm9wZXJ0eSBmb3IgcGFzc2luZyBkYXRhIChgdmFsdWU6IGFueWApXG4gKiBQYXJlbnQgY29tcG9uZW50IChoYXMgdG8gYmUgdXNlZCB1bmRlciBhIHBhcmVudCB3aXRoIHR5cGUgYElEcm9wRG93bkJhc2VgKVxuICogTWV0aG9kIGZvciBoYW5kbGluZyBjbGljayBvbiBIb3N0KClcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4RHJvcERvd25JdGVtQmFzZV0nXG59KVxuZXhwb3J0IGNsYXNzIElneERyb3BEb3duSXRlbUJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBEb0NoZWNrIHtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9mb2N1c2VkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9zZWxlY3RlZCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfaW5kZXggPSBudWxsO1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgZ2V0IGhhc0luZGV4KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXggIT09IG51bGwgJiYgdGhpcy5faW5kZXggIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBpZGAgb2YgdGhlIGl0ZW0uXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZHJvcC1kb3duLWl0ZW0gW2lkXSA9ICdpZ3gtZHJvcC1kb3duLWl0ZW0tMCc+PC9pZ3gtZHJvcC1kb3duLWl0ZW0+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpdGVtSWQgPSAgdGhpcy5pdGVtLmlkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTZWxlY3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpZCA9IGBpZ3gtZHJvcC1kb3duLWl0ZW0tJHtORVhUX0lEKyt9YDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpdGVtSUQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGluZGV4IG9mIHRoZSBkcm9wZG93biBpdGVtLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldCB0aGUgZGF0YSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgZHJvcGRvd24gaXRlbVxuICAgICAqIGxldCBzZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZHJvcGRvd24uc2VsZWN0ZWRJdGVtLmluZGV4XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLl9pbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgd2FybmluZ1Nob3duID0gc2hvd01lc3NhZ2UoXG4gICAgICAgICAgICAgICAgJ0lneERyb3BEb3duSXRlbUJhc2VEaXJlY3RpdmU6IEF1dG9tYXRpYyBpbmRleCBpcyBkZXByZWNhdGVkLicgK1xuICAgICAgICAgICAgICAgICdCaW5kIGluIHRoZSB0ZW1wbGF0ZSBpbnN0ZWFkIHVzaW5nIGA8aWd4LWRyb3AtZG93bi1pdGVtIFtpbmRleF09XCJpXCJgIGluc3RlYWQuYCcsXG4gICAgICAgICAgICAgICAgd2FybmluZ1Nob3duKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1JbmRleDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBpbmRleCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9pbmRleCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGl0ZW0gaWYgdGhlIGl0ZW0gaXMgZGF0YWJvdW5kXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gdXNhZ2UgaW4gSWd4RHJvcERvd25JdGVtQ29tcG9uZW50XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IG15U2VsZWN0ZWRJdGVtVmFsdWUgPSB0aGlzLmRyb3Bkb3duLnNlbGVjdGVkSXRlbS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIHNldFxuICAgICAqIGxldCBteVNlbGVjdGVkSXRlbSA9IHRoaXMuZHJvcGRvd24uc2VsZWN0ZWRJdGVtO1xuICAgICAqIG15U2VsZWN0ZWRJdGVtLnZhbHVlID0geyBpZDogMTIzLCBuYW1lOiAnRXhhbXBsZSBOYW1lJyB9XG4gICAgICpcbiAgICAgKiAvLyB1c2FnZSBpbiBJZ3hDb21ib0l0ZW1Db21wb25lbnRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib0l0ZW1WYWx1ZSA9IHRoaXMuY29tYm8uaXRlbXNbMF0udmFsdWU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdmFsdWU6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZHJvcC1kb3duX19pdGVtJylcbiAgICBnZXQgaXRlbVN0eWxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNIZWFkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1kcm9wLWRvd25fX2l0ZW0tLWNvc3knKVxuICAgIHB1YmxpYyBnZXQgaXRlbVN0eWxlQ29zeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcERvd24uZGlzcGxheURlbnNpdHkgPT09ICdjb3N5JyAmJiAhdGhpcy5pc0hlYWRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWRyb3AtZG93bl9faXRlbS0tY29tcGFjdCcpXG4gICAgcHVibGljIGdldCBpdGVtU3R5bGVDb21wYWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wRG93bi5kaXNwbGF5RGVuc2l0eSA9PT0gJ2NvbXBhY3QnICYmICF0aGlzLmlzSGVhZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMvR2V0cyBpZiB0aGUgaXRlbSBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9uZSBpbiB0aGUgZHJvcGRvd25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgbGV0IG15U2VsZWN0ZWRJdGVtID0gdGhpcy5kcm9wZG93bi5zZWxlY3RlZEl0ZW07XG4gICAgICogIGxldCBpc015SXRlbVNlbGVjdGVkID0gbXlTZWxlY3RlZEl0ZW0uc2VsZWN0ZWQ7IC8vIHRydWVcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFR3by13YXkgZGF0YSBiaW5kaW5nXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZHJvcC1kb3duLWl0ZW0gWyhzZWxlY3RlZCldPSdtb2RlbC5pc1NlbGVjdGVkJz48L2lneC1kcm9wLWRvd24taXRlbT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXNlbGVjdGVkJylcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1kcm9wLWRvd25fX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgICB9XG5cbiAgICBzZXQgc2VsZWN0ZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNIZWFkZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5fc2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBARGVwcmVjYXRlUHJvcGVydHkoYElneERyb3BEb3duSXRlbUJhc2VEaXJlY3RpdmUgXFxgaXNTZWxlY3RlZFxcYCBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLlxcbmAgK1xuICAgICAgICBgVXNlIFxcYHNlbGVjdGVkXFxgIGluc3RlYWQuYClcbiAgICBnZXQgaXNTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzZXQgaXNTZWxlY3RlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIGlmIHRoZSBnaXZlbiBpdGVtIGlzIGZvY3VzZWRcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGxldCBteVNlbGVjdGVkSXRlbSA9IHRoaXMuZHJvcGRvd24uc2VsZWN0ZWRJdGVtO1xuICAgICAqICBsZXQgaXNNeUl0ZW1Gb2N1c2VkID0gbXlTZWxlY3RlZEl0ZW0uZm9jdXNlZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1kcm9wLWRvd25fX2l0ZW0tLWZvY3VzZWQnKVxuICAgIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKCF0aGlzLmlzSGVhZGVyICYmICF0aGlzLmRpc2FibGVkKSAmJiB0aGlzLl9mb2N1c2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1kcm9wLWRvd24taXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiIGZvY3VzZWQ9e3shaXRlbS5mb2N1c2VkfX0+XG4gICAgICogICAgICA8ZGl2PlxuICAgICAqICAgICAgICAgIHt7aXRlbS5maWVsZH19XG4gICAgICogICAgICA8L2Rpdj5cbiAgICAgKiAgPC9pZ3gtZHJvcC1kb3duLWl0ZW0+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0IGZvY3VzZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZm9jdXNlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KGBJZ3hEcm9wRG93bkl0ZW1CYXNlRGlyZWN0aXZlIFxcYGlzRm9jdXNlZFxcYCBwcm9wZXJ0eSBpcyBkZXByYWNhdGVkLlxcbmAgK1xuICAgICAgICBgVXNlIFxcYGZvY3VzZWRcXGAgaW5zdGVhZC5gKVxuICAgIGdldCBpc0ZvY3VzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvY3VzZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgc2V0IGlzRm9jdXNlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgaWYgdGhlIGdpdmVuIGl0ZW0gaXMgaGVhZGVyXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICAvLyBnZXRcbiAgICAgKiAgbGV0IG15U2VsZWN0ZWRJdGVtID0gdGhpcy5kcm9wZG93bi5zZWxlY3RlZEl0ZW07XG4gICAgICogIGxldCBpc015SXRlbUhlYWRlciA9IG15U2VsZWN0ZWRJdGVtLmlzSGVhZGVyO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8IS0tc2V0LS0+XG4gICAgICogIDxpZ3gtZHJvcGRvd24taXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiPlxuICAgICAqICAgICAgPGRpdiAqbmdJZj1cIml0ZW1zLmluZGV4T2YoaXRlbSkgPT09IDU7IHRoZW4gaXRlbS5pc0hlYWRlciA9IHRydWVcIj5cbiAgICAgKiAgICAgICAgICB7e2l0ZW0uZmllbGR9fVxuKiAgICAgICAgICAgPC9kaXY+XG4gICAgICogIDwvaWd4LWRyb3AtZG93bi1pdGVtPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZHJvcC1kb3duX19oZWFkZXInKVxuICAgIHB1YmxpYyBpc0hlYWRlcjogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZHJvcC1kb3duX19oZWFkZXItLWNvc3knKVxuICAgIHB1YmxpYyBnZXQgaGVhZGVyQ2xhc3NDb3N5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0hlYWRlciAmJiB0aGlzLmRyb3BEb3duLmRpc3BsYXlEZW5zaXR5ID09PSAnY29zeSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1kcm9wLWRvd25fX2hlYWRlci0tY29tcGFjdCcpXG4gICAgcHVibGljIGdldCBoZWFkZXJDbGFzc0NvbXBhY3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSGVhZGVyICYmIHRoaXMuZHJvcERvd24uZGlzcGxheURlbnNpdHkgPT09ICdjb21wYWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgaWYgdGhlIGdpdmVuIGl0ZW0gaXMgZGlzYWJsZWRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgLy8gZ2V0XG4gICAgICogIGxldCBteVNlbGVjdGVkSXRlbSA9IHRoaXMuZHJvcGRvd24uc2VsZWN0ZWRJdGVtO1xuICAgICAqICBsZXQgbXlJdGVtSXNEaXNhYmxlZCA9IG15U2VsZWN0ZWRJdGVtLmRpc2FibGVkO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWRyb3AtZG93bi1pdGVtICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCIgZGlzYWJsZWQ9e3shaXRlbS5kaXNhYmxlZH19PlxuICAgICAqICAgICAgPGRpdj5cbiAgICAgKiAgICAgICAgICB7e2l0ZW0uZmllbGR9fVxuICAgICAqICAgICAgPC9kaXY+XG4gICAgICogIDwvaWd4LWRyb3AtZG93bi1pdGVtPlxuICAgICAqIGBgYFxuICAgICAqICoqTk9URToqKiBEcm9wLWRvd24gaXRlbXMgaW5zaWRlIG9mIGEgZGlzYWJsZWQgYElneERyb3BEb3duR3JvdXBgIHdpbGwgYWx3YXlzIGNvdW50IGFzIGRpc2FibGVkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kaXNhYmxlZCcpXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZHJvcC1kb3duX19pdGVtLS1kaXNhYmxlZCcpXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXAgPyB0aGlzLmdyb3VwLmRpc2FibGVkIHx8IHRoaXMuX2Rpc2FibGVkIDogdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB0aGUgYHJvbGVgIGF0dHJpYnV0ZSBvZiB0aGUgaXRlbS4gRGVmYXVsdCBpcyAnb3B0aW9uJy5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1kcm9wLWRvd24taXRlbSBbcm9sZV09XCJjdXN0b21Sb2xlXCI+PC9pZ3gtZHJvcC1kb3duLWl0ZW0+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIHJvbGUgPSAnb3B0aW9uJztcblxuICAgIC8qKlxuICAgICAqIEdldHMgaXRlbSBpbmRleFxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpdGVtSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcERvd24uaXRlbXMuaW5kZXhPZih0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGl0ZW0gZWxlbWVudCBoZWlnaHRcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZWxlbWVudEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBpdGVtIGh0bWwgZWxlbWVudFxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBlbGVtZW50KCk6IEVsZW1lbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KElHWF9EUk9QRE9XTl9CQVNFKSBwcm90ZWN0ZWQgZHJvcERvd246IElEcm9wRG93bkJhc2UsXG4gICAgICAgIHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgZ3JvdXA6IElneERyb3BEb3duR3JvdXBDb21wb25lbnQsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSWd4U2VsZWN0aW9uQVBJU2VydmljZSkgcHJvdGVjdGVkIHNlbGVjdGlvbj86IElneFNlbGVjdGlvbkFQSVNlcnZpY2VcbiAgICApIHsgfVxuXG4gICAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3BEb3duU2VsZWN0ZWRJdGVtID0gdGhpcy5kcm9wRG93bi5zZWxlY3RlZEl0ZW07XG4gICAgICAgICAgICBpZiAoIWRyb3BEb3duU2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wRG93bi5zZWxlY3RJdGVtKHRoaXMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc0luZGV4XG4gICAgICAgICAgICAgICAgPyB0aGlzLl9pbmRleCAhPT0gZHJvcERvd25TZWxlY3RlZEl0ZW0uaW5kZXggfHwgdGhpcy52YWx1ZSAhPT0gZHJvcERvd25TZWxlY3RlZEl0ZW0udmFsdWUgOlxuICAgICAgICAgICAgICAgIHRoaXMgIT09IGRyb3BEb3duU2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wRG93bi5zZWxlY3RJdGVtKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19