@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
395 lines • 47.3 kB
JavaScript
/**
* Copyright (c) 2025 Visa, Inc.
*
* 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 } from '@angular/cdk/coercion';
import { ChangeDetectorRef, ContentChildren, Directive, forwardRef, HostBinding, HostListener, Input, QueryList } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { AppReadyService } from '../_utilities/services/app-stable-check.service';
import { UUIDService } from '../_utilities/services/uuid.service';
import { CheckboxDirective } from '../checkbox/checkbox.directive';
import { RadioDirective } from '../radio/radio.directive';
import { ToggleButtonDirective } from '../toggle-button/toggle-button.directive';
import * as i0 from "@angular/core";
import * as i1 from "../_utilities/services/uuid.service";
import * as i2 from "../_utilities/services/app-stable-check.service";
export class ToggleContainerDirective {
get hostClasses() {
return this.class;
}
/**
* Allows multiple buttons to be selected when true. <br />
* To be used with child Button components, not Radio or Checkbox.
* @default false
*/
get multiselect() {
return this._multiselect;
}
set multiselect(value) {
this._multiselect = coerceBooleanProperty(value);
}
/**
* Sets component as disabled when true.
* @default false
*/
get disabled() {
return this._disabled;
}
set disabled(value) {
this._disabled = coerceBooleanProperty(value);
this.informDisabledState();
}
get hostDisabled() {
return this.disabled ? 'disabled' : null;
}
/** Fires when a formControl's disabled state updates. */
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
/**
* Marks component as invalid when true.
* @default false
*/
get invalid() {
return this._invalid;
}
set invalid(value) {
this._invalid = coerceBooleanProperty(value);
}
get ariaInvalid() {
return this.invalid;
}
/**
* Marks component as required when true.
* @default false
*/
get required() {
return this._required;
}
set required(value) {
this._required = coerceBooleanProperty(value);
}
/**
* Value of toggle button.
*/
get value() {
return this._value;
}
set value(value) {
let tempValue = value;
// convert single value to array if multiselect
if ((this.multiselect || this.checkboxes?.length > 0) && tempValue && !Array.isArray(tempValue)) {
tempValue = [tempValue];
}
this._value = tempValue;
if ((this.multiselect && this.value?.length === 0) || !this._value) {
this.clear();
}
else {
this.updateValue(this._value);
}
this.onChange(this.value);
this.onTouched(this.value);
}
updateValue(value) {
if (this.multiselect) {
if (this.buttons?.length > 0) {
// if the active buttons do not reflect the new value..
if (this.buttons.filter((b) => b.active).map((b) => b.value) != this.value) {
// update them
this.buttons.forEach((button) => {
button.active = value.includes(button.value);
});
}
}
else if (this.checkboxes?.length > 0) {
// if the checked checkboxes do not reflect the new value..
if (this.checkboxes.filter((c) => c.checked).map((c) => c.checkboxValue) != value) {
// update them
this.checkboxes.forEach((checkbox) => {
this.updateCheckboxRadioVal(checkbox, value.includes(checkbox.checkboxValue));
});
}
}
}
else {
if (this.buttons?.length > 0) {
// if the active button does not reflect the new value..
if (this.buttons.find((b) => b.active)?.value != value) {
// update it
this.buttons.forEach((button) => {
button.active = button.value === value;
});
}
}
else if (this.radios?.length > 0) {
// if the checked radio does not reflect the new value..
if (this.radios.find((r) => r.checked)?.radioValue != value) {
// update it
this.radios.forEach((radio) => {
this.updateCheckboxRadioVal(radio, radio.radioValue === value);
});
}
}
}
this.onChange(this.value);
}
constructor(uuidService, cdRef, appReadyService) {
this.uuidService = uuidService;
this.cdRef = cdRef;
this.appReadyService = appReadyService;
/**
* Sets custom name.
* @default this.uuidService.getUUID('v-toggle-');
* @builtin true
*/
this.name = this.uuidService.getUUID('v-toggle-');
/**
* Provides custom class(es) for custom styling.
* @default .v-toggle-container
*/
this.class = 'v-toggle-container';
this._multiselect = false;
this._disabled = false;
this._invalid = false;
this._required = false;
this.onChange = (_) => { };
this.onTouched = (_) => { };
}
ngAfterContentInit() {
this.multiselect = this.multiselect ? this.multiselect : this.checkboxes?.length > 0 ? true : false;
if (this.value) {
this.writeValue(this.value);
}
if (this.disabled) {
this.informDisabledState();
}
if (this.buttons && this.buttons.length > 0) {
this.setUpButtons();
this.buttons.changes.subscribe(() => {
this.unsubscribeFromListeners(this.buttons);
this.setUpButtons();
this.cdRef.detectChanges();
});
}
if (this.radios && this.radios.length > 0) {
// single select, using radios
this.setUpRadios();
this.radios.changes.subscribe(() => {
this.unsubscribeFromListeners(this.radios);
this.setUpRadios();
this.cdRef.detectChanges();
});
}
if (this.checkboxes && this.checkboxes.length > 0) {
// multiselect, using checkboxes
this.setUpCheckboxes();
this.checkboxes.changes.subscribe(() => {
this.unsubscribeFromListeners(this.checkboxes);
this.setUpCheckboxes();
this.cdRef.detectChanges();
});
}
}
handleBlur(event) {
this.onTouched(event);
}
setUpButtons() {
this.buttons.forEach((button) => {
button.listeners.push(button.clicked.subscribe(() => {
if (this.multiselect) {
button.active = !button.active;
const tempValue = this.value || [];
if (button.active) {
this.value = [...tempValue, button.value];
}
else {
this.value = tempValue.filter((v) => v !== button.value);
}
}
else {
if (this.value === button.value)
return;
this.buttons.forEach((b) => {
b.active = false;
});
button.active = true;
this.value = button.value;
}
}));
});
// find active buttons and set value
const activeValues = this.buttons.filter((b) => b.active).map((b) => b.value);
if (this.multiselect && this.value !== activeValues) {
this.value = activeValues;
}
else if (!this.multiselect && this.value !== activeValues[0]) {
this.value = activeValues[0];
}
}
setUpRadios() {
this.radios.forEach((radio) => {
radio.radioValue = radio.radioValue ? radio.radioValue : this.uuidService.getUUID('v-radio-');
radio.name = radio.name ? radio.name : this.name;
// find checked radio buttons and set value
radio.listeners.push(radio.clicked.subscribe(() => {
if (this.value !== radio.radioValue) {
this.value = radio.radioValue;
}
}));
});
const activeValues = this.radios.find((r) => r.checked);
if (activeValues && this.value !== activeValues.radioValue) {
this.value = activeValues.radioValue;
}
}
setUpCheckboxes() {
this.checkboxes.forEach((checkbox) => {
checkbox.checkboxValue = checkbox.checkboxValue
? checkbox.checkboxValue
: this.uuidService.getUUID('v-checkbox-');
checkbox.listeners.push(checkbox.clicked.subscribe((event) => {
if (event.target.checked) {
// add value
this.value = [...this.value, checkbox.checkboxValue];
}
else {
// remove value
this.value = this.value.filter((v) => v !== checkbox.checkboxValue);
}
}));
});
// find checked checkboxes and set value
const activeValues = this.checkboxes.filter((c) => c.checked).map((c) => c.checkboxValue);
if (activeValues && this.value !== activeValues) {
this.value = activeValues;
}
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
writeValue(value) {
this.value = value;
}
clear() {
// clear value from radio and visual check
this.radios?.forEach((radio) => {
this.updateCheckboxRadioVal(radio);
});
this.checkboxes?.forEach((checkbox) => {
this.updateCheckboxRadioVal(checkbox);
});
this.buttons?.forEach((button) => {
button.active = false;
});
if (this.multiselect && this.value && this.value.length > 0) {
this.value = [];
}
else if (this.value) {
this.value = null;
}
}
updateCheckboxRadioVal(item, checked = false) {
item.checked = checked;
if (this.appReadyService.isBrowserAndDomAvailable()) {
item.el.nativeElement.checked = checked;
}
}
unsubscribeFromListeners(items) {
items.forEach((item) => {
item.listeners.forEach((sub) => {
sub.unsubscribe();
});
});
}
informDisabledState() {
if (this.buttons) {
this.buttons.forEach((button) => {
button.disabled = this.disabled;
});
}
if (this.radios) {
this.radios.forEach((radio) => {
radio.disabled = this.disabled;
});
}
if (this.checkboxes) {
this.checkboxes.forEach((checkbox) => {
checkbox.disabled = this.disabled;
});
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToggleContainerDirective, deps: [{ token: i1.UUIDService }, { token: i0.ChangeDetectorRef }, { token: i2.AppReadyService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: ToggleContainerDirective, isStandalone: true, selector: "[v-toggle-container]", inputs: { name: "name", class: "class", multiselect: "multiselect", disabled: "disabled", invalid: "invalid", required: "required", value: "value" }, host: { listeners: { "blur": "handleBlur($event)" }, properties: { "class": "this.hostClasses", "disabled": "this.hostDisabled", "attr.aria-invalid": "this.ariaInvalid" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => ToggleContainerDirective),
multi: true
}
], queries: [{ propertyName: "radios", predicate: RadioDirective, descendants: true }, { propertyName: "checkboxes", predicate: CheckboxDirective, descendants: true }, { propertyName: "buttons", predicate: ToggleButtonDirective, descendants: true }], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToggleContainerDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: '[v-toggle-container]',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => ToggleContainerDirective),
multi: true
}
]
}]
}], ctorParameters: () => [{ type: i1.UUIDService }, { type: i0.ChangeDetectorRef }, { type: i2.AppReadyService }], propDecorators: { radios: [{
type: ContentChildren,
args: [RadioDirective, { descendants: true }]
}], checkboxes: [{
type: ContentChildren,
args: [CheckboxDirective, { descendants: true }]
}], buttons: [{
type: ContentChildren,
args: [ToggleButtonDirective, { descendants: true }]
}], name: [{
type: Input
}], class: [{
type: Input
}], hostClasses: [{
type: HostBinding,
args: ['class']
}], multiselect: [{
type: Input
}], disabled: [{
type: Input
}], hostDisabled: [{
type: HostBinding,
args: ['disabled']
}], invalid: [{
type: Input
}], ariaInvalid: [{
type: HostBinding,
args: ['attr.aria-invalid']
}], required: [{
type: Input
}], value: [{
type: Input
}], handleBlur: [{
type: HostListener,
args: ['blur', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9nZ2xlLWNvbnRhaW5lci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvdG9nZ2xlLWNvbnRhaW5lci90b2dnbGUtY29udGFpbmVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNsRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7O0FBYWpGLE1BQU0sT0FBTyx3QkFBd0I7SUFvQm5DLElBQ0ksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQ0ksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBQ0QsSUFBSSxXQUFXLENBQUMsS0FBbUI7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBR0Q7OztPQUdHO0lBQ0gsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFtQjtRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUNJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzNDLENBQUM7SUFDRCwwREFBMEQ7SUFDMUQsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDN0IsQ0FBQztJQUNEOzs7T0FHRztJQUNILElBQ0ksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBbUI7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsSUFDSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLEtBQW1CO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUdEOztPQUVHO0lBQ0gsSUFDSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFtRDtRQUMzRCxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdEIsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNoRyxTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUssSUFBSSxDQUFDLEtBQTZCLEVBQUUsTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVGLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNmLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFHRCxXQUFXLENBQUMsS0FBbUQ7UUFDN0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsdURBQXVEO2dCQUN2RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUssSUFBSSxDQUFDLEtBQTZCLEVBQUUsQ0FBQztvQkFDcEcsY0FBYztvQkFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO3dCQUM5QixNQUFNLENBQUMsTUFBTSxHQUFJLEtBQTZCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEUsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsMkRBQTJEO2dCQUMzRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUssS0FBNkIsRUFBRSxDQUFDO29CQUMzRyxjQUFjO29CQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7d0JBQ25DLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUcsS0FBNkIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7b0JBQ3pHLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM3Qix3REFBd0Q7Z0JBQ3hELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLElBQUssS0FBeUIsRUFBRSxDQUFDO29CQUM1RSxZQUFZO29CQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUM7b0JBQ3pDLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLHdEQUF3RDtnQkFDeEQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsSUFBSyxLQUF5QixFQUFFLENBQUM7b0JBQ2pGLFlBQVk7b0JBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDNUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxDQUFDO29CQUNqRSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsWUFDVSxXQUF3QixFQUN4QixLQUF3QixFQUN4QixlQUFnQztRQUZoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUF2SjFDOzs7O1dBSUc7UUFDTSxTQUFJLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFOUQ7OztXQUdHO1FBQ00sVUFBSyxHQUFXLG9CQUFvQixDQUFDO1FBa0I5QyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQWM5QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBb0IzQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBaUIxQixjQUFTLEdBQVksS0FBSyxDQUFDO1FBaU0zQixhQUFRLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUUxQixjQUFTLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQztJQTNIeEIsQ0FBQztJQUVKLGtCQUFrQjtRQUNoQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDcEcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQyw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRW5CLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEQsZ0NBQWdDO1lBQ2hDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUV2QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNyQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUdELFVBQVUsQ0FBQyxLQUFZO1FBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzlCLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUNuQixNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQzVCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNyQixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztvQkFDL0IsTUFBTSxTQUFTLEdBQUksSUFBSSxDQUFDLEtBQTZCLElBQUksRUFBRSxDQUFDO29CQUM1RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDNUMsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDM0QsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLO3dCQUFFLE9BQU87b0JBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ3pCLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNuQixDQUFDLENBQUMsQ0FBQztvQkFDSCxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUM1QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsb0NBQW9DO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUUsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUM7UUFDNUIsQ0FBQzthQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0QsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM1QixLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlGLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNqRCwyQ0FBMkM7WUFDM0MsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ2xCLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDM0IsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO2dCQUNoQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMzRCxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNuQyxRQUFRLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhO2dCQUM3QyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWE7Z0JBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1QyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDckIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDbkMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUN6QixZQUFZO29CQUNaLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFJLElBQUksQ0FBQyxLQUE2QixFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDaEYsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGVBQWU7b0JBQ2YsSUFBSSxDQUFDLEtBQUssR0FBSSxJQUFJLENBQUMsS0FBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQy9GLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFDSCx3Q0FBd0M7UUFDeEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRixJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBTUQsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQW1EO1FBQzVELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLO1FBQ0gsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQy9CLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUssSUFBSSxDQUFDLEtBQTZCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JGLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVELHNCQUFzQixDQUFDLElBQXdDLEVBQUUsVUFBbUIsS0FBSztRQUN2RixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCx3QkFBd0IsQ0FDdEIsS0FBa0c7UUFFbEcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQzdCLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUM5QixNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDNUIsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ25DLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOytHQS9WVSx3QkFBd0I7bUdBQXhCLHdCQUF3Qix1WUFSeEI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO2dCQUN2RCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsaURBR2dCLGNBQWMsZ0VBRWQsaUJBQWlCLDZEQUVqQixxQkFBcUI7OzRGQUwzQix3QkFBd0I7a0JBWHBDLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQzs0QkFDdkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7OElBR0MsTUFBTTtzQkFETCxlQUFlO3VCQUFDLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBR3RELFVBQVU7c0JBRFQsZUFBZTt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBR3pELE9BQU87c0JBRE4sZUFBZTt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBUXBELElBQUk7c0JBQVosS0FBSztnQkFNRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUYsV0FBVztzQkFEZCxXQUFXO3VCQUFDLE9BQU87Z0JBV2hCLFdBQVc7c0JBRGQsS0FBSztnQkFjRixRQUFRO3NCQURYLEtBQUs7Z0JBVUYsWUFBWTtzQkFEZixXQUFXO3VCQUFDLFVBQVU7Z0JBYW5CLE9BQU87c0JBRFYsS0FBSztnQkFTRixXQUFXO3NCQURkLFdBQVc7dUJBQUMsbUJBQW1CO2dCQVU1QixRQUFRO3NCQURYLEtBQUs7Z0JBYUYsS0FBSztzQkFEUixLQUFLO2dCQTZHTixVQUFVO3NCQURULFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDI1IFZpc2EsIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIFF1ZXJ5TGlzdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFwcFJlYWR5U2VydmljZSB9IGZyb20gJy4uL191dGlsaXRpZXMvc2VydmljZXMvYXBwLXN0YWJsZS1jaGVjay5zZXJ2aWNlJztcbmltcG9ydCB7IFVVSURTZXJ2aWNlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9zZXJ2aWNlcy91dWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hlY2tib3hEaXJlY3RpdmUgfSBmcm9tICcuLi9jaGVja2JveC9jaGVja2JveC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUmFkaW9EaXJlY3RpdmUgfSBmcm9tICcuLi9yYWRpby9yYWRpby5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVG9nZ2xlQnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vdG9nZ2xlLWJ1dHRvbi90b2dnbGUtYnV0dG9uLmRpcmVjdGl2ZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ1t2LXRvZ2dsZS1jb250YWluZXJdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUb2dnbGVDb250YWluZXJEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVG9nZ2xlQ29udGFpbmVyRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyQ29udGVudEluaXQge1xuICBAQ29udGVudENoaWxkcmVuKFJhZGlvRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHJhZGlvczogUXVlcnlMaXN0PFJhZGlvRGlyZWN0aXZlPjtcbiAgQENvbnRlbnRDaGlsZHJlbihDaGVja2JveERpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBjaGVja2JveGVzOiBRdWVyeUxpc3Q8Q2hlY2tib3hEaXJlY3RpdmU+O1xuICBAQ29udGVudENoaWxkcmVuKFRvZ2dsZUJ1dHRvbkRpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBidXR0b25zOiBRdWVyeUxpc3Q8VG9nZ2xlQnV0dG9uRGlyZWN0aXZlPjtcblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gbmFtZS5cbiAgICogQGRlZmF1bHQgdGhpcy51dWlkU2VydmljZS5nZXRVVUlEKCd2LXRvZ2dsZS0nKTtcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nID0gdGhpcy51dWlkU2VydmljZS5nZXRVVUlEKCd2LXRvZ2dsZS0nKTtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY3VzdG9tIGNsYXNzJiM0MDtlcyYjNDE7IGZvciBjdXN0b20gc3R5bGluZy5cbiAgICogQGRlZmF1bHQgLnYtdG9nZ2xlLWNvbnRhaW5lclxuICAgKi9cbiAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICd2LXRvZ2dsZS1jb250YWluZXInO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIG11bHRpcGxlIGJ1dHRvbnMgdG8gYmUgc2VsZWN0ZWQgd2hlbiB0cnVlLiA8YnIgLz5cbiAgICogVG8gYmUgdXNlZCB3aXRoIGNoaWxkIEJ1dHRvbiBjb21wb25lbnRzLCBub3QgUmFkaW8gb3IgQ2hlY2tib3guXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgbXVsdGlzZWxlY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX211bHRpc2VsZWN0O1xuICB9XG4gIHNldCBtdWx0aXNlbGVjdCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fbXVsdGlzZWxlY3QgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9tdWx0aXNlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIGNvbXBvbmVudCBhcyBkaXNhYmxlZCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuaW5mb3JtRGlzYWJsZWRTdGF0ZSgpO1xuICB9XG4gIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2Rpc2FibGVkJylcbiAgZ2V0IGhvc3REaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiBudWxsO1xuICB9XG4gIC8qKiBGaXJlcyB3aGVuIGEgZm9ybUNvbnRyb2wncyBkaXNhYmxlZCBzdGF0ZSB1cGRhdGVzLiAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbiAgLyoqXG4gICAqIE1hcmtzIGNvbXBvbmVudCBhcyBpbnZhbGlkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBpbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZhbGlkO1xuICB9XG4gIHNldCBpbnZhbGlkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9pbnZhbGlkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfaW52YWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1pbnZhbGlkJylcbiAgZ2V0IGFyaWFJbnZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLmludmFsaWQ7XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgY29tcG9uZW50IGFzIHJlcXVpcmVkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cbiAgc2V0IHJlcXVpcmVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFZhbHVlIG9mIHRvZ2dsZSBidXR0b24uXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogKHN0cmluZyB8IG51bWJlcilbXSB8IHN0cmluZyB8IG51bWJlciB8IG51bGwpIHtcbiAgICBsZXQgdGVtcFZhbHVlID0gdmFsdWU7XG4gICAgLy8gY29udmVydCBzaW5nbGUgdmFsdWUgdG8gYXJyYXkgaWYgbXVsdGlzZWxlY3RcbiAgICBpZiAoKHRoaXMubXVsdGlzZWxlY3QgfHwgdGhpcy5jaGVja2JveGVzPy5sZW5ndGggPiAwKSAmJiB0ZW1wVmFsdWUgJiYgIUFycmF5LmlzQXJyYXkodGVtcFZhbHVlKSkge1xuICAgICAgdGVtcFZhbHVlID0gW3RlbXBWYWx1ZV07XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlID0gdGVtcFZhbHVlO1xuICAgIGlmICgodGhpcy5tdWx0aXNlbGVjdCAmJiAodGhpcy52YWx1ZSBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKT8ubGVuZ3RoID09PSAwKSB8fCAhdGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm9uVG91Y2hlZCh0aGlzLnZhbHVlKTtcbiAgfVxuICBfdmFsdWU6IChzdHJpbmcgfCBudW1iZXIpW10gfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsO1xuXG4gIHVwZGF0ZVZhbHVlKHZhbHVlOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCkge1xuICAgIGlmICh0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICBpZiAodGhpcy5idXR0b25zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIGlmIHRoZSBhY3RpdmUgYnV0dG9ucyBkbyBub3QgcmVmbGVjdCB0aGUgbmV3IHZhbHVlLi5cbiAgICAgICAgaWYgKHRoaXMuYnV0dG9ucy5maWx0ZXIoKGIpID0+IGIuYWN0aXZlKS5tYXAoKGIpID0+IGIudmFsdWUpICE9ICh0aGlzLnZhbHVlIGFzIChzdHJpbmcgfCBudW1iZXIpW10pKSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZW1cbiAgICAgICAgICB0aGlzLmJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBidXR0b24uYWN0aXZlID0gKHZhbHVlIGFzIChzdHJpbmcgfCBudW1iZXIpW10pLmluY2x1ZGVzKGJ1dHRvbi52YWx1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2JveGVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIGlmIHRoZSBjaGVja2VkIGNoZWNrYm94ZXMgZG8gbm90IHJlZmxlY3QgdGhlIG5ldyB2YWx1ZS4uXG4gICAgICAgIGlmICh0aGlzLmNoZWNrYm94ZXMuZmlsdGVyKChjKSA9PiBjLmNoZWNrZWQpLm1hcCgoYykgPT4gYy5jaGVja2JveFZhbHVlKSAhPSAodmFsdWUgYXMgKHN0cmluZyB8IG51bWJlcilbXSkpIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlbVxuICAgICAgICAgIHRoaXMuY2hlY2tib3hlcy5mb3JFYWNoKChjaGVja2JveCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGVja2JveFJhZGlvVmFsKGNoZWNrYm94LCAodmFsdWUgYXMgKHN0cmluZyB8IG51bWJlcilbXSkuaW5jbHVkZXMoY2hlY2tib3guY2hlY2tib3hWYWx1ZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmJ1dHRvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gaWYgdGhlIGFjdGl2ZSBidXR0b24gZG9lcyBub3QgcmVmbGVjdCB0aGUgbmV3IHZhbHVlLi5cbiAgICAgICAgaWYgKHRoaXMuYnV0dG9ucy5maW5kKChiKSA9PiBiLmFjdGl2ZSk/LnZhbHVlICE9ICh2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXIpKSB7XG4gICAgICAgICAgLy8gdXBkYXRlIGl0XG4gICAgICAgICAgdGhpcy5idXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgYnV0dG9uLmFjdGl2ZSA9IGJ1dHRvbi52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yYWRpb3M/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gaWYgdGhlIGNoZWNrZWQgcmFkaW8gZG9lcyBub3QgcmVmbGVjdCB0aGUgbmV3IHZhbHVlLi5cbiAgICAgICAgaWYgKHRoaXMucmFkaW9zLmZpbmQoKHIpID0+IHIuY2hlY2tlZCk/LnJhZGlvVmFsdWUgIT0gKHZhbHVlIGFzIHN0cmluZyB8IG51bWJlcikpIHtcbiAgICAgICAgICAvLyB1cGRhdGUgaXRcbiAgICAgICAgICB0aGlzLnJhZGlvcy5mb3JFYWNoKChyYWRpbykgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGVja2JveFJhZGlvVmFsKHJhZGlvLCByYWRpby5yYWRpb1ZhbHVlID09PSB2YWx1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFVVSURTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgYXBwUmVhZHlTZXJ2aWNlOiBBcHBSZWFkeVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm11bHRpc2VsZWN0ID0gdGhpcy5tdWx0aXNlbGVjdCA/IHRoaXMubXVsdGlzZWxlY3QgOiB0aGlzLmNoZWNrYm94ZXM/Lmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuaW5mb3JtRGlzYWJsZWRTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5idXR0b25zICYmIHRoaXMuYnV0dG9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNldFVwQnV0dG9ucygpO1xuXG4gICAgICB0aGlzLmJ1dHRvbnMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUxpc3RlbmVycyh0aGlzLmJ1dHRvbnMpO1xuICAgICAgICB0aGlzLnNldFVwQnV0dG9ucygpO1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5yYWRpb3MgJiYgdGhpcy5yYWRpb3MubGVuZ3RoID4gMCkge1xuICAgICAgLy8gc2luZ2xlIHNlbGVjdCwgdXNpbmcgcmFkaW9zXG4gICAgICB0aGlzLnNldFVwUmFkaW9zKCk7XG5cbiAgICAgIHRoaXMucmFkaW9zLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUZyb21MaXN0ZW5lcnModGhpcy5yYWRpb3MpO1xuICAgICAgICB0aGlzLnNldFVwUmFkaW9zKCk7XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoZWNrYm94ZXMgJiYgdGhpcy5jaGVja2JveGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIG11bHRpc2VsZWN0LCB1c2luZyBjaGVja2JveGVzXG4gICAgICB0aGlzLnNldFVwQ2hlY2tib3hlcygpO1xuXG4gICAgICB0aGlzLmNoZWNrYm94ZXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUxpc3RlbmVycyh0aGlzLmNoZWNrYm94ZXMpO1xuICAgICAgICB0aGlzLnNldFVwQ2hlY2tib3hlcygpO1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInLCBbJyRldmVudCddKVxuICBoYW5kbGVCbHVyKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMub25Ub3VjaGVkKGV2ZW50KTtcbiAgfVxuXG4gIHNldFVwQnV0dG9ucygpIHtcbiAgICB0aGlzLmJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24ubGlzdGVuZXJzLnB1c2goXG4gICAgICAgIGJ1dHRvbi5jbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgIGJ1dHRvbi5hY3RpdmUgPSAhYnV0dG9uLmFjdGl2ZTtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBWYWx1ZSA9ICh0aGlzLnZhbHVlIGFzIChzdHJpbmcgfCBudW1iZXIpW10pIHx8IFtdO1xuICAgICAgICAgICAgaWYgKGJ1dHRvbi5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFsuLi50ZW1wVmFsdWUsIGJ1dHRvbi52YWx1ZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGVtcFZhbHVlLmZpbHRlcigodikgPT4gdiAhPT0gYnV0dG9uLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgPT09IGJ1dHRvbi52YWx1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5idXR0b25zLmZvckVhY2goKGIpID0+IHtcbiAgICAgICAgICAgICAgYi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnV0dG9uLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gYnV0dG9uLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gICAgLy8gZmluZCBhY3RpdmUgYnV0dG9ucyBhbmQgc2V0IHZhbHVlXG4gICAgY29uc3QgYWN0aXZlVmFsdWVzID0gdGhpcy5idXR0b25zLmZpbHRlcigoYikgPT4gYi5hY3RpdmUpLm1hcCgoYikgPT4gYi52YWx1ZSk7XG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3QgJiYgdGhpcy52YWx1ZSAhPT0gYWN0aXZlVmFsdWVzKSB7XG4gICAgICB0aGlzLnZhbHVlID0gYWN0aXZlVmFsdWVzO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMubXVsdGlzZWxlY3QgJiYgdGhpcy52YWx1ZSAhPT0gYWN0aXZlVmFsdWVzWzBdKSB7XG4gICAgICB0aGlzLnZhbHVlID0gYWN0aXZlVmFsdWVzWzBdO1xuICAgIH1cbiAgfVxuXG4gIHNldFVwUmFkaW9zKCkge1xuICAgIHRoaXMucmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICByYWRpby5yYWRpb1ZhbHVlID0gcmFkaW8ucmFkaW9WYWx1ZSA/IHJhZGlvLnJhZGlvVmFsdWUgOiB0aGlzLnV1aWRTZXJ2aWNlLmdldFVVSUQoJ3YtcmFkaW8tJyk7XG4gICAgICByYWRpby5uYW1lID0gcmFkaW8ubmFtZSA/IHJhZGlvLm5hbWUgOiB0aGlzLm5hbWU7XG4gICAgICAvLyBmaW5kIGNoZWNrZWQgcmFkaW8gYnV0dG9ucyBhbmQgc2V0IHZhbHVlXG4gICAgICByYWRpby5saXN0ZW5lcnMucHVzaChcbiAgICAgICAgcmFkaW8uY2xpY2tlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9PSByYWRpby5yYWRpb1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gcmFkaW8ucmFkaW9WYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IGFjdGl2ZVZhbHVlcyA9IHRoaXMucmFkaW9zLmZpbmQoKHIpID0+IHIuY2hlY2tlZCk7XG4gICAgaWYgKGFjdGl2ZVZhbHVlcyAmJiB0aGlzLnZhbHVlICE9PSBhY3RpdmVWYWx1ZXMucmFkaW9WYWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGFjdGl2ZVZhbHVlcy5yYWRpb1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHNldFVwQ2hlY2tib3hlcygpIHtcbiAgICB0aGlzLmNoZWNrYm94ZXMuZm9yRWFjaCgoY2hlY2tib3gpID0+IHtcbiAgICAgIGNoZWNrYm94LmNoZWNrYm94VmFsdWUgPSBjaGVja2JveC5jaGVja2JveFZhbHVlXG4gICAgICAgID8gY2hlY2tib3guY2hlY2tib3hWYWx1ZVxuICAgICAgICA6IHRoaXMudXVpZFNlcnZpY2UuZ2V0VVVJRCgndi1jaGVja2JveC0nKTtcbiAgICAgIGNoZWNrYm94Lmxpc3RlbmVycy5wdXNoKFxuICAgICAgICBjaGVja2JveC5jbGlja2VkLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIC8vIGFkZCB2YWx1ZVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFsuLi4odGhpcy52YWx1ZSBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKSwgY2hlY2tib3guY2hlY2tib3hWYWx1ZV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSB2YWx1ZVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9ICh0aGlzLnZhbHVlIGFzIChzdHJpbmcgfCBudW1iZXIpW10pLmZpbHRlcigodikgPT4gdiAhPT0gY2hlY2tib3guY2hlY2tib3hWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgICAvLyBmaW5kIGNoZWNrZWQgY2hlY2tib3hlcyBhbmQgc2V0IHZhbHVlXG4gICAgY29uc3QgYWN0aXZlVmFsdWVzID0gdGhpcy5jaGVja2JveGVzLmZpbHRlcigoYykgPT4gYy5jaGVja2VkKS5tYXAoKGMpID0+IGMuY2hlY2tib3hWYWx1ZSk7XG4gICAgaWYgKGFjdGl2ZVZhbHVlcyAmJiB0aGlzLnZhbHVlICE9PSBhY3RpdmVWYWx1ZXMpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBhY3RpdmVWYWx1ZXM7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcblxuICBvblRvdWNoZWQgPSAoXzogYW55KSA9PiB7fTtcblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IChzdHJpbmcgfCBudW1iZXIpW10gfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgLy8gY2xlYXIgdmFsdWUgZnJvbSByYWRpbyBhbmQgdmlzdWFsIGNoZWNrXG4gICAgdGhpcy5yYWRpb3M/LmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUNoZWNrYm94UmFkaW9WYWwocmFkaW8pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jaGVja2JveGVzPy5mb3JFYWNoKChjaGVja2JveCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVDaGVja2JveFJhZGlvVmFsKGNoZWNrYm94KTtcbiAgICB9KTtcblxuICAgIHRoaXMuYnV0dG9ucz8uZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uYWN0aXZlID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5tdWx0aXNlbGVjdCAmJiB0aGlzLnZhbHVlICYmICh0aGlzLnZhbHVlIGFzIChzdHJpbmcgfCBudW1iZXIpW10pLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrYm94UmFkaW9WYWwoaXRlbTogUmFkaW9EaXJlY3RpdmUgfCBDaGVja2JveERpcmVjdGl2ZSwgY2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaXRlbS5jaGVja2VkID0gY2hlY2tlZDtcbiAgICBpZiAodGhpcy5hcHBSZWFkeVNlcnZpY2UuaXNCcm93c2VyQW5kRG9tQXZhaWxhYmxlKCkpIHtcbiAgICAgIGl0ZW0uZWwubmF0aXZlRWxlbWVudC5jaGVja2VkID0gY2hlY2tlZDtcbiAgICB9XG4gIH1cblxuICB1bnN1YnNjcmliZUZyb21MaXN0ZW5lcnMoXG4gICAgaXRlbXM6IFF1ZXJ5TGlzdDxSYWRpb0RpcmVjdGl2ZT4gfCBRdWVyeUxpc3Q8Q2hlY2tib3hEaXJlY3RpdmU+IHwgUXVlcnlMaXN0PFRvZ2dsZUJ1dHRvbkRpcmVjdGl2ZT5cbiAgKSB7XG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaXRlbS5saXN0ZW5lcnMuZm9yRWFjaCgoc3ViKSA9PiB7XG4gICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpbmZvcm1EaXNhYmxlZFN0YXRlKCkge1xuICAgIGlmICh0aGlzLmJ1dHRvbnMpIHtcbiAgICAgIHRoaXMuYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5yYWRpb3MpIHtcbiAgICAgIHRoaXMucmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICAgIHJhZGlvLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja2JveGVzKSB7XG4gICAgICB0aGlzLmNoZWNrYm94ZXMuZm9yRWFjaCgoY2hlY2tib3gpID0+IHtcbiAgICAgICAgY2hlY2tib3guZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=