@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
386 lines • 33.4 kB
JavaScript
var IgxSwitchComponent_1;
import { __decorate, __metadata } from "tslib";
import { Component, Directive, EventEmitter, forwardRef, HostBinding, Input, NgModule, Output, ViewChild, ElementRef } from '@angular/core';
import { CheckboxRequiredValidator, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
import { IgxRippleModule } from '../directives/ripple/ripple.directive';
import { isIE } from '../core/utils';
export var SwitchLabelPosition;
(function (SwitchLabelPosition) {
SwitchLabelPosition["BEFORE"] = "before";
SwitchLabelPosition["AFTER"] = "after";
})(SwitchLabelPosition || (SwitchLabelPosition = {}));
const noop = () => { };
const ɵ0 = noop;
let nextId = 0;
/**
* **Ignite UI for Angular Switch** -
* [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/switch.html)
*
* The Ignite UI Switch lets the user toggle between on/off or true/false states.
*
* Example:
* ```html
* <igx-switch [checked]="true">
* Simple switch
* </igx-switch>
* ```
*/
let IgxSwitchComponent = IgxSwitchComponent_1 = class IgxSwitchComponent {
constructor() {
/**
* Sets/gets the `id` of the switch component.
* If not set, the `id` of the first switch component will be `"igx-switch-0"`.
* ```html
* <igx-switch id="my-first-switch"></igx-switch>
* ```
* ```typescript
* let switchId = this.switch.id;
* ```
* @memberof IgxSwitchComponent
*/
this.id = `igx-switch-${nextId++}`;
/**
* Sets/gets the id of the `label` element in the switch component.
* If not set, the label of the first switch component will have value `"igx-switch-0-label"`.
* ```html
* <igx-switch labelId="Label1"></igx-switch>
* ```
* ```typescript
* let labelId = this.switch.labelId;
* ```
* @memberof IgxSwitchComponent
*/
this.labelId = `${this.id}-label`;
/**
* Sets/gets the value of the `tabindex` attribute.
* ```html
* <igx-switch [tabindex]="1"></igx-switch>
* ```
* ```typescript
* let tabIndex = this.switch.tabindex;
* ```
* @memberof IgxSwitchComponent
*/
this.tabindex = null;
/**
* Sets/gets the position of the `label` in the switch component.
* If not set, `labelPosition` will have value `"after"`.
* ```html
* <igx-switch labelPosition="before"></igx-switch>
* ```
* ```typescript
* let labelPosition = this.switch.labelPosition;
* ```
* @memberof IgxSwitchComponent
*/
this.labelPosition = 'after';
/**
* Enables/Disables the ripple effect
* If not set, `disableRipple` will have value `false`.
* ```html
* <igx-switch [disableRipple]="true"></igx-switch>
* ```
* ```typescript
* let isRippleDisabled = this.switch.disableRipple;
* ```
* @memberof IgxSwitchComponent
*/
this.disableRipple = false;
/**
* Sets/gets whether switch is required.
* If not set, `required` will have value `false`.
* ```html
* <igx-switch [required]="true"></igx-switch>
* ```
* ```typescript
* let isRequired = this.switch.required;
* ```
* @memberof IgxSwitchComponent
*/
this.required = false;
/**
* Sets/gets the `aria-labelledBy` attribute.
* If not set, the value of `aria-labelledBy` will be equal to the value of `labelId` attribute.
* ```html
* <igx-switch aria-labelledby = "Label1"></igx-switch>
* ```
* ```typescript
* let ariaLabelledBy = this.switch.ariaLabelledBy;
* ```
* @memberof IgxSwitchComponent
*/
this.ariaLabelledBy = this.labelId;
/**
* Sets/gets the value of the `aria-label` attribute.
* ```html
* <igx-switch aria-label="Label1"></igx-switch>
* ```
* ```typescript
* let ariaLabel = this.switch.ariaLabel;
* ```
* @memberof IgxSwitchComponent
*/
this.ariaLabel = null;
/**
* An event that is emitted after the switch state is changed.
* Provides references to the `IgxSwitchComponent` and the `checked` property as event arguments.
* @memberof IgxSwitchComponent
*/
this.change = new EventEmitter();
/**
*@hidden
* @memberof IgxSwitchComponent
*/
this._onTouchedCallback = noop;
/**
*@hidden
* @memberof IgxSwitchComponent
*/
this._onChangeCallback = noop;
/**
* Returns the class of the switch component.
* ```typescript
* let switchClass = this.switch.cssClass;
* ```
* @memberof IgxSwitchComponent
*/
this.cssClass = 'igx-switch';
/**
* Sets/gets whether the switch is on or off.
* Default value is 'false'.
* ```html
* <igx-switch [checked] = "true"></igx-switch>
* ```
* ```typescript
* let isChecked = this.switch.checked;
* ```
* @memberof IgxSwitchComponent
*/
this.checked = false;
/**
* Sets/gets the `disabled` attribute.
* Default value is `false`.
* ```html
* <igx-switch [disabled] = "true"><igx-switch>
* ```
* ```typescript
* let isDisabled = this.switch.disabled;
* ```
* @memberof IgxSwitchComponent
*/
this.disabled = false;
/**
* Sets/gets whether the switch component is on focus.
* Default value is `false`.
* ```typescript
* this.switch.focused = true;
* ```
* ```typescript
* let isFocused = this.switch.focused;
* ```
* @memberof IgxSwitchComponent
*/
this.focused = false;
/**
*@hidden
*/
this.inputId = `${this.id}-input`;
}
/**
* Toggles the checked state of the switch.
* ```typescript
* this.switch.toggle();
* ```
* @memberof IgxSwitchComponent
*/
toggle() {
if (this.disabled) {
return;
}
this.checked = !this.checked;
this.focused = false;
this.change.emit({ checked: this.checked, switch: this });
this._onChangeCallback(this.checked);
}
/**
*@hidden
*/
_onSwitchChange(event) {
event.stopPropagation();
}
/**
*@hidden
*/
_onSwitchClick(event) {
event.stopPropagation();
this.toggle();
if (isIE()) {
this.nativeCheckbox.nativeElement.blur();
}
}
/**
*@hidden
*/
_onLabelClick(event) {
this.toggle();
}
/**
*@hidden
*/
onFocus(event) {
this.focused = true;
}
/**
*@hidden
*/
onBlur(event) {
this.focused = false;
this._onTouchedCallback();
}
/**
*@hidden
*/
writeValue(value) {
this._value = value;
this.checked = !!this._value;
}
/** @hidden */
getEditElement() {
return this.nativeCheckbox.nativeElement;
}
/**
*@hidden
*/
get labelClass() {
switch (this.labelPosition) {
case SwitchLabelPosition.BEFORE:
return `${this.cssClass}__label--before`;
case SwitchLabelPosition.AFTER:
default:
return `${this.cssClass}__label`;
}
}
/**
*@hidden
*/
registerOnChange(fn) { this._onChangeCallback = fn; }
/**
*@hidden
*/
registerOnTouched(fn) { this._onTouchedCallback = fn; }
};
__decorate([
ViewChild('checkbox', { static: true }),
__metadata("design:type", ElementRef)
], IgxSwitchComponent.prototype, "nativeCheckbox", void 0);
__decorate([
ViewChild('label', { static: true }),
__metadata("design:type", Object)
], IgxSwitchComponent.prototype, "nativeLabel", void 0);
__decorate([
ViewChild('placeholderLabel', { static: true }),
__metadata("design:type", Object)
], IgxSwitchComponent.prototype, "placeholderLabel", void 0);
__decorate([
HostBinding('attr.id'),
Input(),
__metadata("design:type", Object)
], IgxSwitchComponent.prototype, "id", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxSwitchComponent.prototype, "labelId", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxSwitchComponent.prototype, "value", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], IgxSwitchComponent.prototype, "name", void 0);
__decorate([
Input(),
__metadata("design:type", Number)
], IgxSwitchComponent.prototype, "tabindex", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], IgxSwitchComponent.prototype, "labelPosition", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxSwitchComponent.prototype, "disableRipple", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxSwitchComponent.prototype, "required", void 0);
__decorate([
Input('aria-labelledby'),
__metadata("design:type", Object)
], IgxSwitchComponent.prototype, "ariaLabelledBy", void 0);
__decorate([
Input('aria-label'),
__metadata("design:type", String)
], IgxSwitchComponent.prototype, "ariaLabel", void 0);
__decorate([
Output(),
__metadata("design:type", EventEmitter)
], IgxSwitchComponent.prototype, "change", void 0);
__decorate([
HostBinding('class.igx-switch'),
__metadata("design:type", Object)
], IgxSwitchComponent.prototype, "cssClass", void 0);
__decorate([
HostBinding('class.igx-switch--checked'),
Input(),
__metadata("design:type", Object)
], IgxSwitchComponent.prototype, "checked", void 0);
__decorate([
HostBinding('class.igx-switch--disabled'),
Input(),
__metadata("design:type", Object)
], IgxSwitchComponent.prototype, "disabled", void 0);
__decorate([
HostBinding('class.igx-switch--focused'),
__metadata("design:type", Object)
], IgxSwitchComponent.prototype, "focused", void 0);
IgxSwitchComponent = IgxSwitchComponent_1 = __decorate([
Component({
providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: IgxSwitchComponent_1, multi: true }],
selector: 'igx-switch',
template: "<input #checkbox class=\"igx-switch__input\" type=\"checkbox\"\n [id]=\"inputId\"\n [name]=\"name\"\n [value]=\"value\"\n [tabindex]=\"tabindex\"\n [disabled]=\"disabled\"\n [checked]=\"checked\"\n [required]=\"required\"\n [attr.aria-checked]=\"checked\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-label]=\"ariaLabel\"\n (change)=\"_onSwitchChange($event)\"\n (click)=\"_onSwitchClick($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\" />\n\n<label #label class =\"igx-switch__composite\" [for]=\"inputId\"\n igxRipple\n igxRippleTarget=\".igx-switch__ripple\"\n [igxRippleDisabled]=\"disableRipple\"\n [igxRippleCentered]=\"true\"\n [igxRippleDuration]=\"300\">\n <div class=\"igx-switch__composite-thumb\">\n <div class=\"igx-switch__ripple\"></div>\n </div>\n</label>\n\n<span #placeholderLabel role=\"label\"\n [class]=\"labelClass\"\n [id]=\"labelId\"\n (click)=\"_onLabelClick($event)\">\n <ng-content></ng-content>\n</span>\n"
})
], IgxSwitchComponent);
export { IgxSwitchComponent };
export const IGX_SWITCH_REQUIRED_VALIDATOR = {
provide: NG_VALIDATORS,
useExisting: forwardRef(() => IgxSwitchRequiredDirective),
multi: true
};
/* tslint:disable directive-selector */
let IgxSwitchRequiredDirective = class IgxSwitchRequiredDirective extends CheckboxRequiredValidator {
};
IgxSwitchRequiredDirective = __decorate([
Directive({
selector: `igx-switch[required][formControlName],
igx-switch[required][formControl],
igx-switch[required][ngModel]`,
providers: [IGX_SWITCH_REQUIRED_VALIDATOR]
})
], IgxSwitchRequiredDirective);
export { IgxSwitchRequiredDirective };
/**
* @hidden
*/
let IgxSwitchModule = class IgxSwitchModule {
};
IgxSwitchModule = __decorate([
NgModule({
declarations: [IgxSwitchComponent, IgxSwitchRequiredDirective],
exports: [IgxSwitchComponent, IgxSwitchRequiredDirective],
imports: [IgxRippleModule]
})
], IgxSwitchModule);
export { IgxSwitchModule };
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvc3dpdGNoL3N3aXRjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEVBQ1QsVUFBVSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx5QkFBeUIsRUFBd0IsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxJQUFJLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBR3JELE1BQU0sQ0FBTixJQUFZLG1CQUdYO0FBSEQsV0FBWSxtQkFBbUI7SUFDM0Isd0NBQWlCLENBQUE7SUFDakIsc0NBQWUsQ0FBQTtBQUNuQixDQUFDLEVBSFcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQUc5QjtBQU9ELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7QUFDdkIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2Y7Ozs7Ozs7Ozs7OztHQVlHO0FBTUgsSUFBYSxrQkFBa0IsMEJBQS9CLE1BQWEsa0JBQWtCO0lBQS9CO1FBOEJJOzs7Ozs7Ozs7O1dBVUc7UUFFYSxPQUFFLEdBQUcsY0FBYyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQzlDOzs7Ozs7Ozs7O1dBVUc7UUFDYSxZQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUM7UUF1QjdDOzs7Ozs7Ozs7V0FTRztRQUNhLGFBQVEsR0FBVyxJQUFJLENBQUM7UUFDeEM7Ozs7Ozs7Ozs7V0FVRztRQUNhLGtCQUFhLEdBQWlD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Q29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgTmdNb2R1bGUsXG4gICAgT3V0cHV0LFxuICAgIFByb3ZpZGVyLFxuICAgIFZpZXdDaGlsZCxcbiAgICBFbGVtZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvciwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSWd4UmlwcGxlTW9kdWxlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9yaXBwbGUvcmlwcGxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBpc0lFLCBJQmFzZUV2ZW50QXJncyB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgRWRpdG9yUHJvdmlkZXIgfSBmcm9tICcuLi9jb3JlL2VkaXQtcHJvdmlkZXInO1xuXG5leHBvcnQgZW51bSBTd2l0Y2hMYWJlbFBvc2l0aW9uIHtcbiAgICBCRUZPUkUgPSAnYmVmb3JlJyxcbiAgICBBRlRFUiA9ICdhZnRlcidcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hhbmdlU3dpdGNoRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VFdmVudEFyZ3Mge1xuICAgIGNoZWNrZWQ6IGJvb2xlYW47XG4gICAgc3dpdGNoOiBJZ3hTd2l0Y2hDb21wb25lbnQ7XG59XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7IH07XG5sZXQgbmV4dElkID0gMDtcbi8qKlxuICogKipJZ25pdGUgVUkgZm9yIEFuZ3VsYXIgU3dpdGNoKiogLVxuICogW0RvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LmluZnJhZ2lzdGljcy5jb20vcHJvZHVjdHMvaWduaXRlLXVpLWFuZ3VsYXIvYW5ndWxhci9jb21wb25lbnRzL3N3aXRjaC5odG1sKVxuICpcbiAqIFRoZSBJZ25pdGUgVUkgU3dpdGNoIGxldHMgdGhlIHVzZXIgdG9nZ2xlIGJldHdlZW4gb24vb2ZmIG9yIHRydWUvZmFsc2Ugc3RhdGVzLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBodG1sXG4gKiA8aWd4LXN3aXRjaCBbY2hlY2tlZF09XCJ0cnVlXCI+XG4gKiAgIFNpbXBsZSBzd2l0Y2hcbiAqIDwvaWd4LXN3aXRjaD5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogSWd4U3dpdGNoQ29tcG9uZW50LCBtdWx0aTogdHJ1ZSB9XSxcbiAgICBzZWxlY3RvcjogJ2lneC1zd2l0Y2gnLFxuICAgIHRlbXBsYXRlVXJsOiAnc3dpdGNoLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hTd2l0Y2hDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRWRpdG9yUHJvdmlkZXIge1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfdmFsdWU6IGFueTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHJlZmVyZW5jZSB0byB0aGUgbmF0aXZlIGNoZWNrYm94IGVsZW1lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjaGVja2JveEVsZW1lbnQgPSAgdGhpcy5zd2l0Y2gubmF0aXZlQ2hlY2tib3g7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2NoZWNrYm94JywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG5hdGl2ZUNoZWNrYm94OiBFbGVtZW50UmVmO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBuYXRpdmUgbGFiZWwgZWxlbWVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxhYmVsRWxlbWVudCA9ICB0aGlzLnN3aXRjaC5uYXRpdmVMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnbGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgbmF0aXZlTGFiZWw7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIGxhYmVsIHBsYWNlaG9sZGVyIGVsZW1lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsYWJlbFBsYWNlaG9sZGVyID0gIHRoaXMuc3dpdGNoLnBsYWNlaG9sZGVyTGFiZWw7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3BsYWNlaG9sZGVyTGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgcGxhY2Vob2xkZXJMYWJlbDtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGlkYCBvZiB0aGUgc3dpdGNoIGNvbXBvbmVudC5cbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYGlkYCBvZiB0aGUgZmlyc3Qgc3dpdGNoIGNvbXBvbmVudCB3aWxsIGJlIGBcImlneC1zd2l0Y2gtMFwiYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zd2l0Y2ggaWQ9XCJteS1maXJzdC1zd2l0Y2hcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzd2l0Y2hJZCA9ICB0aGlzLnN3aXRjaC5pZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKSBwdWJsaWMgaWQgPSBgaWd4LXN3aXRjaC0ke25leHRJZCsrfWA7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBpZCBvZiB0aGUgYGxhYmVsYCBlbGVtZW50IGluIHRoZSBzd2l0Y2ggY29tcG9uZW50LlxuICAgICAqIElmIG5vdCBzZXQsIHRoZSBsYWJlbCBvZiB0aGUgZmlyc3Qgc3dpdGNoIGNvbXBvbmVudCB3aWxsIGhhdmUgdmFsdWUgYFwiaWd4LXN3aXRjaC0wLWxhYmVsXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXN3aXRjaCBsYWJlbElkPVwiTGFiZWwxXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGFiZWxJZCA9ICB0aGlzLnN3aXRjaC5sYWJlbElkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbGFiZWxJZCA9IGAke3RoaXMuaWR9LWxhYmVsYDtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGB2YWx1ZWAgYXR0cmlidXRlIG9mIHRoZSBzd2l0Y2ggY29tcG9uZW50LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXN3aXRjaCBbdmFsdWVdID0gXCJzd2l0Y2hWYWx1ZVwiPjwvaWd4LXN3aXRjaD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHZhbHVlID0gIHRoaXMuc3dpdGNoLnZhbHVlO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsdWU6IGFueTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBuYW1lYCBhdHRyaWJ1dGUgb2YgdGhlIHN3aXRjaCBjb21wb25lbnQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIG5hbWUgPSBcIlN3aXRjaDFcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBuYW1lID0gIHRoaXMuc3dpdGNoLm5hbWU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYHRhYmluZGV4YCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIFt0YWJpbmRleF09XCIxXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdGFiSW5kZXggPSAgdGhpcy5zd2l0Y2gudGFiaW5kZXg7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyB0YWJpbmRleDogbnVtYmVyID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBgbGFiZWxgIGluIHRoZSBzd2l0Y2ggY29tcG9uZW50LlxuICAgICAqIElmIG5vdCBzZXQsIGBsYWJlbFBvc2l0aW9uYCB3aWxsIGhhdmUgdmFsdWUgYFwiYWZ0ZXJcImAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIGxhYmVsUG9zaXRpb249XCJiZWZvcmVcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsYWJlbFBvc2l0aW9uID0gIHRoaXMuc3dpdGNoLmxhYmVsUG9zaXRpb247XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsYWJlbFBvc2l0aW9uOiBTd2l0Y2hMYWJlbFBvc2l0aW9uIHwgc3RyaW5nID0gJ2FmdGVyJztcbiAgICAvKipcbiAgICAgKiBFbmFibGVzL0Rpc2FibGVzIHRoZSByaXBwbGUgZWZmZWN0XG4gICAgICogSWYgbm90IHNldCwgYGRpc2FibGVSaXBwbGVgIHdpbGwgaGF2ZSB2YWx1ZSBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXN3aXRjaCBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNSaXBwbGVEaXNhYmxlZCA9IHRoaXMuc3dpdGNoLmRpc2FibGVSaXBwbGU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlUmlwcGxlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgc3dpdGNoIGlzIHJlcXVpcmVkLlxuICAgICAqIElmIG5vdCBzZXQsIGByZXF1aXJlZGAgd2lsbCBoYXZlIHZhbHVlIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIFtyZXF1aXJlZF09XCJ0cnVlXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNSZXF1aXJlZCA9IHRoaXMuc3dpdGNoLnJlcXVpcmVkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgcmVxdWlyZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBhcmlhLWxhYmVsbGVkQnlgIGF0dHJpYnV0ZS5cbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgIHZhbHVlIG9mIGBhcmlhLWxhYmVsbGVkQnlgIHdpbGwgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIGBsYWJlbElkYCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIGFyaWEtbGFiZWxsZWRieSA9IFwiTGFiZWwxXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgYXJpYUxhYmVsbGVkQnkgPSB0aGlzLnN3aXRjaC5hcmlhTGFiZWxsZWRCeTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCdhcmlhLWxhYmVsbGVkYnknKVxuICAgIHB1YmxpYyBhcmlhTGFiZWxsZWRCeSA9IHRoaXMubGFiZWxJZDtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIHZhbHVlIG9mIHRoZSBgYXJpYS1sYWJlbGAgYXR0cmlidXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXN3aXRjaCBhcmlhLWxhYmVsPVwiTGFiZWwxXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgYXJpYUxhYmVsID0gIHRoaXMuc3dpdGNoLmFyaWFMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCdhcmlhLWxhYmVsJylcbiAgICBwdWJsaWMgYXJpYUxhYmVsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgYWZ0ZXIgdGhlIHN3aXRjaCBzdGF0ZSBpcyBjaGFuZ2VkLlxuICAgICAqIFByb3ZpZGVzIHJlZmVyZW5jZXMgdG8gdGhlIGBJZ3hTd2l0Y2hDb21wb25lbnRgIGFuZCB0aGUgYGNoZWNrZWRgIHByb3BlcnR5IGFzIGV2ZW50IGFyZ3VtZW50cy5cbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8SUNoYW5nZVN3aXRjaEV2ZW50QXJncz4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFuZ2VTd2l0Y2hFdmVudEFyZ3M+KCk7XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY2xhc3Mgb2YgdGhlIHN3aXRjaCBjb21wb25lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzd2l0Y2hDbGFzcyA9IHRoaXMuc3dpdGNoLmNzc0NsYXNzO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1zd2l0Y2gnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtc3dpdGNoJztcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgc3dpdGNoIGlzIG9uIG9yIG9mZi5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzICdmYWxzZScuXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LXN3aXRjaCBbY2hlY2tlZF0gPSBcInRydWVcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0NoZWNrZWQgPSAgdGhpcy5zd2l0Y2guY2hlY2tlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtc3dpdGNoLS1jaGVja2VkJylcbiAgICBASW5wdXQoKSBwdWJsaWMgY2hlY2tlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGRpc2FibGVkYCBhdHRyaWJ1dGUuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXN3aXRjaCBbZGlzYWJsZWRdID0gXCJ0cnVlXCI+PGlneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0Rpc2FibGVkID0gIHRoaXMuc3dpdGNoLmRpc2FibGVkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1zd2l0Y2gtLWRpc2FibGVkJylcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgc3dpdGNoIGNvbXBvbmVudCBpcyBvbiBmb2N1cy5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuc3dpdGNoLmZvY3VzZWQgPSB0cnVlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNGb2N1c2VkID0gIHRoaXMuc3dpdGNoLmZvY3VzZWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXN3aXRjaC0tZm9jdXNlZCcpXG4gICAgcHVibGljIGZvY3VzZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5wdXRJZCA9IGAke3RoaXMuaWR9LWlucHV0YDtcbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzd2l0Y2guXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuc3dpdGNoLnRvZ2dsZSgpO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZDtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hhbmdlLmVtaXQoeyBjaGVja2VkOiB0aGlzLmNoZWNrZWQsIHN3aXRjaDogdGhpcyB9KTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh0aGlzLmNoZWNrZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgX29uU3dpdGNoQ2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgX29uU3dpdGNoQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG5cbiAgICAgICAgaWYgKGlzSUUoKSkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVDaGVja2JveC5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgX29uTGFiZWxDbGljayhldmVudCkge1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Gb2N1cyhldmVudCkge1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25CbHVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSAhIXRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGdldEVkaXRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVDaGVja2JveC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFiZWxDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICBzd2l0Y2ggKHRoaXMubGFiZWxQb3NpdGlvbikge1xuICAgICAgICAgICAgY2FzZSBTd2l0Y2hMYWJlbFBvc2l0aW9uLkJFRk9SRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5jc3NDbGFzc31fX2xhYmVsLS1iZWZvcmVgO1xuICAgICAgICAgICAgY2FzZSBTd2l0Y2hMYWJlbFBvc2l0aW9uLkFGVEVSOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5jc3NDbGFzc31fX2xhYmVsYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4gdm9pZCkgeyB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47IH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpIHsgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjsgfVxufVxuXG5leHBvcnQgY29uc3QgSUdYX1NXSVRDSF9SRVFVSVJFRF9WQUxJREFUT1I6IFByb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gSWd4U3dpdGNoUmVxdWlyZWREaXJlY3RpdmUpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZSBkaXJlY3RpdmUtc2VsZWN0b3IgKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiBgaWd4LXN3aXRjaFtyZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSxcbiAgICBpZ3gtc3dpdGNoW3JlcXVpcmVkXVtmb3JtQ29udHJvbF0sXG4gICAgaWd4LXN3aXRjaFtyZXF1aXJlZF1bbmdNb2RlbF1gLFxuICAgIHByb3ZpZGVyczogW0lHWF9TV0lUQ0hfUkVRVUlSRURfVkFMSURBVE9SXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hTd2l0Y2hSZXF1aXJlZERpcmVjdGl2ZSBleHRlbmRzIENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IgeyB9XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW0lneFN3aXRjaENvbXBvbmVudCwgSWd4U3dpdGNoUmVxdWlyZWREaXJlY3RpdmVdLFxuICAgIGV4cG9ydHM6IFtJZ3hTd2l0Y2hDb21wb25lbnQsIElneFN3aXRjaFJlcXVpcmVkRGlyZWN0aXZlXSxcbiAgICBpbXBvcnRzOiBbSWd4UmlwcGxlTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hTd2l0Y2hNb2R1bGUgeyB9XG4iXX0=