UNPKG

@catull/igniteui-angular

Version:

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

461 lines 40.5 kB
var IgxInputGroupComponent_1; import { __decorate, __metadata, __param } from "tslib"; import { CommonModule } from '@angular/common'; import { Component, ContentChild, ContentChildren, ElementRef, HostBinding, HostListener, Input, NgModule, QueryList, Inject, Optional } from '@angular/core'; import { IgxHintDirective } from '../directives/hint/hint.directive'; import { IgxInputDirective, IgxInputState } from '../directives/input/input.directive'; import { IgxLabelDirective } from '../directives/label/label.directive'; import { IgxPrefixModule } from '../directives/prefix/prefix.directive'; import { IgxSuffixModule } from '../directives/suffix/suffix.directive'; import { DisplayDensity, DisplayDensityToken, DisplayDensityBase } from '../core/displayDensity'; import { IgxInputGroupBase } from './input-group.common'; let NEXT_ID = 0; var IgxInputGroupType; (function (IgxInputGroupType) { IgxInputGroupType[IgxInputGroupType["LINE"] = 0] = "LINE"; IgxInputGroupType[IgxInputGroupType["BOX"] = 1] = "BOX"; IgxInputGroupType[IgxInputGroupType["BORDER"] = 2] = "BORDER"; IgxInputGroupType[IgxInputGroupType["FLUENT"] = 3] = "FLUENT"; IgxInputGroupType[IgxInputGroupType["SEARCH"] = 4] = "SEARCH"; IgxInputGroupType[IgxInputGroupType["FLUENT_SEARCH"] = 5] = "FLUENT_SEARCH"; })(IgxInputGroupType || (IgxInputGroupType = {})); let IgxInputGroupComponent = IgxInputGroupComponent_1 = class IgxInputGroupComponent extends DisplayDensityBase { constructor(_element, _displayDensityOptions) { super(_displayDensityOptions); this._element = _element; this._displayDensityOptions = _displayDensityOptions; this._type = IgxInputGroupType.LINE; this._filled = false; this._supressInputAutofocus = false; /** * An @Input property that sets the value of `id` attribute. If not provided it will be automatically generated. * ```html * <igx-input-group [id]="'igx-input-group-55'"></igx-input-group> * ``` */ this.id = `igx-input-group-${NEXT_ID++}`; /** * Property that enables/disables the autogenerated class of the `IgxInputGroupComponent`. * By default applied the class is applied. *```typescript *@ViewChild("MyInputGroup") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ *this.inputGroup.defaultClass = false; *``` *} */ this.defaultClass = true; /** * @hidden */ this.hasPlaceholder = false; /** * @hidden */ this.isRequired = false; /** * @hidden */ this.isFocused = false; /** * @hidden */ this.isBox = false; /** * @hidden */ this.isBorder = false; /** * @hidden */ this.isSearch = false; /** * @hidden */ this.isFluentSearch = false; /** * @hidden */ this.isFluent = false; /** * An @Input property that disables the `IgxInputGroupComponent`. * ```html * <igx-input-group [disabled]="'true'"></igx-input-group> * ``` */ this.disabled = false; /** * @hidden */ this.hasWarning = false; this.element = _element; } /** * @hidden */ get validClass() { return this.input.valid === IgxInputState.VALID; } /** * @hidden */ get invalidClass() { return this.input.valid === IgxInputState.INVALID; } /** *@hidden */ onClick(event) { if (!this._supressInputAutofocus) { this.input.focus(); } } /** * An @Input property that sets how the input will be styled. * The allowed values are `line`, `box`, `border`, `fluent`, `search` and `fluentSearch`. The default is `line`. * ```html *<igx-input-group [type]="'search'"> * ``` */ set type(value) { const type = IgxInputGroupType[value.toUpperCase()]; if (type !== undefined) { this.isBox = this.isFluent = this.isFluentSearch = this.isBorder = this.isSearch = false; switch (type) { case IgxInputGroupType.BOX: this.isBox = true; break; case IgxInputGroupType.BORDER: this.isBorder = true; break; case IgxInputGroupType.FLUENT: this.isFluent = true; break; case IgxInputGroupType.FLUENT_SEARCH: this.isFluentSearch = true; break; case IgxInputGroupType.SEARCH: this.isSearch = true; break; default: break; } this._type = type; } } /** * Returns whether the input element of the input group will be automatically focused on click. * ```typescript * let supressInputAutofocus = this.inputGroup.supressInputAutofocus; * ``` */ get supressInputAutofocus() { return this._supressInputAutofocus; } /** * Sets whether the input element of the input group will be automatically focused on click. * ```html * <igx-input-group [supressInputAutofocus]="true"></igx-input-group> * ``` */ set supressInputAutofocus(value) { this._supressInputAutofocus = value; } /** *@hidden */ get isFilled() { return this._filled || (this.input && this.input.value); } /** *@hidden */ get isDisplayDensityCosy() { return this.displayDensity === DisplayDensity.cosy; } /** *@hidden */ get isDisplayDensityComfortable() { return this.displayDensity === DisplayDensity.comfortable; } /** *@hidden */ get isDisplayDensityCompact() { return this.displayDensity === DisplayDensity.compact; } /** * Returns the type of the `IgxInputGroupComponent`. How the input is styled. * Values are `line` - 0, `box` - 1, `border` - 2, `fluent` - 3 `fluentSearch` - 4 and `search` - 5. The default is `line`. * ```typescript *@ViewChild("MyInputGroup") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let inputType = this.inputGroup.type; *} * ``` */ get type() { return this._type.toString(); } /** * Returns whether the `IgxInputGroupComponent` has hints. * ```typescript *@ViewChild("MyInputGroup") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let inputHints = this.inputGroup.hasHints; *} * ``` */ get hasHints() { return this.hints.length > 0; } /** * Returns whether the `IgxInputGroupComponent` has border. * ```typescript *@ViewChild("MyInputGroup") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let inputBroder = this.inputGroup.hasBorder; *} * ``` */ get hasBorder() { return this._type === IgxInputGroupType.LINE || this._type === IgxInputGroupType.BOX; } /** * Returns whether the `IgxInputGroupComponent` type is line. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeLine = this.inputGroup.isTypeLine; *} * ``` */ get isTypeLine() { return this._type === IgxInputGroupType.LINE; } /** * Returns whether the `IgxInputGroupComponent` type is box. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeBox = this.inputGroup.isTypeBox; *} *``` */ get isTypeBox() { return this._type === IgxInputGroupType.BOX; } /** * Returns whether the `IgxInputGroupComponent` type is border. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeBorder = this.inputGroup.isTypeBorder; *} * ``` */ get isTypeBorder() { return this._type === IgxInputGroupType.BORDER; } /** * Returns whether the `IgxInputGroupComponent` type is Fluent. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeFluent = this.inputGroup.isTypeFluent; *} * ``` */ get isTypeFluent() { return this._type === IgxInputGroupType.FLUENT; } /** * Returns whether the `IgxInputGroupComponent` type is search. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeSearch = this.inputGroup.isTypeSearch; *} * ``` */ get isTypeSearch() { return this._type === IgxInputGroupType.SEARCH; } /** * Returns whether the `IgxInputGroupComponent` type is fluentSearch. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeFluentSearch = this.inputGroup.isTypeFluentSearch; *} * ``` */ get isTypeFluentSearch() { return this._type === IgxInputGroupType.FLUENT_SEARCH; } get filled() { return this._filled; } set filled(val) { this._filled = val; } }; IgxInputGroupComponent.ctorParameters = () => [ { type: ElementRef }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] } ]; __decorate([ HostBinding('attr.id'), Input(), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "id", void 0); __decorate([ HostBinding('class.igx-input-group'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "defaultClass", void 0); __decorate([ HostBinding('class.igx-input-group--placeholder'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "hasPlaceholder", void 0); __decorate([ HostBinding('class.igx-input-group--required'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isRequired", void 0); __decorate([ HostBinding('class.igx-input-group--focused'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isFocused", void 0); __decorate([ HostBinding('class.igx-input-group--box'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isBox", void 0); __decorate([ HostBinding('class.igx-input-group--border'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isBorder", void 0); __decorate([ HostBinding('class.igx-input-group--search'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isSearch", void 0); __decorate([ HostBinding('class.igx-input-group--fluent-search'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isFluentSearch", void 0); __decorate([ HostBinding('class.igx-input-group--fluent'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isFluent", void 0); __decorate([ HostBinding('class.igx-input-group--disabled'), Input(), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "disabled", void 0); __decorate([ HostBinding('class.igx-input-group--valid'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxInputGroupComponent.prototype, "validClass", null); __decorate([ HostBinding('class.igx-input-group--invalid'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxInputGroupComponent.prototype, "invalidClass", null); __decorate([ HostBinding('class.igx-input-group--warning'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "hasWarning", void 0); __decorate([ ContentChildren(IgxHintDirective, { read: IgxHintDirective }), __metadata("design:type", QueryList) ], IgxInputGroupComponent.prototype, "hints", void 0); __decorate([ ContentChild(IgxInputDirective, { read: IgxInputDirective, static: true }), __metadata("design:type", IgxInputDirective) ], IgxInputGroupComponent.prototype, "input", void 0); __decorate([ HostListener('click', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxInputGroupComponent.prototype, "onClick", null); __decorate([ Input('type'), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], IgxInputGroupComponent.prototype, "type", null); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxInputGroupComponent.prototype, "supressInputAutofocus", null); __decorate([ HostBinding('class.igx-input-group--filled'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxInputGroupComponent.prototype, "isFilled", null); __decorate([ HostBinding('class.igx-input-group--cosy'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxInputGroupComponent.prototype, "isDisplayDensityCosy", null); __decorate([ HostBinding('class.igx-input-group--comfortable'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxInputGroupComponent.prototype, "isDisplayDensityComfortable", null); __decorate([ HostBinding('class.igx-input-group--compact'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxInputGroupComponent.prototype, "isDisplayDensityCompact", null); IgxInputGroupComponent = IgxInputGroupComponent_1 = __decorate([ Component({ selector: 'igx-input-group', template: "<div class=\"igx-input-group__wrapper\" *ngIf=\"isTypeBox; else bundle\">\n <ng-container *ngTemplateOutlet=\"bundle\"></ng-container>\n</div>\n\n<div class=\"igx-input-group__hint\">\n <ng-content select=\"igx-hint,[igxHint]\"></ng-content>\n</div>\n\n<ng-template #material>\n <ng-content select=\"[igxLabel]\"></ng-content>\n</ng-template>\n\n<ng-template #bundle>\n\n<!-- <ng-content *ngIf=\"isTypeFluent\" select=\"[igxLabel]\"></ng-content>-->\n <ng-container *ngIf=\"isTypeFluent\">\n <ng-container *ngTemplateOutlet=\"material\"></ng-container>\n </ng-container>\n\n <div class=\"igx-input-group__bundle\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n <div class=\"igx-input-group__bundle-main\">\n\n <ng-container *ngIf=\"!isTypeFluent\">\n <ng-container *ngTemplateOutlet=\"material\"></ng-container>\n </ng-container>\n<!-- <ng-content *ngIf=\"!isTypeFluent\" select=\"[igxLabel]\"></ng-content>-->\n\n <ng-content select=\"[igxInput]\"></ng-content>\n </div>\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </div>\n <div class=\"igx-input-group__border\" *ngIf=\"hasBorder\"></div>\n</ng-template>\n", providers: [{ provide: IgxInputGroupBase, useExisting: IgxInputGroupComponent_1 }] }), __param(1, Optional()), __param(1, Inject(DisplayDensityToken)), __metadata("design:paramtypes", [ElementRef, Object]) ], IgxInputGroupComponent); export { IgxInputGroupComponent }; /** * @hidden */ let IgxInputGroupModule = class IgxInputGroupModule { }; IgxInputGroupModule = __decorate([ NgModule({ declarations: [ IgxInputGroupComponent, IgxHintDirective, IgxInputDirective, IgxLabelDirective ], exports: [ IgxInputGroupComponent, IgxHintDirective, IgxInputDirective, IgxLabelDirective, IgxPrefixModule, IgxSuffixModule ], imports: [ CommonModule, IgxPrefixModule, IgxSuffixModule ] }) ], IgxInputGroupModule); export { IgxInputGroupModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3hFLE9BQU8sRUFBc0IsZUFBZSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDM0YsT0FBTyxFQUFzQixlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RixPQUFPLEVBQUUsY0FBYyxFQUEwQixtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXpELElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztBQUVoQixJQUFLLGlCQU9KO0FBUEQsV0FBSyxpQkFBaUI7SUFDbEIseURBQUksQ0FBQTtJQUNKLHVEQUFHLENBQUE7SUFDSCw2REFBTSxDQUFBO0lBQ04sNkRBQU0sQ0FBQTtJQUNOLDZEQUFNLENBQUE7SUFDTiwyRUFBYSxDQUFBO0FBQ2pCLENBQUMsRUFQSSxpQkFBaUIsS0FBakIsaUJBQWlCLFFBT3JCO0FB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RzFDO0FBTUQ7SUFEQyxXQUFXLENBQUMsb0NBQW9DLENBQUM7Ozt5RUFHakQ7QUFNRDtJQURDLFdBQVcsQ0FBQyxnQ0FBZ0MsQ0FBQzs7O3FFQUc3QztBQS9OUSxzQkFBc0I7SUFMbEMsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGlCQUFpQjtRQUMzQiwyd0NBQXlDO1FBQ3pDLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSx3QkFBc0IsRUFBRSxDQUFDO0tBQ25GLENBQUM7SUFrUE8sV0FBQSxRQUFRLEVBQUUsQ0FBQSxFQUFFLFdBQUEsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUE7cUNBRGQsVUFBVTtHQWhQL0Isc0JBQXNCLENBOFdsQztTQTlXWSxzQkFBc0I7QUFnWG5DOztHQUVHO0FBc0JILElBQWEsbUJBQW1CLEdBQWhDLE1BQWEsbUJBQW1CO0NBQUksQ0FBQTtBQUF2QixtQkFBbUI7SUFyQi9CLFFBQVEsQ0FBQztRQUNOLFlBQVksRUFBRTtZQUNWLHNCQUFzQjtZQUN0QixnQkFBZ0I7WUFDaEIsaUJBQWlCO1lBQ2pCLGlCQUFpQjtTQUNwQjtRQUNELE9BQU8sRUFBRTtZQUNMLHNCQUFzQjtZQUN0QixnQkFBZ0I7WUFDaEIsaUJBQWlCO1lBQ2pCLGlCQUFpQjtZQUNqQixlQUFlO1lBQ2YsZUFBZTtTQUNsQjtRQUNELE9BQU8sRUFBRTtZQUNMLFlBQVk7WUFDWixlQUFlO1lBQ2YsZUFBZTtTQUNsQjtLQUNKLENBQUM7R0FDVyxtQkFBbUIsQ0FBSTtTQUF2QixtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBRdWVyeUxpc3QsXG4gICAgSW5qZWN0LFxuICAgIE9wdGlvbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4SGludERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvaGludC9oaW50LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJbnB1dERpcmVjdGl2ZSwgSWd4SW5wdXRTdGF0ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvaW5wdXQvaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneExhYmVsRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9sYWJlbC9sYWJlbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4UHJlZml4RGlyZWN0aXZlLCBJZ3hQcmVmaXhNb2R1bGV9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcHJlZml4L3ByZWZpeC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4U3VmZml4RGlyZWN0aXZlLCBJZ3hTdWZmaXhNb2R1bGUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3N1ZmZpeC9zdWZmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IERpc3BsYXlEZW5zaXR5LCBJRGlzcGxheURlbnNpdHlPcHRpb25zLCBEaXNwbGF5RGVuc2l0eVRva2VuLCBEaXNwbGF5RGVuc2l0eUJhc2UgfSBmcm9tICcuLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IElneElucHV0R3JvdXBCYXNlIH0gZnJvbSAnLi9pbnB1dC1ncm91cC5jb21tb24nO1xuXG5sZXQgTkVYVF9JRCA9IDA7XG5cbmVudW0gSWd4SW5wdXRHcm91cFR5cGUge1xuICAgIExJTkUsXG4gICAgQk9YLFxuICAgIEJPUkRFUixcbiAgICBGTFVFTlQsXG4gICAgU0VBUkNILFxuICAgIEZMVUVOVF9TRUFSQ0gsXG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LWlucHV0LWdyb3VwJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2lucHV0LWdyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IElneElucHV0R3JvdXBCYXNlLCB1c2VFeGlzdGluZzogSWd4SW5wdXRHcm91cENvbXBvbmVudCB9XVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50IGV4dGVuZHMgRGlzcGxheURlbnNpdHlCYXNlIGltcGxlbWVudHMgSWd4SW5wdXRHcm91cEJhc2Uge1xuICAgIHByaXZhdGUgX3R5cGUgPSBJZ3hJbnB1dEdyb3VwVHlwZS5MSU5FO1xuICAgIHByaXZhdGUgX2ZpbGxlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3N1cHJlc3NJbnB1dEF1dG9mb2N1cyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQW4gRWxlbWVudFJlZiBwcm9wZXJ0eSBvZiB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgLlxuICAgICAqL1xuICAgIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgYGlkYCBhdHRyaWJ1dGUuIElmIG5vdCBwcm92aWRlZCBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWlucHV0LWdyb3VwIFtpZF09XCInaWd4LWlucHV0LWdyb3VwLTU1J1wiPjwvaWd4LWlucHV0LWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgaWd4LWlucHV0LWdyb3VwLSR7TkVYVF9JRCsrfWA7XG5cbiAgICAvKipcbiAgICAgKiBQcm9wZXJ0eSB0aGF0IGVuYWJsZXMvZGlzYWJsZXMgdGhlIGF1dG9nZW5lcmF0ZWQgY2xhc3Mgb2YgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YC5cbiAgICAgKiBCeSBkZWZhdWx0IGFwcGxpZWQgdGhlIGNsYXNzIGlzIGFwcGxpZWQuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlJbnB1dEdyb3VwXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqdGhpcy5pbnB1dEdyb3VwLmRlZmF1bHRDbGFzcyA9IGZhbHNlO1xuICAgICAqYGBgXG4gICAgICp9XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAnKVxuICAgIHB1YmxpYyBkZWZhdWx0Q2xhc3MgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1wbGFjZWhvbGRlcicpXG4gICAgcHVibGljIGhhc1BsYWNlaG9sZGVyID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLXJlcXVpcmVkJylcbiAgICBwdWJsaWMgaXNSZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1mb2N1c2VkJylcbiAgICBwdWJsaWMgaXNGb2N1c2VkID0gZmFsc2U7XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tYm94JylcbiAgICBwdWJsaWMgaXNCb3ggPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tYm9yZGVyJylcbiAgICBwdWJsaWMgaXNCb3JkZXIgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tc2VhcmNoJylcbiAgICBwdWJsaWMgaXNTZWFyY2ggPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tZmx1ZW50LXNlYXJjaCcpXG4gICAgcHVibGljIGlzRmx1ZW50U2VhcmNoID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWZsdWVudCcpXG4gICAgcHVibGljIGlzRmx1ZW50ID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBkaXNhYmxlcyB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWlucHV0LWdyb3VwIFtkaXNhYmxlZF09XCIndHJ1ZSdcIj48L2lneC1pbnB1dC1ncm91cD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tZGlzYWJsZWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLXZhbGlkJylcbiAgICBwdWJsaWMgZ2V0IHZhbGlkQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0LnZhbGlkID09PSBJZ3hJbnB1dFN0YXRlLlZBTElEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0taW52YWxpZCcpXG4gICAgcHVibGljIGdldCBpbnZhbGlkQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0LnZhbGlkID09PSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS13YXJuaW5nJylcbiAgICBwdWJsaWMgaGFzV2FybmluZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4SGludERpcmVjdGl2ZSwgeyByZWFkOiBJZ3hIaW50RGlyZWN0aXZlIH0pXG4gICAgcHJvdGVjdGVkIGhpbnRzOiBRdWVyeUxpc3Q8SWd4SGludERpcmVjdGl2ZT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hJbnB1dERpcmVjdGl2ZSwgeyByZWFkOiBJZ3hJbnB1dERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGlucHV0OiBJZ3hJbnB1dERpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25DbGljayhldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX3N1cHJlc3NJbnB1dEF1dG9mb2N1cykge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyBob3cgdGhlIGlucHV0IHdpbGwgYmUgc3R5bGVkLlxuICAgICAqIFRoZSBhbGxvd2VkIHZhbHVlcyBhcmUgYGxpbmVgLCBgYm94YCwgYGJvcmRlcmAsIGBmbHVlbnRgLCBgc2VhcmNoYCBhbmQgYGZsdWVudFNlYXJjaGAuIFRoZSBkZWZhdWx0IGlzIGBsaW5lYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICo8aWd4LWlucHV0LWdyb3VwIFt0eXBlXT1cIidzZWFyY2gnXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KCd0eXBlJylcbiAgICBzZXQgdHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHR5cGU6IElneElucHV0R3JvdXBUeXBlID0gKElneElucHV0R3JvdXBUeXBlIGFzIGFueSlbdmFsdWUudG9VcHBlckNhc2UoKV07XG4gICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNCb3ggPSB0aGlzLmlzRmx1ZW50ID0gdGhpcy5pc0ZsdWVudFNlYXJjaCA9IHRoaXMuaXNCb3JkZXIgPSB0aGlzLmlzU2VhcmNoID0gZmFsc2U7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIElneElucHV0R3JvdXBUeXBlLkJPWDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0JveCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSWd4SW5wdXRHcm91cFR5cGUuQk9SREVSOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9yZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBJZ3hJbnB1dEdyb3VwVHlwZS5GTFVFTlQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNGbHVlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIElneElucHV0R3JvdXBUeXBlLkZMVUVOVF9TRUFSQ0g6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNGbHVlbnRTZWFyY2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIElneElucHV0R3JvdXBUeXBlLlNFQVJDSDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NlYXJjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaW5wdXQgZWxlbWVudCBvZiB0aGUgaW5wdXQgZ3JvdXAgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZvY3VzZWQgb24gY2xpY2suXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzdXByZXNzSW5wdXRBdXRvZm9jdXMgPSB0aGlzLmlucHV0R3JvdXAuc3VwcmVzc0lucHV0QXV0b2ZvY3VzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdXByZXNzSW5wdXRBdXRvZm9jdXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdXByZXNzSW5wdXRBdXRvZm9jdXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSBpbnB1dCBlbGVtZW50IG9mIHRoZSBpbnB1dCBncm91cCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZm9jdXNlZCBvbiBjbGljay5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1pbnB1dC1ncm91cCBbc3VwcmVzc0lucHV0QXV0b2ZvY3VzXT1cInRydWVcIj48L2lneC1pbnB1dC1ncm91cD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHN1cHJlc3NJbnB1dEF1dG9mb2N1cyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9zdXByZXNzSW5wdXRBdXRvZm9jdXMgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tZmlsbGVkJylcbiAgICBnZXQgaXNGaWxsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxsZWQgfHwgKHRoaXMuaW5wdXQgJiYgdGhpcy5pbnB1dC52YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWNvc3knKVxuICAgIGdldCBpc0Rpc3BsYXlEZW5zaXR5Q29zeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvc3k7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWNvbWZvcnRhYmxlJylcbiAgICBnZXQgaXNEaXNwbGF5RGVuc2l0eUNvbWZvcnRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29tZm9ydGFibGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWNvbXBhY3QnKVxuICAgIGdldCBpc0Rpc3BsYXlEZW5zaXR5Q29tcGFjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvbXBhY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgLiBIb3cgdGhlIGlucHV0IGlzIHN0eWxlZC5cbiAgICAgKiBWYWx1ZXMgYXJlIGBsaW5lYCAtIDAsIGBib3hgIC0gMSwgYGJvcmRlcmAgLSAyLCAgYGZsdWVudGAgLSAzIGBmbHVlbnRTZWFyY2hgIC0gNCBhbmQgYHNlYXJjaGAgLSA1LiBUaGUgZGVmYXVsdCBpcyBgbGluZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cFwiKVxuICAgICAqcHVibGljIGlucHV0R3JvdXA6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgICpuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICBsZXQgaW5wdXRUeXBlID0gdGhpcy5pbnB1dEdyb3VwLnR5cGU7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEaXNwbGF5RGVuc2l0eVRva2VuKSBwcml2YXRlIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM6IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoX2Rpc3BsYXlEZW5zaXR5T3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IF9lbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgIGhhcyBoaW50cy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlJbnB1dEdyb3VwXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpbnB1dEhpbnRzID0gdGhpcy5pbnB1dEdyb3VwLmhhc0hpbnRzO1xuICAgICAqfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBoYXNIaW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGludHMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YCBoYXMgYm9yZGVyLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXBcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlucHV0QnJvZGVyID0gdGhpcy5pbnB1dEdyb3VwLmhhc0JvcmRlcjtcbiAgICAgKn1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgaGFzQm9yZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZSA9PT0gSWd4SW5wdXRHcm91cFR5cGUuTElORSB8fFxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9PT0gSWd4SW5wdXRHcm91cFR5cGUuQk9YO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgIHR5cGUgaXMgbGluZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlJbnB1dEdyb3VwMVwiKVxuICAgICAqcHVibGljIGlucHV0R3JvdXA6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgICpuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICBsZXQgaXNUeXBlTGluZSA9IHRoaXMuaW5wdXRHcm91cC5pc1R5cGVMaW5lO1xuICAgICAqfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNUeXBlTGluZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5MSU5FO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgIHR5cGUgaXMgYm94LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXAxXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpc1R5cGVCb3ggPSB0aGlzLmlucHV0R3JvdXAuaXNUeXBlQm94O1xuICAgICAqfVxuICAgICAqYGBgXG4gICAgICovXG4gICAgZ2V0IGlzVHlwZUJveCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGUgPT09IElneElucHV0R3JvdXBUeXBlLkJPWDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YCB0eXBlIGlzIGJvcmRlci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlJbnB1dEdyb3VwMVwiKVxuICAgICAqcHVibGljIGlucHV0R3JvdXA6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgICpuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICBsZXQgaXNUeXBlQm9yZGVyID0gdGhpcy5pbnB1dEdyb3VwLmlzVHlwZUJvcmRlcjtcbiAgICAgKn1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgaXNUeXBlQm9yZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZSA9PT0gSWd4SW5wdXRHcm91cFR5cGUuQk9SREVSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgIHR5cGUgaXMgRmx1ZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXAxXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpc1R5cGVGbHVlbnQgPSB0aGlzLmlucHV0R3JvdXAuaXNUeXBlRmx1ZW50O1xuICAgICAqfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBpc1R5cGVGbHVlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5GTFVFTlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgdHlwZSBpcyBzZWFyY2guXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cDFcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlzVHlwZVNlYXJjaCA9IHRoaXMuaW5wdXRHcm91cC5pc1R5cGVTZWFyY2g7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGlzVHlwZVNlYXJjaCgpIHtcbiAgICAgICAgcmV0dXJuICB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5TRUFSQ0g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgdHlwZSBpcyBmbHVlbnRTZWFyY2guXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cDFcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlzVHlwZUZsdWVudFNlYXJjaCA9IHRoaXMuaW5wdXRHcm91cC5pc1R5cGVGbHVlbnRTZWFyY2g7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGlzVHlwZUZsdWVudFNlYXJjaCgpIHtcbiAgICAgICAgcmV0dXJuICB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5GTFVFTlRfU0VBUkNIO1xuICAgIH1cblxuICAgIGdldCBmaWxsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxsZWQ7XG4gICAgfVxuXG4gICAgc2V0IGZpbGxlZCh2YWwpIHtcbiAgICAgICAgdGhpcy5fZmlsbGVkID0gdmFsO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbXG4gICAgICAgIElneElucHV0R3JvdXBDb21wb25lbnQsXG4gICAgICAgIElneEhpbnREaXJlY3RpdmUsXG4gICAgICAgIElneElucHV0RGlyZWN0aXZlLFxuICAgICAgICBJZ3hMYWJlbERpcmVjdGl2ZVxuICAgIF0sXG4gICAgZXhwb3J0czogW1xuICAgICAgICBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LFxuICAgICAgICBJZ3hIaW50RGlyZWN0aXZlLFxuICAgICAgICBJZ3hJbnB1dERpcmVjdGl2ZSxcbiAgICAgICAgSWd4TGFiZWxEaXJlY3RpdmUsXG4gICAgICAgIElneFByZWZpeE1vZHVsZSxcbiAgICAgICAgSWd4U3VmZml4TW9kdWxlXG4gICAgXSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgSWd4UHJlZml4TW9kdWxlLFxuICAgICAgICBJZ3hTdWZmaXhNb2R1bGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIElneElucHV0R3JvdXBNb2R1bGUgeyB9XG4iXX0=