@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
461 lines • 40.5 kB
JavaScript
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=