carbon-components-angular
Version:
Next generation components
191 lines • 21.8 kB
JavaScript
import { ChangeDetectionStrategy, Component, HostBinding, HostListener, Input, TemplateRef, ViewChild } from "@angular/core";
import { PopoverContainer } from "carbon-components-angular/popover";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
/**
* Get started with importing the module:
*
* ```typescript
* import { TooltipModule } from 'carbon-components-angular';
* ```
*
* [See demo](../../?path=/story/components-tooltip--basic)
*/
export class Tooltip extends PopoverContainer {
constructor(elementRef, ngZone, renderer, changeDetectorRef) {
super(elementRef, ngZone, renderer, changeDetectorRef);
this.elementRef = elementRef;
this.ngZone = ngZone;
this.renderer = renderer;
this.changeDetectorRef = changeDetectorRef;
this.tooltipClass = true;
this.id = `tooltip-${Tooltip.tooltipCount++}`;
/**
* Set delay before tooltip is shown
*/
this.enterDelayMs = 100;
/**
* Set delay when tooltip disappears
*/
this.leaveDelayMs = 300;
/**
* Prevent tooltip from showing, used by icon button
*/
this.disabled = false;
this.highContrast = true;
this.dropShadow = false;
}
mouseenter(event) {
// If a mouseleave is triggered before the tooltip is displayed (before setTimeout of mouseenter completes)
// we trigger the mouseleave only avoiding having to unecessary show the tooltip
clearTimeout(this.timeoutId);
this.timeoutId = setTimeout(() => {
this.handleChange(true, event);
}, this.enterDelayMs);
}
mouseleave(event) {
// If a mouseleave is triggered before the tooltip is displayed (before setTimeout of mouseenter completes)
// we trigger the mouseleave only avoiding having to unecessary show the tooltip
clearTimeout(this.timeoutId);
this.timeoutId = setTimeout(() => {
this.handleChange(false, event);
}, this.leaveDelayMs);
}
hostkeys(event) {
if (open && event.key === "Escape") {
event.stopPropagation();
this.handleChange(false, event);
}
}
// We are not focusing on entire popover, only the trigger
handleFocus(event) {
this.handleChange(true, event);
}
handleFocusOut(event) {
this.handleChange(false, event);
}
isTemplate(value) {
return value instanceof TemplateRef;
}
/**
* Close the popover and reopen it with updated values without emitting an event
* @param changes
*/
ngOnChanges(changes) {
// Close and reopen the popover, handle alignment/programmatic open/close
const originalState = this.isOpen;
this.handleChange(false);
// Ignore first change since content is not initialized
if ((changes.autoAlign && !changes.autoAlign.firstChange)
|| (changes.disabled && !changes.disabled.firstChange && !changes.disabled.currentValue)
// If description is set to empty string when open & autoAlign is true then set to a new value
// positioning of popover is broken because popover content ref/caret no longer exists
|| changes.description) {
/**
* When `disabled` is `true`, popover content node is removed. So when re-enabling `disabled`,
* we manually update view so querySelector can detect the popover content node.
* Otherwise, the position of the popover will be incorrect when autoAlign is enabled.
*/
this.changeDetectorRef.detectChanges();
// Reset the inline styles
this.popoverContentRef = this.elementRef.nativeElement.querySelector(".cds--popover-content");
this.popoverContentRef?.setAttribute("style", "");
this.caretRef = this.elementRef.nativeElement.querySelector("span.cds--popover-caret");
}
this.handleChange(originalState);
}
/**
* Check for any changes in the projected content & apply accessibility attribute if needed
*/
ngAfterContentChecked() {
if (this.wrapper) {
const buttonElement = this.wrapper.nativeElement.querySelector("button");
if (buttonElement && !buttonElement.getAttribute("aria-labelledby")) {
buttonElement.setAttribute("aria-labelledby", this.id);
}
}
}
}
Tooltip.tooltipCount = 0;
Tooltip.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Tooltip, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
Tooltip.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: Tooltip, selector: "cds-tooltip, ibm-tooltip", inputs: { id: "id", enterDelayMs: "enterDelayMs", leaveDelayMs: "leaveDelayMs", disabled: "disabled", description: "description", templateContext: "templateContext" }, host: { listeners: { "mouseenter": "mouseenter($event)", "mouseleave": "mouseleave($event)", "keyup": "hostkeys($event)", "focusin": "handleFocus($event)", "focusout": "handleFocusOut($event)" }, properties: { "class.cds--tooltip": "this.tooltipClass" } }, viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["contentWrapper"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
<span #contentWrapper>
<ng-content></ng-content>
</span>
<span
*ngIf="description"
class="cds--popover"
[id]="id"
[attr.aria-hidden]="!isOpen"
role="tooltip">
<ng-container *ngIf="!disabled">
<span class="cds--popover-content cds--tooltip-content">
<ng-container *ngIf="!isTemplate(description)">{{description}}</ng-container>
<ng-template *ngIf="isTemplate(description)" [ngTemplateOutlet]="description" [ngTemplateOutletContext]="{ $implicit: templateContext }"></ng-template>
<span *ngIf="autoAlign" class="cds--popover-caret cds--popover--auto-align"></span>
</span>
<span *ngIf="!autoAlign" class="cds--popover-caret"></span>
</ng-container>
</span>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Tooltip, decorators: [{
type: Component,
args: [{
selector: "cds-tooltip, ibm-tooltip",
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<span #contentWrapper>
<ng-content></ng-content>
</span>
<span
*ngIf="description"
class="cds--popover"
[id]="id"
[attr.aria-hidden]="!isOpen"
role="tooltip">
<ng-container *ngIf="!disabled">
<span class="cds--popover-content cds--tooltip-content">
<ng-container *ngIf="!isTemplate(description)">{{description}}</ng-container>
<ng-template *ngIf="isTemplate(description)" [ngTemplateOutlet]="description" [ngTemplateOutletContext]="{ $implicit: templateContext }"></ng-template>
<span *ngIf="autoAlign" class="cds--popover-caret cds--popover--auto-align"></span>
</span>
<span *ngIf="!autoAlign" class="cds--popover-caret"></span>
</ng-container>
</span>
`
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { tooltipClass: [{
type: HostBinding,
args: ["class.cds--tooltip"]
}], id: [{
type: Input
}], enterDelayMs: [{
type: Input
}], leaveDelayMs: [{
type: Input
}], disabled: [{
type: Input
}], description: [{
type: Input
}], templateContext: [{
type: Input
}], wrapper: [{
type: ViewChild,
args: ["contentWrapper"]
}], mouseenter: [{
type: HostListener,
args: ["mouseenter", ["$event"]]
}], mouseleave: [{
type: HostListener,
args: ["mouseleave", ["$event"]]
}], hostkeys: [{
type: HostListener,
args: ["keyup", ["$event"]]
}], handleFocus: [{
type: HostListener,
args: ["focusin", ["$event"]]
}], handleFocusOut: [{
type: HostListener,
args: ["focusout", ["$event"]]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbHRpcC90b29sdGlwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFLTCxXQUFXLEVBQ1gsU0FBUyxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7QUFFckU7Ozs7Ozs7O0dBUUc7QUF5QkgsTUFBTSxPQUFPLE9BQVEsU0FBUSxnQkFBZ0I7SUErQjVDLFlBQ1csVUFBc0IsRUFDdEIsTUFBYyxFQUNkLFFBQW1CLEVBQ25CLGlCQUFvQztRQUU5QyxLQUFLLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUw3QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFoQ1osaUJBQVksR0FBRyxJQUFJLENBQUM7UUFFOUMsT0FBRSxHQUFHLFdBQVcsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7UUFDbEQ7O1dBRUc7UUFDTSxpQkFBWSxHQUFHLEdBQUcsQ0FBQztRQUM1Qjs7V0FFRztRQUNNLGlCQUFZLEdBQUcsR0FBRyxDQUFDO1FBQzVCOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQXFCekIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUdELFVBQVUsQ0FBQyxLQUFLO1FBQ2YsMkdBQTJHO1FBQzNHLGdGQUFnRjtRQUNoRixZQUFZLENBQUMs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RDtTQUNEO0lBQ0YsQ0FBQzs7QUEvSE0sb0JBQVksR0FBRyxDQUFDLENBQUM7b0dBRFosT0FBTzt3RkFBUCxPQUFPLGdvQkFyQlQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFtQlQ7MkZBRVcsT0FBTztrQkF4Qm5CLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLDBCQUEwQjtvQkFDcEMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1CVDtpQkFDRDs4S0FJbUMsWUFBWTtzQkFBOUMsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBRXhCLEVBQUU7c0JBQVYsS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRXVCLE9BQU87c0JBQW5DLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQWdCM0IsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXdEMsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXdEMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVakMsV0FBVztzQkFEVixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFNbkMsY0FBYztzQkFEYixZQUFZO3VCQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdEFmdGVyQ29udGVudENoZWNrZWQsXG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDaGFuZ2VEZXRlY3RvclJlZixcblx0Q29tcG9uZW50LFxuXHRFbGVtZW50UmVmLFxuXHRIb3N0QmluZGluZyxcblx0SG9zdExpc3RlbmVyLFxuXHRJbnB1dCxcblx0Tmdab25lLFxuXHRPbkNoYW5nZXMsXG5cdFJlbmRlcmVyMixcblx0U2ltcGxlQ2hhbmdlcyxcblx0VGVtcGxhdGVSZWYsXG5cdFZpZXdDaGlsZFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgUG9wb3ZlckNvbnRhaW5lciB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL3BvcG92ZXJcIjtcblxuLyoqXG4gKiBHZXQgc3RhcnRlZCB3aXRoIGltcG9ydGluZyB0aGUgbW9kdWxlOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbiAqIGBgYFxuICpcbiAqIFtTZWUgZGVtb10oLi4vLi4vP3BhdGg9L3N0b3J5L2NvbXBvbmVudHMtdG9vbHRpcC0tYmFzaWMpXG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJjZHMtdG9vbHRpcCwgaWJtLXRvb2x0aXBcIixcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PHNwYW4gI2NvbnRlbnRXcmFwcGVyPlxuXHRcdFx0PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXHRcdDwvc3Bhbj5cblx0XHQ8c3BhblxuXHRcdFx0Km5nSWY9XCJkZXNjcmlwdGlvblwiXG5cdFx0XHRjbGFzcz1cImNkcy0tcG9wb3ZlclwiXG5cdFx0XHRbaWRdPVwiaWRcIlxuXHRcdFx0W2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzT3BlblwiXG5cdFx0XHRyb2xlPVwidG9vbHRpcFwiPlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkaXNhYmxlZFwiPlxuXHRcdFx0XHQ8c3BhbiBjbGFzcz1cImNkcy0tcG9wb3Zlci1jb250ZW50IGNkcy0tdG9vbHRpcC1jb250ZW50XCI+XG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGRlc2NyaXB0aW9uKVwiPnt7ZGVzY3JpcHRpb259fTwvbmctY29udGFpbmVyPlxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUoZGVzY3JpcHRpb24pXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGVzY3JpcHRpb25cIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHRlbXBsYXRlQ29udGV4dCB9XCI+PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImF1dG9BbGlnblwiIGNsYXNzPVwiY2RzLS1wb3BvdmVyLWNhcmV0IGNkcy0tcG9wb3Zlci0tYXV0by1hbGlnblwiPjwvc3Bhbj5cblx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8c3BhbiAqbmdJZj1cIiFhdXRvQWxpZ25cIiBjbGFzcz1cImNkcy0tcG9wb3Zlci1jYXJldFwiPjwvc3Bhbj5cblx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDwvc3Bhbj5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBUb29sdGlwIGV4dGVuZHMgUG9wb3ZlckNvbnRhaW5lciBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XG5cdHN0YXRpYyB0b29sdGlwQ291bnQgPSAwO1xuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tdG9vbHRpcFwiKSB0b29sdGlwQ2xhc3MgPSB0cnVlO1xuXG5cdEBJbnB1dCgpIGlkID0gYHRvb2x0aXAtJHtUb29sdGlwLnRvb2x0aXBDb3VudCsrfWA7XG5cdC8qKlxuXHQgKiBTZXQgZGVsYXkgYmVmb3JlIHRvb2x0aXAgaXMgc2hvd25cblx0ICovXG5cdEBJbnB1dCgpIGVudGVyRGVsYXlNcyA9IDEwMDtcblx0LyoqXG5cdCAqIFNldCBkZWxheSB3aGVuIHRvb2x0aXAgZGlzYXBwZWFyc1xuXHQgKi9cblx0QElucHV0KCkgbGVhdmVEZWxheU1zID0gMzAwO1xuXHQvKipcblx0ICogUHJldmVudCB0b29sdGlwIGZyb20gc2hvd2luZywgdXNlZCBieSBpY29uIGJ1dHRvblxuXHQgKi9cblx0QElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblx0LyoqXG5cdCAqIFRoZSBzdHJpbmcgb3IgdGVtcGxhdGUgY29udGVudCB0byBiZSBleHBvc2VkIGJ5IHRoZSB0b29sdGlwLlxuXHQgKi9cblx0QElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG5cdC8qKlxuXHQgKiBPcHRpb25hbCBkYXRhIGZvciB0ZW1wbGF0ZXMgcGFzc2VkIGFzIGltcGxpY2l0IGNvbnRleHRcblx0ICovXG5cdEBJbnB1dCgpIHRlbXBsYXRlQ29udGV4dDogYW55O1xuXG5cdEBWaWV3Q2hpbGQoXCJjb250ZW50V3JhcHBlclwiKSB3cmFwcGVyOiBFbGVtZW50UmVmPEhUTUxTcGFuRWxlbWVudD47XG5cblx0cHJpdmF0ZSB0aW1lb3V0SWQ6IGFueTsgLy8gaXQgc2hvdWxkIGJlIG51bWJlciwgYnV0IHNldFRpbWVvdXQgYmVsb3cgaXMgbWF0Y2hpbmcgdGhlIE5vZGVKcyB0eXBlIGluc3RlYWQgb2YgdGhlIEpTIHR5cGVcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZixcblx0XHRwcm90ZWN0ZWQgbmdab25lOiBOZ1pvbmUsXG5cdFx0cHJvdGVjdGVkIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG5cdFx0cHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuXHQpIHtcblx0XHRzdXBlcihlbGVtZW50UmVmLCBuZ1pvbmUsIHJlbmRlcmVyLCBjaGFuZ2VEZXRlY3RvclJlZik7XG5cdFx0dGhpcy5oaWdoQ29udHJhc3QgPSB0cnVlO1xuXHRcdHRoaXMuZHJvcFNoYWRvdyA9IGZhbHNlO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgW1wiJGV2ZW50XCJdKVxuXHRtb3VzZWVudGVyKGV2ZW50KSB7XG5cdFx0Ly8gSWYgYSBtb3VzZWxlYXZlIGlzIHRyaWdnZXJlZCBiZWZvcmUgdGhlIHRvb2x0aXAgaXMgZGlzcGxheWVkIChiZWZvcmUgc2V0VGltZW91dCBvZiBtb3VzZWVudGVyIGNvbXBsZXRlcylcblx0XHQvLyB3ZSB0cmlnZ2VyIHRoZSBtb3VzZWxlYXZlIG9ubHkgYXZvaWRpbmcgaGF2aW5nIHRvIHVuZWNlc3Nhcnkgc2hvdyB0aGUgdG9vbHRpcFxuXHRcdGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XG5cdFx0dGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRoaXMuaGFuZGxlQ2hhbmdlKHRydWUsIGV2ZW50KTtcblx0XHR9LCB0aGlzLmVudGVyRGVsYXlNcyk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCBbXCIkZXZlbnRcIl0pXG5cdG1vdXNlbGVhdmUoZXZlbnQpIHtcblx0XHQvLyBJZiBhIG1vdXNlbGVhdmUgaXMgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgdG9vbHRpcCBpcyBkaXNwbGF5ZWQgKGJlZm9yZSBzZXRUaW1lb3V0IG9mIG1vdXNlZW50ZXIgY29tcGxldGVzKVxuXHRcdC8vIHdlIHRyaWdnZXIgdGhlIG1vdXNlbGVhdmUgb25seSBhdm9pZGluZyBoYXZpbmcgdG8gdW5lY2Vzc2FyeSBzaG93IHRoZSB0b29sdGlwXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKTtcblx0XHR0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dGhpcy5oYW5kbGVDaGFuZ2UoZmFsc2UsIGV2ZW50KTtcblx0XHR9LCB0aGlzLmxlYXZlRGVsYXlNcyk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKFwia2V5dXBcIiwgW1wiJGV2ZW50XCJdKVxuXHRob3N0a2V5cyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xuXHRcdGlmIChvcGVuICYmIGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHR0aGlzLmhhbmRsZUNoYW5nZShmYWxzZSwgZXZlbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8vIFdlIGFyZSBub3QgZm9jdXNpbmcgb24gZW50aXJlIHBvcG92ZXIsIG9ubHkgdGhlIHRyaWdnZXJcblx0QEhvc3RMaXN0ZW5lcihcImZvY3VzaW5cIiwgW1wiJGV2ZW50XCJdKVxuXHRoYW5kbGVGb2N1cyhldmVudDogRXZlbnQpIHtcblx0XHR0aGlzLmhhbmRsZUNoYW5nZSh0cnVlLCBldmVudCk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgW1wiJGV2ZW50XCJdKVxuXHRoYW5kbGVGb2N1c091dChldmVudDogRXZlbnQpIHtcblx0XHR0aGlzLmhhbmRsZUNoYW5nZShmYWxzZSwgZXZlbnQpO1xuXHR9XG5cblx0aXNUZW1wbGF0ZSh2YWx1ZSkge1xuXHRcdHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlIHRoZSBwb3BvdmVyIGFuZCByZW9wZW4gaXQgd2l0aCB1cGRhdGVkIHZhbHVlcyB3aXRob3V0IGVtaXR0aW5nIGFuIGV2ZW50XG5cdCAqIEBwYXJhbSBjaGFuZ2VzXG5cdCAqL1xuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG5cdFx0Ly8gQ2xvc2UgYW5kIHJlb3BlbiB0aGUgcG9wb3ZlciwgaGFuZGxlIGFsaWdubWVudC9wcm9ncmFtbWF0aWMgb3Blbi9jbG9zZVxuXHRcdGNvbnN0IG9yaWdpbmFsU3RhdGUgPSB0aGlzLmlzT3Blbjtcblx0XHR0aGlzLmhhbmRsZUNoYW5nZShmYWxzZSk7XG5cblx0XHQvLyBJZ25vcmUgZmlyc3QgY2hhbmdlIHNpbmNlIGNvbnRlbnQgaXMgbm90IGluaXRpYWxpemVkXG5cdFx0aWYgKFxuXHRcdFx0KGNoYW5nZXMuYXV0b0FsaWduICYmICFjaGFuZ2VzLmF1dG9BbGlnbi5maXJzdENoYW5nZSlcblx0XHRcdHx8IChjaGFuZ2VzLmRpc2FibGVkICYmICFjaGFuZ2VzLmRpc2FibGVkLmZpcnN0Q2hhbmdlICYmICFjaGFuZ2VzLmRpc2FibGVkLmN1cnJlbnRWYWx1ZSlcblx0XHRcdC8vIElmIGRlc2NyaXB0aW9uIGlzIHNldCB0byBlbXB0eSBzdHJpbmcgd2hlbiBvcGVuICYgYXV0b0FsaWduIGlzIHRydWUgdGhlbiBzZXQgdG8gYSBuZXcgdmFsdWVcblx0XHRcdC8vIHBvc2l0aW9uaW5nIG9mIHBvcG92ZXIgaXMgYnJva2VuIGJlY2F1c2UgcG9wb3ZlciBjb250ZW50IHJlZi9jYXJldCBubyBsb25nZXIgZXhpc3RzXG5cdFx0XHR8fCBjaGFuZ2VzLmRlc2NyaXB0aW9uXG5cdFx0KSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFdoZW4gYGRpc2FibGVkYCBpcyBgdHJ1ZWAsIHBvcG92ZXIgY29udGVudCBub2RlIGlzIHJlbW92ZWQuIFNvIHdoZW4gcmUtZW5hYmxpbmcgYGRpc2FibGVkYCxcblx0XHRcdCAqIHdlIG1hbnVhbGx5IHVwZGF0ZSB2aWV3IHNvIHF1ZXJ5U2VsZWN0b3IgY2FuIGRldGVjdCB0aGUgcG9wb3ZlciBjb250ZW50IG5vZGUuXG5cdFx0XHQgKiBPdGhlcndpc2UsIHRoZSBwb3NpdGlvbiBvZiB0aGUgcG9wb3ZlciB3aWxsIGJlIGluY29ycmVjdCB3aGVuIGF1dG9BbGlnbiBpcyBlbmFibGVkLlxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcblxuXHRcdFx0Ly8gUmVzZXQgdGhlIGlubGluZSBzdHlsZXNcblx0XHRcdHRoaXMucG9wb3ZlckNvbnRlbnRSZWYgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLmNkcy0tcG9wb3Zlci1jb250ZW50XCIpO1xuXHRcdFx0dGhpcy5wb3BvdmVyQ29udGVudFJlZj8uc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJcIik7XG5cdFx0XHR0aGlzLmNhcmV0UmVmID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcInNwYW4uY2RzLS1wb3BvdmVyLWNhcmV0XCIpO1xuXHRcdH1cblxuXHRcdHRoaXMuaGFuZGxlQ2hhbmdlKG9yaWdpbmFsU3RhdGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGZvciBhbnkgY2hhbmdlcyBpbiB0aGUgcHJvamVjdGVkIGNvbnRlbnQgJiBhcHBseSBhY2Nlc3NpYmlsaXR5IGF0dHJpYnV0ZSBpZiBuZWVkZWRcblx0ICovXG5cdG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcblx0XHRpZiAodGhpcy53cmFwcGVyKSB7XG5cdFx0XHRjb25zdCBidXR0b25FbGVtZW50ID0gdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcImJ1dHRvblwiKTtcblx0XHRcdGlmIChidXR0b25FbGVtZW50ICYmICFidXR0b25FbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuXHRcdFx0XHRidXR0b25FbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiLCB0aGlzLmlkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiJdfQ==