@halloverden/ngx-zendesk-web-widget
Version:
Angular wrapper for the Zendesk Web Widget v1 (classic)
134 lines • 18.1 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { firstValueFrom, of, Subject } from 'rxjs';
import { DOCUMENT } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "./ngx-zendesk-web-widget.config";
import * as i2 from "./window.service";
export class NgxZendeskWebWidgetService {
constructor(config, windowService, _document) {
this.config = config;
this.windowService = windowService;
this._document = _document;
this._initialized = false;
this._verifyConfig();
if (!this.config.lazyLoadZendeskScripts) {
this.init().then(() => {
// noop
});
}
}
init() {
if (!this.windowService.get()) {
// noop
console.warn('NgxZendeskWebWidgetService.init(): Tried initializing Zendesk Web Widget, but no browser window was found.');
return firstValueFrom(of(false));
}
const w = this.windowService.get();
this._window = w;
let documentDomain = this._document.domain;
const config = this.config;
const injectionElement = this.getInjectionElement();
const iFrameElement = this.buildIframeElement();
const scriptElement = this.buildScriptElement();
w.zEmbed ||
(function (e, t) {
let args = [];
w.zEmbed = function () {
args.push(arguments);
};
w.zE = w.zE || w.zEmbed;
w.zESettings = config.zESettings;
iFrameElement.addEventListener('load', (ev) => {
const iframeElementFromEvent = ev.target;
if (iframeElementFromEvent instanceof HTMLIFrameElement) {
const iframeDocumentInstance = iframeElementFromEvent.contentDocument;
const iframeWindowInstance = iframeElementFromEvent.contentWindow;
let i = setInterval(() => {
if (iframeWindowInstance?.document.body &&
iframeDocumentInstance) {
clearInterval(i);
iframeDocumentInstance.domain = documentDomain;
iframeDocumentInstance.t = new Date();
iframeDocumentInstance.zendeskHost = config.accountUrl;
iframeDocumentInstance.zEQueue = args;
iframeDocumentInstance.body.appendChild(scriptElement);
}
});
}
});
setTimeout(() => {
injectionElement.appendChild(iFrameElement);
});
})();
return this.finishLoading();
}
getInjectionElement() {
let elements = this._document.getElementsByTagName(this.config.injectionTag);
if (elements.length === 0) {
throw new Error('No element found matching injectionTag from config');
}
return elements[0];
}
finishLoading() {
const o = new Subject();
const timeout = setTimeout(() => {
this._initialized = false;
o.next(false);
o.complete();
}, this.config.timeout || 30000);
this._window.zE(() => {
clearTimeout(timeout);
this._zE = this._window.zE;
this._initialized = true;
this.config.callback(this);
o.next(true);
o.complete();
});
return firstValueFrom(o);
}
buildIframeElement() {
const iframe = this._document.createElement('iframe');
iframe.src = 'javascript:false';
iframe.title = 'Zendesk Web Widget';
iframe.style.cssText = 'display: none';
return iframe;
}
buildScriptElement() {
const script = this._document.createElement('script');
script.type = 'text/javascript';
script.id =
'be-sure-not-to-set-the-id-to-ze-snippet-as-that-changes-the-behavior-of-the-snippet';
script.src = 'https://static.zdassets.com/ekr/snippet.js';
script.async = true;
return script;
}
_verifyConfig() {
if (!this.config.accountUrl) {
throw new Error('NgxZendeskWebWidgetService: NgxZendeskWebWidgetConfig is missing accountUrl.');
}
}
get isInitialized() {
return this._initialized;
}
get zE() {
return this._zE;
}
commandWebWidget(command, options) {
this.zE('webWidget', command, options);
}
onWebWidgetEvent(eventName, handler) {
this.zE('webWidget:on', eventName, handler);
}
}
NgxZendeskWebWidgetService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.3", ngImport: i0, type: NgxZendeskWebWidgetService, deps: [{ token: i1.NgxZendeskWebWidgetConfig }, { token: i2.WindowService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
NgxZendeskWebWidgetService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.3", ngImport: i0, type: NgxZendeskWebWidgetService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.3", ngImport: i0, type: NgxZendeskWebWidgetService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return [{ type: i1.NgxZendeskWebWidgetConfig }, { type: i2.WindowService }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXplbmRlc2std2ViLXdpZGdldC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXplbmRlc2std2ViLXdpZGdldC9zcmMvbGliL25neC16ZW5kZXNrLXdlYi13aWRnZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUduRCxPQUFPLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBTTNDLE1BQU0sT0FBTywwQkFBMEI7SUFLckMsWUFDVSxNQUFpQyxFQUNqQyxhQUE0QixFQUNWLFNBQW1CO1FBRnJDLFdBQU0sR0FBTixNQUFNLENBQTJCO1FBQ2pDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ1YsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQVB2QyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQVMzQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFckIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUU7WUFDdkMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3BCLE9BQU87WUFDVCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM3QixPQUFPO1lBQ1AsT0FBTyxDQUFDLElBQUksQ0FDViw0R0FBNEcsQ0FDN0csQ0FBQztZQUNGLE9BQU8sY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUUsQ0FBQztRQUNsQixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDcEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDaEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFL0MsQ0FBVSxDQUFDLE1BQU07WUFDaEIsQ0FBQyxVQUFVLENBQUUsRUFBRSxDQUFFO2dCQUNmLElBQUksSUFBSSxHQUFVLEVBQUUsQ0FBQztnQkFDcEIsQ0FBVSxDQUFDLE1BQU0sR0FBRztvQkFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdkIsQ0FBQyxDQUFDO2dCQUNELENBQVUsQ0FBQyxFQUFFLEdBQUksQ0FBVSxDQUFDLEVBQUUsSUFBSyxDQUFVLENBQUMsTUFBTSxDQUFDO2dCQUNyRCxDQUFVLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7Z0JBRTNDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtvQkFDNUMsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO29CQUN6QyxJQUFJLHNCQUFzQixZQUFZLGlCQUFpQixFQUFFO3dCQUN2RCxNQUFNLHNCQUFzQixHQUMxQixzQkFBc0IsQ0FBQyxlQUFlLENBQUM7d0JBQ3pDLE1BQU0sb0JBQW9CLEdBQUcsc0JBQXNCLENBQUMsYUFBYSxDQUFDO3dCQUVsRSxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFOzRCQUN2QixJQUNFLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxJQUFJO2dDQUNuQyxzQkFBc0IsRUFDdEI7Z0NBQ0EsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUVqQixzQkFBc0IsQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDO2dDQUM5QyxzQkFBOEIsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQ0FDOUMsc0JBQThCLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7Z0NBQy9ELHNCQUE4QixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0NBRS9DLHNCQUFzQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7NkJBQ3hEO3dCQUNILENBQUMsQ0FBQyxDQUFDO3FCQUNKO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUVILFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM5QyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFUCxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUN6QixDQUFDO1FBQ0YsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDdkU7UUFFRCxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRU8sYUFBYTtRQUNuQixNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBRWpDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNkLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNmLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUMsT0FBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUU7WUFDNUIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXRCLElBQUksQ0FBQyxHQUFHLEdBQUksSUFBSSxDQUFDLE9BQWUsQ0FBQyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFFekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNiLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RCxNQUFNLENBQUMsR0FBRyxHQUFHLGtCQUFrQixDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsb0JBQW9CLENBQUM7UUFDcEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDO1FBRXZDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdEQsTUFBTSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztRQUNoQyxNQUFNLENBQUMsRUFBRTtZQUNQLHFGQUFxRixDQUFDO1FBQ3hGLE1BQU0sQ0FBQyxHQUFHLEdBQUcsNENBQTRDLENBQUM7UUFDMUQsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFFcEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQ2IsOEVBQThFLENBQy9FLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBZSxFQUFFLE9BQWE7UUFDN0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUFpQixFQUFFLE9BQThCO1FBQ2hFLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QyxDQUFDOzt1SEE1SlUsMEJBQTBCLHdGQVEzQixRQUFROzJIQVJQLDBCQUEwQixjQUZ6QixNQUFNOzJGQUVQLDBCQUEwQjtrQkFIdEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVNJLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd4WmVuZGVza1dlYldpZGdldENvbmZpZyB9IGZyb20gJy4vbmd4LXplbmRlc2std2ViLXdpZGdldC5jb25maWcnO1xuaW1wb3J0IHsgV2luZG93U2VydmljZSB9IGZyb20gJy4vd2luZG93LnNlcnZpY2UnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ3haZW5kZXNrV2ViV2lkZ2V0WmVJbnN0YW5jZUludGVyZmFjZSB9IGZyb20gJy4vbmd4LXplbmRlc2std2ViLXdpZGdldC16ZS1pbnN0YW5jZS5pbnRlcmZhY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBOZ3haZW5kZXNrV2ViV2lkZ2V0U2VydmljZSB7XG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgX3dpbmRvdyE6IFdpbmRvdztcbiAgcHJpdmF0ZSBfekUhOiBOZ3haZW5kZXNrV2ViV2lkZ2V0WmVJbnN0YW5jZUludGVyZmFjZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogTmd4WmVuZGVza1dlYldpZGdldENvbmZpZyxcbiAgICBwcml2YXRlIHdpbmRvd1NlcnZpY2U6IFdpbmRvd1NlcnZpY2UsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IERvY3VtZW50XG4gICkge1xuICAgIHRoaXMuX3ZlcmlmeUNvbmZpZygpO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5sYXp5TG9hZFplbmRlc2tTY3JpcHRzKSB7XG4gICAgICB0aGlzLmluaXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gbm9vcFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluaXQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLndpbmRvd1NlcnZpY2UuZ2V0KCkpIHtcbiAgICAgIC8vIG5vb3BcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ05neFplbmRlc2tXZWJXaWRnZXRTZXJ2aWNlLmluaXQoKTogVHJpZWQgaW5pdGlhbGl6aW5nIFplbmRlc2sgV2ViIFdpZGdldCwgYnV0IG5vIGJyb3dzZXIgd2luZG93IHdhcyBmb3VuZC4nXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKG9mKGZhbHNlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdyA9IHRoaXMud2luZG93U2VydmljZS5nZXQoKTtcbiAgICB0aGlzLl93aW5kb3cgPSB3ITtcbiAgICBsZXQgZG9jdW1lbnREb21haW4gPSB0aGlzLl9kb2N1bWVudC5kb21haW47XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgaW5qZWN0aW9uRWxlbWVudCA9IHRoaXMuZ2V0SW5qZWN0aW9uRWxlbWVudCgpO1xuICAgIGNvbnN0IGlGcmFtZUVsZW1lbnQgPSB0aGlzLmJ1aWxkSWZyYW1lRWxlbWVudCgpO1xuICAgIGNvbnN0IHNjcmlwdEVsZW1lbnQgPSB0aGlzLmJ1aWxkU2NyaXB0RWxlbWVudCgpO1xuXG4gICAgKHchIGFzIGFueSkuekVtYmVkIHx8XG4gICAgICAoZnVuY3Rpb24gKGU/LCB0Pykge1xuICAgICAgICBsZXQgYXJnczogYW55W10gPSBbXTtcbiAgICAgICAgKHchIGFzIGFueSkuekVtYmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgICAodyEgYXMgYW55KS56RSA9ICh3ISBhcyBhbnkpLnpFIHx8ICh3ISBhcyBhbnkpLnpFbWJlZDtcbiAgICAgICAgKHchIGFzIGFueSkuekVTZXR0aW5ncyA9IGNvbmZpZy56RVNldHRpbmdzO1xuXG4gICAgICAgIGlGcmFtZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIChldikgPT4ge1xuICAgICAgICAgIGNvbnN0IGlmcmFtZUVsZW1lbnRGcm9tRXZlbnQgPSBldi50YXJnZXQ7XG4gICAgICAgICAgaWYgKGlmcmFtZUVsZW1lbnRGcm9tRXZlbnQgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgaWZyYW1lRG9jdW1lbnRJbnN0YW5jZSA9XG4gICAgICAgICAgICAgIGlmcmFtZUVsZW1lbnRGcm9tRXZlbnQuY29udGVudERvY3VtZW50O1xuICAgICAgICAgICAgY29uc3QgaWZyYW1lV2luZG93SW5zdGFuY2UgPSBpZnJhbWVFbGVtZW50RnJvbUV2ZW50LmNvbnRlbnRXaW5kb3c7XG5cbiAgICAgICAgICAgIGxldCBpID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaWZyYW1lV2luZG93SW5zdGFuY2U/LmRvY3VtZW50LmJvZHkgJiZcbiAgICAgICAgICAgICAgICBpZnJhbWVEb2N1bWVudEluc3RhbmNlXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaSk7XG5cbiAgICAgICAgICAgICAgICBpZnJhbWVEb2N1bWVudEluc3RhbmNlLmRvbWFpbiA9IGRvY3VtZW50RG9tYWluO1xuICAgICAgICAgICAgICAgIChpZnJhbWVEb2N1bWVudEluc3RhbmNlIGFzIGFueSkudCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgKGlmcmFtZURvY3VtZW50SW5zdGFuY2UgYXMgYW55KS56ZW5kZXNrSG9zdCA9IGNvbmZpZy5hY2NvdW50VXJsO1xuICAgICAgICAgICAgICAgIChpZnJhbWVEb2N1bWVudEluc3RhbmNlIGFzIGFueSkuekVRdWV1ZSA9IGFyZ3M7XG5cbiAgICAgICAgICAgICAgICBpZnJhbWVEb2N1bWVudEluc3RhbmNlLmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0RWxlbWVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaW5qZWN0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChpRnJhbWVFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9KSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTG9hZGluZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbmplY3Rpb25FbGVtZW50KCk6IEVsZW1lbnQge1xuICAgIGxldCBlbGVtZW50cyA9IHRoaXMuX2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgdGhpcy5jb25maWcuaW5qZWN0aW9uVGFnXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgZm91bmQgbWF0Y2hpbmcgaW5qZWN0aW9uVGFnIGZyb20gY29uZmlnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5pc2hMb2FkaW5nKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG8gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgIG8ubmV4dChmYWxzZSk7XG4gICAgICBvLmNvbXBsZXRlKCk7XG4gICAgfSwgdGhpcy5jb25maWcudGltZW91dCB8fCAzMDAwMCk7XG5cbiAgICAodGhpcy5fd2luZG93IGFzIGFueSkuekUoKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICB0aGlzLl96RSA9ICh0aGlzLl93aW5kb3cgYXMgYW55KS56RTtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5jb25maWcuY2FsbGJhY2sodGhpcyk7XG5cbiAgICAgIG8ubmV4dCh0cnVlKTtcbiAgICAgIG8uY29tcGxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShvKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRJZnJhbWVFbGVtZW50KCk6IEhUTUxJRnJhbWVFbGVtZW50IHtcbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6ZmFsc2UnO1xuICAgIGlmcmFtZS50aXRsZSA9ICdaZW5kZXNrIFdlYiBXaWRnZXQnO1xuICAgIGlmcmFtZS5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IG5vbmUnO1xuXG4gICAgcmV0dXJuIGlmcmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTY3JpcHRFbGVtZW50KCk6IEhUTUxTY3JpcHRFbGVtZW50IHtcbiAgICBjb25zdCBzY3JpcHQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblxuICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgc2NyaXB0LmlkID1cbiAgICAgICdiZS1zdXJlLW5vdC10by1zZXQtdGhlLWlkLXRvLXplLXNuaXBwZXQtYXMtdGhhdC1jaGFuZ2VzLXRoZS1iZWhhdmlvci1vZi10aGUtc25pcHBldCc7XG4gICAgc2NyaXB0LnNyYyA9ICdodHRwczovL3N0YXRpYy56ZGFzc2V0cy5jb20vZWtyL3NuaXBwZXQuanMnO1xuICAgIHNjcmlwdC5hc3luYyA9IHRydWU7XG5cbiAgICByZXR1cm4gc2NyaXB0O1xuICB9XG5cbiAgcHJpdmF0ZSBfdmVyaWZ5Q29uZmlnKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcuYWNjb3VudFVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnTmd4WmVuZGVza1dlYldpZGdldFNlcnZpY2U6IE5neFplbmRlc2tXZWJXaWRnZXRDb25maWcgaXMgbWlzc2luZyBhY2NvdW50VXJsLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkO1xuICB9XG5cbiAgZ2V0IHpFKCk6IE5neFplbmRlc2tXZWJXaWRnZXRaZUluc3RhbmNlSW50ZXJmYWNlIHtcbiAgICByZXR1cm4gdGhpcy5fekU7XG4gIH1cblxuICBjb21tYW5kV2ViV2lkZ2V0KGNvbW1hbmQ6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgIHRoaXMuekUoJ3dlYldpZGdldCcsIGNvbW1hbmQsIG9wdGlvbnMpO1xuICB9XG5cbiAgb25XZWJXaWRnZXRFdmVudChldmVudE5hbWU6IHN0cmluZywgaGFuZGxlcjogKGV2ZW50PzogYW55KSA9PiB2b2lkKSB7XG4gICAgdGhpcy56RSgnd2ViV2lkZ2V0Om9uJywgZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgfVxufVxuIl19