UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

422 lines 38.3 kB
import { __decorate, __metadata, __param, __values } from "tslib"; import { AfterViewInit, ChangeDetectorRef, Directive, ElementRef, HostBinding, HostListener, Inject, Input, OnDestroy, Optional, Self } from '@angular/core'; import { AbstractControl, FormControlName, NgControl, NgModel } from '@angular/forms'; import { IgxInputGroupBase } from '../../input-group/input-group.common'; var nativeValidationAttributes = ['required', 'pattern', 'minlength', 'maxlength', 'min', 'max', 'step']; export var IgxInputState; (function (IgxInputState) { IgxInputState[IgxInputState["INITIAL"] = 0] = "INITIAL"; IgxInputState[IgxInputState["VALID"] = 1] = "VALID"; IgxInputState[IgxInputState["INVALID"] = 2] = "INVALID"; })(IgxInputState || (IgxInputState = {})); var IgxInputDirective = /** @class */ (function () { function IgxInputDirective(inputGroup, ngModel, formControl, element, cdr) { this.inputGroup = inputGroup; this.ngModel = ngModel; this.formControl = formControl; this.element = element; this.cdr = cdr; this._valid = IgxInputState.INITIAL; /** * Sets/gets whether the `"igx-input-group__input"` class is added to the host element. * Default value is `false`. * ```typescript * this.igxInput.isInput = true; * ``` * ```typescript * let isCLassAdded = this.igxInput.isInput; * ``` * @memberof IgxInputDirective */ this.isInput = false; /** * Sets/gets whether the `"class.igx-input-group__textarea"` class is added to the host element. * Default value is `false`. * ```typescript * this.igxInput.isTextArea = true; * ``` * ```typescript * let isCLassAdded = this.igxInput.isTextArea; * ``` * @memberof IgxInputDirective */ this.isTextArea = false; } Object.defineProperty(IgxInputDirective.prototype, "ngControl", { get: function () { return this.ngModel ? this.ngModel : this.formControl; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputDirective.prototype, "value", { /** * Gets the `value` propery. * ```typescript * @ViewChild('igxInput', {read: IgxInputDirective}) * public igxInput: IgxInputDirective; * let inputValue = this.igxInput.value; * ``` * @memberof IgxInputDirective */ get: function () { return this.nativeElement.value; }, /** * Sets the `value` property. * ```html * <input-group> * <input igxInput #igxInput [value]="'IgxInput Value'"> * </input-group> * ``` * @memberof IgxInputDirective */ set: function (value) { this.nativeElement.value = value; this.checkValidity(); }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputDirective.prototype, "disabled", { /** * Gets the `disabled` property * ```typescript * @ViewChild('igxInput', {read: IgxInputDirective}) * public igxInput: IgxInputDirective; * let isDisabled = this.igxInput.disabled; * ``` * @memberof IgxInputDirective */ get: function () { return this.nativeElement.hasAttribute('disabled'); }, /** * Sets the `disabled` property. * ```html * <input-group> * <input igxInput #igxInput [disabled]="true"> * </input-group> * ``` * @memberof IgxInputDirective */ set: function (value) { this.nativeElement.disabled = value; this.inputGroup.disabled = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputDirective.prototype, "required", { /** * Gets whether the igxInput is required. * ```typescript * let isRequired = this.igxInput.required; * ``` * @memberof IgxInputDirective */ get: function () { return this.nativeElement.hasAttribute('required'); }, /** * Sets the `required` property. * ```html * <input-group> * <input igxInput #igxInput [required]="true"> * </input-group> * ``` * @memberof IgxInputDirective */ set: function (value) { if (typeof value === 'boolean') { this.nativeElement.required = this.inputGroup.isRequired = value; if (value && !this.nativeElement.checkValidity()) { this._valid = IgxInputState.INVALID; } else { this._valid = IgxInputState.INITIAL; } } }, enumerable: true, configurable: true }); /** *@hidden */ IgxInputDirective.prototype.onFocus = function (event) { this.inputGroup.isFocused = true; }; /** *@hidden */ IgxInputDirective.prototype.onBlur = function (event) { this.inputGroup.isFocused = false; this._valid = IgxInputState.INITIAL; if (this.ngControl) { if (!this.ngControl.valid) { this._valid = IgxInputState.INVALID; } } else if (this._hasValidators() && !this.nativeElement.checkValidity()) { this._valid = IgxInputState.INVALID; } }; /** *@hidden */ IgxInputDirective.prototype.onInput = function () { this.checkValidity(); }; /** *@hidden */ IgxInputDirective.prototype.ngAfterViewInit = function () { this.inputGroup.hasPlaceholder = this.nativeElement.hasAttribute('placeholder'); this.inputGroup.disabled = this.inputGroup.disabled || this.nativeElement.hasAttribute('disabled'); this.inputGroup.isRequired = this.nativeElement.hasAttribute('required'); // Make sure we do not invalidate the input on init if (!this.ngControl) { this._valid = IgxInputState.INITIAL; } // Also check the control's validators for required if (!this.inputGroup.isRequired && this.ngControl && this.ngControl.control.validator) { var validation = this.ngControl.control.validator({}); this.inputGroup.isRequired = validation && validation.required; } var elTag = this.nativeElement.tagName.toLowerCase(); if (elTag === 'textarea') { this.isTextArea = true; } else { this.isInput = true; } if (this.ngControl) { this._statusChanges$ = this.ngControl.statusChanges.subscribe(this.onStatusChanged.bind(this)); } this.cdr.detectChanges(); }; /** *@hidden */ IgxInputDirective.prototype.ngOnDestroy = function () { if (this._statusChanges$) { this._statusChanges$.unsubscribe(); } }; /** * Sets a focus on the igxInput. * ```typescript * this.igxInput.focus(); * ``` * @memberof IgxInputDirective */ IgxInputDirective.prototype.focus = function () { this.nativeElement.focus(); }; Object.defineProperty(IgxInputDirective.prototype, "nativeElement", { /** * Gets the `nativeElement` of the igxInput. * ```typescript * let igxInputNativeElement = this.igxInput.nativeElement; * ``` * @memberof IgxInputDirective */ get: function () { return this.element.nativeElement; }, enumerable: true, configurable: true }); /** *@hidden */ IgxInputDirective.prototype.onStatusChanged = function () { if (this.ngControl.control.validator || this.ngControl.control.asyncValidator) { if (this.ngControl.control.touched || this.ngControl.control.dirty) { // TODO: check the logic when control is touched or dirty if (this.inputGroup.isFocused) { // the user is still typing in the control this._valid = this.ngControl.valid ? IgxInputState.VALID : IgxInputState.INVALID; } else { // the user had touched the control previously but now the value is changing due to changes in the form this._valid = this.ngControl.valid ? IgxInputState.INITIAL : IgxInputState.INVALID; } } else { // if control is untouched and pristine its state is initial. This is when user did not interact // with the input or when form/control is reset this._valid = IgxInputState.INITIAL; } } }; Object.defineProperty(IgxInputDirective.prototype, "hasPlaceholder", { /** * Gets whether the igxInput has a placeholder. * ```typescript * let hasPlaceholder = this.igxInput.hasPlaceholder; * ``` * @memberof IgxInputDirective */ get: function () { return this.nativeElement.hasAttribute('placeholder'); }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputDirective.prototype, "placeholder", { /** * Gets the placeholder element of the igxInput. * ```typescript * let igxInputPlaceholder = this.igxInput.placeholder; * ``` * @memberof IgxInputDirective */ get: function () { return this.nativeElement.placeholder; }, enumerable: true, configurable: true }); IgxInputDirective.prototype._hasValidators = function () { var e_1, _a; try { for (var nativeValidationAttributes_1 = __values(nativeValidationAttributes), nativeValidationAttributes_1_1 = nativeValidationAttributes_1.next(); !nativeValidationAttributes_1_1.done; nativeValidationAttributes_1_1 = nativeValidationAttributes_1.next()) { var nativeValidationAttribute = nativeValidationAttributes_1_1.value; if (this.nativeElement.hasAttribute(nativeValidationAttribute)) { return true; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (nativeValidationAttributes_1_1 && !nativeValidationAttributes_1_1.done && (_a = nativeValidationAttributes_1.return)) _a.call(nativeValidationAttributes_1); } finally { if (e_1) throw e_1.error; } } return !!this.ngControl && (!!this.ngControl.control.validator || !!this.ngControl.control.asyncValidator); }; Object.defineProperty(IgxInputDirective.prototype, "focused", { /** * Gets whether the igxInput is focused. * ```typescript * let isFocused = this.igxInput.focused; * ``` * @memberof IgxInputDirective */ get: function () { return this.inputGroup.isFocused; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputDirective.prototype, "valid", { /** * Gets the state of the igxInput. * ```typescript * let igxInputState = this.igxInput.valid; * ``` * @memberof IgxInputDirective */ get: function () { return this._valid; }, /** * Sets the state of the igxInput. * ```typescript * this.igxInput.valid = IgxInputState.INVALID; * ``` * @memberof IgxInputDirective */ set: function (value) { this._valid = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputDirective.prototype, "isValid", { /** * Gets whether the igxInput is valid. * ```typescript * let valid = this.igxInput.isValid; * ``` * @memberof IgxInputDirective */ get: function () { return this.valid !== IgxInputState.INVALID; }, enumerable: true, configurable: true }); IgxInputDirective.prototype.checkValidity = function () { if (!this.ngControl && this._hasValidators()) { this._valid = this.nativeElement.checkValidity() ? IgxInputState.VALID : IgxInputState.INVALID; } }; IgxInputDirective.ctorParameters = function () { return [ { type: IgxInputGroupBase }, { type: NgModel, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NgModel,] }] }, { type: FormControlName, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [FormControlName,] }] }, { type: ElementRef }, { type: ChangeDetectorRef } ]; }; __decorate([ Input('value'), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], IgxInputDirective.prototype, "value", null); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxInputDirective.prototype, "disabled", null); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxInputDirective.prototype, "required", null); __decorate([ HostBinding('class.igx-input-group__input'), __metadata("design:type", Object) ], IgxInputDirective.prototype, "isInput", void 0); __decorate([ HostBinding('class.igx-input-group__textarea'), __metadata("design:type", Object) ], IgxInputDirective.prototype, "isTextArea", void 0); __decorate([ HostListener('focus', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxInputDirective.prototype, "onFocus", null); __decorate([ HostListener('blur', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxInputDirective.prototype, "onBlur", null); __decorate([ HostListener('input'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxInputDirective.prototype, "onInput", null); IgxInputDirective = __decorate([ Directive({ selector: '[igxInput]', exportAs: 'igxInput' }), __param(1, Optional()), __param(1, Self()), __param(1, Inject(NgModel)), __param(2, Optional()), __param(2, Self()), __param(2, Inject(FormControlName)), __metadata("design:paramtypes", [IgxInputGroupBase, NgModel, FormControlName, ElementRef, ChangeDetectorRef]) ], IgxInputDirective); return IgxInputDirective; }()); export { IgxInputDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2lucHV0L2lucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILGFBQWEsRUFDYixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUNULFFBQVEsRUFDUixJQUFJLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXpFLElBQU0sMEJBQTBCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUUzRyxNQUFNLENBQU4sSUFBWSxhQUlYO0FBSkQsV0FBWSxhQUFhO0lBQ3JCLHVEQUFPLENBQUE7SUFDUCxtREFBSyxDQUFBO0lBQ0wsdURBQU8sQ0FBQTtBQUNYLENBQUMsRUFKVyxhQUFhLEtBQWIsYUFBYSxRQUl4QjtBQU1EO0lBSUksMkJBQ1csVUFBNkIsRUFDVyxPQUFnQixFQUNSLFdBQTRCLEVBQ3pFLE9BQW1CLEVBQ25CLEdBQXNCO1FBSnpCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQ1csWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNSLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUN6RSxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBUjVCLFdBQU0sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO1FBbUd2Qzs7Ozs7Ozs7OztX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O1NBQ3ZCLENBQUM7UUFPTyxXQUFBLFFBQVEsRUFBRSxDQUFBLEVBQUUsV0FBQSxJQUFJLEVBQUUsQ0FBQSxFQUFFLFdBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ25DLFdBQUEsUUFBUSxFQUFFLENBQUEsRUFBRSxXQUFBLElBQUksRUFBRSxDQUFBLEVBQUUsV0FBQSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUE7eUNBRnpCLGlCQUFpQjtZQUNvQixPQUFPO1lBQ0ssZUFBZTtZQUNoRSxVQUFVO1lBQ2QsaUJBQWlCO09BVDNCLGlCQUFpQixDQTBUN0I7SUFBRCx3QkFBQztDQUFBLEFBMVRELElBMFRDO1NBMVRZLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPcHRpb25hbCxcbiAgICBTZWxmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbE5hbWUsIE5nQ29udHJvbCwgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSWd4SW5wdXRHcm91cEJhc2UgfSBmcm9tICcuLi8uLi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21tb24nO1xuXG5jb25zdCBuYXRpdmVWYWxpZGF0aW9uQXR0cmlidXRlcyA9IFsncmVxdWlyZWQnLCAncGF0dGVybicsICdtaW5sZW5ndGgnLCAnbWF4bGVuZ3RoJywgJ21pbicsICdtYXgnLCAnc3RlcCddO1xuXG5leHBvcnQgZW51bSBJZ3hJbnB1dFN0YXRlIHtcbiAgICBJTklUSUFMLFxuICAgIFZBTElELFxuICAgIElOVkFMSURcbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4SW5wdXRdJyxcbiAgICBleHBvcnRBczogJ2lneElucHV0J1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hJbnB1dERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSBfdmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOSVRJQUw7XG4gICAgcHJpdmF0ZSBfc3RhdHVzQ2hhbmdlcyQ6IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cEJhc2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOZ01vZGVsKSBwcm90ZWN0ZWQgbmdNb2RlbDogTmdNb2RlbCxcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KEZvcm1Db250cm9sTmFtZSkgcHJvdGVjdGVkIGZvcm1Db250cm9sOiBGb3JtQ29udHJvbE5hbWUsXG4gICAgICAgIHByb3RlY3RlZCBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikgeyB9XG5cbiAgICBwcml2YXRlIGdldCBuZ0NvbnRyb2woKTogTmdDb250cm9sIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdNb2RlbCA/IHRoaXMubmdNb2RlbCA6IHRoaXMuZm9ybUNvbnRyb2w7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB2YWx1ZWAgcHJvcGVydHkuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpbnB1dC1ncm91cD5cbiAgICAgKiAgPGlucHV0IGlneElucHV0ICNpZ3hJbnB1dCBbdmFsdWVdPVwiJ0lneElucHV0IFZhbHVlJ1wiPlxuICAgICAqIDwvaW5wdXQtZ3JvdXA+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgQElucHV0KCd2YWx1ZScpXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZGl0eSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgdmFsdWVgIHByb3BlcnkuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoJ2lneElucHV0Jywge3JlYWQ6IElneElucHV0RGlyZWN0aXZlfSlcbiAgICAgKiAgcHVibGljIGlneElucHV0OiBJZ3hJbnB1dERpcmVjdGl2ZTtcbiAgICAgKiBsZXQgaW5wdXRWYWx1ZSA9IHRoaXMuaWd4SW5wdXQudmFsdWU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgZGlzYWJsZWRgIHByb3BlcnR5LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aW5wdXQtZ3JvdXA+XG4gICAgICogIDxpbnB1dCBpZ3hJbnB1dCAjaWd4SW5wdXQgW2Rpc2FibGVkXT1cInRydWVcIj5cbiAgICAgKiA8L2lucHV0LWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5pbnB1dEdyb3VwLmRpc2FibGVkID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGBkaXNhYmxlZGAgcHJvcGVydHlcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgnaWd4SW5wdXQnLCB7cmVhZDogSWd4SW5wdXREaXJlY3RpdmV9KVxuICAgICAqICBwdWJsaWMgaWd4SW5wdXQ6IElneElucHV0RGlyZWN0aXZlO1xuICAgICAqIGxldCBpc0Rpc2FibGVkID0gdGhpcy5pZ3hJbnB1dC5kaXNhYmxlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgcmVxdWlyZWRgIHByb3BlcnR5LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aW5wdXQtZ3JvdXA+XG4gICAgICogIDxpbnB1dCBpZ3hJbnB1dCAjaWd4SW5wdXQgW3JlcXVpcmVkXT1cInRydWVcIj5cbiAgICAgKiA8L2lucHV0LWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5yZXF1aXJlZCA9IHRoaXMuaW5wdXRHcm91cC5pc1JlcXVpcmVkID0gdmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiAhdGhpcy5uYXRpdmVFbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWxpZCA9IElneElucHV0U3RhdGUuSU5JVElBTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgaWd4SW5wdXQgaXMgcmVxdWlyZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1JlcXVpcmVkID0gdGhpcy5pZ3hJbnB1dC5yZXF1aXJlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgYFwiaWd4LWlucHV0LWdyb3VwX19pbnB1dFwiYCBjbGFzcyBpcyBhZGRlZCB0byB0aGUgaG9zdCBlbGVtZW50LlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5pZ3hJbnB1dC5pc0lucHV0ID0gdHJ1ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzQ0xhc3NBZGRlZCA9IHRoaXMuaWd4SW5wdXQuaXNJbnB1dDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cF9faW5wdXQnKVxuICAgIHB1YmxpYyBpc0lucHV0ID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGBcImNsYXNzLmlneC1pbnB1dC1ncm91cF9fdGV4dGFyZWFcImAgY2xhc3MgaXMgYWRkZWQgdG8gdGhlIGhvc3QgZWxlbWVudC5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuaWd4SW5wdXQuaXNUZXh0QXJlYSA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0NMYXNzQWRkZWQgPSB0aGlzLmlneElucHV0LmlzVGV4dEFyZWE7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXBfX3RleHRhcmVhJylcbiAgICBwdWJsaWMgaXNUZXh0QXJlYSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Gb2N1cyhldmVudCkge1xuICAgICAgICB0aGlzLmlucHV0R3JvdXAuaXNGb2N1c2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uQmx1cihldmVudCkge1xuICAgICAgICB0aGlzLmlucHV0R3JvdXAuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3ZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTklUSUFMO1xuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wudmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWxpZCA9IElneElucHV0U3RhdGUuSU5WQUxJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9oYXNWYWxpZGF0b3JzKCkgJiYgIXRoaXMubmF0aXZlRWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2lucHV0JylcbiAgICBwdWJsaWMgb25JbnB1dCgpIHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkaXR5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5pbnB1dEdyb3VwLmhhc1BsYWNlaG9sZGVyID0gdGhpcy5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgncGxhY2Vob2xkZXInKTtcbiAgICAgICAgdGhpcy5pbnB1dEdyb3VwLmRpc2FibGVkID0gdGhpcy5pbnB1dEdyb3VwLmRpc2FibGVkIHx8IHRoaXMubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgIHRoaXMuaW5wdXRHcm91cC5pc1JlcXVpcmVkID0gdGhpcy5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVxdWlyZWQnKTtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG8gbm90IGludmFsaWRhdGUgdGhlIGlucHV0IG9uIGluaXRcbiAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fdmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOSVRJQUw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxzbyBjaGVjayB0aGUgY29udHJvbCdzIHZhbGlkYXRvcnMgZm9yIHJlcXVpcmVkXG4gICAgICAgIGlmICghdGhpcy5pbnB1dEdyb3VwLmlzUmVxdWlyZWQgJiYgdGhpcy5uZ0NvbnRyb2wgJiYgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvcih7fSBhcyBBYnN0cmFjdENvbnRyb2wpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dEdyb3VwLmlzUmVxdWlyZWQgPSB2YWxpZGF0aW9uICYmIHZhbGlkYXRpb24ucmVxdWlyZWQ7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGNvbnN0IGVsVGFnID0gdGhpcy5uYXRpdmVFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGVsVGFnID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgICAgICB0aGlzLmlzVGV4dEFyZWEgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0lucHV0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzQ2hhbmdlcyQgPSB0aGlzLm5nQ29udHJvbC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSh0aGlzLm9uU3RhdHVzQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdGF0dXNDaGFuZ2VzJCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzQ2hhbmdlcyQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgZm9jdXMgb24gdGhlIGlneElucHV0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmlneElucHV0LmZvY3VzKCk7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgcHVibGljIGZvY3VzKCkge1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYG5hdGl2ZUVsZW1lbnRgIG9mIHRoZSBpZ3hJbnB1dC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlneElucHV0TmF0aXZlRWxlbWVudCA9IHRoaXMuaWd4SW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5hdGl2ZUVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uU3RhdHVzQ2hhbmdlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yIHx8IHRoaXMubmdDb250cm9sLmNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5nQ29udHJvbC5jb250cm9sLnRvdWNoZWQgfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5kaXJ0eSkge1xuICAgICAgICAgICAgICAgIC8vICBUT0RPOiBjaGVjayB0aGUgbG9naWMgd2hlbiBjb250cm9sIGlzIHRvdWNoZWQgb3IgZGlydHlcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dEdyb3VwLmlzRm9jdXNlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBpcyBzdGlsbCB0eXBpbmcgaW4gdGhlIGNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsaWQgPSB0aGlzLm5nQ29udHJvbC52YWxpZCA/IElneElucHV0U3RhdGUuVkFMSUQgOiBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgaGFkIHRvdWNoZWQgdGhlIGNvbnRyb2wgcHJldmlvdXNseSBidXQgbm93IHRoZSB2YWx1ZSBpcyBjaGFuZ2luZyBkdWUgdG8gY2hhbmdlcyBpbiB0aGUgZm9ybVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWxpZCA9IHRoaXMubmdDb250cm9sLnZhbGlkID8gSWd4SW5wdXRTdGF0ZS5JTklUSUFMIDogSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gIGlmIGNvbnRyb2wgaXMgdW50b3VjaGVkIGFuZCBwcmlzdGluZSBpdHMgc3RhdGUgaXMgaW5pdGlhbC4gVGhpcyBpcyB3aGVuIHVzZXIgZGlkIG5vdCBpbnRlcmFjdFxuICAgICAgICAgICAgICAgIC8vICB3aXRoIHRoZSBpbnB1dCBvciB3aGVuIGZvcm0vY29udHJvbCBpcyByZXNldFxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTklUSUFMO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgaWd4SW5wdXQgaGFzIGEgcGxhY2Vob2xkZXIuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBoYXNQbGFjZWhvbGRlciA9IHRoaXMuaWd4SW5wdXQuaGFzUGxhY2Vob2xkZXI7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNQbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBsYWNlaG9sZGVyIGVsZW1lbnQgb2YgdGhlIGlneElucHV0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaWd4SW5wdXRQbGFjZWhvbGRlciA9IHRoaXMuaWd4SW5wdXQucGxhY2Vob2xkZXI7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudC5wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYXNWYWxpZGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IG5hdGl2ZVZhbGlkYXRpb25BdHRyaWJ1dGUgb2YgbmF0aXZlVmFsaWRhdGlvbkF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKG5hdGl2ZVZhbGlkYXRpb25BdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISF0aGlzLm5nQ29udHJvbCAmJiAoISF0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvciB8fCAhIXRoaXMubmdDb250cm9sLmNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIGlneElucHV0IGlzIGZvY3VzZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0ZvY3VzZWQgPSB0aGlzLmlneElucHV0LmZvY3VzZWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgcHVibGljIGdldCBmb2N1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dEdyb3VwLmlzRm9jdXNlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3RhdGUgb2YgdGhlIGlneElucHV0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaWd4SW5wdXRTdGF0ZSA9IHRoaXMuaWd4SW5wdXQudmFsaWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWxpZCgpOiBJZ3hJbnB1dFN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgaWd4SW5wdXQgaXMgdmFsaWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB2YWxpZCA9IHRoaXMuaWd4SW5wdXQuaXNWYWxpZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkICE9PSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGlneElucHV0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmlneElucHV0LnZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdmFsaWQodmFsdWU6IElneElucHV0U3RhdGUpIHtcbiAgICAgICAgdGhpcy5fdmFsaWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrVmFsaWRpdHkoKSB7XG4gICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wgJiYgdGhpcy5faGFzVmFsaWRhdG9ycygpKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZCA9IHRoaXMubmF0aXZlRWxlbWVudC5jaGVja1ZhbGlkaXR5KCkgPyBJZ3hJbnB1dFN0YXRlLlZBTElEIDogSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19