carbon-components-angular
Version:
Next generation components
189 lines • 19.6 kB
JavaScript
import { Component, Input, ContentChildren, Output, EventEmitter, HostListener } from "@angular/core";
import { ContentSwitcherOption } from "./content-switcher-option.directive";
import { isFocusInLastItem, isFocusInFirstItem } from "carbon-components-angular/common";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
/**
* The content switcher can be used for toggling between distinct options.
* Similar to tabs, but without an associated content panel.
*
* Get started with importing the module:
*
* ```typescript
* import { ContentSwitcherModule } from 'carbon-components-angular';
* ```
*
* ```html
* <cds-content-switcher (selected)="selected($event)">
* <button cdsContentOption>First section</button>
* <button cdsContentOption>Second section</button>
* <button cdsContentOption>Third section</button>
* </cds-content-switcher>
* ```
*
* [See demo](../../?path=/story/components-content-switcher--basic)
*/
export class ContentSwitcher {
constructor(elementRef) {
this.elementRef = elementRef;
this.ariaLabel = "content switcher";
/**
* Set content switcher size
*/
this.size = "md";
/**
* Specify whether the ContentSwitcher should be the low contrast variant.
*/
this.lowContrast = false;
/**
* When `automatic`, the focused switcher will be selected by default. For `manual`,
* user will have to manually select via Enter/space (which fire the native click handler).
*
* Passes selected mode to all content switcher children
*/
this.selectionMode = "automatic";
/**
* Emits the activated `ContentSwitcherOption`
*/
this.selected = new EventEmitter();
}
ngOnChanges(changes) {
if (this.options) {
if (changes.selectedIndex) {
this.applySelectedIndex();
}
if (changes.selectionMode) {
this.options.forEach(option => option.selectionMode = this.selectionMode);
}
}
}
ngAfterViewInit() {
if (this.selectedIndex !== undefined) {
this.applySelectedIndex();
}
else {
const firstActive = this.options.find(option => option.active);
// delay setting active until the DOM has settled
if (!firstActive) {
setTimeout(() => this.options.first.active = true);
}
}
// propagate selectionMode so each option can honor 'manual' selection
this.options.forEach(option => option.selectionMode = this.selectionMode);
// subscribe to each item, emit when one is selected, and reset the active states
this.options.forEach(option => {
option.selected.subscribe((_) => {
const active = option;
this.options.forEach(option => {
if (option !== active) {
option.active = false;
}
});
this.selected.emit(active);
});
});
}
hostkeys(event) {
const buttonList = Array.from(this.elementRef.nativeElement.querySelectorAll("[cdsContentOption], [ibmContentOption]"));
switch (event.key) {
case "ArrowRight":
event.preventDefault();
if (!isFocusInLastItem(event, buttonList)) {
const index = buttonList.findIndex(item => item === event.target);
buttonList[index + 1].focus();
}
else {
buttonList[0].focus();
}
break;
case "ArrowLeft":
event.preventDefault();
if (!isFocusInFirstItem(event, buttonList)) {
const index = buttonList.findIndex(item => item === event.target);
buttonList[index - 1].focus();
}
else {
buttonList[buttonList.length - 1].focus();
}
break;
case "Home":
event.preventDefault();
buttonList[0].focus();
break;
case "End":
event.preventDefault();
buttonList[buttonList.length - 1].focus();
break;
}
}
applySelectedIndex() {
if (this.selectedIndex === undefined) {
return;
}
const list = this.options.toArray();
if (!list.length) {
return;
}
const target = list[this.selectedIndex];
if (!target) {
return;
}
list.forEach(option => {
option.active = option === target;
});
}
}
ContentSwitcher.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ContentSwitcher, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
ContentSwitcher.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ContentSwitcher, selector: "cds-content-switcher, ibm-content-switcher", inputs: { ariaLabel: "ariaLabel", size: "size", lowContrast: "lowContrast", selectionMode: "selectionMode", selectedIndex: "selectedIndex" }, outputs: { selected: "selected" }, host: { listeners: { "keydown": "hostkeys($event)" } }, queries: [{ propertyName: "options", predicate: ContentSwitcherOption }], usesOnChanges: true, ngImport: i0, template: `
<div
[attr.aria-label]="ariaLabel"
class="cds--content-switcher"
[ngClass]="{
'cds--content-switcher--sm': size === 'sm',
'cds--content-switcher--md': size === 'md',
'cds--content-switcher--lg': size === 'lg',
'cds--content-switcher--low-contrast': lowContrast
}"
role="tablist">
<ng-content></ng-content>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ContentSwitcher, decorators: [{
type: Component,
args: [{
selector: "cds-content-switcher, ibm-content-switcher",
template: `
<div
[attr.aria-label]="ariaLabel"
class="cds--content-switcher"
[ngClass]="{
'cds--content-switcher--sm': size === 'sm',
'cds--content-switcher--md': size === 'md',
'cds--content-switcher--lg': size === 'lg',
'cds--content-switcher--low-contrast': lowContrast
}"
role="tablist">
<ng-content></ng-content>
</div>
`
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { ariaLabel: [{
type: Input
}], size: [{
type: Input
}], lowContrast: [{
type: Input
}], selectionMode: [{
type: Input
}], selectedIndex: [{
type: Input
}], selected: [{
type: Output
}], options: [{
type: ContentChildren,
args: [ContentSwitcherOption]
}], hostkeys: [{
type: HostListener,
args: ["keydown", ["$event"]]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1zd2l0Y2hlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udGVudC1zd2l0Y2hlci9jb250ZW50LXN3aXRjaGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxlQUFlLEVBRWYsTUFBTSxFQUNOLFlBQVksRUFFWixZQUFZLEVBSVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7OztBQUV6Rjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQWtCSCxNQUFNLE9BQU8sZUFBZTtJQW1DM0IsWUFBc0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQWxDbkMsY0FBUyxHQUFHLGtCQUFrQixDQUFDO1FBRXhDOztXQUVHO1FBQ00sU0FBSSxHQUF1QixJQUFJLENBQUM7UUFFekM7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUU3Qjs7Ozs7V0FLRztRQUNNLGtCQUFhLEdBQTJCLFdBQVcsQ0FBQztRQVM3RDs7V0FFRztRQUNPLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBeUIsQ0FBQztJQUloQixDQUFDO0lBRWhELFdBQVcsQ0FBQyxPQUFzQjtRQUNqQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFO2dCQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUMxQjtZQUNELElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLElBQUksQ0FB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QURQLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q29tcG9uZW50LFxuXHRJbnB1dCxcblx0Q29udGVudENoaWxkcmVuLFxuXHRRdWVyeUxpc3QsXG5cdE91dHB1dCxcblx0RXZlbnRFbWl0dGVyLFxuXHRBZnRlclZpZXdJbml0LFxuXHRIb3N0TGlzdGVuZXIsXG5cdEVsZW1lbnRSZWYsXG5cdE9uQ2hhbmdlcyxcblx0U2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29udGVudFN3aXRjaGVyT3B0aW9uIH0gZnJvbSBcIi4vY29udGVudC1zd2l0Y2hlci1vcHRpb24uZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBpc0ZvY3VzSW5MYXN0SXRlbSwgaXNGb2N1c0luRmlyc3RJdGVtIH0gZnJvbSBcImNhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvY29tbW9uXCI7XG5cbi8qKlxuICogVGhlIGNvbnRlbnQgc3dpdGNoZXIgY2FuIGJlIHVzZWQgZm9yIHRvZ2dsaW5nIGJldHdlZW4gZGlzdGluY3Qgb3B0aW9ucy5cbiAqIFNpbWlsYXIgdG8gdGFicywgYnV0IHdpdGhvdXQgYW4gYXNzb2NpYXRlZCBjb250ZW50IHBhbmVsLlxuICpcbiAqIEdldCBzdGFydGVkIHdpdGggaW1wb3J0aW5nIHRoZSBtb2R1bGU6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQ29udGVudFN3aXRjaGVyTW9kdWxlIH0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG4gKiBgYGBcbiAqXG4gKiBgYGBodG1sXG4gKiA8Y2RzLWNvbnRlbnQtc3dpdGNoZXIgKHNlbGVjdGVkKT1cInNlbGVjdGVkKCRldmVudClcIj5cbiAqXHRcdDxidXR0b24gY2RzQ29udGVudE9wdGlvbj5GaXJzdCBzZWN0aW9uPC9idXR0b24+XG4gKlx0XHQ8YnV0dG9uIGNkc0NvbnRlbnRPcHRpb24+U2Vjb25kIHNlY3Rpb248L2J1dHRvbj5cbiAqXHRcdDxidXR0b24gY2RzQ29udGVudE9wdGlvbj5UaGlyZCBzZWN0aW9uPC9idXR0b24+XG4gKiA8L2Nkcy1jb250ZW50LXN3aXRjaGVyPlxuICogYGBgXG4gKlxuICogW1NlZSBkZW1vXSguLi8uLi8/cGF0aD0vc3RvcnkvY29tcG9uZW50cy1jb250ZW50LXN3aXRjaGVyLS1iYXNpYylcbiAqL1xuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiBcImNkcy1jb250ZW50LXN3aXRjaGVyLCBpYm0tY29udGVudC1zd2l0Y2hlclwiLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxkaXZcblx0XHRcdFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcblx0XHRcdGNsYXNzPVwiY2RzLS1jb250ZW50LXN3aXRjaGVyXCJcblx0XHRcdFtuZ0NsYXNzXT1cIntcblx0XHRcdFx0J2Nkcy0tY29udGVudC1zd2l0Y2hlci0tc20nOiBzaXplID09PSAnc20nLFxuXHRcdFx0XHQnY2RzLS1jb250ZW50LXN3aXRjaGVyLS1tZCc6IHNpemUgPT09ICdtZCcsXG5cdFx0XHRcdCdjZHMtLWNvbnRlbnQtc3dpdGNoZXItLWxnJzogc2l6ZSA9PT0gJ2xnJyxcblx0XHRcdFx0J2Nkcy0tY29udGVudC1zd2l0Y2hlci0tbG93LWNvbnRyYXN0JzogbG93Q29udHJhc3Rcblx0XHRcdH1cIlxuXHRcdFx0cm9sZT1cInRhYmxpc3RcIj5cblx0XHRcdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblx0XHQ8L2Rpdj5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBDb250ZW50U3dpdGNoZXIgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuXHRASW5wdXQoKSBhcmlhTGFiZWwgPSBcImNvbnRlbnQgc3dpdGNoZXJcIjtcblxuXHQvKipcblx0ICogU2V0IGNvbnRlbnQgc3dpdGNoZXIgc2l6ZVxuXHQgKi9cblx0QElucHV0KCkgc2l6ZTogXCJzbVwiIHwgXCJtZFwiIHwgXCJsZ1wiID0gXCJtZFwiO1xuXG5cdC8qKlxuXHQgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIENvbnRlbnRTd2l0Y2hlciBzaG91bGQgYmUgdGhlIGxvdyBjb250cmFzdCB2YXJpYW50LlxuXHQgKi9cblx0QElucHV0KCkgbG93Q29udHJhc3QgPSBmYWxzZTtcblxuXHQvKipcblx0ICogV2hlbiBgYXV0b21hdGljYCwgdGhlIGZvY3VzZWQgc3dpdGNoZXIgd2lsbCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0LiBGb3IgYG1hbnVhbGAsXG5cdCAqIHVzZXIgd2lsbCBoYXZlIHRvIG1hbnVhbGx5IHNlbGVjdCB2aWEgRW50ZXIvc3BhY2UgKHdoaWNoIGZpcmUgdGhlIG5hdGl2ZSBjbGljayBoYW5kbGVyKS5cblx0ICpcblx0ICogUGFzc2VzIHNlbGVjdGVkIG1vZGUgdG8gYWxsIGNvbnRlbnQgc3dpdGNoZXIgY2hpbGRyZW5cblx0ICovXG5cdEBJbnB1dCgpIHNlbGVjdGlvbk1vZGU6IFwiYXV0b21hdGljXCIgfCBcIm1hbnVhbFwiID0gXCJhdXRvbWF0aWNcIjtcblxuXHQvKipcblx0ICogSW5kZXggb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24gKHplcm8tYmFzZWQpLiBXaGVuIHNldCwgdGhlXG5cdCAqIG1hdGNoaW5nIGBjZHNDb250ZW50T3B0aW9uYCBpcyBhY3RpdmF0ZWQgYW5kIGFueSBvdGhlciBvcHRpb24gYmVjb21lc1xuXHQgKiBpbmFjdGl2ZS5cblx0ICovXG5cdEBJbnB1dCgpIHNlbGVjdGVkSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogRW1pdHMgdGhlIGFjdGl2YXRlZCBgQ29udGVudFN3aXRjaGVyT3B0aW9uYFxuXHQgKi9cblx0QE91dHB1dCgpIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxDb250ZW50U3dpdGNoZXJPcHRpb24+KCk7XG5cblx0QENvbnRlbnRDaGlsZHJlbihDb250ZW50U3dpdGNoZXJPcHRpb24pIG9wdGlvbnM6IFF1ZXJ5TGlzdDxDb250ZW50U3dpdGNoZXJPcHRpb24+O1xuXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxuXG5cdG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcblx0XHRpZiAodGhpcy5vcHRpb25zKSB7XG5cdFx0XHRpZiAoY2hhbmdlcy5zZWxlY3RlZEluZGV4KSB7XG5cdFx0XHRcdHRoaXMuYXBwbHlTZWxlY3RlZEluZGV4KCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY2hhbmdlcy5zZWxlY3Rpb25Nb2RlKSB7XG5cdFx0XHRcdHRoaXMub3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0aW9uTW9kZSA9IHRoaXMuc2VsZWN0aW9uTW9kZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0bmdBZnRlclZpZXdJbml0KCkge1xuXHRcdGlmICh0aGlzLnNlbGVjdGVkSW5kZXggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5hcHBseVNlbGVjdGVkSW5kZXgoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgZmlyc3RBY3RpdmUgPSB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLmFjdGl2ZSk7XG5cdFx0XHQvLyBkZWxheSBzZXR0aW5nIGFjdGl2ZSB1bnRpbCB0aGUgRE9NIGhhcyBzZXR0bGVkXG5cdFx0XHRpZiAoIWZpcnN0QWN0aXZlKSB7XG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vcHRpb25zLmZpcnN0LmFjdGl2ZSA9IHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBwcm9wYWdhdGUgc2VsZWN0aW9uTW9kZSBzbyBlYWNoIG9wdGlvbiBjYW4gaG9ub3IgJ21hbnVhbCcgc2VsZWN0aW9uXG5cdFx0dGhpcy5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IG9wdGlvbi5zZWxlY3Rpb25Nb2RlID0gdGhpcy5zZWxlY3Rpb25Nb2RlKTtcblx0XHQvLyBzdWJzY3JpYmUgdG8gZWFjaCBpdGVtLCBlbWl0IHdoZW4gb25lIGlzIHNlbGVjdGVkLCBhbmQgcmVzZXQgdGhlIGFjdGl2ZSBzdGF0ZXNcblx0XHR0aGlzLm9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuXHRcdFx0b3B0aW9uLnNlbGVjdGVkLnN1YnNjcmliZSgoXzogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRjb25zdCBhY3RpdmUgPSBvcHRpb247XG5cdFx0XHRcdHRoaXMub3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XG5cdFx0XHRcdFx0aWYgKG9wdGlvbiAhPT0gYWN0aXZlKSB7XG5cdFx0XHRcdFx0XHRvcHRpb24uYWN0aXZlID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5zZWxlY3RlZC5lbWl0KGFjdGl2ZSk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoXCJrZXlkb3duXCIsIFtcIiRldmVudFwiXSlcblx0aG9zdGtleXMoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcblx0XHRjb25zdCBidXR0b25MaXN0ID0gQXJyYXkuZnJvbTxhbnk+KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbY2RzQ29udGVudE9wdGlvbl0sIFtpYm1Db250ZW50T3B0aW9uXVwiKSk7XG5cblx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xuXHRcdFx0Y2FzZSBcIkFycm93UmlnaHRcIjpcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0aWYgKCFpc0ZvY3VzSW5MYXN0SXRlbShldmVudCwgYnV0dG9uTGlzdCkpICB7XG5cdFx0XHRcdFx0Y29uc3QgaW5kZXggPSBidXR0b25MaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0gPT09IGV2ZW50LnRhcmdldCk7XG5cdFx0XHRcdFx0YnV0dG9uTGlzdFtpbmRleCArIDFdLmZvY3VzKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YnV0dG9uTGlzdFswXS5mb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiQXJyb3dMZWZ0XCI6XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdGlmICghaXNGb2N1c0luRmlyc3RJdGVtKGV2ZW50LCBidXR0b25MaXN0KSkgIHtcblx0XHRcdFx0XHRjb25zdCBpbmRleCA9IGJ1dHRvbkxpc3QuZmluZEluZGV4KGl0ZW0gPT4gaXRlbSA9PT0gZXZlbnQudGFyZ2V0KTtcblx0XHRcdFx0XHRidXR0b25MaXN0W2luZGV4IC0gMV0uZm9jdXMoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRidXR0b25MaXN0W2J1dHRvbkxpc3QubGVuZ3RoIC0gMV0uZm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcIkhvbWVcIjpcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0YnV0dG9uTGlzdFswXS5mb2N1cygpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcIkVuZFwiOlxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRidXR0b25MaXN0W2J1dHRvbkxpc3QubGVuZ3RoIC0gMV0uZm9jdXMoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhcHBseVNlbGVjdGVkSW5kZXgoKSB7XG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGxpc3QgPSB0aGlzLm9wdGlvbnMudG9BcnJheSgpO1xuXHRcdGlmICghbGlzdC5sZW5ndGgpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdGFyZ2V0ID0gbGlzdFt0aGlzLnNlbGVjdGVkSW5kZXhdO1xuXHRcdGlmICghdGFyZ2V0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGxpc3QuZm9yRWFjaChvcHRpb24gPT4ge1xuXHRcdFx0b3B0aW9uLmFjdGl2ZSA9IG9wdGlvbiA9PT0gdGFyZ2V0O1xuXHRcdH0pO1xuXHR9XG59XG4iXX0=