UNPKG

@catull/igniteui-angular

Version:

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

362 lines 30.5 kB
var IgxRadioComponent_1; import { __decorate, __metadata } from "tslib"; import { Component, EventEmitter, HostBinding, Input, Output, ViewChild, ElementRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { isIE } from '../core/utils'; export var RadioLabelPosition; (function (RadioLabelPosition) { RadioLabelPosition["BEFORE"] = "before"; RadioLabelPosition["AFTER"] = "after"; })(RadioLabelPosition || (RadioLabelPosition = {})); let nextId = 0; const noop = () => { }; const ɵ0 = noop; /** * **Ignite UI for Angular Radio Button** - * [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/radio_button.html) * * The Ignite UI Radio Button allows the user to select a single option from an available set of options that are listed side by side. * * Example: * ```html * <igx-radio> * Simple radio button * </igx-radio> * ``` */ let IgxRadioComponent = IgxRadioComponent_1 = class IgxRadioComponent { constructor() { /** * Sets/gets the `id` of the radio component. * If not set, the `id` of the first radio component will be `"igx-radio-0"`. * ```html * <igx-radio id = "my-first-radio"></igx-radio> * ``` * ```typescript * let radioId = this.radio.id; * ``` * @memberof IgxRadioComponent */ this.id = `igx-radio-${nextId++}`; /** * Sets/gets the id of the `label` element in the radio component. * If not set, the id of the `label` in the first radio component will be `"igx-radio-0-label"`. * ```html * <igx-radio labelId = "Label1"></igx-radio> * ``` * ```typescript * let labelId = this.radio.labelId; * ``` * @memberof IgxRadioComponent */ this.labelId = `${this.id}-label`; /** * Sets/gets the position of the `label` in the radio component. * If not set, `labelPosition` will have value `"after"`. * ```html * <igx-radio labelPosition = "before"></igx-radio> * ``` * ```typescript * let labelPosition = this.radio.labelPosition; * ``` * @memberof IgxRadioComponent */ this.labelPosition = 'after'; /** * Sets the value of the `tabindex` attribute. * ```html * <igx-radio [tabindex] = "1"></igx-radio> * ``` * ```typescript * let tabIndex = this.radio.tabindex; * ``` * @memberof IgxRadioComponent */ this.tabindex = null; /** * Enables/disables the ripple effect on the radio button.. * If not set, the `disableRipple` will have value `false`. * ```html * <igx-radio [disableRipple] = "true"></igx-radio> * ``` * ```typescript * let isDisabledRipple = this.radio.disableRipple; * ``` * @memberof IgxRadioComponent */ this.disableRipple = false; /** * Sets/gets whether the radio button is required. * If not set, `required` will have value `false`. * ```html * <igx-radio [required] = "true"></igx-radio> * ``` * ```typescript * let isRequired = this.radio.required; * ``` * @memberof IgxRadioComponent */ this.required = false; /** * Sets/gets the `aria-labelledby` attribute of the radio component. * If not set, the `aria-labelledby` will be equal to the value of `labelId` attribute. * ```html * <igx-radio aria-labelledby = "Radio1"></igx-radio> * ``` * ```typescript * let ariaLabelledBy = this.radio.ariaLabelledBy; * ``` * @memberof IgxRadioComponent */ this.ariaLabelledBy = this.labelId; /** * Sets/gets the `aria-label` attribute of the radio component. * ```html * <igx-radio aria-label = "Radio1"></igx-radio> * ``` * ```typescript * let ariaLabel = this.radio.ariaLabel; * ``` * @memberof IgxRadioComponent */ this.ariaLabel = null; /** * An event that is emitted after the radio `value` is changed. * Provides references to the `IgxRadioComponent` and the `value` property as event arguments. * @memberof IgxRadioComponent */ this.change = new EventEmitter(); /** * Returns the class of the radio component. * ```typescript * let radioClass = this.radio.cssClass; * ``` * @memberof IgxRadioComponent */ this.cssClass = 'igx-radio'; /** * Sets/gets the `checked` attribute. * Default value is `false`. * ```html * <igx-radio [checked] = "true"></igx-radio> * ``` * ```typescript * let isChecked = this.radio.checked; * ``` * @memberof IgxRadioComponent */ this.checked = false; /** * Sets/gets the `disabled` attribute. * Default value is `false`. * ```html * <igx-radio [disabled] = "true"></igx-radio> * ``` * ```typescript * let isDisabled = this.radio.disabled; * ``` * @memberof IgxRadioComponent */ this.disabled = false; /** * Sets/gets whether the radio component is on focus. * Default value is `false`. * ```typescript * this.radio.focus = true; * ``` * ```typescript * let isFocused = this.radio.focused; * ``` * @memberof IgxRadioComponent */ this.focused = false; /** *@hidden */ this.inputId = `${this.id}-input`; /** *@hidden */ this._value = null; /** *@hidden */ this._onTouchedCallback = noop; /** *@hidden */ this._onChangeCallback = noop; } /** *@hidden */ _onRadioChange(event) { event.stopPropagation(); } /** *@hidden */ _onRadioClick(event) { event.stopPropagation(); this.select(); if (isIE()) { this.nativeRadio.nativeElement.blur(); } } /** *@hidden */ _onLabelClick() { this.select(); } /** * Selects the current radio button. * ```typescript * this.radio.select(); * ``` * @memberof IgxRadioComponent */ select() { if (this.disabled) { return; } this.checked = true; this.focused = false; this.change.emit({ value: this.value, radio: this }); this._onChangeCallback(this.value); } /** * Checks whether the provided value is consistent to the current radio button. * If it is, the checked attribute will have value `true`; * ```typescript * this.radio.writeValue('radioButtonValue'); * ``` */ writeValue(value) { this._value = value; this.checked = (this._value === this.value); } /** @hidden */ getEditElement() { return this.nativeRadio.nativeElement; } /** *@hidden */ get labelClass() { switch (this.labelPosition) { case RadioLabelPosition.BEFORE: return `${this.cssClass}__label--before`; case RadioLabelPosition.AFTER: default: return `${this.cssClass}__label`; } } /** *@hidden */ onFocus() { this.focused = true; } /** *@hidden */ onBlur() { this.focused = false; this._onTouchedCallback(); } /** *@hidden */ registerOnChange(fn) { this._onChangeCallback = fn; } /** *@hidden */ registerOnTouched(fn) { this._onTouchedCallback = fn; } }; __decorate([ ViewChild('radio', { static: true }), __metadata("design:type", ElementRef) ], IgxRadioComponent.prototype, "nativeRadio", void 0); __decorate([ ViewChild('nativeLabel', { static: true }), __metadata("design:type", Object) ], IgxRadioComponent.prototype, "nativeLabel", void 0); __decorate([ ViewChild('placeholderLabel', { static: true }), __metadata("design:type", Object) ], IgxRadioComponent.prototype, "placeholderLabel", void 0); __decorate([ HostBinding('attr.id'), Input(), __metadata("design:type", Object) ], IgxRadioComponent.prototype, "id", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxRadioComponent.prototype, "labelId", void 0); __decorate([ Input(), __metadata("design:type", String) ], IgxRadioComponent.prototype, "labelPosition", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxRadioComponent.prototype, "value", void 0); __decorate([ Input(), __metadata("design:type", String) ], IgxRadioComponent.prototype, "name", void 0); __decorate([ Input(), __metadata("design:type", Number) ], IgxRadioComponent.prototype, "tabindex", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxRadioComponent.prototype, "disableRipple", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxRadioComponent.prototype, "required", void 0); __decorate([ Input('aria-labelledby'), __metadata("design:type", Object) ], IgxRadioComponent.prototype, "ariaLabelledBy", void 0); __decorate([ Input('aria-label'), __metadata("design:type", String) ], IgxRadioComponent.prototype, "ariaLabel", void 0); __decorate([ Output(), __metadata("design:type", EventEmitter) ], IgxRadioComponent.prototype, "change", void 0); __decorate([ HostBinding('class.igx-radio'), __metadata("design:type", Object) ], IgxRadioComponent.prototype, "cssClass", void 0); __decorate([ HostBinding('class.igx-radio--checked'), Input(), __metadata("design:type", Object) ], IgxRadioComponent.prototype, "checked", void 0); __decorate([ HostBinding('class.igx-radio--disabled'), Input(), __metadata("design:type", Object) ], IgxRadioComponent.prototype, "disabled", void 0); __decorate([ HostBinding('class.igx-radio--focused'), __metadata("design:type", Object) ], IgxRadioComponent.prototype, "focused", void 0); IgxRadioComponent = IgxRadioComponent_1 = __decorate([ Component({ providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: IgxRadioComponent_1, multi: true }], selector: 'igx-radio', template: "<input #radio class=\"igx-radio__input\" type=\"radio\"\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 (click)=\"_onRadioClick($event)\"\n (change)=\"_onRadioChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\" />\n\n<label #nativeLabel class=\"igx-radio__composite\" igxRipple\n igxRippleTarget=\".igx-radio__ripple\"\n [igxRippleDisabled]=\"disableRipple\"\n [igxRippleCentered]=\"true\"\n [igxRippleDuration]=\"300\"\n [for]=\"inputId\">\n <div class=\"igx-radio__ripple\"></div>\n</label>\n\n<span #placeholderLabel role=\"label\"\n [id]=\"labelId\"\n [class]=\"labelClass\"\n (click)=\"_onLabelClick()\">\n <ng-content></ng-content>\n</span>\n" }), __metadata("design:paramtypes", []) ], IgxRadioComponent); export { IgxRadioComponent }; export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9yYWRpby9yYWRpby5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsVUFBVSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsSUFBSSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQVFyRCxNQUFNLENBQU4sSUFBWSxrQkFHWDtBQUhELFdBQVksa0JBQWtCO0lBQzFCLHVDQUFpQixDQUFBO0lBQ2pCLHFDQUFlLENBQUE7QUFDbkIsQ0FBQyxFQUhXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFHN0I7QUFFRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDZixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0FBQ3ZCOzs7Ozs7Ozs7Ozs7R0FZRztBQU9ILElBQWEsaUJBQWlCLHlCQUE5QixNQUFhLGlCQUFpQjtJQWlOMUI7UUF2TEE7Ozs7Ozs7Ozs7V0FVRztRQUVhLE9BQUUsR0FBRyxhQUFhLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDN0M7Ozs7Ozs7Ozs7V0FVRztRQUNhLFlBQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQztRQUM3Qzs7Ozs7Ozs7OztXQVVHO1FBQ2Esa0JBQWEsR0FBZ0MsT0FBTyxDQUFDO1FBdUJyRTs7Ozs7Ozs7O1dBU0c7UUFDYSxhQUFRLEdBQVcsSUFBSSxDQUFDO1FBQ3hDOzs7Ozs7Ozs7O1dBVUc7UUFDYSxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0Qzs7Ozs7Ozs7OztXQVVHO1FBQ2EsYUFBUSxHQUFHLEtBQUss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LFdBQVcsQ0FBQywwQkFBMEIsQ0FBQzs7a0RBQ2pCO0FBdk1kLGlCQUFpQjtJQU43QixTQUFTLENBQUM7UUFDUCxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsbUJBQWlCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3hGLFFBQVEsRUFBRSxXQUFXO1FBQ3JCLHc4QkFBbUM7S0FDdEMsQ0FBQzs7R0FFVyxpQkFBaUIsQ0FrVDdCO1NBbFRZLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIEVsZW1lbnRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBpc0lFLCBJQmFzZUV2ZW50QXJncyB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgRWRpdG9yUHJvdmlkZXIgfSBmcm9tICcuLi9jb3JlL2VkaXQtcHJvdmlkZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDaGFuZ2VSYWRpb0V2ZW50QXJncyBleHRlbmRzIElCYXNlRXZlbnRBcmdzIHtcbiAgICB2YWx1ZTogYW55O1xuICAgIHJhZGlvOiBJZ3hSYWRpb0NvbXBvbmVudDtcbn1cblxuZXhwb3J0IGVudW0gUmFkaW9MYWJlbFBvc2l0aW9uIHtcbiAgICBCRUZPUkUgPSAnYmVmb3JlJyxcbiAgICBBRlRFUiA9ICdhZnRlcidcbn1cblxubGV0IG5leHRJZCA9IDA7XG5jb25zdCBub29wID0gKCkgPT4geyB9O1xuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBSYWRpbyBCdXR0b24qKiAtXG4gKiBbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuaW5mcmFnaXN0aWNzLmNvbS9wcm9kdWN0cy9pZ25pdGUtdWktYW5ndWxhci9hbmd1bGFyL2NvbXBvbmVudHMvcmFkaW9fYnV0dG9uLmh0bWwpXG4gKlxuICogVGhlIElnbml0ZSBVSSBSYWRpbyBCdXR0b24gYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIHNpbmdsZSBvcHRpb24gZnJvbSBhbiBhdmFpbGFibGUgc2V0IG9mIG9wdGlvbnMgdGhhdCBhcmUgbGlzdGVkIHNpZGUgYnkgc2lkZS5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgaHRtbFxuICogPGlneC1yYWRpbz5cbiAqICAgU2ltcGxlIHJhZGlvIGJ1dHRvblxuICogPC9pZ3gtcmFkaW8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IElneFJhZGlvQ29tcG9uZW50LCBtdWx0aTogdHJ1ZSB9XSxcbiAgICBzZWxlY3RvcjogJ2lneC1yYWRpbycsXG4gICAgdGVtcGxhdGVVcmw6ICdyYWRpby5jb21wb25lbnQuaHRtbCdcbn0pXG5cbmV4cG9ydCBjbGFzcyBJZ3hSYWRpb0NvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBFZGl0b3JQcm92aWRlciB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByZWZlcmVuY2UgdG8gbmF0aXZlIHJhZGlvIGVsZW1lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCByYWRpb0VsZW1lbnQgPSAgdGhpcy5yYWRpby5uYXRpdmVSYWRpbztcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgncmFkaW8nLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgbmF0aXZlUmFkaW86IEVsZW1lbnRSZWY7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByZWZlcmVuY2UgdG8gbmF0aXZlIGxhYmVsIGVsZW1lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsYWJlbEVsZW1lbnQgPSAgdGhpcy5yYWRpby5uYXRpdmVMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnbmF0aXZlTGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgbmF0aXZlTGFiZWw7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIGxhYmVsIHBsYWNlaG9sZGVyIGVsZW1lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsYWJlbFBsYWNlaG9sZGVyID0gIHRoaXMucmFkaW8ucGxhY2Vob2xkZXJMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgncGxhY2Vob2xkZXJMYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBwbGFjZWhvbGRlckxhYmVsO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgaWRgIG9mIHRoZSByYWRpbyBjb21wb25lbnQuXG4gICAgICogSWYgbm90IHNldCwgdGhlIGBpZGAgb2YgdGhlIGZpcnN0IHJhZGlvIGNvbXBvbmVudCB3aWxsIGJlIGBcImlneC1yYWRpby0wXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXJhZGlvIGlkID0gXCJteS1maXJzdC1yYWRpb1wiPjwvaWd4LXJhZGlvPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgcmFkaW9JZCA9ICB0aGlzLnJhZGlvLmlkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hSYWRpb0NvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KCkgcHVibGljIGlkID0gYGlneC1yYWRpby0ke25leHRJZCsrfWA7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBpZCBvZiB0aGUgYGxhYmVsYCBlbGVtZW50IGluIHRoZSByYWRpbyBjb21wb25lbnQuXG4gICAgICogSWYgbm90IHNldCwgdGhlIGlkIG9mIHRoZSBgbGFiZWxgIGluIHRoZSBmaXJzdCByYWRpbyBjb21wb25lbnQgd2lsbCBiZSBgXCJpZ3gtcmFkaW8tMC1sYWJlbFwiYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1yYWRpbyBsYWJlbElkID0gXCJMYWJlbDFcIj48L2lneC1yYWRpbz5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxhYmVsSWQgPSAgdGhpcy5yYWRpby5sYWJlbElkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hSYWRpb0NvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsYWJlbElkID0gYCR7dGhpcy5pZH0tbGFiZWxgO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIGBsYWJlbGAgaW4gdGhlIHJhZGlvIGNvbXBvbmVudC5cbiAgICAgKiBJZiBub3Qgc2V0LCBgbGFiZWxQb3NpdGlvbmAgd2lsbCBoYXZlIHZhbHVlIGBcImFmdGVyXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXJhZGlvIGxhYmVsUG9zaXRpb24gPSBcImJlZm9yZVwiPjwvaWd4LXJhZGlvPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGFiZWxQb3NpdGlvbiA9ICB0aGlzLnJhZGlvLmxhYmVsUG9zaXRpb247XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFJhZGlvQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsUG9zaXRpb246IFJhZGlvTGFiZWxQb3NpdGlvbiB8IHN0cmluZyA9ICdhZnRlcic7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgdmFsdWVgIGF0dHJpYnV0ZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1yYWRpbyBbdmFsdWVdID0gXCIncmFkaW9CdXR0b25WYWx1ZSdcIj48L2lneC1yYWRpbz5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHZhbHVlID0gIHRoaXMucmFkaW8udmFsdWU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFJhZGlvQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHZhbHVlOiBhbnk7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgbmFtZWAgYXR0cmlidXRlIG9mIHRoZSByYWRpbyBjb21wb25lbnQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcmFkaW8gbmFtZSA9IFwiUmFkaW8xXCI+PC9pZ3gtcmFkaW8+XG4gICAgICogIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbmFtZSA9ICB0aGlzLnJhZGlvLm5hbWU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFJhZGlvQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYHRhYmluZGV4YCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcmFkaW8gW3RhYmluZGV4XSA9IFwiMVwiPjwvaWd4LXJhZGlvPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdGFiSW5kZXggPSAgdGhpcy5yYWRpby50YWJpbmRleDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4UmFkaW9Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgdGFiaW5kZXg6IG51bWJlciA9IG51bGw7XG4gICAgLyoqXG4gICAgICogRW5hYmxlcy9kaXNhYmxlcyB0aGUgcmlwcGxlIGVmZmVjdCBvbiB0aGUgcmFkaW8gYnV0dG9uLi5cbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYGRpc2FibGVSaXBwbGVgIHdpbGwgaGF2ZSB2YWx1ZSBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXJhZGlvIFtkaXNhYmxlUmlwcGxlXSA9IFwidHJ1ZVwiPjwvaWd4LXJhZGlvPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNEaXNhYmxlZFJpcHBsZSA9ICB0aGlzLnJhZGlvLmRpc2FibGVSaXBwbGU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFJhZGlvQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVSaXBwbGUgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgcmFkaW8gYnV0dG9uIGlzIHJlcXVpcmVkLlxuICAgICAqIElmIG5vdCBzZXQsIGByZXF1aXJlZGAgd2lsbCBoYXZlIHZhbHVlIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcmFkaW8gW3JlcXVpcmVkXSA9IFwidHJ1ZVwiPjwvaWd4LXJhZGlvPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNSZXF1aXJlZCA9ICB0aGlzLnJhZGlvLnJlcXVpcmVkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hSYWRpb0NvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyByZXF1aXJlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGFyaWEtbGFiZWxsZWRieWAgYXR0cmlidXRlIG9mIHRoZSByYWRpbyBjb21wb25lbnQuXG4gICAgICogSWYgbm90IHNldCwgdGhlIGBhcmlhLWxhYmVsbGVkYnlgIHdpbGwgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIGBsYWJlbElkYCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcmFkaW8gYXJpYS1sYWJlbGxlZGJ5ID0gXCJSYWRpbzFcIj48L2lneC1yYWRpbz5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGFyaWFMYWJlbGxlZEJ5ID0gdGhpcy5yYWRpby5hcmlhTGFiZWxsZWRCeTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4UmFkaW9Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoJ2FyaWEtbGFiZWxsZWRieScpXG4gICAgcHVibGljIGFyaWFMYWJlbGxlZEJ5ID0gdGhpcy5sYWJlbElkO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZSBvZiB0aGUgcmFkaW8gY29tcG9uZW50LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXJhZGlvIGFyaWEtbGFiZWwgPSBcIlJhZGlvMVwiPjwvaWd4LXJhZGlvPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgYXJpYUxhYmVsID0gIHRoaXMucmFkaW8uYXJpYUxhYmVsO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hSYWRpb0NvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgnYXJpYS1sYWJlbCcpXG4gICAgcHVibGljIGFyaWFMYWJlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGFmdGVyIHRoZSByYWRpbyBgdmFsdWVgIGlzIGNoYW5nZWQuXG4gICAgICogUHJvdmlkZXMgcmVmZXJlbmNlcyB0byB0aGUgYElneFJhZGlvQ29tcG9uZW50YCBhbmQgdGhlIGB2YWx1ZWAgcHJvcGVydHkgYXMgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqIEBtZW1iZXJvZiBJZ3hSYWRpb0NvbXBvbmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IGNoYW5nZTogRXZlbnRFbWl0dGVyPElDaGFuZ2VSYWRpb0V2ZW50QXJncz4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFuZ2VSYWRpb0V2ZW50QXJncz4oKTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyBvZiB0aGUgcmFkaW8gY29tcG9uZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgcmFkaW9DbGFzcyA9IHRoaXMucmFkaW8uY3NzQ2xhc3M7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFJhZGlvQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtcmFkaW8nKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtcmFkaW8nO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyAgdGhlIGBjaGVja2VkYCBhdHRyaWJ1dGUuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXJhZGlvIFtjaGVja2VkXSA9IFwidHJ1ZVwiPjwvaWd4LXJhZGlvPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNDaGVja2VkID0gIHRoaXMucmFkaW8uY2hlY2tlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4UmFkaW9Db21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1yYWRpby0tY2hlY2tlZCcpXG4gICAgQElucHV0KCkgcHVibGljIGNoZWNrZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgIHRoZSBgZGlzYWJsZWRgIGF0dHJpYnV0ZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcmFkaW8gW2Rpc2FibGVkXSA9IFwidHJ1ZVwiPjwvaWd4LXJhZGlvPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNEaXNhYmxlZCA9ICB0aGlzLnJhZGlvLmRpc2FibGVkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hSYWRpb0NvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXJhZGlvLS1kaXNhYmxlZCcpXG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIHJhZGlvIGNvbXBvbmVudCBpcyBvbiBmb2N1cy5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMucmFkaW8uZm9jdXMgPSB0cnVlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNGb2N1c2VkID0gIHRoaXMucmFkaW8uZm9jdXNlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4UmFkaW9Db21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1yYWRpby0tZm9jdXNlZCcpXG4gICAgcHVibGljIGZvY3VzZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5wdXRJZCA9IGAke3RoaXMuaWR9LWlucHV0YDtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3ZhbHVlOiBhbnkgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9vblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIF9vblJhZGlvQ2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgX29uUmFkaW9DbGljayhldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5zZWxlY3QoKTtcblxuICAgICAgICBpZiAoaXNJRSgpKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZVJhZGlvLm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBfb25MYWJlbENsaWNrKCkge1xuICAgICAgICB0aGlzLnNlbGVjdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWxlY3RzIHRoZSBjdXJyZW50IHJhZGlvIGJ1dHRvbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5yYWRpby5zZWxlY3QoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4UmFkaW9Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hhbmdlLmVtaXQoeyB2YWx1ZTogdGhpcy52YWx1ZSwgcmFkaW86IHRoaXMgfSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodGhpcy52YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwcm92aWRlZCB2YWx1ZSBpcyBjb25zaXN0ZW50IHRvIHRoZSBjdXJyZW50IHJhZGlvIGJ1dHRvbi5cbiAgICAgKiBJZiBpdCBpcywgdGhlIGNoZWNrZWQgYXR0cmlidXRlIHdpbGwgaGF2ZSB2YWx1ZSBgdHJ1ZWA7XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMucmFkaW8ud3JpdGVWYWx1ZSgncmFkaW9CdXR0b25WYWx1ZScpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jaGVja2VkID0gKHRoaXMuX3ZhbHVlID09PSB0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXRFZGl0RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlUmFkaW8ubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBsYWJlbENsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5sYWJlbFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIFJhZGlvTGFiZWxQb3NpdGlvbi5CRUZPUkU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuY3NzQ2xhc3N9X19sYWJlbC0tYmVmb3JlYDtcbiAgICAgICAgICAgIGNhc2UgUmFkaW9MYWJlbFBvc2l0aW9uLkFGVEVSOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5jc3NDbGFzc31fX2xhYmVsYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Gb2N1cygpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG9uQmx1cigpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogYW55KSA9PiB2b2lkKSB7IHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjsgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCkgeyB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IGZuOyB9XG59XG4iXX0=