@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
261 lines • 33.2 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, EventEmitter, HostBinding, Input, Optional, Output, QueryList } from '@angular/core';
import { FlexDirective } from '../flex/flex.directive';
import { AccordionHeadingDirective } from '../accordion-heading/accordion-heading.directive';
import { AccordionDetailsDirective } from '../accordion-item/accordion-item.directive';
import { AccordionPanelDirective } from '../accordion-panel/accordion-panel.directive';
import { ButtonColor } from '../button/button.constants';
import { WizardDirective } from '../wizard/wizard.directive';
import { AccordionService } from './accordion.service';
import { UUIDService } from '../_utilities/services/uuid.service';
import * as i0 from "@angular/core";
import * as i1 from "./accordion.service";
import * as i2 from "../_utilities/services/uuid.service";
import * as i3 from "../flex/flex.directive";
import * as i4 from "../wizard/wizard.directive";
export class AccordionDirective {
/**
* Provides custom class(es) for custom styling.
* @default .v-accordion
*/
get class() {
return [
this._class,
this.accordionItems.length <= 0 && !this.wizard ? 'v-accordion' : '',
!this._removeDefaultFlex && this.accordionItems.length > 0 ? 'v-flex v-flex-col' : '',
!this._removeDefaultGap && this.accordionItems.length > 0 ? 'v-gap-6' : ''
].join(' ');
}
set class(value) {
this._class = value;
}
get hostClass() {
return this.class;
}
/**
* Allows multiple accordion items to be expanded when true.
* @default false
*/
get multiselect() {
return this._multiselect;
}
set multiselect(value) {
this._multiselect = coerceBooleanProperty(value);
}
/**
* Applies subtle accordion styling when true.
* @default false
*/
get subtle() {
return this._subtle;
}
set subtle(value) {
this._subtle = coerceBooleanProperty(value);
this.setAsSubtle();
}
constructor(accordionService, cdRef, uuidService, flex, wizard) {
this.accordionService = accordionService;
this.cdRef = cdRef;
this.uuidService = uuidService;
this.flex = flex;
this.wizard = wizard;
this.buttonClickedSubscriptions = [];
this._removeDefaultFlex = false;
this._removeDefaultGap = false;
this._class = '';
this._multiselect = false;
this._subtle = false;
/**
* Emits indexes of expanded items when an accordion item is toggled.
*/
this.itemsChanged = new EventEmitter();
/** variable that maintains the array of indexes of expanded items */
this.itemsExpanded = [];
}
ngAfterContentInit() {
if (!this.accordionItems.length)
this.accordionService.setUpAccordion(this);
this.cdRef.detectChanges(); // detect changes made to component within setUpAccordion
this.setAsSubtle();
// remove default flex and gap if user has set their own
this._removeDefaultFlex = this.flex && this.flex.vFlexRow;
this._removeDefaultGap = this.flex && this.flex.vGap;
if (this.accordionItems) {
if (this.accordionItems.length > 0) {
this.setUpAccordionItems();
}
this.accordionItems.changes.subscribe(() => {
this.setUpAccordionItems();
});
}
if (this.headings) {
// custom accessible markup
this.setUpHeadings();
this.headings.changes.subscribe(() => {
this.accordionItemsChanged();
});
}
if (this.panels) {
this.panels.changes.subscribe(() => {
this.accordionItemsChanged();
});
}
}
setUpAccordionItems() {
const singleSelectName = this.uuidService.getUUID('accordion-details-');
// detail/summary markup
this.accordionItems.toArray().forEach((item, index) => {
if (item.expanded)
this.itemsExpanded.push(index);
if (!this.multiselect && item.heading.hostButton) {
item.name = singleSelectName;
// a new item is clicked in a non-multiselect
item.heading.hostButton.clicked.subscribe(() => {
if (item.expanded) {
// clear all expanded items if an expanded item is clicked (it's closing)
this.itemsExpanded = [];
return;
}
this.itemsExpanded = [index];
});
}
else if (this.multiselect) {
item.toggled.subscribe((expanded) => {
this.handleToggle(index, expanded, true);
});
}
});
}
setUpHeadings() {
// prioritize the accordion items (native details/summary behavior) if they are present
if (this.accordionItems.length > 0)
return;
// loop through the headings
this.headings.toArray().forEach((heading) => {
// subscribe to clicks and programmatic toggles
if (heading.hostButton) {
this.buttonSubscribe(heading.hostButton, heading._index);
}
else if (heading._buttonHeading) {
this.buttonSubscribe(heading._buttonHeading, heading._index);
}
if (heading.expanded)
this.itemsExpanded.push(heading._index);
// subscribe to changes in heading.expanded
heading.toggled.subscribe((index) => {
this.handleToggle(index, heading.expanded, false);
});
});
}
setAsSubtle() {
if (this.headings) {
this.headings.toArray().forEach((heading) => {
heading._subtle.set(this.subtle);
if (this.subtle) {
const button = heading._buttonHeading || heading.hostButton;
if (!button._buttonColorSetByUser)
button.buttonColor = ButtonColor.TERTIARY;
}
});
}
if (this.panels) {
this.panels.toArray().forEach((panel) => {
panel._subtle.set(this.subtle);
});
}
}
buttonSubscribe(button, index) {
this.buttonClickedSubscriptions[index] = button.clicked.subscribe(() => {
this.accordionService.toggleItem(index);
});
}
accordionItemsChanged() {
// when accordion items change we need to recreate the accordion and service
if (this.headings.length !== this.panels.length)
return; // accordion hasn't been fully changed yet, waiting on matching heading or panel
// reset
this.buttonClickedSubscriptions.forEach((subscription) => {
subscription.unsubscribe();
});
this.buttonClickedSubscriptions = [];
this.accordionService.setUpAccordion(this);
this.setAsSubtle();
if (this.headings)
this.setUpHeadings();
this.cdRef.detectChanges();
}
handleToggle(index, expanded, isDetails) {
const _prevItemsExpanded = this.itemsExpanded;
if (expanded) {
if (!isDetails)
this.accordionService.expandItem(index);
if (!this.multiselect) {
const prevExpanded = this.itemsExpanded[0];
const arr = this.accordionItems.length > 0 ? this.accordionItems.toArray() : this.headings.toArray();
if (prevExpanded >= 0 && prevExpanded !== index)
arr[prevExpanded].expanded = false;
this.itemsExpanded = [index];
}
else if (!this.itemsExpanded.includes(index))
this.itemsExpanded.push(index);
}
else {
if (!isDetails)
this.accordionService.collapseItem(index);
this.itemsExpanded.filter((item) => item !== index);
}
if (this.itemsExpanded !== _prevItemsExpanded)
this.itemsChanged.emit(this.itemsExpanded);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionDirective, deps: [{ token: i1.AccordionService }, { token: i0.ChangeDetectorRef }, { token: i2.UUIDService }, { token: i3.FlexDirective, optional: true }, { token: i4.WizardDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AccordionDirective, isStandalone: true, selector: "[v-accordion]", inputs: { class: "class", multiselect: "multiselect", subtle: "subtle" }, outputs: { itemsChanged: "itemsChanged" }, host: { properties: { "class": "this.hostClass" } }, providers: [AccordionService], queries: [{ propertyName: "headings", predicate: AccordionHeadingDirective, descendants: true }, { propertyName: "panels", predicate: AccordionPanelDirective, descendants: true }, { propertyName: "accordionItems", predicate: AccordionDetailsDirective, descendants: true }], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: '[v-accordion]',
providers: [AccordionService]
}]
}], ctorParameters: () => [{ type: i1.AccordionService }, { type: i0.ChangeDetectorRef }, { type: i2.UUIDService }, { type: i3.FlexDirective, decorators: [{
type: Optional
}] }, { type: i4.WizardDirective, decorators: [{
type: Optional
}] }], propDecorators: { headings: [{
type: ContentChildren,
args: [AccordionHeadingDirective, { descendants: true }]
}], panels: [{
type: ContentChildren,
args: [AccordionPanelDirective, { descendants: true }]
}], accordionItems: [{
type: ContentChildren,
args: [AccordionDetailsDirective, { descendants: true }]
}], class: [{
type: Input
}], hostClass: [{
type: HostBinding,
args: ['class']
}], multiselect: [{
type: Input
}], subtle: [{
type: Input
}], itemsChanged: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9hY2NvcmRpb24vYWNjb3JkaW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUNULFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7O0FBT2xFLE1BQU0sT0FBTyxrQkFBa0I7SUFXN0I7OztPQUdHO0lBQ0gsSUFDSSxLQUFLO1FBQ1AsT0FBTztZQUNMLElBQUksQ0FBQyxNQUFNO1lBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FB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QUFFO2dCQUdqRSxNQUFNO3NCQURMLGVBQWU7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUkvRCxjQUFjO3NCQURiLGVBQWU7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQVU3RCxLQUFLO3NCQURSLEtBQUs7Z0JBY0YsU0FBUztzQkFEWixXQUFXO3VCQUFDLE9BQU87Z0JBVWhCLFdBQVc7c0JBRGQsS0FBSztnQkFjRixNQUFNO3NCQURULEtBQUs7Z0JBYUksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAyNSBWaXNhLCBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiovXG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGbGV4RGlyZWN0aXZlIH0gZnJvbSAnLi4vZmxleC9mbGV4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBBY2NvcmRpb25IZWFkaW5nRGlyZWN0aXZlIH0gZnJvbSAnLi4vYWNjb3JkaW9uLWhlYWRpbmcvYWNjb3JkaW9uLWhlYWRpbmcuZGlyZWN0aXZlJztcbmltcG9ydCB7IEFjY29yZGlvbkRldGFpbHNEaXJlY3RpdmUgfSBmcm9tICcuLi9hY2NvcmRpb24taXRlbS9hY2NvcmRpb24taXRlbS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQWNjb3JkaW9uUGFuZWxEaXJlY3RpdmUgfSBmcm9tICcuLi9hY2NvcmRpb24tcGFuZWwvYWNjb3JkaW9uLXBhbmVsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBCdXR0b25Db2xvciB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29uc3RhbnRzJztcbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IFdpemFyZERpcmVjdGl2ZSB9IGZyb20gJy4uL3dpemFyZC93aXphcmQuZGlyZWN0aXZlJztcbmltcG9ydCB7IEFjY29yZGlvblNlcnZpY2UgfSBmcm9tICcuL2FjY29yZGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFVVSURTZXJ2aWNlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9zZXJ2aWNlcy91dWlkLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbdi1hY2NvcmRpb25dJyxcbiAgcHJvdmlkZXJzOiBbQWNjb3JkaW9uU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgQWNjb3JkaW9uRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBDb250ZW50Q2hpbGRyZW4oQWNjb3JkaW9uSGVhZGluZ0RpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBoZWFkaW5nczogUXVlcnlMaXN0PEFjY29yZGlvbkhlYWRpbmdEaXJlY3RpdmU+O1xuICBAQ29udGVudENoaWxkcmVuKEFjY29yZGlvblBhbmVsRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHBhbmVsczogUXVlcnlMaXN0PEFjY29yZGlvblBhbmVsRGlyZWN0aXZlPjtcbiAgYnV0dG9uQ2xpY2tlZFN1YnNjcmlwdGlvbnM6IGFueVtdID0gW107XG4gIEBDb250ZW50Q2hpbGRyZW4oQWNjb3JkaW9uRGV0YWlsc0RpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBhY2NvcmRpb25JdGVtczogUXVlcnlMaXN0PEFjY29yZGlvbkRldGFpbHNEaXJlY3RpdmU+O1xuICBfcmVtb3ZlRGVmYXVsdEZsZXg6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcbiAgX3JlbW92ZURlZmF1bHRHYXA6IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsIHwgYW55ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGN1c3RvbSBjbGFzcyYjNDA7ZXMmIzQxOyBmb3IgY3VzdG9tIHN0eWxpbmcuXG4gICAqIEBkZWZhdWx0IC52LWFjY29yZGlvblxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX2NsYXNzLFxuICAgICAgdGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGggPD0gMCAmJiAhdGhpcy53aXphcmQgPyAndi1hY2NvcmRpb24nIDogJycsXG4gICAgICAhdGhpcy5fcmVtb3ZlRGVmYXVsdEZsZXggJiYgdGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGggPiAwID8gJ3YtZmxleCB2LWZsZXgtY29sJyA6ICcnLFxuICAgICAgIXRoaXMuX3JlbW92ZURlZmF1bHRHYXAgJiYgdGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGggPiAwID8gJ3YtZ2FwLTYnIDogJydcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuICBzZXQgY2xhc3ModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NsYXNzID0gdmFsdWU7XG4gIH1cbiAgX2NsYXNzOiBzdHJpbmcgPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgbXVsdGlwbGUgYWNjb3JkaW9uIGl0ZW1zIHRvIGJlIGV4cGFuZGVkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBtdWx0aXNlbGVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlzZWxlY3Q7XG4gIH1cbiAgc2V0IG11bHRpc2VsZWN0KHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9tdWx0aXNlbGVjdCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX211bHRpc2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgc3VidGxlIGFjY29yZGlvbiBzdHlsaW5nIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBzdWJ0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnRsZTtcbiAgfVxuICBzZXQgc3VidGxlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9zdWJ0bGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuc2V0QXNTdWJ0bGUoKTtcbiAgfVxuICBfc3VidGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGluZGV4ZXMgb2YgZXhwYW5kZWQgaXRlbXMgd2hlbiBhbiBhY2NvcmRpb24gaXRlbSBpcyB0b2dnbGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIGl0ZW1zQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyW10+KCk7XG5cbiAgLyoqIHZhcmlhYmxlIHRoYXQgbWFpbnRhaW5zIHRoZSBhcnJheSBvZiBpbmRleGVzIG9mIGV4cGFuZGVkIGl0ZW1zICovXG4gIGl0ZW1zRXhwYW5kZWQ6IEFycmF5PG51bWJlcj4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFjY29yZGlvblNlcnZpY2U6IEFjY29yZGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB1dWlkU2VydmljZTogVVVJRFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmbGV4PzogRmxleERpcmVjdGl2ZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHdpemFyZD86IFdpemFyZERpcmVjdGl2ZVxuICApIHt9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGgpIHRoaXMuYWNjb3JkaW9uU2VydmljZS5zZXRVcEFjY29yZGlvbih0aGlzKTtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTsgLy8gZGV0ZWN0IGNoYW5nZXMgbWFkZSB0byBjb21wb25lbnQgd2l0aGluIHNldFVwQWNjb3JkaW9uXG4gICAgdGhpcy5zZXRBc1N1YnRsZSgpO1xuXG4gICAgLy8gcmVtb3ZlIGRlZmF1bHQgZmxleCBhbmQgZ2FwIGlmIHVzZXIgaGFzIHNldCB0aGVpciBvd25cbiAgICB0aGlzLl9yZW1vdmVEZWZhdWx0RmxleCA9IHRoaXMuZmxleCAmJiB0aGlzLmZsZXgudkZsZXhSb3c7XG4gICAgdGhpcy5fcmVtb3ZlRGVmYXVsdEdhcCA9IHRoaXMuZmxleCAmJiB0aGlzLmZsZXgudkdhcDtcblxuICAgIGlmICh0aGlzLmFjY29yZGlvbkl0ZW1zKSB7XG4gICAgICBpZiAodGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2V0VXBBY2NvcmRpb25JdGVtcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5hY2NvcmRpb25JdGVtcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0VXBBY2NvcmRpb25JdGVtcygpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGVhZGluZ3MpIHtcbiAgICAgIC8vIGN1c3RvbSBhY2Nlc3NpYmxlIG1hcmt1cFxuICAgICAgdGhpcy5zZXRVcEhlYWRpbmdzKCk7XG5cbiAgICAgIHRoaXMuaGVhZGluZ3MuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmFjY29yZGlvbkl0ZW1zQ2hhbmdlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGFuZWxzKSB7XG4gICAgICB0aGlzLnBhbmVscy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuYWNjb3JkaW9uSXRlbXNDaGFuZ2VkKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzZXRVcEFjY29yZGlvbkl0ZW1zKCkge1xuICAgIGNvbnN0IHNpbmdsZVNlbGVjdE5hbWUgPSB0aGlzLnV1aWRTZXJ2aWNlLmdldFVVSUQoJ2FjY29yZGlvbi1kZXRhaWxzLScpO1xuICAgIC8vIGRldGFpbC9zdW1tYXJ5IG1hcmt1cFxuICAgIHRoaXMuYWNjb3JkaW9uSXRlbXMudG9BcnJheSgpLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaXRlbS5leHBhbmRlZCkgdGhpcy5pdGVtc0V4cGFuZGVkLnB1c2goaW5kZXgpO1xuICAgICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0ICYmIGl0ZW0uaGVhZGluZy5ob3N0QnV0dG9uKSB7XG4gICAgICAgIGl0ZW0ubmFtZSA9IHNpbmdsZVNlbGVjdE5hbWU7XG4gICAgICAgIC8vIGEgbmV3IGl0ZW0gaXMgY2xpY2tlZCBpbiBhIG5vbi1tdWx0aXNlbGVjdFxuICAgICAgICBpdGVtLmhlYWRpbmcuaG9zdEJ1dHRvbi5jbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0uZXhwYW5kZWQpIHtcbiAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBleHBhbmRlZCBpdGVtcyBpZiBhbiBleHBhbmRlZCBpdGVtIGlzIGNsaWNrZWQgKGl0J3MgY2xvc2luZylcbiAgICAgICAgICAgIHRoaXMuaXRlbXNFeHBhbmRlZCA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLml0ZW1zRXhwYW5kZWQgPSBbaW5kZXhdO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tdWx0aXNlbGVjdCkge1xuICAgICAgICBpdGVtLnRvZ2dsZWQuc3Vic2NyaWJlKChleHBhbmRlZCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlVG9nZ2xlKGluZGV4LCBleHBhbmRlZCwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0VXBIZWFkaW5ncygpIHtcbiAgICAvLyBwcmlvcml0aXplIHRoZSBhY2NvcmRpb24gaXRlbXMgKG5hdGl2ZSBkZXRhaWxzL3N1bW1hcnkgYmVoYXZpb3IpIGlmIHRoZXkgYXJlIHByZXNlbnRcbiAgICBpZiAodGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGggPiAwKSByZXR1cm47XG4gICAgLy8gbG9vcCB0aHJvdWdoIHRoZSBoZWFkaW5nc1xuICAgIHRoaXMuaGVhZGluZ3MudG9BcnJheSgpLmZvckVhY2goKGhlYWRpbmcpID0+IHtcbiAgICAgIC8vIHN1YnNjcmliZSB0byBjbGlja3MgYW5kIHByb2dyYW1tYXRpYyB0b2dnbGVzXG4gICAgICBpZiAoaGVhZGluZy5ob3N0QnV0dG9uKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uU3Vic2NyaWJlKGhlYWRpbmcuaG9zdEJ1dHRvbiwgaGVhZGluZy5faW5kZXgpO1xuICAgICAgfSBlbHNlIGlmIChoZWFkaW5nLl9idXR0b25IZWFkaW5nKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uU3Vic2NyaWJlKGhlYWRpbmcuX2J1dHRvbkhlYWRpbmcsIGhlYWRpbmcuX2luZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChoZWFkaW5nLmV4cGFuZGVkKSB0aGlzLml0ZW1zRXhwYW5kZWQucHVzaChoZWFkaW5nLl9pbmRleCk7XG5cbiAgICAgIC8vIHN1YnNjcmliZSB0byBjaGFuZ2VzIGluIGhlYWRpbmcuZXhwYW5kZWRcbiAgICAgIGhlYWRpbmcudG9nZ2xlZC5zdWJzY3JpYmUoKGluZGV4KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlVG9nZ2xlKGluZGV4LCBoZWFkaW5nLmV4cGFuZGVkLCBmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldEFzU3VidGxlKCkge1xuICAgIGlmICh0aGlzLmhlYWRpbmdzKSB7XG4gICAgICB0aGlzLmhlYWRpbmdzLnRvQXJyYXkoKS5mb3JFYWNoKChoZWFkaW5nKSA9PiB7XG4gICAgICAgIGhlYWRpbmcuX3N1YnRsZS5zZXQodGhpcy5zdWJ0bGUpO1xuICAgICAgICBpZiAodGhpcy5zdWJ0bGUpIHtcbiAgICAgICAgICBjb25zdCBidXR0b24gPSBoZWFkaW5nLl9idXR0b25IZWFkaW5nIHx8IGhlYWRpbmcuaG9zdEJ1dHRvbjtcbiAgICAgICAgICBpZiAoIWJ1dHRvbi5fYnV0dG9uQ29sb3JTZXRCeVVzZXIpIGJ1dHRvbi5idXR0b25Db2xvciA9IEJ1dHRvbkNvbG9yLlRFUlRJQVJZO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFuZWxzKSB7XG4gICAgICB0aGlzLnBhbmVscy50b0FycmF5KCkuZm9yRWFjaCgocGFuZWwpID0+IHtcbiAgICAgICAgcGFuZWwuX3N1YnRsZS5zZXQodGhpcy5zdWJ0bGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYnV0dG9uU3Vic2NyaWJlKGJ1dHRvbjogQnV0dG9uRGlyZWN0aXZlLCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5idXR0b25DbGlja2VkU3Vic2NyaXB0aW9uc1tpbmRleF0gPSBidXR0b24uY2xpY2tlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5hY2NvcmRpb25TZXJ2aWNlLnRvZ2dsZUl0ZW0oaW5kZXgpO1xuICAgIH0pO1xuICB9XG5cbiAgYWNjb3JkaW9uSXRlbXNDaGFuZ2VkKCkge1xuICAgIC8vIHdoZW4gYWNjb3JkaW9uIGl0ZW1zIGNoYW5nZSB3ZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBhY2NvcmRpb24gYW5kIHNlcnZpY2VcbiAgICBpZiAodGhpcy5oZWFkaW5ncy5sZW5ndGggIT09IHRoaXMucGFuZWxzLmxlbmd0aCkgcmV0dXJuOyAvLyBhY2NvcmRpb24gaGFzbid0IGJlZW4gZnVsbHkgY2hhbmdlZCB5ZXQsIHdhaXRpbmcgb24gbWF0Y2hpbmcgaGVhZGluZyBvciBwYW5lbFxuXG4gICAgLy8gcmVzZXRcbiAgICB0aGlzLmJ1dHRvbkNsaWNrZWRTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YnNjcmlwdGlvbikgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5idXR0b25DbGlja2VkU3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIHRoaXMuYWNjb3JkaW9uU2VydmljZS5zZXRVcEFjY29yZGlvbih0aGlzKTtcbiAgICB0aGlzLnNldEFzU3VidGxlKCk7XG4gICAgaWYgKHRoaXMuaGVhZGluZ3MpIHRoaXMuc2V0VXBIZWFkaW5ncygpO1xuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgaGFuZGxlVG9nZ2xlKGluZGV4OiBudW1iZXIsIGV4cGFuZGVkOiBib29sZWFuLCBpc0RldGFpbHM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBfcHJldkl0ZW1zRXhwYW5kZWQgPSB0aGlzLml0ZW1zRXhwYW5kZWQ7XG4gICAgaWYgKGV4cGFuZGVkKSB7XG4gICAgICBpZiAoIWlzRGV0YWlscykgdGhpcy5hY2NvcmRpb25TZXJ2aWNlLmV4cGFuZEl0ZW0oaW5kZXgpO1xuICAgICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IHByZXZFeHBhbmRlZCA9IHRoaXMuaXRlbXNFeHBhbmRlZFswXTtcbiAgICAgICAgY29uc3QgYXJyID0gdGhpcy5hY2NvcmRpb25JdGVtcy5sZW5ndGggPiAwID8gdGhpcy5hY2NvcmRpb25JdGVtcy50b0FycmF5KCkgOiB0aGlzLmhlYWRpbmdzLnRvQXJyYXkoKTtcbiAgICAgICAgaWYgKHByZXZFeHBhbmRlZCA+PSAwICYmIHByZXZFeHBhbmRlZCAhPT0gaW5kZXgpIGFycltwcmV2RXhwYW5kZWRdLmV4cGFuZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXRlbXNFeHBhbmRlZCA9IFtpbmRleF07XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLml0ZW1zRXhwYW5kZWQuaW5jbHVkZXMoaW5kZXgpKSB0aGlzLml0ZW1zRXhwYW5kZWQucHVzaChpbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaXNEZXRhaWxzKSB0aGlzLmFjY29yZGlvblNlcnZpY2UuY29sbGFwc2VJdGVtKGluZGV4KTtcbiAgICAgIHRoaXMuaXRlbXNFeHBhbmRlZC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IGluZGV4KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXRlbXNFeHBhbmRlZCAhPT0gX3ByZXZJdGVtc0V4cGFuZGVkKSB0aGlzLml0ZW1zQ2hhbmdlZC5lbWl0KHRoaXMuaXRlbXNFeHBhbmRlZCk7XG4gIH1cbn1cbiJdfQ==