igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
381 lines • 25.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Input, HostBinding, Output, EventEmitter } from '@angular/core';
import { Navigate } from './drop-down.common';
import { DropDownActionKey } from './drop-down.common';
/** @type {?} */
let NEXT_ID = 0;
/**
* An abstract class, defining a drop-down component, with:
* Properties for display styles and classes
* A collection items of type `IgxDropDownItemBase`
* Properties and methods for navigating (highlighting/focusing) items from the collection
* Properties and methods for selecting items from the collection
* @abstract
*/
export class IgxDropDownBase {
/**
* @param {?} elementRef
* @param {?} cdr
*/
constructor(elementRef, cdr) {
this.elementRef = elementRef;
this.cdr = cdr;
this._focusedItem = null;
this._id = `igx-drop-down-${NEXT_ID++}`;
/**
* Emitted when item selection is changing, before the selection completes
*
* ```html
* <igx-drop-down (onSelection)='handleSelection()'></igx-drop-down>
* ```
*/
this.onSelection = new EventEmitter();
/**
* Gets/Sets the drop down's container max height.
*
* ```typescript
* // get
* let maxHeight = this.dropdown.maxHeight;
* ```
* ```html
* <!--set-->
* <igx-drop-down [maxHeight]='200px'></igx-drop-down>
* ```
*/
this.maxHeight = null;
/**
* @hidden \@internal
*/
this.cssClass = true;
}
/**
* Get dropdown's html element of it scroll container
* @protected
* @return {?}
*/
get scrollContainer() {
return this.element;
}
/**
* Get all non-header items
*
* ```typescript
* let myDropDownItems = this.dropdown.items;
* ```
* @return {?}
*/
get items() {
/** @type {?} */
const items = [];
if (this.children !== undefined) {
for (const child of this.children.toArray()) {
if (!child.isHeader) {
items.push(child);
}
}
}
return items;
}
/**
* Get all header items
*
* ```typescript
* let myDropDownHeaderItems = this.dropdown.headers;
* ```
* @return {?}
*/
get headers() {
/** @type {?} */
const headers = [];
if (this.children !== undefined) {
for (const child of this.children.toArray()) {
if (child.isHeader) {
headers.push(child);
}
}
}
return headers;
}
/**
* Get dropdown html element
*
* ```typescript
* let myDropDownElement = this.dropdown.element;
* ```
* @return {?}
*/
get element() {
return this.elementRef.nativeElement;
}
/**
* Keydown Handler
* @param {?} key
* @param {?=} event
* @return {?}
*/
onItemActionKey(key, event) {
switch (key) {
case DropDownActionKey.ENTER:
case DropDownActionKey.SPACE:
this.selectItem(this.focusedItem, event);
break;
case DropDownActionKey.ESCAPE:
}
}
/**
* Emits onSelection with the target item & event
* @hidden \@internal
* @param {?=} newSelection the item selected
* @param {?=} event the event that triggered the call
* @return {?}
*/
selectItem(newSelection, event) {
this.onSelection.emit({
newSelection,
oldSelection: null,
cancel: false
});
}
/**
* @hidden \@internal
* @return {?}
*/
get focusedItem() {
return this._focusedItem;
}
/**
* @hidden \@internal
* @param {?} item
* @return {?}
*/
set focusedItem(item) {
this._focusedItem = item;
}
/**
* @protected
* @param {?} direction
* @param {?=} currentIndex
* @return {?}
*/
navigate(direction, currentIndex) {
/** @type {?} */
let index = -1;
if (this._focusedItem) {
index = currentIndex ? currentIndex : this._focusedItem.itemIndex;
}
/** @type {?} */
const newIndex = this.getNearestSiblingFocusableItemIndex(index, direction);
this.navigateItem(newIndex);
}
/**
* @protected
* @param {?} startIndex
* @param {?} direction
* @return {?}
*/
getNearestSiblingFocusableItemIndex(startIndex, direction) {
/** @type {?} */
let index = startIndex;
/** @type {?} */
const items = this.items;
while (items[index + direction] && items[index + direction].disabled) {
index += direction;
}
index += direction;
if (index >= 0 && index < items.length) {
return index;
}
else {
return -1;
}
}
/**
* Navigates to the item on the specified index
* @param {?} newIndex number - the index of the item in the `items` collection
* @return {?}
*/
navigateItem(newIndex) {
if (newIndex !== -1) {
/** @type {?} */
const oldItem = this._focusedItem;
/** @type {?} */
const newItem = this.items[newIndex];
if (oldItem) {
oldItem.focused = false;
}
this._focusedItem = newItem;
this.scrollToHiddenItem(newItem);
this._focusedItem.focused = true;
}
}
/**
* @hidden \@internal
* @return {?}
*/
navigateFirst() {
this.navigate(Navigate.Down, -1);
}
/**
* @hidden \@internal
* @return {?}
*/
navigateLast() {
this.navigate(Navigate.Up, this.items.length);
}
/**
* @hidden \@internal
* @return {?}
*/
navigateNext() {
this.navigate(Navigate.Down);
}
/**
* @hidden \@internal
* @return {?}
*/
navigatePrev() {
this.navigate(Navigate.Up);
}
/**
* @protected
* @param {?} newItem
* @return {?}
*/
scrollToHiddenItem(newItem) {
/** @type {?} */
const elementRect = newItem.element.nativeElement.getBoundingClientRect();
/** @type {?} */
const parentRect = this.scrollContainer.getBoundingClientRect();
if (parentRect.top > elementRect.top) {
this.scrollContainer.scrollTop -= (parentRect.top - elementRect.top);
}
if (parentRect.bottom < elementRect.bottom) {
this.scrollContainer.scrollTop += (elementRect.bottom - parentRect.bottom);
}
}
}
IgxDropDownBase.propDecorators = {
onSelection: [{ type: Output }],
width: [{ type: Input }],
height: [{ type: Input }],
id: [{ type: Input }],
maxHeight: [{ type: Input }, { type: HostBinding, args: ['style.maxHeight',] }],
cssClass: [{ type: HostBinding, args: ['class.igx-drop-down',] }]
};
if (false) {
/**
* @type {?}
* @protected
*/
IgxDropDownBase.prototype._width;
/**
* @type {?}
* @protected
*/
IgxDropDownBase.prototype._height;
/**
* @type {?}
* @protected
*/
IgxDropDownBase.prototype._focusedItem;
/**
* @type {?}
* @protected
*/
IgxDropDownBase.prototype._id;
/**
* @hidden
* \@internal
* @type {?}
*/
IgxDropDownBase.prototype.children;
/**
* Emitted when item selection is changing, before the selection completes
*
* ```html
* <igx-drop-down (onSelection)='handleSelection()'></igx-drop-down>
* ```
* @type {?}
*/
IgxDropDownBase.prototype.onSelection;
/**
* Gets/Sets the width of the drop down
*
* ```typescript
* // get
* let myDropDownCurrentWidth = this.dropdown.width;
* ```
* ```html
* <!--set-->
* <igx-drop-down [width]='160px'></igx-drop-down>
* ```
* @type {?}
*/
IgxDropDownBase.prototype.width;
/**
* Gets/Sets the height of the drop down
*
* ```typescript
* // get
* let myDropDownCurrentHeight = this.dropdown.height;
* ```
* ```html
* <!--set-->
* <igx-drop-down [height]='400px'></igx-drop-down>
* ```
* @type {?}
*/
IgxDropDownBase.prototype.height;
/**
* Gets/Sets the drop down's id
*
* ```typescript
* // get
* let myDropDownCurrentId = this.dropdown.id;
* ```
* ```html
* <!--set-->
* <igx-drop-down [id]='newDropDownId'></igx-drop-down>
* ```
* @type {?}
*/
IgxDropDownBase.prototype.id;
/**
* Gets/Sets the drop down's container max height.
*
* ```typescript
* // get
* let maxHeight = this.dropdown.maxHeight;
* ```
* ```html
* <!--set-->
* <igx-drop-down [maxHeight]='200px'></igx-drop-down>
* ```
* @type {?}
*/
IgxDropDownBase.prototype.maxHeight;
/**
* @hidden \@internal
* @type {?}
*/
IgxDropDownBase.prototype.cssClass;
/**
* Gets if the dropdown is collapsed
* @type {?}
*/
IgxDropDownBase.prototype.collapsed;
/**
* @type {?}
* @protected
*/
IgxDropDownBase.prototype.elementRef;
/**
* @type {?}
* @protected
*/
IgxDropDownBase.prototype.cdr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcC1kb3duLmJhc2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2Ryb3AtZG93bi9kcm9wLWRvd24uYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILEtBQUssRUFBRSxXQUFXLEVBQXlCLE1BQU0sRUFBRSxZQUFZLEVBQ2xFLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxRQUFRLEVBQXVCLE1BQU0sb0JBQW9CLENBQUM7QUFFbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0lBR25ELE9BQU8sR0FBRyxDQUFDOzs7Ozs7Ozs7QUFTZixNQUFNLE9BQWdCLGVBQWU7Ozs7O0lBd0pqQyxZQUNjLFVBQXNCLEVBQ3RCLEdBQXNCO1FBRHRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF2SjFCLGlCQUFZLEdBQVEsSUFBSSxDQUFDO1FBQ3pCLFFBQUcsR0FBRyxpQkFBaUIsT0FBTyxFQUFFLEVBQUUsQ0FBQzs7Ozs7Ozs7UUF1QnRDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7Ozs7Ozs7Ozs7Ozs7UUE2RHRELGNBQVMsR0FBRyxJQUFJLENBQUM7Ozs7UUFNakIsYUFBUSxHQUFHLElBQUksQ0FBQztJQTREaUIsQ0FBQzs7Ozs7O0lBakp6QyxJQUFjLGVBQWU7UUFDekIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7Ozs7Ozs7OztJQTRGRCxJQUFXLEtBQUs7O2NBQ04sS0FBSyxHQUEwQixFQUFFO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDN0IsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtvQkFD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QUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM5RTtJQUNMLENBQUM7OzswQkF4UEEsTUFBTTtvQkFlTixLQUFLO3FCQWVMLEtBQUs7aUJBZUwsS0FBSzt3QkFlTCxLQUFLLFlBQ0wsV0FBVyxTQUFDLGlCQUFpQjt1QkFNN0IsV0FBVyxTQUFDLHFCQUFxQjs7Ozs7OztJQTVGbEMsaUNBQWlCOzs7OztJQUNqQixrQ0FBa0I7Ozs7O0lBQ2xCLHVDQUFtQzs7Ozs7SUFDbkMsOEJBQTZDOzs7Ozs7SUFhN0MsbUNBQWdEOzs7Ozs7Ozs7SUFTaEQsc0NBQzZEOzs7Ozs7Ozs7Ozs7OztJQWM3RCxnQ0FDcUI7Ozs7Ozs7Ozs7Ozs7O0lBY3JCLGlDQUNzQjs7Ozs7Ozs7Ozs7Ozs7SUFjdEIsNkJBQ2tCOzs7Ozs7Ozs7Ozs7OztJQWNsQixvQ0FFd0I7Ozs7O0lBS3hCLG1DQUN1Qjs7Ozs7SUF3RHZCLG9DQUFtQzs7Ozs7SUFHL0IscUNBQWdDOzs7OztJQUNoQyw4QkFBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIElucHV0LCBIb3N0QmluZGluZywgRWxlbWVudFJlZiwgUXVlcnlMaXN0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0b3JSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE5hdmlnYXRlLCBJU2VsZWN0aW9uRXZlbnRBcmdzIH0gZnJvbSAnLi9kcm9wLWRvd24uY29tbW9uJztcbmltcG9ydCB7IElEcm9wRG93bkxpc3QgfSBmcm9tICcuL2Ryb3AtZG93bi5jb21tb24nO1xuaW1wb3J0IHsgRHJvcERvd25BY3Rpb25LZXkgfSBmcm9tICcuL2Ryb3AtZG93bi5jb21tb24nO1xuaW1wb3J0IHsgSWd4RHJvcERvd25JdGVtQmFzZSB9IGZyb20gJy4vZHJvcC1kb3duLWl0ZW0uYmFzZSc7XG5cbmxldCBORVhUX0lEID0gMDtcblxuLyoqXG4gKiBBbiBhYnN0cmFjdCBjbGFzcywgZGVmaW5pbmcgYSBkcm9wLWRvd24gY29tcG9uZW50LCB3aXRoOlxuICogUHJvcGVydGllcyBmb3IgZGlzcGxheSBzdHlsZXMgYW5kIGNsYXNzZXNcbiAqIEEgY29sbGVjdGlvbiBpdGVtcyBvZiB0eXBlIGBJZ3hEcm9wRG93bkl0ZW1CYXNlYFxuICogUHJvcGVydGllcyBhbmQgbWV0aG9kcyBmb3IgbmF2aWdhdGluZyAoaGlnaGxpZ2h0aW5nL2ZvY3VzaW5nKSBpdGVtcyBmcm9tIHRoZSBjb2xsZWN0aW9uXG4gKiBQcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGZvciBzZWxlY3RpbmcgaXRlbXMgZnJvbSB0aGUgY29sbGVjdGlvblxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSWd4RHJvcERvd25CYXNlIGltcGxlbWVudHMgSURyb3BEb3duTGlzdCB7XG4gICAgcHJvdGVjdGVkIF93aWR0aDtcbiAgICBwcm90ZWN0ZWQgX2hlaWdodDtcbiAgICBwcm90ZWN0ZWQgX2ZvY3VzZWRJdGVtOiBhbnkgPSBudWxsO1xuICAgIHByb3RlY3RlZCBfaWQgPSBgaWd4LWRyb3AtZG93bi0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogR2V0IGRyb3Bkb3duJ3MgaHRtbCBlbGVtZW50IG9mIGl0IHNjcm9sbCBjb250YWluZXJcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IHNjcm9sbENvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNoaWxkcmVuOiBRdWVyeUxpc3Q8SWd4RHJvcERvd25JdGVtQmFzZT47XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gaXRlbSBzZWxlY3Rpb24gaXMgY2hhbmdpbmcsIGJlZm9yZSB0aGUgc2VsZWN0aW9uIGNvbXBsZXRlc1xuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZHJvcC1kb3duIChvblNlbGVjdGlvbik9J2hhbmRsZVNlbGVjdGlvbigpJz48L2lneC1kcm9wLWRvd24+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogIEdldHMvU2V0cyB0aGUgd2lkdGggb2YgdGhlIGRyb3AgZG93blxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteURyb3BEb3duQ3VycmVudFdpZHRoID0gdGhpcy5kcm9wZG93bi53aWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtZHJvcC1kb3duIFt3aWR0aF09JzE2MHB4Jz48L2lneC1kcm9wLWRvd24+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgd2lkdGg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBkcm9wIGRvd25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlEcm9wRG93bkN1cnJlbnRIZWlnaHQgPSB0aGlzLmRyb3Bkb3duLmhlaWdodDtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtZHJvcC1kb3duIFtoZWlnaHRdPSc0MDBweCc+PC9pZ3gtZHJvcC1kb3duPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhlaWdodDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkcm9wIGRvd24ncyBpZFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteURyb3BEb3duQ3VycmVudElkID0gdGhpcy5kcm9wZG93bi5pZDtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtZHJvcC1kb3duIFtpZF09J25ld0Ryb3BEb3duSWQnPjwvaWd4LWRyb3AtZG93bj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkcm9wIGRvd24ncyBjb250YWluZXIgbWF4IGhlaWdodC5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbWF4SGVpZ2h0ID0gdGhpcy5kcm9wZG93bi5tYXhIZWlnaHQ7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWRyb3AtZG93biBbbWF4SGVpZ2h0XT0nMjAwcHgnPjwvaWd4LWRyb3AtZG93bj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygnc3R5bGUubWF4SGVpZ2h0JylcbiAgICBwdWJsaWMgbWF4SGVpZ2h0ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZHJvcC1kb3duJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBub24taGVhZGVyIGl0ZW1zXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IG15RHJvcERvd25JdGVtcyA9IHRoaXMuZHJvcGRvd24uaXRlbXM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpdGVtcygpOiBJZ3hEcm9wRG93bkl0ZW1CYXNlW10ge1xuICAgICAgICBjb25zdCBpdGVtczogSWd4RHJvcERvd25JdGVtQmFzZVtdID0gW107XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbi50b0FycmF5KCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLmlzSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGhlYWRlciBpdGVtc1xuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBteURyb3BEb3duSGVhZGVySXRlbXMgPSB0aGlzLmRyb3Bkb3duLmhlYWRlcnM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJzKCk6IElneERyb3BEb3duSXRlbUJhc2VbXSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IElneERyb3BEb3duSXRlbUJhc2VbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4udG9BcnJheSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmlzSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGRyb3Bkb3duIGh0bWwgZWxlbWVudFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBteURyb3BEb3duRWxlbWVudCA9IHRoaXMuZHJvcGRvd24uZWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGlmIHRoZSBkcm9wZG93biBpcyBjb2xsYXBzZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgY29sbGFwc2VkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikgeyB9XG5cbiAgICAvKiogS2V5ZG93biBIYW5kbGVyICovXG4gICAgcHVibGljIG9uSXRlbUFjdGlvbktleShrZXk6IERyb3BEb3duQWN0aW9uS2V5LCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlIERyb3BEb3duQWN0aW9uS2V5LkVOVEVSOlxuICAgICAgICAgICAgY2FzZSBEcm9wRG93bkFjdGlvbktleS5TUEFDRTpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0odGhpcy5mb2N1c2VkSXRlbSwgZXZlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEcm9wRG93bkFjdGlvbktleS5FU0NBUEU6XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBvblNlbGVjdGlvbiB3aXRoIHRoZSB0YXJnZXQgaXRlbSAmIGV2ZW50XG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBAcGFyYW0gbmV3U2VsZWN0aW9uIHRoZSBpdGVtIHNlbGVjdGVkXG4gICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgY2FsbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKG5ld1NlbGVjdGlvbj86IElneERyb3BEb3duSXRlbUJhc2UsIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbi5lbWl0KHtcbiAgICAgICAgICAgIG5ld1NlbGVjdGlvbixcbiAgICAgICAgICAgIG9sZFNlbGVjdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZvY3VzZWRJdGVtKCk6IElneERyb3BEb3duSXRlbUJhc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9jdXNlZEl0ZW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGZvY3VzZWRJdGVtKGl0ZW06IElneERyb3BEb3duSXRlbUJhc2UpIHtcbiAgICAgICAgdGhpcy5fZm9jdXNlZEl0ZW0gPSBpdGVtO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBuYXZpZ2F0ZShkaXJlY3Rpb246IE5hdmlnYXRlLCBjdXJyZW50SW5kZXg/OiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gLTE7XG4gICAgICAgIGlmICh0aGlzLl9mb2N1c2VkSXRlbSkge1xuICAgICAgICAgICAgaW5kZXggPSBjdXJyZW50SW5kZXggPyBjdXJyZW50SW5kZXggOiB0aGlzLl9mb2N1c2VkSXRlbS5pdGVtSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLmdldE5lYXJlc3RTaWJsaW5nRm9jdXNhYmxlSXRlbUluZGV4KGluZGV4LCBkaXJlY3Rpb24pO1xuICAgICAgICB0aGlzLm5hdmlnYXRlSXRlbShuZXdJbmRleCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldE5lYXJlc3RTaWJsaW5nRm9jdXNhYmxlSXRlbUluZGV4KHN0YXJ0SW5kZXg6IG51bWJlciwgZGlyZWN0aW9uOiBOYXZpZ2F0ZSk6IG51bWJlciB7XG4gICAgICAgIGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICAgICAgd2hpbGUgKGl0ZW1zW2luZGV4ICsgZGlyZWN0aW9uXSAmJiBpdGVtc1tpbmRleCArIGRpcmVjdGlvbl0uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyB0byB0aGUgaXRlbSBvbiB0aGUgc3BlY2lmaWVkIGluZGV4XG4gICAgICogQHBhcmFtIG5ld0luZGV4IG51bWJlciAtIHRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgYGl0ZW1zYCBjb2xsZWN0aW9uXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlSXRlbShuZXdJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChuZXdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZEl0ZW0gPSB0aGlzLl9mb2N1c2VkSXRlbTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0l0ZW0gPSB0aGlzLml0ZW1zW25ld0luZGV4XTtcbiAgICAgICAgICAgIGlmIChvbGRJdGVtKSB7XG4gICAgICAgICAgICAgICAgb2xkSXRlbS5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9mb2N1c2VkSXRlbSA9IG5ld0l0ZW07XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvSGlkZGVuSXRlbShuZXdJdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRJdGVtLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVGaXJzdCgpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZShOYXZpZ2F0ZS5Eb3duLCAtMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVMYXN0KCkge1xuICAgICAgICB0aGlzLm5hdmlnYXRlKE5hdmlnYXRlLlVwLCB0aGlzLml0ZW1zLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVOZXh0KCkge1xuICAgICAgICB0aGlzLm5hdmlnYXRlKE5hdmlnYXRlLkRvd24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlUHJldigpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZShOYXZpZ2F0ZS5VcCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNjcm9sbFRvSGlkZGVuSXRlbShuZXdJdGVtOiBJZ3hEcm9wRG93bkl0ZW1CYXNlKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gbmV3SXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHBhcmVudFJlY3QgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKHBhcmVudFJlY3QudG9wID4gZWxlbWVudFJlY3QudG9wKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgLT0gKHBhcmVudFJlY3QudG9wIC0gZWxlbWVudFJlY3QudG9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJlbnRSZWN0LmJvdHRvbSA8IGVsZW1lbnRSZWN0LmJvdHRvbSkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wICs9IChlbGVtZW50UmVjdC5ib3R0b20gLSBwYXJlbnRSZWN0LmJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=