UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

398 lines 39.3 kB
/** * © 2025 Visa * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ import { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion'; import { ContentChild, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, Input, Output, QueryList } from '@angular/core'; import { BaseInteractiveDirective } from '../_utilities/angular-specific-directives/base-interactive.directive'; import { BadgeDirective } from '../badge/badge.directive'; import { IconToggleComponent } from '../icon-toggle/icon-toggle.component'; import { IconToggleDirective } from '../icon-toggle/icon-toggle.directive'; import { IconComponent } from '../icon/icon.component'; import { ButtonColor, ButtonSize } from './button.constants'; import * as i0 from "@angular/core"; export class ButtonDirective extends BaseInteractiveDirective { get hostId() { return this.id; } get hostType() { return this.type; } /** * Provides custom class&#40;es&#41; for custom styling. * @default .v-button.v-button-&lt;buttonColor&gt;.v-button-&lt;buttonSize&gt; */ get class() { return [ this._class, 'v-button', this.buttonColor !== ButtonColor.PRIMARY ? 'v-button-' + this.buttonColor : '', this.buttonSize !== ButtonSize.MEDIUM ? 'v-button-' + this.buttonSize : '', this.subtle ? 'v-button-subtle' : '', this.destructive ? 'v-button-destructive' : '' ].join(' '); } set class(value) { this._class = value; } get hostClass() { return this.class; } /** * Sets button size. * @default 'medium' / ButtonSize.MEDIUM * @options 'small' | ButtonSize.SMALL | <br> 'medium' | ButtonSize.MEDIUM | <br> 'large' | ButtonSize.LARGE */ get buttonSize() { return this._buttonSize; } set buttonSize(value) { this._buttonSize = value; this._buttonSizeSetByUser = true; } /** * Sets button color scheme. * @default 'primary' / ButtonColor.PRIMARY * @options 'primary' | ButtonSize.PRIMARY | <br> 'secondary' | ButtonSize.SECONDARY | <br> 'tertiary' | ButtonSize.TERTIARY */ get buttonColor() { return this._buttonColor; } set buttonColor(value) { this._buttonColor = value; this._buttonColorSetByUser = true; } /** * Sets button to subtle variant when true. * @default false */ get subtle() { return this._subtle; } set subtle(value) { this._subtle = coerceBooleanProperty(value); } /** * Sets button to destructive variant when true. * @default false */ get destructive() { return this._destructive; } set destructive(value) { this._destructive = coerceBooleanProperty(value); } /** * Disables button when true. * @default false */ get disabled() { return this._disabled; } set disabled(value) { this._disabled = coerceBooleanProperty(value); this.disabledChange.emit(this.disabled); } /** * Aria attribute pointing to id of descriptive element. <br /> * If the button has a badge, the <code>aria-describedby</code> will be set to the badge's id by default. * @default false */ get ariaDescribedby() { return this._ariaDescribedby; } set ariaDescribedby(value) { this._ariaDescribedby = value; } get hostAriaDescribedby() { if (this.ariaDescribedby !== null) { return this.ariaDescribedby; } } constructor(el) { super(el); this._roleSetByUser = false; // prevents parent component from overriding if role if role is given directly by user this._buttonColorSetByUser = false; // prevents parent component from overriding if buttonColor if buttonColor is given directly by user this._buttonSizeSetByUser = false; // prevents parent component from overriding if buttonSize if buttonSize is given directly by user /** * Sets custom type. * @default 'button' */ this.type = 'button'; this._class = ''; this._buttonSize = ButtonSize.MEDIUM; this._buttonColor = ButtonColor.PRIMARY; this._subtle = false; this._destructive = false; this._disabled = false; /** * Emits a boolean value indicating the new disabled state when the disabled state changes. */ this.disabledChange = new EventEmitter(); this._ariaDescribedby = null; this._roleSetByTab = false; this._isInNavOrNested = false; this._ariaSelected = null; this._ariaCurrent = null; this._ariaExpanded = null; this._ariaDisabled = false; this._ariaControls = null; /** Below needed for combobox */ this._inCombobox = false; } // used in accordion service ngAfterContentInit() { if (this.badge) { this.ariaDescribedby = this.badge.id; } } /** * Sets role of button. <br /> * If no custom role is set, role may be set by a parent component (nav, tabs, etc.). * @builtin true */ get role() { return this._role; } set role(value) { this._role = value; this._roleSetByUser = true; } get hostRole() { if (this.role || this.role === null) return this.role; } /** * Aria attribute relaying whether button is selected. <br /> * <code>aria-current</code> and <code>aria-selected</code> should not be used together. * @default null * @builtin true */ get ariaSelected() { return this._ariaSelected; } set ariaSelected(value) { this._ariaSelected = coerceBooleanProperty(value); } get hostAriaSelected() { if (this.ariaSelected !== null && !this._isInNavOrNested) { return this.ariaSelected.toString(); } } /** * Aria attribute relaying whether button is selected. <br /> * <code>aria-current</code> and <code>aria-selected</code> should not be used together. * @default null * @builtin true */ get ariaCurrent() { return this._ariaCurrent; } set ariaCurrent(value) { if (value === 'page') { this._ariaCurrent = value; } else this._ariaCurrent = coerceBooleanProperty(value); } get hostAriaCurrent() { if (this.ariaCurrent !== null) { return this.ariaCurrent.toString(); } } /** * Aria attribute relaying whether button is expanded. * @default null * @builtin true */ get ariaExpanded() { return this._ariaExpanded; } set ariaExpanded(value) { this._ariaExpanded = coerceBooleanProperty(value); } get hostAriaExpanded() { if (this.ariaExpanded !== null) { return this.ariaExpanded.toString(); } } /** * Sets aria disabled state for accessibility purposes. <br /> * When true, indicates that the button is disabled and not interactive. * @default false */ get ariaDisabled() { return this._ariaDisabled; } set ariaDisabled(value) { this._ariaDisabled = coerceBooleanProperty(value); } /** * Aria attribute relaying what element the button controls. * @default null * @default '&lt;accordion-panel-id&gt;' when button is used within Accordion. * @default '&lt;panel-content-id&gt;' when button is used within Panel. * @builtin true */ get ariaControls() { return this._ariaControls; } set ariaControls(value) { this._ariaControls = value; } get hostAriaControls() { if (this.ariaControls !== null) { return this.ariaControls; } } /** * Sets button to combobox toggle button when true. * @default false * @default true when button is used within combobox and no custom value is given. * @builtin true */ get ariaHaspopup() { return this._ariaHaspopup; } set ariaHaspopup(value) { this._ariaHaspopup = coerceBooleanProperty(value); } get hostAriaHaspopup() { if (!this.ariaHaspopup && this._inCombobox) { return 'true'; } else if (this.ariaHaspopup) { return this.ariaHaspopup.toString(); } } /** * Sets button's tabIndex. * @default null * @default -1 when button is used within combobox and no custom value is given. * @builtin true */ get tabindex() { return this._tabindex; } set tabindex(value) { this._tabindex = coerceNumberProperty(value); } get hostTabindex() { if (!this.tabindex && (this._inCombobox || this.ariaDisabled)) { return '-1'; } else if (this.tabindex) { return this.tabindex.toString(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ButtonDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: ButtonDirective, isStandalone: true, selector: "[v-button], [v-button-icon], [v-button-stacked], [v-panel-toggle]", inputs: { id: "id", type: "type", class: "class", buttonSize: "buttonSize", buttonColor: "buttonColor", subtle: "subtle", destructive: "destructive", disabled: "disabled", ariaDescribedby: ["aria-describedby", "ariaDescribedby"], role: "role", ariaSelected: ["aria-selected", "ariaSelected"], ariaCurrent: ["aria-current", "ariaCurrent"], ariaExpanded: ["aria-expanded", "ariaExpanded"], ariaDisabled: ["aria-disabled", "ariaDisabled"], ariaControls: ["aria-controls", "ariaControls"], ariaHaspopup: ["aria-haspopup", "ariaHaspopup"], tabindex: "tabindex" }, outputs: { disabledChange: "disabledChange" }, host: { properties: { "attr.id": "this.hostId", "attr.type": "this.hostType", "class": "this.hostClass", "attr.aria-describedby": "this.hostAriaDescribedby", "attr.role": "this.hostRole", "attr.aria-selected": "this.hostAriaSelected", "attr.aria-current": "this.hostAriaCurrent", "attr.aria-expanded": "this.hostAriaExpanded", "attr.aria-controls": "this.hostAriaControls", "attr.aria-haspopup": "this.hostAriaHaspopup", "attr.tabindex": "this.hostTabindex" } }, queries: [{ propertyName: "badge", first: true, predicate: BadgeDirective, descendants: true }, { propertyName: "toggleIcon", first: true, predicate: IconToggleDirective, descendants: true }, { propertyName: "toggleIconComponent", first: true, predicate: IconToggleComponent, descendants: true }, { propertyName: "icons", predicate: IconComponent }], usesInheritance: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ButtonDirective, decorators: [{ type: Directive, args: [{ standalone: true, // tslint:disable-next-line:directive-selector selector: '[v-button], [v-button-icon], [v-button-stacked], [v-panel-toggle]' }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { badge: [{ type: ContentChild, args: [BadgeDirective] }], id: [{ type: Input }], hostId: [{ type: HostBinding, args: ['attr.id'] }], type: [{ type: Input }], hostType: [{ type: HostBinding, args: ['attr.type'] }], class: [{ type: Input }], hostClass: [{ type: HostBinding, args: ['class'] }], buttonSize: [{ type: Input }], buttonColor: [{ type: Input }], subtle: [{ type: Input }], destructive: [{ type: Input }], disabled: [{ type: Input }], disabledChange: [{ type: Output }], ariaDescribedby: [{ type: Input, args: ['aria-describedby'] }], hostAriaDescribedby: [{ type: HostBinding, args: ['attr.aria-describedby'] }], icons: [{ type: ContentChildren, args: [IconComponent] }], role: [{ type: Input }], hostRole: [{ type: HostBinding, args: ['attr.role'] }], ariaSelected: [{ type: Input, args: ['aria-selected'] }], hostAriaSelected: [{ type: HostBinding, args: ['attr.aria-selected'] }], ariaCurrent: [{ type: Input, args: ['aria-current'] }], hostAriaCurrent: [{ type: HostBinding, args: ['attr.aria-current'] }], ariaExpanded: [{ type: Input, args: ['aria-expanded'] }], hostAriaExpanded: [{ type: HostBinding, args: ['attr.aria-expanded'] }], ariaDisabled: [{ type: Input, args: ['aria-disabled'] }], toggleIcon: [{ type: ContentChild, args: [IconToggleDirective] }], toggleIconComponent: [{ type: ContentChild, args: [IconToggleComponent] }], ariaControls: [{ type: Input, args: ['aria-controls'] }], hostAriaControls: [{ type: HostBinding, args: ['attr.aria-controls'] }], ariaHaspopup: [{ type: Input, args: ['aria-haspopup'] }], hostAriaHaspopup: [{ type: HostBinding, args: ['attr.aria-haspopup'] }], tabindex: [{ type: Input }], hostTabindex: [{ type: HostBinding, args: ['attr.tabindex'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQTZCLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0csT0FBTyxFQUVMLFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFPN0QsTUFBTSxPQUFPLGVBQWdCLFNBQVEsd0JBQXdCO0lBVzNELElBQ0ksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBUUQsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNJLEtBQUs7UUFDUCxPQUFPO1lBQ0wsSUFBSSxDQUFDLE1BQU07WUFDWCxVQUFVO1lBQ1YsSUFBSSxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM5RSxJQUFJLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQy9DLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQ0ksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQ0ksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsS0FBaUI7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBR0Q7Ozs7T0FJRztJQUNILElBQ0ksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBQ0QsSUFBSSxXQUFXLENBQUMsS0FBa0I7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztJQUNwQyxDQUFDO0lBR0Q7OztPQUdHO0lBQ0gsSUFDSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFtQjtRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFHRDs7O09BR0c7SUFDSCxJQUNJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLEtBQW1CO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUdEOzs7T0FHRztJQUNILElBQ0ksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsS0FBbUI7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQVFEOzs7O09BSUc7SUFDSCxJQUNJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksZUFBZSxDQUFDLEtBQUs7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBR0QsSUFDSSxtQkFBbUI7UUFDckIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVksRUFBYztRQUN4QixLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFsSlosbUJBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxzRkFBc0Y7UUFDOUcsMEJBQXFCLEdBQUcsS0FBSyxDQUFDLENBQUMsb0dBQW9HO1FBQ25JLHlCQUFvQixHQUFHLEtBQUssQ0FBQyxDQUFDLGtHQUFrRztRQVloSTs7O1dBR0c7UUFFSCxTQUFJLEdBQVcsUUFBUSxDQUFDO1FBd0J4QixXQUFNLEdBQVcsRUFBRSxDQUFDO1FBbUJwQixnQkFBVyxHQUFlLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFlNUMsaUJBQVksR0FBZ0IsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQWFoRCxZQUFPLEdBQVksS0FBSyxDQUFDO1FBYXpCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBYzlCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFFM0I7O1dBRUc7UUFDZ0IsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBY2hFLHFCQUFnQixHQUFrQixJQUFJLENBQUM7UUFxQnZDLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQWlDbEMsa0JBQWEsR0FBbUIsSUFBSSxDQUFDO1FBd0JyQyxpQkFBWSxHQUE0QixJQUFJLENBQUM7UUFxQjdDLGtCQUFhLEdBQW1CLElBQUksQ0FBQztRQW9CckMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFvQi9CLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQVNwQyxnQ0FBZ0M7UUFDaEMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7SUEzSXBCLENBQUMsQ0FBQyw0QkFBNEI7SUFFOUIsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQU1EOzs7O09BSUc7SUFDSCxJQUNJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLEtBQW9CO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUNJLFFBQVE7UUFDVixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQ0ksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxZQUFZLENBQUMsS0FBbUI7UUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBR0QsSUFDSSxnQkFBZ0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFDSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLFdBQVcsQ0FBQyxLQUFtQjtRQUNqQyxJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDOztZQUFNLElBQUksQ0FBQyxZQUFZLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUdELElBQ0ksZUFBZTtRQUNqQixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQ0ksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxZQUFZLENBQUMsS0FBbUI7UUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsSUFDSSxnQkFBZ0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUNJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUNELElBQUksWUFBWSxDQUFDLEtBQW1CO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQU9EOzs7Ozs7T0FNRztJQUNILElBQ0ksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxZQUFZLENBQUMsS0FBSztRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBR0QsSUFDSSxnQkFBZ0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUtEOzs7OztPQUtHO0lBQ0gsSUFDSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLFlBQVksQ0FBQyxLQUFtQjtRQUNsQyxJQUFJLENBQUMsYUFBYSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxJQUNJLGdCQUFnQjtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDM0MsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFrQjtRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUNJLFlBQVk7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDOUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDOytHQTlVVSxlQUFlO21HQUFmLGVBQWUsNnNDQUNaLGNBQWMsNkVBb1FkLG1CQUFtQixzRkFDbkIsbUJBQW1CLDJEQXhHaEIsYUFBYTs7NEZBOUpuQixlQUFlO2tCQUwzQixTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQiw4Q0FBOEM7b0JBQzlDLFFBQVEsRUFBRSxtRUFBbUU7aUJBQzlFOytFQUUrQixLQUFLO3NCQUFsQyxZQUFZO3VCQUFDLGNBQWM7Z0JBUzVCLEVBQUU7c0JBREQsS0FBSztnQkFHRixNQUFNO3NCQURULFdBQVc7dUJBQUMsU0FBUztnQkFVdEIsSUFBSTtzQkFESCxLQUFLO2dCQUdGLFFBQVE7c0JBRFgsV0FBVzt1QkFBQyxXQUFXO2dCQVVwQixLQUFLO3NCQURSLEtBQUs7Z0JBZ0JGLFNBQVM7c0JBRFosV0FBVzt1QkFBQyxPQUFPO2dCQVdoQixVQUFVO3NCQURiLEtBQUs7Z0JBZ0JGLFdBQVc7c0JBRGQsS0FBSztnQkFlRixNQUFNO3NCQURULEtBQUs7Z0JBY0YsV0FBVztzQkFEZCxLQUFLO2dCQWNGLFFBQVE7c0JBRFgsS0FBSztnQkFhYSxjQUFjO3NCQUFoQyxNQUFNO2dCQVFILGVBQWU7c0JBRGxCLEtBQUs7dUJBQUMsa0JBQWtCO2dCQVVyQixtQkFBbUI7c0JBRHRCLFdBQVc7dUJBQUMsdUJBQXVCO2dCQWtCSixLQUFLO3NCQUFwQyxlQUFlO3VCQUFDLGFBQWE7Z0JBUzFCLElBQUk7c0JBRFAsS0FBSztnQkFVRixRQUFRO3NCQURYLFdBQVc7dUJBQUMsV0FBVztnQkFZcEIsWUFBWTtzQkFEZixLQUFLO3VCQUFDLGVBQWU7Z0JBVWxCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBYzdCLFdBQVc7c0JBRGQsS0FBSzt1QkFBQyxjQUFjO2dCQVlqQixlQUFlO3NCQURsQixXQUFXO3VCQUFDLG1CQUFtQjtnQkFhNUIsWUFBWTtzQkFEZixLQUFLO3VCQUFDLGVBQWU7Z0JBU2xCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBYTdCLFlBQVk7c0JBRGYsS0FBSzt1QkFBQyxlQUFlO2dCQVVhLFVBQVU7c0JBQTVDLFlBQVk7dUJBQUMsbUJBQW1CO2dCQUNFLG1CQUFtQjtzQkFBckQsWUFBWTt1QkFBQyxtQkFBbUI7Z0JBVTdCLFlBQVk7c0JBRGYsS0FBSzt1QkFBQyxlQUFlO2dCQVVsQixnQkFBZ0I7c0JBRG5CLFdBQVc7dUJBQUMsb0JBQW9CO2dCQWlCN0IsWUFBWTtzQkFEZixLQUFLO3VCQUFDLGVBQWU7Z0JBU2xCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBZ0I3QixRQUFRO3NCQURYLEtBQUs7Z0JBU0YsWUFBWTtzQkFEZixXQUFXO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgTnVtYmVySW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZUludGVyYWN0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9hbmd1bGFyLXNwZWNpZmljLWRpcmVjdGl2ZXMvYmFzZS1pbnRlcmFjdGl2ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQmFkZ2VEaXJlY3RpdmUgfSBmcm9tICcuLi9iYWRnZS9iYWRnZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWNvblRvZ2dsZUNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24tdG9nZ2xlL2ljb24tdG9nZ2xlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJY29uVG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi4vaWNvbi10b2dnbGUvaWNvbi10b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbkNvbG9yLCBCdXR0b25TaXplIH0gZnJvbSAnLi9idXR0b24uY29uc3RhbnRzJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbdi1idXR0b25dLCBbdi1idXR0b24taWNvbl0sIFt2LWJ1dHRvbi1zdGFja2VkXSwgW3YtcGFuZWwtdG9nZ2xlXSdcbn0pXG5leHBvcnQgY2xhc3MgQnV0dG9uRGlyZWN0aXZlIGV4dGVuZHMgQmFzZUludGVyYWN0aXZlRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBDb250ZW50Q2hpbGQoQmFkZ2VEaXJlY3RpdmUpIGJhZGdlOiBCYWRnZURpcmVjdGl2ZTtcbiAgX3JvbGVTZXRCeVVzZXIgPSBmYWxzZTsgLy8gcHJldmVudHMgcGFyZW50IGNvbXBvbmVudCBmcm9tIG92ZXJyaWRpbmcgaWYgcm9sZSBpZiByb2xlIGlzIGdpdmVuIGRpcmVjdGx5IGJ5IHVzZXJcbiAgX2J1dHRvbkNvbG9yU2V0QnlVc2VyID0gZmFsc2U7IC8vIHByZXZlbnRzIHBhcmVudCBjb21wb25lbnQgZnJvbSBvdmVycmlkaW5nIGlmIGJ1dHRvbkNvbG9yIGlmIGJ1dHRvbkNvbG9yIGlzIGdpdmVuIGRpcmVjdGx5IGJ5IHVzZXJcbiAgX2J1dHRvblNpemVTZXRCeVVzZXIgPSBmYWxzZTsgLy8gcHJldmVudHMgcGFyZW50IGNvbXBvbmVudCBmcm9tIG92ZXJyaWRpbmcgaWYgYnV0dG9uU2l6ZSBpZiBidXR0b25TaXplIGlzIGdpdmVuIGRpcmVjdGx5IGJ5IHVzZXJcblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gaWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBpZDogc3RyaW5nO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICBnZXQgaG9zdElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gdHlwZS5cbiAgICogQGRlZmF1bHQgJ2J1dHRvbidcbiAgICovXG4gIEBJbnB1dCgpXG4gIHR5cGU6IHN0cmluZyA9ICdidXR0b24nO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIudHlwZScpXG4gIGdldCBob3N0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgY3VzdG9tIGNsYXNzJiM0MDtlcyYjNDE7IGZvciBjdXN0b20gc3R5bGluZy5cbiAgICogQGRlZmF1bHQgLnYtYnV0dG9uLnYtYnV0dG9uLSZsdDtidXR0b25Db2xvciZndDsudi1idXR0b24tJmx0O2J1dHRvblNpemUmZ3Q7XG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5fY2xhc3MsXG4gICAgICAndi1idXR0b24nLFxuICAgICAgdGhpcy5idXR0b25Db2xvciAhPT0gQnV0dG9uQ29sb3IuUFJJTUFSWSA/ICd2LWJ1dHRvbi0nICsgdGhpcy5idXR0b25Db2xvciA6ICcnLFxuICAgICAgdGhpcy5idXR0b25TaXplICE9PSBCdXR0b25TaXplLk1FRElVTSA/ICd2LWJ1dHRvbi0nICsgdGhpcy5idXR0b25TaXplIDogJycsXG4gICAgICB0aGlzLnN1YnRsZSA/ICd2LWJ1dHRvbi1zdWJ0bGUnIDogJycsXG4gICAgICB0aGlzLmRlc3RydWN0aXZlID8gJ3YtYnV0dG9uLWRlc3RydWN0aXZlJyA6ICcnXG4gICAgXS5qb2luKCcgJyk7XG4gIH1cbiAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jbGFzcyA9IHZhbHVlO1xuICB9XG4gIF9jbGFzczogc3RyaW5nID0gJyc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBidXR0b24gc2l6ZS5cbiAgICogQGRlZmF1bHQgJ21lZGl1bScgLyBCdXR0b25TaXplLk1FRElVTVxuICAgKiBAb3B0aW9ucyAnc21hbGwnIHwgQnV0dG9uU2l6ZS5TTUFMTCB8IDxicj4gJ21lZGl1bScgfCBCdXR0b25TaXplLk1FRElVTSB8IDxicj4gJ2xhcmdlJyB8IEJ1dHRvblNpemUuTEFSR0VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBidXR0b25TaXplKCk6IEJ1dHRvblNpemUge1xuICAgIHJldHVybiB0aGlzLl9idXR0b25TaXplO1xuICB9XG4gIHNldCBidXR0b25TaXplKHZhbHVlOiBCdXR0b25TaXplKSB7XG4gICAgdGhpcy5fYnV0dG9uU2l6ZSA9IHZhbHVlO1xuICAgIHRoaXMuX2J1dHRvblNpemVTZXRCeVVzZXIgPSB0cnVlO1xuICB9XG4gIF9idXR0b25TaXplOiBCdXR0b25TaXplID0gQnV0dG9uU2l6ZS5NRURJVU07XG5cbiAgLyoqXG4gICAqIFNldHMgYnV0dG9uIGNvbG9yIHNjaGVtZS5cbiAgICogQGRlZmF1bHQgJ3ByaW1hcnknIC8gQnV0dG9uQ29sb3IuUFJJTUFSWVxuICAgKiBAb3B0aW9ucyAncHJpbWFyeScgfCBCdXR0b25TaXplLlBSSU1BUlkgfCA8YnI+ICdzZWNvbmRhcnknIHwgQnV0dG9uU2l6ZS5TRUNPTkRBUlkgfCA8YnI+ICd0ZXJ0aWFyeScgfCBCdXR0b25TaXplLlRFUlRJQVJZXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgYnV0dG9uQ29sb3IoKTogQnV0dG9uQ29sb3Ige1xuICAgIHJldHVybiB0aGlzLl9idXR0b25Db2xvcjtcbiAgfVxuICBzZXQgYnV0dG9uQ29sb3IodmFsdWU6IEJ1dHRvbkNvbG9yKSB7XG4gICAgdGhpcy5fYnV0dG9uQ29sb3IgPSB2YWx1ZTtcbiAgICB0aGlzLl9idXR0b25Db2xvclNldEJ5VXNlciA9IHRydWU7XG4gIH1cbiAgX2J1dHRvbkNvbG9yOiBCdXR0b25Db2xvciA9IEJ1dHRvbkNvbG9yLlBSSU1BUlk7XG5cbiAgLyoqXG4gICAqIFNldHMgYnV0dG9uIHRvIHN1YnRsZSB2YXJpYW50IHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBzdWJ0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnRsZTtcbiAgfVxuICBzZXQgc3VidGxlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9zdWJ0bGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9zdWJ0bGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyBidXR0b24gdG8gZGVzdHJ1Y3RpdmUgdmFyaWFudCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGVzdHJ1Y3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc3RydWN0aXZlO1xuICB9XG4gIHNldCBkZXN0cnVjdGl2ZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGVzdHJ1Y3RpdmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9kZXN0cnVjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyBidXR0b24gd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLmRpc2FibGVkQ2hhbmdlLmVtaXQodGhpcy5kaXNhYmxlZCk7XG4gIH1cbiAgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBuZXcgZGlzYWJsZWQgc3RhdGUgd2hlbiB0aGUgZGlzYWJsZWQgc3RhdGUgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBkaXNhYmxlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogQXJpYSBhdHRyaWJ1dGUgcG9pbnRpbmcgdG8gaWQgb2YgZGVzY3JpcHRpdmUgZWxlbWVudC4gPGJyIC8+XG4gICAqIElmIHRoZSBidXR0b24gaGFzIGEgYmFkZ2UsIHRoZSA8Y29kZT5hcmlhLWRlc2NyaWJlZGJ5PC9jb2RlPiB3aWxsIGJlIHNldCB0byB0aGUgYmFkZ2UncyBpZCBieSBkZWZhdWx0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLWRlc2NyaWJlZGJ5JylcbiAgZ2V0IGFyaWFEZXNjcmliZWRieSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYURlc2NyaWJlZGJ5O1xuICB9XG4gIHNldCBhcmlhRGVzY3JpYmVkYnkodmFsdWUpIHtcbiAgICB0aGlzLl9hcmlhRGVzY3JpYmVkYnkgPSB2YWx1ZTtcbiAgfVxuICBfYXJpYURlc2NyaWJlZGJ5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kZXNjcmliZWRieScpXG4gIGdldCBob3N0QXJpYURlc2NyaWJlZGJ5KCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmFyaWFEZXNjcmliZWRieSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYURlc2NyaWJlZGJ5O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGVsOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoZWwpO1xuICB9IC8vIHVzZWQgaW4gYWNjb3JkaW9uIHNlcnZpY2VcblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmFkZ2UpIHtcbiAgICAgIHRoaXMuYXJpYURlc2NyaWJlZGJ5ID0gdGhpcy5iYWRnZS5pZDtcbiAgICB9XG4gIH1cblxuICAvKiogQmVsb3cgaXRlbXMgbmVlZGVkIGZvciB0YWIgKi9cbiAgQENvbnRlbnRDaGlsZHJlbihJY29uQ29tcG9uZW50KSBpY29uczogUXVlcnlMaXN0PEljb25Db21wb25lbnQ+O1xuICBfcm9sZVNldEJ5VGFiOiBib29sZWFuID0gZmFsc2U7XG4gIF9pc0luTmF2T3JOZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldHMgcm9sZSBvZiBidXR0b24uIDxiciAvPlxuICAgKiBJZiBubyBjdXN0b20gcm9sZSBpcyBzZXQsIHJvbGUgbWF5IGJlIHNldCBieSBhIHBhcmVudCBjb21wb25lbnQgKG5hdiwgdGFicywgZXRjLikuXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByb2xlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yb2xlO1xuICB9XG4gIHNldCByb2xlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fcm9sZSA9IHZhbHVlO1xuICAgIHRoaXMuX3JvbGVTZXRCeVVzZXIgPSB0cnVlO1xuICB9XG4gIF9yb2xlOiBzdHJpbmcgfCBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gIGdldCBob3N0Um9sZSgpOiBzdHJpbmcgfCB2b2lkIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMucm9sZSB8fCB0aGlzLnJvbGUgPT09IG51bGwpIHJldHVybiB0aGlzLnJvbGU7XG4gIH1cblxuICAvKipcbiAgICogQXJpYSBhdHRyaWJ1dGUgcmVsYXlpbmcgd2hldGhlciBidXR0b24gaXMgc2VsZWN0ZWQuIDxiciAvPlxuICAgKiA8Y29kZT5hcmlhLWN1cnJlbnQ8L2NvZGU+IGFuZCA8Y29kZT5hcmlhLXNlbGVjdGVkPC9jb2RlPiBzaG91bGQgbm90IGJlIHVzZWQgdG9nZXRoZXIuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLXNlbGVjdGVkJylcbiAgZ2V0IGFyaWFTZWxlY3RlZCgpOiBib29sZWFuIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FyaWFTZWxlY3RlZDtcbiAgfVxuICBzZXQgYXJpYVNlbGVjdGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9hcmlhU2VsZWN0ZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9hcmlhU2VsZWN0ZWQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1zZWxlY3RlZCcpXG4gIGdldCBob3N0QXJpYVNlbGVjdGVkKCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmFyaWFTZWxlY3RlZCAhPT0gbnVsbCAmJiAhdGhpcy5faXNJbk5hdk9yTmVzdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhU2VsZWN0ZWQudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXJpYSBhdHRyaWJ1dGUgcmVsYXlpbmcgd2hldGhlciBidXR0b24gaXMgc2VsZWN0ZWQuIDxiciAvPlxuICAgKiA8Y29kZT5hcmlhLWN1cnJlbnQ8L2NvZGU+IGFuZCA8Y29kZT5hcmlhLXNlbGVjdGVkPC9jb2RlPiBzaG91bGQgbm90IGJlIHVzZWQgdG9nZXRoZXIuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLWN1cnJlbnQnKVxuICBnZXQgYXJpYUN1cnJlbnQoKTogYm9vbGVhbiB8IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hcmlhQ3VycmVudDtcbiAgfVxuICBzZXQgYXJpYUN1cnJlbnQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3BhZ2UnKSB7XG4gICAgICB0aGlzLl9hcmlhQ3VycmVudCA9IHZhbHVlO1xuICAgIH0gZWxzZSB0aGlzLl9hcmlhQ3VycmVudCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2FyaWFDdXJyZW50OiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtY3VycmVudCcpXG4gIGdldCBob3N0QXJpYUN1cnJlbnQoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYUN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFDdXJyZW50LnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFyaWEgYXR0cmlidXRlIHJlbGF5aW5nIHdoZXRoZXIgYnV0dG9uIGlzIGV4cGFuZGVkLlxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgnYXJpYS1leHBhbmRlZCcpXG4gIGdldCBhcmlhRXhwYW5kZWQoKTogYm9vbGVhbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hcmlhRXhwYW5kZWQ7XG4gIH1cbiAgc2V0IGFyaWFFeHBhbmRlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fYXJpYUV4cGFuZGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfYXJpYUV4cGFuZGVkOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWV4cGFuZGVkJylcbiAgZ2V0IGhvc3RBcmlhRXhwYW5kZWQoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYUV4cGFuZGVkICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhRXhwYW5kZWQudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhcmlhIGRpc2FibGVkIHN0YXRlIGZvciBhY2Nlc3NpYmlsaXR5IHB1cnBvc2VzLiA8YnIgLz5cbiAgICogV2hlbiB0cnVlLCBpbmRpY2F0ZXMgdGhhdCB0aGUgYnV0dG9uIGlzIGRpc2FibGVkIGFuZCBub3QgaW50ZXJhY3RpdmUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtZGlzYWJsZWQnKVxuICBnZXQgYXJpYURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hcmlhRGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGFyaWFEaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fYXJpYURpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfYXJpYURpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEJlbG93IG5lZWRlZCBmb3IgQWNjb3JkaW9uICovXG4gIEBDb250ZW50Q2hpbGQoSWNvblRvZ2dsZURpcmVjdGl2ZSkgdG9nZ2xlSWNvbjogSWNvblRvZ2dsZURpcmVjdGl2ZTtcbiAgQENvbnRlbnRDaGlsZChJY29uVG9nZ2xlQ29tcG9uZW50KSB0b2dnbGVJY29uQ29tcG9uZW50OiBJY29uVG9nZ2xlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBcmlhIGF0dHJpYnV0ZSByZWxheWluZyB3aGF0IGVsZW1lbnQgdGhlIGJ1dHRvbiBjb250cm9scy5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAZGVmYXVsdCAnJmx0O2FjY29yZGlvbi1wYW5lbC1pZCZndDsnIHdoZW4gYnV0dG9uIGlzIHVzZWQgd2l0aGluIEFjY29yZGlvbi5cbiAgICogQGRlZmF1bHQgJyZsdDtwYW5lbC1jb250ZW50LWlkJmd0Oycgd2hlbiBidXR0b24gaXMgdXNlZCB3aXRoaW4gUGFuZWwuXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgnYXJpYS1jb250cm9scycpXG4gIGdldCBhcmlhQ29udHJvbHMoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FyaWFDb250cm9scztcbiAgfVxuICBzZXQgYXJpYUNvbnRyb2xzKHZhbHVlKSB7XG4gICAgdGhpcy5fYXJpYUNvbnRyb2xzID0gdmFsdWU7XG4gIH1cbiAgX2FyaWFDb250cm9sczogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtY29udHJvbHMnKVxuICBnZXQgaG9zdEFyaWFDb250cm9scygpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5hcmlhQ29udHJvbHMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFDb250cm9scztcbiAgICB9XG4gIH1cblxuICAvKiogQmVsb3cgbmVlZGVkIGZvciBjb21ib2JveCAqL1xuICBfaW5Db21ib2JveCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIGJ1dHRvbiB0byBjb21ib2JveCB0b2dnbGUgYnV0dG9uIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGRlZmF1bHQgdHJ1ZSB3aGVuIGJ1dHRvbiBpcyB1c2VkIHdpdGhpbiBjb21ib2JveCBhbmQgbm8gY3VzdG9tIHZhbHVlIGlzIGdpdmVuLlxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtaGFzcG9wdXAnKVxuICBnZXQgYXJpYUhhc3BvcHVwKCk6IGJvb2xlYW4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYUhhc3BvcHVwO1xuICB9XG4gIHNldCBhcmlhSGFzcG9wdXAodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2FyaWFIYXNwb3B1cCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2FyaWFIYXNwb3B1cDogYm9vbGVhbiB8IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWhhc3BvcHVwJylcbiAgZ2V0IGhvc3RBcmlhSGFzcG9wdXAoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFyaWFIYXNwb3B1cCAmJiB0aGlzLl9pbkNvbWJvYm94KSB7XG4gICAgICByZXR1cm4gJ3RydWUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hcmlhSGFzcG9wdXApIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFIYXNwb3B1cC50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGJ1dHRvbidzIHRhYkluZGV4LlxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqIEBkZWZhdWx0IC0xIHdoZW4gYnV0dG9uIGlzIHVzZWQgd2l0aGluIGNvbWJvYm94IGFuZCBubyBjdXN0b20gdmFsdWUgaXMgZ2l2ZW4uXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiaW5kZXg7XG4gIH1cbiAgc2V0IHRhYmluZGV4KHZhbHVlOiBOdW1iZXJJbnB1dCkge1xuICAgIHRoaXMuX3RhYmluZGV4ID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF90YWJpbmRleDogbnVtYmVyIHwgbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgZ2V0IGhvc3RUYWJpbmRleCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFiaW5kZXggJiYgKHRoaXMuX2luQ29tYm9ib3ggfHwgdGhpcy5hcmlhRGlzYWJsZWQpKSB7XG4gICAgICByZXR1cm4gJy0xJztcbiAgICB9IGVsc2UgaWYgKHRoaXMudGFiaW5kZXgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmluZGV4LnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG59XG4iXX0=