@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
121 lines • 16.1 kB
JavaScript
import { TranslateDirective, TranslateService } from '@ngx-translate/core';
import { ChangeDetectorRef, Directive, ElementRef, EventEmitter } from '@angular/core';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
export class C8yTranslateDirective extends TranslateDirective {
/**
* Used to get private element property from TranslateDirective, so it doesn't throw tsErrors
*/
get _elementRef() {
return this.element;
}
/**
* Used to get private translateService property from TranslateDirective, so it doesn't throw tsErrors
*/
get _translateService() {
return this.translateService;
}
constructor(translateService, element, _ref) {
super(translateService, element, _ref);
/**
* Used to trigger events when html is replaced by directive.
*/
this.htmlUpdateEvent = new EventEmitter();
this.destroy$ = new Subject();
this.elementTranslated = false;
translateService.onLangChange.pipe(takeUntil(this.destroy$)).subscribe(() => {
if (!this.htmlMode) {
element.nativeElement.innerHTML = this.initialValue;
this.setTranslatedStatus(false);
_ref.detectChanges();
}
});
}
/**
* Overridden method from original directive.
* For simple text nodes, it just invokes the base method.
* For complex nodes, it builds translation key from whole inner HTML
* and replaces it with its translation.
* This prevents splitting HTML into pieces and attempting to translate each one separately
* which doesn't work, because we extract strings in whole.
*/
checkNodes(forceUpdate = false, translations) {
if (!this.htmlMode && (this.isElementSimpleTextType() || this.isElementInnerHtmlEmpty())) {
/**
* If element does not contain complex html, then fallBack to default logic.
*/
if (!this.elementTranslated) {
super.checkNodes(forceUpdate, translations);
this.setTranslatedStatus(true);
}
}
else {
this.htmlMode = true;
if (this.isLookupKeyMissing()) {
this._elementRef.nativeElement.lookupKey = this.getLookupKey();
}
if (this.lookupKeyExist()) {
const newTranslation = this.getNewTranslation();
if (!this.lastTranslation || this.lastTranslation !== newTranslation) {
this.lastTranslation = newTranslation;
this.updateHtmlContent();
this.htmlUpdateEvent.emit();
}
}
}
}
ngOnChanges(changes) {
if (changes && changes.translateParams) {
this.setTranslatedStatus(false);
}
}
ngOnDestroy() {
this.htmlUpdateEvent.complete();
this.destroy$.next();
this.destroy$.complete();
super.ngOnDestroy();
}
ngAfterViewInit() {
this.initialValue = this._elementRef.nativeElement.innerHTML;
}
setTranslatedStatus(status) {
this.elementTranslated = status;
}
/**
* Builds lookup key from innerHTML, removes comments (that might be added by Angular) and trims it.
*/
getLookupKey() {
return this._elementRef.nativeElement.innerHTML.replace(/<!--.*?-->/gs, '').trim();
}
isElementSimpleTextType() {
return (this._elementRef.nativeElement.childNodes.length === 1 &&
this._elementRef.nativeElement.childNodes[0].nodeType === 3);
}
isElementInnerHtmlEmpty() {
return !this._elementRef.nativeElement.innerHTML;
}
isLookupKeyMissing() {
return !this._elementRef.nativeElement.lookupKey;
}
lookupKeyExist() {
return this._elementRef.nativeElement.lookupKey;
}
getNewTranslation() {
return this._translateService.instant(this._elementRef.nativeElement.lookupKey, this.currentParams || {});
}
updateHtmlContent() {
this._elementRef.nativeElement.innerHTML = this.lastTranslation;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: C8yTranslateDirective, deps: [{ token: i1.TranslateService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: C8yTranslateDirective, isStandalone: true, selector: "[translate],[ngx-translate]", usesInheritance: true, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: C8yTranslateDirective, decorators: [{
type: Directive,
args: [{
selector: '[translate],[ngx-translate]',
standalone: true
}]
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYzh5LXRyYW5zbGF0ZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2kxOG4vYzh5LXRyYW5zbGF0ZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0UsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFJYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBTTNDLE1BQU0sT0FBTyxxQkFDWCxTQUFRLGtCQUFrQjtJQUcxQjs7T0FFRztJQUNILElBQVksV0FBVztRQUNyQixPQUFRLElBQVksQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBWSxpQkFBaUI7UUFDM0IsT0FBUSxJQUFZLENBQUMsZ0JBQWdCLENBQUM7SUFDeEMsQ0FBQztJQXVCRCxZQUFZLGdCQUFrQyxFQUFFLE9BQW1CLEVBQUUsSUFBdUI7UUFDMUYsS0FBSyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQXRCekM7O1dBRUc7UUFDSCxvQkFBZSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBZS9ELGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQy9CLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUt4QixnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsVUFBVSxDQUFDLFdBQVcsR0FBRyxLQUFLLEVBQUUsWUFBa0I7UUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekY7O2VBRUc7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzVCLEtBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2pFLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO2dCQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxjQUFjLEVBQUUsQ0FBQztvQkFDckUsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM5QixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7SUFDL0QsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQWU7UUFDakMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckYsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixPQUFPLENBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUM1RCxDQUFDO0lBQ0osQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO0lBQ25ELENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUNuRCxDQUFDO0lBRU8sY0FBYztRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUNsRCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUN4QyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FDekIsQ0FBQztJQUNKLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDbEUsQ0FBQzsrR0E1SVUscUJBQXFCO21HQUFyQixxQkFBcUI7OzRGQUFyQixxQkFBcUI7a0JBSmpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDZCQUE2QjtvQkFDdkMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNsYXRlRGlyZWN0aXZlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdHJhbnNsYXRlXSxbbmd4LXRyYW5zbGF0ZV0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIEM4eVRyYW5zbGF0ZURpcmVjdGl2ZVxuICBleHRlbmRzIFRyYW5zbGF0ZURpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzXG57XG4gIC8qKlxuICAgKiBVc2VkIHRvIGdldCBwcml2YXRlIGVsZW1lbnQgcHJvcGVydHkgZnJvbSBUcmFuc2xhdGVEaXJlY3RpdmUsIHNvIGl0IGRvZXNuJ3QgdGhyb3cgdHNFcnJvcnNcbiAgICovXG4gIHByaXZhdGUgZ2V0IF9lbGVtZW50UmVmKCk6IEVsZW1lbnRSZWYge1xuICAgIHJldHVybiAodGhpcyBhcyBhbnkpLmVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBnZXQgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlIHByb3BlcnR5IGZyb20gVHJhbnNsYXRlRGlyZWN0aXZlLCBzbyBpdCBkb2Vzbid0IHRocm93IHRzRXJyb3JzXG4gICAqL1xuICBwcml2YXRlIGdldCBfdHJhbnNsYXRlU2VydmljZSgpOiBUcmFuc2xhdGVTZXJ2aWNlIHtcbiAgICByZXR1cm4gKHRoaXMgYXMgYW55KS50cmFuc2xhdGVTZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gdHJpZ2dlciBldmVudHMgd2hlbiBodG1sIGlzIHJlcGxhY2VkIGJ5IGRpcmVjdGl2ZS5cbiAgICovXG4gIGh0bWxVcGRhdGVFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgZGlyZWN0aXZlIHN1Y2Nlc3NmdWxseSB0cmFuc2xhdGVzIG5vZGUsIGl0IHN0b3JlcyBpdHMgdmFsdWUgaW4gdGhpcyBwcm9wZXJ0eS5cbiAgICogQW5vdGhlciB0cmFuc2xhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBvbmx5IGlmIG5ldyB0cmFuc2xhdGlvbiB2YWx1ZSBkaWZmZXJzIGZyb20gc3RvcmVkIG9uZS5cbiAgICovXG4gIGxhc3RUcmFuc2xhdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgZGlyZWN0aXZlIGVuY291bnRlcnMgZWxlbWVudCB0aGF0IGlzIEhUTUwsIGl0IHNob3VsZCBzd2l0Y2ggdG8gSHRtbCBtb2RlIGV2ZW4gaWZcbiAgICogbmV3IHRyYW5zbGF0ZWQgZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGFueSBIVE1MLlxuICAgKi9cbiAgaHRtbE1vZGU6IGJvb2xlYW47XG5cbiAgaW5pdGlhbFZhbHVlOiBzdHJpbmc7XG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgZWxlbWVudFRyYW5zbGF0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcih0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLCBlbGVtZW50OiBFbGVtZW50UmVmLCBfcmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHN1cGVyKHRyYW5zbGF0ZVNlcnZpY2UsIGVsZW1lbnQsIF9yZWYpO1xuXG4gICAgdHJhbnNsYXRlU2VydmljZS5vbkxhbmdDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaHRtbE1vZGUpIHtcbiAgICAgICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuaW5pdGlhbFZhbHVlO1xuICAgICAgICB0aGlzLnNldFRyYW5zbGF0ZWRTdGF0dXMoZmFsc2UpO1xuICAgICAgICBfcmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZGVuIG1ldGhvZCBmcm9tIG9yaWdpbmFsIGRpcmVjdGl2ZS5cbiAgICogRm9yIHNpbXBsZSB0ZXh0IG5vZGVzLCBpdCBqdXN0IGludm9rZXMgdGhlIGJhc2UgbWV0aG9kLlxuICAgKiBGb3IgY29tcGxleCBub2RlcywgaXQgYnVpbGRzIHRyYW5zbGF0aW9uIGtleSBmcm9tIHdob2xlIGlubmVyIEhUTUxcbiAgICogYW5kIHJlcGxhY2VzIGl0IHdpdGggaXRzIHRyYW5zbGF0aW9uLlxuICAgKiBUaGlzIHByZXZlbnRzIHNwbGl0dGluZyBIVE1MIGludG8gcGllY2VzIGFuZCBhdHRlbXB0aW5nIHRvIHRyYW5zbGF0ZSBlYWNoIG9uZSBzZXBhcmF0ZWx5XG4gICAqIHdoaWNoIGRvZXNuJ3Qgd29yaywgYmVjYXVzZSB3ZSBleHRyYWN0IHN0cmluZ3MgaW4gd2hvbGUuXG4gICAqL1xuICBjaGVja05vZGVzKGZvcmNlVXBkYXRlID0gZmFsc2UsIHRyYW5zbGF0aW9ucz86IGFueSkge1xuICAgIGlmICghdGhpcy5odG1sTW9kZSAmJiAodGhpcy5pc0VsZW1lbnRTaW1wbGVUZXh0VHlwZSgpIHx8IHRoaXMuaXNFbGVtZW50SW5uZXJIdG1sRW1wdHkoKSkpIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGNvbXBsZXggaHRtbCwgdGhlbiBmYWxsQmFjayB0byBkZWZhdWx0IGxvZ2ljLlxuICAgICAgICovXG4gICAgICBpZiAoIXRoaXMuZWxlbWVudFRyYW5zbGF0ZWQpIHtcbiAgICAgICAgc3VwZXIuY2hlY2tOb2Rlcyhmb3JjZVVwZGF0ZSwgdHJhbnNsYXRpb25zKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc2xhdGVkU3RhdHVzKHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmh0bWxNb2RlID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmlzTG9va3VwS2V5TWlzc2luZygpKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5sb29rdXBLZXkgPSB0aGlzLmdldExvb2t1cEtleSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubG9va3VwS2V5RXhpc3QoKSkge1xuICAgICAgICBjb25zdCBuZXdUcmFuc2xhdGlvbiA9IHRoaXMuZ2V0TmV3VHJhbnNsYXRpb24oKTtcbiAgICAgICAgaWYgKCF0aGlzLmxhc3RUcmFuc2xhdGlvbiB8fCB0aGlzLmxhc3RUcmFuc2xhdGlvbiAhPT0gbmV3VHJhbnNsYXRpb24pIHtcbiAgICAgICAgICB0aGlzLmxhc3RUcmFuc2xhdGlvbiA9IG5ld1RyYW5zbGF0aW9uO1xuICAgICAgICAgIHRoaXMudXBkYXRlSHRtbENvbnRlbnQoKTtcbiAgICAgICAgICB0aGlzLmh0bWxVcGRhdGVFdmVudC5lbWl0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy50cmFuc2xhdGVQYXJhbXMpIHtcbiAgICAgIHRoaXMuc2V0VHJhbnNsYXRlZFN0YXR1cyhmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5odG1sVXBkYXRlRXZlbnQuY29tcGxldGUoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pbm5lckhUTUw7XG4gIH1cblxuICBzZXRUcmFuc2xhdGVkU3RhdHVzKHN0YXR1czogYm9vbGVhbikge1xuICAgIHRoaXMuZWxlbWVudFRyYW5zbGF0ZWQgPSBzdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGxvb2t1cCBrZXkgZnJvbSBpbm5lckhUTUwsIHJlbW92ZXMgY29tbWVudHMgKHRoYXQgbWlnaHQgYmUgYWRkZWQgYnkgQW5ndWxhcikgYW5kIHRyaW1zIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMb29rdXBLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pbm5lckhUTUwucmVwbGFjZSgvPCEtLS4qPy0tPi9ncywgJycpLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNFbGVtZW50U2ltcGxlVGV4dFR5cGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNoaWxkTm9kZXNbMF0ubm9kZVR5cGUgPT09IDNcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0VsZW1lbnRJbm5lckh0bWxFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pbm5lckhUTUw7XG4gIH1cblxuICBwcml2YXRlIGlzTG9va3VwS2V5TWlzc2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5sb29rdXBLZXk7XG4gIH1cblxuICBwcml2YXRlIGxvb2t1cEtleUV4aXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQubG9va3VwS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROZXdUcmFuc2xhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQubG9va3VwS2V5LFxuICAgICAgdGhpcy5jdXJyZW50UGFyYW1zIHx8IHt9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSHRtbENvbnRlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMubGFzdFRyYW5zbGF0aW9uO1xuICB9XG59XG4iXX0=