UNPKG

@catull/igniteui-angular

Version:

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

398 lines 34.9 kB
import { __decorate, __extends, __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 = {})); var noop = function () { }; var ɵ0 = noop; var 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> * ``` */ var IgxSwitchComponent = /** @class */ (function () { function IgxSwitchComponent() { /** * 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"; } IgxSwitchComponent_1 = IgxSwitchComponent; /** * Toggles the checked state of the switch. * ```typescript * this.switch.toggle(); * ``` * @memberof IgxSwitchComponent */ IgxSwitchComponent.prototype.toggle = function () { if (this.disabled) { return; } this.checked = !this.checked; this.focused = false; this.change.emit({ checked: this.checked, switch: this }); this._onChangeCallback(this.checked); }; /** *@hidden */ IgxSwitchComponent.prototype._onSwitchChange = function (event) { event.stopPropagation(); }; /** *@hidden */ IgxSwitchComponent.prototype._onSwitchClick = function (event) { event.stopPropagation(); this.toggle(); if (isIE()) { this.nativeCheckbox.nativeElement.blur(); } }; /** *@hidden */ IgxSwitchComponent.prototype._onLabelClick = function (event) { this.toggle(); }; /** *@hidden */ IgxSwitchComponent.prototype.onFocus = function (event) { this.focused = true; }; /** *@hidden */ IgxSwitchComponent.prototype.onBlur = function (event) { this.focused = false; this._onTouchedCallback(); }; /** *@hidden */ IgxSwitchComponent.prototype.writeValue = function (value) { this._value = value; this.checked = !!this._value; }; /** @hidden */ IgxSwitchComponent.prototype.getEditElement = function () { return this.nativeCheckbox.nativeElement; }; Object.defineProperty(IgxSwitchComponent.prototype, "labelClass", { /** *@hidden */ get: function () { switch (this.labelPosition) { case SwitchLabelPosition.BEFORE: return this.cssClass + "__label--before"; case SwitchLabelPosition.AFTER: default: return this.cssClass + "__label"; } }, enumerable: true, configurable: true }); /** *@hidden */ IgxSwitchComponent.prototype.registerOnChange = function (fn) { this._onChangeCallback = fn; }; /** *@hidden */ IgxSwitchComponent.prototype.registerOnTouched = function (fn) { this._onTouchedCallback = fn; }; var IgxSwitchComponent_1; __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); return IgxSwitchComponent; }()); export { IgxSwitchComponent }; export var IGX_SWITCH_REQUIRED_VALIDATOR = { provide: NG_VALIDATORS, useExisting: forwardRef(function () { return IgxSwitchRequiredDirective; }), multi: true }; /* tslint:disable directive-selector */ var IgxSwitchRequiredDirective = /** @class */ (function (_super) { __extends(IgxSwitchRequiredDirective, _super); function IgxSwitchRequiredDirective() { return _super !== null && _super.apply(this, arguments) || this; } IgxSwitchRequiredDirective = __decorate([ Directive({ selector: "igx-switch[required][formControlName],\n igx-switch[required][formControl],\n igx-switch[required][ngModel]", providers: [IGX_SWITCH_REQUIRED_VALIDATOR] }) ], IgxSwitchRequiredDirective); return IgxSwitchRequiredDirective; }(CheckboxRequiredValidator)); export { IgxSwitchRequiredDirective }; /** * @hidden */ var IgxSwitchModule = /** @class */ (function () { function IgxSwitchModule() { } IgxSwitchModule = __decorate([ NgModule({ declarations: [IgxSwitchComponent, IgxSwitchRequiredDirective], exports: [IgxSwitchComponent, IgxSwitchRequiredDirective], imports: [IgxRippleModule] }) ], IgxSwitchModule); return IgxSwitchModule; }()); export { IgxSwitchModule }; export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvc3dpdGNoL3N3aXRjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFNBQVMsRUFDVCxVQUFVLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHlCQUF5QixFQUF3QixhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLElBQUksRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFHckQsTUFBTSxDQUFOLElBQVksbUJBR1g7QUFIRCxXQUFZLG1CQUFtQjtJQUMzQix3Q0FBaUIsQ0FBQTtJQUNqQixzQ0FBZSxDQUFBO0FBQ25CLENBQUMsRUFIVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBRzlCO0FBT0QsSUFBTSxJQUFJLEdBQUcsY0FBUSxDQUFDLENBQUM7O0FBQ3ZCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNmOzs7Ozs7Ozs7Ozs7R0FZRztBQU1IO0lBQUE7UUE4Qkk7Ozs7Ozs7Ozs7V0FVRztRQUVhLE9BQUUsR0FBRyxnQkFBYyxNQUFNLEVBQUksQ0FBQztRQUM5Qzs7Ozs7Ozs7OztXQVVHO1FBQ2EsWUFBTyxHQUFNLElBQUksQ0FBQyxFQUFFLFdBQVEsQ0FBQztRQXVCN0M7Ozs7Ozs7OztXQVNHO1FBQ2EsYUFBUSxHQUFXLElBQUksQ0FBQztRQUN4Qzs7Ozs7Ozs7OztXQVVHO1FBQ2Esa0JBQWEsR0FBaUMsT0FBTyxDQUFDO1FBQ3RFOzs7Ozs7Ozs7O1dBVUc7UUFDYSxrQkFBYSxHQUFHLEtBQUss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QyxlQUFlLENBQUM7U0FDN0IsQ0FBQztPQUNXLGVBQWUsQ0FBSTtJQUFELHNCQUFDO0NBQUEsQUFBaEMsSUFBZ0M7U0FBbkIsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPdXRwdXQsXG4gICAgUHJvdmlkZXIsXG4gICAgVmlld0NoaWxkLFxuICAgIEVsZW1lbnRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJZ3hSaXBwbGVNb2R1bGUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3JpcHBsZS9yaXBwbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IGlzSUUsIElCYXNlRXZlbnRBcmdzIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBFZGl0b3JQcm92aWRlciB9IGZyb20gJy4uL2NvcmUvZWRpdC1wcm92aWRlcic7XG5cbmV4cG9ydCBlbnVtIFN3aXRjaExhYmVsUG9zaXRpb24ge1xuICAgIEJFRk9SRSA9ICdiZWZvcmUnLFxuICAgIEFGVEVSID0gJ2FmdGVyJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDaGFuZ2VTd2l0Y2hFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUV2ZW50QXJncyB7XG4gICAgY2hlY2tlZDogYm9vbGVhbjtcbiAgICBzd2l0Y2g6IElneFN3aXRjaENvbXBvbmVudDtcbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHsgfTtcbmxldCBuZXh0SWQgPSAwO1xuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBTd2l0Y2gqKiAtXG4gKiBbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuaW5mcmFnaXN0aWNzLmNvbS9wcm9kdWN0cy9pZ25pdGUtdWktYW5ndWxhci9hbmd1bGFyL2NvbXBvbmVudHMvc3dpdGNoLmh0bWwpXG4gKlxuICogVGhlIElnbml0ZSBVSSBTd2l0Y2ggbGV0cyB0aGUgdXNlciB0b2dnbGUgYmV0d2VlbiBvbi9vZmYgb3IgdHJ1ZS9mYWxzZSBzdGF0ZXMuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYGh0bWxcbiAqIDxpZ3gtc3dpdGNoIFtjaGVja2VkXT1cInRydWVcIj5cbiAqICAgU2ltcGxlIHN3aXRjaFxuICogPC9pZ3gtc3dpdGNoPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBJZ3hTd2l0Y2hDb21wb25lbnQsIG11bHRpOiB0cnVlIH1dLFxuICAgIHNlbGVjdG9yOiAnaWd4LXN3aXRjaCcsXG4gICAgdGVtcGxhdGVVcmw6ICdzd2l0Y2guY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneFN3aXRjaENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBFZGl0b3JQcm92aWRlciB7XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF92YWx1ZTogYW55O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBuYXRpdmUgY2hlY2tib3ggZWxlbWVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNoZWNrYm94RWxlbWVudCA9ICB0aGlzLnN3aXRjaC5uYXRpdmVDaGVja2JveDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnY2hlY2tib3gnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgbmF0aXZlQ2hlY2tib3g6IEVsZW1lbnRSZWY7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIG5hdGl2ZSBsYWJlbCBlbGVtZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGFiZWxFbGVtZW50ID0gIHRoaXMuc3dpdGNoLm5hdGl2ZUxhYmVsO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdsYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBuYXRpdmVMYWJlbDtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHJlZmVyZW5jZSB0byB0aGUgbGFiZWwgcGxhY2Vob2xkZXIgZWxlbWVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxhYmVsUGxhY2Vob2xkZXIgPSAgdGhpcy5zd2l0Y2gucGxhY2Vob2xkZXJMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgncGxhY2Vob2xkZXJMYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBwbGFjZWhvbGRlckxhYmVsO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgaWRgIG9mIHRoZSBzd2l0Y2ggY29tcG9uZW50LlxuICAgICAqIElmIG5vdCBzZXQsIHRoZSBgaWRgIG9mIHRoZSBmaXJzdCBzd2l0Y2ggY29tcG9uZW50IHdpbGwgYmUgYFwiaWd4LXN3aXRjaC0wXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXN3aXRjaCBpZD1cIm15LWZpcnN0LXN3aXRjaFwiPjwvaWd4LXN3aXRjaD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN3aXRjaElkID0gIHRoaXMuc3dpdGNoLmlkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIEBJbnB1dCgpIHB1YmxpYyBpZCA9IGBpZ3gtc3dpdGNoLSR7bmV4dElkKyt9YDtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGlkIG9mIHRoZSBgbGFiZWxgIGVsZW1lbnQgaW4gdGhlIHN3aXRjaCBjb21wb25lbnQuXG4gICAgICogSWYgbm90IHNldCwgdGhlIGxhYmVsIG9mIHRoZSBmaXJzdCBzd2l0Y2ggY29tcG9uZW50IHdpbGwgaGF2ZSB2YWx1ZSBgXCJpZ3gtc3dpdGNoLTAtbGFiZWxcImAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIGxhYmVsSWQ9XCJMYWJlbDFcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsYWJlbElkID0gIHRoaXMuc3dpdGNoLmxhYmVsSWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsYWJlbElkID0gYCR7dGhpcy5pZH0tbGFiZWxgO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYHZhbHVlYCBhdHRyaWJ1dGUgb2YgdGhlIHN3aXRjaCBjb21wb25lbnQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIFt2YWx1ZV0gPSBcInN3aXRjaFZhbHVlXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdmFsdWUgPSAgdGhpcy5zd2l0Y2gudmFsdWU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyB2YWx1ZTogYW55O1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYG5hbWVgIGF0dHJpYnV0ZSBvZiB0aGUgc3dpdGNoIGNvbXBvbmVudC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zd2l0Y2ggbmFtZSA9IFwiU3dpdGNoMVwiPjwvaWd4LXN3aXRjaD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IG5hbWUgPSAgdGhpcy5zd2l0Y2gubmFtZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIHZhbHVlIG9mIHRoZSBgdGFiaW5kZXhgIGF0dHJpYnV0ZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zd2l0Y2ggW3RhYmluZGV4XT1cIjFcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB0YWJJbmRleCA9ICB0aGlzLnN3aXRjaC50YWJpbmRleDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHRhYmluZGV4OiBudW1iZXIgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIGBsYWJlbGAgaW4gdGhlIHN3aXRjaCBjb21wb25lbnQuXG4gICAgICogSWYgbm90IHNldCwgYGxhYmVsUG9zaXRpb25gIHdpbGwgaGF2ZSB2YWx1ZSBgXCJhZnRlclwiYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zd2l0Y2ggbGFiZWxQb3NpdGlvbj1cImJlZm9yZVwiPjwvaWd4LXN3aXRjaD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxhYmVsUG9zaXRpb24gPSAgdGhpcy5zd2l0Y2gubGFiZWxQb3NpdGlvbjtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsUG9zaXRpb246IFN3aXRjaExhYmVsUG9zaXRpb24gfCBzdHJpbmcgPSAnYWZ0ZXInO1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMvRGlzYWJsZXMgdGhlIHJpcHBsZSBlZmZlY3RcbiAgICAgKiBJZiBub3Qgc2V0LCBgZGlzYWJsZVJpcHBsZWAgd2lsbCBoYXZlIHZhbHVlIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIFtkaXNhYmxlUmlwcGxlXT1cInRydWVcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1JpcHBsZURpc2FibGVkID0gdGhpcy5zd2l0Y2guZGlzYWJsZVJpcHBsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVSaXBwbGUgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciBzd2l0Y2ggaXMgcmVxdWlyZWQuXG4gICAgICogSWYgbm90IHNldCwgYHJlcXVpcmVkYCB3aWxsIGhhdmUgdmFsdWUgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zd2l0Y2ggW3JlcXVpcmVkXT1cInRydWVcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1JlcXVpcmVkID0gdGhpcy5zd2l0Y2gucmVxdWlyZWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyByZXF1aXJlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGFyaWEtbGFiZWxsZWRCeWAgYXR0cmlidXRlLlxuICAgICAqIElmIG5vdCBzZXQsIHRoZSAgdmFsdWUgb2YgYGFyaWEtbGFiZWxsZWRCeWAgd2lsbCBiZSBlcXVhbCB0byB0aGUgdmFsdWUgb2YgYGxhYmVsSWRgIGF0dHJpYnV0ZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zd2l0Y2ggYXJpYS1sYWJlbGxlZGJ5ID0gXCJMYWJlbDFcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBhcmlhTGFiZWxsZWRCeSA9IHRoaXMuc3dpdGNoLmFyaWFMYWJlbGxlZEJ5O1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoJ2FyaWEtbGFiZWxsZWRieScpXG4gICAgcHVibGljIGFyaWFMYWJlbGxlZEJ5ID0gdGhpcy5sYWJlbElkO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIGFyaWEtbGFiZWw9XCJMYWJlbDFcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBhcmlhTGFiZWwgPSAgdGhpcy5zd2l0Y2guYXJpYUxhYmVsO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoJ2FyaWEtbGFiZWwnKVxuICAgIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciB0aGUgc3dpdGNoIHN0YXRlIGlzIGNoYW5nZWQuXG4gICAgICogUHJvdmlkZXMgcmVmZXJlbmNlcyB0byB0aGUgYElneFN3aXRjaENvbXBvbmVudGAgYW5kIHRoZSBgY2hlY2tlZGAgcHJvcGVydHkgYXMgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxJQ2hhbmdlU3dpdGNoRXZlbnRBcmdzPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoYW5nZVN3aXRjaEV2ZW50QXJncz4oKTtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9vbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyBvZiB0aGUgc3dpdGNoIGNvbXBvbmVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN3aXRjaENsYXNzID0gdGhpcy5zd2l0Y2guY3NzQ2xhc3M7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXN3aXRjaCcpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1zd2l0Y2gnO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBzd2l0Y2ggaXMgb24gb3Igb2ZmLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgJ2ZhbHNlJy5cbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtc3dpdGNoIFtjaGVja2VkXSA9IFwidHJ1ZVwiPjwvaWd4LXN3aXRjaD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzQ2hlY2tlZCA9ICB0aGlzLnN3aXRjaC5jaGVja2VkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1zd2l0Y2gtLWNoZWNrZWQnKVxuICAgIEBJbnB1dCgpIHB1YmxpYyBjaGVja2VkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgZGlzYWJsZWRgIGF0dHJpYnV0ZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIFtkaXNhYmxlZF0gPSBcInRydWVcIj48aWd4LXN3aXRjaD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzRGlzYWJsZWQgPSAgdGhpcy5zd2l0Y2guZGlzYWJsZWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXN3aXRjaC0tZGlzYWJsZWQnKVxuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBzd2l0Y2ggY29tcG9uZW50IGlzIG9uIGZvY3VzLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5zd2l0Y2guZm9jdXNlZCA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0ZvY3VzZWQgPSAgdGhpcy5zd2l0Y2guZm9jdXNlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtc3dpdGNoLS1mb2N1c2VkJylcbiAgICBwdWJsaWMgZm9jdXNlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpbnB1dElkID0gYCR7dGhpcy5pZH0taW5wdXRgO1xuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5zd2l0Y2gudG9nZ2xlKCk7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh7IGNoZWNrZWQ6IHRoaXMuY2hlY2tlZCwgc3dpdGNoOiB0aGlzIH0pO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHRoaXMuY2hlY2tlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBfb25Td2l0Y2hDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBfb25Td2l0Y2hDbGljayhldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy50b2dnbGUoKTtcblxuICAgICAgICBpZiAoaXNJRSgpKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUNoZWNrYm94Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBfb25MYWJlbENsaWNrKGV2ZW50KSB7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZvY3VzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvbkJsdXIoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY2hlY2tlZCA9ICEhdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZ2V0RWRpdEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZUNoZWNrYm94Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBsYWJlbENsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5sYWJlbFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIFN3aXRjaExhYmVsUG9zaXRpb24uQkVGT1JFOlxuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmNzc0NsYXNzfV9fbGFiZWwtLWJlZm9yZWA7XG4gICAgICAgICAgICBjYXNlIFN3aXRjaExhYmVsUG9zaXRpb24uQUZURVI6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmNzc0NsYXNzfV9fbGFiZWxgO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogYW55KSA9PiB2b2lkKSB7IHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjsgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCkgeyB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IGZuOyB9XG59XG5cbmV4cG9ydCBjb25zdCBJR1hfU1dJVENIX1JFUVVJUkVEX1ZBTElEQVRPUjogUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJZ3hTd2l0Y2hSZXF1aXJlZERpcmVjdGl2ZSksXG4gICAgbXVsdGk6IHRydWVcbn07XG5cbi8qIHRzbGludDpkaXNhYmxlIGRpcmVjdGl2ZS1zZWxlY3RvciAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6IGBpZ3gtc3dpdGNoW3JlcXVpcmVkXVtmb3JtQ29udHJvbE5hbWVdLFxuICAgIGlneC1zd2l0Y2hbcmVxdWlyZWRdW2Zvcm1Db250cm9sXSxcbiAgICBpZ3gtc3dpdGNoW3JlcXVpcmVkXVtuZ01vZGVsXWAsXG4gICAgcHJvdmlkZXJzOiBbSUdYX1NXSVRDSF9SRVFVSVJFRF9WQUxJREFUT1JdXG59KVxuZXhwb3J0IGNsYXNzIElneFN3aXRjaFJlcXVpcmVkRGlyZWN0aXZlIGV4dGVuZHMgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvciB7IH1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbSWd4U3dpdGNoQ29tcG9uZW50LCBJZ3hTd2l0Y2hSZXF1aXJlZERpcmVjdGl2ZV0sXG4gICAgZXhwb3J0czogW0lneFN3aXRjaENvbXBvbmVudCwgSWd4U3dpdGNoUmVxdWlyZWREaXJlY3RpdmVdLFxuICAgIGltcG9ydHM6IFtJZ3hSaXBwbGVNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIElneFN3aXRjaE1vZHVsZSB7IH1cbiJdfQ==